From 73cbfce432d334295532fa233ca2c55ce237e696 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 20:53:59 -0800 Subject: [PATCH 001/214] Fix WKWebView JavaScript dialogs in browser panel --- Sources/Panels/BrowserPanel.swift | 77 +++++++++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 42 ++++++++++ 2 files changed, 119 insertions(+) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 873da962..12fa1c75 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -2245,6 +2245,25 @@ private class BrowserUIDelegate: NSObject, WKUIDelegate { var openInNewTab: ((URL) -> Void)? var requestNavigation: ((URL, BrowserInsecureHTTPNavigationIntent) -> Void)? + private func javaScriptDialogTitle(for webView: WKWebView) -> String { + if let absolute = webView.url?.absoluteString, !absolute.isEmpty { + return "The page at \(absolute) says:" + } + return "This page says:" + } + + private func presentDialog( + _ alert: NSAlert, + for webView: WKWebView, + completion: @escaping (NSApplication.ModalResponse) -> Void + ) { + if let window = webView.window { + alert.beginSheetModal(for: window, completionHandler: completion) + return + } + completion(alert.runModal()) + } + /// Returning nil tells WebKit not to open a new window. /// Cmd+click opens in a new tab; regular target=_blank navigates in-place. func webView( @@ -2282,4 +2301,62 @@ private class BrowserUIDelegate: NSObject, WKUIDelegate { completionHandler(result == .OK ? panel.urls : nil) } } + + func webView( + _ webView: WKWebView, + runJavaScriptAlertPanelWithMessage message: String, + initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping () -> Void + ) { + let alert = NSAlert() + alert.alertStyle = .informational + alert.messageText = javaScriptDialogTitle(for: webView) + alert.informativeText = message + alert.addButton(withTitle: "OK") + presentDialog(alert, for: webView) { _ in completionHandler() } + } + + func webView( + _ webView: WKWebView, + runJavaScriptConfirmPanelWithMessage message: String, + initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping (Bool) -> Void + ) { + let alert = NSAlert() + alert.alertStyle = .informational + alert.messageText = javaScriptDialogTitle(for: webView) + alert.informativeText = message + alert.addButton(withTitle: "OK") + alert.addButton(withTitle: "Cancel") + presentDialog(alert, for: webView) { response in + completionHandler(response == .alertFirstButtonReturn) + } + } + + func webView( + _ webView: WKWebView, + runJavaScriptTextInputPanelWithPrompt prompt: String, + defaultText: String?, + initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping (String?) -> Void + ) { + let alert = NSAlert() + alert.alertStyle = .informational + alert.messageText = javaScriptDialogTitle(for: webView) + alert.informativeText = prompt + alert.addButton(withTitle: "OK") + alert.addButton(withTitle: "Cancel") + + let field = NSTextField(frame: NSRect(x: 0, y: 0, width: 320, height: 24)) + field.stringValue = defaultText ?? "" + alert.accessoryView = field + + presentDialog(alert, for: webView) { response in + if response == .alertFirstButtonReturn { + completionHandler(field.stringValue) + } else { + completionHandler(nil) + } + } + } } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index e27d3db3..548a979c 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -216,6 +216,48 @@ final class BrowserDeveloperToolsConfigurationTests: XCTestCase { } } +@MainActor +final class BrowserJavaScriptDialogDelegateTests: XCTestCase { + func testBrowserPanelUIDelegateImplementsJavaScriptDialogSelectors() { + let panel = BrowserPanel(workspaceId: UUID()) + guard let uiDelegate = panel.webView.uiDelegate as? NSObject else { + XCTFail("Expected BrowserPanel webView.uiDelegate to be an NSObject") + return + } + + XCTAssertTrue( + uiDelegate.responds( + to: #selector( + WKUIDelegate.webView( + _:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler: + ) + ) + ), + "Browser UI delegate must implement JavaScript alert handling" + ) + XCTAssertTrue( + uiDelegate.responds( + to: #selector( + WKUIDelegate.webView( + _:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:completionHandler: + ) + ) + ), + "Browser UI delegate must implement JavaScript confirm handling" + ) + XCTAssertTrue( + uiDelegate.responds( + to: #selector( + WKUIDelegate.webView( + _:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler: + ) + ) + ), + "Browser UI delegate must implement JavaScript prompt handling" + ) + } +} + @MainActor final class BrowserDeveloperToolsVisibilityPersistenceTests: XCTestCase { private final class FakeInspector: NSObject { From 95ac588bb2f49b5071c2b5ab721895f3cb63c42b Mon Sep 17 00:00:00 2001 From: Austin Wang Date: Fri, 20 Feb 2026 21:21:03 -0800 Subject: [PATCH 002/214] Fix browser download UX and stabilize browser crash path (#235) * Fix browser download UX and stabilize download crash path * Fix context menu image/link download target resolution * Restore native WebKit context-menu download actions * Improve browser download feedback and context menu downloads * Fix flaky alternating context-menu downloads * Stabilize linked-file context downloads * Use per-menu-item fallback for context downloads * Harden linked-file URL resolution for context downloads --- Sources/AppDelegate.swift | 15 +- Sources/Panels/BrowserPanel.swift | 261 ++++++++++++++ Sources/Panels/BrowserPanelView.swift | 12 + Sources/Panels/CmuxWebView.swift | 474 ++++++++++++++++++++++++++ Sources/Workspace.swift | 4 +- 5 files changed, 764 insertions(+), 2 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 408123f4..9c0ad241 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -195,6 +195,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent private var windowKeyObserver: NSObjectProtocol? private var shortcutMonitor: Any? private var shortcutDefaultsObserver: NSObjectProtocol? + private var splitButtonTooltipRefreshScheduled = false private var ghosttyConfigObserver: NSObjectProtocol? private var ghosttyGotoSplitLeftShortcut: StoredShortcut? private var ghosttyGotoSplitRightShortcut: StoredShortcut? @@ -1479,7 +1480,19 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent object: nil, queue: .main ) { [weak self] _ in - self?.refreshSplitButtonTooltipsAcrossWorkspaces() + self?.scheduleSplitButtonTooltipRefreshAcrossWorkspaces() + } + } + + /// Coalesce shortcut-default changes and refresh on the next runloop turn to + /// avoid mutating Bonsplit/SwiftUI-observed state during an active update pass. + private func scheduleSplitButtonTooltipRefreshAcrossWorkspaces() { + guard !splitButtonTooltipRefreshScheduled else { return } + splitButtonTooltipRefreshScheduled = true + DispatchQueue.main.async { [weak self] in + guard let self else { return } + self.splitButtonTooltipRefreshScheduled = false + self.refreshSplitButtonTooltipsAcrossWorkspaces() } } diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 12fa1c75..889798f3 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1029,6 +1029,9 @@ final class BrowserPanel: Panel, ObservableObject { /// Published loading state @Published private(set) var isLoading: Bool = false + /// Published download state for browser downloads (navigation + context menu). + @Published private(set) var isDownloading: Bool = false + /// Published can go back state @Published private(set) var canGoBack: Bool = false @@ -1048,7 +1051,9 @@ final class BrowserPanel: Panel, ObservableObject { private var cancellables = Set() private var navigationDelegate: BrowserNavigationDelegate? private var uiDelegate: BrowserUIDelegate? + private var downloadDelegate: BrowserDownloadDelegate? private var webViewObservers: [NSKeyValueObservation] = [] + private var activeDownloadCount: Int = 0 // Avoid flickering the loading indicator for very fast navigations. private let minLoadingIndicatorDuration: TimeInterval = 0.35 @@ -1152,6 +1157,30 @@ final class BrowserPanel: Panel, ObservableObject { navDelegate.handleBlockedInsecureHTTPNavigation = { [weak self] url, intent in self?.presentInsecureHTTPAlert(for: url, intent: intent, recordTypedNavigation: false) } + navDelegate.onDownloadDetected = { [weak self] _ in + self?.beginDownloadActivity() + } + // Set up download delegate for navigation-based downloads. + // Downloads save to a temp file synchronously (no NSSavePanel during WebKit + // callbacks), then show NSSavePanel after the download completes. + let dlDelegate = BrowserDownloadDelegate() + // Download activity is already started at policy-detection time. + dlDelegate.onDownloadStarted = { _ in } + dlDelegate.onDownloadReadyToSave = { [weak self] in + self?.endDownloadActivity() + } + dlDelegate.onDownloadFailed = { [weak self] _ in + self?.endDownloadActivity() + } + navDelegate.downloadDelegate = dlDelegate + self.downloadDelegate = dlDelegate + webView.onContextMenuDownloadStateChanged = { [weak self] downloading in + if downloading { + self?.beginDownloadActivity() + } else { + self?.endDownloadActivity() + } + } webView.navigationDelegate = navDelegate self.navigationDelegate = navDelegate @@ -1176,6 +1205,30 @@ final class BrowserPanel: Panel, ObservableObject { } } + private func beginDownloadActivity() { + let apply = { + self.activeDownloadCount += 1 + self.isDownloading = self.activeDownloadCount > 0 + } + if Thread.isMainThread { + apply() + } else { + DispatchQueue.main.async(execute: apply) + } + } + + private func endDownloadActivity() { + let apply = { + self.activeDownloadCount = max(0, self.activeDownloadCount - 1) + self.isDownloading = self.activeDownloadCount > 0 + } + if Thread.isMainThread { + apply() + } else { + DispatchQueue.main.async(execute: apply) + } + } + func updateWorkspaceId(_ newWorkspaceId: UUID) { workspaceId = newWorkspaceId } @@ -2076,6 +2129,133 @@ private extension NSObject { } } +// MARK: - Download Delegate + +/// Handles WKDownload lifecycle by saving to a temp file synchronously (no UI +/// during WebKit callbacks), then showing NSSavePanel after the download finishes. +private class BrowserDownloadDelegate: NSObject, WKDownloadDelegate { + private struct DownloadState { + let tempURL: URL + let suggestedFilename: String + } + + /// Tracks active downloads keyed by WKDownload identity. + private var activeDownloads: [ObjectIdentifier: DownloadState] = [:] + private let activeDownloadsLock = NSLock() + var onDownloadStarted: ((String) -> Void)? + var onDownloadReadyToSave: (() -> Void)? + var onDownloadFailed: ((Error) -> Void)? + + private static let tempDir: URL = { + let dir = FileManager.default.temporaryDirectory.appendingPathComponent("cmux-downloads", isDirectory: true) + try? FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true) + return dir + }() + + private static func sanitizedFilename(_ raw: String, fallbackURL: URL?) -> String { + let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines) + let candidate = (trimmed as NSString).lastPathComponent + let fromURL = fallbackURL?.lastPathComponent ?? "" + let base = candidate.isEmpty ? fromURL : candidate + let replaced = base.replacingOccurrences(of: ":", with: "-") + let safe = replaced.trimmingCharacters(in: .whitespacesAndNewlines) + return safe.isEmpty ? "download" : safe + } + + private func storeState(_ state: DownloadState, for download: WKDownload) { + activeDownloadsLock.lock() + activeDownloads[ObjectIdentifier(download)] = state + activeDownloadsLock.unlock() + } + + private func removeState(for download: WKDownload) -> DownloadState? { + activeDownloadsLock.lock() + let state = activeDownloads.removeValue(forKey: ObjectIdentifier(download)) + activeDownloadsLock.unlock() + return state + } + + private func notifyOnMain(_ action: @escaping () -> Void) { + if Thread.isMainThread { + action() + } else { + DispatchQueue.main.async(execute: action) + } + } + + func download( + _ download: WKDownload, + decideDestinationUsing response: URLResponse, + suggestedFilename: String, + completionHandler: @escaping (URL?) -> Void + ) { + // Save to a temp file — return synchronously so WebKit is never blocked. + let safeFilename = Self.sanitizedFilename(suggestedFilename, fallbackURL: response.url) + let tempFilename = "\(UUID().uuidString)-\(safeFilename)" + let destURL = Self.tempDir.appendingPathComponent(tempFilename, isDirectory: false) + try? FileManager.default.removeItem(at: destURL) + storeState(DownloadState(tempURL: destURL, suggestedFilename: safeFilename), for: download) + notifyOnMain { [weak self] in + self?.onDownloadStarted?(safeFilename) + } + #if DEBUG + dlog("download.decideDestination file=\(safeFilename)") + #endif + NSLog("BrowserPanel download: temp path=%@", destURL.path) + completionHandler(destURL) + } + + func downloadDidFinish(_ download: WKDownload) { + guard let info = removeState(for: download) else { + #if DEBUG + dlog("download.finished missing-state") + #endif + return + } + #if DEBUG + dlog("download.finished file=\(info.suggestedFilename)") + #endif + NSLog("BrowserPanel download finished: %@", info.suggestedFilename) + + // Show NSSavePanel on the next runloop iteration (safe context). + DispatchQueue.main.async { + self.onDownloadReadyToSave?() + let savePanel = NSSavePanel() + savePanel.nameFieldStringValue = info.suggestedFilename + savePanel.canCreateDirectories = true + savePanel.directoryURL = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first + + savePanel.begin { result in + guard result == .OK, let destURL = savePanel.url else { + try? FileManager.default.removeItem(at: info.tempURL) + return + } + do { + try? FileManager.default.removeItem(at: destURL) + try FileManager.default.moveItem(at: info.tempURL, to: destURL) + NSLog("BrowserPanel download saved: %@", destURL.path) + } catch { + NSLog("BrowserPanel download move failed: %@", error.localizedDescription) + try? FileManager.default.removeItem(at: info.tempURL) + } + } + } + } + + func download(_ download: WKDownload, didFailWithError error: Error, resumeData: Data?) { + if let info = removeState(for: download) { + try? FileManager.default.removeItem(at: info.tempURL) + } + notifyOnMain { [weak self] in + self?.onDownloadFailed?(error) + } + #if DEBUG + dlog("download.failed error=\(error.localizedDescription)") + #endif + NSLog("BrowserPanel download failed: %@", error.localizedDescription) + } +} + // MARK: - Navigation Delegate private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { @@ -2084,6 +2264,10 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { var openInNewTab: ((URL) -> Void)? var shouldBlockInsecureHTTPNavigation: ((URL) -> Bool)? var handleBlockedInsecureHTTPNavigation: ((URL, BrowserInsecureHTTPNavigationIntent) -> Void)? + /// Called when navigation response policy decides to route to WKDownload. + var onDownloadDetected: ((String?) -> Void)? + /// Direct reference to the download delegate — must be set synchronously in didBecome callbacks. + var downloadDelegate: WKDownloadDelegate? /// The URL of the last navigation that was attempted. Used to preserve the omnibar URL /// when a provisional navigation fails (e.g. connection refused on localhost:3000). var lastAttemptedURL: URL? @@ -2109,6 +2293,13 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { return } + // "Frame load interrupted" (WebKitErrorDomain code 102) fires when a + // navigation response is converted into a download via .download policy. + // This is expected and should not show an error page. + if nsError.domain == "WebKitErrorDomain", nsError.code == 102 { + return + } + let failedURL = nsError.userInfo[NSURLErrorFailingURLStringErrorKey] as? String ?? lastAttemptedURL?.absoluteString ?? "" @@ -2237,6 +2428,76 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { decisionHandler(.allow) } + + func webView( + _ webView: WKWebView, + decidePolicyFor navigationResponse: WKNavigationResponse, + decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void + ) { + if !navigationResponse.isForMainFrame { + decisionHandler(.allow) + return + } + + let mime = navigationResponse.response.mimeType ?? "unknown" + let canShow = navigationResponse.canShowMIMEType + let responseURL = navigationResponse.response.url?.absoluteString ?? "nil" + + // Only classify HTTP(S) top-level responses as downloads. + if let scheme = navigationResponse.response.url?.scheme?.lowercased(), + scheme != "http", scheme != "https" { + decisionHandler(.allow) + return + } + + NSLog("BrowserPanel navigationResponse: url=%@ mime=%@ canShow=%d isMainFrame=%d", + responseURL, mime, canShow ? 1 : 0, + navigationResponse.isForMainFrame ? 1 : 0) + + // Check if this response should be treated as a download. + // Criteria: explicit Content-Disposition: attachment, or a MIME type + // that WebKit cannot render inline. + if let response = navigationResponse.response as? HTTPURLResponse { + let contentDisposition = response.value(forHTTPHeaderField: "Content-Disposition") ?? "" + if contentDisposition.lowercased().hasPrefix("attachment") { + NSLog("BrowserPanel download: content-disposition=attachment mime=%@ url=%@", mime, responseURL) + #if DEBUG + dlog("download.policy=download reason=content-disposition mime=\(mime)") + #endif + onDownloadDetected?(response.suggestedFilename) + decisionHandler(.download) + return + } + } + + if !canShow { + NSLog("BrowserPanel download: cannotShowMIME mime=%@ url=%@", mime, responseURL) + #if DEBUG + dlog("download.policy=download reason=cannotShowMIME mime=\(mime)") + #endif + onDownloadDetected?(navigationResponse.response.suggestedFilename) + decisionHandler(.download) + return + } + + decisionHandler(.allow) + } + + func webView(_ webView: WKWebView, navigationAction: WKNavigationAction, didBecome download: WKDownload) { + #if DEBUG + dlog("download.didBecome source=navigationAction") + #endif + NSLog("BrowserPanel download didBecome from navigationAction") + download.delegate = downloadDelegate + } + + func webView(_ webView: WKWebView, navigationResponse: WKNavigationResponse, didBecome download: WKDownload) { + #if DEBUG + dlog("download.didBecome source=navigationResponse") + #endif + NSLog("BrowserPanel download didBecome from navigationResponse") + download.delegate = downloadDelegate + } } // MARK: - UI Delegate diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index ef747d75..bda555bf 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -395,6 +395,18 @@ struct BrowserPanelView: View { } .buttonStyle(.plain) .help(panel.isLoading ? "Stop" : "Reload") + + if panel.isDownloading { + HStack(spacing: 4) { + ProgressView() + .controlSize(.small) + Text("Downloading...") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + } + .padding(.leading, 6) + .help("Download in progress") + } } } diff --git a/Sources/Panels/CmuxWebView.swift b/Sources/Panels/CmuxWebView.swift index 08843c0f..239c641a 100644 --- a/Sources/Panels/CmuxWebView.swift +++ b/Sources/Panels/CmuxWebView.swift @@ -1,4 +1,5 @@ import AppKit +import ObjectiveC import WebKit /// WKWebView tends to consume some Command-key equivalents (e.g. Cmd+N/Cmd+W), @@ -6,6 +7,20 @@ import WebKit /// key equivalents first so app-level shortcuts continue to work when WebKit is /// the first responder. final class CmuxWebView: WKWebView { + private final class ContextMenuFallbackBox: NSObject { + weak var target: AnyObject? + let action: Selector? + + init(target: AnyObject?, action: Selector?) { + self.target = target + self.action = action + } + } + + private static var contextMenuFallbackKey: UInt8 = 0 + + var onContextMenuDownloadStateChanged: ((Bool) -> Void)? + override func performKeyEquivalent(with event: NSEvent) -> Bool { // Preserve Cmd+Return/Enter for web content (e.g. editors/forms). Do not // route it through app/menu key equivalents, which can trigger unintended actions. @@ -109,6 +124,306 @@ final class CmuxWebView: WKWebView { } } + // MARK: - Context menu download support + + /// The last context-menu point in view coordinates. + private var lastContextMenuPoint: NSPoint = .zero + /// Saved native WebKit action for "Download Image". + private var fallbackDownloadImageTarget: AnyObject? + private var fallbackDownloadImageAction: Selector? + /// Saved native WebKit action for "Download Linked File". + private var fallbackDownloadLinkedFileTarget: AnyObject? + private var fallbackDownloadLinkedFileAction: Selector? + + private func isDownloadableScheme(_ url: URL) -> Bool { + let scheme = url.scheme?.lowercased() ?? "" + return scheme == "http" || scheme == "https" || scheme == "file" + } + + private func isOurDownloadMenuAction(target: AnyObject?, action: Selector?) -> Bool { + guard target === self else { return false } + return action == #selector(contextMenuDownloadImage(_:)) + || action == #selector(contextMenuDownloadLinkedFile(_:)) + } + + private func resolveGoogleRedirectURL(_ url: URL) -> URL? { + guard let host = url.host?.lowercased(), host.contains("google.") else { return nil } + guard var comps = URLComponents(url: url, resolvingAgainstBaseURL: false), + let queryItems = comps.queryItems else { return nil } + let map = Dictionary(uniqueKeysWithValues: queryItems.map { ($0.name.lowercased(), $0.value ?? "") }) + let candidates = ["imgurl", "mediaurl", "url", "q"] + for key in candidates { + guard let raw = map[key], !raw.isEmpty, + let decoded = raw.removingPercentEncoding ?? raw as String?, + let candidate = URL(string: decoded), + isDownloadableScheme(candidate) else { + continue + } + return candidate + } + // Some links are wrapped as /url?... + if comps.path.lowercased() == "/url" { + for key in ["url", "q"] { + if let raw = map[key], let candidate = URL(string: raw), isDownloadableScheme(candidate) { + return candidate + } + } + } + return nil + } + + private func normalizedLinkedDownloadURL(_ url: URL) -> URL { + resolveGoogleRedirectURL(url) ?? url + } + + private func captureFallbackForMenuItemIfNeeded(_ item: NSMenuItem) { + let target = item.target as AnyObject? + let action = item.action + if isOurDownloadMenuAction(target: target, action: action) { + return + } + let box = ContextMenuFallbackBox(target: target, action: action) + objc_setAssociatedObject( + item, + &Self.contextMenuFallbackKey, + box, + .OBJC_ASSOCIATION_RETAIN_NONATOMIC + ) + } + + private func fallbackFromSender( + _ sender: Any?, + defaultAction: Selector?, + defaultTarget: AnyObject? + ) -> (action: Selector?, target: AnyObject?) { + if let item = sender as? NSMenuItem, + let box = objc_getAssociatedObject(item, &Self.contextMenuFallbackKey) as? ContextMenuFallbackBox { + return (box.action, box.target) + } + return (defaultAction, defaultTarget) + } + + /// Resolve the topmost image URL near a point, accounting for overlay layers. + private func findImageURLAtPoint(_ point: NSPoint, completion: @escaping (URL?) -> Void) { + let flippedY = bounds.height - point.y + let js = """ + (() => { + const nodes = document.elementsFromPoint(\(point.x), \(flippedY)); + for (const start of nodes) { + let elChain = []; + let seen = new Set(); + let walk = (node) => { + let chain = []; + let localSeen = new Set(); + let visit = (n) => { + while (n && !localSeen.has(n)) { + localSeen.add(n); + chain.push(n); + n = n.parentElement; + } + }; + visit(node); + if (node && node.tagName === 'PICTURE') { + const img = node.querySelector('img'); + if (img) visit(img); + } + return chain; + }; + for (const el of walk(start)) { + if (!seen.has(el)) { + seen.add(el); + elChain.push(el); + } + } + + for (const el of elChain) { + if (el.tagName === 'IMG') { + if (el.currentSrc) return el.currentSrc; + if (el.src) return el.src; + } + if (el.tagName === 'PICTURE') { + const img = el.querySelector('img'); + if (img) { + if (img.currentSrc) return img.currentSrc; + if (img.src) return img.src; + } + } + } + } + return ''; + })(); + """ + evaluateJavaScript(js) { result, _ in + guard let src = result as? String, !src.isEmpty, + let url = URL(string: src) else { + completion(nil) + return + } + completion(url) + } + } + + /// Resolve the topmost link URL near a point, accounting for overlay layers. + private func findLinkURLAtPoint(_ point: NSPoint, completion: @escaping (URL?) -> Void) { + let flippedY = bounds.height - point.y + let js = """ + (() => { + const nodes = document.elementsFromPoint(\(point.x), \(flippedY)); + for (const start of nodes) { + let el = start; + let seen = new Set(); + let cur = (() => { + let n = start; + return n; + })(); + let walk = (node) => { + let chain = []; + while (node && !seen.has(node)) { + seen.add(node); + chain.push(node); + node = node.parentElement; + } + return chain; + }; + for (const n of walk(cur)) { + if (n.tagName === 'A' && n.href) return n.href; + } + } + return ''; + })(); + """ + evaluateJavaScript(js) { result, _ in + guard let href = result as? String, !href.isEmpty, + let url = URL(string: href) else { + completion(nil) + return + } + completion(url) + } + } + + private func runContextMenuFallback(action: Selector?, target: AnyObject?, sender: Any?) { + guard let action else { return } + // Guard against accidental self-recursion if fallback gets overwritten. + if target === self, + action == #selector(contextMenuDownloadImage(_:)) + || action == #selector(contextMenuDownloadLinkedFile(_:)) { + NSLog("CmuxWebView context fallback skipped (recursive self action)") + return + } + _ = NSApp.sendAction(action, to: target, from: sender) + } + + private func notifyContextMenuDownloadState(_ downloading: Bool) { + if Thread.isMainThread { + onContextMenuDownloadStateChanged?(downloading) + } else { + DispatchQueue.main.async { [weak self] in + self?.onContextMenuDownloadStateChanged?(downloading) + } + } + } + + private func downloadURLViaSession( + _ url: URL, + suggestedFilename: String?, + sender: Any?, + fallbackAction: Selector?, + fallbackTarget: AnyObject? + ) { + guard isDownloadableScheme(url) else { + runContextMenuFallback(action: fallbackAction, target: fallbackTarget, sender: sender) + return + } + let scheme = url.scheme?.lowercased() ?? "" + notifyContextMenuDownloadState(true) + + if scheme == "file" { + DispatchQueue.main.async { + do { + let data = try Data(contentsOf: url) + let filename = suggestedFilename?.trimmingCharacters(in: .whitespacesAndNewlines) + let saveName = (filename?.isEmpty == false ? filename! : url.lastPathComponent.isEmpty ? "download" : url.lastPathComponent) + let savePanel = NSSavePanel() + savePanel.nameFieldStringValue = saveName + savePanel.canCreateDirectories = true + savePanel.directoryURL = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first + // Download is already complete; we're now waiting for user save choice. + self.notifyContextMenuDownloadState(false) + savePanel.begin { result in + guard result == .OK, let destURL = savePanel.url else { return } + try? data.write(to: destURL, options: .atomic) + } + } catch { + self.notifyContextMenuDownloadState(false) + self.runContextMenuFallback(action: fallbackAction, target: fallbackTarget, sender: sender) + } + } + return + } + + let cookieStore = configuration.websiteDataStore.httpCookieStore + cookieStore.getAllCookies { cookies in + var request = URLRequest(url: url) + request.httpMethod = "GET" + let cookieHeaders = HTTPCookie.requestHeaderFields(with: cookies) + for (key, value) in cookieHeaders { + request.setValue(value, forHTTPHeaderField: key) + } + if let referer = self.url?.absoluteString, !referer.isEmpty { + request.setValue(referer, forHTTPHeaderField: "Referer") + } + if let ua = self.customUserAgent, !ua.isEmpty { + request.setValue(ua, forHTTPHeaderField: "User-Agent") + } + + URLSession.shared.dataTask(with: request) { data, response, error in + DispatchQueue.main.async { + guard let data, error == nil else { + self.notifyContextMenuDownloadState(false) + self.runContextMenuFallback(action: fallbackAction, target: fallbackTarget, sender: sender) + return + } + let filenameCandidate = suggestedFilename + ?? response?.suggestedFilename + ?? url.lastPathComponent + let saveName = filenameCandidate.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ? "download" : filenameCandidate + + let savePanel = NSSavePanel() + savePanel.nameFieldStringValue = saveName + savePanel.canCreateDirectories = true + savePanel.directoryURL = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first + // Download is already complete; we're now waiting for user save choice. + self.notifyContextMenuDownloadState(false) + savePanel.begin { result in + guard result == .OK, let destURL = savePanel.url else { return } + do { + try data.write(to: destURL, options: .atomic) + } catch { + self.runContextMenuFallback(action: fallbackAction, target: fallbackTarget, sender: sender) + } + } + } + }.resume() + } + } + + private func startContextMenuDownload( + _ url: URL, + sender: Any?, + fallbackAction: Selector?, + fallbackTarget: AnyObject? + ) { + NSLog("CmuxWebView context download start: %@", url.absoluteString) + downloadURLViaSession( + url, + suggestedFilename: nil, + sender: sender, + fallbackAction: fallbackAction, + fallbackTarget: fallbackTarget + ) + } + // MARK: - Drag-and-drop passthrough // WKWebView inherently calls registerForDraggedTypes with public.text (and others). @@ -136,6 +451,7 @@ final class CmuxWebView: WKWebView { override func willOpenMenu(_ menu: NSMenu, with event: NSEvent) { super.willOpenMenu(menu, with: event) + lastContextMenuPoint = convert(event.locationInWindow, from: nil) for item in menu.items { // Rename "Open Link in New Window" to "Open Link in New Tab". @@ -145,6 +461,164 @@ final class CmuxWebView: WKWebView { || item.title.contains("Open Link in New Window") { item.title = "Open Link in New Tab" } + + if item.identifier?.rawValue == "WKMenuItemIdentifierDownloadImage" + || item.title == "Download Image" { + NSLog("CmuxWebView context menu hook: download image") + captureFallbackForMenuItemIfNeeded(item) + // Keep global fallback as a secondary safety net. + if let box = objc_getAssociatedObject(item, &Self.contextMenuFallbackKey) as? ContextMenuFallbackBox { + fallbackDownloadImageTarget = box.target + fallbackDownloadImageAction = box.action + } else if !isOurDownloadMenuAction(target: item.target as AnyObject?, action: item.action) { + fallbackDownloadImageTarget = item.target as AnyObject? + fallbackDownloadImageAction = item.action + } + item.target = self + item.action = #selector(contextMenuDownloadImage(_:)) + } + + if item.identifier?.rawValue == "WKMenuItemIdentifierDownloadLinkedFile" + || item.title == "Download Linked File" { + NSLog("CmuxWebView context menu hook: download linked file") + captureFallbackForMenuItemIfNeeded(item) + // Keep global fallback as a secondary safety net. + if let box = objc_getAssociatedObject(item, &Self.contextMenuFallbackKey) as? ContextMenuFallbackBox { + fallbackDownloadLinkedFileTarget = box.target + fallbackDownloadLinkedFileAction = box.action + } else if !isOurDownloadMenuAction(target: item.target as AnyObject?, action: item.action) { + fallbackDownloadLinkedFileTarget = item.target as AnyObject? + fallbackDownloadLinkedFileAction = item.action + } + item.target = self + item.action = #selector(contextMenuDownloadLinkedFile(_:)) + } + } + } + + @objc private func contextMenuDownloadImage(_ sender: Any?) { + let point = lastContextMenuPoint + let fallback = fallbackFromSender( + sender, + defaultAction: fallbackDownloadImageAction, + defaultTarget: fallbackDownloadImageTarget + ) + findImageURLAtPoint(point) { [weak self] url in + guard let self else { return } + if let url { + let scheme = url.scheme?.lowercased() ?? "" + if scheme == "http" || scheme == "https" || scheme == "file" { + NSLog("CmuxWebView context download image URL: %@", url.absoluteString) + self.startContextMenuDownload( + url, + sender: sender, + fallbackAction: fallback.action, + fallbackTarget: fallback.target + ) + return + } + } + + // Google Images and similar sites often expose blob:/data: image URLs. + // If image URL is not directly downloadable, fall back to the nearby link URL. + self.findLinkURLAtPoint(point) { linkURL in + guard let linkURL else { + NSLog("CmuxWebView context download image: no downloadable image/link URL, using fallback action") + self.runContextMenuFallback( + action: fallback.action, + target: fallback.target, + sender: sender + ) + return + } + let linkScheme = linkURL.scheme?.lowercased() ?? "" + guard linkScheme == "http" || linkScheme == "https" || linkScheme == "file" else { + NSLog("CmuxWebView context download image: link URL not downloadable (%@), using fallback action", linkURL.absoluteString) + self.runContextMenuFallback( + action: fallback.action, + target: fallback.target, + sender: sender + ) + return + } + + NSLog("CmuxWebView context download image fallback to link URL: %@", linkURL.absoluteString) + self.startContextMenuDownload( + linkURL, + sender: sender, + fallbackAction: fallback.action, + fallbackTarget: fallback.target + ) + } + } + } + + @objc private func contextMenuDownloadLinkedFile(_ sender: Any?) { + let point = lastContextMenuPoint + let fallback = fallbackFromSender( + sender, + defaultAction: fallbackDownloadLinkedFileAction, + defaultTarget: fallbackDownloadLinkedFileTarget + ) + findLinkURLAtPoint(point) { [weak self] url in + guard let self else { return } + if let url { + let normalized = self.normalizedLinkedDownloadURL(url) + if self.isDownloadableScheme(normalized) { + NSLog("CmuxWebView context download linked file URL: %@ (normalized=%@)", url.absoluteString, normalized.absoluteString) + self.startContextMenuDownload( + normalized, + sender: sender, + fallbackAction: fallback.action, + fallbackTarget: fallback.target + ) + return + } + } + + // Fallback 1: image URL under cursor (useful on image-heavy result pages). + self.findImageURLAtPoint(point) { imageURL in + if let imageURL, self.isDownloadableScheme(imageURL) { + NSLog("CmuxWebView context download linked file fallback image URL: %@", imageURL.absoluteString) + self.startContextMenuDownload( + imageURL, + sender: sender, + fallbackAction: fallback.action, + fallbackTarget: fallback.target + ) + return + } + + // Fallback 2: simpler nearest-anchor lookup. + self.findLinkAtPoint(point) { fallbackURL in + guard let fallbackURL else { + NSLog("CmuxWebView context download linked file: URL nil, using fallback action") + self.runContextMenuFallback( + action: fallback.action, + target: fallback.target, + sender: sender + ) + return + } + let normalized = self.normalizedLinkedDownloadURL(fallbackURL) + guard self.isDownloadableScheme(normalized) else { + NSLog("CmuxWebView context download linked file: unsupported URL %@, using fallback action", fallbackURL.absoluteString) + self.runContextMenuFallback( + action: fallback.action, + target: fallback.target, + sender: sender + ) + return + } + NSLog("CmuxWebView context download linked file fallback URL: %@ (normalized=%@)", fallbackURL.absoluteString, normalized.absoluteString) + self.startContextMenuDownload( + normalized, + sender: sender, + fallbackAction: fallback.action, + fallbackTarget: fallback.target + ) + } + } } } } diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 2cc9cb0d..a530af87 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -230,8 +230,10 @@ final class Workspace: Identifiable, ObservableObject { } func refreshSplitButtonTooltips() { + let tooltips = Self.currentSplitButtonTooltips() var configuration = bonsplitController.configuration - configuration.appearance.splitButtonTooltips = Self.currentSplitButtonTooltips() + guard configuration.appearance.splitButtonTooltips != tooltips else { return } + configuration.appearance.splitButtonTooltips = tooltips bonsplitController.configuration = configuration } From 41b2db59622570ea8a0d3d9f2359099f3d37879a Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:13:16 -0800 Subject: [PATCH 003/214] Preserve approved HTTP request semantics and fix test imports --- Sources/Panels/BrowserPanel.swift | 57 ++++++++++++------- .../UpdatePillReleaseVisibilityTests.swift | 22 +++++++ 2 files changed, 57 insertions(+), 22 deletions(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 889798f3..f6dc10d4 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -294,6 +294,13 @@ func browserShouldPersistInsecureHTTPAllowlistSelection( return response == .alertFirstButtonReturn || response == .alertSecondButtonReturn } +func browserPreparedNavigationRequest(_ request: URLRequest) -> URLRequest { + var preparedRequest = request + // Match browser behavior for ordinary loads while preserving method/body/headers. + preparedRequest.cachePolicy = .useProtocolCachePolicy + return preparedRequest +} + enum BrowserUserAgentSettings { // Force a Safari UA. Some WebKit builds return a minimal UA without Version/Safari tokens, // and some installs may have legacy Chrome UA overrides. Both can cause Google to serve @@ -1154,8 +1161,8 @@ final class BrowserPanel: Panel, ObservableObject { navDelegate.shouldBlockInsecureHTTPNavigation = { [weak self] url in self?.shouldBlockInsecureHTTPNavigation(to: url) ?? false } - navDelegate.handleBlockedInsecureHTTPNavigation = { [weak self] url, intent in - self?.presentInsecureHTTPAlert(for: url, intent: intent, recordTypedNavigation: false) + navDelegate.handleBlockedInsecureHTTPNavigation = { [weak self] request, intent in + self?.presentInsecureHTTPAlert(for: request, intent: intent, recordTypedNavigation: false) } navDelegate.onDownloadDetected = { [weak self] _ in self?.beginDownloadActivity() @@ -1190,8 +1197,8 @@ final class BrowserPanel: Panel, ObservableObject { guard let self else { return } self.openLinkInNewTab(url: url) } - browserUIDelegate.requestNavigation = { [weak self] url, intent in - self?.requestNavigation(url, intent: intent) + browserUIDelegate.requestNavigation = { [weak self] request, intent in + self?.requestNavigation(request, intent: intent) } webView.uiDelegate = browserUIDelegate self.uiDelegate = browserUIDelegate @@ -1525,24 +1532,28 @@ final class BrowserPanel: Panel, ObservableObject { /// Navigate to a URL func navigate(to url: URL, recordTypedNavigation: Bool = false) { + let request = URLRequest(url: url) if shouldBlockInsecureHTTPNavigation(to: url) { - presentInsecureHTTPAlert(for: url, intent: .currentTab, recordTypedNavigation: recordTypedNavigation) + presentInsecureHTTPAlert(for: request, intent: .currentTab, recordTypedNavigation: recordTypedNavigation) return } - navigateWithoutInsecureHTTPPrompt(to: url, recordTypedNavigation: recordTypedNavigation) + navigateWithoutInsecureHTTPPrompt(request: request, recordTypedNavigation: recordTypedNavigation) } private func navigateWithoutInsecureHTTPPrompt(to url: URL, recordTypedNavigation: Bool) { + let request = URLRequest(url: url) + navigateWithoutInsecureHTTPPrompt(request: request, recordTypedNavigation: recordTypedNavigation) + } + + private func navigateWithoutInsecureHTTPPrompt(request: URLRequest, recordTypedNavigation: Bool) { + guard let url = request.url else { return } // Some installs can end up with a legacy Chrome UA override; keep this pinned. webView.customUserAgent = BrowserUserAgentSettings.safariUserAgent if recordTypedNavigation { BrowserHistoryStore.shared.recordTypedNavigation(url: url) } navigationDelegate?.lastAttemptedURL = url - var request = URLRequest(url: url) - // Behave like a normal browser (respect HTTP caching). Reload is handled separately. - request.cachePolicy = .useProtocolCachePolicy - webView.load(request) + webView.load(browserPreparedNavigationRequest(request)) } /// Navigate with smart URL/search detection @@ -1573,24 +1584,26 @@ final class BrowserPanel: Panel, ObservableObject { return browserShouldBlockInsecureHTTPURL(url) } - private func requestNavigation(_ url: URL, intent: BrowserInsecureHTTPNavigationIntent) { + private func requestNavigation(_ request: URLRequest, intent: BrowserInsecureHTTPNavigationIntent) { + guard let url = request.url else { return } if shouldBlockInsecureHTTPNavigation(to: url) { - presentInsecureHTTPAlert(for: url, intent: intent, recordTypedNavigation: false) + presentInsecureHTTPAlert(for: request, intent: intent, recordTypedNavigation: false) return } switch intent { case .currentTab: - navigateWithoutInsecureHTTPPrompt(to: url, recordTypedNavigation: false) + navigateWithoutInsecureHTTPPrompt(request: request, recordTypedNavigation: false) case .newTab: openLinkInNewTab(url: url) } } private func presentInsecureHTTPAlert( - for url: URL, + for request: URLRequest, intent: BrowserInsecureHTTPNavigationIntent, recordTypedNavigation: Bool ) { + guard let url = request.url else { return } guard let host = BrowserInsecureHTTPSettings.normalizeHost(url.host ?? "") else { return } let alert = NSAlert() @@ -1621,7 +1634,7 @@ final class BrowserPanel: Panel, ObservableObject { switch intent { case .currentTab: insecureHTTPBypassHostOnce = host - navigateWithoutInsecureHTTPPrompt(to: url, recordTypedNavigation: recordTypedNavigation) + navigateWithoutInsecureHTTPPrompt(request: request, recordTypedNavigation: recordTypedNavigation) case .newTab: openLinkInNewTab(url: url, bypassInsecureHTTPHostOnce: host) } @@ -2263,7 +2276,7 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { var didFailNavigation: ((WKWebView, String) -> Void)? var openInNewTab: ((URL) -> Void)? var shouldBlockInsecureHTTPNavigation: ((URL) -> Bool)? - var handleBlockedInsecureHTTPNavigation: ((URL, BrowserInsecureHTTPNavigationIntent) -> Void)? + var handleBlockedInsecureHTTPNavigation: ((URLRequest, BrowserInsecureHTTPNavigationIntent) -> Void)? /// Called when navigation response policy decides to route to WKDownload. var onDownloadDetected: ((String?) -> Void)? /// Direct reference to the download delegate — must be set synchronously in didBecome callbacks. @@ -2404,15 +2417,15 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { } else { intent = .currentTab } - handleBlockedInsecureHTTPNavigation?(url, intent) + handleBlockedInsecureHTTPNavigation?(navigationAction.request, intent) decisionHandler(.cancel) return } // target=_blank or window.open() — navigate in the current webview if navigationAction.targetFrame == nil, - let url = navigationAction.request.url { - webView.load(URLRequest(url: url)) + navigationAction.request.url != nil { + webView.load(navigationAction.request) decisionHandler(.cancel) return } @@ -2504,7 +2517,7 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { private class BrowserUIDelegate: NSObject, WKUIDelegate { var openInNewTab: ((URL) -> Void)? - var requestNavigation: ((URL, BrowserInsecureHTTPNavigationIntent) -> Void)? + var requestNavigation: ((URLRequest, BrowserInsecureHTTPNavigationIntent) -> Void)? private func javaScriptDialogTitle(for webView: WKWebView) -> String { if let absolute = webView.url?.absoluteString, !absolute.isEmpty { @@ -2537,11 +2550,11 @@ private class BrowserUIDelegate: NSObject, WKUIDelegate { if let requestNavigation { let intent: BrowserInsecureHTTPNavigationIntent = navigationAction.modifierFlags.contains(.command) ? .newTab : .currentTab - requestNavigation(url, intent) + requestNavigation(navigationAction.request, intent) } else if navigationAction.modifierFlags.contains(.command) { openInNewTab?(url) } else { - webView.load(URLRequest(url: url)) + webView.load(navigationAction.request) } } return nil diff --git a/cmuxTests/UpdatePillReleaseVisibilityTests.swift b/cmuxTests/UpdatePillReleaseVisibilityTests.swift index 3186eb6a..63348c49 100644 --- a/cmuxTests/UpdatePillReleaseVisibilityTests.swift +++ b/cmuxTests/UpdatePillReleaseVisibilityTests.swift @@ -1,7 +1,12 @@ import XCTest import Foundation import AppKit + +#if canImport(cmux_DEV) @testable import cmux_DEV +#elseif canImport(cmux) +@testable import cmux +#endif /// Regression test: ensures UpdatePill is never gated behind #if DEBUG in production code paths. /// This prevents accidentally hiding the update UI in Release builds. @@ -144,6 +149,23 @@ final class BrowserInsecureHTTPSettingsTests: XCTestCase { XCTAssertFalse(browserShouldBlockInsecureHTTPURL(httpsURL, rawAllowlist: nil)) } + func testPreparedNavigationRequestPreservesOriginalMethodBodyAndHeaders() throws { + let url = try XCTUnwrap(URL(string: "http://localtest.me:3000/submit")) + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.httpBody = Data("token=abc123".utf8) + request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") + request.cachePolicy = .reloadIgnoringLocalAndRemoteCacheData + + let prepared = browserPreparedNavigationRequest(request) + + XCTAssertEqual(prepared.url, url) + XCTAssertEqual(prepared.httpMethod, "POST") + XCTAssertEqual(prepared.httpBody, Data("token=abc123".utf8)) + XCTAssertEqual(prepared.value(forHTTPHeaderField: "Content-Type"), "application/x-www-form-urlencoded") + XCTAssertEqual(prepared.cachePolicy, .useProtocolCachePolicy) + } + func testOneTimeBypassIsConsumedAfterFirstNavigation() throws { let insecureURL = try XCTUnwrap(URL(string: "http://neverssl.com")) var bypassHostOnce: String? = "neverssl.com" From 60e7aeeb164da4a0fa34c1720bfbeb97ebc65c38 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:47:06 -0800 Subject: [PATCH 004/214] Fix stale sidebar git branch after split close --- .../cmux-bash-integration.bash | 4 +- .../cmux-zsh-integration.zsh | 4 +- Sources/TerminalController.swift | 72 +++++++++++++++++-- Sources/Workspace.swift | 22 ++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 27 +++++++ 5 files changed, 119 insertions(+), 10 deletions(-) diff --git a/Resources/shell-integration/cmux-bash-integration.bash b/Resources/shell-integration/cmux-bash-integration.bash index 1e110f91..4f8c832f 100644 --- a/Resources/shell-integration/cmux-bash-integration.bash +++ b/Resources/shell-integration/cmux-bash-integration.bash @@ -107,9 +107,9 @@ _cmux_prompt_command() { local first first=$(git status --porcelain -uno 2>/dev/null | head -1) [[ -n "$first" ]] && dirty_opt="--status=dirty" - _cmux_send "report_git_branch $branch $dirty_opt --tab=$CMUX_TAB_ID" + _cmux_send "report_git_branch $branch $dirty_opt --tab=$CMUX_TAB_ID --panel=$CMUX_PANEL_ID" else - _cmux_send "clear_git_branch --tab=$CMUX_TAB_ID" + _cmux_send "clear_git_branch --tab=$CMUX_TAB_ID --panel=$CMUX_PANEL_ID" fi } >/dev/null 2>&1 & _CMUX_GIT_JOB_PID=$! diff --git a/Resources/shell-integration/cmux-zsh-integration.zsh b/Resources/shell-integration/cmux-zsh-integration.zsh index 3b5d00cc..6c9575f0 100644 --- a/Resources/shell-integration/cmux-zsh-integration.zsh +++ b/Resources/shell-integration/cmux-zsh-integration.zsh @@ -240,9 +240,9 @@ _cmux_precmd() { local first first=$(git status --porcelain -uno 2>/dev/null | head -1) [[ -n "$first" ]] && dirty_opt="--status=dirty" - _cmux_send "report_git_branch $branch $dirty_opt --tab=$CMUX_TAB_ID" + _cmux_send "report_git_branch $branch $dirty_opt --tab=$CMUX_TAB_ID --panel=$CMUX_PANEL_ID" else - _cmux_send "clear_git_branch --tab=$CMUX_TAB_ID" + _cmux_send "clear_git_branch --tab=$CMUX_TAB_ID --panel=$CMUX_PANEL_ID" fi } >/dev/null 2>&1 &! _CMUX_GIT_JOB_PID=$! diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index d8724264..0526d593 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -7552,8 +7552,8 @@ class TerminalController { list_log [--limit=N] [--tab=X] - List log entries set_progress <0.0-1.0> [--label=X] [--tab=X] - Set progress bar clear_progress [--tab=X] - Clear progress bar - report_git_branch [--status=dirty] [--tab=X] - Report git branch - clear_git_branch [--tab=X] - Clear git branch + report_git_branch [--status=dirty] [--tab=X] [--panel=Y] - Report git branch + clear_git_branch [--tab=X] [--panel=Y] - Clear git branch report_ports [port2...] [--tab=X] [--panel=Y] - Report listening ports report_tty [--tab=X] [--panel=Y] - Register TTY for batched port scanning ports_kick [--tab=X] [--panel=Y] - Request batched port scan for panel @@ -10585,7 +10585,7 @@ class TerminalController { private func reportGitBranch(_ args: String) -> String { let parsed = parseOptions(args) guard let branch = parsed.positional.first else { - return "ERROR: Missing branch name — usage: report_git_branch [--status=dirty] [--tab=X]" + return "ERROR: Missing branch name — usage: report_git_branch [--status=dirty] [--tab=X] [--panel=Y]" } let isDirty = parsed.options["status"]?.lowercased() == "dirty" @@ -10595,19 +10595,78 @@ class TerminalController { result = parsed.options["tab"] != nil ? "ERROR: Tab not found" : "ERROR: No tab selected" return } - tab.gitBranch = SidebarGitBranchState(branch: branch, isDirty: isDirty) + + let validSurfaceIds = Set(tab.panels.keys) + tab.pruneSurfaceMetadata(validSurfaceIds: validSurfaceIds) + + let panelArg = parsed.options["panel"] ?? parsed.options["surface"] + let surfaceId: UUID + if let panelArg { + if panelArg.isEmpty { + result = "ERROR: Missing panel id — usage: report_git_branch [--status=dirty] [--tab=X] [--panel=Y]" + return + } + guard let parsedId = UUID(uuidString: panelArg) else { + result = "ERROR: Invalid panel id '\(panelArg)'" + return + } + surfaceId = parsedId + } else { + guard let focused = tab.focusedPanelId else { + result = "ERROR: Missing panel id (no focused surface)" + return + } + surfaceId = focused + } + + guard validSurfaceIds.contains(surfaceId) else { + result = "ERROR: Panel not found '\(surfaceId.uuidString)'" + return + } + + tab.updatePanelGitBranch(panelId: surfaceId, branch: branch, isDirty: isDirty) } return result } private func clearGitBranch(_ args: String) -> String { + let parsed = parseOptions(args) var result = "OK" DispatchQueue.main.sync { guard let tab = resolveTabForReport(args) else { - result = "ERROR: Tab not found" + result = parsed.options["tab"] != nil ? "ERROR: Tab not found" : "ERROR: No tab selected" return } - tab.gitBranch = nil + + let validSurfaceIds = Set(tab.panels.keys) + tab.pruneSurfaceMetadata(validSurfaceIds: validSurfaceIds) + + let panelArg = parsed.options["panel"] ?? parsed.options["surface"] + let surfaceId: UUID + if let panelArg { + if panelArg.isEmpty { + result = "ERROR: Missing panel id — usage: clear_git_branch [--tab=X] [--panel=Y]" + return + } + guard let parsedId = UUID(uuidString: panelArg) else { + result = "ERROR: Invalid panel id '\(panelArg)'" + return + } + surfaceId = parsedId + } else { + guard let focused = tab.focusedPanelId else { + result = "ERROR: Missing panel id (no focused surface)" + return + } + surfaceId = focused + } + + guard validSurfaceIds.contains(surfaceId) else { + result = "ERROR: Panel not found '\(surfaceId.uuidString)'" + return + } + + tab.clearPanelGitBranch(panelId: surfaceId) } return result } @@ -10898,6 +10957,7 @@ class TerminalController { tab.logEntries.removeAll() tab.progress = nil tab.gitBranch = nil + tab.panelGitBranches.removeAll() tab.surfaceListeningPorts.removeAll() tab.listeningPorts.removeAll() } diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index a530af87..94437799 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -94,6 +94,7 @@ final class Workspace: Identifiable, ObservableObject { @Published var logEntries: [SidebarLogEntry] = [] @Published var progress: SidebarProgressState? @Published var gitBranch: SidebarGitBranchState? + @Published var panelGitBranches: [UUID: SidebarGitBranchState] = [:] @Published var surfaceListeningPorts: [UUID: [Int]] = [:] @Published var listeningPorts: [Int] = [] var surfaceTTYNames: [UUID: String] = [:] @@ -513,6 +514,24 @@ final class Workspace: Identifiable, ObservableObject { } } + func updatePanelGitBranch(panelId: UUID, branch: String, isDirty: Bool) { + let state = SidebarGitBranchState(branch: branch, isDirty: isDirty) + let existing = panelGitBranches[panelId] + if existing?.branch != branch || existing?.isDirty != isDirty { + panelGitBranches[panelId] = state + } + if panelId == focusedPanelId { + gitBranch = state + } + } + + func clearPanelGitBranch(panelId: UUID) { + panelGitBranches.removeValue(forKey: panelId) + if panelId == focusedPanelId { + gitBranch = nil + } + } + @discardableResult func updatePanelTitle(panelId: UUID, title: String) -> Bool { let trimmed = title.trimmingCharacters(in: .whitespacesAndNewlines) @@ -557,6 +576,7 @@ final class Workspace: Identifiable, ObservableObject { panelCustomTitles = panelCustomTitles.filter { validSurfaceIds.contains($0.key) } pinnedPanelIds = pinnedPanelIds.filter { validSurfaceIds.contains($0) } manualUnreadPanelIds = manualUnreadPanelIds.filter { validSurfaceIds.contains($0) } + panelGitBranches = panelGitBranches.filter { validSurfaceIds.contains($0.key) } surfaceListeningPorts = surfaceListeningPorts.filter { validSurfaceIds.contains($0.key) } surfaceTTYNames = surfaceTTYNames.filter { validSurfaceIds.contains($0.key) } recomputeListeningPorts() @@ -1539,6 +1559,7 @@ extension Workspace: BonsplitDelegate { if let dir = panelDirectories[panelId] { currentDirectory = dir } + gitBranch = panelGitBranches[panelId] // Post notification NotificationCenter.default.post( @@ -1667,6 +1688,7 @@ extension Workspace: BonsplitDelegate { panels.removeValue(forKey: panelId) surfaceIdToPanelId.removeValue(forKey: tabId) panelDirectories.removeValue(forKey: panelId) + panelGitBranches.removeValue(forKey: panelId) panelTitles.removeValue(forKey: panelId) panelCustomTitles.removeValue(forKey: panelId) pinnedPanelIds.remove(panelId) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 548a979c..82e27d1c 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -953,6 +953,33 @@ final class TabManagerSurfaceCreationTests: XCTestCase { } } +@MainActor +final class WorkspacePanelGitBranchTests: XCTestCase { + func testClosingFocusedSplitRestoresBranchForRemainingFocusedPanel() { + let workspace = Workspace() + guard let firstPanelId = workspace.focusedPanelId else { + XCTFail("Expected initial focused panel") + return + } + + workspace.updatePanelGitBranch(panelId: firstPanelId, branch: "main", isDirty: false) + guard let secondPanel = workspace.newTerminalSplit(from: firstPanelId, orientation: .horizontal) else { + XCTFail("Expected split panel to be created") + return + } + + workspace.updatePanelGitBranch(panelId: secondPanel.id, branch: "feature/bugfix", isDirty: true) + XCTAssertEqual(workspace.focusedPanelId, secondPanel.id, "Expected split panel to be focused") + XCTAssertEqual(workspace.gitBranch?.branch, "feature/bugfix") + XCTAssertEqual(workspace.gitBranch?.isDirty, true) + + XCTAssertTrue(workspace.closePanel(secondPanel.id, force: true), "Expected split panel close to succeed") + XCTAssertEqual(workspace.focusedPanelId, firstPanelId, "Expected surviving panel to become focused") + XCTAssertEqual(workspace.gitBranch?.branch, "main") + XCTAssertEqual(workspace.gitBranch?.isDirty, false) + } +} + @MainActor final class BrowserPanelAddressBarFocusRequestTests: XCTestCase { func testRequestPersistsUntilAcknowledged() { From c533ebe5e574723d32984c52aff887fc982c06c4 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:59:35 -0800 Subject: [PATCH 005/214] Render sidebar branches in split/tab display order --- Sources/ContentView.swift | 19 ++- Sources/Workspace.swift | 113 +++++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 134 +++++++++++++----- 3 files changed, 226 insertions(+), 40 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 6f308362..ec504198 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -2341,7 +2341,7 @@ private struct TabItemView: View { // Branch + directory row if let dirRow = branchDirectoryRow { HStack(spacing: 3) { - if sidebarShowGitBranch && tab.gitBranch != nil && sidebarShowGitBranchIcon { + if sidebarShowGitBranch && gitBranchSummaryText != nil && sidebarShowGitBranchIcon { Image(systemName: "arrow.triangle.branch") .font(.system(size: 9)) .foregroundColor(isActive ? .white.opacity(0.6) : .secondary) @@ -2675,9 +2675,8 @@ private struct TabItemView: View { var parts: [String] = [] // Git branch (if enabled and available) - if sidebarShowGitBranch, let git = tab.gitBranch { - let dirty = git.isDirty ? "*" : "" - parts.append("\(git.branch)\(dirty)") + if sidebarShowGitBranch, let gitSummary = gitBranchSummaryText { + parts.append(gitSummary) } // Directory summary @@ -2689,12 +2688,22 @@ private struct TabItemView: View { return result.isEmpty ? nil : result } + private var gitBranchSummaryText: String? { + let branches = tab.sidebarGitBranchesInDisplayOrder() + guard !branches.isEmpty else { return nil } + return branches + .map { branch in + "\(branch.branch)\(branch.isDirty ? "*" : "")" + } + .joined(separator: " | ") + } + private var directorySummaryText: String? { guard !tab.panels.isEmpty else { return nil } let home = FileManager.default.homeDirectoryForCurrentUser.path var seen: Set = [] var entries: [String] = [] - for panelId in tab.panels.keys { + for panelId in tab.sidebarOrderedPanelIds() { let directory = tab.panelDirectories[panelId] ?? tab.currentDirectory let shortened = shortenPath(directory, home: home) guard !shortened.isEmpty else { continue } diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 94437799..d961cf52 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -37,6 +37,81 @@ struct SidebarGitBranchState { let isDirty: Bool } +enum SidebarBranchOrdering { + struct BranchEntry: Equatable { + let name: String + let isDirty: Bool + } + + static func orderedPaneIds(tree: ExternalTreeNode) -> [String] { + switch tree { + case .pane(let pane): + return [pane.id] + case .split(let split): + // Bonsplit split order matches visual order for both horizontal and vertical splits. + return orderedPaneIds(tree: split.first) + orderedPaneIds(tree: split.second) + } + } + + static func orderedPanelIds( + tree: ExternalTreeNode, + paneTabs: [String: [UUID]], + fallbackPanelIds: [UUID] + ) -> [UUID] { + var ordered: [UUID] = [] + var seen: Set = [] + + for paneId in orderedPaneIds(tree: tree) { + for panelId in paneTabs[paneId] ?? [] { + if seen.insert(panelId).inserted { + ordered.append(panelId) + } + } + } + + for panelId in fallbackPanelIds { + if seen.insert(panelId).inserted { + ordered.append(panelId) + } + } + + return ordered + } + + static func orderedUniqueBranches( + orderedPanelIds: [UUID], + panelBranches: [UUID: SidebarGitBranchState], + fallbackBranch: SidebarGitBranchState? + ) -> [BranchEntry] { + var orderedNames: [String] = [] + var branchDirty: [String: Bool] = [:] + + for panelId in orderedPanelIds { + guard let state = panelBranches[panelId] else { continue } + let name = state.branch.trimmingCharacters(in: .whitespacesAndNewlines) + guard !name.isEmpty else { continue } + + if branchDirty[name] == nil { + orderedNames.append(name) + branchDirty[name] = state.isDirty + } else if state.isDirty { + branchDirty[name] = true + } + } + + if orderedNames.isEmpty, let fallbackBranch { + let name = fallbackBranch.branch.trimmingCharacters(in: .whitespacesAndNewlines) + if !name.isEmpty { + return [BranchEntry(name: name, isDirty: fallbackBranch.isDirty)] + } + } + + return orderedNames.map { name in + BranchEntry(name: name, isDirty: branchDirty[name] ?? false) + } + } +} + /// Workspace represents a sidebar tab. /// Each workspace contains one BonsplitController that manages split panes and nested surfaces. @MainActor @@ -587,6 +662,35 @@ final class Workspace: Identifiable, ObservableObject { listeningPorts = unique.sorted() } + func sidebarOrderedPanelIds() -> [UUID] { + let paneTabs: [String: [UUID]] = Dictionary( + uniqueKeysWithValues: bonsplitController.allPaneIds.map { paneId in + let panelIds = bonsplitController + .tabs(inPane: paneId) + .compactMap { panelIdFromSurfaceId($0.id) } + return (paneId.id.uuidString, panelIds) + } + ) + + let fallbackPanelIds = panels.keys.sorted { $0.uuidString < $1.uuidString } + let tree = bonsplitController.treeSnapshot() + return SidebarBranchOrdering.orderedPanelIds( + tree: tree, + paneTabs: paneTabs, + fallbackPanelIds: fallbackPanelIds + ) + } + + func sidebarGitBranchesInDisplayOrder() -> [SidebarGitBranchState] { + SidebarBranchOrdering + .orderedUniqueBranches( + orderedPanelIds: sidebarOrderedPanelIds(), + panelBranches: panelGitBranches, + fallbackBranch: gitBranch + ) + .map { SidebarGitBranchState(branch: $0.name, isDirty: $0.isDirty) } + } + // MARK: - Panel Operations /// Create a new split with a terminal panel @@ -1357,6 +1461,10 @@ final class Workspace: Identifiable, ObservableObject { if let terminalPanel = targetPanel as? TerminalPanel { terminalPanel.hostedView.ensureFocus(for: id, surfaceId: targetPanelId) } + if let dir = panelDirectories[targetPanelId] { + currentDirectory = dir + } + gitBranch = panelGitBranches[targetPanelId] } /// Reconcile focus/first-responder convergence. @@ -1720,6 +1828,11 @@ extension Workspace: BonsplitDelegate { // frame where the pane has no selected content. bonsplitController.selectTab(selectTabId) applyTabSelection(tabId: selectTabId, inPane: pane) + } else if let focusedPane = bonsplitController.focusedPaneId, + let focusedTabId = bonsplitController.selectedTab(inPane: focusedPane)?.id { + // When closing the last tab in a pane, Bonsplit may focus a different pane and skip + // emitting didSelectTab. Re-apply the focused selection so sidebar state stays in sync. + applyTabSelection(tabId: focusedTabId, inPane: focusedPane) } if bonsplitController.allPaneIds.contains(pane) { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 82e27d1c..992c257d 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -783,53 +783,26 @@ final class AppearanceSettingsTests: XCTestCase { } final class UpdateChannelSettingsTests: XCTestCase { - func testDefaultNightlyPreferenceIsDisabled() { - XCTAssertFalse(UpdateChannelSettings.defaultIncludeNightlyBuilds) - } - - func testResolvedFeedFallsBackToStableWhenInfoFeedMissing() { - let suiteName = "UpdateChannelSettingsTests.MissingInfo.\(UUID().uuidString)" - guard let defaults = UserDefaults(suiteName: suiteName) else { - XCTFail("Failed to create isolated UserDefaults suite") - return - } - defer { defaults.removePersistentDomain(forName: suiteName) } - - let resolved = UpdateChannelSettings.resolvedFeedURLString(infoFeedURL: nil, defaults: defaults) - XCTAssertEqual(resolved.url, UpdateChannelSettings.stableFeedURL) + func testResolvedFeedFallsBackWhenInfoFeedMissing() { + let resolved = UpdateFeedResolver.resolvedFeedURLString(infoFeedURL: nil) + XCTAssertEqual(resolved.url, UpdateFeedResolver.fallbackFeedURL) XCTAssertFalse(resolved.isNightly) XCTAssertTrue(resolved.usedFallback) } func testResolvedFeedUsesInfoFeedForStableChannel() { - let suiteName = "UpdateChannelSettingsTests.InfoFeed.\(UUID().uuidString)" - guard let defaults = UserDefaults(suiteName: suiteName) else { - XCTFail("Failed to create isolated UserDefaults suite") - return - } - defer { defaults.removePersistentDomain(forName: suiteName) } - let infoFeed = "https://example.com/custom/appcast.xml" - let resolved = UpdateChannelSettings.resolvedFeedURLString(infoFeedURL: infoFeed, defaults: defaults) + let resolved = UpdateFeedResolver.resolvedFeedURLString(infoFeedURL: infoFeed) XCTAssertEqual(resolved.url, infoFeed) XCTAssertFalse(resolved.isNightly) XCTAssertFalse(resolved.usedFallback) } - func testResolvedFeedUsesNightlyWhenPreferenceEnabled() { - let suiteName = "UpdateChannelSettingsTests.Nightly.\(UUID().uuidString)" - guard let defaults = UserDefaults(suiteName: suiteName) else { - XCTFail("Failed to create isolated UserDefaults suite") - return - } - defer { defaults.removePersistentDomain(forName: suiteName) } - - defaults.set(true, forKey: UpdateChannelSettings.includeNightlyBuildsKey) - let resolved = UpdateChannelSettings.resolvedFeedURLString( - infoFeedURL: "https://example.com/custom/appcast.xml", - defaults: defaults + func testResolvedFeedDetectsNightlyFromInfoFeedURL() { + let resolved = UpdateFeedResolver.resolvedFeedURLString( + infoFeedURL: "https://example.com/nightly/appcast.xml" ) - XCTAssertEqual(resolved.url, UpdateChannelSettings.nightlyFeedURL) + XCTAssertEqual(resolved.url, "https://example.com/nightly/appcast.xml") XCTAssertTrue(resolved.isNightly) XCTAssertFalse(resolved.usedFallback) } @@ -978,6 +951,97 @@ final class WorkspacePanelGitBranchTests: XCTestCase { XCTAssertEqual(workspace.gitBranch?.branch, "main") XCTAssertEqual(workspace.gitBranch?.isDirty, false) } + + func testSidebarGitBranchesFollowLeftToRightSplitOrder() { + let workspace = Workspace() + guard let leftPanelId = workspace.focusedPanelId else { + XCTFail("Expected initial focused panel") + return + } + + workspace.updatePanelGitBranch(panelId: leftPanelId, branch: "main", isDirty: false) + guard let rightPanel = workspace.newTerminalSplit(from: leftPanelId, orientation: .horizontal) else { + XCTFail("Expected split panel to be created") + return + } + workspace.updatePanelGitBranch(panelId: rightPanel.id, branch: "feature/sidebar", isDirty: true) + + let ordered = workspace.sidebarGitBranchesInDisplayOrder() + XCTAssertEqual(ordered.map(\.branch), ["main", "feature/sidebar"]) + XCTAssertEqual(ordered.map(\.isDirty), [false, true]) + } + + func testSidebarOrderingUsesPaneOrderThenTabOrderWithBranchDeduping() { + let workspace = Workspace() + guard let leftFirstPanelId = workspace.focusedPanelId, + let leftPaneId = workspace.paneId(forPanelId: leftFirstPanelId), + let rightFirstPanel = workspace.newTerminalSplit(from: leftFirstPanelId, orientation: .horizontal), + let rightPaneId = workspace.paneId(forPanelId: rightFirstPanel.id), + let leftSecondPanel = workspace.newTerminalSurface(inPane: leftPaneId, focus: false), + let rightSecondPanel = workspace.newTerminalSurface(inPane: rightPaneId, focus: false) else { + XCTFail("Expected panes and panels for ordering test") + return + } + + XCTAssertTrue(workspace.reorderSurface(panelId: leftFirstPanelId, toIndex: 0)) + XCTAssertTrue(workspace.reorderSurface(panelId: leftSecondPanel.id, toIndex: 1)) + XCTAssertTrue(workspace.reorderSurface(panelId: rightFirstPanel.id, toIndex: 0)) + XCTAssertTrue(workspace.reorderSurface(panelId: rightSecondPanel.id, toIndex: 1)) + + workspace.updatePanelGitBranch(panelId: leftFirstPanelId, branch: "main", isDirty: false) + workspace.updatePanelGitBranch(panelId: leftSecondPanel.id, branch: "feature/left", isDirty: false) + workspace.updatePanelGitBranch(panelId: rightFirstPanel.id, branch: "main", isDirty: true) + workspace.updatePanelGitBranch(panelId: rightSecondPanel.id, branch: "feature/right", isDirty: false) + + XCTAssertEqual( + workspace.sidebarOrderedPanelIds(), + [leftFirstPanelId, leftSecondPanel.id, rightFirstPanel.id, rightSecondPanel.id] + ) + + let branches = workspace.sidebarGitBranchesInDisplayOrder() + XCTAssertEqual(branches.map(\.branch), ["main", "feature/left", "feature/right"]) + XCTAssertEqual(branches.map(\.isDirty), [true, false, false]) + } +} + +final class SidebarBranchOrderingTests: XCTestCase { + + func testOrderedUniqueBranchesDedupesByNameAndMergesDirtyState() { + let first = UUID() + let second = UUID() + let third = UUID() + + let branches = SidebarBranchOrdering.orderedUniqueBranches( + orderedPanelIds: [first, second, third], + panelBranches: [ + first: SidebarGitBranchState(branch: "main", isDirty: false), + second: SidebarGitBranchState(branch: "feature", isDirty: false), + third: SidebarGitBranchState(branch: "main", isDirty: true) + ], + fallbackBranch: SidebarGitBranchState(branch: "fallback", isDirty: false) + ) + + XCTAssertEqual( + branches, + [ + SidebarBranchOrdering.BranchEntry(name: "main", isDirty: true), + SidebarBranchOrdering.BranchEntry(name: "feature", isDirty: false) + ] + ) + } + + func testOrderedUniqueBranchesUsesFallbackWhenNoPanelBranchesExist() { + let branches = SidebarBranchOrdering.orderedUniqueBranches( + orderedPanelIds: [], + panelBranches: [:], + fallbackBranch: SidebarGitBranchState(branch: "fallback", isDirty: true) + ) + + XCTAssertEqual( + branches, + [SidebarBranchOrdering.BranchEntry(name: "fallback", isDirty: true)] + ) + } } @MainActor From 3603db75474852e7d2d871f92263f6e345f7ac4b Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 22:13:57 -0800 Subject: [PATCH 006/214] Gate socket path override by update channel --- Sources/SocketControlSettings.swift | 81 +++++++++++++++++++++++++--- Sources/cmuxApp.swift | 2 +- cmuxTests/GhosttyConfigTests.swift | 82 +++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 7 deletions(-) diff --git a/Sources/SocketControlSettings.swift b/Sources/SocketControlSettings.swift index 67b91682..c0fb35bb 100644 --- a/Sources/SocketControlSettings.swift +++ b/Sources/SocketControlSettings.swift @@ -38,6 +38,7 @@ enum SocketControlMode: String, CaseIterable, Identifiable { struct SocketControlSettings { static let appStorageKey = "socketControlMode" static let legacyEnabledKey = "socketControlEnabled" + static let allowSocketPathOverrideKey = "CMUX_ALLOW_SOCKET_OVERRIDE" /// Map old persisted rawValues to the new enum. static func migrateMode(_ raw: String) -> SocketControlMode { @@ -55,15 +56,83 @@ struct SocketControlSettings { return .cmuxOnly } - static func socketPath() -> String { - if let override = ProcessInfo.processInfo.environment["CMUX_SOCKET_PATH"], !override.isEmpty { + private static var isDebugBuild: Bool { +#if DEBUG + true +#else + false +#endif + } + + static func socketPath( + environment: [String: String] = ProcessInfo.processInfo.environment, + bundleIdentifier: String? = Bundle.main.bundleIdentifier, + isDebugBuild: Bool = SocketControlSettings.isDebugBuild + ) -> String { + let fallback = defaultSocketPath(bundleIdentifier: bundleIdentifier, isDebugBuild: isDebugBuild) + + guard let override = environment["CMUX_SOCKET_PATH"], !override.isEmpty else { + return fallback + } + + if shouldHonorSocketPathOverride( + environment: environment, + bundleIdentifier: bundleIdentifier, + isDebugBuild: isDebugBuild + ) { return override } -#if DEBUG - return "/tmp/cmux-debug.sock" -#else + + return fallback + } + + static func defaultSocketPath(bundleIdentifier: String?, isDebugBuild: Bool) -> String { + if bundleIdentifier == "com.cmuxterm.app.nightly" { + return "/tmp/cmux-nightly.sock" + } + if isDebugLikeBundleIdentifier(bundleIdentifier) || isDebugBuild { + return "/tmp/cmux-debug.sock" + } + if isStagingBundleIdentifier(bundleIdentifier) { + return "/tmp/cmux-staging.sock" + } return "/tmp/cmux.sock" -#endif + } + + static func shouldHonorSocketPathOverride( + environment: [String: String], + bundleIdentifier: String?, + isDebugBuild: Bool + ) -> Bool { + if isTruthy(environment[allowSocketPathOverrideKey]) { + return true + } + if isDebugLikeBundleIdentifier(bundleIdentifier) || isStagingBundleIdentifier(bundleIdentifier) { + return true + } + return isDebugBuild + } + + static func isDebugLikeBundleIdentifier(_ bundleIdentifier: String?) -> Bool { + guard let bundleIdentifier else { return false } + return bundleIdentifier == "com.cmuxterm.app.debug" + || bundleIdentifier.hasPrefix("com.cmuxterm.app.debug.") + } + + static func isStagingBundleIdentifier(_ bundleIdentifier: String?) -> Bool { + guard let bundleIdentifier else { return false } + return bundleIdentifier == "com.cmuxterm.app.staging" + || bundleIdentifier.hasPrefix("com.cmuxterm.app.staging.") + } + + static func isTruthy(_ raw: String?) -> Bool { + guard let raw else { return false } + switch raw.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() { + case "1", "true", "yes", "on": + return true + default: + return false + } } static func envOverrideEnabled() -> Bool? { diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 24841d43..f7da6258 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -2540,7 +2540,7 @@ struct SettingsView: View { SettingsCardDivider() SettingsCardNote("Controls access to the local Unix socket for programmatic control. In \"cmux processes only\" mode, only processes spawned inside cmux terminals can connect.") - SettingsCardNote("Overrides: CMUX_SOCKET_ENABLE, CMUX_SOCKET_MODE, and CMUX_SOCKET_PATH.") + SettingsCardNote("Overrides: CMUX_SOCKET_ENABLE, CMUX_SOCKET_MODE, and CMUX_SOCKET_PATH (set CMUX_ALLOW_SOCKET_OVERRIDE=1 for stable/nightly builds).") } SettingsCard { diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index e2978e55..6e57013e 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -316,3 +316,85 @@ final class TabManagerNotificationOrderingSourceTests: XCTestCase { return URL(fileURLWithPath: FileManager.default.currentDirectoryPath) } } + +final class SocketControlSettingsTests: XCTestCase { + func testStableReleaseIgnoresAmbientSocketOverrideByDefault() { + let path = SocketControlSettings.socketPath( + environment: [ + "CMUX_SOCKET_PATH": "/tmp/cmux-debug-issue-153-tmux-compat.sock", + ], + bundleIdentifier: "com.cmuxterm.app", + isDebugBuild: false + ) + + XCTAssertEqual(path, "/tmp/cmux.sock") + } + + func testNightlyReleaseUsesDedicatedDefaultAndIgnoresAmbientSocketOverride() { + let path = SocketControlSettings.socketPath( + environment: [ + "CMUX_SOCKET_PATH": "/tmp/cmux-debug-issue-153-tmux-compat.sock", + ], + bundleIdentifier: "com.cmuxterm.app.nightly", + isDebugBuild: false + ) + + XCTAssertEqual(path, "/tmp/cmux-nightly.sock") + } + + func testDebugBundleHonorsSocketOverrideWithoutOptInFlag() { + let path = SocketControlSettings.socketPath( + environment: [ + "CMUX_SOCKET_PATH": "/tmp/cmux-debug-my-tag.sock", + ], + bundleIdentifier: "com.cmuxterm.app.debug.my-tag", + isDebugBuild: false + ) + + XCTAssertEqual(path, "/tmp/cmux-debug-my-tag.sock") + } + + func testStagingBundleHonorsSocketOverrideWithoutOptInFlag() { + let path = SocketControlSettings.socketPath( + environment: [ + "CMUX_SOCKET_PATH": "/tmp/cmux-staging-my-tag.sock", + ], + bundleIdentifier: "com.cmuxterm.app.staging.my-tag", + isDebugBuild: false + ) + + XCTAssertEqual(path, "/tmp/cmux-staging-my-tag.sock") + } + + func testStableReleaseCanOptInToSocketOverride() { + let path = SocketControlSettings.socketPath( + environment: [ + "CMUX_SOCKET_PATH": "/tmp/cmux-debug-forced.sock", + "CMUX_ALLOW_SOCKET_OVERRIDE": "1", + ], + bundleIdentifier: "com.cmuxterm.app", + isDebugBuild: false + ) + + XCTAssertEqual(path, "/tmp/cmux-debug-forced.sock") + } + + func testDefaultSocketPathByChannel() { + XCTAssertEqual( + SocketControlSettings.defaultSocketPath(bundleIdentifier: "com.cmuxterm.app", isDebugBuild: false), + "/tmp/cmux.sock" + ) + XCTAssertEqual( + SocketControlSettings.defaultSocketPath(bundleIdentifier: "com.cmuxterm.app.nightly", isDebugBuild: false), + "/tmp/cmux-nightly.sock" + ) + XCTAssertEqual( + SocketControlSettings.defaultSocketPath(bundleIdentifier: "com.cmuxterm.app.debug.tag", isDebugBuild: false), + "/tmp/cmux-debug.sock" + ) + XCTAssertEqual( + SocketControlSettings.defaultSocketPath(bundleIdentifier: "com.cmuxterm.app.staging.tag", isDebugBuild: false), + "/tmp/cmux-staging.sock" + ) + } +} From e9da15d5633d72153b2ea99107640d9fcddc2e07 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 22:15:17 -0800 Subject: [PATCH 007/214] Clean up panel branch state when closing a pane --- Sources/Workspace.swift | 36 ++++++++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 17 +++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index d961cf52..c30b1dc3 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -330,6 +330,9 @@ final class Workspace: Identifiable, ObservableObject { /// Deterministic tab selection to apply after a tab closes. /// Keyed by the closing tab ID, value is the tab ID we want to select next. private var postCloseSelectTabId: [TabID: TabID] = [:] + /// Panel IDs that were in a pane when a pane-close operation was approved. + /// Bonsplit pane-close does not emit per-tab didClose callbacks. + private var pendingPaneClosePanelIds: [UUID: [UUID]] = [:] private var isApplyingTabSelection = false private var pendingTabSelection: (tabId: TabID, pane: PaneID)? private var isReconcilingFocusState = false @@ -1880,7 +1883,36 @@ extension Workspace: BonsplitDelegate { } func splitTabBar(_ controller: BonsplitController, didClosePane paneId: PaneID) { - _ = paneId + let closedPanelIds = pendingPaneClosePanelIds.removeValue(forKey: paneId.id) ?? [] + + if !closedPanelIds.isEmpty { + for panelId in closedPanelIds { + panels[panelId]?.close() + panels.removeValue(forKey: panelId) + panelDirectories.removeValue(forKey: panelId) + panelGitBranches.removeValue(forKey: panelId) + panelTitles.removeValue(forKey: panelId) + panelCustomTitles.removeValue(forKey: panelId) + pinnedPanelIds.remove(panelId) + manualUnreadPanelIds.remove(panelId) + panelSubscriptions.removeValue(forKey: panelId) + surfaceTTYNames.removeValue(forKey: panelId) + surfaceListeningPorts.removeValue(forKey: panelId) + PortScanner.shared.unregisterPanel(workspaceId: id, panelId: panelId) + } + + let closedSet = Set(closedPanelIds) + surfaceIdToPanelId = surfaceIdToPanelId.filter { !closedSet.contains($0.value) } + recomputeListeningPorts() + + if let focusedPane = bonsplitController.focusedPaneId, + let focusedTabId = bonsplitController.selectedTab(inPane: focusedPane)?.id { + applyTabSelection(tabId: focusedTabId, inPane: focusedPane) + } else { + scheduleFocusReconcile() + } + } + scheduleTerminalGeometryReconcile() scheduleFocusReconcile() } @@ -1893,9 +1925,11 @@ extension Workspace: BonsplitDelegate { if let panelId = panelIdFromSurfaceId(tab.id), let terminalPanel = terminalPanel(for: panelId), terminalPanel.needsConfirmClose() { + pendingPaneClosePanelIds.removeValue(forKey: pane.id) return false } } + pendingPaneClosePanelIds[pane.id] = tabs.compactMap { panelIdFromSurfaceId($0.id) } return true } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 992c257d..fa85dee8 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1002,6 +1002,23 @@ final class WorkspacePanelGitBranchTests: XCTestCase { XCTAssertEqual(branches.map(\.branch), ["main", "feature/left", "feature/right"]) XCTAssertEqual(branches.map(\.isDirty), [true, false, false]) } + + func testClosingPaneDropsBranchesFromClosedSide() { + let workspace = Workspace() + guard let leftPanelId = workspace.focusedPanelId, + let leftPaneId = workspace.paneId(forPanelId: leftPanelId), + let rightPanel = workspace.newTerminalSplit(from: leftPanelId, orientation: .horizontal) else { + XCTFail("Expected left/right split panes") + return + } + + workspace.updatePanelGitBranch(panelId: leftPanelId, branch: "branch1", isDirty: false) + workspace.updatePanelGitBranch(panelId: rightPanel.id, branch: "branch2", isDirty: false) + + XCTAssertEqual(workspace.sidebarGitBranchesInDisplayOrder().map(\.branch), ["branch1", "branch2"]) + XCTAssertTrue(workspace.bonsplitController.closePane(leftPaneId)) + XCTAssertEqual(workspace.sidebarGitBranchesInDisplayOrder().map(\.branch), ["branch2"]) + } } final class SidebarBranchOrderingTests: XCTestCase { From 3c0e3a7c82bdc06338f898b6ce6988a3c38c11a0 Mon Sep 17 00:00:00 2001 From: Austin Wang Date: Fri, 20 Feb 2026 22:15:35 -0800 Subject: [PATCH 008/214] Fix flaky browser download activity accounting (#246) * Add debug tracing for context-menu download flow * Remove temporary download debug instrumentation --- Sources/Panels/BrowserPanel.swift | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index f6dc10d4..118a2fab 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1164,15 +1164,13 @@ final class BrowserPanel: Panel, ObservableObject { navDelegate.handleBlockedInsecureHTTPNavigation = { [weak self] request, intent in self?.presentInsecureHTTPAlert(for: request, intent: intent, recordTypedNavigation: false) } - navDelegate.onDownloadDetected = { [weak self] _ in - self?.beginDownloadActivity() - } // Set up download delegate for navigation-based downloads. // Downloads save to a temp file synchronously (no NSSavePanel during WebKit // callbacks), then show NSSavePanel after the download completes. let dlDelegate = BrowserDownloadDelegate() - // Download activity is already started at policy-detection time. - dlDelegate.onDownloadStarted = { _ in } + dlDelegate.onDownloadStarted = { [weak self] _ in + self?.beginDownloadActivity() + } dlDelegate.onDownloadReadyToSave = { [weak self] in self?.endDownloadActivity() } @@ -2277,8 +2275,6 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { var openInNewTab: ((URL) -> Void)? var shouldBlockInsecureHTTPNavigation: ((URL) -> Bool)? var handleBlockedInsecureHTTPNavigation: ((URLRequest, BrowserInsecureHTTPNavigationIntent) -> Void)? - /// Called when navigation response policy decides to route to WKDownload. - var onDownloadDetected: ((String?) -> Void)? /// Direct reference to the download delegate — must be set synchronously in didBecome callbacks. var downloadDelegate: WKDownloadDelegate? /// The URL of the last navigation that was attempted. Used to preserve the omnibar URL @@ -2477,7 +2473,6 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { #if DEBUG dlog("download.policy=download reason=content-disposition mime=\(mime)") #endif - onDownloadDetected?(response.suggestedFilename) decisionHandler(.download) return } @@ -2488,7 +2483,6 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { #if DEBUG dlog("download.policy=download reason=cannotShowMIME mime=\(mime)") #endif - onDownloadDetected?(navigationResponse.response.suggestedFilename) decisionHandler(.download) return } From 5ca1616bd2c3a9b6c730959b4242073b1a43e4d0 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 22:26:10 -0800 Subject: [PATCH 009/214] Add vertical sidebar branch layout setting --- Sources/ContentView.swift | 46 +++++++++++++++---- Sources/TabManager.swift | 12 +++++ Sources/cmuxApp.swift | 31 +++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 28 +++++++++++ 4 files changed, 109 insertions(+), 8 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index ec504198..e2da50e8 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -2164,6 +2164,7 @@ private struct TabItemView: View { @AppStorage(ShortcutHintDebugSettings.sidebarHintYKey) private var sidebarShortcutHintYOffset = ShortcutHintDebugSettings.defaultSidebarHintY @AppStorage(ShortcutHintDebugSettings.alwaysShowHintsKey) private var alwaysShowShortcutHints = ShortcutHintDebugSettings.defaultAlwaysShowHints @AppStorage("sidebarShowGitBranch") private var sidebarShowGitBranch = true + @AppStorage(SidebarBranchLayoutSettings.key) private var sidebarBranchVerticalLayout = SidebarBranchLayoutSettings.defaultVerticalLayout @AppStorage("sidebarShowGitBranchIcon") private var sidebarShowGitBranchIcon = false @AppStorage("sidebarShowPorts") private var sidebarShowPorts = true @AppStorage("sidebarShowLog") private var sidebarShowLog = true @@ -2339,7 +2340,34 @@ private struct TabItemView: View { } // Branch + directory row - if let dirRow = branchDirectoryRow { + if sidebarBranchVerticalLayout { + if sidebarShowGitBranch, !gitBranchSummaryLines.isEmpty { + HStack(alignment: .top, spacing: 3) { + if sidebarShowGitBranchIcon { + Image(systemName: "arrow.triangle.branch") + .font(.system(size: 9)) + .foregroundColor(isActive ? .white.opacity(0.6) : .secondary) + } + VStack(alignment: .leading, spacing: 1) { + ForEach(Array(gitBranchSummaryLines.enumerated()), id: \.offset) { _, line in + Text(line) + .font(.system(size: 10, design: .monospaced)) + .foregroundColor(isActive ? .white.opacity(0.75) : .secondary) + .lineLimit(1) + .truncationMode(.tail) + } + } + } + } + + if let dirs = directorySummaryText { + Text(dirs) + .font(.system(size: 10, design: .monospaced)) + .foregroundColor(isActive ? .white.opacity(0.75) : .secondary) + .lineLimit(1) + .truncationMode(.tail) + } + } else if let dirRow = branchDirectoryRow { HStack(spacing: 3) { if sidebarShowGitBranch && gitBranchSummaryText != nil && sidebarShowGitBranchIcon { Image(systemName: "arrow.triangle.branch") @@ -2689,13 +2717,15 @@ private struct TabItemView: View { } private var gitBranchSummaryText: String? { - let branches = tab.sidebarGitBranchesInDisplayOrder() - guard !branches.isEmpty else { return nil } - return branches - .map { branch in - "\(branch.branch)\(branch.isDirty ? "*" : "")" - } - .joined(separator: " | ") + let lines = gitBranchSummaryLines + guard !lines.isEmpty else { return nil } + return lines.joined(separator: " | ") + } + + private var gitBranchSummaryLines: [String] { + tab.sidebarGitBranchesInDisplayOrder().map { branch in + "\(branch.branch)\(branch.isDirty ? "*" : "")" + } } private var directorySummaryText: String? { diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 0ea116c6..62d7b1d2 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -51,6 +51,18 @@ enum WorkspaceAutoReorderSettings { } } +enum SidebarBranchLayoutSettings { + static let key = "sidebarBranchVerticalLayout" + static let defaultVerticalLayout = true + + static func usesVerticalLayout(defaults: UserDefaults = .standard) -> Bool { + if defaults.object(forKey: key) == nil { + return defaultVerticalLayout + } + return defaults.bool(forKey: key) + } +} + enum WorkspacePlacementSettings { static let placementKey = "newWorkspacePlacement" static let defaultPlacement: NewWorkspacePlacement = .afterCurrent diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 24841d43..0ae4a899 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -1178,6 +1178,7 @@ private enum DebugWindowConfigSnapshot { sidebarTintHex=\(stringValue(defaults, key: "sidebarTintHex", fallback: "#000000")) sidebarTintOpacity=\(String(format: "%.2f", doubleValue(defaults, key: "sidebarTintOpacity", fallback: 0.18))) sidebarCornerRadius=\(String(format: "%.1f", doubleValue(defaults, key: "sidebarCornerRadius", fallback: 0.0))) + sidebarBranchVerticalLayout=\(boolValue(defaults, key: SidebarBranchLayoutSettings.key, fallback: SidebarBranchLayoutSettings.defaultVerticalLayout)) shortcutHintSidebarXOffset=\(String(format: "%.1f", doubleValue(defaults, key: ShortcutHintDebugSettings.sidebarHintXKey, fallback: ShortcutHintDebugSettings.defaultSidebarHintX))) shortcutHintSidebarYOffset=\(String(format: "%.1f", doubleValue(defaults, key: ShortcutHintDebugSettings.sidebarHintYKey, fallback: ShortcutHintDebugSettings.defaultSidebarHintY))) shortcutHintTitlebarXOffset=\(String(format: "%.1f", doubleValue(defaults, key: ShortcutHintDebugSettings.titlebarHintXKey, fallback: ShortcutHintDebugSettings.defaultTitlebarHintX))) @@ -1744,6 +1745,7 @@ private struct SidebarDebugView: View { @AppStorage("sidebarState") private var sidebarState = SidebarStateOption.followWindow.rawValue @AppStorage("sidebarCornerRadius") private var sidebarCornerRadius = 0.0 @AppStorage("sidebarBlurOpacity") private var sidebarBlurOpacity = 1.0 + @AppStorage(SidebarBranchLayoutSettings.key) private var sidebarBranchVerticalLayout = SidebarBranchLayoutSettings.defaultVerticalLayout @AppStorage(ShortcutHintDebugSettings.sidebarHintXKey) private var sidebarShortcutHintXOffset = ShortcutHintDebugSettings.defaultSidebarHintX @AppStorage(ShortcutHintDebugSettings.sidebarHintYKey) private var sidebarShortcutHintYOffset = ShortcutHintDebugSettings.defaultSidebarHintY @AppStorage(ShortcutHintDebugSettings.titlebarHintXKey) private var titlebarShortcutHintXOffset = ShortcutHintDebugSettings.defaultTitlebarHintX @@ -1852,6 +1854,16 @@ private struct SidebarDebugView: View { .padding(.top, 2) } + GroupBox("Workspace Metadata") { + VStack(alignment: .leading, spacing: 8) { + Toggle("Render branch list vertically", isOn: $sidebarBranchVerticalLayout) + Text("When enabled, each branch appears on its own line in the sidebar.") + .font(.caption) + .foregroundColor(.secondary) + } + .padding(.top, 2) + } + HStack(spacing: 12) { Button("Reset Tint") { sidebarTintOpacity = 0.62 @@ -1935,6 +1947,7 @@ private struct SidebarDebugView: View { sidebarTintHex=\(sidebarTintHex) sidebarTintOpacity=\(String(format: "%.2f", sidebarTintOpacity)) sidebarCornerRadius=\(String(format: "%.1f", sidebarCornerRadius)) + sidebarBranchVerticalLayout=\(sidebarBranchVerticalLayout) shortcutHintSidebarXOffset=\(String(format: "%.1f", ShortcutHintDebugSettings.clamped(sidebarShortcutHintXOffset))) shortcutHintSidebarYOffset=\(String(format: "%.1f", ShortcutHintDebugSettings.clamped(sidebarShortcutHintYOffset))) shortcutHintTitlebarXOffset=\(String(format: "%.1f", ShortcutHintDebugSettings.clamped(titlebarShortcutHintXOffset))) @@ -2428,6 +2441,7 @@ struct SettingsView: View { @AppStorage(NotificationBadgeSettings.dockBadgeEnabledKey) private var notificationDockBadgeEnabled = NotificationBadgeSettings.defaultDockBadgeEnabled @AppStorage(WorkspacePlacementSettings.placementKey) private var newWorkspacePlacement = WorkspacePlacementSettings.defaultPlacement.rawValue @AppStorage(WorkspaceAutoReorderSettings.key) private var workspaceAutoReorder = WorkspaceAutoReorderSettings.defaultValue + @AppStorage(SidebarBranchLayoutSettings.key) private var sidebarBranchVerticalLayout = SidebarBranchLayoutSettings.defaultVerticalLayout @State private var shortcutResetToken = UUID() @State private var topBlurOpacity: Double = 0 @State private var topBlurBaselineOffset: CGFloat? @@ -2518,6 +2532,22 @@ struct SettingsView: View { .labelsHidden() .controlSize(.small) } + + SettingsCardDivider() + + SettingsCardRow( + "Sidebar Branch Layout", + subtitle: sidebarBranchVerticalLayout + ? "Vertical: each branch appears on its own line." + : "Inline: all branches share one line." + ) { + Picker("", selection: $sidebarBranchVerticalLayout) { + Text("Vertical").tag(true) + Text("Inline").tag(false) + } + .labelsHidden() + .pickerStyle(.menu) + } } SettingsSectionHeader(title: "Automation") @@ -2869,6 +2899,7 @@ struct SettingsView: View { notificationDockBadgeEnabled = NotificationBadgeSettings.defaultDockBadgeEnabled newWorkspacePlacement = WorkspacePlacementSettings.defaultPlacement.rawValue workspaceAutoReorder = WorkspaceAutoReorderSettings.defaultValue + sidebarBranchVerticalLayout = SidebarBranchLayoutSettings.defaultVerticalLayout KeyboardShortcutSettings.resetAll() shortcutResetToken = UUID() } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index fa85dee8..4beca450 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -765,6 +765,34 @@ final class WorkspaceAutoReorderSettingsTests: XCTestCase { } } +final class SidebarBranchLayoutSettingsTests: XCTestCase { + func testDefaultUsesVerticalLayout() { + let suiteName = "SidebarBranchLayoutSettingsTests.Default.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Failed to create isolated UserDefaults suite") + return + } + defer { defaults.removePersistentDomain(forName: suiteName) } + + XCTAssertTrue(SidebarBranchLayoutSettings.usesVerticalLayout(defaults: defaults)) + } + + func testStoredPreferenceOverridesDefault() { + let suiteName = "SidebarBranchLayoutSettingsTests.Stored.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Failed to create isolated UserDefaults suite") + return + } + defer { defaults.removePersistentDomain(forName: suiteName) } + + defaults.set(false, forKey: SidebarBranchLayoutSettings.key) + XCTAssertFalse(SidebarBranchLayoutSettings.usesVerticalLayout(defaults: defaults)) + + defaults.set(true, forKey: SidebarBranchLayoutSettings.key) + XCTAssertTrue(SidebarBranchLayoutSettings.usesVerticalLayout(defaults: defaults)) + } +} + final class AppearanceSettingsTests: XCTestCase { func testResolvedModeDefaultsToSystemWhenUnset() { let suiteName = "AppearanceSettingsTests.Default.\(UUID().uuidString)" From b3c28a87238e1f14525b51217c53aac87e6176a4 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 22:31:17 -0800 Subject: [PATCH 010/214] Render vertical sidebar rows as branch and directory --- Sources/ContentView.swift | 49 +++++++--- Sources/Workspace.swift | 92 +++++++++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 76 +++++++++++++++ 3 files changed, 206 insertions(+), 11 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index e2da50e8..7818bd91 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -2341,15 +2341,15 @@ private struct TabItemView: View { // Branch + directory row if sidebarBranchVerticalLayout { - if sidebarShowGitBranch, !gitBranchSummaryLines.isEmpty { + if !branchDirectorySummaryLines.isEmpty { HStack(alignment: .top, spacing: 3) { - if sidebarShowGitBranchIcon { + if sidebarShowGitBranchIcon, sidebarShowGitBranch, verticalRowsContainBranch { Image(systemName: "arrow.triangle.branch") .font(.system(size: 9)) .foregroundColor(isActive ? .white.opacity(0.6) : .secondary) } VStack(alignment: .leading, spacing: 1) { - ForEach(Array(gitBranchSummaryLines.enumerated()), id: \.offset) { _, line in + ForEach(Array(branchDirectorySummaryLines.enumerated()), id: \.offset) { _, line in Text(line) .font(.system(size: 10, design: .monospaced)) .foregroundColor(isActive ? .white.opacity(0.75) : .secondary) @@ -2359,14 +2359,6 @@ private struct TabItemView: View { } } } - - if let dirs = directorySummaryText { - Text(dirs) - .font(.system(size: 10, design: .monospaced)) - .foregroundColor(isActive ? .white.opacity(0.75) : .secondary) - .lineLimit(1) - .truncationMode(.tail) - } } else if let dirRow = branchDirectoryRow { HStack(spacing: 3) { if sidebarShowGitBranch && gitBranchSummaryText != nil && sidebarShowGitBranchIcon { @@ -2728,6 +2720,41 @@ private struct TabItemView: View { } } + private var verticalBranchDirectoryEntries: [SidebarBranchOrdering.BranchDirectoryEntry] { + tab.sidebarBranchDirectoryEntriesInDisplayOrder() + } + + private var verticalRowsContainBranch: Bool { + sidebarShowGitBranch && verticalBranchDirectoryEntries.contains { $0.branch != nil } + } + + private var branchDirectorySummaryLines: [String] { + let home = FileManager.default.homeDirectoryForCurrentUser.path + return verticalBranchDirectoryEntries.compactMap { entry in + let branchText: String? = { + guard sidebarShowGitBranch, let branch = entry.branch else { return nil } + return "\(branch)\(entry.isDirty ? "*" : "")" + }() + + let directoryText: String? = { + guard let directory = entry.directory else { return nil } + let shortened = shortenPath(directory, home: home) + return shortened.isEmpty ? nil : shortened + }() + + switch (branchText, directoryText) { + case let (branch?, directory?): + return "\(branch) / \(directory)" + case let (branch?, nil): + return branch + case let (nil, directory?): + return directory + default: + return nil + } + } + } + private var directorySummaryText: String? { guard !tab.panels.isEmpty else { return nil } let home = FileManager.default.homeDirectoryForCurrentUser.path diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index c30b1dc3..be5abe79 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -43,6 +43,12 @@ enum SidebarBranchOrdering { let isDirty: Bool } + struct BranchDirectoryEntry: Equatable { + let branch: String? + let isDirty: Bool + let directory: String? + } + static func orderedPaneIds(tree: ExternalTreeNode) -> [String] { switch tree { case .pane(let pane): @@ -110,6 +116,82 @@ enum SidebarBranchOrdering { BranchEntry(name: name, isDirty: branchDirty[name] ?? false) } } + + static func orderedUniqueBranchDirectoryEntries( + orderedPanelIds: [UUID], + panelBranches: [UUID: SidebarGitBranchState], + panelDirectories: [UUID: String], + defaultDirectory: String?, + fallbackBranch: SidebarGitBranchState? + ) -> [BranchDirectoryEntry] { + struct EntryKey: Hashable { + let branch: String? + let directory: String? + } + + struct MutableEntry { + var branch: String? + var isDirty: Bool + var directory: String? + } + + func normalized(_ text: String?) -> String? { + guard let text else { return nil } + let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) + return trimmed.isEmpty ? nil : trimmed + } + + let normalizedFallbackBranch = normalized(fallbackBranch?.branch) + let shouldUseFallbackBranchPerPanel = !orderedPanelIds.contains { + normalized(panelBranches[$0]?.branch) != nil + } + let defaultBranchForPanels = shouldUseFallbackBranchPerPanel ? normalizedFallbackBranch : nil + let defaultBranchDirty = shouldUseFallbackBranchPerPanel ? (fallbackBranch?.isDirty ?? false) : false + + var order: [EntryKey] = [] + var entries: [EntryKey: MutableEntry] = [:] + + for panelId in orderedPanelIds { + let panelBranch = normalized(panelBranches[panelId]?.branch) + let branch = panelBranch ?? defaultBranchForPanels + let directory = normalized(panelDirectories[panelId] ?? defaultDirectory) + guard branch != nil || directory != nil else { continue } + + let panelDirty = panelBranch != nil + ? (panelBranches[panelId]?.isDirty ?? false) + : defaultBranchDirty + + let key = EntryKey(branch: branch, directory: directory) + if entries[key] == nil { + order.append(key) + entries[key] = MutableEntry(branch: branch, isDirty: panelDirty, directory: directory) + } else if panelDirty { + entries[key]?.isDirty = true + } + } + + if order.isEmpty { + let fallbackDirectory = normalized(defaultDirectory) + if normalizedFallbackBranch != nil || fallbackDirectory != nil { + return [ + BranchDirectoryEntry( + branch: normalizedFallbackBranch, + isDirty: fallbackBranch?.isDirty ?? false, + directory: fallbackDirectory + ) + ] + } + } + + return order.compactMap { key in + guard let entry = entries[key] else { return nil } + return BranchDirectoryEntry( + branch: entry.branch, + isDirty: entry.isDirty, + directory: entry.directory + ) + } + } } /// Workspace represents a sidebar tab. @@ -694,6 +776,16 @@ final class Workspace: Identifiable, ObservableObject { .map { SidebarGitBranchState(branch: $0.name, isDirty: $0.isDirty) } } + func sidebarBranchDirectoryEntriesInDisplayOrder() -> [SidebarBranchOrdering.BranchDirectoryEntry] { + SidebarBranchOrdering.orderedUniqueBranchDirectoryEntries( + orderedPanelIds: sidebarOrderedPanelIds(), + panelBranches: panelGitBranches, + panelDirectories: panelDirectories, + defaultDirectory: currentDirectory, + fallbackBranch: gitBranch + ) + } + // MARK: - Panel Operations /// Create a new split with a terminal panel diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 4beca450..2dc8e56d 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1087,6 +1087,82 @@ final class SidebarBranchOrderingTests: XCTestCase { [SidebarBranchOrdering.BranchEntry(name: "fallback", isDirty: true)] ) } + + func testOrderedUniqueBranchDirectoryEntriesDedupesPairsAndMergesDirtyState() { + let first = UUID() + let second = UUID() + let third = UUID() + let fourth = UUID() + let fifth = UUID() + + let rows = SidebarBranchOrdering.orderedUniqueBranchDirectoryEntries( + orderedPanelIds: [first, second, third, fourth, fifth], + panelBranches: [ + first: SidebarGitBranchState(branch: "main", isDirty: false), + second: SidebarGitBranchState(branch: "feature", isDirty: false), + third: SidebarGitBranchState(branch: "main", isDirty: true), + fourth: SidebarGitBranchState(branch: "main", isDirty: false) + ], + panelDirectories: [ + first: "/repo/a", + second: "/repo/b", + third: "/repo/a", + fourth: "/repo/d", + fifth: "/repo/e" + ], + defaultDirectory: "/repo/default", + fallbackBranch: SidebarGitBranchState(branch: "fallback", isDirty: false) + ) + + XCTAssertEqual( + rows, + [ + SidebarBranchOrdering.BranchDirectoryEntry(branch: "main", isDirty: true, directory: "/repo/a"), + SidebarBranchOrdering.BranchDirectoryEntry(branch: "feature", isDirty: false, directory: "/repo/b"), + SidebarBranchOrdering.BranchDirectoryEntry(branch: "main", isDirty: false, directory: "/repo/d"), + SidebarBranchOrdering.BranchDirectoryEntry(branch: nil, isDirty: false, directory: "/repo/e") + ] + ) + } + + func testOrderedUniqueBranchDirectoryEntriesUsesFallbackBranchWhenPanelBranchesMissing() { + let first = UUID() + let second = UUID() + + let rows = SidebarBranchOrdering.orderedUniqueBranchDirectoryEntries( + orderedPanelIds: [first, second], + panelBranches: [:], + panelDirectories: [ + first: "/repo/one", + second: "/repo/two" + ], + defaultDirectory: "/repo/default", + fallbackBranch: SidebarGitBranchState(branch: "main", isDirty: true) + ) + + XCTAssertEqual( + rows, + [ + SidebarBranchOrdering.BranchDirectoryEntry(branch: "main", isDirty: true, directory: "/repo/one"), + SidebarBranchOrdering.BranchDirectoryEntry(branch: "main", isDirty: true, directory: "/repo/two") + ] + ) + } + + func testOrderedUniqueBranchDirectoryEntriesFallsBackWhenNoPanelsExist() { + let rows = SidebarBranchOrdering.orderedUniqueBranchDirectoryEntries( + orderedPanelIds: [], + panelBranches: [:], + panelDirectories: [:], + defaultDirectory: "/repo/default", + fallbackBranch: SidebarGitBranchState(branch: "main", isDirty: false) + ) + + XCTAssertEqual( + rows, + [SidebarBranchOrdering.BranchDirectoryEntry(branch: "main", isDirty: false, directory: "/repo/default")] + ) + } } @MainActor From 277e95d07e21874dcac71b934e733bd6eddbd72c Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 22:35:14 -0800 Subject: [PATCH 011/214] Use non-path separator for branch directory rows --- Sources/ContentView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 7818bd91..4da9e159 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -2744,7 +2744,7 @@ private struct TabItemView: View { switch (branchText, directoryText) { case let (branch?, directory?): - return "\(branch) / \(directory)" + return "\(branch) @ \(directory)" case let (branch?, nil): return branch case let (nil, directory?): From 0856e791bab7b97ae36ce1001f9de1541631b474 Mon Sep 17 00:00:00 2001 From: Austin Wang Date: Fri, 20 Feb 2026 22:35:53 -0800 Subject: [PATCH 012/214] Keep split dividers visible in tiny panes (#250) --- Sources/TerminalWindowPortal.swift | 115 +++++++++++++++++++++++++++++ vendor/bonsplit | 2 +- 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index af6b0d72..6dffb098 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -178,10 +178,103 @@ final class WindowTerminalHostView: NSView { #endif } +private final class SplitDividerOverlayView: NSView { + private struct DividerSegment { + let rect: NSRect + let color: NSColor + } + + override var isOpaque: Bool { false } + override var acceptsFirstResponder: Bool { false } + + override func hitTest(_ point: NSPoint) -> NSView? { nil } + + override func draw(_ dirtyRect: NSRect) { + super.draw(dirtyRect) + guard let window, let rootView = window.contentView else { return } + + var dividerSegments: [DividerSegment] = [] + collectDividerSegments(in: rootView, into: ÷rSegments) + guard !dividerSegments.isEmpty else { return } + + NSGraphicsContext.saveGraphicsState() + defer { NSGraphicsContext.restoreGraphicsState() } + + // Keep separators visible above portal-hosted surfaces while matching each split view's + // native divider color (avoids visible color shifts at tiny pane sizes). + for segment in dividerSegments where segment.rect.intersects(dirtyRect) { + segment.color.setFill() + let rect = segment.rect + let pixelAligned = NSRect( + x: floor(rect.origin.x), + y: floor(rect.origin.y), + width: max(1, round(rect.size.width)), + height: max(1, round(rect.size.height)) + ) + NSBezierPath(rect: pixelAligned).fill() + } + } + + private func collectDividerSegments(in view: NSView, into result: inout [DividerSegment]) { + guard !view.isHidden else { return } + + if let splitView = view as? NSSplitView { + let dividerCount = max(0, splitView.arrangedSubviews.count - 1) + let dividerColor = overlayDividerColor(for: splitView) + for dividerIndex in 0.. NSColor { + let divider = splitView.dividerColor.usingColorSpace(.deviceRGB) ?? splitView.dividerColor + let alpha = divider.alphaComponent + guard alpha < 0.999 else { return divider } + + guard let bgColor = splitView.layer?.backgroundColor.flatMap(NSColor.init(cgColor:)), + let bgRGB = bgColor.usingColorSpace(.deviceRGB) else { + return divider + } + + let opaqueBG = bgRGB.withAlphaComponent(1) + let opaqueDivider = divider.withAlphaComponent(1) + return opaqueBG.blended(withFraction: alpha, of: opaqueDivider) ?? divider + } +} + @MainActor final class WindowTerminalPortal: NSObject { private weak var window: NSWindow? private let hostView = WindowTerminalHostView(frame: .zero) + private let dividerOverlayView = SplitDividerOverlayView(frame: .zero) private weak var installedContainerView: NSView? private weak var installedReferenceView: NSView? private var installConstraints: [NSLayoutConstraint] = [] @@ -202,9 +295,25 @@ final class WindowTerminalPortal: NSObject { super.init() hostView.wantsLayer = false hostView.translatesAutoresizingMaskIntoConstraints = false + dividerOverlayView.translatesAutoresizingMaskIntoConstraints = true + dividerOverlayView.autoresizingMask = [.width, .height] _ = ensureInstalled() } + private func ensureDividerOverlayOnTop() { + if dividerOverlayView.superview !== hostView { + dividerOverlayView.frame = hostView.bounds + hostView.addSubview(dividerOverlayView, positioned: .above, relativeTo: nil) + } else if hostView.subviews.last !== dividerOverlayView { + hostView.addSubview(dividerOverlayView, positioned: .above, relativeTo: nil) + } + + if !Self.rectApproximatelyEqual(dividerOverlayView.frame, hostView.bounds) { + dividerOverlayView.frame = hostView.bounds + } + dividerOverlayView.needsDisplay = true + } + @discardableResult private func ensureInstalled() -> Bool { guard let window else { return false } @@ -239,6 +348,8 @@ final class WindowTerminalPortal: NSObject { container.addSubview(overlay, positioned: .above, relativeTo: hostView) } + ensureDividerOverlayOnTop() + return true } @@ -394,6 +505,8 @@ final class WindowTerminalPortal: NSObject { hostView.addSubview(hostedView, positioned: .above, relativeTo: nil) } + ensureDividerOverlayOnTop() + synchronizeHostedView(withId: hostedId) pruneDeadEntries() } @@ -523,6 +636,8 @@ final class WindowTerminalPortal: NSObject { #endif hostedView.isHidden = shouldHide } + + ensureDividerOverlayOnTop() } private func pruneDeadEntries() { diff --git a/vendor/bonsplit b/vendor/bonsplit index dd20247b..cf929c88 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit dd20247b5536b4bd5b9b15cdf940e847daa1a18d +Subproject commit cf929c887af79ea8b881e39da5b8c4ee1d6b9009 From 5ffae27d647e84764774bfdbcef21b85a837430d Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 22:39:26 -0800 Subject: [PATCH 013/214] Use dot icon separator between branch and directory --- Sources/ContentView.swift | 45 ++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 4da9e159..01b4c18d 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -2341,7 +2341,7 @@ private struct TabItemView: View { // Branch + directory row if sidebarBranchVerticalLayout { - if !branchDirectorySummaryLines.isEmpty { + if !verticalBranchDirectoryLines.isEmpty { HStack(alignment: .top, spacing: 3) { if sidebarShowGitBranchIcon, sidebarShowGitBranch, verticalRowsContainBranch { Image(systemName: "arrow.triangle.branch") @@ -2349,12 +2349,28 @@ private struct TabItemView: View { .foregroundColor(isActive ? .white.opacity(0.6) : .secondary) } VStack(alignment: .leading, spacing: 1) { - ForEach(Array(branchDirectorySummaryLines.enumerated()), id: \.offset) { _, line in - Text(line) - .font(.system(size: 10, design: .monospaced)) - .foregroundColor(isActive ? .white.opacity(0.75) : .secondary) - .lineLimit(1) - .truncationMode(.tail) + ForEach(Array(verticalBranchDirectoryLines.enumerated()), id: \.offset) { _, line in + HStack(spacing: 4) { + if let branch = line.branch { + Text(branch) + .font(.system(size: 10, design: .monospaced)) + .foregroundColor(isActive ? .white.opacity(0.75) : .secondary) + .lineLimit(1) + .truncationMode(.tail) + } + if line.branch != nil, line.directory != nil { + Image(systemName: "circle.fill") + .font(.system(size: 4)) + .foregroundColor(isActive ? .white.opacity(0.6) : .secondary) + } + if let directory = line.directory { + Text(directory) + .font(.system(size: 10, design: .monospaced)) + .foregroundColor(isActive ? .white.opacity(0.75) : .secondary) + .lineLimit(1) + .truncationMode(.tail) + } + } } } } @@ -2725,10 +2741,15 @@ private struct TabItemView: View { } private var verticalRowsContainBranch: Bool { - sidebarShowGitBranch && verticalBranchDirectoryEntries.contains { $0.branch != nil } + sidebarShowGitBranch && verticalBranchDirectoryLines.contains { $0.branch != nil } } - private var branchDirectorySummaryLines: [String] { + private struct VerticalBranchDirectoryLine { + let branch: String? + let directory: String? + } + + private var verticalBranchDirectoryLines: [VerticalBranchDirectoryLine] { let home = FileManager.default.homeDirectoryForCurrentUser.path return verticalBranchDirectoryEntries.compactMap { entry in let branchText: String? = { @@ -2744,11 +2765,11 @@ private struct TabItemView: View { switch (branchText, directoryText) { case let (branch?, directory?): - return "\(branch) @ \(directory)" + return VerticalBranchDirectoryLine(branch: branch, directory: directory) case let (branch?, nil): - return branch + return VerticalBranchDirectoryLine(branch: branch, directory: nil) case let (nil, directory?): - return directory + return VerticalBranchDirectoryLine(branch: nil, directory: directory) default: return nil } From 12374c4a7615af35714173a4f14bf247cd66c51c Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:06:49 -0800 Subject: [PATCH 014/214] Add Cmd+Shift+T reopen for closed browser panels (#253) Implements browser-only recently-closed restore stack with capped LIFO behavior and split-placement fallback. Issue: https://github.com/manaflow-ai/cmux/issues/244 --- Sources/TabManager.swift | 96 +++++++++++++++++++++ Sources/Workspace.swift | 132 +++++++++++++++++++++++++++++ Sources/cmuxApp.swift | 5 ++ cmuxTests/GhosttyConfigTests.swift | 38 +++++++++ 4 files changed, 271 insertions(+) diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 0ea116c6..ab3da8bd 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -129,6 +129,30 @@ final class NotificationBurstCoalescer { } } +struct RecentlyClosedBrowserStack { + private(set) var entries: [ClosedBrowserPanelRestoreSnapshot] = [] + let capacity: Int + + init(capacity: Int) { + self.capacity = max(1, capacity) + } + + var isEmpty: Bool { + entries.isEmpty + } + + mutating func push(_ snapshot: ClosedBrowserPanelRestoreSnapshot) { + entries.append(snapshot) + if entries.count > capacity { + entries.removeFirst(entries.count - capacity) + } + } + + mutating func pop() -> ClosedBrowserPanelRestoreSnapshot? { + entries.popLast() + } +} + #if DEBUG // Sample the actual IOSurface-backed terminal layer at vsync cadence so UI tests can reliably // catch a single compositor-frame blank flash and any transient compositor scaling (stretched text). @@ -330,6 +354,7 @@ class TabManager: ObservableObject { } private var pendingPanelTitleUpdates: [PanelTitleUpdateKey: String] = [:] private let panelTitleUpdateCoalescer = NotificationBurstCoalescer(delay: 1.0 / 30.0) + private var recentlyClosedBrowsers = RecentlyClosedBrowserStack(capacity: 20) // Recent tab history for back/forward navigation (like browser history) private var tabHistory: [UUID] = [] @@ -394,6 +419,16 @@ class TabManager: ObservableObject { workspaceCycleCooldownTask?.cancel() } + private func wireClosedBrowserTracking(for workspace: Workspace) { + workspace.onClosedBrowserPanel = { [weak self] snapshot in + self?.recentlyClosedBrowsers.push(snapshot) + } + } + + private func unwireClosedBrowserTracking(for workspace: Workspace) { + workspace.onClosedBrowserPanel = nil + } + var selectedWorkspace: Workspace? { guard let selectedTabId else { return nil } return tabs.first(where: { $0.id == selectedTabId }) @@ -460,6 +495,7 @@ class TabManager: ObservableObject { let ordinal = Self.nextPortOrdinal Self.nextPortOrdinal += 1 let newWorkspace = Workspace(title: "Terminal \(tabs.count + 1)", workingDirectory: workingDirectory, portOrdinal: ordinal) + wireClosedBrowserTracking(for: newWorkspace) let insertIndex = newTabInsertIndex() if insertIndex >= 0 && insertIndex <= tabs.count { tabs.insert(newWorkspace, at: insertIndex) @@ -625,6 +661,7 @@ class TabManager: ObservableObject { guard tabs.count > 1 else { return } AppDelegate.shared?.notificationStore?.clearNotifications(forTabId: workspace.id) + unwireClosedBrowserTracking(for: workspace) if let index = tabs.firstIndex(where: { $0.id == workspace.id }) { tabs.remove(at: index) @@ -646,6 +683,7 @@ class TabManager: ObservableObject { guard let index = tabs.firstIndex(where: { $0.id == tabId }) else { return nil } let removed = tabs.remove(at: index) + unwireClosedBrowserTracking(for: removed) lastFocusedPanelByTab.removeValue(forKey: removed.id) if tabs.isEmpty { @@ -664,6 +702,7 @@ class TabManager: ObservableObject { /// Attach an existing workspace to this window. func attachWorkspace(_ workspace: Workspace, at index: Int? = nil, select: Bool = true) { + wireClosedBrowserTracking(for: workspace) let insertIndex: Int = { guard let index else { return tabs.count } return max(0, min(index, tabs.count)) @@ -1546,6 +1585,63 @@ class TabManager: ObservableObject { return panel?.id } + /// Reopen the most recently closed browser panel (Cmd+Shift+T). + /// No-op when no browser panel restore snapshot is available. + @discardableResult + func reopenMostRecentlyClosedBrowserPanel() -> Bool { + while let snapshot = recentlyClosedBrowsers.pop() { + guard let targetWorkspace = + tabs.first(where: { $0.id == snapshot.workspaceId }) + ?? selectedWorkspace + ?? tabs.first else { + return false + } + + if selectedTabId != targetWorkspace.id { + selectedTabId = targetWorkspace.id + } + + if reopenClosedBrowserPanel(snapshot, in: targetWorkspace) { + return true + } + } + + return false + } + + private func reopenClosedBrowserPanel( + _ snapshot: ClosedBrowserPanelRestoreSnapshot, + in workspace: Workspace + ) -> Bool { + if let originalPane = workspace.bonsplitController.allPaneIds.first(where: { $0.id == snapshot.originalPaneId }), + let browserPanel = workspace.newBrowserSurface(inPane: originalPane, url: snapshot.url, focus: true) { + let tabCount = workspace.bonsplitController.tabs(inPane: originalPane).count + let maxIndex = max(0, tabCount - 1) + let targetIndex = min(max(snapshot.originalTabIndex, 0), maxIndex) + _ = workspace.reorderSurface(panelId: browserPanel.id, toIndex: targetIndex) + return true + } + + if let orientation = snapshot.fallbackSplitOrientation, + let fallbackAnchorPaneId = snapshot.fallbackAnchorPaneId, + let anchorPane = workspace.bonsplitController.allPaneIds.first(where: { $0.id == fallbackAnchorPaneId }), + let anchorTab = workspace.bonsplitController.selectedTab(inPane: anchorPane) ?? workspace.bonsplitController.tabs(inPane: anchorPane).first, + let anchorPanelId = workspace.panelIdFromSurfaceId(anchorTab.id), + workspace.newBrowserSplit( + from: anchorPanelId, + orientation: orientation, + insertFirst: snapshot.fallbackSplitInsertFirst, + url: snapshot.url + ) != nil { + return true + } + + guard let focusedPane = workspace.bonsplitController.focusedPaneId ?? workspace.bonsplitController.allPaneIds.first else { + return false + } + return workspace.newBrowserSurface(inPane: focusedPane, url: snapshot.url, focus: true) != nil + } + /// Flash the currently focused panel so the user can visually confirm focus. func triggerFocusFlash() { guard let tab = selectedWorkspace, diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index a530af87..d5613417 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -37,6 +37,16 @@ struct SidebarGitBranchState { let isDirty: Bool } +struct ClosedBrowserPanelRestoreSnapshot { + let workspaceId: UUID + let url: URL? + let originalPaneId: UUID + let originalTabIndex: Int + let fallbackSplitOrientation: SplitOrientation? + let fallbackSplitInsertFirst: Bool + let fallbackAnchorPaneId: UUID? +} + /// Workspace represents a sidebar tab. /// Each workspace contains one BonsplitController that manages split panes and nested surfaces. @MainActor @@ -62,6 +72,9 @@ final class Workspace: Identifiable, ObservableObject { /// When true, suppresses auto-creation in didSplitPane (programmatic splits handle their own panels) private var isProgrammaticSplit = false + /// Callback used by TabManager to capture recently closed browser panels for Cmd+Shift+T restore. + var onClosedBrowserPanel: ((ClosedBrowserPanelRestoreSnapshot) -> Void)? + // Closing tabs mutates split layout immediately; terminal views handle their own AppKit // layout/size synchronization. @@ -254,6 +267,7 @@ final class Workspace: Identifiable, ObservableObject { /// Deterministic tab selection to apply after a tab closes. /// Keyed by the closing tab ID, value is the tab ID we want to select next. private var postCloseSelectTabId: [TabID: TabID] = [:] + private var pendingClosedBrowserRestoreSnapshots: [TabID: ClosedBrowserPanelRestoreSnapshot] = [:] private var isApplyingTabSelection = false private var pendingTabSelection: (tabId: TabID, pane: PaneID)? private var isReconcilingFocusState = false @@ -953,6 +967,115 @@ final class Workspace: Identifiable, ObservableObject { } } + private struct BrowserCloseFallbackPlan { + let orientation: SplitOrientation + let insertFirst: Bool + let anchorPaneId: UUID? + } + + private func stageClosedBrowserRestoreSnapshotIfNeeded(for tab: Bonsplit.Tab, inPane pane: PaneID) { + guard let panelId = panelIdFromSurfaceId(tab.id), + let browserPanel = browserPanel(for: panelId), + let tabIndex = bonsplitController.tabs(inPane: pane).firstIndex(where: { $0.id == tab.id }) else { + pendingClosedBrowserRestoreSnapshots.removeValue(forKey: tab.id) + return + } + + let fallbackPlan = browserCloseFallbackPlan( + forPaneId: pane.id.uuidString, + in: bonsplitController.treeSnapshot() + ) + let resolvedURL = browserPanel.currentURL + ?? browserPanel.webView.url + ?? browserPanel.preferredURLStringForOmnibar().flatMap(URL.init(string:)) + + pendingClosedBrowserRestoreSnapshots[tab.id] = ClosedBrowserPanelRestoreSnapshot( + workspaceId: id, + url: resolvedURL, + originalPaneId: pane.id, + originalTabIndex: tabIndex, + fallbackSplitOrientation: fallbackPlan?.orientation, + fallbackSplitInsertFirst: fallbackPlan?.insertFirst ?? false, + fallbackAnchorPaneId: fallbackPlan?.anchorPaneId + ) + } + + private func clearStagedClosedBrowserRestoreSnapshot(for tabId: TabID) { + pendingClosedBrowserRestoreSnapshots.removeValue(forKey: tabId) + } + + private func browserCloseFallbackPlan( + forPaneId targetPaneId: String, + in node: ExternalTreeNode + ) -> BrowserCloseFallbackPlan? { + switch node { + case .pane: + return nil + case .split(let splitNode): + if case .pane(let firstPane) = splitNode.first, firstPane.id == targetPaneId { + return BrowserCloseFallbackPlan( + orientation: splitNode.orientation.lowercased() == "vertical" ? .vertical : .horizontal, + insertFirst: true, + anchorPaneId: browserNearestPaneId( + in: splitNode.second, + targetCenter: browserPaneCenter(firstPane) + ) + ) + } + + if case .pane(let secondPane) = splitNode.second, secondPane.id == targetPaneId { + return BrowserCloseFallbackPlan( + orientation: splitNode.orientation.lowercased() == "vertical" ? .vertical : .horizontal, + insertFirst: false, + anchorPaneId: browserNearestPaneId( + in: splitNode.first, + targetCenter: browserPaneCenter(secondPane) + ) + ) + } + + if let nested = browserCloseFallbackPlan(forPaneId: targetPaneId, in: splitNode.first) { + return nested + } + return browserCloseFallbackPlan(forPaneId: targetPaneId, in: splitNode.second) + } + } + + private func browserPaneCenter(_ pane: ExternalPaneNode) -> (x: Double, y: Double) { + ( + x: pane.frame.x + (pane.frame.width * 0.5), + y: pane.frame.y + (pane.frame.height * 0.5) + ) + } + + private func browserNearestPaneId( + in node: ExternalTreeNode, + targetCenter: (x: Double, y: Double)? + ) -> UUID? { + var panes: [ExternalPaneNode] = [] + browserCollectPaneNodes(node: node, into: &panes) + guard !panes.isEmpty else { return nil } + + let bestPane: ExternalPaneNode? + if let targetCenter { + bestPane = panes.min { lhs, rhs in + let lhsCenter = browserPaneCenter(lhs) + let rhsCenter = browserPaneCenter(rhs) + let lhsDistance = pow(lhsCenter.x - targetCenter.x, 2) + pow(lhsCenter.y - targetCenter.y, 2) + let rhsDistance = pow(rhsCenter.x - targetCenter.x, 2) + pow(rhsCenter.y - targetCenter.y, 2) + if lhsDistance != rhsDistance { + return lhsDistance < rhsDistance + } + return lhs.id < rhs.id + } + } else { + bestPane = panes.first + } + + guard let bestPane else { return nil } + return UUID(uuidString: bestPane.id) + } + @discardableResult func moveSurface(panelId: UUID, toPane paneId: PaneID, atIndex index: Int? = nil, focus: Bool = true) -> Bool { guard let tabId = surfaceIdFromPanelId(panelId) else { return false } @@ -1573,12 +1696,14 @@ extension Workspace: BonsplitDelegate { } if forceCloseTabIds.contains(tab.id) { + stageClosedBrowserRestoreSnapshotIfNeeded(for: tab, inPane: pane) recordPostCloseSelection() return true } if let panelId = panelIdFromSurfaceId(tab.id), pinnedPanelIds.contains(panelId) { + clearStagedClosedBrowserRestoreSnapshot(for: tab.id) NSSound.beep() return false } @@ -1586,6 +1711,7 @@ extension Workspace: BonsplitDelegate { // Check if the panel needs close confirmation guard let panelId = panelIdFromSurfaceId(tab.id), let terminalPanel = terminalPanel(for: panelId) else { + stageClosedBrowserRestoreSnapshotIfNeeded(for: tab, inPane: pane) recordPostCloseSelection() return true } @@ -1594,6 +1720,7 @@ extension Workspace: BonsplitDelegate { // Show an app-level confirmation, then re-attempt the close with forceCloseTabIds to bypass // this gating on the second pass. if terminalPanel.needsConfirmClose() { + clearStagedClosedBrowserRestoreSnapshot(for: tab.id) if pendingCloseConfirmTabIds.contains(tab.id) { return false } @@ -1619,6 +1746,7 @@ extension Workspace: BonsplitDelegate { return false } + clearStagedClosedBrowserRestoreSnapshot(for: tab.id) recordPostCloseSelection() return true } @@ -1626,6 +1754,7 @@ extension Workspace: BonsplitDelegate { func splitTabBar(_ controller: BonsplitController, didCloseTab tabId: TabID, fromPane pane: PaneID) { forceCloseTabIds.remove(tabId) let selectTabId = postCloseSelectTabId.removeValue(forKey: tabId) + let closedBrowserRestoreSnapshot = pendingClosedBrowserRestoreSnapshots.removeValue(forKey: tabId) // Clean up our panel guard let panelId = panelIdFromSurfaceId(tabId) else { @@ -1661,6 +1790,9 @@ extension Workspace: BonsplitDelegate { manuallyUnread: manualUnreadPanelIds.contains(panelId) ) } else { + if let closedBrowserRestoreSnapshot { + onClosedBrowserPanel?(closedBrowserRestoreSnapshot) + } panel?.close() } diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index f7da6258..8dfe3bc8 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -363,6 +363,11 @@ struct cmuxApp: App { closeTabOrWindow() } .keyboardShortcut("w", modifiers: [.command, .shift]) + + Button("Reopen Closed Browser Panel") { + _ = (AppDelegate.shared?.tabManager ?? tabManager).reopenMostRecentlyClosedBrowserPanel() + } + .keyboardShortcut("t", modifiers: [.command, .shift]) } // Find diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index 6e57013e..cd81e89e 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -271,6 +271,44 @@ final class NotificationBurstCoalescerTests: XCTestCase { } } +final class RecentlyClosedBrowserStackTests: XCTestCase { + func testPopReturnsEntriesInLIFOOrder() { + var stack = RecentlyClosedBrowserStack(capacity: 20) + stack.push(makeSnapshot(index: 1)) + stack.push(makeSnapshot(index: 2)) + stack.push(makeSnapshot(index: 3)) + + XCTAssertEqual(stack.pop()?.originalTabIndex, 3) + XCTAssertEqual(stack.pop()?.originalTabIndex, 2) + XCTAssertEqual(stack.pop()?.originalTabIndex, 1) + XCTAssertNil(stack.pop()) + } + + func testPushDropsOldestEntriesWhenCapacityExceeded() { + var stack = RecentlyClosedBrowserStack(capacity: 3) + for index in 1...5 { + stack.push(makeSnapshot(index: index)) + } + + XCTAssertEqual(stack.pop()?.originalTabIndex, 5) + XCTAssertEqual(stack.pop()?.originalTabIndex, 4) + XCTAssertEqual(stack.pop()?.originalTabIndex, 3) + XCTAssertNil(stack.pop()) + } + + private func makeSnapshot(index: Int) -> ClosedBrowserPanelRestoreSnapshot { + ClosedBrowserPanelRestoreSnapshot( + workspaceId: UUID(), + url: URL(string: "https://example.com/\(index)"), + originalPaneId: UUID(), + originalTabIndex: index, + fallbackSplitOrientation: .horizontal, + fallbackSplitInsertFirst: false, + fallbackAnchorPaneId: UUID() + ) + } +} + final class TabManagerNotificationOrderingSourceTests: XCTestCase { func testGhosttyDidSetTitleObserverDoesNotHopThroughTask() throws { let projectRoot = findProjectRoot() From ede5b701bb867c563663b7ca1166eb8abda64663 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:07:52 -0800 Subject: [PATCH 015/214] Fix Mark Tab as Unread no-op on focused tab (#249) * Fix manual unread clear race on focused tab * Add mark-as-read tab action and show ring for manual unread * Flash then clear manual unread on tab focus --- CLI/cmux.swift | 2 +- Sources/TerminalController.swift | 6 +- Sources/Workspace.swift | 69 +++++++++++- Sources/WorkspaceContentView.swift | 5 +- cmuxTests/WorkspaceManualUnreadTests.swift | 108 +++++++++++++++++++ tests_v2/test_tab_workspace_action_naming.py | 4 + vendor/bonsplit | 2 +- 7 files changed, 189 insertions(+), 7 deletions(-) create mode 100644 cmuxTests/WorkspaceManualUnreadTests.swift diff --git a/CLI/cmux.swift b/CLI/cmux.swift index 1873e352..88cab6e8 100644 --- a/CLI/cmux.swift +++ b/CLI/cmux.swift @@ -3031,7 +3031,7 @@ struct CMUXCLI { new-terminal-right | new-browser-right reload | duplicate pin | unpin - mark-unread + mark-read | mark-unread Flags: --action Action name (required if not positional) diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index d8724264..3193df82 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -2046,7 +2046,7 @@ class TerminalController { "close_left", "close_right", "close_others", "new_terminal_right", "new_browser_right", "reload", "duplicate", - "pin", "unpin", "mark_unread" + "pin", "unpin", "mark_read", "mark_unread" ] var result: V2CallResult = .err(code: "invalid_params", message: "Unknown tab action", data: [ @@ -2160,6 +2160,10 @@ class TerminalController { workspace.setPanelPinned(panelId: surfaceId, pinned: false) finish(["pinned": false]) + case "mark_read", "mark_as_read": + workspace.markPanelRead(surfaceId) + finish() + case "mark_unread", "mark_as_unread": workspace.markPanelUnread(surfaceId) finish() diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index d5613417..54b8b203 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -103,6 +103,9 @@ final class Workspace: Identifiable, ObservableObject { @Published private(set) var panelCustomTitles: [UUID: String] = [:] @Published private(set) var pinnedPanelIds: Set = [] @Published private(set) var manualUnreadPanelIds: Set = [] + private var manualUnreadMarkedAt: [UUID: Date] = [:] + nonisolated private static let manualUnreadFocusGraceInterval: TimeInterval = 0.2 + nonisolated private static let manualUnreadClearDelayAfterFocusFlash: TimeInterval = 0.2 @Published var statusEntries: [String: SidebarStatusEntry] = [:] @Published var logEntries: [SidebarLogEntry] = [] @Published var progress: SidebarProgressState? @@ -388,7 +391,10 @@ final class Workspace: Identifiable, ObservableObject { private func syncUnreadBadgeStateForPanel(_ panelId: UUID) { guard let tabId = surfaceIdFromPanelId(panelId) else { return } - let shouldShowUnread = manualUnreadPanelIds.contains(panelId) || hasUnreadNotification(panelId: panelId) + let shouldShowUnread = Self.shouldShowUnreadIndicator( + hasUnreadNotification: hasUnreadNotification(panelId: panelId), + isManuallyUnread: manualUnreadPanelIds.contains(panelId) + ) if let existing = bonsplitController.tab(tabId), existing.showsNotificationBadge == shouldShowUnread { return } @@ -481,14 +487,45 @@ final class Workspace: Identifiable, ObservableObject { func markPanelUnread(_ panelId: UUID) { guard panels[panelId] != nil else { return } guard manualUnreadPanelIds.insert(panelId).inserted else { return } + manualUnreadMarkedAt[panelId] = Date() syncUnreadBadgeStateForPanel(panelId) } + func markPanelRead(_ panelId: UUID) { + guard panels[panelId] != nil else { return } + AppDelegate.shared?.notificationStore?.markRead(forTabId: id, surfaceId: panelId) + clearManualUnread(panelId: panelId) + } + func clearManualUnread(panelId: UUID) { - guard manualUnreadPanelIds.remove(panelId) != nil else { return } + let didRemoveUnread = manualUnreadPanelIds.remove(panelId) != nil + manualUnreadMarkedAt.removeValue(forKey: panelId) + guard didRemoveUnread else { return } syncUnreadBadgeStateForPanel(panelId) } + static func shouldClearManualUnread( + previousFocusedPanelId: UUID?, + nextFocusedPanelId: UUID, + isManuallyUnread: Bool, + markedAt: Date?, + now: Date = Date(), + sameTabGraceInterval: TimeInterval = manualUnreadFocusGraceInterval + ) -> Bool { + guard isManuallyUnread else { return false } + + if let previousFocusedPanelId, previousFocusedPanelId != nextFocusedPanelId { + return true + } + + guard let markedAt else { return true } + return now.timeIntervalSince(markedAt) >= sameTabGraceInterval + } + + static func shouldShowUnreadIndicator(hasUnreadNotification: Bool, isManuallyUnread: Bool) -> Bool { + hasUnreadNotification || isManuallyUnread + } + // MARK: - Title Management var hasCustomTitle: Bool { @@ -571,6 +608,7 @@ final class Workspace: Identifiable, ObservableObject { panelCustomTitles = panelCustomTitles.filter { validSurfaceIds.contains($0.key) } pinnedPanelIds = pinnedPanelIds.filter { validSurfaceIds.contains($0) } manualUnreadPanelIds = manualUnreadPanelIds.filter { validSurfaceIds.contains($0) } + manualUnreadMarkedAt = manualUnreadMarkedAt.filter { validSurfaceIds.contains($0.key) } surfaceListeningPorts = surfaceListeningPorts.filter { validSurfaceIds.contains($0.key) } surfaceTTYNames = surfaceTTYNames.filter { validSurfaceIds.contains($0.key) } recomputeListeningPorts() @@ -1157,8 +1195,10 @@ final class Workspace: Identifiable, ObservableObject { } if detached.manuallyUnread { manualUnreadPanelIds.insert(detached.panelId) + manualUnreadMarkedAt[detached.panelId] = .distantPast } else { manualUnreadPanelIds.remove(detached.panelId) + manualUnreadMarkedAt.removeValue(forKey: detached.panelId) } guard let newTabId = bonsplitController.createTab( @@ -1178,6 +1218,7 @@ final class Workspace: Identifiable, ObservableObject { panelCustomTitles.removeValue(forKey: detached.panelId) pinnedPanelIds.remove(detached.panelId) manualUnreadPanelIds.remove(detached.panelId) + manualUnreadMarkedAt.removeValue(forKey: detached.panelId) panelSubscriptions.removeValue(forKey: detached.panelId) return nil } @@ -1611,6 +1652,7 @@ extension Workspace: BonsplitDelegate { } private func applyTabSelectionNow(tabId: TabID, inPane pane: PaneID) { + let previousFocusedPanelId = focusedPanelId if bonsplitController.allPaneIds.contains(pane) { if bonsplitController.focusedPaneId != pane { bonsplitController.focusPane(pane) @@ -1650,7 +1692,24 @@ extension Workspace: BonsplitDelegate { } panel.focus() - clearManualUnread(panelId: panelId) + let isManuallyUnread = manualUnreadPanelIds.contains(panelId) + let markedAt = manualUnreadMarkedAt[panelId] + if Self.shouldClearManualUnread( + previousFocusedPanelId: previousFocusedPanelId, + nextFocusedPanelId: panelId, + isManuallyUnread: isManuallyUnread, + markedAt: markedAt + ) { + triggerFocusFlash(panelId: panelId) + let clearDelay = Self.manualUnreadClearDelayAfterFocusFlash + if clearDelay <= 0 { + clearManualUnread(panelId: panelId) + } else { + DispatchQueue.main.asyncAfter(deadline: .now() + clearDelay) { [weak self] in + self?.clearManualUnread(panelId: panelId) + } + } + } // Converge AppKit first responder with bonsplit's selected tab in the focused pane. // Without this, keyboard input can remain on a different terminal than the blue tab indicator. @@ -1803,6 +1862,7 @@ extension Workspace: BonsplitDelegate { panelCustomTitles.removeValue(forKey: panelId) pinnedPanelIds.remove(panelId) manualUnreadPanelIds.remove(panelId) + manualUnreadMarkedAt.removeValue(forKey: panelId) panelSubscriptions.removeValue(forKey: panelId) surfaceTTYNames.removeValue(forKey: panelId) PortScanner.shared.unregisterPanel(workspaceId: id, panelId: panelId) @@ -2118,6 +2178,9 @@ extension Workspace: BonsplitDelegate { guard let panelId = panelIdFromSurfaceId(tab.id) else { return } let shouldPin = !pinnedPanelIds.contains(panelId) setPanelPinned(panelId: panelId, pinned: shouldPin) + case .markAsRead: + guard let panelId = panelIdFromSurfaceId(tab.id) else { return } + markPanelRead(panelId) case .markAsUnread: guard let panelId = panelIdFromSurfaceId(tab.id) else { return } markPanelUnread(panelId) diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index ec34dd1b..defce523 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -42,7 +42,10 @@ struct WorkspaceContentView: View { let isFocused = isWorkspaceInputActive && workspace.focusedPanelId == panel.id let isSelectedInPane = workspace.bonsplitController.selectedTab(inPane: paneId)?.id == tab.id let isVisibleInUI = isWorkspaceVisible && isSelectedInPane - let hasUnreadNotification = notificationStore.hasUnreadNotification(forTabId: workspace.id, surfaceId: panel.id) + let hasUnreadNotification = Workspace.shouldShowUnreadIndicator( + hasUnreadNotification: notificationStore.hasUnreadNotification(forTabId: workspace.id, surfaceId: panel.id), + isManuallyUnread: workspace.manualUnreadPanelIds.contains(panel.id) + ) PanelContentView( panel: panel, isFocused: isFocused, diff --git a/cmuxTests/WorkspaceManualUnreadTests.swift b/cmuxTests/WorkspaceManualUnreadTests.swift new file mode 100644 index 00000000..d5464d73 --- /dev/null +++ b/cmuxTests/WorkspaceManualUnreadTests.swift @@ -0,0 +1,108 @@ +import XCTest + +#if canImport(cmux_DEV) +@testable import cmux_DEV +#elseif canImport(cmux) +@testable import cmux +#endif + +final class WorkspaceManualUnreadTests: XCTestCase { + func testShouldClearManualUnreadWhenFocusMovesToDifferentPanel() { + let previousFocusedPanelId = UUID() + let nextFocusedPanelId = UUID() + + XCTAssertTrue( + Workspace.shouldClearManualUnread( + previousFocusedPanelId: previousFocusedPanelId, + nextFocusedPanelId: nextFocusedPanelId, + isManuallyUnread: true, + markedAt: Date() + ) + ) + } + + func testShouldNotClearManualUnreadWhenFocusStaysOnSamePanelWithinGrace() { + let panelId = UUID() + let now = Date() + + XCTAssertFalse( + Workspace.shouldClearManualUnread( + previousFocusedPanelId: panelId, + nextFocusedPanelId: panelId, + isManuallyUnread: true, + markedAt: now.addingTimeInterval(-0.05), + now: now, + sameTabGraceInterval: 0.2 + ) + ) + } + + func testShouldClearManualUnreadWhenFocusStaysOnSamePanelAfterGrace() { + let panelId = UUID() + let now = Date() + + XCTAssertTrue( + Workspace.shouldClearManualUnread( + previousFocusedPanelId: panelId, + nextFocusedPanelId: panelId, + isManuallyUnread: true, + markedAt: now.addingTimeInterval(-0.25), + now: now, + sameTabGraceInterval: 0.2 + ) + ) + } + + func testShouldNotClearManualUnreadWhenNotManuallyUnread() { + XCTAssertFalse( + Workspace.shouldClearManualUnread( + previousFocusedPanelId: UUID(), + nextFocusedPanelId: UUID(), + isManuallyUnread: false, + markedAt: Date() + ) + ) + } + + func testShouldNotClearManualUnreadWhenNoPreviousFocusAndWithinGrace() { + let now = Date() + + XCTAssertFalse( + Workspace.shouldClearManualUnread( + previousFocusedPanelId: nil, + nextFocusedPanelId: UUID(), + isManuallyUnread: true, + markedAt: now.addingTimeInterval(-0.05), + now: now, + sameTabGraceInterval: 0.2 + ) + ) + } + + func testShouldShowUnreadIndicatorWhenNotificationIsUnread() { + XCTAssertTrue( + Workspace.shouldShowUnreadIndicator( + hasUnreadNotification: true, + isManuallyUnread: false + ) + ) + } + + func testShouldShowUnreadIndicatorWhenManualUnreadIsSet() { + XCTAssertTrue( + Workspace.shouldShowUnreadIndicator( + hasUnreadNotification: false, + isManuallyUnread: true + ) + ) + } + + func testShouldHideUnreadIndicatorWhenNeitherNotificationNorManualUnreadExists() { + XCTAssertFalse( + Workspace.shouldShowUnreadIndicator( + hasUnreadNotification: false, + isManuallyUnread: false + ) + ) + } +} diff --git a/tests_v2/test_tab_workspace_action_naming.py b/tests_v2/test_tab_workspace_action_naming.py index 6b3f4805..c792b92e 100644 --- a/tests_v2/test_tab_workspace_action_naming.py +++ b/tests_v2/test_tab_workspace_action_naming.py @@ -146,6 +146,10 @@ def main() -> int: by_tab_only = c._call("tab.action", {"tab_id": tab_ref, "action": "mark_unread"}) or {} _must(str(by_tab_only.get("tab_ref") or "").startswith("tab:"), f"Expected tab_ref in tab_id-only result: {by_tab_only}") _must(str(by_tab_only.get("workspace_id") or "") == ws_id, f"tab_id-only action should resolve target workspace: {by_tab_only}") + + mark_read = c._call("tab.action", {"tab_id": tab_ref, "action": "mark_read"}) or {} + _must(str(mark_read.get("tab_ref") or "").startswith("tab:"), f"Expected tab_ref in mark_read result: {mark_read}") + _must(str(mark_read.get("workspace_id") or "") == ws_id, f"mark_read should resolve target workspace: {mark_read}") finally: if ws_other: try: diff --git a/vendor/bonsplit b/vendor/bonsplit index cf929c88..198736e4 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit cf929c887af79ea8b881e39da5b8c4ee1d6b9009 +Subproject commit 198736e4e2db10931c263eb221b2592fc86e80e7 From 29167195fac9878b72d69a2254c16c4b9bc08247 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:14:31 -0800 Subject: [PATCH 016/214] Fix browser reopen focus across workspace switches --- Sources/TabManager.swift | 20 ++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 141 +++++++++++++----- 2 files changed, 118 insertions(+), 43 deletions(-) diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index ab3da8bd..7984db48 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -1601,7 +1601,11 @@ class TabManager: ObservableObject { selectedTabId = targetWorkspace.id } - if reopenClosedBrowserPanel(snapshot, in: targetWorkspace) { + if let reopenedPanelId = reopenClosedBrowserPanel(snapshot, in: targetWorkspace) { + // Workspace switches defer focus restoration to the next main-queue turn. + // Record the reopened browser immediately so deferred restore doesn't snap + // back to the previously focused terminal in that workspace. + rememberFocusedSurface(tabId: targetWorkspace.id, surfaceId: reopenedPanelId) return true } } @@ -1612,14 +1616,14 @@ class TabManager: ObservableObject { private func reopenClosedBrowserPanel( _ snapshot: ClosedBrowserPanelRestoreSnapshot, in workspace: Workspace - ) -> Bool { + ) -> UUID? { if let originalPane = workspace.bonsplitController.allPaneIds.first(where: { $0.id == snapshot.originalPaneId }), let browserPanel = workspace.newBrowserSurface(inPane: originalPane, url: snapshot.url, focus: true) { let tabCount = workspace.bonsplitController.tabs(inPane: originalPane).count let maxIndex = max(0, tabCount - 1) let targetIndex = min(max(snapshot.originalTabIndex, 0), maxIndex) _ = workspace.reorderSurface(panelId: browserPanel.id, toIndex: targetIndex) - return true + return browserPanel.id } if let orientation = snapshot.fallbackSplitOrientation, @@ -1627,19 +1631,19 @@ class TabManager: ObservableObject { let anchorPane = workspace.bonsplitController.allPaneIds.first(where: { $0.id == fallbackAnchorPaneId }), let anchorTab = workspace.bonsplitController.selectedTab(inPane: anchorPane) ?? workspace.bonsplitController.tabs(inPane: anchorPane).first, let anchorPanelId = workspace.panelIdFromSurfaceId(anchorTab.id), - workspace.newBrowserSplit( + let browserPanelId = workspace.newBrowserSplit( from: anchorPanelId, orientation: orientation, insertFirst: snapshot.fallbackSplitInsertFirst, url: snapshot.url - ) != nil { - return true + )?.id { + return browserPanelId } guard let focusedPane = workspace.bonsplitController.focusedPaneId ?? workspace.bonsplitController.allPaneIds.first else { - return false + return nil } - return workspace.newBrowserSurface(inPane: focusedPane, url: snapshot.url, focus: true) != nil + return workspace.newBrowserSurface(inPane: focusedPane, url: snapshot.url, focus: true)?.id } /// Flash the currently focused panel so the user can visually confirm focus. diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 548a979c..01946c44 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -782,54 +782,33 @@ final class AppearanceSettingsTests: XCTestCase { } } -final class UpdateChannelSettingsTests: XCTestCase { - func testDefaultNightlyPreferenceIsDisabled() { - XCTAssertFalse(UpdateChannelSettings.defaultIncludeNightlyBuilds) +final class UpdateFeedResolverTests: XCTestCase { + func testResolvedFeedFallsBackToStableWhenInfoFeedMissing() { + let resolved = UpdateFeedResolver.resolvedFeedURLString(infoFeedURL: nil) + XCTAssertEqual(resolved.url, UpdateFeedResolver.fallbackFeedURL) + XCTAssertFalse(resolved.isNightly) + XCTAssertTrue(resolved.usedFallback) } - func testResolvedFeedFallsBackToStableWhenInfoFeedMissing() { - let suiteName = "UpdateChannelSettingsTests.MissingInfo.\(UUID().uuidString)" - guard let defaults = UserDefaults(suiteName: suiteName) else { - XCTFail("Failed to create isolated UserDefaults suite") - return - } - defer { defaults.removePersistentDomain(forName: suiteName) } - - let resolved = UpdateChannelSettings.resolvedFeedURLString(infoFeedURL: nil, defaults: defaults) - XCTAssertEqual(resolved.url, UpdateChannelSettings.stableFeedURL) + func testResolvedFeedFallsBackToStableWhenInfoFeedEmpty() { + let resolved = UpdateFeedResolver.resolvedFeedURLString(infoFeedURL: "") + XCTAssertEqual(resolved.url, UpdateFeedResolver.fallbackFeedURL) XCTAssertFalse(resolved.isNightly) XCTAssertTrue(resolved.usedFallback) } func testResolvedFeedUsesInfoFeedForStableChannel() { - let suiteName = "UpdateChannelSettingsTests.InfoFeed.\(UUID().uuidString)" - guard let defaults = UserDefaults(suiteName: suiteName) else { - XCTFail("Failed to create isolated UserDefaults suite") - return - } - defer { defaults.removePersistentDomain(forName: suiteName) } - let infoFeed = "https://example.com/custom/appcast.xml" - let resolved = UpdateChannelSettings.resolvedFeedURLString(infoFeedURL: infoFeed, defaults: defaults) + let resolved = UpdateFeedResolver.resolvedFeedURLString(infoFeedURL: infoFeed) XCTAssertEqual(resolved.url, infoFeed) XCTAssertFalse(resolved.isNightly) XCTAssertFalse(resolved.usedFallback) } - func testResolvedFeedUsesNightlyWhenPreferenceEnabled() { - let suiteName = "UpdateChannelSettingsTests.Nightly.\(UUID().uuidString)" - guard let defaults = UserDefaults(suiteName: suiteName) else { - XCTFail("Failed to create isolated UserDefaults suite") - return - } - defer { defaults.removePersistentDomain(forName: suiteName) } - - defaults.set(true, forKey: UpdateChannelSettings.includeNightlyBuildsKey) - let resolved = UpdateChannelSettings.resolvedFeedURLString( - infoFeedURL: "https://example.com/custom/appcast.xml", - defaults: defaults - ) - XCTAssertEqual(resolved.url, UpdateChannelSettings.nightlyFeedURL) + func testResolvedFeedDetectsNightlyChannelFromFeedURL() { + let infoFeed = "https://example.com/nightly/appcast.xml" + let resolved = UpdateFeedResolver.resolvedFeedURLString(infoFeedURL: infoFeed) + XCTAssertEqual(resolved.url, infoFeed) XCTAssertTrue(resolved.isNightly) XCTAssertFalse(resolved.usedFallback) } @@ -953,6 +932,98 @@ final class TabManagerSurfaceCreationTests: XCTestCase { } } +@MainActor +final class TabManagerReopenClosedBrowserFocusTests: XCTestCase { + func testReopenFromDifferentWorkspaceFocusesReopenedBrowser() { + let manager = TabManager() + guard let workspace1 = manager.selectedWorkspace, + let closedBrowserId = manager.openBrowser(url: URL(string: "https://example.com/ws-switch")) else { + XCTFail("Expected initial workspace and browser panel") + return + } + + drainMainQueue() + XCTAssertTrue(workspace1.closePanel(closedBrowserId, force: true)) + drainMainQueue() + + let workspace2 = manager.addWorkspace() + XCTAssertEqual(manager.selectedTabId, workspace2.id) + + XCTAssertTrue(manager.reopenMostRecentlyClosedBrowserPanel()) + drainMainQueue() + + XCTAssertEqual(manager.selectedTabId, workspace1.id) + XCTAssertTrue(isFocusedPanelBrowser(in: workspace1)) + } + + func testReopenFallsBackToCurrentWorkspaceAndFocusesBrowserWhenOriginalWorkspaceDeleted() { + let manager = TabManager() + guard let originalWorkspace = manager.selectedWorkspace, + let closedBrowserId = manager.openBrowser(url: URL(string: "https://example.com/deleted-ws")) else { + XCTFail("Expected initial workspace and browser panel") + return + } + + drainMainQueue() + XCTAssertTrue(originalWorkspace.closePanel(closedBrowserId, force: true)) + drainMainQueue() + + let currentWorkspace = manager.addWorkspace() + manager.closeWorkspace(originalWorkspace) + + XCTAssertEqual(manager.selectedTabId, currentWorkspace.id) + XCTAssertFalse(manager.tabs.contains(where: { $0.id == originalWorkspace.id })) + + XCTAssertTrue(manager.reopenMostRecentlyClosedBrowserPanel()) + drainMainQueue() + + XCTAssertEqual(manager.selectedTabId, currentWorkspace.id) + XCTAssertTrue(isFocusedPanelBrowser(in: currentWorkspace)) + } + + func testReopenCollapsedSplitFromDifferentWorkspaceFocusesBrowser() { + let manager = TabManager() + guard let workspace1 = manager.selectedWorkspace, + let sourcePanelId = workspace1.focusedPanelId, + let splitBrowserId = manager.newBrowserSplit( + tabId: workspace1.id, + fromPanelId: sourcePanelId, + orientation: .horizontal, + insertFirst: false, + url: URL(string: "https://example.com/collapsed-split") + ) else { + XCTFail("Expected to create browser split") + return + } + + drainMainQueue() + XCTAssertTrue(workspace1.closePanel(splitBrowserId, force: true)) + drainMainQueue() + + let workspace2 = manager.addWorkspace() + XCTAssertEqual(manager.selectedTabId, workspace2.id) + + XCTAssertTrue(manager.reopenMostRecentlyClosedBrowserPanel()) + drainMainQueue() + + XCTAssertEqual(manager.selectedTabId, workspace1.id) + XCTAssertTrue(isFocusedPanelBrowser(in: workspace1)) + } + + private func isFocusedPanelBrowser(in workspace: Workspace) -> Bool { + guard let focusedPanelId = workspace.focusedPanelId else { return false } + return workspace.panels[focusedPanelId] is BrowserPanel + } + + private func drainMainQueue() { + let expectation = expectation(description: "drain main queue") + DispatchQueue.main.async { + expectation.fulfill() + } + wait(for: [expectation], timeout: 1.0) + } +} + @MainActor final class BrowserPanelAddressBarFocusRequestTests: XCTestCase { func testRequestPersistsUntilAcknowledged() { From 021cc05cf31cdf762287c0c12ae3b9067a98628e Mon Sep 17 00:00:00 2001 From: Austin Wang Date: Fri, 20 Feb 2026 23:14:48 -0800 Subject: [PATCH 017/214] Stabilize sidebar resizer hitbox and cursor across portals (#255) --- Sources/BrowserWindowPortal.swift | 28 ++ Sources/ContentView.swift | 460 +++++++++++++++++++++----- Sources/Panels/BrowserPanelView.swift | 21 ++ Sources/TerminalWindowPortal.swift | 31 ++ vendor/bonsplit | 2 +- 5 files changed, 458 insertions(+), 84 deletions(-) diff --git a/Sources/BrowserWindowPortal.swift b/Sources/BrowserWindowPortal.swift index 4578fdcc..86fead61 100644 --- a/Sources/BrowserWindowPortal.swift +++ b/Sources/BrowserWindowPortal.swift @@ -22,8 +22,12 @@ private func browserPortalDebugFrame(_ rect: NSRect) -> String { final class WindowBrowserHostView: NSView { override var isOpaque: Bool { false } + private var cachedSidebarDividerX: CGFloat? override func hitTest(_ point: NSPoint) -> NSView? { + if shouldPassThroughToSidebarResizer(at: point) { + return nil + } if shouldPassThroughToSplitDivider(at: point) { return nil } @@ -31,6 +35,30 @@ final class WindowBrowserHostView: NSView { return hitView === self ? nil : hitView } + private func shouldPassThroughToSidebarResizer(at point: NSPoint) -> Bool { + // Browser portal host sits above SwiftUI content. Allow pointer/mouse events + // to reach the SwiftUI sidebar divider resizer zone. + let visibleSlots = subviews.compactMap { $0 as? WindowBrowserSlotView } + .filter { !$0.isHidden && $0.window != nil && $0.frame.width > 1 && $0.frame.height > 1 } + + // Ignore transient 0-origin slots during layout churn and preserve the last + // known-good divider edge. + let dividerCandidates = visibleSlots + .map(\.frame.minX) + .filter { $0 > 1 } + if let leftMostEdge = dividerCandidates.min() { + cachedSidebarDividerX = leftMostEdge + } + + guard let dividerX = cachedSidebarDividerX else { + return false + } + + let regionMinX = dividerX - SidebarResizeInteraction.hitWidthPerSide + let regionMaxX = dividerX + SidebarResizeInteraction.hitWidthPerSide + return point.x >= regionMinX && point.x <= regionMaxX + } + private func shouldPassThroughToSplitDivider(at point: NSPoint) -> Bool { guard let window else { return false } let windowPoint = convert(point, to: nil) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 6f308362..4ce19f3f 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -159,6 +159,15 @@ final class SidebarState: ObservableObject { } } +enum SidebarResizeInteraction { + static let handleWidth: CGFloat = 6 + static let hitInset: CGFloat = 3 + + static var hitWidthPerSide: CGFloat { + hitInset + (handleWidth / 2) + } +} + // MARK: - File Drop Overlay enum DragOverlayRoutingPolicy { @@ -272,6 +281,8 @@ final class FileDropOverlayView: NSView { /// Fallback handler when no terminal is found under the drop point. var onDrop: (([URL]) -> Bool)? private var isForwardingMouseEvent = false + private weak var forwardedMouseDragTarget: NSView? + private var forwardedMouseDragButton: ForwardedMouseDragButton? /// The WKWebView currently receiving forwarded drag events, so we can /// synthesize draggingExited/draggingEntered as the cursor moves. private weak var activeDragWebView: WKWebView? @@ -287,6 +298,43 @@ final class FileDropOverlayView: NSView { required init?(coder: NSCoder) { fatalError("init(coder:) not implemented") } + private enum ForwardedMouseDragButton: Equatable { + case left + case right + case other(Int) + } + + private func dragButton(for event: NSEvent) -> ForwardedMouseDragButton? { + switch event.type { + case .leftMouseDown, .leftMouseUp, .leftMouseDragged: + return .left + case .rightMouseDown, .rightMouseUp, .rightMouseDragged: + return .right + case .otherMouseDown, .otherMouseUp, .otherMouseDragged: + return .other(Int(event.buttonNumber)) + default: + return nil + } + } + + private func shouldTrackForwardedMouseDragStart(for eventType: NSEvent.EventType) -> Bool { + switch eventType { + case .leftMouseDown, .rightMouseDown, .otherMouseDown: + return true + default: + return false + } + } + + private func shouldTrackForwardedMouseDragEnd(for eventType: NSEvent.EventType) -> Bool { + switch eventType { + case .leftMouseUp, .rightMouseUp, .otherMouseUp: + return true + default: + return false + } + } + // MARK: Hit-testing — participation is routed by DragOverlayRoutingPolicy so // file-drop, bonsplit tab drags, and sidebar tab reorder drags cannot conflict. @@ -317,6 +365,7 @@ final class FileDropOverlayView: NSView { private func forwardEvent(_ event: NSEvent) { guard !isForwardingMouseEvent else { return } guard let window, let contentView = window.contentView else { return } + let eventButton = dragButton(for: event) isForwardingMouseEvent = true isHidden = true @@ -325,9 +374,33 @@ final class FileDropOverlayView: NSView { isForwardingMouseEvent = false } - let point = contentView.convert(event.locationInWindow, from: nil) - let target = contentView.hitTest(point) - guard let target, target !== self else { return } + let target: NSView? + if let eventButton, + forwardedMouseDragButton == eventButton, + let activeTarget = forwardedMouseDragTarget, + activeTarget.window != nil { + // Preserve normal AppKit mouse-delivery semantics: once a drag starts, + // keep routing dragged/up events to the original mouseDown target. + target = activeTarget + } else { + let point = contentView.convert(event.locationInWindow, from: nil) + target = contentView.hitTest(point) + } + + guard let target, target !== self else { + if shouldTrackForwardedMouseDragEnd(for: event.type), + let eventButton, + forwardedMouseDragButton == eventButton { + forwardedMouseDragTarget = nil + forwardedMouseDragButton = nil + } + return + } + + if shouldTrackForwardedMouseDragStart(for: event.type), let eventButton { + forwardedMouseDragTarget = target + forwardedMouseDragButton = eventButton + } switch event.type { case .leftMouseDown: target.mouseDown(with: event) @@ -342,6 +415,13 @@ final class FileDropOverlayView: NSView { case .scrollWheel: target.scrollWheel(with: event) default: break } + + if shouldTrackForwardedMouseDragEnd(for: event.type), + let eventButton, + forwardedMouseDragButton == eventButton { + forwardedMouseDragTarget = nil + forwardedMouseDragButton = nil + } } override func mouseDown(with event: NSEvent) { forwardEvent(event) } @@ -723,10 +803,9 @@ struct ContentView: View { @EnvironmentObject var sidebarState: SidebarState @EnvironmentObject var sidebarSelectionState: SidebarSelectionState @State private var sidebarWidth: CGFloat = 200 - @State private var sidebarMinX: CGFloat = 0 - @State private var isResizerHovering = false + @State private var hoveredResizerHandles: Set = [] @State private var isResizerDragging = false - private let sidebarHandleWidth: CGFloat = 6 + @State private var sidebarDragStartWidth: CGFloat? @State private var selectedTabIds: Set = [] @State private var mountedWorkspaceIds: [UUID] = [] @State private var lastSidebarSelectionIndex: Int? = nil @@ -742,6 +821,252 @@ struct ContentView: View { @State private var sidebarDraggedTabId: UUID? @State private var titlebarTextUpdateCoalescer = NotificationBurstCoalescer(delay: 1.0 / 30.0) @State private var titlebarThemeUpdateCoalescer = NotificationBurstCoalescer(delay: 1.0 / 30.0) + @State private var sidebarResizerCursorReleaseWorkItem: DispatchWorkItem? + @State private var sidebarResizerPointerMonitor: Any? + @State private var isResizerBandActive = false + @State private var sidebarResizerCursorStabilizer: DispatchSourceTimer? + + private static let fixedSidebarResizeCursor = NSCursor( + image: NSCursor.resizeLeftRight.image, + hotSpot: NSCursor.resizeLeftRight.hotSpot + ) + + private enum SidebarResizerHandle: Hashable { + case divider + } + + private var sidebarResizerHitWidthPerSide: CGFloat { + SidebarResizeInteraction.hitWidthPerSide + } + + private var maxSidebarWidth: CGFloat { + (NSApp.keyWindow?.screen?.frame.width ?? NSScreen.main?.frame.width ?? 1920) * 2 / 3 + } + + private func activateSidebarResizerCursor() { + sidebarResizerCursorReleaseWorkItem?.cancel() + sidebarResizerCursorReleaseWorkItem = nil + Self.fixedSidebarResizeCursor.set() + } + + private func releaseSidebarResizerCursorIfNeeded(force: Bool = false) { + let isLeftMouseButtonDown = CGEventSource.buttonState(.combinedSessionState, button: .left) + let shouldKeepCursor = !force + && (isResizerDragging || isResizerBandActive || !hoveredResizerHandles.isEmpty || isLeftMouseButtonDown) + guard !shouldKeepCursor else { return } + NSCursor.arrow.set() + } + + private func scheduleSidebarResizerCursorRelease(force: Bool = false, delay: TimeInterval = 0) { + sidebarResizerCursorReleaseWorkItem?.cancel() + let workItem = DispatchWorkItem { + sidebarResizerCursorReleaseWorkItem = nil + releaseSidebarResizerCursorIfNeeded(force: force) + } + sidebarResizerCursorReleaseWorkItem = workItem + if delay > 0 { + DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: workItem) + } else { + DispatchQueue.main.async(execute: workItem) + } + } + + private func dividerBandContains(pointInContent point: NSPoint, contentBounds: NSRect) -> Bool { + guard point.y >= contentBounds.minY, point.y <= contentBounds.maxY else { return false } + let minX = sidebarWidth - sidebarResizerHitWidthPerSide + let maxX = sidebarWidth + sidebarResizerHitWidthPerSide + return point.x >= minX && point.x <= maxX + } + + private func updateSidebarResizerBandState(using event: NSEvent? = nil) { + guard sidebarState.isVisible, + let window = observedWindow, + let contentView = window.contentView else { + isResizerBandActive = false + scheduleSidebarResizerCursorRelease(force: true) + return + } + + // Use live global pointer location instead of per-event coordinates. + // Overlapping tracking areas (notably WKWebView) can deliver stale/jittery + // event locations during cursor updates, which causes visible cursor flicker. + let pointInWindow = window.convertPoint(fromScreen: NSEvent.mouseLocation) + let pointInContent = contentView.convert(pointInWindow, from: nil) + let isInDividerBand = dividerBandContains(pointInContent: pointInContent, contentBounds: contentView.bounds) + isResizerBandActive = isInDividerBand + + if isInDividerBand || isResizerDragging { + activateSidebarResizerCursor() + startSidebarResizerCursorStabilizer() + // AppKit cursorUpdate handlers from overlapped portal/web views can run + // after our local monitor callback and temporarily reset the cursor. + // Re-assert on the next runloop turn to keep the resize cursor stable. + DispatchQueue.main.async { + Self.fixedSidebarResizeCursor.set() + } + } else { + stopSidebarResizerCursorStabilizer() + scheduleSidebarResizerCursorRelease() + } + } + + private func startSidebarResizerCursorStabilizer() { + guard sidebarResizerCursorStabilizer == nil else { return } + let timer = DispatchSource.makeTimerSource(queue: .main) + timer.schedule(deadline: .now(), repeating: .milliseconds(16), leeway: .milliseconds(2)) + timer.setEventHandler { + updateSidebarResizerBandState() + if isResizerBandActive || isResizerDragging { + Self.fixedSidebarResizeCursor.set() + } else { + stopSidebarResizerCursorStabilizer() + } + } + sidebarResizerCursorStabilizer = timer + timer.resume() + } + + private func stopSidebarResizerCursorStabilizer() { + sidebarResizerCursorStabilizer?.cancel() + sidebarResizerCursorStabilizer = nil + } + + private func installSidebarResizerPointerMonitorIfNeeded() { + guard sidebarResizerPointerMonitor == nil else { return } + observedWindow?.acceptsMouseMovedEvents = true + sidebarResizerPointerMonitor = NSEvent.addLocalMonitorForEvents( + matching: [ + .mouseMoved, + .mouseEntered, + .mouseExited, + .cursorUpdate, + .appKitDefined, + .systemDefined, + .leftMouseDown, + .leftMouseUp, + .leftMouseDragged, + ] + ) { event in + updateSidebarResizerBandState(using: event) + let shouldOverrideCursorEvent: Bool = { + switch event.type { + case .cursorUpdate, .mouseMoved, .mouseEntered, .mouseExited, .appKitDefined, .systemDefined: + return true + default: + return false + } + }() + if shouldOverrideCursorEvent, (isResizerBandActive || isResizerDragging) { + // Consume hover motion in divider band so overlapped views cannot + // continuously reassert their own cursor while we are resizing. + activateSidebarResizerCursor() + Self.fixedSidebarResizeCursor.set() + return nil + } + return event + } + updateSidebarResizerBandState() + } + + private func removeSidebarResizerPointerMonitor() { + if let monitor = sidebarResizerPointerMonitor { + NSEvent.removeMonitor(monitor) + sidebarResizerPointerMonitor = nil + } + isResizerBandActive = false + stopSidebarResizerCursorStabilizer() + scheduleSidebarResizerCursorRelease(force: true) + } + + private func sidebarResizerHandleOverlay( + _ handle: SidebarResizerHandle, + width: CGFloat, + accessibilityIdentifier: String? = nil + ) -> some View { + Color.clear + .frame(width: width) + .frame(maxHeight: .infinity) + .contentShape(Rectangle()) + .onHover { hovering in + if hovering { + hoveredResizerHandles.insert(handle) + activateSidebarResizerCursor() + } else { + hoveredResizerHandles.remove(handle) + let isLeftMouseButtonDown = CGEventSource.buttonState(.combinedSessionState, button: .left) + if isLeftMouseButtonDown { + // Keep resize cursor pinned through mouse-down so AppKit + // cursorUpdate events from overlapping views do not flash arrow. + activateSidebarResizerCursor() + } else { + // Give mouse-down + drag-start callbacks time to establish state + // before any cursor pop is attempted. + scheduleSidebarResizerCursorRelease(delay: 0.05) + } + } + updateSidebarResizerBandState() + } + .onDisappear { + hoveredResizerHandles.remove(handle) + isResizerDragging = false + sidebarDragStartWidth = nil + isResizerBandActive = false + scheduleSidebarResizerCursorRelease(force: true) + } + .gesture( + DragGesture(minimumDistance: 0, coordinateSpace: .global) + .onChanged { value in + if !isResizerDragging { + isResizerDragging = true + sidebarDragStartWidth = sidebarWidth + #if DEBUG + dlog("sidebar.resizeDragStart") + #endif + } + + activateSidebarResizerCursor() + let startWidth = sidebarDragStartWidth ?? sidebarWidth + let nextWidth = max(186, min(maxSidebarWidth, startWidth + value.translation.width)) + withTransaction(Transaction(animation: nil)) { + sidebarWidth = nextWidth + } + } + .onEnded { _ in + if isResizerDragging { + isResizerDragging = false + sidebarDragStartWidth = nil + } + activateSidebarResizerCursor() + scheduleSidebarResizerCursorRelease() + } + ) + .modifier(SidebarResizerAccessibilityModifier(accessibilityIdentifier: accessibilityIdentifier)) + } + + private var sidebarResizerOverlay: some View { + GeometryReader { proxy in + let totalWidth = max(0, proxy.size.width) + let dividerX = min(max(sidebarWidth, 0), totalWidth) + let leadingWidth = max(0, dividerX - sidebarResizerHitWidthPerSide) + + HStack(spacing: 0) { + Color.clear + .frame(width: leadingWidth) + .allowsHitTesting(false) + + sidebarResizerHandleOverlay( + .divider, + width: sidebarResizerHitWidthPerSide * 2, + accessibilityIdentifier: "SidebarResizer" + ) + + Color.clear + .frame(maxWidth: .infinity) + .allowsHitTesting(false) + } + .frame(width: totalWidth, height: proxy.size.height, alignment: .leading) + } + } private var sidebarView: some View { VerticalTabsSidebar( @@ -751,64 +1076,6 @@ struct ContentView: View { lastSidebarSelectionIndex: $lastSidebarSelectionIndex ) .frame(width: sidebarWidth) - .background(GeometryReader { proxy in - Color.clear - .preference(key: SidebarFramePreferenceKey.self, value: proxy.frame(in: .global)) - }) - .overlay(alignment: .trailing) { - Color.clear - .frame(width: sidebarHandleWidth) - .contentShape(Rectangle()) - .accessibilityIdentifier("SidebarResizer") - .onHover { hovering in - if hovering { - if !isResizerHovering { - NSCursor.resizeLeftRight.push() - isResizerHovering = true - } - } else if isResizerHovering { - if !isResizerDragging { - NSCursor.pop() - isResizerHovering = false - } - } - } - .onDisappear { - if isResizerHovering || isResizerDragging { - NSCursor.pop() - isResizerHovering = false - isResizerDragging = false - } - } - .gesture( - DragGesture(minimumDistance: 0, coordinateSpace: .global) - .onChanged { value in - if !isResizerDragging { - isResizerDragging = true - #if DEBUG - dlog("sidebar.resizeDragStart") - #endif - if !isResizerHovering { - NSCursor.resizeLeftRight.push() - isResizerHovering = true - } - } - let maxSidebarWidth = (NSApp.keyWindow?.screen?.frame.width ?? NSScreen.main?.frame.width ?? 1920) * 2 / 3 - let nextWidth = max(186, min(maxSidebarWidth, value.location.x - sidebarMinX + sidebarHandleWidth / 2)) - withTransaction(Transaction(animation: nil)) { - sidebarWidth = nextWidth - } - } - .onEnded { _ in - if isResizerDragging { - isResizerDragging = false - if !isResizerHovering { - NSCursor.pop() - } - } - } - ) - } } /// Space at top of content area for the titlebar. This must be at least the actual titlebar @@ -998,10 +1265,11 @@ struct ContentView: View { } private var contentAndSidebarLayout: AnyView { + let layout: AnyView if sidebarBlendMode == SidebarBlendModeOption.withinWindow.rawValue { // Overlay mode: terminal extends full width, sidebar on top // This allows withinWindow blur to see the terminal content - return AnyView( + layout = AnyView( ZStack(alignment: .leading) { terminalContentWithSidebarDropOverlay .padding(.leading, sidebarState.isVisible ? sidebarWidth : 0) @@ -1010,16 +1278,26 @@ struct ContentView: View { } } ) + } else { + // Standard HStack mode for behindWindow blur + layout = AnyView( + HStack(spacing: 0) { + if sidebarState.isVisible { + sidebarView + } + terminalContentWithSidebarDropOverlay + } + ) } - // Standard HStack mode for behindWindow blur return AnyView( - HStack(spacing: 0) { - if sidebarState.isVisible { - sidebarView + layout + .overlay(alignment: .leading) { + if sidebarState.isVisible { + sidebarResizerOverlay + .zIndex(1000) + } } - terminalContentWithSidebarDropOverlay - } ) } @@ -1041,6 +1319,7 @@ struct ContentView: View { tabManager.applyWindowBackgroundForSelectedTab() reconcileMountedWorkspaceIds() previousSelectedWorkspaceId = tabManager.selectedTabId + installSidebarResizerPointerMonitorIfNeeded() if selectedTabIds.isEmpty, let selectedId = tabManager.selectedTabId { selectedTabIds = [selectedId] lastSidebarSelectionIndex = tabManager.tabs.firstIndex { $0.id == selectedId } @@ -1155,10 +1434,6 @@ struct ContentView: View { #endif }) - view = AnyView(view.onPreferenceChange(SidebarFramePreferenceKey.self) { frame in - sidebarMinX = frame.minX - }) - view = AnyView(view.onChange(of: bgGlassTintHex) { _ in updateWindowGlassTint() }) @@ -1183,8 +1458,20 @@ struct ContentView: View { AppDelegate.shared?.fullscreenControlsViewModel = nil }) + view = AnyView(view.onChange(of: sidebarWidth) { _ in + updateSidebarResizerBandState() + }) + + view = AnyView(view.onChange(of: sidebarState.isVisible) { _ in + updateSidebarResizerBandState() + }) + view = AnyView(view.ignoresSafeArea()) + view = AnyView(view.onDisappear { + removeSidebarResizerPointerMonitor() + }) + view = AnyView(view.background(WindowAccessor { [sidebarBlendMode, bgGlassEnabled, bgGlassTintHex, bgGlassTintOpacity] window in window.identifier = NSUserInterfaceItemIdentifier(windowIdentifier) window.titlebarAppearsTransparent = true @@ -1198,6 +1485,8 @@ struct ContentView: View { DispatchQueue.main.async { observedWindow = window isFullScreen = window.styleMask.contains(.fullScreen) + installSidebarResizerPointerMonitorIfNeeded() + updateSidebarResizerBandState() } } @@ -1414,6 +1703,19 @@ struct ContentView: View { #endif } +private struct SidebarResizerAccessibilityModifier: ViewModifier { + let accessibilityIdentifier: String? + + @ViewBuilder + func body(content: Content) -> some View { + if let accessibilityIdentifier { + content.accessibilityIdentifier(accessibilityIdentifier) + } else { + content + } + } +} + struct VerticalTabsSidebar: View { @ObservedObject var updateViewModel: UpdateViewModel @EnvironmentObject var tabManager: TabManager @@ -2048,14 +2350,6 @@ private struct SidebarTopBlurEffect: NSViewRepresentable { func updateNSView(_ nsView: NSVisualEffectView, context: Context) {} } -private struct SidebarFramePreferenceKey: PreferenceKey { - static var defaultValue: CGRect = .zero - - static func reduce(value: inout CGRect, nextValue: () -> CGRect) { - value = nextValue() - } -} - private struct SidebarScrollViewResolver: NSViewRepresentable { let onResolve: (NSScrollView?) -> Void diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index bda555bf..0578ef50 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -2633,6 +2633,27 @@ struct WebViewRepresentable: NSViewRepresentable { super.setFrameSize(newSize) onGeometryChanged?() } + + override func hitTest(_ point: NSPoint) -> NSView? { + if shouldPassThroughToSidebarResizer(at: point) { + return nil + } + return super.hitTest(point) + } + + private func shouldPassThroughToSidebarResizer(at point: NSPoint) -> Bool { + // Pass through a narrow leading-edge band so the shared sidebar divider + // handle can receive hover/click even when WKWebView is attached here. + // Keeping this deterministic avoids flicker from dynamic left-edge scans. + guard point.x >= 0, point.x <= SidebarResizeInteraction.hitWidthPerSide else { + return false + } + guard let window, let contentView = window.contentView else { + return false + } + let hostRectInContent = contentView.convert(bounds, from: self) + return hostRectInContent.minX > 1 + } } #if DEBUG diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index 6dffb098..a4d37f7c 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -21,11 +21,16 @@ private func portalDebugFrame(_ rect: NSRect) -> String { final class WindowTerminalHostView: NSView { override var isOpaque: Bool { false } + private var cachedSidebarDividerX: CGFloat? #if DEBUG private var lastDragRouteSignature: String? #endif override func hitTest(_ point: NSPoint) -> NSView? { + if shouldPassThroughToSidebarResizer(at: point) { + return nil + } + if shouldPassThroughToSplitDivider(at: point) { return nil } @@ -60,6 +65,32 @@ final class WindowTerminalHostView: NSView { return hitView === self ? nil : hitView } + private func shouldPassThroughToSidebarResizer(at point: NSPoint) -> Bool { + // The sidebar resizer handle is implemented in SwiftUI. When terminals + // are portal-hosted, this AppKit host can otherwise sit above the handle + // and steal hover/mouse events. + let visibleHostedViews = subviews.compactMap { $0 as? GhosttySurfaceScrollView } + .filter { !$0.isHidden && $0.window != nil && $0.frame.width > 1 && $0.frame.height > 1 } + + // Ignore transient 0-origin hosts while layouts churn (e.g. workspace + // creation/switching). They can temporarily report minX=0 and would + // otherwise clear divider pass-through, causing hover flicker. + let dividerCandidates = visibleHostedViews + .map(\.frame.minX) + .filter { $0 > 1 } + if let leftMostEdge = dividerCandidates.min() { + cachedSidebarDividerX = leftMostEdge + } + + guard let dividerX = cachedSidebarDividerX else { + return false + } + + let regionMinX = dividerX - SidebarResizeInteraction.hitWidthPerSide + let regionMaxX = dividerX + SidebarResizeInteraction.hitWidthPerSide + return point.x >= regionMinX && point.x <= regionMaxX + } + private func shouldPassThroughToSplitDivider(at point: NSPoint) -> Bool { guard let window else { return false } let windowPoint = convert(point, to: nil) diff --git a/vendor/bonsplit b/vendor/bonsplit index 198736e4..4ceff319 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit 198736e4e2db10931c263eb221b2592fc86e80e7 +Subproject commit 4ceff31931f8b873e450c81f60148be3f8ce9cdb From 7cb1abca374ad881411c053f4942fc9930e47e8e Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:20:58 -0800 Subject: [PATCH 018/214] Use smaller separator dot for branch directory rows --- Sources/ContentView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 01b4c18d..9c8c7e8c 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -2350,7 +2350,7 @@ private struct TabItemView: View { } VStack(alignment: .leading, spacing: 1) { ForEach(Array(verticalBranchDirectoryLines.enumerated()), id: \.offset) { _, line in - HStack(spacing: 4) { + HStack(spacing: 3) { if let branch = line.branch { Text(branch) .font(.system(size: 10, design: .monospaced)) @@ -2360,7 +2360,7 @@ private struct TabItemView: View { } if line.branch != nil, line.directory != nil { Image(systemName: "circle.fill") - .font(.system(size: 4)) + .font(.system(size: 3)) .foregroundColor(isActive ? .white.opacity(0.6) : .secondary) } if let directory = line.directory { From 868c2c9d1144f65de9d94e65872ec176bc1d1da9 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:26:47 -0800 Subject: [PATCH 019/214] Tighten spacing around branch separator dot --- Sources/ContentView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 9c8c7e8c..00d34d8b 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -2362,6 +2362,7 @@ private struct TabItemView: View { Image(systemName: "circle.fill") .font(.system(size: 3)) .foregroundColor(isActive ? .white.opacity(0.6) : .secondary) + .padding(.horizontal, 1) } if let directory = line.directory { Text(directory) From 68cf29cd2dd5f5229700a3977e60cbcd0c9cae40 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:30:59 -0800 Subject: [PATCH 020/214] Deduplicate high-frequency socket metadata updates --- Sources/TerminalController.swift | 91 +++++++++++++++++-- Sources/Workspace.swift | 7 +- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 75 +++++++++++++++ 3 files changed, 161 insertions(+), 12 deletions(-) diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 3193df82..4484656e 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -68,6 +68,41 @@ class TerminalController { private init() {} + nonisolated static func shouldReplaceStatusEntry( + current: SidebarStatusEntry?, + key: String, + value: String, + icon: String?, + color: String? + ) -> Bool { + guard let current else { return true } + return current.key != key || current.value != value || current.icon != icon || current.color != color + } + + nonisolated static func shouldReplaceProgress( + current: SidebarProgressState?, + value: Double, + label: String? + ) -> Bool { + guard let current else { return true } + return current.value != value || current.label != label + } + + nonisolated static func shouldReplaceGitBranch( + current: SidebarGitBranchState?, + branch: String, + isDirty: Bool + ) -> Bool { + guard let current else { return true } + return current.branch != branch || current.isDirty != isDirty + } + + nonisolated static func shouldReplacePorts(current: [Int]?, next: [Int]) -> Bool { + let currentSorted = Array(Set(current ?? [])).sorted() + let nextSorted = Array(Set(next)).sorted() + return currentSorted != nextSorted + } + /// Update which window's TabManager receives socket commands. /// This is used when the user switches between multiple terminal windows. func setActiveTabManager(_ tabManager: TabManager?) { @@ -194,7 +229,14 @@ class TerminalController { guard let workspace = tabManager.tabs.first(where: { $0.id == workspaceId }) else { return } let validSurfaceIds = Set(workspace.panels.keys) guard validSurfaceIds.contains(panelId) else { return } - workspace.surfaceListeningPorts[panelId] = ports.isEmpty ? nil : ports + let nextPorts = Array(Set(ports)).sorted() + let currentPorts = workspace.surfaceListeningPorts[panelId] ?? [] + guard currentPorts != nextPorts else { return } + if nextPorts.isEmpty { + workspace.surfaceListeningPorts.removeValue(forKey: panelId) + } else { + workspace.surfaceListeningPorts[panelId] = nextPorts + } workspace.recomputeListeningPorts() } } @@ -10421,12 +10463,22 @@ class TerminalController { result = parsed.options["tab"] != nil ? "ERROR: Tab not found" : "ERROR: No tab selected" return } + guard Self.shouldReplaceStatusEntry( + current: tab.statusEntries[key], + key: key, + value: value, + icon: icon, + color: color + ) else { + return + } tab.statusEntries[key] = SidebarStatusEntry( key: key, value: value, icon: icon, color: color, - timestamp: Date()) + timestamp: Date() + ) } return result } @@ -10569,6 +10621,9 @@ class TerminalController { result = parsed.options["tab"] != nil ? "ERROR: Tab not found" : "ERROR: No tab selected" return } + guard Self.shouldReplaceProgress(current: tab.progress, value: clamped, label: label) else { + return + } tab.progress = SidebarProgressState(value: clamped, label: label) } return result @@ -10581,7 +10636,9 @@ class TerminalController { result = "ERROR: Tab not found" return } - tab.progress = nil + if tab.progress != nil { + tab.progress = nil + } } return result } @@ -10599,6 +10656,9 @@ class TerminalController { result = parsed.options["tab"] != nil ? "ERROR: Tab not found" : "ERROR: No tab selected" return } + guard Self.shouldReplaceGitBranch(current: tab.gitBranch, branch: branch, isDirty: isDirty) else { + return + } tab.gitBranch = SidebarGitBranchState(branch: branch, isDirty: isDirty) } return result @@ -10611,7 +10671,9 @@ class TerminalController { result = "ERROR: Tab not found" return } - tab.gitBranch = nil + if tab.gitBranch != nil { + tab.gitBranch = nil + } } return result } @@ -10628,6 +10690,7 @@ class TerminalController { } ports.append(port) } + let normalizedPorts = Array(Set(ports)).sorted() var result = "OK" DispatchQueue.main.sync { @@ -10664,7 +10727,11 @@ class TerminalController { return } - tab.surfaceListeningPorts[surfaceId] = ports + guard Self.shouldReplacePorts(current: tab.surfaceListeningPorts[surfaceId], next: normalizedPorts) else { + return + } + + tab.surfaceListeningPorts[surfaceId] = normalizedPorts tab.recomputeListeningPorts() } return result @@ -10744,11 +10811,15 @@ class TerminalController { result = "ERROR: Panel not found '\(surfaceId.uuidString)'" return } - tab.surfaceListeningPorts.removeValue(forKey: surfaceId) + if tab.surfaceListeningPorts.removeValue(forKey: surfaceId) != nil { + tab.recomputeListeningPorts() + } } else { - tab.surfaceListeningPorts.removeAll() + if !tab.surfaceListeningPorts.isEmpty { + tab.surfaceListeningPorts.removeAll() + tab.recomputeListeningPorts() + } } - tab.recomputeListeningPorts() } return result } @@ -10792,6 +10863,7 @@ class TerminalController { return } + guard tab.surfaceTTYNames[surfaceId] != ttyName else { return } tab.surfaceTTYNames[surfaceId] = ttyName PortScanner.shared.registerTTY(workspaceId: tab.id, panelId: surfaceId, ttyName: ttyName) } @@ -10799,15 +10871,14 @@ class TerminalController { } private func portsKick(_ args: String) -> String { + let parsed = parseOptions(args) var result = "OK" DispatchQueue.main.sync { guard let tab = resolveTabForReport(args) else { - let parsed = parseOptions(args) result = parsed.options["tab"] != nil ? "ERROR: Tab not found" : "ERROR: No tab selected" return } - let parsed = parseOptions(args) let panelArg = parsed.options["panel"] ?? parsed.options["surface"] let surfaceId: UUID if let panelArg { diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 54b8b203..092ed8c7 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -559,7 +559,7 @@ final class Workspace: Identifiable, ObservableObject { panelDirectories[panelId] = trimmed } // Update current directory if this is the focused panel - if panelId == focusedPanelId { + if panelId == focusedPanelId, currentDirectory != trimmed { currentDirectory = trimmed } } @@ -616,7 +616,10 @@ final class Workspace: Identifiable, ObservableObject { func recomputeListeningPorts() { let unique = Set(surfaceListeningPorts.values.flatMap { $0 }) - listeningPorts = unique.sorted() + let next = unique.sorted() + if listeningPorts != next { + listeningPorts = next + } } // MARK: - Panel Operations diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 548a979c..977cfa5a 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -3008,3 +3008,78 @@ final class BrowserHostWhitelistTests: XCTestCase { XCTAssertTrue(BrowserLinkOpenSettings.hostMatchesWhitelist("xn--bcher-kva.example", defaults: defaults)) } } + +final class TerminalControllerSidebarDedupeTests: XCTestCase { + func testShouldReplaceStatusEntryReturnsFalseForUnchangedPayload() { + let current = SidebarStatusEntry( + key: "agent", + value: "idle", + icon: "bolt", + color: "#ffffff", + timestamp: Date(timeIntervalSince1970: 123) + ) + XCTAssertFalse( + TerminalController.shouldReplaceStatusEntry( + current: current, + key: "agent", + value: "idle", + icon: "bolt", + color: "#ffffff" + ) + ) + } + + func testShouldReplaceStatusEntryReturnsTrueWhenValueChanges() { + let current = SidebarStatusEntry( + key: "agent", + value: "idle", + icon: "bolt", + color: "#ffffff", + timestamp: Date(timeIntervalSince1970: 123) + ) + XCTAssertTrue( + TerminalController.shouldReplaceStatusEntry( + current: current, + key: "agent", + value: "running", + icon: "bolt", + color: "#ffffff" + ) + ) + } + + func testShouldReplaceProgressReturnsFalseForUnchangedPayload() { + XCTAssertFalse( + TerminalController.shouldReplaceProgress( + current: SidebarProgressState(value: 0.42, label: "indexing"), + value: 0.42, + label: "indexing" + ) + ) + } + + func testShouldReplaceGitBranchReturnsFalseForUnchangedPayload() { + XCTAssertFalse( + TerminalController.shouldReplaceGitBranch( + current: SidebarGitBranchState(branch: "main", isDirty: true), + branch: "main", + isDirty: true + ) + ) + } + + func testShouldReplacePortsIgnoresOrderAndDuplicates() { + XCTAssertFalse( + TerminalController.shouldReplacePorts( + current: [9229, 3000], + next: [3000, 9229, 3000] + ) + ) + XCTAssertTrue( + TerminalController.shouldReplacePorts( + current: [9229, 3000], + next: [3000] + ) + ) + } +} From 167431b786df857657b991f1c2faf1fded77d5e2 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:58:47 -0800 Subject: [PATCH 021/214] Avoid main-thread hops for explicit socket scope --- Sources/PortScanner.swift | 1 + Sources/TerminalController.swift | 33 +++++++++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 32 ++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/Sources/PortScanner.swift b/Sources/PortScanner.swift index fdaa7b39..9ed42027 100644 --- a/Sources/PortScanner.swift +++ b/Sources/PortScanner.swift @@ -49,6 +49,7 @@ final class PortScanner: @unchecked Sendable { func registerTTY(workspaceId: UUID, panelId: UUID, ttyName: String) { queue.async { [self] in let key = PanelKey(workspaceId: workspaceId, panelId: panelId) + guard ttyNames[key] != ttyName else { return } ttyNames[key] = ttyName } } diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 4484656e..0d87e920 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -103,6 +103,20 @@ class TerminalController { return currentSorted != nextSorted } + nonisolated static func explicitSocketScope( + options: [String: String] + ) -> (workspaceId: UUID, panelId: UUID)? { + guard let tabRaw = options["tab"]?.trimmingCharacters(in: .whitespacesAndNewlines), + !tabRaw.isEmpty, + let panelRaw = (options["panel"] ?? options["surface"])?.trimmingCharacters(in: .whitespacesAndNewlines), + !panelRaw.isEmpty, + let workspaceId = UUID(uuidString: tabRaw), + let panelId = UUID(uuidString: panelRaw) else { + return nil + } + return (workspaceId, panelId) + } + /// Update which window's TabManager receives socket commands. /// This is used when the user switches between multiple terminal windows. func setActiveTabManager(_ tabManager: TabManager?) { @@ -10830,6 +10844,17 @@ class TerminalController { return "ERROR: Missing tty name — usage: report_tty [--tab=X] [--panel=Y]" } + // Shell integration always provides explicit UUID handles. + // Handle that common path off-main to avoid sync-hopping on every report. + if let scope = Self.explicitSocketScope(options: parsed.options) { + PortScanner.shared.registerTTY( + workspaceId: scope.workspaceId, + panelId: scope.panelId, + ttyName: ttyName + ) + return "OK" + } + var result = "OK" DispatchQueue.main.sync { guard let tab = resolveTabForReport(args) else { @@ -10872,6 +10897,14 @@ class TerminalController { private func portsKick(_ args: String) -> String { let parsed = parseOptions(args) + + // Shell integration always provides explicit UUID handles. + // Handle that common path off-main to keep prompt hooks from blocking UI work. + if let scope = Self.explicitSocketScope(options: parsed.options) { + PortScanner.shared.kick(workspaceId: scope.workspaceId, panelId: scope.panelId) + return "OK" + } + var result = "OK" DispatchQueue.main.sync { guard let tab = resolveTabForReport(args) else { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 977cfa5a..babd4d8d 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -3082,4 +3082,36 @@ final class TerminalControllerSidebarDedupeTests: XCTestCase { ) ) } + + func testExplicitSocketScopeParsesValidUUIDTabAndPanel() { + let workspaceId = UUID() + let panelId = UUID() + let scope = TerminalController.explicitSocketScope( + options: [ + "tab": workspaceId.uuidString, + "panel": panelId.uuidString + ] + ) + XCTAssertEqual(scope?.workspaceId, workspaceId) + XCTAssertEqual(scope?.panelId, panelId) + } + + func testExplicitSocketScopeAcceptsSurfaceAlias() { + let workspaceId = UUID() + let panelId = UUID() + let scope = TerminalController.explicitSocketScope( + options: [ + "tab": workspaceId.uuidString, + "surface": panelId.uuidString + ] + ) + XCTAssertEqual(scope?.workspaceId, workspaceId) + XCTAssertEqual(scope?.panelId, panelId) + } + + func testExplicitSocketScopeRejectsMissingOrInvalidValues() { + XCTAssertNil(TerminalController.explicitSocketScope(options: [:])) + XCTAssertNil(TerminalController.explicitSocketScope(options: ["tab": "workspace:1", "panel": UUID().uuidString])) + XCTAssertNil(TerminalController.explicitSocketScope(options: ["tab": UUID().uuidString, "panel": "surface:1"])) + } } From 39b110d3b34bf9de71d54e4a4258463aa2e2805b Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 01:01:56 -0800 Subject: [PATCH 022/214] Move report_pwd fast path off main-thread sync --- CLAUDE.md | 10 ++++ Sources/TerminalController.swift | 59 ++++++++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 21 +++++++ 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index beb24aa0..4d57c596 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -95,6 +95,16 @@ tail -f "$(cat /tmp/cmux-last-debug-log-path 2>/dev/null || echo /tmp/cmux-debug - Do not add an app-level display link or manual `ghostty_surface_draw` loop; rely on Ghostty wakeups/renderer to avoid typing lag. - **Submodule safety:** When modifying a submodule (ghostty, vendor/bonsplit, etc.), always push the submodule commit to its remote `main` branch BEFORE committing the updated pointer in the parent repo. Never commit on a detached HEAD or temporary branch — the commit will be orphaned and lost. Verify with: `cd && git merge-base --is-ancestor HEAD origin/main`. +## Socket command threading policy + +- Do not use `DispatchQueue.main.sync` for high-frequency socket telemetry commands (`report_*`, `ports_kick`, status/progress/log metadata updates). +- For telemetry hot paths: + - Parse and validate arguments off-main. + - Dedupe/coalesce off-main first. + - Schedule minimal UI/model mutation with `DispatchQueue.main.async` only when needed. +- Commands that directly manipulate AppKit/Ghostty UI state (focus/select/open/close/send key/input, list/current queries requiring exact synchronous snapshot) are allowed to run on main actor. +- If adding a new socket command, default to off-main handling; require an explicit reason in code comments when main-thread execution is necessary. + ## E2E mac UI tests Run UI tests on the UTM macOS VM (never on the host machine). Always run e2e UI tests via `ssh cmux-vm`: diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 0d87e920..5d524703 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -103,6 +103,33 @@ class TerminalController { return currentSorted != nextSorted } + private struct SocketSurfaceKey: Hashable { + let workspaceId: UUID + let panelId: UUID + } + + private final class SocketFastPathState: @unchecked Sendable { + private let queue = DispatchQueue(label: "com.cmux.socket-fast-path") + private var lastReportedDirectories: [SocketSurfaceKey: String] = [:] + private let maxTrackedDirectories = 4096 + + func shouldPublishDirectory(workspaceId: UUID, panelId: UUID, directory: String) -> Bool { + let key = SocketSurfaceKey(workspaceId: workspaceId, panelId: panelId) + return queue.sync { + if lastReportedDirectories[key] == directory { + return false + } + if lastReportedDirectories.count >= maxTrackedDirectories { + lastReportedDirectories.removeAll(keepingCapacity: true) + } + lastReportedDirectories[key] = directory + return true + } + } + } + + private static let socketFastPathState = SocketFastPathState() + nonisolated static func explicitSocketScope( options: [String: String] ) -> (workspaceId: UUID, panelId: UUID)? { @@ -117,6 +144,15 @@ class TerminalController { return (workspaceId, panelId) } + nonisolated static func normalizeReportedDirectory(_ directory: String) -> String { + let trimmed = directory.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return directory } + if trimmed.hasPrefix("file://"), let url = URL(string: trimmed), !url.path.isEmpty { + return url.path + } + return trimmed + } + /// Update which window's TabManager receives socket commands. /// This is used when the user switches between multiple terminal windows. func setActiveTabManager(_ tabManager: TabManager?) { @@ -10752,13 +10788,32 @@ class TerminalController { } private func reportPwd(_ args: String) -> String { - guard let tabManager else { return "ERROR: TabManager not available" } let parsed = parseOptions(args) guard !parsed.positional.isEmpty else { return "ERROR: Missing path — usage: report_pwd [--tab=X] [--panel=Y]" } - let directory = parsed.positional.joined(separator: " ") + let directory = Self.normalizeReportedDirectory(parsed.positional.joined(separator: " ")) + + // Shell integration provides explicit UUID handles for cwd updates. + // Keep this hot path off-main and drop no-op reports before scheduling UI work. + if let scope = Self.explicitSocketScope(options: parsed.options) { + guard Self.socketFastPathState.shouldPublishDirectory( + workspaceId: scope.workspaceId, + panelId: scope.panelId, + directory: directory + ) else { + return "OK" + } + DispatchQueue.main.async { + guard let tabManager = AppDelegate.shared?.tabManagerFor(tabId: scope.workspaceId) else { return } + tabManager.updateSurfaceDirectory(tabId: scope.workspaceId, surfaceId: scope.panelId, directory: directory) + } + return "OK" + } + + guard let tabManager else { return "ERROR: TabManager not available" } + var result = "OK" DispatchQueue.main.sync { guard let tab = resolveTabForReport(args) else { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index babd4d8d..6f810a8e 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -3114,4 +3114,25 @@ final class TerminalControllerSidebarDedupeTests: XCTestCase { XCTAssertNil(TerminalController.explicitSocketScope(options: ["tab": "workspace:1", "panel": UUID().uuidString])) XCTAssertNil(TerminalController.explicitSocketScope(options: ["tab": UUID().uuidString, "panel": "surface:1"])) } + + func testNormalizeReportedDirectoryTrimsWhitespace() { + XCTAssertEqual( + TerminalController.normalizeReportedDirectory(" /Users/cmux/project "), + "/Users/cmux/project" + ) + } + + func testNormalizeReportedDirectoryResolvesFileURL() { + XCTAssertEqual( + TerminalController.normalizeReportedDirectory("file:///Users/cmux/project"), + "/Users/cmux/project" + ) + } + + func testNormalizeReportedDirectoryLeavesInvalidURLTrimmed() { + XCTAssertEqual( + TerminalController.normalizeReportedDirectory(" file://bad host "), + "file://bad host" + ) + } } From 9a8005a57f87fa7b99e3b1f4439ae061079be8c9 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 01:14:12 -0800 Subject: [PATCH 023/214] Update Discord invite links to new permanent URL (#238) Replace old discord.com/invite/QRxkhZgY with discord.gg/xsgFEVrWCZ across README, community page, and nav footer. --- README.md | 2 +- web/app/community/page.tsx | 2 +- web/app/components/nav-links.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 14cecfab..31578c73 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,7 @@ cmux NIGHTLY is a separate app with its own bundle ID, so it runs alongside the ## Community -- [Discord](https://discord.com/invite/QRxkhZgY) +- [Discord](https://discord.gg/xsgFEVrWCZ) - [GitHub](https://github.com/manaflow-ai/cmux) - [X / Twitter](https://twitter.com/manaflowai) - [YouTube](https://www.youtube.com/channel/UCAa89_j-TWkrXfk9A3CbASw) diff --git a/web/app/community/page.tsx b/web/app/community/page.tsx index a46fd614..b344ace8 100644 --- a/web/app/community/page.tsx +++ b/web/app/community/page.tsx @@ -54,7 +54,7 @@ export default function CommunityPage() {
Twitter - Discord + Discord Privacy Terms EULA From 4cbdd999d8ea3976c5401dcd068dc073c3378296 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 02:21:27 -0800 Subject: [PATCH 024/214] Socket CLI: prevent focus stealing + add rename-tab and focus regressions --- CLAUDE.md | 6 + CLI/cmux.swift | 75 +++- Sources/AppDelegate.swift | 23 +- Sources/TabManager.swift | 31 +- Sources/TerminalController.swift | 332 +++++++++++------- Sources/Workspace.swift | 36 +- docs/socket-focus-steal-audit.todo.md | 76 ++++ ...i_non_focus_commands_preserve_workspace.py | 91 +++++ tests_v2/test_rename_tab_cli_parity.py | 129 +++++++ .../test_rename_window_workspace_parity.py | 17 +- 10 files changed, 665 insertions(+), 151 deletions(-) create mode 100644 docs/socket-focus-steal-audit.todo.md create mode 100644 tests_v2/test_cli_non_focus_commands_preserve_workspace.py create mode 100644 tests_v2/test_rename_tab_cli_parity.py diff --git a/CLAUDE.md b/CLAUDE.md index 4d57c596..bc3d5bba 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -105,6 +105,12 @@ tail -f "$(cat /tmp/cmux-last-debug-log-path 2>/dev/null || echo /tmp/cmux-debug - Commands that directly manipulate AppKit/Ghostty UI state (focus/select/open/close/send key/input, list/current queries requiring exact synchronous snapshot) are allowed to run on main actor. - If adding a new socket command, default to off-main handling; require an explicit reason in code comments when main-thread execution is necessary. +## Socket focus policy + +- Socket/CLI commands must not steal macOS app focus (no app activation/window raising side effects). +- Only explicit focus-intent commands may mutate in-app focus/selection (`window.focus`, `workspace.select/next/previous/last`, `surface.focus`, `pane.focus/last`, browser focus commands, and v1 focus equivalents). +- All non-focus commands should preserve current user focus context while still applying data/model changes. + ## E2E mac UI tests Run UI tests on the UTM macOS VM (never on the host machine). Always run e2e UI tests via `ssh cmux-vm`: diff --git a/CLI/cmux.swift b/CLI/cmux.swift index 88cab6e8..32e62915 100644 --- a/CLI/cmux.swift +++ b/CLI/cmux.swift @@ -589,6 +589,9 @@ struct CMUXCLI { case "tab-action": try runTabAction(commandArgs: commandArgs, client: client, jsonOutput: jsonOutput, idFormat: idFormat, windowOverride: windowId) + case "rename-tab": + try runRenameTab(commandArgs: commandArgs, client: client, jsonOutput: jsonOutput, idFormat: idFormat, windowOverride: windowId) + case "list-workspaces": let payload = try client.sendV2(method: "workspace.list") if jsonOutput { @@ -1727,6 +1730,55 @@ struct CMUXCLI { printV2Payload(payload, jsonOutput: jsonOutput, idFormat: idFormat, fallbackText: summaryParts.joined(separator: " ")) } + private func runRenameTab( + commandArgs: [String], + client: SocketClient, + jsonOutput: Bool, + idFormat: CLIIDFormat, + windowOverride: String? + ) throws { + let (workspaceOpt, rem0) = parseOption(commandArgs, name: "--workspace") + let (tabOpt, rem1) = parseOption(rem0, name: "--tab") + let (surfaceOpt, rem2) = parseOption(rem1, name: "--surface") + let (titleOpt, rem3) = parseOption(rem2, name: "--title") + + if rem3.contains("--action") { + throw CLIError(message: "rename-tab does not accept --action (it always performs rename)") + } + if let unknown = rem3.first(where: { $0.hasPrefix("--") && $0 != "--" }) { + throw CLIError(message: "rename-tab: unknown flag '\(unknown)'") + } + + let inferredTitle = rem3 + .dropFirst(rem3.first == "--" ? 1 : 0) + .joined(separator: " ") + .trimmingCharacters(in: .whitespacesAndNewlines) + let title = (titleOpt ?? (inferredTitle.isEmpty ? nil : inferredTitle))? + .trimmingCharacters(in: .whitespacesAndNewlines) + + guard let title, !title.isEmpty else { + throw CLIError(message: "rename-tab requires a title") + } + + var forwarded: [String] = ["--action", "rename", "--title", title] + if let workspaceOpt { + forwarded += ["--workspace", workspaceOpt] + } + if let tabOpt { + forwarded += ["--tab", tabOpt] + } else if let surfaceOpt { + forwarded += ["--surface", surfaceOpt] + } + + try runTabAction( + commandArgs: forwarded, + client: client, + jsonOutput: jsonOutput, + idFormat: idFormat, + windowOverride: windowOverride + ) + } + private func runBrowserCommand( commandArgs: [String], client: SocketClient, @@ -3046,6 +3098,26 @@ struct CMUXCLI { cmux tab-action --action close-right cmux tab-action --tab tab:2 --action rename --title "build logs" """ + case "rename-tab": + return """ + Usage: cmux rename-tab [--workspace ] [--tab ] [--surface ] [--] + + Rename a tab (surface). Defaults to the focused tab, using: + 1) explicit --tab/--surface + 2) $CMUX_TAB_ID / $CMUX_SURFACE_ID + 3) focused tab in the resolved workspace context + + Flags: + --workspace <id|ref> Workspace context (default: current/$CMUX_WORKSPACE_ID) + --tab <id|ref> Target tab (accepts tab:<n> or surface:<n>) + --surface <id|ref> Alias for --tab + --title <text> New title (or pass trailing title) + + Example: + cmux rename-tab "build logs" + cmux rename-tab --tab tab:3 "staging server" + cmux rename-tab --workspace workspace:2 --surface surface:5 --title "agent run" + """ case "new-workspace": return """ Usage: cmux new-workspace @@ -4320,6 +4392,7 @@ struct CMUXCLI { move-surface --surface <id|ref|index> [--pane <id|ref|index>] [--workspace <id|ref|index>] [--window <id|ref|index>] [--before <id|ref|index>] [--after <id|ref|index>] [--index <n>] [--focus <true|false>] reorder-surface --surface <id|ref|index> (--index <n> | --before <id|ref|index> | --after <id|ref|index>) tab-action --action <name> [--tab <id|ref|index>] [--surface <id|ref|index>] [--workspace <id|ref|index>] [--title <text>] [--url <url>] + rename-tab [--workspace <id|ref>] [--tab <id|ref>] [--surface <id|ref>] <title> drag-surface-to-split --surface <id|ref> <left|right|up|down> refresh-surfaces surface-health [--workspace <id|ref>] @@ -4410,7 +4483,7 @@ struct CMUXCLI { Environment: CMUX_WORKSPACE_ID Auto-set in cmux terminals. Used as default --workspace for ALL commands (send, list-panels, new-split, notify, etc.). - CMUX_TAB_ID Optional alias used by `tab-action` as default --tab. + CMUX_TAB_ID Optional alias used by `tab-action`/`rename-tab` as default --tab. CMUX_SURFACE_ID Auto-set in cmux terminals. Used as default --surface. CMUX_SOCKET_PATH Override the default Unix socket path (/tmp/cmux.sock). """ diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 9c0ad241..debc0e09 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -562,6 +562,16 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent func focusMainWindow(windowId: UUID) -> Bool { guard let window = windowForMainWindowId(windowId) else { return false } + if TerminalController.shouldSuppressSocketCommandActivation() { + if window.isMiniaturized { + window.deminiaturize(nil) + } + if TerminalController.socketCommandAllowsInAppFocusMutations() { + window.orderFront(nil) + setActiveMainWindow(window) + } + return true + } bringToFront(window) return true } @@ -736,9 +746,16 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent sidebarSelectionState: sidebarSelectionState ) installFileDropOverlay(on: window, tabManager: tabManager) - window.makeKeyAndOrderFront(nil) - setActiveMainWindow(window) - NSApp.activate(ignoringOtherApps: true) + if TerminalController.shouldSuppressSocketCommandActivation() { + window.orderFront(nil) + if TerminalController.socketCommandAllowsInAppFocusMutations() { + setActiveMainWindow(window) + } + } else { + window.makeKeyAndOrderFront(nil) + setActiveMainWindow(window) + NSApp.activate(ignoringOtherApps: true) + } return windowId } diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 016765cd..f8efd5ce 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -502,7 +502,7 @@ class TabManager: ObservableObject { } @discardableResult - func addWorkspace(workingDirectory overrideWorkingDirectory: String? = nil) -> Workspace { + func addWorkspace(workingDirectory overrideWorkingDirectory: String? = nil, select: Bool = true) -> Workspace { let workingDirectory = normalizedWorkingDirectory(overrideWorkingDirectory) ?? preferredWorkingDirectoryForNewTab() let ordinal = Self.nextPortOrdinal Self.nextPortOrdinal += 1 @@ -514,17 +514,19 @@ class TabManager: ObservableObject { } else { tabs.append(newWorkspace) } - selectedTabId = newWorkspace.id - NotificationCenter.default.post( - name: .ghosttyDidFocusTab, - object: nil, - userInfo: [GhosttyNotificationKey.tabId: newWorkspace.id] - ) + if select { + selectedTabId = newWorkspace.id + NotificationCenter.default.post( + name: .ghosttyDidFocusTab, + object: nil, + userInfo: [GhosttyNotificationKey.tabId: newWorkspace.id] + ) + } #if DEBUG UITestRecorder.incrementInt("addTabInvocations") UITestRecorder.record([ "tabCount": String(tabs.count), - "selectedTabId": newWorkspace.id.uuidString + "selectedTabId": select ? newWorkspace.id.uuidString : (selectedTabId?.uuidString ?? "") ]) #endif return newWorkspace @@ -532,7 +534,7 @@ class TabManager: ObservableObject { // Keep addTab as convenience alias @discardableResult - func addTab() -> Workspace { addWorkspace() } + func addTab(select: Bool = true) -> Workspace { addWorkspace(select: select) } private func normalizedWorkingDirectory(_ directory: String?) -> String? { guard let directory else { return nil } @@ -1503,12 +1505,13 @@ class TabManager: ObservableObject { /// Create a new split in the specified direction /// Returns the new panel's ID (which is also the surface ID for terminals) - func newSplit(tabId: UUID, surfaceId: UUID, direction: SplitDirection) -> UUID? { + func newSplit(tabId: UUID, surfaceId: UUID, direction: SplitDirection, focus: Bool = true) -> UUID? { guard let tab = tabs.first(where: { $0.id == tabId }) else { return nil } return tab.newTerminalSplit( from: surfaceId, orientation: direction.orientation, - insertFirst: direction.insertFirst + insertFirst: direction.insertFirst, + focus: focus )?.id } @@ -1559,14 +1562,16 @@ class TabManager: ObservableObject { fromPanelId: UUID, orientation: SplitOrientation, insertFirst: Bool = false, - url: URL? = nil + url: URL? = nil, + focus: Bool = true ) -> UUID? { guard let tab = tabs.first(where: { $0.id == tabId }) else { return nil } return tab.newBrowserSplit( from: fromPanelId, orientation: orientation, insertFirst: insertFirst, - url: url + url: url, + focus: focus )?.id } diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 3217b154..3fa0d18f 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -18,6 +18,36 @@ class TerminalController { private var tabManager: TabManager? private var accessMode: SocketControlMode = .cmuxOnly private let myPid = getpid() + private nonisolated(unsafe) static var socketCommandPolicyDepth: Int = 0 + private nonisolated(unsafe) static var socketCommandFocusAllowanceStack: [Bool] = [] + private nonisolated static let socketCommandPolicyLock = NSLock() + + private static let focusIntentV1Commands: Set<String> = [ + "focus_window", + "select_workspace", + "focus_surface", + "focus_pane", + "focus_surface_by_panel", + "focus_webview", + "focus_notification", + "activate_app" + ] + + private static let focusIntentV2Methods: Set<String> = [ + "window.focus", + "workspace.select", + "workspace.next", + "workspace.previous", + "workspace.last", + "surface.focus", + "pane.focus", + "pane.last", + "browser.focus_webview", + "browser.focus", + "browser.tab.switch", + "debug.notification.focus", + "debug.app.activate" + ] private enum V2HandleKind: String, CaseIterable { case window @@ -68,6 +98,68 @@ class TerminalController { private init() {} + nonisolated static func shouldSuppressSocketCommandActivation() -> Bool { + socketCommandPolicyLock.lock() + defer { socketCommandPolicyLock.unlock() } + return socketCommandPolicyDepth > 0 + } + + nonisolated static func socketCommandAllowsInAppFocusMutations() -> Bool { + allowsInAppFocusMutationsForActiveSocketCommand() + } + + private nonisolated static func allowsInAppFocusMutationsForActiveSocketCommand() -> Bool { + socketCommandPolicyLock.lock() + defer { socketCommandPolicyLock.unlock() } + return socketCommandFocusAllowanceStack.last ?? false + } + + private static func socketCommandAllowsInAppFocusMutations(commandKey: String, isV2: Bool) -> Bool { + if isV2 { + return focusIntentV2Methods.contains(commandKey) + } + return focusIntentV1Commands.contains(commandKey) + } + + private func withSocketCommandPolicy<T>(commandKey: String, isV2: Bool, _ body: () -> T) -> T { + let allowsFocusMutation = Self.socketCommandAllowsInAppFocusMutations(commandKey: commandKey, isV2: isV2) + Self.socketCommandPolicyLock.lock() + Self.socketCommandPolicyDepth += 1 + Self.socketCommandFocusAllowanceStack.append(allowsFocusMutation) + Self.socketCommandPolicyLock.unlock() + defer { + Self.socketCommandPolicyLock.lock() + if !Self.socketCommandFocusAllowanceStack.isEmpty { + _ = Self.socketCommandFocusAllowanceStack.popLast() + } + Self.socketCommandPolicyDepth = max(0, Self.socketCommandPolicyDepth - 1) + Self.socketCommandPolicyLock.unlock() + } + return body() + } + + private func socketCommandAllowsInAppFocusMutations() -> Bool { + Self.allowsInAppFocusMutationsForActiveSocketCommand() + } + + private func v2FocusAllowed(requested: Bool = true) -> Bool { + requested && socketCommandAllowsInAppFocusMutations() + } + + private func v2MaybeFocusWindow(for tabManager: TabManager) { + guard socketCommandAllowsInAppFocusMutations(), + let windowId = v2ResolveWindowId(tabManager: tabManager) else { return } + _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) + setActiveTabManager(tabManager) + } + + private func v2MaybeSelectWorkspace(_ tabManager: TabManager, workspace: Workspace) { + guard socketCommandAllowsInAppFocusMutations() else { return } + if tabManager.selectedTabId != workspace.id { + tabManager.selectWorkspace(workspace) + } + } + nonisolated static func shouldReplaceStatusEntry( current: SidebarStatusEntry?, key: String, @@ -423,7 +515,8 @@ class TerminalController { let cmd = parts[0].lowercased() let args = parts.count > 1 ? parts[1] : "" - switch cmd { + return withSocketCommandPolicy(commandKey: cmd, isV2: false) { + switch cmd { case "ping": return "PONG" @@ -713,6 +806,7 @@ class TerminalController { default: return "ERROR: Unknown command '\(cmd)'. Use 'help' for available commands." } + } } // MARK: - V2 JSON Socket Protocol @@ -747,7 +841,8 @@ class TerminalController { v2MainSync { self.v2RefreshKnownRefs() } - switch method { + return withSocketCommandPolicy(commandKey: method, isV2: true) { + switch method { case "system.ping": return v2Ok(id: id, result: ["pong": true]) case "system.capabilities": @@ -1085,6 +1180,7 @@ class TerminalController { default: return v2Error(id: id, code: "method_not_found", message: "Unknown method") } + } } private func v2Capabilities() -> [String: Any] { @@ -1624,8 +1720,9 @@ class TerminalController { guard let windowId = v2MainSync({ AppDelegate.shared?.createMainWindow() }) else { return .err(code: "internal_error", message: "Failed to create window", data: nil) } - // The new window should become key, but setActiveTabManager defensively. - if let tm = v2MainSync({ AppDelegate.shared?.tabManagerFor(windowId: windowId) }) { + // Keep active routing stable unless this command is explicitly focus-intent. + if socketCommandAllowsInAppFocusMutations(), + let tm = v2MainSync({ AppDelegate.shared?.tabManagerFor(windowId: windowId) }) { setActiveTabManager(tm) } return .ok([ @@ -1685,7 +1782,7 @@ class TerminalController { var newId: UUID? v2MainSync { - let ws = tabManager.addWorkspace() + let ws = tabManager.addWorkspace(select: v2FocusAllowed()) newId = ws.id } @@ -1711,12 +1808,8 @@ class TerminalController { var success = false v2MainSync { if let ws = tabManager.tabs.first(where: { $0.id == wsId }) { - // If this workspace belongs to another window, bring it forward so focus is visible. - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } - tabManager.selectWorkspace(ws) + v2MaybeFocusWindow(for: tabManager) + v2MaybeSelectWorkspace(tabManager, workspace: ws) success = true } } @@ -1789,7 +1882,7 @@ class TerminalController { guard let windowId = v2UUID(params, "window_id") else { return .err(code: "invalid_params", message: "Missing or invalid window_id", data: nil) } - let focus = v2Bool(params, "focus") ?? true + let focus = v2FocusAllowed(requested: v2Bool(params, "focus") ?? true) var result: V2CallResult = .err(code: "internal_error", message: "Failed to move workspace", data: nil) v2MainSync { @@ -1909,10 +2002,7 @@ class TerminalController { var result: V2CallResult = .err(code: "not_found", message: "No workspace selected", data: nil) v2MainSync { guard tabManager.selectedTabId != nil else { return } - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } + v2MaybeFocusWindow(for: tabManager) tabManager.selectNextTab() guard let workspaceId = tabManager.selectedTabId else { return } let windowId = v2ResolveWindowId(tabManager: tabManager) @@ -1934,10 +2024,7 @@ class TerminalController { var result: V2CallResult = .err(code: "not_found", message: "No workspace selected", data: nil) v2MainSync { guard tabManager.selectedTabId != nil else { return } - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } + v2MaybeFocusWindow(for: tabManager) tabManager.selectPreviousTab() guard let workspaceId = tabManager.selectedTabId else { return } let windowId = v2ResolveWindowId(tabManager: tabManager) @@ -1959,10 +2046,7 @@ class TerminalController { var result: V2CallResult = .err(code: "not_found", message: "No previous workspace in history", data: nil) v2MainSync { guard let before = tabManager.selectedTabId else { return } - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } + v2MaybeFocusWindow(for: tabManager) tabManager.navigateBack() guard let after = tabManager.selectedTabId, after != before else { return } let windowId = v2ResolveWindowId(tabManager: tabManager) @@ -2151,6 +2235,7 @@ class TerminalController { result = .err(code: "not_found", message: "Workspace not found", data: nil) return } + let allowFocusMutation = v2FocusAllowed() let surfaceId = v2UUID(params, "surface_id") ?? v2UUID(params, "tab_id") ?? workspace.focusedPanelId guard let surfaceId else { @@ -2280,7 +2365,7 @@ class TerminalController { guard let newPanel = workspace.newBrowserSurface( inPane: paneId, url: browserPanel.currentURL, - focus: true + focus: allowFocusMutation ) else { result = .err(code: "internal_error", message: "Failed to duplicate tab", data: nil) return @@ -2301,7 +2386,7 @@ class TerminalController { } let targetIndex = insertionIndexToRight(anchorTabId: anchorTabId, inPane: paneId) - guard let newPanel = workspace.newTerminalSurface(inPane: paneId, focus: true) else { + guard let newPanel = workspace.newTerminalSurface(inPane: paneId, focus: allowFocusMutation) else { result = .err(code: "internal_error", message: "Failed to create tab", data: nil) return } @@ -2328,7 +2413,7 @@ class TerminalController { } let targetIndex = insertionIndexToRight(anchorTabId: anchorTabId, inPane: paneId) - guard let newPanel = workspace.newBrowserSurface(inPane: paneId, url: url, focus: true) else { + guard let newPanel = workspace.newBrowserSurface(inPane: paneId, url: url, focus: allowFocusMutation) else { result = .err(code: "internal_error", message: "Failed to create tab", data: nil) return } @@ -2439,7 +2524,7 @@ class TerminalController { "ref": v2Ref(kind: .surface, uuid: panel.id), "index": index, "type": panel.panelType.rawValue, - "title": panel.displayTitle, + "title": ws.panelTitle(panelId: panel.id) ?? panel.displayTitle, "focused": panel.id == focusedSurfaceId, "pane_id": v2OrNull(paneUUID?.uuidString), "pane_ref": v2Ref(kind: .pane, uuid: paneUUID), @@ -2515,15 +2600,8 @@ class TerminalController { return } - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } - - // Make sure the workspace is selected so focus effects apply to the visible UI. - if tabManager.selectedTabId != ws.id { - tabManager.selectWorkspace(ws) - } + v2MaybeFocusWindow(for: tabManager) + v2MaybeSelectWorkspace(tabManager, workspace: ws) guard ws.panels[surfaceId] != nil else { result = .err(code: "not_found", message: "Surface not found", data: ["surface_id": surfaceId.uuidString]) @@ -2551,13 +2629,8 @@ class TerminalController { result = .err(code: "not_found", message: "Workspace not found", data: nil) return } - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } - if tabManager.selectedTabId != ws.id { - tabManager.selectWorkspace(ws) - } + v2MaybeFocusWindow(for: tabManager) + v2MaybeSelectWorkspace(tabManager, workspace: ws) let targetSurfaceId: UUID? = v2UUID(params, "surface_id") ?? ws.focusedPanelId guard let targetSurfaceId else { @@ -2569,7 +2642,12 @@ class TerminalController { return } - if let newId = tabManager.newSplit(tabId: ws.id, surfaceId: targetSurfaceId, direction: direction) { + if let newId = tabManager.newSplit( + tabId: ws.id, + surfaceId: targetSurfaceId, + direction: direction, + focus: v2FocusAllowed() + ) { let paneUUID = ws.paneId(forPanelId: newId)?.id let windowId = v2ResolveWindowId(tabManager: tabManager) result = .ok([ @@ -2604,13 +2682,8 @@ class TerminalController { result = .err(code: "not_found", message: "Workspace not found", data: nil) return } - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } - if tabManager.selectedTabId != ws.id { - tabManager.selectWorkspace(ws) - } + v2MaybeFocusWindow(for: tabManager) + v2MaybeSelectWorkspace(tabManager, workspace: ws) let paneUUID = v2UUID(params, "pane_id") let paneId: PaneID? = { @@ -2627,9 +2700,9 @@ class TerminalController { let newPanelId: UUID? if panelType == .browser { - newPanelId = ws.newBrowserSurface(inPane: paneId, url: url, focus: true)?.id + newPanelId = ws.newBrowserSurface(inPane: paneId, url: url, focus: v2FocusAllowed())?.id } else { - newPanelId = ws.newTerminalSurface(inPane: paneId, focus: true)?.id + newPanelId = ws.newTerminalSurface(inPane: paneId, focus: v2FocusAllowed())?.id } guard let newPanelId else { @@ -2747,7 +2820,7 @@ class TerminalController { let beforeSurfaceId = v2UUID(params, "before_surface_id") let afterSurfaceId = v2UUID(params, "after_surface_id") let explicitIndex = v2Int(params, "index") - let focus = v2Bool(params, "focus") ?? true + let focus = v2FocusAllowed(requested: v2Bool(params, "focus") ?? true) let anchorCount = (beforeSurfaceId != nil ? 1 : 0) + (afterSurfaceId != nil ? 1 : 0) if anchorCount > 1 { @@ -2858,16 +2931,15 @@ class TerminalController { ?? sourceWorkspace.bonsplitController.focusedPaneId ?? sourceWorkspace.bonsplitController.allPaneIds.first if let rollbackPane { - _ = sourceWorkspace.attachDetachedSurface(transfer, inPane: rollbackPane, atIndex: sourceIndex, focus: true) + _ = sourceWorkspace.attachDetachedSurface(transfer, inPane: rollbackPane, atIndex: sourceIndex, focus: focus) } result = .err(code: "internal_error", message: "Failed to attach surface to destination", data: nil) return } if focus { - _ = app.focusMainWindow(windowId: targetWindowId) - setActiveTabManager(targetTabManager) - targetTabManager.selectWorkspace(targetWorkspace) + v2MaybeFocusWindow(for: targetTabManager) + v2MaybeSelectWorkspace(targetTabManager, workspace: targetWorkspace) } result = .ok([ @@ -3257,14 +3329,9 @@ class TerminalController { return } - // Ensure the flash is visible in the active UI. - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } - if tabManager.selectedTabId != ws.id { - tabManager.selectWorkspace(ws) - } + // Only explicit focus-intent commands may mutate selection state. + v2MaybeFocusWindow(for: tabManager) + v2MaybeSelectWorkspace(tabManager, workspace: ws) let surfaceId = v2UUID(params, "surface_id") ?? ws.focusedPanelId guard let surfaceId else { @@ -3345,13 +3412,8 @@ class TerminalController { result = .err(code: "not_found", message: "Pane not found", data: ["pane_id": paneUUID.uuidString]) return } - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } - if tabManager.selectedTabId != ws.id { - tabManager.selectWorkspace(ws) - } + v2MaybeFocusWindow(for: tabManager) + v2MaybeSelectWorkspace(tabManager, workspace: ws) ws.bonsplitController.focusPane(paneId) let windowId = v2ResolveWindowId(tabManager: tabManager) result = .ok(["window_id": v2OrNull(windowId?.uuidString), "window_ref": v2Ref(kind: .window, uuid: windowId), "workspace_id": ws.id.uuidString, "workspace_ref": v2Ref(kind: .workspace, uuid: ws.id), "pane_id": paneId.id.uuidString, "pane_ref": v2Ref(kind: .pane, uuid: paneId.id)]) @@ -3432,13 +3494,8 @@ class TerminalController { result = .err(code: "not_found", message: "Workspace not found", data: nil) return } - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } - if tabManager.selectedTabId != ws.id { - tabManager.selectWorkspace(ws) - } + v2MaybeFocusWindow(for: tabManager) + v2MaybeSelectWorkspace(tabManager, workspace: ws) guard let focusedPanelId = ws.focusedPanelId else { result = .err(code: "not_found", message: "No focused surface to split", data: nil) return @@ -3446,9 +3503,20 @@ class TerminalController { let newPanelId: UUID? if panelType == .browser { - newPanelId = ws.newBrowserSplit(from: focusedPanelId, orientation: orientation, insertFirst: insertFirst, url: url)?.id + newPanelId = ws.newBrowserSplit( + from: focusedPanelId, + orientation: orientation, + insertFirst: insertFirst, + url: url, + focus: v2FocusAllowed() + )?.id } else { - newPanelId = ws.newTerminalSplit(from: focusedPanelId, orientation: orientation, insertFirst: insertFirst)?.id + newPanelId = ws.newTerminalSplit( + from: focusedPanelId, + orientation: orientation, + insertFirst: insertFirst, + focus: v2FocusAllowed() + )?.id } guard let newPanelId else { @@ -3665,7 +3733,7 @@ class TerminalController { if sourcePaneUUID == targetPaneUUID { return .err(code: "invalid_params", message: "pane_id and target_pane_id must be different", data: nil) } - let focus = v2Bool(params, "focus") ?? true + let focus = v2FocusAllowed(requested: v2Bool(params, "focus") ?? true) var result: V2CallResult = .err(code: "internal_error", message: "Failed to swap panes", data: nil) v2MainSync { @@ -3748,7 +3816,7 @@ class TerminalController { guard let tabManager = v2ResolveTabManager(params: params) else { return .err(code: "unavailable", message: "TabManager not available", data: nil) } - let focus = v2Bool(params, "focus") ?? true + let focus = v2FocusAllowed(requested: v2Bool(params, "focus") ?? true) var result: V2CallResult = .err(code: "internal_error", message: "Failed to break pane", data: nil) v2MainSync { @@ -3789,7 +3857,7 @@ class TerminalController { return } - let destinationWorkspace = tabManager.addWorkspace() + let destinationWorkspace = tabManager.addWorkspace(select: focus) guard let destinationPane = destinationWorkspace.bonsplitController.focusedPaneId ?? destinationWorkspace.bonsplitController.allPaneIds.first else { if let sourcePaneForRollback { @@ -3797,7 +3865,7 @@ class TerminalController { detached, inPane: sourcePaneForRollback, atIndex: sourceIndex, - focus: true + focus: focus ) } result = .err(code: "internal_error", message: "Destination workspace has no pane", data: nil) @@ -3810,16 +3878,12 @@ class TerminalController { detached, inPane: sourcePaneForRollback, atIndex: sourceIndex, - focus: true + focus: focus ) } result = .err(code: "internal_error", message: "Failed to attach surface to new workspace", data: nil) return } - - if !focus { - tabManager.selectWorkspace(sourceWorkspace) - } let windowId = v2ResolveWindowId(tabManager: tabManager) result = .ok([ "window_id": v2OrNull(windowId?.uuidString), @@ -4356,13 +4420,8 @@ class TerminalController { result = .err(code: "not_found", message: "Workspace not found", data: nil) return } - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } - if tabManager.selectedTabId != ws.id { - tabManager.selectWorkspace(ws) - } + v2MaybeFocusWindow(for: tabManager) + v2MaybeSelectWorkspace(tabManager, workspace: ws) let sourceSurfaceId = v2UUID(params, "surface_id") ?? ws.focusedPanelId guard let sourceSurfaceId else { @@ -4380,11 +4439,16 @@ class TerminalController { var placementStrategy = "split_right" let createdPanel: BrowserPanel? if let targetPane = ws.preferredBrowserTargetPane(fromPanelId: sourceSurfaceId) { - createdPanel = ws.newBrowserSurface(inPane: targetPane, url: url, focus: true) + createdPanel = ws.newBrowserSurface(inPane: targetPane, url: url, focus: v2FocusAllowed()) createdSplit = false placementStrategy = "reuse_right_sibling" } else { - createdPanel = ws.newBrowserSplit(from: sourceSurfaceId, orientation: .horizontal, url: url) + createdPanel = ws.newBrowserSplit( + from: sourceSurfaceId, + orientation: .horizontal, + url: url, + focus: v2FocusAllowed() + ) } guard let browserPanelId = createdPanel?.id else { @@ -5639,13 +5703,8 @@ class TerminalController { guard let ws = v2ResolveWorkspace(params: params, tabManager: tabManager), let browserPanel = ws.browserPanel(for: surfaceId) else { return } - if let windowId = v2ResolveWindowId(tabManager: tabManager) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(tabManager) - } - if tabManager.selectedTabId != ws.id { - tabManager.selectWorkspace(ws) - } + v2MaybeFocusWindow(for: tabManager) + v2MaybeSelectWorkspace(tabManager, workspace: ws) // Prevent omnibar auto-focus from immediately stealing first responder back. browserPanel.suppressOmnibarAutofocus(for: 1.0) @@ -6755,7 +6814,7 @@ class TerminalController { "id": panel.id.uuidString, "ref": v2Ref(kind: .surface, uuid: panel.id), "index": index, - "title": panel.displayTitle, + "title": ws.panelTitle(panelId: panel.id) ?? panel.displayTitle, "url": panel.currentURL?.absoluteString ?? "", "focused": panel.id == ws.focusedPanelId, "pane_id": v2OrNull(ws.paneId(forPanelId: panel.id)?.id.uuidString), @@ -6800,7 +6859,7 @@ class TerminalController { return } - guard let panel = ws.newBrowserSurface(inPane: pane, url: url, focus: true) else { + guard let panel = ws.newBrowserSurface(inPane: pane, url: url, focus: v2FocusAllowed()) else { result = .err(code: "internal_error", message: "Failed to create browser tab", data: nil) return } @@ -8635,7 +8694,8 @@ class TerminalController { guard let windowId = v2MainSync({ AppDelegate.shared?.createMainWindow() }) else { return "ERROR: Failed to create window" } - if let tm = v2MainSync({ AppDelegate.shared?.tabManagerFor(windowId: windowId) }) { + if socketCommandAllowsInAppFocusMutations(), + let tm = v2MainSync({ AppDelegate.shared?.tabManagerFor(windowId: windowId) }) { setActiveTabManager(tm) } return "OK \(windowId.uuidString)" @@ -8655,6 +8715,7 @@ class TerminalController { guard let windowId = UUID(uuidString: parts[1]) else { return "ERROR: Invalid window id" } var ok = false + let focus = socketCommandAllowsInAppFocusMutations() v2MainSync { guard let srcTM = AppDelegate.shared?.tabManagerFor(tabId: wsId), let dstTM = AppDelegate.shared?.tabManagerFor(windowId: windowId), @@ -8662,9 +8723,11 @@ class TerminalController { ok = false return } - dstTM.attachWorkspace(ws, select: true) - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - setActiveTabManager(dstTM) + dstTM.attachWorkspace(ws, select: focus) + if focus { + _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) + setActiveTabManager(dstTM) + } ok = true } @@ -8689,9 +8752,10 @@ class TerminalController { guard let tabManager = tabManager else { return "ERROR: TabManager not available" } var newTabId: UUID? + let focus = socketCommandAllowsInAppFocusMutations() DispatchQueue.main.sync { - tabManager.addTab() - newTabId = tabManager.selectedTabId + let workspace = tabManager.addTab(select: focus) + newTabId = workspace.id } return "OK \(newTabId?.uuidString ?? "unknown")" } @@ -8736,7 +8800,12 @@ class TerminalController { return } - if let newPanelId = tabManager.newSplit(tabId: tabId, surfaceId: targetSurface, direction: direction) { + if let newPanelId = tabManager.newSplit( + tabId: tabId, + surfaceId: targetSurface, + direction: direction, + focus: socketCommandAllowsInAppFocusMutations() + ) { result = "OK \(newPanelId.uuidString)" } } @@ -9896,6 +9965,7 @@ class TerminalController { let trimmed = args.trimmingCharacters(in: .whitespacesAndNewlines) let url: URL? = trimmed.isEmpty ? nil : URL(string: trimmed) + let shouldFocus = socketCommandAllowsInAppFocusMutations() var result = "ERROR: Failed to create browser panel" DispatchQueue.main.sync { @@ -9905,7 +9975,12 @@ class TerminalController { return } - if let browserPanelId = tab.newBrowserSplit(from: focusedPanelId, orientation: .horizontal, url: url)?.id { + if let browserPanelId = tab.newBrowserSplit( + from: focusedPanelId, + orientation: .horizontal, + url: url, + focus: shouldFocus + )?.id { result = "OK \(browserPanelId.uuidString)" } } @@ -10307,6 +10382,7 @@ class TerminalController { let orientation = direction.orientation let insertFirst = direction.insertFirst + let shouldFocus = socketCommandAllowsInAppFocusMutations() var result = "ERROR: Failed to create pane" DispatchQueue.main.sync { @@ -10318,9 +10394,20 @@ class TerminalController { let newPanelId: UUID? if panelType == .browser { - newPanelId = tab.newBrowserSplit(from: focusedPanelId, orientation: orientation, insertFirst: insertFirst, url: url)?.id + newPanelId = tab.newBrowserSplit( + from: focusedPanelId, + orientation: orientation, + insertFirst: insertFirst, + url: url, + focus: shouldFocus + )?.id } else { - newPanelId = tab.newTerminalSplit(from: focusedPanelId, orientation: orientation, insertFirst: insertFirst)?.id + newPanelId = tab.newTerminalSplit( + from: focusedPanelId, + orientation: orientation, + insertFirst: insertFirst, + focus: shouldFocus + )?.id } if let id = newPanelId { @@ -11235,6 +11322,7 @@ class TerminalController { var panelType: PanelType = .terminal var paneArg: String? = nil var url: URL? = nil + let shouldFocus = socketCommandAllowsInAppFocusMutations() let parts = args.split(separator: " ") for part in parts { @@ -11279,9 +11367,9 @@ class TerminalController { let newPanelId: UUID? if panelType == .browser { - newPanelId = tab.newBrowserSurface(inPane: targetPaneId, url: url, focus: true)?.id + newPanelId = tab.newBrowserSurface(inPane: targetPaneId, url: url, focus: shouldFocus)?.id } else { - newPanelId = tab.newTerminalSurface(inPane: targetPaneId, focus: true)?.id + newPanelId = tab.newTerminalSurface(inPane: targetPaneId, focus: shouldFocus)?.id } if let id = newPanelId { diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 6e8a71e9..1238c5fb 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -629,6 +629,12 @@ final class Workspace: Identifiable, ObservableObject { return surfaceKind(for: panel) } + func panelTitle(panelId: UUID) -> String? { + guard let panel = panels[panelId] else { return nil } + let fallback = panelTitles[panelId] ?? panel.displayTitle + return resolvedPanelTitle(panelId: panelId, fallback: fallback) + } + func setPanelPinned(panelId: UUID, pinned: Bool) { guard panels[panelId] != nil else { return } let wasPinned = pinnedPanelIds.contains(panelId) @@ -848,7 +854,8 @@ final class Workspace: Identifiable, ObservableObject { func newTerminalSplit( from panelId: UUID, orientation: SplitOrientation, - insertFirst: Bool = false + insertFirst: Bool = false, + focus: Bool = true ) -> TerminalPanel? { // Get inherited config from the source terminal when possible. // If the split is initiated from a non-terminal panel (for example browser), @@ -921,10 +928,14 @@ final class Workspace: Identifiable, ObservableObject { // Suppress the old view's becomeFirstResponder side-effects during SwiftUI reparenting. // Without this, reparenting triggers onFocus + ghostty_surface_set_focus on the old view, // stealing focus from the new panel and creating model/surface divergence. - previousHostedView?.suppressReparentFocus() - focusPanel(newPanel.id, previousHostedView: previousHostedView) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - previousHostedView?.clearSuppressReparentFocus() + if focus { + previousHostedView?.suppressReparentFocus() + focusPanel(newPanel.id, previousHostedView: previousHostedView) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + previousHostedView?.clearSuppressReparentFocus() + } + } else { + scheduleFocusReconcile() } return newPanel @@ -993,7 +1004,8 @@ final class Workspace: Identifiable, ObservableObject { from panelId: UUID, orientation: SplitOrientation, insertFirst: Bool = false, - url: URL? = nil + url: URL? = nil, + focus: Bool = true ) -> BrowserPanel? { // Find the pane containing the source panel guard let sourceTabId = surfaceIdFromPanelId(panelId) else { return nil } @@ -1037,10 +1049,14 @@ final class Workspace: Identifiable, ObservableObject { // See newTerminalSplit: suppress old view's becomeFirstResponder during reparenting. let previousHostedView = focusedTerminalPanel?.hostedView - previousHostedView?.suppressReparentFocus() - focusPanel(browserPanel.id) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - previousHostedView?.clearSuppressReparentFocus() + if focus { + previousHostedView?.suppressReparentFocus() + focusPanel(browserPanel.id) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + previousHostedView?.clearSuppressReparentFocus() + } + } else { + scheduleFocusReconcile() } installBrowserPanelSubscription(browserPanel) diff --git a/docs/socket-focus-steal-audit.todo.md b/docs/socket-focus-steal-audit.todo.md new file mode 100644 index 00000000..3042050a --- /dev/null +++ b/docs/socket-focus-steal-audit.todo.md @@ -0,0 +1,76 @@ +# Socket/CLI No-Focus-Steal Todo + +## Goal +Ensure commands run through the cmux Unix socket/CLI do not steal user focus from the current UI workflow. + +Policy target: +- App activation/window raising from socket commands: **never**. +- In-app focus mutation from socket commands: only for explicit focus-intent commands. +- Non-focus commands must not move workspace/pane/surface focus as a side effect. + +## Task Checklist +- [x] Inventory all v1 + v2 socket command entrypoints. +- [x] Add socket-command focus policy context in `TerminalController`. +- [x] Suppress app activation for socket command path in `AppDelegate` (`focusMainWindow`, `createMainWindow`). +- [x] Gate in-app focus mutation side-effects in v2 handlers. +- [x] Gate in-app focus mutation side-effects in legacy v1 handlers. +- [x] Add explicit CLI `rename-tab` command with env-default targeting. +- [x] Update CLI help/usage/subcommand docs for `rename-tab`. +- [x] Add regression tests for rename-tab and no-unintended-focus-side-effects. +- [x] Run build + targeted tests. +- [ ] Open PR. + +## Explicit Focus-Intent Allowlist +These may mutate in-app focus/selection state: + +v1: +- `focus_window` +- `select_workspace` +- `focus_surface` +- `focus_pane` +- `focus_surface_by_panel` +- `focus_webview` +- `focus_notification` (debug) +- `activate_app` (debug) + +v2: +- `window.focus` +- `workspace.select` +- `workspace.next` +- `workspace.previous` +- `workspace.last` +- `surface.focus` +- `pane.focus` +- `pane.last` +- `browser.focus_webview` +- `browser.focus` +- `browser.tab.switch` +- `debug.notification.focus` +- `debug.app.activate` + +All other commands should preserve current user focus context. + +## Command Coverage Matrix (All Command Families) +- [x] v1 `ping`, `help` +- [x] v1 window commands (`list_windows`, `current_window`, `focus_window`, `new_window`, `close_window`) +- [x] v1 workspace commands (`move_workspace_to_window`, `list_workspaces`, `new_workspace`, `close_workspace`, `select_workspace`, `current_workspace`) +- [x] v1 surface/pane commands (`new_split`, `list_surfaces`, `focus_surface`, `list_panes`, `list_pane_surfaces`, `focus_pane`, `focus_surface_by_panel`, `drag_surface_to_split`, `new_pane`, `new_surface`, `close_surface`, `refresh_surfaces`, `surface_health`) +- [x] v1 input commands (`send`, `send_key`, `send_surface`, `send_key_surface`, `read_screen`) +- [x] v1 notification/status/log/report commands (`notify*`, `list_notifications`, `clear_notifications`, `set_status`, `clear_status`, `list_status`, `log`, `clear_log`, `list_log`, `set_progress`, `clear_progress`, `report_*`, `ports_kick`, `sidebar_state`, `reset_sidebar`) +- [x] v1 browser commands (`open_browser`, `navigate`, `browser_back`, `browser_forward`, `browser_reload`, `get_url`, `focus_webview`, `is_webview_focused`) +- [x] v1 debug/test commands (shortcut, type, drop/pasteboard, overlay probes, focus checks, screenshots, render/layout/flash/panel snapshot) + +- [x] v2 system methods (`system.*`) +- [x] v2 window methods (`window.*`) +- [x] v2 workspace methods (`workspace.*`) +- [x] v2 surface methods (`surface.*`, `tab.action`) +- [x] v2 pane methods (`pane.*`) +- [x] v2 notification methods (`notification.*`) +- [x] v2 app methods (`app.*`) +- [x] v2 browser methods (full `browser.*` set including tab/network/trace/input) +- [x] v2 debug methods (`debug.*`) + +## CLI Coverage +- [x] Ensure every top-level CLI command routes to non-focus-stealing socket behavior. +- [x] Add/verify `rename-workspace` + `rename-window` behavior remains intact. +- [x] Add explicit `rename-tab` command (defaults to `CMUX_TAB_ID` / `CMUX_SURFACE_ID` / `CMUX_WORKSPACE_ID` when flags omitted). diff --git a/tests_v2/test_cli_non_focus_commands_preserve_workspace.py b/tests_v2/test_cli_non_focus_commands_preserve_workspace.py new file mode 100644 index 00000000..dbc28f9b --- /dev/null +++ b/tests_v2/test_cli_non_focus_commands_preserve_workspace.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +"""Regression: non-focus CLI commands should not switch the selected workspace.""" + +import glob +import os +import subprocess +import sys +from pathlib import Path +from typing import List + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _must(cond: bool, msg: str) -> None: + if not cond: + raise cmuxError(msg) + + +def _find_cli_binary() -> str: + env_cli = os.environ.get("CMUXTERM_CLI") + if env_cli and os.path.isfile(env_cli) and os.access(env_cli, os.X_OK): + return env_cli + + fixed = os.path.expanduser("~/Library/Developer/Xcode/DerivedData/cmux-tests-v2/Build/Products/Debug/cmux") + if os.path.isfile(fixed) and os.access(fixed, os.X_OK): + return fixed + + candidates = glob.glob(os.path.expanduser("~/Library/Developer/Xcode/DerivedData/**/Build/Products/Debug/cmux"), recursive=True) + candidates += glob.glob("/tmp/cmux-*/Build/Products/Debug/cmux") + candidates = [p for p in candidates if os.path.isfile(p) and os.access(p, os.X_OK)] + if not candidates: + raise cmuxError("Could not locate cmux CLI binary; set CMUXTERM_CLI") + candidates.sort(key=lambda p: os.path.getmtime(p), reverse=True) + return candidates[0] + + +def _run_cli(cli: str, args: List[str]) -> str: + env = dict(os.environ) + env.pop("CMUX_WORKSPACE_ID", None) + env.pop("CMUX_SURFACE_ID", None) + env.pop("CMUX_TAB_ID", None) + + cmd = [cli, "--socket", SOCKET_PATH] + args + proc = subprocess.run(cmd, capture_output=True, text=True, check=False, env=env) + if proc.returncode != 0: + merged = f"{proc.stdout}\n{proc.stderr}".strip() + raise cmuxError(f"CLI failed ({' '.join(cmd)}): {merged}") + return proc.stdout.strip() + + +def _current_workspace(c: cmux) -> str: + payload = c._call("workspace.current") or {} + ws_id = str(payload.get("workspace_id") or "") + if not ws_id: + raise cmuxError(f"workspace.current returned no workspace_id: {payload}") + return ws_id + + +def main() -> int: + cli = _find_cli_binary() + + with cmux(SOCKET_PATH) as c: + baseline_ws = _current_workspace(c) + + created = _run_cli(cli, ["new-workspace"]) + _must(created.startswith("OK "), f"new-workspace expected OK response, got: {created}") + created_ws = created.removeprefix("OK ").strip() + _must(bool(created_ws), f"new-workspace returned no workspace id: {created}") + _must(_current_workspace(c) == baseline_ws, "new-workspace should not switch selected workspace") + + _run_cli(cli, ["new-surface", "--workspace", created_ws]) + _must(_current_workspace(c) == baseline_ws, "new-surface --workspace should not switch selected workspace") + + _run_cli(cli, ["new-pane", "--workspace", created_ws, "--direction", "right"]) + _must(_current_workspace(c) == baseline_ws, "new-pane --workspace should not switch selected workspace") + + _run_cli(cli, ["tab-action", "--workspace", created_ws, "--action", "new-terminal-right"]) + _must(_current_workspace(c) == baseline_ws, "tab-action new-terminal-right should not switch selected workspace") + + c.close_workspace(created_ws) + + print("PASS: non-focus CLI commands preserve selected workspace") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_rename_tab_cli_parity.py b/tests_v2/test_rename_tab_cli_parity.py new file mode 100644 index 00000000..a60055fa --- /dev/null +++ b/tests_v2/test_rename_tab_cli_parity.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +"""Regression: explicit `rename-tab` CLI command parity with tab.action rename.""" + +import glob +import os +import subprocess +import sys +import time +from pathlib import Path +from typing import Dict, List, Optional + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _must(cond: bool, msg: str) -> None: + if not cond: + raise cmuxError(msg) + + +def _find_cli_binary() -> str: + env_cli = os.environ.get("CMUXTERM_CLI") + if env_cli and os.path.isfile(env_cli) and os.access(env_cli, os.X_OK): + return env_cli + + fixed = os.path.expanduser("~/Library/Developer/Xcode/DerivedData/cmux-tests-v2/Build/Products/Debug/cmux") + if os.path.isfile(fixed) and os.access(fixed, os.X_OK): + return fixed + + candidates = glob.glob(os.path.expanduser("~/Library/Developer/Xcode/DerivedData/**/Build/Products/Debug/cmux"), recursive=True) + candidates += glob.glob("/tmp/cmux-*/Build/Products/Debug/cmux") + candidates = [p for p in candidates if os.path.isfile(p) and os.access(p, os.X_OK)] + if not candidates: + raise cmuxError("Could not locate cmux CLI binary; set CMUXTERM_CLI") + candidates.sort(key=lambda p: os.path.getmtime(p), reverse=True) + return candidates[0] + + +def _run_cli(cli: str, args: List[str], env: Optional[Dict[str, str]] = None) -> str: + merged_env = dict(os.environ) + merged_env.pop("CMUX_WORKSPACE_ID", None) + merged_env.pop("CMUX_SURFACE_ID", None) + merged_env.pop("CMUX_TAB_ID", None) + if env: + merged_env.update(env) + + cmd = [cli, "--socket", SOCKET_PATH] + args + proc = subprocess.run(cmd, capture_output=True, text=True, check=False, env=merged_env) + if proc.returncode != 0: + merged = f"{proc.stdout}\n{proc.stderr}".strip() + raise cmuxError(f"CLI failed ({' '.join(cmd)}): {merged}") + return proc.stdout.strip() + + +def _surface_title(c: cmux, workspace_id: str, surface_id: str) -> str: + payload = c._call("surface.list", {"workspace_id": workspace_id}) or {} + for row in payload.get("surfaces") or []: + if str(row.get("id") or "") == surface_id: + return str(row.get("title") or "") + raise cmuxError(f"surface.list missing surface {surface_id} in workspace {workspace_id}: {payload}") + + +def main() -> int: + cli = _find_cli_binary() + stamp = int(time.time() * 1000) + + with cmux(SOCKET_PATH) as c: + caps = c.capabilities() or {} + methods = set(caps.get("methods") or []) + _must("tab.action" in methods, f"Missing tab.action in capabilities: {sorted(methods)[:40]}") + + created = c._call("workspace.create") or {} + ws_id = str(created.get("workspace_id") or "") + _must(bool(ws_id), f"workspace.create returned no workspace_id: {created}") + + c._call("workspace.select", {"workspace_id": ws_id}) + current = c._call("surface.current", {"workspace_id": ws_id}) or {} + surface_id = str(current.get("surface_id") or "") + _must(bool(surface_id), f"surface.current returned no surface_id: {current}") + + socket_title = f"socket rename {stamp}" + c._call( + "tab.action", + { + "workspace_id": ws_id, + "surface_id": surface_id, + "action": "rename", + "title": socket_title, + }, + ) + _must(_surface_title(c, ws_id, surface_id) == socket_title, "tab.action rename did not update tab title") + + cli_title = f"cli rename {stamp}" + _run_cli(cli, ["rename-tab", "--workspace", ws_id, "--tab", surface_id, cli_title]) + _must(_surface_title(c, ws_id, surface_id) == cli_title, "rename-tab --tab did not update tab title") + + env_title = f"env rename {stamp}" + _run_cli( + cli, + ["rename-tab", env_title], + env={ + "CMUX_WORKSPACE_ID": ws_id, + "CMUX_TAB_ID": surface_id, + }, + ) + _must(_surface_title(c, ws_id, surface_id) == env_title, "rename-tab via CMUX_TAB_ID did not update tab title") + + invalid = subprocess.run( + [cli, "--socket", SOCKET_PATH, "rename-tab", "--workspace", ws_id], + capture_output=True, + text=True, + check=False, + env={k: v for k, v in os.environ.items() if k not in {"CMUX_WORKSPACE_ID", "CMUX_SURFACE_ID", "CMUX_TAB_ID"}}, + ) + invalid_output = f"{invalid.stdout}\n{invalid.stderr}" + _must(invalid.returncode != 0, "Expected rename-tab without title to fail") + _must("rename-tab requires a title" in invalid_output, f"Unexpected rename-tab error: {invalid_output!r}") + + c.close_workspace(ws_id) + + print("PASS: rename-tab CLI parity works with explicit and env-derived targets") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_rename_window_workspace_parity.py b/tests_v2/test_rename_window_workspace_parity.py index 13e564c1..6c33cdb5 100644 --- a/tests_v2/test_rename_window_workspace_parity.py +++ b/tests_v2/test_rename_window_workspace_parity.py @@ -7,7 +7,7 @@ import subprocess import sys import time from pathlib import Path -from typing import List +from typing import Dict, List, Optional sys.path.insert(0, str(Path(__file__).parent)) from cmux import cmux, cmuxError @@ -39,11 +39,13 @@ def _find_cli_binary() -> str: return candidates[0] -def _run_cli(cli: str, args: List[str]) -> str: +def _run_cli(cli: str, args: List[str], env_overrides: Optional[Dict[str, str]] = None) -> str: env = dict(os.environ) # Keep this test deterministic when running from inside another cmux shell. env.pop("CMUX_WORKSPACE_ID", None) env.pop("CMUX_SURFACE_ID", None) + if env_overrides: + env.update(env_overrides) cmd = [cli, "--socket", SOCKET_PATH] + args proc = subprocess.run(cmd, capture_output=True, text=True, check=False, env=env) if proc.returncode != 0: @@ -93,6 +95,17 @@ def main() -> int: "cmux rename-window without --workspace should target current workspace", ) + env_title = f"tmux env {stamp}" + _run_cli( + cli, + ["rename-workspace", env_title], + env_overrides={"CMUX_WORKSPACE_ID": ws_id}, + ) + _must( + _workspace_title(c, ws_id) == env_title, + "cmux rename-workspace should default to CMUX_WORKSPACE_ID", + ) + env = dict(os.environ) env.pop("CMUX_WORKSPACE_ID", None) env.pop("CMUX_SURFACE_ID", None) From 17889c2e9da7d376dd40d07684a3c52bc6ac826f Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 02:22:03 -0800 Subject: [PATCH 025/214] Mark socket focus audit checklist complete --- docs/socket-focus-steal-audit.todo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/socket-focus-steal-audit.todo.md b/docs/socket-focus-steal-audit.todo.md index 3042050a..dd49450a 100644 --- a/docs/socket-focus-steal-audit.todo.md +++ b/docs/socket-focus-steal-audit.todo.md @@ -18,7 +18,7 @@ Policy target: - [x] Update CLI help/usage/subcommand docs for `rename-tab`. - [x] Add regression tests for rename-tab and no-unintended-focus-side-effects. - [x] Run build + targeted tests. -- [ ] Open PR. +- [x] Open PR. ## Explicit Focus-Intent Allowlist These may mutate in-app focus/selection state: From 1dcb11fc5413fde9d13847d84f196321100912ae Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 03:11:40 -0800 Subject: [PATCH 026/214] Handle unknown Bonsplit tab context actions --- Sources/Workspace.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 31c709b9..d839dd75 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -2461,9 +2461,8 @@ extension Workspace: BonsplitDelegate { case .markAsUnread: guard let panelId = panelIdFromSurfaceId(tab.id) else { return } markPanelUnread(panelId) - case .markAsRead: - guard let panelId = panelIdFromSurfaceId(tab.id) else { return } - markPanelRead(panelId) + @unknown default: + break } } From ba818deb44c526dc1f60a90f6bfe6bd0b91c5156 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 03:16:33 -0800 Subject: [PATCH 027/214] Fix IME firstRect preedit anchor sizing (https://github.com/manaflow-ai/cmux/issues/265) --- Sources/GhosttyTerminalView.swift | 28 +++++++++++-- cmuxTests/CJKIMEInputTests.swift | 67 +++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index fec9dc4b..99d70b2c 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -2115,6 +2115,17 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { var keyTextAccumulatorForTesting: [String]? { keyTextAccumulator } + + // Test-only IME point override so firstRect behavior can be regression tested. + private var imePointOverrideForTesting: (x: Double, y: Double, width: Double, height: Double)? + + func setIMEPointForTesting(x: Double, y: Double, width: Double, height: Double) { + imePointOverrideForTesting = (x, y, width, height) + } + + func clearIMEPointForTesting() { + imePointOverrideForTesting = nil + } #endif #if DEBUG @@ -4204,17 +4215,28 @@ extension GhosttyNSView: NSTextInputClient { // Use Ghostty's IME point API for accurate cursor position if available. var x: Double = 0 var y: Double = 0 - var w: Double = 0 - var h: Double = 0 + var w: Double = cellSize.width + var h: Double = cellSize.height +#if DEBUG + if let override = imePointOverrideForTesting { + x = override.x + y = override.y + w = override.width + h = override.height + } else if let surface = surface { + ghostty_surface_ime_point(surface, &x, &y, &w, &h) + } +#else if let surface = surface { ghostty_surface_ime_point(surface, &x, &y, &w, &h) } +#endif // Ghostty coordinates are top-left origin; AppKit expects bottom-left. let viewRect = NSRect( x: x, y: frame.size.height - y, - width: 0, + width: w, height: max(h, cellSize.height) ) let winRect = convert(viewRect, to: nil) diff --git a/cmuxTests/CJKIMEInputTests.swift b/cmuxTests/CJKIMEInputTests.swift index 4b391978..4191c7fc 100644 --- a/cmuxTests/CJKIMEInputTests.swift +++ b/cmuxTests/CJKIMEInputTests.swift @@ -642,6 +642,73 @@ final class CJKIMECompositionSequenceTests: XCTestCase { } } +// MARK: - IME firstRect placement and sizing + +/// Regression tests for IME candidate/preedit anchor rectangle reporting. +/// If width/height are discarded here, macOS can place preedit UI incorrectly. +final class CJKIMEFirstRectTests: XCTestCase { + + func testFirstRectUsesIMEProvidedWidthAndHeight() { + let frame = NSRect(x: 0, y: 0, width: 800, height: 600) + let view = GhosttyNSView(frame: frame) + view.cellSize = CGSize(width: 10, height: 20) + view.setIMEPointForTesting(x: 120, y: 240, width: 64, height: 26) + + let window = NSWindow( + contentRect: NSRect(x: 100, y: 100, width: 800, height: 600), + styleMask: [.titled], + backing: .buffered, + defer: false + ) + let content = NSView(frame: frame) + window.contentView = content + content.addSubview(view) + view.frame = frame + + defer { + view.clearIMEPointForTesting() + window.orderOut(nil) + } + + let rect = view.firstRect(forCharacterRange: NSRange(location: 0, length: 1), actualRange: nil) + + let expectedViewRect = NSRect(x: 120, y: frame.height - 240, width: 64, height: 26) + let expectedScreenRect = window.convertToScreen(view.convert(expectedViewRect, to: nil)) + + XCTAssertEqual(rect.origin.x, expectedScreenRect.origin.x, accuracy: 0.001) + XCTAssertEqual(rect.origin.y, expectedScreenRect.origin.y, accuracy: 0.001) + XCTAssertEqual(rect.width, 64, accuracy: 0.001) + XCTAssertEqual(rect.height, 26, accuracy: 0.001) + } + + func testFirstRectFallsBackToCellHeightWhenIMEHeightIsZero() { + let frame = NSRect(x: 0, y: 0, width: 640, height: 480) + let view = GhosttyNSView(frame: frame) + view.cellSize = CGSize(width: 9, height: 18) + view.setIMEPointForTesting(x: 80, y: 120, width: 36, height: 0) + + let window = NSWindow( + contentRect: NSRect(x: 40, y: 40, width: 640, height: 480), + styleMask: [.titled], + backing: .buffered, + defer: false + ) + let content = NSView(frame: frame) + window.contentView = content + content.addSubview(view) + view.frame = frame + + defer { + view.clearIMEPointForTesting() + window.orderOut(nil) + } + + let rect = view.firstRect(forCharacterRange: NSRange(location: 0, length: 1), actualRange: nil) + XCTAssertEqual(rect.width, 36, accuracy: 0.001) + XCTAssertEqual(rect.height, 18, accuracy: 0.001) + } +} + // MARK: - Key text accumulator during CJK IME composition /// Tests that the keyTextAccumulator correctly manages text during the keyDown From 55c7420b344df125231548972b6668704e9095f8 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 03:19:43 -0800 Subject: [PATCH 028/214] Harden Cmd+Shift+T focus against deferred stale callbacks --- Sources/TabManager.swift | 66 +++++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 77 +++++++++++++++++++ 2 files changed, 139 insertions(+), 4 deletions(-) diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 6c84d402..e90fa1d4 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -1613,16 +1613,18 @@ class TabManager: ObservableObject { ?? tabs.first else { return false } + let preReopenFocusedPanelId = focusedPanelId(for: targetWorkspace.id) if selectedTabId != targetWorkspace.id { selectedTabId = targetWorkspace.id } if let reopenedPanelId = reopenClosedBrowserPanel(snapshot, in: targetWorkspace) { - // Workspace switches defer focus restoration to the next main-queue turn. - // Record the reopened browser immediately so deferred restore doesn't snap - // back to the previously focused terminal in that workspace. - rememberFocusedSurface(tabId: targetWorkspace.id, surfaceId: reopenedPanelId) + enforceReopenedBrowserFocus( + tabId: targetWorkspace.id, + reopenedPanelId: reopenedPanelId, + preReopenFocusedPanelId: preReopenFocusedPanelId + ) return true } } @@ -1630,6 +1632,62 @@ class TabManager: ObservableObject { return false } + private func enforceReopenedBrowserFocus( + tabId: UUID, + reopenedPanelId: UUID, + preReopenFocusedPanelId: UUID? + ) { + // Keep workspace-switch restoration pinned to the reopened browser panel. + rememberFocusedSurface(tabId: tabId, surfaceId: reopenedPanelId) + enforceReopenedBrowserFocusIfNeeded( + tabId: tabId, + reopenedPanelId: reopenedPanelId, + preReopenFocusedPanelId: preReopenFocusedPanelId + ) + + // Some stale focus callbacks can land one runloop turn later. Re-assert focus in two + // consecutive turns, but only when focus drifted back to the pre-reopen panel. + DispatchQueue.main.async { [weak self] in + guard let self else { return } + self.enforceReopenedBrowserFocusIfNeeded( + tabId: tabId, + reopenedPanelId: reopenedPanelId, + preReopenFocusedPanelId: preReopenFocusedPanelId + ) + DispatchQueue.main.async { [weak self] in + self?.enforceReopenedBrowserFocusIfNeeded( + tabId: tabId, + reopenedPanelId: reopenedPanelId, + preReopenFocusedPanelId: preReopenFocusedPanelId + ) + } + } + } + + private func enforceReopenedBrowserFocusIfNeeded( + tabId: UUID, + reopenedPanelId: UUID, + preReopenFocusedPanelId: UUID? + ) { + guard selectedTabId == tabId, + let tab = tabs.first(where: { $0.id == tabId }), + tab.panels[reopenedPanelId] != nil else { + return + } + + rememberFocusedSurface(tabId: tabId, surfaceId: reopenedPanelId) + + guard tab.focusedPanelId != reopenedPanelId else { return } + + if let focusedPanelId = tab.focusedPanelId, + let preReopenFocusedPanelId, + focusedPanelId != preReopenFocusedPanelId { + return + } + + tab.focusPanel(reopenedPanelId) + } + private func reopenClosedBrowserPanel( _ snapshot: ClosedBrowserPanelRestoreSnapshot, in workspace: Workspace diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 709e964e..0864f9d5 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1039,11 +1039,88 @@ final class TabManagerReopenClosedBrowserFocusTests: XCTestCase { XCTAssertTrue(isFocusedPanelBrowser(in: workspace1)) } + func testReopenFromDifferentWorkspaceWinsAgainstSingleDeferredStaleFocus() { + let manager = TabManager() + guard let workspace1 = manager.selectedWorkspace, + let preReopenPanelId = workspace1.focusedPanelId, + let closedBrowserId = manager.openBrowser(url: URL(string: "https://example.com/stale-focus-cross-ws")) else { + XCTFail("Expected initial workspace state and browser panel") + return + } + + drainMainQueue() + XCTAssertTrue(workspace1.closePanel(closedBrowserId, force: true)) + drainMainQueue() + + let panelIdsBeforeReopen = Set(workspace1.panels.keys) + let workspace2 = manager.addWorkspace() + XCTAssertEqual(manager.selectedTabId, workspace2.id) + + XCTAssertTrue(manager.reopenMostRecentlyClosedBrowserPanel()) + guard let reopenedPanelId = singleNewPanelId(in: workspace1, comparedTo: panelIdsBeforeReopen) else { + XCTFail("Expected reopened browser panel ID") + return + } + + // Simulate one delayed stale focus callback from the panel that was focused before reopen. + DispatchQueue.main.async { + workspace1.focusPanel(preReopenPanelId) + } + + drainMainQueue() + drainMainQueue() + drainMainQueue() + + XCTAssertEqual(manager.selectedTabId, workspace1.id) + XCTAssertEqual(workspace1.focusedPanelId, reopenedPanelId) + XCTAssertTrue(workspace1.panels[reopenedPanelId] is BrowserPanel) + } + + func testReopenInSameWorkspaceWinsAgainstSingleDeferredStaleFocus() { + let manager = TabManager() + guard let workspace = manager.selectedWorkspace, + let preReopenPanelId = workspace.focusedPanelId, + let closedBrowserId = manager.openBrowser(url: URL(string: "https://example.com/stale-focus-same-ws")) else { + XCTFail("Expected initial workspace state and browser panel") + return + } + + drainMainQueue() + XCTAssertTrue(workspace.closePanel(closedBrowserId, force: true)) + drainMainQueue() + + let panelIdsBeforeReopen = Set(workspace.panels.keys) + XCTAssertTrue(manager.reopenMostRecentlyClosedBrowserPanel()) + guard let reopenedPanelId = singleNewPanelId(in: workspace, comparedTo: panelIdsBeforeReopen) else { + XCTFail("Expected reopened browser panel ID") + return + } + + // Simulate one delayed stale focus callback from the panel that was focused before reopen. + DispatchQueue.main.async { + workspace.focusPanel(preReopenPanelId) + } + + drainMainQueue() + drainMainQueue() + drainMainQueue() + + XCTAssertEqual(manager.selectedTabId, workspace.id) + XCTAssertEqual(workspace.focusedPanelId, reopenedPanelId) + XCTAssertTrue(workspace.panels[reopenedPanelId] is BrowserPanel) + } + private func isFocusedPanelBrowser(in workspace: Workspace) -> Bool { guard let focusedPanelId = workspace.focusedPanelId else { return false } return workspace.panels[focusedPanelId] is BrowserPanel } + private func singleNewPanelId(in workspace: Workspace, comparedTo previousPanelIds: Set<UUID>) -> UUID? { + let newPanelIds = Set(workspace.panels.keys).subtracting(previousPanelIds) + guard newPanelIds.count == 1 else { return nil } + return newPanelIds.first + } + private func drainMainQueue() { let expectation = expectation(description: "drain main queue") DispatchQueue.main.async { From 5e1d4585050b4290099dc649caa4465d51681fe7 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:02:51 -0800 Subject: [PATCH 029/214] nightly: publish immutable DMG assets for appcast --- .github/workflows/nightly.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 965d69e1..e200f251 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -190,6 +190,12 @@ jobs: fi /usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${NIGHTLY_BUILD}" "$APP_PLIST" + # Use an immutable DMG filename in appcast URLs so old appcasts keep + # pointing at matching archives while nightly assets roll forward. + NIGHTLY_DMG_IMMUTABLE="cmux-nightly-macos-${NIGHTLY_BUILD}.dmg" + echo "NIGHTLY_BUILD=${NIGHTLY_BUILD}" >> "$GITHUB_ENV" + echo "NIGHTLY_DMG_IMMUTABLE=${NIGHTLY_DMG_IMMUTABLE}" >> "$GITHUB_ENV" + # Embed commit SHA for bug reports /usr/libexec/PlistBuddy -c "Delete :CMUXCommit" "$APP_PLIST" >/dev/null 2>&1 || true /usr/libexec/PlistBuddy -c "Add :CMUXCommit string ${SHORT_SHA}" "$APP_PLIST" @@ -198,6 +204,7 @@ jobs: echo "Nightly bundle ID: com.cmuxterm.app.nightly" echo "Nightly marketing version: ${BASE_MARKETING}-nightly.${NIGHTLY_DATE}" echo "Nightly build number: ${NIGHTLY_BUILD}" + echo "Nightly immutable DMG: ${NIGHTLY_DMG_IMMUTABLE}" echo "Commit SHA: ${SHORT_SHA}" - name: Import signing cert @@ -283,6 +290,10 @@ jobs: xcrun stapler staple "$DMG_RELEASE" xcrun stapler validate "$DMG_RELEASE" + # Keep a stable filename for humans and an immutable filename used + # by appcast URLs to prevent signature/asset mismatch races. + cp "$DMG_RELEASE" "$NIGHTLY_DMG_IMMUTABLE" + - name: Generate Sparkle appcast (nightly) env: SPARKLE_PRIVATE_KEY: ${{ secrets.SPARKLE_PRIVATE_KEY }} @@ -291,7 +302,7 @@ jobs: echo "Missing SPARKLE_PRIVATE_KEY secret" >&2 exit 1 fi - ./scripts/sparkle_generate_appcast.sh cmux-nightly-macos.dmg nightly appcast.xml + ./scripts/sparkle_generate_appcast.sh "$NIGHTLY_DMG_IMMUTABLE" nightly appcast.xml - name: Move nightly tag to built commit run: | @@ -315,6 +326,7 @@ jobs: [Download cmux-nightly-macos.dmg](https://github.com/manaflow-ai/cmux/releases/download/nightly/cmux-nightly-macos.dmg) files: | + cmux-nightly-macos-${{ github.run_id }}*.dmg cmux-nightly-macos.dmg appcast.xml overwrite_files: true From a5b1039fbc7f9cb468acb1ef659ab1fdee209cb4 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:07:00 -0800 Subject: [PATCH 030/214] release: block accidental overwrite of signed assets --- .github/workflows/release.yml | 31 ++++++++++++++++ scripts/build-sign-upload.sh | 69 +++++++++++++++++++++++++++++++++-- 2 files changed, 96 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4cbcb8dd..a3ca4a1a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -193,6 +193,36 @@ jobs: fi ./scripts/sparkle_generate_appcast.sh cmux-macos.dmg "$GITHUB_REF_NAME" appcast.xml + - name: Guard immutable release assets + uses: actions/github-script@v7 + with: + script: | + const tag = context.ref.replace('refs/tags/', ''); + const requiredAssets = ['cmux-macos.dmg', 'appcast.xml']; + try { + const release = await github.rest.repos.getReleaseByTag({ + owner: context.repo.owner, + repo: context.repo.repo, + tag, + }); + const assetNames = new Set((release.data.assets || []).map((asset) => asset.name)); + const conflicts = requiredAssets.filter((asset) => assetNames.has(asset)); + if (conflicts.length > 0) { + core.setFailed( + `Release ${tag} already contains immutable assets (${conflicts.join(', ')}). ` + + 'Refusing to overwrite signed artifacts for an existing tag.' + ); + return; + } + core.notice(`Release ${tag} exists but does not contain conflicting assets.`); + } catch (error) { + if (error.status === 404) { + core.notice(`Release ${tag} does not exist yet; safe to publish assets.`); + return; + } + throw error; + } + - name: Upload release asset uses: softprops/action-gh-release@v2 with: @@ -200,6 +230,7 @@ jobs: cmux-macos.dmg appcast.xml generate_release_notes: true + overwrite_files: false - name: Cleanup keychain if: always() diff --git a/scripts/build-sign-upload.sh b/scripts/build-sign-upload.sh index 7f6d9644..06f4e8d8 100755 --- a/scripts/build-sign-upload.sh +++ b/scripts/build-sign-upload.sh @@ -2,10 +2,50 @@ set -euo pipefail # Build, sign, notarize, create DMG, generate appcast, and upload to GitHub release. -# Usage: ./scripts/build-sign-upload.sh <tag> +# Usage: ./scripts/build-sign-upload.sh <tag> [--allow-overwrite] # Requires: source ~/.secrets/cmuxterm.env && export SPARKLE_PRIVATE_KEY -TAG="${1:?Usage: $0 <tag>}" +usage() { + cat <<'EOF' +Usage: ./scripts/build-sign-upload.sh <tag> [--allow-overwrite] + +Options: + --allow-overwrite Permit replacing existing release assets for the same tag. + Use only for emergency rerolls. +EOF +} + +ALLOW_OVERWRITE="false" +POSITIONAL=() +while [[ $# -gt 0 ]]; do + case "$1" in + --allow-overwrite) + ALLOW_OVERWRITE="true" + shift + ;; + -h|--help) + usage + exit 0 + ;; + -*) + echo "Unknown option: $1" >&2 + usage >&2 + exit 1 + ;; + *) + POSITIONAL+=("$1") + shift + ;; + esac +done +set -- "${POSITIONAL[@]}" + +if [[ $# -ne 1 ]]; then + usage >&2 + exit 1 +fi + +TAG="$1" SIGN_HASH="A050CC7E193C8221BDBA204E731B046CDCCC1B30" ENTITLEMENTS="cmux.entitlements" APP_PATH="build/Build/Products/Release/cmux.app" @@ -81,8 +121,29 @@ echo "Generating appcast..." # --- Create GitHub release (if needed) and upload --- if gh release view "$TAG" >/dev/null 2>&1; then - echo "Uploading to existing release $TAG..." - gh release upload "$TAG" cmux-macos.dmg appcast.xml --clobber + echo "Release $TAG already exists" + EXISTING_ASSETS="$(gh release view "$TAG" --json assets --jq '.assets[].name' || true)" + HAS_CONFLICTING_ASSET="false" + for asset in cmux-macos.dmg appcast.xml; do + if printf '%s\n' "$EXISTING_ASSETS" | grep -Fxq "$asset"; then + HAS_CONFLICTING_ASSET="true" + break + fi + done + + if [[ "$HAS_CONFLICTING_ASSET" == "true" && "$ALLOW_OVERWRITE" != "true" ]]; then + echo "ERROR: Refusing to overwrite signed release assets for existing tag $TAG." >&2 + echo "Use a new tag, or rerun with --allow-overwrite for an emergency reroll." >&2 + exit 1 + fi + + if [[ "$ALLOW_OVERWRITE" == "true" ]]; then + echo "Uploading with overwrite enabled for existing release $TAG..." + gh release upload "$TAG" cmux-macos.dmg appcast.xml --clobber + else + echo "Uploading to existing release $TAG..." + gh release upload "$TAG" cmux-macos.dmg appcast.xml + fi else echo "Creating release $TAG and uploading..." gh release create "$TAG" cmux-macos.dmg appcast.xml --title "$TAG" --notes "See CHANGELOG.md for details" From 3d2ac239b2d5757dcbe186f9131a21091f2276bb Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:21:11 -0800 Subject: [PATCH 031/214] chore: update release skill metadata --- .gitkeep | 0 skills/release/SKILL.md | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 .gitkeep diff --git a/.gitkeep b/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/skills/release/SKILL.md b/skills/release/SKILL.md index 19e8fa6d..0f5cd1ff 100644 --- a/skills/release/SKILL.md +++ b/skills/release/SKILL.md @@ -1,6 +1,6 @@ --- name: release -description: Prepare and ship a cmux release end-to-end: choose the next version, curate user-facing changelog entries, bump versions, open and monitor a release PR, merge, tag, and verify published artifacts. Use when asked to cut, prepare, publish, or tag a new release. +description: "Prepare and ship a cmux release end-to-end: choose the next version, curate user-facing changelog entries, bump versions, open and monitor a release PR, merge, tag, and verify published artifacts. Use when asked to cut, prepare, publish, or tag a new release." --- # Release @@ -63,4 +63,3 @@ Run this workflow to prepare and publish a cmux release. - Include only user-visible changes. - Exclude internal-only changes (CI, tests, docs-only edits, refactors without behavior changes). - Write concise user-facing bullets in present tense. - From 9c48d18666be8a85f1bceba5b693e0233044a299 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:25:00 -0800 Subject: [PATCH 032/214] Add wall of love page (#243) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add wall of love page with community testimonials New /wall-of-love route showcasing quotes from X and Hacker News, featuring Mitchell Hashimoto, Oliver Kriška, Joe Riddle, Marc, johnthedebs, and dchu17. Masonry card layout with profile pics and platform badges. * Use YC logo for Hacker News testimonials --- web/app/wall-of-love/page.tsx | 177 ++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 web/app/wall-of-love/page.tsx diff --git a/web/app/wall-of-love/page.tsx b/web/app/wall-of-love/page.tsx new file mode 100644 index 00000000..ad769e8a --- /dev/null +++ b/web/app/wall-of-love/page.tsx @@ -0,0 +1,177 @@ +import type { Metadata } from "next"; +import { SiteHeader } from "../components/site-header"; + +export const metadata: Metadata = { + title: "Wall of Love — cmux", + description: + "What people are saying about cmux, the terminal built for multitasking.", +}; + +const testimonials = [ + { + name: "Mitchell Hashimoto", + handle: "@mitchellh", + avatar: + "https://pbs.twimg.com/profile_images/1141762999838842880/64_Y4_XB_400x400.jpg", + text: "Another day another libghostty-based project, this time a macOS terminal with vertical tabs, better organization/notifications, embedded/scriptable browser specifically targeted towards people who use a ton of terminal-based agentic workflows.", + url: "https://x.com/mitchellh/status/2024913161238053296", + platform: "x" as const, + }, + { + name: "Oliver Kriška", + handle: "@quatermain32", + avatar: + "https://pbs.twimg.com/profile_images/674992361974464512/ClmHiw_P_400x400.jpg", + text: "I have used it for whole day and it's really great. Some bugs like opening file in integrated agent browser (yes, it has browser) but other than that it's good.", + url: "https://x.com/quatermain32/status/2024919743484891629", + platform: "x" as const, + }, + { + name: "johnthedebs", + handle: "johnthedebs", + avatar: null, + text: "Hey, this looks seriously awesome. Love the ideas here, specifically: the programmability, layered UI, browser w/ api. Looking forward to giving this a spin. Also want to add that I really appreciate Mitchell Hashimoto creating libghostty; it feels like an exciting time to be a terminal user.", + url: "https://news.ycombinator.com/item?id=47079718", + platform: "hn" as const, + }, + { + name: "Joe Riddle", + handle: "@joeriddles10", + avatar: + "https://pbs.twimg.com/profile_images/1466920091707076608/pxfGMeC0_400x400.jpg", + text: "Vertical tabs in my terminal \u{1F924} I never thought of that before. I use and love Firefox vertical tabs.", + url: "https://x.com/joeriddles10/status/2024914132416561465", + platform: "x" as const, + }, + { + name: "Marc", + handle: "@prodigy00", + avatar: + "https://pbs.twimg.com/profile_images/1726697382337724417/AGafbkp1_400x400.jpg", + text: "This is niceeeeee!", + url: "https://x.com/prodigy00/status/2024946851401613399", + platform: "x" as const, + }, + { + name: "dchu17", + handle: "dchu17", + avatar: null, + text: "Gave this a run and it was pretty intuitive. Good work!", + url: "https://news.ycombinator.com/item?id=47082577", + platform: "hn" as const, + }, +]; + +function PlatformIcon({ platform }: { platform: "x" | "hn" }) { + if (platform === "x") { + return ( + <svg + width="14" + height="14" + viewBox="0 0 24 24" + fill="currentColor" + className="text-muted" + > + <path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" /> + </svg> + ); + } + return ( + <svg + width="14" + height="14" + viewBox="0 0 256 256" + className="text-muted" + > + <rect width="256" height="256" rx="28" fill="#ff6600" /> + <text + x="128" + y="188" + fontSize="180" + fontWeight="bold" + fontFamily="sans-serif" + fill="white" + textAnchor="middle" + > + Y + </text> + </svg> + ); +} + +function Initials({ name }: { name: string }) { + const initials = name + .split(/[\s_-]+/) + .map((w) => w[0]) + .join("") + .toUpperCase() + .slice(0, 2); + return ( + <div className="w-10 h-10 rounded-full bg-code-bg border border-border flex items-center justify-center text-xs font-medium text-muted shrink-0"> + {initials} + </div> + ); +} + +function TestimonialCard({ + testimonial, +}: { + testimonial: (typeof testimonials)[number]; +}) { + return ( + <a + href={testimonial.url} + target="_blank" + rel="noopener noreferrer" + className="group block rounded-xl border border-border p-5 hover:bg-code-bg transition-colors break-inside-avoid mb-4" + > + <div className="flex items-center gap-3 mb-3"> + {testimonial.avatar ? ( + <img + src={testimonial.avatar} + alt={testimonial.name} + width={40} + height={40} + className="rounded-full shrink-0" + /> + ) : ( + <Initials name={testimonial.name} /> + )} + <div className="min-w-0 flex-1"> + <div className="font-medium text-sm truncate"> + {testimonial.name} + </div> + <div className="text-xs text-muted truncate"> + {testimonial.handle} + </div> + </div> + <PlatformIcon platform={testimonial.platform} /> + </div> + <p className="text-[15px] leading-relaxed text-muted group-hover:text-foreground transition-colors"> + {testimonial.text} + </p> + </a> + ); +} + +export default function WallOfLovePage() { + return ( + <div className="min-h-screen"> + <SiteHeader section="wall of love" /> + <main className="w-full max-w-6xl mx-auto px-6 py-10"> + <h1 className="text-2xl font-semibold tracking-tight mb-2"> + Wall of Love + </h1> + <p className="text-muted text-[15px] mb-8"> + What people are saying about cmux. + </p> + + <div className="columns-1 sm:columns-2 lg:columns-3 gap-4"> + {testimonials.map((t) => ( + <TestimonialCard key={t.url} testimonial={t} /> + ))} + </div> + </main> + </div> + ); +} From 75dec40335528e895a25df85730fc5b2fb5e56aa Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:30:52 -0800 Subject: [PATCH 033/214] Add app version/build properties to PostHog DAU events (#256) --- Sources/PostHogAnalytics.swift | 47 +++++++++++++++++++++++++---- cmuxTests/GhosttyConfigTests.swift | 48 ++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 6 deletions(-) diff --git a/Sources/PostHogAnalytics.swift b/Sources/PostHogAnalytics.swift index 2d181bcf..091870d8 100644 --- a/Sources/PostHogAnalytics.swift +++ b/Sources/PostHogAnalytics.swift @@ -39,8 +39,9 @@ final class PostHogAnalytics { PostHogSDK.shared.setup(config) - // Tag every event so PostHog can distinguish desktop from web. - PostHogSDK.shared.register(["platform": "cmuxterm"]) + // Tag every event so PostHog can distinguish desktop from web and + // break events down by released app version/build. + PostHogSDK.shared.register(Self.superProperties(infoDictionary: Bundle.main.infoDictionary ?? [:])) // The SDK automatically generates and persists an anonymous distinct ID. @@ -68,10 +69,14 @@ final class PostHogAnalytics { defaults.set(today, forKey: lastActiveDayUTCKey) - PostHogSDK.shared.capture("cmux_daily_active", properties: [ - "day_utc": today, - "reason": reason, - ]) + PostHogSDK.shared.capture( + "cmux_daily_active", + properties: Self.dailyActiveProperties( + dayUTC: today, + reason: reason, + infoDictionary: Bundle.main.infoDictionary ?? [:] + ) + ) // For DAU we care more about delivery than batching. PostHogSDK.shared.flush() @@ -90,4 +95,34 @@ final class PostHogAnalytics { formatter.dateFormat = "yyyy-MM-dd" return formatter.string(from: date) } + + nonisolated static func superProperties(infoDictionary: [String: Any]) -> [String: Any] { + var properties: [String: Any] = ["platform": "cmuxterm"] + properties.merge(versionProperties(infoDictionary: infoDictionary)) { _, new in new } + return properties + } + + nonisolated static func dailyActiveProperties( + dayUTC: String, + reason: String, + infoDictionary: [String: Any] + ) -> [String: Any] { + var properties: [String: Any] = [ + "day_utc": dayUTC, + "reason": reason, + ] + properties.merge(versionProperties(infoDictionary: infoDictionary)) { _, new in new } + return properties + } + + nonisolated private static func versionProperties(infoDictionary: [String: Any]) -> [String: Any] { + var properties: [String: Any] = [:] + if let value = infoDictionary["CFBundleShortVersionString"] as? String, !value.isEmpty { + properties["app_version"] = value + } + if let value = infoDictionary["CFBundleVersion"] as? String, !value.isEmpty { + properties["app_build"] = value + } + return properties + } } diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index cd81e89e..386c7131 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -436,3 +436,51 @@ final class SocketControlSettingsTests: XCTestCase { ) } } + +final class PostHogAnalyticsPropertiesTests: XCTestCase { + func testDailyActivePropertiesIncludeVersionAndBuild() { + let properties = PostHogAnalytics.dailyActiveProperties( + dayUTC: "2026-02-21", + reason: "didBecomeActive", + infoDictionary: [ + "CFBundleShortVersionString": "0.31.0", + "CFBundleVersion": "230", + ] + ) + + XCTAssertEqual(properties["day_utc"] as? String, "2026-02-21") + XCTAssertEqual(properties["reason"] as? String, "didBecomeActive") + XCTAssertEqual(properties["app_version"] as? String, "0.31.0") + XCTAssertEqual(properties["app_build"] as? String, "230") + } + + func testSuperPropertiesIncludePlatformVersionAndBuild() { + let properties = PostHogAnalytics.superProperties( + infoDictionary: [ + "CFBundleShortVersionString": "0.31.0", + "CFBundleVersion": "230", + ] + ) + + XCTAssertEqual(properties["platform"] as? String, "cmuxterm") + XCTAssertEqual(properties["app_version"] as? String, "0.31.0") + XCTAssertEqual(properties["app_build"] as? String, "230") + } + + func testPropertiesOmitVersionFieldsWhenUnavailable() { + let superProperties = PostHogAnalytics.superProperties(infoDictionary: [:]) + XCTAssertEqual(superProperties["platform"] as? String, "cmuxterm") + XCTAssertNil(superProperties["app_version"]) + XCTAssertNil(superProperties["app_build"]) + + let dailyProperties = PostHogAnalytics.dailyActiveProperties( + dayUTC: "2026-02-21", + reason: "activeTimer", + infoDictionary: [:] + ) + XCTAssertEqual(dailyProperties["day_utc"] as? String, "2026-02-21") + XCTAssertEqual(dailyProperties["reason"] as? String, "activeTimer") + XCTAssertNil(dailyProperties["app_version"]) + XCTAssertNil(dailyProperties["app_build"]) + } +} From ff11ba03090f95aec6312302596ca3c380c7982b Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:31:00 -0800 Subject: [PATCH 034/214] Enable Claude Code integration by default (#247) --- Sources/cmuxApp.swift | 2 +- cmuxTests/GhosttyConfigTests.swift | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 48ec051c..3f5a72a8 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -2418,7 +2418,7 @@ enum AppearanceSettings { enum ClaudeCodeIntegrationSettings { static let hooksEnabledKey = "claudeCodeHooksEnabled" - static let defaultHooksEnabled = false + static let defaultHooksEnabled = true static func hooksEnabled(defaults: UserDefaults = .standard) -> Bool { if defaults.object(forKey: hooksEnabledKey) == nil { diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index 386c7131..5f80a466 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -162,7 +162,7 @@ final class GhosttyConfigTests: XCTestCase { ) } - func testClaudeCodeIntegrationDefaultsToDisabledWhenUnset() { + func testClaudeCodeIntegrationDefaultsToEnabledWhenUnset() { let suiteName = "cmux.tests.claude-hooks.\(UUID().uuidString)" guard let defaults = UserDefaults(suiteName: suiteName) else { XCTFail("Failed to create isolated user defaults suite") @@ -173,7 +173,7 @@ final class GhosttyConfigTests: XCTestCase { } defaults.removeObject(forKey: ClaudeCodeIntegrationSettings.hooksEnabledKey) - XCTAssertFalse(ClaudeCodeIntegrationSettings.hooksEnabled(defaults: defaults)) + XCTAssertTrue(ClaudeCodeIntegrationSettings.hooksEnabled(defaults: defaults)) } func testClaudeCodeIntegrationRespectsStoredPreference() { From 63d3fc59490734f5b8dfd629a8681cb8901963b0 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:31:23 -0800 Subject: [PATCH 035/214] Handle child-exit close for last-terminal workspaces (#254) --- Sources/TabManager.swift | 20 ++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 72 +++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index e90fa1d4..0bcd5ea6 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -896,6 +896,26 @@ class TabManager: ObservableObject { /// This should never prompt: the process is already gone, and Ghostty emits the /// `SHOW_CHILD_EXITED` action specifically so the host app can decide what to do. func closePanelAfterChildExited(tabId: UUID, surfaceId: UUID) { + guard let tab = tabs.first(where: { $0.id == tabId }) else { return } + guard tab.panels[surfaceId] != nil else { return } + + // Child-exit on the last panel should collapse the workspace, matching explicit close + // semantics (and close the window when it was the last workspace). + if tab.panels.count <= 1 { + if tabs.count <= 1 { + if let app = AppDelegate.shared { + app.notificationStore?.clearNotifications(forTabId: tabId) + app.closeMainWindowContainingTabId(tabId) + } else { + // Headless/test fallback when no AppDelegate window context exists. + closeRuntimeSurface(tabId: tabId, surfaceId: surfaceId) + } + } else { + closeWorkspace(tab) + } + return + } + closeRuntimeSurface(tabId: tabId, surfaceId: surfaceId) } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 0864f9d5..27e86aec 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -877,6 +877,78 @@ final class WorkspaceReorderTests: XCTestCase { } } +@MainActor +final class TabManagerChildExitCloseTests: XCTestCase { + func testChildExitOnLastPanelClosesSelectedWorkspaceAndKeepsIndexStable() { + let manager = TabManager() + let first = manager.tabs[0] + let second = manager.addWorkspace() + let third = manager.addWorkspace() + + manager.selectWorkspace(second) + XCTAssertEqual(manager.selectedTabId, second.id) + + guard let secondPanelId = second.focusedPanelId else { + XCTFail("Expected focused panel in selected workspace") + return + } + + manager.closePanelAfterChildExited(tabId: second.id, surfaceId: secondPanelId) + + XCTAssertEqual(manager.tabs.map(\.id), [first.id, third.id]) + XCTAssertEqual( + manager.selectedTabId, + third.id, + "Expected selection to stay at the same index after deleting the selected workspace" + ) + } + + func testChildExitOnLastPanelInLastWorkspaceSelectsPreviousWorkspace() { + let manager = TabManager() + let first = manager.tabs[0] + let second = manager.addWorkspace() + + manager.selectWorkspace(second) + XCTAssertEqual(manager.selectedTabId, second.id) + + guard let secondPanelId = second.focusedPanelId else { + XCTFail("Expected focused panel in selected workspace") + return + } + + manager.closePanelAfterChildExited(tabId: second.id, surfaceId: secondPanelId) + + XCTAssertEqual(manager.tabs.map(\.id), [first.id]) + XCTAssertEqual( + manager.selectedTabId, + first.id, + "Expected previous workspace to be selected after closing the last-index workspace" + ) + } + + func testChildExitOnNonLastPanelClosesOnlyPanel() { + let manager = TabManager() + guard let workspace = manager.selectedWorkspace, + let initialPanelId = workspace.focusedPanelId else { + XCTFail("Expected selected workspace with focused panel") + return + } + + guard let splitPanel = workspace.newTerminalSplit(from: initialPanelId, orientation: .horizontal) else { + XCTFail("Expected split terminal panel to be created") + return + } + + let panelCountBefore = workspace.panels.count + manager.closePanelAfterChildExited(tabId: workspace.id, surfaceId: splitPanel.id) + + XCTAssertEqual(manager.tabs.count, 1) + XCTAssertEqual(manager.tabs.first?.id, workspace.id) + XCTAssertEqual(workspace.panels.count, panelCountBefore - 1) + XCTAssertNotNil(workspace.panels[initialPanelId], "Expected sibling panel to remain") + } +} + @MainActor final class TabManagerPendingUnfocusPolicyTests: XCTestCase { func testDoesNotUnfocusWhenPendingTabIsCurrentlySelected() { From 685996ef0d18a0d5580be6305b835b3c77f617e2 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:31:55 -0800 Subject: [PATCH 036/214] Remove border below titlebar (#242) * Remove border below titlebar Remove the 1px separator line overlay at the bottom of the custom titlebar and its associated fakeTitlebarSeparatorColor computed property. * Remove tab hover background in bonsplit Update bonsplit submodule to remove the background fill on hovered non-selected tabs. * Restore titlebar border with system separator color, hover bg on all tabs, browser theme bg - Add back 1px bottom border on titlebar using NSColor.separatorColor (matches bonsplit tab separator color) - Tab hover background now applies to all tabs including the selected one - Browser address bar and under-page background now use Ghostty theme background color instead of window background --- Sources/ContentView.swift | 10 +--------- Sources/Panels/BrowserPanel.swift | 4 ++-- Sources/Panels/BrowserPanelView.swift | 2 +- vendor/bonsplit | 2 +- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 837b366a..02dc2311 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -1153,14 +1153,6 @@ struct ContentView: View { ? Color.black.opacity(0.78) : Color.white.opacity(0.82) } - private var fakeTitlebarSeparatorColor: Color { - _ = titlebarThemeGeneration - let ghosttyBackground = GhosttyApp.shared.defaultBackgroundColor - return ghosttyBackground.isLightColor - ? Color.black.opacity(0.18) - : Color.white.opacity(0.22) - } - private var fullscreenControls: some View { TitlebarControlsView( notificationStore: TerminalNotificationStore.shared, @@ -1216,7 +1208,7 @@ struct ContentView: View { .background(fakeTitlebarBackground) .overlay(alignment: .bottom) { Rectangle() - .fill(fakeTitlebarSeparatorColor) + .fill(Color(nsColor: .separatorColor)) .frame(height: 1) } } diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 118a2fab..4db10c98 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1128,9 +1128,9 @@ final class BrowserPanel: Panel, ObservableObject { webView.isInspectable = true } - // Match the empty-page background to the window so newly-created browsers + // Match the empty-page background to the terminal theme so newly-created browsers // don't flash white before content loads. - webView.underPageBackgroundColor = .windowBackgroundColor + webView.underPageBackgroundColor = GhosttyApp.shared.defaultBackgroundColor // Always present as Safari. webView.customUserAgent = BrowserUserAgentSettings.safariUserAgent diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 0578ef50..418714cf 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -336,7 +336,7 @@ struct BrowserPanelView: View { } .padding(.horizontal, 8) .padding(.vertical, 6) - .background(Color(nsColor: .windowBackgroundColor)) + .background(Color(nsColor: GhosttyApp.shared.defaultBackgroundColor)) // Keep the omnibar stack above WKWebView so the suggestions popup is visible. .zIndex(1) } diff --git a/vendor/bonsplit b/vendor/bonsplit index dd20247b..6e50afe6 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit dd20247b5536b4bd5b9b15cdf940e847daa1a18d +Subproject commit 6e50afe6d65b933c7bf2266544b69dad182daa73 From a1e05fab84a36dd2da7d07382b1353d30a723feb Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:37:32 -0800 Subject: [PATCH 037/214] Improve CLI workspace command responsiveness --- Sources/TerminalController.swift | 158 +++++++++++++++--- Sources/Workspace.swift | 4 +- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 33 ++++ 3 files changed, 167 insertions(+), 28 deletions(-) diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 3fa0d18f..adf25673 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -515,7 +515,11 @@ class TerminalController { let cmd = parts[0].lowercased() let args = parts.count > 1 ? parts[1] : "" - return withSocketCommandPolicy(commandKey: cmd, isV2: false) { + #if DEBUG + let startedAt = ProcessInfo.processInfo.systemUptime + #endif + + let response = withSocketCommandPolicy(commandKey: cmd, isV2: false) { switch cmd { case "ping": return "PONG" @@ -807,6 +811,18 @@ class TerminalController { return "ERROR: Unknown command '\(cmd)'. Use 'help' for available commands." } } + + #if DEBUG + if cmd == "new_workspace" || cmd == "send" || cmd == "send_surface" { + let elapsedMs = (ProcessInfo.processInfo.systemUptime - startedAt) * 1000.0 + let status = response.hasPrefix("OK") ? "ok" : "err" + dlog( + "socket.v1 cmd=\(cmd) status=\(status) ms=\(String(format: "%.2f", elapsedMs)) main=\(Thread.isMainThread ? 1 : 0)" + ) + } + #endif + + return response } // MARK: - V2 JSON Socket Protocol @@ -841,7 +857,11 @@ class TerminalController { v2MainSync { self.v2RefreshKnownRefs() } - return withSocketCommandPolicy(commandKey: method, isV2: true) { + #if DEBUG + let startedAt = ProcessInfo.processInfo.systemUptime + #endif + + let response = withSocketCommandPolicy(commandKey: method, isV2: true) { switch method { case "system.ping": return v2Ok(id: id, result: ["pong": true]) @@ -1181,6 +1201,18 @@ class TerminalController { return v2Error(id: id, code: "method_not_found", message: "Unknown method") } } + + #if DEBUG + if method == "workspace.create" || method == "surface.send_text" { + let elapsedMs = (ProcessInfo.processInfo.systemUptime - startedAt) * 1000.0 + let status = response.contains("\"ok\":true") ? "ok" : "err" + dlog( + "socket.v2 method=\(method) status=\(status) ms=\(String(format: "%.2f", elapsedMs)) main=\(Thread.isMainThread ? 1 : 0)" + ) + } + #endif + + return response } private func v2Capabilities() -> [String: Any] { @@ -1781,10 +1813,20 @@ class TerminalController { } var newId: UUID? + let shouldFocus = v2FocusAllowed() + #if DEBUG + let startedAt = ProcessInfo.processInfo.systemUptime + #endif v2MainSync { - let ws = tabManager.addWorkspace(select: v2FocusAllowed()) + let ws = tabManager.addWorkspace(select: shouldFocus) newId = ws.id } + #if DEBUG + let elapsedMs = (ProcessInfo.processInfo.systemUptime - startedAt) * 1000.0 + dlog( + "socket.workspace.create focus=\(shouldFocus ? 1 : 0) ms=\(String(format: "%.2f", elapsedMs)) main=\(Thread.isMainThread ? 1 : 0)" + ) + #endif guard let newId else { return .err(code: "internal_error", message: "Failed to create workspace", data: nil) @@ -3109,19 +3151,23 @@ class TerminalController { result = .err(code: "invalid_params", message: "Surface is not a terminal", data: ["surface_id": surfaceId.uuidString]) return } + #if DEBUG + let waitStart = ProcessInfo.processInfo.systemUptime + #endif guard let surface = waitForTerminalSurface(terminalPanel, waitUpTo: 2.0) else { result = .err(code: "internal_error", message: "Surface not ready", data: ["surface_id": surfaceId.uuidString]) return } - - for char in text { - if char.unicodeScalars.count == 1, - let scalar = char.unicodeScalars.first, - handleControlScalar(scalar, surface: surface) { - continue - } - sendTextEvent(surface: surface, text: String(char)) + #if DEBUG + let waitMs = (ProcessInfo.processInfo.systemUptime - waitStart) * 1000.0 + if waitMs >= 8 { + dlog( + "socket.surface.send_text.wait_surface workspace=\(ws.id.uuidString.prefix(8)) surface=\(surfaceId.uuidString.prefix(8)) ms=\(String(format: "%.2f", waitMs))" + ) } + #endif + + sendSocketText(text, surface: surface) // Ensure we present a new frame after injecting input so snapshot-based tests (and // socket-driven agents) can observe the updated terminal without requiring a focus // change to trigger a draw. @@ -8753,10 +8799,19 @@ class TerminalController { var newTabId: UUID? let focus = socketCommandAllowsInAppFocusMutations() + #if DEBUG + let startedAt = ProcessInfo.processInfo.systemUptime + #endif DispatchQueue.main.sync { let workspace = tabManager.addTab(select: focus) newTabId = workspace.id } + #if DEBUG + let elapsedMs = (ProcessInfo.processInfo.systemUptime - startedAt) * 1000.0 + dlog( + "socket.new_workspace focus=\(focus ? 1 : 0) ms=\(String(format: "%.2f", elapsedMs)) main=\(Thread.isMainThread ? 1 : 0)" + ) + #endif return "OK \(newTabId?.uuidString ?? "unknown")" } @@ -9741,6 +9796,69 @@ class TerminalController { sendKeyEvent(surface: surface, keycode: 0, text: text) } + enum SocketTextChunk: Equatable { + case text(String) + case control(UnicodeScalar) + } + + nonisolated static func socketTextChunks(_ text: String) -> [SocketTextChunk] { + guard !text.isEmpty else { return [] } + + var chunks: [SocketTextChunk] = [] + chunks.reserveCapacity(8) + var bufferedText = "" + bufferedText.reserveCapacity(text.count) + + func flushBufferedText() { + guard !bufferedText.isEmpty else { return } + chunks.append(.text(bufferedText)) + bufferedText.removeAll(keepingCapacity: true) + } + + for scalar in text.unicodeScalars { + if isSocketControlScalar(scalar) { + flushBufferedText() + chunks.append(.control(scalar)) + } else { + bufferedText.unicodeScalars.append(scalar) + } + } + flushBufferedText() + return chunks + } + + private nonisolated static func isSocketControlScalar(_ scalar: UnicodeScalar) -> Bool { + switch scalar.value { + case 0x0A, 0x0D, 0x09, 0x1B, 0x7F: + return true + default: + return false + } + } + + private func sendSocketText(_ text: String, surface: ghostty_surface_t) { + let chunks = Self.socketTextChunks(text) + #if DEBUG + let startedAt = ProcessInfo.processInfo.systemUptime + #endif + for chunk in chunks { + switch chunk { + case .text(let value): + sendTextEvent(surface: surface, text: value) + case .control(let scalar): + _ = handleControlScalar(scalar, surface: surface) + } + } + #if DEBUG + let elapsedMs = (ProcessInfo.processInfo.systemUptime - startedAt) * 1000.0 + if elapsedMs >= 8 || chunks.count > 1 { + dlog( + "socket.send_text.inject chars=\(text.count) chunks=\(chunks.count) ms=\(String(format: "%.2f", elapsedMs))" + ) + } + #endif + } + private func handleControlScalar(_ scalar: UnicodeScalar, surface: ghostty_surface_t) -> Bool { switch scalar.value { case 0x0A, 0x0D: @@ -9859,14 +9977,7 @@ class TerminalController { .replacingOccurrences(of: "\\r", with: "\r") .replacingOccurrences(of: "\\t", with: "\t") - for char in unescaped { - if char.unicodeScalars.count == 1, - let scalar = char.unicodeScalars.first, - handleControlScalar(scalar, surface: surface) { - continue - } - sendTextEvent(surface: surface, text: String(char)) - } + sendSocketText(unescaped, surface: surface) success = true } if let error { return error } @@ -9890,14 +10001,7 @@ class TerminalController { .replacingOccurrences(of: "\\r", with: "\r") .replacingOccurrences(of: "\\t", with: "\t") - for char in unescaped { - if char.unicodeScalars.count == 1, - let scalar = char.unicodeScalars.first, - handleControlScalar(scalar, surface: surface) { - continue - } - sendTextEvent(surface: surface, text: String(char)) - } + sendSocketText(unescaped, surface: surface) success = true } diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index d839dd75..17d9654c 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -335,7 +335,9 @@ final class Workspace: Identifiable, ObservableObject { // Configure bonsplit with keepAllAlive to preserve terminal state // and keep split entry instantaneous. - let appearance = Self.bonsplitAppearance(from: GhosttyConfig.load()) + // Avoid re-reading/parsing Ghostty config on every new workspace; this hot path + // runs for socket/CLI workspace creation and can cause visible typing lag. + let appearance = Self.bonsplitAppearance(from: GhosttyApp.shared.defaultBackgroundColor) let config = BonsplitConfiguration( allowSplits: true, allowCloseTabs: true, diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 0864f9d5..6d34b8b5 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -3524,3 +3524,36 @@ final class TerminalControllerSidebarDedupeTests: XCTestCase { ) } } + +final class TerminalControllerSocketTextChunkTests: XCTestCase { + func testSocketTextChunksReturnsSingleChunkForPlainText() { + XCTAssertEqual( + TerminalController.socketTextChunks("echo hello"), + [.text("echo hello")] + ) + } + + func testSocketTextChunksSplitsControlScalars() { + XCTAssertEqual( + TerminalController.socketTextChunks("abc\rdef\tghi"), + [ + .text("abc"), + .control("\r".unicodeScalars.first!), + .text("def"), + .control("\t".unicodeScalars.first!), + .text("ghi") + ] + ) + } + + func testSocketTextChunksDoesNotEmitEmptyTextChunksAroundConsecutiveControls() { + XCTAssertEqual( + TerminalController.socketTextChunks("\r\n\t"), + [ + .control("\r".unicodeScalars.first!), + .control("\n".unicodeScalars.first!), + .control("\t".unicodeScalars.first!) + ] + ) + } +} From ed0d24603968a9c2c122c49c82378a6f8ceeeccb Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:39:27 -0800 Subject: [PATCH 038/214] Slim browser omnibar and add button hover/press states (#271) --- Sources/Panels/BrowserPanelView.swift | 46 +++++++- ...owser_omnibar_compact_layout_regression.py | 109 ++++++++++++++++++ 2 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 tests/test_browser_omnibar_compact_layout_regression.py diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 418714cf..a4212818 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -122,6 +122,39 @@ struct OmnibarInlineCompletion: Equatable { } } +private struct OmnibarAddressButtonStyle: ButtonStyle { + func makeBody(configuration: Configuration) -> some View { + OmnibarAddressButtonStyleBody(configuration: configuration) + } +} + +private struct OmnibarAddressButtonStyleBody: View { + let configuration: OmnibarAddressButtonStyle.Configuration + + @Environment(\.isEnabled) private var isEnabled + @State private var isHovered = false + + private var backgroundOpacity: Double { + guard isEnabled else { return 0.0 } + if configuration.isPressed { return 0.16 } + if isHovered { return 0.08 } + return 0.0 + } + + var body: some View { + configuration.label + .background( + RoundedRectangle(cornerRadius: 8, style: .continuous) + .fill(Color.primary.opacity(backgroundOpacity)) + ) + .onHover { hovering in + isHovered = hovering + } + .animation(.easeOut(duration: 0.12), value: isHovered) + .animation(.easeOut(duration: 0.08), value: configuration.isPressed) + } +} + /// View for rendering a browser panel with address bar struct BrowserPanelView: View { @ObservedObject var panel: BrowserPanel @@ -149,7 +182,8 @@ struct BrowserPanelView: View { @State private var lastHandledAddressBarFocusRequestId: UUID? private let omnibarPillCornerRadius: CGFloat = 12 private let addressBarButtonSize: CGFloat = 22 - private let addressBarButtonHitSize: CGFloat = 32 + private let addressBarButtonHitSize: CGFloat = 26 + private let addressBarVerticalPadding: CGFloat = 4 private let devToolsButtonIconSize: CGFloat = 11 private var searchEngine: BrowserSearchEngine { @@ -335,7 +369,7 @@ struct BrowserPanelView: View { developerToolsButton } .padding(.horizontal, 8) - .padding(.vertical, 6) + .padding(.vertical, addressBarVerticalPadding) .background(Color(nsColor: GhosttyApp.shared.defaultBackgroundColor)) // Keep the omnibar stack above WKWebView so the suggestions popup is visible. .zIndex(1) @@ -354,7 +388,7 @@ struct BrowserPanelView: View { .frame(width: addressBarButtonHitSize, height: addressBarButtonHitSize, alignment: .center) .contentShape(Rectangle()) } - .buttonStyle(.plain) + .buttonStyle(OmnibarAddressButtonStyle()) .disabled(!panel.canGoBack) .opacity(panel.canGoBack ? 1.0 : 0.4) .help("Go Back") @@ -370,7 +404,7 @@ struct BrowserPanelView: View { .frame(width: addressBarButtonHitSize, height: addressBarButtonHitSize, alignment: .center) .contentShape(Rectangle()) } - .buttonStyle(.plain) + .buttonStyle(OmnibarAddressButtonStyle()) .disabled(!panel.canGoForward) .opacity(panel.canGoForward ? 1.0 : 0.4) .help("Go Forward") @@ -393,7 +427,7 @@ struct BrowserPanelView: View { .frame(width: addressBarButtonHitSize, height: addressBarButtonHitSize, alignment: .center) .contentShape(Rectangle()) } - .buttonStyle(.plain) + .buttonStyle(OmnibarAddressButtonStyle()) .help(panel.isLoading ? "Stop" : "Reload") if panel.isDownloading { @@ -419,7 +453,7 @@ struct BrowserPanelView: View { .foregroundStyle(devToolsColorOption.color) .frame(width: addressBarButtonSize, height: addressBarButtonSize, alignment: .center) } - .buttonStyle(.plain) + .buttonStyle(OmnibarAddressButtonStyle()) .frame(width: addressBarButtonSize, height: addressBarButtonSize, alignment: .center) .help("Toggle Developer Tools") .accessibilityIdentifier("BrowserToggleDevToolsButton") diff --git a/tests/test_browser_omnibar_compact_layout_regression.py b/tests/test_browser_omnibar_compact_layout_regression.py new file mode 100644 index 00000000..3886f495 --- /dev/null +++ b/tests/test_browser_omnibar_compact_layout_regression.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +"""Static regression guards for compact browser omnibar sizing.""" + +from __future__ import annotations + +import re +import subprocess +from pathlib import Path + + +def repo_root() -> Path: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return Path(result.stdout.strip()) + return Path(__file__).resolve().parents[1] + + +def extract_block(source: str, signature: str) -> str: + start = source.find(signature) + if start < 0: + raise ValueError(f"Missing signature: {signature}") + brace_start = source.find("{", start) + if brace_start < 0: + raise ValueError(f"Missing opening brace for: {signature}") + depth = 0 + for idx in range(brace_start, len(source)): + char = source[idx] + if char == "{": + depth += 1 + elif char == "}": + depth -= 1 + if depth == 0: + return source[brace_start : idx + 1] + raise ValueError(f"Unbalanced braces for: {signature}") + + +def parse_cgfloat_constant(source: str, name: str) -> float | None: + match = re.search( + rf"private let {re.escape(name)}: CGFloat = ([0-9]+(?:\.[0-9]+)?)", + source, + ) + if not match: + return None + return float(match.group(1)) + + +def main() -> int: + root = repo_root() + failures: list[str] = [] + + view_path = root / "Sources" / "Panels" / "BrowserPanelView.swift" + view_source = view_path.read_text(encoding="utf-8") + + hit_size = parse_cgfloat_constant(view_source, "addressBarButtonHitSize") + if hit_size is None: + failures.append("addressBarButtonHitSize constant is missing") + elif hit_size > 26: + failures.append( + f"addressBarButtonHitSize regressed to {hit_size:g}; expected <= 26 for compact omnibar height" + ) + + vertical_padding = parse_cgfloat_constant(view_source, "addressBarVerticalPadding") + if vertical_padding is None: + failures.append("addressBarVerticalPadding constant is missing") + elif vertical_padding > 4: + failures.append( + f"addressBarVerticalPadding regressed to {vertical_padding:g}; expected <= 4 for compact omnibar height" + ) + + address_bar_block = extract_block(view_source, "private var addressBar: some View") + if ".padding(.vertical, addressBarVerticalPadding)" not in address_bar_block: + failures.append("addressBar no longer applies compact vertical padding via addressBarVerticalPadding") + + button_bar_block = extract_block(view_source, "private var addressBarButtonBar: some View") + hit_frame_uses = button_bar_block.count("addressBarButtonHitSize") + if hit_frame_uses < 3: + failures.append( + "navigation buttons no longer consistently use addressBarButtonHitSize frames (padding may be lost)" + ) + + extract_block(view_source, "private struct OmnibarAddressButtonStyle: ButtonStyle") + style_body_block = extract_block(view_source, "private struct OmnibarAddressButtonStyleBody: View") + if "configuration.isPressed" not in style_body_block: + failures.append("OmnibarAddressButtonStyleBody is missing pressed-state styling") + if "isHovered" not in style_body_block or ".onHover" not in style_body_block: + failures.append("OmnibarAddressButtonStyleBody is missing hover-state styling") + + style_uses = view_source.count(".buttonStyle(OmnibarAddressButtonStyle())") + if style_uses < 4: + failures.append( + "address bar buttons no longer consistently use OmnibarAddressButtonStyle" + ) + + if failures: + print("FAIL: browser omnibar compact layout regression guards failed") + for failure in failures: + print(f" - {failure}") + return 1 + + print("PASS: browser omnibar compact layout regression guards are in place") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 965311392054b9532348ddc7abe2fc63a170c54f Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:57:46 -0800 Subject: [PATCH 039/214] Queue workspace command input before surface attach --- Sources/GhosttyTerminalView.swift | 47 ++++++- Sources/TerminalController.swift | 78 ++++++----- .../test_cli_new_workspace_command_queue.py | 126 ++++++++++++++++++ 3 files changed, 213 insertions(+), 38 deletions(-) create mode 100644 tests_v2/test_cli_new_workspace_command_queue.py diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 99d70b2c..b1f2faa5 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1132,6 +1132,9 @@ final class TerminalSurface: Identifiable, ObservableObject { private var lastPixelHeight: UInt32 = 0 private var lastXScale: CGFloat = 0 private var lastYScale: CGFloat = 0 + private var pendingTextQueue: [Data] = [] + private var pendingTextBytes: Int = 0 + private let maxPendingTextBytes = 1_048_576 @Published var searchState: SearchState? = nil { didSet { if let searchState { @@ -1496,6 +1499,8 @@ final class TerminalSurface: Identifiable, ObservableObject { lastXScale = scaleFactors.x lastYScale = scaleFactors.y } + + flushPendingTextIfNeeded() } func updateSize(width: CGFloat, height: CGFloat, xScale: CGFloat, yScale: CGFloat, layerScale: CGFloat) { @@ -1603,14 +1608,54 @@ final class TerminalSurface: Identifiable, ObservableObject { } func sendText(_ text: String) { - guard let surface = surface else { return } guard let data = text.data(using: .utf8), !data.isEmpty else { return } + guard let surface = surface else { + enqueuePendingText(data) + return + } + writeTextData(data, to: surface) + } + + private func writeTextData(_ data: Data, to surface: ghostty_surface_t) { data.withUnsafeBytes { rawBuffer in guard let baseAddress = rawBuffer.baseAddress?.assumingMemoryBound(to: CChar.self) else { return } ghostty_surface_text(surface, baseAddress, UInt(rawBuffer.count)) } } + private func enqueuePendingText(_ data: Data) { + let incomingBytes = data.count + while !pendingTextQueue.isEmpty && pendingTextBytes + incomingBytes > maxPendingTextBytes { + let dropped = pendingTextQueue.removeFirst() + pendingTextBytes -= dropped.count + } + + pendingTextQueue.append(data) + pendingTextBytes += incomingBytes + #if DEBUG + dlog( + "surface.send_text.queue surface=\(id.uuidString.prefix(8)) chunks=\(pendingTextQueue.count) bytes=\(pendingTextBytes)" + ) + #endif + } + + private func flushPendingTextIfNeeded() { + guard let surface = surface, !pendingTextQueue.isEmpty else { return } + let queued = pendingTextQueue + let queuedBytes = pendingTextBytes + pendingTextQueue.removeAll(keepingCapacity: false) + pendingTextBytes = 0 + + for chunk in queued { + writeTextData(chunk, to: surface) + } + #if DEBUG + dlog( + "surface.send_text.flush surface=\(id.uuidString.prefix(8)) chunks=\(queued.count) bytes=\(queuedBytes)" + ) + #endif + } + func performBindingAction(_ action: String) -> Bool { guard let surface = surface else { return false } return action.withCString { cString in diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index adf25673..7e073b93 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -3152,27 +3152,36 @@ class TerminalController { return } #if DEBUG - let waitStart = ProcessInfo.processInfo.systemUptime + let sendStart = ProcessInfo.processInfo.systemUptime #endif - guard let surface = waitForTerminalSurface(terminalPanel, waitUpTo: 2.0) else { - result = .err(code: "internal_error", message: "Surface not ready", data: ["surface_id": surfaceId.uuidString]) - return + let queued: Bool + if let surface = terminalPanel.surface.surface { + sendSocketText(text, surface: surface) + // Ensure we present a new frame after injecting input so snapshot-based tests (and + // socket-driven agents) can observe the updated terminal without requiring a focus + // change to trigger a draw. + terminalPanel.surface.forceRefresh() + queued = false + } else { + // Avoid blocking the main actor waiting for view/surface attachment. + terminalPanel.sendText(text) + queued = true } #if DEBUG - let waitMs = (ProcessInfo.processInfo.systemUptime - waitStart) * 1000.0 - if waitMs >= 8 { - dlog( - "socket.surface.send_text.wait_surface workspace=\(ws.id.uuidString.prefix(8)) surface=\(surfaceId.uuidString.prefix(8)) ms=\(String(format: "%.2f", waitMs))" - ) - } + let sendMs = (ProcessInfo.processInfo.systemUptime - sendStart) * 1000.0 + dlog( + "socket.surface.send_text workspace=\(ws.id.uuidString.prefix(8)) surface=\(surfaceId.uuidString.prefix(8)) queued=\(queued ? 1 : 0) chars=\(text.count) ms=\(String(format: "%.2f", sendMs))" + ) #endif - - sendSocketText(text, surface: surface) - // Ensure we present a new frame after injecting input so snapshot-based tests (and - // socket-driven agents) can observe the updated terminal without requiring a focus - // change to trigger a draw. - terminalPanel.surface.forceRefresh() - result = .ok(["workspace_id": ws.id.uuidString, "workspace_ref": v2Ref(kind: .workspace, uuid: ws.id), "surface_id": surfaceId.uuidString, "surface_ref": v2Ref(kind: .surface, uuid: surfaceId), "window_id": v2OrNull(v2ResolveWindowId(tabManager: tabManager)?.uuidString), "window_ref": v2Ref(kind: .window, uuid: v2ResolveWindowId(tabManager: tabManager))]) + result = .ok([ + "workspace_id": ws.id.uuidString, + "workspace_ref": v2Ref(kind: .workspace, uuid: ws.id), + "surface_id": surfaceId.uuidString, + "surface_ref": v2Ref(kind: .surface, uuid: surfaceId), + "queued": queued, + "window_id": v2OrNull(v2ResolveWindowId(tabManager: tabManager)?.uuidString), + "window_ref": v2Ref(kind: .window, uuid: v2ResolveWindowId(tabManager: tabManager)) + ]) } return result } @@ -3200,7 +3209,7 @@ class TerminalController { result = .err(code: "invalid_params", message: "Surface is not a terminal", data: ["surface_id": surfaceId.uuidString]) return } - guard let surface = waitForTerminalSurface(terminalPanel, waitUpTo: 2.0) else { + guard let surface = terminalPanel.surface.surface else { result = .err(code: "internal_error", message: "Surface not ready", data: ["surface_id": surfaceId.uuidString]) return } @@ -9961,15 +9970,6 @@ class TerminalController { return } - guard let surface = resolveTerminalSurface( - from: terminalPanel.id.uuidString, - tabManager: tabManager, - waitUpTo: 2.0 - ) else { - error = "ERROR: Surface not ready" - return - } - // Unescape common escape sequences // Note: \n is converted to \r for terminal (Enter key sends \r) let unescaped = text @@ -9977,7 +9977,11 @@ class TerminalController { .replacingOccurrences(of: "\\r", with: "\r") .replacingOccurrences(of: "\\t", with: "\t") - sendSocketText(unescaped, surface: surface) + if let surface = terminalPanel.surface.surface { + sendSocketText(unescaped, surface: surface) + } else { + terminalPanel.sendText(unescaped) + } success = true } if let error { return error } @@ -9994,14 +9998,18 @@ class TerminalController { var success = false DispatchQueue.main.sync { - guard let surface = resolveSurface(from: target, tabManager: tabManager) else { return } + guard let terminalPanel = resolveTerminalPanel(from: target, tabManager: tabManager) else { return } let unescaped = text .replacingOccurrences(of: "\\n", with: "\r") .replacingOccurrences(of: "\\r", with: "\r") .replacingOccurrences(of: "\\t", with: "\t") - sendSocketText(unescaped, surface: surface) + if let surface = terminalPanel.surface.surface { + sendSocketText(unescaped, surface: surface) + } else { + terminalPanel.sendText(unescaped) + } success = true } @@ -10021,11 +10029,7 @@ class TerminalController { return } - guard let surface = resolveTerminalSurface( - from: terminalPanel.id.uuidString, - tabManager: tabManager, - waitUpTo: 2.0 - ) else { + guard let surface = terminalPanel.surface.surface else { error = "ERROR: Surface not ready" return } @@ -10047,11 +10051,11 @@ class TerminalController { var success = false var error: String? DispatchQueue.main.sync { - guard resolveTerminalPanel(from: target, tabManager: tabManager) != nil else { + guard let terminalPanel = resolveTerminalPanel(from: target, tabManager: tabManager) else { error = "ERROR: Surface not found" return } - guard let surface = resolveTerminalSurface(from: target, tabManager: tabManager, waitUpTo: 2.0) else { + guard let surface = terminalPanel.surface.surface else { error = "ERROR: Surface not ready" return } diff --git a/tests_v2/test_cli_new_workspace_command_queue.py b/tests_v2/test_cli_new_workspace_command_queue.py new file mode 100644 index 00000000..672b1dce --- /dev/null +++ b/tests_v2/test_cli_new_workspace_command_queue.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +"""Regression: `new-workspace --command` must not block/fail before surface attach.""" + +from __future__ import annotations + +import glob +import os +import subprocess +import sys +import tempfile +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _must(cond: bool, msg: str) -> None: + if not cond: + raise cmuxError(msg) + + +def _find_cli_binary() -> str: + env_cli = os.environ.get("CMUXTERM_CLI") + if env_cli and os.path.isfile(env_cli) and os.access(env_cli, os.X_OK): + return env_cli + + fixed = os.path.expanduser("~/Library/Developer/Xcode/DerivedData/cmux-tests-v2/Build/Products/Debug/cmux") + if os.path.isfile(fixed) and os.access(fixed, os.X_OK): + return fixed + + candidates = glob.glob(os.path.expanduser("~/Library/Developer/Xcode/DerivedData/**/Build/Products/Debug/cmux"), recursive=True) + candidates += glob.glob("/tmp/cmux-*/Build/Products/Debug/cmux") + candidates = [p for p in candidates if os.path.isfile(p) and os.access(p, os.X_OK)] + if not candidates: + raise cmuxError("Could not locate cmux CLI binary; set CMUXTERM_CLI") + candidates.sort(key=lambda p: os.path.getmtime(p), reverse=True) + return candidates[0] + + +def _run_cli(cli: str, args: list[str]) -> tuple[subprocess.CompletedProcess[str], float]: + env = dict(os.environ) + env.pop("CMUX_WORKSPACE_ID", None) + env.pop("CMUX_SURFACE_ID", None) + env.pop("CMUX_TAB_ID", None) + + started = time.monotonic() + proc = subprocess.run( + [cli, "--socket", SOCKET_PATH] + args, + capture_output=True, + text=True, + check=False, + env=env, + ) + elapsed = time.monotonic() - started + return proc, elapsed + + +def main() -> int: + cli = _find_cli_binary() + marker = Path(tempfile.gettempdir()) / f"cmux_new_workspace_command_{os.getpid()}.txt" + created_ws_id: str | None = None + + try: + marker.unlink(missing_ok=True) + except OSError: + pass + + with cmux(SOCKET_PATH) as c: + try: + baseline_ws_id = c.current_workspace() + token = f"queued-{os.getpid()}-{int(time.time() * 1000)}" + cmd_text = f"echo {token} > {marker}" + + proc, elapsed = _run_cli(cli, ["new-workspace", "--command", cmd_text]) + combined = f"{proc.stdout}\n{proc.stderr}".strip() + _must(proc.returncode == 0, f"CLI failed ({proc.returncode}): {combined}") + _must(elapsed < 1.5, f"new-workspace --command should return quickly, took {elapsed:.2f}s") + + output = (proc.stdout or "").strip() + _must(output.startswith("OK "), f"Expected OK response, got: {output!r}") + _must("Surface not ready" not in combined, f"Unexpected surface readiness error: {combined}") + created_ws_id = output[3:].strip() + _must(bool(created_ws_id), f"Missing workspace id in output: {output!r}") + + # Creation with --command should not steal focus. + _must(c.current_workspace() == baseline_ws_id, "new-workspace --command should preserve selected workspace") + + # Selecting the created workspace should attach/create the surface and flush queued input. + c.select_workspace(created_ws_id) + + observed = "" + deadline = time.time() + 12.0 + while time.time() < deadline: + if marker.exists(): + try: + observed = marker.read_text(encoding="utf-8").strip() + except OSError: + observed = "" + if observed: + break + time.sleep(0.05) + + _must(marker.exists(), f"Command marker file was not created: {marker}") + _must(observed == token, f"Queued command did not execute as expected: expected={token!r} observed={observed!r}") + finally: + if created_ws_id: + try: + c.close_workspace(created_ws_id) + except Exception: + pass + + try: + marker.unlink(missing_ok=True) + except OSError: + pass + + print("PASS: new-workspace --command queues input until surface attach and returns without blocking") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 645c7f76ea9d52c0a1321d897b0818811d79795d Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 05:06:29 -0800 Subject: [PATCH 040/214] Start workspace command process before workspace is opened --- Sources/GhosttyTerminalView.swift | 30 +++++++++++++++++++ Sources/TerminalController.swift | 3 ++ .../test_cli_new_workspace_command_queue.py | 8 ++--- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index b1f2faa5..78121fa0 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1135,6 +1135,7 @@ final class TerminalSurface: Identifiable, ObservableObject { private var pendingTextQueue: [Data] = [] private var pendingTextBytes: Int = 0 private let maxPendingTextBytes = 1_048_576 + private var backgroundSurfaceStartQueued = false @Published var searchState: SearchState? = nil { didSet { if let searchState { @@ -1616,6 +1617,35 @@ final class TerminalSurface: Identifiable, ObservableObject { writeTextData(data, to: surface) } + func requestBackgroundSurfaceStartIfNeeded() { + if !Thread.isMainThread { + DispatchQueue.main.async { [weak self] in + self?.requestBackgroundSurfaceStartIfNeeded() + } + return + } + + guard surface == nil, attachedView != nil else { return } + guard !backgroundSurfaceStartQueued else { return } + backgroundSurfaceStartQueued = true + + DispatchQueue.main.async { [weak self] in + guard let self else { return } + self.backgroundSurfaceStartQueued = false + guard self.surface == nil, let view = self.attachedView else { return } + #if DEBUG + let startedAt = ProcessInfo.processInfo.systemUptime + #endif + self.createSurface(for: view) + #if DEBUG + let elapsedMs = (ProcessInfo.processInfo.systemUptime - startedAt) * 1000.0 + dlog( + "surface.background_start surface=\(self.id.uuidString.prefix(8)) inWindow=\(view.window != nil ? 1 : 0) ready=\(self.surface != nil ? 1 : 0) ms=\(String(format: "%.2f", elapsedMs))" + ) + #endif + } + } + private func writeTextData(_ data: Data, to surface: ghostty_surface_t) { data.withUnsafeBytes { rawBuffer in guard let baseAddress = rawBuffer.baseAddress?.assumingMemoryBound(to: CChar.self) else { return } diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 7e073b93..5f1a3833 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -3165,6 +3165,7 @@ class TerminalController { } else { // Avoid blocking the main actor waiting for view/surface attachment. terminalPanel.sendText(text) + terminalPanel.surface.requestBackgroundSurfaceStartIfNeeded() queued = true } #if DEBUG @@ -9981,6 +9982,7 @@ class TerminalController { sendSocketText(unescaped, surface: surface) } else { terminalPanel.sendText(unescaped) + terminalPanel.surface.requestBackgroundSurfaceStartIfNeeded() } success = true } @@ -10009,6 +10011,7 @@ class TerminalController { sendSocketText(unescaped, surface: surface) } else { terminalPanel.sendText(unescaped) + terminalPanel.surface.requestBackgroundSurfaceStartIfNeeded() } success = true } diff --git a/tests_v2/test_cli_new_workspace_command_queue.py b/tests_v2/test_cli_new_workspace_command_queue.py index 672b1dce..da7523c2 100644 --- a/tests_v2/test_cli_new_workspace_command_queue.py +++ b/tests_v2/test_cli_new_workspace_command_queue.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Regression: `new-workspace --command` must not block/fail before surface attach.""" +"""Regression: `new-workspace --command` should execute without selecting the workspace.""" from __future__ import annotations @@ -89,9 +89,6 @@ def main() -> int: # Creation with --command should not steal focus. _must(c.current_workspace() == baseline_ws_id, "new-workspace --command should preserve selected workspace") - # Selecting the created workspace should attach/create the surface and flush queued input. - c.select_workspace(created_ws_id) - observed = "" deadline = time.time() + 12.0 while time.time() < deadline: @@ -106,6 +103,7 @@ def main() -> int: _must(marker.exists(), f"Command marker file was not created: {marker}") _must(observed == token, f"Queued command did not execute as expected: expected={token!r} observed={observed!r}") + _must(c.current_workspace() == baseline_ws_id, "Command execution should not switch selected workspace") finally: if created_ws_id: try: @@ -118,7 +116,7 @@ def main() -> int: except OSError: pass - print("PASS: new-workspace --command queues input until surface attach and returns without blocking") + print("PASS: new-workspace --command executes without opening the created workspace") return 0 From 8ac554fb067b667e60e3d2f9414f07b9fe28bc22 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 05:30:21 -0800 Subject: [PATCH 041/214] Follow up PR 242: refresh browser under-page background on theme updates (#272) * Address PR 242 follow-ups for titlebar and browser background * Restore titlebar border per follow-up scope * Refresh browser under-page color with Ghostty opacity * Browser: theme blank page fallback for about:blank * Browser: keep new tabs webview-less until first nav --- Sources/Panels/BrowserPanel.swift | 40 ++++++++++++++- Sources/Panels/BrowserPanelView.swift | 51 ++++++++++++------- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 35 +++++++++++++ 3 files changed, 105 insertions(+), 21 deletions(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 4db10c98..dedcdb85 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1005,6 +1005,27 @@ final class BrowserPanel: Panel, ObservableObject { /// Shared process pool for cookie sharing across all browser panels private static let sharedProcessPool = WKProcessPool() + private static func clampedGhosttyBackgroundOpacity(_ opacity: Double) -> CGFloat { + CGFloat(max(0.0, min(1.0, opacity))) + } + + private static func resolvedGhosttyBackgroundColor(from notification: Notification? = nil) -> NSColor { + let userInfo = notification?.userInfo + let baseColor = (userInfo?[GhosttyNotificationKey.backgroundColor] as? NSColor) + ?? GhosttyApp.shared.defaultBackgroundColor + + let opacity: Double + if let value = userInfo?[GhosttyNotificationKey.backgroundOpacity] as? Double { + opacity = value + } else if let value = userInfo?[GhosttyNotificationKey.backgroundOpacity] as? NSNumber { + opacity = value.doubleValue + } else { + opacity = GhosttyApp.shared.defaultBackgroundOpacity + } + + return baseColor.withAlphaComponent(clampedGhosttyBackgroundOpacity(opacity)) + } + let id: UUID let panelType: PanelType = .browser @@ -1027,6 +1048,10 @@ final class BrowserPanel: Panel, ObservableObject { /// Published URL being displayed @Published private(set) var currentURL: URL? + /// Whether the browser panel should render its WKWebView in the content area. + /// New browser tabs stay in an empty "new tab" state until first navigation. + @Published private(set) var shouldRenderWebView: Bool = false + /// Published page title @Published private(set) var pageTitle: String = "" @@ -1090,7 +1115,7 @@ final class BrowserPanel: Panel, ObservableObject { if let url = currentURL { return url.host ?? url.absoluteString } - return "Browser" + return "New tab" } var displayIcon: String? { @@ -1130,7 +1155,7 @@ final class BrowserPanel: Panel, ObservableObject { // Match the empty-page background to the terminal theme so newly-created browsers // don't flash white before content loads. - webView.underPageBackgroundColor = GhosttyApp.shared.defaultBackgroundColor + webView.underPageBackgroundColor = Self.resolvedGhosttyBackgroundColor() // Always present as Safari. webView.customUserAgent = BrowserUserAgentSettings.safariUserAgent @@ -1206,6 +1231,7 @@ final class BrowserPanel: Panel, ObservableObject { // Navigate to initial URL if provided if let url = initialURL { + shouldRenderWebView = true navigate(to: url) } } @@ -1295,6 +1321,13 @@ final class BrowserPanel: Panel, ObservableObject { } } webViewObservers.append(progressObserver) + + NotificationCenter.default.publisher(for: .ghosttyDefaultBackgroundDidChange) + .sink { [weak self] notification in + guard let self else { return } + self.webView.underPageBackgroundColor = Self.resolvedGhosttyBackgroundColor(from: notification) + } + .store(in: &cancellables) } // MARK: - Panel Protocol @@ -1337,6 +1370,7 @@ final class BrowserPanel: Panel, ObservableObject { navigationDelegate = nil uiDelegate = nil webViewObservers.removeAll() + cancellables.removeAll() faviconTask?.cancel() faviconTask = nil } @@ -1547,6 +1581,7 @@ final class BrowserPanel: Panel, ObservableObject { guard let url = request.url else { return } // Some installs can end up with a legacy Chrome UA override; keep this pinned. webView.customUserAgent = BrowserUserAgentSettings.safariUserAgent + shouldRenderWebView = true if recordTypedNavigation { BrowserHistoryStore.shared.recordTypedNavigation(url: url) } @@ -1649,6 +1684,7 @@ final class BrowserPanel: Panel, ObservableObject { BrowserWindowPortalRegistry.detach(webView: webView) } webViewObservers.removeAll() + cancellables.removeAll() } } diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index a4212818..aaa39f83 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -548,25 +548,38 @@ struct BrowserPanelView: View { } private var webView: some View { - WebViewRepresentable( - panel: panel, - shouldAttachWebView: isVisibleInUI, - shouldFocusWebView: isFocused && !addressBarFocused, - isPanelFocused: isFocused, - portalZPriority: portalPriority - ) - // Keep the representable identity stable across bonsplit structural updates. - // This reduces WKWebView reparenting churn (and the associated WebKit crashes). - .id(panel.id) - .contentShape(Rectangle()) - .simultaneousGesture(TapGesture().onEnded { - // Chrome-like behavior: clicking web content while editing the - // omnibar should commit blur and revert transient edits. - if addressBarFocused { - addressBarFocused = false - } - }) - .zIndex(0) + Group { + if panel.shouldRenderWebView { + WebViewRepresentable( + panel: panel, + shouldAttachWebView: isVisibleInUI, + shouldFocusWebView: isFocused && !addressBarFocused, + isPanelFocused: isFocused, + portalZPriority: portalPriority + ) + // Keep the representable identity stable across bonsplit structural updates. + // This reduces WKWebView reparenting churn (and the associated WebKit crashes). + .id(panel.id) + .contentShape(Rectangle()) + .simultaneousGesture(TapGesture().onEnded { + // Chrome-like behavior: clicking web content while editing the + // omnibar should commit blur and revert transient edits. + if addressBarFocused { + addressBarFocused = false + } + }) + } else { + Color(nsColor: GhosttyApp.shared.defaultBackgroundColor) + .contentShape(Rectangle()) + .onTapGesture { + onRequestPanelFocus() + if addressBarFocused { + addressBarFocused = false + } + } + } + } + .zIndex(0) } private func triggerFocusFlashAnimation() { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 376f1eca..87ee1b28 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -214,6 +214,41 @@ final class BrowserDeveloperToolsConfigurationTests: XCTestCase { XCTAssertTrue(panel.webView.isInspectable) } } + + func testBrowserPanelRefreshesUnderPageBackgroundColorWhenGhosttyBackgroundChanges() { + let panel = BrowserPanel(workspaceId: UUID()) + let updatedColor = NSColor(srgbRed: 0.18, green: 0.29, blue: 0.44, alpha: 1.0) + let updatedOpacity = 0.57 + + NotificationCenter.default.post( + name: .ghosttyDefaultBackgroundDidChange, + object: nil, + userInfo: [ + GhosttyNotificationKey.backgroundColor: updatedColor, + GhosttyNotificationKey.backgroundOpacity: updatedOpacity + ] + ) + + guard let actual = panel.webView.underPageBackgroundColor?.usingColorSpace(.sRGB), + let expected = updatedColor.withAlphaComponent(updatedOpacity).usingColorSpace(.sRGB) else { + XCTFail("Expected sRGB-convertible under-page background colors") + return + } + + XCTAssertEqual(actual.redComponent, expected.redComponent, accuracy: 0.005) + XCTAssertEqual(actual.greenComponent, expected.greenComponent, accuracy: 0.005) + XCTAssertEqual(actual.blueComponent, expected.blueComponent, accuracy: 0.005) + XCTAssertEqual(actual.alphaComponent, expected.alphaComponent, accuracy: 0.005) + } + + func testBrowserPanelStartsAsNewTabWithoutLoadingAboutBlank() { + let panel = BrowserPanel(workspaceId: UUID()) + + XCTAssertEqual(panel.displayTitle, "New tab") + XCTAssertFalse(panel.shouldRenderWebView) + XCTAssertNil(panel.webView.url) + XCTAssertNil(panel.currentURL) + } } @MainActor From be9b994a79bfe425b617f2bdee2f1c0a1dd5d979 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 06:16:38 -0800 Subject: [PATCH 042/214] Add homepage wall of love, FAQ, blog post, footer redesign, and SEO improvements ## Summary - Add Community (testimonials) section to homepage with inline avatars - Add FAQ section sourced from HN discussion questions - Add hero screenshot with next/image optimization - Add Show HN blog post with react-tweet embeds, star history chart, and HN quotes - Redesign footer with 4-column grid layout (Product, Resources, Legal, Social) - Add Download/GitHub CTA buttons at bottom of homepage and blog post - Add dev spacing controls for features, FAQ, and community sections - Fix hydration error (JSON-LD moved to head) - SEO: full metadata on blog posts, robots.txt, blog pages in sitemap, canonical URLs - Replace em dashes site-wide, fix notification descriptions ## Testing - `bun tsc --noEmit` passes clean - Dev server verified on port 3001 ## Related - Task: Add wall of love to main web page + landing screenshot --- .gitignore | 1 + web/app/assets/images.d.ts | 5 + web/app/assets/landing-image.png | Bin 0 -> 1909122 bytes web/app/blog/introducing-cmux/page.tsx | 43 +- web/app/blog/page.tsx | 7 + web/app/blog/show-hn-launch/page.tsx | 212 + web/app/blog/show-hn-launch/star-history.png | Bin 0 -> 438356 bytes web/app/components/nav-links.tsx | 23 - web/app/components/site-footer.tsx | 85 + web/app/components/spacing-control.tsx | 45 +- web/app/layout.tsx | 10 +- web/app/page.tsx | 140 +- web/app/sitemap.ts | 4 + web/app/testimonials.tsx | 130 + web/app/wall-of-love/page.tsx | 148 +- web/bun.lock | 9 + web/package-lock.json | 7548 ++++++++++++++++++ web/package.json | 1 + 18 files changed, 8219 insertions(+), 192 deletions(-) create mode 100644 web/app/assets/images.d.ts create mode 100644 web/app/assets/landing-image.png create mode 100644 web/app/blog/show-hn-launch/page.tsx create mode 100644 web/app/blog/show-hn-launch/star-history.png create mode 100644 web/app/components/site-footer.tsx create mode 100644 web/app/testimonials.tsx create mode 100644 web/package-lock.json diff --git a/.gitignore b/.gitignore index ced54ef5..071e93da 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ zig-out/ # Node node_modules/ +.next/ # Test outputs tests/visual_output/ diff --git a/web/app/assets/images.d.ts b/web/app/assets/images.d.ts new file mode 100644 index 00000000..9f3bf192 --- /dev/null +++ b/web/app/assets/images.d.ts @@ -0,0 +1,5 @@ +declare module "*.png" { + import type { StaticImageData } from "next/image"; + const content: StaticImageData; + export default content; +} diff --git a/web/app/assets/landing-image.png b/web/app/assets/landing-image.png new file mode 100644 index 0000000000000000000000000000000000000000..3b03077b03fca8a9b95d52ad4fc1de5e4ce26dcb GIT binary patch literal 1909122 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�e4?bPs&b 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�!UF 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%0A8CW;fIH{|8i3=Ty|?aywL^n>;2mHyJb_Dz~*t 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%0Dbhl-0)&$0G0@ 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�u=|~|0 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%0D8Yt{Vf+Fq+`<JKqEb=%$ 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 *GA|I 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%0D5mu(tc) zsT29^H$12S5*v#4`;!5mr<3)Cuc-7f-1uSkZ84U*ge#a_HU;d?$NrG!^ZNG-v{GdX z1>iqJK}9#4ZlsQm^FZePH1br#iON2)PIglcS*KF)g>JF4I{V{~y+-K8nspw><@u6M zPR(zbYW6JlA5Mix&-2n@Pc2Jz-h7|K3wl>gHx8O9AX0PN2{Ab&JO&jGt!)|&yL_wT zLHN;kg4YFOurpL>7P=XM#8Lo#tW?^~(jDY-Z`5GZ`t*M4eoNjU$eVk={IF8#xH7aC zyXSHEHoGXFCCYRrSYCFm*m$JU+5nb)c{pBiBslLu($8bK8~t}YI`1P72vq~uCQ%;s z5OmZa=)b+X-^x-A5>$5K<&Pjnkfk%6QkB53Ffdsa*ep%)P-jxo?dbhE+R)C49O|$H z0L5HJWmOX{QSQ+98e}M)J%LJZ)bBKeZ)mRl_P-DmFeCnR-p5;EeEpV^{dn@r;4z!= zQu7^#w7VYyI6E)DQboFis#0glZ3eEG^t{%lc2ls5kpICnZ+HYp-aqSN*t*3-HA|;_ z>Q*<%ik?UP+?wwk2V$;8R8^Wh;?VNC2mk2}7`^|z#|JLV&bR6!HbX@D1p@0vM6KiM zVK=^7Z#GFMa^}`oC!EZBZKEjOjj4mh*H&?~dHKNKeQyQ#+wOP(rhkjUuuOV7%ksXB zp-;T9(VS*=<7uAy^irlq$*u7~%jf+2iewWS_lin(Z!8;95ol`$k;Y8EvP(X6edE<A z_OY^Y>}GB7s#dE%;sBLq-V@i}$Py`O@MDQYztl}C6M?6*Eb%9L3~bo`D#-gB*y3}J z!xR|-{k4Qj-VogRlAP{#(XZ*~Rf_ykzv)wAB?$P(Z?K)bjTO+huj~YwzK!Z7U)hFo zb$be%W<47Y(9<Ms>feMlhrVL6I>!p_PWRW^a>oyA84q^-!a}aU>;Ke9TD0}tUGY37 zJ#cQS7G23K`RBs$UCSHLAXlj^s!Xm@vnc57Z(i5M4M!V{uUs(5A0$nW%{d+ki`!~X zDKx}#^cUw&ZjCDucXAF~{jKFM`sr{~J~_`I3A@Y9#GA9E&gik9@VZdkD%G9o<t-so zi<ZUGzP+{S0LjX9k0~pTjr5m2SADV7^J@byoe|j3wumIoqpmi_QjsG9##E9GsWlg1 zo)sHdLr3te87p-4v{64)HqxCP)wZ<Gn|N_$N(|c0Oj`-k5B?f{afHw+$cR<t_ByeW zscCgBe#)dvQeyS%z3lmG`WqXL+zd^k*yn*%M2?m9*Xb$A-y1tyr_uNHNiVLF`+g7i z`ViP6+W|FuadxBNK4YJ6loi;B|1stMzb_vBqWsKF9c>p9M~WnW$iaE^AYCH7wfa#f z^aZ}vFk`BQ7fZXhmgV>9KCS8-8r;yl*M5%3eE;JaGT73GG?J)(jtb=B;nr#Qm5ZEI z>D5OW3Ph9h!~=AW12lm3zTx@zhE~^Qt#|1R9x|cD9%x0rQVu%&e$MDAWF?ZP_r3wE z4;1@KgM*Z+5jCS>G(=I7K|3#Hl%l=Nf>Y^~HM?(eDuz$0%{RqEM!-X2QFL4@QGDFk zb&*MXsqS!P+D)7jXv6aS?UxcQ{um48Phb2jPD%M8D1o~1>IMa*9^yX+Jcx_0u4K1; z;GZZkkktRVFR#6F%}b~-Q&jaH>2Pmnfg{RZ(N{Tp8gzU}`iUOp!BVYq>e*CEHJ?B2 zt`$TBPmW{Flm`5C^KxbgNOFplP=pGromO0SZmJuZr`iTS`o>6ms}$nyAZk<BKr!LZ zN!F0m2^!6;$kb@=-Bf+nemTK;ZEPS~)P&57omYAv$d~CJxi-r@imkCg`H)`ZP$XVJ z$bu}>BBktQkboJn6oUtSWt$6@{0`#^y^~ERVvXv&lm_(qJ3u7<emKT}Sm84xWn<_T zrIijvPSgxfUb+r(-#nd8=J`yM>2s-pEvbl4S1Dp;pcCThosNw&u)!}#=3n+*1KEZy z+j2*D?NV=9R9;|{xans{0eR}>KZ9(`MNOphtI>OKp;PU<zonH2ZGjS7+%%n(bJm&1 zSP(V#do=1TXNP$mY7=E{o1iet-08MAJSxTh^JMcB<zS@maTO=*={9W<8;hY`24AE9 zp&|bBCxY_Zb+tlP>|6w421rFWsED(T4--V2Pad5KY-Oa^(kZwy`Y5H9%X)r?ON-NG z#zXt1pU{6s9USn%6Q(KJU^;Ip+`KERngy&taP?sX+KywnKSOz2h7y^Xbd=zJJU)~B z(=ihJ=ej1jM#z78838^c=E>3y*L53zF1o9H2lujNHGbA1#Cu-J_(=J*FU&B$>|<Na zw(Ln7hqV3Yu**AY>SN!%eDaY*eA+z(O5T~zdOS^VqV9dV{`gF|nqqio#ToliBj+zi z{mPX@cH<`a$p8R0PdK;KCey*fJ#Jal5EpS%6HyEL>B#13PR8S%Jv$Ar4c5}lU5o<f zbh_QImxQ!s^J&e**HzPL&S_s{&tLR|xGty>Us)X!8$yisCc_J<H!!vh7Onn`aUvHA z3xM0IEGeAbFuQww%D97cYhknrj?F0}P3m4Su9s4r3V?tAo`qXJMo!Yn9$8h@P<Q0W zq=Yd_2q&>AoZH+;KAs(xoOB8KnV5R`^6%B?f9*kD94votpAjBZ_hz*$aJGvAF&d}M zP~m&lRV%S;0b4Xy^D9HS^$yTPa}7Qb%`H@RrfA+Lt!L#U$9R*uX^Gh;y)92~629;) zi;Vb6K$$-J1NQ6JUcb{pEu%=OQJc#Kn{?k7H6pXU$%nx`JjyZgz3}%yzn=A&6<K=X zE10lwf=kV<+3n>IOHNA3X#DbM2yWZClt`GZ;aC|1hxT|c#IrJ-?qTSp7Zpoo)$2RX zW&gcfcW0p~3ReE|3VWTOIXUz&_nQX5M@Uz~pR-gxuw^_YotIkjy`_aYF1rb5RaYa> zBec$*o-ZSh-PY2}d+eHr?9u;0J?tlqy7=bvvGucTZ%vY;N|D@AkeY<kZ0%EuFz}$p zY$yZy>nA^<++Ix?gz%@_F|%j<12O#n3{<a+ceyU;u+qJcKBD<`6V{)FifdZeM7*IP z?$Tl2Bij@+xBA7dmp_4^`{`gV<sV!#0v6EMGq>kj*x{A^;Rn(XBu#1OK|sk3(&l&& zqq5m|zk8%_Uu8QpU}Ik)2Iw)R2(nW*n1%MNQoC2BUbC%SreK3*q$10Cryr0$1>D1J z(m3ig<%G?@>5=OX5GnN09{O|vIS@cAmcuV+rjpOUHd3KkJmGtuRkR-n&X)vplziTK zfaMEL-gzUuT((8_BRM&VMx=g5@LS6%dnN&V+>IwAe_U=VQ@uQv*I%Js&n(i2$U)lP zPcT2}Xs^dnrFZE9D>zInM%QhS!A}RyBtd_Li_10YX6P1hcf5jlNL@4%;VSet+uiDf z)Z~`x%Dr`39T5tjksj4oJf{<K=2c(C=<yWR=Ojlb>&>=MZjv#)J+?93+HWp~T$&a? zQPv1tqpnbDR_~kaeEaqnEy<WQ;;(bg$t=b^$#>mhzOl|#Ny{cNw1HEk*n1!A3F@L1 z56?EUol#oNihxGtca1e5=u~oXsk`@wRim6T*ny2gGikSAy7h^+{7-%14l)=${ca@N z!J}-MQPL`=DxL4$wbGhAk7BJA>Z{aM)|kF<dHk~t4~%uy^}Orpp2ug?SZP`{L>k^q zBMGSl>FutpeDDbUS3VM^725Q3<W}>`Na)#9DO-4~nD<i>2>-v9ca%9NdZes)UZ4)T z+wXHAK<&eY*#7Z#U%g$GG-6;o2Iz<jowUEi@yt;!wuKc%O`Nt6<nBiT>Nedg`*Exx z;oJd@V9v|%?%-Ks4p_mQTB!IAV{%T><a6abbsN^zCm#1_6xBLdKkh?3?k9S+Y3jKO zfBVm_xn+8)8agZEzw@R&c=5QlkFX*+?QUJvbX?oX;0Y?H)_?q720w}sC-#!I+>L1> z3m&|4Ezx%!q|<|UYQ63-^1>19#v&hnfFMT8Y0nd+_;5x5=aR>%3=8{EOWw__P4`wQ z1NW`xdi`JwvtgUjF7jTq8;+4>ifewK)NO=Ex!j#*ROG4&1D4G8+W|EFs0Ys`InxLJ zKnCLEE=I14x@nue5U~$p@ebE)Huhcb0P%l5$};jB+$i8faj*JV&6-2)s<TV_)__Wu z_3rY3N1D}%8PVfqV~Zz#adKKr|3~@yXCdwzH!|&-j#b9LdyytBi1tJb>{w@JMUAnM zR9T0s`!=|JknY~C=Co`gk8@DD>M`^&=*Irh^6)DC>LgY)Zz-_l_k#cGiRlhjL^a8B zC}&;paNDb_J%qWA*tjtX3>wI-8ieZDB%)o-WInUzMfn?>QN!fwPSSMK@!+Jka7gVR zK<jTL5{!xBXs)~BK42bMkBNBk%h`3k6x3&cJvZZnDctFM-6+Y^F3pm;$pb*SphC2b zgt+JM154zz<bk0YBXmCYt;G97?Sr-UY%aw+`k8j~xr;`ABTjmQ46@vV@kLdrrGiov zbAE{hUs17R^8Tdxl)CeEL#Rwyg<~$P{aC_2ZSwFSv)-qxpJ;$O=Y&(dfQzolE7&Lt zg7}BlHaWc0SRKeoB4MM?;!zPh9yu|@{*&J~B;1aZVv5~jd&Wb1@H@50jbk)(;bhD! z>`Mf_UzxN5ki6`9!p5&3@qN0)Y3qaO7+(nsaxh0{bL4vr2aoiA40zsLBZ|GeMTtp6 z;B0JD<8tuz>3Q_>t-335e;$b`K>IesOXw2ynh}=AP1e_8<NtVK{{!UyYs$tjo_Pxj z{z@4{+!-!cE=RM6O7zhh<wWd+9Nz0piFPZeU*7UAzJMGHNJVy(UYK8w|K=CglHyX# z>Dn(Yf*gAsA+ej4Mu&Cil`0<+6OJy5$Wl(=T?+`R<{E2-k_Hd_@zv1xT@?722`mRK zDK^WUZ*J^1vmz-mqOc*ld2)k+fPL2RaervP7=^*gGD>V*f&CU;=bKiRHTt#;R2<aA zJ;C&AE`KN)x#BLJ=RQwuxawXCPyZJvCHeMGF!(kCkrfSel&xG8xJrXeb)l|rTv1+> z>OVrhRS3PtRVGXxNeTOxy!kUhe={wp$vpx6fugWUI&$G<aICI9`Sk9lYGNd4&688} z#s_z$OHMzG6#w?XPwy!sxemjEUSupk1*gj=4v&2X56aLFx@ziQwNl;h81<gM3Q?^Z zS68h+TuQc;bG^dE%bg?YKIMuf9v>a-80wD3%V)4vb0XH@X~pL<rE*^=spg#h!qrx2 zR5!BN#gpk(O{K)K7|0V|4A_W%T|TXAG0kZ`#~CZPbG4P3g$<WS$>vxDUZ%Uu1vPfx zu{z7(x3!34(l=a;2=RSMFAC^kYG1@<kXTyuIrMZyyl%F(%y0cd87y>)4oj0;7AFFm zqJ{3il->MpV|)T0l<cd6fJVs0pO1bYf{agi+phEvhadnYK87Kzt9dNFc_+Hk2U)dK zq?)nK5c=>(draHFTL!2FD)Cz#XMaYoLb0Wi2~GS;;!diR>!TZQV83HrpZg_|zpBTA zLT<&~K1Xfw28bx^E$*+qbh;5qq2kT9Jge;JOn(!e3dCQ{Bc<ko`bK+vo*dkbyxMc} zOnP3~9?jlo@nfbDzmRptl2IXD{Zs@O@C1*Od<A}JCfycG5phAyp&g01s)L&*i!fu@ z-QM;J+(NWAo*YRZc0!yskW&=VcfVys;o4}zJ?%j($fG~@hd~PYC^+6n!XUXLS_zRZ zk0eHSNcm-b>c&qtrGvVca;PWr^hH45FbR1KR;XF*0Lb-RRqYjY=X@#*{rx%G{UnHw zvkK&)EV>u^B3MZE-De3>nRbO>Mb(El&NTQEnNn1IC?Hs>JyxHt)R0YwYssjAOeB75 z<WBrBKnqT8@?Qp1bCWxO-Rx@$$S0{a&*P~&>65VSu4@XBy?D{@gjAF~=_;>~-t)<n z;@Px^N;R?no6{%<!A+L(gazi7LF7(#s(d?tT|d^no>Xl2@jDNq^1oRCJWE9t;uy|z z=bEb@j*H_rJV~94KY6Hm6bsN5Rx_VW^Rq&V>Jf_zDT4aPW&l}93%eqXCcRYmSfgQ! zPx<ax>!{G*CquklbcoaSEG|BST>jeluUkJn;_q8uzll6^(^&pW-3f~(iSTOG%R2uZ z>79h@7_UJY|CVRRJ*##?kM+-%r$)l}W+k=9M`>*gC!tQh0~t@^Z&_Q_InBRD+|0SD z!FSOQp#c5S_$-EyN``A6jw((R)M4F`%rkC2cH1-_aZXRtGnMq%Gpp><ebb0syIM!c zyQcPv{|F4<*GIL{!+DRVgpsCS<PWTu<l9OV*QH8>QtPHU@g2Jm+=Bk&CYZWQ^+sAa z1{3b&A}{9=WOT63o*UgZ-m*p(ZAF)9CxPV)Y8kdY7C#W$GSru6<=t_s3fGA0ZmRp7 zbtgxUJG)ynTxfJB)WsJ!j<duVsYnuXAL=HyvhMkPpy%fxzsD%dkrE<K^9KSDrVb8f z`oHb0nO7tI`9lMO6@3>&=v1<@F9;dyaG3W0l3bImK(SSb!OG2{9VLDc;+rgZ`4jE* z;>Fs{8Rca<2=(q}79FO)5Bg#$Xt24%rE<vc*hE1X_J)Au?a^EA3Cgk_;#^wH{DXE{ zeN$l@2Ep1`Kf1s&_Q7<IV&xg-jIhS?jO+`I%THK12G7Z-_kIu|y|rk}f$nAt@lxDM zlc?M@fe3j#I6h9z&MY>t^txyAba!nKYqtutTN67}lu@P~p<BboZy&bp{<!h?{H&pe zbpX@oS3F2-=2I4h<i7RZJ?da9s>{uTA=oJU^J8SK(YKR<nVe6q%657xTC^GCf*&XU zMtd4$OO&in))B`NZ#5Bg$rPD^*}H=0`JR>@GBj%0{jS&v(1k`gu8vI3yA5heF2$s_ z<t_I7MOkFG0g+m}ZXRwmPtW^9=zNx)R%Dck&nbhaU&wzuw)$UqzZaVUj{F6+;rwH2 z)9c=b!bE34oKzdC9L{%&71v&00!MAu1y<2hlV^fjHn~ryEWlEFxK?#k<JwBVJv;1? zo{kXKK{5_oWzhX-3v6|D?6_><qQt41$Q7fglzBN%2+>-pz)RJaB0V@y{g_q2!`n*U zb$g-zj%B9Zgj~(KgD@hxv`gvy-THF}3>!@t8)A_{l?Q2cdcXVILzPTk6kntQ#PdkZ z_CF&svbY@2s~_sH1vb9Eks_Ev1Zs1(mE*Kyrb3Zj+FTOVFUx&n3%_Ud(~6J2eg?@{ zZcwICM>4unZ&3(ePJIZAFCsKIx!U*x@55QNSR=q!jw(KD#1}dNAE2w@dfmp9+1~U0 z+qP-?)|VB$y}Ea5=6ZG{)+sKzG<pS6%!zwOo-v!sD>^P{stn~ICWf(!o$1+PswitX z=f&>v^G?$a@76Mwx9{xJ>m3m$zV~LWL_0WV-0vNK<WZ?b9cdq-&z)yoF6`tmJiE$t zj-9)W4H5m*;ygikeMf+0Vm`11JP;RB2a*41_8g}mepTV5<_E-5Vysy#o}fGcCEDe^ zxZ-Va6!j4t?*U8>CkF)2ItbVEn5|Q)jE(b^2&<K$jqQW971d4(+3l?{RAX@`C-N6Y z)_L6w3v($fc;3))ys?CtAnDAhSh9v%ZvCv9m<fR2GdY}X2zG#<kYwG?*#3NRr~dc2 zg>msf7W9ijV`VX1^|sw3&sFDLo#*<7eUded|GGD2&jYPrAb-ka+|k9r7Pu<=_E%%Q zujWQ<2N4YT`QEk&ul56-cp9C3udHPB4csbPBRU=<UG&o|IOWAfKRV>D0b7+BQmdp! z%Hk?@R?_Nc4cUYDi2~z#b_(Z)-$tlQ6q^glW*Zq<E_bCxT27~06T)CC#QidGq&HtK zD6sSqz(?rptSzC$Pl$;W`&ge93<R-mo?hGCtpbfcnI70gY?P0TSQiQ4HzJlW7fhMO z-+#SEZQ<a-9LxVOvQ!?m45<V-KtI3%zAx3Pw^$q9HwgmsT$c6>P#j1hKH6NXuVU7b z;!yhaFIN9w%iw=r+<nUh#@0i7Va~PdiE%QO<?Uf_X$<hK?)_V_YIOXW9{pnHBq(1j za}Ak<Qp{e~mhas3^F3Tn*vf#e@x;+#0$f|Fiy<AEbSB}&n$NaJQ1HgMXzVR=>O<g^ zq!4ao6OMse)l^rrF0*QQRtA#YkYF5p6Oe|i92$sl3!h)pfn2no?Sal`nJ#}b)iA0R z+k11+V#s^G?0#A#7kjuOBWGzIy`LiWnIH;XL+%h35&O^ITni6Pq_w}~8p|shQ&Oq9 zifLB1-^Aa`yZ4YL&$yv>G(gOl;V20FdR&)ms=4|5to>{LpGkLiT8kPFyZ;>F+HcNe z&@bdM@Jy8f+xGQI#qUykLxXZUI{<_%1}T}Hm>C2pFn05P@JsrO4|Nzw9#;>|-hVn- z>$pR1ZC1ZGLY^p&S>rWE?))6ZgSeTmz8nsrd3spN#>n@qE$7a#1^MN4Q-ZWO#M-PX zBKEv)ilT&%uda!hmP%xg<B4i_@KPr`mywAr_gP&=f4UzLytoUTa${iqTBTb5etF?a zBn{|vT+L(hq4ZbJ)XjY=M*oak<blAUQb2A?0K0uoQ9XsHs_JbrHQ^UjNxX_1^*9vR zZmeO*J@cGxl9eEJCn}l*%|gEu-Y9UV`KfbyPMY##wce>waPp$tSzvR5Rc9#Z7x=W( z7IMX!R`Ot3GTSPUFnk*c)O#+}^CeEvJ#%}zrdEjcEIbB-x`IZyTJ$;hIi@y{3u6r? zSp!dv=GK^fa`7}*^jy6sX>atruHg;$qI;g_O%O(s=t}F=ysHjK6Cft6>CAZ((p{P1 zi#?wg?0|CBq$I(OkJp_?-P{2mZbSqen-GipN5M%)dWpU;l430W(X$H)>87*jEn}*@ zU>;$&3)F%^Wu@;EPKsOI4szSMb)*bJbyBZ1(ir&>fP84I$y1TD!|~njvd+5v;m34= zQ3pQ+3&Ay(W*y9lSE)E?z^E;Ky5ff~n-l_@WE7H930#QRAsqH*MCljhDCk6Zoc~Pv z>1#aK?lX1}593abF#^@Zdg3~=|GN7vvH8=H{6`D(+I0xOdZNlXqr+92f`+^!;z;tw z*rtiC%ihfVx$%!GdnFMMJYS*YNODHe)`PD#*9e~b1rRVG_{a<?%-*-%ev2N{r8wzZ zuP3GTr&Oj}P8?v<tyAmPZPRN_ku4l$_x_29y~N%Jt{?`#GK@0#gNJ%!Bd|ED@2v%! zgl&b)2}yvb+H<Y(E9oHeK_fWTExx|q)wH-N1c1eAPQsBherl~AlG<8ZD>*hfC7%@r zd)0&Jz|dK4lJz9E!~Lyec*dQ;aSKgp_;pTBLH=?vm`smOUgPte9M=+qG;o=c7JL!h zPXcr;v83{5^!XsZEG@XM1Ht~@%5=4Qdjv&n@GXYQRb63=Tf!KWc4|;@gS-HB{B<3v zHt3)$^I^$J+xI1jYDa6t2oCG_e4Wp9nEEvLqf!6_8kX)et2q4u0u9;U2n76d3H_gg z|9{R`MrJQ|Frs694$LLHs@-Qz?CR%^G6En-DSz6F9e&VVWtt43&@4JmHw%T`uvKLW z6VBaMY0)p=18T-w;*tCCUXL*_n>^Zda#|ClbFv_vp=xh`$7J@3&SbVqt<W>Ch%III z2lV$zls}<RSjnK-Gl6)p`n=KbTxp4ODi2jjZ}E5&0C6ZoiOnr*a3JS)hcYxrEjZC) zv{Wsj*&IS1;vVtb)KzZ=TC|`CjLxdBxrV&$Lb_w<BkzMKFmg+D`L`lNSAcmPc7Jje zGoT6lk#~LN(mBt$z?LvJNhc;l)cN|kx+h;A!g;6SqaQ?GdsK2q0Ms$2RM<>jhYT=% z=8LQc*pkU`uI`RW&KDwxadL}d>{10A#>cQLcLb73pLJ>`OOydQ$WN@9ZjTio*H*Au zndo}?pcVnayfSwPvgJMqJuhuzFrkB+l`GE~)(fjIX#O>bs{1bAdOZf<sCe7s>62r+ zw468qyXqo<{_ZBM8IQ-<R%i&<45c>#gsC|1>Lez5N|Bl3#>RKDy34t03dFTC=EBQu zQuGT-zlXj>?`?R7>U;5rQfF`v+~hU572b9yeBc<cH2(6h9iO60f%ovI@==1IQ3$dF zQ6suh@LsxXz$b^!UP0ii_rtK2fx)lZgjn?weHWBhPA4@g=lc0qZ%pvKgT&L8LSgb$ zqp4I7<0kt(mA*J31N3YF#02154-?PCe*dF6<V~ClfM_X@-fuX747^(EI#;u<_xENE z`@YWA+mr+Jk-;xQQ<{@jN&FTef!yKn(^>8-!;9Q5>GNfwozd%u_T%R9#8rj7NFE6T z_u1ri8A>)(6;NEGK~N{T?qe7BdZz%aqQvMYkg>uFRp8c^-;4Q~cnd=~2pHXY3Y2oJ zSY&0EI3Ts<j5_ttso3bfdyqbsnXYDsYp%H{zx3u|WpyWmUrn49L3(hHZS{}gf`nD& z)RB^13q<UWNzp2((7bS10`urgoc}`8SAoLk8o~Ubd!(h(kOJ#E3H*v+D{j*HftjIr zP|Kz3?v{kfox8!d+3I!UVUk80s+~-0%|u8geEy<Br5*Y*p8+aOel1U=6QfKAO}glF zI*&dpT}X$u5lQ4U@i|9lr*I_NV*`&3E{ipsJ3bm!c+u*=hucy~F9nIta+n(neE)*r z$gchk!G!}Hj=^tr!+7co>H1b{wB|aig`fv*lcz>|E!MaWWAL@2<Y!-YC(k9T?d=QS zXrG6whw#h&`sh|y-Cd*KB;Uh%^!j;s_i?|qHnArotX|k4Q#9o=;lO)%1p7@cbGOg8 z#})7vIKW#RY8vG4kX^D`U(viV)^_2U<CV&+v=l2-k7vnqBU!WS_`cs%bB-}D1v85; ztE~cR!d7EszHYxaYF#cQ<O;&Z!176zJ=EJNrRY7_|6+u}auhE-<(C*n7y*p-Ir;Yg z%|7(6A#@kc{pY5msNGtWZ+vN%F0}XT%wYy6>CM9-&M>N-?~?9*jhm*zhmShp<$fIA za`fo=!zq(wI?j}cLw~2SeLMNXjC-BMOrL3Xm|_G${<q=7#~(9VeP}Q_h+6j{(`K%k z?eCdx3t6<JN31G{az7FG91E+b0b<w6b+kFQMOj|ZJ9EQ5LKXikNVTGLhbcbDN;rHo z+an%q(+kWOxhG4mn*+?*k?EQC_Pj+pvV-BK#ksa$1&soNUC|k9b+#I?3MQEjU#DHL zssjqJ0(_cV>O79NI>SZ9c&_C?Oe_umUe>NxX!tfyuV9<^aXuaI?AyUF*Qol=uK*0+ zaeZPuno;ND9j&|7%8t($l$i`7J0FEPfFn!d?XN00cl#GI*Gszk+)`6IS<uj*7vuoW zW(F!03A`Fo=2wk5kh=qw0Hz@t4s<6!I@2j+Ai<{UvOl*IELgbP_}%f>XEh1iDMQIo znboO=0KPsyaz3dqJY9>mo`32iwNmkAz^#BLqnp?m{jOkAXcgGPMV)y@EU=2pm9XYo z?8Wa4ECbI#QoFnw6LxUDPJc@m^87v{lb`DmSGrHzWoot9oci;n!n~IT&O1es4^XJl z>Lzhty8f_u)R=9Zc=UuZ(@vNeI^Vn4(7wl%ZQgDbSp@z!Qy|B|33xSG&v!;REX?G| zxh5jc{u146k6>hc{RjB6JD**`H!Gd|b5BtJ#7@MH*8BWKt)rzUwAFugOsMK8-S)X3 z^JqogdhM<AntIc;YSngKi|zt_tLLWbj+*^r{Ay1_4eV_0R(B3Kwu0zJp_BPj%T1dt zJ86+qMbiWRY_IDn6rWu<8><4+=m?Eb7KRlY-kbLe-;XMexip$9GxqJdcVaK)a?ewU zL-%LM2xKg#qUMi51klryR?5FNq}hP(c`3<{Y{MS1@0Vw~x*XVV9Q;^duSpTycVC+N z$e#L;@i(I{f?Y>y6xsKl6wX6!;bT-CFzz1Cj4O+%DrDFUMs|4$Ga_E8G%n&?wy;x8 zJ04EWe%P@V2=n;f$x#&_@@ul+z1aeTN|~!iK6qSPJ)$vMTY7+2e(j|}tyv<8RJ%H9 z@#IW|aRXgRw1=a&^;G$f<HLB*YT`h8)bGD;yxQCbDGM&0%+2Nie0hz-5_;{qLzLKZ zj3BJ<_?Xc2><_>-6aX1_Ks6@360tH&ARi7s+3d8mYN(4i8ibs@-iK5DIeq@uf%m;H z<Zmb|0BBcK7|$iq6po>Cae95nVnBp^G@coHN?~0fffFl`5T4qE?t>gR{CrU%*50HT zYwzR~P%H7SPk?BqD3HMzo(+n$i)=5+Hq3M4e`Z!V4GliA4&&)iLJxm4D@y(KYh^vW z$ZaB`^S%HztR7~>)?^okth7t5+R<*eH(y(&K^tVPFyS)b8f&?P$0uP`WiyYbNKL<% z%U&1|-RdxW4*HlH8#<Q!9~kAQ<qf4hY53!O2yQjob(&P~HrMFnva^E!U9ao(OJfk% zd4WpKQtzgvNZQ!1TAXhC1NWw1=VT4|uTpnj@}ohd`HgWtYbp(sDk~^BbS<l>b@nbm zKNF>r4%LTIQhG(*zk6>ss=Z38bZ6=XFeTr8BK?1(3qBQ7-V1DDsgc{Suy6;L7pGZA zNYg1z4xGvA#ADT#3=w;~-jvX=@Q(qFYo@&byvm|A#Se&EjD6Kkp{46~(8A9K09i`9 z&>DRo(=cB?l`L@}&hpjGj<r@6Bqix$RzlPJP%&4gXn!H3^bPBwtgs#pj(H^o^d}me zOSe4xAe|7Xt&BsKyX&OC4RxJc(~<AUpcNYsbJUrBKmQ12I0SzvLG}XO-{jf<$xGMB z@)Doc-7+7lPhFQHnV(rR#2V<hMx4302of$A1Hb|kDfA-dkp2-+Zms2H9lFWpf!a{3 zJ5Q~Q%K0m(Ex}(KJ-o_iDh0tvWr|vH-SYmtyEi(I3zMAsRA;M$D+VTu#ua`_JMLLN zH$yJ(RK&V#+ULu9pX312U6}boS;arqqBVd{<A-(&Lk#@cXDJKTmo}03(vPr{L&?T& zp{}Pu`slo#5+fQJFEXyj!7{9;<H!^h<l;w1#ZIFduk3$b?c4Pi4Q`H}M_e;ryOX)P zg0MSRq+y_5-R%D3P?R**(6axNVq<VGZ&!x8Rm_Lfo?|ec+jR$4SA(V^<hE72UGGKR z82JcRI1jKv*7Ip)(j5T0Vr_2}R)(&y#DK#u>X8i*aY9nI8ZW)aM5V`Uo~<wAkA3v4 zKwNHPPJk4}OX+<RPczJ;v&Gu-?rRDUFLl#a$Lf0hNz#{?9a)<+L;Phmhw<cvtHJ%J z6%V~>gdhH}12PXprovQ!HKtM%-9q4xsaaS1LLl3Y9Z6dVh6^8qEp400SU>;SM>%J> z)og_Prd!XuKCWXrjzfWoD5Y&gj9qfi!PAM+u!TAC_tl-%h4O&gJ*GIfJXL0)t^J{c zRe`qHZSNhyl!_?5?Qmi}%HpoIh^(x*kjtt766+f0oQ3yar9B)~OtT%Q_xmU~y2G&{ zSl_fM?W4Xpra>Q2=eW8qn8RbC%Ge=g@CSNCk$F2h5<ub@V_{Zx+GBfZefrjh5P-dT z|8pGfB;2Z~X@pP{#{*Ej&UrHmm>SNBX_JjsM7R_OsmvCh2NQoBb<gDGZV_8y*}LJq zaU<smi)g;D$NMTS_jsvMiSnb!DT!j+rqs2d=AQ(c^)9^T1#+;ax=l15zB3d*PcZX@ z$GTdM<eC5}wY@^2_&Brhi&vV-w@dX34A2xC5v9frv?b!}K`Z<^`=x@y6%y7j#_4F7 zYY`2u$1+o&Ovo&U?O}QK2y=rnx3J0g^Fmrpa?%hPzc8BU6lC9Jr<YZQ;9Ho5JFs|? zmlEKy@-H-Kjs3qKk3EfR)RGFXZ1ZYWbd!(!oGWdf3yk04us<2hY9#%hX{dMY2u`;? z)@HLRBL*yI4zsPbNLqaLz4L9w<IT>3UZplpz4Be_Yc?EZ^R2j|sw=VG7-)sS^HG1@ z^Pka!ur!<2*ZB{F+CP;Cwxq7=meQeYu-Hzqu(YyYE1+?<A!)eS;<|7JjqK=7CBKf# zz8X;`eMQ3jw@h-eOTo|Q2W1sbOa^o|k0;+riSKPYCg&3_MXwQKT^C;PqMzF}zo?V; z{$0kmw)*22aHH7!nyk&DMsgn9$255`SsFV?%C>Nrs>ZF?T9~sf;W>P_YXl{wuEOUi z$`7UTuhdCJ>Qcx{4g;dXtuIzW$K`IwJ14h*wg~6BXL+>{p;iwiW1@|p?E&a4rm;Gj zYolX&9N%+LGo!9j?0k?nePq6EFk2JvT$;4r@MvQMUTMQ7Enk>vXM(y_cnJq$fy$!M zBk;Dp`{C74k=x%yfWDCS!ykR&_v?(s<bU14ryhy_>wWp(Y^8UDu71Goa2LLud^c*i zW}HLqOHr$qa=~C%@mbcS<CBh|tZay5pt<mJ4jtxAx`zqdlHFT(&JK7evj=0x%kwbx z1j(Tc;L@0Xco_NU@?i-|A{8b@cgT2nEA7xsBjEE@%>WNoU#LNK7Txx{r%I5HR=%|W zvEClTv+V({te1Xj%e&7Tr$8hQGtF&QTE}uANLH3Z?_LdAgTs=rmCKh_W;Hy=xS1v` zy9$*UAKahR5Fu44h|-7L?favUE6T-u(PY#17ci(y;WN$<zeZUAPGR}WH|~4^oNeh1 zF%Rz<ZJEr?nPwl3k5?7B?o|u`1uv!}j131a&2dEvj)hzGpi%+97!TXewa)jTd^H9n zd@FggnYGhky#H3svaa`3y^Wi!i^z+?Os?weU2>S|X~N@V$4mnD?0wnv<(oei0yIu% zBYG9`6!su?9)x%=@m%d(M1!T-aBmTI0HW<iZku+z*Y|QP$YVvfMVABR!mM&@a8+WU ze$E-!=CdpZDO^mA$A_!olvUrOJ%|K_j!PCFPr_ww2%l%m`eZOz3Tebb*T=@kx4L|R zzI*rZ&3%)Zwgy%Ss{}rlG8rRbVih(GAtO#W@JP*R33L>GUOM)HYJ_V067PgUk?Kx> zuUHa*@R(FCCancXb;75VGRd)#<ub2(S=l7l1+`UGboJ7dO&0qe-n+FB5k(G%ra4a? zq@9W&p#BmWnr@!`_8V<^G9#8CkEqP6CdLWD8Yh}i)Jc5t$d3A&wF@J9>`G^N?fqi2 zFcp@z!0)TB#c=KFQtcnWFX8jwM1{gqg6RaJG+IH@*zNZ<7@Px3mm58o6eNExgMH)v zQ-PvK8QzGE`rmz6xhS?`RTaj*Mfa8nAx5kt*{XnQb?0U)V&SLc^n2{kMc7_Ftm*hz zeisA-*LHs*>^}v<^AaG8l3F}0b=kW52Oa@jP5-<P<l(8;T+d&Jh~yS1iyKj7VUy{` z@By6+QLi23r*+JaeJ^S4cKVk~(XJ`v4n3jPU<|)_v~>`IqBfrYs1WaPb~RY`b>Xf5 zG7?`_-<brpnDkjeRcLm`N6X*ds>1T^BR$q@ut!LBAXxoFDLbX}EM6c`>~GOM9fg7} zifD3Mk8>9{)(noGd@}pY8`Sa)KHaD?_Nkf7&~HY~2{lRhDo^<zA{VFyRi1y<;*f7< zIn9NG;+LO<%gNn<9T_9;ln<h$+LI(KqslWLZv<pPD@}@Mt7JEhi<%S~W)DxQA(hV~ zccqU4jh*aJKKaI^HsxhCpVfzHx7&@8=GAopsgPV`Q!)G@dCSS($zd{4U*~e&F+{Q! z;`v-D`o+JUFN}X{56L`1(9BxD+MZJExP$CS$t{_YitB~1g!6EHPQLwk0`{b2sC%&o z?HF*o+(8CsQm6l2pWpS2{nqNBKDr?NII;*WT5rz{lBt9YHzsHu*Oqva(Kg}L=bz(p zXP`13C6f|PA2pluqepQF!f2(Pkf;0j+6o!Iyo{ZeOG#ysl&CO1t@5*?=<34bL*RjV z*?`a!wv~hojGZgbH)ooNFxK&ysvkB^E$ux%YIZkRP#wr9&wW1NfBub$(UqrE!}xYO z%eA@D#;OgEHp1|?$LM>re>+^XjP4~3P>Hx(Z1lc}ef4wk=q9yJH9z(;^F*;a@Ug%t zPCR`n<c|t8;bty>Q6S8JD3E7FhN>%52J_EP|LZpR*Kz;f7hX8OyXSRSVME@}*pRc_ zwvnFP#Tj5Xu^QYniP*_VtF&WZiDYS!C|5*P_tSEa%eddrOqY^B%Aq5MdeM5r6M6)F z6f#oZt%yE=w8Yh1L?3znj-S3buz+0U6eCyGVy^U(&Sv}B$trc<IwM?y^LFQMM%sK1 zha2UtJG?heth}>g_u7qkX#W$I%Av9g)`5#sYfl0s+~LB@N~NMf%|l{eymv6>pmy~c zdkH~RcIE?Fe^@Lyq!DMfe5qXN$gjPs?Ko5p%8lTn*G`Dk_Y-}urNa22qVg6>uIKJ? z&?Wk|N2f2g@ly)!v>zx@Z2u7+Zv5zAoezONjlY)B4Nr(N6C6_vb^}&dIVy^IL-HCx zc;uROc^*4FQIBo<%>C;}UO&4SdFzcQ*Xz1JDM!bW-(o1D*P|EarO({v`Z3b{{>CIf z$X(rT_KDCq{9qQ)-NN++obVJJLxT+Kv>Hpnt7aOE=PsY?JabwanD=Zd_Es+qpL%qM zO-i{V0)kcZ_n0}JF+5d5O<p6F2u0R5?EVT-TT_1g%rJXeDvB#GR;tKLQWc$ZMBO63 z&_W}!-6q>dI>4IZfQ&=1I8*efY|>(Xsa7)ZMs6f|pqy!^$7`Mkp_@0hjBDnC^P)E7 z^}H6{!B(oc5%3EgZ79~)-lP`&#R>etm#%t3y&q~T$rm#GVR^b;FX{EYekqeFx;CDs z-Hx1`L5o*R%)f_L)5>qP%{R)3A~O{@@5;Y$f8bS)5?CLf>tRnU^nqj9=3Usq)eSb! z8aw$_K&_vclJ#B?-vC-_YXC<IzrSy?AVZkgInVo4wHDIQg*Q|TuQv7PjQWeCSm-iO zzh%@!1NuXIiQJ>8MgY>)5G*X5%gwEN6SR*a+}PcgGe*j=%^$c9YM7_A+jPtEea}h% z@#bCf6V%Ip=}DYckp1=k0+Hw_`T1H$6i8NTntnsWBD|aak?W-J*;ba26H^!5GeK)p z_IkC&cN#)A4NHrH^4-Xs2VpD6oK@--0+p|aufU$WEOxh%?#{#&8H`n%p4%-0*1ocj zh3G9Xwo^ok{$Ero<Zmi<Du_RYL+k!lOS~XLcKb~ax^BES%)oj*_ku+0$NObO{l_}5 z`=FJt+e=5_5#5zPNEqCX->TJo+?w8K7lT;xNd8NNloIZuN<u1W{y}op^@?D-THUqt z)pj^8s;b<I<f5zfX1E8*rB)53Wy;~i&sy2`oKN=M%gj=R3{V@Hx9<O74!CQADr>@9 zy=+p*$(TG@d{wtZs)2vYzH~<Er7RE7%Q;PbxcLR!P!ZVj{KGYtf6mg=|C<;5V&t!Y zTJF^q7<$f6q`Eb3;pNKPthD(z8nSb&Z1`EappJn6AzX$C@y%}*{5NF{;JUEd-OUnd zjI*HKEfFrKKjeK7)C8A7&s*tmU`-$X#f*N|>4#h@(bm^uUdi&v2qX0e)QVb^Yo|XH zvJO03!mPw$usp63qMsuCE`;q?xOArJN-J|4Y+te8zo<W=W?37f1$3B8Nz(@c&Dzid zvnbX@hB5qC<p5ex73Hk`jCadwXGt^dNc2@3qEO()v4BNTf{pO&2;NybGa-86U+s2% ze>q2;j)0yP=R-I36<w8cga+~`Z7wvDAOMx5WaYXU#(v;c^pySFhhoPe9i%)}f*ZZZ zSIy+5+@Z$T$r9PeEAo`tIWuD*V!W2<^dst8W2RuBo*xrCOQ7l>a*!|nb@EqWpey_Z zkBBk7dsE<AR`;ep44D|UvJdKp^a@@8pBD1nMpJq)grn~L?-hY-RfJgIEeW!cvrPUf zVOPwfuOl@i_1{*-wa!1oj`pw4P@KO@zYeUt7@{j4<gW9P;2yictQ%eSXn-+RL&w@} zIJZq?16%9KC7W^eUBQbA(iO!s5P7$l<hs0~a4GkFyDEY!@7{vaE1AEH73(ia;PKu2 zl?5W<3b*HOc%1*W0jS^j@(dq`Gs9nWtYff1PV@>g?df?h>J2R{YWVJLa-9S-voS6y z7B7RCmn>1^N~Pj`EHgpWzocycFsXThEVs2^N$g0OmjQE!qpg&R2?o3=m_LS%R>kfV zd4!%gljqG-8+8;Acdl<1eDU%(mPwD25K)31HT#m5BfYvB3f&)jSKJadjn68ctQIv@ zMnJFNJQGfhew=DRAe3bKP&vEH@W`gdITgmuEJ~em<I%8XnM~6tO+HQar~7Sp$T}lX z{y@i8V>xTlSnGP*1_&hBpm}#kIvwfLEjKB+Aqr>c)g|_SDGWM_P9FF_tA}hh1{&8n zNKe<CGxUT{ey=z)It~1K2dFI|;b95lXOGfMcU^j$9`E39U5Qm!+(22uRVpU_@Io8X z9)_o|&}$fg9~xOt)z|RcNnh~{TxdFJ@cUNw&Vj^!|Cb?@c=xyiNz-R?v`+<{-yHV} zZs`Y>nch^?;F0_U@D=@@VlxN4#xz`EBx=%vZzNh^z;pETix6>vx0#|NBYWQqo%+VV zVgeu@W+HMYkJs$8?#({?nrisG&|R8{-8->doUE9uT|G9p9L=Bn5uw_{@;_kU2l`Wg z&!>YwVFpq^GyoQsO5+t=sD%F<f;RB8H!oQAxnvy_h?X5a_pYLe73jXEwyKi;Fa#U> zh-@anTXK>ApP@1*b8>NdzpY1-l*POUnRGzwiXNcr94gDcV7f$Yt(6-3l~V{77+}Ya zCF9`TrRp?MSkW*jcMN3^N%6$=OPbK~i+)kCo)RloO#cya{ATdLB>asBr1J-fYl#l` zko`K9HCNd$inlFLzOM=xI~h=d0$B*7wze|C0*@GO$fTFWv|njP*|R(}BMolCh6b(g zzA|`aw)aB;Ld2A0536r<m|)>iEnOYfQ|5v|WL1@`n^z;?XD<JZ(X4AXN=nEfL@iyY z&s$_kKreq;?GYEZ#YK9@T)l!h!TZAY!!y*|DmIZRink4#JW_>>YHzOw+a->imdjjN zcz9gywX0iYW28S@SqkecHP?6&_-MDMV$!;5QZA9jCEuV**jno7!<~_|9}!fK?tc_{ zS{fQ{h^K4(erlnp7i%=}u>EVR3|G#PLDHEu_=NkSjB_Qi_s^MPTB%=G_Q&vKu}WtT z#j}kTM&1k}orV|R4{5Ll&i=v{yV*RI*9d5An<LM<9FI;ytc%xa)e)|)2R{zsTP~in zewGG`=@$|=!<Lrr&|BB8zP$bA6I>B1E5JPZ?MWvGQ9F&Rd%n3=q;Aa~b`81In}}a4 zLowdgEg375*QZXp$ucpx*lnIZxX2$29VL)0wRl+Uj8i}+#2uO#lKX2s3(gW$;4=G5 z*Jl-E?L%&M)!hzkIa_cV4?CkH#m2tC^Use=@ecQYxHDWT;Lc`wMgG?(>eD_0y-xMM zn9zD?ebo{{yge0m@PGcS{r6wYeE#gK!{UldG%%O%Z1a)4=Q;K=L=K0_9CLZq5*qt6 z=%}dLdV9vI#a^+pp|g;OUh!0(m7AvNLhd(;mB&gU;SE6IHdGdd7FBtpoGw!dyoRAa z7Uq$&k0M3YBpSP7`$V)*6I^ZEGdWqFQnZeS&VZA0+*GuobOfq7;${Zz;pTldhk*zo zT%cFDTliqbE>9w>kfYV5(9og!{#fTCqd5Mxa3PA>gEZwpLm;RG0R8{N+FQp(-F|DM z3MeHEB_K7Rv{Hg}Iv`TgAt{b@x5R)*N=tW2NJ+P-AdE<-lmgP-1Cs9z#`C!MIs3QI z`MiG-!-s+UyY98Fb*;6ol`cte;o)w6K{1N{u^RC)Xg8L9lDhhmN0#Ipjm5C?oFv0& zst5$tE-||&;4r5Z!&>kDoIfx>;#Zr_LF37aEY@UI70;`gwRO;)8G77L^@sI8dx!el zzwSCam@=Y%utoI84+KHMBzrKl|9jV`vq|<~%7?Q66a3F3NV)`pbT~GSoAle?KUiyg zz0%gO(i|>ox*62pE4BnPs8SZ%uB~ACIN2j+4!h!8JFJ4_9Z*Ha3h=l3?8HYw2KvKD z1;g~d>`gnCNHK)qS}7xV3>KCTb+trcA<x?~x#CG)X<!{F*YjES_tWeeTJQVwE+vRn z1b8m4>_||qf?rjefa?Ybbs9w2HMvX<xT%Sph|XMk3fl_(<??kkeQ9W`hOHZ+pZ9~$ zho5flNdIgfsUk*mUwb$K1|NmR4x1rjPx1;I3jzb1T!nyKo{`YWK5?N;6r=0s^nm<! z08FiAV@BQ=u0067V67|%%RDV+X%uiF$=uL$nOK4>9e90v0ubb_MszjCKSq0gY)VbP zxI^*(OJ_~s$6;Su2>NI1B*GY2$etLWvfNB$H}O^%V3~q*;Z+;iVRq!mMN?_Y(M3fe z8efQ0ujq6}IF3^YwnIkv^miZB4xWQJGG3|MlN@F++M_~t;O9IskG6FU?GhqBFgR1x zR$*>t2Dso}VJx&CF{0!Fb|n&~iu3JGy-;`~LE7u?_!2)c48aCYvBTo!!wv7S+GZ|9 z?_K^JMRI9-PNxhGOLACGWVCMYt`x~-R!<8LX|JC*5@5><Xp0vysTMR!2k(W`Sm{)6 z!M%hy3dwV9zSdO^7F6eUrizTcHNFaKO%aj;+vl#t54@Rpzi|P#6=;c-U&1BDN=tFK zz||75Hj;zMu8o#v5%|fWOLfxy+l>H02DG2~KE59432K(n|6{@8n*iO~Zo;+4ueqLS zzu4U<@c8rM?>zV7-%l_C7mYA;gMr=I$KCrVD4<RT-}x(jZyaw0@DS2h^fMsHo~cWQ zeug^&5bgVnVsp<8>O>uSFg*>eg-N=d-eWe|4YX=4B>1p>@0o|8dZ`Bb!>!_jMLVvI zE`;;u2e3=UGfUN45s=C24L4Ea(j_?Q)Yvqk&w{EA)j@zOkZAxU<<wC|ifab0K~Df2 zl`+pH9w4fXb-0ra)kevnLR(c74dw#-n*%n%G<3#WAQ$j=od-Xg2V;zb@Za~C*%ib2 z<WLBxR-D}Gz4F%y)bsvw4x<0}4A!|6EM+YTAd{<}<Oo9?+x-PW7|b?PNwO7L;6 zSk&KfVsE=s+D#rZg^BG1tal2=k_R0nB<5@N*^3W=Oahj*J|oWbR`fv252nn=Cw&5~ z(V5Q;9MJ^dld=o4o2Vf@?A+$0aNPx=OT9#SJz~YsR?w=H4Dr<s1KV)PPv}?5Ae6`P z98~>c#duD32!f!Dfb`jd=gS3|oJumOiJs|Vf1Lt@{{?F&IoQ5p`1dq9PzFS*UHj>r zfB8bshrde#?7!jCFSB9xJnM+}ln)lVao!Pc{Uk>5-wkX3PtMd{g4Un8p|@q)+nNaR zfw~1(5H)g_Y|w$Ks^jX??OmYm0ZXA|{NgKWbzVR$78{U4^o2IZJ0gTl!v*@V9s0w# zpk3jknWDfaZnH&YGy7azNseagoZ{~Qlyf`Pg3k<&5JM8zh38QEWG1Tq2h_(s;6RR= zxbD~Ja_m&}149!z>=Id2)T@x9>9`2G;Pp4M@epA!Ax8o=i18I2brMw1q~cRqhM1+l zXm=7Jw3@4Icr3N&)&xK0`KwdyeR0UI8go0SF$Y97{0_}n-ruD`q4hhmqK13xywG}2 z<3C1pS~8420zVmyd#n*2xD?YDZTCyE#gL{W0eE+}Y%998DxN+Q*}>gThZu^EHjz3X zWcPDpu6R63Z6xOwJ7QKAdYZ1wVM#EDJLb!<8Rr>~j%bJoKz!L<&M+7!7v#|8M;f+c zr{f+{m4_w;x*EdLHV4Y3@MRg(_$eI?Q%e+|v)KoDu1M?bbNN@<f;#SSmKD!sj7cRj z6k)rjF8gRE{o{ka;-Dt{Prkmnv`*%K84QT5<B_rc(c{Me+hmt|CBpt~6pu8|_I#Xm zF&h2f@mOGb?P)sY$1fX~sAcMV0z~b27w)EUG7bn;zk<StZ!=nl@Q;p2%T1U<8wX1L zIQ$S*J>^iVEUpX=t6ts?Z_I6h9B6AVChB$Y!EMHod+1UA_nErFqu$3H=RsR_F|dkP zZZM{B?ATQ~awVhxXs$VHxk)>yA$8z{tVGySp{6Y}sE=)_h`e4VJ$ZcKYenAfIecCJ zs$VI(ep7#tVC7$zttI?|&C6gh2lLj*`gg?2{8!D+#-ab!svutc>$ZKmN~T;RpKx2_ zO@FFJfs|Fj*M_Q?0<CXD>;~{)CbrT`23^&i7JQ^N=|So@wS#Y<P@Wc~Z%S*^I#@XG z;s1G4(E4yzSvvW)d1iXlUT-Sy{_XQ=|BffVz>dW!z)sZ~&~pv@Mvs%Fh*(H^pa>lu zLDQZyOyjNSCG(&gkVcmH0imx2SQEK0ZMU5%4Eo%awwE`fv)`d3b{Te30v+wm6&aPj zVr4lMr7@`%!KtiE+3Jr1p;%C8hoI_(@;Ck{(GD503d6KonBD?98avXGkT^F0P@tpo zh`Gn9C7lD|qfK1)k+vYZ23(=wDap66`u-8y)S2^xJ#bf|H$!Xxx`Cc;SSv?+F4u8R zBfAZ#>;F1byI;ei84sx>r|j!v%F)?Zt#^g)1g1ES-!K?nQ7(UMl~L9%g{d`7qwv;z zF`5C@s{r*kKAZdb`Eb1Tt^mB~a)dW~MimL2=$rZdIpg0y^H((W*1P77rM!RLr7&q6 zcjjTE_%~RZmElfc3$7&me!P!s1_W&C*|a2tOvSV9JY5j!dH`DC4ZU>uu1Sk{M1(hH z7=Tu>)t!04cucl0E&Q#VOo;xG{zZgvs9{+N#C_a1;X66{a|@nWyPXfZ1AYiVC~d&3 zaS)kS$q*;Ymp+J(+fslx>V>S@9ru7$9<3R8AdKQqo5oBn#0&Ij*m4m1QDgm3<bE>% z{kKJUKbF2wU6@VR>vfN0A{q3=L1RDD|Jz13+9iKo;L}VZzjn}m^7h27M%_lOnYU=- z3HLqu^4b2lk(@h}R(o#hR&UTzWtR*(ss*5(T{Y<<qpM~jUM_)FBQ-6bHJB}cr}UM( z_xtVZG0u4U{jqaE?sD|D59iPE|8=x~z5wVR;FXp&ExtN3nxD%&P#FPX&S9@%?c}H| zQ7U9*&t}WhT-h!eN+(O0$N|ApCVX_b4+6ixkk&IZ+l0QGkpf>@P!vHb3$-dk56X<> zB|N`DA0+t7^i>9i&S4>@SEf8dLR)(<eYI#D<AYCnK422f;UJaW`R`pZ2=r$AO77O$ z2jQaMz8zNOXmy{~_}2F04*nV3)t-L;ss{J3Z-A5Zn{mfQ{8e-iZ=-vrGtftHl9aPQ zPjr^<ssA~JGqdtGApHeR8p&dq$15~($4*zeP}_=PW60`|vb4Fv4!%u|J;ln~*G{fo zD%&LdvR4U2<VLsF;~q}0DOk15w4i_p^lUqW-=BL>vV1-s{4VZn4CE<t;%1T3zy0!m z57s3&ZxGPoNZ-Vnet|*Y-241ihu!_}c)L3e#VnHWgDgMV%T41Q!Mvjor$8A#f0`zN zc%h8WU|a-&Pryt9w_r{vmq&W)Nd~nj!7!~QER9oa*OFNI#k*du129gEfciTUT`q-I zg-n0{Zn^OS2zd>2UEaK-E4*V!br8W%y}M&rY)iH49m+9GfbJc3HXI`MmHecFPLtn1 z^_9VJAK~+B;adCRK<!~iS;`OsIoTMHVIBAz`w?Q;-qfa0u|IPQajhq2_`gl<{E+po z{i>D41>YsPd~yF1<$?C#!Jy?4vB5~;-n(w=zCg{fs8OBvlOn4QFKL}-bPAn*SYiyn z^3&7pI_=J!J1fD5$kF^C1=nx({d1VicxSK(FFKeP^BfjYgawhJ{Rd}}Ne7NPD|6%W zUK0>X^FCX%p&e;65=k#_P@znXfI*j<hWrkW2K?YCaJ8!jGG?j1v2>F29`r#Rz8n6? zOP%JYd~6sltA^xq@I5I}?v54QHwwbr-lt~?`t+;~cE`zd1nEm#?jM}aMiFdh8r<4T zLx!oh5H1{H>p4ufGaX-7f_Jz9YkaQX5fIDO;iI*5H<QC5@|HYw0j3wvt(SIk9S7Zs zLwG_!<L1A;fzoZPNmS+kBL61yW7f5p5Of|s-KkPo<{L@U#H;QU+jg&Bne*4IY`s&s z=M*rO`G#!N#Kq$=?MCcn<^2e;-7-P8<<U=GAtg|g;!mC*w*FBG3Bo(e-|;>Z$(<|F z$z6HO@E=e4*3bOi@M(I|$45`-e#Fu1S4`oaP?d+r9-DfYW<kEwW#9=4f9wiiG=<AA zC{jB1>Xu04DTZvdhP3GJg!XfViIPhn8iwVGc{B%XO+U`!viq?RW!d~n#^@C>W2Tp* z#J~-n3NGF#YOaJ8!>}HXQ6&EZ<Pq&Rl?6F3A{Rr5)q+oaFgz2oZF>cZ8c~rpm<b$R zXclM!S><(7qE6-BMgOx<#~SjhaSi`9550$2bgRc-AnKjkubjr~^?Y%d&cCm5dd-=T zG^qR%uz{jzuY^M3vLEJX-)p&*EK0G8Ep=9{w^h4^ZqtcX##5|1Q&=?xUiS@(ssYe& zUYKyx34LomTJPoAKE(F$CP4dRjDLu!|3A)|OVUt-<nn9Mk8ew)#KLxf8WkAnGQ-^# zaKgbR=N-L9TxG{Q^Nfb*AQSSUD#OOqL~JRXi{_QI93`T+$v=6j88yWplFRX(wu2It zbuu-K*>a4{6kaavl*}J8ExChd)zi}A+Zc#RN6LnAtkm=rHSNJ~Q(<IXQR3%}N`Sx* z4Dk%1yg-;FJQ#cW8f6vmEFH+$I!?w8Y_a03hUH-974c6(PDkRuvi4s-Q1;5j@t|1$ zjkL=xVsU{@E#a?k|3mHj$n)LUlBDFkLknKP4PiECPC=@0n)h<DsBXN1@GlL7^I zlSBni!%VA@kLx8{h3?SGYA1dtucX^MI!RkgPi&N=ri48Pev?im1!vW$uy@V>U)(bc zG}agj2R<XCSuwsd!Tf`734Nj`&3SHWxHfx6`if;l51AX*d@f!cr$6E#fX(XZ<Z}nk zR8R7Ns-7<Xs*=qqyw(6VOY(9*FMi`Rw~CI=24zZkPfiRce^C^-uczVTh0UO)Cfy1c zQZ%r{P@doTmIup1z%)N1KB=*nzXRP+PAsg~zs^)_2~!AedLx0aA|ss4%1~YnT4_kt z7*8fSb*Qd9oH41$P(k#U>y4DUP@S1gckL8U_0=UX0Ytw~@|U~^Ek?+Bk|1;~=q}0H z)1i~0%)M__EA`nL1+G>)0;keRhrO1EuB(^FvSw+93N;<718?&le>LOXTzsQSs#g2J zNa)Bwdc;4Cx5m6_eRwGJ#d-&j0`-<b|NUpw^ZW!G?Pu)Y{}OBfdsZXyk06)NWJl5t zMpjUwHVOD!GoX$GSw_X2q7~)qx~g;U$$1+IAYkSQ%uFuOWr)!P<w7hC(|~Re`2t;_ zcZos>k=JW@yH<r3rZ(0}g%mP_rfPw_j>NE!#E3Ip#9G-~r%cX^l>jsHCYb_aL7LL> zjAR^uk#%0uSwM<<j7VScg@d55ZsL#rTMMAIqW>QCZV0Z<PO}|(v!@nYe4|~J64`+= zMDIRN@nmbguGEzMERn6%*Sf(f%c;X|YO{ME%*x@|;qYx^{d(uZU9&s?icri{Xf+J~ zn@m@V4#%Z-;ey3@*6TD=uooQFdm74%%Zgde?_sn2wDqLQX`9r2UeRWxj=>@-c*)L5 zajYDUPU&zcU1fUI^s12_H2+a$)aqXHyc!vA{+B+Mxu;irN#~Czv1};~JhhBYf6^rH zNQtw)<qwto<v-JDN%h)4FaCjs|N3tLfTz_wE8FIsjcv&68_7}Uq=!lBg)RETR+-9C z?iz{??`Kl8`Pwb?lP(#~#|t#s)rrzX&Qt9eQkwXLIedUL?epslkey_(vtJgC?uo1O zV2hl&o=n1a7|)!@L{*;F#?gf-2!!w`WAgADI|xyP(wS@yTpZe?P2?y6>45;d3J0oI zKdyy-GR4m&iXvmC!aF^5{tik3RhjNzs|(agM1kT`5vb9jI{6I7K#^|^pX;q!zFHfY zk~abs8g2snFNF``VB3p4R7p1WUMR)LnfjhdJy`9%0v1fOW+&WHkfBp5H&y^0YNbV5 zrQ>tmX$C6&%x`|@FDVx;j>m$b#-X=QB+rgd{o!BW+Ed_H-s!Fn#vcy*1xG}s*Or+m zoTf3WJeJC$W!j@}T1ZduzGu}aGM%P5{A?V4^lfZUu;eARt(l9?PA7zSZYW&!vF!6- zVmzfDpM?`H|5oFP3jRkgQJm{cm743BRujv)Dm6BG(aztG>%U{s2*RJL)VM^qXg2Q2 zi8ztNIPndXsi&KHM@@?JXyA?f9IXT)bQM{C_>e}RdB7d(Jip}UNzQ506uD2i8xUKY z3EZB=Be5Moc9aBc2e`F@2_4yBj7!*LgjK!qd3aIJJA!zv@s~_<#kTtVMRyJ5+=u;v zt{A_VHkJoyL4TbK9R-YlvO781m-+5_?*A%D-L6h@d2ugNj@>E1l-F@VDT!xMXCnN> zY`muQYzl6$SkFBPJ2zltWu$x+Oze&3jCpqc(#5Ot_+d|Zd!})<I)W&*7R2JPS9;$x zJ--d!WO7;m)(j+^t$@~bnMtZ^o$pI^x8E*I=r-D!8nev!M9fEd0B|w#KePNBn{CM5 z{gtWhW)k@AQTKcvP3ifd$g}c2&Z^!2XhMSeVE&tidzv8cYSC-dssr&jAC}R|f)2H7 zjkXl!F4!^Qwz(AT=PXzmb!TblW2~ZqF?{Xd;~4MJPI(MVlUOrqsdsqev?Zg0X1Fzf z=#6nyfI``wV3jW=-w$W2j1BYIL)5{b!LK{XOmhZ{X{h9W>1W79$NYs{{`*6x#lX3H zrun8wG%0b3$VcY8Ul{Kw*QM2+@B^;PR>QdlY5~ch;0C)(+1fKbb!pBAUlept@$N|L zCPNWsatQwG9R8chXX^umNp_lR_$fVLBJiKe!O0;9J!!!icvhy6-IV~8saPV!`Jktj zYulTLQkFl*CLYr{<Yo9V5a7^>L<r!+IXPq+>`*;%h)C~dtzlD>V2>TCG|`HzmhSC| zcQ@5Z)_#ds41qZzm#<E7Z-`dHxYBgp7PB?VjoIE9oK;G}yyfSZn<m^QT@_$1s$<?D zF$jD;1{zqWzHEcBXCR2_rJvXzx1<ZCZqld`j$S$?kGw@t!&%vaE@q01nYLy(ihnVO zkB}gM=48{==y6;lRIYhqtFH0eD$cHww*mgI{4o{a?(v--<EqnIJ*#bh1>U3YnsBBS z&p`=|cdD?Y!%fS>tq<KrmOsjP7rdw8h<+A>ddoa3?Q*V^TBQTn$w2#3MWMxwQ?4e@ z<l0On0g`{X0FrYA?r&fwc|JeVC$8i0`&s{s(E5uU5f?nCHEX2WJ@2FC;6psK6e*F0 zx_NLY+o55x(z<S>Ljb66-R-%KNnhdTytFCqF%V~G%Ch0j;UM1a8Gmyi3xa*Te?im< zJKR@M_oOH7nA88*!)ibv4Hj~p{jwlCZ&V5|Ksq@%tK>JB?w4jrA|Cm$=R=%65zb|@ zg-E11lxByWbTL2$_?LW!l>+RN*}Ir_f>Bx1dij~0fsLBFc79;Cexx<z$H#kNREv+= zIlz={IZ%fhrxeFI0bM3~X}S8Ir+q`u7OpgHgFQ4WpsZH1yZj{%MI>w02(+C>&xT80 zjDitc@z<U8B8)`JPu<gt1%7(lM@Y#F)g{?<3@%<w;CZg3&HZ&$!!d+E(YtdkK$e1s zL#42j-0C#beH;JLxym1H4FShC(1O9jDg~z)ccyo@+m1h)J`_5tYwl;auGX&CY598d z>DJ~bgGIwc!0Ewz-lDN+-W*QAw&MCEKK>mfNjL!VA>&A8czHhb7>7~!x7(oow-5RC z#mKpk4Tzp6m&{^07J5x^p;)UKY%Bd@pe2$J^F=ER8Q=2&VG0xTn38xp=SLH1krenj z7}w$B$X%hid5;~oPc-w;)|{PkL|+>2iv!i}S5yI>hH0LbW^h~){0pzND$YvPS}L}A zCRC62aaLEd7=G|BVT#b32N>i9A4pkIN$bpcgZoVlMt~(K4>G%Do6m$7HD5E21J6py zV;XS=Zh-cQ{vpu1`Z_g>&59MrVbHZSSYU#r5gMjU^*mtFDZdQ4&CvA&?4+wR|7h{H z2u$#30FA{nVecZ{+S?p2ms>{iV2xlZ@*&XaKP!uB<j6nNsdIe626RCgq{q|GGNsLy zI4#glv;w4COTQR+v2}GW+X}m{lm;Z3?46pd3r=R`Rqe?@UIp~XE$Er4NG{Sok{~H{ zDUI7(nO#&pjm;HycO`uvq*Y?b5s3CUi)`_2H9h?+zLUNB_L1?F4r^z=db8xiLxrxl zxnG4QRxFKO=96GxL0g5(y8isA0M;wh!fDVLKTu(&8WgUmq#ng*A-19uOv+{orYr?h z;pxc6^w0J(*zdXp3!STmhqanCw6(RZp<H}J7y7t|p7|pz!FbeKR;KMl<MGZB)N|i^ zXbNJVoeShJjWLILEQXSCaJI~lVbrpu@y1`n!@@MKW)Y{jtze=si|nQu2kM;iQ_&Cc z--_`IM7fWY68UYyil%o7GfSs-N3xqwc+C1Fp=4?XU0p!k=4D<U^Vsy0IGE$}XSB3f zSZL41J0&i}WvTa4eR25^FB91GL0sJ)2krN(XFo(GhsBv75!m#NdiOJdUwB^lqb#QI z>;o3Aij6@r(=Ta4dW?ACFVai9lkXY6oT^yZeP=qqKBl+g?4z%lD*oC>yWjiHq1lHS zS7-K%z1Yh9w4Aa;65<2|7#J5N(p9jqlxtKr)MYpgba0hxWG7=~z_)+B`v3Z2oOaTm z`HD(WOkTSnV^M<S<M9h!&O5GG%;rsYOT%2PhhUkTRO10Wh#H&0ZE_-k9)1(4zNyvy z_8)d|ku7oihUTmlj%7Lpu_0JMD;)W0GtP->zD-lQ#3$k7O45s`5+z9pl*_!u=;}ca z9TcnFSbv7wAwPo#W)Fvk^h(3c=E@HYuL$uubhs6SIh6ROr9h%QM!H0W{dxF?d*ewu zA`u-=xusL`nLQS><5afi*i8F#LU($lp#lT~2V{f(>vhZ4WGTxRI4D)<N7;5hV6HEF zo}L`58%+=<K05?6VW!lli(}Osp;Q90#Bk8rxAgrT;?P;|QVkp#wo*Ksc&A_yh@tdg zsFV3{f!~dn0^~Ziw}HZDA5c`kQjnzs)(TRHxbZkG_6@dZsHsUh%%9u^tpbiq-D0O6 z=KVQEjQ!8mf-b)Us`35LE~4*{e_TrQN`-+fM7cB*cE}VGLPCi%l_aa-68+`<ZqPII z;L~;+6SV(e7k_M_7oG>e(CDQn6P-zX%c7j`z*eI>3D;&U)TA$8tTAfWaNKMmbC9jx z%8t_?@U?I@9V)z*f<R#?EE%O}3j%gjV=AB3ko?u$2OrFS876Sew9k~267S=ya8`?* z9{GTdpDfNjYNoEKq9>W0`cT?5m!*L=2FKl{!JXN-;y2+vJxXuqx>D*{pF1TSg3yiq zhJy;Xep+pgMdY{nq%&TBbfk*Av~_OVcmK0(bHU~}_42k8zA~G5@g57hvd?DEF22}Q zLej+TW)8syTs{ThE*#ds%U0pYN5fSfuAgSq|9w-$^~A*ko9>)4Z&g+j_*tBkMqd5< z8iBj^>&pH4pcF@F3$`)feWh*MnhT@4A|`a56Pe&z1K~HE=i1|{8sjHJmilt+(XBpK z5ZO~`bC|y8+Jz+YG$n5iM`$(q8_%zoL?0VL?}wSR)!nxFLW8U`XS+eaT~*4VXc?nX zpAbjZDQY>*B{u}qb|QyQyH25hzZE``cKk@%2f_z_YApU)yW9OCx*;kDs9O|C$BAV? z#WMKa4-;n|g&9)H?b||$uKF3gVY%ujF=;u-8q?Ht*9=Gry501`8Vs_c$j2~n8l<;M z020(z<24^zaDCfvzG+ZVC&6b@Gbz%1(^!?YWn*XevLBES>+en<gdgrf(*v8D^*+5{ z`2@O*yupg5pkT4XXA!tttaH<-)#{0!GNbmVS`VIM;i9qRqwBP_t#}MQG*O=K(%T{M z?Fa8Kd;k8Ua@-eWucmpeM)|GQ1oNCbd`%Q3r+~l?OtbP#hL%LaCFMZ?lnUqxQ9PG4 znr2be|6)PGV@i<Xu|>PO4SHMqz__IoR6T-8o?m*;uES2g=l1Q}6(6CKV6#MhqEawd z*g6=-%zRNwO9`jpDW<sceFe0~zINL02Wr?LidE|qKkl_H<g6Y6Fa)9yiNa*!4(CHK z;*@jb--3%JyvI8R&8l*8aqLE96x_yzqv85)A;<T2pX^WXb|?fkh4|k8X{FwyJ{Q>4 z3o@sO#Q4GYKYUOx``c`&gnoP9?ax59|IYraF-%pJBzo4*EUyp+C>6s8gxQX!;+t&5 zyVqmob?%ROeVrS8o*%?KZu~?j$ckK!(o1Wdp3l8f+>YqX<DUCe?`L$hl2gwlu2o2S zSg}b?rAyp;ap{lSeJ_Wxp(IE`R%%`IrE}neV&Yj47{f|`Pq>x_26B-06VV${jAy~) zA4_&8cy!YL{1R^2VE!9*N-THzu9g<+D6@yiNGoS}RYK&UvFO6n?N^%Cvq$OE<TK*a z0yPk9s7KzctGvNlbNHci<g|iVc{usWq-AT8o$*A76g1Q!zR!?FM=ZQuCbc2?gHj2E zBLe9kyq1V-1dVOruP0yNk3D{Py*NaDKF~jOwZ}G%VR<-wSGcNN2N55EYp~|f;B-Y~ zS*xt;Yy56RgCRTPm2yd%C|b*~4?P}5j6k$%vSB7tPVatH9_pZ-!$F;4kf3gNXv{HY zEP-20g?=)0STW8Yryi)~DP#1>yUoUE3Tv$1k!b-QlqzG?YD7RQw(7Q|Awif)=Yg&! z>E$2Su3BvRk$tM99T~k7VQd3-#J+tu;jw)OOnEgVC)GMnUO;2V%Iz_5TQs7`0*<p6 z^vveL6E4(Se0h+_1;3nP*Lv+iBo|f}3kwU6=g~uoH@T??Z%)!zfifd;rOkvl<Adb9 zd5m7Cw#b&cL{8L*?DxS3(x=I`P1ro<11ydklM)J?yjI4i(W>`Ufn@%Upt9LDN&6WZ zZsRMv3%#oKjX=O4Iw}h8Z}xcOm5ip4Q{J4AJ1X3*5x^3}io^miV-pn)Ax7n455%jS zoIcli0evVXucgw}=O#-b`}QPAw8Mnh*qpFM%;<!K*KNHUiVq$PdEO;KZCwaV`UNQP z?w$jR{VeIpd7@0)Nv@cXe+=aeb0A64<c$e3OI(m|%Onjuh$yZ-c+0e#VJwoQYKq~h zVq4J=BCNeNcU`c=9$LT}tu94UY)kk39IgB`I0<RsY9#_{`iM8qob64#Z2EIF@e?nI z5d;PX_V}qO9ib&fJUhOid>5Ggd(w*$zRJ3oI-Z`QQ~CyGfB!{yC@(?-o19~OYWp}p z)ig{Q+gduG^d!yb)4&3ZTQh8|sgRyj7Sz)@E<#C*NW^`fRIsQnv(zy}7aJ*z=~2_o z<<T#KET0h;HWmxxUNwGzn&wA2yj+>d+~J(W?%*Gy>llECv?);UJxp{SO0erma4QF! zEbTNy^k`5<La$z{!oKboQ}pADb#)?WZUiD8B1N6uh9v5i9cZfHmPEb+v8xe;<^_b3 zQ-;m{XYqQ#UY8OpW@JRbaoi3`D7y1@|2yvNr}UREUpj7gRxij_pT+xk$EYL=qV`Yp zW0!pZ-KO<+Kl7&9E||}`PH<O59cK=wVP7fuxZ+R=3>)$ZZg+6+(!4!AxiVVkRN%1g zhFXyULz0;y?#}%{Lboy%y95Mg?&D45I!0P4TygMYKY-f`UNV?OycEP%$8<P1P6kvJ zog$r;XUUP5V!R~ow~CJ3v3b#?sqcFAj`esv@Yj-1#0;&(jWpL=tM_MU)47$&ulh|q zg(tGT7}rd`e*L<7<xJG7^Xp{%H&gFU^|SRSnEFZ#n=K8HU?zYLC@zg=yE*meC@gNZ zzv=nmxj%)e-SG4!H{bMSKLWoLFzWaVRSwZUYahrrt!aQfAkMV4wT&tK`*|bre_Nn1 zfuvz73lER)W1WwxYIk{z*1IytcZ6}Uzag1YHD3KR=`*VvP{HtJ*4>6so#WIwXu*;e z9gY0AY&kOXFU8cAX8rzP+n5xP$nD)Tpr@xN;3a5iYF0K8KXaZ~XqAwQB*X7ToS7S+ z;k7W?deH>QOs2ApTT~f$Qj8t8m`{8gO1?VXD6Z>1P@t)(iNmYu4}YwIE;XUeqQ>f* z7${>vz|TuqqCtyvDtPEhg;>7B`b}|bYs=A_c0B8r!q0#E7hF!CqXXzTM2JW{werSc z8I4f$jNbh<9XLPPn8FKDiseZQ>p~N;t`^b2*~S!K>due=D8-?J!Oid`yXgidAxjSj zk$LXv+U~w3^tZ3Mx9vg(kppqd+mAnAvm|M7$f>BSZAZG@BB$5<hFw7OLo1+hgg<Om z1KWVHPkVYe4l!(fkQLr4_|cY%KCs@@*^>&r4G~to)FHgEO*L*}MuurH^o2Zg18kX9 zl#!9~HLuv7@6K}QO1KXs0J)t*O_5=%JYc<3wu2Q|k~9=!Bqt}g08k{WG`;h#GeaD( z<m8txB|vBoYOkP;!KdJf7uUFCH#E9Ix93l3O|N!UzrvL87(`_aG7%d74SI^(PXbS# zp9TG1gZvRe8ui;3QD8V(B?h6X1e9d1_C9SmxxMptFK3x)|Eojy+tGU9lsqnCsjz$A zzl(0@)*7-mpgXoRyaplGzX<?6*p4CePK~Fn_Y?MWHj1c>-N^-L6tl3!&@Jt^2R8jH zD~CbEp8P^!mMnQQRS>KJ9vaL}U`|d=eE^hV^5w9gn%leH&}F67Yy6EneYioKX{#Y0 zmS=L3tcT!qI6{Um!+!bEB8g`ldOmL-ozxKQyZSOyJ(Xw3`o|tY^nG9IcOmMUFZ0S* zI|w~Mqt{yG{%r`DXm?49f4sqHtRl^{?G)2cuWSN)N0ryVy~XC61>pcDV%rE;S76&d z59CTW2({jMihxk1I}um&q>V^@<HN~GDMjr*MFn%jf$dvDO3DK0?GJM3c90lR<@*?v zt$pWk0t*9;7T2M2Yhl53UgYDa&;ZHF)Y0*AUA+b-f^8Z6-(dVF?)ZG;5gm>})@{-P zypP(9i{Iz07kadi&Z<q;k-iEBGm~5g!n{t&xUO2=h>%)H+h$>N{9%M}z=#P{h}t@O zUZ55tw&TjaR_;q3I$yR#tr3uNsL^KeT?_oM!A|dRH&@w@_Ap+?qVKPAo*1M?TNMUW zw6_a}aUTy~PBFt|8KNqO(l0*@&{~6SwYn+7JK!eOO9`*q8zXWc%Ol+trCnVC$MR+e z+_mJ9y9@6`t;esG%Ju=F54!y9j7-kdlM0U?xAoMoLN}BUfVNm$!p(78lJPoR0NArv z@wl9Q1GLYp#28T)<enDg0Gu#x&d$eM&;yLN!RypBk=H7}y#WX(<xVwA*D&Br2P9w< zclC1R?Igv<&JlH^Gg6Ipeh|&siMfyz6$LxdAZcwdHZt|NAZ_$Sn6O80JC@mF@9Q4H zrvY%nwGQfc7B8{0GlIcRD+0UK#5eqgY>0#8M{)Vd*7IG|6?W72Or#9!^ZP=4sKNMb zy6ARC|Lhjf*QBm9FDLM8m$-rR3k_0)Utl)^7*ypyVo(P<9QS~zr`Ug>pZFvp!C8#Q zbG&zMXX!7C^nNIDkwa3DA`Ix4uk=7(ztMB2Ex3A~?VA&TK`%}aLZCaKu0phS2i9U} zcJ&4UF)?g&bMrxDs@iTLIrk<A=HBmbJkso>T9*b)%T>~NoFjAkzm5MHH5zH=M&;*R zC99f@q!;Bmk`wgk1sUzbA#kxFx>yGZq?@Yt;fjeYH|CrP<&G(N)@J-+p$WDKQrpSW zXQoy3*6Pk2-d+xL?_u3G3~1pTMXcDE^n0#6x;(Nw0(sG6f^D#~s`V@f0#;9f_SevD z`{JPQox)T;y3TG3E4&WYT^HK~Xk9xtHN;S*2NE_Km{kV}Ckxy0aCxr+y;{{*qxuEd zl7_ch8x6_EtLHkC`hgeAp;n@EIYh0lrG#sH00V%{0KKo7NS99$89cU=;$+`#PEXKD zu05?`6g-qAG0tQi3O}~}Qp37RsBTOOlCbN$1N?8quKK<EF=uhiBh>}jLV>LzMfn88 zh=WC@3hS?eyk;*r(3JsCzwzBzb2iQ@LO!A>FOxIs@qA}eLF!V?sQlE5i3v34`(w`% zUzinW8oNK$MPP!2CMSQ;cita%l_OajujNj08X6H4VpYphxl=te^P~<ny1b(V@|K`~ z@|I`w%k}S9F-37OasjKuUn8sW_g#l$US#CP0)7e3E@`-KOT_Wd%UHs|H{lECcz1pJ zG6X*3DXY9O0Z25nfjng%`<eUZU>D!2Rz;!8nLqQUc>caCMaT@bGIAzU(AVI)ZT>0W zeCRgF!=$mXvFk2e(eTGfrPaxL7RYn{9{I!<Jx*Q(2Rmr+Bi}YBBqT(~#c8IrN7nw6 z<A@XR&k>f;;rPs4iY#(!R`^DHn)#ts^3jeV+^b&HF?GihE*5KS9doz)qS?WAywe;x zV&;A5Mlvx`=K#FJ4aiOQWEfh`^~p|$o0;5M2BYPn4D<G;?WacXwn&3plZ1|4Z>wte z@dpffP@!WMbPkk;x+Ef3n%!u0R(rA}x+%jS+Fu!4r9ZrF7KcbTNnv@|-B&>ui!@Gi zikNG4kT8k#13VKoQj%G(h!H2vu9bi3+gl-ZNuEJ>ubuE}Q2P!M0cA?Z=!dg>l3Ye- z`v=T{RvW;@AgDTib^5aGDhkk=`Zd?kTHUxt8Jgpjaz(S%(aHxx_dn~^JF5=H?e!s{ z-2-l3SS4WbDy5XPbX-Btcm_;baGpwf5Drp~_(#QHJW>@PW<W-&f})q>ohhKrI#(6R zLF^~-)N{&jzMT-^I$vC89+^+^HBh5aOTxhG_-a9=yn<Cx!2_GIs-p3@2;iVTniqB! z|L}>@qfrzzc+mvX8%MBHYax2bybT>Q^;O#CD`22PB!ivzmqSW?ae@6|L8j}mYwLUq zFd>sq^uNH(pAWVY&)TlsC2{s{Sq1;Jbq1l&Kd}+x+C@4X%xjYuUd>xrfX^;;Xh%Q( z7)a;{2Fm-*a#QZn+Q|_AOolh07b89c%@B*bbYW?p2W_X4PRzHjUw=+SOq_BFCjK5) zdX*0AONP&_`s-K&gcutFSW;n4&CR<sQ~EPtrgssOa^R(2^w)o-9}?*rbdO*p>?%SR zh}d|?hpl88G0Rh}3g=7J%c$+BEWo}?<4`y>){+kaBAn;h10UB4DCKiQ!41Z>x&?ZW zb^FHdD2Xe4LMcp1gK6{A@%E8S9459|kG$kRBAjR2<lhc<SJ+ML7^WojkD5RgBhLqu zL!EAA%!|_V3Z)Dh^Ud*h8B&*ji>5tkg5dRy%LBM~Vp%XKX?Qejx82F7s-;!qRyF~t zFzvmLCn@FCz<>iJ;!_zP2y5noK|&F*yAti#?+e&Iwzxm-ZhGvEj%m6yz*4tvBQ-VE z96<co!QS3+_Io5zgUJY=aK`$<vW=2D0><-$^vTr93Xlwc4G8L`#k$dTz_TorcZ>F8 zAJM&kj`0<c<a$L<yOPte4)IlXK;>0}i;GL}O$@VTWd1vl!l;k9CNb7#)@^_R`vt%T zU9UejAFE;mKJJI${P&h%v&BA!#3xt$7R8J^w3@`OsNa7Gwb-A+ZSy=n=xt+y^ldu( zj*QBa;N#&jL{#0labwp4K2-Ry!U3%JBbkhK1RL}O!~MQ`T8Pht|F#z;IN|$jQ*|B> zNv!{rE$9Lke2V@L=l6`3;3>!o05U^QdHJTukD1E!iG{JKa0sHw7uylgRs!qS@)B;w zsGrA6r9*=EZ{2I=*P;|fHxEQVj#kH|YKFKINz}k%9#r)8spw@858pqx%XG#Y&)kzX zPp*>A<rVlX%|CtrfpFaMzvBGQ1RLTct$x?AO60espm=b`mAhN5CmL;yJr3+BZ@kVO zuEP~f=#Fdofp~bU^YSny<zdN8(!6VEj|2BMEP(5<ymQA7&rQ*D1+v%`z8&9K*Buqd zO{HFvLJYI#27|3-kQL)JCKIpNWXwo}7E<(+g_R{7Td3RSpghHie7lt^!gRyX>wcJ_ z2r{9sLO?VndUlE`A_tF)%0za}f$FgI$y=5i>c!eR$~9i6Cp;eeSjRKDar$n(R+U<n z;q0A2Su~Z?PxjqWOPpL}mJi^!HZyi&bxtyF?w<f{TOOA+4(I-w1%HSOL9kx5H0Hkj z8kj@Q02`DoLd7Hvi?=K~!@Jv;>czjxgFW5X6%!pRJ+FTOb-)F%5o<sc>?VA5mZ%<I z!u8As{Tu?%L*LO7O+1}e=*oqZVJp%B<u<ZpBnk98K<0wEP|=3zU>WN?W)Z7Vwc}ZO zM>d_R0eYL6dH-E9Qql!FRz90=4G9W$6!uBHRy$F2n#H;qtlTc@PsTTcHX2gCx!csG zE~mP$4W8tAtaQhvH3Ind1T5Oi21@+`U(CJ`W|mO1X8!U!c_UcS#}LSx;HKU6|C#th zc5%gtoWrL-z7Go@?VProoYYY*``#D=gddc?j@gQW1i3EfmfR5Cd0{6-@)4*&f!YGJ zC*&G8^Nkx>57x52KFEldvbQfQXJrbC14<x=gxNohlafH(jwZqn4u|jB+d=K!-0JFV zYD#!-84NN1i|G?j5r6N`tXt@O1$wI!kMAkmGSW8#{&q1~bon7`OcZ?w7;X(WCJGeb zK#qnIHkamn9W@af$AWmpZcK~H?c4iMhcfJSmOAqv1nk}_;_WaT?J=R2<MuzKnr@Rm zY|6-Nm1)?NVt4U$cI(2sduyF)d3b^<Nl?F9J%DR@(r4VX5RUzJBmlCU&c|0}$Bu%x zIe!#Ky3y1}tstK~zCTpz8#b+=SJU@J7A(HZ1nbAy7#JA(gRZtO0=%hF|6Q*c!c2Q1 zE;hEup<5*P=6qf14I@{uA?}_@GS>qy?8|KV<JMzU>Y5``F=HS~_6n^x6rqEb4_KCT zxQ4oci+P##L(;xM+oF>am*t@ppn#QobGC8obNd0dhjFqV6lyF%D+2b_q<nn1?_D7b zxHVsno3&?^4?QdLm;jJ(%B_yMC}E7gID_Yj0^2uMoq-hK630F;oQDb>mt0+kOAH;G zu#b~JPM*b=pwB=IDK|QrWY=inu)?UFl-lbvOV(?}G*Jp9ptYHVUj&a`BGb+Ddeww! zHN#hcQ4VQ*gu(lsLj8HK_!0tyXl6dXxUV~0<RWfYvU94OiwpAd0zp{MEx0m2KQDxs z@`1LES0-?quwLQi?>w2Dxq>QdR*y^Yu=GF65!HP~6^I*@5hIqg<kM+Jj~{1hOv`CS zd<Gg2+1MR-NqBoB8-L}itKt{pvekR{x8?t5-fyGSY23)>-%yMI11<c*8Lz^>F+3C< z0%Wf;fqa3aNFKsc;bCMU>>LHc(Y(QaAdRo+`|O=*V(+@vIdEPBqGjRu<MC74Aqm-^ zj+6KLGfe2Ds9hsefSbF2wsCH>MzPHJALL1ZVUCN&3ljVqjMt=;)+?7^kaf~;+fVFx zbMOjLAL<~6<FW_4esGF;fV{M^CxLgNcepFk>6QW@lI`(nrti6ReBc`>rzR4lDJWhW zTYOZ`%iUG+aCgWf=gr!7(-}vS+(F?ZBk@QIHevq7Kg+F32f@$hp+LDT@Xn0yczk38 zvu_mGd{<{}ItbUutZsOiQ6>knB!yx5p*?<8xo^sg596AwMQ~`?rJLm%fb-`<fm!Si zp1q*LE#bbmHi$Sq)iT&CPT25eQLB`i)fOr%D5&1c0$$)gp@FJiVEs4gD9^2{Lw>n? zv$L~5h_o{}z(%f3QWBDdqpO$I`Yz7csM+1CeDvsw*_RS_kH7#3R>#`W%43Uid__U@ zd;5K8cvr)?0BK+)nqTI8es*E%7`898uXdhjUnk%O&xwFp_P=EI@N4I2e_zY<>ZeBB zKl$Mqb%ud<@jN%A?J0B>V6R`fT?eX#dEk28v9T+={`2==!~pEzt2G6WD3GA83f5NF z>|NQL+H}Ie@tqX?2%q(A5Oh^C$~|KoZamxL8+QoCq)X2*CCvZWewgGBJNb7pf`A9( zmgJPhfTXT6IiHgcRWKeR0#R!-crz;ajhQsGGk^LB&{acrRISc}Rj@>7l!=hFFQ3zp zC=zC4RX9z~O?EKMai0g}6hh^dF-@-8jo|i2j9hLL?C-8v7Uf7kuSGC@mn!{c>ohmh zHiD$m*`~#s(L{Y14)MVYU0w5V)msVYvI*Q9m?u|lg5n8U#-|<T7o5#3J0!tTev;E% zhw*mu_{J%VxRkA?5#(7?`9<JKZ+^^0t&XYM*_9Tr73}4xc<nQ&zor+(1c66aEYt?* zg&)B3y0Pge<D~%RMXqGTQInnL)%di}<VNyMKh!q@x>KF%-TO|$OqzSdDan~)p|jL^ zE9m}c)x~wGEUXe=)q3(C)_(06ZG0h%v(>(6k$Iix`t!$$6+LfKnuV&>mWielbMqCq zGos6F$YMxIHI}uXY{4Pk8*aNStfd$I^7m9L#u4?eUzJP_qu)ghU-GWo5M3{W-OjVe zi0=SJCDs6aMv^~;rn8z-9vo|<@(!`b((oE}d3{u5<lQg24x!&RIGuj8@Ph#tf*v*i z;XXIm%a?V1;+f5-NuW`Im5pt1kNt9;l8oL5S=5;qFy}z)?d`35q>^_~L@gDyA<F(_ zYSdlWX!aj^S81EDguw5O>dn^9Fxq$DbF3LL3yPx_+IjB}_tu1yTjoH*Gn)PV`4@U= zJ4=}WF1AbV9%wdR0=)WV5$hlmAxBf;s!@JYx2_LFb_?4Is39uAmc|;hqo$H`LXYW+ z+!k~xnCz8lsE03=cSYMG@5Xny@#x|@NV~ERZ4U47Z6`XfCG~YQZznl-;il9|*o4(W zMAp$A!JNEZ8e#+zc_@#nY%NPg2n3|ih*H@cI80Pb<9B~Sh6>%#kO3qzgCw5Ca7?}_ z|4|<XC=WgZ)#UEd$e3ScK`p|(<1a2wDa_-J@0D;u17B6Vi&ODDxVU_=&}rHYkD}M^ z%eSH-gzt&lQJ8kMrvaI+YM4RRH}u!L@z}Gm@0LPMm|fP3?GF<3^3wWz>kJ&2sFnGo zZ+U$0GS_>YHU`Zq$ureH9@>rudN!5CQjB8G1n&iU<|-UmE=xLP6}iqc<Xdkwlu|8f z5TiLwAsQ3Yqs+puzkhO>4o7oU4vp_wPEJ*(KOUtrSX9ldD}r%dNGQp9byP~H%CeVF zHsR*dXg2O(_zN!e*#l4=Wf<qwNm(6#G5`A5Y{d@yjiPG|PIxJ1v98KH^g)Q7@Pf~W zHW3whcUgNg6B*tjwyr0YzX*tP%W46ZbyjWPl&H8xJ?H}}Zub)T?J`@g!+v^v?<L7c zpp#%{tDS>5|H>DXais6&Tl_!=DJiK+MD>&7bF&$~PLM%E5QceU@}lrv(kj3E(f?Qz za9&p~f<;5xG321ohbr+t`b-&~FwhPk2DuyGjd;&OxEO%H;UoBq)^LN_@5yn8R6bls zJ@VA8&Tjj*1$j23gmAvrP%uqy^FAPaL=*P4uvDq6t80SLXge;&N}io{{~^;O%;65H zvDu0x{<M_T?Ym8DT>-lhSE3hfzVN|^yZX+?$!WM{;*c9AP3(JyaIr3vu#t%eiGuZ_ zSS^4|*don1s4UCmbfzx}HAwXCWF5iqeniLl<df2|B=X(KK`=h`XRINfNX@f2dUkGD zXlOM9MM0zu%k_2gBo9o-UJ9mov0a^g(q9$_&A!o6d5Sree;o&&ickC|^9Dmph5cu* zg6~rL)?tZ`N6(}SCD`Sug<jqrgxK6AVRspBP@%dhIhANj<LV?Hc8O_MZFQRQtIVzn zg|eMKyOGsHX}={e^wCDY?Yv2)gVJYrE7#x(Vql2s(4&&(Q9|;$+sJq4nluJ-Rnn}P zw)v~C-gO-NfxK<`vCw=n_5f#gMsSy4JgSv)@WK1znd$D=I@N1K*|i~x3uCHLnR?Mq z9vkp2vuF~cS!WK-=vTcC0yoX1lsos|ePa|3OAQlx859=X=Ne#KuUAcO&WL7zWIkv2 z@+>QRU+R4hJZh||)&Y3#Wvd>)o15xp{&kpc1ozyAmdMdS2^a6}MicJN-h|heB@rO< zd=adyRuns0eeaE~rmL%4uqRE*agMpAuqHDSfO^uv6GJscMLD?wX33R*TN4(VCoLcc zS`|K>k(P~<VUK;n4sT_YFS%OEb{Q=R?-ucfD5Ovbf|>iVnsBZ?I@jZzuBB;f%hsCZ z>3i-SQ^j`HRqzhJc^xYasEaeIKQgM8IrQR+FpC^-5}Z5ybpXe_IFw#<xYm{XviJs! zd!7qvX+nJ{VGrfqPk=|*y1wlxPeJg%c|G4~?{ZMy#rhJ{A>9s2MCk#xeugUm@AuSF z7+De>)I>pX#ATrJAlvcWWd0BwXki!Fr3x}HtsfM#6Z_TcI-<8^S7qrryvx?ZU1|*- zA>=9@s5s?3&Kwh+Z%==_zr<&L?<>>S2iZ#jJ5o`~A8M9#6hu7{Yex{j*Rq44a=h+j zR|u|flk3a`VZOWaCfk_GyqvY#)ynXmNR##4$md6O)lqjm!p+BiC{a$#TkOlFcX5QD zaX-b0u+XIRF403v^N8fag62Zq+DO#uL~cG4iHe7ZaHZ8)EZAKj50W5<hXllahH`S% z@9fMM`-}$lmE&JDi5+d|)gmUT6L0TUnltfiYv;?}R(|T)OQWspsH8|qO!2^~`Mar> zq{FU{3f8PDm!9nc)2MQ!s(QP<kYerzh8u?=##R65p7%cG;|DJ?jIYxo-x$-7J&Xa6 zhl=u-XFA=yEVB=C*<9cc2TxL7iku&0I{uA~Gb$6P!s=PHol$lqfCA6X&c=u=Q6nmD z=Fk|q1FX+h;sT@};~~GA2&VuOQ^4)puf)S~#c%(47U0RyUcjoM!{H_*=YBS$(@W0x ztT}+;aGN~xuq1=ab$E1M>;CwA>w^T>9_eWhOKyghmH7wV0*~e?=SIljT@W#A4WLfY zpg-KhpT<H>iZnnqQ!T(@G;0OL`jEqs(2V|2vM#vl7Di73f~LG8DR8^VUlduM%3yE1 zJp(uK>FR)^5*`JQ0~WoA$djs>*P#P(f4HcR0v)a7HTPlQY$rR}SRwsmlu^AJiH5jf z;t!%HDgScd;6DLG|1-J1bL>)3AUQQ`T$Hywdz#+Ygr<GacS9{QP4g;depiR`SKs19 z&m;32-i4mB#7mx?DM8E+WpUGL%C!v&fGKF~hqtw<hONt4DT<}pJKN;Gn{Ydc|CnCq zQdf8SX20&Vauf0G3xeeI{m)p1Nvi2GQs=xX3%d--(N$-e0{LN%4<_|1WtWpelgy2k zG|x<Mk4x%WWf*ZL?B=a@z?#;9n%!C*rQj0sUHV~yQH{vet`?1TD=K2Yw01q2{%zfG zgD-)SiHV%P*Ta2#*IV2d=Q<`V=ksN=2^0#5R^NB4kA<aG&%eCN;x%39`sCKR$Dk#g zJm)Bh2J^eYSb|X9a&i5uNZUae2lsizpCm)eyCv+p^#m**i!#_8yy}bDYA9qs6Uc}S zSP6|UDo^y!{Z#%X?@yoZE0E%2V`mf=-g>Lve)oyW`76Kf?-DbbbzoCX2IWUh2cIyY z&X6SP%)1~D<!&9g$(IX7mdudXbA2D~Lfl7HqNdsfV>f175g<>VU@hXx;TS9I>+q)B zcJ1&a2V1;NQU>GT$$b<HJX(Uzp2FC=wKluW@njdD-`pdd?jmy&N~$MMMgP&s&kZ>c z7F%AWpPLje$x48i+n8{#E+oOD_Jhae8I7T;iKXLw4BxXeIm4b=&$S0RUH|WC;dM;W za*NhUy@^3}Fbjhnr)r-&ZQ7mYV1`tru`bpWi~q=?VyE`_w%<J|Rpke~S6@-5kNddm zLA;ZcB`t*qZH6V0WV6PqYmHykY?;4?@+m*L8+j6;@swYVkazR#1?9KV_ejPv?_4d& zZ7{Z)P%G{;%5x*K%*)qb?i+x7YjLe*XLTURo|Bk%&7|acH9YrPEjmVKB#2ov6Ki0| z-@GMb>gfs5&_KLks>_|2Sd#wFnrXInEp;!yRH+jwb}g=MZeuEf{#>1RcHBWhieORo zA&bc=yVR|{waaK}*iUfc7A`OG7yRfc8(gLrvwC-M@BMZyp1qBlJ$ln};eEqY_eYRf zlN{B+c}|?*pv>W%BIfI&-eoRUst(lY=|p}A;WdrS5`CL?UJ_*ve|ywgW&`@S6fcik z7Livzy3U;1g=@^$3a)W&hE1n>iX(24+@0E8TK<xlyLZKa(=pX$WC>CD>f@%{_U!%- zSJC~ld;430y^4#y;fZM;IMf>JrAhBRpsXf0I|SsV)pmF6iz1hIP^Yjb^2rBPw<M2G z+w4vZCMzeUj{~)gG>e#Ziu%_?U_aF6PRYAxD|ZYV#gidgaboLVPEw^qe7e`SsTL&s z{Q{I9-+i8MY4>qCw=Rp~UY;9*>T}1d$j3-0^c>UC3hZni*$j*rj^!S@(YNj#z%Q!r z*htOGTBXS1QP8V8zIBUEiBSM$v@8+#=i7}*$%V!40~T{Vbd{dFp58+>GH~-RRd<X` zOm1e*F@A2pS+EhBbP!!%Hp_qP6mj4qytx^+O?R_>*W<p*w(sNAEPhb@AhebZe-WCI zBIL~KfwE0ZmpQ9l@tYFV(>G2YZL@H3y`1YzTUV{5q{FFyPrmWN{Y5h~FMUu~$9`At z__tP90GFD^;NiKrnWO!NteJ*p2C+KmtoYUV;n`t^FGi~xX9%p=x-{N}xi!|@)7=ZC zHz%dYLUBC5EsJYvVMc1jDynN8Hq*l#gl~7WGk8y3&{K4co)w2B8~d7A%|0oVCHpwr zXx)pwRTiJZ|DLMQ9hdDAEm=*AujwcUlNX2GVU3f0^o6MhFFAZsc^*h9de!zGEp4p| zgLS!@vYin5oL0JBGrP@;qdF?65_aH#lrBs>FvK3<FBG+6Ys=hiS>o;^Oj_o@`pE&! zWRjYg=)v3T6iUzCLW@=7E!9egNCT(m+m~Aey^LDFrAiM89EFz8y(~Sae!L~0os-}9 z)e3kuWo2;yM~mRG`~ERMMa%d%-ARH5Mr~dpp<d(5m}TnbWfw5Ms7~1Mn)ZmBG{I)J zwtcn*gf7U%keq`hjH}+Do1p0qKZWPb&#I8&=)ao{3CJ<V3H%bC;kHqFI<|&#MGR}% z9MtufL&hHF^K=Q1n^3-Tg3<5{=^#rI91<EAvJ$vzBvO$%cnF>jALAH&tAteKEmy=R z8<c|3fn_y{@c(f2)lpIQ-P(_diU<fwhagBJ-JrB|4GkmR-8Ca1Al+Tk-JPSL3^{a{ zbaxNT@ZIY3p7WmX4;Cz7W=-64{r28h>`v~4Lx<U4YRW6(t|MVwd-)mH`@2IqfWE7@ zE8`SUbNO>#r_GKf3(F0ekX=u28TgZj2e<4a(}1D*i0Yyx2fVxIv(X&i?M$PC*$=}z zz^10pg$ChSz$oof5c6Cx2K=AO`}cuoMCLmK_0b>*?x6fh4jq^e`JyVrh`uP)QLz%8 zjfnH?y&t0BdSh<bo`T82VSaX+_;{pT;tkhV?gH>ThY-?@nFytc1gzQ*xWgg%!H5~; z!U_1vW2`)oYNpETdSgo=BvXi*ILMYJ;HuWP%POV6uQ@>st}^ON?cuIQo&_U^b!Ib? zoVOfU2x*ovnAMZAAxzRKk+xT+v}C$fl}zu>_|u$dXn>6I>>3h$Qkk5!Td&r%B6jzb zo>n2qmm>^C9K=joemBitOVX%{g#)h5^*$c|$L~LXZf$-exT_^MnlQGs+sA1!-2Z@- z2ZD^C>e}ZVZ(hv3#jzZ*dn?h!C;c@4o_;Keh!=c~%W#I|Y*(?!h_-N&2&$(3xg=c& z-vBMU?KsVRr-E*G(19noqbJ=<X$2xS=GnKPh|P5EUk|yk;2X(p%H*m8C!Z9u!`lo7 zA!DBX;wW^-6zM{Ha(xK~jdRO#<{hE^cs>X^4ZBsOT}Izb!l7i*LphyVM{kayMge>) za>#!K3CG||!g_tM&>)-*lFfuFiS&2WUOS<akJ`_D(ks|E?oF%@Ub~nesPVAD3mXHx zim1j$O;5w)oNaGGQMWlrWV1urjhH~cdz4<LC-N~0?S7GdJF+^xL>)MMxFkkL-*j^u zbXx12!hdEnQ}2?R+%<hLlE;zmg}!e&R+yy<Pv?AbJ;%YS;@OOH!M?s?0DE5%Nhmza zgHxo-^@OAWJM8hsX8Ov#j$eGZ3?R^VD8Je=%TT(%Zk}?pTBATVNQ9@FNh`9}h;F<t zzox&o*ZQf#QLa%z4)Ex26K@$|h}&>s<YBDisu6<hQP1x_9pkS2AYTfng{WCLg(A=j zpPmaGm~ZiA_cMquu`~G%pCsCE+UQD%FL7k6ZhcP@_MDV7^Om;=dEHl*N`(~0oy|-M zEXF7#w9&A5HlK=mQ^vw?Y~I)WMv^mIz{pF5QQ}Koy-;40v;2ghe2U5J=+QlM>CY=m z?@DW8lP>zh4))|AJKDt|h}(!Av9=Cfk;Uc7?0}!wo8LP_w>|}=?J}}Bk%Z+Cp7k$m zJs{a!E_~)$Mk%V;n<hIsejxfLkY~8rT4JJ|#fco42aFj(fdEJ3y}Ji6Bd^gOTzRcL zlXhg8k0XK|Nd>#PZ3h#ly|2Q5pJ;}Xqs~qlm9T81JaW7){fH@)+?Ey+zF5!bb>r>R zcBp;#Rhv*`snZpS*#NcCpTg;G@ZX_yRH3>}ITW=6{>`g{_Hx<(qjY_T<9;@-u~h{p z$CNJrNc$KYy8vJWD14-sUI7UR9}#c<3Jwal9{uR*+77Z>&gyi3XI(Wf7Gs4}=tll` zV^!$;Nb^g_WFgHmeHZ26abTv=u-R55dDT>--=}2%6NZ}5`7tL!*&l$4h353~`xpX& zX2R`6<>;A_?kxFx?^+?_QEzoj&7k@i8@{V94ryF(uA6IGMyU~(@tW9usP~ogpVMk} zKdIP1eN;Z78DT{6qXw~CGmm&Evbx?StZuQ<$)C{u9SADw;!haLu>+hh`4o$J{SHy4 znLb)UY=)Y4JnN)UbUrlV1`kB95|h<?DgL{<yzl!7sN(_6<wPW|Z)y$8^MKhjS8^`3 zacXRq+fZ&ODvMc@GRGCR%>5)hY)pKhQ=nd{y_o9hh;3={Thhh+du3|I3$3U%#$B4) zEom}Z{i2cszg-XWQSDxhc!3<;k}sWX4Cn)%%$zhKf!=|E9~0r3?PXuOHk2)t+1BU` z38jB3hj^1t7MD>)w#yUk+`4wrx@;>1+mPi>RBn34&E*AEdr09U6h)+?i;361$A{8^ z%ecxVNMuyv6Nc*<st+L&-K!Iam+koTLk=rk-CFeX*XHb_3jrrn5`81Bq%&u;iY(2& zzqVqev0C{cq$`XW!#!9<eKb54$3zi&$donWYh-w;>b<(^taJDOWC6e^9S&~RtY%QN zq!}IRp0bpocGC&``tD=_fdN~S(^+RFV{hhgWOj$r4O2KZUZl$6v)#Pt*cr4Y8%!4u z-s2x#vLR8+TWM2^N|s#0RmM-8(Qo4x*lv{1Y?UA)(MUBIYaIL#$B(ow>(gwAdB*5x z@2nESpYTR0%QM^;A1aQ!Ng(V{Ae#oe2aOcKqaGb6#+!A{t{s=<q!&?d6UG~Z<k+CM z{T+>6p_5wi4)J`EH$wa2o|%Qx9UGhTg0&9ekojM2Ol!O@bJ%7oLZCCjDER#1%ErOf zuY)5iHe;p$(y|!x+1db4s7(Rb%)&~eF?SAT-p&v2?T(JuDiFD)AXEetALtAyi@-tW zx6CUBC*jL$$lig6aX`oHg@=`{#0myQYa}t3h4`Sz1$!B|;d_o3T!Czh;<nZId~aUy z_M+0C(hG&9p$bG9Tg)S|YP}|HWdxEGl!v3ovWzgcNAhBe`E}(gU})MhZ7o+a-w(t* zw&HG!UKjwjjhx#En6Ko^*MisN<z!x~5$=yPQ467`pcaX}MBQEDOBSjNxuGoW@9_8= zZ08k{leNYw4enVkW|7G&*T?sb-%5?kbyUP3?qVssPmipP<yjGEH`-TG2^Ey|{<JC5 zaf5S>ow}J00q&L;-SbX8KYs&k%eUuo?*YS}#gD_KVwF?dl(U}%+b(1h%qb;Sd?2=0 zs-UR_=&w(+#q)Cb`t{yKFYxhIjKx2fi-%A4p;6cV)%wsF$nnv}w(fxfpmxqG?bP}` zADFGTQ3W+l{-!fgABctsy`Km-=nJI8!{U!45AEW`T|akziBjShXvXqMYtTYjy8ozX zjL8ux0g2<c=Rz=$Qf(`zf^YH$v#CH5FU#DF?|Je;a3n|{=he{=aaNc|B8TZeKa}EB z9=C{f{<%m}y*@h9!MQgGRr0w^|GcCI#x=risO1f>FJkBjR|C!OFMSx}X=T$(;!EWw zjJJT(S3Axgx~FIR7V8RdSI6rQhWUl3srPl}1#mLErH7WY``^LE+A6yA#V>=X+<WZt zeo22uIYnL`v^Jk%fK_Pa&aRjLs0K<9uXl3kkBJB2h`=8z2r(Cs+ygsFw6i>=&k_x| z=)W1@WU3~rdlsI<irFyS8Il&ZZbxdU3Nl%xe=J6)wG`}=s@EtR{q3YkOj9tOIKKFt z_cJ>2f~U>kdu(urQ;6&Er!QTnV&9+5=%h#qsnHnIa*CwYB(-x&cm1vvTJ<ZT?e*LI zx88aMmw#w1C8GP6GumG|;@?*x4FR2%Be3Zqh)&Ljg5h7;_1E)PO4*Qxj_XSuyEc#! z0Yx^%3<!R}l_)%LaddJzyZFTAT2=k_Z<mha3#jQjHUP6M-lCg7=l?J1aQt%$6kAJJ zb_TqJ(3y2GUjP|udxEB9ui^HK+nq)NkIC#vE7TBt(*REAllyQ^Xu++GdLV>3$>?YD zS}Zql7Be3G{O4vuk!7x7Wx~6CF-8o>qiFl%G2UQ-U`?xMqmu|*1iWg3@choJ1h<*~ zpTA?&2Kr4R%3Pho2p4efrM9r0lJ-Hq7&x-Rs|M0n!H+&}Xr2zgUFTip*c+<BV%N2) zkd-h9@H?3k1^<<||7XPc?hxl2jU|W^Er)m6v`wtc%g&M!0b7FTwb`!i#L}}4paXB$ z-$Z7w`@@yKXE|%5x1nQFCTL)gO8B{OIgOM7G3atfNPPa6b6T-_SV%M_pDo()AwWYl zU*?iR@2>66*b4CA>4cs*g4UK?YOhiwb(i0Vb-by(slCU-=b=>bo|=Dure%Cc0Pu5v zU@HT~N7sydHgZuoKjEU_ObNmFwV&>bq`zx0J%HL(g(-7v3vaoCOd672%6EBZq{7^_ zYdpPfco7<c0_kpbwAp@gO-Cngx|NFN^S=D_Dy-)oYgUSlI2azn2@B7=-^oahZ;6qp zj|M6(W>arJ#N=#^;FoI@)!>pGpXAymOfK`K@;5t}&H`uVlcN&E6hSZYrIZludZ!n) zW@+nDhxXeZEB8|Fw^=Q?)$UAEq}MmD7maN#lW-Xj#WMlG9W<(*907x;2S?LL1l)Ht zUhriXh3J5abTY*(Z{Igo3=B-36jsB12JLDr;H-=MuSymhiCjRST(K8g-2VgAb6GOZ zDW_!OWs>0q{R37O^BAgvrpIpSXf*VrpbyQHYcI6NoCkJSFJfZ{fc5J-k&WniTd!+j zJA$1LZo@w}M!&^A94Z}zWmB|g?)Ah23CbT<x-u0oU*0Hi<O`5{kF>b4&b0dokO^+e zm;x-<%AgV(HK5~9KmD<y*tAOSwN3AgBr0GqbRZTw{bjUW4L@tf5MS<`o{mdh@tj|Y z`4M>sFTknV$$TKig>$71`vqUkx8%p;;SNTC*DzwI4iE-mzBoF8#b$!;j|d_7Sei~n ziR}$VKw0iB#cI0e(9tcNug`u<;Ylgq3FUtG7=nSJGnEeaY-VbcB{LmEAY=}Yg!zCZ z7C$tw&E64|n@rc=o<G-Q^=2SlAhNo;TF#~JG?~tt=gJPo`V}~j!09^zyZxYS64L3o zj9`K2bF!WsGbi<-T|YffeMaTW-0m)CDLF+;B4RP@HKy#+5h~bnd#{^!!jU-sL#@-j zA6a8sxX=bhzujpf5#Fk#6kg3}6IJtesz-|+mx>I+GL+9WUauD{BX=0;WM!WXjR&m@ z7!5Vi=5y%b&4Z#<oj~me<E(AvnSJk{%4>XHWU8C4Q&@U@s^9TQKAX(lJ|SK9o%2*= za&QhOLWEI;i2-AS{JVc?A8|2r1%pBXbI4}@0EKSSp;zb9)v3nP9f^>LoXF>rTX7BK z`tMFKFO=~la?uP9rBrL{BU?m^7O60YM-VoHue9gr;)unzpxbOg|Fi{>>Q`-~Jkmzq z3SE)4ExEh5gm?ib<6>>BgEs-(#Gm(r)YjHUsZ}lNI#yLoYOLDHVZH78yAvM^O3F_L zZJGaSohUW`j>7!|><^Ehkqah~d#nOhCi0or|AU`Yl^!Rip1*uC%okccxE$XA;>*YJ z9LmgiAdY}X8r0aaOfo<NU3}-x&4QohPGNIK8RUd7m%Nnz|1-Y)LC=Yhj>|hlJip#8 zcPWvlzSdVAg!GOFnD?W-Ij|Rp`kMGybL;H3qb7l{NX`s@CxKcMhkR^9`&hw^+KA~c zHXxSdI@R^^>-WH}kyEylnv6W^-lIw4K4B(#@O;pBJr4gyJDG@;pVQO7jK)*Zl}4nV zYKBjtoE(VQ2%qU7r(~lNZ0pwVfrOl!je{{Ry9c&Uq4lp4`2sUOz$&u_T}Qi)D!*f3 z`8XL-6w#F~eW!rT3%nS?{XdNPqbGM8@&D!LB=K$e3`x26L_RCYyZ9G3ZkN}QxMh`7 zdfERJ)oU6{&jc-MMh~dGm@dtw1V>v_<i*?wmW0CD@N_UiXT56`H}Hhq9eUpi@ugF) zKJyi`gXUcEfPsZu?=KxxIToWE2gR1<eY(4Zmol5j1d2O97RW^+P96+iPV5z(1WZ~v z9s-o$tEjrNve~=_CAm<wnUibMnWK|Q^%|#LEMKO24@QZRo1h3SzBL$&u_oOPm!&9N zzFBp49`toWvM;myQheKE^qzLhYBENev8&p!B$sI`ZDQ*o4nR9gCzYYJ61OeKd|!tl zz2=e$o9vdnXU<nP*4eqLh{XqDI=r=S#$dYEbvD0tJXS4k=g8eak6Q<}Hg;CpPk#o1 z;vEHRD@*G@2QIo~f=c%tpb_9oL{PQR*&JY%&`owhUf=p2oyODc9$ak@(O*me5Z8Bw z(|uv(6gihJm5+VV=8<Uz2CoK(RC-oXm6vO_$LM>xq;S+)HLxH9>$yrM`2n92PjJM} zaQcFW*F)5m)X#W(K*F#&45t`7a$9i7#N4{5?qkh|pcKD~KyG6fd^UVGNWbsDRpw=8 zPA6BtZ=&}4XpBJ?A8mpV1oU32iS#q|cCrnN5X`lWwb8wX`4vOV)jv|^XRnLTn;v2j zi_f>X<ji}WZ*H>{K5PXf{qmxA6SYOf4D+B{x+=r9Cla-{12m6;%||_kfSD&Q$2Kk` zBtm_>jAT3HhkgIxV8MmR<vZELZw%z0=)zK)6Ik>_y~ZH4uW6Mo_Tj_9_a1J?8yg!B z6&0i}*E>2^CWb10&&kmqaXD*I!IZd*u5qW3N9Zd=!q4(FL1$;pr5?^+{YRXf*+hF9 z#>*N`8YRVLv!F3t*m49Zs;x7Ej+E%R<Q~4(nP**s?~?p!xk!9VnsE1Q?lmxl98Nvz zbiVZlp(bC4icY@=-TH_a<kssj?h8M6^DBR3t==^rp^rX_H{UjyakM2U+(tA^YG4zq zU{{bAd}*RI))>3_8SogE!_lq|^1&R#c6oKG;a_v=TtI<LI8WdernpUT%%5O;KeN~f z33+rQB5@x9GG62uYd4vRs$P^P6@`}+_t<Sz6c9L(zSw5t!wV4UUzENDeRi!m3o(DE zx*TNQADHiBk&@;Ejs%;4SrNgEn`)C+8sDpb{3U4K{Y%i`PkenNc2@l+(>tasj0o?v z$@uQy2H5u(^&v3w90tDhR*KIgB_y^E9N#??w*U3d3vKdsQg379hkyRllKU>;&qVq> zUu0eJ8S!?v8qjYlRrv4GU`p_(0J^Y{4)+jF+s&?r)y#{J?)9wdBn$ylOdXfqzN@(p zFN#lUV0`PshD`vvM5XBnG!b=nweJS;9dYD=28{%O<k1H1k_dQO=V?&*8Iu-<h+>r~ zdHN3t10s7z)d7C#eIwB*tpSP30pidqi<+*gd6sAVqZA%P{Z|H3Mk3^Zrp1&3(ycMv zbw$Y+ctV-rLOY!3Bx;8IYPa2=wvXIp6*u@=P6Au-VEW_E_^l`SLr7BcKKgZB$Dn;! zez5&qnU|@V{H%Fv5x*F6qlr2{VF5XpNfrH!VjJ7dRSx0QepdqGnw)EkV9-<-*=a;w zhSE1#vGP}*V$U4!$(1y90QlwBe-(3nb0iypR>uHZ$W*g7DU4fvLwPYWL{m%*ziW;V z43*0e1yM!pV`gD~M=x6_?Die4@PZFlEt3j=w44;=@c5TdboVDrWsz_RFB$W<x(Jme zAEj70Zh47O8ZFxzND?!9tvMvRlb<#&35Up7f9=_(EYl%@e8Y?k&Y_cd_AIo#;t}<B zXZs9)y1<8~z@ZS0%&#}jQfFK0)PuRSsE0c;lO#6M$CROdoW#=Em49lrRAH~6kqIWZ zX`9&YhRq@`y<*`OUQZ6CPh0{PpLsGADAb^cc^Dkl=+lz!F?4h$xco6QqQ%qxj&x<A zy{+3EiSyovy)N+cp_To?qmv!)!;4F;h<o;Dz{ZwI{z!6O=&i`xjCO$e5x!*zE*LyH z!bBFHu6aNDab3r{5p7cBxjAs%s;4W#uQud!xCB);HGMhnHVCT|D852pXI(qrE?(SH z_^O4T|A>uL()A`4Iz5mYA0Wl3i@5!GyByD~9PMvpxNYU~1qrk74A&@uV!uj>Yk|U6 zZtsN^WU?i6W$<f9Q($g3ndy&#g7`Gv(f}W->r>1W)Jocuf?_6R_nEi`i=LP~mXoCW z+p}m7w;|gQ19pF$0KH$>y&nM|##ogYM!MHU#yk+^0d7+3*$1pGSo~MU49f8}B1*a7 z8qv4K17BnO>gp`VL%JA5#mvp=%5-2E>-|NSXO;uF-43I)@)m;&)xA?`UWdP4ox&2q zqc2_wXPyzwJ4LQ!aadPa5|u-c$x0Pi^2L+MhGNu(;-GCT(82p{eZ8|CbNaUUhKL1? z&-0==cbO(O?Enf_c6<;#HPkUi+|P)lz;qk&Dc)v+`U!J1a|z*$rn)Aq54nS0OqCDF z5X%p|Sh`wD`x!C>oJ5XdavII-%^YiVG23;?P8K!}`J?OdaE<ID9=<*AcSFK7)igfZ zl>y{~u0GhcCqW1>P?ZVL`6Sd-9~{uH&@W5VVGUmPYUy1SJS<SXD>3q^cJPH~-l`p` z#+IH&%zM^Ve(7(oyzS2r0XPi186@)&Xu$c)V~pOOGXaR{L=*u^sdBVPDyW1!M}!v@ z>i8ll>*DMZbbjW?=VJkoZs;x`P3-8e{jU0NCB_(PJl?hFJSv}}q+VCkYyEHc_FeoR z>`(4MUX34LfMU~8y7_Mf7ZsH#bkPX1v7$=l@bY(&@->1Qhk~L4A{J6Wb@pisFf+=o zo$*6jO)ma-oJraEXbM=mHD-Ea*z@Bf)2AL7<ygl<3)}pN>!`Vgu2k;x_rjc`56K`b zQi8;@yj{iq<O3;v#cuBL7oEDhn85?U4wCDS)_Y#Z8{YfJlnEpob$xJQ1&fFL@d**h zUr=S3hC-t9Byi7a>aN)NegmY|HR0?QugI5%xv4}{@*HN1g&4&T-CewEdvfy5plc>A zczd@&T^07ALBuq{^D6TR(rB5BKV(fuqvg2F7vhOZSwOkW1%BbwL;9a)_P2DEwC~Xv z8c<1z<J&?;q%DPwnaCE}gD2!}GvNfL#=3$oFeJ+pja9?iyAt*NGgSfAZnncew5_<* z6(;t2b?EayV9uaN32H9}n@Z2M*{fVS`+4Y$Iv4ffRXIRKR(F7ktgg3NwlA<2GQG>S zEfh7P&YUF=ZrvDjf)j`m7~cGh-S9tMyL3onb+0FJi!P>`PZbmD?dS|LpAL;|JUa?} zH{o4LMVjUv;wfaSUI9<EamsSE)$QX3`pE-}$ySOqVagUB<<9_>AEYE6hW@fso17l6 z3d&nXdDRu8KKIc#jXKoY9o?NdZ?oc(;I$7xyn7yi655vw(>+1RI%}ponPOIGWO^=c ze}inDV5=xAc(6xq9TZVKCs*(}@EnPi<(o~g6VCPDZasXn|BZbzB(oj3=twV~Z8yGI zYMfOw>q7jjvy{?fX@5m0ZUBzR6xr~H!3RA_KluYLHt0m~jXBVW{yO=tkzHA_0X8{0 zbrHs3FoF8;Q81i9_69xF>U*m*cn(fX7TV8}{_(zrk>`h<J|*V2#*t5RuU9xmV^EA% zoV-+WbbKy!JmtR~*wE>GFptgq=H1V*EHRAX$|W(*;3<nrXL6`B``!%b{Lt_7XZL0R z1#uS5VbDbga2;>}%kctUGV5mBy{yW8)EyPvQPIX8pk7*d*<4U9zGRl+nZa%2h=Sdv zI$JFu#oql(wN&2TY6$vv{GRxEiPFEVk5wR+hEuq;DsTg4a6PT5{-@OkCW-no!^PT% za~>z=Kz337v<(c%9~>)ivy<n~V0S6TyqdC6;vz&l^p!cI&UjQD9N5k_r^`BI=0R0I zkgt|b<!=7rf7KeDVH-~6vXE5w?E|q(!$a^&5}j@~B!l6x!;Nclfpj+@kTfrt5oVc^ z3w@$TQEIOzN05R)ACQnh`n3dmph2%U?#K5rMy7!L)rzc1#|d5^fI}V)`jA7HK~-z( zWx>tN%rDItGP*VEN4EB82=Oh43>=(4;cf>X#S2p2sC?}yY)8|U+VZ{RE!4rF!wyzE zI936VSj<X_@~Wo7-k_iffF^n~<b4)rJU&cp?x=z}L>3n#jHq-x>J+cl&bCKKU@pkx zW?B=JXkQ2^_R>cqQS;ZRIOk^ajO=3Sf|Bj-iS?bMl3jpchBX+02dNP|cBJsoKSE;4 zBmlO!ppeJwx-kN8AD!;aCT4i76IsqTyL@~u^YY&!jM(=Z;A+?cme=M4VD^b@*7Lt4 zBp~?h4@C+@11_A$M`ira{QBtu(M{dmJA#^74l7+q-&nvL>U?>)q+MmJ^<QBRkM45e z-XY0;tAXEzJpr&SahtQz5G^=*g6-6r<AlBr6G+UicM7B5v+lkllmfV4Qa~x~`G6N4 z8s<PP^m=xR;5ql|=T*~)0rztg5kx54MHzZMX{Gmr)3Ku@$pb~xt|ReX+nKL5p=>_5 z*rH6YiIJv2<bvHs=ZQAWM&RdxTBpntgMNsnKd@xRSdVja&#>P;f-8?GNO;4jho7Sh z$jsK4YTU+D*7Q|69~r)PMg3nU9l(~xdEcI1`$f12@qI{nGhncN9H}(^`JmtsSyj95 zPaoIhVH5CCg7$ThOrsHfk&gzbZ2Uc;q>{4h%e^a~XM1|N#kg6d3B#VZE3fpHTuu@> zHh=a04E))`f~TX=b`&-V3LEGLDi95MuM|g{Vyk*mPX;bBUcc)4(t^5!#EP^X%&gGK z4eSikoxvlqQdW0ArpF_%zpQSR=#@+z^J^yH6AXQS5emdSd5Te539XY#bO}eZPu$9r z2t#sopV9Fvw1zwvaLz-?LUPI$eX@O=fBteJMXE^r)1%qqcRYHotgIh#a`t7ekg&<J zn7{p+OuUkXV6pJLf_V>phB3oe;ayjYluuE;V6?-eGr-3@-)Ov+4IBIC>R8I){@rF) zW}}>9x>5uYY?&#(#|I!iMD`;l&-NdPj3Am8<7dY|lDa`7GQoe4%8~S+5CExQ6CU_3 zK<Rbq|AxXm69N0@*Vd?aYj@5_;>q{L3oGa#b)U-FQ0j$83$LBC2H1(_Y}Z9lKK=M5 zvtD&rIc&+YL*6#aAS;Cz*yTD3gs15{kB=t~SLgLv^zPVg*KXsC)J=lr;bfEHA)z6F z&C#TIc~iKzrzbBeXOeLvT_jpmRBTfuQa(RjpzlkEbX0CP+$>B$9+#;_xeaMDDO6~C z(}`VUvA}xrf^Foi8J>zdTJ02HdP5G?2C*$H^?+u9CNu+}jB9OnxD$aqiQT(W>4d*- zHWw>k3j{cx@0054Yq}x}XysFes@M89FBWerQ*7Xk4%@pmh>`jW5X~~+N18^08mi3( z^-sTFbDXg&2-(z9-PjdR(6~fOXQ%GC6$me3rHhy^sUBNO<ogKQy<o1#ar3A`|6o(T zY?_Pb6dDu|-EFH9vJh3%NztiIwH>U6GJjeX<jp4X$^O!H+oRtlJN7)@%&v4XTtOXV zwG#0>(16$db>>2kjv_^2NRM2S%VV{B|6<c3ql)c4iC&+#UbsGbmGl2%(_*b+I^0Xa zpMx{m^DEU8r?XAFShz}OlqZ6r6W!I8@KzdDpFo#=0gUp<FR*eQYN$Bz0$2x;$?7jm z8h`u_%6ZIi;_0CEHSr!4L7jWfgXl8}{>%8rO9Hlw_`u3uyqgV?+bke}ud#O{{_($> zHNVJjr(2_2KzJ+`TKq--CydUe7V>U?3~Ut$1o8ma@K5>lYfADT>=C&SABM4i%(b}L zh5Ni+ukwjAKKNhZ+gI-25@8@q9!IZgiIyY^GF-X}F2VMeht@lhlT#C1@I5r*93|l9 z%*eDE`rgGhX9iWR#u7QI5rNkLsh$9KkjhR0dQW%NjzBiq^A)yPP3*@c>p`nse0&i! zvwa^p8q<cAk|3>w34+1&;Yx|=h7>pkeB>jfPNjTrkn2;Y212hl*j?tNp02+)>ft6A zOX0U#1VZKEmEk?DfQrW2n!~8nvjoe?X{D9&35?}Mz>6mcrzbxDv2*;Vo)r5hF&i{& zuSJojuJNTK{5nm%C}(iuzDSgjkL9-18ZtaZ#UBAz^<P02Z#O>XC;cIh!#gl>b_`Xr zu2BbKVJa*dsPL|5(tb=7Dbo9Gkb^sWG_ntyi7HgqCysfB8~9wPxOVy8f$;T98J-N% zH9P}9(p&TM`4(%05`wh<nm#|pq+7eh!~ft;Z*$|#ueg_Z3e-zCtIA{EhlKp444?{+ z3z}JvW_?e*pY=*F0ycaKil5vT`oxUyRHCL6f2-HaAlDwfif&~g4^_M}XUWIgX_bLy zRhF*FN^z!w;fY;c5nb9)KDA5pubEGH0qFwkoemXG*+%%l%$t{v<X2vEO~>25CeWb- zJJQ@&cqyOj(+fwhChwm%UOU~~2vPL=6v-{>WZRoeY#rQUD7t5d*bSyqjJ51nb<|@6 z#gM&o7m_WL6~LiC0y+eWoqwTqkYr!jB`A_m1`k1`C^CQ!Fdaa~WO#0iaC)7Sp4|lD zfau-n=3U@EK!g|(r}wH7(tX|R^dzl`A9}DLgzs_rq_+o=Re-)G-CKlyGtpO@MIMYs zTBVaIC#5@Z=$)(&6eUtIUQi50K941x6rv<YXpD#5n@*y$F0<dYeWnOx4@f|6f^SE& zCVIbRECWdLY;UIIx2Oe+j6E&{|Ghil9hj}FGJ>n@jHv-06taQjlbUo{K0Rw|COyZv zxx=4{;Ns%Bj1R$U&()%{Ek;eZeGD=(_I}UNL~d)}z#e+>m30_yb|u+zQe{8b(}>s2 z9MJlZIJxt#>Xq`T8bYO+I{yt9c6b&z^n6IR2|C)f%+&T8x`MNdt$dl1gm9L3*3edW zjG`rT{AK#nG^LnsP7H((VYcIv@2P|SQcFVel^BWN#fr36D3GYjmJGQcdTzYWo|4=! zouU$15<+*Q-l4Qjo*~CdZ+NcLv|}@A2ttO2!ajqcE94<NVg*w9BiI1~o9&&LWi3k% zx@6)8`cWbk1QBPFNH6j$l8u3sAAh2#eBV(4mZ*2xL^rzBQW3d{U`TTAUFXB91foC9 zQsJ}v071CbMPjG62u74gY^6JO!QpuIetviP?Z2IQDHp{4M}4o0V?I^+3LvzV)zuRg zbi@9S2>cz+;gjFx3d55eHnybTX2FL=FGy^W+}DEKsINx9Kg=ug0vGWmeWZk)T_nrH zyx2%U3w~;zF9H~zD5m;_Bg<lpzDkKbC6@h@h04VD^7+muasPCiiK?QY0scTlo`VWO z9^1#3`Ru1WW{D^*U*0HPkKs}tAXkU%VhJu>8iYu}<Q|Q@K3o$v9CCkZF>cWBT3;1$ z1~|b_2daoVeWLt_-JkaO0Pi(#!4_uv2hIp3BVYjju2Lkk_Wl2{?*X10{5!fa>JpuB zzhAW}lK2llV1mF+dtjtMUd53v>P0-rOBYHZK|?#bt~I*#Yf+YO&g^lF!XzX51Dm|| z&{Els#lX`^%N85Bo;0B1D737>v^deAxJ+9lFf7q?1ZGK^)DxCAe<c<zL;DYEKrcq@ z%1q_c_Jy~eF)-6-NhmIW5c_4>RDv!UGNdBlL+f$|Iv$PqIAvw`fzw-$7R-7`n;lBz zNd<w}jvCjx94LOe+&AuNwT^-MLuRj@_q%n-v(~FS5^{>U1K{=w1~mZ&!Uj?ZF&Ej} zv^iW6qm=qw+ik88)8_$v2)zd@f$)nw?t;vN=(pRGS7!6{T;-dMUR08SlO>96c0S@} zXVPJ{$qo5MhyUEQ8>AM7w3EB3N!aBV(^4$t>rWoUL-ly}%gD3eu3JaK=QZYT03tgB zyS;oM9o8Ve)LS~bc#GX;i{_Ci#88_On!1CX|IZyFn;xK@b5N*n(R1Er<iAaexU=mp z@V{8&s^oqGFn}B3EOjo7%{%+E=A&H$fCzqZSOo2HPabki^aSg1p1?lxjnGAZDCd6v zXrWC@{pl*6;wT`waGp6b3(rw5cv=A7xRpE@yeynkOCxv)U<U^d9NWqwekKM;XIEqu z2BUp`oL<x&0Gt|-3Y33eLKm{sbUWPaQhp0o)hQ^hTPRMnAJoGh0%9l9`-+&933+R6 zW@nOFRp&XK4&S9X?aBxBJWc0M)PsBCy%BDw9s(jJh@tDr{D<K@i(@=rv}@#&-ue<3 zrG9<MtS^U2kN|sGk2IPq)#BiHn&Y+cyqI^R7kC3ll+C!H)VS8%79ffhMw^wfkH;xX z%Tx<k;zqt^skXW7n9kIB6*%cmBffo+1e&sU>86t3B~xN*0+j~N+I|?M(0QA7x#0to zaE-A8>BR9J=_M)AE%a_coSyck#vJy8h`MVrd|_(-c=E6<vFnJ{5sR(G>3!s6G1A6J z;>L&04A&<fHa`JZ3oOk1wjfU`linG#S+R_A7F(~#pPoLzAy+(j6PBADrNV#oYeT{3 zt3c$B^mj(oI>U(pvztqup=~k;tSso~5L9?eG2~5iyFQPo#FEvsfeXvUsUo0>eMcr@ z2WHinJdkUnR&l>NwLq&Qk2b9qi`3EqxkEpf^dFI`??>uyKqQYK7Was6&+VMkAZ|JA zZ$bbNfv0z0_-YjoxgkOZlLf)`ms<q9DL!LR`n`TyUHLb8=e}<U?mr(0jhBEpi<ufT zY%;#*t=AC@`r+>XZO~N`_#M5Ill_*ZH0iJ}#$`%*f=xLQzI(5SyTq7eXTZDisLNHF zGXhxBmrw3W?)1!Qw>&a+)#KT@fd#MwWW$ew7(P2)+J4C6;>vcoWQwdVPZNI*CRTjX z<0EH0U=-1G&@=dF2?&#wjXIe(U(mD^srP{HT##`p07V&{+no;98&yPRU0(;=4J0#x zD1xIQu^_?>f0w9eOD_<^6GnVp1ZLQOp7_6y{XWJW-2`=slkJ)?FlLd3_|mzVo=lIP zC+~#`ToF8!A+o^_cTJD8Z7bYMCQ$vJ#i@<%g^sP+uN_))+w;~DdJ?bg&PhUHCw_f# zSYGEj+yxm@dBuLyAsXa49i0)qnk)+B58H8c_C_vc@P%s)xXLp5253M@$oGYlBINl) zhmU3sw{+sFT=PQ7{J$h=?)jsa3vMN79$alA#|4*yKLY}m_FqJRnZc#))Kor6mv8Mu zuj0vV@XCC7W4vKXy%OjXOk?~LwDM;_iCM>&-fz<_^(~h_xfJtQ66dpBO2VFu+9(Po zs(7AH-oFaZY+HHme@DY#a`E+(mDcZ9sw!&IeHqX%GEemE;x^qE#^a{SYos~~MK&lV z3?>E1+@N3bU7g09(}5{83@*e{N9NMB`4H9KunXN5qUY#*kie2SC+@&J>n^y@a!3E^ zUzE~kf-@2TA(4Ps40cP=OiyJWMs?o~^djq`q<6@4<>V1R@W;b7-j-XVN{nU?j{ia^ z_kR)U8BeXy$u3?mm$=5^-fRW-yw~78&zsd%sjWznmm|Nvzu6+;wuSAH``p7g)^|Vh za31;aW+dikpZUyK!&gTO0$q2ObiwZTzd6IO`#{h`uEUCA!9Z%m$Y`;O17#{OsB778 zj#rt@9SOS-{`vscoPph{P|7+az63aKJkPIs5PIOsUv4RED6x&H)IU0eT`cYRi>A%& zPj2#DIaHMi~DW(*FGh@NK;4L&)!g2+I!*v@223_>q0{5ueFS?E-tpr)iL4OmzM z4T`kp;S^qefU}LXS0z&ndA4KI(%9~Up>$%(oK_ElRw(g$1o?Axi($O}g<<G5OyaR) zF6%&K0lZO8?xB@PXB$-csqwiZgBtAi3NO*;KCBL@p`28Lq(X<3W?Gm;@6?SP;r5(L z-Y6w)`SnlNE}5?xl^q^#$Vhx_dylL6+d>&1v@23U8zec5{h?rsNo*AMdI1~T0>vI4 zX)AvLKh5umdd|;*^5R$0J~HEhIvgb)?%3&KyLjgpt*915PWX9Fq-L~rkHl07e*p50 zdmcBf9&Lg|i;5bX>t`aF4KWJ?^WVe@N&%rj(?45(69^yt9Z#41vn!*(X55XF!tcTW zI5RZZRR^#Z>#PXmGllguMg*@`W4C}%lhUTp`1n8BB{;9|AD^690P$CxZsn+rMN0V{ zITAoG2iWS=3fpU@VNjSVE7`wuq7YnjK%2G16BQQrw6_S@qFw6F`r}W+#J^0I@3z=C zEaj=!Xm)ynn6uJOLZHv7*|zWGfLC(5Y&x-&kQ*)ZYi8Vw*&_`lS=0(5bb2a8JWECm zNB#;5B($nQb|RYOz!S+%K&S-Aiou49_8DoXhsQ3J#}bQ7-zNeCnb1%?Iz-Ti_oe~H z=|r9U^)({iQ-Q)e@;$DqDLy~4j&6Wh9X8Yy!t>m}7HMEzm+Ii^gX2BSOOdOWX_PE( zjr<PO4Q!^rEp;DxiS^0<<}m(`E6@)}^OO45p$X*mtH#^y6!oUhwqM7cGi&`Czhg0W zE#5m_qiQ3ddn4A-q2{veMb9oAe9o%>P6u{7_A_Gp=X^zL_%@GiKEtSOzI;fxR+6f# zlVFDBeB<KB-nrI@<7c}r;UH@8m$Eg#_zs{aiyon_U0ShlHeVq&Yo5p%%$M|0D2~#c z--v+IF|nt(qHnnN&^{3y3*{?384SrH@W{zuj2U}_&EmMjUMlB^vRXi91*%&VOOxrd zmx!{R%MmfLnUxN5vvI0Q_8-GtDRj7f73X$%JKge(mp-IGCk8hvE&4U(qd;u@dk^3B z`yqL<s6y`C$G^uwm2^iL=P4oXJyW)gQo1B%HJqr|eA0o`IbfLn!jJ$@OM^g*S3>~^ zwy5u>p`mfny0w)&n?6~mYYICnwbpI!E;~Q=a%)%X<*{biA?S}6(I>ZgG>Lo6(mmrv zvTQrek7c~KyT!heH>{t!jY0P6EP`)b(h0rx{e87fCkwl0UjB8DenAFn3sDTw51J<} z(RGO^-uLT1r_CERqATkom#4P*^R^C;b9$Z!bY@(<6<0m@_(Y3#c!%!PgU6loU`DEU ztjKKrOgH)Hm~gtvBUYj)FgeF1a^L*;Xwa)VDo_Y&P#$Cqf7vIjoc(qth}^9ETFgHd zkx+cykU&}!aU*<w=gQ3M^HWf>441`3UIYGYTd5F}h%)c)83ATa>*>}e>+sGUqsKM+ z1&(A_ks`w`3yUnn$MG8H3AFMgee3e604WDK$@bT`Hz1g{gS}KKcBW4@pt@N&5WlpU z-G9V)QaWl9G+nxy@7vHfQ`fSO&8)M}I?vMnO>+Dj;f?rGC)Sbs_nQao2ZLA2Vochl zg>$a6?}{{wvc35reyyj=jLK(4FJow)WKQPQkWQ@Qa7+ZSFK1l$_d%m~0NwJo;{cb2 z^t5C2&imkwqKxE@MfA6O*m3^-W_!(b#}hh%pPF8YlK-f=1a`a7UvpZ~0&z?+8({bE z?cyQSwllT#<cUmG?z8oK<c}y1DD1zX9V>&!Ft65U?M#kWd-Q!EW(p!Gxoe~TmV-8< zNMDryrT4HzVmFrt*b3AcxJYBvwd)y}OEw~h7ck#G=Z&L0RTdeqSgV)xrDOBN_c*90 z>!)S+DjDNyZyi_`ArgH8Hf=C;gcZ%g%wJrYUaK^9j5Rq*76r1~z%7%vsR;-;aDOe9 zx|arvwzjlZn?yXF$MI^9D&@Bv#rLo@LUzyW^M)o7omdB)kK~$rTuqBF?7{Xiw3ea* zaEH%ZN5WTUZTgH8#6Casm(}dBn{wqv2=vt@7|D!P<?fP9LRn?q#4}ui-<ybaKh#17 z*+6?LX4RFMf1pLha59$#g4ROgq7)f3tZgFoQ01ja0nb<({;WuG1i1Kw2DpOY>xy`7 z5hLS>1F61{PgGwY<>K9;c~XEk(2oQX^P_a_zduOc%l*_!y*)!6DM$shvG_QvlspUW zIj6w#tWT1;^9*-^+bLB(5(J|6+3kOQyGwNcgDqfziU}v-dD%@^t19shSLyx}#=BFW zid6Dsnx{n#gnapJ|NIvJ4)Bf6{=OkV7mD(HDS7=c_6H`}j%K9MN1;8GtF`~wz$l`^ ze~^-F_mwSK@6d{g8`A$7_f2L0Se;Z0rNB(}GuQG)&(&#|)yleoSXNsqa!1K^wo>@* z88*W1hkx!u-3Fy*&{&z<S%1qJx^<Ca+X65;Y_T5Kzm;w2ZXFt$IJ@T+w-o8okl~R} zxh1LzT&jxC?UdTA`UH2QgDRPOOU<4@Yb7$cOQp2?y~#(vbUY0Bu^|u!`t#70fL8U- z6A`8UBsF@2BUo-G`9wgO5LX44-bDxTFxgr<{<Y>>fcmJDXE!-k3Sst!itO=RwQGD_ zxr*3%;iPm(0t53bk4;>WVptS&`)1mqPX2mE;HpP3joo)!)Xj9Y$2eG}+M9;nYFkFF zlu0$Sm51OlkxeX3y}J3BTruG?L!M@EjO!d-MG7w2WA`Hsik_~u&@zi1l7lJ>#7KZj zv!%SO<b1Pdz^nX;M0VO3=0`uA7Q7|Z6|R5IJU|usT(YTLcdyutuY(w$7EOpRvJa== zN_ZdySjD*>hnh{Dz!9-OYs8y`jP3Az>YVe6j~jv;Th0fy*5{aG4f9+RRpN`atV0N^ zFDX_sqPRE;s#A68sf_k#+cNPP+gi%*8BD$PGKu}}K2f6Rao#dnX!8Zq#<WBntv`uK zH`wXrnbMJot1!<-+a_2H3gb&~cHPWgjO^r!HywAaxjOBeCT+s|c3Wq2AVyl}of?6g zK8-XeN!)<&jb7Sf`%cw&uNUMUpAHj!-hBR|L^?oH-ejekhWiOS0);I`eIL*6s{qGe zq^%TJy>-VF;{%X3{v^Vq{$hIG=Jg>As|Wwb*>kTrp3En-+h<ZL*M}?pT(=E;2a|aZ zsw+2G`_G~h?vT9c!3j_$GE2I?$DLvB-~je2)U=vR4Sy1{uP@1v<gyGb6-(U4Ah+EC z;IDELtSL7-49=ds*F|XBrm)6;yb`m?e_)qrew7=m7=@?Ek4O<Yx*TP<7#ZXSh}8tg z;h%ao=r%WzD7VF{Z%$gx&K5-OqgX0gh91+l(h;y*Vfh4>YuWAbGHNd#8>&p`d0wrJ z*XK5j%ixa0i!J(rls#tIm#py*Fkkipt5EVx%TlV{V!Kp4FGgZ&UP<i}dqxf)P-%LQ z6-0diba4d=Hd`W;)#}V(bm9%0Q9>NEj%3Q-s9O6KQs9mjag1&DTdJXm#tW7M={Ith zlKSrZG!<#mfyNKR>Czr)7tQ`kOZOi6;71_QkQA=D&YEO5n!;r%v(_7LgOTZjZt73M z^*Hxit`x(LM_nv}>kp=0?M#%%18cctkCuO8DYwVOEfC$Y0e(K7n6;bzvQQMso)!d| zyhya2XQ?;-{9wKDC9^hNOX{^Kpg`Ee)H_51_w%74w7K`06Vv-_@g;M$lou70*ar@u z<KmaAR}aDy-eQJ|g=i$ENVq0qRm*#pU(4j%gf570W*yt)x>Rkmo5A^$tBk^JW-HD4 zEI_R(aUAUvDTF;66<2aE55Aycj`Lc0;>q(as_v!SUOdz?MM^pAilf?GP`R7F`AU}h zt=V%r`)`XHbv_7`XJT2nE<}(zdFPpA8ph`;M6)~kzUptz-FVyhndT<Y21B~|1w9RR zqKL}&3wlPrYCXtYz3w^@)5Y73uliNhBiWiJ^k_xgCQ}s8@!A9pdC2Rld{KOb^_x6? za2(xkI{yIOZ$$mbEuUheJoKewT8IcRv@i_{o`j770Rb%-#D>o9i2d1yidN)yiE<hE zEeY<c;>r*JyXo%UO5DdWKmj7>L?F^_eP?N<B^8Lt#pJfvtTz7O3o(oB^`&Mw1{M)9 z1KMb|#Zm6qW|tkACdai>S#K#WDB3%j+a^UWjaOM1b*dVUOnx#oqYj{VHqN(oASQ33 zmSliMr(Uk!Ce(U}*d+JC|AIJxguY3Seo#J%wGWN+xN(mpXwxI>D>dTl4um8%*LSy2 zOuf_9nQ3vY%*wd>>bZR=D(IsMca^5E^kufD>#rdLmlp_kvt-CeK_@djVBmxt6_|sX zNtmb-$)@|eqiroIFCGauTcO^=$10_a5R$R?8<Q>km-aqY2pfOFYeN~bz3^bE!#sqY ze|`D0HA=mxaI1~M>po&-LbJ{%1>}7xf6l4juhE}l&iLUS!H)GH<Nd4hO1uDEn=0M; zz-sfG>uU4mH;*%)iqDiHp+VXmg)rRgJFJ&CWMZXZQMRZvIsy*X9cp&FpKTXhpGkKu z@NsbjG*H4?>riBZ^<t7(T_UZlHBHli6V4lsl>jL$T(0MNA>vE)M*Gp)K@^PfDYb8J z<0aM^y9a6(Aqo?S6mocK5&QZ0GhWSNa{Djgl}|_Tjr&qS$9-b{HW|>4Wuo(&szu`? z@s@cx&iZDlbUKg@8LdRf(qgxs-)39MZ4y-|49%%gyQHTcP5PzXMIeo8&2l_`IdBZ~ z&e2T+JW%4PE1DTpRJ}W16dK3oT5hc=xENKJ89z{>(QKKzI4|BU8K)fejGpoZ>#ajJ z)8%qo<7cO+J`z{KNoqF#xi(8AD>nmYwgH?vj8+!^nb$(+bNOJ2EScEG2o=5q8b&qt z=t9Ms)I0dhTD{^0dUQ~Ew4~!p*0`66r*+DKZ^ESqZEuUxU~ebI_z^slBXv%4_YVmC zb6A^Ex$KCy7Z~FB<!(1yD!Fv$-#8W<ZRZ*Kph)eP(Cg&d)@|34>#KI1-F(9OkLb^B z=qcf8PG%I1gV0BBgNYrra%vIU;PMl+Yj9jDmlZ?eMN_}+oCC_`UaK^rJ1%<Pz@K^g z!uOgYVQbVinslkbbx+%`u;py~pt*pO;pmd}O|On!D|6MCCMh>_#-Ij1x#ID{1S|JZ zNG6M2E4rRZw~<amuQ)_=C3xdvsPkC@B7HE<@F(?TX9Ba1P3?-JFj{S&ed--jPeh5k zG*UcD;wl4I%m#nG<$%~Cn|9E@H<sPxX?|zWR5gq&e0yS66*-UdYFF&ySE1C}MbW5c zx{?gL|MLJmKSpNBFO{?HdICjYSUWx!Nt+V)>T35TYx~>Pr3Y%$wZP`Pk!BYwdJXPl zxgB*s>zmF<k={6Z)h9OrqpJMr48Veoy0PN;RQoD~xDw>!80r`RfUeh%R~ny$(0Qu` zr>Jy@&!XIA9d|xt?{xqJby}Cugy{Ds*wwjOz}?hW#H4cHP+|hdKkLT9f~ErV^tb0~ zD3?WBFl~-we)s8~6$+$mB7QA2Al@RBXDn1?(e)1%t8w(Jr<v8BlcqSz;i4}YQs|l{ z6ZziF#21>lj{h7q!=0|5U0hFNii+lg^=!i$RBT3#9UjYGV$DYQGgs*-H?{T)AH!m> z^5Re*Vz{Un(QFsr%R<+B<T<jlu?m1K5B*oNF73H8_zI`|GXc7<3F^}qBNJZyF1MuL z-1V+k&$j1RmWNgRPKvZ`T1z+;K-`V|@><Z{e)U%I8Aj?0U>C=S-o!|6Y`M1lKOgy< zM4ZOG`q@=r&^$OP*42zDx(5W684sjvVznQ;P`(oAyif;rPQ<7x@cp#DPcZGx%c}7u z<p$Ws)+>fB^cq-=W~RTcUGW=1-eo*eD^&V!-K#xeo6$63on4guA7J@|FHyXA*}inR zXQi%!qfD=S$vyHbeJdBroK9-pMm0TZ{V!+5;M}%CXSQU=`xvY*M_Es!j7OzQ^!9Wq z-n-ZeA<dw*10}-U3pOP2QW(LHFqRt%GK4i<_vQrmlBy%<PkH~jDUOWu%$GEAVd8K( zvku~i%z3Uy$9V5Ftmr&Idrmd+!_r|9CQuoXp%#h=e>)_li%oRUGn+$TgDJ7{)K?t$ z@OKse-(%Llf5@9c5i@qn`2mY=_De_4)AqFBu-RQdVQ%)_!JPd{@kZmB&U*K0q5Jn+ zmIE(a25`LI`#sR&G@w`cA)Z~vkjJRTy~oo{i+AM`^okh2Hj3_M$H=X3{Y9U3oUypT zLNg@XTDM8pwQnd+=HZ}o8cfX|4cBeY>(xk50m(TV)Hv-=)L9vy%)}FQK8$8@t5ENI zMiiatX1###c1Z}fz{6@Z&SR(^XubK=bQbvvMN4Jg;<aW;OJ(-p&MOai!ay)5rcG?W z2ljjqG}nM(BOS+A_iFHbufDr*o{zToZFa6%=xZ+_{INz=VzZcwpzQSk)fUO5?ngU` zgpR2n@S<<p(Z?+!AES0X(<651aCb3#O?hg%G|IHcA?jt?G_r}b5GWlOf=yymC)dOt zQzHzQe5v2U9lVj@&A$osHZsh3dW5Mu{nt+I;e;_g<pQLm`U=<JH?u#}rk&O@mM&=K z$$Fjwmo#y690@+#jtvdo3wJj>7q2=GQ&Ic`cfUm0BSTYqJPE?+j>8yweeMD7J3uoL z%cxdJr!(;Ixzh%MZPIHgJS~>_a$h;Ok(1@+E4O~m*NZOD4YKz+#lhw}C7b(!t2#33 zBq|J4kEp5a>t&Qr@QA7QCfIP@HIk1I^X>YM=wLyTE@CG_UBj#1+=aQjdG)V!Ct0=C zxl<Px68EQGhd%8QsJe||2Wppg%vtYgF2@1--=}7j(4)g?er0y~^ROEjR}3J9SK)Ww zJggAdY;xM@1#Iw)sXS652WMNOQsuzN6gq#jedq5DpWe;%J`Q%?nP5()rJtQBR2Hk$ znmb<W+q<Bq7wCV3ak;RSVpWc7UFuudZE#;%<b6Lmo1u95wF)70MiQt$&@GSR=#)Dk zldbbNkXGldky{oV&(%Ml>VMDk&+jN7DigB0Tm?6eMU(D64?c3D-HA3MvWQAw>;juE zj!_3xVy{OxbN64LF;NF#Kk`|Rmn@}*Zc&KrbYQF0M{4dOWrb8GBRn@LnWSW*VPjQ# zf;zK)56kg*4)~WpDIKg^Q1nfdVfTt*Kq+C(kfp&hi;()TI8l<g=%BYQsH;6CNui(2 zst1$97^+hbrlVH-JZCDy#!z3$MOEIa&NS}nQCzA^1b4jTmm_)ce+#F6>Tgn$au;z; z8!a7j__p3%5-L?6oV1ST-L*baT^8?(epAF>0L2RN2|=fwSe#$q>fg7d@F*P<zTws4 zvZ?O(L?uHHe7B?jzSwu~wy_?(y5_Vq6`FH9@IQu!C4cyTY`t|<6l&W&EFBU<C?Yka zfCvbP(u@oxqLc#C($d{sgES%`C5?!*bST{|44qN~5<};AbI$v|&vVZATg$cd57u&k z`@Zgd?Q36qdoU*fHbq`4kNBT`E2SSh_OazR_yW5|S;1hY^iAr=)+rIs;$LAYwCJB6 zZr#7$c#X>gHtszj5t%!uZw1czKgE>nhl~YC!OjICtgL$aH-1*SA8a^hRk13>FDs<4 zuVw2txbwO1o0*Ss?Rgm%h=UMIHsIVnzSjH&^UKyPzpE#h08qwdN{4lW$Ukfvvi$$~ zP5#ecEWwgQAo+2Pjf2XZ%bs`BAMwKyb!tG5B_-C=n?<{y!Bc5SsI?M<``roj_8e#J zVSD=>l+KVi16i8f`~d6;*>}ztIm9ZJrq5=$QERkQG8SH}PZZS5dLl2rG|e9Lz(#^W z@ywzBq8Gv^zDXqr?Js-oF_}S+NkfP->k%fm{UZB}ZnD;RCBsGjXN9TQ@MqCYvz}2_ zymDexVso%tHiG>;QHD~GeYrONv#Rp{G68@6eB~rCUDf(Xf2OM)|DP8Cv$sh$FMygc zx66j$y?u_YqrIQgg^Gjx*b7&A99H$juBsp)?IAcKvcdgO0R5e&(IpIjzpo$lpzYZ< z_eff!-WboP4o=0to<JpRXC_~>iWXU-kFl%@oeU$U-CjpxcL-@>spHsb3B|3l|M4Du z#&-o*_f2RsJ&R_-`sDYoMD(IhQ0*ThF+g&a42Y-St|?Ia5-WPP33Ta=XYRHBom?6v zk|v;+Lq1|^eFS`ZB+c5dsyT=73pLASyw7)KzhbZN<Yz^`7i7=Q(epl$2KKEyBBu?9 zlRf=@B_U-_sMkr4ZPEaU8YJgi$TRMV_diLG*aO_6jC4E*04)N!v@BmTUL^7|az4FZ zl<pWK{Nb(~qX0dxzHd04h@hT~ZjrVS2T0Ca23QF6FzB2CH4%{F<h5M0n)ZS7RYCR! zXTin$Tlcepk0_th#wfd2K~M{c$n)dgphx<r`|I*Gmg7aKtn`^fDMAjLc<}Y5NRj^2 z6L5^V%!N7f-laUm-bop3^zy(MG8hm$qJ+qff73E$c76$PgZS}0*3aM@yUQR=G6A&I zS`^cIJ|I29b;S+^(hZmulLfyEqQ;98zz>VNNQ|@8?M8YJFdO937#Mi~(uiZh=Xz7+ zdfDuNY=YT7H|~y$0eL}$JFowBOo;q|uV}2p?%T&*6{8Q0b(E5vth?(`q{7~d>vp`} zB5O!oCrI`nEMJP6r@370fUD*9;>Lw>rOSaez12xs1FFMnb!DcqQ);b6k@-<w`+$8> zT<U6pEoH^R4Nd3gmSc46R*CkuFssjoT9f?JB3F;=@(snNYB|sqSr2+(2i`RM@^om+ zZ62wYbgCO~KYo$zCT*8)=2bnmBWSj!h8sk%6OGne4Bp<4`m4SC--;{Q4*9WU=8b=K zAm^hO1mdl{1un(tZ(=DQ&jnP{hhEcxYSSKi=ANfPWnN3TU7BS|l|_2YtUc<nWll%2 zOeUslO>92*9p-4%O9Dn`|2op0D%gjGb$R<WWqB9E2MZxG$q5rH!FM^XA50RQbU~GW z+%P3<QBb%Phu^DbBo)H+mpfzZ+o?^B`do(}Mdv6abi?rImTR!wHb4mVZAcp78<03{ zPW{AIf7&39OH<{ppe1|6-AA$XV(y)nXWI<pmrW`J!(^){dXLQ*=U5%sg6ohpRTuE9 zvaD<RQ;W(5hU@aALD-FC%rY8Gxu|(?j1rh5pESQRR-||E0I}q=u99~=wi}M>?RAr+ z!)|wFgwS(7@$ME{O))HXiGLIk@dG5IGJz0LkUk_Z=4+`{pvIwDW1nLQ2<wP6{w2br zFhHs@Z?PCef)I_77a|Y7#RP5FtkMgi3d=32pm684LBE;bN#Kx8lPj1bK@MpWu)3uM zN!NTPy?4G|PFY$f6CWu@?lz??iXQ!$nG(O>+HBAh|G<9As;Y~BK$N1VHO(Q#qjP7W zrLR5ts0|>@MgN=J(XaqqO@4TP`*fFru+s($sra3V&5^6kc=ahb3Pe@1{&avYgJ9u< z6^G2N@?S;Z@r_?5_J1@+@vld$6(Z-)PD?3tM;O1e`h5N-fv5jwMhKmiMli`@rGu4O z2xYTy6`j@2un4-yN{L<={{p&w=*Nd6xZg)v+1nCnyfQ=ShJTSo7bG0F9w0nf+AFBc z5s?{ZM@U;S6)7y>aKP@M)G4JgF#0Wz#CcR|bz??!Qwet{{&2L00~J#ywnw=#<BlA9 zjONOsv-*;y7@a1ZUAnj5;vT2t&pTB{Z*GTH&Md)Tv_G|yx%%g0V?>D|n!6G*zbnoU z_@&<YH-oxbM-0{>JE%2-vI)5M^}Y4;;lV`EYFFvVa#WdOaj0Zwiw*i*&N3#eU$82$ zc{AP5y*%F*a~0$J>uoQ?#<(uUDXjP4AsPRu#Y$#m^X1>kgUZpAx9`7xE`GYkY(8CW z=S;#Iqzu;4$7Ah4fI1XJFUA2udyjS9?{OQ+UA#09gLB}E@B^xM3Wyw;(4Qu*XOxj% zhcMhf<HdTPVFpZuOE<(p{SF*wh4coK(A{;K24CRMY;6D>kmGx+fCj$Wc|9MVZCcn8 zM#Xa*@}gW*(##w6ttyjA^$PSvf+~-h9M$uc7{4qq-xX&1&a_xS^N_~q8H5$KuMkoJ z-U(gLUFm^ah)-+GWH86|9`3r{Pu!Yia1x<qh({XuUh&;eOan~)MgCMv0c*`qwt2uX zw~2^GkZX`$Ib?|}2vk|^DBDQ<otI(<YM&X{KeE$Od<s|7=N>J1)ngs!r^v7NPjo^q z^%tmfTw?eIE#o;@yWuv;w{5djoJXhP2_5}8cA@lA<TR6bl8+%SlYX%>gf8%~SL^o+ zu||Oi^(bNQ(q}%_9xF+wR-av*iX<v`r>al2-ALHfrG5SJR&%|}H7@fzd|~##VaEqM zvUGbzC3L6@4oms$gQ~0tRvO!r%%mA4R!9;KL|rsgq!QLGI(6n$#IQVphkhO~`7_>~ zm5_#)sd>G%?C<{a|Bh4=%r~kCIEeLFtfXznvDe=;{u@6lA<5X^6jc1hl-$y_Xl!0` zaSgi2cRc^AtQtvRvhcGjKRFxt7^ws>?|*(2(7OLUF{0nihMvy)TwQF^YSU+Z67#6^ z1aUt8YYwc>;!4O4NPwqp;_`#&5=q+=z?mBV^v4+!$z-YoJ5D6x$NCuN!cAZ%nQ&kI z#bl)w%BjI>N{~i}9BvB7bi`q)18?h?47KyYRZcy5kYTzN{FhF(ZN?)>ferM4gx<z@ zu}u$D@HMDg&P$kuyRww+O59E7dx_bmS4vY=HayU}+Dy0sRYX1dUW%>%H7c}eq2zi` z#lsEUlBpoErPii()2>Sq!{w#}`3C+eCrHC6f;4mPnq_jDExMS#$JWzkT?0@oDM=<= zH&W;8*HxC@4NmWKZf7yx;NeoUo|~L`E`Gk#!e`VO&8~yQL<G!vpM4uG)Eudm8-0vF zt)Uk%xgb7KWuu28#op%DsSTt{t5m?kL|hBPOx@FXJ9e~pK~&#_o5uHdugnKO`>}3; zJ2qY}r8Z+x+%R^ZKcJ?=qpjL*Y58DW&-9}rS<D^fZANH@;Yh3os0$jMMlbZTWQfm* z>MSSte)4Dk&AI;Hqd1FyjA))wyt$bYl(4t+Gi>JA_VI%ajqTiauJ;<7lg)TN`(2fn zeCLDlZgEMn&wNHRdPP-E9nlp8!wb@Ghh3tZ(WZL6{L*59UMB}JlX7C{%Q(ZgT5(As z5B4CF($6q_%<m`}zjEBjtuW3j%%V4s*4se#e>bFav=);qwN7%D`;rIT4Z$0Ju-m<M zFMqaJcH&n?MAP%sIl<QxzecE>xB^6pVBNyY45-mBhMH>6llEw0xhN!K82rC{{udkI zhD~^dP9+cGmr$s{`)9l2^Z2imdOYWqcChxJV|qR2<BPhH{_P`sid$jJzHK*0UT3~? zR<po^62Ya8sH!2U068mYCO|?j`h`(kFg5A8dy1b}ppCwe)DIsho>)VSit6{C32jx3 zWSc2BHd2~>x}BpyX+2h$6tS`CLd17FQ_^4Qu!U5@^%r6Xv2;@Wo;)aEKy<|!xFj`n z1I6*A#ZOfuJ2nJ6k&37wX6JpvCu11V+85wlN-*vAKuthyUh-~)N@1JBjn0khx$(#Q z>bYwV%KPkIN~&2*OKD@ATmo7Dj@qsJujAhRD(C`e*QkR8J9?6}Iss%X%f<8Paf3|H zLr&YM=7V*@PA_Qv6~F>T!j7}7Ld@>`e`v1GDXwNzuNrc|x&)tLd-$N?U~m#_9z+tw z=cOPTL56Pm4CULcH{}y0FH1tZLF!!&XzO(q6BRK4`~NfHV-mod3hTo;#sF0~^ZOUl zW|KVouX5nWCG|s=@{d7q)i2MTmlUDp*6-_S9wI5Tx~)Yfl|w4`ap(@LHwH%f6?GWa z(wzpSl!8loMGu~5m})geI>~WV7~IWv(W`dZN;JLOLn3Z2btPxcpk}&dHZMrnJwg&0 zZAz%M4AVUbvuHUiu|r$aoaPkQPu6)O+qcu*k+@z+i4C)`xW+FoQ>R;IEzU&`8W~N+ zR3{%EpeEXXwZtEuk2M4ii50*N0-nxKhv-WG*GI>YhBn~OlRc8az9KY|0S^YX_OGx1 zz?DCI@cw!>&*y|z-LwDqVqK4=*)c&?9T<B?*-zB?#l2yp;A=g*-<Q*FM-Nc#K6!!r zO};^>d<!=EjIDOE>s~q+spyVmd)Cc+PbpVm{?iA8Qly&p0#0|9zT~BKzwO-zc41{h zA7Id@ah+mE)2e_@r5I_1-iH`a8r69nPTaFzp5lcsfJUVogdbaFw*hvCKra87g*nj& zIt{YBU(REZd3=Z%tTSlAg=L$;>7)g0qKP;VW7j&?DW=RvhwCFDuLyDwEa8Y|N{Crc z0?)wPUI98}t7DqJG(`E1B50a^=Nl5*yPR!R^{fqLfdKNSl)6>csbcBSZ;O+X%Zd^Y z1riL?{m1VhCZQMVUsT#mm7lynng-?-0BKUwajh^j<zu;cmTCTJJhT2uyVnCK7>mcY zJHTqGW0H0exJ5<-TWfJ@^@moa<~PPE?l7KmWfFCK0Njj1KX{8RK-;7y1QP6*k~+Rg z1*&SRx*jgohJMfGCCJ=cyu)jgz@_<iJEv5TrVCZ=izm0#bah$B>ab$W@Rc4l0<i4w znI=frY4uWMm;$eCGBCB!`t;bwdgdC23^(~)Y3N{YTy4P(QcNvLe9zd^Zk=aeNh+1e zh32muL(3c?2BKlX1ycXr5<x8>_)x++vLIOHZ#*712X*!}Icynvr=nDes8cA-hURL# z4&6B{vDOLL*lUr}VGGyezf6XTZRWe6EwSjZjmHyS3HwaD7krVTcEeXaeQ)M)m80|L zZaQw{9=Y>MZt3LlMJe&-g;P<alc-s|Ip7j5-Pafg(Jg$cl?Gl)&$MFg&9TIste=Ug zR*_g~I-^G!og_AI3MX(qf6EJ?yVXP-yQL)3NeAhF`QIO0lC1L%rmImOsr>O(QZ`-| zd?A~01oxi@_`M|M-!DAj?Favd75?W-<e7h%TCft{Bi3mYxFJL|<WjC98Nc=GYeGG` zUxb>06TceTYs^<>3-adac{Ay*j+de;5%}@o3>iNk=CO4@-|esxFs_t+zviDR>{O-! z^oGc<ryxP^x`RFHMr3Q|y`U@ZC1RpV1E;$ZpGgp5dW%y{|9iqyAgxm$_yZ0~W%e7m zjQDmvy701<;$_8?ES~5kFzPTlKtOMn@%FbEC+Mu47_m`j@_Jss!tu6*m=X7(R!*p~ zzQ}vCHMnGy;*v^p^={>;r;s+%n0%h<c}xuYQlqx_xA@++;)_IrKs611+I#K3a#4T@ zN+^LZgi_oCMuE%^ewu^C&sm7147MG@f0ua?%6iLk8jT-&7lDEvWJU=&tZ3Ma_kU0b zG--l;QJ}=-h=SkK=eI<bd}e!%$2Sg|J(ef3kSZ(DOkVuBA4KTck8j)FcNv7xv4JqD zSYWDB{i<dU^y)<o?XHT$Hv%Q=ZNn9bCB^S^`J=}{^kFzjRSCSI)r3&uV*dkc%_&9= zh$vc)cs#rF^#iA&Rm-C#s%UW#VM5Kn*DxnuycfdYZ8olg6uUY{4};l%qM{^Q+i9c) zzC8%@>NJcJTbTfEf^Q^wgXT|Lov2u@&gQO`hZT5$dvx`I85;bn3%rY&nfDD_0zpVw zAHUUHV}nkQXj?x~5l2PHIlyj$Px%D3cW!1f@xS5Uv=w9Se#hreEOiZ*%)z^$#t%uI zb4NX>v+L+h;?LSpy1@p(b;_@%qgfCC2n}0NXsUX#?##w67gibX${<kgymjgVqzy&m zLNHCe_|nNw2l})lD6(V`NUOp>nLep{(g8{Fu<rCn3|Fhy9FZWQoKK7oHz$;pXY3?e z?-E{*g?+Wt6Xt7{f%dY(1S!y(s>fYa9d$Nv(<|M+n`8FkE#O=ZHA9@_9{TVyKtZPH zS23CSkX-=&1~zu_j+9eqMDu>%3YxM|`;pX4`K`e>WBAYia9Mw0h@I=JZ^Qo)I=&b{ zRW}p2tPh61;C{v(m~~WI(;q^7L?(HSuZ1}(lQnJ|(JJ{;LS$lFW?@vQbu72=FrKLq zTq|~1t*eu_$6<$Hjf!*HSEgY9!!?B4r!s!^?J5UUqKj3&gV!m#A~d0l#OlO~*$F(0 z^c><aVIM%fY^}BE<<2U?&V%T%zns}^t%V&Hs%Dl1k@%dWXTJ`H|Kp{Sd_(pl%gkF2 zApG|U^WviGLXo({s2=MToRA<i)iZ;st;b^c`BV~^tj{PDgq@D!W_n3K0pxq2PW9d% zXeD|hdmcGNIIZ+ftl;&pC3x9W8;3GU^keCUf6;CDbn(z}cac@oepxu&685=7Th?IP zFzEL&ry4uY#{#wZ2PRu@D$MNsUPL`FR4^FO^TtxvSW(c>E?Ym2O)~v5-63b9lxd69 z%-Z@VI-~T%|9f)g+>aj}68U5iu}Pc4&k2c_)a@b_T1hnI3cdd!#-#-k1e3$oOxy#x zW6uCe(x~9byhnP6R}zxMmp1Q?O??_j@uI{8+T!~J1Y+B3IWsHNdP_Rv{EYRN>i~_b z(U3w23Ef7Fx8w$6X+P_Ue~QELLP!q?S0Vop9^e3iW2xM|W9+<q@xwY3U_b`LqM*SX zD$t2rTWK}*W|4|1^%RHY9wh&Q#jr_7LFy0IP?=Fz>?J2n5V^82xN-y9PHMhN!Atts zgGNk*0o7w*k+SxE(xOIp`~wS=YFoP)9<+!t_F<?2?GNzI-+j+Moufb%6^(Gf+<OZt zS~ERA-o^C5$BzX4MRr6=s6AIEZ)eF9^<C^hcQAl+pczN@J)YZ)co@$BS%Z1DBoYQd zpK)Y$nY^n<&fh@3P3>BlOV%0A48zHUg5ohdHTvV50vqWtyP%wH=(%N-1@*Y2Fg6Xu zw}b>knTn^`@Di6`Z0Vt4JCYN!1H1eC;>I(GZAS!+DQe*+ww}7A050QUIDfzGubMr? z*!xGRaII)1JDZkiU*F#FRq`fnhrUPlz-ZXxoh7Y5dyO~7?gtd(m{4>X#Vy(vfFH4# z<?F;H*V;c_04l5QozU@o!0(Uhx}~*I;-_+K&l91D)-XdN@|0wdY{Qw)ncF`zjdSO% zI2)4&16dCJ5g#O|bO<ApMYV*Dk4fxL*Gtjez;Deb?;m+rrarQWudo=8l&-VG-Nsu7 zFLU+cUEm#6+>%NiJ-S`DEv`klF%EL9sd2IwTv7aKTD+^3HnRFPo3{(URtJ|9)s9;^ zN4=5F`!51S@+T7{ggrc=7Us*^MdgOy-C0iWR`py=bu8n#o^`6S$JR9oIVq(<Qszgp zI9YA{c)Q9tRpPe<?<T_m<v5-r`$(Eo(Swc8QKqsU*`=Fn9pAsZfvf&D&;P(NJZ^E! zulE_vXq}t$3y<9WfH=X?Azbf^X5rj?)2kve)EB8FhDsQrAMsX98S#PTYOb}8@{@;) z8;LHc&snpINv3lZhR+(3<9QneGI^D%M*2+t&3wv`T{EAEGaFg=Glj>>$Fpa_@^(^0 z4GufJ<zd@JGo2$M?+#ukLh?1sgNf=-aO*74w;GB$o=Y9IySK(zWut{m-HlCxNoqP8 zt6S^^^G@vOfe|?O<C)>PbA{8W{XgGPvd5O~(jD<W_>}P|_D!$C5?Z|w!^s}=D-=t) zX<rQ4(R8{G1@v>?-<SW#4qpK$7n+p|f5OqTtG8V3kKtcD!e$}CI0;WWsK4q3ufLh- z*<w!6@RTrqY5~#lK`{yEvn`eAv!SwoR<+Z=nTC-lD`8RZy{>y@;6cf2dDZR-y?Y;@ z&KkS!xf8Dc9R%C49?J*vVD|7`Uq=P<&S*xdWpFK{?y||rBUqk;c%~v&3J`WVCG!xw zl<(fXj@QiZuMviIm!VR148cp`_3R&JAwTe16}yv6)6AKFm-SK(`BQ)U#cExHts3nE zIUsGl4Hsz@#oi@Q=B46^v<wb;=%2D8L*?kz3WzSBP7*p{<kh{0Y$-1x{)aOzdKg3a z;*ei4nD$RXl}G*biI^TS(;0HP#!v>bN88V1jg#U8GDS~lV_?uEDyE4}s509#;tzl1 zd=<;nc>ENMu-=9aBaod!X++9*0;M1YR9qU60|^K4(l)GpUZZX0Eo@o;0m=#jH$4AC zcx8BgDfG~vy<;tV_Gd?DHCYf@7a9D~B7Immi8{2=fJ932PWv6X(VO6-PST5eR)6nc z(8tbva;gXT6sxcUTz|99YTa|?7?`ie{*df9;!Ef|Ui>q;-3FXYH;S9R)bJH9qU4A3 zw2Pm*vZ0fFMbdDhK9fD2!U%F)5?ZsY@LVkB#~TGGp5o4?A}d`tNGt&69z2smnagjz zh{=zHr7GNIyz{mg-5^0AGt-$SBlS=NJ&&jCLpDPjr~|QMgr>jk!&$hEIm~v}B7BQd zo_^W9u`^1rlu4gCmS@ZjQD+eJYIzqAMZ%k@pMpR}KB7?m6D7RCzJSXFRW)29Ir3g3 ze^V+0G8;!{@AJOa*1OjF!u5+^eU0D36t^Xn4m^b8R8~hqL#@eU5ZfAX1It9;ZEaYy zQ(FXP#P_=c%#<$Hcx2AztGV1la}3JJwnsW}gJ}!90qIe5%XfY?@6TW$-=kq|;10td zDi(&irM^nhu~)q}3%~w&`LCAJ2K)Fb$Zcg#ztAI*)ER*xG<GqMV-u$n%j-B=SJ|mL zFq$tK%WIV(MZZXnSWmDD=r(Jqv~G}iDN>J5>XBPwn8snrksrcqJo`W^Ak`<|bfZ{` z0SGfjA39C(4hZgA7Cs=_BNvu$z1{eB0%v`lCQyT()~Uj!rzmpi5T%q$BDh1G0W=xb z^n#<XZEp=(y$Zu__X@vA_jtpc3g)Cc8~|k)dZ>rk%z~V2NkpSe;nRQ9&)68E@hc%a zS4sOv2R0y;9yye?%DN&OLC1F-nX!)7z51}}4DF-`91tLmWd}cO8)*dcSBbY%90p=D zS3(3>2|c2b&pENbn!S9(NrcZ*M{*lf4z8h!654b?G%s!ZRUh75*9XxMFamj854|1- z8<;BYZS6GAKU~RCs~4bS(F?zN3euC)zH(aDX-BI4leUf~`+HCv{v)|e6~2d+#GcHm zS@sfXh(U(mnyfLT&~i%rjw+s==q-6a^<Q8&MsfWrFWtM$h$~u^5jqP!)d%`-GbW$& z-4Jcpg`ioJB#*7{37%lAhWV6PWfUg4gYA|pM^@i_D+Uy;9t=EM{m@6FjQ(`(OER?D zU{=EFXh#bz^M~Tt5#+K5B%(LI7Ju5_p!sap_R?r;qCD@KT`Y{;BMW0E!h9rG4WYf+ znFn1}ktBJ#uK@SVnFhS6GFkFPwhBZEreWU};Yhs4E2j;;p(>eMyVreRGY%wkPskWK z4-g>C5X<i$D#tPsmJ=h2!tn{{5Q8w~*b%>oE77-?zU=sKAN8A;Es_VxM$tb&V83_3 z#c(?StV8c_@<123J=+8%aA7sggPTqHPAf0cke?5K1xqgJ&os^#vW^>EjMnhiaWHSu z-*Kw-4nc?(MA=r_%U-=`D0R?e#3&)d1Sj;2vA~rL2V1_71Bw45bvtR3Kio!w<D>X= z#NGUx$#1t>MUQSG@-*s3SQD363Obk;n1-L6{uY&~&@SvLYGo$GqSE%Mk1wf=y!(ig zQ^gYqX$xN#MUhIJm&kHUtJ%wpNmnd_ly{zY-oAxV76T0o1}#Lr>a(W2uPs%4m*$^L zR@rPzb2~?|vPXT#ATye{?QmnLL;h4Y8Tf-BzvI)`N}3F$J-8!+-vmh*e9tGCED3kF zgi8L*r9<lb56$S%no-<u6BaS;rzORko`WqbhJd;~@>r1ZdMVBl<ZkOxPG`LhRiF$e z9viL4cA!6Um-B`M4UzuA(HPj(hW|Wo)n+lrUS$}6S^2@n&Pv~_t+qSjwd?bL$vCk= z-z*-&Uf-v&7)I^6)AnW=Ch@6P;cc-6mX@c#W5v<bVEmV+w99ZU6cvY4#lbj?)Idyi zBeB+fBXJn7$2ErDaQWszp)4U?51R!VCOmr5X0<wYa^US#^sUc9zlIZ&(s9Km;Kj+- zy}e8KTKlOpD-ArYsz~=!7nDw&#z6&aV?ebdu5tY)kY9lj6j%9!&U#4Y_5YDHjE73f zOl#F&S)dZ0EO}5#uA0d^7+M?o|GfU-8XsR3%j>0If#BU#;qTd3z9{3f$}M~2bc+!@ zC8C!nGkW0$l!Q)v*r`wLBu%23w;O<Ro+|@xFh_7-tEkY8EU)2L<L;?e<C_PUQxG{P zy52ER1C)_I-sK0!fLfGLolx!{JBj6XB-}fWbt94gEiQAdKOA{vv3Les#)9YNTk3X# z!9a3^=y%H#J_=&<uk&r&Kq5DpumJIE`B(zfX`j^pYc2su53axa2@^XK6dg7J{8f($ zOuzuH&{t8vKdc~VZ<l-KcU1y6c<f)GP~`s-UM{__gWoBq=XLOr>gN!r%jL-_s`&S2 z`M{wXPyLQRtD^NpS)0sTBQ-4vO_JZU4IWd@h=R_}RtC=<KLIfLMB|nHx}~md(1XN( z*BnToo0_gq_>`Kd=@jP_kKXl10c@@H4o6WG6s*D%t`Pn17ul{DGSPG%;qQOaLLQYN zHTw4PGbW}{f367pV5nIXt<bR5J2Vslg3~9%_BLa`=??-j<OD#OZ&rPu9$7g8hwqB+ zRG;akAWl{If}_Dw8dmrb7>0fXB=MaIrNw)MkIe>ugjt7Ooxx=A2nKIKs9|P-qs4l2 z{Vs5)$Xm*HhWtRd{2LGP-G&x0P3D4jpBZl=OZoJF-1zF;6{GZ7Y>WV3PBU=|wo1Vw z56=nGKSylb4VJW`TOMK1K7u|qQ7Pf}LlE$NSJ>$_N;mKfh}%fFK?w9wb+sH5y~9$m z03ar_pkxSB&`2&pKVoSz=n;LRe7q?`5i#QE$qVuw^CjJzP;{l)kpHWAuBgsx$h1qz zE-bp5Yz>x)Gep%YW7+SAzwdb)!<-VSq_mPtQoYSvunkB|9@V@TIY~3@0Y?#T=oM)z zk_GCvPG85c&O=D=%V`(?Ox>l~=0`Uwt9^FqSML$(`CJ?*A8{k4rVqsEb;(dVKBd9> zQV>EWo`CaI61#03MBzE0mEbjsLF}}@+5Mh+lLdJkY_MJflp-=e{78^dZ6f8r)A=jk z_m+lwY2#a+w)0p2;@D^~E`6##uusoa=)(=_M~UsZ<m;hleB0y61?*Z?^lk_}*{e&+ z%F$A~ZkX^GvlGgEz`Y)Sd*j@#GGvx#v@`;B(~Xu&1>cG}r&DhY+5U@vyE5YeDq3ZA zvgSZ=0Au-DI+4Ll^4`5;6y4Qtz7&7qJqV(mCqHjiO3?)#lv)aLPiFO!PImN^M<h4X zW73JQrMrFj?uL|<owH7=lw;%?X}1cwO3OFxb|0+~XSy;EjpMx@6hfHt+W%j@MAkc? zqA&(33LtU_F)zTbv2D2B{~A2=ggs=pSr$0BWUkuLklQz{66mp2bnwa#gjF(a-B)Cp zboolTb5Q53e3y=sMyP}6B15jurJh#No6SK+xU7VD86Ujqm|W<bmSf6>>J#55Oz&Wt zFp*d4Fg5<VR@D867=T`@`hYZO{U`s7F7QWx8ATLhJ-5D-z%_BtG9BR>)>(DJY5>xz zj3TM|+es*tspQEq4V>n@jt(*tXTkhYaM8AKNoco~;=#k42MAsfu)1pj)|?YMuURrQ zRJwM^R)>j?>Ab9u`0?~S8DeOV)#5aZ{)`~El<7@fj4Ro~HrO~UHEd=Wmj&B)5qmew z800=74ry2ro5*ikkF{_ziQ5C@(!DW~`XWr$$6WqQPmud&ILLQtRaxIUA0V`+U(QXo zE+czq_4BCX<x|H{Bk_^MHaHVu-c6b#T760AD<EKkt|0dcb|`{iH{g`r9ICm<T*T{M zG+b{r)g^6<${2o$ZH`R!fbRJD(y>(Q%3-3%4I80^?5(UT8N@|GkPgP(qKDDe%A||T znZnHPjC19yos~GwfA0P&)|0>?b$blVA|fBXZC$C?q727jYC9bdHy_C*$dt-cm3(aj z!W-ih3Ta^2hwND_gwS99pld3siyR?lvSToB{18xW!GnsSx9?<}m7(NTzB5iH*BGu# zALdEGpiyk6$p4N<kO)rc+zB#6xdFqN(nrc5t_>MV_0OMSVOnZz!AFB((*b^K2@d1k zY*T!u4~8>x@beB|XEO!`+qt$kH{8H{q<$By3qb+Ws?xKa7Hxd>^)<m*6C4{2NS?-> z=cRr)e>A;+UU<#_@bh+3qrOu|V|YG}Xm%6RszsB5#C4l89m1Z|Pg_qmj{kFZ=9>b1 zqu4!@g!aCzVC~)4-Cz?!8i{4{prSMBn?)z*mnKVy=)@rv0rdW(4?4=Tcq+3bz+@i$ z@q`X8<+zSX;TcTmbyN<H;Hg$f(K|t!NH>%_1S?FF1g(?Ys#2#U_G<zo?O)xIRx;d} zrnDLo>MCSc{cOtc{EH#DZ8}ZXVrc7)Q-dpOv5Tjx-pHu0h9dM>-JNyr<7v)vN%tnk z=i=QbhhIk13tDbZ@^6n(@mEFxtypQHd|v`i6Jr<O&y3}e`Tei|<l~L#{hF^l6U;Mh zK?nF8UW{8dc78`3?6Wq{{JvPll{ij1;_U5j74m0D)cG0Z>#?caUjPQl+gr2|`8KRB zjU~zrGEVDWZlpBIApDhy=gT18`8Un-__jfF;ZrQloM+!TRT@3rG^<P^xOD5)N|wqe zDjpTZaqDznu948L^k0l@KDkP88!~$Q^QHrG_t8C5L;bUot$Cu3y1Wy{MwJ}GGRJj3 zO%OzL6#GoyR7SHvP5x)m)h*7~(Gq=65*}!AC$X%l6{rne%7vqQ+yZJ!)LTxS6Hs6$ zC|RgV$hO)bGAc5bRdhicoC2MVP0gNKjcWZ;p^%>5KjXVEJ&`A|>8ly=(8U^Ef5hW^ zp^Pf?D#hMn<x}pg9LBo-6D8IG7mS|3;<re168*bp+hEoBBj?Ay9$T8;$gVKrpJv8I z-pz#yMITDg{FWm7slD|@W<}{tCSE#*&W>}XULg(MyL*yJWyVGe{y`>QZx-nz`|=Fw zvPa-W%x_D*FWe_;ooJF*o;?hKR?9-0r8pPwePVNGKp!P_?$%f}7g6lTtkw75&$QKa zxGcRdQM3fUjS(-kPragsE$43%np2wm6HQx#%q#n;B6&715L+L_#48m9iTMXqYNBeE z{?fv7b0+nq8|oGoDP{P3nlnXJ4@vHAJhZH<KY!QoFHQvVmtJQi#9Ua+SVZ}_;b`^) z5RPS|qp`gFpkeuTf0f7Ui3ZTS%#on8KfH(q%wp>bOa_x96cZD|wA>yGa(#Nr2gEJD zPF0vQ1JWV0FMtbsm=!z5p6vTA|Lu?0!S4u6%_eUz1vcD=)Y+9%w3yVE233GxHELsJ z$k-%*zU%c1ko{uAcQ!bnQGU;HV69_dFjB(V4XS1}a237Y`q1+55qLY$)lU?8ExAm) z+Yz=D$$Fe-4=l?MuU?;T6AshJ*#nifce!M%X|yM!_oB6KBUuIowy0b#qItc!T`Vf+ z*++6X+r5(kddXNHe?&9%9pige>;o_tid?;gzPU=!#F(K+fgyJY++hMko70#-`0=DE zWFwfiWO!Ha5{UF#J<}b(vqh*t$Yp0`szP`(h8UgH`et!K&+yAjR^mx^Mv9nJkeB35 zbBoUKK(<60ZWtcW>IPSl-M4D0M%61&76IunrRJ>|AN69AOJYoM*cy-4SR*bMw>kBY zC)qEm#n=NoFCf$GiaoS@;Qu`Q5f%IofDvQNkSw~*>LILiFCdChTIIMjv?b_;Ma&R0 zmK^Gr<0BL(+i}T|zSu`EnyQCTb}!A5B^h%pCEBHLrR&5?_uk#}7j}}H>Fg_-?F+CZ zj^%G_P{)%VRAkNM?V8`b&+e42zQ>%&D|bqz<ET8SR7jGXtzS-wzcNE6OKX6hIL|97 zES?C@h*bQ~^LnXuEeSbZB!e4>{#XJPQiAKlXb;~8&}bxN>4<EYbqJ1@_qu17idQ^h z({1W4C+;o@s1}Y3*e}Ug{^)`lV#}{j9?D|Kh9IlmzD|EJP2;%0nHXVHf3~E3OB`qO zoNf@?>Cfi?&r_#;s_Z<y?EENWDKQny-;;R1X9NpPHxBWha`$xB86&fLoeQ&4zvk)G zkAAz^9iT)chRq?-rl<>A#alM-CjVd4%+Ws5g(mv-?fU@wlC^Aqh)jJE+pc)mE#R^v znh8uEAD!5rtEWXKdB_kwg8x*pKhj|)&TyswCHO$q#HGf=HSm0D`_!-OC*%w&#$Bgz zIOU_49Cc*crg#5$eDXHJG*(H6^WwWiZEA&$Pn?=SwpLT&o0{%T?{mkZrQ8`XyyIF; zad93c*)J!;IQ%|78;3g6G3?Cs=>dFdMoj|Pw8TUL?FI9LL#sb0Pfe2DLRWLB^d3sY zdo$#iW+*00EpIyX?|Vaoz56$X_9nmDbODRaTMj9f3~XNWKgn(<Fb4dIe-_N{dN`3s z6Mo;lNRTFW=i*3$HpmLOgiiVNoG&oX{Q%Y7mY{9cRZ>LS+XE2%v)jFT^95GoA5UWE zRx>`-^hb#-B(53qN|+q|adN8YSAREF_$B4ni6dId^Oau2oxO9;8kbhAhw|@h?y}_P zt9&m@nL7|QAI&##yvaXnK5`Xpn&#bKul>FM>&<d*w+KbH-gEdF?^biK#nJKQ_SInm z3EgCub#T36($25(y*-6ucNWhzRZYD01aqeGp+{b4ow_TY4Og=vd;L=}33n&b%%xQ4 z#*tQYl{%+KO`3x3$R~b>ZaFNU*gP1}XNt?mNVZ<#pOszxC|CFbV0$`^#du12)EbYQ zpP-or$2Z$^4OXb{uB_HluAJX$6%E52qbvh^SoRY3Q4f=r9Hv-5kctd6&vu*}{#8c3 zjfVA#l(T|UoHxEW8zS;LA{AW&5G7l~KG++||G5YNGC=A7?iEGj2#dH8kXN=@T{Go0 z-*{ZCP6eRtzFaAK<iO%yMzi63uLq~~C4OfFltfi>x$xEfvMyF9YvFgJ>@}#Oy21hw zrM?G#?^B|JFdVzvP0Ez_U-y!iNp4{Jkt^#mQt5e?Ldza9*Va0Z<h@KVj12Xx3h(<2 z=^{U%Owhjz-^)q$5CtpYbxtTY1SOFW&??}>P#6-(X+QCXq%o3;?MFLqA|H0s4oQ>2 z$jS1^CR_m%seE9)@cw?$wVq<OK;Hu};~u}D-$7va)crI5yiZqQFvkF+_v|U$mgHhl zmxkf5NSFwjyZJf|TWMkhsLg*xgm1>8wHLJuK|NjZ+WCoh=*gtQBEMDIF6i<{TO?#g zh+wL|s8r*!>{U8}f5DZ;!z<Xic7>TT)Nj~EPwDq(i(6<&GP5NTav~=3tJFXTXW^F) z!vY1;H!k^w`BddMS;Dr-NYr~Yy^%cmUIsJ9+?)@XYVrOIrZ>P2)GDljz<sXP^U^oB zTe!!7e5Gpqz9o1Q47bI?eZwuNW4!EMK$57JUv}Ot|MFP(bam3;quu3k6oy6jVq2JD zrR{b@xk+EF^VX!Mmdk^u%XZ;na=a$fs!*^OZ?`q?9q7S?ooxw!b$Bxk#~+O3C?g~2 zpeNFlF9gV4@?NCYuMM8SD7`_#&s&)kJaO)cyXdc)<t9p|-}J2kv%^n32KkqmxSk9Q zgPHwt!2ZV&)wHtbXTZ`rdW-c~KhrDX)}7T0Df`MVZS%adJn~vf*S%XO+@x4oHpTXu zo`)qfO5^EVp==V*!&B6`VCjarsj6_8iZIS-xoU2qb59Y2I;qyFBt47zs46)J78D7a z_MYZLeaWIzSy9FlsUjlh?zkz2GM8#9N^>*(GoiZraskgvGEw$DsikI!Xpgm+BgB)x zSMYfTFoTf1_wJcy(7&Z1_?WJgeWZ4vue0$<0taEy3Wws+QQfw;fCTi?*gLwI2k#Ek z-R1A<bI~s)PMTLvI#>(AoLGE+a7@KvwdX#RhYk=Pn0$Mt=@EHa$t%m2(WDZH`Zcmw zF-D9ZFWnDoN6$N}qI!=FbGZbE6x53}SXmW5^1?UTSMahL6a@yh_K=1zyW{3^Wg<3q zn5R00f<14-W_pv#v)=~2x8GsJOVWuSm-{yP2#cWFV9Kw8pjl0bqUH{KEZzIE4RUW> zjt(6_cFLuaji^6p7h%Jc6iAb$cM43gl1q>7`rz{&djTw9ObQ|&-1Rmj`(%|B?IV{@ z%YP~_RNNzUC_5~nxcn|!?CV_>v#fTHE;H4mDIQfzQiG@giF!D}%ZR&MtX@T%9MXL~ zis;n`ygd3BCVG}gn<g*gfm)|cx2CJc5aY4J31ywYR302V`oqUY7hb*7!JF2dmk&tK zCD1(Po|(45O+8!h%0h8;nEZBv=1RxLZ-s;@xlsh~bZ_*n5F&aL<_j5&4^MwGOMXgi zc~}Kbp~+aTu}Td{suF(`?M}Rr6hSC+N9Dw`IDr=xJB~DpO-;8<wyY~bf9iNVp}pF7 zXwD{a&f67TuAYRLCeCpS>m;2Ri1ZSF=isY02BT*HU^Od%R9voB*EOwB_q&YsU01F7 zo3K@9p(%(m=_8S$E0&j$)Cxx#s^p3v8lp}_o-ZE{vTX|cRT``~ab?<~Z};VR99cV; zhm@|=`&`YCt~CR^%+)lW!@F7xT}i^*?0;U_pHOm?RnoC)lVB$F(e3t%_-%nA>JjE6 z`@cGTU7ZhXipy(<TU!dQHjM}I5&n^;zq(g&D!;G%Zv4&Gtg0js3reww`$6u1O<=(y zAJyNbSXb`Wb1x-$i$ArzZ82~{)YHy1wf(yMT`HL9VX{?Px@SxDgJxjO;w75dU!>PG zdngQaJUpK=(_0aUaIn1<E+m|wkG;n#mly{&7W%><CxGG6SS+@PGHXB-g$T<S$n2}b z-95pO%XsiJZ0uGh-{N^qEc?$<u{5L5W-49RjBEP8a;l$gcnP?mO*6uO!wO)dvT&ck z`6n<9e_x~EN@&h0fhnSqVA@t(@=(gi2*9{BQ8#<a^(Q=Uzl5EEfTnwh7b)S#%y+K9 z{9C0+yM~==y_szYedm{3%2S}UTlwRvV+nhM=SJu65Qrw~3S$p<3u4bj5N=UHrtHK^ zIVQkr#^S3ECc;&x2saW!c{U0%hl`NNzMDJAEOLn&17)vf`Q{XNbL?Egkt_>YQR4Qm zGSD6L9)+xpr*!%bI7P6_+7jbJb;Jfh@vl&ehf_9>o5~|A-HtSLFdLhS!T2j-|Ggme z6|VHq!I>2G#SGBz>HY$52{&LZKR*cgL9}QCqMUvQ(^!|(It+-7%fOwx`jGQWK<XL? zS`F7_4fvT190_mpA%ZIKXqK^<IJi8A{sD4{u}PCp?BOpUTS;UH^!xV~c)!o>rY^@r zn-OJn+Y|FZRuCP-Ec<5P-rk;zY{ridRrWWx79ndtQ0s^C{ZB6sjCdrmk0s_>Ln%sW zC_xct5BE_!8Q6%#?smnXJ$ycqW}Mwy=baJonRI31Hixdh3rbs}sNrGxmgWFhMTWVL zX7G&e2DwdU^zMEtymxuZlpDMxO&54MEucbiq9C&GCn~<vQr|VXJII|+lzNLK#rUx? z-e8Sed=jn`yeVHQZR?9EAw!(2Ak1m7#(P@yMn<)B@0lvHj2Jb|hn7>`etBUfdBfT1 zdi9B5uT5AYG_kU<<F*FaXZD38oe5_7{P#Blw8-yo(95HxrhOg`Pw9c~M#OnD`b;L0 zukKg>0j}q!9o=%A>dVR@dc0}ZuT>~vA~_8Ow#<@Mq!HNgV!goAwqbszJF)tvij(=o z=*(hb@5<=%{G{w{TetSoy5l=pv`X(#nf}kG)WSyN)(5T`zawFfwTAzMZ2NH8G#nI- zSH4J{wBK@4m)|9CdmwbWH(Qrk1u*MsgZohlHY_@}Bayvhnwr7MV|xaEs{O0yt>>AQ zl;x=U+RWvw+nE@}iNiSQ9P!<;$2?lv)}dukySgR#lv+?=cM7o(pVcIh+ht8ceS+gW zO{?H$I1r@UPrXW9x_Q?yGmu;6%X#0t&}r#CqK9|pdJ^f%-rsr@SRZCNY61_TH_u$H zjot9<+D88<9nV+Rv98T&I!O=^S3VA;i2C?JB+U#TegF5E7VfHh7Z!Z+U<Jodjk(2M z`^Q;s@>wz!O+n{!y3fZ_HhW&ZmCU}MAr*ow3vSnZM1hKK0w|)JPbQoVRv(SeeABAz zE~%6K#1QDx&}-{G?(iE@PK|{afhyt2m!Uq-$uf;A6O^~l2<?;5*j-{!(0SI@^y`Ec zG;K2`Su;uHasG{2kCHogGZc|dOq=xpRQ+Y>HN>j3#VC5vs!>jJ#dF!hA#fDJyUO#9 z{`ZI|8Y|@+nzi?$)5ntip1UW^3O$^I7GfDX(-=(rOBDqXUjJpFOFw<8pCn|Fd!lC; zNo%Sb--@Qkxe{71)~!c`e@`K=q?@uR_-DzK_?sm?32-TEfbMMooA*@9a?f(v3K*QO zx577$z~01L{!Zr3^<?0YOoH0)s2_Nll$kQ^<OwW}NQ00r1)hfGq-)_M=AytdSiCA} z)q{^q#r5$ScWb=mx^zhg>yotI#|vXcV4?9)G^P`W^}L$QDMKMn{}UnD0{7B$UBGcP z?dYg~b$oelESUQg+n5kP6Y2pwhcnG%^9ks(Njt)1Ojt6At+e@2{x~<Wt=QdCDd6AX zEYJV$?m<!PG#t1eAx-HGM8`QmB3S7L<f6-ei9a_%VVm5rC4mIR1+KY*iM?d7^OMzR zu*ukM9!weK5ZIZ%Lz={A{2prmI0(LARQ#}#hl`_ggihG8bIlgkEQ771zkYAdv|@=R zmARR_$f8OAlJS|FFt$Zeo%mp09R`-ux?JfOEV=KHqGIrRe;}Y>bNw@eI7qWMWxK6> zXO)u0=-KtqKY}7(LEw6x8{v4<W0v_^D8<YbP#F4%oXi!d5&sq!`z+wzHoGYSSP7Cc zg3zlwC0#)t&%N*cX=nPA(n*@Rqxg8n$UE$hbqF?}1CX$Bv0Xkq?SaO;oyn~pxG{L$ zW7vZn-^q8qw|b@2r!AVVxE3cF2Uc;HN9dHF=sN1T7)F2gp0OYa^nqL%hMqlN6Gyd{ z@tBDL5rSdiR}H;?`G4)nTyH8Bv-%!ycz<R#r*a=>%O?>YZ?{_7h)6Q+5PUwtmLKk1 z2*id~7j8(E4$4Z(m87Qw^%4hFc2=6JFLfAPF#?SzGwM-o(TI5ACg76#r71&wp$B`S zlp>LDyGkl4;Kt97ZWW=%H@%c}3I#W@E@zytmysk6U>v8P8Ahe1%aTb898fVXJ>0ug zjmk35XdXLF@ondtsrPycT<^WPzxjV5RZn<7!lC2KnN2{}3n@WWxB>hl-NhP(GBfs< z^?nhX1U}=QL@J*4u0Wo9?guP|7h0jsvwpZnJN`dEGgcu#p^6%Ym}QylO{t{DrYh_{ zOe3#Mq$b-;jOwycK|1y9-P{<DE$i5V@jY`GF>M}Z|4hc6<`fd5adE2TA0LnYKqFXa z<NWjT`K;%~gRf%yB>_1-C#y)i!={B5Z3#YI&#s{1vR@cA_<c1gAxhCoz^RC{rVsK$ zhYvBQ1G@Axm=IaBsuu<IQLQ%_=Fz;!pZ81#&9YmQ-<R9{#+j4v$9{X&eoW!eNICB| zuSCJBp`*WIZ9#!?K4sJR!L(gQw>dNFdA8LQ9iwTQQ?2D}#RNR3K}XQKSF9@FRMAQ2 znTdDp#k~>kk8XWSXN%=L#?#f~(~NR0GQ>H>q1+_Br@9mqeq!A}DEGi~DL(MWGnm$G zbYX9al<jQ^V`;7ZJnUQcl=Q0B@X3S6a~P5C-A^;k%Z?uUbR_BCYwov@P`-0V*Q`js zFdbnj;nb~ml_7_8dkr}X0nTGht4R#YmZ?0KcD27Xj+n=TPvDVJm0h{(DW;*b9sccd z*TdU@LHS~mnEW@13HDUURMQ2ozOn)9y|N*%5(2pg6c}G8#Ltin)ZQ0c>Pb&_EsD`4 zTcUWM{xwvi`dirH=_j)OLfc+(I0Bu4AupNqrvR)B#wW(Dd#|Olu*boK`|dyc4G05E zN<H{Rpf4{D6J=&6Y)1@|nc)w|g0*&9&(uzM4l=+C;mglD-BwfYT@NLCP5M5uf?r4Z zZ=k~N1h~ia3=0DXt_dg2{XudF)%3nRS#>5l)+2$xjUEE}O$F6twr9MoF~kw`7X2wg zY3cQzqI;dpe6BnC7E$=0N<yNbFcxE(*!JL8(2!R^;~Z-x`FXYdt2MSl69XhdUfe0P z`3J`8?N-4~pyA|7&~^XPRP&%%yGDiN$^4CC?&~qGegJI6iKHG&o|ghhMTmCyxU<Zf zfR~ow8v#LxuRc99p#UqrGLqFB>^}_0M()xD>a|DG-N(Wu+8Jdbyyp<H@MaxZn#J0- zc(?j+(jo`2&uIgey`Dg$iJ9rchU1#RuKW~i3jNX1O4{Tpw1JqAZ3)Vy*ec}RxFLB% z9u8B3%p8I(_L~LIG*<N-W`d!9jR3nAaXxUHX3%az_=iQ%@;+vCBWp7Rn-EHHHK(Ej zFd?g{2ir>-?bG?n%pMFdLv5FPX|9<KQTi7$qx$5j%28*;n`H8IM~skjI~~IY=|KJ2 zn+C}V&_%vTKN=GKZ`X1@LqUfuUPEr)MLQt2D8;}RO#Q5%Hfz^G$JPGaE`13X%FFp2 z=&%^H7hRUxBaA^7L`~!^hoqQnG!x<Vp3`9xXTpb6!uf7uX31QM)f9)fNhU$`D9$l; z(Q<vS|KGIsdb^$6HfArNYD|t&Ce3|ZFdi5wn!d*vCPf!YZCw4h{j{MeT)2v7{I(ln z3YVv|d~=ME6ea=jxjXb{xV$%RDZuCP_89YkyAQpUMhB(fLmU}50y>-=Yptr;U;JPV z#T|b{&Rkt6ZT3K3B-=WzQ76?Rz$RGJ<h>xkqq2?ik=eU@`_dBDcX_sp9eQ@;o9zfb zfT<R4AaeY}w^50IE@+rb-H6IMVLX@MyznvxDG-~;)!)fBjRTM7t*Kl-Vv$;MEHx!U zd7Ad$tG{fXY)S<xR$1VulcL7EJkMwBT-DK(d~)<v-3Hwp@&#+c>13~y<ab`WTS0}* z+!$Q)q79zqHQe$(={0Ug7*X1#T!X>X!|wY`G)<T90<kx-P0N?2T;^_L+E4DU`*dQl zx!+sf=kI+I6)DyqK*UJNB5?J@jrL16i(2F5q}E<nM|zvnt;1vg6t<_XOm^mgRb7rx z#>1(JnX+z@FHrl&Ra%sgy`q4ThDWcRiTxGeI_SL=*OU`G=dfvuOb)|-W0hJRqp{S0 zH{F57jWJYdbGNpbip5oR5@M6m|7gUTCv?}Z>_$*uRD@<j+=il-YzchFwSV!bW1Ap< zQvp0OdPZ8^FT>xIF{kKHMaKb*2+egrPidViS7<V@u?`80IZ>m;SGMnupx{WiE%G4P zn8Z<i{|c}yH5$E$N~H4iXXXn@HN~;>!S}e_^GLfDf6{En<{<Hw=CR_kyY1G8t~`e{ zR(FP*cNzY&0C;+@K^VSo{#JL-pG&t)W7hkO?&NG+r%7?axSjcVTmhX-Nd7I<*thaZ zgQ<!3Q`vu#k8^(yanQtj*}}CznzdY5-v6vX(fe)`gM=>Ro8Sm06S-U_SO@HPR3GyJ zYc`M!Nm}D&+4GlIAfE#+-5fOXwW#))WOm>txVhIp7H={$Up?`$O+h5e5io@@xGl%T z=i|`8so(;zPLKslC!L4^3k?(=C)o<<bPOebuF6O_kS;MNqgjC^=o3uJK+jLe-YL;~ z05&iv;pV};DMBOX@guV<yZ2r%TS-uNu@Yv{;rl%yg}@!*da!Kc@ZH9<KjqHHA2@*X zRmsm|Ks1&p!rzhw4ON2SkKh~jJ;WUXQ7RtY@J!!P1r?F*T|~2WoH7K$;I*$T(8UUM z@BzGIS{mGdoxGu)S0=>+|Bn~KJ=|=1f(yY81Yckah74r^HV?OO?Lw_DKMi5D*^&(3 zACr&O)8U7-lRcm_aw130oVuQf9U@y~>ZIc=t@q|91EvX?%=lQ;tGski2E@;vOO^%d zH()5c0^Lj5Z;|c#5&91gu+KxKDT6uWjuHLDcFdb^g3x$mab&+d!NVZve)<^}P_KB~ zEZ8Csco9@0&Pe{;hdjP3+-+^7Gv42DsGpF3z3^ram;x<_!Vj`^PHOt2;OV4Vc8}g< z1jJ(d1q0mJnrk;|!kmglU-W((c{p`)QT4zApn2`+<wj+$8a$37f9Xsz6E0OLic%<* zcn2W25?toI#$#JEj^>gx9GD5SJSU732quql23|hNgGNi0fEC)ItP2y(SM4?5fH%s; zw_7w(`Tv{~FGqmsHxQ#Bt;Jnoehl@~5uzi!?iFo#a6<$tz&itI#Kflfr9JR_o@dPU zdHQdd4^Ubq&Ltg8DwEP2XMMB46AL=1Sbd^2ARHOCm7hmC*<KKpQ?;eJF6@BLC*9!H z6{*Dd`D-qI%PgQV-vM1nS`a|zscN?LGQbk74l?v+iAjt;3<COjarW)Wn86-rxfxL_ zu={3}Ps%xhH@vu#1vkKY`p4Yl<G=62)?bU5tyebi)6-r`W!F)xsLqPHyw$txU9?RX z!msGvT*paS|HgaBq-v`v=4_p_tn3s<!jAust*;D=y6e7{M!KY9Xha$T=?<ktQ0bQL z7-^(IT96J&QR!|Z2kDXy>F)0LpgzxY-~a3V#0R~YVdi)CS!=Jo*ZOd$n@ES!u(N7U zF47z>&UoPwY~yc}@y*H?)~>wQMw~9*X4@K-#<K9#&(Dxve_f<Wi-0n1;T#X;TfAzz zc8G48co)sY{gl9Kq$fwOH|0H}K_q*pDUJW<7$p&LC86~vi9C*#VULZ+AvKdyR@TNe zRgI@RC<i-&b-E1qdGyfsg!abq=+!^6HwE2|*zX3dEO*Bx%i%dHWCzvoTCij>4A_1( zZz8*RHsj{rWm(ino$hrY-LmsSCtmJM(b%ij?^&)6^IfCQ@XV9T{Y3jMDwNi*E(p7% z)@uwq7ITw!P+B|diUuu9IZcv})Dvv5Ek%e|jZ@D&-s9D1a0?f#A8`HK)$2JD5Lft+ zI!1?PJ5l=bSsaI6&h|7e4Iw8f>;W|GLEAO;$3t0#L!-O;hPUFiB+46$Uqk6TNuMdd zDkOgd8hUKMJ$w9>+?=f^$r&!U>(ZUy=g|hUY@z9<)qk>l{qW`2*f2hJj2qD2suZvi z9IIOS=ib!crE48ui52&slz7tj+Nu;{TJb34qh^M3<XP>R^VnttyxSU_F5h0a)1vvE zm6;9F9A3{_B?`Hg(&sEMExGgpb5R8nPDB6KCdh5PIH?1a@bFJ)km}mhqz3EuTF?t@ z$H7dS9?r{nf8sR=8(g(S09xD#k}uwcSewp!c~Gb}#O~Go@<lgW$pMuPSUu=uaz|iB z(_L?d%HKog$5n|EM})SAbD#@zAXVb%M+PSoNEsS08ElCCLhe8(Wck!3gCX<y8Cvku zu<`pdU`3Z1vPyeFwS2kTROKZmmJOs8jN31U2vi|yvf~Uipt9|pcL>od1rvq~yxr*l zf7Lj$FIhIgnsEccW_gA0gzgVjK03qljg}eI18Q_8|ALUCZi;;e375l?+}N8}E1c}& zaXs0w?0U0?A(+3a?`tz$%C}dMeWaLsN$ntzS?(8xqETV-F<c<j5-z)4eMy&`o8~)M z>YFTVfCzVd0IM`zc=|>^KYx`i*TVrG0sM}-MrDn_Cvb%J7s@eyBvV)=BuN!m$FPyD zC!f-+`Ao@Dc`nU};tW#aHeWB`y&KEdpsg<Yj@?-ZJX#KW#05Go&@w0v5KyoPruAYT zoWW$ss{6(5gn|jSZYo1A>HBbh{H#u25NYOlC>q>CtOc+cYx74-Dw;_>upe}y8{vkw zaW`8KOc&`GzKS;8RI)=aPp~tX71U1H2$;S#AG7$<5u~|+s{dXTq{Zer8J~d1fFsq; zVRam2oCzt}p?bla4XpDh6Lj#{frt#(<jn6>D^vK&Li56JX(ZTrMc|+lEaU$7sL1hy z&;Gc8{kI&t(*B}FJLO=lOvG+{-WtzMH_e4D?38bsD3EQ{T0a-K{E0xoYkW4ZUPMEd zLiKf|kiUR;qO*c|5La78q#5+QMf91CaQDbynp+$&S-rG2>yEWPC@nkTc+cpB_eff+ z344q;Z+1J<`r6tIL4pN)@>tq^O&`JDv*wL=gO&`L*8s9}N!LIb>-Iq4l5VAuPCmg2 z&PW;XO^BVqx|w!c(+DD%>l7aSq6#Zz;L+PznZ-oA@O?lo;f1>D;dPYb`QN_;K*Bve znNNG7a{vO8OP#eV7^t=I2gX7psXwd8siRv2b=D;^<lB>n<o>`}+7mR0Op8yVdYe2I zoFIBDq!GuW!vN^*o2pdy`IMP+g^7Yr8;8|jb#LZdP*u*peq)aZ68ewJT~D*jH;w6* zX5%?0fn=8}U{-C?W`(M3>GRVV$KzGz$^@#q#!Fs2&I=34S2o6S-9I9RkBNAdC6))M zPhHqwv>ixme-Lhjc!%Jm38Xv5k=rjB9Bi^T{m6<8yYFBGg)~Z?%rpf6$Nfy;xc|fw zAKFN;<oc_bUb6TraN>8`a{54h@i=~{E<P9iFl$NR5dJ&k!7`Cv;@Z3Q^SP70x}D<a z`gE@i{_~qUs`|!*uIySidT!B~61qDsoVu}3Uxrl+gL%-5;aW#NS>Rar*wNs!-4VhM zp*zSNv4=TFDSb|3QT?nC6GVv-vG)DsM>bs&@=W9}#!=56(D{QAK~u%_K${SRyOh|> zxFsGf_M6~`(!TjdjfLIdSncX#!v8gsZcFG<u=B%@hw<r$ENJ?wogL?RCx1#Pf8!@; z$l4Hp|A(5$bJ*`e=IhSvrs>k<+aJvZ*p(5o$?;Wwx{n2W>y5R5XGh{yw=tkkwguMX z&~;Jx<Gg=$_i(V`M6@nLJoYEebZ)5sV_b1i)QThQqhHZhmGK;v&y}~CK{}Z0Zq<6# zJo&2+SVQK#Pe!Y<CmJoUlu5aMpD{&0>%zAOj}8#UVwG1KL2J>F8b}f=Y9y8SRf+6C z>pu7#A5l^VT1VANJ>SqOH>2KdqPng_?x+DiCd)KGGK4RVLN|%B<G!f+@u7#y5+G~z z&|mu+zc2Ag0WK%pQ}l94FmlJR^IistV&sf7V4zZAgcJgj4Vo%cbooWR5sh(%f5jNf zM7<Cvxa%~&0T<T+7#c+D^dm;^G<d>>x`ku#VM!ln59fM7xKAdWRKtM;)emBRH%#MU zdsFoZ1D=pBMrvNI<Ujaw0pLqYV?L>KCm>es)X04VwHFe~&Bc4AF9ON50Dh^6+3jGB zdvY`D*+=F$7Gy)FC140p7R|`NdW9&cYXqk4ILSWuMc?f?C%+9&3$?@;ldD9R%T5?h zjBOz}#yeaXRu+9=Rf~$pk@>|J2P4c5v(C2$0lrZ_Oj>wUy(b7*Z`Q2%oP+IgIj~lW zxHPQr6yV0*w-$3Q#_A`FHfLg~qTs^{ED)U(;;j)=dzEhvIbLX86`SU(by_$4adG3N zUCO#ChS%QE{~$`oJ{>ZV=xo*>yf{LigheT&UYit-_V8{iMHu;P3Yg$*2_v1dqK;Zw z!N2Q8VA>hC-@TW?Cs$0#@qx7%r0^L;X=qc>q}L_C_)ff}-lH-d&!H<MSabGHA?z64 zGR2z$fs@qV7Bv&ak7W~$hJ}`y6N!vQfA$w;XnmdQQ-<J{V5aR4e)iT2uE=A=D-6LM zPi$<AKLAE`h<B<jWNT1{)$`J0H_Q@e?0$Pw2I}!d9ATW<_C#QE#6Kv_&D3wN8B9_e zFb6%2+QRlCDnJAJw7xJ6+VS|knSy&ZPPxwj-!;wgst(0u8?z*~0o4)3;Eu)W<R?ts z51*Am^|fjx+A!Z8ZAJDKKvf;<I93)07POsu-dd9!&eqnH4@%ms+v<}`DNu;iP{^8Q zD`bVcAdR(tL9^CDLUeMn!q#iute4i$Vb~i3$nX@03SY83^SQP(Q1om_+&*}z5QXCO zoS31Lp&sl6@iJh%2fo8%b-7B}+1~#Ly#(B&ls=R^D-yrB>>^M(YgUQu+Ex9$Ou9#6 zdee{hf#LQlG|X%3X^{w}0p_4=5JtnyqzQ9r4qp@^H>kjxmD74`jpfNpR-MuFtvfuT zzSj?aqI+$TL;G>QIfk@^{d!{1!gtW($Sz$Wo-rY!xP0)4ty`J^Yij4JaJ7p%sIn4Q zC*8x)s_@3}VXe;e&w8`rp(q_j;?m7WH9bkZQ(A><!`x#}97zH}|8ZT$Fk+cuYai)c z-hWSuYu*a~;oCOhQ<R$M#<7#=KzE+UQhTQugBP^_t+)Zy>hnPwS5X(<49v$sEr~;W zKwBr&1jcR7H@ZWdQeU{u9KV*oMm}B&2g9n7q8E=1^u83z|L9SE`}{|_{2N`EVB^*J zC+g_U;ObcBmoIk6-GXA7G$eMat@HHb_q1$kRDf?aL!{`5zbpUd>!jS24`xYQpvc<) zv&e2@J|!lDULB92t^ceGdTcwWK***}*NTBVrCf_H*pFtY^KAKQc~$5U#v%RIAMwON z7_mZLD!%Vdb?)H&(DO;kfaXI@xkg#;&`Dk;aN$h}AbRVE$c_jUD)YWGqd<?7iPcd$ zt2)T-SJi*amxC=4av(P|h|@U=e_7=~MT{10J^Nuy7R5%w&k=L|olnjn*nbQ-$c90e zfgARE9uQHX+FqrxO{|?J-_dbT7w$(mf@9|}Y5o~0iCTh2H;K;vfsE(HQ3>KJZ@)BQ z_b$LP7r%%{T>SFGt}jh~8mmtl$%Nq@Oo>`r^a#T1L#_Z9vR>NF7Ak-|TJum&CQ|q$ zfgZEw;?A%Hn3gVoby&8){$yPT-9{Xj1WqutU~uTvN}LiYgoDx*Gn+jskqVfEOtHmC z88}5T^8yTt?JvaT3VL%AhqBAkPA~9U*F`8*TmU3HXu7@b$6GhsRTdYKGS=y70$blM zKW$=FQ%rGoh*QV858l}If)u@&0AISW3?pkeYVH_cek>ZQ#%~?Fa1(4#`V&-fq^zyM zL=U}g1R0-F@jf?F_SpU+tc>_$X78PiUk*C6zE_=bHze6<jRTtRS_l%+`Iu>nwO}5) zQU*~AxY49!v~Bn)?$g|cGqgBJL~WjY2M#QyD?m)P`f;;`O~#d7I*76p8q5?C{A(Z4 z^4{p$n4Y(A7mH{}%Np^iI8OO>^k5e98?^7_gF`;Fs3pMRLota7BR#kp<Df*Z_zV1w zPpkq?0Kl!5jo3FmGJd9_HfV;tg)a-Iz=u*Yh?s`0S!uOi8`5PIL4zlpiDp{&ZYj+5 zUa3=lxJl_Xv6II?`)*5o@FE~_0&TGwo84&<p>!MT&<8?)9{13xkoCZe!g`(kl|_=~ zEm*kh$zlanM)KL*D3c6{b9oNMMO*j5ZU3zEcUcvWdD&f7F}XDgBsD2GX>oA^9O<0< zawsZraMDQGAx;GOdHNX>?S*SpB^ka*;_D4Tc#v`&fveTzMeCK56Sgt@h2*(iF7Be< zt*Yd@hKBQ%iRJ0HL(N2P?j_yT{hSK!YwCSG-TJHDV_{i-)%UF^ux#FI1SU-pb9{44 zjL}b>A@Wo;JvC~Gp)$@DUig%-C>hxToi<I>NVXoQ*41Q>2ukvNg5{xMg6GN4V4RCN zncEY#UeJ3YL4dqbyLa5@`Q?8J&|)|^h%|opZ1l2JXx@4gJ<Q|?E`U@|$`@VM4gRdK z9K@cxm7?mG*YV);x-w(VM)hSExkW3`YijN-&^~uKYSSN!{3e-3EDnpHa2(E31;gQP z4rlmIO4sjx-p<2>j^+swxn^fh%d@p?Efs(dQo^kJsbu7r*hhM=DCV*>ZSVqity~3p zEWOCA)tjPqUA&Tl^jZV?h8id)U2yFDjx8q@-mKPdVo7w&tfn7|K0>5Quj;88dvsvW zC@s<WskHTEb5kIa5(PgSf+O(;Os_ny_|YGh<#B#ED9>J>Nw{CFS7e1fWEo#bvHpCB znpDK<ap=rO$zob24QGIPM3>VgtX-ih%=FV3`ehEx^_L%7fPMgRXQ0n*K<RRqnYNGZ zlV|ZZscN}_mg}eV-UHM8yXO>KBd0lHh02aEe9i(Kbb`P-&64MUkciFYp?6zlo}lxN z*w|Q+EPB&rbn!%+kupa1lF^T&r2!TH_TYJDg~ymjjy)ocqA;SZOT-SelUkF^;+haR z=zFSM5lM6c7BSK5Gjz|Rd6-QQ{+4qb<*s~2T9cWMsm;A_N;37jXIDrUuEwIgN7wu! zjH2GgLj86gHvtFy9mdGiXqS$o5@jKgk)P{c5^~2@jnHW7YFo=#&(!j?f9+9_f0;|) zH;S8|PV##4Z*unEAJMY!b_>9=lxw~p30xaI&Q8<=?kvKdBGdjfl~l^oVN5EK=|>Og zM}C~$4Qn9bk(Rz%2yjF=z&GVOGPR0oF2=<#MNLLpB}-I`PQ<2rt@j4(b|eu4Wh8rD z>T9z)WW*j$1GZI0UeSa&Tn=E}_MK(E>5??Br13#HegG$B>1rcb<4bztxzKh$INuke z81i_265eO<3&f8r*r=1moG>a*4BCp`2)Xa8P^<U`q1`?8DM26=m!VPP_krnwB9HTf zq<XX-u~LMm59o)a48m~HcyH2V!xojFhBDQAUP2Xzmee7rpf8$U_X?9dx|s+G%(|`h z_--QmD_9BXe`wkhL@wM0O0n4ir&D!cbOqjou_8#VlEk=*oapC4)#?<%p!%FYxs@Kh z0d~+gPLU2L!$z)(f3WN!+f!<2a67=+6ZqR1n@R&g>a7`YDiAni5}}Q9Cf+US?AQoT z31V5i<KM0c!9FfZ{jDAX$Qf-6#N%|n=%`2PkjTyH*WjIE=%u_iR@)uSLU{?i;91H0 zczE^h89W$EF7iE<5JFjUh<7tt^QR6jWvCI*Hnwb&Mm87O6~eyq{^f<3{!l6V!VG+x z?9){5j@~QcIIQ&iP_3}27o{d+?;K-7Ct}M6PIE}o1RdaYg%HRb-dTl-JbMf{K8l9p zK8Y*vO##!NLX0wm#>RXmEnb>Z2EUN3_G+e!4J4V>IxFURd>0(ycelZ%g}u2OJL=y$ z{e5NTEWg?FxrBs7LYDlKKhcMO@(sDz;jyIVxi`#8J|%}VKXGBW<q9FHIQJDktqD(> zf_kgMc=u#EoudqJ1=&-KC@vFD^8I=!(FF+N>fF9~p0ul5ZPFQuR*KKf@*0hA8=wml zG3wRzJ*1pcuOJ!0n<O=XR8}bmFWd1rZ*9tBQ|Y;J2b!DOX6@1~o<U|E474gu9oUa@ zv8-_%?G>zA?W?iLY#e*JDy1>%BCK67%K9tw=0go5eQb+|wJPhmMPq@QDfO`#4eKFk z`;~WahYMFA1cLhCFxlIeh-}xFb#k}?V}%;BK$%IJ3W(-5#Y*BZXQ4Kl>#17#+Ed}J zb-}0xtdW@)SL=4`m7A_N8q3^=bKie=JEfQ$B~y9g?Q`|m{6O9Ma6C(Ltt}+x)t202 zc#<Nc&+hAiWQCvKc;8CeHga|w2~Y@BW|5JNj5)+GX;)ahA>ES`RV=39Uoe06!e6ya zNFY!2<yY-NzjtK$dVqPE4J;x!)pIH<KNtMLkksmG?RSO=f3~jr*?cVu*XbbJlF<XY zHe6NJrKT}sl$MX3gXRC6WNV+l*LE*TJgG<EcGGr!v#8OTi@Hw$bD29PO*Pc3vTovK z-g8}i3hKw)G$`&3*{iPKIY0SJ6gx;m7H&@gM;avf=p#s;(?}CP`&lm6v_FOZik*Vr zVWg-yqmdoS!7~XTt&Kf)Q$Q`#4zlaFvTr|?eoI>^t&@>?k?!gNp~l~N|MA<=<pwtT z&s=<}&o%-ElPFUrndYC;jZXHj_#5@-7&%@Qk5%BS5bu8-t4_H%Y3+#Ln4kPs^i6^I zn=_fWZ$sbEqUXbrL!yGs9{5v3T3TK9W-rQ#NK8-fi2fh_R2ol;%ASkB5_%v~2Ht&| zYrJ6ckm`Y2GP%cR!h8dtM2%vOGWpd$0q&MlW_SM@F+p`v?#A-}b3KOMo6|y9c~bf$ z2#;bZ2^dlM<I!X`LiBxH;$ve82JN?+=iGONYxg_Iwio2THW|UN6j6m8mVz0oz~|S@ zs=7$;%t5U{h?oh6p)DO~xb%GU)xjPJd^1A<`~jw28+x`tRKC~}^20ve7cX8sKF5^; z1~Zn#hfh4tIDE)M^UKzCB$^o-Rw=j6#_L^x>~!IFFB*S!WIbhmn)Vy7oH1li@Ih3< z+wDo|C#SEq?E`K^9ZS1AxuU*_mqy4ue3hSYp~%liA>{J>dS_E<HnQW)Cjt(hva_Yr zKWr0@Ozs|gimf-g-1#gT*E?Ujtw)R1d~;ze?7$EGLb0N}?|azdTrRJQTxeLzU<8V> zdi~hqEfq=eewxpzUzj?FY*ZPip0SZ`lUGAuT15X%&nrVi!^a_H$xgpgeodm~{3;_) zR{rING)O1~b)*e>ZYbMIbov;gvUs!f-3MWi_(jKm<3vGHJwz4qON>CI01LxkILcz1 z$5<&_FRrAa0h@obr~28J418e3@s`o3l0e%#^7e9RvUc6%%G|UmsQc0WFLa*GaY7!a zU~>_2?#o=!sTS;j#U$&xhKVsHCGVc*)FUVfw$;VHn3d%Q#PNXBdOq@VXr9WJGO41s zjo`#y^+}RZR$$+VWAb7~KlJPRXkbLTRddG=*wN|}6YGnN-u-Hm#C4+%e~NzEItz3a zb)P7=^|gpATtx7`?{L)bAHl@%)epjD=8KT$sUE$MGBA!z6<Ji&Jl|!u94eTaRt&eT z(J)n~;Bm;G>ic@?Y@vK?TO9%28JAZ5T>r^St+_)>ihki)UTQTJ1J2O%dfb2vqan~K z@OnDOdPbQUOy~`(t5HF)m@2I3g9;f|3qCD@Zhy;j?=KvM$B$tO`+@x;yZZfu?%}vz zt+kKlMOvc%e2qELlhidi7re3U(RcL%n<w6~ut77t>f@}NV+1TRp;JKPHqh<8T}enK zGY#Xj(R_`yFN3XL%t|sT6Pb#tOBsas#FV=-t%d}%I95n|_M7{4HLG5M(v)nzo96l0 za%IYGKXwM$GipbyQF5j4b*^HS+z6yw@^#4zY0U<Ug3%K1;xT!*G?cWuCd6-KWV4@c z#@-Hr?Dp}OV-uyOS%Vvz%y_E)gx6P(Joj#d_&kd#^toL+jnrxt9!{3qm(gtX=Vr;O z{%AQfs8U%>HlLYvw(x1Ev`lzD7Y|Q;rRn!o=95>m?${M2uLkZ!)l~4-`N49|kN$|U zVbZHMyVRPo6xu3&8IIk$n;WWq^*q@yHNia?><f%?!%-!*iZhFGLz*a8G0&PI3HgHG zglcSV5q-rI-U!KE$DJ09)&wx5wUrLcb(aHsQc;^yP5*>i4!VR*7U9|W7W<n_`&2mF zGUK*Q`tg3+!|Lko-Te|zi1U*oZf{Xo$_nfbmkDOzdyx=ckEs;V%0}iPCFp5}qU<L| z^kDt`>C4Ij@qEoX!bfC@v`KVB8x{O-Xf})U%iWS1&0Uh|dReE|DZ_rTBj;Aiqvu|t zh@R{611iG#mp)d9V60BF|Gbq<C-Zksag;p{F|QSIZz4A%Gk%Nh2MCYvr!<wP@lc2u zO^V>#LI!lnpc>k;EfDB{+Gc8;aQqTHY2tVtt3|?xbw%o#_;(NUcd2`AcE)d!ACf2Q z%l-Q)-@}GO$>bp9^;>&SL<sde3N>WBowU}soGeRQw4*Ai?iE?fN~j#j*gMPj!w@)` z=bcLC*(}CM+nz|@9^iA%O}nlR#Ihzh;j>&DSWVil?iYy53dCB>T4~{&h_oDaAIU8X z8p26{3Xv4L;*{}f&tSc`7W04OJz|pX*~>Y|dzp*bt>Va{+F^aBPfk#%0rMQm?U}8d z67LtuH{vS#B1y(RnkWLT(FtliU#Nzl^+$!ZpdoE~qgg-v_oo{zd9NySkg2*LQXvFL zldzN2q}VFAWzuKU-tU<6tePJ@dO2V`s8KeTk>kzgEcgk?T!RA!k(L^U3tp4OUNMu= zf>b)X*Ib&VXV~x>NbN)_)#uw)gA{LPZQ7q?bM2*xdh42ErwXp>uwt)LdBa+F@<EVB zMvFAsdRVUIXnsz^<%w!dY0j6)H!s&=RD^@Qe0&4Onu03T3W-BW&ow{k!wF;opRcz& zFX}D{M~lu6Z)K~h%yJ|5=NltyDKv|{0?>&v;SerfSZU`oRM@CDiN7J7RdzjC$*9IF zxezkxPD|BwKgQIoq4|iYTX*vFz5kRnRqJTMl=(LrQldw?YNmKf;}u$_bG@ii^ZJqf znA$(#>^(>F7#|kVsAj(7@YtE=pDZdo9y6`ad2{B61cb45`I<w0*dd)n;0prnG3n5b zfu|qOLE1%b4Q{w(jc%qVa2d<bC`;P#d*SWy5dLU6{`K&TcU+NvNnumsZNcP2?<$+q z&D*HTsWSJX#@rGz504)%Utd+cZyXhSk@DF7eMb+g9BQh=a`%gLk%r?MdHysB5UZZq z)`mcUubR*m|L9xcnBimBAvMr!$lI0o!Sg!bgFi+GOzMLz6S(N-P|nADCg*NJa|M)( zJjE&Za#ShDlrlS_KL<QLs0l{YbBP%FpvQSTlqp50p^5g;^2dw)ausXT{g%UFrxk=S zqAh2_?b95)lqNH6QxB|~zTh!=rgT{kZS6~U4=XA&3h?h+s|mwbzrh8gQwzJ~=r2Ld z@_~t1rBnfFLFf)-WZ!;Y;1Rsc)jW*KSq8)LNdLNrc!==d_XV&uv1JAM?hEA4jzI3= z(4BUdpu!znJ%5Chfi~e8&B;porYC`O1Q-OHVbB}>2Bc9osE}^UsY+|$&^a=PLd#EL z3?~iMy}GG1Ro-AIiYDhKFNxN00e1WXF<*o!y|DLQrU2H3@^*Jtc=!$8Nr2zl-DP`) z+6IGdhMiU`i#T>vn0ueeM*pk&7>gj12e))Gg|)QlGi*3eWxuK~UYoLVoCBKWavp!& zy6r|yfx=9O7?prmGgZLir(S`wKyWX^GF>Wt`oRCwEyG@7+7q9j{ONf8hGc9jl=M(6 z9A0>H%TpCAwE;U(YyOjsL{_WY=cgnluVS_}?ukZeyAHANZL6b@R2jf{S%U5e!EnS> z@iMQ+^XkY+Hp%qkd?S+XiT?b%Du7)jjwLfMVqudkpxVKysMV>EX^-_Y9vpVW)mz2_ zxkF`enf;VlC+@~VuVja)DkHPSFQjmDq$Ju{j2qyE-ctdH>*&!iMK*cVAFwYbK=V#( z$Sk&VCQ=$G!3VE^ptC+{Sv0t$^2xt{q2@hZy<xkB>_B0WUL+V~k)LqX$A-KJy;k1L z&jgG=jX`*^>-n!oW%OKKKa0FmyIkBGYCp3|K*lo3h3ukaB8ao5=CANOUBK!yoiQWQ zmr!)MOi}iW@W!((`E(Mg&@T!N)|1m&A)}Bj-};lOqEPdou1*1`aeOD5Wkg|KGp3-5 z4gKrAR(C)p^Tb;(Vrfm49#N9YMv&)t-)cNXzo{B9I<<+i2B`>g=LF4UNNvB~bl(h4 zqy`C{C(veSkOl5BK9`^mL_0a#8kQQJ;$@bH1{^GZiK6kzdUqxO?UCXeUU>g*vccVy z`E%!i$wV&dPj1t`41`PUB*Pi3Ww($OSFsfpW61Gmp!R)ZHrjQwc9V}uUhg2=u#~8s zAu_fw{ybChsJRfWCbAc0a%L*fLdP@bhB_7@P1rH+=Ej}h^I+eUnRecua8n@mG)KQs z8G|%Tk7LaFNpOo#J$5aed&%PNE$$`F@P77>#iP|OpkRWXjnjeO$M=xmBt7&$$9L`S z_=Y9yGaDU7Wkjy`FBCPVD9`oieV0VKz9H%T&*>%1leuFC86K1*LAl8{l<715b6y-{ z8pY{GN{)tHemDWC10i7;$z+dhMuNM(xtCZ?oS7nJ8h`w<yqfOyVrf1#0s&=nl~}?5 z-<OBM->wPNtd$f8F%S4v`SX}m`zfY8i3Y=~ggeEQ`#`9Y7X7jd0X^rFfso%Q(Wl4% zdrJU1j{#2-jDUzp)+H_`Awll5@}cIISs$djq*$rIcCOI^VM=5)iAM^}pDApyeU(^u z9HRXG_aoX&6Qx>k9vmK?13X@bfN_x@Cau>$-`Eu+t{nu;XzT&Ynn?@$7z=_Di%}-q z=>#&*<`&PUx=n{)gkHXEc#D@=SzoMVzh{KONkc`6TpCQDtT5FnYG1ur(!iTBb%yXH zx90~6ueO3#oa+cGp4_~+iX$1q#A1S{&1I=$sSkz-q<b<{2U#n^pmH9Ds2$O6uTs`` zG|wApP-P%G>Nt1A?KxngmH%s=x4WkDQWA^A!v!NQ1GK!x=(36>nzwJ^J#Xc&FZc%5 z29>q2T7$5&L~qV!HcZ<(a-OV)1sj>94ud_yFCYfyV(;eqRL^aT^VG^c@wj@q`Y+_p z47g__pQU2ANtuXelUeK;SMxG(@Zdq$@Vum~n#rW6xs3$E<p<`vJ*1EKUFy0BL&Cl% z<`}Dh?7M~b<3|r4KD|bb;iWt=LLrHI>r$Y*=#XmdvKpcD*uJF<s#@j6;gw(u+@g<d zW=#81a_K&1OjJZiX_-}Fc^LlOneB9|_nd+XWONRYR3JKfWRRm1^2NQ-5KzIxJISu` zQDhqH&T*hbd%&DmRN{ejFt~37J3dC@a?3{NO>T+I=ydbkQs>%M6%9@kTK9}@&pB!& z*xnQvTJ552l4w6T8ec?k4m{3~l#yB%W*F$_yi7q@N4XF&=)gLv<@H3cMsZBd8M}M| zwo!x&%f$NOwz8ZXeoY6s-QxA^BQ3`0j*+Z%-C<7@#}$dgc}2Rzl^<YAn(9^hHtY(G zI6qylxn1r*tmQX(ftVql&1wd>h)WVbfB|2G!8_w<u2;o=<gb%aeR}FG#|rf&&zAX& zIxs9|>udBX4e9RMBj0nvzJu|#bzor~yg^OCtQH&vfu9J&{<bO-ulewGA^GvvgsQdB zw2U%Pa5qG-;U@gb@`6%;f|12H=Me)I%T|VUV}C!uXMSSyEddX`Z>}yT&cQC(l|3%m z|ELvslRlxSF4SnrZF&sLnI`<*1G3_CV3tlD(kG&w%vH`GrxPL4q@YKMz_U5=x&X1% zc#re4Sloc>bw7{jc*b{_?$*hGBg=5yo0WuV-fac%HP<vK|D~PwPTfx-d%lc<)))@U z<PanRSnDT9Stek6tz4sJ!dB`*yxqM?$0pX5^Fb|(Su#H1<}kOoG75`2iVJAN`sxUB zGf}`|2GpXAJtkODa7`hT<0Aj=62f@hyo{?2(m&wB$<Je#g+Qu<X8n^R3}FzTUEZ0r z+LxMjys49zo$n)ICS}n_t?*Qv8wVcvOGMCAwXKr?AD1L#jJ0$h6Gqj)_`CWD_xrZl z<7a!PZ_RtzhNR}pJBU2@P|K^cNM>d;Nv<25_#2K_teOyzHdjyY88Y2{L1O+mYoiVL zKfkyaOb%E*>`gp|`pZNY-#Q~M30xNG!8KEe#*p|kk&}BZ(EqRB_4^Cq_zg}BWax}W zUw&1~09EX3IIjGgp8L8fKLK~h0}qrx4|6mV2q_B}FlWPqQFH!op2(s5`1>PnOxJK* zPgirY4i|5f;5yu|5a;BLn=La{P9l2|<h;j$43Y|{<^y^<8_{@c6rVmFY%|k?{^cHe zh{fk(9v(sliwag-{mDa@o9xhk6}d6oJqdyiUmKj)iNrnFRMbWkn{d>d6SFojk-T2s zsfjni>vVp?@4rY=Ij}%iU80%;^`=)R%Y)KmD5gsL8WUz?vw9a>`@eh-M4w8o07PNE z)eSZ&!e56=Mc1w9o`$&jJlRdP&sx>ic4|?)pErL|1cm?-22Ikfd!GzsMY>G$9#5|% z{b-!#^W<QQaY;SOWvxoYu)2_dxfS9@S`V6#jb`-~>T>_Cb+?-o9X9kYvZr=t+@HfD zPBo0csqlktjoTbcnuD)CqvxpyHx|4ELEn>A2@{&%U)ze*y{cTmO>`m^a5L?U?J!@D zfM|%XVc(?9etxa6nfORebtWg;mCVjAeA#nY?%d5=MeTR&h)zTC`^<2m!h^;4jL9)= zMPL~7O1Y$TAUj0W3{V^rV<=a6kMBEe)5K+k+<tqGL~&rq;@1?${I9P+%JmQRG`(^Z zfNrU8fMmwN^fj<EDhuq|FfWA`7Z%Jw?2lTuTy!xk?%nTi$M`WKaBEZqwOl#g+(#&x z+f?b<vu8telTL~L7{7o0cl!7D8eg}!wGFHfe;%IB|Ai+km00=DPAjhTcXXA6`&D^0 z)*s$!1P08Rl|@|UraxTd1vsw+q@e;QgXL+Na9>i+=L)G`O!*1hrmQEhd5Ffp#~F$B zS#!rdlqG8~Uqm`%anz``N?AxgndbGZ-d33k7sen*R1%5WH}+iDfSs6xXDA3?1cQ`s zjV;~*ag+FDt~L&%lD;GHWY|K|8>=D(q0VL~*;x|TQL3>LZ*FRX^{%{(K?<hM+0bI+ zt#h_qm9X29nqURAoMGtOYvsvC&*Y!jIk;c=gSZ&?d!L}9sytatK~D_%{nsVp!%ery zWFdNc$B%CLGo=tptbZ$dx%sU2)`v3IgGFOTbT?Zv2wQb9fkq8<e7oX=1+Oo<4c&HU zu!R{&^3!D@xPP#J1nN>>YA7YeNIDuJiyRUf;Q;sfd{Fw@Vx)*XOykEuA|_l-AJ-I# zV)~-N9k>}r@g{ls?@E6N`F=VI9=5a9BVcDXG~ontVNx>~Ls?>h)|~;2%mu6trCxOc z6VE6Rlhak)9xL|e>s3QkN)vht3VCL__YJ>JZt$tLRTqS=%E?C$`2ncU^5k%{R`UZH zl1{+*T>i?;_~M_3R*DLaUCIE!k^^?RvMXP5>p}y+7B^MX%8A+hhKl(h!_%NJPX*y_ zMT*H4bo6<Cwk0N?QMMvAQSQK)z7Zo2%1G<sA;F2{MjLDI*B6IUTPG~5pQib?dw8ep zdj$%qVQ}vVLX(!YA4StX9FHxd@;H050kno6RZziBl`XgNM6SA29hj$kuRVlMPYBx> zUq;+|GP5@^Fj~dMO{R}2g;fj6tW}vmJ7Y7~=xI^AgCq+5$fEH9jPA&t8LlY%D1(Yb z&&a51p>SJt-VzY{T;yW_hS5T^E_f80aRSQnSj0g**7L(|+57kJyLl-koFzGCNCf1G z`M{TZ-+F=2yVw|aF)q{kVJvXHVF70Yf>dGmIOy)|b{r;~^=_xeFBbqA3!vyzvH;TG zH-lVO7`;W_X%8hDgC!*-5DyeaH2(_Q%rP6xM9k-$t#K^ue@Trt)gN~Bw`tuHde25S zOXaGm3EhcTf&h!4WNng`dr#->+|!TDujz0SpWCI!RNIPrUT(iF2hlVXj0E}VMjW_k z@ZgJzQbPSzH@{@sF?f!?YChJ7c(I!Pp!}CN`mi}Kmz9aMSRrr_GRbn+RxrWIv~#kL zAN-5M{{G;i0{2DuuEh&35%_*Eq6o|`1zME}ETt(u_QW--2hM9=fNjh#V9Lr(5jL15 zYYv*(N8RjA17NC4C<2pYLKk$jYC&#<kQ2=xNWx9C2mB$2L8o|ld!U#S!;%)5gOFAp zd#^(|xQc(DD-|io>q70(iy2|}lYs#AXsx#d?X4d&{`t;=nc;N-{rx!^Qp;lGQ2dmx zBb<11a7Dy|QLrw&q2H*CoChtk*?J@wvufL6Crbu{AR_VAb}96F`Al6s@=4yr+?(i& z_~krB!MMW(kDbqMxgEx$dX<xrm^~1aDU3FJ-&w1&20ks--H||yeX#_dMVd4cRcB`^ z9->NdDr<tmUKgm~QO2s_iH1$QJw~Cys&Olw-e?&JQA}oEQ%NA`;h9RfF$u$nQ8}xe zO4^`!YL9bfb9}bwm*;tj<<!eF_5$pKQ!`vub9i1jX%_$TR?B(z0K}wGfweTr%{>&o z9+BHC$BVN?*SIh;i2hw{8}lp=0hyL>yBq8?kZK0<HEajLek}_>DPVI$b(<LtU^IKO z+Mc$;%9ZFNyB;OY#a5ZJ`DA(gFdf>Qx3{guU}nHcb9!%b6|hr?RQGhx(yH2V0{Y3L z(xT034S>=3ud~pgUut(7M-*BI^t?Si={Kc7+=Qwz>ex=%*@vX4;?OuYooC!83ZKDi z+A&4)N0M+S?JX)?o>1`E$6|sER9UdTj?Ajpm?G`<ldaxe@K>q=TfM2<uki0K&nLdV zv}`$kUZ|}BuR@L_NNzJ#`SC6+)tSv}w6y%jX=5Z2cpYZ-it+AD*TldgUkrclA84~6 zzKbS!Y`=i`DF6COG7_U7tjwukztFkOgoHNjcVI+P!L}M_3n?h`&4*1!3Uvgf-?PJL zbP#Ue&bn&#T8AX32sST-QH8jlY~|RmY$6fQ6Pxz9gr~W#XavZoP=dMdpO5v$yeVH; z{0EsrFi`gjEQuw~F?@=Uq8~~SL|_y~2fx3hj0yneiFgAY+|3u#3&eD}|GeZ9ap4%a z!TrFUro+$hpWpO{ADYqpF3u4Q8_khFv!CKu^cj=tpsk`?Dy{UT%HQE;Ofuf*V0q?? zL2IBB2m*akVewN)><M&>*z<fjUI2f8r8oH)`4}8E)lE!fvzCA$Kh)pHq0=8VJ3IS1 zsBOZdAEYmzgK>B{7lTC<I`rt@kONczUU<0!5acrYb&+2B-*<)`Vm(;o`;`2&Ca)pd z&tO#w(L|3MtBUjKT1~(8QK~L^C}`@kR;dV{Cpp+8^F)RR9FRv^j%R$r7Ob2n6(C@A zk7qb$pZa9tU8oUfu{~?3_x4Lckp2x}<+9Iqg^q2<@>39ZT;0#ptupmyZLxi^1-VUQ zr%ZTCJQALaE#F9MloJk|K@DWRvVQAM#TOh?Wt0`FWKgT_il<m6RHOEoWHwpI=#DZn zolMiYidt^K1L&udHqwNqq6B-l3dmz4L&RfhjN<=zHy;|#0&Kn?kb($mh8BSdN#qYp zu@C#d206`XFz9*g(=Y#6oOC{2`hjmzKb_Rsg?xh(031NGpc<aRIs_^_0ckD^_V92c zS|l9$kQsYe>g>q-Uv?2mybZlW*yLxyG&FMt$El<c_Xu+Smacb}{Y>?5cPZb8hQ4+9 zNjC$BKneN-y!;#6Eo$|llP_P*-QNYl!C(0!GTn{~%eGQT!|G!CVvo0{lyM7pOQZ@k zXB5v2x>ycZJQV`a9*kx--ReFA#wnE}E9asPOT`x%Z0UXVmL$aCtLf=qy|)ab*EcsO zeT3!aJugLi3Mr3~J|bCw*jh^Cd3}3ilFRkaumRv@vdc+`7=%S{{z0G*<vmUS55|G) zpKlzJkNWEs4=GaB+25xb@89qNSaIIFV+?oEX%5-{yx>vcLD0Z%0Xx!yxiL=lQ6|V- z7B6sJcUo7}HevY#E~6Ok2o5hMg}`IQIyo{(vYobeN*}YwukUaIt_Q~1L9u7Qf1~yg zDr8=%#IXGc`3Q^yW17)k$X|SabMViX^C!8(6AY_{27EE*8XY{FDHr+NmNv=zki~d* z{)kB%6p~A^AYW20g1C&xfW57Lhn-f!_SmV*E!(bMUJuuj1`^m2_f#(XBoldSzE0A} zx#L{cO0zIQ;5%y<-)TMtr{NT)DZAbn#{-`*&xth4Gamv=!Zmel{;C=ilBtrEOC`5D zOne7}ZtIh(Q)*L^F_yzoQ+^9C0~Q7h$M7c%;^SL>OhUr6U^xuZOc*7uRq>2IID$fO z)XxJg)8b^S(5ga6=~<Wk_S>BlOGo&atslH5z5Xu+*P$bM(d91twj<T{M#sNw6PA7R zs{z@9_GDX<d_hJXhA6o|N?6r-TQRZ$7O}t1nCLlkBSjM%53p$1X=D=`Ke$=T!mju( zva0rIbrb|oKS->Ilzt4Yba)CTwTK92k2mMUvSdZA14Q2L<WGKtW_8(-FN%}yPL!c+ zkC)7pI$QY1Fl`ac#ZriP1OxQ1|Hk^{bh6o|t~DsqiT2atq}u2HuG}ztyX|-Sjc&)x zmgD;NJ3~3&x(cV;-^aX?3~n)}rgQsK*L=SJ=B#Mm$EdgJ0FsF2;(=Ace{{irH3j^A zo&<Is%K!NVqr%Vs?Xh`T(LN{vjrGSMM~+#q(IY!Bs`~H$Tz~f+G!fPYWvOzSZY~~C z$efaw0>H)WBSW1k_68I?e}(-Qf8l@-?svCMJo;yAJj(!I?aRq6tyAOutNg;*q9TeB zK)c9$5(C9MmWdjB7M6{%`M1UcFQYONymB$8GGq)=*I~TsM}5}AqhByd&|u<I<OrT@ z#q;CZt#MPuiy~FMq}Bux*rIGKlIcdpVL;y!vEd=Bx$o)ZGL%cz{mZ0laP?_Mc#B)1 zqHwo9%%M}EW+IT{LSL;E1kNWN=S@&qvjKWpyf{9+B62kz_r_|G&XmN$);glq?MTs= z<Fb^}8SA(!3RpcRxPg+t2F6RXz|QD<kYIYB&v5traCIH{-aq%BZU<C?N4k<+22ghp zjLQs|V3tlDbUjF?leGH{2rYLT6WKab%T>_$C=LxiDC)8Rr~(@d`01W*8!O{H0h0|B znl%m|8EhEnwlV>&i%E4t&*Xs4lZkrOOP~1fc1E{ed*KA@T-Uzc72lqETf71ylGp(g zs`D~~VeecVyQ@bB?p9jqdLBQxIOt}7{7Nxt`q}j*cCnN9%{e0`*~(<efQTuvkBgxD ziPdD8DK_xI4Rt%&GVi6j0R5p<fMq-%HxLSGr||9K%kQ?hqt-0y^bRGvi0-%P*B+0K zDEvS`J{p^_GMLVkMkjr;r_#Nf`gS%Ka9>T&&ob2^EdYuiO*^VS)~K~#)XKA-g4&EN zU7w!P3GGSmpH7~iEh>M}Z}y!;@wV&jPrt30?Zw>(^SLJLajcig$k<*Ir+)1u8r2|w z_7NZ6`B0AcI>t1kQc5;h*PdWS=SIfQEOtiArv6jiaCi~zl1amTr!G4QsL^DRUxzTG zx=2E78|ydR=N~w&4H#%vjUIdUCKq)62JC0-v{9_?ykE6eNn74tdEaR4>jg?gT;qwo z`+*@r(1@rsO3&5a_3_(tU{LV0Y)v>eHg@SWKWlsSw5{#=KM#>8?r)j+^1eDUC&;r+ zzqt0cLrx4=kc^$*V)?HZz#mXej;a8r?+UKn_{lR`@DSRn#>dsWqG?emgx%DdTJY3; z|M1KoINwQi>%j|4hJ=KamPjxNHaR@`-|58B`2z^Z+SD0K*}FMa$|vHcpj35f+s_vR zTDZoO*g=a7W=MACF!d#nvi&HC0&U7s3!S~I#BMg8Qb1R`e_z4d#?iXUXF4`<e;j6G z)FnJAM1mdQ_YS)+f7@hsp@bYC`Nv1>7B*R-xD0E;6QhQPKvpaDzD6j?g|-4kw?^O- za&(^HIwmFPmS57;mTi2Z{lE%mb#Fxsm6b*sFcJqhrquA~CKHOucW?-65rR8vp0CgM zTCvxGo@p2Fc3hjj({QT$O%!;IU0k2i*Mi7hMd^Acam0hY49OstI?&S3qtXjhzXtwc zX^j^f@-tO2!s#9k!L);8O0`HK6#!huGAip*ppbaM!d#QQu8&_^l6#Yawm>$>4bsd7 zOj%88-ue|)I7kUp@$h)cD(HC;EA0??5Bt)jFGUf^KtmUjK_BvT1YhSGUZzCnR4b<k zp&F~R6=+uE22pOb>RbQ<L~!n!^7C}mZa!Q-j6lQvGr}xeDc2FhEIxxmwq;QPLJ1qR z{?W^?*?n1?L&^%%@g~qkJFo`dvjf~P7*r0gz~7-zVX4=uv!F19bLO~x7fg>^wyJrP zk}-*w*8v*6K)<ma$y|iRtf#r}R8mSH`Z)qrIfAhMI-gn$Yj>=uNK?$C<pU-OSFBA< zPRLK9%wnW~$A7D8OW?h^+CbJ%@nTob&7lH__Tbdr>Cy>?((AD_$8>aCSOz8;H7lyd zJ((7i6F(!{nd;us=V96@1rVya60wqI?L1u+Ua*?3*1%5`A|OI)zHkj?Jdh{yfo^LJ zEAsJx4MLy+v0ZEr3F9QXj^lQ|%tKucclKoD^`n|8N$g7%Fn>=o*;m+jyUMH`TWZo@ z2zxqFmE8AbckP9*Eack-OBc~=P0?$?N=wT<ADUl@(y6P{ob5-`N?UVeKDZL-=WCyC z)V?@KCmr;lm%owkXkja-#oz4-{CzK_O!Qe@P$+lDy&YV7s%i!h_(<;dj7`6gXD@S- z*Mm?!#fehmob9KUYey3!rlpN5@szb_?UpJhEE8t3Lz)84y!67k5ToA|`}ahl*ge#} zh6<bjgnO(A2_0>1IH+$x21NJ0vgn7uj~)co|NVDR)4%b(Lp44ueGWT<Q9Y#x`PPMF z$=h>HdW^FBFlDRXAO2Yp<Xtc0zDUUNs7tz#^E0o->!K8Qex?82X~7uqyqR{kJY5>c z@Fj6iYt^U0mDR0oJ35d|XE032SslrHsz?HpAdhn-^R&q_@s7*rw;mA+oG>9{Bq8iN zOqdR&m=q$cstKeFfR%RZXvU{aog}TcHLf|5RhnfLr+!=Ai^rr;(`*y(O|o`<K3YOv zp{gBMl5P$Y=u{9U4mC;NeqNUHW^b9-!mDKZHPzyi^=*eEMG}uK&$tQehGRv3m?6oj z4o3F~OKX%QZ`PY`!NYG!ph*zItaFzMxbA~OS>8b@;KaeIQ>%6ihcuY_wo+}v{&JJ| z2I98|Hr@=5xBcfpLuKFtJzFLR**y9T2oROAx8IKy_4b0tUHJOVVm++g%8#YJvoqB2 zgYfCDayCF=#fe(hj5D<lUz!eO-!HeDm#BNv+bAk!z%6$NNejbL3+$}U4~gu$<vf-; z4J?LpE1)I)Bui#d&|Y8m#_#XAd1#aEi*$t*@YAi8>krS{$R->Goj0}!@k!j`+4XWu zCkqFU!P}ZXY805KL))FM@pC&`+u<eWx;fdoen+3oVL%R~T<qH2{)*u|6(hHU9|m!^ zajePfz_YsY!fYD2r4Y`OUsDR#4)&!A4wgTIJmIsQO`-HW;_N;J9w}L%Q`fbTrIM>a z;<j0!5vLH`LP#+57h0i`!53cE6$c!WqE=l*Kb&Vk<EyFQoEiQ~Z#`QckgMd%$rW>g z%OfHZv9met1M(hMO?Zwch(>5G3v5dD1u#ix#kK{jdGk5186(mc>}`!U{EoSe<SvI~ zKS^odClxW|NL7=%Fi?(ofll04O`)begZ%1tFSo*pYyI6%KC+V6da@A8T)Lf%tSR0^ zW^=t3)V9$=<>lm>#?_>tl8u5dv88;@v@EJbeb8A$d$kN{!LHX`*Vm5QDe(`pqP1FG zrw4<PtSnEwQrJ>NmAw@`gh(YXgk{n)OPtyfI?o(^ZphOwD5iGr;qvC|TrzLCdcU2l zbQT1?a7PO`b$^te?0H+8k#|Fy#_1_35}{r<^f5Fz=dHi>UfReCe)zQWxJR#Fv3k7! zN%E%jTQBy9n3!Ya4}j)5YazZY)aGvx>pD6eoh>m6>MQ@HNX6=!9(3_#4i|aIG~FA} zud~~8T-K&|!Te9;6Ar`U=Whp<q+5FPmIK`5!R8c_c}tbG*%aK5=jkf_F+KACxvTYo z#wJj(%VEXt+#&u65O|B>b51otbHcbE{%sWdihW15nkWs38ZidqBiyA-Ylhu?i(A3c zM472MfU~bYyf+JD{W}N}jr;xZ003GXQASaZGdr2I!XCx{ycT#6eB|Nb$UxBCx8aR| zpYjSRJeK8(T*Vu;$BLqrMkF5mgvKm<mhQ>hJ(FQR`x+?xXctV=t3a*|O!3_28qHW~ z;nf!W(TjANOHoyGViJ^K)w-`z))1pKRpPV0G-4u%D3NSAo{72ewIP8QtoxK%U)X6! ze2i-%3G&?9*TB;HOcaStF_pP8&cf%p4Yg|Z$_1fC`FA5<mE9At*w(o14A~!FbceZV zRL(MjC_gDC7rT%JiH-b$a=0@c>9Uk0dBMHk^1Z-X$U2G*3kOJ+=%b;v2fFbZyOY(T z+TDnr;C?V}YpQmqQf&p<@#Yweb+|}pw_ulDg&1}NOi%Ixbm;2?h8*;y=FNw7Gl6wT zPb<}gX><S~Qew1Ld3EaEz`$$!d0`IydT}SOof;yiIOES}pe6p3Bz3hXQId?$#*WKA zCIC<(r<={6-(-zo5mg;hm2Zr7WH>`wlp2fSI4Kd&#n8A^*)@;Kp!bniMLaLQ=C>8( zQ=?#!i+y|j`G!h7n#c0h$CvIR%hd@_pM#UC{r@?sdPp>?TwvZg{kk;}JGc4_&q?U~ zNr6sXS_GxwSD(vsnBLlVA3th8;?Kcp4EJj!VbEAbT)ZI~G?Y!E1Alt4K#5;Bv%-0! zKVJ{|B8d)w@r8NLs#;~G662?vuZMCYO*K5rR4$`A{qu`Ly5j~aZCC#s&3DC#bCC5o z%h|Y6lWrLmYP4^s{g2#)m0aJq4^7}dbaL8s6Yvz$$g0^bl6Km#`+!oKVEeIBc-{BH ztM1^~ROpCCPFgIu<%>GvWLFXoy0EYb-Gh*a5=F}CPeF>R?I-FsUFyA~1YEUpb(M7W zt*K-=<wzw@-lbvnSW492`V-}Vl)}4J&njN?%;1(~a@g7WYWm2jk8|7(gS2LzZbR+Q z)1PNxkjl>udFPQyacu}b!|=@8s>}>!tXyT$>+xNV!94)Q=RQkf{BM36a_^6%4fih2 zM*-My%P0#U6TDIFFVFsa&uY7&f_X@#rpW#zo=2@plv33I3pWt5(9;KSX^t*ppr<G( zfaAm^4A05Q={7tL8kuY19PFJtb%{4A-EjZ7(wFXrF8tmhe<-*Pke-FyW{Sb2^vgjS z-)COq#-)5C!NT5gW`9bA3iE!?xJ1u#Tm&F+Fjx?%Mu>Fx@?MGs`Zkitqlb&;rnR$3 z-t~<6<K#Ea<F|!)ctb=VUAuCWRR)yQp15owAk_86mPBADU0Ss|>`Wa;Wr_8%?>P2~ z<iGto5%;vl3V|Px$Yt$hfis6Wt1^s=^Mw)!_m7sVQ26d~#-P&f5vh4#sxfF;q<H#F z<RxtP6`1`5_G1bVD#4FnHwQFZRI&$V{ZXua2)u(^wx_B-rwQ+#KFVj$EOwnXDF&|R ziEK?*4y?6y^Ysj9i}EE^3oY(4&s}IufI0#e_)=}^OW>$g3sw0u2=%c^xYSKaphIOW zDN+WX5A~{SbU@P$9$R)c7@Qls(*Az5r7TX+y1dX}9Y-fLy-WaX?)8&GC>btxkT`+K zRRGf#a-`FLfTr&~8x5dt+=$@s8H00D?XdjpsPj|M%Z?88qcbDPb^oqO()EMs!<dJr zg(>EE0o#YDqy3b!7x7r|cYqWue!WoUWE<$5H(CQC6=e)xNQ=vCi9?66fIVceRVlcI zGRpW_Gf$-QCo6sjnE)p3Vg>2id`G?Oo0_efd8Zw<$=!5UBl#D-x_)c*lkY6ojg7NE zE@1kEDG>BUvx~NmS!RE3Tnu7wppdBTN}irf*fIb4fj56jj=dhBmsN)^SP@|@t_Mql z!?GRWcl#aN(xSJ|WFu>NU-Elh`5O~p%_DN($+6V$h~GWpqA9od`TqUa0A-iPI`F4X z##bx9!4Xj$kHR78iMlqqzBqoR_F87%@YUQb(+j#l=GR}Pz%)V(7!0!Sma(b|H=%-E zbZm0pDJ~YkAKPr$#7Zs+8WNZeR6!AJ!@s2U4wL%O{%$&Bk=KPSa9WLXxB&wv?k*=| z%D;pU4zdTP;JzFiEyC}~QK<@@ij6Adqf2)5EE$h=d|u}!`y(;>9LYj}G~hqyErumi zd0dXilye*Q2Kj%i5rV2siuwekK8uybc$Iu7<6=N@q~a>q=mV;p+jwcwM4<5dnMmtu zlLqr{>k%u{O0fBe-aT+C+XuA@4LBx8u<k+UL7S@ne{{WNSQY)-HEf_D-CZJ`(p}P$ zo9>YA?v|47+;n$$3W#)fOLxbnd4|jXb=P~mpZKy57+~g{^;_o(xAG1drWx+NLngvV zPaZSEC80HupV!zw7A*$+lI>d3iZ<#^yP25t+lJZN&1O2WeyO7;*dlNO`tdE&8h|G} z>}3StCz$m|N2QRUWxEu2M9+2U;HB`IhILyw!0vuPKz=%0sEfs<*Axc=^Im){iiWb3 zk~yNhhI`UorO6mGc=KoxrYHe=ezcW+@A1UXf+!!Z7f%X<Tx_{$+biicZwMX%j8<#E zgLoxy(m3#)XJP>6FqHD42P<O|NNC+<<VAa{JKN^Yj)bT1r;FRMs)l<-jDDSW!H)5) z-oMzFh!IfSl!*^a7Xhgiia?2vg7m6)M-;h?6xm)g6@$}Z?p(VkQ8ogeJTuD1>)nUj z)k5gZ8wl~;{YhSmkH`2j9ZlurEmAzC$D*b5-dV3gg>;mUO6h6Z)=ppaC+eCDS6EDA z6{BOZTV&JyDdRnW(5SjI@hRms9$EbVK*<+VLzQ>Mht;IyU`mh2E5{;*#E4qY1E&<8 z+on_B%}?@`{;Rr=9#SHTIQYJp&MY~L8Z0@6l8KXG>k+3^I<$b%5_mw+Vp#B&CUGKx zVfCUCBfAosG+7>5I@_j-=0L88dtvfyncL*56zic&;YXKOXKpwX6KL)^N1R`hM+Jxd ziK^~{DkARVluI4l-P0vliX6L1YMzP3V3*jFbmO;F_Hqlv;Cs&3XCd8}wRes^eH0Eh z&UXcw)Jy;;ry$~UAfNvXw`xzOZ#iUIXmw?#yE$%&+6Z8NwE|6}Ql1@Y4>^YF5E5IE z1%7x2EF=1VQIx)~UX&0^gW^prD3r>j*t~$NdJ5niB`;nX%=~k2KZv2+?B+x&ehWU+ za~(lNfT?2q_M#k<b76BhH(0>S6xG-MkDqK@lo+TLQ)bHbgGMSwxRMoihh<9tU#lU^ z*F?aUeE<FH1c`Q&oXk;wt*M7^?(W0&QTDX;zKA`wjEfe~c(u2N4ZipRSJ&<QT=i=y zSfdyCA9ud}4ubcrH%>E!BiL*|oFlAb=Z?@{*k?mJ&T6F8<%Jd<?wRr}>t!1QTN0)o zHEjdC%|L)%{PwzfN~tEoT-?=TGW`l*Ep-n4aNn_6M5cJEj(8ba?sFVeP;Jx~0kU7C zVM{{rQKM0l+9yNv{1HkXpo6V>D}j9fvsRw<Dxa0XIKa|^X3LjVrO9olN&C4_MCSWt zUQ&RYxFip5&d}zCXN@e_0}><BD0v)qb=8|4iVQ6&9G)&l?L>GyhbDlV(+{w%Gj}Db z1M#1F$Z~)q{`Eo!zvJ4=$$M{HOkv|=EL~q|`vA}dZRyey`_GvR;{*sdmXE-ncXTl@ zV#F$$E^$u7<#vRKAZNJ)XD)N<udA_K4!b7vt-ucO#l2tZ1;i0gbuUcWqg!U%%vW!r z&#%#$^AUO7yl#8CgD;7E??kH~!}4PlIDt;x>DvD8YD?7qI!x;C@_5f*TJz)dCqQCm za-UfAYkAUrx~N3|_ry)?0rSU+1@I6qpsbt$$jo>+C14<)p}@-|JZotmdUi9X-wk>K zSXOh%_}4uBJ&T<!wUT*1dBoAE(6_~!%EuUsD)naa`HOrDk(;3{zpz=px<W^(p|V`6 z4Bj4bogIe5J4kBDCz-@vveB_S#&6dtz&zyBs?>c=$KiIFlx|);(}qF2#;(c_8Gk(3 zVu;EZh@+Qg1RT#NE1qWES<9wI;-R3%W~Vj2Z)*x9<xon+s@f+5ZMGXmy<x+hcWYds z;dFv|gK<;Pb>=%(B2bG3Yzb$cM?p;5#ItqY;`jBqjCL?RJ-y?Lz`}$q^x1~RDErhG z!y6<OUUDTWK%-3{TM*IsT#+k*t~_gVoLv>y;SV>u>DjWkDHxxuYT1V#o&B3eu9|j> z8ed4wek-3DAfBc=ALHzP-g=U#WRbYx7DN&#;aH3oHDMM!<PD4`=ZI0Np(u@}@om|s z5NmCRP<`b*$I4}<79DuvbvPGCH9WgG{gc?x7?QQ^PEM9AkIq+sNO6mgrlxX1&0~*2 zn_a_0BrBD9Q6PJN`9TQ>9>fvlx~;h5%ij~CrIh$}*#(bav1;Bg)$6X&jYv_=4}{Eb z?sPaQ8dsqDq1f%@5$fChz^r^n<d>j}kPEyS)IW~Hz0O=}TE_dHeBisoex3X`TYa&S z5hv1_X!mIqqjEc?y}>G@P_UTUoBl`p-q!rLlIYhv4_a~*bPdgjpqshW?Nl-iwt=E@ zNA!DlapkKpvXTMiBju_4ZUAvxk?5qEJQE>c&m|TsmweIjc*1x*Sqx~;PoQrWI7xJg z>GXQ4^8O5vNPdEJmPG&Tk}XTS^v1J1-5*PB#~C`t_NPmP5QB|J0lq&E-;7xlInw!X z3CC{e`O7Q7U*h6xr^tD2#%1@7-;%fTyG$zIHd<gzK#APh8^a>Gbk(h#_5%C`af$wx zsYugy>-}n@e$lN^Es37<#Ox(bSh@3lzgozy@`C5wRqH(8E*ykj$?5N*7o4JUjDI`L zQ<3%16f!oF%Nl3n;<qgFKa@aG5r6rw$um-ay<I@?vL}5CECsJW3&$e=2P#C1>H?An zGqmk~x3_iTkr*R4H*Hu9q@<l(os%d}%jBu{i9lxqFgE?)`U1OC`4>U&0%EDcZ^^$Z z>3<Q2zzy<?7#fA3uWB2P-zLX8#{Z*!lW8b$##JT>B^|1d$_oF6`h%1Hp6hC@yFGtp z#fY2sqd)I#<p$eq<<=Ws*x4nv`-MO2L<#nmvwH9ffEKh7P?HVwwOiEE!B0@*|02@( zb#Amnx-&=o>%6ln>}a^1YQq&+Vb{R3{Rr=3D*wp7SgD7zxgF|=9|{akUJqh@PDtCd zMX$lPDcTKOrfYUXT|*<Y>{CEz0RrSLQ+mw<VK|efE3K|~dMW_Mn=UWyX4(6GMV`#A zntcjn@|vEluNJCQ-0!WpFWQ?(SG(M-wTB!w^~c<r0b=O@Ag9hO8NebHmq2Z`Nz4cT zo9escmJ<y(p4PYXSh+e6FdP<hF!A9H<#`YwD|0*$;Q+(-N;)n427q{ZK}3X^KU&Ir zhQ>OsX26##?#G)beZ%WrElp&0Ymeh1t=6X@?7xBLT86T-(=9w4AE1qj?n}996^V4l zQ!@qx5dO&ZLUN~_&6XS{hgm#sU?l5|M+sAS-N}I(Xlt&)^FN(J=z&!Ud<(*BrD`<* zo#H9udY*fH_yDx??v{=bue{LH#{NLPMhI)~_0b}V(`Vph5cRv`W}W6S%FplVe2_#W z(<>u_h`(H7h1eb}!UPL85!d+3dl2)${HbTb4d@v4_of9-{D8hFY@yD&3?{XQ_dTD> z=iu~=JJk99_VyoLiCW6>gdT;7?XqsqZIQc)I+*Ui5EMTf?hA|Pj-=%;#u;m80^%8U zr$ctv3Hw?=?JXH03IH+F^O}u1i&M02s$11+@X8^S<PE~iC_Z-?8%$Rkw{vES%9IT= zZ;lt~^Pfl8T7&)!E4!MDiP|E6_trCg3WYF|;8k~P^EXuB!G1J~>EFT?Zn{`uI!)(> zMaC6YDPbdLAfh?%s1+A|%%i2Xv_h02mrl*u?bh$6SaLhx);Fsbu9~PAicUaag6_{C z7l`#L)fc1J)Y=DJUmxz-7p^;GmkvEq0xo(Iv#86OQN?47I2~_@E$<8>NW_nsdOkM5 zDV2WRvND%$(hqU{#Z?9~V!o0tS~%R*+azjOPG>JENuAjT))e@>%=P@~joO0t`u?)8 zts|cN$eVy8YTn=ZvO6Z(RYB+3#Lm&#ifa*wRvS%<Si8G3;k9ap)_ghQc}A~oYrepV zh!%S^QRQD4kB(hi^XESzUN|trXQ2VAmn2thW|LHs(R|=sWi%og*J=*ti=no3lZ!4s zKB1Bc`f+fys-k(4BXcKU2>j|E9*ra4=vzX*PPGMB7fOF<Jbd19UbsG@NSPX{mOGeJ zzbe$MnK8rXX|{{s)Y35Bf#^(ZY2BApjZEsG5gErTLAyPb?>;t?nDvg=Tk~cA+Un4- z9TGj9o(0`*Te5z1+d3FcqNcXDw-2dU{UsgP8|57#yR18$U)#KQ<vo?9&)r-l=&9af zM9}syVLs!*^ySmsXuKTX^A}F5kFY`C)17r*2JjrW=-R}uo}O`D=hZTHxKv)_h{b&0 z&WKK&kTWUU<3;O(osQ1mcMP|TAeZy+*AC8QzKX2ZTnDENnjB(8v;>m;<=(w9wi`2p zEt7Q9Eud(gGurC?+&HL|b`u}+OZ6`~ptenfsj6d2>hzA*kB+Rd@=oK-&j(Txy=Y4g z<e;0B>S34-V~~M9eTT)J&&s_$OB(md0(QWbJlu=C@9*y6?yvS!hUlT2(<~g9bxPew z(BYu0A&|NB7wTWg3&Z>d=-efcPG%yb1y=>Qnt27#00m8Vmh2e|9yhJza2cHTzZv)$ z|M~bId9haqaaG5-2VAEX_dsUg>L$b0M(pi>|42Yqgz_?lHzX-yU8^eZmwH^YMKcTw z^^C9E`lWOx10S1SeAgPm%Rf5v+q9sG&?9<SfhoI1yOE-ALj-sJnVexrpVzFfu_C4U zh}3UHTZ&)7IB{_!xxRTA?Lv+Nh9hYi+VA_%kni<c6&P4sr45TV7IP_F3HBZe)(fta zH3(+zU_(uNi->o?39yELVaZrW+pv=lAR@Ok?crza5qQ64ZP%Nb;Vf2KBa)2*3<+>L zpB&3N_Lq;61O7X*0kE$0aflQk4)B05v*W(KVw>Ck_dmd!)%1<U*RKmW#wjeOUjRVg z(_~L0ApwoCmzkC@oXQFQS|VkvX`=}&P!&s683z&&cuuEcFhLyC6Ey*c?Vfi$N!wWZ zSS#I2Z*D@_#oLG>c7oSjQHipt9D*uZN}<&yhv=H=u0~9Bs;B(NTr-9PaiGm@wFoW> zz1rZeq_<2E62A&HnL-O;Vw8AVoC-qm)5SOA=UanQh+XA9<5_<^o*&zav|8MUKYG>! zObQwy=s%Pd6yTfz<$w-X&AZt1*|TkeQL9*7cJ<9ZrKHyC-^(o2x-yd;OXmVc)dTqM zM4E|{8{1L2FI`p*{VtziXA9N*+#tv0#|PEp`0+=;$mfypvGRR5T$(?365$ysDg)eU z(n`h3GZ3O@TAek_wVe!1Q%*Q$ZV>k7u^9AK!5eC3CYXl7gy#~rHBPBK$@pxy+39h9 zOwY6Afq|Qj0Qg{yVW=f`oeT+x<9_A`?8W*cImU=$B5;WO7IpltW1hzCNpaKzwMx10 zBQ%fj{L~|3c?|}Q@_x83AXtW_&KcR^bR>FQhpTWSn|aSQs#{^+;0K?rP%;zm@cfpy zb|+Ry)C@nZ>$5K=aKtdIaM3L!XDm-*ONg3|4+Z`lolF=-X1&l<C3pO9Ki-_acl1)k zoas_BlW%X7r@lDgRDV7$aj@7?M#PX0m-@-t!v9rmTBZjZ$yT<Qwu@7#e)563+ols% z$z%&}bRt-IHeZ4Vn`oy$_bv5CQM0HDeO_#cs(PlwJ8JnOSj&3p=m0c~=t)|o#jEVD zc={auMfM3>jEkvgzc^kodTP1yYTS}yzV>0F(QF~`Op;ZzmiS&t?NL_E+V@{>E*D%} z$+bGhMj{FG9%k(&#(c89ki%LJ`(E^dL2k&Tn!{Rb?X`|H>4-))I!2jmIEkN8o)*8S zbPLwA?yY~#8Uu)9&NZREh|{nsiGah~!<1UCK89SANOR}uDY@|yi{_K%8E`&7UZ<Bw z>MQF(N5oRxK56r&v*W(JpomcDT0dDf=ydwtR-R0mTI)rIQ7#vbSgw{I$<Wa}0$X$d zV>qaC!W}c=muwzvZk1^#tzkMVWHzK9LY&$n&KNLW$92KbcPRt7k4JQh?i%EZz}70y zaA4CT?g|bW$hnN?C8uMvXsBX|L;y{5-^sk)PFB)jg*@W~Ic&ksGbmOAZ=AR6ID4`{ zW-=!de&jQ0yDq=Vm&XTto;@#E;GU<Dd!54gLaDuegXQlEs7v-RuTniA$IF+uSUS7m z%(jslio8O6b~m5NiV-N^Y9UYOJDRs;n$4eY0c%%pD8`cKd^ofK2!(admnQu^NLhx$ z`naVc$PlAkD?j<Y;YxMz<#I~H(kr*dGlyc(Ik|d+bMVNv`{^A0K>Q~nrO*<|#NOpX zm=@#RX%SD;t@4behjm!xT)hTwDbAXm9D*R_@!y`3rYF&K=&=mihS=?2ZdU|ky_aK9 z5zCw}^s`T^(^ln&Z{A<-)K~2OIa^k2a<Sw^!XAC{grQs6Z0C&BK;HWgoeg{unELD5 z5JNcsfe2M?^ZfKE!2~CUZuEivMWP}w216YC(j4T{ALD=fGZd4qI7VahBWaC*9ct-h z>|f`Jk?5;~NFWa24zE-~w2Scnc;?r{eu|<Wmx=zwk|AHu-e&7-U#cIB|9X&m2?(V4 z@(C~_!Jc!~@Rl>2{i=}*Q#s*Sun$$pD{=FSmCS~__G=ua?D{~OhTdrX;ULpB;}&4f z7z->@Q#D#hc3ZCJcEzTAy=X(6jy`zAm!EFw!c^)PIsg7P-cmIPmuXi{^<+3<ql)+L z;d@5~+kF!2A&9s;bmv=xV1|AUpy>80%AYpEs~5`X@1)h|pUH~+o-!Y#3vFPQZ3CPq z_HK7{GVQho*5)Q@fsL$wCBXK(9o69|W(vGEKLpPH>Eu$_)>mz;uvqk^)xK?cFv9^$ zQX?f6AZhSQz9F6ZlHgltzV&>_%$W!}pBInX5qi?<I0n)iB3FY~fI)i%WDTq3(t(Y> z(ud3A^&lLNQC5gEk@E<I-i^;y$;R><nCrd`OC2auC|IhND1Zi%I02Isoa5fav}s5J z{CpHNyvv+=B^K<6%NV28l1uY;ih0?MQMVTzfG&i^{!QMWTB062rLBBahl(XG7h zEggE(8YVm6LhluUHZJLhw&4ZBI1^H(sCt*#!)-}mXNw&%u7KOGWz@|akxt{f0*Bh- z2#m*`TW_f`o-%E2x-dBD`Fr?Kc#Y4KC=-{Jp+Jd71z_%m@+YZ7KPLjAQS#5ep1X(1 zHJ6vWXI4;V^?GlP&o(z|osQhxAZbW2kW@_p;gM{Z!uxBoYVld$JKrHqKu)1vw0(OQ z)_~54Jt{es*m^jRUey{j64+|GVdN%bSm8wN8v*$2k64_Dt3|`Dv)L?9#-SR--t(<Z z$A73LhCR8v)hKpQp`cdZFk85|N2<LDs-WYy2BHVmqthU#zgcU~V$~c3>3#_GXCH%0 zYLCln)(ID@0%nS7JJu-ktXkv0vRa4&JivHIg|u9x<EbV^osYPO@{zX3b?*H=6w%JD zy|HOpilki^;$V@Y-(sPnU%tck9Lk;X0*7>*ks(OLNJ?2)JIt8D5Z#nXJDMW$L^5;Q zTE<af<ECPlS2da~6jeM&qunEM1n(K`GriMRorC7^#;?vP^X7#%i20YjHEDCxNn`sZ z57_vMFVpB$_pNskO?G#}q2dQ@Ha`fwgS*y}j5X8VD_+mE?DZu$);>MXKBl;?%*80y z%o2xpPW1ado`3jFId_l}+_f{3N^XF`2k@}09wPB->KXQqyuQSQX8qY-VHMNP{^ao# zw08-pUXLTNYMF|h#WO_}<fnd$kF&y%(zedj4ozzP8zs-_-$wh_y0?<D?gm{WYMI2- z`|R@kY2DA!yd@2+oYQ>@EXtN&eJ*yul&LGvVk%mW@2<Qm3)1hRC;}&|^!vB<ay7VL z;4eP_e|7&a{GBTIWSuV2h-9-`5C^kcXXQ66=buP&^0jl8saAbK^Qz)tDf=!>y;u(@ z_g6emc<ZtTqiZ#Vy#YBqY(|GoLi%Glnx%}Uk=|sfsCDzse(&zhUN_5TEEv$%pd}nH zoHtC)yrtRGwcCGBSL%=C;Y_G5q~FmF?rFBNHPkV4-FhW*zAVwr-x5AjQrctmI{Id} z$S=-r;1Qn*baOe6o^oT!EiGfzVRc0@afP8Vew`c7;^k$IDM|NN!1scY_kR3Md?Jwj zk`z=96f!LMv{$$}t+EY8lcoL#MN`7OR86v2F0fpA7}`_nG5Iri)%;>k2UO*z)t_U2 zh#RfJ+nO1m0<atTHB^+uT)YPrSi9R7(h7$~(vVO2CW!dsfA1*;kQ)t<D^UW76w!LW zXwt^~LcsQ_+<q5Zc>9iE;lU3u_8F(O8R-~iKW2&vhI1@I40{>pk?OD6?(*^Zj4WtF zjCn0Ujn=bO44e3V<~Lcxp@&C|sv}OC;HtSm{S>ZxG0Q}uZDo!q@aebS{$xWV1bZp} z{!*-EM?*r&$R4I+@U@Yq!l-2p+s5fle)`52qjqBU`=!9t$k$A@pd1^p<vb#5L-L_H z#E^5*4xWP3Vs5o|r@lxmWCn*$W2Fcu8wgKRT)w1o>N1ZcTsGN}p>^xbLSD8Tq+>DY zlLOZHL4<DNhJ6brSAgZGq(72YV0(It8vGhoJl^j;uPC6%N7zzU(`kITJ7Bn+R?!&; zve8t9V<}{_Puevy?}<E4Klc1;6fbG-YXefA$DvdZftn_?kiIi^=OV91Jd?}af-*i_ zKy8-`>?@o4Q@Myo>&>Rs4Hw!Zc#{UpI&zJaaFWz(O{|jH&8Cuoa0JmjMNAm_J}w^f z8L48W12eOw8%(;D25Sb#eTNLI#T}k+zigThs|O1m57=OHmheT>{0LY8^G%)jp|fOy za(4h^<Ml>(BVgoJOb)%52e@QMaBo-QIbeHD;eR$yVL$oQ(UI$iet+8iSS08dXmu7f ze+z7W3dD#AgaKueTM`h&9iQ%IhK?j*n)VFTg2v=axsFs5aoR!Asa2~&CeQ0q>Dg=| zG)idktE$MB6sf3s_u%5UHvEuQ3JgT3nIsE2_%G#%%mAgh#`YdiCsPQ$z;GZngF&r0 z);<4WY8yZIzwT+MAfJOLdX80rRvUMs<n?gMr8*6YVvQ5^JI{V17UvOnFC;4pSRFux zx}X0|FZwAAhuQS1c-pHMb_!4`(Elo?COLg20>zhCO&@`MjZV-I-K595d*%xWS6l%* z67=1}Bm+;T(VOE=KM59fl%B_rYQ*BiUR#5SIla&=Y_PcOMll1h4ZW6xfZ#EgBB({Y zE|x+%?}$35stt;X(8I5-{AlC-0#Ix5j@8nOhV1a`SaM_AEwgVzaF=UH?>Gj8KmSAV zpbnwXj!ZKQCIA)zPFVh`{H?=od<Fl8Xo&x3+0u~d1KY9&<B{nu;wMG3d64mp$hE$K z(N)8#EqU2v5Su60>@Wh3l{u0}NcGl`G?*V;QvLI319+MDt5sH#h(?U<8!Cu3M#oB0 zqFQi@eCKuE&m|#>th2eqgggJfMKftgKr}J;%xnpt#=9ot6et}||45~?XIE<+Ok($Z z!z!#t2iQcqSx3WwM9?iD*7LNz!z=4()pOg)N}v$>_3hGL>?Nco#0Kvhm6wuM@z}by zrzM^H8CA3Hpt9U;Iz5+pMH(gkz-`G&9??hcb3{iA_i4ryvT`dS>cvg^v@Q3er9|m? zu|=J18@Feop5ET^(`cc~hu*MsabRhG#gTA{40X|j8Zp`-7oqf{D=TwnIq^kCd>sL5 zWI@1X$xNZ9nYXIL`N&o;_4R8uAe1>U9wyt^*gM~!zEZfs*q{Gn-O-e8eTUm3=!d7& zno=v)R^f4-e7_UGz(0<{2)fBggWH|XxNj1Sp)*Hx%fG6KV^BeH+ZhGbn)rFIQiX1Y z<^)4%C#nc<3nTFM8hQ~%<=SAK$7AR+#!7q2N1+-7+Z>W8AG+^2FFSSgmrIL(X$wUz zUlXQr*@xYE+k}H<xc=oS0MdZ(KP)lyvv@cxi4ag*dj)qu_^)&$m*`FTs)cdks--b< zpJ8%dlEK=Anf@Z+lGvjKCvV+sa{MD2c=bjVi2w~vNYyz!d?kRCb~fOD?%JY704(bz z5dI!WvvSyYcTUsMIGU?{ECeVZr3l%MRDU}i0wN2*Xw-nUNR4K$X;p)CS1H73xXazI z*G*PdUlbInKm>Qfh{*6WD12U7OY5*5xq7I7Wozp+F`PiriezpcTKDblkOX&6?I1^b zZ0bgK;0hQBuVR+VZ&O&j)Z?Aqb|K!hBeJYPa=)C9bhI!Ym>*HG+)rJ&nSN!5KJ_q= zwSYsC^O<~G^OcATZ2PX>M|3aY&ToZi6!OlSvTZEg%*v$Mn?uP8K_Y=VJgGHUQ5I(# zL=N|m69`z!{P$}%TU%QPWkWLV944681-hZut&<TUVFQ4VC?B7*8tq3Lg>1UiVt<eb z(6{NBAEscI<qib+$=%$*5LLsvU@#C$0>X(2ZWa=>-cCR0$uK+so5H-YV<Pmy=XRQ^ zpdB`q5r_YeJOj#?1qEjHG3_MlrX<L^M7I_Yc{nf4r>3l~C@wdoX74Dm%>w-BEyfBd zte?TsS^M?=VE;R}+n(8}H%|zJjMYZNUm93jriG3rE6sY$9A)GG=#dEPVUeaTBkvqe zMrx7j)<rv+fzoKo3nkdu%>)i+EHe|eUC5N2t9qc8fP(Yym|hSdHXclj+;MO)n<JCP zJ?8reZ89Yed3TTReL4B5Q1vYP@;cRdT9nPZdan2_4w4Lz95>@5$fn-VreW#kz-+17 z00a^1rOZ-FWg2FGhA*i<k_aeKq+pgTLIWiQhZG<Y<a%opoN)YB@=VXw3<x!oXXtCo zN|<10&52=OD(<T-FbN-kPpzK4c%CqY=NqBR=n#TdE-*^hU;ImPvYL#ppP25*UZ`12 zs~$%4>bxGv>+1v#wo0qvQw_RT#WUrJ)%{;+w87#OvDX^c@h8W^jMEkQkAvO?Wvd<r z{hq8G8ca;+CwEVhiA9V2s6`j@eqS}+KM^d}`_8l<aECTkRJHCs0NBht9VZ?bDUQR! zYr`2MS$^ir%=6%1=Xs-uj)Ry-M;<pZesOSi^i0aucP<G*rd27kav~z74QK&EoZeM+ z2MV`FWmK*Z#5Bfv{8~|nZyZBAyyd+UAsM~Kw_=`!C)9w+`)8QZU~(xp^-=GMUsNyL zQKY^ElHlhInzfq;xGhy6RT$Q7#WVROg7XABK+;c|qeQtVyZdOR2HXyKDjIeMfqL)U z_v|a;J5%;skX7%D2twX{$KAvE8iho9Ey_eU<;M+K{v!7cM{P@ywcuB10mjdKahTS3 zbKRLLenpA}O9YpbcMW@O9hxU=`Je<^wIbc)Y(-L?RuXh9d1u?3iI@OFD;A;IPwggO zgT)%u>7A!>#T#Z7@kr97^NlebveP8YY11m+qXp<ZI}+0^Z+lsrqQ>5L=t%a+oMC)* z`0tT~{O+%w4D^bdAaHk~j>hq1B`wNO^*=i&flCyD>p#iN#uLEB=kU9ri~c$h6A3{d zH%DY#s?zVhtohhqi}UW(5C&Kl|Db&1;@xd+_zo6*Yy+@m?joRUKGJ1ZO4|IpNq(_| z_W4qJhyp1K%Tkx`a1a^#8i!d8oH!xFDf-DwI+iVno(lQRGpS=n1P$XmY-Z^lR5gn( z2VlOH1yvXy##W4oVYkaQzi+cmx%8YCt$Xt_v-m^OCJr1?YBdX~VK^@eOwaN6{nM#Q z{GP9%xY6zLYewA?stC-igrK==kWlGIvFre!axd%FlJa%}@8BWpx-LArRnBj?`cfhA zeLf*m+~Ix?pQcd4M<!VP?<4ON!bKSwicG>N{_0czp`3k)Pjy88OmuWyh@#Ug7G{nt z^}<!7LdYfnm!`>JLK)ygH*{l0E~ps+@-l0N<C%k+&7Ji&!*_#wZW&rHOBE<9s-3sn z#X_;3*RlZP0bGpLGB+r#dDiXE1}R6JLsB4;`+yKI0QM@{WoXbD7gte#=!9~oOdipt zOyq}y_c%pFov9<?_hkW;lzXe=Eve&uRTd;cywS-ycd(%U=heGmtB&yF)(fXPR~giB z{HIzKYx1!aVZD*Ukg)nb3-_l>Q#%saM6<cL|163FW~e916$IZa8OTfDTzQAMwEpZT zB~}}G^R8(7QC9AH$+dQsN@Rq$*`9{%WTE)O&+F1+{M1PMW$ucx@gp$s;1lzIhjO)< zW?FdY;ZEQwAvya+_01}niyai<aZA_KR&|aL58`BGT{H<NjFf9{oT%NnXD~S-;$Ivl zxQ|y~DX1o!b()$F0M_LB-rBhOSV2pWAWHmlS0f;8mvWXBEns%UH94Zle1dlVVsrXg zEQ-!s4?T@D-J<xdm5SAJ__ty$!TYDD@cQQyG$ij4d<zQLAiF0Ucoig<kZOZr(dTxi z2pIw=%ZLQ-d`hj`Kd~Wk9x?=r3K8>_!yoP>(Pd7aa{xp6SZ1%5+N4-Gc8-&{tUEK) z1;?jp#BF;r{0#3b{7B>gA;HlWh8MHwAwiCfsa0bZpO$M+JlE1rhIctL9Js0qMNdWK zsVDzCKZClk`HTxiETC13w=!Ky8Yvv6trEB%!g<K2=+S`!V8c2RugTT14)4-}Hg{Z# z=1iJ0sfX;Omq#CvnUtQ0t22{q)l^D@(Wf;Ovxq0_?MXp~uWlU-w-cTRa`upRwa1*O z{-v*Bs=qG3klL8~G<Qvw#_K##&59?54z!=ORXeWcl6#kTvE-GR3uX6iYl-#BH1o+y zdz=3EDnr2G#b@P3Pp~|0SZhKISmWQmq};Gtukhe@_hbKOQedIn0R2BEfG_<e-N3+2 zN+6d;vG3~P)u?-vrf~Yb!QCW1G$o9II#g8L2QcwwU)IcO;rCqLIT*qJv%TJYNx3m1 z`Aq&Q##-GI`9Zgvb<v)PwINGL@4T{YxV^B7W3iTbBQw0~Ox1X1tR{_}v)3mbYp90q z4xh+L^U&>7z_ooW%Z8`M$yC#O9#KCt9BbW1gZ0W|Zlnk)nV!e?7|e?FDtUgJZ&v25 zt>*3+;Qz1>$JX?i=h!1=-bk_}pChR^?X`4A;J(&Nn+Imh?or(`G?cD_Q9ZC)El@43 ziTyF3aCL)unbA*K8Zj*f)SVF-W&dZB^sg5I<@HjGXpZpl(+HqO7gHk5hgk*`?&?2u z{LVKWQC@!pY|NB&s+CcgkC&kXD_eZ*<gnexyW{$okcq9SLR%rOvLD?*Mug-&`q~^V z;O}M`3+tkp<uKyF1jfO<Z{%eTwGz$bZv?Q({OWU(jeD&u)x;iAhx_Ohx9tOZz?BRV zzx5mP<GYR7b|G%Fu}Z$O8)q_U?<48nC?vkQ(DKG&a=N=)_Palxqf(W=VZCpm?6qpF zD;@pbUln=wI&pz_eO^b7H`TcCZKx#)n4<>hIjZ#r!3cK~!0{KfdDGjG!X{eJh(?=N z6bRudPyTkbc73mcIwF(WXi+u5vY&i4JWhq6H}XZK@KSoXNPKIby2X0`{#Wv5POWi2 zQmu0lNw}tscgCL$&8uznuRw;azCRQDs?6DybykiB`&ctXGuh4Y_aC<M!+{-)<ejl* z42SbSd|dYHjTl7Oy7u3dtP2~1i)_tln8=urt#A3=XJ79qo;floxt$PK`k=!RXa9J^ zh8}MO4FVm8d=q<|>L9?tn?r`9Byj@$`kp;;_!Uji?Zk0U`gU82XTE<>l8vFC9&YLO zF($dmay!kH4u~_qpZ~0Ou|ovfxcz{u<<S;bsy2&Uu`|%T7d>y%cKv*~^3gp1=@_G6 zNft=ADR<pg%C@1t2U@o#S9h&zj+=q0oo$m7>YnnL7eNa?t)s<ZA0Qa04^=9n57O~6 zR}@`SoQ>?gjA6_etS0KH(N{8`RyM2U6k;1nr?25V<!@+4lZvBkZHUal>?QoP%y48> z;B_$UJP<+fWboN}(XNExvN<N=K!<uUA83^t3q6v2X|2}R2b51WMq*z>_0{KWD%!78 z4%r~@R_w0TjDbKDC4=+0{_{y$e)s7$FF@~~r#@ZGWIrQy3&<t9?JP+HUj=tXdOD`l zsxq?<6g{HMN*0i_54N(RZ3R~}tMgXBhwzyC;Da6wBoEUXUE*j*Q)$4?7BH)mj^<}R zRRau2-YXIbrIADDnj;28$4i%(rkWe1RLYc>KN;Q_Tj`MH<hN0;f)9J1kAquh$w710 z>0i+!)Y&lpt0K;w;Pr|I4bX7PAQB<-N;n88zLuCR*UED`THxeLc(3wOe)C5_4DheM zI|r_Lpi-~f;=2FsJ0#?Tfp{7U7gN>&APmCNY0dlj%02K_Kv1MX0cfkeCWAVamoh-1 z2a#O9v3#JzXW*MNO+OpU{$EvPQQR=UfUT{b_(P)uf7BY$^i)+~cm^WVY@m}>I2-KI zZg)z(m*)*=l+A3xZSh!Do8aE+s2*kV=y|qI|F(|G-kkkC;gE3#+pas&T)~jJWQNU= zBRmZc0zWt68-@Bdr(Jtg;>K!(4AuIm`@L_sHt@fkAD1{x>^%k^&B8i?l&wb3hNA-e zE0Y$_#GBALQnbn6Wm-D*%eYS|AZ!}l&=w6)ejQ2X|F~#@JCr|kc6Xn|M2DL0TU>xQ z`0Hn%7xw_ZtAYM&P=VC^*xUJ&_6y%IBFNie3+e1rav@Z&yP~IRw<}!0nZ#;0w-#>D zzn*t)uxji{v>gc(V?dz=z!K=giyI*)Oy}!%6*lXTG}H5WFVDPF!2mLpZ>242{dY}_ z-|86lR-_{=UBiYScwEM!RE=!6NdH{B=2p;ZrHC|!9T>z3K8$=;bK*{-ZLycm-#1S8 z8ezY*Y=FdYIUe-&jkZTIbo?0c!871Fc_nylUSU1f4*qbl22B(TEH>|e=I$9ubb76O zWYe)D_4zs~1#<9Eme@7ZFO^tnhv{D#@M{nuyb`w(g*-R#q+x9TF84+mmd6Is!sB}? zP`3d(Atb(^`XRhRdg6<HI;C<^ahx?^`z5liMW@H%lJ$v#|5mNhn8qB`Mw<+0)Iz;D z!g1kIG<T^AWYQqTf?Sf~<C$#_((H?dBe))ipQ=5VQ(*X`;v$=`P-ret1CZJd$*DkP z`LwqyQB(-7oYC?H-2w7hw)R4(>7@32I4M6Q7c5af!WNjPyT((d4tS-3h1cASwMe!Q zEvZYSMAzQ&;RHw;PbI#`(nb?OmvMX?05cw>R5g^T(|fmH$1OugHr^ppsb_@@5j-W7 zrlC9=qS%Q4od*$VBXN_X9CV9Aho=0<Z=t0A4gw!jkz{HR2W(6&jJT0pwvGCqFuYt) zPN3cT2Z{ySpA|USl{$h()eCiIJ!G#EsT4%%S#qJ`WW~aw3<ps=cCPR)1mdD8A08ko z1GRY@*~E>Rx4dlTr@wl1`hQlnl|B`!7Yt69WyI2P&kSzlH1`#U!;w6MVA7L4(%&o( zJpAZl8Of;dnWCJPOCea2QJ*=YH4IU%D|Yts6!<*^yUahK9NZ=R#au+-Z+*1xs(=q< z<}3ON`wY#r8k_Zs<_IrDlk@(tCeP(;y(mz@`#+zA_60OaeWz>PTRD+@F{|E4k26kF z(8A0au1&P!PJN%l-o$)nvVDU`_fPfFrXiG#b=ZZ9@0+aN!)QSlplp5nafuUhD5w2f zXea-FJUc&Ez7W3$B|&LUJ^T?37uKt#a<<g(Hx=SFw_w|-lqN7cfv%^FbH5*J(r*Hc zpN)Jj0_mPAL2R(U1<z(ankJ-r&ZH8pw^*t~vR$pPc@*j+fRo;d&SShkFVWIbIT@Ib z$P2;`a4bxmj-+tbpFpfzG_p|HUhwf5<TJmy>CXznf9KfBrq39m(QEGRXhp;*!9j1a zkOG?XLB4mX{`x5YznZ?p@!m8N42O5Eg7%1LP_iqzsh_eI?ngB8jLQ7BPCAVHFCKO5 zroRB^si$B3IwwsH4RN$e^1nU!wfS85d6T6+y=O}!e%W^s#!UpCK4^9%8f*`#p=6m& zmmAifVbZjeKs>*DH~*sc%<xbQNu;#0eMK0YVDN|<yn1|DKT%{44F)x?);#%-AFh*1 z{zO>sJ&Zb-ElYGiaUFC18p(6#({G_A8rXVP|8PEN4Pq1g9ct$UHGec4VJa{E@b+ZS zm@xLs_R$stl8f|HD%UVO;)h!8?9X9H%m%aTfrrh1LXmQROC03@xm9)F9UAR7+>#%@ z{P=u8kh>QS!Fgki6RQRxh*e|XA%uOM9(3KP7NS!05sWz$gVX&*&6ktNYNs{&Bt@!q z{6PKrJ58Qcn`reRod)vbzgYl5<JAU-i8DukVizT+^<@*LW4#k@-@mn{(!SE=9106w zCxe~co06u+_lhHc(<hfN28aEgmNwEiKu>36Ip<0I;mu`{vV0z;wzJMOX`nR1G9Ul= zwRt-kAJkZk@3nPwe!~CUcOrXv4b~p0R=hq~B89bo4vQae`L>ZmmLoJvnQc>ikk}#j z(bQ>DC}uTPBfot@<$P<DLQK;&=%K|v=wbZCYre)^rQSS>669h{BnDJl6tS3l<vu)2 zR-Dg7iN8r&6<z01ERZ>>q@LvAsWQ4+u;DMjJ1eKzYkbOM@+N~V_^xfC^H1e5UXFul zaSHrT<7BCylz#7#u7^J(W(($pU~ED7pQ2X1LfdD3tO3zVo@p%k^;&U*v?u{xCkiph zWtRcce=~m~@~*Ld*xt@yc+&84)o;shm8j;<9=!aqfWR$2EaM^_{_(b*GGhTFBC16e z=}|jO4Bd&~Vr!7$*?BuizUFX^Nxuha!rB2zg${VZ`v`IW+e#*oF80quKXM@%Kl35o zZh&ecO9&cpdA6a`sk4+-u_pcVdV|J&1B89Y0@6xN(FlAhV0CchTYuZWsL}U8N5Bxy zy_@M*N~p#u*tpp2SW?jj`%mrRoCeGvXJnYJp}=;alVrY9&+l*{{_*+YdM4FT^WUlS zGJLL$p?HMXN`~u?*@&WyZ#%n}O=@IB5p_HSSVV30KhtlPuf$Jgus(q1j1f2q-5`^b z>8u`ePZc=VIrwZp#586R?J$A9aaRFZf*le50UW>js>`a)nT)UONsECi)<0dmE`e(C z14;e`UD^R4*Tjo!?jswVWoumqf?+9&pXJSk5RQ4@xYL!F<!pq%_Fb0KVr?G0=Z)O) ztTFslz>rvQ*L(ln<ssNB$-krWKNFJ}Xcot0We<TE3*Y^Q|BC**?+D;Z_tgjtR$AYk zU&cO?kZ%BGot;@htTE~An);T|h%QR`GLJM}3<NLF{z{v5v^q|m!QA4>01}#41a|r& zw4Rgj8uv-_a7=#3%>&J?$EFI3?Yd*kRVY?0mr=#?#R;M7O;)eL)_{^CnI^@{bFY#k z%Gz|Fj@)$GPmvxEEQCad7(V6HFRgG3KZM24bM(2Obb4}WI(IxS^zu}~-1A5H$p(6p zuX-Fk>%RX`>m|HaeT5V&G}5B!RIWqwPKr&>V9b#j7OO;YIEu}><^rfb8<xZp8LBe4 zQlHqJkRxv}CBN8Jj`d}skgVH~Nx-G3Po$H?9MBOWVHUOLX8#8+yYPO)eK#b8E4Ff( zxyhg^Zsh$CSo(Y~TT)@a{Z2m16i$s@KV%4pkF*P#!04msq9l6x+$DC-3CVK`G=Dy# zi=va&0!&R~o^beroe2bwuIge`B_ry{T&1^e^uv}OuT}KAl6lhMXpR)-?rzuuHnY}+ zR3N2hq05IB<)mIB+0{?ahjS4|>XOv=jzG!VAgdY4)yOgZ^Wg$j>^(p6Gj?{l#=djY z*MTWZY~XF*dl&t)#iDB#_!a`ixG~(?P(E01Naaz<U{8)VcGK^VV*m-lFArOPXAL;K z^UIpY`@kOlhtpViJY4B-aCn;npJp7%2xdDJ^Gp6W_LmtJ!O|kl8yfu4j>D@C<l&>C z;39cAb!?*E6Hhm+dQ#LFiF8=J#rdiC_Dxqsp!h@3M|ATK5diF;R0&Ib%BlDPBiE>l z;=12Tw3YdtZ1al9DpqI5+vsXJ(o;C1!rAwsYFE<La7h}4Z&%afuzR9e8;eFZjuL)@ z8L>lj#LNvmq{A#h_)NWN?U%$r28;Hg?B7aKU(dIHvHhxQg~Mny5C~?sUsUiFc+T^H zw%k3$iZcM)3!uzZpr}?G1c$MC)4Y@l8!R>2-e1*|x7gljykx+2L-8P=oOYRz!Bd15 z-ch{?5okvKc|z3cL&U%)&<TeS^_qae`~TqjN(j)(8*uiDW#!Lz=w`tMvb6-uzK=QS zo&$1|L6#K=_g<_94`Zu8y7cA6aLiRA*kBD;_#8`3gZM(siDC?Ty53%u10Ob#<-FJC zz0<~9sLq#la+)C&J%jc8RlIf(zP50;w|usHaFqoZp_WY8F^@j_A%x%!9=Tsx5%E3z zgl<;#?Aw#%zKL3r<lp}`P4Ao39u~^?h&(ziBtx+Oef#2Tfee9Ul6t;09IsTE(+bs` z{}NzKx7Vj75c(e@!1pbVujlg<JtnA83A|x=mfcfr)0zF_9lczo56{h?Hu6DpH5_)Q z@2!yIAe1{*VLj|LAhne3-~?#L$sNrBVt8bkKY1t|L4AbPaj;e4JigH%W}}ZbPCsVg zb`D(msowO}u<2?BFHczFzJ^32`?P5%os6P^7o<$9LuCz5NF9pBAY;NDb0taH$k@DO zpv^O2pq<L@+z#*N`J+^)gRcwY*?{Z#1~ZU@QEVHptD)fqDeQ}#(=y3*T&@euxAO{@ z)5vcUOVU;-G(<eGS_V$L?)>l?JBwMac>Ik>&0Vdg&~#orc-Vg4*B#kUn2}*gI(CN= z07;sZ-Y7Ya%El=657OrCH<*27qG_@6D_4=&<3cc;T)$;HcvL~KW%j4&Ye0YpRSAc~ z_ov=B40)VP+k`3N#;4T9(G4ah$!>aOj2g&U*)1>2H!7;BUG*YW>rVBeblY$X8f84L z9aQU$gjKdXwb<uQfO-cb5X=n+e0qm;1ilC;@io^?ab3}Z+nfeMBm2sS)eKhc5bz|I zYv>tCB_2$PQz&W4Yj)QXSE+lbRhV(U@APX5v8*&1D!51)Je7J#;q|AoE7X^1qa@67 z-=k8^78Y4(R|{-=oG0|pw0<lV%E|mVplmhqg^fP-6F7lBY%DKF;UG>%zNzO!wdF8% zGWWMa3$3atb_=fUWOxvEEa(2USf0QdN%iLasNuZq>g@=Fl3w*c<EJW;wdweIGm~k{ zVCw|UU~RU$8?3dBEOgG_5Hx%p>iN{rYmIa;Chqw7b=H&^p;?=5aaa<nl0hGld6iYI za7P4fgXH~FMeGX>ArxaZC!lrd{C#b?xOLp}WL!Sa{m4f4B|$@Y&7gv&Nc)+DjZGJL zWxakaIhJbho(z@(Mm59;=>AH~8K$t;&kw^sOSV{PofrM(iu~)l5FTqak{p8j4#BFu z=rWh%X6>X5^E2JzCu<~6?!%1rT0{<K)Bp%JDRkHol>(+W-tRvT+s=}UfxHHfGlq7f z6qZ{V-e=zoqhs-$66uFeSRb|QAg5?#_8K#Tsu9JG&6@N3IQ<z&&-*B6r~!*p9deju zU~;$_;ir=Vfu}F$yK1ZA^WUZohDsZ@(sYPwpC071KSz(L|NE59u_OO!s{^he{A!>` zZKg~^MTTPy3aA~4$9F%hN??gr&^P@HCaw*k1ngcMuZCUzADDo^=wzU^roEN3i4C&e z6S^3d_HO98M(*i$hv>e66gd#>_TIi+S`ivR^}dg|uOArTI^0iD-$Fe6!*(?4E#@m4 zwAf|-y$U(tL!R$mBZ20?AZ#SI@0Fpr271?8s1-B?X^i2-xRZpeupV;QU|W#;VmUlt z)m>DM4g7CJiJAvZyqiBCU4LI*7v&(`QPw(NeUug#!<#A($IGyrxrAKgA(+q3)Mx!r z(xj+gPVq`j%|K++ZZb#Wy>n^CV1+#dX?D0UEldPfEw#_S=km&g<JH28sT#(0GMVI4 z&S1N=zd!BNQJ2fflx{20x7hvSo%~@wYZS?nC8zQ=nPTHXWySv?C`O2XF3zV0r(>}0 z9G`qc39#OEOk**d5=das(Ce#^GywX><?GayOy!=DsnkmgeGcz`ZOG!?HkX>FDDwcq z<nQn3#tYQ1ikTLX74ISL<2J7*8!Q2JE326z`@F?TrM*s_S=~?yr`XpxO8Rg_OG=<l zG&I#k-n?XxKIbz`4`lV(TfWqV(HyDk^HXvwKzq1e#S1ELL*ju-09t;vWTw2We6ZWs zJnDGbTc?>JHS(HMvlb^MYLyuHSm`Dowa7&1R&sBdG)xQ<%GZgnzuysfoOaq>(DCMp zkCQm*q%b~O<G~)twR><%!X7{lLm5BJ3HC}lb!=bf$!}!1M_#)Md`+OHV&H*P4<(^2 zD6^BlfFQj&C63bMsXY(STn|8VDCae^G~c*ME-fWDX*2DN*4F1S<BG3M7)mEh9x>_f zN-};ZSo`^b4OiPGJZ_-S`bQ~^#SlUA0c~`XVwoG;#@Vr@##V*kXdfaoR)Y<9L#Zl> z2#s>x=2qIl?A&2vkMy>F6xELBT|z1Ayq{W>;4O?$9KB|B?MFB;JLPDaY4t-n3yw2V zf_xoPbbLoRJJg19LfGCgWf*p)`PkN1D%DbdU2QPtaQxAM@*v=pl=zTCqgmhjz}lz- zwbx|RFF)}o8%Swx3OTRnM+P_PMx3cpy$eN;CE23>u${76dQgh=zCUn&Z!{(%tW8YQ zvjCk1Cl@4u&4$OY2(N6<=hi)N8Xw_G4&btteZ``cZ3pheqk|c2raCoqdu_3qZP!m| zgC=+@QP|-IkONIJSa4G!yIR13!+Sm63=76zw#Y+piDkrw`>b(gG>MCcV*t#In;nf> zk2t*Y(e)ObuQRNXayx$Af~frGmRg}ATJbZKbHeukr0QPAy8|Op)QW`g=LG{I9nr}) zCwwip`5rr|(Cux(hO_gh7NUS1v<ly_?9oei5(_51F4^;u#l2C=)I&$I=>r{?Zd41N zn=w!MtS?Qp<~6Hx>q|j^_U|j9S6^$UprkxZ6wvRzmiq_p&|kk*=>A&1NS<t7PdlvI z<cvf^rA&T$NhqP=to{DUJ(-i)fnk&2RXYb_wCPSw^rtqnBZ?mYHiMgeq=HVgB%MqM zkB`U0`nnt<ohK7uv`wV>Jn)CeeURZo)c+GEou)kDE{FU8dYM^Y7kBt5hgvkJteFyr zCayA{O#9=#G-p$1&-NqwJ0Ng`y@7x<ytp>T5YKpUy>8O*C?QY2%z?K^Coce<Mp3=~ zP?aIl%eB08xs{ZM5cmK83}=qUb6DA(3xp4T4>|`tAtZpvX0)!#k@%nU);Y-=z~2`` zrI6p3D-mn3{ww%=R%h?|Sy+4N*kSYoLu&V<XfP^S7Y+~O`=`+sptSbBf&5|lgXdo= zC-?1Z9tNKd%MAq}a{n_Yc2)EmKEtnHaBvg1@X}n{WsLs-MqpOH;6{!p6aeH!gRtij zPRE$}h!@YrKAFW>s|jr{WFN(kC!Bqo{yqJ>pl#6@uic_1AD&fTBL~}a*F=&#EEqbx z)$aPy;WS`Hqm}6zr@JmF!fqz6lRmuyk3vc_9GQ#Yy|XaNTZPEif(DKhf@!l@o+>+6 zIV+<`OtXZxa!Y4fVp#<DaZPoLfduP@5Ivr$OFjG>`E68B95klc_m(Q#zr&{U+fW01 zo9UKT=V$-xZS&8y6B{G{JTkY6OKs^01yt5~N5K>OHygC$Q!N3+_Fha6%on<z4o-sr zx%;a~y)I<Q5ppD7DJO_?JCAj~g{9-(O|gswR6`KcMVfyEl5?zgzCQtBUzQ1*<EtJt zvOKqx!gj_d?uHlna)C@Vr?+36wk}4vC7H}-6DABLHQ<m-iCk}Ni4JH%)m~~S>kUAG z3uzixUE+*o1VGqW)>`!sEm10vKU3*M;u6GLVmk?bXbejW(*bH&bHySha}z!?v>0|i z1ONg>WVIT%GMWezXaa`$N3L&U=v=^bkC!oa{HzvJ0H*D)5EdcvWdrO$adnqgv5YLj zKEOK~rBb}<T)ttlN4`~k_{R-6k&bC|F^lcM#GfQU1|#;Uem$CwE_w#<{k$udH~$1O zX^nVb?V6K}`=e>m%sva1%CpTyqVL!(I_XMNMjKtSeRl9v54BQ!*tHg|T6C3wm-f{? zQnkwvmffY6>_TbRq_+D&6dn-!t%*getQl3+XyNxMjNn=L_3@FF8oOsT?VXeV;R^1p z)3!&ToX&+mbKW|rSK{gWO^uMUpz_95O@2SHuL&PuOErvFhl4svvE-JNs7Viim%x4Z z>yTf^m5Icr_(CdyGR(1Lsy0B;!mV_eSh{*Y0^z`5Kr-vX<d<;lA!&`y4jTv?{2tXR zEn>NA(<&-|_K~;8NJCWlfcN>yoC!8aTYl|J^#0w)MYd|I93PgBQ?TsPDT-yeqyJ}7 z<85wo=CcPil!Ya}2*6KF2JmnE?h!7VS-tNVAmX{7;TSD-JoGZ9o@r>@Ik$>tiZoT^ zo1WgKL4=T2DYj_*%L%GHRB*FTg^;d;^ORlL{thV%pRYN%3?I2}b7OPso1l&B-}$dv zFwun(F#nDU!n%)8t~QX^a{{qn$cB0_xm}th1CGCnG}sz3AK|s$b}kheQ<oxqt&%pf zn=bo<5h>S=0&eMqwUg{O)0B$>%?*d2>IMi<W{&3SB-%5sBH%MF<KP=jnun<$PIm|l z`|oJ0Aw@yj^kqm*0@R76XxIAscjva}XSoH2XU)6zz~d7fGxINz^t0Xf)k#@AWvg|m ziq$9+kioM3t{@x=Cy1GeDHjMW2bx1LiZq+5<LI>(yiT2MAGH4-3V*i$_<6kCLZ?Q{ z%&c&#)?}9ll+%8}q*Euo*colW@iQJu`uLpE!D=o+^u|k#7l*+7O?Bn{>nAH62~S~3 zbCEwkMP4xw{ah`&?ewHsENz1nazt7z)(^+{v4U@XTTXTpXx{vLjRGs8KZ7V+2Zykc z9AdG<5QzUDVP72=<=RDSARrAQ-8qPWfOJbsi3LarGoT1V%Fx}?poElw5=Xilkr+Az zi5XJ5rDKTupx^nvbIv`#d;d~I{K?Dn?q~0{)?Vv~5^QM5uX`F$qjSdgk88zIAXu`1 zNI>%SbuaRjrP+6K5kJD`-v#Amtly!4YtPPhE-BOQ)~`G7hf#8agnOzHJ_h*L@>MDd zR~l<3lpCjln1La^$L#XV4Xw>K+x0s5?kOyc_y-R@+ydB;6%fHCHA3MTgtJA&v=w@f zl=NGEuDopKAD4z}?^qbw5J(<L7d^_35Dw@pvxwGv5XMVPZuQWbd}F7YKQ1EuuTZ&9 z*p~(`FUn9z_Y+`B__n9>Ngd2?ti&R;=Qcsi^4Y^T<YFp+B(8mBvf(i(df9k_tT{@1 zYbY;yyWDa_Q?Jsx-cXq{<aw&DrsRpv1T0BOujY02X^^g_hLz3w2oT)GoKJW~z7_J{ z#$jBFy)(l@O&8@;sr%{G@J(vD^RWh=#5>oI$Zu(PM#XojGRwD2m<3lbh4?DaevX1j z?!9X$@#wjq<Uyt9;be_s(jO^^akumQw!x2a(2o7I_rd-qY$TAdqz87B=;Tu15z>k@ zmc1&6*<ce@GuC#9th*^~)KsN-KR%x2raHo8M`<x7krw8*fU0r`r{v3ijp>w(oj4mG zFN{rL9sZzubf06;f%>xCc^W<X22r_IzA-Po^14Ja?~4i<!!~yjO<>wT>t8$<sy2Pc zX2abDkZsp79MFVLM|P1yuMVrEV?eWZ0QgRmpz!sx8K2K!KS#AVL(#0hT4c1$;*of> zW!@!Ra<0esRvufitX94cO3;X#mU25hZ(U+K>TXQC754}GyZgg2j{0#O+uhZ6>l3)2 zLZ80fW`Cv9!7>jU+;<fAvt6iYF=Cr(8>sjnT{x$K<!qC$FjH48EzbSxeg+rkb1!9( zhb)_=Wqyivq!s$>Z!gPUIv-TZvUiWFrqlB;|1UZFn_q!rxd(rh=n30;&3Z<?k<Yxt zdiqew&4$r_WxPs>P7Wj%yB=4SrxEcpDcivZl(vQo@;|>oTSiKIie_d-ROF<~s~;fC z(N3op_%h^ej%XvdN}H6EhViD;T_b87#HlC=+>jpTDP6#GA{VR}?pvX6;8k&IC0bBv zZZ*_j?OH)i?13^NvZfV}K`<Ze*qtt~4i_+@!jSI;Mv&pxC3>$GVm-+yy3A}jQcV93 z5~ZCV%a;2+ZGa5nH<_mZ`P_}nA-(BymDXngc{jd`w_c?!B87>u?tI|#^}u+DyR7dA z+I;XDjIlfb!K5yS(U?ykT&`lS5=-9Fue9nJ4#JkQsZt`6%8Op#-#o|wQ%KUS{F^>> za^4qn@FH#<&EvmJbbz_Obnh4XE$vNVDDvdbPqk;_It%&>aOa3T%83ctS-P@PM($&v zaEa}?$Y7Poj;N!Lv3E)+`hz?`yS)GR<5XasmM3pR8_B+I#UVxrCKbk?td{%aTWU$o z7TI*O{Ak7zCm*4(Cy&sghZPW`%bYA%elkfSKgg{2J2@7ldgi6i%J1zufkfIDgl?66 z!t*)QNp|((#~&i}3>FiVlx9%XKFmlYw*yq0m>SLWwMN=Ht)a+F4!w@)m>4bFJ2s&s zA1;G3mUHg_YP)|hNIb^HkREmTVDZ>_-iZEqBgjsU+*45ykCuF`!2j9rqxI)EAlnOK zCkMtMc3#aN?_LJX1y&kJ4t*m_h6~Xaz1}~h2p$fZ(j{UGslD!5j#+t=#JvNn<*D;l ze~<4ENL45<U$7j>w|!T#|5Bwc9*+O-@!c`<KW*Xv>zC0a+{0fjV?fJuGRHBT+_;a1 zmEl2O2AtNJGU<e%)n^5%a3~Ew_HqB#RWI^3xg_yQ5cgS*l;0}z>4leW<}Y6r19P}; zkZZb4r|ux7(1H)mHP@9o4;`YEN@6_)lYZRv!SqR+hY@;Js&07GI5FIu8r7D{^f0UD z2;sN#3*pyNERn)iV}ZnYn4Efn-Q4U5fzIW{VITk)34)90-+`aLF6b`Lq!WmLY0$na z1cvOUbLSGge;jKS?kiR7J>kA-*Tf!y$0Atu>M?k~gTuWq^dOlu;P)!@K7N)Ax9hEI zde2;}zNi&;*17CFBL0Jv+{cQ9DN!!u>)54Ful_6wfAS5qzYB(y_rt#r^?x~q|0@o% z5iH<9Dk+&r_G^6Qv+TUX*r_sPmL{B&yE8nby#Z1f8CSG3`-$Nz24cHwf`RDB?``ti zbbi8lr>~>zZjYw-PiZZd2h?-#?D!CdTB_+i4rh|X!%^%J#@=qT!&o6pcS<iZ7&~1< zb+Gl@Y|%ei2jYsUD1{us>85M8l$Ti<b2>F(EVIDR;6uMH-9MHmN>n4tB5*X>anZXt zhAa{IyZ@|a1Xrr0z?0KINangv-b-yD^anUZElSe~wP_`txrNeP=#jiIc+SN${B@L` zGyZ<LH(Bws1|R>8p=~e4{W<vzEN~z~UYq`T(Es&OUHl;($%WXYw#7KcUi*<I^)Y0r zma&k4ICwCqoLfGrxXym}$j(Cy`_;;FD9#j@UnClE$;S`)?#f8tA!fAMLdo~(7VwyD zBv{oV3S@SZvvo8X+stG#7Ft;SQ;9fdh8be-JO~StlQUP;NL-bt-YW|tbbR?}V|b_* zOeu_bNagS=v?CF&ofbhT%b*4wuzFZNYeuGYJ3`(#Cb(Wa9@6ddMF~7Ll6%)`gDC#| z_J2JEpJe4rm6_Gr_8VuKAz!PDJ;ek6SC+tm_;MEZ>w=q1)6uKc__NIYo^}2MuQ^<W z{|(u`nBe~9Rb`^M!XNzA`2%gs6EZ*59|2+FE2QsTQEux?ekk~0FSoq93^jnP=#Qgj zO`O{N2!v0H`cUOTX=(KE+#PB4&CY>^!=F3cMJDO>`fiR(wbDbF;mHn{@T%yywfo6f zjyZ<)+%M4I-O!WH{eywx`_#n#dX-fks2aNu%8Xm1h&`)Pj<I-;5uDkWmep)0_!tNE z=w3jC>o8ye%Yahg0=j==PA&{#YiMlN{YQ!WhC4lcR|L;`#32h5wHLPEbN+rPaEPw3 z2|~0FzvwwkJp9}D?~^R|n<b@o|8*Y!_mchVagsH?I7+d$q3_}GSnAXaCrU};`-U<) zZNjfACUgtN6a0~gd8<q%xo|2-LGSlR5ja2UD|Y33uF#GOV9#0A78{76AO-Y{U$Sq* zNK3XtH&LbQ$3^r{+`=;n+_5~RqwGqyc83Ng^ZDO?R%Yavd*c`iu)+2^d!0Zk>)R{f zl@p_|?0jjXp3&Z9M0;2x0J>05;ewRP^>s@nle|El@x9T1nR$7ve$Bj(GHk8$(*D+N zdb1SCu*zP@*$x(;48tG&{WT-}U6saV^^yN_Wd3=Mf&*j;GVU-eaU4;8)bnIgP7<<u zkmKZNowRRF|CvyRyif+VYq$5dR=jM2n8E*rLA$o^FmvH;8Ii!W-tSQN2xauzuIGM% zje^7g=cyQJq0~G<XM^P;(1^YlAC7`vm3^bAA!f<C&3>)c{<tX!WN!)s*r6T~mFc`! z<X~nbQ5fN2(<2&H%h>Ce7?xO^AlxrFct-$_cqr^E_O&S}mi=$A<G(-SWyN1F*Ok+( z>vx&i@o;?A!vCbu{_~djK(KxZe8}(K`sV|<!u-X}^5Tm${`p1!_J(~6yLdJ#<whC2 zW^6dM3Z{~mG^J2$nfs+XC}#{^lKl{b&JR9RK!`RH!{m@&4d5^REI*uX(}wih3-)_| z#vGbw)2UsHc)K&>zF#U?YWj^YHGePDhqeV?>m$m%G$FhW9jkF|6ov)k2;|XHZjC2o zSz>bZUiwL+AbAtcMj#~Yg&pRtn^{;B4Z>5H?dYKv?Y?#`<C3-tp1B6?$W(Ybb%1<T zqRpD{v%i8p53uYRE>G4h?5c=4c{zOmgljw>=l9P#;m@kZN*6nURbl2_F&5ya-vU)& zN2-(?3>e-OcmL?br{rZ5dc|=2NIeWBgdoc&DBrobV7?W5x>#rk2)t5jxN>B+{Nqyz zFg&iiTkgN`u+EvE%Q(G`{I-AE0ZUih?RV?wgZlOMb`@*-Z;nP+5Mp`)D+%jeX~uE4 zpRoV}pt~d89m?rCzQOH$Y(3}6HstuzxH~LtuJ^{-z{A*ueMj+j=MaX?T;?bSn_oQ) zgQU=#zgJJ6&|j0S`}D@un)$z%jDPuP?i!XUAU9=2Ku#6(BBx3jE31$;2yP|3yH*<B zFcnn1grupk%G}>^oVThKLbmyBhaqVYkR{N8<fY4Rl@eQ&G+2NiW*%2pNrcsa$itOo zX5EZ{3c68!KwlbYz84-U?t5=PWJG;@XlpR)E!ri$Zh<3(XQi8y$>Yd2{V?Laz+sI? z1+$ZCQ&~1cxiKxG%xpczZ&{w+a<nL%hC0A_AnYp($Wx62dAJ>5Q^X9UreRa?i229@ zJD!g(2TV&|FO!YcI9h5F6dSj8+c2;df~j;Y%N>mMl7K%kB0l)sQ%3u!=Cwuc<J=NJ zCaK2pMY0i?!C)#)z5%eAuh&$i9vg#IOIf6o=4|TV*3QZ#sZIFKN^)$X4sc5Q^y>So zhXA_(NEQ?DRE#}!>?xI~cqoO4ZSt}?oZCkLV|2~V_(CR-BoYg@b4E4xW2<#xPA4}Z z4?x%+zbM7oX?!DmoO<CgZRMfZBO<VKuqupH8^Q03yt20?t<?n>pNkV$b<nVRR@+lp zB=v3QSl=|U^_@=sGsTV5DMLhBP4QyB9sEGi%xJRVb)K=&v)Jr37lSwCJS-k*&QB?L zbra&VD4cjlm3eFC?sc^1+%!4pesp@Ey6s-F8db3K5Gz=$e|h9wl?!HM`*So?tCLKA zp?5uI$*#6=IuU(1zwcZ_bQa9%mijX??)}}$!a=z<wOwZ|LZ4md*b4-DcRE-5@9z+i z!S70X)rqm6=a;nhpT+a9<%NlliNp`0ZqLiG#*r8&Fg$d$m+N3zG2tAwbwi6Nrw$P{ z049#1sPqSc(xOSb*~uQG8CCW+X=erF@McP3h&A0vAG{VZyeuPwD$43bXG<D1Gu7Us z)r|5eOp~C3>(<h)9BXSCR}xEr*r`>D(S9QP3(!KMbL?Qy4X)B2z=PgB*k{fT6EZ74 zew(>~1C74ZO=D-^TZG2Zc7ATegvV&F;vu$Kw{yn}>?B3xZvpUucZX!1OrFF5@>!>l zsB2(pyt<T}*Ff}Mpr-kPlDvZ9EqsdZc%Uy-SU$x9>(pdXwZc}TOjoh%=3Zo!+-0(z z4X^*G5JI*McC<S{Hr=B)xDN+GK#5Jsz>{bYF4XlRExgE4Kn}X;B>~;=`UwIBErx7s zoi<~DhLxtV)dyEl+b8T&OTlX4rp1#BTh_d1<(++2jZrB;`()qE&qILVhW(tDn}Oc~ zj#K0AJNYqv$<-IRe-54r^uz3^rSGd*e;(@_t?ZTSrulZ(eXN|w&rd#A7}z#l3mlE; z`aEhm5XEe>QHiv#gL2a&tu+gt)R=CDuUkzu_}#T0*9F-tTp&0idV*Xgu{PWjX?(Oj zKR*hM6dE(Jr21j!GFE00>k*CQYdkR(sN;2*$V44=s~(jNqEvGqe#*068R9}nYX>TM zTbfPO>|Nk%zLp{z<+2|bMXU|Jjldi2PRvf0X9_hGT|qIHleAL}p+wZm;w3mto+**H zA&eX*-kCF=Dl>Q-Zaqf4`{?0E;v2)jri!f7l*Oy@bO~{eTZ)-(#XlH#%YK~uOs~Rf zl10$G`)zoV@Uw&BsYnsN7~Q0oIg-%$HSv$Db#Dh{*SLZ3WsAV|Wd803=GDpL5fkHy zjkSf8H5ZoJs*WWGj5s|^a!n?;A&Q+^J!XsfV#MkAkS+a>3Mxx+rLOX6hAjmL>hE&P zzn=X6z7_2rSXW2_P6coTOIg~hPNq$4-A~q-gXrO-K?JRP4)B*jGy&oxk;2o@OV&}x z<;?OXbY&C#{V#k7p{0R5=ptwuyi$oaU~2|>kNP-Fj(UAGTT4MB6W1h}h;#i|8(Tyt zLYgx`7;i7nP|B<bOno{V6(&K_!4+lM-TAr78eV03peHSYT2+h%F~Yer!_$%lhKf;P z@>0jVatRGXnY=J*7vGCCKw9}@E3>Rwp3$%eM<9g?wmsLe);ZyHZd|oKGFs<ST8G(? z(8hwwpuyevtfZ^PaTPZGCH_?XaU3?*H$`$@5DLruCe5q_@szOd50K=l`hqK>{yd;L z)ahKUWf4TR#M(5{!(--WcFF44<RNg7kABz2vy9y(oNCLW<pUF+5kikx&D5V)f<@Qg zfyn6&U*001fC!>bx_-WF-}N{<q8vSQ=-bmuIAJ7uP9x<uN#f{^Y-XVzpV%s~Tzq}9 z);6VotZP|Uxe$9}7P0A>%WU|xGJWgo8;ilLj+PLwwMqq(MrdeN*6gTRUY!9r>btDh zFdYWtbx6kEO2b+s2$Q%QzEK0e`yrB)&w2}W*Anrz4Ag_$XUo}Xu<nG-W)ERaslB@n z8n1c_9xcX#TG1)7Nl=PqrX0OsZa*@mz+nf@a{Z_zy0DO3I>+`oFb#`g{|HCN!mG3b zBYy^J<S_c*iG3i8%uxz|Wq%-5Z+1{HVgINQO|P*b<Y13^IPnJ5`9B<j7a3olZj)`@ zo<vmFfGe<*r*Z<~b~eH4H11gmu;Ym*o3ZP!^W{qxKP6+sZEgg_N?H5;px!;~vKT*z zKa?9W@fx$<M0{M8oC!}-m-$`U_noz{gC2YQ>I45!`J?e4Ekwlc7UIL^^_tUv9Qpry zgjh5DPYV%T><KgO<hLuc=&Be&e$J+U<^BNTmybzLMuaKS9+s@@$VdJ-ZYB!Yx6+^S zvL|7kT~23piP-`Got_(<$;r%G^4J+};PN;rHss+UZk3(&x=`rNNPBfEHXUn!oe1Z* z>FX57+MD?%__UqNtMAhLeyl*U3GAqTrCNC+cIA46PwNFlh)|&I9QO1q`Xs4E7Jv++ zhGsz?mc1m+HE#5I%cI}BzqQwdvl$e^&4$;PBEgwleG{t=n~+8Y#ERti0gIn`pvs8% zI-3c-_BEY_26P+m{D`G>FF<~9!AJI6aC+c=^n--me$#HMn?r(_%8TL6u-!e=5ta<D zJ&%Tjd02up=iw|_pOc5Rh(NH9Rn+5+KeIG2g^SzV@fL>r2@bMZff!xsX@LQkA9g(h z|C$^QJzM3ZYtlQ9!<irfxBWca)5(?RMwR2fc}+)iVB;nl#D526+kaE#M2E%aMjdv& z<EH%2k#D}C`5}66>qf%8f}|GxS%WlnBEsO)g9r&%bXYEk_zQJW{Zcs-y+0y!AW=~@ zuq=w8=H?r5gG!vLG<gdASa3Qqbm%Gf-NS%oV!|e;uxj(XD4-uyOA_WBU8O8JBcl3A zCa*9wnpRk|vJ$*n#Hf9klleYrb<bj$a?A7V=*1Wa@~+pi99p`=jgxp*+84tbqNIMy zJV=Jpl!h%ItP<eX)T<ic-AlM$)9>Q56c>x8B#-pykzP8UXaAv>p<8L?5@s-7pL9F9 z@xk%Fhp={~Bs{*raWrZ1lk=rbU^iV?-8y)!Rd8vG(#Gn$88gXi`Vz^5!lyO8H<o4D z!GW%pG7`UYpAGvLERMxfuKl-(?*W!6>#wl}*`^}&|2@r+D`Jt}K@j(HYP-rKZ(X$* zUWSc8f&hV)2^!aUwlx$BHs)pNW+xTC9pnYAM}_uan!xUuQV;*QF#H5I4YyYZC07_} znk2Lfq3hx%wvczNs25sPFy0*t<Uv8o@b}ysES54$Sg;)}QT7j3Aj<2M@dC%yh#|R! z6)+lO%H%b~%zm2D3dy`hu0rW#>UA_@c;VW$!fywAziThNke8@LtjjSd$!Un83PGxG zF&6n?)@jJALh=}1xo;rR_Hr-Xww^CYj+kKcI=dp^xIzxhXZ!L~6=q0TmD-KHH1IKV zeQCzMlBM-@b}gh&g<<VUzTFX9opKyEo&ghfxDpDO4k#tC?7Rd=KfEC!Prvf1EaGx8 zNAyFGoTT<}5?uB@s37&&U}7>(WRuJq$mNEq#&AE)yEFEoqLm=L+bg)(tc!xSneP#g z)lblwe`exlG6k6#_n+qJGDMdbg1AYJr-bsax@<~$S+5E%Jgl-cv0PLx(1f{bPKGzW z`hH7d@o~u4;IZ0+6htt+1fm@n-+o<9Cc1ddIM3I;C=*ZlyjspE-O_HVHPjrhSn`a$ zIy-UUDBY{|XMeEHPRW8X1$k^%O3xcTu3^yEIg=s4Q730YD>|1HvjWU2*QI@&<BdH7 zQkp?%B3$)gRI7^5^<V^Wp-IJfqq8{9$XmH|tigIfR|!<3p9w)KOW*Z<#W)Z|&~3dl z*Ac7!bTJR)IM-rEfp2tv+LSawOtPChR3;)w@xgep&D&c~IvH#>#>J2^>}t=#e1zVJ zNcVDyYVz|XfBunj)ykX77#PnK@jcb8MTC3I_)H!76o~fP@ivKFN&Ez*-;|68X$su# zye94~Un_L-bO)@wEH1_m%i+8&DVgJZe$#Aj>4huFK9})&i(AlmXBc~Ai)ZB89Qar7 zF4l!3Hoi0$!YFAml%~dR>yE=INXlU{WQ0?Xo#t-b+AtP|>Sx<tiy>d<1eCfM$TF=% zl8vgJ#&u8EDyTgtp<UrOH%9{u5tz@lPdhfe<RUe!1bex41vl-2cUbWv?3`q_(7hiP zAFj!K`9@1SYezrfcyMulPDlQbI`hUak;`=7YFz{t^W^9@9pH8J5!eD%L}K_G<FkR| za%)STWuK)kZTCPVL|wva1SBb#6e`kz@a_m-O0N&opD0Al9kQmM%Dm{D<iJaEx-p6& zw3-O)RzG?n;)$;ue`P`3sLkM9d$_=m((KYV)qwjq*IZs@Rx^M`{HwX!WGvHbx!?;Q zj*^4K4K~|+R0;cQkJs~)h-elZRS*>T5yT*rJU_cq+LsrjfGa3hK|FQ<*7TI$c0ReK z)<;`VOdY`JTBOzT+Lmath*|L70)k|5nntMm_$~jz6t`JNjM;wO50o>y!#YhwGtX0e zKmPGBU%Pk<DsXKsH!m&TIdCsWzp{XwPun2wwvlN>==>NVUq_x>g`5<&Sx;B~Hk4mO ztilXmtkgpyQOYu+P6(#!Z)U#G7HoO*owFE)k(KXh`~lhM$m(z|yig9rlY}QGiY5Y> zKqhVI4@0$1fL17Wms{_&_3XPhx*y?ba%E^D#hIS7EV7&WtgiN^)UqthAnrK54W|{k zUf_}o{wGzYt#}Kr@0k-9Dp6mrg=TC>iBfFr6|Di&vFnAjj=Ft-@ka43EY+WD%~#D+ zg-j=QZXxYr^8HectFk1CfO9BYx!|j=z&%<pF9$4q;y7z`i``R0)Yf^1<oT`MAdiO~ z2&Tq6^Tl)@-Pqv;ByW9zPR@hLlgTkFPf9+)#=ha2Bp7;GR12)PbuF)!ImyRT^Szr* zSyW)4OwiIaVjN#*zv!}gZ=s(4qkQ}RF5fsvO{u?6p#S>Ox1fvi9Uem9%aD4X!)`c# z0MYR!i*~^2^rbSjJ2k#Q=L8C!m7-tEe@EIeD)U3+S7`wE2PQWdQ9A-`sTrlk;QIXT zN4xb=bNVi#)G`zIp)z0#DnV1F=?O<Mlc4fULWSEuPyRslGYVUy_e>1hI(w(W<r!_< zJ55#(W)AxYD1@MoHjZ7_U&_mjP{52<^adl!0l=<9q>qx1^yQqvS#Zp_!+|P>a*Cb& zY$h}@OJOE!B#3Td!IQ_iVsNk#pJ7oV9ua5kb^5&m>XG8HKlTl5s^YRh+V63uypFkO zl|4SZZ(v%EpgT(JP7;Y^nW_Odw*8oyR2~u5B5TA;Q^ubGms;{?nuFAolmg4F#spZ- zT0(A^4doQFnEEO>A1`O4t-PG6sLU|?>w)7^J?43ijJOTczP$TQ2+27-U%~dL5Mz(M zPayiVBjy8$G=}W0(3ACI;|jEcLD0JN#0RoBA8*_aN?|@@gKrq|xa^RU`3v(?#gmX5 z=S5V04=#Mk606k-kXmIvqaf=^UCgv4JB~@-*FuvtfWI>DlrOZMAreB6W<9}M;!i=+ z3o_#^f~|6O3RCscT(?0pl7tgYdBV9@XkgDAT%t@jFj~Nv|DrDyzMmPnesvZgLeUIT zyxF%hu#YG#uYC2ZjPhRHD4az`3hKG*2aXWKple!R#@UUr#gu-)4?;LoVUbt)v}s#Z zVX|$~n++tFX0gYDK)6|Q@N5!N<@Rmg=?JPIx`)QS5}T50Q64`+kgQ*SC@t;|_7!1O zgBYi#mGMImYg>93?)s7a`n?dS*;om?xtok2TSQAq(p8x{s&s|xm|h$S?EPAsh9jl3 z6Nf+6ckq$h)Gv}P7`_(JNN;*WN?wu<J1MjrlVt+{5#<m<%cz%jk?iYc<qhffJ-v$M z$VWPC6Fzv85$z8pFV~lqRG_dWk<}IDh@kIIn$ue1cY+B!_N|AsH7sR>egdO39f!gB z=>dUTfz!yz-iUGN7tUy*>t_C~#Z21(Y3S%q6kMlbc7f1}l$3j(pE}JH7uIdxstq@C z8D&yp9e@Yc9*ml{>mqq~LpBNxK0n@XWI}TEa*Is7E|sDXBwW6LF0SA3wcS|nPxqUU zjMrVQOzB8g+q!~dP<YW=<5tR$Dd|r+L;2jSz&E1e5J@JU`m3|V-e&M(BAR{g?ZCaS zd{7sGi77DTD=PqwQ}0?sDfz?liKTY$ECWOZ9!VqAnd<iQ3O-1ngTY{LaFjs0!RKln zYI@RaP~PnKz8|i0E*R{UpPXSfNso6OyH$mPF75_s=|=q~Z|<}FH+4JvZWr3h27Oe` zp53={^tHH4CrizGBRR2JVyc?bM_62z?Rk?Wy(DkIg{UEKpuhA)anFw=Ufl5&-+Hg8 zkU(Jd&%L^{IF-a~r;{z@{dfS*RpGoBaY}VR8NjWsKj_&%c7yimv)09oHCPtZ-=h(^ zUjGupl8{|$zW1#9+>6-lqiIM+yn%f>ou>i>Dolt-q<nO-O0giibuJatz0Z$`5`TAk zZI-Rnvm;MF3T_X7q$d;ajF^koxEKrB(wM7D)Tz!h>&_>Ywb?Y5<V4lXC#WS<dR)vG zcffj9&uRAwq;%2Py{+N($39k%Psz+*5X<%jVmNOJ(eSAX!&EnG*_Pt8wSA#iLl1bD zTnnmYx@xrMWSuSK8egP}@Xfrb8=2qV^Z226y@n_(Ts(T`TYlwUOwHa(d%SU2Omv!J zLs)R}3e_pR%^J+23pT{(vH92QhP)d*fiFRy<acB7_d7Gpd#eFG`zN)^AZi*4)<xWP z+X6#F59$m6*1e2*%xLL)Ar~xV)~#VroE_d%mLQdUBz9Ie%Z}38KiU4_?TNr$d$E{| z9y>AosOhY7!uwU|`=)zJp0TL&n{b8U%kpfYY9*M&)%b2Z{d7~8>W>&j($(kb0tYyP zXQ}Kq^+y#h%-`GYxaNk%uN~d4EEpVbhauJGo%?!LuU5tiUCaO+EYJQYqxwCtcKl{G zID^t$|E`1hFLCnM$>1Z-WyXv<0@XgS)zfKa8*^3Ph>LW(%z9(m5@-9Bmq=7N{GNYD zV}aCMK|NZTmj9<W7yLnHmHjT46MEN&;F^a>+)Z)gf>hJaer4JKA!xwIfvK|4VP`fy zt$tT>&3M1+^2~^ruCoI;N=7N%nGv)-(s0O&sn1}k*WPpVg$Cow=_^#sTQ%BtU<=Tx zS1W#4vRT0ev|pkWFs7@ekzmJYmkS2NU};majj={rnG4eU>;{v8a{BNGFztQ5Zs41K z^UyuTp;s(!6pxIkT@(UtjuK`y21_*40Fxg{J3u&g2&sN%xIE`a2=mA1S*3JSnnp>g zQNMy!U?m2&rU<sXwCe^F@Ijca#oi7(i<CKo09r$CFs{I`mgb5*@VW`dF_PQH5-WFD zEVXLWqw&VVyBDc%z+%(Cg)Wycd@p24K@@LzQe@&Ae!RDe9}FGk5K%ML1OVS|%QbvG z(&}?FWpZo_$~nXMlQ%*QM+^F2skt$GZo?v&Tj{nP0dHMK(pt8Gys0CA5>YyqDaWB8 z$6+#k-bU;9Nh9gTnlw>{FrI*^X=AE@SqU?xMljQe{?(m%dP^|Ga7b)Rn8YY#AXO0P ziF!AuqzP0HRfHHQE~LY<C9V4(uqJ}~#1_YcXK68z;I-l+TwjR=KacHkhrUv0sk1{U zNq`!#!B7Rs=C}3s0w_}}fn^~xWx)jK_OFfgC$5Xp^$)(Bs44Hbgc85KSCFW7j071m zSFSe}wVL@td5s$k0twwDB(n|-e4#{%6Bd1Pq&VWRI3>FS7t~?Co%oMgch_b@kwD|% z>6A<--bwy?XP@U%&%dY%XX;0d(u==-iz>H7=e3QRGZ-`Bd12No`33QC^lreom9SwX zx8(8^W*UNo+sBwZGMMCfdW9fqp2s2HqbVxaOL~GAr7A>~@}MH^XDf!>n<)D{XAI+( zj|L0UJeEV_whu+I*XbT*Ey6hm_$3#VW2o-59g#c8ZJ{+AEgPL=c2d<;R~SUB^FVJx zEG*n8Yt%+J4jqdmU*m)lG|onf+w@q{&h<%+Ou<|y$b_3bui5i0lmZUM1;iq(iM4`5 z_+yXWX;*kL)ZILZqrJ**_N!e##Hh}Hcf~RGT{Y&lzxFe6(Y|^04t#|fM0Vvn;5*lz zmstAAtC7+}WOqT|x(HTAnih7KFQbFS%Gl}jiT$WaP-i!YLrd&HRU&%C#d1_kpl-on z5#$RDGRad|C!m{kdK7PCfOmtPx2Yk7d4}Otn*!I<vfzsi==$6UWpZnWdzQ<l?ST;B zl6sTGKl*w@Yq2sKV;e<cS2zo{j!Hdv^ckSRBj49_nQoN7959fb#B9_SKW!`I(HHK@ zDJ&`Sr`x%-RrIlA?K*IuQhn5YBCJBVv(3_d^8hs|<ZWDn#+mxS4hlS!{a1nSU(fKk zwW|DM3|49l7E3N@mmuci0>MPYYP(60NQpcFy}<1^k_l@y4!v@#z?9)`BfESfHJI>B zBH>ZioLcW`NMEfb*fmhMsA9RDes8iLXr)9=W#OxH=tup$MN?u_FTe7h(u^QZCR@D} ztiVabUe@nypnJMR@VYVrLd_zM)+=7M-bx~+qYk7M%H#83@c3p<;K-S}CSJwguQ^vY zl+ily?X)Bmc3MMdKUGhR!Z_O`TT?nk&qmr<Y}9jfPLBjRfA_(#;T1kBN13~x&&N;o zoT6Xt2xOza4Ur6KOP?*>I6~}Fp%*CaE*A>{nL^@h+-!*^R^Q_YnTQ)@n)@gBzVa0z zr*u6}=S5<x5#d9*`pCL3xy31MMU_+U7&%Vp_&>o;S$seCtHS6>r1cD9Ci<2rcTYm9 zh3_u<S{Bwm#7k_9okksv7z=ju7eDNb=eCImCCGiJt#&NE6*jg>*)$#p%KyH5T+)bz z)$?1kpX}=vhxeGv-b7Cco~K$~1Iq_3if(@`?x5n!J^<8Jc;l4iKarw;ohbGxu1Ih8 zxSjp!1)wlvXwGZ&jgR4HVA$OAeP;P2`~7;My`oQrV9)Fg0Pyp2f!0GwL!wfH`V~cI zzm|fg1j_ev8`VpwQI7V@8!G_~r?4T+a-Bega$3%NKV>dc+?SC)qgh-y4)aD5I>-u3 z`9#`5be2Zld-21CbG}PvdCV_pg`_<N3VRE+WZHi2b2(X(c$ozGqE4#-w(7RBe;r&` zKa3o|e~%l-&fpfv$pFIytJ<7Jc8Yn4#Bd4miLY!894)+hW3?+1;y&Rxg0_lf+O0d7 ztc^Q-lBq<f)`rF0+jDD)a)ce<=K)AVlIKaEIh>8G{HSs0Eqc*+p{-JZA6zu>!XG6I zj6R~I_SRNuxspvh#tTHx*4Nddfa`G6@Iv{B(M=M3Z3Fw8!F^1me$#JaqN5e-48TsV z`*w%z=VpWGdeSj2ZG#Nks4bs9_W0M8`~Vd)8NowGl*_g~iAkS092V^;9B0BqqRv&a zw#i84$}E9tuXkC%Hrl3fEU)jSJdP>3?HB3mWEAZ@#c$Lg*GzU#52ggi=qd4Sm4L^b z{Iv$Y`nQTiuh13wbRhiO*XoZ8l$DfbHI$$p0&MHkyHlmO^PCQJaOD!tR|^~0q<v;{ zwKGYIaj4m%>1o&pplp+fS>2lT3N(+8`CNN6DYdPfb=%etYv?UZ5r)OvSr@BS3PL>) zPE6MbsF0)qTHWVKk>V?mU>*~amL}b6i($aYZ2S+q6R3vV{VNuLRP3#UNw1|{#c8nW z3vhP1VwB;1<=YHs{Vh7`0VELvjj%A8XX3I~KQOph227HpVw(kzn(gEpR&uPJ(O1tf z4~E1k?IN4l=Tw&AgQRJrQ1xUTS$E`FAi*E*CQV&@#6@#vqg7Cru4OPf+4N-tfBj;< ztKNjYp@0etW}4w3qh%|S*sQ~6UMqe>NmEp1xnWLDRKk&+>iWLJc1qHhq&uF<maeY- z(xTfB-&Ljavp#b-!jCei{aUaj7Z2M=p2K7MTDb!qr~H_S^D3zjvH*Ukg6l<Yv*B{s zJDKodgSA=F?Coc?mJ+dI@e6F)qQhH3M{f8fG_$R2Oh>%BMPJNuoZ!8pvjj<(>2;sW zVCQ1*gH5(WL%{VU)sL$c1rjYLKhm@a&2l+H(z)@$BrMLqYWXK~x%fZ~CSh0}OEZ{m zF{8QE^V%tctM~YZrYV38%`*m<-OCu?Ak2mbgvIRzxU}D6`V`ISN4`lKIEjDGbm?g2 zT1bV4NKP*17L6B1L+m<M^*@0{<qM|0Z)B7@z)srhF#23?dmVTR-AR;@=Tnu<3llHb z7+#_M=v|HQ?RJyz>+d2J)%*kfAM=7q;n*dOdg~XX3441|g~k34Nj@8kj3rD^dfa{a zz}R)dy*_-e-_PSKR`25qz6FIJkcVT&btX6TWDY;p5KY?MSjRDxA?rhIjB;u1dkn*- zjTjhKVm2n`bmduav<dx%D%nam3cPNu-_Wv#7U(Uuzn0H)+Y0cx9>79s)wRI0VDuu3 zKrr#qRtz}>$?{L%An;!5X_ug#+7h!>gCbtMrzFXHhqK{zcjbU6xFxCk^o@wTP08w) zqf$`xA6MBjyR2;meF}E5XxiZj-JZfGu2fjUG{TIk-tE<Pl;eNn(5B*}TRvaIUpN+# zS@V2WTk-8EkBB1H?QGL0*a6p0H4s9_@Z~O<l(iva*^Q>bz3Z+g)eUl}j#OinL&dD6 z7aHcPKs*x|Bn1F2i>Voc4udqVgNcI&hx2#ts0{PbNwz9wtVZ4D?bvv+i|=}N8|<Ht zA2inXsNvljji)EzPxPDEA)S6@ce}S9->mh`JCofQdcMRRJ!|9aK{2ELS*gkb;+cTg zG#C1}(aVZS|E%t0zm=4#-r2nW_|*T+UO}!{$TJavHCabLNyQkxkjG1z8d4~0u<kmP z4m6Uz!OdqEVu3Tr8fHv3@CWL`W2^jAuf88L<m;AveSanGRkB?REyH#JH5?a72~=i; zSrC8SRz4$6C4Cy-3iT-Aj}=+-PlR8q;6$2k!yC3`>0!dbt31FQEOoYaf9O%5w9Kv? zP*b8Zvxw(+9V~Tl$oSrHL($*ml&bYhdy0Wl%)U}dJVWxGHq|8pn!C8~I)ZguqEcwy z-)1FjPLz=|0E=@O-(w+lcF-(lA9zs-fSmCJK9?Ml8s<1y%4FQZO=%ac0T9s9QYLXT zOrL~6ZdXD0srk*<(Bk!&fN2@ar%N-YB(~O#r$lODC$o_<bE}2Q1MKP#-phEUc8nhv zyc0~C2Hd{Y^?<ud<}%%+b9dv*)a`GUJSV)1C07~sk-%4={nIFRoIFvkO-J2Qttbxl zIf!?StAJ~j6Z=8e2x;%F`X&GbM_2qcZuE<Z!+v)CZyMxnk}L;}*!%}FWC1g!wlnu0 zBY6IJnorZ4hd0)rZlh<<hk`IUu@3(H_DOBM;bzRSSMA(A5*h$9WEU|9M**<6?DR#d zi}=X{xHz!=c@V*n@{Ws`IM2we{WyWR{S&LQr#X_)KCA_`@vQun8X!chBw_ZB2h=1F zXBHz8yQSBZ&4EQ;GVX?4NAO0C@8Nj|XPW=WO{8G3)2Q-7Uz&}eXwbXVHf?30N<PI) z7B<sge6VZxOz=s3qXRrf3Q_{wF^N(-6IKG<Kk8;0f-ezK-QeQ_?rDK852Qos+8wS3 zM>|tr4o$i_+%p$0cCchuEhH}tTbqRx4~x=o*-5v$&`|vhz@@q|*5tZhcew}mp(FtD z15d-ReRLz4(ym&NgI+}f=?#;muh6xSoBm%sPgA3TVSm@&$N@oY1;10wx(mY>n&&(Z zWT{$_g-jIp`{DZ%6(q>bQNo%=`}~Jv=e`U{2@?C9$(y!$OoDg$uckAOm{cCZv)$IU zb`9RgD$M92(`xBo&YoRgWEiTdyiDr6j=Fs%x7N@)a2jk3imXa*Shhtn+H6YD+<ghD z3iJsJ^u^=>&ZN0w@O=JkO~q!nPL{llVgljDmvn6l@T774Q{kbb?ErPr?v>iSohb1l zRdQ$7fwab%9>(YOvF~(vE&_ed_ojRCnB%^Iy+^;M|CevuRTTDH?3A4q`RKU|lK|tQ z*|zE*on0Ttv^6|Jz5*?1O8fpb=9=#!3e!mhq|QOiiIYx!R~Hni^$tepFclKkapHmF z0REcl$Zl5FwbO(%B6mLzmN&AMczVv(mM9E2l@os>D)9_f`#~MSOs8g@`=~I&C0B!Q ztN~s-j<8$`VCv_r-LPJJjLHR?{(wU{`RVWjec^ZOwYw#u^Hj0Xn8h^D=*qyl*q`Pc zr9_@hH>CI+mt9jkCdcl3p7+2A81AyMJl@HSjA4j3Htpy=INvmJJHKfXr4Xbr(-E89 z`T456*UodQC=N!qHD)fOj4BsxB#wZ|IPv3v11)yEAm)w=(oN7VZ!$J&#mE%~ZNyUd zvj-Ck=zToDGxkw0W-rt05629QW1ZcPnXj{aOP)%NOp99GTP?BAx{fH5E&KAF6GJeS zxz6aQZs(5FK6{LKO7E7hQMM|1@A9hO6e<R&xJ+bTKmMzS*+n^I`%U&Ii<-a6{l_-M zzhEO#o)`N&wLK6fWDTR_ba;arSzws`2nD=Tk5)T@O<ljeU&-!zOPCt4^Kf5UU8#qo zW|*BvO9ScAc_v*T9~4Nw8iWovL+yu+=-X_8ro0WcXObknWtGQ6P{K_R6U<}UTCx)> zC=9GnL_1$@?i*4suD?syqP8NT4G<WPs)dg}z^=xmM-;zAzIQ#8RT9G#zd}W;hrI`% z9GH6N!~b?M_^Y|5W>cBG8IV&6cX8pGK-lnt$_Azev(L>sBD!Bu!=u@^Sn-@T+~eq6 zUqV7}1?#EB^A`K}H=d`O2#TA#U@8qB_TckL@_{sCJlYud(7Yz5_2M#1r<xw$>-Pvj z#={t)Fw<7`g|TFXgxwDXYM~WwG)MI-pmf46>@##oGTV)kCn`n@z}lm5>DwPvPEDfC zQ&^)#mJY#eUzSK2Ek(k{TIv1z+Cw_L+1g_mN=%MCLWp?tY>_PB)ICa-2+JDAp;1xg z4-Bq?XufV`*ye<V<*oJe>cwI;Jr=-g-03aK@gN*Cr4_NZDz%8Y`+kMrH=KF-H88B( z{t?ROUrCH%6(nS><rj#{V0vU7<v}Iw32Rdb`5H3K@HT9zU^SSORefQ>BEh^W3M(S$ zQ*lM{{kqwn)!B&U9u7i%*iEIUhA_J;TXgKh)nGw8Q$4E#5tk53P;uM&@Y13%c|3#; z^r1Hy`K-ZEtQ5Y&vE#0qbd5IgOSB<FtB3YgWU{nJjr*|$g&Zw{Z31MEYI3M2T#EMK zQphL<%51-a>$sT8ar@8gJEnxdqLX#Rz#*T#m$}O+lmdwg+hIyI_B^`jyH<3ABdl^x z-Kq<~(5xUJLs{^T3-M800+Aw#<Y`2{F48*c^ybd=GnYa$x&6iuNRBqebmJV(eKX?b zz<T;<QvP8?&B&QT-zPCu@(9NhJM@FuWA_0?N;DMvKqAe3ySO9y&}kG4BW!f#0a&fa z2n6XEQB!fmx3c0vjaN{6_jbs9S7vne!t*c^<2r<l(vrY>jKZt$qficEoKEo9d^8=O zA)ll%MYr)w!SovaU#5Cb*WYV@6db|!Uk9|>eQJ3kUZc8%C-Z_bv;~_k?~eAO`eLpF zY3F*4LRl<3FZ;dcmphK;9%<f9#LjO2Tu2Z>MVXRGNV+8;ud>?(QJ;lX^5G7=9eYH{ zXT;JhgBR_6KHC(OWg@OjXII6p$jrUG!y&<SU%Z0vuI!Jg+zmcDuIRl?o)y?gQ#k2I zde|vRd`szwvBx70&F*73c8XeF?cRb!GvA^rVuDnVp8aOV&!3UX?MpTdp%USbD+=Y2 zf^%Vl=*0N<Yf+vYQ0|Cuh5G`l)083uJ7gR5n+=OZN$Z#biOpD`V+m-U=wB7L7|QW+ zE=>#~jClz*DqpwXIa<y(&ScrG%Ba0-GpXJdk;t^!cwnNdW#CID+I;!U5=+W@ISrCp zM(lbrz&9qobQIt})#Mk{x!HKeAhaelV#FMtM8}-jK*Pf-O;0_{xk^bCWy-oFj@8OO zb{gg>*PG^@ft)w@lBr1qka=vK;99-^fU0>NtnWp&M~dd6vs@(bfpIuKp04cw)g=<s zzxyZd8}gf0<cvsscI$7easN{GKHz?21d#AgUO_w+@5AXP>nLY!0|7pC0io5_R_wr} zrM&*Ik<_e-`{;)UO8V^v^mCA*(yXv@ZXh>>7DeJL^J6pSWHSiC){?T|n2rxS6eE4# zUFIj93-aL(rrLOnm;GEk?m%$!ATQnao^GWjyA~2cn}@$^_Z}8ZmWO`ICVXX+BrqJ- zqZ?Hk{{HM`sg^OB$1?Dm?9>y)-pfnp<WGRJmI$EwE2E+p#WL=Md`Y+~FvY7^(n6LH z<uUR-8Y1bipsrW;lDT`nsF^4pu!Up7!GAF2aXbXhn@m;7E(?iq-q<l=`oRB|8!&u! zkIe-~+Su`{6*NbqASeH!`kJkQ=VD1N3)BR0%|CUfS$?cgrNF+Ud3W>Mr_c`brz6wl zDwCdWkk$$%jt+^9OWLBw3GKA6PXNUyFeY!=F<$L3e|nI~xW6`m(NweV>QXRqV(dbl zFN8RqvuaZ%RyANY^h253fvI_U#rjz3izM|dMuq2eWwT`0>oE>_r`+@)&Fss#dQ5^7 zkSF1m9I@;ymG((PMcBVXvE*bmKkJodc?X}4y<oN{oC8v9ftt|%yNSj){-yKS6G1bZ ze|CIqH#hhRYC&EhfqWpoYPhrZB_k^D9|fy`X6?qurO*{?OmMk*+Tf9fdt*E2Mb9kZ zV&=hQsPyE^Ae2-b4lx58P`lWE{{|$z4h@zzX5A0yR}FqtYS@M;l1G%cEe8{C_g<rX z9n#LmSZtC7T=n)PWMcAEGi>`uFNCCd7l?K&0C>BAq?d(hgw+oNLb(aX=9H`FVm9^< z-GPc{fyN=!W7$t_v|%5$dV8!Rl=xWGc(#uIb<%&Up2L0Q8R_n5OVw?W$<Z#7KDE(; zgJ*;$dF!wHdO}jwsy6}s|J3u4ncI)4ZL8LJI+WJ-d<SrXP3kAGD5Ut=2l=fS7a$O` zbf^zy>j5vS!G)sHGLm3kbg}5Up<HL0q)SW~tw`^NpLO8<WJ^24&h{K=>CI;1k!XNi zj5UOPdibf+Jc(1+xJ}(={nRkFVaX)`LSVlM)snQ@EZk_^G|?;NczeADh!3{E$RD6A z+b04qE%w-lmWyq*4BLO};8anSCy#h?EctDu?zy?%?Q$%3Uj7FxSaF{V8VueujETOv zi=^r%SyBcTw-{fN3Eow^Vmc3X2TgA4dd~^$>Vs6AJP?mY=@cc}2|J*)X;&B~md-8k za~fB`$PE+ot4g{p<en|KiprQ$Js&>Em41r&ZD!F^k+N2!jHQ(xi>K{8?XA<J=6v=> z!u1wfr{*<R^?{eun43I7$*cKW4vhkR1~Loiwfe*Gd7T(NoJLW(UNxsl$E2Y=N81+s zo1Jkyti&?*jf5TmLhU@>qdf_{ew$VMFksO*j(V`vsJ%&+?fRL;@Pb*X((M*SU}DSm znA6RZd8QJ;-DbnxW6^RNg=!-^8d=M;^CI#rp3PAq|7-V3s@Q7N2Kd^KZs`6T#T;g8 z&7lXNWPzNCTQO2;^I#t&WtQDFh2tk1-s0|_&usNC{tKb~*TwB$<&1>xmwTS5C}QQW zoB97X4}+08O8S?@r3TELyiI<B3HifsUq%znE%FDhKCr8OqtkXcNmKE5fY?KZdN0RN zYCRW6XYid1dN*iXACehKix0P=d_|551beOROS7G02#=R)^shP%By?=h$+B<1lJ*Ds zh;nt(58A2|Y0_41hF|5pBWB^(u&Nx#xmRo@#)r!6BZdkT0L?^Y77y(3xqAgEF?_Vh zTz%gnlqSIAxSz-)#*fPZo-WULO-QvPKtn={G+?CAn2$-!?55RwFJ|r0o_0Op;gGaP z!~mQbMD$#yww(4=PJzpClg!Yo5s-TtkK*{;pYEF%0bz?Bi|C72qqrXjA&4PszYk#| zuAZZ72f4s}Zu=+PiHV6bVXejOPl{w_{BO)x%|?_a7NxosG_FmCJ6Puo<!CpP_4NPh z?U<g5SbQ6bdOQqn@rG^Vxd-!YrYE?5Y~stk5W4#F)>QJ4uSRJ*eT}k!M|wd&<!Tws zUW1GvGoB^8e}g%X<rx@c*$8V&q5IRI*Xg3QAwWEd!;0$WzhW<5f}Ocfwv{k5%sy(` z{{eHy{iHq2+531{-^LF`QX}&gRLe2p2Hzi=0xa&TC5p74%(`X?NLLly+<^mLw4-b1 zTQ26=^9C)kd2+FZ1PW4VQtWfbLsK8e)!~jWK75!&e=|VK#~amKmw41Y{?bE%#~d<k zO);yx7{jD6<7}B6aoBPR?G67bMh1%jZ$HmOtudb6H-(uG7yVqUUMvvEwu1@UG-Oi0 z(z=+>lS=5-TXqZI2XE9nnG6}c+_}}-TFQg?WWIzF$l~pBGtv7kG5n{R@j^LE8cidX zM`ggk+L8rC+V*YKFG?&`#|rEBUx|jYkr!7C*6(w=^0I3m0{Qs6flTEfWNWCz&nv{6 zV&5*PsZggA6Otvnp3e66B4}Gp;V&m>lV+tEmsZOb*3&qyM{O}r?Tq-Il_iYZHi!Fm zcLT;OS3Qj(t%$;=`%rw`by2;8TfxL?qI|^IOkkLSgH@WED^n?8KYg%IQbQae`KZoc za5TwKt)QBBuGDSBI`OVW$!+7}Z(!-3IlqjH>Hd6InihjwSz&d&p1GN)aR^y_T|)?o zu66aEQm&JV;n8-eHpl11_(_s|b}FaSDY!Ouz+kb5TyU1il)WF_!^YI^R3T-Kv*^7m zA9AkKHbtaJ%*Ut6Co05FNH<o=!Q>7o8%IO(jKznWY}OQDpuBCVNaEjXQAbSNNc3V6 z27@c(=1y71cCF~fom^|<F?+L5(Cqzhqsd8cD7a}DxCI?D-B0&kQj3_^RV#-`Dsz?+ z&3w^hZFk9aT%G-BS&0uz@93PY+$<HoUyFc$8q}koE3^=t`$UN&9{tEN2C`O}#w<{p z+A9d#%O<o)VK=N|vmdutuO#y2Jn?1l+RzQDcqG;s^%Dcui{7uIzvVDXIBqblYua#M zEMrinb{(T1mw0MlW#dwT(LZbgo!o6bnYy`;Z(X!Il5FaD8qc=%zvi$B8kH=TjyGs# zJJfwZN`MVvJCC2d!WX>$K1-&@-!@$@D>702-oUssKJ<56r2lSR{B;$BsUFuk`0L2~ zC5axKIUUJ6D)vPdfgue;>46LZaNxUvDk7$qhWzxSyH<{le1X*6g-U{5eC{A3M)Gz! z*N+SW<om$l;9f6P-b|42Yse(kTX|(hRH+tiWnabWVg#|vW0Mb%08+5ywJ`j%b(*a- zqwk6s^0@{zrc80Y&2i7FwwyL-w$`;Rp!?L8PDe?``s(q^TKkbyM9vt;*vP7y7@QiZ zMMQgCyKhx{?Ax{vs8Mm$TNj}4wWx8+ZecMrZ=#gq1DIZ3ulVY1wIxM#<j1Skm4~DO zz_^AWecl*Y(kLd-VUZ03jHqm^II0z3GLr{^cn5|h4@wkFu%J(yffarikTa1+L}CY* zFnIz)mb=Wr_xt^OerQd{^l>8lx_1lyLwej82ye7V`ym^NudT52&*z~jgfAOZY<Jp} z8DZ>)QT^C@EbI*0qAJ~^7~?g)mTfunR_=nT&KTP`9(|4r{nKNT?w+11Dzl$yOc0Zs z)*!>|@BmDv3jT<WVk6%_Y8zckF+b8enM!;{gY%+|J*in%v80sh(Cg-puMOP9x<_HI znF3}==4g+5#cZX-m}u%*6H;=g>HhN707Qh*H~x|dV6Z6SySv(k#3!6|+cc~_XT4;k zV0$#LGfGfB=@3TQ2&BH~+ZofZ>-UC}_9bOML>bcS$qEXJ;2LFlL-9Y>U8r;K@d!pW zGuXN9R*joqb1e1A_RFCL3M|qzEHzjpPGagOK(rEE-gZZ82xtCo;1Ue_g_@48?bvq# zJ@89o3ONB8M^U8Lw(4-Pyi1+<k}!r|zc^yz1IAK(KN5_jMVAxz-f$O`jXX_`1?|F% zzQsq`n(z8#7^wsKh7lYNyz7(owT}ypnhgYXIzIsL2buG%{0{@bi=ds1v!<2t_G4Qm z&WailKv1lH=?t`RW^1GTGsP21$cU6Vz|uP@@}qgRsW31gdS1g991q*Fl|J1SoNH%I z8WSBgw{q(xAD;yEO-*4Y^SwxHSK$(`8ew{6B=dg8xZ9K=a8SHSy^BiXP}}{8O9F%& zEIJ0?<uA6Vw4}zgKr>FCj&wZl$j0c7fhf9zJLsWtD|A)yjk$U!nXm*_aY9<5C|Wl| z$_s1a3z*LETYVB8dYdYV%kk$2X6>CYb`=E1v{mgf!)vdt&?MZ;T=c8cA_$ferqv+l z4wAkY!vlqdv|x=}3Nvd00nn4zaK-|WDq#kT62D5(eJZX;!n<xe6Hd}mTeF_QqeHM^ zW|l8rDGIpnb}!suf3X=LTVft$KUDHTtIyBQWA8t?)nQpkAi(!9;r`%T5J2<W&dO5h zF<|0kkT4e;R*<L}tz%40H;in)HkO2uJc}xK6f_D-Nl{`!=0h2*v72sa%0)K*l)X%o zn+%8zkAf*R0SEKpt_;zWfI!j7PLg)7(|IR(({OON4@KHN%D<r(^w?GvArra?Lf|Ee zsxl9F9!kufkJXYn(}o_LPwS9(#Cg=BqC7f`D#%nn#@tp7WqD|!^-1xQ$B_=|(PK6? zcC!D&+FOQ2{dQ}h3J6GtO1B6oozg8JC8Bgli=^bx(%s#qgdp7=N_Xb~(#+7^=fQXH zv){k_y{>&eoR45I%>179taYzDA|-qoLDWx~nR3>u@B(ks`he4}3jk7i*L4U6U4_;M z`Zxv!I1W=2Pu&J<cOBEv*xlzO68VfY=JuYB=wwZn!<!Uy%NjE-Q^9-LAZ$G%1F{@g zafj9Z@<))yxGw~fQeLuMRmA;6{PQ0>LXl5*7RZ-`1t8zV*V0wQebwJ7$~jSrcQimL zY;jBJmEc5Xic=g-*hwbyOoq^Cp|`*hjuz2@yUhlxVVpy+QYQ;`82yZB$UQP13*XCC zIgT7bVYe;Afc%uq7Md?<)%U+=^lew9%NK{7T&+|D6Rr;1(M!o?Xt_04X!@^)%%6yK z8IhavV7slThZ}+1yRqQM^+xWdI6+iWB7N9e%j9p#ec4*te9>joh1?3O=K(UIJ|b_7 z^bRneLE6hm@d6hs9p!*0X@$$FC4+90mlkBnH?EHd%sh$Q7D?m#m&;MUQB=TC!vx3r z39}YGpv9JxOD&NR>Vdw=59y#%UW!IF6UV0oM9Qd(;T^bys&agY=CKlz_3^@J1(JEw zW}x%*vxX#AK49qtG@B^!5;U;uw`Wo<R@7!9PhPysqX)W*DhU~!XQD-+JQ6f$D3wH^ zM<fLlrCSjtz893WUhp1kpls^`R8@K%cIMvsDcYD0m{J0{qaF&95~Sys0L_ORtA>4J zeqkU);?Y5&)3jlhp4oBsWuBPvdVtQzTl2nP!gxF0e=4f?bDqeM;BTItj?iR6?AF}b z#s}Dw7#r*MliF6N(<|K+)9y7!qLU>QiEK}vh<@%Ao?q&JtOvkDKl9T>+HUVWbj3#0 zA``<&p&r1@B1z=2N+a661wi2F%1X4NpIVM$I<u}jZ)eW+9=bNHsO%E$<Z~**G#0d# z-|pq)?{z$EZR*Xtp|<Fdi3l%EX_INpf@7xA2L++VK#WeC^i>EdE^zo|J5tu8K-#XT z;H>ZXe0?V^e3$p8HH-p<pYkb)h5f{j3ub2CR){q7tC?dcmJP%oi;S}BKJ5O=1SQo* zLZi!z2`DfiRxTBq<02Y_{uKPKS-mqMy9ub%MuPV3{I>IT_DmrL9U+ms&ALX#--e5n zM2o+%%31YNUMnVZzmH?q{#0DLJ)3Uu@M=iL2Vk1Fz5#WWdK%znp-Xp9+ILz5(Q8#G z-&$Z+oK|Bk1!|@GKvwSRDW$*I;mrynk{K{bxGO9Gp<ouO%1Sr>{e3lb$<wg{k<0vB z%+-==cno1MYgBYVn-sZ|kHAZ~`=I~<b=_)rw5DY}a3)f}VyOjKTpyQ>uEYYr!xp7U z%Jf^I^kd%!uII~{JddBp#V1=fK_|LH=mp?Qm$V+9SHP)%Fv**q9j}O**nxc?M{R0Q za)CK+X|NeShDA$4WMk<lK5{(>p>51ruwSy7kTrHS>WQf$yg58wV9&VCD6wcp5>RYI zq!mCD-iNGEF}YvFl%|Vzc3uQ_h)xFU@{6vqBs%Sx@sq1ZoO?G)1egR4xCmT_OVJes zwyCoTX`Ozy0G<XZjXH~UOMVh-tv?3shG1_`$+f>JEh8Uvk8Q?%<=@EhJh-%K?zO0f zK5oh#c3@`<Y_ke=l@huYI11UFslN)+d0Vf*bZ$3;L3C+(p~nJP!I1`-tux^n8kzbJ zyiGSQ9DC)x+x`7(9TLM#7T!*V0!^dcZLP(x<h5gtNEkZ!|H24qZP$DR8tS)o=1<Y` zjRo`+Z$1Xexe8xrR7t>UtD<E(Ik3AIqc-?t?G{ep<MX7?R27?2I8>p8`zmuof9fU2 z??mm>&39D<cFibMXmmj)6*AB6WC+7JZ)^Xmi#QYru2mgYd&K{dB=pxeJrRAsV1qq6 z8>p8N5L|Empzve|BOTsDOF7LVMwJ;&zlIka)7I$`#zdoC9H9x<jz&7EADyZdDmVii zKhkJqSj5p#P{VvL6lzJ7J2fZAALg1eGVVQnvqNlm%peu}(I&2xgR+)Av<z}^57imf zlHW3IHAV@WZIs?SEg9uu{PLHS)v-)%)qx5nY?$&|s2++1C2J@l#YP#1>Ds(a7tW$! zf;}Nc6sVh19E0Zg&rTqLe)OlvfPxKNLFfAM2J$YesnEVKdf&tA0~{I4?k|j|9n9+V zL|J=EQe?D(&POp>lEKc&B~B0l*X>HxcAfC-$O1K@TT1xMu|9)N!%InSWF=Gy-3qYM z@UBwSf9vyEv7=Ja>(M(AofOb(O7S~$6Dz&U>sR}_@bO3IcSOAH_o~_!-G-EM?V8LJ zA+j3Y^Lp*%LFWgxvh<<x^jct^Uw&V&Tr>NTAkA0QPO9d2&<m#gU^HDfE=8g9m1qnJ zy}0^)Ft-0XmLS<B59GFt!i#6oHHL?w^Q`Wq66g>z^E<#%<Ee1%FkQMsIG<n!OIYVh zy_q@bV9uYY+#NT#@uzT)0Q2RGQG4Y^XG{<*B3K~#lakEqDSFvUgn;t-`cqVVY?>H( zWb%;ALGQ;|+Ol3azMzcFDEPXa{NjJYlMYC5dD{{JZKCT)%Y1ifM6W`V90GPcA5Re= zB4bpb+|Sqp3Sy8$bUVNG>yqwI4J&UXF>K7ycl$6WdSdL2jQQ257dSfL*)F+V^}M*0 z_C$C9w?Fztpj$%T>~hlZbIYk%i5Xd?bv^u4BPlNKnRcBW=3uH~tWQAO@Cil3m5z-J zOS3VxA>|EFXRhP2TOpH&FP%^A-h^^Z=MKI<nele6dA2Rg@^i&zT3ivNClGCX!Lhnb zT$j&Qe`JHFL@54rX)PODIBu@?5LKGgw)yJys|F!<L<9oIU26Fx&ZzSR#+Z0rXC`sp zMusd(j;y`@>bVax9ux{mjL|{~DXl7;q5?=yaMnapW-ljoYLDYu<IdnSu-V<$ydW|T z14!>fid)zotYqq)POl+rdjwyduaj4A2H1UjZEDjVIyvJ$=K{97m#q^42Okq9Itlu9 zaGWBJf1B{6oy-0bIIAQJXY9Ia)uH}bF0n3{cGH<1Jub0SNUWR8?WeW?!lu;A709{B z`{yIN1Zs{Gv7EJE7rawKo`3nq{qmScy#f;0C<N%TRIo64I@rjc;?&!u$vh}<?drpT zb4CH#5V9TYdjTLEzx_8i@-<h_mYpiS_8a&<t<17t9<sFCJPn{5QI~v#6=X7W?caog z*{uaSMC}GhzQ8R!7*`(g7NuW+RBx>vro=bwjEng+GSGxPs+D%wK5nDQ!o2Hz9z*7K z*Uh6h)q59AKIdG_c6g>N!!UJ+g<R!n9f4C*f;|AbNbK9q+K&F&Ur0)h{zYXGu|_&G z4_#R0`j6|1zrTrs=1DK1hvzxW6yeIzyZpd<gEdF!Fd*?25khx6loLjc96vH{yG<D? z;=*Wa5TneJl*0Wc>;xw-SYUhB>)NAXb<wk|nO;0YkOwQ)=jJW81!X8UoYf+#N_gzB zSKJtpf1rV+{C?LQ=V8b-ah7%rRsTf{haaY&8lSsSM6JUd=fkR!?Jc(L(9BLgM%zO< znpd?vClmMYPsP@nj;(eMKIv_Es=rkx&<S~DIaLx_@o`wJ%5wfWr9=*j-Lx<Uv0e6Y z!e&%UUZ97Uwwt{!?7r1#PAI$nPt+&p9qTE!Vf)sq{mv&T?5hR^h`UaAl)CTl6-ymN ztj~9wJ$`h)jtF1M=TNzads^1ZT>X_F$M+O2Lq~YDJ*z14B!yMaYoEKG(>%whH?E`L zwYYkzzAxZLPL(vg$rKxDaI%FBpKW9xYGz?Jw6wio3aDfz3i<h?*0!0G96=a!cJCQ* zJ!X6yib5SBvv^F9#&CH`@uB+%b0opBR|U3P#K(en`JWp22}<33{Y7!YwkCd<2ns2t zyc|AqV|%v>Se68kaS1{W;|lYslGdE%bLAo}URhV9()~a>a_s1D-ZLRhH(96D<$OhS zzpA0cw3PZZU$oGvr@^Gg$S{hQebt>V+?<LJS#SpD-4JY3_4+@;(Chk>t0MsOWx7`2 zcL2>wqDdN-OT5@Dy}$nlNRCbwoF8^RO<S$!#={MD7lpiPxzK35a7pB||Nf(00cn~B z`nmmZqs4P_y73qcoFrB;n=I}4v%)uL;w6q*zL3d1-gUdKl4d;);wOQNSYmFu3hU~M zUu$hvt6=0$-TPcp`RohVjd40~wJs@X^alwT-u{f*0LzB(WBr?MI^_q;CVRi7cz=W6 zVMcLt#7K_Wt{;Rx*C!S;EZIxB^)XC5YuGu^Kq$^s3*Vy;;%dd&)(|VB>*!?5#F8%F zE5vAHELx_7NF^I=(3w%3q9YZ)hcF2qbTvG2gbZ~YBSRBQUy0V})I0nb51n|1CPSaf zy^RlBA}XV-V%s6HBs9d1fgJYp^jE@B5=vTAZFhCB*y&hRYHf__CnCrJbO{1Uuw+O? zZjc_@%~n|)jL1g*MA<TYf<jd8X!Wbyaap@~c<nj#xbqly7y7f(w&jc2wkT2!b|~q2 z&aoYKgH~UukoCe(j^G6@w8_U&0n3eXS(sYofKc$Plhih(@yTK$DYQe8Z}X`OlSAX^ zA?u?_jz-ldFydfwQRmYpjQ$RcnrD5f{5&}dJj+Uir_qTV!W`t@CMH9_E;<Cs(+1{C zEM^^G<3e463qL44X0C&9J$^tqZHbj?UXS<K$ln(9-7GNI_B%6!SOkH?vBNc?W`TC= zr0S2)2(+fu7nvOQ$Rbx#fc&ZFTfDY@@oHWIky4HAde}&rz3ueX=o6>y_ga^~UBZI> zTcY?KnQL9T$Q&3sat5Q=vPaWH3nuf712*Din6sCU=~KS%M}~0z*C2{asx4~etv>Hu zY1F?}dC=2KL!CCA;omr4BZH`J+JIHeg(Tx6(P{F6?wqd6dEe|gsOjUNrc>P2bS1|r z@$lXYdl*gM`k+SzhKpfd?7ZtJ*~BR0W4uJi33={;Pg$%N@f&AJX%iB_udnq(;teB` zi_=ZKlwX3Nc8#=N;`#JCaM<4!BgG0F5T9zfk)WRZ*6IkQrj?ETN#K6?GF5hm>>%SB zx?7nlmnNa7RqofkSH^hbATy=4e%N1G@!od2(l&n1e%%e%U&bEh9$D+o$(djo(@E~e z4ySFB=*F|TKE8hNQ_H828ja42Zk;_1W<uz5FVL`v<>{3^d78@(t$N+l>(c~gf>f5= zROq`Zt63`Xou<L7xab?w$d8Tp+Jo|m2L+yb%VxnsY{`x;0$mpSt1+U=R(rZm3sjQ5 zWp(0#P@fKcdAdQecdcwrp!4c%Sy9g%&w?fLe=dnl*1Tu9KJ+2Zfs30}>p6Fmeo1gp z&fj)#i>Q0kz*n-hbd>n7E95`T`uXCNXrOP^_dMHjr=&3@uu<&<IErfLkL8|F4YhE4 z!tyX(@?*6DPW>(C(V=f4Y<5Hm#u&V#&?(K%aic^Y2a7KfKLw5>up@)%A8wv)=9s}1 zon9Ef3CLXM?yHzgn+=@nh?_nCSQl{_oB6`srt1U2$-K?iM5(?LhST6sjVUbH2(v{= znks>_jy6v^%44|<45!Iws{!YFyoVuFgKXr!^14|_b{za(^@Z$JC|T$N<zDdMGZEw~ zZ|oHw2tDQu0gn9!6E5_2!}QTIU?!AOMQ~S(1DY~!+2`d~$tO1tM}+J|RlImKof(d2 z#L4+kMLP{%NS;SO=FaAPtcEc-w)ZAA_WoB%cafAM<U*>xhr-OYq2wi{JHx6tVjSrE za9qc^A}LuMVo`I$4Y2rr_uZ}m(rB3_@YpP2oApFr)QOsHf-E2qmDy96Lvv3B?cf%y zONs1@YtGK6+h6Y8XIr4Xy4V!!h<~6ZX2Urzu~NGB64#}4Yf;iB;&bWR=SG>;%BL?Z zTsmXMZGT&^Xb26nb<Wg7tGtR-t*$f9B~Ej6`Aa(z;gyeIglEf6G>MlI4m-laAr0(> z+xox4$|q|DU2Zu2qv0i{#X4JurRlp-rYyO*zM{-T7cGJ|a;*mNl0~A!D$QNa)0hy# zMIrmnMa{2omJEK-HSacQK1;4Pk49VV?dgtHjM_{ehyk1cbv#RB2|b*#ojMpd?@R;( zt_WcV7oiUr6(GNQ_SR!Q<tDTf5c?cDg-&)nf3Hw=?u-7!cU9W;Xvy%9^ddWUJYRV> zLdkiisSud!Ob}CBmM#ZrD7GbsD4e6Mvg7zFb2U|M55%0TSCn5*)!8T0?k&|m)WKdL zWb5fU&wZ0=(62{y{T0&vd*X1v=kbgFOtIOOJixY#q79Nw+DA_66i^nlk~R${_!f<b zPed^*_YA8{XGnqiF#fxfv|S3AX_bK0$YI(>!kqK8=pzL?*GY_;nVsEq_c?Pc?5U5~ z;SBHVVp3d30v#0LH*VDeM~m67$j`}WhMlZGi}FEXQJTe)y`!sF=zQw9r~~cf&V5V@ zGD#9k6cbh@D_!4$o1=fMX#~Q=zb%i#E8$$r4{l&ix>6OYRpvys$0sB|FebBNUo^!d zJUBo{y|ryhctPn;4FPN{xTaaxAsw!OH(XfJ_OnrRZBxWvuoJy<P7I@VT_2wJXdmeZ zW)aE`Pwc~WmVgb}tYhkse`_cEntr?~Z8+L?`8Hqf0lyJfDY}4?lGn_WX1$kwu0n6M zbNUOeV~0&9UC}5}Y%=YZu29ivc<KU7S+XD(7Jqz@;r?Mge^0MxxQpdnw}X#7<j4Q% zQv2`Qlz&^Xy!97(l*Rh6Cg8jkec&k?jeKnZiM#??97l)9M}N~esuTB&V3As$aQ12@ zRRU9_YAlc#P;VqnlR<`LMH-dUn`qK^)7q5m&>Lx7%M;4SXn>KLcmH+b1LA|=`8vzm z7bbifyep_7;<ZPvjJ0Ob&H?kB7WM3^C@Y$4MA>2Kq^l7$lwq+sOf#RC)l97tll|rK z!ooQ>m&o{1477)a+6y9AGrsH?ODziZhE-u{kvJW$#hMjuT6OzSQhL%~)jKJXq&dmP zagxW#-Rs7IIvL=)V9%jetQLy3gwMsjw`gT<*Z?U@BT-8wP?0Ffd&9OF`<x+_XyG-w z9%ScP4MlqBqoVtCGo%!cQYRIVUr~aQZt4TpkBI4)<(C@7m^mrUw^%pp^(ny4OrvJe z>kw&06e+@Of$T6%{_+|moK&>9P)hS*xZKRqr1z&V?S`ilc9oMhc&Ax4=;gdGr0*m? zU_(IlI-S3yl%I9a^w{^wO?MuE;Ar8hJUCyCl4Xv&@+0)Whc|h3j{YNlLDQ1NFkSuf zv|gw%T;h2L3cJN}2WBYUAn*cs_foD6su!^1h}FcCC1@D-@;B<{(2}{SgN6Zb8|mB< zazt>mc8yw&>y-?$ReNB_U}fq@zAk4f2ClTKxx4Y}=V(s4Ld3aj48+d?Kh?2W2qp5f zLKDZ+&RZ8_h}L^=yw(q#k^7aO=CzWzP0a%jp<zsymbERtZ~#R%NJjMuKtg}nYTLkC zY>&j-cdGsI8m=b@6OD>|^Rd8=$Y(C=m+9ML9qn22nbuZ8E5fL~EXhr%#rz3LqW2T# zx($T$1>Bb~%!TPwjpDv^xzuOag09W6PJ%kNp;K*gH#L_Nid^(*q9^IPF8f`0jo>(4 zwp?SQqxJ(j5b7YJG`zT(dnCfYxp&A{0%pV-<3pL|B>jlM?nR`19K7kl=5-tMy6le` zt~QjeOcsybOU<TpW6uU2hlcBZG<F}u8QB$QKko8Np;T#??wwP3o$x(Ht3MXlI)<FZ ze-UVr#J>!JjAAUm<WGMKlK;b1{PhWl>^ggGKt}#VG;I~-C)HOXI%+9x*Nq2bm7?`I zFSF)i%Y_Waq&}pvtw1*Ci&HK_l>9fZyR8L#G7(+I?2jo;KJXq-W5<+-T<Z(=n0nU@ z_hfflxIL-snB(lZCJuQYZZBeeJYgibmBG|A$Ju+`lYugeF}B~~&KJYxhnb_4PSHas z9#)~b6Yp>=y<sHy(=w?phANyd=5o~(aUXXrTS5;}ti#CI*MB8_Yurp4bhB{T1?c@Y z#I32)-5#J3-e4NJq6!mnh@NGxSrp?1gb5J-8SBuG3&o>-{dyPLXmJv&s>2OEt16)< zg%M+kM`q&>uf3FV)ZmY2Mc9YW`-HA%1SN)Y)B~_Kqx<|4J3Mb1w?UWY?WD27Q#2H^ z)XzFhon($F*YLSoWf1#}Csad|_oHw^N;f#3p6V_O;utp3o9;K3qW<#DvUt5@@RL}) zoMwRM#{&3WJ^cISpv3;R1NHJDR}7*r$|v$Nk|2pS!TQStIhVkY-6;d~nZ}6QgsZa4 z>Ujr>FP!Q4;u_zA*f%;n%dB>V?y!u{+6GZ%QbNn>jrtmr=T4I>C;Zsh3PHvM7vDl1 zmu^E$Y$0mn-i>|Ox)0|%rOz52yS&$$s?`^L3H*%#G*)iTwIG<SU4Z|Cz(T0}Z5k>w ze9%+F<Yh=M$gS=OwpKddu3j(-PD}=OxPJ9pVmcc^@zjh#s%|^J`dQhkV$pP$xsyBN zw*NnRy%zCDI|huq925;hm~UAgR?CTF5%nhKVz9wjx5xFMEPf#r6Fgbg$&A?{r7xt2 zJ=v|&j6(AL1-uF<qQ1_uThU6!a18Q|<)%1U@gC@qZLu4t_8k=p#ppjE4t$bbH0f6W z115x>bx^*s`&4n>4i-uj>>HFdRdWs1bN$&^!g=0hADz0?<DK)wZCGHXj2dvf0QGo> zNE5*++g>UYBK?|dCs9FQzTW17z9}yJ==nP};N@V*pi-De#wdViF<&RCQmn%S95aQE z?hoM_i`-+8o-FqG?zD78acAOrb%>2U*_DxmCkmdz{@@l`!|RLVwQ^?j=<AlW6fQHB zcWqHcORR>x+_)BDw&wno1~ODQyHNS>k)&^U%RiS1)E9jlru^^6@GSM&u>~2L#L`%H z){{SN_RE*J8}_D-`5vDH6Zucgi1ufaQPwFdCO=ax(q47E@202KV9~k!o{LIa^skJZ zcKZh#HUI3;-}>H52T?RB&n3pg{(_t{{;DSc)e)h-qcG@%w?Rrte6)X3GP3PPL9}^~ zLp~u5CtL*JO1o!S%t*rJ>)FRb<NQfIEruMVlXM2hMadeTDkeh(de!_{#*`PB{IL*v za0u)9irjjL{6G2LIK$rhmll|f(g!@5do5Sb1}n97HyYaS(RPcW!Twz^>(n*xEKPIP zO`nTpQR`HU)pI6Fv_&b>!D-NwN5O>c1~9&4|CFz~F_JV$<w9FxDECcI#mSE8&6ip! zm{Utc@c&ux)V=PJOP13Z&L5`Y`IZ~pRABxgc9cEw1RPPB)Vj*m5m}c6U45HwacrUI z!i5VFm7(8{5ragsd=?~NWJ9f=mV;VEzx*+Z7eaj|Tc7ujw<;nVG%z5C(e{Ybbp5a9 z=6_pRzg)Qs|5{Rl6rV5Ntv9P^^9k6xt3#-4?ITZm@?>3x^_9nGa+{J(i0u=N<%slW zs$MG{&}TCr4?WX~JMBq4eIc$L<KnH_Az)E+L7$z%W;7K1ezMXaR036ih}iL043#l4 zrdQvVgO?GsuB+Y%>dbgrfRb2%&5vq%NiUT_ei&0*n(RjoH#*4_{8=c@pC_9rd-P2n z5Q)EPCz^3+Bwf6IguKOV-N;c~`j2NsWP<Wb=Oi3e{nRxVY<v@hE&e3FdKQXO>NYjl zTw@}B1^dstmfxHv-JMUoBaA4W3-kLpsrSF$$<+i;GpR?Oq(Oh)$$?D#uk-(OGJW|G z=g&Kdoy0I2_J8uEt)=f$9H1u1K?HR&7#%e-H?)BSrI(&U0Pr)O(Oh84#@eE(F^X8C zbpZDm5e#A!K?AXHTBZ6C;`}kVE@1z&QK1ysO5>*5MFl}W))xCvQM%xkk3qG*+J;Px zU*7IE&T8IPT&ZQD%~;_3of+%n2Gf;m!wL{uglM0yXafw**uRSQ{YuCa=kF8uH|>Z~ zBH(T?8q*`OOsfk}B4{;RmZl+rX14P_cvEB8tuMjL_(6Iaw`Q$8o9SQg+<!eCp6x`Q z-nZu<puqp|V!RaG-Yu<R_jHoTPWG-3c0F!;Ixv%g6P6_V>arr%iJs~0vdCiMt;^h} zdB<JxGSFVW{N(cv?+1Y+;`cmM(wzS~{C4*@O8z?he*ZfB?9$^A|M+14(`+6jf^Zi( zvI$&rG;vPn2u+1YSd7L_*QiVq%?1N#q+93>cwsfAx<uw8U@K1@x)`dhU7ccDEOY>g zBxmc*3nnxw*=#c3U7NoclN3anu^-iO<FR^ie*Kx`^u=k<REcIdrqU#ncVBT>LGT6T zPwH19GnkfcIoEbmMLancKk03I6LSPt^8JNsOk*M|&}((cs)b;6rJC5LGX`>rnw^yo z1y7bep8dFM6D~$diLSH%c`A)i7nL~q5t@m=HZg(J7INjve;!+F2-P3oe(YkW$>D!K zY+uR$MOZkV`Y!nw2khVGkpDjFo@cmwRA}wltN}%5i@z+L509ff8u^CokJT0U`$#HL zFY~<FkyHt6kg5jRyXN@hlovwP{Roz(kzvZ%PSt%(CW0OG%d*FXyB+l6X>3RH0;4fB zITka=aiv(l^NMw94F1~-p!Emo`|d|I&P94%`};jwnvDJ-rZ{@@e3ohUnY~{sl24=S ztMXw#{2g!zmBXEW7WE~cY-Og{tG!|`*7V~PVzh-pR-x=G^Vr*7^jBWaAPZvZn~$3J zKOO~<3F<FW!*Eo#=Ju!KAnk_kLAuJ{9%(*zkwGy1zsIwve>I>ASW-Xkl8F9Uga6l8 z5u^x05_*tFuPE6PB(&E=ztfsd$}iJeuV@Q)0Xl}Jr5kvfvWbV059pUsj&VPtn8wwz zt)LbO=>+9sfrj!BnqW^UB|?VOk*T%8ViclIz;@wDcz>1ga7~*RM8<ScBZR&}O~vTF z=3CA4jULOrcPwIKl*{0FtcFZ9I+TsI8sTJ-**9)LTql=}g>V?q$iAXJz}`b|BFOV< zroY}k!J+Yi@?>#eY^^hhzrhO)XLSNMjL6=CVwK44KYzWikM0XZ8B4WHdKEqd(JaJT z<9E?4|MPcRmc0LUdAP1=NqzsfKLG4!u74qB>fXf~@Bi|m`|k(r-!72=>^rj{fjedl zo;#5;a(hf<Uax>XPI(_mIgrMY_nhhR>LX2vCm9uyuJ(=kC5Oj#$R3z`^MzdZP#S0s ziGOfwW-n$w(oWPR+hDD!i!ln&dn)}Q8!TtUb--G8Q_b0(FCr5wpbWYgD;m!|$GH{x zQC71eIKjx0EN9wJ)gQod4Vr^LygBVfkBpLRI-nO3;%k5)E$;gDTp%4^5N*9DR(9|F zR97U8jH-U78))Z9L>4`6FVg{eSs8dc=mKR(B<PiP9_M3920e-di{0)bZT>rRxO}d( z_ChicUJSAf9-afAg_YcN_n-}J4UMGMOH}n{_f+_NFQPE@yDVe8#N5IT!Gdk62g~;e zekLs=&Q->6rSm&lmWKt;VvhhH$f!Hd^URm)`|uxzCzd_WXh|^0n3s>l)PcMH-K+rT zTPQOMu6}7O1S>{?2=s?V*bh2_PcQ6zl>49WJeJX)5R1J`fnGlDf7Am{xX7QOYXGaF z@?TBGKmX-lUwM8+mAK>mfFK=Q5Tqlc+f`4&xxTjV^%BPFU?e>nry3?8Y^hCyg>R=m zPzTvhWgq)|7(r7a5Q9Gb8~reE8B@nCW;CuqHgWdZXi=Ib#VR~kb%3v;*Hxk~ObS(y z$e}G%@VQ>bM{K}34oYCJ#xi2e6|z(F<6O1uv*B?V><L!KD%D95>)y9TSI-i$gVc zCJtpg51wLZn)}<!P@lxrO6Z*+^6?I2TLX`IjQmvz02qYOI^P_P8mj~UP~f#mAcHHY zD6lU9;Lb>}OigD8YM*ZDgw_LTY~TYC2WXDnR?XMXfS68^WoS&)`<^AMN$U8-i6aPA zEi>%?9dmjOFP|l0x551H)mO~ypbWBR<tN(Qv>6dFXE7ExUA(R_1IF*so`}UfKiwnQ z3_7|_7mCs1e??0hrj-$&7FJPUGoy&zp&$WGhLXun2P=^ZsRQ_P*o080bqkR48cG^u zn>G!7?XZj2o<dFmKKf+;`-nxcSLcVlgTl9rgMz1p>960ZPv~Ory-XsbIyh&JWm<cb zWeqHy`fP3UF~q?us&v|!j}~<=LAOQ~3&i`?FUoq`9WMNeTq`Q5^xL=hF<MSGy*Zf4 zD?nTG+P7PL<dw>xcvc3P<z?%y%`Teoh_cmQ8Rl{xFgL)SkR5D_`G&<({|f5ST}!Gq z9S!%tg4logQyEEL|LfKcDG%B$d#{kMzq<_}xV}8=2-z}yS1z;hh`F`u^wkBX>RZIF ze4Oz@(~I+FfinGRv~!@L$5P|j$9SJ(PQ=S@r8Dav+p9X$ew1au0bW5&(Bl_VyZQwx zZWQwUuEI=Abm^{Qeh0-(Nme(L2QJ99Xjt+{zqMKN2?dMjxcY9Srb=#5Y`Zqs-X**z znGO(fD2g{HRSC0to;w$ABk%@A3FX`z1oL@+9H}VyUp4*TYu;T?LF#q)yn|YWqbh^( zERcXbu9P&dB;`U!a6%NGlfNF@nv;%kfoe%~5V36JIOC1Mcf~q5H7+G6EVxzHcgf!P zLMmxHJ5Bcs7UJ>z6riyHeqK{)wXF^<R+Noudg=!v{pz_`j_o)Xkdz9Bh2Df*K^)`x z#kG9cj41CxNoR%T0H;BeTcRT@Lpus`-J`9YBZKS!%L-Wy(F?DWR`y>FxHS=CSwRYK z+k;P4fq2w9PB$BbI%dDFN{x;%vKJn=*VW2TJPttgJK)(R&7cAQ+Bj^XgpK@=O^gSS zIQZ!LbK_M{6hFVwq?Zt!JRk`J%H67M)-LFR+i9x2cZg20j+;31xf0aFL+mXg+G}Q{ z{4CXCS*C~N7TMUA(nbqf_4(4-3m_3B3iwz6k4p+)`8Lhf2LxIl4;2NE4f_as+G0~A zs1F}Ka?Gu*iBh)^E>a-9_wA#t>%F=tT6vZ4?_@wiW!DU}+$5Y9RWbc0|LOu(><>Iq zW}wtH-8<Sd-JAPM><Z0J8<V@l3~D7AcW8zmwg>dPp#w!$YGE_EPulL3&cv_HLC1Vc znp_;;<kSfX<}GJYza_z!M@rKrdg93Et<3c5Wj+{9FqK1jxbWuWX<ZEV`fw+CjH}dY zv>vt~Gi>sQV(qo~uMc-e;N_nq03uMLY&uh`yP9urUR+;l@7|q(36qK#g?0Og@rB|@ zu;$u|peV+AbH^C<6n_XXVjBdd8u#nEx3^<;2L-&G2mQEK=WTP1CaMgOJ~no%oymja z$wN2$x3mIFKFdaJKiN(e`-sQ4a(m3fN~0eyCpUixTj`Hi<#XJ6-Wy-s#b$8qV7Swe z_;xV?VU6c|TAAT6p4I2Lb<b<T(|HCkl!t#TkgA5_1;^;*zfF=$F~sWOT==Dsufda5 zl)O1|>{@#`Fsl_QuRBzmeD3D1j(ncUyfIv^2?^j3PNs!nMvk)pm*MG%s>AM}*aAan z{NdF*tmo<tFxto7uVoA9DO}IexO{gJS(=ZM<YDRFD4uXFmT6BkcMl5(XMEGKl1$!+ z%!<Vie)1$diQ*2by&H}lN#bN4-C>r7Gaa5y6h<?m?@>ekH14E?d_Vp^V*k@*{J%|n zgcwp5j;~COWM73WLJkItJ54|P+Prg7i0Mzc`YNqjrH9qqJ&CVEz7TTb%&}Le*fikm zjsyG+W5|=)LS&%AtT&b>ba89{foqQ#F%_BcWs%S*xcoVO>a1d*2_ZD|MU<A8_Nc#d z<9VfQ2~OF=w}m7PeDvOZFC2|ZmS*%5HBn5fekHJPk;G!Gd??1+s$&OZlRIBg8qaqB zI$?O*`vR3%+re#A^OZXa6qsMsvA=<Mok-xlp?Q9}+sq;x|Lo)-MD~#%N*O3uZOiIk zWEGL1KCnsQ@v1;!fN_d{enYz`cm&v?ag8pg>RG%xNm7efZ3Ra!iW^eK61?zU9};6@ zPU?DiTL3QiLM-@+uPV}enj{Go*uC9#9myJy*UQMOWa|8;fs*L8_+gv3tOWXq*4-&P zrM&jERGGz|Nrw-Gb9GJ+yE{}2=P4POg5Zc_*Mpz<;pkm$82-Ogq-HfqZOdHZ9c-Lk zYeGh?$gTHe03`u#I}Th63tt<bQqda?9^VTunZ_MS-+eo;p#rvIEpXf8)ivuBkChu2 zioS~3Aw}5&oC%oozHd}#Lqwj$63$c6eURA$VfZDt@-A!7a|T;<QeDm(pAmfX1mD-T zt%0sat0L)7f60ps4$N;VwDjQ%IS}WP2x$G{);Lp1m1e*=`WLYFXFNY!?v@G9U*K~4 zYSk<>!GE3jWA<_;na?8XJhd)H;CQT@{i-(J6&$BNG-{?xWU&d3K_N>Ij_oO`<xKIh z-kz5)Ivg_q!)#w5;wR&k3a5M9$9y~2B--z8Y%XEu3#IJ}$6Y+oxKO{YCrm$OSG;w8 zXly=R;ooi2z61MtwF28@<G)cnXSLtTWw&mj)D18hOtkFw*=-P1*&(uNE*@xo8sgY! zEhl=43!_qyRnB6ymX?$@CXX@|-f)(w_yH%>4J965tzA-_zJ^Z@F1TOI`(e4MLDTm< zbw5}2V69x!Yoa(4a&?%1EHR2#(M96_XBSP0LXG1~9|Aywn+K)A6kU<V7-UFs^+uLS z7nY<<q0XqFr7aE9RH)VTtGH|p-m5_86&rf_?nPsoS$lCGlhmbocwJ)b<z~G-&B%V! z=3p4)m?2kbO<RyhUa$jflX#Kuy=BzzAtH%nVVH_7C*RszjsvXA70qJu6;!CrMlE}B zT6Kt%l^j1vT0236`rzW!*GZ3#g0>!e@FBUc%m_l{>bH0u3>T~cGX<sH$>MaXA1mcg z^&))n9|GmYvGBEB5@2ggvOU%~e7Whg*aCz1zMx0SKWjyyus#}zrhOd~VGu$PD4)#j zB;84s>Uw_gP{`wI-=9noBus_6i%vJ3)1CK2azC`7^8vnYtN`d@KoHpqF!Lg~!rujL zLxuD0Rl6CPSwN*G@ZpCwKK4;P;)r}xsK&;iRTBW8D%Jkt#>l^cJ>#Ql0%;4KU<q?t zXmV>~8x^`h-5tKe%=c{|g;xi?gJo`)4zTl{?dD)@c84&*6E*&45DZEBcX<&h?#{ON z*{%WSISvqwjAo5%XZ;}~TGc@A9B~RIdGWCrvX9ra+?MbLT7POZaWs~%-1qSJ!t8OW z<1SS0a!nt>txr2s%r}&0OxF-L@q?{C*unGsj*UH;AR7^){@H^{r{yc%1ehUuij*em zSE6*{`kJkm5P&z4onkvZ9eIo6<%vZV+6l%*xLfNz!9u|SapS{BNRAbs$CRYhf0LZV zO}=otxjNr=?@U`sI+<b7swsKIq%ju8KYZPBeF(Zpps-2a*0R2GXPbHP_G{iaEwhf` zqK{Dat{TNuddm|xiI6X54^OD1p}_n6q)|n5&?-#Xl)~b}PN^mCkdz~)TITt3RbV_S zummwE4(0EY4Q{@|yZ(BuR>kH}SPD80!s27Db{7h>Fz!a%ft#Aog}kj-2xeNv4!cmY zqF20F&#l*SC*6(`4+)BJC~?jDIG5)&V`#!E9hcRMceH5hZoJ^~g(z@Uq`qXA=HJJ- zmn4^SnB8Hcm5<FZ->^KcX;FC&|FVZ3QaWiZe@{UTe|Sfn)O+Fhi%|gYf*LGP2Y-}e zP`g(>QUQKWpO$9$SgEFPpVJ1m&C|Vbc@t-r-5^3*;1Mp&)(4^DJBXk~Yd=(hO)xPb zEq5B-G*Z&10ZYWnx{+S50dePkxV+J%J8IoP8NvfvG!tQ^mvntDDuuL_f2?3c9H>Ru z#Tm0$oBT0}Y|<+%?O%-*^`Dv7VUWAlpZC8w*)>qYOz>(Cq}QrFkYRV2n=LynZhTv> z(ymrws6L%30SJ=oo==TIw4RiX$1?5t<dx8LjgswQvi^z{ed)6X>tX7V%aJsd)nTc$ zfN#V~C&yRQC)E#W(MZ(#tRlAud37g>bVxjL+5G`gc*FT&UAWf0(UBN>`0q$LzC<VK zocRnG?Qm6@fh&_niY4~)7nCJzp)+ZfqB9-$3)AwLf;S4x&2T*4{jd1&TO?<@X1ONq z8v5bPuV0~_4HVxD?|piT2uR%^!3p`}yZ<lOc<5d8?EMZ#yY==}8>xQ7*&U^^=lbZ) z&KBgbh%7Ggc@<L(6{~SAN%kDe?hmO(HMSnYkN5(L72$;J%_6+|s^Nfooq)Y6=D}dl zs8&~n{8)>|a)#?CR_2_%vT#xnSiSjSoQNdYZ?~nHjT%~zvmx3?fW=Fx*<gXcKo8NJ zz^V?B1*>0LI+jcmV=mTVz&v&jE{HpnBdcyQqXFzm;0s<9CsJkDjhDz~;QW#E#EN-y zx;&S5q)4|}2atU?V}7L{;rTjl&oH$6V><@CQsdT_HsmVgQPM!h?UsFH32pElr_t-q zQ)6EMoo}MY+0D=IHcP(RD|bZ2Ba*NBIA%B*)gM|B#NB&o?x>e3)@^}UZ0ak?R!voD z)}jcPz-P<|qy*?CQ(mRoPpHQUpd64ONT;`KM=R#=Ek9J<m;ZnPo(VvPK=bJpr3OsF z?~FR6=Yysd)1cpHc>g_ymLv<I%R>07L`P)Kq1&DG5a^}16SOb)#4cCkZTk}V)kdC^ zymG^F&@M9rhlSAPPV;Ac=O8c3T7NVGHRq;&cK+DsJ1`#BJlIp!b&F+4j9zI2S`9Vo z=Oz00(v~|K>C8g?@sYv;S3^WgemQp)S`}iywedta-%iWG#KCDk)32%&C;AOW=ht`C z#<s*4x($%hL>L3^GCzPS`kVzt<5+YpC*XXl^AJ4?D$p&J86JSj$*hIUP9^ZvfJvWe zXqjiit~ZW}sWz^M(ijna?o4zAaSb)FPZ?)!7+L!Bls8buM)2A;eW5440G!d&)~_-Y zU0ITum5P^pmN%yhml%O3XC*=tFD8)p!syPn)wMW)GR2HF8K>0aL$UAvP)K7p4BfB= z%LN7IbN{jwOfeP?!&z4HsY%A<V&68Ff%$F-k1r>`Rf9@~9VnYkX$}pxDX%YE?p;FX zDK^ki{eU<Iiy~#Q>b#$4K^lA%ZIh%MESe{&PPJ>^sAY}<RiI_31Tq@$K#Zk34!Zwi z>j9Yy$H&Ww_=Tq+Hc5k82&?{sh&E)dqj3c=MbUS8A^gI-4FeG2H{@<dda|rwC-@uE zfk6UoTqS>lYq8r_bxOWmtutTy+V~ns?=XouStnyvo}_h0(<NWy9CUfPY#PODTNd-w zJh@r86~y;ro&G%XM!@V|U49$wdk5?5Vy)V;+A6mfVEhYmqOies-qXPj@Lsr(ULksF zXm$G_xTBnrJDD-q3#^t<ryeC^zFq+_u|af;_mY*f_U@;BG5^$bOvLnU)Cpiq&uS`( z{s2gC?{*-=0c~eY>y4$mQddonejuK0uQUv-CjqBsN##HW)huf{$XgxI5hAR;>A0I) zqGAk4dOv{YqsvX)ze|5~M>6LcjtaWrYxhd9leA@p;{sQD6q{KlN8>LyZ)ng=2tPdY zGDJ-=H3dH!30e~zo#<af!uus?nyu-3?z>3NWp%d$e~Q`L?7H?}w*gDzjauhrV8l|j z0WiMh=c-(=DBO-Paq|9Cwc^BoVE%_`<L^rLQ{)e)&(0gQSCP|(_2?>~rEq;lkGN5k z7wlzrPcxY&3^25Fa4*O0SHbFUwj=nUqLa`WwM#slFGR_2F_+@G%&jch&%(ikGP~`r zN3d6~1$haBdEUfhx)@m1n#HH)fH~g;Bs>&jIJr(S+lizYrCp4P^CH+0s=d;VqcSG4 zi_GauHX&M}Jf;?jzhKN2ES>{wL0K$gw>UOGtkHlaV3?7zs5Eud&O>THHViEPRW-xg zC?9x|#z<2todNzFH<C7n<_g%2qeZ{0jTdP^6h(njES*n)iZxdgxG(MET!TL5eJ|}; z$7OrGWU?!mxvmT6__?or<h|A>D<TnWgM!uB$L6vRCZ8BF6QO<8guG$|gE!Nw1ucX{ zpogYPcjNYcpWV@)#1)+*pX}S)=%8i8E`WUkcalkXgQ3l6frlp=g6xzGm2EWWfY`1N z;7^!jmw2;7tY3ZMF^K<?gvL+F=_%m12QR-h37iHzH}gim@>|N-`;L9H;1^)XO?9X{ z<_qE@YE%#>CX#0U`e<*6+i=hFAvLv*iuvdoqwGDp`;Uw$?c6W7#qJ04l{Y!DdAd3F zXKW8=FT?@*N=6snC<;c+L>P$?Wv90*R&fe&Z==FwClfIBwnp(f#8(usw8+NrG<2)R zS}`>>MTinc=yGZ)mk5j+$(9PY=7(}2YQtlJ<13zwEIB5hqNueL31x^kC$H_A3A>BK z(^g>7f}){VvQu|D<Bv&TwxX@icHn;B<?$s-4Gm-xr6CK8;>PvN7uWGxl)?qcwvAP< z4N|WX;eYyJ$^o%q+Qwa*_k?aOp_SHNc`bGM-L#ZPQEiULSq9QBSL^(xyM=SHV!DTr zEQqZzswXS9Xi#$nf=9!tOV)$6WGl7ZiWFNGrI%3Ne2wErw(`Q0C+L?bllVx57FxkL z9bs;&ATZ5z)FkC|&RBu!AjEcoilu>duIKkT{%(R^FEFb;HH<mmo~MM3TNUA{dx)Mq z>%h|g97!z+w?~^)iAbM!nK|2E#>jLf^7|-Ww(JuLnY?GG>?`{n{v`zKEgzO>3)hPY zw++xlcH)?WnnEcz&LN%m;ObZQCkG^3#J(&X7Ns-55J@uWjRNA9tO?E09C_g+L^KD9 zBQ&V`;ZCzcJiU6GGl#d-l8YZk=ukV?(RzBei>kkkz|SsfNwnnkSS<(aC8O1knR)w! zzI#Ad^?+~a%gMnNOZX%9!KmAt%XGJiYylN5kcf2%Pmp!zKJD_j!Meu!5}!YRNw~Fq zQ{r+;(UcR_Ix72UAfBaI@QkjR_p8yeU#K4>%AG#KYWX4BHZg-vpY!$2xB$=1*|M=q zcuTprF1`60YjvXd?-;Uc3_fhjX13hN&sA8Trc*}^lJ*^57B|l#iZ8yWQxR$W{YzGQ z+UDDjnGQ_hq;}t`DXzx_<h{SAvBxAy4auX_O)Qg3l#9&OZ9QH*1ub-BD2WFK1>^6n zTGKv9U$n=7M=Dlkxy|Rjsxo`ZztiwbsQhHtv9Tb{?n0zrS71^RgP9|X6-&J*nWwnX z65w9F1mTc%s`tRU{Ndw2J3ni}yS9@vYY)9$w`!sLw=c4Pq4rFDZsS^~roVGHj&E<w zL&1W@w2+0%k&)-GLzBjhf@`Z;bQ;EPusR&B^ydn`zvq|S)BZ4A9o)Y=4(n@;>g@Fi zG=N))bA2B_Eikt4c~5WVe)ybuwx469C$`|h0*_epFG&^8>W=JF3jIU}*Q9g7Ez?7n z9U;?&B4r=yi}249=q1YE4!Ymgy?b~_vch*ra@vF8zvu*e#wS#q+IMhB&==XT#+z@O zTa=^w;;ZYq&D#P8dE2~M2X+0mRzZ>eL6tOt+Hd;5f^5q6YeGueLI8Kg-WY4|wzew* zBTYyD$zHy8Zk6E1=kv1FvQOiuk)gDS?HtTEgPudfq(vjuyRmCHKdn|yG<SnaFjCG) zgwaJl@o(h~E#=1Oxfz`_#?%Gi0|8^%0ISFNcU6w&{+Kv~wdyHteutSxV2@oezhmg) zyjg~$1etTeUxA-&_gOX8ezQon-PW<^k0w%jnRXnwFc3r_JWw><pKRbUsXzPj<D)9z zni@BB>OLb%YS;L*Jbcb!bi@nax7?+1F^PQlc!o?fYm;&rkOE_v$@mNtPDPJMPLud5 zKTR!oH(h*cx|Z)FQye<}Jz;cFvmE5R<Gb3Eu<*vA8vx+_j$2)b;&0i6s^WvrwwhGC zxUP%i7DA;?{V)|y8%<Cw=!VxL40ojhi(r(n(O^mHQ<UORao)i{m_ko^p}{|6-Tz*E zf-Mi_I?WxX;L)(`U9CT#U?WUqKhNHS!?Dfe*qbL#beL23V^BaJX+}S7l|CDT4}weX z<Sxff-S1kFa6E6rgIVu7owoh9qrt5GM=+;X!S49+nmAWVv-upZk@VZn?KjA@G}a^r zWF7FY)#SbEll|fZ$6{7uUnhOAjwy|j*o?-qQ=FP@im_(ChL}!(C4FuPo6+z=49yzK zHML#>8=O+!jR!k!Z7)Uc(auz9^t=4G<8~Yp8(!-Z5(t59dpj;i!&1`(dDIW}Zq;`S zj<(RkGxr#S33NBW`kx~r28Y{XhJLs4G|dec?P&_Y?hH{0^dGkDQ3o&L@r#b!4<tx? zhdVMd@-PlqL_Ug0euHd-BhdL<(ikb8Uak!r6%n7V$*R%pclu^T{0r5At@h|ufH#=W z>|#r&006H_a>(U$-Vsw~$7DIPrh*ojmHSifcs2x->RPw@u2F2$skz}WECoJUfr8tz zCqI|F#0G~&v_-<Y^J>~8U7aP5lE8i!+Kxw&ff&Vkf&H7d%L%BXy{GV`L@6bueN#U^ ztp%-Ya;@Na6uyqrs?jX@?FX&?q*UYby_(D8N!{`;o@ccnh9jQ2l03r`yTo*^rt}9Q zc3v=nzreV@&XOm={i$M&$JCe_p6B=lR?N=;8Ic`|(lJXg2LjTp)*o(rL9PHAsb+g8 z$|f&}^z2--U;D)!p&<H3c=Kzt{Jh;@G9(c7tA2zv(9#7G9D3iY=b2;eYI?I4_Q2@r zkmnavc5Z}+##*@`9=_ZGlsaZ$uTjNU3Ot%PI@+k|cSO4aHZsgS)(282U`+b(Xl8BZ zG8V!6>7C>*oNMUsD09;wzXKimlyl_RpsfT`jq_8aFTcRh5oGEi48fBW4PCx4RMfSp zav<O=CHI@>)~2RnCE-1gmxWjWYq>L84ICb+aB_=Ak9LLAo%wC877jLnWRA1`&)?zc zb|W$)wTI_b3|fOCA)U@<U}`%i3_&2p`vMD_eKx^9v3;^V+aH{|`rs4+a`lQFNy&$@ zDs%Ao0_>)Gz`cX4^wN4@{!%Q0_u+P?=ZTPr7;BN+o?8FnZv}*XRo#9L=%R4u>zvOK zY*O{eS-AR3J9qbLYJuT|?oeZ(AgY%DY8a*VU;^7bInoybozII1MZuQR4k@A&_f9mw zTg$|f3GqbGW0<qoW1nkdzX`8`Sor(zW(-o6M3dj`_B?e3-!7;aODySkK8__9tWR9e zdkwA<ocKh7fdz=$*ILWlPrVmf_KCE363>nMEEcN7cj^wIArHcylIyP=^I$|Q%Qp+L zL*<1M65NHY`=n`=-Mxnq_0A_WcVmRJB5daQphs+e_s$nfE?0!bACcR&GnJVP>gvP> z2y}&q3tVKZ^rXsKHtjncnv*&+!|y22qbDJ#+J_m>uP<~67-rLDkrjdJcs2q}quNsM zvfb}ammlJ8Qb=q5CQfdy>^=H2)3qIgxpWq^WVB)GW<<95PPx=588v?`f#NlQ$gh3p zGryNLaN=v<L%7Ro;QG5X_g8p>`dzFM{6Hs8OU~`*6beh@QIh!?)#0x1J{)CA?#~tb z5#MK&T(FLqy`7=UuU*KtrI+8T`GxITAA0YcMD#PvZy-D#ZY#KIrczuAeS$L2$+{}B zgvjP0T9n>G`9z73JiDmw!shbo{6y2B&yzzJhnoZ?)!%SkFza*we+>+T)W!iV>r#(| zs>P+8HZr9UvN<7p7GNte><Ob4fAkC&hg{#PZj&!xljrD?fbahA?fEq#chG7#x$)gz zg|VL%&9?b7h?%xt`5x?*&>4=+7N6t!vTTmGyYe)ty(TUz;#vHV3@fVV_0F9ES@nGa zhn%P1O}eb+N@QkIoD`6G19$<r8P6+Ht}ZbRf~4=zch2VMW(q2kXOa7*mO}{=OXTy; zy<f~OUtcT3eC4mqx|+oOg&3_uo#_~D@gdJ#fR8<6_gE}qIQTI#O`3Imk7d~*bw3Na zO{(H_8tY^&#m5W@Ih+gU04d918+>YgC+y|J*S}?rTD`1j#)`<M6pP^a7ar0zEv^Lo z-#*P-bC*lt0Br=U@N@Jlo6g1Lem%Zb4m*^Ua~;9rt}^j-cFqmly^FmoTb7w!ZXl$a zzFOne*r{J{MeSDuE@_i=SPzo9T#~M_po?Rpzxlo{_SSN2J3@0pHIo)hJi<1VhvbHi zqxytwF5}{!gwUs?!e}F5mHbr_Bch%0K~8EFD=#j|jvK<X;kR!rc`kANAF;x@n|F_z z;9CJM%0tIungPAU;SInpA+Tm)#>Up|LVrLD23(~mD8K5vPP_@av1_aeZq!-2ar)F~ z%y8}&IGG5@!wte2IuVyj>@dEKi>L5FD23Xsb>N?^al286eaip2HC~asi!Q%qqiG3- zQZlpoVcchTf8!UPE(BBZcN&wlhSl<oiHEeXSCiZCjqr~a73mVQBh84;SRgtfZwzr8 zY_MYrt|dAce8v4paZCs}RowL1<cEd$xXKJ-gf#66^~dz$T!3l8@5_nMOH{uaBMNXb zty(~dJb>VPU&Pe1_2QPhU(AwZUJL;SiPWqd$1Z^2$Y!ipW2nO7a)f##2bZ%4ZGK86 zD24$y?FOVY<2w4djEh#38<uzKzCafMh)pB{u)=bT=0)A*2gkQ3F8F7I5r~6v#9W^= zit{MkUv@jcwhwHx-x}kBp3O|f+bs${mf-dSc2=)}Cf@=`nj@wjdQk;bTT&)s|D?uY z)Yha+gG5nn=itK@Wr#e}6xRo?M<DgroaR_7yb%JTF=EZl*W3rbX(d@QV?Q(%2Luk~ zE)mZ6mfA6K+2*tHP+LK2INQ(8M!zop;Tvya9b>%(+L~7K8HCLexx})#FKA*E2%Q*s z?9#m$MV(SO>byGfK3w`gVSZo8__p~UJ7h(!=;OW-&G`QIThR6iK&sf?sDf9-AWOe$ z7B{i)`^<u40sVbv?0IK$6KnEnC}^BV-;2xpc*VJOaYlmXj&DJmpwC=7fXkYGXMw$9 z)kk(CgE7LeexHvr*+7UDh4L*suw+qUZaULX{$>&9c`wYFGQz;aD*)pyoBl4JWIg3s ztAXS9fVTbLz*oA<iEB4D!T!pNHrJ+)S!q<eoYB!>hoYFycySa!d-c^K)F@8S`DDt0 zC{|1tQ`1cp^cF;BEII2ypQkxu1XU=Qb;CuCR=_<hNA8?ZpG5jf7Z6<b^KSkh!rnS8 z3N~8zeia0zK|-WMKvF>Il$H`Hk&*`KZV-^}5)c?96ltVk2<c`h8G7g*x`#Lq@80|S zuJfJ!?eiyaUBJ|{p0(C}|8Bm{wPy`c&Kazz4g5w+lct03=r3{hs;@8gO;G#0exr?` z=Itari){C`LEKOlfDiwiNqdN>>8hkn?tO*a1Aw3ydL%lUc%^$6b|bV-E8o}o>SWrw zjMr2<-hKX&=RM2=5;$hd=ah&8$%i~^mT-y5gI)cez+!Fp(ge^;o-tkaq6A0lr~~t& zx9N5TJzD#~%$|4SsXPg1L4}l)JwZ-6;^d#ypG)K&nd!&foAOp$&K`}hZv>GnluSR< z*6+nVP5GA6xA>siGCrqE*!G)-d=c%PkBmUVzdRG9XKOq+3)_E4Tk^{CEv$JG1t<|Z z<hMKX*H9l3!PCY22LuchFMn}~db=j-3;Ta<b;tP)!?X!H=$wPfKR&7eHzrt$wjs5o z<H9+oloyLZMV-h+$8B#PNs;k{_~uID%5;El^m=s(;e3+yQ+pdt)kjp6E>#ESn)whq zgAQ6O<{;)rb=ZU0hnj_2zacgI?EXGK-Z;If9_C$2XONY7=GaB~U6oFxH^aEA#(0(W zVx;j;vk6LN`2kY?ZoWRqyV=`SbcpCWx+<DL`=$#V72!2OLugw`ENXgo&8~6v-Bizk zj++(%^!mDkS8b0uMR2sa8HcjZ#4}pcNgGFT>P|oPn&1^nHUZB@I?9~$NWY{ZiI)o< zEhQh~qr!89M+)<k5PzH&YC1vQ=o3)xe`jQTW!$V|FVI*}Ecmievi<T@aQFIvrl*@m zZue{qhdV!#PM?8YuTEZqfKzKnKo=86ULI*ts^Lj2MsP%SeEEnyhcH-`8$w>zc=!%= z^|Ebe#?!ea&`W@k2fuf~yUs}YKda>zLfW*}Se7f02HHnn0>jzvN<X(*!`U2LKlJ$9 z?o~jGRc3e_RL@Vw8`|beOTlmR(!kg{Ey&`-G@k@1HLtl|ohYL`>FdixRk3RHMG$JI z80rkG!ITU<4nsU`q7KgTy-^S>(NVu}+7)pQn_!))I$%DU=~w&uWTwth3Z;KBeUHD- zg4evQ3U@sd-bzVIEQC`bKhkze@FdQ{G1dhQqG0gkCW0*?Vy)h`Bb`e(fg!9iagetU z<k|nI@bueru=DmV^IbZ~UzItU-3pQJUY~xL0FqvgKBKNskHv`dtl_0}fIigs&C6rb z<Z!ykUN*HvyDX;hxX=0Y?17Ja`pqT|YG*3P%(>u0bw%e<g<{!P`{qa2vax-=3kt>) z<Il(P6vn!EtVZR&c6`Wp;{cAb$1}CUc2G9f`dL==bF@*H`Nj*IXmynW8~CH1O7;A_ zTmO5(xw6ffi}j6~MWmxuI=@tb;3lqe`kQE)4B%hDbv}HMA-~?0_ZDDZ!#}DT@_>ef z?ryy*R9Ke9%~S7=+%aess1%O-gPF5mckp;HKz|vz=VMW2M{|(w{1Tv}P6RjG9p8;y ztqnu9X^v1nD@SGSJNbMfng+fno;ue1pZrff=a>FmfHhK@?}{5I2ZvwI3ztggCPt^G zuZ*wh?^@e97N6@s6ssT(j`Rv)K9cint@Z`w{SR7Of6Gk#yqnd2sw&=QvTb<Lu}2R; z{MM$rk@rICm<KZibtg&;na$p$aAPJ;RH2&tgGJj~azT~05hghp#@yo$y{JhkTl3{; z;;iQ(VG91YP>0XQ66wROtiq8k(tG&N@14=|w*A}knm*2-`@gQy7YP2tz3p;q4QT&{ zeF5mB<7U&k-MT8G9p|)fG4#)*1Wzm@g?{x{8Adsw*NPnz{DM`H?4|@E$cre=h9$o@ zz2!8SSM6qVMvla2cPCrOSMri$`Jhu~P<a2%naZW48nP9mY}Cf{PNG9%OqkU3hj6;E zSm=YfFGg*YQ{TtX8iJs@$c6lFp|CV_-?D+~pqDcrzx_58-FOE=nA++DGF-KEg<leo z$pP#P(;IT51qow95iF3R^<;aM&~ykUo@LgEHOO<TF=TDFpNFYhXZd(V9(1hq+)oWH z8Y>&J!3brMJ-nRJ%}XKht;p?FT)vtI6E(N7bR8$rM*DY3ejOrm5r;sQorJCLk4vsE zj@Hx3`k19U`QvPAUAMJ7FIIuJf<@$X(&UFd!jDgpo~EB*48?h~i4QA$IMSs=&lVP_ zDt?{xx0B|ol4ykiJ;fyrOL#=y>32_E4a2>gxVI6m!LPP3ye3@N8A-sc;=A8+bkD2h zArb{|4{k!nM!gV?fPZ#IU|?X|6G76CRJ616&;6lrcyj`G!S5J$ZBkMBb{yb&U=mLk zl;=H%;W-OcQ5A2hKdH)K&2ea~!+gfzWUx3wwqnU&hdKi7+SiMt7RShTpj5=_{i}Ue z?Kz}SH_Y71S8FpxZ=ee2yf_1UwWp(_+Jw@JcY!#80xGX*8Zm-aV8cHLbtWRqQdoBQ zyE)akbx?H^5FaPA=ejjf#4HX`&pO&3Z#s5USwLldX8AVFQhm!ndQFu*f_jhsDc7FV z^P0RX51ZWAz%4v1nC&}c)Ez^G+gnsfmpI6s*Mjl&7%jnnB&T!7h`?it46YLQ8AyCT zHTi~Ot}!}@x1Ge(8HnWSqg|ic4WDccY4U6{Y|Nu$OyUD{R8=S*K_UPxDS{05{^DqL z?xFA2w3>B!eJb?QMlIWtg%C-4CYGy>r_YsrV+_gO*$aXNFzoiQXF=Hh6}-;4!l9L( z{NPd^6__^@gt2C(=Mg^F=o!gYvsq!L*k4kMFcrNp5dQc!<Zu8T6wX+Y!-t*=t=`YF z=;p+($DJ#DrXn6z60WL>S>si`Cs(6p94kS|j81w;WPX&7RTs&VE6e1w{h$~cgETwc z5#-q#bZ_kBGaPN)5j`)}9prD_pbnmkkUU_#=e}p?9Zgo-&CsZF^1@)|>C<=o59evU z^67yxLf7wn5%VbUJO*b?$VH@^^4)kJB|(K6HRaPyWiBXc6RFpDG+Z;6HhPoc7V=LM zAVh5YDH^-l283Ovd&-`875{{9cSfc>ZR=$Vc@l;291#7pQ^r=dW81Xv*Yc@a#IBLB z8w>P|<Ek#ylWxPV6SamkiXw)_U1t>sPn+N#gysTM1a=rt+C&;X5xl0q{%rHy$Lp#) zYZm6HKMxA0c^cSCtQBANhGdXV2L9gom57Jo*j|H!4o~<Fq(!<c%TIa{;A7tG^?Oe* zww(4oJQ{!;yeI+0w@%)TMyTtn|8x`(y#8#8A)d2;yjhv2(fckS8w8t&(i!qS)Z-$N zUIe40-e;nmwV@g1Xuc@@=hvn6Z))tOK83-M?Jf4p{B5c~l@sW@)c1JT(yj!h=uLm= z6ooX3Ey;M_Vy4x4RlC6Ih6T5ac?TCiDVi;J4F^OPhk7iWpshr(dG%J9^{-wXak@pe zSy2vf1N}ju#r$;j(~#8>A{f5^G|_u;l+D*!hdGYBy=;gk#kV~^E{YsF8zB0=&-$8Y z8Jhw>l~(OZOQqhY9_^!O3-gfvvO0}YXmg8T#;Uf}-yGYHC-WXhBn9fVUk6gT6*0c; zeH2K-xd$^;6}t{Q$%#TsdQs~~#{ywAzt>%=&l#^-)C{uhZUg8>M||-AIMavO72wTz zyCv(|H>ur?502}3Ts|8%+G-RgF+FCEu10iLwB<U`Z{zrOXN$v+Tc!!t_!VX<g+lNT zSL(oUyKg8HN{?q|s^iwdxF5h0wTEb@ZZ;gULrnPLd+dxbx9f+=65}<9?bV;DY}$w< zFGEKaxtgEW?4{JTQ5N#<H{7h<nk}!Cww_%UFtTGe7zFMz)S8^%V&Z>v!Pj$fO&!`j zN!U60b{)g7;^q@RgcjZ=etQ+^W8^nhzdeMa$18X+^7yFA4Jm}k?tmIN==<FUx#M2c zWhiA{7MxJ-P={bIuYa@NFqV2}P|0*yYn=2<NNikL=8t{whPa<K$ht|5@?p4s0XN+_ z5_-HMh>m>bCH}@mpSeNoag#V>&}Qq0lskvC*n5k&sQ;@&<xh6N=TMfYMD<%f8UpKs z*2uYYi4Y0${<$ZsoC=eFgK^ia5?z}-C$l;KW$K-RKGUkBYV&8oGBa9uq%G({^QK70 zqSRvk)HEKxwfdD|Wj`SHoAXdf3NQ(_f}O<t3pUhEWnOM|jhp4N=TiR8((ii@`)fjO zY9}cF+YaIt_B<cQHBEK^fA#mFWp~*uo7{YIb_~C2nl}H3`Q$NDvw<LysL!cp@-4&v zTFe%_?4@rc9(cHjp3SO!Wr<7?kcc?GspPjr=-tJ#SwN<`JobyNdlUCJbZ0Uq{kzEN zRH3w@t-OgTEI`#i7qvc!mBxo#7P9|Kv7$(k*ld+kzd`=Tn{Hj>KRxmB1~?Ld4F|FW z!OoAsz<3%97MAwFgNcfNx9Qg>%Jy%silUhn{qJM2L2a8ax7b1kD$->5O8-+1tsJz2 z(dJOaoydYy7W*fKjyI>A3`%>~QdR`AG=jhe&ppwjoTSHB<?;{IJf<r4Os~!lR20pn zDD0a+{#RtOa;8wH$1Q65=N-ey>ThB7XY>t>I6{yL?t4W4VXY$zkW$mhxcbt!+liLb z&acbU4p-Ua?^4)q>enHa^970&_F*Y{qy2rdF_d6HepxO?#Q6P31PdkCT_77HW}7pY z$hj9<qfF2S*8Pnr^0B5)zP;TnpdjUFQ>-+6usis-YixdFg#2vn75q5GBu20+?#ntk z7jKp{L9nO5J!AsQ)rcI;Q+wx4E*V({EY#p{MGd7cKcGxmZNrAjgT3Hn6V7iMwMo!B zI;{__%Mk<zP0Hpn9s=m9z(z(AhwcQ?dr5P@!`|-I!lKfe?G<2Mj|bw^_psr~EZWm7 zuTN-4#u^P4>i{*zeb(g6`w=Z*20?2Q<A!@Y1C@kZ7f#3xHz|D9vmdO3Ec}B-xw9Ce z5%pg^W8y=#$vv-yQhYKKd!b5;IC)=@EpxdrJ+cBDZa{JJj5K#@4bC)!WqC){&U@b% zZ)Z{ziA;GiwVHFZS~Zs52R9^-Z4HrL5AizL?)%Z?{oZL^zw0Q?!n?jO?dPIzC6sQG z^V01%j{nVSx!+&)!bxA~4s_LM3P2V)|5|JDu579Cob`Je)u)H0eD4$bx0-e3^G0{q z_E>DaVb(~Xh$4GGfW(D|LZFi>S{-$32>xSE>&q_5TA4U2d>8TM%uq!y*A(^W&>gPz zfn<K!MiMe5kAU;8bSY^#YR{J?uoxE&Xc@oG?AG;8JBd1@$Yb5b&;R~lpAdP=+#{5` zzSDw}X1<Sf@86yCA661*UhE23gBr`E88<d6KOytFu^X=oaM>Htyt!Id1=f4vc63s$ zhP%n>Lc*II2RE2u4qO!gE8*n^=E%jjq#i2<pTace<2FR<Kx`*eSM|S`d7Hq=vG5FQ z1|h!ogU08p0YkG!;!oT`BZ`@2_4%@7teky08s&IN$htJ8ilFlZb3%)RAGu4r?OJ(k zZ%wC4CM+3bK`Y+D0|l?EczG!~k0+P$71Aq*2*h(7iUX3_b>96{z8x-nX*b!HLP`FG zMJ6`aKh+|R_d_*r%k6bS_C>sX6H_%#{lzoqfBKeD;jucensK6q?}OyS%!}!p_)yLO zJwB5);v<U9-yky#jpq`{U1NTyvMq5psNIaA;*6q2zV;YZVD77Xl#STb!%wbhyAhY% zmnI>qoPUY_8xu!u0JnO3g0DrUnH}nn;K-k_UnBj&n5hmJGo`$r4;Q4)dIhPbdp(Y3 zeNeXU`RMr?Pw4_;r5Ax{K(Z_SRrSnH!34+5BfNF#eFm^c6cct8>h_7Hq|Z`Gr@Jnz z7ZXYP*`@ocnQh?aDzbbBcwO~AREg-@K~FfH>);*bA|&A+;aN6p8)C*y-yKyxa2@EC zReJwNNfBVr$)wu}DyL!uHKgIBPTmfRWV*PnMIaX`X2lO`k~hwms<YClAC+N~`LKyL z7=B%RQ9ZCF$F}au)Z_fn#;o(2WuigF^!Ayve^>}Sn|=Mx+l{}fGx7WX8|w6bOfut+ z?!4WoRO<FbEQ1Xu$BF28x86TY6!GrcYOy@yKR9|=+)eDidD-nuOQ6_;DDQcquciIW z;9e=-PX3Jp)OSx%y>n!{`l3I{<;H@Pw}!=xw@}GCqO5hvSEJ)WfYAYpN1S$3>t7?^ zjXJAZJmjdB`H8-8@p84Qpv$$G4UO5jjM7XJ)V0ZL+(=ZL%+%m3?@wxzvJ6)}L6?G9 zr!NeH79J|}SouGG=)5Bji#=!Fqp)uz^wViO6=)R)c}pTXf#1LUW6aSPNy@=`=U`Dv zeKAiE$YxH9Rckvl(Ri#eGjZVM68u8Dbassfdi(wz*+WG?X*J!ct85F+IO{C0t==&I zj6@p@eWGA&VwR7h)KYxjr#8+{Pd_oX-?P0vL$sW(a>Y63J|KGFzB~JT--euR1(s!q z0i-5{|1c1Io|PD-lAonLp_8U?CJ3}I+>vJJrP`4;N_lB1$?q@m@t@~}MgyrMhrk^; z^YZqy3&yA(z%4wu{U!G&@+em9QXYc~yEy1c-pL(z&xC6;iTa2BA-{+R9-ultt5?ku z({H|Vim@IljxGJl?g^yrj8hfrw97$Bv5pPP3~H0xGUO)<gCwc6KIe;!7pF7!w$rHY zXRWHKFIx3<d5DN-h4#P4gwj*;>?a7?{K4H_ymxGz!AfsbC8(0@YvBBXT2IOWIbFSN zQMr5b6(Y*@yB*|yQg-k?U3%4TkMB67f9MGy)4tX~wOx!EIaMj10#v?F4^_iDK9m`V zTFqVJ2;bz!4%wg4HA&^#gAHW%_5Iz)-lsdiWhA>Okxw^j-GfTu8YTEd!OL^$|J;L< zkGH$Vwss~|{J*FDWAGP|UU7vM1VhR!T?{}_;zQE&jUbxE$7&DquFQ{WIom4cj{4k+ zpLW8ev!v75A@AYYa)*wBkLub{Q!c7)f4iqm5xc=03AeT~_dR3dGPn|`x9&ksIKyp2 zX2bsBs&Jq8O;<)(^^6O<eG&O7c0SxRp}RHLbu>_8d(#o)@u+a3?&2}ADv^Vs-+}9L z0DD5l5|L~fjfXP^59W*#V;8SNYhbrLowIF!)~%&AeaZ#aWNp?(vvFU@6Z=Mx>Vlmv z_V(Hob15?vfVz@vkkhHCNyEc02bK@^deR;c8P}%2`iD!}&!|T<=*Og^%<3Rv?m#QY zO`g+uq`P=|^!KAbUXl~!O~>~m9ZjSdKk{~Nwwe}dmod=}wxyqqbrtd7Zw#!q`8(^u zdOP8v<M&G6-@mY#&NPTJ{r@@cQ&@1`U3P*zG4U7I7LB}OTx?qBG*L<5$p3?x=3Wc= zFZ|u;-M~(fxJ%S?e)dAGg*jihCw01VU9~{BOltrE<(VK_KB<lMJl!%8U4mGN++GG3 zbfGzHj{X?1uZIDmnE_T&+;`_OW%r)EaJmG$x?x5z+u`=6=@z{T@0P-3nRn?wSu1ba z<#FwMN$!D+E^Sb*-E*iBF@?mM5C$LUzE)d~uahoFc-KSuCghfOf&38IGOJ*57PUx5 zAdH876n>}{F@L*|eI9R=jqv9dU;H=<M9iFX4es19Gw0RA`D_HUI(M@Jg(H(ZF|`kB zZcU<l*!ipO$)X(1i%^4_cr^yO{_8VQ%Sd_4`TcfT!6Ic$ZPAPyk3Q+=x}{OGjx+je zw-3pClO*@Qs1a2zWCA<p^F_Bfheui`+kCh_`x;-kvy@bToxEY_MaRt=YFks=&<KAa z0B%wIH-p&27c@q`43h8@rd^P}W$LT->#c!UhRD2MzMUN&orL_qMye-553%9=UN?}7 z3+B_Oqcwx|Yky$4Z<TezQqFrZf_51uu%FWWI!V|#5rTH7Y=BwXRS$z|PZ3w_!)aUR zw^}~b{WN~2zp8{$?Bv%&-aIRIw+L+GSCEZ!<Eg0HV%@V+r}PUdy!jQ_wuf2=q(70l zR?p9D&qG<K3HB4l(?VWcZe?H*C=&YJxZ*7L`?gU0b;`hXYoK%L_2R!ZqB0!5_`ib$ z{u{kyTsr}v1uQ4&#Mv~_G_K$ta^3HfN0)sH*b0hLq>4j4TikB86pw3gJ4(d>slzkR z2#rf+n8_GjJ7(leFX_Kn03xe)-&|>>B<8Elf`@2oGmQK0l-u04!FlAj@3>6D<(3-B zm!2!YD!BPoxT2Ljk-zb(8qG?h%qU+Tjf4CIdw@8LJ8Bm(nJ}t1RMJmyDnJu7vr`f@ zsRd1k`&bg4o45@&PYSz|@e8wJ=Px7u++g~|5PT+<v5$Ya2-MeBjl@?r4I4BPmiOqu zYV~)PF($YjP49<b9Wp+w@o9ZDFSRH$9?KGiO)4*CX@9=II1$9E%K=o7o@&Ka&u{>n zZz3W$-ds(7FIB!>YNsRoF%sK`cKNdiW^Cd^fOVT|x&24-q87pV61}r0Wr$U?(DYFh z&|OqaN+P(1u^B|#n-03R*M7t)8&!ibFB5I$HL#mZ%&>PUaQ!sk3itz-<lfj1;iZ`4 zmL@~tAdi-a<<G;4(yN|e^l^M_cy2jOZxW+<OY;cz+A7E#OhC?zJ$ea{)4v(zt8ii8 zfM*eU5T`cj(Z%^mJ`IX<&jJ%la=L{b09Sw6g?FDjXj_J;!--&kyuq#MJ*!sn6DGL2 z$`Z}aNAZB9@aw<dC8f4CNxUS(+Wg+5cQ#qTAYCXuohe{BZv>puox&tm%{~HF&T3B( zu!H5H{P7t)(arq)WZONO?wYu2Wf-JR&1{qGeBO9?A92S(uQVTgxoSN?hhCirSgcx@ zZX?<l@R=R!vL;sX>tppk5iGg%Weq}-dTM|&{siafc4>RW+y`u=A1lMbLTXZ03XtXj zDBRX%%LVdmg(14!a)dtZ<tEy;8mNjzuiLKu4LyuJI_9HTq7oi~rIhrdr8j?%m-64s zhYkGq05z{BzQJ{Sy6Lc=tL1&{X5IYfk2J7XtUUrjr2!g?39Q0tguzW`*_Lp$1xOEX z*cs%$@FtH)Mab)hs058Jk1Md90tM)ZgI^v{7+0EpFPlv>^WNu&uph8L<WBJQ-7eui zycn3ODZArpdGA5{e_|rIJE(UFJP06IjQ=1Up}_f@@=U_Oq197s8;sqmZ2{-^{ch7O zr?bScy;Bh#ryTYHk%o>q7?CW9o%STIk@Fubsp``1<MDF+pr5sor``XUX!EDi=xA-Q zm@MA}M@`_v6E8&he*f%n@2;O0ieyiO(%VL|etAgu3m1#sT*Y5X%gQbhRB`ou@fmVv z{S}8rt-ZCul`R9J>;p$Eh0|}tx*-oYu~rX{8;4QTwBuG&aS}FAei()DZ3KFRw*M2? zq!mrRH+@k#>xi1uTE{vXbpXh>l}hrg^pqUL;M-VgCv^~<ynC_y>iNb=BKVwH4SDBX zgtz;gNrcHTf`OafLePKHVMr}kYa`-9a4CMUb*Ft3zol@tlui+-9{c-Fl6ZHnD0Uzd zrP(lYT>yBrOk}R22<ncYb@?yM5HIN=fm}0mE7z8W=nY92_=sAt5jcYz29wO)GqT}g zM+TCeG((nXr3*qs=9rN%tCZG|tdB>kx_O%YH8m`02NzQ@a<V!5$=Z647hfg2Di}bx zeSaQr3lB%2PFmhvo;JN}zVT}QY`R4z`vkwmH98+*acf_9h2U-H{e|B8I9Xv}Yow%B zFvHU5i>QYPh7obL)!0OZ^=<YW!Z!-0PONGIBd!=M4g!DwRZ^Ds1X11&!m&+T+w51R zj`Z(g?o;(h+|N=Z{+a*LV<SY{hyW9$?S+@B5`8v8<!A9lp0s&cZ%72vorzeAep((z zqx38HMd1lHO_4tjWieP{rod~6ea~f?F}M9}YTMN<mTSb5R;|vzCE#!~pEt-&*e+*( z!(FcLIS|Q*hKia)9?#><s^lzV&&K7yF4E#y31_C^v$wcnh95%>%>DS-UZaJMah{*{ zKh!Z#6CSj8GwD_-|I|2y?ujSaDgCdmQ2Nx6=PY#Kg$Qx~h0P#h5wDYbD-{R_{~Mmn z|MpEMu{%skBMa6jjo7WHF#v7k<E;*On|#fs-fpnkVDJE<2=0F1YbR8PDXWL12Joyb z$E(LScx=Y=#mTmuSBSd44Q*8=EgC3-oxW$58tCFBmL_~lgUhX~$+y<m<Yh-bR*Gj< zs%-yF=(q9LY|gOihk(zQVbyVd-rH#A=Q)v!YY%ba$2cJKdKfkrTO_ADZjt60$!9?j zEGYo8q(WEvQ}9jV50<-;%vaxwvdi7~3>3YjOThwRwBFf5k=ScJ)195%vE`fniX3q% z$ePOVw(GvWyp{1dJZ8WmW78V&;BFjkcE>qf%~MDmh$I#NP+<ghv(Tk~(zx9w<zP-7 zEE#c6jeJE0Jqj0nxY6_Ipvj!gJ-m%d*zM)~T;T`7Momt=y0`mI*FYE;2U56nFOr_C z|LYL4Y7yW6f>H4_ES=UQ=nuwg`o<^j8xEz<te~cE7SJ*X)&|lTut^7MznFS_D%Puy zNQOd86wEWl{hNKR94{47g5fMm_Cp(2ccx^pZ>TzFi1k!8)V8;1C=Ddi;@;z*_o&QV zKG}xrMoHMTgTo$39<W8nfx$3#AW~$8ee<fga#|;yc0&A2uV;I5%HmesTl>EK-|=R{ z<oz^OvC)id1@bpRaad-oQtz@~TfSwXJ3=Vsu}CSzXM@L(m+%fKv<Q+T2Gq@IZcmE0 z1>G}!&+5-IoH1)>D*alV=d0(fkk>oDLsRP+*To<#%eHpTcQ=&Ut0z&D`!+k2dJD!d z5dLPkj_?sO)udsX6S`vz2nKE)CmDqlCAxddHCDHb##}z}7W)fyH$I-1o8-HVJtcLu z{hTM1A>E8aCbLn&_2<*FK0?xqSLHp#?pj6<1}ZJYt@oNyr7fO2`|ZM>6~Z;oNz|Uq zTmozK3<#Pn0XcFZ^^(V(e)q(QikA16-RN&YMCGSn-y+^O`kjC9+i%6Z77UA61GEn~ zNO579H*7v%a=tYPMRwfBTFj7<VN`OBiewcpl3y0x4Z!^AL3wZ!eMSL!JVg}D+Z$~X z_gqb2%p_1yo?V6pH_Pl!m%4YhC;lh#19uq6S<b%?;h9<&$Z_y1n^PKs=Lm`O_}VVL zdYHpI4MLmd))y#tU7f%A`+igl^xjQd5m$`-B+e^}8G)6O)Av}87=y1sEc8RZ2MlvQ z%^+yy43b*;r$-~N8Vyh2&o_SiMREJzFVISZBWhNCnn`VkGHeP!%3ocf;V&HTGySuA zR!dKX`wwgtjlwN9i5PxUp^)(D1{(L`620cp5PX_V{t}aJw34Iv&>3hX;)uVEtg2~q zQo(`Jzgzz_1WHK#SK_TqQ$|th{iXfMnZ2r?%4bz#`KKy69LYy{if@1T|MW=sEPT}v zU&Hgxx8zrN+pg2>Wka8~^0%EWHsO|ouJqHXX_)V`;^>=tzMYAtB3lhR2IyMhVvW~H z{%i@lS{-8zFSpfj?}~ti8{@u8DgC^ioj5-VW**KCazcW@D!G4cFmulURbTdZS2U*j zdb+Bn7U9*MMG^k_`&b#``Go0N*Y4W%gVR4rRsqlI(}%XRUvvjlnmIu-UwM2-zO%PL z?FX5iURw8d5Uk~14eE<?cx{@AQ;L|zAshQu_?8PSD0?lze1IrY6bHJnLtnxYwermK zs>1h{5xk2cJ2511tl-Vj*Slfua0BNcR5R*<k^;xfG67TXN?oYq7WO?lTJ$dxoc9@d zI|zd@afQa>1u<8J@~5CCSMMpfmo8s6InTZSjhD=aUC81y_KTa(Zs&{ii$_BGF<bG! zc2iz74Cw@6P8H;5t~7Tyo93UAFDSbsc;`7LC&#a2+(WYqEvsIA8Xx{C>S73qXggPS zA1KMaGUh!mZa*29qv3ML{&4e=qQ3LRh=fwtE7O$R1}O4^_S^LJPhA+bmubXp@vL*K zmgi3PQYp0iLPiA$j$e73cU5LTSG~13qgXzcb7tK&hx&Uan12UVN4M6X<{a7SNsoeB z?*)`z?tpkovu+yqgjz$V&ESa=Z?be=?^4{S0*tCS#Kkv4W`{v;ovVV_n87h=3*iDp zl}k0wQov8^4LK0lSt$IJ<v6i9QEE$pP4@Bfu)l1!&FQi2p)Y<N!XfhV3}Xn=vVxM5 zCzkC1rM1MYXw7Y|ntwVEx)*)-EBq3EiF@pO@*QnjAhop3e9~Dpi+zF*Pp9&&uj|3* zmdd81$68(M70ka3tLCd#&WoDHyrGmFj~31+n~l`LQ!Ppem;i{;)Q3{;k$xS#;K-<P zF>P4yKRU`fiCo4L-Xrq9`prD5khzkGym|Jl*I~GggP6~4_DNBlf{dc(0X0dm>h=tC z?trttjFHycb(9hloGz6;9hTb$fu}*Tg0Fpg9**-Y3|Lze2KWDI9p`-b@0;N>0m1#( z5)c2+FD6XT4?(vjt9Iq6n80=0(fP!8dIZ0FTzxcz+c}soU!_AGzZY|9L?GrU0FUGN zQMZx!mZGjk12n{U`RW#@>7lbk0Qa@kQA_~t<<->&ep(;Cv-A;4KxG$`TeXVUF_p0@ zVBif+-Xl~-#!b?q%W-y$SPzA5m0H`-g_QqvL3=8Gmqbo$=uKQyHpDR-$CmaWCs^oI zio#_)G{JXBS^UkGl+MU1D+x(3)OCAJD|-GBipFYkHUpz#u^Mi$j0uXI%a=g&=G&!6 zY}?)0dO?-vkY$jf-v7N~0oa&!b8b`$=PBffWj_ss*Q-~@y;Lx^NP5}-{z?tA?QxHu zkuFFVv2D3NZJxFSFZ#&{(7uv~DLUe=sA*7eSSDXFDZ5p+<BN-M1~a&P(+w61t$T<` za3QgP5ieZIp<6S6N}Npmlod|V(`(YTqJ@EmVF5`~Z#5dto5kvuiD!;s4E42~EYD^T zp-P^lA`rE&H;ZB}OQ^zN2pe%;7facX+>U#H2B=>%;EyD&Bz&Tg_=L8Zfx9vS2u&A8 zeluM@QIT(UFy)<o@kNGwnxf6ETzs;q>LW7zmD3kS?YTmTz>h^EZVxqFe^k!+ETp+S zl(EK<TT@Lft-%+CCX)T+#*#K7=fjzbFfxf$O+cKTr?UwxgMivU7Tr_OA~GRMoiI4D z$w}5DQwc1QwC{&7k@)>m35Ba3zZ%M*<y&g(_NMrdWco&2p0Wj$d4$n<xOQmwKVQt) z-~9=J6W2VSWuEl#<1)PYt(?Zw3C(wo!cNR8^R?5>82HMPp<p+V{#@+|cN*p6^W4Cf zV%ozFdO&Sr1(ME-XlPvCVj5Ocp%Lgwp2DikDqxO#0gIlGeUau)%^{vx&VHtc(;e%C ztgJzLVKRifbtW0tU~W_T!Bg?p4~-qT_&nX0PXc`qxja*<D+4Q(EUbDFtg4hCdoyXv zndL9)o-t27M!2`CG#*jX2#u&$6~J!|h2W4cktqc14heTd9}pcT)PL-6UTthKr^yoH zAyGRAR|j1{JVlPkQJ?Y8{v0B(e-0WjDq}{Ad6zNeop07<`}}MMj#Jfs+@T<F^iNGu zLuND$e=7(2A)h|>vl*J<i3UpNys~l;-^*pUc3gO!b(Y}Gw>*7Rjoa=p_H4Bdv$g+6 zU2lhJhSS-Mb@ic?N0KB8Je`${;cd$4ySqIj%u}k{eiam@G^<0mT#2U?Wk0s%RtN|u zEOK7B7wXkJ-CTRBYLnEO6_IKc98S!??9{A++^Wi0v)~C<0Z86ie36LHa#%V!gb|#! zA;`M1m}XW)RK7XWRGXwwS!f$2=1_94=R_skapKb+X>-nD$D_p590|{NSq2cLmwOjv zl!8L`GK(0v+cUIsKF|9i+7@M#I}Z9!uM+`bpGv{wOA!X%>z>bJsOi#Zis>y)YrX1% z_?vHZvspH=QmG7y%hX*3T<Bl!&YXI%>miUM?y4R(8Ou71q*#+(LA2A`XA03Qk;x4p zc*{t#s-;39t3~!XSQdKeq81^Vb4Doi-?3th8^?kLSxv_<dYUT98-y9z2e=7T;N6%y z-%evjL>oM|u8U(0KEk95`J~+d053J}+gf}#L%K%<!NP7Lf9xn-n@|Q<O;qrv+7i9A zBVoej187HN<l3c?8bNSb!y1o&$<278>WtuSgXr8><js$C@gcB)Y4*jO!friz<{Mfc zQ7GztB2O=yKpXQw&kN$fqo26abf#P`n!daEXpYuRPWNX=rA?U5h+rjE%0xul6vRS} za^GJSK#h04<00qn|IV}lt{qY&C^9velp`pFrH_9YQLt|Pp0vA4<6N^t<g|;xuf)Mj z{xOahb=A-b{~iEHU~MUwf@C#$Wqn-7rC4Gsjd?0K-NL*8#Vp<QZg{g&qFY@}XOU&q zq$)DcQOw)6o91E|FO|r7koef*Qpi}($kZ{5OXk2&e-xF1bOdhQ4F>2GYR^CQz&zi( zS;_BXf-Yt4@7t1vp#yg_5!D)0%7OGP`p$G+ymF&;1`7XDe7Ck-jqhOS*dMLORHYea z>O>WIHRVH1^4BwScf0JD7!6OWv+wC@^{dj{zyH3-|7~IUub*7$KI{Nub(fj@PB!O% zaOa<dG8%3C!uK7?hl~~wF&bUI4i)<#Pit<_)fG+HJ~>Q{9K+9JKUZ&y^?h?*(HbM$ z>nCuEcPpZ%N?vUgGaMr3nq-87it2@RquR2+cQJ0B(`&P~2#7kTI6KY?Zf(%SNKw@a z7q+JgozwC^bxj%$^*w)!>3jY?x_(1WLD=|vE@W9F!H@B=)H}IHRLfHO5AuOB#z=z} z=qn*J8J6wl>n{m#<)Z3Z@g?|7UoC+6bFcgK*Gr~FTHd-)H>Ax}1-|Wc)oh_UW6bpp z%08yb$vLOO2AGkG-S-}gZk~2g$T9w~nXuuq1|F$0Mx6JpQ0d@B0CB4STY*qMPxxMG zIikpCF_iH|Y#Q*tD(=EK=6<Qo&y8ON7ZIV7ai6+`FzbX!8+B+FYV>MGS#B$QzrBF1 z`Ps#dynR5Lrxj;6Y6abEhAyg=d~jWd1Ra1SyctYPcuYbAkHYQ+kd8K$+4KoYj$Q&r z#GK#Ysb=(M)~7556^t~`oynQa-S8gTS4&LEakLu5o^M6#4aMCn8{09vNt2C6B$7Z< zY9_P)BFs|b6V-B0KP|U~mx1fX@Cb;8`l=C}BJ2*xFHkHhTz0Q3$$#3fz~ergY&x4K zG8C=(Zp)zN(VOth4@)Djvp)1%x5=wI-6FnBssDm*d%VDemf5aS8IPO%=FehD?R*89 zL2A~o5NyP9j8yRU)=gbt-6NYJA?xxo+G~)jJ9%e|;zyi&-4`TbY^@9N*kS02_(Qs` z+5feq7~rZDq!(>s)cNXyc4|SZ<(ZHjG*I25e}aTxq40(dHpggO%Mg?{X*B4YpiXo; zacVgkFk8d@){4-;rbcDdPVOMrF_NQZzl?@562KPPXn5l;5dQuJMVCChn<qi3qGvW+ ztk`^xWrLsWs^W!Z{V$iXUkip^*f0hJN<^7R@UZTnVPx0=Em8GM{-(m70&=GItow7v z=~axQ+RA!Ojhp5h$5}S5*^WK&`TliS);g<B&A~c6>3O0p;5Odq0ktx*YDCPgI<TJN zGRl4=Yi7<*rvT8F`I0&7vJz;x+YbhPX2d_;Ce&KvYp40%N*nk*Y^2)%a8r}Kn{u0V zl#_eEw;ReRH}*AL$vtb?K=(nD+nA_f<l&Y4Sv7e=9<yq*_<>F^EH+U^XevuwKwM(T zZY1Z&?SSeDb@Hy?VO^d#9x(~0Ome<@{?LurgFRPX3$gaOgT0dx7@eMdo)^sGBNLp~ zaWDK_Z`N}?Q<VG!;_YNWfl1?2?hTt6G?Y`$5TM(14nHDQIYcQfR&>bZ(_@_p9iX2X zKvSBIm+0Lqkt=n>KCS>SQi;te1ix7i+qb}Z`mM}9!}0t?dumPB#xB>s;Z=>-`<H89 zAfh&V6CAb^m9UGx4^lAE{)y|lAx?qYQF>wO>h19gXBdSst)JLI$C%ri4w}umEB}Z3 z=sxl_3fE=JZJ!P!$hqfSHN#F~a#2ot+7k<abRdQ$Fk;boYFPNAp|Fq0rdLq;OsDZw zOCgRrv{=q9w2q=N&N*7hZ#N>H7kwB+j%D-R7oWz+^gYP`DjfC|-M};(N=y^=R(EAC zG<H?iPu`|3|B3Ef5!v=AFPir4SZvPO{}pcnYG*G}Nz=;HUQSG`H9js9cns`5I#RXR zAjB1j@p@O^zh8NMW)KnK^sDNn?We;Wl_}~_f>5Ox?<bf%S773h@pjOC@7}MPQl`72 zIY|JPWppttI3jn=G^_3WdKuMdYd-8bGl&)D%3J={y*|0Cj~rEmfj9p3(5cm&SS(e< z11_=kaGzWEUXtCj)r`)w@63|xIoO=8k%yvqn(w4u!N58g)-^9SZ+ElafXUb-mVd0G z(|fv+D?CH8`)!>|`$4tBaud<TlTcXAE%aq5SZg<^EHgo;(bS!r?SIf?!OL1AMXxr{ zZukpC-K@z&);F^z&P?5}#fIOiop%`Iul>${=OC=Exusm~UvT&%ms#x`h|*oKuS7GL z(Ib0YHax!1Aq#8q+%@$^VjQqZ^^rZpS-v$BSoC38;yXkDNkp$Yue2}iz}HbMl4xFV z&L7r>O*-TliLP0puClvFx~4}AT?IAvckhkb(pk>)-Rkn~QrzptRPoa6(PM+b^k+)= zb#T(ceNxS3lvEN+)Rj8r=I?L@(IwH<VmgZzy1Vx6(Dxto^AQuf+VGgTS>z-{YySGy z<u(a=WqqNf9YBtLZUTjT+~XX&P;UHnO71!O%+F~^$xtqejWuoeBB9sEhlYIs<;rxl zx}Ls!W9CiyCW6Ih&{g~W`cP<n=LK~oHrIK}m7CxMxKMO5u}RdAsR&Q!dG8&UZ9AIm zRi(?$y_1kWHUE#II#qEY!WwfV)N)iQAVyOm*KjO%IQ>C-an!%KD)@h_sSg7xq9kzC z&hcwoX#Xw+P(US@WUzZ1cS6PXI~i2uZb5l{p6j;Oezh-|8`C@-%(pROnV%QKGp;Vz zOG#<JB9w|o6zwLzA@Gw!1yi>w*fE=<Fm?^w*EfseYd1me#|ldvrUwBexYxhtC~ii^ zs85XS&O`XN(!{Gm{R(!D1ENj~a!u{l0wKQgUAZuBlYWNDS6#y@3Zl=PhgBX4J4sgT zH5kazblL43{|ID>!i}<@3_iz5pm@q!K-w$=Lk05Yu+qu@OubDp^m{HqyZ=iqS2pK9 zJuCc9qx*=h*XHf_*X;7&9dZ4SHH+VmB)+KZ{O7>qv))NJjmPa^%K@yj+{@~Q@CQ6X zJnP~g$M_OU7@PSZTY#`U#ODk3ET_C3MR;5B+h}L}JdQXAsRYYZa0yuQc~Fr0#cKMs z4nU$wS92t+8qtW~;K>=oN}Rf}7J%W(m0yAh;Su_&Wu~qW4zd-4M1d|n9L`*0wD3m~ zLW%c|r6+r{N`QSdTyZrBYl)WsA6^Xx<^07AiC5|iDTsP-r%fR%qgiR=X8Uze9e(!J z#t`vfFdo6p$-<{D`~ve-03v`H>68`0>t2`j%u%WB;&9sn3cF}>%RMr4YL+#rB)2%4 zR(hrCh_tX0!hDDHX1d&W{`Ki^p<e)ThaBQ)+3BY<F3}kz?Cehl+<*6k%H^EB!`o)0 zcBv<=G8v57N~ktZJ>;6Nk7C7<36Wg2do8zgxpULT{Tw?Di`ti|*-|0()&m)ZE1OJ$ z_LEZ(pYRAnRiSrwk|nz_t~MKj7UZms;7l=|vB+w&9V)Ir9hQnECH_`JwRg=QBb{6o z?Xx<$#_?_HqMh^9WM>=nKTCzpd&{tZ$~m!RANjvLU`7&Qp+FQIE1aF)O~G&9t=YEe zIQzS1&#y$3*eseQDsyW?{%K~c$SlXZ$~M`$h(4R*(TIZ+c(e<)RB>K!e}n6s;P%5c zOKn5J*@@zd@v~*fsHZ6L8t_Le4e`#t@IMu_@Or&Rl459*1;sMnd^y|U-&epqz1MQR zYbXx7O5JyppT|_4Nn9wBAF4fhOxAtZxbViXMA_P`$kXNH??jeHyZ*hM_Y-zkE3=6W zQay#KGj)qbp@o-NRf-Z7%27jh$*kpB#tH8RCN>hFfr*P?!C{%Mv9;IM^ZTJ2XAMp2 z@wq;M$E<kA1B<+9ee7S+1K$UK`QRn}Iu3D(cAKSRWX%HbzGU}E%@eUf1HTK+Z$#3I z_0H=vo7XU<jghG~jwN3E8}=E~F=d<mG^sgy73apL_EyZPo_P2LA_;(;r67oHI|}bg zsO&sH$RVm=<E#Oi%07srbQfI^Oz|5wniiL=IH1iP@@dZA53F1;F8NU9*rHx?bX}JZ z1g>+tP5wEEn4!!VN9?AOFz5c<ez)60#y$zjoc*>3T+;>l84%)d#K~H{udHUbGpv5t zSNq!{vY0bmGS;qX?&S4h+h=geOlQ_=gA~3qXY!y|<?CSYAdx|Vb6GuqZo5p~zR9e3 zj>p_)$IjFn(#eFKln-%B03*)0ri-;1H=o$YXo_}cvS&g&8wRm9{CeV}Oe%Gu?XMMy z&X>a4ka&{_j*mj4TD}$2iI0BwD8E+|m^pgfQrUR5<#UGX!*E7%6*N&WMmJ&J5_Dz1 zbTqfUFd~;#4t&_thW@u^9O<>sM-f(!-v5+d1P63RK8u;qx+2pNN$1`1OtO+b^q<G` z?2mpzw~OSI%e_u2VV4T7=ALU<;rHuM(V1&SX7>&CTv=CWw`MNF4thK7dnWc#+t5|t zlJiguVZl?6*D7mz<f);z?pk<MStmvlaYdVy@TIY4&Hv(uX=N4p|9nW_qbm=fBLMKx zH8+|(s@W$|=?!#Kn1pfHzvj~te58agE!C)w<evEym{4{(3Qf~V313@vNAG8IPFsi^ zkH}J)wCQb_w9t-hr1SQ9hQx4ZL#|(hG*?N!BfAWCL#$)0aHC^gz98g}xcu`fJ~45O znNseE_Th^5<wwe{)(}~5Rzo|oYwk6)gNqaL$8XMaC4m*h0^#aQBR0(KF7T6!@oD$* zqh)!#pPa|RxF#><qefU8y1f*MPrcuos*3!GU^i+GmzYMkB4VV9BatNT!nFh@nwN2| z!|%zt#Ve$n6MNqOBmn(vr1$#U>snvbDdcS=RwkoEz)nzMqCluxz~x_UXZxrQzG|zn zu6Tpflk_uyESm(t+9mt88OQES9~_)Y3z!qXM)QvE@$nvA+}4v@Z{57K$j1SJ2GCAH zcZIe2x2KiAxH&G)(DeGgO0zX@Lp7v<VUMrkC<M3q>8qld3Vd-V^kFD6l*XyIjrOwE z8Zq&;xprLa`nd8vfxMRQxF&<Q+uF|iER8-+{g|p#%$n-zEMGf!<wm$Rzv`;ub!Q4r zWub80wrX7U+^Ig8>ogzoB4y}cB1bMo@Q-Auzl2!`uWc$ray(CODAoY99_vlIT}?q# z%W;r&aJ7cB`5R(ch|+%Eo`c+5eR8^Aff_HaLW-_`X1ednG#@$@B9-J2HFJIwCzG7b zULZI8Sz=#0-`t$a*4PYJd4S$Fo0^BA+&_jVy{w_D%nETyWpC%fm5^SWq^@Gn`{sc= z?^Te3Tb!`up>*(j0xbE6xp6|9k28+>RQi95&KfzMzu=Mo_hL$*((TNg2}kzsPV&uI ztD??xSNRr)6q*aYQnCL!=<bb;ik*K<<8YV$^s=$`Dy!Wl-L|$@osLYi=kgS3LLr!y zQ_P|_+RZg{2Gfu>T9~Nb9+{}|r9k!i!kaG(7f%5tSPH4j*B$UXDUH&-D~v^nkumsg z#Isg<D|Yw-tS&>^Cv>%)@+K>7fiAKVB$6?HM;(v7ifM!n%SJtctRKBxOftuWlgEl4 z#Pu5vCOSwmt=@NjkG|>UP8Ig43eXd{3Culx1CJRuzF+Qb=Ht7;`Hvn~8myF7dmjr- zXqA0138e-K&6U+FL(O@@7z+{6xk6zcwIu2B(zzSAqYXkx5@iXCj}L6ut@XkB<pUag zp@kQ<<p}NYdLb|pDy4BOG0em30}pS~z|XANc2|CYKc-I5ZRF{B`JBUYwObDz)y^RQ zd_`qwM%Fs?J}J(Q(*R+O<w()#R|eA@GpK(CFNH$Ri_%bxOzsXy`n3=JV10W?UFUC= z{p2A0-C;pTo5dGkSl=RnPrAQ}uzwrKh?j7NG?7CU79Fi~l>7N&K0A~VPFqOB<z^Ey ztXcLCV)5Daw1DpUcB8BfePTaUtTasy!q!Bj=rzy`4|j=luT*w(UJRRz^pV4qYN=-3 z=Xw+Kr;}4m4hkEQ2u7^svj91o^iRTjjq1kjKgIUT^-ui;BSR(AkQahROYg0x3hP_& zAg@q@&_9|Tve458wmJJ76bgO|j43w0D!c0^GS^99K6_+wDAecXjqTlR%44tAWN5)- zp|)el*PWdQ5PUXiLP#;|;qqpb;g+kg_x=miR?#d>@``h|5`GZ!fI;laL5JOCYRAwf zhxkog&|bZJ;H^GE<m<&V>YLiH^m)TuHl<Q8toX9zf(6SeMa3(xeOO+WZyVh=(2Zni zq^1_Jt@!_2PyELe={wHdIl7GBi<m>>S6ujMmk^}SFM0d}m&onqDPfS@Mmx8Q$9FnB zua`Xz8Cf*W+%XrgMQyUF`9y}lcPk%MNriSfj(5G^NDCrz+-MIW9h4NciOLoS$6xnO zsN>?*@Vb>!QuhL}W9xV@(eKm@Q?00}@9UIF<Bm#(JumDnEyR<IsE25#)5se3TRmS> zE!W{c$)(wn^1qa<z`xJs+xC8IQ!z_Gba^8kQ5TqQuLmGBH4dYsTq*|KG!6bOgw0Fy zM3grPwqOal#>(w_%wHmHVNh$AS+sKcogvQW=_{+o0Q$G1(u<|~v9A2jkvk8uXwIGE z%k5iyHH9x$60aTFz6k4+RKctcohk?UDsy9ZjltyQ&8YL|h@MJwQC;?AEP+r{uZMX; zU7Irf*1l5Tzr%MgYs3p`+@+>q8mO$2<`o3~#O>YrX+#+`?fPlz^SylXLgkyQG1zGU zRPZ2@tGR+zlT{~ky4q&u)(()Iq1^bM3Eg{fQo@sqnRq8s8gdt>>Gr<K`Wnp57NgfL zk;$n?z~EGVEAWo(>BIJ45g7Mdsg{{Kx~iP{AJL4Ru-KzzKc3MVN0zta|CYkv-WXGH zSlNUdc(<RWBma)8?2h%HEf>=6O?zldC9Cmi7+Y`HJ(Tf2il!vGZ_5kun${{C@<wJn zf-qhuqXS=o5}Cfp0ITNwwD$Kd+#_r8+tE+(LZcIk@yhkJfyx@&v!fN5e>xyCIzI7` z_4jWSL%EbNl$7ylpk}hC@w8gzIcui;`HuKY4Be3r^KU~!M-<s1E)xr5q5+gOXJ6S* zE<>W9PV$xBr+&DeD?9&=mQXAcE@c!WRX38BVUf&gYfB5W*LD?F<+)tA#-Dw4l0uzW zIAd?&x;;^I7!&7$vRy`I){-&*w3>ENz4f|B=W%hETr*1;U3<O9*Zg|ssrxRxP`^?> zyzRE@pnvU}7YN(J^nbDImt5kVW-}NdUT%HuP@V?EfsT8QnMyIj%hJS5L<x77jDX|t zHae|jR!yg@WZ`MxW5rg+!#m2s58O@FmGgR4+ODQgD&5Sa{1jFA`Ni?JcgSGYS>V~? z<3~bZHU{}yR9jie<p6(fZ4)c%UODG(zf^Pp;XS_ZeYu&2b8xs2B<yjYr;yl$n@SHc z;ew4<J>_rM5;g>;`>O>kQ4eH(it`QDxWfs7;xDx6g@1tWPAT?NsEpPJ<XoGtVX93x z4Pr1c>WBgBY|p=Nv69+$wNDiXZtZ`4B93bFwXfU1Qfz{#&Oo;x$Kh?)Stn)9o~6rh zHSLti)J%IRy0dSc`=UR0UijR4I_nJM9jKUUk#-=ZA__+6H+CfUl+z9ZEFAdPztx%i zhPJ2(*-v(!t}LrQGqWH6l|AQrCZL+3SGlIH`XWeb+xPUe!;xLUDW`}&GhzV?p|n2` zk{T=+kz@9n*sk&xpz4d}dqaW~0Yzvv6bwy6KXKW&xMpy;VvBda(%APo><y(_^k=j0 zG8Uv=1mg>=OxLbqY5AJ<DJu8*ty=4;irCq+kTY8VrmQ*Q6xQh{9mFN^`u%p`cQ@tU zv1bdL@u7brOVkCvGvYcFANCAGE*vZdvhwk_*8NldP)bp?`gcWH47<Y1FlTTXN>8t^ z3Prp_aUc;(KD{fhNv%Jh)svq3D7?}7^ZnO+8FngDuO2ZfWzexFiA68<=!avXJ`zao zPqAYc-7B;WJpbxHE(U<Q!ViznDBdZbrN5~)@m|vr`7B{p=^v#mcj^@RE@PcEe;*h7 zaCIz3tPt7+Ucw8HJd3_lA;!C{aRwaxcT;|1d7%bVheT?1HdLy}=>PdN{^%=1`<i%n z`xH&u=*ls$+psmrB*9BC1RoX0h#%@VJ`&44?yMwiT8QbJsc39)N*=_0HT;^Y%hBt+ zoMapy85T~l+~qycPO-oE_;hZ#){;GGyz^pRx>ICKuq!Dq(9q?+&>vDe7rmihF&9h6 z1K5weS!uTD9%*dQ!0}Bi^KsVEBvVWh+yq0!A2sf@%ZjgIcOS<lW^<O}zve!+jPtSC zxh!PC(ICqINs~0G4uV5U{H`x+N{VoT!Bf{FOy9eH3an`L6lH#_zmdbzKWG8~IkzsI zsMejouEZslq_erTU=1xT$McBP?xw{SfO^9zknOl_%1L2mA6zlp`~E%&dUAisTfxS= zj$<odmi8~V3Kd=dWt4<a+1!ceZ5@)L&(Fy}^3B&P)ICmD#him8xe-`0joOpS?92Z} z+M9qw-M0PX6;Z?p*%^vZ*=0A@vLz&`kdTm_>}Dh}6h@YieJNz$x9rQ5?38^S8T-D@ zSbmqf@B7j7KJWAXkK=zFb96Lj;d_0r>s&tP=lq<#`6I!rQ!mzj+H=SE9JNwugu-`{ zl&B&;nWre~s1LsgV(iH*d!1QUPQN&xTV0~YTm908o8wavi(~8Cd!@IThX&tjcG+PL zBXk>eHS5X7`p9ZpsP3fQik}W3;|?>k0M%yiOBXlRMX@OoLqLIjL1;q4XlGO05mmh_ zqHD3cpGvQJmimHRkA?lJ|2M)Th}2|AGk<A^s=~uTyxE+!4z~P-10{_s3#$Hk(@<w; z?kbXVr2kR(Q1qg`*m!M8$ucZknoY!P*&#vh;Kt_2_na$+`uN;Sy$R3nXk;#);WpBn z@aL!Eyj_r6y(e)uZ6R&l{mYivtFWgI@oeNz-nYj=3Xe!LL09jc)26p^M$EUlSWOER zu2Ce)4la%0#WbGCQCyj>I>5zL<96~${ctx<6U7~LsDD*?AOzjhL-X})ckKDs_gmh5 z%jkTdnVDyQ+N1uw&r_)gweFTJF^aZZD9K4+JKcZV&ISMarl6rwk5XaJkA4?m0$4Cq z;|WlquBuv4F6g@X@^)m3`~8}Ow0>{mlI^}9D+DU`{cf~aHd-O#FL(O%J<5$vk_vm4 z$n3WkI%An#27Dl6%e4Cg+4hbV9uH~`c%64IMACh^W5rrHx}5V<X~ebggF?T&PBX|i zo=3buIZS<G&U$^xF*(WD0qG+lU@dP`@b&T$gq^Lo&08}2G3N5d%ww(Ofx>B=Zvbe) zk9qR#>0v146Mn$?C(H+Yg#M&pinEj=gAkd$@iU!~{Y<5F8v2<!nI8`ybw4R>R+%mx zN#+6C-`?2=Pn<$w5?=^Aj>?j|1<Yph)E{jn9OJspUR0H>d<f4eV`-S=VQsg?`eV&m zw^+I|EbrVB!43p)#*J4CIj<^ir9QFA1H*CQ-xofph1Hn(Ar3{f=&<eDLLc#SDg8NI zT67gw?HYUWcIX|wJ!1lVk<GFp!I$Fi_w)u{`a14erX*sB4xj63#qvde4(=YwNjEg= zh%~Q$*?d%z>|{!+;@aYi!GyG9Z<odSN*i9$&3Qsw;oC<pkzQqF&n0p#@#LMoO`DUS z!GNsbIriu_K!V|V9HL0gTe}SknHP?TZSx^kGN=OSTvA8G)Ae1=6MLrJ*OKj`rLqRO zk9bf2E7j#ytvm8JYD!g>6r*Tpr?mPa7_K^#>>jM}RX>Th2GQ$hpYGVuD3YYXh^H%r zd|iY%X(imn@L$$}iVm6t-wi6aKu3vUm8`)}opEkopQyAvJ|W5ZAyu3S=_W7j8BG8m z9yuwgCt-3T+)-C~sa+_3y_;MbP+8#p<4TOpW$Ot;q|%EUMx&Y?u*m@pj<?8#Q(J7S zvgfR49GM1_6dGzi1SY+@eZklJb~pFW3+|Lh7}VdS9WEL|JMM>+JbNvgMe7$7si&<# zUzZ~(+zOkC0MfD&_~8+;Lr^vA(!cU#gn7Qd)3LokW|%AjTS=l<BbNN>;a9ftAKLkc z2ir9VtDxl7KUkcA=54&=pm%peD9Ih9jaDWxw&msf8yF45N%|0@9t+kmU6=2Vy8sY( zO-@jQQ-mtPYhLW}qsN8&TSG%ouRWWwGLp&rk2!1V75oR<cQMm55m)cg;4QbtBoG|C z2hqT9P3?u|{`M!0mw=G$K9OXT<eu8YYp%#SC!p@NrI%L^A4LG+VeZ^6W$Go*9RZtF zG>Yu|mh7YfeivIZiMhayDf5WR4X(VLI|m!1ttsqZsY*)pqYELn{GRiZ<}|JqcHmlW z$e)^6RzE0U3;Hy(Z;wc94dvDhnk8g!lGg0Sbu_7o;C1^K6{TpP76p1#_<H8bpWk#- zeId%>tg=Z-Etk$TKjT2jieTw!80yO(WT<lBmtvOp+|E*ZJa{G{^JdBX-PG>O_43rQ zTs4Qo*GuV7;?I(<PZU<%Y-89e#!H*};;-prY1;cc9~$K<6x3z%W1WoJJFEb%KTxxI z-LLP*4v)I}KezIKA!EI&t?`v5N#+lz?Y|b{Ny>mBvfI(@PB2m4GE%tYCN^kxEwvIa z_?55K2gb18MWfn38>!mClxG4H#u>NnjjnWP_mZ=4mC}j;!AsL%4s0|ciU2MZf`s>N z4k^@>2|Ta1ZxAQv;C#Wm;CPE(^!$3g9}JU`rbu40=Q(NB>FZVxJ6rOF8J7=@STQ+g zJrM<0?oSb9AUI{0PKx*cd5M?S`ipn709^dujR_{tVMkYz%i(i>Z_i)XL@j=*jGZUo zo@bxSETylSF(0WU@fCMr+x$qLhZ~>NE9OV*KWcyeGrmwJ1w(pN8MVZ+gCMcVgmJa0 zImh1c`oc*AB=yzL^EwW{(#1#2BGy^QUjGm0J+YN71e6^ZE95-Mpq+1rN#Qe8W<I<d zXHDd*9MyIN{6YonO&Yt}VeIe}_zs`}7>aChCz;7yNfAimv(}=Yt_|8{>VaTp$nd>4 z;Phc3UA3>+x&ziR>~^Lyb4UTvQ-r!(=fhfPabkL(=-R#ajP#?3;q4mm*hZ#S0?CJB z<aqm%&R~QXc|gq<bwL5RJbiNkRJAcPnLqf2?S#dRxYXkpAlr4RR&6S|BQ`dFCug|@ zjQ7$n56S{y^kQn5dxfnm<A76NaGu7!992KfOMhB8&07GTW=*yeIGI)SkEM`}R+3em z5cKlz8I?O)vRIKP4%EjD$$!{=-o~=5r?sL8^_5|EVWI)`Gulwx$L=1av+Bb6^*jy6 zCmSaXh38UC`s>T(4L7>#>4sT5?9CORWb27HOoK&qI|MjNA-fF-bESkWbEp8I_i>u~ zXv+l!Og^Dw98{3TXDoE4XiWz?pm%2*VmExw;ai#K<e`+$Gg1s=SwMYCd073s8EpEj zDPljJhv^dMS@Z=1FRP<Gx|ZnLqdjs(Zp&8%Wuk9#3n$~1c7Fj+zb_b2>+%i^$Fe&V zC)7np8vSD7e%8PpmHfP?hYPcBj|DZ1A|=rcDsB8<l%(Gu(|q}R<<7p$$@pgrc?<f! z@UJ(Wv!i)t=4#E8Y?t)-Zr<@*^`CqTHKq3%tsUXWC5`P9Ztox=+ns5xH&OScWQA{% zI`Z>vBuV!Q#Z#`DGil4CVn#6w8)=H?@Q2T-?0XxCcV`%JzM_3Sx4mqL*JT|l>Ckl3 zskT=<u2iAY1a8r68KGkMYs8vgj57q8GQs(2os1H;#2EKNVuD~=^jHOE4u?FHD=a<b z70Z4nOCMxkdB&9KNq-uj6P;4#IVE)K$?|*;f35}DFCOpRKE(fXohQLAdd+lFzu=wX z8$=LSg?Jy}mf6rSBKCE*`o_El0Hq7yU}GiG9j#X+?7~(4v|Fj(U^K(Lq?YSyW$td3 zbh4u^m@$It>31wYW(pF`DLS2$yT<R+6s#N-H4E&7iy{AP(f_oLXS_FQ!Ah3p4u#1K z6No<dDN?KF!FMVsNuqn@1pW5YA!vI_2^ih--2icm6j01eLESWXev6S~pZ_N5zN2t? zxt#*s92+Hp)9$eE4Yuz^R)+_2f9b$CaMv`mXRsTmh|7<Od5A$xQUo?mvb~dJo=%o| zz9L8J=!;30X1e4DX{>$s?3}d8ERrtNjb2Ib3O%Ji{kP9_Lgc&hk{d;G_v}#ipSTt@ zl|Pqs>QWs)P+TxVyMTw3L1PxL5jmUDT>2a4Tq%F<n=eej$o+6hwww0IIrDFaxaiEU zB}#768TjKC{f8&4LWCDV-`NeL;eN7uUiL5bOi1=oO${0Bdqv@oGVBb-ol!AvY$^Mi z$f&y}GhJfDj#zU?j6Ae){Ic70V6cVBIotF!FLNY>!OA>5Nh2!3y(Kn17HfVD&ZS^D zhGf$r_34LjfI%hpB0GwkNiqv`K06FHQX580ICFc6x!DH&39&f>Mra-z5t+mmcSefW zCxJZ+g&ezc(keB1A1)FKvE;AFDad$sDqZlEmU5lU2-8fzM0o5<G_Rc*zf;8iaMfT8 zOe&&8Yd9X;HL_>Ik4DK-Xq8=qnl8p1UqV?G*4iUdv)U=^Hn!tm_@6?)3<`e=UoEX2 zm+e}z5!V-1YIpe9zm|rxpY5R){FGulqhP>gklvwTAodh0-k+9A9_r|tMs3nRqbAcD z5c4y|Js4x<?<+l+ED;=iX#*MLt~xg!X=oLN=2W?(NOX(kQ-;qIDAmhW1{*@_uKR%s zdcwh5Wnwe(UQ=?USR`{0f=QdUB@ZGqb#<oBGbGT6rST3eB|JLpi4jf~I#(Z?f!m<f zqD#j&ug96F9N!GylX52_b2++RFXL`2PK1gf-YXnGdx_UT2;~DT)Gn9h*s(QbB~(3i z^2pTdQ<__nAOFImlm5pW!4qZQUr{jj4I`Kef0OHL4g0FRA7sa|6~>P5+UdLrZA<}- z0Xr(m$u4t~TX%`29}4T<O~6F-K^(hiDN&keF;HPz#9})<GuBw&1-W6?x;WVyYF`O< zpQY-OsgUcvBwQpQA|q+MR)`druQ7*W#F*E8T)*8k#D$fSdH}D{sJ}o3k3yR4<Y}ld z!{1(dmIA?^L2vjfUVA94bR&&%sN6A)=du3h9cKSKKl0Q#x?I~M8}<KK3r4|H^M{*p z{`HJ&yP0s>Q^!mT7s>A}#MOECkG1e7qyM!?pV<;l54!w^g*oOIYim$ok)kg6%9Wh9 z=L?@fzeRw({`{P@wGk}s_QjJ8HziHv>CF_#XS$C3VY1)`+2VrIzCd%(Mo1A@C6TFf zwj~g>krezqviURM%tM3Wn#0;+Zn4szFpWk`oXNK4KD@k_H*QFs$qzA~LGlEe$+RQa zZ*n*))YA+On85;Pk=AGMd0?<RT>lnbN57_@{frQl!^!AY6cu7Pm?VcUIgfyCyLXj9 z`t0$$OwD+zjG8B)IhW{$Or(GP4OE68$??~%?gPiCIT%oX1ZaM@yj%J@#%dDMNvtN5 zmw>==+vfoZfTx@D%dvEY>n&Gvhfp#(7|lD!ccJVV@H;-2&}fzQv)(iQ@9PM58-X`n zGXE74pPARhHVaR$k8$ma&Jm1tCOA(|^p|t|R61v6p2W9d9-AOCQ%|=w3soJoyCj8u zEVa*1Zk-foAD*}R(Y+Z-DH6y%0Sz8VV+k#f7JX)N?nw&`QQC6{zfQhe=cHM*45HpR z&-4?Y7YRIz4)o<?#7&6ZhE9L96((O#)api=e9@#`RN8-RcFvl8-A`m=HIXMUU@k=@ zumNboaY=!Ui<#u$?#sJ>n)OG&6Rxpke&4|p=Y2^}C%ilsc^sXrx2>8F1L{HfCCmWv zlcNN`q#hc4uLGk|0yvpMN%KE2bYQ9;DW!>Xg|ql5kkddZ{Bhn-vT0iVHvYyw_XGaz zyN_GHUk;O%jL_J>KAkJ@rZIm&1(VNRwQie!wE8$5649vz`KoW^X>K-Fe!0zCz{-=A zCCIHajVHV_#rL3$J06zj3lB~S73fT1BMK5U3tzv*%wfWo&m3Z&*F(dMbnj0#nF(bG zyUgu#a?zggLK#QJM%pQR)^dlG49LE@PcVF^3+X<ST>hAJzaPnm_m{)a2?CC-^I&=k z=-N<}VL}QlAiuwyWi%soN`h{7`YK|AM(%@EJ+qq2Y1<ig{90t+UVNd}9csSwP*X}> zabmJg=fNLWF2V%PFISM_#M;kqLn%FJgTa#Divf;3O2g~gRgJ@0df6>in!V0`RCU=t z(RnyOXE9%iH+m=Zu(DHR)YXJaOYG!Z33<`?PPBh(0sJe6ra09Ucp^9Z1~u=~#E3_K z?&?4M(61+JH(33+0$<kyxZstc>Rbp)g3?L+BZS>rONDXM2-d%o$V?ezKhr}qXM~Ls zuebjMvkApAZ6pO2%Aw20k<B||dcCv<NxZy7Fsmd!CpY%cC*5M)?D#0I_nb_H2?>U= zkmvp<wM2lU*%4IgS7Hh%X>Ix(QsgVJ;24|^!I)#k0!d9e)A;<W7qm6#gODs0AxyWJ zpWN6kGdS9@D!HVAe^Rht6Q9(Nf2Y{+!DChUyzd)gUDFH4O=G_u1#5JYFs1MIU}nY$ zyu%eg@8$JizG`R?9CI~%?PnbB)R0wSn<DjXMgj3Z>;^T>Zx3^y{lXuC^#AlP6sLUU zKr$i5eh?Z?sv_+~mtw>OOO_aBZKrF|M8X_zY|^ctZ+0M89;AQ6IF_MsOU#cYXe(B$ zeQVXvtx-|07wSAs0?#1DK9SiV#Ta3oZ*B$}JqiwE7nM?>r?<N#Pj9bsqRBIg`pG@z zxq7-e^E4SxbA<$)W;aVq9!gBO9TGs4(1~)Mn<b{-Y!G_}!A#<IbtrH0wl~}l^-n1Y z;c8ucp%I-0?kvRoXnytnrta|k*O*HhV$!O*7{uPPm#5bigQ2wSUlgF<+d|g)%(%n< z5w;xd*_7b9C%TW|(N*hP#`B}ux;K$>iW7n3p@n~(fb+j&nKvhHeK_WH{&Q5Ebzb?1 zd@;hh{g&=lC{T&+3NE)u^Xf$jgcv0tw3r>5XU9=AgZzFhqLo6>=PMIFCM}&%dwayj z2Of7Jc)C);`X%0+I%Lp6Qs5vzxrsR{qATc)ggqxX+2!Yp<ovcYI}qlmt(4uzX%K5B zA?TSxBLJwAt=9$%tmQ)o2h!LFA~F0#>!FQ|W)S!QQU+%p*c9cgI+enQ+el(Ac<B*% z)e^L4xhxxjQdlt%68#qMxu#P3CS&MhjLox%tGXp57g`w4lmi)tF!<sAb_Rj!mpdsp z$>s+NBNG<i={5HQWK&aK$nyQ9eBzxCs`pZEs^bAvZv~1hP1l3g{@#c8Ar!SAEL4Q` zb7(cFw8~uVbnYGZKHg-+M?eCpmMfC^)5CIyov*_SUjV-q6gmgM*yE?P@m?0)a=V}# zV*%)KXmtDf+zP1w`7N?g!fEdQKGCM<`|U`?V=!FRu0{vrl^R>J+RQlQJhb084?tNp zr|P3Ri{G%J=jw-jFj?>H7|Dez{Ut*-F?5H3XMZ5N`bwVpk3VOV{CBu9$}D01e`Jw~ zw~i2tTlGBbc($`q62m(|Fl#2HeNr%7d8<J`X|$YuntXFXAzAJs@k4Xc#a@ixPC6fk zbzq#paQX$H1?i?ML3uVXWIMe-U8i;$e?s;LASV4Cmr~l@n2f3I1v>3b)(d-X9%>qY z>I@cem>!<+(YpNxCrfH@7djVmsr7~)oevC~oEm)4&LOw*fp^ZQUlVB`%iGSm@n$Op zBdDuImkK5e;|NS*VDJi_2WvUYN(s+?WLbbt>L{IzJ3pb??HQ#GKUFKi(5&Po4%kv} zM&Wgv;r{B~X+}oLtu4xgn$*j~<|#o;DwQvD_w;{U<t%+xTnZ%j+s9@^-PZOwPUlbm zecUuj&ew8SsR$#Axp3tG`gOk*p>^C;KW+dbr+(e?)Q>jSq=o>wkwoeYCzDGkkUP=i z-WOye5w$7E91&ZS$b3}w@J{vj%pd*Zb=bjBm$7vmC~*(%oi1Elt~n@q$1_N+yf9+? zrfu=VjdiOO2gZTw?4e3u(i*j?qtc?f2iNxYGHArIpyC`3%gg*DkI6e=`<0LM)tIF5 z&>T0i|MNtLa}eI4@U>SE{aVA?wsuk)7Y>NI(nY>-98ypRYH!}<IzvY_m;te#K|+Sl zbbRhiF}>oL?0~6fI>M25#i4N00`x92UuFOK@&?vVaX-WCPOw5vo`#I-AXgHa`~@|z zvmdmZLSHIKV<;Mw%*~*oQ$y*{4RbBYJ$Zv(zGoP*E78QbmAXaQ>qbRopBl1+fm<{A zcIU<f7)+xFS}GQRCToF!N%PK?Iu_qA+J^`G*>^s)Ji-G!xgW4}XRllfF9m01=(Agg z(q}d2vVo^D1Br5GJB!iR=O5^nPez1}yr7J=MoDkwDUgdF@vpQiflQyO-E?SzDoAC} z`a-{tv8=_76Oox5U4ppVVO>N4T(Rf%9sX_k+>V@75ruDunBxoUg0CL|Rdb}+`#Jy- zvmdNyNJ~22?k*Yg8l%qDxI^UgJfI$o80>A<C~MQ?*)dQ$gRp7WZ%BT<I9OT?2CVK} zsfFL3v(2sAs^~bF(nj4s>g}7N!Vf0j*gbqSoUB6{Bev?Scd$w#xtEvXlPwgfr#Qhb zD}3xG%F@fe==*VzBy!0oz|u>9J*@|z?GQYEc@mGh6lWcRI&RwkrwwP-KDzmGpMofz zGA@aWu~TBuT7z9!I>C0nIVxsHn>jX+rsG4BAb2flbO^v#V^4o&T8=fFMnlkF2)^zx zp@z-o*c4>ub}>Te^0(#U^pOd<s1$`L_61}>nOq(cj!Ro3TeOGIgg{;m@bj(tijQ=n z*al{N1aRizM%C%i=Db2*lerX$>BLtc;!vqB>Oq=(Sve`mpi&nO7=R5-rk?;4p&E?x z^Rup)eY*8mCoN0(OwT(#8w&zr^0j9nFKMscAIFJVt11z6(Z9k1VcMRXsOkX(Ai{R% z8#U!!@K`L4WCjhL8oews2f@ZsNgJuuT4ftdq}Bny7ie$j%u080S!oJDIl-x3GD+Jz zmbFowGG+d4zQr2xuO3M+?5%g?(@yghRi}}iQ$M}c!$C6UxJ+m{Xa(73-13y12mQiy zfm5uIVPPE65OCuQ-*pX3N2N7Z9Umc@IDY($x@0{Slw!TdOtn4|tgRvWwVgrg3ybH< z`O1yStD&AZsBgbiAUI~Q!_N}_!u)1ov6qyBi=LypK(DFonCH6s>?oUc-2ZWtUmoH1 zHZzyGX$3Ec(;@5?A2<8C^`mKO+Xe7+Xz8do_Tek0P(fai-a@EqJ0Mm>qbL#PbPXt2 zcwQ2ye&2UUm?ik?sygRT73LAB{^RCN<##qIe4N28>C&y=f<6MztbGSU|J^8%80!o1 zFJ$UTK;)$WuP%b?zIlpwGo+VIgsBh$S0?!=vlwCz;`K;Dc48qv5!IbMNWklQOpEG` z2?G~vt2jxQt*e=%2)y+XrLTPCn{_&?ev-V~5Ridf@V^wi;Rl+0I}o^8&OS8v;~dJ> zjstH*)9VY_su5SVfU;3P@SPBy<fegig=$a%>Jl0AbOg1?cX}5}V&R+LBewv@lYLU# zDetA#SoMAu7_P7dT=@_fweYs(yRPEFve)7K^e$?Dr2$gnyg1lcB6KFz+zJiqv8Iv> zc|HKU{gLx*4Lu6MgD`;Xs5={Fc5b7e_U;2Pes<>|#w4iFI=_j=4-Mv+N0>ncL`zPl znpqJrY}v<Hm#o6?{u-H_aCoGO!5klQ^*hwC_T$6ixueSe;3u8T*gc-}=ynj7%&lZJ zCXGQBAcI>&y2TPs&+y`T%bjLE+85p4$AL1Z*Qx1PD5INI8Qgw0PX;ucZK6+qkL=6V z!*;w?7a3sR5^MSya{Dj0Bs&Xmn@=2F4mr!OO)i7Ln?UF1ACP;02(W2J3hX4yC3;jb zd$l76cF=*{`}maxQx#<Oqbh@ix3dse1Hj%GoOBs2{yU0ni<a&qB4Y|&87pmrZEYKR z4ZWnLx%}M3hJN-6)v_&ZtXGD**T(8A7G}`HJ>Gdd&oMnhgwoXHd8j0-Se6tmE|Z8_ z^>>m>F7Tt~fQ-!A@OC~+eYX0)nchDRr2M$yud2Y5{&2s#AdgdcQB#lwDF@yNHna0Z z1M(yp(J4SABCI^qnchGrS`R2&!4q$2K$V~wiOWOXAGLx`pT*Q8=-$8>9A62dLo4^0 zuy13fP;8o=NX9Sr<CB#We%;7WMp{||W|LWs0I?9`1|r7A&O(3+?WbeK+F3T)*l4R4 zgkTbW@e-<YcY-pIQv{B0`ELbCvB`-s`EW^<WKsBfY|fc}&+N-X!5%)<PP=`YCcy7m z12*2{k#THknBy~E!|LIWx1tx?K)3$$2smVga5#X9lie3g;u$8FT46mT{u<{Jtg&_o z#?yIT7<b>C<7oN}8X7$o^3hUq*S}JnoBNS%Ia0a3^1gEEy?FwB>%rr;S(}o9r$6#d zlq~!6v_cnAG6#9sgak`4xI|TctjfbBQ_n?7<KyWJYBB_HJ?{ZmuLT7{BU_K9a&bT? zy(q&XvB6|mK3PW$eJ+{-A9wO(5S+47hzIdhCv1lm{UaY!_oK){d-+tsG8*c&fUn(4 z4ZAH85-nGI)9DGt3(Fr_rkt^Mr?fwYgOSl&uPi0*X5MQHhE=@b+`NMo85sqgj15li zlo{pfF(M@$Fno90H{gytsJ_aPJk=|j;fN733vQ5djE%Zv02r<9kdTh~zT5=r3NWeM zV{dh8Jq0wHBVrhZ&8N=%C|_FsydFHUSD)`MdAmG*?r*$_E9eX%^jTAdn|Pl~lYlRv zS$KbP_&Zqt<v^{J0oats2Kqtf99|i?{rpfe7xvxR4&9!Q+>ee%>49mXi=a!bSc%1L z_*q|$sfP4^x}NaLRm-7|KBx@6(qQS;-iGS2iP{E0xYB@ojgl4)%LnN!gaj)A9(mT9 z1WYGgv#w;sS&w{wIai$2;_}@;>ycSzzu}c`__#84v+*JZjU6@#efGv)=ETxGSB9U5 z$!*x~6PXd9B|S@P#g|cj{l9y2Q)2IP{`K||J`ZLopXkHvgv40v4?2MrXHr1YH2cB; zDLjQIFa=`cZYHx4G!KZUQZq=$$E`#Fi+aU}U%^D}YbK+b_xw##$W5jbgAq(ZmsPsC zRiZmyFfuo5A@ej*0-_{v;X!T%NvD+*mI_Vi)&x?(zhongH@rwekOeNXr69Q%6$1}G zuVgqkLzR|BE~t~>W{wtPKO^+c`Ag79N-u~u#zBj0Nd%u^JM3`J@$if9khKMjOy?zj zL%hl3R*Xp7J03j$SH@Rrd->jsNt$s^g>46z#q>QqHlf@r?*-RhtB{7rQCP^NRR*V| zk5W;&c=JO4DrQ-EEe&!|R+k_Zg|coAOgpL)P4S}$&(jdzxl0@z8aC?*+Jhf}30?aX zuX=!7&Pd6qyXE^Z<<G3lz;uclseP9#Hld6MR6%f#G!4Ili-S54j%>pv_9k5CGScYT zuP~0;qs3~}@r$Jii<QfWQS4hKmXZ%@kvN!tgFyuo1}`=(cG-LkfzOU~J!P{!>Ve|y zH4emh)Ss1>7NB`z((2Rvsct7_A%N2%(?r<3vvzB^Fk|d;WAem(qous6jc&Dg_BgWJ zMqmUkJ4p|%&b#~sb~}Z`jUJ(eAkoppH_V<ZY&J4m8zu{)pEw(!SfLpIdPVua5YQh` zLc8dPlw^_HO+6rnVbPD!`7<+-1DOfgTP{yrB0}VGt;N<{X0G0Hym*a;5^4`L0v0`O z+bYttrMD~%q@QnNKLPDO&@8Q;dMH_K=AwIjhsm~bVa?KdF5Kc?_8|Gz!UE?a5QZw* z-<IThf6wGtuyV#*(Em4%H9{PzXmoAw5rvl6_xN$x$!mltr3y0A&zS00dk-zxNK6jx z3>7PQ7^S+~cw~-$!*Njf7ser|^kOd!O#I1m?1GOFyprBa41gX?eyQ%2bbPr%%FN>b zrkS61F-Z{`B(dWMnVUuHZ^&K4+fzCh@v|VzH_XPa9(G}xclQ?ZR;S&kNihRyfxpTf zo`C_lS2!uS%`Fy%z?YJ=E$MonJbO)i>OwKM6*s>qG2@I(m=?9p8t!Oz^rw@Xlyu&d zcKXtwAHuqn+_Wn|6bf%vax!As5GTfm+uN^vsQ$IV7X}J-DJ>|!Kf<=dM|JLud?A9c zOlA(>juH9(_C;j5fwE0{-cXT+kP_?uC<tvzJP)PLs5FU=2)F1~wn@i1tkd{$ovUBn zm_^}Q>RDw{jDa%liE<kDp)#WG1<-u3fyei1YYc+^?g%u`u=DtdQ@m%=I=AP(51DL$ z^nZW=A~kNJ^1`6-Y4He%K7V9rrxAXoBQ(2<5?lL{BK1gg*ski(hf6z||MH+4)*uVC z<s)uW7=Wndx}iE9o{3}CJ<ThAYtWKUawd^{skt~;s!puPcb}YDqJk0ges@vvgDJ(= zxA<`%NC^nk8Y)LYBubNw@Lrz_*S@WuDt~?KL1Fyn`cW`+(C^a;wsb(Mg|mFJohza@ z$6%<!>6^F=Y;Q$Dm(BHkhri5%-L<>~@Y{<eKWZ<45N~_Rd`CCqP7@xaVACf<{;IWw zUnF#$eK;J`m`i#?2KB#{4~{H4U-^do{Ew<Pe}yQN9^>d?!S2E0v9XW05S=+?d(W1I z=B62kZ8H`}Y=2@0TGJAW^=xatme|*ve+Qaej@a29PAk6^lNJY}3m3D59F-gMsg$_^ zuKrK7t@)H<ytvrE{sTVbsTws{gSN$50!Y!3?mu8Z?MsuFEfbO!^F1v3!Z*n>vJOV1 z3>>Mt(MF(?*N-%2YS8r~v1aSo4h@PRmq828(k~vgK2I7Ze`f0DZUOl$kG7{B@zzRE zcu^(i6Ei$e3^G<}m-g5yVs`GY)4dok<yHVR6!44LF3Y3UGB(3vH7`7Y(B1I<6*8;Q z&u&{l?9&5Gu?yNe_@1rT$5)T?kjS&mtvRU3)-UhIztRAKV{rqyWUH;vN^Nx=WV=IZ zf1~H%AiC2K{$CHHD)}!~f#`a|(n(_;m5Q=*MhW3La|p)*n~K=R4f5bFtXQuA?HVAG zH7_U##!CbaAg7p&5@7Zc!(1KW14t+?_6=OMze^0%?o8V93!xFimz#}SVV+$|DTeJ_ z)6u~KmvfD~HM=9jx^GH9(SI~YM~mwsGB79R76Ig!Q1>~CZ!mUfFIKc!%6=<7p4|W^ z?+5Gc;VaUj#VXWj`W>)BQsnNS4$9i&B&|<2Og1gc?p@6`sNC|CIh{=Qs>KP2*Z}43 z9hs{jPZWpH7lBz(BIcd+)!mEh9Ua9$#PntldyqnbwLOJzzU%x<*VokVm|)3K*)wgq zclfWaOrmHPIL~Bt{YdZ1ac(@X<hnWab$bX5tES`yp&1fr3XJK5?erd&6A+xu1G5uj zfoXq3lyHPTP-&op80QboPo8BAQXI1KulGko)!7%5TLgkhuN=M%353741oR{gSUG9} zl?pV`zkIyi#wK^k(DfQdd5TSo?t(Aptumo^it*gH8Ey5ubks&gZ6eoZ?8w1rEMphM zvNaGee<O_oZAtBOy%}M5s~Ege<6I|IU}LS(LW@9`N`30Gjix_W?28+JVS@K<0d@&6 zE&aLwf?bLzCfgmJOdG6~+h5%58!d|GjAioZT&}Wxxj66~!sxheZDZ6b`B@`(l(XNh z!LQ$dYPlE)PY(fEn?WGrvnTH(?ZIq&Tp=c>>glTyq1o#G;X8i>X5l=4C%ZWV6uzPZ zPpB9LpZM2Avf3<z)NoOXbauJ017`Df_mTb5qwS^2<qEvkO+22)4%%MpO`wgNgoSZy zf9!v8l3=)swbG+tl_OF=6nzMC_U$2m-!9v-2_oBEFx<r8dDo3<FVGJ*047^uY1@#K zz~PsGxmeA1V-4JCv7wzFSg-iJ#|NMV{G9lJ^MEOBsa^NuhU9sBvTCkt6b6rB?Ya{G z^`yLJ0Vf6AF)tU$aHsmD6;~JJYpqR`Fga#MiP<=sRANqnezAuy+=#qYgK@*0F2%kT zwi(_jB=RYREHnrfZjW2>!*`<KEq4)LRG`zyRIk`Jd>7lf*YiD)fX=j6d^pzJn|d=1 zt~;+l|D{`WX5tP%#3Xq)18F<#v)*viP<i?zEHDVy1@Kxv#KgzAP(-+vv<aYt&UP5K zU6mN=@0O)r0`dul`_$jffe?rpnyCj&!Oo<qHMiO9(pVVvSazzID#6C9!%YW(%}NNO z7y4KW-B)n107nBzlj&6gx@D*cWoq~SmZb@6=1Va~>vRUm$F;M5pXzf#cb+tUp*8&t zwA7{wwFr7N;uWPFrh=+Z*=1p5R4E@PxK5tc9oV*Rc$THaWS?qu;RnbB`VJ=qt@?LI zEAteMD15Z4Xs>oBd-ETm^X29DaQ4GgXLC>MP{X!|*D1ZWUQL-#5!TTJJu#Qr!E&>c zfFS`RpqMEt%!!Mhe5LaYC0(L-5mwU<hMsylSy1}sw}2VyrJTMiWqw$t20t=*vDvuT z)7G|N{u<u%KI>0FJ3RtWc2Chb{kHUvt3djk&e64^lj!;$q!B)u1%K>TE3u=R^^aeI z5c#SRR|mK`w@Yaa^{G8%QDOyQ2Jkjhn>uu{^JBb%3H)hCw2_WW|7bhZIY3%u|Lk&4 z+1H${+FlQ-I@gV;A?wM;q3of2>1@yPHD{pwumH3x2BXd5md-Y#ou%tW4L-AL*xbDY zghHFo?zcoF^rs~t-qHPM>{o3&{~HjR@KC-jv;X{;+)t>aN%J`Z0oRlu5y4@rz9a== zFUaXDgzGSd5J$eU@l!QX6ia&1KuRaKomBcvBkN!?(9`~^Y2ccfU9zTw)GM*F07Z}W z5|Hx^>k>7e*tX9Cr>GM|c>E|o)h}h7#;cP}h#}COddtv)Zu`Y}JWYSz3s1n4%LZU) zwfh>FXFKAO7Q1{+*T5;l8pJ&;D3Dw=E;A}O0P(XDFjO8V{>XinW81(Yd3pZdm|cHX zK)pkc%AZX4sEG#NL57cn*cqO)pGtw~&Co73uwWIWttZ5K*`N%j=02bX%q$^10}A)> z$&Hm1*n$v|gm7Sk{v&!RU*}I54Rml})#;Y5Y4}IOM{0^;?QsXO*TUZl2N(%MO~xsT zeI*9VdYF2U?!hU}GhK;T9~0H)P8QBtwL84<M3DIOYWs;aIxuZz_?&~rl2(KqiLN^Z z4)pJWVKIPOpbK)qQTKUuL!ApU(<!)Tz#T8j91gVVOzsaqZFOzQ)toC4&)A&pLF>F5 z86EYo4Uopoq^OjX$=Or+*6d7@R<5_Ns%T?S5nGE8WfkfipakVK>kx>N`!EJvxdeAS z0c9{|I#Gj5h@;ln^t;tn5|hz9!HuKlimR6nH)+Qh8+g9Wrm0cGmOmREbYy*|ceoB- z{G55YidA>Q9XJ$1>%DyHKEbB5UM<%xOLX-=NmT#`2E@+4QC{%Hd{U)CiY4=Z5*TyE z_)EEUz&z4(2f+bhF;D%CLwnyro#1_-mi%EKei;*VUQ5j63pMNUFo~5g^awQ1I`5ly zyRy&OdiaaYU)}lLFvreBIcblXx7>*S6g^v)!b3@6w{l<t+$Q;ml%NA`BexQ?<w$Fy zYmPeau}wE~KK1?6c`v2)_yFYGwiu23C>Ddo+?vCJcWpzByn+MiS_&~+nl>LMKz(HP z6XjT#a1GHP=+QjwZ<5G!s3@=q5uh?~za?lNc!>SUwKC*52(C8~8X)<Oj{+{ckw*%V zT55>c{Tbgm1n?8D1hVjShI8_~jGw4bbOQB9g?+;hkr7@-=>2P;gS^0{YOUoem7-BI zO-VBUlAA2YBwz>xb1xQr;}yErc>u~5gLy^`3!rqN(r?GxKz>o^HQ6xmZ1*zma8xc; z%zuU`x3fwjvkhwy@v{3M9v%|M#$wj}oHzgAA{>iEf2}tc;)sIbRrWycN&|tYGct7Q z@tg%v6iZKKwhtu3uPD7~?m~ucbw<LKalY_5)`9c}F=pxgnKz8{pgF*b*0v-KV%$IZ ze0L!EAQmOy#?IMcqMVc{bJ;i{C-z#e(!M++J_!P-<K_vlU6nx!Qe&PY4YNW>fKn{) zvp0-F!Q#m#a|&lC`Sv<l8<b{14wjY;@}Yf}MwpSdcIn*rOg%6*vWno!R5FnD-~s8! zJ<+P4?*vpVz+jnd!w6w^=Mt-dmbczR9?6a$6^$r$9?Xhb6g;l|ROD4DSO~}^GI!T3 zTVvF3Or*uTcb_jEQ%yw&nS<_<_{!DR1>n8cGOI2J=J?21XabOwKfg(5_XAld;lRr) zBw^H&wxjD?U}s%5V(qJNlEFoobeWL`)R%uxv1p4J7!PNRdxS#s8YJ5RgkT{(C3x$r zRuaS2g91=OYyxfQSmZ?#stbQHWbS)Wd^yDB%xn=Do`0PNxPnq;S2F*}3&7o|_45Hl zR3IvH)IzPdOob{%$vm{d#(BI21<FSYa?Fx8fs2)fmWIqgxLj_jv@PND7!6RIDn&6b zW}fOuD6Pe9GKW*k{M9GDKecDphG^%tyMP2!ua{J}hc*sM%HMd+HbrK4d=;-@zI?jU z+rM5*QTP~UT8l&dm4>4Q*-5aaAHcNik0Z`Q)<23ZbtPA73HGHaKxM5u{|cW87}Vxi zI=&NxaNQnpsl4%>mf^YUczh7Z5W23j5tB2S16QzGF8k5+Do|G!>X5=L3Ajb|fI^$~ z^pXqxEUol=X^#>x=<T|ZNg5dca&Q2KOzbx29md#HWT5Jjm(sI5f$BfQQjAfietCg4 z=o5}-Jy);^^%_4=xc*;5C{;>tPtfNr03o~|3i1PBuK&Miz^+ZZwL>KJq6j1cXEpR@ zNEtVFce|j15zzHl)zuwe*Xa(lI@=pVtdhu{+{4wfY>A8Sb4L@0!g{-i-GF~o?HBi& z(U5eaTd$*27T)QEh6?lw@rEanu|F!(L?Zy{2&Y-lQ9i4r0_VC~q5mN{ncrEe+Q?D6 z6v$`mVVZ-oS(7cI*bIONXm+0ItV8<gAVeK*4S*3^Uvq69QiJA1qpn;-FPV-M6m0U! zCG?mS5i&#y_vI2~sQZH&oGE^=)OOisWAM9<;Uh~3Oss9bkgb-SMGDO6rp)gA3>3Z> zqD&k<v49TFT0%!4(}zA>eJNuJBDbgMm!*vA<G8Qxh5`&>9e`lr$eC|(^FYx}_qw~} zA+iIMJLHNZL3w*sCrvj;-y+?Z3GhzN8DGDb5@b0rP94c9V*r#(fExLaYzoi!8uZ!k zhATE<B>*G#0C>}G67Sy$`EA0rn(C_+*5ozL)CTvSfEG>j)w?3cZ>KjI1QgC%z?3?m z1+(y#6Iue)^;)2JDf~b@uA#U4^~zDPEP#Nle#yWEwca>--4X`UuSXjtKky6IzzwY{ zj#GIgyhED*My+JqZT%FGv9>}_r7#$B@r}ooMvdRA6AZ6|Q94ve+2bUKaQeT~h*UPM z9gs1omFJfcKWPc)c3vvS4g$^DDOzgK2Ha<|53m@_Rl<%q$vz<289U|UA(pp-0I?1g z3Mis;(jb<{YHDf{2;`d7spG}$laFw^fJK0=C&fAacz_6mlhUfEQI%9as&YrTZVi}K zHbwjx7_al$mlo1Q?5(1!2UmbImEwNb`1m5{9|*!PyZx_n?t%0#3to|ZQe4DyoX9p% zA(S69XjRW>Ys}s~8_Ew)Qh@TXQwZ^yV4D4ntN<})7Rfj<p>bAbi+kc5kt72LexhG; zZ(UK^wAW8uo)Oop<tMNpbXf+vOp1KT5SEI0qo1({+E&Truek(E;E)(i^kVQF|3`Az zm!O->92-VZSg#xuW^TfZ)9MbUn*oK6h*ap;#*khudGwB^ZryC39<bW<%);g&0Ku(` zhdY0)!p&vcxRBU@q}65A&8$>)J|8v#boj>aJvJEEy$3WKvlmN-mL3^WD;^c}D`g%% z8~|gJr>@c-E_=CZytX}(Dcl4K@VQy9%jIaAp%;N9f2jgQdRP~4P_ZGM=GDmg#qR_u z<pwAajb~oyh!z^kTmFSzK$fR;6K+g$0X~<G4A8^MDOgw4aA;C3zMs7b^1_0${Xvl0 zf!J~hp=ao^czs)`eV!;(;NgtdN*$68#-GP}E%^H0k^i>rO7{JQ=*k51SHh@#^C@|i zhb~;bw}EZmnC-FNoYOfX{zy*xU!p``w5gG1{ipp+^V#`YQ$YMdByj&1LP)_)>SnEB zBjhLN(Y!+I?U9&%=OJ4xWTC(mI&eO&;xh9TK!*lb=5q@!S6;u}4H7G3No*{s)h1_V z*aqDTWlzx3xR86eZwi_k6Vk7g{MFN#rN8UoteS9gYqEYgW~G7sA_>ww{TKz#yTJQz z7Xb8eK~Hv5GYV=r-h3n%jPTw*#T?fF;H4)GNXT~1{gBU~LRIa+|A{p18HWmW^MP^A zfF?Kng|HrL5Vfw6E@2MBfC1}zFJk?k`n89eEK~ETg$XH@+YEok=KluXYA*Z|S+xrb zZGFR7sS<T01_z1~A+C+HGtkW>KGWWIPhM+E0kI9#Acaq}emK~)?sHtxJ|@G;C~-Fh z>BW#v`-O^XXqpetV0~F9&3C1BUtq+^zM1%I@jnnI3VT`m+7HpYM0Pl1fx_{NdMYq( zwn7ILYCs>P>`i>HmY}GkTnCID(}j)7XU7TpIjhcbNBcOd_N$zGI+pP{7#29v|9fL! zw;nq<(a@3z>Q+FspGFc|0w^38uH0RTK$H$UeB+nOFub2^2P85V1BHMH?aDR%vd(>b z0a0$R;TMgQVvJXIMjboYfwGK7l{jNEf9BrJb)VFEnz&6Kc9N8fYXDSuR!iz7s~(4Y zu{~gdl3oZ=Am7|SP5LMgXt4eyB<|R`gx%;NzI-qH!&x1XBW%k4)++HmP^_jzcvS|~ zk(61bbHTB37^<tI#!e4HKEF*M8#)9L;x5}2Q4H#0iIttPRfS;B>-sN%4dV!$yw6&k zyyArC#M{4EN~#>E$`dA<D&2Ml{||<1D2#-4_Xki`OxW7rmbn$;rRFXvobX4GgA4e3 zckyW_uYltE0?ql{iOiqvvEo8waiBvo!5XB5ey{5kkmQ?h-d=hPpoJ}<Ctm40Dzmx| zWWI;wh<^@yX@)CKkn(-*1ROR~C}JmR#IAu1p=aOGe1q0t3a<rXXpXu)^ZWiR+aptb zA);9l`q>Y!mzEvcR8I<i;zhoi0fm7wkEcuaZ#rqmycBn>Gp+uJ_WykHSm7p+2!OR2 z)q(K<b>vg`LmlL{Ol3Z~d}JT%42C_ti{1lx{~R6Qm<2n3>AdYVXn)Bw{mm9V1YV?t zj^d}q_4AFIYmD&|KMy>+xquV^S}&m$oqR=jm?-P7`f)&+Rxfc*Kx}L*Y(nfku^ekn zH!+5vTts+Kd)J|I1|<OX@5t?l(yWJ)Nl5X_;B)5jE8fB74FYgLxA~|+r{uuzl*DI6 zmm(J$uHUuUr<TmGoD4Lqih<NbKi~?Og4Be4izl1N*s=z(&z!O0<rkskg$J_m@pry* zuMjJw-Htn=M2x<OPzDZuB6A_RWf5rPT6L#ZR%KiC{3;IXZaNin&ih5LJf+<PO_&CZ zdLU7Ue;5W_i>7Me>iMsgpi~Q4LzW6Vs#O&4@3{$D{wOQ~IH}@rmy*lscRwvRS1<&x zWWBv|C*naQkKWUskLsHUAefC&sRs69qftL3a;VtS3^1TB%AGp^_So~rPk@ax+)IoT zG%er(rEj#$Z}Hw~`_GtQ`z<iR{_^y47e*{oJ1zLq%)wF~OY~iisN1zP{U<E%p1s-N zB_cW|)v|)5Vce5AknzBt<kWH6Urjk>tjK+Z^>H02w<RX~lNkq4o?ig6ze8g=irRVT zM<xLQ(j{~rXkLcX7Z&a)p5FBGa@lK(FULQ1HgkE}Z|b$Z9xaWHcOJvHXH`EKb#v*w zJOM4GX@}CjZ(N1w^_%X117>C(NH1b_9}$10bksc)e0!yvqqf-3FvbkKKGVHR!<&7E zx*^4rudn(sCyAoSM*HCd5MesZdJm`$nm3bon_of8j8AOK2Gz&Edw!nc<arA39{^Y? zD5e|ebBVbBAgDefF`eNe>#2Vp*3l<o=zF<_-^rYoaQXEK@S&s6sUB4w7<{kF6}n$< zv8HAbFn*N{(#HINcVwkx%p*of=BH}c@)bYxVL(EQg1B#sgTLQv*n&<(cy3Z|gU(g? zFsE{fVY5d=Mq1<o`fIL?oh`ZZYEu=-{RUJpvn0chdY_++LjXI1w!`oX_oqRtMbQx~ z8rj-wpU}$W*m@pXkHSA&S#dizEYwx$Vtd5TnXD4XGmRry_~RP>xtQPo`OXm{OtQ>; z4=?a}1*tsT+crI(IL!#3^?3#Lk#Ja96Nqi_qa|{o^J{lv6;N%;r<r^`n^i~GxH|~i z1km1e=i0TQjz(r=s#9`U^(_msL3*WGO98*@RjAdF4Ca!Tb@Hd14LKitEpiL6V>%P_ zz)KxfpTO0Z9OMXHo_CjV;)65iEbnKL#(32&VSA0R;<ZG~ls*zB^u#K0ZPgaMi-D#= z*CdUjmN6L~UX>IcvmtCglBen8`Ed-2q>N$_I06kQGt5)*xxUl)2oc2I4o=SW!O9jb zG)}_lwFX;Ld$Bo9PA{E^6>{gU?pT@LZEKc3FdEMq;P5|FMd;r683|*P-!g1wO0Ph~ zcF>ok1}+4?k)F7K_I+yGnCM-8U%wbt`eQS{@C;pk^d4wj)Jn0-9wW@={Ix4I*-nAI za^cESOL%p)qqk}1GiqMOXi7y{!hbyyU;NrM`Y&!!9osS|&vV59OZ}ZoU!>yw<?tb{ z;atNSJB`*A*T64LJ`?-*pGKPk&9##JBitOgrKfzKS6&7&i3^H!SFg8A=DYQwP5MTJ z+Qlx34An0&`s(UgUmpVRGZuS~c)N@Sv?=@!tK)Et{YIA(8ZSJvT^?jjeUq2Lw~K$l z@jjJ$9iWz^IV}x~k3#JSOe33^Uu};vZeMsm0+gGb!2}>dsg|Gb^xDbA#$TixI<{T+ zi}StyuWLGfeZT(yOpVoodh}{m@J*xP&LG+tXEt%OFh1-kF(c!SCzG`W`C^uw%#(at z69wgisB|G>$3`Pp#_0#njdsGR9x@IE(`BnH^D9K2jjqzSFv^ZbsXSL<krAt5b@Vx> zs3yBl)163=naO&e5wuybkVSgdE1zzV?Q9F$Y!-$@sMfGBIDlWri}g2a;C0%eL%So| zcdpG^KagN}ZG?U?MLJYk(!%U3`Fw`L8EtS4#v#0~L=yXC*9Y3RCKMCq%^5QZ6+NP$ z;&Jo2G1{u-)`2e=e24lOb9ycuo$lz@CwQGK1wOgJ({4^Y{Ot8m;n?kc{Pc3|Q=;o6 z9j(g+?dr!~NTdPDPB!>JrwxwbrwB<(KCOEBNTmxZsJzd>B@VEU8CNIf)p*NOjX>j< z6_ez=G1_R@_GR32EXdT&C1+E^&Oz$YQ6PdhF|kX4!PhwLCIdJJU!A3z^n81RCO;)u z;>sLf^-l5#e0xO1qMIEIbA0HTw+A=`Hb9HhV*`*b*PS=N>ncHi$gkU=SfsOn$2zTE z<GLf`B453?_H7XibN`l0W?K8=q{#D`PICoqzV}|MC-6W-WYCY%#(W>Yje-fwjREJs z`njtykU4ObV&5{i>c>%W89;)|#to}SBe2wXito0HFO^}|uq<RawtpGSe={~0HK|U~ z2i5n~AGOE?RnIUtk&4WP=Y4Q)uX@5`d-X#athI{g);gLn4mKC1jhtHb&|}cHT5^0n zTh_&5NzIt0E;IdETxRowK+|5}o6shbK$}xCv>#H3I^fK<O4lr9mBOy>F$F~vP)zdg zNg!^^SO@x~l0zr=nAFRp9`(<fott-;+@y#{rSU|h`&{QwSD5s@k4to1+Rrn3y#07u zvt*Fj7elYJfjm^!Dav~tAggmGU90TMeVx0%ZfxS^qYke(T2=Fs*Gc*&_j~@ZtU^L3 zMTF9|T%RH$ootR@dGS&E2Kc~B=bk>UQZ2fxNp-YjpUuxS@64tpoU6o@SR(b{^>M~B zhgKjTFs(l80+i<S>U@Zmpp#(ynwh!S5(vzSMnE-tcUqqgP>`l}G(CEKf}0Ixjz+pv z0#TTAl0amo{_GD>r=Gd#D9G^KULQov`2bcP{_)T<yMV!0%N)QxC2~GQKO^@5E@uU@ z;*Ji$x!EsMTLUCbsP%mUvhIVu{FF6)$F_(LH?VOQHN0@z2;LjVcJ;rV{6uHM*TN)) z=jn)FULNzCE<4F25FUtS3YGArvtqgJG%Y_#<P62m%c37k<37Jiuy0z(Iw@ltWp-^k z3ndoZi-Kvg@Ojc@VNKh^@L$EUPBQcLCb9IoN(Fv<-#|kQiFM>FKVkI<8!KqZ_QMw< zv2Ky3NEUoY-~p`PlR3Arj;0vSw0ZYpu=vKVxRdgZcJy@O$^N0w!TO;4qAOD5ywJOY zdzC46VuvJ<!}D2o77<k5S19h=R&8QrLO~U*aN=zJU{D2#zs{ZC_xBm0oyz~e`)jV6 z!hf%Uw-ywH;*4mGWI7Yy7`ToBqx#wH-GiqALG}G_X(g8(Ji+SQ>pohjtvq7JgBmGW z0<AEy7j8C9;GE=cvVE!T7y#>@h>%=L1WXXnHc~k-`G&8(K*V{Wzdt?DeLk!3_CQd* z*eC##hDG`x6M%sU+SR-aKKWa~7?@d6esrAhr44Rt@6V^Jq;q^sJVngnS_|mRb^W*0 zD^t(-zxZDsvWsV^Espw!%sn^x`umGWD^Xw9>ZVORgG-Tlo=lEh(P7t>SoV9_=ws&m zKLk<cGxc&CrNy@hqtV@ws)huj(~j+8tv!re7HTHZVUZTbqi?w$*y|G}_4bIhx>1<h zeF%;<&d)R3ef`sptasb3n*4c=hR3@`hAaXZzXT8IZ`l3L{bA9AWRaKvdd!E84@(?t zt5IEQ$aC~ehm$b(4NIfJZld$|@MU}GPlJ{j)&IJVBGXgZhq&88_13%VnU1u-L$hE1 zrW5`;nPrs1I>$|SA`jKCu+3~q<D~O)6L|w&e;sX5eiIRcdA=mSGgUml(MvG1Apa2; zLqN~vVRt!tKVE~1``b$+4Gpa|0ch{IH!+fV3jD#eSpN!8jQC*GH+hFZy;+PLgqcj7 z8u9v9^kIMa{G(v;pNBUC1y?s$E0Ml(^$PNa2#G@42%4r)$Pb|!%Qml>1`&j_(fDjV zCr>c^hL%UKh?mL5J1+YKdpq&pi7xyxAf7h0npE9a1(n#(2xh`@o!5TOnx0fA|DYS| zUQ?>gH;rWW5fsggi7dds5A@lPu=I#Q8Ts&92YxGPAeJOzba^wIg_d~qu3I}HA>}e- zup}WooWa*Sp~kH94^RI|=|yDAcRe=Ua`!%$XVf`c9%;Da)=fzAFSF;B=7c!@!uQL+ z%${yc(cGK=ZM*&YdHBVn7?j?4RZ&*BW6d|FGD%ycDOmq=r+MInWghRs=<;G~nj(w{ z8=i;xxP46q!~IraU-x=~lBBUFDj(K9rmrD`abwCN_=+)Ral9Xv-?Z1XAdqm|uyuaL zjOYFpl(@N_x??n&F6%~2-)zSk8+oxfU06#N-5{5ikHp$;auB8S%xJ;~yqL&_Af$Uf z@B`WU^T>(k?F=D{4QfI4C*}814}|BC|JrK)vQ1~lLyKuH?K5bVUk5>)_`6T+$J}10 z$l1JTIj|Gg_xm0kzxcbszk@#UkAJ-XSdQ`63Tnc<Q?*=kHH{v+PWagfFBVL^lUT^> z>JYaMX-$f6wu|R5!o1n73pWgd4RTd6OAuMl#==yaje;jIj_)cSmL-ki#nXaTiyY%| z0vaZCYF}ghCXJ<Ds*=%gUw#|&V<rCqqK3t>hp9P{?H%W$r2vaa<6|&NG9I_jB<{&Z zTy5;wAN@^iDla<HZR0{%wRco`)*JD4%?`X#8l=F$)!-AeFM;pgGR<?c<2!l|bYeZ@ zA*$)Qi{QCVq8p!a<@K>UU&M3D>ZxXm-H`j3Q_1n262bX<r^ILf@&5m5q=e&TySZYQ zfLKpuR~~7=Q=@h`Rc@&e?<*Q%1|b$o0&%*mwu+F9CF?KTB4GPl<~g@NjKrFR_{2;- z5Q^(TGXW(n*JY)1M4oivu;#wBIKjvWeDt)SUpM+DbFgs(r`C3;n-ox!FuqfXLP8yd zt8qTa5v&~gOF>sV-H)|(VIo-dxB@wmRWG-NiD$m}<g5aZ3^Go=X61tAnWr#^^FAj> zYUom!eJ`=>jVp25hFm<hD>N^FUi<8(^wG^Y24Bn71B*Y_?*GyDo>5J9TidAR5mcH5 z=^-i>l-@!QB9EXV-2zCD^iHG)5D`#m76g?pN>QrxULuLq&<P!k5TqsqNa$xFd+!(b z^PTtnIO7{Q7&jrrWZi4ca?NXA^WAQ8sUT6)EGNBpQ4M#KOMB(}_WxXwy^pZ+fpdgV z8;7D9q#qK3t?t8?uYO&Pd8JVw9(>C&d|9l}n^PCzH?R>eXQ!S1k?EEFx8$=(8b`BC z7Lc*flP4O$f7T~Oc4K7iX<jri0)ol)lbc_H{>R!ExAceNY=b^V9_nbBW_esK$&Or5 zr%d6Rf?Bbu%ps;we@2X}W?Za^8qc)Ul7-^+$vkE^TS`QAR-=_Urgq-3+Da^eY{yEs zEJO1q8tr=9-B2P~?k|_s{~tcLxc7f7>VHh@o(q1})2TXMhEE%qh8-AHFUJM+e`EM% z`ji+icWzm7be$sz#kdf}B%RL(4T4X8gyF?H4Ko$l?<g_bi?N*$aYpbWM75T6$yxWZ znB8RcrN8hZ7CSFa0;M7bF}ULCftS;MEkYA&nwM&F#|gR+iXit)Dmf-7KirxiyfH!# zi71n~h{<CnK26cQ!Hv-2TNVqkr^zDDybOEUJ9W$<6^xe~I?~pWY8qr?elY!ZSRD=} z)Z4iyu56DvQn<AfZ<b8pa@&megks4j{=&B;tB&7nzx~HXD!v8!&+J&8nv)JBRP3=? zdrso+u4(bwiN=R?I9iKs0CC6XZkLE-xE3+5i#T%#seDotwIqRU7KGZ>Mvfy=5Fb0S zK1$1yyvU*JEH|KtGvg{60R>e_>nO}wmLT^kFpk~(R@2%zJ8m%@COk_iJ%*@aDbC`7 zhM^?CUA4GEMHBUK&&SI%A2?p8RVK;Jn74tJjJ|P1m+-8CEIg^qWKCfzOYKG+jx2Q? zOR!;oD0P(nusbwCrh{egY507+_LB`TF<k%mOpK2>-{*g80jQ>mda$ad3Ye7U$5pJR zwbs}&TKFk!W}&?g3uHv`&_q#!vm8cAARc9Q$N1iWIz1tBwOI2^ju1CnQlCUg_ehMY z(?rw%u1wNPhrB8>kX{y}|2jo#ycYBrja{wJBfJ?v39Xr@Myl#35r{3<1nD0t;l8d9 zglkapnCZ?FWI~sUZ)*|8teO2BCYRw;UL8cFuJ1H@s79YXqCVD6ZT!j^|LD_ydTjN5 zu^);!&exzNXZ8WON)UCEZO@4~wjUu8#1*`3{>Q-yoIL(J7>dK{^zXIJ|GaMHd(puk z4ha^+bF`=$w{_fZPBYFWTySae<8dfd`5J?x`cI!JG-GNRCorsXWF1U^i<o0cWPlfm zk-QTqx5eo_7=M~+Pg<2F73zqypTO>awqMEb*U;d&Ix+7QBb$(D`H@Wn`ic6*%LLmi zyzh;?+Y8r$h)imv45pp=z99n~ss_pLei>9J`@jwz@4se~n&546m5NMK8D3y(!3!pp ztjY|SQz9^PXd`*BiTZ1_I#Qr}Kgg-`KvKex5haw-2K<qG>F3XT&dHU*Gru$Xk_4)e z_2s?x8v-aQcfs>%e?0#m=j!Pd!r=!ymKb0mts$m22ejY9VAF1G9M{)$Z$Rg&c~Phi zmS=SeQ%m0R8}S7pN$g#&uNC^t7%gL1U^&4ujFZ-@o%-K=@84y%kU<GLE}wfIEm6vU z&RsCNmyDeL^y90AnF=$PW!KArW6fM9YP{Tz24U`Jeo<t*%T&403Tv`dZ#caiqGL)u z!J|nM>VZcgMIB#2>SuBXbY!&oX;rmGf5gGS1bZ8X1*%i08G+Xh{qp$_uMPQ^*Y?J_ zr|n(Do}G^7o#*HN@%+6WY4=((^2$q9^HExJn$h(ETQtu><n~R+QssEr=n=YvB3=1O z)T&X={u@e2SAx9bcQO($Hic_-!(zE7U%rl%<n`}e%r9J(%3PO8Vo{2cD3S<umlb)T zKstaBA6NEz_vEK?J}=uf34wEt@KD$qXB5X;a@YL%O%or8H-{1Q#6dB5r2haX{X2|# z;+mgHjEUVv^X?yVEtV%;rzsKj3e4YZ)W-LnktUJb_a2B0_<p0vUW?m6S}CHw$ZNYW zWX~3<ZMpTRmC=qh@!hCpLfoETToKx7AOe4ooc+g<{3mqw{5S~yf#_gIX%of_My^+d zZt`m=5xQh1ulOXmW->{ES&>*0yu}>bI-f<)Z9)4H--+cD5s1uR`Xt@uEB`Pjsxm8( zgBj!dZcUUbyJX$8G}d`K@!T9dkzN`4k?Je&zM!>S$h#4q5{2wlL1#hz+w@K8{abXR z%Bgzk4+=zxaQd0A&!n3d5Say>cw)Vp()npIHaWypr~|vnZ_AQGPV)TgkDx>H-9BLr zdoh<XlY|u2@oASkclO%mVwK;k;v~ON*0zh7{Kv=thQg*ve?0#WoAmp20x>(Q(h_q2 z`gHY?x3D1^Qv$rrFR?@?^y9p}x9{P`+_|~#Gh(N84x-m9lRSowC1J!_UL6#BYRQDp zTsItHhM=)zI@EyM@v^sBYw*N!T#AWSTHW#iaYh5#JhGYk>MulPtbWtFn3{%U!`e$s zE&Y8vDy*ASG)0kZFJn9J7|wEL`F&6q$4?&sPZno!Kx3zW0V6^fei{T-Y&(B#5B~94 zWnXMw5l2r&wS8tpeZX4twW57rcJ8{>fdlJvNYX7AHn~H)AFFqFyEwHje2DzRg`eMz z?e5oCq#*Y0zW=@sELKmxo(ejKttcYztyUjH<jz}&PEp~x5+ltPa*Lv!DEwQ(W}z?i z;dXrlDT_f~wM;zrPAt*>!D=OR2C0aF{lq<|mL2jz07ZbnkL1Dvej>bWCOq|H)CrIH zeeW&K*rqe4wWOIjTl2cn7X7DRI8<v8%&^xtpHhk?g_m6uZ}tWb*Ld*^HNKT+lc4jT zmjoU_&34EAP(1(g_#*&mI#D}eBcy6DYTG1tTIy(QuzDS^8$vGtsCs`a?t{t+aN`4E zs=Ipy;asVCZ*NrdV;44ko_a@l&))h!>=p4Hq(W8CaUesTJ1)qNPt0jwI#iDM!obz` zmK<@QP{qQ9Y5D~`#K(@vb3#f~zu?Tfu(r(yena|EaxYqN*Sa@9LOQV>ZE+OY+~%w= zjg`9jVp036pZ58k;XSrtVvWkzU%+*mt0+pM*UB@9_93?MDsG~5$SIEKY7?$d*$p0l zO<y|%)6H*|4S9{R{umeLU#28P-ley%#NeZS?UD7ePU9Ehusy-t=>t6%Yt{Sga&K47 zRK$$%XVKN#1r*;l{mW2f|GYxZwr1f7Ra;GX$LB~e{41^YR&(dwYj!1`|4tzlQb+b@ z3+(Yu|I8ux9k|A|BO?*#b|y@Uo=^D8@wa8w%*!uM*drtLry5MM8We7R(+h2BqIyi5 zxH*DG5TEF$=vp3EAS%qlCjcjAt~YXApVaHT%Wj+@R?_~yMLR1$DBnotP3CCdgt9~k zyzP>0=q<;$ga-HHK^TKJPMi!)>=;@Ziui>%C_ML~@Jt^r6FndIm{UvXK@4!;x@(hW zlkIBHIHq6Vb!fVC{5<^K>&A~Y{_sYNf4OAtc%zLy-spA`*gRiw`U3y<D7%F?8I$Kb zo9RFQ0xfnokHwP*d-0$DdBVS+nQ<uaY(%|7TSLUKL)xc^SJhdvekQuqWi!H;Xb69& z4F2swDBU>+jzaTD?(uh8^2DbNq?LzlC}*min|DD~E`d@xk4!=2g~ZBg4Fd@QEjO|c zv$Yu`%L^p?i8}$w;VD1sEGKF)Mi{-bEE@U#wQ5SUJ1Ha2T)g#a7YFR;*%&!Wm+Wkz zPUl?*P5E=C`e97y=nMk)lTDt8`qXZIMu!cXt9^Ulcn0r39nux49ekSW_8q-l{PNOn zMv&I77rDnNJv!XI8{5siy?*lFE3o&a|8t$87%0vaT;Rbxsfo71OfX0X5#F3)k^jMg zmUZBO<FKO4CxYNfSdO73&0(z7uRQZS=7%+OlRQt&9dCZqRpTLcS3QZWTl-E(W<vHR zN4UmIq+b!wsMWWq4_fgqJkvTTMpRbDCMR{S+p6%)<#|{19S@b|a^%#Ci(OI?hsx2r zFR1a@>k)ap!#_oc8F&nw1|XG+(qy&r+p;B<Viu8|oS>{k>GB^%2JJfsN^fO1)K2)h zhk#vzzH<kd>CalAu-jvub!yl3a;fc_8y=Bs&-MmvSHyN>I<c!?_u@4F3}U(;?*uWR zxP`%IS(y&FdbM+^E4JR)3=jIo5Cr?S#y%I05W<{}^@(``MHBg$gUH>f<a_c?@gftU zQPO<{iMVvlcfV6%USubSb8b4tY+6>FQ9)LuE6-xt2D?AC@y*4T13FQ#DSy$Zt=nf~ zA_{GJ5u7SDQK6B_+-`5_pJ9x{vp{&DYwd4GaZg4vO-CDeKmBA304h}{65(6fURd{v z`;K~sT+htsyT2nC_vlaHa~BF90EwaTLTu#Soeg7U^*gj9wQLB_4DAh3?390}kU57O zv;UWB4zM`d;Q)}Sw0;`LYhsgS`C8a%K7=U<wpR6IRQkxee)kxU9B~9=m;t(zTQXI| zlVISx8&j^th2{|MiLwjs-;{}l-IvC(V<6`ywytKTzrubqYRTkdlcOWJ6@(`-wzyn7 z8RpZdFMJa^_rk#47Lgd0$^u(Z)5}VdV1DH>@IoE(N@PI2HD5DEsi@#aY(B8}9vE+^ zqk&jBr4w6F#_`HyDwdg3yj1T641mYSgdE0h+l!HO{wvlC><!o{?o9{WEPQ<UDOfyk ztmKUD+}S-=sND#7bvF9X)kyqpiDxsf|9==8soz*$-d5CjaEKzT&F9Fl^ubWux*?)i zB<$x`HitsrchlhQ_SLQ})kOx%(h<9D)1M@iWk$fSGh?)^`Zt-V@JKn!e3|YCj58|Y z@Md-b$Jpzy4>2jn9^U+RRgGdNhhn50C%7k}%d>j4t8>xuh48tjtv*25gM*=Qpm2Ri zGE%IClJD<1CfSBnA;!zX;md?l`6qq+Qb!LSf?xhGAN5GR+c13Ecr;U|lx-nt2Vu#e z+YdthpwD)@sexqht^sECX*#~wq6EtA9w*32+r2*PpVvhfK@vIZ$*Ni)WLnzD-CDzu zmw%i?4h0wP8OJ?ONq{SXune8N1joN4g6dpt2=_SWYfCkrITLGU2adPvh8<J>UP`Tn z=FE_wS4D2UYf7B=Mqlf5A=8!EDdLx2C#5aF4SLi~bX+2Tl(lA@i%<8*i<uF_kT)mW zlg@L3loeA80INbhAE=uwRnGCnRzr~)rM13Y%m$&kZl;&&@^{x1&NsaG5AY%FMD2Nd zA=Txag>HVMFsjy0Y<xRt$2BS6k=l(7-(TG|G)EOD{xBj}AV6T_i%x0eGs!&;Ywz0a zUIz}G{BFaV$QF5^wa9B6<0R70b4%V2;J7!}USf@M`FQzS5sc?I;W2XO2$h=L=ja{Z zN@Ln&Fh4Lpy^kUZKU!D9m6_FIvZF;Jh(0Zu7t6d9)s7z|<R5bnaT9aaB2-3|N2Rp( z-Ezl7zgjxO9#O;r)VDPuCvpYvPdC4ph?44*oiq7BW_RUyu{A-^4<j#S>d1URM=c?f zJg@J)*BSi#jh_Ekg7kmEADxJ(FU{m;%5zu@21kS2<IJiB>M|#TyuBD5oDoWJ$DE;) zGqq)$<ycCmU}zjFjd4Wp@H`}KEzi8oYYioc%8PxDP<W6p(@W0RA^uqAso|QkHowli zpdulF7^BLuTPvKOxgs6{!z4S&O{G3bnpyW+vqi^?OkS}#9YO|ZI{+7apq`t{uxUVN zm^0BO4uG(ExS2U6#)Fmlm>aYtW9pC6z?~yN`i~7AFqbjw1L`G$T6cic&47UO(-&EE zcQ;<)*Z93lgj;Wz{IMHscG~oN_=k>NTHTv!?6u9i*Pn0fz?we#EUo!l!Q7Q%RE_$) zj(J2%mnP?})eGjBdO8SN`dEQ5vS9MNc@8yQjsUu?eq1`PmH<k2B!spumBK-qVHvoj z2kj-nrwVn}c&1w}ojQp)-rjEZ67%iD-TYEPdHYmQ9Z=&YYz_^24P`PR0ULB+XTQw5 ze`}|!2<X5Xf~A1U=5@4ri#5u?PNrAT@v*=r*J&PgIjZCPQb?ZXxR(A1?k@l3Vqh3n zw;=Jx6jWB;Sbu&FY(vo*0Amig^j_Yz6HF(~b^t1Ft51jjSRDRqzrB+1wHyCSRSle? zK)c-|)cZg}#A#Obq)3SK<R=h)UitCH5`p4E>o;}dd{P{g5qVKse&6fNgn%qsRRZj0 z?--ACCqiRKAp4v{JiXMk0gTo;PN@_rN?%4fbbFgE^KjC!sU!3Fx%9=7)3>H*J(>Yr z=z*up@BxF-bw499CB$jHofona!UJ~)l93k6R1xG<`p1M<Qd8+qk|OH5gDwqlpodn# z`k1$0qA5P7+x$=TwPR+F?l=0-Yw>Z^{&GngAe3Qs-+=pVrw(G7qKWLD-FyFhcYVSn zUa9R#oUZ)ErLqhBG72^PVS4t)JHM}QhyC{2`k^4PO>>gOe!axrTHUSZ>vHOwkJ7{N zZp>Qd--3=UXoY4~rH@pJME{|~3yzs>D14VPHxeZ@B?H)&IDONDut_g@;B)lXPTNvk zN1*P!R}@1fL_>nTv<oZRQ5wQ+97<X<r;oJeh67($7pfePug}X)5F;|IetJ0R^~{SA zPpV(*4&rkER*M+`@Wge-HckQs&vPp-DwqYycpY}$^Kdy=u=4q8DV_g9flq+;Xn+EX z??r*TLx3f=M;m<E{q&OmO1j^^Is3=?NoL)(#H{C6|9E^)YQOvVXN?_FlYABx;gzy_ zO4_|ZRwiQ=$Wosk$0kSeRH7J(dE>!#kdPE4<a)TSYgTZng`B-8oohAB={eE$G+hv- z8*79&2s+{2?)}=&FvtU=vt}4>uCV~@kzHuES)O(vx$nkZaYvK0JoNQey{28Mq>D{O zHiRMUdijXfu)1mJjIYv6{iJE$x~x0in>kN8^jmV9K1NyBy1@Cpx;(;wuQ`%qa@}is zWK{T@iQI$lW17kXQysa=g?WK`nGLmrxqAZ^ZNGmN$a}V<ZGIyYHb?hMU6l@g@3!-S z%`nG)pF3;Dfb6}nrzm9?q_9q;-nQOb&-zEknf-ESU)__Tmpqzk&LRSvyXw|<!L+T4 z1qNeTml^2f888U)|860I33;(0ren=K`4mlpwG_-g9k;no_5b;x)s>*wJI+LVO7?k+ zc{y2s{r+8)umIs=kc82p3*SC5i0*?2v>Qn2anD%x8?c|)vJfj&IT0O&>-1yZjP_TQ z{0aU$<F@0t5aVf*Smg3XJlUXg@ascKR&?b4#(V3@_G;$ZjRBH`zm@jh_|K~QV#|v- zHl}q}i-24APW#NilUBbuy;ED!-mR@<Fzqr3V3kGB_heSJE$Y9IT%z|VBH`VhU;N|9 z71Hf8pIiwcPO!BPo~$DH488i80a@y+qRQ;(M1bKHi?%{fK3vN{XhOgoMMv9P`DM6E zX#`c@EFFhD*ydZx<VJTahLs{Ae3MN8VB{M{(XX78sP2`Jd_bJh$RQymt(dQXC7q$k zZWf9$0}{?t3Q}@>(aStNNi1t-u3N<mo>+YQ19NX}GV?Qbi(f%)WmI%X;Be48l}u2w z<k}!XGb?rWe!!hNw{9U@>Tc=3VLg2Z-}*Zl1=0xNq<7-Kw~gxY-EGq?pX@H6k&Gm^ z!OT*Z9XHZX&Sq}IjejkE?rS<y=sY??$1>7=K{MWgMR952u0Ko;_1n4!#;ER^E!&0g z$UhC*-n#^@2iSI!_NiYF2m<d>-0#7-n{V3UiAaDI3OjH(oC|3)x;|7p?^n%?G>C$W z=tKdw(Nkq6nm1YjA!faqJgGLV2IY@phcot4#EFfY4|qVp#6GRfVyD21v1~OD3!-l; zi#6H@%SCFwD>^n)PoJ<_sP}<RE%U7))S)`Euiq?e03PXc`8bwm4b)K2ZDig;w(pyD zG*J^aH7J@=k9*3g4%)7mPb1L*f7!lf-4onpDC{?SwKrH&%|6^BOLTTf^d{zejAPux zwJ?4TfQ_Y+9n&W#6kQAE2^Wl15pz8sE>z27(lj@#6RSRPfMSmB$PvizaN|Gb?G#@- zE&peyx|^MI75Of0d$D`Ns44us%g_<E{ycM)xoEvDoKxAaUQS<8!z#f85V?nW!R#jA zLGvuTFLjvO)FgC~HZYS@c;~KhV+hM&1L*gD<EDH6jzhMWmGUoqeyUK_Y$r_JO9W`y zPGr4cbH4A|aLS?Aqo9A#xq4@KuW^{t$h+lzzSMb3Kxfpi>H^$ScE`?-jmxtQj6GX^ zQyr-l%V2<U+7pBiF~KtoqN*_~fnG4xxN^t#`0t?j=A%2m6Vm^>;s5hvvd#|A44fTM zk!N>s7ziH5K3FxQh{3UgD*Et9+31$W_k2+RwhY&B|JJGcOrII>3iY%s-xCnO)Ia40 za#LhMQSKMhdf})1md0jDv4!i=Su(<pwWn=)CKV1#mg=f$=Ii4NPz`RSbkpk!ru1@s z>5A$WOud0nG_ERfg5p2rKhGVY6W97JoZLy&rJh(F(BW9P!n1|A7WYTuJ#mC|qHOUE zg8)dpbF!t5=2kY{gl%sq9woy>*Cl5^Eb9tXT`CFGi?bb~;6}SVIP$BO=PI=8WQ|=$ zu5(LF1|5jI;23qKW~-)1$)U!v>ZH<43&n93pT9gS)BsFU%%bL$%+AUrn}f8}CM=@f zkA2QQ&PhCPUngjcnxlwR7ve6UoS^<oFC*4%i~^yrCt^%{ovJ4WD*Xl>J@TYSyd;#I zXPN{HS}ekZ%b#X*afy*n^F$6hRiOd79I5%`EIDz+y-x_{y~xU)w{>B>PF{#wclpl# z_NFl5uh&i2u}aP?+iSEip^BEzcjV)ggJ6XW!g75ke(r@#>uAk<u`;_bsT2|*qS}4Q z?I5iNkXP9~nuP*H%CCYw1*x?N6SDK%B-~vG{6~l2iMzO?wq&64;Ws4L+S3@qJlvrg zio2-}shE|kpL~mme2hk;1>npq(4E0CbD&#Mm}LHSMb5q-u;8`LwgH)O?zI+X5bsKu zjp%U3<CG|g&mZT#*9vjk_LV1pL(F8~pWpWVvbmnu>?A+1!+jK~CVh?IsJ5>nWPdWZ zqHTUTpL;X6;deFbeb)3J0MS1zd9=z763^{&X0={p#DO(Lvm#2!%9?RATIP0diYD~I z+EqcixnDf+nwY5I$Z@1gkOH7VLk`ZEeH6FOE<kEF5>)(heU%=r=|N<dbk3$tUC~wv z3jX>Lx9snnZqmXcPiN_LS6al9D#c0v%e{961`VP!YP<CEwPh&OgYmnroPB;|?5Cw} zA~B;egutu}mHNZ&qq7^v77YGR9D<7CUj9mKVg>%DK(2moD4Rxotf_~)f$Y&7NT7jr zLQkap7XJ(<S8e(es}O0l=CzX-HNxphcs?yWd&-S#spWt9tjwDG&J|Q>ByGJ;a2+t{ zG0r;D<BF<&hFUit?01+Oc*hkSw@>fVZWR9xV3F-?+`(YGJu;SAth^;GxkYVEpTz}~ z4Vn0ipMT%YAAeEDR8~;(hGSLhLY8`L+j6{03AcHwsc%(c)vJ)OEw4l-9+_I<nhj@< z@l`$ngYvUQ?HL}8Ng{>NfOxC>%$eJwZ=VZ_9}JVEZhRj8t|keZn7<5fk138T8!66> z9gNBYO^<JL*v?S<Jy`~~ANg@9#7NgWO%6IqWZ4+)Y{e_;4z~rVlzv05;BCrJbZ^o9 zzO0fn118KBR!PW};1#gLCJ~V`i`s+UvE!@WpTjvR{xs*QhL!JpQJ-?&<H*(7g`JD5 z?pg|~GWMg@eze(G>WfIbZFq)`%r;w*ckpi}1_gR(|K2G7zpn#1Z|+2z5<D$Sq^lG` zQ=5?>&3;ySH}cg~v5?%l@;u*~5{aY}s~quq^^tKS1smaD2-~u04~lp0sj?zwO(p=T zxEW4#&0{_n73SSyu7P2ruoqxaa(-gD=%gaEOohqhI;mDmUPK<7qe;3_bEr)Bq}i>@ z1r}h4DAV+JVi;(zPVo(hnJ3`en-#9-O2oigUaI)^#!H<Z42|UqKKNt}T42-t2Nv@D z<PO(MbxrDnn|*PSs`)JcP=Ph|z#}AXxPL8|I%u<wJE_$Vy4a1!ph{a3bNohEK3ZzH zP?pYwLd<G5Ho_pTG%=X_XAgxh%ktgnS|ak3rF@QSg}*%714H|KR=@UDkUk)@(6bN_ zl)+@r?*{d(e7|e+?0gSa&{QQntOjZY4PQM?2P#oNvT~{?#nDa~28asB(7_q=*e1IO zUd8f36_#y*4V7MzVzO$G;|7h~WB9qzJ=W0fNX2Gk+$=T^No*3x?)fPvB$Z!A>~l|a zDxMLR$8^bWSB8D|dG9doJNb)P|K9hGd$wCxfsWVW$40=acdv*|cduq-iMd>q>LTQw zhV4DU9o)Q$DlS$XSA%*FCHk!d)9wNv&l5s58>?k<>}}_Wf`ovc#f%-Ryi}mW!E&); z@wxp6$CduU!2=9}W<fAc8)VyR9L@9ju*dLVqW5Ik(p*9cg=mTrpHDV&N_8m;fYL@; z=lB&=lz4?KTz~t{Yn2eWKl9}O+FmvVf4x#Q-w2v2B-I06?|>y*$Q^H<nuHuU{Z2(O zVq8JJ9>Y!vx>R!kbkq6BKV%%}l=X`aNAsYuL_zl=7nLe1Qj?otOH^1!Bw|EkUdb{w zG<f~>hD%WQ)>-N7aYVs}zv5(?Y`C(Dpw>X2g@VJ=I#SVw!t%PT8|^AHs$nuuBG&c0 zIZ}i&C2+y-pcvAC9XXkjNJRr{SwSkl4LBM{S4V}W{sbZUc0fo*|MbiaL&t0#nJ}}3 zk*ZldAu2p4rW$S2OD=IA9I($dM|<*ELH$W73COl!M+lZtHUQw1^y^7muk2^>&PhRE z3LgE7o^U(-H)iRuf>qk;zu+(5Sl-&zvzA>EDO6MM=G_LU@*n0TEvPd0QeAk}6@w${ zftYi4)p}b+@fz2c3B>1N{>srU-~Q_LIZNvB`XdO?o>_Ij|4P>>)k0lv1;e9mFINK^ zDh9VUr>bCT*vR5ltNVjse5N@<Gyj5^1MAjO7rD6OQLEiot558pjp)-ewp=VEINzQ$ z`U<mX8Dl(<Q?vD%mX~>vH=uK6Wag3n(};Qy{iTh}Pf}VWqJ~j3MXuPnD6F3YHw%vu zip)7?YX|lO%N<bY0QBT($`11&o2c0JaxZ`5zoCHImg~USXnL|@B8F}7!G9Ns604u} z4RW$yW#Ee7WO)|I!`N$O{QWi+_LDUZ9a$%(FK?aQOcDEDr?HszuI(3s**U|ylFCPS z5YBiLN|@==eAnExc?-#@@(ZYxs^yQr&hTwi;5CY25z8FLqN8NFOgHP$^OR)7gMJ%p zM*CH7u7glh(i!@Lp!cIttQyZlUP_5cLbs)v(w<BGB>^paTK8z)G`u6S{y2+2DfPAV zpRgl9Nd5ymT4~s_CI)OJ!knqz**l2`InH@@Cl&xgF19t2q`R$RYHIhr#)BP!zQ9)& zI1R{%_7h=%J<s8UT0ehI>)oR9B)uIF=Vg#Z68-ej{jEnsjr%VvmV3<D6|{+m`BCOd zR=SpwvJlvQ$Bt|4MY8g(wggNh198>1@w}@r(D}`SGb}xKC1Ctdw7EXs<ndU~{yFCQ zVbah(*EY@(&M&D`Y29anRH+jm^_TBR(@HWiLw_v8_LotH$RRt80oV({kk9Zf+DWwV z)nB!~Y%T*o8}(+>lW5d9qi(^vK-_-Jw`Z?^tS3>rH@~?G7m}{RwD7002s}vq&u6b4 z>z^D6i5vbR)?|>|Wt8Bs!VLLgzBJX3ZomB)60D^-(ehXY?VZ~A34bNw(ArYI({T9{ z$jk+NscRA#qY=I3AiYeD!X`t4Z(RLX4}|XT8lpKvMZ44S+=%ZhO<z>|-`i*NrsMZ} z^xWw^(ift1KVNnH5W7+BU1Rr8E>#kBCjP5EF0Jc|>ZiW%1QIcZb~k3k0zBhHBp(1h z;Z``aECJ3nI3^{K(-C86b!n#SOFGcHXsceEj&osJ%&$86-p$pafv(rcCgqSL`8<16 z#7hLG(it)0t28feAeeq>Wx033IVogj-gDFs$Hv_En7T2uuqxi;#0uus57sYlpY_-v zr{f_dqi;-0q90pf4zW!mD6M_N)rb4G7Ahq!_|uU#FW9$$$xCFP4WN;l<C)EjDaBxF zm!*KHx5a8)d-(GX&yH%CU3UX$dhK!uYb|~b+o~<vesUzq)$p`6gZyJ*p6W0mPLFdK zuk~!ttB9HHdUu~qDo<aW3>#|Oz&v;Yy((me3x+7`a3{UHbJw7;Jk)-Sh;B=5@Guq* zRY&4-5oSRP@BJSIWX`xi8T`Poi-?MJ;k+vgq~R5N-}O1q9}CyGV%u`deWJ7TC#PYH zAJk_%b?&9j`yfeZ>qm&rk2l7BNvxUz7vj43hgcIgTE^tzTfW_wP@yK?Z{B39#|p3X z#yK~P5_K<z(m?xOFKKwX=blMefQZelR8e?evrvuEMulp6+2q&UnvKho)zp!<y3KDU z?AwSE!(fi6u#9$A%|qIPU+$_eetlsZH*&P5V$?5ov*h(x&6Y#4cC4y+9W0NP{CsJU z#?jH?K0{>HTZ7L!9Qy}1&F_PbHH5`%`HU0mXq=4gex)W`)|`n26_tp3;|h<)?aeIw zX!`p_Z`<hwQwA>q>j9PB=8J(6{fig=Hy%UwV}L3Fwn+e^$cBoH2`$uWg!Sk%*|`^a zt9U_xNAfzFgy`nO9sM;SQW<)kbd6FL+An2M;g&qT-&z+l6DWdEw{a~sJ3_n^N&!`< z*BMf(TUM<psB3opg5Z2>p|URav5nO-y|U^1urlf=?<MPrx=Df#Jvx^~iH;zX-m0F< z$Gpttlh1n&sZU>42q3`T2L+-CGb+rq;BA|i)X^Xxo{dVR@TEPULK||R6!mYece6b! zZ{9c^Q26!fm6DW7BYbgDnV*Q=ZiNee4eOMf$+8_>5S1KpX&a)}w@HB3O=FLrI-!`j zF&6xScKOktJHde()K`DRL+!iwRGr!)<>n=#smooP>vJ~vYt|EQ?iEJB25PO2w0`E< z_Wn`h(cD_nXYUgnkP^&ZIP5Vh3o8=mT@1t3FdF3)=cm}F>IPx^wW}yN2&dDzt>n{L zvRKb1j(1xW(AnXdLp$Ped`xHq|*gUcb4514r`dZi_W$r3jr5|Ac2nJXE5Q6-Hj z<M^mgu_l*?^eZ)NDid*Wsauw`EaQiD4JnxuGd|U6TusJckcMZ$sk=tibrYnmq=!Fj zmw&XMR<QWCl7Hj7eEKFWbr{v<xYDhM^FemUQPzoJnL7Bc7r*&0XSI*)R$Vt$#}hm` zoov#6a7fx*x0!_8%hmD1Lp_RBSd`lD-gi6|GC-el#$nWt`D@gxneQqr^521q^!3sU z3-6<rn+{Ty9uSkHznZ+}<C<oM|GYBjk1tNibYo6Bu?%$G2XxdD&7zc6{#G0vn8~uV z-Wt8MoYUH#<<r;@kpCsO{6fKap-GB3li#|qQGx2XQy}rA7Mv&Qn7k5#eo7aSo}l&w zQ)b>PA-VABAd^ujk6Uzvzx%`KuZ6Dd^bdb^_9vn)Qx&n&y~e1<LohS+vY$;F+-VjI zvmva>dwvkxe9VB0Y>kE=CxbuzSVdlo8*#wFx1s3ewVr#%)-*=MSQW1r>Yn`ABR_{> z|CzrBqe)ki6Fi2{Ba9KrJR0MjLlpU`u}ueDl?UO>&j+-~ue0J`*apO{{Mcp@ph5hm zO}lAXJNM%DdbfnfY{$g`pf05|g)DfjCEHd!?8Lpk@LH>%w_<^)&_6BSEa+G=;_o-& zJyOO#aOa*$T++RpwwkFfdR}X|<>UzIuL+*KP6Z*`lP*I(&2t`Ww$^?2k)hkvn$b>8 znO}JPlQvqc397$Mk$ARZJnajCx^OC{S<xlX|GT??MKL6xUWdG&4si5X3I=3RurMjT zH1em()>RZNlz|J5lOdb~vNQgNLPP1V$Aj#0-1(9xJ3dar7PM4;$)+3pHBS92b-Vl^ zA?OE}9jgf<TWa?6mn|-22+L?I$R|H#lsth>NFME5q^8_XB@K+9agE(ry*eYaK1<$j zDIHp)vD(p%Q`ZaF-Wcc<(E1HI<|y31vlpfNufQ4nXrmAqt~zdehFkh!ffz>v{#eTe zlk3}86^PwuGSgQ_upB=TUQmb9GWJ!DC9#V|b&)T7Z_brvthwrk<-hRq=B982d4G<5 zZe3;J{-U|A++dmGbu3)W`4+3`Q}VC<9g(*e5Kfnr+-|P=F#)FGTkC%Pnt9U<q$`{k zKG~@$d!IBO&w-YU=ZlmB)WmBM-B^z6w9WYZ7bNqKQh9GWGR~;bc|JxiP4%5N#MfTx zu^>s9h869ls{W@bZbIrP!HQrRYm6CTu88nE;Z(V~7?$g>5(#l2pJyupCs};9UVd1( zYUwif=D^IM8jhKj?QF-I&EgI^s0aPbz$g15<2fLdmv2%<bk>Qe7pYl#E(CEJ^9Nwx zRf*|)#Zza)@L!vSAW_@pdG^i&-<~BzGAr0X<Ai3Jmpeicb70^KgZ!_ySA%{6Ltf0n z0X(bhU%GQtgF+pw<^~A@$^DO0wtlD!vN?5cHktVU>aih2VR`)&24tPvT!l}0@DBPW z4QKn|ud%o0=7w4wn2k};D)Fw*vG;RKsb&bKn_;-BLQ*qodq2QGl&VI}Lv)P8)@LDS zanzkYSWJMGas9k3-rVb#i=cI)t5cnm-|DrvWJ${^pudZrTzE4m%cW6cpHudJ^Mpqv z7<vyCka>Jb@510FRq?i&3Wbsq3b8>3L*CRaHjun`=8a`(EsT&o4^)&4`w<mA0&Et^ zshKqa)pVe7A^mU3T}p_J@NV6}KUFl&|GQUvZC!q#^so-?7wN@|qWa})a=d;^M+QYC z8P;8i#wFiol$_PwjlM7qdw6*zst=DgMJcRl589?1by;)aR-c()93Fg~@UVmC{qrS# zXh1&y*5<-9Y*JwrRqm1H<qPX8*~Y0PRZuK{$)3a><+r)T9qYh+tvzX5u5*ogzc0~$ zvcHs@f+fJ2T8ohQY5OdznI{;#+0Q=hfodE%jhm#1AX`4yd{uMF5Rr1cMgFZ4@A82c zXW|BN<`>88>pf2@xoEtbw+ox3H0N%p)3(~-CTOL_1vP@_8z#Ce=jJB~pIqZB=DtQ% zk**peB)NlYm{}&veoYQKd>?Dg@=O{DG0qQQWGOBi4~cUGIdS&FS%$#`&ml)F#Mf<0 z^nLv&Sz>6gG$Tu)Vacd7L99j5^Wxxxt_XC^52+#kc;`w6`4g$OYh;q_)@bN9z{h<; zjbGm@oVcgo7UCrRVT3xk(MSijxEg+3jpu}CuL+{af7LkIFTC%*%8nUZL~f29WEphs zGsbSM;(QUW=PwK7KG>`uJt!Kfv~sS35E<abGhTN{1yLXp4yqK+DnTURdu>$wOT1~2 z4F%YKp!=^C13OBctH>L68(cQ`?2-LJ<VqUd4h|JCQ?saao_UhilwG``vN8Pk++_G9 z3Le*Vs3Ox8Iedz&{D9^#!d}hozqM*z-2F=ZFW7xN7@lawZtRtB%(k_q`>aDdRaA*c zTWI_ICF|t2e7klkiEX?_&pOG^P(cBHF7*V~@EO;xjSK8!1R$mxO7tMED8PmdD!Vv@ zzZKv>TbNUtuMW-Ok6Zg4Xx06Ae>-@$<?vMH<-JwCe-!V|wqO5GJ5VWSo%)o4Mopm@ zJOQnll*`_7NTZh2f#VS=KxOQg4*|&L%bU=d&F(I*7FWJQ=lsHhpRh=6wzB!pQ#ivE z7<-p}xE6?Fmu5mu6`GR<O7n1ptKrLV{8u-W;9|!yhG+YSS(3CA1wv-hUKO1gr}$52 zg~}3K7)?T1TFW`|tS4xwNuOVo<O1IFj&N+>-#k&N#_c`)Jg2+;9{%`e^$s+<Y}jf4 zuHKoXk}iMA;_;AN|6Wb|(d^@lc_BnUn5@h_fX^q)0?l}7Jl|pIk4YYD&+;!VZuvqB zD;Bn_;U!w7{Tn1cX6DxPImGLUt#!yNs`sZ}P#>qGA#r7SX4I79<|U$%&dJBwnDYIT ze<3^an&<6Pj;wuE&t;6LD+`To?RA0;B5}q*HV3Z=I(rzLK4I4mt__0bZHVXo^{(@& zH)EWqU4JNO%8)sL!h<(LVo@rfV#J>|9{RYbm$BlIdEXeBaPjAyh9m39!-5FMu=a40 zB`rPy)ycW+RIG+r_}KV*uHw?@M4w$`=g{)n(l1LakLO2?B$%RP5YNb1%524`Nj{lJ zgL3bQacPG`UH*eo@_KC$HKIs!ClOR#NZZ)T&jDflisZ*#w&U%`yW%8x{&0G%5pwQS zanomkYb{Es?V#-9X=g%_#sGi#qd2F^R-n!PV327TBj=eYPwjnTh27eOMOH{pGFsWN z&Wrleulw3e`GFk9aR>{&A6rH&UWV!8fB>9zNWU^Y4=?wEnGHLy4P}Ty%P`bsIKmaD zv}Gx66rf%@viZ$LqxzN?f7{b>bbZn6sY4O<RX(lG+Z%llSH+(ZoRsQe|3Tw%b2-yN zt2k$e&EC!IR&o1z-|-ZB=yBeMi=y?HVQarl-&2TZUTT!AAPkjLd^0CMzx$cP*G9~E zV0LcbU>T<@J=DhxC6d=Qzfi(^S34vkNF{V$-x)h@5m8^gk9Q2Y4v}t11G8NWn=8bZ z?Q<){{pmU$`n#0gy@n8_t4>c5<EnULL47d$p`}iB+}NXkFwt+VpJbMNZFb(*DQw<v z1<pS&H(X$?<x6`R(6Dgpp!86DX76obLGAffu_(8f*VYD<wm3Zo9Flc7h*3yGm%2l< zb@ba1Pi7#+RKLJp!!YV<%206?XmZmFnreM`Mv97!ht6&KSD0@MXR!ZdEOKH^<mEM7 z-g^53tAq+Qb_B|a^M@IFFpEElK0wi?c(Xm>2f9xGS9l)xYE0ny>g{Cmd&Ekf#590F zyUK$TkRq!D(^-*#vT))1uAffLI`<i|DW%(J8vB>^EW-JR#8wHeP%wtmfzuPRvL6J! zJfmUGHJiP0aoMr!s}4umd48Iz8S`*wK^f#Lp&s8m$TjK;w4!>?1%Z0aDq2MYTb#4; zOM06(AXC&^jF2`x$;(wzxG91nj-tA<f22f%$J^YcjZX0<78}t7!}GICcnlYO6>-+8 z-`%)^H_3M>)crFLK&X<!NHit|kVPXEHr}>u<6sk%&iGL!+}}Qc*SZ69^^AY{yjy4Z zfBPQsyG<>?VYhit-ZRy~I7rlCX`KV_2RK09hntBK^q>@+`Xpk;mpf`ds2y^cbcS;C zmeL_OLd&S$N)-O_=3xb$QfB0sig8o7CSag~?&8cS*)6Z*dZH+|K)!c08B-3AO5HfE zbSP}v=E<_Gf1A-aw<}bNU`1{#UXo?TOj|q>dEHrkS(4d*vK?z>0vh<){oogifYixm zn0p65DiaipSr=<6{=4b^j}|^7lT?>Wc#uXHb>S2)h48r2@>eft&Q{7PNcL-PI(>%t zwmeI@B<_ijv!5%akT#sMgg)ueIs%lON=DW^c`c&Do~VwYL3~8jt0_S<E6OdP+l173 z-q^dq355j=@57FFS9prZuh94qsB(f+^>vA84D6^hQKoM+ImxkN7)Bn_lG(bg?wl;* zLEAA;mrxga56dsXH$hr4Cne1$U@GQ|>=Q`W@p{&N7^Q9V*VdV#Zohihi=lCg3~|R@ zbVGwDSFf=d;Ca2qMm_G~Q?kWU@e8JRa{${s<NI#<-_G+p;md0nhIGuz1I_X$#!`J> z8`$nkMzK}UEfmj;xF*7mDjo9(Q}{VHBt@W08K=HdGJT6v=^6%*PE3+W)spT??|o<X zS+-jjJ@9`^uwy_l;K*)F!e&s73v-8&S~iIr?u_f`ww=O`8`lJIzji>}DAtdnVT>3C zvhH>@3>Eh*ZY4_g_cF-O`2&4>*GOopaMiilpXHkIshkeYX9g$z-e~XI8)f<hYv1{z zxT?)w`Qqif0XDtk1<%;7^%~e8q_jSF;K{m{N;)ba2<6(?V#8U2KRqSsTwnU_MA#t2 zbC_q-pJ)U^2~$rq2VJZ+p{E0fEsdaauuAfmgHMZ8Z9I&Qu+>*JyCj^iP1AAWyFlUR z9{gT{eyW7e$MSM2^&ONRs0Vb4?<Xv8Y($PON8LxXy%6$;#{E)1mEoT1l8Fd(&X(#8 zW8vp#>(fu%Ff#R=(^v_xPSn$Onz(bXc&2{7RPTaTzSP}?SgK=D>%uIEZNA<(d9h); z_#;bd`B;5{WBY}Jg!z8kRFZ*pk`oBj?>ei^pvadmP58s(>MbL{t-b?pweSX$<yc7E zsSW9O>F%2m_XcmKyjxo&jb$?6pf`}OE$^m^a@`=mcyy3?0J}ytmF|U8!jW@pGj5|D z{rn1BT}M1X!g+1mVQ$bM*F+I5{4)*<!IHOM`=QZ?I=4q9SFZ>}>wi%lck_q3*nu}Q zdEdd#I>G&Y%J_D2P~=k<+v~?Amv`(#%@T)XuEH+6Ytg}a<v9>AVqu}1excMFYvPkR z7O3K__Q4^qj?T5j=Ph^K>*$QBhbh5qM_JB6Snan?@NT*FTe`EHyun_-dbS!&a3POh zC#@s#KnI-Q$%EfsAKeb2-wY2Kuv3$DFr2$_fxfyGHu!C!Pjp9V3CzJ1xp4e_+w}u} zyEtpZ%o|YqM5yxKOzp)S941lUuTI8^z@rb}0Q1o_w-$JIw4cW1I7Y{nHb`jIo~%2^ zc=wgGh&O+m0LAX`^~L5jmWMe#`I6QNy({l*+sZEA`^!o)5J=kgS5n%zp*br+t_nAW zw(XhmoW+Z6kD4iXAvb74qpJ6pZ~PkjAO2|a%fCQZM;YHypbCVL=607=(-SfQt++@i z;IqESnxIrA`5YF~KZvB!uEObNuB7AC@nR?ir{~s;C=;T>o0dQbP*#X8Gnl{V7~K;5 z&Gm{!t(K`A)q~b4>u@OO8bi3#)qq~*vb@SBFRmA%7w+*&&cP$$_zb>Cu|jlA?_(TR zM@`WEr<n`$y8+SkB=~@hbz&@#c_C`6Aw}tkFS@I6gZf?A`Vg<Ryi<>MShZgRl0K;X z!P2^X^S4C=Q{Z<x59?KX3)&QvW)CYAE8}U{r5z!w@+XsH0He|fPdbm1>i4Wste1{9 zn2pY3m<0he@7$n6#V00?Jb(PNl{a{q;}P@N&tI}FD&~t3ji3m_-8y6*D;b%oSHl1% zV3no{`L(`uaH#t6wI-Nb)8sP$1h*KAA}wPhvfMtmAdLx{U*)$$YUq5H&i>QItts;& zzLL_4=rcwJDW2l`+lr|o$C1a$OV~QxU&^=S>y9y<knu)U%$BES7q4AjNxGQ$mD~Bd z)QR?cH(wEDtxY*RxmWUOL-ELwcO4JAUxMb>rC*~Kq_pB+RzW{}Q9Afw&WhWyT&)uZ z^FF`wqr3Q9hQnMnJ%<wQ4=~q=yYt<OG4+>KL9X0SxiRtMWk3#P^Ya_Z`aKa@z!{3a zb`7>mwVDJBKXkYgtEvQH-gn-xH&bEd`^o%Y#aZXrE6JFHv-K~Dvg*apLvpi=x$Fq= zCgZ-3AU0Y(%JSZOEX8**cx80^nD5VV>>`pM3<hQH!*6E$;&^-gs^?ej-DXX~QH--( z;WL7alKYf49gLYIJ%+sqLMyoeBli}RrNzekpwy9odqb|L^k%(KlbqI}&6`6F3_tJQ zXDWWJ*_cfR@`r%ak#on{TFW%osLFYCK<X&;l*h>tvDwQTEnT?&oQm0=DU}_GXLJN+ zI19U>n62(*N)mz5oR<1(LME$f4_7!_uxm2In0r6yyp1qJpovbel~ueBA6nd^-!k`O zn{vcLeP0c`VwFBb0Wl^6PWf*Zl}k+$u4;Cpw2jepXhel+Zs`UW8AIZr%|y8^e%rsk zZy&wMjlY#|mx-1Psot8@ffeU350Q)?6tqg`-*?)oNN{soq000Mo_9r0AhZ;YsT2=- zlvcsZms-hS4wEd8SKgIOh#%*@oS%^uJM+Njs%PNWy7JX&fT=QCJrgPwb5RK_<x2Is zn}U9;^wZqx>GD;2Er|D0N^zGadajP1w>U`U<O8{4j<012ek-=`BI@aRN~7kgaJ=L? zbvzSyg=e2d^zQ(z+EXT-($*+720{ul4?5r;>B=)m2n$nysaM+1^+Ej$4y>5@R;BG% z>k5So0iksPXqovc>VEkjd5A@pOtVzcO_Lur-1kh#C8d;28u?`9mupi+fb2)4?l(iF zl0dR<nI7+Bfl^u-@>BAao1IUTdJj^~wguB(*Y9@?cDp|;%Zh{Tc7|Iz;0a}bNo2eu zRE{*f{o#gFr0nF=t>b*Ec%ZUwC|S%F35Mw5b4q_aFJ;ZqYv+k$-l%c?Jr$ZoQ4+=e zzMxhSMRVDit@&ZD@nRC=s5M*o+Kr0|4|asolpXBjBttap<<mnVsnzTA3@m6vSV#g8 z%!9c-pg>=Bw!dGLPTc1|y0$!H{raL7Gs}Qt7WtXP=@Z*R{h;!O4svu0kQhG`?=fHt zb26HDmI5;jJ}*yo@WDPtaY;QtBXsr0!WCltYhV5@@HS=8+xLfW^Jo8(=;}t^PCQ)5 zdH{&%G6g8{9$T=L0pk7lo6L)v2(_cdnz9qoUbEnRq!0TpRAnzJJZ%4;D7Bq+C(Xv6 zKMWwn@z_@|K^5+;j%Oa%bGu@1eydgW)ut@#2Z=>LC70tqK~5ZeC88vfMu0YJN1^+G z5*LPJQdFrq7IPLm_|;8cI%0X{0OVQ|rxEKbIp)jR1Y);(gJnZ)2#;iQ8eh?w7^%ug zg>P$y-T#|7zzejLP0+Vg<?Y{^K95HkT7Hu}|4oP9X><Nm#Ifb8W!VSXV!R{jy<P#& zLoEQ1k2Nw_b=-mgj%GfXX?m`lins48?b7HKt~#ubB43*uQ(@un=QnalxH;I5_o?&d zLu+b7S))aI@y{V9utC&|Ds~U;3Q@@-s|b~P&2M4BkY^oF$vEHnunO+*%F^+W6Q(n3 z_RfqIyb1&j9cKps;zYg<gSao57mr<KcoK(NC=7-AL{HM4_l^M)nxLlYvGGie+xh8+ zL%sD1n3OcQz7SxBQ=)#*h`U=VAmvo-%#3sEQ`f4D->oWq$;~%3Jd4~~zBh^|V-w=3 zQWI2>q*+#}qw*ZOyB_rNPD77GxeiCgjjE-aPN7|xL_7f9EJ{ZG?;+4L4N~3w8_l>H zJSaz4#736ak9cjiqWlN=6&%*{&<o9F5dRAI89P7_a)GbxQj)Ubp#I;^z#Q-%Fkfsx zMa-b70H<JGF>BOEdOq_h0>-5+vXmNy834#5E7t{Q0UIt1h~q?*-i#V&nOKCFcPZCM zbbsld8Z7aM0MpD1Dj;5C)nwlmjCp8(2wl#dj*QUBA5JMcrFi_brwW?++QQ`UZZPUk zKkEo|8?Eu)GuKokEPG2Y%r2GN;mOOm04~db@^hYi0JOWO?^M)IOIY_*=cRrY$bCKP z`0FKhzGQxwSWwhwq*TM_tXD?DH#vTLz-x)%zF)S!Qbsf~yJzYS>1vJ<$gTWf?1{c3 z<_xgTaXLy=bB<2LUoaL6s`c!F;qDF)h@!&r=6x=Do6U!s-G7%zreE6J_Z*Ixoe`;d zzIH7@0Y}HoV+OE+umsmNgF~`!UD9t$=B5EG1{s<Vzj{SXl2Ak1P+#e6&c)Z%d(J=f z{Nd9OXTuL@T&%*@Nyu_Xu~OFsPTsY=@kbhQUNCoCVDk<_{ohCWO1Gqi3=_!Syxd!H z{uGUpelUZ;H1?Pz>?lHd9&8o<H6QAGC4~nLMKtZej@&9IERUbX2CwN0{DBMqvV!^m zDhUnSu!@WvcX~85YOHlQfStBJie%wZCrkYqg;EwQ-k2(%vc7x37O2P&hTWQlxQ7CZ z*dpp}CaY*a%4-r*Q-HpFO&dyptBbJ$%>8>}+&5#Ylx$}2z{(4xjcGZ>IzP!YLewC@ z&LPW7Y6$#C*=#@1TC+H+EZMnGN{AFYzHRKaI#EAESrlNy*$8PQ;g6hPGBGZH`0QfP zj0v2TfoUqqf6cZKw4Tv?jW220ueRKtM%}rnmK?Kfe1akenA|yt4x{WHrfOm5&0?UJ ztm@Ebgw)tdac!N**yU*NG}ZLp_|1C^3^-yP9B?b`V?yzel3b6}R(&KpojWG&mDCxs zMRvDlfE|(Rg)QUO{t#H!3^5PUo)k9`87tkwcM)Q%u#q)^u%+1RQeELte_m@lYvvg@ zlhfPKefzez&u+u={;j$*n{cF3vtb*XUf3lvce7Ob!)=>8uReZYHE609Y1Cage^s|h zm!I{#`YXR1e_uCv9=-DS)7yo1dfO}8l|-_lXCe|u8M3bEYe1Ri65qXBKv~O<N=R6@ z#jmzdMc+t4(yncFDGe^CFJjLGl)e$Z&YPGZvUtq<NdGF0a#Gf4P{j7yNLydbYp)w3 zZl(UR^;=%@#xIm`)z7c{mn!?;2&?@5l*g6i8hlY)&29t_hUiRm<*b1T<t}cVI&<-- z-#_C^4-C>f2n6KsV0nGB%1QyT+jwrcLi(QR6ri8xXv+OMmm3KltXf-8>Qhq;mWk?m z1iotb=LQ}O@b~<wBd&onmPRa{<hvC-P%;-icS=B?bgO55gf}fdlwR?J$NUhd{-pVu zM~UsAp|RKa>hwa*)?JWR<O~$8+bcp>H6X<ct0pBQbJKZf7Cjb4nZNzW4fif2X(q^L zAfL1Ai3k~fFfk(Ord2YWy8O{+dH(a(I#sDB#gBN4EZgYyvm>-e49g4Dsd#fd97d1d zeK=By%{+sq<21nmqhK1a+C!V^$xY44(blZm9-+6JeN8}jULR|dzn{sVZkl|zx>yy! zl6sIF_uCT~?sIY%sAv{=FLg5P*4I-4ceG1JP1OB1I#i{6y79Nj_18ZpzFJACJJ_?m z<yi@)+Q=?XmM_=0b!z;b^y=5MiwPN@@6;H)>71Lx6RuKBe}HN8*2{~{&D~A+?qvqJ z#|7%9;Jlh7f(-*eR+v_vuEo+NA~!PJ`n+-W%@*m`q>vqYaKVZ#PbOevHQlgeMFV}K zaND5Ydt{t11WXlz-@G=nkVx`h`uS6)6e`knYEE(te7R`bm~~ye-|8MMQ!?dW1x9-^ z-}5ZA<-7+mG0wl~I7GW)Wa}{A^hO|aoG;Wn%N2qBvaqz)M;+Zt2Fwm_i2zU|TB!6Q z8zmEEx~vrhl-+&jLZ%5(((g$(e0U4(THQo)x`u~)IzOejgvDsw>2rcq$tYwU-y)%T zm$BQMDPT&R<Qr*Ilat%vg)%Ngh%dR;AGw&ZpE~-*DFbD!?{h@7#!|SzV{{|+N?=#d z;;DDUg|pEAhpoQ=iZX7yfbm^YKpIH}LFrhek(Lmody$rs?yf~Zz(pzP?(Rm)rMnyH zlI~vkZlC9U-~ar-`Q{#Gc3_y<x%b}dcdm2Jb)5~q@y(X(0mWyz`T2!pWJ4!a#m?TZ z00EB1dsV{=$R;nn{WH_k9IvObg$-;-_m>`g;1m(0;x!K{f}U7iY}5EB-Ta-lO)sSJ zzt?G_LRybs9Ly{<Q%#lWDEprFnM2B5?aMT7evIVrPTOXQ`aDWTL@@e45KkuYYmpn= zoX!-B08Ij^^2(w!ym-zzKhdesf@gQ8Euu)byw1z)rg*muPaj44{delJvQn4tNtgF* zyvGltcf-l{rCQC8dMc+x_Uu>RUCVdfzdRPg2lNUbuGjHnX1-~Y6;HS%v$}WHdZj(Y ze2{^tHF}gOkIx>?S>zX^<5=vKe}61Ib49)yvo4M+Qdbhxx!9dkX7^a_lKrG}YG10V zi0kzk7WHdC`g9jKy9c-wm7dht&U|!jC@uvuW$K$+)uw{r;hO1THG6U+qNRWm`st#R zSh-L&LL{p22fch+zWK1967p`OZ5M&VF+}3uO@Ti7Cw0EqnpI1sXYWdrwtF!@JuM^6 z->&KQeZC@n*McbV*g&V;`lMOBVbOHCzb?C{rRC)AV_whW%^9gwY#6;$t>4zM(%{G5 zoG^-!yw8@uu6DALc<pmUkuJqWsz^8GpGVpeKgdg1G?>ao7wYt<#!XhzZ~yS|kLglP zCmh*aR`bW*npyZ~+;6cb7ufxIw+90TGFlAYd+YGpsVxg{7w%c4+m2`qNiE1%AtCD0 z&tK(IMmAmm87%SRKKkaEZ5RMbYN<Fn)jRo$OQrFhlDAn<Ka!Nserf+e?DJwnr5CUV zIIuH%?S$iWHH5->c>vO;H=^!_zUA3RA74<W|0}5h*deUVYc<Ifvk2Tr&EH?pas3zS zY^?xt+N$TrsF&!>{U7&C_X+^@7fdJ#4fO)SRdVb)Rj<_z8Ux-KwS%Uzq;b?^Ehq8{ z5C8na)M6$5gT^2XO9Vo{)GRG6x3JBJQwq0+Q@ufkio+VIS5-iu+c-&`!|J;W1P;Vh z_xJe-K>vM20&Ivu+fW@Mx;NoXzS+R&Z7-1iI{5`12j%MHAK*QD>2JDlyZv}Ub>po| zq$wxByuK4jE2(e`SRzDqyLW?F$=)MSbB8(|<&=0Za5pv@NF-hHD59EN_lkhzhD6t9 zV5#<9WaHs}gUYm2qPpZD?}4YS+t2#8vl4@rrY3;gQRF=Yn3;kjqPt&ZWj^`f|GNVA zXWD_}3{z~KYV)D;`3afF>(JpmMNtH@dL#npcZ@(-2;_wBC_aX#q0VsQUikFs8ZG{u zW6&y1-3UD%A~rp!t9Db4>@{N*QAmm+A5Gg&`+-?M(;%rOH>6|G0S^()&MoUUSu~ua zl^qfrDWE5`v;|-Oadn5hA%t)dF&g*bkCrI9K}`>QLKzkO*6P>0Aa-fKiSn~bk|ZZY zA=W*ZH&G$@avu?NtQ?+UB^!J3LhlB`g-8Mro~IkCKv|7@3uL-!0MQ{s=Fdb?Z01f2 zA8b{<FZaia97!TDl!Q;DG&97(F&js1k7G2q+<aVJF%dD}OTeOsajfpKH?XdrLO|Bg zwVgi?TjIG4n{V~~g(1@G%px4YnEt%@8!5YaLNdR-+QC9S4q2}mZJA>`?5^eGA8&h_ zTDw0VA^XBgsQ<k%n=lfRw$R?_k5D^_8|QAnsssl^S{rJt=9(Jk@AeFMZFZjE`dstv z=W(`C+{%77X~ZQlUuR0z(=PYxu$jb_&q3Xe71p*lnx-MgQ^`11)MPEzEz;D~t+!E+ z5Is$JJXL70uKzVPCp|JP{#V*O+ag2d%OErW(KlJ`9Wl(p-V&O`?;h~+_VhHtni7}E z2Z8md9!QNhL~OfKE9Q)sW;`(?O%|(WR^FhuDRzSPitFGe(Q2xn*Y6~!BkU&`zDk2* z494y^R*1HJ>2d~xFt^~=EyMid7i<Ud)t99LY5ze2unBQ4N&?P~2MlaRXWX#73)Em% zLx1?~=|FkaActzk@xXuq&zU<jFm0D+m6(>^_i=59QHJuE<pfA>lHj#n{2(P#FB^rx zVDo8A%SIg+x=qM#5!f}j=%zF;jds0qU(zjh$efvJ&YTIW_pFjgD;!arz{K#SAc-Y_ zh=^>%5M=rq9~Bed{+_I!AF7?=!@d75rCFqxAK)O#%X!T>m0_Tc`{7zx;pdPE$U4&l zhR9EKEBbiy@kw(ec18tES}-HeF`G0`^r4M;L?oM|sUaL}g)$pNgpSRaO;)JgEUqBO zXjdZMx}C4AmHR>8Xlb=uOhh%h=V0kiWvW#+{@1Ld(MM;TzLt?8@zu--;hZ9^(yTOp zzpq{^4<X!zhy7041^GP@VNXcn(85*eKak9<f24QaE1jDBi~i0i<L-ziC(jz>!@|6D znfOHIS^`(NJQKVFC*{!k^Xo#%?Bdl{?1v1_V9+P%{i)Aci`!1*`>9SWb-K6~F*+w9 zm1|62S*Z?;p{eckBMs#rzIrrD?y<L~>kOKPV)pkLfDuc+=yv&`!9V0(B3Hee_^RZp zUH&CyAPn(y6i9L9^?$ez4c_F-aOnJY2=9%Dq>Jt|yYv#305!HKmQ~w4mQA~-2b*Mg zifol7-kK*e2G)#<ey#(A=(rBB*OO<ckEDqVNoY&(4}yaOYob3c1&o`kc~5cFr#z2O zspIBZfgvcG99pmcy*T+hASZ+?@ITk{eacV}3C2!mo}J#w!b_vou<%Z~StX0J&IndN zAxLt$baRz$>$M}T-YINfK*-?QCiH6H!&^OC)5uui75MV-z}9+*jo=&%(i|xz%fRHX zYjE#Id1B#&L?oi2kV{yu$eCq#$*1%#a7fRc1ofRc2$SBJg?`!IUJyR5IExk#!u4a8 z*INy1COrYQBF+XPr?&|4*3kQAo&4Iwe8iz7tw8dD=0cs<x>T~zBvA3k4AnFm9E?%l zp)oxV+ZswP?*8FBZe#cDb<D&)(4XnPa2|Y<2W6A*4a*bMkC5GT-J90eEOg2y`%_`; zYXa^t5l}`@3II7^8fRPVBsgO|)Kor1=RhIKQ@-|j$NsT~NnLQgTcmV+V&dPyRGJ4d zBkGras)T<qb0k_W184;5<!xzR;vw3wv;Vz|8x<G{h%L0fV(HxhC-K$U00gg<7C)7} zcDa|nh?uKPUb5=z(u&<NZqwX;3~cRU1I<4k>Snc`6Zuvfp<{{T#%6hT$b~GF;E1u6 z;F=mbgOB3<P(^uOY1BHIDyF9%wQ>^}RuN?*Exs6NT7LsDk0z!)PmBBJ>5iHN*iJFb zw@kXRNtE)^6q9(>%mxgKrdunOM1*cU4RPr(F>xs~lt$Z^dSt@KLe_$4L^Y(AN2o<4 zNprj}c8Y<q&iG!61Nf>Wmu-nd)Vpq$h4oiGrily`0nh>B3Z&TWar&>LUDDcK7Jh^B zqGc~QBI`JGH9M<+J}T@|ObGu3pW-&7k|*@RX3vc%U02USRiJ(mOB??`hgm=g?@J>L zOcE^&rUZTQRiAma<ED$^W-21Ihm<y>JQl5zf~XT+l1rkG)LV1zbuE&$t=Ww|K%(gU zZgpvT;xQtA%j@h|R!giUXl_MLc|<USbFXf1x}0b4^2NNX7ONKU)O>4lIVkv8XH{fA zoKSkW_h`f*NcH3p6C3_)DQ@WKyo6sKgY5Ilt_!YFFw4(23E%Qk^}9l;Fz3k>&x!9{ z>s-10x7i(tPX~OIP?sB4NFj<vO4;GxDdiT<N9h<*)eHwNuc&W5&c4yzZYJp1Vmuxh zMFvQ7U-EIBBITpIeYUmJGrYdLLt)#g+7S_CwE}Q18KA0=N{DY6`qs*SVRptx%c!V{ z*N(%~Z7$O+ZlWw$&V8jrf~Q7`DW*6vJr4|$2w!~l^S7PKvW<iynmraQ=)_lr=4(`5 z2)S~S1}F1craI`a%OzN4aGJqg7lHO%M~upTT5Idlyol(kSRql3`jN^Oc>)-Aj}dd5 zI%l`6w**!9dA_4cpK_r+@luCEt^}!bBUdrXqB=v#V*05rr*gZE%o9@?n3y4&{9~8V zFOZOuPaKgyF-+|aU<kRwlSl;{)L`w>k7gx4S)q`&do>yc4OQgwBhoO#U=1BR-D|h7 zNG0>#meG?El%vH)?oqCMeW);L@PUhjU%wv^$=Ff=#LkRBxi84&JT~Tc{GT6FABj@q zaS8&XDVkAq(&4R@ZucGdVx~IT`zY8nu9K?YL^LPE?v!;`;-5s3H9Y`d$na+(f+Z|b z%}#WRTo+~#GH)k<DJ5|(4WrCo0Wr_B-WYArss8CHE;j{vPA1-9E?axhZ2G;=md#M! zZ5IW`2xw`ZGIo9d5~_2?D2{e^*q+&zx*g0HIc@guru#pr9?VPgbrV2T65evzjV`r5 z-0p?0+vHeV*a!n*D&ao><JGq8r>``9S)5H<X{wmr8zqN2lkc2fa;YU}E*lTs06|`w z{{qzYc#ZeFUShum;uzAyB`6ME>7@KO#j(2&OAh6lZ+aHm_U{`<ZqBy(#SWcwESgdo zdfVDuVs{!ylxeV<mY|+}i|*5&JAnl2f0kMjmwmIRUd?$Uym=4OFE{O}8nKvs06v>i z<c(ccKJ*e@YGNUP$Q_93DF)JfI?i>rVo!we8)drP<{3Hu`Xisc@|#n}V@g53b))~^ z>Lh^sT=rj;H~%f(-Uc(@#H49!ICWw;aZ5QM^IZ78!T4fB86RkkP7w9$#|v#8F3{6p z{I0#PYGygrXHULWuQMC=6VH{b1#TSF82e#|2ItWEd9KP+6V+|nwDpFuI<6tMQ9xa5 z*oJyTT*6pz>ofWnj;Gb@T@kD+x^2&WdTAn3hRz0V)?e?t)6-mED(@1$trA21$;Q=5 z{Qmk0k}7$D9ebvHS-kf17y>G>87Rr+0+`f`fVpr+y4msJJAnM3H0o+)Hteh%2%Q?i zd06X$c(1W)x8`BsH810AV<=x8ik#C~J}YOzW7;pIW5$O|LTA|Zn-mmo22+K4V2cOn z3Ya86<Xn|{E!+Qdz3ky>ci~}VDsxY2VA+5nDp7-}c#4Y4nsz^QeeHS)m%pHzRNXA+ zusF9z4Th6J^4_`~8o}C;w@c|*D+{@Me~La=R%fFG&nb)*yK5gU4X1J&vg<Y>aPs?O zo~S@e`qV-)14D`r7Tkk08AU`CUH8WNjxj_yrR;5b=Mj2P3>~yj0Ju>f0UpMpuiy8I z+a7Oq9r5ROsBkVu<3iz|<vXEqy47B`&}bG-9-}&$-ZiZfabvDX7ob<tj`%z<J*Qat zGydq>$Lcr|Q$e%I^>41<qlm`@uzr{AaK0tm@(A_FU)G-bh9OU0w&oGtY^hpX8?~<c z-4ue13^Qy4I}H_k``f|_%j$pV3xXI7v_SwJ%;AujOO7s38EA)WuR6ojinYpA-Rl|$ ze!br|R8bpBNHne;!zXDy?XSWR*ruP|Hm(NxXRhgDs!992CGRU=V%9ipETh#5H+H<A z_il#$Pq(psJ(Ny}x~4YdC^juRySJ+)-aIGealUjmz<|mE&AM{4Lv!-`mLNi5lb-Kf zM?3(khOP)jyr$x;C~rEbOS0-)%PoS}?e6E_VVtYh&lK9u`ehvR;G(svpnf^p<5w9< z5#(oMh8-xSN?!30sa#9plIpg2CCa&XZ9Y5iZtA7#?7U@0T<q~_0yRYf>Ivkzsj25H z@-%<s-QDf*73F=90^s_NGz;m-g&gI=_h-G@zb;F6A24r=#U8KKH4F9FEA$s`WKKuC zjq`xMCd*iSPqyk<K28`?qKHrRR!`AmYwoig(KjIi7$VlbSpt_v6xt?+EGuhla>^U3 zQ4aT2aIAm|iyQx>NABp0{NSBj*ZD8fG}0(ZcK$O}{3lQJ&c>SsLd#jc55lg-^0@gH ze{PO^ER1^fzSvRu$A|_W7Zixw;<YZ@U3Skvs|JMKK5pm1ol2|og334X#CzA#y}tQG z65__!o3+xbmGf1cF4}iWyRq6@lw$s2b@BVV{svtsjLf*bi}Pv3^s$-pKE0pYF|g}x z7qnb=C*@+9R1tcQK!ZEE9ud+_)b<W|I!(S;10k)u(efNv11K+7fPlx0?r@51Q6vvf zItjRh0-z55cqxxmB2M+TK<_3s@l@M@l&Gnn%$Zl%Aj5clw?sl#!`9|qU?&9FfRqiY z61^*UcxRl!#r71AehFAC<essAoa~)9^9Z~0v}?UFceVw7X$d9i#$WQ>e$kR{kpY$p zk^Tr?Dg@E+*)7g;lfN8;8O!{5UI^F=e_|asSWYmYd-Rvn=<)-R)tdZ&Tw?k-qV00n z9Kj1?7=Xhq`-j+rhcQ*WH;?0*)WxFn2*s!=GzU*1O;|@C*h=wLu@OdtiBD~_3xW}^ zwSuPqnJb?e?RfNY1iGQ`<Z722<k^CoHXcxCgN~j55L~U!S#)d<yBYLN$KQ<t8QfDD z5~#}dFb=WXomaf>hkCqrivkxbf%rwh(eP)|VrMjSw=h4A%kK_f+^XL0&(n(etqIc4 z<q^WCp;>Jhgtl_wN+3QsW{zH-0)@K!JPGU#?O{9t%&e?~q3jpHBJ3tvm#JP>Z<n_{ zsD<ML@r>}#Pz3&M=jU!fCABC^MXC~H6aWA>QIs0j$Nx7vS%I#7%hb7J88{0MIN=({ zW&r->IscP7fLqSvfZ+z)_^Q+|wRp?_v~)jD$ED)ixzXP6q%&c4-So;WGesb?(pa@h zLZRB{h=h&=446Xb<;k2ydSNgQ*=|P;m;d{7)Zm#CoouV=5{fwdcA@TAGDDv+5C;7b zRB!BA`#vBRLFfo#Mbfv^yvzDd0SPu-07IilL(W(MBP+f4?Dw)cdG;zeM>77r@r96E z0YI!R?2MZdtl~%V+QuWZ>o~w;S?OJHGR#BbT>nLYYGRmC&6X(yV#^SVBiPSaf-b<j z!oc&|en*)3A#t|v9Kt2Zc+Tvn2kE4K=W-5Yj1|$#$1#oZnqXimqm4a`YtpT&W%<6| zX|gpaIuaVmqq1xG{k+#WzQZ}n5q2ZV^Wi*AHm!tM{Q<D`?}=3JwAE|_@sI;G-=$!P z@Bm>P+O&(at)Un?RDHbc!jH8@VcuJb7K0M3buTlBcA3xKgmqMm{}Zva%Je7%XjWk% zKu&a0ZI<joQZu<2@ClmXQLHrD#Q2URR&%x*%`&pH4?TY(J{JzGo=hcsTZvyv+cFvd z#se5L-_q%Bjzrbn5d8i25=anl5iHj)OBFL=4PiJ=F;-$YgKUgZjbNn}OJGXQ-k?pX z_tzY8uRmYMnr!iQcLse$E^dsX{VHKh^FRofzlLnT{l69uIR5Yd)8uLFVeVopxBupg zOu$_siZDbpNI3aX_(S_iMLAxZh0@H#5w@j6jDb$?^+?HLq|1)ssfBT%j|080EZw@{ zbwgds@u~z7Uhum|M2yRrsUkLE1$QOVO-7A&&9<%geRS=5;QeuL#2*f~)(wm8!a#;_ z*4JD?Cz5OPH#eJ4h#{sS!AIM2)N6EPuVX9>^N0Ydsk_#{Q!=LmQr0{B_dpmLHN-2v z3Xpz^fU2$zp;P9<No}%A!kb98u$v%NInr=n9DBPT96&blE*QI*@YUBI7bhYJFWZv^ zQXQR__vaHs=27{wQ9RY5BrN>rVt)7P=HQ8~1AH+?6Cm-MsQfb~$)$$lsJGX}t}W@& zJy|~vFHYShCVP}l)43V1scbja>UxT_vFdl{RE(7WTu#9lrn^ahVpnTldiR2ZO)#;w zn=h@Z=Ux;S`X1q8!VP>JEn6}x3)dz;_F`ZY0|#%+gHc*uo$a4I{!gN2d?+2|E`Mro zJLFuEMHylb4|nOiqoSt9aRSLs+$srPbw{Hzv6H0mI=j`|?p^#H|AbwW%<m1=@U&9V zTZinh>T=d+4*;3;GxoCxzSuqIRJAt0t5)V0tATu7-p`-ZW_w&k9rSezvjDDv(RjLo zlCLPgU*9!&zK|V7<hEC~MPd))+?P)#pzr$EDIUcL=OzGQ^X1RYjZ&@2-8O^4!|C&= z_x>BL+PW5^s--@*wMnA3aZ>b~d0E2X#F6A*;_SYjo|CsVqrRKb@{n=lD)+_UbzdUi zU4>`yqNdpeLkjzDwe5nULEpKUznRrcStg6Vq3XfXMQxIR@rOx8yN4P<3V`lNnXF?S z_%H4f#C?+R8ys9s#x$t!wc4fQWimCl^%YD<b=_`MdpZ?cG%MIOD2z2w@eVlU-&64? z-1K}QBP+Dk73Dswdlx)B8B(vI{fyP%#fLn8h1jVT^~!sw_{ah&TS_+nhp&8>M^mJ< zhR}-9=RZ0aa_OY8t*s+-aaFjYHB}0g**L7Xk9?2K*|KEv7N5-|Dek^u?0u&KQy-iF z?aU=-?C0Q8%}gYRc_%0i@awr(FEwAJlIiF6yISqM!e_;M8hkIldWU(bUTa@$3>x`P z#do#zVjP}VY{4jIyVaBfM<Zc4R0MJ)%j-B(pJh<!fW@3w)E9(~P7m2hi_$0CtKl3R zF<35XOez8tEh^fX{{)FpD%MCy1jgb>!cEHCt7alE)J=@3TIX_3xMTAIpWV1hOY0Uc z@{c9llx7QCAl=VVF}Q!p+b$szqB0H+o}%{M0d<OaSf2Q39+!McWXm-GQqp%TduZNZ zzCr^B?@j*F2b8m(T|iI6p5R;`mzUq#I|@XfJR2EN!C!oIfcmhYoYag+fwMbma(9z~ zANOTXW!D3z2$URC;^}Wz%WlO><hOC|6@f2k%Eg3Wh{*unP`87HgpO`<R%Bf4EKi#l z3?bs>rm2|B%QMoMCUQ8ne$t(wK?-1!9p4Bvl02uY9Sfyb$o-p>o^%pSq1lih^y3E6 zfBoMu4`9*ff)jNYj7oF3T*B}vaA(C=f$T!6<IS@XG5fOgH{>9a6%;Wubds$bY=J62 z<n2R_v2i;-%n`heO-Nc1cKk(8ybgzyjZ+mw2k`!u_n=!4{yP{w$i++=I7Y6v%wQJ) zt#2MZYbHzG><<z}HzoS+cYpHU_GxAdxcYjtqDsj7(gr_gJtCg7T@v=o|DN#H4MYRV zfxVX+K0?_?Lqn4u|DKBRl0QQjR6n)@DC@i{=55k#e<$*b0qmZbv*>*O>h1Y9W&vUQ zciiUl0kmMGSvdI{1eEC6To`5VV!gc~ampK$uV66I&T?BDN|0%cSh>{Rz#Wwr>L5uN z;BW?K!-0xKL3oR9M4epl3U>P$jo=;#_~m-Z(WVDvI*Sl&0hXjG!0vWH7DkStk*+xh z?WY#?X^6)>$ax<@ZQT9|;*=iJ;<1y;x6gPx47^9%ZmQi6VyMleQXqt2h0)#RL1LEm zWWg$Uja&NA1mu&<Y5Y#X8=D^gmK{_ji>5+OkqKqPhP!@}Bi=ya%+<eRfB%V)6jnsj zZomB-iv0v$ImbZ7G)RsmKw3ORU`=)jMR`f3lG5hCaC3tcekJf3oaF=lKIask7$JIF zfZ1=>9Dzn>x^E$jQ3E%0F|Mb$g@DX%>h|04y0t*@5@@o?m!yjEpnCKtHrvK~(RZBz z=v>1$doT`wt@`;_zk3)GEjITc-5TEUj8!XKBgk{>R4)^Mtmg|5`mC;f@<YDwJSz0V zJXuuHo!vB?2c(e}8`ZDh>eHAwf>z4T;H=Dq&&eB78L9mG6CT=|kc{sR4)P_P+zBVa z$Py9n%R!gXuvC1RwDIwA1sbp^OSi))@j-kgJ>`ksni0mMapWbGaI%bkgbzpyfJ1<t z6E@@JhGNE4Gp*at#{n_SJ?J|H%*|rxn{9bOD%qJeVDgjmZKPiFpyoDz_uv@(#%Hd| z%+1M!Fg4KkWtuCj9DF82*KOcE%<iN!rM@vNe5Sx%PB(a#EQtAfM1nZ<nBQiW^XNF_ z3EhwXs>%NpWk6Gow0w!8l7Rc?@uOIKD?wT3>gn0pz6%|W^8LK^X<S7oA>OT=U$l~* zX;%c*&uKuzam%&g>zDUiqr)VWQ8MkM$HR`s?=roIKP}54)ApbkUlo<38omhbWz!<k zVV*s@T|e;29jANcNJOfA-QY)U?5D=T6{2e#MJBjLYZ~-g$&?;Xdo8jHBJ2-cTM2RV zGX?q6<IAyD@udrdk;VJi%*k@mMGPc&H7tHoO^A;jPW`oue!YAyC;4YE%vFyFe)Zz* zVlJ6iQX+AQOX|=k>ATApgIOxYTI{vKr4Zxy^h&9F^R>y0XI*4MwOuO@UV&%ZNn{^E z#ag9J26{steP)%Fu6uC?lx-nhuShKg^x^ogAIMbNd{oFms56b$GulgZ@rFO*+kp;_ zP3bJF8{t?JLy9!(ruxy7#YyuO)KFE>Q}}fULb_&J6QlH2$KGMqjI{WZTug~V)|J4R zb<LjlNmu+%jFu$i9I;%nYU}K@&zNq*<F#(q@;<^~DXf5Qrqx&1p3p-NErT=v6-r&i z`}7*d`TLWeM`e4C+3eCg<O=(&>|E5M&&?^b68F^JP!r@RJmE(K3i9^Pw%J6RznE{) zJmvpOlBxnEsm*_q)IYA+W~I5_9uoW5NgQsb!>4xmaI34CbF5R;+1NFOZ99er`)y3A zv5SdK#^Mq;_tNYB@rSm*WyQ{Ls$l`K@}RvRoRnQv)4p|VFyzo`nf_R2+bx6hVsEms z<?Yt2$>f#S#96nm*6=W^XW3gF-TPZHTVuD*<FPrE-f&E&6a^7@&a-KnKS!J^OUsuJ zd3<|Ar@$tg)U=6hZA;3RfLA%cfHsf@7xgMFm)~c3BL7!oJ~VBi*%B_A$zT2sV&B}V z1or!PGUB<{PvtkqtNd!6x1GmkEKGOYq9~F&ah|NC%t6T9{{{?iF1B2<r;ulxe>7^V znsPsCsuP#Fj^KMMBzNDQR>$Ojo#F(n0W}x!%iS83d<vu9Eyd&u%t8C1+GhfQxuL9- zb9?OQyRzs>&Fu;jUvb{_))2b-79{@5|8Z%zp}8lK3Dn`!fWC4%*<f+McE`RCL)<A| zlo|b(i*EQY7d;H%irN|dY<@v=o84M_(vh>HR-{2{**3Wffy!(g{^>}9=zH9Tqksw~ zw(`qg<q`Fb%xvS>&!37LPahh3x>hE3)Z0xh!K6y%&znoQM`q$o$9O|lOAKmdZ0~GB zn#5_SUAki9_imQYyaH|YQJsLEX+)$xC`p7LZ5Eg+bgs2K(4~ByVyF*9kXs$5kZE+t zxGD;c!4S3!by|bQw5LW(_W)B-V1MpY1~AIFh7X`Tr4*iF5FBW)S&x$X|DIx#3Qr7{ zCiAwuddd|4A2cEB>$u+7ian!OYW0_o<)`+D<3KEqj<{~q`7>jxtG+kuHD)p4L(^n> z9<58Wj|pH4ZhOPF2liUuJ0&D;9<1s3%b6xEvP`#LX<flcqwjq6H-3TDRIwF~<iu1U zDmUKU&+C``^{BzbQx;k6y;SxkC13HVOmF+Wk9;!%Dv$P#o}+69TlW_$-Wq_r@ldeE zc>Tf~M|A6KrjC}A2i?0q%~v_k4M5aOgg|*E&bpFAk1RWUue;#+z6?e26BpjA+{E2Q zJV?6+?Kb~%-Mc(dAJ356Wh}ra(Z!?LbROKDr4ZtlT3cH+6Wv5jWI?8q;J$2D&c>xh z^!};8UYotrlVaAFy%+Z7mmYv~YixSDBVEG46k7!P)t~_Xcl-RC&Q$`R^~Fqlwmld3 z?)vSNLww+lgX}7Te3VW;d6jtS)_$JuE)i6D1hl#=WCYg>v-1D4;d8~?fp6T!RLJGO z!S2wmpS;9j&G+laX4=OTMX~Erdv)jaA&$+mB=Xy)%931#1GCn7#d+@%ElezyMf3EV z-}-lcM2SAi(^#IU_KKXNiTsGl(e96h1Q!+f*%`v%b#rtQj0((lsZi^VcZ<WRLKocp ze_%bGO{_Ct%^CpuC9Gl28Z0Xbd*18t;wN0wgl$#dA9;}`3{n(#dk2~XT}>5f%0s(T zxh;N>b!S0d@-ju+NhSCS!3+}OC54wO;;w#U(vZJox>!xaqJ_JvB-^a8$FVeqKrhjb z(N-dmG|;qXMl?p`=S28(W+nQ+rmKyfzI=w`1^Nui6h8q4#}q;`mI1oOBVMBAT9vUZ zUa_(n@~QAm4Mc$g)PhTrS3W0hK2Lan&WeCFR?x9_qt0rhJ3NQO_~=ndL{B=2aiMTN z`hz49J?K3tiU9WY^DG);MKZ~k1S?u4jP{ESV^H31D~_2?Kjv|8`{_|Ou@Q+a%}bKE zbjT1Izt8=~%7j|{z^WSCeo(Khs9QR^!hEhg*#sHLjmyoLJ@&q$Q+By$o-L@=<^`4c zPqFi1QMUG${qJA)y}Nyl_DP6f8n5Aq8gw=#$(<l?`0%VruK=v|-?@K(e{;sI^PS|F z4aL6oCJzW(k%FZOxMY0l`X+;at`GbB%k6;6^TZ;sjl39i0_HIh&huH5gJ}6QrjJK7 zD`a_)=Yz>6{K)w$-X1ctVNJ*c7hwAKD2FG9yY9=G+*g!B<&!hnPqHJxlj|$sZpChc zZjyO=TM&G|hB>)l58%$WbxiWhokp(XdNV)3)VnA}Y_WB^A+);jHO!`Cn}APn$Uxzi zS=`3c?go4rt<1y!3<>w{<9?RK&WXoers6-3gDGkBImB<+VEkpq@x!!c^ST<B@9TNw zOAgJeKcZ~n-E6lg8ac9r+()ae;u5e?(<7`Kl<0WJSijD*2vMo@U&ja>T!%QP&sXO? z9s!6!eY-ZK+c!19P@h1tt<ZkeGfQs*Is*%4V7!?x3x6MeGboso&RxfC&^J3Q@IjET z?;lFCZ3G%r;X45W*uy)K26upno7&5yS(uYPUpQc-R3V3tFZxp~JmD@oRmeTa;7$`6 z#5zEw-M{y2<%~B`>YV-R*BfX-`PM9gb40&=L@!X$O;qB7WKLGxxSMod;bM1csNsvS zxLvmi?XIm@Pw<i6|Jh`~fNfG6l@RzEcVE9zt<Yb^Jdv9IK}=nCjRdrf-Y3e4w~cZD zpCNl1UC~L*C~P|WL>cNgPqh{A@LGF(;iN9zCn_LEZ&hw~xFe1`>@t^_!jXQMhO~8? zF7jDexPE2^kDGC{j9w#?|J$(m8aHyC@fU~kLE*iG^nQSw(+Lsppwevkl`ELhPwoi6 zgDkB90Vg39ExRv>2Yv0Lr@5!I4~ZDP*E3Ot&PYR;>L(ciGeo}pKNmCGMlh&T|C}Ka z!#oqvqgW_q7yqzbJ|%ZZ*Lm{FR;x42370ZRsY=pqFyW2Wp`H#~d|n^(d(?|HMZuUC zRAyFFMTvi<b3epV4WZbqBBT-D%rdtdxAS&_8~G8}lZj+@q3#)F`a;(7ef7z~+4ncf zJoo+&Hw$b#BA2tWsI5VLJyCKoX;b-()D-4ei485@{#~l;JrOgExvd%ZX6Ji=)dLpK ztlllJ`^!zy_uFy|gW>q6+7e(L^_Fx@h04Wl{a5xwv4?9D^Ap*%z{L_6qS<G<NONJ5 zxR}uMboBmbW5hzee;#zUN3AN|<G1}nU8+t6kv?q){NV1WEx+7CVb(GmaF6k66+{`+ z);O-qEd4D%&Zso$@uV?;-g^T)>^s6~|K_WNoG^oIO`8ND;oR@`XN|S+60jn&^su>F zF^~B9O$L|43aVFSa|xr6?=6q7*Ni&DJ|=dx$~(jLKs@;2=;gt}#h0^p#meM$S3O^> z05{b|p<`?_j}*%OHcvMeaa!M`^6L}!dJS&4pqsyOrQ6;#`&OW~jM&rMUTmhtri&L_ zfuS31nz|G@%7RXm4*$6XRQ@X+nfS%;jz3os0MJ&G#VbLrPvGy^;4i+mo0J!bX7t^Y zv4|vGx<G33XiLdM=KPeBZ8zRp*FP?(q4z#LO10(}d$*JKsgw%ylE{aJqaxiI@7D{Q z@!!c>yxcE5oVN$H2ja?(5rwCrnzOWlA=d4CKPqhI97Lt;jlNb0ob5p}1)HCw76nud zCG%@ZpUW5|*X<286Ei6AW#A^Kv-ksYL%%{^+Rf>vrt9ufUca73zmLsN>+8GnHe3R; z;eF3r$#Vk$8uUAvX^Pk${0)62={yB|q7zV5gF2T+N@1RwfcEl{y|VIxenZV+kYxwg z1Xz3)dVmB57m=!1A?m8sTJhl5pauasU14+Qx93Rr<zhcyO!FeDWa}dBHXVKa%#^ok z_Sdz5Eb2F{l_{zMf#{H$+X^H;SZqho6c5&0%DerwwA@9*eFy<12y=2?kk%_~VciR6 zIG}uRmisRQclp1<6h6ro>GH?yq@|T*)zq8-rFYAJ1>cVx`iAFz#9Iwm^0E%Jns0~= zE%+@-tpdmhVO6Dg@*5CfOJkm5dZ~=qgH+yynQ4XFf-()I%bZz!QeeRA7aZbq{4=H6 z+%C7912M_j)vb+U?AXpCrAMF3@WD;;<@V)TwhN26tdSpn3cNRdL0(ZvfH|+=>z7A) zvSYG~#GgqP<c_1^x4qSn3fCn*c5PeQ(glYvpZ^-=Nj*$FA)eZuF?_?dIbe9CW5D}# z52Bpbaj{iJdFwYbnOrw~JdcR?`k{C8)hf=kSGU1|mRD+|1;X~Ms+$1?0Dzefq7%CR z#s(2wc3I-aME{&nQo=Jc1#-TwBO;j{VXu8(*J}>A-L_}d8jn3UntES<KxOyDkTqZ5 zd1X%pa44jSh<(kaZSQUckP^=_VbQWvGT6p~2-|4GEyE$}R)K^7{taXzdVY+g6esb5 z+#D@GPOj0*PhICT6zMqUB@IR7ax}0hBo8I=k1r2evBGNnK33o2n%LgODD&N9s}cPG z;9E8spP$?Qq{LLI_JYlL4eJQ4@<4ox6`t3rE>+#;r;C4B?bQ2xH!F$H*0g;A`mF9Z z{ij&n-MPFWeXCjn!+xx{lDesfbH&AA{q($mxzRXw-Ko;4cgdMp+b;g07$kY3UEiK* za$AVx|9E@L#QQ<4Je{2Q)=pM0>wrG$;l1aNDs9yNn5y=t&VDC&6Q~G?i2T{dHD)JL zK@pb*`S3}jVw+^*!p-(mVW8(IYn5Pa*nNc$#tte<g~K1$ncx>Zc%OfBkga6k!nm=n zkY?y#H+8{A2DC8isCH}sCGNL?dl_Lf8P;d0_H*)MRc7+cA89b=-aPdI7G&3(q4<4j zQ7T!lDn}8g#B5mL0W7Na$|E(F6NA(&LI(Fbf42Y$g}0q*qw>@n*k?|;lAN>sv69+a zSEUQFve@V>-MN3kTtAY<snAXfinSDb2RoF)Kb|Wl`b#ZKxlkK`I0h4;%$rA$-hHw8 zhRLMRB(;k}j;)eSpcQ6o^vXv(5XAUb{+%Bju|eC;0!z+WO~U~jy^c5=!Eccq-`e*M z(Bl#}W)68^F`5N*oUh<uX$&&fm`^VfPXc}2{ZKfA%p90{y-GlhuV0AE940DGhP2XV zc#0*I0LvdSBC(!?)orFPqd>FDQ%k{WplpDuGP|UmH#6NNGotxx)@G=Z^jX~ac4Xyu zATB7}4Zna?yjoF@6_X1jv%X{!roPp-Pw~@@wC^L22}cJ1POP@U8>H%K{cpo#a`(Ac z+xg~0Nr`os=}jO3cx)#Z6HHfp!*5Nrf0ek?afDpG;;j`iNM?+?-HwXDzMdit_52mc zl@Gj|N0X)O?=6A%B9pbZF36Jn?qUD(z&^fmcf3w^Xi4kQb$;^(>2?!#4(Y~Xi^xWW zjYB=-Bsp`~E{(GM6S*<KEY9$<h94!}xu$oaJM_`X-|q0l(<SA}@pm3UyvVEIJBi24 z7u<NqKI@5WKleo{d(18uQ1W_e!>X9$Pl&&fF+G)yJ;7Ufv;K5lkzmfqZ3Eo(t}e}k zTJ3$C#OvL!92=k*SrciMUv+zQw;M*WpGkw|s*Qf5TmaQ`zR%<mz(!ACdo&9I`@hBV zR|UHp!VQp^T(dXo%y>~oKIaiagNmLUs50iFeNg5Rit#x>@gb&QB2p0`DSoPwaD@?i zlY>h_O7Z_M^Sq^O*vWzqcI^fh&9V*1vqBu%NKWoXoE}et!$L5_nsaFNBb!rc{IFv1 zswU)`8=~ub<v#i+1P^Bj=qlYeME;COuZe8PRFRcAB_*Rck*7qg)&C*je`OeTHgJ7L zBIxh?T5SEB3OV-&kSDWjXVClEbi>FJc8i_`%V7MGtp&e6OoGy0oDnyAgZ8@4RWhQs z7m!Wt5xkh;EsM=~k40I()B1I+1(0!A^+YvgVlfQSBx<f&X*Mu@+qL0+7VY$KLzWQC zN%|hre2h~4a`-)(fs&vlL<<FGlWx=K@^`=rP*m>>J~SX{*MiJE|C;?CX%o=TmceZ~ z_KFX+aC*EuGCU))3=9UN*IPR0Gu~ay{Nh!qg^|^XK;3P}vKn<J*M8PeaGTGKCEgP= zDsiru`cpKYfBHR@_p#QBT%7ssv!?B|G%wUyT_T=CKn%b58<&aBMSieg0nNuHu0a8c z!4ApZklDajrOo>2V9#y9ekc<`y?G*#TH}5s>J`9J-gD;t4*tERIT)2qai&0Zf_Oa% z2~Pl!$26qz=KCNZ4Cj&sdwZRF5H<FM8JIwSYr*c#N7AwvK6Uriy%1V@cA~*W>Pqd+ zCg~3N$A44~D#r1tB(!#9MW;wvJhN;DO@Y%EI={4s627{~QlL$Kv6T<G+?{$g@yVuO z+05q}TfPP&ZungEUKL`?li_eMU;no&sLp^76zhGyV<!soRM>X>A0X4aNokanMEvtj zo4l(f9@FzSnTvYiGe>xYf)8xA<!-M*46h>bo#=hsq*ndB`{!)8-J!quVmxdQ*qc=( zJ|H$Ir%TgKyx}4Coj^=-QIdkl4XA&W8<_X4N=tt%YF%nsc&<nC_ZFDp{p`A>gFfZ& zb=LXgAU(vE<=amT(P`gV;h3xIW~(EJ_mJfZ>~l5TsY$pj@S&5}Y5v~OA6a-eN$s5a z{KGS;!X1B!n=P4tj+O3TYr7l&b*z+t!Q9WkiLV-cHx-M&kil~hmJE~<T)`-=s#FU= z$xm)v?4$gApT87-Q=2wo@+>TnshX}I-Q{D!sE&Es-H`iop}yC!H7a^l|Eu~QZg>5L z&uJ_frRd9gwQ-_99p87dRF4t*l1yKHn$iAs-gIg4X2ex6Xgh_dtG0I1KfLQ>tDz}> z<&US4WGK!1%QkUEr!iylMY{y{qBela!kRTaZhPmAO#7w3EdNL=>z3BsQD?m@qv+|D z<n?)!K&bzQcobyIaInv#Dc(lrd;L3PON2YlM&QXF8?r3XP<Qj;B!p%tKn?a8pWz+9 zp2<hAq+3aU;(wzjjl+S)F?k@9M#H1lvox#OjGNysdzS;Xug49D4*c&nQShVQnc1;t zL`ZH_{V~fEM+IylRp>d`&}WEfh?auwHw+RC(5qAEA-iF#55p*`CzuWWo>`;K56KB* z@g{Mi0=SN35D9I`06<Y`2Fy$Y7Uk+5EI|+rECoH1+pM2Nvq*!v+7Pv()Yg*NGt`qI zPEtoXWR&shcb*0)7`!=qgL0kiClPd^ba^BWBDIBg^M#T{VjBtH#J%z~W+vWqLrJ0+ zx#|4iMzQ}Wk-r~?odsCJ!=}k_hClg|5Hta!=Dq-0uqtWBUdAUesQDaKxgjeI6Ier< z>b}4bz_?y$b!#OK?XtP{Gl~^!%itWjECG4uSm%Lr_Z8RLIY5d~?Wc6@Ww2xr>nHRD z1}gGkbX`~lUxA+KU(B6AUuRGf=tG|nCya4dLKj9O)rp$)n*C}(l<lSL(uh2|iU6R} z@2jJUzc)NX&B|2(rGbt!X(hjUOj83?tCe`_adtpG$PWe0B&AZ~mhT#8oe<dmMxbLx z_v`sn<xy>u++@3^zWqu`>h>4yLdhT}R3-Gq5gEtUXG$poZ*2A@T8%rt&PU3iJ4ZC; z^MwxCac9eX=OP_B;Oc}Npsdh>q-Zads>FU)W$Ps5(PYTabJ*gv)hO!5!$i8Qe*L87 zI8cI}0t3_@v(5^pbd7zN5SZsq!rN^3$CgMZuntO22syXFpd=IjUzRw>KD%FG=Y)-i zvUV(ozn<GfPWe{$fYUrdkC_^a#Pg(>s^Xwtz{sP&e)V{g65ld)f)d;(4?E4trCGo< zl+_u0ljzTBP<f>r+K3m@EuQ^8;zt8x%F#MV-&5wgG-Cj|YCog)wV@IvxUzewnnSf} zL0RSQ=WVoq&B>R_(7HpKo`ZXxqtzQA{M|qGAn*x;a+(d>06aWZSw%#87{DUL!><2R zj{bF5q0;~Q`F$HSVJfuCXQFfKWI88z6W8m~c=0r^g-s9AkENAPi73XuiS^P`S53SE z4z+7sXPU<fwlz8U)7Lk_?-DyCxct&m(>K=RD{m6-)e;p5!A~0n7B1k@{mR!G<Q2tw z&FRX1hz|RhoEVQbcnQc7`BzHI^z~9)4?b1|Pc$AsepJ$zjn}wk*Ytn|X*<xcpP;Ql z;&0?LzcMuJz1u>d`QDSR_+dWwrOT0&+v8;Irx<CV*H!C#`wwA9ruItdRDAn{RaZ|q z=^4oZLY0sB<t%ZPFxv-UIz{a0Ts;dqJ7X<<i+=t@Ihstr9ZutWp1FD>(VS+4hOgzc zJ(ySuWlIrs)`BiQyr!d)r+}H4H|Av-9Al*}$r_w(kEmzMh#Z;?V0H>RZ+V$jtrmNp z<r(<ARtAcFqmy<a81?Wf`jZG?_))&tx{NvR`92{cng(F%&p3`kPwn?-9lgM11!Rv0 z^~(v0$IbUu$816LYXPW|H;gzWO6Sy!Uf-Q?{o;drDowbRE-?fQ>+P;F8!~v<eoENX ztaniH*ey=5008^C`nKbn8$i!APwat)@F}<k*{T*SACDgW@KN6o*Lz)9`O;u`;N(Jy z>K2kxmyY~z|2i&(w9AUG0<IWKd3@jIoO5p2;mLFI6?!-7|KW53kOcvw)hu_cFUxTX zA${Or_3{Z1=jNL@s%KgwOMZJVY$dGKn)_0l|4qM26oD~GL}l$uez5`n9uTO8iee57 z#RQ&SQb&`yI@cCi9e1EkO%`%bW?*vj<xofWJCLQyp@Qh*I1E3-2sQ0X2+b)NVk%7j z`DCRg+h-lKHExOr60b>z=68;MRicK|neWo2VBn$rGtGg6@xLS|cEl54F%25O0R$>F z##EQ+LRH|^WHh~e^Sm?)HtPH}VE!5uB@3#oxtUa_@TP8ldg)oAhy9rpQB`XDooMu( z9SXLy?Y?{@>Rh%yRfggkFlgqE%GZJY=It4A1}`}CX1#*wDFFpG%5feFlZ`IN7R;}` zULu2f7iOkiiT8wjb6g&x3B3=rAvl^WR2PY?39EUSRaOH?z7Ftn9!s_TWw(8<3Mej! zho}pcL@B2gRtGGLH?dzP_cC49A-Gwnq+xo>1i+C<S~S>C^3mhK5=+J!A(*nCe4vCG z0|Jg7Nv7NijNH9Bhz|_3Y~!12FOVg*lU}M5#>#+RV$H+2KqmXv^1QhyOwX-TL6Ro6 z<XMJK3KF;9&I}=eEg9~@obDwz^DB^&T<$V7!ULR_?48s@|14c$=%+R-<i7aw&F?_B zXev0z<-n8B?Znlsa6f{v5!v(M`gpa29%p^tHV@!?39sC-XA?v_$!Rg^-^7hG(8BgW zv#(SEwtEVQ^s&ks>jR$Y@a5^;WvA-Yc;BIu-SJ_@B(VbjF&PkL)g=MiX#JTasdedl z8ebQN3<tY$O}2HlD&Nj&`AD&6SE;RvG|Nq{#b76lSkwqljH_Vp&sTv!MZ|k+jL$Va z1CEkkKA!2admjc07Gy#r;2<$=Ob%pEppk(7?fO_Axr0@_I{AjO)@E*eP^aO?;k;8l zIYD$Kou>HejDfde`I*vpt=Ixbw>vD9l@GpsL4hXws6_kW$-Fq=7NkjXs+cpE_-s_D zTUSE&^QlMSiZiUD{0+;9D~T)Mo3q=mLqcjRIP*VN<^LF#F-f*~5N#LuM(kpIZfAj* zSjua*@g7vKZ3d!4g6Ngy_V8mOdcUPtTszW>trC)om2FtwNi&4@$apfV-}kP@S9L-- zP9lG9Zijr5JXyQ?rN$^H554bQ3z6a=!M-N@4P)wvR<PAJ%~c5_7PV7p1sq;=DV@Ko z*TG%$#!(&5T90K}{q%0I#6BiCeOW{LAowD99x9IStD+EmhNnbnL128z2BHxE6b$sO zS8IT=zrByQ^PMx`%N`1|Q)4D21cv{Nm1KzwN;q(y$1o`J;mAMmGz%Oq-Zb8f0?|*b zBs5ZANH;7-()QTzV=zGr(s0tGw@ZHBFQ#fNxgmSFR7-rW!GvgQzK4y>*z!fdpC{lg zu9Ltfr@dVG+Ro7b?gG%SwaWE-Lv4g;4nqB=U&CZVYj?4$NzJLXOQC@wzDZ`Nml05( zo{Wx88VFrU7WK`;tm$fU{MSQNv1&BPv<Y0EAx1=n<Q$_lv`BFO?FLqM?ZAy~VSDS= ztP4pAQF^(7Ua6kXVes7R_Xno{6!i0+jBR1j{IJVC_i~+U^Gu8Loi}O0x}+V})6G*b zlNi9|?G-`XD08%iA`G}C!$em(JBr$cj%+wr&Ol>qI_o~-#!3|bV%ES!hQ6-o&P|p} z&F18so^x^V8>X=`ea!Ok5z)KBMNHBNzyWEalu}b_;=VgM2HLoRzOi5OX=!&ziI1xj zu$@2KS|6{S(NY71#IrR}NWIM*A_$l<1EuSblZuO8rCbt>FjpHG53m0RK(Fvr0JMY# zKVxX2-(@5!wnc;ivXPX{BQNb&dcpP%RmaxWv5@Ow#*YE-6iPmqpj(>-H-9xUH{h5S zkm3cr;vqZV-Q)lH6&%E^#M__ZG5LruiE3N^A3q=Pd<I07KhxT%_QHL!((2FrMUnK` zD8|O~@=(@M%a>$U;#<=`lI}l+ct@K(o$(2%O20xspvgw7lVC9^+<d3vzXTaTIg2$4 zqcM%b(E!Yf0#aaNEv|&tqrC=~>Qu{26>BR;vxwsWGZNvhhOm@(I{L}IU27;yOsZKy zh@_WoI2;Y_(8Ns@_a~f%u<O@t06MK~m;+3^G4wADO5VQDQdbtyw4JT^4ablQn=<Le zI6*lF6Oc>6lq)!KRrwA?w7%6oJ%s}@xvVc7un~##skvX)VZk&#>fmV=1=xU{4ipIf zf<0D0O01;}eg#L@4;$g&ClxoSsZs`JRa*QDA}fi);3t@%seKD;z`74r1HkBS0yaLG zEWl5#Vw_2}#tEKhHq~7+g%HLi3g&=dI<G+~a^yXRZoqUwTPV6wiB(oPA{eK*riMpd z2#<8dE2#4=xA8n02vYLdi9kZjG_dXdr2&w+M#Gxj01E;)bW1M2?|#BY$ZddST!4Da zvBC#x6@EV(h(V6WT359k^+4M$-ae?8tvGJpU|u<G-2-m}+TYzcUAs3DY{}RaX(yDC zTvCsxfhUTctzw7L0R5)ei&526B!Aieor0UeSbyG?(4P&7L%?LD@*hXk4D;VWJxgsr zaWkOKmaIqX;mlCj(_oE%ACkXpJ@bjTc!BIldq2Awn$GvMfPCQC_crKh;cIVYa{C;^ zsvaVk1rHIt4Jfs9%i)>}&7NmTg3ni6lXuefUP%c$t%R25Lw9BUWgrA+Se03<Cc$m` zRDiKj3yv7;R%HDZYVZq*26o784f|p1_E7np;dg-W^I3%6denQaaNB>(i8{yV{}<8} z&ETYQewY;FbHQ<#b~{-xGJ5e8XW_4ul1EN#^9t6o8`3YTT3-miKVIOPz*rWsM%LPJ zOkbML=-BX%?v)+E@{)u7K$zj8tkVWFSF~7JFJ>2oAYlbD`i=CD@MAcf&9A-KugdJT z2v^;*(yN;f20FR*XHh&4_rVc1qssk^N~VtV_Nxn)NGG~ie{FQyn~4A)Y}nqmJY{l3 zNiQ+}i(G$`D}EJn7%OAd$(O#rKiPUiAFBp9_!$!t=Xb?mWdLq36%^S6!o}vdsV&7T zfSw>hP*vVEP>*!3f@KiPZY*?yt0%&L9^@(gBR&;Sd}1>&B!;JO7FTg*kazgUq;*$^ zNKJ^t6em2=j{pK%rIq9=!A|jiK);=AiZWON#Jn-BpWLDjXLLxQsRd@!zLaqy%^Z>} zfz693WDSRH{uxcD{i9(EIc@7dw6H-;8<@>?pU2pC5hZdtk6GYg8m}E=->e-ox+3K- z2hT8$O{1=lJ0yorfsMv|`G3=arB_~=bdqgHEmvh2UoS6|M*7nqrK(3|^8jEJul;BW zL-Z}KOO=hO%fhys_R1!%%InG2>+koaJ69;SQL)|krn_LP^p^1)`csPhnz0$vce1`# z3pfl4FA8v^+HypC-{A_kZJJa%=r=eJ{s~Ew=p?`-blIEc-ItUpH@MnqE+-?@%pbP3 z0w!qt@kua*hfyM6KPtV#(JgPDteCC*{|3oJF%q)2&`ww)MSyXkxomC!GPC}lYNZP` zDs2y^#q*UW`SWM%5xW~PN*Vy#QTIH*_qZsUnF3Ol;$Qu@B#yyQvEd9Ud;h7vk$3-N zM?qfoPmTWHQU8+vbH>KacHzm0aAw;tmZ?_T_qLh`EsHAb+L-wPdYOP*QYgcrtl>pK zYy&W17i$xVLo(ZAI^h?&IrrHzIt-3MvIWB^d4g&bY=hGj1w+7YZD6{98x1f8`aY}t z2Ks*pdkdf_-}ZZam!+gT1Ze~X>CUB8N=g)v5S9=@8l+i3q`N^nq@=s0kq)Jl?hugf z-_0l9_xsNLXa2*CJF~8_yU%mo=Q`Ip=Yl{_;acw+kEbofwg0M|)VozK<V0WFX(*57 z%gAAc-;l-(YEDo;=vSznA7t@%B&JS^vmWZ^Fs^3Ft8rd>=9J0|r|Q6-v<9km?=z)O zLL)P7Q8=nXI+P^T_~1c5a?=f@J*;0D9W+{GTf;VkWGl>u1mf@mPhft~HfTE7PMI}Q zmV(hrk2JBEDCUnN-!~)g#OjIuQzkIz2z#rdq9RC!#XRT)-Ql^OVrpfDXKHzna(#Zp z=t&i`j4>R?_Hq!ZI;Fw_NH={L1>%OvZ8g(7f?1hKFcxljh+Ug#`=QB(S`5M&pzpkZ z=2zuN4@pOUq2&EAymh<k>9`kq*OVQDYv;4pSA%Rf;8P$*ubFk4c{lCcgKO%=@PZpH zpifAx-oYFnjw4iW(Bhe!guJuz8mEgMen0>hIJTT-dUu~~kM^TN>6<%KaKo}L^EJxg zv}O>($w@WxX_VQId9=k+@r#yur;Y{R+mTGaMarEC^S_GY?T9`pEC3Y78M54phkapY zH+)NsfMSNe8LYqvTA@P%1?-l1b9|C`CfHw8BTqg=>mLTGUQ5SbbvD|G7js^<<ANag zFdQ+bT!V7L#=~8uL-dfw8Cu;zU=lw9ugGm>zb=0(S@uJ4bkcNf=rVcDm@n#tFg3Pc z{KK|;re4LBk`tMqoZJ6)-q}!XjPDq*>jD!<=hYW4q~(>QfD7!}FMybi%X3jyq6eSz zuEC=0GhI>Z6u$?siMaUEy=^YfKl7dXe>(guB@7p4Jmq2d43=vq2|v>Aaat}AcHsxI zx%ky4-pFy-hlCS1+7WUv`Au2X%0BK%OUssOqcuBVdd2}#BpBWATr4ff?5(gE+A@cB zVAL_NrRzp|bBfK7HrF~)n=@Np`1xDhWV1V`b1+j&zc$@t!etw{xW}qnW2J|y-Z;fh za&`0)leIsSuthyb!3}$$zSuSLP4GET9E&0M)SleSzj|UGv0;b~xs0q%PbMv!@4BPO z&X?l4X|C3Zb{IfFrs{Trm-0i-892TZpPe%pKzSKpc~O2(Bm+*oG0+PDswX9saW_sB zcMFqHV@tc^wcq*dd!tK*YWB4XD(htrWBVcYwW2;vb+<J?g(_d1zVMV)SBSQ02J8$> zXg4}5oSa4juEC^){gL3?aUu3cp9hVY<Hvs5l-XGj(^9Ms8O&=-+z;~`xDA_OXYkzn zda?Ta*^PNbFVNrss#rJ6qsh~&GiYLSY~lCOBp{-mxBHuYV%of|gl15`+s^xC&8*HZ z(ZtB*Pm7Z^)?S<}=J;Iql@ivqt?rB2o0@Xrk(K$qC~}rdW4}!QZ6LUgmZsnK<H|no zIwHZ4G#T?ZH(4?L?=1G?bMLmtt>;u?r}Ut~;R#-9{7;%j++Rho^HPHNy$Kk7Tg5WR zK>EJc{K(4<A``u}-jCeJmw4!La8%=(+VH%o>U!tHAIHGkNiLo~u2A~kS2yclvBIF= zrgjH;6}~VmTKAJ5dXfKxSlotM-TuG_Z=oS@u~xW-f96A`YrX0ZDxLiHby`>sF!1Bh ztr7@&I`B75QJ-FcR)d1;07M*HoNCc{YQEz9Q2UH(-U-;+sj$=T^UUMZ0T)+>I2xo2 z5{C)Z=~0F+IF~3Fx9^spd<H9s&$(_y+m74lx=-*ATODDo?D~zh@~L`oLn_Q*Qk6~8 zK!_#uX$KE|M-yxq^WIzd!r`GqmEDSh{m$hthcRWtci)32*Ia<%IrO`hk7s&mk3I;9 zE&#f%+@Yz~mx0}#-yXiUx_Ip+DnaR0gcMu0YTSQZu{LO+a(q!L`5S19xybA`c)`1> ze2=uLjqIuB+rk)*Lf<N(=28WwFw#SuYz`pL$9w&hR5if@vK}87N9L4B@fNbJcu!bW zioF0skEK306tcaXREIB6*767Vn0P&+-2IHuyy(+#R8K$I5ANgLr4Y8up2B#VQWiIm zVEF0|I(0zjbE<K4)n?<~sNAd9DU&L_J{zbcif$d74n?w(<Xc_B8GXj*<Yc;?B4^<3 zjK@6C$ke}&xN|aqPco=nALOXJC{4V>s1}>e7~Qnnf0eBaOQ@2n(2gB|KB}AoLZgdp z3_R*LK@}Hz*?)4xx}t!eN~;KM4}Z#ocIlZG;qk$pnb)gYo6h^4<ZP|Y!;@tQ(gQQr zA7zWLQL(!1;1GKiJW<0N{-t8oqMe@ry&?X$TFJqn@P!r!5y|y<+}S-;YIZ~CQ$J3_ z7PkE!1)Z62v1Jt&o<)VmN1$nqthj1xCncg;&^l#cDR10Xq&dxxXNLsfn1Aqb9$CEn zqn?`GyR5K~$iToQo9ffSnW>&IaMCwryI5oL!E9~gBv^^><>FK9QZk~{+P%*3KF)x( zaBM6^k=}No71}|8JjQFQ@~Zx{%>0Kao(<WSdkpnLqPd+k3tHMzTU3a<9&!bnK;;*W z%F<f{J#zRc&VJe}CiuxvEi0Nf+JG6+FRik7W2?_#r=gz-ic*cPCh$qDCW^o4%g#~9 zeP16z97=oLX}_hV^Kc#zAXkgDE5ua~x@o<#4IsM$*w&0sBsh%DP0r;X365buIgo{6 zk+Z78eRZECkzb^X0Ta75!qEB8a<8E)Xe|BS4yPNc6188PZ~a=WtXNA++k8aB0+^!J zTjnp4BTR$TAGZ&J-X|W!L>mgc&%&{|*rNiZ52A8YJzX2SiPE{SH;`3J8AFnD89LRL z87dL)N*=wP_!H%{?HsR-b4;NorVaHIb$DY2UsNl%QTw-a)ak&K<m`Peclq<##sIPR zxlha9NFPNjLB?0e<mcZN03Lx3ipo>Au(iJ-lITAWDdnX5`?vo<q`wW^^Q|Mu{x808 zb&NsH+N9t3xW;HCxz9ihd`KBdpcmMEw+WJ}LNQ59hdO|Hf{_0?AnHm>_d4(Ky@^11 zg9FX&=s^;s`~5^E2|Jly7P;g|r=p7Jb41ipS~yb)S{)YoOuG(oq;rvpmtA5&*)4|C zy<6(_DG0)~wtWN9Ms7`)r!u%;3QXgRi4xQ4vkATyF}*38Y3{gp+|v-i1}ffd_1q>! z>46Q?kXs~5YmuVoCBF?Kjlf7Sn8xwH`=$?Wx{C)fWT(R(iD%O+AR%Q9VTTK~mPZDN zd!Rgrojw)CW!S_=ZfsW!y+DpbQj9W)Py#}#oXYg6Vk83MvC_HdwAt53z35skLmIYc zQ1%8=Wdqhu0EreViOFioaC}AI=a`$5lMfV)l%=05JHbLrIM7^uBMv9Ml=A`5x^g!| z#=igv*D15`fogXAf@?_g5I0XHO(OOC4#=Lliy#wq+8%z)icSe5))k#VlIpfvc?OYQ zlJ{=r{#5*fMn{FOrLh@BT(4B^1s#<D+qe5O@Y+A(Mi-db?Od#2V6ENP>lEQQ<K#+} zSX9}<XK|aOggJkdp)O$XFFEZCBztz8I(+{P6~WNERq~O5>u=tufnfe{(d-fD3!KTh z=)jvBRH&BqQ5a<0PFb5Lc=U%$(oC07E8cs@wp{IKN6B_cW`8xo7U$S<eQq)It*)oT ze&`kl7B*%#Uwf_(ao$3p8<6r3e7LUP()if>7sNI;Hdb8%W&swmw5jO`w(xCAkuw|# z`j6@F_PAm&r^8ZBAU71a!RmP_fI{5GxqrF?E}vMTwy5}fpQpeIv88X}hY=rqjpwDR zL+({yd1?n9G?csOe`C?_8HCXoM#c-hiW52=S(c>{jQX^U=)2oOlKQ}iR%VeIp-V3s zrpX;iKYOgWz`$9&?90Z}Mw~eOHrYm|xFZnz<+qv@W_{-mD=g+V^v1F@FGn#AMyHDJ zVFZwuyMQ#V+upR3(<Jy)ZClN+EC>CIUzuFwJD;hn@+`@^y-p3olLW1c(P^rA$mD^D z^=&H@SYEiW&8{5+{cm_*1hKs=HX@_Mm(+b;%%@csf9AY^k=~^qr-gS6^8*w`R<-36 zQCw%98sd2%Q9cX{Bi4|7vdTiR3F#hfSa#}su~Vh_MW;&qHAf>l?xstyqti5<7hgKp zp9~G6<Sk;Z61)nccWXyL=eI$OaQg^VDAX)0{yNQn$RJDjim$)r?RSMHq*&|T<w^dF zFLx8k&LHw>HqxGq;eJNnK3tmP@&-%Rbq6rJhDyniJbbRjIjFRk>3Q+4qzrYN8%50h zlTika5up^B;Jb9LxYC)*I!1O!CeX=Kul6UB-%r+jy*4;>WbQOjLCV_bcEVwgdmGX5 z;=Aqse=3nWEW=Fm_+{us;5I!5$skQrz3#2wv)llN_cZzc24{5Sf)TS&x{c+zo%+9j z`oE8ne025}AXOrpzB@eITMO9+uB*2|Z)Ykw0J1v2JbYPfS%i+EO)?nG5{{C0zx6T1 zj`+Uuw#(iG4F1WI+8yke729g-`3I8}<F-=07Ch`s#f1lf9V*q(ws+H&y)&FJt<PRJ z*Pc}gTuA9M=@fuW00Zxne!FG`qLFV;0DbLtJY}X#;ugr!u+4+kiY_vaY}4hfhqDZW z;5(ypKcob%{oI`R$<M5l!O8<I0ac1p8V@uZW=Uj`=havo<Qvv}REUr>$e-NNPtD)! z!0LgyKTUxe8gdgAevs;Lgc-}RRPrXHQlQ=Tdz%A-bCp@`mjV<@?B5w6d$_7c0Elhu z1eX)riLc*LeHeoYS7~)YPH(%tiT9-~JpkfAD|o9`b!DIcL+d6;L7`%+cWOK>qYHC1 z0hU?b-!>^?b6|PGqeVjw<eMTj7|lmZx+2_bl=J`^1~s5u`eQj=nGZh9Pi2$XPgM_} zH0{{pDUN9|eSY_v6&;?bD;oC_nsOmOt(5t?9`K{i?+iNv2v=3ny(qQ)?4{#-k4tVt zqS%US+jPIl;ER*keoD7a*XSu3`<Y#+^_TodO**FK`Oo+8!`qb&Jl?!nBvfRvL2f7% zX||}?t44Z4MG+oQ2fWuOfM`*|V(r(B<c2IFDOV{DtylT4VYtVn@9?PLDj`rKKkda! zE5L4#YrfPo=^})8OI{sD6PAIb^q*l4r(#2#c(FnW$TsTwuLrC|+-t8x77~5X&hs@s zyJlA63KtnIwE3+HFU#rBP_`Hfr<dkXto`5NDCRh_=wt)d<@p`u-C;NyOKaJ2IPUC+ zcM)7-3p3>a{uG<K&>2Sh`O}s|JEBUmaj~Kwk52D<w)B({(zw`061UX$U=f0z%v017 z_4w+Jfvy*|$)xS6A4_q{<IAY~Ng<JPbZk*dMv=@VPwk}KdoOHKo^d>L1~TS%spB(4 zjO=2@Jyf?K=$#}_o3Hf^6PU#c+cKx}?S0@}cv{?Zr=0Yq^I}`{p};QYz>p){5T3C! zGnaF_!K`U=O8(W<qhgh)%^dHdnnFd+rg2ftg7>>_{XT`w9}@!n-U@Tu45iW@J<zuJ z;xIbvBDGUk3<jU%C*vAR;~|t|M{QQ5xca{r_MrjIH`i|ZLOt!lteh!zgslA#v0Lx9 zoiB!D5eR*-cow#(0}g+^CgddldO3;<z$46robiBsFB92qj5?Q*(XJ3;x2^4q=hOhM z>WBfJ>rA=ew_8Iwm89#~<FPN}4kS_oUPs>#?f1!|-JSskF#F6eJ!KKiZ$=dFsw%!z zJ@-{YR~1ThV?SHE?;7ev)0hs<OqrD-ugq>5&^6hgXLgs0ed;<rUCI(41VaArNa&Ta zkXkxd;AbV5XPj@zxy~Rczo)B$_n(|E$qGXnL9(jvMhye70jhcs{WiMu*s-FVRmq6m z5m7etZ+Fz{od?a$5tgDn0IMBVk!|@u^7@7VDx&**8|x;VWBxMi-~Q>v-_4a-&I9t@ zf4Kg?9fh~Q66gWB<SJDaNF8?OBfwToxI91JDg0f_=s<A>ys|h14=@1|p<{>oy94m( zx;wz1*c#qb<^=+gg`IH?2YytOVNnnkevt+}@w?piQ)ax^BxLOL$Lo;#ihK|X)n!z+ zH~9)W%pFiGQRE<vRI=QP1DGY92029F#xhAO;{viF!(2ha4^EmSJObi><pAP7@&Pe3 zg}?y3(<~J41B48v5j*ouJv7~4PKzG$5$WlR8DR*Dt1`)pEs#F35qK{MZut8i+#0S) za1M320w17@E4Y!uP>TF>Wa)ud^_m~D4EaTeR7B|_bJ6_<;loE_wY7o(6W$O>O)mjD z>yb=3EY-p^R@zpoO3=}jgkG#TlR?AGhBRJ)E}aRcfQ_OZO*2f~%5zL_`)i#XI|Z3C z%m&CPYpIQV@+(xub_0*2*jY*bR)g<(hS2)^FcPw@I+P$2T4RDT+9(0EDfj}=3go}C zs_Wc?(%U291l(Pf=IzZEO?SXPKeQh1yhb|xL>`mp;Luejf!nsWtb1;Z<`|OI)LGx! zXrT;t5wbcuNk;BBAO@Ob!-rKn-RAo8>`0=+U)eyX!Rg&NjNPh!<355374pafO8(7C zFE`UGLy`SQ1!vUS?)pep6?ZCa`|}_rf4qB*FmYhg`?u&lO|U~j$*<iV^`um!@L!I= z^|IBXG5cxQ-1_tN)%nq5Ceo8^fN@QS_$eR5`YPhJ@ZLY|%H(p*8sZM)4M(Bw=f%T9 zNob4TCz2eB00hU<fb1b@Q6$W?OGI=9Q}6vRN7r5Zd&HHG5*5Wbh6qwkYB7jag$j>5 zrSPcNA>2<^gsq~Hy;-4=V&Uuds>2?)nW$~&+#LsWM5;5GwUYlCBHd2*^+B^|NTvk& z{s(~&q|@&~KM0zOlZrDSP+7j>VPGqk)c=#^ZcMij$Sx*|C&9G8h^3;N%qeEejDLqV zS3JfWTV9Mq?2e)?LAa3Q)W)`u<Xl?XBa2J*vRiFPZ-3fHX_>sHVYIU)W;W3#gU5>z zRZAZ@&wxQhH`_V#>(K=$kjsx;zLHB8XLoZN%Co@@<Qc&~VxZeAv)IY3kNmng!QM_x zDesoOy7n;L1|-pH-ewENnLzWcW-s%N2*E(R_}s75`+POox>ED|tE0?Ly>sKXxdDto zK=H+I^+f@iCT~z=i=DCiK?s<9l^3m;R=UlMa<qku@hCmgzl<t-BkFm{t1pc7hZ4?o z^a%$)94=}3{hjt9$S-;h^AohX)JnTcDWW_~l73_KK*reCg)&XVF$p7ew$?TaeK&P2 z5Qp~qX~!6jIDH>6E|{17WDG}*FUEmff}Gj|^|(iFeiC=Kr8wEi%!RoRD#xB3oC55x z+Bh!lPO>?7BcWOEK*_1kegW8h^|YSJ)+KPX)s}`+y4&34V?{)QC?Q0Z(1_co9)8!@ zkok?tvS|H7+@{xz(#dNG5|Q%2&TtG`>TH#nrb$FN#eSY}FZp90_(HSCMLrg3G56Uh zr*P~}H|>e@%KTTNYIn>Ibph-^PdyZ|-H|M}Nd`E;u}3J<j?v`7(O+KG@R?u17anM& zey4>>Vl`MZxo($5x=L-JMbBQ{l1sNgAoA>W(0|2^pWcSnU)}<HI|UdZmNb%_R{o7g zGtT)N<-JI<`wvF^FUlL?{~P5Mvydli!+_3dD($P(3ebM2=PKP5v;wxzqUYtbh~w=k z8YB@MQKH|}28r3uPZYAvTr72d(@-6zQ)VP*Eg3-Klk<W-O$vez!t)*kV%cYT8xks! zstUzfAj12A3_LVe>02tlMVuLK+*Xw%DJqVM3UTWzc%!s#&71;tI=tvm3e3>CUmLgZ z>nxU!;*zaQra?Wx$}x0z9D>RF?9(U`#G9iz!5IA?-?O6l)mg#0P}~_pavme~kd0hE zt>JEM`V^4Y5x6Ax#ejqlmfJn#DFk2jBoN(+zwV~t#B7~d?4<NRgoR+lpcz(i6V-mh zls$tr%6q|LaGWPpLSPUFdPyNgW2ioq0F4A68X>155b+XjAJv84g@qsA<U?`S`?8f8 zkE3=uN>PdWwZ`HVs+Qf}{MRlW`|R`cvB?GCF$1CVVQmjfl&O)ehIa^%UdRzoqXWK^ z=a41jrassK!sygRX_g0agoaL`l?(VN`oC=2ab1Vz-#s4WU?HV@5^av-B><s7z5_xK z<%iR;H*nOh7!VdQcSv63%422sv>gcVQ52&DmN2T${h)c!=e|N>UulR%9XE}SWk<<I zB0UKFmSxgnWymM9Fe%hn8ypi0t~>1uO#0$hDRH>&anX_KY$R)?m^NY{`?S27x9L(= z@9UZHb1=_5S-yU3r(rwia*PnCGScULJDyi6Oz7VA-WX(s-nkob0$LvH%S&cA6-zov z40Z_FF|BTE>KaI`a5*Rj?e=)08FYxHi=)`j7K`nWTEU36z?;3J3UM#t_|9;O=Q+q~ z`oM5<#aoOJrjpSh7*f56pqvpAUCQ&A>}zK4Z?>mQ!@Hl(HBn<R!2$d9cu0WTYpoP_ zmEq83H3mS>WuZLpGhy>O{A;nvZgJxtf?aJ=RFc(Uf1oHyWY5y(kLOAGd-n8Cx`2&E zE0C2ON|mwp=UTOvUGBl~h+EQ1vf7MyoG&BNSk5l=jQv<PFfsO-XePqQT>{M*8wU<9 zn8n>C@2HGUx-6{K+t5eif;^x-rqBWMmXyc0aRJWNpYB;-s(ULDlF1k|G3LkYJyPRT zd7x{&T`EaSRK{?h=fjRe#`p4&)2HR?oRKW-lD!&#jt-bZcY@f(JjYcom;Gsh4^QPz zFgpj6p**AA2Q+GSG0;l45pWm=Ah7LmRcnFq?Wphd`y-IWy@`(|eq^rRxJR=J^-bot zc>4^Ny$F$dRr$tHpBng&4fP%7pJV}(LGsvVS@cro;N-@T>w}@WE-ZF3N9{afi;A8g zIUW6PK+0VLjihARH)3|2D$iN<MPpfj7O=lyubh{k2A^O;=b;w75ePN8k&2^WJHoRo zqZynM`fvJ;&VesE$%+AnLOhF)@%y6nE#k7HX(>!#THSt~>CwVMlv#>Mjfv|*waMi* za5ch<4%RriSX?4M`k_12yPa4?qhYHdx=r1OT@D5u&$9<+@AmwX^;J)H?d(tD*XZ*j z)6}Nx{9}LiCj*}h({X)xke$N_H%W+I--ksx>Gd;dwBaDfO%0U+2;B^PL3WpWBBqC5 z;T~h1Tu}Cg-*VY%rDWuS>unD->%8Q6AmxpAT>WmwuSyis1k`){pU0v&DAT!ie4Q97 zT@LPlnUh#W5T6&QW#v9FSTu0A^}Z`?_d&ZON%98Gv7ftJA?6xWKqD<%<U9L)T^AE! zkF;HWY%$DI0x%2FIPh-8C;2_sk|we6KJ=RPyUzD7R6443xI2f%4bxA=gefSW{99P- z)L=?__CCw8^hYMZ@3rZ;Y3BfhB|Vg2N?<d%J{7z84{nX90>Ok4uRuzIjglgp(T@U< zb+7n?e3|LCm>)Nw>$d#bt)bIE11fV0$5}8rZ9f$Jf=gv2dMK!I|AA2qhn~VcPg$BO z^QHT{Gx9;@PE+7)u(`_$7Gzv0*K6gvmKd~1c~M>S6W_oQ)InEzw}S`w^r|0M26JGX zHckRB#Z8KuzPPpF$k;*Z2wLTk)LKXE+U42M;MatBD2M2+%Is_McXf-Bj2;jhSwnvC zflUk!T9S~L&=F&_kII0!ca^OdfM;%d<ZBkjVU(X;oy-kX$%{i<CgTjDZw;l$2w3NF zk(?CIAdMitTtu_lQagwb$x-|gp0o#{MTsCpF+K-z^;8iLJX<wY+3UY9euk7ocV7=A zh`=HkntsCmz#Kk)mrTafOy?456=8Cl@Cm5Kt;Mz|L+JvXPTd@`>%%&u7Rzk$*8^lV zgaf59!vl_NE2-ZsC~eXOtJz*?^?qD`f_zUz4}S}pUbg_NF{7Z=OP}vmsN6w0WyC;# zO-QXO46)x-xWK^t2o@B**rkI^KiH9n%cGokObhH{A7W37lCf|rLEgkTbvsHUV@q)? zUp=mZri@$nMls(P=h1qL?yf*%NAVTNJNo$(aS)fmq^#_&uweo7QKm5r=>3Y4q3U_e zJ(3jL&<<M)$P)ehi!Kyo=An#3w;^^d!3*w{c?hINm+fMQtMaR3?&r@`O|Wzr<YObG zQ5|X*qNev4r=1*RI|{f7Pq94}7t(@<_&n7|xsPa+!fQ)nru#-0B|wb&wrV8{>Sz8E zN%tVUxz7E}4y~5zSJo5A$B;UT-t^{emd^Pg)o1HGz-oOy{X#S6x>_-9If*jf#~~@% zf%%GUx;93Mw(N*#S>?Nj*)t}@-K7U~FIr1Oyeh?0D>{SxW``1Z_i@ZV5hxs|M&QFo z7CVEJ*<Iqex~Hq(B~L|vOStWOlFl#?luK&maKlwTY9B}>`D@432O-gsJrcT5wk2w& zuLluL%OSpE2xDEdkPe>GFD%Ez_US0+M(&2c4*`TsTDuFMc&J&BAm&W7|5IcVxKc<x z_LWw+P^Za<mO)Bnl3P%5f;|`cQS?=#5j)sLQtr}RAxM!j_EG!2oHfX~pnz%iyV0#~ z^;32xkQ`9C2v9;#{wCf3IU9y=&xU3VgT1tKjMLb_-;x)X)BDI~B7a3OCeP8m3KJ%r za9UZBQ-b1qVfR^F<VAXiR*B6H0+%qpnrSq4wEHq`heucLG2`3H`=<%@r1|d!M)NUn z8b+42FV>7rt+WrxMycgu4qz&<i_I`U^21JuEhTV&AOqakTE@0J?mN!=GsP+4G1lFR z&3oHvF^B`E6kV9%rNCSqxv=g&_T)s`i&F-+Gt~Xa$iwQ!)16bs%I#XvYJ=T6o_9_m zW-Wy9S4dxA@+p--p*AHO1Vo`mi&!-eC$G8`vIQ97c(5a-Sd;@l)uLgOjk~BsrLUDI zwEAch7<N`7x*M86`bB|-V)MNwE*f|u;PZS%KyopkkUH0-0w?P`F0$v5foL66xU5Pv zU{##jrw^+v@I)jp;z4^_9C;mBJy#PHf<reB&i?bxtd9-vcQXKmwb;vNsWtb>`3`KJ z1ENpwfHxn5_NoYF=A2f<A>ewiRCaF0W~({->UhSwzc<D#ReQJs5BFxP<bC1eP-$Am z(;o0&AU5ol1%@Ehz*!)R;f}*PhmMtH@4sqzh7P9R6MGAchYuS3+JivIV?1<#*jfYR zM>UpZn-1tqqu9BLPM-q6m{!`10(d!IcF89wSQY69>sjqbMrUXGsqQu~XJESePm#t5 zLQg0FNi|?`AV{j&9x3eme#<vp+=~CEN)Ru7{^c7i0pB2F1#+Q1oa%K-ZK|)|?x%^g z822bBTfSV){;N{Q-&Sgaq;Op;0EfR{qVWzq-cl#mCDZ1@F#6F{r@kU8ktPvR8F;>T z)t}5@pN>_G3G^;m-t|Y;V{_haW(7k#RaBd}os`G`B@_(ICDrZSzf7O7?8w#3w_Pxj z)mP##l+Yqr;|YOO5C<hsv&cKBXbw$iRPR+mCyF&eET_RN^1kmPBs(ytR;#rXsqvu} zz2*Ch!1jV1q~kUZQ>q25mGK3e-|l<pmVm{NekA!$?QQ?gjp&*zQu2gQBP~iLlw1go zj<#sH7FOa7QXh!JWs%ORFY2YxZ7}0hRlr&cAHq9@U$pGdUK@{P;E<rhHCjA9U}R(v zvQ|;J2$-=v$0q0CdzVm+BMvqIPQ%-@UU|5B>P#T_p!2ef5M_uBByJ|=VS4Giz>z`P zRsy<bm;|h3K2X{_BLZk|@bGPjAbjkB!PM_aAtFraDt~eejP9u~haitIgm662ypteR zk?~D){R*2dP!*U`u!%uN{8Kj&<vItJiMgg}^NZ$}Wy}A{r<xZ->PUyURZ>BF7`hWw z^VOMQI8X3sehAS++_VVD*#<sR?qSsKCYq(*sfbB_7=eJ>db1-Vj_C=hf6rU*GNGR0 zz0nW2($}Iqf(0?_Pb(4RX&T#r${L7)GgY9;X07YD#)5Rv%Fo50i2>swxtl1F=y=G9 zizjRt_6Dz(cHa1f$iSoeAQN4M-0*;AhPwRvU9mnFPdo9E02o>V0u}l&x{f8Lmp9ey zDG=E*yzrL5hNr@$qR_B-y9~X5cuEF3(LrJtg?kpLP#y+8S1U4xIalFF5NIEETq>us zg|LNiR}u&KvI)^a;8$M(4yNq$e1#_(Aln!Bh}S+k-TBau`F5DknZz9r6L*d)o45#M zN!?3T24<;0ke}9)2TZ)P*vqA~3;!d;o}d4L?BDoNq<v7>JSuRGahuL{32FJJ(uT4b z%eBAQ4QweZA6V?79-k7$0moy@joGfq{HMI;-#J)8&vR<3Mo3jj2(zDRN)ZrXE29#U zqEf}FkbDh7dbOhXkY+!aq*Bn3?ciVtB8klm;4>#%c3XSI(x`NQYJiC<ex-Si(`~L{ zr%9MMTB+QAb(GwGIL)K$HI5|TOaHPo8VO6vBRx^0OAv>Fez5n1^0d~2w{n0Ao7vIx zdP7aZYhxRMrSWx06ngKqJ^4=jSRq0}Qv5)=jb^~#^(o5A`Nh#Mis=Wx&fq;O2~2un z3o30K7o{WNXFs{GuCfacwtSng#P2d0IJ3X1&Swqjl&jXw*!=p^;1}ltC(b}}4Ohq9 z)^>bCPhA_of#;duS)`LzNBp;b0>S;mlC9z`+H-F)UZ&ZQfVNX^(8JR#1oJTx6n<7p zqz+&WF(zh_Fi#^{yWi!+sl_#?X)+luN76;!3L;?VB<i?dFkHe#-A{kfkDA?F!}=w) zI08tGJgKJ;sRYOA9$2LJfY`v;6C#$@&ei)lMs0%`ONQ2%7US3BV#cHn{0@(EUGo!b zKHANF-<4>UXE9)TkebQLhdabF2FpMmV&W;=%+nwCtrHv<SR411rNi<w_HQL61*qY7 z3OlHIL{jb$cO}!3m<rwHzPXfU-Yqs1*@bi*f<ASEsM|33G08_<6%SZlisU?8@cnN$ z0UD2YK}d#lOjZ<s6qMR=Wx1u7;mbogvJ1<I0!mV-934L<tC|qM&=&hYFQa6H^Y{|^ z@pdVQ+tHxVRff4aRMwrHSewrk+YipP-n<EpVZEe<(js)2vAQ8ol!M?zgaIe^XxCL1 z6Ifqf_vqEUDi0#^lZimx>}a4xQ6^#znE3HK^i)k(^9$w&dIEek3UAL2J;_Wi7Aa=U zh;mi_v3GP-$YEqqs3$6Xq6VyqKBl3KScY4Dy&`_Y5h%#WW68q?yef3>jb<8`^`4)j z5?V}_8dm%8T<J~aDpM&2F_y&$5b(e$Pzhla8E?7%JTKOrnw42f!CqFHhwxB5+=(or z<W!?LhzEt2M494s?=StRJD9?G>=^2pKUUuP^QujDqU?UnL&t5@{iLeK2~2nOKI0c) zNmH$1wE<u^6^FmpwFNafpg>8MX`ag*G0HIqvxc03wwoSYKh<k@3q2cT4NsBC0Dnk2 zMZk>Br4L=m=0ffJeEI16qd-z_pEgofEnOVXic|iBF<i{3_xGb$)s@|JfqFf`C+N#E z-v{2{o|tE-GYs19+6F6h2b>T|WUc(!<W(d=zeBwC(8{Mv27QkPEsC?J`AweD9R}`M zNj-I5E|mPcq?~HDgeUL?akOqM8#*-#VJ?h<*ogwozFFRt#SbpGE8UXKy2I|-;8z(( zQp?=oU4Kobx)8kulbZ2(>Pr<?kj5T|vbdQokFl$5e>FT5Fs^U|?u<Q|NXm!?+rj;V z5Brm}c@ntgxivXheX>KGyY*$ETA~m0GNX8A_$PD`fn%Ps^5@3nMLY-1B!|=s)sLfl zf9_6_4<zwda6XrKPeoIU^e>w?WG<t5OW=@Z!_i2a5hYGj+3HW)`Vj-^4s<s>h%OxA zqj8NLH?>Sz!{tslQGI9Y)-`e(I`5NaE!<sN<^DB{fX35H8!DSNvxfz<2#=Aw#U*ed zCt9S>&<em!llIj3ZeOdS=k{rbB*FzGk0@6Z4x0v&X(x{IzTuQt&LF7@MwWCKreT!x z_?ZI5)@L@vt8hYEYAPW6j0Fd)Ru!!p1-dTwLKDT>BO0u)OG<%lvKl#m-8taSusNlh zmm#^Hu@vV(ms<4eASY@3*<5(ADeS~-Ustc?QG$zjY4$OLKSPD;f}#Sy_ozXnM5VHf ziug-7)eiTQ%C4W4h!C*k{gGaBvA+tR=v9$%IadzvYlfGj+Z<g3OPdRQT8I0EB@Lzh zAy9(L;h!!)xp&4#@S{8?=hwod+E!dMKBq|ZZ*5Kq{-*cZY$S5g%8m1Q+BmOBbxz&j zv_7oL6VDwpY?2(*re$p0=a}BM1=#?E<v8sq<5H%DDkZ7Pb|DZXPKMirw1)fbHj8$P z(f{tvGYI2oEY0$8ecc<CLt(lCw%RO%T!hGtvCnrrQB7dxq|2Js;EtT8^%wr=zMc_T zUC(hYd09Ft=0~Xc17F}W&zly1rc!uF!o@s1-&nVFJ~Bh0C^2#Ab+vC(ALp(~GgI!% zB|ox`nP({?U6;}xT<5Qcn2$1z*qeo{W}NoqGfxRAzng4*7u7rU<;mQKwE~IEN~oZ| zpk%;M$f*>>Kmt&WCZ3aztUa@r7C2UE=^M7ga{(3oY|n4}T`Sg>`S|*FY2Cb_X@9%j z)sbKVZS`0oFQ?9-_fN-(6sy{u?uKwe5(g^A`zLA;|6q=KEubMIGwckfq=PJNM9@jN z%_MLyN!!jooZ9P@98dLdvRm(-enLZO;YDG4Fz<gf+jKF>GFX2Bm6-Ev_$i@As9AY+ zH_Q*4W1V0hhIicE=(5{uKO|0GJ-0t3LC`maj^C^;aj~s&yH{%{Dnn)$FLY$%*9F!A zVrQBw1&;(O2PafTEoVciB~g~MZ{cBjFTsq(Las893rcjp3_P$czg@>n9rdpl282R- zai(Hfb&F(eHymBwHxM$?x(Xe4<!KTI5PKJB0^g>YN_5NhrQ+szF|Ao;{Sz6GK>ViX z^1UlF*3J9Lt$u%Ult9m7_din%ip6S~Hb&jbnHThtQ!ekm$S%mLj!zcJLYQ9sw1!B- z0xB(j6x|VbkYrm^mirA1aoRqNgDoKMecH;vbQO*8V=Zz%Kp~ti;hgYI1Qjad2~Bo? zKVb)kF(QIf>hW}iS$I>t8Q^gYQ7h<N>~(M+Hu}^CBJRpEMl8zXIM$FF=K!1N2h70Q zHEiP|EnH*7Px22J$lC#`l;h_14^T2&(aNcw!olyKOrP;jN-5dN2YGr54c_{TgBiI% z(Y@$Y!;mHldqq$P#*_1}BBPsc{5o91+A!&Sd}I9i&+qZJl6_cwV=VRjK3W;=+Cw|Y z`<9c?8zU<G9AR(T!74CY)ggK`$V)9cm4PPSa%=1^>|N5jji4Pj63Zh9+FYfx_K67h zcj|aMMakCUXm(<cdO?0-zIa8Pwj*?`x*$O2J=TyC_?x(K&Iq@5h;)KxWVWU0pi8vN zjj{j>(d4X!TF_@!4Q2V1)q2OJ^s&2utef@Ws+`!Y{XQH;S2AOr7_&k+-zBgO_-AX9 z{ZAn7&t6L|Ns$P3@dQ&5anTTU-!J}kWZxxS==IN~0v_n_P%{bqzHTt>lQPYPbk#zs zC1MWOD55+BIUU|G5oHZ&J^k7Gd-|tXh>66sZlL>NaIQbTUF#s#>P9g4L9$hz%g(&F zT~lcWcN*K+qYbYOf8pV7Y?nzvy#|`|v(Su+Q0%qI*iR6Vnj!9-IoW<}s`HS~sYJq) zMrWr}>GlV;9z>RrGe?LywuNqr>7U#e5v6W9g6JVnU#=Y!_Qe};O!pKlCp1&j5|R21 zRGZ4T$3MN~MUk{y>LX|-Db_jiy@Imx5-;|hmvzVSN!}$b+jl<KdEsGuT#O;B)gR7T z<ta(+dW8t3b$t`#vB>BFpS&mTO5(50urKopZ0H%l?{az63zQj6l!Lxkew<}*PW@4v zFU@kjDeyjBU)q;kEm94UPskqIM!f6qKZd|AYdsD}{B|VK_k1ss_zT-ppC%=WNqL+i z2yHv?hssh%yIgeHf!}28GNSasbKxY3hX4rO-j;aes5bIRL93pfPk*~BkUZl^O;QF= ztNSB~{51Tl2D8CE3JwDTDrgjCIh&dgh`T7jWct|ZCC{W_xpMalX2<O-m)aGZNWIfB zna=AnWf#(W{JWX!Y1=9~1sALMufq#(|Hj)db&C+bqV;^Wz3J7Pyh=fbbyZuo`pj?a zJ<edyTD3%8e=yd^>A$Xl9xPOwG=^Dw_#g)56<8M^T#G^0F$^+s{2qoqF2qVA-5UGk zPm6Nezcrp8{c8_c`sGMaL@o*Bf0I37#A10*_E&BB2i^t2xo$5eTN%NClHb@OQBE1} zJuWSW>m;l~3I(m`CA(C4x~xNlrl<U~OKR{9Hdz<?x+Itnx4{?Qb(Ax}_KUifI}LGe zxZPx!CQ`zQkRGL?;Bgl5^!$WcyzO?ywaNguF`?xianCrZkPBX*?%D0Ca~WQ{9KVq7 z|0-6RRfnkAHM8GYZ$QMK2LEIt9_x;^V!tSsy`)!Dqo6bKu*WYfO515kg{n9K9b?=V zyqTgY;f$5-nUnDRpFi6pY`pGlRA&ACJ=~(&Ah;djJhPo$#beXH`YlmrtS6aY?t(8< zh>t)ub1$PT%^~)$cTSCm8POk+63~{Hr&jvfo9lGHv=O)y{WmVr!KTQ#q^h?`7?-iJ z(zy)XKjvx@{4c)5(t2vGtkH~iQu$*E*V(T{0m$}POo#w~Q*<?fNZ@33pykPzAHD^J z-wR$umYXQ_Zhp5g=?vQCbx${F+`@VHI!FZgawJs!mIN<Uhot?&qC_0GCckm9HR~A` z<XuKADDVU;_C|G2Cv)7KBFrY0=YOL**RmFv%tLdM1+Gk$d%UuRyM{-@RHFBnx|95o z*N@iHX1;EoVrXW0Uh$U&sX5!20zZwVLO<=7x2RS$oyX~43|hV_?56cEE_NAO6+vgb zccj_{Ccb!-H)(^gzagcZ)D)|L9Sq??B5`ZmF;7yB1<D;!dyd<*&F8iYHx6G!4p}I> zwOO^XMCdkN<UOC2*mF9_HBja+*L0FRpiiG=W~%oP+6B4?`W%J$sFLQ(>1GU5W;LPN zC6nH6?12k=dY~I<V83{q*l{7@ea0iA@BD0mLb@}ypYQp;l+|wC-Q8moQ;rh+Ax$w< zN_^+gAA3_DKMs-Y`XYFJgOdd*(-2n8&gY39lGx`GyT#122ScH9H(*jrn4Bdod=Rnu zCHLF%$!hNAk)c)ZrEV{dnh<5T;v~8(CDW3a!l8S(*$uP3q^viS##{YY;11QW$&daE z!^ulQI_3eA@v~cSBd4tl_rF;ZrKfr*&_-@-_;-h7Op3BIT@`)1EiAWtmm6qu1Y78> z%JBK&CNG`~Kgl4gyp^ryDkTyfoycrudy#kx5w8DgsQF?Xyt#4O1Z%<P(5rtASD1*? zMU7$oq$|ds{4aV0wSe54Ro0NmhW@Ngd6o$)OQmUxN?C<=`av0Yf4juHh*@&?k-U>I zL;E#5kC7+#2peCq?qXaIzJA};*o|pl*RTh563g!|itl+$H+ggnKfaTehx?3@|Nft7 zt0If{N83*-WWpaON{9%B<-E5a#UI__ttqtkfVZwB5OI6DPG&su4f$@yv1)5l)I6~o z78(6v=`vTcS+AkmFC@mKulZw-DQ+L=4PD}b>aH(@f7e^&eR6!!4i;=>CfRgk7yMPR zZYv~-cRP-^%+2|;z&8IW`oiQw%w@XUckAnvYZdf&n<<3C#B0owx#tKgiDbLbCk!j1 z$C}9Vd|Nxn`_|@1;vcW~IB@`8xUz37_oe>2NJ#b*d_3vX;S$Jcr5>R{{wUQ<6YPVj zF*cdNW9S2F!3RKvVE6qab@j{Nluj-ENk<9^slIeu#+C)y!HR`(136|x#ZfZ^yOXAa z&T1d=-RNX>a%gz;b?bFU<v-%oDGN{%S^6LAF$65reI4*LPa+X?#=qy9)}J6S_Ds;} zC#$*BGvb->BeP#aTRED2)n&RoCT?fn6XT2p4hI)<>%X(lC2;78e2ZwX5|rK49BtNH z<4SY3we@Y$sUDyG;F|IEv*lE|U4yVBT-s!&%0B+EJ~NHkLY@3j2-|h`N0Fw?<517m zsEa!Er}L6;h6l<oldbitc3A8_$uadw%Y~=@%62<Z%&BytK-MfYy%|pbYB)K@61fA4 zdDBnZwRag*VUY(1L(LI{_!8_xDsIyeB`3YT{9CpKA50>am?L-kw)fQ=ow;4SM%>D8 z=C16zHq83KdSfFiww`aakF;6q`eAf;1>Tqj9L^MZMeGC%tC1|(N2kTqfBq5IP3tDz z73R`EQ8<|IX#8hc{`f1p@}L#vi^zu+wY7o2t{`pIGd$<i_8v<c-4~u@haNN*SgzN$ zZr@(AbDqqKK7Ynv>(6g5{%2v4*>2{M%yP|~z$*<N$(KAbAi~4>&P*zWukoiRzir8e z9Hk<z;`^@%U~xFgjnywQZ9b~z`~H1v%7JaLgVj-cBdgwqBhw(mBHMbdd3Axd<%zvo z)88+VNeB0?-9}ElPI<0@x|o<HAin+#ite5!YJSFK`fwXUg&JEp1!D4zo0n$UK+}++ zU=jt60GlY}IN!f#ACe)08PhqS?PZeup0Rm^*%^upzQ;E@*N#QBOzxy)Uzd#cJH@H{ zF#%7O5{O)X9{x7_EXiy%DLIVWsfJIxoK>>5Hmj>5dR2$F>b+b~(M_?MZO!M#*A)7B zM0xet@Fbb*1vSEk#a}Sa_V8<eSk?KzSpd4@bsp1KmV2Vk@jYLi&(+V*RG)0DN>dwD zYDkASTbyh)crqRG;EnE##fyXx$~4U-2-6)T#uNGBVn+HWYOYR7ddeC`eCQ6PqN=Kg zhoQ*`D*cTjZtqF;5D15w#z><9W0c@$BEM+=98=Igc#kur%Px#BeyMnHi&@e!WuG98 zKW@vCNUVLz9W5Qvb{YY*ho~R#bdu6S5yXCDqYwK+$a52tcd@<+e$+Yza@k%TjT~}P zev1@cjk}**KGH|)TRwCt#(^=u`K0I`=>J-?&W_pT2SJkp#h-@(5!Ovt#q@XIMHOg1 zi*h3WWG$b9A5O!jqU8MW!4{5Uln>N4@nF!+?nOKLpYtti9XqFAB2_sfQyUkDH&zWA zrbC|mmi$t-l){^yZtneQH_f_ZyY;Hip7$nj?Gu_0r#CmAt%}+$9o2lWB-fvO7ACoX zD$1dsnNVr*KK0U~APh8J2lTWK)z)+OiMu2zbFq19%dI)<tmdo!>__F;xePToKS=dF zzLWoQ_xb+si}YF>A|k&MTIXmSD$n>Y@bg%DRIBMq?T2@Xewu^e3pgVAWEO=gDvoSh zOxh;m;J9*Z^IHcCZAEN`?d)K(=-dk-^Xa0%=Oy~zufvyv`YxspDD6wp#0M$T9-gf) z-9%SV@$;dMhwr!zojXz~^H=z&?;ehAmjx=AP2kqbll2==RA;BpyzkA?+ioX{*#7l? zO~=Q^4~ulbt<PoEV^#2iz|WWnd@DZpIHhVhXO~uv1WgrJDiuciKD}4$KO-+p(Z6wU z+05@Y2|fEMbkm6a#X?7?bSIc!g^z0XX1C$S>da)RWHhtRMddvHM2I?sLS!3nV?5ut zaldQEZVb2PBhLO}8~iuM3#VKf9=3ossktGa#vufiPpVgd_?Rwl2q6B_)kP!<$vJeH zEWC8tR=&kW*E_0|O_1twY~Jr{zDEBY)jt&5PvA!^tiSEEbQ-<x(y_!oyX8Z7!I^kL zj~Bq8`&Xlh`Q~}XUr;TM@zzRq(6mhbD!&4p0qS|G^sj^|V#W5QndP1zkKgvdLGS_s zR-MYcPj=rPs5iU2T(r3nJWMVDdGO$tXQUE*EHTWbX))$vCx8L~Sq#X|?gL@v1HN}& zCe4`%CZtVN{BBP96l%KtMHH;o%?9xtKg<D2DhK;EC!udO|8A`RM&N$8wczy0(cG#Z zwoHW6*%0e-hJTn-SiY|@&V@d0*cFq5JNIm!wEgJgdpU(qXhTJI69g2_4MSGXKU?6f zw&5NXryw@hRm8jXMZ5HA&((SEGfHmZf7S|>&y??QwXbdVbb2q*<%(E`NwW)156F3~ z&-<>f+I8zUh(5+K2=IP1P2t)#iqFk-!V^~gW|WzLH_nCIl=@Gd)4I8DzlA<=WoD@q zy@ORo+QF-}L2`L;c`&{I{d3hnJ*|I$VXhCTPErp9b!$}rTMWvfD7CWSB!8du|I6~q zI5A)~6iWQA<#RbYA|Dv)Dhq78D*nwlalFg2HSr~0;LFTRL84V^W#u=pOYBD}R!AvE zDC0h}zR&lirEZ<JZ6CDVK3rd`JB5p?a|GY-Q)W&ZcwL(WzTKLzZY6q$UH`1>vjP$M z^Ut-}ium@7)A$+ryLHximDY1VhzjAQcCS=*RnZ()gNLX_Ezs(An+bW&rt$^em9V+? z;0o%q09jv!L;c=p-gnu;7vl2zpTq}@^gla!yqA~Xif4QIVm9&MA)cZ6bhc(53Ns6< zW<hqN;EA$K1gQ*x7?58(s_G^r%Ps(n-{&7p)|Vplu@A6Y=41pX@B;k`(=Xqdw}kq( zUHS?V=v?usZ4m1V`9ReheG}@@^WxX_a`aI4lbYEK{w!i}j)UqY1>EN*Q{~qExUE}^ zrc};X5WtarcE8xcato=)ld8rSWNyBg-KzFE7Sf13=GI7z+liTG>Erzvf~PALRHAvn zmqZjL6&_DF<L}qy*7#H0GQfe4H10|GT{hx0=ZCA+$8~?~D24J`8u!{P>kh&Ue+aH0 zcYb0GDua778h>pQR$pJ29=!-EGy!RRelBgzdspvQSPxPs8eU3jTRxmF?+nIXs-<1L zqDHtk@~mHI51*W+uh9-hztng8>RH^M$UE@@&uLDu>=${$P<hFK4Ec)^ePXCgW*S=} zJr;{yqb$1+OfGYcFucOK1l#Agq}8*`3vU-7T)2hNn67vKZ_oAjK;gfq>R*i*I9%CL z#bg)Ql=W*exvaL)4atd&4a4+^N(w)x+2S(Z9it_}<$lvY&=@h>TqvVd$$j|dlW*Nv z6~>Y-ZO8n5m({~Ca|Dic-sctzfBd_aZ(@qWlha(k9p)Xj%xayh);Cw<%T%tSm+dNa z+1h#voH`#BOKwy6o^Eo`xC-KV@JZe~IyB^XzkTE#$~j5ki+=ASW_(0)n&P^WK3?== zYPP{-CZP{yxYlWU#%}X^7OCGOvD0=Lmh9oMzc9wXZwDR+q}n6TD~lSMH8O1;9;Xf7 z7B6jY(Aig@Xb$Ax)+oRMpaKp6&oOiF3LhuFdS@^;-n50GX3ptlZU*MvCyR<=s9=BL z&nCC<N})AfsLR+)u9An&TPpRrj=-Uw^~f9SMBifG7&^Ioi#%s_=5}*U_#X#!*2YD6 zrk-oe0u=d4zeKGk4wK`ldXp<Z)QWCe-_=&7H$^a9De+Hseox(8h?^FJ=^Gvu7ERgA zUQ=<$%^!G-y!H=%xjDpst<mL7^Emf&*qRQ0D^Ehs#GpozePEC4Es?dU-77K(z?sC^ zvJQ{qIj@u3Oicr8$aB0Ed6pE`3WHRu9jldRtUlCc0%`*18X$PU#d?;?Ne*{Y5Z5h0 zDq?4AcprsQ;_}%UqMLT~bUUuvwX&fu>#-!=7oD1?57mU$_lb-ze5g6^iB!feoZ!XQ z?GD6WPw3P7WM$-AHP1ClvY*elM_B!2%*rvZ=(3yn^8Q;NXU<D8{Cba!Y+I*m>z+q; zz0BmjR3$CUg1?+!X&t(()kI=E`H7(YI8tEJph}ufSIfnHA|sZD2nl_8|J*aK=b~{= z2a)0x@7SPa)v#kab=LjtV(%kZ>v)<IP@s5d&&(@ps6?~u99X|j@lke&k;ZIam%KwO zjK6c*D@55rl1qi4*TRAs3qwi;@n6>MuXg8eUg&?HjPgVJvxWq<d4Y8M^)77VS5dC? z^36FP29M<C3bQy5<f8A7uYPV3HKi@v)=<aj{rTg;HwuCCQGEMFQ<sudgd~-b;fX*= z7-H4t$}lT6O60UN$njv3$q;J@*{jFz7_p6zj?n%kH@q6!Ia%eh^yVbkckt*54c~ju z$&vMLZpUJWi#?g<5dD6PUW!#Ic1Mnpcwu?6T>Qi0!2!xIDqhT3Fvl6^M*AZ5|DFrC zjFSaH>x#ugogaF0Chx(OJ^Wo5JUc)9cs|J!hQEV5{GIJ@q)7b-a3wZ*#C{j}>ntyi zwh#}ye^-BhqL#zU`{)gIAm=_okyZ+kh1>d9|D8Xo1N`GkE#_lgcG?ph)jCWCkIT{Y zSe7)H1F;L3TaJE+8jjU>q`H0<z|pK$MkRk{0}#*h&2I{J5b++p+?(>`+e=oK_T6TK z+-E6L<OYck8Pwu|qd9`UruSto$_leyz5f@J^N_V{(=T^<9M(N}5Yzn;k0@&+STBcV z@cT5PQ*l?qe#rl@jib!u3j88@Q~6A%=IvTTcFmm2_uqXt4Li>g#YIyZ?{w33C+?y? zP+uKPd8H7;%8~OeCN5JhX!1sPmFK3}{nGY;3t~T;Hj(RFq<4XM!!K36YbqnKYxs1{ ze%3_=UH`oXE4k=eji?HZ^J^{jz_!1NIr*}4{`36I#{D0P)j{uxWl|q2Di*SrG;w3= znVUa!uCTjk!=J6X$Wt!Fwq&-O^tGZj@~s3Thy<)Pjdy+r6;xFb;B#P%Sq+pASMWtY z>U{M`1d~JQ+ZDmk8U<o0w%7TV2%+6Q6I{%2TlsmQ(-*Q)VZ5%_zVz$4Jh-weWEbeV z6@OA8P>96Coj-Nj>&+MQ&R%s-%AUXuP$U0pv<MFQ9{<mU@c(&b(`jR#68PN+)B$QR z@M}WQvO$zH{V(!MVN=>D59>yYEd0e0T`GrKZIt~tmE2v0zBB{LeT6C~L5J<ShkhM> z-?_siDBLc}E)zL*XgbQdOAI8=KV(x;sJn_-F`T=R%Zf|uQ6Ughgv5Qn!G+)G5pw0w zkH7ec%3}kc>H=^b1omahhlVs^3+)ojj)!u1C7}|Z+V72#6P3N0r9KO_atDK0?60+! zQxgPJMTXJpBhLMwjW|+d{?A+UZm0a0oH*DooGHd!#<?XYc#pHJ{Qj!({yc!3px%^S zh++<pjW<Yn09v5x23U53isYHD#Lc3j%TiShLxF`|8rm(=q4D_+!^ew1m`Ux+M|?97 zxc+~ny>&no+SWIGEI=AX0ci>8l!h4)q(eF+#37|Yx)cON>29REy9Nd64rv(a&Vixf z+n#goeXi%bU%c=8Ct!hluf5i<7Srlei~9$6>-%5$5ITO8tLbs;GEMa);I#l29;2ZJ zSB>#fLx;(;^M}()w~3s6hVY;atS@<L@@o(YG~;-Wwi1BL;PE}fX`)7`)WJ$0bCFJE zG%&YJAE^~;iOqSO8^2tyDWgWKSI>@oj|IB15)uZ7Rkp*nuj=%mTftU7Nx0JN0s%UV zsU8RMbjJ;wudcOK-=C?e2A&N`wfE30wyTmq#_VuN^7B!hxFLi6{d#AXJ#xXHfvm`} z_RD9F>&xyiflk-My|@6-8JiqjM3LAJ?466(O&C5O_ddR4u6mOq>G+K6uPRQ#PWuO+ zjZ?AZ%*p48H)S>1_wxc00`9&`GN`sBiAT<Dmb)T%eUM?SYbZ|0$E5uh!aU^+oeAGt zvaxJ*yYN_j&-%JN$!nk{_g6u0yK@(`C#Pgs3S_2FNOn!*xKjS?P>#QSM3?FsQBnwT zkfSq}Fk}g`aHM=nu;~)$4#T}oYfrJy|M~b*aP4Z5H+ut_jI4_oACo0?QXYc;_G<sv zmP9n4V2>KJBAuhNnrf%+o+ose-SO}^BrT_}&vev~_SJ-$X%O?JW#<i%gw4;81kHMQ zak6I#w7oW*B7*nqS&M(tP9JJ#A~=VAVK8od+x>F34Cml{QE|ugc!R%;v?FkBbLtE7 zvz;da-ZK{3M`zX!i<8I5`9}S&nXuA2CsaHhK+18fDR}|Re*D>Pkz`XAG%70@nf<|b z4lSXZofc=ZguGN_!f&@kum5Z-{_do{U>K47$q+7T`YsJb>jk!SAyoQu|7tz{=hxu; zb(#&osJ5$Zl5y-kGM`$q6sX@DqW%he$`$fSCsFdrTzV*yh@_f3fqxz7kpcNIx13aZ zxmYhIn`VKIhM>~@9TE4X<yc&e7k-?bf~^tRul5Xnw)E9EYVy_XXNx(V41OFs7>yhl zB2>?gkUs2$T?1$7qpsGBj_&*SQ_3wirb}wT#+a(!)S4H?b#AXF1n-OJhXqN@_mi_n zF84I!^iW!b1ue30OUzR{&#~#T?JzhX64@_Hn&zAZ7AZ(r!NSfMb5(;dLuUl(!Cm`b zr*~AWYR@hdVtITDW(qoB)+jF2X=)Gq<}6)&xxOpz9LF?LXTKT|Le3WRfEkWg#L|fp zLC#1BY**GFOu&>T@+;De&;>y*Ut~PHqRgA;hMBnbjkhP^Uplbvj{5fc-kRgY!*>}~ zvtv_ktX=9#l;X8MX`^rla*n9*jNRj+b~2;$#)%H@o#Ctu?7B^-(<wE|<`dDQeTb$$ z+b#5?*kdBLh=MZ|o*WTqu<n*qw$O*d!h(*u<zpw0PbK=H!lUzXFxgI4-+<17lE#M} z8rco>XLS*ipIYKr=N9R9f(7uyI$a5ufRE+cj`aR4UhjR0gDD;Gt_+S4|H(%E-gW%r zqxVMCK#(B$-0&jf9{bEh-y698LCH8eycoLO+gfIa)e}lQF{o>>HpCCL8m!~o8bL%? z&P%%V1N6yoYf4vWk->0L;V8(N&XQQQ1p(yMBD4<NCFAYHow<EDAsa^6#i@zJZjFtC zd_>!WWq6MZNf$#%unc$)XUkIO`V<Uo$X3KMGATR4iu<RJ&%X5&Pf4#hTCFWUPb6LZ z;ci9Tz`k-v*~LeLke6XX{I1G>K;gee{ISP>w%Bn9!+ScQufFf2<oh=T_wR3$I-dFo zzF(aXa;b|(JwJ(-Rfjhci_MG~@D7#P4LC!#_0(jN7W?1Z9>c$2E;rt>nKqy4t~;LL zQ=6)>VYX?!ikW%4Xf+fQo(4&AG>K#B!Y#86)Btor?Wk}aK=BVUw-C(+q8vV3Q%9KE zCY?@YI!u8QR{d72c)^XD@N4U=w`PboHZ1j0CH{Gry8W}4%YA$!p(Mq8zj_akwD?^i zZX03N@IQ~Wm*#P}#rbjM0Oaynz2o+BLuHpq>R8^(>3arZ?~JkRlQ?<R%hd}Uj7D2& zETh-t*mtPGv#&Zan(GC3>GCL$LsNG7-g&+><M6Tz<OCbl=0$B<neyhc-+v;K@HU-e zHE`ACZuzwj1^eIqy$y4#PbOY(s@s8fSF%veTkhx-(ovho;|Sa2!!_6V8E=HN>&_(O zOeP1(0Lt%9y8wgQ8bf^Z9yy~{>6c2O=Ey>wDjj`qShbpB0j+Ow!w`P|s=qPzC#;C? zQ+Pv=j=xWHh0EOPeSzz2MQ;s7-c-g6$&hfF`>7!?<`KR7m%4!g3}n0e_m11iFr=4+ zKRG5nZ(x)DKReA&@A=A%E)!?!G}?~TOs`HH`G&Yjuh=i@37xm|SmFj5E@JJQ_4-1r zia${F9d#(|AHMI~cG!vzdQSmn%c%8?!{$+Cu7~$F-%0o;^X^XkXk8%}CmM@;D!-0x zcKkAG@!`gBD(3h1OWn^^ch82vjJTJ9cQokg@NMO+49@^X;M>lbsTshzU8yW3vZxyf z7jlA4pbHQO!=zDqi3KplaU#K3v!sEbs`Szu->yB%(Jp@<jKkFaq>%kf?r4vI)`O?^ zjmB@6`F$%o7#!{IDNoG0Q~4?+?kA1rDl0r>*MHpPe&o=nd`{BVmv|i$#iFiKTzdha z#Ej6^gLl18XYqpv`>iLQd4ZVb>E^$Y&FXYpuy?4CZ3s$I6nQ$Y*?{UI>(1^=G@e!3 ze70!h=!5TbukFr<9-tD51`tlC=W%dYqd$Y!NZ)wR*%4{xh+k}X2)R(YwSF|ylkURU z>>i*mXRT6#(BvC%Vc)?d3_B)jdLl&;ulUF9eOpw|i1B#w><Yht6l&*^+cH7IPOMzw zW6REKF83r(dQjc5u+6XZ#ZwTq`$Xn*Te|-KUB@eM#;l&Gh?h1bk4qXoO3O{d7JC(v zJ|S-`jWD|%hsAU2M>Xs;b|lZCEXMMwNBZ3F>u`N+Nn+RWTft(teA2p8$K3O=#Yr6Z zqHFE%EAXA<!(rJXMJ&is0VL0;!ogBM4IoBz_VhiH^Ca+|ojp%(=;rH*X-Hg{9xyxi z@LhO;+q|l{ZaaUcn&~Xbd9Gq}rrx;Vsrig7u$8Bl%8S{FMNp-}3?n-@r4KJz=8j!c z@WlF?&nbxMx2KYyu=jaAw{G4p=C9_O<rx}?eoomRo!<6oYV(0^jnU|WfIe6EgT9ns zwcJDL*Xh6azg^2`1{GS^=^Wz{1n)TtWaH6V>C2EFSwkjH(#h`y+pUePY#6S_3C!44 zLaZZJ$qv&FE5thLeg?F=KoiG_u8RBF(IA$^?2ZKYWERYm2qQe@m--e%CPSB3S8tKO z7L7ULEy0EN&Z7v>4fu%8!z#hE;DB3#w`jIH5$pgP%whis-%?dt4-TLZj3tvNH}XQd z=`v%I61MbX1y%jcBK+N@7~$Nk6;^oOGwK{KiUov4R1;67|DzHAH8x{Vi*ku8(qY2H z&vjkvu*pUZ;3o^rbz2cBX;uTd_nEB|sBeyQefZhnj~yA$Z5ojEnk<S<xmGb*)#w1J zq@AwcP@Qblmr!MBCx)KHK88vYq{}BPZ~7Y^BcoS9qrOe|sfQ*M!lICn!ix2<k$wD- z)U0NCe;<}*n1RM+vvac!l^~{EQ=%2PaPSR%SI7NwWFQ85H9_)&j|A=B;0tm-o0LY> zgvTWQD;sVJEgLyPq9wV9%EWbC4oTneSOILH;r`*8PS33qWL5@S=O){Ccg0ZM^{WAX z_(hheiMJ|t5NvX%fVUf?Vsl;=A-YhrQlX}81ka(<x`(pVv=W+ft?}kVF1N#5<)#A^ z<}<lj)L(Wn6Om>6u%)dE((DfmL4hy;@S_X{7w>$y2!*;LE_``o<r7gpl~&V|{nn!` z8Wi4$q;uedO3<~JF+Fv@Znl?fsxU@CW;Vm@K392?NOhq2+d#K*nx~W)Aa5D&ihMY+ zxE7z2)9H&B6odh4`n@}+WS_M}=^q5bQ`^oVshy|eWs7(0kN1R@OQ6>g8m!aZ*$U0Z z_RJ%*_bzqgIUUMJbG7v-JdGNKxvV|>9XcEujpA57i9cRd4nvBBUv?-+|8IaMqJ-(C zau;-rL=kQqCraEwvqUkgA$Gp}Fa|yHv)<(&u-;fwi&1JHw(X#{;N4N`c5*;zyPq+L z5ZS~@1=YA-8k(|=#|k<tqV%AA6i&q>1*X_YdoudEJ&r8Xug`0T7w_HtbjrclSr|52 z$2mHr=zTKi4>>B%oQ<}ov@=Tr=p&?<a(i?HZ+J7HY<#Ev^hj*)ISeA*41vi!cDj7! z5ZFRIQvARVhj<+)Ab|JxvRx?kM{Gu(nYOcMj>Np$7WB8d6JRS(fNZ)oO_313w$KkK z-sSSGO`8@cO}NMDQeTZh441KN&##C5WcD~<(zku~7yP?5svpB{Kt0RWAgqSNyM6K$ zyx4&%g)W>zp>l-&3u(&7a*4dG%by3DqezRJ)xAKHVChj5gL2DKlV}XfsRaD#ca!Qb zn?@c?AH(CAF{m-@#O&5xT{T~doB$eDE&z)y0<^Q#$?vERBk~A6dO7K^>#Qq<k%tZ% zyT_}GS-U;TK$N0P)6tn3sB~UOtKbZ{Ij;FYy92P`J@Hd^U6$^t{cz4P&%u0p8{FY` zn_t%g&?>qm+06mYXI{vwg<oz>vTEE*^C&i1Xr!yiulMSYNm6xvgh8!z@y2v&UJ<ri z5~mDPe?U*Y9!t%vQ$>-+>_QUqb_c`D0*%$qkKxByoz7-mRG6z>kuT>wHjUlo72<{U zcA8diC_Yh0<c;BkNy%C-g1yMzSsHyK&#EN^0qXMQoPBNoU`cgxIq2-jC{_SI=V_z= zG0yw?R%@1aMLX)^+HAkW{&`73%TJ7YPeYlTxcaW!cLc6Z7JI$N`fT3R*~>H_g}ML= z<5_X1jc#o<Zuc=)8uppj!zE8hI1+DlI4E8<^Gy{Kh+|Fd0t82RUm{*gb1uVd(YZ0o z(|x&{(xXN=d>}dz9YH1HrcYm>Srq<_?>e=v|76S=SCeF5f1$l?1ka7)jsW8Rr1uUl zT{-29@ILBKGR!4h)%&-j_1_>y!uLjx@%<QrNbALP={VzP_1DZY$a~U~uk@kqqV=9< zu8y7SIlj;Yi&kQ{nXP`0!EXWVA&h$7-%n46VtIG_4vQ%~`$PGg(I|P(8ip-eCxX*v zHQk6-9Ty~3cF!CLD#hxZGzS3jjA}Z4m4jzR#!V?*VeQay=!pCp!g)}(J2jaje;w-X zhW*w$h{RvI@z8nO%X7(>0>^VDlb!DH(9zQ@;NJulvO_58AMe9$$v<MV^UP{>2NJR+ z<_o{6S1|pBE&ly}kU@UQvGhK+nDSZE5+%IxvXmls%zSG00)Yz_kH}R;he8F#Gzw4V zP^oc;xku;o0qO_a2fIcf5yZYFu%m}0XFM_ki;@)tmc)J*)H69GZLz-{T%c3+sgd73 zzwc-<6xtOL3gKM(nQlL(ZQ8x1UD9c+*PxXc%b=UDCUavl+g^uGb>E>T@O(n;;gvEb zk$}!HV89u3M(>3smNdDA715eU#zDo#yIjK5W4z981Y~0#u&Cm=x|k&uD&jxGU%~ak z%4dM^xkfDYN56E_8&ZPsYSnM|au0+BuGF4%s9|i+Rn>T$E{iQxZH|{1P}Vt#LJL~p zGqv+Xr^g7-@-BQKo8}|Mah`byh8gl<BMlvPI0?=J@kCy0^ZdAl>*#P+3^wZ+mtRO@ z#g|nppsih6H>KA~r|(y|mrWXn%+;+ckC~XP=!hnesQc1EQYO=OYI`^&)zeeb8>NyZ z*9}%zu~IfROKT)LG?@gyQMv9N>AQ6&yW2R{v21D92;Z;F>eswWfH!O50IJLQ%KO^} zfMZ-<+G@vH7DDO=GG%qqVxo)a`|LD->FD9PEQu&6fe-Iok@nqsH0Ob|nznJUws19D zYO3DVY~oo%O@6q0b%Wq2=A})k_TC>sY($Qq6F3>z#GoDNY_zw;!;UMy>>>k`yeEQy z-mY^oG_(xwasuudz@m2+2te10DAt!#_}doJexH`NA^VV|5BRhPbw22NjaO$Zj4GL> z3g|6+(CZ5tXac%CHkmC=4o2iY8N1<oJ8Yj6DY5=ziDODW=J3m}WMZ@>MbQjow?%@L z|AX-Tuehfuf%L<h${$;3XP%YsM!d^w4Mwbuw3m^tZcGFiA^Mg#g5}JtH3uNHk7(_` z)bWlhidcU<KI6iTz=7-;<E~9QJJh)y4(USY-YMzTOVx)Oc#Wre^7&t4tUHF-?kS(N ziFUNLmybw#YrbY058<@;A>8CG!LuB6Ju1c(n9&7I*qQ^I?8cgn?z7tl8;y{Uj*i6V z>lYrnP#c8M*r%2W((3)eMXi535&jZAjscEp;-4JVzZfjQ#6=QN#Zx!n`!zT<OISA@ zWy_1r{mmU}8>o?O&D3Sk{dDss@+_Uu_^em9AXFmb(@w37E^bD_wZz+%N(tTlyfxP( zm93D>sHEto139rR{=s88p<DfkD|b4Ce*xo{uwr<5Aw=bi=#6osf)M!ej)&{(mPo@N z{`a+?(ElN3+uqxiR(F<wSwtBpThwJOh9RaaE?i5<sw1JF#G@b^%V=EcCQCsf5@X)7 z^mP+mIu#;fyx49a|6@$f2t>dcI$?{>ZBLXn<t@#83;WtFy?={#?r3vNuIHf@&BcB7 znK${pPCP$MhD0AWUBd}DRoi_(^C>q1!EJ~3AoAg6kye?HF#iHYo}+zV>9Y6H53aiP z>}ew~8MPb|)7mFdL)2Hr!PtYDU+wd@(?7p@An`abKq@%g>>Q}CZkeCM&vzdt(U_fI z&$8PziAd3l>{m8&Y`TieBAz@MFYH*RrS+v?541E0TfFlf`Gg+wT4vak$BZ6i)s#+y zjCVtAqqzcQ^T|tLY6h{I(EUK^t!BK3ebKsg4qda(2<DL-I6k)?zHS)D+NxG>+jow3 zq*u(^xyK+9<hp7U=FWI^unwm`=k7}6WB(Czf>(a}5na+Re<C0VT@Xn6K@6@A8p7V! z(?wba`HtYJFvhY^buwNrKHGwbeoF>7A0~KyL=g99y(jV|j>T8P0uL9es_yyGlqm=Q z{{T)m@IO8yY{!|Uz4m$9Lv*;N+JYYJG`@mb-|aT@{GR5zm<9{7$eF7GOsXx7F!EXG z!xH&WLE_bwy^1=g-htD##PHbxL@>^#DN50s?fa&ZNTmJNS)J#Z^04Gx5#B#CwWK!~ zgS%r1w>C%uh~c_I=V7!6x63b5$f^0&jYcnh(hmJD;lT#>V&CYX%Y595VUDX-e*It5 zh{piI+CN?!TA~}e#o6g?N6GZXcNmrV*=k3%|1phx6#b=sdPW$c^(yHTEL23YJC^;) za|K6))ywKGL2=YYpPGMP?ww#}fRhN6b<6m_t5$lUjZfRyTdiAXKUt-rSis`FGi%XR zsI_}_In*qEM{jjm^KC4t4VhUis%_N(R8{?yN#pDpb__N~gC%bcLngbsZb@`Ev7{5J z{L{de^=|xl?(n3c*Q&0NSIzIgYnQ1!S1oeO0D)8OYK1G;`58qVoFXfQ9=gVidihbV z20HZK7iHXKA4nut4;Po4Cm?FWo?aUxD;4uf<{nO;<#$`DR+S&8!br#-Dfi{MLFL*{ zW1lEd<muK$M3ubI_d=9EA4_m>$)Ub5&3Sm}(xo{4vnIx93)<YMU9|Y?EL1!)?<@HS zru;h!{pUycSiiKZ7a7BHqgf$*LbVdFXBtI?&d9{iPF+14Vf_jsw2xL_Q4Sv&A_`WC z?+FaXanr=_Bwxjz+QCE)M7bcdi$4uEsP&*5Y2u6go>5n^g6(YwRRnKsBWpeR2#9Vs zOy_t%H5lI+55PSYjdMgkPE8!a-X@L+h7f0jO0KUU&kV7J5{0to3ShXhC#R=jOL9V< z{QhqZN;AR<<z*=O=K9he_>I_cd)rNzss2{*JKb)(tS9{7Hl9672H&t7!rbe(=Ieb@ z2(Z`)_%S4n9BU44lR^!Xo?4E6^*`R2)Qn-#e)KfDo$+RX@J%-e*+BzGht1c&`5@+! z#)JA9!IKcO=BE1hfz)3*<X)f92_^jECKP$g6O{gO{QgHk`|oy-isEk}zD!-%Q0KQj zB+X6kvA$MF47yOq7HsSIHCwxKORT4Kvli&om<9N(qf8;PCuxS*(6bjU{wu4g)&eK7 zkg%Yf%$+aJE}>=fIs+J8T+?ekflb2}&Pe;A!?a+S>;`p{V9@?T<K7Ls7}(hep3~El z(jiHMDe13S6cK{o>tU!gXPIw@Ipo77c+fMI`lVOxKwV6U0&@Jn&|8Tlxk2;af2h)s zo3&~R&s*ud#-7q)n&K2EsQ>ou{@fFLXM{$FxjN$+^5!F@XXA?y;qosmr)GJF^^G?D zvs$xU+RKJ@7PgNo-m2V)6z|2kFHj5Lxnuq)<dIkt@%b+~r*1ynCmF~yT$aFNb^ zhxAV!iu(?wUiANG`3k`L^Fd!-Xt$0q&&$Z{vyo3^o^(cvb!f7PI0cO33ATUrN4rb@ z$dPza(xqK>fYW10x5>HJMROPUSrWHrg{_mOonb>#FkH>-m$=2Lix^#9G}s|N5M8Q{ zkk8xoSXp><M5{!%$YJYBf&5{wXVFNv2P>3h$S-qOCkA$osHutITikO%bRsCbksh2E zu!Q9h&LJNt%qBKL?#lp{G!gjOwceS!x;$S-c)Kd<s0TrXpTcT0C%$h_)P&;6N$=l$ zEBK!Wwfy!C-H`0`zmBnL+4Wo8|NJW9`=lUnjAaS?>)h+yg5PkhcXjmc9zGsFY*2(; zU-Tq3l+_!55=FyUI}N)b`sPXr{}&wWimH>b-zw{n-oMwj{Rmj!J_*|*I<JjH1kF*B zqM@-{P2MiQd}3Qosc#+sr?>bw{q%dOSbBSVfeQ0n9hcq}S3(qS%gwLvbv4);3L%S> zUTd#|9QsOR^aW?&S-Y7cKyZP0K)di-gTt#{G|H9i5A5fAi*cTs>7nfxA7L4|u$3<% zUS!<#^23bsB(Sf~8|+4@djUZ3JS|jGD9a)T*K1UKbz>HC!GSgub2VBQ;UwLjG0+aT z2%vPR7~ou3lOy-MI2;v|+~mgFCT_TG*glLKKhS7TrhEdn9*2YdMW-7D?8`^v27HOc zO%FgwIf$F2cSWuc;M+TIPti@+*o0DqJ(dH4u&kFgJ5JTW5cmW<?9xNMf(jbcFDlKH z84ch*mb3NG$4U%R)kn<q|MlPT6JPX?*gP=#H2%L$K0uk<YMQzk^Y>6>#C{u-h>eAk zE#=Ai)$9{y_@yGq5dKpb=FY038EJ(N?!fdGCc<y;7efT!%l%#1@n0KTs^=II)R>F@ z*7&f?PWULyZ*3&j(<W$K5h~p{nCn||o}S{>`<(K7`R)@#DTl@R07-9D(ZM?kzW$E# z*7n5B_<>;4)ZxurO$81}&i2j44Vp7u`48Wuz6CpEjkD@NHp*Uw>DCeGiySBiz^93& z8Z=vCC3I}aJlDk=HbWtg96uV88M)<6zik)~<qQMY0sJ{%1_UN@4nO;{9|?poU=Q!A zYaZRIJ^;H)dJdKm6Yygtpl}2v$Ux*m+em6yU+X#umyZI`@C%Mgr?pnoPAU~93P8;H zIf(MwrF&KB$A>!mWiHz7#_9tH#gZi5=BxPON^@212B#wV<TH<asxjAp@k#G3KmNh4 zSK(%UQ6F~U3XpjZd7g~lD#_P*zd!E~q!HC%UG&?RL=Oml{(3MYLyJt*etTd3OI;Tw z=oG$5k-isAe?W=6Sr$X9H#36+YE5OsJ*QaOt+U7I9cvC-8*x~!xuzhlkD5e@ynRdD z9=Aq`5=w3zwVJfmis#wi2BF(BO9BFmn(XPxW7*=sGGHq<I2>Awg&ds9Nl`|sbLKIx z_sE!MPz<xPI|eyin)&uu`4Vo1tfR|_IDRyyj9}k@1#^a`&K5k8iG_z1;~gD3SdE^Z z4h}>YL%Z6-Ml+ykzZpOh6HbA|mRn#k=&T&%Rg>^pCl%e>BAP8RfHLY-#_?>=Hb{A$ zZ}WA57-`_ml6=Uf`;#bwOYfV{oh<L`8%`p?RV)?5rk7A&rz)Zhyfj$~i4Mjfg#DnG zTPerwEUF(sXHhLhk$*$UMi#dh8sJ!P#@f;Ug}d^1)d2wXpW>FWp9R|gqz?ae7ysj0 za0LL(*37uXrLlf(TH<$Y&Gg-f_kA3eTkS)kg5SA_-i|g5Pv@ipds|#8@7fTDBq&E4 zjA^EYno^{+q@E0yhdVgO#gyk!Ll<F@kX}3)Z)oCChA-*Tcn;;gG^M)+hhq9iyyF4; zdv@p6*hnr-$$e{zb{C{7o<TFwYCteNtXH9lbn_?!Z&BBvMzC~z;7BSJ)?Rz1FEo~n zXl!34Oy~FrzlDY!cJmHq_d*+GHxM?L1ruxo{wKzwWZUM5>JGb3W#^$?u2CpjIyc6^ z^#w9Ch+Ie#wKJP2@-XI30snU82oQC|#N>+DE!@}U5J$=6f#O}k{+90V;(g8Yr#AR6 zpIpxC>vgi<tGWOQpr*jph&(R0{s&>pg#YISP<>zhryBD2-}is}2p{JLWqRpLWn!b3 zaN9_}&Sta0aEu_pO{CV~HKgJlRo1~Y13ZAh6UVI`Xq^YYv<B}T?vJ#Fy44I2uMKiI zIcR4gJE~L_$lKR4l({tPc@NkxAG1;@nCu*`8WkUA-o<G;CBB7T()VMiJ$NM!GU~8Z zB_4_<VnC+K<?jTQF^F(lza`>WoS8CQMI8gHQ6kSgU(g+_Gcr6J%7w{8GI}^A<{$CA zkp*d<M%P!D2Pcc6T_B8ZOA?94gaH!xq-0}Q7>RTT=kim%y*_PCRrMT>gdWc}I48dO z-cZEqeRTmmH+GZ2^=yfNC!42Ft%Z7cU+f2vIgTo;fLx)jXyzKrxr;;)8P3QOfS}SW z)*Y_dRaYt0;sj4m$r5;akPa1smIJ@SJyrx%oVF&Yn=cOJ%(k&_GCtaz0Q-EvgeM7J zh1dD?CDmRN)d$NxJz(dyl`!l}NA;KP1GuLLLZRkt5+se&x?F<5M}p~(b!BK_DP?F+ zEn$K8=qxE8_yJ@6Y(LcV>}f$O<<eBSv7FhK(>qW>mzM^h$K3<aYs;n7;z<-1A;T*s zNg|x}GV%$EN)Qtux7;1QMK<BI=KGUSHl-^hmLbS{G@FvLj)hk@)j-fv3Ap^Wy~K`| zL1fz$Z0RFS$lk1ymw;N%zorQz%G<VG37=xtce(A@B?DXR#ItYw<CusN1N92X9>IP{ z{_jpAfb8Znb4)Dm_O$<)$Z1_(xueC&wVAl&Hux1lm;3dXO4IaiV}jam{pNq%^M93l zfXGMwrDsc{8ei}uZP1gk=QyfV9w^fs4&iUF_dLmPU0f5FY1r(6&|c0!9K$R}4U<Sj zF4sPjZpPp8Ed0zjJ%Y|@=~b`ATLN8$$$wZ{BJgLxJcB((t#^0nHjNKdmF=FrSY0_p zt>2d$_SeF<7|PA~kODFpF5c=VBI4|N=gC!fW%0e|1JKsty3mz$sFlDc1|SJ`X4EWh zECjab-Z;)ypB88?uLrWvSKu&wz2g!@rWt{h`7tjLJ{s2zU)8#~12#jFJX8g1?tU#z zp=(zJ8*zKDb5gy^)!!)zu4k6U*);31fpO#$U9LY#k{F0-*7ew@(?A}MD0Q_5lagDw z)x7%VGYqnjz?K8Ixb5BM>zF%OD?P(ma^h!T?~m5-a7cxbPMGY_&tqWvkp&RzHu3ij z&<%A1E7sOYJE=_s*v!!dwnS1fYkJu@UO0fD1&o8nlLf4U%j5NGjUpYn*?Pw!tWJ1= zW=XZ@D}W_7vBZ-sS*S^&-Kc%$_i4DwLNhyv3D}n`?vB4@cv)Sj>tZM+w~^J)q6a^> z_WO3U%%OsuG)-kSP5u#Pt)Upt)poB-4AbOg`4UaMkaO`jVXve(nu-VsLo!OLR85c) z#qt(3X9pVv^Bqz<Gj-buV5y2V#u)nSuk9P(_WeBPYf^FD-u!zE>kPr*r+lMb-*~v$ zP#CxHf*y16EKS$Xo?2_{vQqI1WEu`?30+}il51+)$6Ih$vL<@-;n87whlP2M&KI%j zRDL9cW`DS-Gc74JXrA9gqd~V4p-@wA*&1(L5u%y$ciikdMsx=7Eq_rMQ&7JB7{4=- zuf!EYTju;rJr3z(@0vi27k-b!eDQzsD03B4%b0W)OBf1E6X214x5;7Fyb8;5C&0Ta zT!-p%3Q6_8=(?c4kQ+Vij%K#-(iEm{fxlfhU8xyOCU9f&Y3J0>dK^Yhz`q<7Nmt{_ zzvYbZBHG9Qu~n<D7x`H9wj$^5X<gs-;NV{J#<&5u*B}S1B15=B%rl;UeQ0oaDrJ1= zqQq9gtdJbMlfUNUUp;<dhmPrg?PY%d<i`+EY@qGmK)Vq`3z`uQ$yBGqS<a)VO2b~= z;=Ww*{Za7)KbNN=mmXil9Xw~sfHY`$CA!fy1=-ravhofWOrR@gEoh!B&@*vKB#dHw z93|lTVg8+u6TQEYgH`Qj0;IITQ&G`dcIAC0p5viRb7JDuTNzTi$|S^5PO@Oo>1%A- zM;>c<UBnwCtH5e|MLF;58g~m+d4IcNqg1=YjLf;{Q-xwnRb}Ga{h+ItNfEB=gSL5B zmH37wM7Nve-t%aC&{Wg`3=zu#lp6l7zP6JEn(V5|{3Soz3w-W`RywI&U9M6Jf1zr6 z&u{?(@Fu^Jn2z#E%$pb*y*dk*2x2M)2~h+qN|gBa%3TkUWlbPq=b(+qz?PU=?8BY+ zgg@RlEg1<quMLXjYZRFTP$l_HD1)uo39ZtNROC5XS$>v7g1JueEe<T{dpLYEW(8CI z2}kMFYhI=!^OPYVAc`?8*Ye`~{rg)9;Dw?EUf6O7*jgCzfLUV#l27HlHPMAC8z@s6 zthSzgLwEH@O;==U#Rr|BGH>vhnFN+mk-{jRYT%&Rp}+>ND#439ovM7Wp?kdeZkgGH zX56$D*z+DvCxia2t1mJh64-M1Jlfdu$=#VjAl6Pi0D_2-=Q=gku<DEua#(}12+0+H z%48ISJgwT_!wQ)o#!vgF5Be^r!e>s)X_RZV%F<UJt<f@S!W*O54aOi}K!S16FaC3B z(-_eS_uli=%2ZkYWRLv0DgJK8dsq4t{3YTr5R}MqHjhqsO>lBXdoWz6Y1E%ocNM}o zs!^oz{LN?~eU@wt7s3X!6SY0vcl^=7_>_;?2y~Sz#GUmHRNRS^jnBE)Z4HIAk6Pc5 z@Yu_nJS)$_tETb3@;C^jMp#ZAChk50>$~Zmq`dV}%hyttjb>vMa^880F!heiqV&Ee z76B>J*F#>eXo>%ErVhDgIdc}@l~73FEl1cix;ZyGtXgZ={`Az0uJnrM%33bBKJn6K zWLeD(xH6>}tD=|Bx%HeXhvuEbRfv!cPqXe$tVJ<J)CiwujS>Nd_|N(4;4qIBhkdxa zWT&9GrEF$6pt}NFI>=+`OW;@OBI6cnP@ZswJ`P^iqVh&mJIiLkW;W1PReLr=_1M;F z#r<a<8g9(&b7{jbrZGewh%FMAs1SfM#&YVCMkrVx_I7<(FUGTqMTkv#JQL&O@m`nd z=icKJpE2HHj~qAqVQ#orz$YM659m%Ac3d&~>zXGu#yU>_&l~w)A5Ksdt}w!`E6s); z3$HhpxL(5asXFS}XJ$T?$=&l0aT_NBopCUe#Jz0xw`&=7w_mRq7b1u`gB-W#AeR6P zzF?g1fY5nNzLLr?LXf`<xaFOjb2!BjU?H9=D9h*X+5Y{Y3~t+*%PC{x5zd^DnwnDg zEore`S<2gaYope>1Q)jPQ(S|>F>0{E^X%EG=TN(DP*x_n-JtS--BTH8L?Cru#)pvo zVqEM#OEE&U_Z475H_Vh#b5DkPzt77|kVC_%pVO#I7I5&Vz9FSyE9wUxCncWS!`na@ z8roJkwHfj0`nWj&PuM)Aqd{y*RPF-<cFR6cDH}0k`CbHls-klC(Zz}=GPq@qO0X!d znm%tQEdennUL^A?#pL|&-eI*c9?mu#ml7B0H_2uzrCP&e-sv@aB@2U|d>C|*_+7-e zS79Lnl2bLiulC*6(g<Q|AAta}`^mN~fx~qUrb16X7N>fm@`~t#tWXgyMI-N_Imu25 z;76{)Ycpqgx4pP;8|=)MRTMc=Yfx0vK?^6V0~>HzbCOi1>qAJ8(8(%`SW=U~Z%yvU zch_I^9Rv61#3|?mjgCbyX2onV>H3U1=r9{Pq_SkAdxPcIJ37EqqTu&4o|lG+3uf?2 z2rRXAu29O+K0xmr+G7W+29JQ(iQf5L{l8{2n%lP837;Oidd7lLk5u_2O7)G*F-5G* z4e^IZ7VN!AtjHC%QhGYfbLyxvHX#6KaodIVG{_d|@T9YO?5ESMd=pa5m{K)7Df!q! zwRf~VKJB42_2d}40h*>zq*0WwEA*4;mxqXJDWswARyZ!i=u;pm&l{>__WBnGWG;W) zJBm^Y@*Wmu*<i-aLj3T|%${_nx~t@|upS1<=$~!fDUJ4konD^x(AT-IHI?b!oZL%Z zLS2)x{8F3g2|0JwWWSycfjUj-Vy!gUzzr@b7)sCpl*@EemJp(LtlO{e%muxEO%0Op z*4Ex>3GWOIq1@6u8x9dN8SViuhljb82-}5!W!ljZ+mCOf_~t<<n%LsA`{qwxQiXNe z#jx^H`9A;N;3-QOf@21<H8Z#GtZL_gYAw5~fB70cm&X_c>uE`Z4n&b#3l16j0GTUZ zBzaNd-~O@x2NdmBpUW%t75Ix1*~IeOu=t#EG(|9<AR{I=&%P3|L&-0jAct9pQ}F|t zRj%M7l#HW^Jlc*LRjzm2V2JmH%}9sx9QeCUQKv0VytP6op(obV*%kK{9IrTdTBTxr z<~U)9>m~J-5qtGq9AQ!8f6HyE3DS#WFfJ*AY;YQ9Pe_J@%|RTadi!(-L5!Kpp@0cX zAUr57Il@hL<xBECr+dDWd`txycrYZ1XEhZjpVgH7#&}7nqdyNmlXC)TxW$irW6Y|p z*fLm$M3@*zIbsLvolB#wiCE&;DZNe%wQzU8(oLJ(QJ!EKDdbM7bOWCLyBKL@Om`}7 zvgfzI77}}PR1K0;I`0tazWSk>1F>QD8_EIZUHf4fb$R1_oP(?L-IqLfOOY#mk)aSB zOY6r4tX5M=7J)hU>4R#1fUGo0nju~cW#awS6nE>7m7ke9CfIW?u%2;Mca<2&Fw7K; zKTye6V^qz16WtpZuIM8PaW*&$?-Ub#qD=h2FV(|7f;~`JKMBlRHu-dXhtruD<RSAm zaBY*2UG6N9*9h;}r;F8P0x3PX1^Rlx&%8c~v`^ekcAg7Yf?m=_CDw|iNzCK3O#Mwg z^BduRrPUc2{Z|$M-5aJya9$&Y9z}`yhpYqPDDtWHnL#207nv0}AL0y5MD%LP!IOau zGYv{gd8#$lTa!&vaIOa#&738Un|u>YRnbi9VUof95jHU;VWz1mWRC7Cf8Mj)T+hvI zz8<LeH4X5XbEYXYS^wm*SBbt4lAiTrYY<8I!wX=msNq8G`vpKFbMNIhcV8e30uXRq z03$iOLc-JX4_0b4CRnn+gykAZEv>$f9{F%hwcMec*wtIxovL~w$Ak%ci8ecEfJ$Wg z0sMIdTay(;BY+>keR=yuU8yV5#Od51;j-KCv#+%a>KRphs&`rSmhEFqB4%Y>H@&&p z7S4mT0NA(JR_X;QwCw#U^xl`Jv7>q9r$Ww!x6RGtpJ2Kp!z^P6l=-#o=7a?mS#JiC znda%4mrgFsf~2&L_S5QV^qyZ*4ln|pX-`$kUL#bt7^<>w-hey9ia~rM7&s2>y{37o z*M70rplo6VUkbW;oTa4;KBwXb*B>_|S@L%^%D?B&{~S?i@owNLpU6hWKk&0t<?Ae? z-S^q*fos~x8^S>h%hQsO)24gyQBGVKlzcm^IQgm)a0!~L+uRgxHW?wD)@+AmdW}OV zaBJK(;>C?gXV{t?DXn91szr?_8&%6shP74+UBaUf3x+38azcerD`NPaC5PW8f_-s< zQD$&mqD#&dto^dHAUnE?p)aji$O@bKYCOudxanV(s9@MxtsO18>grjGKj$ObcC*ty z=9l<>CH48Kgv=W9FM?5*$3(I@ipg0Zo5aL*V)PINR#U_$7Sh-_m8j+v7qI}q;M{1Y z){a2pb-QZ)(r_Uarp;`<I)(QIr=lsHbXM@AWLByIAO20N+`+d;KgKcgF};Bvip#WL zNS{c^dhjQU`AlsY9YH9CNVmoxC`aKhv^Rb=oZQi#%@H8|nl#<cUCelvQI&prqpfDf zzTikPiUIpIhcws*Kv)K7KCp|6(WIC%gDw2Scn}jN!UOqA%ulZpR9u}dDAh!IIJOl! z`c<vOJa~AuW7x0Tc>>P%7u0|wwQeo_kks;-O!`|OpR+EIi)3gt?s-T8z1run+0i^c z$<-)IC_-VAfpHUtffN$w<X0?is%|C+KIYq>o&N5Aa7k|C>LZM|Bkb0bd02r`0>mM+ zwEE+PH=Z8&^Bz_xHHU$pkUna)o9+pPcT$p@j$S;^rZF9606yke7n{WVq9VVdb*<q$ zx^E#awv~l1Yap+E4^{`B0OTZ+$6`!!LM4xXG_WO_Ni!l59WSEE{W?m>nvw|waO3)x z0OgMT^fq67Nnzbm8<A~DA65nI1yKG8JiaDCy;pt;$TMz=@@H+B_B};>T0cZuDe%?M zd%B%g;&bH2cVfFkExe-8`|NW5l_hpg4H$)Muhj2ywr@3)VzMO+iSV|iq^N*9!EI~{ z7U+B)#X#ncU?kw?g<NOx0Q$-IRbGcF{wQz;ehdLmQwA*K;eUZm|IsSGAEo|DjcH(P za@Er)>eZ$&ON*Xp{qfhq-ZI;wL1P~efUWI4gZUXA3gFS|us~OQ3@RZGgXmt?)-!|y zj$hG(VI{$3gWTwJ3xlf)s5!FHk<j73=aegNtqubYH`1^y<O#EdIrgx!`=f0;o=KaC z;9L7Oq$Pb84AJxEE3q&|L|aqz?@q-N2_D~R0tQ<*>sxQv#M8@^49>*LmC8%_V%*NS z0zm$7kn`oF^Y$x3d9(3iD{30x+%KWNiuC`~0$`13_U4Ng4fQ*Wgg-O^V8JLwp*=XG zby)xcMo14fOPVDMcRw)~bNr}~?W#er#m4HpF}Cce8}TT+jASctnGb(2H6P$##8x%m zNXnI%k5m+t5p>!zg1uNjK1O)seO`U{0oE+Aw%F}*w-iid5nmqoahAL!dBiuI!FAAl zeQ?>Or|kv>#?5cOHUwdLuqqH=8uw=SbBnHSItRuS)xueoi(QKj=>48Hs}a;YZhFOl zhm%@Od7>o$sofq8X2v6At}+eH!JKVtaP^xCpy~Lc{FlA)lV~-NspkL1KE(ia9l21# z8{h}{z-vGDnZ3(>w;wNf2nZpco^vFy!%w<5GSmqbOWwI9fhy65FF)Q16l3Hu0lvEa zgxVl_gHfmPBOxaq`(%wx>V@@d-o(v95V<kTN{d|Tqj`=eEREJ}HC@vK_ePQD)+WTC zO6-Njbel&TO;>N1Zv?12S%Irwji3y30MUIbhGO%yifd(Kznqul{)2%5Q$GbQ7yS+7 zg}t2jY(Tym7aj`}O|E~%To}7IuX^m>&ln)ru%0R`d%H37?PsZuWH8xcGXaTNS@6k~ z8vL2|X5G#z&Wg}P$x6M5!zy+uyJ~hNnS=b@)5Xx_@;No`xkiD5b2&+g`Crj%G$H&g zKN}Fo6W<nIR8{y0%zYwaf75)w_+^clt>>22o>0pc3;>^UT|DEcDx-~tfH~5YPm2#a zludL}ncZc!1)oeiV6Mj0=nXaGjEYn_%`8od`!QfgI9NO2ru~2-u?3DBHOddpDVOR@ zQ}KLXpQFeR2B0o$1}<_x?EKN`UjY<r=aWm=!#S`N88XFY*%1QWDtic*MZ$svC`B>Z z4f7=*GHAVU+L<u-cAfwRiV_Qz_WgdMx96oIX8dz@GqFtS!;PUDF;?06;~)~#?C##! zH{=sDvJpbQ4jkLn#=*rT;j7wi)VwCxs`^PMT(DwQXw@f(NU0qyuvMIRPkVv4(fic% zsur>agS*T*yI$>cSAcAZ-qq86`zTk0?lH2S#hd?~^Cd~JY8B#sTbq|tv~WA*r*%iQ z6<UYE)~?M-(lKwpUqF+3v95LqryX<iOY=~x3lrCieRGveE#=esbM<T;{iP#3<Q;)x zl0=gDpn+x=+iwYt;048Tov|}7_w2wuwcA!&AwxvQXT7A1Ajww~fsAl!Z)*V=8L%da zPCVrw&(MQ@+1LxGM`P_HBU<bTts2h<!FSXw=n!V_OGnkXe)7z$Wsh{*v*X~!K1U}3 zhaIcv-QL#V3ko-JU9eu-YM_}ZTZMbdnHgS#7dBJFeo$jV)^XDG5Kl<}#2%=msoc@7 zH_B@xyLQM0>CI73Q>9WpF3cxx>H4(W1xNAY=BpPyHU?wFkAm@T%nFTNag((k0Y0m< zJ_t79_;--B5Dt<=yFb}zc6LWY2YF~C9h3a-nN%n~o?Zp;G@8=xis{i6vY*H($f70x zM}h2VdDiyvD-WBFQ{?3_GtJet&+Y)f_h2zE;xq87S)B7j-JEt|=NG=adtSTKA4|-N z!|ikz9qikj5nW0a-cQG)!&ebQD-FbB0shx__66%@qwi-)2EU<q$`bLmQ+QO=R^d5h zZ=?}={3+k0K{lF^u_K1TaG>>w)H~X7rJ)&dD-LwCrrw&byiyt-^tC1`@*vRp60|Pn zd=PXOk4lC2zu(W)0ea`Ax`+B#eKja|nQ~z3IopFrDnCHHUO8I^`$j9}maAXkv$K7) zb1>ZE^;kLeRFZGskMCY=o2B1ozBx&LL;od`Y+z^e$I<Urk^kCUEy@3i3W1w2+qJUo z^nb&;wq5!Ri|`QePxh3)${0Gz2=NL^OMy*MXEd!@=srW14-f~<2dr#xphj8)STo=j zQb7n}KKs`c(oaFQe1Y&6)6|I5i;MO9)azu1dkjBUli#tG)_q3xtpDHy2!kuNVd#pu z2<?0O%gZxs?Cq!>4<nuyf4ER~h+XB-zz^}&v-4oRWCO|%uh)jCPP<LdCezb79<Crt z*M~@%j2(C9S_Qv6V`Ex283hvfT@Jo_k%P|K(n=6b7mkMW=mUZG0DlIY`W9b>#3~T% z(&m>B+e{eszf(82^L@mGc|J?KTZ@H6%VW3zPy*=!DmLwHEx|!{BHDCfscE0v&`j@< zUZ+3ql|bmHmfFeGzLIWst1#M56E)?y%n8t%bn+osoK-)Z2{~U8*e$-7BZO#)2om1g zxc!ZhFsTdoSkEM|MZG{H8kd}{a#A^Ms%gK{Wq)C~hMl6A8YF6C`Ck2N7|F!{=;;~T zs4x#=;Ej#4w?qli*3Fi3(P^&<)-$sdnk^&JC{$?2H)YwCPtwpSW59IMefJ3kt=YvJ zdlA&yZHJ<UNgN)p?c34M#boy_QoT`rjZe>ia15J0M!qNh(J-*A(l>+OhpM4I4IvfM zXWOt(i()qD&nIHnc?|ZGWPOfS?^CFqRk$<y`1$7#>({5}l&;%Vd^o2L*0(tyW`42g z3m(nF8G5%(B>s?0<V|7TjE5=4W~@omV~3UAEV;Pb;Y8zoW^oo*7k-8)33S>3Qzvit z)z+&&zC{~}PVrr%8i4D$l1@@}HM)cBB`{+)%PVrI2e&4iS|1cqiwht365cS6Vg)9j z=$7J*@t3x$$jUtK<;!EJQCu`2h8!Ct-i+lFWOrPpLbmT{H=ZnVcp?gl!y=XP9%Lg) zUkUA!arF)mX5Y#?2%)Y?fElG?*TJ-I3*_bs6#F9_Vwbp9=POrDB?_S|@us%9_<m9$ z^$2{^)<BgMg|gOgnk!QbPKy@#JmLP@esoG=D~vZ#|Dwg*jF2dF%KGsQG{l8>`3U~> zEFe|X>(&-R4Ee4`eoeefh7LRDB7eMx>~~Wk@65ubDBLI5@M?7@_I*l`4{3w*RI{a$ zq%c7C3`;wNt2+XFhy3abAzx-5$S$1fo~qoPt<Y=_a%HhJXmf{iYvKzNkUj+|fyhkt z#D_@`y@cat0ACUoBZGXB@OHdPR96WB-IV9qY`B5f>%J1S&Mq0YXs%Qx|HBLKlU#*E zLIPs*Q6j9&?Do@_y>$?~1#ZI*+9b&kFHu`^AN10sk;cH_*3~nxx_jvYIW6rd?(wXZ z^Kx&^?x2F&wt;ocZhNIu9vVK-OjY|zffh5=ZOwalEQttUwa?7*&illrOnT$!u!tHd zhub#(%55FTX_N#Bv(Hb;`|9*F&hqB#Z)KD%O3HwL%gL1Pa((JJ2!mWV644y+($VRs z!;CG_(%)%v&ZQpxF~5>6=ers3IkwZP20QR%?!CoV<rQHTQ;L&C-k<y+lQG6@bpv{} zbnDyd6$m1TNr`o?q8C2NeL1c_-0TfCpU8dxW19=_;kx0+2*jgjY&wJdq?T9jUbzj3 zILj`!2j`aG`|!=(f0n(X_ZZE_A+V@Ohc`Awq(OG)R;J=ff6{(BHYG}QVs{2)?=)I; zu`Nnevty*p?5J%+`-vocj09~5|EOCU?q8usyF;V$(_7Qm22Qi(=?nrT{9P!nMED=? zy<2D}wT|RNxG?tumCL$4;#TY9;&3r0a^Vx))02$7-Pb2xu9rBsEJFY=DUCE)?OtM3 z>bC31@jEEy8DIA-t`+q8NNRNcOy<_x;^uk5y1f=B!|@#J1m`&~P054-zGG@M7ia=x zu`X;nizsos$?n}LLSr_}I@ne8>yOJ~?(5VGflP69JT&6#@BGMj;l7A8%_1FEk@}+; zf!!vGshl`um(0M2HWQ~8Q^L3Bn_O*lj@wp5s+>!_IK`icoYuPHkFJm9Xh)8r-eZc{ zirpl8QY(qFuo~DT-WMV83M5O-gXmvW%Q=1$b&`DdOGeq>?=Ca`XCmBx&35?vlcN29 zqGkEdYtu++^`&j4_U+G$`wKvxb?@@V>!T*#AiZP~|FI7ct1VbBgm!!vNbHB&t$VL4 zoXKrf2$gEC(%(@&mQm)4dr@xGB_N|BfscRVxeo)CfJ|7Bbbkal!_AvFA4lBjl196W zDXsGL197uk)2Qz5%+}n_){dRC)2vNRLqWkvV#?%Plb0TR;kscK?I2lVBStt=8SV7| z(oDo{;-s5M=z*-UzAP*CgY`6{&E%oYp`+61@{fo%_9oc-Ogn;C=tI*(BN6O^W#SBW zOWzcgo-9-z61jB|k>+WR%O&-(x(`i?kNWab-IMxAWch2E)#mA-*iR9yZfRmuVax&w zL3mmL95e+9QOufb^fbCzVDdia9kstnhuI3V1Te6g%xn*P<Kk2EVKrCY2K!}98-}EG z%NY=CohAF6^`+aDYxCRnjz;D6k7F-)a}_BrPZsI6lD}5u-PHgiEex+$AX@VS9#ppw zv!42EwaqoJjlcY(K5-;)+K90?{@i!7e1duFeq}U|g@&WOpm1@fQmTG371U}<Ej7gh zw8||=um!l0S9F~QXz|BgV6r-bwm<(U(ye<okPdd(F_nz$eKI;8{c_(=tPtgx-$0tw zC`cgsSSx++7M`$ZUt)9dn`(DCHjP4l8&T$>0}%ZC$6j!t*jK7o_#7DDId5N-?6!<+ zUowlIym_u*_nsk$$LRWfQ_*`?gL<E_z3j2L?}{^irfmDeS+SRAo8nLH8cma#&nQG1 zN}cE4M!dyt7C9%!A?MO{CHE0y*mhi-7_)FFdy1igD?IY<!>uy#&+-6Uo$0;L_eI8W z$%UUSb|^$JMaOnRJl!Q|9=876TCeyN<#8->awf49%D}QjGBLZPFibA=R{W`@O1YX{ z{<VspI^yFzY;CE_=4SCZ5PoFUOjV~#Y^mdnuYY}CLXv*%+E~o_e$l4=?P2cS5J#Qw z`l#%?<=fOKpWE!;%~f)g^&eD}cC4m}&zYwGsL}BDAn<co>6R&Jo>L>pH|<N1GAOIz z)BAbn5oup!#S^W{D$`vrdMbmQAP;G^@N_@IyF(C!*ej(D1e7X{2+U@*VbNnHh+NIS z6sUI^PXP?B^oTcKsqGU{FmFv}`IB;}nALQZM%SD?t<ym+OEroEj_+qNTG%eJ^F9AO z-qq_J2HL?Eya~P0zcRdQZ}9VXl<-KP?>BruF|^&`A{xrK(OR>3Pnu8tMZYR_QB?ml zJYl4-z$4?3ckPWS^Sf7XHL!j1VGrvWI_^=6r$0i0!Z6|)7&}K_tn}%LzO1o4eiSop zuM&tanWGr5h(p?xDO{O6zj_mwz$FZi^lKWSD*x{0CAvBR-?0#8ecOnYKxKR^9!+OB zH+uS^w|x45LD*dzPJF-FIXwH><9+0A9+}cme{w^7<rR&)iPs1Fl>>aW)ji~hmzmGT z47tnaqRpL$M8eJv2UQ@>k%&F1Srn>!86H8a&^u7o5$z21xKc<FPR2c$k^-)G{#UP% zD@AIxwqmkK(MOIL7-LkVe3m99NY_c2lg?CsX3}IuIxdTyP)XMItCkm#>zSWE@Gc$n zf!HWUmBA451{Vcezwukz59mv^4~A5pmrKs1V#HIk5%~2W1<NJ67V@V7oIt6b*WHYB zPL1hni&}$Gl)v40nn!53L5Zpj<OyNZ>XA=*s-WrGR$(j`CoylD!uSl<5&EK;$9Jj0 zd_+Ug0flWWo%+7%VkK+F)n2)Y$N*J;Eebz>HFewZ3-(x&K_TMHSfO!G^gIHds+P)H z!fW*$090ihge|)~sF3<s^8soVk~~#j*NbD6Tl1%Q34Aux>V;Y<<suQ$c)S3ks6SRV zo{bToFKpD0<1x(_e1{Hu*@tK=)~%CQIuI-~DcX2bBxL`cIH6^LNbkeM+2qtfo=f2C zi<ieapM>MD*F8Q|K{8E`=MFh3ztY|-cBMaRtKx{-ulsg?F|==!2y-sE0j^NexIo=} zp1+!$;<*mwaN3h;_?!lA>(4hP3qB9*4xfY^Szn7)+Fk`{xC<(ujP2H(>`mTMtCgl^ zHh3I6*=kvpKj7-h;lvHe8&IfyJNdZe7F*KBSBD(^S;_8A_JeJS`E3ugXnd=q|BJJ) zjEZ_~``rrC-Q7qjsdRUDNDU<^rSuFT<&e@PFi1&vN=m~h-Cfe%40-<U{XB22bJjWQ zd}0kBfEi})`?`L4O6l!%jFJ#4C%F%*1KYpqe0|z3?iw2a9T;ktS$SbA{*?(ihZ`R7 z-747V%<Sz^@5WEPP<VlFmBs7)jU(wdS)?3B^0VJNo;|ZlXQi4ylMA$3!g_jw_QcSb zGRIZ4$?jVT%9G%a|2nkDkg=Zr?;g@UVOR-f#ZqSh;l=t|DO({4Ix-PKlo%5mL0s;5 z^aPBY*7%k>Rj`6-M(cd>fpM7$7SFcxN-6686t!QLk+l=US}Oa9l|bcyIMleC^O1yg zA5xLpKtWKU!Wxy{J-$f6D|h9*_4p|n`@e+6IPK9hDdNF#(8fg4){sJ(?yP7X8h5Z5 znCfHLwkJUYv@(e|zMz2lGalk{1cZWYZd%Z%r4Lf~P=aO3zNn9<tq{Xlr#*0KLp*nB z`kpQZF3UG<_T+iNqXIyZeclNMi%nd`7%{XG>VQ|1Ib#F_FeXc?Sq3{@Qbe2v<y0<j zx!~zj0eY~=)y2M)ycKNkGNU^E^xP5t{!Ty<hiN?w%LJ^t<&Ag>F*FwUeZ?38$Zul5 zj_0csv=CRAJqlUu<4W9dLsW}8VC3;d-~(BUOx;#r#0PPqOpP$xc#alKvnKa&o1u)= z?VU~hrQb#sAV0mWKUtthOJWXZ97Mu6dd0fTzUIemq8?=ys7F@7!u5@SS-JRBJ!JM; zm8fm6ym>~ZcRr#v=zEppEU);$g9tp8hY%=!{@FyLzOMf<Rp3AVsojRil}yptqwSU< z4XurmME;4bXDx%WMsaMaqB9M{=|5O}z;-N$3@+onWezpYN|&`40sG-9=v*yLo<2|j z6t~s*vJBALhL=B`M7Hm~W4d2JX<26<?`b#Iupg2*QX2Np+XU+xEbgD*9BitIU*{n+ zHxJjebxUiw;DSQtTV}_K2`NDWE=!%VHMK1?Tpi1aIh*)5e75z_uL)mTpI#k~%UlqK zuHt)hK&X1Ze5Xrj`oO)40Wznjt3H^mG3!xDVwbuAol-?0^#Ct~J#GT7B-yV_k%H<t z0dKY5UVj$+Q>;@4;7?pV%3NC9UV3ach)V)umy7r<1Kds%joL*nl-%i-#o<dIrJiQ- z`cM!Ci!F-~EM|s<HxEvrY$vd^Y0)I+V@dz+YCa6c75}Q3Q)4p}J*AI-Df}#cvnMj8 zGzXx@0Lhtl%`^o^I{CPb;k9w7;Mh$xNdy{d=alZ{DcT39qUUo^OAoTCx5s`TO|3^z z@yy#_sj#Mt?NZ0Nwn?ptC(z@z$)iP(s-k-L(gF%3T8aG$Pl?t#3j1uE6U*UxRy?s4 znORupjU+sgqh~of%V6oYH#(YOW{;mB=D_E9cZazchC!Krcrjo2Hnc=SGiwQHg5H1^ zC4?^V;n#5Vvj4rBLG$P4e=e~|$TQIBYL8mpTusuB;bj<jeGVI7L9(X3TpBj=oav)F zt=8ih`|Oq$LP5irc&zUwJD8tGNG>cLIiI*2tM{_di#A-W+46`t-}w-ELL~Y<P&=Gv zM({yPSD;N>+<rE})F-H~x}Syrxua6<5LuhcMQt9U6WKNg6b{%(F+YM)+iW}7WLE(@ z|M-a&Y`F(~aaerX7n3dx#i3yks(l6uhg|I2CV7Zdlwp|22i@Pf1!Fcne@A`iED+Jk z7H~FbU(yGV6<>|&N=j^5!cuQ+8?E!?LVn?;gmoHSZO188kFsz`XkRsP#dJ1_;phV) z*Uv&AS3ACP7o}wD-u!D`x@i5|-p|;ZFCFzjY<pAoics8J@sDGmtoaX@VBh?c`GZqp zT5Z7CaDBCK0e7pskL@$^#SP;2+SQ#9{UT;dvB4D^BiZz>@7;Ha$Mez}&E-O#BetVf z07TcK5z2R>zXRgkwS7cFuheU??I)|tPU|C<8vqhN3H(j}#bYVl%@`+?MV%rytd(*$ z*b~V7Z|#pc?icpBk$p{CEOFa1-N7jB*gCKb1r=XmWD365zIf(>gmRHT7ll66L8mFA z#CrCtsIBoErl+s-NsG=j7g@{ECKAl^aLFM~$-uWdVp>1a8^>(r5&!L1DqrvZpV1V@ zUd=@y+0{*7RviLyG!pIjfo-}b>ErgY?=Ae})-P#u+%s^;KCY~cX-vP+fmSm_AFTkT z+tP`WbpC>iGVBi=6)`3H<vq(i{+jlgtffSE^$wF10Bm^zZf2*QS{3?@>~nvEU8~sZ z+{fb7h%ObTmchhBYgZKo#P&#S4P_N1-cdKZ&yL+amOj@{a$4S3+?y&huouxHgA3J= zj%Y|c%3_m|QoYIxnGVfY)~|Ne%G>i2eTVuxYvpL}ow#X<zXY33@0r9)4XK<fXw2qO z8y^$7yP(w+5xZ{T$D0=RH(x`h&lD@L9+z(&rfu@)5R;q^r|>=YLljb?Qr#jdv5pX1 z#Z6W6NiVFV6#+Av(8Zx)5gxO*FP^_b>n25h>*N&Hd9o3a=1=i|xb6NK;Qzi014F_; z;^uJky9Zwvw}0(=u0N1~$FJ@)vcqp#01cDrR);IH)~nkmCisRk5*b5GTz<k>?8PS5 z3w1P>)r;#h)^f&WT5%jBl51z^sOv`Oa)~n+_2F-_TfZh*L<-I-F>)t0F5=klAfuHN zD3F`gkBDp_*cqL^`nP6)aM#A#wlk$`=`ZMLa|$jRbzrcVM%Yw%dm*KLh-EGmY#6>r z5AS&w(+LdD7F<mmlQ!9a#^L&$<mdW%JW$(p-Nz?-|6BvMP|^ZJOJdDn)nWkemDR&b zIsrwH-Fh!J_~P@)hYitg%Yt744+yBuFf5-xl5QDW>rKnu+}@TS4hgLc3x<`|?{^ii zSynEvAr^q%zh;)ntj$-q&f&G*;8dCMj8*q@NRk860;NlB6@O>=6aKDfa=y8yZ!<qe za^zHg9-19u@sEW6;2WDLqJ5Lz%x4YHQ(UU<!13IEqzzcmmRtFb0JMPG3&iUBtA8<e zfQjVm0Lx7dARW4K0tWZ{PAgvQe})n|bq2f(a+=x09W%<#d2JIq4AS3fU)9p(oM-}E zW)y|}c2%R0>Il8A4rdi;RnxNJ9k~WS^(zcLuqb&uBTbUS1^i(mUg~8fFLLMOI88+~ zH(#XbIt+dpwnu2kpuPw=u;_ZJn7{yryfoxOHpN>6pKr??@1h1m%i((Liac^ABss3@ z1{CZSHT@x5tInnnpE$u~yYV0~X)r%~FqY`Y@UO9lV!~_{R$;-S)9sIV1Pn<0;=!eK zA6UXWw~<;H+Q#xMhz7oR9PhiYT`P%;+Bckv+Ow2*TIm;X9!%n)w1{*^x}#Ws!rCc< z3=gp{ACfn!&c^Fr^$25V;AJC|TJLWSsuT5QIF04SF)(+!F)HeN;%l@vq?(UMRtWKD z&*#e&c&aW8C<6_G1=jocL!2E1`THAL6*}oaq-}246<w>yK+R-{W}R&btEzAdbsb`U zV5(fDUv^c5XE;QV?1k1fF)T84_N;c1u<#xn%5hLH*04_4d30zBv7ehr19g4es+I~~ z&d=K?_L`e8tW6)#XK?<h<U=17)V-X7K6CTL+>+6P^{UxebTK(WT!joxOEB?Ps$2wT z>P?Gx_^Xmmh3g+s9N%Lk@%13T2X8&1URg)eE5#Ltw`M;^i>$o%T>qlS@H$vfq5krL zl$Mv*W&thKXqd(i9i&2^D-Y@K`M@p5dS;|Y)@fXr6#yP@a}A6Jx}zkc@7)NXkysQH z8f99W!)B_+GmugVeBNMsj9VGDP0@xBvxW`J!??bj)t?tdkgFjFY_lq94>|3qB1b@u zYyTiUyrqBeg$o>Kr*(;biTrTFJM1#t#9~Q*m&~rE6?aa++!TpJbxy@@lx_0*28N3p zw7=M38Y=zU)3}_QFtC6RA4s@y*6ul-+y-LIib3~Ihj-+F_LS!4BW@cxk8ffUbGJSo zHYzri!w$Yr(~t32&{m@LAJLtmE#V=SWG~|M;XNtbGr*d0rVeU1FPGsLr*iDU5HDS+ ze^t0FOHIIRACkIv{g^aPCF_4hV_ImD3l2NYCSPU?s!$eex!9gfqIh*qm4P|@<8|?L zmEz%bTchO$fn2rR=yx}gu^&%lbYFVr9G`A*6d9+0*l{1H4KD{Q#ZxaWlEgp!W^Fxg z+4_<18l|B}(LE2y`;~ync76F(&LgOHyX!kikq^eBJn!lKXt9lmmiNIIkBPR-t!B3! z-h8{ekT`u@$p;D7m3K*?PE>`rTS!cF$KOmMv+U{K$t=<GganL--Lz`}ytMOOsZ;l` z3EJ_qq2rv-T_SYX*ht;BelKcl2MaoaKNa~3G!_QU&GYp{jG^lE8B>_aTKxRT*zxPn z>3!bzrBRAboR03@I~k(SxCTGZNB@Rd{!bgrKW8|T39>JcAiRpdp5>0V5qiGdaG~zg z2H)Pu&j>Ne)NAi%#?8JDZKBI*D2QXZ|A;N?D8{DIwp}F!+Wn{=6B(_8MlCycoR_nd zuQpN9*CP#A5<dr1A>xxY;liJ|Bb4$O3N*P&w)Vi`w{R#8LpBR>(q+N)9+5~0*kpIg zqX`?WF+Lg3I^(<_N)t3<X0jU(J|8h#fE5&I72tg)bo12)DoGF5V{vHC?~o`@8X32p z-JdAc0u2%St&Fc9*Zm{_G>W$=4i}rhIq<K$VTpk8{y0V#NJHFhXS3$b`A*Rvcum;D zAt_L;+;$kI1@c_oxD?G26n{6Rnv^0D@Z?fj+c1tra%%D!u1K@kDZp6B0a6g%w~;_; z?`SmTr~vWK1s#q?4P7h{_}9rWB#k?E+T@YNleUf(uM7)l`+UleHQWWf8}j>TAQ|Yj z9y@?Fx@C64jl#F@b0*P%*YAG(h*Zqe4}b@9cHPJ#lFax1#$!Y4yXz{$?pp-l>KF%F z3G^rdf!H^|N5)D8bQ<q(cpT=ZP-p_yz9dxqiKAL2vYDrp=Gen{c>CjIV&FVd^e3Kx zm@OLs;f(Hs6vD0gKC^LkwLd;IvquWdys}%Fb+u%x>tE}MBu5%nLTEO3D3x%2E%Y}1 zM4ArJ_TEW<5-K1e{`&YWw!o5=gc`)NsR2)fCG4zX<K~?L8hrNZT6zpfhc&^!wp~0f zJXg?iX#3vKUbAa0A!%4Avof)5g}6uAD%QTl#9a3~HfjdXwZpYgl^Nsd=hkV@)f{%G zAE`?wy2EKlrf+eL>}6Np3vv-g=u}Q;5M33lAi2aB`g#}3`Jjo8|4KbHJZf~RaA^mf z{|L6%^<$YeK192$WQ+%DIjGZKu;)OC4#z7BPJJUqy_G>N+qs2EHr~5pUFkPw4%@S= z(K4PZY-riBAWd}^VMc7157fePJ}#FEM28C-PIdM2fD+fgVD(7ug0jgKoj*8*-85r5 z9KmV|9{%>Oh!T`2^*|zxd_GLX(Mbt4%PBD^*FN&Pi7YZ;O&v~q9n*Gq%E3_qMBnRH zYWmMrBUHXf49ong<h_>#Vm|v*u_>mu%vc}tt8!URDIOZFluj-YfVg*iJtmoh^1zqw zVd`GudF&QLYziQ}Qn!+qbCONQkfB$$;In=V^t*=WTaJbAX*YxbB=x3D3H(_8D635E zIG$7|H8#A{%MynEp8HJ>cT2innSNS3(y}GN53<gT$h^jXwiuDjte)oUG{+Q@muC5* zK5pX_mkbTQvltxnPC`YJXt}gphU$AWkUR<W4S%o50${Fxk1S1uv*91RC+-1Py=-Zl zF7e6yf$(hR1kt3oVp;Lv8&8Yrnj9Oi-CwcT4hIyml2_Q$J+8M;xg2LRXP|z#-S}yc z2ny>wnD?x2SqmZp08}psegw2tK(j1*$zfdTesjYH6dYor#E4mh(|zn2+xiL^E0%u3 z54Oy>8^1~!^36_Tj-`F8IBm){_n&LDz<g<Ron1&RL(fN+Q^_d$gkzDwe=!-e)~Zp$ zwGz(o&^Fo-b9OThns)PWI0+PM-D!3i)=GlEKA2^1wK-r(<k3OdooyBH`}JEO49_2P zlgrs>Y@s;-dfIJNYG=47aOE^Fpcz4Qr30*TNz*nB8<ntkXEq#iy%3i|C{rP=L%6N7 z;iV=<&}K>tj(?dU$D~FJdKED!45;^hw}X#g(HBN)S@BgJ^&D9xPtG(DE`yuDA(JM$ zl#KL}(er0=c_l16$Bht0L|njoX<&~O>-qIi!+lA#KK{vZv%|)&9jb((e7z#K>@T^< zEzKblAzf_YS%YFK(L9OCLPIrXkBVu}9M@KG^bQ>agVd+Q>7B#q>FcEKM^_9{Q`Md> z9&vldRBm91y)!K*%J;jbSH3kjdZ+fWt3xvE(+`MS%8;0z3CpxJkLwTa=gPwdK9y$8 zoDMG+zo|iP*4&0)&(~b3T<-59T4h;ia#zMRw(^C}zLf|cldx+w;z)?xp41Qq1#56C ze8QnL_qo1*i(ucK%V#lb-+kq+C}BNaV{7&>)T-KZLh^!Bzhgd5kudaV!nZ1BJP-Tn zd-8vPGLtstZ!Z5kWbD7}3V&cUx>ZJVMvV3$#)n9=M>{UZLwO_VfrQ$Shx5t~Oj)Zi zXO4~R=`)Yk#1y;@df;jRJA%F7q!4s1`L%{zeWB4Vl#B2(XVliP-;u57NQiir`}hwz zDZ<@T25nre>|AMJYvB4($G+iUu|E93%CXUn;uNkPqtd2Bv#;3@HZvo`LOH4wCd~Bt z^pqeoWQ4JNOQgp`g#KJv2)L0P<)E+NVM}Z;J?M}*_&@}qt335uxhdaoy9=%~awAE_ zKu;1oC)3A?qKmhIQqOg4qyaS8yUhM_t>lg#idT01c~dVy-HYZ9vHq(}r|AMNC_1m? zjqyH74YhjgC3}qdM1@Lo|FB{AX705={4ukm>!lmxZ(;SqQPTX<npE0g?d>R_@idDw z2~l0Ddnb^@FS{z}^If&z-<TuU(>FQ2pRUc8L&t&voT?tO{>*})d*BaEGAV}7qTx@A zO+!%^9stkV+1K-E*V}L#p3VV0gCk=5(PLRu5}rYTAge%ip|<a*^hP!peg!tYCj({6 zBsQ)1%q|qj7E`AZ0;dYUQ6R=zDZ@>$3AjHHcp4}5_NI2W_T84VQgN5h679}OGIG8| zPNg0z3F8||iHB~h#G@V2h;D4lPT)$~S@aLyK57?jcM~;kWhZ>iK0ZLWJc9OIPFM+Y zsfi#XY^y5r-iVk?4)=}(0T}v??;?r{tquUrALC>oyP=RK_mEbh`2d!l9O+O@28vvh z+Y{l7{ZW=LnZ`Lp?8PQ^479(`OHYSHKXlL7c|_)zAgXn@LX9HcKIo@6OiC&I&vR2z zT5NeoxjK*p)aJ_C0nkB+hh-VTMD~oee<pV>SdaJf`FzlQ({AOHdvny8#+NJ?m=^A1 zA#A>d#_koXmQe1*+r^hK=bt<G@}hV-uB=zVCV*^^Qf}GTZLY)z&jh;k@at*dMoLz| z3A~*!e5UEp`Mpv+6M7PxPCPuBLv0|9bzkLN#vp|CZj<r=VR&SyqkIdTo|dPTTjV^h znr6yzyw5y#e=LRhh^^Xy)*C9dtd`CuUn<-$%$_0ezEgvII{Y61h#DJ1%X>dH-2L~l zR)sj7*48s|)m&fln=e^U2oZ)W8X>>T!#W={BZP)uu1-6BPlf!h!aK_7`qbt^%|N6x zE3o9KRA$_+-aIpZ&%p%=3%%s6nOS#!a@iu{zraKx;294m>2!gaJVOXr4L@#$NMdN` zP;n!AdS55<9|WJP;!|CpCdhH))Gy#Y4C%Ihf^yp*Wr<;butj{(ds%nBxAAH4nmf!d znI<mrPIUHWgH+idNA_9MWmgOcp$HtD(fWb3a-hqPqAm|u5+rRk87+%9^_Q81`_~IA zJ}ebkM{y!sD`(l#p&v$hSE<RC6W-Hxg<>u%{3Mm*mbK_0u+BW3|27EPL~5QZDGt~~ zN{Ap~D_ir-sq`Q2`0E`*tiD_X38xb^KjrRq-jJlsdAn3F>C2}T6(7tFW|Y*@Yc*$q zLpC^Nrsk{-iJi-1SGU$@Z%hC6!P0Iwbk4tAv0=U*a%lb5^Kc@#-73Igc2%T*XwkUT zy-?PoHD<j}<J<c?@>cNR2Y8}TuEYATw3>6r$*n@CW`XSsk_vXyMN*2fRT%}{1#C|J zEf)m_H6nSwDlxNtt5^2Hk|qk0Q&XoR3MNMtJ6Zo1F5zF3xhk?Fkl-|qo$gqPKuI?Y zb>(=!ot@yT6p53a7}vNcKc-Iaej0yTT0NI2I;vE-hYt-Kf+dTh_u$xvIUkM6PKK)0 zf!p%rST1u?YQ<>no1<rxS*<OrbuPJ2S+v6|@T>vGv|b$nhG<WL<Q*l$lBD)L!o}Px z1GhbP>>+J1d2*j@tW)3o?38LtD6jNk(uephjtTT`ZT($2BY3vB7%g}}CM@$RVLex2 zwL6^f?D=Ki#K2=;OrL7l%KKhA-YqL`OgGO@SmYDm0s#jz4A8ESY|g29pp!oVswVpl zrlSV`UQw9bkt=1RvBMW`I5~lk((m7Z-JT?t&*oQlrbrGXx)#e>VZVE^0|{EgGI*q0 zE|KHf6R}ZvdA0;<eK3EzJ=}gL9l&ddl0KKPl&(9O3;D})oM!5VQ69Ul38&%*W!sEn zK0di%Y`9R7Hfttcs7_VN`UBD}tLaylu34QEu9kuCUduH4_;@&PyGmI@kwe{07%^06 z@q=EC?$;S4I&4OL55XRaz2RzAWL6>0MY?SVOn(LJnfGPP5FdD^K+0)%i))7^2V^AH zD+yJ;Rh(m7131sP1Gg3zn=g5lN{B3$uxQR{Of4<Hna<U@<SGuce9p=fYi<oE^qe;i zxRVm853n}Ssgz|aqT@+OTRvD$KeXy>8K=S%3DMwVyRDl}XVW8HI==_}Zo9Mo>*#5$ zzAT$*cvnHp80!rAYti?wQ^{Z~Ug}L(kB4>T^U;(NqjPn8cH^H0Nu);LSoCY({sAfI zF1>B8gd^xDO7$|?4T^ri@M5Y`j?kwH7m^b&ej64A)GNZourB<)f>~}>>NA!eCBr(i z7jT^`nwR=!qWY#hyn-=@3hhRVg&?`ZN`MQ56v!8eX>0cm_Xq6dH?*|6s88NM1nf_G zjeN}ZZ8y;rrpIWoUmOy~vYc_fr1{lN6Z`Qu_Y=dIACP4ilY(>~?3m7^;0xBfi&Z<= zNHF5gEfVtweop1M8!2K<4?&c$0Ogxq1Sr-&FjqE_8_c+~V*UfqRlil$`!n0~A4v8y zksBiC1E;Jp=@0Ps@n+QJ1P{CWEy`^*@u(i9-p`cTVUL)b0sW}!-Z;1TIj-eY&q`&O z+ZU<=rz@{?9(;%2EKRr1RDKz&o;Eq*-LGGWN=ukr<rhJ?X1~tz-<(iWxuT>!{O(xP zcgB+_-CGMWm0QYuj!~d;#XY%xgzfxx^-k{m{wkYhlR^}K4jblmdh;yuWlPKD!E^$< zKKs!dBGgZ{ekF`fUe}<Ir-48k&2u&7<}2r#x$VhZ+?R&c3(AZPH0^SRD?7HSApw!@ zImdvUJ73f@61y`#UwNckDfgwG^(Be_=hja$($rac_J76MRJ2J`3)f#%cds@}Ja|Vt zp9rpKiOl*9=sp}SLW<t!8UVB4s<c)E4xuA11g*X;tkbai?Ki!Wl;TtGcPBULwbp0) z9MS!O!6K8{jbTtA{0t6@^g3AjHpQ3a-;{iFmTe*EzCsamz$vcz@)>QSb|S8#x0j?# zr;EtraUjMsOd^9}`G&@?%T3)VT7vvrk>dP>0{>sYaWw0laE$g9Yt*1H-97`d;hQnx zaD(Yc>U1!EbPo+ZvNfG{!$jl=&9n#WItR9x>|AV<*j(X<CTzHQLd%4`h6*e(4*SBg zVyg=!NHi>@DH_zi&3vAC+A{w$B08k0EP}BsWjmCq9ICA@yp@Pb*$iq>5Fev!+s%Z6 zxS)dFN-W^2xTf>kMW9byng%ZUHK8#ihY(_BKchmkJ2pPT(v%q^+Rbb>oN(G7jE(&M zo|)hE83~sdhLz?jahmXI+2n)`UKr6+psR=Nty=59S7jgMN}~Tb&W^0L4<Sdm^&e{? zp|!k@_yXOgx}z13B8k9)TvCtw?bla7$dxhWiE;g9tgHD~NSVhxEcU%7t!RW=mN2Fk zGo8=H7Iry<^xu?bB9uG?&-?rBL(t>kE~S98P4!3x=#6@oIMmaRSgxt}8!&9juJHmP zF1dlhH*7KCf8(6A5PmOA`z^}L)CjeH^|9=A<MaO9n2`t#{n3JwDWm6^!VLwbv(?CI zu_VBrsTRnJ%+*)6Y$qk;CMLJlCNc~vmM;v>D*YsQ`e7YK_dKl=p1XH$uQhGb5Y9$} zrKMa^qPr6xks8#7O(Cc{96>Ui!A#gO&MSKbryd-Uiu-4aMKI!YLiT@j+)wBoZ}|`p zV^OU=d+H5HT-Y`aWYB<aRn>F>AD3;f#yqK#Ap5^nCL-Y9-ol<QZdM(*s#xj>m?KXt zo;KS(r+r1gR-chb+F5v*rgyq;A$aIDL5>9j(=H^-PzU0L%6zB2Grelu*Ag6?Uc}}^ zoNeVBqzmMmAtX^nE4a+sax{?S?s~o;5#Z#wHg47#upp@-pCPtLNZsYaI@@q2y|WL` zcFplh2@6zVhYeTKHo)}J&fSx`lYG2aZxTh_<is7Y`U0N7VxWmESeh``GOJ8YcJ?9H z=Cj&hnn*NkC`*IdooBUv+Tm|d6{S+(1PFl{DNZUuM}3CO=p0rCzV84pO#bYJdRMNy z1#e}x_&ZlT2`iuj{7fdX7$m=rHt?_R5SY4U$_IAKWh44uWi4i$=i36qo39v)+uGIA zg>`y1)L4+s+WmtgBy{wxcfhO>MC>~rvD(pJChd>$hQBPZ(F!-L%gjnzA2boSY-+fq zHMlH?PL<tf;G&$~nFTC_Xz6}aRZ6OWy!MhI>ZNy_Z=ZWxH~HO7!)Rc+M()r``t);V zIy3o%+Zg-X$WoJws+%SM{q6VQ06-Y>${x$_0YR!N-)0=WS7%e^E$+T~bT_+wUc{$+ zKf9%e?fky#wMLZ`Q8K@kRhy#mA6|*&U%b*zaa!B|6R!mQ7|n_m(;0A#N!fJLDX|qY z5vkeVKp<T(&)_^AUN*7C@jIv3ziN7%K*2Cvg;h92yMgyKP98QBK|R-P<I@ZpQ}<zw z^lhH;h)))Fhx`r)Nso36nHjdy=!K_rCda}(>bCKesj!y-Js)AbEmveM%$AD<p}z5T z{6Gs=)`b><SCvq^eXbePg>%t!9)E+UOkRX)EmuJ3m#@C<PTB2|2`Z>)oT1F&)-+%^ zGadW$ES->n9xWMQ_|L9ryNM__6Id!-zntW4<wN@ihjl@&^!<;cA<%sKkeW^BTNH+> z_rTt0E^bF|tZAjv#nwC+I3+~1rotWPY77jNQywfP-3w_#wUinTGg+;^VHLN%lK>UK zMET=_LNPSQZMan80YALlk@#X#3U{}JY27EKiY#DviXszABw$f0-4{1&2u$`R+PL33 z>7&i}bZNJrT#W%r)@*SuXM!s%?)JKu0~F3w9rXx06wgQoS<Tu+_sP96Uz!|eJD~sW z>#caDNfQdb+}@i3KR)rB8MjgX(gO?gTDX+O>grXa(28StW`CO^Vs}}J_-vh-C`~lA zr2@D*icle)>O(ZqE6fy2IUa#f9dF@Kh1EF5-d)2deLeG+%lm`7Wdb57x;V&tfF@6y z;u4G+bXuMXxl3*aoWMjr5B@aJ&o#@^4Sa;WTG#5o_)a!=WWxsIUt@Y4j)CZx>)g2f zaUQ7FnQv&DXZHcD?<x5mt4lR4pM!6dwKPvy(LZxfhT+-vPp(|ZQnF9u7qQQN)uIu# zz<gtl2PhJ$u9|B(EL6QCGR3g!P3UA-H4jk*Lf-hPk_|J)ysgs}@V^N!2O&C?p&|sv zf6kM-tdfE5;t%^hE|h~=4Xkq`7am%IVV!ZQ)1$%%GWfr?vW!heYVkt1hD{ZX>wU?~ z1S(#;<S1qwquq`|wf2haK9%C}%1F~=*bYAkzBFvo^vM`XDF_>nWz3mxauTEc5En1` z^frF_U0}rghrlTbyZ&a~n#~&DnO`4vM_V-{dmMNWo^%PWt7-Mp-yJ?%i<>>NiDewp z?@nD%8@2sfFPiy#`<wP@U92~y3{qHq9-S_7Ii50xU8PsCr#{HniW?V&`fsQTXaD%V z#kyp=2(hPDwp(maAyY7$&}`b|z9$J7C3GF|A~^I4odv4Kqz|E%fAboqwj8+lqK`c_ zClB{#I>9#;g}x$MjrQZo=SiEZjmB3)6Wbd%@XKklfZWb!Dus;|4d%UDB{<DX>c19i zAhff%jBfy91-xISpf{>1hLKAk6!qkU+?Q;&GW&?JI1lgf8xKHbD}4f@^gXnbijxw( ze%p`RYL(~@B4QKqeGAnYz|CF8ublT~|A1sow};K>AgD;&Vv=-6&+gqp7@*qXJ{w<x z<uUS@<v9~lAg@tAt*!^4lxxoo)qsC7rT+t!`fm><JEeaBF)}PM$7cS4$CyuF%J#QQ zugMj*n{(NR1B$NJ78naZEAHqSKzDm4LKR_&ReN8dGkev0V)~;8Bgr!i-73>cLRC_8 zG*`A<7l>lu(8vQ7+;sP1Tm&VLk&JQ>Kp;@rm>e)H@ggOL_u=$H*j)rdWzUj1aWs1p zo!F<|pa4rGZVjQ^v{bcZyila@BuLS8w~Q3t_puDdLx7DO@fmO}E09E1qZKTkMgQ_i z;{Ko58@|k6DpNDD{bfgM7+Qj6Z7mZmaypp5B3rU)Ky@Kl$ivMSpi-GWjSQyP*L1@4 zC_BJ<HSV?S2W1V^6!o?XAnuz_R2sKmZo7A2WaEGK7&DL<D}x#{a{WF*m&&EdOD_-5 zf|Y}E*#T6Ve3A{}J@A31i*$dL^%;cx-N5g^aM{Sygtgv?BBXFN>W{G?>%AI^V5Q4_ z4b4wcJ1<RytEU$n_g|9+eE^~cwDR6<8lBh}T_$I+6zDC{YQ5>_<8DLDtL@HYr|WT2 z;X4N1-(MMvmpomq^U9(D7y{gpP6X}PH#OtLGH-HO%b8ew_sw616~aJak}|bOgN|^s zLce8Cgl1QY8AI&o^3LQizD5PynI$8vvmYLJ#s<#C#)(+x$`v)kr4r0r^M?G6bDYT5 zF}}IV3iunr8q5Ew5BeH+>rI3ET`Z=m?8ij=zq0@kh|R%es~7CQ-4;arZqIEiw0R^X z0QOjBc)F;p+%0SAzO}^$@lF%%3*>5_(R<UAF^$(Yr@Uo{mUm^5-hH+6%DEW5Q8n#D zejz6$Ow@N9&4oLr>FR)ZA>3yw?P&3Z@6k|t^T&GU*~7_vcv6}-XkO+MS|V!{M&3e^ zj;);_gf6=F`rY3X((T1G)NbvXmEdV_&{qEn{rwKC`)UL=p<r~W6}6PU=_Ly>vJ4q^ z-#zESZnlJ|hX_P8^}|0S(gL34#R-#oMyh-ig+o!j^L_m0prKuU7xf>x5=sh6^sd&) z+A!-;o{mH+zSH)aDJA(T9fpDfNMWxrm?3po0@wfy4fm*od=q;=r)^Irbl;hfcMp?_ z+J4hWA4GN8zl1lig#3!t4C^c!%d<H>7k>RKCsf4{^<t)v`tUrb$BostoXWxP@W^d$ zsr(<g(cVN+4{FKzHwou^sU(icu+7o=q73f@xh0hg(5lDUG{^?90%!YR+ORI3)$NT| zS+VFY{C(IJWDTjfZK@RnJUl=hro01zi8%KLzdxPQvIKOL`NbAY%Rr6`D1?q%5~jJ{ z?8AJ%g{?pN3s>~`FQ<i;sp9eu6*arZw!+t$Z(sS<@p$ZSBVef1KnMz!h|(>N(+=Q~ z*D?$^$yVWN8yRWpb9LeTZHuk=Etc(0%;xuPuHJ$=(Gnc0SnGgzPMdLoYcY5}+K0(% z4JU%@vyjQ)?_TTXKWVXWs)Y>m?`c*Hrq^r#ByllfKEdkY(_*5MT?L+z_EO7ty(Edd zW5&ti3kK75Jk+KrYJnhl;!Ebi&`{Pp@K1vxfW^?wEJ%HYGu#1mJ6ptbdW||>c5@1o zMNtSPKiBvopS@z~@!;8wttFU>2)D6(*EZ8<Glmj)9rUrZ4ESc7NtMX*Fz~sE`<3Fh zHFOf_qY%8S3-FQ%x854;9YACfVqgL!XjdP*_`@Cr?f@*h1$Oe#`hxRZ%o?7kTWKye znFMq>B=9>gkdZcR)Zm_!wTq)#@;;TOv+9ldL$h{zg?2%4AxRxqAyh&iSQmledk0GE ze+(Bu50>OcV^aGv@kIlea=%8Ba-rym>N^f*#1N-;O@*~@8O%^1aCLz?34Y}yc47<a zI<KRp#~)$Al$L_W9dp9A>ccQ1(Z_O7D}@P*WhMWWG}d2fj{l+IBt!0u_=p4?I2eyz z*cMjbXc!J<Z-_Hz=Ep}=U?AF(R>dFv3BGK(P<5X|BygB>q+mDAZauiI``}X1ijQA< zfY3OkUnUbx?z|QRa_mtDAg(n}h}g@GoKW!kC@(e9SSm=Jg1}7-SGa(;=_NcEFA^`P zkrV6_E;6gwe5tuBA0{ehwx&%xW(gJFe*YWYo)lcb3-)0vfr5p)^TpBS3Q|V*LNd>h z9w!B4El}tkb_+v%{yi4{>uH3MJ$)0=`>Ed`__%@C0C@jZc^=IsjV)jP=3u-(x!lyj z3#C8aB*D-k^Ed|=l*kP|3wP`2#NELo92v{kP{5{`(1F=mprWG!NgUOWxerJ;Z$SQ9 zT#6`kUyp~3m|l*CcNWd08&xbVvJE&L{b=V?Ixng49L@ikvU4cwH6CnFtNT{h-1B2A zo!S>cy-7wGZT=WQhVm-iyn}aw<Y)udc(h86)d@mJhpSt%y*G*{-H(4rJ=mJ)PJdK8 z*m|eEGsc{@eS=G=2nF9GQU5lHbzfa2m35(~0@^!U6lnaIDA1|uf_)eA-zjXYB7TRv z*zKb7?XX;`vjs&D0h;#gT!qhIe0@LsP%WH1omh>4`wasML336hsY#|d_Yd;%3`4w( zpI0MYI1)e;Z8qqiR&)dAhwSxzkLy>2LYcDtZy(B&K;@8_p$Nh9gpv#20zrPgE83Ct z_{EecPSX}uD|wCMT@KeWqcV(4A-}oEury#l{lQkhW!NQu;Ui9zf7B+{N4c*sN*i!j z#5paas_dOE78opu3fM_h64{5W+j47c+w>5p$=ipr6Dh4K>j?7F2D_pzHurhh{0aIh z>F^#pq4)|!BqG+V;sH~)*d5)YFeH=gs6Hb~h^&(p-q^alxV8g4(vXe?0g}&N3Fdnh zm)cA3vSd*)cR)wV=g3OC?>gmKi6l-7Z4=OZJ)ZBT;ZYd6^nC4o8f(<U_tryaS2mq` zrpXN%ofYdg1C66DP9VoZMGe8XRo;9|=-?gJS=e`Qt;w&8A7y#-2Ufdb0kR9to~yx> z&5k7OJer3v>xxVeyzU2m?<Q_DA5;mt9_@W2W624CHy7i*!<J1Qzjwg39f)u6SnQg6 z)BSKP5M)25S(bThBItXqC|TG1l2miU5&6R$aFXu~6jYCwn?ed@Zp%UG>8?kuzhLSO zCl)9y*XE3IN(p`1;qg609kg$|%)DFC0=IsKC-kz$OnSy={SD}C4@34_YuF)23k_Zp z9^TFA(@m5J`?0)iVXlcBY7tK#e8ELLW34PsfDGR`P!Oj1b-l0#Fa~Da*VMw*3XAhu zrEla4)M5I|4M1ntFm!by5BLf$Ub|4l7tfG9ByN4cAcl_u%2Y#k-^aN+2=2Z6x@~^C zgbV(`@)14RI%I0M?&nKwE}R9UlYs(wx%^<U`{Vsp$@Rs%=_2KgFH;t1o;lo6ZJS5M zP+VFaKi}=u+G46Dca0TAsId41e&GwV6MC_mZALg1)1w!{wNj0ef7B{Q;@i~Yu`VZo zGgNvjrU;+-Sp&LyR)g|_LQM<YCyJ+?Cuv&sj`kEH{vo<WfT+`?FpuH+(aP}i3uE}f z!c^JZs635G_e;)6SeZ0n_yVNnvA7%@H>#`iFY)}U{Bx%>OzIt<(VlMlRqAk`5fb-p z`c|P>GN1%{hX4nD=rwsvlXDXoibp2yE7%I8s25)VIuR{EJNWbv9S!SG?&m(xa-;#o z?bMCE=g|fdI==`{p0)pV=ZUlCYLdVp7cl~y-Gxn|%gdpx1k*Qc_u(%0N&e|0)K8-+ zUgrQwqo)){q`M;>Zec|eAxQpEoC_)=K_JX;uF@j-ZQ2MO-m9m7bp8PfdnNFfrcH_B z_Y-HWueKu?-u(E5KntP_EWQ_OXBaUFDg#=nH+Llo?>3i#@C;-T^#&wNRPk$00n3oB z2I^9DiQ9d?hQ;?UY!9C)yonn7PhnFa8vTkSQST>lJkyiT&jz!qL3s8pOlA#nqE!v^ zieDm)H}bJg>9n&#Ms_YbXc+uP*1@pt9-Q>ld~7k?_hB%A?_FiyV3MU-!z;LqW!X6Q z9R;on&~7sLz(-qtSH}O<D5k>C38JP<5YM^ytcQ^n2d!{b4<~196fC(KoIdvXH$c5y zH077VVtDOP8M0@TD6-3I`VKt%Q+VT9-hzPN(!!*{Wi>s27CU98%@x*}@NTL!+jEFU zblXo_Vyowgl!2AZ-O$O*_DB1!|9oOkf`0@c2VS?gMRLemsHURQD9QlU%Za?!@NKt; zkYLsf5f@H}+0)m3{FPNGl+ilhl(SEPiCkXp``PcDZ-W%Zd1m%h=_j<{ZTjbI5~aFk z&WlojwkgFi2zB8G8&oSw@rJxU4A4sM4AVvKrl<D!0<ENpB3?L`ZE0_c?&4fRM3K4_ zy@{sK2ixy&DE)>(c|Zb=^g#Tgf?<u#x8GMR27V@O?$62$*H7#Ui0+aB@1n!>1GX~Q zMO%FIULlA@vR_9C_Lf1$;b{^0ci8)6sC|;pEjA2@Z}2yb;~eE|(FIhpNgA;lN`^IW z^=YD@I6ljf?mIE8SS`)&2a-E{dAWqD*VL~+WC#b64R*{EiPGn9U~kaz(Mot`h+&## zLmrPn;Op#K_?a66r$pR9%*@9_CcP59oZZ*OMWsJeDp)%SHre=_hheXWOTxSbKe5<* ztCHjtrNqU^_C}GT!O}m{?n+!O`go{SDhVTP1y+jt&AqrRZ0swR3hPwP=4*W!S*WP- zye`o3+0J|g>GDxgE^jDz#pL@q^q<GwRL<xVx!iNn2R@(Pjg%>{ynbu4x8A4D&Vax9 z8VCO`avVz*j0T?)VzHj?{39-t-$DWEK0-e_P-nBeO$J}bvVOv%DL*9ElL~Wjo_7-w zr@!-uT#CSdT+Py7qF~3&&d$`3wG;%epfWtb#2~HmoAnvG1TVB^4(<<0G#WNOY{HAg zjo)S{UDN&bi?&~UkdbdJ>r@J7Ysge`;^Lm}tww|FDw9(D$SotZP<+J+6LOg@A>iyy zBp<K<@)BrVfE=|>0N_%cJYrA7TU1Dz6v4-=vKf__*~;i&<)6U7b034-g9cSt)$D~< zXDffr3UGce_4u|dcuS>MmHc`owaYyX_f1F5vn9+EU!Z@I^I$F5$dZ7bubVi>l}+4n z!{;)H<Ef=T5Uj0tS~ENqX%tG>r(qLg+}G+3Ov;lP$EAT8Vz*^C89=gVJFz_AO4h$| zZSO$ZgD0u5%3<J!<ANAhSGQi!hK(MUeHKr5Gaj-H#UTe8#Ph-l6-tl<D{<z(yOCxJ zon;DdvkFKU^PRN5IqFH-p`(>#if8Q85rsbI=zJ}j6{Lv8*1Ocf_g1k2=Zifcga?J# z{f*3yWI?@6g`IAg;BdD`0}$=e%mXomL|o;nKym0wMt?);90obe=J);DO={*Si_h#F zUZzd6nwe?~zK#2g$|v6NkJ!hbPQI5Zl7y3<>S2xPShgB)t6lhd!jC4ZM9PfF<xYVx zS6*zYh2cou;*>70d}mWI4-YFmy$UFv>{(uR)ih8NPweCL<`;W3@eA@2jnnL7xj-gJ zemN{VSH(!BRy9EU&Ke;`M+F2aFI0!Lve`nI-qrF?mp()(^Nmu%s_B5e><=RaaQkov z722+Sp>fuLKwo_jqI$Bl3wvR0tmtfhBF~<&WGIyZ=>|97$BooG?U{&#m0O#)#{?7L zc0>M`+wHsg`>*Lek)#FBFmqsobYnC^1T)z(V&L<YN8(!D+-o4!pvZ1CXSZQ=hDIOo zUfTh2*!neeTywaYiN78Jpn*&knX)099-~=~(?9u4fs;3Hpx<O1@CBW?VEX87)YuGG zKR`*+rq<NU0MZ2UE)eM}Kx33r%mJQ#+Kg7N)99rRk~^{XL-U3;)A3ch&faDz)X`Pf z6)Pag@h@l9{{r8HouLT=Y_S#@L$^8ot}+GCKP|aC4p`(4z7mQ_7pZVnY^h|Zwa!UW z0OXEO*hFyS?;ZMcyhWPywH_27u*uk^CR`F%iaaa?mbhi=PM~ZUvW+T@cFH^qo4V+) zDabw}D4I|yVrE({()p4`ObpTbN~KsnW<R>;8IPLTZNb8y104d9p1O;Kcj>ROBE`Lu zZpN`6ND&<k2f=sf*T6<xjPGNE>Eq>D--~HXD`hslbQc~?U3^a-(;4*y^IJ6je_37t zg->8V<40zDN5$V$Uhl(Mv6!l!+<)JCSLIdKvcJ(MLqr_1y5rsv)T0U$$=0Rw^*lVS ze>=Vs*!9xV?!#q^khk3g$~s%Zw=)UUE8}{)BJnE|?8vBysH{{IA*(sZjnNwO>^nFK z$X21{X!a|iGNkZ@7~xffxK4;Bt~&eUr&iXEGc{oJB@!a!-<x*&3dA%<6fz$_H_B?Y z5r4S0LOzY*q{E<=@DHkYT<Tp)$iYzwN~tDMy$P{3Wmf$m3U5^V!X5evi`v{r0MztW zC~Kt&R52ET>4OrX2$+kpxCXoXe0|O|9iE5IJe$5v(9q|3@069&U{Qq>SZ6<;!iGsm z;V#sb_i1O`wrFs)2^52rMY`82iGU5Q%XOl_W<pv*DgqCC;Ivv~7nY1})6Ud8hmb=X z4ZV_76Vkd_Dz_$^L0g|-AD+msFa4ejyp@1JK+QIp!_j8PL0Fc!Xv{^ke5H7W0gX3E z34zN=#kw=F)*<oB>)cvjgtF1ujxES1kV%rkVWg5q4Dr@et}~gJPB}0ZCFdbuB}GmR zBx|9vN3}DXTOmhuc;(Ec+%>(NwQ_T{Co+;1UeW>xZ|vy!x5(!pC{Uz{ijqx&v4)vj z!Imc#xBG4sypDhAzP)NOYLg~s*J?>+$m2jdz-9tdp}8I|_^44Dy-K`Xh|)l74@SYV z8lFn>meHcwGejde|3&VWCh99V_Z8shBLK2LHzWNYCDMQx-TFCcXY=(aW8VuxfvaFj z>C#C$1zy{MJRB>$#m1_HZSI5~M&>Gy#l^L!mh>%dRxjy;x_J1V=ahe@_)Dwb(~4W7 zC3wYicT{9v_y{{*OLodfd%Ad3E2<-*Ugi_|YGQ=x3o6QV54I#%XNPq7{*fQ~CDh^I zps^X(6G8A<&Be_A6pMTrWLiZ+%~8yH=w*ESsS!y3nz&}(of>qz4r%viJgPG=Ryd17 z6KmO?D$+?88xSv;s;UNw3}>+=u}^(el11KQr|OIsaB)`tiLBp0kg%*-M&WT^zg3^H ztn8Flq@ABfqdHUZriyB{k_-@NNZh+)W3PXAj}}YZjTdrzP65wa6%<rVLGo2pEl^+F zp@M8q^!!1DgzPC%`D&e}KkZIdSm8e~9bph|OKcqhLyATXnoqx*ienNOf2qjl+ZBEM ziFq$62Fz>s=2`F}-h=<=t<u8-efav<+-H~)Iq$8WzsXXGF94#4kN<k@pHH8}dJ-kP z!sbz|JLNX7P9*=G1wj}6<PL%2veE=V9*M3i9aZz~FBM_xL=OiI>AJ<T&nP4;n20&G z6;-!Os6~oQ=ZAb<$FWtQih{jcdKOsd-Uy&Fv25CFr{s>hN~M72ZlN5I|6&G`o*RJt z)q38qbacwq=ux?N?7gbRVgKPZIA|=<a9SyU9n~Hjwt^6_*}sJoHjSOQV40m}KNXZT z|5-nbj_M`(sa+rf_av=oExW~OxoY(0P{jJwT^#M#S+i<$!*b5%V0vNkYUXhogLTW7 z_rWRvhp{coea2V66-lc2+yXBQ6|H}64li`QqbGvVv;{EK+5r`hca%=Tley@G&qsa) z@;sKKeHaB?Z9$x*;TFLe-pA$>Qt^NRbyJ3_-OI69GVp0KsV>zu+L)$Ef-9a&a0k=G z2{gAo`?4c3Mhy85{{Y}$c&D>%2EUx|*9;fK-wSrN&t+G|+4DG0fPn=}2Z#>Wv%TD( zUBAePp%h~hFXi%wjP}|h0JRZu29TNd`!R+yhGRrNkM;p(hHuXusBZ+s#KOP4=2)$) z1BC9+N3@z~^#zZ4WG$|))8qe(KDAp6nF<I5P$Hvj3O(k?-sVOd4ZLOt10vAVeR@aW z22m)x$-}9N!{Y~=aB+Y`@Ip?<#@p6rDx+>>&%qg|UkNGM7&kIc_v=}6_cGv$t)9lF zN5l%u9bvB`G}pEhTWQ2zz7OzJ=O4+&>aX^!+B4_y*nXcFTn0+%##e@c<k!YN0akXU zw!DiEVDj!B5?QnGNRTwdXFGd*pd&{nHPws|0QcoP_Sz)p!v4ErOcF?^J$=P5`?y57 zbh$>M^@i3IAluMsSgU3?fbylcE;R-h`?2dY3t50}Z=d+ZYt!$(X{~S&`u8Doj=!?A zw?s_KEF-<$&U>-b%W7$)0;I;kAI%z^7qw}uD|k2`T6#MvjREgO8k6^Dz}-yR+9XJ< z(L>p?+Jg{(?)}(#e;3z^Y&Gse2YGfJ^W2*}G(+N1EO3Uf(3}tmceN)Ue}$2yLdwNH z+#Z;W+xz*^U@+wP6+HMnE8wBS?dHqr9YsGGl0E8Drm&|&!Ob#23N-;Cv~)dGP9p}6 zA5fI2r`Lh#Yj|@;?n!_wdHNYvNZa|{{%uN@pY5<OWhE)$!cnT#Ks-yXS-^wdAXn@t zBeU~7U;vfA_5;GZ<<y^|KVeeBtKu|k`h6y}T5lqF{K2ig83>#BuGvctzsGZI{-B8j z?|{(uv%J?^F!2(wk`loczy1og@N++5I1KJDBhHVhdM$3xHN#ESxPnN0ZLHtqe}F<8 zg-=y3Z4<^JyJ~*IciBPz*Ki!L3|VMQknf<j;SOgAA9(af={U_$eG$7|XUF_4Tk5f% zV;;=h7Q6~-ytqA5Rc|cBp$d=QQZ?yjY`b6+H))3=L{Qp-^H;la9<I+cn!2;BuG?-z zAji>(D-F+LKk>x8f4sjt8~&^|8{Qd;L1f^0Ja@Nk6?6K8U19P{u&=WrsY*!P`(`kn znJ<4`W?%>=RMOIZyJswTdYs<9t|3Z;N3v=+tVZqilvLneHf<(@%lXz0PL6zt43J{I zUK)%jfs**!ORXYx4wK4hW<WHC56WkIY~#dMR3Kt}#sN^_VzlUo33Cs^!$K7u<1MW$ z1c`9goE$9)K0oxLlz)pprdx@zBVATXSe0VEtGhD@?_5>jy?fnzB^0wP1$@Bo&N?UT z@X&~#_@+?uScVjDcHv6=?%EELSXnTmz4J@H<*+^dx4`-D{kKu-2ddVaupcv}jCm#@ zIi%EMczG8ornVKR_NLIr3G3;|GE*)my4v~UAx0Ib|Bn5PbY2w8#*V~39jg^7;Ni*V zT-0|5rxQ#coS*im_|IJcn|xBO0W0;D_8h?&x>#-68%ZTUJEFJxAvxne!_-fEX!zry zjoTNRrx%(rxm2=q3TT1R&Mb%=Qjri(k-P&0Sg1e{tqrdTH(SR9Ktdh6aePJ?i85yv zx|)<evHoHeT+$e!<oOrJ|F5wQ4Nz+*_kJ=*(2|G$lwIwQx*nP^3T-t9eRr4hxxWWO zOLbW)JL<s~#k!TQPfB#G6f~H;1$Zs-&`6$m#}0MDu2v4PY2u>EkO?rJdUm>eUH@Rr zIdT(ix=(j3pH7m<xTRBE1z5*N-=}Z2&+LTS_t4?-J^iCrSxv3tCHecTqbp}viDacR zxP5nH4Mgq$KZ^YyE;Ixj%E(vFlI1%V`BAgM*>uBt#_XNUC#-BB8ILtV28yEv_>p|S z0DMFj&}sC%vjrI+0mMf8e%zuJKL{QSV`3wLMk_4?h8AUm3KTCo4jko9i#$MQw%TRt zU!YT<UKDJ4AI(G6J+H~#A*GhaXR8mj@CP#QcfkXX))_Yk743jXg5D9WXJ$A<NCxQI z_A2hwg8Kgjp@RFI{#Fv-K5xl2WlFkQaEo!EMIFuYqxwY|#iWv~O06Ew3;bC~w5&Jp zxO>pgP*Ho<z)OwqgK+~|zKIH==qX|K{vb!STa%<a=lLe{^e!%Pjl!M)YGdix=uehj zAroWyar?7vGmr`_{1`+nh(kIQOCKy;N<OS?c7?h5svKLiz3<g>&;io^$%0Y}XD0aY z>z~`@@<t2_)bI&PqNCEU&2DG}Wu8@P45GSPiOa9ywU{4mDH4PRA4E!I9QbT|!4ugg zG0#}P?J;ct2v@f}Zg3_p*bqXMWevOpSw=|6kb@1wPr_B7Pd!{_=M&u>B{1_$A!HaR zmreUSibD;W(@!tkc6aiW5{hM<syKW36qw%RxK>WjOt-EG$@1hH6|4&p|2iY|!`%{N ze3LrzpSV%rb<970>~#eadKAoXQsIFF-;Z<%OP7WOUbKtGnOTp*aV1p9AL#3RW}ovy z3YF4F$w+#UW+P+&e{uEIQBkg4-$M=|%#cGflyt+9W+*8omF^H!BovTl=$23crAt6s zMMAnmX=&+3q`SV0bKdWH&-1SP57!bFYi8D5``Y_gyG?KJcgnh(^umx#k2t=AVw)Lk z%Ts03mUUL}%ga7T)*$kFNB*=psbH^$(xmEir`V}Yg@$pJ^xQm|xJPb-!&XIOEH=g? z>@I)_Atjj5AM&F9!p&-y@AFG<K^}LsmsxX<P0`mXs(M^SrsdnI=mb23I;3e;G8%lz z|GNa-g{TjY!+FM7SiqP_ZL(GQ^~tZ)=gWQF4D#0xX_<C3Bfk88tC9o;7G(uoSZtT< z+e7zzQkKkdyvBNmQO!z6XYTtSuKh3A?_qy00AG4X{6@!Kwg+^Ji`C_VoAt-g{f>e* z*NZiLu&%|#hc0w|-ya*}#(uQpzZ95ac_UE5C%sWA$0hx|)dN1>@UZ{shUVM9wVIlJ zenhm~6|Zn;HB;v~lBbTykjAvM0+G3qb$B^|MNa~za=IT^0NKc2`EgoxX;M?Shw?C~ zc4ms9m(;tQ*?!v{0SfEjbj^#mG?!lcKklr9Z8W(cHv1ie=MsthIWqq*hw-=>uT5Sh zvCm^J`z!a=f0mj`8dW}ds|M(^WRS>^v#<u8e4b#J;hSjYy(P+JP@buO1ZMZ2<ARUk z?0xaO03cAM=ZlN4h=B9ojiFHzw(E0cJwIWY**FwypZfBcOysr>NRFZ?^gTZU$e*Kj zA^bXa;_EZo!`~CH0fV~rHY`}z9}sn=9k4pv3*=w(61Ny-Oi2859=aN91GIQ!yn;pg z@XhLuWCfNZl$cIy`FMMl|4A7fTQ2UKl5>3^TTLd<iUY`oA=jqPrS1avzv`^tIWMFA zw~WzJ)6HXlZK^vv*z-mRc)K>`ajYyxeEIX`o`dhg{TxF%<AJxT+&1-$>b=}lSQX;> zwEV#WGl~H7jZUhYWEw(Bp3L4P{-{ar10}vd?ebjJ!jr5phHPSbi2~M@$)UU}*b83W z54S+X=KTrHl)qw73u8DbaRJvku`(ZvekOw@px}R>J!dr;E7Vo~VF#}T-R<T>JxxfE zl;_?6u(H^Xms@&K1{8;S;|PJ)R#fxJNP!%<?;o<teW|x<CnytYAWf5S)7hu4jzn7& zynf1lFB!ho;3|1-a{&^WJ^+&{=k{K5P<1}aX!~bT5;Ml8b=wO%#rsmR0pCCiQ<UL% zRwxm?unl6&YFwO>_|47YB?TGgd=}d9jXv2#AmlVUK2`;Z2h?Om9Ux|YgJ}4VfAoDc z<{Dm~A63oz>H5a?L+a}o`ax`A?dmQyi)}pYxy+vlkP_WO_>z;hD-{|5%iv^Fd$UuU zv3svo*bRijMP6{a;nLRDWb7~Z<`bVc83cUBlR+psqk@L*zAZ_HIG!y$h~=k0ixLk; zq`!uL=chw`a+;NCd7lMVYH#e2=AVzx?yEZuZ}|+Y^8ASbG;*QmL(p@V+3~JOj~XE_ z&&cxasMCkVs;$85BDv<-`+2A4I8}i74sOF4#5Z>}WvUV_>tiEz;`7n0zP9ox^a_0I zvp^J4s0<)b+{%@ZAdf<3d+Qi8-M6}|{HR5kFz|2~3>hPnydQ#|x485NpS>%Tcm_h6 z{?pEfgS~M`0>XL9tTs2&^0o3^S{L9cGt(GTrORqNtaX)6F?a?n$SlD~MS8fjW<NsO zPw~?fuzWF>2b7Fp)c^fE3-DjWZYaf7RnH-f!_6bov0fD^Bl|nA9?fMsb77^qj+!?t zMbtB7a{@2L2)<4+pF8c6oZZ-_#7Nc{n<wbu^LX)r*}{P|hR&f%&d@aM%j>@GyH$V- zc)X}hrLPciPg*tQUzPfAH=Gcj1wJh;Y0Y686WEh*$U>T3UN-7?wQl!bU>-}td!?A4 zEa%SOeZ{pZ_VkS_@?0~JP8piU`Qo-$(KGHt!j<4%-Er$5>td6-!@NO|_&DlY+T-7G z|87Fy{v@CqIPu=P*AIZRfZ&jSbO4s7W8+jmKm$^$Vqs6H$mFnqMcuB7I>O{6#0(@> zA&@A9E6!vogbji9adQu*hXPzDa#hKc$UncK8;r;Yr&!$gbUBG~SK~Ko$Q$gb;CY?} zVmRRLvZqUAZy$n1yGC^$6_M7d?xey}SplGwhR6okP2ZXEP#_`Raz`4Xm*S;7pL-|j z)37qaGr<aj<-D;@n2tqXs(Ah0B^xS|vL#PelAdflpf0N6gv{fc!ewCI_~bdE)iG#B z-Y9ES3@Sw9kNK|lrPUg>dmsNP!J8Zu62VcKv&RY+_$GCAvKVOtRzuBrcE+PQPBkpS z7+Lt_=SL00M8~mGQxV^@1AA5*x@l;(RfSbMk8wWUis(v~#tFG(oSU=n#Sg|fL`d-M zWlSQuv)|J-pAq5%W|YS=c-6@{?iH`24lYnCuWRcWp!lLd^biS&2_m@g{Qi5iB!zh< zFc(*-1g;%$t<GPsh+IA;gGaI7f3Jv)-&k;Rs5OnE<mCWsD4#f5zFN<=MxPV(>s=c8 z9ZlFB%!e^<DEV}pA8slmwa;H4&v^HHg@#IiN|HQ_oCs?BKuG+kX<v<TF<H=>{IRjh zMDno2AZ439-Gvs|W5Wfu^L^}d#KNS(vvQB^_mTuVTyECdto_pNUk5ZDSGL%mb2V1_ zJlvbMdKP4otUfd&MIO$-_>qAg7k|FgWq<5*&o_9?7~Xj(Zs7#ohX*^w9RyKS9Sak8 zL(HzQk0am|mlLY#Qw=JoDEaAGF^;Arbm}Yd$W;Ko9Q7-_Th#E>v8!IeS|R+C1$^-L z9zM%>oqUW1C3Za!iS@2AtM~Hjj8t=R#!3I_9t*rfgxG+<k)=EIW+uPoQ^|X#(qE-D zig~pocU?jG3@oXTK+ARHgc-00<i;xKB2T_I*@f|CnOWDzGWzTU7`<$IUHf{@ule&8 zSP7>wL0;;8d!+wfXCHOmzXoL&ObkXvONTYeJ${wXdw~ot_?B4lKGK@8QS}UGkvVj2 zW(*RXIjd1-{R$@jmMnE6gwm|z1G-!vQ_aF|l4OqZq$^@LXS>b#Hz|~{0>WL}9QnNp z6^3fl7!Z>9Y?|_Gf{-{Xl1MXoJ@JG<;8<0l_FO+DRpwYS{ziWQ_m=tXn)a&?q}_OP z9HPn^a~UHB#0ceoQM#;Y;WoaxC&Um!jnnCk?Zxt+GIrCT-@=?%g7glK$7MDQWB+7Q zASWi^8|x5%E~5k((s|uX;g3HERbSuMPQmdznO9cwF}gm*y<$&3enc}C^Dgk8rXPbz zz<nA|^!?Q~v380#CjI*x9jVjre+uR+^i72@P;PJg8%sxB$U_w8kG5tXq;=d~Z3$89 zD8ope`CFhJfc-zZp#YNs13KI;dvo7IiU1D?MnG3YctqXqVkeoDjXVl7h+Wkb<@gk= zz|0Fwk{u5)AtdGPLLkW$P?VvonrY?vWSVk;0ZBr;I{2_?Bu2mpPBu<mWMDXmq!%xe zhDXiM>(~H3E)hDG3?whE0oWXYSItpubx^zB#QX7nx%^1>K=K=eKu|yZj@$#%=Zp?> z(v&kCa$nlVLE@3cL{RV{ASR3-D<14Z)yYGX#w`RNPkk*>x+{0SlRz*;Uk-I43wH8Q z2}NfT@P7dkpR1O0x-PBi2HC3<7VvG;Hnoo9l3OE_W7ud;g*Qt<=2fwiv5Y-Pa6Ks* z#D#6TGC#>N<5W<m|8d2C%K_H>X%0*|HI{_GqGFLcZqa4yz~;|OwgcUX?)~g%^^IB^ zHq@N4;@I5@Y*Dp;Ez}Q3REO70=W8<dsvm*9coc?+eHpN~rw8k+NAumw@=CI{2i7t( zbG{XzlD+xsnUO8V-Xf^JYaqyCgQ2xPbQ8S^9lEVjepVkLFHzH_(K3v0rO~Fr_)F)> zG{S9j^x^Jcj&hNo_=GhdF_i$y)-pYtJ|4)YH9Sd`XjrY_MROGt#|)+B?}TiNH^W?V z=uIzT?pG0l)h@BcNc@(k9A^Pfah>9UvSGAnpSp9Ov_A!`G}QqB&|7-EzT{YDWRg{J zoYrbaG@~z$88SMju^K_rd5QKmY3!?(U3LyGYrHc0K^sjShS6n`A?^LuOK;&FW`fkl zy|-L%YZ-$d!0ydGHbvCa=by4(hU7bb36TlZ3KQw-N$zg~j^F-UQchboCQ@O*K%M!% zJ+;$A;EwYNPWoas<EKYIKJF#)8b9*PPx9*+QJ!Y;C`Ij1M|soqOCR7@TWVyNHC6gw zUzuf?4uzHhn=bW<wTZp4%)Wpo=%yS+p;7{2Sn*nCq$-!?081vAX9$}UW_W@Bf@}<8 zKnYgJ|G<jII*uZvHdu+)W!NBE^=Y!hP9H-SI8A&CLEY-GqpEZ5ecz6tre)Y_e_DIR z)4ES(-CEbSDvaIlLPwRUUeJ$O&zE2QKZPuHlEO51)wtj(hX2XjL}b6ExE4k~op>t7 z<~_RLAS|n$3BJwy?Agu*V+Lp8Zd@|D&Rv+Jm{1tQgJbD*Z81C!r<pne_i14RvaZz_ zlPKpI;Vi#LY8m(J{~q1{KE9}F1ptmv<r+z9>$}Pm-wo$)s!eNitA9<u=SJ&oRHnRF z9sY#S6OPYj4vXJ@^EHV~(w}KhF;~N(Sos_;>jmi`%gB}@j9zi*Z_-PrFQbHu3D=9w z%cM+2BG^Zo@2J7yMl<DFuw6Qpb%38`#?JnbCM$d#S(2n+RMzhpCb9=4a%)=>g$nZH z;uGjD!g!wwKz&_?_~7+0@nwy#EgwomD_drMP+Y0cz5lP5eiNYyr^dEfr+GJ-^CV{a ztPdWNqxF~If3skqE272z+sN!VAZ+`u9`B#xsQu3rmLnio(L|Db$0=QD1@xtCl_28L zXdXzxHA&1v>L9SsJL%k**?j;Ebs#~`8B(Qdx>?bx*l@fC62*tN(#hu^YAUj)%R@=A z>SDm1O<H7%Qp2c_!*0V(<KXcMz6x&vn`&9$&A~iGE#xX@5+r1-jB&7b$t7UqS^ueT zUirTKwWHjp%GZW&+dq&3fhyPw#o;nn77;Bv%9+V%2duJ+>QXrTh1|tx8KSEQDND$S zZ}w--%}{Z>Yz?)sIayhhq;CNC4!cEd<#`dTZ1#(m8*f;i97h#q!!^f(nav~hIx@`G zgwexol<h&bfRtDwx4uRUBddwW!=E_&3}aMnw%^sGNyhLneLx6T)(WhveJ9%Pm@>vr z7*BpDIJ_btnYe$HSstZC!*G>a$JffuUH4fY^~U&%eS9Qz??V#KW3pWTZ)oSRbDF@- z2G?~ReljM6ILVf4U@}?7a1paH<}vw-a<*aw`8(46R#n$e$lr1VA!{erS7=uPt8~6< zza}x|S9EGb*;Ri2XS6A1u_pOobEoGI%kecTBoS<yTdx>3Qi<lcl`VzcZ+m(5M(uF- zTbjR+ALyNhca-cA=TvDcA1}?Y#i@?P@G5H2$uN2TgB^qDb2UY$&c`zAm+iugipJiT z)%x>q$@bOiXw@%0My;cf)Iln@$~u}f5OJqk3>n7NcJo_C?EUAP)_{*L4njKfW3hjm zgX1u5l$tlDgMIh*cXr<qcV0&C-cJ?Nt_<k+P2>3e*)lBJ`Jg?^NIhg#Myflf5h-l- z%fi250S@(0PZBL37FGil!K``}OColas%zf8*$#o11@}-&>L<yS!|t%dS}88Gqdtq2 z0P|`H^GKDGxf>E=Vcvr>lfi!hrhJ)>qIVS78T)IGS$bC9kTBE#YNwfw0`|K>hVgg$ zXOLd&Y+}96az^N4q&er;DxpVQUBTE#65-u}xSekH{^h^U!~!>_OnA%q01<O>-BNF6 z+5w^DH;o?T$Y#7)(Zl)#O3B<bGo6e#ui;-wmDe8Vjj5Z!@}4=oNjhT<rpJCf9uX7V z6(ly{{XBc79XIO@un}mF&IodDmQ?0x8D=tn9V(apvbuSwmfwDNkCiuTjbzeIWsz;G z1-H#mHL8A`i4l{Q1ZZQs$uLXTNFs@C55Kf!K?@O>#uZ6E!5S_gt8Z<|f|JFQwB_ys z-uB9v&7yX)cDOsgoL$@hf>M8vIv02rg*3E*Y<@Ov@DP@uqQam5{R?xAL4UU<Cyg(D z{80H9(SLLDnS*W=ZLB2k^zN15Q((kl%(;+YViJdcMh>rKPoa52e)vf|R%7=LbmdB? zIh24ynI1^32VNKh$#T?#C+z8g<>J8b?@ggcll#UQs0QL;OK?0XQV{7RMYDd(^V#GV zZ5zQhIW;UnL%i=mC#Ai_2=7NFJI*#pf3L${V)RHPFDpe3v=Dv*#~kFJ%;OU;-u0hX zqBJ9rTl=gI77Fn4mm;O{vk>lH{_&yu+8(}NURTFK_jo!8F~n(D#hGwRjVdFbulAMf zp-jliD%4!gi7v_b8<69HCnf!ZK&fNEV6DA$ak}5rTVNK}D2De5+0*j+c2|H#pbvah zU^|J&Fk4EaRU=#pNoUm;sJOw3tP6nSV{pQkP@pKbh7##2TF2?zrgG_eW4S;TS>VV) z&9=cu$RRMhiOP5oV;2rZU`KkPLKQEOOEGlfLq$*i>%@lz$E^yyL^o=XBVN$aKoZFR zh{vrf3Y7IE@s}llH>jI#$)*XD6N3)YA7}j{%Wte$cf(dA53SOjqx*OhDdcvQ6)WV| z))`H`cxV!$p$NKz&N-zSRcBZ$Hyido-hMZq#}Np*H7V4FZIBI4xxCj5IMNUI1PN4G zazVJNhi^a*{gct+cM>NU{TAlA-k0g^^N2IyA#+AKT*WDP{*}72MUVoAK)#FpU5A<e zd1ivJ#R+B)u@GdJbv?=OK1CR0P5>JIzlT?4^^A$*toi_p`u8!7jCn}%`nF-Hf)vWJ zQ*=Z%9h}xRU$@BfR_#XiX{))B52aBDK7_WsXuq=-Xojp1`_3uaE_b*YW)KUytozak zt&B7dx>rwmd=)QGc-r1iuTKQ^s~wP;byfUnw)<Q>)#BS9yeUj(4KVzFZY$7^qo(C= zE^JwwxsaG&UL0QRY2zE7*<fJ+2v`6LlGh>#{bjZoIJ29o(Ox{e#JB~E)X?5SfxgL5 zgFI*1>ZZ#Gcgj|t>7c4nnF4>5m||7c)Z}nF>Et(&(!y+|_Pg6!A}o4qF{;$~d9RPa z8cf?m5eJ~1HZZkdaUW1OkspjmTVvaL<5Wc=&*#9#x4iXuO^H2g%_mPOR?Ey@9j}!% zo1v}UOf!f>svDrOIHLFAH2;Ul2<O2xcy*&nkKL)V4R4w6907dJf8OBDwZ1bekLtP= z%5gDU`{&V@|2xmzL|*_D*U#aaP_*TIex}|V-|P|7&Ox=uu2or9YtB>9n!O=rRb^U2 zVF+QUWG_4exZh|`$_IU%Dl+7Uz-huj!X*HuR@LQCM&#RXAFK~oso#a6)Ic*H-M}d3 zj3Rk7h>7=9_rtx28LFpf*dFMk3d7&;$opKJ?Am|b`Ld!|i=Gbz#&r^EmpD0;0OepO z<Kyh|FA;Dmyi<iS7Gj|<9<OlU5n-E?)He=TYFIdm;j5Scoo2<SCu61e0hp(^4ti|v zKta-h0G`9u41c4q;Sk;L^l^2+(-rD(ncjB&#MzY#@Cd@{+wiZbT#N{~jl4N#>iia^ zVrGtVtkIGWd|0k4^o04LS{lfp&H+GfA!}DVyJq^E;&PxnI>QpWvy#sz&-a{pavfXH zzfGlHM!M8n-)&Fld_VzanESwEJ!Dmmq?s|@R&L~oz3dah`TJw|m$@Hg!B4}%Q9Q&^ zBL^%9OS7(b0V$rgLC3cHKgUrHm&_z?RH?Dg_^U(K#AmzB2|c=Ck6p;0q6Xmf;NYL) z2*zS^4i5~Uc{S`abRMNZeW1XdOB@U)6m5o{T`7$2*@)!)sj0>4vH*S?fIE-QLsZT; zSw^jpv-2;AGfEa}5X)A&7r$=KBUFOH-*@*R^bAjkH~pPP7-DVNB5IYJIL6uQZg;9n z&+z6h0_G}nvJWpIyX#WW1>%-VZp%H=Op_4B+2d(_aVyZS(uX*B(a^%JL%EId)tU4> zB^Kik+!A-;*#Q-frx<UJLo~r0gEte%q><smwRmI<K27|mtl|GTnGJO^EHIrsHHxRc zp>~rX?p2B!qXFu5b25dS9I1u>b+uZN1R%p(G}42zg3!_2{0_LCz1<96;L6O+3R+us zrL9oFi<hcT9iQvG7qR(O!(|Pr16%N-Rf%f4yO9X)+px4;wo(vso9p+6jD&tjCv2@v zV@Riio1BF|FC*C1h@V}8eE3jBJs%#X(f~M<H4ApHHP?EEF!~|nU}Qb87Vm{PL`k(N zv6il?f6E>o=E&c)j#QVCH+P{9TVg383(hNEVyO!=2NWaHgRe32Uzz296D9%S%xK#u z4tR;j@gyMh@mA>vy??zu&^!lR6aT{qUiXP=uCcU#sD4h-Gtj=xKbSQ2mHlA;{Vw$l z@e*L53`uEwI#Qq}dwD<zXakwisXIi#IVtoHTUhP=_WfVaK1%g<jI@GJ)XS4Mx?9HN zRKjrh4+&K|)61>NJiI)67%P^;1_C1jcFMdHyxMEc=`dG8WcGkbg42*a{R&Lz2VinO zVRN^<r03G6n(+-OkGxuIv&~f?@o@x+@unmzsQ0}fEqyOFMdY#0LtX*sgsvj!;7LRB ze1n@5&LZLIet^SpcxUtD{ZD3!&C3vsF5a`lasn4@Mf13KXnbr%`M6wUZPMdhxdvQu z_>3EjQO2P%tWE{LgKNf5@OW;SYUw5X>qR`FAj9<MIKXmx{$R^*7%k9Nh>t7-d%=Ow zQR{Z{3xNIWxkOKCB#dr0S3>6TNXeR&soQr#y(K}3>Cxqv_mFR|$ItdI(krP`BdqC) zu+JxJOASvmqY!7ETc=`uN@s)?$9|s4_p?ZURn&qgFVJotP!&bhude&jBq=b|`R!t{ z?B<B5g>3KufuPoY8FQa{+V5r}hgI$zP=9PwBp>bkp92hcOsmW46+76BZe<0?9lN0! zlgxJ8=F2c*`no;VEV3?Vc>9O@DXhKx_=vkh=5&+jelqhw@t_*4fU%8aVrob?IfLJP z4b3supF2|fNHHqRejE~d!hCW5nHtO3)p3NmPgdQ_?Ed%!i$ANNvk6*{;+Jwh!IPR* z02EZF48mtZo<CVqI>)9@Z29yf0RDGgUN3%j2BkGpkvO5;hj`=oIkI2KJL7OKON#LK z;pFg@^T;;-9jfsug4^`3PD78TOL20`8g@MALl6bPeb)0E>|M?R!-8tOJyVy+PA(Df zCC%4%3@MMm`j2;3Hr2~<9fm)|^mH`C#gHu-iVNwxW9i-h@=789uz+m~(L}$H9TM@r zO0msMd|yeck}6iC=;iB>*+C^&r1j&frdC0pNM91f!v=d>iJ6Z`^?Rng98!;yVx`7W zxiXquUX$G&rNf)Ay?*~yD`R9LLB`uE#}qWI@a<jMnPMz)&=OZr)uwjF8hlI%=yarm zc^wq_ZMP(Hl@6o^qlgbxO!4HVLqJ3|buekto_pF&9Cc_Ln=2R8co1X)1kIDY(@6L$ z>tBfEO*>!%kIQ>%^Cb48=<`iUaAxJj8`??P8^VMh^(kI2lC?ITuDJSaHmq;^Qw0F9 zTWbS4G*FV#IDEQ~xN22N&YI=Kw%R{^$1`!QO_RR;a&|__V}9E64A^5|K3TiT6q#Xt z!)J8PuHn;aX5$z8;SNC%`W56aNtpvJqsoedmXPhk;%gt1o7<Z1<N;)t<y?271XCHt z_;99}CnRE88{6w(LmoKEavFRA?T$0UF#hL3r;v?G|59*gwrJyvRfZ$d19cH!d2NfW zR3>X&wePgPOr5a|`5?GPH0xG>G)n+WT>L5@c1m)Yd81{_Q8ScLiy;BUP~+OI@Ty#B zQ5%TBexwV>>>;|8V`xNdVW#JcgI)Lat;quFJog7oU$SRgE5ABD5JIF}M#OymJB_>| z;On=)%Gb^R>N+j5JlUClW%lIqExs~CSJ(nQDQh#JQVnhDfQ)RHrmE}-F1EDCr(x-V zK$T3gg1~i{)LMWD79cJH;I?vVgAs*mi10KG%%S%lstqoSq0Cz?eKRi)=38)%8|wq@ z@yp7Vdz19roZ*r_svtmn@eU!}2UMkesk=cOzcqou_)+}U!Dfg!mep~Iaf5#&*pQLJ zJe%eB>xD4hQ)F~2i{L^n`T=xk_~_bhn`<tQtM-J1e7;pvE-t|fX{!~;%*KX{L5t`F zy1sm=hF8F$qsIMJr7D~wynuu0mo0Sk<<;lZUa&~)c&nZkCbLpE`{#SAxUStopReS# zIHUi)a#lkBF9l#z;7GNLb)ZJ@4l#xRCy#OK-WPhU9OJMzB3ab{`_iM-VB*%(R8Y<D zZ5rAKyEt6+0{sk%+9a?CB+hh-!>7nF>3C6W5oFHsWCI$|aPffKY_S%6#k^MZEt8l{ z8IC{QIgAPVk_B@%pcOljb*`72ncq;$<eWOe>3(OADTufMHAg@&`WKt?GWUbba(((W z+vW_omVr~F^t1AEnJXmX$+^PTYJR#`q(Dab=+U2FQx#nC5CX{<rTTL4dbsEVSFy=E zyjT#-OT9^&rf)3FgIF5@WfL~zf9;EZ8}AWr7lnnl6j`u9nMSHuRtHEMIDdTn=hsC_ z*zqi7%e#L2d;^KQ-v&UcUurEjmwpv1G53N8E;h^WhdU<EX%Jb_yY{c3^)myKJwszW zzI>ZL(xw89=`zWw(tQn-<BMDK7GAg9d{OBd66Hx0JajR;x0gL92vsIgXYsvc<+x3? zp5=scLN;9%TQzQ(&bem>8{xjR8>GK6L+-s38jNF7c(DIFi49F%B+hasS~`gS&(n06 zk8vuy28#7=kSp!gMLQ$pDNb%w>#w<hVD{bGC=Ytp;$CJLek;Fa8oMVG<9rmO<!<ZS zgBAsY3+KFBzxahTq%LyQd&p&%=8`_O@$)Un=_ICYM;*3D&HhnKW94mG2;;dx#_xyF zH7E@*sa3G*{-QACe6SD<8{;&eSCuf;SZEqv#EAUa$_&*%X;Cl&e?4|5C`9{}Ze3bz zd7lD}w}FTI1j;gv-xFW61p*72Q=_}!|5>1IYB~m(J#V;w49No$!WJz78xf2Ddf>i9 zCfDbZSmdv+I3o1$sf8b91_Ygdq#cxWTVp7(y4P?Qi)0KH(%GZE#r|ZV8EbYh*DfQ< z<Lb6TPC&2-JnE3lR>W~K4))P@zo;)aLYM6Dd6-U~x>iu=;l)O9)A(S2ha{3pvrE9y zgUF^UE*+O>z4JQcDoNtYwtMTQf<78e?WmaPY|<y@Rrjes0lkI|ebJZJh_dTX&0$fF z9oo(5Wb1jp?LQ}D^y%Osw@I0X_1Al!#t3G+(&@w(3Tz5V-`p{Gl$rKK<XLc=LV%j- z`J2SXD@rU}4dsW@Yr|EuW<5|+|E%Y>Tw!kG!U+^5v*mn54AZh^iPvS;091cIl-L-j z{{OQ8cH)ByQ3244$>}dH>XSA5FJ#m4sfbLXXdnW%$LX36ekStz289w++dh2JoLvJ9 z)P54c@BgqwXKKM*GhO9NnNHrG$m1St+)W?V7#b;xksfoawGT?YA9hi9AmV9ry|J$t zq~*Y#^=DQOHbc2zoU^B_eZ8K!d$@Tghu^b!8jsccDHeHyySF5u6<x<nU$PlAr%ArV zt?Wp#z-7Qm0BK|8R_tyg0jUsp_k06biyd({nrdF3VDbZ20b~gOQOHBh=!*~c-ens| z?1<>0EWLjP1;iYBO<j6)9B%xK0&31hs7MGMI`#&o&U^$B!6?9C`%8=JS%%2tgil_@ zT)Do!K&bn%Azw4&wm}P7WYh~>f}EK0bh=v{-=PY;n{8AIYu;%Lz6aV*e$|S;<uMdW zCsrcX6Zby){WxGegpm_Lso0yy+v{B#xb!8RLDnx77|^W(P6f>^;$hepMZ}Kx3pA3g zli4vHgJj_Yzc~2~EJ9@Dnb4kG`lZFiMH?vl+<NEvz_aVylc7h}CYgK{xCDSWia9$z zt_P9EK*C5{{H-NYKxLKX7I#9<-P5Dq>S74$g9TUvW{EkD5P7k3&rf-}@B%aSIVKfX z0Jr%Vjg}bcBJ4h4<z*HoMj13y0KE!X2jStDYTIXY#g>qLE19{WaG;bcz^g)8vbLDC z)`r^Au22FF8A9j?_@n^WpprB%niCemjCf^MbW40eRJ|{0Xo!nc4hp2gei$?JzMoBJ zDn$#>!)1I9x~N^`TX)RvTGL)ueixQXN)^9=X^W>y1)ErV?n82!LT-K{ohfFors~nT zM7fNY;xNMc=BAqJa;2jQ2`w=lUmmx%1|pPYbpYPJ6^Ho<#;3A?id5l`m@B>ZP5*i3 zYDdr){JR8NRQ!ucr&vwt5IZ-7AN{TGa*gHb8cV@pUlI@=En}wN%$HpC`>~eQ=}wTr za-@`vJMB2;LzAAQP<<7fHn)XM{x`L$C+$S6VNyzW_rkdMG+fj)un!b9{Nfev?nDt9 zo?w_&zUE_DXUaK06iFysdaLCn&8TYKZ+;TzcBXO~PG(r0P_=XT#a%o;-nEvesg9Jt zv@7E2sya;?%rIVAii6t!5lyDRgMcinuK&FHf8Gc3jHZcFl#;yuG7W>EGy6JQ_bw0G zaj>wa`|$1<8iQbVjRm<o#kh4S4Ag}p78Z;>ae~s9Ey$vJhtu`W48I3Nv(<jWX?8m% zRwU?j36C1f9Cl7l#sho`j_3ohIBx|D;y+wKVog>={b5>h2>eB;Ufn+>2SiTV?~OzR zyloX^eD>>Zf1^N@yYI?pXDmxBa(BIn;b%r#V~%O5EbpRPlU_XP&o9({g#8Bpj#bYK zvUS0Raof>iPm$A!!udytiUWuig2#hGMABmo68P}*wQ{CF6R(q?fh08Ot7Qnqi!~`m zFDS2vn;_$XG{`L(=s#FxA71YD*D0ad<;RIgY7&UX%`Og5fjrJJX)pg2t9T9$x;(dj zW2fG-kk(jVz5U@vrR7h~p@=F6Q}x2_d-MWR{SyRxAiHHEa2$bQYenr+UmWDP`54_& zL8tVg_?n%l=?NA3J<>okMD#BD_^ZQ&l_=S$of~&UIQmc+9UTJn*vjRJYl);-91dmY zWSUa*V~JW*12r$~aL6e=4f;)Mp67issC~I@w#j^hGVFT?Z4VW+VH32zUj>{Auf+*) z(X9QrGs`+ctLKf8fQ2z$2P9OF6F<pwLlE_iNC@%?GOF>UaW()8I`R$A#!}h?P%t|k zEa+AOat_puJo}Rw5n@z4L<_ek@-{{^wz?NkE@-`&oAKU$IQmrkHcGVof@tTsq-y3P zWOmMJyga}{b(HsKp>7zLUU5MJ#@Y(51KktD@)5$QdgOs9Y6?ivN-*&j<;k+n4mY_s zhaxb@@6tn5Fi-IGQafX4^Ff!Q$7_2?<5gu$qmjr%eLv-|``yoG8`1<C18-c^1!mH- z-m@pWiw_y)&Ct5#NTSWr02Q9r4DlDC{7W>y*;jB`SCa%(kW5i6@l^gCW|N>nk{J2R zY!hX<Msx{vzKw@=F*puc-uZ0TZ-g+N`-JX(&CX3NslxZbw4m)Gq^>;O25eIMQ?tr| zV^1+~;{&w^tSs~UOxlQ3I?haI)(z6)W+1lBTk;`69+8u=<6g;fr3;eXzLz=W`0a<N zme}ZGGd}C4JMZUB9-XHF(&pY`<3{t3G{n}M%o26QCKrF0Ju2|VP(`T7di<F?#cF9s z7}#Nw9La7?Rp}4@Pi;}es4mAwuwXMAm~>uIVrR-g&NB`AsUH@c3egDs=c(osor92% z@)BS<a5K{FCDPt&B0~yXgby$O_G^>u#xq|y0G)>)(&bQWhb@f(#(*b97mT20mstuf zJ7**EKn5Syk?WohEr#$)1<ykxxIIs+cN>9?FghkEnv|LI-b<{!idFW<NT=9gPg3@n z#PTjY^Ohrz9l5z)<(36CnuwRrmGn?G%vcROuKFhn8!jr`mcRI=s?U^rFg2lsgaQU0 z2`iL|!YE6<mY<$k|6Lq!$_w%dO;aK$E_>(En>|#S<xk(53gc%Jxqf>@^Mq^9KOX~& z{Hk$tXtPvq&`j16que-F<6v9%TBj`iat+Aw8Xvidc=mXxxj+3B7tjI}&)I%hUc<nm zpkyj>T=!_omWz^}s42lPgkbr>ic|fmhATmh#tTu@d=qp!SN;0r682HIiiBRmL#5)D zmVwCPw)@(6;^fO6Lmc^A=w{W|ta+@rZVx{`*%|y|Gq@?i&3pxb(82eWj63{J*E;P4 zKk@adN*|uNu7Wtgy=xK<lUx<c_s1JNXRF)(1t%=FC+N$5e0K$qGqWCZ2Qj=X%cq+a z*be$3%)3~FqbOGNm%&nNu~X%bzPv`F)=vXXAD?$h7T87=ZTgG3MLjUWAaF8hjF359 z5`Oy(=$onFajyd`mw$f7N2eN9ZVd0{$iVe-dyW$N4?hvtmgHj)cvBPIju}MxXmLQO z0ZOM!X_CbVA;ekB+$7wTL~B6S&=$PBOugw|Ub~x3!v==r9k#*+-yqr;3@O5PuO4*w zD@o4!9-G?Y6I*DYm2M&cY(+_HF$SR6<;<ut4Qv!maZ3Ox8AmZzie>jFFcH0KdJB+{ zA+WQy<U?D#xG{MsWDk3MJYsL<M{kmM@z-qZI3j0+Yivajtf>l9k<xOF-t#3u_6;5Y z0i%S^NjU}a7#5NS0vHc-ckB&Jo?xLHb86&}Tr(v97jV0M`~%6T%^S*7H$H8t{R_Pu ze;e{U(+*;3SqbvM)2_EC%gkkQZ0_-73P6S-8bP?kbSeN7)}>4lw8ISGRJ!hbMgO^2 z5;|lKe6R(I5u^lo1OvMuAt6)I4J`sOy1rmp^}l=(_{Z6^r4p0;?pE$)vZPrD;~so& zJO-0|v^ms6ubHNjY(5*?U>dsygJ7{H@DO`$4t33__WE{AZ8FxJWn79nCbM7$3l8}! zMbkH!m_C*EgMpD0`<G>4JGUUlm~U}ERVOmvh0Y;b*;{Hng%XdI`-S+M%3GVP=@}5u zg+N$bF3gU%eC#I!@rO<WNJx(KOv?lzN<ZL07wmcU+UsV2D=~Qe&E2$~e57;{MD>sy zsUYb&qMcc9CZr29&t;0MjCS@Ni3GnIT+}&01u7Gw4pUu<Q!QzTsQ&YqAZVN+1lQdZ zorHH}#Kud$VG>g|wBeh#xa%*(YYc7pbp`!iSG;QyF=pEi(_eCJ+?gZ5hs|r9FtdLW zGvN1ZiuLNY^p2OKVPZEc7yDNChW+tEjgCiMIOJBmvfKhfoAci4)bfGY?xs-7@cx%` zrQ6BepdzrV1+(*=EQCeHlJzsJk|(+*gh})G{KDBmJV$~`k@UJw(QE-6zd~a3BNrzn zs@VTbb^pwFC`D0pi9HX8*WWXc(zQ~4v_00ZY~81?iv}U_7z8QWapN@MM`x#9EHLfY zk7CxkvRHfyx?k%0TUCi`o#JxPsR)NUiOgwW;d1y;a9m8k=pT-iy-<AlLG^x~8f89o zZ`O%(e^~S7knVlsqH+uZ<0rfOkQ>cW<#=tg{AAra%U8@7$$zRB-GS&&#JFf%z3O)3 z!|qmz%bYx)(Qg+*c*023GEBcXo8i}a=sRQA*VnRGAs_};gGCvZBW>=Z3ZkP3RpT84 z?3iqy1V`hx44`t+Uo0OmeN<)nDT8(yeP$rXNj0Kd*+b@IaiQ{HbL;jC41(4tJ9RZ> zXKeMy4L)Bin(5ru2UhMIufO{$GZ&Dd6^%94E3x)99lX880Gr73#-Sz<<MAd>L4+U^ z0s#w;zZXv8#r5s?%WjXGq0PXnDOrFRVeIrpKvY12bQR{>%@9E_4i!Ll@oG^uDP!;= zeL*hO+n+`!TiBU{0Cgd!okKyIf+2n6&I^EwSszqpjDhNf@Ical5L~Mp<WK8!nN*i! znyvJ_jmo^k1mT9zeFfjxQ+rT)C?#o7^IC3uErk394NA6<gr`%ZrwcJacs$YX<z!-F zkttBDWqk|c@RS|xZF4Vk*2RDvZGm2fe8nv%#zw9bm7U4THbV=D5{oOKki)gXphP~? zj~DZP%|Z+t(9An1eU`h?<vfv-`?wIg#8Az2Db*W3b`Y~Rpxt-}!tBOuz~3&0Wq?>z zD0a?QdmGvDioR&_1Y~hSu|KkC8XSbSn?mLXoSey+*KW-*4}dCGEa;#K)naMdhGei& zYEhwt*D&269E@`o(f9+!hM#%T*4>~Uv@ghl&$g$kG-JPB3}B(QtEQhveWHtc9_$JS z-7wY~V3SF0YpB=<Sf<+`1XWMR`be7S{+uXavBB8Ud3lhdU;^wqaAo%<H;Z-d;~{j# z;vI2Dh_tG`4mU>6B*0{3TQSb*FQs6!MRYqqKW4;dG@!*mz0TwhNn!2U*5`A}fEutO zWka4=D#Px3vYbcg8aB0wR^TdQ*JC;;?cyK<%*%8hhE1O6g}Oa%6l&L9pq+#KFxn0D zt(vEKF=iP`T(7Yka&NKIht<kthNC3#^nAW_8drN`j7Z1%{SCfQ2V&GzAX?ZctK%?j zpakky^9L160T+#D8{B}Cc)yqq?YA_b>rkSv*1|pKGx?66P(f27`hdc!AsY98pDTV5 zI5tPL!Y@b@K^MXg-m;@Eb>U@jvY-a+$4LyG4&3!S^F7dYIa2oo3|MaOn&mI2q_<+< zyveBU=``>!osaHApqBATVi`+6#dd<aBc!HL&pBGt8`aoDiqNe|ZR#Cfx4r0^ikX8P zTpP*x_7*nUBcgW{aZe{z7uuBS-jwyK*X_U)V{-!t1EafI--@&(xz-kSo?h*HiZXU% zl`@2hBxt;B=U-RUFqz-vEBzuu8DfZ!(eX7>(EKjee?Rdfkgquv$jeHWPs>WQ;9YG& zZ1V1>+%=Swa9Loz7Vu@VU`b%Di2xUs=DW`}IzpYXX-iYH{X4N8yKZr3eIsvzVGm8} zJmPm24JTb6KfbOyKMkv79I=c}6<=I?HBz|N)DYwfvb>7!m8}=w8qb+*Tb}RCW;_k6 zd(Eyn3=F;}P(0I(kLEoW>99W+mt(VUQeh{HS~@*bIzzkGo#K~;MJ>cKU5lM>9!#gV z-l7zHu~Pi8wW-<nCu}24!u6#Jh4*OMH2aA*r7xQC<xSK}eyaGVB1VzpZCR>;Pq&N7 zA9bg``%@=OF?-K9^cACQp<lVn6Q$}i*I|F1#3`3YWmPFh6T`TK?DgWDc?&M#;@PqL z7GT@@N=@sF`yDx5weS2Ba7(BBH1RlmX!{8-;vyJV02UzeGVk7qu<?<D&&h^{S~@e% z<;7zE2CBDEw~ulg2~BXpSNEJ){4{)=)R51j{HpwCfb0XGO#VBI?VPZxP2^tqsE5nP zjHx{vjjj__d+9~CfX=SBGS#1OC4MS&2rclLRIjlvL?HUk);};R@)y`tC^LNEddNL^ z<qKW=c}jS>aS6PS5)1>bl6}s}klM@BRrBIQJ%SbqpYyGTR#qTKeZ3gF$V>}nbg$~e zNH*%?bx3@3_Rfx_en~k}w)i~RE}pe&Gs^61%GGOEP94_#-*x%uD@dQD_fe`5ze^MR z=@5V81y{D8WAWy?JN=s;FV!TT3Eo6Drf&9RK1J}6tVVv%(HcY47q=bJX6`)9bOw#% z32INZNc~a&J5?Bh`(sPF>zT#;!jo$nJdRY+r<7hh&4I2PBh+UX`}~+j&=#f)0Ml!o zMX#^%$;8EA$*_z40H_=3w6QhO4{s;4o>a~tiOiR~3&(ZGQq5t`$3?Y<Z>v1D9({E% z<kU|$AsBGmnR^Lx<6hP^UjDefE*-v#G0HHZz9}BVAejo}ACD?}WQ<h1jiT{9W<0mu z{4~3pDPuziQ=IDPbzZ4XObU+nNjVHs9&Ft?UlTBHJ4-2<mmrzMGtEw0yYu^!fPzm^ z?7`KK87KSeD=dxfg<W|J0=u3!+VvT8ro7|n+kd|KZfAJtw`WzTz<C@Wbtk@qW#{GW zUub-bomCgSQywZ2zlP&dnO-0VW}x}j#f(9;pTb33f10Ed2Bprv%(3h(KJ510^X>2N zhQ<D9e$;D+I>ZM<_~z(^;7l1lQW-+F_cUjHUnV!q%V1luQbjn%ml>!j&=VlOm(8fV z{~o7KU|Z7a!OOp%ex*tGpnackn`wxzkfnq7stTjU0N*A}ed$+q!RjS!T9YcOYBy_6 zy^gWNY^f<ANba+Xa9?hJ%b?vr&p2~E=3|zJn*58C_hmhvW!%5dC1&^Mp4ZxZwuoDg ztJmWd2X+!!hMo=sia<6Mh#T|$W^@Zjk!B;qNU@>yS;VY(r1XV--NLUv+3u$MvWiyp zuDa<XgC(>Y(pxA?{{H*?`_0d2SvdK<pVoy@3(?>yV?m}MxsVnk&L&!^Rz~1b!-;e4 zVRVsjelcC`LNJiCy|~lJ2eBQ_*DU*lR;mQXI)jNC90Hd4JF`AHJa<}PC@ge|#)D!5 zi%jRiY$Y&+%xHOA<SI#?9c?|uU~U40VA`j|6rcgZrtrv_q9Cj~`GHCKC?vJ1^xdid ziFzUrlPb(`gu;zdUOJKAyfkopAM1PSz?II>h9idr#<-fR|HcTXt@e0B?B-Bjl<j?^ zJ?OY$Q=yl?>IJw6@lon&7SymzcBv>i2qxhP+58O(7w~yr*88X!(|0ms5V%*fc#Xdn zykzc@zC0Md@np0V;cXXz<Oei1#fezlPZM>O{V$J)LuU&aAJ7@R!L=CED3I+C<zZx$ za8<!DVhXx~j>EBkX=cd$a{7&ql@_#Fpt2_lyuv7^+?cH7ma9tUhs13{JmR}EWM$pf z2IO#duRYOb3QXTEAz5->^@m?hOfeF5F}$Ez43G~S`}$2vYbk$zUHTgjV^{$r-iO1@ zvCWBZdpQhL=a5Bt<yh&X<TFMnPpOsJIKD*t`;hA`OclIK%dH`N-?3~ZLN1-$a4YNY z&t~c-NaZ{^5ZD9ss2=x^hM#XgEYwk|u*M<pScVeOh-lg3e)>QYvCHneiG4MEn0dUP ztrT@JDsB452ug70$w-&c3js4o;%74AFV<=C>bC@LW5?kenj($_VFK3!SqcvmsknC} z>!H>TV<pD=-8dh^B1amSMKj`;b5&oD?2{!4KzP;?nGKUHY!@fSKR)CZ?ZnvV2!WQ@ zM!9iAjcr0jEx-GlNCaMn42vZS{`umk<RyijLThh_jC0_4N<A5|3Q2!ykg;3We$9o7 zHz0g)SFS-ZRzqTRHCUe>o6~4ZnPr!UQ17moH^vg}J=q{!BIe&Xav)7V7i3s-HC~1E z>H)Oaq2f1cUge--M4O<(JP_$)a!&^UJQQEdtw=Y;S=@yFFNXuo+%cafxPX`X?_deE zNT^Ur&2N6%Av8C6WQeqk$AS695hD|Q*h+M%9<!D(I2}h#-`8Ji4*}R{NHKgtZXwbf z#tq=)7Q`4sn9zaPNeFvs`rV6!+sV-hAt-s)cfrh2b(r1ayKGJnt2~z$GEeE^{oEOM zhL)C~TYI?pnkGALvNplchO2n7ZuO<Mw;s6|nkS^hOOdJQh<O6=W7hh<R(~rZt>m|J zvdZMGKGgr2uKt;`6qT^X6FUNzd~fgBDiLy|9+irWynzwUywD`RR@;x2_C6ihE!wBt zxqmKu)^6LI{?@3{v9!tGtL^j!;v{sd#x)vtxq0w=$%VlAoBI!3F7vGDNK9uC%(!|I zy4Z<7dLPwzeI$ARom85?gJfxo*)Wq!&7N(cNsTh6XprHSYdmbP@4aa3D=`CqPxm1M zT#?)C29}%;3Lp;)v=SW`T07;9|MFK<PpX^8!{gA-ruyk*(0@jPc-&yE)v|YICM&)E z+eb#*GK$QdFVwF`<l;ft&1Z@l$<s%d62(O$L-&3n`lXKpGhRWKo=kpWVvKC)PY7Do zY$);XUKj%g5Y3AdJddCGNmqn+b(y7RlVPq|L;i;T)}67r{?r`PpOt4bA$Uvp150go zr+WTCxa38og;dx96)~6O`P4S3m*vI#_r8s8{B_YDmAK246q`%6ywaPLl<uGv2K(}B zxl<W3Hv}@5+OZJ*9+r^_?HAtJ8uuIB@R6xXgo$FWg!vbh%HAZo2~2{2886Iw_Jyu- zi8s`#siSdBfyLm584(5F!;fO3_6NDO9+o5F6|aOG-<gf|J0B!y(PyLyyu}a;;}I-d zytfTKf5C3sb3Jep(SYUd>jlfr@IRa2>i>g}!!dpIPVY@)(@(6(BPrJC)x)@E7FH^f zv8}T}`T7IKAqxI00Z|8&S&0Jt8H|QGtJA%z!j~C;<T9!%iu04);Lmp7m)?!}_+Z^7 z<)_X}znlFm(F86le?Nt<$+utpIK?W_%-G-K*q!>Q-g<12>sDBazn2mf(5m)~x;;{K z{4=QPE!R&Afo+${V`IR$6)^!yKmU)k<i6!t3*|N(i*l-Jvju8%Ig3?$yw;-k^6ANz zaEan?!^-DG(vmJ8F|Rj#AOW@RoA-!lf98<;OoXR7tCVSO%K_r)kvF-tP90SYgD}qw z19s;3^<lHjninfj?2eA!?<_fwKwLd>LY;gK*R28>-sW;s6R&d5O{2Fk9@$n*SNUM+ z3sygVvdoe$kQW#T#?kxc{+0R$iA7lHTn~#;KT_^wu}<HS?@erwV^NNdf)2g$a8bY@ zXgr&A;QHRQk1+Rm_hHvNoQ%S&9L~7ruY}>y`=+#jr$xLwq{sWCr!H=vX!fmJwUuOi z;TxkRFyGVmq$3W}`nITY!S^Ch<i5FY=}kW#X5W>3LY<;`fjrC6Y2VmohS1T9KEY$; z;af&Pk(fu;y-AIWonu($J~ayUIWpQs4WAVMve065d-t~Mq9y6w7l)sH6(!8C<7geP zLnLLkF5htdr2pbJ<@InYfsLC(z)AiY9$SM)gt9$y6NVre$DadOSNf}$7=cMHl%+CT zZt5Jj;H`h88;(7{Z)Pd@BnHMg-Vl*-a?4>bdQ0xwtEMC8&2=}EZ(Go^trtU61D03? zGq2s&a!RJw)<<OqqF<-({Hedg$m?w#fc<zOxLd^T=%?LB3X%`(Oqt~dvdV&a>N1b$ zf8QPNy-<*-x`h7$IDpj1AYq8Erl-t^9pS!XMvB>LP|{y_g<^h}5NU}e7}X2z-=y}R z`uk1cS&*j%8sbyd05h2`7@66+lBj%3n>?xuND_m0;{^$t7{R=zuL4b9kX~#!zqmf; zeO^n*9bVpphdJN|ur;5EK0gXvxI$AhIIi$ew+0{rDReyve5eD#2QKkav<l=Kpf`2e z7l&BT-&md2)T-PG%SoHcAzv2~2+(90LfGiX!1&$sTu3O8ZiAx<(dK`)p8xTd&(=)6 z@v@}TjMU_}J6Do{Z1(%X*{=boPgcB0fYC$*r-KxTbs1(W;^Pbi+dedKssrTkn>E0b zP;}uRj+_%V-K*nYF!Vn=cx?3fQOu`4!X4h?${vqEQ9A<%N((Zf5JyNUMPQ{FI+}Q2 zNv)a+A7Ti(z1#weW*^an24T(-APWcPnu90?9<<=sNZ=tZqug8G^G*^MbymkwTH_(< z2aKKSm4M5l{8Rh5Tp9{urjP_F$^He&vWku*7W@hs7?!JsWaspiyAz`30S9w>X`4jD z!a?hanjH|lx&zb7ND;({D>PBV7mzrE`9dx+?V(M~CI%93{=&Q$CHP7P3qt^V4vv>t zDR^gK4DvZ=b}-C-8_+Xv+;kw_14)kf`#6yMaK2njD)=V$iX3uCPQAL0vWY#K(Vz-f zjB)F=dsa;Ot>R5a3y^`dq9|+etflT^>9yv_drS+DJhitE7zS`$DY*gpwFrq1Dlf%A za*n>rGR9~Plf1$fTLGPj8v_@72ecrIhQShn<tsp#J8gB(qV6WU@<HX3hoaYz(Dun# zmmos6xj<5yeTZ{UJG>nEN)%@wXCLuGf{#xlhI0w4Ucu~4mjb@TO}bA#vABo%olr`$ zBHi*?AmdZyXoVJsj+<%$&##TD*F2-#YZRH5H{j@HWSa+`n`7pm0CY<@nR?02=2PlX zL-f50+};pkkGn|zv=&psgSym<=Fv!%^`=6Tc_r_<kZ%aQ4;diSfxD<~i1Ihd%irT! zqc~FjgybBV>H8jz^Uq0sLw}<zbBU^A^IlQucAt_eNmW(cX-|i4BGZG$x4Y7DH%X78 zYT32{zcTpFCFWlUMyV{37$n5y9D%Anx#(p?d&oJHP%@a9-d#xb@G_E4>xz8ZuV7Qd zA!||2=M<|z6Su@xy3_Xaw1rH6FHYbJBT8tQv4Rwaki!40f12hI{`qyfM(pSPt<&{S zJ^U0=i20_t@4p{w6{J2v&ob~EuCH$ikwOinHBJ&58OnNbA`#Tp?u|QbZ|m6jcK{+g z1k@|4DdZ9FSYz6vxP4sMU=aw!ZWm$c$wZL{Gs|Nq%LWVr1xdes6~XUG{})7kAcE$7 z!qatSMph$~gF*fk?dRYN&&(=2aTY7a%&!q9y4FG{Pb_>Av~VX4Qi?Sq3ZO{sGo94d zxnkN~i?_bWxnwwmU0$3rX7U&cf2NpeT&pSMKQSC8fv`ig0KuLY#=s^2c<6(+9`P>L z97wq;L<T({wo_4NbeihZqem3()qPM{aNo*UQII|!syaU!R+TCD2D{v9MLmUj-bx~{ zoc9X68V-i&&Ys6!m;Au=IZcJRt}bGwNsbGV`%(3F%O+31Y=jM5OkRZSHbv&0Ho5!a zDh0}1Ul8KJHByfFY~K>eE@AORv{C{!!O7dCRjtL_L_g(%Tc`UWA+zmsyWY>2Z8kAq z*!MfmHhYXTg1qvB*{SQIjvkHCeweI}=DSlkf~S8Tn)`CbE7sq`EXNgTZg#kycilqG zZ#Kogb?Ya+P_As=q6=8!d~32(uQEvck5o;e`q+`{%7I}oO+nIWei9R;M(bP}u65FI zzMTV{r5sJoKIyOwhuJJdD|BF}qCGp^C-e3@BX;5)xzNwk#0Hb0A@e@Bgc$xGV{aW5 zb-eBi&rm}TBHhwR3<iSaDALkhLnwlvGzbF>AR;IzA)$1KG)PEy3lf5KH%NEAU)*P( zefK`+uJ<ngU|dTVONV)W&+|zM>(_~t(ob2CW_o#kGI;Yr(%knQ7u5m=Zj^wg!_mr? zsmj;U+pnvUsG$bE57Z_kW)keKy9F8xgj%W3goGq-sl;d5lz*&_nw%3^il4te>uxMn zvzm_naP!RX)oty(+_UkAh7i=H=P)%!d!oYZ(=5@zn#d;?GRTn?wmfhX~lk00yJ z=~k1>-~!It(94Kt+=l?L&4^?^DHz6JF=5#bQx}};7CRG2LX1>@k@ec^l{}8WS&F7I zHeZ|j@~4Mp&z(L8jW&kWWcWQK6qG+hO`iH(G({&+2xtUe?$a=EukU|nog3Z2C}<0W z)!}rT`ZPXr4Qd4J*PL`uZBx>6hGK}eE(8S$bWYl8^SuA~7Rqk@oA2QsBMo2ffT0~i zdo8!8<aC=<qYibw4!fl0)O86vLU}y}Gt=-w;gBSj!x*xI-o=$Tdp*mQ1G{H8s@VH& zUw@<TIBXA2H=am$H#euaS?p&MJo4ky1J5t&_hUqVz)tW?siJKBt|2E%p4BChdOnx} zahz(K_8=X9rYXz)R~0gcYU4Lnl+?5yL^Ve@FCFxv4V-QksIjzzfG`anRLBGDQ@9zg z<u*Tab~~?0GQ_{=lBOx@vua7{O505>ZJX~2u(KvvVsraPFHffZA_sHiq&&W@ZS5jd z0JWvq-!>+tuJcuuL8>LdK~qf~W5VC#<HRuZr~f;3U4iXRSCv!rL3OWkzT4qMv~CAB zdnNjpsMP&+!v+{sFmadg=S<Jt?2&M~@-Y7UPY`+6CyUl~6iaq5+$FKo1_bqJkhAdP z_%#r#5D`5^og~a4n0VWruBLmlT!kGu^T*huFEC8{SHmHK2I6(F?k@Q#?#p`${%%-< zN8d^5#VKxPHP&|HN}YWh7sR~?LfF<~k(pkAFilb?+^@Ud9o^)q@bH9qWySaGP;(og zZ=<DjSw(4U9bF<sa*61X<P!(AaUwO5I5e7Z*umk?X@kva+}?1Ch34u=PONDAg<6=# zN1MomKY;C2sww&-u2)fEu`#}Ow%ZS%$@N2Z4xBc8kOF_(%N89Ew;iSA*B>z?!oOp% z@Y&Ojn1s);?6EJ--q68vUsJDnArlwIhbHs!7jyjyirR^mO|n9ruZC~@gGt3nD7lS_ zpDN(qERFWH2kQraR}ul#A1aIErkT4gx&UM1o4f~%QqY^uUw}no01zhyC9}s+PCSSs z*pdj(@S%Fb-Lb+29BXN(QT&Ge;1BVCc_W^@3?A4%bI!cg2cAVR*b!Adt)3GF-7RyR zn!SD{%sK8f58rm<%?!P13U>$SBo@+rZ78p?c>GHLK=i#M{P;rEO6IpX#0pD<z~_U? z43>Wwb*?!!((hbR5UUWDq`fSMKL?A#hc1)ILO9Ih?nAMXEtg^LxU3M`WJ@3PI2lC# zvlG^DS%Y8+XdTd7wL-o$#gw%}X$Z*fx05<z!F?=(ZOC$ompVSl9dElFZJA+Zb@4+P z{FPvPOC$3gpCU^ak?v;WrU~u94dht(kPuly>PD`=%xv@a8zbP1vmq3?(7Pn|Qjnk` zEW%U)h!fVMXIw^tEYYlQ{;@R_4t9}H;=AQx``>EYemt;Gs8;E-`}3L4eqly5@X+S@ zHeT-<z=zTA(g?pCD=S6DhrVJpauf78cp=9-tFkjKV=l?YoU4oWsK;)&ExKsLO_5#s z#vsbb+GmM)NZqG!`wUtr^;?9r3?pMM{zg>zXOAh;EZ4$~6j{)KztQ4^f6DXUyMZ$U z52HvVZ?#@<x%~lF!=B$g0Dpz84sOSrgxy;a7`m~ZDu}0%sj`7jL3*_kd|s+}lL}&k zhMZIjh|ct2z!~>kVu?d?$Vs;Ie@IN-<(4k7&$~<QnwVdh;sz4wo<UCEPxUNuQ!Y`! zndDVdyJog3nBL}YO-GAxB{Vnvnwx2Zz1b7NPu^X}w6BQ2@n>g#H@y4WWGA4yUD04h zfi50_ksvt>{iWbm8OKy`cJOE$=ktx*;bB^eM+bM&)$Q^Y?4-|~rRob<*&OT}q#5LA zu{#totRaP-p^~3X`j-XfA571%xfFG=@VPfd3K|_34(|j7x8LBKHU+BGchWRC)Ws}k z(Z3-6kvD$|z5N$E^N&|41<)6&PagD*P07%4$L%eq-L<lp!t>A2p3XYnrOLu?s*GY1 zI0(fOikI|iHOJ<Q`IHCWG_&vNLi~7EpSPL9KR=wItYq;HN9UZgq*Uz&)LtciN8GRX zKpj*NTm1~Jy?Js>ix|)~!K7n6Y3`%(8%8&ie4Di6hMncFqPbi=PJqf@3w5GPQnm#E zGIxvbZtGT4P>*-i(_KI=G4N*l(|Imb=;e^SFDoPt&&L2i0ADtkAs6{=v*r|<cU1o> z5W4Mfzqo|s>qkO85~X5BG3QTD->nj=5e}su{5g+mh*ml~VTK4W;QwVrEJ3#rr5asQ zE~vh_gUPxEDkX(oo*{X2AHkXLjl%VoWD?tll`j47psLGMoyoqARVZMWRcZ!LK2sCo zTgFXQjHD^l&!J;BAC)CCF-&<>(=Am)Tz>usheANF5K{VL;<1I;s{_xn&qaoahsVqX z8ew0x3mPHkM4fb$$Q@BA{^51z{*(P^6PGf81nM=?IqH?17^hoveC?!a_Xf5}01b}! zek})2`qwr2enoVM6o!HY_b=X%Bw|Z4(!|RYDDhdt0#vj?bgW%n+TDw#RL7*+O(Dc} z18#Y~_m#RP+@dow1HGT1rbA)*I5AtUW!HnzvL6lx_gW-K`?<bP|I;w<2hhh1rl!ok zs;YHck@Bj}H7bhXcd523<#1Z8qW#tvX{+EGge3<<PqwBcWJL_S{In5Ox~3~mOY`ln z6~5mxIfT%|E5E(MwZx=&_*PLP)-yq*nRk-lf!D5ymyEu%%+%TTDYMpm134kY0!GM& z*-jab<VfdQ8%`GcQ^Ck5G^rT<HH#1DnC8WHpl@Tx(QN1f@$z{TLg7AU7AJkS3(3TP z%FV1}CtyC9uBlpf@lD0wVau}3(vXL?*OKgDn24HBTgO*$cypo4Bj(=o=1tauBdGr! zi%$7X@2!lR@D);~vyYQ*=PzsbmdLfU4Z;*7`5p*!Y}Zg@34V86FbI^1o1HBlSnHy` zNkq`@NwpczB_&2V8K^$+>_fI)9TQ=ePFf+nke<(}=!8J<l`e*}ea1022g1;#xRIIo zhh2|rNCBc+xZYoQp}Fda_l~(mC)Q@$gK`qSDm9|@`=c#4a%R56F8xES4zJB_o?&U` zOXgz}V!tEh*kLum*=ejrZ5+*Vz6uzOzp3-xQAX13KwCU$D0E}Ari3ol;}9e5l4vy_ zVYD4{*GB&QWIu&JRw||Jr6^v+0Gqw~4|+QR&fH{wLaKpOhI2$uT!zmG{m5(A5L++p zx**eA7)x)9o}ilr*4l}MJ{{z6U7yA&?@Pbp*P>6i<Xw)8o<h``=<Jt&nwfofZMu50 zTju&SR@}{alIiL^dqjY)cI2-+yvEHZAW&ss*L*_j#)6pRWAHjrbh#v%CdHq|(PtxT z^;HXopADXgNzpqKW+tH8N{2C9{gO3#v!L&lPeS-ypOQ~IrFzxros(k$ZjvDBH-y3M zM8rT>=44ThBx>yI*Wu%(Qsy+%@-@?n1%>an#^w8aC*ymf%;RNTbUVf6L%!O5+->vj zPpp!FRk?FE;~SMJ1H&KeK)xG|C4@r~&{1qbIj%F4orzad>Dii@1`uJ1Ng_3x6%hHP z2-+0YefZ8Mp@r1#Bx-sb(+G$T^yklpsz5&ud7m&yILT8E%BTxSZfQ9^8hd)(pBkl> z#H2SUBMFq0x*iW|`1F3@s+9oSLFZTcy%j3%;FGs0*CT%A845r2UV|9>sGEKH4!U4F zt@&pmw*0#JaahWtP=Dc)eTzM@Tx{u0t518_JD}!;5y0UBS(M|z3agPQ=@kJwS}{Ro zK9CH*NOQdj7c6&KEbd@O2t%%M)jf-ja2fqgTvdE3H)t9OPQQ!?P_mf%>v8!wLW99K ztC_k`iS}its>#vLX{C0d`nJb)8?w_FeyhF}g%9D?`_=8dU@qN(J$HTMA#+NB-~ov0 zsjt(WOy|o2^yZEpj0seeSZvUHXfkpWhtl*v<OFG2)x+C(6tedrnlspi94GWnST01e zpLw~Nk*Gmqu4U#SH!~qhWG?c}_n>1upQzAEQ};R9bPpqTNRm1Dp~=EdSSz$8B3k=g zax?{%2Oo8Yo}=r3wNr0vO?l|3#iz}2&o-6t=ZKw1bkZFh1X@`V2pk+7R*fIShB)so z799o%p^e%hyzw-t508uwa|&uT7N*UK%PHO+2j9Mxe<eBZA)IbB4W&;KoM+Rfo~I-< z%auNKn;Q1sT>qKuhvg#nLv^11#W~?C@kiwBK@J*#^(>7t>mf3G(b#_n+31#lV{pAm zpC~OCX<Jyz8ZL^jC3#dtV~08f>jB%#Mv>-Gzoi<oggb7}W@$r+Sl+^!d!l_ZU*Qn4 zDT`d`ycekNJnL5Lbr!cXD>5)iwI{$oz>^DMinKoY4kX_g+}MBlP<;C8UDBcJUP$nX z>n)^)897*8LmXj|J}a2@ML5`d1tfWiABEvD8_PC^N2LO({+7~x`v(p4?1*;U9VI4K z?E4aS)qBar@$4@`K7E^3Vwz=@INKqA-YX46SosOj?eYoexb~*f-G*JZj`k3Dj_C+J zw@M-hE%uH`=gL%JtxocUH!kiHCK9N#%A6&(g|+Q)gxd+sQ-Tk(l}<9<0H<chgi+qF zn58Z(kjUGT(b=(|m6q*a+nF7n+n)Lu4e}N-^i`f@PvCJj!9OGP$SS8o{}W2s6S6<w z++-!85YQ~6_~lVddVVpsNx1HB`1Lv~1IwRZnX%;bLgsPIfmGd9n>~-tVFx<fl^o_! z`-2S$dB%MCM%Z5FkF5z}ar=6~N@rZFd;9m9t#l#EsDW%koa09L9|(sZdVhTrrb98^ z_0}cUYNU7p^L^gb#~F^NC~YZGdFs<c=9YHU1PV5!Pd0|9vP`BLwn>e@Sx*@G3gpWq zZQ<fQgVW!>IeEjfX2yKv04~`sX;rUQyDxE}x6&}3%Ru}d)uQul60^(5`<>d$;2pLb z)_&sfHo3|vmews6`XR|!!RfQ02@k8qpaMO|!yRAav---zH9Nk^JH6jBV1(nUyG#6O z8_eDhQA>%DH#~4ys1@tj;u(PeblGpP+Woo^$~26g#hVNL-h#<oDWlTgp6kAtDj%Wu z!HPi4d8c@tm5+aGFyn)c5yi!I-NgY*;%5Z@SRbg<fRMA*u{!DFOvIAQ#s2b$zP>{% zU0|tNrsG1FT6|^c^0e=!RewqEih9D?U)CZ;7l?=SR4or-^x!EkOsFOjvEO2I*+KVy z>E$KH@3{Ycj*iw(t{-k2*LXX@!IP@5I@q!%x-7)lImkniWG~W7Njq$NpoBgrA3&Jm zVN-Bgcu~L-9X?k)>M+M48hBVpH~y6aBlg6G`Cd?C#d?~d?o>h@A2uda%KO(WtUk@e z(_#Pe90<o3nlMwMOzeIZDn3z2M4fna#^W6c-C4)hK7bu2A01f_Cf(ndJol#rr9l1c zx}=*IrrUBQLZdN4IoX1_N0OaUt}a0ecT8ebIFu-Lw@;7FQw@YXhdT0zS*IJ!4u+|E zibh?c5EI!33j|VX&v4!+3mA*3#g^qQkJ%mcT`#4_`ElF(0!G8KIHvpS>vkIRZ)yUN zl__IayHOQ^=VJo#_Q%=U8_fxN-o3otsAHQ9BkHqxu|P!)m(cnaVG<`n28QHwJkmd1 zI&+C>@X1THn#`5s>Bi67*JXJ^pQXPSVrYvHV9sYY4JlodQX8Q_=;$!wxpdwcMa~4! z;EM<N*4OQnY!>ZkAJw1yx`o)+FSHV1UhQQjix2>yj&Ob>M7L_6x`WFIESNIpo~?x3 z;;!TJUs0)qH7%P}pe2Sx*Z8Jap~Ip~;<fCEuE*7bcj6ovKVa+!o{IBMVP1Vv)JQcj zcHxmJ+<QkrffveY*~2iHtt58SxH9eQ;<Ea6s|K5(2&uSZYFnua-08Q5s6t6Xs-?07 zR6^`bcYvu&h<4mxK0t>~c;QWoF9?_Bore186wVWnJ>oW<Q``Ai_89mOv?gw4f&ze4 zpT^_}f>4>ETz&o|o?OP14HX}zd6Ggo^EI6F>(tblkhH?j??uIa5xi`=oPhK+`g1nm z`y{i<yw3`9A!QQJ@`-Gi-*AAmUzrUzq7OI5GWqV0S)?%HA&HPo)j8M<`E>($y!7bC zN%GCZWfQ&Rx2Ws=UlO?Z&L6@+K841KEK`<T#hXg#qo7KtJ^D3*3>z}~jx0oU4Jpp` z-D(Rm{zltu8H%*fyGI)NQ+Ap3<s(TeW*@&3T=9mThiD&BsB5b@L=cXgTk~hVb&(%k zCYzGLqmia|{-KLN0Q{#dR$}g#L_llI#r;J;vd34rF+<4UPw3VNTGI!d9?VNSsAt+( zNXq31K)PrBFt0g0ic($<!v#|5?mMQPT(UzxRy5ZWwOEV4(GdR9MH8zRP!!O(;F}zt z24B*ru+}e%3L0{AvJM!o@zF$y!h3nTO>%{ShkWN-*`wl+BCa1_?qq(2gUp8L;^lqn z%hJ1+X)3Kk|E=y9q^oefYl=-+z7PZDCa!0agw%D)HM$}NXE{jo&+aHjUr%UPpqo+B zo1MWs3FHgXTX=8M&q91Zv`6~)J2-9fn=`a{zlgt`xn$>+0Pc@&H?QY*5byE*j-bcl zx^L!We$#}OP_wWG4)AV7WX5wH16tgqA`s5b=2?-#Z9LggkQwIYu)hOoj}$yZ)9m0Y ziM|7Mj|j&GBZ;04IP%sJOT|uuwo_}0;5Ty;WlF*SA(~SkfRt4hvAFLCdg_Pa5tdtx z1YZG5Q6Xi0DgGd!pWv4P#CWMUo=fkBV~SZ5OntPf|EJ9^b#Y{-YD6GJq{?OGrG5%7 z_tB!E?E&_x%4d<7i%&aJgWsRPU1;iUL~Bq-4YLPhmrB`3f(nW~^v>5WOE<Ufde~~P zfGw_9UjgT6r?YGK2=COGikXQKf2hWWd5y~62k2E1O;KN7@z(pBu#!?()U($|4zsEq z{aD!i8S`sxUHgD2$fXGs_YK6_9U<#;D|4ECVN4Y!z5;b-g^k~`dkq~>d(SzZg~VR$ zilVB&!A%d}M=}rO#3WsIA!;?|yxR+*o<A4mR(q2i$#U07nMO^HVQ_{XsUZ`si=sJM zZr)$g?)mX^_rZ+M?#}ll07DxiM-G;<pLVIOBuD%QCNUS|L7r|li3z2Nbq4!wBQei7 zEF7!}4e?rk6ZqqBi(B^C?5%Jmwkq}igNnxfw$miE*E6=+67=d0D)cwd23u4&=VTGd ziY&Otd#5W#C*hH-_034jMOe7hRMwn2XTBII=}(dAvg*pnyV<$sDbh3ayE;E{W?9BA zggU8k%z^XVJ{96Gt#49&U=oi$tLCRZaz8Z<YaA@rE=lS&6kbajMw<t_UxB^SUqt<} zC`gyCu-zXRg#r`v6Ws35-$*lvv0?f16-7$=VLP29L)~|GXWmnG_04D32D#sL6-Pkc zmD&tv&dGW8+KH*@!DwevlC*8|B|nL|uFI|s+wOH;4=C*_!aa0;u_8KQypk*7J_95A z8uXThIHv(H@>(nQre|}i`HK!GgS41GeA?4}KrDH@kO$Mr^^AqLS*r8ti34Cg&LR?G z0}?ZSJ#QB@p%rm6%0k}K4anFpjyqc(P|$2Gp-gkUNe8P0(g;qb_7R>uLlkov=Xh`) zq1~k$tn`KNlnA!whN#f-^emZZ>$(1S4HCJA$ehXaZv8(QzUKiyW9@2fI`F3nbY4iE z*+;en$iYOYyb7PH2|8yXXMl9CFnvO%Q`B}vBjlJ-(fc@ZDI4VQRKvY|^HOTob))UE zMdTAXf5b;f0&joI9A#b7O#F5Wb>`PsvU*eEo=1UCZuQ|222m>O-AfR`y#I>bS|YO! zGp%#@bkf;*JC}b<!Kd*$mrC+|&l#0(?f-nZjAuKEp))21R%iM2reqT<Zj{e;2T4v0 za%mK!R%v@GNXwZUUka11+m5dr!V`0c-ynKVM6IGkeis-%#rn-jmlVQpIIOWMra2(x zeJOo;7L*EqBwQkN>ugHNs^z`*6^2d3K-P0cRL(q(W#7cF>O4K<VyKGf{b9f8H+Jwy z8g(!P)afJ}G2;Iu)y%V@dK)0?B>yHkRc;6~d_(wy-cVnJ1@Joqm-BQn4#da70qQdj z&XRYp+!^?82)`WF(!VbI0Z_~`;D;g*v+$VU--WsV_}zmmBh=e{D8n*U5(0y4fQfGh z5hcVU%qAkMol$~y5~ODFZ4Yu(wv^(Iu2D%DW!LqTbm0)LJ;yrUZX)l*e-vKc%*H1r zJ2JO^+jmw*<$L%SW=$d%6d|Q<%6?%&NKZiSJX8vqA4pBeL5%x=G%Y$cfCJ?QyxwPl zesN5A_`0h^war1n^EtaMy|Yo(Tk8Tl4`^Aon_6JS<gmIo`)*rE;a$1@K%#^qZsLt2 z5}ua-WnA__%2I&FIPwP27}If&XWGF#WB7^qz32E1s-8*9NBUD{UP)V_W%WW|8oX5o zKk)yVY>IkihP!%xD5=GYHN8HVOh1KO8wi6uu5?*xnN~=YsqcI8wvRFU&$M6Ai-l-@ z1`p+chYp&KUv8&oz4$Ii`MW<mfBFN{{RBHfspm3EHJr+Eol$0_`kro(yG*^N&&Yg; z3$^gjF%Ot<i54<H(3kz}=P2M!xZsGoUH}&D$C6Jkak2IM)OV?rvzDc0Ucb|Gh!()8 zV#A0_8&P}jno%dcYi`^9k_-p&qWoq_AJXv;_}pBsdF}PNl0yph26S{@u1O?6qUOgK z`yw{yv1{36Ns>Vg@Vk?J+O*l~9;q5qtWcu#sW25F4dV3THQbAoZatBKpf6_Y=01)^ z%81<OCbU7req(LCnqo{*eYH;Prc?y+&s6#H;IwuEF`{pKj<=t+m&#!U^9x+M{aLTQ z%k6;yVl63pn{|J0_N`{ZFc4zf5@Y}Rw9~M2!%z0-@vbBh{MAHc)LT;KETlF~w7Ic( z-0`%_Ik6l9EmZ+bR#$l1e{b3n6H$rfFK+d9yyrg=0yw~6sYhn0Ph(#$*Xpbb<6aD@ z#VQ5Z%Hx*a2ipjra@1hntxyX}n`8T%xw{Vk2{Fz#->Nrz(YN?g_qp@T8=uDCIr;ik zAdv8w(ChpciZ`2)dpzrg;nDfH<qWk))DL16^3~Dr)Ojc`q45%3AQW6ys1!QRW1U^b z6nnu+tuT~Z@4ccRw);5XMAf8zYucOV_ja3a^!WJR{(Ap{AHXEFK82d3Ssev7tYQ(* z!)y?s?zddvSD+Scxayc|UbfTH!Ky@txxaOztFxFh`t4}Bopd6m@)N|?Ipz2T?a_lW zva_?`FL$4uJXU%HQB|fdpI3^IEI-;xn>{Sc8yn(9b%awc_eXZwp1sM(0qxP!MtsU} z`g?Dq1P=5!nq$hI<@HwD;g)^%IN77kG&kBU)Wxl*N?H@6<z@)99?n%gJ!qMVeJBam zYKJ+worUY#SlT~A;A&pSjv=SpWFjF2G5^d0AWO2(BsG3MQK`H=%hq8(<{d_p2snyN zrB~6#>_ONKEIw^gr_R(HC!WGy^_Qndb0Ja;+O$0)PC2S=gv~xHWeGFEHU;NoJVF#V zwUGKB<uH*<IX#f@>tUUuxt_qh5F~g3q-<J&m^mU|wYn!~xrU9GHb>2_w7Md@h;fWP zQ9VhyctPiXkG)}6ncMN}c?*|PVclc%S99$jzsO#ae6yX1*&_Dae{A&DU+D|v0DHOj z>awo?kmCz<yK2BP6Nz<kvW7T0Su0qXZ3$Yv{8$(j3pye!HfXV~g2Zr%sMz0g?9rD8 zJns7EK>Zh<A16cx;pRh{vNyuH3H%)@Xm8KHuYNQ0p4owAo`^~QP|2V|q&~lG<yhXJ zLv_}f+C9jKMe=DVY<8i(x}BBpxMY~sL)<<|!=%}lU20;#<)~JM)S^BFzH?2=L)+_7 z4-atyYj(vO7hOV#>Y<XJQRZuQlja7*ia$bNhm4SOjsgbqyZ=!8@b3&QG~2zp!S$S7 z1s=pKFuRd2K?124RXt?O^NiaG7ZD58d&-fZN=+Zsn2XKng?}QlIQE~Gb2{J(y?bRj zH%{|yg!ne}|Ec~?gb&-523<LcX&UK41JqTAKf9?-93Jm<-^p9?#X1DxMTW;LDVwI{ z5D~Gm&CVz#&kj!Ut|7l;n41rQeJImi^j&O!%{yupT-g5J-w7#PV@dHeM~l-F!Dbh7 zak7gTEnRaGZ3*arT34+o;zC5K-{m!aq!mhltF*!htDw#<Pt^J)h*b=>8x+glmNgC| zH^hKIda&F(B&nW5S)3CE4gSb@&S&UBLK?a}n#Z=#=>^}IdgbGaS%i}n>K=r2MUNDJ z=?%X-iz7cTn}|B?T@%^um()|sn;%NqN+^i5Fow$Zpxp&F%<FM;+v*)r<Yf<Et;})= zl@n46JjzSJboMHi4j*S8hQ(s!M1esJ{_{3zW3)w(Pc*HFxNG+#(I&_=630gNmyK5X znK)eYjLV+`&!!V(W+j7mY(r|8d>X{REjVV{ZMstShjs2D;ftCzLknfnmFkawp$9ZA zg1d{?Uo#>4m}}qjZ5zkX&nqp2PQFp<@5mgjv{hoQk)~*(>MZ>oB1=g(W2vUTpl{b~ z!IER&sxNY$H0*NQF#EBq&22)93E4^z6t7+ft@-6tsI-)T)=}TCy4ocZ(}<Sb>4VVk zUjsk9{F+dF1d;Gx93oQwgH26O(GJn)8%4g2g_2_#FL`x;Ox9ERPZ$6Pc_Fqx6kpPN z2FqCFRaj4gM9u*Z5Tgx$;;sX*3&<RiWLd%{hk<kH#Xbc9PFfIkz-;~jK4hFCg}L<W z&$L`?EKk?kPV_1ZiV^z$6|Q%KsWn<tT&Jko1WhpA$dvn%*<|FEd3S*^vp2KAj*9Jd z0XynwdV<woRbn&bIAo+`vy7JKCm+JvM{k7y_V(v=GWOu94Dj>j9`bO_G)UvAo#VM! zO^lKZzH8`Gx$D*X)TM!(?^X!SpDG#xM=Uo&>cAB|ZoZdeyDia!Ntip@6PaV*lJX}+ z`~G3;i;s($jtRh?9!N|~5r}S_q&gk&^UVHnICa^+8C*Lh4<q?gFiE>MXj?y2eRx0W z+RLP^ad$+vQmpIxQLs+F-i98`?4ombZKFKj;0;wR#DD)guS1yY#KBalpyb3d3!7p5 zpYc-cNPf-H&4;&h<AEVI8E9s=(nV{x{XCl(Ep7K#GWf$HTnu~d+e*hUflm!>hQ6v) z%#%ih3hm2B#j2sOC|WO3i$A=CZa7df_nb-N&FuLZLToD*vhh5Q9RIQVE%^mJlezou zFVK);E%fD|3h8EfY+#a~o>K6lh9=9O**)D`?t61-Omk&uuP72y105E%XN6&+UDIjr zypO9Jb{4vhFBNj)Qb>CLV?6vdj$gYA=3VeW=h3#xr4Lt<@s<m1rpT5vt;B~O%Uen+ z{eisC;~M3;wr2x)i(RFj`f~|9^#{2=N3-Qs2X`xTn@5Z#;0)c-h3z+pYgHOcx>j#@ z+Nsj0P7^jMs1W)F9&I?{D{(;VDW&>x!f~f~1k~twu#eYP_B^Mfcl<Z!Q;0iY+bj~f zr}49UZb$p}8tkUzOpO|ds+>&9x<3ym^(fxnqg-iHbo;l1{>r)^SdI5Ih~YTy+$nhS zLZBZxgQ}@gKd5-IHx#?szp8C>9(#>tPsFd;^v5!bAzu96y3<Du3AAel!+j?~(*tb0 zo)ZkiF5&cEOuqdL7IE>52X$v>M9Oi3{@&wKOS-xYC~P%a3W6m2Ae|ps@?nj{A170C zza3Gw`c@zBsAcwS<SQf<PNWpq{J|G~ITZL_Vkfj1N6hlTlPk<e9D!slIA3z9elt+( zLjosP&-bLYcu5*n4L(W6F(MAcdHN+PjI0R5eB%9QNuK<Yo<{i(Y0+LIvEMKgvXQZ1 zHtEVh9FzCN`U%vIxbO(1x^&7MAhlirWzJLQ$IC}W*YBF0J;i<7*Hw7>iCy6#sBIFa zG|w4>Q+otzY+FE*fasg2FhBr-oLR~cSDnJpGY9vD@{>pLX~!Xik0Rhwr+i@jLU04` zE6p0fYu!<ciF<8+)fuJpr5iXVX@W5bEeHw2VD#;0oyZc)A8e3H)(8K<Nr%O>0NOdn zrzcg9USBS1(vEai+D9|Cc-Q>bk(;Q;I$3NHi!~c)+x+8|9cr~b>W&#@>5~B4#sjAb zphQ_)(Pe>+=lY=y3RXhp0KsRUz}wI&lp7wBxIAXbaW{YeptTcW`nDO5u<dIN`o3$D zAYWgCh=T^T!=48&VS&Le(<bz`zPsz%P{7cZN1N2;5vDw5yHN|b{|%DGrX09$wM}P$ zjxOb3tkS}Kutssgz#0(_f*CE6X$7wI!N6a&86ov^xDhvq5y45o&K!ss^122OwFkuC zuStPWPxhlqnXXmswV$tu?MWV0L|id?tBr{n$_AqEYsyUTQQkCCGj85_?MfR+UH?fF zYU|Tje#_0XDMLGgRfh1ZdY%BI_z`2xWkc-hM5$qPf+xf&Uh`VMJ7^WiRM6xU6g+}i z4^H!lI?iXAFp2QhzC6WiQF@%T#f`^4J2CBdD5XVheXM=E*$3jEn5CU~_`4@6OuGB# zgIne2)Op(kYpH9(`C9wR?XxbgKRA-r8-R1&7M0kk4$>ugyxux1T8m(BL<>%%xW^q9 zbrLmfa{(zB+*~0`FTD{UznThUP=is3_NF`BH-i3z@d+naS3~@pzIda(s{d;ct*lHO zO$-fmIo;9NZBVXa<>9?bYx<a`qm26J-B{F*1Pxp~z<RU?L_WKhWCsHv1LU}PZuz{2 zKF9To<JD5dn(C{St)cFVg?pqi)V=C=c{;PRG1nF{aMcnqn5`Mc(>`zh-|O8!*F12> zUL(PQ5YE|Sp$>qz)eK4~)`F{;ni=gp>lmeTF&iyXaRA@JBA8;5jT^+i%@Vfn@44OB z26gYi7QYH16L4eUX`-$?;kRJ*o<NX?tIReGp9e-4R)i1r`Kvu-r@j9j2v1Q<K~ies zM=TCr$vHEopkF1-FXxoQE<Ur1{W~i{Jj`j9jntED+!WKHy3;pdit&hJl1;!8QE9#S zB4n*q_rdsNr%S><{}#EnY?Z-nM2hjpj;Vi}vD31{_4{>oL3h<E^mjS;fFN*r?&a9Z zuj8PHbS#i#A&;+N#b{AL-?ZIjlOwTEa?7@oGz58{EgD6-kj!D{QtM$gm}~iqi$E%V zBf5fwkz&jANiWZ#Z>&&?s2wbQ1I(KTWy&-!=!q+El%(%FJ}qB8X$q0*2PT+Y`!oq# zAC1CkLZ$pdZgEhbtE;_@#ZK;3xgk|B#}Rk%U89xKjMf`6UUxVdFqm%RK__KP&hedx zV1IogGUIVf>q-7s$l+Y8q>@|+gC<W6I3YjUo-nT9aOawkLe|=_@eXvTzL}2LkMs-g zvA#aJ)pP5x_*qv<Zn1LgNp&Llfij7$3oUzDW&OqAjeRJsY5JA3|JBqnvZ&@GHTwY| zXwcPf{;o)sDpBiHbYd8aiB75)a>Vpq0b8Hcy#E|djbJ^klf+)xu}I`_3p-p@y!`%m zRYDD``8H~(mama_(n+9cCK@2_ToBK)^$|CfBS@Z?2RsGTlPMG=Bzm8{QSaR0TvTSs zd5gvZS}IHL-I>Uqcymj25sIY3;fowV8fasxSvQ`94h-_#*;~8`n%X$BF-?`gWMVt? zpkO~(_tuB7pQ2gsPTVIlh;X?XdYm}o_Hjvq_G{&IGkj=?)jm_y^B5q_d|Jykf4|7a zELkRgVoW<ZsOnk<k!v?;t7Oc0lNS{d&UDZj#`LdU^pmZBtpdI^Kx^xql9+SBg%YQ5 zZEp#sc437PvK~in1gW(GkwG4^F-JGRl|WNuzw&r7R=+Nm8<a~97I~E?4F$EFEC8ZD z8~8^)w&WX^zrOwSvFiB=X~wHbOmFx$mRm8oO+p@X-dvZthB^>PxP_D(2RR&kWDt5| zEv5cxu^XdpY+Y)<ZM08nu-K<afYO+Yd*W$($Yh+Qy_PwMa$OEp-^OwF@dQ@`_@*ff zcKqs5Nkog@BB&A3ROPX#v)Z3wrs@^$C7JtKq31<7gsB>~Cy2Q1@0g~5h>!fA%B{D9 zEsTvK9KA12p95{)O})zbC(gcknQ}q)MQyX`1^r%!3z~EEb4J|cbKM^#)5n|bCkF43 z&y7yDnx30RlW+w~kR7Dj7483lp1)=PtPMh2c%(w)ZWt-r?>wD{fAWA52Hd$!lW-Lt z#MqaRj&}WQN{-6RbeMbfcX_hvh6%qU*46n7oaJ*Wqf?>(PrrQa{}Kf=)fcmHNXZV= z4UTcB*$Sg#hJ1K{W(r3fp{skM_W+kH-#Gg^M0!(Yn-w9@A9(qGSdq)Kokc3_*FrsY zxLa5>ngunRh6)D?^niA}_wZ)j6%LKw$A@f_+4ZI?>?Dx<gKyy~Pt~Hfoa>s!S{{(P z6TJ(ba0$PbP|+@ZCXZmAc}FC9hOYi(60Ov^!=eDwJq*g-B9o<?5%cGOSCntHL4d=4 zJK&3X4B|ijVZMPj5W_*e&~qVHM+;dxZlh|z?^XbQcdfV1YAb1G57@Xl^+x{dridJW z<M3%^YlaQ;9LRWhlh{6ss<rd_4A@l4Dz9q3BM;%u(J$zZ30gf0)8oLsLk{@2DeH4* zr^>T73rQm>dFaX>*4QhnCMvy65<;WKyoFDhC%LYy8#-mL%eG26(D$zGS3wmQ+ONq; zpk37WnQwU#$KQ9lH(%)nC3pX?LFAu{uS^Eh=Tc_sii?eqnMi?4WVMns&b5ZjOaBqe za$X@{T|5DaAO<>z0LRL+ava!{2l<<Lmncb`spKbyZqGTf9cqtec^BXdIT{>z3BzAo zqc%wgN?vRmazP0<M|LS|fb9THfo*1+4p@VJeqz)3{r(r=P9>t;bg5=30yeiHFcNpF zyQPd*u+mUhmuX;31SDp>XU^%O8n;qU4^yyaDT40fWw;3-D2Jh{SHhiC(H~5|JFZ2A z?9VDJVt)pl@af)0GV-91`$*E{b|@J*7{-8K<a<JO)Y-w<CIJTl@8pk@+0skLrP_c> z=e4W^x!+YF%Alj5XTrldBkph>|D^hZjKulP1+q}gD+3r~Gk;X9GY~;Hx#z#Bs%=J3 zJ>dzHxRQv?EMxiiwIyzx1%_|QTu=HDTh@Q)r5KM?ZJ{u#a$Sh`1&mN?r@iT;Pd~8y z_P74X$#wofcQ11y@$>-4JPaO2jW9|RRlS>bMeY>O^0Y=XFZ6thO|;bQiWU(T5a_3E z8bZ+?=MTj{zz*o|jO<~V0TXFrbl^J=+voM}=nTycjh5$tJr5fY3rVB23B(u9y`<P2 zJ44v=tFcHy1Br?a<My%KG-yX^e-1D2E?IV`(GFOSn$N+ADCR}^W4fk$f(UVp%WYrA zv{9>nU_N}|X%-S^#)fxo$M|^0dbMXLf8(z6Z^+lfr;IHh@2ZKo#E3obiW0iHX%3HE z40?zuqqg&JLGN7w>Ox<KErNss@+#CMKzw2qP+_$$nd4ze)kC_I{p5ZYTiBgsV^b44 zZ!8)*rI1j_HfT&PRWk`Kx+whT?8*M%d(xmV#JidIDoPy`e9al>l5y90Z2pkznyfgv zxa-jP)P>+7i+h15*sJXqO$yO(`{A}j4W<@11R{3GJK5B#$IxhZTUi@P9Ba+A<Kpsr zz_e>KG;jI8EI9vKb^i5gS{C~r5P02dB*Y_i#{S0Z15#Mw3C&7+ZuT4>j)1Af)v@7I zNSbAoc1APs*v7-9<lPPmo8R#|;`=$fGcQ@AMAQn}z#nHtcoK}wT`TJf%&iFLym6lc zo@~ng1;;ULC?P;#jiMl$>-om>M|fPOX?<uED?DK{qWc$m*<G|{Z6`D`q#cjY5Al44 zm6+VVAnj8HG9P$_zl9?j!%2@<wx^XC#$%6n!;84P4GI^j&i<zqHWNC6C0BrB(zBy- z{n!!6TU5g5IadeDxh#4dg&BW)hr*+KQ<+EJ=aKQ%MDpvttsOc2kXU-%2OCQM#$TOb z@2!gh8PYSbE9?%;YkvVnnaO(8^>-xQwouBJo+wNau}YG{uLM`yV9GB|VsulE!c(8d zp9{eM$D=%Y_i1_Id%rHAk4}lz<NPc$qlf)$9Fm@t8I@ZC3!+Hb{B1sVr4&h5x|rtE z`@)Z!H3Jru0QfD4Ry$E>yUnFLBO)tj_&`Byq7sPTlE&Sg`ZkHj$7(!6aH~Dv^LsUo zs_js8(6)aINhr}D-@kpiSNVP85Q#LK*Dsj7juX0okh*-BD)%9Cv+lCt=2v#?_z*@3 zSvgYXQa9jwzRyE4_dOism;jR~l|k{5OPw2(@JW94RwExuDIY6zO*l&_otZzI?<JgG zG`!(n?f%f3+k*zwaD!e5^<M!iI$*v^7~!(MM-0+Z6Zlb6X+sq&y*2V4$KT0#2>+p7 z{gaI4-$ZNqA@=U{ei2RYyE)>;7;F6}Dv38FTs9})L6&hja47OMGpQnT)ZVHjib^{z zRm*~euYuUv<>*^m;DWvx6#VhwHS<d2E7mduWy~Y@as5oZQF7h_4|$nkpqB5c|5Y;+ z?{fIg(e6E+{k=+3w6f)9tC~-v{2Z{RJh2fsVQ^}8b$Hwvahbe*T`uS5{tAf2afQ^k zpr=yT<m!n5rDdEX=zP)RQJ|@U5r#nLMa<_#M!%U|pZK)KRLbmwYj{IU?I@>4>{spX z#Gz!;CMko)CL1_6X1ipq)d2D0*>Q0m&GamEp|_eEYBpYXdf|A|>#dO`c)-0`eOg;N zz8qy}oBU#=Sfk-JE=9e~6{M8?<Q2!#zRmvVA&+K8@C^>T(F%@@@nd)S;$%YY+%p>G z1aXxW0thf$GyBRTTMF05|9nx2>M=b&Zuv5RPyOn5!+3ia(R4>PY0c?gQf7>>j!R4B z*8Z?ZeDj&x(9we`x0eN1*WY}plm>Y0Vy{lsl^3s`>K%Wzu48l8{i>C~DJ~Wj&e_sy z^axP-Y`v<#XI&MCydNU%+EtzsWrURA4)ng-$N<l~zLkN@hB9tYW}%g7t2|nJu1O?f zCsWKdgfxrT$hfTj*gM09=Tv30?RN4u=ANzDxgD#3B}0v<cNBUFY0QdCfhm3<adMJV zu%c8uD9@FP;MJ*BrUj|TGC@)O?K2e=opNDxmbQC57F=)FGOmQD(U`ypf%$MEaT6wf z<G#@Vysk?F5Q#g9S~6ijY4{;Z^KR$$zGk6_@P7$RU;h%*ariss^q!ALJo$f}a%oU{ zwcoa&SSACzkcisUj9`rg1>_KXtFXIN?iDO)P=(2Ggi)2r(hcP#!6OzP>74_If{X!+ zP`rS74pk4mS@sVMS=8<lOt)E@eVcz-?49`|@)41nV+lG>!EYm(uldTWvSTJ9oi*-f zinRYet`wiW*1F<YvopQ6G7Y=G{RVLx1Sgesv8YG}O4E_K%~I>Su`+WLyT6l0p=mth z-ue)|HksWQQ3w&4S|LbeXxzC*`$YY7<SZMlDEYnrGi%{Wv50iO%Q7~yJdY6?Uf#Hp z^U21SSoA7_2o`mgbQ8c*A8bg~>y-Bl#J|c&SqFZD4ddq{)&uNPg(e^``1fs981B<I z{+TtNAmjq6PgfR<Gd&m4apw&37zK?(4W!G5y}okZXKPF)^Ks6xoUGhg;x-)Wj^MJh zHK?=wghd0XrY8t$wDO*5^rv|-`WX5e&M5jYfJQAAgeG)44!xV>ill5eMa}@zZ6v2M zZ9p!?%aP&_RQwh9_y|)UW@}75fRtx+g{m;tPabYamhpLh)DR?NlRj~#XdAlyY0~pf zP5X2Yh+kW=!SVL^*WRX2;<A!$u;K7kqcmJmDE7e#q|JwkPebnm+fjV(Tl5$2cBOWH zqyUZD(X&5xdLloZU&)U4LbgG;tR5utWBiyp$mCld>=>w~Vz9Kar{-qEe!er`lio^9 zsuMzgnp;fH<>JSSoJp1Y*f$ZkscW*KU2n>8&_>h5fTiZOq>@-0+6qRaL1?tg&o$4j z$mNSMn=2R#CFbKM7ecFYS#w_Z{v0IKsRQ{Qe`uKi{l}@blND_Q+E^MFTn|0BEo);> zNS4#z`&)E*O);@RO18$w5BglO@M$B+)M$KWZ%CgEc+<Qgz%o4ovs|Y>BYLE>?79Rh zomD#rB_or(uJpq95L5~$Gh>dzpm&Ml!`&9Y{~ef7d|xOlDCc&1yS%>&af0@)H@&bI z=aq`TI=_C17Zt&VJkeGy0J;z7!wK)i;&1^*H(rzJ*Df@B$CO0t<mIz|@D-6wWh5$* zcP1ZEG<hgLHbeNi0R$StDFh5J)MF&Qit{mDA^U4*--#j;4x?DOk_tH(>PwtE92*yI zh=SnQPk3-f<nK(JR6T6}*eg#z%{;BbL;B&DM`|^G5)+l!Uf)~{>(`-Lv0|GXxQ`_q zX45zftDD)Xmpan~FwZZvV%;F90v|398Pl+BFFc1ShqjHIgwgQxmS|DNnIMZw*FVpx zb!Reu&}mL#BqEsWyH8Z_xkT)CHp|G_l~||+H*}qej}*J}dbMpj9PXy;wJ^B{CVmRa za+o{myy<$^r*UIcLRoM30Vv|rK3(*_IF9Yv!R5z3A=$RkL1U(3BrG{Cmd>{jXOp$( zbE?0Kx2{#5f4tmbx-Uk_y#;~hjuv?dTlkJ3Zh<01?)AUp@T!6V2>LaC_>-1<pYizl zX{r-24ciHL2ha&;7tCHwL?9VC);A0$We{n<gdInLbp8fv=J|OdqW53VZwsiPi*27Q zo&srsxW?64s-1d$rAt|&=A#V)aGNf{jKbkxhqE4naF%3sw)~4rPQ8m^QMKP|XF-po zD)eD&>Zn2t5DJ1>dKDZXU5IYGsq*&(<^2%*7Y+Lt&G>(R75Dc9wfNF?*5GUF2`Qsg zLl{A)-V-GV5Y@$V6^EO!M1T5vCW8W`;PVzl{?@eOq#`$x#(|aBk^6eU!iFb-Sj!Fm z*^Q@53VJ&~7p`%6I{3rBn?B$7<eUBq#2E66bX^6e@8o<T#jBB_A|3{B_C-8I-@Q_V zB?yFgBGJczuy=7_9#vH`JGLW|L*`++{qmCXyyA?@yzYd0dQa<z-O&lYXRLN$>8fO< z-TYrCqR)oSRnlaY6~sUJnondxu1Pc@Ri~Z)W30;pkUI-Ih_2g?vTz{u{Ao<gV%wL( zV=?E~DayFm)Cm$7bptM3YX1UY-1M+XvzBWt$QwSNg>6R_H>>vraIpyeu|1*kOWB!p z+1N+i*OO%RNDXVO`S&-b?r_`l*p%@RI`g>1-}2%#<W>CLAJtyvf?X=5Cn@5IN|n{V zsa+{D5zhA|ksE1QB{e0Tqm#c~a&KKb5p{)Nyl!=So|s5(gtN2oL@6&mQT<8Us{-gA zC>;MfD57^C)5wi0l6Wvq^rG){%<X$+yf+%p_EdsKjpn$~S_ga*R)EAV<8boaN5`{J zky5wzA?;25lnSh<wS}gTE?m=zy`$~x2i!#5;?D+gu<DDDzGsTmWH=RWljFF=Oc$ak zQINaR+YC_ouI<;AXrA7+vjG>jsMLlg4x$3U7s$zVZ@QfCrBK)OgB34~GtS{aemfu= zYM9()1U=twv#`+i__11g_v4Z{cj$sPrTYTWP{msDLUqOZ$O>sKF*XkJqWzjK|FH2j zZPNNl$TtYSD_17v&qM!RYJd)0tF-!!DPJQZ+#B_NK9FH1F_^*N`3@qGTfcy1Snl~q zj@Ew24r%vSD{dKr`S|j^wghljp$0niTwi?q@Z7uB?VqP=Y7X-6j^~vmxQ8myaakQH zA)4qwsweMO<L%F!!})x%#^EP>1Mz!W1EA~^T>ELPGED3ftA&qdXWzFdO(xL}pwxy; z0WU5<L)#sVN6Bx{JSr#807(WW@CQow&%yofztQ3HL|udqX{L3ua*zLrJW~Z6yj0f1 zWlld`LDiDX#vSH%@4CcsYR?YU0@V4+QQsWK6Q>$0Vb-FVc%9y%gBY2&LUTljHC_B{ zAKhtp+2~JhSeCEpCE|HxWl+5AQYHU;1{A(u%k7`MtoPDE{dN*C`WBq=7%jl=^YYU( zl5CSY6!G1Qz|pc5tA$UYSBh+{OcnkFSZSn%^%piSw-BT4qSfv2x!3+cWvv02%_|rW zv%N%PR1I>88e49-+BA_pCI&*mi{0CjePyE+45s$pic!Q;V&rwY=dwZHFQ3)jjxO{3 zrn0RVm5Yo%3NNwG1_?G=1t><`-(^dsk%*JmF3Wbc?=CN>-d(}{2PZ8z*MVBO6*!6T zbz$I*Ocz?4w8UPLBwB)G20R2ai{|Cl?Mv3atLs%hf?Co0en&;NrO4mpwCviV#g55Q zi2sv3cg=+V@GShF4vl|%oeu?(Q;7^A*b`X9Z!3Jfahr*BFOeuv_rZ(tKuf4R4P{De z^9_(*mxqUoC_Gv6g%>YbES;v!b|v$L`3Hscd~#;>E1Y0{jM^cJfcFzB)T$i63tm_y z;LrGxYRSHHKuEx>05&puKBnidTh`o{9bKgwRm3}(>kV&&QMxz3GYRoyt~dIo@RXgI zKw9=}mQeL+SOECGX~YtI#r9!TPkXVsIxRt8*7?0hnBxT|kztx-g(4Q(-6HO;2(y1% zUG3Ryrcb7(K<pG>Dk})%j}R~xwZJ{hOvGf|$yDX-Dk9&UpCzNo#k>a34+~$$_@~$X z+LnZA2R)-tuA(X7%85mM39>no+;@ym_BxAa!kXlkh4Huo9%8k>;p2M&!h@{2JIH15 zUOxWBNs_+gdU3pDQQ1y))9lv46n@<#yX@tI<RWX6iuhM~y;9%cI&*?L8W+MG=Q{%k z>o|xOQ($w-R-oAv%66!Z5%i$WdBsE218-MYP0^&zUu+7<0g9LqMFNPzRyJn8GIxCd z`Rc9UF1RsTc8oOIaFz+2Aq@8<9FMXp#aVX@swJI>GcO_cE_PMV>=KtzWmqEsR1<AA zEiZb)DQiTFTD?kRRP<2hTB)fh^2}#ntOeJbFss_{u8P1%F;6`kfYx1~=SfCz^#!B) zkf!txVd=MftBf2Z*dGwPMp8|u$AItQI!btbrY=ygTKMRrl73HulxpTt{KDas^jKnm zL0fY~Q^~?Pd@_aj1!cK)B-gUwn(&Rv^Mf&hdYPZ)Q-3m<y@{)ZmADJ6TB*4|Cqk>7 zRzjvOljM}7WZmRG;6e8S9Ks{pma{))E>~@m8V~eZ4GQ1c<SK5nu$(wk$yABgq24;9 zf04>S(!vp%Iehg=b68Q$7yrJ(T&6|3Hc+U?q}+&0zwD>=qUPu{Xo~k7JC`xIk<k*h zPn)aK7r1M16;`Mu^=9DN`YnKWDizdJer^qBVph=^eqn&vMGT#jt?iJfmQ;5KG-qW- z@LZ8)R3B)D|BVg$SD(dyzGAs`7w9gjf*K)XvxCWh8aHuHC==Spnx>WF5|~TQk@bO} z+!Ru)R2<r|JwpYEq}u<i7Ne_=Hg-TUsW7iyyYC}XhxY6Fp-e*qLAmV;wfI3(0tEpa z#^SmNaa0<%G~vL2!UNX)Hs7TP*=QLw#C+!U^ss^|0>eeiGyF$!(*9azTad|)wBEcL zY$8Miy7785LRJ;=+(lOvRyWU;zqNN4oe=s7UGMoGN?1akPs;dzQK<vjrMnPNsRNm< zTx~0-oG@K|vL+-BshQcG<mG7vJW%x?GN9nBm$j*TUT}3hxzS}A<P{gIoQz~v{SKe5 z-nxA!JN2t?^Y|hD-;H;)g>#q2I>~zf=3U$Mz{{dnjP@FXs3U^@3zq(CWY2H1YExX( zdW54Mv&UK^zgfdpqX^4>y~oL&m1K@h!PC!25ebYGgz}Wo%j4qek@fNQi9hR;-(f)2 zf(q9S?-u^@Wqs1q{hL+aZMu8TPZ<svs*G=Zb;fmhk)!L4tU>PuP4uMg7qYP|A*w@L zsm15IMEoSget*VOpAU=n$i5vf<t_P}vl&HJ@$%YqX(^e%-IyjHj1wOp>$MLH%m4KY zvKm?M%N?AB%~Cn*M_u*cM5g$Y_r|?Kp$+}s4SU9y4qv>~<Zi!AmY%)PhtWE(H(8Vk zI}OdqxRqIYmq||yenB71F^EQl{hsPhmX3ESn-g8r`^X@=7ZP{9yaN+gBB^LADyL3| zHSiJEbpMt4;@h0w2Sp@-h3g^Xxg`Z7T%FG*zM0*3wC##;pp{&Py>l9JVEoQg620O2 zvjo2Ox!Yz{tu??UBgEKtIN26cVNB+4DgVgK|Fw&9GM@q&84eEg0rDSTSPsbQHSP+K zN9`AVdc(~iRw4T^C(vB<**d;rIQuQe--p+gKMQh@zvXyBhBM0my+PP^f4)DNg=~|o zJ)EQDy;ed@?Ior_wOOuR%+*@yQt3j9?haZUR0)VoGLFUHp1wp+G(E+;K{&;8N9E(4 z+8d#QW>_~*`-AR+zQg^*?5eD1AJBVEhf=NOO%+etc){D0DOo#BYtl+PS;Ce_fb|+e z_V<0Uko^C7ORnCovuJz~GXHDpH1FOuJRV#SmCrkxPPZ%Rb{QbO9mTd(_Sjpq*TQ0T z0Ji#b8+IW-PTHA!$EiK+u}3vU@4cU2Eb_;k4tyC1B<15gtbw^}F3v0L2}65Wl4X32 zZD(@H@Qq!C@vM-aS%s6&)!u&5e(FJ04`<h9y4$5JHuRv?;&%~A*Nu{L-1z5h7QY>7 zCFPCeY@?HV&_hMR3+tAP+_5eL0bS3&{eO(TbzGHOyESYe-60|=ElPKHNVjxIO1IL| z-AFe`NOyyDEJC`wS#&q=bnoXp=j`*I?>p~b{&ay0*1YEx;~Li(dNq!tiA-bR8<B}3 zYa&1CF#K@fho)jwdx`(!Q2sg_uQJka6rZ)o-Dm?-$wgMC+gLF*25$sZ&6YC1Ke!xi zjwd=CEoVx+iVGD)5448?hqo0e72qw<B%C3i`Rq(1gwo--T@+9hs8e~rgpUH1cOdsq zLeX?<HCuITu2Ga_CK;>+^8j^3i@^imTyHNT=43(|Nh)fW#O}%VLoPjhG)E>|5IEhx z2_tyuPDPO5;Wp#+T;bI}eldK-G<1|k_*n)#MA9%{Eonvcv2flZ{r_K@KPS}5`V3V> zUj(}wX+ipGBgN<yDI_5u;#ea%#N|4~6_>m(*h4%?CjN;(R^6mObBn81fAaqOaWv0m z8(RwZ4#`@JUO?xAELS7#o=jp4ngvH<&HIq(>?l3VFTp90?cT+3^({LGCt0@0HaHP= z*9wRp#4^F?ig6@vZq+HOa_DS@=~BN|pMTPR;f&c`-dGdey?(%MX#XKn*f`op-JhrY zMmi?29q~mv^qJ#_e};f^pC@s7wozpc5q}?tiUtl0j90Iq-bt*j3xhChL=Iqahz<QR zBnRJz&InIpcl7T2JH-+>dqv=beO3qDnFRCXQZpT)e3|=mEnx}e{Q{&|Pbrz<6*!oN zBSLqFL`jVLW6#bvhj+RM@vE#4J#N-xhD|32IKR-59PjmR-1%MlcKsE@I$WJ{Si#f6 z@ORLXQO<e){~4?P9mmk8;IG~wCU@#mZjhRALgdAT7Vf5vz6z$ebFdpx+iN;;?%pxF z*Q2c$ndmlM4KZCMIQB-V9Tqru_s|b?^rY=w{I=K3rG*Ue)mzLaKKwrA*tfe_ajHLv zIsN7CTZ4$!K43}tQhuI@>qR0CCq$Y!t~_mDzk@4Q-D<Ol-M$i;pZtKB6VpPPd$KZR zKXPtgz7{IOpJ(R~<va57vZF<sv<51j#SrnF4O2nQYxzS0QS^VtsXtfZ6Y<mc;%lT` zi#M`??Y6cLIcWcRVFKylmyH}E{eW1q9J@8weGQ>*xJWl%JUm09Ao${-hBJzPd_p$d zq`%C~L0k$q`56Askod32_+S6<y7Ku(oW-EC-HjwFjcklbZ&+l&iyC)sVO?uLyl$Mh zzsFRyL+-;HT_8+o*R(gZF9?hOV3TS;M&u#uWC7v2g`DLQ7#$FM$Re<%OfL@XbB)Uo zPjYWww9SNFk*HhEo|32q%#SDA(IvaM&MXq0S#)rf*t?PpB=r?l7SEub<!AGPm+0(= z40TJA`L^RfG|9S*#X+QD+1xV?c(+U=EESCLC&^kh-HrbQdZFc0!tVd}>1mOD`vJnq z`zZq|1O*N!oA0VG{+$K>{H_NCFbM-BA}icmDUc|{e_Z8G)MrgKFSBg+mfscs^OgTG zD8u;w`LM98qU>kLpH?E%dt?uAl_Y!QhC+JlEoy)+N6<v=+bt$L@^#baeIOUct@(Xz zq`iH!1%p3rhaYJ_1N1JlLk(w-k*?mKs(rOcnPuOvx45z4l(b?G|FleEbK(^Who73} zXkop%-9Mfk&L$Yl8nXb))w^e><j*!xqh@lGG2m`H#8mT<QlYoa3I8gIX*|_XmMu56 z*`icRL_Y;3_3N&!w%va|KOiT1O$$Deny!;5uWiA~ve8Q6-x2;hNB-+cSauTo)`u*F z-I6+7L6H29>Oeq?<gcfx=f&)3z&~F3_wD;fF~JXWhwgVQ#2(`*n6!bmPHm5hPd=H< zRXK2Bd{7GRNh81Ep24oV)vi1n|5uE(IX{B8)AMT^=gf09qlqqO!}sNu(k@i4V^etq z+sO|+=#9LPdWDi?C-5Y4m=JD7u00V579Fx1`raFbZP7o2#&^eft|d0KuGvVqF5$$x zC!M%3RI=8<yX8c}&d-AyZa9DuG6U-p&Jr5fK1PvMCe(KP+Dj|?AHRvfSBzhFEOd(U zOP{@8N22@rcuR%;^9h3SqW=53DP#b9>wo;hB<R?GKSJ_lLFNDLrGI|mUw;!wz&H}d zhAo(s9XG;@@sS~A)OljU+pi^lU}#cXK2>iWM<%|?R~I^8wNjxy<OrUlpt;bumujvL zcDG;4iS|iMJR|%r=^;_cPVcwkPwNlP&uaQSMrO?T*%<H{A;!WyB-?{bbGMbO=dwn< zzlnOwj2lgdEtFIo2|1~11PP7EhXyb9obrW-!Tp=3TVvx0NR2^>aZ?{=13BFzL;RB> z!<L1?O|m7pZD>}z^toZ=|Ls{4{}x|TzM!;Me7O2tfx~uH#NqL|`c8@G;}2aAPV7QG zD!B)K$z(d(g;aQ5`aoF%ZrP8e4}^B<pxw^|R)wOUw?M<1`R-$hSXAY&V&YpVqI&qw zjizu~>~>cE!<JjC{shM7_k|_LSX3S%#Vd<Z`>@Qz>pY!2qTX%Ho0FZSTri418sbOu zw~m)~@tp6jg0`izC;FPgUlJ+!WBi?VLNg?lz(E70Y{j%D=d&+$U<IZNY7o_i^vsJS zl0wS3KlQeaI(M#SKLdcKVo@Rgx(UDd|2oVv&rlJve?-;);V3~ay#14R*8HqM-nkS< z^-smZNN^u?stfh;PJ?QRE$nnymJ@H4Z7|tU=_(BwF>kdTXYthbaPCFQ2N2HLpb|#M zG>fm@L)dy}((U7%i`}L6pzo?Deye2!S=Jl4T1_SIpJdGVJ8EsEZ1nCkjUTUg=s#b5 zKQ)uKpCRszLN!@V3r+Y2v0H!dQ>wnjv`+apVP8FBz5toKW@DZl4iwBB0VwfNWLZbZ zLDWU^fp)Zll>f{KBzN$71+Q@tr0%9a9D7lxyd84~`wnsq&Zm^s=3|_y-vo#qfus)s zXT^0DztezkS!7H)?J>(liBd<NrLq{Zs}Jzfd@VZktkz?X-g%uA9ru*0CW24v^t9!c zNfGP@jDMW*ERcc9mh<j$|Gd}Robhxgl8k>VO0sJ8(J*){Z&+mA84-3kkmuW17V3e3 zKihBg{KPrs*3u5VCyy>VjYM@E-Q0i2@2_8W4S$vU{_;WF%(|R>p9g%T<h|TPKNaA9 zRz(jafH9jWkiEaX3}?!CJ+V6)!G91&iu)h8)${LK?(tQS*grzwf6ayeP8uW^e=e!9 z9i7geF%vC>!z5KH)zNs!sFJt$3M-XBV0xd#fOtDHQrN!}911DVZDk6yOq6Nkg6lTf zt`ZqI;4E77oH0Xk>H8(-{S#eT7LV<DC5KYQ6<$57S$S%=z%U|epJCC#i8j;+$8=%j zI<x|(Sd^Gyz`L%snPOzoV^_kxv(F~o>qi?uv!oM{Vw6%jpqskUd+pPbz%al$%ZSi! zOenIlBZLiW!NaO>A#*uzk4Et!S_BD5^GIJw1P6ax#>R=6lZgfpp(Ggk@D+jk_8Zs* zuHK=O=_A{E{QlGGpggma5qTb-Px|Vw^5a@}$#1q1-ERUn5(Xh(Zi&c2H#gJ)?5E5& ze&N4&T%kwVk59MG0gM|m<pcx~iWpz5t%;;qc~OP1AnLtI`t_$$&&$Jq?F(=qPu*dY z>h8(Z>TRl*Z9TmJ@{ifjDQh6lLng!($m2|uS+lP>>eosq4@O|yv(=tiRk%YBSu8{u zB(Hd$TQC_`O8lZ&_pvb*2y92q2&B%!&|~sJ_anPu@#CpW;k5s~Ua)p%|I_YAe)1E) z`8Lb(Z|Ht&4~G4Bp{@giL|&emLf5nkk5jkuSt3Ey@>yjm{777H|H|kBf6{%KH0(cO z+P@F}zdj9KkC<L0f$g$UKAfWry>)kOkmW0m8DUiJniVcXiQM$h9ZsN#G`T59(Q(<T z_zYF{M-G}3oY{NsC|kBt!x=yuuixWHm&^$s0lqtqa%4v<A8@jc7sq`wz2dKA{NOBa z%8{*d2^@*A`z4CD=Ep0Mo!$ow#3ma}XQF1&&Q%T!s7IvSD{OWeDWP#&B}23Vi03Lo zEmPLt3m=pY?3WQa#*hrO6p5!vxcgEU2^^((Xa}AEb-UV~hug!clZD1FN>e4}SW&c+ zK(mj8qpK2Y^Hbeeu1ua*J<)g?9O_;kP%mvXrC^DdcqMEqPO|6?5@Dn{Y13Cpb6dYB zaRs0yX!_F<=#w^eE&>^fo6F7C@nUoO2D=Tjy>FIPTvm6~k}2f2p(6SnqPPn;GjmZl zo)H4%n5e>{UHf;^wsMF-xgz%9VL_!(n9%<UA0CEz*qayaaw$F0<$OnW>akvyaP|wU z3rfp$rUAYS$E9$U%Q@WH$gCUzKD>!%I3WxPGVJh^B&3iJ<ja_G&&ydc>9TCfPG{MW z3lN_@CHwWK|As?WZ(?y<j|$jHRgv1BU7Ff17n19O7z7pyA}Mf`L|$BwosNZwlE>B@ zUP)Rjzou4D8`33DVa4+S*;)kg@8q46f`RwHmp5N1pLqnff6c`2RHLe(hdh1NZvioC zjL;r->OB_xgl92`2AK(;`-FdGH}f`tsP8O*5OdC69m%@yc-76pW&3Kw#R}MtGHp5G z_sS&B5Zz8&N;}6gp-~363;u#L*>qy|+%G414%_z~t({KX^}X<n^j?pPE2`#nS&BOd z|D1_jah1sXHk!SH^P+YYpgz|!_G}!mfHOMqfuwL>x5aG;VXNwW#gwBeaXkgwgo@pv zm!I1r_#XraxvDN{ei*(X;ZT>Kukiz9i-LR)&a-2%41fg8?0AMESTVcNx8P_A5uc5a zkW7iNEC<qfV=VtLw?G?tyrCOU^P`qlE}D)}E^RAxSpSUyHX60^BVpGM<K%ZH=`#d_ z6jDghgM2&WpGIEe(Ri<1MhrT?r1Lfd+~<7P2w8{o-KFu;VSxs>>k2aTmEGa;V<4d# zWb#co@Y73#IuShOS1>E2hynW4qrN2Q=+C5$(X(s>Y`Qeb-kiMf*aclYhw4g2>@^-8 zdB<2dx?hJ+b`>c|(BMS=T<D`z=ZB5_|5mg8-?ust8^%IJA3eOJ5G}A;dbA6&5c#G& z^xPP=`2!}K<p}JQ!e+zUwVL0kkor)r_^3*Lh&(9f4?5mghQ%P$_uHpy`4jff<HmCa z5Cz><KzKDG(jXTpJ)JH2_INeaWaX)On@8~|gvuJ7VM&~Gc6mhxoOXFm>fIi>gisRZ zbCRwk#~R@wJ0MvI>Amha+1}mm`CuK-{2|^lDw*xQ3Aa)Y6BT|9v;A0FUstbs_(>>m z0?d`?1U_zGzy{}v{2Hk~4F}bmUtDXS;t^$?M66m}$k8!DJg;3!{7x1;4ByL&kv_bb z%5(AP;f_ml!-(N07%Un8hHwE0^qfuA+dHgwez*ZUvfH}+QbXgP6_vaj53=mHhR4F7 z?9^aF6#MQY9k6iXB;<CHzJ7eUAE}>CtH~z$oePJM&mloJl}n~vaA4K;6N4PiJIRgy z_#f%0chW#9=>%`-`qXm-jQx4js6nfrgBk&xp+wlNmR%d!7k*&BRa(q`;d$>UsJ{+J zZnW~}nHlEpUzWUFOjcY=r_<H|q&ZSTeh+Vt$9uHaFmeeST%+E|sDt4o^*I7=7jM~g zK2dg+Dr47G`=hONPemYJbIx=7`BBc{VBT3Wfgv-AopW1<70rY12q~4<b<*w&)Pywy zu@>4So6Hu*C#@HFoycea+n+|poyzSR9!|iS6_h}UdSS<~HGB}_!f?tA%Gg*A+fV7n zHiKFX>(ZF#j7=&Ch90>Jm*iT>xO7?>=2H*0W@3<6+**x~cWX;S*3VIc^|sXWFLBu~ zhxLY^XH`<xJ1#OU#z)OoS!R+UqP^xAfO|T?KhPmCYCf1OpV@=>I}h5L@%^v~x`rA4 zFh69@{`J$5)$J+g(JPvjUw)-1ExH*}DPvlkm4znrqChZT7bxEsDu`k3HPx`A_c|h_ zCj_>?9dGzE`MFWQ-AZ3HfpPOmojO`E37I>W0@AnVmB`R<!e;k&VDFk2_vn*r*(F=3 zxZ<5K=<cE<vB9TE=v9{p?5C>Z_@!<yi8Fu#%Iym-{dO1^*)3HJhp3A~Zh-(aVpS;8 z!(;Rm&ZQp=0_L`(hu5=fFuX3RvV^cThqnTofdZQqp;*BM-5TrrIN3Cw&zueCm9Ohm zB#I~bor(Hn5}A#1eBjW=_*hjvlVxqv>%@+mdYaeE+anZyDi@e8ExPY6URE|c3*A0S zB`HJf^UrtAc4E$wvcTQ|U(MCfw?jHvgs+>B^oR<>KIyjy^#MZ<$9XLu?|@sD?B*ND zS^ba`Kfv+4JU*HqKR4qIb8Kooq_VPMghL=W-GCIPles#1=0(u51^uy%9ffi)4=zpE zSRvxlWVEtd%+&~ceqrqC-O$@a8p6fAj3E<uqLF9dPvvqBZn-^xtF~%}sb0b!a5QAY z960XkxyBnfPOQry7`QfA(klf+t<fD5j!9ge);ijG=+VL}gryMc#ZVVH!#Pl`93S5u zAAg|x(>n-Q{0+qPQ1*}3{6BPt((u!P?X<D?tmkczGU*gn`&b#KvY$8OGW<0Lcy9Hy zy=qpQ7ff@B^)s+HCZOBRC$mk3yx$_QyQqe!1*Blj*&L9w>(;UF*A3M3b654T&GXsS zd>Q@B&Bl<L(r*#qFTY7pL+#UKCYOtH+tK|#nQxx17AK~42K9D&&V<t<m2aNk!6GDO z&bWTZyw(8!g4t4V(};J=qNiSah%c9*#sZBObCDs9PDEe8t6(+7_X#vKM4N_V2BZFd zH%dSv)R%GI!$dWlnvV=55H~*8FDKLGB4Huxp6<A2hYx}6KXksPNq%>c#V}D6-C318 z|8!fVZaoHOkXhS{ueiOVX(|Ttqt>>|dk__OMu*3=5t=x(j4z-5hZcb4>=i4m=8Y_N zH0^5_a6R%>Q(q^M_oEQsZDf#!7w48NaPP+3%vJ9U{EW0CGLa5zVs!B)B_OC6m<CEQ z{15AWkK)<gUwiF%8!mr@1gk;mUkK;3%-KLqYA_@?wQs7FTLra6srz=!O9E3|ajri- z%poC=n=u<f9-aVw+Q0;xzJ{gYyUb097S|0_;pNU<m@OG=6v6s0T*>(H3h1L&Ubz94 zq8}ptShn-2>5Ph~GCsc*6QPQTJ$bFiQS-vqc`SR+8pHYd$LiU4d|POpgI!4Rqnm@8 z)nWH?WgrqofJjuS_~S(RVuPt=F#mcY*O5v$QJ6O2dZu2=wg1QF@hlpD*5y=@qiGm* z-sl$vrv%Stm-9S`VC47I*T_9QNEZ*Q7Y}%Q&ZZ+31(dxUgtc!w9QiXI^_14tU=y2l zA9Z#gJbZ30@d^C22+TaKwyHIG7B05nWm($gZ3V|-aziINTl9s+6kdyZ0}09`N{C%; z-KA{GRqlC_J$Gq+vtEhjm54aDSZ8NkagqY4u1)(^H>wnhX$P?Pn*2+z-O!xw6`Q^) z0N3TX?wFqAN>Ytdt?RVlxCPE4D6W<6N$+2=NDRB>(d+gzuoFK6k`341xoP#f){8>T zt`~XCCLWg~8<6z)?w^jYW60H=_qJ_!#|yacuR3&I?zllOWPBZu<~fn_71mrd{0BLA zr_6=+XREVJ(r8PJ;>X3fQSh6@Tyfsu_7$f)sd@^O;d41W;k}%%d_Q_UQTXxm_A<uq zYps1UaU;kiN^pL%(8B3!`59a(rEIZtYA@1bJB^k-!q-e+bI>?#M%T;DP}HMk?lynr z?S<fEZ-?+}hu&O3Gueb)NP<z<7sL=_64;c2SGUD~mnpcL{a#jSkc-OQM{oz;em*Tr zr_I_Mh`3fcF6aH@fSvN}ZOYgXVWa6;{&AIQpVobIsXz;95u#Mf)~)3Yx4}ezH8tQE zjf<}!RWMTxR8z`mUK121U!Qa=5;lAoh(B21zSa^aiEJsE<N_Q2D^~6&dZlDzoC#|o za;Gs7j0tN7#OzyWEmkG`r+oUYI)6Ztmf5>{qDkiA*vTAEqHJC?P)HFEr{8n@_*aDb z7q|!8Fq-@S5TP>u8bUe3lWX3>(L4Lxg}@MEc`5jZ@2B=hic*;n&e>Yk6es<5CjqGD z5L0D1)9f###d%6Qa;0!C$RN|LfWL3UOx(-Yp3=M_>i%5)5-IkYM4!i7EpSx~Vlpxl zFuxdYKDh1em!s|Nb18Lm@tKxXqCo1cri8;`I6dozIB&}q-<oJrZd9PGzh}0Ov$xt^ zhB#IZFs*L}+<Fg?BQY~3812PK%!raJyc#JhLvrqqz5E$Snm2)T?j<_mrJKa^*+Jy_ zo~-9)DAlMJ*U+ocR^Px60GOJfm&uZA!Vbr#e)`fqPcA*}pq}c7i^ApmH~qM^7{Xh} zl7uv}9BOwlOiH=ZT&qK1$xVyU6A0&hU(!CCv!-&>5jmYwQ^e_dW{;>){w!6_SaXG= z6=>W|(my55BGLI(Nww^qkMm_IRbHHsCyx}pTeLl-9Z<$cIKcjJ`(eog2%u-|uqo-G zc+8`Jw(LrIJxBQ3!>A7M0(-Hqn#Be+9825Oz#yiCG=|_y3X<#^@)^&JyR96cY7_?x zoF=zy?%mjoFA&AduxG7->PawSWN`kAJzbsW0C5w!^F}`o&P@BIk?yp>p>s`+YLpxu ztYb@kgx;yZVa!7bLf*qFM9b!NW3LrEOqpR=2=>usVg}q=1oiySbMsjC!|bZZUvdsY z&A%Rc4m}m4bAom<1BkN#yijP`HubqXl=G}PILDBZa&~XFKKX<vDWJykR+WF)Ze!qs z^C@6hA}NpSaI2U5y0o>b?wd6fXg6M<!?*8@{>aOc!x@35BIAt)d^c4pSLCc#?bZ<% zL8E@wC5*<OKl$Esv?SHFD)iCqx(k+ei;H+^UmCjxUTxPIwqgk_7}-1j*XIdlj`-m5 z@3i7<q9TNay#}pJ@41AuZ&8b>GfCm^T-K@gXHHXfsJ8R%5OoLQgRmCKnay5fc?jk& z)*Zk5W4}#Z96SV5L8;U9coGsu({Cz>llcC*dv@S^P~1-5*Pr{G?(>x<QioDI2g)|8 zh@N)1keHODC`*W{32Ri@Ah=iW;A?O42VTA0yEf2eM)RlEk{2~_RbDWNe8^+NrM~ke zWq2Wgjq2p_l2*g_HOo&alSdwLuo&qOnsaH^tYMbz{i(|R7Bz|4HO*O~q(5`0QtyyH zbDrOa7p*Ip_e0{i1{Q)yVU}omhNnvB(J<fbDBQauW`2#@Me$AL0?pDIQX3x8<ks0N zkJ2NpwOnoL`}))=t7C_`bmu0oIN>(GTfMBKy+r$bt7a~)icNh--5yHxoe5(MG``pn zW1598jl8~0wWqJ|U$`!`_Yf;^lm@HKG&vjGHyfvE$Sw1k$h8fbU!9)vPM<@VDbjMe z%wn*}i-OR@SgLQDVW9DqG)b<T?-Sb_JVprn(gQ{Q6r3X1bgD(vGHG10mIKkT0-qMj zR^D;Btuq+)rHG1N(@I<;tpoi}=xxzf`qwOmK^LgZeKOPJw{*`7Kb<jN-Jj&VH``=4 zIwMuK?`|$M(Y!FJd=OeqRL%w|q&~|32;QKE+^hfT_m$Td%mGb8kw$6rMSm1CcXOi| z>-o+-*Sywk8#}NdV6kqqXcj~Xw_Fg1P8{Or?L^I^DgF3Jv+de>WgBCfd(-lXlJbei z$#LG<8FSZ;589+zwAD%v;z;GLi`ed*>o>IPO0x+`v#}_+YC4(Oao<6BtDn97b#RG0 zch~knB}p?k&~Cj~7NYuIxs{k|%-n3*Nllbj4Cc$Su2yO`&3E&{z*he2tNLQ;R5mY3 zo?B%1N~1!n)2s5Oacif({6Gy8T>6JtK2Ly!C_(p7__XWVUZ9LSSI1EbW;c1<o4|P6 zOctT#+so@bF2dNcJmjHkimZS{GP3-p6uKmTN&W0>XRH-^=p={zR+{kp!KoZC6sz{s zFQ{ES{O+e`h;H+ZyCW^3l0rUG0ZO^#N*SyA*Xt9Nh5^rcE%CjOl%Ogv0$sPHbhpqp z0%EuMv{nMnd2LTO-ftvCb0RBOUmt8_$pK#h;N5fZN3*XVHKWP@cWfMR7C!z-7mo@C zPlH|(H%(h^N~0QcLe+*GU58w*%1hP#d7~F1EICY?KSPYxEllFn{Zp_Y@@OJMP8K1! z(0Y_uM!Izgi?ssh2d+M~!<<S;9sfm8wEdO>wg-$wM0njm?tJ3g+POq7I?y~b&sD|G zP&TAE9?94gK8>?Q<&2M7TO+T8rtI$ZSWZLVv)iM4>IeAF-z7NBznrV2TMcX{iD0vs zPLPbH&eSa#70-QGrnq&#y(qw?Goh)N`|whe6Fvh4pDinzLTVScUhQeca*d_t=ZCxN z+4K$LaL)u*%h^~RxALNmkodjU>rH&o^#rkO@d$++zTtx#U_1OAn2|0zOm)_Xg}nxD zBk?Ce&uljOjc!22^BJIY*yVfC8>gGeV=N!yUVyl+NdLlF7j`I~o*xB|$#=qG`}Z51 z`iyLq$5KS1l%)FZoix{j%qbo7k}P<h5{6ST(_fI^aA-t1_4ZrTcE0p|Fk3l}(8-&~ zi2`MeLN0~#T~?qDLK=*mrU9{@KT0VK!lE)23L{JhK_m<OL~lvEh2s!&hF&0Teir() zHKhICd8$Mk8)MC+F#K6yNLz~T6<EcMSIoNzwFdSmyFaGV$B}GH^Kl(2gk=s}8iRoY zToL3-slnm%PlasCje$f+bmkN9_StIU-|c=#?h;#l(G*JblY_M-Q8@2Z^Vbp&*EB2E zPj@%y4x4tS%byeSxlLC*EeBW2?8a^NMU^iCFUI>Lrqz{>08@|_c8z-JX<e~X;DZn_ z$>pb}p2@iQ4Neq#D&5~Wo=Z98+qWOHe;)NMWcfTQ0@%88#V#2yZeQ6HS6R#`HWyvj zIo_|#0;40e^OR?AxW^f}20OOW-hC)-Itk`Fz;@ZLn*#RGPL2^tnOl`($Jp;wQ-I-M zURI`I<pJvvx5r%qshY*dE7=I|<m6M|7F&ADiJ#S^KQ_usaC#XpFZX6-tXnuIaP)~R z6Z!@jXG$X?_-+C<s!TI=e224jb3|{aE%brlSJl^JQsPgN`CIJ=ORb*#j{6hx<QYP- z?-RE+f`DTy6y*g2>S5)EGc-l;z`bUmGL4qRZaBSFeuly;sQu=P<FNTp$Yy#tA@`06 z4us2LTR?nVsz<`=Am+jxn8|K7&^}=G*?aX+U#A8>iOaH$I>LG5q?px-K!{JLb;Wpd zKBYUsd>27|BMImlGZpmP@TFw_VaFrPBe0#{MzXuFMS6agW@+;NkT51m@HXv7xJ+#W zt0lZ|4;3)@`IV#i`HjC*VuM;%6-!=F%zQ34<_FTpOv3`qT_Oz?aq(m(XP2tMlj9ds z>y_-Ukuyin9RKuE+MJoQ>n}!lfoXBxhq2Q|oqXLUcK2XDKl`sD?(xS~(H#n!txDtt ziOh?NoqBgpnQZy;`>fWBzUT@_BRD-_sfMgwzDo#ed81zUaND3GR~qScF}nvU2s;6X zp1+~L-*mvDXQ^F6xh0_UH*MEW=~L3!ursgKh}p6{;@|1U^%qJEZVjj9dECQZ7xgWq z@Vhfvc+L+E-(suhE`8HcOAx_Vm>#^7PT{~nA!bw)=St7X%08HDTrwHwyFpL_3#Z>A z7G)^LonH>zQ>0uD3k*LuuzS2uEclpykTk!P>HhI0TnZWKTt?gd_?Hx48kaTrbk|@d zvbKvYW1Rr+yyS<JaAr02vO1evX>76auIAkawH(rLgGw6N>5S(~D*#6;76rXmGV~=O z7lt1a4vmCN66^1^#M?=p*>ZzgI`K=Y-_C=>UuvQ85tAN5fbge>vf&{by$3|cC=@R< zrZrmCQa`*QMb~2z&O!IH<=4D_Kom_HkW6<wNem}&yFM`@F49pjzd6LNKUr=Qj&pnP zuFXGM^V>$M)|V1@w0_(ozKaMsJ9NUL3>z77EiV`AxEXv;Oo_;DH6LB$QK@42K1S&h z#YdHv`?o(m`>x|+Ub<&~D}JnVX48cu6mAQcaDM)D82@vhF4bjsaMU4tcUZ}+7%-h! zWRy$fTYlaY@4^%o_0~^o70VX;C(RG{XLi6T8u=keJd((BQ&_ki4gI8O*zZB)-7s7w z>!3ukR8iho1A4p=dX)=x&o&0I)w#>QT&aJpjkFJZmO{>&HH3+k?q`&GhW00{xx*Yp zwsuu?&lQ*%nO<p?%`D%@@&8uXp(<pZOtv1Xnth+omhbGkD9vjv@N+2r5J3tz{27+a z9|{dHEKP(xBNp1cgDuA%E)xzwg&xcg;Zh=!39)VRunDh@H^|tVjnz=3st)%t{djj} z@vyVW1vpl4u5NqyJEt){czeh7yq;F2{4GSQ-qZsLBoXvm!vvMFf5Fdzw0{j6SEhy3 zW&w-p|Hh#ID@9QN9UjKZ6igHf@L|-Ns3AryL0ni)QKtcxdz^DZLzd+z4idRx>c-sD z83V+PDC-hMwNuYW%2BrNPIw|P>|~8^BQu9CikK}keR#OIYs3$R!{-<+9TT}Dvg#=G zc-cc!VhWxoez(kEhs<-%*$)Bs0DfFK%4{{&q%A7%rS)uOno<5~fO{laoBw`PC750e z56BQ!qDbS#%McoZlu2j5WYNP38RRK9d-sVH(I=AC;|?Yywy^sp#T(2$XepXJ{o&WF z%3sTiu7^Kt*SdF7FS9x3F~4z40~?Lm)}_lACQWxtroTzfnUopDrz%Yz$3+B08bm6v z{6^Tj-5&4N3Gd&)TvwY6A52PpB59~G9T}|<cbMr8!{3dsWJm+6u%p6gycRn>5yW|< ztWDMvk0IW0d2J=OE=O$vrrW<WxqcS39{Z%+cjFsif4;$jbcTZ+GphR`G!ZGw(VTKW z=GSe)#+`vtHxy=t3fWJdHGI%Gn5|~sU)*>9JUMtRdRq9gv|J+KW2ue;hDnSDjKsD~ z76W|M{_J)1u)YB$x*1plv%;Vhq|~ZE(S~$dMEHSZmUXeuZKHxU&*&M&kp2fpB~=%F zv`cH&_Vg9edhUF>S$PA@!vZK<G@hxvVl}JcBKD(INM<WmjtyT%c(M6Pfazlsyku0n z@MQJtR+X#0O1aO#wX5M}|Ev8|^bu9`>zTJJX(J7eh13e4xoPZ7uTOANwBF+lp#>Ha z9MA4M(`ZytpC2rUi|Tx^s<xzGZW(L*BG;N@+}NzNFvyrmczW~X&8ySIpxq0PmvmYJ z(<0xL{-hw!<JB(e(}1A%G!w|xlQdfGViP1b?_c-fSb^;UDBgS$P)Ho@$Khh-Ss0NE zAleVTZJoQ#ah4(Axe9S<Vc9yEU?rNdZ+o4OeINi+Mi3U_TZ&a4bBE!V4Mj-~{MHl% zhJ)4(ZhcZ*dRc?G>6RHAkdHSkF{f=QW|grQ4(I(UyQ4G0@P2~jtD*%u_goGeCpfzk zm94|C;cvjc-sg593k*wNYUEhng7wp3#jvD_GtOs>Q*JA1;6CVd9!_=$FB5V7L1qYQ zK<k{l=-z0~&Wy>3<>Bgdn8#it5xGp4#A1|E1D!L;2!7(K8c!vC7CDj_xIHPy{&FyV zPG5&v;c9N5d#8BD`j(*hL!i5q=-|C-lw0I{8h?7XwaTYt>OEtRPo~voAM-GWd4=a{ z3j*7MwM=uVf_Y@alE*(Pj6KSe$F#Y~SnYObqZ+2Y5C)>y_ssG_6b7qt8T}6`g(|rK z4I~$dO8*@4tC!7~NculeHWQ-sIXi~B1a}67E3|5ij$coOvm>XZ=Mwry2F+`yic_gW z&8ro%U0hO_m3`$cC@~}u9dsHsTJs0xb_-<W%RF`#3R{CycHbzU)V<C>wj1A{p5FGo zjpAYYR~mp$mKJ-w+mQtt8sp^Mtq(Wv#4-@Ed*wpnT_(}KzneIFGtz#&0-AP}L)wY` zgs8y8BhA%BCf_AfOiJmD!0@?h?H$F9?b;<Ce4~T;^RPI^w#nk9m|%DwaSSi|Li5rA zq>XV{%Pq&o&2+zzt)F4zh`;{;xOME5YBZEj=n`6e{n7A^`V_wI9ruiH`c)#}Q}d{= zs}mD`^rkood&TKXqe`=d^&xRC7)p?Q@~tRL`L1BAcxg}mi;vWIv(kJNA-Law6Y$%f zLg#G8;+bVQSZnNWQ5F-|4X4dwkXYWpev04Pbt{!Q0K#>t_AR3$YfEbuy+ui_{+i35 zv6bWgsHUY;wJciOzN2Ay`k%fgeFs-}(}bZ1xBuGS_5S!AeMdyUw#Q@$?{7{odI9KY zGy>bBT>K5SK!@``(tQ5?kMnqcI-29*&yfa$XgWt?3*-pG-F9OyjpFP}L|%SKuzVwo z*GG<S-?#@=4nVt2a&b-EKO*JX;|w4KGecUc?I@0|3iT=2+J~|f`$kmv1i&EeuHWe} zx(FH)n`<Y@?F@tY6jF0H!`WAFiT>$&S*`oRcp>(<4h(<QVezZNI+=#vutUo9@c`iE z2-+B1&`Ak&+m+mcxpQA<uX;D9;huFrx)2K~m=r1H=9C-sKqZpRq(>;x8_gz*GW*c4 zOmImb`0mQ$)u6+8^k3ez?~Y`*YES}GGUX9DsOEVBBBcTcaH9{t;}8?yW4RYV25bI_ zZ?j~Q*+!Pzp6_f9ChvBY`m*S^llP}`*BW&g)>RnkW|e3+s{dgey!E#K7(!z9cC~J~ ztw8Wsa}r0}=ibOn1&M;McsmD;yb2ceE0B2l0_s|oqIk>w9KM><crwY|{_lsTj$r3p zd3^S5lJEBLA{~2ByVWrLEK5-21)sdhvjZghrVNSo=2YpdUe!_$Iq?-gQspe0<5jt_ zUtT^%eCXe=e|e=-Th6lZb$))uVmT`!D#nv#d5?klPB}k6uy=90>#+Hf?u{ZFl~x|0 z!YJA=*|$Uxa_9CP7okzI_n-$ZfgT#Do^N3Hzw${9aJ@X37%AoSMm~^J%5B<Vo(BfF zrYBe0UsmGwWCCfL+^(5uZCulG<<eKMQeSr(i)i$He-}T@8W1?*1LwNs^#z+Tex3+R zBYfwk?2=DU!1IsjZxzS5Jw_mZU^}R?>dq~W7xVVlRvWfvMg{pb_x6X=cw@jv(4Kqa z%xJr6SZEbJv#>}tXx=W19e!4?_w<b)H~Q1}Qfs8gmx)K0I9Lj=l8bVbqdb(}+S#0} zrv+|&DcJZ5Wh*UExz<k7asVShb3N&*MBY<NoE_^t3h_2_Ovi)i4wu9xjq`rx-4~)S z=jt^@vs2gBd?cf?<V@`V^D$^1lQH|-uJ~_YiszCgp+8$?%S@}Y{>J-?vAR>b=vG@a zL!5;^kHtowUoxJLmNua_5Ljydlu0<6D-ix7TGEhfMDk)Ob=!*g+08a%$F`^0LACXq zDF4*_P2yVcxHC${SxB%vhV+d`1iKjlmfzNZy1-nm3p|&xCanhBk7qAV$HbwNW4o6; z_#B|dGH%pz;^u!&aZ;a{{tBPe^<sBSM!aQzCOchjybUmj3LIq)s7D5_6NLH}0Ad!{ zzS86g>q7Jjs}@G(YRz>bQopn?EFW`hJ8I1>OV|GPf+yk6+_m;=!~U>GsMT)U@~4_% zkrkD9AIDs9ELnbo8HSVVLXyaeHJf$jN9d#~f9!))43(@>GX9Geg^wAhvlBNz{54u* zPg*^k?}FNaJ<;<ZYJ%<c;4LR<<3Q{zhDo`N{#Fr4TuF{sDR=4cUL^DJ>2_()_K%A1 zduG~?+iR>2o|8aQ`0|NHwHb)8E0;m-a+<@_sg1SygZG%%=!&fmn@H6&YLYYwj~`_A z9H2c4LYE-b8;FHX8T@MQll%#Wpu-9aF4f}=_DHPeqy37EPtg?ur;2Z<qqFreKZo!< zgs%B>wqY{P6*!7PR7*!Fs>?A+M?Vb!I!`^m2mWBf4xi)?Hn=WNr6WSCSr*YG)vH*~ z`rzTpDHOT|SEpQmU?V|A>?uje{q+&<SI@^xMdxbu^<^~*#0Wg*w9R}Jo2<V>@R!5I zcs{kYH|ojmGD$qDo)KMNrjOTnT8SH*!v~xaCGdNX6FrWNJYenJGE?|#r-*gYqGYk1 zT-`QPqALChwNb%ON{jud2?|Uky8p>y|98y&PagKKRIhK(6<#U82>k4Vqj&P@3^9y$ z288`zFNvw}=H@J?<Ln#L=7b;102OCW$at4T{1fli`?dMl%20bNALv*8=k7-#_(kHV zcvC70@u`NtXJU3tcK7UDU2}`+PJd-l6Tr+TEWo8QX(AdmrX@4o@3R&86c-q9)>`k% zaC^Gc2wKtq`LB}ayi*{(GsH$EmGoHdGXdu*l_}s2&QpYkJN4+^MS%+YmQwK~kOXn6 zNIgWybrAo>@gJbjVw!=F^Of%`usRsYj@az7-DdfEr1z|^Sn~T%8W$7um(YBTK$776 zGEO@{uu+l0JdW4($do8d1D20KO4WR_Na67M398&|i#vYv=@8<%_oNDqdIh;kiI$%V z7dt|k%1>nl_uA?+;6S4|B5*qjL@ym-`T?GDE7H0T5SRNSA1X|yZZ^kVmXInqA${m1 z?L>$`c2Ry~APWF{nQ;VH*$X2cvzFU-+^0C+&};?cEcSi{>N`Jlnq4$F&i7`NFq)eU zn*a=^Il{T0!%e_1F#%f6a#CJC30AZ59C0G&PH&^NZWJ1!GXZVug@&*+;v$$fxBl1< zXTZY`T0c_tnYllWm%Gr>3e!)Rv(<@|Tw){ymww#c=eO<M6(dglT1q$~@+f^?wK;zd zFm2t9-<6D~6E4<p-eR)=)0?8cz)VcP#xIA0M*U5_3pXP8bh<4~q~l*|9Hc)5{33pX zA@T@Vj+&=<QR&c$LQqg;b=r@Y>UtLPc|OdsSTFJv5=plaJin#Ytch*8F^dUD)~qzP zq){s)DP&3fsrUm?W6LR2_7r{U1SqttkVn~bjXEtfoEPyaykatBSn==~ud(EI+4$by z5Xw(dRjOX8vF3MbA?C5z;P~!*XH06Yfm80Qp#8(0pQ`R$jpf)S#eiTF!MDH-f~SNP zG%7l8=FPojtRfKZr%TZybC+Dq+4kq_l@^$pf7Xu)V5Hh>2)A#dCfrJ7rXhJg9JaQK zVXS&i;B$W4-gmC4D(|*gX@7x}>XN@dv)XL!oJQ;O7Dz$uzShY)i2r&Q-Lkc|I9#BR z-EBDZy~W*i47eDNOSK*x#%!|cWBRRiXz6K@w_;%&X_1wCu3sFou0ThK6<$GeqbbsV zY)SEoUs7k4wX#_BQdbjk=ociKGCK{x+-$@P#}T|h4-<bo`b-h+yn>Z9<xTTs69SG) z(G&OUE=o~jwM?VU^Z<K)X+o}=aMr9a5$ubsg=`aC7ZOcXjq9Ptvz;6IreIUajdx8& zfz(DjTY&y;YtW2elt7oNOuhq0Jn(_oqb!{7>k^h_2tw=rtb<}Qy7MN-aJp=;#jhy5 z02E@0%iM<eh5`xgK%2cuw6&l!=di&5O6k`ILbwLbD|cOHWYM&<;X&<K-Ex`FZ#{!o zH4B|kaMUk9&*n;W+T$d?>f65#8Lh+YWc!2stlL%`u698_kNJa~3`9^^zV<%RKA8F_ zTF&PhJ}BHToNCerIA+d|$g%Q$%XJj_?X7zdqx@)6^m~V86Vak$E4~g(?v1vyEhnAE zt}#nb*&e*2_ph`DY7(h=?gtaA#4S0{mF&1nuV;}q>%GfC#edjZs(>lV22+mGH*X_^ z^yvy~yJ>SvP97Tn((FEqG|uCA2DbV`++{5(5$Jd~vVaUt*X)hoe<|<di`67RYncgf zJB{JHgh;cok{>rRwVakqEy6Jxse4-mfsGM`y^TtF(s^%V^31U)?_Ty^`p%Abojy`f z&H`sVTWD?4aO<6f<!*dhFb?g9>HLA>CEzieFVtlx+Yv&_eLeTqC374Sm(rusYK2u@ zFhVC4E<{tkcxQIHrExL9{9~smxXwxr<QChe!(#OkHXX@=WG=TWc=twks{Q%uWIko{ z)z-&{xkXV4$2%QZZwDV($G2gmh__NIIt4%2H4K~awYm#YJb-E@xZHHvnZjZ=N~%Lq zde%QVF*Gs!0C__qy};GR;ce`7yT}S<m`46mQ;q0OuI}Taa-*zc^9pjy5@|h1FWvu2 zFHwB_&P8nmy3||4`{zAV!Z}!e3q-`}aD9KHF@}GmF%o=IOl<!v<=4vd4?Qpvh7;^V zeeFWRyvjhXppW0T`*BjvdQMF?V>I8w8$b)0MsuXXgGMF0)R^$<^fMV<Fx?7U$-Orq zuB45%)k=$R;c@4<u8hzQ;Hn)qvI?=xj2P0Ln@OFX8JO|sUKay9QCSwdGyZTLTw|yk zFuNUWMZ&0f4iZI|CJ@U?-rYMdPY0t5M*C?pL4UM}E-N3d+OQO8?{#*tYNF*dsv{*_ zW$3+H02ihmB?Xo021qkLBJfOa@<5Ev$1Or1MChQBX#!f7xs<k<sESj*2w2K2lRCcn zMJYFzhk02<7MnlA%@_>2ktO5yJT;tl$KQthf`4|h-lz0lQ$z;H(}m%5Jw=qe{XvT# zLmetnHqWjjZ#J5P0SuyND_)FP-kc?>E`&NE>HEN<D6_2j$1UoV&CQ(~6JnrUZM;>o ziaTb)BYjP_lI|OXwRXl$6{#*rEpW2TGQouWl8OWL4-pJv<mi5&+%5cje6TyxAsi~= z-tK#RbC;#n?1Ex8l0^~B<we3{HZD=J>(mqRQGw73ESFp-Y5<oE^R@1<JOFW42D@Ay zd?1mrdlrPMpd&Lcon=G4H6`m?bs5G;vU)sUfBKc9%6f@U^tYw8sFFYEU~2db9SOJ@ z;J;G?%O!Z1)gV&UrHkV?Cl=l?X>*-G)C?Q%qN(OwT*BAxcSaj<6}K&viJTWq6R*J1 zu`MRxby0?TCx+NC^n7c;`;2#v{Z=twf_Thb;$}X5j&XMD4Fm8g`R<2w14OKFR0>rI zMN?nW>*Vy6=6~Z!daGni+v>D$9RiQ`6#j?(W>fLj^IenShXS(P?7dB%jlP(GfxzlO z$?#iJ-C@8R$OY|4wlhx9CNY%Yg)5q^tMvAihkJrTY-Ue&P#AWC$m3xvd%>qJ#2eAy z^22@$p5XJ`<y+Dg&lg`x8GsTq4OecMt1h|J46pzxK0BVQd0d*agqp5tfOqBUZu;rn zI9OMiXnm|Un<y)BuD$$ln#2&)eymTY_DymHRpeJ?OUV86o>6Y6Xe<S_h0y}PV7Kr5 zo;rkHz;F>T9{QBHFekMiUAmvOuV~ZU>>Oogk0)*WvT{()!U#J+b0k>MXqW~8TS<{# zy|j9ERR~Ze3QP{^%EhWMvKYvU(`IOPaY-dwdB41|bo`39Xud-Wc1mK>XcbZ}_8!7> z<&yVRUj2xpO;&jDzBcWM*Bu$9fK>Y<v|4I@$<Z7O7HiGSf-5|C@3~kgGMO#Y52jAh z!0>CN$tnx(-khZ88!!jcXM78hl|v6@=!n5<B}zmzVlEBs_?|H4<+rLXKfKLatAdSd zbwxMal#mwETB*a{30i>IF(5~@RXO}JZ?<$Yhb$mG|4@Ies?K6&RJp+J#m&lXbJ9^~ zP3HQse%dv6ivYs+y~DVSVE7mk)4Vz=Kgz^EBqb}R*?+Ye!(_GhqOQN5()hG>Swsi5 zlleF6yXUc<8*|1w?_V?+WifOgPwC>alpkCxQfw!YqDH*p^9T0o55`8}6FR5>{ZVgq z*c*={a=B`Iw7CDouUha}3--|7C<eCcTHT4<`^Ut&Tx`pktF{uObKJw7WolFxj+mr- z2=33iurD&FQpw@vv14jfe0_mJ#3EgoaFl#F(le1XbgHd?8b^P27z<_(mAz%@p5@_8 zh68${cur9E%Y8iM^**X`>+GdbadUpg0NfvL*ZnvyhuU)M2Gqh7Phh1wMbZ<Mm6t9E z=YF43NL^X{a@ZU=WHFy4&}gzL5H0g>p7UMWpp+vlWp{0FK3R*H8l#6pD?lN7%xWCB z=8_<(S>@KMrm3Ddtc5EonO{D+xKrO{pJ_M4YD=7K7&Vi}A#!IyqxCe=FA~Ep0h)#P zR|aR$K>1B1EWbjPg6yMNYoau|FMH#%mM#-&mb0fQ&68EtasS8)Jp6;Uf43cHJDWH5 z_Phx_JsbPnEsCwRl-UBq25y|5Zf?<kt#zX({|y0^2US$j{_k^bbgXA=Sq!~;Q{!-t z-+CYz(x|GUA=?nH_1|PbvEV9!O)CJInEXmG+;_f6+@uFAfYpM1Z|05PD?TusI>9Eq zh7ww}&}m#dD<Au-Ok~37W|TPL9zKg<#~Mbc7Tf*6!<&fcx=d<B3L87)#KaEVROUn+ zN7+bw;*`ozs71)U#nia{%mCOj11tagLdG6-#7f;BZpiuB7X31=fL?CIa5~+6X2dyH z5f+njKh4%~v+%PO?>mi(bfz6n^Ch?8<A)@EPcKp(qfvJs-;cEig|*#nM{k4#&2YT1 z0;Gd&Y(HSRYz>`b?mb+sq5afuoTTNqo^18>bh((pjC+zpi(aMUac#6aUmrq2%<n<q ze&ls1rAMOHbUvvC=_W@UPGp`69zgKffW)giX$f>{$^s?2#NcS2*uq$91yUJ*NE&Y= z#oDu*o$-Qf(LJO3Rsvrm^tmjlK>zC*ll0G6=*oi1=kZ|ZDHev$K5m94t4%wmXInv_ z@^sx$<VkluY$h{MDx$eDf0GVh23+xekEpJgP@N|#Xk^L(DtPddX2t64yfVr+0A`Vh ziC%KGW~GoxLN=!Pv}6n1kG<%UJsTW$B<Y*i!y-Xh4B8M%jFW-Hv9sMm#{nzH8IPgv z2;#!cB{)8(1bk+bp&CQ!V3hCF^JV&Eq6wwe)gkSmrBV@@BHR@%Cw3fK*Bk2veFxh` zej89N&Z3Zd3AHb`m_a0D#Bl;kHXmV3ho$uL;h1stt;3(516chQeVCVN34Q}Gq(?D& z7s5yQ&`gHY3c@WB8Y-fBN%tm;HI)sQ^QXuq%Fy^zG+VEN;G^Cu&SxKJE?#@Vch!l% zsppid>t1xV4#Qc%+b8*SRJ&yLam3P7UZMEXG>fU#7m+vGozEqw#dFX#umE8*VcA57 zc-rtOM!GZBbE_$$@&vN502jKw2kRzAfADUQ1&w-6dfwrehs`NrH<!eEt~JUN!!PHR zY^+yU?AC2GfH65`D7{WoY?p$>K@t1~-)9{x02A^Jyx=qLI~0Lwf;LX`y1YL$pyCAM zOk6q%8C`SfcsiXd#_XO#6vLq_hw%6+fo%~)IE6afG1wc5Qxsh*Me<P`KKINMiM09g z68FMDDnxKnlCRl5MH02*F>>}lee0zu^h1+BkCCIV!SPUJ#@;ad%g5qOIlhPSKJwtb z4LkbXe5=+wx5(}mM#f+wZ#wNcr6Da&$ExCLVvi!rc}$Omn+1f^B+wP~$f-bco+}KA z5{kyUi(weoTFsR7E~f<oj8QkX`}?o`JLK5jEn|-pju=WAp$>86+|Cb}W6NG-+v|NX zEP4Xg{WiL=NvvzM=gs<P$^NlDlRT$iJP`o$|NHdUlX{B$xUUE5G9uhgXB;TRY)Q!> zjA*(1wWqVRX;!x(#~IHV;9+qqIYAD>XOg@hT3$Hns9Le3KAqingovyl1(V-(Cm_HG zX+zm)sjXXheCwGtFdj+)MJshAPhhJWKg%Y&`<zAHb}V-=Y1@SOLz*~oW(|!Hw3Yqw zM~x-d%!Fd=;J=0dxb&&wFA&$q%qwRqH(`C93MWeoIOl?$+!{jwQ+9Q`Qg21`Ol?Id z=@p_kb+l%Csb(vf%>EpNe>WOHTr`H?$ALN?!Jzys1D})_?M3VT=FmOEcjt2K<`YTL z{`^T22_NhgmjY6qfTaF7cdzbn;^M%zt(}Qkl%3uvUH7C;*ccKUGCv<`o|~{0<q|D* zji#@7D0tYcSvKXXawA1EN(SGlwW{rCt2ggI5XZFg|ApnVTh2$fTpOFm(t+nRz-+uI zxA%&eMzMt|t85P1Yw;IB2>|(hr(*<vL;1|N$eTAI2YgY2q6p#+4&<IuJ@rd<B#8F9 zfWdSt@i)1Zob0d7b@3DR=<>hlOaB9=^l!x9=9Wy443P|R9kB0_7OuYC^%Ivc7sNw< z+v9PbN#qhjro-I<b!n39@={;(tnEU}n0Q=2z_4HbOLT|7k~CP+BhCX(vEux9&-g3` zDt_)7Uiw8E$zBlA2eex3Wt?EN4J|&!7cfDcEs$vpowJX&Z|u#yH0iKgM~?k`sLbZB zHe5fW`%GEc8`Y?Ci0Q(Ba4ylVSK2kN;jKN5k2Vq~rriU%;>IHnm`-LFsx}9d?*PIe z8yGWg6~9JZ;Pf)QIcU^r)oyfBthHLmdIfv~)i5HU8Yhd*t~<RIz>+hUM&+l*2?(py zqzjj-gfB#9!2A`BwE)+V5^*ivf@JMQ40=%Q=P^n?I+8)zB$h65f5{liFcpU+-R$0b z1aRCz4NhS$d%5@9BiYKzFvCcA;HqaK<1r<frJociEp8`(cd-q_Vh@i03Aic}T_ODY z!g_|yiQ<4Tjy;v`apLam*&kbw^fibryuh@J1kt27(hCeIEm#|kAnfC{*2INFegGF$ z0LE4IKN<F<0nRgtF(dR>fKIk%Q)=}{i%%;GSI$%^oK&v<8Gw$+8Mxw9!PmP^>~@qH z%oQRP=P<tFv_I=hpzx}5$aam=bT!Lr`eLg)40`iAk=;5CZSes<$Oi7MZCCJ@BKShL zVxF7rY#PZk^1=X6|G(vy6XAjPNen4t@A*bO0|-1`(^S0I>oF`2+cr`)dTnklxBK-a zJ*HIgt8S}JvtuV4@6P;TBhxwU#V|U}H7QBn)|!rx&O%YUDHW#ooz3R!f&hVVxDwX3 z@Eg>1p}}$YN2jPN%becf8`J(l#<t-mJ{#V(hMK%!oOcSh7liMRr^^jY0i9ie4GsQ6 zYkK&{7;o39g}UWAfPcOQwH6)mXztoh1Z#wEb%1Xv-s;BHbt~CiL#NSg@eY1{;6AeO zFktJN&Qgj1dN(i88?CZmG420{vA2xss_piL4J4&Ox}{T)?nV%hk_M3y{&Y9e-O?%D z-6`GO-Q6Hv@5TK*d++C*@s6?22R}G)ICQObU31P~O#=U)PZydFtt%yjtEQMm;EtwM z&db#Pw)~uy(@3=k%{*JqF94$cr@Y``<l^qmu_CHf$|&=+yp(lAexQFA(Frx%7wH&? z;Z1Dow01w3Z6eaFwP-zt!((-#BA1OwqL7Z;Lm%ufX{Yy5Z;6}Jcl8px$o(-&xsy1k z{^OD7828tOjN@odN+vX-c2<RZN>;NgG*|pc`0o;hy^nc6QUVnlH@{|nukqHdapM^_ z+jbljS$%W<Zggu<uJ<i5!-hgc+jP-`3OcSuIUs6t&=2k0pd~k~SwNFFRiNz`h{-6q z&wrC-ceo&}*<ha;gvB6#to6FED%0pV8^4do+S+~fvCZ-c2&S1B{!JW@BZ^L$EHmuk zMjZ~|%T;I-&BTsnOG#NTC5X@095PLg#(3=xA2!+r<;*{(^RB#z23!Ff&Re-SOH1n~ z8|Ou4xtRs;S9l>8a@I$Lm^Y6>!|Y>c`p0p88!FF@I|;mUp<<|((~T%snuIZWm-qv3 zp-6xsu&nHrRl8a8d_#RS{C6kszonT65cZpX<Gt~_i=P&bq7mkP)M!WMEy<Z<S$&+h zF1NF4^^6K)fGX!Nayxc4U5_~dTrWskoB(-v1ah@<Ueoy9yRz5>FPW6`op%ccQz6Rk zP=6Nch|;5v8L~ixtsgul)m}*=_U3i6TW|TzFLranDua2U!32>9Ug|C}6X@gyn>0Yd z?>VpUziz~HDaV=mDW#Muu?ntK_eat%%0+4c&;`dY*v%I*?{898biB!teShHgx#*-@ zEHAyDcydX9eA3&ig!`K`_d@@+QuU*pYl*OxGeP_xC~KE&?f1j7)=B?DX%5Eex@{gT z|5{UeI`CD!Y?rS>eJvkg*oVTV|2MYz_Lc>>4WpZzEt9){t@Ymo?Q)1P{$r-%_*Yt1 zyGM2<$^YJ^ue^H+lYYXVPv1B)D57m4e(Dk2pCoJ$YrQy7N3ZZsbGBG`@mF3xE5$F> zZvBb6;G}Nzz5}+$z3i|SX01wbqDQovL8pmTFTH8UOhQhR``uZY?S(iHkYyokFl21a zWWWvlPzOQG*w$NrUgf<eMjjt>KKX$VaHr4PuM(QnKhio>=;htN?vr$3(tem=#XxJ_ zpQ3+>f9TM*<8&*E!+aEEd(z%r?DrOK)N9u7+~1$-AcpGT)LEGb|M6g^%**NTj@e}0 zN<iN(xwQvVy?*~Y%*o1-z|0kL9J`$nEp(4r<Qq-<#jJofVnNamH=~53O0>Gyuh$r1 z{}>1<YKs(C=6o$u8yn_-(!;tdf{{8y@J*V{mR6tU(D~zE$z?kCwk1>XPEb@F!)!9& zr)|@aD7H5$C%*@+t|~a7?Nb!Rq@D=H%v{Ed)oXgS%83r)Viq}$iE{`V3A_1Y0zi_w zHB}smp-c{p0jj|jL^aT@L$us*T%1m=K%s7$@r_b#ZrdJ6L=}H+b{S(m8M1mzb>Dp5 z?2GQFk+(%A(8o^Sfejc*L`^^~1NvCwgtvp4N<9K84-Z$%I>ic1)~HBZ*q`N#a#)9# zK}=rm&f-!oJ}5U|rf2bsY*@s&>j1Q~bW8aCGT^LSzn>aV8fqqDzl$^*s^{Jlm&P(3 zc5iI)=)B-~il$Z0h9T_9?q2_E_{>ba>K7=2za&KK`w%}3Gi-EsO#=vGcC2qVwU*{1 zenf8AfQ~w-D@~QkaSnWluhi|X83lLlIm)B~)RLo)7+$l@ZaQhDveM|4R?hd%K!~$7 z3pA`yoovFiH&Ad?lQ}YcbBR1sget`d3DR@Zhc$PX5m{B<pG?n5WysD5;1nfZ&&|aC z#NprOFFAEkC1!JY3<<OukrfSpn%^b{%hZcWVfk<&B8h;`TvX~<G@)5LO81f4DUe>i z4zBn&5<wpnK(+91gq;BH(CcdYrV?GVvq;;<G@*ViP()QZg1Y3%IvF^<GT9!l`xUuk zI1|W!fyDBRcE7Oena!REO>}0Gk7UaA<oER#4d`2}=sv*M36sEPOF>+NM!FY@%_(Av z6y8JWSv-Gk$ZCQC^pgSsE@oRfA9(sA6b3uZ2;fj9uUxL0nulGh9}%3k36AY8$Cso5 zwz0MKh&FU*n6~X<`3YnI;Bp%K7lXSws#v40kEZ1YU6e4VOL}ko*zhsUqXhYPBF&g_ z8ufoOvy3CUVM7c6Ot<qSf%juBS=6eL5zz^Lk`v8`j92^c{o18T*iGT(kMqOK!ry7M z6UK16UWLgM&Z%~C^)%c{HEw^)VtX`}V#OQBGBw3$pe_G+4B{i6g^~qI&OXqHIBC<< z`r3sOz~&Qx`aV<)zMZQIH-CShn<&-u4Z=t|xpmb*u+84{C3_6Kh-03j)*oM1$#?Dn zNw!X^rI<2YG*uFpDehdQQPa^{9;H-nhzEn%v}R@fbOL*JX!6`>v8HpbS+dyZ9CSK9 zM{VkDQ69W&<q`VcLY_DVR;U|-D0usfK-gls#39f7R5D^c+$<5xpn0}?KDdiM+2t~P zzb&%*58lyo{hh4JXmb$?1tvkr^tSR@=#oA)lgwqKl$hX_9kvXFE}mF#Bc}caZQK}z zvc#<;Y~IJa&h?LKx=Uf8a<q^_wJf<a(Q7yNbw@uC2M16!n%um4;O?5B9yjXS*yTIq zPy*MiHSqoXqg8}u|5qMDZAA3t|0-TYf$|jmgDi)gBty~cxq+uZz}VC3YhAs~1;V}# zg?u|izW<uV;?(-aZfn4O(0^DqG%!jye-qUXZ7ML#I8Z^qx6n+Z)>{mN{Hq&*0IkMw zi!fxHasD^*uTw#8jjy7-gw@vh!rAD^N&5yv1Of&zbwhOu;tLEmRKS?eDUO$vUST;V zXi%*i6aOu!TAG_--g>4Cd4B*n_l3=e5BcocO7i>|-IM0NCnt*xR2PQ%`?u|>{CK>7 zW3%iU|3#5eCs`i#r}m`&^0>8>o*rS#U1bM)Yeneq3yizV!vecJMx$QHWPYBO$i0H7 zJ>4<-Vg%V&HQ)RfkxPw^2z03EJ|rro-$?Wac6RaJuP|uxpsvyBs;`1X{%jy|QI`)7 z?+(V1dIOJ9s;6<i8Jmh3QD^%HH38)%i);$d!BN~3FamsiLgxKjN}8QzQ|X1W0Uf%q z-`eYJ(z>RYJrFd})NmzA8}2w=qFq9EmBR0yQm*eTfVu;%rVH9M?2y4E&ct%V;o^DG zjzDO{y&Dw8=kTNiE?Zo1yoKjikkNhQkT&lVL?qlrR>!jXsm^p{ZL*@!i&ZQ51k9UQ z{iHFBTtfnfxcMYSbaMQA2|Zn0`=@0v4BkBIXw+Khu(}gwQKr%v>vREet)?uQ*xTvJ zIM@J(+%Q~LUrnQp9#q8&1A2t@XW371gNhRd0LPyjXQzujrAZgwu=MDBr2-jxb*GF# z;so0CdeS<ajARWi$kbcRH#&KfMDTWJ)i^kdNm9g8CE8DLri=AT;)pE{r;&jii_4@9 z^8sxOpP04-T*J5fqNSE~&$b40KIJ#=zMNmFzdo#4rkZh<pz7AsA_Ce?rBNpu6pIfE z6NvD0Mr}^dV#i|;#mF&W7|F}^F|5LT*{#}83h}|j<8e19HG5i{s3V(ej_Jr6Sm{U0 z0Tnft#A&X2`{f8QrK=(sTQa1U3@0<sT<M?4j|`E=P2@?uK&dUo_e3|Dt12xXa4<a` zOQ%+AA!xi%NkRgTEDuh!f%hk8Z-K_N`E*f*dMVN0_sXb!bJeF}ACa+;0G+r$RUqA& z>J}LK=oAbP3y)&Wc4!?Doa258prax~sSXDMTjheU@siODpD5kAMXk5#z6_6L%rR#3 zn>~Ctj=kW(0$XCU?kWs^r@G(z7z{flKHm0Az3Zxf0`RdBFx7)}2lIpMPwK?xBxht= z-Uj9DJ$b}7n*-5NZr5%lQ)N;AjQiZrDoE_<KA@A9k8_3ts~rE)I<8BMba297-k&;t zw5~a4`9hjH4=$84?WYtPwDjAfAlAf$VK11_G~iT8pdg7BjyE(rV*Hoh=JU@ujho`Y z@~htN)C8Jtt7E=J>i&m#qun*kN}YBJ@x&c(K$ZSm8lTQR_06VrrR@+JNGJ8R8k)== zP<=i;;<DzWr7Xry*pKK4i;vb>H!o-0U`N1kmEg3?8Mg<KRU<M+Qa%xd;Ie#XpU-gC zCJ0En+ev35>WOFJCb)ky+!CL_1f!XUm7<(Tr!;mI4<zy@*zd#Mg5)R^YLQjIf{m1K zBJ4)+)ER*}Ya&ZQHgy@TET&{RjluO{(%_;Y&z`J(mxW@SW%%7R9(0xQZ0LzPGMYrh zc(yF5Np7iSyYfW2C^v$`KSRon!@vyc-}1nnCdjtg-dLUTFGELA4)WA4lqa?v=8bAd z*R0^9se<jQ&E_R~F$r~-<8r6^tm}-r8x0O||E?qRk6js~W3iA+{_>x4`<rsx^vL%w zq-109{YWK3wnmMc=|!TnJpnNDBW&&t;2dxH>i0JbWGrI~&h(&C<BRAFlvV97DGXoG zRa&&l+wv0{Azs~Vr)C61Eu}&AZMB3_1q;?CGk(VC`cNsiEX?jwH_Fx3Y%HysBO}cP zaH?qM8_bIq<l`s)MGf(<?fEFrMMRiWemjSA=v&zE;j>&45qCj*k)Nhu+5AfGp+2PO zxSG>yGwtTwKn{#;7pom27)MJP2&^WG%0;M1s8h)NkG0d@t!4N`L#gY3M5+Gi+vENf z<k|kV@FV5_-nWA=y?-U_JQ1_;hkr1_vKsID1QTzhdmCr<Mn(L^e`Nva8_bp=Zy&5H z`VsAe?%niIf2KUxdd6yvc^jlGrp&v3R-c-+u0U*z1Gu{I;$s_M|3USE?xvl%lnyP& ztR*GWX89tLEg{rW;Wo3&{jAVY=J|HJYnto$@N=9_>ZT0m?TTHRIP<>2>?gxLIkx?j z8u>=%2}g~~g}<BS@$G!1r0}nyP&OrhIUtE9*V`XUa@!v%>LYuDXdOjHQ`ro?-bkZ| zdGp~ca;cbH*wE(pD@ThBi)ZJRQ6RJ(>`8&n`n*fhnV`1@L^IwL(r02iqEO41hx5Bw zUOY>gdjvKg#flR}bgT#b8|TslUtgqWnZL&nso(rShIZ5$wB!%xf98MrkTqLjn5V08 zAWL9qg)E~`_~_Z0XE?0&w+$hS{t3i8je5L>DRcrE0dSdLWkA4=SJK-vf*jy-qyBEj zE*;Yqqz}LbWybDk-Krt!e+bm~Lbqh_^Pm0@kA8n#YU~|GNH-YN$^fX0x~?Achn^Hr z-aIgku+K{*qx<+e&VZ}zF1#CP=5J+w!N&3%p#|Zr0t_VQ2T*-}O*MFb@LVx;tN^3y zjfD_#d9=9C0v!quVLeL!7W(o?Dwg55YDHtj@(J<@7(Y-#BhX15*Ezx$f=6W-c-`(f zs>~M0NS87+MGTA8YX}3mfNV!GV$x7#*5uoCaq>iwx-y%>HVJBx#tj1rJX_=^3_I%- z6hx5o{`Tt~Q0|v)z3Cb7H&zE_T8dw<=Nnjy%UI|{{N@fCz7-#Rj=cnVVh}=TJMf%M zsF1Iig4IL(Iv#uUs}LvFkM5)6Fe($um(Ho5e)!mU13uPpE`@#xg1K!A_}#s%Z^);J z+a&7MCWM9;HL4ZaHXA)U1%!RBV~rGmigt-Zc=2Ld4<ya(07%Chk@bMu`SRel)8zc7 zm+jg2J-s?x(LAg*B}Lc^>o8?s#xHaZ5q5C4CWY4>oUYN9m5jdCB2azDSee3O>s!ui z!N2LYp>um*fv8x%QIXJyhm_6~nrpGzo%?AVx_(gDFLZ?Dg4wkGuaPZO%6hlV&Q3#_ zXeFF4l}n2gYO`{x+3kB`=6R0?e#n~0GkiR#ZB7!N_gr(lzVHBm`!<!7h{S`*1&l}! zLQexY=0@@3L^W<QrZ-U_|Kg__(Z}h`?fzJX@t2~6oUXU_02;*9SH@e<lu8X13&Ah& zS4?4ro9hMiMxg(cZzP43r2G9T<)IRz64}exN}97dB}^lm`&w!~?;ro%p!RKz2I(gy z;-T^&oo>gE=+gK*la}%DZ&ICgTqnpS@Ik#^mTl@Cyg7Grmhu=H2D{DC(u1vp-dFPk z_IOu9a$*O(Zs(Av^9=XlFl?<@_-C<h&a+Z7_E__Opl&g3S#c;(oevy7bRIsi{5t;= z*Q9YIn*U|=TodD}qk<-#rWxjYd-2WryR!HpPBc1FF0xx1^U4)n3}N#B8AN=Akt7J- zGAw*!dhW(q0gbpQCXUf%VC4TTMRjr8jq8L(8k@g!uCx~bMN$|;2^VfnBwfHg_uGA9 zi$pw(Fazw7-W>)*r3g@kW|jolnKmX)opOfXUkW`Nq(ORL{mt37Qp=~$6Pauau{Eai zG9Y~?YasqO<9<&yNvY@%GFf;m{N45MD9=Yg%qGA(-(SN?zZX;Q1jFRiyLeW?7P<B< zK5zDao+-9$S1`^_5$8B{gW9r&{Qe~UvWZfJPuQ0}=VLiY%E8`M`u(kaesvM|C<sx4 z!%A)w1k?W>tMU9&Mc#4*S<9F?rA+?*J#_Ndjs?CZXbWYoR8Hr7wR0X({-^sOHKJq6 zd!(xs;kw+NC{freL=&4Y6;7JuSH-q2xUlJ-%Y94gO&X@(ehKpHvYXxqBGG(4%Nuk_ zp}EX-VqpB*ay2=&v1ozf^Pw_U%PB&vAOu4IcB$!(yD79kpAEll>*L)O!N~F^sRz}8 zT{Dv$HpEyY0_M|WE-5sYQ{m4PU5;uqP3Q4?TcW!pYWC@fS%Fd!wQ=_6g4Ok31&jAg z!pzAqdfQ#KwyVaaLUU1EA#V^PXf!{%AkVBx?bZT(?_@$JFhqrwY;|vRu5T~)Z8oMe zCd!(w*lp1huPq)2P9;^J10p?Ugnmv>31NiNduM6>ugW1P4*`_tSl3VRjJ9Ok$a|kL z?8a`+KRnEaSx;t8^2Mt9Ej$XUOVHI!|6aHJ107(>%Nmxl=^&Ug|8oF@izy)Cpk1xz zIX+pX{#d4~cym`q2x268r#TI^yYa<7kel^Tv%5++QE!*?^KLvxxGy=`SXD?@3!BB% znJO5}{ruT)JG8p~-j5I@506II(VKM-WYEsr8W5N=uX2>p$d)MPr5i9m=ZNLsE@y(v zoO(^sy5JnVRWB`f*B4+ToVF-)UDz{f57Odlv&1vyMY4*tn(6~%rp6-4<V(BFQ=L3$ zD+15vqtCX7&3D;>!u~Z(bMZd$mPe^CtacKc*+N=?9~ffCHok_d4C<lzKqhiO4JOu< zPCS#K9h-bmZD{_o0FC(#a4B`CP-ujg{w@IM|N8zra_>v1bwb{H+O;!`HUCt9&-wID z2w%sGf-(*|2MecVRv8W$#-_jJtZO(d+2etj{TB#%fLtg_XZu^0ZqnBC9uZn-FOkPF zA2S4VG!UeMX5P`rXTl;9a4i@vu$yU2%kiR2Mg_#rT~853QQ`O9um*&KIHEZF<EEOq zgxA<@+{cAqP(QrOBe*KrlgI)b$~g}IR(q=#%*78>qnY>Z-`$Ed>f{Go_*qYJ&xbz) zx2eZz)78`t7TEMr$sJz9NvblG#EDtAB-IEoegvQcRcGG}3;%KH1$i|yi>|ekr&_`F z44D_h=bMFk5D4bO%(B|<O(YZs_4FhG??iUb<EAU@OzSfjJbL*|=gJvw)5;GY|2?Q6 zcR6}95{A#Iv79lMBU{ot9!{cD@hV&a^$pHb;qiD*YT(9wrg+{XK%@^H^R-(%<|@;E zPZAba0YYP!i!|-$i@O09LgshgK-!fJ;!)KvJurYZp~h5;C|t+vb3C)EsOnO>R@z{C z@oF|7)Hz_(b2$&|u>7nTMq(G2iR5O?wp}UWhhtv-kf$83(0`$9yOgJ3NTXcb81@!3 zYM{UGpRq}&nt*8QRm%9Y1Ae$8c#nKDXs;gUQ>`KC>g^w27-E%mt`xRIX|)Q2s;O0+ zpq)*SPdLH&PIn!JMW});k{>nnr~M&j!|Tms-qqvI0IFau0Vn|*sc>fwkAs^mCr+n} z21pN4YY+V>wCm4>@zT|Tgt(tv5+U4n2V-(H&X-63#>}vlKZsfs7NvVFx<V=<Tb`P; z)1^$)FH&73$;6%6sLRChy;FHf(By0}^Qgox4{S<E^~pSbFzH$RMeSU;oxKYy4$ZY> zg(yukwpwp|n9+XPu2<te$ON%%5Yf1GyD{2Vz~^{Dok(gDw_8d|1w8Vy=wGGlo<}SG zzpf3#kbjg$2?F?ZDy2Uume*%c9nTNz5HKCD#T7F$zX84(+6?Yhe5%Xf4W#{-Y{GSR z;J3quE<k3~NsB-ea2n@!>4QwAgp<~Ki%qj_oLhTmcR)G3z2N!Q=>HDk6$Y%H(F8AI zCS@kS+mmpF2h2Y6({5&Zu@`>Tzq2z{@D+jU?8gi!N?wLk4{zRhdRdm%rop)nTl#HP zQT=iZf%a@N%OHc#;1yXtm@O!9d)LykC0v#F(=T(=PRp;{?Ncm6kyDED?<8XdU%e+O zv6;fv0%`5>l0euADbdkps~dRWv_fc)vB3iooW2sE6E;JczRN}Y`K;?Cp0#c>K!i-Y ziDXRr;s9lXZrKo#12JugJY??v&Dl-Q)xnLHDfV<?=!4UM_|Y@W7RKFeo({yrSwO!e zdSm)GnDo%C{t=-Kn&+OI<Q`NhvG<F{lQaeX8A=o8m+@2~q_06*pk0y{oq}BKjVvI? zC(MH;KmLx_Pjas^stA<~e!}sl-5h#AA;G1QSW7B}*2tXV0bS8wygW7x4N0CWI$->k zFpb>4;qyAS*yp?THW*HlqW#J+mPmrxqwMX69>b%OPR(V@q8&%2Q6x!VJe!Xb&7j$* zrtY<|SRu||6|=D6@VQk>+<?q1H0*)Q(d`U-5kEEY9INj_Ictt~qQ%|(;;Bf)X(o2E z0)LrcDS<bZ&GjKZhWGrl5my0QZy<wCljopxsiPotRqIPMHYA6v?}*|xpaS8;FbMrq zaN2_ZWsWfTmc{x1P=V4=N<rKsT4OOEdkC`DkytWVo$~N>ko=}msq<Y|ER{c+yd(`d zHgPU78%?!$ND=mo5B7}a&rF{H;%hn)qVHtTe6QcU5vgyGk_%>k;w*OEK4_3#cCPzV zNE92dT0wEiUSW7_J>*jH@pE>!FTa16KcrxDwBe>$s~;laC^C+lZaD6&*gOZ3zzKQ6 zL+r~V#M@I)pGIm5+$w0g^l}*-cQfLggb)}fQt?MD#Y}&$VP=<cQ}pWXGs1x_UM*LX zG5sNBYo>9YaaNjPhFJyYC&!jQ9?tbq#_>TR*>@+P;YQAKS_ZC3Ep#NLplDCRuj#Gd zxEc&e%M2Dmx`husW~Slrl6=8e`tdBDR^hmY-W2>s_!LVqXDR$S9Y2E4bt#tKy^Uk1 z9~z78juun_If15UbKsCi!nj4r3Jv|+UkW3%YLQlZ9`FpM8?tAbyA!)ka?F>&fJ};_ zssv^{3P3YAUr4$vIb!9ib%osZ{=M=2(=Qb+*Aam&Q>L&yZZy}K2b7;y`$aX~m|jV@ z!~E`vQLD5ayPq&H<l^evplob<JILX;nVT6<nNj89+%nH-4lggFWck?M*Nc1By=cAl zCsV7V__QvG(M5GYkC{#(V$V~(W;(S9H4BEF8xUw=vKRmxVAg)IKh5slY^V_(LfKA| zYKi7E@Auw7@axkfV_%veBa9Jg{N;zwxFH2}q#vxeKCjc?8wXL&GB#h!FU)l<Xg4~P zT}U=uOgZAolqsb%otktR#cCS&pAWYPoC*LJnh8(G0LYVvbY19<ru$eO)onxB#fy|T zQOsE!huO^8Y=0}(MP*3!r%Kv+4BInbs?fL6umjqejk0d1u3d>0Biyj@;*D~d`YUfK zj3taMp&1AO5l;v9^?n19Y>0-tD_y9kqs!&2;cO%D!}ODd@ffe)!$ibMcL3umB<(z6 zE%Zf6p(x2}80wp81JZORdJAYoKbn(n5;pL9;8T|0OnY4?{IJf+SEA3;nHo^t!l~q2 zN{h>s#6!+y4Ypr(4+iG4E?R2BkL=>B0<V#v+ZxUjSRwkOZ9ZGXam!I!G>O+I20;Uf zHEA<NMv3Q*U(-(>uK2!x`rz===K%TTk5kg4<xF8imY}=qI_2=e`$F}S&;^I_i>dSN zBF!VZN>++k$C$%g`J`#t&g6^r(D@@cKJD6d)wolWEn5Z$gK;e#EqB4m<o?DfK0WJY z<5_8vjWjx>e&LCrOMKycmyOk<M4>BJB5MJG-nX40RE4n}_G6$ah*9f8xMV)p;<vsH zcJXV@E%F6QI(8Ubw$k2DQQ0%EZ$FlB_~3t2>2Hjk&Qlk6V~2Uipi=r}3wP{@f4A`( zW7NmO;*D$Jx5mg~jpngSWM*p}SO)?5#jHz)EtK>(Tj4c0K98zCZ2NKcg~nUf3)hzG zhugkwwbh=vEKxV<BCB?$GErb2M$k$m(P8{}Jjs$X{23Bz3V$UhH#Dr#%@lPyUR~bA zhs0@AsxEvpe_zb*wg4sNG|d&H5O;WinFBd-J%x3E;(4V5^>;C0cuI@s72(UUpW=VW zR!~p=`N9AHZ%fNiU{QTe2YR!K?R13ZCZ*eP#lvLIS&O)Y=rc}BL$Wi3Y;JQlLuh^| zoGa%1E}#s}Wk{OhL7WWzxHi}Q(b2Z-_tM~W<=%wWMFP@x6w*9+bZQjQ$yMD{@ju7| zg!+8<Ele}c7B4GJYJ=wl{3nC#_T`;zW{Ax+&A5_|v#B%Oe~~cC;Wou6araThEB6~| zrK31|yU<JFlN4>{4iAc#IC?Wpq);Of`bhI<g4~+12797BjXLID36JoL6))so_GK4> z4dp!f&R_ecylBvUU%V0hYL@0i-R@7jYw_7!<Wl#GW?28U>%=opt(Ge_K&fD$2<)7P za(BtF+4t95HtsZoum7v<gq%3uajT~10T8`+M#9hf`>^Zqbb9&(N+l_2%K15Ru!fm% z;mGLs$3$y2-Kvy?NB9U!UOA1ET#%np6;5iooRW9xb{cuWXift5->{2i#+##Lm_ZJ^ z!K5qJ3fw)Ig6~Quu{1_JzQg(4xLqyUcbXQ0NVd?{s+v=#U+nzoU%xSHqyudVD|We4 zxpPQ8h+*M&T=BSjl`cst^u2a*JH?q~*@6G$&%@Nd`3&25<va|Jh&dDCZF-}y!f~$L z2jn%mM0}QAT?fLomyJR`ff1V9TD5!mw1};STH!<#JkU6(sIgQ@ha8&LgH>b2ivg%r z+j&zZPlFCthcrMj>X^dprBXdDf`0VS+KN1ncPvLPxuZ+pjBeh-t4QeHXr4A;OV_rE zj_PB?bZN31)m5<><1+lNuL90|Bu)8%O9)qoA;o$~b*jSVGx{BWtnFA6rA9gvE7nyV z3I)7%9JHS?vFThT>;6|d87Gi8WHqH)_L??<-JAi4F2ymnaNOsNa-blXms)|`uNu?e z`Ro`bc$(AV$knc>pR+oF&)X+J05k`2rl$F}>#8O#?*<3APez&3-0w+v68Bh5;UAh0 z&VsT6PBVS&#d#u~Phm~qU@Oh6lafYmId0tkVy}CgWYMoi*6ctOnT0LM;mt?A))|+` z!pUC&RYlC?_4ofcCVKuqo7J7uEqwntTK_*Br4>}FFHk}vtEJ*PY<9vk<lc0JMzJ0H zdy_+PU8o_GDJZ|+rrScAyjN=rGCrq&bP|~#sn?xrv?@l_pLt(m>pPy1qi-YJG}mx5 zL%czPThC_pkU!1zmFCjDws7vp&fFXaPCy5JrX~A?)m&XJk4c-;bc)LuiuU4AhJ8P( zc)Cr#GG0-?w4Z6uIR6=ySK4^3Z@$8vh|vLSSpC9BC-R5LSbvnlP3nRH+O?z9ISjn8 zHVqU{m=2&$>jUBS<`Q3RI4MxPDP>dW09F~TT49jK1q%$2)F`1yTsy?V9R0L@FE^GR zAG9Ms=(@okEW%PwXj^t-c5&~cb~#(7*vmHF@SS$7`%X9)0FZF{-Oc0OD4@XT%`DgD z91Q0#U&7#rhaIq4t_^o3?gUwyUhQ86PZTKg=dSM+l>7qnhc~;zNSqzvLdS?>!0`|b z?B~Q1=7kb(b7(8t;LtR-huA-zZw<c9vu;>HYra22z+p2{Niysy)+CAsQBWgu-o5@< zniGOs1M%p;D94)abf*v)z=rXhxU$BiA4w|&m2MB3gV!;ox;)lfZ};inzB=8E)kdAs z0wLMHJUo07=)E>B)aT$I^C?U6L))D{YAUwSyl^ghUoU0q_nv{AF4T?>zBacY&Y{nG zm>0rp;7j{sBDahrUK_HVv&867;JTe`f8c6$ST+4dl%b(8<J9*9uLMhqvX*1?smY>{ ze}RCW_XhB8HJo+fm2^8g?u>6+&gzEo78=EUEZKx(Y&;=dzhN0xpwFBbm*G}&d*ZF5 z<gE!6Ikg~4aoYPNJkTU&x9obA21^(jFD%RdpeVHVjl%V9l+>w%QxA!sTG&YOm3|{L z|HXuY$M#8@FooxpA?#|Q5)I%+Ss>#<<yT905(Qty)of?_&DqvPL<`9XxHR;(%!_Jm zcc-<d<5^D)8>-8yH%Mo-qNFf<C7!0#g$G=nl}d-kaxS_O2f;qg3hUHU#a>&wF;#_1 z`nH*hP5E;ZP9`Mrv+u((kCyw~PReZ}Do6z@0-jX8cFAv-(edF|BrQ`Afa!%9;(+Y@ z<K;e-)_BYPnbiCPvwk0T<aN{(0-JT3c1w=l&Iq=k@3zZuN|W9&FWxL`pclu<#DTto z(6<88y+XH-RM%TP;4b)Z0qz2}cdt^YlCW>k$g3k=6AyKlj)z&66-~&)_|D=6QZSz! z=`4*>qiA1&e73S>6#9=^gh2&4*BT|GvCGV;xvCYuH*dd;y4a;)Z<nDzTqGCA9QK<q zE;d|5;&h#7#t!1WBxi9*KiT3Pdfcm~gW{2M=*Km8ulo1(@WlmX#2zAx!N8|mo_FcJ zyaM1Ia+59HRFR9lNqz9E+~M>)`2LSKfwl$<$y0^`fasMl8<gd$RmRba{iT4ZsBMCk zyS$H?sWehZyZ|eu`*Kp<aP{BitY6)MPl9d4(gNhcKs+nMHhf>mVAFgJCdeP+%Q<;W zUNFAO(u9h;<6sxamQJK#F&MC@aCJctPXh^amnV0im+R;1mB2!p>H!hF;|Ue)CbQ-G zyYJ|k8x&pjkSX_3?&bkzi9XGkf(IN5XqR!N?8ds1mV5nO9Xh&IA=WVXxuu~obiMD4 z%ACVy!?yJM1^z61&4#haWPuF?dbDx;?#;GG5w51Qu^o=#d=)$0AbYN&WFYqM|1=tD z5~$C81=YRZjjk}ed$?)zgjDW^I^t+ubqA1sOx~jTWak!XA1+pQQ5RSuDv9UXs%JnM zolSf_{1G*Hrqh(2aYiNOrqaeG4IwDzb<CgsVmm`lyFaB%8=&Bgrd9{6UcbAHP<(Ud z;RX?6$q%=D`i<NaIc<u0FNn?V`aUXgOY7!XBDQnwNnPaV!`+PY{m^JH%3JWyE)y1y zlkn3zN9(K#{VtBd=33JhrUGQAEO^jQW!g(8n~J}bzf?_!TY;gX>J#6_xmRajG%YLl zr|Yl_$@*~_CHi>F!GuXTINt!8Q9cO&jfFf)M~}#%DIG7-pYqNCq8Ph5BTC_^MYR}4 zZ8J9Rr>{R^EpK-Zv%n1}`0yGAsZ{$q*OTw>!7Mj%^IF8&F9n%$DA6j*_BKN8=CoIM z%>(yfTfo6G2%8J;UO+TsCtd$rWVK0ShXkUuD0MYJxCSxz!IxH-57i+8go77SAN<{K zy$A?=Z5ApF!+M&rexXH@FSVTZA<n*g8};e=eo&Z1ptsHy3rQ$nw9ArC4Du#oRe<Zz z?%D^$Qni-8ZIgsj=)Fl-0OQEb8p5huM(P{-crArEDwk<Z`#A=|9m7TK8nfg>!-)mP zp0XY&m@c{oLn(@)4if}OGF_;(2kjQ$T96|f&dKW*+QOiXQ@W7)mTUP`XaDVhSZTzU zt{3zNZu{Hup61=?J_v*g+8N^CbV*hM+HN8kHJ#M!exFxe3jDU(>{s<dB@^pQEO9QW zz8O8k1x1%w0qSz8A;6~bfK;`?plBAGNBnEt@ga?JJ{2Nf!t130!x_ewYe_Afd$sII zr#oqse;r#24u|G`LJufdhjfcq-x}xsy9@RS1~vWMIR-0Cpc?jB&W1nY8qN8)S*wla zdhiG&YDEL`j-qmPMNdL4&zl!++3l{#=5S7l3Y|PB*)Cz$aAe$IFojngiSK%as)B>y z4w^zH344ba(cGk5Wh8!(_zaW}H5ep~K5+KPfD-WDz(T3>98Jq%^$jPGJ)3UV%32hz zc9NyRCRujjTz-R@(#QXtNqf+*!$<NQlo*W9Io1_4?w)t+|2hE}Hxb_N(v~zb7w?1S zuNdEH=lA88prK^$?oCYFbdHOx+!9ya8s!E%)7_EZUbExMWW}^s%kC|USU5R<0|wu{ zbVoMeuXHJ%us>m6a%kr`xS_i1v!d$dljn0L=D>0U`7BnsgIE{;ad4?nfx8uK2oYxY z)`qS0k93djklK0FDKQE`H|Eh;8dSjRBQqo9Vk=W19Oa=$pZYD{X6tkDq2S)GGOODA zzK)ANhb^=HRPRzvJKc$@ApJsYGKWoY=iS?1zx~xC=KQ!bodW9})!0<|^dmPLY-{aS zId-X%r;ty-ikePp_10}PIChY1SxFmbT>QYr3xVWvRb_=*q|E)mGgC8#qYm=kr_#3p z>)s*iF$1UT-KZEWtC4|1HbYpV>dhhP0xRC=GU33_*Zfz#?0em**1fjJAI%ywUe1$0 zuLr4X8=y3CcyGDuE~Xd+=fs(XUodO0cR9nQRH;{SF;m@7YrEsh)?=xhnWZgAM3~&g z`6ty!Fz7~^v!TjyBqN;bMj%Npb&-`)6PNC`EIX#3WHSxB5b?g+B{{i9FAFh1UU<so z_qo*Wxjrp{)WB>WyFbR%S#R~ul=1ia5xFE0rY-gT^DSlyyclk!Oquw)cdRyy?@(P- zWuP#<CMp$dm>#D0*M2!Cx7E;`0hTJh72StD7WHC!6_u&wgS3CqDrGhIqC;cC5y`*i zy?+W)n*YDc5$PZH3ImP~?6m<POGv$p2B^4rz3u)xqf`bt6$ERllW-E@4PQL7Qa{sz zlo50v&5wcNF4phiV}XJ+)ElABqB9T^kHA6}V`)eDOCdKnqA64wis&}rJ3&hFd5g_N zJT{6Ps__e!3FOP|W8~)EVwu6faG)Sqc6pr4dvTTTE;Tg(5SCb@BZvJ1)L49!MkFP? zA%7_-)x37ing215et`OW-kK|yF@+nlFNa-D-@(iNo>25wDS6Ise1~<oXgGIW;?IUr zbBtwsF3+AoSZ#GjgvHKW{S7Yie3Sth@9(WVdJ@NpU9)QYaWluNEd2C~`qR>;#A=`P zM{B&WKIHvMoth-J%xW{j`dsE>`c0A!G|~=D%YFz?pV&O2pBg)fqgiuT72lY#IMD)! zqvV_@ky00ZiT>gUy|~8y_!nC<oEn*fN}~C=T1t34l(Xzm>FX!9*H9-^4`=;e14dQR z3R=<!8}kjD4adz=M*E2AsI}mb4#GA2ZS>Q@o44KIN~iTyhovMXycnUI1W$n6qB&0d zTZPb1<<WGMhaX=~OdZoLT6Omz|4}%<^$Y(Tgbw#nF4l-PXE}-S>x!}Olr%UIS*15W zc))Z9GthsGC>V6FZp{t@+TH~1$H=RP5%O+;R90jL`@sa(voR^g-dfA`1Cj&$E^q=g zojI-<8V=BA1hJb=yYRd!#lU2C$JpkL@6XK&nfe82IS4AA(9$lDmL(0L`>d}}y$cwO zpbEYk1IG;J8pH&WE;k}F2QjS$w28uAQp`-me8w=FEzbgkYd4wzNmjjllD|i19wUQT zeAj#xgc3MYsyi7#rzeqqa@tMANSSOCSyi`{0NDV1S5Ia9s|rKJmg}`3Q`c0t+r0a$ zmZxaYtYNA=G^dAz32<3QYMC)yt#k=A)}r`;29~Ihp8x(tc;RlY>rZFR?*G6V0=KXt zAR&zE?PxSVn_U6>GSdyaiB}P%<VGzFBspq4{31cNG#w?IYu@^8-Ty=5aPiCe3~Y(% z563F9!>zg-H5uVEfB-Hb_L3F-o-<NASCo|?JVej`kqmw^IE+>AbFR+?KP|(Z@tbYU zS7x*}NFL9>R4rvh8lqYwy=DfSBfP(-HupZt;LHhroZyj0udlb@F%fT$8Ra2AuXpUY z8Rx0_tU@$IcKB%2gyNHWO6Y?K-^wex(7)v=FquCYth_2SR;YUJ9sAM#NTcq!*;x-X zXmF-3V#ZME61CypMDC3xCNqC3T-T+lUH^)#dJ=Gh-cyCg)s)af8vUh~XpoRY5hMPo z$ZA{b<n-SEJep?!sC1J!O%ECzX)Az1=KaSB1mBUsDskHJ6gcA?*JeXigpL~#V=eAa zD`-GONd{(_ltQ&Cnh~Q+#XR{l0JZeR8>ZyZcwld!(e+vcw1M@Gzd*6!FSRFgKCFs; zcJ&DPubhV6K9|He@M*sgEeikzcoflx5*~|SD)GCNI<p+dtOF+H_ivVaQp^MLn_0qr zbU>?JZ8|TR$Yx6S`zA)+EWjn_lkFg1ivwBsP|^lGTdcE%Zm^go3A}kQ<jV9J1^BNn zoay<+UwkAXho+TN9uHT$(H*bBo34cT$y|7=#i|2js`f(&#OtHut+=DeK1s2onLnZB z;Vec8+eV$Gw4X4&7a<tRb?7kfv~6*XRfTQ^{liNfS1SuB8I#1YDAkOT#y<UUQ_R7y zAkM$cPs4w&d|0`s$vr5XV|g$kcCpiD8?ilSgs&c=06qFqM@3xioK@B~f7;4SVnMn= z|05D7_UOmoU5h-*IkxrHI~wVhpQ0|oyN4aUiW)q5GKGc(p=lE-Rt^0ORr&zFuI6V3 zk#Eu<;Eci>@BDqk;0rBhxSZ4_ExRR0Lu$EnZ$NyhQ-JyWK3pZ~{XE}PzLM1Cd`V|Z z>{-~uhx3|cH(Ht4>Q5J&xf!7`R-1jZe8WkcWEqZY-QS~djh9u!1kj)y$m!u%bp=;} z^%D!JxcTe<32b=K!+-_~11tTx5M)Y5(@a4|=Bk$ZJ7QSSAEN)`(XXJ+{6+m|1X}vr zT~1Y!1_qk5PAqMe<L1h{=V7L-n~)axct6h|_N~O1$YqF4ZGmAsMjdEihxjzpnS6jN zm;~e)1^l8{pPI59=Dq4UALb{TP}T@&b6{_8U`{339*8FcWOXEHqF8q9xlnmnD_T77 zE<r$31c)2TR-h~OsFf!AV*#ccW{{p2eD|eDttt)qe0#WNI>Pw)bM~_WR|@8#Lmi|j zRp^6g>{eS0oA-%jy`32rY}obF0}I_OG%3}TpW}#WzZSxlv%iyztLt2#(9;6+Fx!p- z7wY9(r9zcaEp+|()c7T$-O8vUMCYy@qV=KQu-}FR-}sQ!RcEO%mz)kYyFJ{dCHe?r z81OM)2IE}qccFD<L#B(XZ@};`Di(?#Z>Nlg`nqP$m{z9+6{3-C9a+ARaqrVjqS}pi z;bU87JehAtzcHH_u#=R=IJ>01qMj#D9@GxJh6-${NYoV^s6Mj17mA!)ak>YtuA9-y z*^PW};a^Qx;!2KFjeiKtkAdU^LDW5%Iqm45?#wrtI@Bu&&1x3y?986dWex5iRLXT$ z`m+X!rsZnv<(<6AoV`l#x_Gg}v@Y{BQjyL23+D@$!8IFeb7WLQw~u<9Sr`)Zjvl_8 znf$pu=o)%M^DSg?MynD0mFjswrr>IJ#t_x(46EPz%h{K8Ip{xbmRS-ML5!|_V#XxN z>&Y*+A2Yeg_l(s{VObgRjZ^j(ZvjFzNGVc@Z#igvu>n!rw-^stGl`sLn-BxF-e&Hd zoqtSNAHw|i<Gu90Zy9TI`3%|;<njJ&lDU?+@YCzrtSJKweb5B@#QnbHh3#MWE!KZ2 zyegi`x<E5dQ5RdE6Ppq1H)_sav@*k4Ge#IyUI##$1|ct3EPf$ZoBY<X(Xrf28j8Jk z_~qLFc~^enfIV?i!)PmT{yz^$DLF~0Yy4rB(RkB<SZ4HDf5#{Fv8+4DzZ&Ov|2{K* z2*c5dX3c_Jn)Vqk*Q>DnlK)YvpTT)>TSLEet+^Cgl{V-J6cuk@@@}x%B?X}_lCw2H zhu9AWe}h9}Y7orL6Z$qBPA*Q8*n_~ThoriBTFY6Q%l^n@{a$&&zfGLTwGu>xQ=fPi z68N~BOe$;l64)=004U&#t=>$%Eu?NEQi{&3xD`z1hcD-!M*?!921hd&FvLXC7S{?9 z!|kmuYzUwH!8->>5>vd|uHX0`OrofbyuiV)qQvI?5f1elRP8Xb!g{e?G#`=;!4c0= zOs&M`hf8%wunB52BaF|g0BP+t^xN>)NF0B%PvLucblun>Qv;Ez#JS7%%dQ^05hh(* zU?7Ttlr&ADWv<b%z+J6egX=-d7nz9AFcQI65$dH+T?dDdgdp(`>3C+*$Me*uo{C{U z+C2ZZUtS9tZTNlOu&-}^aRxCFqSVUroQeeT`n}4f(`r;%a=p^L*-A7wAyOhjBB>S} z;@(N~TI<3`I|5$WO)q4=aFE>8iP><{hM*tDds(W7j|6WKP+GhyilzA;v}_GZqtigH z(J(96_)H%zSa#2T#P-aA?~p(e<^a>e>w(^kL2z-Y`n{BcqQ%O24qE&Evs)f^38jMX z>E0Tkk8y0e?I!bMlEg+VIbj@Y{wsWbrJ#f_yy*8Ng}43&^?sN_IzdIAKT`$DY63{o zeoV6+Vv#^8Yv!n4`63bQ8Egj;0V9o78yuwyuXTbKs{ALKbf*1(;Mi2&E08vzVXO1~ z8<3KEZxfuqCB<uVZFAXbma&s~t@0&?zY9Z$&zhqHXdMrerZ{1!8I-j5rc2BNg2JbB z6P;7)o1Y$?gQ`r4Tis_Dw9S+>xQB^SYU;Pbk$;D6zq{gq5v#Qtmu8=3^{rN_71v;< zelL7PGVOaY&THf89AV|dYi`49dDmtw?PJ+;SUvyIs9nQi(h-a{k8RdL;LgH9+ex-x zGWt|+iAeEDk3~#zyI78=rOtksa~t0yuJxKYcoeKaG)!%9VtTdDYK=F>*@ka0h|jDi zfv+=R;QN?iHbu2nNz2117L2VkEo$05IPFkfo5Mnx>a>@)qDj|CxM78CyxgvneNH^T zE$oowNO&>;8czKMme>#YJPsDkcbp66r7HvwP(9w3J1n=YjwPBm8zBen%vR(KI<JSY zqcvB6O`B~)Z;(nXeYQUihl|Mgj&%+;nWeDv*lUbBaWMI{`*L`1H=Yj#Ij2|>zdlY{ zwdbrMT*Gf}KX(OFPqiORn(pCRUFSnP?lTcQf5)BAI0JZve~$Ar!$yqk0VSdndyN1W zgSh0KuS{U%U3rH!W#q{Iw!5mhG^O&<s38+|%zq0#ef@RCUYikp!A;jh;9SIrlP+i3 zQ~Tu)@TUljYLId55B(vIfGX2$ijhmsUKgT~AfJO{e;W(8JxZnbwJn!TG3Uluwkbhe z<H9WW#%!mH+V97mH!NFm@>YS?A#A%{X8Vm<T`mWdw#YtNa3DmL9JRr2qfSI;Ea8|J z9*^mJ+uxJ_`@Xw|J>gQrkasw?Ph^&hBYHAE(qO^<Sy!>$^`L^KXR-my?>Rk}^>rlZ z#(F!RsLTy{jIaC@l}cA4G`b*8!SiX6X|4OmdRV}*AkV8T$>@*!JwxTuvnC%*=Yp>X zzK0vTZ{=Cd==dcJhL`lmriRf#^PXu+cnjoNZR*d%M{f=<yGJd*WBjbQb@AMd`u=O+ zWq~q7U<q?nW=i}pc<!=WKEPvQs`KTh{{nU+SODzUI1uAtvoo7H5g)q1{QAbEYgxw+ z{>iD6n#bJ6XVP7}<ey4J^%gLpT%WsWgR5PV6OmtqyOKPRhQkA(HhQX4@aU&TK+PxE zH{n4V=IZfiJ|KIRKAZs+7Gjv{YBv(LCW2vi3eSZdC=l$a7&yIIx?+lq#*`VYS8lZ_ zS+|#8K-WuQ0%Q3S4N7lS?`(+s7*;Q#G)J;0)nONETF-NO8Hs?aBZ6*{k06~X6V+cw zvT(e7^(25YB^=z`A46??L*~0w4U@^i$u8dzp$B^^+@=1E*;MPct591??+3z@@a)IE zgYpf}CFz+4+3NY61?vf?3y7!)It#a#hmiGKZBR5ey70^=G8b&8HK}_wJ<0+s7z?JS zfH{3Ml9R-P0!`urihjB`<R#_a=l6JQCMaD<W2Nv=l(43-8w@?MI;%^&qZ#4?W|_zV zJ$b=~VBZKmb!aVG4oT1$f2;<P8O(57_yMtY-P&4*M#JARsr5Y%7pMS9^4RL!*X6|T z?e;#sf1cY0Jtcx`zD#Y{bT*{`_(aog-jrPmO-7MWe(I0MYx;O~Q(^(;Fp@8eR{ivr zj>Z`zTHr$pM^TN91gm|5=ew!G+H}rRW5{gI!LAif?xXuHd~%-l+7g4IB%EmaLVlEF zbU16&ds(jC_jf#RODN5>Ri=r{*90*=ObRkh#!$|QCq+M1U&T(nLH#BCGIG#81#7_z z7-puvUkdo@L4>}=k+wN?3BCi@nS-5>gY5f4n3>#-z=BXl2rdk(K)sF6UF1zfs2;c2 z#NiU-fT915<O<?23liJPmpGPTo^e7Eftymq4M!wV|1+AQ`_1NWhcXl>w09T#vBzM4 zQ{BoC2}$0T9>|OJy22tLJG#&~YSo+0H_c>0wsPdFT_51>beRXQ$aFfr>*Ti|VIX%; zcN4V4Ay5N1lQ-5og;Z4YpAWFKa*F}AO5F>R*ml84z&E*&@<4VnXm{7PwCu~bUs{`O z^h8`T5ia3{Gco*K2LQ2M18PUSGSBc|fdJz5W!U5GMwU~C;bTlWSGd?yqyKK}O?F}5 z6T_d&zpzvaXq8+O&2daX_D(3d)ZwNV-szfTD9jk5BDnNV6vyRFT&&`=nb}FrX0<t_ z#?sHJPVh^nEl#PeKAx+!G*O&bLTq=;Tx3ol!tv$CVjBxmY=V>|kMIbwFHb@i29dkl zFCt3V5^{`+7%$;86h5F8Wlu~M!8ngi<XEz6ujA6pDvz7t%*mmdD>g$4EDr+6)M6^P zAQG;|QW~ZoQ^RZ43>(FDyo7Gg33M6%uf|E0>`#G_9Bj$H4_Rjfl}6e3H`WPu!g)q+ zaYaf6z7KMCAg!MnC?as!-8}Cv3=gcW54jq825S~jUYz#`hmrFp^D)t_!A@K3AF{&~ zUAh#Od`{+~m%#GtK`lZ;sQ;jIKV0r$`4@T<=#F|KjkX8XiK8etAO7HCEOn5A4Te$H zL)=neSq;JTIpLx+mK3vr2BquwAfcaiPTiWC2Tl%yN{;(lmM?xASLIuEC)f1cE>HCz z)-0MLnaq5_uiv~2f8ntQgU`TSV@wO#8VC<~O(gqmbMpDl%l`MBC(2-;-C#$Mr=F9d z_>oY$n!c*2P_yRiS2}G576Tdf#J}6y^Da@Ew0JFw;G)fHe}gq2`gdp6cHN$8!i!!X zUnur4Dv|n?vZiD5q6`0Zw1+{|zUO!6Xdnj;kMSckYm69-R@TPTFuB|1-ukEO4Mh7_ zFPbjmI&QuXI-)2rgv=s%sO&`=TGiEm4roIOiJobPe#A5Dxg#tAC`?JiQT<Q4muwDN zKEZ#ggkmyM9sEU!@d)i^bZ&UggvRO*%KHlup9H&nezF@5;h$?dYf4>z8Fok6CDs;5 z`l?e%tiGa(=yCEFjDmfDzkDCQ@(iSN$aXs%cJ?RGqL>ip=Lz(Ae}uYuX`UFqI1xqn z;FXC>f!FX}i|3D!hTR(;Vi~Ji1W&_H63OACBuF(tp*ZAButY#YQomMx3U=?nEcuWm zc=Db@k)lNQ&#Y*^6T*a|zs)*pd3s<By+^83;$7PeB<T=1VwYH^alp{0i%lH<3tF?< zi@(7HGp1m;nJO#=|MNCtRL^5%{(E9{iqEC*#U!L1b~aJIZ;^|rHX_!yC3QsQ^Lf=W z=Dt2|UBGg9wUzP(IsaLPy!XNx)@Xy;W3VWZWAn7Rux-KRq!or0$9sVvC6MG~WfeUV zT?lVLsWXyO^yws1?Rg|KZ+SQ%s$OWBsZR;fj2r`S8vO@^5>E%6PC_0xpd<<0UU+9K z@WX7bl3LFBX*D3ey0*CKa!%@U(O!EV$#o;angkv~;Gn6``)z?_LXf$mzciHEI;KkP z83%|Qm*roixcj@S+i#SD$Nb3kwJ;u~U<?)OoQgRHZD0pNYQ=Dl8Hw%vK_Y*>JB+=B zMYhU1vi&WF?%q#5<cL|!tp{)$nJD4=w%+zTNiVA~o>~ko7&5H*Fso{-h~MZUdRcTk zSd~IS_#wQ0{3FUpLun<&8&>W{ypm~@gB2dmKW$S_SJhPPYhfIVc|c#?dMi$7T?ho< zm$=l(H{;~@9~fH`ZsZ&64(xS##2W~GT9a9`OScjCG1uEGWSffCJv82wEELL02(ILx zho5#N(yaG8{ox^b1fwpDALb7tG@sc})Qh?+gkz{+ypD4q6;@p!i2{iYBo6K?@%@dj z5w=)ei&e_fT?uJ+qgX?3u-_fQUCa&fwx4TlvtTpDp2UTerj+v4M$#Vb4t(l4a^l~| z-n2rle+UbN;N@)z3i1V=_zzVejL{w=hc^I8gb}aW{@vRS)eG2z%S6ky#UN)wogu2; zc-8=WD<qoH?bmE_B05Jbjq+qX2=T`}si;%0mP)YA-v_28GMF9R%UtsO@%nJM%OwS{ zP^P!HeNNrDFDM33m8qt)q_FN}{@iw*2Uf+|MhdIqvYVM4(;`8AYw~?hFo{(oLv-~& zt*5~ImvSm_HQu;}3cyy7t(0RlI9{nfG-;IdW!+4(cqtCbw81F^oz#26qZVM@dyaMR z^TwP)m?ou@TqBT$qW(#AagBzVevK3c15_#T$>TZ50#JRq=*)1W3VM^~zvXKBsdtl* zb7>}_V8&;(M<>`3QHrR#)8?csPGF{)upL8EY-$7u8g`18t;)7KczyL;V{-LWc>f<; zXB`%Gx9)vKlnwy}B!`ghhM_?kq@_hlq<d&VQt56KknV1jZWQTmgrR%Lck%3f&e`v| z&fi`*aLvs6t@|6Fdy<tDCr=^8<H|j&TpW_*(b@9f*X4f&(g?_rn%hCVN9K#aT~Ynh zz*OFOh2gd(Qic|Tt==!*tEY8qf1YMeLsbYO0_d66@l{UI`@_kOW1&}r7~(VG&bwz{ z;~4Z_wO(8^Ax4<W8gx?i(<nr2+g6_!Xtfj;>opBu%W}$TmFd`&tyZbDv5QKv%&wL8 zxxtR5zw+Y;3V|-nPKye@lf*Tu`&Ee>@1ppWV(B2TT4Mc95><C_Uvqu}wgoS@^|0`5 zJ#TlF;!VKg9u*>s436K1K6uX=bBVhEj{weZZ$Os;`#i5G@K)?(Gh~IGCRJYa%OkB+ zNeU1ca3YfS#R5nCkA%;_bY%Kwq0sfy$n6qUY{&SK@ZvdD)ZKxy7B14ElyINx&eU%_ z6ufbaZ>B#!K76S2(C$+dr{-rsUU!7#NYJ)QEOb38REYDx_5&whB`UHsG@?KZ-TP{{ z?ol&jUL4)AF9a7#IhWrf162S)v@YGirNd`2&yWiCLHVw34VUL5=0jp)yF5nRI?5hM z)XahhyySsZNFGeZrR)*s(>0LnZdO={9)6bCiSdn7k-!JBp2)%w2ezCXLQyT{0~>ny z;Wgr=LMOi@S^A`H=6HXJU#`tiw&VxDIeE;%JN5`o+JOoy^w()jI5q<+=3&NeOj!^X ziMd?)p8m%ZVc5aa+ty#M#`uAjk0da2l%Z&i?Q@-1oKi1(2M28u#fH-!kp#GlcwN}n z)rU*=cVdrj0QWnf;gK<lYGf6z8-y(|&_zs`DYhrA1&sX1r?I@0(^R<6AZifY6UZbL zENML|pnNHr5GNJ2vtiP3;EH90mLWRQ&9a+C-q8jFkMs?7RBbX-K&jZrHJ@Lf9y>zN z)!70B_nbn^OYQj|BHK*xg=j}v68i?YpxZ6YjYKKyWM*~J&b}LQq9b$Qh@>)M_{mHx zpgoHgN#`-4un}KcV2sB_(_mHF&^;sm+=K<wGbj+V4?5;nrr~X@w0w)CpiQK*$8bro zhvM3>U<B(45Q}6#Z$N2pzxjru6Gp_*?qTR+Lx~Q!VKarWv-%ONnpO7>V|>&pFt61x z?6_y|()&F{swzcG$ulmkSBo5$T*0MHUJXc=FEv?PV5=sp84eWwC5dfrSU;lC@Aw9z zQ~m@d^+fX7f`e__jq8;)s5Vy^WVXYf!10_c!GK)dHCIC<Exx2I49>WnIgb7_@|+CQ zmD*@)^0iAZ)JQHkE8Oml{>Ti>0Y~(YPTkn5bJnKLRH{c3{m$^?h0_btr-sxzB<{IY z-4)~qb1OHRv<7o?aB!A=HSA96z-~WIkwms_K74gG_*pOxS*3ldy!Oy`rxpK$ulu>1 zu%*nYw2k-Q|B>6oFz@GPUS}pmBHQB=9AO8nQ)!Lkc_?4$nQaoivH*=fd3u7wvF859 zQ@1-{*PLd_aAKK!Kk9FAky>v+RF~}**c4vVd)8U&L+8_PXQInnwrkXsnp|!5cYz6m z_1o#8SGH2V2Ua*^48hKJ4XN45$j~JJw-~z)*9yC_<4u#z1hm<}V{S6+8uF99%rg@! zL5qN2HM9{CoU=)yDg?ZgQj65Q9e11m^E=<$DX+i&Gcw2gwnzyR)JVJ6;+%5QoE>L# zZhVi!zj3a_Mo)C(2gXXotL7>Y@V1fmdY=nZ0q}OecF%?s!Gg==<!He%&(X-@U9S?~ z!UyGQqs)DemUimb`ndF^Qp@PiT%%CPn|r*BPb24CdTw-VNa<OL>=<tDEkLuJ8<*!i zNdNeOgHd*WHl!@4-tsje%x6vtx~)36n=GqA>~n(T&7YT^BxUVfgXY&z6}IG>*UiP# z8e`2m7_$W<ZA3cOf{Aeco%&T}$At#6o$l`<-X<ixUxvB_$fh+ex16VCoWy?M2Rc0% z`FApagc#fuwJQ5x?M2x6;ER1!x{5N=q`a+Ppwi4#O8QKXsfvsALW*1#Up_3bILM8= z8M}}GC5t`d^`Rk#9G+bh?sLdgz&hBWfdjRWn0sxPI;DCW#x-0neISDNlw0u~<$dVx zc`rID0#^%yCNb7Iz#_$o{EjwYu3XHVoacjv*h!!>76YLlZjQJA&V7PC_{%IeuRLS+ zE{I5=1Sn(b<FT2lB+>&NM@WyYPnRQSieBv{|H@+=wI@jKYu^(MN8dTvuv7eah-df) z{hf6_KHg^qbUDB)M#Y45OUg@AR<jefcZwfTo{NpDg#z*JW4woLCpJ#2s*5Gr@-Ny& zv50TsQc}u^vI9KqBe)x+<o*KA4=P_Lz1geXit+#9IGQ8JJ4;I>@hVVu2mLq<9>6~Q z%4Fu9t&>W977clb4X!^WSJTZWeoRXi`T9Ca6%M*&r_T7^ofYIQGCZ|70x3N*LFaOE zNCAZ-qoGf>>D|qF;uqG&Uh{Pc0`ob*MoIle&3>L#`izw7$HOO#@~^VJ4<e|7DsRQ; zO<0yiRJ8R6vwPnNCaOg{9hwg7|EX}E4PL`^AXF(Fd{!zh7Y)Tvwu&>k4cyF`ctng> zwjo>CDkjp=VHGEa9ZWNPgEFnrm97qa2VA7&5m|zSndiJvD<Y;n6T&KI+2lR%v=Dm5 zLDrjq|6&2?1q#@m=&AwoD3bQfsJm?1Rj+r%R|RcHGU{`mWr2^ISM<iMtD4W2?UTyS zKb%011=b#aBi~lHTx@M21vVouq7z@`jY@UOW)SQ{@b$28w{WizuG;H*b!|Z>JR!HR z$_A7I>iBvaniQ118p6&h`e~0Pa{i}#I40R6mKhd<q4X=F`<BgCl`kocv)K2mf%PNb z@XGP8f9t@(ZLc^o<JMA8iBMbiM7cBEIDFMG6~Nh{*9RRlSf1g{o|JvqtxNNdsDyJo zX$sl?|1Y`NM=>Oz+UVX+P3;DC#*-=%#YYa0%S;E_v|HM!p9Y|M+~Q&xkc7vUIj|Ic z(^KA!30y09pYC-iBOIVxHuFB;Lt;|-^e?Vbk6Oi@X5M<t^bFpIC9Re2`OnpoYfTO{ zDyHxanXcce6l>abhTBeXZn@N#8mc6tolmjmFWX&n`m`PX6oU8yHde)#O26JO?^|cy zr~JC1ruatcfHmIDvOl3ZI^~g7{t$9$SWbK^`rotuzbpnMX)z-MjOx*l{);!S`PKA8 z+N~8E?);ieQ)6b42`@X&P0WsR`i>$Is!ifI9;3yGR!-C2*$jG8N)7v`wCHyY%PK-o z7QJrLF=3XkTc7aKWgYmT)J8dti0YXSC7JPtpA5Q{7%o4hS4Jh!&a#K|_Vl5ZM8;CQ zisT^KGGtVaLbTG{A0PM+R>#TxNT2?5m&(I29ZIQL3p=xz4gd1Vi1<D4KFhE+EY(JS zCiaq$IVqEEgbDqLpFdGBncKa=O^juvAWjAHCyzsO%Le|5%n-2rE9)Tr<tlgX1<CrM ze!e5vB0d1relTCrrP)i!I}##;fJ+dv8HhHl6|p-!twdgnE*FdGA}L^ctVGcL#~}O# z&)iF@RosP*;q+9tNFSzX<}|bh0xB}3-}1sqY8xPfSt(_5M7aRH+NqK{Mk9CZy93-C zW}T-{V7yw(3CX|v0cW(4jy}pS2i?vDFZAhXtB)TQC@Aw87)Wrwz@oq4`MCM-<m9Ze zPxBG05~=vfD`p6~d=Lu>|FF5&w4b2B+R$kp7&>4}0@h&GEHGqm+q+DMg(n0Dtl%|g zg|t8RGX^O7H6RZ?M{PxwVr*8CK{GAoFzH6tQI%Sz<QfQ3X#FXa6Jem?5*0*=%q1gw zbE1wI@x3(}q7;;jkx80Vg@+7r-|bfaQ9etNYjUwy;iSNYB32%1b<y&OD+--WnLHku ztj2GRq!cxd+yq!JlQyG<8wIJbKecc6m4U^Qx~7}l5%T2^&_c~yglEHk`9A*r9L{jQ z1>7VSah}gVq^ssKaeojcg3lK0QJ3U<Du<qV+H2!|k8j~eZ-K%({;@m+WkbqJS!0%U zL)Da-Ht0Lm=F6k{0-Hwi$oS^HcNozz?y<7vU2v{*XK)a)uZo4ytHub8D9F|d?(L=Z zpWUv^M_FZ;6*B;pz*&PZW_uK31|FxZgYMac(Vyw{aqCAD?yp2c^PiM|eP?Qji1uvr z0+&`!`=uYfxe#lKIVrr;IzT1$vv9*kLY&RoeQE^phNlX}n^733Cw*%xU)XB*83)a< zTOXwQx2L=QNsgUrFo_!ymL)6bw4r`l`ma-`|G4h#kGE~>>4e?}`|ooe1#Ho4`=5I3 zcr~^tK`&Pp{upPK19xF~`GzL?V6XE<Usb0!uSq7h?Nr0D(Dd<xS+I9@`V&P+@OR1J zDRI(emkDoddluE;hn5D-pAHPeq)w%Gz5b6|kz~Mlo7CFdove@_y2B+htK5pMxjf2( z+bZx;#~1I49NP0MOAS|T^KGhB4dH)qg#x%;fwbx_8|TeTx9?j689RDW$T}h@l54hF z^Nk?>JJW|Etl$p&R=qM;T^nwdKQ9V1*o&!$GHbtJb?PV;wai3EzRk{Z|4`%}kP^(| zFdq0PCD^d-VUN}>j}aULZlE`mO<t!@MN&f-pn9MP@`eK`zq}5Ky&Z|&NmS}{vT$=h z68^7qs9ommAKx}6R;gum6=6ADG8Y)TspJAFW2P6BQx?C#sIBxy)qQ6wvsffrW|_>b z_??e_8Qnl)8Mk4dd6Lpgl9g=-{OhE85QLWxPvHp&$GU#o^7ghpfJA++@|yB>&9?H! z$^HkmT74az)^~w}sazw~P3=5fbc&NvdUlcN_KL4YdM;Ba*7F|ot}E)yXf5}QpTd17 zO``+k32qm)7l~9*hH^S5XxB2D$fH23r>7<pe6X^RVOsIJLOs0nL+M;bV3&lcvT^ur zm|BIJG=p*X+x0@tqsdHPxvkOJ8T{7+aV*qMn}hL)W5UjwOe=}m?2Jd)bBnm7k?{<% zdHp{gep)Rwtoh)QLl~e~##X8p3#^bM*H#dxnZAyypGY%=8YQqAJm;+<DZymk=(%t~ z@LF+L02AI~pxChG<wf*-Nr2BpsrsxnO##jKA@jtVqRAQcc0%Sie^Z{pp!4uQL0mu8 zdu$O$>uPz*WCfM#&yqPUKNkb$pDlKg-9#`MqgGTwY+jdp%}{OHS#*?V+S$cJyVL%7 zb3<0{^KQ;GJDJb5$-B)PB1<Sc=o=p9!%3FiwiUY_WNt1MbT5pY#<8MzZNnVe{+tw~ z{M=mkD?^3La5B_LN?%EjP*`aXh<4+*PndVeO{c@<`*!<#K~`$5j<#UaqL0(e?5dE* zboS`kdfoRgX7elVM|IOX`IYfHi3;&7cKcsMwaPSHM$0u2=&mNAXG{eS^i^WBT<5M^ z{X%j&PTsvU(#K{uoRTRD+`n&k6+XgWe1b1l?5Eciz1uF(l)2>|i5;)X>oaQGbXQc7 zCRi}P;;eM(Q#%{z64mMw9kGth&0PPmLp7_FPeWVF!a_1p62F+p5^a?DDsr*bd@fq_ zcGn2Jl>Br`jakRGW~J+`H3A;FHqx|Pq!DYwq?r(7uFsbw=wnbRHc_U_sz+OYXKga< z8#n7CqaM7qA7nJyU-o2jQM+4omeh$viD#t!Ogb66+mov?lIn24J|mvdB;(7*bluNE z_ZFOL!;Dngf$oe{l8INMe2?`1G)Gq3@@d?w3{Ckok^4<{P6F5ES{vT)OPeosubbW+ z#T+(Ri+#%1ZPj<zsr5>p?`$=eT&RL92qwHU)F{$2aHVhi6vsJ|y*L<jx6YK1x_LE9 ze=L@$B+xrdo8A$XANJk*=5o>B17G@mnc8>x%50s<XxfeGo~9_<O3Xwi3-+&rf>pd# z%b6oYxPEm^E$QBLMlT$^rz0NKJK4yZRVjmPj%Do-;gu-iWJ%jlRVY@js#=5Nvx2wH zGKmZ(3y&2u0eFI{XmHbCqut!sM?}|Z&+-&qz3=23$e9NP927xt2P;y)6y#A}h9*9~ z%x~{rmy&u?0~yT8v=vy9<|u1;xq%Tt*rj^qXIPdzk|((798tnMa=1NiHFcQEWsyK; zVqd6}oq({`9}fGulanf6)gZE~*JzwXpEi86G?Bh_lV`@oG6}GNmhOL-(IzE&F=&UH zh(&Ko4O?_m8KT%z9eQ02E%aE`q0f@6Xa5|D+{Y|=S-~x0NO1i-jLLpFkPsksl+;|Y z?JW9u^Ye-+l^#LqB@8u<O@wJame((sb-1Ur0_%H4mI35vZDInOM<nnxVoI#^en~Aq z!h!z6dpggXwG#CKg7p$#HWJtNUasr7*JfR(%@V)Lk{x?9XL6Kx;1|j#!HO<TApw{n zrofM(b*Euk-4LI0LQBJC)lOP8$3t6SfjCp+T7fRo>5nnmLkR*$Vf0lr^_ED^wgvai z^soB-NIHrfLB9s4^6PEvcTf26<=m{Rm0LTMrSFHB!{Tj^pMirLG3C{wFGlGug9vz4 z`N@zV=YoqrB@KOdDtfHjl16YXqUh~@@OB_@9GNn?C>15i)qX0lWendZpu8_nRBNgM z>vY&VM0l_Z07H^TM(JipOw)zjutgG=9o~dmMI}L~sBP~kPXlmRQD1OA-7}Ka2vJ~n zk&`#3s^YmlZ_}Ukw=SHFptF_L?~`gd-2k&oix0S@#qyZQeG0phKNgDgfaX0|SWZs# z!Zt7EtSzm!{L@XY|1qLf;?=)r7<u+pz()0BN(qi|51bs7YHu8ZJVRZRpU@7O*?#B( ze6R$}gnXz6`%iqA%2xY}NAM3+%O6n=Bo6Ao$hdc=t2fLU&B$!8Ev(*tyijTzjRpe@ zYXN(*%yN4gp9c#FmOKtD8s=%GUJ+&_>@y3Sy9(Sq?V<1`oqo0;jl;k6vA3b{F-&x= z;S1&qZrS^!2TAbXJ|V`K;mb8VMt8m+damNj$`l~mJheq+=82;w!}yywX6VuR491mC zr(1Y2+=~xcj;OL6eSiEur=ygst4?{gWI*N++P<g1l)T%zs=NBjx7cp5=-?;8*3v7@ ze-z<f*D&|I2@7AUtUALOxU@(i+lNib|9GUnyZ7;!1QO>J<a0ICgHj0NC!l;|^?DS7 zHww9VRmMWjx<SwYT(T^|QR{%oqryq<+K?igyqe}Bx7E0=Ck}9jfd+@k;pdliX<$YH zA;;}cxSuq#cxS|wf(IJH3&Ml;0vp%4jRqPmcj!?VCZ1W3VYhViXr#{+82(X37?aFs zq<7bN@rN6_fUAY7?rFfKOj{g#G2|3i+mjDVb;=VcCTsITyvujT|07Y~%f0m6$S^V% z^xu)>j~BHZK)Jxyv$!YQJXR#tNcuUOJ~Jq#z3%^lg%4H??$Xkw&uO{ZycVTz>K!{B ziya|q|1m0-7d?MIHI#<!Q@isTQY#>S3L7Wm-4T}5AUF0&itP5u^iJtbwy3E?HfFJq ztb*SWN*a>>x-+Zl6Rr&fmvGpm0epaG((oxvErZW3<7De52Vu-~CpRclEy#SJEJh&{ zaSbiq(#Ml0@Ugo<ISXEu#1;nc{EmYAsi<A2W@;GyAWYv&4n;xP1%t()a?l#-FPoG3 zh{HJV?VCs$%;=hGXYcAfuu@!IU^}1Ml!=Q%qxE`)$$fX6?>O3wNA%C@Sq06#3fq<; z9B;0b!O8}alCS*{@$1dUBNfQ5<I}$e6GPh+6a3h)&^ItVcIoN|Qv{ewWs^B)6(;v8 zu2vIL_oHfp?05RfJ$G1lN1)?)O9sLYA&V^@CqpvkIJ0Ic!zY*dqUulzI3k}m#_8ja zXduux^?LuxmZ7NHT7pei{U+C{yRADNE!tc)@95M|9j+w})FX2bm@alo(kRyWIkA3Q zH}@7X=ft*7LSa33IN)puzzYu@yLIwV&IM1EGI<Sxnh~Ike|+j%^_oBxW)db8ObQ)6 zeb|_^{{XoN^JcR6_)`$6zOK*Sq8{V!f<|F2Kl7fC5$BmzGU7JMi$=82uU@C_G+E7f za*E$--1n|Q+`Q#3ml?4oRK(cetuwuO={Yn>b=P|yIiC>|fUeUpjfIn9*IXMz;W1C^ zdz<3BJ6@aB?*E}o@ihJWPX<C%Q)z7<qXxxXY~r^eV-<*<4NI>!)_KebTGMN%c_oCr z+U8X3_c(}J(e-JMM>2PPChdBb!YhJ>Z?=+__LtIX?bcx_hy{{L*x;mYIF?)f<m(R< zPK9x$8nntPNNR^8Y@)`Jd{tdG72&R7SHm*3v5rBcrAXhLx(_DJw%S(nJla28QM?@2 zt&US$KU(yy<~c2S_>-q$o!hYSoms)`MsfYwJNF<{E|brSS7p<R7QMBlIYJ|IoYG{A zr2E<ILDPd=goLPnORcNs&noTmu1Y>A?l-YC%n#9JY<Ux~s_6D%g0VbMxq7cWK}NR9 z{3;o1et=eyHJtTnSs=gTAV-fvOQZY#?VD@M46Mwsiz(~ga1q&Rzy{wy_*83fBafGh z`FQP~YE$*WrW1rNmJ%v`zdUMJl8ekRINs8it|=TJ5>ghD<PE<ouKX}APkgo~v_Tnt zjlx~u*&BrAT6IwwEx(@UAle`Dl;Uw}<ZlZhY*0U$CO!BgR-{Zcy0~csd&!#Vu;`Y# zapokWA0#IhKzg<}yYV2e6Xl74?|gXss|vqIMsbc$GO6{*%(nfZr1-MUcFl;w66!>s z58k8!&U=9RH)_pH%8=c5$16+s*>qH;B%6M-M#!igmdLwy#8g(_?F!%Wi9{i1E^XcR zXnG24zqYDlj7O-{Wvzm5Ks6Z`1Z2+AEHLX6`MLY!t;<GAsORfFy|)%{blrH*Da@)E z62s`5LB@JL2VbQk=Q>gp@eB7WAf!8?I}rz4Z}6lK<?8do7}=+*^UVH{sI9&3DGI0k z3Wri3!_OMUS#@wAi{kA}*30RH5}c_wPeYRAF&$=Yf#aJaW89p+l1|tc2UO6=4ll}Z zko*kx?|IYvNEP%U+M`k_CBQ)3A43Sqei;k8IJ%XDQq^FY5lSxjJK6*^9DJgb>5wcB zfmd6Z8}%N-X-c&$VyboqTE-F7c#Sj*o_nF-mUuImgB2113)PgH2%4!kt~JSa5tESn z=h+W}^B;U<NOFgC+b5dckNutb+gpAY>u?pZT4%94aqs*Vnxio2;U_{HWgYz{IVeei zLMx7~_^PujL*P*Xp(8(eyk=aplsl@MF3v*PPbIWYPzR|FFzxpXB`^K~Kmbort?+^q zsAfb{dzVD9S>Jj~s71$B&*;y-Gw?nTKW=G?W^YiKweJ8$a(U3tb~*wVw0a|O1Dfz; z&om*%(T;m7O)e!fnOzvc6Ra*HY&7T5eyEYebnmDncC;kL$~R)wiO-yx4_%|+OyYAI zM$LQj7DfQ|Q})ed>?tkdNXZuqmQEP}ae=4xpWgakdv!h2o|4R~G1xY}G4`Uwl6+y* zCbEB^QA4d59GA?hnskY7weXrR2F!D>>tCh@S7hYe`LdeCZTtK-)VKfnc*8UQ(~jRK zK#r&?Ty2+<GM-eh5rpGg;ad^-6Ix+s)6>rtaHR``8Z?^3{Uy(d(1=kc@z^ccM&GnJ zX3oN9kEB9p(t)P)0Cv&`^ZjVV?iAqIxNiCnDISZqo|`IZ$)WIBs}Jov!{xZU6ZIWK z9Z<_NZ}u`RNT+D<7H&@GyMR3QZS6kuc5f*xJ?)hgYeOO9`9P4$&Bo;mWAWD?pujP} z%7&u!Kt<N3i&)mPcIGcbtWq39^Z=b>tZ`g<An1=ZWk|o%F1K>X`>RfdFYk#Ix~!{h zu_}JoCqPOZ_`)oYw>6u}mFksiFwSM*Ro`B8F~ri8PX>)Cy5w}6N>4Ys+P3Oxo&MEt zA(`}`{9V|xJ@@(;tp@7wEW8OZQ@TCJy{_+FSigb)^0Rtds)`33)w2$|c<FhsJnk=) zqupixN96lH%JL2J!|DS_>70X<jvxIX4i660+0EW>ACn9~d~m%btlyea8D|~PNY>BU zoClSLhDVa{iD&p6P4f#Q|4>)q5!Fahk_t6#zX&~A!@oH)3vQv<<YNC^8hOT!+&<0A z^i;K8t0ZM~E69pj^|@q7xHpy@Y`)RRrs2T1#ltN&=KIAIbvJz4&e3F3uj8doo<Y_D zNTgZu^3NIbc`ds4csodif;Ss=WYW+r(7I)am(z2Cw93yt?dEr`Tx^T!rojhdyPv)< zkWSPcGUB$1@fdp|5UOWWPB>1E`{%AEn%++DT(Y}4B$fsqJxPt-Qn%|=*<6{e6<Rj3 zQ%uV@RCvKXHy&dFeu$y;!XhYO*F$~y>@wfkjf;-0Z3U0Z^*i$D37{hH2DwAa#><Sf zKTMX8@fp!)*P8<LP{%1t-2(lrtzLgbhenk+_KI+Z<so}>@YaANj%!s$m}MR%O)7lg zi3;ttMA+@h7uC@$X{Q2fD3|1ObEi%V>b9sBtm)<tHR)^cJ8zR_skV1)Y_pC8tt<Tz z-JiNMI4zF|lI@yB+4LIqYgr8X2UDL^1`E9Z=zcTE#nun2>aNdPP26g>b)Wj?7zA;r zHVNN!Ms3$D+@Zgs03Y58lKo9rN!i})gKi?X%lh*LrJPkW!l&`GjdRarT<iLO`O2^9 ziCCs-<Ts@<Um;Kw7+LfNV4q6cnrbpcc0>`f+25IV={?ijYG^Se(+oroWfTtP02;Yq zu0ENzZ<q{GI(YXXpv0tXpsCk2caZH<M%;K+ZlK50OlBhs?dh8xrsB<o%uC@HnaSpi zlV|<=`YJCnyc-VJT5D*L%hI3=BB_kr@0raC$K%?Dx^v_{WybJ0nM<9?qD80&H=Bl3 zSoAJ#WW2EmiHUk!$74F}*fhpvx|(R(wKfG+k|GESXn`}3VP@zJgt-|-e_w5lw8ByO z5zf{uE}v9`xx#s)W7mu-DbH#J#Y`-l73(IhJhJ<;8fqm^VA$qWaCoLaJSL<&k?O!~ z(cQ9Q>p9J9{-W~Wog{(VcjGIC9RFlOD|01|jBLXG{i1|qNuJtx#~L>t8=mTVMbE0X z;-t$ey}|Bd)Dhb7^Ch!N#~HRt9|RtQk`b0_L)g}S0HJ4J<6|fP%H-jyuWz5q@J?RI z8V|Z=FtFl|g6vP8CxxZ&{OkM6!cJBUbfJ1nBxuRKn#W_eM%#3+x!IG`U5<n9Tswwq zCey6BG=XCzGd{?Rz0V`3tLlK<le>~;lugFlwwbuAj3rL!JneY*ic(6inRr#MK20a{ zfE|+<_TvX(iG^Mr&U8X{gaKBvR$pus&I{hTd9Cy?di|n};f*SJPfvT)n>1eULIlKu z>3FZcNB}dp&|4)KRpHJ+_1#(=L#$G&%UYt*%l;3m3?wQ|F7UCcTnaD#x#q|ei=nod zU4HHl)rlG$<bKh+n4uObpM+8)eJ+eo+IV`9pme_YFM?y01;@`UhSR3I6^`(9Y`SsT z6l*^0zU%p@)Nn_}I~K)~mANYafRuN~M&bFU0odA&aHY0-Ecu{J)5=2q)~2e@<Fk9> zKx?K4qyaDR&la7{v(x4Y1Sg2fAws6XSO~Md{T-!sKGhOEzt&B}ZfoL8N{!`e^Iq7P zYb42zaoR95VT5}OKCtHVHQai?&3b?q_=Knusl0SEE}$J3G%$j{D(YnVIe2DM5IcF! zcjl#W?s{dH`s`q}Fv~x)+*jDY>vqs?>Ow*oez%@EBLY0=V>~>RG(}>sM?|g$J;ZYc z!PrO>l|K5c&YCleon#LZSKsdWx>D()bXSfpod8w<HU)f}@7)J35@NUWG{I{vTIR_b z{0Y_zn$zw4)BAq<!N<Jzi_^cqCGX?7nvWrdypZHk(cTC~7kD>lR(J#Ykfu#*whaX1 zIgQ8~9lJ9Xpi~l;KKiM*t;9FKww4<aboIcJWu61Jk!+CzX#e8WeX`BAq7aXlROyf7 z1)lbPmB&_^2vYBS<wQ(Uf`KQ`m}M{i7Mu&77@d;w8aWQl4<u?O&{OHtup#$V)S6DS z?$btiY1NIRoD9r-{Z{!U3@11ZO~(*TcFM_)@gccN2TVBd!LWC5p24I7dye{^Q{tMu z@4-p%`J3k6Li*5HL`I)?Frm_^eA?$6jn_5}$Ta6O)wlNflL=pBmYur|(E7Z50z0=$ z$zU%wh(Few1e{wpqXwU9MR)rau&cbn`~$tjU<hZAuFuFn{5Y%|9&EZncHdd+9bjuq z%da2jvP*7LHGR9Qppl_xNrj{*K5tarb>j>)TOBnnpuIh9Y`+|+A|p*wFU^tc9}J+^ ze{=lmD(#<3My^onOqm9_mfhbmT)~&J357VPN@N$LD%&BCWZQgh2Hi46Wr1*zejmRW zCCipNr*z4Qah~~g+DM-veZuz?phRT~Eo!e69Yfo_GJbC|2TRtYNaeI|0}K>K1_THN z-US<Oji)p(RzWUVJ%WD)b=C#-q)4ko9!BhiUBA5eNe!yX4^b59_{T51cLN_Hp#l5v zZxD0<g$GpWJ+>+LwnKvl0**V(<~+(>?)3F`s#$A5+n@u2Ks}{Qp?FsJ<Zk9boY@+_ z5t~Ob5z>UG9GfV=Igwb%$|o9PWq~9e6JnS~5;TNAp64N`-+sLn7<f9CC%97jUSJ3( zc<NoY2asB$wH%H$$^^H6H=;uJs8n5bgI=%diWED63Z@OfaO68q6)xZhVi9rt-paA0 z@c5rb=RK^902}FYTbI9Pb6gkH62L`5e=&;IuAbve5;}Qp-A2eP$GU%+Z30|htxR8D zd7rCYK7lb<=llZ9u;!f)_rBwR!Oz4iKsJeM+HVj(SZT8VDM8G$O>)&?alCPrM6q<v zE>$o!1;+a?8z`9+CZ|bvHmQ7WoSC}s5K#m&;g>T}sGG!gTI+)wHy%L;jh>{3T%YL& z36Il<c+{Wx>Ce`UsQcx;1QV~ehSak0o%hJ~50?yXyWff;m-Yde-thFVbfF>be9o=+ z<$e`PGf@y)3lbx~s_=l@)FvpfwaC8MAD7KlPJSsI&Znmx_Zrc&?<-qZDm)bQxmigX zy!HqR=~O#jDa4SlnslM?yFmO60b&~0EfWS6h0NKo&B9kN_nYBbRSu<}#a@xWg`x!e z#x2}ED0N7f_KM%MQE&j$h}Sh*k8El!9gzf_vte@&Wwp7>K^RwlGAUfW?ImS)(`1@5 zboO7@iL<@a9K{Uo=_vQYzH~RYig{4Wv@mPGKy#JE3dUaAC5#b@u@UG8?xjfktH$q7 zM#`&&3Q9;lccK%P?s_HXS1VnvIg=-0(0iMCCxv~dtz*4qxdQ*Tpx(Acu>1JOctXfs z<e{U_sirxWV@`gLL2CB^!ZI(DS>GZLo~^Q@r6)mqbW^j81J}H$qs92N<I#O=75{RG z#Q`5FkEtpB_iwyVZRK=&^<eC%wjsG8MxilF$|mBN-9__16ZJlkM4VgbtL_(=(-oE& z$yWssoIAUKlvhDK*dJ(Xu<ckBdVHw=1h+l6jFnHe@{Ia=SlQ&*Kf-Ay>x<Z291_tZ zUa|kA&Q@(0H#wNWiXRScVX9dNnL*`M9^EvaWUQ}n-y(8tZYpVOVFao~?R%wknHI-+ zSl&7bcX+-qBw`*M0o@O^&|zG=#DPc^QR`N!iTw~84!<SDW~0l|=H*2PYaIRcxsh)_ z+s2ED;Z!mvvGibaliP@REGw<PDLV47<Cg~Rk-3!<xbBv0%t91C{u-ixWp(P_XDGr% zZV?Y`Jq<j*EU6NyU7p-wN2GF%nQf+Q_1FzON71wp9P#&;CY{#brw-(pb<eF|lP6F< z7a6^6{1!tDRh^Qibx#}mOvYN@X&YmfO-=qW@5MVhaxvZ{3u#UP#M&R^75EA9pTX`P zH-D_DxSx+UE%P#r`A*J!x7?lnDlG&hfoh*Dw%`G7liWtv?Z}3ww!aw4L(b-h&{@Z2 zt9(=J&s+9CyY8<6UazjIzMBu}CeULTYw`Kp+Dz2f+Ne|-#zC|s%Uz{Iqpd@{x}roA zSqF|yUFRz3l12o=&6cwsbHWaOe0{^Z`ZZqcm&pDc_VZ&A@6}1O8VAYV(JzXkS-ebS zj<O1t6^jqg-liv_w5&bHSdo7a5CC<WP?SVQP}&Z&N1!eg8uV3X>hgj-LgNkdwtLAj zElJh^iCr^e)#e}`)K1^t$66VO>@v57?vV7)VGPrbpZbXKU3EMCw4u>!@t~(It%_g~ zSMS;FK&?J_lPdv;V0Y&k4#lleGSo~hNIP>1I_Yr#&(-?1u<dxTl_25x+kF}g`fu_E z`D#VM2@)P*rzkSg{7)1L(sKdGZx^wnE6`B%-!TPKhdCh3y=D(b&Df_5ry_mQ`{d@p zBGR76nDb@ETgb6F6E2=8*n0W#Zwpv3@Am@%I-NRfd9YW~z*ArbO*F$_it~*eS?r5_ z_vk>sTTs>vRX`z@ql%I`{1GCiF9ZS$v2Qj<(9gl9POXVgral8>DW)`rb(y%h9Sbt* zljK#h6G3`1r9e3l|F?1gQMujsz58QMJFZW}H%v;d^Uc48%{uGgzCbx`v5JF(EqG~{ z0~SWKH+O$wyAh9zl1bw+J6vhr$NnAo7>^yrUnz~BBjTfBmK567L`f>>a%+j)UYNMw zoK6n;RW|AEw~sl1kSa<>&wVKnKJE!t(jWbj#F>_?_Bh+I42^>My7Wx}N5R=#;{9lA z9u-4@L8*-&#sy_@1)!n%YmpKAqXmrI=L`@5uM-rV=MW-Dc$#na8t67?U$7l|{6GqZ zijl52C70(d+avOw83$vZc5p{}K)%x+&&=nmQa7B<SlJL#B3HFi391}c&$f78+v!X! zE#A$!H%(keOf@)J@CjMOWC`UtHngn>n&CCGO>hOPIK3rbn1cvPs!6|bBlo>_Aep=a z2?TQqg4~7nB)%D=u5bk5De0)!j?+)gP2I66E2By*F5+yB^Dk!*!YuaSXJ@-4vt?1h zGVpNUbpPp;{ndWc<K8m(F7zr?HfJnae$)~eMeRP%e=kZ&ErXE00TBt!_}u0L!WLhU zUI}&syDxesI2_kxkG(yv-FA7Y!|z6ahJR4|x2mwGzizMss_=4Co(q{H{HvI$`=RY< z#z(~ettp`1lRXhgF|l1!++7qTO^82#x<P}`_Wj_BY<nq-%X?k;SmiSJX?{t!oK@Ou zxH{QA;wRl!-zLl1d{gIFZg&MWh<EEt9zC^TDvn(5KH?$Au2BJ{o$d<Sh<pR)XNPSs zUYY8|Yi$R8C<+I~ZnW%e&GZDINZ^3N9m9lD5!ttGO&OhV{O!!`*zcBfjH1PKyW8~m z%0QV)rQhAIVI8;huwrdT{kHMcHy5lCH0vV*%gx0(@W0Zd8#BWGqh<MzkKl#Odvo5j zB1T}_YQ)uWkVPaO$^l;}NgPZP;aWck3~e{@Az~U4o?T3sEs`^VcWE+hoxN8{w(L#n zMG&T$2s`5$-OYM5)C{B_^-z$=>Nad|515X;@|?Q3MqsS}yrMwx^}v2|m<l)lqKXP= za@mCd3?a@@DEC~+HwYsuMsFZcFTSv0M!C|}a-<fTkW3vyG3AK-oj4ifv+ToPjIW;w z*(RI@J%DZQo<Bj}pwF@=TP--t)qB_3g|hF<9kDZTI##SBY0KpTDa|t*mCq*?SaGV- zd52mkwoSa^U?C}H9wxYmOC9he`7y2>AaxF$lKFIgbM&}U-{le02j40fl0nwMYkknk zH~O`#Z&~4c%pchpIzx}@%{!UMk|BSw>v){*`bZH?a%2BWO2w1dElHs99Ri(Xf1a-P z_j03^UG<jr!1wmxaJ_A`n_LpRFVsfx3p36#9O!#rf%E37;<^L9a5uwK{%<$+7ctnC zc2zA{(VU{H_28*}HCAe1C2)3;ZMHDyKA~Q-jUNbx{*!q^PI&e=2XkCA$lxtd+7Yc+ zyW$xh*MS#;XQ5Y*@r>TQNcSy?E6~(?PNa4~Dv4b>YARYVxuFObck3r%L*9Vptp~t0 z{~U)r$5Lr~!^l0Qo{Pgp?(F-5Y|0$3?|Vxnk6W}bTL@Vk$KJH<N=)8XhpUigYzu3s zyC$0Fk8u%3)e9WSnA^jG;MLyR5351oppAcZB|BfcIpwI1rAjQ}8aHO=R(rbCe3G}1 zX?PdP89K(G3PW^OaGsX<Iq>S)sH>f|+>%c>YFH-oI)6Rn6y{|WRm}p?gv#@Ax0xLZ zk2zu)<<iE*Z)#V6W7o<SCsPHEKVF;3nikNcx+fG4xA!lCCvX?j|M>)VX||pBaJ+UX z8S0+dMKYP#7I3l{pjpLo%R*cok2Ie<hq+Eq<NB!xb>K;6dY5KSzsbB45rq#refKzh zVcv1cchr@b`Pk*pbMjz1#gKF77eq86rh2UU27*${+uc=%Iu>0bBv?cT5~S0KmxUVB zs>7oD5_&uVMj>sC@?oT08=eT~HM+uDNT*4Nn{SfE_NvOs=Yaup(mC`>+NDO9_xf_V zIhkICDl`rfXdk0~7{NG1m-XQ2!P944;DIW5Ge>l+yQ#n{wVZb)Y%DTcTxIAfXh7kq z?S9q(YSxz@Fs^DQ=iW-vMr=BIFFPpml}sk~-9+u)B-#j+(kc>wqQ3BMWADo)<Bo;e zHMnz`K)iu?m}Kp_(aUwmpXwaFIl?Tf_g3fEi+_*DUfrhZfBV4Ao=!4o&ATmZa|&qX zqGppLLi<pKVfBu78uV3{12DFY<uY?1ztiLNlM3lkHBA@zidAXMiWI6Sd?C^MshLzd z2y+#z<_7lNvNUcP%uZ&n5zgv<*hNU)gsh4YLv5%7;T8dTxFbMm8~~j(+t3&S-AdC? zFk<#PG2MLRe&~Q!`N&ja`#Vk)`_ty$mYcI#-i$3@FbZqyJ4i1X5R6hTFjYmH+SH$} z3-am`(!_z0!2buXBNnm__75paj+a!Mjz4})Rk$x+J>yj+;-tNiqrs(uC_36dH<Ura zA-7fn%ZwQ2oO%I{oI&*VB0F5>rf2_=huunr+pn+U4(9UjR+o@u1LTX__4qPEG!OQQ zGi)HG5(!;S%>Idz&FDq-HyvEO7Z!{Kvhun{;?<AkLM;SPaB1`+51(LIMmEG@r~(12 z@(q>ojsK6K`X;HjlebAG5fvtZdl5o=<yHi%A1C|hM+@|LRiV!|`a+CTWaa_3uGtGb zwnI}Y0t7;wP}kl<b*Q%yaTgspqSii4nR48j_ar*k7Fz1h%!S^e{Z32@Qg59$HEPcZ zO?odl%IXud0!}w#6j&?PjE_2`x`6`^I@TB_3x8|2W}-v>iSKDOt`^<M6Kn{+D%c~m z(Vm==%JJQqb4lSzsnHFr`Rau@LO|=RT1hehO!@4=i`J@*@&_}_^mCSU|4Wz$LA|r8 zklUA3=oI(-qE>HDPq`@?&%FCLcGvGEQ4=V@3xZCt<Sz@V{}`f8CiPq^EuQcDHPclX zQf1Iv8z0=c|JNi+$$$jOIxy=_QXhfrFz8HTh2E{NrM}mnVaanX%r2e?R6eyOiYQ7a zX>|Dos8TYr)F~77+dNWbW*ve<)F8}@m3^`o<T<Il`r>6}wsOtyOEhpyjm#AI>CrQm zx@t)2OIn9Y8e)C1%3iN<ShXcC(T2-wE|ka&1i-b0YgK(`MBG0p<hv9tu#nWMldx>g zNNkLIVT~(ylp7AzdsvTWc;&<);G3cCVm~zw|Bq7t=YN&@!Sw7UJMd}9{9-CH@hjrj zBZHxW-ov$7`nV3M<w+wlDry-YTP4Wy!ubya@d^-rRqnpwU&!5W*vE!1$0L)682Roh zHT|46Pk{*kg29C0X<XJZu{UK+8?QXuMU?|Q&$eIEDs=IRgk7It=uNzMi2%#*4BKwq zB!i|V5|Tvi{7zuSbr7^N6*Wm__=cV>s<Qa)JnmO=IJwX=x7kl_%nTUgtLHG_y8Fu* zuYs~sbV~{^?-q1F7c}T-`B@DrHTGKJe!UZWE&Iv^l_qBH?myl-^?NPgOv~qc-A*Tl zZEjpBsj@yj4uacNkRVeAlRM4*j<%sui@3A&pAKPXGjeT|TGlV!Z~ro!xN)`1WaM)w z>TYH~s3+ALAw^G+2x_i2GvsVNnfApHjceAHu=5Q8r;S%*hW3TlrEGf8_=DN4##EM{ zfkht)nw9!&I%&6E;kQwzFMW2$(|6JKrxTo1-(}0YuiiBIPhYEV7^$r5C71D*HWy|i zf=rkiCSi7l&HNiB@s5H%Tf<iUX&y6jquae5;hS3&;o5tIs$G3PK@S#w;{MDIX_pq> zo2gJ&;q$h2saL!;`#cRh3Mj-6l3z<bn|PqZ%i$9nuW(H|e>3spQLzVMm($Li$}LGz zYS&aWI@Sxh@r~f#l;l{ml_ejwMzv>_j);;<<J}L$e>M%RLhEK<CU#+yUi^-dIfRDo zIL)`HRVwNrwzh&zTMh-^tS(WPh|J#|AYIoTdL(Ol4kYS~^uTCtO}aRVuf`;!hj?3# zc&BS6%oK(Lb4Z@kqK^<C8tELI_S(C)Rx1z~3hwC@czSs%e9gGdv@jhXWI*g_s=~`x zF-2rjD-Z@gycvGJ21&jKntFU1SqCR|D1D=7qV+nw3rp2sa^7{ks$42kF&*w*MjSQV z)iS6n*Yd0_l_=Pau+ZHlwaw2My|b?4G&v6`Hp+0j+w~Z2P_rEIHtkC)Gwb#&+bm*} zj~;@4Da@mHPKA4)z_X@2jcSh-9r{2?Z_k^6XX2m2483y<ymqlQjN7KMj@!CCbvjLr zb{Li{;AJt@WH-Rs!&T~WZqN*i_PXur<@dxZCOO^SWxU#HDI3fXR#<>>?UU^+eZr2v zIT!uas?dCP$uwbQ(~3?-Fr9#*9gnSA?~vWH29DM`!*)a1VY2-*UhhNc#FTL9XKSBu zg7rqLUNCStCLLBn-5r~I9wdI8JwG&bAcrwzZt=fQ4VcEWCuW-YZU-Y-x%uo%m+72R zatj9T^<#9!AiM{}cfYfbMf9d5<iLQMX-#E8U5HMS2+_}rQM_#6*r*v!v<_+arr0MY zwRW1XNe>MF%35*N&s17tGE?N{cBKRQJ_><OSzh;JZty?a^>4RCdg$`zq2q~a&x~6Y z#ID75vRrC1F}#(s8xrfjd&Uv#*sxS!V?LUZaQM%p`ya?-hLZrd0k;KrnS&o+#5O*f zqNA}#i?MdYvxFvXn|67L`R(7nM$UTsUB2RxsM9IE;&<4w%~bif5(>7~?LMaWzd{eN z1>bd|{)BTN5kFV6W<45HSCIoYw)L})V4TDORuelDAHM^4faG~h{EuKwPZ=ntFJV5C zVS`q!DrFQxBcHMMU<jz#lQHQKiHH|G{Rx|*vieb$*?=Ma4Y2gMQl*=s!k;#`rF$Lq z@n&Gkg#3zPgPbmf61P*VnZ}#aEC{-6Ba;hM1b;jSt#Pa0lxxRG-m{i@>DEH9LsP>7 z8Y@W~R1DA*3Lepx$EES^d@9omn%SY<a^i1$FF1#LuMx-VQIgnbB6RiP9Nm)!ghI?u zy+OkfGByvWH<f^vSVtnB=Kin`)1l7<7j{53;KAvBwDz|3@#FLmcpok^2;D8MeKz<) znMz%^;88?-=g8)J@>?b$C#M@$yYo9cn6^)%(PDwa9OQxP*2f}nBL|~mw<w%Ap2|_^ zg+u@<L0y2#o=b1KEMrUz59i%8DZS$4p;W#)&6m`%70W4)kfXrdTzrN5BYQ*0g#xzZ zx51ZyEw$@`&T9OSf_<ZP<LjdkEhu3WfL5}a;B3b!1iEv+OWIJyal(|~nIwLGiLr$t z!9}!!^#&)~OxZyUxs!cj2lQR3GA%r;VXc25xc^qmXEUXcYyIonW@>FnpdA1tY2l+i zeCPSdd)YmEq^>+&p?{6sj6&?q{anlc(UOxP4AdLHQ=t<gmsZE`U3_T63v7r`ExeMR z9g3$fUYIM0bi<gqruS0}t8>HVOyV$kWiKWLr1RAOC7siUY)Uq+D*A$b1Vx%f=9#Bc zG}MTrbXsIP>>crTDdUz6jeYDW`vwYudJE9cau|73LOp(&wB7ipgl?K>Re%_$KjbRH z<k^O3#$$^N_gs7afX{U3OnCnUMgO4;ioHXo3TZEuF&5GIOF=P3c}Mj(4plJ?3JT72 zqW!N<Q#NxA$W8&Q-~De*T52S=cwIa~J(XVAwa{%<_X(NAOvwOa`rVwDW>EyUgOp?m zQ|{1R+syh1nq@wH{CgAIq<qDC5tdKh{3GL*8HUxl<KVx<-prQy1qT$4F@V~5R#+0_ zIR50`nm+}v5;tB=qD}VgD$nNIC(L5Ym5}XfMY-%_DPs(!nd5ogtGoYZBmQgcN2T;f z?Xj$=cF#5@Y^mjLPaXjO+97%{U3VV4;e7Fz!W4-b9}Qq&RXW%E<Ktx-H=?yNch9o~ zDz0Uk{2IUp%QG3nx>D0aPfUbMDCB2jr{<0k%;%$*sNkiHY#mq_I5lMQX%MV%p(@hu zfwDEYOA~`^MA7D?i`66=x!yD;g*1Wf{02<m+i3--OF#FPWp9D%Xdmp!!Z-|-{C4l^ zXs`VI5k9TP+24iP>kuyLU-*7e)8kPh(R#M6k`tvmR=&-D=j)orzh5naz4g7?M&7X_ zP=hRc)=4*o#NkSX-E_0wRLS+&NSO_|Bvs%_44CVJ$@&LCejSasj>WKg%KCGXt+Gre zB)jbjGDQ@XKd*Q?t#4EdV_ZH@DH2Sk*fX)pS{Vb6_`&NicM`9^%bsSz=t8|p>EVe+ zPQGS(*vto??LnlcACN*o0E|9Owmq2SecNdI<k;-t=oiy{kUa$Ed)%a<H?@&EjInL+ zl8G7+Qo)nFVO5#`)l9AMbD0fTN6S4LH;#m<M311SxM=U2S5Hf&d}jf+|wx##nh z#s=1_YB#Q%L~ONJxrH+ucNON}!*)rEB+-7r;y}e_a9}5N!gk}zu78E%mhQW2KE0=r zOYn7rZTR)CEAr|7YyQT?p~&3vgcn0Zw}s5aS2kk&!#Tp+`O`;l3fy}+D$UQFli&B& zsru)cL0LzxjvghSBZ3i%arDsjQ$o|OxC<;xL|C{4pf6go8soHvv<wWg8~P_o;YQa) zsIB)atVZw+@ZNdcT+c^2X^$jBtcKo5Jh<(F1&88+(irDoIUQjuU6EM9o^(c`UC$_H zlDkieo))j8jM}YZip)`$G|z<wV;Vk%y*8b5>c&4_f$l#HXWga&hJDO*W-~QL8-m%C zEFHMo(vw>CGebb<Yp~u-UWs8+y#NcfQ0fV!CxR5DX$scTScz#qQ6@bQCqR~#jxv2t z{j<CgzSm~!h=uXFor>{^l=SOPo-9g6O8>9<$bABI57FLT!b=WMO15UX>geVM9&bZO z6u+x)6>V>4WL$0sv_$y7(&@#FpeGGbzToGj(JFkS0~U@ejOQEvF$FwDgYCyQI*CJq zy@7;=Iolt;q#7d^X{v~FjjDI8XtcFXzCfamZaRTHCE+ceBuU}R-%ohk!VhCn;LX%N z+|K}OOeac))uIp+c5m{!BYnG!0?<r|>-}qSq44A6OWcg)j0jxno|em)t=Pn`!f$L^ z*Ed2mv*={7_(tSh8+UQIuxov?kmvAK2Fp^oEelh4E%$`$X4XS}2fvII?9OuW9V#^A zK3Ke7l)53If(N<%K5h!F{gWyB+n#C{N_wojp};9+jQuNSs84NpRRy}O^Puf8NG~jq z4}z07+9u^d=xwP@H7Qv+X;g`LUxXXzI~qJ<Zxf<;yCmH5^jZ%sw@ayqpN6w+_Z3|X z+cW6*VX5s{=&%baKk^Ya(vh`IEZ?y*Twmdc6X_n1?g6N=gT4={@g@EOAmKM0!W;g= zY1}8n&|^hO=+ZPHJlm{4j$=Q=DTO{PUUD|&FCY|Sx<8{TVgZI7r>T5MBGntER357Y z<XA^Yh`6kHxih-)=$#O%1YM`H9w6|*pJGAYwB34aEEfS>iS|7sZ>-5ew#u&gFsLFz zULcC|2@d(rv(U%d5PEwtg8IR9p-F|FPw|@l(y%jR3|U*$0MYGdesgk*YsB#|)CCZ7 z^&{46f0Gj1ivMcIRqU*@FpXtQ+yIq^AVdzJJ}NXZ8?cc+qb8u_fn5vYlKxLD)<6Q0 zPfNT-Y9KbEB6_8~l{uJ9oE)?ABo!MI(kMAd;5UUO{#)ct0oZYGUR=K?<qu+j6)(8o zQ!;j6o`4OPE%vVDsa~I0k4f6|+AudB+XNgu`iA1Q1IMvyy<agl9!|{l^79z0O+JV_ zC67dTK~CPeYc1%6L?}H7ikbm&$5><rBL8R>+^0Hitrsg8lBO${#@H1i7iK^+_zaJ3 z7*4B^Th3zA`i#b91ZfDJ;y07Ql&@jMw#BXFhBKQQ-}!#S9WGa7J?43q#qMp&EP(sN z2<L9UvJ@z6(LYVG#klW)Z=n&4O*ROnYKyXaJi=ZYE@1MZ3}+4GonyHRf**0zk082U z);@{u)u{tqAVEn^6cXm5cO@xzKaxg@dvJd>*g1+~QZ>ox`H$|LbyAn3)&8Y(@)q~8 zAd@DdxE7Z(>fQnK9-oH~m8g`LtfMS5#z3u$*+jkBz&nca59p&tqjk<hBn*5)S?nHa ze7C0dv_?~h(tH^?g0Id_@$ACo!R0<W+PF7+&@+Q2iLP0u_OS%*^M>^wkFXyuv*SiP zFDdI7Z_s!c_s}o!$O;_NSd$ejP_##I*@R0Iyu@NUdd8&HX_c|%kBz$WmiX#`1c;m- zr`sE^iTjrjmKO)hIujn)CQD1i8(8gJB<Cp6<@IKh`{nDMBqkFs8BPI2L*HaDo-?zL zFp<7#zxgQX2~%G2kX|vc8kN};L?%VTei-~wa_Nl><wyF#m(sm8|BtM<aEm%>yS5Ef zLb{uwyQC$gOF$Z=ySrN&q`N`7yIYX%9=bavh8P(5e%|l>JnwrP-#>tW%-+{t*IMWD zUhFe(7ePsOmrig;c+`=m$=Pj$9a21d=TTG@th8+pVhgOWIJA&sNb-E`I1Fdbm@fGE z)PRJGo+U+lMT|vrBy91_Q>t)f>`-{ch`>fJmh-cZrA#S}_ySx%+h=zom8ny-!NPZ` zElt7F_g!qek4pEc#XDg8$wJs*n8xJ(4-mxfz!pR8X%uS8PNagyyXH;og!TTybw5jm zyW2yv2R_pO{jPt5V%6Z>vBr@vU#g__vOItte6ENGq*&;s=Vb1BGDcNzEP5Slo9a7> zkm7yMhmceuF2!)bi>g*p0zG(pr&VZtLCn7E(5RHa^ohN!to@mFXq5G|7TxkF{`7_D zBRS&rAeA3InchT3wS>@h$0cc1HCZ034L;9bHPv!?ISAA$VNOz62!#^yuHy>P<(9W{ zo?FkaTta}CuLj953lC|cIyz(X2tJpc5rh-bON`k_`*fD~Wwgy8ytnk`VgnWSM<dT? z>mg+>b4kw~HZhSv%k1jW{}WePr_EIjnJ}{m5r_Ve>TJDJ(k?PRPY~wbCfNYNNVuV# z?KZx|>b<aO{y3ANPmb(s9M(jlT@p*cv1xmu(Efo0$o&|m(|V^+BVLSBBGRNQyl_`Q zH@pMaGo90+55+kUiMj{N*?lHx!6xjuWrJ`k-^|S=Gdtns8T@D25+Z@xZ#-c4m$=zV zNyWuP3v!D%N5b`C{jvD-+wk7Qz5N#1_6foE#^WVft^E1EGyk_2O5IOmpGOztKgLzt z=4j0gCzV@~pCL9nDK=mm`pI=aJ>@Sy%k8c!?$nj5UM?fgIofo(7dPo@%WCEHJJ#sB zb2{96HJ&z_sfM>jsX%ODa}!h>WqZ{^)f)lC#q^m#;@^7pZ`EEzq{&*r@hp{k=cc1v zyiK7ilaBc^mWpQOIk+^B^TfjO+6*ziUN4BYV{<7tx8lh-n$P!tSOAEMsg7jQ7aANJ zXr+GByNSVVk%6D<FzO2Ahvu;-JHKI<D=KK+jce=Gtan%}NLpU6;zN^EZazhz1>;7N z<n>urB!+60%F(D+K|Cxc%L<R%)g{s>jo9w5q`Lj)3p#Z+eDYTs#bM6+IqHIoY^F%r z(|fk#9na|~9UB^Cx(^GZmXFQXr)7rFge)^Qq_Li${0Baa#rQO{;Z1VL7PTkwl1D#_ z@q0-u95E#~0Lq-t=l0WD-w$YJp3Ccx`-29wOj-=}oq(&AWxds$V2ySDPH|0B7Nf(^ z%|O6vqooQ~3ti%&s8b+S0<`1$dG%|^)`zafk6Fgo(hn^LVZCRQpY=Gc7d7le^orJ> zHV9o^C;c42vZ?^9at?5y78d#5<l?dbB{5++y8C$98aw*sG%~+Cceh7xB<7AoVr#4) zlsXkHLiy}Bf2i+zobjb1m$5|q=-Mf*9rs5_!v8SR^8_`hnqN^b%a^ifa>u!nM0;e7 zdAFV|2#;91``s9z;?$Bn-D8Rh#E0k5W?H^<j9~oz_s3k_ZG1gV3_{%DR+GMITWFB} zbp05@JK_KSDBd|zl>B<x){Xo@sYm(vYk}bKjy7;&kzJ6HO)f;!X1WdRN?9V{FoLp{ z{<RqyVPjm$1H4MCKJnW0FcM=!_+GRj$8_3{M{r2>4Z_CYDxDC@b^woQREyFpGMdcP z`8Ikg@ZJgNtCCJG&=FF^CqG-U>$VvRvi1!6g4|;XFf9hQje$V^R~-P?$R&mhx_&;< zdr?9&6i>F4^^P@LsMfQSG6Q<cOC_InG)a4t<w}11`eCBlI`MEOp*6MTMxbUHoGMDJ zaoZ=7&J-&L)ThX>SUx{J6d`XSu%*Q42<{?Ppsu{>X#xCe)QDFriFC@5s=^hn<oNjb zMLO>gu~-dIih@c$OxKG9BMziHj;F_oR(*T*mTuB`O3#1^vDnJG1ovcCV@`}Lz{o{8 z%r-XPgi)zK_N9faN5m03mn4i2%^W0TfKDJV@UD&;Lk#P^WX7)vmoZL4HS4RWUCmC< z#&iL%CeW<N`#>}VgRqmF4Opx{+2mp`-<P$ku2&*^fL}kd-+1PDZu)|r&yDK?QtYIH zNW&;bx$l@=g`&uJ)6UC;pTU&Wo{5)-`7s2&@j4{FQhg0ESNA#S412MgAa@bOfZZ{u zVvWAAGOAM==eNEAy3dB+%3Ks_jHzn#CW!QH>lSKpM9f2KP}r~oNOt0ZkE>N`;Cd=| ztO>prYl=f?Vx)bRLMm&|ePEY{S4#?6Lul*o<;z|q7PwL~LP@<et1;mU;=tE7{fOKc zF?iG#6#^Bai9MMEGi)Yo5@wkWA)4)U5zmfz?{MZ|jzCzE4ka^;DwZrwG}bt9==V(W zFOK#xceo~JZM{{b)=;vF{?!~VyLIdR&u3<9`-1P!8?b#If4>U5jU_@~V5o99_kcGF zsOltfkb<)!0OP%Bo$w7cA&0299YiG(0`D&r?LX1g4Gh^CBY43&`ASrXv%crxf9*I& zh<A+V7pvSnrvbbJ{M%_C4M^-$!(bCU#4XCMsl4I3i)=sLkd*-Xl$K=KU1-hDSFIiN z;MQ*Y9P~6cqYz%_Ku-Tg($Th6Onl{R@fJ5|c<=6BTC$mbkX5Fc5&UjN>#Dj(QM{R9 zwg>OcpKK%phtaAHgVABz$krSYYtzhtpvGuX<K4e`r`aC@M(iE_GXVSsZKClkpoNKI znFeCPX@DNKCE<5coS$4Zw)>MfdX<v1it;<3Fk%=;uP883W<V&lE~hnTcPBFG8%g8W zN<v5EuK0cEI6l(#F47c&+1ZCX12YMZ);c>WBlVO|B%mWD)~c|qfoQvF(Aur+ULH$T zVju$_1`S_a)-DF21C^Y%VWF><-V9ZAjW;DKb3pXrjtoh7ig%M$vGBI|DbMAKMW1xX z*-yP=903Qab=T{YIwD1lz;8{~_}4o@xCG%HJoB1aPtmW0P#$`QOlp8A3nPnV4A(Dq zcJ>?DI!p-ZmpELK86n?a$;{&x{$As#2H~hD$xK>Yxvi<QEeFmI1`fPLp0xw__6=0U z$Hv|s!#y8_tjIFTd9a(r!sAVqlR7rXOSyK{T9<SHu6%pze2mJ;@R{%X@xs%Eq|@c0 z2ysDSnyjLqF{3$J@PB#I2@PLPrR;qE4J9@DuOT_PsGh`+h7;P5Cnuv$dqxG|xl^UZ zII~S2f$LMuWwT0Dj)?g(Ofw6~3Hpqs_L<cE??v{xQ(Kgii&j0RkfQr^Z~t-Nu=3om zp5~*$@gX8l$K6lID|UI@l*a0|e6vRA!N8SK_}-kM2*@X@`8{-ZpUft`R3YNhRTTL_ z(+KWH+-HN38daww8dRsT)4vL+B$Ng2PPD%-v79e2ZQk%y#{_+1GNcwQ`A9F6)>0$3 zr2=)kBYj_9hOatTz`d?S>dVUM{Ap*)a8k6kfk=hbDRW##t|4hT*{tE4IHv~={@n<i zfNxszLBLf=lx&gT@OIjY*jAAoVd;r&i-dt9q1B#Nvjo>`crI)9z>>&<Kw9r{7ubzN zK+*B6f~h$>%t|ThV4+k?YfW%-KUK^?aV*LqrL9bL^qbqdz!coeWwYPOINl|<EtTkQ zx$AUNnem_fbjqis?}BuXj{yyp))7uBd$+jda?5$A(3lNHxr_VaWqz-8UB?)869pm3 zaY87rYO9TzYSCV+<yoS%<#py!JSQFZ5|lo3URVpe>&w}EvIlNA4}Z<MC(Kq^oZd2` zH>az*645NaM{J3LNAQ|dE_ID^noS3UXw>L&84*(+n4YQHK8SogckJ>p&TR|nkKy+Z zw}|s6vbi&RD&c&{s^Ra8tr%+JAXJ8x51$l}W6*+AI-UxaJ3Td32>c`E*HlXf%*-Qt zuN%a-Qsg`xbZnz!tCfUE7prlOZi!a$mr5woKy=)*MnCVvdm&XMB|j6ZD;5;IByHw) z_gLdk`H_@e+gzgePiT?U5XS1=Tl5QCF3<cp`&V#A&!8Bc(Wf2Txa@%xh)Cq6?N4gw zemhK_Ms5b8n^}T8n97Imh(8~V!yr-bHUSJi!_m(cGoasD#_qYia`dxYmiDf(GEScs zd`m6ml6N9*2yG;%L4}3k(f#~ooXhk^a<+hH`PCl7VN}_txr6#o;5Fm0xaT_97BDxQ zP>KAmEWGSG%!_~wjJ{p|-lNfY@~GpgXu8ADr%d_zpFc&gxapk+Q8fJ&BIS%cgVu~L zh(5&PU@H}TxsQ}l4tgYSdUtFb-g|VcM;?e??f34cUMx2F?Ej1kq#(rlOTv>u4aJLv zGsh&w#&pn#=+hl00!B~I!heN;Hq7A^#B3!qa)>m^e_lEsA6|Pj;RNWdTclYH#|3-= zSjfoe=<(n9{lD;9FS3f>1a2bG?JA_RJ^|Df&!w8){+B@bzFMG_U_(}RLAgwY4k)Zt z5JxxINqXn-&Z?s+X~7+OIYXBI&s{d+SguD}M;;_6<*o4x>tRsn*<e`?Z<~k`p*vW2 z8r$t;q4F4@hjA5fg=4B$@F969Y{Qr-Er8#c8F^T&1}(O1<+C@2X=be@0f%eDYe%?l zFEKJ)!z^VujOn2`iu|Fyc+>XSJAkU45&Q)wnKrYkHdjtVuSie$jR*ENXFSTsC3SHf zjnW9JSjALzk=qFi01o9e6n(>z+(!{1;@t(5Ddi7ApB>5I4IH5PF^1iK#=c8Ip71OA z65=Q_4Woh9?;mu7Hr{IoKJ&61X=k8~29GgbHpxEz<6Vo=H|{L8zj~I!GyF#HqWEFg zUMlU>E}UxfO<Jql#X22&Fla~Dd0M;-K=am?v0I@V{q~NeLL2@)<ckt6z8b9>B1974 zezx4$X+9LDQ7^uY{)ZBoAtg4c*4DCGUDtp4k3c}z!|+8DN&)XsjCQleLkJeqQnD!7 zzmn84rc$(E3)wO-E?mnq?2(YYdX2lA^y&fVU&!b`=DHXD6>*9XHDRKKx=+x68h|Eu z{+a7RciYKu{hKQu@G39ergvg$zbvderA%T&Y?mkuq#YA>2bwA>pGiBVSD6ibG9Xl8 zKXT~LRft^WLx}TFr3x<j2%Atwr1qZCTr*2)NEB0Vt|x^yv}x`GgWi(z%mqGD-xUCF z!8_&i$Jl_KVW0tX?7G_L{uT7Uw=Ke_f#OWZpOyeejF%_W3d5gl4BGF6F^Le)kDB^s zHAVE_h5PR*8*Ko$o8|!gm_p`w(38nY=v&@}=bE038aWJV`E47WCk&RV=qst-JXs>& zK58`C)_88(uO!1(#gDMO!BMuGesP7T?K}n%KJu#jvl_*FnCx~xq*yUDD@1R*ukkue z@2YQ>t&P^0Mo9`!XXIxgE*6VPy_F6hjYFPY=oybivru$RUoPendJaB~Mc<0=bkb83 zgN0J^F1Gs2uxMtVEKf3nC(XAXINITuDLlh=gO|xd3TVNA<YXe>H+RNH)3Qb0VZIF~ z=gTo9Z4`%9$lP^r=!DT8)Zc$R3$QikfNGeJTXNewtv~|@Yq8VSTL6vlGN9~Y!G^XO zy2RAHYN;d{<11l@xIrL#JruK#8Y&!kKE*<k$jj;Qa5Wayo=LlyCoby*T?fi+GwjVi ze8fwg(jK!|b!vMGdOcG3@p6DCB|Ua${x3$mR<mrr?pzo2n8%60;$Q+d4OgXOGn<F4 z{9P51oi>U}>{?^eabw0?xrsP(r}i9SC%SeQDm6l0#fE<{kl+0h@8qd=^%0*pFJF#; z8X9b;5d%iFX}^Q4=5bQ9TIW-C-<gH&MHRG=%&|{$I|ETsE~N65t{6eDVhUS9S6<XG zm%Vp+tetIl3T_q=Y1ncfYS%r0hebK*?bQn3_ZqB@ySsa1AlGsWetapANeR#Vg+J<P z=3JSUn+vq-zIadCk(>H(X+`;5CXMys2?DCcG)Uoa1A##$r%Sy|tx_vpd&7$ST<H1v z$FuV7AYS2L8a)A*Cxj=sneHb@BkC594n_p+*9X5TV=#UCDfCKq=jI}rSrZWUzCG&9 z%bqQ_%EBJHy5Dgf<-D}%Y4J0a4e-Cjuc!VEF2;;O(`vB?LH_!Yu(n;o*XkM|c=loh zD<A1~mp>kIcC<ph7px)Msiy}&orNp51)mrFAUQX(RLd=@Won9kEoL>B8;_ygsR;}D zSa06!D-3v@e@iM?nJJ!PQC0XTJ9*J(3{7FoZk5C8D$r7&-+FSj9JraBV_=b#y5wrO zg(jfn)y(0Jvb&Y5F{$MEcGgiLuGox~I;8Nqzb9qC**F%1nRx;L&uw%7qRv>5j`AEz zw@iJdI+bk7U>;Ggfu+mO_0++nT@}xFmM$Ffqul`dSSDYcG2eSY@+nkouG8`dUAa;Q z67uVmd!LL2>E?LHgi2Hl4$65^FW1tCKNNlHes2jjo^j>+n99_;AU~U8KZA2JEf6?` z^J?VeCyFbXxLclWja)n;nh-no1G($wFc|_o)D(<#TCBwz-5^Sh_j`xqwjx-%54Suv zm%L7}l&hLs?FI>*Mu&Z@#^;2)ug-<8S*op{mP>7}h1AQ}v&hP_8Qd|qXb{y;mSvMF zHpb?}vkWMgJWNxNQGlvfNS^D(Qht-&%2x2~9&dVezB`@?_hkBN6;r8suO}Lac$){# zad*_fZ$7!9UQmxO&z}DV)$Ti(d2P(jY{k)b6h}jbSF+nouXsQK{>2-+nr5t4SN(Qg z&3eSr>b2FJRdqLk!kVlshaPZDQkoBW1N9P$3PRTf>M3WfThNSgYRDZ;H=zj|FTP=c zjxD3#6whK?A;(sm-G<eeU7|q@YHdQ@J&*>|cJaJUKF+Y~UQqL<Hj`%2D#~m+oCfz5 zXVGSU`Fs{q>ri98<fw}!HX-1dH7Sn)q6dTlCN;mbi!m>)Ll!XH)ouy8<;%0rKn|lK z4-M3e0PBDu?F6)R!m{Mep%>PByY(vg<~0KBhO>Xbxgt{`g9~6E{Gll{BEm=myN+V~ z|8IIptclM?4wTJsj;MsswbrB8nR;Y8!dSf+K!_a;L){iFxHRU@5)Fq8PNnjDQVC<g zygGa`K-n3IPnLlz0DO7^Ubm6G?|WYbbqYOS#)OEyvW@iz>H^Jt{T9UxO1mXvNQy`` zG#lT^+M-PkQK)@7bG}qBQ;|j{;+Z;4F;obI_bSI>);14I<#N!P>F4YoZV>+xCTQ5G zGILLgCBkTIkAfFNg@y#GVK*}m%%T0-6&d-_1#q(w8aCu)4wKXX6|;DwJ;J+xYQzkV zr4JS}eW6G1wV>~$6GW@gGHAc@5aT5?sLQVbr=ls5O@N@WRM=50BPinMe0L@_qUev{ z-IzwHu&+(_Q~Wqmt^2T-;T2E)fz{tX$-w1Ir=I~>kK4zdndrMm(7wJuMkG4p47BpQ zY&PIv)bpo!W8idiI31652<Y8sJAU5yT8i2Y=5d<biy4Qww_KDmA7z@DOEUsX7BRyi z`a_B28h8U3JV92B3iZ@QhCna@;%bAB)60g#hlI<_sG9aNy?F9_F?5OI^<^Zg(a`!R z;630T@hnicmqKl62G}}i82DyYQDR}etEd`gH4+N#^lBA{;|%G)+ky)X8TCWZ_dnV! zcY3*Dk^D0uw3@QY{CSPsRFLpH`54mAISlI*4tzfl8>DU2fZNM)hgwlQ=;`*y&L+$? zmS5A&M0Xk3EfH*zAs*Mb7@`N4eqOr{VgG{>JT3PQT(cu90DR{DI~aTwO8u;zaeA^% zhO5=0r|$smyjzcG$7R4?E$m`-Vn4+T2F1yA`f^(n$FnRwiY_`7WuJ!i9)4LpnkkG} z@{`2d`h~afJv-k6<>_(b#g=jL1A6eZna*xniUP2J47&<y{q6s0wnz?%-<+J$b_w#? znm0U}?F4_)jOZ6x?`vs|7l~|-eSD*E&6&)T|EqO>QG<IE)|)B#t~42yu-$K(6fUKv zZ)=$^9tX?ppz%7qs^ytoOkLgNxHpMs8d8iNBh}V|K~qJ{;;=1)kFme^!6vc;E<Dku z_}$Ut&eUB*rBU(2PAQnw?8FN>;%6j!Y;VD*Jc)O4+}3d;Pe*xX2X`k@1Z}SAeX<X( zZI!qTI?nbmUtn+@Nv;dS6{^}DWHA_Kup6d~DTrXW1pbM5X6B>BU<Ti_aS<|!oMvf{ z09x+}-h;z&8MA5moT=cjj=S~t{os_Km-|7XaPFzSzAA?u-C+?{6s7%s<l;AHtF6j8 zIJg~Yw6r-9qhdcuO~ZjMFCR`j-?oSR9lsZ^PxY*4JA(^A+QdkEW*df&k;I1khSPHH z+giJxfu-lurGa9Q^YWOi%rlwS3v4K4O)T9Rs46r`i@2<jdVeRjoG`mbGn2eJ7sWl$ zx)hyR5iv{Rb#rJ@wz=Ds#GrnR%R!ok+bz61k!dY!n@H?zvji#fJX<!|Gx4*%`((~+ z(p+`FGBnzc#B!Rrry$+qu{VN!3^;PQS(vDzA7w*P4rE!U_Vi<aVKOT2$2^@>gVnZg zI^}kO)a=j4gW|*CPso0A0uQ@V;jXq=0K3*raoPg44~CqeWaAM`yV~MF;UfBC)zM|W z-k?e9dEFpcN2k`2dhF0|VtG`zcbs2JN+^&~BH0&+`cX0S_~#c|-@jX5XXa<~vu7ta z^fDT{(yiS>sMkPVcc-c^zMJSUGxLS0^+qeO5;lGE-LdEkU~2pZA<PT`quqv}`YHJ| zyN4rO_rJi*8Z1lIDz(ov!I9!v`>6YmFRnTCznJJLG?+<*m~V4&VvxPWFt5n{@<<o` zzO1<%kjiyAd-qcya+|B@tvSy^JQ<rZgcgu+=<!Sx7tc2+PzB0foHa4$3nC-Sj;n+| zvOAzYT^snI%}B7oq{t9~W$r>c{JIuqFR1%vL+_b{XOf?lF-C48n|H^FLA*4Yc%{55 zMca5Am^~Dey%`{@M0rfRMWXRXdUfvmT#7B~IV4aw9|p)?$Ajg~r%5yalM!9@lKKf- zo9$U)EZdoe+P3GA^7&j+)Ka1K#}vlU_p6R4QO6BX2nIRgY)dAd8)2lD-AVOvmKt~B z{HZZ~v^c$*Dg?S_3x%D{qLv1JZd#fjygf0i+IJJspJ^U{{E7|kn`R+>Dfjho$+ToY zw6k2{c2Z3<tsLLa_7J@x&Gp>Tmx(v_36@Dwhg5gZszmLrl5$l<Sq=<im(hle4+Y?f zZHgg88!9eRBP#nU+9<XpH!(&sX8f&KZnVz541J*AXv->FEUI5__Ko_^L%m$rffn4Y z*CfT1#mZOKf+^1@&53`{?c&{qIbRn(Sq^L(tY*qx+C-A9SC!7RpBleE52Tjx!}TGu z`2yQPl^q<u&QPeT-J5&U-R?P%T*Ih*e72cd55JQTAERMZ;9=S)v(l8o5DJ3t{l+H( zW!3rCo}_l!Sw-Q$gE>L&jnv6@^KedDl%x*PwAK_(_b_elOGd+5#gp`MyKfpPb(K%a z;AH38l2Pj013kP-0AHGxJkc-(w_DHg+GDmT>Nv^4NHir)sta%x08qd3E}tqcNOvAn zxb1QWT^SSL;Zaw=JvG{XO14Y@Nl<@Aam`;Gb5(v>`8pT&f)dg0Q6(CRq!I{4o(GCC z=T<Jnx<!kB+@5_d3qdAGtDBL-k}t?Adfn}p#H=F$Ir2%ug&Y-=mbYH-yKiY^i-r9R zHPRJ@3qgC@N*rD;Q`&8=yAj{#+;T<>b}I9mStsNEpUI-3-QybPIJ17mxRyLx+<*~@ z!tU8F@B6<(?&7PYXa^}{-4z=-N<DganXK?R8jt^+$h*XFM2b8Yk^R$C7|(=(Ul2jq z42Eb=|M~_+qemEEe>^pT(GA(-wbEO-N}vEV{iWThF6v1r4p;&+_81<%vR+Kt#r4hb zCl0F9=o_I|EyLR;m|WdNQshDRm!h@VLi3Z-z4T>ypM)F|dvJ*Rf+>uGaIElcy~d#- z!3RNOve5ci|3U$8+hCDzO7>upQpv6i&(Np+-%i+#Uu<oaW9WAyiP(=|qCXw_wj$(( za>7C98a%>WOv*)(N0>(P&l)eogY*<MJ7>2JQ8R)W@QD*`%9RmpKfVq6N>oh~f1dFh z%DYK%L3%@I%yKL5X#V-cO2a^p@H$-3$RiF$=pp?(-YUu^-b<o`cd5xnt3MQ&C2wm{ z<Trl>`2od<rZ9i^r#?)DUH6nT-lS7V{}!?~fOhj7>)6iP+KTO9x0~^|;=3G`HNq;_ ztH7^-RNzNaT!&emn78Tm9eeR@pYf*5-sQQUnS2C!*K<_?-M+b(365z<tL3Rkrx!b2 zBTkMLX8OY^xT|5HT;YAeQDH6$$>_*dl7ICSL@i(1d0PU^zSI1#u5AzBC-GYnt4q=9 z>aB8Ed&_p{DTA+HhdjH5@KGPgl|(Csl-CtcC;ShKg|I_>v{muWL13)jg(sImc>QeP z_7KgsLi1=Z%U(W9TfF)<WehQk?`KqBXPY=4tx0)qU%w(oL_QJc0y2xlzQ^muqdbbJ zIF74D->~XD3X7J$xDY8%MjbkZ8-&r&r^~1KLDy-?upJ7U%M-NZItQvq2GTRgQyzt9 zP%sgrL%hNaJVlF$%tSTJBbxRJD7HK?rGxbr{&;?y*W~N3yBhS6&T7zM=AaSQ`?SQe z`(D@B(UPt>l;Q)*DL0E@-Q$*`b^`5veqh2j*)5MW(d!z8MA}s#Yv2MsVj7DGFw2Qr ze;SdE`FtK`{k&&fW-^*r89=q(d$VW0(v-!w6ZxqQZPem=vqytKP(FvBM_Q{`BhkL_ z34Jr?zZWS%(*InfoWMmIl34{<8W+ldKH&X#gGMm|W#QN#I_U$4vUIo6j}h9M3K))B zTnj5YPD!HwN#*V*GT#VK=F5u}#yb1HjQXTw`a{^u6{c)#o>iz{TXh4|;@?fX*`i8b zgOrq*2wXFr2!J%ntut|&%0fLU)Sb^83}*P|MWnbWL7^%XQ``#T_dJN)1>7Ov-kfLe z>MooS2^Z&s=&XGYxIES?U_sBnZCeK{!~1`h0WV~QY?IBv4=Bec=2gpidN&83K{@oQ zZHeorJ@3=%M(oz=zb>&KPx`geTnE|0%yycQa7v>Hxk{C9-Y1qVU)l0zU2KJhlyR1W z)45jqq{#d7Sf8(#n-x=ZaWrv#XTjI8pg$jnQ#rbcnDbbToN`DAp;YWfP(~XQ&V*M~ z#y!}h>SZs{czba~NLW15acY&GoQ?K9h6&Urn<NNg2Fq#IFVRBJJT8-+Zlyny=u7rS z)y#X3kQ8Y&t}E7>bO`0RUgTf=v!ve~trZtr`t0Ldt}R0>OR_OTQ5?{+l*YP0pSS2> zPm8(tDPRc#83>nbm-W?8GSHJCZ<>;B*xBTAnG+l2i00E=`HpTvLE@_MW6H;WFLK-2 zTkClpQu)6T>-<+KLXrs`fXlg{s`Z@Sj#%o0A|B%f*hnSM7y)wGaAetgKNdxUOt7F1 zd(<nAp5?2+Y+mEzv0QcZT0I*H-t6$0#eq!vJ!uKWtdvea1NUp<w|p%<)ec)D$RFsu z<wF5(BV_F&A8~-dHcf(QKAUrNejVAWgQEgIN2xIcx;G`<Xf^!CC@!V%czN4;`g?IH z<`wQYFEtkBjn1cn6dG)WI>`KaDXMd++MtGzF5j~SWHd%7-SkUdWo3A~IK64f8bg<| ztga7VjmHr=qOyAuN=gZPaZaW0!bJ`a|Fsm>aFg?_+Va&ElyM;?X14f_yX_%{{)Mi8 zZo%Wz{P8em{xY4I!Txz2SfczQh2?gp+_gg`$=0<9dih9vd=mGvU`IfK8OAl0tmpS2 z?jx|Bb6iZyKHSxR!l5$Ha#UU&I#ez!q?j6d0tK(<A|}yQGbvW9FmO!YPjz+bW>vJC ze9z2xt=7&%u^wG*NI&II2)G7XExD*yx{VJSH{(k(PWeX<S4ER7=S0p{I)s@Bu7jXw z2SYyf`olA2fW1PsOC;{Ghysy@kDRwWrhlkNF1=JU$FB&%el(BXNOXbspg}c?kduwD zN{{GKd+z<rL{{7J-M-7s_3V4dMElEV9YXTm5%MwjH!E-@XP+Kjhryo#%kuTzMi1G2 zCtM4S)|T6J!W+{e<%ap(>W^%iSDVxslgw}Z{;8=ct|wJxYU8YZJ>1lt`!=y=l_2E0 zjk0-$c|toep;;=?$gd_u=H+1;>Hl^NHvaleVrC8*hirB$`~24^J89GTH@Qh^VnN?I zt*oq=bUMr`oPoZbuZynB$dkx<tdPCi4ne(yrW31~+l5N4xfXT3D=xWD3SQa{h0hA* zvHl?9f14>Yg1A0)cJSMIN-r2y1`E)L-DF>BKMvHbeu?t9Y;8c(iO(`?_#mD9Bg4GQ z_%gDA{lQhn_djcZP~6v&Sb`n*?aRdf%um1L!d|^B0nfCUzOEK7QeQYe=fhvj-TaRB zn90*1ZQ|12*WPG9YSTwal;91}9<2R4)|&0~E^55YbY>)II$q4vxwpK|IDoI^-x2g> zGFxDL3#|b`_WGjh(N^X9KBmFJ$jAKw0wz@A4}Dw(+#GBO{fcQi|D*pBy%}VEBbfJB zj^L*#lwwyK^dS(<;mY7GmhTMuB_@l7uliM<g5V6g_Gcmmg^@(>Lntih%>7DAr>~w) zccu{>76h}1PjROc)n?zOLB31@T^2}_OsCWwE*e~}Je)$qC&`t*CBqS;Cu(k6r*x>0 zEY(WTDu<=;^(FBjm|2=FNT+8p`>r&O#zD`V=~8$eMLURbgf3@3Z2#RM-^SIM{)62e z>jU$k(seG3{N?UU*<A@-e*!rRK4n&5X43<3z&msXN<L;VRTHFh=c7d(U}EsBA4LGv zpf0tGj_YWP9JFBAE}1;_@my)W<<u|#X~IwY?>dFeMOOv0oRxf?FjfIkzf(>u-d|2F zGrNyE1|a#SD(}VfuEi@SEV9;_jP932ohzX-vt*EQI(-Mx;MC?)=dAydfAo9u*(tBI zdz?OS?)G`S#oxA>vaoY~=$JALoI{`?vg3++(6d}J3B7y_*UQ8jDE+lLh+6RW1Bw{7 zsMdr)b5y{q0cjt=j#0PN*JL(HGV3<de!G0~H5=&D`;FFjc3Jxv53hEFH(6fQwtQpr z{8T;Xbz$-yxvEG(1RJRmXnA&@qsHQzR4w^7y@~7)l>p<ZjUBg)Y>r(54Li{1-XwMP z{~=dgeVuq!8p?IA@ME`+eLtjOSWnPMwawY$lf;<pON#`uW9BQEY1i}BX!U-27<adL zN|R%HuD%H_s=W8_sM#ZP3PNnR)5Y_+7fnK*cV_@kVV=dIo4Yt?pe-3@lzD!Y7D^?P z$Uzf-wp72;(7(abE-!DpGq)8_C3{r6WOM^FqH#A?=VD>S1OMakbT`=U>iAXQ*P+10 zeJ=D~Jsk*2+1_Njmb#MZ7_$pc@i>S{xj9`ug?{yYX*5Z}zgQNpHXe@OpF&Jic!tcA zlp7zAy8EN<j5JyxoqQ-J`-J)%9`uzT9R0#)>?8IBcK;@XsUwT2DP%4>rF~V+kV#F8 zF(*M6C}aTW8WwhIhF@#3qDJYKnoOV*S)Vf=1l-QG`voY`w{GSHeW3X4>@JRHAmG@Z z^;;kxh<@~!n`vH2TZ7S0^BSc@<(LufE7DuFc8~ovAW?M^b?=zOA7&6U@KjgA+^y=q zB!G=+vzeL!@4zB^#@yRE9AQnrZNO<1Y5RzBHb<4>%vR8;;Q<Igr7vAV8~F&o3gr|t zxNH~vW(4zw!>^*r>O=mBV->v{*WyqIYtIf^MdkpRT-Lz%8<rIm7gM|E{SjTC066CS z^dv$*w(;p83Go*3Ps(@1bYfe^kCH;5h7HHjsF2lmzYSj_Y%c)L0liaERBe<oQLR%M zrZwdC0A#IS&+Z#*?vMeP4d64}E0c=rMdUXFRDWSZ@h7pZmG`R^fPc6$RT9`3a(73K zB(W4*g3C&4;5siteU5WKgdX1CXsqWW58trh^E+kGjyd(_yf{|Ve?L_*Lie1`>rYo{ zkW($yR-CU=mX&)vRGu#yUo!na*En#i=T&veZ!`n1y!kRt%lV(Gp1z5!$wAx|8zuDW zrC3r}f<!y=Ug!%oeggL0d=H5U^M40(=0elOs$f!<H*UZv^#pDHcDCMJ63{POs)q_I zajn*^LOEZ}yTYa|K*VCHM6@bzA3SkooL95&Zm!r=<0;NBvtM{9LT6ZaS3J|;-?*2Z zv$75=g5w%Xt>E%bU%XDDqugXzf+8kW{tAz5#@oKiU2C5^SC##GRBSq@_MpII8a5Fz z_^f^gh8rT2rcu1-fvr?Ma|WvRD4B2$y9Ptg3&&=QPPCWwvf>qGi5I(;8ukX)KCAY` zFTW8>A~+6u^A5SyeXCw{KBf(|30~2CV;|DC>KJn4Z4P#o`%z^%fb!;Ygd0Dny3;xl zycyE2`kbIJZ@iV`l1;UoeuJahqD>|DTvgiS&8CAHImr%|!O5#(e%HAyaFer|PK0=r z)<v}1DwpMK>7XiByvL#@!sLBkOFQFKcm0)M-05j*kR<+BI-4kI$)(c1KY^~u&+L2{ zpNwm^@W*ODo!uW@fuEbpJE5CDFgX+(O1h$(d_GAgS@<RkucHSmXa2C5KoN!nL}z_1 zeM;UHcz1EkV~@#D?C8E9nU-@b>XXMLZq#4;xF<0Fh`i2H0az@~=8}VvGF85iMk;A1 zF=(x?=2Lg_Dr#+gKW}`hldb-yTBgG3A{@QD#&ppDJU^{{V?+lCA7}80NjnYLm%QiM z%T6BMcRK~6hWreDm4%*7M)OhQpR_THnr$LFls5&S*lX1s7Zv8C$DHNEc{#-8>2Cfv z9#28)AA4pgpPrLGvau&Q)SL+Bn^?gJ85}FmpuQ=~<+XcRm|~lEG-kF^hMlM2i|;Ou zaS7vI)AQ+nBVBUXO-9N_lFCb1y3>o(IczOaB1RDM?17=cXOt<=-geSz#gf6O$@Yu@ zmXRBqW`=~r%)0Xm1vn>YR)oA5F)nGG1itzHCmgVi9_+DjzE+;&5!2-h<Kx_FbfB|a zm31M)pn4ifrAlYf<WHznxZ(u^3)mq-c%D4_b-WK?M8Hz`8)Q!j`t1jp3cV?#G}f&c z3g~V-9n6ImD3>B`007&e0P*B*=K%F$UX@P!aVK+@9P{m8ecB*5wx@mL7c-#RY0Os& z%XBO?SJ(5Xut7^kp=MYz5<1Oq7o93>kNhu-zz?@r{^0j==V$st6nE;RS6TV4UMPX% z*1V=0Wve?5(EL-KF}J$@*WbK}78d>^hIUnt0YKD?a+3~KU&XN!`oWIkLl_7HZ3MzG z1x6ZNs2Go0Y6bJkRXezT>Rq8ppw{ldf9TJrh|k)Pr&0Kp8g(~ELHKvN7RG1Zmy;qD zjx-aqi+GQ-_oJYM_T~vY?2UzMe&EQ>ptOhZr4pdz);d#?sQ;*g1U|WvNaKR5P(`YO zf(sZ7Zh~tVd}qWIM(Y3Mk?t-#2>ZHTVa9BZ9EhDwD&qu$cKHE;bNQkDRj`syoAW$P zBN!aioy8|$*h-C~i01<z27~GZtIK8a^=puF_~YpTTw-OH<GFBh@@vOppr)wI<9c>{ zlyMjl{SGKInjtJwlTp!bu51!SvcM<LgePnfeDO|(0xk+l89=j@*YSaHQuF&ji<b>; z7(^E-->~lhd-#tCGE#=|=pwuCaJBWNx;vaj7ipXHd){!GjD)UJ!?!<qT<;$t&&Q36 zDot$nM>uz{-@<G3flCxcRjYMH{}Bh<p6Bxj4ww5_;2V$$I3mg87`2+dYFVe6bA7rD z_?vE3h0ORNfJy8E*le3g;~G}2rPOFpv1eP`0~JTJ$mbn>4bl~8l(o(u7kuMAGq})^ zl5hEo)|qwM%o(jbcfxyefbW3d1RUG2?scKV>E~<w*0tF-MPj_4q3RGFH$u!F_X|k> z`t2>yo~>4I>O(y}0013cr+-rfbl8mr@E`7wZ}iD|W|Pm_IkEG7)^Ehpe63eoba(zH zuP5Sl*7BBpV?g83qcejXt7`6Zx8dq84r>##H-l!Y<_T+luXo|V6$6=q)UN3d=(>xJ zowd<lCNM!la4s1IQs1ZWip#zCMFCnLhx8re<je;b$0&u2TgAEWRKUeNWef7lQ&`#X zJn>UJ`L<ZM^kuQ#&F<$gIZ%I;2m&FoISt2CS#I}z9kn(X2pW$F{NNNtn~=gDE9Kp{ zeS47OXA5OOZh3|hekFxn#*>U9ub5puRx`Da{jy4N-q!3sd+7803rOZ=K-cg9gUA4V z(t~=vDU(w#z0(%ZNq#dj@aOF{@c(-Mh*Z2~YD3IpAKQcF$i4Gk7~kNm6EGV^zO1=z zOsn~@55Il(rLIq=uJfG=`_*b(t(7k+gz16|U6H~U@Y1yyT3!VUKD!erX5XBECy9E0 z3tRzQjjL^wuSIehrd56{AVO59pMoMNA68-n(=GQ=mH-2%(}fYqGMIf20Dd%wj4|F3 zETio|P{i?y3Xtos))<Ihv<7jeihf=9dl9hVq@NX0>F~-;OzI%?(3KYSTg+^8;-&Nm zr~Qh{yPLmKh+9s*Y<NJI?ru7oJgzn0;(*Cv!EWfls2S0#M7^Ntb=#pmU!h5XbaZ!+ z<EsX+t&~3%`4xe4DnijrRLaW$wJ&!>otCB_|Bj~9!tZ>wdX5ltV=iNx;sZI*Lid$= zD5rUC!oUdqUvKQZ*M%un6|sEY-^=utd%$~OEfvu)qku(Sl}O#8>m;YADz2s4WYS2@ zFL<|#*XXl?@_G3_1}l#>O0LLn#z3k|{ia2m(-s3j2Y3LMSar+olZ2aGyhpLMmP)ev zyVI(xtf4dw8KFT^_JtqC-aM)TH$&ZDR|Wj;>!AjA`?*9KC4who3uQMKeNOo|kGQ*M z(smt%3WBKAgv)K=(1atsynoU@-bZ>B+UlC~vF{Xbj$jE2W@RsOp0WaLh9w>-zMDCy zCx7U<e#*!s*C~|yrMDfI>6X=Ge}bnR0kD|Wf=~Ko|7;g&W`KLU^G`X_<Q9ROh1g*9 znJQS8c}DFIu0{Elg0wRZw`KsvJ7N7wZ(ADGGEFNNZ$aG`W5fkhHzu85T)teKBg=nF z=PgT@1s)|?y-!(=apj&x$a1-eZ&2&cSv*V<srMx?8`)*$$5Lc`-rWdW&$r(y29KIe za9X|??0lEYBQ8fdA8GTIIhm2hDjE|>f6}^G?jbnvP8Wl9Q7ikIm(j0WX{(k=0|!=e zTYo>_MVp0PIZTVa`mHo(-rs;}Q56rlRc77tE|RICYfQ>@Y`e|^SC&Z`Ru+}E%w8GB z0zLE!QM;_q%9W4zI!QX+*B0@#I1v%^w!a4XuD_v$4SvQQSGOvDR)BQ~d9KNsW=pS- zU2Qno1(nFGhHd4~<poDj@!FhE`w~-qo_vKD(W}bb@|Bbbt<~<iEN8gM_aSZh{y`E7 zsMh#_)gdrdn6V~HlK-%+V7M;7`q0P56Jwtbcr1GIg*ug}?yZlgZY4cH`U8lkDaxxR zD78Li+s?G4`A%w#S}R@R4utein#zGEcjMgHo}Ez&`061`Ws3O&o}Y|vI$t{;U+s;~ zWwHozf9RH8HyxK(M<(Q8hcgPtbc3X;T0(CW`0J|rcBnH@BZh4n#HRo~ukTXvq9Ou^ zsfbU<Jq{$d^1yAgUa--9^?c<8{K*2#gd#qa8TfTKuBio!lM^@I;=@3aMeT^cf`&Ks z`C{WOg*RLN#1q|Ll9&=6v=FbZpQ^j(2$h7!7Yr@(f<)V|#FptE903Q7Pb+VAY4x)O z@*J=yzkuCc&MJfgft`orh}Qb~aqhL~pVWw`ck4P4;`_NVg4Q$lZF~E#_oqe&bMTH~ zq)t1?&8cp&FT@Y-bGeSgH<RVG!V2u*K$W;Lh~&EQ6|g;1rVhpbg7dz8(sX?4;(h+h zTVWbSX%nLO&gb}HK$8m)XNO4Z{vWx56mTsjAB6weAP2ws&y)hpEhq4QR~FENuc5Si zXSV`ZLllY^#fx5$-)~Wkc@G8c?#NwF7P-R=GBhUDiEg<Zw#8s1Y$q?XwX!aBl8+q@ z6sN#ynaBga#xDaFdRiDkg~v@G=-tBWESMY};r4$6R%Dp|)aiFW#xi*m<kHcCLA*7& zT47z?mO`Z4eJsol&+Z5-Rf#5p{nwAP@GA~{hm8o`1>re0_YQ?H*GxScwZ#d{(Mbum z<1i|vrUK05@rP%QZutu5=}%QyIM^2Nq*7%1lZ-!Grx*?9Gnj0K?#i@DrLw-t4PAsR z8c3(`0NR6)#o>~H>x8sdc#89Moa34MrIm|<-u4so-q1P!<<6C``pjS1MR^(&gTa(t z^t-Sc+OIpHUM`E7ISt7msh@omh@$pq>oCOp0~)7vsSPktv1%!mfkpw6B1iN7$D`W` zP5gimfm;Y)kRC@N>At`%XZ#z?dyr{W;VOecDGC3D+^&mvIFnCuk(yhUk0mLHOnP;> z(Ta0=2YWJ)ewULm$I%mg8~k!wKRHK}<83|Dn<!*7;N012)ixc<$ZI~OKdU<=8zXRA zvZQZ=@wV%?1bkuqsof;N#4Dv%@ZHFycHc|typjG|Jfy2G`Xi9+4(Okyvo8lQbCQPJ z&VmC!khwGaaEn-cD=_dCyjID=|8bMs3IJdGM~kR1bc&D+SJ^zY1?y2TuAX;zZ8{_0 z4LU<?Q^(8mV>-ukVR+lk%xK=e;b1gwUq3neYN0&H1aOkjto{I;Td}Af!*siQn^zQ? zz8l5XjE07-8RHh0K^}<yIiz5Ca9pBrs+@hkgn-39Hzbb%PHrDVHuX>xhzQWS+@3Be z$H;O1Wb17V!FHTZaUTIiMG1t-9phyEVv|>YAbR!c^|v6GcaAATfD}{;4hp6|te*7~ zaL|b+deFO|@>;9|h3olx+%bYllcI?q^YBA8b|-3#9B1XY2^lJyIMwCnI!^0G<u>jE zUj@*<!H;WvUket)j2l;96jY9US+0vfX>$e4N7gP2nr2>>zE67u!aYK2!(&1{p`Ik( ze>ZeH-P5^jiuhbl&AE<INS}kGt>#MNcvbv=XY$rVa`BYM8&|qt<V^EHc=g#cIOu*t z37Y?uixTby?fA#w9NJU6{04y`lk-*YYo-v^@g71n9dVw>H-_h9X`eWlgU4UL>4x2w zcg0jGGpI360$$y#Mq8hvCRe{I1jlZZ&JgFw0uii%<C`C^-;N6;?L`JEXdvxDn=c3r zF4V&(@S*y5F*QC4+hkb#A8E+QFVBM|K!q$M;!dJ1Zo84YoOv~CvioZNKe5N|MX(l| zY}&IjxrFYNq#`t2_p%$jnyIsnpeV#YiL}wG^WMCZXaC^;<@iyT6f3AuqqTT&)QzL~ z@=0~e?F}RZIio{vPf|8V`H0ktEi_4=%C(yM-gdgUg@pg!=&O0E-X4VWZ-(!=ZoQ|? z>ISPTs5sm6C-1wCzr(@vU7e3(Is9WMnaN_0l3q$ZpNbzvANT{ErjSV&a>p~8Q#Z<Z zHMw1q7baVQZ*_jBOG1c(^rPz97Qx-qgM!M-9r)4NOF`AI{pEEhiY?Oox^bfK>>?IV zV-Wo>1c~nB4bo6oziO28_1x&u))iy+@vnTSl=~uuqZv<+&9*l~<I=dPZ}Alv9e?tb znmf4U`7*<#F>U;we2W7rh-HIlpT?C@%L7-M@$$ITd{EC|x@Q};oac*d>+d3xRA{hS zN_}U7THY>~v39dzV0512Of8fk;V|W{JO<M3;QCa@&<u~&-x4n$1<JRj8>(AcZHhjB zV${VB<zz~G-g6Da%rcwl!n`ri+b5X08}H0mxTFw{cU;A07uBUebP5x7J-Kq4>?%QJ z4(}Kpb@*kd^4rM|-Nqn!qvH{>+-t`>)Mc<YryP;))<D!-XLdmX<IhPFvr18Iu}8nQ z?a=QLfeN;7bO<3T1G)CoHcZGhVMjsN1!$$&E`nT#`n#Gdv@}}Ob?<RD!h+p-+OU7j z{bIG1;*xV+Z&MLxqS9mBk46J`zY{UEdTT#~a=CleJfS=KKPLHylgX&R)BGr{{yF7; z{ylc_;dYnO-6Z7y_jQT({xyo{#Z+#f;@<Cb0MrsXyzfl(hU5(}sCTjT{RJ>;v>(a7 z<jLIYG^l@Hzp;ns_i_RREOWtAJ?&=OEJ1zuPM}#tbx!!yqyB?Owd!DR$FNsPI}R@p z&^18&9gF`MQcJGg;qCxicZ<-x*1St$(IYXjrvK_8Kloq!Ga!GnzhMKGnYr|SWg@mi z%wwiB&VATE2s=MFm{WMf!usy1SgO`Fv6D<wC_D=JrR#M@FgrCa55K)XnhOnMHlW)8 zB!@kPP<!e#D&)8;YwmcA2ONRp-;<$^ebt>s0(rPt)DvMG+PzH-*l1>tRE)OY#FdyW z?y0)_B4qK&FP#Hs!s<tBVO$B53z*#-g~;)eGpE1}CVkib%wHpY#<QZJ`v8|jWzj2@ zRC6eU=lVUnnRe{GKcQ{QG}`-G>j>5Fl)(03e5ga^w<R^puMlLfF^ZYA$k%$pVp|!U z4`H~1X!3eKE}6VbS-3)I+8~L0CQfKXW97c>LdKE>w;Iw&B3-%X%@mGqL$Co?>_=k0 zzSvk;5EJ|;ungsZqlGFr+X^W6?+zz4x)gW}u=H`?dK>CEUv7(skV)_hX~Y6Zm}NBH zvn$Y=p|lH-RwO7MIgXcY!>=PTU{ofLO(El~J=**2|MvKDFtmT|uOX%k$TO1krR*UW z&Qzy?O1&ls9=h=o&AN9z4=jppTAPC(6d|Ye`JL|k9f<>uELY1`)ki5mWutOf+F64B z=qC-iX9Gv>F>vGMnj7t**X4(y6+ihH$gg@F=!B?*n3z^XnHn3%|MZaNv6vwYIhB6| zWlu{|{xi|LYfuJyk&6kndoN#2OOoPS4c*`}0*`iy1`v@be>6?3GGHvXP~lNTN1DE= zY^2_Iz@Q-S^9_4Odq#&((^xH#A1D%!NTw!<ub;EP<OE2>m`1`_@eVnHJ^}$kCm+BF zVB%eI-&Kk+8+b=@VWZ5dD<JgmDe4Ru6*544PE2*wH)ktgZ6^((5XOi_7vIZ%A{&3V z^wzGljH_4uncq8j3?1m=>ge>K!=q4KUH5ESg@B=~@JMOE;bmoYIv!Q10fI9^S6`MB zCxZSaeV=A5SqMIntk<dTl(1AF_eqA#2%-hl1ytz_>;k_xPE|Iw3SsM1CcUl>kY@e# zn|R(n*Yi)e8dRTO*d5>{v5FknsaM|u@IcL|hogZv>`s}SNlg)OkWXoi9C47qw!r=P z&Z<SRtzTR+kAbWIN}1caMH~<MGly)N*UpJ$$Q+uiFgvNbO4hBtcA~fm*jfBS>U8zj z1c5CX6her1ay8cvb8CFgPYM*}`I@IzxtxCAG)N>U?78@;n&%WE`lcp1(t5FGJ=1oS zps$ArS8sJZw(azw!u?J}SxQEaKYl-CQHX6uOAm;q7B?4Has1B+N(YzTY+hB>Rn{!H zY88^s`V7e|8%XkkBj2P!B=y&UpWpqj%L;sm;$<E5z0Fv RL8Q25Kx$A6Z$ayJE^ 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НtH}MCIuF$u0u%ay`Qvu`8~9iv%zy~17yEj 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%0DC(a5||L z=};?ZVE#CkEdqPfI8RV5`Uh@IVgA|d8s+61=ijFaiud4#BNWUr6OrfaWte594ye7M zH><NZlPELcS%qx}oPM(i6j_rN8;80mLWSaS(p3-Xm;ai;$eu&Z)0){x=~k`;Ixf<Z zq}INSkZ3Fj>6aGO02{gfob$q|KhkmGon4`R2Nr^j&O4CQyVl=NjP37RbG$|i<38QO z7Pllyw9C03T0LI+3K&Di{93f=d-xZYrc*L_Y|}nT%@ZpQ`h6Rig9=#fB(^^8*rq+- z%Wn^P^=7==Ubr1)ll@zqp+|MxSut)%fx-KDXI$dKNw;Nsd`30?ZyP(cV&CY6#1`X~ zNyQ`{42f1pUcdG_ca0q;mc-@%3CCgmSqJ>ouM+K^p7T~w9k<C@P8JlziIPe@-PiPF z%E`JuUJ#&XE04KTp}|a#0rr2A#V1BShe~7wT=UiMdim-o=LuPDmO?nF(U0Ec<P`XZ zgaaAnC9Xm64JGvgdAS#8n++vZOdXD*D*wOM?2gi*1~(+YrNL^0Nynvl0mX$o@d*#% zPQ^A~O@SN(mi0h~R=8#U@~8QbvR;k(&I(J#X^lF{?rH#H%S+Gu-rHjJf*)`7YKl$` zH&%Eqj~8IPZZ?tG2~YN@9o+bZDvf^b?*#%WPDbLn8Gg!NI-ej3uRNPj1t_FsjIm#& z>*lp5iZTI#z`7)VxCQ&paQVb>EJnM6_LY5hj*vS!aL<V-rsJ3$dxm_AI{aO1gZg#L zO&|B`#`DcwVN%6an~zx;EVpnvk7a7}ip8W<zUubhWBLahjd@1)zWaU%M5W84mi_^? z=Q4Q8U1OE_Z*^r~c>Sh-;O}kAHtTYf4wgmQ_$|3uc<sqa8ug3Y{9;e{=HPx2JC=QO zw%UaGr>WQS>@U?^fM^0^p&K7(FGYyLOa-R62wzEM6Lr?`dHf<Bs{-IJ^%|FQP?^p> zaM_U?B)Y@+`m{w!#_z|$y?~)JXo+tRpCq3j*~8d(BSiG)m!Tioe4R~wf(;7vq9{}M zm=tZ;Nx>AqHvwws**Vw0y#VTei{-j*AE#YBa?}(0wXq}Sh!tLw_Bek!p?IrCIEF3? zAFhccZE+p?A~@RD@F6Bc0{C}CoFUluI=JQ(?1H}Wf3ag^DwQwThuewO2CR4zIvJ`u zPJIqz`0#1Zw@2$C_k*6F`p|SgbDz?*gpQp$`v*k&`YL$a-=Y&irfc%~?UpNED)+`c z-iuUl@p|tE_eaQP3}{G=_xz#>-u+H=t_`W_bDy|Lyi2;<WTMv7i5C;AWQ43t4-p(J zS(*9K^U)I&$mhh+B#{4jWsc$09GpWGE1Mom4VkbyG?=s2VRz=4+93B*qm7f5Q!6&P z_KbN&>N^YfL^tAWJpK;TsZ?F8J`~Q$`+UT&6wUZ{r<3IYr3m(Ppyxkv-{`FAe+ySS zFg;usQ2p4oaqTRaYhBT9-Ekx|m4hkhp*%w{FC;SRwbEaxm>M!+x=AT+$&F3Dm@QJD z2#xS>2S_;W8E9Q;D$WI_|3E^)sw1h!PN;90dMLXTw8zuM>8XiB+C)hP?)9LoRt&LR zSRb$T9Vgr~EEwPyR|6l3X$<nDTOMcRSWFI6Y5OwMqe6`#9HwLY6ni;($NH}QUr+Sg zp)Ri3M=K{RwrQgM<!xsVG)y!ga#43Db`WXX%Arr6W97oR&f{<##1~dL-YfQz<gr-* zwdq^5x>>)BB{xAnUVQOQQ(bDMQS<J6^0oJUchgBKBWa0i)~v??T+NdEe8)JriGF?F zf?!yPOAEOHMrC74Ce)}L_$iyqK-*iV#AokbuJ;N86=bB*0G<1CBZwMk<gjFi`V3!l zBRJixr&nd+24o#C_onhXKacGOr;d^?%kKy@)%)XIe^3Oz=TIUeD0TG63Jg8g8p-|{ zrF!9=rmJ5s8>yT(^zp4#GPP4}1AO}no>YgW)Eb_eC8NRi`<AwflJkeN7so3@2a;Xy z_$6c2eOR}TT~K&Sl<+@oe25yD`p}c%N*%GpvMVZq<F~uUR(9rte0{N}!L!K<^|k+J zZYdb++3X4vN02gptJ-q%sUe%1oo_+5by~6z);c$5dtkPwaUo0fXX8b@W<$L2J{`L) z-Sk2PxDwBmdL5Sm|DF=R9e6i)<M-Vlskj=06Bxz2`CxYaX=QX51}{T*TEzFQ*#vjN zHgGR{&)roZTyTl~eowS<*HH_Hq!mLj{AkQBjB8)|;^*$6;3*Z;LCYNKfX;r8%%Cis zV4vzeT8gI4#bp!bz0Pq8Et(0Rkd$6e>L{!J`%{j0DM}NsAkU>iAZM3VM1TZ)YCE8N zU{s20Ktli=C?G;djD?{>=A)#sv@He?yXy5eM9dw0U%ml07fw>^aAy1E|CV!3jwvY{ zD%Orfe6HN(r14@SB7P7U?n;i6zH_=PYvkGMV|rr&ES~etbNn-&Bz(chZKrRZ#QkPV z&iNAAd<DJC!(kMwWAMG9OikK*6J3sn=`y_-K<xQSEp+7%fBh)2@I(>DnVL^%9um2= zSKZhAryweIx1g=^tn2mB6P6!DhcDLVgZvs98pNRwMM$;$!#j(u$Z4K07yNOOm*RbQ zMQ-2>`AXanaO|X|P+UMYwJOAcvTw}NAIFvWaK+c0@o=$mXhaJLe&1~*$X09W2ns#v zlDI4PVvsT}>>JzH9BP@p(v!ZtKZNdGz}P42GEPh%_Sgx9!P&>l;ho~&HTM#xU;{^J z(PJ`x%GS^(x7U}UqwNxSmndVODsq;$nVP<gc+f<+m0R9jf-git^jGw=rsc;&V;{7{ zlpfQ+JPPzNXGQ}P!vE-c|MSZRQG^BrHGb>)Ko|dzD@NxGp9ay@FUU_!NU`80X<QvK z5MbYf4r{>$oV)KAN|Z=SRI7jX@r#!srkii)_%l))H=g0|E@NQox&@)UcA&{<Jy92v z77yx>@pIeEtfbeimyW_O3~Ls(N<RI{PJU5tSo5aN&be?R=<D6NO5$$z-BClhH;c~O z!T~YA%6*B0#`cXMBqO)yOpfb(Mu1Ls`ji(Iv-A{vYT`*6hwZZ$h#IC*sOUx`lSiI8 z(6Dog_f}IEn-b1T;CX(<l<1!i$lv=`$?ja*JTCJ&iNNy9!O4$<+#?{1*(p6@-AIWL zv{2s@IVgY3s1qA!AcWAUOMum$!g`bGpPE)O6JvNaSXvRD@aN$Y#xt18E|$#X9cBkX z4N3I7kF7^O88)n5?<saBfZh_Hj)zUPm{}vtk#0((qBe>7h{f}Th$zPp^A%*&S)WTj zy?@&_40A<Px?K~h3|{-FC~rUA^m>b3^$#&acwaTCsqxW)UL>lumcx%eToq;<!I`5q z$*>~jRxeU<S}@m*&1PS%`ITLAUn4YMkDK{JEq?$bdWS%R+lbZeLxa(7NLyvmsS5ZE zm(}2>?(~rUcasFS0{PV3H_@+A$EeeWE>`>s4(6OyA3|gBJnu#VDi!Khm`3fhGE@0~ zcbym?Yk-^JL4XYj*}AS)siCATBPAk$4Dr~mZ-l^Ug5MWQqS;tMi-&e>sNf$-Tz=Ib zEH(zEu<Oe|+03IR)2-<Wt)1w7g|3(^d6zgM8kLpvE&D8d*q8~nGwt<zBzo$tQA!q1 zuo*9TCw8T?{93_gmm{k3m?ee1hEJvHzTafY!}%+9ZFZ&iir;y%Sz+a!ZMA-}TH+7V zvYxsMW0%c-;|#7nP+k029zY4K!o2t;PqD1dAT`<~;;)9(IomFy)=`4V^pniz_`_pN zr0|E_2ad>a#k?lO0FSxuBbS@NJLgwS)EbUc6NRYb(miipSA2}jBU7MfG+IXO!apLC z(L>YJXoK@fNrOdNax0vM2+A%w@YiGuDUm8OroxUa?&!_>4HGI)D`3>oSN8W{xwzvO z((liuA3L09E89f>96C!=Y`V9Eo)DGfaOcF_2Y)#88UZs@eps3H_;gQTQuZaF;>D7C zkr+jpge4IJ?9~XE+<cE17^7c5f##y#nNEn`?_9s5k0e{X4ukQZXPnY2&%Y^K4vC!F zS0)%E%e$e`_x>fFzjWLBh4CSy*!M;_eaASF%^I6|d{=<}B{wIlz%KGNX-jW+*GR3| zG6+~MF~{*L;}>(87FuD(YK%bd7gLpw^f%T@_Jd5AGRETbgi=ogHoP7YWo8*EugDIQ z9-h-981Zl1+-rjEG}07P!Ix!#o$Ig<^bDL3r?5ocUUW8UW;8K#b4212^n1SQ%0|mS zByNn9VyAYC=PNodGUN1t8NJK4yR~aPAJJ?tw8ocrJufp}`|mq_AUM;6&bUxC_FjH8 z|3Zm-#Tash7gx{Ecc%3#Zj>~ppuJDbbQ;AO96hQRTH<!UcvfIuKl~K##(F2C)3`NM zyE~Tif;DMW9|<PBHLo_%%U*Ij;v6=9gul{Qhxuc5(<k+@%2ImZhcA=HBXgt+`|Yci z2xN$ZeLA-yxC;W+D6}3YP~-Pcj@2wX(kRL7sy??I8Dks1@I!1JT_yGckq}^OU2U+o zdrx20dS0s9Yf+8A0KAVw>F9{XK$hJ24tJ#dZRRg*w@q-}yU*`Pkt1QQmWGMpb{Ggk zNI7JE?yQBgH#w^CQQRcEz3#qpi+y?Q-<g%(FPby6TeH=#p1HL~Fxr4N+YOYzGDf2` zNdzZDr%4#8k_GcU=3FO`i)Z&ewOQIP1y9XYdU9$L@!S$XR`v{V2my&mvg2B)N<&x- z>O~bUi5%Q(fCgV|*`+A)G9gmA0eZfCzXxZ=G=GeomG8TpGOWBymWYa(lG9Tkr>TRf z_A1<lyl&Hy(>v(FfPcHTH>|kyY6YYjcz+az=*7>?T$Ex01pVq%ul(h+rt;eHfsP58 zecF(i&G_|p%e?t|+q}ogI==@&wq={ZV%m^TF9|tO7w1t;H<nnjEf*e5B8IK{V##<s z&uHT)l=7GVMXvmPQ)G#e>>lo#9e^xM2sIPSan{Eo2Z^RcnwN#ji5dQct>TsKyy2r+ z5zazVal*G8S|uL?>g^XKO!^d0W<8L{`K@P4dP!j26BzUfp14$U$~Tt84+17Be7Fib zwe6b&iQ`eeIU5v<&gYnC3u%NxhKK6xv8OanL80&)(2BnY^ac^)rqCs#9DNFZ{=n#* zGE5$?Ftn@|+T`w^<W8jYh702Gfb6=ve0QWao@I2nqnur#TTSY^Wx|3fvkSb)8!q#s zhm?zqNb-0xHR7>3tt$R^i0OFw>Qeb+rvv71=18!$)O3m*sOGEu5=$oUzE!_A4m@Qe z>EO4W=i%9G?HIi8A-FvaVy|%ivv)dqmwYdBRht(Y19P4VljJ#ys<en>-4C1%VTLz| z75?3D;Q|GC`D)plPwZMfHBTn1pu--cn!0p>^M)_H^KpIe;#RNOj@6IS60>q-$!<~! zJ3bKk<Q<F2k7yqM<@dKo3lvNH1)st@1B2yW|GyZRJ8B0OtdIb|$LOtMgFPsdNycKs zaR&!?b2%2jqaDRV%i8OC&(CJFJ6lnV(JN@#N9UxVi;;C_Qc7q5R#bl_I~S4e=Fq9p zpKX8M;?F5>_4d-ub5fa?#V<);lk@+kj^wpj3?}Bag6v}xIn3U%;e;q}O4Ic>FbPC{ z5623@_WbFb3Mz7lhp2DG_x6Bu)pBB0;}r`gj-C$Y_@io>coRl5xikI8B3E2+kqX)3 zL@WBsKAWgW9At4m@O|L$&(_*<DO0|4o>yi-%Mo)QjS;s{3gxEs3;YE*^HKxtMIMTf zyV=ij;S9!ir+b|*&eOl{Q}=~yGoan=pCeQTVJ>_3#e}nowiM9Gr>vj4sA(}Mlj>kw z9J=)hl<c*&dKVwWP`<qM!U8aX8Sqqm#LK#+^lKI=BkxQa(&vP;lt1hGaaBY|@_QGp z4#F*BR+y!O8M9`IJNU8T#AidbIeW*_{t>U}jgUp@c}9ow5Bi#18&D@wx=4ty1hCDB z`sjdMX0olpN#84X&1};a+xhxek&KH819R`Jr>ik1nU5EmLGdVKrykN+2DSQe4E%yM zLY@Zu*lRZm%WuUQa>GmxgS*Ug--qnQ_cfOm`w06KMP45zS_paJJ&jV7j*i=jc<I4j z(zdXqR;tn(tw>c-bw`W&r9#Fos_jII#5>;CT5fpV-VVJ?DKGQJ8k;OoIEK$VYz>;- zo&;T$?O@y!i3vJ5eJl^~9N?#NqFy&2<T*w1c6>!WLKi#uD)2iSAX4Xp6*f*Ky2tmy zeWj@WpWS2fFli8e^k263aXF49x@gyrQ1Su27X6z*tT5EH8ZjHn5fODNr))9j@Cpa1 z!3({}lc0n9zHwe`GQDp7V9nxl2DtR2ToMpZZ~dXc?e*Rcy68}KsFVw&DzWbS9mdv9 zQ1n=~pq|mm+68|eD@0to?MWkYTlU+xQqqBo#Q_n;H$(Q=4u_jMX8rcc3&6vf9MQRy z#^{q3(OKRNPNw#<elYYe`pHL43yIfmvk#_T>)f5V!M)E`l<trrLb^3uxm5f%i=3&7 zhT81vt+-VLL;*twkMY*Vjh@0oKZd-_qqL~Jjo^DePyUo1(^NtRV$m6DgUK;mRn#vA zwtRf7xSDEY8f?trIiEEZ-$zj5K1W8xKf3t}dLf8X`6~7?+8c+;OtQgprn%M~Zffcq z32cHt%~X#)r&XW(HD+XmizF2&BW2NyXFnSj(RszC=0SoRLQz{1)TsPpOgo9$-2qT{ zAH;ztF)gCgNdIA$8_?~FZo7<1$MCZxquM=w3m#ny7mve9>T<gW5Mh=A_QGpCk)^Fh zg*!s`tE9yq#}1Lkfjpan=VMsOAHoa%kX@T2+g`t3dHSssmHKJs^LxNQ-$z*C#4&_) zp*33jywN-^;c!zhv0N9C8T!THe${sqp;i0ZVXKZA3*r!)FjAyA^f+@9dxyKo623~@ z?6DZcykEcj?K5s-<l)V)ZD#9YM}Mk5_(8-{%ec6xR)fuFK79BR7dqtz%&_C=%kSSE zi|w#S3l4k3{1q6iJ~tYHRNm;8P)XG1AAzn1g&phaLi1wT<#Q=C0;72I5bgz@4Obpq z{8*RDr5=8r@N+6p*`=yO3`aGEz<lXUU70Z%c-peVjBd<BE?59fPxPX`U(&_9xxDqj zDz{Z(Cu5L?h4=QWaI|i&JH0J!vc&v?Tx;$0P?fY0)IifmVK$tsHX#)d<`}$~yh|Gv zzN?JO8O|>Z{fSamAE(oNBckqU{PB89Twjik{nCp_XHTCC!VxFbO|8J)Z5JaHB#uM# zjnhPixwlyi5SM^~Xt2!9LBwej6&J&861cxVbTuELC5P;d{?`EZc#gX2#=}Gl476*M zXf#|W(#xkpTJnz_pgT@4mPDWSTPJEV5wBrH9w}14+dac1RuHdr<l;}yS7Of`q~fET zO~+(_Lrk5gv>TUAi^tP1tsrm454ARfLJ<v`t^lLCX3(U9<@Z&3Y6XyjHfHG49?uB+ zK`O%IO42Bz?w6#tbHob3Z`-06G$|5)^ts<KenWgViek#pHSi4JLjh&)JBa+S47EeZ z?Epfi_<J<rT}>oyi~X@5J{-S~2@kNUwDxJ&xl>06MfGB~0t6K#$mif}XGpR~0WVLW zW=8{%4ySZoARH$Se<3FMR3@cx9F~NHhz2@^H#$Ajr8AKq3fiA|!IxaxZZ9{l1r9NT z`^_JrQR)TC(m-3W11KbFU5t7qNGk;9>cMx$l47Tn>w;7Oo^*dOOSyh#UD-O^eADb! zg=|bHbVDKFlq5>=ZpMz>Wp3p$Ydzw*pumbR@F}ANsjs#N!HE>;5e1lGzMn;Y{XoP) z1uz1^zc`VRFxXHm=U_<#Y>#qDv02xg3cchUOlM)hXV=y=fJtQg?HpcBXEemUHj~7= z42>Ko`VUq5KSt@*%lE6=RA`9sdm<L~g^9|v{>}y{P7AAfkZh+09|pvLVLbw2Evtwf zQl)&<Mab)bg(?*o9UGDBw8eaKj7~KDNBoGGXZ0O^Yt0q6FCz(vJY*Qm9rb0@Azr*h zyHweBVX6G$>~a9qRfgJ*V~gji@P-{?sbMhQb|7UqMf2g0p&!N;0DIJWU$IFiv@}1o zYF4Y`YqC7AW^{wS!6&Nof@j=6-A&13a_yev9_z=;wBCSB$AeHVosqh5?6BF{joK6u zjr_G9QeK#Y$@dlM6dK7xK}049oPvV%G|9|b^O5;cZonmeC^6qbR_wH;zw*MKlyNjk z@G1Z}7ma*T;5yZ2z!^<{m-uDGMH+cHMMMa`dqXR|6h7#4w)yfyn@fbC;a?O1c&j_W z2~4C8pKgBAsnY_$<5r`y`3+xcjN*afNMBw)N#n_w*pJDU#+vf_HZDPIbT>-T$A>Fw z_(zTNZPsGEI0YmrSF9CmUqL=l&fy<G%0bxR8|E{FnU{k#6?IYM2sibn0xqJf0e2Sl zn@Id(yH?~uy3us@-tNS^V2%j+Pm$q^LIT&F1w*NL5oB$_Qm--r*x~dC*!hO9O2kUI z&I;-nmBHGrKPyOv%lozWRJo6-pM=|dSXHgP(x6$M&V!ZDcBZpaR29PE2ki_+q`X`s zeeOt%<dsen?s<&qNz!$t4`i4svFbNyU4|ozm|rT+w^|oQvS}AsX~9~ipl0*6mc=L_ z%AqvQ$ryph+*oLV0)eN}n;pi<ay&nN`aDsR-0=EcN>XbEQqflI5Q)z2P|OEIZ%O02 zPmdpCoel-fIqXSMzTIL=ll@Gh@iiga$VjF!SC&5Ny>06r!$$YC#uCGIkeIviQix`Z zuHU(y7YWJhGO-28$f*4<#@+%b&UI@R4hew-cY?bI3&GvpHE19Z+}#5S!68`CK?Zks z3+^(wyUyV5+;{JDKG~=K``4`+s+fYQ8hK{Dy?S-`+RRfdh1J^#!14R{9$z$c`ipJ+ z=x2~vcc#0ZSg>SuzGy`WV|)FQ^i6w+ir3SWUy;X{iX@>>gBf0FDqee~R1}tCfeq8F z<3h6=lC6=zZ<Y*US;jk~Y;y)h1w-6c`_U6A1(&9z@$m%G7)5zbPl!D*UpHuWOE$sx z%X<@`&1$sfH&lF@qmU|j$$uQTqd@CsYjs%d%$g7y<L{7$*>jWY_c+Z-aE*q%Goqeu z3R)OTW=?%pg<YPki(9p(ukXz&%?2*J(+iQc{P|p%R>Jz1wDFoJ`z@ubR^v0rwAUC^ zw#Muz*d_AqI{CK*%Tq!#CS9Xx=DQ6)K5w7I!J*X2IzZ@YEqM2;{9Zr-Lr50p?;9C) zs9W?CC$2dy%n$TI@hhMI-3#W2rN<SuUJ_`H3@DwLxux2v`Qe_9H{~=;qB#WM@IUO9 z7g6$V>Nj~@(K8b-uN)GOYUQvbG@p}fTd(hVPr1Gf+S4~HcmRpN2iLgNdFa#OzSbX9 zQpXT07Jf*eya~8Ke925HPX{pn<hH+U&R)h<aWI~p2+-1PHm%7&&>$`P!dFEd+P-2y z1d?BkvKo|T4%s6s@UW<mvfE37tkrMb$|B>?99*t1+na@`7?&R5%oudOM-O=3d5f9T zJ{|{o%5?AFMvcmIA4@mNHFLe5YlR|)ZKJZY_0q3MWSdUnGw7{1Sw&nmA~xdz=d7}< z;-~1Sbj^}xT!t(EG5q`dSpu6Qiix!Wf-vexdPuXj537~-;PsT7T1~U41I=@2=Rm>N z*-$IzkRf~}Y%X)2T7MD>FPD`wcl7{9^umAxoe$~9uZ3KRG}cq1)w2kr>6cFhnJgzG z>Zek|6-dN;pn{ep&hMykRp*Q*%G%xRu$3|~<c!|B7*A11k-q?+XdV%wdl^lt?U9cU zAai+mR?jYmgK9Qu?GAGc)%LXyx)WO?f>&Cn_kpe%DZn1HCP)U#*l5#TpHmS7>>K=a z<^`STy~pKmj$F>4oA0A~(qNRblOuaQCogS6%NKw6)G`ls^J-nux)|U05@hv@b(T7i z%+FVg)>xoorSxnyyu$?<O7R<H=oms{Xyb$ZTS?7+1sz^_@y5bXRg*+Rgt;|3TK?m* z@B<ZYDUUX2?Mg@h3k_TmaWTBl;S%z;IT(#(BbcskvMP7zCPPaNmb?*sRA;NF3Ton9 zCPny0)8A&TRld0#WUkx%v>-@+XAZ<Td)Ds~K4eNttyl`Re&Frx-g+uWt4S>;n*m)V zvKZ(#m5X~b8m*(jf^A%0fDgiOi!IJ_7;yS>xb0&#HsL)_)`R)gbV-@uyVn4PW3k1M zuhGsj>TSoje6L0~feWrt5tqNl!b<2X<uVBqXprpPk>~I{rDQ2G-?M<bb&r!wiW>V2 z{@WQqcUOabmKy=lzJr{^5EFP+2g{Q8u_irLeOPa?o(-lKj@xpbALu@2ZA%i7j`qMh z0$~KL^CxZQN27X51lg{(k>I{p`36oFK!am<8UOQ#bWjEL(c`>cn9f7)Iw1WRP^h0I zbC{z+?<bsFn5^NCho6ZapHgAQbo=OqC7?(mE(jf2v!BH@?6PGJ+Vtb>ZK-wTHNG<4 zEKDjArhcf)IsFr3A|r>qi;D1JrS)E7JBAQkfk-W7{7*N?e_yu)7SRIqLg`UXs&kk` z+!IMf8o~0*Zhf5!dsiZ#p9>W~nsvS4Bd%v2pxp|m*KZS(44--%czBTPue-@;2&NXi zaL_Im*f}4=*)KL@iaHyRkP1=yb#NjAe4R_%IVcWUqZq^Y%*aEKlCNQ`eH;Py-_MNc z&Wh->HhY^SV<j)9wT;LM-bh*0Tpag&yxhI9Fb+b-&k82<RCqiJ@WQ~oX6txoa^3FK z^C1Ng_!XgTb~X&fw~8m6B8X9iMBZdD-NC;_e;K>6r<zf;>ZCH7%z-a>s$nnbC+2w; zy^0Mc<0mPed`he9N&<wyTm&S~J@0S>a9k~uTy8hy%TIjt(FebiN4}Z(g%C-op53dc zNg9(Ka1Ei7)*$epIII2@B)UV&J%cNYj=-n-4w5Z8C*U%UTgbzYJ)U7g+0<W@z+^Fj zzA6hbFT(Bs76gnQZjf#DC5^LEYHrpyps)C*Dy0ip-WKZ=eu!&6RyPa134b{neRaKD zenF1+eXT$q#^qjg`5IJ0v=u~;5=;AVxLl2BC0}uLcS)An`)Wyu<TQpz6ua-Q?zQwy z1s{Ofl7M71CHIwWO1%-2jkC1*>XK7(^;RiGs}am^6o5vsQuGBE(u=w|Vv#6wHi>of zjN@W1I1y8bve4Zx5iFbz-m7kPW$YRGrDTo^G;I9<*PyV3y>xGWdJcPP=aLvDbitA` zX|EcXLkY;?=0Xam*R(Pn0nIID+-0L?Z5p8YiwyG17z5v+t5wL%*vuE`-y%Wzt^r|; z3m1zc*uq4@m^d6*A06WFA4SKtPV95%Puwabj~4}P4VH3hl`+|L_tNiaub+AwqaM=9 zH<0JG`!-(4S~aSy{`UaKvZi)!N~=QSPz{Cm#Y~9;-f(<9rL?SIAN4x>L)r_TH!K6% zm9KE^Pa+uK-xe`}gf5~rJQW{lR%CM&ctRh;g}a_fcXwFb=j$|z_T}YvmD}wiYsG-) z#O`bRhx~GQV3=UiGdpG;tX1eY`cQ32<$FF24?EXF0sT!-3z3;B0Mt5cD3#1Vnqy&y zem;J%jyQ8^E}BN>(37b~+ZB=Pp{&2Y$YFEDauFb#LXvdzQ?0v_P$v-~PpIusaY~R* z``UT)UZ>@(Z(yqG8)U`>hByvU3*jnTxYG2qK;`3U(v7{fPe`Y=9O(*gz`HxV;=GIp z1od@d7vG&mr6X?%9ez9gw(8h5G{T)HiivZ7e;XV2L6x9tqi@B<XZAw^`VKR#vS-nR zagLL5v;$hM-&6VB{->zGmVR^h=ht8d`m(qHj3BrMpReT6n;6M_DT5!6qrsH!-r-Rt zj3jNmf~ydc(NAg3(r)j;(+b1Wue%or4cfH2UG8^{Dy$(&Kx|N>#<_NqO+tjyfu3S9 z?WO7uGhc!JU?|^Y=CzGq6g_9gYL^AKG?B7g46Khc3PH$Prxm_gi4;>((&}2{`bY4W z-E%2KCT2b2)TZV9BE`2+4mHjahBLVntz@csJ_-9`OPIPJ>%Job@#*&x%k7zwfU>1O z`Jp}XuNkkvYt*y%b~QAtg?sESTdsm<S6o+K-bBmjHkXNZ$o!`?T;RAWK}kV)KXSEW z=5iFfIqGwuNA5zmA@7Houx7KcgN|6)jl5bD5<7H|$Ow|t(icXs&*;2R-aW6!h0b4| z(D7}##<;23D;qOO=mINcaES_M4`YHu&}?%^)G*vBRt|Dd)du9fo0YD=w_H$o%C^>i zFWmz!bR7<%@97v)r~WxXBo}zoUux~q(&vr3`e;B8gimgwvh=mHI!#RtKYX`#Td7QN zZ{F$u6C$u5Zc3~W-Ek32Mp%6sof0zRy`zwJ$9~rt6yAYC*HNd`8_G3jDfp%LU6eyh z_$Y@bw|-z-)z^_C!@g*;{O^e9g=B+|`(uBpzt7DTxWj>%F3Y6;RCQGI)wWkHi;s;J zD9lNl_`l(T1}xb;Xt!@k^Y(+6m}e9-XJLDLC`F137nb`6$<@%is1fr2A1TmhjE3ou z&N8ar?sg~f0*|_dc!5t3U5h&wgz!&_@MQ+=a;eepGmo`|Gq$=;Byp}d-~GZh^4?S& z+Pb%I&#SebahRIjP=NQ<*vGteAOH5mxO%;<?U_C0(xSR8G?-46Pnk|Zxdu=B7#M*N z`wrf;lY7+zlzrUfM^=gLDeWh)6#4llSIFJM`M^p)qo;qrUJGvte^x1?w4Y@AFC+hC zx$tM*f-|>g@l`Uhz9>>nSC7fiMEd9_8)}LThZUdOLhms{6^2tT7K{TEo+dW<?yW;& z!O49c(A91YNpA^uko#$x@NOgQY;SY9@N-tD-0R_QB=GP~7y}gK28tjo<%OSRfS+dS zv}3gY?D+Gp#mOJInPYW6RgV#<=0%q~b^@s7((_4@Y4H5Yw(_If1%2UJGE{;MBSq9^ zW*gGyeWH(q37(9)xe;%bi)r(|bc?xYOJR%RE?q8w>N!d*5)#kjnNHWQ67S6*1Suqc zP$i?S5u^2c%nj?0Yyo)U+Pls5u1u%6_YaH99KQOqff=-qB22%%u>xJdZGVYM^Z1j8 z^@0Xk$l=gQar^}?0v?a&@o{1}0B$P1<@QFvQ!J(!Z#Y%nU*UPgX&+dG8+$kOXsGVz zckfEbZ1S?$V8XmV^8~TOAY@K#Nh%&%kI-sd%G+96vJW(YlSyO3nwo!)HGzkg7`+1Y z?Zy%a^+v+35m-ZXQaCf^xJ~8FM~#V$nq?b~LNro1ZeIGAZHJz85=s<E<>_Yv*l!Io zSVJ&S#5T)tv3Ubw4%3QHgCx8!SJfFi*O8*+pwT%|ql&d;_o~Td52uz)RaRoQk2Jra z66=k`>^Q0juCl3(FQyMRnh?sLZYB9Tw<zhbtiTm*$st0d`PLM~yV*i4-YWxlRrezE ztD7i#7zRu$n|Cd|b>0NFn|qLav<5Cy(N<Q+1unoyaJ3P+A2stTImZ$7mE#r_674Gc zTi`XP7Xr};wRQ|Ux;?14NEBn(C^y?K#lmlL*nNL%W%}(x?nrz_ksF~Rrs}?i#2Sr} zpcsBK+pfHo+oP7`(Uh&o&2qgPV?ew&C_5q?r{Ihnw-nZtk;YqthFf;ofZKSpROpLm zsXW@lseV7PUV5&9Gxm8WrP+pvma4tv=lbCTVqFN!5c&BIeCj@<y~!G2e8(wUu#5=% zc4&>_Wv~RXtvSM<b;sBf$5fpoQVKAndj;t4KEJezWHAENuZ?>fjhhOj(K-F``}_29 zj+ivFEFBwL7e2}fLI8Q{uhsR5vk^VozS7r%I>SGaH9f15jC<2-);Xc0OcF%j0w|am zC!wyioHY4yh%=LeWM1AFdS;)M$~h(sCqzOzJ4ng))z$n%J54fFbn_(rYehR`qduTi zmA@%_b;)buB%z_ZQt^jlf$g9Q-&)4K#_>`44@S^y-nbQ%H*+DKI&(KCuPgCb^}n6O zqMJfwThptOiDY%^gU}hml`XAVyQ1ghNX>vzo<CUp)0s?9emXvpJ)fW0I8^<tLL4v% zwB!^7%NV(}7SCw1dU`W{iLIlTCj|)2?orLNGnSu*Me%ZJ(84*nd^I{?cJ~kl<cYbd zA%YCi)k+NU_;bMcBnxt+g)I`t#Swlj(~Fn%Fut0~L`m~{#ex!8PvTxq+RM1lqKvNn z(N>FfihLR+M(t<=inQM-8Q|qRLjI`|5xK!^xI8|#lL9;3M5pd|{ImZ5kAmbMmOwi$ zcsoUK1#(YQ5NQ^p=W*@@L-mqPMat<z9|n)}DLwPzqu|KuX;1ry^KM|B82qYgnZUML zr_qss=NtGIjY2g&h_~6e7|u`M_E`j-n6JWjC$BDlq)7xy=KL{Hpd9Iw(8CB__1WZ< z>`e$M1&j|lW5Og9cFUAchHXB{2yIVA(l{MO(^e{rZtkCKv4%<vs#DsYuZYa@;<i|v zsYkfygeeWf_Dq%cdL5?LNciiTBVl)!)*mzdg`1ot(>W4m(hDamp_?c<!uf}6PQZ}? zoPa4@u3?Km2)S(mm*Ph?K8duaH3RLbiA2Nwa+!6zULmBe75~I2Qr8$e7w`$dUP>YF zjJaCRKeeH?7&0;}qtO~t#nuXgu{(r3j!F1NiAZ4+K~zdqgO#KNpP-kVnQ;+h$EWby zV@4v$0RndT4~(F85z*XqVRy8Vn@#rwd~gLf<wq0|wsyc!KIjH7J+wTw<<*=cpOG%o z7W~)P^2^H@(wr4gOC2V`VyeLSJ_VyeUdbvz9-SP_7jth9f&f6yBT9zm8_k^-Md!^+ zgY@0v$zfJ{8l&&*6cKKfY`?eLPv6}ItD+Tzfoc}_N*@`}OLneLGN|%==~YlLJXS39 zq%wWOWj)tyUcZ0=7qfhQuwolLV9v`9KDl$X-e0tDJ3E2oSUMNYW>VPy@zJs+B}WMT z%XFoEdd%!9wuJ*e8I&CxuLQ}*FMcRRP#MKiwCtOBi!-z(BGV>!t$uo^><v7v7r(Pj zIl@LirA(L(%VRQ3vh&hKQqoK1I@<DKq5&&FI?4aczm8#o39}m%2BlflpXL(-?p&3& zpI;`unt2S6*Llbezf2A(%_OcEo&ksulf7!;`xnh0)|Tj4K<c~ow3p!EmYYP?C9TpT zf;bL~#<?n^{w6zT8n(B#ClQ|6u)64eJu|5yIii@$S+m;B>5jE+zCvnpk;_AxYzpr_ zAil48Xij&z%e<GOT4@r=nE*73IE`o$YH8OYENJuX>)Z=$zM0eSwUcKwn&z2`d`wme z2a}qYA|I@D&(GyuZXaaBMm2vH37s@fu-?}plGSsHj^X~;5}PJl-z4peiAdGibWC~6 zt=gcP5!5n(PfzzWkepq4aeWi~e)Dr^XI7IE0-#ZVH}O!^X!D21{vpyz(d4p@!%R9G z$^yD<K|=_Sn>;t5d&f#VnLe6v(c(U$+rX7ze_fW+6{vc+*O@HNNOqu$17=GzFc(T& z!)bP)j?<$n5Nc`VZ5^HSeJzHAc6Bp%j|N;mH+Vx@=fh^QW!lRB2ug+Zf5b`P!uEHM zrsM|{_Pem_J8{==7+#r?TSslFmpT6EPeAO@7yqmXZzHjOB=B4Qp;OrFM@eyhztJ?5 z7p64>$P@R*wR}YByaa1^dz6%2$@Yw(nZcPTF;!cVtPB?uGi7mnIh25Gk-PQjPpciB zr!02WcjZdVXPKTAJx~?)tJawMmbnhhv)E2N&sjQpxl{0>jQ14u)&u6zzQI&^)kJ3b z<(k!N&dXc&xd2-)XG8D8ORpI;C&Ryt=dPv3S~w?bH7ieKfDVWsnrrE2e7}ZtMg-2* zqPJrHZKL@ghG3lXo8D9oh7azWXy9V%;lOG5f19uW_hbH!?_h(sGXt}IP2p8Ev@&c# z#~s#Bpp4zb#G^t8$Pr%~td+0XoKs6_+ZN|@b2FcCwSf)btG<IDK;(1HOKWtR*Y(5$ zR&J(9lfsmOknpvn)M=H$A^mS&!l9q-heQ{6oW@RNs(#UY0>oi|(fmbfwJD5a>9=$v z>6iI~n~HQzhCKf12<(+}EF*d~;00hK*!0`qu7Q>&PubaD_HNtCLaZI=0kZ(Jt{Nc! z(j*HB3#adY3Yo0rI~=p*AC{y;daiX4dVGSh+Ns;j6};uNIiO5@qsqg`7<PyLZtH8J zjwo9YNC{_#N;n)nlrOBxk2qH->mxg*&a5<9ey3zutVH9?qv>E;@}0mnSZyCO$Ozi^ zW3Pr$D9rANvpg;^h`z;ZTJG-j-d^y4NvlXfEDh)($2-20a*?~fWD5BU=Fv**N#?9f z7i*m)wW<3Z+5;JGc?+)4I{+zYWzz<rpq%2tO#$f%x|f7gJ4&;?FIHq$uN>t+Rh)A6 z0sp6Z{<~Bot{xFR2hg))(ID}E;$PQ^Rsu}6Hc`a9g_6ZHKFchf9aPI1`8-ZrY>xn< zA&psjt?dn@vhZZNvJ#;K>JI?g9d6DHDFKE_tRQviU9jA>Zw^=r`lWKWOBAQg<LKQ8 z+5Ex^?mj$)k*QqtPcF#<z`hT<R+<I>l2x03|=>5+~|F>(pxk8r0%)RzZ6M2;G2 z*T;g|EE(A&)xi@_mq!`r6XkJr9hgC6U%)5X6Rl$!bQ|9*@Z$O;YcA(yiUqKm|4_cS zvXY!CUo!qdc@yZ<V7E~0Vlia1+<hzncG7Bb=P?`93r&7GYY9oZ-&-1JE%Mz7oG#p0 z7GL%Wh^XHmt1p!q{Dd?OMsjb>xB2md;6Oio>PYl2|2UAKnje(0x;fJxC)N<!*?8Qb zE;)JWZiAmJ;q5U*JS3n4b|@%|Qwr%!f(PqL@6wm<IDeibt9h!Q)m(YPd#`k|yX7;c zR)L_|kjfowlFVK8+JMhpZTqr5!jnm5`(8g)l=<d?rO9Ez)t~4<cPg~g%U`=(KeL_A zCC{1eYR`(vs35Nz7O}l1MGF9U`l#p?f8fo+sKT7)m6Tvy4$@n}SM@k#ecT)0`DAxR zpEHmYZ6&yIcjQow8H9*JJbWIh@`Y63#C0X2*WJ`5dSF>4XZ_fKb@gV&HGvxeh{C>k zMx~zW-Fx<h2fB+(0BtM|BBOhLe?SgU3i;EYtyEvVt9m>lb)lA@=t}Y+N<9tBOmy=S zbivp==~1+4**6C26sv9K_so)eHMv8@a{Sso6)956!W$<`!PTD8>fSuZ=dV`9EvoUO z7gNn<0v%e=T-3ppJ1kJn2TKNdeu(_MA-W*EmnR_0vZT6PQLDsNE1MHx<rBnh&G7<| z+NZH_w8E#@w#-)qI)nY<5_GndpUgu#kqFyoo2$6&{{gH}UMgY!VYX6}xj8yUQRQKX z%GmGve?nwf;%k5sX6QlA%wC4`%pJT0$>mXtfr*M0aukY^PrcD^bql)6Sdo!;^OuLA z_hOrfFGsgO`CtP57&e5TBIHA(`8CS|9+ABHXd3M=H+~nNai|m>(roeSx0H|8Sx~L_ zMpA%sJ5MclsDKNQ0IR49lEGHgr=M^8Tp0Dr(kP2W*`brl7T0A4MQHY+n4ZSj*i5QY zHFAQCY%YL#Mh!C}tM4W^y8D4n0;f!+5^LGn9<f0yu)lwoAg;Un-~H>(`VaaDx3Sh6 zte)-$uo30N(MCI-nC;t;5FXON*}Az>m-Wuqn*L0fLCwxT7Fvk2uAtLQAB~srXC5vT z!f+TGo)`g_N^BIVqokq|kWxRf6Q}&F+z1!*u3N4d$5_o7pO#x3ke*Dk%kmSKLoy<3 z-1C9f4eU_(0#In7B_YGlqBWZi#A-@b_V70PXN0p|0_x>fDV3SUz~MVU%^GjDGzY<H zb`3WKeQqO?{x+J}{w*v%b(}b;#V2N#ii_ri4t#Pbf`d11Vq!AI*$#+uG^$J)!sL?G zG~uGrgWG@v*9@#l_{khvBz{4_ck+!X4TJYP0EvEuyeXV5Gs=Ah^UtMPd<HjARk|d+ zO~Yj1(4i(4$Dx%Ap+9h8e$Wo-tlFUhPpAQ0lScf64e_TBu0M&3kl<&wv73uSVoj`- zUs*Cqtjq5zkGEhlAC}z+42iimE34oA+hVB8HGv1elWQbwwcl#S(o2%dgumIM$vZ>Q z<R0YxlfAMYd{$`*IIZ0;sr#PBRp?~PKv!Xsd^6dOopwypWUB+J{jLK>x!AbH_c>}K zq$}Ubk;}Ykmubgaeo>d}3n@GQ<VLA!4E6<z4JipiK}AUCTjHTu#e22%D)))x>_r|d z$A@d8P_;*UATt!NtSiPNScjv{?~#ys)A@2L;PN*Mak9wh_3&-6S`V=M()fY1?p2(# zyEh7hUQCn5(Wra8-;=rRzDXLajc2a506Qr9NJpVr+pll;7*XM~oDv-YmHzCvWCJl* z(AyvMHe})zW<aBte5RQvckP$c6wY5~Ac-K<W?e|>Vzg~7a{AMkUb_&F6f=lQEiW5E zx#`KM(sGBt#(e}QnnHT_y`m<6l-6BpB>htLta?1ZvSBnkV)k6UJ9^|pcaRyIpTgn^ z)f!-6P4@2TdBG|$SDG(|hSxe3YB+eM0fi_nKt1Qg4-UJf)Cy;9X`(d_E?V|}g@vG* z`CpjO)p=AH`jAIEQUrxW7H@f7=f!#1ySjlc=xhbl_Ls6L;ezI}sRqIeUGiXuZeE}* zS0c#1(4lALX@VTdLZA*ZCSalj-0X%cE?0c^W|nk92WAi$Lr8nYck*eYCeRI*cOi#_ z@oSQm1K3It8^M1-pI-p<f#m!;SzaXoJE##0PX_<9G5pJK{14Fcue;Pg{~U_p{Pz6a zua!}>WvlE79#R_&`3U9$$_(`z{T8R+SLwRSOjk<a$l#qH-RAUZ)Dk#R5fM4sckN1; zm>w<R+2SL~ihu#x&NZ3Sn#-$c%vtLb9n$U~C^+4ts=nwI?+0dSMoIXoNTQiZZX-qV zUv#2xUca>kTxkz4>`9|clJ#RGF%J=QOk=u3S}KPA(joZme6kb+=JKgZX*_lbzGhhG z85pW_EBU0BT6fmt6_`Dy!`;qQy3JmkJs&7$Rz_DV7Z!OB$5!2vzN>>z9u>%0)vwTA zcl~SPQAV#G7+!v%MTt~z=S`<st}2f?wn`w-KU=c|1qQP~#%G$LuP^yJarZ5|*Hpes zP_}kxX4_xlM;VBTT<%{kkwRwaz0$!LFH90|fL<e&@OGKny~PKD<cIyFagH7p$PABJ zUZz9{R!)&^u*&R|Uyx-|u0GxN9e=bh+r9i~+vE}tsEulQ|HO0!Yu1<Q*5?w|THU8n zak0^>WRlyi)<yP4Jt@>8BZjgO3q6L>3wYCx+&N2`1dC3;+WksgY5;EC6zIK8OZt&O ze_-~Y6kS~I38c*NcuL>|SOA145+5+^mu5NK<!VV<a#u;XH-JGfg0O*_^mlKyjFwrt zX6ieyUtp36>?*wd)2f~B<gOYjRd(M<BHyci(5c*-?6rqwt(R$K&ZwJDCrscU`4zQP zde$?W*g!<9%;mUG&J6fW|2<=X?)Xe4mFe>pbE8_5o-;0bk(-%gahfh}u-Ev;gu^GQ z^xZNEi`+6UD<|@V9mbZEo?87D(qk`r8u!qwf4YWq`J4?)=abYRELyeZqfsW6C6^i_ zSn1F9O+b`V1v1cxAFs)!pIe8rS3)Vx_wh9HJpHF#fGUwx<2f~=Sha;2Uuq#ZLz5ln zt&K@}aTl8kqF>re_GFB`0(6ZNb?rjeNpjow(rUd++xC252UF;~BFMJ2Trw>-h_4|A zu&IsS4!isgZ3y}8eK;r?-S|U1X6}|WftJb`RYdFgfs!N?bj%(RIL)UXvmm$+SOr@= zzgdejynEdYz<i&8&_4gjHfhNX7Oi6jTtWP&FVA-oZV!TJpSa&nyGn(0>g}NB8w}Ak zU1A;u0^&gvVnrcgqipi<UO^G_=tB)pPx0>a;oBk)j38B3qO5~Yk5rEwFkefP+{U50 zTs1`_wQZn2>9<J8dI26YfjSjICLd56v2YaEbM-(<`@mAmn;UYZ%`CfzE?JqjvoX5( zm_)Cw%c?z^1itv5M8iI-;?}*GLF7XUwX3hMNF?eZLta2EhU=Av(wlv<OUfqnJrz7} zV5z7oVk;|urF6<K&<(^^(~$4Fpdss*mt%y6MER>^O&gW+-CXC&L=C``Mg$2(eOQo$ zQcJd8lrPG+?y3AvtPw>Dh@7KJ-~t2it7tZ$8yVsnI}6LiZcUdnyu;&{l`PL!Js6U} zL4aB{7Djk-{L{?;hUsMki6RoD-R(!6us9AHb9!&;|96G@kAxN;@ijLpBxEE@@J+zd z14*IG4m6%u(J$;nj&VS54jiS!KGYNF(&%gjo05JX-3Dy1GztG8%WSSl0+0#<<S1AB zPS1DrZ>`pic!KDKt^ewy##NM))}uQRqT*^jTkwIhw{5CiI9E1qrbznh!k925wjG~o zSsdM+Mxdp5C@&JW4`Zd<V{E4cR2|wz-d$mSjbHBF2)VDEaR+cmMbwTuAu(T)c;3KO zIzT#KGaduP^quJka}69)e=1z|tGM;9y`@IyBAdQTV9q?57fFQE2pQ1%4jt>@VSk%1 zvCiiTV+f@1`F4ToboP7XIkO-~ZW=n(V5y$a?y`^Nd(+{Khj|6mGZ-YrKbbG+$*^Uw z7scQ$xSGp;UKbZ|`&db~0oKz91QOCcQ;-qSY&oFtGlz71N2KS+wuem>D{l{KJGgcp z|2?A>L1;ZM^Nv@3)K65hnl2M()~!|TIdAD*H5KzWQEQab1pM3LfnRfZ2R)+F8sAud z?s#Y%wA()0hU&{zKqAA;(|yx1V&27!Nc%ickO-5uvx`Vbz+Y}fB7K|QSI^&Dc1K{^ zaK1&topwcL+3}!A3tU2r<%i$A-E_xary-{9bhuFnp^vylA%2Kzy7Fl5<+59d_+T2c z6EYhN1SK}I)k{R%Jub4UTgEU0b*{inOcCd&wb5U**;)#3QxFDkkW97H1c!^wF4lIn zLNQ!?wS@XY2SoG>uN*xvu-Q<U;|2U6r8g_M6dymhew_C2lq9^6>V^yDu=kw3wFD3i zP~*#j9MYnppXp9^Onp6_ao?yme69^<5Fb?oxF3dvi(P(&h1VH9G^z?BC9~(+nsYrd zJoUo_w3>{r3tDvR`@2Cr<ql&igKC*gj0>Ti1XYQdR_K0NP?KlE9%^B2!v#u0M^)OF zc`}%i-ZKh$o6WyvHOCn!t#^tY%Fn8Uv)?>-VOn6vDclyT<X&|p%tIN*CSz=o1ygX0 zCtO5nm8qQ01C^7LiZShnYJ4J{e%mMkH2Jzk9Xce4Be>-14;b(YB@@R+)G^<s)v=OV zPrr_XWPdx-zoM}P33rYdJTa2+hMlU*?H=AV5;(7a1zG{G3vW5>IBm%!gR7BEyRK+} z-xBFX=;hXvSm$3r%R7+d4ZBD{u1TUI$sg1GF<9%X7wLapbZmKkkY(rmwr=ghN4mY1 z^gd=nVmA-_UTgBq-n$8v##2JBlU*i(g@|On?U&Z`MT_R&yw%A(cC!UU2cG~>wWC<@ zW7LEhOZTc|nS<$>^xp7#sa8h+4=A5{^CFHMNQfWwS?uxbI30)qU3v|GJsLv6p=->; zTc~s7PP9!f<=de-wY(v@TC$8BE+(Eve-i29BjAIO{Aevv+e@f_(evoC?(%T?mIyTE zabqo1e@4Fu6x0aO^=DL6B2L<+$-K4WH%eQK_H#dujjPQ^K2jUgy?Bzh1^UhM6BUuD zX(Nw6L}nmr6wn@!P61F{#qVP)=EQ;pB<L{0jVxiM5nK~m<@LKgXy~0?hH7)Nz)x5v z&|(5b_(Q`ft(WYf>z+7}qu~+@wWVgY^_i#Fdq+*X(M_gzBiBEg3IyF?FvVem=3r(9 zbenZB6+9A~H6ltr*{s>~3QUrVJ9%h#;+!nwrNt}IUT&HSqnjA56eIBGxT_{KZGCZ^ zuNX^Xn7M5K*=ib#zNpWYr8x7Yz3>Gv;2t|C>Hi!1<p6J|4X)tF8YobR>eXOV#~u7# z#wM9Rs8mSFp(1fck9#|^JQM$v`sReHezqKvP>jFdnZU#6x=v0K6`l*C(}Fa;V%ZoQ zi3kUcGlxip{8ttL-^r!6CXP}><MnfTuFZT^@w!o~S5Rn_-u~7Awnl}Du{^8uBo&f) zJ~m0u*SY)S2}riI24;*P=A$w`Nap<=fCo)xzmdJLo0^jp3Oc%}{6dWTQ414ZK9ND* zlBbA$>+TZv@oaOw#{XGJQ)$>=3^NGQ;28H+BO@Cj91!`%xE;)uQPRuDn@)jvol{nP zy(@4T=Ks~3g4BVfV8P27dy;?90xcT&>+G|;g3$|uYmo67iY`1}c@k1v#Q<ufw4ZPH z1k*jjKA4RT!=Nd!^;5;vy^mzaK(ZIdrzRS+(KN}@#`Ufhx=<S!I=~5D*a@bqNa%J* zDOa{ZSS9F?_yI{Of(VWSF-IB|IWpBto{$wFjT8LS$BrVFz1s*}@!{%prfzvzqgK}y z_mL>3_En5rLh-o4bwh~0j&_Jgn{yu;ZY7bBqrvwFpgCW8_qlHHOV>A2!Hk^YPx^iE z&Pz3pR0dzcPBCD~LfOe3tLgw`e3tQon2dtUu%GMXm_NJnS-~gBzD8Ln5D0YP>At-E z#MLUbNoqsq%OoPkdx}4%w-dQgKJ>JstuH{H7~rn!Xtr<0tV);|(&GV=NdFR@dJ#0` zI*Dze{G^YF3Nj4_7LPlTE>|XDWMRUu`{45Hd;y{=5L6K%!jc%v=%!mhN&-Zm*@_BU zZs=tDHNd9>YEU3kdgOAt#7>LW$i?~1kQ#9QN4Y>3$W2G4+FU$f0)<HQt?%%a8PBFq zYT>@q$CmqYm@Dko?(y082vs^GxB(oUNn5kf9nZQmGLfOeJ8rF?IcoaB_W)rz_(eU! zpUc*z_*%=Ms%@=r-%)Cjvep~p&9`5Gig$c8*J$Ea{hmQF&qt%6H#=-RicfHYc@QJt zcG8St7#>J9j6TmtFL3p}Tcefh`OzfCNxE)Pd#MRDS`x<Ns6}pfX<+C0ow2N;8ryYx z$v16&mmkdfRl~x#J)~kD0ExjMro<wL<6-7DQ&NP4Kv49#!p!mooj=#9>jX<kl#kCf zl04|WCz31LW}2wR+T81mi2&60LYaPs$**}WxX0NqHOaO<(d17Cb5F*yHtX2Ngbt{u z7r8jt(mL!|yf3}q){MGo3>V3K@4l-S|AASkz6=5k1$fTNVL}Td0pDLzc5Cf_OaVf4 zO*e)(qf!KZUX`W}s=BMI%}}})IF#DqU?!*RV)Q|b^or<9PnW5)aa0R8!_$h-Z<K%B zQkfhBW>Gy?p0BevG+4uYcw|ay6iZ;{H+3NoVU=bqDv@C`$BIChM8e`YR*;}$(TM3n z!4v_n+NDMPUbR~qTT)tXih43$d7-0i`aQ*=;c4k$qAf>=6OMIv-yxqp&nXUQEs{=* z21tduFlt$UPBQh+ARNppb*BG4up1HxVv(m{gxq+B4SbTCwoSQ3J2c>s+&;xy(xqPc zxF*Y}(ughnDT)rM%l_`5r_ibo;`2->>eyFTe6C~^p4BuOZ~KU_O}_$fFaeD3_xG+O zaok<_Gvs4jZaW#8ylw-Fkb6=e9|qLRK$I7ox;)pLH^&`&^3N^!V(b@)+|L6Ua7K_u zZ10-|^(Z;c{o=Br0^lf*c3o4@*h_%g0im$10bAe(TAz~(jMxX{kv0H3U4;STRkj_o zt@hAw_+U1n2$7;5WU`|w>oBFAgciG3dMz#c-79ufb+HSu9<pXlznCy3n?u)eaX<nK zku8Er(iPtP`aqh~_ij7Dt56yV6wh0H2G~Ta!&j8bt6_&vE_w-x0iGHjsv#WSL@v-f zWvK`1mXGzc5m#<x8$^c}e2{SeR>OMv0z;c$3+LcC4WDq<J%Ek?B(P=xTVw?Ama$=m zYNr&Jv0%fHj#%@AiO|TJNYhrp@jz04F2gYVA6Q#N2jefAGUU-)aqsS<#QM0grNDn^ zWd8$(|JPk-_$ML><K3I2-v|MEaBxNv>sFjrYN>UHElQhHg>iV8I0$Zlhhj@y@Idr8 z?!dphdxj#Hy?gP!IY_o$6Hw)w*n7j+?_*c}K~nz9A+#vX-4FKwxb|&sKFS&-j^w0( z^So)cZ$AwY+A=NaxY#vK0|o={%mGQ?-szE`AXpB@14OvTOZoBzj`sF^f&z6rLe%_g ztd2Wv1`_6SO33eIz?4`oQ~HDv1R?HLD#6C!RL@he^n~B{8r&j#tLiFRHXho^=JbKK zW(dTOF1V6SCn>QOqvQ@Jy8q|tRXmgXQEDK41ccLSBA)Q0&4G|gX^s1sUDSJ_6p;tq zfp`XNU}h6Okt@&2SdT+Q89~G^g}InZ`8T+|ki=<ge)I(fKW53Xa_#TVd2Pd&<#>6E zIQm-|)N`w#qDRuEUt@5IG4JUNou6d>F1gX{yu4*?JAlxi;JvC&^ok|fVxf2{PBOZe zy~O$;iIhsOz^Q8Q;o;>O*b$u#&M{wY*-pY(VQ@hAP2X+73#GM@fxAGa{5}F(_1v*M z%DliFCa23m$*8h-&+|@af4p=%AZ*K_E*-VZ?z@Zer7}R9%e-9gN4U*6877N5(25ac z01;x}#Zk}-`iAp%f<@?BqD8VZp-E)2Ut>S{op9IjSB~JB_5R^EN_(;IUjsWvXI?Q- z4%V`x){yhkDFfa+q=_x)z!>AiM&ws5N=#wqAm(b%BR1MFKl4ch?crb9Il9^mlpE#G zP12v++@SKLsqm)5dNF|fD%39J^V8Z+a@fs#gpQIgr|Z;;8KnhbY~hz*@omPxjSx8D z*b`3xs*klF&UJj)hg9l$+N!@2l@H4LH{S7c#S}nX!Ia!z6q!j^2O@E-GK|Q#KbPUo zRlMxJDhaZpo7-lg<+nGUs5VF|lf01yI*+En>E^Sa@5<gZ@+bN$>h1cX)Y6175+ArC zn4UWkyW(Sx9%2nz<M{9k`cnd=BA`HA4;lS*D6RoRqK3I7BYDvvWsC0bJko3LYmwS! z@iaNVl@50I#pjYRF2^9)ZvXKOK%d9~z`{%MW%53xP<&IPfyGPx?XShNROpqk?smbT z(!Cs#!4(%k#a@o@UD)^iq-iug@oIcg(q%&GI!IuL27MvC^yn3k&<3L^ugBCY6ldgH zRw~!_B={yBl!rm&Nc|nF^{drw{AiC9>*8Z3<`HQ(f>|qQ>647FSltJfO6gCA8|n`W zK!&<<4<293c>C5my62n>qfqYqIvEPJ-&`iaRlmMV<}ZTL%-*O`&}^y$1X4g4-$%wT z|C8(TFZ!@E?1h~{oY)qV_}={opj3RZ68OJI`TsA*QDp56Fq2(NO2$J7NJR}W=?Pcg zWr;2_4nVo-wJx979y*O_7h!otz)FREAR)qXZw4K^0OY^wra9p+*iT`smR)zQCSvUD z>=#Snta{rCOur#pWd0R{{VhOt$>1-F?-L*%$FvqnTuB!d3DTf%Dt9xf_605V^}ql? zwM$A-BVJ8H23K@y`0@T~B7@^;t)O2|qI9DBAs>)r7;ZUsa&K`&eQW~eCJB8+;F6hA z?F_0|yler_b6skAj2}QIdLNHsmUu9l?p3VghndfJ&L2iel?4Wz2lIal_^%MBus^yJ zw8_Dy?L`z*YE^Ejq|qjW$y#=`GMKdOa5eEIv^&rd@Cj0L<?)!#-h(Hh6M)k2ZIXDN z(yi?L{v}or9v`thhUjAqxF>9~%fJBk(CUuh+&vX%H^S%c`6CRMwFC3(tn-h}w|1^~ zx}<<Qe4)v#8sIYY8w<Q5brtrQ6$m(bGw2X`tS%2eacEANwu-vb7VT_@bOHGt*%`Er z8Q4vrE%h83QO{eR963<RH;(=bp5r^`3&l0Q$l1Br=W2J-6E$3OBLDRXZ$yR(O$n9C z*}2F_))@<MXs@A3=(ko$$(}OyO4?p(!Y|w@1(ktexXAQ!s+ba9$Cs(*zs-{c0fotO zwR`#X2FHWjE~tKZ_%@>&*v>fW{dH^6<=QpN*@SHr5s}y>q}FyZicwtb+CSa-t$`i? zwOg?Tt8T-18JU;sLb?Xe&9CS4&^sM7;^Ig;hURBe<weg#gULRWyFcP@d;PAGTTfPZ zAFXB}ev9sVpZSklik1KDc%tt9F4up_btQX2tQz(uAII12aAAbTD`TDeI!e!8sXPSb zwU+L(^H{5GG2E+?EdHop7Ja~?O}!e6{n6@RV2|GNW6|KaF{dT5wSAOFmvaD1M(4D) zwEtbG;9bA)1O+b1wZ0_@Q^hLVMT!gYkFXu|46$n_ld1%-$b|-6FVApiu5yJ(yL_Qd zEQf{p;Al{Sp=HgnGOKeaC*mD07hRic2KrvrC1%~c;qKyr>~T}hs`Di1bB4?Ekq)eK z^K`#kreuqEcTv?&a}s8AJ(+%efB4-Ww67ISoDlWBVno%yLd&3TVBE~Q<#IQpSrfkf za>vfDWu-a8a%gD~*bV+s_m@sh-zU~4qG9VrX=PNWV(K<r*TRZcAbv)#lKLEud_It+ z^?}hp-5cWTCXM1x)l~`}Q`pnrt5i{4?eP)*aSl$~x)HOPcpP>l;yShvbQc;}u&*mO zGLE~OF8<v(EtpYNzUnz%>eu)U8o_7zJ}OJ`T40O|dav$JoHc1?C%N<qd$oquu(jt( z;2t+a|N3<DyKUa2Byz9hOWWeI#awK=$~$JQ&a{&qL9Q=L){tM_hbJE81=uAkw@_PQ z$I#AxW?dt~`Xjs4WA_-nOONUcALAazuA3#lrwx^B&!lD{a>~o4OAT1l2!tiT+joOy z^ws7{!%&+ulV~FNqYY%>u3_3RW{QxOlQoTZr5C+@=xa0e9}CNUEs+(sWu$&py&A#8 z@aOrxT~_7daKWfa5*mz!i@Eu`1MdJ~Z7QEg`3pm~L+8|+nO3`u%i5J@kR5WKzwz<Y z;}4hPo;14f^_m{I#Ae(e^b@A8_H!W5pX}sMsOw&J`z8O0-0A}q)P7@|SvtqJze}=d zg1c-OMHOp)>RGV;w0>UYaF@uk{@~i4;#qe~!;1&O*B0$9>YyTfFq68zv0FaE*8%xB zC+1f7t~{MXo*ppyG<!V}LPvp*VcynRyM2NMd!pUzTC|?>PH^2pa-he@FQw+l*!QaW zkFLwX@$NT7xcBMjk-q0g;xh$i`0kIVM5+ASRQG=b*(h}#6o2HvxR%{riW{#_lg-1w zD%B8R|Ga-}nk;|X5s#%s!gnhD7Esn`r{fitX!wzunGVx!-j#dNtbX~h6tjzil=gQH zYmWx&%NU9E$)y9W2K-nfM|JMF?*LCSKKV1n=p-KVyY^lemy1UhIhq&FlreuI*}Vzz zJ@REmkk{OaSOBSi1(<{nr!JeTS8Pm3hYIb34LwAtAUKl!!aP;TIMwMLeiXWIV`tPL zK^i4XQd5Q0djx4L>l%?Ub{+LTw|CfAL<<bTu5;*p=!XaRO((B?=kibl>*4tN3smVR z6a5MpHfL=u%->&L<SM6;3RO&UYZFD2G`p|;5q~iH+6V9d-t7)RxtUXw9Y@-jaF`hX zb)y#yNb&atsMiTH8p5ozw>5UlgMy(x*-j+UWWtc&EC$ci$4+Q!Qx-3mo87B*&1w&u z2Uc&1{H-o}aoBEqBZ)r2xJpY$n~1i6YCbAh>E{V2*slriCjj4c?XdgSont%RK7TF@ z_h!+@QeHD!d!dwJ)m!nl%@zV~taaKQ*ghg$Yd+5Vy^3KeAp-xuZ&oO9G)S{a2DzbO zA`tjr9*Y&C;y}GJ?nMGgy6Xp`{lW>~8bz>c6Ph2P;rlr-M)PjMJrtJ**uJxA2Q~U4 z<0ld5B$=DkNK1fzE=#BlsWYvn8bH5)HSjWAUyK$D?%X)8v>jT~=eF^TfH$0BG_}fK zzu@&v9-+)U9G|snOqfXBF3$TBYTK9LQ8l~jK1OCc!Mz%Po&_G~rMPXdoczjSTpnN~ z=#eFlQa1Yf+!jcl*2AoC6K?zc-Z1UjrP73FV|QdIy&=KfobwOnE)lV|UEG(k&CdZj z>s5SaT&pyb+C84t7&f>g8NRs9Mldd$^;pnMdCj0-F<43sJ2rQw%y1jq<Mc(ehNHPk zz5h&ou?bgCbmiAeC%wjx=N%|L*D3z!J*3FD(edrO=$<~tzh$<HkF}Ueccad?!_DW< zf*K6h9e;cC$M(*YsgDuXA6UuANyXY{(Ofp}9caO9x3Csz=b;Jm$cJFL$BshT)byY5 z-ICSqbu@OPw;y_oN=6oJH?ASEp6WKICFN&P%wMTu-pmz9nm=d0jA*vH1)DS#&s1J6 z7ZvI7y2pIcTaL~p!!n&1<KK<YY=UvyS<B-qxTc-A(;Wo!;W5DkUfJCcmpc~M?cO)i zRTmXh8bLX&wn=r_`UHth9yx{TgfH*kpI<Xw1=lwsQhoLwT=IO^zF&dGE!VsvT*-`R zc)Y#tPIl0y{nfkiSG`y{E+dEPO%+pl9l(a&-_Mt|omGkDF|S%Fk;l^e6s5A*Np-?S z;j{SMn54?K+H@%qa30WSk-1)cLAkV<jN)4iZ+rLsDW2dv*Mo`}$%3QTO@#(^uv>R` zt>dO(?>g$u$y>A83mQUX8dt}s!h$4szP_Xn8YkgsB8YRHvVE5X)0OQ!g7=cB-dto* zRcwttGP+>)nrgH@@j#YEg#|OBCxx|K6r#sDqq#hPeG=$~DK(CGbYKdrfSMW;(s#ML z@e9<}&~I--{_7SW@q)#*7<`g1y&atkG&^QZV{P7_fc0jF->;<`>6peYK)_P4NiX|} zq2KQftjgQ@1l;}zUM(yWHqx;~-#Y~=Cb6;4?DiEzY`#TnK5Ppo@g0uY{-rN`@ikST z@#GnWaW)2LI`+><z5cO1HGx}K=@D&$?6gzVtpeksBT3}4MK;>i&}LL65VHO?$*ytV zEtTgKhGO7qwbkr9Z8@4Ee+pkT<kx<9MO0dLPuh00Kx7*xUsPTaYkM!pX=pamJm+UM zc+Gq@mKBUz6N=qdrDxZcJvXA&@;|TfuNV6VT}C9dQ<&TbmH8zl`Af=*4y>CV*68Yy z`n}!y<3@ksFJx`c>B<W>Td`%8ciV0E&r@_REP8drKMj3zl|xoP8(VZqWQM(spSC{0 z!g^eg))YAV$xW;!4lJWjw&+@HGS$o3WFp{}{MVbSAs7HBz4W!T`Djh+dxr7x<EDgO zn}wDamJH>})n0RHkCfg`Fi*>4V)kU6*pGi5tA-EvjHapEdR{NtLpzz4f%#x+Xj?x? z4>I3iNme*?9?kj+7wR;iO0<wQ$~oyAs6b>^!;ro6AZ{>4r^g>LK)WgB9T8JnVZQ*` z8M#%}o1#kv`L%sDCm76x<3}`8be==Ie|vdiM)oUa3yEJ|$o54bnH-POTpoz;E-Md( z=%JG<)`8b(&oUqV9`!OF<h_v5WD)7dhJa)?<<XJI)o&B*wx?3z#r8$VTGBWg!G4`0 zK}+txt2*#Yfy>JVoYFA0CKx{rlJ?3IY|@;AA9gTlvmO}ac5Bw|u6)(I3O|g-ca!h7 zCMsMDENPhAPJ9w_`%_%rxTM>t>Gb?~{5*&J?8yKesl4G{Y+^nai;Nfn&tcXmC*|z2 zFLF35716P%6skP4jwDBd0zD70@~jnTM78xj;dqO4l|~CM>lt4T5|u|f6a!0gw}va8 z)dp_uj0$_p(H=J*T%h}O^FR>);X<*xGJh%BIpa2Q(WD=%<c3|@Aybb>?vi%Um4SMj zeFDAyUV1|NKhBVb(Mvg;vbK9E4(tG*H$S+0cQ#qcFbksKSz0Y*T+_5vouNy);UK4l z<e$&pA{~QsI_tHP@+IF=Cyb}d@t^KnS~*QTRKGCjz)O(Fz0i79vY46Myx3TD#5_Rk z|J}0Dd1}zi*>(gvCHRhL*bTRl;_1d}FRDD^Bap<Y+3@eD68}wPw-l{j$Q%7k@QdqS zG64UAIC`65Ie9acs}wUin(p?gJZEtC(8GJ|;XejU@0kyDDISQVD%)Q%RhPpPmH)!R z>W`%#miQbILA@Hb&;Um)RI)$DWi?ol#pcPw$brY{XZpj>SojwZ9Bpfi%KuokKaY6u zpek-uGcWw019p2@4>%7(4SEc69gOwLC+qzdfq$2EAR$b4*HfEy9)xYqU&8ysC2N=q z)(|kqYV(UgS<w2TBX)>x6v1FlnLhss90%pS$R;jbA9%OW$z?WGAq}%Y!TKg{Ku`6% zyrIn^oECF3(XEvJKqODj<BeLr?*F<(XP&)Xi>+al+b;v=y!xK^$7#-EHHut^wqruT z`+KwcoXf8Tb|91#72`^G1TA?jvK4E$r(*?euGxq*{dH_sH=DG})7@5X+iL+k+QOPB z{`^GlkX3j3u=~ALcQ19C>Fy}WAz1$BTv0;tL0Yx?^FT~RF(I}V=*pV`%iY=5h@rQ5 zl)tUXZ<SHCfsc$cCG{VN1V;)eGeM`Z^=~w|U#>@1PTSh0M8DaR&zvLbJ}1d9di?d? zXAV>P6JX02LTxo2F!6?l_SqinW+YV0QoN*85eVSBO#Sp}`Dc&&1=W%9<zQ}|l_xZ7 zP}l^eGPP`z2`@bUukuCyaym+c8CE^^8P>9$^~s#eaqE#q_9md@O8+PIERwc?;1sJu zpkFXhyqG^#QO{z0vIQ1;RfV%QPb_Me>zZlnyE$qZ5m=E1ybtYc$RY|YUq|MnJrpCm z>z>a<_U%kkIbNFZi!dHZYT(+i$d5>AQzdAds{F}{Y&J8l9yJ3=8c(dVAh`-4I-k!Y zTYwN<6^7q^pf!+wHTg3HW4BLqO^z2D%taRfuRRztu!HQI#;k|ZC-Q8pKZkA_rR=L8 z$v%gEKyS<+ziE?2;xvbb?GNFO3*E<_F@C>YA=RRV(@T0nBT!PH{;zWV_e-W!xrO%# z)xQN2Lv)&8&8W<(4T`BVPnL7Q{)k}-oeiy7I|JMP*So;B$DzY2`Le;At{AK!<lu~O zbA9`1PDcj2vI!bGl}YR%WZp9O1xs)KEA93QStI2t<1RZzv{EE0<oPznG_3^m%P;ac zWp?+iRoL!K3vGj><%8&RFA+=1R_lQswhq#R2LJ0wioh4K1E^7Z6O>)}ui`)D@lr>% z!K_$orp}h%dLpOr{&~3P>T#-&%l#;gu-$gy1!lo0d<E1RbT?9}WxMjh0A#NBxKjtT zjfvC(M#XQ<=Q(SKppBcw$x-F+eRA;r2F?YB@F_KiW<<76>ef>&ano+-YM&}S>hwN& zq>W_oE$k@Y3qVZc44KmWcI-<5vM02681G^^e&8y<`Dpm-?>2<LzxVL^Q$Fjo_OwXi zc|sQ>dHLvvC880JDtV}`7q5+QpxL%_ot0un{q)8tcE8N|Yec0wc<3Q~xd!FtshqpP zPvX2a;(3CMR6n_9P6l+>G*peH9bMlMEr<(l+qmti>g4PGAKKnCtjV+q8{Sn{1O!|< z(qyTMbm<aS5CQ2TAksv-5PFA%MFd2ufP@aAE4_st6p%>o5E80@w1gr(A@JR}yU(M$ z-~0S}-+wpZ2uE^p&CEIHoHMhIZP>NU+Er%n#>tO{f;0#7W1w#S=xkNX&(2aQq{^&{ zeqL3uB`f6XgogtEtc2?vmzHQSAlS-%XB#S@p&$h9zpoHOVEQ{*xDw1Mf0i!P!Feex ze21<%juyeqpp#<;{;rvU-7ZeWr9`ZtNUO6BXxp<B{pPiRX_L2*a@B+N@zRnz?O_P} z55J{>AdQeyQcYCl=c`(&QkB9PzzzUIAty}Ds+3LlLlb16U%KPtiFXDX#RkPmeQDCO zhUJ~JBE1+Ndl!WO&uW!O#>vBNIx8a?A=}K=4;gWhb}On4gB|(NQfp7ZnA%EUy%qMk z-;UGTsDo6%zLN>-apH|)eOsY)NVLh27qD}K?S>t&;7|irv{B#ZGi8`x&vos(P6uPv z>ElL{AuAC)eMoh6v@TO2;PC=qG`M^5y0d(%DvTlNY<sHRBJC!Vu&MPdM0(7&FEvA= zEY9zqe78@teU589UeG%8&Bp|+$&g#$_FU_NwmdqR4DYgl(yC}x*cENs+B-g?bb1qT zj#s1Fc0&<5Ju#G{5;>A(gxQjH9xr+8BK)XgkbPmD#y!Rex7}8G0|O#d_S?03#CUw^ zt#qDlJQ~0silB%d`o_j7^2jEWog^Wrw)%)AP@#JL6K$`x(e33rCmjm#RQ+p7`@#2{ z=W&$uY({(Q^8*jwdMu^bWvm&|pO6fcTVh;fvOYJbmeRWiR>dmyi+tQ#^c|9OZZ-OH zM7O}u#+zD?MSxk?hjN?xEGpjfL3T>9bsD*8an<Z~5X;|(x8vEem|?_<Dp1`#Vv(DP z0EyhZTcSJMprJZTO6<}HcSfzAG)ZP{f0fnA&U!@~npVI0;S8gD%%#g7K?;{8fXM@Y zgWf+M9)ixy7Nox?@C_0E>0-9p=>&?gpVme_>ZBGF_a1)bpF45!7<;9H@VBXAIQhz1 zWE((OC<ZxaOl%ueALQAJe0#I5%+Efh6}KmA+X~Y5Di@%TX4a}Iq~Zi-_JoiPIr@lh zlUDw9Ea`V1y+e9wy{Ve;MPsC^1c&vw`tHk*k<#g5kO~XC{)%w_&gy%&DX=AQ)X$uD zg^G?Hy5{@^3q|2Hgj|;uCTN9yq2lrfsIG^3l+|Too{Lm~R7-538181GWh|?x5t~)q z+|_6sHi#&r7hE$SoeH{=777}Y>kpS3UkMTae3TO-xf`b(kj_RBgTvg4lv9wS@Mz|> z1q|-Im)XICoQe?L6VaXfKV%3G<$gBJF;s~-i7ILq18~vpo_#!a(gtR+7;kP!ys%_X z`=~Oa4MK3TRb_|NYt%THI9CBAWF^+QVdQhXdE6tfDK`|FkwmcVC^fBY;~*_BNVzWt zun;QTmd)x8-=u__OY}Z&SX|6HJ$B7XzncZv$t1haaTl+dR!(<(zr^$hIrwjxdcaOS zEmMr+rUJOU1^OA0uhQWBMJDNB_H<%bO494NjMF>1)GMMbq`!5roY72JK=+!%UO`&9 zkIq`D4bx?02S0c?{e@jTiHUF6xn(a2F#rl69Jz7;)Fbv}Z-s6tUfscE1X0U=P;3Eg z23IJ$KenOx1O*lACyDKFc6O-A@ucuuQL>jO<2A$wo^~!sRrN2|fANj#G6Z@p@%zBM zlES_yRv^JyU4Y%=sikhZ{-(tLL!1WqwZ^e6`9eIK2#(APgjGFN+9&qa&CJESuM@*X zaV-NJ$VdZ0qe-E<DN8cWz(2q<b+Hrk>7Llqpo%VGu1wx3<d*3#0aC($XID}|8-Y#x z7*?n4&%J5XaZ`TVydkA;HIUH7*C<@yyvxzNwgUd{daI2hbw+KbqzA&x&F_fJm`4^Q ztH!kqd+O`nT+xr16<j|~c|l3%;{xPd^44>A#sd<}SFbMwo|FeEIJD0)zaC$rtpZyx zCwMmVp!hqf7G9C2!mzK)(>D)<2<sTImHc+z0!dlB?POcF{`7<l{IxDY*(=QSli#`E z2HH?*tP`C)em9{6a3cFU2Mz4=NJ@k6xfbC0oyeI5&O&lizE4T%RkKUXtzb8&&|VJ= z4pQi)XE{Mv)!R1ibZz865DOmNUYeMEhc@Q;69@fPap#J_$>X29+5+$`v0f_`uirF; z{t}-!=3E)>FoLWzvhXujZ&Uxta3@(UXX~wVqu?~9v?upl7<pYHJUqr5@m9Hyxm%AD zvG8o=@M*JtJ}NI-ZXC`bPT@5q1uj_)m%6`_HC(buspzRBj~yM#@<-%)*W`kBZTga5 z9XBhcyEAylm)>)#i5-;g=ZHa}?Jq;(uJlAx6LS<jx9*S=DX@A0=zEtfUIq)9u=)c_ zb;L9`Y=9Ai&kl3n_doh1U@t*U3iV!bP>z<^X?d)N)>8{YTr2+GS0%>$B&-MI=+atC zu?G5dq1)Nh(?L~f(SbyElge|gE&9C9DwZYG4LxP@lb2wFwYF42b`m*<1Q?0~EWcTm z8y&cAMkLO1UZ1c8GE21wjqgk2O<SP~MDJniG*P#lzGSKP$Mp=iD%)H+VaMXT7*^7& z^7;2_H%_LH?1<J<Jd06;6*}0Q?0}rlnzcNxK11gmbboaj_mRnhx_wxjZh)hHQ)Iu# zDz*}sqJ)ul=Do)gf$-|eYw<s*A*O?O`K<yqhy4o3F28u?d$G(xY_=nRWI$$;us=P8 zWRspLXf$xQ8%VX<V;%K~ux>HS*(q>lm^1L+Yze9q%T?TgSh#)sI9{eK-$X(*Ii;I? zyk#_LJ)(sJuz$s>^XXlqUxgCwhDoRkRk7128`XZC0jDGyGuk7zI$BSf^(K`Y@UNRR z3T$aSnc8{o#W|mok8stM&@t3_>0_dSNt5^Hvv%kDkGwh1w9Yus%#~|hzUp-%tG5$k zU>E5x9kES>U%oxaTQ#<$$LcaQ$uINS@+Z!qU5CMhN!D^2AHgRB>gzHCc@b^uF|gga z^%sE%nzGOhA3nryAN)FA);R%Nd27d=^Bs98tqhi=%{k`{J!XeXeP{Y-SdPj}AbuoS znd>k*o#R?6w6`NGzW=<>={9n=;B&xo?`-DA00Sp<>ow^pxU~Q*kFRL~kBZeky%BHX zgSIp|jSDuifN<l_TW)_=+5b$LvOJxK;+Gd*JbrLlCx&UfVLza9c_7a;xn3UVP;R|( z+_VXu>$j1Z_A5zKG!#AM&+^6aXN6;F`ImvP&(AKhy4_XZeK_ULO7V7wgv5^(7iK{E zS5Fj&T}fY83v;J`Bd;w9I)#pZ%$VJR1fcLiRpfMhNvz1hoeOfGk_4uFB9Y$R*ZG+Z zuLXUAoVFZn5SKa=lzza<ceDL}1@=GeVK`Hxze}8cU!n!V?qCJMu@uuqt9QdkYOJoV z*3t0D;04eS_ZY%&Ol22lMTts|DSuY)af|mGnH+qdw_;pqrOJPa_VnFo%vj2$yO-|L zhU&O|aaFOLLPxX4>v0<=<3%H+M@I%4Y<aGZWJybNUkrs*Ta4<-j&kt<_DCP|0jZDK zbA!`7onrS`1?7S<%pp<~%U3Y^Nr};*BIT@#pfzI&kZ=;HMA<^5J+Ab{oy7K3w{+8V zDv%yzg+?Bu7N`<^E+|n{7#4%vwY0F5UpvogQNeZb7l5~Un;V3XI(AUDuw?b;Bef+7 zaV2lR45gu1+*08LGTiOC=y2`FTz9@ZqHLZEuGb$k<a<u|NJ{F}Tbv3Vueo|G_g3?B z1Py~8!_=6x=sTY!s5Xqb0)WYiM&Xbqpe~;7?&BJJ=hjw&ILz0?cES|W5+FCV>rQqT zFnBVy`YiUqPr<@)FNB%j$J!;@jMv#su0y|>&>HW3jgrvWi-4>7LI9`G)K>aiZ`E53 zdj%|S&2K~0<fWEvT##g6gzwN(R{4F6fJ4q$%-5wJhy7w!?s+@HE{i$LGjo-Cg8XPJ zsxv#o<@4|#Kbv6dW}%MNYy<Wzht<kXr=){@!FY4UT|O7vc(jD@TSER#^)Z|s@Oovi zqC9%W-!V_&_(1jTz8Cy<!iFMW9I$4z&6&-+SSy17@#jF1)|e2v8n$<HL};Py4-5-? z%U?wgkjFpZbQdHGC$b{taWB#8EGXY$KR)0F@AGEZ4R0$U;u6><0&ulW?0$=u`wbds z<T}m4-KJi9k4$wS{ZlX(zbNvA7>@(YbOws$G^;w1Ik+%D?LEoBM7VyuT}H%Ji)9)2 zBnjbD;YQ4czqI0pXA28qiIj$-$gR&GP68GxQJFOp7VI0uDWBOEoE<<u0^`{x_mo|F z8@qk~;t&o!aI$tZ_XqgX;&u<MgF@3SUd?xHKQi((WePaa><*1+0+uu)u+uk2fF-qk z*Rjxz+oYh4+tHi78p25Ng(fk4jdqbeaV5*M88Ga#0PKDeI(`J5{cOprFuk^`R^Pfg zquA6jH+pJ0ciXl5dTXT+VXu~afge*^H<cn5%Ck)Fc?BlWJZ5NuanUBc**yKAsA!#g z4-zkyboH<J`6uoL2!(_{XhVyap+hC#N9h}}zvHVK4V$!;0W~s5RfGxLK<x=0BZ;sb zb3b_e44B9l^yD`FogklXQ%R;g;_AxbJLWgH|NINjc!Fz%Wqni17@jR6i&GL}fF(G9 zVZMxHZQNF>5=!vblQ>F}^n{Bn7R4ZOA|`kx$muQ(Ht|=D6iKh5$vU6z;jn1rZhLaQ zG3cG0e1F&@bT02Zt2D@qlM20oRJp^YS5(C93~PbksJuDey;as?Isci-RE8XrQ)wTL zuxG=&xebP%tdQ}tWwr9GqNI)ms$<p$EmTB0b2=kEvU}w;cWtsX84GB3;ne<^s;*r? zmmBit#_gF&!yj0OtLK_`g|s%;1B9mc%(MXW>y9~(V0m(Wnj#%+>b`&;XsrlRAiN-T zmR^`F(o=5g<0WHv8?{6%C6SzFrjGWfTC?hWX8dNy%Sug?!r4zGumM>LxP@57TH?mh z4#A93?IRDxDdErx98f22<C))^O?3aw2w}DnuOia4c)#xXQoK88nFa)i$X9GdT6W(l z?2J|~;WTe6({39G-(ev)YPcWo*SQCy8K|!hq=S8a`qrw73ll<ShNJ7MxW7^<{9%7Y z=N?wUNAY(f<#Tc|ylg%<3p2dq_pt7iFl%B(3$Z`oA+hmF=0_Z0e_WNnlE+xC&eJ0L zeIiVHl7y>wf?)S+@*uGaKGoc@a#Pqi`vz<EBdaiENo0y${I;kwkcZl4s&{f{RcO1L z8rkHy!ciLa;JBS>Bo8qoqLhicp_ftEbOjh{*t5~RZm1ZlA=1$Or9WkT3A?Grdk`Mc zFclQar<>a@Y}Sa*{;*u1Ceh0~J?mWC^9*|w(!XDPVb*g2d=h*PI+t9hL>n3jU|G*U zvFz<}2K>R({;ZF#0KqVIARey^3?MofuUEGU_zMrad3294fH}{{1M&IL+O#su1V|C& zvNo{*GR4eM_V1Wk1ng0<(3JjBrC%81y`8VztkC!X5)TBmS9}yMP191|%}rr#dp#`& zCm$6bzNaaY{%<YwjQ$ROrUQ_EV^AiC=il4Zo4Y@ex7Wsv8e_+tLoKszMV$g8y%-LH zHq@v)DcT&zOKNJ1jRfx0$L|MqZW|yr4)4#-Sg3~-vHtbfi_V>^*M3jY)@WFC4t+I; zEjSsNf!23Xnrk8KG0$L*=n+i4xu~7#c(NcW)%_NzW{7NC08S-${KxONDZo(?YuTz1 z`wU}+&D})Hn}nQB!BMdokUg+8_XIFC#g{ggt!|_tezWjk2b;T><a2^Nl}5R5)rd*K z*u@%fmYi^lhxg>QQ75l`dz35)60%JDgBMvM8qj=%3QoklGGL**Dx7+(5Se@E0+DAO zId_Rg%bo|9*?iULm{CzI(eF|joE{j^bL<$1C3XI{ND#~^amMBt0Wj8Y^v#<$lVweK zCo;B*ES)RBHrZ%mYz+n!;W75k0KhY+)e{z+mV!oxCnL73lFt?mE1QScCd%!kXIzUR z3x+1qf`Hv{27db4`+YEx_(sshqj*Cr^ER*Z%ggLW2cet#I(hMbNSr7RNfP$3ZE;aM zADI?#{n*pwUt=%Q4P^R%H4ZomDo?6bWl;aZg6Fo#9FnQoQ8%SnsJQB0ZL3upY7$Z7 zws3FeVGn6nVWBr+T4e4qNY=kIDh0Z<C|K6m@nyi`36q6y!$JFvewc+{B}~Lez1H;g z5rMS~QBXDj&{Cb{GFM}aE)6{0=cM}tpyYDrrH<IP>v=|Ip<jKL&EqPcZjrYhy#Y5( z{}kZSp%$<>-#Zp3AxD1oW3NP)FSA_NK7+&n&%!S+o0E6z%ewE*E5*WGSpk~zn_Vqu zNbs}}1mmBtkCrBAub={*n;nWI-Lsae2jmn<PtI?&@<g<)cpPNmY!wv=uI&xkh=A09 zG(;(WNR^{*zJ2zEtmAbaz53*Z1Ui8~QDeAV7HOu;%tXWg<YpL<9iE;HwoAENe^F)? zJ)qO}Ty6rBp;^mYS2;w#$~;`U55l6d^A>m&KrBYR%Sj$O50-ZzO(XsC=t>m3RrS;w z)~J57quzaNQ)DOW?F#h1dnUjE=ZJEYeT}r>z@PZGjGwroruXwrqD@u413^GlKKsiR z04MfM8l}Gd4k!M|-~dUI)29nhX+s-wMB~A)>zT&m7UH1*=BlAm09yuWXS}{}nH3*J zzAnQ`_=AIYH#Ca2RC#t#TXrp0$~jL}ixr~R9tLVp!?$}g>sWNaD`s_L2;pE(`U6I4 z4!hVj8CPah@Cqv?J2H|S@@wpiN23C9?X;cxF+211L#dG5FrgZK+aUW98jnjh=;Rto zh^Z#?0J?&D;aaug_-Lq@W!Bch?KK%-|1NbKK^Y~z%l94Aq$~cdSk{(x@r|OPmJU7N zYk;m|HT0aeuAVX9!{>DYimsrq#cjidRqG@g^hBwBU|ck(^oQ~%>7}Q@cTSUbv4xpK z;X2()rxFDN734tevm8mlfP8}<I-T3y=4W%nf?L6eRqK`I{uDcyxw}mmH5Fgx^iClW zH=?5`Xcv1UzE=XHioBicX1|<Je?gIrKLA&mhHseA349>p>1MMc*^UE*68>~_e>C{N zwZLzEYH!BB4gzf$<vESL%Qu7I84yoCC^fA-@9Fk3{_B?iUBiv?yT;|8tWj{c;mN0b zg#CO@4e2@MKwWf`cjZ~)VeWUdR|A6S_TEm23UA<<L_YnJV%;oIorm%=0K_r=%`dQz zKJD{PZfZJ_@F~j;{2>KM$_9&mdAkY?4sC@CPglH*jCUCOz*|Sol3QMaPe()?azqh3 zc?q#~rDRS^(te}ioY?aRiYrT|E}=XWOdf&m)PEr`-Q}j)giOWA`L>Q}#VJ3Z&Uc&X zr}L`Ez5AE|8df|KyWu_S=EggVS9Su3M~<v0!7m=Hb$v%`UyqOqD|6>@??d+MzM-rQ zE`GPA+jVUak-A}0P-f7F%%F|X8Vw+JJWmm54m_eLwkR(nI=Zc0RY-lA&Y|}F$GiM{ zEpIlU;cjxgCH7-T`49X3?cq@G*O%(_oqf;LJU>!OS97g0@unWL?ghK7=*SZRDqYX^ zGDZL{;v~S9CAIRz>aq<XToPR06?PI;$ccdq)kwrhI=yA}9_N>=;vB6Al{{{jvRTus zcG+jG6}#v)PJ7YL%ROvR1jp>(oYPn#f`R8o-9?M?IY}@gZ^pHIr-N{5$RU}ikhWB) zQ!cfap6nW#yp_F`xQl&A6cgA|^C4#~oE?c4p$**}d({^6TrpAiM*<`1Ct;Q1oW)}* z{m~0jFYeBl0g)FT&hfNGdUZ)SbfVIo{I>*TrnQd3UP-i1#Emy*YYjY!Kux#}*s}Z7 zhcwSYJg%-Z4xj6O`N)q^aIo{uw|a4{v&{f#C*9<iqovERBw_NsE3mk!RtpP9bde<{ z%)r^gf7OO{!%)-q9DCGqrcaVx@C92Q#L|r(qml}r+3T&Jf1?`!6p+;>AAQ}+gohDI z%PG{JN?f<wWx9`egt_ciMn`nKi?1Klp3!rvoDip3oit}ar&IZOJti%S6OuRf&a9`b z$vasKkebtjjuL0lh9(Df#La*~(AB-l3}|Q9c#VU8v6&$jz&efxQ=~trm@8^Ce7~0C z7h*w`#0?T<;hQqbdE?#_t8>Qih}RPhV{w&jUoAL~!_TtkRljB0SKkm8j0bCUW+_bK zf?xiM15D0Va4gKaRibjQM513SYsRH{vXld7=&5*s`>-0$dzpO=*eu?7cm9sB9vV`h z_i8$5#VQMOP@_ykRD8KVnlMn$FmAEqUiLSj3jd3h55*niEe|}c7j=`~sPB~8l0OnW z5DiV6R%Xb_kNevs)E9EFDK!}b2lycrn+-rsRznC~_NVMD(u^D%!!A8SPKT^6lewpX zH}Ua{w}YPm1*cABdC>73_knKQG&od)4SCX-=F}K4`0CX^Y@+WPU=yj8S+_L)mrbAt z$veK~6ZCu+CG=omp0UrNtSQPV_(2*u;BJ?Tf@<`=%UG<ksaP#ussi<F2TI2kJ*A*2 zdL2%*QVQO_k9kG!N=TdB*!>oLRBC0B7|p0a#Rwxf+#j6-UJ<8|@6)|Vg<0TZsLxj+ z=m*R2G`J6shC^%asIowJ;T(<j78Rk;#CZ)CF#)GsAg?IMkXkFUGkv5?jkUaN!$X!^ z5uNI8Pw9n|*bNodyye}aVy|L}de6Wnb>n-Kn9u)*#_&6V{3c{^S40~ai>M4f^{Jpj z+X|*h`ydrg4)qbIItP{as8}(%u^<OkcCX}G2P~#D>ZCW*k06^Sw@18>H3l@h(!`^o zaBO1N?4%cvgieYi7{xt&W#F*TEjeNCAY@Wo0T2inbI8)33{$aL69OpRbRoReivc>X zrPfv5P2e<eQH)jWxYV=Pt(6dpuOHcmew=STK7!XEuLMWf&388*buP;fRJ1DjhPfpI zIO(eB6Af5zz;hw<8nkocwp5y!6<<3fx<i@gTF#4zGdech@|XK1HN;+tQ$(6`W4}4{ z$e`|#r4Z~zO*oZXM1&%7k_#~b3P3N!D%g~_5W+UO0|j5$i4jE{&P~p7EgRQunBi9o zPr#=Et8ZM_jF-+r#BEKUzd%vw`&Y7Mf`WR?#Sog7lLP4Ep*MNO{y<WH@RZgBDAWrJ zPlfwl`UvC?-a${@W<U52|55CMJkn0v?c-_e82>9KZ2f)f*(THn{>&l};l6D1hA&jl zIUva7>8l`5;?MGLyRv#yL6pZSg9(6fdaQAOX^ptO)dCUzyEw}M5>at~_Ov;1UmZX> zqUE)WjXah-e+;C{_Vml_JOp@1&Y)87g$ffefNodac)n+NfoDKnVgVH!(kV0U*&p+X zPfhvJD*gd{-e1(Y#;3<DNU;#+%y(Q>K&@G1l_QMZy`yDPQxHw4P(&Z*uuD=bTpM9r zv$O*;X1r5XlY?-EnkMJCo79R7<FT#`O2%ZA=>#q;d=YdLF5<QH%=3ZTe0I@wt89Bk zKpiUFD#N*QCB%BtK4NXI2c*Q}wnatEiAqI?hKZwI5<~&&yuDuZqB!LBibjh6_>k`k zoH8Ngt+Lrb%f>hm1(Z6M&w&}fGvVOjEAN*a3=*56Jv^yuKpwqOePj!@F>=~1E^oFx z^*i~+WZn?fvXyhkIln6m&<h!vOgDOgXG!~2q=VUs?(S~f0L|?)_9F46KJ!CtsZ79< z0qilL1*M9p=WJHIaSN8<GYw&q|B}oNdA=6+0hU;;EQafJEOkrh+}~0>ad2rl(k{^{ zx*NY1M+voK^}#>22o&qzXePxvNW|yA{ymx@)TL>U#sR{m#1&!JK<Jay>160maI@5c z&i%yUwqzGhy^Cs3<DNmNa-0~+!pf$l_BAap(S^QMZ5siE?oXD}1H!19<{694iV;*- z-OHxEdop4U?ttc3!`598F8o@;6FywGBPWB@={`Zdjw=!E)L4u>_iQattW|3`LS6sU z+lT+<?Ntpwa!dgC)I)Mw-kF#SIkNe(9cw+o#gx8W=rteL<22tEn*Q{+%*)zU5cT~4 zv4~Rjh9|7sbALn%b1WM92jMFDOM4ZH<}2ERY#*_l5a802@w{&hBD=Ut<h|DHnJnZw z44d*gs)OVOZoNqWlIlt0Z%OsjW~GCG;T=0MfI23AQsk(Wo@G<lTqXRCtvI`b!#!T) z5B?ntKBmJ&EqJ!~H>N3bM7XDXKC9+}Y^&RV9NXk}@1jxbN$AqfABo{p_xCq13QqFN z>O2|Nq^C|uNRt9TgVhf_9kJEI?@io8Tb=snwBZv%e!TkcY0lDX#beOm<?orPe?RwD z@lb?Ev}$&%XeoHv=Vr4bbL6J3^)rvdsl|z})`q?aMlCTHIoREF4lJY=0~lF)jDG3p zv2XkBr#ZZ9H1b3W$XiNO9vdNayTT(=Pr(W;f@P89&xA+al8LB@sn5Gpsd)L7wc#iL z?MH{SgANBTrVuI$6iSp?+yvM-B`E@x6ftiLIoFCfF?s>aO#Iv*m_kYLm;{y{p3j3c z2vI#|KrH}pOs{Xq+<y4|=fAJ>6D-$2@4nBs#Q61vz+RCcXOWgIMc{<|{rLfJ`Viqp z-a^I^_=m#&$^yc3Rs0>@1lGAOI%6ws!D+mA(tGU91Ugl+;b5R3&H1Ta)8eqC<2ZV5 zM+DHqB-uqxS6H5J8Y+EY(!+agc7rwm)o@`pu=|AA^kOcH-N^#77d?$L{A9BVl;1NH z57|uCzj*C!mRGNi*bOH7n5lg>R>`nU<6ody>Z-3m&b948hHue!X8CkAyDc%HPNuvk zZTMOD=283aNi<0wvR{}~&+>ZQ9+2u8sv(!g*E5hw77cz)_`1qS;pW~t7iRD1mYseg zqDkYT#kwJ@!l@4vfy9PyKBJ&o^T@4%9+ME#*Lo|bv2Fw5u9E|)pp)k-e2I=sXW6jj zIdw#NvL7EyZ1yXKGD>xNj?acKHr5PZ!~_ifq!^TJWWz_nf0iP*BzKJGnZ94E8PP#N zNkjs}>gLG^ME7V+U3wFXx)&tgxq&1?%Oe9Ehif9{r~VNCltJeX*`x<j1>Co=(BT`p z@i!Rq!7W>$IX9Zqk^{}k&CQxN!W>KPgb+6Fa0YqM5DrD#%~$rhWLACEV+Wr0Yb0+* z@Uy#|M@&-Wi0CLBMYSBaPM}LF`j?4G#m{o9SzYSKkP#(q(=7qgr`c5Kvl=*(=zQa@ zMSME{6=s;gWd%^RU8dKKyG<xak|JqWLS$X*9|<yn_N<UHE&W%h=!k_0|2+%fAJO9P zACHqSSp#_lRlAz0%~R0?UwCe`_gqfKiJoF-Hnj~w#cM@En=B}CFidK<elmk}hl~@6 zwq+-93-`w&YgAkcX!hb{L7zWU1U_2f90zo$mY4CBUY_oH{LVaka7F$*tZRcDYuCf~ zi`eiq-h{zUDWdYQ)1x*iNIUe2Dl18k8lPw^F$u$qUR)550IH>g2e#s_%#^J7k|9nA z*GRbcsMplGIZzi7SPW`zH~yXxxF+_qX{w>hhb4c9`#|XEzsD`CCzIy#fb<b|xl%hr z9sozTo!i4(jV-0sG#hunMwWQ38-mpLKC~Y98J264_EGmyYI2=xVZaCqgku?UrZlQq ze45{oJM$QC4IqL#2lf|$Lf-q0$rzyAN|HK`mc|bSfif*m`yyHqV8k>AnR-}jq3#E$ zd04zls_J%x<qz`~%gu7!YUtyA!_av<cb(w3f29)&Z+Zhdz}V5G?UOtMwnT#Jx)S(R z&7A%wPs_jhP3EU`Rh+-*<iIautM*J87>F_iT27Y$C-nJa#bNd*UHrLtc<ageXT(~Q zh`OLtp^{*Y{gdHR>p<0ts%oD{2ZjOzd1oMr#c-&3uI<ivg9d+^C^SbS@1$7hQ3c4D zSx|YiVS;1-BcQ)r8{Hg9OY+QAM`<)d)R$8{Z~t^-zg`#+q5$P#JZM0^(c>e1)6y60 z$a361I|jQ6Jup%JeB=I)Hni`(Ok2Vc_2LLVG4&*pQE318{q~vi*4Ei;7{HaCrE0{~ z2~^8A+K=!y2zzSo&)d&is^K4474nxI0pSS<C=Y}+r#`leZ!{eIoQ2jh4CkCj3hvLe zmwN_$T$;#hjdaif0vQT;-&ge2FSM@wDzvV^@;vKy=c{Yd%g?!Bn4HkadWY3U^xgSD zq>C7HyvOUjNCxPs?}Wl?c-}R2Rs@Ga0NT!~)8EA3U0V&nVSxys<t*m*SJ8G^uS()g znilV5K;Xss?0aDHjl#WuM&Wv*>>qy*&j0zm#mybZtCvh(S9CpG{r%{Cr^~0BO7_lB zxo+SENT~mEJcs<K{=MkuS0ULi5QEwZ&M#vL;?$CqfdGQaE@T4)++4XYpv^yLH72Td z^Ov0tX1OyfH<+?}2`^vCeHj@Xlh9{V7=2<H4Of!KtVnn*i$8u#yBEyZSOgk{#{#K& z8}lc&NPv6w5nhT9$pyWn^0G&*ehyS>En))$s%#vUh3`sb=?{|GTNhl(O}-Tr0r8^K zshdq>C?zA|jZu5vjH$w&M^|291~lF$Ws~+H(z{DR4T&4~vT~fsX_z?OrU5Q;79?}1 z&)6=@8Ibrqo7Ktq5^qt62A1i8b7NR13(|HGVbNC!c`(+p*2&dn>yBDi$ZxX6X5ro- zS-UCN!c=#g1Vl4@A79dB0;ws{W^W?u9AH;;P}UtedTO6pjuZMNuIogxF!F4fomKfi z@v6hGSu%H_CG7gEfCRaELedF6DBOZmavZ8^u#i3289-rfq4L%{Gr%K#Qk4_t?9OMT zmBplNsz6|z$!h|@%^Z-9CwYgUhx4lDGq%{D_tWTtmX=J5S(v&dR!;=^f=e9hqVZ7@ z+S}?td#FgI+X6p2ilw^5pqTMQ20Vg@1|VEgRNh|R&V>q|1>R|7-j1f6xeePH6!Y1b z>Jo0Wu27`5>rHl8K&C$dc5NU)X)d<hv(Sk+p4bNf+xOAQ0{$)d@R&9ptk|~7pE@0= zmOS=Gu?M-|MEQ9KVtX?Lq3iuU#nTkqbu)p55YnFXEt}E5E4Aj~5OJS=(^ia3eC+A| zU^@#^Jyys2!Kb5q=1lc($n4CJNPv9fbSq@wUXZiIl+Vw|10V}=R=WlrRKU%L9DuGV zS?~iNeSudNBsP?{%<Jp~$h3|EXP=gw6<HdVGgdkCf*t8gwxXWz&~l_dCv%zdUN@_x z*%#Qo9SrpV`k>q<<R6hYSQSP)9oLh46Tv={nA-d%L}%a+*ag5b@pM2Wa`%2k|08Yn zU)KNI>qWQE8PkTkjgTh<y}s4Mv>RvKP8Pa9$k@G0v+gARSvO~UP>ioepA&N}Tx9Cf z02Hozy+&K5G?tS1vO3f|YG8ZC<h4S-VpLz;PRmFZT?9dYKzov!q?7_Jaj>FNkorlz zvgoZH{-HTaYF&3g27O3@PXsEAQfp)i_eZH)b(!`eG3c0a92sHjqu&!rOZri`h&7Pm zFobRno#iVyy9@r`yM^Fx-amSV-U<9dD!6X1#QHeL_4EWnMa~5zAP=sD2WAX-6npHi zO^;+k_Wc63TTgqWdx=~haF^=dP2Xdex9-sLQhy&yTJLfvcW`a%PHNhys@6H|yW~#A zGySBt`?@|dGBvOXs6k1&&fP&^H{?yG{rAKJ<4X3sP`UVgCJV&Mvv${;JlmH~)R&Df z>qN0KmXrm)FcGQ>sB<2l;ys^x?ZegLTh*RxqeB(1xZ~p<#g*)KZq?x?3r{n=nuxoT zy}Zg<U+8+n0P!2Jk@|BxtE79e^o(z*jxchBmjNoaui>4h$J9;tL4Dt%lH6KNSYd5h z^^C%jF7fWGdbV^Ui;c8Mr&DNTlrPkEo5f_s7r5B*K$*Q<JZ2rJ!hP^4%<!oISc&1a z(T`d8dXq#f=8af`fSL-LYJ*uNqD+*a47T7pvjjsY4=&S+tLrLEG;V^mbrnF>WHJ-- zMb=ZV?D8?d0-T-%5Ep0R$}YEf##Jc|Ri^!x*{AOh$TwIMlg39&m7<=%SrBQ(trZ32 z49Lr0KdV&?08Fvi@&Hek3E#%&4;KSA8k)dOc&QUMDsvg1(>`AEAi}C$2dpf?*<yHG z)Rhax&!4*M(R26|2)8<**}5&qbq-OtHgc4)5iE~A$pzpagN}NXr5wNDbThb^fY|Y* z42T`ln4%CfKzAGz6Sy&ZT6uc1%v<y?9UIq~j;%c-=lb_Lwtpn}FW<+;{hoB!l4tB5 zo!46{ch_XKDAxB5;k{C8GOa~AHGP$DRioR)1ahe%0;+pXx%W5)aMd|-OBw!lr}dQ_ zq-@*3ZYz@fUXilm8eG{@{u^&qZ;Avxr?%vWvw3%rf8gle9r(hES+HIi<czmyhYnew z3mpkk&lm~WR4k!hXp2!AFxt3HYEO@y_=F0`?`O<3<ss;M?8qmoci61QcgYvpK{Yv| zMMuxu?|qNHvUe}|u0CFS4J0UMI&7G`j_2l3-$g3WMEPLA>PI6CFpPteqhIJZC!xnR z6+j>O5t>E97TxT(Gu7?g(DZDkImINnyjIc~g9bK#;EWjWRk?tEvHA@GA?_pGmnhN} z3=tjO9SqSaI<tCNN?(jwZs#s6k6esJfU$&$bXkuxt@fC|&4+hWL5oIB-r%4p1VDlT zHD&9OLaiN?0^ZF_Y)4bve2VSs5Ku7-B%H!y9D7Rvd_F!@D%?C?>Mg&T=0c)C9Q8I_ z$?Bd$zQb%9e8|5N))1%x3H)+Z9#$%T5K!h;HTi1(Icc^uK>Cb*)5_uqLYDX9d+eHB z0U`f3OMlZ97Mih@MZ+DHqm8D`5gP2L!q|6mI*Sra|56uIo!tp4yXfD(tNHw`wfHZt zh)X-W6I1w}Jk!z1_>g%f*ri@{1!s5i6`Yg)J^77~NM_VkWTGDGW0-%pWnbkqdmRV_ z$nx*BZspQAqIG3r9~KA7?*@x380(`B?b-2)&kn$zNiJ{^vY2r|cqqcJ#fd@NYALK0 zQG=UhgahMbdZb9JWby!rx6c&;YrfCtko0;<g-wLhBs^c$kzbPm=uI1TJ~D|jjXyl< zYR{LcVun!mQ1>j}l^-1cjjW%94T^K-Xj^Zo0FlK*VXua+^fZZtdjqqOE-88UfbHk) zn=x5A#r(lkr23h`x^jOG1I6PKsa+Bh?lMagbiv``e-Gl%qlr@lPHlPMe&#=a@#D$m ze}iFN4fU02T{WYX1wv(7CXe)~i6JrNrv5*@B-}wUqjhza!+{pd`d>4*N2{qU5_LJj z5}?s=@uz;(5VQ_6Q@7<!Yx@0P$FKJgj;hVdzRWFM4t@?wzlIHtWNMEX4wvL-Vmi-m zwK{OsP3;vGrBjWv&RNkrHxn-tFd9zYu$A9?XwT}u_DCOAs-^G@DauF}W}KTPdPl~I zTknvAm*PAtjn=0hxnAyX0R`ZC^>bW-(O>}w&L<P&HJgPEV=rJ!oB{)n&N`my1|Eq& z7`Hxq#Ae5?Q$dKDyh-oFkh9Xe_{izE4_^J9&i&<JewX}KL~69UCG;KJ_ODQU`1)6Y zYkD%yz<iclQP!q_{9MM|4XEzMf}E7YX*)wfyUNi@Cd{gwQ@h%-yU_`Nk5P<k7aOz< zrXku=S#)n%rMW*+zGr#*(h5!u-oL|6LfdNI(<;1d6LXQDy;Co|LN`{5{}+}}?{RpB z+@T(gSrLuRAw2r72|=G}ye8N7wl!lnoE?fw6UV;H74h1Q7|{=xOY4Q&tIBI$vAu~e zT5p8WhO)mH-8gtY^8-6_|0md613gzii_{#TY24MI{D0q$&@+XhW%J_qBAy@b&)NHR zuYQ9g%F?t}3-OS*s2A5pVD7j0o)vOFYt}6aaXHM%gyJGWFZ0=q+GA)t+i5~i5?kCe zIHdcRtJ*u$)+a5PbyB=W$q2ek`>5n1ogxu_5AmhTVieA%k5s3t_EZ)4qIis)?>>w@ zDGFg@>>T1Ko$tAev1fy<DhI64u!PEWh*C?^`sjT=W)4XeU&w8&;QYiEBEDWPbNHbA zt|b|_fv?QJpgiD)Q)ea)9)D}GEHAvN{v#>yV>|oZxo~cvmckj+a_`R`qJJQ=|NQt! z=d6ACRdtEG2+z2<I+L`|neE^$sRELD*a$f^2(D`OH8jxYmnn_`Fjc19S>q`)Tr*3C z-8peNIdPsW#Y)eXN}dAsYE6GUF~hy)OFDC;l+B^iJ-Ed?h8=AbbAnOjNJW7NS$?$t zs2k}4s(vt5YDGyt{%N}uNmpNo{VDJlBMGM9C_13<o|30wF$$;I+oc4Lemoi!DNzpM zW6CYy_}X%wjAOWCOv<*`{^3~36Mew_=<5C-XA69<tNh2woGA>Rp7nDkzy3?D_Wh0f z{`vm5vw6qr78<~185>b;NhPa!(Yr6on^{$H?Me?aI~P=vD^6;Y!<}Ckxu`&a5pdEk z$dufTie9r<?o$HzcEVN|aWGbV-3hvq0K#!fk`|n1VyP{4(=`=6FQiBYa&h}fK33xF zZ0ApGXWs8Y-grerwA8E#TAOD*_<UF~#3V^907XR;hQi(8F7<M*qawQiYOqo|En?p( zTQ)xs&|?;GEh_pRZzN`ZlZ+>B5P;cT29>9`!hYmb|LH<hE&%P6zj95g{QH=`d*$8p z-!*ew>(9g%M{Qa&Y9}heF%j?MEGbDj;y5?Z=m;Z1nVq0)$&SgkGqn$={zY!;l1`S4 z!ZF|pI)4v;?u~{SU37tGJX;$Ki)u@S<ku|Ct{TnI4lQ~VDw0vIt4Xig)+lzq=Xyrz zRpXXB2@p<Bs`$a&-v^kmB`nGTrdk$!_+c{twYF6MaX3|_Q@FSnpnyU>7uIA9i&A2@ zT9eBFrskzK$NFrRelOAr&b#2+^{1#7_?N#T6^ecTAO83Ajo$#Xd3C8v_<zQ3U4}F5 ziBY55Ytu+3XB@R7ADO-mEAWvWF~6eFx?zg<Z^eL09B3fda|<j4^utp_<!W|@Mq-im zm6?#=JDYv06(CpIX$yO7A_*S1I}?j#ePxvye<6uov1xR#(B<5t1ScwUuC;-3#Ubuv zHC&7lwE{p7W~TVF=FgsbCZ=g_IBrY<sO0q_r6T?4yx^{t#crY2+3J9q925j|?fdJW z{eXP#!G9WO8HhSo-(Q!1KLe3IqK)C#_#ZnR|9Mi`H!dxz(RXT1tNmdUFJet!lTs0x zDnd|oBq$9aSI)EEU!m*X4WY3{=70us2RXpYRsd+3xji7OG(fvg!;aZ46xt1?BA7yV zRWtfxNiUG*XJL4qzNXr0^d_9Dt7JD=AyHO_WL(WTx(km1tw=w%x1y3q(U2SpslmV~ zg{!}Sc2)bB*I1aw;nBq>VRGGo0&cB6RUB2o>A2S3n7OVYNFjgeZF?W3KizjBQQ-Q| zrZI*p<U!sKH++FBVVb%24|?^xYk&5wudx8Ygnywx;D3eKD?rM4B|)IMJNl1B^j0Wq z^AL5y3pmg#5~``-Sa_eGe1u63XstXaMznD<WfhB}!t13#>wo1qDVbLV{DAQjRZA^d zr+{!Tm(l7NjOac45KZ=VpxkEVe&lN*^Y9^B9fVvFOtVPOgm7~uv8u9@+P#Ywnseo9 z-iFW+?!kfXF8F26wQL%Tno1EuWdXa`px%HtA{DC17gKgMN@j(blQ7{1Oi+`*l#=yp z`QZ1h%fG8%nyae0K@l|Y@Z=G2B7p^KdjB)FWV-_HQ#d{4w|`!WA5ZQ^7T`0s?n_f7 z__<k0$NTEFS(|qQ*!AoV@5T}aVP2#CC#H2Q5g*_|qhZYS`yW$*_M1$(aa;&^N-b8* zPgwz91h>LQn8%EKU=*@6wU1oOC4~YvrK6kWDLwAy)sQ={-@iI1`|Kdh%O8^q!m%RZ z(f<3K80A(cZ$frV_h_Z<ERNE@yNHD*1>7k<1Oo<U01ld%ogs<Syj*~LXs*iHIqn4< zONe&o@+ZL`Ra&&?>hG4mq9vK>`&j`U-(MfS<Nx1RU=eVo>FF82{cl$a=&H|p0VgDk zzL`&q%>&_h$aU4d{=|7!3|H=5FP!4zc9>izoV_rY-3w^@!`J@`8db6BROS>K730HE ziX$SWF(cBr^KzXpfXv`B#6elhY=sHa(o3Ewae;zR!L9v@@LqD7pR7;^9kU;Dji+^( z3@=J8MUSaIayQ>qO%v%@j%T48-%<^x7KzfCj4%(Q@x;kHjW9`4V1Z09nN8Ddg_0E` zP?VBrI?#2W{vt!GV{`ToZZ)3veZG?c{fTwaaU~Eyjx@(||9703KZ`Rm5-R_8IN!hW z5EKmbYB@N+VAu#<G@2UiTYSP_KnHw70Abj4%rOuusMyT~Of8wkQFo%_dtxCUMACXe zE9YA)T&Cy;{N9s=;)|jy2dinuUxxIi;c_9mI*Q|#7C>JzJo=<4*Z)l2(XCtN*zpU1 zOkGiTlY1M5r;O&q+;6U-sY&fnW%;EFYU2DMJcFdfgv<sc>F{N#-^o}cDQpPCG?F%a z#Cuk63q^=8N7}=;;fhOx=BT3?`Lj-DQ?ONM)IEbf3aR`X6yB}hOIv<lB_BOL8;k)v z5g5AkzY#3M8KL$uY7v+S@NeMypI3DK&xS+kPrp>7zt_fLu8C3UlS&Ajqy`U)`N{0& z3SU)LAZD|BA($W;8vfe<FNV%20Yhho&xX#R|Nn;0ls9SvLV)ae&@Bk}W?fa4xFgV+ zj|mztF?MLE3I%$bO$xO$obZ@hDKO?%n!Jy*4GsL{zuqL9;?mrMI>00O|3C6b&MUS# zBJQf&&tt?LS91Ij?WvH^MpO6EFz+IdzTNa|BllRq-9@se0CU(iPHk1yRX@aGWi5zH z^RDspfQ~Zmb=ekXl}{RniQB*LzhgYYhG>T>DFjZES@Sfs^~dY5{xKI$8$*Y1D2xGy zWwl>yt%&9^?Pv1GtO8d|!DcygzfkybE@xD*5{snyRz8(D77onoD&gp59tZjWb3d5) zs^!07pa{U%!puB}cpX~rgh1`G0>7#^nz6L~s>*gI21?XWbAGe2u>?D{lb&*gGzxte z^q*1xZ2HPjMco?$8|Vd`5)JP^Ns8}{4tP#X1zJEfv>uTn|A7yG{BcqFnnsQ&UGUH^ z@qvQR7B0FTRum{=fo~Yrwm4tZ`)IU2SYelv7#!7hVo&LaUWI85fSxQ<?d+<gk=kQ< zpQ&;PEK{;l5GmIadH1vxqkd))*;Ss5fP!`-9hH|U`TM;edHl4ZlmZ@iJ6~ymz9y0B z5411y!gSK98Y{ANZJ!Gfs7V5<j)!7lhzc!W!qSl3)sPEwx=h_Kmjug1FgfZSyZL57 z+>d)p%kg~Fz;qL6e3P>N^os+EQkeNEz~3f2GYPW!ufV-KS?u1d--~Elic|ZKt?61_ z`Zi;vYP~7Ywg9L!33RFc??^a$Az7fA2ntX17ufr=AN)Ty`mYCLawkj^tZw?C(1b~L z{^7yrS8Zy6R2KDJY3fabxmrNecH<y_6!~7i5FW)m9u?up9pl|yw95KsUW487uu9jK zN@2;KJ(?Wi5IJtiSud6aCcxQSEVCMmM68CrZi#|lUUGx7T_{V;h1z@2s=4MzB|9Mp zQIl04T`%u)c7~FE|8h8r8e<M2y^o<qD9iRUVz|QbqT5UmiIilJC41)sYR8VVO4833 zZSAibU#&mjr=Vf?Zvod$d#^_Hrb$nLj<=Kp7NVt{7C+UE_>=$FL+N^4+M;b3mC!!B za3%luFPy91PH0+liooR*!k~0oCa9*mlYWxM2BWKLv84hBVZwyi1kW_yopTrc5X!99 z^id(Sr9g9^Kf>4px}un<EN_j;6@LmK$gGlIv>6z@>5alG;R>Vr{kGv8p<eH5kr^7C z`|66L@Lr^{*-HBbv$Ykb!f+~odcF<Ygh@^!`8wbo7!gDKbTR9)N14IrX&j!DN3lp; zHINj%YrN*L?O}+P$=9Zb9&huP`t5vyKA>d0S&<tf*9HufXwdzRQGIqJcnt!9(HH=1 zm$EwOzi0Tb`vUwbpYQ$M`HRu1*i=c!VISuF&Fha%41y9w_L9DAv_eOyXDpA}92(ed z`qZ<vryG}Wcx)XoT(hyXHS)&RA$08_aUa_i+*tw$K@eShEg3=kR-44PvrY9b5}&UE z)m5Ob=WOHUtDzq@Da|PI*eNUMq(O1K$3#C>=?nIqf#7;{!xz0Ty_r@Es92o<@6DNM zOs$KZ<3vgA!AyWiY2jeAp9Ho<hjW%q+Bv;1LjuO<IFu6#u3F`z*7LhpY*<z$=T*58 zGI{K`gO3zJs-Z%afay0S0kOciX+S6Yy7W=yZ^}$k$NNtWV99Q)(jUMJPIaXM$+P?N zPMb>+bbRO%<LZ{F@>$05A~!3btbQx)mP7o+-r88t<2na0ut>PB(rRL$!A6jcCe1f% z1)DnN=(P0ijbSSkVp8QB5zWzZf|Lwmlf5UP0lT?(P*dtwqL+Hh;VFdZyisSh_ijvz zFrowYi@|T8D|5Xj>my^?NvrlIRn`%(g_(-Jv?iq3Jw%oJ(tSXMJOBn_7>lq%z<!Ms z7;C+f6J5@yeb)M?GPddsOf7JksVfI6mZGJUp$D@8iVKG#Up({;n-E}yCx4vw&R0v? z_9nX)H7_Y0=8WVmzXT&D`ACy5Gt%X6gAV6HqKIpao~uvU<-KaorXcWV1%7UCvs!OI zP^>W605xBvx{6LR0k7iGb->nvUH4&+yDk2EY}ir=XTr3s`#X7~dp%#$T%5JiB!zr% z?PvVr#_=%6(}w3B+NGGc9w?@bYN=Vsmq+pau<Z;vpQ`>0xuyX|$))vQc9@v^9p*`q zGR|&DM_fPUWcRMa2tLgP*(K^D^7-~v?}sbPd|j0t+wsnhV#I=Ebl!3e^~T{kriE2n z9+A0EI@plEw$sEG<JH|=vdL)jC?t&P=|Yid{S&xil40p%l{b5vv$I#FUMZgDXN;3) zLBGBgGHbk5>O9^H*>px26L#jQ)}2F9%NJ3SzBi4V(U4i|%+2_8*jl4w!Oz&sTkUhi z5^omgAz=&GlcVFE0jGQ-lt$xVqYJeB5tjz8!;W`Popc#&v1F|vi*qLE)MI(0-gwSF z=@pu)9Q|a*-N_J`CH*Y1Ds<xUJTf9OmwI+VW_ck%;pRstN3@OsM3K=$=t_TGoTGh* zL8q6F3>5AT-_iOiyPST*%7ijQ1l4a?{)(+`^0>%l0czoS-NbQk{By@kqoW5s83IfV zJ4<!N6Bs4f4E<i)(jB^k@qBF|$1i0n<4HSDvTA`3d#r7)-(y?$>Gr`8cUEH|5i(?% zJGyziz0iq`S{;#STWgrTBBQ!Un0YVhyukN%Jz-TC`h1-%KdFg&#t)X!5;aS=8O640 z)9i&Cy-t#M1ct;&U9X2a0EPO~vIydI`o??mYTJI#R(5`L>g^qcM(=gojHY@=Q6uEZ znqwMa+Q+=}$cf1Av-S1Wk|2(hJewivJnF{1J`at|2FB>VTVD_qS>6eo%_I?BQWCfc zDR?L)^k|9c<Upjq$Hcj|cFf#I>uNs>vfgmoy|{FEBJ2=(a+n*-7Aq+`$<$M)I=~U5 zqN>T28#q^X1Z(numXT(vjdXmP!HWxg^$=;u<Kx*RZ&zXnkrPD~lT~rcYl7RX$y?G% z<Iz^Y1gFM^#3+hH{d<b6RY5fIYtNw8*Nb=OR1bW*A0LmuuM3@&GI3c_^x&TLKQBm; z_1XMT>G!WUEiV1hD;L30>AM}my#E23A=}Qe#xihqTfnJ0jDwZ&UlUYd=aPp9wS)T4 z8)9TcI`sxXt7(0iTAK?Fm*pvK&<huP8Bol}{;xX4V?fN2jk*O2{TExeU@VXvuXGx( zl6K^k0VaG2Je&=)us9go+RYp;m$<6Ij(G_OmGyyi7etQ7#PygJ)vz@V3s4@ZI-mw- zeXQ5h*U<L-Fj{&Bed@-<<TLb~^W`De*_@y>d8VMKSPt8vOFKa?z|)PjS(K;O9@*z? zl{IawLDLI_<rEL+AZZf(d#Jsyx%sz%;dqgTh1zS1KZVf*wU;3Y2a~4x-wjH-s`L}A z$UyG~5~(3a39uEsg);v;Rqf`9)24SG9-b~+qzxSjx~fCIYHLINn2Pvps+(7_vC6mq z#WR_vREhkH8@B89&(pxKag)t{lrT+TQbfCZMwOh@IB#W)SC`1paE^*bkd>(Or*gbA zt?Gy9#mK;%O}qW+#Op&>X78P<4dVvkAx+y3q*H#b*PChOt^4ZLf`&I^qp98;_18I0 zIETHc4D6OpKvwE;LX*8e_O(Ey)~$*sN)UFLP&pvR0F$(^00as2Sd{0cQXjKi9kk?L zA8%=Dm45a{Bk5zyo%(Qcb%cClS}d!ill6$5W*wlbkhrYTQ|kzu^v1flur{QnOw`L> zvvi%Rf8`?XJip&%xKZHDBj_=kJ#s|(1<MSRk%SNktT~Qj@4(?4{zaS~9WQ?s{@@h` z^O><>S|3D)MEi8L=PHsq)(H)ZWiu`Q*t&$)TAG=l+4aMV{UpLcwZGT8-&ks`<8jMl zD^!dZ`RnOYeU$bRVh?DnvMe>JMM!Ss?RT!1%b)fVixDdm15&Fk5u2MDJ|25^SvGtS zH>c5hy?`_@Vh=T^A%e7yWLf}?;qnn0Z0J$mG_LC}fCZuPsf7)!or*_?bg<tIPGl~K z@MLm3G~OZgUT6Ry#}Ur~F!f{rv?ZqjEOR|8$5Eklt$c#8Z7Pu^Z#7IW*4btGjc;yN zB;;kKZ5^HtvSSnYAaveob*2Iqp6QEhZi64lOi2FQ%L2O*1D`!kq5ZrSWjbn;fjdZ0 ziq$yI_)Ho%_l5S2$z*20#_AHF4;tS(DqbciY`s4ZdC(4Y_F8p_sgkq!sl?Q6u?0hX z=kAalz339#Ku2l(goYes9S)q{hOH3S1V!w2qXv9tg$M+z3WR)_>&ad5B_Pz}iX$v0 zg*PN#el3t!>;(q;Cgtte++N$?sBRe>Hz8VyjEZ=5F~~sOju+DDguKk$fsU7k4pOGp zRq1UH^L0?Gn)SUl3R;bveDsbz+JY-9jR*BW#xNc%WIIbw7wN|@Te!C}Gy*YlVsQ4B zWudA1{hX8OhyRbWw~mW?-QI>3k(34jVHiSMK|ty5l2(wE7U^yfk?!thDCrm)lt#KF z2BZ{*9(w5a%ijB(?LN=>y-)l#pP3<M?pW7a*IMgZ=2&vgZrM^P0-2rFR%Z?u!}Oxd z7x(ZQF$a|Kc)$4G1T^uIXN3TD3u6luExeuKd#}@jVss;Rq~9zN#`Z>D%>&KZhCB1_ z&gBB&_LEIka{G709{Mbf(_-kL@DX>A=i&l-xXBEg9=FS(Ej-HiaTe`e47{(w!$hm} zSLviRwz#|qYD+j(IR3+QftcFXx63HLk^7ieTfQov%0nXQU80>9pT8R&Wi+AdkDU%2 zNMx_s)5|@d-kr0n5IQ}OXxS|%SsRoS8qIIJz!mPx@K?1<r`@j)YfhrPKr;<!PVANt z0GdW7^@vQUBz}Btr9Yd0mgo%No>5EwG)g+_mRCj2vca2aAxZ%`y*{ro-<&MR;o@p& z-RPOa<-3SQ<iJAX^TlfWE06E(RuKw>!-DI9`=+~&oQw4Kk=j)~X3aqnrWXPzJ~?#` z-^(_qp|5uZoB2N%4q!M=Kg*k*gjOV(`bMkr1{Ddu-MV|-jOw9#xa2BbyQB@m<L=-q z$h?U7Ry`vmyQF>^O{Ocd&oi5}TTfW-u4?D)+!Z5pZdnHzNSsqw7V1_xO)E&UuGiZ% zl*?*DCtTKMdxCT2Zb9KXH2FjCu%ey2`-~X7WBKcSw<U2J)37!`Y1Nc^4QL@aY_Fj< zzQ7gOe&(yx;eOt@p6TDD`_;B2!)3mIi^E{BIr`%w<<<FdeZ;~ZgCK(L2{I!%h-IlB z#V0LiyRsAa`-C2A_Mkl<FMBIed~Pja7pMK#3Cy?ss1eY3S>)DbUpI=HF+#2gkhgb7 zAHn8-ftU9%W~g)z*&W*NI!3hCT|~^AFZj3p@VF>Dx>wa8REmyE39oRjYR__8!SoFu zd-$D~Y9AluwaBhr`|Rp1>t)Zp;f2NlPn+W+)tL(!gZn*Ngz<&Iuk-dLNdDb>^R}3$ zLL3fVmPmW=63^xSC%hp`y^q_YnI!N)J61rxfg?Uo*s6DGbidoJP(DhI!nssJ$b@(^ z*LqHC0?#^rR0Q&7ku*C1&_K!)xy`h^lktWRq;im)x%=||V%dJI6EX7+oMW3VL>W~z zMs~hL3g+S84!a(O_>h!m$;_Ci3mpZq8ypRN56rA88k073U|)SV@cK}P%%w+MS}e^T z&JHBaDc+l8|Io<*6dl2pzE@jBR;LTDr#DqgYwOt8MFC)I;Az%P9_ul%hV2>lJ>+d6 zB5XKRf_;&~=kIRN^@SG*NcB(W9iv*0#>2ihyV?qDmDW7)#W49A)nlINKId&HqV!5S z0y`DZQ~0VUSn3<fw04N-ys<Mte6}9V{%UdaXUt!A6XjQHn1T3saqs@M><5R#A)Z-m z_Dk0cQ||zgWME8z_izQYS+>thoc>1ZYE%MmHcnZ%N?11bZ$fjD45bB??fBDKTERiD zYOdWcu2)h2|B+h&(c4_RJhL+IXS->L`o7W&BKM7JHGQP60{K|A!lv|(#<)e+U(YDK z78_stclFSXp@a|>Ri&D2x(!6$$2+r~YD!Sf{fZ?iJJ?r9O>k@9eG*0jb_=viZ8XQU z?5`g3FE$9X=u87$hV8j5=iMFXT2&S03M`U@EKmX-X}m|AGaTH$bQgysLRpSjZvzri z?D8CF?uYct=649E^0;O$qn)We+{WHkpC5QJQC9g%)<J@K{gvvXtee$XbwG2YXN<Dj z;5u&?bfxA~e$|xCB0vD}?4KBk*x#SEn;L3xCp~ZE+xQuGNlT%ny8m6r=4pMd(L7lK zQ2QHMwC%1jef<SJi(=dJ$@`8~yk0Ua7$jNbq2X5vip|EKw53#$CZ}EsM6Q_<YG|*O z22NYDY!}avBnOTCh3&e+B1h1*RGsvv{d`Z$v%H*n*_U%@+-MpxJ|8aY|4<{Pyce-x zB#exFdUR1Xb4WORCHp}d<-Ks$82G?Zf6zzP;|cu&k5(}#OwcfE<ts}g*4jz4So<Lx zU0}OKMe9jPQdJWj6|dh`wATqvuWVCUxUw3f5H5D>!#?hM@$wwj!zM<U7t1&)r@>J| zysfFVWzJ!QjmR*^a_FY20L*mP!SGNT$7-+1vTSzl7*8!H<3;SJ^>S@v<tO?Uanqba z0pF2L#$_*D-mUU~Z&R|?`E`Rvuvee|I;FL#WKj4`%jCRxH$7{^^9~6YL_K~wBO*JN za-yWx{kg?l*NsmnM?etE@?1MZQq%4QQM-3ErNMOB^YBH4+m~LvSE0)=KxpJffZVYn z)cVW45$#5F!W>0sJj@H0fs)}~O2=?dCgn}TC&)4pFQgqfuO27rOVrL@e6c~1jfh81 zB94}8di#sZSC9Yjq-l*}+1d!G^LoHFGX)F9oJT;B3!~0?&5%eqpbmIK!5GAUlvai# zgw^|Yk$LC5VHBN%`s*J`NfKU1csmF&Kb!z(IMIo+(3XbArqCk=@b{dGB*VVf9n?U{ z60Z{5Fj`iT@KF%R`f*!eT##_Me>h=bUZ(IitCfuR+f{7tu53{t|K)r%@;y+*8qR7Z zF_LdEQ%#S`MOD>e<WJcKS1)@_Ed6mCZ~%9+6oYWWSsUD%55BQl4JJ<#X-D#|U<e#f zPK=k!E?G~PdpCiw@C5DJL7v<8uSMKGD!gmI*cC}oc(}WjIevTX3*$T`eEZyD88Y*G z4{o;g(7iOe55XRL^cuw<u`p<ZKT^-A6tjE`)vLU`#5T$)dJ8GemL;&#QrQj-{gA7s zfx40Hluy?hhaZc`+S6Y%-TS5IkTg&4mv-j0>*8wW;<9-9qZQT++e@><5BRK6EKbDO z#!e%o5FO8`<TX7}ATK3Kpn^(#_m2k$ZWOIhvw%KLf5ff+I>NYwfaK42{`!Ic`XDYN z8r&hJ5WfoIN;ep~L>+05x?ssc7kud%|9Rs3px4M8dEo}Z&u|OU^-=+r7^!TarNL?O zO140pA#P!Sy?w>%Et-45y7#Fn&_N&JJqRCrelv1bP_7&*+Cb2-@{JW<T2lgu@7#>1 zzp3d2>8~=QgnppS#$ZC3{dmWw@|oGZ7S~C<ZNVsMmT%_M!%;C3KUta&6c4%`dghPv zU;BAE$;1e1u-2dAWFjWSY|LhCgi>T}!E)Ko=~q0&#VG<I9uJ2UrViFQc>ED_kRYT^ zve)Hxm83Q($Rw5}^h-*}mxa?G3K;^f+~}lW-;bG;&pv!F(_5#svQeUP1DQAP%@TRZ zWeHyT;*BK^>EsvxA`cXuyjDuV&O%cpwwZ|z(|zuGqS((AE`Z(<jNS(o-;`qhslyx~ z_@s?#fq%cwThcsfeyWQ!V<C~>NLEjNEGM2LT>S&L)e5T*84<YNrnR=!3Xa{ZGtY0K z@Bjwp9#dfEM?$8iBaJ^InRRh6Z9Yo{scn+se}3ReXykY*1%ozTge-gpJ3&QOM7Q@1 zgMzbarOcCDKt91qKO|Oi;)My(y`{{Fyy**~1G>>Ybj*7nXpr7eN)Y#C)JjKsMF6Vg zXq4l`^N=db>9oO&2MdzR&jkvMyE0B~8or*=;AqbKy`OL3LE@&i3G5Y2EF^b|5wjVz z3BF7{s%pGvna#22eF{nyJX;ktn_~UfZULJX?N9LK-~}t{z(rp$VE~=~XX#h}I(z^1 zX#Mdb2F_g?EK=5xZN4X$6TA}v-p5QH<#w626}`SUUPMwdplb<0R$2q;|6WoAHCpww zQ!b8I$Kh_Ch#LaGOs^(25}{voo<2xj@R6Ml<>-{lf|r$({rsg0#b2lBkB9UgjChte zvBK9T)qEfO<3w_RNb2Uf@S}_-+UQ4jO^Af;Y1!(&LYRl!v31p#h@IJDv%akjb(4Fm z`!GKHM9g4U#up=N3*wVwjr~-<f)%S&!xk64$DSCqNz!M`>0B88rR!m&Z}bF)GT%dG z_0<NOq8A&e8a1?bskHb+L=suPXY@3zT&TA7Pj%`?=cYb0Gj9-2RTxCEIMRy6yiDVn zc)HLer#`@i@AvLHgOk)?k3#Q@q+w!XjSpe&v)zY&QJ6Gnolkxm(Cp{df)Pp3NmcoU zg+*ux-noPog%grV(l>Y}KS~E(s0%bucIpmH8rE6~BgE5Tyy`-?b`^T+8$!y2dmbvQ zTj92{8t)<_vr#hR*R?1_GnV(+I<C!Pc8u|9GpO^#aeC}zT+R#MR;o+$GN1vw*;)d` z%0wB5l%=%jl-X1ZRq`U}v?c<RciM!p%fI>BX#CS0_9+r1K>RDV=BQjW=IMByB~N>^ z2_U8)9r%FUh!cIfOeYD5SH#vcG)Gck*z7H$fZQ(w50H@dt&Sw;O7*$9a(&<DO6#@~ z()LNfCiF2q{n%DTRIbQ1(tmTZSV39jiueYpFFWW2cyHrCk*?y!4^Pk0A)dvR8Kq1? zIosA3ey>ZlEOv|Bru9x$x<g4o0xZkaSaeEk`qZl&&YRE8uN~Kib4U%m?waX8?{n^X zek}L5Q6%=8z_|P5O^x_ZftSc$wOl(S$5im|M~CUR1Ac3j{(3KmE;^KH+sZv;-u7qC z2<L$i%lADawAsdkus%E&v?!GllMOB;++jH9#rw%%G&~A%Y8=o0#HTvNd&W@{!x;jt zgC*+!xEvTCM2p8E@HE>(vMmbZ-Z4hShp$yphlx>RmFNj#%jg*xP@QGFlP8=&i&=1} z(OK~W^XEeSl-S#I_e2ccbx~dlriv;MItnNjXMfaI3VtP`OnAIB*b#yK;j{g>%Ax~@ z%e+BHB*IS6+w&v5GN)Y&R9AwL?uRiyS;u<31B=3Xyh!|Hl!i^aA)0FIkZDJxQY1QT zbL0+c?x`!F7KM<G80M+Sl_E|I@1Xv=EMwU$xe#{5%D?YgpF^4kikcdhNrSO@Z>ycp z@ppZoGTKrNYEXbpLlqWwqPV|^Gjs1tVNw{K-wEhxw>~8`$kLS8t=-|s-(`asln_Sd z1cS8B`z0YeksDLJCsMxnM)x02T31~tEDXr>I42QO&|5+EHVN^p_d6-K`K`p~0)Bjs zS}-`DgDl`VhcH6m+rlo2$bP{}mH`6EWxspqs-Isc?K^pKz7-YG?gM{9ah@tM=a4&n z`Yo>4HF?qZ1_VgdvyiAFfh0jTCQ*+9+2%qsPo3@JR}0^hS#!$umxT*?GRm7~3o*t^ zUkW!yMApeKmcB~BbHh^k+UTTP#3u@s9p`|)SCjF5G8UB&nq&R6l7>%m72=s_-WOh8 z9<pbg!))8-0J(U(xuUM_?vx;=!k1~w_yJ<!KFa~?-T9C|Fz&C@RLK1Q49(pN5EJ4= zrkINaUFkkPQ^=t$cie21ZpfV!_gC^sz=Q%b1UAGrM?9c-=f(6W-})rP;n#q=xHw9g zPE8<?A6E!_$X>A88|@?|_1mquD@9F=da%~7u+Ag6Xu_ihwMt<y#kwzeJhYF|)t!+I z<Yxk&kK`(rH9|!Rg*003B)qMDruAAu`LP|tGOBj^m!HegxeymL0*Kg;$D92o%LVrj z3Fm@{;@)*E6CEvt=sI=fe9Pbc{77m^Q6k&pc=HHJq^xp<c3iC1Ex(5N!pv`npf1y{ z3k60ODHHWX@hskq)EZB(?#oa=@-3`&4N#C?=4(GUB}UsP!Mikxh@uNlyWBeQtJq<8 z38Ay@ifuX)qcFPYK#SS$Mgv)m%WSULCK+|ogtZ@$iqu-CStt3Zbub|0e49VvSTir% z)<f7l;t6$DnykmsO+~8&(4CC@cg)cPsqpHD0YU_xk4sy+&}*Y$fDFyHsc$`UvD$Y& z?c~L0?pB^-vd(DUJ@MB&4}RI#0>yC_>@qvG-&)|V-3jXI_Shauk5)x?;xVcQV6|<x zG`sHQ?k?E=Di(Y8Dl7iUn^3tL;ao(OaW4}$H#do@+m{d5{iwzUS-2p6wF>>#$DjJC z1+zp<q{>?k<cCq_4N?JOMl_XY4{st<@JyXW2U=RZx7Z$q*{uf>DHc5YsXkdS^lRLS z6U)GBpI&j(du$9{=S}6?yF$m4cY5^zbtqzO)qmR^KQ1)C_+vd2Jm#UjXDN@gLpoAE zDhvD$>AzXL-;LrYOh4jWJH=$$%uGX;7cJe2UcJ@*h3j{JM!!j70enl!12y>b|AP5; z__B(MCb0-r1~RPreh!EZbC*-v=R-!-MZ&XpT#R%+5po?09ioJZemHNExv)>!5|f69 zWsc65<I?4LdAhYJ@%N|H2!bD?Vv#&~XM^<+3|0ojJq>Cpp;YFaC}Y<Gz+Hd_cl0qm zATX-*N|vL@*A}eYfR!u2PW+XQnCKG$&{W9KyXq08;C9azkzC1U<8J;$WprVz-h%vM zHVxTfgWw(EANk2{Se|7{F+z@{Lfo@IePQEvg?;Z_vyoV5B%D;Xc+s`{f_Y%5IJBK< z6z{QSN-f-4q)Lp@85t4<&vESiICK)n?*)kz#<$3G+8TY>JR`~Iv0<K61ha0An)Ke* zT1;NqGOcljX2El6LV8*#2d={b&h#OqqCK-ieZRjWz?T4{UHEJKJ%uDTJ^1wn*p8CQ z3vpMw-KTZJX1W|CbRY{ZTqqo&s|7NJg%MAB?xEv4&50Acj9B!?c2Cyt5k+Qc*tFIO zEO?&^jXMQ*Jk@~$hN>n~c;?$mcbMXXeL#MaI_EbNl+K5d-`a+~Xuo19W+EBV5%cv` z9?QS5?)RPlHvs<e;-^5Mio@IOl?}X^{OZIM9E6tbaY3Wf<V4;M<^C`GuYy`l>X)xx z$aI3V=LdYQPNM#iqf~{1$H@=c6^IUbw+kMiJ2|7OLd13@SrS-7))?1b#a3d2t%1)X z>O_OT)2{A;9}x3}ilQk1!3u%feGFC#ZW@0GjyG~lG9qdP_&xVv5WVDi4jZ=)UUMyd z-~z5jFM~U|gjfDiwHTxES3KIQRx29=B#gg87(r0wEtOOv8Lc9TCdKUh;Af<9JtQ+R zD+$jD?tdHvIOItA2hEW_h&p3A5M*XsSS^WTUU*!2dmMT(>#ag+fbR{M4d#WboS<O_ z^e|jgAD{4%-S7?@H5(;rEK+v;^tQ_b%fMbnpo=;G`szY%f*BBndDwLNgG#B{puG*4 zP!2R9$kyim?N)?-z`pxLxkmisIa^##2$L$WM5P7e??K#uT~uPfXF&12AvimM!kH&w zM?nOOt7D7=D90W<_ShQxU-nUSSbB+Awxg<wn3OcFhOwmPFHgh{Klo&k`5u0N^-4vw zgKDV0(>sY#DA)$X9jpLmwgyC=2Fhe~s9X%l??GlD?A&c(xZc|~@6b#Br3Ju!gkN=` z-FDU==ze4$1_Qf<m|lbqQ>kx4vlhTEDTO-h-jB;`ujEr2vc{*P<z^rQ-FM|z3{|4v zsD=*j((zY?iFkDdHo<q)wp}cy$M9%Z^FDp)Jt1m_cjG}|c(*b6`YUDDxMxQFyyKd( zT{dYii4)zwFv^$^uepx~ft7NxNLX^^|Fp5*uAVRb#*)>9q*(Hvp`HJX8!1vGUtCZF zW{fG+&yPQyLS9|qWwVwyjE`ZfHmKx?YXDOGGVBS!Bv^$6vyn`xKOnwnd#)}GYO}Bc zf1X!)FW~jx>%SB(c4uI$6#vN$9i2RJ<b(1@ul@m`zeV1E{}T0cpek{@lXZ?~320tH zJpu6ft<~f|4#1y&f#_@6=;Y)+)a3?6Q^MhIXPa7o-9lm1+$+~_cO(t1;Ar-*g1?Hd z1SnY<p+_5$`qpP1iCIi{kCaI$vV$&Zpg7j>s#(1iKwH6GR!1HNzG}Jb(zMzgI)YL; zlLOCCg=qm)w4s=D0atk@?)Eok{G^t$y%>1h6*vxsc@)E3To*uiF8c&&we(aNHP9LB z{kqjJk=!eC3s40;c^W_sYS-UBpli#t9=Hf5Z=2bzjFJfVyGWh)2?V~iT)J^Jb737) zzFYbtHd!)dTJ&fGc51I(ZGt(?;hdYCOy;o~v5$(v_7mXCjcNB7iRE$;(KMY!783<# zf`YAxj>G5X!&ZfQjSi-dcy@7EbQ^;6h;l3Q>|PZpXNkEV+;PbzpwpL=B6ewvBMevw zey8*I`YZXOdTllLfzcDUVhHH5WY9DtN`Aj(zdK)ln>YMNK%Mc)GRY1FLR`QS#gkQ) z_Zj#5zwz?lYzZ|hzAS%&B;)F83bofqLPEl7BUzBdpZ}gZ97FPAFaB<Dhj;^ERnkzO z@LOF<>sj3z4gTW1_$JW6_nI&+Xju}!JcfMNhZ$}dn}=1f>xH~XJT1bnqU(eHrpptZ zDE_XKI2>f|p*zy6Wd(MvR(~NY^lHOJ>DN*YV)I^xBKOngnXW}Pj(BSs3J$T*y6&BO z6izm+WfBhr5&>IPG@u29Yd~{43E#|)e;X9nnmr>aYG=K?8OFzuX9ra66v;$ge29p- zx;P!H84;EM^r4p(J4uRM_hjH5*zCkyIAGy$v*C1dfPRjm5-QfIPs`vi2BMeS=nSHe zqz1Uq@U{!8?9Hjq0xlZBu|^O2hs{Tb-cgt-#Xoyba1B)KQu-*q$o=oj{=1VQ3ddkl zoe6qVYx@QJYH)uyN7B$%SL5^lx_6@a_`J@W#D0|N$<eZyA(-)Y2l<4b=<Y*%{vaKw zvHxYvs&aJt+Np=W-Se1)e8Q95h7Og7wd<jk<bk^u!2BD=FezJ@N<DZ6gWWzS=#%!j z2jr;6*lpHIpeJd+i$|zAseNI(f@)jIHzgQma73sv2hGwW6=CjXpg-ch6Kw>TN%`00 z8MTnw<8c6eW?YK%h!4tOcpkwpToIl16GvG74jVo0(TT(wO-eYuaTW3lTS{QeoQt?p zACqpiiJZsrl&S_qo+MK(^f3d21DZY`an?0_EKhN1M}FU{K3&#~So+~=mGNRWA-#OQ zB2z{xkU+mHJM{Ol&BovzIFywj7<WyLX2_FVj$TqT|3APC44PZas2pp%%PwA+6!^d4 zYW(p3wV+}p&P2{qj6dI|$%f-B8Oi9)F|}UK3-3b1pL)dOlS^zeS%Zt4fr;cHWcVQ| z`WuHQLJD38K>~Eh(W!gBU>Fr-htUI0J$_Q>HIf_WV{w*Bwel9dYRiQ>1%KN`@ABT+ zoJ$42Q!qMbDTs7`J9%EQTM-`&Lj!e1uAfLyxDYfy^{7`elEoBZ2OIW;>UrfyjQf1S zB~Yu3Uok$dH~yI%-jVF3sCfU;i%n-1^@0bfnIB8r{L%4p&JJ&$pU4shaERtfNAP;? zE5r-bw>-X{;CI<(B4JjWRAo_}@e^nLePvNaMH9>K4jQVj{=YazQWt0~qr;DmU;o?X z{<jJF9UlB-sc&5yG-@nkiFyEe(P+^-N5U|kc<=D4^$uV(*Fqwp(-KB<BFxLI&hh%* z)~%B}YCS#D?jelym(=e%mA&#m;jH}Hs{vLQPkw_P0#|FfvK*f_*m_T+RY}{%S=sCa z+iBpmxHaVvVj=l@Tx&rSUE~K|R_lFIkr^5U0YMrv^d&|^t_(B(Q5{SzNS~|-LE>AL zcT@sv8}DU6R{&SZVS<bEB&C;m9L1##GlODkhD)S@;<S8VQj}`BZgQ@&D84>05G#U8 zD3#mx$CLN(r^|(e4*KYnE`aQPL77fH{|<n*AJ0$0OSNDxgc#t?W=ymJA@zfOEn@Er zVI_scCou)gI(6@*PUk25Sv1SH;T&0jq|Gf~vQb=^>2lQSd7A5ceFn2=W(8EvNr}S3 z$d2(u6d^CuxEu8@=Kygj91_;ogK(hoO{t>gpgK$MpERHk#@pgll8^L0|Mx!bpIez4 z?!G>hmUOT-Aj5R{vtOan@z;vC(3|5d<({?DR@$ID*8vLhiuqlSeI7p^1wJ~np8^SR z6)`|}*U!IAe+OpHBaUCx>l;V}sd@sgv?#9F(qyrEyc0{vG<ryUbh0RBlXM?VMYz&m zU~+p(s<Hgu-DGgyQPt{eTw|p7d74k$if?tVu6vOUVsjdxL}jsI&);yB9Vc8VrXr3` z0GdOpYMh7Z&mjV4JY03oVIIwqZ3ms7LA|@?(>rZN5|0D*&Yv(JCb^WTp(&eI60gt^ z#Y2A?m7GX+%gCpsYl7kV6-b2;ALej%1KXJ{+=xjCaRxF(e@@?}J__FfID;E|HWKXo z%u=L9z?DDvq9sn2NN8{Mv2p=T)lFQ97HjnmbpSSL0pN|PsEsopN*n-loG=Zj=@>0~ zd$K6{oWj9tDvNcNq$4kX?8T%dNdJC6mIftm{i^8NY1fn#Kf(Ym|ICyBjcvNUR2ZbU z*iAzYV0VYJuzPnuAiYDv6rFYOi~ViiSAAiCZmTS06~0Ez;I$XW?DXJgLJ_0=;2nG) zi+E|v(nkUpw>quqkKBWuHqD)JL_g9^k1qXnMXJ*4zugK>f6>|-C2|zi8CJ(ilSgQ8 zl&NMOL<S{^93hCn7TB{RyXF_cVEN#gZJ!nYmwRgU-mROXVvlh*PsrYdeUULzz%(fC zRGw3-SD2(B1Yb!?20^><GmvsR=g5SWpM{EfG;z?25ZnbTp*c?GNgAW1acCH>Pj1lg zcbGFW2Pd}-88*z;9jSJn$42W6;7iC;XN$ZnBtXly9OX)o7qQuQMM7WVC$<^Mq(p)F zfZ>~m@((GcUt{R|+#bV!r-F$6`snP=D}ce4lxH=PGJn7RU(M6)i?U##DedA}=n0P7 zMiw*qA(KirHOUjLXf6!ni<nT_XknC)bW`44Ny?1iFonf8Ld1Sd(xMd=s+TKUIjktE zp&#DRA<majD~L4yc7{a>c;g8E3OU4P?s0q%+h+Ahe^?Y&F}dJ9@3Jouf-dQVr~~Jc ziiFS$!&#jx2wj2~z&`l<NlmH@TUGYLPX(;18}(OauOMs?*dLjWIAI&GPF4w9oSZ2_ zrSI!31ol)#aLl-ay78M>!*MVp|D<({kCAH<f`qoL8Cbcf8EfB3np_F+Mv$5h-|0b| zFcXCBYJpz>cat-45^}VOZZO8Gn*0?JlCCuVUG29e1Sm32jK1*~oMY;_(l)m<#);#V zgR~<KUKB|#ub7p{7)6Z->QN{KS!_|(5cqXSVX1cp;=sT7`PX_(rCOzj;ARjJ^u_Vu z=}jJqhekx?0Y24w7xQNN?+f(%&QON}GUb(f-I2f^#PI$C>b)fcut-;M<lY>&D?N@B zH#S2@>0_g$pir>4ubSm(i7dwW>4rLZT!(L9;J9)8qPJa(U+ng#u%a|cW3Z+_QvCbd zI57Reo`f-Zf!h@^FYi>nmTj7u#{o$?8PzMySjSfGgprL)>&-!xjA$a^02~1s2;Z@s zr_S-5fqJB1c2FB)AXzO4yvdmecv&D?<Hlp*&m(NkuFQ_HZSNF7fYs?5nLcoPD1#TL zDyPy+Y(TDIl`FGBqUkg~azaGm1O?@5H9z%Xl49pSO5m4w4;C)t?%A(yJ{BJ*F^Gpo z!MjJGA;SYQm)qkfqz)YNV|mwRy^)|$2RT+vAn(wL8U)yNb+P~8Fb^=&uW$RHWUilJ zu47nl))larmZU}t;O*w8444OUwe;}cBY=AxMmWuyKD9XbIkHjD*PiuVMk~+E`CEbj zk2S11Vr6wzdCM4c{U-oVVnAU~4w2%?LYuctUk=#2loZfqj+1T?4CS`D<oS6$C-(P} z{>L`@+5O>e#ooGGy6bUWVg&;o0obe|FYk<TnxKlJ^7~vinBhDi=i9L>p!=|8Nz>N0 z_Bs}ka;>(t511v<JE*aC5(Ij5sG>4ce>*6441ahIO~D<fhnAr)!>G40?Z30B*7tvz zKeB{fbtyZ+S*x;%TJ@T?R)7@YgK&0kIL$kW{HM-i3Ye`&&Rbo9YLWmqG7h8IwH7H> zAn(KD=$2W@Blcxa+b2SAj?>h;#K&-EUJm2$`)pI?oiF0G-LxRHB42uR4ztgX5@>@j zZyiVP8xk1+^y!g{L46idRs=?BqF<%J?4#CnJl^}gQ}fa==;wMbDxgz=mCnNQ_ou&g z{9|P9C`^_{_m%BApr|$|LHISE8HnBcS*$KsYcwD)q7p{Tq*%u?$=x)A)Y7hZ%*YZ- zeZ-f+q?;>?$zmWFi1q8VHPg)+;j!$jp!_X~NyaoZ5i%~NpgQ(Zih0+Ba!17D19TTA zj~)e5tnidQ864!w_j|HlDkx0OT_FBINT?Fr&Ea=c%$Q~9up`Hja`3SyqR6P5OhnHk z0>}xE#da%9IEDpZ)v2<pw_TpSgD)jnz@R$><f~2(JOEADiDMq8e4H(w@jilzATNvv z3Z8sV&mS+-t``(5S}s}kZ)X4F`~LpzO|Wk<>nqhQX1O2y0vwA_VrF^wgTC*%cGA;Y zW1mEgjA%guF7bqfkL47fgIcLR-{vb@+X{LlUjTmyKLZ2)h=$+5Rp|Y{tUI;#A8xu( zaEFVuVYKxxKaeZ+jd(T@?X%6wS)X10ZGGWf(zFGrb1-_$I8==N%1XcqA6`kI4<HBv zI44QMqhg~_V{*u`2~6rKf30eeEOV9D+~mkg(%i~8YR!ZJT8)AxS>Z+`qxaGhbe6xW zUra&AOOoBX9^`>>bPx@VAD7wIhaj<-HNCP)GxUJ)2o~5j4&BO?un;kM0=KHJy!2q_ z--wI4if0<6&TnB?l*sz$U7-!UlUVwOM$9)0)18ygk7<6tBNBC`pig<gH}?kjn(-yd z*J|rdOGVF{G4JQj`*@L0n^|y5USw<kvP@Zy%H&NoP4RXF8ffi@dYoJot-obeh?XS% z45AkqZKJzT+mMQ3bfs#7Zx?6?tXZj^B?Lu*3z)GBksF+IeS?Br{ARDIvOFV&_L_qp z>DdWiAy?U-|Jt%$FxzxrT(GiDmd{E=dAwY|=)wLpDR>qLdvUDILOL29*K^km$Rr{1 zNxAh5iur&scgM@u{@1qrj=g_kEN%ELb$Ukzh!E^D%>u%Rb3Uf;t4R@HprhC`uE3F1 z#>*HG4j?^A<<}8#cCM{bQBin>U5tKvXAH%t*&?SgdYvQiA3l2#{C8CSlj)WnlE=$^ z###44Hw>NI1qO-smtqHM3SfGnpsV}}y&#dU1t4A^Zr%Yxi52r{pteBL=^c6=smOkJ zk4K0f{~CSTPB*%@WQ&u<?EE!n=8@d1Z%f4w?h>y=`Q@{fb0(L$Ud(bA!-R8di~*|> z_nMje=zi5hT7KpnfYA_aak5F%)H#=X;0l-n%oX-aYNnl_9mc9I11ouA?$PCb?;iqa zW&c4VliYnGRU=MY-!>2;x$JvtmB0A<YWGeWQAo#2OCE?LONQ~9+v5`q@55=HVK2Hj z#rkcJNZ5bUy#hxF$y2!6hX1q^>$QO)SQwl%5l6~lOz8reR86}dp&BLc$Vb{#0^^v{ z$K27<b@>BJg@rx&=@k;QNzp|H7IBrwvI`Be0s4H#OkGBL8H?oG#Red|FIL88Y3S5G zlp%wTcYb=Y*S?UdI)hiWZEKRq6iydSW~o_`r<&Jeb|bd&;Gbvr?`PC3fHq9!o@o>S z*US88hj!e{M%|&RySmjR%(^izlxk_Coi>R<d=ANkFFxC8Dft}^3q)z_dN2>Az6b*< zP_{^GfV@~bP74O$v3~qsVX$W&b|MYPFc(WlJVFZuD18K<`{R{pjbiNtd17`YnJ6j< zpf?$(Z$O9Jh<kfX3dvFA3S$S4c^OLy09RZRXn)Q7)FqjE(uucL^SpU!P|gvP#DBtl zH-~B~WeE%vDgb?35TgD4TAzg`uI1?JE3#ZeA$@><V*v(x({Nn^OivByQ1&HtO@*oU zB8>Khc|=;xANFPf2wl~AFe=3lq(C3JH;rT#Y{K;At8$)JSy6n>xCX*XyrUpl*Z?|z z@Q!i)P7@5^A=S7?29T9uGaT6xI+xvMK(fwT+h-+;GdioQ%KN1r5Sqxo4%S1-Bd)SW zCcN=_TffEGfK*_%R|$=RclB;fTUN=12y?ap89%@g!Q1dBL;>&1Fndd~UjYQYUl(?j zvs%6NXvhyX2%B+OR(x*#z$K*u7uG#z$EK7};eVGI{b7(LiSIs<sS)3<04;;q83_Z3 z;t1hkBJJ5o)OoKk2NUV#ZCb3L(<wZI=QK+_S%P90QQ&N>hZej~a}l#7BL!h2Z8Ir- zBCzWmoM!IPn1(!!+P4HHY9*Ynp6JDJao=nsO$uVi+|8T@Z_i)m&YXe7bX{{GAW$a0 z*K*iqEnfqyGQG#aMq7{hOf*5Q^Vaw0S2g2B<N>W?4`cTNk0~sE22ZzUjE@-^k1f%R zs9j&4!5htkMt2uH$2W4!{%14O5p`>3lBI9WOvao0*biwhcOkhLpNRZ`6t23it`)C@ zv}q}D(8i9yzR!DoLNRB`lApC$OaKWDUpGMY^Ez7l#d{UOIAIMhj3fALT&DZUn+Y;5 zkLNgG?kBmU@oajjYnR+f^6^Y^6x>$Xz@STe2E*1iX<{dw^4l{=kHTjffjDX2Qv+rQ z;shG_?B5p}Z+3+)r^KxhvS1V*&Pxb==lbe9*kBJt!i*hF)y5YmwN4x3T+5Z!$F~Pi z_;5X|c$cs3G0jt*TEvBLY}rzfJ7TaUal_jd`%vSBF0K^yoNwU~H5Ma6;l4xZ)fY6| zTI<+nPPz5os-&&)r4F(kE7+h-{4~)g_K*rq3h(?1YuD*+Jc{LIcKXYFHhM3qw*bsJ zH(OK2W=XO`V1XP~6q~tm<GXau8*zzI`vDRjv|=CkrAkG8^gTjw#7imD;a!V1F#eQ! zoggTD$$tiaOb)YEFDMG0T@N;j(^_GK%#5M)k0}VKF#CuzNHYV*G42}5#=eyRU>>qv zCS3eKG4JD@M93SO18;^)<NFH4!*Q^BNoB<j*I|TwFSdYM2yNSwMnd<m=V!HML3_K) zUrmUIyV<3x#Jh_%V$|XpUG@2$E~!C+KEZqEL3_WLW5YmU#Imzw@ySl1MypYUymn<O z*Bz8}zv_fsRvOMY8lRmGMEGevdTlBD!uWm4c~yh)(dq$t0h@A_VzP78Q>e-}-SmxY zSwHbiJwjw%a9Gq~Z3w6Dk4ufFcNQ!i`8p;qg9XTCWKuqPB4+LiGwgr!dINDX<@Z=2 z>lKpi#wIOPddbfxc8?(7u4y4d#+mb>^^sPSJ9F7gOUDLjh`jV#%9y)J@BXYKh_^`O zRgsn-gEw!=+7-tlH{=ao0F!R|9#zz;pvO^iV`l+~Y_D#m+q+_Cxl?A)vk#i5-{i!+ zn-x~`aJ6-_8QP^0oTL5Xb6WFwg-*Snk+J%)J&$UGZez7ZjTsKV6Y`n$kJ<q5i67|+ zX^Ydp26|NzN)iS&pw<gtKh5aHcTL}AXI3w$RUNoAGWw=|{Ag-p$<Kc+^32|zv89Qx zDKy-7_Q2HrP!W^g3qidzvkwM(UfJQN`XPkf{as8tfqSCf@le}EG0)Ro#}x&7p<Fv) z?s<`@AIjQ`nf65yiP|pF*^8K<BBh0z4H)y{MEC|Ezx@4wuDt9cyiF1L^WCP1woF*H zYsnVL@c7U*i2V>WcRDu5@?u7o9<`CL56Ye{_=@0AKJQD>ZEy45Sd9{PnEU*_GzXZv zp6XId5C9PRO6~_gId0;B9M-^BNfyARi9!=P47Z2`aRmnAfLIEG<2wWK3U})l%#2Pw zkcQ{ypDU1cV_TMzU%qDpcF|6oE?WIN#^>pB2(45o*%Q~D^QhG4ZO>qKL$}cJ>0i*{ zyW6-vUQ5n3_~`vcEd6Aa1p0^&i+M+t*%XJQgHYxV51!AF_G|3zD!`D1A-e|qvG$v5 zilfmP_E+V)e5+BY4`!W>^WIht4qB%CIE7~4Rqvg6bjx{-`!j`a%TQ0P_`M9O&Y5F4 zlwUaUW2e#ws*Wy#E8=aMyH+b1*yP7TDqv_rlG{MOLtY1<rRW1|-O-E5!Ss^bOgVAT znHHzY#_nBn*u00UAZ&Wl)TsCY6&B{&uD_Vr+kos{D1}6|{<aM`1jhiz;1OaAjIt7S z*%#X=4^xs4d0LeXcr_bQO|_7UD5<5xsvT(7WH%cm+_<-TE17hq`C{D|5Q6fHT)gOG zI{Lk^4B!W7G2W)6lB`_o6SZ;p(_>|6{t}c2(ng=_D{vQ=`eUqe?Y2X-Sh~7qu4GQf zC%Y%YWjp{aC<u$nVbjy1XGC7saz?Z}<3j@&Z{FKa%VIbZZj_*Dswwt|7T{c+hPCsc zYBI?`WR}~ZsOR}9RqG0x?|=LjY*-GX*JJi=Ls2PYb<`ZmdD+ZUxRsQ7Z*5|^12@w~ zz}<!`Zhg(=&e_4oN2DqXq0Y><RP*Zn1}n-v6SkIX<0n@FmpF#+03#I1Odz4j(=r$C z#z~XeriCD(e{3Fu+xdJPhhST90*CkujX+d|R#oovZ3yYmpgxEr^?Su4{@cXjsT}+O znQ%(!``9G;NrCO(B=v3%TV-Q9j>cIf2Jc**3%`^}fo~>`8Ox{v8s`>$VeG0F48L5q zT<8*v4k~3S<31VqUg0o8fxptm8OrZuC1XBa{IuLDw7)IO`-EgDMQD0#HsSr$NUo>n zyp;Gg3G9c^1srIM$t%-=hJIu2ZQD;RUPan8R1r;;>rGVo%?O_5DO>z#xgV*-l4LLz z$ku+zDV!La>+tRB;^fe6PoVcFS*iT2gDLz(py?vQe9)^^yUydOH}YD>2|j9AD5EX8 z474ao;0ez714C(LvJ|h=*M_e;H`dGN9V|7QYE2!rk4N4=;__&Lm0JJLXiOV<i^lkW zIQ<##`g|~}GeT+cl~55dM2-Y{CpjmJafV(Y?$sd0;lA&~XRUzv#~jo;&0orlyGB4v zsZ$=vx$%1L*_y5S_36ElBQ9UezWefO8U4^;IJP^iSiLuLO=NoF>O9oykb{H6X{8IZ zt=|%P!z!ew)LN}*!#teQOoZ%#>2TZf=@n%BIxN+$D>=&=vRne<R*&L5eIB>Ix9>+D z3-tkgyKw04LLN$7dbKnekB^|UY|l+xf80h$FL;Fe(s5i@{Qk02re{&FM*$KK#2s$a zeC6WE8+Eb)6uX|xrZ~Ktb)byVjzX{bF;sGI_<^e1^To=-!{h0+;wD><_*aK`4+s84 z@PQKJDSMzQ<o3Et5w}Gd;Fz!xuCU1$`){*4*Jr-$Su+j7H9D=js@$Ko>C|*83L8>j zbcu(8oCT@jQ4t8}uwGDBnS_qyO7KEtKvP#xJ5t_YOb)EW?%a&GiKvruf@WFsIJ*{V z;FjWpF(1bfwl+sulY&#iXGVL={ZUzkjU+HZR`^xu2MKN~QBc8Ak+P<vDg~rOcBjPJ z%88hcQC>W^yu000aaa_fF=?<V#SWP<lmLBH^O+hMaRx{YlEd-j|K?D>su8a|iVR1U zAeQD{reJIOdbxjbY+#_?P=f`NTu#u@RJ$rU9{TFj4)^5$l43hSdut(dn<^Q0KRiO# z&9wOnTvZ>CqKlfK?T$9wi}Tqh`S|YQF0=wMTk+2B{wtPW1Ke1gJFa2vd8_HFWDfiU z0cn#~;_IB;7X2-ChwrX@w<a9=qn~P_*py+_6}e}unT6lrUiId$XE7H@y2srm|8}qU zWMWssv%{yYU+lhs@;+YO;P7fEo`%p~d#~bI|F!?6EMx;D<ANWs=x#~77;*iO-~HgR z^~&HE>aU5$)mA$-mSZ|rI#pJX6yUPD?){LU=Tq3bJj3RrLr?)_=KL?3vUB#&HV16s z>nSytxHT?2+LND8{o@&J^?$%C6A}-><1=1P*Jn6In{Qq*anShbgO8<I#Ov?_IM8;{ zn%-U;q>s6>PnEuk`ziA!O62^L&&`f<`##mBfpUrFo}hM(3utHQ$(M_h-9nW6hg?-> zR{W>)O=c}Ti|MkgnwLA%csM~b11U<PM%Nd6uNb!MQ^rk^yp}3;kEW87g<?Z`bkf`W zf;)~kr}Hj$n_*UgmrMRpLzfv!R0*sV?<J-eM?+SWyC(9y&-r+?5O%K;{*JZ(8NxE5 z5QqUXcEVbD-uLtyl*-j03Wp--em4Rb)4Y!uoA7zNJ*#oI7r}bypq#ui{Z{^|<p=sV zmxp-Pt50;HCT3jCpmnFu(<QIM%!X2o3xGtIO%viHwi-zMHDQ3r)g>1oY#fl%N!RKz zmSo^#v6-W5P+<d0#3JrfKD<dExpCcAau!sf_H;@cfRVufL4~0ksmw@2HK24QRXV~a zBQ`b`9tpE41kz)lm>o_6EynXPm)mpr6}#AbP?vz@96@j?SAjAQdC5YJ=SidanQsmS zM#|@kwgZ;>H?V#T#j{<Vj^l3%kGOdk6?O_)wJND^qTKIh0BJa<;l}mk8z#*P?U%k4 zx^iJDAF}kwF|HWM*Lrvsm2w`vc%NK^c`0Hwft{9os*@blZ@=vD?GX+84Wkd{;)i>j zdr=}tvz?`Clc=Bhjh{llYzUsJL>(*c%b025i_mzUZ0CfrH^IYOdd#M_NQ#f$o^36Z z^7jnl2lR$h$N-(koa&&_3NWCJ&-}SyC!FX>Vv6_EiSr+8iqfp+&;Ovcw+Ye@x0L&0 z5AKMpoZUTO<#xvAOa3g4-a4bwfg8hrzGQeIOTiD=6LcX|$b!;<GLUKwG2b$*Ij&s3 z>nE(~5CRQGHd~LAdW6u>pXcIIbb%y}D&@fYNl@gBbusK}dp}2+o{%ZQk3>HMXvKhs zeRa%RA%vSgV3uOEZVm(8)<LuF@N%|UCpC=D;=y;IlQ~JoA8?)H@r%PMkU8;9(cTN* zQtWMnoeFs14O^h_8M<z|$RpsgtrD-G-N?y!{lQ<NAM5Kt#XoC>@ZC|BZjSYyNgA3E zoy6FOT+bmiXZ|oR<O2m0rt8pxk7wB9B|D$rEe8hN4FMSEhdIM9`PDM#ku0K4@EIEI zc1uuqcUJc1ug?@6?0p}i`ECYth5$`!{>+kuGU>8m%U`v=`WzFN%&zWNtdto7tj{n8 z-Q#NTJ}BxIXuVm*7T-_JxK2sr*_quoVRk_=%SNFbF4madc+;wj!}7W)*#i9=Q#z}r zO;cU>ke92iS2yjs>#4MMt1%8JLO{A3>mj7N`<u#w{5rnu?5rHIjY`?w7bV~O2JJ7d zt>f8kg#nVcr}h_S#Rlc@uoprLxi<{9$hC8!GN2eXgZ(Pl!db2vq4T~!oc(Q^8VfAo z5e_JTNPry!_2*ml^1aR+*1Q`nlWbRm@dNC6)>JDZb8slGNi>_9b`mCw9X<Jdwt0n) zf7bZ;A_dR2*h{)+KWIMVI4$E@G|esF<7ogAw$EZts7e;IsmcuM{q#Y6b0I;Y_yI&p z3}i3{R?7qDojJAUlj-rCdqF^*)B4MvdmHl&`}b>22Octz>=7lXyKK+<%|Tl`tcJ<B zf0D>VVXbl5jox99OM*ZY5+~5p`DS|V2@kQg1<Q4$ZM5IG<XCitG0g)lcTI)8pq}d= z&0vJIziIyuzpy|YicxR8c}vQ3$A@q_syEs9PG5)p&-N%q=GGoPxV1-XBaaO}sd*i? zmY$O`>N-Z6P)38+Zt6a$ps@myHiel&9%x%ss_nFjkGCh*3AlO&Q$!}R4%eidT13BA z(QSRXo@~EDJJ9s*!SCBPI|+|Sy=wh9yPfq)av5-jCd3&yR@z@*YL3A#4?)!yOw-e* ztcetFZ}xI-@*4XezvCH?64^&x@af%=_GTuEi=yOPaly3I3GTp{+gc8?I4PYqjL4dr zW)0`DTM}(LX|fcGy2tYs#Od~I@!hGpNHbx;)e^=G8JEqII;+|7iA*Zh2Jrx_=N{W+ z5<gC`DuF%r$k();t7pH=Vol-017>pbzxOgUmY4$zTQy8iPD~0RmhK%b-CUb{6<j@w zIOp<Xc_cZFF@|8-;#hM+HM_p#ni5*4<Qjt6Hb<CUom(npIYed{<bPlNTIyPZMNE%n zPBP9vyb*bu``w_$S{$ih4DQf6U%q?rSuj5$BE+Wo){azNNizBbTU^NNY%|>x>LN7` zZl8qU%_00}_-k8_5Cn37y&miR9Fb+k5qar^4Q?KONw?dk5;{DvI6biXCS6F;hXvV) zj*mXGE$7+owDmYMNq;5xlTdUNTop?N+OD~<OXtG8voG400F8En;P}#P%Y(T0<J??y zE?ebw)?fA7xWZ|ee#Jy>rK*w@@fH?Xz~laLJVd+jzo_xBO161?@-00I?udO!_UV-@ z5Q1R2zBWu_6148eb9&wQUZX-@C{)D#qwvikHj7TngF0)s2y)-Qxb}h{xi*d^<mv;H z$_!l;1_H4CUpQ=q-ykd$7h=PTmmqT{D8zk1q3E@ub=DR9?sc93PXd!#N3B@-mG$u+ zwArB5Vy8fH>G-O_>n}pr=S23!+@$5pSKl;VECYmr0x_EsC=I!*jnQkNP&oFZ)AOp} zlgRPmuOZuKCtRO$2%g+MjpZj*-@!636fk;X?sT2HUuOVw61cyNzb)vG@oOVCqj$Q> zSm3?q&Z}B)n9KF*jp@kQeKj+5Rky{qtD|`?|EoTz{vlB=VjMECQHHs9-uS^pzzKe+ zk^hbW=xcL4w~pMq(rNX0;gM?qUKKzFEY}+MDz*EZ>^E^8W2w50b<iK}3hZ4R4`hje zaX=?1Bu_M=t-+(f$e^ojzef=Hgj~`fLE}MX!Rve)?l9Xe?x!0C<veP-R+Kni=kEMI z^GQRx+kWx@O(8ddy;0t5!{tWnxWCA%Zq9ZR`l`z4zK4g3ud&B+qoJbo^~k_W=ijqN z|8zVgAKWJ9vm^dsnZL?&scO;R_q#khoG=J`SitnL=-1<1J3vQjW8J`)qsGVir>uwV zil-Q*n2GL5kSy_V5<6JWdFqwM#dZyIpq%kVa&5iWET?u4YL(Dk&eA!q3cY4-y>E}} zz9q1#FVjlB<1xRHOdQSfxr|v^S+UYAjKo2%JDkX4$WC4GVLP;*ALGp8*mGOWh_>IH zP?Wu?>Df?^49THZp{39PLcN!XQ&L{TR<kYL`!S&c!ok73ZENXY@ww*_L_Cw}XA{b` z)-djkHBJ5gWa^2v<<20B;q6%;=-Xh-+cJ%`U?}~PdZewO2jYtu*BapDz?Z&`+KPtV z4CCWfkXB3I08U;(q<d!PC!+AGFx!=o2Yn(V=_xiYibs6w^Nu)~eaYCRF=9@@RLo+1 zo)!ku=QfH{pEV18uDshP=<faOygBtnOM2Yn*b`2UrpcabmjH~<TrnGhUk2g~S+?3O zi?`8i5C+X`q1!}9=-9L-=zGkbf+r^T+6&Qldwt$zeRA-|31qtbsjjSApVpkRWR9ZB z%UYqyYbyeD9`?UxtpNHC`_y!bRA^LF!gCjF8xw$mVU1^XKpD8(c<B-vg&SVjl8}d9 z^Ohpl(_Fh0PE(9GjROg+jCvWT!sXty0<OFHz&y8@NRZUWYJ{BGaAzSpPChX3w12Sv z%|saI^WvH_uDk2heWPQKzm^irXXPwkhYNq6dvohz<7{K!oDUp|7^G+6AkpyG5ARvV z4W)6XY~B0LXyF|gILAJ!+am0^FAR*RV}9`qeG^zt_OhizbAZpX$Q0MAsa-q9{?13j z^7`ip;@)LS^IWNzk+E?xvw1>9NC=Hr;&q>8;ajdJ=H2rX{FQ>~U3V-wTa?xhJW!^c zbvrc=`B5xmj!@U%47@HYl22gy^n&P|ZFQRTYNGSbBE@Zg%i>%@RoJiNwa6XV2A)2} zY!=-K<@~y{^!GrQmhke!>nPhhw3fxd5@y+Q-sFS0C!7bdw>*Blm4-oW05nbV=;=x= z_wh&T3Eb0Yj+?$r5jt%>UtMDx(y7hvX-WLl!e=O6a?CRfd6=Xx|H^$Rc%*LU(t~Ze zZsk(s=DBxE=EpZtGVfb0M;P<gQH<_Xd@q9`ESH;wx7R5gOP5bO6!iyIJvF3*JFMq) zZBFQqHy6Sd)7tiQ)Z5Mifs$mKf>t2B(YEyNjWzD?yO2L`8c=By$ga4kLuEtmj)k|2 zylt&C>c;wUSUc(^;}jL(0_0HMj%*)eacBU&*|*&*=&H!a?M5@BPbCfPWcEKOZK{c{ ze^-F9(I=KEeBOoTSZ_6K3}QN0$$_kaO5!sZf4y=xbb(PtNb`WK(ley%A;ld0o;}P< zJBv!#Z+pdD9&@d*_7PzpTep>RPo(kIGOM>LdjC|W)-&rC3;>x{XRNEjlrB{OAVJPr zN86dUjfUxYJuU}olbZ#ua~+d{{W+-BWJ1urx&xbPt$|eW{13HrS<DPGVl;lA!g$sH zL>Nf`VV<*gU4O&>u|H0S1)Ke3`ZFN?mD|)wya<6**4X$<V&N3GahfJtBD?MW)lA9d z;g<pev(D2%H}`!(_A?KE&4Skf+D`kkq-hoz^88ZZt80P`{)CUFKLp*2y;o0^9;DoG z47Xe?tn9%}P}(Lu6_gl&DIRH2O)uJKQ;_>az3*^VYwSlD_=kHRT3{xAfNjnvYLw|Z zoAYCapN<bHY}joZim&}l<#+*t<wk_Tv#d96W|y5XatZ$p9<Hk|Gd2zebSCDew%$z^ zRb?Jx=hueRbOwem4c6=2Ya9=b>3pDi0$Hv|eNqoKj-d_MfM^Diy%HH#@|>g-*nwBk z4VmRtw4W#56kT-h?!F<-MdafN7q}lj%s*(n_#sdv7uWOL^SkZQY@q?!1^rOkn05W4 zxaa9M#2l?Pxde}RL`Wq1TOzB(Zi6^+Ca*o=Q{BpEuNE)(E_Tn-16+HKQjT_rZzu@9 zkc*T9Z6@LJoP1<%WT2b){q`V_j(2@yKnDbehv0%Y-blNJ@wxS`VCv<5VWe<t=u6^j z#~)rzbr(aIpT96aIy`r~CUUa&SO9tMuXJ0$5$i8Kk(C53XRHXzJ*V-|f4C2ScIE$t zM25Gb?ZVIgjCPAvf~}SxaTWH8nMu?SA~$66P%Mtl*1g*CLh-7Dsd()~Q)ji!0ujW! zA?Ok)u^eL6{~up(85P$SW{cwPPVf*UxVw9h03ktwg<v7L7w#531h?P>2<}$6yA|$k zg;V(3=XBrh*YAznqyFz2qh!tX&2I|GqX(@9Uf;#-4q)x30P0$qwz?5nuG(>{|6u^l zj=lkxN@QR=tO$)_dW8oxfY-b=CK`R8Djl>RN@1TLs`|PP*{lnq7@Zq01{Q@jN8aO- ztt*BSu9?V&P0e$g=36O?J|`^Wz6m(ZsKZY0v4zJsf26RVI5X+C;Wx>9L}7%Jj^PnL zHDKhN-&`HRaf)KsG4!dUtJ-XJz!Z4G-4g~s-7MK@rP;=1CovK(I?#`z(t!LG+V5Fr zi#6##fz?!tn=fycuuYb1k@QT32yM<6z0lE2+%K(bQfjV$%;%F#HVyA48_4LVdfO6) z^hZ+-Bkf*<PVC)C0tCtmq^5{YxyiP(b}dyXzT6^%ZUE(eGXLHC295Fxz)Nx*jlEcB zttcCc&0m2%_SDJQKJcPH%BA;Pn$7DpWDk213x_qe7^k`tu-PL=Obk6E-V=sj#npy) z0pl<rL-6i|1+a;_U6ILxdS1fR(gbqgRgL}$vx%aDa+|GU7n$uk^HR!fI8YBC5V5B4 z2R@O%iWvXqohA9pJ1=4nP(Q4CUaCo=c>%s{bw?7XIOG+l{Rukf(U<2I=rZGw5?IRF z(Qo(0=Mml0a<gR@h3Yh*O55`%`h7~eK0x~@(46gQji$ZzQt7b-L|RupTd~u>EwdcU zgZ`#4qa!$R5garX@uS9hF|}SN(K&hDZS2zd+|5@OI$$a#n)XNY3QBff_p#FknnqtP zEjQUESZx))<pf_~Byt!oPD@yhQ8s5oNOi#rU$Y_PdK8OQJT+t1GsXBmg03a#Va~tF z3CFwN(r&$f=j-QhwiE)HHwwJOu@)HUD9YYVr&Qy+9?5z*ebybu-Egg77hH8f49LLZ z-b1YDUAj0rWS|XS_2{R{669327N<VAE+66N-9s3tZIl4^lZsu!3}eyoj|&fPzyh?I zvVm<9Hp{hxm!BCr!LUc?!^;8sDL!+BH635+G6m)}s)<owc2U=TsRW7Vlpn;b7V=l0 zUSM19&0F<Lqaq)ofDPvG$hC6c1kWD*e=5L(rXx_1-mG0M7X9?eC-SrU$1p-F5{?(4 zncU8NZeqW53|OBwBSty!)gKWKHiF11hc{)sCzD_Xu06Knqa>-EHh2-1$r6!Jy+<yT zLlAAuOw;#WdS4^k{iuPS0^4LBI2Sj=#Sfm?ZyZfz4FR37au43S;r?NiOsf8JL_GW@ z^}|zw_9;ahH~m9q6Zhm(2^jIj+=A;>VwetF)gWiY6p69b-j-0BW{UJ#=0jnw`v1I~ z;>*LSOqJn1uquH1RU(;>#~9h@`?I#ox-P*u`k^|4njmPrkBe<yea5>+F<Z&XOl>>8 z_#eQc2fU)ctlZ>;`tr*A5(05~GxySe2yg=v{MZ$)oBm3VTNgA|w>c|LjalZvnQz+l z_sCG;({M)O_tOF2Ru8Df=Nf0*9;NP10te0#AN<+B+Yg<@goe#l=zr&{r&67Z3NwpA zIh%!Twrkq=*HFC}cFM#rd#RIE)t9jHrc<COWJ5%za8)`ZRe)#^C-*E^aCNig-Am>v zUkJ09#TDrDwfbQ?@$!5K`jk%Xt|;cqC`Ifl&-r2<I0<^Vk~CMbBvlbZc_OTk-S6qx z7m#+<J#)Z!{csQy3#>8P1d^bzrm;ztf~8SG&C=n|6UM5qePaiEUc+h%T#u4wb}xpD z$p}Lb2jfVMH%04C9Y&t+B^4|`l`0$i++kbNr|j%cm!fIHdLlq99jP(WGNFwT;|INe z^lDJVZ{+N^Zbmvtzd=`h4qP=`{+Cl*{-0A@=s!;F65!OnNtx%0WCQW1IQWm`E(uex z416*Q)-z*b9Zp4vS1SQU5M-!b6O47$#FIGh*5v2ENr1m07_0ProaeqbU8P~%`V;l( z&j$vU5Ny~ZxM$6;=-H<h%`)b%QC_IyTD1o+Aa9Xtel_*B8Z52tsK6a%t`eUs{|As8 zD7eN&v=5LGE0M504%^TwhR!HHh`kzMPo#dMZPSDL{>8~n-)tJ;9lJQZ(e+`bBEVbn zENHqPuiI!xCQqDi^=r8Tu^?{}-|F}6t0c0SqrLg&eb$M3H3~6)xT6tqNwFtObuv|0 zLi>rNRQ+kZM43V5SAN^W%~W&U(KjG?tzLiP`iqhjn%hPQ=@e78k45!vAu;71<YcAg z(!Sb@N)XRZ8V|kpk1?e*O7HG-lj>q+FQfImXT|+(2Kzr<az>1bw=mP#$s!;)xAp`^ z`)kYnyf)u>t^Mj;kw%!~z*eY1um-Yu8=yvHH?X%tYV4cJSPlb2{ct6ejO3Us3Ce${ zwfdvW9TRxBBN1dsQjs;}&3V-z8KdrU9Z29cDSX{%b0P)X4SdEzH?IK$Mn_P9a;tzl zSHMH8<TKj#=AZtfnx7TyKjQ($q=H|Ms#o~eku{Jn4#K6S=QSfGY&d`JxJF#yl$JuB z#Oyh^LNXh~Oy@Ik@{~w;hfiLu-(aVfrvSEVzS$fJ0-B0%u!4j?R%m8^pDmMT+EhOq zb#0hrq=xv6%I`TCR^YMzIy!=AwL79Y#a<n%fuHYLWrPB^!f@?KFs*#wIWsx`O=pg> zX5f+8^o(#OO6^B9k8wd+S04Pp@W(E*`7u@dhnr)cbF09>*$KnNLYOsa^@+(yO=`y$ z1#gnTg(WkO`J&)Ul2GaaE4M~yV8x31VJAUI7&gs&h>`o>1GmvxTlCZ*0LEW-@GHm? zW3O(5ZEs5HYYvd3Ik;ZnHyIHF#-2tp!e~Datwuhi%7u^97|7Z+-C2N}exE}XUT)#b zeFkh!8Cvc#<_Xs?$>nC7z4Oq~suREd4RI!h>XlVhws*Z6w8plG4Y__*j$QX1vPmHX ztDg9J%EM_;BzXCGNJU038FcM_6sSi(pPh61eCnnkk%x$HfdA0j88kX7y}Z@9gqV^d zdeDta<*M+2oEG`OOM2AN72+ef>V{Isl6~%ZSS8`ZhMfu_4OTN~KtQ+ad7W*3hMt6m zwx%>jb&mKB5NI8+wxg@QZ728m9C$4r({Dsi*Kz?GWAr+4g%r%rmUT)SJ;ebDhqMnD zW=7D0hH^wbGC|cUUc#k+=Omukk@CyRP`y!dLq|h@gHb^{y<WXv-3%LVFihX)0HAk^ zBcZ;dyF(Vj95t@H?84mU`pol8?XH!~@yE`9=$m*J@sS~=ip3bR_uQ7x46Sf!%@@;T z-J=fmH}glbfUbR{wZhEql;;-|XWtr})TjqHhZ(TFmu>kW*6Y-Db<OHuJY$)Fm5itU z9~b2OL^RFTF{;Zyp&d8p)zX#^^FB7>EyBK2ipmFDvkH<`DpUoq=A$#>%wK23@y)*` zR8|a|ALiQuOSfB;fz7Xa!1>U|p6mRuC{cKNnlePEx3R+%)FFRpCs}Jw(DYa29_b=v zb(o|$HYxz-Ci#zYzkR<=If~BlOW3?^%c*(I3E;d>heghR%Oj#`seMph;h4m25S)tY z!jc(!YXMXW145<$1~EKtB(n(0D)^s>!#d$-u?ZxA+atYlgf>Gjq%FLwj&-I`<<Q{k zGt#5asJ+X9F#G7lL+okZpGd#oUC0>I(W7?14v;>L=?Y|`cRZ)dUF@++Wv092BiwmQ zKKEuv6}^ot)G+W~OxJS~(G&s{HBoE5F4_y<v*t5Y!;AD@MhXFm>z>tk6pt>#>D}yD zQRwW4QzJ>A1D8c-p`B|hw;TD7MY*v`-T--j?>5<xnyOvW-Z{qmsh^g3!NZ$fU!W-6 z{zQ2of2HMi>sN~Z+V8*wfEh1JZql{jkTa>k>N{&nLZ3QGrEPQU2J>wuY8EbyHn<cd z{Y{&`FlYVN1#^G%%lNJXQM_2X`<~D82HHA#;M~tBw~-TMTxh%W!9M?J{*QQF8;T#> z-;Luo`xM_tW6YJ8FY3?TIn)dps=ons<<!`V+awTb@s`wHHPHV{l;mO<j&H<PAznxr zj$fx4t?x@)EDWc@k9_S*RxmTxT6b71K%S|j<S+l&OcfHd*=KEiOMgN^GeGtaGtR3D zJN19wr+<1pC18>G{QvW_|JPuG_wFC*jI7|l(iuw3kbzL{s`zH>hVm=41iWQAWSiH( z8{h6nJK76vGuZTGi@V3r)jnQBjAv$swD~WKQbXfz=C@*n!)ns~iduG(^eK5*t5sL# zcNA)xzy~2}l#+i8W{zKbvI^55(zns%82jDHt6trR+7k*;$||(-1WJHjeELI&R5-ys zU_&EQmx0|M9;iPxBD!elz*kc$F6RuS59Yauns8=4Ow?XtK>IXkd4%jsO%?k9p5Wmu zWM75RZ_#Pb(0wXTRRddrQ9VnwI}}T8=Z9(oEys*RiyO<5_gF3eZ)3mq1B-8hYFMF2 zNK-=)twNzUxN(%=`$JZlU2e06=8KZj;!ma8V;Ox>)F;WVq)5DG`^0w#McFWv1YT?t z0;G~7VJ)&vskq4##xV<&uBvdgIsa3#gxPo>x51wb!N*>-;4cYacG~v#(QPw4x^Z!+ z*cQDUKAueTr8U!L4DQow#(|)e$mi(PH_^hcyNQtAB-t6Zd?zXL`9E0zQ!>64Qd5f# zI4y0dD~uRhDPZ%jywxev_1y6^NV~)te`^>`S9c22_r<bAk=_um2b$t2Ecaku!Arkb zGZwsz>D~UgP(vzj+{9=Xwi0EcG)ne@wl6httlyuLS;B(+_tC^&wjq>q!f{ld&Tdss zs%{~wJ6oXj=La>a3gm&Gw1?4T!c+V2xhw>EE#l;S{RSOD_#u)HS6cTwd)ZdF*_MEU zHvdKZD(+GuUEG>vrBCikBOkb#@Cl~&L_tm|vnaxuUju7aUS*=bqx0c1<I%XSzL+g* z8^XP2rc0?^OS9ReOXVwOR_(HH106pZ-rERSN_f8@zB-#pP}q?t>f4jPU22~0Zu7ju zR{|oW*T_tmjkQQdjA`lA$YYK^6+?9Jf*i2>_a^UMkJPkfIRkCM&rkbv+s^A_qNn)< zgHUvUlixoG;B$dhetdK5;ce*W)RB;-$9n!uE#?y5WEG5!B7rNhXX9BB?ae>C*C{pT z0DPhxwZQIptWqd06wD_^tcMIuWqQC>a<v^(H6G#o=zU^ZeFQ-3+QYg}^Ev|KZMDnk z{2*TOiIC9vY4Z`s(751dxUm6|V-mb*N45B)(D{HhmF`f&a_M@rU9m^!PH#z>0xF0h zxXhdtVNz*3&AMU(a=~DApJ=KO`z~=(n^J1(=`J~2jc}pT(K&JMuYS7oXYaGSkdd3U z_vfpu{+ACZ?Q=_JoCX!Zs=qnH)g%EEyB&A=#Xs0(NCU#~zMqffznDuLIS2M3>&Ai% z@mi@15iF!@2#j}+wxZj?nGmlh<YR-!G~@T)Y^FwT8HES<LMi9-`w@AIX?2izSUU3h zWjp7Z**2R|jg*6J%jU)KodTz|8ik+}43;qHosdOR7|j${Qf1WFv~au`d4OURwr+u5 zkEDVmm#s9qk`=4dMw3u0jS&1L`f<5tJk6PG`%WO)Sh~&gmS;`>3v{|g(C56DwD^@r zz?!1_d9$1uz*O@A<wDLi(Io7jQ_@L$dSG?}NCd80zAFq`ymNHMewTI52}Is~n|)%s zoLjGE3e_ki5iWFE?VzLC39nBtU)^iWg`VL;MC@N>FI^u&6qP*VAfJT<yBIcramOep z<G~0@wH%IM?a=d1RW%>r;3wmJPn^-WXhm;1AAJz4%?#|%4H2OX1GO~1zaNAVtJ`AG zYN^M6T-#ZUhj2f(6>05_?arSeT^z;o`tlv6?s^}?vNjoqQM`PFlI_ic_>t!rglK4C z5;0ILyyX!@!S?}XH$LWpAhD2(75J4C2!ZW#__6r2527`0PnSE<vV$y=UYMgPff7Ju z9y_zm93@5->>LFA>yh+lW<xRnyrF$kHdAsDVf(ggQl97dEx#!HBIsSKa$F?wP+xnx zQwVsmEs?s0uY|eFh}bTLiXd%CEf=V#=O)+x;*soWI0AG&RV_#R^a5`;2sPG!Whv2C zOr2UU0S;)yg`6-Trl+8GdTNOq$Okb@p06Lffrr;w{E!=)Ozj5j!lp}9*dk1mt!7sQ zTB1{Ag!(E5{+U|Q9({R$V)g&w$ws3<(2W7YF>i~{Vu{0<DVhHp@qsAZy!15JoK}yE zsTf4j;tzk6ExyrVq)UF&cX2=cj+q_Q|KU06r^n*XA(i#M?y{!-PO69d!}H12@R0H2 z<8pMyd!nQ}64sAVC5hsZUzPhbR3pfS5-4tUE(SIGHq*g{XSi(_D@JUotU(OxbALXD zrOn#yV%;3jWNUcK3^4{dvp@<8>%1v4xgZs!FyD`^B4*V9TgfY;>PDTNNq!Tu7dqvq z`Vm{ZOP+{BGgk<k{HB$>-gvF(F6RCjDo&;lOJ()E?`k=R&8I_$5lh7z@O&qFZD`!G z>=Hybz+qS&_2Q8AtqaWq)O{b#=hSnQl|$pzN@`DAGU%7}*x~2@xDNwH&ud8EWEy|F zBo!6Cj-3h5O@Zo=5tkpGJwb+<>VNv4M%_&%6#(DUD|?rDQ+I9(EMsc!p8aLH4W|2> zoJ0PSa~iv~^K8L($=)Xs)NjBu2R7(KY1=HvjaHFdBxg(gIM%GZMB5&xO2<|t5QDi6 zai}WttjpU(WK)Z$f0PRR-<5TN|4z2~xxlu&a!<w6HwSM4?`V};e5CK8c5^Xb-=@T< zl}`vEx5wLbS?JYEA82|6OOs4)09P{2EWDYP+r6nOGQqHNbSHV*I?ssL)F0-d(vbed z6Fq2<j|JS8qipO|$)I@IfOmS#T*e$4=9Q{;Sih?F8sQFaTfmGk_=}dv0E(N%c&Tvu z#&AWeO&GfF?Q0DBo1%<>F-G(j-eEeejlY6LcwZ24zK{pf!K;BT)xtD>jKVTSU2_v# zJ=T)wx<jV`Hq_+f!!1<M40}CrbWiev(HB2XipJ|o(<+TXZVc)n3y$-VMmq34`Wq9g zHV0<~Ef<BF*;op@#c6}HMP{u`Ye1H(s^G9e%h#DeoRmT=xoO%!x&BM5=U1NXBT=Ek zfk0%;Vu}QplM$y+<06rTYT3JZ@1<6of@;R4{~NBC(x0WzPUmyP?OoOaITR{4XcmyA z8$-PNuV1*&-;y~Jayq<!eFWtsc}L@z<#Q_R+!mKYl_C@swHWs<gI`bSu_E@BylKKY zq49jXG9$jfm@mAgT^%ygrQYB|jx<s$SE|{!hsKDmJR`5@m)JAE?B%|m*c?@Xu=VBd zDGCDoqV+TBT;x=8?r5v@5QkkYeVL~A&>&`;*pu=gW<T77+_^HNtrQ1p|9rhX1#Csq z;!SxX-@rkuhLtRt8TVWH8*sUy-6mGIK9!b5g${XB`|IIj_rdL=@w?Bro0yy;msPAF z@uf>I<ZRNs)LM@y?jSTxGS|4xNN(~~72lM5M7ow@cG@yJEywuR@-}tGE7tF2ZbD2y zo4(&UA{^+dH!HMPIIHWg{|8EqDIZ_E?$1xU^qz~2=DStc%(&UK_!6&ad=*-Q$toED zk#OEdVz7=NU%5MAL|srLa-+#!>9bTxrm$0$uScmm$nt_#8D@%<Z_H~Uz~e8e5seKr z_n>DfFr@Iy<V*fDWX6BG!X6XA>{KJ<uu7`dK@`EelmO~?J{D^P*yG@<(*|$V2;@EC z@lF^lXE)KJx|?iLmt(%By?d6h&vHi0Rs>}-3nu;<&$gZ}R43I*>*&AUylihn&n?rb z$Qoq+z6Qsv`<nKv-1k!+u++|Y26;P9f*YOgiwV`Y;Vt#6ow5n{w7QuG)hmiFy<ECR z?mkuP(ak!PuF<cReMG8Rd;FvNtrj8cDDn^kufKnST2}+cN$D&o7$ln_1~Ttnq4IF` zNK{PXxY~wGY<%9^C}cHkag|l_y#G@)f}O2OkEISET$tx+%bIAZ_LFSG%Hqnhf478~ zmm2z0`lATAqoRS`{bH0Qj@=+%?P$(>E8cYqtMNaOZ4CLg%CA$9^PoGMwBDcxBI&LE z3z}OQ;^gE1LiTL876IOpM!7mtOkljb!6KKx(6U(5abv4!_9+VhmUG!pD;PZ&6fiFu z2~@eW6&nG+*yMDv1!#J0dxQCvC&SivkNf{}*q*Z{ci`GICZY<s=W&=TT<u4qhWFu# zhW3Q40&z(PoDBDXv6kUV_l?&=ud(t~yr<Lb0h1?;HVd}s+uqx#PVaV}?9ss@keYl& z*w#a|CUqm_Ic*%}#?^w;0`a%HPLOC4zgLz#@6^q$Ir@5A-HBTz-_vjCc^Cd(xhGEK zepuG!gG_9*?QO}Dugrd;FY`$=><5nR6@HtJ{@33l{kRMmylAUM#oYhjt(-1?2LV58 z&k?H<s1I9?=shsbMp2fRbs5Q-L`}AyGJIq$tY4sf?Y9a132xr2iE5t9^lBCm>nBZ5 zsST@&&od2v#(F`*`*^oAl8$Q33R66~#{7m&7>W2U;j`NQ^3dKZ=i)bWLj|nDe##rT zB_|K=NUs<Z+tu3UJ{G8c%3JerU>Y^Zs@8mySfc`eAy~aUS8>?l%s8^fks%WnL*wRQ zQBKYV-|+PhhKqSnX-2275qHA74be=uNaxQQqZj;Y50Vmd*$9-@3g=jES!2OJSvzA$ z%eS0kX;dlv$YRNae_fo%Hf^ne(xLfao)o)2CZd0$q{cNPJ}?YKD(V0A<Ud@hh>chP zL#4oy*JeEA3>fOq`&#!W4ITu2Z@sQsBRRe;heOjOBikQ0De{upnow_O)+Gb7oV`zm zB7?FE06FIrYQ~^@d*Yx@cvpf1EM<4}63i=hF9`!@eaz-XRnNYm_qjd6Wi;D65}o>_ zWBeXG`V_?I2P~nZ{^*qYl5A}*P3$mYtT{q#XUg;l?}0Vk{aMi9pL>)KXqxkkvZlQK zTI#n2Uwb1b%Z&G?_OgA*i(B%*x2vLm91}1>kH})r{V_)WBb(;`O<Md$Gb8>t0E6n^ z0F3q!88gHUt0DKbG*wU9bN`VCVEEIB*knM<PY-*B(p|PlgtO49`KMSAhDd)0JvZ(B z`952Mvp@!ZG2MCwCU=jm$1l?~sY~|~&%weyfY=g$U1BUI#6y~d-9YYk)j4($hO$Xg z?Q2rr;Dn-^E@qiws1B(9<2$i}zoS(%ON#E3*K{@lPDRGjH)!N>IT;J2<Qq1rgXD<Z zoMug)u$Sjpzp%$?Jj%Eo0!KQ4f6O&f<*7&Z@pt|6p<q8@+*>Xp0{UK+m?jt{-5`)` zfJ4+_LW=NIhtbequEBkrT9%qp+%3wZ?MrKuwczJEmg~{CYKpN%S4vW}#%!h^D$NA3 zY8@$&S_Fl+*myp`CsRMZ0``#p)P9@j3A5<36<eeCkPBh7>MH$3ZfRF<o+iW!clt2| z2E7fN>QJ?bI@8BaJyFLonNVB`g@Nxjm^}N>-Hii&F0|=^E*Mo?L2}E5t`w3#t9qJl znvX`fb8YR7)UCUPy-!AuWr!5qwhA(?F;cPV+<7%U3gwFhlzm0A2OG3f<**l8tq2W= z$gcwN1<w)Q7@JkOV4@)pd}q@mMQm$7^_?=h8(+imXhyfBONcV9M6Fp^W5ifWQTG0o zLeKTf8PAL>9qY@3=WKlZ<B9t!H)AX33VDPq0FIH&Q6r(UsJPtFPZ<q9!jZ*hn0@?s zW+w3xs%6bbr!A_43(G(zDDvlO5c;Q*j}b3<2Z{q+EStb+{*st2bVM0mK>IaNjvokT z5B2u#&ve&_RN>?|j2FfsU$Gq=xn`k<Kq7@rcY_<ekvPrNeVBwX+r*1%4+S*Id}(jq z-#h#ql=8*SMvN6(?9WhviCH`ASv&ju1mWI#rg&Z*Tcr&M#f*<4di#8HT`<o;f7a}J zAb$F6Ftyy1;482|dNVHZ6!lNtqpXp_je%Kw{~f0Ok#_Q(`QK61wWxJgXSZYkYNfAy z%*}>`t4+F5o+Zyk(|9cfY<0n%RC5*4<MG1aQ3kVUlun9;pm=lw$d;X|Zvq4*n;c~8 zpRA-XE^GF^A6twT_i~SCAO~h+<$mHyu=v*Tr0U)Hepu6w^~)2;LX9f#d{mdiYP*l9 zv3uC$h54|m_E}MuZ`!MjwT_<D$MgO^i&u}q6f$2%5jzbS-)AUg`&|6F6Fc$tvGiQ; zM5RJVA=MPhJ0jry@=E>SFaE^rGgfqur3-B!E6=y~tVca?7(`arcs^S?0EZR8Yd~=W z;I(eem|DALsCX=XMZ5ApJ!K`3Mv2Wt9o3a~x;~zEJw+zQvajqrNgRgF6Q$l;IPn_c z{_$xoBMchCx3_EPg24fx6|5dIv8*^B%2Xo&whcxhw9E5d?1H>=AgMTcw=URusE|#C zp>zpS(-eE7gkQg)M4U~Vz}<{Q1#h(g)}F|?@5%9HpN|;1RaiPR<zW-l7rL$>?sqnd zw;WhDGjM~^>6K4!8D3Yhv>8iLYT($LSQwEmK&Mq34)HXwIY>;^gIe4e><?_ORH<%; z*eo~3FJ5@TXBXJrt;ym}`ZHy_%;Xr*OuQA(t$YwQQCQU(+eY{pcz5bweq$Yx4p!Z) zOV;;v40T#&L%krcK&Me@&&t1UW6y)I-p((M-TliYbL5^qJ^naXFztTZyD5v-@S(qp zQsmdfJAD`Cg4mfAiK!cwoP@9|%S7HnAaJ$duOiiJ5qEu?4?k!Y@s`$#-bEx1n<v*_ z;rjt*cw5D#6Z-ZK%Gp<sQIZ)`1n30Ca>njhOORo^SSCP<-GjQ;v;F%-cM~@gy7YNS z>^Q~9ZHcD+0&h*qcE5mAxt31mG|~4f=Ep^(uLrD-lS#hemP<LL6#t|i)|mF=>_R#c zS)ZU?1ND@&2%7mtulKz3`zK-lO)~#RlM_WKdbuA1%<4u0CLXihiJye<G#kAmoM!4b z_<1tk;!>_Cu5mth&gjqBzW>Lh>1p6ic?2#3axf(Q_*j0GNfrF~mHTN)OTdG6+U}w6 zM6K^DjP2RI>Q2U4I=b)Mhp!(H)C|S=X(Q^5W<6(w7D%6sIblCy`lw|24V$i~^fN}< z&%K%E)c5WL>hqW4sRDsk^8Dt@4!=J#0815T*9>D+l(aqITl4}|Opkp-PR*8=TD5~T zX7X9}Rg>4g0PTcmztAHZ|Ge@G*p}q6|K^5BJZ3y!`?7F@%f8q+Fyp*8qy`aeS*`lJ z(iFN|p`tbu?92?ZFw3%#nbWG=3ORz6<;a#uT>0Hjdt8rU3yaz^%Wbs#JZSKb`9GX1 zW=}xDPX~hFdfSTpn9L;#LttJgebyVLNa}ltPL}kOXcv8sY&|G|Q}e!+ZTG5&8kBq} zAixF<-J0GEcN_l`3ifbas+lJuz6x=_)o`~krNgMuJr|6oxlJ;bjN*;zAMW33f7)%S zH5+s?1z*?O&E)nn)Pg2Itj3*Z8Po8+!Q?))%XPTi9W4eLgEYDZkzVngd8|$lQ%0-- z$1M!><VY>W*m_RFZv5Qv2i4Q_`xn2}H(GSWCL(d*!~eU(6HV}6q<-};QX2tCEz9_O zFI5S}kx=uu>`hrrrbw<bt~gAxJ$}R9S8k(1Se99-hIa7rrXL!b(Ew=7nj?6hWZEC^ zSxW$Q=31NswYWnzRIp_PI3S1a`~_hc0Vqh#&PSP+)m>jlzPvL9fSIZNh1$efEd1R` zg|#KxG#MsB^|iYeSa6%mol$ATm4q-a?#YdikW|F=%;ezc9nz-h!PLw6YHEiezmJc1 zI!iDfc^Y+hDV9~PW`T@+YFIvzvW)rAFONrx5BRyo;lU_$%Aq_KN^+?xN}+EqAIqWb z<IN{tS<a_zdlI)2y)}?MXXq+WFCA7hCh>6WJofyzuIc)-;Nh6&(0lZA7Qv&`B6cXC z_*DCqp<le@xWdMax7t*Fa2Ih<Dn1VXy|0^*&vocy&9}+d6yv*`glNqB_+)UL)OXbk zkjoh|cnQNdQh&G*1{#(6QW08mTbm7;vdky-;;6m%>85M-c!wnvq=Y!pxEPcw#?vj~ zVx><V8^6Rc#}S&(>pr)G>a}B2uzO`Wj3TFPg^Ds-QVj#Tq}4sbBKl3Qqm+R#6r`RD z*wsNAUrR*T?x#{7ustpUr-6Fs;Ls0x&?N<zgTGqUq{P1MryY2H9sIb5LIjDGkA0G~ zGcDU0Ec^@BoR__%#@~1ZG(do|bXN|QHoZ*gHHZ;K49=Bk!g3<7ZZsTr#7G@c!G5D8 zCci7#@x;-aYJ3S#gi;1721z)#DI!+-ecS~$&+}b@l4<-_X-FNvO*=aL`(h+6m@yk6 z&%8Hqq$T~ev>Ie*8}EF6z*lbmS;`bV>wyjAP1}6p9Ps&_y^Pz%oP5WUd{<ZCpQO0# zR(jG!oNSDbafor0ePQt1A?0>Wg`=&9(hatu{RleuEzhbkxgwz=jwtsfrAL7nyZc~} z!CrBTO&oL}H4<@#*^92u7*^WrrY9TurV4*7w`I;Ycb=>`ksC0smooXWDNLP*BfXh* zHZnbqhPM}>5k#$qwCvYk+|%$bN@&?b@z8zfl0#_Cg&pOd%4J>J0=S`~q;oYz$^JE~ zBwG-wo>%eCL%~kWbRAf}?NUKs{|r1;${>u&sTdj4S{Br}lZKc<*1C(6B)oCK%F&Q( z(&5v`EG5j0Ml{yn+@no-k!%$$g?~%^Iozuj^QVh=A5WM#6b^&?`TV!Pv}HJ5y5Np) ztYa|OP#vYK{B>{J9)io755!OwI$MP4fRBhf!OUImv`~<|2)jlg)2?K-ro19kSf+>T zVCjWNASr<^CKo%TP{xk64V*1=drZCY!iFo1eeM1<!0(uY=pV(B_qe`Tw|d%AL>8tY zEaRUD$Ck6;lzr@WTqSTCb7U|VdS|egx!h1e?ma1AZ+yGVTOJ(dnI6AoED_Mv6y<Zf zXtHXSN#S-9Lu4wG`2#BH+@obPu~knku|9#=%Y_u&84na7%GJm~wgy$1enPM9toj2* z6{f{is&>00%Rgk?1@NT$cilCX*V=2Ea7dX%$+78bOf3XsR%Qu17YgTCsxR3z@6{XZ zl@@QEKi26W?mUT`!!a)_juE9B6X#<(#0r_<kzvs|-LVvTCr;k;sgZ~CnJ>EqItpg< zXj;MI>T_I~8cT<pcz&5Aw9b*MT4yCqVqddBcj*!1QLXle8n0Q6yXF4$_*Iq-ecK;e z6e8E$CYfra_%3{6pi9jo-Oj2mVdY<8x3|%<6E15awo@84w^JCzvwaXNHY9b%SDth6 zQGzA9byqVvJrr!@DB;n=zcxC3u}z1F@9xJE^sdA&Q_%$Ini#}1A@R14nC<2&RiJbc zo5~@qAmZ#0SazWIn15!Q`Ki&mc)>Y}D1ylwItvsXXD}J=fU}!sQlO^RbaPx3f~&)B zJM9mB6m0&;RzM?W6-{oXL|U|Y<rj}^4#`&?)sr_%I?1F*;1ob)Tu3Qonj9<h{Zrg| zaKWlgI4QTjo!%!SmNKq2?@KiS`Bqgd>@S&)K!a!vO<LttsB2k|xTSj2-eYFJ*Zc29 zxu*<bTv^^u#t-oXtf{dieq!&~+uRDKqMzzYi~h6?-ikBS-HiMx=8kLH27d}H_@<{} zchq9zNrFN&)|Xy6_q3>3Q2^(VNW&C`fT0z3#Gg`&NwiwLsj$1=XZX{|{{?pGetE8w zo$?7>MnHS&xoHa`)N)NIDg5Cdob3DX$Kxh*ueb~0qv#y;OZ_jg{V-!+yz%DPIMZgn zQyVyZSrDhM_bQ>=YAx1Yg~IHs!qIZupOlNw-)D7p1<~nR@fG16YLL?yS>0bRAcV9u z9CFa^K}VT#V-qDS_$1N8Jrb1D(JDPr&y@_?8vFc4f=Ow({MOZ)h-zc}J!6-O^ym1+ zXl<X3%8Ksmj?%@ypK2Q1&|FSl#BO^(e*6CMuU&mvhLEHfEBxZ~X%SRrX+S%>;Gk&9 zq5edZk*0sIo{A~PawWm@md}_&pTmftJl-+G@IXjv!>*soG_Bzq3r)5pudE#<BMmKq z>7PY`*^yMsEISta4+{cm_P@_0{a#EJR=F2j#r>{_kGf-pdTMQ%=0<v*&lpIJQ!iSJ ze_M&2u8MrkFS91hB87YS+0Y#$n&M8vR_jro1muu;HAGnMx|5WlEK>W7;D04<D*$D~ zv;jTO+jMmT47(br#O^>Ij-cOQVPYgoQJ@cn!1DAJK}FkgDd2zrt++z)OUo_O5Bci_ zX?)M(y~D}VFQkdi?%HjaQsgm72m5l&>v5iQ{kyiQJhn{=)t0oY^$wZNjhr%djb5nT z&`b16Lu-AK?yi%K&1I*1b7&Hji7v1z;QyCbfS7d$VhAAyJCx$=g1>ANZoxo3$X^$} zrum=9VN4OkG6BmQN=yZ3ag3TA&x`!Q`T<1T_k6C0GgVpS=U*_Npv^C-I8>r($-O~G zgKZ01-&Cyvx@O=VOgCk58QVg;f_Bm8w}P|Ue*SJk5`2`@|IJ1FO-d33^4#wX8v)?O zC|9QSs{Z?|^39d^SDXVU2j%v_0uu>Z>K8_dGygjcxcr3=9R5s@bb6m=6|sDYyPkxc zRganzRHsxaslQ9L+_y0__N7r5u(a~Fx10Rcnt2M^ZxR|7_mG$MOWkZ)m-Ji3B{i|) zTsvO{^~iF=!DySLOi0a+huZG%k3yg1HHb7|0_XD~x5vz$3Q}+2c5<luT?NO{)<suB zowvLEyV!3R`j;h55EiPKF_5UrdXSCIY)i&oo{YDjo5nVq&gPcvYCgf09~xj)`ggi6 zD8jJ-AxrAi?v?Cn$t27f?{8yO(=A@1Rnq*xByww;2nmSZ9I3d2!;s{^eCwP9LdW@e zG)vNrMfPo-VkD9iY$lG-(nr2r-G3{#>RBE_iiFYP)G2hi9)v4t*7g%I4Oxsr!EvwD zU=QMr5YpXING0MH_W*Id!5b&4aH`2lBX(<iE7oofuiAW{R?7Zj#vOBBO*W|E6wqae zb7+&qrkATHfb<cwk>u69pZ^Hy_`Hx`Q_|=s@L(unybyrO)NU}7!Z45&CkqS4%rB)? zrd!O8x$+`KDZ8ilKosFpoh{QEz1FSo*W=B0^xGv2l!%Q$rfgkXG+BxWQJgx;jWjq6 zbwBTB;R-Um!y9D!H$VqYEs8kYGpiNNJ1EmCSJPT^Fn4sak;lR*HabE`JnKnwkL_@@ z<!5?Y{e3SNqK?FRLw|Owf;FT!k3Y(^m?H4w52};UJab3u3_cn!d!6bGC#Ng)-m;#= zhW6hcTa~jJnKnvoDE1Pb0x`l?z3&Mp4rkt?L#IBEVH<mGxpIF?&>imi7m)4Nx;9%d zzTLyaJ6t~E=Z{M~jEHgcKmRVv3sSHv9P*(7RBTpHWM!oGXIqhwAE|TY{weUNGMJ?8 z);IRx?C6#)k(GO-jmkO`35bUwa;x{sHDt+G{ANF|5IV@T1d@2ZKqneAKW>4H{o}#D zVez#<qh5N`#CSsx#OL_!l(izIyZ5s3!#vP8i_x^oexmz@jkhqz1%hDRcWVar0(@a* zHUKOm{0A)C^iMtRAP}wUVWEe3=mMul`!28usQYV<Ni^o#uI#KNVa+}(<>9AJ4u|2a zWfH_ifqVyF|4D;0C(xchcyEXR_u`}WQ6xq|@n7SemD;|yrH<H%ip8$_IpKUBETvAh zP4Cf+ce*Z^Rea+D#nh~+%Edf}AQ~P61*}JNrmXKwkO)3E4Qo^9^jXDaX4^6Gaq1@3 zrjxQ2-I?sHH(ksiHk~Bk{>dmz+zYj%6h0ijn!ZP?i<*<w+i8+A{!5s}D!aVX<f_p7 z$@ecj2DJ6^CH4OLC@)Cq{;WH8yZ4czFhExs=;F>xOcywb*I=cJPn5IR2gMShjS4+o zJ);bBs1HOU-q+XTC&@ottLVOdCGPn#BJ82=FWB)u0cwiq?=khR?XUcMqd*BZ&bL7` z#zuwkZw#883T!;pbxE;?9!aOgt`PHg^Hy4*?bfRvmi&$WTRWaTftEyVFV9|puk%iz z1)x*DraBEXYYy+p(m@0^z=<j2K-{+(d`EW}t_n4Zh}hLc_sEziG-DfRl}5r;QsbGD z!y$?cB~u1L+ipkl-{BU;U+FpWYm{o+I{(srL?**BQL|fatP1cN<7?V0t4|?qh-SWX zxg`+a`_*<--qNGgnXEZmM*LV@1=e=qP-D9AQGYl6@tbxtH{R!U<8iaQ&m_N=?m5!4 zkOR6FJPGHTFE>63QE3S6H$edXSXgHL!XV$up9sAoGEmVIMkt4d5OM2U&Ky!PTM7O1 zCiV}qQnj{jOM-gdom0pbt4x<at)kE3Yn=1OENY?!w6v9lEGH>zV5Plp#ngJ>)4r2q zZ^4DsseXiYR^N^e)3g#KX7Ypi;Fgt%S<-G=8hF!nVvMxlo3kD^mIt2AO2?<JrftQR zZkQ8dx15(^2rd7*&CVvLsR^v~Eb~0N-6<tx3I+p+dpO%bYTvduZ|8G83jr#RC4N~B zMXRkC9)+9l>R|oWV_uWmP)}y7`?Bc1>I?C{z81VNX-o3=iNx|><u>h4hwQdnEX{)d zNe2k9%=pe?tNX51po|OjCUk!<N&iQI2Yf$Ho0S}To)896VH>a))y|?K`TWHpzE(cH z)*Z6%xEn2~J&y0~Ld}-tQEJnkdX4pX+JZTnJPa17`>rk6GIJ+cg(I<4YgH3FqIdKQ z4r99LbDi~&vpo%F_48d(_UHqRH}iP=+JLhnu~v(=nwD#6$ya=jaJ_1nRu6jtB1R20 z5?pKM)l1N=Bwu%EOl9a$Z5ePRiH#kv<X3r|HVIp7B7p^T+F%pb9sk$YZyWygfG%{O z<Xdde-7DAB_MMg!1J~<Mn}+o@$Op%>#g5u*w}!vZ?)I`Q1y8j0kQN$^-674pt6rzX z>*@$!3aF7Uv4IaDFIITbz+odqjvf9Ojte!8mSTv6x%I?tDUGRTD`QG$SPNeGtRe39 zZ)*b5aWJY3>D5fB4kz!~2ybm8_8-&L^h+!XST>OC@T>L9Ytjxvuiu43zSu)7Pv`wK z7wz6T*Br25|4>O1dWhp&LbQFj^HmXLsX@F4y2S=tiqZ&j^-(_8qtoxhR|hLgs-#j% zL`}cr;5S|Er@A9<TR3#{CZsl4D;m3^TAyx;Inu&<F;`bNsR%_(*QJiG`AC0reer7D z>1805$}BI#Y+V;w>|MYlWb1FwLnmbVEP!&GE@=CG>)`|pCKs_uS#X(F3zC<aE<nbJ zZQLPoKH*2#Fs}@lf(ubUfN%;|1be8)@Pc;{nWF?hwU(fu<AN}hPFO>a;1M^iV7*_} z3vbu_z)d%YKkuzp3hT&?42+31$Y?G0I5M%n5RWm1?!srV><}_%96cT)gq*WT(lN$8 zPYrYMhhfl$i`y<gEDNV^*|5RoO}aDe^7t>p)f;w&i)Aexg$v4Vjx>2QZHYF20G?<m z5=|k%GHIdJl%%lg5ymdz&>?kKep9QRh=kG4o?hykfQ|avF`(;n2KTI7Ood0}F3Cv0 zh|GcCX2@Opc`3Gt0mtQGXBeeTP4{U7aW5H<R}k&)n!e(%<%iT^pJ{DoKa4JOn_r2F zCjKG7&;P=Rrw|0DxSh_65&F>b&F+=JOl{%=>m@&RZ}&d%1^q~fwp9TUDb&{<{j9uM zHwOS$>puavNg{RYoDvsKH0liGW6)stHf!IRophG;HY*+Hm<*XHi&<*X;%gkDi2DR> zlW$)b)erGi<Z4A-=&+-|f5@TNH$_C%D4b08{$4V7sCYS9zxT7p9>d-wQ!gU(Z}DRL zY>C~fero65>An^Ixz~D3P)NH^eycT}<=|#-VL@30t-HZqwSdb5-U3KTVO|6(M7{<g z@=DDTaV-&6>+^1B&X(FR=<}_I#5{<_pH#JU*bm9UhhVn-1EHX=eOTS%q(fJ1JFnz_ z@Jed9GybmhqHHqKsZEG+0)R*NBhjG{E$|cb88&ZMc2||KKbiR#H4%vV5-=#5Uw+cS zeGV5An|eh6$sV2-%IOQ*SrJQ|tX~!biTP_%Pl>S;Zg++Sx+349|M}@uTTmVRXpohp zMLyLD67l%USwcO;V%27H{YRC@1(Pu~AY4Cw2vs!S`$x0KX8}VA^QoN{*GAwDcfgf3 zhkK^|&iqrBSagd=kB7`o%14ExNj{!e0O+!)P;~-tDzIETL~uyxR2hTuvq2j~)F)yA zltUGWN^iyy^aOtYp=;AwqFMAF_46)ZHez$oG<U*v9qBJMu|>Tpvs%{@v+YaZ=&3Tn zF7~OaE95pk6&OxpS2>sg$`LGR{B_E7O%!6-?tU`J!zAO@&3jk91mo52Y=2U>8j%hc z@otC2sQ^9ZNp=257t1i9o-p$&c(DQc)&giMcCV4$k_}rm^S#?io@n($<i%i%2!rOu zO7u}9kc6J;M(#iWL8-Z`F2<{Csg1H3Vill1W(#?wx{V!C3Dg;gjPS*yP3ksdro5mf z`HSHzdX!f0?$WcK2;6)Uqu~#lrhe>477?dJn^_-n<N2aoOlft?9Jl%k9k<$gST{*` z;}r{0YF-!)W{+CB+=Lpg4F!BK5JI*<gmd>QNB_WM<A)IJQG72NJ89Qi;MUx|WRs_+ zmXLWPpl@HVHWa3K@eH_?YmOf{M^T3*xKzM;EIj(DPe)X7zaAc2#z&{^C8NLnTs)ba zvuW`7O5OVv7S)i&XYBLh%41BQ$nue=MZ3bfzO*`Xp|VS%a1(_%;hF@4dD-o@-r|9s zz~@2cUV?SP{X~CQgk806v?Mi}#jdQ(4E8_+PQL|vuZ<Xstv#|E?W(90Ag`A<tlk&) zzVP$%*O#Rl6ipUMzT8ib=s$+)UEO(EwWP2+G}J!Lyf<6Q8cM!_)n*xVA>w?qZ>DsL z19kc6NZ>I^lvtK9;b^2Zr}5i=jS=2es(D61M`Qpzi7ly5%a_%9Uy|<Du5}i6$Ef(` zA7S0G3~B8iJ$PPYKwOUqx6Oro#3QZge&x|93b8<?)Pm2gEyHb`!eCQCY{xB{66|lo zDmqEc!C#~=OQkyQS}Jhu9PH0#5ls)LjwEo$7ZI!)u(Z;0K`PM`PU}COgEwarqHZG~ zcw8_A8{<*s$@bPEH_26Ls(*ZT`ct5X*$`jCK_k3Ajq4SDp>L4qTu1!e`5uj58pJr8 ziK4AAg{Hu#z(vZ$tbWCf!g=-1a>@B>zqa38YXOV>yX>5Wj*)9sEAr=l1CP5p1XT{< zwF06u^#5g~g|7%eu=;1H{qY||Z7VR;5)C|T#Y(1;j1v3~Qhn0Z_wNEpdG5?M4W70? z%`K5E$D5gjZ(|URY5cX)1qZ;7><}0ckBdCmU@|)2^&H#+<SZrn@+k4yN7vH7Y;l$E zxHV>NNi~)MCuwiowi<`1sTd*Jw~Dq~fdoeN`s>G=C3_NwS2Oa>3TMhItsa=Hfkj3g zTAF;uH<jzEa3Ad3dJHQSass+cq(0pLzPhKdPx)K=spj3aK?bHqqg9Os3g>__Qzj@^ zK_&QDP3m?6bJO*%pT?J&j?k>J1M}k5kIUE!L~52gEVxqZNO<O&UQ;K*a|2YRXJF;~ zF2=rHA8yLSxWjhlvhBFw4#+%6Fb!&+)Bb%H|24%|>D=|a817CT9kdzA3ue)PMFm)< z6j_dbATA6(G@-IkA%Bn@xZCs=dphRTwws?YnWG0O)4e-pg)7NHAPEL0;ymO^NrNF2 zD=4EElk}d6)W(J&t{_~_lqOw3*TEu#`X1z-N1-1hoZtt7*3wA0Br-<LUg@BbS909< zH%1uHpW<N}c+9Fx{^7F$(h*&~QOv*3pqp((4o-2)&V<NBG5P{%L^$>2s-?a`-fDXo zL~|Fx`u1&gO<&GJER4@rQL8Kqx8SL4G9*cvGt3m^a>sniZ`IQD2&FcPj~-9CO;x)U zu>WpEbN%M}Jy&l_;E7f8t@^m%!p}5C(Zo!ph6BC6;6T+HX&b{QHU^>bI}Q4R%CM(7 z4R>gVD+CC(<N#$pWs`NTx9@ydcGC25gf=z#GoTKqoo{b?O*cAjjfCuFL*01EfeD$X zCfiRUH3kuh?c-WP=HTnVtVL);Hh*JR69Vj%z<M5tV(6?sB{h{Ni}No};2#?8HS%Mp z@1{|}qGk~g=)N!bhes$rcPw%2T(Tcaw-kw-#2KK1G?igrHjRm%Tut|;+<Vj;yAOU| zCm`p%dritL=6-7649f`%)jm1g$_0EyDJ_Jz(^D}|Hp4AnJfrNQV&SHzJq!goNpXA2 z?0*5@mU-1bDB1W4>zfM+{TGd9%ePS-4pAVI(9IFt0ZRmoy{+clOqW^#U<UAW++}6o z>h_C88G7&<!UMh*r<><^8VdU$x>l}<3V>`)39az3YwLOs51&wU_qh+d`=S_8Vta@n zEHH=lXxCbdSv@WKDmbmEI(S=?Dd%Up+i+>wkX2hgKlLy7>CfeI`vOL<frysqrkz?k zV)x7SkVHrGx8sIkc*@HG1dh)u7q4&=Cf$N^=G2t3(kmSQ#?}tK<70TA73da^&bpNZ z@m!u@S2Q@9*6^?+Z+O35OLMGjRO;W=ssVK7&f=1ne#!(jqJHe}p5<scemy7rj2E|} z`0hx;iLHQ^O60sG9Pv0p$JsX@!guyoQW4)sg)SyK?7}qm#Dd*#H1pv{DluqbC=5Z& z+UNeDXcw3oF`@H*!I8aPK{$tOM&KVGVu0nrt|ukmz5(lHiMJ9a;;rw^!kz_Cs;O-e zD}E^NNz>OwhpPcdqgVLe%pj;MTh49D5$RT^deb6<u>CQ(_&8&>;!rXAC$(>?4IcI~ zcn4OE10lX9r^0`HhFv)S7`D_OEMCuN^s9Zh4pEbje(I|Ke7}h4s2(w0s%qNtx3o={ zc3DM2h~2o|pj9>2t>#(YF)7zvy6G>p`XCjP$jCj@bu<85B!YAXyXI}$ue%-hy9sgo zW`m{ssFV?w>4D~>GE0Gl;_8L`59XI){;GaYPo$Sy6_Tl7B(_K6ocGwGY3!^_Y-@h4 zkMx&aUYv#EwE&cv3H-c7FDBPGQwKlU_&)CR*L`4u1E#9h)IV%{P=F)mT6<~z9v%Cq zb|^Zvi7}=k(EmGU`?d_XT}^7!@l+`$3f$i}+NBMI(5{z(MN;(!>BueaPl<IxCvzMn zw%We8ZEeYw9HVlr$Ni#QKr+B^S>i!44+c^DX0<go4RcjsO#d3RUEiwxr<YFiuGu?_ z`k&a}9=XP@c9I7yPqUXuC6p>Pe;;b=4*_t3O=IEv#9vi4n8<4T*byX>@*dTVYy3yU z7Aj4~$HhZ$kN+J!GX5RNW)p#dOc?jKRHu-X0BIbeE=#)onzxsaZ0m+h!8vnOgG4I} z${Gy<^(zrEcn8eD0wAVZu{D|s@+6dOJ|_G?$=iMYoc@zs$qbWd*KlV<58eJJ9KAi* z$Lx3E%ytVx3KlgX0h}B~1h)y?H}=o<N}dw*P{VWBT;05`uvM}$A}E)-)v#KRq7uJ( z1++CAs;w@0;==8Jm$7892x7$382!vYipkmjt1Rzt?QQ1+lxf;7*oOi1qkFmvLEoN) zvnq@z2#1>F%W(%h;_~Z3A=-V9F^gxM&CwgGNzv^<LJVvo3n(_+I#(C$S^w)i<>nH6 z2jR`;HUbgK@%3_s@Sw#Myhnlz_iK)`z_0#(d40XaI!0EWKay?s=kV!A_;rkJ1Am7; z?dS`wmKuJ2A-LCo`dhPVfYyAL(j0GBO<SH@;mVq+eQLeP5Z<rxFl2J%NSTP0ZCQy& z*@1xo21Y3dxa*Nl1KbQ;V2o?>iUM+8;|S!N-gC4(@(k-pl^ki3;VvZ`rVY4bLOCHr z*Mf}xpQL|tQM1@{x;37MknQ>zh<SoxU6D8Xxa)uP?OR5VYcJoEC^>uIQrp!Hf|l=C zAa{wvU*@K3Y+B%&ImKQA&1ja<)~o4b#6Fzbf>W$}5U-W*#*h<Hm`7k8(l~t1eX6`( zH_jH5UGg_A6qjrewEVqZ#%<_pcxx)hZG1NxLp}Hq=h=!IVKNIuqFsvYRm+qmctKRF z1T_I}^})ODb=2G8!c91N2u-qqXN12lZi74*!ntL~S*Sil(AduwoX{+`>DZs6|GWlA zME%-}c&X0XQv54)1yn)M_f9BlVSKzQD>=`<Yhb&XBgcjen9(!}CvNwd{jGKV62oMF z0-KF`$(>A47dkm4A$92At>i8O(J9*z&aUacbrXt+>;4z;p7k1k51EF$W%++VQ=Pq| zY?k<q<T@OtKQbj+)v4(dDmInC2&Hciz5unwcDKa<%{3Ravj3_m+qe1>_o2j4$~AI# zbfic{V)pghoYHBg9gnRy<V<m*<<5E(yUv+{u-wRzL7#_3-;JuLq;&iGbMMFhhq1Q| ziz;xpz6X#_=?;}{X&6FKKxyd)X^`%85J8ca?m;A!?i!HplJ4#yXM~ZGcjGz#>%E>2 z=RD7~Kk{vc*>|kpTDJ&^0!>`MG!<}3RfDHdxD?n>w9c;OQ5XS*+1NTb;FRU#+=UQY zLz!m3IkjdZ&rC}J13qxHErWVOc9rp=QwQ4Z^+)<_!9&8F9lw=WV3M<BgSyF-myE|s z4cFmv9C{6n3hnQ3>(BJvG0<|HoNy{YI^XrDTjdMOieen>Sj$h`2(Kpp0w)s>+8cdl zA9A8WFqdg4__+l4D=c7(9q(|OZ_hl8s9)cC_;Cq5k+fN~E&L=-oP37S-)MA1zip>! zyUwLdEUn0<RtBLGZ`}C2u*+?G>GL`gACdKSAjppkpJax2v#_pov9LbhpSC%u!G#yT zqaESHOsK0q`GJq0ns_jw!bVu51Lnf$9+I(}f{O_A|F)bvgRl7~md{jDKSdM9-lkTm zs4R_#(FUwSy1SIWKK816g0{DAY2NCFAcgdZ^W(mk>*3P<F^5<AX0Q)E)c}TEJD=33 z4xMu`ie-cYQF|BD1=-#<HGlMdI+(EMHtUDFo*qpwm1c$;c6@Wa@w4oWA~t)VU)G%b z*2m1I?Q$oRv~Odk;*9y!VS6yyXHxilLr|!gd$8$fLe}i&ZS_DQLbGw$h-s?1%A;mG zMYk+<NVlY|AsA1J=r=LbP&ll1*`?*EjHpVLvNor{o9svI-z&JQgqS&-`EiNr>0GgE z%Taxe9?Fk|NJ^A9lXI&_drmP}Mzr#m=~$#O@l`R~3|Q=5YyEXu_H5SDTQj1q<}&+i zP@$o%a^lK9tiH3ChrfIL@fE?O*e<_d;k!Zc!n)SV${2%~&G4rmsI<+5-T1=f*426v zDRWX-+FLuUs%Q*v+zE3%UdaYBjFFWXYJdf$qh7B+O7D%8>h;$ux4HqQ*O%z+G#FX= zYGTW(z5B1E+VV%)Ti3E&TD?W2*n^QHvp~hZ5CE>{R3p3HE=dMd(5;PX?JW<c7bj!m zfRi3$qgMOnVQUYuLOX}?v*>zXP0{a|g+aiL>W%gHx0_$L9`HJvZJ6YzuFYwOoHmbF z(QfrM>FrsFT1hTisY<MEJeZ|(UOS@AknoJSJnbSrqW{W7A>n&0jV;kIBJOEijw0<P zA-}MkvweO;5l}uVeDSzB*}5fQ3+%>F_VaJR1!KXL2A;~3*-OF6#!d07bE#=jk$~SE zWT>3Zn=vq@x2ty?%dDUr!(NFuT=Zg77Dco3aEHy5xar8cxzKdJI__h|31T&F&)d{t z5fFe1%7#+;OR;{qR2S@P{>*Qsnw)rFfIke=AkB=&Tdc0QT`djm4HOfVjyti<A>;o^ ztRD1dHHgDz1;q^fe@JO!5tg$%C3Ba<x=Z;_aQIq(b0Lu$vZ>EX+Ws%&m>Z!V)J>j$ z8}Q!z+50pWgJEs;*#D>Y^}J%Uuhb~)e8!lQaOQ{Z5WT@6FTBYvw=NTLsjf#0Jza~! zqJ#O!A3aFwTcJr^l6ip^PIpq5O2fK}art+Uk+tpYj5op6^&?Y&K_no}h~)5Urk%k3 z_;y+t0E7cwaTNQg{`z=h9y$61`Xk-1cC#fY-lTm}8I2QTbU69X-#EL?t~g~#W$)*P zP8PA02P}%yxr8`-;i+cT5x3v1nn8ruIDgobrH*P7{cj@K4}GoL66(nzk9N=IT$YFL z9_Zj!z59v`#a=l1+kr?m^GTOD`<BR)=|N~yBNh0BnW|LF9xAZv*An${SwQpXMXJf0 ztKa)p*WD}O!Nv{s?!CX1(90p>z0DieT?GOb=$kjwv*wAns*47{Sj1MS@fdAN8Cl!) z7A)cxK3t#pmc&N4Kv_SSrFhPrr&)cGoPIyu!`bB};Tm)jah2`yIsKylabcXF=z|Bi zBV_!8rk|zL4HeH;pLMpV!Lm5-7uIo(amzj`^Q($YD_=Fhr}B><=!BGkWV`kf941x6 zA_$%Jl+ZMJNlqr`Cm7EU())_oFC>90Lv<iE)6f5AMTaw6-(E<li-_pxO76Y}+waSH zyWDgPn|Gw$mzq#F^8S-0<Y?V2J_6fYa-7GsIjPuRPp;(f8M>VJp`a=6*ezTZ`VO%G z=zfCZP&2bYhSf<J%kJyQ%kw6QnzGrwx6*iaLgw3&KRwi7JfjM8xt)KDh_0C|D%g)I zBJi%B1Ouw^C!x$ZXT5T{b<=~xH>Wx{trrVUJKbjNbB%w`Nl9+og~loe>d-i{N<z;4 z-dl>wS@y1$+U3*-VzYlv9V;n^aT&y@l{A=KXw;E>WPn^i69aOs)%meRn|6n7Z7=mR zt_x#nc39*Z16&8H9Rg!ur>{HLE_uaPA2C*(;P4*2U)~HLKbCcaNL0<$fM=U%2gf4> zNDy<s`<$OT5@{KV4f~jGq_}U+12=X44VcG#fpT{m1U@%>*FnGmQr#BW$s?&VyKXl; zIN7Ibd{ny0ke1TDvgyJnw@xb}IEZ-TaYEpP%I{%Dcf$L0nQ;9SqLsP<Lc^c-ZIJB{ zAEUxMzVVoUiu_7%6>k#%+qHUh{(Eu%XA6>z!aN1%tn)F;H>y@`R+@_Nre`x6N<&vz zw0vuC2>hWH`qrw&eH+&&En}4-1f;!g225}34c`!YrI#uJB)(10l6&^hf<P`D_7MHi z$?Lb>Y>o`{;QF_d!)3^wv4)Mkp9!Tu!vYIwRz1!9SoS|Ss)54e66-ESHVkReYsSAT zC`D0J5$wA9`cpb_U}ZsPtqCj|Uvj>cHlu_uPsE1LI4`6HMoDuZP5k4*Dwr{%zk2P@ z5U^aoL%sXOZ7<LVCY|3V>zm~1&I>Tj>b?qR!KLD$KR=YKs`R8OC9;qL`P%Ocr|*2o zk#+_jG?fV>lgsArZcBtUS5~znK;hGPBp_2!A2Rt2ES;e^uvoc+K2Z(=w~ns?227I= z)f~cv{jc)D-_A*9!D1hXn-Fh5>(d~X8VkenQbLKfuqFf&UfpnODDbK%%i^#gMEKKu zF1IizPhTr@t656oju69>9;ZbAfIa2F?$?zn3({9dt~t<4Bx}jQEKIkWJZP2lHj_ey z)u^`;W`ahva}ae|bfmtME;KP1L=nPj#qMHb+YZ^~Jm4)6SB%ICUB>VlG(3zIsr_%= zLu<w^P4jJsjLa#_fMeVmEf`47E~@*&-e=np;P)b&@!gG}&`-ZAT!G3k*f@s3$5gHe zLQo&(o6ytmMYe^YszyQIFH}~3f_m@|;v&H1^jS3^>+3KI#lB^;1M@F2_n600_-jvf z%1n&SW6w-Un;X*H4SvKgw@ignV(_lDe1_=2W-@61+Qw5r;4xV!{Urz&lRw&IZIZhJ z#xr9=YXIV^rthLM4`Mq~Pb6ksWsP!b0WKa^wd<P!hwjDD+`bZnzVRB>)<U20_J<7$ zA*yYGK+nPIzWEwE{!A>31x>TU1NSbI##7TURyI_R9fdmPf3g7j4?JsvU#GP3ncYPG z_I7-&bX?WSNojYcqq3SbzPL4zDBn@bMJ5K;k->8xT@7$*^Dmv_B63Dl*HppQ+~Z<W zHREI?dAI4EYeqyPB$qs2GOeUg4ME5#$bCC;*^QQExtWH{xI)mr1?#$9S;a|bAo6%s zUA3%?;IF9A$z3MCMf&N647NeRW@cL+tq(#wqise7H-XF%QsS5U2Qh<EYY-xzAc0t* z4Vuv$H`X!S{<zQl_Hd6H8${Sh49|ZBu5G<Rs1$nc@?A7*%goY4z|jvHb#!#B7aCT_ zjL3ClkaH6SxkhpVn;@v$NJgEi*rfo4BJd3>=`qo9mdIJcjP5RXnQT8Y_^9f=Wb$V@ z--zOW;vW!V!DCdb+3RYWS#<j-VFdQT?KWCy^oyX&z3!ZeS_vGRNnFcy==(dw|MTrG zD3j&g@Z|99V4P=}rqbLc0o~+0ef|X}&mkLAnbTlYC39ZIKqC91mD`C#5Qp31u#d~; zAEY-w?u7`CT3~n<aJ=i<GFUsOq)!52S?n-rJ8;e8iH2hFT`4kIx)fY=PlZc|H&y2Z zoo;rCcV~4)JvvSw+S<-nDPX`@QV775p>((vTLptJH$*d?jE2gZ1gfyOg04N}@t!ks zm@xP3<Sj7#ph!P3o~aaZehpYrUsSPMmR${8YGhQjX|(1#<q)@G!LVLcgd#xXe61-# zgk~83+jBVy!Nz0vGF%Z`+je^1gH{c=ELm`eAK-wYcaWr3QHVQgA<%VEL@xAx_*<UT zqJ>uCqc`syIK6I<ek+$NY*Q_=rj~ChXW6zd{baRey3t1;ZJ^e5m2Y1<YIE;hKqKmj zejmWGaUv@ZjnTlJZE5*&U@lD9AnL-hI@dzVUHG&fBEkn->$Da+LOHpPiX&AsL+;6@ zW#8rGVJp|cO@#E9O~^v6W47?;9P%$X*TH5<x5Pn34+!R7Txgszh%%tHFElUATr6&K zvZLx4pXoA^^ls~$xFl}cDE#)mYf-Ox8Zi%nfF2QpAEPDZ%fr&q>b0yEsFQQR-aqEm zAW)J(=hFym=c*n`^uL)-Xx-n?<~FKkF<I#Oa@al+F{#%VxLfso9_1gmPDc-SNNQy@ zeW3c&?`*@GshK{glExigHt-vRj4iEZOme6&Uo@-4ZOZnd1HD_?5F-1^j)2~tkqe8b zGk*min^=^cJgjd{109kf&5_=Z$@`sWO;q$2Zh$d$1@&XwY?18#`!(38URcFuH3}Z? z+w+;CFyHUCYdwOr_s<Evv?MNVDANNxB*U%ld}5)O<Ij+thcxVb$(WjH@Q3Xr-D%5p zE~d!*Lw+rw**KtAm}j;pUztaLez1}+rG+or*Cn=v9{v*hS<7#C#1yBGOS`x{JlKfE zc0a{fi5j*iZ#U>I4*zZ_I?5DC!clZx@*dbsSDT|jaJ`}reZ5-cTNtA!f%!eX!Xw+< z)B=e?##q@d!%#ur1<)ODk2BqVwu%ZUhg#wln1ptE+kjQm{y@suaN3_&0EvS&W~mQx za*!hHT4^C$Kg<WQIO(7QYu2#&H|=4qhSV$_$ZslA$F=!1{1)J2>}Q%%?FDoZOZGjv zNv*K3QJO8vI<prVQn$i^!9*$7yr_8Q?WaU_L{uN7{&eE^P<INC402i1lhbl6>A`SU zpO}TSTu@(-7116vrPp=FY&=nXcGuya5$F9f=~1=e<3`9J2gzm_v9z`H^dylJ=;AkK z<TWOWu()k0)$Iw|3p5j@0qH%+MqMv3#<-p=F0m(rR^Q-+1>21$Y-CgB(=?^z#}>CW zqLxe`om0|sGoU4fB#<*;Cc<z0>l5F4aClDenx5H$<(ly@wa|CjTOaui^gC(v%ehc5 zR+533P+T=7gnCg4SB|>#84+A*hXDthrF3LTy0i4%nQ+NeiJb;g$33t#_iE5HcH(k3 z+wSyvNw@cH<)Lgr9Ld#+QuNYZj=Zl)B9pJPa(Yl160|>4Zkow8g8K&cW+$3PwESK4 z!{hx|)aQ|#!*G!f<Kp#<U+76~hZ8D^PB(*J?<}hoSAWh;3OSeJLIuVW`CGpTu*owu zj?uG>5g!M{?#2f`&@7pKHIAb(7XT{-77aA`V3m>N%c`$nD!IclS%c{Fy&Ce_hhq+Q zl(MM?ESFJ0`?1puuMjhhlb)e8uXW4YpQ^GVJ+Vqh=r6!u!6Wf%{C%Kr=b8v+Xs9?$ zGA_C1>NP5E|FebgBezvRnTKlnXX%V=_9P>4mm7C56|C1d&A$#@)e<HDBB2pGPSKTN zd0s3l#z0}02tMa*I{&cUp-sb^zukp+U!COcZ)sDz0xccVh}3>bKcR>#qF(g=ywM@1 zC=ov~REZ`Y`V0>dKP|Z=z8&ukpAgU6X|fS6cYa_~o3-P#z`L8mQeMr>B2pei7`DCM zl^<Q72bMqHYq(nk;~^3I-DG4l46ezkIy}!WmOM4^+rMl+gdT9CyJXq;{pybzeU&Vl z6n^a?q-bV~tWM|=gDO#8j?3QNWTT&Ue;xN6lXgP>(FWx|^%Ly=I$Q7-(g`NG*mDm; z6c}#2xR9juQ!?fGd(z?>gjm0(u9DNysa2?^*)nD3g1!bN?^7=FoxbEo?|v}QJVMIo z+!sSfH_s=(M_4)Y^+gm<yoxza{6{4{OwGg`E`H<HU=+jGnHt`{!`G+cIjK}&&z<3_ zM_FWB=N(aPj<OHeOycPMTaGmTR23ZH;D>8`#_S3DW%-f81#Qz{61^C|>XYk2?e`eu z7y976FxlImNA=y*+b>?fyA<eEq4={J+|bEbbTEp^#NF;uZ{QU4jIrH>mO157nT>MQ zN-w@n@m8Apw1S&z%lV5Q!#|T^uqk;hx%F(Hg?V~T;!y*~Z4>lw<tF}Q{*j27+cY$& z@G^CQ%kOY8{qho%F~h7XGFUzJDgb$z4I1Q|N9!UgU2ri8X`qkgCW2sL@2%)^&^^$e zFu8Xpc#Mjv)#o$H0SsBr76ygQL;`xaY5H2$*8Bc5J_a8`kL67fie)<~e)rhQl}|P* zkRuXGB$4b54&5#$uD3iao<UsT49)dN5Dy5FeN-oZDQ+b>Dfrr4vNP@ej%Om0h{?Vw z1r5)WAGc-qdENf#uj3`f>&xcUZ&H+E#N*C+I|t%ct4G=bIWdfAJsR=E0wz(K|5fCN zqzix~;*I47Z$#yiQ-agG;j|X*XvQQT0w}87G>%s=Zk*3qaJILpFp<Ihal*z6<&MP^ zI+xIXjBxyKb6}lC`;UsYvj>r>haCqgWjCGR^O=LVg^r-y3))j!j#ezNX5(+k-y(j5 z|J&33>%O+v>H@XBhel}MdJ{DNhb<bVCRadmEyGAD2e;i2tOeAPLftc8VOY}9Vsp%L zVrNJs009{{I5<bF2GuynNelU|xEBGa+1E3@g%*tya*S0#t_0GzRHIwiMH@@{UR}HZ zt-RK7qatqWKMt&ld49wB$#q6s0~gANwi81_F_ztz;fW~>s@laod3V_QT`Rv?;&)}& zmuodPjSOqP)~(mveN2q$Ob<7IldQfv!@5~0shGdTg?OL-#X}?Sc+7T9(YY5INv4+F z?EQA81pR~G-^<;yuJ^#T)r_$oGEOK}YB>eJ5rdR>EziZbC8=XZ{HNtDPNs0R+K4?` zbc^e~+U_=*q5jiULYz;nG*%B_B@l%lH?J;AD|c=1&z{ydfX3zn^S!PdiqbjJ+cX{d znFS#d(Ly+<lTH<_T+By54|71XkUyCl9BA>MT5@|ZoygHYY|T^z?-=vvz(GCJNuHxC zn5=EdOdOfJXkPM7=;8B|9zQ|07o@HWuW~>Ca-n}V9^#3%x$)xlz9<@(dGNGuhALe% zlvST(oIjB7eiInD;$=?w6r`XSNk;O?f6KWkf+DHi`}XT$q7l!U10*?yR!n_9Q8Ara zGcB0*1Ycl@fiBDZ!pEIHsD&RNDsbzkcJaNc?}6m2_BZ^v2CAH+HvvDQk7U@{L24#< zsF<G`^twUTghYq@7LJ&|J(f{P((&~C<PY$yqVHl8d<~QsO<ICA_SvCVBV|0-mZLl? zvlw0H_Csyyfm;jj)GsuSt5p~lsSfl2UIZ=nw`5-Gh*_;$g1>Tm05>MiPo-9A)ws>L z)Zo{Vw`lv2PV!i(`vnBLXs~iSy!j4EfrdHa=MizKRQ}O%QKu%@_N{!JYH;`a<hSyF zJuvaKnIh=y6Ole~pn;W#A4QkK<^t;{N2MIdoCr0=^>00x{aVWmgMKnEtHFdlPTqqm zTe@?e_HubmPwUgbJ}C@G)!2=RF157%xxw!WE-r%1&b43(#w~%tRcy>Lu|@rV^)N%9 z_MXMY#?th$qimSmSpyj?#WCb8sCyVb8YyLpIu8q=jVN&I1+iOPr#~HQa|}t4wy#xr zm*#1@pa7emko|NEeQeDy(47IPD(ViFYc)#k%@>#zWDN5Ts=-Q=wE28QHOk*;n+&u| zL1iknA!5U}F>5Od`0n@W_%VBXPfK@LA!&quPO1n$*2_lUYDVo{(!=Z}6<D-Kjwi2@ z)PHH@=;7br75jBdn;dIteF$Sa9x7FVip#ajqojX~#o-%d!g1f+iK13#ZQ{65LNm#w zEXjQ0cR@{kF_YgMID1ukBhlzvDVt6<SW_gvCS;8njV=(JZnYtz^WiQtwx|K{<Tt-N z@#NRB@Z>-y#YC?d1)6AfX|6GiSI3QdW?6MCHi)WGtCMr|^r(HITWflFoBI(J^bZvv zhvvOmiU{tW|AL=WL?HLqzuM)ibIuw0^V0J&pnGt(qFy6v`ng9NdQH}MS(Ozy^E#S+ z#42X~HDr~VLJJQg_33U(Pe4PhRmXYd$k{1RxE3zXW3J}jy6BCc;z*1a2AfYcID+qP zU-`$K!bA`lf9Sc6ybHXQ!lRL@V?;@WQmGx1o4^QRe%~~-X;du#YZ@LyIzecD{yiGc znm!EbGdg^#y~anpKYsvcEAwuu<|@joSD}4G=pe%aW_+7WrRrojLZzj`r6dnm+j{ah z4B=K+4yAW!Ag1-*{^aD3SiUfAOVP?H)RyP!f4+b#Mv#KL^J}je@tD9#!9Sw{F;(K< zoqQ6JaT4K@<q==6fy1&n=+K7HjTPWfl1w{E!H;5JF<~2Y@Gr~M+%%%}-)`|gt%F5u zA(NW){K<F1nanKo$$<ah-#eHb<X8*ui4EL~vVH3DbwNUYel}-!08g3T(p}BgF0R~> z!((4G@HKF~(|6kv_H`SMf25UvT#En?d!MXyrEIQ$ZadpxJb^0pcah?ga?k-#iV|b; zO{IV-V`J5;UKJNc;fs})$TDnAjy27GOrf@`1Cz6<%jjT-$~Xh0(>OFVIsMU$rYUz& z%Ki;zsD_5@Z7olwdCgHhY1CJ6zns<)Vj?LuB&bmf{o9CyTrMaRZK_K7WTmww*kEIu zuwAYnGn55rHz<2xL9$!%3P&o~6Mj13px4#V54N9PJOX3Z_+dsD@Ry#!Zbqf>d8mJw z|I{wy!JmjktVdwGkJ7AIoGlDBHS4x-T|Q!v;?w*??jQNeIC>15G0lRBZy&>gZ?qzy zdL<Yo{mnd*%5cxJ3O2Q~*$pgL9$5^TZf(zS3BBp&tuJv8bz9)4nV6aMdZVh3$1vG+ z@Cc8?#Ju#=2CLL(YWB^()l7stE5{;m^BC=Vwt@epxH)VuO2xf5Hqcobwd6SyCeS{$ z84Gvmqi{xA5>+gN{V+zCgHg-QsS(6Xwz7}n#T85OsVFE6WmXhusG?_mjurqJkNR6Q z=_~`KMim60+^KEs7@FlQWlF(+)}A|cP?h8=F$G6wKi)%<RK@qJ5Tj_f@{%ROs(wI+ z#E}yr*GK$FM=K{mHM9-}NiWq=CHfBmBDx?!E04L#%)`sE3!}W8|87IrHr8(enup0Q zUB&NvKDp1B`{J;z%g}D?^Xp_zo-LE?p*doBMTrsut;s4f29AU8?hR*yglNcIexrWq zx2*TjH)PmnsR=do_LviLcjiJ6{P)ss!y)iXE7NiH5Z}`ZCPzYafw;X4wp=SHkhbih zv9#D0-vTfHRZo0HwVN^X)QL^C^aO8Jbm*=V04}H$D=v%cEVVGS?XJ5cs1B}?6|y5g z%-h6rEB<uy7+k3%!h>ZN5Z?DKNzzn1?_*NE;tJTtJD)J4m$+kRK;!biJ^e*MQzM=? zf@nkIH@9*`^46=m_zV_~`fS9YuIOBp(S^DOvpi?!eeSUR0caU%iV8Wa{LwyZ5ePE- zqelpE{(Sw^ZrEo0mxV+}ZGFeKS&;fYrfVxA+2575Ct?7fzc1w7vPQR9jQl9pvT5T= z8faz$gm`kR*`0k#jeY9R3q};@cXLmMzl7!(&zk0+kgg##Q*C^{*F<4<SAKl-nG&b* z=mA=NRUbFqM%1z|ciV{K6fH&Hb?Nc1Ph1b&XydvL<J|TERpU!exoI1n-A|$%tm!D| zPLoB9JS2YU>dfp2{c9aDZ8b3(zgdu{-XH~ss{e(ETEeZK)Ny0J9u=*OU~scUfvb57 zic^QV-RqeOXg=kW3o0r2xz-1ED==-#2lh7n?(4$$FPFg^kPI=Z{DlLrM>yn)J052i zOYje5p9(dRwj-sx8`S`cUkPVD`oUcx+_36nTrKOqqko~g#2+~RG@Bo`-VAja?VB8v zNqj5B)!D|fLw~`*DR{T;&;S6agVnRC_z_wHCL|ogA)m0BLi*7e62qe&o8%iQ0c!Hn z<qu&beBkM*#=h^Xt;YOokj~lDvGd|2Zp}2raF65GGx%iub;A3p8OpfMf?p>JiHz#U zXwz2Fc*M!AiFog~S1|U<^^T0RHd2V~@u5<I3Z|WT=w|LTV_L#K!_-1sy)0VuY{%kL zpVRVtBWvOreCD1Ra;~pbr_Q&!R!7i!Xm7MQezs74AFLfVD$}=<gvFtX3D6&viuzOT zpBL$o;wXFoF^Wiy^Ts`IOgf_NX#GgJ!N`E=wk_HCg1~;S&Aj2nCF@dHP)x>Y9vI`@ z{s{*Tkj`NdYQOgQupHL~o1aU!8&!0~-%+oM+ZX?p;OvkHEl)J36;Y3G)LnCrc%%lp zaA%-3W9sR%17KBH@5V1thAKu0tr^<m1p<EnReRtzmeb+oHP4!wrnT{Mmh~T>J=OfG zWz?x@Oy+_n>S_)nCNG1z38H-Q{DjZ!3)&ky6>9f1o-4Z%k{4in&Il_twDA4KGwHy= zAYWY_F<vGsh2<WcUT*%MS&yhN`FNww`4~6>F6}wNRn}CC@1S54ZY6GVPeNKw5l~gn zE6x8n_!D)CN2qkzeV8!OcWKo+yDz6vlBq7)$KHb4;Fw%yE9_UOCB22qK~dm%8^wR> zD$lK7B!*vV<9ok#hnyXJ?(_=8GYMXWy<T0u{`^q^Mnrt360J<;a-ED{|DMJqZ8IVX zKT+Fo1mC65_p-Y#crg6o(^p(45gp(O7n%`b!mw<7y!~fftI4zK_KbO%CkT<_9qi4H ztA2f&k;&Q_Y>OFIv9f9x>8-><nV6PK0Orn>6gf)CGewBRjgJsVJtk(FsQ#v_r*QDv zuuP1jp{;-ESAmM%wU2Md`v%q~+fS*gz}lR^A*-BS8O`1j%KOBRX4;sNgU+Qf!4z`P z#j`f2Z)Vs^O($Rh;dv@r4@Qvwj>9b5I7|L0jOmN6?z|czd%c0LQSVrg@HFsHYmDA& z{8_ypAbi1`-q6_Q7@T3~6h9B_8+h-2eN;kcrik$<oP1b0(~n5+4GZ=uE;{(8+8{IP z5!Ih=bm!0Dc#dCuYZ{bmxj~4?^Eu@lfG*(fqkj?``tgO_M=(7XgWp<cp;@c6w%i9k z90JXHsov9#fvzWz9(eh6ZkeL@R=_N4SgIIAtIQ_5VYQmr__zx5e7ta^tuP&S7!Fcx z<~QUK>XXIf2MSLwffe!EZWm%g``I+C)~2d&NItgeSy)72m;v4UaZC%l_Jb^J%2pWl zG*uK(FAr?e+}i?F*?G1x`-J&t_Km5})+o<UDKW`ij{T;#*0Gr-XAJxe%ZM?+?du|9 z(LZ$NO<=gFI)1Y%QW2}(M9w!ReF3~h*2?l_xSerAK3>rnZ+bZ(q?BUD^-Fzh9|`F) zz)U8<3Ds<iOTSgUsQ33U{4^`%VjofUJn{@rIWbiT*ap`~^W%|YL8Kg~7&vE&$+J{s zYjcl9_5!YF+J3B5r>9mz32+kXKN2y#IVU#Ab<*1ZrNl(>7{_%0mJWLQmHP_aCa{c| z&Q7&Rs`u^rpm!R#rg&x(Z!U`TcOoH$M>$|1{CGYu?MvP5_ln1b+dX%Gxh0OloO;Hu zcFxG>--r$vGbSo6AD@v1L$ZYg5m2Pqt?Oca8E~`p`#D=F7BfNu>-SZshdBuc{ceVy zX+^r*`Bi!4QH=>dpaQyC{yuOz|6l9b|6l7q6`>K6tM8S-T-&3>9KRNzZI&f2*;4TC z?i|)Hy6m8%$*$i{V(zTPyxoh>EX6iXW;d6{LrHvZI9&Aav5g@CDGmi2Wdxoy&6>Ph z_D=Dgk+92Tln&_k?Nk~G-!+Ho8gyN}wZPi@+AdEpHAeY(oj6iy^O|kR)h6&$-svTB zmwhOv)eblTCwVOv@QLLH)0JO&=b;3$ROqPCZ6n`??C#X^mqqBlhK!}aPK;6|K7V8U zBZq;I>%+-KFX;;dd^SzXi`2E`;{~U3k=01l2y-64=nr41a^uep)?23w67ucU^uBBh z`fcVLM`WNb;5ZG>+Lx07KUxNNl}>1@@%;hW?#0RPwoLOw1(IyJ(zL`;MdLutQ-Fn+ zdqsVVLH6(gre+GX_mZ2#LS-1(zGM<do6j;XOkLl0^b$X;`1Q8e?rn4T3QHCl!9%xe zyA3r7Whx@Zw?iGWM^oBmsXfqPgEP6=dQ+((896ZZrYei_*nk8k2i9ptNNa%JZhxZ% ziJUq}9m_n(9amEr)aX>+wlK`wCQ}=7F<NQKFqY)U`&Q@BS{`YhdTW39T|vWp+XNeR zCty29>ZVF{2HFi+EdbBLan5E&+Mbptyye6(a$GEop<$M@fQ2*%Cc05WP;GQCP{(FM z&e(D{>2}#RDBArrD-DVqKD17c+c)-ER-Ho(voMutJ8+6eOqDMdgIhEnxvlw%$ObRn zn^+pY74j~eu_5srsB<i4KDs+j#f&dL&clrx20pW{<c-may_4F%MVVIHY45KK)A(H) z|6Y-rwMsDIk@s$1HN(rTT5I0mFl=1)2`$Cbxe&Bsjn7MjVa;E910e}@f%9{y4|a+$ z-&G@mAR=JOY_aT$c$&jsy-Nbb>rf5J^tYTeFCMZ7SjLV$ATP{mMCz6!xt-ma?qf52 zWZ28PL#ib<22z?N8h1~<B-lar)K+TU?Sb)b3m&QBjiCW}IIb&n$S;qwCMT~^sqPEY zIoiLw&B$P8=vR8K)z6@AvgvWB5kqw~`uV*BSHji4iLE2qJ!>`4gy@N+g1;u`*IUCh zFUQ&z#wz1)zhDpMXkM6dtqV3bED50<R--0ZFKR}!1Sie<91puj*hd3Cc;li#rm0Z4 zMrx3wOG4lZ0ot<d*Tzjv_@V)1beBL<>4HF{YSVFGgO&34@X|EQp(g39yY--Yh=1~{ zgTl^^3SaZwV5LSfJPYm(@cBFCzw%X*Y#1Hqiu3$6j%k!4H*=WlNaKn>;tN!3Z7TY> zK1LaV6IVm7mC^W#t9JPaII=3dBNubuS=0UX^)M6C$~*aWYoj57Wby)X{szrv1GSqU z#FJ~JEv+s~TyoF1^uPilm&U>v4Zbs{0z^ETII0jL-o%GC+mO;)Zn+hJX%oHV7W~GU zA!$44>8xkmTHE`FxTaFW$^MaGdnWhKT|qg7$-1juSJla-p#a|L0q^d^BoOkg9_>&D z$?b8V<Bw~MR-u2>jlHel9}155q!(6)KHZD=9?tVvwNu+5on6na_6e4YX2ASj>jYq9 z6Q#)UMO^kA`w|R}kjeNjz2xfP{U@ILHjxrh(mAbLj8v(OA>||rT!hvmP%Mk$u-k3@ z$X}_==rXnpxY?W*7uf9TwP*jR`NiJPca5=gvu#mes;2H{h{(gy{Kkq0oXY{Qak%M` zibF3t5`9*1vqR)byR<KCII48}B%!hm{Lzirl?^3@Vk{3<rrO|$vkS-A&ai6j&ysve z@B%XicRRqez{wc-R9cET_1MHw+K({z$tK!HQ@EWn$E2sR!!GyYr#oY~$UV8B2nwfg zQz>>glRI7L-*zxU3Nx_fp96^~q`vR^<;qJ3TRi$X%r`AB2dxxfGi6|2rQ#0+)%_d} zCPN9toU#c<*%7(wY^5RkW}6)WBH5%^;o46hlUmxW?V}Y8&4QDC6*4@LFSU1@pVQ+F z#$)pL`}$9<&lCU*{l-E{#GtnS!zz%On$xEsfpW0CSgeVGB**UHhizx(^HKm&D3E;# zWp$Tk^}}T3C9Z>6N223BK0@DC<~P0i?$_En#;2@YvnF*uHTlWN=oXYn9Z=^qTYn?A z;@1V{<iDU89>mu>ho*C+gDlbeL!Y9Bn}Q}35ED0H#4EFoZ~Ijgfr<OmgE>6Tv|s1r zPC{E69sa<|U;VQ9>m_aT(GPaBk;gi6y!_c9Mfn96l2Rw3s5_84I_=Ucvr)j$Hqhob zj;)}t&xdmem~K=qEA!->{E4l~TQ3}2igiH35M!R!!pEpNKY?8nZVC#D0e7#umsF?U zFPkC&*%yp{!bQwM()ZqOfEDrd-LJ3V7d^0g-8x5IjCM71dt?W;1mnVLpsUuzYhHvq z#O;@r<S!35)k*y;dPTlsp)@9-^Oz}Ziq03Md@k#AnD)egXl=U#;hv|S-CX}8Pl3$L zChYt`r1v8h=<JzmXYf_lTeOA_k8kY#*fMg*e10;SRb(Q)6o2}fIs`&V`MW^n@_6mu ziv%rzL-h^>uaYu`y4CN#0J5eq(0|8#jH(%9d}1}+f0KOLeqa^`qV(Ud*fLYF>?6ra z^&9Z&rLhAdhx*@LABpX3C0;L7MK$O{67Zu4N!J{bvFmnobFFszl>|5zomh|4)P1Ap z59);F)>S>}`pP$#vYFNuz+Se2{4bOG|Nb2J^qy;sq`kIm^%=_!F!J5@g0(>ZiX$I; z+ejTR!C5i`KhyR>W2T*OU-$08R7_5uUD9J{$yuVPJ4e+{GYa21#TpEzV6x8mhT9JS zvOu1$dC@H7|LKu4`9}*{-P3|g?qsY#=WTVrKr=YfIb<wyjOrW>PtloGQHx$W=@X}y zv17gx7cCEd&L$VG$fsiV_xZkt%~yY?J$=pgCKq@657ymBNX*>gS>mD7CzT*7JERy( zX6yV?b}Wdcit1C$&3)#+;oogUv`y!Mm25w1wSr*i)sR&jdb5$a{MAhYM0E4LK?7BV zO?1M~0^&VhoGX>ZP_P|V2Q!|Y<sEKdrMRe^<TH&v|KkYE)33AMHat2%41Sr(9wrWi zQ>Q{wm}gs9uJs#b=Jk7JaAUdgrgrOx4Dt!CIp&DFo1#?qv_sXK81<J#b#t6{0Pj}S z^<HCrCZ3;M2U*i-g$cHZ({$2hUHzr$1w{yOHfm?c#ynz_A&Z!bBPa^;GtaqUapo<L zy6#+l%6{{#mE}9O?vR+bJDj{qOk6sp79p3HsoxYRcLYMF5}i%mcexjejvA5N+n~ZX z%9fjhbjFVfhAG0IjP8p*ZSau!Rgps$OEclcaviU-+;kw8TF=pS{vnYRrty~*Rf6j7 z3ZNzt`VrFV0~~F)-zB4mb{ClR=GCJKWcg=Hb`m@(HZhDanLQXGJAEXXmwPy{vtT{8 z@^&8HcMiY-ke>(yw|q-#g*R^UZnGlJkpYbWjlTH!dJdMouzlmBANWlvQ9t;pWFicR z5^iDRs~&A9bh0Zs*A}J_3Bdq#_vk=MsW803vJr<^Zy}noJ%)UyX1@NyF`x28|BrQ| zy||sxm(QoWkR+(Qb8Cj~8ayY6t94G?SNT%Hrozoqq@O5=x*T;IyFuU-D(;Otp*w40 z6(io^+j@(&UHwvs|Cqzcd?%a9TGlhGNjmci$=TI*ceIuDmnT9yja#Cqpj9JvIza5$ z!0o)(DCas{=40^9FQuyT#|`Dh;<NaufL@Ho(BfTK<E*Yupw^AZ<)K{eD<Sh242ioH z|HY~U3tt#W`;?#m+i&dL#)y8ojFX)v_hjF$V)1RLg}<LsFF>GYDlOesJv4)d6Za63 z73igU!f}Q?kq+jI+ViTHmI#;mBymD(g@ptt3{gj<*5ct}vMoFXCS3OffhEYe%oQwI z(VA%4Kg6#CWP6#7NLlrV+Wa7WzOyZ}r%W^rs+xRhMf(=T=k31l7E;eY5I=0L?q1ij z4ZbYXm9wOrhLr08OWu1c<`WIs)}P;bW}2Y;lS~aWdw|s8=kJzfK*;;@yH!X6%peWy z|HWV%ZYygY^du@Pl8lK%>+Lwy^GM~ls+?uRecr}U8@)I8BA^_r-Mf`j0@`&2^53VJ z`eVN80g$&evuf)q;}{SPUFI!nbrn%gR?)^&J5d(}g?oz>RBwF1|F9XF4;YA@W8W9l zM!#>iDRT|&ERXHQThlR5`Vl1Hg{B2*bkOHCZQ)8(p~fP&eYgNDO8qSj`uGf%17uTD zYZBSiUbP+WqyZL-+&2!`{$^NcTY8|ToYnc7Tp@ng>3d_FiOC<a&ibyL??XSt?wk59 zkD&Wu%!@{j{tBiBNaKX*)TRy(@RRf7<-Y1JIVXeTgGp@H&NspA-I)TI*B8<~ZSjON zY8g&noF=EAiCVEcMvJ{oJ0%%Z=;Lj8VwN(gPOUlTEOeNm2lBp<TR$9)LTAs131e(+ zuj4x909QBKy=LVLt#C3^n|-8brpiqhhXD)PZDmxSw^<?V_e4}-Ad2zAGEE|=9U^q- zuWKO^FnnR;e*L0}V?r?dn7W4H1pIdAKudgbN%0P#xFRQBQ2*q)mvv=J<BpqJHe(Z5 zW&D6>r3ItQP1Yf`H&vtnW%(%gs4*%~<Co_vx_z9A?VvfW%ZYM!du}|ALo+GMUADsv z^;uNsPO`}=MPcjIxv9+JDWD5EPR?$Nto=Vd@g@Iup-uO@(AhIG9{nZ+8!HTjX%n>I z#9WRwM}`EPxZS)LxruS;VK<q?<N|8cngD06T5xoI*KKuHwcI@KSWa5u-#`_(&Kq@^ zjC_bi&UYkuiMU6>?g$CJBpRd6cLsi~3I3T1DPjvX1aa|G#pPrZ9a<A#WYvrf3|@OU zh-}W{6ii!OY&R*v9<9Wo5z9{&stFaH!&A`%O0{YVX;_I`r`#v3;$$4JfV8!X7{37n zS_8V72;Lr{^V^=4*xj*QSE4Vir<TIcVAu5|Cli|7?$Hs?s5Jfqr2YEOz6s(OCTF_M zDL#iuT7zbSjC9HnQ03zwQ*~M#WdBf07(>?ll$IFCC|72PpGoIbRc8NN7a}^NO`Mma zp<Mb`UnY;cC}=sWVt<-dfA;(K#K3|F*P7l&@ABtbg{>C%<hU>1$gYjkV&c;hWB&6d z?^hFrxXC&Z!tTmIBMgW@h~%YOL>RbCL1C-YntZF|k}Kaq9;GDn4QfHC+sk`0Q#IpH z&d00S7;<}6Xw^53ugjB!KA{yA5Bh{gssIu|^I-dA`Iy}*+q>u0$m$F!sl_u8H1ODP z)hMJHIVwf^wdc;o6bK}ubA?syufBuu;(}-(nJRb@ourSTLL7L*$~ou-8=!C|08s6c zUnu}&hV)jH%bT()4uPkpEywN_ym+pCxxw{QMpRA<wdv=3S=^d)m{#i9lDY>WeMgRw zekPjwk$4^!AJD?<GCtHTJkr+DS)3|sDXCL@VKyg$POo2M%X?OD+_!c{hW;&hGe&Gq zbL^y~VpK#!`aEf5mssvtVwa$L%?lH+WmCXgmHjiY9)c+IkcK~;#f88GKBMF5m(<4q zenkTalZALHs1)5KoDtZRA@!;#w2~zN6{xga{6fIBv)_`H9BNMO9&Dw{bvzeIyGclA zOH8i#5fHnYk7klM6MGVmJCpc)4(EPNRjjrH*1pjT7>8z>Ri8qo%HDoy&1gMO>xwC} zEy?(S+1UK3idu%Spz~sVO)pW%-%IwIE+Q$TlOESLiLv){61%`l2nHj!cjzN^#^SZN zY1Z3_-S_HCD>K6<Bp;n^?Ur8M-#Bg>L78O3@5Pe9WAZ;IgWtv0Y=%<OfoO+%L-!q} zhH}+SzGLYZ748d-yE*PI+M=UN*MJ;nm`^pV{og$q%q~zZb<Zzd&}-jl4~q=mB44`^ z+8I9nqhj)ZjHUTM18aca?Y+KHb^n__ZjAg=q2r)%eJjniifqO5_yr2g1N@e4?0qH+ zMwvsUgck8Z@IH)i6-V;y;gG-n@btu1qB2ZK*z9O^nz_Rw@RuC2f0Bx_Jt(e2C?~@K zWz}g|wIOvzf0g1*32e3$;37gD=9Was!P(qDjng>{+TZ<D<bZl8{Ak-*a2j!6ZejNf zA+KmU<TMA2x`jYjXq&57Mv(J7S$%(T7R&{CqY?hAeW6lR2PAM!M@$hnDISEEuOB{U z=1Wg6;<_NL+Kq$(r0M-bPnd*4B|Vh06!qffNF}KR$b#EPR9j8kO98^_(*5>Eo8P)Z zjB-;ZNepAiB9gr?X?+!(Gh+}&xe@)(z9neW5DtWOZjnip-04PW4mlMAlKXc--poP5 zZ^b;uuMM5Wsj-mD0d<pH`TiL*nwKA*F*<}S@I3|DiIgF@lw>|cf7$t7y7SPHvAX+S z=w%F|A}>W`RGed8eoHRO!zY?SWE8PHrDeB%@lGj~FT3n|854gcWh*034*@}|ECo7v zz$=zUrU4#!k9QyN(Hf6l`XCEOS?i@V(OB+Xp+68x9yL#Z_88j0@b+>{_HOCD9ff%R zqd&(jC!#~C?+kfdqtSOPtbwTxqnHGe9MJIr8wh|1DAcbY8`d*+wrS1(vAe+`@Ysf& zg91yQ)qDU`#<F8K6r0V!g7wk>O=|rE8KIf!8P3&O7@2dG*U`N`hgHc#{+nbGAin`& zcF}08&F@dR35fy8H|pOU(Kq*LB<4xzYdIX0pT?!SyV#G=X}8m4|NgPsWL(Vn&0(UW z^JH!1=h2*|oTSA-$QyS;xbcrgE?rSE-4Y<g^iRWTh*MmY>@2(}0CM;%|KnbH^HkH) zlK1T1H=e5(WAW(Wkssq6JYL1_KM?!-4hZ;5vuef@Z|;A;{(j|C6%W=pF<t<^4d6R? z;|lk_sGBtt60#fpw8~lZ900gPdd~yK0762Im|9>w<O!kKWY)W#M`q<f>Y5J`tFumM zC(d%<iS$K>F@EEUyf;rl3l=Apuh|An@UGDdUiP@u9TU^raiuf-B!g4C(0(E|@ohN; zUN_BTdaU4lsBnTjM!5Ie?M<^UI|5$}!*fbJX|4xGB_5)dcnvD$cqnAP3}em>8DQMt zkpu%~AyNM0o3tZ(24LX}eTFfar=W!Yfl0#Sn_&~8#d@{rqG8cR%IVwlvfXV@0uD{_ zVGFq>C&~H!r*V}!y!fw5ALIS{0*IgTC9Lozk0D-bwOZ%MXkwW^$}+_t>BKl$4r$CV zXoNL^_ibs-O7jk~AeWs`)rMoE1|J%FcXgfvKck?yJTru>@09%hA2-H-H2%eH6x9Gr z;-OinnZ|`}WrdBY;Ai-N6EhR-ALEPLo6{~X<ZSM{o&4r^-V9C{)K6CNmR>`?ujISE zEX(nlc)9ash_8mGD}qQw%;a4w=Y84FlUoN|Q1-pCG{)7QIh#Q9p;<06-so;61l+q* zRuYP$;upQW%6T&<YifUGOfOlbF<J2tuWWz%90RLO?V{-j_+m@aSp+Yh<p$3f+750F zur%c)^Anct*I6pLfAaxO7%X)816c~g?P$1m_8ps6cROEEs||<1wz@Ct-HQLShyRGR z`(-$eJrwq{C>n&vEuI>)j8~|e6Oloc0@xa-8jYF2w*{M?Gw(f4YYF^GSis8u-{yhN zD!IbJnkAJ<)yY5gq?a>_U~6VG#dEVfi&w`)-9~r{W?^(WKoY9@?difZHSD3LnD5aM z$Dz&J!sbKG4qF^lL18h`gDm+#VqcNR;H;NHh^8W1Q@^9h5ccFL@LoWCofu@FVshrR zFi<#fN9%L}+;aVQ=$h1WZVfKWsxh=8HlC;otZ}0DO~BccM~2oR!vPr~erwX2_N5)U zo$1=<@E5o<4mWH7u9xZA0;$t)Xm&-MSib|mdfv2$714k<GVSsTUNNjLb@XHfjkuQ4 zj5D4PDBQnVfkTzHD=;x0jwYZIZ5Y;<JEMRURYCrrH(z3uLTLtuF*#HvN^gg=rS#=G z;rMcO$!MxrHjCx>2k7><hc#nHP$9+y_;iUKd~iBnAl#JX$(k1U0G(7($!|ZL97<0$ zWrLrJ;NR1t7N7>{?g1G?)etX8o*%x<L2*70b>Q)m{&1;b&DI<dIm3}d#~88fP35^Q zp)x&xB0U{QzJ1Cd0Sp*6u(+MqzS)grIIQ^ZGT=)}??Fc?HPr)wxV#|MyN8m6oSFFd zenMe;4vQwD`a$4x7%&J}xZz~-`~3OyFv~}JM{kk`Lyv;?@;(~I4f>H`*?;z~p3nqd z5#G+6@%+Zn%2@2H5s}+ox(fWX;Kx8b<MqPkM<%e(Ipbd-FeZ(;lJ-({i;>-1_G(WU zz6|8DFI-%$2duv!w8C9(o_$MFs$uND%L<^}34g>^gRG_&uK<6EOS9KL`r;S(3(3(s z`SpJ^1zSKOu#u6oG^^f*n|=AKOxjegjwh(U`}Csg>gXad=y+iGG0enqw!C$?K*YJq z;Z3?`OnP@Z(`Ix_BPt0{GzME6<4l<>wmzJ9RNI&vgwd1|3v`A~53M6SvM;3pfC8|O zD$a7pff1iB*TPUECqM68ypxASobgjGnTCE<GY9|fe`o9jWYe6P5su6lyRvS&Hl?F_ zGcRSwMNBqj%8Y;)ETiF9s#&vOtIt)@r06;8fEye`jHqcwXQA>-)A2j8bk?ZUZVtn? z7mFvedO(z&Kt=0S1a;Jvq?66_<m(FalP1Pord-yKDX_nS(<S<;cI69&wq>-1gFCw2 zWD2Y`8;cY(b2CU!GjavRl2_zQ&ZuS8GNWmg(=O^0SdHdRn1-{SVJbd6ZrA^R<VwH& z^NZAK159ZF-D7v8=oeS-WG=nW#=}E_gdZH&^yj<IYYv@Ht%uu%Mg>~c#XEj%EIkVw zChO^~z8h)&&J%$N+%hwqr_<>G@kup$?!H5=Z<U=KE~h{B{_&k9knwcFFaD4wOmsnc zN8dl!l;i6%ka)Q$jd$4k=h}67$fTGuxb@!@qe!?0%S#+q@rKWc80#-C9G?fd{(4kn zzy1jM<8c1=d(yRd&GbOU&q3OCyPt~vdghm3ta7(-s~IJ>D!UG4{4VyZ8e#&m)Du>c zTL*zTSrlnw-dfb@XrWd?=t`3R=sqdWkILK<NPky`KjAt21Qc|qFeS@gbyvX%gt<Xi z1Vhn(e^6W6|8l(vfPD8|3qKO#+AAv|@t*?zfBL^i7oLaC@$L>5)3bc@cacc8oNVbe zov#!JE5lii>z^6n(v%r1Sc}AF6^a~3bhDHJe(b@=W!@Yb_uGfp@)WNu3t!q7Eqe^+ zrwy@}Wj`WvXp3-ZL&R&#fPr^n!ehd5y=@>oG()3!JCfUBX+%jKKGRspSyVl!oi5OZ zz{%e*irY!_LF+WqL*k0Xuf9X)I1E7Pf>>8fu769+>y(?!zdr}npmlb0JEM-J3G{yJ zkrl~4;|b`CZj#zp`vFkQg}^7A!9aT-*YIN1z0X?%T{?{7EdCs@W3!r1ya=V?Oa<iE zIktU`?eMJ+xF};ymVK|I>Tzu9DE0heVL8iD8p(~0N6{etSURy8nY3O^@9=4=)S@-< zS(WpuKA*&q-nuWkXkWH_xF2YG9?n(GEDEeywjaI%8(_HYVgthdxGG<LyDne_i<N0E z!GwMf5}0x)k_}R=;Co0vS>jn82fT!6W~Bq@nHqESW{2F>GlU1w=aY=f7DO*>F!uEU z;ud^9r8+VQV7)$Hd;LtH0{kxnBE{TzxRmY_mn@yp`EteG-=8<D0elSs23}uwYO(gS zlWqzejjYs9x7Wm~v5T3mj5+9_dqAuFKY-R77b(=zhXNs3Gscbn8<|c8;RnSG`49IO z2#_i2^Fhlh#oT1~uJnIu^t6?M3=G<L+=#TQ-{eaT{5(pd75r`^a-Z@~>E$IY2CTS` zB#ac5@$j)rl~cA!xkFje+pg}`ic{xuv(@dEvN}wTpjSUvY*EraHO%W;zOe%+%ks0U z`uV~PP={VcO*3O)QeFK~Xs6T7)J>73rV%sS=I<?S^)JN5@6t=k8%3R#w~YAUSa=); z4K56xMt5yHA9ZEZqWGIl2=s0ebe;AGZ)Yn|CUF(Dn?faIiAs6Z)U)7srh&^839Ww> z2#Qs6z$0MPVHSCMc^{**(eWftI8`#W*o6#oaLCiy$1pYOAaOVFe|&R1|JUJUZ~`gW zUwf7Kf-a=q!rX0~gk@3@ZPBw3N61N<?CtM-OlHopk7gL#h8Q6sykmB&Ou*T;Sx5=m zPer%7s-2BP(-ogZ=Q1Ja_E0Ka`(h3Zt5X;nxG~RkGVtGn7<0|P=p`Je09`X$Z$xNt za-2tGNojAG&HGC(rGDbqjMc{)K-|9fcLEy`M#?Y5P1^}!I%b<GhQoH7LCrx3FVEJQ z-IUqJh-Wl^_{PdKh920MghV#_6h2qPQ6L^A411$>&Y4Su;V~VCgZQrD-)%bKk-<ce zpv&xBnKk$$dZz`^&9befIP?&GDZF#5mLRXUE+~F?M!{rpyfMOZJ6`v%5eB)-{T$!9 z|6a8qS3bZ#lKc+nCz|#bQRHY*f1O?0E^Xme74Po;&K#@&uE&hC%|2sh&gy@e;VO}1 z8Rtpog(|RD$y|lN1(q2k_nK&BhQSM?N{djxfnYYwrHG&sy|U8T*%7hT&cTf;&(W;; zjjG0~qd52x$t6c;%X-^&eO>$O(gzdAgUQ^y#V7kkcK;t`Zyi;2zio{RDBU9ACZ%Q5 z64D4rN~&~kx?|I9x}-xwN?N76LApa4Hr?Hw@0aJEbMCqCd!G9nzu_MY977zy`mC61 zt~o<YR>naEFXFCynOKtn6%)RkUVvtRs#xgO%btTuK>x%c73St;W<s{(QzadnJJCm_ z_fCKnDG(_;WKt~0aqpE%PVf41z^R_A$m}5D5;5SVWL}82)N*w)B>bH1fHyhs3IFd* zZ-P0Lp3KZw2(-?X-n&#{))mLM2=CrYK5o1y(tl8R0(NY#{PIl3qunimAtkvbD@(b~ z=@VT-32+%|d@<)-ot9+M?=tdPDdXL<Bai99-8z8XEcT|($nsHFaoNnR?#wjX%1#cj zlWF!g&(|RALXL6-bc)xnHa2KlW*`PjrAB?8VAQXCNymq%Sg6r<fD}8y2{6jV=raPy zM<*a6T)0+-^}_PvxQ|t{xW)Rdx7ns~7nyT~;fE7m`Y=|JLzbVa+B%m{8o-4-`i1=P z$BE}+Dl6^n=6An>fP!dhn@RIRt|0^@WQ|ZYptQ)8raapu5kvIunAEiKbpL?Vq}y=$ zJc&mGzH<XmKt4>27pOb%Ux3xi+Gm{?E@_0}-S@!7zF-a#7&vLwmGeUeCSgpP4Ay2X z<HPpCG}R>|2j=#qgdd}+st5H4LgkPigQ<7|#e2YJJsF@1f2_h<(PAR#c9Ju32xBBe zlYUYlxKmKh-2E``e(?3}-e~sNw)>#4{Sb+D@wB7W`vI$uiN)^HWe#SqfN5$a;;y6! zU>2>*dRK%=2D>f+-Qyczx|18c(U45}=M5|L$;C6BZ}!X_#he!dX@Z*To6Z$|J!}+) z-tKOIDbUQ#)3hy~DLo{IK4u<JLxz}L@fKvG_f1S<HTpuf5X)*aEe^q8vwZo_quh+i zB=i?d#K7n8HFfATvEm4W)f=y!)^9OTl7t^FM=>|OoT>)CNRG|+8qJ9yJVU`07{6U$ z;ZK$%ckLH=E9jmjZ1-30vV6>4<=$<S7281WdJ@1|cPUUV(r^zuZ3#NQtr{sJ+8MhO zRw<s}H@?}1CwtxBOJe>EdxNo{9k)xL=3_B2E0l!&UTuiWeD=3a-$uGusmojG271OF z`xe+$#ow;pMCkrnw~0Nj+j8yjd73j_2;_Hj81rrT?A$lkCY`WKbORctc0U}i0uxw? z22y`9s8^>0I<2+%UrFmbsrjOfI`!@HB<k8>|Bcw=k<WkqVG#ZcB1IBe60%<}eS=UE zPXVgG`gw-7X4VAyqJ~~F^)(0kgGH(acVaI2*KuC6@aN{9Km%d-u5dIwUye932xg_S z(v3G+^`?mGDyr(mD!u*ltCu)|GxW@|8Y|uSK_6M7(XUinqQHG4GINSXl}ZCDLi%cr zy`%O;DeEl`CkP#NW?!j4HXSqM+r7JE6xROc)OzgaF~Snb(NY0i-6@#?8!1MGQFIo% zF@a@g$E}g+x*%waQLC;j>L-Hu%NnJOR%AjwBwKbeDhvh`Tl&Sx5nQM!i&XWSGb2qx zHd@xzqav+uhQIxoo`Atml~k#u&I%Xv-c>{o@gbP72R;$c1Ic>V4O49Rl*UCoDMmog z8ni5Ar|onMDCl&ot6EvN(}G);hm)y3S>z<soV{M@PB@!tF(C9d8;r&XjvU?4f+R(n zstT8_DF<oh7Odx37Qfhoe|tF!7>0_GrC-$~K(;kAHnvB?Jc$?z$csrpV<GgXas<w> zF#dgx%7gVRlXa2xd&~WhD`KQ4vu79eE`u0ZWp%l2Gx9@Bx7RFxgk<mj!H-TdA0Sjq z_(`6Az_n=py+Wj4%O|=v-r=T+Zn@HYlEZIMP;8>1IVqH-0lc#@U9)z-GwEK{r8;w@ zK4F**?&KQk+D*UK{QX<>mCYhaUQ(*l{2#E!X;ZE1lzG+%(P_Qwnw7e5#?0Rmd32IZ z-ba#y`Xl5Lptao*mzd^@><$0a0{9zoHXr-^M<!azHGn}D;}VJF$birjt;D8LKYd<+ zqT3NP4RU25%*CGW6bDSpR?tQCRBv%bDPT=qLB*1EU8nc{8LVc%i}8B@^qdE6|7)9} z81WYi1KGQkzE4pvmLJqez`GOJt{vGDBPU(I_EFw7ZoF=haRJNE?yG}XHTKM;z$LDk z)aXmqroh8W%cwk8f0@@=`os&Kc8k4cT5Sw(w?C2;rYi!6odqfAH36;5uO%hgxy0jn z7sn}UIW)*0k3s*qRTjyu&AC;`mB7}hLFc3AJu2$&3N^2+r@yE4n!Z(?IKw85b65)j z4(V%-TRg6{MPbx^{EEa9{*ia$5f2ytdS-_&yPJ^#p~owmj>#G)b8lL6b=*kAfQ$$9 z|FRT0I2o5adkI&U@T@w;I2l*%6Khe`|2At`{-Go5oIBTioVi1!CvyE{sQJ;M#wzj0 zn)-BM{<i^ccz*$Y)+@jhGUp25R&*>%K%(QqEPbFFsD3Yr(G;)O64IG#ltzV4Uy2}! zQW^t(Ap;To`=;DQ4W(C>TP7Ux311aIu6=l&{Keo6+OMh)Tn^i2^qQ>M3A#?uFJNSv z&qcRFJ$;p=FDz@<2&>4qv*yjmtGFve&6B?_6utqpC3<+PPN0IP`wqT87rv(@osE?n zkF=>+rk7oXYO?H~-Rq_f*^{L2Uv+<CjYFCpsL7{E{tDAN%TjOhs8z4pm92IIu@2Ns z^d55w{Ve{p<JteGi_}^WG2P+(*^Ky1)Xx1ki{cWU9m!dakp`yuFXb6!ED0ad8-RxH zKmHN<FTH_5SJwq^)gRH38?u<HC-<GPlOo(N7w^uBmnANF*aQFS<tR0P4lsNo{4bdM z(#HIE5gx?zFuCBl!2g_1Zxj9sJwUodJF?Z=>a1%}|Lhb^!RL2-kHea;-EkWv4iMa& zSyQ6O&H$Ws`)aQaDP1i6Rg>6+?0cP8G?2-~XA1i`QiXYRr+cYCkd7$s$k@u>=WF$( zJPG>35zW0GsAS}OW=68==gOjRa{8UCkOM%I*eHaa>Usfibe}0q?ME5<%qNn|UI(!? zi_LYV&!g5_uKxQ9aNiBzfV1$%<BERdR~tU9nf~LG0Us`f|LuMHAU>MMU=%D?*15$O z7>TM254G?2dm%7r<vV?FSe6!yT@?G&3JBj>02q{EJgn}cI&JGOO)Imyi%nyv8MB}< z0nu9)0-T78FfyB_2iPZ$Vyk-34*-*OU|sX0^zoZAVCo;4S1X4c;TuT=+WGi#nUAq; zXxn}+YwC&3{g!7e6f1WVJo)6MtxqD>%Uv@-ZDX>4no>GvW23<o@Q*2Zw(<I4wTb?l zoBMu7Pj}SLR!nHI)cS@-1p50~?y(7nxd&^GATpS3?^&1R_)V9vo{pQDby=Yv4aFqV z;%X?1kZu^-tr1Jp<`)87#}YxFRM}eI$r~?Mp*|yzU;7T@vU7FNekH_;Ik%m{ieHe+ z!v1Nopjpe$1(z&6OhD+#9J32m7FF%dBtDu6-Ii>lILy})G4fkYl^Jo4R>J?R-yAgY z_@U^2t857aqVJs2BlkbXp7*3k?fBzGti0!A^mSwC-JS8Uy<qyx2KspEbzbyzK6e{~ zRV;=<EP9#~g8s9=JT4>Vz1SNfi45^Go7{IjT7STduf>8D8U0bevWq3Xrus@Hakj9~ z)C4TD4`y%n8xNXHTrBQpt1omc_9}<228A}XE>diYV`=k^o8=UKMD9#=<6Z)rC6ePI zUHeP6`G=26PYHa+aJ$n4>ua0REQ^ZY_Mg2dcKG#|>#*%I)!~8HLvKd&!^8n9{d~r_ zpz>1!1PKv5Mc`ktp+e3V7(IhqgD^i*PA>Zq)z8JO>TR24rCHfX^Iw-1YX%9o!y|>j zX3n1KlG4J}@?<jTP*cgQJPOaF*4KvLBlebM3r<BTzNE9n4D1XYP0>sAw5SlbGHgcr zsO2%CIGpJSPj=Srh^2x?HS-j*W4KS(SlP!){nMavmzP@&+|ArK?19xE8Z~_{F@#ZN zE>^DD3Gd8Q0AFxyuZ9yL)8Q|#zN7xbKRFu-F)wk~5s1ACNLBy_Q6O%~h(0fts~nYg zaV81X*2Uev3q5)Qv*!E#eOM5L6DPgea{e`tOA8_FtQQ{(H6*?yFwi|D67dFNd5Usd zP9-jjeEMNq<ygD&`R4aan(j|@JFm)ciMn-vL-aqy#7NT`EqZTY9y!aF9FRHB(|u)9 zje#x{CQy8sSemPceT{WkkFqyOi2d@S4}SDM687OUtp4>>S1~?@9q!$8X@L_s`FJWZ zYE*Eo!PTU4sj`H6*(#Hm@9n4FI2PuwLqAQO?ROLHsAy*Spyo15uYBZYyK^=2C!QTI zG(YqJ_Gg5Mz4v!Ft6517zI84)R8K-$n{UfTjeGCykMLt#+!NwhR5UJEW@@VEqo17+ zJ?nB{3gM+F+L@Byp2%m$AOgpi8ZJ1sNfvaCvd)~`i8rTpa0=V8Eq6T2-WS3-En|f( z-<RmGyuVu8(510yYT$0Om2kju+3qp1M0O=Vt?0Mtlxn{f2SY9!i=7qT_Ce}(8%#sO z*fCVasXh0bRb}G9)<csxxpJYop=UjtFeRHrzSoHV?wtCM-y7uh(>MlF-r1zPXANPA zr<4^&!do<=Nz9r~vM)Q!pMC8Qd6L$8XF*tc+XV)PY{&qNePv(U^%V5FNi-2k7f-Iq z3Crnn^^p=C-RDmV0v`i6%l8Q(4#L~Z^tOlYB`@qg{ksU;j}d;@zy29342Y6AKK=Ln zv<pVJx1-ZH{YsmbLNw^`^jNuM8r>MzKXm#;w8Ezs@uvZ4rJG2g_A|SkQ$L*TTNlso zLBso2l7?A0viDKFR{m+rok7@E*Q4v#t;n7<!q-`t8(q9b#f1)s1cB7(GbF^c9hE-) zG89vDd?<OsvYn#R6x*AAH98sLw7aAWXL+f76<7Kcak!Vm6tp*rLon;D8Ik3H8omi_ zkmFcA?G9-&4E)o%kCZOnm;ia(sc!nqJ@BCa@j@RzNU1(OgubC}zq64v=;EIbX}y?r zua0A%_HO2CpG|n*Y)&!!gi64r>FzvvE#>uBqqggCjwwjE<1;77bHS5-PDsbG4HyA~ zsjXfaC<n=8mmBHMPscY>Rkf=urwydS>;3pXYgE_DedB3Xtg@b?yGwVAH(%h;Sf=Es z|Kif=qLG#e#PHRHu2&x?5=vjB@IAroANfh=sF^?l%w>MmLzr@b8lLN-SK|QEVB5&u zz7C9~sZQ-Cnjy^2*7|-CvSbaFcBow)iRT7wx8Vpc)nC5X7z%1|RY;(}76Pl68^^*t zZ$jN8ZuS@Pj2iAT1s4=fchnnBICZo%s_N8O8VkOv59?P8oNvY&izW;&(2CN`*W09% zPI>*lDCy!WCZU<XQg3i!f4dTP8^f<aE_PZ>xz?9%)zhl$bywI^CMbHoKi5aq8V?BJ zaBUoVPTbc_n?xODMThMZ4RHUA{O=6&kAMX}h^&i?gtYpsq)qGo?n^1xz0i0}nE&=$ z`JbQhR^fK<Hmh9Y2H+%9`zH*~;^-W{htr~oNjC0;@|}UhUrXWVvO4|{(?VolDJ#|m zc}`7My6>E}g&rQ7pb1Z?w<aL+`_t}N!}&<B!~|uFu?%at$9@`ao$IH1zPeJ=<;|wU z#1CgR2sk+z<>W>!oqfB#c~GTIRt?V=OXj<z<o4%_AFhX9Dxx&rWQ3P)cEvcI`b4-@ zwS7IMPMS*QBEI`>=rt)^|A$Fw${W`$LM`C`jxwUBhm~)r{U6e$Z`Haum1;f$9viyp zX@qg~H`u6D67SS2Oz~U~Gv+7u2QX)Aq>*aZXYyAU(^1xzg3_XpP;NsEsvP3Hj@SC= z@6z1H+!iKxT1r+qdBtT(SBH=Aho*G<`hA{+BsvIRY0Y~&8+6MjaQk1oW0jIS+ye@= zIHjd{tn3^UFdB5PO2^uU>s}D)eEeJc6dHw#1E#kMJ!Y1MtNA&7?{-bI&pc|5e{tLE zmv@#KbnqOH{7_YC$H@z>)_t?#Zd~)2<wkw`uy~x}zR`)DX9k3>4Y2<)312^ogzA** zHk_1u2309Hi;@MFCN(Z_Bvlf@N_l_C7TR0Y=VvQrA(z>;(Yaa=myFH&odW?vs>bvm zQrcsnpdiqqqde)^WnFa54dDKJ7vaAmWs!k0YT7IBlnR|Qi!Hd)r4&S?6D+%KG<W91 zDg@)ZcK6)u8?i7E2*aU3g`NfsR*K?eq|!pc+JaCpiJw)2R3!W5JHb7M3`6)wt2qUf zWYt+%(Lnx1r-P?eDk#2nF-wolh5{2Ek?AQEIBk#EG`qNF<Mz-7orN9DXgAwB0saOP zKMi}P!k!84FicZGtELmgb<ctS;|%!vPVptN#Qk+j>SUf%7c^O_nQX&oZzBudJ^c5B z@CIH<HU{G5mv4B>cU~WsJ5TWg%8dtJ5mnbP<RW~AmCICF!O2x9icf%2X<YumqFeP& z2et(*p03u;vu56!`q{WUQ!7jEnVnudw4xvYHc3$z0d~st7(_6V)7q`|oi*Q=8$GwK z7;AfWD}L9eOzLHj=u!DTYFDhcmt!gp)7I+!UeWuzZpl~a%7oI)v4(HjMV&RvjQWf_ z`I&!Qp9~?{AL^MRuYOlzN+LwSXV-Pz!cwoYbVbExiM~rC_iRrV1q~kIQycC{W*%A; zhkwn{Wx<-3f5YcoEAi`d{ws=s6lw~&r1;jf_!BDCBCWvThr|>Qdu&(Z--}U}os7u# z1V`s$!KQ;3{kDRkCa~OR39_sfjLe!`)swwcbPil)ja{!w2Q4}yoMC{9s#tHT_C)_c zY>r+FXO7xYW<0n-ujN$|+r8kz?hNU3TB&md!8`wym>mL=n{~L-^Dxf3^!fn})&HDj z8c-ROc)g{Jy%2`@St|<vyUhK^;3SC@F@8uL5hG}tBSkPK=#-tK>{|BY>uxG=KkFn| z-kDJfa)E{&FfYlH-DK?LWs&7r<O%P&;LVS_?(E_;s{Syf;33?eVr?>2(B(mP++EpL zcfJ`;;Eo%sg%!<B)FLoqM)(S0wufiV+hKLCE}q)K=Xp1u9y56kJKeM(X9%XSR)^l3 zp7`BIZ||<e9|nm8;dGkJeY7GI8fLG8=d#M6!cXmPqDkdacQ8ORxN$VJ8*ETobfg#V zrj`=_choT<UcOGoYklCLfq_|-c-_x;IUFy`*|ARJsc1a$#5%>A7msiQSZgbCD(bRp zE!CQpkU{u~>8Ec<KK6Z+`$Zw2&N!MkfLV81`=G<9R8}MB;Z^1#U}CM9uJP<?QD-<v zDmFKqCXxz0C^qjJ3y`q!!ZeBa!b@CL{_?R!25R4IxtP&P=Yd#*h$+S8uFB`hybG~1 zn}a4?{+Is@s9`E<z+Y%b#ZnUPG%3~g{tOaAh1YD|-5wIR&deG!QOFv7wqO-S<tHgl z#y1ZmrhJ)c`>$jLI4aZO2--J$uVP&pb+MMUKxXDDw%pb0AW5Wr{?EwUWD8FCJhCsr zIkNOUh1GKmc^iV-gkUv>mCpA%W0|>BFBfcApvR9T8tFoq^vnRCWR6wnO+~_gEN#Z3 zkEM+|^|7>pfg5<0|Gl)u<2{x(x8PRo{?co>hX|}gc8&%m**t1f79=x8Rgi@vRD=T` zUP96j)E|3`Eh9xE-07=Z!)G{*0<*SkAQ;;7#__i*4)@G3!HnMw;?pg===`1r1J9|Q z>dQ^O_lnaIbfjt(q3Wf^Y91V`rJXIMqA4fevc_<hd`k$mtiQL`njEatth3{7vM|xw zoW(h{PKIvQ;tXd*;J5O5ZUx0aV>}x@f9A0oUT!V5-4_Y(6baTJk<Hbe8P$GZWKxBN zE)zfBm3fbf-TZIU#AA`arnbHHYCgdah*qj`Eg%VK)+TeveSc6I62vfDbXPg@U0?fZ zeaFUVEVS4~Y{n^prCR2z`9}9fI&;*~K?CU2)lEb<8SgTDav_G5h!t&{`jcFy-j+v~ zm2!@Z(OZwr60mO5JJ_{r(C&hlNZBpXB{sINA)(*Wr~>vI_4uz0q-YA2wB$gpLir|F zo9s13%JI8YiU4-qW8zUBUEOr6>_BEtXE9L_i`S-uIvrW@ChBdaO|vAebJ{G2J+Q@Z zH2?5%X?d?}@eghQXWJP#?J9{-%iF8z_G*<w471q02;N;Gdv$jq44Ei+dwezPdVJ7) z-<&~emC06BX}>08Z&D4nGG3CT*kY=8e(2SfQaW$gU}4lO3Il6g<}|!D)<SpZm3V)F zQBC&iZxWNYH+}%p31xY+cb<vge+sw9!tswXLhAXH<K`faJk!?1L0p8Ov(NZ4sv<PT zD#l~l$!a)SVE0;SV^2)ba5#cvHmIqSw&p`YInK<XUkzWy-RWUQ_Gjn4&6UZ{&<o-q z*2T82!sOf+Ho6QyPfl=7kFR7+C{%*cVe<%^Pm=5Zz}Or4I)PS+MP{n)N-;7<r1l;L zt;X2{&mD<$8zs|dS1l>Dvh0-ni9DL+zPpoA-B3lzAa+BQfyr|~2N*Cv`l^g_pZ?F* zP^1nRH0wyHZi^+CyN>Y#o(sQo#9N_4ueOAiYPqR1O`CFv3-OpH9*A6=*J;WmFfxzk z!WcM(QeK?a0uvPD*N@78TGi`v6Hn4H$zLhXI$X7DRmqTtrn}=^PO()0jti`zwpioz zLnP4zVgoUpn*-IyB{*?Ew?j58tdfEg9S3yWP@s8{T8~yW-_%wKbTQgu%et>^8q#XQ zTCqS}QB`|IF;<$@eWMD3u?DlYUtDh3b>4_C{j*>ZEk|+y;iOz)s`OK*@z>ZdZI$D7 z{<&`pt~c6A7gvarTxvj*gu+i(5+msDL?Yn$eeOQteIp&9YP1JxRLt-_?l#2HfJbcv z_FbQWJntHM!}d4Gbm9N82z~J;dhC#J|LTx70;>K$IwZ=Kzw*pu3!RkZO;jhkEP=Mq zAY?r^?s{ffPit6PCj~9WvQjnq)?)Q8m3!ikF&S<3!nmtvYvr8K(zeSVazp>;ow;OI zO(_SJz~4@9naCnzDDh!Uy=9R7Hdh7e8gENrS48P~;Ux3M>d8~#VEzbrZYtk(284|J zveqifwzhG2RGy*}dR73s_$~~c$G2lc_6Kl^-wE7f(@uNCqEUj0o@(SOBmoYq-BhXk z&ZVplfWfE|us(Hz#Fkzm^rQ<n6EG->obOIk*E{WH@*(8#=iuYAAW+E*-#Id>l|=2r zt5snDRaURv_WHZn>lY1gG%L-yt`3^L9;sl_UiU3r9A!^!h1(YIEqv{8!jk8Ys1N4; zl+)4DN}uo2_pA>HcQ1GuW`sRgIJ9>K+}!q1&dzowlQDg7*2D$Yf2L}h2|7n6Oh^B@ z332^Y=V*qcKnNI5eK`NNo_DgGFmnZ<BUL|&BIj#<R%V6lcnQlf+jq_=v^(&U`u^$9 zv-MPX<5_CZu^Ojh-*dhPU;XWaWHu$}@nQf~y7|Bv7z>CY#XB~el<u%OYMi?Ry9J~_ z2R&VK?|T|JIw9CPyAbTA`_2eu0K}j>SvH7uJ+fM8(lJVA(&&>Q;`w@Y(iBzQ1>B|O zKz`zn)DH=MPJgN7vdF2>`?FTz>ylV{LZyWYK5b)*!@7Vvu$LzJ=$Cz)KW+0u;<p4P z`Kw%bv+18#$BSZ(Yw2x4Yy0(XwYkA(kAtSb1Vm8Vv@G2%00X5zg<Uomc9<~<K1#vq zj=!H;!IAdiMDMmJj)=~Yjn4_*0Y-&%5Yx94K~Alq<)n18mJUH=Yr#-yoJb33NKD7x z8PTM^a0pa~^S!`HtY;%_nYu8K%lCng6lU`}c57=RyP0%l78@+CyMJKoJoq*=4^Hnd zP8QI||0DRpfY|d_>m~uTZmh2FO+Wmv#a8iY1R-M5opUdnxIVs*otlWAY+*Q0?P6QZ zy=4{<r>H$`^L#g%?HId7=^zv+>dK$>_>xi9lr(m|4UCghiR7at$)lMTq_y)_WPO2Z zOf^KWtsr*AE)+X8o=^3HrzaL-CIO(qDoy(*o3ngy@Ex*&)|8@&*S7jAWZIa>bSyre z2u=DH!cuMFiALJnsUYs^0X~_j#++&#)Zayeg;}h^uu{{LnBXnh8}<aH%NSV}E}Ds7 z#uwr`fTH?zsbNsz3C`ZmL}6^m^M$;}_<#2NG5%Q^4&VJ$FOR>yJsCQlu_#8S4je@x zQ~vp}SVtQ$doXLvl}~*QRO)0IoaoawK{iLXE(It`q_5au%G(^tNcZ*z8)kslS7bR= za?fBXagB}kZuNz#79-%Jfr0%7cFSL8Hk#|0uF`_QSrRi-`*p&B2g#ZCgP74N%s0_v zBUO8kyZN}ck4|Ncbve($`St8oPyhqK)U)Eqdr=;$ygOGviT?^PlK=zc=Pb}GHP(-t zV1R;|rq@)g)2Q*eP=lnR)K|_DpmWBz24G-F{SK}-9xzW521+fkE_cLWbk+9fuob?2 z+fFXK0-PVjAY;9pVNvs60eIe+Tfof$ky_c=Qd<z@c(o^x2G30a_(q}$UVoGVAQ($j zzfdb(Yu)98E~;cgm6hW@xSGetz|HJDzu`7%%iGE;f{YzB6W~6-p4NGPmcwCPPQ6Kh zuPjj*^-|^=9zI{f^S8@Kas<Xzl8Z<E-Yv&%ILTt)rDa~zHo9Gu)B!E+o5_~d9o@OQ z%GEmgy|u%Pw&U(Lg>Hadh&M7>{3pXu(;>Bhy01xts<`3S4V}nXG=PdL(>DF)ppvE% zCvPZjYt%S5c<mDbtB%&b*Wvtkw~=;64wLh|ma5ML2$Z-uc%u?5k1dIwo^bv)bm(qf z$bFbAsIY4$Qhdp#S(}zs=s{UZD++vrvq?`+;=9_HrOP$BX#>pi?G8d(iYp$#_$MDI zRjWzvRgivrW8*kE?s8KLA{)3$BPlXD>L03DTqZ}dX>>g?9;qA1S$}X4?xu{TnpZGL zoeaYpx`pW4s8^aBJvLsS=Pr)!n-(yR=I(m($YTZa)}qZ+gyTpk29E=etV|q*7s3^D z{<|aj_xX15u`Nar;kdzYNi)m%@Lv%5-y=Tge_`isxB*AYRKdmjD10$a8P1-!mcz9| z))cBXv%aw1wiwUbnN3Ol9fqx)!nOpy_`{r%L43Cf;5kL^$R<}i8ZLHtRBZ)ST?BY; zH#F@&2RD-WAuDtYMf&~z3N5CXnMK9bQkP7(Z5qCrZarHf4n8<{SouD9^z(v=9eL$9 zwjJDhZfJc*$r;XaL{utGmm8^B=c(>2dn%mEfsPawt01Iq-FU|RcCTXesd@mt9O?ic zArm_qiI7dh5nXI0SF*=p3kqYf4w06v&mt1y6bgl03mqw^?;i3`%d6wHz$i}Y8ttW1 z(V&m7$A5i_{anaWs-u!CSJlq_22pM7u;bO|S(Ryjg7wpgbc5f9B1%=3>b2|NEcW6t zLEK};(}Kv{Oc}}E;Nr*A8+IIW0aLWrbl7zWa0x*{Pou;;TPvYB>bB1@SgK=u3cHTx zy>n!-hHX$3RRhYYJk#g)bwyRMDF|xH8?#KRQybKos83j-Z{JwYszuom9*?W)_7td7 zJo8lSNnlNHEM9`GzJN@@4jP>s&EfK{!lVZ~MB!y0e=3hOd7|uG1FV&#{`m}bUVi6& zgL02H1Pm2DA9VEdLdnRq^ZPLH>1dupdG2Y0HT^<;Io#cWH-@`9dJPFjz%;*R;Rdg2 zi^w8r#^Vdu{LyZ)_|j^Yv%vF!QX=hoXuQl<rru7h<khR_tkuPq-<i)SL9L(b<jmA7 z?ZYc+4=S%BLwZ<dHtuzl3tW_@OJG@4_f7f-JEtv`rP8CFWljScC#lEu`PQ@9K3WcY zpSa-wN*WLoI>cZ6ZPu|5t7XU3Tzo0N$ej8^GFN=M*9=v0GxuizsqM}1>=VZy@<35s zL-P?45SKfM;OtzLRxvs+h-_Rh*;BiYX1GnK+G#p$?OP|+eh~(*nj0S}QMwEEpLZDy zLV1|f{6fg|YGnbCdwcMJ**1*5J_6$Fy?ayo<|OA}w2!fV&_G%MnY<uZ0;b0~BZg-B zJWfwj<BczFXQ=F5;2C5mzR<XUxkc><gtPglfOVPdMqfJcwJe*$yfzwf>*0&sUG_rl z9Kx*J{ze|cfNq}b$-^en{;<8%m3`nWtnumtV`QVMz;tmlYYW*$x~6r#w5^b!C1KOl zbEB#&0DUWSnE9VT>%Ts0rTi|w^n~qkr@%HUHvTsq=s#b2l+Qn3tMqS)9-NvC8uTpr z#vPEn0>zB_vJ@xwPDREkY!M@49v(PA)^{dBwtSAD5NkCV$oF(bq`^oexxgfuwi@SX zuFgU-)yam;)6@_xy#z6D%-`o$rn=a|`K%zQTntB_#FVz0dTTE6RBUU41U_CXq=#BM zfbV>7p6>;lrVvT1wo-Og-MnT^*iCL%P9src|h@8xN0DGKvq-b;CgW&~3^K>Bbe) zk{awL0G_INzWY8J1P_S>BO9#xjmv@#*nYi93iaY90qNR(kgSZ@+n;_uZCnmuiCB4& zMuyP{c^+5C#}^Ahn05|Xu4de}WHOxwlIUQA4#D_69~-x>NT@qUYcs&T<9668ZoYq= z^}aC?Pt5p|7~lnd1;7yaZnjt;ru=Aa$`Xj8%X?{%*<Yr;7Su&&<dTq8nhv9p7f!_p zT)2`f0~dujYz$Uj1iX^?f?l@uO}6yWa5XUQqyft>>{o)0TM`W|ZLPivZh&Z6<9=NP zuqI%?0tivNtvEn;3<%!-G=OfBhK#**6UGz_dWS5Z<5L^rPK8<{8}GpgXiuP>+m`y` z-!$1S5sC7b;Vn3h4pi;UM~<A-g}cUi9LP&sVq2%=Ws2+LP;L!>%(UhB(e+Yk$~uW2 z<Z?WLY>q<`!xExM2|3%G{$!sPqvCXM|7oH?$0GIh=U;jpzcv#5=%}}&TBtokYG`G@ zvL(&h5JAEP^iVYx3K#UsY7aOtuvfn-)5>;}n50o5p$HJsB&FK-G9C}NUC7RR<iX|I z^HqzZ)17zYVraieU!j}y<)wSDgoAjZz=8fLFO`T5g|0XKV)~+1C@C=keI0;$=-LBO zI+FpnbK2-ynUFt~G7tM2y!C3VY`nvM%c!tm8yEp+9IzG`qo6kf>?>N6QEuQnDT4Vj z*L(tIjVbV#(oTH8*j}2X0~%W9rK54x&Taty6zkNZo;X1WMf0|-yNGP$_T#;OAP#Sb z4}tjqvG(H^Ug^kz&pAtVd|6w|qwwOs@U~hfFV#dRVg#=ZvC!wO@=2T@z*&*5amp^R z57-U)<6Q@YO8bW*=*m6GVwcD_i1+pD`vsp&7YzxNdlP^^4hITA)|vJtv?_d8N_L%8 ziCP402EIW#45lzX=4lu^Hh<)iBKw<liQgk)F#3oXBy7ea3^4-7qaUw!iksgNs>q-6 zb~!X?)!IKxC$gC?lK}QM?)|%ir43eHm{N6AfB(pV)iBUC%it(oIw2kDpCFipQ$&4M zG9igfgQ(+%Q(0qn2FzF1yPcba+~ZcMzr(@KO;5cC{|P#y9@i7zUh;D}h2DM78<zL7 zM%k^ftDlN=>-=uR>(1M_r;r8eFKpZA(aVPIBKhW5v)=qcF;v=^FuN#k!6{`tJ&K13 zjg^XHPW(xy*j9TNS!Z#PUk{@>Eu)aBme<`LeowJ|HxuS_Omp&fJ-F3487xYelW?#| zOXsuru|!Yw1o8Z!%z{V<d+myzn~7!@I6%R8*RwlazKaxwgn~^Rv%3((W20j>_9OZu zAftx+`@9=&6Ip&2y+`0%5OX>F0N9YQc^)Sfm^Fhq+F2*)XDPzm*ON?Ug6M!che;(B zxU;f7Cs)uGgcIv|gO~(315fjKOHw6IV?o|Xr3tw1-Wv!r93tT*-@N>tS=y2rL)+$B zdf3$%)pA!&P-BRR`%dJv)ropElF20zxDTVB4x*uS5@|S!_9++fL9BX+AmiVys$<Xm zxzQcn)*zxg7A1LK=`Sqs`wI;*tJgi^L_&?rozL?s5*!yc9$X3sG<Yz+FA7UyETt<o z6Oat<x3CQ1fGb@V0i&|`=K?hrPUEK>@98;&P<@`Er|6eE7!EGqQqJ!q*BUO@coPF# z<Igwmcn9-seO&__5Pk2QH;B&3913(A-IOcMD;HB*Qw-$}*e^izBkV0l&nAFfGI~#^ zoM6$jeY>Yh`0)Of4IUjD?FtvSA?8lGz1eW%rn;`z^H)TDwINsDCog<g0#_uL&hR#P ziWN$(_UJvc8smMnLJN-Pr-Fx8f=|L7uoD+tO;i)tzN+d}O_~U&LV1t7-0$@pinQz1 zcY-M76M&@3x2e+%^E4a&o?+E|xr|X}GDI$BYVqokd0hu2h?$)i5s^Guwrjl`QoyWK zxNv)Q0-0}ct%|tY99hGzPp{$j0i<%93r3@bdDAIb?j_~eUjQu;C(bWf_zr#<vdW;~ zg_hYghlr&wHclyE!~-6nv#|eAd)R7h>=6y<ay_-XNNf8IEF2Cmo*~QaX|;NY7T8`` zcOEgV(4yx#-Mel)N9C-68S1{$-Y5-^F8Vr)axojR#uw)LvBH$yeW24BD<!ms#lXup z{kVSpWTw>X0p`9J@uqn8@^ao!NQPitiBmVz;n2dZY~OSYI7i@qn<umOBM`Rf6^Rnk zx@ntBbvo~;LeFT18d!9DcxN1|?GZ*xS?5-r#((kC-U^<-HoN_4uQI8sEeJc=V#z+~ z@*cuTf1zTvZjM)5WXO-ulZeQ1Y?96zg+m8G1Jvo|>H+E7Jc?B|578`5z(}s+2?a^N z{v;#MvucQnYIS#guCPRbaRiny`2>0SbeYzm?g<s#37C0utQ+~(9|*2!B72O{ryDJ* zsix1N+G5+Kr_@T9TlDF8xa|3#^3BoCQBjZALB-8R-EH||%k|-ELqTa5v$RHiU)e*y z$t6S@_dAJ66m-FdSWPQ7ZbCc+W&3W!P!ceJp6vQ;Tc)KP(O>hTMo$S1f;L|T>=Nab zB8_y)9l$3iw<q}+W#b9pPaLb{5W^(aLfHXN(_cx|^-lW$0E)k{`P`GDbYtir07bx5 z8y82NZq1%z<3GEXe*vg}jVp^1k8_In<D4?@8a;8oU1_oBz|zhb8%N+l@v6{HA^X01 z-YHq&ddko#;XNjWHQ|)(Rm!sI-T{zDB{80pss1el;S(l8S^gluMTPFnok%T)7R*2y z8GYErcRKuMkQ>S{9Rw}Lfx~DWZ%dk$o^@r1^TijDLs6mg+*aVNAnx`v9Mc#>ABN?b z>D-9>vGTpjti7`gR@rmufuZX*#uzrK8hp=2b}e1udVca7x0_)Uf3^JzQ0V<|3(9h* zJzS?A{+<Fhj8bK5wK<&t+eFGmxEZEbmNrH-C}Ca69GD7Tn#st+GIBa0@hmVR;D)cF zI#H=h$<5S3LuoU8<HQlB%>fIkV?fD7a~wE2WislG%XzEjn^+69M0$bk-aZaG{_V3C z#a0&A3DLko5?VJd<%*(+$nA3IGj41sL$vGB7p9^L8i?w{UiE@TCP&XN%AN5aN^SUU z@nCfWw2mUL6>6F{xFaHRS^lE{lqUa;+seGh{8ZvxR!^zX4Ju3C3KJF4YdV{NTY9z! zFU6yFTSkB0x}_rQsj(6Cbw8GE)0zE4_O$q20D8}CZAKEKK6Q`j^{Lr0aAP6zf(G61 zyVK<%l^8eJ@az(agOUw#{tv2D9dNx=;y(%TP3^`J_OQ{hPsgXJW&iv<b{bemycT^& zbNbsFkj$d$s<vHfwFhJwrmX?eQ{|S*fH6q`BAnN3gr;5t-0eq7R0SN0_DE6;h;uPe z+EHoJ-3nbUBAvW@kdglAfm>gKb+$cT?GM66$6p3cH(u$&u4q3|8Tu{)akdd)dGn1c z-)N@7j0$42=ss;!$V|dV-2G965Oy(#7N7DtQ(QV$;*4*Sw4nKP#8g&eJ*D-E%WnBb zl>hY~(&zmbfH(jEQ}VB^CFr7`OD@b*T4*Y-Ew&6j8)An1X*%xB2T$7#e>VZQ@J=zl zqa_q*+=#C?u&r_6nYsG*;|i~@Rz3eSvx9c+a3&{!fH(*})%lJ>S3PT=-#EXh!E3)7 zOz8`|A=#;{(5fxRLfAET_atSbJk@_)WCHy7DrjsYc4+N<hd1+9-e0GBQSw%sLqk#@ zC_%CQVM5Z<(j!IM?r=}wZj7#chESFOS%|_*KoU4Uc}+v^9@0vr<B~x&Gf{RF6`qKJ zPO0|w^`{S?mu0QA@T07#Q|}L5d=L3u4!<wf`nZ1%K!4#29L)JR1i{_T#wVp}?bnoX z!(6d#=3dTuQq4GooY2;YO1|FDMAreqOYsA;1RrLv{P%vBw%sdE6zkeFd)2hhnihTC zJV=B8(FtNdH%ic^tGVz~!)&p;+s@DNwIJ*6;WYLzCCpUQx4K-ZE=Iv2j{~@A-!MnZ z_qbvQgCkE6N@p+o;ysNv&<SyEi_w01=IPH4bDZ92|6q<TTs?3O3Hzefg|5Vlck|5m zZCUI)AgeO2zD(5c0PlNWK?8f1Yn%^+ru7M>-?|KY*%21Fd%M#LHQ!(7*A}%`6U&*y zvz;Us#U;GOmzp9ksxOSRyhNK8$~SnfI#`P0Y6KNtYs<LJO}3>C;Rs%;O?5;zP<I0D zDE)ku&d_aiC`!Vpg75%rL6~dkXPMW*JvD~(Gr~_N6tpXqmpV8cj^wdc_cSUG;}D|v zfv&K~flKBQy#KsB@X7kCnXEB6CpyFzyqTD~fY`%JWC+eBFRI`+36kWVV=pBmh^g+< zVKWOy45pE5R{ZF;n^Aw?NJ5DJ(MV1uD-p9g`IUs?L-eb(@r(2G((SOQUXD`GKJ}yw z8>nGugsKJ!EzJyz@gf_dRP@|wQJl8O9*1pNjdluoWTf2}kqO~WQG&H8c!bWtNR5bI zjh<U=BWIOR;?@v&2(%g^Y@L#hC8X21gTp^V*;EI@X@uiIgVQ72uG!+@=hweGaV$5H zd?KLnV}FFTK=&0?@$f+M0)jZ)F*9eYT^x`)_(wg(wYRptoH39Kq2e|5K6D|{6|bJB z$@YpP%i!XPo?6Z~)Kb-cM8y};=eN~s9w4Z7J2N+1XliuLIIW<*Lz;$)M!DUcP40#c z_cwKyDz;+3d-^mx1?~BKG;k6&&0Tgn=jrS$OYUnml%~t99z+9*lFd^{xAp{aTSCeU zGmm=cDf*T>LJQNpiU6ZrSvjYh-|Kmg;OW-b&seeb7PF|1U81ZcOcgqeML<rZ5D|hM zbxS!UEIeXub8}7>p{G9{@4sOXjql9q`+T8;3{ONH8EqA~^@@Fl@eZwNuKuEg1V<Y` zmPg2-MlEX(KlIP}bI7yC`)d$*zhs5C1|CxI0~lb5`^z@TQ7-*f*J7G;<&waOOt=u7 z_m-+r1Myvx<0~DIh6*_<lEl62Y{)WIcLb#--D}w13>5QE6<Sc4znU{BPcF&e-0W-R zP572z-Yob>@Ms}in>(2U@kudo;r@)Bu9S?%E(!x_Lsd^Dan5;nipR=HgWLgNBg_~o z|5P@ry*=);vV|BLtsD1S_1kp=eqZzpo)@Wwx{iN3>|34@O%csXMv@yr|J;T=Q#h#Y z*zF<iI+zVNYPu%NcUjj3Z_q{X1a|;ByVcpsTAHFTYrtUPQQD@J$Mu*7pvZl|m1({U zJJWDGpEl|Hq^fNd5(>C<3&{x{G@R^JlEHlfuqjzWIKPFp!ZvhmQ9NE_fw(K$-4kue zI?f0ZpHSegQY{6y(lq)?Jpy4Gy7vgv_!pRfWNVWJ$9!=fqqa;!H@5OaAQou%t^h#9 zoDhOLLW$Im8|wvYnp-1o-~jAxv_Grh2k&%9L_av2aMuk!*D{}P2%!DJkqlj&_xwFu zui6bXvTsvtNHCOm<4=ZC4N0fm3mu69g3mQV)L<J`JXP*w@6-EOZK#0+`fmKo1q>}m zc6A_?zdAK*$|RWQ9&oj!O84ZRoH<14dV(RTs2qBrQ+?Mo$|i5R<q?9)MN<=SAihOS zkFUh*i97NGc*aqtPaDLS#JikVp!@cr9}7QA2&HjO8lyT}MQ<OShZ3k*{ry{KK#ayy z%(Q)y-hYp%v#O3?|0$&Pr=b%#)(*%MvSjLK{{ox-pGkJ{QsN(t5_Q($!nz+(-4Vic ze6~&;%|e;~;F-i+eirLW0MiFmQ2IT<RyZ{RxLgb*aJ~Suw)eW%`f?56gYoh`6EWSX z#^v$S0pcQI%dzroY*_Slot<SAZa`kkV$nCgxB^2FHnzF&?*nimtI72}$$DMkO)al> zpPChv#P2;Y%eF{pybjrN&bhvB+@&o@&14JTlOz_Re=Tyb{XLIaEA_sMONm%r&7?n( z3b6mICIJEChJ};19P-#tU(BW`03e<=ww55HVUDWQGMgw!>e<yCjcSC&1J}+STuGQQ zdvbI=BcH21Z=4X!2v#fbX=S>(CbcZOBqn+?#Ddh)A2A%x+l(W?Hc<{4P66H`@J}lr zVzIfVGnp^YZEm81b5-0K52YD#D$fL7`Q6oC%<IJe<{E%F+?~TkCgyD2@J~cWzVV$Q zsn<J&)BfZJu-!qy>N+e?2!kAlAqOG9vfdJYE3kku;(U?YF6gRhNJVXcG<Vs}hJp|3 z1%M|hc-0<Q8cRH9BMn5r{v6Dy`)VC{vU1!VYfji>g_=Xgwt;Ec+7K^ey0!EV=lqZ? z<QCHQ9e}K+;akg}E4z+pY}3d!fv*DyVbD`bi;B#qu<83+PM1x0ZcUYD2@-be2|BD} z?)VAQe4@hco{19gpjRSHa_S0q?=ybp*t1G0WXR&))vndqFjr}jkh)?uqea!N9LSBD ziHpyxgo1|EE{MAvB@v&^!Nd9b;-rhhD-O_PC7bhYHQdJ!Fnmi#e6e5et`@_A)<W4f z2c4X2Vb_`s>5HM&{k97*zlDB&nqqw^(1sV#mReuhKPf&CsW$W>#gDSvj}3i<D>yUQ z=h^ew+NY##dnN^w%7dIyB%^)|{jOVSUQ6o;QU{a>h6o5+qjnLO(!80r2`tW1O&(Xf zT;!8(#ixLvUg!O4tU|vpUTDL*f3+QKQ2?NMMh~#<4>I9yYF0OC*^+Z`mhtBSUUBrv zJP)|DbZKph;tsmOYg*`y&dnzKa|_S9!as%tFp&0LZQuu#;<o#vt$Z-vDtrX{lJx~` z<{QpozjxkluvKwYTI9H6X4YcU)6%lODYb%gBdB{VG<lwrBO36Ptkm=)Mp$llWA`7R zS;$qnL^Wry>NM1xNg6w8ZImda@@d;Z8+ewrL~~sr*Xyr{S@7PDIKKpSU*I%fU%!0* zqkZz`6c3nfaf)7k0_K}m>ZoY(rR;3wbJZ{DUf0v$ZU?s8_pV@R>73>54YaKPZN1|| zjQf}t3Let}P`O^K0$&z;v{bHBFus}@3K<vs`}t{w=#g}u1K?0mZ@;-@fc$lFO{r)e zGO<9wX~VXfWKUgnvqct8m%Y{S60Or|&~T@a4%sQL4Y*in@#_eV;U6Mep&|eU@T;mO z?@2#u?GV*PU%BqcQYdlcNB)}j1r&TgkCjQTtqr<)UzVjnQx9r8JDK=%KFTf>TupF2 zLctBt%C{-k4bnH;crDw49-9Xu_6F{2Tg>VYx^bHrN1Y<QqbnR)hX6I&2(7N$6dl1X z$7CptyM8M{mn9w`cTa7L^}IjA3lP00H7XnSrIFMBEL)-Lvg9huR;Y6)U<OPY&?G+S zFDm)M3iTV2AAMh$5(c6$@Nu8QKb0CtXzJG5=TI8H%7OGKk7S6Uz#*1zZcizTeLjZa z({M%&Fc1?xZ3c>oWIqEYA}-C#%o5@K3$>B&q3#6`ar{9M1GlTSKk+HOceZG%hMf&m zlvY8{Ax%$f$CE=yE-NgjduK!%bn2Z7Q@rk<*&lTf!B-INne0S%fztkpkYmvocRi+7 zN-lua;9?t^-r>E<w@F1A2aIZ;fxD*I20%y;A?FHSYDh0Th?qgv?j)7DZ1^CWDF}4$ z-ox)}S7T(e&Bx7wo9$-QvZ8mh?Cd70MVPp|`t_$Hec8aY#cgp2a3a2!-FyM3Q!4r; zz88(}1(2WVb@v0>*lVfouy_X29roIz&g9)&x~ppQ@n7+dgL|*=2ofC+=0{_`bVcGo z5KxZ3`tx0vw_kNTa1aV;E7PL-rKrF*SUSHLJ)%*}C#(|=&*59fV@8CAS~#NMc7ZH^ zxB@ULG{zsND6nRhEL?SY+V%;!9;?N$$;?{V&hO4Q!l7srK$f^UtzFOotq-PJa2&(% zPEFPZ`RixGy5}uW_Ci=(byoPk>@cFGsnH-@fXFStW8OF9L(-)6Eq>|cytc_Ma}noF zxP7$*ZU^#BxwgBuMqu$JwL#$ohFgH5_%idXb&*al!=DejJ;hB}{)D`SRU9brLwlx0 zZCWXaT~8-TV8y?Y<CvVQXiqZt@m=ek5A>UZT$<?@6Djk#npiz9mmJG4+a{fq!i@)5 z$|ha=5&E%!pX#T9#wBIA<BH_9d|MNvtcTG6YRlxo|NEW~H8TkRm%XfyA=V?~DB_VO z%lhX;87Sw}ZvTJExflWRPc&9XKg%8Fj1%fRWl1j^klV~`&3m$Uh=Jiw=XSEfAOjH` zJ5PW=D?2$^S-yWJ31S_|$_{U0&=-@tFmkWnJI`ai7A2l6bibRc+FQNoBAXrBAGg!1 zra;Low(uJ)j@${or)<yk|GxhPo(>hJh}dB!0nu6(r9wN!l3`QG)z~2E`r(^1yPNW2 z&AK~96M^`#TF=?U!xbk8&)G^0Lj$k|Pi7vs^ioVzcb+aQUVRj1x>hVx@(|aD?7E)} zu(#ML+DVJi?4{aul5mgGp$6mPGM1(S7IiTI=<&Ya--4g?Y7~$$6Pq`u^tz2s@gb%Y z7A(`A_W%r&=*x*I&<sO?LqQA<=7WW1U7#g2hc0!80Te^(m8Skhq0tCDCX#4>&Y1C8 zPm%Z$0D0Anp^spSC{Cx$S|M|uHTxhy2ZN2-^^@@{8!I~XGy|)gcv{(b|0r|GFk<p| zr1WSQ>VDB3@gohc7|CXnwCMHfs=!oXEH&U0_J>6s%zVVo&Ef0&-2=d}UvgN=C%?t_ zx0B+{EJ;QqhSB)@G|V+Ws3@u<FgAN!q0{X^lwy<KMAE`vang4B)=YKD5Ja3MvI#}% z1K%(vLURligeC4#ulg7iZ2br+_c&0x`*x$?+vdo8eLCHA=T9Ruli9&JTf64G-^r)@ zoJ-h1kjDpM5CuZKM(Vqt>O9Z=^zuLn>&pVHRVvfAVshk^20e)X!I$4I8xe60Iti^f zdAad>wdeUBB9e}974Qf}Tc7F^IN(nwHrfvfUd%X{-ru@%*vtzQzg^nv{W`?1?xzWt z03&0$eV(bdu_?0Z@Fnq|b46aZ1;lc*-vxYG7phX~jHI9_6BN+RYGnQHP_d!B*~otc zJjNm6i!@=UUA1zT_IOG{Y3UveSxhoM8mZavbB!$n@&RaKQdG6gf^qkJ#=?i$8`_YD z{dd??rjSmj9AFh*RcoofNG{J&>t6g_cn|}(fGSKubJu9GUU~P<U{7Cu(GedgcF#** zetxW>uh<M$^(=NKoxLe{>i;Ko_TN~Ye}R%u9#6ayQ6AT^;^|mAnQVlmR%11#DGq~g zm9tIpuAmpiWw1N9q_>8F+ESDJup|zn>`YfW9Cb+A*JbS}AWurqxt(R(Mz@x^t-Wq> z;88u4EBc~N+VJk`IObzrg`S-uxT&cZ+;mX=U0{Bow#L<=KI)o$rCzTE@dR7Uy7v2f zta@ISZI|4;LRWeu44yo?sdZ$)NXD7!%d|<2nm0MdUXgY=UCnR}s4X%~v%tmfr`7zY zALi#T;LVO(%If;_RCYuL&W7TeT?R))+K$n2%&PL}Nf)9{2Q#z_iB>l=yKwn(wFXuE zS}Vzu8oid4PUHDc+$a0slfk|;-HWM<;`RPCX0Q9Jys;nZDu?r9&Fk7xz~pvCPOqmj z-~ZDMP@sBtcO>`X1nuA)tW(jAp)CbEkonHKP8%btR|@OL=nnw|w}LLs|GvLK_~#J` zHE={ybh+4J9R;J(IWC?=X(|%l3v1&xC><0s71Pq4q9je{-qbUsnAkdquUL|Bxh@yJ z8+NiPO1)ES?M&F7USQT2OQyY@<K7v|f>?H*%}k*fsoC)dK{=2ohp;dOg><M);RpZJ z0!RggI&G>AZEvkqO%pW{jLlW0&xe1|wGj?O(w7#lQmW&#ncG3(zZrhdQEVYb1`t;O zTw^k@>PBA+H$bx5+Ed+HB@psl;${lh(!4AxvBG+eFNyc)4&wJSIxOBa^ALa*v7{~S zyVWk)Unaex0=ziOg!i+sec=H_+|Q$;v|1uNC_D~*TosQ~^Un+Y9??cL2Z7JMV?QaL z0?T!YF9f9|tV^eWBw9~AbF$z4kEogihD=+??5I3oY^DP_Jd+tpyHG2$;4LG&4NXR2 z=_WvTT?wCjrfx|s9fUoZ1RkIT82;fL`tKMJu<z=i^|DdYant7790{_>eyky_0N}>J z^tr&h_X~wmjd(~*ptnnEW%FSx#=6fGxu(KL5Au`WgxR+{G0m^SljJ7k=+HO%5)_IW zs|r_#(uIu{slQd=1{ey`xrm@3G6koI1z`i=;(p1=D!^i?eA<<rP2&z*ZuvCut@0fQ zzv|<rFM#!84u=QH9_#{~8QuWB|KOxl*X#HzA{-@R%G&8~c7h~A9*MNcbx*GM=yw~q zCEb}nq`5zk#9WW=;|98THND}%agY8(?C%yVyX?^cx$7Xk7;WL1y+Q#!dphK_C-R-y z{FBS~%W+j%vvX!3X@!I=G}S|<7**&@y8XnX;ze}=<-Wa9nyIL51-C|ZM0q16RoVR? z#@;$C%69D<S5R6?5s(%TR2l`z0ZBncMCtDCPHChYl#&vVt|5l*9=e7Q2I-C=hMD<p zp1t?`KKuLa{T;tQ=iuOgnYpj?TIV{~TBltgUC;*(?^}GnW!eovgiq>47#2~lE^k1? zn&C-iLjD5Xayh+?EKsOg?N9Jwzujzm97|7kpgxM?l=0=AfD$NaJby41iF)X?Oyc8# zMe^$aLPBU|j8E>d=wqVYN={P4%k~jMd=4}xT=YMr4FFJ&9A=q%`k$Pof0u9lz%zb< zrSO25@y4>Jc-rLjwWCxMoQTH8nKkQKa&X;WcnSoI#0S`4uBj;Xp9wDLFCx$Op3@D9 zkmujKOu_nS2eB$QQ7LQOe&(@ovC@#9^){79@@m0N509({7<E>y_I2#4Ygf9JBiE8< zbZff|?1-AmPky7$2LUDB{!5LIhk!AlF3;!*j(vuNV~_aAImh*Gyh9d)(8m!D^$%qY z>yPS+O9PF4kT!MreWgcu4^e)mql}WrSfKWnv&Id2#q@kJWti)W7{a9uYNNij{iYT4 zN=7u&^DO>`$t3s4wlfcFTk0M;TJXs8;Kn_my1)<Hyvgb0o_lnV8|k^ly6h37F7G@F zv&P0-dG_C#57K{jDOA+KOe{DFg@Xd}wHIGhwt>xvs2{oXfY=(PBeK);(wL~m0FH}d ziVPICvBekbI>X(H6R&7+0XMTEB}gP0@CGHG9|F3z-3W4+KRK3&%@VjcbQl)GB~A50 zdh3PxIgGuRQ#~I<v56c1T=2W+OpL&$dMJZWVdw}Ap}<Ux%SBbRI4M}!)5Uz^J&ns` zb(U7nK6p{QB#@TKfQEIaY<P<I=MG_p;tTQqnwY`JjyU|{ufy!SfV@&yRRRm^DcSKp z<i2rd$UX1~h!OoIRu#x|N|Pk>H0Gx>=6jVx#Kw5J;AO|H*x~S|VCB?**Z*AO<0vrO zcoy-HlL-G_mDb0PA3OL6<a)%uk;?Ktegj@$7yWemD?Spw&wy{X#4)gmJ5JBze}h{g zhQ&7S=r2P!9W2HJiBChE>jvOt^VVZI`8Oig!{6ICgALwB<L9Ql(bDVT!G#*jqUq+N zKMe53$O73Ow<uzDVRMz}H`>5dfv(AQPdK?R^I;CpSLm#6>_DuEGc<E~C|#UmM$Zp> z(qiDIi@04xHph8nZ`K}g`LSHrM`T9Qu=#fYVV*{H#IC^lfXgp25}hjMs{p)xHb2x^ z3azO7sA&Le5#J+GR9MH#$fEj&)#G(s#7m%=@UhR31ZkhMb0v=k!<1&_A4DTG6&zWv z9%H|V#?1$|q>R@)z++E(W4g8qq$2G%7~n=A;DOcjS`4yXYJ!@euP<MO-V_O~@1g4( znOZuo-zYNlJT08%F{|B*sonR4HR<~HL|l#Enzm`#Hhkt$bJ&x5VsAW)Gtwle<Emi= zA%C?uE1}Ii<{CV+XTDEZshc*Q2E55jN?Y;UB&|;T$yWJ#eyc-H?ZdlEg~~=nT6JY& z+yM4`bj){$Qc1#(+@td26|ft?Mrt*fP`gg2Kc2Oi35BuJ3%_-{6<9cF`tsb#XQPBB z;%HI5a_T7Q1@j#Yr#yplj{Vi|U&{Y^eDH7LPD81iv1-%JShaHa`((3DP6cvdw45z0 zJ|%S{2L`qw{H~K@|6%Ksc8>iyy;xof)9r#MPQxO+Gj7`tv`6Pz333nov2k}F_pPjc zvG%ruW-^&J2_CK%DvytgGDonuCtn>(k@Tk-_1sz1=Cl1k{WHL9X(r9A69{&Zp(61+ z1Ef*h2dR4_-}nn!JIOf7$(;F&twmEpSPWs&>kjQFb5B(Y2&zPZcKAUL*6agrWvT-< zG0bX&<5qskcz50PJPUUH`gXBY*fcQZOZxgGI|vyaq-SRQq^Dk<K0D`MCY*n-nZT=C z|6^UIRzG|#80Ku-->8gh!?Hb|BF=7cl3b&F&=VNNFt7Z2mc(UVTWr^wKLkds)~k3- z8z|0!vL1EdxR9J(hOVClw-%r5U^9g8DC&fhOB#|9hsV1Rtwq7X8Zm1d8`yMLUpRIs z%86SdSEk2ET5LI{mB-fsgR_yl&uok<c+uCEVRDNwhkIwT`V<jLFPuXAmTrJ{{lw6; zpM6)3uX`X35Wgh?3T++PXj+5c@(<%-Xw<o$WU>PK2XTz&+4kJqh{C|cdb?%u1esS^ z8tv6znBMQlEkfKnjk||)F1~9tKY0G_wS+tpTH!~UwQ7o{dAZ&Fdmv%ubW?7Xf&MKc z4R@dWMLR?l$b2k*=52WMXQ!irNkfjx1fSbJ<kTD@U3Tp&E^om~N&+a1!6?Bc;~igV z1F8y=K909Vs-@qVxO5EDxO_j{l8T3o?$6hzr33LQ$#}t`qHUB|IdDKTV!}ZF<)Y4F z;)&Ffh?*wY+Qf&H5~ko#J=}u6vN{F^W0&#mn+$}?^*%`AkH0=WRa}*MsI0(JrCxJ1 zn8Iy$exG;w#CYY-ejA8W+F<0RAWqLSEwHw|$wH0sP2Z!x`@F1vocvfh)Z0jvC{x_$ z`>^LigHy_v<G$swT)E)%G$z?B*%J3FvS8+a@QFhtyM`qjPp-7R9h};+<<pfI-!dBs zkBG#|H3-}0-OL=mCng&6Um02-h|0=Zi4sKu%9Z*P5~CF+o~pNMg&)Y?A!8BMfDGBw z(yxOo81NTaR1f81*7_5ShrhpU|1h)=J~;V95{jo9AN~1ypSh^pe7>fr88k{lsH5Lb zr~tHKM8r0;MD4<bFOt-O(vYdhr96AEv}YTt6(f+#bJgXD?gpB=Kbq8A3kYTcl~5mv zpW8+2w}nRJV%;nCvB4Cp<Q|d_LQp&9YN>Yx#cN#A?F4{E7@MThL6_G`aO8YO*NZc# zO&1s-Tg;!nhD}A0$kaD%7W6jY1XOuph&QW(HtVA-o?|a#k3Z~ets@UcIVhL@XZ6M3 zwHOjTk8eb%OMi7eP~jBz$XWMfp*d1E5N4Mj2{?n`J>!5mNFT8T6sUfRb&cnJX{4Z> zLx7()9_t7`PVgu&DQ2Pw{P7LOvEOWdwECN$iz5V`-2WId--RvoP~)o(`9biy#)jL@ z^c-)Kv;lh@69QP~2|h6TEu;<X(#{X+e@obY!hNcTS#$$Ofqal>2{d*DO`QP(2s<E4 z8i8VLqMWSytoRfd$))bLOz}X6kA`Sh<$5xBe4D(Fk9w;nNL`Q0Ml*CE^JWf*80&rQ zE%UynF@nqpCBBHYgpzQ#<R|ab&8r2CmcIi{k%wK80nb9%N~ehg1`W=bwh{T>dlyRC z+k67n5N*)4Uk2XplPurkuZ$3<()rq9FJ85ueHFW`1n0ced5}dHH69#3Za+S=Xr0)G zXpPiMVX1{4^;qh4YRe6nU7gb%n>z03b9ju{6T*A_kPq3f$Gb$in<2<WL^H<)Vs~k= zW#&uc|DzH8r*kIdf)I-i2w-?4=3*{2>I%}OLqhWFM$~o1=CAFwYnaTX%;oUu+`mnF zz;+cO4z;gAFQ^3d@vqOWqz2V>K{bmu`io~$87Kp{UbnMdDLNPvD^}i<1-!ab#L+wt zdtV7Vs^>?v>lHJXO`!_VUqSM<<Un}6a`^r+J8~jtfcE!H3TEYoyqv;rmB+cN1R3QT zXZWlrHCqK{qBJ^uJIo&R#5DHl6Rz&A52yXfjWN|Uq`}V{8Va=tU<jTm$8gn;Gxyuz zu))|4dGrg02j+8Rp5Is5jTr@2RfuX6S!|ORY1V#6ty}<7mpbFmkukg8Km<|M6)=;T z4aEhxmiXeb#)0jg7{A_lFEVV9v!LZ9d(bS+8xpMsN3%3_HQ1gc&GR@z%mRf>E)xNp z5!2I(Frd!a=nKe@{uW2OgMVj};x*k!c!%}zv+Sh}taoZGR5-IA1!+d!%i%^4Uc{+8 z1L}rUA8s~vYCzXULdqwvE#<Q{o*xj|vl+pW^9qNQoaAV96ATm9S~%=PpKeXu`|28+ z_=4nXMFv}j^T)na_tB1$hFRhgS;eo(eG!+V)f-|0h@o%%#(?#JD30`T6(ou=X!s?` zcOKKukf@=B63br4H!WqYZdvlOoxHotn5VE5>R*+Qo~?7rAG8&_><k8;aB>11NesR~ z_?jWae?3OArwJY{!dXNi0KyVQ20hpD&S{^BVb>NM5{lyW(9O=A_jal4_A1HA@S|b_ zaMA{2UoB~gZIfZQqtnuY?FP?7R(F6<bFB=NztNUV4kN-p7l8OljN)u4HF9`Um;mEB zbB147f8=x_2FNl#1_t7}j~=@phFQg_0mZN~fcNmVtd6c(1vjJ7swN4LY4DX%%Bh5W zUp!uu_B^#CMPp))1h&xZ1^q1+yyi8p;fR(^P@c_b9ZOeyrFy<N(`y^J+?)pc&1u9$ z;DjV&u07#a&9Ud0QJ|zbXxMY3!x5PIMu}HJg?nelh~t&xalcStFOg?TUqs3acM@sD z8O3@&VbhQ@u(>5Ig9`1=3okBDo)3iyE;=jrH9KsK=nVysn(XD!U5MXxfQP0<_+C|y z2rJHmZOr!H&6)gDP6bP$0k+f|S9cm^<EDJD!&RJMaJsL^27oK!+r<X|f56r28*o*B z1Fm@AeP>T^mR<=(pMyN$XERcsOU@_5$I{C!l8ZWvjs0tH60BjY1aMT69KEl)u3*HZ z=iNLgFA$VJrM`d~cwQE(BjOfPALX?{r`Q;L>_;NbZUpQ&oNtykh>a{4xbsm|@n<?f zd{(u^CL9qx8i(&g?jD>-RLmaHN{Q#|`!9(=g1BU(&zVfA9iJjWM;Gwp@y#)CL`tNH zb04V(;+q-ONHX0$>a(re*w%Cr_G-l+S-a?qcn2aU2AV?ewDWHZgoHJZlV<C9{K8C( z7fqb02467p!7mLo>-Nm)Q=Euo`AtWN_Se}HjvAKlE8T$=-UMWuUjK3MA7Ld3G!{EQ zfo6mG=Jn@hXhqa)>yKo&&eswoKPU7=0ogrgU{qzlZj@PVEU^ASPU4nZeu@XlUI>j{ z1&e(;rIL_?HmLOZf9ZuK)}?Ny($pdBk$`_zo0T_}MR(IYmo6d1^~wu1i<_@ikfj!y z>MML9rA;$G3eWfG2_zQ3t{5IalLLW3SK~M!HEpqNAhpP0=P-M8nX_4-W>LHbnY<Kr zBJ99c<c4Y>tI2lWE6a45*)R2ix4&nYpEVUFHPvx|ow~r=q6Jnf_vbat@Z-6HZ0bl( zD<(q5YmrkcBw|56V?VhSyK=bUo~SCCtT8r6S%Yf7<h)=8%u~jg5nj-m)HBr*b5)_{ zj!FAh!&6<xf22$eVn6FRroHq;w^6bP8K(s&vMZ0ryKUmE5(7$rsS+JXPplypiH!Vo z;KA#Y4~Bp`!A3AXLR*ijW6Or^1ouwkPtz#{(lGXmBZhAtN7(Lw5!#poi%gqCzA!w5 zG-L^oeTCpnE|Evoi!JfdD$nkO3iSQD|D?%?|27~s!5^c4W&cIYweK~46&YTdFP0%Z zmDf)F@ylJ^_#zl?uiZku15PKWD&5y13QpyTC|*xzb62gIb=C+O8U||WIM(~$m^<HS zhIKFs3INovwt2A<p)%ENL!l>!xVPz$MD5r;Oj0<5?SZ&9$eai+@CME!#`=I=hKR24 z0tV$*;|(-}-tW4u+gf@ZZ4E1L8_NzGsXE|DBJxvY2LUJHJAwJNk{re(-=pq;u$e;j z^8DHNrsA@TN~=r+5Gqe-D=-_!>uV{(=ZgmjC{VE0s~jHM%G6GPZ_3CadC(^jGc?rp zQWf8g;SDG8{{8bM*mL*RHZc-uPqjmy2KCBYWG>+v`2eW?TsAjt)WF^4$z^bhw4`$p zqGCNnCiB-^s8#)IN2T`jMUSm!1QIBA#r3!WZ3oRW{=cI?mq;R9zc!h}Q&&y!LG6mz zfGS!u_Kx0p9~Q1}%Vfh*=dcV&O!Z~CT6qh80;{`Dj~kVCIg{@)e+kn*$p662!7XM~ z`D+JRn^5#SkCRNUODH>|AIf9YcpiQ9YU%#ssXD1VU~$x_GD+Igs>3Z0t~^!K`+v-a zZp-{O{|l{M{R6E@0%*;;%*}a!SEOsOyy@|<R!s$1nY)D@6-^qdlXJK#6R~Dl9qZfV zI9OUYU?eA>319M5yh`P0C*@YImqH@=piH5TO_G7QgMif3DoyIG&uBGt{;Ijz^G!^q zn2k@h$B1iX|L6`E6%@VqR@<AgPc#A*RBx=^6zbr6wyk=AZtp;}#S@}tc%k!^>aLan z8~%DUA9;{sqXjXMFTW)>2iz@|Ydwumw_GA?7ZI;}bS#i5S+D_ipc&t(uV1q?&S+_J z+0lP}J35LS`Wu&o?$M_PU;;!gtE!J@Skto02f1(@y_Emsa)KTOXw>S`{SayKBfPKP zO96KS?$$H;-m$kD1^suD=;AN3nMmrvla+_8J6!mw!c7-Z!Zy|rls4TCyM~)lgD0Gv z7B*EKO&&nb%UCvCt3p!tb0!7#;p1;?y`C?bE`rI$a=<!iCY+!~iRYt;h=Z%@eT0FS z%$CdhmEXCCJJ@uB0`VCFR}j_^$31iAC&0+n-A6xgq}a_RY^5h>crQ@6*YFJ;DoQc- zw_?T&u8$7gyst2bVFs#o4vv9Dc2MdqXpaa!*KgD?zRkV{Xm=9{D4z8Jg0#0!`joH~ zPAFN@0Y{V8V{X39QjO|))0kjv`KAj0biCsSRejM^ybEPK3XU|Ybis@?Sq^o^(%1H_ z?nj1c{<Du_uG>kv86gkYNg1DXGO#QHkMDf!;QC#^CL9kS(i=9bd(a}%PVUL;8$&O) z7oK1n(rfSOraif$1~Ai#v{+w>gR+64lcG&ER<YuP5x}76yyY0W7z3PK4Vo+53iH(n z8PR&|2_Qy6J)SA7<&{s%)%J79_LII0z+fq`R(%T`NfL1CkL{=6g1mKiLhJ4He3mu1 zH|e>Qn(W@_ZEA`L&10Uvq6e|YX)i3Ey?R)X`5i{jUsBd+yQrDQOXk#;v^@n)cxEc| zk@T*^Jn95$fYiqcItFB6cXZxh-Sww3=89Kdu?MWtccuBbv&#VgG=eJj;uFM`uG;3^ zZYOJ(JuBG}8Mob%x2dfTS1_TGpS^bX2scuHAYBAjXUA{6#XJ4bVhCWa714KGp<;r4 zS8x(M<5U$Ow9DEkFqZh(7>FF-TkzS)sIv)?znCsknaR}a!xOe$(E4yUxOd?|I~tM7 zL)BMemg(_x5ekGA=4mRVaM|#yy<Q<t4J20nWY|98Wor<9kukAfG4>bzJ%8EjkSivr zQw6_q!OT49y0vxkGtCw}^Js`<=nsI=ptTRWWVI)NokX_l8mb~Q5~f`)d%)PgT4PBr zia_*BcPA9G-w3-fjsvu2?cx`w6EeaWiL$24buB#QS#pgKhrM%xGCB2ko^c+1sI7wj zbA~IXVxbW_?SiMkG+ST}RxmrXFxma_YEdp{PYDb8zWR}1*nsXz17UMYlftt6M#VDf zRk9Pl(VhLpce_5rUI*&}?t{9``_<=1=FoF<D5&+atFkjAZA|xh=b7BK{ft5My|;=< z&n!mztpiG00cTv*2G;sF#kF8Rz!I`|MiudW?S|_ssHn#(YgaEZ1|%~?R*IyaN6l<{ zE!WeO8^UF0fRV<3_*Nvvl!qR%ASLSbRaqZ<Bytaz!CQa7dWVy#Nu}VuX?h8t7lPw* zx|-axFQj|nw;!kBeyU|??z;!J<2B0mG-{>VoUPa7jg8___a03q?XDyD5PP70x1E+; z%|RZ#7m>ZD85LT)jbpsGzwz75C>Xb37u?veq?G)&e409(4gs#icZ?*%`)=&V3Wz zrkKJ(=ymUyM)bSyT$LF=hD~(lT92H&4)r|CPXNmODXdJw|N3L4qs&tk;eNFJ399E^ zmF3i<lV%5{Fuj~dY*+4WPv_wuF4G6rA@=%l-vGxk@7#4~@&j9He>SvTWVd~MyuuqG zvVqmEr3oQ3sON@x)~Cwvw?ui2Jjf>8)R%%UwnpxU+I;@^M8$vV`ufsuk{Rq5_yJV< zH50|9T(31##%FSDyv$U_duL&T=<?ys&~|H-80s&rox>B>z_=;P>^_pT%;D?R=uvQo zP&3PPsk8p*XBxoC-umX$)X%lBv*cyN4%{spx*MN<B^vr0zgjZE`_X)F?BQ`0)08-R z)(DIqALLeyNanPm(+H0%ef7|xzaB_Zi`N=*y~5{%tu|2S<uiTus>VW|wZF#n8NU^( zv;5qC^2eNY43-?%`-hrePkxAA+&cAgPdqkm4svj#8a1}u1_;ZvDC(2(w768C{rx2! zu7=Z(Fz@c6&|YA8Fdh2cq1?G|PyMa;c-PmewnX3vo4IlRcjzwfe-k0bM+B&#ofEDJ z$2mZwxg+G_r1LsyS_Q3IA;q~2T`&e=gu~t>L|}3;#^e5QPp+LP>y-p)%Ib7B;Y`nk zZraX)+4+eagP!CU^B`;wRFN4GSO*A^1tr&12GNVep2@!vQ=C;cOUo~o^Si2W-Yd!N zdUa~RkvJ;V<T^jwyR&hXI|8mVroE~#)~<^C(AZKag^Sr;=ihc8V7CSf+V;mWhw3nq zODlP6_kVvG!P@G73wM<{XzgD<hnh8JQX7d5mp3`Kw9}HWWWldRBX7N#QIe<X{FO;6 zn9CZb#b_@xu9bTkSQ71itIF+wA=$apeKy2)aleYY#TSD*$HFpufkkw|^l<Eya05Gl z0?)gRW4`2D8_x4wEKn<jme500y{HHGi%T9qjMlIWxb%kto;GS0=YnZARWE=wzUNUJ z2|(3p<CIJ)tMk-rUQ7k34Huax-+t8P&@I}2y`HYPMirJs*2^+)6O9YC-*B$yHTqV* zV%U`vv$1d*ku~r8^N(iu31yx^SW4e!9cP>~wFmmr1~>ZPo7uyf2r^n>=UH-*=JUs` zzH!cNxbeCh`gxV`+HOy-72!6dtL9O7&G423I={D;d@cFsJMJ1t72p$zy{o7laGqut zjSqPwgrKNjT}qu_VB)Humg@j5XrE5tI;*D!Vp0e>Tmv#3UE-qEPQj^YrTaeWaF3d= z9n5<2y7o80qHFnM<yW?tHnYqZ#eG?ps-u|KOCDYU<w~Lh)g#YXG7jpeyrCCznY%Dh zCTXuR11kYTLMZE^;ImTc6?bT;J2GE{QJLsNrQzKzS2xNzWUsEr+6vncCR>Wqh=B5O zt#3VOs#s5s%X0eDd#GFEJ*U2|{V`OFJyU5*4HK^0-t-)Ki%xIg6OoIs74GlBk-qj* z7G+tR@NQ4qc{lUtXFv`=!3?imWI}gD3(?UqyXcXj1;*b;s>hWkbjVH;&|4%y*GHVD z$Pdsa&aJUg(;@$f_LKN|)4%$6-bAJ;p60oI?HK+p@RG0^2s_NNthMA@G@c7)Ot6`9 z8mV+iVP8PDAlHBp!;+-~lFXvogHcIMDsr252@aId%1%IqdB|<bRDUuYFyZUi86~LD z%9d60B!ykHn<LU|DNcNa4*>}NMp)r3hu0^^lX1M}W|#id1y^wnIjjVNmJ8}V-*@|C z?dQU&m&@OFf$2)&e8WQpmZrLrkK-l{^cr`c-;jNux>*U7UUVTIy|h&KsR4$;gdut^ zf0Cw~<C!vI{LXbCRMmALaz$@*@X_KCd=CQBh5XlmCPpXbo9s#e3F7!e6({qfxf64{ zB9_Y-cFLBZB(5{PFjx4fY2$3Aeqcr3BB#N*l^1f1`y)P0FmL-w*9Cj_$^C8RM&C&( zTmz9&g6sTf)Z@!}dT0B<dKW=bK|I&G_Za(@vc+;@x>f({?H(CX!JiiM0ty5^qq1}z z<53%DQZ%mNu%AoCMnuVnCnx=`EbM!y1~mCdf4TtQ!s@&j*m9IZ{L%0WX@lx=vO5z` zJ~gd@KUl45^`T*tqWZV9UHf9&lUX8^JGL6`_Fbs~vou&2b^wrsl#0vNz`;Zj#L?Hw z0FC2rCGw%3d3352!gT8+XI0s1D!|!{=PUACThncBGRDp~csYZg9p(N6XHolbp24KV zFxMZH7mvbj?K7$0xpRk}<4&b7$}L2?b=h=Te5a&M%H9~$eI6#?wUpa>aJ~I~Nh|&s zsgolsnjF@#u9z!&B<(kMbQ1jllA<fUV%QzthmG0c3?1&kT|C%NGF*Uv&X!(*pY`S2 zKqdhG``jCdIGslb@HRuvH=miMaGO2+^_`1hIF-(2R37!{rLF$Mc1r_FK?#Xi0VTe3 z$YfZDOvJ-D-Se|pTDFZ?yH*WWrww0QUy3WGSPvAC6#NGOwaI3<#L2+Q;HTSrk!$Wb zF_cgTiS-3?*6@(v(i=A!`tH=87~CJ1J`Nj6a>s|CT!}Q8!FSD9!=mbuopx)xaT@v^ zF`z%9c$Ufexj2(qCW0afgGMO<6B<@4)$)6`Moq|+F;oDs6X-uRXZ~+PZ`|OaqJO!; zzaEeW7k@4?^i{l^a>L_rgp87MFsb9UI2V0HP^;ERuPm$!rZGu{Dx9nj`@p@D07nA| zb6q|83gcZ4u?b}+@O$9}{z6Ky<%rzl^SN@?ia`JjAf1q5(5c^*#c~-y)}_&mp91Zk zA>2RjUX?3H{9g>VNdVL4bdlD~zHQc0v&jNkM~xds(pa~_vo_tdN=Zr^VC;pe^9{S( zD$fvvGrHBLwb~22IX@Zz7vK0`WXySeY+<`ng$>DqABGpLJ#9Dmx!}J|+qQ!L_gW3a z8&rDb$a8%i*0#IRV?Y;5?h4kBgB^6L@Ai_nl;oc7>;So&iqTP&f2d<vuNlodfh2Z= zz>7;<j()$bz<89#$CO<<O{3)xr3JzIV+1}z6?Lcci}efUSED@wirY71b$F-43ic`o z?6iPkm-OO;c`mmNyG0=PHb8yXNFKxoY$=JrJ<iNkddFFDt3fs#E1kj$#t-N-H24V8 ze4-drv9jaG*1%R}4XOjloX>A8Eln7-S9=tGK>>D^jjqR^&+FX_<e!2Q`@%$fukkW3 zIDD8o&6z3gRD^E<o<{3tAQy^a&Oo*1vrr|O{N93?GD5r-HMD6}#8BpmzRb>Pgj4tf zi*x5wSg+~jnNI{-q^>XEF})Z2E5(+w@&kZZ?a`S!6G32M8Y*x1i3psW`b1XW#KVmt ziG4RG&Qs^cvf=#L6997HT+OOaZ?+Z-3N(Iib9-F)#SHpm_vb<7<38@pK!E(cZ=XJb z?O<H|W<zl*?}apkovqFAJH;B$iD?>9E>F@*`(HPioTyTt?tVa$KTfYUfj;rMTCnQN zk}*a%1wS$Bzo_6f<V^?e7BAYz2D6n$UPUV9$sAgZ+Q7#UMLHANb)TE~yWe_#bK)|I z{?1r+8XzI-F}{8IK7_<a+*pM9<>S5O%1Q2VaN&Op0sDO+dvnRaQ~tVSI9$JWsMT07 z0~q><E(h2dehls}A-G%#Wyq6k_5{;&D%V@p**apdNoK__PJoX(b@^m{?(VT4W>4@E z6$1hgsj1@$XPtVMG$6}gob~N%yNzvpQDFe4-^;3rcVLcE$u)iV?UhBmOZ(&YKZ8jT zTNzn3wy-f#E)uchFz5Y+xqW0RuhE*{$hAGMqJly^bOTEAOFO4RQ2>3KptM%XV{GKy z^Ln_=J(MY}T)px!RZJ4rT>|;)2(GHRGGLu2qdL`C5>p^<+VamVm(Tw#*!F?{+sJ<& ziPSairg|AZP8SY~6RU~!<Pyly4>(&qJ^$nmE*-KBM-rbdNVw+cu_#gnD&WmjwgfZv zQ#+U*qZB6<jD|r=A->>=INwu)H)(b6d@6#ZEMGI&GQyU8_w`Q=w)P8QF|G&~*r60C z)=<Zv1oguV@Z_8Vn+`ybnb08Zi>eXylECR?WgeGynrGs*J_mV-#^Y#3Qdbxwft9Sm zkB6de)}83~?by47595c^1k<1-{UOf3f@!$ZmllbdCJ9;rz{3H!J^8p>O>c(IS~(wN ztsxLj&2zb1LHoc({0Q#H2Nj*|uxxzBCV(}T4q?N>D%vx%L`1epKwBdvG<y5w?;NiW zvjJ=AQus&M^+RRAU3$KAOf-VFi74c`+1k%8p@%Kera^hj%?RL7a9<l%Uivz;7!N0Z zruWLrx<pep=J)|L=Yof$qC@qnA0RvZW0sKQ4g)jn5t1!2-)T*F=c**1T}|+2#x}#o zwU3S7?^zc`!~_uBa*&*ta(+6&$z%o16k`%!c?3*h5`al%pIs}43q!jeV6YAnkqtfg z(;ZG(sZ(cz8XNHdRi)5~_@TWKUcBJYh;@C~U?P`EmBRtQMuXr$mLENl>zgR{binbC z2qyE6L7vSdA`^jY_xHdV-ql7HF2^^%S6@`4-`rTZ(uI_g`Ai08hrlqf?a8n-&CX>T zT}&Or6(xJ@a>$A|*QdfCi2&i(x_3E@&Z6jAl#egG^nmRN4mL~`5A-^%4|JWg$vxuh zO4e+(g6VPsW9XL}{%Z5Sz;G%tdd4kG{=rBboW-NjPp{uY;l0ORZDrNzV17F<;X_ds z^!Wz{NNR_qQzpnB(|MDg6M%4kcGG{dWWq`D71Nbo$@X1{-bAk2R9$`~_czN~e+e!! z$i*24FMbw)ANe%XubIknFz@N*MFY{h|NV%|-5hbF)W44STi}S3Jjz*53#r&*t6TCc z7QMQFPrvY)f3f8l^qZPfd6w1L*PQRlRp6UX^Kn}s36Lla(R6wIwWH72dumDzRzEQW zUUo2sHN)Y8h3P_0^BecviF@6|#ua+bqTyi0L=Gmx7ImsmFKx!9r_=JVeX(+$Kco_O z-u!TQ`Tif%ib2h~<PAOd_WkXV43Ye#{<6r(G2MR+HY95mAJFqU=4spF?Z;LE6PRi= z4&B6ucJ2CE<JNtnDm=IlmN5_vHom$VF+utn@?QcF!`r?F{dL4~aw_!J^;=#M@o|CN zsc9KNew#q{EI2!`9&pcIWe1I}BXUV}J<S%+&WZuBNISX6JNmONv=T_ice$t>Zq&*l zHt;^p{SYc(^g#{;o@2|)QwigH9Z0i>$R%FX7MovSpJb}3cHWz8kMZ2pZq^EAm}i_H z&l0Z7qhm$pzBgE`?To3^Frz_jD$)V6(aCHgH8a}zF<1PKT}6?Bgdw@F9XLU4D|Hm8 z+<&{kW6SV<TUpBDwJa6H&_0)5p=R)9@i<<KySleMu#q*K0)zomR&~Y!TtA2F_N4Ae z(MO>?D6nz`?C_B5nooMUVUY7<t!5HwhMv*P$l~!Pv(K>WpJX&PvfuBClTo?Xfl?9= z;rL{A;FaP-DS~~cWeicApoAy4#;>3S$DJt2c$VI-SHNE9M(f3@q+bvI9L7PZ;~i8z zel1J%+sP-}z;szJi9AxVjscS`ci%dLfYxW09Q$AbGsP4U+gff|(+L7%x{|_8^+f&Q zKSTWVz5X}EFZ$gbK-2`7|KGZXKXIjZwAx5B5;M3)N>&M-R%Vh!QrLk`87@0WX-t2A zX?OhdIYn`<DxZ4V76!A6qCD`Rapp;q9#V=;0D$4`>RW9fAYRaCFXz@i)ynqKX+#LS zcK)^yqUnX*dOymCKCap897izQE2hj5F=t{>)q4`Wp%<UDTt+YtF9L4YO9S#@hr=B? zx+*bdtHT2?-;_{#PY#weyT^xbyPDR)0?ieb9=tVCyC|dbZ%QO8bd`}cesRJ;=8!xr zN8mq#OgO_|wh)8AY$5z}tOR!RHE*~qrW6oDt*r*4qFERA>u;Za{*_4Q3&<My3@_}p zVv^aLrepPPvWZ{?D!tKs=M$sLlSed|5+SEutVVkU7Uhd=tFlXwm)dRa&$YfFii$QY znLILO(yo1p5;Fr3BrAOJXxGe5-!S(Jit<6%!~49qDF_ouZ$m01PzSZ4FVEAQphFoA ztUOjok#iWbxEU(U3%8%X+}*a~YlWc6&^E>!8Lm}hPbo~w>yHNx0~*9uA0h8J9{owt zd5C<;3h!aLi*DjG45|ghM4m)m*A615u~N@G0CO@gJ$BP8WbX$bkIu6h!KS9#pH@h= z7{#3mXnE6>C5x$1sIrOYxqZnYmimha?_a%$ZG?(GKNl2Lda%Tnu1FdBY|I=8!y`0? zmv$1Gw?-Oa3an<zz*mo~q$z%x#?XmOOW-`|cb}guLRhLRR(bH99IPyC&9?ZAv!aoc zdVZH?ub(%_Gu;XLLQ0DDS^^L6HWTCjyci0^O9V2YJ;FNNf6#yu^WuDpdgs1~`^+iz zu<V@%c7@2&d81^-P^l5(VJ4t=9ntIXl~7qfM6M&)x8>PxSTM<>6BF5_UJLOz8PHzQ zHw@+FlN*N5s6Ref5aLd-y*yTqxf{4PkfF347bAS?V??|624C;u19Ucz*hs)GH&b}c zfJ>g#ZEXCS3cFt%o*<ls>od|WZlX!+T|@~)?8jM%X1q#%@b~|_kmk<CRIP25nsF)Q zz|DzV`2v{u)Hy-L_{r}=g-@C;81Z=f<Q~Z858r<;+Vh=bx=R93Z)J=jI!TtbiUFQ4 z!(}F%gj-bDJWT9zjsL9)V??bwm&zC=3*2Q|gFpUDme+o835hVj>9w_zc-&W!jr0kd zZzd^~R^<)t;^@r;+Saun6X6-Vv+(GOt%;VJ6H~RP`?C%nBI~oAQZB1F0v4-lhdh0d zqua5cRkut_VKoGwL(Md@tn8{B;5}>;-Mn8r>XtnV_L`xYM>bdYpS&eNUgdH&JFD!} zcO1J~RWyqTtF*shP<H=Q_8gWSN>9Z=+<@HoM_ly@e%vU2*P*$6=i@X!77IZP!Hnbv zSH>Qod?TR9ZM~ONATm3kBho8`42AE%sh?_~k1cF;2xC>g033ATNyQHIzCgUdw815D z55o)&aXnPm<ML&_nq{qn?|w6s9*oA>nGaKw)x@CBRlhT5<p?`;lYRp1u~IM}s17s! z+35td|9$I7qZP~-d0@ibD%#N)oWjJ>a$)Fd$9U0tz4}}uYukDK>~fsv>H4d@Ze=%M zwVh@fxD>w8ksBELfzHI{w+79|%ZGs}pVPeuj=<ItCN^tUcC(8poVAjd%RffZe<J)_ zTHpkwG6H{lO8@o9rXtBmm0vj#4We#0&5I|9DN{9MQ3(tYA1uO5gO~q|JqlXhv)hNw zfC;8_=g@S&PNMPFRBH^scEkiLv=o<tH6t6gdT91?2)QGDu5UuT&hWe7Hgzzr;^KEX zhlUZHrsd6OPZm+5fTt=y)ysKO*b)PH!nbRzap~<P+$A?B9Mo0#xSZA#*fO2t>D;c5 zH2A}20mZiuIES~dJ%)(h`gwV}2h%R#<EJS;c>Lq9gHAZ@x9iY5_l7Mi($<<0-hx_B zJ6bLm4pL}Q<ZgcPPGjqazIs_r#w^#PFlsL`wXEYd#~Qjzys%Hr!<e@7O9HR;>Q`}z zVhR^xZPzGr_P)|9rlz;2zRpJ2%9kb8&}b?t-p8b0F?3-=)?%;EHVC=u+rEdqT=0eM zxpx1dHWb>6|G!WDKR(a4rYMO9%=>;bYCUhXMbp{dXvGSy45`(d@$SyWZw%DWool?P z7aYU7Bb5}^I(uf<s641T#d~(8_%ekf=R%F&FBd3%CngzidXHEM72hz-B6oc;k~C>n zLM?)P)Blq9p%G#wLi`bmFE_E(`7N&uMS|xWz4r<<XR#I@MMml8x%Y(aaGy@cY~cdR zurL#bc$%}|o>aEs%*lj2MLqcgDKS)2RO1VVD~~OdB)x249z9CS^K8C_m*}ARoU4m= zx}x}O%>G#+{@)AQq!^YH<{TpQm0fhL(!lk%KXM*eXK0`VI!nLjxi+@TG$i*xe6_Fh z@on;{mv*hCSu5`@t)Js`?DP6ph*+(c$j<`bkDbN9fNE)SH73(R;Zz8bnoxCR9J<!l z?(ck^$V|tE;#smR9xk1UhRr=MkF4-V@sntO8EWz_{C;JtzEN7YKo-{S&Z~aG@EwQn z&g#Bo<)h<zrJhh+K|TtCoG}!Wvb${I`|EaGhPk#64rjpfIH>0ro+w=5pGwds8SyCg zrtM#gdp|I{lt%lFa9c0r-q_rQaRC_5s=w*c3@32zF-J&-Z1S!tL^q{M_5FRwvM$(` zv0sVk&dDHG^Rwdf48w9<hCtsU2NnYOe3uZ&z?Ic{ZQc}C+R^E#CD*a5VV04if}(P* z`JS1j$Wd9J;fB^&ku15p8*sv135*`i$kmSO8gCANC3N<jyCv0>GUR3UOWUTx3_9J9 zJUdX(-Ze&tmi~!|Ks<<n;VS4J-LW)9F{gFr%!VQiX&5b~N$XsySxb~f@h$Wc?KTp; za(l4cQQHa|x}7;ws#RBII-Fe9lfC_JgX?*4_=}9k8t$i?ZhK3&N!C6UjA+!*e5&;u zd0C*f>>!k2^}n~(zv=)f)(H#NV*)c`s|L^)H5i*)JbUCdC^)<WSj-$PJp}}Eyi}|R z-YXM1sHq+iy}vjc4k&$y2tKmIg7EKm43g@BWgcp<G|f8eXxSnN-&&Nv%i(dftzQXo zbpzIOS1@gJ1hJ8H9)uTi5RM-{${x3d0rBzlet-wiF3q;;O>&`@3ZJcjLnd+GtlQa+ zS=#Al+}VZW)v5Z5YthelHhZ-*Bjg4v_NU5n!G6r1ELYRcHkea~_V?QNe+eFt_ibFx z1N-C*332#5(!e&k5o`ofx5<&5bxV)>yQwfhXeYvyk;d;)G_$YTow7ppC;_9MNcAXc z?hR?F{9W6{#%?qq%VWNcE+r+*5ncTv2HV1*$`_r^7is4!*s@-HdM1km5>ISU_Vj@N zZ9@Yh{Qo@v-xvuP9!3k$f50(_>C)gHJEsWj<T2ZYZ_3dbej^m#Zhni{+Q^6cUs?px z-!pm<Jy(!P?%DIirAD%9ER^rv0Ym+{@2<-FiPZZm9uNy^!g?%*Se(673B>X`i@asi z%-5&0Fvo+Tr*j)gu|(nVt@xLFRw!@(^<<}@4g9)dj55BV=)Cd`=!$0q88D<M!ir)~ z@a%CH^WGv6(afzlqfn;$@cWbU{eQy%UUv>DYQ;4deOl8d!a4>yXF5h+ojgEtlF~ti z;eH6<x|99_{Gen3>2)e5D0&@xbSAgfl@L=+OgBHL;_ogxOBS=G!qFagr<&K_ed>H2 zMs2I3x=+gxeWAY_s-bhRgsHS$goHec#+G{7J5#Cy0lOX-eG~kn=Z?-7T6=e=*191* zgC0SB@6LNtp@b+v?Uo_=u@hT7SQD@WuWMS(-p1X%54Uaj^WF>7d`=iVlNzSM(-7$r za_ehHXO`C(z4sx;aea$4Y?}?I<I1iT{qPq~da@Dx$Lx+jIx)Wo$O@iLJD8=bJ2(2y zPV>^zoKnxRg|p`Hb-Qa_^VvE~$d%}qVxe(PhTGhj0IVq#$U^V2-Sfho`V0t7kI=mQ zO?|)XjreCg9jgG#>!QGdxfl&-Uj?!~AU^ii@!V$R57t2wf6sf-tyFcF%X~_`TI9YD z<F}l=qb6~^M^xRkp*62I(apVF;Ql8xe`pyFv}oK_&zsg4w4uv>C>!k8GW%rZ(RsfV zG^Wsh6hACGTuw7J|0jScf)~b~E|mNSeM{FSYb=xf+L%$?wsuO@qd-Dtsu{7suVq6O z-Ax{>Rby^|eE@+1%EnYdjMqVP3ajq4fHGCWKJBw%T^QR5(y&G5?e|w>#NwNb$ivQX zznQ|P)Pl>}y36$rMqY<2q1DI(n-)K#LeI$XPCrzVhi>IhtF-&kgnh8W!lq?35=O4b z5x1z*bd6Z@$L_T2P}9UPzS(?79!yq&xs5w}w@krB;Ooxy)lND1KpYw5m*&Y?tOHni z_I`fg^(x9w9@rii4wRDFP<j2w3=N_6&h$Zh>`WG^O#3862~;V8P%lJO<^COB|Epl7 z){(KFFF#cY>uAXVq~5C`p-q<`xSd(Ba!Jz86%htXC)t?-AcXLmRPL$3CiTYNXtrc1 z?#foe&rpW57AV!`C=a3`XB>6p`m3mu%IAf``hfX!Oun9p;_E=^&oAGvo3x}Fi}$pF zEKY>y>nCU@LOr7sTsOylZ1nK58ks94oU%Sm5g%3AU_DD*3Q>>t$r6@tb>P|*)ky8q z-=+#wGYn^^l_;#|T9xqow?1K;=(e{>X^iSA2AbHE%A)KJ6qIUCOs&itk0qKDU-!U^ z#CXHaw;jJLdV#|8Ko)Qm^%=#$fLGy-FLDln;5`eNO>5M<%<BfRWBZ?1_Uym3#yWlg zcA{yciKq^2ZU&gk%#yl6+T!!%-(lg+8`lR!NPtz{JDnJb9ve>MHZsfd^4!hxS@-A( z?@rP7Y<a0s@-@Q?aTftd=U|>Y<wnR|NP!RC)y5qiO(c*7s!^Svrip>zhSW8*>h=dq zugIYfl)cusHlEET5GXzHwds<FSsjRVV8k#sGv^I+Kq@di&ny23i;zP<f)lK+iUGoJ zg9InlKJkn^n*5ea%BXyS&_V`>j~%R)*z~ie)DUtBvu(eBwLh62KIzPX@caQXDROAq zKWM6MZN9updz+9HdL}-ry0tW%>Agzr<$M@hl9};6J*#lZp<QNUK7df5YLL5GxZpeQ zNkRX150e`2ohfYMh2CjRui@S1aPHR<pJ%m9Tho7U8pTv3scsvW$9PX%Elz=KzRB#| zfa@>pH{ja8$#<-KW3D5D!y0waAei*!A174TETh&s_&r^xQ1g$K>R+FCl5wgIpO-h8 zk}P08BylIRn__-NDBASo|A~M9A0F0qu{+WaMrbD-{ce?mp}TcU9&FdPRc}i=03&9x zbk(}D97Dzl&BcL##pNhAiFClW+p<qebrAn+mzAYZ26`7cI*+`2^e@<Z_i-<DP{13l zi;}8cdh+hO@jJj-6|D2HubjVQP}#0|4_w%K5-qa3TRjr)(-rlI|A{I#4%z*np&Iax zEo5$LM*IG|8C|DR9fwPkqy;d{Rz&3Sr#05CMB+k@>-jLUmF1@+#F*(L>?!5_`+YzG z^R(Cn*jbZlwoh&Etj?GG{7SSVx2wdwPAh<}E5G5-)JrW-3lVhCee0PII+U#qRoSoi zagBQCIqMe4(WRTbzj8~WYKQTA?}`L2-;&e@jCKtxqJWy~V{#(ev+x*Lj3!HCP3jBD zBt@c0qWu8BhfQ~q>hbo47w8$!`Ib}ZyYH`__J*{NuUuo6JvQcWn9A9R0t+K8dr<q0 z&&iV${6+R_R9FTC38tbM?n$rS@2ph$w@dARyYm5De@8&=5zH>iPwNwFRk_k`%l(G< zXQsfm(0he>vR?J&P>?2Hw0L5TmmY#?YXdncS*0B6!0UN6Myce$k9(y~nYH_q#Bg@p zIoSG*-$-w&LVSW6-<t9$!~IGnwfF01Z$NfN%g7HKPEU}hPgyLacCV}Ne~`l$L&gHX z^G0hv)nO=(R^@;-to2YT@HFk*i0f+NNsfIGv0wa#&-9PzzgK#R(#OEY-?OppeWXr2 z`vQ<;0YNlASC}ul?f>e`5<iL1$B`UIOgWXp-RxSlbA;$~@X?RgkCaopII_6)Fc7;| zl7^8|W3J%e@>o36r;ByVGFZp9kUd(bC9h>E#BoG<5H3e@%?Y<?ukZB{8}gvYOa=yq z+1S9WAxTk4<0c)SDVL<_Tir+5<5s;Nj?Rv<m1akols+9ZDc2votD8@i7%KY(tUt9J zB*ckN8#ev0!TeY)NeR(_eVaVEym3{N286Com*H;QeC#?$K`FCXRFG}~!kjuq(*=Gk z!)4I6q%BAOv-!WD^$g**Y*cs1xQK(0Wh7gs=<BMT1J8RB?o3%}A=lszuESF^lo^eU z4yiw=0=Bsz`{rVTJ7n~$->ua`;BGw{1@ne0k{u^d$ZQKn{A6_LX+fsG4Xn0uBa_;e z1eA_3=rVM*)Xn0)7kC4s7v}xLAeh@;FoqT1tL2Fi1s{voK8(I(@PB0iz`udtZwot{ z+hK&(ZfSXc?Z(z{54yMO2YOdjm5Nd%EIFvJc`48KKZMV}ZX^Ig)89boXp0*N&0vNA zR>9Z-$Q&%Y^2h2Vcp1uu+wtUA<+Q5Q$RA~mSEQE8*#LE4l&$54nN9%j1I8lFLDf?0 z9w-P_x9m&vwaCI36GTkmss*;TxEIh>NyUKI>xceo_IL+8b?$JR*Rz+-HB978?G+ju zmnbagY)#j7bF^L8eJj5Z=PSgk&i3w+Igoh9NqLAg>4{7wk#<(qf4}}dy7Ff?HZNW8 zE$IV|>JNBqew~B_W4;(2?u6l(c#i*wYuDf1830!HU`ZQXkK$r+ylL6YHF(>>#Ugmc z#tJOG<GN}KS@-eI@;#Ky(i+G0d@-K@H?%&@Uh6#3W<IqR2RTzsWC<J)(wqigZ<2h2 z#&|T@?K&MRgv=4lf1`>YhDn&_lkB!Y`?r+(MPpC1qs9ButZS4zMlPE{dy@u3QM|F{ zhuI(&qe8RvlqDQ;?(Z{|2R5V12dv2SG~dKYuQ~R$k1_^7=#}bb#~A)ja`+3&+|rZV z$-Ttv6)s-JOB;N8u=Hy(yyGA`>a$OAHQ&u4qVk9qL&)#cj1wS$gSp#a7Fs|a93z4* zRF@$OYOPy-^x59?6E@YQ<{yRTd{SBxp;JaJm)g&}V6B5Hw<UU$PzDG25<DIZ)`{Gz z{ql!1r?V-w>OhjYW!Yx_dE4ecBlSPU5Z84!HAhzhPd?!UD`^^0{Grry@7`}cXjkB3 zA<%OiOS-+&pS1ht?$?gdz?#2M>Q6DjXz4mdu9l9UN*F%soFmaM0L)DZR%p1-_I7A4 zS167hsQoDgs>}zqovth5H4Q$8?Q+=!h<8Fr<%HYM3NroLg{JG@7(rI9S_BX%l5hpJ z#aB<bLw+=NC#TIti`dvLd!wS7>G8(3?5dL%y$%A8?%o-4+V?P<A6FEtmdviYn2`DO z&`kS#`b`JA@z>EgVxzU8Q&SiJq~)==kN<gjLemF0EjZ;`9)Gy9Er+rzs}6<Cva(9u z4}501O);B0CO*BF4O5hVZ#4c<ll?s?Z<7V{_ktG~+S1&h_Inx)Ot-2KeS%9o@iq*E zQ}Hpvt6{Vs?RErgc7deRIxd|?Y4;FfYQts{k&=ZU<7k4vQxyMu1f3YM{-8xn2$ZSp zw6TSz?cCdFjFiYjqCF2H#Lp5XlUVU5D1}eQMEz4esM7>wiHw@X<_Z|-gF->TGN^(e zZkk>5#9gF=b1Ev-b0F`YlRM4Tr1BLNf?B1I?W!aDR}V|~#bY(`))!(<fuw^OxzT9f zT^DV)kD<IShmy80w%N1KeQtIXFPj7PU3om3YO`?TRaPEDe^>0J^6Osrax2o)$H2}w z$MU$s(f{jNmAs{=xRZN?F|+h5V^OY0n6anx0+eMpg~%LlFP#C%`#dni1>xa(1Yne$ zD9YLtUGJ%V$hm*2^D+ui<uaoMTk?k6Ku)3|gi49Mngq)A8>V7JpP94nO^M=?_zsoT zuNnf;`5T6{{_ngH6)NwA7hM+|ymlHqNW3=N<#sPObi=A`n}?IZiwIbd;Hsacn$8@X z3oAg)MY^cB1m5%5b)Z39s3dvIKWNzu7_=Tp<i3G`<iUOfEC!$0fbib(y)b5y>LiFO z7|NzpImiuZ9H{GJbFviOVCJa<vb(gMa(zz6dXv5^I+gpuLTF0u{(;0kdr<@fUSnpM zPmIp$OZy|46t(YySvidkLuy2lN#fO}BjI=3*xsf-cousu*&a9hVQV$~IX5`?p>E%P zi`ADX+Dn`XHN}yglYIXUpG<09T8D+og1m-L<1g)6A~SsUx0L<f72;vu6cS}kr$Sny z_2wTnl}QHTxSrLfbX#)NA(|(EK&ZXpIp0cT%DvRZqJ#Ri>qmtD-)F3?DdJ05$2TLb zeUjh95VLwj2`yRuMZBVQme2X{{uMO4<79Iz*N9>V@I8i74%=E^h{fz3E;V<yQi%0r z=l%VX|NHO&&HGn{eUNiFWX~hN-kspXc$DM8$BjJ9C1C--phG2ypXR@v|Hhp+%!K2G z$-BpEJ|y#oE`LTvuAi0`F6lYckGpLV8Was5jY7Skv+iGqH*ppzt)H}1LW4i^<*}y% zOOW44>dQ!hEMh|DJm(X{hwkYC(}K(9MdY9A30%Ipg6Q~$Z-kx*Ch8dR-bmK56y6$@ zk4pWtH7XtN4SA4~6fUO*)}22nm8mw@wB?kuLH~ADxCGp4$(fc@MEkwl8x{g8Xk}<Y zx?@wV&GPgOEABdLfK&j=FRjcU<xdY<*0*<x?<x!?4+1+3GY$PlzMJ&Y`h0Asy}7kj z-itAj`-T#EbVT2iUI*B>f%PmqUy-duI1x*gu81`aert-ZV?F>4h1Rvq7He%<QRm^G zL!qK@zal4X`;`Xp+DFAT)?2D6?7RK_@4mmN<nL$^09u@TerQ&&L;p~f8LU6A2|3My zeFMYut=GrTk$^U!%E)E??Hx;n2V8$V5AhNo^-|tBC7IHY3wl=CA7Z(v11YsuBJvub z_c}ewYtY<a`<0)CY~?StsQ!7>jpg1h!CTtsATIbOFBtFF&6Pj#9>g2sZ%y#{q{d>R z+CsAqAAvF5P0@CiDda$VO!pA$DpYh3&<WK54%C;bAm}q~Gu<rco+Vfd$kr8x?(f!| z5Q8rtrp?c+m=JDcI!PwiXPg$_6SX>NiFh`vrsMN%m~zCcNuGK6Qg;{4dS2H8k3X^E z_)nOG>n}`V17H%tgUprrYDei?#=q095Vf__n#I5OF=*t0>-bl;`5$uhPdC|e|JxI~ zP52jpmV6-o;`c~+hkGH-ntHsWB*Fw#MDmkX&rXhkv&aaY7sTxn+4<_7oJd~XM3$>4 z-hm4+gUVJC*rtLzWyhcbq;u^|6E6wrjG8ii7^L*(8H-MQm*|n&60CtLqoH5x*|#&S z1lZULVi?#?81dHBuJm`|`ck=KS==)+evu7KEg!OYbvqdD30tRTp+=*8E+l#veE$z` zZygr(y0wpQML;AKkS+y5lo%8Qgc(vmkP<9PN<bQ<gaHxh?hqJKLb@AiP^3GB!J%`= z8RGYhd++n^bKZUS``7n(UE_6uV9bYSJ!`G|zSq5!^yKe`EF+QfWS@Gl%{~x%_IA_Y zW?XUoK1+jfDfF-JNg@gCI4${AT2Ch`QEiOWf8N_TLCE*Lc+)RyIVXFyCx>e)RoeCb z_JZO1X5(oEuC4?*xMabrAD2#dONb4o6gU%KHJ)O$W*C8!vj?lL&XqN^w?mzQd49dm z$w67^JgtbX>pJPAGm`Xt_?q>7$O3>sy3bllUqi0wxi1e3={L)~Da{A2v*D&BvJC-E z<&snnPI-Z?;Pp^Z5}j4o!F-`t-PmHpF;c<0NPNe`Ydt;-p;BWe=F6t~IL+qfsMqYC zIudNsJ(xaNM=@CM<y<2Iw-8^EkLQx}B#+bB{mr1RVnfv=wEg$;ks>_uiF;Ej4aH|k zu98*Iz}mtm_j>qhp1oh8Gf8^&ji)lNejD@AaWv@!erXb5+7^@R6%{uT9{Myo&d)=F zy}Zus-{m*7=Q2KVnFe>Pv1i=$&3$2hD^L8ZMZ|of_Zqa>^vazuQX^EoD~Y4-?z4Kv z(b4NgE#&^W=rbn;)+7})YK+g}EH0%1DO~t>mtYj(uTyG|tDKolYWGVLDZVuFF}>-N ztU&hM*XjsiB0WQSdnh(HUI*(%dfFS#8m8T`>q2jbvhCi>V!8k3;DhU_d+rw%OO$4_ zX;XE2k%5_{y~UTE(AO#kY<6Z}GhMq*@bO@dR@B1O4*;<Pp~OcJ8f0AWsy_PdSW&8E zsPDX)FIg}$Be=Nl4k5>UpD!s-yw}??T4@h(+B(*-!Z6rwG(DxJzy;YC{0_R;u0}?7 z2S6Bh6TKotLzan`(Qof#bunUzvy<^OqK&r9g@%j==L~o2XRw3h5%36jWbx2otjoae zmVVuV$?PP<h1p+hjBVIHu&|cu)+eo1XCd{~d-PXOA!Xxo9JX=xdzZ}I(fK-)M3;o} zi>)FRv3m6S2V`{!>HAARPAr23pO&h0c)W6&a<7CR=vWPFY4q!OcsZ;gRUHmXRXB~1 zZoUg&B}2tt0Tw6kp5_XR>st7TStj*br34qVI7X+ocJ|#;>Df8#829Hl<+wBp#cUa_ z+OG$T6tgbA&j`HKcyFd}6#NJdOy%$u#zb$=HqCf!dYOJBN)*rLN#h?_ubAu^NndOi zLN3yU+kiQKm_|a05RrLwgrb_s#VzfI+Y|$wH!dy*^49q2IJU{!Zah{I8FW8gUL11Z zmxGLYsi;0=^lxT80$Z^x=cWo-^EMkg3M#g5FkEHdeX@8gb`tbB&-nAtwNqD?5-{pC z&R74k5!}IM#TSN?KU%)7U90gr0gf|{KdDE3425rgG8@j#OnS3p8!mRz=M_4J?ydhZ zXoAhW;=Q<cRPv>JgUXeWwi2^4z5YX*EQl{%cr_1gpy@m@VDxDF_RqQ*yU*V(NAjKv z?UavNwg>6i#SEIYQJ=r*4%51=5sDCUsL^q5;>c+|R6huf9CBh@jQ%%<{g0w|M?wPZ zDz@c4Al&+jv>4Tmxpf}x?Q#4XSk4MsjPcj~=JfXPAnlm1i05fg+3de1*nfTUCD9Yd zF#?VuU5XqCa@O?mj-nYl*!S#6?qkD>(p_LHOC7W;BA=K9W*_KvOM2|nc|nf*>d26H z#ofkoS6uHK4759MF{8K6xg8$5)3(P1c}LXTJyX*7swbKiXQ#2Hs4PJ^cAPe7cf+AO z_LGUO{22O3m0TgE&f~>wN1yWYA|6|;VZ<8|9~e>XTFV0%3T=qVQYchh^-?7fr)RJ9 zNi7U$mf&!G-R^n%Kb1Ln14DG@4|BCxg3ngfu=d~t>#wZ?Cee(Lxk|;cBT{CLBj(wZ z#Ej0XapP-8`^Zoz8Tk`8>d)kSlWuh8vkmz?z%qWCvD0re#D(u;hf~GOE5%7GtYz8? zj*2(puWLK;WpOWa-C$nQF_cx&*q5nAR=DqvXl=Hh(wi4B%YVbRog$?XMXA!se(=+C z=hmu_p+Pe9)(uA^P+F}1U5Aa52tmsl4R&Td`#n-2mmMRYh0Y1~OZP51C%&EVuh9N> zbzgy1RnPT1>Gt<M_h$8r=1}DmkE`b*9L%MD6%MXixHB7hL%AYmPR#A>g!~$$>SSjf zDM)-C;&*1<m{i?xEVdN;*1aTRUj=q*WJ1`y$l}qh^ht^7={>8tt>)h%O2VC?$M-x? z==ag>sUAm}PuEYe%u@F%9;61?ZK~oswndAMBRnsN?t6uvSJ>lQopNcDxMF3*@?o3j z-fWE1$?pd`*Ok#(EJU=Xa*mmFs&Lbua@fWA_j7DAD{fi8H|kF<w-vv$_f$_#U<>qn z<;Kk>EEC-}$$E~<nm7*h@u>F7DMSI@VXLd~*N*y+ikOT17pA$0!!*Tu9M?1dnqvQ2 z*aGM~uJli&-g%3H{7vK%@dlUB5@@z~a~8)GQ9CtKCmE!Mg~Tmu34K|?aKM8vVCs37 zBdymAclNe_u%kLh<32hD9oe`K#O!vNWa&jI#iYN%8xy(7@!fq54QQ=+Jb0M4zR9gu zB=3Fz_pWWjiJWv6c5G2oZ>VJR&$p>rNzm@qy*0vvJeY%mzgQezFkIeZE0Yu+QqLrM zSA+Z&NhbFtIn%8Ug!=Q$f2a1!Lw;)r7?Jyo)5VAatX`tv{^Hb~{O7E&R1VOs&*iVy zzqK@Hu&i@uAC&AMDA`<6+nji;0)3n_!4K!}0BN6ro4n9Ok*7REkVuoZzX8D665L`4 zD>cWBx(Fr*rOjvhJ5iCnMSAXC8g|-7;i~z2JH*%NwrV7}u>2I?A}p6PKjIId8%Bh} zV&NaR#${^JJ+;@>23FyXLO>@unbua~IN_mE0<1vC!aA5M^+RDlvu?%v#Z%@r!F(hv zDZCY{nU6zauE?crwbAHWvC=wiHav`x4}3U!vO!PL*<uLCB)Z@H@bCh&M|1y(t@qFM zemUQX$d=@uE=^O_X<-VD!m5=BshsrnKPjya@`F<N{^Z~j(zqWOnU8|@F~M(5%BJmm z>x%;{l;1H#J*0ZDR41nQC<G5m+;jhI%~^NGrDJ*@)G7Bf&`##>O>Qpk(VOSJ5*M28 zoTwn?YkBq#mib+Gbk<|?;~dA;P;WGFI%-hRu>hv34M=qwzP~$O-GjequsT44&4|Gx z%oqQSW%>6{zG%Pyb!Yl=DP7|axhCJB8NB_Qup8HMF9aNu)NrxHwL4d@kQceafLQ7- zD*e0S*mA5&FJlqf(*<MDeY|C;h}${+R$tl>%6BKG8*Dfr+bw1z$EGrjN;j54-W1!; zF}ijUrJ&&<HwSMR=#KT7i0wsnHa+R&{7#V6i^Q^zT?4!$?B-kt?Zj~$Tz)K4fX*xH zYJJba<!?MZG?s2V;f5GHF_kA&C_IFRFQGX6XX?A>o+y>3^HzJN^X|t-oEt#zo#IaM z#pUTl`D57X{B3lzLlZnM()Pwoggx}UC<1kCsPXaEZIm-kAs0rcH3qIjQ$4V@+EQ6B zuzD-H>=(O>&GK(9_n&c_v$<<IF_du6+UkzUss5}xHVF<?_H$SX%N}*KHY;^{0QW@H z&Bvui$OMxo1Z@0HtP*KkM`yLI0H}OL%vWc_Dpo;cbh^3zZF$gqFTrv)H3^qqi{}qP zscH_YV{<iD&3gse3$nsIeJ{_M4}NkuHZxbxzI(cuS99XA>;iAN##*Qui)k)Z%f1^N zt9sXLK)8VmIjO31_!;~Pg`H*(pQs7^&Fw>Re$N|p;dB`|)e=T@_U^w``2TVJP@F&d zb^oBjB4Zf=ze0DfkPMxrdX)rH(M_ab9kj~$gjTvMt_(77YQhrH&;@nNNe4I(Hma`_ z5!FSzsi>unVRYt47-IAj-CiPUGWZNj1nA-f*+tFV6E7630qqLvnuLup3*^WxRi*T2 z;2dM;Cen?0R|K|acEz5be9hE-4QnQ3EjJq~zD-k&TVfmwje+xBhJl~<jA5ua=mYja zxo^rK`i6_YXY%R`Q#LKTE{=Rj=M>rxQ*?J;jgiBS!$un$NPqyO1b#5hr|i^1IywoS z&@;Wq=E<T`Fa0@UiogyDU&5nC(uJ6t4tEv54>&HDlz<|fY=1cm36jWW;qwwvKi;1; z*;N$`-D;ykFK_;2)+FTTHfCZ4y=W522QTm!a)qtE8fhXqdffA9ky5?@c&(|A#W!B} zFF%ZRS(rVuE7fqQi+%oz?*8GAGnr>#@3%>dlb;BsiMwpU>h-0w%2db2gjm1k^1z@H zAR<zIdXe3~*+Gzehj|41QY+K-p6h=6+`b1nIrrP#m3C@zPe$+m_2c@p(&1)fO|v10 zz@?Z0e>U%b$S~kMg!~!b=K(A&wgA*8m?76$x3`!+Wq;&%v9&>h_^BU(58!qr9}(ZM zX`v{?t#@J_Gd@syl%(R<pbDv82*;@Jal_{N(qQu1bswRJhYOZAxw#Ovgx%tqjlH$S zQt8kK@pPI&#LIAHj3fqX@0xVLCK)S=$z0a=Vh(Pdc7vk~nfZwKB86ZNl&^#^c)QQ) z)>l{u;ny9^)Kb_#yB^iXL!2=?Q%@e+<3&hb0sH_|NG-quKg-hZ6%|A3ir*_t3QGMc zIVXStzq;Yd<LZ<B`aB>^O--Au9I4#=z9-^P-y^8Ur9YY?=_PNFFnWu#uy*5Z#qy_* z6F`NtHseY-a;v9Jc?1ZMoppe<Z5IK_lAgu0`Xg$49gT*HJKsJ&E?76%RNEtX&Gbk^ zc~pp1>}S+tQueXalg;9;)VDhD^6GWB7jKs{*I{QO?9GE&z2)0K8QTo--EfO6-*Otz z)HYzYZlRokzuyS1NvUFVD*(em)Z4~Hd&La{D6Vy^j#+iR6AGI&I`l+OW^O`C-38pm zTvt6Y?3aLTH}B~+0n3##)klYw2C=ldW196<X`EsI6?OO^!GS9@B-8=irYQ=^_#Z;= z-!J%IhbU#{SD;hM%t^PLi=!3_GpU}Nv)aA+IbH6y5Jhmm8yU)bX0kqcJIYTE8F%Ha z*lzNxEEtEu7-IT+yBaymLVDo=ntXIn*`vVAg|(Wu9pWRh{ING#g#~H0+vUcxUq(dS z1|hgGYIGa9<W-%GhEEJyY)M-QVc3lm$Q{6S51p@81C$?TCVAultVk6g8#q{2WNPo? zZs~&9O9+unipf%KjF)ERm-f^EMa`WxP#^RvhKL+*wOE1>CaJXsQl-WTu$+ckK^Fnv zkFN*IHPy~kPM$l@d9N>}hx)I&pyIP|>eR!m81+RoF!Rl=0L%EsKnJ9Mf|=G_M4v=b z`f+LB*$u4cC4(LN*;w*j=EQ<+f2eG8hQQn^xsxj!YNJ2v<%UV}J)kv-1(qo%Dwn+% zE6_PNWc1y5!GfAGX6GO73^4a&m`B7J-YqVavzJmm@Q-)~hWO{dsRN*Nk36p|?&fwh z&<pK&Tz_q?3|tY(6^*Z)mr4=7uoB6oJr%IP@%KGBXbAW@SwUo@xT3Il&i2jK*@FMp zB>ej)o_2C6Qyy7L6yD^-i!I$nbDmaVjtW)AEN_=g7vn_b+lvspbHb0LI)b+)qmv?q zR=Db!;dfUe3@5mjeIW@4y{6oDbDnRl!S`Yw_u3AG*bewML<Qx1<-@e(s2WDNT`BHj zoVoXXW6{t;zz53OYL^A)#Yhvf+(mo~jdX-PAi3B2CB~XW+;G{KHo}EYP7AtB)EZ>0 z8${>pHbW+E8AjUd_^nP|jdqwIR0Kt<Wt!@3+3NSy@^EWT|A4y^(DY+!a!gF5toV&P zUvH)M+BcMVz|AGz;En+hseUV{El^<<pwVl}X&8Mmcr>DI|7a4(X0OMi0YRT{RwE(` zMrRY4k_`$1cg<^Gp+{c5K`}d6RLSvBZKz#u7GF7<P=d+*<jyi@_;Lo0e)YCnE|J>d zAyUO}w5Np}W&~zmw;3H8Mmr2p?MNM38aG)WK5?4el%XmJMP`YBING|X?a?x9>)dn{ z3$`B))+xaMHs|8*Wlw<zxDK|757)sSUg<0N8;JbR3*A$M;19@9`3Y6K*EH*z)cf1r z#hlx3#ZTUwll8})hMD?F8d{;emG<k&AV=+e>9%C39@AU%b>s$HVPf_-I?5nE<U@nA zlXG4K4D^`?+ebNB-7?0fHw>4hm*IviK5pL$i#IutRaJKx+#=p?lHYG<ZNRiiZzB8T z6bIE*SWr92404O9m(nEkZ`K~G%bmFy9uE3wyOW43G#355e&G&t@s_0Yto3eu7WbvX zI=iP}M^fy`$-%56D22v>jFiPG*+W&bO41A8BHlQrn8|Srl1oU&`0~!H?u#egIcU&% zet6y5D5I7BAlL#3no7XdnPK<CIl@m}=IOAVlifj;ilwx`7hqF^MZ*!Q5)34NZ2+s( z5*f|Bj!++a$?oS>@_?l*ApO&V^e>;FHKgw$QG>%G*T5pBAo4)_b&~V8S5^<fO_2|# zoh!x+0w+xnaQcJG*pXb#TOaxLrGiXIcE@Nmo}Z#sX87)m+-2YvGr$7L4fpzWR6D)I z+jjcCqEN8zE*P%Cq+_06jywkMOmAq8+zt*dhVkOf-#-3~F*j>GJN@`5SxlsJwq9gk zveiiQIad+O7)u%Idu+Mm`b4`((PrOM!mPNw4={zat!sg|1+d3)d<HFhnVGGpw`<o* zwyRPwJH4<o#@=vz8g2eP;mn_04@T=<ohDy>w6q+^P!M`4ab_U3(w3FGdhKL_nYLgZ zQM&rMt2~%p_<%vE)nVIM%-2>-wU}~r28h4{ukAjaO20joZk6{YblzZfWdbFhJLXD1 z;<d`5U1AH1JctD(i`;FS!Zu>k*KaNFS&a1ozgfD1j<)6#i`R9$HZT>TDcFy1KG-|^ zM5Dk3pJ^UWb}$FtJm1XO!+Jsi>zf0V-e5D{mBLX_)Oz>6?>-85L`b>6^yy`vD%`4u zz<~hu5%Z$fgzb*`S0|{aYCtc6hf4bi!9g`}>1}DiZq&y49Ef*+JYvl2B)h$R)R*1= ze(w168pGqc@a1T`+eOJzGWughj)^8!1${Pas*f1ge|Vi4X2)QGIAF5M79qoQ`on!m zFI#OTp~PP*E3TJjQ*TY=8|@k~G|*GLN6XEJ17@=PG3qGf-toI{1B!f<g_<mcjFF@H zmFap(f^!puJ;b;BSlx7$@^+d0?K9ve*+qiiu{vJR^6R%|rC)Ov#)E3iJ7eeHuhl== z_`jr6iANM*5Wq_phrmYK%NPGyh5b#Q1wanjFP8N^S5QE+#|Kh!Ae<kMVHcE-u)dj! zZdl?3``{Yf1U|GM?;aTLU;YN=a0u&WO4<q1Pv<+~=XCz4Al_jn)Y_bEp}^G9J$Is? zo*W^1NFA`}Vi3V7Yw%@3_Yo62HjcvRN#n(dh+<k-ErF1IAfBv)?W7zX>C2_FbPTyH zW4ELma)nS{MkHv~7*Um7W910%WxV>)qr@Z3E+WgX860js*7)+0ZDhwd9=X_WVx^?O zE~R>>vis<C+ypTWDrtu45un^w9d{~~|56WjC)r7jzA)#R1bbqxLH0o|{<clnbtMD% zhl~Dfb=zus=DOQ2cirVy#}9(_$;wLc{joc*H)>XU<R#vq#_)4YKId1I^d!|T#J%cC zG~=t|pPF$-2IsklitiWguiuvu;E~TX-Ev*cue1Pr(1Hyqwv#<hMHocvj2IDb2D-vO z9P~+(k8>gxo>+>_eV`<Dag*)HufW9S1M4ivRijy)AadXH2$&U6`RlWCr-};r834Aa z7`{KwiJ`*SgGm(Gc}94QmX*k)%c9P;rT|f!i!jVm%e&Pdj3vYE4AvG57Da5+X^i|Y zCD<dpQrd*<7R>jj?0fOM6+8Sz0-}Ms{rI<YHf_{TyNQ_YJLZY+KifDuw?ospc`JX2 z!}quSjoQt2G;znZb>W}vy!!lr=p)vl(bSuy`|Y)z<@FYS&SWYD%WSC-L!tp5hMrA8 zv5vR;Q)WMmras8to?~|K;6T(gR4CSG&Efx+-9RR=8g&z)1^g6B4+;UrZ=_eXHS}1; z+x6?m;f4y^Wb699k&*mKZd=~-UaLlZDRLIgABZ$$r519sl4F?Cy;eb4L_@SaZ8u+7 zHE%Zw7Rf$rAVjhA*@0G-nD58&vwJg~bOC5&xE!<phleYywtTG^o2hXLt_S7XYsB&` zPE)q`A4MBApmTHpWxbf}+GdDPA|W&VW-!@Shjn;fH>l!|8r%ol6~-1S%XG21s<*;y zP-rn3@7nf{CNKLQTgFQD5PYcX&Sh^GD}&2mkV3bPCarN)*HsI+<Me-@1UAJ?y19_M z6Q4_OT!`5@I)A3#^ZYQ~VSR$f-4W|b$lv62HIIdTLyBj1`+*YJU)Zv^(h%J&7yPyZ z*uy_jP?60sZ=N_i*_=kYb)WO6@vJ-EQQU7LWN|L1K84z<XKqr8G?fc=x;1_-f5QuA zG|5OD{(D#Tdp!SOkp_93WETgXz#PxNHu$d@A9quf{Gw5A%FM-|V-)KnZRWdJX3BnM zK*EqQTNeVC-;dm$dBD>1)3VRg%isC#1a0JyWN1t`m|Lmi#_IE8qzura?fryEqsA~8 z`sX*VXF{k)-{cT^yPnUD(~y+?uxi$o%PW>aJVtU#Y_+{}ClT<V!8hIH^E?djWtDl} zHPEK{RgZCE_{lrA^brxFm}_za;2)gp*!7mV{X&2+&I;~|n_>z2HN^rOk@#^z#LN>P z6?)-jScV<B+-YX&wd=X0Y2t@JyhMfxQt@&YQ@qG7QF}AA=0>tcr=~{C=RL35G@|eP zpaMOTVax;NxhL1u9bXb9SVV#<{yr$hzHeudUzA`q^>l6%vKT`O0l#6gTM86q60Au= zmI)kPU2kU0vXai*mf17DmnXFApAY0ywkPwa$w2O}PnuXBiDo-0HQTcpkatC#9e9uv zzTc38FmY=#+jXWA_^)__>1ajm!3PYMMhsR}YP&8A;b*0w>*wE>q{1C*LzWK4jtjw> zy#0h$C)im^qH<c~;rk2t2Ddxg^Mtx`o069Z&Z3{Z=z5}MxmR_gHEr&hzSS(?Aj{<= z3doe9DiHV;@8v-5Z(}M~s!~1X{q^^I?r-+Bo$eLpx47qB?HIETyEqq$j<>X8y_BUl zIpvjWoVt3=-jZdlV4Y-Hz}~X=>y1KOrmo|Sqd1bx!1upOIxLCZuNPr{jB$QGEPkoM z0d5)lR;49DXv#)<(lkA|za049i8lECHi`igcUOrDs#FeEot{o@u4qqo)&hQL0&q)m z_vZcV;l*uN1BZ=mJzDBn(JmCw%jajRJc=T28BLT2Ysc!j$FJ9{T5-(cUDkSiT`kU* zb%D2rt0y#w;NZ4KO^0Bp&%@7zj5aU#F&&HeLNC9eHopz2T@^*x)O-F2_Q68r6O(O- z)A&c6`XmW`1Ny(?N^>ED*3Xw8A9~&m^s#4@adXo(fE7XO<dJ~R4c%7{#our-lbI77 zc{W%vW%n)4e!kT|T!vilE=4B@X&P+yKKNtJPbHY|yb7uZu7>?jk_4kMNALX~ikN_h zNQa1Ioj5P&){Ye3zC&^VpE^UAOLZ_nzI=LG$W$^XTp;Y|?bkf~d=QL9S%G@YF%fu! zH<BXy8$Ya!^UP~IFL#0lFYLt4hjR0y8R9W#va?-liwB}}Ln7bt@a%4R!rdE`KpzCr zeDIH93qqZX38%7(iw2!mCPF0OFZuq@D*b;dfs~3rar!(ik`f-~wf!q6cL(?!c2z=B zv%W79uP|QWw<x>Q{_QS<okS=K-Y=*4aC3DX0ALV;Zx<qjFjCDviKX#esy~C^V(|3G zhb?uqr3g>~v};DV?>ua$!skTWCi-p65a_%JI*=8Mvkx<+zFpHj)=`Q;wYWq^RI}-$ z9rxqO0n+9;>l+MEx<LasF~j;@+od}!91hU-#Sbi_=X_9%l2imProgJ@Tg0d48iVN0 zxfVUY)*@smj4dJ#Oo4bxoM$GqSC;mk27>nM6dLYDAFXO`YV8ShnC*X|v?{3Ir<X48 z2zZ=zEloq6=_LGIMk_F>ZTs5H3QITOxfskk`kpFsM1o#)r!#&26nc87${_ys4adDk z#~;6)=e?-ew^=!RdO2MM#$*j@Nsl0ob61BYKvzJ^EpLV3p!51MmG}J4q-{r%9k<HW z8~aANxi|d9neG?71czQLk@7<pkaymCLfH=GRH$>$`d7ynPWqw3%@VNjCE(y)FQAN$ zk))T|@Hko38>z?ULh@7)=JuV2s&Ccl+p|%`CD;AzSzYGGyvj7062l6kQ2x!Q#}eh; z(@wpKEC{z9g=~uBmrBGDG$Hu==#SP7L>;>g@@W@}Nlsbm(=sm?rKQq)tfZycoSM5j ztBpEBM)947^;oD!h4QH*MqkrkzO&Bpo8N-NIRVBV4-Ghe4&@?W?rNH+MQEZ~aCD_4 zZT<2mhFjC=#}l9~FX(Yc9=FufEvRYVs+@NGxVKcSkY`FZunLytF&AbnKxtep@mc`V z$?KCIvDTL=eN710jvP=>c%s9(oF>c`57mFWfP@~dmG=73Tydiy+Iy66`_-(+nNGd- zWE?_9Kar)152@P-TB-K0XffD3YNFoccfq-+?0_KDCZ*Y;$(u_axuOUOs`hfPfbQ&_ zudlcKI=<cA67jUBKcI6HQX&~HI)O8;0$;gBQtV)f@i+Oq?TSqA_;RmvYC$^ALr#-} zT=y^C%A@G~GTHhjl2aw*KqS$`jC2-nYo2uDaYE=Qb?qm0m|m`Z&%8Ie^EMv+MWh>q zKz=hx)FHsgso_oQCLUIk$r__p^5P9!nvKKAn{G%)JDQ&F^ovW#NSZA1q{kWF{K+wx z#0WTeP~dg&y{z{p*hv-fcXEh-FV;O1ej%ZaI3)CyNqE{nCiiU8Ka^zro#$8^4Dc53 zJa)-{&q~6yK129+69<-586)ZN80gVJj(AibV*V}(E`OKL439I?zR%a4*7alMoscU+ zyZyAA92T^X2SN=evVA|0qNPh9oJcOSLUy<fNBU!D7_U!6r1P?ry<-5BwON39Ae3%( zQD!!@o_sH?`=<j?R-jYV2HGJRqa0WT*chEOLsuP0<3bZ|O6rI*{k3~2e6_<Ek<_%U zPapS5F6210*x4~$jE0?wwbVGQUL{h@{;+h5sF{Hp69UD=ap^hhJ7?cMd~Frc+DW;? z-T6UytvVkUym*CQ3u<{|%f7x2@#e-aJ<pfhZU7tXRM)A=v$($&mP7BnS&wH4s>X5I zLV%Td+LWa|O2T;8?+z%cshq!kQLnIGsQCw;`c=QI%Bg{S5d{(rQrG({_=`D{xPlHX zE5>gqPRO>&G17!xlXP!}W|kXteaLeYaX&tMW*Jd^TG+*O@EH{^Y`@9WI2C)~=w ze>NccNu<j_yRa`f!1cG!QMA@BxYU8-@;R_Rwab0#<>nobZVHSSqCj=~aeTLxG~n*} zCnLqJ$~qL@XuU~9jd|^kU`r;Ay-wdKg8Y9%vXnb*OUt^RI;10V+z8bDA;Sf!@}FOk z!8gQLye;+~kBzM$aj|F!XU$AExbK%%SCMMst-l)?yvQYg<gI%i2lGn}&nkJ_)?IiB zr03%rdF-S(v7moS!|UpU&!OfFARZINV8Gay+J9tgdvvAotiBd_rtWMT<5#h4HC!+d zg7!*0cyu2Yo)w4oAFJQ_`fb~owBD5^q;IT_4Ds}-j)SaNf%sdC*PzSM)g~@L0A?we zt=%nKzzwt~#(Qg2_P2kmZg#QCAFPev`Sj)6ZO~FQRFR>Sz9xXTpTrWEKGYk#l2{5V z@<6_oFK*74FUoJTPIzSpb8oZOASWK0w=r%SX+vb@R`Q6VTP5ca0>%NL6H9;IeCOhn zu#;`imUer>B@cwE?A(Iw;IqGqXa2*g;rB3;aQM~vzQA?9N%nG(f9`yF|Iio5k$07H z^ZVB@dj0Sw&4A7>j$tL`#M$kSoUKh@Rj6)Hh{Y5|XuH_bAc|wxbcW?v3G)SoW#r^A zOpya{lrd1jDKc>wvK5ob-yJhk45??XSfH&*Y|jvRcrQiVQmuz)608;T!|RF;{4|5@ zCt$)!LHGJN?3++0W4?S?KS?C5Ku$}X<3x6PvaN2~W(U*<9_H0A>|-=LSr;Nw&-W(T zbc#P{(J!Ex6@tT<itQG_cs#A2VQt%`80xSDfc11?4uBzO;v}wWeD-`Fpi?9lKCRxm z>~CMs^JEr(nKb{slHcHs%IJr==`e2mG=miDJZ7Sj*Dr=8C@eyR=R2RB+X2p8Wnkgh zS6>qx=HzKv(sd(T#tn$zWz*C~;s)3htUANkJZ}r#cmkc)_hm9Po<4_%>A3VRD`|h0 z_W9#9{!XQ{qh7X(!}-7tH`WwVMq$=&L5Q(2oo2C-RKym=&#r!2ua|)j1l}-qpCT2^ z{-90{P!^3Ei7{aH7G8g0oRH(%*fX7kXsO1NeXZ5W15~0a^HUFZVDcsM#FZdqRBx6u z?6pTvdx|<2w@;eOj{Zn$LQ)OurNzdITUY%brh%IJacbQ3t^JypFX6xd5QvoJfpIA- zCdqkTA$%(~?~?)|z;#G3+$i2{{M@lK*$@144i1)R=I93!-{rzk&=iCF+?Az|5{3J> zO3qUNVSMqZP$BU`r<0|Zs>`@>?2`nag`qO@fSx^DOGDn7bX5iBQ89)dkl0wCyOyl5 z`7+Yqs>#w+oO!#N-=fI$<eMTDFUsv&LAFH@_m`?okNxqikp?(n3o(tV+0|i-6LFKu zX<)~2$tlR4bsbZ&^HnDw*gmRxqX#4XQg5T4ed(QzguFrz$K)t}T>(uxh%2uSvJ<z( zlruNB3h(2{#oJIC&|vr-#s>=j@HM|U83##!tVePlR%Q_5)LuGo{VTxy`K*2@v2KH* z=LJ>S!^lG>9v2veTAaMXf05t+C3dp!<CvS5IHC0LG~K7}zkKO`m!VXFzxX>Tst2<A zVaoD{nHgk#>T+qk9lM?xJU7kKXBNGJ8P>y0gQO8cg}zCKs4b)$d`n1#5Y9CS_H*$b zrb3|KV|Kk8M>E^L_<qN#KUKJ<a5FekswC7u!sR&bM9SR^+Q&v<G;XB0^5Yw0L#Xf- zoA^K%HZwG2%|0Z99BH~Z)^S9;i(Aiy9eR8Nnd;jU>6PPUK~?c_F$#o`dN8v%cSO2G z!{nR6M|j2M=Gl2wMWBkA_91nh`lNzj24O@7J^UeYYH7vd#y>(pN*`seM3)&!WNT`# zm6K7UesW@gD;6?%mQ<H%s67Vhi8{<=8t<N|E7-B}gF11ckSpj2zBi`le#G&lXKxrk z()@OelJiPVR@-auE@zngocGu07veWbFIa}n54^|`_B^g^r#JtUnVW&<{~9c77!PPR z)6Deu;#|j#W_5$B*f_I}mF0b+cowC%t#XFm<gJd}oG*rBMf!6S$xqB!07XO_=WaRp zg6*??{#AROh3l7)Z5N(trMhaswI_$it<!uAop-vjY)n<eAh#RF*gng@aaMk+spbqa zS0%IfTlO@2-zr~iu$Qs=EB`eSYNN3;Y@_e3@ziWwDhablc%q5<K&c$0X$U6Ad!g8% z`curRe7GgM<zj6wjXe}N``~CqYdnShNEN6Mqia~4ni{jwo4T;`d`Z74I4t$0+HOoc z%}$HHc?Qih$q>h`m5%SF41x{O&s=CufNSFfuwQu!q_lB{=S)0QdI)^Ubg#anQKZ7u zWdpnGz9Ub;D9n-iwEflLOvxWQ2L2q!1s%BqU^}Tlf>Ok19882c2^7$#@f$qUp@iCx zfR4E+pR(5s#wXu<FzsaB1G()st0Ai&iopEi`Tdnia&e;pbPHdBC}AZT7Vuvt5q}3@ zQuZlu<I6ylAif=&p)J1xhLA}O8#x?Ue-rQ-SnV?@$Y3_Kg2vcO4D>wP63CGbVgdZK z>#L~eEXREmkzfRIEdCo-eR0uf7JKA8R^5}44C(%68?w-BALW0JX3n^ogP01fuO9ZC zEe8!5>R0wS?DK){=?-jUZeAw~MoXtPbzu9I#ZOox-Dx@3p}hIz@A>G_lAreI6t5H? zczvhzhJ1pD<Zv;LL}lq$A8CC9Hb3BU4JFGCyKgp-aokhNvuq@l$Xp$qQ3EKZe&F?h zVMN~exO<UWVzf7>UH<H@9gV+U^2HU(h;E-fL)ebs69JiFsD{G@|1wp>nH3ExFngHl zStTy|k$GVq{P+bmWXj~f;vIdhY`dy;`w5k<O%s0UYdvqs=Ql~9>SAwe0Ay%tg1KzD zaxAyT)JfN??+HIOMKa0)R{BMFZB>~PxlL~7%@yAQ&Q=2tZ^>R`FG-UU<kl?ZDIZb? z0|@m<8)eQ*_TPuY#dtM!Xu6YroqU)4tFD&UOZew_q$iZGUs{|=-+4NQI#P=rb#&PO zm<=kxSK*AE5N>TRHw1gofbJUD`E`9~%3)N8q&FO(x8K|`%UO&}1ngP!_>@3E;mmQL zO3e3RHQ}clxl+%$0WUZznPA*zi*WB?aw-GhaK;lV-hH?8sb~-wm(0#8fES1XunY_s z&XZ&X%VRCsQ59f$aKk&pp=>o<jE<DIei#~X6b2v)dilECWS7C@aq}s#5M^`)jmx=Y zuAoaDfOQJa2YP<UC@^g@xh~fb6FEwr3sT4%cUF%a1fQUY2}BQ#`UZHYe9O#eQE;=q zF+&jd(YV<!fp^=(k6e+-Ut_&%CGxYSet7Ie0!`6T#JseRaA?iOzIK{HS>?_vF<5 z>3x^)^g{EayAxlt#s2SrcqoSh8DHUy3YJYmuKg{Q@Mo)&ZTYKj5tGpe2;)4re-rz* zlpMplFnie`Y`KG0el|-_-8a!p^f29pp}o(myVI?&$(NxcYKFzu%zZbL)V;w)9FsVU zJ%qZAEo~YP_!Nhxifi7WiG4G#tiE|teQ|=detLEMVBZK9Pwoi(V<BkIyQ?2r21ge? znG6>UXD7$A*aP1gvUs^D%s(mxQ^0efP<lhir=%-KOMy_hsjme^g%;{VK(juR3w=y- zV>roU&Eba#wj?FLmiS3kh$HCSgC6SrbZYn#CH~_bo+Zfo`P6A!5sJKKpgv|^q`SKm zuIjMsHRW9u&KZhXiLzN9FEz>jQfJ4`D8Ae01<4g<7l|m27*=`uEHx59UIh@oT&K5b z{QOPYU{<9R6w*9TinW0OhJkU@{f#PdYYx2#B1z|s!NrM(GPA<Z4_g8PfUgPBFdxnr zYO-S8VAxFKjtsTotk_M`*4KGF`I>}TWn$iM*x!G;-0bJY8F9~iq?=4+p)XG0IgiW9 z-aWrz3H`*U{>_=%G_B$%6Q9bZV%}O_kN8k|w@%@%()CL;uA#Z1=Cz{OV7T>k&7*AP zS`{~iFMy7`T7cd!Mm(_dhSB#f=N4GbJZ-Kezs3esN4G9+1I2!b%vX@s1nVvs7~Ckv zD%x@9BB3X{k9*Yn^FgL4jebalLr<@%QGL+TSOU8|x}BbDSV8y4kOt*jWwFXsu2B6) z?AO!D)Asg8^=NYMS>xIZW{qMn1Yj8+7Su$*VDXZ{x=vxJWi+z%V8VP;o<!Drz5#9> z0zFj$VRCw!>^AKHzt(^J1&=)7tp+9Uu1izzC$Ow!((iI1X8AF;tsv+3zJqmM$g(Et z1nfEs_xp~IMcPU`vk~d){?NMFai7O(DBH=P&C%MhaY%5^m<`CI3`kh+S!u`ICQ}y; z`3^`u#N$-@5V2Rwvz(5B)rau&vn)chZp0r&9bO+NZjRY{AJ)GD-RM4GIS6*#7M<PG zq=e*uwpD(e-3$ojS-Y8Lqwi)!eg2<g%M&As3#=YoV4WmdCdmF%kK-xzrym{rlvK&4 z!k3}BChJ`@<XDFb6E<uOtF6nTU1IMF=G0BYIz3UAGs@x@LlyMeB}<wJ8@kVlW1+F5 z>7l5TFudTJZmv7Z-!@Oi4<Kt#BNP@NlHCj_qg|>RlX9F`+T{4O;}{f9nel8k0$L;) zJLJk_cc@(kYAO*L;6qE!`}{qhg91zITc&n1U_rGRyT;jJ?;r~Z9NjU{<C|)|^dtyp zCn$La;Ym{Jd|Y@<8ccmy;;LL~kY9>%IBR(8V7eT+mT~lk+NOU}-bnm|4Fi0s&E9y4 zE!njox;q9x4X(7C9@uTS(NqHI!?mzoRN#VEn77(E<w6p;$$29VpvPNyt_$IE2G1Pi z?N}u%P5ZAsx#hl5Z9)pRk?uN9T3UmF1k-Ls1M*Q6kzXkIf3fd*E(GLy0l&aX_mhpU zSLSH(##5yUC*cR;X)F1aGhhhV<$gp^>Xz{Fs-D*5>(BYGSSjCATx<m7jnAblb1>y- zMTH!^n3x<T1V$hwYtDCFV!xfpfa_y=VF*UQ$b3s*CdW?Zz_OE&cN$0)uo%3>rOYy~ zTPM53K~O!GQT?k!)50<inJXDGX9yo=yJWJV*73o0=)C4k`tL12@)&Q9YPE%!PGX@| z+y=NM`M<lN_e>%xu)adgpYh;s;wI}wGWxq*VK*B?Th*pK^gF~apl@hFWcpU7@FLMv zcX*?@x_gNi2;wP+NBf1Q-#pfG7#=o&9X(h7di3D}Kph-}Xmr=!VTBY5ih2`827&PC z>!B23(Ds0L{r&{;v@<y8Yukq+efe7VTEuA)_s#gs-+6$@a|g&;tn`l=pVg~I`iXdB zi(os=oyF5o;j)wcN!XLIHj^1j6|u{?*Hi-dV&$Ji^g7ct{sFXIVR0(}#UI>uT{yY^ z?Oq9>P+JXu6La(4P!GL#zz}f(DJ3(fKDrRf<ku)n0I-1<i%yxBuRj>unv1umTje^2 zr$Mw!sJ#`EeK)`kowEFj3GM}5X6f4f33H2B9Y=qJhsW7Ttd7gi=<Va+cJ4C`kl~Ew zQRl*%|MUU~C%bluhA3+4A5#}-XHt}LHhOs0I1C|+Gd|)UWHCS$N%aduU{2#_Ub=Ba zlkwcDFI|O*<?clN_k-n4;|Az_U&MAFq<u2yKxp@bfR__375XH%TSl|>h!N;WJB|}W z8#KoUkKq=|ER<A(Rbd&hz3!&s12h~=96ulucl<5mnf%I4FYainwY?x|l6%%b*t#&8 z!Ln<raR0cDcR9AqHZiIjuYR_QOoQ@);%CwBhb`G$Q%+X-TuM7UoyytnafL4|WSUMC zI4Pe%7uCiuN4o>tj`=kE+T=sU`KJ+6-WLmovC`z{=O7)7=EOW@s;t)<UjxFMapir! zNiRvU@OL6=y3OiED=gr_(yBpXdvg8}icsO+R;vLT%z?V&hf_EQv%qG6)a-PrbS3vQ zLE3~+@!8i~e3OBoA|i71kYtAf{QX+$SkCn$;^7-EN|LJ3wW68ljg2h^5-$w#JTFH> ziqA}OI9Mykf=LVJ>=1b%Eb|iuSn{Y(&q%9rs#>E?3fF^aNUDH+tVH`X1T6B_#^DZ2 zDt1~zRh`N?)ZXEapl}MHzDoQE!UxRx?R9=j2RbW(x0$+=ovKV}{DoK`m;}_;Q<Fvo zp|(9xU!52TYAiGfhMKdqwu8XnxB?X)Xw#ka+t$>Cv^$Uta7_YUm}EF`T;gG?;6|af z2JZvuwhgd3yRTfgz*6Z6x0-Xf>{b8Pr!V6QIbezp#S!wya_$;0nM8KV58t12L#2SB z)vjaWbMKA-?`Q&Wu;Bd#7L8i(Gr%?=1c9oAVxjBPsqR<ob+;Y(Rh-FMMgIea7LF{A zuAEF<8lzFtT@hI&nh*&@h|5nds)sn?s&^b=@@XFtdRQmZ;^4jc5TJUBj89D-vA#jJ zv6+#wF98pBe1o&Hyy~q3|85iEMinr5Z{@??Y>GohDZJ09KR+`Ja@Z{SR<O-+gO=v) zHsM+|Pw828%><o4m-c;O?!bT4=z^R!M1rHE4smpp;Qc@<o(umFR}z-2svC`uQNS91 z$(xki(bXT?)s!r+1jE>o#G?r74-`V+%o9@b+Qb&7z_o?QbwZd<u2JfWkPxcXYcG!F zN=?}V@r;9XDB8yTZQX&s7%HV<z)k5%7r#~$zB5szO3$;+$leY3xbFv8oGg^=$gPJz z$WUGg^D+oZpV=F`+fwzuE6RT^ZU8IM!5B5vj{s^xkyp$iY$pWw=@puycDJ{o9okxI zwCr&$WcP1V498reCX<^4^v0cwRNFMIw<+G8VOCXYQ3>V-ZLMyL2X^0hXl|i#-3a84 zA3r6hvfuDkHE)}*Q8yhArccr=!Ma&L>MiKmF<O3PPf=2EDg(B5t8hy23Dt$rMR0*# zjK1r!rJn;2tCnD$e(6PO?`Ox#219obf^pIh7E^%Gz4Do~bcIu1m=zfWrX+Dx*b?D+ zc0Z3%ZF>iH)cXwo+!)X^JI2tG7|?Qarw5n<MW>W(tLu7cFEnr)?6r^1FK(y5EJs1$ z0lJ#CW7m!9*mCnx-X}~l?muEJzFZyq&0K@%0Uk3PqaDd{SCX)i#5P;UQHS+qn);1g zl1L2_Jv}-~q><}Z6CoY}!f1H7=_Z4=k*{WK<bv3T$UegNPK~PY@p}|YHmA3XTd$}E zzfNF{wgmKV_-*k&!Y?tv99!rNjTBqiHfoGAXMl7tyC!;0xd0sBz5s$N6==-?*wNz< zUM;s5V$QwKtT{R=H1guByP*eAU{*QT1CT-9b${F>{91*O<-`P#DKlYPe90>>U)N2t z%%K3WI%Yj3t;)p6_vj^1aBVh=ug52vQ&#{P%{{=9FLL-bgPbn+M3ZGy=msdXk)+fw z2}x)vZsnTLP>9MgIlOV3yP%u)F7{>-PjPER@d^M7sy5$u`u9?4s1h^*P1$FAsEfK4 z@O=HiT@i^Kau&hMoo@hHCpBW*URyaz_$q6j(@L2^-nC%Y?e2Jw*4HQ;9WWPn_~dJ` z1miv(qVcf%rwQ3^oD&cM6H$9<wb96?4A}0V&(r2r&S19PyRd8qvu^0`hjj0tFLKPK zlx`yUw)plEWxF5V%BO;%K_AJ$-Nr{-cxw%Le={X**WR{q&iBd6wiR$QCsPxS<T&8F z*urWO$wgv*)BHV5et5N@)++CP5Sn;VPWZOZCJR7ol=fZEx%C4i{n@=mY%BNYJcEyx z70-{E-z+9MO#rV4tB)2X3f=Ht@q-U8qotrQ=hMA@FpF?uQ+O4Vd+H-Qq6S#%kawCd z{!f;g2zM>m;I0LZq`P)k|Ec^<QT`J+*_OEHS2QJm+be_gik3QP5iuBd)s8v^1~dl; z8WM8FeNFlX(ljd>s%xk7!{)8WVUZ*`45JEWa>KeKKY0ajM-91n%&L4_TrUnaY7@fP z&1Wc0z;$^Opk=m73gSk<(?h6-n1#Yb<P+@VrJNTzgXL~!@CEG^wjAj^mQwP1PJA%p z-dP4cUQ%4{Y6?mXz5-p7PD|V3u{V^}r}!*EAcc36WT7ZQF!B5mgZw+z&J;V#h`K0P z?(1&=XJWdAa+$XpR-<Otrr{P(D>1PYqHvQ)K0kitXtl<Z7Qb1bQ|U{bCPgILK!^21 zGvNi4n|oJPHJrqNh5uSSBXtNQna00au%7p!$Vi>fYwSe9vUtF1ZlF2CA-{*^rW5@> zE-AIaubQ`%>-a4t3H46pBI~cRPl3G|-mwzD_e*4IRi73gI}|n9emS8=@Z^o?CW$#* z#_N_CX{&jSzEdrV;LA)deRfa&r!$10VDqlUD%P2%^wWZEYv6@<pm3kl8w%fTiCc8u zI3RM<{BBwGG-ca9sUuFe3$o{JJh$oOZAh#oOT`-$n)lBw4XBD>xOuLoYG4TS8BzME z^iN>me}l!~E2<ZNNsGzVz)B6Vu}5H~MpRj5uo*f6jvyDc^4=Bxpa5H<1uQ4~8`B~E zAm14}74eQOSu|!LZd-Q~>-V!|9~v5phO+=SU3=&FVvRfm@|U5PFh0CWA|y$14dXrF z8xg1&=owPHn<c|2U)<32;QlU7L<|F#VWpgK`A%;>Y!FTx5fV}3X1Kyut<QVK=Vo{Z z<%bhmnYjl0>uObM=?_MV4Ljs>!QO+=;#olpF+uaVPpw-qJX-C!!C+-!zD7=QtA-ul zoeL=Aw5>WDouO0l+-~J9ftl&MX+=F*JECk~k<Q3fQ+Qbo)}1rW2F?ik{$Gs8|L1{e z{^E;MaeQ$uTE_7o!*7Kd_asX$q}jaq`EsdGqW!0jZ&PvRku-=E8xp33P&9PcOD6q$ zM?WEXed#8A5Yv|mA;-9r1&#k`nTpynW^rdM-Q>WSc83ZJt?<7h1JlP4Lp$~)yC{4D z?Xu8xGJV}p2#q(Cem!bNndvy&w`Ud3;!f*js_3y&m%$XVy;NGfxxQs+wJ-935uTH- zl8`Lg31(?hnG97ZUfo^~BW)3Sdd0h?#=LrN>obvOHKC_VJeSx3BYwWd#Ubc<Ak>*a z$kKU#fd&88@agwa&1;uNJGKWI|IZ^wjdLBK;09v$Tu~LHzp*Jg_pfIM=I;LhY;pHa zv6+$Himgpw79X}NE+ff3Y^*Qat8g|ui^aa5uy`#?VXWUx?6_~K*IlD$1le>X<v4a| zBaS|D-oF_M?Q;dj?r|BRqfb}tA<-l^FKr~oDpa~1Wp})nwEL;dzSk+oglT|;>;pFq z|FSM&%z&@sCIF)x{PY>w{c26k+=D!g5Zk~W-V3_;5+T4t)-V*v#rUQ3Zn83?;w4WJ z2G2)A%lg2zIt7Qf?*l#i@K*z{+|z2(q7-=Q{XQ3TOC(wb2>J&oOu-0}!^Tt_(5Ev1 zZR$Nm;+RT`ICF|0Pe*HXZGayvxWx-XlXm{Gr(wPDK>~scV96X1z_(D^;r~37=kPn> z1B`O%`;w`J{;<gIOI4GrjV*GGC_0cO3+Z1RTa6=j$u?mz1g<nHOu#4Gj_m(OhinC2 zpFa(<|6<ATf`v5eeF6oS^##C^8w0goDjbMP_IJMV#onWxaQ*$jWJ_N_oo+gTb2zu0 zI`n^@!@Ib1n1VZp0Z{z~u750xlh|-&@eRLbU;LD_iwqZC*?ZplH*n(l>i3Lw^oNSJ z3edb6a*bab>{UeIp$7@X>Dx^iOI5@<c7q<Rn0gtdlN%?@z-%^8#<IE>eG_-}-Q_V^ z<7q5RZmKU3?(!d?9B%!DE`sBA<j6TB7V7iQ_QIHzFA6YlI6H#2PZjQuOmkVlWvK|L zgf)l$t+ZcZKKH-pPX6|02M6i*VJ>bQeaNbT8~k!e?&ST)XEJ>q_e?%fc*6mGXjwhS zW*z3ypK|>&Eqts_uY}w+fqbv*sCbl(g+8-VvRByJmyA?Y?4k<duK02G0lZzp*QdCb zI(j3t^6?|4_N8<+fu|3&j`&WvwXP%>B=0U7>E0MH^6hd9@{}GxIh5IEiF_j8W8_@# zOPA~oHhkFLmwaPcaex<|lGUTQa<iVam=Ozg2y;hj_qmktV@!u2pY;3uxfoM#V%$P! zFxUV3R#bH^Y~jYJeh)Kf2m<wwPX#xEllx1qpo)VUhFz}J{$tPO5c&tNnoOrkSbdcN zi25QHUapv>CnGa5m~4ag;D_lP$R%lo+5_Mg@7|!o#LnPAOOu|(0^fcqZl4nBu&wWk zVfEp8^t3Z(chM~<hh4;lLz)@?1acYs=BJS^Vizs6Ur+7;H7QX+NJR*>zJC_@fQe&w zP1-<lki*i<upJ_2r&J%ydfH4*I$%8$TD_$5(XaWk=&?fb!E>+w7`6}i*RcKnyBnMs z%mJ(3yI912losj(A*v0VT0%tadM8&e;V~o}Y{M~4gm5bbmZg4Em5{*Ve%}c4Ui;v_ z(xc-(eI<{HIzEd&nw@l*5fp~n2Ig8_x9DEoGBq)f7qZ5SkA@aup`2i(5G^s_D~e&Y zF6n<jbbs;SwCu4j<X*c(T9fZ-SWqgEYrJLneEOCNJ43*<r(4ony)36t9~&&it4T%1 zYNY(nE`~Bx1v+BU|K<tvce0jTUmO`Z^^1&55)S~Qd4Km^f5e*5pUThD^9`&W7*cX) z!!?Cw;IIhq&q@}^E@9WlNcln&I4SP%84kAl>E~5)Vs~4-wzjf9uwX$A;KdXi0f&W< zm7b}p#Fy!lSxX~CAF{MS4KE$Z=m~2K$7Rs!Eqq-BW+GM;2G#aM{Xi%dvZ}no|A`FR z8H_tG4dg5<DF+Oe-Lf!X$BM_a$G8}|dp%zGxgf1=A7lo5@8a9b-gp<QN98sC)6a?Z zU18>4|KZu4au{y%I5bD#{}LxiEdMGs^KhB!q+9L7KZa2Guayq*QdG%w{5Rrh$Q`{} z15sUdYhYI)&e?TW1=ANRU}n+~Cge-Ib`mMnngRiMca*Nm^jWFXjV(1zlQWMiCFh93 zirClmX(TT@6>li&<kV`q=t#(_X|>gJS2)aKD+*ua*JgWI&c4>Ftf|j`;iPt1M$*W) z=mY%Gv(rT<-&q?Js)yZEfp)>^cuK6-rNVXbV^i-!kIP1?5ou3x81v%7`?nZ2edJV* zC$q5^pV+b3EKP;)>QS+05Ao+YKmMX;!i1c%c((|4i(obuWrHjs`j)L2=*08c1FUV= zagZm;YMEMzka?3bQ^Zl9hzTzPJYE{cu^yEt37iovNIq>Sc?LtezdJYzUh-0IZcP7@ z!g7uE{J&nLQopgNF&KV0D^Qpf8Rkla#^i#10)P32|NOY<=)w>eqhVz|-<Qc_r!WCo zi3>9S<uxGt(zQ{A?ll#3*7j#e^RuB~)H9)<Y2&eP$2PQyiW^u&AB?qQ^!=Yr#QC~J z1-r}7_BvyVDP}6Y9Z)UI%w>>{LVTveK;m_})zNpsA`MA3h?Zv<Rx>ox%_9YU{<W|e zp5Ze;8rfPJ`ogZrJM9SHRaT<!g+WbIy<X&Ar$)tfyzPcPct<&JP={BxX^ZB*9Oc{> z?7NJ|V2-tKmol*Fp@oHhZvq)+OF!gX*QW)stj}t+8t?TUr7Zbg^n3T`OTz2Q7rF6v z+T%#JlSTD(8%%s|+Mi$h*Ejw31Bnx&Y&GF_3s=2&PtTk}1peCt0>3}-=#OXA@MSyS zjxa&5IQ!%GCgtFJm;pi}7=gpWk1a!CUs6H>Ct9B#w1h!MfFVyS$KZ1>h#%VAP))25 z4?>&h3-9($666XeObT3U5i~Vn%+w2n<Sk=q$>}OuV)&nNHC5SOiB|f^cR7Su|ITXr zuEZf<)M8q&J#40M6`O+{C~QGv-ABB?!(JXN4(TtNzatf8Cva#NAd3+F2ydw_yAvar zw&thbz@jpJuvj(bOGpl_=u=?0w_)x_!r*)}7_zlGN^$P;zh0)!=O<4W?+aeKcU&uD z@~_|i+Yhpn-qCv-22~v3JC`>;regc=r?0Q?Ld5|#D)qtKT*y6o@BSiRuSd0EiKSh! z_OpZxAAL`RCz?gdN(oNFy2#pV!VU%1Ovq4vEnAjxa^sg<)IM%t!zl$jnq3opiMK8z zSFPxSY<PppWZODQuDJ^cH%Gse(muRE@~*dWDLX-*VO4hgIn9+*BS@L_l_(aLOsvT6 zW6YwoH1DFtz)!|)i?K{H7UZ*D#2x5EOa&JcX<Lz@#7?I}jUyF7^r6<Bxc@jpm%qqO zgCjI}{r}Yw>gUp4r!|zk#{loYAAl#c5(U<NBw{1V-Tpu3-aD$vv|ArmQBY}$N-ruZ zC|w|w0D(b4ML=XwdW&>I5ePLwL_nn~NRbi|5mZWOp#+H3AT2Z@bV3WgNC^-EzlWJ~ z&dbbs=l#lB-&)^)ccM#^C;Q&z+Sk6e$qnU&x}nl?hu!xdx;6Pc=3*+5qwG<4K@^X- zvxfH39#?pBv?0@`DFT}z(6`%M9Cz5YB>m29`98c?K`XbwmkP$qe#rQ70U1@%di10_ z=brDb0<BmIu#JG1Yh?S{sf}742-L8zRNtGl>N8Nw=H<r1G#4X(MoYl69RYFXBq}E= z#0}`ls|E|~ncQ%RyL{*;j)5QB5+2~pAgPRg(JPZe1}YxDd5166pJ!Frf%_3G2HelL zMZ{&?Ki@;ux^u*lW&LXo=WPWgkw@)+<-(#)jJ-^MqC}4AA=O!~xf$AtUtvd6-I07V zoH?2(36h=ZO|a8<!ilwrhLnx7__M&$zqmd|0s8svo71moPk7sp@-fUk@OE@ljtGBW z$IfIfPp+OkWx3|nemz5{zG6kqPGvDJyXMV}Yt0PF7Wlq?%kTjt?*{r7ugA<9x#tpz zwZ)Bv`xzoRUob)Qcd?yX?fQsJ3-D=hOaTdZ!Xftjp(}I;ax~xyETYp5wcH~-#EFBX zs{f;-J@79dK*t=<N1YuQ;TZe5sq)6+pa1d)(kbU<%Jo>8(}1;bThQo0pvBrH{H<-v zHRvwy=u+*tdu#d=ogQA_b^Wj>&W4(zu(+2~A9PNEH_%Mvt%CKCOba^3H3d7~Y0?R5 zaR@Z&Tmq@SOz_jKhSe)4Gx?+HQaFO>AI~-2WoPt{lQ3c-1nnTxEEp6Cy8dzX3Wf|w zrog3nJ(W?`VH7nIm)&M--MH07$XwEzbkelirGHMs<=X%KSs-ue1WwhzW~OZGMAp9g zBzx}Aqx#=&g{XL7B@@*LK}vC1CDq`cpT>6~bk%6q{Vw5Fdeb}nhLdd?Rx`!af*%VJ z=_oeb>E3i5fhSw4qV$U-g@C>CUBekpBnx|!#}f4ebWDlUimS+_&_n0PygI^yLhG1i zoo`ByW|O+h@Z6C{^!!zt>FDy{7ooMfC^fER*!!$Psw@}7?0nAR;4UX<rmL|`7#x6x zqTS_^+Wm4ST7LH<k_mdT%y?g&K>L+3D5Lw)iADtT8>?Vpo}I$2<(zav#?HS2GP>#< zaT5aE8z28b*7=R_|9xBj=N(nsGY>M{7APxF(`S93?nX^bPZ_0wpRWB9lau>Qp0w0G zQUvr1j13Il89c^jIBJ_(kQWBWn_38^wY8T;gzX&_%FCBF#@+IVfgLCo9@i?xS90_6 zqTIco=7JyPo7=P`NECgQb-GDn^J4zj2mEUqVe;yG^s0&t;z1~P2*JC&%;?p$5x@ON zuui!Gd~#ehLn_oF*vpDSt4`gHYr>DEu)#(BqJK%Ju_^S(eO*-=I2-I2u`#jRu(2+k z)>oq#Qz<?z6(-A-+=^=DpX{FHSo7M-&`G=ztzhrQOuiW{CC>q?)(MPbb<b|ANkm7y z25?^4Y(W$QEDo(sq3Kl!;6u%))piu24s}YEEp9&T+%e@#4>Hif57uDpoEwL)+r`D> zD{o4qG`0vY*HiT)YiFTf?)}r({PX=}UDe21DL5qlgpYzkd2g|iw1{J8*Ly(L*vK{F zoya3%VWyVz&*pb|No9UTjxvuPBGrN}a3mOh8}EJ8QS1Os#niMH`Te|MQkmVwE@o^G ztSomyuVthE!QZLcvTYR%Weu5D97M-F7MBOsYI5)4{cc)-^uY`{1$1Zn0W02(|EkqQ zO@Q5NRIJK?Faqq!G*IiYBg_@15Go*0<oq?{#6~sBV}Mf^OtykdlQ<h6-ps<3UF28$ zLLYu5wu!lK1)8zDx19*^pP9I=w?ER1Bf^-aIFVw3{F_vd$rV+WfFILn=>+#CD`|<f z8LewHdh6*z@#$7|<xy5JBF3k6rfxuwsP}Sz@Oj?hK;PkZeC2G36#f3^yZhxm!YRnl zUxg0^iND&>!2^B}c;M}%1~D9CHeB#-SbyQW5>fFe+^ODN6IWovE*yK}aX&DS!p3r3 z)}iYP>HAXM_V$VP&?(h|f+wAqO$wi^Hm17pEcu^H%g-zHUHeUBzC+6Xr7a75t|6~d z<gsY<B9Uhyo_DaEBOjtqU*?eomBdHk+lJ<AT$=XU@%FuWiOMaH%K9=6e~rVR6OA}S z#4PK(Y%dD~u4qJ$Q%<-O&G?E3nL^dBtWI?omr3tTT#ezZ^lci*VdUyX@H~xev%-%l z7=mqw<H-1n4B?YT(n?v;3Z@STKBLi`Ok0w|G)^24VG44H1UGT0Fpa1hCfL6cn@xS| zTUjP7U|kD`@FQE@vj%ZKM4HkJrygj4tIl{&iI+}*b;~D<4@e4%rBwQPSJw-!kz<^9 zLL`jTB`5S4r8qli!BRkk{vIq4FkjF7@NmM){o;tqYfz(o8Nu7}yi3HW#ZLR1*jQ+0 z=Av_5C^N`^GiCk4qpSbQ{r-(NZa(nF)DzC%7+0P?UCS}}X6<C~kgYOiBTvC+>gzj9 z*CM@XiEW#06}H23sCDsPgdmtlE2NcO!qh&TL!z+cr$MrTwAo#vTA4b&y|=5%mPzJ_ zggbUw+}Myy=G27B9!9aSu<*GpY5Z+(9tnHJe!S7iXuOP&CaVr+a{Y!gG%Nl0_ogTK zJH`)H$S)yfW1p?Z2|hg$dc|djq*^4F?02a@K<mdftH$3#VG$cp`?X9h=DF@^!j}ws zuX_U*eWNZ4|KL>tQe<+y^)@<nO<3S5i8UG>>Cw9~LCQ!45S7g4jrrrZ*_hH#g;Q+- z!Q_b-W$KF-#}OpcR)mFo^j@|Sao4A(W`!Vt)vvxD<x#Jf#WeUJ9}`?2Bk#l9bDgGP z(fg!G5^70-p}Q0A+f{Oh@Z}K4sHq-z4?XRm&`aN=tC{r?`aeUd0SOL~wczzdC~b#Q z(gn}#Ep`YR<om9iS#6z%klr%^=xkqeEk@l$L96Yixj8vKE@i966pm4PtbM&rl7D)| z%|rk4|BA5LLPup!<DbEt7*~MDor}%}L;yvKoJ;9eb~ff={arQ=uy~sZN4@ZmAFMdF zo7Tt%#9uZoLyJ#y44f*1`b>JOgG)q2q-X5Um`l3mwI!R7)=MJ2FGYHOzNY;&$IRhN zi960>L6vD_?Z%BEZ@D5^FxAZIUuD?;1hYR5yYi=;ohaA4X(li2&*#C(-!I#O=qKWw z_iWBdd<wjn2Bf(?b=%d^Qcd_31lsB>_?OfSREJ0p)+l>K<PZPK73Lwu&KBkh<%deL z&VLy<k}%?%e2RAYUAeJ76U8YPdLDOXqK@Mh_#r~TLx1~CZ1Zy8%0#W=v>vEeb3%*( z%0-wq-9iX>%1n>TN`-pKYcc_L!5PkNB>?qd32ZmKGim+8X;NWOJ(xkj<RrPw-9r5d z@w=8|L=7bXnxaMi*F6bZO!|)5-xk;B4gvIL9PLu2>)``mEV|@+!uGd`8qrAcu4wuJ z5=WX7K=3Uxaj8(gdF@<;iC?PY`Sus1AM@1yIlK9A=_F8zYIvC#KTC*>bpjT!mVAsC z3x0R&AYf-|CD6CkGOzO2<kgB97oUV<8yr8|ELml|W1Pk=)1x)=Neu9_;>#o5$}`1D zPKm>oj3VU06r&>U#a-t8)3K<dxcN;!u<_k_OrDxz%cJt)k6C*wRd5cSsQdi?-jIl& zPdRH*uJau8yp<v8eO{wTjGGd0O8M(-0;n;JjP54)c}%~!X1O(E7bTGqkbM*!D!|Am zC`vON)m7$=R$%W^@4_42*?Q1z;k-<s1vFk}4faAP^DYyDKV=K-{m9t0;?Z3ouigRx zQuOVqt%4>^b<r#Io`GB2JsH+MBj_ivJ6iz|uim;8_cD5muxM>8T61b^yLBTI#gMuo z?6Bss`~KyG*QC5zWGzeW=TaTXPS!);B#2({S@g$9sjV!v9m2cok+tMBZw&L07l%p7 z(|3_Hzsg8&e5+B>!H&G%5+^%gIvfGpl^X?wMI)kKbbQfg0M-G0bB1jgQ>P^IUPk;l zJ`rzjXQh|U=QmSRqvbo>fU~RB>XQ8@n?HD8)%f5S4Rtp$dX|vz*fP^*Q4Hr0WbpVg z_H%!Tj&-hSUG&h9QXksby1cv`WBb!F8JLs(`t_0A%qzxlW5ZJZs^?~2eL3c^?yNma zkw>Dg9UivUtJ7_axmv#7>fJJM{WL}2w*awS=A48<-#=kN=o7~=@2GJmD{T6oHDpdt zIE2`HHUxzX54Fh+?eava<p}6P=G~TR+2#ZpRG1*_aHcer3UQZrE`o9uVR(|@A&GKN zq^gV(l<sYnWv6XdzhL#aS5NhrD^@QA&4(gdgYGNtPJU7Yv?8`ctng<s+a)t$k&4__ zG~U2=)B2~X6tW&12ZGl5%Cpj6osbV(hgm7}GC(|Lpwjuv!BN2~5Fuw)sw9QA_jbn0 zA4$i_k$W-Rhm$sDts?@rd7z(md2GYQFP`HL!BQ4n5-j$@Km4HNftQPtr0stCX#4t> z_jW3OK{m&IkqwY^cA#^4(n&ArBGT7?M8fRqe?Y%(UA%hWE?1lx8CQP&V$4ww(}|y0 z8qPN@s09+b^9$(YUmPj6LhuqXadC_-;0?VDO4^c?yTA6z+%J-R|H6NL0cPZ)InfZ# zPOn`%-xt=`l(~Jv)=gnyA;OmQsNpK6#yxSDcFQEsmc+CdIoowOX#eZ{VedF5gc`RI zXy8QvJms`LTR&&3hFQCN-5CaU1XYoY<aGufdOT{G`UTtZ!o!k9fOQgzX7St!I0f9k z=-aCiL4-a9R;}spQ9-;+%|y}7SkS%c-^LX$N{wYnC{Y$yLdfW=OzheKX0VeX-pm;O zEh6ivul>`h+uch*_nF75UMdt$tSuQ^o5&W7S9~fdAI3B&nT1jru(wN-NT+&0!YXhk zlF*ER>bB?%J`k=`zOStW$ivUjman`06-F^WH74i)W!g3Bkc4{hgcJ=4t+G`8g3a!h zU~=9DqFhE~`8`*T!n=Opu_0F=#45^eb^C2J)&*&9e#XN1kt2thl9D}WZ_(97J3B~d zK*GH8N=@Tk>ZVQaXEPorV0pZlStZeykcVz=zE}F;)!EL%PoIeBlc&7&1nBxYGW^TM zEUJe9Z8+y|L*n$DfD5*N+djCZ82o$*PwyQh@+fDrI8+qgmk>E`GM?wUs3;=bbTDsa zxK=w2@@TwIQ6%>?tukv5vz(clngXWF^*U0NT}J|1+S`FWu<w8Rx!|Ha5BZz_9fCy; zZ0e59&M~Eh>A`fUT}vCm1N=k0=<3qQPA{*RNlD?ykC(rh>)RCBwcVlSHJ&)3o!iHP z7}lv(z*z1nB`YB2dIQS2yq0v#nsc=W;Y<E+OF*-Or!amSUn441%p(4MqV)3n^tq;W zYFzSu^ISYvr*H&cNI^v+GcK+;T@vQpGnFD0vmSC4QB2(!n^1#X0fxxC$%7<vitMiM zO}_9+UzWxP8rzl=<!8cbc7-kE*;lK@ZZJskB1K`cS6=tnt$d2<asTMX7pS9bVEQ|g zbCX(zv(F3IOB-ejO@1DjQMlKo*)@;sHC__ubSI%4MJB7-iE<;pbn9@nhXEF&kO;ct zd2&||fKpDM+83AnD;UXnY|CeWlTKim$JSXV!ws*pjUlhLIh%RKS0VQ=e>1MK>GK|c zh3~Hk<F{YCG2QR_n|AdV^Nkh8(EfHh_`M5kTkNg*#XOqBac8_&E;01i<f)aHeKL5? z7aQ`9aq*32TCszE*3XsBl`!hES7cE?e7?;a2#Rdrjh=I6xz-i15+^o5sZ)T-(fNnh z$FZ>*%|YF0B~f$m1JjI^+k)a+#lA)UOI5?CO^cROy@%}R7+BEitjbM`p6FTH4xp1y zWF+jnR{rSMDp3pGEbMNVm-Rsu2QG7?_ILVl{RWStWftDL{kSbS`}Qz`^sfZtPcsTC zKEME&pw}e6s~0&Ng+=xDDF4m|J|$sVCMkxaiitgZ_>gTuw9;|v-nT?$5qs0&uJ=u@ zU7ucUjHIKcIL?=)z7T=UvBq}mZE6~1RGP3l8FUTwmJO!}>2L~cSJg$&otSU<_o3@M z{I`p-%le?k{EK%p(4$)|pH1%!IMngddF-DYL?203h^uB+bP8EaTwC$*Wx2DH6dqDv zd<l;NaFal1cC3oHs)mlwiwTmQ7$hFFpVC8<hX^3e?TGEXy;DkRziQ7#q@R+gO-PTC z7w)aQ+u3^hZZb-phZdp9gy?XfT%}d7drexc?8b1uT%DN7N_CGR$+y-aArkjAgC*$a z)ih>XZO#=4FrY?-BNS*rg<A8Hxl&o?Urto@ICt6+m8d_fpbgl0@f!}-VHO=-Plup> zBglXxvBXe@C$N5^>po(UoR!LZzI-_iLZpo9=IPe}?8NQ?@0m08)_o%Y<$f5HGite9 zxwiab_ku|LAjBe2qy|oUxt3#r<6FeOiXCF1E6ROZ^IK_$5W#O_$p&CUyJJ`KN&rph zp+<zV%BARYpwp0@Ec{}`rL1zk(_dk8J+qi6KOQ;_VoEj^e%9?x23Q2jwqqt0-K&r0 zartR_=W@20t}W+bSv>=}dUN%*S|q9qtHGNk0O4B65dAa5-+R6f=lZ~DU7s)j{5Nbf zyQ}9YSb5mQ^09nG*Qe#&GJ}G}5(+=YzSFu?>z2Rl>2vX){=rZDk)a%PKSHJTf!f^0 z#$+C}XsT~tU{F5nPsR>=$(8y4^y2gNUE&YOH-BV4(l+oezQUi7JA~NYy@+U=lf^VG z-dA#6GWE_!yvE8Y|M>d#>zwfbP;d-YZNuZqa0T;9w>MaFv{Sfo(IfI(HA^6+$;rfO zMtz=H7ScJn6y29!8x7%RHCXJ&x^`q&Jz2e+eABlpdjIzPh1Y+rA^yu)zr$58>I2rv zzH=qAw(Qbto@i$#+jA1m>z&bBnW$Bg{Iu$h;zTW|C!+8Ye;vh&1<Z~u;&*;Ys!_-k zh_1|*Z|veQzrQ?~zP8&G&i#^PSt(Jc(n{mq5wzJFuT=|pQ%qg0Jh^ibfpg7TqSpD9 z@$W{YM|<?DcjrKM6`(Z56=;-S4+7$K4@7;sL>{Yj9*_J*E$HcIS|HbILaqWDa*EKI zuvT~cABjvhmC9H1mrN#E`-p%x4|Ht8uP$Oo=Cqu9^t8glE>L8@hfRza!6x=fE{k#e z1hh<eye3Lq7@mK|VEl4{QTZ%jb1W40ivlSV>d61nt)S>NXW3`&Z4k5HVqvQ1)SicB zDW2`l8hn1@ovby3fOigUJu8d|4D2j!nk?s$!h#}eMdI_(r_NOu*`a(@NXCODPCTOb z--Er)e?ubjr7!hs195bb9{)8jveq!it1p$(ztHb7p1C*Q+6{B<d!pPX3mWysSGoJU zxa19ct_h1c>OI*HSk$IcM=f4afzM<A*wpt6fL7AC0aCef0df;QZ_oe70LgF=AT4d? zj#W;Fh~*&gQ5fW~UoyD#V>=jcT{?=OXD-~MQB7R({7*aZX?S_PJJ?I3vO5;6xNICT z9H^z$B8t6>X-krAc_eCK94390)nSo48ti?Ym0xsc_=Wq1qp6Ph27XrUoDZs+mU~wx zsx49F=MA%S<)Qy@CB9>{|1__kfO$EWg?w6)JK7x@GTJdaF+^B{^<4TwEeXIfzCsO_ z>W9@oyT!~jN~SvCpKrN|u3c0(6KvS~EVaU-rBofiGEsH}g)zJ(dhP2$D~^zEt{xif zbo>_Q$ETJP4WEB?<9#f~f3Fts=((kz1F4l-sbR-ZK|L!@oj|}OmkT>UD;d9Z^72Nh z<+;`=HM3usz=v$Cm;$gz=~<@g4f%w_;lmyXn<oeV=*;}g((}nb_c~`#+!sVxyu2G2 zEp|KKaey99QJ!Cr&hfQc^U+>lQF0ik0PJlP19<$A!PU_!A1xlY2_dh0?(PM{0rQbT zv&|yNDfnr_Su9;@WbHd3bjrz%JS3mc1JWqKr|$KEmj_V$yL~U_mq&`QX2@*`=Z&vF z;oD74<0=aQO7*g5^Nq`!kzR|!r8C#xP?GFeUo8*hXprPV*AJ)le>*!|{-8nPY`Smy zEMbCQroUWEuJ7bPz49}UAS|x(YwxIEloR(KW1obo&6_f-F71Y;E~$uLtN6|3!2Ooq zJTnugSI<9d=K_)edF9@zPKK%D{NnF@P}tsMJaipf6?IYI^3N03KtC5_u*Ai<Z*ShK zij=NBEguZ>tpcR^scn6ZIXaPA=KtPkn|zKX`Jf7=(yuz4Z)|n|?SFKLXISXCel}PQ zx4h=nNWGa9r4-?&;@rAQE2gT<>;;9a<S>FY5H_Mt`e_z|&19f`l@?u4vYjzb8#-Q< zCqnbRMDiIhit~W9_i<_76}Y<KbJYHI$fwk<q|3?A5#Y6$x;hHb*I9$fv%n+J0`Apf zyd0bE{P8(-*uWLVt;nOF1Q=7n%ur2ISaAkA<IJ|}aX9m#Pam|-_8s5Z$honT{Mnr2 z_dX3$6k-jA>pq?9I7RQj7}S7qyuL4<(>ME&p5wxW{yl~TCpv~D>qT(f)%r)RU(lL+ z>o3~eZ#p`=(78N%6kp;7p20kAt7%J?W4vcq4pGoB^-QC-2#VMrOOta&M(P*pZ8hNb zhDZF?Qn~k@gtk@b^nP>ASjh<V>uQYHem)zt&XcZb?&lRCG<i-}r5(_6P^AK!au;-2 zA!#weKU}cOj_P5lU-&|tV&41*q~s#s0Z5sV=nH^bOxSsLY--S|Wm^cNh!f3gLS_A~ z5NaI0C8qr{H^<cS9FE$K+_HKtW>!%TP=eXFR%xo?>|(k86qjDCu7DFTV*A_3P`SsV zL?E(;UF>U>Rq3ZsC9)nADo6QzPD(VDy0IUXne5~Po8`99gAT;~IMw&@?$cvt*bTSk z*j`M%>?2)w=H9>f_`_yBC?3>`)$K16J?P=B%CHQ1u3z;8F;FAxBcP(>7(I71Rf<$@ z5vG#BX37}A8MjVl+spQqk9PlZC4e{QRmg@s<chOiF#HZA3NGGG9?DnaS$o((@5{6j zzExrIlH)ioUs}Z|XF0mdN?lo|b;nDOkU#smhWBl-RH8cm!}@&4gk%`14%N+%DWJbP z{?VE^sRaRO3hS&}QpEH3e{e!Z^V9i4phH8tm9W33QIHDIdJ^~2nwc4Q$l80`{x=E5 zg`Y$EH%B~LV7)J7nQ701%>Y@*B?m0iP(S^`&?qhQjm;Wa0-cQXH$k6M-8wcm_$(QP zas}28q4<Dm@6jZ8NNl8uYjrnJLYdXIX^_JBcVi>@z}2CUr1a`Ot~~uw4U+%zo@=s_ z@4er+WNwZ6QgVY9=f35YPPN1{?D*D&al1I*TKp~InR%5TF;h@NFT+h$3vxLB``fuo z`=Gt^F$r@-LL&crh3CBOd|!U)YXy&ENps#7#>Tc;DECl*dAl_qVv0i1A|T_A`J&IZ z{1{L7+r4t|C?FeSy*TLo(*IG8p%p=8Eut-zho-7WZ);~~Vnp4fR~Sys|LQ1f=Jhrt z<aTe7u0@?o<7kwC(@(FVcbw$9_8<NIM&jOx7@U>*aP?@7x^}XR`*y$f&}$U43uV%) z<Y``axWnWJ)6%td78;yIK45?NxJk8A@5zy-g!JxL|27MHcJfn@>gVCC`*m7hAHO=t zgh*i;hWtO?2cPBmd9qar$Kquwu$!WfSDLdFo7TG=ulVHmJRqUbO5<UiGKyw%=S&og zl8Rfgy48SJN=DwKf4d!5412B9lbCGJ-1Z<RFStO--7u7fG&7fh&P=4dg*Ty@J$RKQ ztUKge6ehSBAoSMqGf+{4^Y=`?x1h-#k2y3|yCxz_;O0F|Ug&k&wB>Y%<}1#*7^2>m z)uQl%aL-oh@#Mo%S9RyqScW5%DWKjp@hm`QN=DgG(*|m7b#pMU1agb3be*lH=$^v5 zgq#-E5}?|d%pS6x2Hu0P56sGxobTI{=Lke0fk0zHv<h>XOI0K@ZbfO(Aq)9OwzS%i z0Lrq?%XI@^dIB>o_Lw8+Vnj<5$rzKR;w0%<xznS_d1VkV#?Rds+xh@CAMsTWusZN^ z8R4^bYW#y6Mj0!a31-gr?a0NSfdei3K4O;`V%t-}gR-~^)5u!crl!N)qraVFSPt4< zdacDLd|(6bj6_P+SKc-dkNP+?TgbxMRH!NGtJg>ydHtJ_a-(PhgxWecAk%X0gD<>v z*c+Ir1`idQ(TUT)4?+3t78rZ8i{Ef0!H>H*gb%aSGfro^h)!<{`)`iaoHpA_>6eD( zIl1M*#uOP(|H_4iZ2~|hhtojumq9PzbnPTXWuGH+10_!S@v0u~?(QNY-sPE#0~Oau zB_QauC}p@#)MUxr6;Yn4WF#oBW#-{cWl0@Uzn3sTIfsM2ke)k#*pD4PGpk+fUeX8E zJKZ;szMCPL>`{PDZYwU<>*A2jA|&+C{Lrg+Z17qq@imRSTap*8>OL@gh`s;_7b$}5 zb){kCR?1>^lxe-?me;P51!dy-r%2z3^iL8>S<2#P9}HSDNyMzVr3Kz>e6S<YL&!jt z@A0}fsRLQknL2sm7kxnWZ9pOVR~VES6K*)y%1W@xihPTC;xTZ^cg)n8^YbmfnFtEm z{yg$dWNp-MyQ3_ge+h}904$tw01IpG5H9=_9`Yg|8zg_4epKQZ9O>I8dm7a-#BPvN zBqw0*Jg=W`cX$6p#cQ9Pz1&h7h`3DwL_-U3Ra+Ep@)upYB_QcWTai<t2bnc?c_$SJ zjF5D5VBl{d&)*un)Y~hZ;*2M~cs}w;rEfN~;b*AxdB6ZJVeo0#LF#g#JwbUbU^nIW zou#s1vw$Bb9M4}nbGTphH%KX{nC$=*u)8Mqy~Q0|AMd^FFh9&vPP`y*(Cw(B6O}6M znfNX~o?ha~##e*Q1l(@_XPwlF+sm=Pemw=xeu~ZgE<0x3nhNgY4_xT{kPb4kl3BKv z8+R_%TJ903_GV?y)nR{c={gNpTdGorn2_Il;iIX|RW2?k-=1MdjVax}9fF~x`4bE9 z{5DvYp@tPcb>J-;86q$+y0`ioK^^||3Cl(<yGHu;D-YgtHmqNbfzQ&c!t<1Q-`46V z(J3EiweLqkd^3IEFh5@=?Y>)!`S|?v5|YMXc#eWh+*<T8nSGxs`#1mnKQA%L$C5lz zPn|lxX=b?fwAWM?ytFmtH)M(uyul9#fJ+ae<gOAV)IElCecLyp=A-u<(m9TWhkjm_ zLI_e|ur^F)E9g0kSMaj<4R48<bnggNaO!B3Z%>N7$Q5UKUy5{_>RWuNtrXfG{ya(z zlDVA4>|R_qJ&53QPt14~zgoQg76}@xWk?OKSSI^AtdX167E5N=)vtALE6(7DT+i5w z)BcN=aE7|U@EUm-V383%8gL&L5fn{fmj1{c!ua|<k&x$nVZROv+n}eC1ri1dw@uQu zd?s2{T(=(72@EgqQ4#)o`?O5@h$ucVF+UG?!?1EKTq`e|L}AABL5M8iT}%J{Dpp{f zy2XlF&`3#TxS7{Rld7(Fh8rTUs4+xAT^)2<0K6p(9&f6HeKaXvAH`vDjkA=|eIfXq zgHR@5jlZ(%08z8F)gcP+ghXQi7fMK<8!XZ9)g=DUJ$>}XL0h9yC6;}x#NNnxvANl~ zzbg~KHQvU#MyazX^lWm;2)|SdKA3ndYS6A#y7WE-z%L@U+G_=nD?wF&e4M9dGmwl` zFvMWczCWcfE&r_rkmuk%`}X!5DJy6~-f+$*ZIc9Pye;AVS$JQfoR~10j%DkWncJS^ zARrACoEleDR1|DG3Y4vV3shZdx1cW3`<zgJ#e;6CaYgSXd!Wt@P4%f=RSWjYb82lg ztnw>4SjMnPJg3_aF-Nu)=vKvgL^2LGhqCa2u@r58lQPR{Z4}5x#3E8h;vc?0TH*N3 zS(T}2)BX7AD?lOe+(o8QLzdbVrLS%$y5XinB*@?4<t)C`3jw&DPEz#cJsDSaIgu*k zlAOBAk}kziQos#JfT=0L52@nS?8dZE-Ik9}af@)xPhYckl)uar;9kuXcJ-SkSe#Qk zFW{^dc&?LvSfDinB6_w(W5A6c%B7AIVC4%2O-iz|MPfPi+*^Y_weO<a^665^A9T3h zg&7X~6kf2brytcx(K?Kx$S@s6dcqRtlD~q6$k=QRs}#zZhp{o%MWN<uz^|@*RIApn z+6l3?xgRc$iuoDE7T<uMuU_rzGfKw5fW_r|*2@(_Ghv$P{?_|^-Xpw;`JBFyz_u(! zUN#g;W%BnyKt{s3m25GP;S!|dlLFtlz8Ooi4o~VD7B)rAGg)v<GxrM*VZC*!Q#Kq7 zk>4|1wsOTx6U*EjC#P^|er0Ty^Lc*wQa@(i1zRsc0}6>Yppe)fUwd*7O1_F^>HiN6 z91Q;flt8rWI#vmQ<-w@|BGavR%Y$9--hIW48~e>^93I=?188F|6zM`Dt3Jrkh7i%p z3oiwun7*dZZl*(2W|p85_l^0$ya^?)uEc(y>GdynCuW+On=yNI^z`{wwOa+4M%nq# z-1h6k1+D_vo#r<#a$|J4Xmkg<PLd(deWcQNvp!b0KO<V%hVcf+wS^{AL*kH*%BnoI z;VQ=o@TmzuT0yfJ1rYMF^&UZ>5Gy31>)TY{lG%{kw}H4_?j<Hs`Y89cnfm&DptJlQ zKq|yw<R)+C9>8XKWi+FybBvUV@)0!VTkJm(1~2NLeA0zz&aJu9BOFkTrC-3j;4za& zqj?y-Ek8ygEh^A20OeM8S$R9{=}>ZZo#9*}P+ckyNM^D8cwgO~D9q#H^DCw2EJG^! zqYl7mCS1VaE2SVC=t)^A4v)E)AyGADMA2~}IziK*SGN&A4AbIN1}<gHbu}tMqEv_h zkoVR!g^7y}S<K}<mwY?Y9HZ85ZP&p;vp3nhqSI5|tD`a5oQ>OE(b0$^v_pc`mZiVX z0d+35*nOfpv<V%Q06_n)C;l3)h0u$E)mpv6Ll~{RMITlD<TaXc@)oI?{&soah=0Xx z8S0=&eznU)W0VJ@1}IfrLZUAUY=!o}ypO~nX@1zL&*0ozWg5hB$YXiYrRHH!)%rMO zp-pZi>hvjR2L57HYC!X=nx#59)BV90LaWOa^GCpTM5E9XDx9+}=QY|Y%!RD$GA{9i zxaYOxSN2qROOy&++qYyL+863`<8wL#*@_8Xs6WSm#jzCuRq0-){eN(sG3*D)p;c?# zA5^nPBN<r+j|~Qg$~!4j+u@L%M5y!FceCKxgF2)@Q$XAPwarlc9T^e}AE<Spboor& z_IS9|W^;=~mZ%X>xRfvXhkl90d26G8UWbMo7Z>wa?GV4d6IsNbnt0e)`$}Up-EKd@ zETA)_7XusIqMSxr1FXSFK57X7@+@wSPz4%!+*kQ-?IRJ3je593)B-mDLRsU$3URDj z)Tr40jq-jiYB7zvX9?7FC&PODtGnCj7Cz}C`CVr=89(T4%?b&WzFXSJg09aFj=l#u z*~SVX$nZ}(RXkpb?OFd=6VG0axem}ls9)#I#d?I5hHM^{(}|??%g<}g>_yeMyqBb` zacc5BHDUw}Ah>$D$XYo1c3pu5&P1r2PAdE!F^LD$$?&6wvsoC68yktv&`A<yk>#q} ziHV5*b;6x#CHA9dWBM7-d-cCX=ib0OcdtMbS@ZK<UyuBrP~zA^nU@qYMZxPe_>>?4 z5g|`t1GFJGUT7j2|1l{6d9P6~bg^}H@uiK@E~oF350FHv29>`4OX*T~?z?7BBPT#` z6*tOogI3;1ql>JyOY`!RG%L5xY)jH7u~)X19`xxeE5k382%ioJ44k#0k|Cqk#>~Ex zdSQcr;KBtWxh>f>d?>2SUfjI!$roi>PtocYup?(+L(UYM``Tn+V6J4dP3~Nd^-{q6 zKxXVle|jlx6ae0W7?$jeT!bb<0W!_J*Z6bl#<E>7{o)1OW<V+RsYR*!(Z&Reh{(b8 z%4zOgyY>`5A~7O>%tz@j{?g4h{$38q@Gh3gqRkLLH!uPHzshhPWF2^CLml0;;jS#S z@xF+-%LU&2>K$G1+>GF{&k3e7H`69WBCDiVrqc*G+u6gVz~9bEYCx@BFslAp^t;pa zQm6M!Prt0MxCf=5LkJN&IW^U9BdBTYA|Ah(7|Bm7)=s^7)nPYYz8ULPbV+?rL|D(v z%!V@TpP$Yp*KglnXyAtP-)!Z=JZ<>wPtsdm1j7rv3Ryt;)=`5t-WtE(84CS8HB#j_ zkXkxAxkO^UDfyDyezPGDAFZ^LNF(iqIrleGS5Itj!*?8n24x>xH~<oFTEthx{35tm zb=_8DUX@GSpurZ@I}o{slNf+el!t<ibUn$<m^nx9{lFd1zVnr}6`o?H014oDRw^Vg zjkdZ6A-<P&+HE0<Rvi%B@^Y%$auZ=5LwODVXzqjTLHEmb%S*Cv%bccyPiOSUGq?<- zZ*u@-?qlj<glNY370reY9TbED%MMeUrCQphEr&7Ffq;_fejJ~BF;&sSvhMp({sqn| zfohcPfMi&d+7DwXr#4i?x7kxh53(^evD-I|bjtWW&IoL7gLbw)D%deCri9VZ(C_WR z9`~j@1g>%ceZ0o+I>{0aS?h?Vsi8iH;C0qCMi9;@F|wvuN~o{liyl#pxW0V(-%LaF zHgbCH`F|eah&>fq3mYiL&<%;>uuR1Md&UVpKFl5>)BTXW)vrzww3}9?BsWWp(*mE2 zy(>@gvdW`}4|!cB^MI5;!=>!{rAjEC1>P8gGI`whvbDhPrz4eu-7mo5)>%s}$s=R4 z`=uiRz|OV{PSrNNPhdz0D5sCC$g1QM2nI_2+N+nzfm^iT&BYhX$3~|?rv<ri(Xl#; zBNddH>9oz!p3l0;R{OsDbjd1+P?HGHcZ1qi@66n{OWyRM%OkOosT{tmHxFk-hZA(* z>}+u0ok;}1JLldrHc7@T<~*%AW>Vs4&_&U}A!!Rfea~L&8I^zM4;TyjR50siDsTOw z#AW!J@W!~seqUp>0IFD&pLd`_o5y5~+mb^f=RP+B1N>ZLUakH$-NLKk9GMZoj;>dH z6a40W^I~#Ffcjc2Xy@a}_b!mFF*@w8x%oxv56E$_Sg99<6iA()2i9jt71_G<4gXHZ z`lyOLLS5*@Yi2pW)-j-~{+3szVt>*c<NQT=Gb?PE&V+p8x`KiNd?!Xa*Biz6e7h(E zRp{E-SDo?nOv<=s%cF+gT+Mt-Ije;mIseFng`I7R1Gqxr#<w!uO0euQedFJ2T`UR} z65%`cWF^sAO@0pq-zq0bsqsPAGX7!Mla%~!`X6dM(_RJAQ3ZyE1nv%ZGgD^*=cL=M z{)gMOt4abMj(5^3Lj_+2t;(PE3jOt@TA7zj&8A8fZ_CyxLLc7Ui3x8sW*QK-%3^sX z*v!6pyDbUNO;T8_zBM5+E_snw7Y!9_?9S349pOX17^S#}9d0TCHSu>%0O3CH#Q-e` z@w}m-p+*N6ayz6(r<75IW1uTjOCNNSy1mgkOt+s4h=0}u3GF=oy_K1LrYEa0S{WoK zCr30olJ9{>B7%oQ?e3!-N=M<8Xj<m{#y^2?fT_sbJV-d7*)<=lEM!T|0r-_Srdy>J zoRgh-5$jSQw>~pEN|?YdegsKfe9-}{T_UE3@$nOZgqE4|pn3Mx-pVJ;7EmkIZ*mp8 z#%wku0%2W5B225EZ2w%$X><fJif+AOn>F$ij!&g8OAT6s9b}-k8*@I9!kISVm$7bJ zk~~u5zX3cLn*&E^7Luit>IgL8BCFQ&DbJTL!RK%pG{W+-tc=kFw|?Y1k;emo=+_fm z`8GTmEY~}fd_$$VFR!=<={`FZG!N)r<wVlvT3(>1Lqclu8YGdMKk%Df;rq#BqbYX* zzWc^vX_1qQIdn9D_H#P!LDWC>&mLVl2<@fp&(8y0#GXicL(ukb`0pvq*cc^Ff%u4! z)DnQ)5h^e-4``-&@{>4;QZuZC`Ee-IRSv=$w-tG1zAjW@Vs;Hm3RX7YowyX+P!J`+ zGo$3ojMt!}i8B2lQ9D|jIkyn0LUu}5=T&cpf*L=#_;hHVf)JMR-MT!}!0Pc=L7a{1 zH^bo5+g+6OR~&VvdK3h@b4hDXNe)=AK(R^tmdO{QrtE_~@xN<yURVTazyHn1nvHRW zo1aDM*UZ@Oop@d=O+Lg6#9luKAcC*^xv1FjKiJ00XJ7Q>H?K7TZX~q@Yl1{px4l=8 zo>B)9xD-W+1{{y~TW2~!HqET3mZ#I}+DlmY6pv#7nNlpZCHl%%UF^U()@$Cyj){xy z)4}%21GL8N)s|9=vQ#lNOQ$BUTKe-f^T$f|88<D*mg3)~!k~bZQEz^<@dW02hCk&g zmNXy&Lk)WuNbOTTilspYo4tpIca}Y}OGF(?ue)W0ngs>=cZ+SddIYi<@;~j^gZJ^3 z62FE>FSbz3ODczy=1VD7z0fRWF$vtoO9I*h2ilNMlU1G7+*n^QZK-(e2zVh&vn<5Y zXmdrKwag5ea4m%{)(PpQ-od#?`}AtF9{MFvQ}(SOQ-9P{d(<pF{+9^;_rpUPho?|2 z2QU9=GbJxItdz9R%CXSs7%QbH$uF!jhNDAtz?sqw$uGDVc|4hLL5W^TJhGZB9*96g zJ6`r$!8A7ap6h2@jzZ|KdIj<ycivS4+YrM%wp3<{^>!3`l45UMdwE+G7JPe-E!_CW z_{W8u$WX&-`2o&l0)i(W>|B=u3=@OsfjJYZqP2bSFk}XBHhNvryhOm=B|YIyes#$q z<3;3lHFGracYx;>v*mh4@~=F%;4|OxUBI}Y|F!=b7j$X40ERDE=9+K-+Xv6FvHw<s zoVDRFDVlCuSi&Oh^pS}bVz~Qe*nhY~2eb_O1Eg;u;q7(Cl?uunwBM*7<S`u)w;caQ zP{NxMmCPW;s^W$-c=YI6eP8cZ@|lHeB@Lx6!vo^H?s_pmzH}N(8S$^Z$~FzCp<_09 zdIwo!tF_Q!Lf8e2T}M6jXQFOh9`{-mWvDH$V*OaM+@3{mW%j$O%^?BUMziRAQHwcz zXypy2F0X(uI;qTO)f!M6gA5E)XqV*iry$^F9mwX9mKJl@35YLHgl)Ly-7U@J^Q<+3 zuN!fgShcWyrvC-(!zr*ZlWX2v9$gk9cFQ^dxHN4plt-+ERt?!A_;1d&?BCIvJ&Ii- zIokFopaS2<``tJ^Zg?11@9;T(b4tZ#qH4Te8pxs^V^4zCtgYnU`$+BDn$Nw2GF^!h z=9#FIipXT58WG-U+cRxW)TvBbqS>#);;K_Y_j<>88E4&f!~yjfHc)#i_lzEBtG14? zhOqK4O9LECC7L_xBwcujhucFLw6!WLl@6}~rja;%HFB0SQa2DdfrM59XA@e7=c-c? z`$Es9B-T`q>B7zgVA8Zp=Lh$?el4NVa<2V6k+W{d)b4SH<jj>_@M)%<!;!Y*;vb_k z8e7Zn|7$d98=C!shlk88;MkHN1}uEG1y<PmeDS(lu(34U{eE(iNL@x)5|pX6(WK0| z|HL(Z!g&ynke8AQkK}7E^9|L0$T8*#$*29y&$)X}X>fF*9qdvH&~u24{aZy^3F7b> zt1yNlAla$|boJB5Salu42`w!}-}0)j-7zV3$sLBz=aSe?dB~i0b=%iY+k!n;R{Elw zv0}xr?8>m|=*Yl}crAPVMv0TS(x9#OUaw+ldug4ne78>dmZFn>?{(zs3wi0=t9TST z*%jOJ_1o9QN@?BVy-e)|;#yuQPI<q0Sa$BT)39hubIWVzrl!G#59bJ8_siFtoqtXK zfY(Lh3Lcvy1kI&Wn+qV|_RRtR2M>PzzzY=IJty=z6Bw`Pey(@>e~{t794x<``6Gv! zYQV<+F}`+fNjT#6uzi$`zW95@m$1e5cW36Q>ChLj9D(?knUTK0$ni|rIt}PvF_I7_ zhIT3oBsCt7UE_|`in5Nh0wgmraboZbRUsmi^(_d}PGL}#_z+qrEg2f(qgU*ozWQEC z0lMp3#`3mfx0$n*rnDtFqs!hhZ>=<~6oa}4u;b50ALU_5K~?C}@kyZzFc3R{=T44T zT_f_|PZnSlnC6VBlujdi0#pC@0QIHww8Lyb`v<_#?I34x;LT6_rjF-zAl<O?%W#&x zes{cablNb0)j@o&0}Bm{d_Bm6z;X}=6k=x^v-`_)@o%Ns;g?+Z56UzP9iU9pdYs`_ zG5R#ALpY%Ml%~ng$AJZvEHoGlE=}E{1s=?0<-)?92cfFE;EBRP7=<p7J#bd!ab9s} z2CBef)H6BPsA?dTZ~t5}tqtD`D-~SG@E$GX>i+!R|54Vv()I!rO1d_R%de!wQJ<ZF z0+6l9r;)W1G}_NHF|&KPJ#arkSAcC{mpWW}ZUMj(bRRqDXSfYK_!{%?-J^`+K{3@o zBM~rhN<FfcL*C;ZxMTPA?O|sYxMO8!g36sOscb=pFo8M+XL-r8I!Vto1~x$hUZ+dq zN$uPbYAF^x;p4u1FKfn>7NFt_Icl$zW=x+5<f(xtgn=13EA3IdPZOFC^P=XrQ;m_a z*-r)nUb&f`Og57H%upMcuEYULp{^p$Ms<f1kbG&Qlp=BGy`xx277N&d&bi}~RJL@y zdrVLN0#AEpYC+Cf8%?G)n$KLdK(r9zZ&+6sCmjy?Z?G=l>(}A5Fh8YboO(s=+083` zUgcU4aNVUpA7{+7|E(u<=w*}VLG?lly=imQoMMg;1&d&N`9d_KDu;kkMt;-XVAdhm zckkXY?>quX4<%;u;~&R(MTT{%fJmX+yk@0I`tLZw^%%t$LXh`GxA~CoCQFtM`~<ZS z2!$m}AU__N)60fWvdo@_Eh6g6)z-vxUTctqPyt;?{}!`HCAKBBJ}cVdu-pjdM2no^ z+H=vCb}x}5W=O(jIs6wvw@{G4Z?mYl5oNI)cU}Lv1__7T^&5(3$<*r01Fa9OnZ-WM z16bRwdp`RD&a2}Mv%-8mKp_0TZ4Gs)T#>c*#JZr{B}(#ku@dB!1NIDBK$B-8Q5{SM zS~XzK`QOILneDu-XTwN?lF@~Np&6iIil7j%+lnI3$}uL`*f%W0NiyYh2!9=Ib9?uR z+Y6DJ7iBA_IFFzLJN0DiK)vCGMdDX>e^}dxT@i+;+@pBRWUUjzLQUKIKeZ@~_oKD= zR2mD?Aa((9>o7e<?$=iMXOkqCWME)gwST=gqHSIO&=Amv^pj&5E>Nbu**AM0K;B5Z zZ=iSRj}IqGf1ZIM0RU!%#sjH=VuH6fGkP23G<|;%eQBF=p3KB&3#^o765mVe%z!n= z3C!)c<ZEgGnE}8+Rev4<$P)HXL@U3S0gH&VD8lES0OOYhT>APJeb0ihCXe8lNZNRj zu|S&dB#FUriIP8%ApOYLpafh+t*~D-F5*vJTX-2<F?d$p1;a;CR6&{nk)%YE-?zu5 zYJz`ojK9@)x`0X~yVBZjm}a<PT27cXsexrnQ7GBgP5J55r5SD!*Ix$!OF!Vl8*&55 zuKSGL#S!qudyADM4r6^vN5>63`AyiqeUTmEo)+x<54fl|{QjyR?&<x1ZVHMWOL_`4 z1@*%1&o`#34mCqFB>XhpziXtjVbG}_7KQPyTA5*pL@G!w(&C)wPBs)!U+G&Otd;sP zjnuix$GGSo^(44t7SF4|X=TyMT_kud3FRL2q~LgloYf_Zu0@N8KV%ikJ31%lEDX)2 zkGzm)+E?03K@M;-+~rfL-}aCp{qnQQLP_P!4}QU}_$a}wUMb2m(0kqCeVNIsNUjzD zF)i@7^4?n%=KWB^x-WJ??%vr$_x29>Xu$dZ=js8?KzU)qr)XrQ_r{<#Y2v-58He** z_w`OZ@w=Hfb0yGe6YvMRU4nuP%-l~P{jLz6H9$hGchL2x;lT6HBL{st_#i?K=pa%S zA^X0N!uA8E3zca=ZUrF)?A!#lj=gc0oSvLC1XwNrPIwa_noB$I@`9ISzW@65>%Z&K zxB>)qy%@#ZT0ns8HeG8svims?GQ8`44jh1shj-}e7FI*bhX&v?XY&gzYmQ;p^013< z@M$d0c)kMMh1R_UgmhKcv_$_Hciix{|J0yV7^V~vRngn*tx)&WV=b8IHQ(D$j_UW4 z+Z|BZ_Pk#?9WR_~d|_~#BLdAXX2LxOp-oO~0!4?(!$J+0|Eg3C3~~!xtM|T!TF@V2 z!yS6&XM$R<{aJKm9uPf`H`=8CD8(qSKNAdnyPBf@FpM?0t<Ea7JjU?*5`Nq30~F1V zsD6QR|FMvB6vELe&F;~w$*W0>R(W795x|*4Zb=l{jCGf1@Z`-_AO2FaAt~<2Vj}57 z0z^H8p0)KUWJM^Rod-I{+r|1H={3J53JW+R`7G>$#T=>bJ#}n=hy$?H01!zQty8c+ zvIzs&5&U{3GmLU)rQ?wReMYr0bf5i`*xHpeeq(_6j{`<tn&WiSBN^`X+n$th=&FAm z9zM|*E`h^rbhavMQzm0|3jpTqAixl}m#A8|&ec6P(rZza_h;ki;)VZLauo*#_usHs z7lMFu{Q310t{M=u?q3y3;oK4t;UEUHDxKk?wrEL|T<-IUm{N!At^}ul@mU%wS95l7 zNOIcadoqmm_FiMoEATF-EqPOJ_m;cWpFAMpjrp(U?>kN4qoX5&3mm#X_a1;~l7VSr z=7vc!EKxvb!%#0g9%S?Dib<i5UNf=xY6JX7xsVBISI+rI;Vh<Awr+E=yRq4S`H2lU z1!}g#&$W;pewi5Q3+#r5x0Un_I_(FDB(e^b=cfkNE@3Qdzdb5<jw%suFEV3*muyx= z6?E~ndty&{zd{KtSolsEP}|x{``2f`B&SZ?y&ebPBJe#oe22TyGMtJa?JGM?RP!fa zhOU{4nMpqdc<n$B{3^(|%RBk;Eu+J^*5R{Br0Qp2^56K#+y5U5dbmCYpQg-q3+-jr z-lR-+CrQ&J=&W78{pRffGzi+as*X=kmvN<Yjtib?@<3W>dt&Ks8Yd7yPF2U;jj&Jb zzest}H@Z7rx;oxx5txeDUDaIO-ppBF8V1{=7dz6SD-A?|);=M>a+R%G)TCH=gF}Dy zMQ%1Pu=5=bY*T2+AA2pLG4R;JrZLvK^SkMzN9;Jv@29JIljYs5S3-tovrty#6locL zWF2$gpr!zV6Q%X18zqjMToHV#j&s>3gs!J)0g?|BNeKx~sTH0WQHn3@*W~qCk(AJT zMA`J>VzU)r+sy?9hwN;&!#~X5&oSl)xzy@GpRVmahjExrs#ym4CLl%N-emzdH%~JI zJ^eIzR8Hb0m-3E7vSQ}6@~=7;$Pgeuz5K~501xcyv)&J&d5xZ*nQ}q2#9Z3HF!S@L z0erNIQo-l+&9T0-qtHgAZ`b5WkzG6bok)B)@AX0Ng(sOde9q<#yvfQ=8c&!afuT_N z_$r<#L4f>x)V>uq_{!(Y)P)Un?-bs6o&_;6?|UYCIPpMY9=q`C+v2?Y=yA#{*lWR3 zZhyyke!#E9Kq8>;Jv*ob&>AQx<PS40`l!u1q^Z&yx=Wz366sh~tVQ%?oCPtMHz*5B zavEf409zu=1Ij7IRjyPbHl{dAGGXz!!)*@RZKwC3Zz*s8Qg9v0QMi*14BUA#fe&K# zR>KN3_S>)Tmt8@p)w719wQcQ~XmMpM|KG{9$c#PJd6gmz-UZ~HK6e3=XaPz0SgE@T zj)f%7QF$d9pOu0Toq<26yPFCHqvUJFE8Si&3m~fve*fLMcO$)gbv8>A@3H#Hpl49V zdcR#qdE<95Wk`FI$CcMcpiHQ6hYq^~tjN;p%`sa09w8wdr7$gQQp&O)?MN&Db_exm z>*1nMSLSxc+he)_W1sK&qHozyf}{*blV>wBGc!Sc>qY60O+8*ulU#AM-X+|A;J9vo zE?0?{7_gtD%nVovvKn5tGxyE8HIXo}mixujz2V(vH;P}6tW`Gikulho#N)zg18~Pw zm6m}UQJj_LcS9xNPuK)qb@mUocLBkh+5Pi<`|~5|t^%c6s=l=?-}20z7&*iXPcYtq z?G(?})F!=n#*|X*YGK<KU2)Cl*#1?H$kuETQ4x_69+%2qno(7aIJdizhN%f|kCx-q zN3`1+5VzmmIt7Bwt@{|pUek8Q?;&6elp~qFuzNYaYtxvHs>im3B<M1Z5|nFLaFd_s z(TZHh2Q`1AgkR!$z7;*}62{Je8gtRAOHePcTdt1u{y&J|$gmy28L9{HdP<6^$Z}^l z03i&&f6+5<5~VWD$s_O9H+G^mNqUgqf4!5NvQbo6xbPvE6;owa<c7iGd1TRh6TrGN zjQ0o<d^2zcZ3QfL47<1yF40I7k-+g9Tyv?@X((U11T6jrX7k`qDuxjLnez+RBFsV_ z=bAc<YIBmYjx#=Dbl&~_OBECBgTCZcW=f9xGS}vcVTI=x<^5eo_&guw_^AK)(HtXv z9^{AueD${A^ROmC)@@Qy*n6n{Gd;Pz-o5Q<a1Di(lvvTes@ho;mgY1yT*2UMu`_S6 zutreHb@Hp4*jZn6)lQaW{G(Cyf89k40p!$DN_+Y2)24zNhC8my;iF7>oyXUl(0Lw0 zTfo%7^*7Nq3Rf4(e7U9ojQnY~>+ci3#e(!3ob&i?xx2G=O8LQF7k$lIp)5`}K}nD# z<)*A|iD{q-nJQ_(@8PB?m(rrtI0md0Ql#kt`K@<2*SUB-DF9C`i6I0d?-A3fd&0xf z6K2T&Qsm)PDAsH<qPyA0$2BS(FyN4Nu%BV^vUiaHIL@X0JIC?By)}y*o0fPr#k60( zL+<$gdlZ}7&h;a<z>@ATU`hSbs($5qSGbzK!_Ziq%Wy?Muvmyq4zbqe1I*qBo<+%h zD!dBJ@25!jpo>KCXe)Kt&bmX2OE;Uv??4;*eyRms+EBO|Oz3{%19D2^>DEaN60pFn znFX?&<)z`i+93Em)N>yZ9_SB<>Zbw2Atmiz=l|5KS%Cs<(CkR5+CYs@|A(=+j;eC+ z{zY{oA)V6Qf^;|1Qi26acQ-5=k!}R(loV7#x~0227c9CK&7wJ9-@VTn=ic$#@4f$s z!@&R?gJ(W-e)1sw4+zo*%%!v;RLQ4uZ-4<JNzZc@yyiU()yDpcS_7x(tyGrVRS^(2 zodY52D|HELYQIw@+z)z7lfVnn%+DDqzQ>|tFxmI!e3SUjirP=d+5gp_Lb#ba^AAZS z8SR$Ufb;a)`l?_HgTz~1nEc;R&;RT1AeaxlgSdzC0F6-p<%9Hi!P^z8u~5`uW^zVG zMuD487y-fB9gTNa)}XkQ|6sIjy7&#-yz_9APP@Gqf~H46I$*CYC_%vZDl%Kiy*F;F zU~CaF(=MKVulNOx%J+VRn%X6*1|z^@0*9|FvCbI;@f;4NOYlEsXiZE=u)Rga#MEmK zJTkT&+?o8tSJl=g+#bha?C(_!Vd}kl9nVFUHM-@syAPTBUfQ(cCK=7owz<Yv4nXC0 zJBl;5dDA4_h3F2CmE%@#KvDsEt8{L#X33J*e6VCxj53ALP?q3$TV|+|@(NDk&a8Sf zByn{Z5UN<CIl|A}-oi-VlKuPYd|voMJPJskAd5PFwTy2P*#1S9H<J8EmS<|*Y?sOQ zM^ZBD=!}C=KRVG*t~X&A66HH&8DN5a=771WfiFNc04cZ--p-9013s<nXCSvH&N12e z;)uJy;Jwz%gKOc!sG~|}s&iwiXhU{JXR8Pd7~U7FGDV)S1qUoifxd&Rn7S2;u58*w z&biV~_Zi%PmFeS6!xl*eY@D^<NjBJ`&ZHp}0tlX%W|J{{8Z(Yvqam@0liRX!)Rfie z5MEP-6}SC4WYHptvx#`ns;dRDB++&oQ(~@L^y4f$8I~L_P)Wh(ZOEFrt#RJuIB$S1 zCLQ+^G3h`S&)k;%QJt(n*GQGmoiM~|(Euz7c7@9=+P=QNVrE^D+a*eu=@%4zqYBi< zNqY5`3grN&s|E-S9c{r^Cf|0(Aq@cTgkV#eS=4U`Ar=fJQ_Ti}6i`5#xR&$PTov1T zf3&g~E28*&N#roE+$A><L_?OiYQ`5P9@qjL;fHZ|v~<Ni7~nj}H6?#jIskC}j~?bG z4KN^mdGaeDtYkLLzLB7@XJLV9s#^5}dF?#M+n2HS<Wu%#(EB_8NITe{hqNu{xhN>* zL#pNkit5vr&jPu0ZiMi$eB&_{c6@*}`d3fwbNK96<=U)w>3)LD)wSq4tkk{TcEi0p z9Ur!x8W09HS32wQk|;{w8QQ6@#@7b4;~+<1so;i-|Lff!4S$m-qLMKp>5nVB^g7L^ zn23m|PM00KtO+qYK2;ZF2U)y?{&4~XimCqFP6Pg(Eb~9Pm%Nq_^&%2Gf#_o(u};@9 zp8xPT!?A}pWKJRg1$q3eMEZ}VF3hicD0wgeWCpahuhkJ8g;0ANfOq}dJ}37JUyX<- z0;M@^i5%KrcoK&=bQ`q8uI-Hev+}W>`55uh9aL??-4?6f)rVXhY&7??7^Fzq&6LsB zLT+Koeiip_P<xduZr-n>HLAP#<N~Mc<eo#?c9e<@WTNQr-o2X#1JxP=y%wD|xhb&b zDS7ctKkG4BU`V=$TgEG2pZ3z7N;g*R*8hjxwc675^)L5-6<6}aNHHxIE|9rA2NSr# z`Vd0c)n>=H_dG{C*|{Zbx`uZsh>4GkmkJ+AnB>P`eXQYP4K4F51qcxds4|{X_3*`X zDpSnlZ+E^*Zbv?gMBIk9e#8kFi#gf_fdKvCx0suti!}zzMJNtSGOV66r8^?xn3l-~ zvAWVt5mkEE*$&^7?hgGmIz%#cytzVh;r=^>0(0gYZ~<JHICqSPyuYJx6SxJZwJ)^W z`vN!M;i4o-JO~${cAe001ND&eU?}c`*@Narha8=CyJzkO+#xf<o9VW^=3tKDx*;`h z<wOLe?OC{I@LRt%P(NGkp^vEqJX=hN7^qMD(;{e_ZeR8g31tQprI90E3GY|FvTgl@ zoQ^U$V6m}QyZ1}kcA>UZII16bnzTVBB&Iq)$ZM+Xj3Dmzaeec?>S^`HU>fq}_r>^k zHE(kr!14qFMzG<Kil_d_`lvTRli-Sl^lV{QhfvJ_iMq$neyR9}PDg=n_+stm*6TQC z%aa{)xiTxghQ%S>7|U}<UvyeD$kgHD@Y+@oMw05DUb@V`^0@he@`qOW!p3lx{e@<c zM6Q6H>f)<Fz~xYS3x^iY8BG9VsB-OzYarCPQla-Sy3HadOVHl#wZ)<7Vxsr<6K%dQ zM`fX9h>qsi+|z}mM36e9?u3%^x9E24@BEcR^?=hXws^82a}c}nC){X74t6p*IUQLE zi-TozyG&pSGG6dn#`Q+ErF0aPO!JuZSXK`=d(9>fH<y8vjVE)ePT8F88Jp`lck3p+ zww)D3wg4>f9njj?ekwS=zgxU@L`2_S&B+n3ezgPpfv0+u+42f8W<>_-p2?rxQXH{| zaU}NNT%=JlfBarUDU}a6yT$XG8@<#&wAeKbro?+HeBc|(T&23wdr#(dA?$X1+pmAu z*g4o{fiD5<5dj%d(iQ-!IKMECDX=l=gf|1*SJ@uZtiV~w!6FjtZnZ>?_Q}SSSBP(` z4C8;S5%39Xx%bsJhRjrwGyFH1w&Gsrm~JRt@Fp$ePp$;i-iKco@0Z)pdkeEVAp{#O z1r#;W#-O6M439W{lj_t%v8(`T7kR`W@{B@D^mM^_c>YyxRz-N-34Us%c5cZppyJsZ zs0f*2rP$T=<=v@Y=AU4tB@8tCza0|@+!3O$XsZ9Fjjl%i+cR;9&JXN|teI;e$csWF zHvMTKu{O>5frBwYRMp&xXK_kNWE19%l7-PaAa_psmmBUE6KrZ@5WHnn?maW)@dc;u zFhpUdOW6A2=x|g`i5#Z6e&za!?s4!)V5bkSEr<kp&R20oEUhm@><lFy0!{Wf0+Lj& zTsJ4}F|9&FmM8h8^w?)sqFOj{!ao9Z=59b>8u;%1@cEn6UY9QO*STB|9H!^<;l0K5 z3VIuEjTvU;D6r3NU8IGmQF$TMcdw=uy-g3-h5^DbecsEQMN>89&-oSvZZS~_nhlUN zfSXBRNN@%W;ME~+26&+p*!5-r2i;mEe$?@*b?6&ccF|=ZLA3e>&-#cAP8GNgI_n_^ zc*Fjm%vPuMygD;IHd4s+vBmB#2;S=GP;|6_+A0B%M@TMqVIItB&!y+NE!S{=cVASc zanX1(1QDg8rd(U@Uh9>dnbwbS#VYTv3tnxjrR)O%YoEHHL~sn0vd#zdpeylF{WVpm zd{ljFQ)0X==tL|BB2VOV0yQCy3nvr;v9Cl6*dkj7)3{Ms#l}cFOYW;!UN=YGI`Our z#3Yip+jwq$tcA6dqxC$`V%_U^d50sbL1!jcYo?Xvhg>dD#0mCL@%?54wuq$q<xeM+ zxxGiiUqC6>jJA1(Eh?4!%eHZA@JW9#2@9@n{;S;PKR89{#}C7qO)%3DhloO?Qr(6j zP_sI&*6kh>P1>GOYP^!x-c)i>et|5<vLe62J0$e%LXZ?M)!;7x?ltk*{n^V&_sp8^ z?@(*~HtAQ-(Gjmf3t=<M3UvHg&4ShK)mcRM0;u{tKkBANJ{es3D7#k)SqY;5VGnJV zrWcCHCH3B$Dcx&DrT%u-J2de5Z#Vl4#a|Z}f8t*bK>Ukcu0!HAxMANlKg(#DN_+#e zpB|)UPIphIblUQNGRYEIEII3^kBI#eA3&h<A1$l)DH3;?wcVy##)47mTX-v}^J0L9 z8M99;dg+tFrkSuOq8RM1IPI<c%dJ8eH_288NvkEg4e!6h-U3Vb3(@IkV@gvjI<VCA za+b#tpNfm)IOVPO-Ee;Y9_l;u`KCNkm18Nu$;sIoH0;kN03S$Oo)MCkajR~a>Qqjw z4SKozX))dFbjxrMBW+%#X1*1~C)`PTO+Tc5bLJ8vh5nV{bO~8j3K<#Ml5WRbru?hX z*HAi|Y{dk+9KQUSm#rm!8s$dsq#m)O{YBRV!S~z>d;m>v80cS2sxgeWF?w!xV+&uf zL^M^{JNAp)H;z5GLu#g1z$y&wLGxT+pSHaGMI>G7xOg@_5+$gs-W^Sq%j}7OWcHKW z*GHE$+`WhEl?BPikfr75o$XA1n_i7cZG3o(Dmt8C@C$OFcanlK-Jkl#`l8_Z<3QC9 zpu+4cNi+6TiJp1AOdiWXa9Nqy>mnz{=5jTSij@5ke;G60`DjW<y%nohj|d;iN#VWx zpFcP;{`G?JTzr4l7D?|YF8{LOknYQGXc(24JI$muftMVJTj}u<K~EOKwe^FEKlS6( ziZ#n&Ykt?VHm1By)_mFIg5Q-H1#v&<YW69Dpmjy97#kT|NOtcprBojn4u5x)AX>Yj zoUhRoi_d*Uu(!yfTg;&AN9o7u)9(5@S03x6N$mXbGp$2GpX2S#)9x%k<QqMSxE7?A zi?;fS>izwR+R^omjXfGt`?<yxpoLJ<_ZE&4uvthq(pR(UKGnZ|!7bgOGJAaUVd&xA z(t@94pP!FSeKTD)8p~hdAOEKhQio_JH3zH#lE)*mp148f4@nv#$}Pzry$_A`3+jj% z^`+6<$T22d%&@;^K)J-7M<o|1??<saQi`VJl$cqlS`G+Z6jaVs=9r4p;!Imp!rZW1 zELn+G_|e1)Wt+}eeWPxaKFYB}q8qNO2wOyDaLb#M=v5tzNuRiJ!xA0(X$&`wzoJ<R zSNzd|QAg}Mk4o90lOErpNSQ(}??T$iRQ_${Tq*L0;V|P9dM8>q+04Ux&)q3OQk0^1 z?{wl5I{o1FyBs?cMZA#wMdO|zkTq=h++I>f3$%b@V^N7EkLW@GuA{Q^A+8`7N&A-= z0WA$p#V4r<Q7_oG2UxC>h1~s*X8p_tlGSqMqxcGDX0%d8&Um}A+F;qz>LSjuUerF7 zA-o7p@EOv%3NfeG(&lrOrId8=a$^Nn9-cm2dIm|7oI~51MK#@eF*??bo2&DE8JaaP z8C9bfe}3fh25>P6FP!E2uw6GD*G21@)<~8CyR0Fu43i4@-anQ*8i>RsZ?6%m(sK{s zi}m6=*pQ7v^(>>f<Jj!pwpQFA4eyRnjfre&q>7>5_$?Oiin>J5oI8GTMDXo-P`J?x z?kh;+dENLY@{&!^Eyg2Fm!f6MiBC<vsbJ<t5Hud)RW_aM!)_<uB)gJkXQe9cdFs-4 zwl^D)$f+;CRe!sYW>4-^EhIg5d*ckX{-KfEb$UA9-q{KHuq2HmewytuG!}uRIEREP z(QAF}YvLOI0X<X=3H7}2Y<K#@+c!jiKTpp?9xVMb3!2G-Ja5qR3~gJtlGkh(7<D<8 zrMg;4@cH7-ZrlwK$Z?2D<^N{R3B@w#iuU<DReE-RPlnb8NLIngqBL(A>}(f0?#~i; zTd%HGV_GynP8}Ds6`A&LEEEX|1lb>CHl22nAB+`5rD<Lm)WX91i=GiAN#he~4+~aZ z-c(qg%0l%v#4mFf<LqgU-4Cc<?>82o-a;hD1oizmS$&P)oFg`B^9Ypq41VJ_x8LDO z`gt<_`~Z~#*)&ytPYHq=Tzv+hW`kYP<ejopEM&Z%Vw2w?co6Q|xMQx~H;)$GBrh*2 zRG?ob@|5W78+1Rsm`VDbrIBf*6425GbPF$R59$ZS?qejU?gz{nU}{eg<M|-lwXKDC z99)?6g=>+u(eg1KT?6{bT%SepO9ifGj&iXKJ-be|gGaFGGYcJ8_11=&rtw6GWTaFw zx$aEiuNx-^*42N$-yF~I7GqRS#Es{LuUOl*)h1n>811CZr9XP}-v%0?zca~0M)d2< zg}v&BoOE>IPu~_9HCsomLO~m@=3n}uGbaw}4Q|-lB%inBBX1eW1#QsMEj*r{c)rth zP1r_fH;WCFTuYlZrhaZ^)YIVIZX22A(bNGXlR<@tMC@9jL*KRgy>XhIX5$FGWEUQ5 z6{5w*S!d|S4@tJ593=IsH(Wxl{O)z-cc<+61e+k6GtLW#6`GysuWN>oH-ht&R0zB5 zvHKHC^DZ(Pcy6!VueErJL!41}POSAUd?mFTtdJ>1T)1)>`St&8W`qC!vgC7`1|Rj5 zNiKKXAc9MhvXn`Mg%fJS6S~`Q)#C+c&?!A_T0#AoMB+#}THN#UC6ZexB?cvoYF}%f zvtE?S*@ml&MIx*djoOOI{`q;<{3U*bSm;ERE2L3eP)W~kue0gKE{)x0v-df^^|irC zU%ByToagNFXf7Z2yhodiOmq<}Rordn*K$do$;uSbty3%U8AoMa>ob>e)-i5WE=A0_ zGkX*bOt3Yf->(PUWDO;l@Qn<;y~TV$Gr7vg{pZ7CCz$bS*W;h*6_PsyKfe9>K4^sR zaZkA5;un?F{jqh!aSZ_x5y{dM#`~?60K6)|WLa7T@VQUxLdcpNSJ^CP$_g|1Z8hnA z9k!u<*{jN`DFXX!p4<7v8MtX3+a%A{ZDdz~iIqo~E~PBJ=TXc<q$^T7{?HbhUnp_( z3fSX=f;9qmf-943sIrDG*5te!9^;=UL3fGp)2A)AId#sPV}~p4>D0}@PSVv8MC&WN zm6ykmdD3a~+1wGEMuhW2^+ajr^qP&V;Z4~mYjj-`xj(mEPc{##<yqZk=4Qj>RVJj| zE2=i$wp33%Wu$DjHlPzr@~vw6#Z$;0+s2!zaWjIT+??c(acT<zO<iI*ut@F+S;H?) zH^=hcJ{LWV$<z|wp`s#Cdl8M6qplBX2)m0+cbMbVW|p5y;pQpq@M<^yrrzgZu4+71 zW#nua9u5wiQg5B!Qr91)Ie)(Zai2aqe9OlsD?t|M`?C^12!m))dD<oHtG9PrCaFDj z-eTHckRGgai(z>}JBQi)iRRm;f`t*<c1uKwxSC}wr*y}&*R`?boI0mCj0}5)$LoEg zrb&Wa<o*RdmsqzKt1ir_ee}AbulDDNM~Ww{Ev~EgE6ovl;gR9lJN(5b*KMf_s)Aum zs-9_y$MRGk0t3<KVV%kYW*Okm<SP7H49;lOv^<-fL(?Sw?CbfOTpusQ__B2SjomN$ zs)M?kX9Th2jv@X*r{`%0VZt)2a>SFS_}>pUq(@cme)?I8-+dva&~WEo)!O~^p3m<N zdUI#Q`R4ok1gq&IJR?c>0~z&W*I?|agoRQ+`(mx4ziuzuT~f~{1v%_@#;>VCYGw@o z_h~X%iLB&AKEcCykCP`OUI*SZX6CZQ#<8Dh?OV<yo-I3vplOg~{Ma10j3N_g{1Q&Y zY1Y%`esI70L)e8ozF0YdL&@)sJ7&qxKD@U*OLIXf2l|ouVnYe9ApU61b=SgtL2W#Y zj565zsGuBgSVCd`g6y@%|Gba=GuoU)|Ey)Y4`=O>^r)V`&0&DLSA47MWwiU^Cm?OU zGJjAT-$MUvow(k7*sfV=^=b3y8H$L*1Iln8*|FzA=o%|++&9+{qT<%;58*^?@T8Di zfh@J#wI3OQp994)N0D<bMK8rG&8Io4^KJzbpH3D#E5PUqx(cv%Z=yS`K?LVT6cv<r zbG=D~IZo|RwLJz^^%!|ph=(Vx0WTyCiW^NWIrM0gAhU(p{b!c0O+xYO)!jT2NY;`9 z`P9!|j*$HBum8G$eWZ)Ue)J29__8e&hM5QESGgfs$2+mZe0s$eT*1p}$^b1<y&Fx1 zjc<(gYX;cmz-!QR1q;BE=*828?Q3|?pm83>aXKc?OU!e6@U$_f?Jz>AR@!ysJLa87 zJEJwMlyz&=ow!g4MTHG;MfZdnxc1y@ZQY(7wKI7pvvq^b%}6eL-kB4;&5Ra3v{31C zJ9;T{ZJl@FLKln*-p@Cxd`6CNvocnz8+?-Iaf&c<4)gY=G?HU_6~Djz`At2`H~1Tk zfK4r`qtj|vl+lZE_fDdBBd^r4oSpQ%kL0edb}c8qY0wusvx*F!Z;yvG=te<cRNiF- zz?t<~1mYVCZ>+FI7sbr-yJK7lA^CjJavv>mbLba5vrs%a>C5n@!)0%#l{U3rDSbvv z(zNgX!mdd9G9*%V=}}9<`2kcNP$cVW4eGu4d@ftK<GQXLp?KK6PwHfXF^xX8c{5{6 z#=2~ce11F(5fyMTTdcH<zx=$$7f(%71BF91NCa?QTP`=O=NdgK>H@aGZ^t+A^(LyU zA+=F9%c6ZogSE9n<57^cp3lCzj?%?MZ3n;;-75K(DDkzY-TI-$|IPxqTu<6+IB4b{ zKB2tHokqf`gm_~R-`Qr`cjHPq5(ME@dsf9LV*kYz%0e?6zHC<qlqI~$;UN6$!)1DX z@5D{5fYVw<aPs^77ewQD(@c1vD4d<C6i4u=6*g5g9^gCt5N$f1xy3GXGu*po{(N8b zc+sw3sQW=D6T0~$gh45HOQ$Y@poaVLno=M&W0T3{@p=Igm-q9VB%y5<c4wChAdyPs z;hzRQ(DOI-A6Ch{SArfhF*ON&;m}Q8^1JsN5^;}OuJ5!)neJsPRdEq9X`d>H^6R!_ z)*$-(Uh>DJ`&g5sO<Uv}+&l6xFNh^wFnwz$B>bgK5!ZW>6Ov~cu0k@_%1&0YhK-2b zTUqsDoqT*-D3t<zCh2|+cY$?H2$nxl;F4e+2G^2(_{0zG08a;IBNsm(&l$8kzgs;= z4RDALc(pAyyt1>f^66J~*{^z+GE|l;FLtoD9Q>?3i_}Q57kGLoA!v8KM{kPWr%-wQ z5M5u7k}9mbwnf<W>Ux!zo3DLaDR_0D%-Q^c?cD{Gp=bEMP4<1AQ`IZM*Dtom@+}TW z9^NSN3*|V#j$}RU2Hd;6L!8kNi+(t|OW$ZA@0SKBL%M~}Ujl9+DfglJIk#yDmQSLa zQ+J>NBU1qv7TFlIkvjFN*PL%RNm#8|$Nc-dpI?cY8eubXtnW(Lu_z{{RU|X6kZ*ZT z-sNIwXw_q``phhUy^XSmvBg`0Ec-xJ`{78E7hCe;?jz%xap2e`t3N8(O$lud$%HvO zLgpTPzF7V$L%U70&t4q<KizEq=a7q)!F!ogb`aJdO@4TMgjgkd`gY~u_sJN1v0-~= zG}pYTPb%GZsS%mKagV1$a`ne!s)x*V4RHOF4ZL%{WynE=5+UT|nO>t16!Vn9cDB*q zk6IBrsOGqOdcyfl+0f%;OrEI`ZVvnYVh62*r@Wqr;D`E=bG6fDi*L(xUS^TrzhBaX z{(GTPZa0}cY>vk?==~_Bv?v%F?>1;AVg9PnY7S>nY=Ls)FYn!&_lYxPZl``zNO;gt z)466x3{x3~%pA=Sa&jNe)(<S^uKmWA#+H?b4j|sy@VwxVr$CiQyMZ|m+lqR_g>8K4 z<ZdIUWN-9PO@oAsJ0c!>(A4!wM=VAYP}}6ts~L4*r!_qBc1zz1C889@O)++v=OS*o z=wNc|tx(uHUl_upTr&tA;10LDwn>|)G&YoJyhyG-ghB{WdXKMmOPQgI;smNS??=h` zEG*y;`noM2F-(F-7Y_|}Wd+Z?%i#p+vB+tOPMzj+@$OH^7(8DQ&Tu^pt=ioANK!tl z2}Pz*H&e~!pIsnt1b@8lG&e@VO{7IF{Q@0AahLw*{%iO)$?fP?xZ<?nv!4N3;&r=e zbv)gfY(G#dT&#C3{9tFf+5vJgQ+@Ad6}~vc3!!4~9Vnb8FbHZ~_}yQBv}-zh+m|Id z7nm;MI_4rRN3351#$_11`I@Smea*c4cX-+%I{Ovkz&eva6gwk+RGReDX0dVixr+SE zcHrxExMgXJ#B7T4=K3$w{xLAX4rcOS{W3N%-5N0jM-GAUbI7cKt=$oQ^-Ot=7hX{3 zCO_;wa7s`Qlt(}%m}i19Ne6VHzQlt53tX0CCaBi2Q3p*m8AqrQ^A*F<%XU^t!u;LQ zKAFB3D_-W<3*e1l+G4%Lgg)P${A8hA3LK`+TvXv{EPHscWCz>klc9MtUvMO<s9-jo zO^NzGaw^1S+q#O_C0gvD-R}Gf_F@$MSAq98C&NZ3V#>NVXzy}lAFryx8i)cO{O=_% zmK1IIr^Q<|i6<t}U`%<>{tWuo*NImd-+*?1JoV5)O@{9IvTXMvr^J2V1m^0Xyj;YS zul-~KTp90is6|vt)zSy<)#tasd<y$5o`U9`uJkh?%R3yK`uz5O^07faBuj6>Kbz<F zbX?_XC&IFtEt?}x{n4q1QML@sX5xaU9?{&ez4bYlFZ({0@PJKJd?s^8-^md@hij*@ zY1hqas_`+TXg#{sp0Q;*_+Shr>19YXf|Q3<gee65-NX|mHVyZwfmuG+oy|DAuHwx% z`AZ<6c4pLg;@Xi~V~UeTHeU3gK1wi#Ki}1Qdc3xrv!JLLw|lyD-oR;{={XDCFm>pv z`tjK(?AGeax-&B?*RzB!69~_f9EbbnfI%$xwzlID<<bkg4!*5k!v&4D8tJ_tVxPR@ zOz}*IK8fEMW#mo@HjqL?W~qNB|Gxre4!B_a;DqnhKP;7MZF?Pzh));s2ruh?z_4VH z#{!|Vo2ccUEPB<w7xkEFvm;FQeZ33o?a}o?VA>%ny+_JK#O)J9k9G@G=)m>iSESZF z<Vb1ab#x*&Ua$+j{du@ZB5B~j0r{w<Tk)3CnRoJ8nxGT&=9;)*9R-=V&%e(eC-%Q) z&%FA6{528464`)nv{{MkYf4Ctt!ndpBB8FsfH2F8Fl%Pt^RQRuhJ-c_RoA<k(l<pJ z%Zo~}o5@34#>nLKxRuG87Mt!;PXfXYvrT)4Z6v#=Ri00x!SIYO!ibO(qi%P`dGuAp zNw`0ju*6#yw!~W7&;+vTXu^)UD%oxp2~h<X?RH9f4_H!NhWVyck`}Iy9C1S=+<V4Q zCi(}hKqTIc`+f@?1clgssE5~+V_H6t)XDBI7UO6<q-#rBr2{UR^@eCBp+|-;_(+B% z<ilBhzCXsR-ol!?i1oe0q(}lgy1U7LZLam&zg+K2h}s_%WF7~sRfoxn!~)U&edPYI z<o$AVd;8Y+(q;kcb|IguVLs1OmQ_^CCu?$_9}{$q0{)fl6>rWR_!1)3mgCKIxNm6% z!U*zuyx?{7VHHGz8Z+n8)Z(5D)YC3CvjgKYgl+`d`G=r<V%0@22*g9HcdSQlVY7p# zYhKHaP;=F3EteP~?G|6kThK7h!@mmh$F^b}4Ie!A=udp+%MDk0AJ*2RPy>?=$aLv> zO5+)Dh*hq%+~u$_97`)x_uZMd+XaZgHJ?9!j{eD&W}!gka%Lfn82KE&C}TU%WXvG9 zxaew|<KXG2un#sKVeC@wiqJN#??9}>XCQT4WmtN^G*n28dh_AaG#9*$-Dz)zyBUS} zu!XX}w&DaIv~y2thi%7w&;9$QD&>jydw%RkY_>#y-mcUqM)aibL`td$9ExEIYU2n3 z#P}%E@$56*{wv1E8Z*Q0W}k+tCGW)o1d#@FL3Z|akYddgXtNk2&bn0m?Xg!F$PC2a zU!S}a;MeukhuJmR^|o^dVG!qN!O=cse>@20_qbS<pSH`me5FA3OLT6@?fTioaq*K% z_fbhckFj~U=ETRxU-wf;c7Op)YC8@i&g$MbVEfyo?N_fDg$r>XRVN6mTDcSorX?eK zi}0ncZ%kc}y<D2qt$V4jFX%DD82J4tD@;DpJM~y$vk+$~%P13J&|hUS8VR@XVp~Zi zJ=!B_mhQJ}c|AeJbE@=IlP|I1L8(F8dBcqu1uu7!&igF*W^^w=9&;Rgv-q7i*spAM zlDe2>SGqmVT}5a<5~g#CWl?{=soPX|$)_(PUXO4S=vj0hcU^dM@m|DjPe_#n5x1?m z4|yr_-_JS1hp2xrsqCH-@<RuLYoktOO?K!S0kqvnGSsI+elrX+dsz^^Gx`11df%IG zCPkXB83YpPa_Ll09q+JRp?9~H@rWjyg<5|gY+UuGCeKdKB88qM85r5inmpRyOcRCA zMj7{C9FV-Jm9fKw=3V!!v{$;Fp^LaaUFE;UzM)7C3<?_c;I{%R6EcgxD5t$v%?5=K zn>g~n&lIrFT#1{$73X~z+9q&BtpCI)Kv2Fs0?Qd~<GkHA-rLJ%SF_)?TZam?lHm@} z!n)DO-LxYH#glZ7oWJ3Pwae~Yi8Z&t-L>))MX{Z)Nn~qQvy~-o&abL<ojRDDTkw#F zn4ECWw}u?A%UF7TkTgx<rd=>nxpt!J?wzyvdR4lvNt^gY;&#k9!iXC>3|+bn;pg)n zdLn4exJ4nO%1Ju3c=L{jv$BQ*omtOB&`*xs(G|-<;QulG+5Q5lI{1yvxAkToKYek1 zPWer@!A<RoK1S?02u>;HJs4Z3eGjO2e(R}p6dWp}J%t#m6=PDx)oyhMm=r#WHpy`h zy>4B_fo=3bdAH|L#`}BMjh7?HmtYb&*OTV%9_Gfl@pAte9c!%tsF&+~00&wDODI`R zZpXYa0E2ZKB-$jIepdItbaAPq{cuG(%ro2QLEySG@tMlEHiC9ClW}2K-1}mj4?s4) z0*DS(!n?C+Z57bT61al;#09BDyMhUl@6%Iiy<eE6wm#Hd%H5j(z~?eQh9w{mXcsiH zBzkoRO~j#9&ZR1ssfVt<ZV<xrHmt=TfI6Ap$3X_6C_U3o)P;#Gh=uWJ5tl8NSNJ&& z@(v2+V3L>{;&iGKE|nXj63A(~(aP=s`f<l)K;nafp|;gpkA};3K9-4<ycnVuMV2QV zsSLTx{}IITZY6};qVEe1<*ygnT2*X+6D)be4;v{5(Oc*52R<8sTJy`35!aY5&AU&A zeCB<$bJZ|+MI8CiHic*kL#G|d0ypj@i`Pw89>I}ymaAr-2aER_Iy#Ne`hC#_Wh^qi z9dismX)rI<CDv={>FJB)A_`mp8vZ&otj*t~gV*@t_R4J)e)CeHzIG|-boWQyX>WH{ zf#PTEZarDUM~Gc$+S9kizwhlcUpSlJn;l0GhUKpeWAa}uOD|+h$ps5U<KFyPHx^Df z4>v=xeAxmN#e;jxVtsv3^S63-iPMLa+WW~ykoM<ORLzjCa0DLB8@$kU(a>!>aZbJW z+Mg6mL2De~{Rx+I-D*|aA9O_?bMwAYlOgQpFLNKocOEamsGB0rQqSF%9OmN>WVx}Z z>2@bbKBy9MTVM(Aqn3*~+iOpoR7<YKqYpU>E+^R;PiuI2QiT~7#;Ot!d@7hF$_4G+ z{kaZ$FsJRg7V{lnvHpMUB!{%wvWC>yvmQu#OO2P`TxOlTE4nRYGO?=X?alO8x87ss z>}cHC3D{i=-1&&HGAQRLJ4T&Y^L`Z$KR=k4A-_a9etL)Yx<oUoceV3kBd6QqEZnqS zu$7uBgY{oHGyvfk<Mj+dUzs6)1LI*v79CcM8xYiik#^A$(@xmZ(Xh&Zn)_2ZeLgr< zPoP7_hI*sSxT0Yq0E_!Lwl305?6?ue@YWkXcv?+a|070>Q#vxVV?K92q%MQrcX-st z0Zt>VR6c*?gbQo8xVCNBs)qh-*lp$HhQ-%SAX!d5@!}|VqrBi&5FfQ|+2TQ;eYfF; zJw=3Hngop|((U=}#^DW1!aHMlQr{6uO+RO)c2z2he!`s>3pRt`uvDMg-5m)g2j5nP zaa63M3dq4yK`vKMJh_04;%DN>l{O5{JU}Z6e+9mZe9%ynT(_w7q+<wd7j3lXbB<`u zyCtHko7!7orsRTCA;>BZL^QJ2ldpEi0xYMssK)c`>CV*8?_o7c>3%myqFAIn7b=YR zD_}&_)>5i;`Si@1*qaxIu-pJO@=3u>l^f~P*WYkgVY`GIn~J93E-`~+F8B}Eh%P!Q zr@f|oRiEi$CggvSmRcLu20T0BlHJ3FibXHK{`Kc%h}K0Lu*2u9$66(G?guc;CiVnE zctbh>WelhQHC@0=`023Hb~<aWFI2Z>G~ePUY0lB73t6-+fuvw)2+`N(z6D3gk6r%y zu(tiVMO9G<{1pAH0$G{R4f0C<v&YFDUq)8GfxM#>CB-lh4?HJgdmHzQwM*F9ER6%k zN@4X6vyAreFL&!yqE9uuDfD`>D~CN|E^_m2l|E;W-`{TH)!$UNy}rzGcz-hOcy*m7 zLo10(i*66Fl3{G>^$7)tKdNX=;hZZ+_C;+*fwGOJ=J7_RUW{wu4*yUtKxoGRqa^B~ z*LTz*n~K=f@9K;~-da%*ajsdJd-Q87M=rt=H9i)HTH?8f+I5+o*EHo9W_FyYwV}!n zHCLf+G2(YD8Sk3NeC`)x7H$#Og#F96+V}oV;-cvEwU*;uF4N+Wu>!0#i-F`Lru#YT z4;s54?D#0{n46D1!&ATV<R!3(nVq`NRXWB)kF})<pG4l@ta5sSaL?N*9KNE~X{j2x zF6JcyY3MS*`Bl7TzVcDj=l8DwvW2B2W~U$qJhPvgGtZx$ZB1qrzb@)n42JT`>P_I~ zI3P-zYLS9UkDZO{ytwQGcPDdk9?wEL(3sGP4Ra0&R0ub$mGaQym+Y;4kaT;d$we3= z7#JwBvwTz4Kr4|WS`Tbo<G;{EQg}U4Xe=5th#%$%EO&6gzpmCnMvsZi4nW0mBA&gy z-(Dwc&j>r3zkUpNYV?_ZayKNvo!3o3l#o@Nr5_;`w=}5xrN(ZFWb8_~PU|u}p-2eg zgu?AL*hl1jGMp=X>2f;r4;%VFa&qjCeqAHJOno&AC;Q049{3?LXP&{J+^~k#<*0XI zsKWLS&t76WFWdoic@fcgpYZr;s)x@bD9K@q<#8bzkGR2wQ5Io0{cC@O){VkSs$(PV zazpQI-+gqSV)Ruce3|ee6-p_^%$mWglL&R#KA!Td?|=qDp4Nv2(Acn1Jufg(W*s&> z<j-N<%OViA8B4fk0Ks&!CEw5!C?x@8e8cAKuUsxPZ$Lu7K*gq@aoPB(k&6;9a6L{5 zS!i99=QM4~x?C|?{{1kpq|uVd<sA8;Q22q~P9n%$Y2B8^fCfJ1e7Qg8x?osoInD%E zn;$K&v2v{vmgkNnM~KCLx(&l6divTVZf73<In?`vzv=K(sf=S8!%ziYkjBEI|C=Y6 zL>eS#5*N#UkDNFjF)S}NQ44xzOLoUl3$CqOm((RbUhaLQ6Z<iV{mAt<#+S6%*xw8f zE^Ed`pK9fB{gS*ic}m2pIl=0(8Z~{Q`#xqISWkXug!GeK1LaKZ?w+n%BufAaR>8*L zhn_EU)lC7tdtL!_==9qFm-%Yc8J=<ju$^&`Z0%|lHr8_gpnj+LEf0U7DQ*$~A1Lcu z^^8NY7*do7OWu`I#rtW-H8`@jhv2O4dR9AYk+!z7w!Hu+2AUxDZ|g?DqCYZ9c!q%b zaelS_^$(0E^$qX$hnXL^mlk+eRgIx-2^^6*@-@WS9l3>;D+m?B=Bfw#5u!?x>T~La zaUS)wqRCRShU~b5x;7!=;ytlElJ|ScsoXw^6>uK}R3=H#$^tEe#tnt-Y*$}4Lj;oD z9)dl7GOW6s7PNP)jQo&L_GPFlA$(-p*B3`W%j{kxN#c$L=($g<C-W4%#PDNTD2RxZ z{-|=$mc;nIXIS8|6beA>nHQI@JVqYBWYl(y-?ECf&cKWtq@3_nNhXubLd^?M&lZEJ zuI51xC{w+7>WF9NbUzNKx--$x(JgGFVg7ZA=Ie{@3>w>w^<in4ms7(m8d}ke?Cg<! z32X{ywQOgAG0W3pB9f7SVUIfxxg;lQQU155hR}Z@^do+d&#<T3%tvB8QaNz$6?)%L z?tX3$v4l4Jc;|KwTt92yJ&O%#nRup|7rM>hO?UKYf2KJBzwW!OnPThnprSbs{tJ{` z!v$@3PTQs0yB}VXJgY*#lvTZ<y5&x9?lK!#?wOpzr+(_HhG0|maD){8SH=eSuSZU8 zh%dB4gC80H!VNlN{1)pcjU5mAHB4nOWpAp7rx=&0khXgQYEKN~Ddsud=1~`Y4d@#u zf+*vrMw1fK&8H8KXMKNg?kerg-sl~<m1I%vsrd=xLK<iCzYXjQeMk}_?PR9k6M7hH z#2v0HFW?dP$+lsQR)MNo-z8E@!N>$FvP@>d7szl#hoVD3W+96!gS>nZTSjEQaru6d zTKg8uji=iVi}$ej{x_MBXqVG1JWp8IQl;k^8Gsvhw~o5KUNyKOlHvJ+P;Xw>gS&5a z-#3<911yhV6QW;NlpOj2ewQ7LMP5IsqUb$`YuicNP47(FashKr6*?kHiA#HQGb|ZV zWDk|_m2?ujFfeCIWQtd}<pGbg8UQB)aF#aJ^!hD2Lf1H)guVgD!oT^>Gu7Gq<$~-A zAfHD8T6$w-*K&&uS6t{U_i*hBaz0$91+0KGLCEIL-Sxqy+VFL{7z;Q`@@_7D7F$LV zE`U>~AYd2hB-cB9K)wo}$1#IBHe=#}&WAcDQ)AH%*)Kr<Ln2-!*@_?ZM-i+g$v%KM zR#coBesnrN7-MgT?*MI9=Q=X^T=Ad4hO=pA-p4s*<+CO*1IPB0KN6e5f@@Et$40P@ zcPSIEeusUIZsW=$hOD7@MbQexnmo}U$-C{1hdPAL!Osv!F~K0Qh))phBWIIPwzErb z9Am~Y%}tirwil;=10xRQ6``&R;NT>a?WWYqp8g}ivXpvY|E}WsVWNa{M+6JS8y3#R z1?H*C!_O`-zT1nrha$CX1X^w0?~Cw)9H)Mk*eTi8BC*$3VpH)&LPe<s4Ro&k7NQUv z<f;lQk5}~tK>6OnSOLGTkE(L2=q4of7$o&-K7CW7=yNS@w<n;Xb)0x}!r62;m&STb z#%+12$HbW>;hI_x@nR364)!`|NF(EKjw}Ecv1fXxIO3x<#P*rOvPh_yu6O$Ilw@gR zH5&9903-UAl&(c%Hf$Gt9Tr;jLdx(2T*~&*QjDhmC*-Z}1HTPKC=>-9t55Iy)a68z z0&(+^8lAYX0h(X*i7g8Tk;aS!nvFp_KT6I?U&42wOJJI_oBZ#Oy-wJl$6nn_Z5BNC zcyjp{C>x(Ib890G9?vzH+xIkFqIl9~e|H=;l6x#TEja{T@9N%PPJ3>Kt)vzG&}8Kg zjcdNr=yEf|E%QXe`y#g1c~C1`N?Ha#daVg>Cb!ISk!<Ncn_)%A`QcXB(|_6RrAnk} z3cb}+wAB?K<Zvlg+2xeX1X4uek+<v%joLQ6qquR4^s<}Aqb^JaTDTr?sRu%>;Y0DY z6Y>|bc}xOR#y*i{9$_=wbB;zygO@xt)}gA$ni2dS_y)w~t_`sixHr`tNB%~(ElJqq zJN}r~({kbsOzIg;*CVv}^!4I%XA6$W?VLu#o$zWUEK<BpB6<e>Bjv~e?m3(b+UMwr z8b*8G4f56CQQxn+?_OJ$xRH^iJ3D~J+}%PRXK7O58#!E`<BR~>Zy;>R2O+NFy>H<w z^w6K{r>>-Z!@k?j7-I@<M9v@B=YzeiG1^ZvygTP5kIC)Hclz-~yx3%?41;NiLf-Cz zv(o0&u8tXt?mxznu`jIDJglq9+s`AMWzu`vaUcai4wh#5pQqn_YlQX`_^%xy#(wxt zAOk@B%0iH7wj^O4GX(*t35SiATY;ouTe{BfZqaIk$EA=3M`rQUk#@Bufcl^%FGttZ zV(dJtsr;%ywY_tZ@5SS-?|Yd*tp<(`3e~K;ic9W1o7rE%kI)z7z%Wyrt1ypI5myk@ zAkj_ej#h=MMTo-m9HebMf&VC7t%rrrxC@hvzi;|-$OrC)fPXE_B(ti2yISjs@cpzi z)ik2*2bA=DHZw1IA)6?4S`Asuu|K4DP-dH6Bs`6@Breve`&EHLn8uQ>x1hm1V~ttv z&j5hOe-0kkMBx4FRoQwbC%8B<SAKigju>)I)uVtn9QgWDGPIyb+`2rCZ}BO$zu|iP z%N-ahGWZ)H2QL77?z92g=>Ibo0@3}~5Heqjw{%gdF?bZfZlG0U8bb0^8yNwkz1r=k zuk>Bf$TjcE0-F*&9o^O}o_Y$rjV9m|A$rmKD)ck>_&Ba}h@^NN6a$XAa|j1g5nV?) z`u7(IBhQm4i00aY&v3>>o~5yIO<3F6j=l<xo82(wV|+`g`&Mj2ZFHCYbKJ=iXX#?u zm8Wmm#tD2pM_Z9lEqhy(2OS62IC`@jYt{z7?5PoUT@#CS2i2w>07abw)DQ8h*nyB! zFH)&ZoP|js*zA@kq`>!ByZFf58CIcM1IKyw6Jw}Qo7a4Nq9{w0HAR|G{>Zx2H0S!6 z;PK|SD859|58wYyn))}*Sx5N?D=hh#UipwyzuDpG+r~#k;bGjO=^%(u5iF^P4R}5* zrPh1nzp+L!p0Jy^u~4cgW{WpKG&IM;UUCqWJ?SY=_?~Hg9+n+&yd>UWfqHP;TYQE@ zrS(MUP$y}Hyo>nR+qOO8Hmc82yVGQ2E>GA?mH*q1WWxQI@U~aqz(=MB8YJZP(t!yI zG)`Qw#?aq!=F@nTg%4W><hmDjX{#92<vYToN7<&UBkW>+2?+Eli<9D^wo*9a)6;w7 zmbzy#UzT<leDNmjOr+Q^RVrzj<d-QokTWthL~NbUyRK(5%6s!9Y3z|K3Je^@y5b?h zehe_`!Ind4<Ym3_*(4%iGVCtpb(^q&MJ8nB#*6&S`RKYClgi%KI8F&tJbDrNG7=`! zr06ypV~NW(8qdv)8q2$zOK*!<u|F_-8b?irsH7sfpdH`a8?Z<rLB9QzqF0FK3k0>u zftui4OXaitrOzO8a=tg)J{&xF0Ji+cfA;J0ED$z`)(J2yN1K;YR(qqlg;~!=On{&7 z55X|r`-HnSP6!DvNE)9+(5{iTy)P9Qd-ClTsc40V0E5T9?eeiU121r<+V+6&1U&uR zHvyAC%&Nj{3fMkJ?{4kb{FRz@fHaPd<=>OV6RTZto8UlMYiwqD)N1q}alWq{aWSj5 z_Sm+|DSH>0ge9ww>r3lD)XRp`J>LMae_vr%<%k;bp-3}-E8(4<s(;KhnNbBm%%ZtT z{z%JAbW6E;L)&N^)RPZC$>ekoJ^=j-9n%`Vp4a=34D2BxDwpjp{?B?8Pv8D95qUAc zS#3S7Hdkhdr0=zkMp-BaTV35+@|y2`t?)No>>mq+5yjfH?h#qS_@OL1IYvUdBVv;K zT4}Q1?+^V-Np|Rk$u&rJ7admbN6!Rr^utTqC`HAk0OB4qRXQ(a-*lN-Hyh#O9fVGl z)AdeA{`<Sqd@Ploz{=WRtc#ADwk~n@io8H9@Fh0ZyYTwzj57yYhafGAMnFS|ogGJ< z-v-y-^J(Iz^!JE1ksFB?g7uZ;2@&+%jb+-~BA1l0o8G9bcfK(aV8Qo2AVqywpybAk zj)YLl5GC0|!SPK!-(MugjYv*zQ^AKTbt)6)O8RCg++Q2?X*b{~bGsahd#<tU!%8~o z@bFenrLMiUVV=Y(XQPAe2>4pswMih$Lf$M<rRm8NfCyBun|C!{9v??}qG){1k+V22 zb>3c$kvKcqmHq#9m~U2MxqBQ3YDnL4G|Tpm5he-_#0EN6sKf?K7hnY$v|#kK*3L3C zw@A7k6YkHEDuiGgVeQHFi?m)Qa=c1>k;pNqe-x5J-g~e_sxEp7@z`q>o@M|&$gkrN zA%vTo#Md4l5o&j;^mg6n?A>=d?Qe$_{`Keb-;0z|yUyg9&_ba>#}Ec9EPBdY8=mlC zYYqu7aH*rFiD_1>RxUc0DPeo#MwUr;1PcqaDL2oUMr(!ILWUWk)$<}wrWH-P-9r_w zqQoMyRx`Q7@!mH)>fC(*DoT_#T6<t>7eq2C@iOeQ2KEpesz7goJL%`m`SQ&4$5|JK zM7r|jK=xz`Ux#!XsFsIuT*8I-jN&zH{5OocS#T(laDz={Dbr|dhNTI8#T#&g91mF; zag-3tCA!pxMjNSLXtyi9k9%J;Js@`c1@%EtUM&Y8GU`|W8ITLGKly^-Lv+~pqy?`7 zpM|RGrlkJzuLRs853|Hr1*Ln0G)RC`gk7n$NgzyW4>v{F8HJ$8htk>D*mxTddoQFl z#a(w8AREUS`elLdCO9>69yJ}dMTjMSSr_Y8ir3qO8)aQwE@bH5rkgWu;V)Kf=CX#e z>6HWeDoe=mQ^UA~xd{6FSvWDL-O%Gj8>GihsF+&{fZC5Ch<mcY(R^XV6c%$tFDn|P zB@DchL@X~yxB<OE0`%-|4Co;tA<ha=CEvgk<}3;+zuU7UVL!nlia?76t_QmH;}Pw- zG3VJ+KkeNP&on_J&5L1i!C<rD%>DJZY5%Z)!GQf61-JMXxW)g%3zBKkTn-0fdkn(R z0`p9ta5_4Ai@7A|NQ|VKAhK~?uFY`fqPvWm()bDllt+R?l6XC4NIhRUA@Av%ry5J% zms?fupxJ&&?EJ#DVcprSx2)BQn2Z^UIqUuJUQ%qnF4oGl%G3|=U5Wnn>^&cUo_-oj z<Qi~aX>_Y0$f3aiZbKsYBCRFIykh&Ih9LBtIX$}m>@VR(Uj=e!cAD5|Qt_d!uQ#t6 z)NHL5E_ez}OkOhp+spU>G3R^O%vaFEhEtgkL&@_uu-@6tm)ZL>EmHMvS(xOc@!;0I zr8&SIX^Pg-)P3*Hf_Quo(i#5d6to!@yf0mU^K1)%<42w8rt!0(=2^M6^WK}mfp6c{ z<N-W4hf)+~iO3Xxoh)hpg;Re@hn^W<eFP+ZD*D|w_1ND=;(~g6_m1UeV=oHZ*<T6v zER`XBhgd;YQ{U`LM*koZTN=iLQNcG)Cd2-_m<i)QVkV{GA|Pf8Qg~@&gBSj6r@`a4 z=vCps;IgC4MaOFQxT~Ckth^>*kvw{^BoGIS%GZd4)dK{<_#58WN?RN{0MQFyaSk?s zs<bsXdD9Pw(=sZB?6{9>Dum9;g+Iw9v6FxBiHpJC5!!4U;fAM%kxcgeU$vQ1*m5+5 zzUrh;YsaMs&vz);8AM|p*Zl{V-Q7FeqlLmg3)|p|4o80$io`vd^}r8MJ;<3a*Aub9 zEkat<LvqIJP_!k*V-tayaMX)G4^i}43k$_^E&?2TeBIhb6#kmIiYXnc?PeI3Wi_R< zFv}M1QNP7?XRuItyV<-g=y3|LU^_CZP&hLF;=M(eGw<7>WIJjaEfz+U*5N+e8O$Ba z;o1>Xr;3}Xb7YLUsZh;~e%<p)Jo%%Sq%AbF(J&)MT;?Ab>w7xcR&#@ARjJGmW0QQj z2sYJ1<8ov=!iW~2K-{jLx1*1JXZ!Hs=^x+SFSyAImDBqpWL@BHjzPvvTd>}gu^-8P z7)8R}$K9Zm7e%h$s#~4ucJuNd9p~sw@!Ow$i?Q~(z&rfP#DtJ?lRELReFRHT$NWZc z!GZp4=PY^js1WFm8ioBLcp+>623)?%*apf0b!l(iawB0#pwGO^N7qfm=+y^mcAD_d z^dWWa$9(X$8@zj5LW<8hEcX^5g<63%x>b)@((|WoL*mrW4+@~Y%xE#qMXy9hSfVf_ znPH4YPTVEK7uYE^(_g)J1TuM2<7*njXLv5GnLMWG1YB+xy7pU6QLeU1IB<aHor{1# z{Mk<iOF)KkVw@v7B#t^t73lRjgc_~_iWkizZ%g0BZlPj%YPJnj2|L2Rzy3Mr5pBEH zV}8lcGd?gLfP|mMXW2&CE6O8X*9divw6+Jz%Z0N`Q>Hr`*QwWXf4^O5CeW5`t=^(7 zEtyBJ5$13WQLT+6zN?~%WgC4=a&S*mYp4KBO)tmIqFBY~+Gf^p>XGj&F7&U$!aA?d z86ic_fU>Zv0l`uHx-KVhtUR}SYkIbY8}HKEb34It;~okmma7VUa$JhFIARVsL@Zjr z*FKRnI;<F7T^5o~_$?C@d}zyEq=M|!6XDt^#CS}_MoFgfBy1d}eocJxENv9PyJW9t zlaiAg;vUz>-hX1z`O>f>A?_X8y1HMpl#6^qT;RD-i$am(Q2bdIzFDf*gs~0xniCnO z94ptxGJ&yD`?jrZ4YEEp3uN(r^Zm)hT6kA*51gaX=<>xCm@=15a{@KWoBy)~?H@U# zREexqSX*<UxVioB{&vBe$hEZQZl2Z&h3ro4j5X}v00hn@Xl!{D`2PB#WazhZB<Ptj zwW1#UC41a&=n*r+o}`S(P$N{;q{%>GL97W7e+&CUT}r|!Urc)16x{8x?3SZX1nA?_ z_Q{V#AK!oeYoI-4ISQ)%QMk)Og4)HtOI1q_n@Taec7J|g5Y}1nk4ohKh%Ntb58dy& zD5;^lOrF(YRe%aKCqLqzir8awW5?Dtl7np4-r|Sg;e^iMT1$3tIBF^z#j@2;qe*rQ zDNxA5<OI8T-E7j;2XV4&N|HR?nzwlBjSXsS-NbtxyJyY`>nT*g%S~Esh-%T$e<zF* zHPXInongUkf`HuR1B3bv9IreSuVJm;HaTKO0tgUX^Pb2<_vw7BX`s;rl(}1R2i3E# z+5KcW{ac`1t9%nJhl|?&NvMw6S8a3%x?G693p)xcNzBEC`w6|g#oHeDgizkVScbcD zWb#{Hx>|DEKe*0m3fzRo1>-SeRXq)BE<Jbs+zM)DVBn*1ZuYA5AIB@{FA|PjpLF4f z0(#6ubMG$pS&Vg_R=Lra7(bRz(Yy3Nhh;n+ab}fF;-7DKKAcJ7)L%;P9L-f2bdFV3 zQ^EnV)knaYMDfsLH+8m<bPfSIA2mbGDf1B{9lf*-^-%wW5NCF;7+h+)9=I--QZ>iZ z2Qt5tnSM$%7z~zy_-HPQy_UG<8crBy>a@)y(#NoBkpE(`?^HHRuaSG}5!RNZkZN6P z$yY~zJT#1c8PmQmD~SDamq2@mim0&qup1qdf{qSCfoU`U=g3=!t?e82kHU2Sc~<|` z92)oM{e%<YY>K4U?7i|O3-R=$6uIti$m-ylxv0=S5ScuR+tGl(NdNMs4!Vj0k@e3V zF|0*{K%<^%M&=xE;!q^Zh;_R|Tkm|lE|`9JRRuU;dkmd&{W}VV#`xD}A8-bAcE}O> zhVC*PAqDb_m6enKFV@~NEb6XpA2pC}kdUsSK|s2@K|&Gf0qO4UZUh-(03}5cq#Fc= z?v9~By1Usw?)QHFd;8q`eV+Yce^S)L<CryTUF%xsbq3ZHB^a++xYaH(c=z2{eC=40 z?m4Lo?OSKy<;idg3$5KC%FF+u2t18Qet%FN#zE4Xz}1tvpejp-?;T&=WY^2`gSy*w zongSG1hrc`)OsSU+d(V6s|Nm{b{IjHqor3WpGih9GG#3)S9+$q{4!F{y6ZVvju0$! zhIHHga?X`%Q-MWBP-X|$>>9TAoW|kIyfa7$y@kPbBk_H8Qz0d(BIGWLDjh|In;8KT z_$P~5Y>g)Vcwr$!QEI8ruSv38;u`Z@Jt!0cOlZ+I8r?*YmDPUyt=IW~p1D5{q8O&^ zL$#nk(4F;%@Y;!tmJ;v=V8w;M(zE`u5;}!Fi%-t`qf=Q-m6qJi*?Fx$BCxn;qlW|- z<sE&|De<@vIGf4vyx(?u+BC9BWQ;2c^oW*qRDd<YodHE=amoMM68KXeP*B^m`KqQ8 z@aah{h4J$yP*ComI82a#ftwg+UiI$^Mc|P*<`Gzft7WU%fQ6a-1;{nX0{NxZvZM55 zrsyVZ@F-+(A`*ssZS88RSEL{uuSqQxqQ^QJ4)sOw=pVa&gs?d<An3`!B#=DDSzV)7 zX*wo$Neh`P2a@e36G+{BN@*sxskYnbONsKTrgnARpfI^iGBnPTiw{YB#B;9QrMuyu z+%KpAhM`_WtN#;7<UiKmzxt~-RqFYjN<^#n;mzfQ7(M(7GM0l$wzr}x?O}fMwY0)x zG`UFdk)Hhj`aJrZ6&he2{TEEDV!PlEiD6e0e)S(nRF9=8Cn@9M%>^fvsBj?FqUsY8 zk4MlAT7Yu+uc4*#m05useGV{TmT<MrSEPjDvlcdwDheKCYe3|}q3;Tdn46$O;z3?> zWi_t2oATuV=vN!q#CgesX-6fnyptN1mYoww`_Ay2j?}tsdCVuXB5;rhzeTEIH1LKx zYr_oCBL@H#N7z2MLQ%XU9inULbk5X=3ZJe|wLhXTa&F@*4a>V*CC~}dSA(6PxFN*B ztCJzA8x((hq5vhyM|Rrf5`lL@iEBY>+4gBvicS)mnzX|6^+?azbW>2DvzZ(LNmkNX z%D0^Tm9NDA>k>LW|4XAeJ=^qnU$?R8wBi4CeEhFJ41flU+1_W41TlCAW{JjI9scUD z^}=`jIn_?@np!V=NTcd#Lw1PmmI(vkXu-G6(YR*Y;5G(op1z<`MJNnx+&JbRyYjLB z3^#}rhh4`~#I2!-o}W=hTPTFaUwpYVegl^&YTDHex{Eg#i<7Q5`a@C4GUp;54a_QK z&DqK(AS2XZZJRZzdz2gM#pddTa7gHY9evgooA@4=U4#ymWaFUIXHF3F--M|Wk&osh zO+!rPuLbE)&F+o~$;gzAGrf{kGDM_xs;zU{qaZ`7qAG(oAuj)khxb3*&Jp`Bp}uyl z&r^NOI+N4a|9cVr>#89Ln7tGJz$9g4y@mMrtz6R(RSKFBVU7^(ys!ex4sb;;22F8P zu{neXuwl8O?_eL+ueV$P6SZj}_D<yba6Jkh0DALwW%2%5KtO*;^t4@`OmJeO%pJ9p zIOrnpr3?-niSs+`m)&+*4Xl^J<)uRO6fL659JL7X5(F5~9|AkoLk?308B9x_vl^~< zv@?7rKWP95)$Il;1N^?aB31{^$T@PFnq*geQ*3WYy4p$HAFm~`d;nz1(WW}<j2$X2 zkXjmAE*$^YhWKCk*{=~s!X6H1&F?b|_sx3GSBn2-D@sKCy|bXOi$GE<(Vs0OPU*Dh z=~KJ!Ho%YsWni=dHVVQlMS-bnIX13!CFsKUC+ILqmT=f<mZcy#rPK$KCirui>Hb`P zFgAd}#BELCT-t5E9?r&J*q-tZ0jiuU_p<csbB2Llwo38vPl<TxfKCk#>fEg|VtWWT zdDvmL+u=AQJ7<#K>Wa%I_@a)6c=dfxV{qwBz;2U<t1X~QS8tIjX0;UY1HTxepu0cG zrd{|52UQOe&%t0{Ryx!$a*ZEf|3fwZ`-X{kMMz@UX=ACj`=xmODTnw!cB=l=*p>*6 z0F{GWY6&m8G~T1Ml!R74TzTy|nFDSR4i<YltlpURtxUDSmV>q^_$S%^85I(Br3rp| zbd??;V!=o?rV*Y<!Z-z3qUn9w+;tEPk?JXrszDpK$#UZuHl*a%C8K!o9w`gz6J~@u zxE-n4&azvloDFP7q*T!dZrAzjND*D8nvI7zuWBq%&pG-dmfqS&W+{VioaSgSM9nhX zK;|NZh(!QE0Kl}o&|L+5L;>Ft8sj0+KR;M%;G_9$(~ug`$zWS$V6iY2f8_puSS;Va z7K`m+vF@MervCYV{^KV=bo;PaY}p5r(chi%JMwMgjYE>q%1SnD1?z9XHlohqaM0-- z4Y(cTk>WKCiyJ-z(Ckv2`Knr%?yxyla3X0vfio0hT>*Jlk7)hT7%pAy1n}jE+D$vB zeRFyr=i0wRj7X4hd=0La$VdZD;FOaa8EwD~6GsZ%<3Jon!SFU#ahU^xbfhs#*GZ0p z6@Y<N#4hk%Mi$*#9iFMkA`{+6*D-(xl+c}b7cavM@zos>wt+QcS}Wv;{P+E(2}p=} zfc?e!$NsXA1^5p@Tg)U4kZ1Ge>d$i<{Z0SR7-3V45<qH!SgTkSD4)24!{O%F&y4?E zD20c0mE;1}740{7Ugdu|-;_Sct7rR+Ko`Om4W<?q^KH+!r9vv-!uDwo!|@H@=xS+; z1rQ2%v0NZmLK}&Owvw+fq(-c6ES?B9U0KSgAN!O8JGI{DBU=4fJdVfEhs4JE&?!0< znfhdyoH86Jb91g!H&UpV#Dhu=AKOjikUImAQ%{xZh<ETlRRW}C!TDmVYw2p)`q(17 z>pV8=v!||JYyvxum_Nlkk#Y3EbeK6C5@#;!k$T{~PzV{vN4w4_+v{V8om>EzW9p(| z)w^O3wFdEhD#8}J{nvQ>?^Q{S6C3dJ0}5SVvx0NTB2E{Cogz_Mab$C}zye?}x6oUf z#L9kl%|QF=_&f4szq!}^IG>gO&RfFaiII_!=4Y`AMwf%dFaC5nIma4bBtq0L&UdC2 z<>hN4zC3h8j{+X(fJ-T@h|z$=nvo&WKS(U61EMyZExl2_us-bD$V0084^{FV+FxIg zFz^Lkvlk2NY5bRRdV|xoyP#1Q-ipN~K#3akGb}9Lm7_;ju8FhS=O>ECR4iV)pzMx1 zph9^nOq(nTHOAF*d?`x`t1{aAARFB^?F^42E#c>xHzu3*k0a7qFT`;JzUt%1^A8?3 zpA4}eStt&B&uAZsTz_t~tg}%c>}7M|Xr*9~*&%wyAULmB?F3`bX(UIk<s|%A+=s&+ ztT()r$X94KNH=d)VFOUd+kZ;F?4g0W>@uKhLKR1q{&D9}`B&FzQymS{oLGGTxDRvF zmU{M&-+a@|1Zc%_Y6%JW6wQfmf9Og^5wP+|y}q`7ujfN2EhRMtQuP_{8LzONL;R+7 z4`$NHPcl=YT!|$+tT10%7Tb%T($SmyI7kB}=rfQ5o{&BE{X#dJ1=go>OmA4Bs2!nd zQqJT84g2_XJ3{hSgrqqznxooTufiv#9);-ZgeBqEOd0ul=^xEI)1(AGQZ7&h^9<I% zKbQdG^M)6{JiU0Ws!?4W_be+#I^lsD#ch?LN~eg=OHuE-H?PbLDOt4gj9AC<PjVH{ zc<=1npQc<_JcU_}n<l>UJGV_R4Kw-}&MIXHbZPfcb5b<#@65__wzlSw}oYI;y?N zKR!3E6Gapnwgiq<Xd8nnGjmh9OozJ@3k|XY2Wv$LSl;=kRhwHDR{}<gREwK$m;H>l z#~LX^C??-Yv<BdxK`p!5?t59)$`IN+I@AHFTcSwY#?<gih1nqa=rjB|F`Mo-6gvJU z_rv9+tnRUd8@pq`7GmR9OB*m`F$JKxILIs@l6rmjRW8*t)@ri2K%+qY{(O>4E#{u_ z2{1&;HSJGNS>L<f_q|e$``xTdx<A~L#ArP4ma%-lU^`R8INsJ`RVWd1gpa3_f_iih z1Um|<T%Xe)TthP+--{-X>dWT!Cgm%#)ux>7E~qvS-g3PW8Y}$A#gH2H&|F-s0nJ6K z*Cz{?KicGfHYLc24^3De5->F#`1yr|gp>pPl$gBA7C!5m3eOoUvnkxPrC6(qDHz}o zC(PPNiHcQ=U8t%xe$u}S6%*i@F^&<Vu56F1wH|Q0p5+L*!8Ma%Tr;Zx9rR{%M#3}U zF4ltJJVfVs-6cX4Q%rwsq|(XK^<~0zm=QjZd@=15Z~xofh_D$Zrw3;f2opR6JH>qs z;-<_thCMA^4q|hHW04@#&(g`t>@rw?ZlSpT=otO4@%+E0^rVj)p7*16H=MfxlkC_v z%#;jrYt{8EgEl;9hJ)Z{?K+64H5nnA{22YY$&<n9)!xB^VZb3ZcK{1ewr=Y=SJ{h- z%C*`l`F0Kx^vJV<;$8QLLomtt<RlSA$>M_vcGB8=!Zgag(9}&TywQ&ag&cNXv0m&U z+r0PgTW~Oa+aSTm-P}wWB73z?vp;!`IkNX-p0@U6&4XO(Ma=Xk2B@eXzRT`>2mr_K zc*p>p`CKi1&++&I+Ru)^6~-#zlA8YAnfi_=U21@WdHoeI7-Q!xc@t9S;+K-`Zle=R zCM?6=eDcC(>gO=ey7}!##Vs`p&|S#~>XUEJzdN1O1|Ka3(V@~5%Oy|`j8J0akQ~-Z z;SZ#<vja9c9B!oSOVENJESF}Cz#w3p1K8cKfoDBJ!{hb{JoyUmX~&s5m-<8+g+x$H z3N|r~#vq_01!Uo-swQRC9MyOshXUW;eR=X`>Arb&aG$1ar2}2m``+mnJ)3|)ntdXA z$)pr+bL<*0b(nqBrbk)O7;8@x$gERksGGg9|17GnA8B?y*XbXdu<ONN-3mWYw0qOO zD{KAPF8)o|{=a_-7{h)j+Q7&!Xp|AA74JRB(}`#gJf#jfI~nTq2zkP>BfcoI$ygg! z`?!*IfAU-|mmN#2A-jGu^Di#|F<01U#G5iBeJ}^)sz_k@%=l?JDZ4jzp;??r+<pnn z2xG(jbL>V@+DZan3BR?>>aPy~LEw=!Ad4n$B=}f&AP(^^?G1lHUD)n^X;{8JRoBQh z8;dt5yi7zZ>wTu{9DPtP>xPN^tEzt@ff=jh{jyVHINjTu8MTyvlL#M_NaepL)Bk#+ z57GEn=l=EJXB(4RqLz*tGLCau-z#iKH*&o?Nv#NwPl`|i6>63WaW@n_ej`}Igz<te z`fL}z?hnYnp7&}wb}pU*W>!V|l^vT5x^>R-qHchv#w_Cjs&TsDI@X>mM3<t255!<* zD!Y`~Sf>_~HV!1{*==@e%JKRlW%T4)_aj?Q6vuB;HaK*n%uu)m#)6>PPug3*zD+cb zWPL7Eppu!NYR9qZ7A3mLo3F{IH&=`OJE}_({x;(?w;#D=qW-sOzQ~>l<N~~i0*kBM zr?aVi-TTNR>FZjwPx0d0f!JFMChyDk3Up0W8_NO}tk<`S+YaX=#;?NaE7($+{Rz7y zA+KtJ)3|M{yBa778c)~i2U=a&izM~PJ>t*ok(Mrx@AGYR+)}KX+`E^Z`^UA^rX4>h zY4ti78@wvPp-=ea_`7EW;Kir`8nfGa6Jj9jGQD}3ub(!5ZI-`^hfFk6ZZM8m6<)pn zbJQ`Hygfswq~Ti#f3tz<fN5DJ@1d}4rY<7Z3%!Z&Z@+`T73r2TZCFm;EsQ6{p#-d> z0){HJB{kVN&zW@N#gt}i9Jt(WXJsj`2@G**1Ohrb+d0(S(}UFHLHN9jlj}I3Rl9|% zAWTv|!(!HW^6ziHTUvghImq(6X)o!$RUyZx;_GlA^j!5o5r6|hPVB(>V&%mPVLt3< zwjBGq7QddDLJ5sC&;e$Qyq06}k&bR&H}D4QO;lgI$}B6Xqka}9wc4ZKecOxY3wKJx zjY9NIu?PD$Ki+d&obNTh+8=B#J8v(NE%>(^0owK#yMFcILRdebD=x_Yw}0?|`r*Ht zyj7yV-USbenIVkj@3;QSa`ivq9Qq<tJ4Aw=RZb~*^!%I(v6G}8%Y<Y(usRo5q%y#$ z31_3(0T4{LSTbgja{yiI@J>}EUHb{A=5Z?`Gj?_ZNBVOimhfpKP-WMzyo3ZjYI)<l ziVztx*GtGCJ0a#HI9U8tZ-TIXGMqaX^9I|?c3WQrjy0DFhZ&3!aF)WRax$3fgsBY# zQCEmxf(_n+|4masd4k-fvpS@8R+8eezb~PT-vn5vNS4i1yHPY=v`Wp?Izbi+SC^7) zw5qIIq<Wigk>5$+-|dW+n6E_}+&Bhi`0Mi9zc#=Vv4p(?#n_<maJM;7E}rb3r))9^ zUUVDz&V3x!X^@+?XVMj7x6$vRHMk`5&3~ugq&(s>7x}s++X%mzD#F)8u*EJ_QHL=5 zm@VeB4_tL*&~B$d!|dXh$A!iuH&&;5!ia~(ZlKirm%D~?M>mmBV?1mi!kMH!tN3`R z$Y9N$aB=Wv;2>7eE(g%8{#HFNC_G=e?dSIQf9Nd=0i%qizz{~{kO$Jo>Stfg1}TRp zm$xA(B^TpKlf!GuI_5ja?0gxD!x&`-&GSkFOue*2qUJqe6xY9h!{lRLtgE^BS}%}8 z3Z?F#;mV$Im%22lT3<B-*n}kG@2%#aG~c@+v@!sW8g9pIa)K#JelOhQe<HwE^83?X z2RykHMhTFx*KIIIv4JO-t^9nWFisjOW(z_!7+!UZjEUjqbpYbQ$QG0+p==Fbc>-RN zZmfam6gihN1)U@tY=!K*^G;EC0ZR*ysM^91AO2N<-{bDiR|y<Rs@H>Q++mm$BGy?S zxBl@4i<f@b!${5#Xr?qIoh|1-ZefNeg@3`B=wkQ;PuOHU41?0JL%sm^6Bs5CqQl;B zGnuV$Hj(H(Brp}&ZE&f4vds94<PNEIJfwCv2(v{1`+TDu1pmO6LrSp)uiFh{^R130 zJ?suo@ell59)W-KVpkV#2bacL4I`t@u}c<G?YEsw;)||gtF%ccqd@>*dMJcUWQs~+ z79&?txX?HbXrZ!%WtFj`AJE@Mm+f>^aGCRFGf`P8a#E_#yCZ?#9hZtf{2*(|0-*PI zY)OFa7asZ93FQ-%?F=`O&zDLYsBaww)M}0;$sPzlBhj1X8^?o9=w}sN_*(VSkH5h= zBUMNRm9yeztppHrDCJ<)C#(`n2}UQK1z{GWA6GGdghc+%yWb{I^tj|v?7BXxZFD|T z;#xjg`>;XFN1UtetWx<5*3=djHw6+Un|x1%=XOp{JJg+<h`?zF=qOT%-uYMAPQMsY zsekkBEzg{f!z1G?uYie?g+(`(@tUVgE2<~2s@6M|K4XyZTwOj@{+E-AGGzHLFHzA& z4#zS3(Y%Y@YSGWn{OFov#b%zg@EN#^B=UZ~Hv}4K;ef#I`9`loptJ`Mv|FVFH~9Gl zdMGdR8ArlKX2!Q~>OA0`gapZ9VxH_Bb2K?e>jjcXm}-D;+wK&OSy+gs-9!T;Fv|8% zz9~=YzSSAkBpLJ)2L)v-T7$vaRPotC)|5+%9WX*R-L7C#KKpopv$$$#xBh#OqJ8#2 zD4)g#rvt-kXS%!-yTypTXVOqp6CZw-rjqVz>+I~yCEP>y)qz#^*hM=D#dD*pHm=@b zISqsM;+)G)-+On7{YdCqr_pSa3U!4W+0jN5UvxhVi<m`2P^Ac+l$wSnBZx1-nR?vG z>B;EVS9ZfmS=CP}P8NOx(wwzdre0xMCHno&{<2!jS-#Lc!X)xQW0_(?ZPH2laA=M1 z(OR!;#4JClR6C%Jl9#I@IzDd3;Cox!<nY>^Y}qAnl1d*>UjA-w>-Vow#|)Hw_c_3T zBrW2{W#2ZYiHftQ2nkzwTucl{$!OzEouK2!%X=M-c)%eMY&(Ad_%U`H<q?fKLO(+F zb<4I~H0#fvRal*~%@FU`2PlT1{!V4krGN8a6*-Pl@(JPYzH7GDud7gi=FY%@-;K0m z+q~n%K*<g4ur@aN;J=o;+#WU3^U2D5ZpOt?K;R!#ZZQJt2TkbI16WL;?^u`g2eSI- zT<PH_1To5LKh;fYR8iPVBMtnn@}ox{Sas2xr8I<C)0*a!@pU_A$8gtf2+k#TYA>?j z{*_}_Gq@AER95HQBk`D)fa5EDsVnIY^)kerAM>J}zLU-a40(Y|(nZl_d(>`0SnhJs zNT9^3>iBbXG=mu+j#R=-x0lb4s0QYxnK<@_nPsdwXDZ{_u?~U%-5I{02X~Oz_#_0J z`%-WlDL?o;O%WryflNQ5HTrSXHRrMRX~`cS=`WqpSW$eRmmi@*wml%<%eE?MWO^3B zK@{xBsaB&|`0<r{*CP;lMlMxQ7zx<)<vMgYWeekYl#W+MV<ckqWV&1lU*!0(>F>Vn zQuAOu#m9Lk-g}R}u1pgBQ&B66QB$tiN!oF<WQEPRgA>DMfA5Azg)Jb=^O_sK`;ekL z{bSqsj>jq#vsq1PmGo~b%}Prby5B}0zatA!_#Pda`R39c=DA2|EmBD$rBpy_6wd&0 zz^ww*;5$foW(CKXM8ul5y}kV!INf6LHeQo9&VdmwfW79zrhqO$b{zYifON?(pnQ9c zVZ^EHIJpk=o;U&rWxde-?|AfF9*(Kn;GK)%(3coxS8sm2C(^-9tnP^MO0aD>6sY?Q zOpydTR>uJmg^GC3k2l-ib%}9ECMMPX7raKZiWLySkT7+zj{2*#<os2N=0UVNU*`bx zx^M@k9$IcuBVE_s`L^5@Iu$ds!%i3s=r`GTXq8HhguGXgS+Be}=x9lQ_TSiPGfQ^q zH`~&@`SEu8LM1~$y7``G5L-!+6Nlsppqo5qZ@wY1y%Alxj)`!oytw)qhsS*Y1)fj+ zu$ub^i>!g~`r`|I>p-Ht=mlIoH7|rAdVR4qYD>LP{ccdOE}G4tj=J3i%#H?jNX(BR z8;$(^T^)Oq%uL`p_96*yQ{SSH4<a6p29<Wf2NdjOAmZtR+(*&dmvh*4bfUrtozc4N z@2U~p2$2%X#ahhy(ajJpZwE#1z+hWL+y*@8GgMngYytwAa=+V{BUxFF*h-XKeVhgm zK=au@zi&O!1%ymiFQImk{*!8(oO!^F`wN3wYN(xH)xoXP{DN8YtC-8y1ZOAX;q}Er z2_ThKTVZCylEYUSbWpfGSqz*lawqHNm@$3{*hb!0TGw*UrV7Rqu<2SCkdV1|H!mIE zK?lj|&iOd_PhB+6TW2&&!OvzYt$4o#)&4otd^oly!Vfbcqf9vO;)mN$1<e1b1OIl? zN&bQ(q8M&ot^^gcHKY&5yM8ccLv9)}g5dC^Mq$v9V-L@9aGt*~N(@_7WGyuY@cZR9 z-5apephlF#^~*3hR_mRz?QUIbP|AI{-kPoG+8$BFCpE_b0y7|kB~30tjK*<}d*>Z{ zb7SUeof9o$@H>7B09<VgB?{N;&8)vYBjrC5!}JbV`>9wAqmu1v{7By<mZMCWtXmjW zyZR+_H%!l)$fH_Nc_g+qI`DWVu=vlpc)SPlBCF-waPNGS+xK5+QAKC-5~-jMuam~J zt<_g#)+!*>YJfH*DRdQt5=`O!l1_O&BVn=EmR0HvTkPiyl8@$Va1@oo;}kJ(M!fJi zQa<U?OjVHU+a|t9w&u!5KlI||ep{~P+=R56w@k`f?0Orl&!4REqZMe>hRa71z7)sA z?KdgEf=sN$y=uV;A!NS_v($SXwKjO4E}!pJ_<sDGW_q_@Jl6bm{GFkrp3E~n*DTVp ztO(0IWRnT3`E$S6{rY>`y|3=X?GBT3W}$Isv_Cw^+HSEba(db9#H`+yaKrQ>EP&X) z%EoI~z-?CyaI|>N)yb24O;OY7>{6stT}1^^P6en;19$x}WVH)yH;N3dbzaM<19d<u zkV5q?yMDc-e9eAxJL;?E=0_y~sO)|-#G9P5{+#3h!7VK2bANi((BHO{k-ss&P-;#H zG$Y2ipYhLB+0;7;eR-|Gg>sE6w7{|<<FS(xSCRRCciCG7^6IPVWew1}Hq|e?jeemC zyPWABoRcwDmYt||x-(q1J+gW-=NG`;6|)gdOwl~*+{W6nPS$Ip74IhQSROGXaU-QQ zsjMW&qE%c(MVz%dr9rPc4EP%Na|ftY>!hAs15y`(FjlFhwy;<trD|Kaxa{RS<I9Vl z1AfWmgXTn?nqnP)c?VF8#1MZakmk5X<7@grUS$xANePZxCwrIebmHKP39eaj)D|&V ztc;8}1du{Eiu_cwXDv82IXc(+pzkZE=t}l_Im{<GdsX#*_m4-P&m2F};8<3ib^P5c z;IjLgimzCwy2V)mW3Y4bg&QA|1qE4MBQ4D&nt%$g%}AGXU;AmT*@B1&eN%pIy%V|{ z4ET_OUT3rAu0y8+#eF|fsLt#_Q$auDCK2q#*9~+v+{xHXDD=(ZPxQ?s@MGaPgC!B* zSw@jq16f&=RR^jq_NB>;bZ2&2`=Z7myV;+9`@W!8vKp61A1<y`UYS@otj&>yjCw)e zA$@$S>#aQvaA^Iq4(&!Je%#p2F0cBntWFJAUe4TGeaMd@WIeq0lTz^^11f*Wg4Wn- z@f3Y6{9@2uF#FF_^e_U{{)@!mzYe@ywY{e|9sltz_>+mU81UDeR2nb^!0#x=#dhVW zi)i^NX<ZMC&;!5hk@O}ql8kMP)v3PiLU|QN1}<UbnW7tv4ZuiWZC}rfQgt+uY=i-P zPBB0-X5Kk<+Rm24-g`co!OX!qQz{ci6F()N4bNHaZt=LpUa5i~9vEXTfA=}~3HKPH z(&s5vj2<gn-y^zMeN5p<`7?qoXNp#2i1ct-lGO{dKHhf;O$s^LdzBjT$(*lTv@1T( z!D5`QK&<$m))@gx;*ad4%OyDXZ}k`=TAya^w86eRhIaA&_M<33A)-RvH<pN-6Cc-G z1w<6|*i?-O!DRtKS1%^N;uxn2C4CHD{{+F&VM(mXBo|3Raq&o{6=2%1EhE;(t5pj* z8abUaW}x;Xe}6Hj_WrgYZU@a^jv4LsE^`ip5k1}){WCzvl+(6xMb4pQPkVKjckBFS z{aqv@j*Oxoe@9%KoT6K%JmxS3_D94VFS~dtqj<h760S@X6G13V&HkNNN)3Dno4+%f ze0_>5J86CU1x!Ca<o>tqPc%Xn&fj8|h!%uWRp;}!SyUR&$}y3X0W%S^Ws6tJx2s%f zr@f@~yNG*tUbh&NFVttty_LnqWXL$3KX3X*7PqUOY+49d`*!M?Hs5wkTD%Q!Wmig( z156%G9knbv%9^{gE_zJfS2+^{N|@kGVvezR8YC>wnTrD?glZtXAoI+gx2qsjWZRiH z`4M&m7P$Zn*0;K?<V{TcU9+%{_V5^kYP*xdSHy}jzA7DPh{MBvd2_g7y1J#bJ5~DK z`$|?M1yZ&JvXD|VN1;TcUEX-#=V$BRDsH9Q)@`Ik7yqD^xJhD51z`SHR&Ap9CCwJ= z1A4P9{5{TgG6j>VT)v+)akF1`g;PS{tLo0d#RGAGYyBuYmsy?yOXu-?gS5smjwm31 z!AMcUY^Af;t}rj9NTxIi(#62tum+{(eE*?S7RcZ|@A0M(gg0KzCGUeIx(>*;E9Tx1 z82A+}{2azk3vhdh3n<5xF9jkEM-E3mFq@BtD*IYU*q?A^rrtcHNYG1{HlXn>cJX)8 z<g7xuvIA43@o}=Q&_7dBUMczcFfpw`eN55Ak*TTWWU^`HKgN;9LXVr9^es!=TwU!} z=BVC?p4HV$xDE0enI+%ltGn*<O#0I(6;;utt>jsb_ka|+UuJT8q%CkfraojG5b|9{ z(3eX+qz<0K6QW-%T`kEI>BK~?HoH9AKu*k{N+1Wy4WiL;Txz*@_y~|F!E;W+H)%GI zvit1W>KP^(ocQSaTeH^a*0@z;mBh{RQ*Yj1>*#)+(IkTNR+4lh9t!kJ%hV2=4&>eM zT!|HAj7-vGWloclgl{-Q#<p`#64?zzn%Jsd_5bdDJK`xqC_ONF+~ph49=rfL^l+2l zkyrc&EG<X>082l<k}&XxsD!0s{x_gO9J^-7ufQ2QWFP$XXFNg_)?o{n8#{oCA!Le~ z&bf+xOC{q%!7o4ollwNRc`jK1oX3{8@mgV_gHeox=kU2`bocj`o0H{rQ%RN`6^E@{ zR-dW6pAq^B!!7LZiss@rVX{l+a_d#^of-0CAB&q-(o^x6vCLHU6Vtm^^KDrBojfh= z1W*Xy5rPc88JCMM%@rae6bcauzSztH=^M;G5@y$*ZMSzso{qO0M6`;{g_G`&OsM}c zAf*&RUOeL#ru98{E2TwkJ~?uNR<aYCZIY;p#t{<|yp+IKVcsZ}&CG4|I<Kw!fS`7f zW>vx|)gm30JQTL?w=7WN&H$hPn5FQhUxkrGb$Fj*|Ge9M@~fA~w-E-UT?LVT9;~+? zecU^E!_1G5R>lr72h_Di0?JV+){9!nmtArlN@ttwBU&{;$~pVZ6q{Tj3Q8=buQq%I zTu+EFUTjeHT=7XwJ*wTQ+b%I$Hf7Et&sRwmr*X&p@(~}$+isy=X>G*?T6*#cvT#6! zc-ByeRB1T}op2=3nxd5Oz1s*<O&O{UM#N~!>el&WepMm5k-oG*OhJVzDzxe#S%rjh z)?aPFUDZkM6M43G7~f&ww?db*?RRgeu{`(#K$d|9{)Q97i)>l5P`~j7;BOlNjE1_1 zHH1?Wf-v4t6+RiStI6*^67U$&WE%yk1oka_EU%QvS3Vu=vBdM=Rf0*}K>3Vt$;>1? z37TdN=1<i}2Xhw+UJjq96dLr<T6L8)-<T@g;A9{04EWa>wosRlf3k+6)M^x*CB+K| z5U{=5k#szFSd|fqXq7;asj@KKl#u}5BB|X>ji$Q-S6=N*>nBQYx8MHIaX)2FzE=i3 z3eT&I)oN=d+JVlT|49PLH7@(dsRj=cvmOx(&fd2S1_L+W5XufvK}@0463FfR98u*~ zf?T12i|)y8e4NANg04xpjwb7Uqt6P>hg<W#8a^9tjctmgNINx*eb<7>m*m}WYJ`=s z5--sNPl>@yy;O!tfupQHD7E)nX`||yc8Jaa+9Q<=A!)#@>?AGt#`EJTpIgS{Z$ykO zHO7IFU0PIGE>&V7Qe9fa52hegv`lxSU%3$)H*)0?v>mRCf>v~9l!W{SgEZHIExUq} zRjU6yso@k4?+Qb&FYLdf7I5-~|91NN6U_d<e-itOth>>yQ3p7A8{(kVg%F`LgxoOG z>L;Bc-Hjv*C=?2=*rZ=jl7r!&+o)Y(k}wd53fT#^nSn}UXYT@*aRj@9w{-?A0&8Z# z^QGS=`)kqg=Lx=ZS9lb57D%3-Vk74gE(GamJ%eX>A}~y4m0s4*h3&2v<?QAs-ibFn z$1yl0bY$PD!f?TMDpg*lxs@XkQHQ8IFGq<$c@7gecB(G2rC4CovX~Q%3ys&$J&bhg zPT28N70Ny+ejY9OO?r~`f*@1tn`Q)tHXmAN-RGve;VPL}4;?~Zvgsed9NCJXqeFm% zq)g{cp?XMpebL&Ev|wwNE~2ay=e-<wxiOV*?LpHe^3~XnRAi_73U9x3@ca%B7x$}5 zMqR_#8+2Cf*3`a0D1808YU}22-d-S;zs|%-{M771ZU3vcQcEmK-#m|hXfdEA;>q6f zg@SI*>fQKEpk8OS^o=%}$?SUK`;F%bTEKKlJ~4l2cG}PLbf5<iggo`#&j)1S=e>jI zJ|iY<-iIMt7Hy#>>&`19#S^c1xi`|HxRf&U4)=Eog1o%5IMNItaZF>~;_%7LT*fT2 z&&!|6G{QtKEslE<U#)CEHC5TQ?N_B^HY>o0QXSc$5UP_~0oNuh;f9Fb9dLobo@LiP zLbO(FKsbsJjCODZ99e_lfNV08#{K>Hc-R5tX8XIT?6t)JI3tA%>BqZ6UZ1l~hzK$J zQ;dmXJ(9YnPHu#<r6IGh;bJ{Tkzya)?GKzff%d0s+xzzU!<J)yzZxst4-HOQyeLQ( zuCEppx%qmxX8Di%YhI(OT?E`oHkh!*2a3!2*dNf$TmNEjdX?n3-mQFoPO>Ttsnc^H zHhaDYt^!=N=U1&~(|y+POJtM>K)Q^K_Eie&HGp3KL!Y9W;}Ph6PilrF4pkkQNVN42 z4L!*j7jsFE3vc~aBD<N2_6y|0W32&a7VW4I<nZluY%4*7kp#z=2`7XDDxPPgE1H0o z)`bSISmOnc<uBr_sB4^UsP7>ysv-gW=`~i$$|OI}44p#K=ScbA$`e!kPHUI7i*;FC zW-29jtA&aBMGZX+%o5qsyk03R(H?R#<{N-T(2@I(v`}o+ktVKDc5iDOKa;`?5ug0? zhMzw1j8{_}SU9s2gn;b)g(HE3kf7ak!>5Bl<OK6rh~@Zq+%qJ(l5&2lZQptNRP9xv zUoKeeg2<r%sT&9D)B~W#IWwZ}HH<u;*olVl62?zVX)ODGcbnI9j|^t%$G#hM#xaog z3k|c=lIjZKWHtl0{`88xUU5vpMRoMy3MhQ002YOD;25o2>*zpmitk(7LOt-vujc}= zQjgrSH#O5e$DJCKpAZGAitea@i>+OiL&u3I=k4W2d0WN5Cjs0@KA7m5$?9*Q9o$ic zmD`5?0p<N0W<hPQPh<b(US(4PU!+A4AFWQj$|ZToh@<3(te$hWTh$lB^f~tLK61Z) z0uPa$k^WGT&tX$dUnQY=yH-G6-H9v-+NN5hvbS1msEAtRl#QUicf0D9w9b}_Up=dX zZ=P^X*03~H(6j?*d<~puV-{>}01Lv7!VRorb!`}%^ES~nWAw=h?ypkRyOPwod5Khy zNzzq^y)g&gagV4}6vTAdR8<(B=5WnANc5n!7uLWDDg9h*JLjncDv|`;P}iPSL^S-e z&eGOwvK+U3-!$uH<P`Aa8K9@WJ~GAjxjB?=K(;F=47-=b%s8Og4fj0V0uWw3+wdH_ zhQm6W$U5Kq+gnD}OrZ+Ec*YZm4a(kQZxjqSxl4e-oa*hp^?gpc8z^hPxupQ)n@}#X zAIDXdxI_Vf&T=#lqHjvt5lx)PXrO}aerEYM4<MZENzHR*tcd>G47if9G``HjpwP7+ zsBL8*>SDW!mDA7`z<^GIa85~y$F5Tco%gtYS`vpH;zx9dr+np8rbVGb*BH^N$F{8m zct_=pf1en#DrtH?ph<Jas=-BHxs}jq@(apw^U_A|w`w4e(V_oso|=Al&NB_<T@lB& ztrL!W>7vlwP@5G?ejwCo;HV|eqzfYX0rh|q#GISp$G&1)j&VRihcMjqD3*-AM^a<O zN;C}PASO5(itpSQ5+6LPMJN1-n)^$Z!Yf=MnaL<TH_Pvg+bmJo5-eT=SmLD@zTJ(& z;Mkou(?94nw7^oYwza7{UbtTlyDdMNuctWnSiDw3Ua%^uj}&mWmL*9=zvi@C$cYn` zy1XRyylNgiJRbEOor@1c<P<M!=svh;t94QiZ#_Tt`K6faefepfkwc4Gc<5f7z0_sH zNmcFfK;P9OB?yaxAABV#)7zQpo+9QOwliCrIAQN9XA+hnY9}t2>ZNR$;s?0DDUDlc z{`Mf{*0vc%l?_$s6NdIxzDW(%j*(C4k`wfr(4C}8<F%6riNfbuKVlNeqLR3|`LI*6 z<{hLG9@WfQsG^TQR;nTRglez)u-VH2H~XMy`q*5x$2RyX+@yQ1HPwNT_5F@<ISEjZ z;0U^2O4S0f=km>}E?n(;^d^qzueRg(E7o;Qt%-?f6-~?sT7qxsl*kug>&lcZr+L0@ zo;Ox-?JK7{iM##}T9lLio>ZsQ8mzHTslsHP8fZalxf3=zYOy=h{WW1&WE}8XAe?Td zRm#ci?W}*IB7G1x*uiG1Wirwbx8DJ@4yR~Xprfgae-cNLG)tbEi&`o*a2YVCca z(X9-S%~@OHrPxin)Avw+@{aB86H=mCB&kr1ed!eNdDoSB?$}_Z?iWKwA`6abkX-A9 z4)(hhCv0{R<PbhKczWt!P9XG09i7?tP)fK!Q<mmG2&9xg4;m(<eKeoP`d8#G0%`xT z)_g{;q58Yn$jBJ6w6-Im)r((+@O3w<P+ZL1fg!%RF-^H_9OjbN22+%rO;ewPl)<@d zcdm>)EWw0+5rm=@Ht9AHK1L%+GU`KD6p|VB$gGNXkZ00QBkv^Ykph@JqigdB<{8&} zRJbaLCJ!A9dHZ!xCITz`CvMz`tzwZdXv-CTh9j)7**hUm#zBNcoi~*mGcv)yts*)_ zCu0qylh}M+q2UqiD0G_{suCSx4{xO~NsexPSL8YVM$0L=;Drz?juQ8qWESndR8`+o zwwF!u;jIt)_nXV(<K;==6ToRIFVHb_>`8yKT8<15RbniONFjVhpY;O;e`O^JnB<o1 z4X?;>QJ2vLPznK#Qv&vsPG;;1vf+W4Z>nwe>TZsTJJt)bWH=5N{BRtHFh{z>`#OED zW@Q*0lswB8@<ta0qW@ZELWCzx=Wd5^li7(*S+G35ui?<GW}X6F7E8f^wt>^`8wBv& zr3yZx{N|?FUEGml{xpy%o0ZJ2vot%FQXQq$CvM}l{>2(a+hQOt%;Hw!J{m$)VY)r5 zS?$Co&~T1!hAyH)Slugq+)0|peJqsw`oekJApD4+TOrC%P=VRh{Uo8|OY=MV8mT2C zXgB|KLO1_})Kb1OiN?MNZ@P7ToakAS0it^J`AK<Z-$<6<)u(Rvtx(xY%Qs)`n(LKA z7uZGb(@dXH{s_Er9Us>kvIV6KWC$*pT#<>~c%^aJ<X6M#@2`mfls`!(hEy33q{Qh- zg?e7^<`0>=TJD7kr*t<z-SZn#1d|CQMYM*bFj#*emO%<hA$56%x3K+klV593cfK@! z?xcDFG*ZDh+K6CM!qKBpi~76Iol@scV6Xbs^?sK&IbQ1Ls&KB;Krw)(57P_ioNn@= zPn0CA34LWb`zwBl$9ig&&JOL+X=kw6(^$Z5X{SYLjr1ICZR_&(yJY7X5T;zvoz12l z8p0stGec24sMUq2ms;|v-t|z#wR?>DX-6Uh%c{A_=G<1-1k;LQM08I&uNNn46kDT$ zcY&r^10|0*oV@v2;+6f)a^7QR{@x$y_(s(3EBP_VCY?Zjw|cI2Iofk3Io9_)T#`z^ zotCi^K~%$}?BRp$!M^eI3GMuXW{(NQ5sv}4vea$TEKsUMFgA%o)wp>q7ZvItl%x0h zBf?`!Y_%HV#JkcGU{I_0{Z5~CZyuLj+I+kV`re2p<9EGP<QVnWQMM&&dWaj zRXYRqDC&hHC*wVkA5sy;h5mHKwEu;MxClD|t8U-qZyPEbbyJbJo@7=@7k&*+*uYz| zk<h}#f7AdN0w727GHe(kTx?%898vj48TnHpNy&u3cCx^z7v9>%fQ|$HiS3dXBOP*K z2qc<As&<hwHq;ahTpMg40`*tX0X)`6;zCka;(FGuD8jI_&TRL?fc|1dxV8fN2{ueD z_oPC|PntdtmJJhnEn!HQUT(8(<W%+L7-w@#)`A<h$HUm$uk+kbjS`bqE45<7MzmC% z-sK`9ZsUv7*|YRr;P(n-9M~2)&RatS^;1&xo)P7WW4l#kG%oQ$R3kEsE^yQBTva%s zK)QMK7;`Ep$3C6M21po87NW}rM%^Rd-hA(qSObcK+DeDA5|7>#U>q$61RF_yVx!G| z$;ko%IQ%@evvOS@otor7U%G9Lb?+>Y3Azpesr5VM+5up1=t$`>pk%b1EY9fmKLN69 zIS*Sh%s<9z2$Y0M@W23rtMoo=;N^UZ`-~GVvuZ-!{wpA;uR<o8s0A%w>q8aemiJ!^ z&Nqnji`BvtnH+7I27pTzW(o+oji@ICfM5c=Z|OH0;jK0^Rr%z+`ikkiHec35n>MNn zImVweC1wbmbgND~9dRKfdTC|SoY!Hf7wS`U*MhJzMB3kqNS#}YC?|?cuhYdH3C3)s z$)Y+KXj@ElwIwxlIZ+T<K;fj+;~!+Q4=@_C;751*)wWL?Z<ei!(|O#xo+c$}20VZw z3qFFag9So(Z?3U6I#bP@M&gwAGTdWlx7WK+u_ruFn<9WWd5Ba@g;AS~=jkWjqFYFa zzUL)>BI6VYB&&#@TuT|`n9BL#tM9D<z@o+j`9FV|Z<kUeG)K)G<@YKtqjngihqzTP z{oPdat06$CDCS)47W1uYVlu-+e2kZBo{%u19Bhs{LV_F`Zyuf{fuGq%9HODii8@*A z#PNyUAeNIS$KHmiEx6`~(vD6SLUSLJJ||7$r_OtU7MHY`7rZ8cHXI#JX!jjQkSwgO zFZ~zqR1BZk@@cEy3V@#>H<Afdae)MlonLiE31jLDge}A<B(qqYVaaX8=lQV~tggmX zS%r>=U<=x8DII%h{frnhZvBwksZA@j<cYDRo;s3uQJ1Q4RlQEgmt((roOIXLA`Rv& zJIT~3xSU<ynfik2i<S_*6`nxISM%WpbIc4lnBTNYWB{rQD*vd@XB*ANf1FFHSb%RW zJf#P`6sSc5U;PQL{dp!IegcR53b_-^LsPq;HI8~VCvovf-PvE?8OXq>y7-KrUXGu> zv3qBj7&oORL5t~9I_)`?2Y`aRVlMhETXeWlaY?p38zw9l;wG`SJO%7GHW@nT-cr^E z!<U~nXh{>q)fC8{@?V$2)v?yr*PfDr#gbhjHINK8+lpy0n_LalWf^${Wwtm&M`f2` zY&L*RrMRBA_{pcbjXdWLNvsTIOaihV(i;zUE))FX*I%gToJW;~$gt#zf`@5j<MYr) z=_PUZhI5eEO<3g%R5G#wo65HMSEJOZ>%EY;NCH;Nt4BEFfEdK{ezoUQugN(dY+87z zn$_cIb*b;wbiag(ms-|^;mt#^UbHMDWBpgx-5KZU50Ft{q6YZa%tnxRxdwRv=vGK9 zxiFJno_1hEcrBPj1sV@wa&L{l#J^qZ`IJuRw7=HJaV<e@L@midP#KhBW0$p&VT?kq zBHY2Qp8K`i-Fxwuul`iV@+gJrCeM9fgJGi$+|_wlnlP0gi{h>_wc2FEB}!gN$)rpy zn=lMWqdOE~>ww$;ir$_L<M}yo`;6r5*@3el4=n*&91a?_7vLz_=p;>00tCWFrB}14 z=OP1|(qPw}sl7A|wAd+EL(H9o(jw>0k+lo>Potn}iu#BA#ua)F0P&eN8}LCP0gLNC z;^~UD+P9jb$~>l|H*-VX6+(8q%TyCu^<4yA6M5FNL+$buAzuIwy@#wQy~D~|2bM)r zCAlusfx?x}xZc<EoKPD{zp2UltI1uEZ)@-ZVEM{DztRsceEaupkS+Gh$&XMPi7GVo zgar?5&}0h~DaExnFJEN2-&ow;!B+%{s_#&wmWs5?hZ0qVWdQe;FZVu2{QX($nR#P& zD>Rz;49Q|-wu7?#PG)((HR6UpE(jB|JaqwBf=^s(J0<rJwB2t6uQ$aMw#vo7j7%5y z&Rr_=S$kD`StoQnOOvI&>XXCYbJAhAoXy4gp<fxQ?{&&L+3#t%=%d8)Z6{5cB)B;s zXfH>|<CutZVq@4??;4v<|Le&CO(tQZKMOiF5Y#IOQ~I4^cy-_>bhaMWwAvs2f;s!A z8)fn0v{9GjQxvInK(jTRUeauwo>QE2ugJD5g`y;s&bzNVQ){d>B$DtOXPR7m$e>{= z3ww)zWtu9ETv#U2H*0yV6*gG4Mhrg8ri1cNCKmF&ST4X0fgF(X9_nUL!zKU|@8JbM zB;N$pT;dQw0VBrGw{1q5&AFygtMK8QS`f;ZcLrwC+zh{+nIMU1wSNt(<HbS3PhZ0L z8bdnHXF**Umo_*1^L<mUN{XQPm0HW^i49tUWnF74Mf+WxQR`h52UXYTnzB{zPmnHs zmQ4~ZNKegU31RgpS>!jf^H5ZKf=T=V5n+0<GmDGos|&bN2c#as=h6+dq!QMz9?F=J zN#hS)envw?2dd7@rRyXI<4!NCNYl&_dA=Gs^qv#GxShjXws%lepjkR(NSG#P4{zD$ zYF33Vp9|*hT1|4Tc+ehyU-(RZAFIK+7=;A;{|#9MsQCa_m+E&me&fba=w};0r~nH# zgox3GY-<Ff5m)8C^N#pw-V_}H+JbZ#Q9XvR)J|ryneRamWe1~*-&7tuT+8_^MZNlV z$9?KUrb;7Bu6g8)@x!u+f~+LS2!ct-{(6K0@mcEgyp0{A;RwB(B^sVFX*&qGTCqNs zFFZO9_X!1DbtjupG)YCYBEuCh&c+O6m%5VNd<%I8q;UBD1Z=7*+A}RUQL8ORLkXR# zI8)z080Sh}tay|e){!$BGzralJF$;moK8AGTg;4pMYjSO76r`3HLcjlbmVm5=?j3l z5|vrxox%MTglbwPl{19!`i{y{W8Q7yHi_3x|ApY0+50k+h{@!nB*6OF<?Lg;ky!Eq zkX;C<21wLu^y<&7zpwO1_gS&@d;eqwQvZ&D*bm3k@yUbi)fYl>?LriT5*{XWfbX9$ zx8>LriyY)#^!@RmF<;Q6fZF9J$|aG5UzCXsR;yhU?xm*-9i2H8=2z*$UOdW~Lfs@@ zon&rD*&Se7&*+5)52x~dF+KtS*o%%x7j!HB+Qsk3a@V|D<>#^M`b^3m`)vltLG4l~ zc|&+5r`eD9Hfw?H{nV7#vBX?6cJ;tiQ~`+iHRN={ao{#t06<BniIOW*mS|$R9!SZr z&iVf0H7wDaU)V`T)(cHRR8c{%S)YsmmW1VfhfH;VO(78dQJo6ZYG(K5iB~SwD>C3A zH^3ICkJ`?Js|sb9Qt*7+Ez5z7caLxYxw31_f!x0)_E3z$-=DU@!I(3KTzDpo6a&oC zwe|&yl+Z_EyfW3of#9+IgSX$q{QMM1msJNW!yBAJ79yYbUcS4Vu5YZmKiM25N?Z%= z!!jUs>+YVa%A%g<;cptsVs!;M>6H8}gbI+umTPQ|q7^tHn!Wq$#n&M`22?^z<O)3B zbg3L)(p}z7zb9%$w9W84mnbS*;nP*Fn?|zc+r)y`JX`LvzC9W2%s<kcpajvvt6_!d z%VoYHU&RiKk{VVK`d>H<b>_XT7t;JLNsSlGAGIiW?G4n$OJ`hZ8ZO+BdfkcCI>2QV zKqc~JDLh8vzJ?QGVEF7YN+R4@j14N8LN}xzO*125)-7P)<|}2Y0A8L!lLSRa8!K2O z*&_|L$D5<~KAS6^9+PZ<aOi^)ct$}oi)^j39mv!g5cl8leN+9J_)}wI_~$3Mu7}Ig zl0CRAu&Pn-5}^+xn(XpiQ$M=~X6lp`S2&$ISbSZNeE8MBNIWZ)?ltYOHIs`8y<n7D zB2)6t97HhJv2SqRn$0u-CB@u9o5N9J;5Ox|!s^-f-`|ouGIs5LzgPi%>?aQHF4Qm^ z!Vzg|dv3C21H6NHt=o^9FZs0hZ92b=G)e0C4r{W#uQB9kX6ZRUM{Ix=N*1_=S~r<5 z;ojZ0OP+L0g<A~J8aIepv|YtiSWh2)EzqpCWo6PSW-&lgxrA;5PqY@$8{kF$O+V+w zF1$X@bO5@$g_^yY2XQ@{0lI!EKUVEEo6b61Oe&tV6&4^srcj-(P#ge>`h3zrDp09{ z+KN0J13QI-(++w3SfE(?{ZFwJh}+>%gKS&m0z5aCpl#l+*6m69(W4K{P)P)9vyNjq z5IkR*xd$T3KFuDBou2#;`boUV11&wsX;Xmrb#l?PMQ?V=2$DP5f3vIsl9rxOqGky@ zeXL@;95AYVnFgpW-n~SB$S3&_fa?s#6ZFTezYx5oMa<J96fMB?soPw{Dz!0}jBDQ; zp>RG(h^xq}xW!ptqi+H`vE^5ve(k*ocfz{}4{z2JurY^ofZbR#5}gFPWg_R#AoAfD zc{bIj>eaggb>*T{?XuP*$#?40G2}6G1P1jKQ^PWTz~2GWsII1wD&v>g@$PdwRV8B~ z=+>RBAXmoWtcz?m5wL9PuPiK1NtvbXlI8#aA_OCsXZc=<W+o%&X9A&Nfl7}h=;Xe1 z-FWOb`oy$#Qus*$7wD_p7T?>e!`2C18NW1*zz_Xt{fZ*9^=?>==ks3kD*H7nn39H2 z9vdch>Wt0toCjO9#P)HJ0YEmKiWd_98bT@fE&gRp;5{Eo7VG<p)xKJrc5CDqiJ}np zs_B8BTP_t$le$i<Z%Xv%u#?4gLy<l3T^1dHwACP#8A|Hr>pgfev9?jzEa0#l9Nlod zK1gq(5~BJ2ZA@|FnScgT=C9|0MMX~$g$%buZ(l_wvm4mTrBO0P8G5q_5L|8+WK9j0 zPfhUqEl!oMD?^8QMOW4%9wAbCJ;5^3aqalE-9ciPo13e^8BB54g>V8`3%i$dQlXs! z0VK;AglB{*M#Okz{O6GBW2fiX<|Xxep3SwbH@_hUMA7gH3oA}cMHb}RcU^4MDPLlC zni{<pm_Qm}{d(8kqvc)W)zA!=>rM(;N7u4X`jCzo5|U*B{3+M?L<d_#bnH2*fn7xY zTj0AmGA$s$b!S)?rv(ruG2N!yGr`w+Zu5tv=>b<|gN4Lg`J+HxRMus<13YDO?V5=9 z`k|x)RW6&3h5UoTI~Wo?13!RkZWxHO>?8e`)L5(n`C@)S8m_bG?!Ep$MG{^7^|pr- z7T2^IjqI_{H0?g@Fk`AfmECeImx}dY5d3b4(co+Sft!oA@GQRVb(0bis6r}d-ey8) zXi7ZL%Js1~P2;P$cQwTc2?X~fu_`ZMQizY{x9<yba~SY!!DyEnLdr(!Lg>xszXq)} z@g+sPwaQF?p_?2v02NWh6BUs2s)D{UdZq|^y)JmHQMIFO-cplOVVP_<(Ji+kk*dKU zlA6E(P0~z26rIYlt1rjyY7&hm+N29x`M(%@%cv^bz3W>ADd|RX(MX4MhcpNVASJLU zrMr<5knZj_=#rG~M!LIOYAxVBxc1)Txv#zN=h^Qk2M!R1oaYhqKj&{IHf_u>3(!~! z-Ae4SG+wTJi)}E-nSLGFjD)$PDicDGrRCk9RnkO8adNvmTqXki(s3IUN9zfC7w5ry zwSJUj;?wrf0-VJ=xtJstW?T%lS^_+CKF*&nH`qLVKV9OR4!w9gX|6<nbDn}@_(hAU zy~z)5muLRUH$xSjuL^4T!3Tb&+-Zj`d)!a^$X#7M+Lchig(L1YJ9G^+qJyQ~+f9EC zVblt*iNXNpbf9D~>#_apD|#7l$dDYX4)QnIn|{b&3;C$4M8F)M)8?Ts>UdI_*(IGT zy_`(+I}<Pta5;4Q*QRe^SS~ev#XL*>NqPMC8+x6_4~<+w<=(6kI10R1w-6W<Y)H|k z-+-w<<j*H+DSKD->~)-&%Y;lk6dL&Xz4zo-PtLeamf5a|j3v+~<-AA_<a84y+`$+j zKGV#F{vmNiWu<rC;_3bt>!wO6&@cAnNgpI;0={du<Ze~%DwBI>L(pi9E^a-M;a-R0 z=hsgAQTxfkgTU@`kuP+`$Bh@@qx{#E+<*-47dovigFu5zu;F;A8bWWcib}Q(%a zT809Cr>hrkGo2=&R>QDwX>y@OxJZgRec@yRI}d&D(j!3Jj(xK76`cB0um}4GeS`+m zg1<ZI?qilge^r!=>twrWD0IJxtY#&bFjdLBy(PFH&qVk?=74`6=l#=G_zMN9+%2E? zL07gQ{2+(iJED<_6BT5NT3Ho}Ku64o!7|^DVN5l->27Yg`i_%+b-HeY(X3lhj(?^! zCHAbztjrK|3EYDYGY{q3ujK4u<M@7)g~$%}ES9IZ^rpG%jMdHTt$K}7?tzA2+6|cw zz7^+i57ckEgZ|bjILkt4X6wEsCRMalVsm^}@XX+Xj#miDkwj5pBv`EeGRiMaG^ona ztbTjW!$Qn-ei|v~^rl}N{{`=Bs7zJG`pKMTX|PX67^4NAE+DaLNF5=#RslMC!&G_J z_8wS(pObtVK}lfrSPc^yko?e2P0GQA;m0#qX2byGHo|ey_E(WgQ9lUotDc?;*yTbf ze9zq1<1|tN>Zm+@;Ur3PaupYI_Uw=xwxFm*FIbq?l6JL)mej9~M+f>|Bz?2Z{O<wF zTEBHVh?K;)3fq^x@r*0RSi_gLzGSI)w|e`}r2cbhok&rMTf`QE+*jDoEDhPZ+o`%G z=QglBfw)j;yGoy`>xz6|D)G{_gSC?$Z778=ftyH`cRCz2<E^G$6sn1xP(xKs;z3@B zo3rM-mQuJyTlZ25xO>|R1FOnnXdI!MCOs{5>4$dBDCh`(_MyCjhNhn2oUXg>S2lox z(1-A#43{*Vltb)ip&BeKT^?mv5^R{XnotaN4==r?2+K>5hi)t`58GM=a9$oa$YRdJ zY?!|HjSN3M=&tN|0!w*HiM=X;{@GtDKMZ<HOv9SZ5uUN!*33(i93=t&`mLB35t!2O zB{xihM0jVY2H3T$`&0cAbnH-ne|N<h=kbEO=+z$fND~fLLkKrdf$sP+4~OQ3&H2uo z{9^BaUhEA6#E)S0nqkq`W;pc}c?Fty0TQD>8+P*?uGV!g&-tE^3)@6;4_Id6DXlyr z`RWq9VzMQVS1^nv=5p{O6Fb}H<pddw^&OnZ^YWG<A8RuMu)g#iY?XIr57{boRfTW$ zz0`sOKkcR}vdl=%$mpNgkQ6TJFPcP8hmZe+t`_7>@NE`E$CaOYl8l5uXGrRodR=b! zh>k<v1$1IziHR4yl2V$y7XUQgxkb`zb0n$KGQ_|>OnkRW?#BGkSF7)pH;^hrbaKKx z^olxW^K;_^L#y)r&Wmq9&8HNl!Va<^5hIWgj-6HF7gAgXG|<_J{YsMoK|G9=_aMTc zbi+58eG?NWQ!mx!q;%fcJ2fg;94HFQR;3>&Q$lQlr3+y&9rNH-#&a_rvn=`{r0jXz zVMVVXA9}9Y!)2uK51j8r@~tgq>FM7bm>8OYAZ4Lj)z{b%ROjw|c<U)Usa>(DpWy}3 z5E8ji)h29$4A3S#yeJe=X9UtyBn}2zZu#$=4yTRMwT`(8eIKKp+z!cb=MSAgbbaB! zziZ)%p5vh>VO*?5f|{?Vk`OtA3e%xKkntB%aQy5euR*=k2=1qT{-K+Gt*MQ*RNmt1 zI_>RqfaqI+3JeqdiluGv@?&mQPWoi2YU^18g{unC2;(J@U|nrfwoFoHSw8{)zU6vM zfYMg`fXpO&F~ge;pU>;OUtXDn2s_$GqSp#5{&L{qCQdo)YTo-(e&!RE!SFqN$nRiL zJ(7Sj@-Wwo)r&`ar}$nbVlAhvt%%l3PqbPWF@VY*RrC@UFOS`@wK9r_Epse?AlDCB zM04VM5AAL*!NBQWRGaKJO7j`B5Z=b|=rc0=NRd#ya3Xj*74E?CD5x%|$iSiyRzgl3 z_gve;Ib8|OhTHwz^XN|pFzHB)S$f0XTE?5;))avp8?$z^`iz&m%eaO#B7@XmehP@f zK0uazD#^jcdAO`<MITCIFK{4_hR^bTumva^Fblif(^!?(4w;qFUEx-1#x(YAs<vcz zp2&R2Wtc2<wUbpe_e=pUqEYd}(d+orCS4#XeB*0gUz+)}=o!y}x|p;L^AL_Gy#e0R zb#~?r>3^{Rh+1L|4Mk0<Hi>2m|6>~v@1z33G^~Rw#mNGX4)*N%UHY*yg!DyeZj*?u z!vDAg{N00Y1EG#gY~~>-8c)YO&{09I&My|Ik1RzI$M5{g3Ar;I3G>L5)m4DJ4xR@@ z(BqmuamRLv)Z=0KP)njlOR4$W_Yb4ao`}%SjpD^UHN99isn{ph@5EcI+_SoM`mQ=( zA=xXtJ`)+te<Q;#F<O1IS9dAT#LJY`h4cwOMEy*?ymu>?HSb3P|J0h%Y+g9-YEZ;k z0Iplm7#nY}?e+9+;r&oYY=tK8EM*`xT|uFGzcefDR|Yx*nvul*QVUk{_PwlOGH~5C zF5+D(aKC?qvXFNpeUWhwEUmpr{q%mi##(IbDd&ni{oN1VKft(2h3zX>Yc?WD|2{nC zK>1t~+cfIW6n(mH>Rg^8k<^MOXf^0JG)3JR&O&%@Inxit`^=hH8)b6X+}u3<7F)yn z(!k%@ol}g(p|f@8{o2^G)D9AVb(RTF;E+<{rHxec`PL0$7yYzjbb6A9@vPb)@G8b_ z0+#AqglU2&wlZ~2`wF15^bdrpet_~e3O7KaUFKW|hvgHJ?bAmmNB5e9C<%{QDbr?u zk}@dzz;&*0AtiAJ-C64u%?+4rapKa;pi&7(?koR>xa4B9cQc<L6H{;n)di0wl=4Nq zXv*FPQ{8i<$Ay)av*Gd(R`lu1s!6@)UHB;HR5MZ*hWzDXMt3YawZqsmd5SDb`@g>> zKvb=#N?Wk)4W0xlk#56*KpsKD{W+fPMloMuzD`#H%ousQj!F&Ki5o?DgI4euRL-tf zH5*O`y;D|++P5;iDU2+ZEl3{$GjhOd=D(h~c2u7wV9_PTuQ@x80?WT~JZLt~KhSVm zPY8?6WJx7ZqYaS%M3YDbPoSyKNnm6Nf7sihgalh^jL`kD4N&wzfqk9#!T70&8%r1^ zUyCC}nfi?Ma^*GICKXzn7_%7Ud7~g@+>fMR(p<t^$0c|LgTou^1!jYVeyPE&h45SH zr<;>%C|{h&XO2YR&mk_jjaQxZmC>l>k!SR1e*H6`Iu_KneCy#iQ+2spxZyGB*K9J) z=o+Ff+WZh0PN+78X;XydX_APgM$A@Ax%a!C;rBP~E^M7Fge3cs){e6dqPE7QS6PA5 zV7Z<uBCq-|?fWI+4Est%#O=0Nvnl!oupG+I6wxZpQiQn0J&QwUazn=Zu&J%(iSP$w z#f+6cDPieqB}p7{h=WQ9w34)9E67A}@!{zMWVBItezh07Scp%om1&>9$X~i|fhx@J z>&c%-r|q1GEfpIpGTv8E5?-X+SDZzUbo<$9P-G&t_~?wC#WkQ=ja%8tN?%yIhtvha zD1!>e@>MQ^A9{61hY$(S9vxy;lL<McR$DL1f1LdOr;iuC`HY(1kOj`G9@wn$$(Z+J z2I%Wfl`r$Y!s+)6YTcp=Qc6h%C)^9UKTnk+H#b!aQu$q@K?w&aI$cMcD6*Q%7SMb4 zMj;ynex9~g+bdyjY7}c4dzsqK<nGU5bthYzmJv2<#zkQp(g+Mv)1es&Nz|2SmsDS| zqFU;tNL1_BJCRqdd|#`58wy+JOZ1?Pc2z)*TJqK0ybU2*27o-a1gGe2B$k*MzLC*p z^$LwuW4o$dowW{JpA9|*FVwDRx;_st?r4>vu2YoeG>5IJ35(XsBJTbW0;qfCYs7yZ zO8)hS&zTIszEU*UZ?LM!d~?XBai17j2&))%X4o?OZ|h|X&C5a$`(E8z+`R8e;$2w# z4OGWqwL~hKkRK;Vi}X`7<SYUMWbMNZ<of+pi`ko?FsXjcQi)vrdfnE838&6r{Zd?B zoNc@(bey6JTXWK9jFw^}?u6QPU9+ON5uDP8eCZAwru+qws8e)GPMf$NVTk3kP3p3! z-rt?7R);g@8Tgb*^MWoj!vv)j>ct8uXNtak6yY3=A3gU`xsC)LU3N<?^JkXZvNMeP zSbNy*S!{WiQ^!t}a&a-spa}5x@fBhFTZUtHM~x#T-S#j>biT8I(8liK5Efp|hWNz9 zZW2@BkXnhax>da~bUb9)rOGcH`*_@X=yVGW+CGD0He|q1kIH05z06R?`V^dsPa!z& z7@N<mq-U8+8om&5xpNg7j<9kOGB7ZtgjNVS=ihYr2Ap9Da}2Xkb)N4nq)9r@JJvw5 zsY#jT`kCLdY=+k4D7}S7zBTDjR2eH!y->k=LM6e^_VzpRYO0wH(iNevfLy*|%~czN zdUk2r58@kf|21LHYo7E?bgA+vi^1;KyY2cxHN0iBV==HrusnjIMo!MU@Q-hyEQ3fm z6d|SzDyhG^E`=$xIZ#$W-H#3Ba2BghZRxbwOPY_ITxxt)bBUaL7IIj?A1FvJ<~4_H z?DM#NpI_#!0rdT6_Hr_*R>;^4blzqo1FQ>!XJG=ri**BgTIc(HPc}0s(c(Z6672Q) z<8mGEvyni0dNB3^Lskrn>%V$IeE6xUYKm>iS{=f=d@todEfbfv2N9SF#UE0Z6I0W2 zy-P27v@*SfjLczhz%O#%9pezot(=Y(9gtD@C3d5WPBhfXT1eh>y&#B(p3+?B>3sU6 z30YTd1nax+jH>{{j(2e|-<Ml-nU>Q{_^!!ApyH1AB*aZ61I-rs#U~z=k1krT(>+|b zIARo{v|PkY`NL|K1ad6v-^Ma?5`oy`ys+PAF8cK5C=8-p6>J+U+s?jMsXhXUOFud9 zezH_{ce_XTWRwv?(EKc%B6}Q&@upU044NOXOsu|`r7SOgq}q_V3kG8n8QVGJ%%d)Q z_IqM*72g~3l3k8)CTL<u69N<N(DX0bbl+oKSIV_D&WKZ6*HHcV&qnmDoFw`Jv;5G* z^v1I;O8Zf?o|o=!6sDIL7_|qhdkf~eq^X&?o5E>Erq#R|P9B!sU6V7?_5<xz+*2WN z=<Vj1>+2uy2)_1a{Mn5$zbYpvM}7Anfn9N=zs^TnT9;kZ(L}l(?0)?!LT}+p1uD5s zuSF4@LNNamO7{0vfC&2$s=$eQaPmAq$$<P!lLtO~T<BtQM?d;U0B$D?@kL>#e2APk z^>Sr(TpnHFxN7%1?~S14XhucsEv<^er962aw+a~bP}aw~8e}!>V^QL4Ei;I!&o~w3 z#Cpv+l*%{6W>?(o*J*oK&ySC26;d~Gl~y>+?0XrHuF&wBD>Avos*ulIcGn&~w0%3X z!tPZnwM0V=0y!zzHZl?F4nbA3>VXuwdMF+p`g@G?JJluanUu49kr9_U(l3^=>YSUY z*%L&Qghy0Vw}0;v(o4m1ORGfQsXtD^*PIJ#y{`-+wc0Wu%t8JV8p{|eU|1Y^cXNn0 zh+jEx8U%VyUjmWOBdC>c-hul~;mek;p&t*`X}ZIF+QZC30-6%^y#!*iKVCuuBq@O< zB`=CbHveZ(z3EU&A*e&;aXuiE(tNz_0A|1R6{oB<XS`aG;!AsrcMk`*r0G*Q%F(32 z?O6H8yDDDC8ZqFoWY;YH)ERO2+f)<ckET`&rqm9*KRiQ+H1s`XNcretmwoUYI<!7f zAU(2rUd-2s8fE%~Hh06BrCn0YQV1pHrb)`FXuQ^Y36uzLqueeIEXxsQ+qWyj$Lbt+ zPi)72J79oypv`x_()^YAMt_oM+xel`r_v?oxmtbxm~(2%ax4B*)ey$Ly>H;g?66-o z`Ir{X`=|x>ImkfuZTDQa-ObLo65?0<v!5T(q0I(;(7g{R`M6MF!*AJ~XjTZtL~*UN zZ9GiUI2#unFZStk)(^qeR&Mai_xsFfnN%i^sojq*67d*5i)>&T>MCAE-|CUaAN<6$ z6$zfTuoRvZbl?bl6t9(P?xq^4G)9EYQdjgvyc=bSj%r`1lAFCMsh9m5zb*ASdnAf0 z*Uo>kX@Sf(?)P9?FtTd((&tBPxs}~liI0DOs{fad+Hric<7QqB!t=}zJGC63Lv{S& zu|MlEfrw<sM(Fe;>8*qMmw_Lwy!Ekl^OO!JsQJi2Dq>r-NW3TtTU6Onq)(RV^v*^< zv$szO&Ei_`?h6_kmo?5ukef~d#5`m)P}hy6=ro~PpUDqK!V+-VjhJWoGx4j4+HsUR z{U#woTKkvg*dPR^3Bsv%%*OFN{Ittpy%{T~f(UH8WoF0Vduw`HZ1$6JLJ@_l_bd=} z#bB?OMBeon**2d|@izn#Lkqh@(ORkHie&kpgvxU0Mo=+haAi@G4t^nEHUslZ(WF;V zKMC8%*>vk(f`ObeHdnDPM@Z<K?zxB2bYL%Jp;cM^<;^kZhlR;G?G!+TTFxMs5vi8r z#dFFLX79~bzsIFlsJj@*$Rb$laon+4U0-C{6CGEvpPCO88!m{t3XT|`9SvFtkz6VP zGrgL+y3ALtQ|g!&WL`*rHicX=ujT!mk|%c)NIsy<IxgvxP&#VXlO!_XUr>~E(2fLR z*u9{qYD3y76Zk}jZ!RwQ<_{K|GsIudH@L?1sN8p(KI-Al32sG2MWs(+KVM(#i7`Ll z(-P&Fb1_owWa%;WzT)S9Dk<5~biG%h+Bl)e-Wa+wSz;Zu5Z&=MwEHYz6~+ERarZbG zh8l4fZ@4Y=xRulUV*VmA3yATgq7#!zb&b}vr=|VKc^1fn+<U4)k>*kYSk!6W-@)a{ z*e}&G1UlXMXL(HZ&Q$3ihkgs1um2cVuK0-W+~^9ssqS+hdA|9o3VjZEz~S29zu~m9 z%5(O-)-)d7^X<<4f}4Z^{DG#`A}2#>Sm^`o+oMrO?h*>U6v^D~2V%}fj(z_+t^JJw z$%X;~kEwMjW#`#uaf7ims%nCzju7%WSFdIrcE`TT|2HfQd{+XW`#Ul`Z+9%XjVZR= z<k4xXzjm^gDOs~?fCRo%9~nA1;)7n~kd|ZH(?ANZ6&lOwhfb;cG+vAl!-~~*<dB6t zD_Gs{EI&E1!datC)<=}v+6urf=rtN&r<;u#b&JD5Em)a{H4>arN!M9`&p>G$`B`ZO zv}&|kh|F*?jYA9*Myo?Gy|M!bCuTte5(D?gWyl~~2OCs->LpQBon?ZpjA;#y>F(Iq z5OU+pI*Y)mk!sXdTxO@(>8lu~pjL1f%d(oUJ9Y?~DAAV%O6I=6C<|{J4HasQ)qE$9 zKmK;S+GV)VK_*yyx#b;^@tDNoZN94KJ-e4x^DXfLL`byyh5@Z}D@IlQ23#v;fX~<j z4wxXHp&E}-NobWo3_`jN3}zU;Z{gs)hb<>T`}pVi&BbB?@H{I79m`B;W9Lqm=pX*B ze*?A;d3kxIPoi!1i&od-WE-|%poTGxljPHUcPmtL&`<|{43g+Vjg~m)1=keuTY}NN zskh%X2NBIx>1%<Hk@SSig62hN=I?JB!6_{mmjP1vqBctp8gI_E7ers$&Tf!eH$?R` z#wFUMIK419gV3sBcQnIKo=A0fwl3u>r>Mcs_m@{HnnS67Q9`B!?~5sa1MWlp99cy- zPnePXT6PGV30Vn`GPZ`q`><HE5ETGwGDevJ<gaz~9?~L@s}l#%H0nnl&WY1wxF@V4 zq0<Ch2gd^H{gD=Q2<1?E%yr=)huboGG<My(Sdjf-O|dAaF!J_e#K?x#+OCGO-XHgr z@o(1?%0SS{@R0c3zfvKO9~FTs@D{5LWo=_b1fv?iXzhm*u<qI{1D4S86X(T(i+Cc& z$c$v3j}~5!Q~A6f?$5?tlPbFn$#lK?_gl+9-UCCQdt9noe>@FVT%qmb=58V8{lyao za)qneNeS)$WljIPUeu1_(;)Lr&4()tUBIQQm($_8eVO==hnExHC&tjn^Hf4Vqda9I zFka|-<Q;_C&U9eWiDHkmOx_0R!E@P<CBBc(D@;M0gyB>x?2b9Y1zoLI@13TgwvA_| zU5dI21z2a*g9oaHsiM^jC2TRr+_j9*)xFVe!a}hTqgJY)y)XFxY^gdF&QjYNI>#Ro zQ2*do@#v7<s}|eA9)Y}AdFfmG#P&3XI95HurC{&?*^xwQN4>72MdK{#Gb8$m;ZQoC z+E2T67q|8#w**qVh0d@P6fF<Xouq(4>Q;_;I8zlPdc8%ny7>Y>o}~;N`ro%6^U=Su z0tcKzP}!=KJz%_IkzLAwV2jYifp>EYLj-Y&B*>A|u2TTy74<I=?Q|u$22Vy3dKvgW zyt!k!xwM6zK?O1)gvRAN%~xXC-B4bTH)V;Dslg4ZOweD5LnC6d;9_h(?gXyYk^Cpk zVq6E&bc$wsQyBwf;L$XNN4_Db0|oEgwv~_OZQ3yCza7o}w0BAIy4dY2!d7QGV`5@D zTMncoP6%NyHnzd@4)r;P@M<{#Hw2GyFMf<C33Nu#afdkLCGhIbR_6dKG4UN}!69ws zJST7eIWQcch+q7!>Zz{#z9W)%yI*Wr{{YqNkOzEA8S#kJXhZ-oaL{nd#*KtBG1W!& zb+xw5*56`^m}uHvLbJNekL|gi(>v~?sgkDar(e}_K2N$1rcU#ikJ4I`5~Qq!tvW2X zK8^*ORZLv{i?HO*$-(luyuQ5DV4=!Ws?n>iWX8}i@#<X=%6e*N(-oeEZu|6_)2MTJ zG|xM$mn2bYk@wQQTwDx#Zfa-8W$Jqy2Rt`;XK?A%f0B1V&b9l;$HLpF>z-A~++&~B zSVl5p(yG56T5Qxu3C{b5t@)}c^2k^eUvi&>{ok>xOTPETPq+2tBmq%c#L#6U7$0ft zQ4!vCN{pEL*Z=$1{pEPQH`#PYC7`xqFqMgGZ6u{~CizFHT}l!mt6eUJb}`+4(hR{O zbXr9qmv#UKt|`mt()|!okbYPAUJ>TiuCZgLNS=4b0M`9*_3O&rmDT(<Nmr6rJ4aHw zozZo%rBYCqf(4^LQ+Wq0#wxfW)#J+{g3@qd)`aGjEkmwn+v98<8b|~wTWWQGm<59? zZrYL3ERmTetU@RiMnW*lfD4v#1o@*88DIS?c3RzI8FLtTA1zY0<~-Vm*etyvL^=2( zJCqKGUNU-Yjk$v3+>((@1SB4y$<_=bLRmS^s4ILF*q`2W6-n;Cz(<<KY5(=!5HBDm zI=WCcg0xXuy@nq^P%QGgyU`xmQ`zFGlJb~!+n=y_IE7pRciHE?Efc&nQuFit6f0in z>tg}O9eg@k+C+Mkq72XTq#j<Db8+LzV%?-U?a4$-J6q6$Ea1NXfSuR6>FRTj-V<49 z<zqDgYd!nRS|@UFqBj{xb^yT|_f<}7C?V2kt64HOHDYoA5e*V_*fK-O<ihUm22y`E zuw%in>pKqKB2lBYX_TYYcR<DtC-uDtRxNop<btb5YtqO`>mtN%yP?*ELJHVf?tkh! z6rDir3(YLgAVQDio&c7c+eOtFrR87e7vZ2*t5XLPHB8gl+-9LeIG@iNJD2r>PBOo3 zHc!<*WuhRohl{ZK!aB64q1rc>LAU{{e&5c&f&<HcSzECwK)~Cniy30-^-L#=&Ui>S zF#(#EZxmQP)<fgI)gCqPaI!@q=y_7;p84VbSu}FL(A!W&vbwYNrhnsD@78UHZzLwx z(8hc%Pg*3qpdHG6)rG}R&DNg}%3FwXKCwh=4zspv)l1LQBiN4>Sat<xY+*BdN-((9 zJ4|#8vF(d;fK*jrCPq~CxC}ep8Sd_QFa}VN<hJu`h~{R!)DyTODX;M<w<+^3>!(9A z_@^YS9FL`B3l&lI$0hU}zwFZ-AC>Jog`P2c<`Gz5&~Ogk%3$f&M1*3cTxQ2M$yj#@ z-n7fESm+B0m5vRa%j(YH8o`A26P+<{8#1(lS`)F$clGRg=z#AZRhiJ@QHC0vlCP(S zbUQ)6bJPc+i0CCiSl1tlp3+YNpUot6FF=fIocH5ID0kroRGaV-lf(6y`FNcpY0R5H zDb}CIKoE2JL#|$9U8;Fi737Y(f&;Th><%6S=D;Rg7q@3)j6enX*_Ct`&!`p+08Ag{ z>ZZ%-i0#&aEd>O*{~&U0H+jOg=A9RhuX9FA4QRj@#`n;M?nk4yjpZw^HYHqL);%w- z&8`pbYVd+tHrPsho&pD^Q5hm#i|Qx#U9*fpJXN8hJe(?P`@t+mUOq;x$cpGcv9^Yh zA1+q2FcYYdz@`i?%_~ZSlx}|t@mVy3xF_{`W?#>2l_^s#`cj3W4}<A*J{T0tO@a9_ z!nrE=Y>W}YB%LVFiyt)$Yb@%>J*+Rf+pM%4z|J)=?bc^UxE>5H(>mP6aEZnBz66HI zHzOBd5Kw47X0pL=i(60Esl{u(;JY~!ek^a2+GLkp<aLAey57mskLdh(d#u3hbYlQ9 znkncfwPfOBc_Na42y!9%{740hzDx-}jN@r~BOyQFIT}hT7D`+N-${5Qv90W<)x6-K zI9w=A*maZv5xV(u&`)ktzwjlb4tC(KWTF>2=;L166dfJS@8_Tz6LtkKKfLx;^1b|> z+LdPJgKETB<bu)w8kL2LM=#xA`3R-6#WvUoi67D@z$Npq*6#L44~K4aS=`VT0)G}g zIl#?&6WogPsKDUAymI%WEY5o=*JrsunvQh+*=rxP*srQu6%0sDuS5PL`S9<rumP3L z#v12Lvn7OlKBXT{Y@_++)2AnD#M6Ef<&IvZ-P)i0K%-P)8~v@7<CgDs2fdg2jHf-3 z-bu+mR^z^PjhZZ_CJMVKBcz(ba%9#q*ay?MdOktzowr4Op-dp}4mMLBd&I<D$>o(c zS@O%b*M0AuwzoQG9nKjzZER*N(x#v}d90$@3DskmB8YBRa@q>PIQ800O;j5*PFpgj z3EAMH0MVOq(sf|mj|fFhQzm>tPAwSRGgzl2gU?&BCe}TnUHH;KiV?AgkB%-tKEVzH zyJU$DrH~4j=9CpBxMfwOO9+mGyh2}onorlg5YqqS2qSJU354dQK6iM814Etm2MIKp zj6~TZOXZK>T5F6_#NQ!dMp@yV$9R+u8PVOB(^JcQ;SjidaBp!9!9eM`xt=#Yr<7Zz zis(}K^jP#4H3jTZyCrrl1k8lqQ=bUG!a7Hu&VqniZ`2JFi{*4=b0=ac<P=8q=;zhQ zU7~{>z&(^Jpk6!s`36O@#$%LBocx~`JxTEgHQ%=(5V0YD5fX51#7IK=_utt6@;tOZ z1lP#G2Or|U$41g%nZg*A1O&!p2OH=ZwFf;Qh+qHvW6*E79@+wg{Iww`L0c$RnxJjs zcGA-4uTv<s*a1=V*y7860rO5wYwt%wl+Q+;;tgd}+X1^qD%BQ@C8sR)i*oSA>e&Qi zsk5bo@Eb3K*$F2UDGQDC%BS=^uxVEEpP1NR_qpJ%YV<C7eSUy;+$F9~q(Ra@A#`Jr zGHyvZGVLk2yMp%}A4D#`2L!1oY=JQ-C12Xu#zZ{-cH1;zqpt7e6EPG8m=R1~e}%nT zNfDn{8+!Zx>o#O?RaB&NoO2Yxhu3oEB`B5Xf7#s>(mw?9EBU}-g@-bTU4!1<8QF7- z&-n6F<jqeBzt5=yKQkc#&ER@PZ{$Ru@?kE2^#y>ay`L%j#|tB#ip_s_c-RU-+uVSK z*ExP10|km^>tC8z{fnI3vmlYI5Yp%7bCLQ=_MzY`8eN>C|HJLgGrjEEp+shl@42zM z^_~th-NGp2MfRNQo14hmgzP%~?5_l&-ztm$v5iKypu|3V6Rqzbp9b*o-zK-v7l;Hs z_OORn1)VfMsQ%C2GNR=D>m4bt@0s`Pw+E6=jY*uUHtGNTjQ{l+fsf&!04JI`7NREP zDjQQm8>OCco#u8>-6JcZsU4X&Xy0hE15329uWK6tIQs{k7y;Epop7j+EQ_cN7Kmwi zOq8<!g!HTh-cD&uCAQsl{@jsdZpcOj;<Qbi7i5W$^v2_T%`R8%r6SW!CO+jzFxIu> zm#JKT-Oieu4mQEcbsA1a$PtcrEH2G`cyN|p%iA(-+>+EGyGF67Z)$}hZ)=|m`67;q z8|}1V5H&xA!jLk4n=?H;N)H7@kwS`pZoGS@-_)=h2@Y`_TCS^6SCfvv7-JK3MgyMm zT5Rnv-|w9OS=+e(Br6--B@Nhjd4cr(ON`Rz6p)z7K=KZR`oM)DA6R<|NXAS|uIGWz z$myAO6PdAqdptmgWNdG`LsV^+GGRq_aSHc6&OjjDt|_tF_QZSsaiJagIzkK{3Yti^ za>ib4NG$pIT&Tr;jq{}E*$dEMbZvV<nZ}F%kl_&!qF(#zquazc<5gSDZ}5B+O2Zz$ z!6qM;mnUFSto~kUJVq!8Ttg0N9RhW>V=u;m4RfZ+61njR-nZEivMebg8iLQH1o|~k zq-_4|RBd!Hcp<$><wME+1Gf>SnB07FnU(IHWbQsHsK+&?<H%MfwUkl1_{W{asmt#i zpV%i?!DBJ`IkV+Lt-x2<FERnUBWrhKf#4RBcg<E(OAmiXGvNfC!9a~+l9BT>HGca& z<g|eQvO7S@9<fO;zY->mG}^~P@i3dEHQ182hGnz4F=?&Sp@y(K6iQh<Dm!B?v$AZL z`)=tx(Sh}3d6}IKp36q(A@e>^j>)m!l5Fq>r!iKAw6oN*FhoTGB-wEB`nxV$A*@j< zlE*UoKJdA-Q9hKia@%Y??|RE!=mL=Wv;DBHKi{td`+^?Q$c;BRDQ9$E>R-q?hk+LA zqi~GJ#i=kNkDAs#TZcIDSAm&`Y^dZN+z-1unl7ZLUAr90)SD*6mjwV=R(e|vanUh+ zseIZ%W7mDATgL-(9?28mwUoh>S<HHa;#;uq<$SFzo}m2(4^Zes29bT8zgO$R{<<+O zW%xa?QXG?7bEQ8w3Q)jj19dYZ=a*6rp%qP{*WGu=)Xgzv8A_q<(w!yuh=%5mL&Kh) z$epzp-StvP^Y_K%O&+dSusd|+6v6o_?xukpV9!$ra^N%lEHVO?*O9n*c;-U~B9%s6 zn8}<sSToIcpY$zqZN13TUabwJ1kO}i8o#T5bv~RbaO$DMUhK#T<_{CHM1^G*(`Xu! zrhZ6{+vfm2kFguGokyf^Os$_uVfc+G`v`vZ#B8E}I{%bayV`c6&2PacvZdNWVCdZE zz01+C0SI0(>`#FVfVVZ327s%mYK|wz!yE15u#)Ck588wADus;s_E#*rQuwS<XXpsM zCL3z$-xS9}y)-qOoyZ@;z%JHFhdD%B^<kBtu`A=mBn8ai6hYo58Kk6JbBl6{S6^_c zrat+3CHmCvLd5x{QzsvoW1F4V?{<FWYQtgdSu~2cTlBtUh^ZLASU~1-5CxUbITM!e z5(Sj5J<-U82vd)e5))$pO~VupM*nS_Pvf#kaa)#>%*CWRZVIJ#_zGo#fQ<4j!&0eI zxAuKhu<JiD8u}M{>xW}&rPn<un|*A}{(#{lFpwk?A$qs>Ei_S5)9ACCN43>hwAG$# zqyFL$mS+;!J=O{|I<EZ08Hcb)Y;`og>BW6LQgo#Hm>3BVE6JZSU${|D7khp@)wcf? zK5er#9QA34tz|{BEWqtHU{u5H%HOUbcT&e8^-PM2d;dai$oYmsv3YepgGasN3qfJ0 z%x|V(ML4v==TJt2<xXfxWcy=DbNA5h^!86veWg>r(D(dttBXbyUQmv-wMA*9GfLe4 zH<n4*K61^AppZtuDIYh0yUS}>>wjJC|Ic5FcS4pV@jF}1A*U<NO5!U4Q&7F4HdPNW znajuXE{M2P*sfIcp8J8tId$$lgN+c?l#8DhTdn7yu0T1u5jUupUAC3$KQORZ<k$Sl zf^v3aT&SzmQ<)qy>x;uiXiFwlspL!NnXu(ly*(AmZPKP{a3W~7thsqK-GQ7}!6wL* zXTALdIBH{E#`9Rqs7@tmU+k%W(Nox#+EZ_3YkyyqqrcTIYgkbMI#b2FHify+ZvKw! z!zMzs2}!0{@hA?SPt3v%ID}s`7wX*zp3PdvY!y(-c3C~L-DBcrUFtCL<(MgdW4|+3 zgh0Uf`j^F(JiQLq)?Fqu8dbE2*q*rtX{;vg)oO&1*-q@XsOWvD$MCtEJ@2plR08bs zFToil&F9s|bUUuEus-~*`x(LZautyIP0ELL#O%TPu+^+8CJ}%}l#R7`M+veFQ$q|C zXb`lBJ4foU+ilZHh}-;V3}~p@`7m3>9ME)a$Pe+$OljcQBkAq)KdOX|caQKGw9=Mn zzq8%tmpbpJ^jb;Sw>avQ%fpTFgPqs+VfRP};?myLEO-n(M>>~VwcF^IubE#+`M|9< zrTl4#(!2kdTShQ_UhSCy+c`-<&h+6qSrvs4V(G6-Hu}I-<5xqXHy%^uvUTDDdp?pV z-7yS&81CkU#~!x=^n_M(_&jKcSAi51P!9?+I10Id2W_FZ39m{1O(YKg{MF&?rPo(0 zO({QG_()(za^m>z!j%MmXYP9adEZd;Mndk@B0?fY$VkRnoyz;v++4H;t&4_jq~1=g zzBtA`AKIClrN_Jo&$2|tayM-;h_A7>6sev_z5THUJD&7B><U|+%aA*yxr3dpzRm>( zSmx&I@O`1}W>wdwW_YODv%#*zz?TsTj9DW#Pkj1qJbRR2BBQ6e&0XL96uv<q!*z~N zc5GMwq(Y`HoQEq+2S@qZnsZ3FO|JgfXJH3$w>kD;!Ig6VwWl%s|KHOvvyYlx=?gAt zq;+D|k*76wR76rj2L>?7+r!IlN?qox+B6&rLk5%?oMNlV9X+Umy1c;<(Ujb)8q*SI zTXxS$zfke+h)6$}Agz7Mt!S3Bux*lXWZDait<xmDFu!9{Zp+crxtRiYAZ1eM6t>Z% zgckv2S(ZO0Z_pINm4f#QNLFG~erMx!LiI**xa`(R6*W^_WXuaw7uESQ(IE>TM#9lN z1G^pXID~QJGnH}-@KNATJ^#02zhl`4HQ@YvT;Kd8fKjLP{X@5nX@;wZODrPCQ)B*0 zS(|>){KpNJvsL-Uy6kzvscA%yqS?8!@<9W3DmOLzx>D&!jgn=HQrH%lp1sa7dH(fP z0bv}I_UBT@(|u6g$HK<kSdS>ZEVt4?t{M0A`L{98i$y8WFO==Shgu9`t@v#EO`!zq z+N^KB;y<@|y?Az<aVLxuxinE^k6d@1d|)0;>ERwxOh+35WLu`x9_N|L?Nn4jF#=}2 z*k`fqL+u;BaHvQ8KQeP-qt;yIHl#39R?|Niv{dg)j895}+Hb0$Nqj~+hK87fl3HIX z)Fz*Y*sGF>Neqd?9vSFSgX2<u3l?T3nSedEVS!ST$;Ko|uf-f+@OL%v?7aakSt<UB zT%)yQspMNN5QHL!Bz1Zk0Gb#x6EP(a1ble{=6B=$j+`+~Y3-$QU8hMreCnw7$24fN z<%?;j<4zXXjM~*aH=84njd!DWw=D+FXro>XUTO%?*YqyS9U)5ig9HA{V0G}<4=<(N zI=?3^9yILo3igu>1PWi8y<F_K>bHPF8jmGkEQ5my3_V56`{9SN>b#MGMA4A*{nN&w znZfpk)8{!Hyw89bGG4McAN#uKk;vT~bEPNDDPupvm?ozfucV2$-{az$+EfK!&OBC` zFn#Mj^Y~`qnQ*cF=Abfr!zKFS#pzv!aZl@A`EX=Q#3&HQb@|vwVRBIX!8qoG?Fvw` z2dAb|-GG^c=${V)a_H^Ra*k~uqlc)Mn7>;??E&MP7yjZVwN23c8;b3#14RAiuGAp2 z*%z7SW1ZvmLjy0K8(mZKSRZ8MFC^+SPJYq<jC^(9#dDDAn$PBKD1$$kAtu)BP(qR> z;Q6^TB7<?>G?|NACxHutm<=!ZucIg1dy`KJ!L1|@>i(<UBnj;y(4DQ)=TL7y!N17N zOJZ((9g$$?1v+wWII)KXrMXlf7NYI2)XSOu_g<q3?egB$6ujD4q@vhcWsG`z!xFjs zmGUfSqk*wOQslfr6<8x}^qjyJb__TRHLH8aSr>TQ-9x|7YTl1b(;0HsMrw@^`sj56 z@7O4zeyme-weF6S`324DtkX7;AdF@eOx0p6#Yr8ttzkfsE_yOONy6-Q9OpH6b`<3@ ztG`n%;^Qf{wQz$LQ*6FH+FYA7jhGTm;X7aQcSJU}H{#$OtRB1&y7jsW3EVx7E%1P| z<F1Sj$_e7I$RxreOp=oaZ<hM)wRx?x^t+VTWG)4^^Y!?iwjO=DmC~sprhRZLYnq6@ zhd+fRJRI@$^$#UxjpA%ReebSaT=Uc#KYM~maZ1lU1Fu>UMN)oy%T@X?YU<<joemOL zZC>Tm%ZI2d(^;x^8|!;#<1teA%;Q0(js|i}H5Uw13@<<!X|$JH>i3y1u1ytmwi;6X zp|!PNvrw?Ev{NlZXm!W2!jOChgU;etQm_>3T-ous*mz6L=~X*CZfujbjY{XUcQVy0 ztmkyaYlM&Prn(Zaml{RCmE?8X%92oGV^^li!nnKEM&&flwf&JKZbxIPChW45+4Hs` zDZ;v7iP(g#DneQ?U6o-@4lCP+7B(-SYT1S4<300euLa)tDKyum=U1%!n6EEl`JLmW zJ^-g$W+v!+uojj)9TG!4I`NmKIGuZvE5oDQc#tLreDt!Bo=woAXt<~CCw-3<MgQ=1 zioU{Kf86gL7ltqPkr%b3C(t&pAdTU>FFdfkW-S}HteZALuMsoonFzSO=po|qP7f?x zpBn{x*}j)e^A#W*B<*E*UO#S5=$~pLvJ**NU6<@+il0p<DP~VHZ|++0=(-&_EYqaO zyK88oa6OYa&8~B`-yAErgN>RZSl90p-skTu7b*kNNw2dbSl>z;WT<c((A>W(5EeC6 z`QTPHDdHGRFa^RRuEP5d-tqrw*t-|W`6F;_0Lpkp`Jo!|H^}kBt2d&fgz6=g1_^=+ z5Ug3RY&@}GoW{zIaIRrlkLeDf;&D18%S#Ch@);|)%b?shHTyxfA5Xuib7Lx?c<j}w zrH_Fb=JwElz6V^v_MDp^|HvMbimmh^*|wrW**y%Xnoq@J9zN&blmRxvkY??9b3Dod z3V$7xv%*=+5&7>^?L!k%rm*@dfH@)eH{60SuE(V9CaVz_x?m}f{d;e+t<-~>>TSr$ z77naT5`@r%Si8yfy*N`%Za5jXXh8wIv{n*Ht@WLkpyv(`9f-Aoc}R*<9RT&H*hjg7 zGg_g`G4AVX9dqtM(4>{bQP&p7@=+CW^>yJ(A2h;eW^zA-oc7lCzR>|)0Y);|<fy;s zQ(do0KF!)2$Ep}0AhZY26+jgJ;Q+t1rKB`P&}xtTExooiLPMYPwK8oTL!>wdaJcN^ zC-XYT@7>bBVfi3wU`jdYlv4eps4HwT8NCq;)2rPaa|-kMLGQQvF}ef?4n$38ndL~i z)|9ltUczR&_Y8E}o@P{#VcJ_<|LfbvXZOcP$@oPVMILE`q*)-sOH}PnWGj>MjXfD^ zUX%KQQEj8WGT&RdQrvj^47l*g$wlm9k+7~KwjUvWe4m!c9Ch0j;=FlEtrrFK56*2E zM2bxmu$ON(m%FyxgJaY>d>+8t@giQ@4u)P0937fpS0-`k40DaT);T6CB!=j}Fkn#A z+`zGD4#DcRDQ1`Xg3p@;J3sz&dS?DiEt~(1(pNdy`9aRw+FIr$F(To{F1sE+)$wo~ zqn7V8jjwWnnB>{Nm7K(SVT;PGNd??Z;y&;VH=uUo2)Z0$0~SmixZrZ@3f<URvh`~H zyl+!LKHpzG4A`#(7xD~ySwoJJ)KpJ$U(0O}W{Od}Y*xh}AbRzP-J<4|O~X1r5qot- zzmAy4We^WS{IVBi0PKcgGUFfNs8BS1EaKwE@S&^leY5lL0%skYZJr)&En}GI7cQvI zu)Q+sX{?dZz%u*es#0LQfa|73Oq}+y9i5==y=sW1p5nwlxTtSTi<-!Rpar^T1PHva zZ<4JG%j#TSKwD%F<ag&C{HSf?*>>wswnX&$y_h7|iJ$@fFK-|VyeWi{PdYT9KVBq~ z4X@Q_KDFUJ14fZk$><xHNRkQIn|+N7PyM|sCxgw>DWOf<Y71VlALE&7p4YZ(X1$%# z%Lf{cIbv6jRWcA=d|uIBL=EoCv4e$f5sOPhXN>vvckx<pg*Bz_Kuogidl*)=<#EqD zih*O?LE9e}e&vC$`a)})y0=F5oVRJxjader``M!p%WT3wwor}2Cd>ve<TjX2F{(n> zZaWTyxUKbn+QC<XWQEzoiO+rS?D>k@q$u2eSqz>^>1Qj$>obC47<ImDs(pRU6nuUf zVie71vF09@v$CT>_^iE|^~7-@p4;QFhOeDyP`YAK%C#x%w`0#j)63m$PYM}3j~Aym zZ2XLBnvva8>R?+BX%7FVxcT>d&Hwm_B;tO!5W-gWUM8q%DSQPXZ9LC^uqdHgS3$p; zO>^E{YIeeQOo(B;gWmCeki22Nn=0xv<D`@+csqt{gowMXy=T_vjW1xSk|FMN%$?`3 zkyH7!v@cWr%e2+(&6L}v0%f7!8d|*^qvZocu^^G~dBXawcC5T{1HX)UBvg%!CygLY ze_i!Q-PF0Hc`KFfx`i0KD5o8{$xupnrkY$3r5sr?G&WgnO59KE9J2oA!{5mOR2wKu zZ+ZSAubblpoN~(VUKtD}hI#y1=QAHju9D#6kE^|S=A$!H^vb>0ko6!12s+mXvy|{| z%B@PtjuQtMxo5wjwR<Fxh_`bhM2)F8=(YEM)IcA7j7Xov>lUHjohZ(U5(~|5kwQYG zMKdy31a8sXcUA219Iw)aZGD?=Ob~%aH7RS&x7QIpe8+#nkj!sTzK>f;@g&<OFnk}~ z6@6NV(rfEDb9K7&<w_*Zde$9!K0s~dTr9#8tv2?$qV6Sq!fB(6!+F&Rk#lIW|6zJ+ zS~Y=bk#3nsUeC*qLqZgekR6{`bi4ADvlXLU*N}YtAdYuAFP_(x+%?jl{n1#=e)Da@ zrC$Eya`ohhnmn^gIHkV`V6)SkQsmA!ei)g*m}`mfGre+gY2C`zmio1^XTS7%*~8-^ z4Qrq&KxDMGH!jAE%9K~sX^&sz<Ot6^de@jODxBfiDaozzSijT)CZir<(rnZqSIlnR zyxW5>1mxCj0I|<~_U4&u0cPvmQArbqo37jGzJ^kMOV$v2PODP#_Q>ixsqAPKaa`}! zFlSdar}9GT<N`z@*0=sZ&#f2|4hzGoBuM>p6f)FA4T+Rk%rbJPudP`ZAc$paSWlmK zzZASn8k&3GuzN6Dq%uFF*DOxpp$cEbQ-vkf0|W?Q)9!uSy!z8PS&=wD89DQ14aWG# z1$`e@(wCQ32#cEsO^-6b{GO5A67%d$E?a^F*B|}PFuv)Qk=oP68a0ty6>^a;`q>-{ zr?>%fM?B;iFua3f+=KIJBbjo_Y?6}4`W46Xe*G!bwVxx_4tF3}80aqg4;Iau7mXWi zdgX#!mlsTB>~zsgg$$QJ9y-I`1vE*hke^3y(mlk&a1F&g4nd_NaZKaz1OG5;OK*6D zsmR>T0$_*KMIC;#Jv`s5V83kCd<bQP683lH?k~f$BS|*(@NxIOP@L0$^^5AYicnH} zdIfDZ+3gBxOY%PD-2=`|VvlB1K!L!nK1vf^YmwE>D5Cxu;Sipt2kwSVlpK@E&p!@h zz*}h>(7TxGuhLflB|Fso{6sDyK`#7bBW38#&3jtd!>%{Euz6Rd&I<C7Q}WX%o9-;Q z!Z|;!!_GV+py^Qu%rF?^IE;vdxx!k1(kfweU6=hiI~EDorP^W0JLs)TR9|UA`g8VG z64)vKweg+{CwPkWUAG<Ud^7sKo>=2jn+~Ps9X655gPadhoaz<)iE4^FhIa7c4iM4| zzrlA#_AYGFt#cX=k5gPwzJ&5eP>YDt+<4U(0FG<ei_YIbVzZsv?fx%gl}G{X`=m?3 ztDq99tNh=ck8CdGm~QWJi1qqgR6y#|HB>WvSZ`SYi_+XywQvf)ZD)_95Zyv>(&Aum zGE=<M`SWEg{IL!f;Jl7z04s2M^GYD+%P!;_xwLO4qAQydp9h1KbY`5G5X4O<^H}p{ z#YfpK3Kbi+@}w!LTRi40hNo|){*1@j7OfhQ1>44#%7;$vRgbH+9<ZcwYL;2=?g<*M zuTCUP4I@j>tT0;+Fz&Sk-pvGNY83rFYwwdt^GSR3Eb?-GF;51+)9)b7`KHf;w)+$B zcAsURvCmp|KuFPs%yaXF1~J#DbBaMTtzfp|H)H-DS67o>&>HX}j@{fGW?7`RSQr8F zdHEW9t8bg2<A+y2PmBeGj+xw6|2W?S^+uBuk+Z+6^cTlwdsj*P+;Spuvu=@v!nuzz zRAwCkdET0k!uNgkr%h0sB>GG{KQ#F9&u)6CK+W@a)KS<XQd(PEWTci*UN@U=1p2Yl z)albLd-}Bi>a6yM&Sw}aqkye52t^8uWrPp6`4xHu*wG8wP*E3)9IB+vj{Tn0k!J|c z$n?PyUaLX*eI6zwLMUxO#%$g6hfD0(B&($P`m+h>E=ha$?nzB!c(}qlTVFiFNlYLi z_H0c8kPLmlzG;w1gz$;?0!0e%N6AL(#$b@pk*P|;kJ#hqEn^t1rB@~$`{8Mo|63{4 zYyWP#9+QLV%MbS+fiKZ?D8w8-jH03M#b0uWwMn4|F;WR^l1a-TdgI9S7bbGNfAK4b zTJ2$vfGjF?=B?ug0V!qGp#!C%gFWAxOB1W#7;k<TxVwFb7xcuCc&a6+D)i%PEa&9F z1nVsH_s;Y3Y3SB@eCDbvOd{oiw7LI<*X{AvC^cGv(}LfEz8t#5#w+YHuhgrUE4XD$ zZ^3KA+mR9Xu%BJhE1Q?548(SK<aWUFsb$Rde7VUp8}jFEk=qyHj}}ih@}Rs}f~ujY zzQRG<Kb5NW=A^uD9HRzqy(EwElnAdB)U(tdAEze-zT-{U`8^c57|#-iLBD%+ZYe~o zx-e(b=JH1BQsDQ(W>;7WHg%a1*&MTCf_x80gz_SA?c(ZOyed!$6nG7Wp1Uala55<_ z(YDaw=tXFv%!?Ns8?R{4kZ(j+{t)k8=no`s%2jM!%vikpg%&`1tme%9&2J9v<ivh8 zJpq6*+E^rxDt%-ZRvPtIL`0pxQ*A=FT!=`cSIIxG1^EW*vgp<+eIZ~qX`XdX-kUS- zjTdDLYAw?<6~+qoSeTaOq6OPrA~y2~J@)~g9?J?u)76N(ocyeT+i(BTDaq516l|@A z@q(i}%Yl0$vneCIQK#4r=?!`-H^PWFH{xW`OcKN9^BWS=jUQ{ywibx`lt~0x0)(Ht zjo<Ycp1#MlMlBCNJC9<?wuw9pjHXj9$KvUYVW_#8ueG?cn=UsG!DoFt?xFEEa%|wK zarY8V`NH?-qdAC;dcJy-brixZ+dnDL-6(w1FV1Q=R<>zGL=TDCCl1RpU66EZkZu}~ z(@ce@>YL!AUrcX&FO8NjkB-QNA6WhF{mr!!6?I?`xTD*@7;yx{!a_>DoJoO*1h-y# zYFEnPBnjBZUk%j$hU<Mdqx41Wa$fLKZGs!VWBg12X9GWBiRH?}&qRrfKIS(!EK#Qv zhljJ$6C%Q$F2?0zvJxe#WEzo&&g>M;ta?^&0z%@>k}K1s@BQe~rH+jM<*wQtjbbyj z5LzPIHMXanNW_iice&G4+LMy2yET$OKZKOFyV_anwn}(ngidD!p9#uIbCkPw+dTqi zfF_pjuOx@+G~A4I^k*7I_Yp`>r}HUihU)_aOG<W)b{Br31k#|1iD5n>nrQSgv&W^X zEe}sLYZ``4XLs13pB;AoyvZCqF1m;z_PhBNzEVA3moZS4b5O0j!hTJklqg#4V5H?t zw_=|>SqmIe1U%|qSH=&e37P#lathY<-jayKpO^d(1Kh7>5+5UP&jdoX+TxyDm%bl- z?^aA;PDQ2%zv6yjL{qsL;@t<7rHD}ElfGfthUGFom6#FffDR!-mbIk(uXj1TxKk)m z=|d(Eu;xrFZr!-+0C`OjfNhL=nkc<EWJJ?XNb2#R#sJk;MMvTHdZO-)%XxSFk9V3Y zTyoN@%7lG>^xUX@MFnqTc=zA+E=vU(i{C+fzrS9Hw#c>tb2Rjab+tXWTHV;Cs(Af4 zxr?r+go!LU)}M_*Vf|CugA=!eUf{8!wc<^rl3oUOa0TZWTg*J~#TF;2LLt6pL0&x3 z_gq2Q4&2j^F35Taw>DEK1odKqq4=G`6eOIQAn{L?;Q>$bIJ%7;9<Q}^-wfAP8^TG= zaN9|GX(C-oa&fL5W4x1~FG28(s?fI^<I#EifOf8TbL`%iNxjKm(CZ>=QTr6=(JzCE z=FFs58BHQ<r9Cf%O7C87kN^BZm!NvJg=g<2RwgR3x--c){j%$q*T;Xc0IX|OOl~eK zAZ&v%FpTAq0SZj6jdAvZK4?tQRVn1U0+Br8xOnZRQ&G;*({}<SxpNlH{y)y%IxOn8 z-5NGflm=0{q@_WJW+bFTKnW><0Yn<4OF>F%0Hr$wl<r2!p+S(LTWWxj7<%Blyzl4U zdq3~q$Fbk<{ewRS=a4zz`kmK#uC>m!)+E=lK^-JB-tx(+9$!=YTSaQW5mC{5AJH$Q zNW(jZe7%o)vY)h4EuGSsCZ(4<Q4?RAuq~nan7QBKTkoE+6YOIsvr7Hr0sXVzz{+k) z>f~mCn4(__ZG{JD$6?^>aPj&<j;)U@bD_y4o_?cS8Uf87$4^tTq`}6cEi?3h-Siv0 z%FZ7g&%fjz>`c#|v+}zBsSV5#Lnwi9G}JQ2wX&`D^{kBgBb@xL$qIv5)I|Bvq^!9- z4=j#lms3+>`A?y1d9}tezE1*^a5wtB(VfwEhV~~<zS$B72wW?~c0KpxOe1fmdG<Vd zi=Dp5=Bhw@u!N-)u1!ub?)MvMH?U0#X^J<gJbZS^>_pOFv+N@D7DYH*r|c>>CDD53 zZm5yTxixk*FNM!)X{Px;Kc8b(f>Wsb#*3%>tHor9Xm7P1?bj_y5=*c3pjgMxcvsiv z*q5-_Z_6s5<;G{g#(|vQvES#W^B;2J2eU^H%ikAnjJCuG&wFs0iAj&g%&EtMq`&S+ z%vqLn``2F$@`MA|6>3zV`!v^ygPie0)w~aPK4Aefw)q$%SCWv4tS-SFb(f@EkzjG2 zyKeOAHcnpm8eMz$spLHzjRS@^v(yLs^l#D=ZQyO_91kR4ciXPy@lzL3)YfLjt3@*^ zA+I7niQ?&82{~BH$=R5Yd3T79BKbw%xun@g&$@}dUtF>^UkB#zlnDE4d~0s7iuN=0 zkHZ(GD_lUonDu(29LGU>(1eTi?epwv+%Yw55}eG)$wcNK)tO=aj=DHCC&Cq1tNw7a zb*TT%WCHF=5-LN^c9kNQ4}PpjE}!Ow6i!Z;s?xr8>#$wS4n9ZWqgilNW9riF?5nBZ zWL_qnZifsO!|RgX?IqvVl$`#U%5dtADxq_oYIf}ymcN}*a6{etuG<RxtR8Y_Q$N}= zgg!_x&$TKod2Tz-4{o34+bD*_#WAemBwfxAq4Od~jBRd(W9tN~8<49tBkZ@jIO+#b zKxB3u&u{Q4^50=<xYMndqRA1lPN>GJ(6&e#6D|ymAu9@5T$_~iL+ph;94G5a$F<sL z5V?h@U=p8&=<7eqWozMu**)iD^)`4h?!Uh+ny#3M)Z<VmkQ`@-Ro{TMKo2jOX4PuU zVMA|JD$md{$!lpe(zm`?D%RK$k{)ZwTJFqNW^C<G%FT_y!yeF7>{?~0ed<BCpxtax zVPs)&-(00p@zI%e#5;7|D9ovT1!_BG?)4K^ioIw|VoEb%ovSnJ4A;NL7-|zpF!?d@ zCKF!VM48Vdp67WvJN7e078h7uIoOPIwj<br_QMH;pB(4r-)|0WYxZ&%($`Sw(SQ!d zQm{3VCEpje4<Xll(Cl?^2i5>HO;sW93dR6~Or@MILV_MiR@u#5VFFL9DFT`<m+hs2 zW%GMKqSB@&wyI2qj@6Ab5@R>mU(MLn&fiZkb}N7T%_OU>=g{RWu*bd`#1a<1sQ%C+ z_9pA3PX-cq;+otfxgklPj6=sa_D*{d+tth`vikl@IY|(9(EI)o1(|G<KD85LJz+g5 z70!NgQQc6qzmi}2Bk`qU#q*AK!pDQ%!CS9bV?2$GkI3pVt-{mZo@nFiTcXhr^`cXN ze)VKB`4)SxsZ09wNQT*ei?RrG9!4{(rXtOY=KV$T87(ra?BZgnXjk^_g5M@cDiCpM zRfWDmPff>8rF%HPKhYk72H?8UN>E-HS&9E{>I|@wK;kz<A010*<2^DLC6?}9cIO(u zA=z*g_U%g{6H<T+Q?5=Pg%P_R585nQc3!2s##Vo-O*3qUT_m2%oK>%0fXYbYpvk;A z95;e7a642%KIu%$?Yr1D;swt)9d{1D6OBXxzhyW=!n3(!-}Bb#8Pim`WtHFXf}d8A z$4D9aVqZ<C)4LyQ8*<XpeN<M9qp#p~hUk?uCCf9~t8%~C_(|l|%;Ic>^5Vyi2TBjg z4)3QMBaI}mxuAM1ckW5vBOj`YVy||!fe(4h4+vE+FC1w$p%OqBmB`}(AVopH^Y9k_ z-wqCQMeQtjL%<O$-FNk*Ob_k?fX|l<br7c|mJ`daT2r@LQhZI3nEmv1^t8vg<c?FG zm1HwiA<+Pi8bv3XVX<qG&$G)YV*0JQfab~(srkQ%-WgGh3n1n0rDbpgC*#mw(7<eg z_RSIIdwllb0KIJOqP29#MC8j!;7xxVHXm)wNW1tLYKm2SM6Mv|GtA&?1YOsEl@DFJ zDsGobv0Pxqa1d!3{keAcVMAKI>jd_uDo>OEW1W{dl>$S=lQe^T&~rf#24omY5B9U7 z$b8G9JX#8J-qX7xcXZvcit84%xd!=suCJJby;>n>Z~HBbmB}HDa>kZAg&?T<zpBSJ zqOQaj^l;2&kZuTDzK~l?acGv_{Ml$2&u#o5M_%&N>bDt2(Thn6i^DBZ(~F(1YNG9i zV8N%(%)AIq-!lTdaMPU2w{u!c9d}kfB^bw{TQ5hxIJ9*3Z-3}hlkf9n!{5be2xbu; z@fN}p;<_oQ+j8cHcbk$W^r=8(<)D~$nZD!h600C+y@OPXR`^*;+Jf*aIsMPep|5qS z;c?nbNgMDU*i4DtR8q1HQVKxuU+)8bC@Jg)k8Vp5>uaC0ZDL5A-b0y}O-{tsw)U06 z(Y~jm`uvv(!x77@c!5`hJ8Vz;6QCJQdwU%ZZx7JkN+hC_`UVLh_EsG)GFH(JRwT2& zGr%#EXM<b#bQk!+l?oniSjoEl>av4d_@6JX!RHJn%S>e{3*(&X+%7NJf1w3MRoP7Y z#zn~p1UKHVnc%n&$9wPC-Cr|#%JpWzIfuJKJz6~W=h|Wo&##AZ#RuI<l`EYTTDJzI zm+P#_1Nn?9ROO@n#6I4pZBS7=Y@AlT*VL*CS-i@YvI~jB5VEd&KqmIP&eSYP|D%$y zQC6IA%ZeSv-(#CToMc0}RiQq047tyHnzS7Id=Zu?N<&DXn@bDF#9BZ5>|>4ucdLcl zP9yW)6?K8#rr7LYTEoo8el)QI=NtJJUsn&QqvPL6j1W$g+dd^a^?e_>fT0{Zn$P^s ziBsmc+K6V@C!Tk$Gl31oxBKB@HYZJ-fAw?vo*jKm6L-U#nj<40@&H$S_gWg)RC#Jh z=CacOnVpfNadEP<N#$o!ViKpdr1hi5Y26~%qjwzTmgG@uVk#^9^eBPc1O}+WpOWGy zxO0cL?^8KRk>Mq5Y;?J4ztIN>fFYxz<4X>zJ}Q>|$80}kL)Ro&1T~ELc75mrF8mZR zZ-o${s_V1fZZ$_mB}QJs^!Crno=Q_m`D9`TX~m97^=s{ACkO(HnA^qpBa2kYTS_#q zTMw7DV7D<H%Q@Pt#op0eb8f>Z))>?aWZ*{azs59=($a(98qq`ItE7ELdQT;0mm}O~ zsaN*X>G$8P(W<1)E9{n-L<KFQtm!}KbV-ogeLkUSQ&G4GUg&)9Pcu>GmqS4RPy)uL zIe`^7M!b4(l<exsQz?}pwM}#8&VyVXH)q0Qcb>b0^`#kV=$0(W#K3%__-h%F`SSvu zr)NVnU*$~s?kA1vWIL`dl;r$33y6PvUOzk@m;NS8Zf|NCOh7zQep`$0c5RU?G2OPU zHf|5)c(au4nbP{PS(9c^S8k-3vTn2(p6eXM?&E<hO(#ZUgmxRhvCK$(dTb=atESnl zs#)qF52pIUZ=6BB@U9z~+WqnA5ERPFz1zG<I9Q6YV=r^IWu2JL=jlw#Obv3UhP0i+ z>}B|PaC-THEJ06mL=I2#dnn#k#1pz3c3oLeB$1>YTy(%D)sh^-@m|WHz~<j~*AOB& zWpZlriw?;L3|u_fzaJ5n#>+=i;|V@H-0ji(l}0M8D0Q*Uq2J<Tkx2EvOo5)x%+;vz zAhy~2aO$)g`3N429Is7MQb-<{^UG`Qku&Usv83;fu<rrrRxe?dc!qs#Tts~HvkVz) zGq_alV!L)X-F7A{LiMptoA0N0$%2}%>y#KO?Kt>F4~U!qu}q&$X@~r{3Qq}$iTP1< zGP~CoVDf9@Qe4@sa{|1bkG}&v5GNV55A{<T-BENxVbuGmR~5*tgKbHEIo|3I1Rg4U z*}vaP`>wpd^Pw+dV;(_M+IlycQ`o*S>78uXvj-7pXXw^n=vJ)@$eUq!uXN3gtP9{I z`-wF;6?M=46>j~h!2Stpvhgc9?=!`lM3fJ}DosrZON~0V4R+!y&f4d&P{&M6`na2! zfrh6qp2t0(nQ@wsE<ToN9fO>E=yEYQ6&OV^eiCyNEu8d({7@VnHUmH;DolrV#Y$}+ zX^7ACb}jX_!zZLkUpEw&)`WtKq~_t{+FW7%l{U3e&dx!5dr|elEf0}eMK_4W>dyC6 za_yV@a^XyP3S6=`0j+@yiA!HdS--iZ2jKt^PusbNWY<1cVeg`V{bC57kB<i_gdT0- z$IePnUU{!Gc9c?dWH(j)@kzK}oPdT@WR|VcpMpU_K)G_PWl4QO-{*Nt%y|EvrIF*# z<WhnWxvx&K*M}<9Z^tiki@zt?^6$RqpdE6JN32PT-lC-oLh3ik(Hz1f&TzV&Ex2*G zkWebjff!oPVZ6YzByDdiW3Bgi%~;XpbT>6bZWT;7>7Z?xC$^@4b5msDh_od^r__)q zT0&6J_PzbAIF+D-=*jOu&b{4_Lv6NTvN5Ggl-FVVvuUd5h1p;`+0U1-h4roSSkg7f zfK6}CO21^D5TeCPi_v@l@sQP*xJo8E@BA>Aq&$$okwkB}{Om-kc=^l;m~qdWOYh2E zN+XM<rO;vhcU%ayj(y3|r@!<>T57gmC{=5J?e*EeQehP(@wPvFB#?NH&nnHuvg7(q zC31Q&@NmDVo1kGkpMHDv&c?V~FSIQz^(eE|L39Z8ClR;r$DN3_od+0Z_;ue!p`i{% z;4Fv2)D3_xJg_n9e_Qd>$Gu9dd3;q!NEqmq+{|6rSrBcuvLO^7zUDJv4zi%rq0-Vc z0$a$^olTNE#e|Z0-7n`kr*fQ1h|S8B(tW+As|12+HaE~yi-Ff@@bXa0hZ>R=%FlWm zh2y0@mXsE^lN8rU7d6H@rKV;ON*On!h{dNETN>g*<|1Y3IyDp|eJ2v84^O{!QP_q` zzl(BJ-dtxWCiI^gPM8i(&o!CICJms9);rG3+-X_Qp$g)W@L0~fqxI_lpzvf#zG*$A zVqG402NWJ(eQwl@-<m&9;b*&P;QlO&jgmmz?3qR%ml`@-rzJw@2NN%fnatEHWNU?C z84rRF_IE#O46vO<Gk?|w!tRan9CI9|0;98Wh&W$GX25Uwi<42fkkth|_PfZVRu8){ zvLFFt%%+uM-#GEaGHTi?lhvhLkhrxDnA}Yge7k{v?_*3fl+&R0GtA$@f8tvhK{i)> zDgR`ON!g~Pw;!=ZWgY|T&;T*p*?u1z{+pt_!ypR9(MELDj{W$C-tsaAR1SXOZ!K1W z^?o}ru-~^0*6KZ$N*Ye_>KD7@D`w$g{tqW##aP=dbtvr(L^#Nn9ncJ`s7sW;uiGb} z)@{A`^y4@fWjnt;?G_)1%dA8N>@;HlU>rXLO?iNBPKj+6U-!rgbbO$I7LM-Qd~QRl zvh<V9eU=Hq+i1Jtyr1;j|LwbZPmPre88gK2cV<<$Zx~YCk>gWT?!_Zrc@lY0FRWfr zDJ^CoBtnw8gAupRm+(uIx5l7O$In<RYHB?S>U+kGjffb;xLsEJKSicMrnf>TqjEcM zl8U9&Q=C{R$gTb7=+ci~$B6tejQ*O1_vsaJZ{7Bx0l~?cnRI+{#jjo}GECl&90LYf z@<Aq$R9`K(70I^j5%<}>_h7@M55$kyov9K_EY}<Jzk)C0UtM@+_SXdCN{4RvmSp_- zSs+Q!GE+85Lcifr2cB&<QXg~}e%)mF-+TFZnO!$r=SrKtl+1XHV%)x<TZATIMVAi- zth-(4$&#$#s34m$^F=9XLH_ai{Z%Yk@R{gp)-7OhMJ~Z;d0f^F>I5>wo?SnQBf|3@ zm$54KqZXY(2<n5+$$rr17VjhU-lUZYBEs6FZ{DB%f<|l|6N_*yMtwgpAifC@mm%+U z8C5e@fCDGm|5YPY0sMgmsFuVXQ9J3DXc1!_sFWqPQ*19R#$05Zzh{Vmew=^tBtZsp zVSH#%+ZLw(RyQ$(V9C^KM44M|QEt#1K3}_IxU7Fv=d?Q(hZS9#S!$M|TI<#GzpNK1 z;QIfGZu|zUvgUE7=OQ#`_u6E9uCZdQ1E&(%XTDrr1rub5m~QgZX{f7xitE95F;-VN zZM)bL>vnmQQ&Uyj_@m9q!%C)mZVtPf6P64mP}?zWE!@^Ivsph|c2hi!z_iBKn~eJ1 zZy75a;xY$l!fR~yyGC{>aMMuHeotq1O%<{jrpM}k6t@#&^Dt)q@CZ|AXx<>}X@$nR zA;Xwa+O$=b81@qf!I<45X0S&2-(c!@5z<%skg$&t27h=kH=!n?E$A}{m6`5qR>Vyu zdm=-7L21d0iMW>8ILCF%fu-Ol4)=839H%z&d)w{kKQQ9O(QeLmAnITUV9yKeDz)XK zygDq?eGZdu3%c(#C4L5<bGBe4x{F*Re=yB!LN&owJD%G!_Fx0q4$0uh>B|d#MP*|> zR+nWsy0Dojq}M&=@DOT@pW(L`)C4_|HL0z-l>_?k_^fu^iHWrgZ%w}oPxXR~Oq$xj zj@{&Ix9_AV>QXInE6yv3B+4hK(fisKtPCXR8VlkKB`MrW2k<E++4dzt(mnm0=~@(- zm}TuAV`!F@E=2-A{Tqo|lkw;|hgc2rD7QIJwHx)VaLT>h9^SKQ2NjP*CeIMhSM8mv zi-gd@R13w1()R~N@M9{T>oi!#J4se+yxVzZd3eF+*mq3t{5RZas*NjGMcK?xnkyX8 zQh#Q7u<0_+ZvwkPyE{ShwNEwM@elTJzK)?3*F1KXC1?Smsw+9f(D>0I5u*>u++oe$ zc{3U}i8uJBYaE1Wa{Vi*SlOFTYE;iQZNfFZ7N~|WWCzDvFiD4Udvf9ccA+re{Q)qi z{1ld84*!1q&>H(YkQ5bgtDA*OFqtD2-2FXIb5BKObSjzHv?Z01yv=`H)<{QHJ{FLo zFdK9t_X0i%v*k>0IL!g+4WnM*bSKU|3QNu13G*Cg`rrl0c#lEZ`}+jW832U%?j1oj z3k>-ZeP7BYFDJVEs8oPXR@=BE9wEd8$$fHTe}=WCIsk8nJdg&ZmD4pDfJ=0jN2ep% zSeUr)WXe;I2)q1Ax->zq#KwsD^Sl@Ty5}vgx#i}TAMMaTPqo6|Pj$2_*D59I&vPvx zKO8%Cq{)q<h)8)JjlQ>UaD!NAs?IcyfLf%VB72Ul&l{K`!#2mP_YQN9WTaT|ppRCm z^p8>5@btTflJ0{N`;QxLKT|;b-2^bUI?O6{Rqi+~FBP(%xvZoa6e074iMBIQHmrDO zSxG)=WI=J!^-=%bNbBEceSQ3^z(cU2@TIKqtyae2Z1}kf8DH*M0Cc)YwqhsJ-R?kI z;)6{fQOX2qv<!`Tli0duldmU+(>TVDGQ0)uQ7_gtf@|j>`N;o}qL`thqRgcAV*O66 z{Y%A-!aBN<d2yyq(#<K#lw>-A!pT`FL#P9t9hB}2cQ-z$<sc-|6`-P_^&)JiWehco z?Vyw#JYg`V@f8W4{>;Z>27c5Eq``_>*!~$wmx-VLm6%REB2KCxq>o_N4}t$`r*tgL z?6_5m28`(%BBmV<305wdskhh~9qI`<S)43tvVv9<#*PR+5DecMq!Z869lDs~wetoT z6r0Pl5&nQ>LSab!*OC&7M|T8nhg~MxY84w)6Jx?7QW5=0FXTVMT|O$$HF@S{Gij8) zJ*a8#hmN<^(+N_APgi5u^*{gA1qKl-yD`xd1gVIrYi4HLoqW6sgS0;YR#&hHtXA%k zoIJ*xt?>=Pc%P53uS7$M<T@Bpv=u{k(+z5;7&`L%U*ttjIg%eW8oVC=LMqRVaZ(Y! zD;&orL%xc^3E&kJ&&SndMg%)p4&M|>>>FlcZVScoE}Bok6)d)=T<>*fI(_>3EIx{k z&=UcS^%_!a7Kshq=NsN^Gv0lW&aEwVI!4B1iZ7Nv&4&UPe-AsJf;f5%_fLHY*s7RM zv7MRQd)l|^{JAIfsHZ!l2N$ieo6JhTWOaYv)=T3~p;2S}N$TK3s&;ny{&tP;XBePR zX1`<NE!1`cdAo$-<10DSSk6l^AH6Aw8P4qJD)N7!2<6en(dBo7h6?-|s$S2wksMj| zcs?3>MC_Bu(A(ykQO}TW7kUVsx`kHq_d91_X3%?dxisTQO0~L>{h0{p86f3gUJ=|3 z%fBDodhjFsSB<#65`gH}kGwlF1votH+8-51EJ&AB%1NOGRG~&j!IS|$q_PM5-Y>5y zel=?NT(kxjKzY0mx56k>^ek6=@0&f%@ql%_<a}E8Hi91GU*X}j5=h@9;K3pN^UHIY z&C-Epr@^iIEH|%bWPn3Caz&3QeaLuf$Oc#xXG)n>HR1V}466aI9T(WM9Ce|;aLqs; zdXLLgsKYx6Avd260msN4ES6+3@jKpJ>EU@xHw=OO;a+ufby4gDe}#gN6M_)?A^x_} zo>s!K&UT_~1Qolpt=GzsO&Aff^peL3%wC5sp+n}`tp8`r(CFRFx-1pF`(t@O%FpbC zUWI%}&JXuxl)cjSAKt|Na(DcWQL9IHpK`bRNGC;a+GXQxNk*gF2ItvfkpJa$>wc0e zNxIJAX5XD(jcChYq7XS#iEp^Xd%N*xDf7&a`W-S0O{fEQ4HRy78MpptnGyZF%+zcA zZuwX=6eF(TAX$wXMTNT!quu`>Y7HQYZSj}VxipWMv04iL4m4g<GZztJ5jX@i+YwHA z8HB!%qnA#zqn19El-gL$qM{*?AF@B>O%x}F*;&G;-Ih00poifQl(B#9K;5kkB6`yU zO-Fv=sOuxM)zWJe%cuA0-|H!okIgQD&%M^})Ew(8+qOETZ{`1Ll-R`)RTfi)-)s^= zGo+{6;8aivRo<MTtkpPnq8C-e)-mG+CcfK??jibpG=JW&|NMbN(;F=(rHZibU8G4} zzV&~FE*3nbuc(at(`$5%yz9Ub)aIUK4z!)HIwXvEWOl3=ciZ*Rmn^M9ttT5}d1-cy zNrL5BBsBQa#@lnnwX`C?tvGIeiZ7;zZ(603O5ZYzhml<QGw%P{(F_mITa2Y!yxb9w z`xQRa`hj)q6#gE5OOq0(;vSnhSMRrrb^^{famD$Vdn`NtYW4|Y6h<5>_h|Nh7AWrB z?e1vs{|)!kDsW_Ss)UZF$8SwGrhMeoeh>jpfa?82xv(}+mST8~#Pqb{=2yr6^dDWM ztr>o)tbD4shD4@+Pn|-zHcnk>V2A~UwwL&1Asqo&+=KW#%BhTVs=e#9I5|wRXOkfW zO)o3vFJPf?Zs{)bBCbE(hYGp+b`!g^Ka&9Ldw_|>)}<th{>$4Y5!++NKr3EP`<Z<~ ztHE=Aaq3+X=$$0?N~J*fT>jCO$>y`8(0Y%%?vQ#l-iCFk;MrQe;6*(}lci}5j53=v z2p=fGdq{q7jAf;u1Myyl>zGYu(jJ`MGN*5*H)qF75ZT2!6P2-iMmwM4(8M#E?`ucA zxYv+?D86jge@xacS?z#+R{>HeZB+gm8UpAu(u&r2;(-vP>GjVqiqnV1+ecC*YUt|{ zVu>L%sb=)faO$i4BWU-b#jY`y`YVG}(&Xv@vmCveo1;w;SKbuRqjxd&wY0Bx{+wjo z1$(+G%_nSV<vJ4D)>EhPUTsq`2Y@N@sUp8}H2MPtq;_3yk3MR=q%ZWGt7kH5LLr{M zeDFzb=q%7O(lcJ)<{|){o3Gsx_o7DmM6K-Q9G{@umW!rB^dG=;i1BDP6VwQL+nZEy zEUo^qKR+>%=cL5rj?x)#6YWA*Ked!RQsTImw;Q5h5-a73<Xugk8G7YrpClklw+qM~ z{L`t7m#=Y4{)<J~F}Cfg8!~S?IBv?x&}-=qSW2Qt>GY2nWc$tq4vtRyOKi&_`TWc+ zJ}vhp@RbtKL544g(!h%Q>Qz^0h+6IV$y!hI(Jbrnv`%fwqJILjrU!5l7qmQ>C=-$R zW?yjP8$Ms}hiw=H{MQ{(w6x!R!+yBc>~dG9ONQd%8X_&<L~;tVu}1U%1YLlxMG!A= zB7_3s7RR{8dg<l6fI1x=^qYX#n_`)7LdcO6UgS|4G;iz)PzUa;b`!UT1SmD2RYoZ` zR<x|P1v&h4pUSe-l%O@%IrL<Z2;!bLDJlge@Aq#4nIodwFv~Cw(NM0m;j+MNkh>lc z@@6{1wOel1u2E`Cwt`Q$Tg;4~2#?jyR<=RRVHSleZvKin30a*LMPX+jp^L80+HRQu zsq4#8wGnN#^L`=EzC2S}9m-&5@I8nT?O11Zm}}B1(i7;hu6Xwj-smtdRcY$(e(;t> zAFM>MyU+d{i#i<BHeWfKADxp+%`M#Eze>vSqN?B{m#(qf&I}XSbtj$(59a*G!>RlF zHN6jPIWP4y1X%9@1fkb{s!snVA#L*O;0Z>WLnjyuGoML~%mup8N+#FDmim419_OcD zNRxZ|G%<*D$&>@sd>`4}d|ynps@J|<GC}#Gs`W^A(m)ML;g-zju6@<jsk?o;z5B~1 zf~e%*w%>sNoM6YqR0XU@P~RGo?5&b5mkn+VT^gBw(>NgKB8JMt><ZmpKd+>!EF_1l z2&5)_4-8Ji#m_TjmtJn_Uav7{#X}Z(Mm@CgD`hpsKv;NSVNunLXA}?)27dhy09R$k z9grW5;FS(-n;7<53S&>Usfaan5Y%4l%NQD@nv6T5tjI73u%98K)<u74aNg%ZPR|EM zONuG$l)f;}*Df*C2hx+Y*_pHPT=!pJ3rA<Im4`)Qqid75Mi6s7`;i1fwewD24Skg8 zRGe`jyfM&q57RhEWX@4a1Up{0%ip@Y?~*9%xbIk`i60@|-ajO8&sek3=@AY2X;TQT zDy#95)v)K%+;p`8J15|uxD6U+Nc>F*&eEdyO={<URd|dnJ-sOtYaH{d(!JEtSzw3e zDB0WDEv}f1m0AD?lD@A;Z+O+ewxdB>6mdk_wKzjBK-{Fa?YR&%P=#415l;iO#_iDW z9N)-j)?HRQGO8YvxmNgQ7|y}G(62Cz7PU6hlTva-9}d0=&7oKkyOTZMb7lZy=tjNT zaRq?I!+Erxh6GKon>|`wSQz3T*?(BdjJHgVgKhFwHwhN5pVMo!Op~~n;HbR!?XooV zBlmMHu{RzQWSb*V^5nshNOk!+cK#>>dq|QS%E+_cC~i@j4)`Cr4v=CzLYYXvJ8=MA z8&`ihqc=Z2jsR@fak9}pgYK?eVtRAK6lQJOK@CE6rS*eY3K+kJJ)I*w(2dgmP&vto zH;{!R;tKDjMpF;~L!~utJ5Tx=@OjB|`_S+1atVWyzkr)mm7g>+W`_{~Ek3(>6g^Xq zY-CY}gW@44(3p$WTGR5SPFUB0!%8G_KAW?wKVm+mfnIeU^Adiha(^w2!k}Vje`D9P zJJlRZj~`$K^!S+>M~wR`_4xM#0fF;rxp8fd&H3U+^_IigVmkvdcBdO#^R;IsDujCA ze39LAqf@tifmxHX)ggmQ*!XuQX?%)<fK5IZZ>=w8TL^JM7zini07j#UnQL?zCm#Ou zUTcU)N)o6ckDWV7yP|krzFy^Fn4=6~upVzLCzxL>x7h#PNa6YaY=!yHMDwmF@GY@s zV#*680yfPAJNS#;HcR8$!5S1U9R|MD7wNuTM1w377!Ho)>&Pi%7_)X^J>V#TLOMrr zA>eJgf;YX$J2IbsuF{$-%z<&UtX>VfCT=%Z^EG5(I+(YpY?ME5G;`KLE6Sii+5Z7a z$mParZlOE&RbZ6s@kof*dXw+>)zfk!lX2~feC#V4uTmnrQmE^g(BP+nMmynPkQuKz z5e%EHt`|GpIF-TmpK?w*b^4@9nLCfm;DexzM}Qq<i^aB_6i{XmG>UkHG{#&Y;trbq z-GaHo3-j7@yZZNKqT~|%*+_w=x#)hskQ!S8-Cn=YqDG|prktP$zisfKHN=r=e}6Y! z^rQ{{k{Lv8Jes`F>FEf&(B~1PwBI)VV^RHQXAW`y)=N&HZmDSL3ym>j!fVtw>y{AJ zxkt69Th%t;v}-$|V4^o#V>7S3mu$;AU5h4x(Mn6R72i?kun$Yri12w3;GtP*Nmxl$ zR>+D|YFPh5hkA)m@ZtS9e!=_zpG^gFd3mt8W6-0Nr(S{6#oEdvkQ7w=;)hjXEPGN2 z=2=<Fem8Z+T)>Hfu+WrJQmsc=8=`FwK^jYWiU{_%6uOT$9?d=PgEe}k?H$*+1HT+A zwA=m$OJOn(An?f+ZHeor)g+?2Ho$C|vkF9plR-F<_^u1ui(SYnK|CR#czn{@lgOTN zxWU=5x#OLTxKVA>^Edv<!0M|ItvEvl@;s0u8Np4d!W#B2*P{In6Q~7GxcD>(EKc88 zbw*AXR-n|r&3NLkOj@NA2MO}>kg0PlDBghSz^+JOs$O4{S(S02zYstoLEz$Rp|ho? z2%0m)P>;^zOeZk1B#alonAnOwJKC<L+CIdVn|z@(^VgSEm-qaYhg|WFBOKz9?shqQ zj9tgFEr+&A4|)%u;fFEV=#+k{uu$nMZRM@#SWwP?R&m7Ae}fp3DCr$Vfj1qMa7^_k zow7)#GcM1f50~4Tc+IcphXsI`Ap7oN*;?goJ*!fNZF4D#IztJ383%$??cw*h%x<gU zQ}D*Bt)?3+t~eihVP9_&)B|>E%U9r0wqszhZl7x;_0;lgg~iudy(n)Egza2J_|Kst zUIbBRY&S{iZ~ezfs2;>Q0R3TUCxee~pZdNz@QO&|h}iWy+ThJoPI!n@8px*Ytm~Z- zLf>J1kTgBx0<oK6xsFQ^I2HeQiCy2l@u$3AkGTSKAi4LOuHJ21Z2xI<_TeLo-uxfG zr);*4HrtEENCx?-&_~{Sj^E_vt;oBo$WEGYC5j%KdXzmmN>8)nmReTvGhhRZK^f{h zx;4dGX^;Q2Jh^(8Z=1Ix<1kQE%l>W#%ICTThd>W_S0x*MQ*DPV!ERUAD3S9V*Ygq% zL`!7#W}GEY$fF7abs?LGkZB1P|0HiTqFcVN_tRHHmje1B&s%~T1mp)&qz6Z`>kEQ) zZ6OaAy;}`*_Z`ES<?PU99%UnCi`Tar-kew7=|6p$?g|>nEof%#M~?58Cj3TD&1XX+ z^Vz_<Qea*|wpsi37||(qc*@ZKSZW?XSIylH^DSWUnUg19=j&_#zHK27LWaXctQyrT zv-HeNq{{GLq<Z7uq`JGYR8PYYF1E=f{bRXb^o{RAF|IblL*8&tvT#Phb-;;<wk!pc zoI6g(JO5B(@0H$9u_*M^BX7C?MMtvpBF!}X#Qt0I_p>WfWI?-U_lT2DUBAmrnvKgJ zd(+T21*7XJ2<kn?qbs$7Bmr%He@$|3zIN_*cjb<$t;A7S|1s^2W~o5G);ko+tax|A z`ada?4;r4kzWF!&_-{+%f9mjG<;4dF1O<33NnYGZdvBt=$#1<`CXnc*SgW3*+lDK) zsrG1$;VhGw)n}%GMn#eZkHy4Z`~@A2#Rx<AbaV!x*eQSTt{<e7&&)6lGzFN`hSM@J zv9Nr{r;6hOoDNX?6wKK9xlg7n0it4V>F4(Z-#XWh@5t?NSH-Cr%5l+PWQbE$<#rdq z@JA`+OvVfI54vQD(^QB)6aCm4k1y}mmS6P3Y$|O}QS<^#0@j}>pxKj8EO`K*{H@zh z+d>)J&R}_GO6O{l`LEtjg63Usz77=$pRfIDC$25uKUoSN`jwyI*IQHwJFZ(x_bz$( zYIqp_5P}HjYk@B=TdZCIza`ZJSKGgTOYe$;uEgi}aO|Md59s(nqbXnHP%#Z@Srm&~ zbk6D-7Utb#39z3~2w|r-n`}Osvrr1zx$>3Zsz=-V1a8y8pOsN+uiWQ-^U3+;$jEIW zsgm9$J{OY-KZ+Id3*KiM);lXLcOiRO6UNI^XeJq06s`7GdEvko<-S=Z^VTj|*kf|P zF_M-a5B`?s9e;KeM>kQ&lW1pUGx4NgeDwrq4y~{f3Q``IIkyZ0x`Hrh>ki<avpRD1 z`k7v~$?M4>38QJt#kL@e;RUHx3KIww4B^O#%bL?6OTOv@&>96u%8A`v(<DsWhzW{4 z)_z9MFKjOaNlvu_y?j>`aS{~;A8>YEXt4irKqPvUTFGiv@{v0a@lY55w4ReB$uW6T zr8tq-H;zggcRp4QiE=%pKb^03sckylM8!*_rZ3m~(lyV+Xf+d;J6+~T@BG8F;m|}5 z39P}1$**ku>ZCA!w6YkKs`WnNuPRAPxzc<&=N6u7u)I~~O<q!)F@W7jtDVPZ7Jf$% z=6xGtTFDrAd_XnddxrKU(Uyn7yuWC#$;9nqp}`*w`(vd?kcW2Dc^c?<TjRZbD5D3p zb6(nsyf4hFCMQ}ZNH+8Xd>H7O>6e-DYCX!5u;<5;p;;hIC4gXW&KqYni6ed2m`^&I z4<OuP^ktlyOE~qv;%RuUUe%wMRzE&WLBk?@9#1w~QJk1xGW;kscdwKG=+QdQEOskX z@unu_D4w$ko}<X^kOd}AFbUbLi{D`Jg5hG9_W3O8dMZ9FS*{)uB^I5%cQ=InZ0v+} ze|=V-O)fzE<nh%Qr{Ql1jEO`C30h>gW?2-C@SAH^pooj9F7P?+q1d}vA@&Wi0V3`F z=>@#AvS21z`CIgqi#)rjxE)<W8d0ARzW3MBxKU{_vBX2)oAKWx$CPV#(sG+T*Sq?G z1S^lixV!|km)CC|#^3433RPE3!oPzJv)E*n{+i5rVuXk9?i1Io>lsafi>BI$)jIoG zuTsveKXReJ$h_|DcCBCnFS+qj4bRZ<qZQWWivWSZboUN6loZ3kew3(}N)ZqMl%O(E z;{c(QUft+qNq2)|`pVz<FvbZtqU{T{w#m<^Za_RZ@D$tcbhT0*Hb&RQaDZC=v)H?E z?2D`M`q4Icu76p`lBGjI!pP*-bwQnMejhMU?_RWYdT{T~C6G{{eeeGzX0`&5oS9Og zoaz0Tda%Ts^nbC$n-u++Jexo4+r$JR88<6tEGsgg=4@}160Piz27vxo`<+fB^3pUx zZi?$=yJ=z$Ddkl(x(4eZH_z0{bDO-eSr#V7(5hL{vYpecL63>qT_Z{J0&{WI?7%8K z_C;lf2xPFdv}Mo%O`zD+Mzo)`Y?_zuj~(UOC=v1~;;?HB$Y{6C4crZk?6i&h^7-b> z<lqG(b~7Rf>bs6ha{wP3S*z>iAh`b++(9f3b3SZmKimcFrXIQ=Vs0c|e^Ki<LH!u- z;t&iObO{RM9E@Vfuew9_@(hxvO0qC1_#?LXtCa=74A;>0=g;^8?2OBh<+oe<`6?i( zA<ZRA=wEmq!WO5DTTQ;F4r5d#X9~Z1cCc+NxOX?^0vinDh!Fy*0gx0nxKXQLj;EtK z%gMKJv5KVBXBD{vlyzP|U!SzYhs=0FB^Te{$;}OezFE)QnkXNIWlqt5I;XN}-T0Lt z?ryJ=%?pEAt_ou4*c$l-$LJnT+G%r1FKeNMa%_>t?vVp~A_K6yX%9EjBB<H2O~`_3 zZRhUO2;0>h@<B5m^r=~Hnm4Z?l4RAT>YK2hb(Y&N;!G3$xs<VpfG(ypPDsi9aQ2Ff z`zi3ax4fH~yHUsjC)t!oM0Dw{I<AdMR5Z~^^^ncSNwCnhKg>Qr4`IL<H~`n--LpoQ zHQq_H(2ep1sssMzq<nXR)U!Bsu^vm8`AVx&TZjwPaY3Ur#m+qSj)ufYi`&+OY1EzW zPfqhrEpef;RA6m3YUhrd<oIvZ<G0t}T&eh$CF_xxkD&UgQ9BuoEYW8N8C%quwad&b zF+<)JBnTV9w+RB1L6-vhHctKutByQjOpe^C?zE<YYhmSoM15PfuikhuKFw7$J)<dk zoOP|j0XPJm5fXd%7Q`YjWJ7;=^a!!Q?>l@z4HF?ATQuS#fqZ01aGBY99dudU;zM%7 zgbjY8I#I+EpnGE6Sz@1=sz%A6w)7mYOWoyqUPXMjJrHSzrSq7w{%I?3E+O$%Wi7p& z;M1_z{q*@-0W~(dG{I$;j|fZ>A`57JNe_PT>4ddygybFO{+G3(e;48X{i>VonkGOj zwt^$MC*WaX!j>`$G~4obD@Ny0-ISndfR+;Zo^C8eFHH>x&z(D@0SxN#UMD0E6)ggV zp8mKAt*!GK6Kz2)k1w{%`0IMvy=oMwI#WikG^tA{ZW{Tk2S616YzVk-&o$ISCpKhh zrniW5^=s?wP8+ar+wcoLFdS;fZuQmB1Ue}#VJaJ2isA^iy4vK$Sx<BLHV?As$O>b- z==i9DzUo3pVZt`HmpN~?Ci4H-ov;3mx(6cxlb4^l&<+MU|B|q@`S8oubnVcXlUOI& z1H~^_lrlYbmxB3sLwcfWrl(F;t#XL4+mn?Fc;p-}AxRmw7cP$)ZKrE~lE~KZOML0K zyy&iY5{^r#pOfhM;K1i(o%xcReEmvypxQNr;Vw|YO{<NhisN44q~4#Xu}k^LYxDxd z513W3m6mmfnFBAJ)S?&Fy<I{#y=cMSiUG5r;MpYJJ#G#U)9cwslmd{|w*-cX*YToA zbIHhI<WiUC_*=&y@~q+KBB8J8^(vFA5a25H33@5<@<Q9UI3^~g5Liar{N|*_>(*{? zlHg!fiI4rj)=t~?tz4D?C;#c1fKHQ~scpJ?y;Oz1tq8Pr$58@!5>~9;m`nhEh&H7$ zAj9T3oxN4+S^hsK0Y-;Y_E1e;Nq^p=L$MqPgxrepU-wA5Uut|#DYB27^ATtMoa1|e zPkKf3%|d2N?5G5Hp-Joa7X1xDy!b}d)!C_PzFVk^lU=@~h%uKoU^OdttIB5n#g}KI zthO@D@{EC~Wd7OmiQi<hQJv<)qFmSXsjf<WTw2q2S@DcJQT-1?VE9jxVa!V%ab_`w zKXb7y4z;m?NlA0byCVH&onT^b?#ld}W%k>^UYPy%`omz&Y)9%Vh5G-@(f{s5^B=FG zym7Kgf|M45V6&`OwL>E33r4$YXx29MLSVDoeLrauh9^qWT@}d{58f?J8H!^jNYEGy zS{8htg+8fFt3PkaiCQ{!x-R9)NzW<ehi$wlY7{6^P%L$M9~j-ncT-Fq@<`kcAhf~G z+plso;AXQ+n0JI?rE@>Ch->*k4?HG%575HGyre5HONq^l=%)O{pbW?%gQJ@0uMur( zDUe5#iM>gxI(;hx!t*$TSpl}~Mh$NWtC_ht6XpP#`U`_(f8nw{Rjp<@&&7S!z3u&4 zyUZZ;(x-l}_ba!6+xhWY+c~mG-@NjQ?pGZiZp)GEpuLMTbbj(k4p<X$KHGMmsG~4W zWTX)WQ1W#`nBo_c)|OPiQz}yk%sWZSH~IWvRD%f%grmHl9z3ssy?`rgE*yc3)V?4J z<5$xj*D$&!YM+2f^^_Y3)xI%lKIetv(QkMY_H(ybHY6&*54ei(=vT0G>a<=w(yFvn zLtU#tgLo%fy2N>Jv~PSr!8M@@=D<{gmh+w;xk`83sGdhr2~CleY&`v}N>#t{IfbV% zK}_P^S?&Bi8bkJwm}C(2tyRCC9ll}t3q)qW4qIWoQQ4n*5~!Lc_VXn@RDFwCM=6`X zgcv@gA&D6)8wP@uUR;LvCJY{U!U%MJnp?1Mvha1_lgn7w;>deGcnACJKNQINcdl}q z#%XGeyHg2hNysfmP@0_mD`-Gb`f(VO7c0lLFy^=YtL&*yRl(Y&=EQtaW_RGty%gLr zNwKBd`t@edmjbPcKRmv9AAEl6`epyx8`P#V6T7DVAp~P#Hvy*o_%mZB>bvSYBU}KK zz2pAyIOqd=->kcEOl+QdY@vyIT<yFUU-;m&{7-YYKn6`SDdBhqSy15OXU%^XH~hC( zj^~Ud0IegOWw{J^*hg_tpxuTW<Obx}8|dCwt{qt(%UR|THu-baSvxIdr0H0hXtGk( zFfr=2!$m8XZOV-05n-Ojj8+;NooLs5DEks7KRvBt`?TKmRP%@YZAqdlxq6D5oRPho z6QAE;A_61%kb`0@J+;PApqg+yt`{rKKz7yWRxqs3QmnnRZR3EK@NM=#jEHC(f_;i; zV{}aSalX+L!`x^KMv#`MbSa_HXLuDj!ZvQLn8b(HvE0DFuAk<8-`P&%5U_&dL<}bL znfTc#tj>ctmLMN#a*!0DVGG2<_=K8u#*|cvQ7oj)_**VRk~FIt3?$AmJ@=N&ea?5u zlf>P5Q%K3=^hgwi?WS0aodwfC)s&Z|m7Il0i%5F>&LjsZE35oue2U%ROyf;vKZoB= ze7`mp+D0etR-tb<@403tJB%H03+b;LNP#lK5w_=BmCIYHy!9(&^~XypMMI6~7UpnZ z{o@LgZaG;su%%n0UBj_h8%)z#BCKoP>+Oqw8V(tBh+}itH{(WhQQ`*a2TG@6f437C z5jlV}m^@aXIXZZ|oI^yHa+(Kv{yUIW3HN)?HhVmXL^^m9Z$Zm`duG@lWYYsWaYWS? zX*l|gR)LTvU|IeUcD(FmshQ0m^YmXyh>lx~Z-2cKR5on2UP^|82#f%gw7<4@5d1hF zDPv8CUw2>L$N7zWy2`T?2bAT#uj5>8*Gi0>Wp>S0uUb532{}m__*?XV@6R~jdW&9i z%>33n<xgD7`Gecn2I_R9FHHSY{^#=>@EFKLa&2nW-5{dQtNfS5FWSa;udH3g25$yF ztw4AxcRd6v*90F&>1D&(tj%-j|J%9!FQz---yD6I!6_!tDo!X+q3ik18$(I+%~~PN zP7w+%jjkOiFAR}eq%4wckSg-V*ve)TlOHC<tM00MT3t@)Mf)*QWh^-zq<JYKqrL10 zt<GMpj7U)>B$r0!1Wtz;xQj2nf9Z}oh+aiaVS!f_v}|q0ZzN+n-+Btdg6}&lPZ#uK zdk7VBs99sIOfdbig!s)?V650_rCKcC^j3(S;?WIpJf-g+51f`~rNCB;DTxTW;j1;J zHQA(bzFLaCV4-CkFzK4$u8m`BwpRSsrxi8ssSrGy{AfrB=f~_GIKW`{*=ff1C+pp4 zYRvlus7kc)kwWtw5Z37k?p|+5B|l;ap@;9xj;LmwJiQCIG^l=U7wz8rF&YLWI;8eH zGw-h7s$)!*nXlTIy$Afh;`>10mZ`bYThPC!H62db{3y`OA?cySStDarMi2_myxR3T z7$J?XqXwh>_2-3J&+VHrI^t}hC6!i}ww1S+6PsC#QEyg?K|ZiENO|e2v76@pK2cqd z`C3}Sx0dFfp2jZ76Q~%~Qd+-CExMNKQjChzh>8W#V)dr+ls=c(0a-EFJ{Djt+a3V# zt6HOfzr!dJBo<k|L>4rQ%8?1ebDp;2M0WqkQ&9_EP^wXY!Mf_dIoZ#*%%+YaEkNTD zPfK_Syul2hta#lX*T&TTzO)(fnZD)O$ZOn&;tPHTh0xsbr}1B>I+Ws_fJS5$Q{YXa zTH=`x!p7J?-^NJ_EN#t-N!7}$@SHHB$G=T)TVt`Wv;Vkq$YNXr%BA|@o4~s(^d-6t zZweo~7&Y3box3Jp9+4N|6Ka7vtSa*u8JL9AMD!JOKKj?*fzYSEW#*8O)e0bYt$6+O zL5h+`cT^7XD<aWXzv}*^Sm-a00Vh|R)c*^2a{9m8=3zB0UKZh39!jmh_cv!mY8l3z z%6^-sxK?3}x1yas{<fg|!8iW1az{BTGIDP#n#_;mReQA5$Fi*BlYG6XmQmc;-H&5* z7@|@Eh#|^4t5Of&SF}vmYummx^`Y-8^ORUGMZje=iSYV7PPIt6I0&S>A;n!ak^mud zEDXsdDhGnrbt5f)taZr2*Y@a^kG!IZ0#%xAA+CzK&U6WP1@Vx@1{%Cgzh#8deqWRM z1#$#diYf<V{Vz@w!2XtC0Ktb#9N*(b2xN5oU}JOzlt6rR$Eb5p4Ui5%Mj!4IuousH zu3h51A089DA#|OuqH9S+`Xwe_Xt016!~iuv*GN51#ts>urh4zxvrYFERyZx+JUK;` z7ANEU3A9r7J6`mDrvZW<d3N8-)LGfqn8V976{`qk$mM<7g9&AGjbNf(p3<u(B(YAa zeylp#zkQD$#ew*)-o0OazXpW06^GY{Boq8toJoe20I{(M!hX>z_oFHD0r-|;+e2|i zr}dr)`Mb3B!mI>+sW{u<>RY-jzEh|D0E8FEH#dOnQs*Jbqp1t2vn`>MlQsRUmM|J} zWpbkL+5d8+d1rp}D);j^&9aW6MBw8e@%_2?f6`s=`kyd@X*!;}$p&c;LLgx~TW_du zm@fX~1@J$ku~1-1u@$1c=c-JuF10F_{a=?A|A$%$<N2#)9qjC~kF_q$$sH(FOX1RY zKMRa19Xq%(09Z8hm$L8P69tJ?m6N9Lj#Uzxkn5uDgyw!Wx^_5MHcv;>tc}m=jcHDV zaA|WZtPQ!nUs)i%sUXdu4!7&>)R_(Y5fU4>AO0??{2*VBR<YdvU8LK(etvG0-&p0g z)zK*&j&Cwfg|?H`pks9%nHrPb3o2Kn{459Mm7cH*<TzK=VZ?(TFUbB;07yfoN?X&J zYG<6k0)0-GD)FcqCtz1&bd5cO2H-`SIiCl(&yME(dlCiA?}v6Ubu-^hFia+uTTByo z@0}>u2qDDR+F(sEe8BiMKm^5upq{R<;F8u^1etF=z}jHdwR~I5l{Xe_^Y_PwDn$9r zSYA1FmB?nfde}}3eVF9C)<<QPY8u)ld`l43a=OU{@pb~Ki^cBQa;7AK(!D%dxuM&{ z?>CUf-ajL%#Wu;6Jk+>y920nrZcw>t>Ljt7Hr~K7Adk(mTSla)kf%#{R&X00f3+d{ zx!hU!tWaxj{&Mc#2aVzi$3>YGqhz^7&_5uAh9U^@7d>4|qenHMvzFdBqs+S`tZ(gm z%L>$~|G{)>K5@_nJmLD+-?p3JngY_DO5Ea{0P)|C)PINU|24aW5`#&nJ49FB6O8aV z@SlGF%ewA@o-`v-cA3fQOH1mTR0({xH@o|W7`y-@YPbG$Mg$q+2j{4&cRKj~*?ru| zq*d$<#}=-uJ3*EHLVFA6VxQRggyrm~f}Aq{j`F7=kh9DvKU*O-)gPRyNy>q7Zp#I- ziC+~`;$-N8+?0{(bms*jgW$Y@xXf%GY@rM5HatQhEyxu~1U(!On-0z4b3ND{)yAbN z9`t*qFwJ^PDBcZWxcZ4Tv<<<L3IcDEgdIu-zTjzbRFtMWbtT0@{iWi<+$;Zdcau$? zl}XMX*5gG<J=_LbAk%~c-F#$RH<JHpL~aq}2Oy4jhk_yvL6A}*&`uP{Edu>h515|J z%;6jEAmYz-*B0)$C4AG@kc#iB+kA^J*~1+EE>|I0^nB~QrToR2!x8=3pgIenS&${O zI6$-vHZn%lAR7+thK3-Cc#3i9^pl5E8{p|n<4tr)K}zv>FQE2hsDiK+%6D*~KyfSp zy*M@}#R4>`$I=e`M>r3^{6pyO-Flgn91-x#w~HLWbOa?+U;mc}9@ynS_W3gjNHq!e zg6$`&prXS+m(>4I8~)>)-FScBID}?N43i07wD&g;EM{qzt4E2+_{cXGP%Q=d3}@NI zX8K2QWjS@bzh$$aC>>9^=*a!TNz>(3ufw&jO7#uQySbnBSb;9o@+R|Us_Ogi3f}`= z@{l|){Kw4OUJ~pvHhCQ=&~4hA(rz2yHaUJeqzCSwdq{an*Yyxz>Cd@xYE;*EOBhh_ zBB8mjE@#qd=4I*|6u2gvl?0j-{hZ2+StluA!H-KVWzH@V0S{NLxBdhOW{^bMD1jME zEVJip+;T1iCQOvOwSU@vs=9Pmv2GP|HqB2-e(g71sQZ=AqLqZg!Eh1tS!col9?_=# z*#{Ony)QEx*fd-3q8k^ax02>Q7Y|}rd0?`6j*D%O97pgN%XqbNw=(4v!WmO^<V|DE ztojpqTQ3@hx9>ljZ*-5QmGTi8lka53V;G>PTQ#GRcKoo#>Pk2S@YBUnb#XQOrd_sa zPQho)+K*IrmpbzR2xO-n)+YBP@9)3mxAMTpo2bSEaiR-D#a8-BZLn{*#s@bU6kX%4 zbemuerwA%Viufad893s`S_ZrSxzpp-!8CO8Kao5C-V*=&E5`^BkiJ;tlnvVIM}vWb zGXD$4AxQl9Cfpr()8ismC5n_rrSt44H(lylezS5^xYUGvnw@TU%P=vfC}%*7Ww}r` z#Z@tCaeQMrzg^xlsz>bn>6%`Vc3V_idDAJm&4)DC(v?(7pi%w(gf7UBlPAMn>@>0H zLs~;@3++e9CKL8FFUqNe!EU(T4d5LREMs9lQF)Q<-V@)~b`i@~N1G#VuA#d%h5M)S zHjQ3~Pw1vuC}e*GpZ>d<(cAl8)?)?bsh+DzvG+#CwwVAgAlPN>i}?u|8`w)3;I}~6 zuNiYb|MIMXBq$t&Hxo-8!|B!lE%zuXhN6Cy@N47B2w>wB?(rGZRs`nybW#0OJN%`# zH*OGDBz5a*jqe#ztgypeD8az<uR3uC_DVfoTfkxDPQ>$avnQgC3vU6;E!+E%lNrHw ze!jn)W4XtwN%?+_J%jeH^ue$1kHFa4L+u;ep8+)iA*Qllii@6RWe<oo0|kimJ@eW+ zaKn5R5N;*IVQ=-*8tqge=he)9|Ii@{{e;w^X62t-Yw9D1t?97vzX(Wkymw<r_YHRr zy-h3Co?f}d%Q?SFeRjk9AgwF*|D)_XfSOFV_gxzbN)%8~N<?Xjiin2ZM5Rd+X;LBr zA|>?D6I295s(^qZ9YpCp)F53%Izk|HL`p&r1QG)O7kBsG-MzoPcmFdulQ26w!}p!{ zJ?A{<d7fkc$UE-B9!`nUSK68PqML6AM*z3q_j7RxP4C2=RazqW4|Ac5OzWFSL<)R# zm$RQX)H1~zSL?dD@;$!CM|z3=|AKV?eT#%E?_M&IPsm4rJR5Rm@HgD!Us%~6=f>cd zPklJ|a-}#h?E56YTIX-aWN92&5hskhRzGOR0rs6-q&^Gv)bk{eoYV1iO&Lc$S&FrA zkK#R5W=;{lbscQE0acN$t{fj(GmF3a7D`EjPy^Cx65A+UwMSR7dLW$1>OZ#`uAS@; zSYC1@*d3u-z^xi9X;+%?vTI9gUXI?l8HN_@M>n%-G|BWGf$)fKol?I2p{R|mf7GVA z$~mrIq#4xbaIE(V=(<%yImD*`Y8448hw<3%ivY>Yy7%!cW`qLAkAezvx0*d+&Whby zX`Lb#brev*e()~<TCgF=14{Q;5DxS^1790`XnxcfpYxz>kRoZSMt&2G;~jl=vC3`H zM0~ARJKeONU|Tv0$UrUNe`h0k=*E)+hj)ugnBj8oM>u^bXW9%Q*M{c+Jxe~#GqCRR zM+(@|Eczy1&oDx;kO8nJ4NSb34=hXO0%Wfhff=@=Zf#B{T7VU=(dI||2tIAskEQ|j zxIf@H8`TTx<r+EF9$@|4$O?ZrNjp^3d{s*fhynI?0}f^Re2K8fia9U{$k}C8=GJUe zI?I<N?HFEQ|3#}bIQh#(tw^mU?K5U7y1eu;fEwqyws3*&PV`uUH04XJZ@}FHNsro` z(+pO<EPz|v%FK&bt~sx*<s?q2zVTS!HHM<!QoLVco2XuGEh?AfGJCf>OGA|UDIvfR zsj2ywc=>B3GbX0^vx(Xd>X(1mM9JJV1!~^UrQW8IqAkvyuMP!E*ybi;7%LMYYsKXV zy?|{^0b_Pju=9LpvRpvO5~wli!#pwVY%`jjuGB)6>9!JWHO|2gshWj(EQs%tw6mAE z)GkWW#A5}eho8S4*=E~Em)G{KtI79KoD3*-OBBNPO2cinull>nD#IgO!SXR=ZdyWj z33oICqt2N|ozU+rH#hCo`e1hFa;oH`z};ov(VlC$;R*qaprlPreH2upxKP!o!gBk) zh&koby$|8coF;1E;sz^vt$N<)w2e`LqxPGx1wD0iOIEM+iDre*pTxk?E#{B#5841b z^y>;?9?D}}uTcuJ(YbRgG_ok`Sc&(hlgDbCXm&^Wbb{c~)7OgE>}zPZf!pINCSsMZ z(om+3%~O}w@%jJ@(hR@CG|T>}lb5)TY;sdMK6hXIEFg{Ea$es^76c2+cs(j<54Y(c z+g1wU<sM-9&k@W(xS&oZ4-~zTd{O_(sQDwA`fx}4E6=B|ugqoT;R-5{BIYNx!#CN| z7Ti^<PWg51fDjb|1-(wD!g(z*9rxbfR9WG?$Hgd|2?ag%E3!WWOw?ygMjX>L0K}u( z7AuvD86HamMV66(y`Th$j)1?#_j#y%wL4fD5|FLV(zJD7%B6-wW-I0hm)J#VMsX_? zxSp&u33C6wvi_VHe}0pTmfH=hiECgLY*CZP|6W1#gL_PY<#yA#aGT}2COf?djyuu_ z@a|t1p9?Lp<J=Y)5u<2!FHi~@m1V&@=V3rTZcfR7q6!KUP)VU4jz!X_WAzgms%<~k zrrm=B!#Sktj@^>?Inp3uEFPOhrj*0_jG=QwGSx^*8lRQI#TO+4y;?UqBzR2F5_xTT zZDQ-=2<=6cV?N^nduOpmvg@~e215-}t|+B|Ek5DE6{&S=bM-s0UoHgR6bBy)9{S|7 zLyM7GZeWHv+ih4bKNbQrpjY5h*eyhIm<;Un@=Pp>h-X{p!8)(0^ca)kQh+{1f-iB| zd4&Du#+Wngx&6>};D;Fn+yn7MgoZ3Fia1h@Kf0Q8uIJ*RG*)95#}{G@is8{U8xzh3 zCDu9u3t*FQ>45($4=^5U1Y-jog`{eo=u3utyD%3Gth=^V#%f3jcQZN5o8%f|a=~a{ z{skN8f-lEuZ9ZeLRt;q0{SGD-U%<VF*!rf|AG6vn*)g#JKvnaO1nK1E#j;8DkNO2E z+%sI)^uvy{GTq^Sz+n62dg1=mC%x3~ks6-?O<?v>hdhnauLS7X3afjSw*cRw$iN@M zA$DxVuLD$hr>wmMBl*;>vRyp-(RYl6KD3}NyOjr8X$nBA(3V4}9A5Wx)IvkKD@|+K z#gDbJZXdJ?|B_cRcR}@mZc2Vobl-0+ROr$D`7CO;Yc-w+pEr0VU<9n<PhBfZ+)UpH zBh6md1h?y{o?5tvj&%9*`=&zk<-4b@&wY%2$b`J0{~^hPO+^~t<|TaWEi<Rk$OdpL zR3axBe_u+j?=Dr#aIY8n1_#sy`WnXn?my1MxjV?>bQ=8yEHGjSy70fcJNR?C3t+T2 zckq{J9(b=-=k0jc-eK5URB>_})+kOZVB%xIcZOvFTk57<zyzfXfmv8fZxbx{NSLf| zpIHBebC8tLw&r(~(z`VSIn@?ME5nwy*Pc6~$WmNnrgXCZ;8j5s08TmHZATI5B4m2I z=xCk{h^TyL@BT#Bxy~O!!r=l-$+A3VA1vPq8nYK|S4i|3v%B<GMj%7gfC$O>4W5L& z^9Y<X9G}|4)gIP2SH?XCimf7Z=zN@oT0fiYjy*qH2YoF$!;qm@zS_QXYQo0v%7mR1 z%GqSMAJ|%MhAuyUKg&>eMX3rPQW;4*!I#hYoD&o-Jh0D9spgr-Q{qwRvDnnj%|@=) z3Sg>a`0z^0_s<STzD5anUrf}Aul!k>@96H&=TN)73|CES{tRBO_dK#+sUA!|2a0}x z#!;xrJ9cw*I;K{EqP$x{`P6Xl>Vjj<!t@kDH;`wk8>aeS%WbjkW11-rePS7aS$29_ z-ZJ@rG-_`G02g{A|IN|Q1q%%9Rb8&ib)8y^loWO8bS*!nI+7nFk|jp&EBX|n|Mn3x z<4Q1Nw|yQU%e$qY@mz?3C=itm_7FOJ5AjsVJ8D)2>;0JOVy16-$6BV3l@VC(F$D=x zUjCTQup9-q$JmF|8oVp=9Y!wzhFp>#-Mxqw`^FVGNee-+^;@zkgU9!AuGuO^lFq%s z#a(A}>=YhZ>#!m<^Js~=Ee!EV+MN*h-pFrTun9d^TSt(twVOC1WLTOFrYSdJc0+8= zeHgI-P4XlQ2wi9fzb@qGqk8IdV6T2OU#j^K<?^Kz2jD}I4sNx(We(g1<xa18M;~=0 zsL6e4R8R+`Q0PH9kO_DyJ@$Og9j=_ptM^d`sQ33MZS_}s4={YLC?S~F`-hlrqeDhe z70N(S3@o_#zmP}UNX~(oHu&7v_asX)ca`Xyq)4F@3h%=`$4}X~V>V332bmiW#Oi&} zmsb}{E(4l#jrDD;9$3F@+c)wGa_UC(q?F<hy~2CSR^KZ8+61JMc8<BJD01l*N#2=; zb!uz^Kd60fFW&~7LPR48FdW@tnaqep;hq?=kI!kwOO+nS+Wn8lnFDa)$Ngnbe~e@N zShB*cpcAiken{Y}Jc1tI9(M>XPXDj5z_GYne%rh=1*kyCYEseP)!o0<QBS`rd<qco z{`}S7+=Tej;)i<7R{+w?><f%Z4Ba+?Qto=r6FXekZy#}`Rl^#R@`Y691dOGTQAA&a zZCZ2ekfw$tkBe<wW)5}s!RkrT_7ab^k!>Tm;dH~<BQo@^KSFl5=cObqlo-|@m!3C) zt{;Vi#-8dnp9{Yxi8@n_oD&!jr9K10@ut*vn3*!k;>dhduXZ71@VqI%a4a&l5RgM* zF<sC|;9{*wIk|{T#8%tbzm)Sl2fA0%?R!-1Um5O7TzmCXehm-6a*mfMnF`$*<{Kz7 zYl*)beaZOpVwDIOC(oY&X%8bcl(|n$S7v?Vih_BYVAv7p`Rms2&gq#L=oOxd5NzEY zVcBDsOL;%uo&Ive|D6Q!mAvltm4dE9+X1J3u&5<eaz~IAepeAJeY|LPJ4~%d_JsoA zWU9~(>iGqn=CjR;p07u$3m!L8m!)0XT$~qeRpyVMA;sPu#-akGmNy;`6qs3l?whE6 z<g_ks={MMQ0bgntgGC*@9V>qfOURY{{<SDGV1SWRO2EEqI~oi}!c0A{%^7Ry0f)Ie zFHhYqz!0xEdoPr;TC8P$Gl@jNUAp|7@SGTxP>!ur=L;Wh(tAwLlhd_hT(SLc>=iTr zR}W@(8k{xDke-ZPK!D5T<bN%Vo}3N$IOP7K4ifw33NXb%`f{k=z5E#q=4eeUU?8TY z2rMmX^y*?Hnv&-;QaQUzdJ<i2mt2t}5|hc~lXGm7>wXfU3`~C5^Epv&Gi;N9r(-sw z%Fct#O|-!v)z8$83Cz@oik+Y1?AJ`>cqe0r$3vdwGbhSCu5=tq*YLUqZx7lAlslP$ zJiQJ!y>3>Csw*;t83=MivrwaSmLaeXW;PQ5YpLxm$L1%8>}?tTt~8r|(==&<x>;}# zrM<t9XK#$LYdO$gD5AHP6$eTP0xi6%>bm^@I$6)TpQPJdrT4j-wxbV}imY(YS3{<s z;{<9hZs<f`Hs))5c`|a4H9<(yZ6V^Sg({UvO!-B;q-DZ8bkpn#fNR;A2#n(CP8J{0 zKW0m7^h`Y4Vr=Qpq4h=W9TV3GT{&UI5n5$VGsSgE2RYRgmmA~j!xhCiUpbiFT+q}s z=N8I6o}fiLLP!`5PqFFCG>slBIPN#um~P$@nPx*)f0Pqt2u%0{Tcd?yF2$ANzE*y| z;!Uyo24twm3(++HPSVb5B14+Xo2#WqyX^t1<9lMw&MSa`1$b)?VC?O0_F06#l60{> z=Xd9z)v-X!xYaT*^5ye-rP<QtGa)rQ2`znFR_>)gej1)1jQr_${^&9uGaoMH;jH@2 zT4xGOAg>RkLt4QKSz^g|^@;A*%dhZ94xhGI7}|_JW0cYm=$bvuCwTqGq@t1=wX@=X zV3QosUoS0?9RKO1rNDyj{Q5n~<LTB*wP7B*IO`X?F+>!|K6g;4AAr$IH{>};0^xR& z*Jalm#nz|iOr6*A$Nlz70|5{tCq3ST-7MJ>`g2tpi#@crzKIQtXQ7z33ijzx2<oP( z;_-v2OAPPZU%zM^<0(pM+bi9ilopDh+^C>cxb_*(uGcRcOH%#XQH~sX&0<{p20v7K z_9vplvm=Rwkn{vBu~`EGZQ3RBtiNk=Gn#A)p+9}TW~*?|*`N~~Dp%>%Yfk=&RR1(s zaSR6^-8}B+JoSZlAKhAkd6$Olw$X^sPU^8JKudoO?ERH<hsrN*79+EkE>`f+`+krF z#^;3qtI;GHt1U(`91TRSWnSl-T$<#rHvDK)*gfJz2#KD-V~tt+S+qHMM(FO`Hjc70 z_H0Rz_A-0PFt;nXoE^qgZXRG`*Ag=^I(@C`ey&Y#=P`SXY7N%+l2u>4;ERTTSrltl z8<k(}1|(*2@0t8!M9=xOFkP#GOg~;1Uk;fO^Iv2h7al5l=V^W2swX#n-e%XG+qUWA zb(_9$@b5EBM8n?d&t}n&KNC$XfAjt}_^kWU>6R5R{{{@s9<l_3_+J*$$o)sf6v_@} zUhl4}r~mUFjhh~GMWojM{;~C?y_>IvN|om<*j@X$mAPDLA5x*9?u>K&{8)%`I;OKM zTLi2POD>ZrrjeFRm9rKGk5BeDHF*WsAKd^*(tE2Q(UU53TU**G-XpU_GkWdX4#_>7 z51jeu`!n>Kx3@?{R;KmGKnTku&_9~D(A23u8%lTMGM;C)@Td=yt3f~rn%IHp8P%we zsF66-*qJJ~^18JbtVPs3Z2Yz~`7d^(r~LOsSF{Lh&A!?;12OXIRcRpi+IGPXWVWk1 zj5~;np1o{VTJ45`b?R}y47GS}&`~j;)GJr9n0;LMjca4_i3_pw($}Wjzon@b3X*_$ zZ!~B2I$bp;!UT1f!iDpRwH+)z-`6RJUIyHc#wk1BwF7+TmLQ`YQ8DnhY-El}ZhAeD zn`5Q^hqf}fJ;)0K9p)UNJW#i5Jj-AF8>qjv<IUF+L1FgOgx4OJ@ZL!K0mNLF)D|l0 zO)Q7i)@Kv~>hg*nk%5;&hooL$op5rt`hQI~p9;dB?7m;|d%FcOM1tW@$L6na5TNu) z?P^hQ-(La(6XluYOI8=)qd)zvXkKM~YVK~97a)sD^c-nBj2zTg1PFEe=r<2kO385S zW29|yGg}uu^*txTuAMwsCDTPD6-C7RosU0A<cNxRgqdHToEvYI(WGlR;To+!xaSaB zU_s0-&UJ2vu0_Ij$r*oU+zH#+qYhms%o&I-aQn<vG0`3zVd>*uekO$YP&7Z7tRTPs zph?sEwkgBWks;L!X}vH1bTi6ToO_ZE7&uKii(4=1L`OY+d$Ziizs8GbByfsyPweT) z($QY9>FbU8)Dm1bnTXN?RWI{N0@H2DVuJOdk3RkbU1K=alR~exQWIY0XQT@lmE|7+ zwyhPriX%X9gyn=k2NIFpw+o!e)8y+ZPGg@ESAfYULU+WSj|1o_2ZCO0l7}(cN}mRX zREMs$OAzjqS1s@sf~9k(q~~_dzK>|zV7Y9h^zyWm!_&Q+Inr^PvwdJA@hZdRIFhKr zD~#=c^%|Ix<rWF1z%8fQpOK{f1!x_kJ1=6wxrFmC{4Y2!_E$KM<^PKl!L!%w;m_qX z2OTyvyAu&geWnWB9ymkGi#)F63bdUpm^jJ~8XcCTrOXb{5r@?7z>5cDxAd!Am*m9Z zI89t4m|>q^B-OKhnDhf_T1OH}*(^ye@?*BdzvkE@foX@OkIE5QVZEm`q<JY1l-ruY z?go6AA%E>jR3$pwi+77nArAkDlgTxY)bwNzac)TB;pPe<2qqL5i!HXfZMx4~#ZgFp z?%x!_pD~{%yH`KrXVKaoCNNahh<XMsLl4+H7VBgsoSm1DBC3w@Xl*PjDz*UQ_WDo1 zIFeo|2Iw3A=IUhXdM($=z2us8uV$(JC^yRU=nL@9KNyuqxDbc>D%R$uH317JL09R< zIv9s7PuvA$@i=aApKX@zd9azle4y||;loCiH)}n_7Z<BWd;>uv&{3`SeT%``qjCwc zI8>nOxkh9yoC1Z?<(e&~kA{m^&zrxf>-rKdANHBD#-3fix$lQWmSgFi#PyJ>%_hU+ z++Q8QZ0peDd;h&*<%sz;-vhY#ALjcr^jd7}74qIlc;~J)31QOGw|&jg%&6LtVN=*Y zLKux`=mIoCR5fzruHs?%$-eW+mcxS8!nr~SliBsBA)B^65X7QCYOV?!d|283!RN7$ z8=H>D$_f|O6yhTH)V@Z7opydB9VajOn<e>(w$IZcLp7=s8`y|+t}K}OKAJ7?p~uWK z`E-f4G>{zA*;^|FkLR88b3AD4C?xoQyjP>M89p83(vOBHyRQ~3QU7>9=cTvQlr}KY z46Dz0cz>!jCdN)$;=KwB+I&OFpxPR#PuwYT<8rvGW6ADg%20jL_~kvV>{o0I(I12h zn3*dJMDG!q1Rwmu;uTbI)9hL)?%^F7vtZ$uY+eU$6`Z-1ro<dwSiC6ZhVmD2TO_s* zotI?j7<ZeNp1w5wj#>jcZ_Wit{`i~Y#%`SEiX2G&PO|v)k)m%|OBiR0MF1xTV-_ZP z;gC{^wIika+x#1=6bFvWC+05@Kh;w4eTE3rwzs0HcdWZo7UuzFx7bmr#@c2mvr>x} zbY@)S4t^ig#cHbjJ-5TdFEcNAt%hKp!E`yfoG9n*O2#kQe*2=czD<SVFh!3HEvD|; z6qkCM1V9}>T(=(joO{YSzAaWOUcfs+6}C7X(LVXkGBEJN*}Z4a{LN4P$SyqM$N@x( ztj&&{7jMe#|GS^LFu9jEP5H)dIMw?W-r3zkFe>_bcMHM8<^c$ySl(ZBBSjNxSN|hy ziVFO6n#X?eC`GZ)39!-eUd$>XkZiS`&@-cXRM%cBNdIvKc3$thC&j+$;IyJhW~j<M zOX=5O(ZH9vz6w`_XN?9$o`PJTCwN2oX6`E12uRy@re1Lr)rqGSK;eD55d0R5VqWK1 zo;3>SqfajhKMiE&mt!&D{^G3>v{>XFmbwiHXutg>4;1)2mlhXOnEc8Mi5ts#_*BSF zdXqd?{^lds9|jpyyjnQ;arfTW{kV%U4sVsk9hT6g9oU)|)n^^~%xW>mfHj*os5-#_ z%C0oW(2w<S7ea7w|NCYxRGkSY`SfsvIbUF1Gly5yd|A(Wtx6+#XSp^FZEbUeqbwxe z<;!8+^0aQdvh9;`B9?X$lDZ1m?WVccX|$W;%<2+-rFgrf5HE`=+El??L3(@G18qqH zvFBVzQQ9xP$9_5fcR%_<;M|vqF{U#41x<=QKKZvV_{`ol#WMhL%ZzKefZ_ItW{)6i zW(21yUWDaleka$W<HcJR2&Xgx-C0V{CpRlBYPnLh&-$-HGXuru#(lSE2-HnTe~-FP zyDv@7$t2k92sO?Ag4YGqF^$yGH}C*y>raCdY`**Z9WGAJ_!fLvB@`<Tj0Io~W|*V3 zWO}tyAbrO>fD81D7I|I^IU07jI@p&)Af+?TFI}h~2gdLho#UANIG?}GFi7eRI`rbn z?>}<whsUBzj`40;-dt!3R$+NmIRCvv24iSnp4#-Fa=tW(6aAh0)!}!dBiH)g!fdP^ zb=w=|czJnUC)N7(4Lr(+k<-<%@zlWUO?hgL-O9}apXN(TL`{5Jx3|X5m6ZQz(EWVV z)Tb_F=qi@g#085ODhdEf8S_e7-zfFR&1!&|yUs2#41f8WMI;va^OCe)SCa=?5ALk& zsef6A8QQ88h*27ruQ_ciyVIBe+y1sQkQydsQlDX&7vfu9H^xsdvXBbl#|^s;>z%XX zk16&pRy8pp=&H&%&v;xXY7#3)g={0$D7?0L72;JpCi7X`{O@#*|NRRWxUg4+<#K3! z^3CxHF~+xkzdxscJ+Oa$kfR+x#7hrx6fu~ENp*&#neYu2GD^D?7pZabnCU~P`JBAT zlTGd!D#6O^$S5oql4Y(AF(@z_0DHLz&oSs{<@!JdUfzm6a|4X{E=Fo+OoT9U^T4)4 zW=?+OJ*I+j8ShbnN?9(mdSR0Mjf-xBi$U9+wRDY(t@Z))Xm;VDWBUv<VWi-6=)>5r ztzv_Bm1UpC77$r?-ML41-MQ24DisCkCFuhJhH>GKfx8K|%Jtr0*;b3B7J$=AB`;b| zzjJ#Oo+R$npab*SewOyMqh`#OfX~w~-)mVKSjYBw=8b~w>ZOA?5g%G5jq10<6Jo44 zS$Le)5a^4DwX)K-_Sj8V;{^jeK~Rg0dDP232ItlJ%lbDxI6lOVcl1Mdp^j?hdPUb$ zE8He4;Ig%*4(;XCbH4p>;X_t#!9dY;8fopQA}6YBzG_u{eWVhKLy@;zL=UW;3zPWj zIsm4sWM)4M=f*k7&8W#7>szmlot6(7V!dzOC7x2yD7jQRB()-yI;qSLwcqEnbq+S4 zr?Jy!vPJe`M(F(AMGJm^ni0TAtjz^?ckgDpwi~}+W&gU<{`Dbg`_OYHzj{IX$yz%e z;*GNgu?X3~{{Ehhaz5VEJy50t!UDuN+6{jKmQncQU}vhsk#*x7W7cWvnS+p)q7H{R zSkux|PYTs_Bk7a>jaljjO<Ti&Q-^jsG#!$@$lhzJq_cIV57i>3e)-G6#QYI*04IV6 zO98gZVG5kQDnD(NM;WP~nvMccQ?7Z}Q&Hoazbs;=)n1_k*ec)U-7msbup}=(JUWwl z!f&6H`}oI5%|E52aMrzLCobJ=8KoKDOS!T>^K3N121Owi=3%$KpnaO5M$cvoA1IQy z2Dn_8YJG>}(W#&Jw;S=$i#&Dd!xSM%A8c$9Z!5#TA%!Y7_8Klkm<pA<r|IbEOwq=^ zOKQ2t47--j_PodU=4J5Ct14Rs8hcDRWIfh1oisUR@8dyi;i()Q6ISM5rrgAwT@4$4 z`4x^5Z`^ht^(}oM?-b#lrJG~h*)EAQ$ILCU#3Th5Qn@MzlLI(8vhPbh+|Vg~+(mxM zCA5#u&WyiIhF!EN(V<0<Uepd`V+U#{R>8|_vnFqlIZXD%#+XG`4yKq}LA~&Hdq(LA zKVU5=_x|PIp5$xpKaacuV9foaBX4%gR4OW%|7`*HK(umo_#JGzdBhbIcfACKBGbFs z?RSu-J&iF?gk}SS+!o=z87v6gjH+yKV8B$pXKAYK3qNV2I*HPOfJF%VT2yasUa5Xf zVp1f}tq-;BsO!k^Y%@8j!}A)?N*yi^VlQzhdfnr2!OBwPmz(p@XT9Q~_$9y`$yV?| zB7*%In#2LKjDOceS2F`Lhh_8}y!&l7@1`kTR>hLHrQzK_1oRo%{qBUg#F75Bw>8wt zdx3S*o-PpGb;P%d*E!kut$H##@?X9ztz92--YKN5k2ZtF-DZ|YrG1948HXr;>^Jr* zQnibJYi`q(Qf};4|Ly5Q3PS)sqER)1Xd4w3g^SI~yAn*R#4i*oN6Mss)b$uzR>ZGM z+FIsStz-go-ioxI`@UDN*%eHkggx$L4E(^S7KeNCOWeVE$jFXBvf@-?hqS%OqpwF? z9LwK%tk25tjJCf!!Qtz%`eWd>v1p+h)&3zU=!(AZzIL6*u>(2(rm`6|1VyI$aXO5l zpIW!SD=+<&b1cLx;Q5HG?8b{lYXrWuz`6aDb$o>jz3xW*)_^&taB1j4_T_j<gT)c) zoV4QJg^E>^xTUU!Go^qZ0~^ZuK2(|#l5@ZOi_E5ZM4OYawCI9eoL%4OHnm#}k0KlU zronw~neK;hl;y;`cNaWGe2Mx9YvdJho59KGD{rtjGq#KZI<v%0>wl-%e`SncKYa33 z1%vuV$H%V)j5wO*i~g?k0KfkryZ3lto#3$TlAI{Budq1Z&ecHH?$NOh7@!sgOrqFP z$HFG?N%acE7mCRt!ls-gfpKgd#X9fpPa9X9Hzz0-T+2-2WT~p(0O=8Df6s@ctR#CS z`H0R|=nORB*xI2rL~u@9XzU;n4aLICLS3UmY3F|0xLP`0CSs2wd44=hoT*3S{2_#> z-Y!<ua|CIe4IPIKe{t(DS!=<?4Z`L9K$VSO{oNid^8=OlUeq~bkC|B=`FBZ$3qO2q z>u1D?WpWOw<OOi72oicQZs7tFh&dN8#MX}OTf^~nKxQtsP>mVLXSl2^@yi5X10QnY zwAW&F%u$({JyiDze!E+fUUffC&jZCMen$A*FkC3amZW2L^l-tZK;>e29H-|@Ue6q5 z9lubl!H+t*(KNMERPBl}cI9H>S@5TeC$(hw>pZgr3rB2Ktj(rI<b7RT1b<mHpC6)c zQ2KQH4S86KUHsv_2%*y!78Wq~rR`FJoo{wFhtH!NL8Z&vOTLHK>uOBy+((pws%1Sc zH7q}&8m2C0W-+bTRQ;$!X4S2d78>_V$1jfy6%S00zdnatP{PVAl%;0hYCZXsE3g*u zb)W8LPh4XRW6&KXOS=17u{=EguAu*wZGQcbG|v39X;An_O~cKUD|#%q3okK|y#qb( zbpxg`1e2W6w%GA8GUAD8YP>KuxG)(qqvZ|8<aOQTwfXD-8esg8!i&3DnP8+@S=&Vn z&7E?V(T_%1%dZ(_e3oLeRhvpQ<)mAm6g!4OvAbvqV}&MO9b*W5Rsr8~?@RR-v(qoM zSHgLNS{j0&m@=X{VSMv9peH7qMfzgU9CO652npGyMP~Fn#gAFQtz2H;ZEpY3>OY>1 z?;(5aZZT+WWXLZxXI|36L65ei3hGTX=YNHbK9tKJTq0SC*b=XcZrF)u#l*x6d~OwT z7G%Q|2<DYlv^R{>AUJ;gsSOK^=RDA{#}|39s45}`i%Y>!)i6l+Qnr(0x}m(gN&Z;} zndxb#Twh@@0U?H>Ubndk9yc2*Ij^p`;YP#><A95webJ*fSM2$B3e1YO{GyDyIZZ0P ztws?Af1f#CeDdEF#56iq{nNAT{^E3CE^f);qTcFJ{vChdZb;pAH*~dA{^@Qw`kT8U z8n_#hc@gf%63nh7pdV9VqwQiUI88;<Dj`#axCpdu&uwWQTQ+EfAL?po#QN!ONUkY~ z1q<a@Xp#4x_2ZjoL4_Y`byuos)Aza4ODkPekmjMTAi=0%GD)+$36_?}&|i<v7x9Pj ztx{mU1zkUypRbv+4{kT10W}~@m&KKZY4LpTpGv0{#XXo5KY_BG4h>~d@Sft8%NMb$ zSlTj{&RbiZfJfBCbNUR~6JP5!;XxXHUAP$0&BT74;v{(Ke1Tvto0+O$%zM&n`9Gwj zzr;KEnk063x8Dj4`bYiNSuHj}`qV4Jv4It~=RTfb=c23=Y^mr@El3M?%YC%H!ddO~ zJ_N3eo6C=uq#h@fthh{D)|5g$SS8p7@R}tl${(S(KxR>1OQ<y6c*qqlkl%CCj_Qf4 zL(D|bORC-VJUW=lH&xD?Ny^yksN^)2_L2N=JGDAsr$*hiQ#<Zk2Q$|XfXx?cDN0Xz z2Ud)(o9UDF7~b1Qwe@eJdljbnPsfy(f`@u6WmMy-ywD$OadBR-;rRy3mO*%8#09P0 zo5k+>0DYX8V?>TYea*hMBw2EmNRCI)57+uN3@$1U+uqU8oAtM~%<jqhbnw@pEc>TH zsjtNbaS<7hiIBJxEx|Wes0LLUtc!rn(Y7B<-j?K{pVZ7~>#uKzQJ3%^=iHSN%sK<E zemTh5{0vGznQCha-=J1}VB5&w!1jI%pW%tDljk;QmK#TJ!3ZUrw*c>kjpvKMsy-cj zeZ2p8^G(C`Ml`q8s+s;Yn<=!ZtGyID-JGNj=b;p;OIwI>dCqKoe=v8Zb=Wm#Hw+_2 zSRZHo>AncqW2eEO<v>W-ePC=pV+mKk-!v?A4^)en7(RK?=<z&WM}KFVmJPCdQw>Gd zi}b2_Rpk8Ig}*^&eno8ZYmfiDYMuVkRSWPL+2t7J^6*~m02uw?_Q}5SUmTk>DH6Q{ zdir57QQ2rSx$bs-sSS0`hg&d`K(QVsbGn)C$8qM%rariVm_^liSv~?b5eku<KGi4U zPb-Y)5ntx9_)x37arJw|p2qDf0uct>A6Lyjq{eSAB_Bo3p_D6yXc7~eV!%S)+go<< zV+Pb52bs?w4hzccFO9fDnGg%MU~<I$;HP)yTIzaP$9Mx-JDdDRNGjZCZyD#W^?&9~ z(`=5dR$s<qERCYSYZ(%6RP9;P_C~rt!DoAPy&b=J@?rCJ|NjwZH-27zN&hI$&I5Zd zIZ-CPH*8;dOlBUZaz<vvZ=1?C$x)CLKje&v3Y`zjs6UM4j*F+s(?RWQwJF;#f>u(6 z5aR)}DCs#4sG}B;^^wRHIR8?pf>+uRjmyM___Pu7G|yvS(mXZ+Im(qAK=qB6DK2Q+ z4!=TRtx<#5Kyh8SeX^;pedpf*_YA17<C_L{3o^>U@@hVmfqgz|CJg(bC&2adUCc0O zn>hVQ9d2TOinj*7Cx$&YScY<^GtyL8))j34F(>?DmBaX1!y<nlRSH*T&|eC?zkHQ* z-JSVy))?IagkL?LZ()D`P~{YO!_R8P9>#=cQ<XpUj@R1vTAAU)R*}1|{p2Y^yy`<+ zIG|9{^HAiL5!iT7sbkRfKiD!Xw)O*C2I}%J-gBAKnWz*BnPxyX)6e6sZ@<oQmPJdr z)3LB*z$&#yNI1$~ksWpRe4mgh6qm$6Kygx*s3~n>K&qkz?7OG$o)Z@%`s%|2T%#_3 zX(oegfyfaEPCd?&;AyM+@(+LEcW@j{8MId1d}7p79Jtpt&Hi{;|MRmg4m=G|_X09t zqa(*PhJTldf31U`QqF;gv3oOZvMLu1B`L-;$p{ovVKwSL@b{VL7<oA$oMzsVYoJE; zsrOwXvU*0{u|W1#h}DD%#Mw7*aD-uz1F2gyT$*Qv2F3ZTDF9l|<FSeG3@9%GtY)MO zXJJs5PS?K0cYx~I#O)tvZ^;?af-wcE{yNu<&5C?DuE|v&sQPIkt79rnMg_4l`OfL4 z*#h2}-HYk$=()~61<Lp6J$8x=T30D?e5r>4A^4n;)5*WbnZRHBnHhi&(}!*Shr#Gb z;eiwD-~ZS8i-*#{LfX3sF|8O0K00b(gZrL$uDt{P!7B{Z=Xj1dPbHSnT8Xs9dQbfh z7>EwjL}ZKg;+)=k7#*Pt!ZVpA-B*1VGE3F!2v{93VJ*+qX!`bpy`igiu_2Gj>3Acb zilk($tO4wBrV|=rN(18X(F~h|2&I#hq!0=E^ientg1{MU!PZPUsY%b_QIJS)s|*M} zeEXmzedM$Avy;tK)Z<&@)^-agGD7}XG0ANoUh2C(dTwfQ`*P&X@gJAo;$e7O3x<;y zcdPX1#rVsE+oFRXf?h{Q4*>R}Em#tHOHxDa&d)L-$@Ey~v`W30`rGv1PEB^$eiao} zTWaDK4)Ad8px#Sel(L{f{-1I5^x*BEH`1q{A@;vot6y)VNGEP>Ub=dr3&&#%(6ZTP zmZp|KnVbp(91N9>LdH`k2m}K%Z*!CHpOncrH}wqrs=I$GlXF(pbA@3B?AFOeE<l;= zpzlAA{+BZOb3P-&mV;GB>Ceh!zOlOyWzL5*7@?D@TuaK}yqd`<OSwyFsSQpJVUo#K zczA2vt2iY;Rdcd>fBc`G=fdGJ-I8MmFdLia-|)~wT^nlGdlDC{!(=GWL!jjQXujS( zp0pN5`~YB%B8sr_i2l&(uFTBL)1R{Y)e5SrzE;=|)t}BWwt=I?E#l>`AOFn#OT4A{ zbAzN@6;;(7=V|p)Kw*8<zEvuhYRz`+@l2v%qYH}{dBGw?<uqQjr=|eNZ&-SI=a82t zA`G`C-WVp7Jvm7o2H?i1ZRI~0@XQ#;UyfkP{oDTeb|c_h&ZiYwz|pIsa-Df!nt zEBsIMEZ_7*tsP&_T}5TXdvP#0xCZGsF@vN%EbG3Z!oX$eM!*fuK~N|Es`rIM?L<cU zsmO*EQ?DARY<nKH01Q$ga9zW`w#50<5x)Ib-03L}&uqOe%YRE0KnaMKe_)$oQ}t14 z;0AYLeix(kZkHPda2ld1l<#|846-Qz->I#rY@7*O3m>|2lG*=!S6Jd1A_mmS7$(1` zAsKxC0j}b^ZbWSjkEX{743(=|vdc`IHC)g=RYB}-HFhF?IW388;X@%Jw`sPsg%;~8 zs*~2ZWE`qvINJk25Sv9pMBvgGOtL!k<#%jj{Rg`}-WMV@bnN}R*mJtM95O2p4T~Oy z#9t?EJvTXV{4+0jf#qoivDk_-!q$scAxHT6?2=^5cY3k%*Hxa$DQp`l6K@{BXIEvF zeI3!)n_Id5D2}q$dp1_f@s7NalNU#W2u8~JTbxX@)2+L-Z2SG)<w8&~2X@KXC}twz zy!O05!5-`^`#lVM*}=ut&rV5u3Xrwu3P=CT9ey-i?qFb@mLMItIe8|X>USC*2CW2e z0p$|A1dD7tIT^}Bk3e&vmO3Q~So?dN65zd7$Q~TLxMVuIYYc$4Em}|ol5N=u{SOLp zC{0D#(o>N<vr%c;>9xvK$6oHQ{i$ur$)PtS)9o`DcWZ3|O=7F__OAMN^>_8{=pWR# zf!*44Z!&+XZ#9lRx;P(hVW*vv@2iR0@O^3WN2GW~We?^fXm_fAwmTb9+8V`BL}f|! zQl08LrbdQc{0(S5o7eF^P_Wkl8^VFsN$dE~buP!4>bg#@k+tlQCErNXP|)IXCTf*V zs^jqr5SfQSfUm3YrZjyu$=!G0O)T@Rvn}C08l^yphmX}VGh0u|A3QW8l@+3nwjD_5 zSIPg<;n<Sae*>Ls?u9ikg!_?n_F7&;I0pW>fq1`2x6D&M5kcV)%$-agxX1jNM2Udd zf#dfR6Fq&s`@*0O4!VFHmDw1p_r7xr^;_DOyT4nHoP1v;36j*}i|c<#=6_Asa<7<` zfNddN1@IzyO;nX$KZ2wba)lno&(Z}R^^@43u&<HK;3WBr1T7|47FjN|0LfBXa~l`~ zt(E{eZT%XtBg``XDpB`pL+|fi0Q;)*R;gxpaLxVwADpjVKXROY;hj*u-A76)7xV21 zLASHniax!`3#?6DT+vH@khS2Wgw99H2vBLGajZN{Zdxf@Z2MXyChH|?puOS;2~k>( zOX((ob&R)><FgH=X@97$<j{ve>XEI^BV6|(yUp^@V-WbJ+hOH(w64NF-aTQ3z_ueh z?yVlalgUq2MTPiPM5AZ~<vED6u`2{{pvSeBn78e|6OEG8p|9Cq<XqPl3)aER*IC4O zMFCUqwbvqU%1s+Eg+9AhD4l0mYHj5;Ut)Qs-}3I(nVa&i=KHwP!V?7t5`-E(W1~Ku zLYX)4zGWzRgM~Iket)St=bT*@8t_P4?Mx3rRi-T63y$sYAQ!`Fp80CqB<IStKFJl~ z6Km&x>sqXKug&|hD+_5i$E(iu?fGL1`IpbP)PJ2rE`T{?L9}v(dl@)tbC1cqM07;{ z;;*t-_<zb?`)8Tc>wQ-^B7u0ly#TQ6IsMH1*1q*wOA<_5#Dz~H`o@DK=xLdT$Mal* zuN=7GI;To;(j5E{5IhHnvzzE*`Dy$s76N9LPFWiH!h$n`eXXQKSUpNQTM^&S%{TP^ zGBGZ5o-n|Qv=u35i-7emo|4-56s<nk5XgMyW%iz1-1O=PPW<62dAh~?c;n}56ZvJM z+HC|wUGO@?t4l!$2-5Gn3G^=6t+$PBm&v2}t<A2(z2~2Pi{u`rYb02C9ynFX#)T95 z9NIT|Mxuir0-r{XznL~`xPi*e&YKQm5=-q+`S%$TS3Z91X~iLPPt?b(8nJbk#a3{j z?aXqqbzfRriC+YBOTp%Yrc>&|zdh&h>p!W-SNJ&rZJnR(Ti_oe?k{IaZXe$<6&9`u z*Yqz4C7jtrwvZM%@~N@N$NA>2Fo}jjp_vb4i!yatI0f~<dl0}8?0yK~1^hgrz?2ga zevy<M+)afHQPJ7j?^hHONv1pDBoMS{mnGknIg)}R@VR0|^5ppkE!MklY#?PpADLG% zK|`}KFC=<y+(vLfVU!z%_H#5`J`}|^O{HY*3!r)X^bR}<UWAsKjZE290$IJ>Q|()~ z{s79H+1c+9bpJ&J7!tTJ`6&ihi7EM`W;((K2|HdQQ;gGRwaOePZ}%1HY1oWn<3T?8 z8tq-v0C-)9QM4i1x?2BMwjz0<FW1-*Q?Y0pCv5gUN5A0glsALb2QUl@VZUDJ7j$x9 zPA4nJs)w%+V-L6KD)eiMm8st?Ir?Uwr~*4Ru)jI?>1gn*$gnTI2+{U-u;XZOPm!gD zjbT?GHesd2OuV@prCAm0(MK=ncbwXj#^D2di(Kd)@J|ru(bw9@6wFh9sSi5ZOGae^ z%FVYW-8k6C#Uv!RG&}W1WvXpkB6!y~r{RNO5ILI={$M0oo6e@^eF&<?Az5;y2>5h) zl$Ng7$Goubd5?4$l5lx!4?M35?6GgGMp2?dreT>ZD;p=~r0S8s_-z3|(Y)G|T<FJe za<KQKHez#SaCFfz4BGV7-|~I4P~<8ve)V+VnJL*Sq5MPvo8dqMgYx1EtyY`&{pq%O zz9n~Vy}x!C-0u%!?}T~1)mEL2o<+%vJr#i_VtCVe`}&MKmQPhZkoS~jx~nz5uy4px zd~x611&8O{tdkb42YOyQa{_&v-TtQ2nYJU4wZ@_*^_v1tj@W$s9hoq;eQ#zRJASNk zw@>TCCQWzVUbnFZLhV8Tp%1XQ`GlCORMosPf3sjIKnc9i=&*IQdg1oGB8TyNvg(@z z%k6g)Mjcl@WX+vXEv^XzLosGV=XOqOn&@yt0u3)qgm=`;Xec6oJF^08yR+0I$eexW zwaRp*uKux0{7Yi7-LwBJlOOGb-z(eJqZ-e2Wi{{Tn4P^s%-=+hOArB{q2~t%bfgN& zBt)l3J4PX3FDKXY42>u*bT1XzBp2|kbW|^iWa2IP4H(->(DPC=`}(}o;cBW%zM*p$ zIKIYwd{{>lKDccfmzNqM*#<*>u#~h7;5y(5P=%}h>jKJfzWHuC&pB_<|Jf^C#G~US zlzb-jJ2zYEfJU}C_G*T9io+AW`BmwqzCV#AjP{mU{EDC$2iD~nIZfdRx9KE30Cxz_ z3ip2F6i}qb!gb|=h$Qiaukj7r=F?^mUQZa>RY*I1Gm(0M`YNnA7;T7n#eyl!{Ib1* zi(ID=?0IJispI@nww3d+QsBp;e=bJz)74#~!=#VLg;(Ax(&il|?07KQhVp1oDT_ba zi@X+Tk!p#sVLkpi;FO&T7#hjCck5)6zhWsXf?kx5mI$2RbjALR>#lvBtIXTk*Y+p8 zv*C04Y{fs&hqu+SJXB^P<8&`=blz>~JCpor{I}G+BG=1SYd|gz<B7|^=%!qU8FtN3 zqj_2<4X#>x;S#*IdpC>IRd2MrO_Qq0GT}>VY*i`&q4V>xW<F+MT(Df6JI5r>kCGVJ z-uhI(JE~PKy#cMckznaI<e{3Mw>v$gQO4kWj`9=hyR@J_ve)}&h_6MxNY5new0FyT z6_=E|58i7ukw0ERtj0gV(WLNl?@MRnFFz#MPMfsF?k|*vPjHZ9wU5?K46&L!C!|;U zREgdvF!==-J2=M6-hGmm!*0jH?!5pf;ai6ws`nl}=LILEo;Qy0AUUt{&6BntG)=fv z&p?gQJ0VAzu&r_n&!M96Q`62D<CYH|9jp!AY8$Vmogr^BkQIc1HdM57DP>iA1m1(W zY%tm^)Q-gDqB2_(W@${+R+5y0(K~{{JF)_-Kc;N;rqK}9siBa=qt~>wHP_d+n?G@I z(XJ-Q8l;w=O}&7??%7~*`%()^FQ$+qe@WSY{K|gl>5H4=ukHF@83i4MxKbm4ECita zcvEG`2{uCico-8f<Kmsi3K7CdtAt+pLd^hI2~SEFE97<&q*qu-=As(3A^+yAb&(%U zoXgBwiP5A!{KoIX+&l<%6V``<&TYxmBPqSR!dxaBtq-Zsfu6}$t0MnWCJ^Qxx6@u! zm8xcxWl{23rQuj<R=dZ6QD}Ts##Hl9sUl;)gW#{Jq5{Bs0So69)Q`BXbO$N+DXEai zGI0QAJmT5KTc52Q=@bV;R-l%rVqlhi?;h|PWnYncP_*s37EADbeUB#m>Yn%Z0ZT(c zObRQL)Tq~vf@rf}U$vnq-n2P!KV(^!8f<uU7QR+_nu(c7#$lB`e{+u)@bEP5UIlF! z0*Zgw`b+I)Y0}ua>k%B(HG++0qI1RTsOW=6GL*;9OmE?HFe6_)ZHI<))T_SORj#$4 zK0H)ObJ3F=;x$h7UaD1;f94Rt$hnU%XehI3?Br{KAx-y#lF{R>>XHb1c4Uspt5eE* zC5id*+%1Ik7!&2WkA+UkU%nN^hC7Tx7ciq7sI(lT@^0+5=lvz@%uIwQ717<lJ!Z=+ z^Nx+=K{=IyJ85WZm#DTq^r%AT$uvrI^zF4v7&VIh!+i&BPjl1&W3W*^^$jsA#>cil z+BbXDWe2_tS?7siWVhY#=D&2Iy3P+<_g3dvE+)7Rmxz|%oU{tW?Vhki%R4MhUr>NF zSBe?&#^+>j#jnlcn>W&j&Ou}!<%Rg1t8K_L_uMK3k-pI=4hN+w#<68JuF{z$z1)!7 zam*E8k;h^UcFTGhzx3iHg(c4o9RK{oJJ4%rvR!NeB|o%!v4>U(wsGWW$Edp!F1g_V zKP(R^O0^#x&FOUaZ*wJIAJ-w;93=%0gtEq{!usX!)P(mNL-g){`<akLayXsUK^gq} znVVc`h;@`{o(RRX+DYPHEhxHcIxOyHWBptBmt)(Wwa@(eO7OQ|k^AN44hpRyw<b*7 zL~tdia~&6AaLVte4Tk=G@PfVI>IqR^G;av?Tb_@Vj$kHnYxOd{Zp(YM->DDuyTcH_ zv&K|03yY~z>+2_*uYiFRa@1G%8`qitI!MX3+`n;WqHJf|D-d78ZD*Epg=_Bi-iwjm zT8i><hbzN}W}wj|zXVhl9gJnPIj;vI^TC;cDi?Oct1Lb=L?+7HJ;C{TLgOM-qIgy# zZjphVRI=Fxz4{tTT}Jsz(B+wK$jeJg`kOB!lpdu+i0F9Vp2P^6Tz7y3C27<Fz(B5{ zi_{)<PT-ci4_K;G6t4PvHf?r;*LMNlTw(7U>IpAwFPK$St`=%FhTjL%)ekbm&;GNE zP4yGlPUI}-%*(wwE<I%ZA%KIDH6}m4+FqUCS6igaGU8SP$NfULFwJy+df-G%*kP_h zGF`ndAt>fzLHcV|R7t$Bi&FUGpn$bS=d2>#a-HV}Fl3;(Wo5%V9YMVVf#UkF%dqs! zOiQ2E*7}ESMJ&;Av0sFnxhy0rcyxKZ&o1`}DLq>t=tjnmtuI2zTV1@-6P0_M1M7KR z=RWcu%n~p=Q4}|9-Fk6%>~2l^e8z(U_3>%n-W+1MX0RwzO{`jNKf)CDipT3m=XV_i zcKVJ6#>Q-y#gT89%ZYVkLt@iJQ!8@a^XDp<)8EsS69>-O9l!&Oif3Z^fh<$GB~Tp9 z9Aq5od#@JvBf?;s*IWOTcjwbm@`!BFY>y=lmt~(M5iW*3ciZG4urbRAbd=9rE`oH_ z$xl`RoQ~~xN<c5j|B%6BYi?2s1i?s;*mTXd>C~e=IQyMy#Lm9;l3NTX2VNZ4yOrA> zKf4^%DzdN~<b_?@|H8{e1gjd;4x3m}9nzyO0Sm~=FPjFJ^~<+wT*d6a3NjiOxvVJE z3x13&)#|c?b|xK%J)Y*Aw_j*hGWjssth7GjCB*Ixh;)NCdH8b>8t=&n+vcEF-UVd1 zq`?Qm<>nwk5tM8%YljP22oDO)j#N-X8YP%=&7wmaPj%ERZuZOWAb`)hPvCf^+v1~o zv{x?GF{W@#@o^ow|8Vm)!C%i;&rr^3JIBQsoYt@Bt8_8oPM(nCkJ-e;H`_GDgeWDf z>{@Z;vmcGDjF`rt<(=W*35A;ayX2{h_91-#b-s2??F_*3YjR(F*Y~O4H}aVJQ|?VI zT)@ZMoK=o>ozYZWW`1$18Jjxz!Zh0+(mxwOH$Dz5F#CW9+g?d}UIJRuVPo9S^Gp6w zvyEN3H)&VyjgWaN#4&e)$ioRIz5XJk(t&+-tTjG0bQ_KDcN{V09PF*7L#1je9<GK5 zK#-kOb_6j99aVhppv2sOI`3?=`9q~Sfn>9)JVB%<FTLcUmc>_c$*g~DLaUB_LRfLr z1BD??9|`E5Tvavm)r%eTai>Q23sU-EzP3z$VUpXA@gq4)lqQ1xU?SAJxYU#hmfMM` z;~fnxBhqIb;XPizyqDaGP6WXWsOW_?w6%eow#kBbl-xJd9oHL}HTaK?HuLU<k1;)q z5i+!6edps?*VmepwuKMMWcFwdu7I5{XHy5ZjU}o9di?fO!PbRqkLe^SvF8v2-4?Ea zh6he(jZmi2BEv9GWw*6LZu<K-^o%Bot=)m*rrGW&$#rkOzMPC&o11Gu42rxuapDAw zGS})GKFU~m?fhXhS=zNk0U{|T#((=r&6nuQYU<%(r!zX6^JLmZ_~>h>?bP*VDwk57 z=0b#X?kUMHZ!2^hcK~s3eL-@OccAO@_YF|UwJ&E04}_<buKMLVcGxs!L_Rn{u6Qmy zVMHe`+A_ra`MY<^kFw@?k9X9)!6&Arf{J|fFReT#D?p(rvDyVJ0o!0_hi!cFV69O( z(fe&@yz5{~={J~R1r+7pFycL#^IRrUrF61!JfaO5PSyP__&sDF1XCv7ENokNVS8cf z5{Zg$ILKvEsXt;t$1}A2nT6aRV{)~dCZ@GQTPs+wf5SO6dR0rdf%$s>pbLi}v_EDr z6h1_-Ls0L=UBXk-@3a>g8Fi$rr^6CR9p5QTZV8Tyt>TJsyJ9U?c9}woeYcigC{kAC zTB~T*<=-Oy05=eJKYP%3=8t9Ee||<Dd!fYg<7J&vcBAjG_mf_Y9~Q&pr$VIyoV0ow zQu-16Kq3KlUKmG);E(y%VFf^luk~sbLQ0p<NH=}ow^pohqq#Ke;F<uZ?f69VW@*06 zP$D3XiWi*rKXgEnq4|L(574c1mD2e`NyPyuoTxX7eT_JZp`t$$Nl%aTgPn1sL<Y}3 z?o(kB_+X0^A+yIBX$inP)ea3u50~qUJ!KQ#1w*gQ@KlHG_4_jzdgCV;I$mSrB>D)n zK6Fse@cHuT1=wa!$9$jR;s@jyI0q0h2RPoXrW&-sCtQOJ&$DD@_vw_)o$%hF+(R<u z8-7I^JBH+x4t6gcqhutim*VYdGzr6}Hg^Qd7a<TF;CdxqtJrx0{6|fq^u?ng-aeva z$x83<GihwF+$!tm$Qj%Sm*>)PFWTDN_f%hqV>8jRvhwv~S(mJ1qZ<9sw*plkijDA! zJZC;d-%<oXiuE8AIw4kD;&mVtMT|(dY<d|t&NNJmXxT?ab1*Y)Q%FVY6E*M^wUWMq zFAjvhoa`J`M!T*Qk1_mbnlh@XQ+o*B7xFA^5+Fc)6tVFJGel+Lk>ce%tX-H)#K>Hv zBM6?!Jqc@$3Bp<%KrK?}HsZ-&8}ypnZmlS1_`>5I&+S`Y>-IZI65Jx<Xh(OaB(dhO zg77y9Lct**ImpEC&noNZ4L&|C@wr_2M}i#Rv?{Dwdg1Hj5bJ|%v1x;Mw0ioL7`Vrq zOZQ3D#&hVXed%C616z5i>Pt}~pMz{@9gZsK4=vPP5E-K<8_4vd-Z!5IWmv#&8Ma`S zoLk8ul>7BN?TPSQkYxomW`48IaRSX{;WRY4@|^?q=I0^V5Y@`05}@{?o$6AvxYOkR z?XB*d{(g|dhSl6^>d*rtLKaR5Qxl#i$+Ym6HQoiO$&r|Vu)~A9MW;<}^@S_OlIyoY zdG8q&=ki<JhwFi~&@O0#{QZ#p=Xu!uO*r3E&6K5&mxBSXI@yk=`Jn=53pP7ot(^ro z<~xDcQant+`RMN|^9zp767&PoAOx&XLdEU43I}NpUzn;`(;@?s$jU>H$};?x*D2i8 zU$oHN83R+A^Ohau>J@)_`k;n97?CM!Etd09zK@ZX@#E-Y&l~h8N%PIM{x`fX{FLT9 zD|jQ2O&d(x0-c*{`H*=c5aihr`E66V0zbWg;FHaEfm6?Ne3ZZurdNxJpOXHRBHl5L zAsp2uLuP_~uHK9-y!Y+3Kvf62CVwAfNJz<5zFQT+8+UUYhPY2B$a>x0B>twj<vIs- zA}EiTmG>SeX<wsfrepMVa)UXvG|{%k7@@6#JNXs<xL&C8Y}aKMzr(zu!wy-f&8eug z@mFG=!$<Y#DuOO^*a6k#;W;WaKW`qhGqT<Y(5$x09uk@FrghIQOzZNX7j_abJJjaY zr>*BR5+2JAy4rY6O)al)z!S2MH@(iR16A>NgZuZbF(YV&kn(Tu-8TTnXJ}u|F1X+W zkiL(EJ6yQ`$JkqkMY*nhpdck7C{jv{NP~g`(l7|pNT+mzboT&KBHbz-f^@eq($d{A zba&0b5a-3U+<WbP_W7>!AK;~4I`8{D_x(#a+LtIhc#2PHr1p}7&Nr!8`f4Dhewxbj znp2WcX4U6(V|ypb)|9@NRL9Hj*4rU?HOg_8Mye;bVOh`yJn@leZsVQq9d8x^LrE*W z&zbu@idz%a?%7Dnu65#@ONK;Q3f3<aP#ytZ-Q?xq$=Y??&i`L;#_W~Ror8m(;!2ET zQgpDa!$t-a-{pL$Gqv(?S+~Mvm)UCcbI&evpLB+fH2h;I&Bq?oA3WOSb@&bvxXyE{ zZuTbh`&eO$dIB6%P^<n#D{v$`@1DK8c$p*s2<*A#;@QI|z|+&Z5Q}8N!?uxEK``Uk zCYQZ)vsGF}vXqI=+qa_#mFBJ3ERxP8t;;>3@ATOWT$KJ64!GS)5}I~Ka%*%BW*qN~ zt<s23xx)I6`~FBpgkRsfik^Iq#bkQUQc+&+U^!dc_BfHVI3YacS#uWeo>cKz0RVfx zvT<~9uF|e6?^Y{nTYB_o=K7x|vr-5lU`I(?J1YmUW=Ol}oGiY}*qcl?>nMofi>;3a z$p!Qmer((uo1uJH)QUjd#MY>&(t1AAcBxpqVr1}=0UUP*z{}w4%^DkssK)(JJ|Jxn zNE}EKf+RVE`y>6D#0?~F>6#0}CoVhNQ7eyGPXg!RVky>OOui0;%eeO@GNYeX>qG)P zKD0*iEei}swT6Pnr?9S`XquJV@+5e`5}hS4loM?lM%(8(ZtY|#m4DgEnv01t7Y_bY zO_3(t3WWliQMU;ltf>bQlq3Qtkbd4)t5fD{pd^V^UAP6uBQNHYL^zej?sN^V8nP`v z4U%Wq#fgPK538Pkk83&pL$f7d>_XRVQH&gZRIq1|?F_G9Pj$_)9)_lQ3!US7?#~er zUMt2EtEvJN>ln+P_|$Qckw};G#JrU<H1#W|cK(}1nh1ejmpSVw?~_IJ24pcZ#&D8n zw=&kcz`DB9zT}4~;A{vH_D+>i+E|Yv26h(c4#?+*LFZw)L?o39&}};^Y0O9~UufLm zn!|!4k7%PCfjnek{UPE^Pq4%AvkussfN;+&ty7PB+kC~&t#MH~aC_1F#z0SVoA}0? zYpk=~!YMV)y3xl)MM9C$lheP-YE65cxr{pM-z-|rZpCW&A^dLrH;v~m;Z0dY|8XOI zeL2Ce+g0$!ziUB{YN0=}(P}t*V8^v)P7_U;zLO1K9-nL-VdB_iH(R^@YI#Je^pmGf z3z>bfe{z!X9=5SVld<D$#TWM+I0hL@zdMQR&F9a~`=D#%eJI>71=7JZp08T4knx@t zf4RbQ;ivU(wsJ&;N<oxq3q#W3l3mvt->)m?QRl?v_V_P9Krh6-4||PomQva35CYvR zwVkVv+MlKjl+`XDUPWzQIgbjA42=P|j^o^0GoMVarCGM~D`SV$LxjnNs}buw!53}4 zrGAb*@4A85Q%aZF`3S*1Aax9=lAi)vRm@|E{!-8QeYj=HP!$@;Q;v@4$FnVzS!{<# zA1`(=h-)^ugsave1BrVQwN&F9Y!Qq617tc(Z~no3{J#XLpCW`A72Q52JptgY0|qYI z9}Y%IQcYIDyXGU9A>jlj%JQJCshkvh#h9kznKqun5fG5TfZ(gl0umT9z)dPSsf0oh zK~?fHvS2+~j*fi}=JAO@BLf-DjpX4)EPt?{9o}@Z(_{yv)uXb^QPHDAcv$Yyw_~J8 zN|WMgX}FMqV2q1my4fAJnbDUCO((~vgXh<ZyDEHJ(dJ=%IJ7nF>Jy(@(v_AQi5XA- zL+j^wr?%?(n?=~`I#59|;J_2hP*m47s?g3f$}j($XtXQMr&5~;WzOo<HXz=eo>rC@ zGGe=0Uu7h%F??+VOhZZ5+iLCY{@u4WOh}~QML^@0+PV?%+GLhhXG%4J8b#AhB!QAn z9J`zd_QMjW6AKH>Y1uj&>D*jeQ6vu&Vx>m#CX!u>EI77Ebxym?+;i$`UDi3W>mv^2 zCNIrPaX#C8MHom<I3P*(h>^oxAGV)>jlD?h>kS&m!k_J+3r^9GmtnpYACv(D*f5b~ zVXF64_!x^+@WVhK&qep~0#|v@wGy8iALv0^cCAV{0Ek`i418wvnt2Yb84ya+Mr#M~ zrF$;+V4H*Sr2Sgj?NJt-T*tq_FyOhr|7Q01>)|G?MtdW$m-7I7`CE24Iy-=p@$S`q zcCY`}bANU@wdZm`jfKGiz1g+(sUf$i?En%>zb&9{3!cr+u~N9?Q91#b!n$t5OsxFn z7+@D+(OmrXuPcY+e73jUje=YGOBWK=dxCU8_KaokJSG&_*CT*^UGdrQIYlTxmAVHd z_}ba?WDz<_2Kl*`H1)+SMQ!=IKFH|nrwakdXG8jlIZoHSAgyF19W)l$Rca>^wSR!v z>zdk9%m4^FjbR%&{RYma;G}9Zkv>D}e?YLKTM+F0={D7<J$7^7*P6T4;(PoE?Sv|u z_C*sJ7JqANG<mX)NER;Z>E5re979G|S8b|R*;(uhSeAtzVHB{GxD-4qabjUsuLCja zR9n?O*K2yVDIw?BrRE*-U!><hz8xj_3(KZ=OHaaX{zci2Nx9t=Fb~g7W1C7Wkx`X^ zF;YB)%zi)K{a(Q~K4eNc9Em%#^&WXOI5Cki|I0d=dm31EnuE9u6*S~mAC9X_1nN#{ zN~V~%>=CRWl?m2WJf?XbdByhfS#4ILeuPaUm!G6sPv>P(#W+uHNTk4m@U6i?E_(9d zvrd<|0Q`_9#zIkt*8HE08)@WLg`$~1BR!;x7%9@5Lw%&_;`0AVQ>`Tb_9XzqMs;-n z`SS%b4=oFO1@Ajfq`;>GBI$Ex7j;}_rXmE62A{k<YJusJY`V^!8r@nw&VIE<PFXI) zKAs%LySZ()g!b2jd!CibgHx<(U>C@MM=ZgH7>b2>&OLolnT^mgLWYch0$u~vmU_Yx zkQ2*5(|K!m1=iL3(yL2S&m8R#H-<!Q?@F0+z}ISa>ubf<z87L<IQ)|3FF-(VL+zKY ziCNmKXS=%WQj!byWH(zkJ3|swB`?JR>IiF{3vcnwqERF;0!|w6doG`H?+y?My`$lh zR@_+byppL}a{j&Ng8}p$Af#TY-|c*#s#Q;%oOZL0dj>a4EAV5AT~53=0PHRT%gJoB zL;rnSXmJrrr6*YpvkkQu><Na9>1{IyMif{I)m5AQzC#=Z_ow%8U#KM?Kij)L<ck2E zAUeURHIDs)t$-GZ-g5SP*}aAX?S|EynK|$7>t+HE?cW<k)mi+;wqbmqn|-aZBjrjH z(N=xW;ZnEkJONo&lbdO|kNrTRw%1?lOqgNx?``I@0PlIl?NYk;{pF=i!>(a4$XzlV zx&1i8f_dv05tyqn;mp00X2aiq6$5jn{|zVqb-R?OnB~A%h2+QO`8IjTYv-!>_M>WM zVbqZd&;Q6UFzA3)Utj^BFd#|mnB=)m`3q28S1V7kOd<P^N{0{`GTl$&5X>&+5`;k~ zP_V5TO47%%7I0NusQn(srfVfrw*P<4aQ9Mgo&PIN?1#isO?lIZ4}i?{LYTBzG*LQI zBf_tKKNxHBiq;5_GZFR2#uyFl$xPpu5JU<m5%dCC5ofsIgi=a9=~ja4oy4p2n8T<O zBfP6jD~Psn%EL%b4{3aH;^oYfMeOEa2!sNeS=h$_i1?AmNa4AgY8c!oWf*RPXAKN{ zl9R3M6#gsvdg~JpdY<RAO<%rjajvYoRY~a}QuY7aRA`6%7Xwu0Dmp-6m}L7hy?^X2 z_gp13WjDt7AoK#-xIhSJxnPM|SRh4|xEAcba)AEwDUjJo*&*~AVe;JHCHz3Z_Y)|p zuxuDA>g{eBi-<np+se1JI@{spBu)v7RcIN@E#;Wd^Q`c`Ivvfv+L~)nkNSxI4Jxu# zjpk#_kmm41wdi}f3@er5GEef$6BU3E>a(O}=cG-YT(^?$QG32S4N$c@c>Fg@`eVUP z7d^Dpi{G;dYJm9Eu6a*5TEqT4cx)rJ0M>F}j))2X*N}YxSqq4LtX4i2SOFOlmTker zfkKeqt3FVC9JyNzyP?K@4QS`BcB-=GA|J;A)yS7ax9L~3{EvZ^#>%aO7c%v~Uzejl zNL^+qROpJ^^AL9Pwo+LYhcfX!)%oyWFU|4G8<l@uK&3H*Z@D9#v$)FDI~z^GQ`eo% z>#Wm=F!$x~8f$Ji4YP*S<{h}EKQhZon(Gfp_6H&U8zk$xZWq*ZICPKevXAWH_$0=c zW@O*F4b-)yIL?1*zT(*HTWbIv9rm1)CR=+WPxI`3c9F(PB?HT(uLh=z8x*fMH+~Og zrVgp?jQ}3-Z!iEUpb52VYag$&Bt7=|_=)RZwC8Oi=6ZsYdo2BUrfQPD*zD|?wx_Lz zeT~E6Q#hsb(anQVDpl}!!t-|;VhuQ!O7pazQLZD{p0iX%r0@YA&Bh|vwE5~y(<Dv) zb^i}gETI(6t{mAfhI;bn(`)rNi5jbrC_-?#e|hHnz{O5*qKX=(^?$g_{&}JUUvtXd z`AhXnb?4Kxc~$_ymh6TJIUg+8LoYKz1OVdrplkp;I!^7~ptr6un1QJN&gHB~2&fW? zi?KQealNSz#aL#XvQn)jw_2K-<Q3%MQa6lX{3Qaivtx#^6*V7`Jg<z%a)V?QkIB!n zp?sfU1X~no9%mSWI5UtKwv(Mi@4*4v3aYcy8Ewtae3CX{xp>=CIRR;EL>)uepM2ga zGW<Dfe&ZvacWUqbB{%@;(Yy}a{x)JOv7#&N5uOA^{%D)7u_dLIxZb=5lT+OlY3^=g zNOlX$C~=4NIbMZT<>$v^yJ>{GT~uyzoo-uT>)cm=XQ-~rE8wPJHp{ZS%N8m4#TYzP z<aT0IvoxfxCsziZho?W+h`Jnvu+-f7nV#Z$Hzp>x_RaDIvpu2o3w3%6qpB7d%-;3s zCaF|(=`GhNl*+?YY7cwd@MedFqT-BldZy>bdo0!MlIg3}-$rblm@2?J-<p?kAiJYL zLQEBFc75TBgyY^w739hi61u>Q)cH?J{ry!#CGh0s&M0rSr_Cu1l6PKXGvF+f={g<0 z*q+Zy@;*FIWF11FBCnCoT`g`KR*{0Pt_0cM?*Yz<{KPL&gzB&PFU%1xSJQId`4A{Y zL@r8D7y?u;Dbi+7pyBA#5G!@bnls1W7aCjAF&%2N>QeGVm^^ngbH6jTk)6#%9Z2Z& z<BLVK!cm7?xJ9{cqh+z$_>fSJ#Zq%409Lzf(wOy<4=}T@^O3=8J3p)4CxkcoBI7o1 zccgw^v+t)ctA|=mR&_vY6uReuU$Fl<Xk9G`HtoH}<qVEFn#zsct=94Zk%}p4&mJy0 zbe%bVQ<#{em3&EV9M_NZYXZbKQ%Ai{6HCdzm!*^2Woa#X?-tT#MeNp%=gPCeU9t9h zZWbWsrkXDT1%0Z6DZLK#;ZUY<hXls32wd-5+O)Nkdd}r`R@|2zsNmU$0<+=^vsA}T zV3X?QNCM`?%??4&TIg%myFw$ZfSDiZ+1ULLT>Cb#bT+*M9{gOZrVOxaujaIVZhYnn z?~^1GKe8^1FE3}`o-Ff!Wjp@E<9&qYKq~nRYs2n)fQ~KE@BhqgsylImezo3yGl{S- zndXH1P+Stked|e>o~?sTb;oaCgR&>d%!U3pGWZ+g$ioI)52j13#%`?>A(b4wlN0CH zqa$h7(z0RK5X!Uf;a7u+Lgs)%c<VuMiEt~|G_~TwIw>M6z@*A0C3Uy71e|k2{0x~z zX%C@vsb*S?E&rKU+!B#VYsmZEHgb#OUr9K89*99UZ8Mkw|BRc`mzQxL^B^C1c@@bn z>{{3i0gq<z_DM!Sicto1`lN{xLIIr}+o$@cdQrbVkkLzz$naS>^}lH_a(2HUpIckZ zix{s?ZSTOU_jBD4*BKqIE;@!BX2~~#yC<<|$C-hlR-a@rTScWBXVHN9yBhlhdNU_@ zcG#Il>ukR^l{*8N<fm&m%%)B@IeshC6eq&1My``ID%Sc69i+b9g0H!0X+#s_ry;=` z{LY(1v_o>&R^?inZZ`KvzHvYfp}Bw(Vp@ka&#pz{VXPtU)I#gx7y7u9jiJ_lL0j`E z^8oL(6RB57)FfLHT4S1*n+Zw#cD*?ayZt}?X6mztjQj%@n3Qv-iGV1U3?rmI-J-2& zFQ))H)o+;u{jODSM-%d@1)s+b`osgU;WslAXzV^HfM1_COFZ@LqovOH%Uu6!tUB{; zDf<CKnryk|-t11Dy=%=KF(2f<%(4}H&h=h|B99`OKYXXEEXBSfFG%%Qf*Na8SDKH3 z<C@pHTCq9#k2Jp8;7MR)%*kH4_@jPE1#~6O+ttwx5wbXh{+{q%${!Q<a?4m~^MFpO zFcQS~>$eVX<~Wc)xy!w=Jwc01?byg-3F3<~VGu_k!oq%YT(@o=)Zmid*2vo4h>z)S zdPvA^Uo&X0xnsC9DBGV{3t;jqOY@{{f&)u?uxqRxOXM!pwKU1c3A}Z%*DyAb2B7CJ z5EMa+bvK^#*ZZJ>PO)erQr91~w}_+R(ibnA7VymBpu}uU7cv8wT<dM^`+rZa9sm#@ zhU6u2{Xr#Ij|Cp}hlZ%tg9KV&&xnbw{Q-*QdbJn>iOv$7259|d2~@LvG9qvJs+E-y z6;luBifa;Z=B!`Dgu>C*k^yYKU*M(qZ!OY-1Zy?$ID4+ftM49mj$cg@?Z*85rYSJq zV)Lm^Qc`(U#oz6~^C7V5lACgmQ)cA+)lUZFvN*t5^DbA8vdBJbOX3UHR3(%W(zXaV zI$&><j=zFpk|t_FqU{7iPc6u9CYqNfGW@TALRts7QsfM2ESO++yijMkX(Yu`CShey z;*h85pPKA{Y=^gZvoHi3h*gny&RUd_qu*zLIgwaNoyQj6<Z=4V`RXUB7PBA_e6hO& z^5{?=P8*(B#+3v7Zx^pAT`oj3g)i(!73HC&RMte(n*;V<<jCNYQ!wYldKH%q-U!gc z(MKw+2mVi0?X2y?nz?%y{T@kx@I-ZLscevtF_>;^mZ`v1rq}nZHv-!qm&GaRPQD}0 zzSr+}2IzuWlTUDcw#aaOIuPCp@|tUxKvUh5QGvcY-~NLZbC5%+DGX#>1k(Vt7;r(8 zSpyFL@@6c`1+|0AwxV=r`J#uDy>zds95zaHGHnxSp<h_B5h0yvT(rkQJp*Ucb1qZv z3Q-5-)zrKs1#Eqv58qA_RUY=-_+#zcHtccz>hA7|^@=(<U&MO26X?^ZVN|t9+bO`k zL{F>#PGf8#;9*2rD(mJHn_dI@0&?Hyg=E~xX(5gKQtfg?ImvS^bY@z`Cipy7^Hv?H z9^W&Qr=p?@UEaOohO0%t!w=;4S7K~gKD==|2_`O)h#(`La?ZiVzTGMTLDQS4lOFu& z*{kl_iJd94YhANDsxq!S`23gmkwev5SOpFhk+<@XE^~SCX_)7)!k8^#k_!a!5ulMc zcx6;fK*(A>WxD-j=rKR=S-3686HFi;+yTh}vcIyagWeMaz}V_HeMz499o?{1JhmA( zW7{xNq<^K^@~YpN36Sj>E|A5GFkAw)<{ia=puFq+Lo*-&tc?Zm^{75~60;jjyvg2v z0c7PuCpYWmu1Ph}IHRAK#O+#OtOusA6%T}g?Y}%>-E*6|#UeE}wr#kqINWdL60&eM z0DjqBSIp@YWF4rz9fZ+t@PWyNI{32tq87x|9QkOmQ%0Bk2C6?+D#O|^2qbcwwzAgJ zj))R(>TN8O!t2R-&++2E%(Ink%MNg~wb!MZAR#|%f1{KS?E%*K!A!lgCApw!HWCCC z=eo!*d(Dn}@@M^10R1+Fo(>PQC(_QcN?P?5=gx{RV?BoIy@06|<=>1s&(v71Lk@DE zPBvHXb^736oR(PCr0peCwn|<U<-arNQ7<f|Uw!*w-&DQm9kJbWN3iTC+QqG^pa<1^ zHzA(|1oq<X&w57&CNl$Z{UM~aZ#LbJV|~zHSqQ)Sr_JTRzWx{9*|gAxHYYhP*21zC zwdi4O-Sz^gKIKtX(yQbMV((7lI(xmjttgQZLCAL!!p6^JVT9+Uk$dlYk?+cj+$j$S znN4Zkp+uSxme<4f(O=m*FeN+Y<30EyQhe&_kc>PcgCNGRZUmxt5{xgz2=LGRR`8jR zi$P?QmypRE0wbmj_(SiZoN$k`2SA9{T7F2=#y0#lIKnSYv=PX(LL(n=|DWLm=M7L9 zZpB)_<R-2Q`QquD6RzXlKISaM69yW$ovAKDs$R>XrUPK&qzGK0mjK+7M))p?t7uNT zZnsFRfJCjXmR&=WtgC60C@f^MKZSp$J01wcYVt&M6v=8&eBM0K!4s0?Yhli3gn1oX zKYf%}UFRpo(1})%^47V4pUqJ!e>34U#jKv9{1mM-f|4I|#tZ&pvQV?ae~gZOlaxhm zp)o);gOp9zu)?elM{TgUC=!@iMN$9}AC>c}MyGv(K|FWin;QLQkt7asZA+S%l;`BB zz%mJFR;P9?Oo!}?Wxj+z**BzB__dtc=lxpSC2$s6>sT0BYgO!TzoxZuxYYYH>9ZjW z8g%9!*H`wDJT!YGo~0m`;y=?g+IHE^?58N87qxqaog8&~-6SeG`@qU-$}u6k9#VGy z;rc%GceDmEay7AI>NZ-VuacPM@8L%CHkZUJAY4Ye(7FL%ERnWXP^A2z<s9}%ZKJ5< z0|?u4q&{40&aKLN3v#(#{veUgTRoIlO;r^TtH@X%t*14Bu)dm-!#5sWZmd}WgW-%- zW7R9$Apu16lUe>6U`{HM4(t4E$2QJ*Xs2ptwB|GsRzD4NlU6(#avOq&TJ6p5-_iTO z7Cj;`KrGw20ZC0oAG6;{dTn-b#kx(MnM@LJO+N@;LZ(wzJIZzp?;%AxxvmD+$aegN zD(i0S<q%KstpUg1M}yZs2Vxmuqk^ijlF|%?3n9qOs4{zpZH3$;CyLWM!A>~*M|8_P zb&TX*EgmqCOJy`VZpa-UB5*|gdzq@fiHv?1jZ9mj3p;^o16<_KwQYr5u=OI>RRNT^ zBm(YzC8V%Ua+U##4KR>M@u<GVR+Mzywo3m6H2q%wK>y0?st;+I?Afh`^+$mBxX-#- zmgl;E$`k)_=+oW}co_H)^B-v)=~UP+x{l@m(+sfA2@CeW5e*ey`)!;Z-RLPAr6bX? zZzt1wSI2oQNAzc6<)sD2eYY3U*}ySESTk+?GI7jCRhJgmsC{09w3s%mtY+q#!DVgA z3{zP+i5zlp;s>6yeMm1`noq2%R_Bx_gKlH2+LKtv5ce1>q*>7Ov}|)E7YnT6af#h| z8^@U<+227>lg{}*p!3VDsGjA-BqbEt*a$ysc>T0YjRe1R<Db&v|72nwqXQr33pJu* z2lA%bwx9qYYft3Dd3sZZ-#a}Qa1jbUOYywtb1~QfdE!mERcRng0;b~Y0CH_$Zci~| zuEAcoUpHd8I`}8j17;M0oUJM%w|;G@PkztM#-|D^IxAi!ZmuGB*+VL<cNz+N9dFBj zfGlcMdTa4SoPFon@bc+z2ABo%4P)>bwvW|`A0U>Vp0d?g?;IwH$Q4R{(W^1JiAMSG zLtbvUb%$a(%z@PNw?}*!3|lPxCoOY73B^VVS8@2-lYY6&IEFFVejVplA?`;(2t2O% z2Kg+1v}b-{cb&G!$EIsaN&$`(qafrZ*@fc(KZl0u&MhCpr04xM_MdZ=Fdi_}MWFTt zR@!J8tiJu)fy-*AGWKcp?5YI=gR;t`Ct)0rjsT-OAo_3a=UXp)<M1LTpe*J9n(8x8 z<-S3kBxsp%tYu>P!Ppe;!x2tC1waSQMm&<gItYpiov$^T-Is;DcM;2xRVi4zgoTfj z;}|Ifo~xw<cy;dYRl3f5@gID7<yrk)vphQ;S<?Jp_sT!NWoNh_&A8J9XerKGq*@SM zQ6bPMATrOfT^|NiGTSUdl9{>yS2^ACB&ijI65_Uza&_Udm0^Sp#|51Px0HG5RGFj@ zTzPq0UvE5gA&CfdVb)Ud36qzEjs&o)7)UhPx+w$<?#*m{GQp#}I9whQZ+Yf?f?JcZ zzBaQV4@B<Ec6>{*Hj@UzlP486fMgtJ11S*wX-j{A{uu`4vN<lii>K{p@bv+ZKnZ75 zoK(Dv&y@Yg`}+6Ly1-QlSg?1_nSe=}K>apcB+B!4suol}W&E=NMp2<&Vl4oY_)5Ca z#L3aT5$oob!0{%Xz|(ygn?{xOWx-8_1jt>Wv44f`&+oa_#KZvU;mVm(7UttW0;|l& z_`Wrg-HQ)})&N8eE_>DO(mj;b&;z%&x&q|mtrGYI9jnYOK(Z|~QsDBV4B>S}kw$fI ze!dzy9AT-}u)Z+sgGwDjcJnX*piv$-j0KV>a=KJkjn`+k6jM0ITUYdPsV$vI(sy*U ze6|#itYU*AhUuP^*s~B0l*Y3h%4YoYpZ?$Ddl}(hqBhy;QxhKd&mq;acsXn{i1O%q zM(k%NVw6HBqR*BMjDY&X$@~5ylrw`F5o{b5{%<m}Q~0WZKJMkkU=h!Qv3$#8T;+{N zqTr4ZAOUIXiq9y^_&(8TOLLZ$A|L)vr@in6l4~Q=&`Yn429<;m!#U0lIye+5G?-y0 zD+$F<0zIrANxaGkuP-s1s~N)L(*vpI+Qx+qpG&nuD4Wc)gr6#Eu;BQMFO6b9mSQV< zS5;2`_A7cl5GDVZEB-5bTONJv>D!S^F+em>s9CDjGwXv;RU=sgKlP4ie}UyAlpiYW z{czATvnkTIBNE6#Y6xV!9C-pa0vxn(*|DtKJ?8G^UPO|AghXWhxM^Lypvu3W_;dyI zQilUJ0=_{Yp2+BJl9~?`*l*q^ad;LB-dsX=Q)*z(M^!i@{_P_yoVcA1rxu?xJ+G?X z<)fv`F&!7Za-(r~S-jl0I?Y#gPZORfCf7VR?JKet(`r~f(|WjUfG;_HHF11XnPgkr zoX}u~nb5FeGP~ZYmV&3f72`9vED5H)eu_#K(#mMEYSK^I)oQsDmth86hm`LnrSTbX z7%-jUar-GvLrGZ6Z(*9=FR%;xvH#C>GGX*jVZuP@803mT@4jKH|D5c~xBk34S{m|z zo1UFs+l-uD8$LsZyPRICH@dkzks;~_qVkeRf|zs6*EGu|70}~&DVk?x<Hs!9Q%rxC zAP+PeB=F7{jPzCpRS&V<l|Eg<%02R%haWRw3RaimzkF7i)yEg3dqoD_?F`)h2*;fs zJ@-cPjXwzH<A#PGUU7Ld8ko%`4hCBT;Z956jqcdhz6EVq7^TDree1tXLcO~^|L`@< z<|-i6E8UxGz^W$zUk(P{;|F&Yi@!p(e|Iww(6CoOb8)syy0fv;l{Ph)VMgSY8)|@$ z0kgQrc&F+<@CcCbuoJ&To&7|TnSEL#TNnbEKuNeT{)+^)N=N_7ZA(Rq%jQIY;E>Ws z6U&(UcNmCY^6mU&Dj7`+d@#!7hMKEtqhjTDLNYS&<wc!(C+r}e#g&J<xeYg*FDYXD zNP$qJP73>4;Aov>CS`Mh!wdZ1=+Wbd8j9X|K^6UeMUBozTZ!<JQelbqdfl}BXw_vf zBX}C9NVHsitDRYj45nRv)9gcYb)YA(tm{5T_2Z`bX8=e<TM2N8q<&8Pvy=QUSy9#P z`+WxF%C$U;HQkm5UT)f^=h-LQkYU@&2(C|Tk7TY0U?TLVZz+vOgKXKZgwCx^dGL+W z5gyf#TDkt#<&7$`Cmj2}@k^<;o0(`Ou@OyFnY4%*w#?poqDpakO?w#rVrJ(n#C)Wq z%sk5&kJed{T{@TyLbE%gxQ+=L1so2Pw4Y$&g0tcjT+@uLQq4`EE9FhHp0W+BJRs^a zqke(t6Dxt>NvZRm_7#Xa&FiQv#j$^CD1y9JEqVOr;X<nCUe$b~Cm@&x0%@nCsB=mF zKR(q2;8Sga_P96!G4C=8hyMpO3H(ysZ5{Cm6PNXT%e(6LDG=cY9;})_eibb>aN2U* zp3$$EYz>pFreUn)_L?suv?O@kn0r=lreo!WETGU`HLYc}2fAfmno*2lZ3{|?=(C&} zFWpq5PG%}C9%^Y;4JSO)S|qGU(r_QiVJ$;=wtni@P_31!Fg^R(N>B&d-B)YOEcKMd zVZp6Pm#^;B^)B*$d5){4Sk;mvpZ1#c4+rz#u{yWY##0)=mMq>fbn6f&A*b3g{ZOh0 z-z^*gODhEnZ4A^a({+4^AU9&%l)wfPoh{c)VeKkfPan`RbO;-OAcBSdJ{p}alWTB) zKHRIJh);f0LU~rD48%MgOdpq@Pz>&O?k55n)Xvk4c@lbqWpDXAg)<BF%yUn6fn>JN z&<N^3SpeANNU;<b$&EZCkQI=m`#J4rkC25~l6@3J&p>cDEH}kyP)_htzg6CC{&)QN zzw}}%KmgceW+<V4R$V~V5)pm*byX-ebs5=O={2S1uA(S?I{b~OkO%qE?DowytJVc@ zGbf}k{U1jea9TUO1~d|zif@K3#De9zSSE5v->K*V_dyv3tPfjlx9_wKc%^N0xTk*! zqK^F%*A{94j`M9Q-;2dB)m7miUILFDQ^R@$46rt{6y?8nFIBS3{iIesP&}iV_-VY_ z$>N*L2EbbEK|icL*Dz0$PqB!Fez8=we9V8tthGuQc8E~!Q7iiJX0dp#9;0DsGQ6v8 z;Q-=&*q+Gc(p$A>QCP)wJYzdYb}kc#A6ZoW@7v<PIIfSv7w94(Euz{h(lzH@&9b9` z*{St*<Q~&eC!J*K_qGhky=pVqh$^SpW)y`=Gr&aBh%)>}m?>y5D`4j1GTJc&<mVUw zKG~qr{w}IV;qQzP>9pTSl9mTgQ`3a*Z}20~l;w3)WG92LpO(eP=9~axC65cy&g%?O zgPHw-381XVOXGVkzV%j%bK6e>p!gUl+V<F*42DG<W#9vM0@B3r1ufvj=AK#9pu@rX zc+jFumm#SVhms_$XepNbzP&=1?C(!gmqK>8%|ldpKjd^x!A76|!_0_C+$h|2Dgy8_ zSz$Bl{?Trwf5wh$Aok^R-LnFU)hqU!lGJ;Z$7cV!gvV*_gzIogaVIjCJFH44y|O&> zs5G1YlQr;*4In9VJ8Rs5BFrBq1t-a&vzD7N?bVeIQvGIA?cSt=<t8%QQw6y?ycf(9 zH`5DgGK*pnHVV+qprjpJdBHtGzeB{(;~B4IIhV<6&v!QfG_R?t3~$p3dF8@#*GO!k z{n%`(x1_05ecr8S9_f|yT%&rJM4i2>CVI{dX$?4jbUp-sjiT+nR|a{F%x4jwIss-y zz@pA&S-nT>E!6(bcA_}Nx@=XA%X^v=d9lsZ&ewO(L6^=3<Dd`Iis}ap4D@ho<*Xp@ z9SID|{f{^@VWGQkXmQl*><<D#T=Y9iPyNPg$|&iwoIVCpk>kYr1AA2G!Rdin@;>P} z2MJ-|aAY7pL8mBI7n%B7M1>sr6+%Jq^uWlERrS#NJMv0wYA~|I3>s#{AC;^EoZ|uh zUOsXij`Fhje6U2JCRS|%I2J$G9^T9jZVYzSXht7o5(-+MSnP3`O!T-&_t}`lpUIFg zD7T$Vw2xW@;u4qB&3pi9_P2hB{L5m-Fg7}Vrwx5TU4AS3n#>dnomJUp{n(n=2L$?7 zb$3fA@w?g_C`ipkTl(KPnZueIkprRS`n_Y#Y+t^9OF{`P<9FFH2Zp@rKwQ#EphY&^ zdsGn8dic|)-?$aq^OIiY+^;Lb=hqL-TzYTXHixo;xAUUCk-M^5RX7Dh6S`lytRE*U z1BQP&q}P#WZ~Gze*S5T?G`Bfk>#G1tFpzUt&UTxVWwAhH6}k{EDQn?kECEKpyMQl7 z1czBa9^{n!eX^mXr0gp!3XnkC51?FVp^@}@p!NGzS0Mg=ATW9w+ZEZH6?qaE6a!_q zrM6Ay^heqsziQQYGEszD8a4oC&sJv`=6+qNAn9%`awSqnSJx(m&lzWpY<)J;@fnX$ ze_F9l!}Y=aOIH;J+MThq=fryzCQ{;^{6kVf@lGYNdGikyTVKUFq9W&uv|Qnu0{r8r zeD7i3Sh()g>HxaHG?Y4!Oh`+e*;k85N&T%RdjiW9s{0p5JxpJMdZ4He7@t3PhRdaV z!0Ne8WkBuIRxYx=Q!i)igMM<|lWHKkYY_UJyGFN>s~Y>EP_@M#wKg%_#A>;t*_BVf z%*}o)xC{u<SZg9LJYP8f;eI@FaV=darY}nEyZ`Q8jRob--iLEsuDH2zNX~2h+}HfI z`-{vwRX2?mxXw1&uVq>PzIgR>-YjzV-+|v$?2h}71=QtgsJb<2sq*}q|Hdv80<zwm zD@fe_7ES4W`LcRqz=uR&ar9RaZ5UxTUc-&cBaZiBSIb{==We1CwMvR9cTQ;VOK;5f znNhNN63j7NT?GXs2T`bN#h-ZHMgM@#U~cCce7~9ULqkJQI_igqvvYH=E<GAYwfA>+ z=B7~-t(vVHWZ$~V%gZ<Bhdp9fpuKJ)<?=GVc%qGt)9QoJy}5je_H}<Qhl2rsqzOte z99@yPS&~J%xp_<~osa{Q2P+O4(jky_yX1ULyrTKti18BdHO(8O$Jdw6Ia^&{D$F!< zUdyNm;-!FxjM^4tu6?1=U_0jAL#~o%O4+}N{Pv5!TpOG-{ess@^Qc=*lyUT6im8fq zgg=s6M>L&x@#CZX0tLZxLFKa#$5G|;^fOvcrbxf39x5})54K@13luT`a)`1I>9uT? zQNvuVL8qcExD0{dBa+d0vaWpxDnW<SSGI9_r@XD#bi_@z$WK1lTHY>?u93?eY8Na= zjz0%b!C03R2f!D8@MJU+VS_Tpu+(MY*2`djAyj-Cg3Dk2Zh~*IP`5Xg(pC~VYoFwa zUaol&2I0mW5hggbEtjgatU1NSb0Pw1<+`^H54JZ6Nz~c=z3%!iOh^r%xP^!cu|QMR zOJvT!Q3nS+d3wUG#OqtQG%@n+aoc9fNb8zg0lP<v8YINuay9W<s-8EJ%JvLbQoVb_ zpo;}XH-Jt@yN#NX);>nBW$Ekkx5Dh!cqqI-^Tp3Bpv)~tBoK$`XK}sZHLAwO#!wcg z%`6XQgHF78E5`R))4q2q*^&?LJW;s|y6>`g8JZ)PlHV=!WA9FsN{x*Uv+5Q{)-#mY znHt;NG9w9~F7c}O!)Ay|bZanyB5)|2Ea6P56{uM=zpEre6Yy)S9*Sj%v;gG$oc2q$ zIF-*1v&6&Io@indfP}(;<PC<`-7Sw_Ax}1q0tS+KMW1U`zi8R-Hd<B|j64rO`+ji> z&DE}RcsW4$I1zPl4gk?ChO<MQ7Jj1AP*Kgs0^QXGJWcVV_0BT+8i(ZFDg502%|-<X z^%5)i`;9?roG1BDtI~eBgEQV$y;q#B+zit|`IY-NDO1R}^8MKKZKTPo6an|)yRB#o znf!246MDJiH)TdM7d1c}3!nWGdi--Fn56ukF#Bx}w|E#?@g;&uF%#YU_${4u3SamG ztbx8HZj06KRZi~<rv}l6U(qxpaZJkLyzI8~0!^uTE+(NwOw!Nap+_W<JpWpeFkT@} z<z)<9TR5LO0TwyE)WF&Z4s;DmCvERcRRCr1;o=atLX?pEali@p^-kl{0U(NgqhUXv z7v;qM%6V(_HHlcO2LHi6^oI3yqK+fzh5BPID@ovLU|$2R%>&}^(a(3D%*+VA3vX=+ z3?00=hJ%~-%=7m(EM4~J+bu^mUZobXGU_$S=e?`iieopCHY$2uCzHrJ3>=}Kp+*#l zwJvXw84VfoSMOyXahP(h;Viv8%Xr{2`aN0*Ro}zm?b>-6u&=)#Oh@%b7>HwJii0z( z3>I4gIUU!+eiAfO?C&<dNZcPUVi{<(W%NATA>wr);_N%lq`>tCD_s9HlTlnwrKUcZ zVsCe=UZ9x(kRV>YH>zhH;YmN%##A9!xniLSTbgwC!2fHm<9dI7I>UChyBw$aL8D61 z>>ww}!EBMzxBOuqDtcLsF&{=XGBBiY&T)9}&Xu1+H>#C946~~saDN5|)XXLBt;2zC z&u-e?Ht@+f?nBx@w8o?MD$5DY!EN;2xrPCow{K?Xq)F%)-`$OfpcE|rS;^~Qx^DJn zLFiengCx{p_3`dp#Xx)^)jE@6Ihme>+jNy9!9LQqRz-fPE#$jQ4ZigKrC|CZZRUs5 z?CvdzgD&C4C)|pe0i#u(5(2(?Qp*X&M2G8#j>7g&Xvaec+|K1=SfA3#K1|JQ#}R#y z=_MSwcPR=lhGxb#q?R9KC9}PQ1$-}SQ8Hu&v0=<Zbw|P-**3dF)}Os#TL0Yi+)O8F zyDY=vS}c?#9*3AUopo=#Z>G|yQ!bbE6TI*l$YgEZ+TmIzBlR0l7nK40e6XnzEA9?8 zQ!+2^5nZf))Lw?DgvP?5SCqSm=u>ojT#}2p*F`1fSNr5U{WKz?H=_BGWJZCZL@K!> zJ&7d_(|8>!34j$S+ji=b0U8W*{YYT_;4>JTuuZ)i@sxv+@9F;HlMVNqW*QUf4PIPN zeww(qsREDM!-)Me%Z@mcsplF!<(aI!j5XrQSyMj3A&1MI%H3GeXx8(!kddS0$$Ctm z9b|_ea02BylYi)AQ7?3d)x*ax{9T2U=N20GK=b>l{GP0n)$YuSUa7$f36D8UWrZg0 ziOQ!5D1Txw2qYbM>s#r&<d`5HHt2-|-k=dmwaoMNgk9>nWGLj%2@M?8*TfVDXo3FF z@Mr|TKBt<}jcsNyeE(2Lq43zl$0Q0%s>O4pv~bkxa^+Aw5cC7THCN;20OaGic(dFg zm(GO897asT9M5$5QWf!oN6c(0Tv9PpnWvhz_dD%1C}LnwZ>WHD0Ej?XceC3k(P?n< zV=Wy%%Io18$~#Wn<lWcuJOv4hg_4?Ww^i?pPuAqS)H){-8zJ`v?rpzPS|>^@(YD8R zx{EQ-q=ZQ}fldJM)D5nQHb-#B0>Mh1wfi`23s+tZ_$jKpBRR5}SrYic3Npp&S`{uj z(uqR;qNu+VPB*5zsOL4&jX!*?!i#Iytn*^Bo-3cybn*ESO0h9#i_)VKkn!l*z7t~b zHK`1*DYE*#vk<g9pD?w8{aRPBp3n5?wd{~#d!Ad@K%5eCQ55q$U3?(_C%<bM;kP){ zz}my5<8virk9M=P0S%$|%|CdZj@s-8n9mZA92W#vQC1S`;adeB+@5Pr7fGvamnZw{ zKasU12)N_iDa#2AG~vEFu(|G=h6cgET<7^I@stTF^Y$>5HnT^Db#PUT)T`qTSxIQ8 z`2E-G{i)bz&*-qp-9Au5v%6wOEU$w+50}L1-4=haZ>?9zVJIr*^lCC%R_}D%8SPBk zBkVTN613c3C)R>u8RYC3LtGnyGIFJEl{_M~I~`bT$zX}ZsgGKA-45xae2?_Z@;NQy zcF^#kDZJjFieJjzGZTj#MWD&~w%pHe1(D&s=B*`6;Iu#G>|(Kx2@WkdQo<Uhi$o}r z(7G>tpnZ1!!BMdz84K&H5@=X>ufAHzZ}o()aQMWjl5JN?*OBjn;k<3^7;{qsl?5mN zX=4~~T0ozB;k0nFs*v`JpQU!d#T=nzPZ(6NKGH+|cED^^0&-tlN<w20O(~c+ZDnF) zapG8t%8d0Wi;^j~Ca*K=hi-5Hj3xaAil#pn!As$~Su?B;CX0YVW~ABQ4=eS4&?8Rs z`{2(?JS&NJQLtvJt$Re$I%%cr5QBpS>TDM)v0g5Rgtd<A)pzdTptRx<iO+0sP!aXt zU6=qk{zo8E6esJ!^o(fAC*P;5ESX=coS3zJjE-Z~@u2ZOSa@COb<R$6$tu7lbb9t# z9%U1#5>VHC<vi}=rGZ#YOnZb^J^ssZZLG>tJtcxb1IR_mt!_3`iJ_6efBa%W0`pV% z=!<+cDwILzK_K&{$o%H|XX{J(JvL_Da^pNyKCg=tfF2DuMtKrlj24KRezl0@dBA(L zfiAoo2|nZIqC$Dds!{suSLOsmw4S$W0ub57`WnNo6M<nM;JQ7Yf|7~<srQr*jn)v~ zc&+b?LTAJ-@qucK9Txs&$i9ReO}<pDxYK1VGI-Ymgu>pbizm{nRtdS<ABFmW<5%8- z`j!tm!neDRDpZp+I39D`WDC!G@cqmHpzxtAipyFsO7SNQXZd|)AOj8PUl!i|fq%~) zeLO`jg^vg0l~(-APIrg5-$m0vDCkB4xC(Q#9VeS3L<?F=jg6#hM}r<#RNy;A)q+}> z4F^^hMgm&tcSY2tQPK~lD$KqiaVmw(`n5@x!oDq`7?-HzWxl%+)L}T~wg0N8<dkk_ z{umc=pCEh~p>H7Ok9E^M(6Xu~bzQ5_g=(b(!!!s5u@eyrFET1>y1#9FSI9$c2l@`b zz8Kps{ApS`=hqjBhE(7rDJ6&?d9ER1IZ>Q@0h`F#;Vs8VoMWYYvUs>mKh=KD9`$lL zc(hVe)Whxu)p>h5^uwLRjol!06orx-9i-r@jN}=)Z!>227Sn<TY#vS9rhCL;SlIjy zvviv1@M%IC^%QsG9y}whNta=X9#=jvUn1+HqFwfqBwK1zjt&deNS(Jl<wIV2-J=7Q zT5(Ps&`^^=w{`N7uZ^w~`f2)8`5sM|mcCzuoHy@B^ZWN}K?N)V{k|}2e+dm;>$Z;% z@?7Q~pFBVdEHdZQ$~ljHPKKkJ_wEZ0QKb+^jKGrI7Xg14s~edQ8RLENELe1g?N1rx zQ*w+XW_@f4sz|A1J9RK{Xwn!XMdMNKiTX`JQ5h*%)MUF;7!vu^%MB-hrB+k&^o7rh zA3ITae#gnY6)z<x6<^%YCC=1&vT3!}uPWe6KYCeX)Lz{vk;F0E=$J^1wsWLq$;ClW z6mYXGY~ahLbP#-|lBayg>+r_8^Pt&dtovt$eZkB}2VMu`bq<Fa32(<#G$g?=uzc@k z3a0qD#Q$hV@p)=c;2`#yE!rGj-1tlZvirPx&$jy?8^vH3Dp-LBfh6H@(Z(5o{Sy6j zpu?>@>qeAlqAOgZL5=9s;y(X@beDW3#a6rL=}H0160m*&4Dm!ssL+rY+MH|fR8v_N zD@q`>(&+_S5N<`(#%0~H#Yt2~93w>bqR9)p`|B%QmXXlc51vY7F%B6i@g#)16%}4N zKuFfSI?DMXL36nbkyL{zNfYM%NB1gC_6<A^4ql=KB9;9_Fm`=gq%W}3ToLlZts7Y1 zWpZttcDq&8m>q+muCQvc`h%n|@u%u}XDKHA6D3o8$GbC?f$`t>FIf&`f3a6Y(qvrb zzD3IAk8dh7j6`!EQ3%;|6m2o9=XFS@p!v0Y=H{8OBV`N|$8ZYU|7j#1o{oIBf7+zP zp1|$@6qYNWI=uFle15`4X&(Y+o}#h!Yq8LzFT(K;wD;k*M);2x=}<nM(5`d?5V6cr zeheH@Md3!w@Z@fUTTjn@gJh@@80*Ih%8Cs-qk!4C6JL6lh=*pCOuJ~$*RA39+NeCc z2Wp?FUf!WJbYJVSdbXl7G&8CGgKgrX*lp)+1F!+!gI}6l{k8h}yu?BzX>46=5=oM& zpI`QKOwY7&voj!sCM(@pK0TnpWI2FH(*)r^WgM(|>J`hTw@BWdAQ-G#&c~)%@0P(w zTHd?h|I3h0TB&S_?zv@s2U&&z{i<>of}f?IvQ6@{?)`-|rdWm}_fZ<b>4RLnyXpJy z$ICdL(1+9@1opYP9tT(8f!+I2Nqt*TN|y+7eNm2E2tI)9J*JalMTi*=)r#9T&-)-N zs8RyjZHojScFjQnZc(W)iUhv<B}h7oI2H?Y<qKa?jm_XnHr69QT0C`N8TFu8a*iqY zpqeXLSB21GimkPHOloR&(QG<U6N-D*gABTi<SJ6$&8$!Kv_yjANG;w<k&-$;ecNJp z3eNVYjZCF?e)o+!jfxFY!E%1$hM;@4ySbpxl+`H(vG?nEq*cA6j-z9DumGd*;tmKN zEP>*i0x4AfyC}Xo@yy;?C>d@ao0n`aPR4z48q0w~J{H^pQny3We8nt!EpXNKlPB&@ z>R33f4u?Pez$~FD9#klzG-96$C58a0=6Bcq)Gbu(dqko^cv*Ol?hs61;K8TN(v*|9 ztix~rFe6__a<nJ!X@8hRhReUwwozSwh;zC*GJzWRi2%DE!*s>-67fLm_?fNw;S2wZ zC<ew4@uL{HYX#2$zyCLbR&mDrh6*MpoRo|^n^$7qeD{?~^e*rGeBM88&+k;~jfmzn z+l!$KJ@*L8HwK=}G{{%L@UUaTiBZto2}EUkU5@yT{8Ff~q2wEwRu%3?2{GyRY8PH1 zVJ3i(u<5=jje8#8UJodq(C~2XaiDa1ig<vunZTyK<^bN#>OLaj+PN4_BN2CMIV2Ev zYSH#l(Pb_W(*)%pV^@_ygE*DnHR99JiBR|>j`4oJSH68Uwy+G&!c*}y$5OJn2G<3i zLF9vE*odV_V{;#Y;|%a4qt{nO%+oWTi_+&MQ<*Q&Ijjc~emYOjvSH7pKJU}Kd;Fu^ zt(fJ*=bzJ+W_@4jG{=q&HwG8QHLxl?>*cl_Tkwdkxx+DhyMe|!!(6-;{cPAn9A01R zt(hlQ`=UW!_lP1W8Mvyfrs4uWE;0Yy0o2KwqEnjV-)~}+awNswkJfTHEtD(n%gQ&P zk)z^(c)jADW2U)yl%dE18*q?5pn}dscR4pKB@Pq`JT9nxo>aqBu;&p}fTw^j7249L z#hG#PX!!8hfVT)=oKbf_u>{rEV{YFcrrZ=@42z|c5uxO-q49P9%5Ayqpq!czi-{7% zrkME|hxJ|Uo6MVv;+jh@tuRl}#pbs2Q>mc4D&OBZnY>2q_>nrnw{Sfi_CcQ>bK{vj zyB}yshu2D?q&so}BRlbIraB?#FmPkmOe@NNgYadg^nA@w4OW$oWcPX;5|d3Z@FAtd zVr~*?^#$>5?)gz=vJRatx=7C@@`VxRMTRC#l~5oqC?Xj((4eu&x<M_D*22)F%V`;u zw1KB(<JFcRwOsMU7GEu=%m)UUu6};diu(*FS2B8(iPQjteWH_BWd=y+S|+&HRI##L zIdot4BN5Y6ts|zE-0YIg$kU`ztgQQ1tSYMaGWJI;l=6f?f)2f_O+ey=6oixjS%QMY zps#PZH(Q6e+{4Bd(4qc8u$=X@-+MS)>g|xx8)dV!8F&0S1C$cE^P|-a9<RNC%V2z} zMZt9)ObUsW<IuRmXr4S~`1<%RzFK0L&)XQ<=&wfW{S}z2GAPs)7~|O?j8DXHs?~@i zinW`hJvHjW(?m$Iu6u+R<4~E-J;fiRIo-qzWV9S|`!D#mAc~{FK0>c1N*TaCYCEV= zD3W020a1;mz=Ul8PoBDmDZiekLubqDd&)%vhS|>lxGGU-IZT*Zx9$IPXD)z$-QJiR zN!O_U6w4j*WKQ%1%GAmz-%bFry{f)+<740V87dIunKktp#CyBrmC2%*?SwM8e>k&T z2`2A0FqM7?PZ&c%`LP%oKANR0!5q&`;|+(hZT7B`JFQ&4^5|GM%!^_8cBydIW>!DB zuDbxQsv_qeK_lr6>mm_2Hj$BFKxlPTu4-+ZT}g17Pu_3m=M1u4=hM`*eFV0-v#XC` z8>vyef`b;ML&u>&wxECP>M@ED+H}0$uO^+UQ#6z0WsCM=>FtdIm;Ah!O0~9oq;Cr& zLDX6-gS?2!XR=*4nR8r{Otz+HSpgrBr<<GB&eUr2>cR$2_k~4#f2Ng*Ek<R+Q5lnI z%vkde-kLavAkX#;ey#|$J|>Bio;MIfZPxsX!*q?<K6QMO&2v!f*OFoK_LTUh;dG-< zc=2PUQ`gh!vR!#S)om9+TO+;0ChdZmUUvc<#QuP%-NQ?rTc{IQr02Qu4_<!6ClrV4 zD<WD7D}**J#<pJFCGmJ&VJ4RgB|v{X%)zZtASd`igz0{Ng}yi0ekc>!1l>AAFqs*b z<AsW&Vp^b9&8~3Sa$80)0o5QdmpXv@3GuoOY(qJ6u%0D7iA!EZe?OKt5On!8|2kF3 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�nyG`RpMqqpDHFb0Em!!}sI;uSqxrpKt|LyjYS zcY>wpkzN1zhT-*nWN`b^{qH(0$EMwc;ixNMdgTU?*P~XK@kiM`Se$og32}2-bj(&? zL7(9Upqn8&VNx*d3A?!PaB^L%^i{yS8@+c)ur11QEbK)UOZh<vowZ9%Oc#`ul-!Uc z6_)zC7}r_&duW)zxpHX!k=MKk6{&qu)@Hb#6}k+`x)#!#Kn$~B|Do`#O-Pm)UvBDn z8tDL>-y&E=(2?`C%>5i1u~iRA&XZVM7I?$uH!F)tyjQVmSJ`D11|MJD1|2i7AfKU9 z*<(#ejl?cY(wUQ!ppO9<{6Kkrl;wKQux<zkb0?e1#6c>IZe;XB#sooU6vp~=In=*x zrln>Bphy4F+Kg8x*qU6s#=ug^ID^TNikUcRe^FRK`6$(Ra97f#z|WHI;Pu_NH)4yN zn6`=ed?x2Rp`#3?U;ornT&8E+@Vnfq?*ZWxrw&L7#9^MN+^#i92mrg^tNqO2;nvu@ zyD9Yi7Rghc$(nz!Q}s}gh6nEbsph9PFD+xh-sC=x#&or@P_0;{FVY?^QIoT#9y-nm z8Zqp3uRDdTiVWtF;W-*Va-i1%%|wU9{_93etXi`50=KIYj>|_!=7?~81i1-~xJfi( z-huavwp>p?r8#|q6)+^Y-9ljG>H1~4uOOyX?XoEh7Jw#el_88G*{^OszP|=3LDA|q zJqyZ6Z<%qwO8x*>>>wty)uqXAtfdSWE~;`8&bguQt@&dlF0!z)Rc7Hdx@T3P!A50d z&Qzeh-9}>o46a%9tdAar?Y+>U8ZqBD7-hbWw1hpsC39X)*ABXYf+ca^@}aq#KnSLL zQ-goJV~#by4r=qfIX3?gPwBjh59em|26;?y0;HKvnKfFdqEmV%g4ttn`1R1yN}na5 zh8ygM4C`iKMN>4Y9hZRBQ0^wEhia#P<LId+06)ZuH&*`hYx<^(Pg^>_dx^=`APZM) z?dGP5*!6Pfa%*ifCwJ%2hz~DhwA4b!(f+9i-dD%AmasHx^AQ<0&~7Y`fTQFBHe|o0 zYG=p~*)0e{%UJZ+zAnI8+tm28MDqk<O#ifGyVi3kyJa0I_ITXt_%KVfN41<a!i7ZB zXth`u??PBZ={d25n1aW}9pTF3qqw1!*7FYJbVsMopdGa>k1qo6YGuUt#+!JnJwUC{ z2DxPBR_^|)K7JaI3{D3W;=Hf6G(f#7ckHMiamipwO;398YJ;Q<y$CzmZAHDHV+~Uc zE4!uKQM=NK@VOA)3P-&I)W9-@@fNyFrj@qSR|$DeA%i9>N_}P`w*juiEwX_@psacE zHEFCqLdTZG&PXc$SD}+GF4kM(f-FpWEkQhHBFoF9`EyoLga%7ciQkS~sfc9bl)!`! zhz-U|6yIDm>vW?YT3p9$G@xA+R+F@yjeK8;t%eTH+=hfBclg7AY@JU%P)=0ia6#Vb z{VQy8k7_Tt6F&pOcRKKQ`0V<PBGClyzxhu`(=lj<dX&dGV1j;Z;B5$!;TW{o!pBZE z%de*jF0KJh{H{pk+4YM{78I{F9=$jg*BAjES=GqGbe{lNUq8g)P9zqEwWsE+_L*Q_ z91<pl&g+p8ri6|83g+prCAyqk8xy?nc1+NGOF}igpb0&yn{vDC_Y~H1%e0*~?@vD( zL!*PpT~7n59TZV_NUZC#b@`_ca^<moB5)D?zn_rZoh<#FVz^Gw%}5{}eGcbT=sYIf zb8OfVrkazm(Eh)yT>o84zuqC16^EyL=cJh~^U;*EXXS`~BQiqHGFk>roU&CtoY4ob zs;eE2W~{R)&>RcGG%39DEh;$h;Z2<WR_New%v5yVM*!dORwH6Ba)yazI)_J3GdhQt zmrLnfx_FOEgNS9c-UUL@X`A&M!T?q8(rh>hZ!sD#SM~71HLyxjefB2C-7?;5(6JP< zdngJOUG@f|M<4?3p#}!!v~jc^N%n;~fgg!o+R869-Jc`%hJbxpbby_D{7dY!PgQVM z{?WKRGw(ZEi+UxeA6WL%5c^Gk?89GJgxZzjhHyia4q?)t|II@Fi;V1_De@||w2_?W z#w&G7d~HdXwtjKfWv9GvV`f*`IGT2O$&#zGK2f#7?~U{G>z(uc-?h7eH$tNaESq=F z??CQ8xEAnlp(Myc(dqiB_CpS#oVFrnE>GGo9DXD(70*gzk7j-PnXLNO|I0|mc|Lh8 zeD%9S3lD7^P@$rFlvDFt|1$Jf<oVvAE+KeqF}S669{FP>W!vxm9{Clq0eE=S=Y+P( zb!n4AqLzz4oWX@%%kZTwQ`-c)XOfLS2b(H2T8>G;DJ)#+(Vdo)6J)fpF|T?gqW9_q z0jt(U`OHYdVu1F9-QESoTDSI_OPS`cpusovx}~f$=93^5z#x9C7Ge&VFHZ-w-aDW8 z#FAqL%6MJUVFkq!aUA)DSs_r$$wZk|_7u32E20x|R`sv6w9ISh@mVc}b-9<vE@mgf z`)AlRj<|^i!<PWrH;c{1lqoJ!dbQrUd6?VU4|hjH54FYbXt1`|y|SniGx$Pp%&|fW zsCEhuY+DvSuy`-(AEsSGGQY}w{RE%_RX8ZF+|zfpXH7Z(>C$~i5XXQ5@^j0ofoQ$_ zW^zLr6SGB-(fb^BG>>;?5HcnUGa_f<d>=m2d*Qvq^Fyy5aur;fVcF*K1qzGJZUynn z1W7vHpehME`xpWY!oko<8~sTmGbGciv12tdK8s(B;`n>{Stp+~zI*MGV|u8hSu_(Z zLTh~zg?u`UV}{O}e(xbI3(^id=X|FzIjXcTz8jUN*Nke`#*St&A+0qb9d<23CFw)- zvb?u=)n$UZm+kv38P^Z{`xgr0z1vvys5#+3U(Kd5titmSA2kxZuUlb}2CFT}=`3CZ z?dqyFHxJ{~RB2E&GQR;1GpO&x_QLxUdC2oKNMQcGFhwi39SdM&7NAxmC4Baag!1RV z2=yj^2=%lV%Y2RZF@uL@*;5m8M*Xn2#lFwZ4%U9xpZ>+W|C@fFF9CeF$RV$f9`mQ% zq%#DZAZHMlziX4VHs@JcQD)YTN~S=2K|uk2Wg{R^pVK8r($|c($R$K``>9ed`BSB) z<VoudCozwgAJ|$?Y8Zz(*W1%&B0)W)_@kxt=ON_yk#wH!xCnjU4f*?f2<h&M`vrf# zfg~YG@EXSXs{L4XFjBAbASN{(6Vs@h+3z6`u6lqJa7mrU1t|-Z<GEY-PHVnQoFS(H zO$MF(pWAJSI}Z#Jzl=nuN|?mp3ncVK5u|wsTVnimID*RDBiVuGh@@Jz3Uym3_J^BX z4Ly>N+6xa25r5IL<0-xaj3tce^MBrdH*`C4B(p7LJeW+f;egxs_I%i)RhyJ!F_0ep zo})V5SoWB@Co!I|@<i^-glzRCuoMwR4)6t5ZW|Z@nmGvhId$~4>3Qq4e_aO2mUw<k z5{5T8=L61w67RvUv69RrsK%KE@^`eHKQx>sL$YxACK`it6VJ_YDLnYZb$pB{uRl`S z?8t)3rP}hTlh|B9=pNK)V55^LS)K`q%P4=oa=i!k7j*u0{$JviIe)#5zb{|d38N#= z+~(t`z{)#iZm#QWFa`qDoBXBaBOH+0&x}tMI`Y6I*B}<fLM>0yIl}M+35!;)kXi7B zSIK^c4_%3$*w6f5_}eQ4XnkKSppJBBsMeWdST5J3-KDcy-^(plTYHimm%GUS*K<QA zL=N1^)$1=tDs0p=MX+X>{pHukqXx09&5i}B)Uqkxa}T5OLBXyyv=j4Ph+i;qTL5z0 zQi&<DB?SCd;Bi&#kFXAnP4%21DB8(S0F{*6EeL$xjKTk!biO^?eWZUk*dOMd@rfRw z1`r#~Sg0X_27Ml5t^F>(RVbBCuZy9pF0qxycDaRG1I#YOkt@FTSjVOK2wq)+Rc>&P zOo8Hq31A89qUQ+&UKhK4Fs`8+RtOQVQ&`*cxnsJ}$%-6I^k1PB9SR7mF|YU;Oa8_| zf3`7${Q~KhqH9-`@q#|x89H#Si{45Q@n&E%@M@nhFkgKfP`{lC=f9KAs!D7^ufL!k zo26V)fY|e)C2lA)i|+@Gf<<(kazh2g&+}1ZXP?@WlG$A7sKw2SFjB82P6)c_-p9*8 z2h$ytbz2}$mO813TBr^!no^<VWHDQq5&u}hu~57OW~BWw5Y8Vk77&skov`_ZoOx;d z!P?;tIFD)(f;)v)paYt3t!<_SQ~_}$o#Z*W|9k}$aTf@y@gKOTc0eZptRs9-gdhaH z;$MB<$we+E@U;B+F^ubrl$*+IVRXjc&5G3Ir3E|mTlH3C=!ha@x)PN?j8-yIayuZ? zeJf96@xe4br68pL`@#EL=H(A;<N{zL(Gtn)1x7|vx3_RSu6&+YaE+Yx;{3>Y0&&4; zj*wut37N|rk*B8VVsF0vD|2RgJS;JI)Wf`a(P|nJT<tJaw)j#dD<Uj^W4YV)$T8K0 z^S8TTNE5yT%YMfR%i%nq3G21dn}s%SzQm}R#40Gt9$)p+PwbHqHcM6hF06ol97Y%% zG$1u^s#p;{!b32;+~#@_@cLlB_H<wUy~W7>%!Ik<0fL`!XTa;?dyAs9rJ2%C6K&oP z(3;!6&VeD(Kg=i87J=2P^3RQ3OYhHLJ{{lyTpM8<a=!!F;>m&$XrAFz#*y+bKZ*Zd zT>2A0&xxT?b5Ds|{J~O&Z!D3dHNramC&wcNMCXyiXBlH_<pr&d99(pOs_y|T0AwA6 zc+LV6xd7M2Fl!g`{Xmp`;Z_w~saB6-7~Zga>R%OdpY9T9bBbQ4zOW!j=2P$`In?CX zxL4WlXI&dnUUiaCY@x&3&*E%`6JNS~z8oE|fN^*E9M<?l_7XFqJjf`p?$O}A^G7;& zg__D~W5@z$ZYXL%T~_S*$Nuw^tO{Lbx$U^;yB%9tce(MIC3GG$hdf4Wv45Ove^q?{ z#FsmT@UEisvy6JM04wW6T(IlmyhRJwX8CfKSF19=Vw-oN0FayiNUQvnaQ^$BRkgpO zHz^cixO7sc3e_#N`?!N^pTgo8iMyjV(CH~wD^5_08*G6`CHgKPr}n<1XZ4akc~3=e z{yZm?q;S4LQ$|iEr|YcxQu9P={+jOTv>WY%%_BAqjHk!raFu?sT;sXZFr({uUo>GF znb*7<k%F{L?(MA`ug4*s^<rI`bXe28hRunwwc`JFegD4NFzi1Vf*;A)3B5-XV0-oi z*S$9}7)<34$`vC9?k=VSxL(i#jdw5<mBOM&g4S79(CResqYj{=NRqf-(6YIZ(_@GR zEI8+i35>6qDb}TO8o<Xp7%}ro%bG{Q%**O^peJ*`M>6-~7dym=;O3%HYE_Zk7j~cE z*%+;x2W0BbYazJAqG3T{$cS^Z{!WqSE+E}dc2qtD(RYD$@`uU%yS;E%9eoO7@M9h5 z?<mR7m)0jy!@5rBmGQ<08w37tO8fgn3XhWeNlpJ%oU7*A*&GV}*E{?Fc(=&-{*-*g zqHTA@y)sp1+H%P}cd&Y{u2v9-E?$!1hGYh<08C`sbiqSNdp4?lwhgepdw-g!xHqsy zS!aC#*K`o0z1ydK^8HDUX1UgkOCIkA9)(aaK|ts@zq0)yL;$saLf3Ug40(t7J75l_ zx)ubhy0Yx;X>qa5Sg4RU?)&%E|0ACKwG96+5h)5g74lV4Y_I?lG6rstf!uk@2T?N} zr+J_1R5s3PygL`IY7z67d_g%QTu(kBC7pdK1b^ZoG4#-e;M@yMlk3+<&07mDVUf|7 zbD$1y3i-da0K8(a3rMt?O{tuQ6CEZ&U(IoyII4L4ysD+TZS0$s2kVE)ZBpNQq8pLh z5C-wrv(de`hD9o15UpPO5iaY_=QLa!-s2*GDdi5JfO4@cg@CGg86Ly}W&l_A7-+)- zP!2|m(qaDN|5jk+{8eBS0rkba?_$V*W%K{_CJ4JA&?$5C1$kW<BfX`F3r5BsD7Ssv zb`+Yy+sEWCf+^^Lcd@TfMpb*WQfFj=O^R#F8_-6)?PGd4`h6&QNHsKuxY+sNQ&MK8 zsI+u=o$0}+bS_&#MxClK03ApG&XPre@Te-C0pGgBomN+&7Tc`(j+Sft^YiX1UmRg_ zwX$Xl{wuBgd1nmCPTfwVy66fd{%;tl5fkngs1e)k+0HJx5rS84AUp{UeC!UgA>TpT z!?oB!bGZ$VPD-pXVs-(x{K-TqTv8+mC|q2!T)gqP!3R~tVZ=@<*}Leuz_5?oDPj8u zMs@A5G>K?247vCrdMYn<lGh)KwS5vUMpjVn4YDD6#K&M4o&}}i{?WkE@+j*Ah7)}G z>sRZaQl~9;7VO`h)CERAQlWv(^@qqv?W-L_fGOc2_kJ{Fi&_YM0vDVRsx-9d%(np+ z01ng-DMQIl&lrk||B*l)fdtCI)#FniZsQ4H1SZhujKAM6^mowq_SI@lP8N&(AWN{- z0)d6|XT5&~oK<YG?*^UFYHeQb8;w@oA<;$ivj^M%p>B2z#sHW^Y$XurvD3XP__+I8 z(I8v^zuA0cc^Auqav{H`N1Q%kog4<2&aYUybGX`AY5{Vpx0oC+0<@7(+6=-{cnvwl zJEnF1M}QlEf>lt@RYMgnR{!g-tp@tVc;0rz?_d_~KaGiCw*|UJ9Vz2sH3!2okUNo0 zE%xa0DSm7=GKS=o)$*6Ni0c=XYm+#s#0JsPu19slQGiDq@_&nR5!1{7stZKm1W6t7 zMJWRNB9zHpc2SIXlweGmHhpv4>tQFlp4sC!PLpB8yb&IWMuEy-_88cxqrJ4PJc~#y zHf8a-w9VS)hv@3FaI}k1k2*+%%t$74Q+b0gzwSscf!`7XA<qjUxjvBEFpq8YyIBVN z3$_<3b-wz4rx^!0DE_AHkoiia32Vjhu8Cgu%tc{@Ql(;ww+4!@ftDv)QG{xRoQKC- zdUVye*$O>bAj@!XfrZB50MYa)X>!x28sLMWpzbFh5A{vpP*+QR1N?I^TE3NO*9+RZ ze)7ashuxno6$7}(x$Q5{sh`Sqh-aD<0k4{5cs)-teEen@8%ZN0Lzy+{R)vKo=ZrJB z&FQb7F}T$+!otIIC?o{Lq1~EP27M7SCrVzwHLf&Iq){|gv~G&MSRt8Z{0mk6g&ddx z)QM`lf+H=T*KiwjinQZU90-3sRYB~2gZ~!!go+Bguqzk~sET5YjExabl-5~qcPH|k z0B@jLma)!2_>qPKKtF1CcOvs4CULm=V}|PgGbR5k<w<q~(|Lu>;32@etNXYR*ptIS z?!eI*dPDa1%!BhxfercAgww&{hX`4mV1c1|i|V%mqSNH-zoZBP(2sbgMr(jNg$}uT zn4Hn21_goKXh-@E3~2q2rQx)4CCRi#kWs2s*S6#zDFn>#FKIRd`H^=oWO_#~QcrY~ zlF0%wN9qAk8bjyZBNTl{d7WE(r7}Ajs4$7S$Q$QHo)9|zEDe&!NjWzHAaZCqX0U%I z#)BPJ*1wny|4s=LQm<lj|J9*U6*rVCEY>YTRj<(Tr&q5KM?5>Lv)`ck++e^ulFk7^ zU$NTcb+)mk`905Df7|ss@=Y38c_Ty(Y-Pcf=+|_0z%^NxRtvK&MVY6%gW5t|{lR-t zZn4h7QAs_8Q9FdhHy2ltidW{w$(QU08*PR%cZ12#Xy(>Oe(F>4awz6ExykQ8eKGZr z+4?C^%c1LhwdDhOe5_@j*q@;lTBv%}ewWI}2$Io=EZCe5z)sclyS5UN;o~CCp`N;# z>TJDsOC)`hltdtA+UON7gD1!>nV~^acom5@xtvv_l<kXe-o?11r+vD}W-6naP3!5X z5vzRD><OpO63WQRTBFdqs8;$#o?b5(FOe(JoY1pXx86rUK9gm^O>wXU`85*ucaNgE ztp_oQXLYtYz;&g5sw+6s;<~J{FS0_n%{e1Qt<GFodkdG8)yt`k+@FS)Ru#goeRd5< zS>^SohZp$}dLhvRXl=L5#d;)czq0+A1RaV<^-7^~BQ@3-@Qu>-xlh#cH!H6(9Zq-L zrPHT{{*4BZd!&ntwX($mx`A~-{GzOcO~*=vg2Dn7`p`3eX<o2WRNAXn&l?*+{e$CZ zr83eP(99d80CWtTwzaH(UF=k?NM@R}#<ny!;HsBt`bQMv<e0R@u4yh;8`BE4+akG< zis5G}Qp+TL?`okF;TO8-R-Lbi5~%Z-q33l&UxB%ZNm_G_qLC+<ye8%|KkpH`Q0T9t z{U^pS`BM(oLeU9xf;3bklfUEXxiK*h$9IRilV>pctiYc;WdF4N=MVh*(fiLQ?JOw( zP=dM%L{i+dZWCK_BudmQc58?Xes!|arOr|j|9P+EIr<`RQt&)DOzcqUT!QuvOp>@s ztuI<#E5?V)m!`w)OumBC%%mOLut^RZI;{Y?TJ#oc^rHxdCV(BN8qUFTA&^*_1ZVa1 zqUKmdshSljbHVaX<PmkC$MX-S*3FY!_fxM}FgsHK@;RXj=hTdx2|IF*7-FZ%4o0*& zQzRa{!bm9%LF2vWC&X8Dzv$cmb>#mUOi`iuLE9k%r6QM*Aw+=3<oVcq1<v^KshpsK zc)89H3x$Y#Uakx`5Et&U$b^Q$g!a#pk7NvySpAAUJBQUY8J}aeS6tA_!-|w(lQ|8* zTa^I#tBF9%Zyd`Tgp|$@w*qM1ttZU1Dd$%4@sgzg&8_P%dfp>%zc?89kRjn#qRX1; zrOKU!<H4P#iao?mT&`SC4lNvm5@pq*3TkaW7S6k^oYQd~C%##%>C0Nevf+6l38@&2 z6knrPr=R-$`{X+njdjytTkFGaMrC^uV93#Es>;tyV1H50HNGc@?UG2I?IV)7aFN3p zd+ia2oB6}M^l=^S+Uvs#I!?w13vp97@+fNA)QPUU$Vc#%nmVj3c8Koh&*``{aUpAG zv_crc#z1B$Hj<F3Odnm2ULOH>B~F}lOM28pVh~tYW?x5)r9E+#Yt_!0^!N8;;M^ln zg*J}7_KJd|po6C`x^MCCD3-%kkdw;?sudRL`D|g|+i}BmPU94<SKZ61WDu^e%T%jf zlA#StExtQvceSHTE}|R1uyU@67x9_R*$c;V0k%D8{MmftKhNKH1lUO6DGrnvTB#so zK8CBQa%;P)=dLDTNJ30FRrbkNQ~v+S1rlVHl&fS&t{cxr3FL6x!2^+lzr!|YgA4`} z{gnno%T;N?KwDG7Jk@cZdZl>Bs8A8Xny^PAUmoCBoo8CiM|=bc`0F`Ui4eKdZG55R zo&VEVmDM>fP{^lN+^=>vI>A~D5yWRgY(5j-61R1g8IlI6F?#Stb6>iEk`k4yYLMb- zYYhvCM8hc+*D)gmL?2BEduB&do6u$2*iqS-VRPmq8AZc^2ADLRX?{ykLM2JCe+355 zF?IR>Xn>89{ay6{%q;G5O@gb#g}_!h9Il`R<-EReU>j?fOc4Z7j-fehC!$K!D`jGZ zW@A@HRK&x&E_N6VVmpV$k8qicViN)QK<kFhq*|Dy=o3#NvB3WMYhDJoA(H3o;WE-8 z6gj0)>DaED-z!;`)BMps_j?)yBz|QZQ)?UHj|$kRxVT(p;zi<yA`}O9<Ev2E{o<96 z!q`k2>@lM)oV{-7daO6-NAq@J*GK#^(!IzkN1WkFpPR@O+4v=m1q~)oEcGXCCnl?> z@2;`wu{Hc=nfS#cUzX5lTh(gSp_5B7WC5#@Jmr&Pqp=>%Q)bmJ##Aja6IKS$c(E$H z>fku3PefS_U9w=Sk3iE!1;qTlCpw7J8m?Toc3EdwHi=%u%=P%=)=(<P@;iN>J$1*U z`i$WEt58z+j`<G9jRv8<DTix>w$N7A6qA#vXt%Rap4y%9q<6jxy&uE60M@}7CZ6{j zZdQk$Z(eK4+~nk-MOUkSO1u8uSk{fS$3q1#SDTmOxR}Vuypoy8kwT_#?JT?Uf;&s2 zYGL6&?}F)c(gyE2EY&U&-ipjJ_F#3^QXqB1(DTE<CnP0d(`#2m@wiIG-gh^TBLd2< z+|3qKUlzg6@T9R1a(vV>Dc{)&WR+#&u{WSB7xmfAf#T7>M8lgzVij1$&9;|xqz5zx z8vC9f#=LyY<~w)P_|?llrwwV)*^UMeCO%)DiRzU&NdxMEh|ErPv9sm6ip?%ZY+E9{ z6`#uKv(W|%m$JRkAZ^}KpoN15o7oE8L;%oBs=i#dwr{5?SW5j9gxZmP7dM0_Bc}m) zxdjv!z2`()cvNe;kovRR=#vIrU~6dmpC|QyNgqJRi~yQRd@XQ^o5l$^bcW<hi{$H~ zNMNy~+M~lJs^b*fg9fCjHr3D%JvL&K2)%kvlc0R+AiZ^$Fz)@h@Cz5u@tn*oS_?iC zEK>X7T4$9?>;(RN3^bX1RsX20=!Sx$8ke?dYu8`1{-^siD)6G!xO~!)(bI+phLLr< zhjrzt4eZ#S<eM@CE-s!Qk=-@+g?+v^Ow&4l)S8fe!W3oZ1fzQ7uPNW^{>dD$zAfFF z68}|ckXgZ=;-wQ}UOvbTWQB7o-|l~{%;&To{eA=iPnA}-SPW3R6d_f8Ed`?3gcHp- z!+_Q>^x*b~YbgTudo<-x>=b7G7!uD%3{{%?@OZLg{&RChnm0t>1z(PKHW+!DqX))- zF1_6#5*MH$9jx$0&xZo3D0xFVhT6z{Mo8{FnY?f#gP=PPYR6eIZ`0_t#m0H}Wq&9i zyU42MRK+{BRtq9)eb*q#w)(&rk{uY_Rg93@<^q+^X?UO6p2*~1-cizTdC?D=g-0aQ zt5{s?2sqx$iG|g0p^2})2tL#Ki-$=7g7A+aS@PBpaBk`RFh@&8`|~2CB46K42sRvo zLyqKo+gY@|Y`C*k?-orkv-jb-T)UoJ3Ku+J+hF=r;4YeOsYzZ|MqZv{XJWlqHVu|o z_KI+t8a+fzE5E0&%;#yU*r?##r=NIKD(oUN2-ThOGiTAd9C)e5{i`tZdX@TM20~_u zxFPz^8b01S*iSgIFnYvD955>^Y~Oi4`0Y*xp{1ssx_3T65n0aYjK`xns28Y3p{9O2 z>KL>%Kd-qzUY(_-WN<i-SO<tXHXjgZ{39ihDgGIQ47ke5$pO!C(OE71?4r;aV47%1 zgJ`?cTjYhi$9E<$Me@Hsy#M?pIv&(tW8WS!+OYO-YcxIDL8GJq_yOo?V5@aih4Z7D z$&lS1$)QD$K`}a`)X-4{<1cZ#BzFlekz(-G2dQ=Ci4D3!hg6KFaVgwD(V-Yq#Q4r^ zClb}gMQ7+PNM&3K-=wQz3Fw2%sv8}oz!Of$(rq2`PjvQyk&|!;`ShJcXOrvZ5fC*d z&8KD;EVNH>fR-9xOw;d400v!(40NeTPTnQZMTJYo8S}qKD=mYgb<lflmPPofhWOMj z_n!s7@G~&}{qa|E@n^TW1@Xpn-=1CTIWJZ)&qB2b9%Xb;0lV!fM*9!@_JhZ?=KXVX z4pcqiGR1q13b|s7;yR-{B)~lt>ouT3p;`3`aNbI%S7R{S*Q@m)PORcO=M%N-hZ{gK zFM{P4Fgq;#`E`yp-tcROPp&|mm&hv_I-PHT$=itc?~ey_wg{SijFg%>`Bqg=PCzmA z^^a*oN4z+|#y6~)@+h9<_@G$@KMhcMCYi1&;8m7q%e8d}m43YHcM<s_aWvnU7(*l| zngiBou!B}FRtb)%y6N3&Sy{`%!0SdPUcS0MTsT-%q+3%58wDc)Qi1fIy~_ieL(WdC z9sYjTE|NdQ*8s`ZkKnOmTdK3BqlDc{R75B97uNgdM(bs7M9edZ*nDLxFOl@~Ba+WN zTvK9SWzO(;>pkfWN2!KTh#R6~h+Hi(Z5ls<p-e@<!8>Z&HGGm30)j_iis)?D=Y{F5 zt_zEowx`SSz}A)rsQfNkkXw{YHSH~P`)vqKR5rGg>Kc0R>qOxEr8%OJ#Nx8MyZ6Ur zZIh@+3ozhp9h@de$a=RxAXyQ!&f^vA&9`Z0KMRtQsM7g%NI#Fv)hNNv6`0UeuQfTG zu8P#+!Sn0GVIE@5Z#2O!^uiwhZg%y&Nz+B$;l{Za_O^&3T<qY$iZmA1kE)DEL_{ou zeBrlRG{wR~&e#+bq_Jb5J$G)x!_r-2bm!CewU<Ys!jp{%?>x<}B;v<wxyb>PZMos? zg=9XiKCFO#!wr|+hc82g0v%~vDYWX){KFx)XtA*Aa_vw~+XY}7$A+_j{!>|p_?m|y zR<Q9rgpEJ7``}#vaS12F%z&SEx>N(=Mn=M8ROkAhf=4eOlPH@^eB(C!omv<w3AZ^y zj9bW{tjf3S_;C%Mwh69G4Q@p{lJ!h(uX%3@FS`CTgNO^bF`r;OtV~xjf1|amLpy(O zOG{-(kj=)0&B?KVSGhDNNgnGm|6x4_lp#t%wu*E^!)BkmTHdyW)1t+UIqeD>jY1}c z?sbUUwe=uLC_u9MHFo8T$Go`wi-F<?mUG@x*jipoO3g`EBS8I)2ceN&rP3)!;V@{* z$)++STXOtE4Ml=%>`$!OJtW}Qr^S6IbM|QCNn!fZ=3Pf?T!fFs9se{A1~?P{?#ll! z69r)mgtvcM^)!rzz(St)_1LVm4vj?PLO9AfRm^ydEJ(Hgi(XfyHB9R?xv3Sg6*VLI z;nI5U#iqw%Vndc$s_Qmotl12n$dZECJJV?YWM-FySl)5hpi%x$rp%M!hm7ouHT0Ck z{y(Qi(_9wkO<CV7a3Z)+R8=3uH?Rk_&M&%;Hdq^v^(1nOLg4JRcj_FsrFl!y-Om%j z{8kHcfSN8U4quQaD#waDcH4eQ={o^|EMQ4U46rnKZ);@Gng8p99zIUugYZCbs9zR; z{FAusYtS^XZou^oSOMre_yP?HKTZUb;zNHc)5;N*04cRbOVfO%ER~b}x1Rzn2eg~c z2ul1-)^7b<`CPlXNTz(p(LHknqgKx=)}D9+PcJqsz)+4!!W*<Z(i2U2DV|+~f-z#< ztX*#-4M;XNk{3%q*AxtY(|p7dxEy%;V))&&Nr+5qxym6~#_7PC3xBdgV-Umb)bpe@ z)||tWADIeRZ!9{nZAdB6sNDbBWm0~Jj5AS0init&A~!b5Qli_8qia7?AScJPryZh7 z*7C;Zj$^TpB(FBnz+OZk=X#0;iOX`@Pg>!q_!X9|#47pmL1o(orK=NQqQUFL9U0zU zY_yM3e+CAGM*Hg=dSxmVDAvHC=jES&lDRE1X`)w_lW2A6kpW#escX?E;f^QNfYYlv zeR-e<@xE8iEi7D0-}{bHKJ7d;c9{_a3D^_cU|2eGJg}u|no7qlq|wFPJIyh^{LL<h zEht!~Uh#z}%iTHxU+K=i!)38uyRSKHaYZLdrr<&eTHi>dD~%;c`Vv`y>d<ajq6UQy z^7G)e)2Mrvcj?;2&xhXv-p-%s6E>zwXy}#Ebt^Xy;A5uXJ+9gMx#;0oZ~Q}#*?T7Y zJp?d5ED)P^lOwf%*nKUw+rN%N%=c4_!^?`OFje0txygwqc7M9u+KKD~8p&l7={v5^ zb0Sk8<6eaO4!m68jRj24r@vR!vM9*O<ilMZD6`Vk-yx9BWw?ukH9Bq+EFJMPB#bvm zi-~pBU3p#~7ih76dH9VBm@_$d$f{?qK<%|^{!qye4Dbs;Lei}A@57WmY`wuT#!SRh zjjHaim}qCbt_V|+5Gjzs$j2?7%<#K?8D%g_YdtxB|A6$c>h+vryZxTsajdo3bA@-u z$NPa~Z77*}=ga7~qx6%h=^{U!+ukr`5MF%|Mm2ed+vY%}%6Tl`v-t_3VNeU$TDzzW z%UJHwC1H*9rCIb~wp=GNW#WX{tUcEIu>aSX&}(v}4Wh$2d;R)3z2X($AG3V!>q$g& z(%eE}y#i&Hz$WHqvCZ}`twWp)CI)3U+fvN76Q85#-TOpBesenpW&Ypm8639zfWM~k z$&UQ-lz(7?VQ`}!%K*uzWTK$ml9>{!eiImz;rQ#P`cBStv%u9ggj*j{PN$$!oq`06 zA_yP4*gH4HD1s~Jp;kkhxdr8G5(e87k(Su~g+P5j0TKgIkt;~}ibBk9x0MEa<K|TJ z3<uJhuH%hDxwL&$u;-MM_?q18;FU=LvV-ipchEy09Lj;V>8gayuW$A`4k{ZBcUt_G zn{$nVnzU&qD408E?q`Gj*)(GkoGqlMB>kSmXwV%nP*kGA2nbN*WUxVg=mRdW;@C`! z>}s7Pmg+w}Mv_+YBV9snCmwy?QX<$6?ZBXINX4uF``gi>|M9bb|EFpLeE=YvVzO|$ z7_(D+(5s3kBD$hviZbP6irHYL;Z-y@D?>Ty4@DD|7vk_T<cmVSz)Mvyeq*KMAM$;~ z*)WfxKNzj6LEQGCUD>m)UBJQfJrj-2@b!Ro`4OL$LqiMsoJpjCAkCKyo@qP;>-&k& zpeLt0L%I1cKIX=RWXAlK^WC@(Yk4T%2v%`Q>@*6Y#vNmVA6wC{_l!w-y~uG`2aq|8 zyB^0sEw8)M=dyfkPt|p4Bu;TWX}O5W;CD~3m3rw6sWgri7^RoCQ#D_2%4Ro<@!TuG z&0C{hKAEd*w@x}R$k0h`?kDvv>)By0Mm$r~Q`_x;YtCwQaJV^!Zv;etn-^-$nt@YR zoKH5(|My+0L5EsOPYI$rK8Y|c%%wuo_gDx98C)C%Ngr2BWiyOB$g(Tna+zfvhvVoI z814t->ct4yB<!pbaoGgKmw)+eS}CAYe++*c`rwxo`7l7I+#nI@y~Hu6cU-zRlEpqo zLUvhR`MF`m=b@?3ldHxuSbHfDjeozeUk(22RAF-S;d!KvJ0-uL8o$LPwtjGfO;!`A zZZ2O7>t@XN5fWDInD`a0@n&{q*+d=VJ@+pz@4h$nCKH(YQ24N6V9xE|zODTlR0=c& z7Mt+6`Cn=jFe&?^iBA^6Uk}=zJ?dUOjkC8$bUjOL5Zu@9QXS$fnA_Kl6a~|Hk34Sz z)zzQv7aU4UlskV~%}ip=`|V&U@*jkM^@+27G2zvZ6+^Q(!{Z@>W?Q;hQFH~?f3J7E z0f|1)4@}o(dx0gp4UUQ?_4}SiLgW5M%Nd!uABJMt$SRY6w%Xv{%<EO#KvY!Ke8RiZ z^vu#o^oJ-Se@q?a?^kFQA=wO;G1`pRLP)>ObRqQUMhmz2Tz$GZZU<v6Ww?}VHf5{L z$iI9^{5s#1S*p`o_ORWGVsk$izCW6_{r1|9mq5BY3uBW^J<4jf@!<J7QsFtQ>$SHK zwoAGF-A?8Mp>MR0kaZL7D%*C44Sa*+*h6$4@mmW>orT4TKb*~8f~n1QW}{8D`mY!) z%wTvQwt)fv18?fg0@;*XnN|B9pD2;s)6b=Xyk55muB-mKy1J!5P$x-BJW+|+mP$HY zojkRIH{$hU9A0i7ug8vaABm#)Ku%ylM%Y2uu1#L47jwqr0#hyg#6j3hW0d|RU=uJ~ zWUF_1;%#=Jf1uxV8<^YaZogb%Cqh>Lc=kJR3`1>N+|=_CR2}O5JjYh^UNBKO2ALE= zB$u$HX_QseNQ}?+$K`!(ug#Nt=?h7*hA(qzeniPJ^3v_uiUY4y?rGCcm*c}`)8~L- zo51p)DFRhFZN%&*0l&F=1TLY!9opn8BhVLdnk$XHbZHTZua&5mHU%DbqH0oB=``5I zKManF$UhMEIU}_cF2ZmYDrWD^VLcU5A;e7ZOfWMjH%P?>>d2RV;OmY#;Nxq1M54za zbr|SugT96?b&B;QlrgNpRm(iK_}X>ywL#EVr@D(?7s6rvwyJ7W;4qz(^YDWI{jLLJ zZ@F|Bu{EqG`t=z|c*{ZUxtBw|zv6;*yZhly!k)8a?kOO>@zkyE!;)|Sr*;dzVGqB@ zI`qb+{+-wo(TKZfb~v>4K6+fIm*iPvrQ$>$6cv5rRhMg5c+kTi7qFf%K#!lxB4~ED zz~<ZL{V5vqtkui0x_IDuiP6Sqa~S0H`+@@R#j(mT4-OR#gh;xbfN~PLJ(98T<nZ<3 znH}@O&;PXt*(>{aod1MSVQC7oTszk9*1k6zw!jRjbiwx3ypgKcd89zA?NigwXItOj zUO1$q1X}-J0oZ?CiVT3KoX&x7kaL+4Ym_IMjdD4A&U;zEp`jo?SW%{&g&{r|l6d_x zBuqccK|QjP;#hxYNC>uLuqrId=B;BDoVNE_{K1N|nA9NXZQ;x<y!hQ3RUwKAlJh0w z+1lbA605x^pEF*!eYgH8KJLA_7!zcCZ!v7++xUd$B04<jgH^Wz;Rnd2W6O`MCzepE zwI8wGQNeiEIj+39cG-g7I`uZce|tbS?*J-I5p}kn&)rr<iZy4b)lx%e2@J!PVo(;x z*A#0I;r<cde)bTU=W4&S^6cR5a>^g<|8hY5Gs!3$kg-uX{$?EWb7V-UVF&bJTRm1! zNef69OXXHJ2K%7{$%w2Oy~El<8sWu;{=P9HfzIpU#0HFVj`Dlw)6wA;?u*9v-UPaq zE`&E<XUn8B9tJ35`Ow?fVS5T7Ck?&L&ptP;k}2PCaX;mQKTCeTyU_Qsh0XoFr0aXv ztc@+^1k<?3?E2K1D7XSRzG1V$(Rb<kKB<Ec9*1Z3m((@%vTFq6ByOrLJ5~q=F9&Hs ztVS$8Tvb9LQQsX0sc~;DYkw$sW~<+!y!KJ!kyICqBLdYAbqYz8a5)|Le2;J5&M(97 ziP?A{{tCND`a8?_v6MC{cq2f#{>#y4$YC;>YDimE7O4(;_8zbF(rb$&knghD%_?%@ zRJQkMTE&A1H@FdmkmaPA=eYCq8xZj}F72+SxNdR3_`P!StnqD|EsdG~1V)fxciH<U zaPwRAp|``-$Q*unbBlW0i2HJ7!?}v08(ib9MX5u}U`egYXYJsTuNBQ*SR^lxMa|yH zX7{<g?Ew6!sO=)scghMr(kN-m;JYqKuMpj0v-uTDxKtMpsT}k6)NnrX)Nm+G!Nb^J z1E`Qj$u-CGUo8nbCmLf(KJTHnH>8v{N@;P~pGta`Uknd^sI2P8+zuSLd=Pq`^${H= zRc`ox5^7hGYaU4F-cM@74sG%FX0g<^fjlsjHuSY}$xC>Dvuzu}Q6ItCQ*Pv#Vli}# zG129MlIO?82hc!<Tpe6^S5CAwI^mgj?JvPvQF7&5|A&{2LiwyO`BfevTh@Y`Lb3dN zH1e67r*`1x<L5kD=cnfwA=;_PeMc4^13|)(bS>xEYis`auO0m`7r*Ggs!yW{l!elg z1n_f@(!*cy1q|MnX*D_&(0-nTV`CWTio|8+fZo7+$W&Z1HfR~u<$bVh`au#~QjU%J zTT{2TNu9rcDX#J;lS!*)nx0$Zd?rJA@9j>4XfDe@*pH+)nA8R8r8w8$LvSD^3#iq@ zWKU119|uCO_V;{Mm;inslq3!O8fHTjF(1=wS@ar_3OGckZ}GpBXE^B#;^}nqBvIxr z#>L-m0(Yp<xzVeB<Cb2dVm*Ai`9yi{NUy%4k}djy#7iTmgr$IGPIfru;g)`;1Mh2u z9u^s<ZS_fyd<Lgu6LE=jSntgTl0()tNcg)sRD}BW`E2Ba=)*UIm%NmK9{3ouq*t0~ z(($x~zVA!)&3)LI6wTSI#@4a5)<>QU&MQw(&B3VrN|&S0&w7Zg+DG0u6Ywwzf*;s) zY2n||G5vZUeuF{Zm&bO`=BfFMuGEht8Q5@!>_Etu0o^ZGo7u93i8!JsKxVxObe*Qz zd3;B^80fzJD?Kr4Fyuz;mJEsCiL#|qj!6yWU&!?@^l5?tO@V~FGT0H=MXyo3uWx#I z;-8zOe`vdn0<L^rxx3;Z!4unu`Ja&cSD^S0{Qc{fBw<50q6b&U;}T|l912F&zns9i zUO?r5thrT9kXTcqiV|N<N%7rVsZQa{<YWuZ&liG;S*0DSTqW-fQH>3aGtwK!bA*Jh zS!k>Yv9_qA)^Zod6iJL5-8O@)FY{P;H+t{7^bZY@AAWJvjv+pTAwQVcjsXfptX(=_ ze8Qvt1&nTuT{D{>_@Q^waD}9eb@oKp!)dlf#dIwh>Vb{h>0hn#OifEgPlE~BOu~ru z6gsyHN-LTc`Gk>3SdD^yx)*OoF<T&qjgs-_8I6gd3GBYNOu8hHv1|jR#+oQ&`G>H6 zW_y$vyuFmMjF#Yt4eOE!&hNwc>!$cm#=f$VmKBXSd9I)f?|Nyvu>}wQsKGFVZ@5`` z_#xa8N0+HFNnF3Orxebi-~#B9<|is%_Ry(KdY+$|t*30g#|AlH<F}ndY;7L`AuT+~ zOAc!iJNP`Ms;FJ&s->%*7v+fSr}{7FvDj=3G)S>rpYa<sPC&=g`q_t^HuJl}e%iJ( z7#EZ~AlDSWD(yL<x11M=gna<s>@jOnz;q3LL$Iyqc{E~YIkyxx!$r_Z(C@Q>f@owQ zBb<&Z9cZ`WHFfmPWLIvRZ(v}^4BrC(?TgLJ5vfC5`Y3BzGybe{uHAb|X#KC^25}WW zFU@?$;o4jTgAMK%g~wQwo`4Tuvqj86<0E=7d+R8hKwDiTW6(xb?bn8T#^GjD$NGjb zklyQ23zeqp%Hz*Y<*O;9cMD$OW2m1<pC6Nd+B|P&FRkHfB@eX@YjLb)mzCJ9i@>IB zQ`0g9NQ#7aN!<AinA}k{jAgP8KRqnNt8xZ|T<+h2G$Y^%KUmb%zwi@UsDC|Mn65EJ zp39SReF!dzBK%+;=DG2+UbPTj8IMrQY&7%e6NCP7iCXD)x~9a{?58!Nno$HdvXQ)f zx?u4&h|OKA?=9@dDl`FyY}b{uW}yXc#K~J2G#U~lyCV)R)){(I+>spvhYl~!Q*=KZ z#*Ah_iEv(Q<rJcD98hvfyjcJ9B#F`H^m`6ZoA!Fm8G5K#+2{8r^W&N7T4K<4n&IEX z>lNWq&$H!Sc$cdCiI4j6FBi}$?`<xR@{SC#;$np!d%ix3<(`U``tg4G)sRn&@_6ms zgV8Fm=5+Y&jHhj<YjvFpDG?!RrNYmY2=OXTtf~34WJRW+abX6p>F0(ID@=$1#xc?( zO5Y;7j`->v<ui_tN~HpOvND|J>swo032DWu_8zp=0>GhP#s7q`A_d~;%g;hmru(}@ z3zM|uoW#{UI%b9y?3lr3_)yL@7|LQI>T7{VP_KS`6Ex^3lE$q>@seC^MXvFo%i?o& zxGI-%O#<58&JK?Ot6fC932vkqxacqN-n>-s7AfLJWwh<dVCk|x*WuJp1%fSTe+8fg zlADEC<K({!=RbHO107wt0d_Rx$xt8Yn`umt+^gppQNJ|H($wa9oYHu5Zz&RTEw)}M zg5{}im6;Nuk||+<n)|Py^N-*2pKvrl0ZSpiCTnfsmLSM!u-ZSa)Q=Hr7)Tbwyt($a z&oR?Zu215kOS4b>!s>SOe*TM99jTer8|usMkh?t0=p54O)qpNE|LwvDC!Q!%qKoh3 zm$V+m8xtvFp@Ca=eR$|&y(&{7r&S}DcBtTD9ykt1Zk!EsGofj7cA+|Ucww>Cyll?- zg^<GR>bh#unbXia`!lj@w%8*UW=mvae0c4;R#kOuo0Yb}gO&F770riv<Jfy77MEYr zBCppRK2ckZ3EVi*X4>V}w_i?1g2RajjqUHt{|{qt9aUwwet|08AfR+f3Q8y)n^H<C zB~;q2ba(BI<d#MeK~g{g>F$tCNw;jeOS)qdckzAS8OL*fXPkTgayU@Nc;9!eXU#RA zIiLA5(58}|<%?V(fsQ~%gw52%j85K|VI8)E17wVUiZ*8@h=3Zfeii5HX~jAYCf~I~ zU-%8_W7B!?fmlVOZ)V5<{7rw-DRsKY`B893w@&7^J@`GWGi<HtxbXzz4(-}=5D=7O z)KH(JnVzBT61O^UZw*ZQjwNQjhbLXW3~hegozj<Gy`uplJ-Xe(^z(t;PW{m4iRYNY z5wD2J=%EHVX&ADPW-&=b`+6@MF6-uOj&Y&)D!RKIFz(Cw;}F}VZzve;@V;Cm7R%~* z26|wx#Un7=Fh{KlJj=hA1gBuOk$7>4vg7uev8qriv}83OXtqL|4qAv2^RhymiBwuf zhE_LM-^#ay+=TW%o1iYnzy1&T!iZ(B_mccWWdl#d=a3MtFmxJ%@uH%D?Bq~ytI9XU z`;$KJruxNcg+w$=kV8Fjj?ruV``2&~DAZg}D<*Cc2?q6$)fGUWC?(zt4nbDpR<CVJ zz`m7xT{xsnhW5-peY)SCnYhAJ9bUp6uMXL<4k1m#47=-@d}A;zKvN5b)#wglkT)ZJ zDtQzciF{7?wivk4b=zl;6`r6BZ*H6s_Ba@juB^-Kd!Bqd({+Q?PYVDDjvm8=!yS+G zV&+6KG}h%Xpl}CSm5enuha(V?{9tYrW$YT8OHMFPJThr{G*+&B?{=l3)lio0*MhMN zJF?17l#i~yhk)(wWJ+%QeeTy!?|<G}c(ze{wEE^|(tNL1Y<|)tHdS);e67E}e|FE0 zi#!o>He<a3*P@<!wCgsTmDV%ZitnZM(W93qz&7QX^v2WsJ^QWd@oc@DBPW#|IwreR zA~VuC6Y-1ReU2EMRa{11HxStNhjrWjbjq1b?(VFCEDzi7HH@!Ad@RaR8b+#w^y^?9 zHKX$)HSg`%tN{sd`qu9{0Wdr6pOZcL>`<axAV2v%GwF4Lyhv5e<*7P)oOeg$0WRCg zt@Eu+)e78TsraWZdworw)q`r%qt<$1`)Cn#jiXnf@mXEvt4DsQ&YdsgG|Gp?oqW5m zpJ`P;T687|MvfSHJ^p}&^VGg-ckwA$3B3)QuG;Hv@2v8x1x_ZPQl|LpE6O_S<#0^Y zzBuKM?Jqi<Zb-N4E38j=V3u64LVM75pd6)FK{EUj(HdB32qSUP-ay+RkL@;`%zYzS z`Zu6C&Ry9pY#4Ls<mNHfNb!k_Uwm7T(%)Zm86T!?KhLqfZ1Q7r><aEh0&bxzI!ZV1 z<&HL`>CJKAO{ux_EMw_8E0NbmS*+EVwVjcW>rhsKQ}c`$c7v4$Xe1>zhm_CtNoMM; zSKQVr=q-5r6;}Dav~%3+74kUP13nG7_aE@fZ0J^nqr$I(Im?$qugIP(cPH81tmfqG z6<OlzIvB`ydF<u>0|KVn4P@8l7dw6EMjl<yr;}u35xLWKbz_g~pPvA_!KWFGTh<7s z{?2jak@>jm;pc(c@A55Rl*+TM7_u<*k{Ws|*8i%WpFToKV>bqh^|9|jkYzs43mA1+ zYKkY<?m0m>uHzi%Q4M^Ng;k_zo3}3OiiIYKS(PWe(hhWr<~XdeMv&ORgpOyM6u(NE z<9Lj2!+)3!-cUR|MC_bw^A%sfV(6xJ|Fv<+FlulB@Qgk4;MJ|KJ%>GSjJa2nz*D0) z8c-h6^k$=;x_J0vsW};ur>A<E*q0z;SKKi9l<D1zU7nG!e{qBV{Uq?6lV_HrtZz0& zMy8?qR5AEm%vtf{gnyggU3Xu+WoIi*1r@*v@GwURm(mb2jXTi7mEt1d)S*c^`%S<E zbZX8@LMsQRL0qU(Q7k=jYNBs`#BQ5x9=6rS-i8w|Q2nKHLX@tR(5Z>K+(RZTFet!- zxkF(-uJ`%=Ua<+i%3SQl!$?>2h^C@1H$qQVGlL>GvN9rF55JqV5&G?zAWS8N*0Y$2 zOeWMGQ9_mzovfR5SVf?%&PU+J&Jp1}-hk=@=9r2M)KiJzH5eH4uo<Ikc$g0YPewTo znxw8Djhdw><4e!H#mx2Ve4k8>-XFv-#+hI4Nm|RfR$)2J&2HB5v3+yWZTjF+o~z}C zbG(q%lA826k=@CbPfA(1H6f;5TCnO182Zo!G-n_0q;`z;rOHo?7}-sGdz`Lj)|ht3 zqr)#Iyn`$I(-mt#uNCcWy+AAJ9z`d_t%<*wkziYX`CWUe?&5T96TS6}r+&h|DI89* zOlMcSnW6gl`1DX}%w=<8G!nabtLyUv7+oB2&tfNc5$y_Pv(Ebj3E9?GNUY_SJpIKu z;&D8SkerRL2casJ(Q4wO(ViAfn68;>=RNi?&MH}&dH}|U7#x*IgFMdXLis#ziz$hG z)J#`+dGJj($fMC=j{0PnjbQ%t+DR>ld${vGnp53%t1i|P_Oa~pGv2OOg7C(VI;D<^ zY51BwY&NkqDf9Ig+JCK|VshV^$9d03Vy}*mJ6Fd?+2p~9w78ZKx+~iW3_d>$iK;a7 zCG|sR-`5$v@%6){<ZeL4EE9R)wEH=O$Vy40vX?9^yDH_TSJ!)2AE!jlx=EkuCW~0l z9d;`B+pT>pDK)y6N1hR)I#J=|fuPYsor6M+q+%??6vo1%*YX@~33I-nXK|ToNT)7E zY5WKhz4R8P6LAwG0f$#Lxq}#||5+c!9vWM@I%qZq+qrwxJp$d;F1p`PX?*r%M0swr z;qu_^dAA^;JUcci(`n}WOXi9xM}%GthbGG{*o4#J@8Q9NO{cgV+lRBxjz<QU&V(3p zdK`NO-rtjs)X-Ix+y!w|4-?mHE5(5fq;{{@G3!Yz(~BbSZ#DC7ZW+Ygq?)3GYj+3d zAJ?FW=!wU5oTb!qECU#qAwC{SXp@&}PmeDYb)E7^^H+4vwoB-ahg96UV#*A@S@yt= z`?xDiT;@b_(|Pk2e+y1@!$jsdMQml}Jlh5N{F{^#o@%7o%TAM8aPodhhql2OAj|Ng zOGdAK3$%C2M<^C~=WONH6k^@!je-hMJ>A9Ok#tSA0uF5Po9?7N>-|MVrQa=>Z22`y zOAB_CpfLbjJTNUGY!29(Un{5+Q?{-{+xa*O<#lX!i@dz)fYxKWIuPJrFfInuS|B>? zRp0WU{soo^x}KytL}6v>pRKVTp~HG2O9jbIdC==8J8g?PVsLa5J5pbZumBpMK~|kP zN+_2`S8ufq_m8SPE_(m$<Qi$zP1%=cuYZ`eZxNCQHVEE7+I@R1nYyJ42&Za5lw=L| z9#yr&eCuGMJQb&AoVK;o6I$pGJ7#|f9qs(6K*p0`BwMiU=xzzv#<JKPLL<fKI^HCS z(>*D-O-UnzI6TTFPvEypTl08Ms@n+f^v~6+nbMVPZNk{D3!9!RR#pO?w}DqRW*w>o zPDwlGhk@E~(?`xd*p3jT(<t8*A{7XI>f_jRgSu0%s?n0AYUOB-2a?}kh>5<`tmI!? zn7JzU?B9>Ztkf%fV%2O#(0Sw|l-z^5g<j1eH#Zt@E9AD4#=5_iHN>*_R)^Ai^G95m zT6f5sx=UUac=Q38*R>m1+Jie%tbbpJ{{m(*!mNOn6;5HuQ~h7O>vfjGHD)pv0wZfh zlBaxz6F)HOS`5ibi%JN@Pt%gb!@d!VTR#XA-e;kwqeG2mFvRbaruGU8qWioXNrF$w ze{DctsV&)KO8t_Na1kYG{lZ{F07a3ytU!6Ktyyo`C{ZUAKD>Bi+?=@Xs9`A@*Q6ZX zDC;la+b$xeHl$vBm+Fa6mKc)_HJMHAia)WOpG{hYR76!*=-|)Pq<Q{GSUy#}@RE$; z#yV)%Lgth&0+UWs8Q^$=PO|jyG@na&`Qk`bFhxV)m<h)H<|!``f!hyXjB}Nv8pshJ zjy`CxA0r9*c6|%#4&!aUoI}|013C$LD}Qhk#O~4Ua_g#D&nYfW-_t1yz)0JEdmX=6 z25`JUb;cP;)Ft}CPZRs_duH;!Y3l==0DbGT<{<SBMJAYef@oV&g1kQ-A;z6-OvUzg zqKn}I_?zbb^7_#3PavAKShY%M)s-cf>gzlx<Lt0i+AORmNGGuUL3M7|EracKi-dhi z$fCxSYi^-3nhU;>Wqq~~t$r*7RJVf%EB%A&C%^RUs<-MNYemc41V4eaj63u=s4<(A zvCbSK2``uN%eH6Fl3jj{CVzd~Z61e<%x+}vslUANnhNp(?u&T<vPz6799cwl<0L-5 zXI1q4;LIT!IKPkyBw0{R56m`Y43TvvpR@OL60Tk?AAmTkH3I6B;y17GMx=S(GvgiC z6Sl8^^U+`SncwOSeIUDdp|S6DlU+0J>u`YrY(5#iMOYLnwYoq78!j18qr|y04~XS{ z?Ht2ysom{)+ug5sirNV04-{~0Oqz2eA@nm-K3nPZ4q*JVYsDlSN`hQjH9H$SklZ&m z8s6DyOYV7(+w>;ZVBv5B)ksVyjy&Ir8TlaKgKjhOZkbrVK&PR(Gj>hx^JiQyc9Uk6 z*{ZPf(ydZie2tZT3fpbZv_(bDD$f}VROM-s=|_D4{PHn6Q`<3_;`>5k1XmbhSl{!c zMJK$Xu0TuFHCKC4uM`EuhEp-4t=<wF`_H7_pWEr&aJe{R`hbXS_Z~6uiLn~Ze&pLL zu_rSizxZQfffJ3k_^7S_g!6B_?vR9Cmp_<S_T^A2LB}4E^lW%TCqI|&;Fq|F)p{$6 zW$Z9_PMq<@Xr5ltFgMQS!q`#vdcB98f5L@}A7#kb`GUNS?BRQBtv<z#swa{ry@GtM zH)v=HRVaCXqFI{Q7nQ8uj2y@48Z7Y~DDWg88ktoNq<7ry2!g9ky23>a=7E%8f?{$C zzBbtxQ$CsN@yrbn;U1Spx#T;yz0~EEfQTk!?L+e~ug$XGjfW!AcrC}_n2tx23Y7Ua z4`&m?xU5sKKO((J9K-y6w;tN#dT-8MH)rzMS03wq5#d#-jmUlN^DMGNrEb=rcqMX> z!TO9txHs+5<FFxN4&G+nblhOu!*vhk0g+(aS<E{T>sG`5;aw;Fi04*wZYvPPQ8{<g z%?*0ng8NU>wzo};*nBSWIBh{Qcf5_!y~uervI=f=6BOfxl|_Xw7c5Wng!FmFva%$7 z;AsPnLlvy2pUDGj=ve4)`ca{Z!sud0?XtW!s}NGCw9p1q1QFvWHl|xkp4Wpwz?);% z-7xN+#ZFGRnLlj4HD!I4`2k2H!(S`hQet5dmezhr=#=!HOLA_HZ?YpM=P8L8gJ#_F zv6t6OSLyff4fmkeBti6dufLNPC2yB_RUsf#5<mPJ&enFa87nWJhFW?0ZO4~cO+L-x zC(5mMlm0QBZO{oZY8zj+>cKU7mFIp*-<OxeNw=&MBSAMs3NG!=40%uQv*n6!5T7dk zQF~v!d;1Rg!u@F}+aKKTe_>F5@V=7?;PMWZeXDB5w)_ezGB#xH|F8?5Wsw=~VUjXG zM%FHX6m6B;!<J_2QIvqK%Rk@)XBvvxgvkca1=XtH*%|~NYkFSF@@^i-dr6~-X(>$| zA8P)X>amYw+E*4;R(&#DVw>^LcEQ&xsaqd9nVZoUo2M^5?aL(Ii6e{`w(`_NA&8MK z4q;hp57}E^-4$%}Gffdb{4RilU)#S!gDDLw+<8PN2+cBq(z{T{3f&BposmSZJ3Up3 z&N>u-{ZoTSNuw1smWb;+HmnNjEZJrry4;c||M~@K3p`KOn2X#;E9sFOBKjPdehNz5 z@EKoph4v48zVwIu!3`|IpPCjPQR2)VC%H`>#std36<S_KNyz47w+pMu#MkY1<ecrm zk7sdh&yEwdO^{`nxMcRSqJig$PCW<I-HBpN=UYCPd(Wb-)fhK=9}PU_tAd}OvMaYT zi*D7UH#eIpd=__3M;bPFnuq<!0|higZ`}hI<K*AVSp6;_>bX9iKSE4p?m%|@Vs)%6 zM`HJ9`ULQ2Nj8e^2X3TC{9Xh3Aaf(ZDxJ(9pzEM=j=8LxYjZte^xnSCdN-GFP*UJH zEp(eKB;ZT@R%Qyx{+@{wT{e?Ri4%vYL)Y2wC@y+KCRLCvk(u<V5^`0ubI1~zbH0dE z_FzZs0c}R9(`g7u+K%B=WUW_A5{H8^rF&jDl$?K)ZlnI!Y!x5NIZjRA9L{~DObI!v zEt&8wH-TqpyVs3y*R{6y$WcP}3zIiX2i0AHH^bhi2Ay0fuR7M#uuVTwW@W~@2e*Aa zl?cAs)5_EMPA9TJ*<#W9=_1=8?fvtkI#P}{LOQlzb(d3!<lINo-4*&<U`5P<N+YF? zN~>e0J+cL6no>mF`f|04bRQl?Fz#vX?yi;Xap8?3`I}f&L{Y2a4_G!`%R3NMhTioB zv_}PAo4uL`#8`4<_$-fPDNWzZ^o9@Z?E>+d#o5gGg~fP&c+KzMosNk|CB0&Uz7zhx z19~BQ-f>T7T;cEjQAYTZ-sVVkZQ9N6^$^lO3F!%c;JD>B{<BUXHQyssW%EaLHf>dJ z?cw`6?~7jBz6U(f3z}p<)vN2u!?l0GPL{+)%=G>26D<rUXz!Q3k<g^p?!3wp^!oDr z(b2Djt!lsxt9WJM>ajOXC&Gfp_Xj!L&Rr^+TMck-U&1$F-^MS!F214SvTg(z>g4*& zTqu5cU5O+Q6jSF&@$b5qMZyCiDZ{;=TSgFD)!ryoT{Bi@S+$k%WN)E;;?=4=yAv6I zET7SAeQC#62R|olec4Z#jbu-$)98Yc>A7j!#eg#wT?X`FIuF6t8ZGVnO<Y#22%%TT z79XCxLuzMhy8waWJ|ehdAd5dKc;>wSXodC6PAV%yB@J$pA8XHWOk4&69(6{`lBK1Y zQ{_3}5~JOpABYf5n%I!P+W7%uwFN|0Uq9@AQcwbZVbXeiriuUQov)YnuvH!cvwF1% zBQpKC5>_F2#p^fDx&EZDek`*=_|h>xxVY7b@R~h5tj#7dYeIuKKb^zAw58;($PgsC zp*m6Izh(jaQPEyY08+sWO*3%%-?@Q*Xv4qQ2Z4ts>vCA_!ly_MyC`3l?Nnl73B%GC z50p7boT!@;HCPd_2&!;1B0*Rm*^)7lk~t!rZk9%op|!QF$$=l|bZDO?Qch2h<V-_p z#q0@^;*xKEzRouWmpX3OI-_$IDJM-z>tD=pYC*~wm{OD~-35IThY-FFy^HR5h+`TS z#aZAdg_oz&FqK<C?|Sb)8>AX`C@KtmZBoioDv;?n%Getef&^a6qHej#^V>~6GFi<E zy)cjn0o27Sskly2vOHQ@Gx_zWv_`A0D}5}Rp?vjth@br=?d2`9lnQ|n2u2n5ykw6h zyIc&_Xnh{+5)8iV);ZA^d7P4OT{p&RDAYt76M&R}eY{dwVs&%qd$iSXc9~w~Hm->G zvArGVb=U2gM%#s-d<?H5#Fn0`OTy-Y+hAqTs6rODF;g&x{i3LiF@bF(twW%Pko(dv zDhwJDeMTP0S2-hRbn{JX7|rIeZUqGn(uqd#HtuyW?Ny5szVta0s=R>R^4<G{K<8eS z;sncL;Vf;kphcR&^j|8lHp4cvM28G303}rpexDw!)$H|1Oh+EIbEW`3qCq)Ab;6iT zQxre+pKH8^CE1S+Yh|VS%j7%TuYhP_B5(ZqX5t<k>XUyycd?CbXeL*8#YwXtEq*hR z<Wt==JXx2|>FC$@IU(^l=VJ3``svp^qOcAdGa9k|*t~|yocvmd80F8Z<wUOxJrk@z z3HVXwS1Id>gAs}FKJ88^yBL2(>=^%EfdN+$R-4E($B*cSWh0Vj_bvT%ojUVGM9DB4 z(6;ejfMQ*s&iqno{PxMnXMAw%U)R1ggs%?Muh|Va+xdjqQ(|jY8eKvs``hRj+g+LY z6&CyCy($NLMA_Rsa96W0@!KS{DC;ll5$P7#zc2Ta8>+Jv@S0AL9-+}!dnuC7mKeKe zcp^P<&B???w@BrMh{uY8$ZW|(`^U1iSSJ{tdensMEynE>ZQFzUXNIv+W5gXb^|8a- z497ZmRgUj>&sRQ5E&0qvG&e;oVz^OIaGi<R85~ox`G|=L?$#;yc_GMB1|57&*cuhZ z%9tYH&ICVhymr)x7RxDER^rFxrZut}u3>STfM@Czz4~THbyE{XTE3BT=1mf`gKYyn zOJ6@X>cO)z@{t<5_o7yCghhjaT>JLUkC2`DJ>46hwAn?hQ7bqwVK&z@2!hG<rU6e4 zn4ZnXlS37>0?11&y?IGJE3InAz7{y^Xp`zCJVPpq_ri%l?6VFfWcMc|U#^8f2PT!A z6;^a)Q4}flt_N>OA?|$OUCHO4wu`QN%{EJEFJTidYCf8)p!NW|tLXQn>V`-=vF*>9 zR2n|)1r=|z*)d|C0s!cgE2tBY430l#^E0%43`~bJo4k_waUIGmN7UlC=?tIWlU(IW zQ;@|g3ask64}`F?g6Q?ZyEfPkh7x)k_2;bUiEosqN%ZN=mHfD#igl4lq4lD+&5K4w z_qau~6p|g%GNSY09Nj%q=SI60511{Bonk#x<>onPrxDW*@n~T?M6loc`=GrdsC+-j z$UL0=AS1RVR){bT_1R4>nda^og-5D-aNd#o1KRzI&HAI_6;iN}$x}w;a6KXC``L(E z52qU6?q|weMFa&1tRsXYm@;YFB%2F~yAuml>7cXzh3Y=y38Yhpq)Qb^5{7Y+Bx8jL zVH7As946ttCU>E`c~x27oLIh9ivv^!k^>$;`b-iaD;m_8e%4%F2x1!*P#ZnMQiGCg zmYPS?>MJ38bKY#nNQ5Y;m8*nMizZQPc{9~VvtWe%#BjN)MV5ku_c6a)$DPbE(?p!| zhx7_^K<Kq*=st_>8tr*`E`jbS)~mQ!X9Q4-{^8u~nQ{ds-g`jE5pt7f0(7wA@847U zCgsKWTSf=lL6|#>%dzFAuDI6Ci=_m+i66cx59PftXZ%SW5DczyoHwT3rW>Adi!`%G zT|-}>xAfjj<Ab)otAZe;KehO(YR-soOu3HR!7NRJk*Ia-r?%bk!NiNqPp*1!!Xt^5 z-#qB>3p}(b>lZ)iF$h1ClXDb21(J_IM>ctMPq~j=+P1`2?L3EiGG%r2hTmKO@l?ab zfkpe-1TCN=4~M@gQySKLS9zW7v^{<5ZrHSz4i;kl*aLfS03^ft8-zdmuPtQf<R8Lr z1V$HTvHZOTzTx<89J#gBEQDRww>!N6aH|zIljL)n#Mwu3_Bu+t1SZmUCV{C*{WW8c zPjs9@`@(tI;BfoXL@%lEvXS$SNBxH-peU#tuM{|Fd;l6o!B*3$20&5()GiZtKCxM~ z9=+0=C0=bqUj2Y7s0KqHd!XKbQG~b7qM8$iB`U0^UVYt=uF=lX;e>q_mT_M3ncD&K z?$J%doS$?tesg|+g9MfBxT{2Mk1ZXH9jMAoIkj^>*$jK&v*Ecfi5d^}<9dR@iZ>&Q z+aKaALT%y5#Hy}<KL^H;JBdtr=T%%T_WC#h@lSivuQOWPx(x;O&5La?EzbSK!TM#! z$cv0Ns+xD+v^l?~x*6b_#Jb-+Ux?TYsoQqpj$h{gw0Q^3&)%@yeDSOMb74E|#M82+ zjifHSngqs8BYSMddV^CbgPvzla*0aEj0eCjE{Ai!LXp?o_E&PK1&=J|t@G91hNEfH zUde+*DM?Ff6%uaG>GKK+0}r&`S;Hl)5hi7cZu<5VgEgrnS7k?5=ek?dDe-0o9Yq5! z^H<S#NNSOSUfE_!1rpK1oN=e#$vtiMIJSnA3R@TXT)Ef#HSD$wSv_NWee$(d0ooEq zRgT&!&o{=(CK?fJjNVi_O81ER!ynGJD0pAA;`OC|<k9V6aCmKZN!Pw&*Lni7K`#oE z?p(<`v8pIZjp9rTL`{Uu$T$!r=M#Co>G4hz)LHx;TV%(XPm(RCV@u}bLWf${j5~V| zX-vPK*J6F0YKmOh;HLEu&!tV$HB9sYT$J-wKhmIys6xn!Jf$6o@8_0M^8#UJ<+g(z zd8N1*VblU2mMDqSR{Is1K9_bUN%X=bST2rAUTd(>VzV^gS`zOJ;L>k^ON~@L=47qD zScjZDN1;cZxePY;O!?5Y!Q_F2C4XZ&%)0a`MSaZroNY0p;_ciQP7@2t&sKJ;Rbo0W zBr-ujk}a5Kame4&e&?dHC&F9WUdmlm^?-KxDdRQSl+r(%{KYq}-v}(3&lR-m=YGTT zAXEMEYR><M4gfWJLrI=;35SRbDlf+`Ox|>>-aI{n6gHMMOSrKjZ%!(--UU^oeoQAc zKYv<vQm71x_jf1w)l6;Kj36H|v(~4F{gh82kC68=hw77b&(KHw_@VrL^%XA%hC@u~ zT=PD{qtqm<ug4q35|&P412NVkYLkJmg+-3d%!d|*kwR%OiM>#f<)0Pr^8>w-4Sndm z?1Nk4jcF4QCa2UU`Up&eMnm=2j~|&>yV6U;6AQ8lo^oXulv|B7n#lJ9SK#Co+ecSV zHU8n*BH$5ARa3pH?mXkD0i6tqVVXf6+qCTu?2jivx_!)jC%_!)r$7*yAlBP*xFgAX z_YMR%2JQn2&PQ)oCDDike}Pn9uIsLo)h@h)A;>t9T%tPoxu+40M~=-8Rn8N3f@#k+ z8xpqoiPtNAsXD5j4^@<uC~;)z9!`kf;Zl1JY)J<5K^-Ou(mu%v5SV8%kODsnoha#r zM3XDh&%HxtE$nXjOec^>_JoT}E#wG?awTHY()@iQF|XbDVPg(NrC+)J5|xGx`$jpn z+L4p8c%Zx8Hc|!rKZN3lElTD%k01QtwH;_~-vsi)_xtDbDQ;DkI;m^nBhy9P2><9q zKS5ey>lxbyR@vNh^yJaYMWhF|a<AL^hQgGMIos4_-B~r=m6&-CsZyi)bg~}pVjpYh znaTsz4oMHtB=TO=j;(gx07D4}&1elHIfIRX!E?WU2`wmcH`CpylB~-E*r=)$!s%X? zmCz`J!FoXMRMOorr~VpsKGt;DGW^)Y<bE0A#?K|1@1{NLRmya<%u{FW*<2vjbljI{ zzd_efeJA~yhJIA^)isph==bDc(&<`sI9Evv5J+n6IxqJyOrB6BC)BF*5v1`)Y_%p7 zIDum5^1y87OzLwk@96UO)S<{TAM~2|MXiys)#`wYPiMknvd5`M&WCD@CeY;>7dwu! zP2Lyod^f(j0QgyFSj5WWt$X_G7wC0Di)o6##r)L=OQr={FcG(a_W?P>ylbWrlMD55 zFXE8c<;O1>v|3ys8O7tLdwiRNnZGI*3Ac@<bHra1Buebg(b`t*zL|)N6t1)|%2%i1 z8?5~(OVHo009+sXA`|X;<FLr;%}zdrDk>v)vFYVm)ck4ne1vrC#V3O$jW=||11!gq z;^$${q}m<3e+zB)NKeI_<znJfPnS-6Klla4`?a^tGoAG~2E1q3*~a*(cL>|F*oHl$ zPO~?G;GVxC*dYyuS*_2$YzkVqIDb`GCBHt4BV;vHIBoE$rU=?9an`Ns+wh{q^r8Zj zTy&O|hK7{y_%x@#-SYD>!<q~l-nxADfxWY<A}QD4uRAU?Ys7_TSa{ueMcBW3GA@S+ zoqdf>jvxaH>=+xfVW$lz>bM9d36>522jb)MQor?DRP|$_M4f;!CRZtt&9xb-EYfDU z5O`4~PK46LY6INO8jVM3=zB$<qCEi=-clBClA25x_6=C$8TR4DV{hC0<q=Z+#+T<u zPBGj%`zVqMFHATG)sp9EjWV>ta?w&k{X3iM1mFJeaLW;ezC@|sP1sy}!{`%A9M`Ka z2y&Tdu61qeIe#3g&eY!794IT{v62N+Jd<DTYpmnJNcRTYa&%+im|(r`w)FAu;ptAO zU+>q0Loxz_&AOU#x2M`(g)L_udmC<-!On}>ZVTw^g!5(;jEwuMX8ulOtxg8DiGLtR zlq}vmu3G=MkxxJ#78aSy-~9W(byfeNxI!(Gy<;J;6Cjh}ZVF{HS%38~!F9hsBcgoN zEIDxLUE~;9r!H7PY^4GuuB9~c5<+L&CSHuzWDyi&)J$gbBpdyrV>d8o>4!>v^%d!a zoW9?ni!rwzN?C_Soe@9<M8~^`ZBqFx%~Ik|L^ZC_w{a}E5B)Sr5Vs`UppO;?UM1mH zJe%#=7VlHXl77W-0XM?d)TDT5to#@J)73eXW!f(#8EJ)i?BO%~gO8hnh$qFC6W1^` zSg2wg_dbA6CrjeK@E-9jNNT;%P^W!uhH}pCs`o-P(MFL3Sa1%_m>Bpo4npx<mC)|s zEG~Lmb7JHN)rbV;N3*2TXFr7P!_^}KyNyJqy?G87Yrr2(s!8HPtMchVHl>dq&4!fE zz9-jRjD?t!zuwE{dh&F=&_sSvC;54etEyuO?=oI6ay&<Iu*Sg5Z}4#atjv9L_c0~l zr^C_11!}wg>2fYg&RNegBi=)K_aK0PLo}rQQ%MuZex6@|R%?hfRfu9pJdiu(KqDo_ z7`&{F&}*q-n5#gSKUyEp`;*D*<$>7GFY1U&ktx)LF+F);^xbGdgoN!`#U}8x1s{CE z0>IHAirYayi=2+Vr<u1aEJ<Q(i??!{UL8*%u=s_-HSB(pm;kD-%SK&TI4gmO@Y4a8 z5u;UZ8UdV#g?FMG_MW{x)~c{&sOZOo98Di7-MwC_JXkk*Q&)cuAH^*91P!m|^cnvC ztW(IQxT3qE2E8nOkt9b@|2w|ZV7xqU5(&bS<Mz(weSV8%ZN03pT;-<gf1RZL;;e0Y z>%a;>Qs|jJzXHcv7eE_Tj&I!Bw(Ok1Rm_?B@sni9mV3nnv8so*3p|u0jDlT2%r=;k zo_3qS|3~23w`%R332QbU<B*Ufci8dlwM)asrg!=EyFp}Xx}Dr*KnfdU+w1A&iCifC zKDaLX?D4r+mf2P+z`)cVHHlv9{h7H>UwNhx{5<kGo8QP+8Rmw2lLh&dXGb$zLQa|w zk2L=Rrm>ENC+ktAq1&~P8`AJ*CDYJ~=rPw4BSO!MjG&y6+FFJNr_fA0Ve%-agTp(^ z9W=`B?+*|SwPWYCQY{7CgSFm_Pb2uFI5giRJndIfc9)iGrD+uS7zsH;byxI~C~*J{ zf39CCntrM?$-5&sn6emSkjVbXXiNFKbHv(qHV>bR>iTJm89BF5{&?Y3Ss^Z?p!HB+ z<SufLuZpkXj9ct>PT%}_iSuaW#RL52hh&xxFnNtThmE+5%HKB)LA}jL@o#@bm3BkN z>%1eId%i9{VJP>-V6+zxb@0t;MQL86&Fwxx@2TPJ7oA`l%P0(T)=4?Qt^}Q|VKN_q zi>doH*-=LUoyjBx!On@O<AUy;fH5T5q!Oj!o8i!%7kK3N8C!MQAh=eeglsJi3S9=3 z_L?23n^nt<Bq;)v-b))M(+OnWp8|L5U=4ZYTZ^LKjkU8$OL`9pZf=*P?tRtqzLr~J z#h+_UOl~aFgdOnOxUj3<$@k64?jms;_k|N3=}Yuj_HDkR-ubMkFhws1ZAzR}G~jdW zX?+T?i#gf6D}j%L@Kt*$uIpp1#|G8=ibum)1r?DLgTGNl{_oT2P8<LMF;hTQyCM5A z_vO8vI=?MStxS^k6@ZIL)?MF9_ks=Ol%t#Hy0-BEW9wjY?N^zTW{))gwY@;B9{W|X zVC0_Dc`}jH0}HB;WC^P-pYS!Q+x&Yw)DHP6^;xr;YbOk|W+FNkD`OwMITpRLLa_y5 zw*-2yA3!YY)gO$Mt6HHYpD#;Ca_ijP@*!;Xq957EV!e(a9cVm_AH~ES8$GXxm9%{b z5-&}*f}70-08BQ{OA>b}-9nuz6jl)YJp95D{0CH4!Mq|s+g^}^fulYCI{(}y|0wi- z6!ISt^2|Y8VGKc<e*Cwn%X~>gs9dQ7#H|OZ$^u;<tG8#8()#J+xvWICeo09PhggOM zt17RzS)hI_zs?ncNkT`}t!>93x7I0_ZgW<Mwj!WSxANZ$+==(kpdNHaHX<b%xj0E- zvl?Bb=d0FTgy;Rjugo#~C{f#f0pepM^Kt5WSpp<yVZIqD!XLa$B2O(sThn?`8f|6i zY$nZb_0L`lYf+ZFe7!;M>A4Clq-%Yt{+*%bv=LE8Y5d%+j4nf(5TV@Ngsk7L^*Oo) zh9LRPY9xPyw`Sc@x_8{J;Z4l@%z#c+3&cWy#gykD?8v}x|LqqD>=d<>bEpIJc<%-B z0=*46uuy9S4UJ%2<Q>JpB``R!>Y18YOC$*9L0c+hrp$ui;@><!?^cAD6VnQA)3K&_ zELlWGtA_!>Ha}i3Ddbp&B#p0$uXg+PcvMAZ0>6nLddC0A;t(h;GT_k7L@}o`g|a>x zaO&hn=v0_kbBGFvG*p8TMAoA9$8(R*w)-vHahbf|Nvsz()vALb=*ibx{#MD!95P3t z&kg$XqJ3UcPQIi6o)wIwuK-FJgG-7Crz>3{r{O?-my&t`o$T?r(#?D}%{X6+eRoy@ z=^fNy(bNZK0wbTM;rvIPu!)*2_zaG>AipcaY8dnNWUtN73i;oE%gYckJ}^zBJ8n1I zEFZVqJxb6-a$y|t%Wa)3r);#l%%V!d?a$UrdTZV&94d1%OP-&WKGWySIYl5AHDvrS zWPhtlP+5hu$%;*6_a2Ha7^`c13#VmUteE!f{TWPXuJRi><0nf{-SZ^)eWe22>DOv< zVpog5wbT$E!&d!yve(LcA9OYnNY#2N{h%3pCJ~c)zvu2`o^|+s#3(+P5ZepWItY}a zwoFFnX=hFu5C68U-l@=6d+ML~tKrfie>oMmW>>+P@aj{yMxuYg?#~Q<L~I8LSf`7x z+)-G!Huaev68s>D^>Dl9V%IImJqc{l)tzrok|WiWD0_I$((yE@ciwDJ`P(*RZ_<|C zGh?$l3ovfzu^Iinq&_vL@WN#-&;6HC*z0(z2U^J)R}#_8<aqZVPYoMMrH-?-vD78E zv-wBN4EG+M!$?TqAvMjuGQpS{iHnzjOmFqDWDAc>`wow8t|MRlaR?{rAP(_>aRa=q zQvA?3AnUF5X(O8HgnL=9@r>jvKk$Z0<NB`>4nMp(^2_FBRf|H_IY-v-1X~T`vBr9% z!(v>*w+jl_Ehx8KBq>==H3*~1HHpi0@?H`hdA4-KB!6Vo84XD1e<(s8h#*BH%SyM@ zb152XWHi`mQ{I@wm~0jL#M7qM)=4F@O5X=2_d~sxr(1GbsWv0|dGBvq(FBX{$cU0@ zB8VB1?@MlD9=aDQSItOJ$kK^iyl&9E=KyBey*ro6_=*?7OmHN1`tGAko68c)t-IOo zS<a@P%+xr<?CoV`(fo#&t%<(nz^@;SlmkPI;u!ZW+-**-d3D}<UfHLba0*k=);T6{ zsuQ%E>Jlo)b)Ttc=4S5k5qT5;9;vHn&<@|1{9@@kaS-!_>oqHdoHYlafgYOBGb$Z1 zNNiZ8Gz5F$OBUXEjiz~EdaAN{oO`^|r0&T4zFk~QiKCKP#PcE~)IM^$@o2KZfSjU> znEqG(3#*0^H5HFa4DTq)G<)R7!)X)w&>${-)Db4*TX5xSw##qI{Vl>6#r&s+$>NHC zT^D_PRZl(oxc{J6ng7kw{?kxGIpBe5bX4Oi&o!wNhGp!->*XZIG%*CM!&0Z8v^%81 z!<fp7NQtEb984tk2T8iU#|q!`l%^8n+pIuITGL4Jp%kAs%KIWEmj>17glir0SB~F( zW5$8wjVDT*sP6Ga4^&1k**lgGE-IX_LklMyMQNaMxJh~vyrjZQvht`%D<?A+s2s78 zD2{6arao%bKLu(pB7R;fuLw)Tb&a^O6ewIShT|$BrTG$YoVjiX!@A>3=Z>~BKh!4x zfQ2HWD;8q8Cej`ej@zGENzas83{FrPg>BQVc^>>;JRC1bui!JN9+Em3imp$xcr*)9 z*nY&Do&UvAAe;Xyg;ssl*)Go+&Z92k;%zY9!2pbo$itZ2F?Ca5On!A(aYpu;%(z!# z%R47ob6S^&QE=q}0@`L;I3KxXcGHABfh7ImY?RhHh*lrNxe!ZU2<g@aq@XJ>LrkOQ zEvIU$BsNM1&tED=GH$d+FwD!`4+;>ahwTfLv$**f-6dV7bzr_u?>^(3uNavOfkg1@ z#e;{`#~Tn9W}h2#UrurhGrr#|WI2RNvPa^#JKb=bU?e;L7lXuXb>qi93(!Ei_|$IB z((;IM>6JZcV8~k#m%P*5IZ!LhfCUn9>U*LCH!IK85WhXKZ%)i_S}a&-eN1}b6%k$} zFfIQDL%%8L04DiUin)DJ*IqiPfkC5%TKn?WIHre;rwS*t<xtsgn0Ah?%UalzgZW75 z46RtAy$}ql2;DxH`vuIj%h!&6xzEC3{b?<(c81<tMfNt8Thp~Pq%lqr+HpYjy>)R> z;S*?b$0nC*8RIJ&kOrgiy2pE(`j2_LTt2n$e51F<ckV#(;knQ~f1@d}D9t;u4p+Y9 zwCb?D-~E{8VG<jLdx3vtBtc1N?uT{2qdVT?GHS!yV&<9KI=-h@j+$P2oGWg+Dc0V8 z-<op4iNER2tHEszM3d)%eGHGbt9%gAk&k>EjzSo-kDq?<bgaye7J25k+O~d2*2EIH zWLgW0%g=1Zun*pI5q+So_u=O(Y;hxlV|M5?nz3v*Z;2h}^Zs<REoXd|u_hNY#qDY^ zo1DLH`{o>z_t&^oU$5To$@Tcg<}7nPV0M30V+b$a>JE49jUI;)W^Tv4s?dIAWHKFV z<Sh`ApF70vkpxKTZpMt~{duLor#xW74;#7LT@;pi^C6oBz&&r9@;T<rj0u9-G;J4Z zHT9&md;h#ITbpoXz_4U}RxX<Jn@^k>ht<=FKcG_x1z;INDJIV%@1@ya6g~a=$It%n z=9l2axRJKa?)njRhL5y5MlL-&Y!bF!nGaMI?iW5^b*8pkg`^a17ZEd!ccl`?7n#eG z5t`f;#Bv>1eZSv?W8yv3=8X~yQb!%Cn?n<z&5O(&mZb9n)}kci;~9?&_?2V>Lh*!l ztA04UHrw;I4%|8fE+%2xUdVY@x>Q$cc+tKrE9q<fu{42|=v=x}B>mDrkSLjZKcX)} zw0xFy&p4AWTTF+#*Lx|IQuTWt=!)uz<fM63PRH#75Bca)#n}xUaP3rRxuJEMXDC&4 zeW<X5C6Ju}`e03HM1PIv7{1d&WeeKMVoUF6PxqC{LepLMHQQ$|FSb06nn<PH-8dea z=$wQ{M5-R3$Z+t3ky-D&`yWwB%m_hSiGY~>a!&x@RL3@Yr(C;8>YXY&Ve2?M#HDf5 z0?@NBil_y-TGxAlK6dmnC0znADiyz`SHjQD@R!v32u5>ep6#SxO>j})Z9S&U^%=~- zD#DCO09HQb*iNj>*NzZ6>^!b86H?KcYi`Xq6qm&P-yy4zteJm*v)Akx<F;HOFq_IZ ze2jN&)9iP0J=?-OSKm;ba>u2>#G7^JCIxbS*1rgRY`ToKP<3^Q4!<zX^;%k8zE8&% zTH<;*-}!2#tTgGGFOEXm=Ifg>%U#LK9IEm9*^yj8CpV0n-eM+&flH4XW(+H?F<Oq* zvGDZZjmapvFfNs0(ZIvnj>?#Vd7dDIh|3Ua4|zJNUYUO*_~*0$82k(B25`QiSb9dV zZWAmMa$x`481Y}gdLacX=;uwnMuZYiGWW_wUkig66+Q@pAEtYhBE-V*%ZNWGMsAq% zqPOKyh#;Ag@FJGfdt;=~!WR(Q&f~15)>HoElXrpk424j}r60H^yn8EVhPSy>F7JyK z*sHZx@{?{<1}Z=cfAj?vrNL0lsSGx?VA>1m++EV-BGX;5uym<)R-CG+KBf^<dcpHj z-yfkT{gJ1my{ZTghYe?89(*lv9s++h&(&|SFSU!rZIJ;xz;OmCly6UYiz2|-{*@<P zgWhVG*6o>upFV2?NteDLx1b>hupDk*RFH{cC9oI+ttx{;V_z?jZ&F*}1h%r>biK}j zOFidW5Nj%}tsvvY;f6#d7@3admWhO%zSE}HyP45auK5TLYe1f4^*vk9ZL+V6>e37= zroG8YT@tHbqhVzxT8tOqSkVVMt8f{wY(QRD1K_L+n@|;*Tvx6?n)XTIT=J`(sByC! zDO>YZezn~Z!vlM?h)KG><T?#=JL=%!(|Z&60&<y^ep=0IQ0-2i;=PNX<66QYc1dHF zxcb-iV9)rhlAGekEz~tDt#;qHLsvI|Osy1I{pote8n9|OMglve!1#rOo8RQqL|^qt z?sYAQr-hFgdUf+3Lo9m!UeUSLl5U&&N5JOr^|i}7s-IhqX&HYitDc?!ueB0xIh?)N zoyCat^yIxF<7)fBZ32Y(_ka4u-!QLF5X1&-AJ(rdgPY%FoUqleq00mR-yp{nEAf&> z#q4#7scPWk_-BX^5GC=;m4Z`E8G?tGT4>~Uu6;#uY#JR+Y?*c^CYc7T3vaEr#ZInR zxyXHSW(GR$RZ(?`Chi^dZ%r8KQ3D~bUim~g?a6SD{c~}gKeRVMO<35;0{*>gqT^M& zM$-J|e_6`^#!l;^Sg%0l9JsW{Qqt9@jw+-C%=W4Im_vD;fiKg%BI={qN~mS4>|mQP ztWZ8{)Kq#1CCYS2L#Uc6ZNTK(Y<!oVj*VW#r2T}?DQ$i^jOgyk<SLWFHS`d3Ne~49 zS;85Q68zkk`qjFrms(qP-rgXT#ulUJv~KDZJ#B(mJHWay@AG59BWNsj(BHxx`ex(a zrIQxTRu&@W`C}dWN@ZimLXcV1UcX+LjkAazfol+$9dzr&b?Gu7*04tt95YKA!?$9r z=6~jkJ=ir9+v}R9-YHWia1inN9L$w(1!yUST9iiAkR()=8b|CXGX?HQ-B5|0K%p5! zJ?!Tz;GAe|!0g3}gSF)B;868#R0p(X)rmMhpOufp0S#*bNqt#!RnUxM6|Pl$WoOwr zB7Y=M0?g;WX{}@!J9smQv{1gfA7DiAFUA4E-n>Gui)t6k8gL`1oLt`u>_zy@8p7}F z^rau)C?2maVKQ<}FBr!69q<KO&~NjS8$>y|FG_+W3endus7?wRXy$czjfx)7e~OU( zPkF(*BOr$p88Y>+@G$Ai!2f+PlK2V&e<fVm_6=P^?au90Dpx$gjiE3TCWq3%c_is9 zwRsa$w|q*`eo3Uhwexai*f%EE<8;^4?wI{Y^C+_?`qK1F4j=8$DkV>6=g0bk0wCoS z$%2>n1;QmPNT@KNh8`x~g2Dxmwn#evs#QTMqTBbdi%cZZr2@jG=?r5{!mw0R-nlea zRNA4l@Dh^gLy$68266Qec_7eB84o+?RRXwk{JY-uZs136gSEg!Rx^;!PHX@o2PQ$n z&1A^Uv9MSQmKOt8YgzpDYbuPZW$e4Ic&#Fbou$RihcnGyIZ?X1DChRukQ&ZJRPV-M zT2&4(X&|nX;=e3*|BgPM_uWh=P>i)S2L}nyFsEWD6~+s{A4P2k2Rt+o>i|6{scO`J zQQv}TV#EN1ILT)&cms1B{jYfC|NIjF`G0)ZA6_}#P&&Z6is~cY<u){r{`r`0V;v#T z6=*6ECQnB`M%_kl*<8plOpobWF0U#fwETuC-ew`t=1^X*G`#zuaJEHwH;sI$k*c*s zRl=#tK|21i4@q|beS{!RtCL@0q_ANs-xw)X&mB>m(`|n?I)d{dO{QgLnpimMGsQ?o z<X#}G6%juV%ygeg8CoBr+0X+$s4NZ|(Ncu)m@Fkc8yF>qpVVCWBs%V2mt<$DT~K+& z+s%SS5D8XcV4DW(-_P_TLhj4{^mH&+ZF)XKcTEn9#y6Fl>bDH59An0-V;XYSCArqu z+bZ@F?=bwycl`%2E2jFZPdst8SeIpU{-C=4uVvi0jU_6G>xmz)P%v_cdB3rZ3O%GL z(dL^X;8B+Du#S0m>1o^OOgh6J^nte^qwq0TDwA+Tqwwj37SriWW}h0dS6mxJaHQF_ z@>3tKPd@U|A}ytZBgT^B`_=U)k*D%rrQHH1%aUEVnxEifUz$YAKQk?x5y9AIZsQ{1 zE15~O0;^*tjAQhq@ir(~4AT_I1NM#7$Q}AEF;)Uyg~E488QI%dD!3R3hF_f^NueJG zZfv%TD%$D13}&i1lz*>DER0Ixd-#nT@ExU(T;44)v9AUDeHcA%r%ST`PdxEg5x({p zQ|R(n!N$$|pNb-12E<!Vg7L!*6L}olLhVE=z9{V-WQHxd|7a%PIx8=q#4FKcq3E4b zRwkr_7{|G0w>yeu9YLEgEfzsKc1uwLw0QizPy0z>EAqynB~1wLZCNoAYm>WU6Catz zZs4X$_r$*Yc~W4+hugiX_8jR?0Cntys_8$m6=uX*GNErvyH^URli<^9T!D}=6e5GT z$h=8G8kU+Q7WR0VkO%L9a4r#jnS*{<n*a^dfxyxzh5EWtWA=lX6j6t?Z*LNeN7-4h zt2Q6Ml8TrAV@FBwV0^p0;EmwY*BIdY*@E3Y`l0}jA@+aPH&6^-2Z5#gc~)oW1sI(o zlt!!m$FKZ9N1pFMkW6L-y6XO$PFq@W^B<;q=#xW?_L~7xD?pAt)^D03(3P45vs`*^ zc|W#j=-pzdaBDg#{`rdH#<sj%cVYnNd;jj8(g&a5=BFqUSg8q7kGk}38r_x{1eUt= zyw8NusZ#BDkbq*3AVWG^fWK{qtv^oGhq_bv772zm*Q#Ta7<IIoQ<tbTtS^ztAuKQn zw!%MEJw^4wgC^Rjdq<gj>3M1rv{6Cg;DL@NwV1Y+CUvI#ZLB|bmPRe!%&$_m0G~n1 zbA9m0QW><G|Lc*jU@k!fct_Z6xuW+UQu2~$31$4xm--Fc_x_uX$_R!dmkf}dzK@UB zK!qYqsFH=ZgxZ*s`>lqajz+e=uymAcmZA1{IC%vZ<$Tpdzu)9;ZJ#NfP18ni-W(wI zPF6asEPqR0e#T#e(=!<2v>JIR1~(L2J)3n83m(Sn(u(VBaU9TquA8Uq%+}KLgyGVB zn(6N?njyqK<i~*=(sV++3yVm*sbHx=kvn0bYfg+G;4~D&^rVMbe5LON!`#bhfaqR5 z(R~hIN5kDJ3ApL1jo>W$OYH=W1CQm3H!2^`#R(z)cve@et0kuPaF)Sg(p>F7;nKgc z(7)>XyQ^_#l<ye^sWjc&X7XSB&o=B&5-cT3;q18(6MtOel4JJ6+rakqvR-C}aQvOG zOcO~e6YWkv{o&xMJ<-yGPmul5R?jLOlpND(6n_fLvb98=p)5VJ3LKQ~>#5*<xNjrK zBW{lMXYkQKpp8yvN@7-&3G<~0sM41df~`AIkBuTCBB)veY?j_KcRH*prns8pp~HMh zj37TRSc*jU7k`noDbf{@l@D4pgL1k&bH+j=O3w<IekQ5e0C++;lfK>Vf^rXD({sgJ z_^Ed`*=P43|FO!Lu|k-92YjxM*BvAF`2QCM`PUozcTwL}0Q_970CzCnjljnkZ@`iA zAHVEB{~}X<Tch0i1yIj00L{B?Xb{P1Wo_Obm@p7v^Z~B?6Z<{iz9O1Uw6*2It$4nO zUV-kIIe&%(lmKIZN0mjh14GxWXsT3Lle^|DeO$_kiGH;!b)-O(1CqYENS&CDy|hTx zh@`vOzRz4^1uBVqW%w4uLHC8pf)Q{jVyQt)4_{!kOEy0o2eXWJnjr1vKmEUurkdWh zwtnUx7b+m85Jxdarf!s&B;1;+u7}D<sZMN>rKVVt^hV;J`xL7nz0^P7A3Z;NP;m4R z8F5L4&>%;47O^c2(Em|zP%$^S&X3$~6Kr*i6hs*O?=2c7^%tmHmizw&>TrA~UB|mO zYJl-A!}@cTyfpf2THYMDmv1LNl2J&xVMWo1?Xacg2USGV&VU7>dPJ}OQd67jiacGy zg#0V^`8a<_VAaZ?nyMZulbDvgyKTaKHcl=$;(Y=@+zRKF`p5I@)FWu*b>ptbqQ-Gl z26#~ZTk~X?epXu4be2oZ!qz2BBDdzhGzmNM+r?3w&U>@X-4~&agh2Zu4&|A~++~p= zja|We0-RyN<pQ_nHbLmLCo4h4@n+2(+s;q-;y6RGI(hLMSN|M8BZEgN{m<^4YfusN z|6|+!=j!<fJ}iWTn&tu3BEJE^8CJ)C93_8zhQF7nul1uZpmUusk8oAcx+?+uIdfgx zI%#B#@U;}VPm`-Ts|hu{JRQsURB7%F{YIa+fXG-y6dQh=K%qbcEkp$slmcsg^-OZS zZ-q6;)r#ZX0n*A6OK!u8gY-Z`_9$)y`&5yPi5lwPg+3MJ{Hcxs6}!WUX%ZuRO>Wn! z<KcUfwluMIr+b=uDAGN1GsY!S8;2r&R`4C*LqTU*DGr5BcP+{NZcrSgt9xaAZgM|G z9*a)baVGZJZSXZzx<1Q<FALjESvQ$Q&+x0rx!?KJtp6X+TXX-PH)n8iI$T6}Rr3Gq zJNs+j7UTW}%=G{N0W)R|kh?ch57X1lcrw~9k4v0onp4?t$aeUFny7~h&%19HQ0ELA z4^j?6uTVgkZ77UzBlVs&E5~|zI8^{G6#C42NYMvq`vje45PfaJB4gkvMO4v;dh}7A z%Bcd5+~!U^p^^YjQZ3F;9wvF;8Cpi;xTc-KQS;@-qF(kibv-Rs9N`{P;^0o-NU+z< zm!Ee<9@5a2`C}0QfanlkE;_*97Iu2k-{8|ABy8JeF_=*e1i>cBcggS8u(8$Fs=R{y zS&w`TZvI`_w(~tVepmj_s!oP68VHuzr~~97WlzN37w!LB`Tls(g;26AjZ{C-_zZu~ z*cnj~f*iKFSpgQ=OR__y{cj{TVX4HhT4o?fL`4k#3?6eT>BkK}*?9%A8QNYPZsqV; zKp-ViGxG|bW8Xhh9QG@Cn?vb^V0|+&jwDOBBWzlcpL8mJ)N(|S{E$S6nNU-lnkX`b zwxqFi1-JG`P@iU5$P=~s5+ma@6vw+l$NK*t_TB`jscc&V?$%ap5u(xx4T0!GrBxsx zA_;_~ZCYs?1r=qI85I?UKtKqDL_~-Pf{MsYR2mRLCI{v)6Bz?C1eGZa2_!&(5JKkv zU|;XG`@ZUX|N86QdR70cRGlJ+oxRUld#$y<HSD#S(H>8z@W()=`Mshxyh`|WM^p+0 zcBQk<vGXu$)=gG;6vz%(3z?Vjdj_pgl3VbSUp83zLch(i`6J>GZ+IvbnE?J+*}m>g z|0G*~;<kH60F-6kJ$3Bo+dnvN{lQD|ubFXM7~uY{0IFT9eP7aUWVW7gx}jfS5)vl& zYYFsr$dok@f)On>Sh@gy*$?$N$AjDP8z@KA4w37FR=S8?R_R6FE*2_gE{@tp?HI@A z)8?}(YvEnreduC>!HK@z;O3*_u#1j}P-g@Erlf2o#YehORV9t@BC`O)%aVw^W!(L7 z*c0Ke(tu<>h4#9sjX&^L>-<`6*V0btD<WR_EEBmo)J(0JK5&(Y-x~e|uGOqKn-)DT zE_bOJw@n19%7~VxM=F8LH1{fi-AZ@e;>0~jvcP=7Ca$(e|7J_=cd0SH{+HCa1w@%Y znE>+tmd{4zn|)`WPXK#!CR@d0M}c~~n}4RGK1A<wy0_f59=;vAlxqf=WmqzrCvTNs zH8UGv0svJFfAyj#Zpz?gX%7f;%i}jM0}W%<Xz(vEoB9%o3qy~TvZeh3s(1d#_;e0P zGT7`|MN`S&u{9mhPWf#|k)NNiKEh2m_ApTS`bn(@?}%tu?}0ce;Oy+Z?dc87QOYgH z#)f9(hs_UyG8ek-7>CV2&KM9wr_ka{kOjgNjZ=0OI9A%!zd2^w8?f^)w(hChYVlK0 zOTvFrqh<MBpaI2tx~>v|{pCg3FUFwDYwY9ByKN16k_m03Z~O2f^<56ivL_O^;o#L* z!0TLF-B24E<;;Q&d<9|XA=@vc3cBp%F_%5ThBGlw?uM?ow!Mf`*?{RjirAH+78`&2 zwz#eFc6sekneR_(%3E1eySjsfW+qo>tj({zA{t-S)cEb(FPF?sP|&T|hJmi;>(9C) zf8;iaFF6jFZ)&N3MU;GuHC>)EoNP_tm|_^4N`VC7_WMU}PA1;E#ff;3Wc5c5JMuRU z%X6+Y_Wl<f25{i2R}l1Xa@cd57h?`@uF~HC<&@`{W^!js&x(hfcg;kecl+=d<JBWq z@1mkc%TX}?5X&~ueXcXa1g87S!1#xc?Z=*at58->8f2ufYxjusjAjf-Y71MGdBpK< z^Aj!^DM}OHt9&!@NJ)2xs`4!NvED&k_uw;<g{wAqYz&B`7$AFhjYKZYhsQ+wX5t$o z4gp*7A|zeg0Ux585a+9&1ljuFX0n{xM<Xzhed4wM?DHTXWy%0Zt7hX)FN?z)_I_KJ z```;n{2xacz&VTsN1_>XOr3Mc@AYwL!*k4<*&{ch$7*K68;OTDG~T=S%W;>({wmSe zU&WR0aFqKv<>3)BMU3<K`D08tisgYanvH)WX@J8BWpx?j#07fUtDNYzLXz)ZW5-|a zXp+<!9==!2UQ&<rP~5t6bX1iX#A_1=w2T#-zrsFJmFjK3MxHXm{jh7~fMSaNEB*D@ ztLCAvtTAcNB1!rxaleh;+jX3vqV}P{c=2t65pZ7dWD*>6vC`11-!)BpE7<SY2I!Oj zr1rYf`-~2pp3FMrBb?5Jns3TGpBFUXyn}r|P5!Q}@o7Exaa=po4ygF?%b}wrWMgx+ zN;raHpxb#Aa`0B@o8rAlZ}7^_c8jGkZiC7z{foWLxGBBJV!ClxBzn`bSt{rkzE#pa z-91Joi{)?iVy_R3F&>kUS7Nu!V$%GvMMU^j^VuEmf0_bPTNh5<1#k7Idmyg$wtLj< zP%U=D4K$bS+KR!iK<E0{MLNro2s{w__6Di}tm>@OfX<R6{wH--o{bLe)%39Ucw_*F zV7M6V_vVh)?2$2V@YgCoBew=N9Kt+Bf>kJo5twINKyJv{7@gbAu<oD_K+#0=kJG|e z9-5|pd%FRb*;VQx!`QpXi5^AuUtd9li&u$&99HSvfIFV7Kr~0-2cBX92={8I5diYl ziTY2Drb_gnR}I#ya)}d;jfd^%iN!H)K$-2#4&=dISIji7b*n7Fbs1JP6#H?w;=WRf zMkW7Tkt-S4gcuQVF@ALOuRoz#U!Kvhc}-K?kJB|ZN~g+J3b%Ir6;%C%t+1=*Ylc-4 ze!g|Pes@?2;~z%n7trf-FFVd{d3LTe)@!ir{<)V|CPO?Zxay{U!PDwrX6`<~UzSUb zLtgr2fCzy$H<+u959Gu)cWGQ{{LwWWs2=X;3BKw^y3Qzy!~NR3z4^fU6px-}gm;Oj z^OR?*v8qym;Sj97<E#Ok_SiA)Ez|v7L^q`Q=89_INxI5y;>nkH5g%ZCaQC`0igx|- zW~tlC-5bEFZpSale{3fzevApz`EXHt##dT)r>+~!I7R9$$1oj$A`u9D_tOY(U_&en zK&;>^$9`Ely)O#>N5939Z+?|Y(r?#Sjs@g-d{J`!pIxbdLk#lCmk8hTZ)F`GcBPsw zqZL&915vt8;^E(-lx*Jb8!l1aP`qR2uz3r)XdyzS8PL6#K^{MyQ}LkVH7+&Znti5I z08(?_{N_DTfqQC94EPQQU{u(|5lKuKXe-YE0u=WivGX1TQI2>!xc&6uM(q}-&5pi; zCwJw*jL2)7op;8VnY5deZVu=vUT=>4y|55m>*Kte;{%^=kjrf|l!Lv>n@fs9?E9Yx z__uYA@*c^cp;BO@U`XkuVyZr{2gVmjN;zbG=-WrmTW|JgeUU44WAhLAzmcnnkZ|cw zQL)dA@{er#w`zbr#BF}I>%Rc!*tZY=K=^;=u=jU<ln8l)K;rT=-cFC7Io*@p`8q(c zNcnB>&IRSrGis5yzHxbTc+Z|KM!#wU&b*_kp|N$vaK(ep1GSxpJRZZ>2dJnCGp{Y@ z-nXLLP4&bIx*03;r&Jmc^QPaMLp+|i$s0`&_0x#@OZpiSbk)N{YuzSX_kOLf&OpDr zv|%<zUP1>yL0vV_IMmz&VGS~NCLc21P6>zHL^`{nu6S;m0VgiZ7(}WrcTujVDSBi| zVSZ>80=g&rM8yo?ajCY=x0?gbmbzhh@%~q_5AGofxex4aeJND6x;K6o&miTp;{mt- z8t;dlzVXREdhppkQZy-7`dka(PnN+SNDtUbmjEHn1B5kIAnC2+GO6m<@>bqC?|g6c z>$@YUB@enA<Y!dlt(0rA5%`sj;~fd@AP*_2Ixz0_Y*m5i5F|0q;?C0`!Gm9p*jzn* zdiKMD*&EG|cV-(C+$_*x2PF+h<YAW{Fyanfx=*<I!O~jo+S)Q{o=(d4XKp58Uu#|p zuecn4=!JTDv9>+WEOyd-N$*JfcgLLG;hf0O%4TO~;PSwDJ}2$v-r)vJC`B&clnKVP z3tkv>@?X5(Js3v`U8z4<RBw1-Jy*l)sc-HUO9;#kW=G+HW)sn{l4O@w9iFeVP$Z^t zp%Q-di@c&O1&~^%?})<;jlCm3l7>~_z8%BVUU#|#S-P3`(Bn=*&sTis)-7>C_3*C! zBhV{Dty+=nB>tK}B-YI(6v&&xPn@gaog)j9Ju{q5=WEw0`KLtUtKwCNv-jhZYA|QQ z_MKe!{Ksw2)|?&v_0;I13{MNMw{3NprP}}P_T!CTwE4#u*wDtM$Me%Gl22FDCEedU z`9}kw$A5eY!hE;V!;#+U)A6akz%wBU@4A=}q!u!^zjBR%lW~4dLkTv_BY{GREsCn3 zo`}7Y3v6;%A)^JV6AQVTac7;8vdtQfxGU!qv@!-mN3f&lT&04q6U8x|Fm6LbJr5Cp zMra5#*Eig({<(kW8d$$*L%7x;eC4*;CQuqo2g@olK3@4y6Ut5$`u$)__Pb+POE)Q~ zLMtwuW`YYTf%3MdvC%c-z~*Bqs76#-!!`xdfyFEXk|1Vo{5ypf^j5Q)vDm+pYW2k| z3Tr22k^;F1sAS*trZ3+04=?`t3;NX>(;slJj%w9S9j3>hEdP@5{~*)fTRUtEqDuHL zyb&SeEE-|fqeceAuBApjq0(;u>7oq9URFJ2krp162%C84_e-McBwc%Q^u#MeP(l8B z-l&i=w`4zd<3%)|HQ6IK@&XshJ($SHK*-v#e%WDi(Kv8CNHp2Vc^7z%h7H>YHnzK9 zrO0^YazM1}N~RqQt~mbdNgQ?DBRvy~xbA|BTS&~;Q&3d#sFn+uK#=EByb1(R)Z%?k z4Sh1v1uKGx>o|qZp=U#8Uu}}8Xz34VY3bWCKfepWUbPANf1_351n(oM`oHI>&p$v1 ze+SU0XQA@bHDt=^zvaKbw_e<MoVnFj_CYjUS+QJU5GSswS)w{8b?%nFnAUYp(^Y>n zS^Gj8DE`de0m1UqK~(Ny)DYho9c0}Sma^q2q_5t0M4vLrhP0Thx3vi$1b2{J?WirN zjh>bZ^Dl{G4SwfvTjErShMI|?{^7=5t#=QYFK!JamuZq&Zw-`_^4D|Q4$S9n(}koZ zRRIi(e&mP0ZR_ZJ>$2-vD^z|^tmknTN^aJiIawyE;Y?rlz|Uhyq8Szts7~QN+%&X& zY?Dsde~`6Qx0Ow2zswWOiT0_BfEblbAPZ>ok3$`D0xveP?&%TH3oT)7#*AV`Y27&V zw~HFFSDlyAPm3@x^D@fZ{+uToLgKu4lhU5Nu=LCm$5CZ17Sd<RJUia~!kul^FTNJJ zB3at6uk(FVcDsFNJ!LakrSCp-8pYUdPIRVU^od(YxAGCTjO{ny#Mtg4Ie5PAykrq9 zJ&nXPdMC@rG&GjDvUErTp^BU3MSRpsoeyEM|J=y(eIg*<eLyWc_~D!jQ|7R!Cs{qG zzSL0Y>1}1=ni1aP`7D>+=}-Qe#ZIn^wRtQT5!XMpO9c?it@{H1I01hUbl{6+<{D<_ z(3@bU3CGD)Hu$n;-ix#{@VduT8rPE*9&G%oH7jW?+0L(|Gtnw-``lK~ednm=on8w( z(EI88ICp!6g@b4E4!ek*v>h2tNN>+M?A;h8Yv<SA^sacjLvpX9IF#Y@kij~)n^{PU zB>ZM|?+fQmvGxko9FAb7WzaiUSvk$v-JVkW@@N?bUX~YfGdjZD#oo_i`|$t^x!W(L zAtRz;eia+2jUek%vPyF?70)+R5Umd^X{I&0mZvp3re}UZ5!;eAi86kr#&_fgG#|q9 zpWpWRr{&<YR;ryo1(3>$!g>1X`XulVWCx`CkF8twqdC?5eD4~`AnS=7N@j%=B~uZw zp*oqq6L9_!8%d0~5b(^(R;cu9goscf22JPUgkv|Ya|ZO?7fUj<_7oB}a10j>!Pfa9 zbV!E@h229{U1a4vK@J;mz1|JWVQ#87N4$J<yl9>7H^X|NIhY<hVMvTsy1P1_M-P~I z=7F~lvg6fiK`nHuAIQxaE}gPe=6`E@NN~p#it>Q<*83v#n<n6hP0UcB;;yKaJo^zj z&!eIUZoKzY{Pm|9kDi=EMm=#kVZOR3{+$Y0wtrh36Y&ZDk$+9HAGg6A!Zf}^I%LMX z0?XsEXM^xRQt1yQ16tqRI7k?=ebG7Wf1UTSM$j@6wAi90qx;8^hAXWUrL3>C6BXxM ztmOBk8H>Ml$Y0PHgN<P38k8O>!-wS8x;QH2qa~R^i>;UM1(LA0a@Q+v*Ok4^7#=Nw zpJ@~KMy-v7R`$$ato-h|u9oup0_QoUwgV46%dA`|ja(IoMTUxe?7GCs)0RYU!?zf{ zz`ffUIGlYUCQX%+W~Gi*U%#H~pjYZyNEWhccyth9<Ymt+fz3q8%KI=>Q=<e@WEd_{ z==|!u@gLq&xB3&8Wrf!lnwQGvY9tV6D|@d$H2H78<ZoM5{KcDtPp<fjHG-A@J_moI z+OyT!Ny}dYB)|8t^2m$(ZEc-i3;SH8Oc}pJ8R{&CW}5`LRrn9|fyDdzv)1AUG8gBI zo}axN$@g`1RItZQCh9KE(|@>*!iqgs8qZSZgDLYD&RRj6o-aJH!&2%REgX~9o0_6L zV;7Dsoa(L8U#Kf`T{6x$GVJsvX)GNlyX&c^OcLez#<<ewJ8kZY-iMo&kBvr~fwTwQ z9t|(u4<I?{HGx$#1`QL_&?^K1fW%Uv!&s&h1Upk~ZX0L1oK%+MI<;)+KF>x)l^cJ_ zaRuks>B=~P*pn;2O0O+@7XE`3|2s0A2{W<+I1bN!#ZL}7Ineja<xg_?hac4@Jgo(G z{k?w2Yqw?+=tg)6Ex>t!kfN)8WAa^?sbC;eJh7#Xwb;;<9Nqxdu*zZw7wwie=dIW+ z7`|<hYtU-mNZZkD{ASOL?~3_yi<0i~ekQ5D>1*2TfBAkpvFDLrrR#eNVFPaH@%Fos zIEAJa3;oygNpg9r3c}9r>&JBvg;|zKx^eWJ2zg8Opl0K)yq#$c)r*D&=^eqt?Ml%< zrO#O<`c>RU%`cbMNY(=N_>4kF>m!&pAjEtvtIrmG9#uU2>d84o6y0KK7lRG{f<?+s ze_jU?Dz1w#w*SDlpGEmgQdlOg!ZKq#<kJ;Y9sQSrZD|<>)FZsen+vQ73FtZDX<Nge zwvx1Z0J*HimzN2Eg1gvP_p?BQ{nf~6?X>Wi-rBR;BT$%9)ttGaqs&#^1+Ku!Oj2D; zAsH{0Jny+dw2BFE484Wf5<RZTwLl2l_7#53zzGJ~ZdC!{-Et9`;!`W9tG#XH>?GNJ z6vE>yV>ivtAIu^7jP5S6>R>buR^nJse*jEJAW4O7I_g^l@YzCciwZce3In^kY0k#5 z)DcKKk}VLCOHa6-osOa*km-_no)!t`cXMRs$vKm#I-p4Tf6I9QMRpgCNN2vF?I(#l z^GAyIWc~=+NQxaf^66^EdHTgV^Uptxw;p}-arlkUn!rlWvxSm{GTcleVS2DBTAARN zB1xWJTw7sW#MCEi!)LZ;gK4MnzxwcU5&_F+U$$J(;^^Dp*d$|jZAW+e^@c+8rTL=H z`_S0AE#3~kXHsD*z=|1!@sF|EHgiBR)iqZcXOCl8AhGB;^-PT|0CgT!p;@=~attR% zw}e2bEz~s1VpQ(<jY4-E%;Ngf7ubm;YklSF>0@H$)#Y>$5A6LXOnow(Rz}0~F2_F~ zNrm})Y3VO{&HjNDWlI|!r6U|bVZAGS(0TH&L~oV(%=dSN*PDC!Z;b)gh;I{2z7+d^ z)`&Sr!lvUA3dmzl9EYLB{?dF6VLeke?THd4Lr?IRQC7-wz8B2NiVFf4(4I$=t-*BH z_)13ih}VSIGgKJ>?WLzoz>|j0<R}j`NyWk4;f@Xrj3YUcpMGCp;M*kjz)`V2XM?@x z{M)TkAo1jEefaCa-`u0t%$Y_^FRJa1jLV80z&@vi*^_!g`%V+BW^AOVt8RHA6;`mL zws6ITu^w}qazH&u-Zt!hw3{RTb{KV1+a<uo7ucLB3n9><VnI$JaDo#EDV{gW0}dJg zsocnS>XDWEN{Mll;Ezi0%qOJ>uwGWdkaX~$`R5Pf*^~7<>zV(1taoa38N;;Ulerq{ zYa~+?0xz?)YGo`MW!fRG^`E|xp{vO9`!TR(<62t<<jOa*`~|Ta*)Lhk1|?8+)o9b| zH@&nu#1bZ$_@RH^IF8m*4GI>b3i!tK#-$tVpyhUBDrDNA?tbGAa84&&_%)(gxxlPI zd}H)@&VW}-P5_>9yQ$kz)wRTNRKvst2}e^7B+A`MAjWN54<ba#LE7kUO|B(`1+s|D z8U(nHOc)n1q4^rYQ&0Njp;dZyKK)&Bep|yQF<UVKU!qmVme0)ht8<OyecqSq?Z4qB z^HpG?UK9Q4N*q4&CCK@wpC&qo0Y#_Xc%2~}r}XOS8CD%iJR=hbs02$w))K^0Sq^t0 z;G|WehjkfprShScxq=N${EF!NuqUg|^etZ%*4dzyLs*Hm3T^Iu;_SE{$GjhZHUnIo zA31JNA}GI|-XL}zI0X%!IR}Vr(pPy796AaNdxU)!fcus^j83P33fGpPBlcQaAYah- zm44^d*`1}TIO`V&7H1_go3_LTjD%d!K?HmBnIi?IR)iBPL^9U|wbGR8T_F&Wg2u!w zIuT+sVsv>&OIAik7CM)CS@s1FIZpqbb}kJP!M~!N+3&O?{=2jTN^*Jzh-R5KQ1W~| zN;;v1pPaLG3FYNv+e4Cd)jP*e&P|;xgo$6fF~>c$J|N>V>fg%uoP;X4Gq(Bo*YT=? z&!-`L50273cySY^a=Lj>(qJt4KtI0kWN2+pj!YBhHyn)!#VK+^o>|449Si@>YAO_L zyBChetDu{Vr&y>B0j}V*Z3TyC!5#Vor)&(t`B@p#=UK!0D;XBLVAj!M)<aFJw0<u5 z(DrOPF+4Y1mJWd85LqcfM5>m)rr8h}z+MIWbQA$!V7y>8^x@d1M=i(N`@Y1p=-vC# z0zwV@FnvE(@-LA}n#Q_Mz)ttyf_IJ%>*mVFm-|dPK@=7%uRz!_BJGv&-}w*EEA_<G z9CR`+dftHbUZ{(@Fhr`C)Ev|%fr&R>I_oPt+AEZ<^tN3&8D2;joKvZ$N1KBL^TiWU z7p9-29bHc8{+<Ym<f*#dY3i$m_--ZTJwlZ-Ja1lL9bhRu<EwoWPCRQw-D{JsSaurP zE{6k<FjBOEw$9QN7ElkzvCEg5)`mmnvk}GTC{1T$5wFDou6`Mmz{-gpH4$exa3s_S z&$F%Jn7H5;vJ70rW14w68Nt8u{p!t1F@Q6P@udj=&pMOlFYZILUzA!BZ;g;E<|^3E z(s~G<p^TCVsMUHyRH|j7;-qhvO@FALg-ZFjov*)dP!fJrqmA}9t*E`uz7@V_q<qov zJTGqiWuYt_%No648G3Lk3Yy`eIVjpQ5>i&^9BuZSk$a2~tyHqo&NN&R|JXRja?M9m zZiQ&0Jeb;(>OEi!oG&6#A8t?8X>v_5M<%*U-Szn2*d79HHKAaKIkVP7ApE!yzCi#K z>SnHP#uu}I`ejb0+;)Q$_BTXt-mdj+j9m=YAF$qozhk{Byy)e>!g_JPV?E`63+w6L zT~j*f*T$L+9I38Ym{G{n>O?Ke%NDI`0w@Q2P)P;m*%rh_f8X1-WW~;Xdvfd&DaoXF zBGXY_-zhqraR#)wbTa>m-CAA5Vk?~Dfs>d8t)LTnPPU^S=J1V+`G?c%v#PFC6N5DJ zBBiZZ)L6sf7#LnvcmKR*Q2NL-QCCwynjIF$$yr;d>TIB?b~vptjnW%#AO~}_=hLGB z!*>1x9R?zWSI<u!R<OaAMeSwsG_1|>PrcO-GP)K*sA+KSeILOiJ}UU*H6~Il<|^9& z7RSK1knR0C8I4`1r~h*p#wT)(@h%*HDDXvRMzt?*rpHR+QzOY8DPsc;L}|pdGv24d z|K8a|MaJ|yx|4z)s@+0ylZIn(%Y#fPe13OqS!~0$f;#cicafw=Y59?hOM9C4QP3_) zlodNkX0V`QUMp}v12PO<s5%;;I^4#cqqf&+DJi}?H~%b`KN|T1cycPD@9_KlEMk7p zaCF-EYLlLD!Fj`?_i-zF7B9~6t8L2Mwc(2VV8vK%WpVo{qf<0uWD8+j!Dw*a2{1rJ zkdTiby(M_b1v*e<8^`Olwu%Z|V^$il)yyL2OW(@b(RZKKp+(KF#%6!Hz5)OT`~m<m zkQd#@^Z<pp>&)Dj{QZXs`t&93)f%7@2Afr2!f}-Crpr@JMRBsp9Q=5vGEjOmF<Z3q zx;mtrZtrBAMC24-0&m)0aCpXWrNnWV=s@X>hIvhC#WI&b?_V~<=khu|u0-S#-I*Ia z3$oG{ReMKG0#6Kx&>1_JdzlN)EjFC|FwC>FJw{hzf_=v`0!fg$A2Q~8*ogI%U`ygf zLt=g;Y<_S|3*-pQ$yn7Rv|gd9Vl&;Xtey0zN}G%!Uoh4d*ZByueO8`IOXmGq1YQ=@ zlx$3pihr)@H7oVqs>$y>*8cvFYstRPYl-jBvS-0xTfJ$>-`5h$e`_tN^4&P-OPS3x z;gop<Fe(h#HM_*qBZA(co}KhKO9PyH1?=knwyc&qu3nMioQ~UkLQWjcy)??xd*4SA zq~IKn_EkJ7iTN()kPbqki4~|0z*A6$%CdVIRrwyH!)+lki%Y(F6{jGa@=1)rxl#Q! zEb;oY%?em~W-BcMHc{jZZTH}P(-UR~>6MSK`7Tdc?((z+q_8eW&TurPp*W_Ai$Efp z=Hhcu#pn2E^UNAuk&vW((FmH+p3D(`D3s7@RyqTRMNfbrW(IaFO3S7q`$Pdg@zPYk zrTY}^{U022|FizkpFZJ2;E1U5zS*9DzO%MK;dF7PY>7|c_XJuIf|itX1ccBE|7`0- z#qsIZ0nj&<9C70|udc)l;M54%{OxH48vE9k25Zx#e9C;p0%#-@xoF2RgBB`13Lj?e zEa2a?uq?)njib*Ru<{1c=y9`p{jHfAgI%XJ+6lkt**l3xV;gAK!YVmQimi8`Z9AZB z^5Q(q)#C1W{TaDPD^w}k|Cwz#x%VDL=(2ge63zEY&pWkLY!fHFfKv^WNY20mHXeq# z<bfOFQeEs!1rzakDCs!L`2>-ev!rHva29|%t^Yx&Q-xm#R03!9UGoX~$XYd$jYE3g zPj4PSTO+6i*6Rf-L5e9o?j&pRmkj$)f2BdZcmaNVN-oqCO4e0eAL4zJ#>+(Z>h=X$ zh9*HAZ30wRCT`ttu(e!kkujh{=GGNuU|g^gkKmxiWDCT4tb6HuGq@gqn$E?Nj>y_1 ziPB!tM6}Xu*!;E%j$ysv>v)V^ei}0or#N~Ai7T`~!8P*ah(VKiHrU{@brj>kZ#7Bq zxF$C|TAO#7lW|2VUUFGq#$}V|ydX6KMrw`E9a}1byTqE#VY2&d-=Ay6m7DdD8eIkH z|3Po`+(yTcS;M?@-sKkp*yntlJ{izzRV!k7naESxm&1Vp+Q>s`o|<i8Bj-@QCvb%J z1cAocJAn_J$w(8;A25$eZ>3?h0n-e7SyzFs+IjZ)FlN!PiWYNKZ&4F)>SP4tnAsqr zXxDbDB=@^n;<Wb@w_Or1Jf)qzdc>SZm%GI*meo$Y;E`2aTTacWkk1KH%;hc{BFweh z3wJvvL7F2n*H*4%<hZyu+AU0Y=4XJ{XD3qThk!|79ho!9mYuFOB23znMNuLSftu`9 zP|gVd)wyhbkOh>daWdr(V%Qb~iADz{$2Khk$UH#MSu8Cy8@&Ee3eq#3w*~6OGA;)$ z&%Ez*5n9NWSzcs@mkmTTK(UccK_t+`Dd;(l>@C4Py|ijlCl4s2gqLuEDqn6N+LWb@ z(tJtX?<VAEht1#I-#*K#Eb+fE%=hj1q?hx<|1Cp_Vmk`NT^&vke)P}c{%mxDa5%^m zr~)AzRYr>5tp$nc<$%7!yVv8f75?bsa#!GIqM>PnfH4DjVev{A*m^~<7K|dCGJ%1; zXGbWtT?xt$=|cGhYQygsj<$D;zs=Sdwy>W(ScG{caI9C-WM~-m$(feP8Bl(7=F}`P zn+IdFO|B|ZyDdWfAD^vnWo)LhA8KV2F$kiS0wN!+z*vVW;28^?6N~-oYm1d$5nw8t zOrGzA=Ivyw1bA~&V1(<&jzJ@pBa#C1nz8-TrPnm4Kt|=6`~?7WWwQl59<U+2z<*Xs zi!>ZkGXhS0llFbgMukgb0|#FQFLgr;GH{D6)r`Uy&cOEjzO^7kQSfAf?Qq$*vReVd zS~>DHUZAv-K$clc=0UQYyf}i`mOmbU9X~H8OYZ|ox?F}y%jWnAqHT>Z5ArdN4R#45 z33Ex#Lx2IwzBwX%G2$TUs1cCBHD&FetzVP9^Ue4gH7m&liBFpE$Gtt_^~Bbm^ZyF2 zq}^Ku(LenJ(LVvemYpYi{*o1{ayK3)?C=k0P@q}S6!HLHf^UEgZHb}=KOtZ>*%B7+ z%hk-c0tW;J@%^P7P<Cn`J>NXXLbl@^(*X1`)3LuU^}`DgcVA&$-SBRtq4y-TY4mck zoFnFdGC6-ywUax*9rYd}vXgM@F;kF!6I-miwA-{;8<)Rg5uTEj<{>B4%Z<Ojkjqc) z`}%C$w480R=ng$zb2|ud#TGg())n<`Zu8qq=?e97ZK8YL=c(e*h2w?to)95+)(t%Q zcHG(mN_SlmH@RI&kZUvcol7n#BuPKah~}!eoy=ig0gAWc6gcE7I>;+Mz9Q|~Nl$da zU#@U=hBWtuIl5J3%UWxtSv4ms%Wd*Ff((wmq_0K@Sk;n3nOq(ezYzVXr;xWYUQjvb zAd%F_K#DqDZuAk!(1=s$Vm!%CBBsi4GUIE{c<Lhy>Uj`Jx9loJ@{u4ix2;*+FLOsB zFEfFOH@Ag|M@b(^%btYg99tCE0QC|=gOk^MPzxLi;8%?HkfiB-BP(jM?uF>K{J&wU zqWCpJW9(LsQqG;q!Be1(oToPBe>s_F!uFwaS3~m_Su@_DAt!^3s$2gOppBx}6;xc2 z^7~6N*;ghDY^1C{|7@R7Crn3Qo>u|+VnD}hT7E(G@`t|fojg190U}fwZhwg%o6hM( zN$1T#Lkn3HNX=#AkNiq&sZkEQZu%XnvER)>v3Fm;p>c1jV_`#JEO11D5AULeJu_Us z2Q9Cxh;33GZQmOc42wE7j@9#>WGDWH9B3JWILnot0a=;Or^m$w#L{4j%KI~#-O`fv zLw_2UyY63>+aSExqd+$}(eJ5|k<Xm3)@U!UKUx-qPwFpUac=wCm3j)wE)z{8S(WEo zZ;C^h))r?lGmi3lU90;;Cr1uAaZ(FJ*>dgGtMJ?+a2PA{2n5ikMd={mvIQ#0&DuIu zt$g^HBeonjg9wL#kW?)wUphA;DeNaK1m?JFl1u`<c^;_c@ksC-UOWzQnI4_?rxKM4 zAJ5PT5|X_np=Ob`Oc<--^QEE$sc<IMP>cr>%Enj}f|z0(hgf`@8eo#htNNh!K~t3^ z8uYY9EhwRU?PZ8+!DpdQJRRmmoyzn1Ymf6ME-<nUlatQJ^&6pkbV{qsjr=00cxpB0 z!|Bl{s9@Lq-Y5Us%ME+8#v(^6&Z+8n72vmlU}qC-Q5d?wlY|`;kJC&AjY@$)B`Ryr z?1nlaDp}U&9~xYdk*=%Q)yjG|bVEmdVmBypMK2GGWer+R^U~T=;a95Ta0+D;qx<A2 zn5bN5=5BgWIulGx4H&z$0v@|`qoaGzc1s8~Ox*@Vte{;;c1?7@vPkp;L)t(o+<VH3 z6n(lyvEItqC72bGW_(#cU|#auSB7?des68a^D*@7ZPfCW`P;=TD9Hk$AoHrNM`YUs z35PxRa+1nam&$w>N8nC;OPWbGyK|cQu;zl0I{`gG>+z%x2hnHVr#dG|&kNdUE(D1e zaA7>3c3tR$NaxK90Jk4u_5)EPc;&-1>MHu8uu#L%MA9^1fSO+`V<eNrEiz#{P>u&D z>1DV3JE0_5bT+4oTVR0VV^D#NK3kXM#|@Nshw0PQCxy{~khBYH9^X^P3ldQkDMBq= zQ!`%A_P?s$%S8l$_=DWoKJ~!Ca$&u)hMnm`WBg5HXCk1n#l}B-9s6CkI~K1dZfz6g zaX`-hVh+!4M4tq<-*J#<`F*Lme{GAM38THJZL^+i>q$0N5AMlQ5iJ6-vgJkpTK=~8 z)4`K{(<g`gop6H5L@0T&b$_9$Ow6^dp0Ahp+!N9eA+OwNDb<N53^igevbY2OrU)nF z9pX{{YCR|8uktL+Y?ynBR~qfm_PUb@j$E`k?Dg1{E?b;J9NoP-2a`aX&u}dnK8Fy# zrQOKH!~>bzZV^oMCWyQ(H@6hzW*q;m?e<s?=W#Ha@=P;OyX`m1e}R74P}*x@G>Q5F ztd07rKj%jHSxda%Gzk$L);5+Gd0$0e{OWn8^L7-rae}@v5t<hk$E(=g&Q73Zg>eM; zscs&u2TXnb<F#ZVb$}dD;hkKNx~!|dum5XTC)$a`Aliql@<+OJwvReY%1so8JpT=m z`z)pZN(+A}dbGS7o!WS~8I$RM>7fO4vh3D0^xD2hlkX0XB?1nrsDOD}TEz4_mksz} zj_}?2CR@-@rY<9C@JI{-SNL_fCV*k!xFG}H{Ij#i73GO`HfEs*!4&0AF&eBChwR<l zU==%V9R8L%4FixXGRfQ~6mdO6JQ0)u&_eXUrT(ps!?vpXW|FCv4ka%Qyd7f~6Q%;z zE}OYs2u2k4xSg3ZM>d3BDIV*x*sd$sz29;yHaF)`b!5=u1;f#nu@EThty@!FVpC3k z@!o2bRzR!QN#gFpG#n!biUq=UipPuBbK$z1!21heo6tqOQ&rgKK{dg5pwF!e)&-?R zYqYZ+aeghlVCEg8COJlqGe{MePiv!vn)qyt13%9knJ8e|9{2HMMeDluwzB>URo-y; z#fJ8s1fNb`ToF@#xTdtTrdwGdPbRIH7N#!$${$%axFGo|3bY(MiX<EwTM|?{gF<D; zU3LnkLkP7X=Oqz^A-TCnBJJit5c^+k7fL+1g9BCerKZcVU3l5RrI)3#Lg}oibObf? zzLxuR1a*j`d~li{2mCL@XGtbY&iGy;eJx49!ku*=Uzpkaj^pyN;&||q$hL;S6D68{ z8iV%x7=0WUiPVq~*X2CLFP!C^N%c`yi}NJj!^=MOXN}YdB^ZY-66po%`V3{DPi)QO zW2=4q-ciQd3gG`DlgV8zVRbL9zrEZ%@X=f%1Ade_Qj>k6ZrHVENkn4^?(BJYiBsOq z<otGI1eF@v5VBjx%N!PRTsmyb66J76ZHp2QucX)7m)f+PwU&`VktNccAPIN>i?l<x zB8O2k>iHZ<S?mk>@o<N_&JICKohP2|iY}^8&w(F&OYIi#jj`D9x_&;wz`yG(th&ku z^B}P>42b1po5pU)TOU_P^2g+^<v!8SH7zOSHtw`a=PP9&RwM}wtf2M^Osoqoh^0xw zPeirkc`nvIt9!al@M`QXp4hubjtu0~fqV^%(4PL>V;YUv_8c&RYK{4=Bh{qDHEuM% z+)DBcI@s=+kE~Clg3<?L&bF<6ivhC#G$KMW$aa&1MEN;=6~6gQzkrn&Eq)d&px5&U zicdjEAyK3N4eR|e4tn+qz#z;)TT4y-U>MQ?^xRyDb?b7BJ7qc*@MoA12a1!6CDWmA zFX35<i(|XV-}P8MB1Ms1HGm2^pjfA|kl5k+qney^RWpZ8VUIF2Dn|sK5x=!uIwR{C z{xQ?hY)WpmQ32b>W`m@w?HbL6=28$hXf{z-oUa)-#F4V4@oOBEGP{}7!=ZklClJ{7 z6Q<W|L_RjZq{JNkvi088)~VYb?8)qw&?Jd$P5x#qTHCADgI_7TxH_W0EI>9Xd~5o% z2DmL{aX>OxW54tA0o5VG5TP9D2f8muDal6sy=%S;|L+g-zq{)zC+>5rBRO8W*j{7h zSeih%gjEkjN}u_RX;`xlaqk2`ut_~0zRw!o^<e4|*L7is*y@Re0>j$6^M*&uSO_NB zFB7NnE+B)}Lfe5VNl66r9|wJ_<{ROq-51s)(%V0GI%C8HTbdGo_=URwiO|CBC9%_l zK<f77!q82VJtLyM$mRJ+imt;BUEcj2qjtYWIUUrSdFG6z=4#2AO~<Xv$;lVZgL96; z>36EvkN66Du~6wos3S)XBrnG<^O&}>E|h&J9CzMNO4CMywPA;Rn^cpP$+zm7-ceup zsk$!qMSmUJ$8o~qW%Y)DNHKc2^Mm#6<WW1J9@GYVg?_W;d1raOd%mo-uxR4BWqA2y zPc&F1W%u0cu>-YQ<X@q|E^XI3UVIo|JnBf-Hzx2nLg4J9Wp$B7NMmS|s;eEP{~OVb z@YfG3SGi$`&=Wf){fKZ`x?vaWeZ$QhK}p|_I7&i=N|yu%*X|$*Z%A+ps)AmA#_l=M z%XMHjoGTJfb91Pq%VtZ0mlAFJ)t~Xez9Sj?MJqqlP-a*Eha_ZobTO&RFV9bxe;wIp z&?u?)Z2fS<!_*W1x$E1jUGM(AYt6Zjm<tfdB)@ER*d8YJ)%Qa2d;BA9Q={6V;K;HX z{&9OXbUw44^S90w02%q*Ii@i*q+n(|Q>;<CI<Qcje8`N1`bd3{#aypqL*2~hXYBP_ z8_P=*eC~Yb7oEqJ`A`!=aSunvmw|z;NT{BRQ(RAxeaX_`R}HN1$E3ps7p?*L-=OAm z=Z%S6ard5gUCtgc%jpca<7qspb=5&s*#aNC>h<B%tJV?N;siy4AHl-3wuq&L^14;G zlcN&gicWITmpe7-1v8RlA$SA%r}EQu{W=2%%TwAw3Z4o9-e)sa3YhcB4dsK%<@s{9 z3Xa0Mb%FAb0zcI|_C)7GFp!i*@9mP)1;Rp*`P!+hB<BfmxSSRZ;>e(Eq);}R_}#8L z7~AuWqD^SYh#Q>2Q~d@VqY-r%T@#nzlD3E*TpU$$A<tQC$A8%Sx^p)XIp*1^?+2({ z70a<?Ccd`kB58{YcM5GF$YhP?D(WVkn+&j09i7u!udHZOwZwm{Gl(ruW(0TWp*D_g zba5cmhr&jDuc#~0m=u>hU*194aL?_GiE2wpENeCZDSLpz<d6tHcm`mz=`l{EhQ_6g zu$dn^T_j8%)uE^2ZNLOO(v*(tck2)HsHVmQNLD}7l5x>q{(VmBT+JlEC_^h(jjEo{ zhI#xxeZUljN|z-K=f*}u8b{PZWy_Mb;DP+4_iTQgy&U0D+0m&;OR20TNCB%?$Od$( zhv~|P2PF2zy;NZ`MgpYn$o_VrR$iZmw{j27zT=)v;`_zYs6nI}pl`uPCTH0|vxXwT zgmZi>s7d);&o~^XhZ*<X6t|Q*f+UE<vs~JUmOx{He-v0p`BP%WAzZe1YWqxitie0J z)d(t7wj}9U{Uf#X2-#d*-OcwIsmUjH+<A|yxyKA?f%g`Zg*60`ByV+P2QF_&$p{EG zR)~4Y8ENB4+Boea5ie`7(vaAZQX1W(DY5WtQh-5bs#W3F>E%Q!w15xpSZjU=uA$|V zi!y!KGanRux<F1vQhT8;Eu4fvmyXpcSyGowBf~rJ=;{6P$`%UcQ6*A)#BzAc{E#ut z7dL5mKH~B{u8K1w-Aq>pOjm6zsj!P49a}+Xpqbce+Nh@vZ24JmkXc)#+Sb_Q#~`Dh z?VIbj90y{@C7H&PD($(jko(r8>H9?*uHHRbHeop3CRThg+HC@Hon&14oId=FvWLpt zA!obY1rwYWFkidP>xPGVo8b0PuzGc$X6ThFRE;L})c%;d>YI1-S0-ZF4c6&%o|l8H zCetl+Y1f*U0tQ1l-`e)WzYnn_uMb5Sc`~ffK@$hokMzAGVoNl@8iJU*z}HJ|8ToQV zbEL<-lTK)o7Q2pqpQ?hhwSX{Mf`R4+|JVHgDD!_z@PFd*zfBXklyoK(J|U|nuO+?Y z=Fmn%(lO;OMKOtJh9hg5x8hw5K|Uf|6f=Q9QA(o({hSH7!03&gUnll$)(Ty522smn z%b~H9Iq2kDk9dPSpmAv51`KW^jh~BDodD3P+|{T=cz;6Krr^EVatK&#gC>!eF&E+- zYWUDo5r?+-TXf;Ome7V=3-6^qA&uz4PqmC|u7L$Kc49U;+Ju8`LLVtUdO$h7Ul${v zxqUy<5J(B<*#;SowpksAJN1^YvrR{rjdnH>GgYM<i}VzLW0EbP+M(x_G@FeBTa>NV zT2LEHY_NI))kg0++O2BP;zq+lne^7)!Z4@B+%4wFa8+%@qDC8Eunp?=Jd1<_cFsIv z*eW8C;(+d9Vo{bLH=%EBOi<y~wjXkkOQ@K<pB6^T3ezGz#sZ{woxQ@wGKGPX%haiN zu09>zbyg!Ta}ECaqQX_61{$$mUCHx2vvuzx37+alNm9HogzWMAx=f{0ACd_`K_CO` zL|_4bshDX+s3`-D6tCW#7BS~Ne_dU|r;>9mGC3rBVs}oB%OH_s_xrkzSux1skjR9k z_TH>+J~h8#s%Hc`*ASS$dQ&Kci<3V=fZ&U)cT*zIez&D*jxwKa(*HXy085Wg1Ew~_ z)F9yUlEi?mCtTu3i{{nYtM)gUph(DGMGkQp$rT5M(&PY@P@$+PbS0Jt+@zA0_#kH7 zQ8r=8(HHDu8U$GYyQAP**v|V@({2kfcqu%-m|EztXs5@DN|1~1<BZ7hV&&WH4C@nh z{ql9LTzFaIfs8{JVlu|tL8O5Yfs3TWL3rByI7*_u(z&G*>`lLMD();)VbU<k3g5qv z5%{yB#v|lJRD!J!p4KUsS?UKbvnm^=mDkfZXk8!iYN_02YkF`isoM;>7jdg3X)HUJ zA5~Y<<-3BeB5~ig8E26Bnt@3XAal?*g(laP#<4OIF1Qv`z;_r6^Bpx3+^O~vRw(P0 zTEMF5SRYCnGjvoweB8$LAlSl1XpmU8sAPRN@*LlkNye<0hB%YgBN!3;!Gsg9;!b%t zq7-#w@puhbyIYUO^a0SLHSVPog9mc*Be`*{It#QD>qFm`n_f|zGdElr*z)F9-o?xQ z(z^xk<gWGTP97cD>MY4>t?TBM+G9>@(bN}Cd*9NbI}uJ#j!p?b=EHLvf-Nc^s<~MN z(MV_DunOrRFH6=$g{E`s-J;!9Y^&#BuoEHGP%FUB=W?Q-=GAXG!uWl1=CqNE9mmog z0~;;MfguAW#}dLb**-5BzbUeHX8$}yJUcdMuTlM@`2tj~AKG7Xtv{{Ttvbu;&qMeP zZGo;n@i0&8tYU0IO-D++aenEmKM!G9U^139xZzxVrS!MYZ${)jy8h=OS^~_g{`_V| z!|y&3<;x+;=WhS`&D8tPefaYb|KEw%?khk}?LRIpV3JlsyL&`oEjKH9;;nM+*ymKb z3cj-;S(lmzlKXkmdRzq=(CC~8R>m^p&y|dsB$8w6wnTCedQ_7`^-aDRI0Z`8b{8;C zJ79Qi24+IE4ibYbQ5`K&9ec^B9jpLZ1;p;}-<%D2{c()1&S~+HquP^4Rmw)F&Xq$7 zMwKCx*Vl!L<vv`zdMh#yf%+zi1wWV~m^i)G%4RKC{%Ez(BodX$70+R;maMBqW5HI7 zV=$^@qBemC4!zLBS5;K8dL<FgG>Fm3ZC<sbjI@>rii?g7ZeY@(-kREgqgtctYcCk~ zChm0Mx!O&((Ay3?3mXp@TQRN6dQ>&@Orzk6;ix*JFe=2+)O9K3X~y7#4iUG!k&i$g z;x5^exweEC;hB+zyL~IAZ)kVf;c*GhbHEGrOG;miJ0wNK^%k;y&Kc3<Ap7A%=FV<T zgpbBgPki{tU7aEGbN`F(wm<4k|6B{;fA3TNPd%B#Qcs1)jg~7bDUC!>;Kfc-Y&nQX zzGIGM>_k2HO_SoKtz2NuZMtxy(rK}Jy$hl&>i)SB3r9VBey(z}qtrIsw2(Ai6dW8Q zg!VODu<S60FxCTnIX{&LCTsIzPi4NoVU@wtaty~WMhJvkvcHyN52O_F?_-1Oc2Yxq zp&3+Fzmi^)H!n%?bAz=T%j`>kRT@9nLQdr$&WD^vn!d~V8rRgqOOi7VeWqM+7((5j zXgXTourWtDpmFR*9c9m)KC(LC2iuAbTIN2!uvZqAHfxbcjJ3t_baw^C?QO*UBiP=X z9_oAt3cdAa+krAd(}X}!HyV5#^gb)#)tR+Nul09Bz{u@jws<KQzKNJAqK8c&vD#dB zCEFReK(*i$!zp^AAbK|3fs=P|<pDGXJ|TK*JSlcg-w(kvNePE-{eABO$+0c``vI+I zWgW(t7ZaJbw2}Nx?2S&2nmGHQ#nAKVet@P9U^ujx7Z%jmf8W2YqU`8O$^56D0KLv` zfBhiN*@^J-K>q$OdJ6#5akAHLNOgtu;sra~sWDZ0TYWr7ll_nltPcjXUy;E9l8)A* zg03cDeT~o>G4J0?16C8yf&|<WOPHGA=JX`m>lReriX4}34S0QDb~^4CO!e`M_BT}g zq)gl3vONO_vCnY?mW=dro5k)tz%d*d5TRSJg{+MbAWJOE0ZspZFZBOzhJ+~}BJvy{ zz3wer4C2NY%dOC*6TN1dA?;J*7KGhOTKeg<(6m&+sdO}C={IHUT)Lg%7>uMk->x4Q zd@mEC|9aGJ5&Y&XRQLmt1cP(N9eEy>Wp+GwBut}64vB$fz=0j!LY=-JtgKe%56Bga z#M6S**>`b%eM)$T$%C~ZF0FB$uGejib`q>Q!bI7zA9E+pG-+mFo&3*xTv%CZ>nX-Z zP5kb(nCuz!5OiXI{k+W0o*;L7oG<(vc0gws8-WYzT*#P6T&W*@pk<?;#I14}vv}R2 zb-fJ{+rpO)e+(_`=IjoMVuNw$d^9fKV=2QvHACa2?z6;onaVg=vh8ti>d*mJCUL`u zpa%|a?Q#r#a!@<e#iKEBkSUkbA5y5Mu}~*|&UJQXzy;|9t|+jh>)mUU)|_U;PF3nz zSwYQQ%^YeN@Uvabc!aPpdfTmGD2?gZN96&oF`wUkWG1NHBI)}oouI_4_cBedh}D6; zK7WI-s}R}~|Ld~kCHCCB?)x3)A-yXmd-4#pe>ldd;)gRLPwtyhr;@|5%g+`9kK14i zeuvMi;Fu)X`<_o_T&t@*9}b>9HO@)OUv&J!sm8S~;gC8$-VAJ65C4$aJfd$uS^hh8 z|Ae6#Ip<d$Z|gV@6#QP9->vZ|X~q2AAr~rZw`w614*AFr@BT@gepp*x3-G&7<p$r~ ztufF(fMb>atbWNa>Vn~I<|P9{^E_6j4=U3p(~KEl^pJrjSHlEELfF8_!L3&99@OZ< zG~K&E#R%Vdx_bm>H=`Kmq)J>!U>50Nf;&#@V1-Hz34JP)%o&`EMOAx`GPn(4-sE7F zsqy@5tYJ>bBdd;y0`tyw<d+worpxE7@!puHvBZU}LFm&rv2G9Tqkva8RjE?0->p6* z$x?|?{%x##o%!`BgZieky6ki-#kmJOc=dKf@yv8F?Re=Mg3qYAeIJZ6zO)VFlMm^; zQr6+fpslkpxT9`sr7)KebkvBue-Fj94x5=TJYc?jCYGqijgBVa#&#=WR&YxTVAG=H zb1VhrkncPbGb+(0viu);C|ul3N%nR6b-*`!EbJ3&yg(=o&Mh8)AJGPY;MLDeWcc+& z)7SEe$rZBI&wzs5tZv8^WnF^+AQTlKD^^qd;I!PU>v)j`xMTsRtP%KC<xH+qS$i)K z!J<hh-mpu7@2xA*$+@CJ;1f55?wTvfxlTV|y&9e3Ln`Tyhb~yn)?dg59suCZ>kWr1 z+cG{xv>pFFjPd{N0TM-2+I^9O!S^p?ANiTT&?z*HEfk%{ueg?gAMOfFnj9`6U3sJz ztTQ>)B*@Fs=vBX%2&4!0B?9M@aEKQTtcD&$L<cCU*uZhxxDL=Bld%V>KZw#Mf{zne zI7K~90@lwvKGUwj7uZTT9Uiii*^h~B^ISpHfA=yne!Li_+6%-^kAWD0-a-rBF#9Cw zBJn}&{Uzie;zFx$d`r*HlT^4ZuW`OAqw1VMb^iSH&a}0Ki-w5pP!Hja9#C4)UJ|?` z@Gdg@KD<x9A$Cy{m)i+!<2i_e73b^my0X3|!bI_udbOq{{|vpReC56ewz1BwKoZqG zp7DHu9~3$g^20@>K=pel&rM^-u{_yDAIP-%K||0AoxIf}rx-f;ApXKVmpd(&EoE2( z8y!bZCh;EazIFAAszrdnfPwoyPUtUXjqpmb7xRq<mw>1w5K5`xdIR>aNH7{a$`l<M zCleBDC`%&q8UhejU*;a6-oeYJRzu~$rJKLr6oN<`F*<O4&JoTjBojodVRep6h89BY zJHEsquTIu%rWUur#ikZtp$7vN{;CiDlQSN>uk+2S>fn)k?Sg$uT;5IsgPj6y{Jjgd zT<6l0GAhYlA*1-xxIP}~^XVOWKI^iNOsG}U`(?nwE*wr&wcwmsmM_PRTtu*XR=xJ0 zA`IN~lG<eCcYFcxBnI2BA)2YoYt7Fi*rCGDk5Mzogi@95gLO=Of|hTa4ZmP6B+%?w z7BBqBvDLDQAmNR?B=I}072IhP3overxwrdV!tEYelrgu(V^Yi9`=T<7C**r1+Uf@) z3xfr!v0)<9UF%(5gLh@e`Bfy5kQ38cNg^eeaA0Q;)V}X_UfOzINy-RjVmi|f8+6AI zVFjU#=C?H4LKY5Ic^^GQLMx8LnMLFb48h=Ivl=5o<*wWPZMF6#Pj^Np<R77`XaLFG zt$YPb-D~~(3ZEc12^?cvR=w!33|eSd+g6XJ1Wxts>9sVS0M=f@^bLKmaC2TW6AiKK z4~n5mPR56-=N#Rhkv~2iq5<UI6t52*+T$6OV^~LhQnlWcG3A;DV{feN4Og{imUGg^ zS1PRfde(-V(LvZN;D=)pFuL4tY4Zc2eqIkkV}b*u_P?=E?AqXy2OSJr1t}O(T7KLq zC?ik$(qZb!rQeeM3d%(j=Yf{`E<94-PoN{39S<=bLt0vFkKSm(b6NiO;2%^kXQz41 zA>sCrOy_o6iRbGsv+iFECLJ;SmKLE3&z;Od<wa=RIhwMUnNn$G*-v?<%snf!*I7Dw z@ZE7ZZ4iiSAdglj6$+_Wo)Dkjzt~#Nn2V3+>9d+}eFPhM)9>ycwC*$v{J%&0{{__& zBl%}C1ht8P-d}azIKpD#(9j^fm21hE!PE&5H7XtklnogT(QXG-)*rLzxGkSy6W}_% ze_1|5yKK&E;dH0y)c7GUdXJh#$EjkWj=D;=Wj`lg5aAUh)r-*p^4Xoe7t)zt=2(SA z%t68)MsYA2wX&3OA?U7N)BGszeZQ8tBz1P^F@Hg=8Pbs~i0L!(irU@zF6`vu^RpVK zA^`tKvX-ST<^f7uWAc_Ys+=wQrcFg-`3DW`0uW<<wDJQL=bfI4{D0Vc^Qb1ztx<gS zvzA&!S~-@g45!Bm?Lk2sB6D)At+Yj;$`ND=jtK%Xg%BXqsVGQMs8T_uq)GuP5Y)&J zAW0Drkqjb`Fo!XLge1UA5;ETxztekrzjg0#t>3!$uHScmhd;>5oA=rK*?YhHdDzdM zUT@JwyAKbi4^8*2;(p@&x#1)4gC2=sKJ+xW?f4vzAbvQ%a@vV9{aE)B>=d&AS_(Zy zm3iciARazU`$>Se<Y=VGCzV3HyjbAA^3V)ZtR5z4D=PzMx+?4jFHK%hFBTQTa;)+* zzAH-4pQw)71lknDrbcWojm<sc|J`O8Ww=pv0O&9J$SEQ-3?G_&wu^f@Ak&z5L%fvg za!B&<<6sg#`I-CDH}XTJ5!#l!ysumu3MlCkAIF=X`23FK9T{hf((*cj?2S(zt@_!B zs^3A3vV*EUyul7Tb?Uv{+-%4biMVt2whL4IC+TFU?+?BCe5(7N8Qas%gBK$4WtIs< z8{;{f_=|(UBmF7P&MFOqcMhihma^aJd&40on<2aF=&9g{p_9@U^>2<8{p^e$b52|< zI7I@h{^<$ggA+x>;|*X-Qea@<AlOqZDQ{MT>-EfEInB#TB7Nq<_T|>w+yh!%L?`3t zaJEb|?L%%-q5^$S;nUxBSg#LV%(?D+bC+{erg81xC^R$R8N;%Db_&tsT}}!QOgSnT z6uWx{<$i@d;B%2i68koeRKdQ8^hMcU$Jv$B;O+#7P*cll*vIcp;$Ig$<|Y%qA8-SD zinGH&f8yfDr3Nqfubd;w4<w$Rx=+V}g)&3OVyOm9Mk3fg4#=Z9x94FBrRHVKVmQ}( z@O-hgpXJDsP;>H1Q%(MNg8mWTX|k_)$udC5#u_CG=?zSB8D<(&M~jG>TI1-GME5`J zYd@3m0%_vr$I$!<*IM(qu=mv7o+whH7P;ZMkMgZ6n5{E!xKKW?{kQ4_Q9i`7@r<bZ z^|2#5Eb;H9S0wueF)6B(E#iI;T_#9*IZLbaJYQ~uiUd7O2L#q2gQT+bhuxpM6xux* zVF4ARaY6R?sTH*RXFmDd5qpqwg?>mV_&_@6E`26FgQ7Ek0~wrUA3Io>{&?+2j<MW+ z2wAFq7h_va_>(+6g=+*U$BP?`%)B#>J)zc!9?w4IR**q^lwHhYc5Y>MoJyg8cw}tQ z_n~xQsUneAfmWG;lzWksYD|}>2e)<ElOIZT0U0#91K;IdLi{IxG;ZgKqTM5YKA>b@ z5f*Gp>>tiecKJnpw1sfvQaNS))ON6cs)bU_y!O45SycM*<ZGEHrG;f_lRX5Z#5tlF zQC-6Rz{xkT=kE<htp~vl>|IE+^cHpe;7A!hNUzjX-%;|m*gLnJx8Rv?35@cNa+$lN z@d=b?ygK&1zyk(x13m+f-H<>q+ikipIqJ!t5h00O{J7K6AN#4t-#B~!%+Er!h9>;n z4y+OvD);cFFEAWGBIGc#FU%aihTfKGcKn3@%n!Zi%C}@)2P+b7Zl3w@gz6C3-|M%< z!0ic_cbv2NHr05_Lit1=$A-S#CisVoP`uLkmfQv(YLVpnn!BK1^x!+3S;Z51y-~l0 z&KxrH7~0nP9yaPR7*4&GA49hs(o7+)(G^L2hlD{FMN$p-u-eNcQhyxjx;{}EfKD~8 zMJR<tQ_GQP(Y+0WG3M{4P_vZc3Rxg;BX#dF_UX6yE01Dq&_d1Hg0b|pU-_%o&;sFx zhi9_4@&1`k!5tmB!dEQ}dvcJ2ya+7rN!{=cVe#-Q!G3BA7$}c)aa{sX2#=b9Xdfk* zl4*(SQ4d5j=34(!<qJB3gweK-tIj}v*hoUnM)gEbtY;)`%mw)V8b?Bv-R4xs4!@ag zcm3Wd7r7V3Zh{2B{K}7j@4`y>eXd)4KdRIDjEyYmTl^1Ve}Gni-T@dXE%he<R)e*= zJTM<d`sJm{iwGX0spmG_PdL=mcs!#;fd_#&x&xTeC8mrq@@AqHgKL-zoqA(&BNy8( z%(w0{{>>Q}n1?z&ayZP5i5SPie6;%8e;re-?;gRoW^MSZmdg8ESClhM00eSV&;~El zbWLicT1crgR0|=jAk|fqd|o&Dk5Zd%G8#^=D4Uhz7_;>3ZuAKzn4hc!TOvQIJZfL( zzIJD8&+C2Yxq;6~GlSKqNjvIZW{_<P$uk=7XE`)8cY;qKw_aRxAHK4)2lrd2^8`uM z^;U)TVUKBj-ra$(rHyk%{0|wvbPQT|*6!!ZVVp-`i)GBEnhs9|M(1(vNQO_r$yvV6 zdD`z@%r)JanOp8Qf8(?#zP(@kVHA*IIXyR?=RWlWAw9f)qwi=W4;?k0>ArT`HfefY zpPfXoYuFV~W^;Z~3b+diB5M&;QZb$0y?k+Z;*IHds~uShNiT5u`?pgMY_WT+Hp`qX zv{8Rt`|*y<@lON1acS%=-$BRCly<XiyLh;yC_nIDPfVJ>Sh#StiT3Rn%Q87WsBizo zbgolWg_h^}bv_s^X<cso%XRPPSf{*(N-FCXl3Eb^Q^|&6UapURgcL=4If#S3qrxXh zdpQw~f={6vuE>F~{<9o5*s73QpT=xzH61CT2T)JO@WH29-T0uR1XS*OW#KFMD;U!i zS9Ezq#UPktq6>`uDiaFv9XssNJfj(v7{{VTp7i52p`fx*_&>Z8i_B}fkR0C)G!7Y> z``MV}Tc>CnZp->z7JRnNm7clrAH=b>x`c{i>D-=5<c3a!Iqj({_886UrSIYig4M#~ z5J4~WTh4|z^=Yu{83_8RZ2{Ve+)yw7uZ)5E`=5icf)SF|Hj(=+Ym0>;@01C1Uc20Q z;6%hb^pj<2M&sS;o;#JqiwxwT)5=K;IBRwAKxhxxy=4t-SmKi3F=f@+kwNSYA(@;y zW-cCld_c3bH5<|8hfh8ev#`zC{0MlmT_rwyfwPF<?|Tfa_?T6Z*W;mPKHcXm(3W!- z7pIkSuWZC%+IAOQ=gB~e^BM0}1RJGxF{{Td;-d$x%Ive!cj-Fcu`_gSsX%^~6&Qc9 zn1}1Q<lLQ?^wF*phnX=q7<na66Mx&~qOsZO5NHe39KV-^&uFR4vYVMHuqs4vtKjX7 z@@R16w$6Rp@RoD!^oLPCq02-UZc)QgxE|V~J_--je&5k|X8oLgc5d-jB}LvL?mL4& zr!7ujwta3t1fhgy3<NgrNgNN1^Dl!XGjC4!-s$vwC%+8rD1E+z-@CZQ_~|=Epc8q! zokysJsQYSt!GM|m<aTFsYw1Vc$xrsMbGL>&R$H!Dd=&AaGyibf+(qa;YxAan0Q+U% z!z~9Q>Mkt5=#4q#@?l(g8Eh*5d}3(JnVzZJ1w&^M2ZlX82*25PPd!O|oY%3>v9_cA z%p**)_8;&cIxbD0x6Sko2+mA@d{#QQ_7>?+nSIZ?HwpXSC9zv33d3vkwr%h2x3z~% zrrs@a_h!gD{0ebjheqC-7)dgtvM;;t*|ojs^VmZ<eCrwNob(G;?#j`yVVm-ZLw->= z+U_)%8=Rk;T|S3SN$xm6_*nie(|N7!Bl};jbNYL?($=oGIB8m6DbC}6{P2jcqc!{W zCX!8=Z0gD8+WA-83RE2<xv+b8+xIvB`~ErcS8KUYqpM!@!M!k>zsguG)+rjmXc>q2 zJZ+d(8R%R)yHr19U-A02Y$oj&1j1&!7}A?N^wiGROIi>DheAYN%9)=_dTXxtE14JY zKT_~Ns{blzrSf2Y953x|o}$?9WzRm{0b+83iW3+wLNdG&Y_l2C_0No0KGj3$@zZkh zVre`4-77G9oo!DDVjS8FrHtz{gKQ#W(i{YbnLeHh^xK_SwqHCyXJ{*}3IX%b@qaz( zm{+BonG@S@>+`=^=&R_wL|iPc#IDypUosTr8hiDNW0uv3?WH{(b5GWIWUQ)f7iVo( z=iuvlyr-Lbt^F#a3Z~&ZP=;E&T+7V`6c&1<Ay_vGWYvJ7=9d#nirqj6*{!U#t9E?R zWYD<@*}NF;WZb!@$&z3?!~`)VC@AS!BKjR{)70R8#5`ByC03NN)U?~EPx>HGbx3l7 zI<Dii?5|id3(%K~72c$D%QIpF;9=>Ln*glDU+?FRo^~EjH^Klix)d@#&-pMQa^|$0 zZ7O>M;G%e|R_MVn6{_RE|M#IDB(Z+p<_sY|!*oy)*Ab19fzPgtg*GPdsDrtIBe6|q zpVCtAnq#>_50ZyjFr{>o)aMm`Xf(9#<@Gn@m2Iiz`72oS<p)2K)kV%fD+jRLDDL+| z;wrUpmHXk%R6aF%dV>`g@oy6JfG!~&Wq#Z%HiVui)|UfC=(9@tqM^B+wzZ<Xu{NRw zZRBeDJRWJs*NowlBUk@VlL_Tn*riTxO!Ts5Y`)4l=|jS!5b0&0hmuz2-snB&;Al^z zaxV#)PbciH|Gu}Zk)xR%3f)&V{{cZ2dQ{2T?`u8DT8>$0BkvH{jferYNt@8ZXFek- zPno0SR4(JU1(azn7`8ZsPvNgs_#wD<GXp}xi=4J>n-k8B!Ma|KHoCO5b^UrQQFWt- z#TZ=^9*(6L&%(a`@p-m{SYC?9ed2b(CXO_!KeS{wqO&HfGNLnyKQ{S3wFM-ejX`6N znO+TPbC&57vo9ewuzTGN7slDO78HYCY*(6)Kj~Yb^l$5nx=wPI6&RU8-j+~p4py^% z#><5f=0@M$ELb|+xEkZ>QjI;-%D+~jE6kNQr!#9B(>~$CVkOIvYSm?;_IZA`VX0rw zuJJKIiq(?cJWWa-+2OHAfGw<qTSF*OjHX>$d1M(d5o8MO3pcC{S+NGD6?(<0_DdAK zr%MYKpl^=bl*^_bY_5;Z{os%LB*fbv$JTN&R}>+L_JUIN&%WMu{N+w)72p1L)e$;( zcJ0Rm3(L`;;c=A|y6Eyyj&i{r*SJ2Yw13A@=$SE0r*dHQ;=nQ}T0hry6xtHKgmO;e zg)n0?cxD2i=c@}!SXs+qyU^)n>lH_1p@8Cm8ORi{E3=x^^`xf?QT}^&H?&#nVx(+7 zQ&Z%^wa;WWnO-X=vnywJ`3Ltf6gGAaZiYMNsK#Jt^-h2B;HzI?IMdGBla7U%oZ4*d z+p_tewR!2YJ5juflZ-v1)XHr|mE?EqPsDRiFwxw18`f6~g0l0ou&Pj3#e!`hhh2$O zz3*E}DAdX9Qe4Y%A%ynsL!-po`?+vL%6a<FjZ#ubfmRjklQ8UI@a%Cc!{JU@`LOue ziXo4T^rYB3(tAk$t9m)5(BW$_<mL3`<(UB!+L`@)JEw}(5S@X^Lm<XW<~*y4p((YB z{EbnQ^UJPjD~n)jzoFu!fMBtshqN~|-e2Mg+c2-tMsI(L(8JqNtkG$h>n9`(+^X~C zTl9B0D$w>iz<KW7UMkkZBov_qqdkp}JpqZ;BEkaAyqbX+3*nT;NMa_iMR-$j7wQP0 zZ>K3@#avCe$$0?sxnK%3#ZXIx65@02K$-oON9eWH8NPS@eZY3V3h`nxCcyxfYm-h{ zSrY5T7GAzW`hZEiyEl%^z8MdN1C`reZ#^jVRr^sdl!PAZaZAEABjUwFh6l2=kYiY_ zsVqeFTH1RcykInsrzer6<ZJ@37G+8)q%pzL`_wpLhUc({mRnDzI6_yZ1R0ay{N-K- z5-g#ZQ&8MrFG4Y0kGB3iuUjDYVnDVQ)*a#%{61NGYt&O)Ma)8gi2}Tg$nYt?6nkoH zrP#znPXLb;>B=PvH<^#EGZW^?!a+HJWDfzrFAjG4Fy7wOJSMu@#1kK+rGE}-9n!Ol z9KN=GinpI|q32yjTG$G^WD^<m@(^`y(`=;0#G(m}DE4b`q{aEic)<WuIu&Q9@@XI& z212>oJmu8bV}f+?ta!nzIfF<Z?8=Oirgw7tvGO&Orv1{9K;-e}5{l;a+lyBV6&1Su zg2SA;`?IAjjBuA`Ktk+KZLhr#^2>EXFDfq<)_-%Q2W5owFuYEtc!);w><bk>w!?ch zCHUAb*$~9RJYGRb+VUIC({js=a7r^<)XQE71|U%-e~x^$N=RY-yI$d~nz7RPRK$eK zXdV`t0`i-F$(ccBKY`ZB*4ZX8U7kLyZqHB!qCBKt{LF+NReg14d4*zJqDlYnA2v`p z;$6IZB8DjPv--t6jF~Slis*5rW#uKzsNxyp+*;jNV=L4wkYA4mcBP;ow8^2-*2FqO zq8t?J;7WBMj0Uu6^`cjFxqW^p&+T4!CxUHd{}h?ef4P<BZQlQ?cYmOZ%Z}H5IYVwP zZl-tLeeTQ(baSJ%&=l7kz$Lb_)Pva%%-kniTSWG_#&n~pz1VnFQ37RQMRop$Wmvhn zBiE<00q4hs?Ez~gvw81jTVwrOc4zC9ua^baPfs1+<HQ(mI$}R)fA;veNB49_V->nR z+RHjXZ-H{g(Bb%*C0&#|<@;2TSDu5p+Xe54^i*erH}f*ezei=2-mngaFe#NJRg8#u zdiFQq`<ilXV(0*+$4kc@8}Qoq)V8@wr)EkY@EF(o?%;f-(k1KD`t-V5)t<(V_7p8~ zw2yI=K4f?Sl?+6v)(1@gJnN`=+DJLWoZ-vUVNL9NCrxFSsTu$f>-8RRl8Sdny<^R$ zT+JgQk%Nk2Q3+f@0gN6Bih(xA*y7_WHqa==yOp>qx`?L}x0AR!l<7da;%~hEbkh<F zdE7wWz_tMZ7)RiKlU}dTDU;x<Vv0|)P$jX(4FC}8KjAc{ATY(BAk$`>s_tgW3UHRJ z@ZRvCYE?5>TacEL--~g^DeKK03#(-|JE|NMd36heqs?M=&9(qb<s<0RACWU`$9M}~ zVvwHz>dI-%F3IU%==W&6Rf}(_JKkCiL=EZU@ARR*Evw8YoDcg{u##s^8Di$N1?S&& z9v31muLe??mzlJln*{g9TTiq0A<`Ae>p3gY&bqag?0};hfhuhJ$+Nx@x7Tl*oQebz zyrMvg$e4P-dGCn8P6eT~o;JxpxaEm^;r7_5O17H6kLaIntzwzxDiWMW^D25{SZ=^{ zSBJ{4jtiS)P&9MQ%hVaTwYqg?Ze4f6DZv94lu3E$3$#3+Q{J0Q>Ay&ULK9RCf|~rR zQ5Qh%fs_uFB_j8$B0nKZ*(RUc<dYOHl=EM4qcyomZh-@Rs6-n*=$ZvLz-ghJZK&Y$ z!jKs{S1+_$+^wXeMGu}-m$ycXyf5Dgudm5J?*B)Wg#DW+H)Z*MR*6iMVYu3GMRT*h z1L{ChYbu&W*lQd5?nDIw+bfFIZL7caI|h(QfBQ8g4M%bxE3+vpSx&C?iH})c1Yb6a zvRt$Ro)nFJT#gW?^ncRe@^=U$?bnLV+)R;hbkcX=v7wY8v}T=-Pqvi`eUjlpK(^NU zl~)_YSd>V+A6U|JTzfNhfH%lHjYoH)g>KG*GUt{*M<%bV^;FloM@Yr6$GSV2ky6VO z${6sUNUen;$~{b7zk_ndQk$dyd30gWjOH27FxJR?`~|=b3NAKMj4fG?97s}Jex_9K zoFu$9qaknM@F<~%o&aVA_XjX%`3pt(LL9-DVvK~VC4+BkdNCFgb6vE;DEXB}OGoTB zMA2eLILw`%Hw2W^MYH?4Fh7E-7ei>N>&4WO6>O-zOOh&7LW3Jjp0N-KowK`iVvsoS z6<E1wA|In}xTyrZn+1pIc|LG5*c^Ov_w3%ky9ksi1=2GF^@vP4wQ)JQacQ8UfQ)5} zUyEWBT0!JY-ID4LmqY<A-Dmxsp}t19i8;?;At4p_hf9`pq}>jmDVZNF1?5|-fVDCH za4A&AAuO3kmB})HH;@x7W#W&Qii{%-X2PE{=&GvHh#pBBFaD30Sf5fsX2N%j2;6`_ z^@4H&)%?fHHZn)r;r0+gWh^=f9&6>au|Hl$@<e~&Z<F0WJkHIh`v>jaROUY{*8jWK zZrqFS!hY`s@Sk<t3h<8AV0e?#jv|E3!2}x%N}fV1&i4;0A{pOrB&2OUXc*gT?XNmt zvKx3EWXqIh2wO$60tNhM3k4-?^k*Yl7)F#J{nI>P^|!Ojr3O;<Vr>5<3O;t-(N_?$ zzR-CILsgddsV6)=9+GD2x?*+$-JE+>zzAyPiRH^naK;^JN%WHkK>}!U$6Nsoc{3ZU zAwmDXj6GR#w$O5ma7nxcKd`^YMQMC=+P^)+1);oSj;t{kQT7m`7rKs;Y<>-n-_@{I zpIc=2zL`d9UQs<w|03gIyf%xs%JOFGIK+&`{5=FPD$+*(bzt9%EiV_l6HfbW2`Xh6 znJ993PtEn|w!A1oQ(>S0LlBQuDAOVYSkoNqAm&kHpgSWhH?|=Gm*L*X;lcW|O7Sz* zx$rW~#s%4kG6E50fE(ojVM%i}XhdIzek#^@@r2&iVohmaKTL)1sEH$TJw`WzN(tm# zK+ma;w#PB2{(b~5wvnY9xqut5JKZP>dYbPOmH5|E3OY~aO#*?%Gu|ZNv(X;1i~C&; z&%+nD5t!njlgKR1pJW$!)@3h6;<5@Ko)844yYqzjA5@RU<^h)gG`F9;5x)Wn6DPpF z(hUP!tDk5*#L+we3~r@6gERhrNv?@2b`dgYhk4y#(e;qM=X1DU{u0W5e2$_DF`Gp} zdm8Bc>Amxr5=S>>y_6s-fGVf&be3L_YFv>D`+Rn>we#23aZ&Ws7Svc8PhtZf)`|vQ ztzFcElNm3Xs~Hh`eEj&@dkro=w<2cJ0}3iKIZ7fQOI4>#*Cnn$pVN^S_J)(HWvw!p zgK17u8Yb(U&J+g6E+RS2X?J6}uzRE|FOA$kx6i)ebvEEjt*0gYa)k?{FQua>L*q9u zw>pgH1v22<MSZkbJb7-^D~Uh1(1uMpKU_wr@L_d@%4N0$(Lp(0p;+w~>3B~pN27A! zNvit0XkwS}&?vr%Iz57^HKxe=p=hDcoP(S0l|OU#w22Gc`^X=`Hs$b0S`t@O)&}}J z-UJubymXThfRlJU3II5=tO?;_u|lK45shRD>&@3OlPyzAKTM)5tn1ZkvF(ib3eU`K zMX&eSfD-a(1>%pT?W9Tcf)r0l!B4U%kc&tk`|+-5E}$-s6y3&<S!x@tCoiZ6bk&u8 z43TQ49FC*OEZ)-R`E`JvA$}!DCwszpLh<(EP!RRu5<pKt7NuVVL#001OfE3Evf+<= z!OnoS<n)(`6_7UeKB+fJ;jxAxSLg8nwZ}0eAL#JEDe@*!MlOM`JJ8_3cJP2V1`p1% z`*RxEGXA_PI62!Hc;U$t;&u?q#Wl0wEZiT9mH0%f3J;zTm0Ik}Pd9F`;T>p85i8JH z>^gB~=|>!Ja$2AF6ObG7u_$r6WF4I4Kd`8TuV~N;Mc^Z*2<<<CPrYMugqb8eMg@cx zNBRh<rza}UEZ~3;uVN${b%;BD<zd74mcd_+<Ys$9ZN~<{C|?Y%NO;b5ai8$9akb;X z=+8C*#A<(pzbZ5bn;{Grq%`#QG=RIB{|-3%{6kho(rV~{qo!`W$naIWbI@KgrOch4 zDEqkTmdHMQV!<9_xG*?rc&p$;w^ULiO#fFwnW=g#G3FdvMRSpLEzFh=(I*`RC3AW| zXPnyCY%%qoHhMnfFsWo0Oy(A=H0MUl)J?7R417XSJi)mB$a25ey>HkqWR-WF6zi4W zvl6!A`eV}t-IU~Jmcmn))2|GhPpU7~-L0ZeR;NDKFDF*Y#_M7UDWM|Tv*sD}=?do? zegyuaiM)v0qlo2oF~$4{lBMi6qhtv;2`MzEbhFg$t@gI<KS&=q{AAaXC%fB3Aqb!X zHCXunO`RF_f{xmWae;BZatyXqp0e)pCqZ2yLX6fw&Jxz5G8a7dIVkK>b<{<dO4oM| ze&zqEPonLZ(>!IEDJ}6bz#*T*qmenBj|7hig6RxCz9cuG&Q4P4e52GD6OCj_*Gh-& z@QE^O>IGaFGe?#g+J8i_vj1Uj$#)r3o=qVy;UF9ot0f^X5?`@*mL7gXkFrkVYF&QD zXV5S5eK*6<D>h!R==RuWeQMMtqDS=<Z#8B{dvJw1>-U{C^#0m!n7D?YNauCbSkNoT zexd)lc>j?L;JC<aX(({n+4FJ6!=lzd$7^fv7i*{k3FmRk9gR_-ATDbhnk<oDjYaen z{p=j`#p3tUVZ>*qE>)xe%tk1_tvL$ui+c`^Yuh29i3TE4&MUuj!5kf53poY>BCA26 zOl8KhKw%85`p4O`e`uoTxg3ogy!LvF;4$NrF-O)$1-;i`n}$qe;qc8Q+cB&y6~(Eh zFLX)nBP3T_78|mVqP755j;zB>K%Dk$s-7<$hTYqB1#KI3we{h)O7Pj>D)m-l*htWU zj5;nd;~aRrd)Bi_;Tgdz2}Jkj3>{+(ZcQ49vf!|><wUEoOiQZa873~U&+ReckkhEh zlleC0q}8{Upe(-CI5sI-MFA$>O}1r8=y}L<Oq>wYLWWXA53FjlGiuCds#tqUiWQy) zhbA-o2;Ft*Fu5?{yzXr9Qx5o6T*>dsvl<A(amtO9-Np8<v@YaLDX0jEKCzn$w5dS< z+Z8BZb-z>-+5Xy1pp!!k3sc{Yc_^I%;^#k*kEwr7jX|~pE0HOa_H9kg`awln>(3;a zpp0<H&m<DVT180C&5Fn**=+)!#F~yWO0K%n@{p@*wWCjqwPpFLAF3`8r)BBa`og-? z#DTKY%he7z!{W2A#*$hP+OIAUfcz>zHi1L1o-uQxb{Rk5?Oj;U!Nwx%k5=8aG2EQM z0Z%325OseOQJr0#@-(Fu{*Np54BTRdM}(^;O2-lBCx~Ur%mQmtXOYs9gjj#>MVSlH zCPq5#KrVh`#T92wuaD(sV#S|8Lt`fUb)z;e1kJP1?5J~3WfP4f)eg1L2_f;i;w4W> zk?@kV)078VFT<dwZW`^p`WH*}7?glj24S@<-h8nM%v#cTZTQ|n%Yn-iP9#`@W(MMM zP{4%7FsnD-h9nV9o-9(iki}I*iPa5&PM|Tws>cREQzS(8QxNvQ-KL1u3P7jU7<76g zfoOuUNE9Ip%ktSUU6cVHnE%mjo<jKh&p7oMuz^(Z2I;>;|Kaw(BQ*+j;EO7@hPaa` zYq*OST!lnz{*l<q%M|Xc@GixPxl%w-pP5grw<sdjs-xD2o|$pX1sR~-Gbk#SGPH@3 zXPB~*1Df5<d|1oC^f|$BH3k2^Y46_~vQX>nlf=J(I>1b)Kj&6c(K)o4T})jz@02Nz zuS^M|{h&;;C!{V7H6|p_@cmivC!}{=4XE)+=XkrUasqPc*y|t0jyXrK+_%h^jxMdZ z+Ri$>t~+D{!=%$MZbie-+gv$BPf*s}?;{tLBz(QswMgFltG{Ktwu@1eAj`|G(kW7= z(fOehPLKCcK2CDcB)X1ZqbBQbIn)|jVR%904Ci{bc30I;)GLWKp+oyAq~3{os#+6N z5!|5a_-a6z@s6x5zA=PSwg-%4`@>>~Oy!!i9PF^q+Vyg&cEIFw3u0oCN#d^EI~9+3 z_clhsL1XULMwS?G^KZNy)Yt8u)SxY10wrjx1?~e5?~4vVemZ$hQ1d;A0Af<Rer^xB zD!Q08W1Cw31{@%54%-yS|AU5@j*y_<t?`Z3mPVmoSHaA0!?ARFP1(RcW3XC65L{D4 z2vo3=x|{;3K3)hlF7GNT2`y?d4Ide$g0HN|sXuAyRqgDdn+va?LZ4cN?6IK?o{?D1 zW-bbarMhh>)2Q*`H)Y*Hj6F%KBdA49-lX8Pk8OU9!X4)m?A}OnQoUsiUinmF302?L zzF)EQUWmFsBF6CXW!-|+FA6++g`sF&Zf9MtxJ?<RFIr!bh9s$rvRC?um6xgNn7y-B z76IE!n=O%BK_e*Ji2%~7gv3+0sD%Dc<QYOYD!`~VM^(NfRIVN>S+i70v?9uq(oi2f z@uhmT%Vm!;aIK%H)2}QT8KfC|#$5!u9P}WF^)ewm9ic6j8t{d|8|SDXF#5?mu*B7= z+ey5Q4{_UL5_d^8`LS?Wuh*PFaovl-9a<rL^P!0!W}r(=?V+kRz-VA2|HI7%^-{bk zowkG(8+65-vZT+&2HYg;%?B{?2q!-BKfU=%F*0EUkRu9^5J;)V?8QG4bWY8^@;|+K zUr1{+h&fM$<!S}$2>N+%nOc!<B5!<fv7PerG5vqIX(B0v_-d}tTBI4Su}R&3gQR2E zNMUV+SeYX==JK6Bqg$=g$=>EBR&^fdV-=o^M!Md58d=JK$Cr~{wElX<Qullv(>^+| z;Ffe6_-U3gpsVYZmJ)({B%KYaf(mn_Y;~FtGJ=Atk(1*wfiBHI%&+s#m_$iOV=+<5 zq`hq&!XqPpYHBW3ceGy1bD;NPB2~7{Fx>&=Bf8%qSN&DvS4Fs&E)NHM$KBOA2Hce* zoCfSrS7>ydnQJ39iU;U}P+kMv$>+-XT-f1q{On%^8mf3gvoukF7p$ds41k`bF!E}o zZ>C=v33-<gEMOK>1d9c6g3;O;@uiO@38Q91{ka8W^?Vgm>BRKV4gOM{rm_^;OcZ#Q zOi}ZWGjTPsdGc>;EhuM$^~71UHtIr~GpjiKJ$8JE@4i416c_o-%~$<Po<mD*#cc&b zQc{6C<=g3aZx>6rUS<>wQ~MG`h5tqy8|r^C5XC_hEpz&PYAUwLCDC(jMXjO*@?ih+ zHe|QL4OVS}Hc3}Y>6O1NrD9xH*FtE5{djarpd|Wgo97;lyprnC>WFd0UkzQ+-Qq2h zZpm8p$oS6=wME+A@-_@DVYY3Oy(#T~IVAy1$4vNm3LVbk@#)d5jg=g`Y#J28l|DUV z1nFn_V4JVeuKwCxX0$X8!&r+)*8pY>BdGntlHCJtaJ8&6Hbj7z>=aXYKl)e_<jbd% zhn}jr)zF%;#bC1hSmdET!|D!{i*I&dS@(cg(E_OI&5PV)`IVNk{p;vO-EGSr$0vE= z`3cS$jRk@7klg-;AF_tC_pGtL(8w<d?cXo@0*{`y>f6s9O;RlJyy0J4t(o0#iPpzD z>qKo-%@S>HeosL{IU!cW^qDo(BdZO;MI|G&+0#r9oV&uMz4(<Yk^;re>|x0Y`hLiV z45)Wfiy~TT5~#6H#PIYa@SGyStv~PX^TGJ1k<k?Q*t-hEDu>}DY*cyu9S+EY$fT4O z<B9T~K;CI~Ea*j0f61;E=R#1?S&-)qKML688kXaE7|KYoI`6>U{mZ?>#Ov)yuxtVx zCoW_0wjH(-Z$HKUi1h^m0@h97{vtwih2m@Xa?tO5hP)Z|aYHd!IN|dF-~svuzhHNH zWd7-&XhFx|4NV#7hWr>gQ+D)+-LoMtVntlguI<8eL67JAkR<M(yKk;I%|X#(Jp&{` ztS1EAD0WBvc>ekNuGJDc+Bj)-n1VLK9J@}GLB2kGLH}MlXWWCN$hpV!ApMJyd(z!) zM9q%&49uL}I~l_zH?&5xl6p<$#>md7hB+kZaceYfS+PLq)|`l0?f~mC_%Cau?mE5- zW&nDsIV<<Z*H(HS*S7(uw#?R4>5%qB45_xnRzP+=s?Q6bAL@u++B<<od)4!>yAAZG ze9c0;Veq<T5vfLcJ!qf6z*0Uig}Wz+N_z)NqXX>&>d)AZiX2ggG_$8XUpPM8@e)jZ zg_Wz#YGv7ehQZg<dua+%4evbxsG4|uCzfHzW%5Z3YRbn8wCe8t+!!MVFW*m3cj;e# z!6ZbN&I-o^tXT&}mz1A}M1X#<xhD^<*xG;Oud*GO?dnI?ulFw66ZugNn3K6B8A-U~ zWBQl-O5}m2Uyfj6hGbeSWr-FIF%iE<^mca}YI83NgjfkPtgi(8mnkBFdRsoPxt9id z-oI>j+X-gO>3rlqu}45N4ed+_o~&Nb>!q~h4O2}j&J|yH(2fSvKhjNj;)j=<-<WUd z4&K&=x{H)~4^NW;ZPbAoc;KnsfG4nQjTv{<lQ;en!9vY(c@zqIG4v8;hz9!A(~aIy zih&hDZ9Ccuj5`rwC?t9k4i~>hb@xg_K_b#kX)Jept9h`=TF`WR?laKK?oINr;(o>b zl9J!W?bj%HfRG{<^E8@SvEQUc?S2L0gIm}i)Hla98Z^;3cfj465d4HE0ZE684YP(- zm@SF%(#!2+nVQE_-y8u=K^}cAH0eo3u-E|3J?X;j`7&Kx#rwOv;=%Gp^el>d4SgHZ zFW&bUonqAKz=*~h%<Gyv*v^<<T*8;L<ug9}utZ}S1@2+a{fcsTiKeXs(VHgK`Pi># zb=TS(2wBSoR$f5{s#dg@#RazUavh?3YsxV~ZS8gMG_&~<T3`U8UhErS5(PEnIe&CT zTIGNVU5}P^Vr>x4_acJPu9CHUsxsxre9xp+$sBv06-8GixQwnpRJ0Rbm5e*{;Y=0i z9VY|Eg{u>L8&Hxbo>c+}m{dEob)H74HOwW>>>>jC``94(3(}`kvMjGA!LJvN`B61@ zo1oe$<dqqHxMm=gOpcPQ=AI6g%1ZO&R|f*eUtCC@0E>sR`>tw%Z+7@Px;+Las?!OB zFOPah0;*fuYkjBG7CIb0gh17j?&XW?Vy`4K))Jg`%TF2AV?+Dly6o6|u3~+#E?7A5 zS9_}A@_0gWxxl`Oi5qbgD%Ze-LUlqt^E>M7q$6uJq`9x>n4G8jx5<qkfOnh2YjqWY zRO^IK1xbp6C{69y{OreS6z;7zKcrt9s~<A-Q+OtH4AT6Pmz=O#tNHbRI7DF*53)ae znL4hU3jt35k7j`jO}v`ogFney)V&R&+W4aU>~V^0Yy16(9)|dX_~u}>FPK+O34(-w zI<`RzCuG9e-jWU<Gfz84&%^QdjmOu^^Nn~Dyc*f`UDF0TB@L~SFuP<@ll5{|vaOoz z+cFV0VQ&Bv$pbiX_v3mPfkbE&rVZ~sXN+^1vY7Xj`{XCKHMYXFfWcH&GV;Yp9*&}q zVM<apX)g>Th~M_U#Ej$Yrc+}vq&2b5<N>8!e`2eKX@>AavelIzbu`95+<pREM|nS! z@g>Fuo_bR-n}YdY)EI$sK$jn9&V&=4&guHF6s{r-b1Neoe37c+jA4m3i)DJ>*G|oe z>?<7_NU9(g#5wecPCbh7J7N8~p?h^&wl~C^YyYZ=$q2Uw6TxG=;)SA+QPtfZ&S;)& zuWZPS;L<zK^sMsZ+GWuk+%9;w^eNWcJT)Y9-IOW(c*Bg{UtGqQ_Q@>+OW}LUy;*;b z#IfP7mDS%%_9~vnVDD+yDCzh^bd3wX(3A33fMKw==NM_vus310*_a$8R9pK88wGi^ zHG(h6kclkekGLTzkoV*4dK~Y4CD2R)KQn%KzQ2UJ$SBj!Wi-N>(xeW4fW4*{Yf`<0 zg$chAToN)KaAK%R#ge1Y1M2Oi<_r)zt49}Fdlo4<crJ?P(5`v)HjQn&(OKd(%(Wfq z44q!s86LBf*BT0Z*|ypNRv4hl=-$OOiuoLVU1n&E2&>@|S96rTli00E9d+fYcRL$H zS`Mg-3|uSIA0ZZtNe;@m;Qrze!8Op76vt)2MtF2iv5!Zsll?eYsIeR69Eg<Q(jP#j zXA4U-kxUu|f1dC}9eFh3P;7PNe4=cZbD!Z73+RIPQ}Kyl0mB=J3=!oUpVHGQq9G_) zv8(eaB?qd|@n~cqSMt&fD>9*<7xxtuYZ2sVj_18fB(Vr&o^pn=L<o7`nmu|s#3KTC zy)T(GqVQe`d<s$mR(HICAZt*kc*tGl=@@^ozL&_Y5*HZC#>z$tXsw_aG^Vm7(dxx2 zW|3nUZ3nWZSUB&c>viNi;)J`pw$f5ZPwx;Qrk{*Qsk{R9Rx*$hu=M2(1j<-ENDKW6 zg^08Qt#1l#QF9S4K7vxs)qzZbr5>B&{a+HVsYcVIrWkem)Fr&8uwES-YY6vZtlj^< zzZY{0FHVfK+97mj-06!+VV2@*VWc`q{^d^HmSEl47!*P9!tK{UQ}p~ZFnH~mKenP> zy}^aOFt==r?_S&+$*W@wK~==cD-C=VA|WDXY5r>a<OmB95(Z6f*BonyjSuCRJ{VlG zKkQ^>Uue=F+HVkSvCj)2xZ@BlQxUGW-pTgk#MlRz+Siv#L#&q!PVI%(Ro?!0S|(@1 ztS#|R<&_$4twq!ED~XcsTm6?-ULfp*5y|JjX7w?gCYdp3V=_eRXFm+o@p-MaXHQy1 z2IDZ}u=?((?p(iEFPWY4=h#~j-w{u{d1ysrPP)3gVlRMMHTgr+tQQj)X^6ReRbEM_ zdKd(daZa}lrxEp;;A=sIU`e}_2E&i}QEyY})Dh*#3Vyw*C}LkEI+7-(&1#mfxX_Qc zidvBZR1YvchDg4Z!ohH;ygYGdGh=SgVu`dQl48rtPQdj-Uqc1ZHkcRLQmDEU`%5e} zHkFX-ZO@eL-<)VubeqbsxsLwt+!-tpjFR4-kbr#Z<D$%%IjaWMS_j`%sJolx5~&Ud zIAC7}O-{R!uoR(!#Mi?!ECgZD#Jfe|A5%^1M{Mlmt6pT^Rd4O&9Cmng2}^Kb{py!* zWKQrRue3iIpY_se(r5Z7gDUtV{a&q;4d)R@3CM=D6I3bEGHiI1)tKK;I<K_g611AB z+HpBi#7K=JiT#Se#vPPB5r=Y{`oU&2PXnDvaj_Vx+W2QTgDm~&4mW7VtJhoSlPy(2 zJuZ7ZMn$7VR6wZe_2(sqYD-Bt)-E_|RDByiL$wfW)R9c~M@dt`(rlRag?~yy|2$gK z?@25VPl}n_i8av!5#V3kiZp}XJJF5B2qh?IL_u3_ph^99DtdIKHngE7L5Vcg%fk(9 z0?;3O8mNz#c*zZ1QVbFw;-<7!8@Z?=;Y$1Tw{GbE6LM#Sris@K#^qYQqSD<NU5S;Y z^k@gHbpw7(45GkHls9;nA<nnF=0v!H^Mo*EKs`~^D(8mS1-KlJSVTIPfP^>+RhnQp zIua{(vaBxph?)Yi=FG`w?k4E)wG=wF4Y-><;I}=bwKx}<j9q!zOkfW2A_Nnfmz|6I zvz#W_UqR??Y4c++kR7U2j-Q`i+u3<HUi6@NJhFZD3MD}a5n!;))x?aPO|mzoy{RPs z8JA@EIDLsm)Tw=As564=`DxdM884KKMqgmU&-RKq@u(7FIw&vGrfH7xmuPn?%H4tU z?y+E4Ik4PVo)AC(P1|b>m+V`Ci?<vf>`x&!l77u4F{O3XZ|a%}7gVABXW9s><>B20 zI+-R&L1PnpP5b;ZNnLUG)?eK^*pZF4hdul#HBynje&K|6ed?^_PW3l&jSe=EV08UB zMSFn0l+<1TGyv$pf#H(n(4&(k<*1I`d+B=LgZm2Y+zJ??BAZHhFehd|M%Wd+8ahEq zNNeO==RMn6Kk4SCbL2j-%nI*L+mj@r4YpVC8Zjek)QPfg+Df@5B7ASt>=KHkiJnjO z)SN|R%?xtyM&Q>6zG!ci7aR0oT}1h)suUly>XN%-MmW+;-N;dO5Jkg|0-gKG?XB#4 zJAMsx_G1`|-~614<|2=zV|uX%39mc>6Z=z|JJ@Oh&bualNVyL-2<6WV<?J2G?mLwL zde}Gc@IgGqQGn$0AkVLhA__Bf5EJhNyMO7bC>z2O4PB~A`O%qvK&b*_PQ~{sMz(S+ zQAAE{--$)AxH42C<LTj$!@e~05__(`B&4YL_0iV3Cxc@Y4GDQZ4{7ZRFVjF9oFSE& zDZQ6!n&BWtT{ax&Xren1i-<&iYqof2gA|deILD(T@|8YOBmi0ZX~*mRMU|6Awh3Z| zc5VAvGtF*D#}t2N`-|TnINc=tUrOSF#_5B~931Oq&jq#GcY+e~U6lF*=Uk($VUTWF zqKb~6r_HW?kMEMK?KBICSU&)J-|d3k`p*Qxmtspq__47F0hHpCAB{(G1_pA{e>G1~ zOoDy{im1AQ2iH)05&3H;Y#3o>dk%M*$>!5ez|x%<tHwogf9>_P4(_b-$IbzsJ2Q0c zmV&L8N|;T%O0H}r?K_<Cw{Zsk;V??*l95s09SNtaVk5no-S{=jnL+=Xj)Y{0(B{f= zsWUOOe>iuD-YjYhkp}P49M>6-U9d@k=Oo=?Pzc>tgs7N-3&}OT559K_xFQC_L#=KA z-Jxi7P5m3`3B{JAeg1In{>$AB>(OiZE(xPk+-#9^pjo)k02TurP+PH2nJ0y;V(wcD z?;EkiY7_2`=<QBq!iIw@o4$02CRGQf)TWccDDTf`Gc1r%t7zCrtOBc305nGJy%AiC zoMCLi0<9zfuYc41Pwu^Ow|(7~hMGw)uo6ydG$f*t^3Oyiu_^d&=$XlC12r-!$c5SY z-_ot#d^7Hz6+f4tI6stTtk{w%@Hg==F!}{Xq~3f5jF*d19btyLe?kN5-)nJze|{Ch z4{lWEBv{l6p}}SEd4OnyaIV5$tj-5?J#Uh2!BpEc(^GF22~Uh&)_qC2wX6Dz0DSiE zBQBV9zHm7C;HLt3TT+K(yO?Jm7NAIgWh`z9@s8JWjH|*mz;5<&SlZVENvf4TF;C)S zdt#FLSRFLrfnz*?s(bt23BiF*So=U|;Ci$e6>QI*DKN}Mdu3M`vcT9T8_acu`OH6v z4YX@H4c5ajMjO-v&FG9}D~0PS$^3$r5<wVHP0&1!$?<Z|qcABs39&Zah9D+8MdH91 z?`%SMu02UpT;W%5C=Z4~N2Co1%df53r(7E1GkUAD-Vr>;3uYha;7b!@@%uTqKau1b zjQQTb6`mffcJ<tMCt~7G#w)8G`b9IZt_LA?zr?>g4`@g(M~XBHmw@8w-fhNSN2=i( zWseI%uxRDu=U-6v5A}H5VKPbzsZ9SUsy1ifg1<LF#!T!n9YL-J8WTNQg@Xg|lCDKy z>uhdm=v4=g@72Mkk3TGObV*xX>+Zf^+&)#!`@&q@YfkniBqc>VxVW1_2cD&`UUdwN zim)l^HRqD}PZP=QQ@sP$*4fC_s{jRhu<Q@udX)br_@?MK)n;?aY;G6-vRh?oT8bu< z!!Om8(iXdqWl1Zr@%RVS9l!SiKw42~Rz$7NQ9B2#C1p)$kVF_>+^O+mi92@sl<Lgm zKeVHcrwIzAD6jMtb7xUpMu4}cR^$mOerJ-dticWs2HpaynIz-cZHW4n&~qFhJwsLM z*~+x<|3rHe>cPVs7w^(}<51RI&E=)2VBK5r!)wP3$2*0V=+`B)&CMg+Ek`sQ3%;Q) z6W3oE@H9c9_Z3(E11P+lek8<}twGkC7sAA~rjy2EXnqsJ0rq(P6HytJH$K!qQx(wF zM<qThvA(jtEuFtO24~#JisG>$u~B8s=@(Y`Jhbr(lefLRz2*vqO5pP`6A`G_OIkiT zhP+m8uqm#Yot+;V7fn4=0yHFfc_divz4-Y_A)qiS3}Yk|-uI&L6NAB6ul`!GUr8_x zzYr`<Ui_7*5bBH!h0x&DiTzS_<+V_)AecnX?<x(33;UvI3jZpJPA4`R=`505L7DIx z@cKe^q+cjxsnrSctKTW)r`+ZK0=1fFFrZ1MaUr}7o29-!t|(pxDA+vgx2s(99ka#8 zNtS`T^fh;fmA1`<GbLMJ8^y9CQWIX+D%1)lNe*^QBViTW74N1qeZgsTI!ElWhgj@q zWlZ1ye)>+YFXZYI>l&AP-znOkUAD)xsErf4<~E4@#<==`UT=NkAr>+HG~aU^XObJn zCU#@Ll;b`m8qFOBy&4ineQo6olG-Sf-}L&6+Q%Gj+G-^!4{?`O>`+g#aHdr3bKBcG z@^y;o>NX|UsZ4b;8>bL5NNrxTc`pdOXFO8JwG8pD0Nuk*hFU=q8RvyvtZBWQl+;J9 zSTxp?C#OA8)wx(R=5{HOKkaTE1xuP>P1&v|o&k{l5OKfi067OAjG3)bww3L^GMk|6 zS_AZKgF1h8Ox&66Phl^f%NSmJ;oaY!sJ}`2jb%BSQ#|YG<s*z9EDp?P?{r^})h<H< z*^tjmOV~T7Uu#BQ*LHsMRNNbT*pwS+Kg0Ue^tI>!{3oWr{>R>!^*sCS4bT=wG)*<e ziLQ!54{>_!AC;)ZC8TTS6+_s`bg0n2??{8xXj2Rv5fAP5ts0n>%(H2<0ZoV18k%Kp zV0yJ$O~TqdJ%K^Js7}XsWhrZ{>Vtd>!tPbW!2@<XaLDgDMLD;i!$a%9x2n-x9ia$8 z(14A0V!KK-R3^d@cyJ+H*QO&eb5mcB5JizO0Ws~=>MD=5w%tpdS`Us?OC~8u@}l91 z#)<9l-7v)|bcsMYxEv#kZ|bZLL2KF6Y9y8)&!1dg94dp+q&3q+qZ4u2feoUy;>bXb zyl$e7F+EW0K|l(EI%^x-Ms`pToJB|*xnv@=Efn`Vj;xSaEX@|iC>cPd`as)gsWesA zKXF(z@a0G^d<L|dx0Df+ijpB^7XQSt2T?!4NnKxy380K92bZ{`oYB3%<7f|SE0z6D z)JS<_X`|ckIMNzZ-Nt?=islvT7Mt)pj!nikpV+1<{;RGrouf^2dSoZTnE(s_%lI`S zhKJ7ZhehNi^T#uYCDWfcuGQ*{=~!>tBnc^Mzas|s+-1*c9|hdziY4jY+_8JS&mT9# z_K=f#qY#+8Bafdo%VJwO=AUgJLPyE&hCOwL471looQWYhgqUmu=oe{epDc%{qgz9; z@sv<EMbs(Xv~fSu#i4Le^QDkbRZc|}PK*YXqv0LTI3z><x##B3u`{A|ZLimKfv{Eo zeLN*!YDp-qecrF&%0_bRx!x>{WbRAdl9pT<u<jA89_r*B%%0t@pEyv)cg6CjXWWnu zZiSveUi#!xX{l%0UtracDFhK<PnjmB7J+4;_#(hPwEGASh}_|p#EZf$KRq_m4mpv< znZy@$`i~nLe9}hm$4%~b0G(0HzG(-!QDEmS`|gNhd%-!Hn{YnS3TukBB&U8_ip}bM zG*YTaZpmpgHJSx_{lxL=yg0nX!Fr5$O_)YAt8HJ3%FlfsrxLZ<#Lvh{vW|frm;Nxh znx&e$oc$ynb#HqqL*txX+M?Se=f6Ih|365_SgoSauoS@ojc`TnOPn-nhBPN~67hL! zG;Un-=U&$#j&?%*O_{K)290z-R7}-HPSB#4+%b=gC#+)Y_xK7uz=MGucW!Hf;yHGd zvRv~GCGogq@dI{TcIov3QwBDr+UCl?QRQv#A22BowCC|r#%-oKU4bvfB>WY4%V^sV zAFe}_D>eIqDEHxk?j7iD%MR3{v7Vio<=ol5k!g;U<(*#MX!jj<JmY~!<?&)GnMs{* zx-;#)-nUYQaphK9x^xsdczitYdio$g1R-5mK@+d?BurDAXM>U$58rYn84%gP%Leh! z{K^w2C3bMa=eGVx?;uBf-rzKbGU`Vavy?KOy(zLwy{0+K&4o1*B~!gm%OQbFDWZb> zQjdVoCn?iHgsnw8dNzi+Sj|1Ky8)ixnp6TSN_f<jfZ;I2rqBsE7R8Fy>UG1r+adA^ zmVdi~<6NKsbL`OA@meTBRWPY0AS3J+Wl&{aey)I_b+l(r?<dyA%6&{ciILu>Q<!wP z6a{$3(6sss#quG!?g%TNWv~+(NJ0Qyu>Zh`;wN-!y<JnmMcisRt@`Y?v>0J?apwNC zUx))x>wFd2r1Q~YU%;$V?~NijvLPF+pp&>t7n6kO)WS!CLDeUv`)5beGe8@A5w)Xm zy`D-}>*2LJv0QE>k@Cko8#{zjxdE4oVUg52H<l%fkS_#leswhLy;1ecaoogs9@Ym; z6Kyjoa9r+ARmmv%BJHBLS71ZDH`KuH*vT4#s>vo4#xy=LVNxh=<64fa<0cp+9#yVZ z5W!cVPB$x7bOs!eq}marLlom0O2L-c*@ii^+C<=ugg!$AjTOWd-b9HPhi+9@Q9RDf zG`ET-0aKlv($=Ok8GMp01@Dj=+SH1XA%k&3A=Jb4Djy<?#8dDl&&3Fx&<YINYf|}$ zf|nav3J)*8;n*159nPJVC2vOS%HSHr%ugRI7{?hYLk2V!Yhtl{<<p~63XIz5)7C0v z=?ta9Y$3A;JbP&jBVH$DxJz<Ie0)!vovMIm^3ydJEY+HfFA%iaJP!rJmS@D(j`Ua- zVYM)!_XsO{{LHLmZhij)%_5$eAO>QDY@~Zby8c}M+X@)1EP)J5djM%~Tuz+5O<a9# z<~IfWW`di3t8&)6MJ5tkw5lG+7{Ly1@@~*gh|y%Apj+Pl{8aWVu$&N}a|;l(XdNea z@OUG_QsZ_Bzu4f1-mxColfa9cjClJ58GZ~Xttbo^(Eba1ZvxfUm8Fe#RR)*a1C>xQ z9vCWdjLIDh#$uL`I_=oR&7ew=GG?}ojhKu80YYf17~6zkAh8mIKtpU|E7%5%1!fRP z!C(jmNyY-iBxD9lfIt_}Jim)m)vMlGuh;wk)&G0_cmFKblDOxdv(LF(=kBxjxA#70 z#3({Or2N6TjaiW(gvT_AyHhWyQy3UOQpyE*jJmD};?Gv3CH{k}Pp(ORpX%7Q+Vpkf zUe%N>dlA;p8l$bn188aw!_{&Y%(AU$fK>2_PoNI{J0e-rvk!!2I2ZmWSW>wVCUlz} zEJCNFNjF-@6i2D37`2>{HchLch!XWZ5ew~{34h>oR2k2RvxCtx4yr3F4fGs!gcj4h zX_;1<=XVdVxk)pfk!3Kf8nANpUixmv*9r!W1XdbZtO0YhyC_@j{)hNt1#R@{nuROe zhaCz`i)NsnW|8074MulY!$rDJr4;*>QD-P~30<ZZ8*>LrKr1%uPmq`??Z2?l4@=l6 zP28$OlGA)(t8e$pVQdvX=Se44t$^=W`1h5bRv8<Z94bz}-c0Fe?KB(B*b^TeL#;gG z`ic_2YD5)+Z*9Rx_#Up}3#2!eR%}bGR-dymhLIVPKrAkwJZ?J}H8`<;U}_dCCn|W_ zfYooJMF%4NXDkhn%DY%KDvwwgRX3GXjJ`RJPfoTItEZ}m97(obZj_!MoxB~NmxzoN z<;OvJogFB~&*(qf_gP5Kf4Gwl&%>S-{JB_y&XxJ1IvD6=M@&K*D}6&lN>20o3;`9> zL_BNOjdk}KlB9mM8YSvL;Gc(gnj5A#>4;#ZY2jo4brm;L)L_&+P*S%^d$~YIFjp?- zG@x8_9RZ$Fx3bk}ixFEhV(Zn|k`e!ouuSqZ>rx&lQ?vqq#jemjxon<dSqK+&0Q*&) z3!n`zGc)Ji?;k(~i*`01m$m!KhlgTVbo=elMS<m=%p`6Ql;Sq#N`o8=U880@bs$-L zTER1Hs^@<;EIA@@X=ifs=de%mC$76stYD0y=AOm;{T3rI8Lakqqf7TaWI$H<-z8aC zU)kQLPnCKPDrnfj-F<8$Qa~v!h8S={#o9JDO@U;!;8(pBTm;k}eo4)6i%?S{&9yVS zbe66P+ogV$l8@v=7xM!-pRhvxgV*UhL~&BqA@y$bm6|Gr#=}=M;zC1LB!mffhDc{< zr6p)v{%$vuyfs3=H^$rF#`Q&jC+8U1fnIH7(90mwMD9k?-=rYqJ4jj9p<J3h*VEbG z$h5E2>u&^|166KYr<syJN49=j`y0qPzAlCLe49iRR%t{jo@7%2qiCkktIko!=>SAr zI~t;rpaQ?jdRLcTu|;r;hyR~X8%u0_fz5W<6;Z2ZWAtsw9Q$f#UY(=RzAAbr-28)+ zoKYm;p+TIh4Jyyj&7%DjCfYjH(H1{h^fogi|CzcXecj;CyWhh$URuS5^YA$=KsFV) zws57L9!(jO{}AyqKYus8OY}{&B$o#1V0HBEG2`FHHaO=B1vhFcZHfE6?YO6^B9Yqi zQVo6ntUGo}8v!#0z@+p%%027ws>-=q{<1sheofNjL7K7RE(c4gE!)ixPAM|_2Qf+x zkS@#UfM(Vo#h_yuZV9*7eeubK`=VIH>Q^3L%qy<ZiY31B>J;2wQh-2N?Wxd|{-~G* zKG>f?<@5|q4u)M@qT+@Xe*KEYXpMoRV)}6iHVNY*#6@?wXJt(#J9%0aoagd621f%e z@|8p8s$rOtn_L`Rx`#3*6({HG?Rn^lQ^llbM`4}j)^ENepyIcUPQ@pKMkZkZk*pD# z8Ya$(Za-z^>6>X%D@7We|Kc3$*wAjkcIm>anMldU+Wg81&~8q6RI#s%!%NQ}=cKHo zrNNhyarQ*qO-AlGdnc!dOF0nTt{=(!W0&+|J|N>%t|XlV9st!YI*%AjG!9iWA+>J} z`#+!CR!kSg3Kg=j=gUML1n#qplSygjzEK#mlXcryfT@r-v)XCQe4%zApne_ei|`cy z)$Xns%Jih-#n1J-FbbKeVSW}6(vj<$;2IKqXl>}md`-J3FwnFREt2}#986A$q@3IB zb@;q81?P?vRf5e!E3_V3dTXPo8HS88JP_MsKiFpD)>3|?-vKz0iaEnU@tTKcOG^ET zR#bstSggdi`f(6$xa7$p$MqC9EoP%UX%B|gpONg0CD}c?Ut;o_%hbnY7oj$jY++zY z<m@rbE9|_$;lDzf&o<{^N6K36W`npjM&aFVSu4W1RE&A#;`PLStgQyZU%JTL39TW? zg~;rb<UZspgX!rN#|o+2S7=W<lz`nwex|o<`oDSnK@cla+P~)l{6=#X5M>==>l=(D zaH|c_`#z(`%)Idd@HOanSDJM;o3X=zk2VR%KSLW17ZYUQfjLyd?^R|6j{*R!Mj#d# zv6T-2J0sAR$lahH9Wdi&?wGAy8Q<c%XXdcU%m@2}uKdU$F>>1URx_zmZ^dp>QFr=w zMuvgDcQdS~JZMUC7{ujXd-2J3PwA$EAG|VK#@1j@7i>1GP57`@sLOlyx|l$*|3@on zZ=$&L{c!y;#g`=)RoIugjZAzFqygv3%kTu`v~^nGIBN1`Ns8lA>RFmPLaNqm=hUql z&o`h&vD6p<S2tbV_VOOCy#->!1a#tDG2@!u{@>s)v#j|t=YVi@UH~aUG(SaBUp`Uu zQzR^ksn)=DV&;|{g)8bk8yKSLeS2Am1-q~7TZF^`f$S-9n~A89?Nz~(`m+%%n_DWa z<!(B<%K9xN(Mt?Nc15GrmW)}yzK;UWfM~DlwwrJfhP)h!AwRPnc?r6nyL-Ylicr}k zILxtCxteHoqZT$h06$S1`zeE(fdY2n-0UHGYX{I}9J1UcZ)gmr1u%wkoUI<ayJxlb zX3tWG8KtNXKQb9|q*$D%X9;6#Vwx*rcC(c#B%{@@CB?19IYJ_(1Ys_v4I|P5=?z?a z?#$%KZPG|iKs?UA)Y(#Z!u;c_tPYh;j8Bg&)qOTNn=7?$b+E;vty#479{i_?igtA} z6R~F0A2&I&BKlY)`F6yk3AZ)33Wn>pzI6Y78W}ubb{pI1@oSMH9qB7vng3Nyp1xk$ z5tv3c!qpXLdQQFk5NAD*v7y+vrhDXnM!}dtE8gMJs{13{TzEs^_MngUGwD@o9nE#N zW_YQn<Se$_-nV@ZBlzwfjo69&jJ3fxXto)CZFyvDbXE-+->4a6SG*jO8@Jusehqyy z>|lt5^4lqTG#ll^Cyfl)YFLAAopUP7{&`2H5sm~8&ZG~+3(1{B7Yj^pGU?Igp!*`l zH*kurB%H4ScOC71cXbD@9Igm8j>0&`_Vt-ZV0M%ufR(_a|CA_|s0HL_YD<AWP?(ZH zcw&YQ`!}W+<k$pV53=_w+#V>F4%8TWFN@j~GONst1N~A~wKjedm>^f^;J}N%7ygK* zm(bTSa=>Pw9QdK+YBa8^_?bIumnlQ9oa=A>H{AhLAjqUj<_vg>jTy^JI>0((_^;a5 zF3@9a(i5tZ8O9Q!dH&)xYIR65o~7QQ+heeg0!RRF)AWQgSw|)ZB>s|punJ~Nq7s*v zY*_!T5X?R3iq5%>9zL|c##&x6ABUhpG|lNII>Tte=d;c&Gm7uy5`?LVrlFJt`3cC& zrO|;^@Afq*oRe~*&5)C{EG!r(k)or2<{Kv5EQuLbfiRl<^KUKRKOFKnn0H=}-08Ft zFY+oN<V$VxoLonT<ZJ!}wY+aI^eC1-G@4W3A|JrG3PS5EqV)0pH}T|~Qe!8XfRHU* zfhrpInBK#Y+qR?GDzzB*a-f@D8HDYM0af4aZDIbR-{6Wb&UlkFf?1c0YtUmXcojZi zHTwyKqFaAwg74Hcp+f&g4)4@7KV<CL;}VzYz&qMCji9ycc`SZ%`-{QVci_K@m8vsX zVX-@=QqK+l^h);|=3nYn_{XTb^;cJ$AEvy_A-swD35*b(f{4eS<j0)x$!ZV23^{wB zz+9!Krk{fy@z~!s?b_}5a5Pw?8)$CX>}Xe9X2r|x<I7C6`NCw(c*Ks<w>?`!*51s> z6LCn#E*;5WUp?_g<<!A~Uq9|pOdx2Fw}!LDovpdE^=56!oh_;SzsDkRYVc4&{}MoX zGE4J_u^*m^A;UETY}Rbqj#>r{u<TST93ny;F&|gd0_tpPO>sKYnZdtxS;R925PROE zbqgl%uge+mHEYIt?;V8$6oq01z2h0DQ`_ISJUvHS_lI3HxyTgkT~Vu+g-_(hMnYjh z&iORxd`*yd*O+EjU=AtLyA6=X?Y-x29#(|qDMm`9zdpCIa0k;E4`#|w52+ofi)zV& z(yiXKlN#a{9zc3q(0h9ps-1N&5ESZ!U*pxjib`zuv7Y%FdKD3&DQzi;FIJ!j>7IG4 zQgHw|iPLv#cc0pa#VTg45Q7uRa-yc&QGTCL$fJc&fBFup6tNIZ^Ii+eOa*#7WG129 zXJhxENB7_a%}5V`xkfy^LQZp+JHr*lk~5-n!W7ZS_Pw&9d~$Hlt<)7JKfl`L&`Odj z<rdBkBE7g?MiuU9`DHz>A-&2xmJlhjheN%q!6^L!zM^rLLBD9NljZw)SI^)jRDJ|S zby_)!0S{r{jNG>cQ!f3UFvu*VEFV3aPutho#GHNZb91s2OdR$YMn4z`rl_8kuYA<5 z@0{0rvRzq;gmvcLGRoAL&lomAZvk*Y+*9LaUCEE9(4wrA{aiC2aMRxg209ORzpJ;A zNR`PDY*hY*!~k9Ad@*&6M5kY!u};;;Pe$h?bs?Rr`&MA|E99I#ChbnnfHv?lcxYb_ zUGo3-417JHvg7+TF4@SO;+3Bt0Q(=HXKDATs06v-6yq<4N)dyB!Ju!ALEJcoiCBIU z<eBapG%(2|TuVZi&0@u<-4>Ny8UJ`{VI~}KP^geK<1)!rICs@r*R$l(nta};OWgqB zchQHP1FlEONvG53XA9)CRRayO=8nEq;h$K2LGdg(z(+jwnpNF|H1{#n*`?I|O1#<~ za%PTc&#RmmnEuXX!bvEl_%+ES|H70C8Q^ZJo+xsC|E*MymcLcB9H=i_u?G_<vs&hX z&F1~lo8WsYdZ4Rj#;u$%GcL7TZCoc3O761#<|6E|yWWh%T@2BEH!b71@Nt1!gJrT* z-<x8YdVIHusqRov_~ME1Cz&h094Ufu?YI~uK(crIl|UPadUAbWH14B=<|j=G7bN`( zFu&lTQOPn_UkGm;P+GwmkSv@1P($TBZ$wvxH;CTp6s_!+cj~GOZGS&;e&UA!DC=Vm zIF*E4rX|nRMZwucu)DyQ=5JsZLXt_6vw#01ctmTWg-g)|^5q3;B_8`H$XUImr2<Zn z=%%60T*9~a9}T7~#zKt(8vIPo9N(lzY1B}*T_8iYAXvv`zJOFzQQ^q=&6rwl$~fj4 z0sj-KLP|_~a%$~bYvMyt1rFuhuc@r|XQdcen$;$82yP?&5(}zW|JlQw`*!(tal2lY z7hoDWU&sic?Wi7-qkDQvP6`P9vsTQ&ZVOOlUSk!62~e#0T^NrYf>QbKgqOnG5+bld zbm3!%vS{o%q6VrrI+prD?d!)dmy*>)vLRsNy^OT#QY5<2bpUIBnB`cA57(P95fboZ z4P*4ezyN%B+BaGhh%{ail=50&F0Ns!cFJ*1yfCmt#;j1NPu#x=4PB%<TK91?A6V^Q zUK3t-Zx_wNpf(l9CtoD;8;gk2YGneCcAT$1m;hqeEgzesrJVVhrCv=A*2u{5c^Hk8 zF=>#PR(It@96b^Y{<CNXw(CFi^~ejsW=8}DjX&UGL_?1Cu~cn_r|>Y!4Nf*K^jeJ) z*Nx^H^rL$-@4YT$f`woJ=y7JgI_&f)_etQZrK0{w7JV}y`)6?`bKqWKQ~(=JS}Rzl zz7GG!PYR&Xe+K?h@h#iI6-CO~jP8CP#l^edUyh%pZ)m#b>rfG!vE&P>{-O(i?)vEU z;NaSU%~0`T_^O=t;2!QO_L+EF1sf5V4aPcu&6dKcf7Ui+Mc_>@*GC|b&A9WeLH>8- z<T|CtW`-K!R^y1$u~9V5N$Kbh71Gh7(fZ(Qwti%Y&!0OkQPd1{-mng%5mTC<9In*_ zbsx-AcVw>kuoPmSMAEa!qSl&iO4eKc(OqKg^=;(zQLc66D3U@5{3!692S_y-QH_@f zdodm@(6yl#_w6^qlW}2ch2%_Hn{gp9vCmwYj2z*QXq=MCKMG+q5jxQ1uj-YDejl8# z(C?HWZ_ezKvQ@5Z`)~X?@;l5Kc(s35^&9C3c$He<4p7xo2WQx>djLElET3%p1THYJ zQH!s9<3-X3zEtJTeXcBgf}V<M9h?=KotV%C=>rNAPc}gFEm?&K-z6EDX(M9bJb_*C zz?c?jYA|-aa<N|;tBT=)IFvrVfQx(h*K0j6!{_Z#jmOTc%aY6LUTvmUD!FU<z*(4W z>VbC)aWjOK<TTyX+Bwe`?2jDWjC_^gW>;sr^DV8>NomH-<VurgTM`D}PpR>}dvh}m zwh?$T)m5}=z;OCTHa4>|weeZ~GaKc0zx1#pAPxp3%C5E&woUzgpD)Y*ZIHhV3Zvis z`0xAdb|DP@-v%|Ka>@AnJ}<*`H*tSIs7@(t{O|jG3%7Cv`1?WqM;KwR0az|_w6_1d zWbQPDlKW)-(3*G(jqY5qaX;`4Mv;`{$dFdE`Tp33N`$_~?)L_qg}pfF{xg6qFb6AJ zc9D6o4x>LD0(W&1UABj4Dnj&zf%y6Ao?}tKqlpErC6~;a@V%5{uc?}MH`5|}UJbn~ zWoL?zR|@HEkX?v4&p|H*7yy4-aoh^IO)*64jkb3R{g4NRLUvQZBA3~r!yuT*Tn4Ko zGwn%H9sZDL(qme;aapPE32#1$R4;4@JC**8Yjlw)kRyVhLtt4GdFexfWEMUdL7j<S za^&*5{sdXOfIX9L`;Be=XzAPh^vMg;@zTzb?G~C-2lFU;xdy7t>iR8OI$Z#6F5*IR zMR>Xj7Ig5qU>D>WWzF$oRzi5qv?<!(EAM<^bFw#&kW3cYdEAvddjE7n=pLNiZ+-eO z&LwAZemdSj9o!Kmn@PhJ_Iszh<!Q=T%kn^M;SX#~`95-CUcu(|ortgsf{ioSatpxy zlNyZV$3X~7X6Pm@y=|fw%O+CZX9o+VSCQ?VS=!b5d^XORqx&pGW~j?#LfIjOCVAB? zJE~X$UMDQ~YT6V?ZrlMAnSG3Jwv%y>DtSoG<JJq=04p4hd!~2V8rc699E&oy-~QWP z0RK&XR=bR6=Q)vQ7KU)R567>|*RlSq4rsaVGHr?aR^k~s7{Zh%5|=IwldzLA_&!Rp zo(7)pS8<aGDZ@XSh$xa2wm@SQM4m?Y5E^hq6v*yZ^14hMdS^jygrI+VA4843BcjBE zhGD$4a89(ZD^R5Ip%zWy$*Qx%c|H&|B9s;8WI?{W+fw1It2pj4(rzuPe#LqDmVO(j ztXSOCQ{eNs=4pRmT@9-}fk|h{VQ`M6pTeZP&`bn$?pGFWm>#TMLGmu~<r~|<MKeG% z(DqP6+fk5{6wE?I-bcwlMmA}<pt8NH293<&q2G8V67{%Z7=`KR`9Q?rtPz>IKMu~8 zFz@UkE}Ru;1J@|e3>yo2BGVB}D^gKrN;Ujl`cP&EQ-pm2X64WD@m?x0!R0m<FdsrC zixkYBuGc9q`Z+K;r*(1KOdg<4sM{4;VEPMK($yy88;=C(d5IerbVOC)^y|<GkcJ*Z zE){kGm2g@xi?CZywu2=zrJK1k|6NI&&6Oq%E{r&JJQymY*WVN@q&Onjop%#ikRhW$ zMS~WODQa+;jSUb8!nOvj`Y9BX>AtP>v@Gz<2b?RN9i#IiHMIDu8{9kim{L8pO@9P7 zAFjB5A))RB%K`Z+<!n4F*;a;qn>QgFcH=KXf$6p&WA80Y!=$2CFs=A`s1v$M@iG6= zK5+bqYBi&@TWgGQEJtRBGg64*JVcQ?LzTJb6*2I!dqE+`27kD)+aiBa?5}J^5Ru5$ z1vK+0O0_@vW<oCkj54x9pZ_EVmRZR}FkkLwVNSAJ=3E)l`s9xJpv}AnAdO!@i|lvo zfmD%DjGi>Ee|k;*90*9B9TGWaq|MWuE?^ms<Pgft5Cqu8isQ+f<wiO*>uhrY#<1`> zS@mHRbnS-BLU{rhL3gATi5nzw^&)pBkxxl?QuPtpovY}aOQZC$>3yaP&U=pt4<Op> zOWf+)p_+k!hfBt5D9=P}3>Lje%|6>4uu0RM+$<M9hs^(UR{_=~3Q`4(Td2M-hUYqG zsZ-U4;cD1%*7Y}Pm|)!vU$!sq8e-qJlcnlwsLb@akaX2f(y`qcg}hnnpk%AlE%t6r zq^(!xzmah8RU$051Gim}oV7)I>K>v~R)?l!j8!;|yxdb{-<{c|Ms+$0k?rX$8F)xf zBlgu<3*m0Wwc;tYretWyzSD-F%c?qj*BzYpw8!{~2Qg}?kyb(t$*Rh@IfF<pbA-=Y zMoIb~9A*?gl>Th8dV~?1KBEY8_Oqfz%0%W7RbnQ5r^3O9pfTd*PoC5`a}wN<6ZmGS zeqUD542JZu^C)Z*lE-p#?NkK!44|j*^K*<sb!0i>9b%5{AKn<u=!crOV-nh)#QC9^ zoCzR+9W5^@X!D}HO+lx%1J@=z&0!Fms*@q2Gc4{H1rq7l7+>y2Cd^l_ny5G5<`DwT z(_BvN6hkuovV>VbAVIHz0o%b7^_IM(`!(YY4r&#pwF?c#NP|hkdXYqb1y^Dr#xm2+ za}g`xo)Y<w@4pTj1wWL8C)`hFNEr9W%33bCtCNm7L9$QlMI<|sges`~S=9Qf4!qaH z16XJ@cX@MzCNSER$Aff+E=cvsAi)l^ZQ>F@1N(X1@V{JVHdcXsf%7H3F$#>4>{3Ff zo~jgOQT+=(W4;NBKAdmn!x89^T;z{m%09=D32MZ7=8GzeBYFczO5W}|kfzqCJ)HNo zVwZ__n5KS514>9CCFlj#y7FQ@%8ZIP?T+I_0?@fUCTpKx*AR@=EHGA#7=LBQd}(uz zj<5xcAu|vx%9nBh-m3*4A0i$;lV&dvvM4_sSRLs!TCa&vI`tsTVfq3Rr`|6UKtm12 zCyI-<Sec8LE28HCmqjl)RA^syTlwLOaI(B)><+8*r7#K=o?FtFT4*cQRI*iJVjG;~ zNz2sH#4jzlV~upG71oHgn4xS8Jw(2JTJCWnc)cb>vLAkiKrawnibw~~k&>K##Qp@h zs1i2pQQORV@`@mH<zC>!3l_P+I5M}9N_X4Y8u$<&VOo2an0(FpzLnJMkFYTLe#5Xw zH5bgw!CTd~81lb%hUo2Rp#1TNA(<DuZT3V|Y?J=^yRTenciL~n;QrDQwDaiRmpkA5 zbPWG<?by!(?7JaOV)X54uVI;+v?hTpqPP!(yQO`P*V5gQ>8aYKPI69j{Wmp=56eC8 ziau#iyv;{;_;*>D_ORRN3w|G~mjlDeV=tD)cyP<!*n|F}Q_k^Wtdbo5Cm?)>DKrM# zX`hIG&bTZe#a3G$+!<x7O#{P^Pi8Wy0UcEc$5-SMn{9DMvq7*yOPJqGyeYV^@G(Y* z-bX34)Y?mB({M<3t~bg3ne|<(b+~KkmEMAWH~1iDdv%m3b%S&BG)t(2giP&k$4AU9 zo;QVkYd&N$*Am2oV7}akg(s68eHxkK1@w`61Ve%<f9#v1ruPm%)zJQ+57p>H^mi*| zYSt;u^&$6^gkbi7C?<v!)W~wal)fMjEU7JBf_|o|Tm&jq;a+?NlDfE$7XG}mFoMcz zX*T61AOk1=%D@_utIqmuF-ERnrvK@dlj}24!Nx{6Yj5!Css%6!Is>fd=OCuwKJiH) zCONZj*a$nN_$dX2*ezt5J`VcS3-NwK<F9bXCl~nUgl5*!_A2!x=5@zwLe~CuOFY|l zSBaey1@ZCffT|8WxsAdN)X2!sXa51MKdbn<@SjtMeJv9)Wu46Ph1o3Ndc*AfqUEA` zS|`&Gc|HBQjPfuLyW~%JEa%24uvTkG&yu4#m%Je@l2!4VvI@L21oWh|>d^2SX8lsN ziga&>WIyTU%Av7zW@CeQOi-TSM5qj3y^wjg(d2mdrfN*_d1bXlzeKcl%m_bZ>v9pE z)eX4hufh1u2THvKr-Iqh=_@h7Z!`56fKMhD$lo+}`9t_hy^$kw6U8q^i@8OmclG_k zw~X<)4K7)a(Tiq2=8kQZ{{PAcz|OS7tYfqC1TBC;fA8wjkFNW(TjnzT1m$0}kP+yQ z61I9NMYGdQJYT{@RhJl(rq1XKtMpJ`j;FUWE}&gLC5pEFEHO$;9U?<zT`(l6V{QFu zHy)9h=GcFO&uEl*&B`VXLfCrR<>B!9>hFnPySmHB=ey2sc(2zvs6MmVXmCOAk2U5l zlW-`V{}JWu^%IoeTU-B?$1UG^Kk=WhJ^!(|o80lTp)}%>#7AKf;^Nb5><c(gt+dv< zc;09W<9*{Mz>znsjK$fN_fLoTdw1-$QDyC8#TCB(6!AiJ`fB6c`o|S}?iX#81wu~F zPrposq@wZ$S_H~PXZr|S8Rrlo#r^0RBs)T8^<xAJ9Tg_to-VFuhhKG8uJj<h44x^X zpsBQ~;y{LcPyB)Kwubp)HZAUa`(kfy&Rojf;VbMN{SGK-dvDHg$<jjaa9HhjlvBAI zGdZW^)on-dKuIm_q$AVQ83`9GygPUTa+m5D0xffg#|MxLss|3;ER6_*K+2Q%hZl5Y zS=M~0p&m|*s)z_@flu{X?yO-p)xGkJXOK689#Ea?GrRO;y+<78*%X(1J}5BTN1XCR ze06I;TO8V&LtAgzmK@p=jQ=T1hvk%$P!{x*W$HBopPQXXKBSkQX`JfV&?U%SUW)}q zis#Hk-Y@3RK_6M0>Q?zlQu<vAXf$X8C>N&MsWK9*vBI)FR%|3H@MHxx!o!(29|)~> ze37rpC7b#eGszo;Cwn?P=~a)FS!ql5E5PIu3}&fQjM%5<oNcUTab@1FYaa;nuBx{^ zVq4hhl78BpW|qyA5wUDF6+_aOxRu^Df63kL6im($R=AHDi}9jU<>8F+z~R}sc?b^1 zLbNoEwB)%F+hSd8BO#<LIZR?3DZ%dUIh0SftmXQL=RQcE0uaN(y-q9JGL>{>V}GDP z&BYKWmmtaYsY0Mp-|0H(7;%ZxI97}#+3D?|$uMa|Vyj@<hYC@h)JkBb2RC)ub)Xh3 z)64cS9YIh?57^A}_{bGLk{LKeiPR8sO_9p>oENKV9E-1e%3Lv{!R?@Jc;-#;L;iB# zIahW3i}jJhhGuuNfn;AX_w&Z7o8MqHk@$srEcgTRBe1u;#PB==$)-|EHt&PqAi2NZ zXNq2wv&TrI)rMKUkt<3xpGWDyZyCvkK!u88^<NqWm`JdK@94jCzW@;mW5($JoIY19 zQve9cYH9Gq=C|Hxh93#WNDt0I2sV0*e)RKy@4nGvwIEFz1v+@hEIy!?5RWB6clyuQ zDP;?%CDkKhU$+Rj8k)cBC^%hC8e{D#4AgyIk~ZhJGRa>`?~;7GXOP6^hC^}vQiUAH zTEd0r1X5xWBQ^0o#dVBo#}J3w5`kKKtiRlddS&cbxJ(+;XaThV9%F2%33h}A<;`Y` zQN*B+h%31~o>cvr{Q%O%gn`dZPX6UL5lznURQHe_uZk?4M8)^iB=Yz28<8@iJ}se9 zZeZ_kkCwpQPTr5gLXgg`CgxI6sT*vmM^HUr{ilWs9wH`gpj?4NkeAs@_-7{w&&0aj zVG(dqO_PmuIz5?}m%M#cu$S^gMS12Qa^O12WE&6<=aUlWHMQupcX9mQ<==bmO%E3I zE@oMNKc$w*+7&co)q!5^iowTmbdf=v5>gZx$jX=2w$&R%CHu7Vs%CT>&Yo|7<kmF9 z?$y0Lce!ay9Cm$ozr!ObU&>zzd7wYs)b&N%*#}x5$J(Ctq72a7@-n}pB>ig!=I=YR zPFV-Zy@jlIrw)9%qb~*p^$v1I{+z!>`hOimYJoyqZGjJ!Dt4M9Kzan0>!U3<-McK` zC{_+wQ2|{VhrT}@2(=}%gc95s_wIn=de*WjEandqMX|CIfkg-%L=rDw=|N&YaU4Ir ztM=k>voP<aV}Fczy>UV2=EDFGjEcLWKNTqh$PbkBt&gp!$;E{!e)cRH$g;nO?Y6TW z>`P9$WCu4zwdGT!asI_fZWoUfyvjy<_+PihBU?<}iBBn{AHOi1ZBvQ&D{y=v%i<_e ztQ9qli46I+2dAW$5CcskjI?Yc)AU21QSMgmNA~db&KuBok`LK!RV_Jb@3zVm_pb`G zctQ9s$g}%OXphm=aF#Wy75)&sbfa`2cvxK`4hf@}ZNuK=#MbFgB(4eZL<P%|m2hU` zW6Ay@3W(Ixl23~BZNMk__L=Avt9}NC-9vkUpv>qS&_5$6GW{5jqO)@CwgT2Ipyt(m z#l$=LGCq(YhxKO+rEkj2rX5*eAcIXiJx-y3@>M5uOSFft^Wqal9O!ji22npe;Lr-l zNcKsWHbAE5P3T3NB-L8R4Sk=FsC*5SxNHs}!@0>lj@_~9`)%eP&Ks)Nl$h_Cfkvxd zVlyjA#XS2X!!kbqnv_E6;;cJwhg!4DK!sIbOxOn2o*`V^9EMa6NN{O02gGpL6EGu{ zAtWlQ%kZmaoQ$9UE7j%~^T6v?U^nwh{^6Ncr4ppMUS0+uf{e2|t66KE;>@G%g%Pya z*xX?ILYCZXjLI`QRwfko@@bO`jCT?*v5Fl08bc)g03d50k%h??=1WImgK=mcn7yEU z?^0|*yUjKnX3Mv&yyGH%W3DLROUL7qydai)m7QqUd^La^7R`+WK=Ul}Y^gqymsfX@ zL@LZ@Ek<;@`q$h1N7Og%l?6^(ulMY39?QzAHxMpKd*huLlWRF|la-E4KeDo?^qh}C z-NVT;Htv#;ZuGb2Zw%+g_ph@BOrO?{=_?OJ+r4%__ADgLw+htM+R?_q_AEBB;N(<L z;HL+#%|=T6TBMb{&n_vS<jE!?cS(novJOMRmpg(Qv9r;Jz44a1_ry%i?0K~ru_8gC z^Z1Ql0p@98`?{1OqTFp#1NDYwN^3}~r3_GUDO?Kerx^+<im2stD>97-WKzA2aJR`U ziCrJHXZ}*MDLjvT(PcL^fGu%u(hYwe7qIHXlJt$ObNB61*I!C(tG0{3CfK#{U`rLE z;}wR8lbHcppDGdaG|J8m{-tD7h`y<_DY=_1Nx6eEgNmn@LCd84nXejcIKnR_=2mm% z_7$rHx7pIXc$2>_B>{Z&elDf!y+kXZ`=w-4PCJg98-dN1`r#v#d9HbeBJ#<%7k<Pu z$yR?UQOQ(^?ho~evdxyN+E`m3PTyr`rmonur@_ab`lV!ZDF{0Y@OhgprN6L;U=J3L zTa|yuFnj9?3m75z@a>0BJAIz+-d4VZnnV@mIcmqe@Nt$km*P@iR%d~Zw%$0$M<yo* z$2d}!gILq>#FdKFC9Z?pi#H(>$_nAd@HR8-<>(M%02SU$Wq)B}G`F2JH7Jf(1Ir86 zhC0AiZ5G$<IF{EvcF0R&9SQ$o7s`RHL+%lIX;?wy?ZLl8i|7GHam8<Wz9mV+I=2qn z2X<3i>iR=bQ1+73OkfGSu4tfDRtV2nT`*1FhFO1wNt8U0!1gDfF4XSh@UV4JwN9UJ z>uE(PV$iZW<g3&d{zktz)&yAz;+11%O2A%+PCUS}p@e|)OMuw*g6k{%N85ltihWXq zK<mOhkbEk+%>R;FGpp%+E8eXkee~z>&eWQy+Dd1#$iHNppdaI_5HHs}#+$MV=Pq+7 zl6$En^Jas>fmuC~TJW4`IgLfs^HOWr4s3{LfEia`J=RJQ`=J`QNNn-q|M+=fj}igE zxdz_g;YuJ>!41(vK#!5~7KSAPIEz`P5_3m(yf`?u$Y&$RgnNMb<B{^+4wx7deTuU4 zx};UPbbEk8Ly~HNZzrp!9lN{{KfWDupx5^v4G+JhnD4()W1KQJZ!8x<JWcZ2bgXAs z#4f(JZGw}Y^7|t@-B^LK4pp6TmIjo?t(CWEH_Ya}bnfkJaQ*(#*xoeku;9$4q;$I2 zd37P#S-KEZ-e_Mr1@Rh#b{2a#5I%IP*^hSjCtNGNT4~Nj2znF4Z8n1^+g|rJJEXrg zh<Nm_U%{aD-2}wQ;=yZ`j}mj!GZi7&M+h%tIagBWN9Qdsj(o*GF1w|ii~^h$b43j0 zq%OA6y-R07lY{T;1V`dB6!xK8NP=H5R~PG+2s%>qUfi>8h5mD#g(OgJV;4nC0S^0l zNUL5pLz#HX{IxZOuRmm)p}23Hm%oSgq7A2(S8Onvs>dG73ehiLg8sTE9ypr_9zhs^ zQ3Gkw=~EaIk@FNZ9hj+AclI&lDVaHGz4E#c<vfa+pyDEipDu#K*&`q37=3@_BX3l! zT3CS^v`EekyjMH5xz2fx7q5hvyS&!*Ht07_(8eml!1V|$@mt{fX!B$180?L0o8G$Q zb~QzwJy|<L8yXmjnIbFaYmOk=%=)k%55b~O2$mXo&<_<H<3`!g<jAxoo+n!sNY2p; zrl9d-tMwb=-xwhieC8tET<h|?5f_k?0I7tpXO(nT;h#>2Cg)bq*AmeW?zXJ9&g=^S z!_TQl2N`x~h1gXqybzH*26ER;ma*O~1=rZ*)RXMM>Kgj~Cj9cS$v|aSnj28L-W{N) z@+w}FLEg0tR4gQcF09?w363$de0lM;3A97^zIm7ogj%}nVGB=(K9VOKs}(!Dy@DnA z)?ealg+FzJ1g=D@EG#@-_an|7dyE6J-egEFbx_%Y#YaP-L4x7wg^@1>kriY8EO^&6 zj&!?pc-1KK7^+39)Bi}JeCRd>!Ug~K%Wf(O@eds)Ds+UzIlzkkz$-byTYm%msSJOR z?YmElfs-Ekl1`@Im60ad=?#Rr>|wpJBsIw2cc5v^--$BDXimFKiWjIyTN_A<VFA<7 zuryOZT8JPmjO4D+qa~E8Fj@6TU6=NfRr9p)%c3T557s|W>?_K4<Glrib9^OHQ=gj9 z*cVAs7)`l=Zpk)ZRce6Hl->_{e(iEY4*9plIa|7U%vd|waEi<<i-gV74>=*-RqE`D zx#6J%NVwAY@#IO_Teu)(AkmZ?E?KWFDS;p+AhNEx{zcZ}s8sGIt$S<^U=!|{f2ehM zk=K|d%v>E{k3y<dd0%O7h1M6J%_)3AdNS7WwgiDSs3g7?VJlFW4dtyPhg<G8#){6S zM|iLDZ!4>V?Va}ET814kZ_cili4)X@2{Y(`T<K|^`DP(G3~AiQ%B`Q+oVkcFrOT<z zJ`I(%eo9jP+DzW6^gquh|6P}|(t5kk=={dk2PmIo`0W6cS-8F{zOr+?<z<n&IvY}t zSVmPZ#Dri?5fH|ViRdIV%`C@N*uX;rZP%AhP5r^CURl|ncYQ}+5KbMdcN8@CQ7E6V z?8L@$Zq!1(lFtwI95d-yE0V%4#8PsE0Diww8g2hg?m7Ev>C&N<^!E5fhoC~OhQSK7 zt}hpn|4912`egfvA?ZR~uH|JXb73ka`}|&>bu5t8hsz58qirk%)p3$csgToewWg>2 z;LvxQAu)aQnVacqT35h0y7}a4Nof3#u^Gy=L~6C*&iDg?iH(h;s86s#Zn%3pa6$Io z6R^gQF^UjJN0gOH5`G(6QOBa6vF<V#W>&9BD;!`IMXbVmJ4~7WB>ntxQlUG8tNq+* zT8#`(rPya6h~^M31z>725SLEpf_NY^a2i2i607#xdSj79O%o`%il^A^?xJEy1Gbg9 zd>Lj(MHZqnldTVevteLz&a>&upk4DsTF5dS{j;S+UygD&jSKCxo>g%iRng-pX^%za zbu;Yj!(C8+4#`Gl4ya^${kQS|sIpcbp03xII7B{W6##|{w_gkOX@tNRkAP?YGE5_- z`UMONozjaGv=tkPf||JVa^`=cJ3H~eLwAgG@?mV)^vyWCHEPbWazB<~g(G|V7nzHC zly+e4K#y{Jc6W^*F@uTJRxBICgn9>YFk%!Gxl|Ype%+lc)NgAnQL}(u_S?3^NQXn2 zE%i0zIh2BpljKeliR+!oL`h%8AxR-AYpt??xEOlS_0jykx)QBXTI^68JbDG(KXFWK ziF$t361BVWxZ)_`Y!0cut@)+@X{BAV+Ue#$V93;@EZ!(BfjLoPls9U;Jr{}9Vx#c; z?T;zTlIidR;U4(>AY}X4G%+|rVPyIgM)1<7qCzOoP8@8sKXB|B17QM`c-*wsQ0q%< z2fjv(Ps)vIBHXfh=(!t(Y|qL_sEOI@;&$&n|7X5J=t75Q^*E}X>em7Rk;!%)ksPF? zdXn7vYG8?HQ^~j=0iP!bT@UpagL#>N?czW2r@+FfU>Dfi)cKwRxVcE|BZeI&VOH$x zSum{iF$^PgaCsNDD3bb)1|mAMAqZc{l#!2JHCB0tl{;XjOHhIV5Ce)MAd+`(k@zpe zixs;_Eea!V=#jKoQ5|}Me?p`Ofr3gKM2R5oB@yNOpF-#@Mw{*VV{PuyK=RkVda)YQ zGRtip&sZ=G>CD7QL?~Y_*GEalNvPng`baMc`Z24T$?tf1*kAO0dKiT?#~H{AH}yqS zuaPp(`)LKNH2OXlw>ga=<oj;RK~FhQy4cOM;061#_5_dhkgN2OjSU#jmL?%&jMFlk z6yOju-FV@Zb|wAJD42j*iMyE)518jidZMv&s7;)pxlo78sh4S&iIQgEx_lBKiV^{# zzGVZA=&DIi6u^<yS*@UJDY7v!r|qmqJBlnh*+@2(uv`4v5g)A&p;R~RVt~c-R`kfp z+ij+-WFPCXB`|JIb-kVb+~d`d%QXzLshVL|feO6H`i=SWE8Dn2grGdyCZnMbGtftN zf{`-5W{dO}*Gi4zpQrwcc>aQCn(7L4*4Td?<F}kO=p65F=Wjxp$qthsD7yLIYe>=h zIov#R=g~~dQKGqI^onfr@L0~aORv#L9=LBFSd;uuOcL;?Xdnh$BYV?8Xc9ysCyE~b zmB40A4Dvk@4_Eg9_sfW8UpHI%7#z*(|2Av3vc5vgxSx-4_q={65IF^#>At_T34B@; zDfUUUsH2xS?i?)CV~&JlS4G5}CbBKUZr7;wf$K&%gLOUKrm^V5z8}4B#(5cSWNJ;9 z+_*tIC9>zb3-`^P#TLG83|8w#hf7ewJx^oQN4+HNREo(~sIzFlGyhI(aLLKk2Ql!^ zYACFyEZGT?qGz}TrB3X}58Jgn?(H~wRI(TnHoYVE5Pv!v5^=-rx-r}G+yF5X=Q0(8 zN`Jy3S&NWvSsKbRiChbQB<tRT0F!elgtHimzU!V31I4I%owS?po7?@k&YH^$+P_FI zpNEn~CqNHn4wdZ?wC!3gi#&Ix+5XJP|H^J!b8&<@z4+1`vsffOUPjC@ih?EN^jM%X ztG<HeJYS5YAvne9G+)h8W3+N;!9XD2UFXu~>9ayRQB>tL^oe3+B`(JTqIUB*Xn$bO zrjjZSPD(uMm!>Kwcm~?)Dv3Fqe$XP4rJ`3{hIR|2O;}y2dq6mAA_+7X!M~X!A~hVF zE&Ie9V077M+G$TyD{mhIX_0IzYDF_t_f~STTs0nOKH*5eD_Us+4USf`KX6lzU*(mY zpMeqVU07(T*z?52a_lv;WkMkWd)o2;+!LUlBso6q#OZ7VMe-hY{8!JM6+1WM{a9k* zxKou&H8)AI;uM|*Zgul|%qm%D?2Mwt?EV!V0MUJ+z$1eDyYB*p`&4Q)3(00Qc^!rM z;QECVUezysNXZqOk1yrpTRTPR`taYWXC}-5qb8c3fB2uUbm;WvdlLZznUkNQDrayK zeY#UkL#~_fFPEau#Iq!-nm@?9IC>e(pA)e9r_bd9=r$3HWTWTz@qSu)KJ5ZS^HVO1 zHMC%x*j%X$iXU7pB!xhi4X{MfND!0`TxX~MP&}Yrc^BtN4nqaB_mU7uVi*fzD(qXb zj6DUguP(Qy=h;@{@Lh{>gC*=Q)E3S4rR<L6mZQ~YB<>Igu9IipI(Hj5e;yL9hQdV- zZesKpe1gS7YNdK{VEw#OTk$VN_K^4ynbZ8_&Offi^vuthi%uKQrdL-qJ~n0{>u)Km zb>d2Qo;o6Kqp5*SIfk*0<nfd}6x?aaMiEPRQ^FNxAcOY%LK=J-xLwf3C^ZpOQhWLV zvP(ZE5-T3;838qeQKK$)u#zP^gm<RLo!45<uINahn|VTe4jncD=QrL@e^nz!pHD|O z%#W?>EeicH2=<HFDRw%j7EA@%K=&gn{;clT*D$PxbuRpp(y+<oiMNuyKrytmpFb#m zT+V-Ox^7kakMap^+v9H^kPuYK21mB!Fgxn&25YqAu29cwHS1K8S(vb~1_~b&%AP;7 zf-@gX3|gdXR`(NgS4BbIKV0SU+wzdX*s;6)3(3>6SJVV4s_{-ElDvH01Rp+NwiWEP z4$Y>#w0O=kBnlCEn9;Tdx(J)>-}O)meoUvoahhpa+V)w9q-uJ#zbt}@oL^hHxdT~t zdN(t-je57;V2w|XV4YP&te1qAL4zua7%(HLY@mPSZH&9WlIz#Lch#|r6*;wjzk{Hu z|EYUnu3z4QSmE0y(2JLg3IZCR`iB3&3P9h>Tz=PHa@xu!Qzo&X3nz$z<sd*Q*p-M; zZ?{uvAbR3x8F(;Ms0XA+ps5xr!{k^G&9}iQ`umKOzg>bpoP7KAF8(}gI+Aib@5Ky- zU|+Q=G7T>F1t!>ls<TajU;q-=0~jFs5mpMLc@sG!*xL_~`;qNz+b7B&z|ah^l1RD+ zvke4mAu*6u>uY#TbxpR8Qq>`cgHi$hW+kk@rJRz3vX+dU+U%uO&*IMFEL6fWsySkE z6LRSKj}OJBS0VZFNA=~h=YY(pOU;J%$=0Zdc8fL9gFKYC=|Y8_Q%3Nh$#zxVy>u1q z(uR2Civ3#vpuAu#vsI|1V1c`LXyclcV_mfI`wHnoR5_#JP&?jM1}2An4@eaAF*r3w zk|(xD8Hs-w%bEV$UI0y$NBfAi%GHk*l<+o+VXPl_ko4kCV~4>z`{AVxDCNa9HNS8r z#$5Q~c%t@v2flo-uw%^#<R&zm`YHrxj*yw^&x6rxMfKvOjdpj^tC-T#2J=;x?yxL) zY3TTFuQ6nHKD#lp;WJWzWJmVLK?*j;G+&fMY3CcJj8gmOY?OkIeHQ4oS4^3sT7xO` z*t=#xY|LpzG|YppG6E=r^gugoI*DygROP#^TJ_+Gxd+vMX>DKKTs+JcylS_oie&3l zFGd$!dowu7{e|UQ+2$IdGpeUSl?pF^E~4v#V=t?XAKZPX=Kz0mEdZCqb{JS;=zY=k zGxA}Z*9PDq`mV$W`ResDMzX<i0tAH_sDZLcqMI*?yf0IG*ZP3J^;iy8!2S$9coW}j zFSVF^uopiNpp2Vj!6Av_!G#b66o*n}oI?RDuk-u8JJ(;Ys31jd5?H}`W9Z9^uB-MB z?6$Qy+NbJB^5%npOD<Ld4vcmjiJjDEY!@m@t4{93ST>&oq^MAV8Y8qA4n0o`G4p@s zBjNuek7_SdpvXvl2$8S+r2Y4y@wpF@zyNC8=g<f+P2yvPzr-?B`u?SdW{6AzRhJ~0 zek$&wBpUlh`XUqrzrk%w#&{>sv1%bV!ni<RKc&B)svU*21Vc#YmU+qp_2gmPH0egE zFFP}*Vnfdp^y4m>u9ULua+&OqQw@6QSE;=p%bkN$)`kW2n3#3s+vXj%B+q4F$I`79 zmIf!07Eao3MNC_49B`9q+%673p&)>epXl2*cCVP7?oe4hy;IyF3>2J@t)BvuPS`?U zR6>2H>7?(hVR<oVY{yA4uloCrSf)Fk>{_+#s!M+mRXcfB|0m>Umkjjp_HLsl`JDd} zIr_;w;pc7arFVFw^$}d-m_9nKy7p>)c0AkJWg3jSsZ+d%Ouo5ZQ+suwKPWR%Rrw<V zv_ppq6V_iN!^Ra_)q6iIw^<w5yHucKc*1d<`$#V%v|d0oO$Ae@>9eWi;ilL|MCs!| z#ZO}a>Thd{2sU$#wsWq3=olH>eAIZRe-(5QjP?udjA+qE<V~3SeO9m|=kn(+tuk#h z2vtjwgkKY)K!pmpIRwe)qHokd;R3IqeB~&5*iYd+z8}rZ$;}c`C>&;#r7F4)Q@+RD zP1!~Qb97AOMm|)DfBG8US>T}0pZ@yZypGHCYXetiH0mtyY=#0zZy0+s^<g>KYi#3* z{>(0u$E2M8M(q4hWchBD5x|V8zjA{P8U({n7Lr_Az4W1<yTR<Z<lsibYlw=d3mf{! zKjlr6CE~X?UFa*@SK>jftSj~yYkZY?DpR=T!(SY)k7AveqGQjd)A7%SL5SQc*yLgI zK7L?K74gBm4om=AP69E22Oz^AgN}l)Ma+`ukMEUF0fmz<LFJYe{6*JCpdyM3l{<2! z&;h|drrgPet6k=#)L?gKltEE}L2U{?f0Ktp9`pVoJE#?T)4XY~&qym48Euo{`8M$F znt*zL^yz4}IUaRj8bp9OkcYU70AHUuKs?_{aBmOn5nFC2wI-1ET*3;!sLz%k4gsAP zdjCxx(k@!$Dd#qt%BL#LhwfE?2*xJE$L-;23UAnGc2}6Ewwow#X{!PV0^(c^gG{Ys z$ZnbIP~qzHc*zw9@*|aY$r9<%BK)0L7+@KBoXiBnGdixF^!k$hbla4vb4mHJ3?ElZ z{NoX1kkPQQo|Fp_9M*qMvSu)B0q8fWNgLgiX6*@kt(T^;RGIF3hW-WQ=AizaZN}ND zCs0yvx6mJH#rGYyHBdHW)^ixvlw=GMZm0bEQyW(u>2J;*Lb1;Dw<`0Ko0mtP9V##3 zdLfMy2c6U7u|j&wTmzP8DoJzqVj9bhkk64KmUsL^EU{}TC=-eI-YEg;r%c|iIVo;e zNy%wXAtSMkDU)l0;oJydaT3@o`>`=$pk=nEc8Sg$ZjpKOK1=Mnk>2AUA`T3$P3I>O zYk7r-B-b$Icd>;hCFFj?Ns{(o8+OT@!xftA4c7AYGSl*RaR+#T)xxEH@n)C#1KQD# z+Wm-FABGs(p@a4LFW-;Kxnz*11hLV%tGMf!k*LOnUj`uB8o(9@wm7iGfh`XFpTU71 z;Zx9MGKRi_at_!3MwV?JV1&7~?*om8?lY$T-gWbk4s^dTbD)__w;yWIU%o10tw4f; zQ^XDmcw9em67Mq0WxGP8LwV8_FQL&^S*HCw<RH_!R1;McN^w`fPzgJi%$9}Z>qSCv zB?O~rDR$u<8FDhG$({>+?kJzMRt=c%>&3Wb6Ajf6F3Mu`^h{tkz_{6g7DRR|>i|#5 zRW0D$Y-}=A0dFZIxgcL@2U{LZup7H^x3A7x*P$fP2lIv*9`xxOHBpsu2GGAatj)WM zhPv@Yx6I`tW0#_E5%lQWPcaivhLQ^RyOg8XD7XE+u4(4J$KImveepJ!Vw)LUY4BF# zZ|kw3?sOT=e+fZUR~f4zwgDdA`v<3Oj2*9fzxD$aBdoH$w}K`DEpbqH+XFYhg<K!* z9g@J;Q942C`&|KxaeshZYX%iFMy%)%d5Fkdv`!oOoR<?`n|&wq<Rz3x7?3GXKUVxp zp!W~EK*eyn&~rUWuKom2fV%5jB62s1=;N*SMOmmM_4!Y|b_Y2<D|!DCsF*6ouqAF# z7Nih~vjH9jx*g=X+7enLevY+L<8-_*`+55xBX*{OiZQH}8EUCA!iUXZtO&ZBlep&S z7CuB2INC4BI`_UPEfQYMIsfSaP%&@U#(^5NqGUz{s$n~r*2^qI%6WM@69jVQPrpuZ z&h`A(@%SVd?INsKyo*dmpfqHaMHaob;$-O!afBwSdyx}cto+Yqr2&A;@MR>q#u0@j z36zpJ3t$jZHn_l&g@()5XY6u)u?=IbEn{p*6`uvO41E`pr=5}GH>=0tZs3FvtqHqd z%sm}Yiz&AF7>P*Dy{UpVh*13T)gg#kYl=%(Xi`A~@u>sFWachJ$h?R(Jay1*<0+Ef zRAIt?YOm{|1bthh%9oPABvwSO)@3fIcsyMV@x4C=bLwy%_ch%E;>?hE$r^iiW7L|X zM6x%24j<_wGij22Si;+RCm+@m=>HdcZywg<x$O<V-BzhZVJj`D4B4%f)GdOD%o(<| zmTehQrBx;YL5a*mgfL{NP(=!aDlIcf)e5D85RrL^5d;xPROTsRh=dSGfXw6bKB0D> z?sLxfUf+4YKhF8i>BV(%1@b&=t$W?~^W1Crt#vb;B?6^9^%#=hid9veg3)M!seF^e zr7de4;z#%}RfPES>ZE0H$#_G86PQ{-xj5UKgZb8_eesVN>2p)SPx;<M@i;V3&p$Jx zuK|^vk-Ud638J*R2ZEW~_3|Sr#(L{V)Q><gz%IKCIMmGJ0p8E7yK4=^#4|q~*dZ;8 zJJJG1h5l^Vg#uASMz(h2m?w13WaZQ2upP)~?jMBy(9!>C9W7238nWb!*N)lNql8|< zSX}Ba+k2P%GVVIRjzc=rRBIWcvN&ZD!p!>wSDmHFtgHHg%ZH8{&SwnH#VfrA6ww=V za{8VeHr@!8oiy51fthjK*HPISTH@=T5qlmt%3Vm8FRl&prkug0t9bypDO#R^amD$a zm{pCr`o<T5JGfYZHsR%>;mMJ*Ba?_Ak3$CJ>d108D7gcK6v_TPbR%O$d>$1brlbNK z_2q#&W-Pnmla>do{JZ)+USs2iV+?Gxh_~N_GQ)W4Hij1${R|15cEZ?^8kwHBp#dSp zoNuB2tkqk{Sxc=bNECQ8Q4RHld!&2kq_}*Aate$Oq!hhCC7~mpu0i2`m?@^%_4T52 z$aqIrdFrFZ0@?@z(_NRw23zbh9b2&APBtFyfLa{+_5#yky2>pwM&Z8-bKB7-t8t42 zDW(yJz%Wh8V17zN$awuu?DESJf9+XU=B_RQp8v80&gQV#$3$7>VWNwHHG8B{{~i;W z;~*}iaspO-?$CAkR9vM+P0Q=p29cTV3aiPYW<umC(0KkK#vj`FFSj--F|R_U9%X<R zk^Nej=ar%{9SYjXN|_Jl-^#-)3FWaGF`gE*6VToWBQ*W=q=}`N8N%N7Jnu2>S61St z_=*qv`CMFrIe%;UYaA|aG0bBM7S!RC{LrX&aY%-;ae)VS#(E4m>NzR86X+;z6T|rn zYmHBW{4bG+fJpIO_y?MUve?&3ceTHv((#z^wnTOr(fe(<+Q&M)r$)9=_0<qn>FYLx zTjojL_435vlJBDsNz2y^S<BE`)YyFbkXOL5`Y`g)K15EVX5x^u#wD|KTq(CL0gYFQ zepl>I?ITd)bI+Kb<&9g<yABm#CQeZTg8YxIxFTFiq|iz>jM(#X&N7JvDMKfg<BnL$ zKBe{6+`d-6pu<3u;MvakoDg`w_q5sJ6*Ht0^NwN9Ep$SY6WINPu?||mT5U&Uhof}= zp8T{s?1j-6Pr(0f=2dSNo&UNysE>w7EqpTA?Cd=5Oo$_&gybAxa$@3>OR_c@%mAzg zmZ@r24p><yjE}s0fh*U=k7+A^AF%%0bS)<c(&0WAHeF`+@A4K9g?_?Z%{x6D5Zu;m z|ELb5)<s@}l0FJE`HSG(Mr|JJUYuQwm%--fUh0MR*|qqak;6hjE^wlZhOLqH5Z(?= zK#9|)_xb4r)S=Z~ch~FxS$0S<<|aJTyw?$`=h|z?s9(yUa*C%98=&l{AQv)C#cmr- z3q_{ewt)SSVs`43qYF_NnrBUHy`lO+&A*F1IGt0Pp8<}O>no=FY<LKa!S*XUE=;yY zc%I)uh0wtQ0F6b{bz@LKU2wOb)V=bjZq4Uf$;-C)VtNMq=%6-5R?1+j6iaM2*gZwZ zg)7v`9!OZ@dBGlnEJB|D34KsNT`d2STS(Gd^I$2Xa_RiLjth&NU~rr%#`q%zu>7{C zU^f;W7ZDan8%vE{ar^yDZ&u;%w{81h@w8h+yx96$X*?!Dr%hNkVvjqyZ)Se&n30Z) zq7C>DPIsRUL}XnuS~cQ7lhc){;<1tC%V^<fcU}vb2YjwA2m07SgM^u;v;|sQ!SIU# zR(Up9rNDibH8;$xC)jKF`;}Vl@{)u?#fWcrp+KaoG+%W0TqO~+UMe&rkn=J(s&W%o zR@TII4G~_-CGC2Fjf57aInk`ueh^o~7k&(}P80!=f8(~1YGe6}iUj%a#_KpnY$tQR zYf1d%02%LBh#T0OFgKitAXF!+^I4L|55CIGz<XA@wEiXAnycayJK7MFYqq!}*M+TG zL``u6ZJ&DPgaP!rvYD~gOq&V%v-S#suUHO93t^)pIF=|%dl{kJU3;<0nMZsAK4S}K zu`aIDo`4ZT0>Wk1CZl6&=kH^OfNxNh<p6V0@s;E=WHE->EaAOs=`N?Va4KiS$ho0N za{T>L?zgc@3fKV>%pEez#j~rOieFOimTIB6R?rUc?P(iay}z6r175;=2>PIVg$_-% zzc{w)`1XTt?xpsr>CRtROBKL&iZ$p-7p%u%RDTfoudIWOS_V?%o9bi;Mer`~libh_ zv5|?MxK!e~18lAg8-<uG?mF3Pm^1(!kn{J$5#{XG2f1vnTV_T?TTBAaR<v9y<VPVi zVy6*F$`wj8M?6+5DMulV4|k-t^e{X-_@%hz*Yo^%7aBl5;+M4S?2JB!Wd8WlaXdg( zqi|Db?rBe(NHa}_*j;%Q*NQCT!8~iSQcj)v@IYbfXm);fR)#t#i?$#I^Qq&B>&14G z?~R7CGLA*u<+YbEGE3P(o(Z^)r+rVmkC#l)62S^uQ9cDOM!dd!KHJH!Ov$P6^xOdZ zVEIn@;k{B@z$%T&*y!X@_Eo}SZ2Z`=YzD;cv^;(Ax&X^+zYYhqhWP_4P|?5&SOru~ zIBL_jNB6F5(?GUO<WW|JSVUdA8SLU9s+RYOK4iY%D5U86N^mta2qs7jAJz^ew(FWi z2t+b|$B@iT?GrZq<{Gf~L<;dCf!jz?A7*W03{9IfOEdF&GEM!jRKP2Q-c-u%Rk!%; zU-5%I(a5NC8~+4FlvRy0Ur6sZKiz~6CM`5V8V@Ock3<xzzFa|HR-K-n*MSZl+v2AT zr+&cw9*8Kz|5a-DNb_;bdM6Q3fWQeszc3{YIKXu*mwlE%MGndo(vRU<jzYzsRld-Z z92AInc)j?#v`02>_Z{|ROMeooZ7$$H!YZ`~6!R5G3?YQT<$*f@fmrfm07hNxKFzLO z7``!bT+^x2F7wbD3a9Pt43_I^@=NJ>iWb<Rd<#HZ%Z2)hGlcQ(Ri<#kO&{5iP?y%k zZfHp<YVBU_cSYIY>M#+!ZbwblnCSbVvEoOJt5;?+Y8{>l5x7(;Yq0<I2Sq8L8L4=R zJY~6}2BA?NPiqzQ@piV!)Yj%rwWEs81(>_%kpkQfrr|I5Zgw?U5<CQ7=C@=1f={Tf zjb844*;p$zqSUJ$BF>{jda%*QJ6kVLol|9@^1w*ny_S;Vy<nlzsc~n_^MF+Dq+{D` zE?WcQV|18<V&?nI9n9}w$PjOnPRij`;IDGk!f!YSg{Jd)bbi`(u;eR^;u!XlSs)#> zPF{F}kXRA*)_+t4gpgZSQRk0oqQa4hD?ODULQ%k;zQ5uLR<l=H<Ai5b5gCqP&p#n; z6CHs#2eX5n*ihf_JTE6SJ_7E~3iJMf$dIZ2+T<zN+rw4~@vNegNdI4D{T0ihYbJOr zSeu=)*oaJgDXzb#8K#<22s*n7Q~S_yVs8(nb*;mH_5Mzld`1V{(P1VO0qX;6JNiWX z9TMkM6R)(j=`>`_Z-5H6@cy(z3wjR`Obw@m8iONXucSNv2E{-SVeaV)o5kWO?eNJV zaOmE>F*xNaXfq6UJZD`5Z(DvMi)pBJNL~P{Kp0`PkxW)7o2mFrdo~}(ZAG+9V3)&} zx_Qnu_Dy9XP5IfeXA((;VIcDX9Si|i>5nlfmyzW}{_ECTX#BPy>m|R}-N%wAf5hMl zFAq0pzceDfB!i$^1h2d>07oT9>_di!34-8AF7K&f1*DUTSqEN*eGJyc92+3Mb{Tdc zE9EzD-M#0o?nAtmM63kL<J7@ZIj$yvH!I`yXj|IMF^ZCiC5(mjw2*z6X*~}X3fF4$ z1Xm+h+B@k*LI_)tFsHOacpyeKMy{bCw3+w*zzIOCQKg=#1s9xIj)sGSb7f--JTYN; z`=#AjL)cH)+~gaEN^Mok1P=y}v7d|G2R6GEu{A234Hq$~63X_bT)&8LYztp|1AigV znie&Wm=rdev-c=^WZg64H>8fLV?_3a8n0C&_A|e8zE1*4y}`Y(g*Ba-^Fk3<M{U42 z5jQmZW(BGVu@d-uL<*9|d}eo%@ykN#w%@=#vb6ic+j5m!f&YyB0p_eZ`xw|CXA_-6 zWBcO`pMq?Kb{jj2>zCyf^f#~`g@(19_OTX0Bv5XmpOt;p>$vl`#UPZOWuI7=DMYFq z*onnzm(JghNNMpc$oBu`khG2<;8k^-DC3Bxyt-7H{9ey!?&TP#hAfqOxWSobtElo` zm?m+-v-K+Q`0^i$AZoFCq|#Pm3nwq}p>T(I|FOo##MMgamv;6H`2%j%xd=28zmM0N ziTMEEyPO`8QA~{U3(6)y%M!s3g{|kDxV^Ef;(YY^43*nL_|L$SzIJgQN735GpI^?5 z@aQB?cSlG{m6s=%;;Te|b{Uz!!^IjBD7CUrCx!AVQF)hWu4?SCNwkb)y{JOIJm=Xw z!A$(9k`kC8zdXr7l}%Tdb14y}Dh_`&_3kPLg|_d_WPENm1Y~sr9y4XcUz8=VfYMTK z7R~i^-ss#cEGRbR?<PNG0e!6n26`ZMsC5e*=`Clal82r4kPVUXeXDA_Yr-1tsoab? z#hOv!G~<u2|MS%XK%}hCTnkK{Tk$}X^lkbo%iQC=Q>Q|if6r<dR+#MlndJ53l8_bZ zc1>6)dE3*V6o!x<ESy}1yx$o#YIMvwYC}F=84z)w_@$iSi+aJS>stt=BvjRCPtU0? z!H?&6S?1;8pWka#{znMV`sot?Qg*ab1~%=sWZt}%2cH-dGDRU(p@R!%II6F>cSA@) zyjz%8RqH%7snQd<(U7>gC5?BQ-)zQQn**ZgK_bZo*FE?{bDArbU*0?yLh0s2RW<Fr zo;X$L;<GS**S4GO>y%+9#Ny8bb{&I~%6Zr`B0qKaP2p<@Zi9aNs%@Y1Hhw_p>|6XI z{eum07q52RsvJ#wX_^hmvDx4J<mSmJYg~k$LZV8)Ytc`TQ`bD?Rbgg{B6@g0f>r7n z=I1#mGyWxORovDovmW|uvt%ci3O#`-iR*}!6&=#n^xCV(D;4hWY;K+*?QjuiEtHP? z2)Q8FB33I6Q0nR_ZDlGV7B-^~Nt;%dlokm;MJi00g1k>^*$oY!xIg-^A|E$D0%+7e z`>&j^dGx0R<)B+=YRKH(f+8*FVc8a%iZ~MU>fOUNQ<*<gARMDR2jR14fiaIeCVsbf zl{B1X+_i;M*G^-QPTa>rZBWArRAdY!_vQOA+mcr&2okmeZ7Efkd((aAa(pPI5G#A- zi~JI1iLLl5DhCx?t(tPQCY;4IbN|wrV5#F}-ReV=zC2vepuF21Sy7buS4VUIwpmks z6Q2;wg58kO^|F+;A+VLQBMDx*-&WJ}-4@Coq|;bzXZ(77NvMn%p7Ng3#k;Ro8-#|o zCKD#zntVnXkk8x0z7@H@t_Y1Z!G+HK$vr9t7nb_uJ3B*y@;pt^Lq%ggs$lO)m^A`} z3m|QsNGn>K!+D<sq5rBF0r)GQnlMqSCFA}{#fhvjk9b1W^p&X9^jNEa;H<%1rUz<I z!Xh0-<2$mQq*0`9vFQl|T!?x$0Hpnt89|x>?!7*}#P>KrQxeO|m*y4WkeLu)SK`O( zB?lQcKa`Sc&adTO)3>6wtQYgPpJ2e`JgjEXw3j@1vxpG-3{(}Q45ZyG_Z_6FXpdm; z;>)Wz=YZOJqw_H2>Ro@UNUq_5K)a`kdkI6-27R!V^VI_mjtD#Wg=fWjNX-K_ZehIM zdG}E44(GM3^$ZM1+XQ*vISD8%aJyY=_k(&FNKCqu&8@^=$-cCzz71;LiS}iTOJfq< z(b&4Kd$9*y0o~y&nyq9@N@LB^9Na>bxgY2uYzc8X+VkLRT>!k=_*k4+aVtneV|ZOz zS3k;&p;nh8zfT@~k6ZZMvv<^5-t%N@!T7X%K>W=IXbZKtjUdVmWiI~RgJ#Ql4DB&w zfV2bD)r;erAU}(1os2Ix?gL{JS=MCA=7JDq?yfDKSD$I&jZbc6`!qk^U1~}xCLiGp zWKamY1+X$<mc?_tZYJ-R(_28=*_078;Gjxm2BXl1QZ{7FQ-*+QKd$w0y`h4X4|SAy zFuCXki1oZ2d=q3MJI5e16roulE_s5_ToDE)N2drl4~e5-*l`Bl?M>nu_VoJ@xt#iT zVgjeC1=?bTd9}q*;~n*&hpsQXh;$g!;?Q+*-CnACG^o#P8*z|qR`OVV83!T2qUgv^ zQg^@Ii){2Hm#F%-LWq7GURV0HE~l}1Y;I9t=+e{lOKhJ`6a4T}R-(1p%1BDDKo7Z! zvX*bxV}2td%($}$_d&>3+}-(<h~YM<f?_30fuvSJ1;SI-#%80=Y9GvOs5jc#gz`SY zIPGe##O!LDudLWHIYL_QPLLs8Zo9866OZ-ba81=y40fB}<$NoIF^5cp6N|SmewZYr zbP$i~A$`fE9Ypr~CrU4_Q~#nnj?&SN9?&fSkDZKNoQ3vd>Se;VkY8`rolO~LS(H7l zJA-o2OnosWMykc1+Yx>1X>a<p3M*s}yp7q_raM`zID=xv9Awdi-`@6oDEIj;4Lk_5 zv^dy0WRnACE&p}Pgi3ba_R%S0h<<|ZR7^Xgfs-qn91I8#VUB4)=b`Hkee<EmH$@3c zZ@DqE$$^e4;D&*%xt_kT^u<{{+Z4s)hzWI*gR{JEV|qoSda!5mqwKt`Et{fj4wen} z_v$ZyAv=iOR)1>`MD;!9Fhb3fgb=x8^{giE1YK%(Gm|F6lF=WIb#znd>MKNKz6=`6 zhsSiTYpRD|nIijJ@>51`KrJGo=jykfu#Q(-CHN$CH$rx@aeI*PCi^g(gscT_Q~w=E z+CwG<1)lz_%{+UUL0sCeU8br-Co{hh_8anGE#uX}rJ>&<9|OuCDb3VAXyN-&f$i+W z3+uda5(`pR<Gf-T3K{5L)hwW|B43W7mIn)AW`fqajBpZXAQah94eiWuqQp67E(9y{ zpksq*h)1<aTF=AB-|hD@hmDh5g{}Cw#^IE+V`~|TK3QgV=Qu-x7<LsV%YrmmElcQ0 zF=Uvcvyz!?77}g*chr5Qn}W@`k^QfJ*%oKP?)h;>B1FP)H3;Lza&0h=H*nvD7TgGR z9m9i{I~A4F%4q{{^^1;^d_N?u2FOke+ZTe9!1iKC^{kkB&S6<jjhGp?4iPD10&K_9 zZ&n9`aEcE6LG(AB3TumzfP)raE!%m5%+A?U3Oj`JH7c0iN$Dh5h&&~niXY%G*TMe! z@1PEanDzR{lqK9gH*LXPQn~!+;)O<JN@|@T(E!q~UHfxo45`XM&wgHTAl7Vp#Vxnl zxkA}ps<o2yTqnk$DZ;{ELY<aAtSD5opL{sYp6?$nT+90wn2|-BArZso`M_Ztd~_*# zvetHPwq+g4%8GpA>?lbFhU?2*i)CdLLs-XbpQ}LQx-C*WRqp{znJ*C^E*d;oV0fzZ zy6REJBp;hPj*A!J`PE*j9d?HxZ!(MNtZwXJe+eD)={4#BKQDs7`#$^8^>5-0Xf@9B zsKkWaMA(J0uGmPD+`Bv=)Eu>kyEav_U;D=`e`xHF1@p)A@;~EsG3<)MshU1xOW-51 zWnhOgZ?iJRLfT6^-vvvGMTB?RzO*E`eFD`AY17h|WJ9Gg=BBolYUHxm^LFP{xd*lt zI`Mg`7h9xP%+9aHHl}6KyA+RT)Y-bK;w{ypa(A2l4*76Y2So(fchbbf!4v%BD!rl* zI(u4Or_~CcVrK>)IHGzT4Hj}f$dh!g=axtC`Xd5DA|PKsX(qAFyxFVHxzRhA7YI_1 zTp-$z6E&x)xz>g6lg#^4&jZ+}prH*sI)}7lhL?8s(BC)f-y_Tux~Ro0E484!Zm^fk zp^B3{I-}!!+klsI(uvduS}x&J6Dwun=09DDZkbbPev7C{R0tY}bpxng&eXQT2Ci@^ zP89{0saF;Kpl#=~SQ)wzozXuj!d_{{H<Ht|QuQUvB7G~-kgcMTerZ+V>N1V+XTrhe zu}6&twiYOOMYyTihf=k<c?_k7`^Mz`Q@{GkCfhVE$)Jfjiea+JG|*zbdWqm-$#!V2 zhQASq8_Ns=4bI0$k>>farU9d5+TE_zddak?iE9HI$HB!EQeV?f>qsVhb4&uo)PJ`4 z0+?jHnx{VPdP9a{LI5q_eEr+UAwfS-(qJ~`aW^SZb@WRugrk)OYOMZ_fZ2Q|QK40L z1x7fU!kC1v@6bUZ{!TGC4)22)28ll9RTNH45JUq~vt0KTJa0>HASZV#xF+X{;((DB z92MY5+`g&Q>z9>w9@;}#3GSPqq|QBkHRgi>qa2X~xxL9aX{!WE*(&&yn_p(T797j` zWCkY}*g7Uw%M3|{87jKArxgeX;?iHM9^E5M5r4_=^6IFfs&hJsM>vo3v#;sxFpiqH zii5gPIO(@*qmRTj%lazy^wBa86{={4_Eie$rFokYz-j$`kFBV^Jq(j1K^i;#j%Sw; z<gkw#*j9@Ms%~@E3{gTXxmiwQmvv&sZga6{aL!mr_TV$!lAxXbT81cS``P&nb5b!S z1BP-|G#Ex73h9g;hem^oPXqcsEE)>i&7vVYQVdCHCaRxSbuNm|B@qspQ*~eKs2E7Y z8>PP`ytq8lxQrPa!`1-WCuw@BWB$5k@4q$}zT&pouKoXT4~3X445oxdvXPs2@ikq( z^n~l3ZC4+M(xHrZnbCVs0N>xG_=P09j={u}tz*fZ7^_azd_BeaapP)Wh>Rsg+c@!} z)A%T`QTv}!dt|e{tO8qDWR#YQDWKh7kn_rwbWhc-(Awbo7+7U0&@Qn@?r73@SL(Sl zi4B8=ineOD`bcmzZRo9<)Ss95E()mX5z<}>B^()kOh8w5LJc}GA}?6(sU4(!)WZ#> zI~}so;c34hfuE4(alI%+Hrn;2{)r&}xW?dH^}=S6px3ddGew!g(`0D`U=5=7gC@mz zy{b<ylHDO~qp6aB5h7QZ=op{m<c}vjlR4k1jh11-XH)k)OVzI}*5=7PRR*q3Iul7# zwZ-ZjSE+VFg$DB!CADo0LKN7Mh}{-+S|-$}UOD(}s`!o01BE+i`<0qGEJ-61oEz3G zl4!a~dozW6hS+>URtaK$g)_B3s|L-9zqvu6FFRJwbA9+Pv`byJ|G1Aut92d1USv}` zF{?Bz?T)|^tNzt}0`CJ$X0a8*XPrneD@zm-PR_&%<Zt-t2y_ZO*f;S+C8GggX})b` zPlE}yP0zN22sZ9un`F`a=QcV--#8l6R)-BO?Q#C8YO^Y|g5?oY0?f|ZArw{-a!B7? z=p?&t@q$ehsFiGpfepqbmSPdQ9zA5YYG^5u2M*T_TLwhTF%#e|T3Y)KN<1W2a=~o+ zss}!}N_3vuH-%C+`57<8N}eKUJJ_+x+bY$*1&BFmmfp;Qbqg@oW`VP_UW4l4e7%L# zjiCgHL}0f~5S&|j<U!ZWD1NvC5x4Y7nFZ1)-a1N+!X9%ZFaDJB96Dz6PO`TuW^W`L z@6B>ni{*RQQw-wF*-G_}+}k}C=4cz~?dz)+8{_`?=U9@?A+^&V3i+(UFQG~Kz0ho( z!Da-7UGN)t_NBYvEM=p7KTGF5T6tveEsp4$S@!P4bh{E=iN)8#ZTEX0Zuymp&Oxm| zayabbF9)#qQ3}Q`p?Xz)$++Tajz<G0MskqtJiqC#K6zAhv#Maa2Jza}tzEb0_!b%4 z9UZyVHd2Y>-oWad*Z*$92m!2CJ+<iA_dNF2h;7RQ;@5!0_H}tZg-n_&jtVsr;d0T9 zWx{}7`jas*aFQ+CF8Zw(z&9zA*@)zJLwnhRBV(NKS!zy};R9N2sMIzyC0W3bAXo0O z6>I?#KK2O7oSzJ$BF%{YuG^(enumZgWXE6FrEhg@%(z+#3E(UJ(LDyaY9TY@q_yqz zaNXjcP8fLjFE92|q)@#c+#;Asox5se;Z(OWVw<9jT2S43%T(X6z%TXTEi}D&4{qV{ z_`W<y|DQ_tAQDzG?t#`o{<X+o=owqPFdrdndNPWoB?+^X<n(pzV#+cG<uqM5&d-86 zVT!p`O!!<}P)IG5JUeiST#1l<(}mCKASb8W6{e7t(?$le1Jcy_?TmmwZu~<zf2^E8 zo{m3W9shZ+#~A!#4;JEV1@qYuf7g3PScJ2(k7`y6X}4q{wP2#NKIh(N76W=~b6xoB z^i>zcbnq*;!-S3C-D#)qj^TTr(k{$hUl?_>n0|CF!BNwJOnb6dzZSz7!gOs_2`4EX zDGo%FgcU%H>(P!W5BCr^O#14zV!d#%8HK2PZ@T;el<|2v(Eo5awDKeweZXK;^|%;k zP@>2WrJpEouaP~j%yUYXRvI&^DFUJX+?7sZs?E7uOtON>-qKFVHq#JB*#g7bmgEA? zxW1V&ZY5S~$STXKAGZq_l2OE5-*E`Z@JYX3n)mg)p_qzo2Kr<_E7g>Ppb-gQ6KdU@ z#Sg7HFGl_FnWd@u{X||OQBHS7Sxc&iAI{dne-Lf&{r;|Aj&lZ<AZtp$PeZ?Mb1n{p zwv^NC+(vD@uLm;nL*G3I+<n{bV)kd$%TBMC-U{`caqn>6-F0EAdANP{Zf3F!`PbWp zi63N=MweZuhf4#r?zO5eLsm*c75ZMm*38waGL%z=89aDkZ@Z|C_I`i{euzETcgz(; zVU#;RBorSNCy>p&o0X6QMIZPd`}SnlK{vxak;{S0gE#jWO!eGb+zNqrw*jZOcU0>; zUwL$vJy*fvYy_pwKnQD$e0TVv1}mp1)N9-mTb*=_*>bj~W_DTVtBCQcm^c-~6%O2# z^nZW5P{b*EG6H-|-!XCLwADT@=hVkO-m){Xr0%$J2Wxv9`O*h0P2T5Am(D-CeYZhr z;3%;y1YYsAYZ+K_z_M@ECHjT5zjBR8I_WUmgla+T)^kMWb1dfQpjUz`5lyNNs@Ty{ z2JL<Cf!1w%*fZnYke6}KUvB9sX)R2}e0065F}^B=?q;|yAb$CY4gV7Z^O_NCbCqL@ zx-d|d327H`z(oCFeS;})XG)w0C|!|VG8aoc)T~T9+gX|)o^)$U;flGaIeKa7HO#pp zPJ;aW$ce_w?`2>2CRrRA9qt$gbJ=E%x$cAdh}0Wc;O_2JUz3ET%Qc-{o*jL!Y2sF- zdbS)|n0hwCH*TE#T=7k)PP#I>D^2B3A7R&T%#?Z5=T9@(#rye%2T#~=`)se>2TrH& zeR%S&&#|%u@z>M}!9A8))?8h5Kt$l$%M<M?$PX|2TfaNu7AY~0S@yIB?u}{Y^n|dM z;rcWE>0Qz<8BjBwbc;K{5)Jmd547YTgo_tT$~j3|hM6zTV{fW6igYkQlec@|&&K#D z=<2fu67Q~bhDQ9n7MS^776tK=y2D$#6^1~N07$rndSC(*Uob6nvNy(O@zxRR3NH>d zuG_M3Yi|}o8s52hO8p4gK@C>Ou)`bgt@~;;x%$_OEY^%{%IJ$U82_7$L&@@atc3;t z9g9Gx>1<)=Yz)7$SqyATn-T&a<$VD_OEr2?391X#C$?qmfjI<SEs4k38~%{?v#TBo zlb(p^l$9orx2bm5PZydoUnqLK^(d_ry>?M>igmACyelJ-jISH6DB6eXZk#FHCm(LV zrI&Y4ki2YX073N1eUho=P_h-1E^E2a>g9pN!)zKwS#6_CPs5~Nz^Ao*gmTciVB*P{ z#3-aBymP5-r0e+Vkmg8SXq9uLp<6<eJscv}XxLw!@VEM^SL#g>-xHoS)N4S=x*q4= zTO3E2_05cmakDZR@!Za6>X+tIDEzC!PJg)BFk;4Vi(^4as4DIwtpAYcDw_?Qw}13> zlhdgnWsD^53)L0mj%l9=(rVYu>1a=;9$2o99eH8wK0?(DL-D*ng!w}=|NYhsFw6$K z!V}TUFeE#(eO0V!^NJ!1O6UD4BG~>GAFv4}+sGY^A@ee0pJ&`Q*6)mL!oM=I!gr5z zVmmtAQfGN3&M_+c9^Cq1cvQqt$r?|DT=b++df|*Nl%|m;3LYwj-A|#nn5?iFem7_{ zg>ASGh-kvf-xTyJS@7TVNJW9Y>oX|BX~(Ek`8jRy^cJYYo>VYknP`*9ebxUttDO_d zyDdPB&1@NM*{*+1NaV+M&feLp-`PF5z2b1%1@9(9vYD}&3d%fsJ;2JZ$FY;r5IIXf z5LRsGoJvnB?}S!6KZcH#aUR3s_hkt21FzeuZGbAu&yN2dt>I2gWclE0Sn~2XXVuh% zD5FS@SNiay4wvhp%-xAsqzSduo>_Js!*q(q>lU)A41!j6@?pu%bz-5+?RIEQc|)oj zJaq6lBw&*O4SlV(MrK<mnym`WZvvq>GsIE7@{pSPhAS4ZL@Q02_KPK-NOTSBG}8z3 zLeIn@Mb-0^t@tOd00a51dE{#Ki0ks+NCV~U6U$f-w&V)bBbMHaEU&qzqs?P0{vGZ_ z?mu&L1wOt~-B5p4_%piNc_~A`v>m@NFH|#?KYCXuHWn~4DoOW<T*x(2L(=H7xg^J4 z4<C17Q|xlU7jos>2FB>Cl(k{1Sg5}Hf;!6Z>$pp%F8*j}9kn6N&8CTv{0uMZ=!Bn( zA=#xsTTXn>WpvW_K6cn{)J#mj=E(v9Wmqj5|Ki}Ni@!UU?%n%}Cd&Jy*UvRlLQ3r^ z$v`yM^?~3uEd!`Fbb0EBj^u$8;iJTAPyf$S5>PH;2CgiOGZ`Xhy#h0{U?Xe|CaXSO zHAtg<ZYX+gv68*BhcIuI(Ad{yf;=R#;tQv%I^z~I_}4Rs%usAd%v$5haqIZzkg9bU z{UgWK*d5K|J(gqrDi3uJO2W~u$Q*6h2U@J=<vj<&G@P{bT+Lxt2Vm2AQcg_ynkcG3 zDvnpbmGL5PBt`bN>&~w>SZqRsuMsMtXWmho@iz!;0qfMDu5~vw1N`MzD%vT0siu@` zoCXA&rBVEWXkzNz+hZ_REj4aD3E94O1^?~Pko;gF>mXC~SYxzfy!2Yvv~&jBuXkc6 zzsz}(t;tJ5z8owXy}2(*LL9sp`8rt_a6~UcxjlQBU*IBqxcm5<|FRS1x7haBy+_$M z+S22)8Mz!#UyR9F-|@8adg22rX*0xVhb%S?g`HThx=<cjy|5XW96&ApL8|{>>q=|K ztp#dZyl7BbIS~bD8Ekdd{&9Z`@^Jk__M;^|bWYmOs+LtOM9!I5*uJo@gZNZyWRli$ z9aR&(3^N>`l3{D9oVh!nS@2<LFHS^RF;7~9&w48fHJBXHIQwkZ)EPedBcSO~zMR-^ zld3qQ3B8-C_wJ5{tZ(<>N$YKSIN33Q@euJo6cVF#eES$l8@v{pLN-OD$c|Z4Q&vp- z$&0NQa<6vzVDL>yyntTWV=*31j6g}-I$3$#zq7IZ9W!GMS+UC(m{8o2CgDg*h-f{E z1!1c)_M>;S57(7LS(?*Ji4HG~aszLS38z}G7N?%!!{SBXQBuqJox=~OiATBhqVB;H z+Mbggs_|?W+eY1A1Q~_sE)JiGaba&bT7alY(1TiX2BE4q$JjTT?Cf5@Y)t$JDRCOZ zS6ylWE;7*EtkO(%Zg#4SYLXZdwfUC-2^1_1wa#4Wd>sn|v8A9>@dEQml=)#AAVS*A z2yzZGqa<cG|8E7s1FI^bz5Y;fvEWP`p7aa_2jOI>SwezfzutqC%|C-gyF&+6-JxZg z#R<*ni@LN<VEvKuy%fjqW|eO^FCOSAk!AHdsRrv+cb|~~I8f_b#K>Wq{{1(i|B4C| zAOmAo9_SwK&X1ZAZk$RBZfk8y7IhInZ_6NvR<s{K<Pw=cq;ZAaf@s_B0LuOi?>x-R zSbMjR2(i8gO-o54zBeJFaRHt1>nU5dKVa@sRQ0w9A_GIJQz*$f^=w!h^4k>!TLhF` z;|<8$uf9FTy`dgn2$0#^*p9ZNU_BGD<Qd3GsamKY4nDaOhGYFLosapHOdcOKF^C$= ziVaxVYlaA*3ZTf>KWldJ(HNRY8q19ENOrmIs<0A`BS*&2V=mh!RJ+n>!REbsdWNGZ zsb^HHT3$<h%eD&HpNvXJRF155UNUfza*^%;ZQx7+9-3I2btLP<QRJz2w&|4$W7zAS z6pO!WZ6BnpRnbk|X_>|C@$%W-X;e2PR83E(W06irR<=Nl%@UoKwzyfq(q1{vJ?`Fz zCJna-Wast3nBThtLt5SiI;IQNOt4H11#7mS(Fw4Ov_2|2N@$M<vNFsxarHFW4Puw6 z2`L<46z6GYfRCw48Us;3m%>Z22f>5PAh!LGM>4qxoL|!JG++fxY0gH;+kZ+by~(Tg zbQV$d(pb&;%t_5TU@FI>-r@C8w*hZ;bvc-I_w*M}f?0Q=!~P-P(uCq;i#(4RGEJBM zn+rIiU$%3DTD7W3n=yI$js1+hx3#>3_{FMEn83k*so`I41Cxl_ImDdtq>B4-yes&X zE(6%Kw^%TFuu1oE8kz=JY}Ms&A%c@(SL=@>92&rE9#IQsl3TzeuA1<frDp<3sxf*$ zFgvAn=J3+{(>v|L;jbSa!olbQ;`hzr*@5=~20Qw*3Q&3}m^kjjKa>ei2kVl!bAcC) zolH5Q-cu?pz^x7c?A8>Z;A?U`N;qb#D(GL^jYU`5{9hbuHVu1~`ux&4d2%{Xp#clq zhOnL_VZ_X{(?X%JSr+d>OpwyQi*z?HO)a2g7qPnKv-zP1WJ4+_d~}O}l{#1*z<C_f zLBoi9ya27$IE!f;&^YYsh$l)73lLlvNKX7ZeZd=L)88;lpAF3bNU_VF6xrX^dH(On z@>KJZYkMn7Eq1&cJ)0Fh_!2)`mM6^E)&uqpo80DR?j8#QGfE6;wpmpZmQ2Jr=b;N? zLWVn{(d38DNbgwmBYYyvQHtP)$ijoFs}1+UN>iPD9#CnAo&04^!p`7_&&ro@x4O>o z#}#sxiIsC5b-1jacpvx(GJsXGlasIeYoH1+S<hCabpkQm%S`s^*$O6VL$_M$WlR<l zMI^EWH+4DI+&?ub<fjO4^5dN#tQVtYpO6BY1q}e_^E3%8usl=Imu6h!$Nb$<7U1z0 zqNZN0hDs!IV*gY-#Wo3!kx)1pZ!+_5idC_IcASRXaJ)LUDtzZilM=N-UtvR3vR`lf z-N#>P?0Q3khLnP*{;EPZ?*=~-=h+Y(7wHOUI>9R5v=kzj*IRKt?|>VnC0!A-HD3ng z#xA1`Bg7%D?D)9AwWnc;nu|ebBUp;`saHw@wdW}?$VQ5L9+oY*{scby&ob7vac4wW z5N3VNkPqvuiI<Ph&eyjW;+KJUN^P`QAEH?ACqvW2mdF+>!=b)1GZW7QF$z8tYt?lM zY>~x6#)~pQ@1moQ?ny}Sok7Kbb$amldn|qrgskp`h-PFnqOHvOucJxbEC^&OQRyv{ zL6N?gdknj)tEn5D^zu%kFxE>o_=A(acHBxft<Jz*$mmb+Cy3HDm%l(QoB^$*ikg%2 zR^sDBBf#a|(J$_B->pgSYn?lDf-N;dpUyOTFuaBZeqR6Tetrj^LzeQ+Yl4&~jlvk< zzFu5F{vjV9KI(GM3#AgD$s6?3<b{piNj!Pqkp7eJ!Wp+;Nnk*XN1Ac!gP$qeQ_ClM zQaUFqv0UN3pkou@!=5L4Y9(&D!`KV5<l-7oHi=GipPLh9$cTosmy?GMCZ<kS7AlvC z?;Y>|R1N}<N<o$#{O?`ht3&R1uJGe00|%b46|R%w>avydmBYMnO5ieh*{(3_U7&<7 zE6}em3g5^FUiR$~Ox7A!OLBl8f~JkVA<kf*{-)Ud8=46Fi0A7((dJb(G=%6F1~2<? zAmBqa_(Jn!KJQ~CeqIg^|6ZpE``(4c-E%^<d35SoFX;pCW$`1FjRd^x9lOGJKuE;p zq56b}*zz-#mH5;u@UoLdE&nw{*J8_QIMm|DY$~AH<qW8x$4=F1y5pWQ?~oD&Th?j~ zW#iZxRX$~9IJS%rE>%n7^Sz}m{o@>Uhfy0TPvZ%P4;?)>#%qClZ)jARU1j-(v7tt3 zSKC%0)e0VnYPLS&v)tV%7HfOdp_&^H`TVQ7mOFOrv;BL^_Z3_6$-%hr7Dq%GJ&e9x zaFGf1iJ<o|i9nEw+ox=~6}q0|gG@Uj_ClC7u6>jV;+)ZjQcHtg6fTas0v;=+;P`Mt z>yx)_u#l3T1Kg8A3G%sQrDh_dBNsH_kTW!ALK{s+m)WgVgQZ{8O3Kq_`Q>jst&^pX zD1HT0s7TwQg22xLcJ8i38jT1RJJ~&wG5OYu1v4s{1pB9wae<2aGgVjp&aqlifrsi$ zZ|#IGh^*<BT<inQ@WUK<v5YCcNaZrv?%8(-_(q4RRX!NimA&qaBndKNMZK!BL4N?) z>LZ}*&hFzJ+~P`Q!KIbHc47rI8;%7EjopgJpnf6V)I}-pXhGTPGI4lZG4;ny{~r{g z;tOd5fyQ=8cgCRg#Y)OccE?Kb`8C=UBr1+j!0AY4EgpbGsrs(vTg;DBf-^#|_FBfq zsH&*wjiIA?RQb#ni_+BQ8YCfNO^ms>DCvGn&~qt9#cPxN6t)s8lVMi^rD~p*=P0#P zqxXI)Z^Q9%5W^=FMd0Nv5Zki8{4SxUud>&tcfDh&Wv(i8C>uB@gaq2iqrK6@&~oey zVZj`@DHLjvtw?4sHj2?*6~A|m3%P;5N7-r;?=QV<8j#?-=ImgxLy}j)G)y%*1Lf{P zHWL;}8GQ*XZ55fx@m)DiDspLTaUsW{_N=WmsURm`Y{A#nT<SFvY~MoGoCWT_llr4! zW5Y`F6ZnP4^=#eC(ojrqEHFnkLw6)g{WW<XE?q^8k3L-3F8k&!CIQSiybXV$H|3WE zn<F2Yorsknzx`298SLLrf=(N4gQ;q?Zo9;PgG5D6tbddC<ZCny%;}_CEM-I=c6}p+ z@(&^Yf29e?OQe|~PY7SF53)*oiY4|g-mP30*A>Qd(m%*EM9o`;q82szE=+MC{^aZ} zD)31=QlGgisvuPQBuR7kHliKcsoH|Bm9uQ(&o1O=93qS!zHUm&q6Avus7B<}h&4;c z8d?GnUVG3H-i!Ru#5M_j=<CmRguUP_ftJv6AI4`gJ>{V|gNG-y(o`u13He)xRC?|P zQyNXqdB794dfZ?N*MVf;iw3*o7j8AgLsd!-IB?lXe<e%X%3Rxk)!hmODm&;&HtX0% zRR%OOn#8GpvD#<BQHNXXA2;Fq;bd1^CIpF5WQNMM#h8t6!uMfoLq%5zGUDKE(4C)o zp$Kamqo%mfl(pJ{@6r1^x!VQ?lQu5_BSU$`8&Tb|>960=&|%SRy~(+9vgr}WsSeWM zkOGYPAj6*5?_y)NEWV)xqS1OiQXJ;fVjfRN$y^*zTwScF=pgem9CK$;>1tr_B2Nv1 z;~;jgCvFH^-on(+@W)~0Y!Dq6S^+a%hdTzxG^UxCR*H1+xc^2%AsvaMqCPIx4h)wA zZbs*u3=0B!IkD31Of4@L7<#%gy;g;$JJ0o9g`0EhRXL}?f>}$X9GW|KR7ja&m!(*S zkn=i{8#xn30~fna2*1P{L?y^!dS)v?en+XEfv`pU<73oQb3dS<%ED~E^yD{CbKc<B zGGN3vVlGQq6kvTr9RIgl!XFUEdf)Exl4e#e%tFbF8DlBZ9~YZ7!O7PjIA4e8JC3Hv z?g^ST!$YNj-&io1QN1%J{W5S*9K(@?ql5WCy`n{hr@58cL@&E(VV2%1b0G5cVgpmD z!KpM-h8~|a18A@(N=E>D8&_hj>ovvWgbHPQq8ZFbro)#zme+#O5$>f|z37kqBq@9+ zIh-hz`H06s6fA{@Th)kKZ7lH#l#B6|V*C)53dyB(=)kj{A`ncU*l3BzUBB}crHPcm zt!~BYaPQ%rQgsKT|EE0W3!Ou)>|6y)0LM}`CN>?S3RNN-St~lqTd;eiGi1c7iUmB- z&d6snbRL)8Osz_rQeJopLb<K$6jaG}G#9G4iDX>TCJdTKm;o)Kb`Pa|$Epf!0Ho>U zCF|&M>Nou?4;jDn&0sF;{5YP>vsXtCN-5V-L$?OWG$I$9d<5bIQ6@ua0sq#+T42s| z#tG~uW5Wr}XKvtb>bYsQ$ZPW$juu{Vr1dWQkysfdZD<VE4Ra4+ZeI^lXwpzfQ`OZE zq*|?4m1t$WN>GMZ=7*yA{o3Jl5klN#AEdUDl@IXk8gRW<LKJR_ErDuhwNm{#tu#n% zh&yhWsrdrV>j~CFBW<$@%Z{eFvDq8fpoE3p=&QF0581>DrkR}g4JKqAA<ex<X>Flv zMpX4CYW4(+*!l%Mc<!Ul)#6lR32k0gnysnNlqHxEmv5W6=TUYshEt2}?CZovmD?N$ z#?<HyST=ZyQ%P!uJ0cP+-Q^h7Jp1!hMc7Q$%b|kQDC1OY*}iePZ+By#uH-(;dZ^@) zzO}-NkS7mbK<}Ee1k21vEL%MyUs*SE>cM^d1mfklJE+kSu0)%f7uyCWL6<6o<>Iw7 zN^KP~r7I+#{IoFKb8>4T&Y0$gt6Q(X5uFd#aYq=Pudoj{3E1$x54`+<a{1)-afgO- zTH)Et8DY^?y<xVo=D*2%A2=6%r~i@VYPvfjo4p_Lt8`!${y(Iv9s!oVLp}QNL{#Y{ zXz3n$biBTCIJCZ~iR8V-6q!Bl0M^;xcX)ZpFF%QXfbvwh3-WKJ8(k(|c?R{n`9UMt z7)5yR{mCDF{g<h}1OB~LS92*Rqe{U-_OD8pj@F!No4v)Hm)$V@Rhz$;E>iLjeKv|@ zuilM*QGHl4ZnapmF#NcO`C+3cK?3~Zd8K&tr}J@r==HR2y?-lRgA!uCk#+XsjcD&F zMOyeZhs&e7X%UUaNBlbzAcxOq{9EZjpVmO}>7k?Dja94ajz^!E9*cB`J7j~;vi-j^ z0cwkN(5d;?(t-9=ChpGrdqbv%leB?;w|AB_+_NZs+Mf8^^7#D({D+sv;P|Of*=(sD zB69xo8kx{c^&}&ag-8^23%TwCcJ~B{3#CWmf}uH>o*CTQaCDVo@2YoR`9|D5g2=o7 zPE6Wgh0_ygr7Si$8fra8!O4_u6IkGTN4Glq#RJTQnE7`E1(^$wOS@Jel6ydRA%34l zWMAFBSa#muSOqSyZby9sgSc+0eArSSHTH`Cen5e<soe-qb=d*|dSnONk*YP^aEyBG zN=IlM^}&SWbxnSKY>vj%u*g&oe;ykJ>1+gJuiG4JSY1?&cz0<2lqS!5^zE7u-}}hV z+ow)BK588))9sl3uw=`l7qU8v4sz#F_~2Ok&CT|xA$j}aUkjdk><X<!)HRiC?xe+f z%umA(QBCY#2dJwIS85h@n{dz~9V`QS`mpF=$jY#u^el#;O9+W(i=RaukcL#0Wg{h5 zJN|`L(S09dyOTNP%Ezn-#wIk~0%lZP(;YbQJ!bu%SiOyTzdxkn2Gtuf?mwtA6KDe& z=nw0E7|$+Fu-5()tKbJAz60;sCM|DCyYEcXf!R~mJT5lwPP6r9Jf-{-tAVeqvWq|L z@%sHpvj)zF*n~ZAk^d8`^p<Zg*?M=6|I<isPJF)d)Wg|?_)n~koTFNWeY?l?pGJDr z|NmO4#2)nw;T&+b2d0T>VzV{!wLdpWv^|s9yme_Vl?^jTjR!w`0<NNsjD?iCKKLq^ z+=Gy`^wbye9aWWiTW!j4#QE8QXb7n>?pCJ0fYY}(60!q6OMHk_JvhAe&-JfNKfh{m zB;*nQ_!WzwE8y|M7PyjUq4~WiqS{IY6+PF4QL^-7l2e%s;0G1j2B5@pebr^`Ri-GI zZq$3H3d3mA8bK^V2i?r4oVX&5hBot7RA;704D(H;|5z#Fq@U7;1H-ZXu;6x7LU0+h zP${4(h3XCphVd=)6yx*SDlZ$KBaD3gFx~#Et8GzZw_&ddw+oD>z^|M(zxtQj7K#XY zC?2{<62psewN-*Nhh*>qcl_@PR62;Fz-RO4=VaYg?L@D{)Z^*#<bWgpC^p*MYB?R> zJ#Bj;%<@hF%9h3HZ!f@Fg8xye1n$f#ZC~04+1P7rqsk4f^9XP2_MVgk`tK`fq?&x$ zC&t2eX;81%8q6<4`nz+$vHo+|6e_%C#d@EBDtoTtepzYq(H?H!);AH=O&$s+4v=H# zyqY8(3_MxYac<$~{9a3dGi1`A)~#w88y9Xo=w(I_HY%0B7@>>}M5b;QrIY!>z~=Hu zNRD&v2YH@{3C0~zrLs7cnVB+uoaG?tZc<TFrF7s5asbOTd4W2zsP2{DQ06I~5MP>H z`tgO$mVsrzjbVC5?pEaMihb}Nly=zNKz~e(>$4}}T~IVdPCNtw?|F)rX!|nk4RHQ- z<*1bsO%E%gFKzw&t-E@WWh&4YuMip*raZH!*gm+LcPUS5K2&PPj1X{q*PbqZQfV@U zpB;*2+jjJ=YJ(ELwYEBza~^E5;N&_ECzgF5>THv>;`&(|N2*o);(g`9?F%a`WEv2c zR0sY#Lweo*(L>>$)mu|4?tQP9*REX$dsu+UkqNp$({;+ZKy>R_XXqpM7$K$B<)n%6 zz8(P>3O7XSwaE;juYDNqAF4<%ty?;Xoy+f?_qn{MO&2CFGY2{R_hGCZ5<ox*;;yk5 ze;rMAjx|Va6F4E7D_K>aJy7gsM=+)wdk@F%U?ZJXBt@V=zp2o6CEMPBQX+c<F{8H3 z<Qa~}<D`Evgv495gy#*HcEQ)vier}#WUgv+ZQlK~?mY6`*Kc)sl@CYJZJ%|I2a9S~ zH3_E%&BT-GS%V3=EK~Gaa8y1so&PD<$V@WMY2U3PV!lpG$K=H7k3AwrfMLW}{Rz?Y zZ;v_nATi5xpSWVEHhYAW0L;r$zk*QQRPcD0g4afOlzgNEJ+c;teb$I386vx+Jli1) zRL9^5wZ*$_UDOdP@sAabtqTCn4&S>Yl<mrinXUVFx>`a?6Nj)|;GXRC^83i}v2oHl zFacUtGtfgudOcGqKDk?pa9j;uC`<Iv@^+Yl8PZvmuwKbTn=};NCiQ_4<4ZBzNG8B< z_q6+d`ls`ut{^6XhII08+PjhCVJE$Um9!^D31*0huF=a9bb6p{4vchPEZI36a^1xe z`04hhlpR66i(ace6xevy!sygEX%43}=$R(Rf;s56(YDaYw4oP8Bap2@+_~_i<99Fg zawtwYzM9i<5?R2fKZHAcp&!)?D$3FzG)Cet)Z@_*vr9#4Fl*MrD~0)a?z421I5dVj zfw<*?pKjZ?jts#^{Dh=I{KAp2$pu~$U*qBco`(ute<R_`|1lCOXs_7J3?^<mguM%f zNqvk;jHAkV7w+`}1^Ncdjl-?bqBxO|w)7SX?%-_99Fm@eLfj3V=b@#O;v5_Za=|^! zJwSLkJbNI<btL};vvIZ$6)$}THa7mH7Jg$)`_@*g4ajA{t!estk^18PJ(=&UyI7)# zAvpiICc?5$Dimg4M`b)kClY%F?uNFF>pgXD+@*%CuIo1=ODz&+D7XSyoZw5L#v1}( z>{yMpk_X7;6oEt$tHO55GAY962(jj;m>g9FOl67&6EW}l7^(6R`Hb9*Pze%k2Cp_R zNo4pODc|4YKvFN$lxX9kOmYLclro%aEBsz(sDVEsZrT$q3+eV&WC-yUx)p7z*Q=|d z3^Oj$V;a~EIfv4(koHVDZERKrZe6^MuHi016GI1FU+V%WNuUd?AlK1k%+rrc#wp@r z!9)+8s!RG7Z(XF<cMV+mhX9+EhgVaUeEBVkQ!{%+UYqt;Ik-`GLRW+u%zJf~QYgM6 ztua1sMb{iD>}tx|$`QMAJ7W*-4QlTGO&iQN*dlc_HHL7;v8UZzXBC1!Op0*3Dh)8( zTAigiMd6X7&CGP=przooFxLSOZqC*r=a8s{XTKIL{y(YU3h-V1y-K0cMsOB&whHTk zkkjVbNP6a~<_4I|@Um*jo2MZjv*$VVNB4}U)GHLf(HaA&gwzKqsHMz$Utm`CI;#dR zclr+&g)_5|Eo`-Rq7*;A-x=&cw5q)Kr(LmQkaM%)@}Do%yYpA+g2~k?%TCig5eq^Z zt^{)5rYFTF_==S&xd$M8U~ro_WC$~bR9Hz}UMjATI@*yw3uRqG`0Sk+eFx{{T$#2B z)-mY1zBd%9;>bQZ7cr!r+uADvyRPa(66NITloaWdc5$mwj7*}2uX@_B`(bkGY!ZO7 z)m{QKD_C;w<%c3{*n<5*W*}pXOtW*Jb}l;{_1;g{OT42&m4ZdwX#mGU&YJ}DE1(fG zBa0QhrR|xG)sGVFj+j0KmWJvg2~f=1P{Tjk5Q8Cxj?k2*5KN&!CDU}cgy&CdHR}(C zu)?|DCyM#z{cT&@gzQ3xc9dnbRMSQzuCRktvU7r~lm{9W2GCB^kTM}tqY_CRjfwsj zFomB%*!MSCcJkj_C6DStByY?gu7or<lRl_v5mIEb=RXbp@AkettjQ$Zx4Ri-Y!%v} zQBjt096=iuF(O+?x|>$U5r~>@5e1^6L_lSU5CVj>qSA^$+p&Q_$k%Q}L=zPe5JEsU zfslx7B9O2LLP&rRvhn3RU+CqTxz9c4-g9T>-gBP=e^HgHdaHi5e(&$Cw_qo(2Bvrd zq$9z}I?gk>hzyN_uLjT8*~+<XR6#W6<kY)i#^Fd;HqYjW_9+(SDz`a%IJ!@D@Qv}i zdsRaXZz(kvp13C(w%kTx++(k#G^hmdquGNA-hvtYoN0+FyOOe_#2hL39p(wYZFzd! zBygbWB(yB&9QgH5Db#mvx=-@cHh6s{xz?5ionPa*!`}?8xh9Gm8cc3jI)VQ<KTC7t ze#wNWZj=)5xONQyzIG20FvWz&u49<WsFHO$=((_>d*a$q!CZTfpe-uiUo;NjW%@0? z+us5G-R`j}3JOBEBHpv%ce)Lx7n(*gJmdCXG<1k~TrLObOc-thtKOvtiz$>z5e`kl zRp_<vAPvmFzvpu2<ZK<Zz6T?t{vF&f^7D<llaM}f%M%JkCIWOSu^yyxfg_cklgy-4 zm7ERg?2DpuO$Doyq<`B9G4@)MVw>8ZJyavsmuQZ^JfwPWa96$Hk(vxup5G(7J(v88 z|LKsS-8SBSk|4vlg3~|>A=mY8?>KmVcwQ(;vy&A;eb&x;`5d<cm}BCfC7BTZERbH> z=TW()c(@l($3pk_0-9c^CqABpI_sh~=|-d;)zv=r=WsQqgNc{+e|n><O=X;wl&Nb8 zw~@ZL`Rw>b%DZPzFiXzEYQ@19w`tL?Ypv({ze{Vt^c5;<pFWyeH56Q(Tzr32*xpzo z&t?qg%ROZ!B0zk#OZS9=yU>VVvVWzumc%ga7kh>E|L~C~3O*7w1~b={y<?JJRe$8{ zv44lO%Oj9L37Z;pMn$c5Q4KLGb=+Oot^LP>&(V!)B1VrU&eS{E7H^eD?JTE+U)eim z9-e1cQ7lcGnxZY2v07^)Cak;YDd8%}t*zB|`MEbvW&1GVsy9RLC0vy$VZe3VV&ArK zu^il<X8YKD-R(7NFEFO6Peoa;Cp;`fzrV97r|xA42&Z2cZ%p0On~f!lk^_QC>FpdQ zIZTRY$x@&KX83FzMhAPO&iH8Fy3-WeSHx-!Zkcq}ODh#6TCQxZ;P;A~7GG|RW;liM zmv~vD=j!(ev(^6XC;f$~Wcu=SWRf&3wZd__=)t7kD<kn}_=Q-L6**-~t#=RBAHabk zyv4cT$7xEVBCXdoQV?e3{$pj0Y5lr#STIb%ra7-kSnHX$E}$`itv-Ip$O~1r3`ksE zT2Ggxt`CYo*}Z1J$qJ7aA7N?zz04&<)rA(YU{ijBlQ=EhJIucvD$i`aSN!G1*^dmx z`?Im6(4L$_UdNtSOqapmqO3Z*h=AZj&F?`RxAovDy~kr*WM{V_^NNJWdil{i{*Q{E zCLPZvbRC9|dAuv)d-y*WZxy_2lxiX#zxh4qB$;pfzuO-Ui~aHM_D9c)0#S4UiJz;R zE6+wG9hQILJ?RYT?LCldkhQEj)y{g2y8UEPl2$G<(T1Z1d-6)pNg91b0RCd~J4@D0 z3}63go7bd3DiSP#y{i@LfdhX;OIT>;2gY|N&FqitfTy~}Y$LR}GbMpA7TtQvsiBd9 ziGTfcO_VCuDqw5CQx11x+JE)}4~5ZTQ(NxXp^DX<2YqLUu2q|rjFi_#k2~2qBA<dg zzYUgbY*2Y~*KnkA5!yw9H7#4_xovk$XPZ8;;dl=d{X#`J3o!a@Hl?%JWA`_`yxk#z za(a4rcQ(G?^g`~YPfM+Y8CTdAP9ZL;(p(#P^gZFMC}!S+vN>vNe0Tn{1y47Bf}e-> zRf5Q!UhO9bu2F{Wm`Y)NZOP8xsoQ?_1&|xkida7R9@?DLIUNxY`AF|oU?8!8C49_Q z{1tkzjx{8Q9i;}hHt+uNXD>YdB?!Vpx%j5*oz=@R^Xu1;j}!GlFZ*_-GW^eU>Aj|l z(kVli;B(+#Ct-d}vo$j5q^td~We?GcBCz?ZWopoi0_lQVo!2k(Xjn2jgSV>qNZg>P zbj+w6R^m?P`_J;eET2PP2V&sDEny-$3_fcK@D~+k&Hfw2?<yzM@a=`cBeTzZPA|Cm z`Koi0N0;bGr_vwPy)uL9_t?CH72D^XTkhajzb}Rk&OaIwmG&P2GY%O}lBnf$;0XU? z*M_;k1`+IswBb(Hxz7xI%4yqY=kcRoiv$}9Uu|2>P&;qeR>|f$7s^9ddlbE4ff<8% zE2w@+gM@Mm_9>%L`1jA(Mjw9dYUm6G`j*RT&RJ}?LM0;Ug_ORo2yeZ!0)sggawV~0 z_*`=1%Sp`2UgIM+yp5TM2KA~V?I+h`(kg&F%e7}`{Eq`?Bd1CoG+U$X;>E)vk<(R_ zd_Ov2)%u>w;JF=k0qwTFJKEjmtS8Od*6Z59z9PMY`FF3&^_-7)ycS-u+->kA;u42l z$vf57u<0Gg^1xZ`^wUUNepot{L&?to({>7KCj+#WL%F8t3jg}qpyMVp%Diy|yuPwd zXN-Pi(~Ll#sB+3Lqcn|x1B_W`mMS_;KG7R7ABoY`tnYzJbB@kE1=J<s3vMQZh^xdY zgktf6yB3jXh@M6_*U|Gt?-nSY1<jL3|1T#XnZZh?%=k#}%4?HYD6Q}B?CFFNKC%ut z7yRr4q3Y!BKlCv5>*3?sZ$~yV*Qv}ecwr;weVE$)m$QI20^a?9+1U+8z0TpFw1u4< zVZ1eD<5RMP`}CKseIb$R7&XBuR>al8K24uwr`66CK=lhX`X!O*mkK07`qN2wx*|F! z!Qk}cIVA)kH+=LN)Ml+12p-5Sy%FW%Q9JDs-sgGl)y-5V+#tZ3^-*zk5rSdSWe}_w zE!9wz`V#VPDB^Hc%~XU?V&fw>>a4sn@VTuqi?Y#1+Hcu|Ni#PI`ff7$8c3Wpbr#(R z5Sn4SijWT<kQ>`f>y^0}8;_@yI+Zh<i-9lW2tI0?`&wY<6rDbaZFspF4e!dP-aW}E z0RB4sCaiv_d^I{;MH&CZ=gou3FY+*9Fs-xP<4!s`ytBCf8O$KKePuQqo^U`+g&7(? zfVXX{J{uP_6_^UZtl|CS;;-zbaIR>>z$b<5wBlVAFA){1{S)AfNA^E|W!<j%bBW;t zXEEbH0USuC=t_8olT#R@%K6z71r4!$*u|`zph(l5(RLYw?YwiaDs&0eE#NqlLh*_? zJ0)}=&)(yIRAXIR&|{nt1FJ{{u>BGOd)FB0qW!_xb220?+0;7zwcV)hMD_6qk|Z4Z za)~xYySxCJ{(8mE7fVP@#?7}s#P<YXS0p{$Bz|ccHRDeSp{SpvOeg-(j0(6sd}&Ib zhe2+uT)um4;#u(@YPxi#d(oXp_<U6tQk~+_tr!nT?5w?+qmbQ?fG?@nyQ~35$WzrX z?u$c!DcET)@S_L354SFT{Qgc`3u>U?zB4LZ>2<A(=2`f{VOZ(`$G~(G9Mb_myupE@ zog@98lk;wMC%nS$$0v3Q(VL$d^qTO;-uZsk8J*jfBGqMPCSUysw)8&vv$DLguPU&0 zF6K~(d>Lk2-n4%L^i!=NhZLliUo5{fIdP9CG-Dif8!DR9e{s!VJKn9cBN`F+^mOf` zaqN)A7wYkoVDf@xdXWkvTPnN$f=%6-fQbtmzafCV#Bci9*%Z*bve*0^&hGRa18$iG zP^>cj>o3;HW$R1r-&guJ{n{S6&8-Duo<sT1H%Jc~2VQXAu^g_$%*@L!bwQ@D3^<~9 zkmoz39#z0wnD{cO>3(i}A{sa2-x$NdYd=6HzDaRvcU7N^5CK83tH9jTrjMdv%}q7@ zv6Z8!Z!4LDKL0T37L@!rHr05E%Zil)s)28JrN?U%KWOo^c0ZAurRQTD6Q8nroNd(Y z5vlk*m$45CslZHMLJw1sUUReA$v!D_!cL(yyK(M7Wa-B2tzoltX}A1v#G`~)#?GW@ z>5s^@(dcVwb$C<N5H?&2GarbJyn4*Z;AxuULJag=b+sqmvMgPu<0=EZdBiKVAzyt~ zR5<xCEb{Tjou7Yld!^$hz$TUmy`)HgUq0Q^UDhtm7GT@<pI5PU4e3wTi|Bd#ThcX1 zC(dx}Vxs?J2;_hWO}5p$PFY+e6Joc+#0F3h`Fw1$RMMtU*-0n4l>5-drgDnoVU?Cl z8ch=BYOxP8OelzVwQKeQu6#b`M$xlN-7(sVONyYe9S!~#+p~eP3<gkurMizJ3h4nS zl0+9)cdCso`;&FXEQz^;m3s6<6kmqOv-aiOw?Zjn1GoUX%~29KXCaA@iJSMlWF7z@ z<>2t7-gf#~miQV~>!u*KH6!9iD;xyy3#|<mo!*RAQm)}YR3A_gArkBoXLoVnhn|=i zCFE{wE3#C))OCT)<m1h;E?^*I^tUj3G5qi0q0-54NtGJ8`-rQioRFmFyN8BExb5Gs zWgb97AmaHgbLvt{WuDiz07sCVPT~wfxZ82lx{e(FE0Vn1FXJaMEl3d|`@m)@Lcg0* zUIM=>%#KTDjmLzE@uQ{;!6t{8Y$N>PQhoSxP2EzA#dcZ{W8ke{CTc^{QhBO3THv18 zkc{!QmItc)L>cvzA0VoZ#6BhTVpMY*c|s5z+!6<2gKkXNYyD;kcLZP)c2+;qH0*9I zOY9+ihAL7*3S4ftW^;v}5_`38gFJCU@5A4^Lav=xYKFM6PUlkRzG{^NNzhc@P13p7 zN^`zBNFP(d_DX0_U#5o&0Ol#Oc&t}0N`hwcXx*wS>rBMFSsmD8h?&#*iHxvg317B~ z0KI-H_iu|(F}Y|E9GAoQQc$9_pz(x5ts;?LKa)%Q8#$^HE*AtR<q;GL`d^<&q0<%W zLAGFJ*L83SXs)`e^wDEv=y9g3*4*nhmo~)(+=@z3cM&SmYW=R#{cc*&gRG~<3IRFQ zV*2;8c9LJsIsF=|cjRnn@R+1y^jkD?DFltQ8*lXNB(2eZk6?Opa*gmo_>kAaWVZF~ zN<uakaMSQEA<!ek(R0X_+mpz!Y4gZfMdL9n8b?&1Y0EES07Q3GM+GLbVOLE+NXxSF z<v=rJmk|^;#b{5VmZ`cZleK|r;RT50p6on+0^p8(H(!012X~L`kn9t@>ajr7fvBjq zkA{D_Z1{z&XO-8=PQ}751p_^5a%Ue2MA2XA`wxzyC|!X~R)f+?rKUXos&m{PnWBXL zJv#1InLrei^)8PmI|gtI@o`j!QgbZ*wGFbVS1f<Izs!@~SAwGW38t2^Uz7EjW;4ba zJ5`!;*&oWO-Q)=cQMn@GZ4rvnyh@YoMbpg(61Nb)E7Em}<q`{Fzd2lZ^q0SiKS|tK z9syU7G2j#5DUNXc6J=^M0pLz-A2EsgrNZkg{-n|z^ZiY{)HmdpHtrK>=eKzcn_8ci zDTsaddpGcZsc^F2Ff4xAui~%uHU8ShasOZOGN5wHz4q4%PhIbY#c%jk{8M*YUkOF0 z31%y;m6e~SZ#%`A(P(wXJuPScfI3QNZsqUW4~C{F1|^=ae936kR)XK}mPQXD?i zE#oLB0=Bpf*Hv(dF0?$klf2QX)S*al5Wz$ookiXqIWj@1{t&9tUzva&+Cypg=iD*H zHyGA`3AshAwzSM6rz_4UrRV}ABR5JlMw`<Gj>)WNuSBXZlPX``rmlN65GNl8`4}r1 z9|>Afefi@&tDxl5j8Pg^KPM+z$v(%&i}=(2VM=ojMe{9==BLtr?6q0B9cPEOn>JTc zG*h+c(wuw3k^6eZH;H>d911yY%CapWk_w<ibKF5F%M>%8T)0mX7$iaC>ipWFks33o zKkSG2tSqg-Z?TB~Hdyp(#Nh0?En6M(Qc5JrSRL=OD^NLm*}fv^wV<m4Z9z&=jra8# zW%%<?P4Oi5aT!wxht3A{XjLwB+*myY^`i&a@DB4vVKLo5Lc)K5RFWPPke3EYYVM=+ zTKADdZnc^_3wX;_Pyrz>r-S>)N1uCnED^_OH6NR97t?bi8!9pnGs^r+!)vfO7kt<= z?Z+Vl7xVa$w+8yghdDXlc*mV21yQ^Fqdu*$=|G8#<7+S5Wr{-&TketLP-7irg|?<N zx{3<Fo@SSRNAF-WE2$)bCjwmi8(S2$W?qJ&9v>sB(C=VbP7RNe2Cv<H05uzPUPc5_ z*7}*mMJtfgwFlwxpB&WZ%tqg^H%69`7;%G}CD6<lY*}uXP5qBXj9w%L8TBbVuYU4V zwM>`}HGPOV&#+^-T-S0F-xTUbl_^mp-`Y6~%rKUQ$+lRn{}yOXm+JsZbDyqLG>m9R zd68ABLQH?#u4b#jw}AT0X<rt9tm=vaK7Tk<1ib^KE?}y5{*iXOx~Jcl!rc|C&P&ok z-y0=<550-ujB@*{s3|M91Ma3zgsVL$sZ*DyH{B%VB(uFm#Z`y)CoWOD<>6X$j<{P1 zQ?*$7Xmq_?wJxyX!H?#wJrOaT;WM$87b+*2tn=<CBtzHmqw!q2TB>z>><4*2zyu9# zia%2(AFDc1A2n)u_weBzOzq`rB`Ku(%?Dlnj!FzsgG7%1-Ya!$qF*61Tl?zMwm`F` zYqmX`3Vh5sDOry7Ci<)mc>ekou{i#EfrGbWpVNuR);}#5bx5}4SMI30&~>?b&tm39 zz!nF|;>1{74E}4co`Dn4$MY12bP`#D<^ZbM$0#B`B#DStZLZmuhP+EF<&S+oFzh|2 z;Pu|ZE>GX}snBn-+T)Zm8@tkmSKRLB{Z1mqiFneE_Zqf))t~0O9JDsvejss&+M85* znj->=wTTD6H*2H0K6|o4iF^}$wdmPLD3`VHbB#*wRw>l6M42Dyqa|@8$7i^Qr7t6C zG27*J3I3u!wtMTvTonPfoK`gj2pcUtMy>FxeU$wZNy0VR>c%~uMc5ttO;_g8e0-Gg z6i}{zjK7Tk4v&vNKg;v3-s-XI0^<Vw^znqEOUxGFl5oQjPNEHo+*6~v-yxNknfXtW z;7eNzdX7eU>O5;ql~K7()hZViI+tN2qrS@~45|yQu1y5YSH6~C*Xzf6qHRF1ES{>n zcV2c2ejaA_XC24S+2sq_MZo`)?CO#v$^{2qfxIwKt>SXK`a~b%M3nYZ0Q8Nj+@x5a zS%H?X_M&hVmwg;LloM~;A(9QoDkXKdd`U0D@^se+u*x!AyA`axFdEds`~*{N^^luq zUNXJjttv&kzOuOTKIP4ab5%Cy0|iFDOR-lcJO*m-(E|99PN^(Ot(>28&?RC6;5UxP z;bls_3G^V)e%B$9Kg+bT+?Wn?A<p9%!ttiJ2d4C0p#x(ifqZt|%Goz%%~POB%TGRg z8w5dx0^JpzPv+G-DhHdmx?|CUZg{qy!myiv+1$q+IRL8&@~6(;9M^V-D|N8$s?8U< z41S`T#hPA>gaHBZ0zj8iGTcbnQQ^0mvW8{apyY6CXw8rO_Xy=VK@M|D^R)KHvT^BO zD^l7Oi1};HVDAt?mfAJu1f4c{@<&QHpzMKM)iP5NTA5#VOy#4(n4%DESywNNF>Q|u z*EA%nz7J>^(1B+zRUe$|E|3SP+rZurZMN+!(mHq^fVeYi(-mVgs8%dPZ*Nwx3~-0m zs|d`ULYKWQ37!5<1M*egG;W|%VrkPnD503~zDu<(7G22<p88R<J^||RO6(cYa$^tc zpJ3W6!`0%o^D-R3O@bbYnIdkNd{w1$Y?+7)>d7+#3J7YD`#>--Xcj<g1va2KL$5G~ zwpObK#ktWq$BkD71#_ZxpIRoH`jtWRMCB?`tc9Sx0TZUmAvN^dFZWtbr(r|(S_0Tf z;_ZR8aFxJ$HfpeE`w&g5-ZvS9kgrWVJ#gkCg3!eKZiw&@+`em}EMTFUr;%72bU|PE zs8uq1tL3)H5MP=_RH853n5)541D~lBT<v!e<u~w>A-m#)mI}CmSMDz1^R^&1ro;6r ze-pU^6)=*d_p_Nkmo@E8p1&8%rV&?EK8t)_MRPqJQakP1k+f!AdUZ-+uK<#4teo7* zD98ZXWloCpYQNR#t6dOG-VGNN^S%7b8b@{Hk2(#GTw4-Yk5Eoi-*ZBQj_RgYtsmh> zZ_!pYh`-hao^e@f!-_^jg&FD>&2jmtq(kLhJolwIf0v{EJo-+=pqd`WUB0rRzvdg6 zn6e1gzZR@)1<h6CP&wL&@_hU#lK&-&U12OsDV!fo8lSE#UE;%MuE^TT>f&9xi9ssk zF!P+TxXjEym8Cn>i#=M6h-7)0tvWsT=+u?FMs|oC6qU{}s9wH>RWG+A!2YT}qssM4 zS9YGMZ$7ig7-!v>Jd`MY$VL$O!I^YIKP@li1;N%EwBkRSxU@wfw7SdKW#>J=3^N(w z(#vT+Q_&jIS&VH+z^3ixU)1r|rwcGnDnn$<V&ozqi-TctBK#*-29MD1N@`jU;BM<G z)AkWw-7Bdnn~)`q4mdKUavCaIFtEv^B_4-g0!kgZN5owbrJ_iF$#Y$UOVuIJF+%M? zxl57MWXatHZ4LFZ>5<L+%RWVsv=&#cD7-5tWbAG;P3NN6#G~=(;S>UTzJ1`4l->qn zNYuk8iFl!SJwqU^h)$O^5#%_Ndk!Q<Vze)aE5Cv{rTWVe24uzv?|`&y^6M$9gD{0| zCQ#H8d|^Wh=3>l0ga#kd>hGiDJoza6OnOO;Q<g_V`^MSsPugz8rz6UB-mL`21eQ85 z!SisP5Ety-Z{ZQ=&cnyXgpEsIGF`=F_mVbyeU@9*CGb8)XanIvtf_3Afi+DY`2Gr( zTAh7xbbphpa1HB|h=zlJwdQhxmsIBE)op~zR?K+#dW^mvi^>36llNb}tGHkc7NlIo za~tq^)EK@xaPX~w?naV<&8y}%fCD$!Zdj@vFX4>0Khi)SNQ3$?Vb4MyAmp=EKa*fG zb6f}07L%=t&Eak7f~fm#1k>J0Wex2#!NdKYbS)+JV_e-GLjvEX!7VUHa6%<XIz)By z%p)<4w^tenh*-AzA<BvLs-mRrly8|H2++o*<7b*Z^7)B}1J@0<Lq%BiXR8efh=*2V z4E#j7pNg9E$U?$%_lR7e-kv1X`6&w;%|<zSwuB}nH2k)KfTZGNjxnP}lDD5Q^+4V$ zzo!oj38>HF3?#%m&P$;ERLcRpaQtE_8)i6C`s^zoVtg1o<deH-SQccLg<=fR=A$zT z5WqKCS6!5l^wY}gdkhKkZq;E81fZ+~yk{GJ)lK1R8nD0_N`t1qA&1ReCPgqC>Cqs% zY<AjGFr1a(ou_&9a#w8uglA5Dv(=D5es3$|=eEo2ocs~(G-7=Jp#1_o*V&Q<%-wxP zZ%sgr_cO$Cw%p!e2@l_Ke}gZGcE7?tdC<@)cBiKe49k;*7<55n&TW20o6(vDrn1~G z@f#oqc|zC|x|10IVYZWz4G7JMH5QL5+`ckO0(EamG*2}oaNm;3TxfftZl6!*ikQ(n z>r(a4@C+7e+lQAaguYbQ5iKQpe8`p2=%C7WQ~1Y(eusqwz5|6v782}(hXzdH{Qc0F zZ`A8VQ@}jP+wRqA|Ngk1V+23!v5Q)1OMGjd`F`qkd3m&~M;GW9BY9(o=Af0?UIImd zxT2Ht)TpeKG7V_`=0my7p1ML&$^_}LX<E^<SKMLCV|}K8!kP3kxvaqX1fR)QN$@UB z1zrNp;O5FYTbAIVT=mwB5hb~{AK)c2to&eKdcuJpXZT(&vyImXwuZ*qM6{KUyovWv z*8YSE*)2#fWI+k?slSrM8!ffNwXRe{*JhNA_eG!KFyc?Xu|wqI8@}m+IK;U76^d0R z<mf?qqhTO7^vs@jeIA7Ia2%u3T8f4qPC!EUibF!p?^95&QT$VI-#|m>;!7-#vYCvv zvyHq_*n&Yxky{0AktbgE1n4e!!$^dtcXN)JJnq6`R%lO!D5RwlEmvj2zC}d6x{dLr zBMjg|ak;{6DV-Aqc1y`Si%78nF`y_R#jnZTX5fvT9iL_xN|Xv8d8X%tvfV5hMe9bo zvtH`uoErO)yo|^(s+ri^Fmcerd}8x$WxV9t7Xa@p3{N1m2+uzVkKPOf^tL;mL3wSW z&5RVn<phevXKlP>RfUaU7AYEcWLt#oTpNETN^gs(NywV}lwUsNt*DcHZuP*3LN`iu z)UF41D2eJoL2=PuYU0~y6Sw0{L3nh`06OoBEU6+05BZ4z;<$7zeg{{SFx$x2<%gK~ zgt)XB+u<pL)!!WUw%jq>AC+(F%h%T?7e2~%IX+fB<ZVNzgV&7x{2imJ-Xu5BP%f@I zGgH>HlY`&hHqJnhBctc+tOHKh)qdz{YK_<S4@)t~(x&UzjILTE`LosVTfA|RKbo5v zukeVYk0(=$(9`{&+1r||jh|W+ya@H;;98tciwnqqttFH1|JvBofrO$eoe{m%m;Gl@ z9XX?BL*Ap?`3#JQ_;ib<KbcJx5#W6%<|mUCCS$2>TqMVO4E;xO!es3-V{CrsjV{&~ zlVID~nQXf@bZC{5M}Gnb4khdNCA&vwDneI-c}qcR{rMLv2V-C1fSm8CwM*+e3$h{U z(uCS>V(`NO$1bp3Kic2i=q`7Ka$o9k6z6hEAGeQCQ}jxaDQ=VXhQ39I4wFf!mOB7~ zJ`U{a|ICaxo|xlft#Bp2{WiCVjw#~UWU&O!j6p%8XQ|Eo!p`3WXQ~J}dnn8=pnFeq zC&A{6RHC|E@x6Xuu=6o!0$pBh9W~dN9Tvxnfs&G#L+gVk`F8Rt;?L<vKzc~4DD(|F zR2q^1MfVR|>1D`!l(+9%Iw7s#{1Y!a**SlmHK7kys244V8$=+YCi!``Aa$>tD+|#^ z&6rRKR}mm}X~5}Au6dZE#$c4#cU>d_2Ihro=xv3knlST3FAxq$8{OyoNPqcXSCS=q zs*axFC-9+s7Su&KKcSC-Vg)M&9}A8#Fy#d1KIq;})re+SY7##(pYrzGLhl_+Md)r4 zPu#oD=sZ6f)iRe9@De48yN<Rq9Z0&xI?D8)C9a#rtSk2y3VuWFKkhD_CNDiAuGk%@ zs1g0#z5fx)&{+s1aCGyUM~%{z>qx@sDg>HC$uU-_K8nqP+H~?+s0X&*QBZUq-*8RZ zFG44blSZ=M?rTnHZ))cbZgdGHWgMkxdvuujeWoaX)d4#jy6Oip{fd__$I7N}IJw-~ z$-=}Uz*Sj=OvsyW=Mnf4>CJe_?Js=KzG|HfI$0hBpT9YfmgZe~uZ!O1-Y{NfosDPL z#Z-3ju|8EBlI@r8rz0$^Nv}GvaS<DA&UV4U?wBh+al$%RycJU%f1JUQfl868E?i{R z@jJ_%rO%$g$Nqtvb^#t&RI6vIV>xgz(C^)4aUh-085Pem9_^kG;vh1vV$S2>qKHMH z{y8HGO3<(cquXZ`G5TC#XniraKy-#f>*i$P3X02z{Dvrl3HlD}ui5Y{61}-d8EhWE z&`^*P*w~1u2xO>_5BEKq8Xnf{a&K{;OFJAr)2kDhcqd)FiTSv(Q4xBWbIo)wD)i5G z0%kWncA4Z4Hv+MnUEyWdaOJ11^4psj_gi!%5Mo%JLvdBFnO1-GWnhZ>xH8dmhvUO- zCYuadWjIyD`!zdeLQ{UAirdb@sz2w+<!d$1Jq<Emz*l8*=a$?^e1F?eksc7fH=+Az zFKY5Y^h{#TB)pjA|NkWx_mo1^62Uf|hf;Q-hi%v=VeEMq=MQn+DY`j~n@|z|)}XW7 zwQ;L1N!URo2#G5PEV@++R_0ZeuXtFgFEkp@0Eo)Qh<4hhWIVqTAjZJ%)^+FUa~nu~ z-2dsX3VC_d`;_4rh-GpQ4VP-iJ&4a-!EiN5;BW<8d3~tO5Ae3?_Pt(B@&o4g=K1f8 z8<pxvekwf*s$9<`|0PHzmwc`r5(koJ*2jc2_S1^w;=n$gZvMZPU|Oak_=69YYWIEh z#n-=L^RI1vVv%VXk&ZP+I$@AND95tOA(~uZ=+^+tv8<Z9bkWRI1Z8izj;J;>3#<w6 zio33p22Q>Y()D6{@$#^)x%XnmAS%JH{6!Z^^{J}6{CzQJu8dhK5O%O8iv=Ea<T+OC zIW}3gMOH*C4o{dQV4?s{VPH=<kg!<PB36ro;s5T$;ogBgpxZw$JZQY2V1p<6{7K`P zlpaA4G#GC0_gifHMYjY0gg})||L1!5y(GPn{xWxN+gy=49Q|H@VqxF-rwA};3IDD% z$}=Ny%|&P!!<KX4&FNnwB&MGo{S!1J$0?)cGT`O1ABg-3M~5yqbMF50WlnJiK8Ny( zp)^4m<@Ep9+`nu4KNP5n82lVsA`%TJkM%5II{(;&o^+-{tQ1N1K&*c{ka}m!DGIJ> nVtxX{8J-I;mQ+<=gpA}{>bjzqZ7cc!{@b_5_bb+y$1nXGf#N=2 literal 0 HcmV?d00001 diff --git a/web/app/blog/introducing-cmux/page.tsx b/web/app/blog/introducing-cmux/page.tsx index 1632591c..474f1c7f 100644 --- a/web/app/blog/introducing-cmux/page.tsx +++ b/web/app/blog/introducing-cmux/page.tsx @@ -5,6 +5,35 @@ export const metadata: Metadata = { title: "Introducing cmux", description: "A native macOS terminal built on Ghostty, designed for running multiple AI coding agents side by side.", + keywords: [ + "cmux", + "terminal", + "macOS", + "Ghostty", + "libghostty", + "AI coding agents", + "Claude Code", + "vertical tabs", + "split panes", + "socket API", + ], + openGraph: { + title: "Introducing cmux", + description: + "A native macOS terminal built on Ghostty, designed for running multiple AI coding agents side by side.", + type: "article", + publishedTime: "2026-02-12T00:00:00Z", + url: "https://cmux.dev/blog/introducing-cmux", + }, + twitter: { + card: "summary", + title: "Introducing cmux", + description: + "A native macOS terminal built on Ghostty, designed for running multiple AI coding agents side by side.", + }, + alternates: { + canonical: "https://cmux.dev/blog/introducing-cmux", + }, }; export default function IntroducingCmuxPage() { @@ -20,7 +49,7 @@ export default function IntroducingCmuxPage() { </div> <h1>Introducing cmux</h1> - <time className="text-sm text-muted">February 12, 2026</time> + <time dateTime="2026-02-12" className="text-sm text-muted">February 12, 2026</time> <p className="mt-6"> cmux is a native macOS terminal application built on top of Ghostty, @@ -31,7 +60,7 @@ export default function IntroducingCmuxPage() { <h2>Why cmux?</h2> <p> Modern development workflows often involve running several agents at - once — Claude Code, Codex, and other tools each in their own + once. Claude Code, Codex, and other tools each in their own terminal. Keeping track of which ones need attention and switching between them quickly is the problem cmux solves. </p> @@ -39,23 +68,23 @@ export default function IntroducingCmuxPage() { <h2>Key features</h2> <ul> <li> - <strong>Vertical tabs</strong> — see all your terminals at a + <strong>Vertical tabs</strong> : see all your terminals at a glance in a sidebar </li> <li> - <strong>Notification rings</strong> — tabs flash when an agent + <strong>Notification rings</strong> : tabs flash when an agent needs your input </li> <li> - <strong>Split panes</strong> — horizontal and vertical splits + <strong>Split panes</strong> : horizontal and vertical splits within each workspace </li> <li> - <strong>Socket API</strong> — programmatic control for creating + <strong>Socket API</strong> : programmatic control for creating tabs and sending input </li> <li> - <strong>GPU-accelerated</strong> — powered by libghostty for + <strong>GPU-accelerated</strong> : powered by libghostty for smooth rendering </li> </ul> diff --git a/web/app/blog/page.tsx b/web/app/blog/page.tsx index d9ad9c4a..d7707772 100644 --- a/web/app/blog/page.tsx +++ b/web/app/blog/page.tsx @@ -7,6 +7,13 @@ export const metadata: Metadata = { }; const posts = [ + { + slug: "show-hn-launch", + title: "Launching cmux on Show HN", + date: "2026-02-21", + summary: + "cmux hit the front page, went viral in Japan, and shipped 18 releases in 48 hours.", + }, { slug: "introducing-cmux", title: "Introducing cmux", diff --git a/web/app/blog/show-hn-launch/page.tsx b/web/app/blog/show-hn-launch/page.tsx new file mode 100644 index 00000000..0800297b --- /dev/null +++ b/web/app/blog/show-hn-launch/page.tsx @@ -0,0 +1,212 @@ +import type { Metadata } from "next"; +import Image from "next/image"; +import Link from "next/link"; +import { Tweet } from "react-tweet"; +import { DownloadButton } from "../../components/download-button"; +import { GitHubButton } from "../../components/github-button"; +import starHistory from "./star-history.png"; + +export const metadata: Metadata = { + title: "Launching cmux on Show HN", + description: + "cmux launched on Hacker News, hit #2, went viral in Japan, and people started building extensions on the CLI. Here's what happened.", + keywords: [ + "cmux", + "Show HN", + "Hacker News", + "terminal", + "macOS", + "Ghostty", + "libghostty", + "AI coding agents", + "Claude Code", + "Codex", + "launch", + "vertical tabs", + "notification rings", + ], + openGraph: { + title: "Launching cmux on Show HN", + description: + "cmux launched on Hacker News, hit #2, went viral in Japan, and people started building extensions on the CLI.", + type: "article", + publishedTime: "2026-02-21T00:00:00Z", + url: "https://cmux.dev/blog/show-hn-launch", + }, + twitter: { + card: "summary", + title: "Launching cmux on Show HN", + description: + "cmux launched on Hacker News, hit #2, went viral in Japan, and people started building extensions on the CLI.", + }, + alternates: { + canonical: "https://cmux.dev/blog/show-hn-launch", + }, +}; + +export default function ShowHNLaunchPage() { + return ( + <> + <div className="mb-8"> + <Link + href="/blog" + className="text-sm text-muted hover:text-foreground transition-colors" + > + ← Back to blog + </Link> + </div> + + <h1>Launching cmux on Show HN</h1> + <time dateTime="2026-02-21" className="text-sm text-muted">February 21, 2026</time> + + <p className="mt-6"> + We posted cmux on{" "} + <a href="https://news.ycombinator.com/item?id=47079718">Show HN</a>{" "} + on Feb 19: + </p> + + <blockquote className="border-l-2 border-border pl-4 my-6 text-muted space-y-3 text-[15px]"> + <p> + I run a lot of Claude Code and Codex sessions in parallel. I was using + Ghostty with a bunch of split panes, and relying on native macOS + notifications to know when an agent needed me. But Claude Code's + notification body is always just "Claude is waiting for your + input" with no context, and with enough tabs open, I couldn't + even read the titles anymore. + </p> + <p> + I tried a few coding orchestrators but most of them were Electron/Tauri + apps and the performance bugged me. I also just prefer the terminal + since GUI orchestrators lock you into their workflow. So I built cmux as + a native macOS app in Swift/AppKit. It uses libghostty for terminal + rendering and reads your existing Ghostty config for themes, fonts, + colors, and more. + </p> + <p> + The main additions are the sidebar and notification system. The sidebar + has vertical tabs that show git branch, working directory, listening + ports, and the latest notification text for each workspace. The + notification system picks up terminal sequences (OSC 9/99/777) and has a + CLI (cmux notify) you can wire into agent hooks for Claude Code, + OpenCode, etc. When an agent is waiting, its pane gets a blue ring and + the tab lights up in the sidebar, so I can tell which one needs me + across splits and tabs. Cmd+Shift+U jumps to the most recent unread. + </p> + <p> + The in-app browser has a scriptable API. Agents can snapshot the + accessibility tree, get element refs, click, fill forms, evaluate JS, + and read console logs. You can split a browser pane next to your + terminal and have Claude Code interact with your dev server directly. + </p> + <p> + Everything is scriptable through the CLI and socket API: create + workspaces/tabs, split panes, send keystrokes, open URLs in the browser. + </p> + </blockquote> + + <p> + At peak it hit #2 on Hacker News. Mitchell Hashimoto shared it: + </p> + + <Tweet id="2024913161238053296" /> + + <p> + My favorite comment from the{" "} + <a href="https://news.ycombinator.com/item?id=47079718">HN thread</a>: + </p> + + <blockquote className="border-l-2 border-border pl-4 my-6 text-muted space-y-3 text-[15px]"> + <p> + Hey, this looks seriously awesome. Love the ideas here, specifically: + the programmability (I haven't tried it yet, but had been + considering learning tmux partly for this), layered UI, browser w/ + api. Looking forward to giving this a spin. Also want to add that I + really appreciate Mitchell Hashimoto creating libghostty; it feels + like an exciting time to be a terminal user. + </p> + <p>Some feedback (since you were asking for it elsewhere in the thread!):</p> + <ul className="list-disc pl-5 space-y-1"> + <li> + It's not obvious/easy to open browser dev tools (cmd-alt-i + didn't work), and when I did find it (right click page → + inspect element) none of the controls were visible but I could see + stuff happening when I moved my mouse over the panel + </li> + <li> + Would be cool to borrow more of ghostty's behavior: + <ul className="list-disc pl-5 mt-1 space-y-1"> + <li> + hotkey overrides – I have some things explicitly unmapped / + remapped in my ghostty config that conflict with some cmux + keybindings and weren't respected + </li> + <li> + command palette (cmd-shift-p) for less-often-used actions + + discoverability + </li> + <li> + cmd-z to "zoom in" to a pane is enormously useful imo + </li> + </ul> + </li> + </ul> + <p className="text-xs"> + —{" "} + <a href="https://news.ycombinator.com/item?id=47083596" className="hover:text-foreground transition-colors"> + johnthedebs + </a> + </p> + </blockquote> + + <p> + Surprisingly, cmux went semi-viral in Japan! + </p> + + <Tweet id="2025129675262251026" /> + + <p> + Translation: "This looks good. A Ghostty-based terminal app + designed so you don't get lost running multiple CLIs like Claude + Code in parallel. The waiting-for-input panel gets a blue frame, and + it has its own notification system." + </p> + + <p> + Another exciting thing was seeing people build on top of the cmux + CLI. sasha built a pi-cmux extension that shows model info, token + usage, and agent state in the sidebar: + </p> + + <Tweet id="2024978414822916358" /> + + <p> + Everything in cmux is scriptable through the CLI: creating workspaces, + sending keystrokes, controlling the browser, reading notifications. + Part of the cmux philosophy is being programmable and composable, so + people can customize the way they work with coding agents. The + state of the art for coding agents is changing fast, and you don't + want to be locked into an inflexible GUI orchestrator that can't + keep up. + </p> + + <p> + If you're running multiple coding agents,{" "} + <a href="https://github.com/manaflow-ai/cmux">give cmux a try</a>. + </p> + + <div className="my-6"> + <Image + src={starHistory} + alt="cmux GitHub star history showing growth from near 0 to 900+ stars after the Show HN launch" + placeholder="blur" + className="w-full rounded-xl" + /> + </div> + + <div className="flex flex-wrap items-center justify-center gap-3 mt-12"> + <DownloadButton location="blog-bottom" /> + <GitHubButton /> + </div> + </> + ); +} diff --git a/web/app/blog/show-hn-launch/star-history.png b/web/app/blog/show-hn-launch/star-history.png new file mode 100644 index 0000000000000000000000000000000000000000..4b7cb5faa51f6d1480fdc63fff464946291f6000 GIT binary patch literal 438356 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%0D^CfV%q#0bu&PY)Q>bi|n7Rn$8 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�Kl*8wSzoer-6Zo3nGxZXbOwxj zZMit=0Z*hZ@X>^pK8x1&O8b3QC2mmn<JD98?V9TK$1~)87R%n-Z4-0Vom`1?Tw+e~ z>s5utR(7l{=p3vZw7W4bo|4dlEZzva77OX=&NzR-S5DBIqrI}-D=DRMDXTlDBZ;tz zz6R?^&gBQG1g3-*KpF&X_i#@hSa3QKZdB<3X-vEFWyJe=<piuT?IA{5LzTLxB4RDA zDR7w)YCl7w+dP{Ya#jzwfVoMxrwu5uM$eR=@}_L<A3qw~OgY}{K;y-(^$Ocf7^1|F zaQd2?LTWSLY<O0&dJF4RIgGDFn1CI5$i)gLf8<(+Igs%S*PyvHnMW&Fzv}PS76urZ ztXpvj=+LOOYIA*<&qVfUp6Icf)85J#U+wEN?@z|^A<4*yx9Q41qDLG32?o8}@A%Bo z-V>grHsRDX-%{MoYiBX`uu=tkag6q!=ilRsM7p|Wy<ArDp8;RZ#vRJue~mi6cs@ek zq|;cII+5g{U*4=(ldA~(w&Tzq9HA5`CgNCZuxcWW4Xac#>AD{K%x9gR$*llRME7Bu zd~L;hv^r*zl%ur#UAw&aKI|R~zJ~ME-)}1x`~Y%S=OD}Lbc&-?!%&6`9XCoTY8m-* zvr_(||0|0w>lko%k@h_nzV2~R{e)f9W6}yDUFrJ1+E^?3>r}F`AZ05tU6dvtFv6hV zU{|jdDB@s7DtlJ&Qi%*1=)r+6Brj5>^gL}6k4yHH8{C+DY#?7V&qFUBb62uh`|48W z*h0-raT>>eeKAdpt6Z@!2*;00bgy+JtJvP8xtk<Pb}-0*b7`J17Lb^b$b`6(zfw&l zN0PBFBq<FobqXOc_es@)LNf!_QA&3K9;eIV98Vh5lW7DkX0R<)PMVMA=$_E>yyl&k z(87_*+py@-EQNxMzHXmN;c0)r1=WOb-&lGP3O0ktSI62LbWzEc&1g4Otn&(YO3qF2 zymbIfXzP_PNU>!Po@K41a8^K>+)<`7T_He4q%H8IcuzI<D}%fF%QK}N>9;*i+@=OI z?*?OQL_{9?e^9__?SX8#skWtD4ZBSs%!_piJjD8uw4<D#dW{!D`Ua*_98S!jQfLGZ z8}YvG{7J)l`DS#UPzqg+8fe<;dtkja6egnF{XqbT$eOJZ4*}=DpRXuJ$Gqo`ZMlx` zkto@qaWjH{iCyLF6)$j2<XLeJSZ4+@+tgOBb`hD~QleM0#`fYTl_jk*bjNOgDRx<B z<$}gz@9e&KoTT;ayx&hO;LkNJx&jqeuJui}L3Gig_HDvB|1L@MbfH&00&_?_9+=)z zJSlr8>`RUibYK5UELD8$Z8>UzgqHk9o1@X@&)|nHNADVU#^oFu?M;|hyxUs4>{J*K zP;6Ek)wB?}LQQ-$v3%=3c5NgUB?j{oX*)|N%r>t3?rL+PE2k_qm#*w+f7`KyjbAx% zS!&fn{dhZmu?)J_Nq@|wSCK~xjHJd+=6gZ?NWn3+FzjXJYv-RZW+p>S-DpdDa+1EK zwe=NN6DbToqGxI>qSFcxp+xS%&SJT<5+nP_gmSi23xtpN6dQC|^Qc`%!$>_huD-pd zHgcp;>v2+Nd03K4URK~441a>>6O{(=__0nB5#jO_o8DBGGM(lYTH7*scxQW{mQ>&A z$-YOJIB7A(<x+R8bd~fcH4TW`Jm7{x11M#eQi_S<px?bNoD1x_@8`rbXXb4BsOBdP z;%EibmgBtwJD2GWNnRkjf}T!pu?{vfbil`ca<@lgHO?EIx9`K`_SqAVH7qbXcmACt zqk>6y$#<p3%bDckY@5_O?~zydFH#7lIB^?C^a*)Q2d*|P=?N!`HoLdtACF-BX`0Az z@$g8SqMCq#nu7U50oW>sZuvrOHZNX<8Oi!3%)%smU~4yzR{Jd#|5+w1ZEKfk+o)bP ztuWAs)3OGzwsFF%0Fm48`muTm84;PlS?mt2<7xtre1f+h8eRe>6!!@Fr%iNN`=J63 zOs+>)@~hm-ayy-N_I0Urp>%hILO-6hLC4&e_UNl}i6?on(20^ZRcJR^-|#_ff7?Cs zMAX}4gI@VgrIf}%lHbrtWi;0n9s*pXCB}grH6?-HEUoUOSyu&8PcGNB6Hj8w+st=U z_BFRP#fpBzg<gd+<xZD)s0;BRrtTmoE)!*}KQx7os)d1YgReOLQ2MUwx<naCnuVJr z6$XW<P`;f0tDr+q{lvC}NXyzAguD)40^PZ9hj~q{1R~r=j52Z$g<SV*ct+Y|YzlGR zwT7)nD^dv0pW951XBR__3ofi(O0pKawH$`^1Lgx~OzdMJe$4^GIXQPonbeL1m#jP? zU(Y=8^sk-DQ>=mgwOXq)q}jp^VER!!h_mUPO~L%M-I(_yX6T&gz22lrwbW`mcdYeO zf3L~%W=(8WnyY;xVZInhjr|dq+wvx@yHv$g@H{}F$5U2>>M_Qe!=0Y(Pf0z$<iI;A z?V_hI5t`FkvESbbt=Jg0So1)wn^Uya_P)dU%bcf*dmGEl)K^U!P;rJ&%Ar_HlfPkn z&~a^7qHDj`gZ<_lS{8Xq7`>r1WT!DTwUBwN-0prw-4TbEjwqg#XflHkK1c`w(l<K{ z+{qT<L6-wMD2p)MUhyQqdnMDnTs0Z}Ij_U@UM-hr%@aacl@Inia{zO|gf}4-!QHlE zFcY<EDONyjNvFZ=T<X<nQt;#PX-wkA-Iy(Z%*N~SPjOr`qsZ|@4XytvW|+v$sUgZ% zCB7p!#P9FzFwHPyE{`f5V=Iy!#X7af>l1#$q`cC^UaE`lMjY&l)72?Q*!1N97gs5v z9_P0YaSPmBK%JuUc$b<W9Q-Hei`T~nv;)$xrL3(d-(yXJRK}*KEN*edvFED?WwyOj zdIbTrhSqu;+GO)$&M_0(w7%M2RSTDTa-Dj|2!`~fML{Pk4c(wTUU?(B><$?%>JgG_ zkAQ0ow%#`b%0xGTArjoaUXM%uY^N`X9$v4PaupYVpQ?#ipF5mR$mt&7(_*-E<k8J~ z35c`&lY2$@5?mrZmx@~-7Tav(`M$(G^nUGOAD2r1!Zo68`;a*56ty6|@fcVk0I(!S zgl%wbU(r=ec$q25D(~dK5^K>(HQEwcz{j<6rx2B1aGS83*XpVN%Vd19aMS()y^0RH zcX71J!TJ=Zh<!jN+Rw@OG-TT&<zTBd7+Un`IABh`9G|-5i<+&_1>K%Z6fHB3fTv<$ zW{{EuToKct7xEogno}f9uLTq@kGte*8e1YBA_C)5oc$V?lv=FohxX)k8=u~*;|d4A zV~@bE@w3N0g>&J}+eGar>T!KOL-~&{E{lDjJ=eH;y`gJevlq3y`SR*rFy_|j*X#_b zGjbEZ&(fB&&#MC|EK$-5b>&V3a$;lT33iH@Kfe9^Eg60eB%NQo4cmRC_fyRQ|EV^g z*WB8=Kr09y!Z~MhP7B>s5cNnOOelui7T0+0Ph}m^+`$G^!HS&cgYLv-LhxRBM=f{! zNY=PH23~Ec)i4_kLFbiz9=q?9$+OBXXL&8)`1)Og`63qud6lREoRd>lDC?p^H(GdJ zcZBVLLU^+C@q#DR9X|#SfQlQ7g4fi)rc693SB{fUU&@sqc-x`gV*zv{og=tVH6}bh zxJhpC``wo+2g+N&7zV~)8ZJ9wCO%=jET$2cC+aoT8Ovxm>rgzTnTPRw6%oM_D(!#i z1^^TT&IBA$=BiBeJ#(0(Ra5sZ$H6MrVA3rdvX`W^I65fpYNlqI8F8=gz=F^$wup6+ z$xu*H>uQjezlluKox6RhptSuSNsLFN1csfa{|zL9GdUN24o3e#aM_j23-PQ$Fy&+y zy)9Vc1f$_gO=Zo=qLe>>fpSknID%&?@k~H*VSOrM1v}XY!WIrajwOKk3S4dB>8`67 zN5;(Pnc{^=xH5a3E%q!$3%L1)H<##t41{w}iiFPR6C`l<6#Ddzm5xI_(o|lg6HyzD z;&<75E7%Z3TsP<~LXrJJINSGg{+_ZfuiS5Ro>4CQ=$Lr?k5LD^N2gbv@0zek9!EL} zC4vF5VP2QIahaY;1RN&&ZfI&jPQCP$dryhYqO4R6>!5x23kD{!R{`LWe<uEHZ{jq- zBRTZ(G0A3kr#zK*SFtke{dD(6O*VS@3sr-IJva~lGjU6x!x=u$QR9!ve>VI*;Q5j3 z?QdNWZsCN8iDl1YhmYl50n|`S_a;}<{;Ta`Y{<|y(uP=U8e?TEW_a>;5;VuAE<I`_ zgXEbMVB193fLbwY%<h|<=d}h=dc9G_hr>D3sxFtAf~Z89SQSdiS+$%3DJxwSFZ^_r z^5y3P7khWM53>j*63Bj%F4YDyWy`bDd*NUSkdG3=C#U|hDbQvq({Q!uc+v)XH!6R& zfNoj;QWNlfkGB9G@Sin)zuGh~|Bo8{8qEH|67CB2*p04UEZd4+vjs`Xfud$KRcqdC z!2I3qK{Ymr%fxfShja1Cbz~*CRj$YBy6MyT7o_bo<~BMWKaamEr8)Ter5#2hXHRi# zib2r+J{1W<Q}@HkH;OTHr7?W2vIp+ap<_Fc8RRL?mb%Vzm&R_w0u{yfctBT;cU>KK zb2R=zJn7;O1l|(LY5LzrKiPYjeu7`$fhxeaec!EyLIJo4QG392H!vZJ1XFSkQNVWG z^L8-_K-0Gt*fr+Nl8MrCbB$#{O)z?cQK&M7%<|y+otKUMfk}DLp@DJ4q`(AU?%d)L z&y}0W&nrw4>uvI*kg$X4>@nq)Rpe#z{un^xmF_*@c`O9Est`IZu%H=q)JL@FUn3U6 zq%D4%ry{?%dVVx`PEx*pp|2g~u*K8^bpEZ6S)Tz6Q*Pa_kslZmd0Hz8BcR%BpO9n% zcrLNLh)<;f+Vf<Xr2SWrQ$$%@>e>-zC5d36*%7@;wuBifQ7w1;wXwLrFWjd=*vnZI zG;6%9c<ne8dQpW;a<v3x9&sGLd?CBKzm)3mu)eRal7GTl<3O3&k`O!3%IDh4|I7M+ za`xZthDa3Wq{tJOl>5v3zAVDlWVe%dvAyjsjvr$UBc=fF)2!MBfhlAA_wTRnyfGNo zC%<*&=$mwZN{eP6Fk~KuD3e15(B*i7@ClyN(~A6&($exbJ{kah+ZF?&%!Wa+2oFsZ zYAo+~fDc_FFlpm6P@nMjT+U?Ij^$eKsqA2qn5T7Y=8>McTT1(sq}bg`j^LB;cOc0f zM;{6B^eC`LJQnzt-*);cG#q#Nq3Kb_;2Zn-4Mlbf)e8d6O{bDU<tP_<9f@39F1kF} z#iQ*yd4+o-6;Qx+9_;Fr?q$`xzxI!S)glY3ccAXyJ5@$w?<T++JYA?U>s<;hS6s_A zS2yTYk6t*t@1bYX#?QSS05iXC<yEnl`R3Ux_yFip-h^ju{Pm~K;Q6rHuwx%d59cUA za^cN-Es3~!&ohY#hfAVYDJW*RS4yHS2ARzdD!}VDv-dfsoSD*bDYea2HMTxO^-Nka zWm4$3*>+tZ3$FdLd`-cgUa&E;dTGE=Af>y6BxOI?xcK&?q7SEkEWB%L^*f7a)foZ& z+KqSM1>F?Z*)vbdnXf*?2uYpP7x#!boTeISQ(|lDQcMcN<lr|7W>+X$&!`eyyhcwy zO&yyd(MG1GoEKldl1u;#G^RzYuI@miO7MD@tp}vvSu{0^=`?nibtHTR-07F&;Kpt* z-Klj|bfN&aR93Ma?S7&ytj|BevzE2D9FkR>YJ;k{^UmWy(9yCqZ@tM&>}UcO0@9OX zG`wE(bIpP_WBTmm7+@Bf>cgB{`?A)0(WKX2)@w3?h+|K~<wxDMD6>`?PMm`tBX!LR z7L5(u-8V$cHjhzDMmqX1)D$419^E}BZ{F1O8{w}C7|?!mlS24Lx(`KJf4JkhQwwRe z-NM<aDJr+clk3}yDwkT7@~|kU>u1AtR6$Sx`)AI@FmJhnx&-ez<h@-_JCJyjz3nu^ zJsH@{xPOHkncWc`8~q$*1qMv?{f2V|{?NCOt<~oA;!v6QM~joYg4`K7GuwR(s1AyG z!OfMew!$P)KbUEx6K1O5;Nmu*MgPwFS-Dxdt=d-r`Maj_kW+tpAYf!439)#mX*$1f zuy;x4aK+WA>bnDq1-e9o^N@$b{w~%%4vAAX;+-D0ov)^2RlD!(%XATWe%Mc<$-+eC z_=G)>)fev!D3UX2WB?nH(##tl-{|N2l72`e?p=3muk_-aU|a1%YD}idoT^E$xPZ)7 zj@pvYo_kNq0T``EiEl0dKx;g@73s?Ay`~D_ZmV)bV@Nnc^`vjgPb|QG8Zytn?~LHc zl)6j6NLhB&yKXPYw9r}c$MDxvc6Jsa2~)O9OnMZs)x6IivIg~ETQ8@%=9(&M%C>Og z$DNm$Z%2Dk8Y7piZOY6<T<A)RF9W%F^}#)h_xlt}q&otE(x&XF5DxN1QZ$FDU+w=c zlUQblSTmb%PZ4gbRylei{djpfE@YaqL{|&!EDi&(nJ1&#qyQfK#2IwKYKjcitd6d7 zTBJ*TWcA{8C&SA4g5C>pZWiF4$~TxpJ)+y?OZL2f=MS_>O^?U90^N}OttX04mY>Ea zdDTW+Ct%A?n>^mrW|n;<yyf7<AO!l(P0yE_J-29K)327Cs2l#{l8OqWV@6F%*J91Y zt#=AhC}e$!l$j?RwK4f0mCqTC{1xMu{ZetpH6@$fkCvS*KPQA#yArSSZqXD;QBeRL zItHm8su_Ex)3zSh;vtM3(CGy?<T@N*1^NfRdky1W*-YYhkNO{g%(SFh(z-^^<{HWB zNw=qGr>O=MIV92xAj3(7@_=zY(Y`D3_VqU0g8sUdMRwfYJ$qd(hdrIT@m_AO#XX+w zJ_>o^bK%g&<vP#!DnjoL-}^Ud%)Uo81b!9et{D>4A#qYoWMp-&D`CnkdSbO{WXUw` zn}L_ajhyB6FZZj&ax>Tngq>Zvt=fn-QL6x**v=zTrEQ)liN&CJ?9HXIPRu77h&3an z$gFM?y5Fv%iqGAsB|qd+(uYOq?wGWiDBmXG9;exQsQqVFl9!Ptu(4H=Po(l)_mf^l z+*`vZfg1++^3Q8aEg3Jc-AU8SRZmpPEL!ikm^NYG)ov`Ah^}y7<OQkJ+Ps`o&a_!u zSYyaXh5I_2zH?kJzc(qow5nfxnl_wqyrBDGN769WW(Z@~SBOTXx)-6P_=3XirRJmw z(@wMvl{#$qjSe1bsA$Qw-LUO^2c-aL?XG}cW0Krc*G(xNTAhT-d{+P<>|8P>tLWBt z6Z67VcBkZ!d-x|L>=ECz`FflMC6{iu8k9@wbVt{br$b)PB(03g617sF<X!PjTET@X zOgdO@<O2y_pnal>5X6fKbpIxWQD0s@^T~A5N%_q0A$nT#vTbR?Y_k?>sZ4f}yC&k@ zqT=x{=?8(D!IB#&qITEWpNZuL6I3H1nU~L3=zV#={h;W^$BxRta-CQHYj`ACI(9{Z z72l3ec23ZQxdH%&tYdVMo!YuHf~o7XhF2`|EwiYXgeYc95^D%ctR&ZwOMqbzaB6sa zyJlLVbIF6^vy-Q@=|r@_fjJsl{?>g@Yh3A_v0*15mFQF#xt(?u3<-!C;q={pPiQc) z{k%k@@*uvBegHd7!@D%vhKp2bqAt_-*IN#glqU_AglIs9<kz;QEz!tuGEtFToVRLC zmou^NBm_$40$844n;n4=d{!3goZ{Zx7yn3J5NlqUFX1{H|E5M^jZeAXPf7mIMfv9| zd+L&}hAEOiVf3ASQ0WHA5BKF%9mZt3SMBAhJTc%!Ps@PQJ<tx@=lo7~Cag{#Y4Vja zEOYEs`M5Y*vrScNPj3Muf~~gAT6U1d4mD_B2fYe_*NPny(FVo}eTASl<F^t$%iBr` znTAa9>3Mz?-Q}``R{DbANJv7+^N>hvcjjt}wH(#SPGufUbuwXv(9_%zE=Jk#f_Ua+ zb0se*Mgle{KN&PV*tYO6_mbq5S1tbO%vVE77#BcQZ0Vog;n#5Hc^(kQz87}&^1~Lp z(YLu32+el}Kf(07Mng#RndXiCBbu;>B5lWCTMi=v#j2JIUF(3VE7{Y&UctD4JPPca z7x;?{t!x(9+VS<&(LE>RfoU$98>j<4Npr2UY`VlNS@(X|HRa^iB-W};U!4*Q>-srV z{(P^r-aIZ|ie&1Qq<h7Pu0_9G6EP9iwDjPc0-{(80P3$+w66Ayvs`9dPBixWYLNOD zpnj;`zAV*%xYd^h1@Ee`Y0R-Ry`MA`mPTFRt*No%J>BIK+7wsoID?{3%WBYTc&i)p zxEAh9Kx(>h^Fch20X^m#5t6|a-gO~cG?O)F8}x<;-(Gypb(WpYYqTNnEQE4UmsV<S zw9WASQM@l{p9y_W+u(+8TE%wzq#2`5u94H3kHFL@xkHWsfGNJl`QacG3&rnT#9f9( zuMXxP8rb1`^g5*9wJmO?0%k4yb?&n6GEI3kn5KRDP-imE$z98lTD5c8m+&=LH$ji% z(^M>YYO=a1A7|f$=1%djHPo^lO&Zm2$Xaa*n$U0-ag=>GOvRUrQ!XMfwZXLTo_&XA z+)jWSJ<Mst%Xivq6d&f8c$yX0f+6qDLOT}E$qI#@GI_#vWt~5;+iKjd{!lY(>Va%? zTjE3rGN39pPR5HP;N^`g4uMJT>}|gmD4u0{QIc=ttGif;OBF~TZ~So*TW8np&D$q? z4Ln{WYxRcv8`kvchTpxtiPn|nT*{PH27~7G4Q;n77ey$|6P*i3y|g-;*s9)n0O!lm z{tDFY(J&&v+j)C?nFnKu*XP<_#-5Db^fJuKHc_#%n`ZFzZ#E_?A-nk4I(6Mhc9^tE z6{fvKU@FWC##_TZOXdDlvz*`c410GHePTCaY;3S3o<9WdYh_UnbtR*ti>}LKJ@t>~ z7EAHEk=`8{9jy2F=5@Pbzc-%=weEYUguQc^J8EMYe(m(b$|x?CfVie*KWm%CP&?p+ zsyufACCokFmnryz(tX=sMteVe=ONiMzN{w9U@C#R=wM)&cemwv`fIMeikxnd$M3b4 zy$tnxJbuGkzIhiB3Y$VRTn8>mfMj89m~A5Wt2KE+ZHe!0$@EAE08MfkOeA*a!f0Nb zBCnZ3&$4;S?Jys9-xt8((@ysu+*YD=TfddEkKN$S0g$jo&bdWMDL(G<3-NO|PS7*2 z+V&{U{3&*;gS0w!%0ihJ8ahB*YW`#AF560}(Ua$oQ|NM#ZWn?~z2DQc1y0|ijRyj@ zpC}`jv%l=bv64YBZ+w;NZ;01L=C+qCC)ZKVj&MVHFO~QVFxK+@Yq$A@r|o;_t;;ND zmKMaz2@MG-)!+|rI3L}gvve?eV#)w>d9bZkt+r;`a0{>n?ozG!!<vly!Q?Yl6KRJ= zv8!M2108|JK$xEx0AvwLslZry%rsxFueq<iog0f~(e-RMYj#Dx`7tRx9g!Y(j9$w8 zik)xnemn8~L=W&m&V?Ab+g8)s+oYMicg*05vw=nwM^d)|v+h$Fak{Wy+=H8(0hI96 zpw<*+PVSMDS*^PF)BST+q-*VWT|9rVu=3D>G)-xTna}NM&3YSBAL7~7z{Iuce9*q& zNMUHM0swLa3(I^iW{aR&Bazvq`V#U^$eL$D50J)>COCj|cycoFUvXzHm!>FZuJhR} zGRPtbQ8b8MM|N%fn3cPAWZaBl)po)3K%^{h?pi?7<VBSho7>0}F1^s3j!zdt7oEQC zz})j(O=mzCOp=RTFpl33t`KOfjhI*~_pXXPQQrKD69}l?kd3CjSFUyJv{l;6<qIZE zPZ?e#OqF0dGpn7+U$4emP5wQW2z*)r;0$Tr+hR$F;lJGMLB*Dku$L9gKJrBx2y-9f z#6jwm-2g#5M?MJ;wa?ssU?g92?nQTzUZ|d6`>|ubIVj)5WXE?aH`Bepz<g>A{d7nW z#Wd*pDwe%RiExPHQyld?(B>HsH5s@##~0FBOrEPzMj$ZX=k=btMAZDKHvfhr*fsP6 zXE=WRF`oA2E6%tQIAV7P#w$s~p84s?!(DApoZ1<UHQSDU$1z46;7`7pWTMAZvHU<C znX5?nRN^wBxADdg3W(7#LianIBg>cn?gfrf)X(Pu5L65ZdZOv#egJ*F55Kn~eL6x= z-hoSMw^4*PH&}o(()8UqROp;Za8T5#JN&=42C~b?IcfN-O|%L}N31OmrZ_9`f~5fY zQx%@B|5x<rG!GvD^VLab(tw?5l&v3Zy(72%gwi6@cwdYBKk<W22*@Tb39x6Zv(O!Y z(R}8Kay5clT^l~4#QPH#`GI2rlcT4cHxd2g{r}iZ@SUEYQ^3K%6s?NIXa8GUIFCsJ zXHr<Dn@e3~*YI``|MP&6O`rKU0s^c6K&62#Uc*PC1IX;Tps#}9n7M;|i9b2PUSrl{ zuH^0i-`pVQ0uq%B?oBxikcf<cHp%_fCdc_dcNA>mA{*5Gxg+#9TE1*8&@}|f6nZ20 zfQ3akMnF*&+nWDbV~SuF8^!s-=AU5H_x;Cg75)un`~3sH3V^R~WljL6Bcb2`xlrkp zfq%UK_=?|;Px|}s|CG>gkN*Jhcrk!B80cM%1&(B>lLe%9@)iH^j~$cXqa5-7d++2g zivQ!YC^j|)(it+{14NDWR0&`&qaT-<#%}~{;ne2%Kb*aHP?OsiHEc&ODk=&h0xAkh z73m$X3W5R_Isz)401+Xfgd}1^q)Au0(xik)?+J>8-XTCjH54f!)C34gz9)G7UGF>d z&AjvelL3Z#lAN>8E^Dp5&;L~?1ltOJPhh)q0x*Z%PYngYqX2p(@?sSKT{dF5Uqnmt z|7lr&ZAIfpz!;RjL%r*-?Ajk44Ybf-fK+~v_+v*{`@j6|K>PPw{C9``+0{RxU!Z;C z0DGv=NoBxqu%{2af?!Ufte>I&ea1gO{bvdDY|r-n#sdClD*wN`Sce7D#V!8lY|q#j z0KAE^RwgHVF#>)ZU0*@-6|6|95tSFm7)iq6Ge3sll-&kPtzjP~44x(b#}EUC{yHc~ z4TUr}WvK{oEu7S37Dw5#=sy`|?mEE8qUcXMJpWM8r~2&iF^Es{tWdCa*Z-h#fw{z+ zVqV6gQwJVdRpFom9$D*TZ$<*m%RVsC<Y?pb9e*}gy<^ACnF^2NzzPF=QXgVG)*XF1 zaND4?cK-Fie_?M|ob^w~Lv)AtYfH5qdDe>7w(!-ahAj!nTF<6;|9H$ZH+JT1!@$S$ zYU4|ClhUdnkP$!FGx@Cq@H}nQNBC)PSHpFlwiHVv-RR}lJz2@V%@yQ))yHKcUE<V5 z?r>bg))rjNp?+DRLmt$R8>Np~O@|a21d|I*g9mVj=9KlzMsYLH?~hDUEMfH`w-Z{0 z9K;6D68qSxIbeYie_dvqUG14#&+fI$AacpliIzBv72dY8DXC-u8*a;}CmrS{n4u5K zjt2f)--8OkI$<GAD-)*HLPub$<AJt{Lq4`!A+jBB1$rmny}jOKA)lkFN-j@>+x1Je zqiVoG{>=KU2+d5xVsOo*2pvTmnN0RjS7rT+$J<#vqXO{Wadyk(54p?i<Vt4eF-^Vs zm$FvCM>}H`P`GS-0=e`4$e1Ds=LH&n{>m3F{J3)ECas*J6KbI3)g3+R^CTwq+rIxC zpfeA4amGr788U63-hMna#D{+#6D;A|V_UBMA*t(jvO=3V#^3&LQWPuEP1IGQ_E6-0 zKTkA>1g!F{Dx1f{&|8#7GMp0fz;j~~nqcBKFHi<P?dw~cdjRazHf1!~R>-BXoN9~= z-bX#qAmDh&2ZgljF1HcR<&iFN*ivrUT#YhJR0U&Y3oVNr@EdUtem1UsXj|(1&twE6 zt7p^cYN9dU8!Wm`L2LBqlr0rpCR}@-fT|E_ZRh9<{VEuulxl<GXnuq-DxTas=wzGQ zRBAa0o3Ff|UdN>02-EoSgr3-A82SLx785~Vs38h=vL+iluf7mFc7c)Ksw3q4X1Wuh zl@I?vhJ3xcc;wRetFjJzmM?1c10*Hjk#FmE9|o-A&dXgrnFb#1Rg3cwE|`ny*52E` zFKkGe`blkN1FiYyD2sH17okb9Zqz4Xs#7PYr!f7h6wF%X3Y~(j=asZNBA%(3E@gIE zdi-qPCv5EX;KgX!?Qv&7yuN(ypFO&H?P25MS%Yb*B$T8=E|^k%t?145D7RA2(t-2< zVX$AcqGB_@fT8+|+%&a{DZu(sWSFOmG<YK|ZW*Bs9#^xgU+yCWNIoe3JeJbLxJ+#r zC{>jY9`dBYadvlf&9?ga9IqRwPx|N}3_sR4j^QX60l`tov`Kr3sSP<=(ki)lk{4*6 zRmqz>8++bL1a*5a`-27CJMu7W+o7H19#fv#<i7W_L$}3ERKb@}yv}QbAm5CxZ@KT6 z(wlf=<;U(#Y~m9kNg7-;<dmD?d%3UHN-)H?qKP%X8HTEB;}O{4Y=$!9h1N`HblN|D z>dc{?hktQAwR+`E-?xW&o^jlDiShKZW7;QS!1Vv#nQ3%$7rF*N>Wuf-nakka<O`JK zdW{R)sNZ}zM#rmrZ#AeaMc>ckkp!-6ly^FL7ktxg5Sp?c(cqPR^LuqRt)zXJrZEO2 z&94R=Z4MPqd`&A@dN*$-Al}1Fd{6_m*A{yD%C7SNn2^#4un_TY%nJre)X}9X5Vg)z zYCmt0;0e_gcSnA%JFu8|RN0W7xBAv)$2hWg>0E#ITw|8D+%SS)=a@ve`a<LSt6}Lc z?mywSTjQdFq1ffkX9KApUp(gImFOK2p8`(>siVy*@2Ij0`<kNY$1FKJcyztg$7*+< zTUHG^ljgUA^3KzqLl}B=H;GzGANIK*-V_bS&|`Zr*Es0mGu)vEk}3<D<$dU6)&WLI zI=?FM56^$mVP|qwzGhWZN>o0Y7l-VlaGb*D@()%FQlb4U)q%*LzV#<A)fhsCIy5tl zH1G4+=i(O|{AFM1s{SX8X*KRyewt=}VfSHnn0R~ZnWFRY{tY{J&%0L49*wQhK)ktQ zl1YZb#6#a}vjbh4143L|dFPI<XtFRJvk;OzzQQquS9z=Rn%FTp@C?lJGs|x(=R`{h zSjnouFXnc{p9Z%5&U=NQth6a=3;O@ON`^lW1Nb@V=!sG;&67^p#a7RDI159>Of9#N zJq<MFyC+kxol5{0d|))OH1eNnW`|trtGs1`>J=<}s{a8BJL~!Ygbq!CEz}2SjCZM~ zc#k0JlvyFN;*pm+uoHhfc5PMgZNR_32v>7T^7|1qvakz13ZEuNd?<3Tvy%u=%{aGf z|IfVx|7!}*W1j$(mspnc#B{n1oa$?Y(EQ@>I|(Dj*&t*xU>kc^cqg|IZowi%i?vyB zGrgRNIedwIh(b6!&-~6j-Z=vK&Wiu8pX|}EW}>yyqxiGO>8w^R;MbcXcT6zNDlD7n z3%Ric4DVqNQ@gLtH~2u(J%`$Cs&CV0fE&V1KxK}VNWvfE&&~+!47-|od@tf8-F6-W zTWA~X1y`-$qer|x6a_Gby9!?gv#fI-d^gEIv{o)2Ub;*WrfIT!gmc9-@B1$eI--V& zrC}kPOk%S@dO5W=EgY9$vpFjUOZHjTrLG5Im*^YE8QH%gBs)w3?M8McfTNC4=iE@9 z>8+3zH=Lr#>wZoIg5nq*oe|7qydk(s$=`hfGKVi6@m*{4f#g~k&=1KeiT$rLjBP|C zdw!Oe?<pS_&tGYB1@itUdv~!SzdXrmY~0QVw)X6+-qQB}`rOwTv65mVGy*Tm>S%OE zjxZVcX{NkoRaJG!magP&s6w~c@AchIxZfF#G3k_05mfZozp!Ea{ImRZe4f)zj{M$u zr?NmeY2W~f)NkW$g-aG~PtvF(psiH1Msuap*PPGQX&(%=@$Q@C<LmGi)*jG-s18{a zLEW-h2#xu;v!s8Q{o+&LkeO(FeYKS+S6W@YZ1(^Zg<#1q7R{Uh;rHav&7RAspQ<W* zlLDoFpsq-3@TOd`&*>?(s!C)cgfqV0;|plr-^uQ*{9PhkkbD=x5pqGYaRL|>rnTp< z$M36k)6N)hzhLWc3WYC^tuf7!`zHi^SEh(C#a9mS@vXfU;pJ95@iJGA{1Zj?r|q!a zPVpNvo}EvwVK##Z^fK2_+tE^iqCPKeLXxI;K6TJiV(Rz=1qoaI84<GrTNs?aF@m79 zMMqvVZD{^6ZRLMAb?E`L{zN+njJ2m#kfla9?`PdEp}^L6j;iogTz2|BYx#<VmM0J% zZ|_nQMfocLwvcTl>`;x}gv?S1^vUKT8>~s`Q{A!3x$yPr(KZE;9i`V*)Dg>|d55X| zaGFcxlqv)-^e9RNMcVjpypl&W8#xZnUUA$C$6lwak9MfgLsmW=I^~)SMe?xzwHv#; z&oTk?2xvX<gcPTI%YyxVubjQ}4*aR<`*&w{?QqdPV6Ql@c?xpL`3GnPd-s%UU#B|} zQ`1wf>q*+3h0Wb3Rp~``>CZD!EKVU5cr`88dVT~>`~S9rZJUTaul?m4eWb;OBNZhU zdOp4o23tq3-TwY)SS65ZZ8BA6H~1HMeg1O?8ZlXW1gEoG^T})ES`0-wzxj)y#&~)o zaB%j%_NA{WCh3w8YXTi3uo4eM!j*czMP}eRQ2}^$A3c*_cv-|8>!Go_2=6MP5^70{ zpkVl)pW|Kpjt*V!n!kXx<(3^SY<sUD=~4JvQrsj@f%#Ry*8!NX2EN5~YF~U*mw2fs zOO-RW6@BxqgtYg3g(s^J!64Hb6>X5*zSA|d`RQc;=E@T9l+Wk&1bYjLhO0e#ZlYY| zTX)NcToO)j{=KWeLo;~S(Eh1V%&H1|XwVU}XNoR+GC#3b>CWk06zoc=jLg$Aby}$d zQ(0BRwed@1bQAYE&|?qSW~(OoV;#n0;?T2xT4lS+(u6EYKn3bGi$@8ZOrI|4KS@70 zbdyJ1%BJ*u4oHJ%x*@&&l^c7>-|soe`Ohvyht(o&V1r77oPa9-$D!cS!-A(G6s4Q9 zRJSzj?``#5O&JVV-;9R$#h4E2oQ8);9suLC)l?@iwBjNIuC>td9~+!%Y1Y_NMTw1@ z8Q<2u-KvKwOQ%aPSk<4bsf1Ynr#f+URpyZr2?n3$ZwyzdPL|sG+vZu$jq3<?i)7`f za6lLAkm{?qa?MF(@xEN2sQIfLeCUK%MboNjSbocylYJuWHpger%%7?M+AzDn0hbu` z7Vrnf(4<p17<v#X^_Tysaj8S-lHg{371(ogwW3X9<|hdSCzgiGjbwVHTPL;Me0#e( zdf?Z5DlP3j{~WG>$44)ZIPtXX*%p=EN!^9BxybX=ADAQdO02g0Xk$=qZP~t4^ooVe zIZ_|Wh2OeN=QNSv5bTD6y3xWL`FBv}Vd2B9K1A17o5Nue*45vn#HGWftt;g;KsX85 z)<hG&QAnp=lV9zk#^MW>Ib#%2hk(?IQ@?x^{=p&Sb90Qt$V8B7S!tJD+W*FQnAVo? z=NV+5lx)r?*H7(|5$B=*tf7U_oYc{?=FTbpm33jE-XTzp#XEC9Zb=m`)KGTL)s&5v zV1yV}>41916lLw!B&vNoY0Z&cK(%)sO_S6u^>-W#TrwT?EBb+e_I8jGB^8EU>eQc} zs%zgoD;_J^BeGjtvMLoZO>Ytvvg8)gzsy`1D-@UZHc+F!d~3L{{_{mZsefhQ`R4qv zdeZWY5M#5(f!y=)S_VifP&(zw#-yXobqIZkI1wd=JSk65O0KaefoN=v!E@bFm4rD` zBPr~uV%!(CpL16a5C?v{<n4_e<ZWE?yq6s1un~>VF>diemOb4lOsBnZ@wsIxVH$kE zK26)wi9$anR`?&35C~^Rdy7}59PYJz(+1o#P|)pNdmVr04aZ-NTfeaY8Fpt|>W;k= zhq8nY`j09t3s(s^_<N=<q<%gTibvIWc&$j56~-$Les!;b%{c)u<tHmH%~p-2pWLV@ zL#1ICVt&%n*O>e^e^*P4Qvh}P;aYs(vdrnt>#4PSPX0MVZjkpRoy3J-o)j+;AXkkd z+7IhP-#B@nQZPZA^u!v547jhjrL~oTd7S$*V<ekmbs*~J{FY@zjfOfDz(aBw3Wu!h zAuH84kj@km*{Lm$nlOV)K`iTzihwa0Wl*GiLs)YbG7(D1F7@C1*)JTZN^~zPDa|Jg zl!3uy%8p*dB_v}_5tTb1Whlb<`9d*~AV1ffqu{q%-W_S!+`I6g%wxR~ybBxQZ3SWK z{AXt2MOPry&UV<G)f6oe=I5iJ@X@GlL$e}?zIlbi+@^ks3toX*fZ4ZQMAwVd`v02? zUpaeZlcVj!`}07zFfh(X;@xVf@LsjDhu5-r*q&@+7k29kem%b0e$K?8rgANWUU##| zb*+0~>&6P|DX|OjL%UN(+A0Idy`bIo{KtM3tN#pA0iGzjIQ-@=PP5(f$@K1!Cih24 zKc8O+CLJ>t7+t>6Qmo%Q@Hw;V7EDV}u{}vsmf6%G#6S9uu(An4y-tuj==B1FoMQkv zM+h{&WT0)mYJq}b;05VDTo|m*y6xt9l6)Vjd!aqnQh~Y_^S!;OU8QdT*Xx0uzMGi; z4`i|<;MlQ;IRLHbV=(*ei6jreE62;{@KLIMKr5CsdgK{z>y2|wP7<>#bW3W<MshgK zU+(HxuzLsF>399i%UuD2?ysK=9b`|px_DtHiT{?~fq)7&CQ&bT*=3>(mrX{FUHyox zVG`3l3g|+W9m<mv_ksEsWY>qblr99$K)ZI=&52qA4jj6AYIz-~b^J&7WbZb^JPm~| zK<3;&<qB519o!E*|9|+`k&DoPv%;@WQPv1$3rA*WT7(!Ivk71EDDTy`5Y??kv!s3e zs+O)Mqp|N`#A{WM;I)d}aCyWJ@FkWzbR*{qIYCV^-&nO*WZ`Sg3RM*Y)>dbIx;4}n zB?T^;jE#s(MvRn=Bv3HqDlA?b5^8Hvq>{-HcwY9^Eq>vlTFQ#4#KGRzW%~cYvd_TT zrbY(htuxA{Z!JpC1LSHv<ilmw7Nl(gWJki<2yX1k2rTKAbj^S=8&7LU^ojPIs&KT} zMt<77N1w*Vpl%kJ<_JIJdHA0;{o|M&T)R10r?2b=baPsCfd0Z12%oOAJ-)pmGk^Kh z>SzQ-6Fr!lMVUN?&zL$bixE)10$r6E{!v9KgiUNF_gjE#)N3t(x;lfyyzceE0wLJ? z-Kv(Wf!8fchqHd1HR+T=TV$}l9~M7`>ecC_UNHvatFd`^N0A^nweQSaoA;(=xCY}r zglOgco$1M{!2?DAWBVUHdROF4yj5kVTZ6dxHLfuG69*UC_SQW3JpC!Pi%$)}I;(c9 z{K|dLTnIS(B9K2thCG~Od=Z(#h6`($BbFu!c$oHK_4PB;RE)Q_24kLdbFh1oe@cp0 zY6IWIHYSw~P0bg~<(F=KP5n^B+^?2W*e6~>+mLq^?thJ`D_r~mLW8EykW`E39+?0F zOMcod0jpxSeyK{sz{6qgDXuV3ttH0IooL6Oof*m@<k$IOwZX`iIGZ{s>v+6f_s)yV zZK1l>nU!6|><K$BwSjoNdH*OLc<nM7ap})@_s6*Dfc9WS#VxCbe8Oqyo{qv<{7|FD zLsl3xg&$p%>^JK?$50%3bI_l5Ef<M3O=JT|8f)LVQ9x3w(vbWlQGPQ{1}9@Is19&Q zzruvp-2<2Tw#_<RYb@bjhezHoPRjbsVuIIGO*udI$NDC6M~TEIzsW(O(bQ=!<MgSo z{;f~DB3~5<#?ij0%wugP(gIkVYM6pF<Y%8ZkV%NCrTx-VQes~sK3~i<IHq~u+N@D! z;0M|1@PYds>I;d8_8AlUZbHKaHs+KCqXkQDw0x2gH<{#ktZ8_9ddOoGYfGQ+7a8%% zl}uz1N<0s1t{$20jWY1epY{0QNtCP+R<uGU^{g${iD?wrjWR46D3x@Bxws|UP%f&N ze)E@ZN+0iIIy&Kg$6S68>k8t5g<DLFw72^L#I2f*xp6>;I!646s3eMizH;52zl)S@ zrq9XkIQT~*8SrkugiVEn0%*#M>;xo$Zf-?urFY5gA>e}}V=tYflCG%;O(Y_|1+@>z zVE1U;VLrSQh0}Mf(BXV~#~jG78J5GF{H7{ffd!hlg>sg`t&!G2%(bfZt5%1DnnWFj zo~%IH8}HVM^|ehl+ju%yrUf379iiCxe7!-~*vm&!&PsAsgMLdtK>e<n$%nLgGIlj7 z#5NMcqKrwkcaRWQN;N(4Ap@c6XxUP1Tdd`&@EGcWKRr}qHIRO<Wj^vV$PxPJJEz^3 z!;ciYBWoeM2=9-7+Th8xZkVDO&QI^qi_G8}h4njEdFM7F7qI<eWl3V1iU!>RRlnWz zKc4Szi90iG4QB-%ow-5>*-$rY|H;v@CBqZH7_h%?XhqV`7j(*vSjAILub+*~4!!N3 za(SlAEU=V5XsEe#oj~%N58z0u<C;4bas4*702PGprWP#W*2Dx|+sx&p5o;&n8p?)C zbtk%mrAw@llk(G5M}=L3xb|Vd>MN~1VO#cHcsFX;?F5w@#8?|vA-M6&RfGPz!yXpo z%Bnuv>x6Tfp;wR=pL<Q0>OOZ-C2RbYVU&U_NbOaQ?-wFG0i9$<%6J`?Zy^yz^^J&_ zn_BJM%{2i0OBJNGK<7Je-h=c?U5jS^c$)jL6ry98X6#q%Gn2t<va$1{fA>@_y5`s% zbbY))UlBzz%5_kcB+icyLHh*?%#m%kRZ5M-CsrP$tC-9R-?^}J8+h7|7=K-VIMhK3 z5gtYl@4Ph3I?3NW20+=gf+9AW`~}=?csm+a3<8(qbg8dfCR<EhbgZ)sYTm-`Z`i61 zhbgrZ%IsTij?Tf9mmS)-gRF|vo$DGhBmgfdp^k!))4j5Wp3Tjs&cx;^T!4+gk&J<r zP~>TtPg#4+f(&HsHu3PR&lgI8tv1|o9!83X<lQ$=@9}YC$iP1hyP#`OFro7P$kDR$ zhRdt;qf4=FmfBhRNe=U@ce}ad7d*?@Jk*(YM|b`n^c(QDpR6X@XS4s24`5s7%P51A zSsY!VN_&x*-)Eou+|)or;uiCyJDT6U*(qUXWyUsCpq0&e8TpTa?vDW|myap}2iZeD z_n&{bWpA6Bmi<yIY|l^NFOi&VNPpeWzk>&6);I5h!*+hCUTejF_9+_2xSd-LI%4eR zyO=7Sw9>AjScta<ZG9-kzXO|<S?`{!--%XIT_}ISXe5P;z#A{5h;@&@+l|@?p5hQJ zJ<riBY5`SQJTe#D!Le7vz|`Y==f~3XPZiuN-6k?vnB%mBBKkT@?TP8P1Z@t)dW5>) z0Bykq(=r-<@<h^lOZiLC?PF@#t>u<twB!=FngOK_IwtXLtQLg}&$fMiESZ9<AR4GD z+lq!LCR>hPg+X7BKk#||{a=LVna;Dm?&H9;O*AfuQqqxpfOZzwtURzZ(G!jfQ<_~2 zSzR52bD4#!FF&!M-IxE=m&os4EhB|=o$fKz&@G={IlS1$WB~cIn#_X!zEyn7>SkOD z+_^eMmGUhZ72h{2Qp2kln!VvJnP`#V{+Qs#SgfOA`rAJyMT&w)e1;+I2zp70PB_0n zl%|7MKiRwfuuK040Cr>08(j?opu{qd+WCL89IaG91f*`99QArd+1a?mbL}b7hhmKK zlUroiZ4j12M$?A9DZ^Bfp@#8NgI}(SVb~vIT-dm)aq9c&N&1<>_oD4Xz*z{`#oM?p z{TJuZi*dI9*n8>nQrQ6<$4%ILkBXe<DV42+^6J4at~1Lap}HCumV+9EWZOqqO>eLu zIKGIL4y7JFdkN31jxX&Rj65x_I-KE_B*rmU-F4%7ONc(y>e{k)+lrJ@gT~aCv?P0b zalD%hOB3LkZbe>z$SZ)0ol|`q3nD^Kr%`gHu`WZR4YPlb6cZUaEs1u_$UDBZ7!>&x zCy&X@nqFx~{avfD-XzZ9-ogL$00{<+HiRo;W<1J<q1oLv&$4pGP$RSf_)?4CgXAv9 zN9yRxW<KRv4zha8km84ZLo<ul+<c2Now4p!L;NG&qYUQ@uCoNrLNYxCam7S6Z!Q7{ zzX~<-od0=O=k%j$DB={Oh*IK7sK_$6I!uWz7T>75>PB-B7|gqSjUH<WHt=K8+=zH* z;zz4)X!aeWUAO<8lY6EEK(pG0J-cNM)rA*V>RqjQ`p6am3ErRXlHuNC`wpH!m(NGO zQF|db?*NR0Kc2Ef_76_|;R~(qz}NgPh1;pY5rv(jicw}J1Fu_rww+k@F68YG?*8f{ zkIMu?z!z6bquSPhT<DFrdZA@%!D-0%E<AU*hC5dI;WNk_xs2FmF+W8w%ITMc3yb&X zcWQjGEcFVa6lAxXYh3aec!!P>gpwfYlDg%^g{vtcq%W+wV>TF<3J=6?&8@}(SQ@JI zuPxl5f*aQpAp6MzI_D6ql33IOhtn@;XMl+{z`1i)U-@Y}Vnu-Hewz1~%m~QmciTOu z;6Q)CrYVmq^JXjM@$;~Lb><xTd*^F5Wj<m3aQQnQuAi<-F7_Ow$GV1Xr5S33jXs$y z!Fg2DH7MUW$&SfL8Rm~%2C08|peLt7*NV3Aa*_zHF()qM80QufGXlIQ@+^1*svTe< z(}VH?hv@pJXt_(?C)}uR=97wFpvuKXRN9U!6<s84y0vOw(rkod3XCw~TBNP*=&W<& zohGLDVeV@xk%B!DQQGGb{l9cfY46DsyXr3h1n!W!XpH0It3c`g<1b6gHklFh4bbMu zvhghDYbGR=mKh_KS@4wTR>s%xUfc8ZA0xuGUhj1RdbkQNyer{vb3ODPx*f#D4(u`T z|Lk>KeEY3F9(gYVDqN!bL^)JVz(YW!Nqhxw5+%>Nu+>{)S-U5wC-eKLFGZdH?N+5F zkU18@S3+y@WYQW2OxLR0edcrOZ=npiQq_ikV*#T=W*f;96haH{25rN;B>Jsr3JkX{ zqVN2ZowWlydU1}cRr@f%gN>g#7rEO0^fdsg*3Ax<EE{Mp@36$0l$?rak;2xlPvKLr zLT;yDQ~?!iP!cdLuxlrJjmyYJfX?QvI=CD7=%#C4_EH`7_Hj0+oU9Es7*6x-%1u>} za0%K5=~uF!%=Nm)RjfY}tp*)Jw=aTUqd|_o7TN(SpN{<l(6N(W^JD99!XDDx08T&N zA-jL9jZJbQ76u(f;V2|!H;ur_BUzGy_~8t)V*KP2O*vLGM}?7{qcR5q1-t8gI+!z} zDN03CjF`)*K#6*REIXcho_~U?x0;0`;tI|yt7Qyxix|j_a8n8l#j~u3{fv`GcX9|; zBW}kddE1jI5*CG>G>rFLTUh}{Q02U!T+qE9{S1Af8dgM+ah;pEn=SiVx&L|MLg~vd zrqe(A8N_GHF64>HGBFR+Ec!y|)eK4jU2sGn2dU6h8(+Vl*OFgBSnwNogri&ZJyWY= z(;5Z~MaC%?tgiU}@jL+2Ils#o(a9I-d->p=zc1CM9%+o&f$eQMDmTnto)0|l)!Md# z1XShRPp|L1m)Vd(sA4g760Zs&-K!m)hSDom2FI>?_@>QJiS8+jqSr12P)4eN&oYEa zSaR&6X(G@`)6Z`NhXBn*zAbPSuP0lAZ*_M)G_TMw*N+^Rs+sr;9Ccuh&9UTDAW3V4 zIdlVyw!uqf<MyMhMqz^v5ctUiw^9^bFUVyvhL^4!c|8k1JUN|$h<JF3UM1)m&0X?| z057!R4fIyED64o({62%+#9S)*)Ln^W!utjAEgc$J>V|VrI+OLSs6!NfbH?oqaLIir zIqm@IN8DPu+7&jjyKZW8Ll7~xa}Fs4cc{+q^Qe3}v_6`MDjN_ZJVo=EG`vtXBPzJL zAXT5*rFwn@g#&Q!k;6N+fAs`wWgocBU?`G63~fu-WISl{Hea()fbw*;?EGHNDL#tr z;rXGaWI2yQNZ+J7%8wtM*a=D77n<k24>6W-U74CiIW|>cSHVn{{kXg1wQ#t~w}?GA zI;IZgqN#>tE`qDl<@#4Ph>dz5Yt>?B+o3o;MN9XJP_XKKhuivuq5L-Qpo0QyRzRZk zb@Way$g9)zMV<nRx+W05p!7@56rI0Ab~`3FCIaPvq_{+fuB^9-B*;xoP^P3T!b*LS z(cje|l<=g3>_+P?YX5>fr8*L?N|OfF&N0Xwl#0<)>*K7vj(vv;ONZS-;5EHDG?rQD zkr*RZ_}lATxKx|I?PcEHf5!jyhZ?#SxFJZ-@XU<#;alM^`2fja{I1in*8;MUOlN=D zX{aUmLqCO#Wic(Q`$PLr%2S8InvU~^qdF>(pV4w3De<}JEBFseOW`kJ$9#)&NBOO4 zUPN*{w1KY~ZxO#<6JEZP*Wu>PXVnn$VNAXHF#{`2E!x@~`qWg4x9!lJZjGmzZna}* z1EK=Rd#kL&3$96Ct4sJ3!_vV+3<^?b1n_LIrBAQg%SO4p^DCFdMme5EI`Nepi#iLW zy+7XLJbe1|Bi??^Tr><;hss#oPLxx2hS`LlJXKXflf(f0XvK%&65>(9-5Na0er|)M z!H*?}S)$^seKi#PhJL08J+IK<jXciZm&i$biDRf}{IHIj^eu7_ag8E3{TQ51{_GXT z+h#tNw<3cGJr4?J{PzDqfJ(pgj{2yjCAL0R+9q4wn%QXp$?~&6$CMn(ELbWrWrE;p zi?XDMr&#KYqs{ktckBxaJYnl@D!<>Tt3OJ^Z8Ptsuavn`gAZ3Gf9KgiXeojPf4;Jy zDx{5JQB|iquT?rBc`y5P#u*G5WIJ1V>y|N=SHcO*$yx>ad|brNH@U@*ZwF<MSwSEP ziteZQHiw^7nFkMt*y07UN<-HdEaz%>t87^B&XL-t5ZII|J72J~1^|oLn6&A1euLy0 z<(b!i@tK(weQF)hD|RTUrNyAU!2;^z(f5npnmjElvS1sp;!r$Q3z1K3`e$klsNuHA zw=FAX?D&mfE~Tb-Nc0<%eisY>IKhB($8P$RTVD4pk_aATzv+bw@9_LL^z_~|u|bQo z-0$fPy)QXbT;3!o5WbZg_BA>9j$h#AOBl@_G-!8BLCp4MR|OS>!F0&+5J_Kd6f9wM zIj2uN4M88KPuy3T*g3G1<8<-(dvSEdkWY#%bjXSPqQWs5hF|wI!fCinIMII;bp-e3 zTRUFUT=4j8@0+%$0i*C%&@dc%Z2k%$ih8NucdB+5GvJ$(qB+?w3vB}#C2kjtyxazg z-LH{+Sn-Pev{O-r&(&xlp76QT@S!E@dO?&erFt!_XwV__*sN5d`e?<^=bU8XCKb}I zI=yw1SYx3hh+Muj$`J`zl>kBLvpTPo_FTAb6gRH=Q=Y_($AUudGKD0f<YFGvm#fp` za!bJQ(yl*RQuFsrb;LVXPrD4|d3>82eh_+V(_9YeKEEs&$JgM!%$GID!myZT@(l_j z;<~D0@s!Tqb&FvSyhtmg{rL?X#yBCTI=f$gDO`goharWviH8MQbUC3lYK|@B8Znyg zi|{vmnl&of+Q>=?VNfb9S8^1v<31bLZt|O`adPrXQ(a}yhnWuL^3Fr(qn?LWk}+kg z1#uEKk&yc<`v(A3?#zKFZ0#M}j*bVjK?}z#LcpuAE_iNsxevEH?W^Xq!cU>o$-W{8 zIC@UPci$!5s6avAbolfzZGanb%CXG31ii#GJ{;?qUN+=aB;jKFy%F498P}_TWAhg~ z0wnf#0&?o@w>Se_5#+u{7OWQx{H~?3*QZWLV@<YCkqrFSw7+%TGu9(N7f|F(+&{y? zMaTIu$cl+NDTvm}wJ_^~m3GaB*`bW0l5Hi|aB*1C1~fDeP6G*OQeTqtID~vV2du?Z z+1RH75M4;uvdT35M{_J;BrUK4>Zf8QZqs)2x*P1Mc;w>io(xW&3+Ho<i%A>P(LDyC z*rf&4ShXFV6hgU!z}z~w0iLQzowgY^7LP^pX|``{(7Onmhe}<XkQ-}fKy%s&roH-; zDLA5BnE&$Nv`LBvTucCZm$pE?g{B6Z5Y}nU{NQSoK%l?gkM^n$n)=I>x{_CFM!jUS z8ovtnmDg@%BYwfQD&TuFxDiEjG<L%w?-9eV>l9!`)|-@D2d3}M`jS>U_PI=7T>IuF zWv3>V$yn0)wqaq3IftUpWEZiF+T1UK`i8$d6@EO%`Oos+@!!?DKVa91_hk>0m)7Po zOB4$o+mjwK)ZFt{CdZ_c`bYix{Qi|20s_Yp%~ZI5f<T$4f|a+Xct&0e6+lNkQt3f< zcGA_$Prt9uyoZ$z)cH|ovQVi_QQiIXuaJBVC(J>jN)qu{xlRDDHPmz)#nalIdM#*J zuT}42x6!W=bS&0X{DdY;4yP2WcOv)870}mnq%PI@$|w(;9MxHX`|*&9Sbm88!CVjS z$P=!D%9KXA-Uf)FAkW6LNqHN=FBpf<nZy2^Oj>)f_AqKYjvjkHolc0l|0)!e^pxmT zPVPMjt)qGGhV-k4V~Qy1)S(KbxvVJ58M(E<fnQTc7d>Z2jJ8Nsd{^Sx7`|%0v0O~K z#1cHW_qS29jsMJI_>Nm2dEdN5ygayl@9Y`lfM~?{dlypguMi$myIg3G0q3|D0~`Tc zG^Q#v(51|nh(hK1J(wCAp|v;OlEzFN6kN@aebl|jQgFUebc=D>rI;}eqp0*-!y)zj zM!72Abdvq#TwF-w4T2?5H_R<P+EFkH_TJtF{nccR8`@^AB>E`9`$hG~)h-Uf;t6h{ z8oC`L^@XYvJj-B1e*EfS6$SCoUkM77d4MLBD3!6H#}acf&OJIaT!pT&+ju%%C1d*| zI957Hli5fzsoOkc9COINg8Y4A$bDeULTN0O5$Xvs?vYyPer!qxy^t3-aSlyCsyo8y zz*3@axSjS`m4T*UyuS~F)fW8LA5noghR1t@w`N-&9hlZ4chpyyeev<=_WX!TYfeF& zj(ZZCSMW(&6Ox$!K+e(nTfb>iB?MypXW_1Oac``Ioao@8twrIgCIzB0ic09&#I`4) zdJL88DrV!wg=xdEGWD?%W&}k$<jb@{%A+Pm9x!c=7_Kz?1k}~N*SQ8~aucA80jVrU zpUdAHTP@N`C7?_yfnM)ub9n^oTDit^050)fQFMl3+hD*!oK8XpK=b=ftNJaTwJL@i zB(6JlmvZlm{_*-kFz<yS`ezY^d@E5~2DmE~0}abT+huHxXXTtX%%L{;vtGc>`mfCc z0^S_`=$(5$|4y~oF3WhYk3psN<%1o%{o&_5SvY|evUO;@{FVN@&thHrvmNC@1qoE; z?9&>axYHyJcBkp=uGT+pIShEr-8fL!{`kcs4S+`M-c^6u7tv&T(2+e~UF$BVL{i!1 zvq56q+z2MNBOyg^@6U&TifO6e##f*Ix+xZAsmyEb6G7>CZwzWqG?&e^)MPBD$!;Z# zx7&88xhEm<g9NIbk|cCQ_G3*3XRJt#q3>pe<NW5KvdgCys&8?+@sn@{`X^h!+=woG z%#wbJlJQ$Houts&>lWk!Z!c1)f=rn2!h8kJvrH#A);au9V3K!tJKD9)#THpM>TCHt z>eMrTvFTuGb^a(tYK~iuKXZeZlxbLP1To1ob45u?_mrjtd)`I6*Q5j4zHtmU((raQ zYGEV&q_Lv8xk>4{M++^yQn#Qd>Dx(bp|Do&w(D}<FJa+ska|0<;!vRfB2|l|-uzlm zgHs5;TwuSsCrUgYLvX2Z1d(eZT%Hbg*W=SQGgZ?XLc^M}97l#|e$!12$(O^j2M?=? zoWI(hP<DA-(6j{I3?vXEUBiai4A??}<=<6>VBG3~dv@|B(pIi=Z;jBgUhY>pOwrcY z(&h*y_BePqvsjZA;;piEhoqEYAa+(ax<L?GScLy;y(=zT&Va3=25_|_`-69ofUx%N zz+$2o<G_JBK=CcyG=v4UG?&ndyX&;&B}kt422(-@?6U+yY2mkGrKmNmR-BL1zgI1v z$=xN#*2S&=brO689{yOA?TWO{?zfviB>C#HIgZUk9gna5X5Ydc`8h`+a7~A$>{+_> zv3K(nlZ9Andq`6Mn-(nn7C=J{lb2h*|HcBSSvChlShT+BBqC+gyBc73P`2T!S4LdW z>Paex6rc+EH4%N~&i5TtYAh`PY5zm3LB>5D4fF54pcVy5Zo%7<X62nmHIM1ZlGHB- z8sn>P?RzvWU5hI4G(bE`F1PaSbO;FdESlZ!XW&x6{1d{FFk_4%t=hpH+4-p9@M z<XQRRhVO|b1SWF}q<vdsr#7s!GPFaT9#Z5y{JIMge1HW8xSTE<TzFCb?4ax;n~Xz! zpDg;n0QtHZTSvyp(|YS9cvvODXa>|a+z^gsw9Y9g?r-@g!U4YeBhPzHM_m(~q9?BP zW&d!t*Xm4`5I@DyP?fw#N26r%MF2(BP@PupIVVu_c-rRa$DXw>*Aj=JgUZ%y={NY! z=%9UIrU^T_o9L0HRFD9U2;_dR-=$!#{Q&I-XI!gd*ws^2^YOW4htRVAk>DmokXz}X zNfmPQ;2H-a-30o0{P_vo>s-}7__TxCouV}B7oqZ&{a}j{oIhV9V^CLA02Cu>g~1ed zV7W9m?fjWPe3yj7l}+YmG*(-#rkHs%rbj~BI))Yg_*MYQf05lhAOZmUm5B3vTV>U) zK44>a<Box%l2l>$fhV_Y`w9zhcGGW=zA6u175#TXwtxC?{PM^bheB?`-@wJNhXMP% zec-!n-w`0Q0&L07<l)zEugrbVc+O;~9~-It(A<a>+CVKOz2!|rM)YJF^H*8+3zIq9 zHAXAfViV>alYI#rz(P_xNVt7|yVGD2Y$X<<%st_WVWH2)F`I;z{HkxmA<&8@yne`v zS-F!(MxZA^Ji750b``Y18_q$loao8aR}8CIiq#LLN3IEF3w8-s0h6QaUOQO(ZCoJ9 z_hx`h>7VnNU=6q4)QA#VGK|mWMK8gNJGatUa=f}_$G4|ab`oMHk`{Su#B?SuM^7(9 z>Z1?4H^85us~2J<C9-qsw{PAndKo-E6cS$HK1{%Oi3-?cKm)l19;;#8=BUs>1}*rs zcdHCOgV)Aom>sEuJ2XJ>rHwNnfaAL~O0xob6PDupTrRAZd3}9Ks(EL$fLOYKp=Y$? ziE^>$&N{Rv#(a_N;Wx>b6K#kkhA~C1gkHUF>#(fSr+DR*I&I4{LP$GQL8#hY;;AHD z-R?~fDKa>1xdA!iLtk6huW`RpTCwo%Ela3+?y%!Vvprve?Txf8c2C@P+VN{A*-8u- z^GCi0vnrB&<_}1D@})(0*WN7gr7xw5Eet#^@*_<9ce|F{Tu9!13;9otap7$3`Cm-o z{(@&z{oJ#H($}{6_M28`W)iO514jxU(b}Hre($K+W$;yPtR}eBTo|?(XEP`&U{#`+ zcvx^NX6fubu@%mHw9EweZUA1N>8{5pG@SOx11A4fS+t!Zl-iFLP6lTT99fc|oTB2t zhmu{L&RpXxn(j~-Ng)s9c@U;E)G{@_^d&spmtPO?Ci^t~^k7}1?e&wLiFQVw8m11x zz-eY??XO_ZI8CLz(e7sMUz~T7PAeMeJ$m%xWzePG%zt?rpf1p>q1Xqv=|X1)04Bek zPZsfab$z>P7DKz){uZyLZNpZi0qv5I@BzO#8;=-hUQ4Xx<q^?&VkxS}pYDL8YskOT zpY81)`QDZ&3p6ySC?rf4`XcR%HV(Ogjj&;Or@r_rS^bcHXSd$3s`A7pKE_JN5`!r8 z<>R4^iB{s~2p{}MR|A|e5k9Q8_N@m4G1B}WPR!o4JMsa4`x;o3m~RRtp{LUU55Fp8 zc7m2~?#!$!>2iXM!Yaj}DD@$aPdIwD6R?LLK9|ZU{M)MYtK2HCea-PE+5F44QvA+? zU0dDg@^;aptH9j%BW9(aXTeG_if+)^p}tC1LBss0NLV=Jr_Y@jJCj(+vPgL3wHTEr z0{+Gw$tH0Cupne6X;nV7zL;m5^@6;)cFJk=^Q_AV;i5&454z~$Ub^ulDAd-278f)* z8O+0%Fj(NctT-5dIPALsswkgH8x0NG0vO3sW|L#01Eo9f#yyy`cY7kAHVaO5jfr)Z z>Uh<9wSGCHrPy=OwMf61*yoWQE1Q|ncF#?`e$(g=<_XYwn6KnA4@6ta4dPYUu&C)K zEgX<U@`LE8(gR-TN2h*zYla_QZLq%GkX6X&Gu^a2G^Yrt@12$&lNr%Q8hOO7d*?$f zAd2|Xf+y6i;)RSz=+B%^K!j^6Bs<NBDS)LO=n<*%LsbuaM(ie^+{7*wUeFDT0kMii zu)-T-MTYYN{FKi%u~OCPRciw)9nM4(l-l}Oodv8U<rqMNJzW3oJGGqHy=z$Z7D}`% zK#mlJ(u_+!$%oJj<v-i!nx0GuyZ%&Dko0hXjX2sFJo}^F^x!T&*nqQBO566c#*bbM zIN!YZQ1%#*B%JwBJHIhynDI`L(Uc`JU&dm#AJq}EP4OOoMLncQ3)5U~6fUi<Sj|0J zm+0#`^_^GR`Vo>k(?C7JOZzelF8n|}^t=f-KEkRSC{W%o?*i~H{IK_^+dOD8@&c}+ z*u5X;lL(Unk*2Wj7HJM^wOrFCv8aQ+DOD7&I7f!eE!a;%dhyd7(_B8E))DPkN$C~$ z95eLM(DT(EtK>2p)Ib(JtKmi*N9lV7H^0A$Ic-#qV#7HNxj1&t)@+=++B5RmFEn~I zRiNlG&Nh=N)8!;WI`a=AUMpD(aMBa^A1-~nfa}j^*TjmT0!x2ZdlIQ31>h^jGvdtP z?pR6YdXFIyjb-G^FE`v>+8fNP$}Y;dd}^@p=Af+Wxt4w1l{!!O{WV=eVDg|AxO-I# z&|!BMM=!$iNa9De^7!xOn!wO>#SNDIQVBtCxoQ_V?4bKl{?Zh#qV0Xm2gBM2n5X8h z02>|Jf2T(zl>6YMAPb|qATKDq2VJdE>w@=zk=8TX>w#{PimA%v!q1@<J&tCwj%}Am z%AC0#|8X-g&t9iWGa$G3^Zo`8SLtU9H*nE<6)M&ai3#^}GbwN@F~%O0D&(6T3I3R| znK0$AcC|rY{SQ=M@7A-ybMN>A#5AMZ+b+*+GYDs{0s31bhtKf%?PjI@7r(eRxsrB& zklqKkXKfNG5nv2cWO;;0u>cer#gGP6*^Mf1Y-^-qoM2}rJRMOd8KV1oXW+X#ZmnM^ zA+~y-6LI@C&I8xOYz{DNkn(~hpKwbZHjkJsS+G(kKBo|I6DbAEc!5Kk1&+gh#2IB# z*{x&%9xm=@X*_Ap`#_NCN1IA7d&d;NRhD&hX`2sq5mh?Kw}dLqufAJGMxaXQUN7QR zz9t^@X}roYcUZSlGH&{t`g^ktJ#uw!pTVl9P?jYV^6ljwPh;?Aakfjuv444zfIFP6 z2`FsCyQ{3VX|=hs6x<Cgb2a$q-0pp5hH9%Xhv~SHuHg2nP8H@)+j)FdSr|UovIKT| zrh#7=%Lm}6WK=@?CdQ4Z(xFNJ)B|YT;gk-ZwhxZgfkUtk^<o;&$dbe+2vZt<ia!g% z^}|hda1%<rAR?V(JJr^9`|&tGr8++;W%a&iR3#otRMb_9+s%OyO1RwQuL;?fdwVHg z8CP=d;a42)ZK0_hWVoj<o%SQ@`6liDm+JvkwQM=|tEI%^A9fk*h8weeI9NVG{+u$h zquWq3R5m=T9fyNoGDw)+Z^ZNP_Z6Vq5BU4ikpq*TPXch-@w^?orS}H_^PLLM7@cH; zU+-)KoMj#OY=Xg<$ynbFYjp(B>mVcGF&}|<c1&`-b<FBWCcD$2B}+sQy57~kH;($n z+P?(p-<*OZ+!rx?vq~oR6MWM2{YOK}y_)X1o%^_2(=S*BYPd)rl7UhEN&KRUBk9X^ zUv3^+$x6yID;0C(YLAsP%Sp0yCC7_}j#q&L%bgV@z@;9;d!|Q`r_vyEgvpEIvr(&+ zAG;u&!BZXbm;&QSCw@G*JU^DnVkhK3@%fTH@xA#Gn>I}Xn|-`E&y9xF5560f-W@Ua zY)AKd1YvZ3?W(4OwpY<8Km=5_DGyTVXzpUh1L))=;QFAln8P%|^PWFD3(`DSbw%sZ zm>HF6fcy30k+5*#5>mMGl!|S~w-bkP&-bnr!<!hZJVaMgzRQDTR=+D5v+t0CVR>MW zN!~Y{TNx3r)UZTa#me3+snQXG-vgZ|C;BaCn*dP#x08bYV*xMS?%C8E_m8IXM8!td z!oDqKotz8hiy79GvY&r1@XPbRG<x=k-5D}?WK22RT%HJ&^Xfu!BT*l8PWT%RncMmw zcGUqn^KaU3DNWaKjX=_Ymaw*g6`&)E*Rsfw@sWIALE$qt+as^=-&>URbf0Z2Uo*~( z(Q6Bi@7TV0{LZIceDqhgL7OsefI?O(pt{uow>pChynl#ap|NFd6)4g{NR33uW`zNk zH@S#M%G{j=%;J>)QFXU{Od4B=J$+^1)CTEuxod*5<Ljb_OOG8P5`rmgj;OUPO;`xA zXg$#sC|J~?v=Qw@LOsVuK$o6x-~x@S=6lsTH%_e$KS={KLg!4DQFq%E@KzZA2oIao zfb=`re)^1J(|kS6AWvrZ#?rR(seoaiYBKu-Kpb$DD6Rp~FLhNZ{$@@6!@gC!X=`qx z5`Z(9TJ8gt9EhHbbxX{m`_Pu3?VK{S_)xGghqH=fn*_T+X1{#9_{D+j;y7IMf(n60 zNtSiFchsvnw0-ypA4Xh5kKkdH!y$PON^l#_^FE+~&ZA2m`?%gB)t{EHkOpk>*d#b> z6O>=%I_Z)Ni2of8m_349lVgoUbd4aR!;N;m^7PZ|=_5FPj`(i`pNazOTsV=?ce<)u z{eAXw=XhOl*r8eXyri`3B(G8mF|(!=><k)M{CLmk5{3@-@t^-G6tbeU@W%ZBHtxML zNZWP2a~y|21AG(=fOh$5bI{YU*(IFJ!41DRU0VG-e|AY~oq+`Ksfo&evZpIMC+RB~ zY;44Oe2Evx?Ki_|GVj+ol)R+>05oaE)Dc_nxtFA{+>6MQGAi6OyA#56NcZ|nSnFGX zIp!d6QcS+fjGW5P{mS~CkFb+Vz%1)U-u3bScw8qIvT=EPX5*J<OT4cFEK|3ejkE~6 z?u)Rp)lD>FK0(_m3Gl&@a-XHGmw_hTH7NJV-&nwOtflLP8}--Hfg-kySnMJ&)46me z*Ondzog22)u_y8zDhq1NQZnLPf8F_Z-yxR7gK9InYz|w|zUCsoTfJ#>lp_U1fv~%v zfM(@o8%30PO@2XJJtq&J_J@tOK9EbGtE73U7`Yu6Du4!iSp~xuN{N+7)&{cOhBM@F z6{YiAIVFWhB6kS-m`i=J9Cklra@d=g)?Mj+fo)6qh2?2Ag2G*9dR$L*SW4$K<`W(* zWQt3&<QW}WxR}F_GrsSA|G$gl-@yXRJy%n{TofL3ugb*Hxdv0(E;Gj8Yp*Hhp1dDA z+b1ju9j<pL=35ot4>agvSW<Wg;r%>RfFu`k>wLI!6LsqAf;?mDPN|=9YcUcFC+@36 zvRieD;OY!Fhb$}a{P)37$JYu>o49Ksl1+?Op`NV0@qyV94atbF-iJAa2=b3ufh_t> zdevWj4SVCPGHV>~(;<_GLlaJgH%(G@dfD3Yvwi)=TAp8r;H@DLOQt;I=YZFU^fE^> z!T10Tl9OT4mm@lK|1jT{eg<qN1-CT@<N8ea>mEYY&gpODY&o1pAOalP$A5ImWxG~? z%b*5%*hPMoEnz$1-v8>^Qs}vlCk0+y6xiwTRx9X0o|p}HiuxQEIWK`ycxyxu-<ywO z8HKt;=yjlqN$nH38_2dUk;sy{PV1^+B8{!2EgKOW8-7qQvXOd?+kZ}>v%~W6d+g&! z?F%0i27NrqTRhT9anzHzEhXG~5dvu3`dp00Y4;s-{jT*%J1HJW)Q?`<XNhHQr4?AW zy<r&vMf(u<XTC0Ex1DQfRV?di#eKo5iRTNL7?IoYsp>2YN5TJKu#0j#ah8j_iZVa2 z7IliO;!jd86{>q|*j^u85H_dZ;*pjy87x}U2(YHmkPJvm^g#lY1vRIkEOXr_-q?oA zwUgRmOaUjs%6+fHPCD1%DZZrB?OXkWrBV@)WiWOwK6gMQ<z(UgC^7>qC+=dx%+d~Z z!TI*)#ieMv82i4=`?opp%$>1a8g<jk*<9_FRuu??%KVlPrjWRzrdF^?Zp0JA^*&P@ zW4-tO%dbQQHb{RP3q)^q^-rhxw);@}ONbGdMsJxwZl4bS=luRU&c~Cq0`%YTf8C|} z=pcKNRO554jENwLV#8k-*9rzW-_P<X-72aiy2JQ{CbsU2tKQNtC2A8F-`%Y%Ar_T* z;8Kc;^(m!21_20%Vb6Xy0?D2<K3sXBxa&zz+c81Bu2m4wSjJClV&2wnQMWuFqECpE z$t&r1p*10}KUp|_!mzwzHi+EoKdnc16?IRX`*veWaaXQ3AXqi$eL%Q|a%u5h;n}nv z1==M#)Lx%X=A?~*-0l%;Dj)gk51xY6=|#R$UBIX=*S!~lPfO{)`565#xw&K4qZ99y zoIfqe)7#s;4dyTxxIKppgP7cVk<5+2#87AIH)UM*{E&ZEI`V^48=+*$(tQ?G4PM6@ zu;QXB5`E@%afoE(6yJ1%kj{mqVBW_ITOXE423JHK^cb=RnwBuPHmh<YD2T*TfhhPn zbFITjFN30()_M}9qb^m&gxjt`lJ)0nAN(72u87up-b1!L&=g%0(w~Ky=1cU95Or_$ zfn1GdYH}hc)`48RIscFhv{f3Pi^dc`QXhVW)?~=d(i(1YDHnS-(@JN;UXj=>#d}U( z`sIv)&D8SXG^)HLxsZKDb^Blo?Ia~U_78i+%l;2QU;!j(@`4pB)V5`+x^L9J&|)~2 z>WWRQ@qGfxyREu!=bUGQTi3_Y@XHHvDqsvNbFG_`VJCC;yz}BqlEKY#4i`eX^EU<B z*BKG%O5*;)YSUYu%kx6_9rrnZx|ekI8b`f07k{R@H;1=UZT^B0T8>g!=#v5QwhfNm z5Y>2lH=I+dL?o0h|3jm_O6~E4B4O#XAJMI+mF6>})7NG^_<4Ma!0~xyigCheKN?Gm zh3HU50%qG;pny`e7RUWxSJMYP+||ogB<7sI{AgJkM@n!d_LfT%RZ9n-w&<mpeca@~ zJO%(8M~tPpCv$GJgtmEM*B`^$6E*#9D70#(${YX?mypz#KMN<atM8<=f*v_<FXd0U z(1SS@oYEEFrGn$=BMG^c_nJim6a6;_!?rxmnD@W(kDR#50qHHRa9w&phB{A=y-?YV z*AuYvUmq96DK8Yy<%h9{8M9GLc4*uyQv2lSel`!-mL-zVp*sgO2PAoY>%w%5w+eG& z9P4vRa2m5FX!98a2p^(J29!X?1QGS&?p*KlF?0iEoB&&Krw{kzqg<$eOczm|m=GkY zOU3>I(YDi<Un6ROd)jgQ_~V4sZD2~vWB*B{ui5DyTORh7`|J_X-yB}ot|7-OHW9TF z6h}42cg7r?n)a|og==gmiE4_PNGKo+Usew;r$WhOadZ{IqSULv-uz1C+F5X;|5TG` z-u-Y*T~&^32-V!tqQs^5_Lou2h62Vj7%kb+1n-fmT1dRCz*qKt@&BXjtK*{VnuZZc zkrV_$LIEiWNy$a&M!LIGy2}71rMm<Kq+1$PK)Q1YmF`$-Sy;YnQPJDye&6qT|MADJ zd!1{}^vs!=6Zt6=5_LA4z-C+Sbc!!=t78V<f`hqfTW;xNeEtaych|MdP&bOS<ikSw zmk`$GHv>z7(tfPhfr&X))zhc(=49IgG=$6Fx4)?oCXdd^uCp7rbIz4@wLTB>F-`?~ zD5P|=i$A}2gov0TZd15aVQ=gM(*05keSGfEPgQr~wEL8UlFPvI^%lu~Yr7pqs}=B( zt?vEyTEHFHZfzoa@Nw3m=4K?FzV}chk7FH7Pp$f6T^>vfs7w_w+2=pla0<1p2X}pT z{3J&zUPs}Y;BX%??<3vqur_=e>)yIO{JU5gP-sof?mR#>w>#$r^DE3F8g24$k*hV< zj%&)*P1-cNoeRh4K3R=VPaQuIv~N(b9<GjcNY9t6{!wZA19;)5KrdEOQ8_eazX#G+ zWu;b-yeAmrQF$WBq|P$Btx;2@g<UXorZy6;qNT5%^W6_h*azG4W7{kfI-4Gjo32;m zd<R`#81B;;cbe+8)-q9ELb3QEB)`JlFKNOwUUI`g9weJa*c9dC9X#9)HWI{vGI0Ax z^gDTO`KKNC0Buld79prj+TqfkPd8=kcP0kI>vmTp<u_waNZ-%vpl~0UEE98D4<xe> zZ5H@CI)NBC!a3)lUJo-B^zLvo?q9Ej)y%ZddACKW@<O2>4wk?gdkl$u{_6TC_Fuhf zcxL^;Q*PUWMS%Ohmh^tYbx$gnrpL0rsG9BYe2IViVMyG4*<%x2DHFlv4X3;P0+7nF z>bD&Ipe*q-i$b6!PkC+~qz-su3vz4Y<5TA+$?#~yk+Q3xvw>A_1BrPZRY5n+0yCF6 zX#ILQa9soH{g#0rf<kW)(AgZ$(bR4`<;*|dWTW6w(s(#>$b2N$aobDQd-d&SSfXr% zCHz#gNiL3A*G|{f*Uh?_dvpHibh&TBy5zuZp~<zosM;B!|2L0wS_QQ?49WfWA7CCC zm$Pa+D5ncy9))f-q3!$eI<C^jBP>=ekGdB8bUmVI=5T`HWDI<j(e|j=c?CFy-`&3v z3aLr`uq%`=utpLAIiy~X+V?o%QojX`=F`PpeJi&R<MY#SF<>g*LXc6I2{0ARGHvZP zLUfH=@2!>U{N9r&lAagpDcd#p6;<uti{0wr2ETm*C|WlkyM{he2;`{g=-t+d6%<j# zsP5W4;#N%T+C1@4{KwU`7u*Llya)eKRMZ(h)E2FwX#p2`UlS23VAQLbF<#|sB;=QO zTIh#wB=EHYRi1LL6Zh;(2DLXDoGO80uSyVl9J97z)wC1t`Y<b+)lofdT#3$2GG42M z1D)phlw5u9S?ET=BQ?zifmMg0_9=Eq?u{;AA}sTMx2^gkJD9$C3jQi$h6?5ISv24& z!?uoH!Q5ea^D~RwV6J^~@E#XaRYxuO%gEjpTd-B~$#=-3v32{#_cL^4i*f~&@NJO- zr}(}x%Z~J~Uy@&#*0c20enqzKXy><@!}ILI>{!JqTL^2)O><NdO_lH%UR~DrvE3YU z#9cm6*Ms<AtlIA6#Ot$p2CnMlIjBddRFLvmrm=NAO80yBUWKu32~n~KdIx?ITV1aX zbarj(&6Mg?n2}RV*bNx`ZiEJI8fCxfQN#~aQfwxZEpj=H1Y2!$EKJyR0Hyjl<njCb zuKT#IVAstJDL+{`cU@N4%r4M;7&rZ?%lgE(qzR7<epb_T6tZP(Y@HRb2BaeCVN1!L zVtst;oHAS1i@x16;cn2f+%y+QTX2&L_)DY&`L}gisdRoG`=y5cE=U<rKi+W@7{Ww$ z)|~)!&Iv50cy}?383x_n`qEhMCNz6Mm*(A`zoio4UQ=)&w{CCMpy0Xs(w9Nk=?D%3 zMYcX~;_O=wb?Pf$ADIz#kprlH!4?<)Xd==Mx43{ptH!MSwUe%wGNE!dD%M%jN5*7g z*5cgYo)po^9I#=eN)&yrY&yZVqlWtYHoA#HDxX``;bfz!^ih=K?H^UJm+LAXBe$bR zy#!Uon7916MCBX<#j~OxG^%;gX&@<P(Dk`<YP%vzrK<NP_}!37`#O9%&C46SF?Jy7 z)qDnS-}YM(T27=(FQxF<k96PGws&RO@C_KP1)uYRH$J3Rtlmo&y=Z#+?$lrAnc~;v za-13TFqgvZ**4HiXW8gUR?rq2%X~E3U0c1()eh$=0uLPB(VScxor1)cU8y6r8h7=Z zf2aUjyuSQwD_#Q^bod5>Xur7_c!ZdKhA2mB=o7C>HICrx+V!H&TU!FOqe=+oVkcdi z;f8+H!y4;y)rBv{bq|xr><uVgS6cg~S2+l#BIn(&((zmdk39DQKOM{FglL@~BG z@WN~P!Q8n)1nlfc+J528a3iAZ>Jez54yf}B3)jWv@9{lsW|gYIER#yDYo8}ztjJ_U zz70&S{7I}gfi2%rLvH917nn_ve<(TRYMM&lbVM}Q1Bchc6TP21Z*1ziPPFm?6=;lG z`DyN3QUH66&rr50fR>$QwhGop3$|?<H^;&+IMb<Lh;^t;mtT9UH59wvbp)IpH`t-d zoYS^7t}|abS7O@^#%6ydR5Km5pV9|Z!@11zE=x>pjq(lUJ^BQcBWjDW=(^3F9BP-) z397XZoQI8X+~fyFHYm(yJKUH*U4%P+ACZ#Uo?K>5F(<eSdh{z7aL}-obPROlLBrRh zAguY$5p>2hfRmenN&@ugUfBE>iil7(Ix1{A8)yjXI^xau;9T7V`s8DGHPw4bxd=#S znjx+2Fg9qGfUQ<lSwHW&jrG(BLp!XtYS&Q)p3tuctE`L`tlt0^xP2t~F$zI(2U+%4 zLI}}n=Dk9)V)0{?4`GGy5KkH*WC6?EE|d_s4(dtE{%dk{%AvMnVFq=G!25OlK^%1F zolU!uFWVdIUV7Fp&4ocu2de55=S^oU>o3jIoY4GEYE3=q4_aG}ihz0o4xtGpa&F7= z=Zi=2;;M}qIW#$ke#^S`b*jBbvmN`L$wU1^u`*HN+H0nF`%cC+n?Qc&upZ?;E_FRq z-Ld(-FNiTw7gOJW2|g%Ic4_YW4)wqokFW!N$|;7WWma595XEs~?8XhHD9zihqCD2e z7-w{~FBWw^EI(bj6J${m0CeGW!5ubMK6pRwO<Yd1+ys~BY(pQGI?=&4-R7Qljjezp ztHfO(xy2tkJ^|jt1?n&6DN>yybDSrbc`F+Sal@8<{Kw~<8xg7OrupNYMmMIde3s@9 z_0&gIdzf!Zn)i~Zk5rk|?vGJ`bH{ttdV+5)7vorYwFFGT(5gVAj&s$vses;hdmm(4 z2%q(;d41Th8yMQxDfl66eD-UK`*i-6+|;5-z3ZTzI@!@|uBlj5!D*i%Fxl#X$Na`= zTZmD)(9SR}5b26&+cwogfJRM{?Uy;syFhj&)t)_f1UOW_r0bVr;oX`(CnX4PU%S%~ z&zv{YD)8Zz(i~)Yf3p3#)ktw{>Gm^@zFnU{CiI3qBT%j;guJLvmrq*(1gnHVK0EXQ z)jWLm%|~V%U1{;{Zgx%DIsiWbjV?KL55hs;OzO|B022hU!_X`Kc_-1AJfyHi5vr&N z`PGY@LWTi~cl5(+W;d?`426dg*`noDwCiPE@4ET;!4R>YCqvqXT<+?1=jjjnp-$?X zszBoxRzD~{lE<RjW~S@b+5E!}Rzt;u`XdT2((SOWxVYtwM^lJ-7b#Cq8LTvJF|#)8 z6RZP$Ik4(mRc{CDx6a&#APe9xb*c3=R;&B#M^kmQXXmCe@!CPI{6L$0d*zEJL_UOi z8|Yh&+p-2O0jRN?oQhM(Tb<h`np>|H=?L!wMjPHJ(JU%%bRWDs8?%mPcHx~|U^jyb zMXha&v}3Xkm=*3*J2m(;IxzA|NkiN&tOoG-v?}22%~w=<OFZV^MHYAqp(>AJDW$oN zc^s-gZw?;GOPd3gJC2jPiOKVBj=X?XQ#tJvT%_NDe(mB{`s7t5BCs>tX3##h-&YCv zz`(56h8@?GV>gf}8%<><<9_w!<iSjM`9cJ4e)VY=c>4q0{CK#&A8kd%>pzaNzY+kp z3`?XU0XPUx%FJ%GY};#V_i8*L8<(4KTlscQJeMniK4)%Y#r7QCXLbL>f>FU}alLl^ zM(J~xJxn?=3a=Fh#ALeYSs?0J1iBgDCA|e^jLTvTQ2bKDh_H|9%~NG9BxAEzfXo25 zCP^Ex-ST@bi<$614DjVz=oM%3DJCo0D5lPWT%pa`=@yxSY@f*7Y#NN6SK{^Qd<J5y zYWO*AN$D*M!T1uB+qkFc)URKR>-sew3{UKiy(tOQ1PTEd20n2>N2H+HZIRT?POdgn zoCAXWX<pm5rye!VgC9e+k0%dmvlNCD<aYV>YD(O;XUB|jK@=7g%PB75#&zN@wq7+Z zf*WkGWc#Mq7c))t`S<RPzmCqO31tA<UwVr?tC9|Zic}sw>i22+gwYXbIL>RMMd}WM zeQAO`-+=38#+(Jf7cTZkz()k6EI^5P!eu$N5@k=zwSTOLKo4xqWbQE^8ANF*c=$Q` z)~47}jmL92CcSPt>*HdtEypdtl}GC<^WinyK40}NhAJ(m`wZqQn-7}=scp<zM$F8o zW0RU3czxq7Fssrc0`EZ;K9?1l>$?xe!633>S>4}e3gN7cMl#?>Q-u`yW;0Lc!z||_ zP*>+q^u{$)afR3j$Dh90RYLz643#qpuLDU>K_KY5SJT_!G_;U)P0tuOM8NEC85ta0 zBcm0-iqINdNxq6EO4Isev|AiHc#ft8ocZ^N4<o$cpQaWVR&<^0qIX5fQyDQk3Lv{B zhRFdoqh)B22m%$)Zm#%hM!eWXT-D)TAb5xqW03Il=^9xS#h~N1PoX}YT>0T_LD=pc z^&xQ`qT>3p+|hR~+T%CR+w634L#`tZp2t(&z!zy^KVdIe{G4A%!$BYa7-nvYQ74&3 zBl8B(Ft!ZupaAB@B`oT=OSv)CZ3QIPgj@O?&1fgMY7U#pJ=p4Q57$lJCV+mOabw?W z@0CxjSEI=|Ty@g^%99%m_CJ~%_5E&C4wZhpgnkuN&RwjT`*uzDyeaqX$QgC|$_M?R zvm3=FY^hjBA4=->hw?%v8=1e9H)x(T22i%Gjm^4$8b4A1dB;EXb+afpezTN!Q77~> zw4FuaE&{W8uC3<Mo~G@rrHxNky&rwGU~7;T&f2tN1oKPxGt7mY%nYlvt#y}Rmo7#x zFsVhIQrn|7eIH`lteJD~u3Otn8{^itu}(cJsi3Yfm#d)kJF(Q>8g!PERQje34EQ`> z>`2c_#o35?+ML0E?`t)qdbAU4ZN20(YyIBd3s{W`ncwjs-8`l5ai(sT=Rr(yJf#0j zokn?in1AV0_%Ud`y2*`JXMEQ4A6K&pn;~i~rXP&=OGQV}yJHVievU<vg1(T`l?khv z8avrrzjN#SYQ<2zfHDQQvuMMC5Uk7U0lL%g(Rmj(NAm8Qp{rdqwq;}i0+<8LKqZ2t zKTqTWMv@)i&>W-ofzI!GeO&15gKan3cP67#dck>@&&KC)M#*Rv?{ADaOL!fBF;pwj z^BJPhhMj@6w;PVqT*fz#-pvGtiaizrdXTchtI!*U=JXoeUp6vUw`<m!lr_4y4IOLI zZG}Qzofm>byfoI7;R^{FgWerx?Yn0}4|bIao>wQ^HTI!XSYgBWn85pQ21|53kUTsh zx>F*v+8?I-oH&Rfzt{Jf5#l|X!y&VC*>El$Z1YL+9$MJ3m(ZFO?JW+XH0$QtDlUkt zciyn+By$+8WBlaGGV+0Y)<oI*s~2V7Xm$>bm_pLS+V8zXTj(Dbt8b8<^nQK8Lt#H> zq^@U8tD1xSOPKtHn^584Z6fRa2;++a9FY6D$S&Nz!EA22K>Z_~<bqeqx!Y57>yO8~ zhnVJRk%#Lx(0M^>zuQEhy&dWTfz&CNHBI7Fw@lh2i^auoT{S%l{c`u$jm~ZCUcd?D zIWRcu@PPycaV%_>(Jk&J+FLcw6QFxu0u7s#aC@N4_~V&uIZJ=zj<?rI=%jpv42!&V zxFhIrAqzLxhed9lfBy~3F3+rcM;tV9t&|+0N-pkMKxhNS9-x(4ZhNEa%&0mo`W?^R zvnLTk2Qkc2A+wEw#UG}R+|c*XT_kYGBgZJ+4-Rw2786%Xx0_w2s;z6jMWnp<`Bkfh zhjyj?r`*_~-mTpXpS^HfuIW(C+bc0V#SM%QK0&^%xrfZpIeBMj^Hr9O2jnZFSR{Wg z!<Sw^c|1=~aHz&!-x@KR4j9eb5ywN^_37R=W{fT1hVA9wiq~<-KR7KY(P&mkS_94s z6MRPSCD5fmLaGyObcH5GW?yL4EVV!3H&gE{nUv?Z0*#g%U0*C~I6Ykl&f?Z{^?i#a zg=0(_g3CzYk)qw}Ub^O;`iiN$<2}b$aX|!@GmhJgi5pGp6o-gG1K1RN6GHG8(VNUk zHrn||uCUEz9k;WCF`%2>B;v$U)_cxp%BsIYXTHDrSm)U{W*>X`iF@QPc6GjdpuyR4 zFJ*pR1T==fBd;H^tk`Y}*E!esdq6+s3?nCyHIq#w1;#k%s1y-0yG{sY+T~m;{GAFU zd?y?krUifaMX!F_Hr??%!(eyuhr6EN9dfmvFp+lg+_kG{s~+<|Z@PVE*OPGU!gE+j zv#W4)Pri2Ca@34+`Ab%K-iHnk$mUTBFNC;#G2*Clw$Vjx>7JR(nw`;TvF13z@Z(xp z9D!10=biZH)Q;O8z^VN)j&=i}Vhptj#L_*!Yg#8W*MuHZyfInU%uOfr*~ssR8oAb_ z?d!JNN_TZri)#%9^eXA6DY+o}8~lK`-tu)o2e4v#wAn&7d`5ElIZpL5v*yMrpJmj+ ztOTXTUeF8Jfmd(c>QeG~u_4Rhgsq#`Mnd{+=yUNUt=7XYlzwN9UwF!H_PUk~HCmL; z<{|DP{EZmIJyN%7AKicPn*B$sQz$0M4K((#tJoL$>KF3Dv+kZg{p*DhASex=+m^nX zN3AidcI}i_se2i9dfXlG!VRiLWe$qQ^CvK1z*&u(%~Ykq77xuWNMQ(z)G;Bp)OEo# zeRCR{{!z^LdPQbpQJZi2n?w8b1z6#$8T}jT=nY1ogArx5^P0KRW(xMtQ0vx)W1!}W zq84a`LF7l?vd7DYmx$Ddk0A<i5CvG>&^U#&7zk)T`CDZDRs(oz47!tTpCE*onz?65 zJw7+x!M9kcJbw;5#q!#21Y69#x<8LQU#s{oYJ%@@nR0Wx`J9C%z1ZUnTQIetxS`AU z+o*5cL?{W|R<!v1RaSq{?UNbFP3wF!ugU?+3_cvGPPRY71$xc^HLneFL`%1=)T#DQ zB^#;W8}r7Ctacn~_xUK&Z4O%conm<+D<Yh8y0YoeH)miet!THaaoK+yrcMKh{)4*j zxZ7VS=YVk!UgjGUWkgNiXR<mL<7k4-tZoyh&wYXebp-{=%f*&F4EAqh6@by^x+*pA ziF&q~htk;4@4k756m)r}fN@H#xX~|lo@i+nx1c#EFXvVnvErD`>?e6#IV@lG9KK5> zRU8Yl*dMkxPE8xvw}xN+5SZCTDdo8VUA_&SF98}Z61}{h-$+JyZnVOeK21y%5-ys| zstt!aLccj7Pw~Lbi=io%qCbkaRSEM{v)<_f%@UFW=z6LfEbBpYPTjWQ-brnO=TL=H zco0RUp3l0R*ILYLwQ3;;no&$(#Ft?uBp^tOF8yhp3($NqNk`%Hw#pB7^)B`rSI^`p z5bxYxetLem?pk+l*tCbWJ}lO^M689}%lTI>02pG_SKdit2qFfCBj8IR#VU+9K*GJK zk7kejUB)`irykh|o$VWMLaoND8wa2NteBztHC2ZZ^UJyibV1^^G{1(Frf?KBxXRMB zn{qbNV#YE3OL6@cMdv%)5M8%25NzKVcBTL-KX+;Ms6PFcWpdTtZ>M#4w$V#F>LK*3 zA2f+hF(KupA6H0z_&b09Ld(DP&Ku<bBQN<R<p!kGPCAKMpJl%dptm@@`Pl0Gn3q_` zU=tV!n+ueBlZD4E3TkcHk$a5b_o)ISw-<0f$R`VoMrQZs5iK^^KPSZcLtF`Ck)j__ z*#<~XNjOp=<QN!>^F~y2O&tk>I8P6j%}`67dIIGPu`X`n_H4^hpQ595dPYQZho$Cv z&Y*T#T1Wy>h|h5!fB4aT*M}L;Y5iW0*QdGww7m?5fxjAsYx;t;`-Pw>T=OM~yNK>o zYKbrhp_94X>eC0=!12%k^bq!~@0dY3Rkc7}TSVxbeJZ!#_Amh5HCX(%_ME{=H9Hls z=-2bfdaRa*!PU55`+HJoYTc7YbQ!o9^~o6&GZd$1$b;*xvDyw$_4KBL39q3tD&{F` z<vnq;pH^@+YXS>PM}Zr4hAQP)&Ifuod&32rXX;-x`jq4OBcV_sUBM7WLdKJPB}KTL z?o#c(Ud1z^&!oQF&|tL0ab494rLq>@@hoSffR%1Hw?pVt59sR}4SI1<o8i@qC$VLb zhF|_%$G{Kss~^cxJZF0V@C{xnvgF&)zO%aXw;v^cyemMQhRtP<P)|jLfM7S#JS}1_ z|FMeVPZ0ctRWPYY5YWIRTN<(~lH+UvN9AP4SUj8t5^;yzX#}%DKfSfVDcN;;^(nQn zBjse4_66`i_wfQF19<k4@EbhIm}%Sr5@h5*cj)h*DtwiB8QXa_f%{_HBa~NkcJ%!Y zQO%Hl;J{y)9K&Y1RFBg2Guuq2G4a9YV}~J143!g~+-i}A-FCnG$rPRwY^Tk&IoGe< z`33bQ4$<Y2s6_x&{()7*pLl1;uke0<o8f@*^=@x_Svo!~0t)_sI>wUd>}PdJ*G~{g z`?0DQ_0H#Eg>qmj-SCo}^~6=TnKsz|#v{mbZ?xBN?j$_fz8Poru8>f89r?6skd5$_ z9}i~Op$?G!TH_Bm23h?v{u5rjSH4$7F|J?$N4=OaRl*`SE^t{&C`^z;i}hoF8C$3W z)F_8V!oKo`Iakz5bbAAF$a+|tm!un+thK}ZmUnLnc^o9HYvjnEdpNc&sz1ne{eIqi zzT0y3pI`*|p_Zck#Pa1X@%)ANv8W#ZNkRni^^k}yx4eu)fxC#1C$0so5ac;Le&qZz z!r~XNzCsH)Oa*Jh<sp5^_DbDmMH3=Gs=&$7ReP)~_#A59F+B7#<o*r%lBN^JX`i8M z*rs@|#IFE11N`--e}6v$Z*TRH@E;>cDg68faKp}XuxSDtu%Q4?Ry+sxM~x9EH(ns2 z*r1kPLHvXhD^%ccrBo^`V#W_-YQkx%uIoi~#s>A$U16$T(5UvT<=dJtUTi#?Hiw?i z66-mmu219_m>T7n2GIk{{Mwa&i|@^rr+-lG*Po)zNO%AI-H%5^>-`tSQU)oUV~=+T zFW75M54h&V#Xgwg7pW%{kf{U1@p98$U8}Orj>35MG3mnJ5-K#<4Q9qtusbVieq3P4 z4Oa^adnkLbI{REM^)PGm+%3ZA^qW<O@Jl`-Ve?-wAXLOpzW#S`gsDzY@$Ou1CNI)| z^JNOx8fxrMU@`$+aGfjv6M-}8PcpPL5gr4H#SxzfA<|vEdLH|%xut$qnS_-6-Wr?3 zlIFn1iUo4FS*csSNfOf_#tU))TOZIs#pAhr&u>}#UwGV|3iXY!2i3s?gxm+L5Cb<F z?Qa_+SRb*iS2`J2MhR&?i@42o_@?qG)L4Qw#}`NX`Ob9?CvGSN%9R#&?+y_E$14q* zuNkoY2S@$EJ3mRAaRqY+jZ<Bg2*E3j1T7|aZvp^(R>}MMet%(~8ze)1ROi-<>8GRd zdWLe~>Z$crUC<KR*)0FIRB<Gzc06GPL4X!tf)=)4boj4HGT;tuf71O(@NN(QQYi@a zjc6^X>cLIKj=Zke09wcD4&Hod7BFuij=Kb$cTXX;U7r7}kklOHx;i4(4Effv1~u1P zc=jT%jdK9yk`XQd5Y9%<L;o)Y>y@Ivga+;?l_D-G8!d)#MgS(&>+*n2Hd*4IYX)>7 zKYKyq@i}rInCheW$d>}P1Hs&gVq!5C#9e)4X}NkIP<dU%5WCnQa^7b%PuH1kJ`&$J z_-HD#dRoyZ{@uh>N#MEg3*@~2Qq>?(c`52hC^(@=Ahu6NDi=hx$ObspCYztaP#v#@ z@q+rIFNIU+Uia}qojoB{H7gOQGLyx+^$e^f39+o;F<Zl7zZCiYFt0#)-c=fk^{3y? zo3o7isWC2j1TPcm{iEN4^oxLh8His$2td12s!sfr`xV9msf#7@>;Z@h?Y&SSzYWDG zh5^Taa3&J+{~`>(xDE-0Gz*D<o@`!Eq6dKooQ9SF*|!2agT`q8!eJZMSN3uLOEUjL zszC|BceUd$E?5^}G6vu}9IcO;w=Ur21Qhc1|KozcFmv%3OdGITFzws(07gaG{9Bp< z<eZKpTmJ?8TN$LmUx@z0V*gJ#2b9AL#0sPz5V$$U`Mi(NU!nm>QS?~`bazoOIMJ?r z{*A&*-TiNd46)81-1Ymn^8|oRnV*_l9Q=+Ca6TaafI{#AQzzj5CZ#YZ1{K;R=lq8J z-xdU<`p^9YG~x*(FY0~GWVl#vBp(2NJ%)pnUqtpV<RC!$uhcoPlb_%ZvMT!B6-72Z zn<P%ay!aCD&T9gRpAHDXd9?nQcKY{Izg&&KDe)KD0??R%E8@`V*V!BpTZiczfWltU zbe*Au8D3)V5)w6J`sbG)E;sg1GxQsR9}*GJ46r1$=4#W0pC)`p03iNsiZTHk*hxU( zegE43zyJ1&2@!VWf>r*2%!(EOU#lz=9|b1{sr{vJ7GnLZsTqu$|4^F8>PUaH>3>Cu z5%eoGieo{I{=64>^iKr{yJ@0`6A(z_U;E2G{$`bbFvTCD_HU2_+ef1ZfG6GJR6$q? zq<}LPKwQt{!>|1ECVu1c64?k`{6)gc_xzJlX%xScTr3a}NCm9h2$r$HzWnJW2LHRY zE~Ns&^rhhdMKwDzR&Xv*e3%H}<meVNU*Hec7?HTrgZU5S|A69Oi1%+KXbB(!L@D5) zV+Gi#F}`q$3oQVBU6d&3A2<NsrFewAf)M7vIP%|deJOQsr2!@Oq>3N^Is)b5cYwvk z%aZYFfb}R**w8O``kSc#MC;`b{*?cpcojCj38)$4Sy&j8t0)%m%6Nnlv-Z17difNR z$ZMXnU%3Dv5Qs(kBL=zL%l|G?7jJX92k;JGmZ-$VL#62m7bCs(!E^v#OTy(kza-~! z_m_14iM0ReMd;E7=d_9xc^D5^E;Np41!5;2+jqHt?S%9llG%UFPr~HaP~3&RG%*(; zMw{ww>={zyhDR&!tC1~!J2JqrBS4sPYJ9W{!rU)ah^8kiV|sic8~<QjPEw#?;UC{z z2<Jaoc`e<4A&~upJ`rm0i0ipsW2Q;bY^Uq)<G6m#aloYe)nDg$_LE<|uE^pct07Bf zR4P6CX(>6c&^+O;6byu3h&bRj3(x(ZaQc?-F^32HIQ>G%napHK6R)@UAgfKlE`PE* zX9WDdZXvfP&)op__Yp`azxRKb4%ok=bS`lKE<me^<Gs=Vf(v}*%)1v9xYXkTC-?lJ zm!E#4;XnA%4{IS`r!m{THcf3OD=msE)|cTlaf!HRfTO~16ifQ%(6w!X>L>OKv<;%k zujBk`KDu4d)`A2%0TCw$oX`Orc2c9jMt$*pUZekeALU9!Sfm()ymIaTEO~1>R1%8? zw6shXR&Y0OrEfJ>ac)UT>JKA)aqk;JLd;h|*Zjt18vV*uQ41E-w$<KY#-olw<%NST zQJ)csNfl5Yxw$j-B7__9EolN$UmRyCdEn|Fx_AWlO3z<;2n417O)ubN`x6GMp~RJK z?=>0f6M0KO9DNs?WAB?5c*{(nZS&PKlm@7EVpo>ClNTMb=Bm>A<s&bdqdWGIkRf9~ zL2~-3@`N+W0opNnef_~cqCp5@F$QhP5n2FR;BQ*}gHQhu$V)vV9D|Y28C}09uNA|i zf4-%iR})v5bw9FOI?QGZ0%ORabz&lB-6MwdI)-R%>dLH#hQ-X!<zsJka0NVZyiIle z@{I=6r3xXD!nFz>gS;0^bX)jJ3LCHgF$w8U>IF<;WFRc@-%$R$HyfrbY*`$4vsfvl zvHM_Y$c0gXh(4WBEhlhfia}LadXuiVK^&imq}J2RfVhZfY*jZPb!2Dj@#Mp!2XB9& z3JLi@6%h0Tmwp4i3li1|pCy0*cd5g-<^JD*P-&s!{bv~Xm$TiXcTJMTr3n-thjufu zGg@F+|8v7sf9zOKr`V*6?{t3ck`if8iHtLTx9Oyf)2eG%T;c+RC~kDJ+cM(^S^x@t zLn*~ZesUk+c>38|4D1W^bfG-`o*jB+?gA<*f-57xgMdqx{GSvk0)gxC!kCK{Iq;V@ zVuS3}np<}%nG8O^ezMbzQT$Yd?H+k36H9`LER@6}HlC<lR_$x|vKG{%lo9@Cz>=Yc zd~8~-W@CW@1SkGd0Gpp*1Fl}y$142uSO2vW7(j|iGF{?GpYA%K7E2vmnT~EX(!|2# z^-{r(c~%Zfdbvyv9#$v1aAQ7HiZ<u&J3*Wp1I9qfNKJ}Uc~Kk@GPn|BR8GomoIQTj zZ&(15gn?3|R~N`AjX*gTS|gtMDTr&yEpv2gYv4jQN+9eEMoRlbKz|9u4~^x;x-(NV zx5A*DJG7O`f7rya{~z246GqYno=2CaN+(`F2$1u1=tLH*F~I5VOqFYnzyDUXT`Sdc z<LzTT;VW{Uem(sKR~>UBJJpZX-Y<$VjmTGNFBCksl}smm=APonUK5-vs-EJyN0P&} z+{2I!`Y^aXv;cu-t2CXlkDq-Dc<=`k{s>RGqn_a3yAYBQ9>6e+)d)WOt$+h8@Pw~l zvIAgn^Ii(eyM~{5e^)<AG*6FP+WT0*nh#8VOB8~gU?m+6UvIQ&bKK+ze(I3$a?=gu zT_Vp1r6F~hmYjL3iZxSiY;CKhr6Pup&{%ahgcbf=8lmz0{S!%Q+nUpQnNL)`)%U4= zB9FMv*^i75#ro7e#RqXWYNEufY<E3lW$INQu*OD_!4{JED&`)4!wxThUc{hV7>DL- zzJ8U=C4liw;9m4nl2fh-?GE8s*XU#Ohe;Lg6x}fx^v^NIYk2&PnXPhPwfsWIE9onz z&u+!m6Fs`%JYkXmAIFb$J?_|cH}3t<Vdd8r43kB(!TNJAb#frbn>xrDmg;ko@4QUz z_SC8Npq*^;Kz%NwUvSgeXX6WXo<cvx!fUAv5w!i0aXl|Cxiic6EcM<SEwYVzVV-km zZl%FDrm8HN1fP!UN^%#ydggMe>j0*~!^gV-Hp2lE(4TsdpL|)9WI#*uu^<z9BM!%R z1*@paD?z9IBj}UcT|DgPBHPQ2-A#Qkt^3S6t-%_rLcF=(sX^K*>>)y(rwPr?FsGB8 zrxf6C{Y!d`U(p!0?q){QKj92h7}wQFbzV<c>S8uxN`+YJc;OCSa(BQKR)*;T;7k<G zVsQOX949DmL~r@P2=Ra5ZT_b4{$E60YixO&<JV=jx_VO1#9~%q-WTrPBy+AIZr`v= z=`;N$a-`hW$#Z8gXc3T*yFfoBk$RzKzHGEb2-dDBjlc9?%OPI-0{_i)F84`wLC(u= z3#nb{vbJUsvnN8}oQi!lV;*hI2DSUU%p=2CW-BF*%}V-&exGv*ePs%+7Gx{L2d>td zC9_ZBBt7AL?i0(QDaQbpV%>+|<0dRo6%$C70_A@8m!N$Ztr=(`o_bqQrDS3jn4I>V zk*a6?#EP55YP+f>$;Eo1E{rU;f2Xr?>pHn`20kW=hA^}Cp2Q^7^SNb%FX>>DL>{0& zJ`n;Q^QUS11TG+=9!18m17UtO>Gplr{vSy<16qIf3u;@)A`4~3$b+Cgjc}|JUjFj^ zd0fzE?MkamU_7r?qt8)w`)7@t>)9osnp5uz53pL?qG{O950#EU&26?T*MBqYVY+|B zEpO#j?&>}bI;Vx3n)EWA{X`H3DZRaQ0nPU{sO86XQL(2--^EUY8Z14H#%heLwj#W1 z{c3x-T%|zqUa=@DZ)Fy{-f~$<!%YsXSDnw|{qm<WxeILKdapG$v4_%_vs*8(NzTmI zt+!(O<U1L8jeU*{UWax$A8yx}7Q`3irg^A^`dHm=hPNkw_Q4gRs@a^X^P>wGq#6)L zy(gdYMc@4l+hLnJVjzL6n7F@TFZ3EolaHhN9GdjVmv>=L?*P6UOUpV8<pJo2IJ5{6 zwn)YMyb37>{!9FxKk$pc4Ln{ck^4d>`Ur5=amW`?{v8Rx9i`Rq+gRU~&W_5&3{3~H zkah_=x!;3T^lnHUFn=l^z2Xz$1xNpmDgaIXgvuX}v{1NZr$WaVy*m<G7z3;QD*Z-f zfvW9P$x%tDtv0h!t6LzJmd9PaAW@8Cv7<J<^mVQNAW(8(f?obI9bMA#)81`amxuKX z$*ho~x4dmw7BZdUk;D_s!J!1Y3rzRY_oc}NL~asCXV-mpR{LZew3?Y_*pQeNM)>); z_WN~m@VeI5Xk1WH%tjRxhq7$azOF9rbNJe8;mjIg-{V2_y_fOn<E#zvYrR?z>(xpi zo&<eYQUfh{jZZ=aop#XY*wtC|yO+-owR6Tt(ynP-SowgfEG@Xl*V%v&P2`F!5YJku zARkk<h*#C)-~ZEJf)llnUVfgSM6R#i&UP^F*sj28p{PIiU7OyeIveHD--vjMvqA#* zS7%KT1P_(#!f-yYE&6YfU&jFmlL5bGVD_gBTiizuP2jG)M+xERmAoatdo)86`#dG3 z(kL{0ZlGro%g(?AWqq;xcJ-7-kuQDHBTCzI6`!P|fYYi4^{V0Ywnl*+HyA0B-A;*N zfpol59BXns3i6c1v+T?d-JP76y#&*{g&_se$IS`8oC6#>ZmzE86s!5I7<pRi$hD}G zL$V2lQ|aAzR7TkaB5(pqn$u)C%zAHj!?oJtm^H<>;YU}SjCzwuoBP%a+TkhVdpR;M z=P-QoAEw-f^1_@X4DKV?kPEMc%o)2>5s`!kvT|xv`{zb)xm8eZwjuxYul~VI7w$Q> zqQPo8=m=U^V-FTJPw}j4T84wGXl_*zHxz2t4~~^9FCX@}Qgi?EAbzs7g$8m0Gs0kM zVLnWW;?<R3yjzs5_E<8jkWwr-JF^NeG*Sdl>P{_N0w)b?CV^TumSu$-k-j3kvS0eS zAdC?vBiIHbXNEB2*K4SWE+=Ix65_Qvnp?h`T?4m;sA5`vGna4H=Swue`6NZLWymZ_ zHp+2GHN(G!H^%!eOVZgrCOY51x|6=WBk^6ilfbk>DD>q$?@f+?IbT?BxxIoT`ySSP zQ&Qh=fd|%)pM7DO&^=7Tn)HA6tm<yruUtSWvXgm#g}1$Ixc#&B$WL8{)QAmTrBhV! zYvp}PMRMx`jig0L@Z6liEl(5#;~)gFCE!NOmp_^3m2bdiBAA&qn~mCUw~cu6w5_=S zINvBGTIX3wtneLWZQkeOU;YS5<bN<*sFbysPuDTL^X-$SnqKi{0@qq;nra&RffqQ$ zW2*WyIsN+N)<<V5#Yad5f4&2eb14O(sI)wysk(VTj`!7eEk$^=lDwfF`<78zpT@VC z6f9;*%)2>USR_}vR8T#mryu(fGS7pE&h9pKC1t-`KF^3-WHr=&z6j-0fF<aoacbV< zax6Ls7v{D-+P;1mQ*`~?aIgadD)pub;d=0R?+mjhr5ojJKbLS##Hu)h!0Q)|PeIX9 zF-BeeDy6V;xUP;vklBK3J6r2a_413uAnVHTvg7`jt<+SUb^H4xT4~zXH?e3BWHLVF zy-`nnBGm-SF0>*SD7lYkaOGfpttzf0J!a{3EYtjt5N?F*%4tghPd)ODAKJi^s&qN~ zNzu|X@xRdku;8zJuA;~l^pL7Efvu?Sl94l<Ejlf3Td`Dd<@|GW>}7R*C!)slLzv2& z=v?14er<i1%_^=s;f<PFr^(V!frBS<>sedg%RTA74E6qfR>Yi^Nk*!nKP(;s-N1WB z<dKSg$_%z*%j#FYS^RGD01|>L;?G`}qfp+ttwoYTXB~gILbFQH*;8bsQRpmb_C|%} zUFRJa1`o~fFHzvIFe|B60wG>EQlGeU-gA~C{@O~D{Mq7ajFPO0y%gpA!-7S?VQ4H1 zE@y}i^;cmRrg;XDdh0G7CS^>XnhJEc&~-kN`sB={ULm;LQ?5$U9mN~G-~3wV%A<v+ zb&?iA_bk1nU+t)R1;{14X>i-64NjHceu=H0k-@fqpsf@WM67}BX1f%(IbAFjoqfGt zjvh$wtQ8<Fjas1C%r%gO0o{2&Hmh<|F*g1C4{8Wg)uG~%U#i)k=-AM{lH1X`AwE&= zQnA^_032fp8DRJ=wyD$e*Z2z_^+4Xsf%~ctn8M3kq59q<ud}N9>5DX`zmEGQJs9N< zJhYwqI$d0ZgU|iXNa}*XKxmTWut*@)Lo~lI)O(mBvF9L<WB$zU+iIZ%O?XBt=9#Ls zy1BGV_7fvnMmL5#w}o;IvZY9aiP28)&qc~vFOr_jfRz0bVYEJPV0U2d<I7f#OXJ>; zI=wZ&IMKIUH8tMImW5i+UKgrb@Tx9%rtLo@BH*QUs=GZcLSeOLN9)CZvKF13l2_m1 znk5=XFG*lotRloZrhPSepT)SIB_@zNJNg4>%o}O;NB0w>G>{eI>=>SI1+8r{@q;8z zu&syo_wTvz;Ca43Le6>lat!@(V>&b-`D;5ixN8>nzK^Q!hQu>Wy{g;&7p_5uFUD8w zI^PX+MB*fm?8-iJKpjELIo?<-&EM(CKeDa^87SHM()F0;w%sPKV8%E)TABfD<Mvmo z>+rYe6rS{Nxy=X`P2+WFvESKtlspvo(dXID(^OG0;_a13cT<1%qICMzWhnybd!(g5 z@`->fW!{Qd)akH@ca?c`g@I^1_{CubiBjFmf<%%fijRG=LSmHho-_wxl%M(Q_!O0` z?%W{XWen_a$aQ9nSFC&ZH5QdIn){f$f(TAzV>ejhDZLxv?fA{@B<Q;(C#@e^(N1wj z4sFQD>32=e{1xp3Z8&oEU`_a9mq0sqQS@z!nUTnM^?dcOGNsNtaGY>W<;0vEEzLDe zT35>og}K2LUltO@h3F(07*^*^d>wd>NTm2ajiwBFkVd%GI&5_~=VzG?ethZ2ue~3i z5@quw_^kyI{m#uv3amj=$ZUI+!Rlk%Q3);S;7Udb%_`(Pge5a*#`uap>ucCfb-{xJ zNI*_^63LD9-SvP#27k?eJ1FTzX8*b@I)=a1)mhmv@Uf0NGWzyu0E{AA-}fXjCnrZe zSrXdWu?<nz^O!BJM^l9_Q_9#ZgPYy#!L}1Wt>;g1LRgatKV%Y2<O30Zr%YZatXzYn zXXbC*cS0hQ+mu4LQU(&k<oTph(j2+N<c0Kb!^n#3>v4@%8;BGPr4|NR96fpQqYFP5 zI2V7*(QRjGWGPK#X4EY-U+6c9hBO(bFZqb-oBHL@-SqAd>OFhb+Xa&<#I<?5*>qcz zfPP45$=o4OqUN=2uV>r-*xAgP2C*B@mQkPJ>o-a$&cz^!#p7}n2dd;)QZ(KaQO1XL z%Dk$<{Ng+jwwcPt(J|3&C?S~oE;OZ{y>(wB@uxIz)2$BJ^b1`p3Wy54|J5=0%~@K! zHlfnk8{=t8C;fWQoJBUN*SoDe3f*!)N<soWsr-3XJxg!AwYr9Z23S^MXUwnJGR~U{ zqCd*6E{LM2j=X|?VTvy_F_lpO!L8CpBw9Kib&2UGFM~yJ1yg+WkI7tCM{=ePYi8ZC z^lKc9pM%D0P1@MCJDz(|JnI)=x=pEpP;-jr$SWAX7Xt`j@do)>WcW87zE0C(t0Aq( zPhYQW4cDJ)F5o@bdow{{<2=-PQXUhsvVSjk_0w=*xBLTLXK^ErrB_ZIxv#zfC%wyo z?2;iyjI_;+PoOa}*1_t-)89STLQY@rJG7eHm~F{6O4-JFh;w7*J-&+`*|D>tksDO? zwAxJYhG&^w8Tv~NX{kDmWn~<qox6LC457{a=WOy@By=)g<wW__$)p{)Y3bUYepFAz zw3+%ayVqc3mCP-fR>-k<G9F3TN~|7hNkqIT^IoZ%HSOf8o}hiJjptbrkfn$aly#f& ztMS~;As&s%S7vCYZ*EO#?qgt%(rYdUMi36a;{p@AuH3jl#+rD`UT?i!ojB_cV;hi% zXTf%Ee3NJjogU-*|Cmv|O@BqxWCBN5Lq~BPi&3k_N<!KE^l>WAmfj|BPi~rLd8^;O z<7IouebzO02lT@&O>2n?AKm+6Ibv4u29Ler*XhGAO6Ug4iDarkczLdKBW)8aSN}ns zU#EzqRsKUgL_2vXiS4)AUisrl4vUaJ^N5Yo%$cmLb-o&F!Rkc9lKOGT1KmwqPyo*6 zE8dm3u`r^1kda_m7g7-<J-9SOKQm36xFpM<q{C##md>J@qaw*WJL4T<j}2C-Ok`&W zfqgK`d4@lql7dFpnj-KivI{4CGh3TiyBj6a$|p@!YOg?PkyZptp3j|Ij4vexOT>w| zR+S^NRbZ&|rOi%mO<t2XG*qdpm(@fKVmVh?TMZ~0XN=EJ)xW@dSr3DKZl!vJ?+<_F z9Zt4yj6FN@qa64s);$ro$<M&gAHk|y_Dtb;4d}Jos)ugqn{RYmj%dy$s}+@P7RV*v z9NTuPW-iSv!?KyFeYwP}p%SOl@bw640)NnhgaxOu*<gD`iHv`3q>|J(xiFt(?Z?@# zF=5O32xog^c*4(k^gtV_;-3e~q_2cqwwdb{d#&o4l(zMJ)W*v-IfP)jw+icMy3U(+ z182*<3N{4_m(=FE;HMDW?vT13k3-5+KXjVvm)*o&WOj{@+}3?cW#uIeM1ruFmQ#HL zg_bKhT+-7T=~>3waBfW~0C#&0$LK~`%M)RtSTXva{9v*_0_1>Ks4rZ*VkS`HmgH4; z`5x7KTpx}iG?pgol6e_$w^7Vajd#{o<$iENG(Kd<WN>ma@gQQe7dL{uRpK7SCtL-A zn1k@uBCVY<#(<m<(a6t6MDse<*CfSqq}fX_6w~hK5HJo2?M3ygzfV+1s(N+%8D@>P zY3a>6A6bQ&*_k*UX$-LN_2-qG?xpr}Q}{aL(pZ@~J-zef6yI^^Ds0Kf$quav*Lfz= z>1<}2HhojE(7?^ek6$#!APd1D<6ivriv?<({9ARg@8lBYeLun3r~OCv`{>e#)aSg* zYDBgmhh$^6r9Q0P7K2*b5KIIAJUq5@q<NpCxhzWG1<aG}^V$0{EWY!bZWbHL^T&d2 zv!CLMG{TJ;7!Nt00TnR~O>!7N>R|%f=?AEc)Ub`>5`gp5zsyO->@@=;1a3)lg$-M* z$=v<3D`!Z)1y)u%3mLaxAInjWFQv?DKHhM`K6Gj&(8sr(DW6eW04A-@vo@SIaL13& zo!~aYX8HFjN}4k$@A;K1p9<;Qf~!WWZEd*|+>!(kC4MclXHaX_23hO)b5rYj=Wlmi zJBr*^-o4I0c{#41>0jPVZE3so?BcNK0>BJ7rop8T4`_^~r+Z6pxvcS{TZeQQdLE_l z>d3c}2Vc(@4d|H%U)7%EZj8R}XPE<0!eor}Y<JFmBGobIu-gIowkxqG5`_k_bI^4O z%wnMB<;V`9MTLbBwK`M|cT{RyIzHs2ZoehfDv6I<`c*?ZQYK2$iE~ufU4~*qoBmFL zDW<FF<1?QEDKm_%H<@nT1=Z1LI)>oBRI9!o-jfSm#0t9SBuK}f+gGAJ{lT!YNU59K z)~3c#<P-55r63f1wiw&T29k@Ugb8lLUhtR8Vh)xqhtrm$TX7|Nx@Tl!qvEa0K*FI! zr%XC=`8nu#{{|Guvs-X@D37&5j|`4t;kFay)kBbA1+8ozbE0%(a%5H1>+f=)aQH`= zl5*Y2+PDrGy+`<7z(Cnao;e@oDi1+#3SVisuyAhzmk0>HKYUW`wLO3<2u(<P2qjzP zkp9H;Sq)=@I^dNb)n?Z2AR;73q&MzhjzBwK1riD@{W!H%Mfq7i`6tWZ1^8b-wzV$v zFN_XRPRhxKu-@~r<qxm@R=eA;q^4(A#3K9vtj#QxB}q(7q+$EsCGp!4Bcz1YkJsU? z=T_VDN;SWoYHpgh<4UX`k@$y$cggwQweYoq1JiiDj~DsnkFT><1|B`v0LK-%1cmF4 z01=n9Z+Okehf6^x#&%6lu*ta-6jBe3!$9VZ2Pf+XhC$@-t8M3WGSv$&)4RX5#M2hk zw<gFqN<E*9@=)!2liN7eAKX`S=%bZFzk$Od^FhJ(z_fg{$>qMf7jwVu=XFs&nzD2u zt}{^&hdtDjs2G{m(BtU+OeqoQqqOJF9FdEQ{OZ4Q0mV0JgDi>1qpWj?l;y>yz8R%F zj7{|#47K*7%HSEe_aN(O;AywU-4GXt82WKr60`5)HFJJ4Jkt*XDLfYp;mr|q=1Vgt z?_^=IJqP^T&GDd}fyN<OoPvT#9@|;^jT4}?KyCu^)OAx)?;I7mE2H7r-R>7f{@)59 zXH7f(AnVYm?^5|slDU$3-Y@HWrWKPpad<7|EJKOsd_Va@7l|J@>>c&U&Nh4tBzuvl zc*`5a=w<)@$uf5=kKLSEZH`MpoD!QMw8?4`>1CLFi-A((&h+p{Z@&ndW2reG1?#b* z{NaA*ySHkJ*Am<Y8&=1X_k$>Xy14B$`pccLCaamj6K-?9taeRMHTLL2Yd$qQhdXjf z0<U{OYS57nblHgs&}m42J}}!~*lf{kw32_s{sppowA~AS@;f3e(nzL&@Aetl<q)KV zAMq;qFZI4Ai8S*oeN=jmdg{9#GT3GI{ptARO9ph8t@e&Ezq&&0diyz_8$z8!#ky^K zn$7*HHFK_5v~*sTboT<HqN2N^ZcuuEf5d(+?b}wzrON}8w~FgK+20T|PxHN2e-@{` z59t@`ekYfzH(dO9&3?8r(C2Vcv>WTiV@7Sl1gQuSbc%O+9;-Q8M~1F2@O16Qn}D+~ z4el-8;iy0SjZ#*W0lMEBRd}B8tI`{pdJWiz!;xoInVb@g%So8;s)nZeiJ%^teYsq1 z)-G|=`8kI#Y0MtpdVm{ZT$ECjub{-rC9ulo`nZeXWaCA}D3yf%Sl5hnM>)x&BZkr4 ziAFV(r^O`Ed=ELDZlze}>Jww7&+3(n%dwt_$@aj*eZQPP>D%qg#jbp`NW#l5+$25z zjaQ1P@3x6AFE2ImvWx3%&qjq1OT}`Z63>ih!HMUP+X8d>IkgSH>oNuhZ;t>-mDpjU zr>C+?w`zg4+IiQg(PA~-R4Un;$9`bx121oVEX^&)hLJXJ92LqX%4F?E*BqS&lQPcj zH;40;+ud8&kAT$a8_hWV82wceK}ASmfddy-lZGuH({+?JfwAw;o{>_ro}C;Kaw`|A zr07P;^b4F53UayL)^9RW&9Nm)N6Eg&k+}ydX|nR_Q7_b=sq5d7svozKa=5~y&%ade zJ{eWcZ%_<wkhhyHi|v7;Y0Qu%LuTe=fW&bz_`{RL<(ggyR5|yIo=)~SN+@yXbxMr^ zcj7h?%u62IP{8RN#P2GgUF#_l_71jGZ~q|QG__gCn)9`mN*b5>J5NAyYPKlGl~_Wm zpzUBlQ${yOtW?!fJMlLjcggI9gSRv6n^I-F<L+m1C0Ao`Jb;vp7C=KaE81p`W)+6t zohpV*zLhd2_!`Eb@%d-LOCEIq+EKR!d0UtrmEs%<;&k;N>39UUztzuZm7vFNw!Q9P zhh8zG5rVC*=ab_|*AA{u;jk}W3>vM*X0(~8b*d2X9ijI)&bYHtyPQ5OCPwR3oz(d{ z0<`l=$V6DdPS3g0Tm)O)uJOQikBD%zRCQt0&3=YtFlblRi<1>?b=(c<tk(Te>PATl zxu)mmFP}7T!tXk&S_%BKWQVi_2~h^Urbwkrv+i2P?18MHu7e?#onVyh)0KNo^^SG{ z_l{f+m>&G4N<e+#P3U)(P>Z+8ujIq4N0_Qv5BB!)H;uqiLBLdii9`dIp`m;o9CRni zyPvi(!rNk7uRB^21b$M`KC9pV-r{)R1V7pr>l59TJ0y0rnpHSCYI$77U8=d<Eim*k zvv;8O(<9l{a+iDLve$}x_AGRygCPv=zH*Hac+fO(MHS<gB?zu#e1l`v0X8OQ>UMJC z+ZC~w6(KaXMBY+(!qcsH+P~hTqvy2=0{D2oU8s%1b3>{Q(u58j9oJ*EYhFJr|IAil zC!zyb4n|PwG4G7m+~(Sr*A_l7ZsVCd^kDp@M^I&d^Xa>dzNgWC3F2mxwr<mH+qFk5 zf`%V+D}9GgNWtSgl*CR`OJO9w`V){eGlI>eUNTi6KO4$ftk+nl-PAl$b@Z7}wfV}` z0vEmGWu1c--J>UR1cPyfS`0lj;`L>lT|VLrMKhIZeW@S?pQBBllU|<L>H_JdnS-A3 z@Y;scHEUD1mfQTU4etAc9jnFQtxW5Z+DOp;f^prwK-cG}D#A$}d+PdrMQI*z2G8$< zbPHIlppxDN{o#&=iXvU`R7|oH_YGP~kMH;%-OO&mWeQ<{*S62@b+mbOY_2a)sO+02 zJ?sY;I|TxZm`3#kw-KKszwJ0$&7{}Qt8Q^jO?jVmqBNQfx0jZ16eKuRTsvOarUN&* z7EQfi;@JNB(7yHV*@^afW^Ox3t-9gpn-}LnZhl?y>~asN61s&>DaL6IDK29go0u~l zHqc7y+{6_)rf1fLt5<C^q|2Wsz3V^L4B}|1ZfC|D44C}z`cQqJ<VW02njl<to;B9; zz18`TW3j^!B(y)uJ1lIF#o7WlgQ{4}Z9WsHh<=a5i>7C(KXwG~!jFv&i~6kl(s>kI zH+<R79lDMTLE4-*t_G1m&{>GNIm%evQ&dllSuy6qZIeH#@5YU;^}##y_CsepQ`60A z7q0bD=Lbc7g0N?Nn-%YzgnfX-kN&j``@aMkU7jj3S6MkNQ>)GFm1wFg%gs-*W>fZ( zOF76>S`C^kM`x`(E1USKOi?{_W9aax<g3Z54jHec+FvMT-;yfMd0zWM#689C8|K3g z!}uM~z%l(hj_G~N^}*FcLs7Bcmp@uMJ|0v*o!K}agiTTo<G!3Lt%6s*Rq;f<p(ELR zhXykKuy&z^Vcc#ZW#hKX(b*9LBwVv<{mz~mfZl|j><;vF5}BpcrlypKPfi8a#~a!E znCOl4<xbf5q$Wmsx_a+&K)Yp48n)WkSAwleG9}X7W#tq3Vvz$Cz?=mxWl;2?9yq1v zhQkBfF6XIKWx_)NbEt4)E!3u~pJS!dK>^}L=`Go>&6eyPSn{z}!Aen|CCFvMx1?kU zjl<G%a0s-BRnq(zFg#i8(H7~X{Nc$`x#P1>nH$eqwd+36v)XI`6cJbLu%3CJbK7I& zfpd3njil2pcJBn)P=z6&lk?4ZL~SDP|6}W|!<uaS|MA;ER1_2mX%(bHq+0|;y1P3E zQlpuIw1jk{bdMa2l$P!oBNW)k(To_d-@I>qp8NTHfBTc|;JCKqyw2-&zUtj)9f<wJ z`*Z8g(K*$wOWVUSgBgkPtANpf2(Pw8$^gC{=>EYumGf7Zm8^%(Z5YmM!82b7?!jUI zsNsrs=)5VlS@bY@uI1K{|G`=|L0;-dZ`85C-9z21ixr}IMTUh+i%4Dc468LGHceb$ z!IdB#J)sGJRAtFo<{JQ=6T!`Atf`m<#f1544_WDb-^dGIhjvjM0_UnRaB7QE!NHz` z$ODJgiD&87E#SJn5$I;JiS-*x8`4kSy)r!EQ}zZ7R@Mi5y>y_QUPF))jD{MEX%m2T z$biPvj^Q}3Q_b4AO*W`+@I;8G*wuOG*(O1&L@T;KlJ8vTu<c~YT)Vd<^|t6vcyDm( zJgr;?!lU)n{CX+MMib%xgWCs>^|CT@@x{a6M7(MCZQePP^%Gn3-$>=(hrZtqyKlyK z-gY`;ys2ZRAaHw;b#I$2E8h=eId}wmO4#K?a82RX*UnpqZ+Gw6G2U8yH>6e9`1l*? zZf&M7Knz`AWUb6d<2%UxY<zY^6vKXebZT>qt4x$#Gxnlz3x!e@34yZ<u&>%K4m7&R zcTxbA|9<|NX5aZ@@%N1sM)^T7!mNB*zXmuw{Bj{vG0-sL-thOYx}VKdKhJY$CzOq) zNAe%wEJHtAfrpMlZMI}eeW|Qu<Xi~&ls4;alD-agx;rRSCEe?FK*(6;N|PFs3jWmV zJX?WC8$zA3doRYvA3mWwQEQdRc9r+sI&PghlI^>GUi`!6QfB8SU%73`oNBY=IgL8i zOTpeBmKTO4kEK3GYP1OJkYvmmU-Il)<7N(9=!MS|O$oK<zM-LTX<C56r)pW+cBcGL zl+H`dQ%)Ln2yuiCUBJ<YX3Qd{Px0#IBZ|v*e*iyjv81Q$O(h@w$c<Tl?fijv01f1h zhZuVuKeu9ZO}*Sz0yXh?R$;GpZ#14I8T9W=TPN<-2wc*AhvbW6vmDIUhO-NuT2TCE zi^1-&I4ey<$|Co9yu1Ra8(B4cx3zG4xBz&l{3*Q9cc(F4S;VTg`RbhQ_;5smgRWss z+yz&tIU$)TLf{5n%{c7hQHioTS@LgNpDgg7&0{;PaMcL7=yPhQM2IzdPASD{NYBcX z@(-u-rI#Dka4w&drfD}ddJlwDy6AhTKK2v)<nP1Ya?k_sQ0%BJ(Wn}nm(32idd?F+ zVju5i6A-e81A(LTL}Hv*7Z!Hi6%Nfi90&2Kf7vdM;eII0jSphI`cWbd@9z(;cGoXm zeHnKsvVZK7vFcrzDG3m%t@2+=KVQfz8G7a;j*VGL^v0jew!Z3+*W8==V6UGlmx!bZ z9hx!V)8Y^S?ZcA&bbwA#(JqIa>1^a!y<!RQNMY7vi7b96n0B#f920UMd)x)4FP>}I z;vHY_Y<)~se5d1&@m>0h+T}}=M~^3eOIVXS*9L!?<o*$~{$8iwu1J{K4`77kEAB9- zQdG!}e`6@1@ghdTWA-lYCp!19pmdp4Bb9$<aCsCIa}>unKu=rPJR`o~gPIuO1VfQM zVHg3f_l?UDY%HEOz*)iNm6i4Vs+HO4!G-f&BJqa;OYS^$ZkI~iE%i$|d~7<^X0o&t zXzGJfa7&d6XBUeAU@#_(=6^2=cYU~s-~4J0vVwn-zCuKS9H4t$VbX~+j4FhT{Ru%` zHb0fYasM~hx?)Qzik$w9m>;maZMTc=_gIUynG#~FyeK)2ILFfcsB{b3!tiRdMTFL9 zZOW8ScxS}K#Adl&WcxegWmN?{RTk!_KF)_k@{H%z7Q8=@>$}i=E#9wwR-5k?uW#6p zVNEi!%tNqNxlo%<YM0Hbf_hi|V}nG8`cP1mU7N{XE(BHK$V_#w0HL80lMI6f^U1Tb z#DGVhiWOT;Xd_fg{Ram)MyIq(tb*Tv{W$ruA>MvkQcdow-}1gJ3<s-&WK;a%gM-vp z+dN#ccGf1P=N#~QC!AE(5R=4#iPXWhMNwK`AQ$Gcd{*UN#+%bS>wz37TVKHz?qW~& zL&uxp=5j7_b@6=h3Ao8(G;_5cnW(DKY8fhF^txJ(=ZREGFDV_cEtKlr#wO`z{D^qz zltb_K$)}p(ay58I;GX9UFQyC?mmP1ATLA42=0#V@!U~Sl9ky*4v&GQsLF`O6^(gTY zVTyK%uj7BX0MNHmI*_>`Y=OPh2@YRFI$)!lobrc6?6W_%)Vs|tp_aTaIrOp^ocMql zOwqJn7jnWE-ygak4q52B8kTAC;VgY-Q772R?1Ihu#S5<b?aH**hsXS89m!LZCC%QR z0g!WVZPZSs@a2pNdT>JY7M<_13yoa$I|RiA#&LL1uR~Gvs{W?KgHr?3kq_t-4Zpw9 z{fAqO?>DB2K7?V{asm{|YyQ2+f35ew-~XF7d3A$K^-Va+<UTMgMOdOf<w5*obkNau zb558zone)AzVOv|HNM8myk#dJ%rSQI^jW!sQ%hA3;7ztyp!nr>&Bh?Xh{l?smw1iA z;^jI$-@$q=n=<$Ic{;dFaVbEId)qIXiZ6mguPS1}8%{IH{#>l9PUek5+SN)7@A;~R zBMm4^Ol(`U@=sLc!<*;tP5*=ZUS;0N+v1&~FG$~6b;>0+a>+0xEPp(qPoXJq43z?y zmHL;$SeITt?<?((XTHBPbJnQqeB?aoreIyt=e<;Fa%eLU)#H=suv+q7Er;(+uMA%P zs3_d2-JrzS#eeEfaW1ScYog2Sj%+38_LGId#5c5AgBj!9hJ@{@8t*D@WZaWFm41jg zK>1}l=NcO|1_HQ-R@=SrkUz3o>%WI2yVIYmAw#V2&gY{-?`)PyDNm*U{8)cCXdKA_ z@64*_DI9H*1y_rF&gAu}<(-+B(3pz-*|{1_o?$|NL&ear&LVYX%6en06#ovRm(pCC zr<w2SnCuyvMvpxXXiyIzmr%(hmeYa@)A=2UPobT%A(`5<m1ezU``>d{+<E8KMn-S> zVsm4@D+-r9FqbZMZas6Fbt`)4p{|raB5_$Xx5D_GMUqb7;IYRQv~UC0;woRR4~fkb zsm<F0x9UUQjucsc>`xB@XIG!(^yhmVI<9{Wm7V`Qva7R_?I(>I4&Tmb)#^pkNYe$l zQgd-eu(P-yoGeW&GF0ddeKk)N%C1rom4ri_D|D$7w+50fp6XN>IiDCSTJ^=BEO1T4 z#SLtFNmI9-pHp$fh&g}Gz8=E0JTsS(>UM;~JbI`tM(T@%?85Q-C6x-aO-$<Bt6#)X z=nm+~_C=%ThB-yLP^cBC+&tgd8HTQxI9J{6A7tm@uAc(xHJa*01t?DescRi{uM09$ zPG5C6{-c#&-A%Y$)&>=Zrv5Sx6scTKA^0y<^LwxVvVS|l=MqA9)M!4B13_#F>2++| z_;a}DQ7L3gy-g+C_1vzpL9jZKwM_WpD0ig6+ibD}L4ZKg7_fZ1K9waUwvD}YSm!W3 z_6z&qj*h&(`%~D_%##JPDSthfU14^2>$xj2b~PvlChH7(vIxTXR~rnA9A<=->o^-0 zIyda}RA%S4o{zIR;z}Xa(vd&02W?NDUY)enJD$i5N3&-pCOb5>u&et0uK@FllAScT zrdZZ`w@cV4C%lGb3$-z#F9P3^PI_x7^zqqHBs3e*N3FkNpaMG6K43QyXF5J9PA3LE z<Y2wX6dySM2uj2xrkDuF1CqA7ob;YV)FxBC=B}T}6%$UXi?NewS@7?Av1S_ZcKa_e z<{j+hSXS<-i(GDz$+qcKblul`HX5#SL=&G9q#6@crPET-Y{e~ug?B&w@O~&;oDdR| zV)D?<4)x-#aB6xS&5$PBn7S)s`FKib+*|1?Kz{b|;3_zjE+D0%4NYmb7{2{+<;@+p z%kWUTwd4%9tfHNm0<BEhH*YkI>dGpz@JB+6(~h*(Ibu~LuJVS5xXRRCj^I=hDe+F7 z(nD+OgHarWwtqRKKednvjch?@>)4a%l;0}JeG|~>Gjl2GkyfE}kSD~!GiG-(OoQAM z*W-6G1VeP<y+jU*EY`!TRwj#?vImK%fFvR-lWyznzPsd}^FX@eohgy!!w$qXUWW<m zY}5pjBTeRLj(7Ll`9bN(VT)WAdrV<o!^cIRUH`326JwUs2EdH=`A#Sch8_LmffaVJ zDLLBzisG(x?1NJrQHE$C63^T9-Me;%#&_O$I~O~o^NOMtfYF9-gGqg-Vw6r2BZfw# z7X5cGD|;7d>K7CdeesAW5r{*tio|i3e#>s+NtN~Cn`0bt4357%J<gLe$3$}=j10t; zPnX%wW;Unhn?=A@!KPnR=lu?q1P*u1;+SWg7GJro4QUdrVQJB8R@6-1JuHReH6zjS zKg$9zhxNkTx0UIzId7kAx0A}aJR`ZiEpqMXm+$t6$p?EZ{>oB`?*A@5%7nid|10j= zv#6@8T4KyR11E5e>Pekr2T@y{0nGCdr7e4|QLodn(4#p7DEN|kzmi_IQYpQ@C_KKk zMwBZp6{;Yhq&RiM_hgMmzka%^qkE?j>om|vY5|yOy+QR08zHHja~;6Vaha~?6cB*0 zCrW)S02zEAH_b8_m4Y-hIU8YfNAS(0l|JO?yHlL=%SN=*u_rr8#QL{Y=v%;pZx8+r z>%xeyapL8Rr0+?(_!nvT$;u<-R^0_jTnd5S_fZ5lHM9EFO9`-X0}9xLZg!R3FXg!8 z6QO^$fZPygYH89rZqW4yqq0$hyvq;7#Qm{V^UpPOt2ZA^;6kQ^=Cb*;`Hf7+303{1 zqL@dWa9`oAPL1fvwda{VvV0Wf_`bI`7Q@Ag*tT95XK9kH$!i;S-5ys|0NoMld#d@q zfy@y9<1-dKfxwXnX<C!rC24}@wh7jyyAY|Jg4aI*vA#As)13M>cDX1akwZ@J81eHL zHH`{c?X~j_R=H_nAjs9(jLA_mUZlG+P<hr(hcRyAr!~%*S<OE~ueWSY-LLpsWdEa@ z`y5Md{(|dqB6-Op715`0oCBLFYjat?Xqo=ua=n8**sNlYUaePEdAeS&{XTy4dC(m? zZD)qZQICanja`TF&PyD);>j~X6_ozV`{T_kHpxI#-9USJBM}SFZiY3Zb+DuDD?Ei{ zEGhq3X`?C`wvK(-qP(%S#0mQoQ*7qhHI-~4-)@mfofh0>%DBsET&=5|y<d|h0*cme z2?(CA0hbVJ{ydX3YT5`8!)P+!X`AB}Gl~{Q+8QlvtyRFCKQA;<lkjI9d=AJGj{+OE ze7)E(mf$o%lbbZz0cH<3=voiWq%l=%?F&aRo2+7R+vZE}vtaVR_%|_0p)|mh?XldZ zmrDxIQp>z$yGg00L&_Tg80+(k0q2jYMUIS{!<jX)9OsuY_9k%c%(U=$3nxnYU+l+z z#{gF~cl~^hcA1`DX=~XzSf3w+7VT$aDc5gaJHyrC$#A6WV_kaaW5kork5OuNCbdpu z?58~QMkvhJv#XQkfe{(^PpDKyKDJ%Zsmm;-2;`$mrJ{n|C=;$DUQaYvMGVFt0&BbK z53&f(^o>L+9Z9WZ5##<{+MopcyGb?rAkO)N2ICg%C@b$-(@O45ybfAZH9E2DzY9<% zTfT{7f*W@VBWS5={xbhxZuf5m?^g!O?D7Hge)3$vlkG62d(a{aXPXxHpSxCc(gw#C zjQc_?7l{&)<XFyL3887=uyxysggZD**ov~waZH|CWK&SsdUD^|r7jW%_SWgQXVWgK z1O{Kqkf1~$_eDnTE=V_@55!EIWn_aOm-mi0OTlJ3MnFJjbg5A3#MLuGGSdIxxxcYz z(Suii-=EtzKN2^V=ic}50FDh=%*FL0#+37GS0f09yrTzyQrWR_9B_~hC`?xecZ1d` zp7X%Ua`0-aEupiU3o_kTj)=qvmgk8<P_IYwq%`w1XR)Vdj$R!<8$A_OlD>|kGgjok z-kk1RFuo@*u9^8mC@IRx^|}P-&P{*a<*zxO7f&1W3&j)=eXCEHpc&CW<Q_`l-Q@16 zdj<%w=}IUFeD%;^!>FUJFLSVfG=Oa_VOX8*F8Kh!zLb3xk7U%+mvC@+<yGQH7T*jy zt)n*2(qke8UJHL{VCRF=`#y3pjRWdGnW=p8k7&azhHkH@NLV?y9g;O|eZZU!fLj?O zBk!`-6`xzKs`XY@tz>_JJ5$i_Hm&g=|7h|2Y~-r3lyx}}H~J=qQmL0#On#Q*^86kW z=Lqy*Z(1|)JG;MxV;CyoPDzEla+-bN`$-sFopSc+FGiTrPwc~BlRQp&OI7ONY`b`w znc9~OOjHcgP?pdVzr67B81^QQc-k3Sc_nrpX(knN_$Wq9GR5<v`7&B$mVm2;-MQ(E zQK%OC3Vvx5{WOJ<$up%?t?6iev5sA6lqJOqH%D_jU7DBYn&;1P365S~0<PvCh6~`` zzufA^t6jTU`J65^+_%a-!*#9>>Gn51-q{B2`hV+{IE-sRR2bMzcfia}ilum5a04jD zf{5ld(C6Okt-c6ccA{SN&Cmx~I)MmWU5KXk!d9ULX4uSxz}f_9-g?EPoM9UU&@Mt8 z9Fv>CAiR(6bw2k=zdyv#=Mp1c;neJOPXt%Zsk^&)+5Js2=%aTp4oV6ee1f8HU3JuO z?T6BORkA;YZ&WHf@?c()$4po_*gGv%bMSI=6+T&-*IYsLvPfw9n7mk`Z#_LPtz4P$ ziUm=ogzqi|2=oE5$D1y(v_81P=1D?-W|1q-w&(@-0S{JsKI7vpxRi<SWz@@BYumn= zcqVQhAwG8nl)`ky(yJ|gr&|9ZTRAfjBQ=$ue+qXhkL^-p6vUTKuVG!~<*u^*bdCNv z?o=S=xzwpHddHWafH=o3R5@uHDNZQ;E_p&M(=1=@_8xN>@zdWt+GhHD6j#JCAm?Az z7`Csjr~K2$^7})Sd9Re6S`nf3)-U#}Ts#6eUC`T5>zO2lnF;`4&741$0nwdoLX1A_ zggdn<NO&z-1a7r8y_7f&_=!j!L_Xw*M8cT7^gUwZQ|)}!a8ra(9m7*4ZJYhZ0VpfD z|9HLz`Q^47*Q`_hmai|;X|CCBXvtJN(R>Bn7fh)w_4VHM`>+1e_`eNJAB2hD*^w)d z*-dtjC3<*x=J57EP$r{Kv6ip;>u^AQ&bU#Aeb}VLn)Irq5TR({<`$59>?nqdL=}BZ zw9ocNcR%ezxF4*hSS}1M1fF~OY&;B?9cbUb^rFN~r&{}|Nhq(yvW#60tz02iNwDD; zi&R#Th=0?Y`R!_CA<~1ST&s~M*o9sjlc*t*`1M}jTOMs-G{b{EH3*l^rPc+x(s1^7 ziQ&sQaTu;!m(}@My4qg+tY&r8U5{4&1|4}PW}MjGbXWth@#?%kW0%Zh9rM-uq*5K( z`rr>2fU`tM)-U>{rwIGsO~eK7ro8$N@|V%RJ4qrC0A#MYke!1wxY2!+aSpQiJ-yDJ z{=U?{7!_NYrRB$+-n;1zb&UZNK79V0yiE`*1bvKf0xf9WC18keCIN-1?zp=&?K~$P z54!lEa<<QOzJv?0H0`!z;~*^^Fnc70yA$ZE*c?ggwWlU#-!;}jzs%0jA1W~73q;Lp z8TxH>UsN&Cs&Y(>bF9r4=%t4dr}ty-GY4IKc+bi*Tv*m@2xW5)oon@YRK8d%nHmlv z2*_4xf1H;pc>W8uk{bsYOB`-b98~SA^yAY8yj{fnkUEdX-_fjJ@@S%U!<1`6=Kb7Y zxq9etQYZc11Y~w42c)Lg43b&3PDJ@0)n|b=<tTCB&Z_SNQzq}+%W0)_NN^qRqwCHM z7Wa%iS3KNNQ8PGORI3zDQ}7)T1hV0IcRzJWm_beFKe|sR>Nn!h%WhI{rj$BX!`1d} z1~6+&7R=td{8!5fI`pE2Xo)_^ZosRbs?L78ar@Zf>S?>K%BOOZc(M(I(&p-ZI#=6M zP)a>y<qd5vP94-bv)^mJco+&}TGq-O?62Dj_8!DBjM?}xLWk`@=tc<loMN1!lEVEa z@DQOszeCT6;IXC8IkYg<`(CP*7I|`zMya+^Cpr=8s}lwtF(8I0O}X@EJHxB!S9M)K z*IsUaZ8ieX>Tq7g<17<wH0h)m=w8m@>*bP$7Qf3M%3`N0F=9jD)(hcj2BG{pXc}hP z56tdtay;gT#U(=H4~}(Al8D6pvU#(0$}LVV3Mn*D{A#c894+|bpNA4rwK5s=Tx-*7 zJoYU{{ndWoB}=gJ1P%9|lHh+ZFHIv1si%=>8x4?10aWpdf6#CFz$?xu{X0`vRP`;( z<h0Bn=bwtSe|voXo52r@Adr78p2Fqn!X)fipEy(8m+Sp-&@;ZZ>hc2YymV#OggKqK zQ+pI+1@X8=NRdMaI;e^j^0c4GTEKk20ijdZ*?u>GRwB*TZfa#4xdQj&j4fr#Bb^ls z)%yM-8zOMQMV~{^Ai{m_TpuqNnpAHn!Pr&S?BwT1o!`?Fd9dd7ug$|Y?0U-YN+(<t z%eKI~zG0`Vw5I0!J8Nbp7sR`lPA|rdv)k`lKIAyz$_dw7sy4X`%14>Epz$M87~5Pa zuaP+m>Xk*r+g0E3c;{&<6&Jc?u^clcWf7|SOrc6_O^q||+lsE6tj2-_q)nXTSknVI zZg-$M@-`qgmq{gB!P2QdQh~8ST@x4}eOqo&(o*%kd=M6~Vc1gPUZ?BGo?|D&b4o5` zQc{12Ep21HNaNx#mU%u{IM7=Hj>$j6OInK`Y~n;Fu2w-0*NSm4@B^ctkmRB(eBr#8 zuHcc(J6S0y`~CF>m#M|@>iPVl2Hn}`R{4<cMH;e)q6h=$=Jx(xh)?suc;v<>jghA| zFQy3rB72=7M0F)(>ge8O2>@mRM|R>=I?D~3Ub#g#xKTn<f+4Uh*qyrIi=C@m05+Eh zcPhSDs#$8XM0;Lh0IotgpUqkID+V+lX2I)HMZLP~W=88~mR`+7K|jYpFF6}AS-xHV zC!!s6e&+0AVmmBXg9;;u0*e8m;uqT*W{lB)BW8>PDbJ%N{_-Vu;P%{epv{gsR1Z%S z{3R@rBv}=<e3&GbW`%Q`gq<w<Mv@N1$*(Ebnank6-QCP)^7la};ZAhr2VG29jn|VE zfKah5Qk}aI2dR_Q<6flo_$v>PM*D*+Bh74vP61Cb+Y>6R+Es=pWaP7Rz>V=>GVF0^ zmiUUz<<yMHX0oxDWHc2vV;1UL4@i#)8cgGfVf4SWlJ*z^HUVv5=X?rEF%5Jz;CBkj zcAqo29UuTuOCwMlXGnYLY0Ee`GYqxKl)-JejE2dHkf962Ost?^h{|w=*Z^?Q0o<xc z<EL653rrM-c$qV@r1ycyvp`Q%@5Cdt=76@3{J>2z`p-KPXSnGEoQLjF@I1+f7WXK8 z=*CnI(3q?QJhR)|AYYo*7P0O!OISTSsThKgI#m7a?OO^4cpQ3IB%EC_y$#de;OO@E zoR{iz!7g43&eKSd51M>y85h1I^2!o(m^<>mwViG!XS^zLGA|t9U;5V|!=T7+Lp*CM zxmH>7Vlxx~O4ZYY>?)9AieSR_0+!bnW0_+9)HiKH{|eYISrfTE@%N$r1LfT>!vB{Q zo7DZ%z&wIJ6pRrm=(!Ab*z0Y^)6~^<G_d;qFcJIAvpWJQqog8wYWf}T4(V1irX62V z6+zTAfHSw9TpsjnIaOYMX>4AMrhy_#ABrI@*JjbMYMF_!^RU`+*<Fye$aJ@kp`=s@ z(VcykBhrb@IyMAXjm>yrHs~!fSoj1NwQs#TFFl6YWah#lP9qZ7jw|yo;y3VT+77>e z4*W{{f3Ft@c8-nTD@aldyH71nDSIBff4%7`{Aj$GWUc?59czM&tFLL3F<5(oACie8 zT(!;S)RbpKj&rkTG3`%hSvPyW_M{~COcCzzzbPVE0e)*rD;W`*!B%|tSwc|ncfqVL z#JUmmTGYf6vC&Fml9{mqpG3Q+Vu-&h341k$y8sCLhR|srS$*AaYKH&JoqzRpp7wig z)S|~xD2N5~9Lt23T4WF_{y~7Y*zxpJ?lXjrH%0KD^KYVjs1o;x<K~&SI=9zeaqVXb z4nR}-aNiem7lc{xJWF2kQ_?87WVi?c4?Y<eN|#HZ^FOb$!fIidIR{JiYuCKx<>l)z zt}2Mz+5xHJK~_j49PPb)C)f5B_CunN@P5}Lt!{==c`7zhSc6$SN~n1W$q6|YK~8EE zd%ronD>mh*b#o*#%j4YpsGoqVq-m#7DJ{m@Raf6o{;e$RIrM0-Mn%C5o7NX2<SjGU zMn}~5elh`SWs~o1R{%JX&5vkjvhEm9)G<^~$|Lt{Tr*LZH_w+Y5~B)a>lWXV{`rGZ zA8M}mcG|!!TrxFP$Sh`|!As?>NR5Qs84})ibTHstse<d%R=RRwHE8rnM9mMLYY&`A zC>PF`89^*G9W@M9O}Ey<RmyZdz|%Gtf<r*+!{`q>#-8`V!rv$gvlQ1deUoT$MghNr z{VLbNIvsf96?F9^_DY}(_C0Utr^}wC(MGKCrBqLuaOk^{P$CLN++w=E;Cqs3zkSNI z-U{C#qk+4Z0YRwwRvrez?yz900Ve|&ImAcvnyiV3kH%UBw%#<R$jyuJc<T39GrDAZ zjoUrtmYMTx@UeDX$?$gL=;eds*s0=bDL7#w+G2uHX(KC?t^i9lpUv5_{_J>JflFiJ z$X(&l(9LqAmbr0be2{Xwg)YY>(FWbP$?M=erBZ&afr`cpb=WhpT>Jg3H5NHJ-|5l{ z5)x7^j*i1OoT?i#qu)6mh~u=s?>8TC-bBZL6F;-^lo+Dv{0;K|Jh^T6uHXLcF?;s~ zueyc@z_lJ8sZ@FK4GM7!SjqJ4Kzq){N&!Z6u7nSDT71fn@qZxwdc=+sUheYRRTyv( zA|H&j?mfer9h{i0#U>HkOwB{s1$f}V;XXM#2n0eC0^1wll7JhVn({ZDd=)uH%orBO zh@f?0Ee1M>cP}!R!)F$nXu4uVw^jWYVQX8s#6q~l+4`fS^DXRGT;2Xhh%?-hzs_h_ ze1*i%*r7D&{y*&8hwpf*|3pgu{x08)pJ?}nLAYsjnLKT#=f(`X1s^p`m<C=CD5klV zRCvG=gIK?w*c+kXC#)+^_z?WaVqBBJ({};R^PVQj>l1bA%fJ)#QSNl~+@%^DBh93= zz{Ai6-_4&{^u;ExP2^n*Sd&TQZS{cB(($V7UOlo@w`St(l&(EDjFZzVlh>`7Q)`p~ z95^Mkt#N%}!P7V+hniG@4<yK!Nd3zL*i#FTNrUkU5#)VCuF0Gv-Qy#HMx!4t<(1{w zBRS&q*7X%V&rAmBH`3%I<fVx9`l$*S`P2|wzL@oyYkV7U=Rn`F#zJ&Cyl*91;;AKP zc$RcPUt;pd1Rd0K0j>eaE-n=8xbl6jD&JnG&S%F}7@B&4a1{oeZ23B0CTmw1(V-13 z%5Q-sbIWr2K`9koHq!Iw>$%Zt%Aq2wqRwSZV-TVZ9SFv0AZaK`Tg1&1hPH7E3y-|G z@CF!*ARmLuBDRk;bX6U_=exb_fvs?Ap7{fKpwQDD#4)&W)fM15)6*GBGt4QpCOXFO zT<&OnEWI%Qxj`!#WcR!IwcLYD-}>!YM-k+3CY)o1Gg~7s2D$JOUgy+XP8^Lo|317x zQ{C515lr$%^})RttH<jc9G|{e4VCy|GX1Y_SJKC<au!}<-VD7dF~p3>C;;MX({1wl z)##%M!<V+7cE`WcF?>gHpH{Gl-RyjoN0~R0BN;J(z4tQ2iS_;|Am;Pp0^wb|6<|+r zLNNN=Q!d6>tjKfsD#;DobW6=%J_3P>gtj!~eFHinf$UK#-_WLZek5U!f7^9OZn9%# zEwiISqH%=_wq&my|IH5nmPVyNzcMt;n6mMxi+K0Ty(Hq?Y6nMu)Oe%e=h%$$!eU06 zAOLtRsti~9@dgedrE=<<Cqv)Zm>$yCDKkd-pm(STgpnCIhV$~reDznQuM8}p)T?;Z zyb|0cMob2|GHEAqFy(-XR|16GW{Hl8$yMNN<z0@%doBE@topxBQC`bygEZGMT3>>4 z6SryLvI3s<g@RdmnaZIIq49Y4%+=jEZv-&jm$+l|-T`bH-pa5rJf?kb?`VvvEBgzV zyjc3JZbF?prL3~YWud(h$O`wdiG|GkEk^cfQd#*c{|ISj^ZDYiUcoRPa+^=_vC`@; zci%1xpXP<hGsjz%TD9i8`t)fYyC83#ISq?!2W5D!uh8s9oYY7>oVW{G-BOt54oZx> z2h?}DxNOPF(yaM7k;WK^JMwbM-Ae3`O)^PyHhB76=xUe7)PVlreq;bPD&4Kx!R4$j znWyQ{=hF9xoM^#Qpw4cgUz`?MyOkCZ(E@R~8K?}ozvb0=UhWZJ1{IhXH)dgl=)5`Z z4bxj<c^oAikcWW&Xb?<(xuweyfT*t(NJ&C2XqV5ek|T9VcUjzoGv_vL(=PhTcYr64 z>MYPnEn?ufcs=X7gj4xiEpJ?y^Rmi*>WLx@U7n81Adil7)3+4wxTvZO0JM#w1>HX) z#Cf-z;QD9Ot!;U;z_z4wthXCK)lP4>&8g)#)u$N7>4!E@I(wcvqtsN$o4Sn=y1h*a zaswucv`ZS7uFnv9WSjjTE?^jmZqXwfOtpib^c7}4beX~7UHT@GYtH)hQ{#)t7MXdo zjamvU89NUwbeegVS57-7RKVzC9B#HXC=_fHTzwqz_y%dN`jgf7pZb{}YKoD5tNpc0 z^0Hoon<!HyUJv|JF^^j{wjZzG{-=Q8?~fQ?JG^oDZj8rs!4F7fdd*`1P#;Vcp-kbC zh6sgQ=XL~&p0BQ)03-zbc7k2zH@TwI0i~P<{HWW$oJU`17doB5b4$bXiUULw>3j<1 z`X1mcux`~j|5eMTpyG<lNZVT=h+9;V$MIJ~pQ;Mp3y%NsMt%_|XwYSM-mq8pH*bpM zZ|{9f!xdI@a42K7=I~gE;cS6*7-6Zj5`XsN;|Cwj{=W0DE_%J{w`Sa*2ufDCerm3c z>o-x03gXM8ag)kcHIiC=hg6koY1p{YuD!K>-FurecscD6y-dha1aWrzfz`E<$yCQ6 z=NkPr0~Ru`<RYPbH{0c%JKHN6F~@lq;922aN{UfUS_c|gRe#SQA}U2bx$8W>_u^8B ze3P;ke7{3bbMT%@dbhQ#Mj+djp+x<h^{~<lGw4uBfQOYv!4*4d^Ak>o$o!l@1}sbB zm{T<m?1d=X+gGDpif$NN3qY(fyN_)X7ss6_G3BCs9ChOXFWigEmAd6<T-MbfYwVeG z&A!InbJz;_^P=;+hk%o0sn4hYeqa7afEXH&3@GKk`f*)636+#AolpifKRsY%p3HBz zxD|8J{Ca>kj(CM*pmdkJwx{`wK#Bm%BD9jQLZ7xKF;#3agTo#mZ|GSA4-a^}>IYAt zb15>!r}nXNHo|2^-gV~tS5bzxhjZ)#ZLu<Oe#VQk9x<i-j-x=2Mvu)W=?sOsJ(e?! z<E}UhOLCdM9n8~5K5hqI6NBI{y&9S^EQJ6#Vlpo}%3@C=A`gnBKU-nT;q~>Df#w<9 zNeC?h*?SU-g}iq5FwgEr!We&0clTn1Ru$ogJqh<8e-gQ`GVgx8x@BCrkXv*4?7ie4 z$nq~Y%HNIqIA(C~Oo7!XOtlVv)5b3|gNGV(>XpXl?=wrl7cGI1HuAVQSTg}(gAn-3 zNHk|=<N8>x3cn7$KE!E(1bqVqL6u4H)^CYQl#aS;e1Ze0VyuGf@2(AHX(>fDF8HCL zYefT`&{}0QXkqwX%fAZ+aLq?g{;s!<dizb1Gif+|lQw#hRm<`PQ8#m_wqmUIMRtw6 zJZpPqgb+1%nTMjm<|C0;$2hGsZQtEh?VioJ+M4<NF0!juRsUV`Dr--BU-=^$5fvu! zNuF4uXdy)!l9^259)TITsym-bbzkz{A<MY$c8k|L|Hw^(V4XOL{!o)~z!Lsx$lk8c zRjA3G?9z}|YM4Eh3qo1y!Oc}ChOfQ$L2G>!6_&q+o7whS&azbBf$~KWU6lVSw@0VP zOa#HOxCX3la1OHIG?8`i+N9MAlh7pyDI7Phu(a7#H-I?Rh)S%7dz3s<u9lG1b6KD7 z$ca#4D;IFiGT!j+W=i{v66a4ql5Xt`9M^u*RM_$tvhHs6Jr;cH>9_<P57<lW4_lVl zoXvH-&laubk;!5W;{<>CVn0PGM&~iVKM4giQDzeGn~2EWq4kI1k@quYd%wwY*%X?D zy5SGFcsei9j_sSMr`SMMCdSjGCl_7!ScBUxq2FBZg_>6PKD{iRB*fNgMQTGx??$+? z4e7B~i}922IAUPQR0k3A>>Q%F8C;WfsUzqG5&Mb3>Y=nYZM~%Q;Ld2#>hY~H_R><T z?le+}5ngYddoAF>{AjU~!2lFVo)kjO<S<iS=eL00^p$_e;NzsgfQ2C^oF9okuv)z% zyLE8<F2;Ji@GSJNvQ1m5H<O`S1_?4>U%g-$2zsd-4f=x-wy8c)VqZ2o7kn`OBV*wz zuEPH5&H1yU1z%i03+^_<M{@QWgS<p=X87};_&de!?NU>cbY81!Qw)P90#`?!Dvody zk4wH!4)7tZ&>W7f`q_X}|G}!>my#U^ohPx;S1in&{VUiqZJ&37E9?VoS|#oAFal7F z=y%E^2dz5n`)lWI&R88m-qO#(S|-dvuVk*3{lCQn9e26}%~?1K?!-(5CJgii18qZt zcna=S3^u6{e;!w+k>Xr1b~iV&5Yb>8!_ji>H$!iqF(t+aV*7_#C^F(@yHs^#b%0*m zpEqkK<2O!MSBg{yA58a+=?O#vSk-Cd^uu&rZR=kc5<bkWJD@OBVDWyHxK5oL`x4<) zRp2Fr;c$MMZo;d<!C@qc_u=(ZsLQL0C6NXP9hZf~WclP=pW&`k2LE|(+3|@OiQ<Ze zA1~#V6gV6v8&OMg98cf32QH*~Pi5Kkv#~<T=&37O#APWmUc=gOR_WO+3z4hSu|Ydu zx^LA;-&U(N>pAp9wSSX7N{V9C3g^L+ME~q}>7_M*jM$5O^v+1RBiZLtm5_vsUew#Z zLDFpd9IaQJA8$)t-oniR#V3rDy(gkc$9M2n_?Jq)XlFBuAkPLn;S@0MArFC%kIya_ z?N^)^*rf^?81!kGjz*G&>OtCUVhOj(c8|0*9kUy#>9P$`RW?~tEoal|{mWq9FWrv{ zO($Cv$UUa`biOn7isj!Tq^w<|c7#Jv?D`L^tZm@54y05h_}7y#lPJOgt*Xe%Et%l6 zgiL@xXS3&S5Om`KB#4!2fv~<3uJh7V)0aKLlPQl-D5<|5H6WV}?yANxBo`{L#kaKV z5Hkw^=1qlc>NQlci!Jp0_1g@JKRaa5o}4teNp>ko)9K6car9YRn^WlklfP)-b#;FJ zZlMDQb(${xNQ{yGYyG<8emDc8*Ru+P#al5^8h_!-ugvd;{VE`RB}En%0-f35+8g^T z@bRCO{@=a(cTV(`=Iw-Yt68@Xge{(T+)K5~HEpth^17wC?y}i(fkj))QwYop3Dy8` z5mWeg+%dCw0oO6qF4uF0&wN*-r@#8q(yWpVo;{EPW-px&Cm>Mv=cfY+CiWyYN*IBy zlkFKDiHlVYUYsnl1MEtZ(f!Ybys{vFb@89ORQAK*H^Qn)uh!vJ5zW2%2;N<OiqV{H zLqd&PGl2@oJ%V;>68dH4=-uprL4Wyl&qM~P2Pc^O>V}(^NVSFe%<lc--1Wd!h2w6! zwYNN<T}>51Q_~Asd~1E|+D%$zz*u!oq<LC{D|1{|{@oYZM}32@xB)r_r*k<|j=><B zk*|P~kMe>vU%=x2x599-OydR55x{0(&B*6pO3vVF{V)C17}!U84uLyQafxFxe2~Re z+mrFig{ujx@@`fU%tGA821=mbXuwpK=L)OoR04HHqlgNh^OfNM_h3gSk=UeP5s*72 zY4KSbpv8&CN0)Mz|I{Yv0CS}WKOy2shvbCrG^M|xbrC$?fl1Nw`!Q#VZVLMM36ZaF zf!ow$pc_6Oy+)oT_`5BUv_3y1k5^YL5T}JbCFCZ4k}YSO4oCfw;L%d9)@NC?SoSFY zBe|<@{zT*D_4AxPhQ2r2&eKZQHzPS$l8xOz3!coo&FV2_E9c5a6?Dc>OWwdbGw;qp zODlzUw@>hhzSzIsm2lKOPINpEd!#(zHhQhI$emipk#;4#^mG!qu<?$E=ZZXwRzb(a z6Uxg$Byq7<-5WU~9_iG4MR|FeOEeM5)%MJ}b;EkG&1UIAP!hnA*clphw*_yiHQ*wD z8cb(CtWOi86=Vc)%>+n<-g|6_7B{L>YFN8QrW%m$=Ymhv3J-BGG&9%}g8{KxMcQkn zZ@xKi{45hc;k4u|ka_!40uM(`U(`TOh;TOJs#^Q8#yS!Pb`v^Z3D&X3#8US1xCvrS z`S=1p+WMj*-erEAA+y?l#CEYn2uy4O(+HhVL+$%@jmaiYEx?_lANMW-KcLkZO}$m$ z=zY5VyM#oQ4$l!}R~8fBo$>d&HFd_rP44}(X#dEyx$o5sEvX=>v$jp#f%mBd%4Rxa zD2EA3p#z8kl{RLv{cwmFlFV`-Cx>_dg`^g#-6Gi!MWhO))_PA+!in1Osb6*h(-AiV zgPrPotCb|>iV-r`+8Oz-$W=p7&0H-9uE66d9W_5c2J*uTG501k>S$DoXsR$XfUId{ z2fjYw%v4;~ta#je5qz--ceeS7?p+f5A@cu6xaxc{8)nDVyn3`o*_*XLYnf_GPwpp1 z9&_XT2i*8}w4yh<<hadVm>X`Ou9RvA>(#eM;U_Q;C-p}b^Cm1VEJ=c%3b+Fk-d79F zjEILrnH0@BeiA^}x#IJT)tYtNk+G8aL(@#oacF!-n!|Dj;(?;zTbFw444jHl5V)Vf zEYsbX;P>V;=MnkV`|<VwqIroz-~psu_yE`JqM3n19q!Y8g%d>&Wg{hToL5(%M5<;} zQYvTA0!k`6+BGBn{k5zWn#hxW`Dp~zeURPRrm+~=0C8fbf$dI1Y=E$*t(-Nn;rCmS zfgOIBj|GA%)O>PscWKKtSHK<bk7<Y<=G8vl*N50j*<`qo8G(j8mM`3f3s+PGKi{Vi z|9HF;aC>VEVY&!a5?L&<GO&l0Q3zPbN2n}UJ)BSF==dpB!s6`mR&Od$T+DZ-e|kF< zYKWBjuC8gB-9WhlG@#{rnt7q|U`;M30RQAs0Rk7z(LxIzjdm8>oEWpya|BVR!G<N) zFI2d`5<y{lQzKGyU0-iZ)!(OinP)kWqy@P=+MeXj3-G|hy&zf*^qk8A9k2GH<{-KL z4ej8({7{hsBt?P&zf)DF9S~T6;<kW)HxH8dG3EVydN&`S4=Ic1W)FGpHoqVwlO!SF z1Kc9p52%>+1P)h3sGO7$P@MBHFx7tp-YcL<k^rX=UYRaVIIKr#yx3gGEks-qm0x;> z&urCYgu)ReY7(H6klitM(=+pM<ok!XDO{@f*Vlg)Sg~CjFd^J3aXb2RO!)1}H3i?q zjVSx)=J?P;#=H+(dR`UIR5!hbKjW+qenah1HVpf0b@uh$Sr^g9l1{eIFbtu>L8ntb zXNmFt87mpoi8iV01mjFEj+a5cz|y(AxiuCFxg_OQKg{Z+y-2zG*M_3egJtfTIX#<9 zIj*(~;emcG^(_IwxSRFJv_?Q`MQirU;DECY8}wGQ_j%0oNV`rnN6D9lSc(v9hZ)Bo zZ5Kxb*rRxr^>Ep2YbILXz_-!P)gzp7FV@0;C$3Z-uJPi;%L)bi**{#spC^_r$#o%D zfpQK*1-2H@hT)PE(kkvTPeMEOxGG`!jZbnx4nZPXcZl|)7R&AB_FXRv^-PfReE=sb zZ3VG6${QC<Gb}y%eNS(EVw1va$a`PpS19mR&}yA`F-`wKdk5DOn!oY*%5ypKognFi zqQiKa&;>(-<fo!-zvNDtwD|EsE3$`jZwC9UIBX0ha1{<#y2=a!0`=_H15sEKdov>$ z$^f)VVv7%sgzSX)?}}eO3o&U6s6+YTEDOZwi`*pnS*4CW{B3@|hy!){)4R7H+2ITa z`gsO)CT3|USeKEdH?58v*a`}J!T)sHZ<b5J-aPP_;EAA*6VPmSg;lp3ZSq+~#?KKB zB%ZHyz{SoavUCeyK9UX6vOjW0u|`U`pQ;cI>F4W22%JuvHpL7w-kL~q<Ecm0$Xs2v z(u{-NRX??wA}KR=%FalGvhg@>Pr0|))Qp&zV_FllvKUV^%T^NSFZ|#x1`tPQ-@(xI zo}?%T4yAGZ+Ix1|>iYH~Z>p9Ypi#XIug{BhM@v1OiOZ}-8XI^`g|r<V9rG<(mIZa4 zGp;A$Fi_sB$=?g{#xv8iNaVHDJGX*gB@jFj{U5U9AIc7w=x&u+XJf}`oFz@jD=Sp7 zgDc+s%yyglVs_&UiHkbFN;ug+I0Uc119`y9>P38;P(uAq3xv_9omPj>BKEmjY~jh? zF7anNlSAAN)eJpMdfFqb!^JftLO7oofUB(kt+TPUsW8M27J^;+_SCOy^x^XQLs_0f za5~Y3L~J_fXS2r}wufuc^%-pc&m6wrGw@V-u7L@^qpnc3{FNa#8iaT$D#9PLZ@RPx z6@nYu`%pjTx}S49#q!E~M1z<xHKtDuVkJVcb{8xMS}v7oYQU^K>s%cZ1N#bULdpK- zAO;P6ydp>HLaF$6hBNOf_MB%eQC3@se74!UyXJF0mbzT^T3KI2G%Nv_rP2<O`tk+P zds#UL#Xr2c$-574%3JOWe|TO+ViN)EyG*W>;Wx>jV~!lLcAH(EpEpWctCDs+cIg%} zXNQxWkr0X4ex#~*9;hvc6<aXD0a^lsX@|a3IbtJCz@18)1^aFk#FLqY!&)0asgTNb z+HseBtKFzE6mE#(?<tGV$+L#+R5e<M8o$TG<!t-xnJm<v7Jhkg+GASvR2SDuIXleV z0Nu_O8Mc5enyli84?X-TzX2{tYow`9&2-%+2r;e&+2tvp(AS*nNx3T$LU`%`$t?-z ziyJc5v)@2HlVuoUn@SbK3JkOk%EO@0ME1ezIriY^ApoA9@+DsY)ugGEWO!XXOr{qI zaG*9&Hl~FwjJ?dYI*eVBE>?$g=Pe0CbyGlx-!i@oy(|JPQMU99HPOM{Wvb*{Acr*$ zK?mz(v%AjLV?)rToX%H&FU<!=*CA~gvN|bYzv|HbBpX7m7yaoT#r<jY8(u^+njDdr z&lK!8OU-F0r{21^sbFu4eOiXYmT8yGCyTPY??#^tMCJ^l5RnQn?DM6MU6WyJrvro8 zwy1+PM+sj|C)slGqMgx#8U(ds&}(PODDk&kG0;tVw^^QU#s+)7-4cr*zpDB_ytqF5 ze`X5eBA>PulOf;aTNyxAb4YlJ-=~k-pFX`G|Kva+D$uo@5%~DIJ-LD@r|ZTuunOXq zD~!w{K27VKKxy`@_^RSv+#;u^ZdTz};nTQ~ydRou$0j7q1%TFaAE&EbNA*R^bJjHr zwAN1@-crlxSw?{>L!)oc1yTqf@Z6KUM)OHKp0Ot(zRCM~ccu1@^<>|alE=Qgx{{Z$ z(8t5~hNbl`D?T1emnZ9N;HIP=LlAuv0&U>_ZEquOG|{KUekv_0NlE?DBiuQhtcTHy zeIy^x&v@V<0zj|F#m-zSCXkXfRy*EWx5XtQp~7ik4T`SPN+&Zrp(AoDY*ydBQn_AA zymrlhlkFg60pEyl(~zlGQYrB0+|TT!5T>(7%DHs)gTw!q?`f-orqlVcTTROO#3W@4 za4^7nB-_T<kC9)lYQY-9mn>L6;CEZEx&5R#wquUu=HTG&Xo!(8<Zjc_Yl8=8H;gag zbZxMnRk`8|Spp051+x>W4@*}&5!x#=a(ds?RvOBCjB1>s=2M{>x&WSmy9yD2`cyc* z(M7imB!rW^bbp_6qhW5h4%K8;n#9L{aXga^z$hray|*#4R*wz(D-K325Epu+!M#`^ z<`cSLTvY)zPH@21Ftul@=C%%ARZ7>tM^Rb0heoace%2i;e?up)`3OwttK7c-hc@}M zMsb_w??IcIB;Wf7t1l~sShzWs-2!WngPJ!m_pNcgd=}Dl=+?b)hs}Ank?<l;&pDGY zRdr26Zfdwk_RGnI`Xvfrb4JEOUE_nVMupRml?vnf9-x5|KktyOwXe(QxD1>9IO*oU zi-Ep;zWqe;@6Frx_Vu%7-4V7cB~Us~Y5<$wH^?T3<xM~Nx5;65uGZA{%Zf!3=bD=K zoc1%l@l`~!7}S}^elF+FsWe&gm$NQ@K_*_w@wnM+$jE@!X<Sdl35=kE4<{6b<(!k! zVS^p8BfA~Uk>1ZjUKT7HU)>McmOR_9!}~UU9k00UNMrk7<Pod$yma4VPj+QyB=&gb zOg59?;qI>HpXqO>+o8Joa3Uzq>*XE9kJ{|E>+D~$e9#mvB23OBXEiy*Tp0f`I>;Jf zdBN#e@2&x9aw2ZNW;sq9eDlWkAQC2M%KVc@erT#iKjjJB%Y0!+tSXesax;Oh1Hjl` z7C+lh)!p+v2^=Cit(9Z@w)cMClLwV;8krQYlR1rsLhZ@h)KFiwi-`otA(+;@+S<99 z6%~!bJv<(eMaZP@FqcZUc-{EpDKS_UG`&FOvJaw<<BU;N28+z)dT9tl9?wZ7bEsyk z*nVP+op?`IS2_`&erwhdX$@SZ+@LNYP&&WL(1qI!lZ>}mi4#WN6q-R*E;`ODLbTmp zEcq^-Em1*wvtb2!4PAb-Tiwp59BU3h_Hrq10o3s`K3LD1yEMAhKs<aq&M-|FkOlzZ zp9sHAp5Xu`AWgWKLF$OHJvrn2qV3`!o&i@ki^ETv6jT>9U4}94eSJf9{u&V~wXJTB zdH%V^&{s#IbF_YAkDfjIT`R%+7$>YOQ!3s}VgBdb^JMPkgMW>m`?bH~=E%(^)(xRM zk&GKkIA0tQ)cyFb$FyGI0Pb*}@T+X4?sy0oBX)*!G!9KAa=w2tfFc7Q!5E3iNUY#| zrJ7eiE>9|D2*^S*O@3#*M6~k>*+lJTAX33Li8?dohNLbTi3ZvMjBmqmO>6^axQ^(; zr{s8=PEj^$Pv1ZJ110}^E2%NY(nlQKT_WZa+LcYy7mgY_8J<ax0<3BUlhA*Z2NrC) zt0*k+L6{_7{(S47xAtP8)1%T6W#98CLoPxHkJO9c)CrU{TToy0{7S~rtbMn3TvyrJ z9J%OvmS<_aF_SNU2XSK8Bg9fp!c-C2d{#SMuXd>~n%T;J5q+uuQUR+kn9hN&FmJk% zS|*+7ntjBw9FaoEfA4`%U%AEi?lj@JVk1Kb7#wCm_u20zO%m_x6OR)M4rv4AG^Zr~ zkJ2w+-m@}-5><ZoZlJ?i5gz??g}82z5$q+A@m2Gt1y(W$*UyD>I3>hYu!(~kS^*Pe zZ~*Dn6i_TqWEKE#O)bD)D9rjNXlOnL`pUZoqDY3M)o?}1rc!cM65HJ4?77|IYGF|) zv$O_h`N1WPk~7Zpy8O;&k9|v!tE5%=rAb=wX~$TT1hBF9Pdj)cuEB2RGecT_AwNfY zD9onYN(acvlTxwoy&K`5vZeTLKzzQ+1&Itx{#C!lG7(T$js@K~4{=oZ6i$R`WIamO z9p=c(6=n}}>DKqbMBGS1XiKSFEW5Re6n;nh*EB1A+k?^OB0Nfb7473JMZkf9)NsJm zvB3hc9EzBCaC_T&cy2Jxxj)VF*kfaqqf1@w?N}CzL+5#A_#wlFSYk<8?e1KQyxg(M zq3eMo+w<oP!D0{qmATa9-C4RSHL91_e>uEHz3?7*2R*2~q^rBd?W;)qUx4rrVkK<& zi}9ash-29&JZ{M-{PtoyiX`}8lTZNW($afbuCPd|(bLAnZ(pV>drb@%^xekAaEfu| zLdv0+!4?D{16!fqh>j6a3F8>L6Zh_C@MCYcwK=C6_-N_wQ;6H?L5&;)zI|T9<~&wW zhk(LV#LrW9`{%5oLls;J|DmiuTt0pO--#~oGja2trpei7;;REzB}n{+uJ*2;3Q)jL zcRCgtN12~8ntMmkOC5jOXqSCX`<&~oNV>B8<ML3iTl@SuVhRt!^X}8(B_z!0<wRI< z0|>WA-TV%Z0_T@(EjIM;+KwXyfo?_mPSf|_sbksa91>pAv02|b!S9XDOR+SJ|MHj3 z^EWI4y}G*9pR~!qstz~OXE~wq2ku#fvDs`$4NjCP$&-kOibB%tksf!Fb{vNr8;Hhl zScFDu#4As&F=jtkR;C<kf;PD@(QA7sW453Q1Otb@IBLlT4&2e48tPQcx^VBf2|sHR zQ?_4%0P5EI^y?k%(%)7CJ3}@L)KEYURMaIj*bGiiLS95}>;s*9JPp>Tf@H5w=2gP) zlVw=VQmQqpu@0<^eiG#1&=caV5fdL2{{Jew%CM@IuMY@HC?JgrsC1VoAaMkgl<pP; z0YSQ3P(-A=TSOY9Q>DARySww9Lm2nH_kX>gIM1;6?3p#cl{2$eu8O3epMDK3RqAo` z+jP9FnSxIte0v=&<-OZVTs=H$jGngZf<d85`bs<R9`QD$xY_Fue=Pixl4&r|ZLjgd z3zvd!7_)qjWAN@Jq0+tnl)M#e?SU~DH`hj%T*2Lky_es6X4;1xb#M7agy<Bu2%(q| zuZOT5^kljxV9zMY`w&S)V-HBHh^-~`-e`*EcFZ`)U{^J7X$sEi%<hk-pE_y`W#i9K zF6Nr-r5NEd+kMtvM=&KuY_lo2aJ9adH8_obXPba{zE~qMby1{2vnti!XOxjB6Qb_z zwDdJQ>9XvF%<CP2yMEGMR8IbO4cc@I2KFk_&xC(xXhzq`gxlLA%_9oSe>Gs&GGhix zkvN2K1*R8l-w-nJ`zA_g&k=n%#5a&9dz(ls1oB|SDyQpXrdDKeUJfVG9!U1qxSZ}g zUG+qabK@Sku)g%{Afv!|xWpP9Wme8tS?Smq<rI~nwm+^S|3Yn>zx0M$X2H#t>-p&I z0pn)Y8Mq~u6+QIyOZvZEos=XZ*}sSdoavSrc3AxpF*t-WkwTH<suPNcjQobQl3F<) zhjKB-q(`sZTu9%+_tB=8;!WbmxLKoWs@%G=;DTwJITrOyU+0^8UuT~P$*MH|f|sTr zbDA_Ges+KXZC|A}Zi|H4w5T*UwrCq^|8cq)HZLt{Mm_TL`rKibFO?^5$GKMQ_G%o0 zPa8vNENv~<HKN7v9Ng|cRRm|tYg-db0)))2W8WNBe@Rb?J&KwrfFUJP>}tdw(t%wQ z$szb<a?VUZpWDH#-Pp_`2c@%1SMD>hzxRXz=aQgNEOqk~B(+#mQ-5Z4Xi_k5CZVxV z^g#DBYA}axH`_ugGqI3^=|c@lHo9(ojO@k;wwCQ%&jhr>U(1V?G~vX_EIjDHfn|d- zDWzGHJ$T5YJ@A$Lrfh}+>4`$FU9FDavv8Q__gi5d<qdO0ztA<yCmHBG?O@W+Us`%g zrmLH$f;BlUTil}3yem|rZH+Otp4gx(H|!-eK!pl&$qH){*$Ze*VfT9ZhTY1zLUg~< z!nW$TKYv+zO*aw9t;LmH`DBd{@`#YBtb?9<>^w%<#pV~glfoJ03ExY-ytw!Az%gYx zec8OIHkz*OEnV5w10iB2riJb<jBq@|zOL<54&kKtfx+pjvBL+enyOhegGFP(*L!jo zYNkFsvslRh*)a5n-m*L!DgL~zBpD%QiregK=(rl>0L|T1FjL*2qEP%<mN+SMgyrS~ z1Egd_nM{o)p{+4jG=qmsHLM^%Qdg1Nrh$KXUx`+V&*v!wPFq6h31bse(}r+2jxg>W z9%PBuPYB!lRl}dQ&^h4sXq+xXeZspq?`9os?k->Z%N4vM3a8i$zH+J<fh&VlY=3i^ z;}(_M8MF=N+AfF(xfDgCjT!}x${(oql)a8CzsbK_syiV2MZJy43|u81aHt?i2d;9z zl%gU~n#Idy{x?(C)wElho52Q<8FKkd^F#fKoEsYphGofXFZ_*{t!|i9UeB8m2A2%) zFJ76Sb~{<I-!F^W?~so4kJKD!dB*RR8D^r;2d)uLCq<euwNO)1*m@bBhhfSQR)5Qj zvL&VN;do_0zTlBzV7T?OiX=E8rlv~~{$xoOv(hh0W+&MNcHHNh*eflx*3wyhDWv2F zcDIWx^@+NPKj!OU4}>LUJ%8V`rc8N9hyqd=@RV9eZg!8<v?}$r!k0p;lx@cH)K8-m zZ)q4zHZ4xbN<pQ;AbernAVa!vNd`}{8L>{aNjt&lDTmaux`QW&3SXSGa^Tu|js~uf z$Kq!>UB8`i)n^QuVOeg{2)QXx%2xg=i}6PZ>KCS65@zjgm75=ZDf!z&>t4*~NQ!mw zR}<D1licD<8`KSm!KjN>NgY2#tt<+a*Cf+Z@H{&B#;sHR0so}>L@ZI}rEJ{+p&i6w zyGria%t*QdHCyV4__0`y9ud36f{rzp;fra}EbE$Xy#cqB)>xGVAJ+PXll_L4)Oofi zrUQ8@N^@=GgfEJ-Q^XRO7Yv8;RN%c)22Aam!t*mDUHXPsw%%;rTi{#p!-{_X(tq&Y z_w|BL?r)gY<+rcXIaAVem-pX6o$tT@JUWnEf@^2fwDEAl75gD&5b6AeAy<;^t6~o( z)1?&--Mqq4KNOZ6&alQCQz#OOlG*RvEsvDMpBXF<?$u{py1p$P`>aaFZJ^z7=<T&{ z^SM%4$-1kJyK5SI?*rpBtgE&rE3G*91KNUWAUq;*Mr?~CPlR%}%F=orRWitJsK}dx zcA`r)J+!V)4d5PfMXTB!KR!^er<S!cV;usgAh-Gh*ZTllB}LnZ<t+~1uvknVDpFkL zHT~qS=1BT&=sFXq!w`n#4^7^5kNd$5(*u>wZO0K@(;1rQH!bw9zwAlH%qZK=PPd_9 zePe%lYCktce@3&pP8sKzO^)+m5M|J?7o)XsCL*3=E!I6>`@l#TvQPV<hF$sa)AjE> zc}F9o$5=Ch$dnoBw;w(n$QFtqZw8e%Je6Xe7@~THBe$JfK-<MmM}`Rp_EdP85-7K= z{x-G<bA1^TR*-#i+-u#LYj0NbxU<0cp27U)dfW}}D6{EMy}8$K_I*_C^=p#TrNC|o z3O(ycUOza$DEPpu(2HKVOuRXqTbOfq_Iviz8Pvsa!}2@>&HQIo?NyuKCs$IATFdkf zG@lT@I0&6KZQ)K@+P~*db_H#=hK_TEhyB&0K)p^_b$aQTq8|w_of+%guBKT^H|=NC z(wRMP?!%ZX*9d9I9d~k5Z5{{#&m5es(}AXIk4GC0v>dW^<63<8j6L3*J=CL+Ybq&v zXY&pAUnY4)1m+T;h6FYGXu{QHxx#9?LZS3$DO)xwmB;~RH~N#08Xt)m6Mml<Tw`}p zl#r8?8)ErLohW`6C5nd9l+mA}xXP^K5~kbQ@Um*Efj)I4$#~tE$xGy2c{=RRX(l=H zDn&xgJ57m!)rvuylSq_U*4B{e9Q|Ct(Kt66wid^&ZG`5;))z{MCi9EQKf8xUXJ;^z zyJuL6sr%=AY$r-AuNz{Qx?+_~CcD@CGQ#v}L`cUSg{$6L#&pdX3H*r#?Vk#BShn7A z3!n+z`u2o`ph`@T@Np7ZRI->5yXUp-s~rR?O9~&%Ovwne7`uWE?GLVHM%MFVa$#~G z-%F$MU2obs5!POB+?|QSEzZf-_m6FC9wa1JF`Y1fwh*#KMR&z=<)tm*T5hmvyMqGT zoxGBzdhC==+Wa91xOw4bGZ!c~m5tqCzL&RN^O07`kC#E=xMX|+WQw2jKq6WSO#$0G z{*GZ(L^iv|^-WZx*bB1x#{-9jd5k0^2;MUc1iPh)K^rI?BzpI&stb2^<*t2xY@^o& zz}3^JTdcN-fo8eVDA{$bGroAM(2&`ki9F+-r>#cnegEmQ{b`gN4~{8|jy?|TdUK1Q zMTO>H%h#{P^yU^N8cgQ*^eT-~LCuaZG}d);T#q^;I3yE2ell!SgIBck)$NNl|08DO zkk59BiSk6nOuN^=7hyN(8<?VGPkl$@`gmU-H5$f#sH;ck(Kj4YHpXVA`=(*pwT2JN z3hmWsnn!1FWNVt*%a6xpC-6lY>b~v-fZItmdZr4Y9b`SN*ENqe#`E87Om(!B-3FKU z$z?NC#Jo8+3m9q;ea!Qot#EbMd}iCN@47j=MjqW+e#9l5rc$mLW-k`9O3DdMp1mLb z%ExlZK7#?1>_uZ3EtBa6ZD~F@3w`tct4~;tJc@pOrBh6n%@IQ8DbVB}D^m-GCAfK_ z2dGPvnRmW_?@sPF+}m&(4>ArJXkkC%D4Gje=)_No5F(Fac;C#mA!5JAHsf}v%m|ia z^2M}b-pjC%Zk>^p6y}$W124@P9z16NM}SY2Uuy-t{z+1TbCvVYI=aqBR8C)iXmH^1 zf%4e!j16e7b}U}0u$#Ayh=uZ~*=;5ZJZ<V-XgO%+I{A<}b7#bAkL5;hF*nhDGgjNf zF}H$@7;VeCRJ@hGnJ7_^_V<%-LtVW0=ibM)`$*(oahBY>88n+X0vqH0x>61?8}uA< zVS@f35pCdn`C9)=oBbAMzQk{%nEAv}oNK$gqhUwoxeX`d<WXi!V#0>s*v%H>`g0AF zIg^q4Crq;MFZItsGYg{7mxTbI@m^CDTeykEb6r!$o)(TR_(&;5SG2_?>nsGgTnxxr zQRAOs4v^o<$u~N$erPeNy-!2+t8yuIri(4<MEwgy(hy`LP*~xSpclz-%@8lq_;O7L zK^kv!TLN2nR-1eLT*3z_U4cV!y(;!Bc*1yhW`bM1c&J26$cxW!+Arun8s_NN)Axm? z)k^QL(w=G3h+aH?SMGmAXiGn%a@^gVKO5h;vzI^YZuilV?&Q1t=e*f84yk3VH=kYi zC@NgN8OMVA=k6VI)>M&H6=_g@4dg*$mq^OGH*_~Wl9ggxot;MO6Bq5;ReKBnjZRYh z;8yFo;M(hT#C)c5QrIcV<A$F5JNC1!UugzY%XY_wnJ_7F8<hm6>X;SX7Na;-LLPV& zPvi|~2}!m`WedonawQ~vNeK>=s~FyGaiom-z$pW+@a~Uxcuz9ZbGD!eU#)MTn-mVB z$A;#6RVvxt5wd5yhso>qW>_Y*BuAIKDQ;k;NQHa7)@8ql@j*@o*9p`3k<75$-fkUv zG*$72zTleR2_e7s6qT?qvNWYGhnPQe7*(;3|Af@y{VqXkn>h2=)9d9yh$-9_a>nBM z)IsJ8eM9S2>SPkHh63w`4@ZhOkGwl{hu(T(`8dj5+u6tO&G+Vd);XJ*QTN`ILT#m| z+;UH^cA{}_L!pa1F4#XuDHO?M#Qvak6=zS^a+*$iSYkESjVNi+Z&1kI48?Tk8yeTK zq+IFuM7hhI33dLn!yr#jXd$>*bl}TRlsu5TfSxC+EcrH#-#DhAU3sU+-=)}W&-R5Z zUaOtsV3vXD8;m&f@SZw;B5Nl%TQS{%SWk|b2o$PZYR7T2nt+UD>qGm#mG!2RGR$>C zEw8oO?`TXeb3)+8+IOx?`&6LhrfGPgeqYhklD%y=yTRQV*S;NS)~f1j3!yEBt{*hJ z^A&@Rvl9FS6?tyt-!yG#9$NG!Eq5zfhVEJuIvhS@TMIY*=CxqKHrdsq@`A;aQ)_Hl z`SaC`B}Od^butETj(wdQoO<^Ntaq<B&KbF-8Rlgvt_!VGg$DEpzKX)QU$$;zrLPS4 zYy|NpE<)Tz`a&gVA2s!bB@sr(zi3pb(9olHvH(Z8ut1uqh}`{(2e+yUlA<J0f@u@u z`ERMbu-{o=4k2nU&zN#+9GjL5H_+yp@QFRCIaVxXpM<+qe2ltmfw=I%Os98G#bRxW zgOtlX-=I&C2;>4W7#{0L=Poa=1ZuLG%jNO7I+@QakV75Rhlp%6FE*wM3O5!DUnl0u z%=oncY%41QIw&Fvb<<;-5gLm{n`tBXqh}m={Ikn_9d~h8BT1EVpQ{oqnAPJEeD5&h z$hF87KjJ*<ye`O}ec$V2fATxI$PWtB+OJqD`gl>jZ+<%<BTV4ra2CWFjB}NQrAt&V zsi^G`will3@r&;3VZ*E}E+pCzLn(jG9V{w`^8Q5!&k081uzXA2?gPn>^!zgo7%Hjn z&66dla=(kiax=R5op=%1RlCZ*9sSBylOtP{%+=fGLO@_kadV2zSJazZK`p|{i#5Lv z!S4BdTZ!5t%>1NI5~c#2B_%my)yYzdp7_?Nb;HNBS#Y+-bJh+|^CW7!L(#2qSR|@s zYJ0$Z;e+hm=YnvEBNwp%O%{aYthG4H7Q(y@`4WA1Xnu^jH*#u{&{{l2uNplMK`vQE zuN;SoY4nZnXxxL@ulByIBfk#`?UXt$x$h0j>s~`-_u<9Vlw!4S1Rl}*?G}hb#!7T< z^-k;O$0*st7V~ZKw!KF<?m-xh-KA1)t$eIGV$6NU%ipX|2v@aZt4!8NaVeH96!q^g z`BPB8Qva}It+%z$wma(5Srx3R{ji7AlUCMd>qZ4<*4G^#4+HHs*B0*hD@3Jg+&kl@ z&&g0mtVdi1MSPg^WmK~BS3a8^9*_9MKDTtMj0}BPRSL3Na2+pdvO&}Lwx`g~E4?Zc zblg~)<V1>>IiPn0M`Tc}=j)QBZyG+y>2w^czj?ATyY*Jg^&m+xl6!N$W5i^*g=>c+ zt?!E}y+RRR*ous1jTi3p5dIQbYqq(teN9MsVfzW0n_TM61tS?7dVj^wJ8CC}RaAl9 zmdo|eQo3o-)=c!sL5*Jb!1?Yi|H;itbpPwTXegA_L_1wQCk>!-D>lfBPXbbFaR;Dr zAAhnl8SJoI$cyYMo6aaWM1FPLNU_o|&qzl0)k5D8;)bWNm6fkGO`x8(FCg|bk7{^C z3oj!IN!li>C#Uck`<bf>i+D)wL{jfan|b*(Javr+#{ZY=?58@-Iid5Of*dkGk@<)I zOyf(%TR{VlyU;clG(OBk*_Y83#U3o%`e;pQz2%J79S&S8*$_=>n+a&)+L!m7cSEUO zx_ac%u5C|l*=mVdJ_X80GDUaqNrp*bbtg7o8KfuBK>r(&fEoazt3q`tK?}L}a*XJn zHbuud?i^S5fXo<5o+{eecNyPn)-g88C%KB+8GVD{8f1Q5RBaK+m~J(o`w)MP)weS2 z;XrawdJy{?Qc2~j6UqewtnkdWK2`nHvURyOdc$a&TF1fj1A~UT4#Reei%NIy;|-Xl z(<@=&fvo}DIgEJMgmtRwdlRS{iY9cdjET3j+;Qt^1MXd|#$qHl?r!T7L=(9|<|T}u zC?>)tK@@Eq$8|^R3m458VqeQpa6fCml++NPRqc1>{#-STd!JCtn%Nev3W=?K5-8GG z9LY3$LsFkTSr=~T7uo;iB%g<bK=u=}UZ?T1fiTN@rMyM@sL03~>U$^(p2n_GnlHP) zAZ*RHamL~CvZso-=2(i|U^L5ID(re4XScoBF<}LHL&le@)AsE?S4MfKh0>d`c#|%U zBs=J(y%1D<E)kn?%pG=Z96Q_0g#@J*7kzIe*;|OV5ux^E*6o#SxKV}!{0V{qrM8=X zJ!+=3NH}&^m>#B&jbANuCNOPW(^^roc-q8QRxX=P#;nkr?xjGdEV}Wm1*0ZXe|GfF zor9#3*L@>m%nsNfS+9E#jndafzVUSf3-9SjB*UAgF7HT&Et-`2yq2z6Exqkcn!2>V zlOwX<L`|8PRL$9>YO}=htW54rI3F~j)RN_3oJup^^af6EwS1PhXLz2tdt4^cTgRiU z{`CS*jmp@15yiA#HI=l71j^g9-L#XOi>vY9PO_S`goD~Za>i*>?Pd&c{1NS@+@3PX zNymq8SL*sfrmXZZOUC14ksaq`Rwt3Kr9klwEUbpnsO;qEfYwTFl=nAtoTgCn8C`B$ zK;ak!N8t)Ng6>IF>@#vgOBw!R-Z?=o;Z|&(?-ZNU7}ZnSp7gwJDPF}0TW>JiIzr=q z*PYhiwRZJn=~b`K*kS5MOWO9OHAf}a^wOhc$1ZUEkFRd+X{Be+kow72Yn=`~VNh*_ zRmHR^*OsMx{Smu`j-hQjOT2<<*#41OF1;Vc0osZj7Xrt{7O~N71cv)(`U$!}jRQ+- z?$zIfi%pMHj?<(r>=D%Qq%bi1(7He6eIfELg=qD9clvZ^!;l<MMITX(w=@~OtO#%8 zr%F(HSWhL2+a^P%7b2_aqN+@4Gq7g*(?YOBQ0lIw6$VKL;3a;EHw%wa%Jg|k9}*ip zLmx+Ll0vmTO_8y#m$CZN1?kBLUn#0;mly9N5?F{I@vsF5BTbnJq^XD?Ty=3Z(n%ur zB7gs!<#sGR!3zH4q{N8yC#2Dk_;If>d(Hig`^|ZGWeXLIZgirTzxMTbX^8ioIP#&U zzL*T~-AV=DI?T4YNhhJIR7PFPm7i<PyR_1glb`yyL+B}nWa<isMYHvc>}R<Sa_F(; z^wRwsZ0iAS&n6lhn_dVZ@Dv#iWE%)5SU-};;?_7>zu&gmTh8ye2F>}hJXGXUsO->% zZC1xN^Ts^=MtMWyc$y-f9pMV{(@)oMf{zyZ7Sy%LHUc@5SJOZd8k5%8@5JmlZd*i+ zwrH~icI3&ekKV{!w<Ahky|>#fwYO!uuA5Z5kY30h_x#)YBWV?Gy~;6;K^4)I?tI&* zalt*y*C)~-o9?Qm(NU5jAKG*z(@N3Qt0{NyMLIj$fiL+>`JbMTkbhISwoGyboG*SR z8-ADS<w#Lv$<p>fAb(|G>2i(*b^s?h`(@5y*jLcD%}Q-p%xs#XMF65GO0Nib@sro` zq8|n9Nch(*s}y~5BeZwbO2|cYhu&8$wcUO<YmQYHGHtuc$WMUVcEB@Wv0dYN^^;HG z6DEhJ^Hv^*K?h$Ki7D^IHiLRCnS5>)T-+4#E=UsR$A0HMA(6+DDu!|2_`ue({aq)~ zzd0zunhAHbzljS%DUP1ab5%7pZH2h1)m(>ma1GRS;wxoG_ir+qxh}bNnd6UzpX{M+ z-DL0FzVxCvtKU*5W9Fm`qGC0iXgh7)LyRV=sAyCB`1X{&vRxlY{a(KyZGY>5!>z43 z&Y0?rl-`!Pq{ycP{pS75E$;{Fdx|aR?gr5x^F~^I6P$W%d$c=!K-Bs*(q=TLuQZ77 z%5S_2Eg}XJ_tq)UDOzw#sV>?^V%X5c-_V6la*t+|UiR%O#tg|s1fh`E(>4`8+#BdU z-npK0)mP(PX}9PkJcLeer%YL%=yMiYG1&(kAlXN8Iy+E?C9lI3*W!vxQj!)*Yat=M zM_OmUN)?p&Ssce52F+)Z3)zTD_`vk$2jlM|eprq8m>Cf?&NXvZzViapbBwx^ANkU9 z{lA#__&<CX@Eo<uoVh-R(2MSH)K#^!xh-OxU@c5nVq!x;TC5ye1~^#7+PX4F^Mh|F zqIorbQU@{GNCuN1vsI<%cj=PD_a2qQB+hIu#R+09szIi80zwnPYE}|`#u(bjcfuRF z=*uTD%&U`Ue0Z6Cae{f=t`TV1(q$?op|&r*yEd0(P%}-Hup0e3LM4<Xs)ze&{B$fh zt!KR9`M|&M>f%s-wJ||^id-$1Ajk?Rdk|M*%ACBI9{wuPV(H=RWPv<WFtGikhizMi zw1sjhGUSFPv~bl#Y5Q~YhTLQY1FjHs%5d(E9^C_3pRRjjz9JNL3s<q<GQV?qtY3Pl zyGY@!C`e>veH5~ScC^3Un^M-46$Y+e9}wAx<m-3SJilsM+|{10C8ZRdN>FT&udpQ( ztVJGWl|7|Gk#cjQu|urOa?tb&X(h>W=)wNdP2S;~8X7#9UwaJtl+y;%RTS>n2e#CK z3=OtKqiIU_sOdj<X&y|cO+oX!XOyhQ743Ztw|*iSwp1d@ww1tX+^v`Ccq7t&I<(&o z?RZ8v7mc9!i<U*;dpNEE0}BH^#pZ+&iw~}yonaPk`<`G|;&CUU2LHQj!Z10fevh*w zI8eWKoR8f7Yw)8L2yfjVCJ(wfoHys;yO5n3IP(_!oljh)S9F*kwO?(wTQoD;$tEcs zbsJes%vVhuIo{>fnx2{48Fuh!X5TY=Z%N)+=QccT<x2y$E5g>7b`F~lmft1VC`1k{ zmkHCW7P*Gk#c3g&*fDcAMza`tWedmM>P(7WdP8?&c70vFdBrW7yrXrDmpAXRBm>B9 z-5b7As&(LOQ^nO-tmCk~B{v_5#{I=JR>MBU+>}Vob|KBCDvV{{&$QV?M>)ko9BMG$ zMn*u#_@RiPDl#(|?oFJ0I+d!BDYD};NBoyMxLP@qX@bTYBBqj)qo_&#RS(A%BHnck zlnnGme6wCGKFsLDE#{6#vn;DQ4&UHbHMVx#Q94{oMeA}Mik_o<<KJnBV5$?iL!YNK z!<;MxAN-oJxxU%hC|v*nE+Kc);bU@Vt0V$zVSq3jHm;~#gs5qyRG7|3CAM&P7tJDx zlLS~Z*BPDp<@uBj&bbfC>W0sKWEBx{z7KJDwQES4WAd8{bsG1_YQRfHtdPo-zU0cZ zRI^z;K1h}d&&zX{)NX%1!i(A+tY+hDHyt{&Sxf9i@`$HXhCw@ffHQySqn<yXE*ZP3 z<M*dbTzBd$*e_kVh5;DP_e;@2j0`a|{<<%JRKTSxheR0#M-dy%GDF2?StY93!uhX) z2=QqZ2a2?pdnJ-j-fKSNWO8nxFMmH|yg-{hQgK|*A=;!l8>I9qn|Y)|w*kjs7JA)5 z%-b=jajJy51&OfrtD~)+bh!o@{jhn9%3`IIC@FA{?lbsPD6u^4sqy4^!nxK<Y}Rn? z!J6z-CHd|&gJ(4sOS>U2Gi2%bo6wR1$lT}qZyIKEd~DiNHd#xgVdP3y6w68PGFdd{ zZ#zQcP!4j^&mBsqY4+z6y^_!IB091(zI!9<CVjifM(KQg3ca`0;q=q+dN-nyXfHzJ zd(4<w4K?7-&%^tM*Q{G=Yr!@qI3j~$lEYhHpC8C=@v4VWAKWE}w;3(FG6!hkLmT!W z+2VMPQn24H<EC}xm{}8xTwSo5UC?sj38C?>FLCXZnXGM0XkGqHq^W4`L_kaVye7z1 zV%<Yv`I#7v`>wvS3`pzH-EJY0RuWVr)y1_vU1;%kv7K{>MNlMjq#y}L_C`1)m;Ph* z<=0l{8tWQg#kOP2joQPTb@#55{RZB%efc(eC&WAArH~WCqbg!FPC94}-j)Vx?YFU^ zdj%$ICTmlb?pnB>%BE{9sfI0F-wt06cI_0b=#hY$)e~r*n#CqLpx^>WEE<6^yoa|p z_03khMQZ`HqVfHO+3#Xp>d<2rV3XG`+}%?P`?KA`U>Rm~?&t$^fs?X8E<Wz*Ud>SJ z>oS4!*EtRRdR<R8H|Xbmvor(Qq6Kc`>JBJeiJVJmDNlgUC-)=MGH*noY35!~&N6Pm zIU1Y6>?M^`u5Ns2Ci@hb<={a>(?eNR>%G9m(3$A?zMSdL1PX=wRmKyAbK>21%6`3C z3<Gyf9!3h9kX76f{;)B_62EwFu-#fia4uT!#hUEc2ASR4n-{SFTz_JDQ6AsU*M)Dy zKd@;*tf%hhdeGAB@wU`Pr<XS!JQAagtahM?s{e>B(k7MdFqmVfv>G4fd%zh!7v3a? zmC<=~l09moA&y6duRa!g!cUiON7=TyZ=}wXPSWodUlv`v`zvpq`tZ5tX0IY!9_|~r zm|Y3x@df!wiN1?I<q{-{;^49HT&ndW5ago^ZvWsLn=me^mv8Y2E9j9shhSAUo{D4T zf&&?TQ&<Oq<#63{>4B_ywQkaEhZxtJX08S4qQiEN$pSZ`fEG_jXEpmh^Tm_>Yglop znB>$?{Mr+et!CHUwoa}st7Wk++LV{s&(4w8Nbb<7@b$j`>IvoW7A{Uz6}xSPPLLQu zfw8Yq`N2xF#h@>LN2KLYtYPVt1;|T6nIOiz4R(~HE^jYM%~>&EmU^-6%Qw8F2!CK8 zsD1L4()Dly!F$Yy2Mc7gGOcMIhu&9f;oi9GXtUTsL!5??VN9N@KiVnkFql=-zMB*! z0S?+E->~n-Z&z;SUQsUEYJNEBabhjQxmxjkF~DDR{HbJEr%AwkIPew2xmPPLb>{Jg zzw@gc6n#YQ%`VD~&oMJh!bUnNPfye)f@e4DYb%{EN^o~RzhuZMic@#dU#!04N%Z!P zihaX_&QWka_<m5Xi(yO9)ImxnC`r)^l^m3UNP)vwsJx=1qCP`+298EA?d0I#Amu0& zTOyTT-w$g0Xq|&TV<o1nQ}x~jp$B*_xQD7o<=1)n-?^<g25=rMvRe13<O?!;rKA@K zsW=`5?&kqFcxS|szVvv$Vcor^COh1)C^Xu*TH(2a=ySp=T|26U)nnh$wB*#RpLt@~ zHj(T!(6Nh!IwF42EVf{AARtdj>@6Gl_`pEb`t`x60*Gw32pHZlQ4Zn0)E=hgx;S9Z zfMC{F0e_df_NKgg2;CXa$6QC0J`lDcW`MlAFc3R)VfKGJ4Fi809gBh6s_Z1Hcu!2q z;VyGuPU}L)^aK$~P<Bt0V`wBuO!ZuK7CZIEw%W}7rQL|Vjam^%$?kjVT9Nw0S%0zZ z`N5C3?<^NCiDudN&~4W{9)B0*Ueag6eAqy)LB_0VzLdN8CRkO<kxu2w%bpCd9bqKt zd2C{0tv0Qh+Ry}5^fnv0`8vn+IlJj9#dRXDY1O(jl$x5>>B&W(gCt}`r->?&;<8Y2 z9}H+ZLrSqK5`MKdPGgu~kpn0)`X^Pym{GJBWU3a-QMLS{4+5A1f+W!`g+%K|RaK}g z;4R)EJT{#g9N#<i_8ZwmKC$V4uHX7_3N=W{ug>J~;fYE~D2>$A23)8h+h_3rJkt6G z65V9^ird<|B$Vaxl02`qMP4?CFbux-An{$+C$lBpmgXn-O2`=(>%!HFsG)nx&953_ zm&Z;zca??V)oo!f!AaG1-H)VlAB>ZDb=-_3UlRwhB;E5}t{p{cCK*<@6u(9`oF~Ko zYM9ahl$z*x$LoEU`B}S&e(EFKu@u>yF5>ZBY+U6hnl;>yrXyP#6P_@~R_jlj8TEZM zN3rg0y|W*;(ITTAnF5q5$C^7h2Z_VnX8@{3bX?jQBv-Xw!@hCSDZe%DK~G^iR06_9 zNs&Sz8iQs#+`Krk-jJc8y)FTG|C3q^m)Qt`C1NlrQmc>J#1{=~&pZ91nt43)J2gT1 zoj~zcb$AU;jondamtAm~55<(xJ4cj&9brUJ&seEe@yXB^L8+pZyyB{(o#C`bl97*d zbL||>jmwQa5=p2_b6^jC7MilW#miBY!10^Ah!6VowvjM6Nx<O$zR5y+JxgT>+(9=W zyW?%U_{<z6lb2MKG|9Ce*wP9jVmxGM=o!zd@nU*F)SAfeJ$wkQ6hL4(lnkx3bc@T% zhw#3-57Wx3&T!fqv~&SKp#waoh*64rx^h|jdhW;<l@y=(OP8-@no(r*#u_NG7f7Ks z7(@N7dpo){_X*zM^PlkU8!=OUc{!6F_jE&+<kP-poSvga%fS|YW3<CM61!QgIsxuP z=FzQ>{NBs+?;GfXTD)y#uiaq%Ft8=3Qn+_)SCxpnBIxq~6SqmT93*utlFJzGV#)Ad z%J(Xi4W9^$49zJ25&&;sM=D1l;g+sFA|J==#LtiS?mX<GPTPtoWZ?MK06vSD?}z1l zeu&Nq5(;ys$|}lmd&8eYHh4F4M7bh|ZI-TSlWCDv^)w+EO-Isa6fFwvPj+~RhW08% zwd#;Dhv7bho_vn0d31$2{k!T)=E@oa+)r}=5{VdtdGWDhoZ1K3RqQ7=rB%JD!W3dU z>%y<l@grPYzsfXACzDZ0IMlCU*C`vO*UDKJ2?QgTZ_hhzW;vBh2Yqf=_pFF|ED6~Q z5o>_)^<(dKVI!2{L1x0O7Br;`z3qmK`bbDzf#3xs(<;^s*&|p*vna<Gsb+m6Oc|1N z51;le`PEn#4Yb(%#!KdR#Wdfp&keTQ$$Z|xCzi2T3Re$fb9rH;LEv7ZsUbH+Ll=3g zQ6aA>0yfB=-UoPh(3_v3f}Zr8TX3g$rsq8}-W{xzsYN&rBj|(B)L?2(J~LwrO7}KL ze5l=XG9y*{CYjDSnSo3xHgIXWQ#UE%E<b^3Dm3H3b22Bcokgo>+t>5%+~<kGfdf}C z$F%)2tZ}(PUdS?s#-6sw{GmtFM0XcQ;>!)b85WE+0`#tJ&~wH&!fR}#1372s3*A}{ z2)(!0D5V)1>KYLi_VxP~=3E}E%jJ3D=0Zq#M)-s`L2?WG2A0jD`;~yu5IkL?gY2l# zTL#Bpt2Mm|N$E;P?^?8x;u>$DdixHh8Lz1chjtAXS<K)49JIqxkk8}~lM)o((zFiL z%NNxXyZ0L;Z3r`JwW?Ozq{qF)Xuj4ZA$5M*Jn7cALIoE!(@UMhkq#`7lC)EO>FoEf zQV9Dz@V4DB#oy?Cuo9!coFQ<K`59L?)cOzrbpjL$%JSx}Y9#3r7>HM$!1(0<prQKl zTb*;$a!WKu^@K@v<qN|dC~~&cV3_|JOouv6AjkckpFjgP*M;4gDRy_$S8e*h)Z8J) z$u>|9KTLoP%Q&5c(T}4dq}?xJld623iC*ffCsRRNN}&Ij`vGKbQkkQ7<*!n!)heU0 zVlxI$il!HijU}_oCRAI=n~22e)iYUr)@hcEM8aAT?R+)${9DzRaaaR^^n3o_@JDGB zNOQWq?$bQI7f%xU1gV`E)Jruox`Geua-iT8jQ4f#dd~+;sYj&KMp7K!a!rq=mKZrm zI**Gzl#Q$oJ(!$Fuh)2U+9a?}CHU{oO2pTRz?eVOh^G;9?U09WoahrdW?4~W-95Q% zys_-2-7c?EV@Os4y?h*+5$-R>@rJ;BS3oapFrsIR^`N-iiAiUxKJbq5y%vE$kRSj# z)C*|N;t9g}uH5j{f-JF?VUs}@Z*e^W(p1?+TeY-sOF<TITxNxKky;k-_<pjil@zu( zHN-_R*fQ=b-{rxMq9zuk5#6c60fV81cqu8C;pzpc&lJA%XE>{0?w|b-D4Qs^c`i5~ zM7#EH-+qHZ=jLB19nt;m>(x4iy%H=oJp6314__7N(?8Z;8KQxTQBREEF_m@KtN6Le zszNI9TPiwtIy5oU>J77Q*9SZIWYWgj8(hY1#Yc9zN-Wz?>R^pa`@Uwmt;&{gCKiY5 z<YPSdaS8a2PBj`FT1^-E^x^aL{-%KG&vvR)-mrc`jNH0&*P0nwxyv6VAOyp@6o&Y> zM<h?8XWdz<ADB3+N44z++5C{T>-~800gq$qRebi&`vS~st8W=KD?!P&PlPtBsy3hs z#9YzKbR6R-l7aiZV8)$}uq5K$C-$!R=fUN>*oa5hxZ8t1U4ccE#;IWbNr=-8A}HnJ z)L^b(grYBq22hNC1osXdPJ+T`Ss<y~E2v1pPAW*dl9}ANJ<MMcHI}ufe@yz@RDdW* z$MUssRP;S|7FL4>W%X3-bGhtS(|XO}wu<k9QYmGW!`Q-;Wf_+~*$zIscU#+uwceB@ zGTbVvjPZ!fLM7*ACCi*#N=Juipgrd0S#7UrEHU>FuI&yIpVtF|?|*Kxk(i6tkQlq` z#}t!XAMAlQ<M0ujN2kL7;7ZJ@m8cPMSH2d1?5vjFjYNp-E1aQ|(eLYTA6B;l&r?tp z|C9gAILE`eV4vv6WUG&^n5S*O@RE91XdNt+f5|eFr705<6N_@&IXiacE8?^_)hU!( zKf%vWI^x|3#QP=HnZ#WuhQFF(Kd+OW2UbrXxE+cigUc_+SjjA4AvQ}rV8brK%r6ym zBm8c-6xGWrDRbc$nB5$7DoIrd3phod%Ovbl(ILl&h%ICLlao2URf55D)RGzEJ@-lh z?Bo*E9tV@DHPVR|i>nMyDx1spvn}?zYIfZ*K1n*LLiMr7bjut|zoX$4Uo6_DJ84$L zO8G(oLnv87DA5_CtUf<%8n;Pm<8VVEimo^3dqhGnUA-h*s(|3pj@GLP{6<8?aS@-I zxnU_>YIL1NxOYTwo=-<N#L8m8HtL)FTCowaXrY}EYx0wqTY7~LP^o*;B|(-5`U8BK ztmsiRI=#Lk7cC8~DjRv=ZN>>Z@yoIPxD)CeQ!(-)_%-#lU80Zw&Y1rnj}QVB)&P(E z_qt-l6JA*4WCRUfPdS2!{7t@abu;^U2|sjx^3e-}*#C)dVT2FUdoMu_o?C$&LPX&X zaW|IO-b6;&d}e1m!eeJ&!(*qiex5iLvK!www#J{#%jq`n?9RLSXgR$oH{Mf6^r^hm zP{LxCmj0EYhv`HwiAF;G%s+pytY-M?+WkSomnJcCIC6cb!el>j^vbr}8dD(chP0D^ z{fjES6h~a_g`tEGl70#G7@85UP01}KJ{YCoO?Qh*$ST+9&7z*}HO=QhbYn8xH`j%P z<_c$`G3h}@lg8$jlr^-sFesk@eN!Z(r^GI!5`MZB=6;rgd|o6*)v|J7YmtHNf@#6Y z3X=N%`dET9!57mFr-S%|Y(KCG`CZ_hKTzR}E1>P(*}yFBEyNj0C%_ijEL!TM5@x~3 z$>~9N5eq24JETn4_0@dCy3gcUwe@~uWykJZlvFQLa!tor7VoUOG2+THd##1;j1GCb z+2_^OULSZ&G*c<>Uc%J;9F$!5m$ZIBkWIVuyn{h25SAgNMh~}p*(-*SGglLrY-6Ba zNathCQGCze0{`aTay#5Q3S|J9<nxc2h)c2XdgHY*RzcP99?4gF@`-lsKj1^T3S_*R zd#WUmVueeuba%Pv;1%OogEwW;m)dMEnPT_or{l$@?`a&PZZVrAXcfwEQvi=Ijvt2p zaJDb_9XudDWC%GXUk6>h4IN(N*IhrTqIR~Ya7zE1t&j6NqNhv^kwz}S(rn_BvM|zj zWU1toK2d8F?;7Y6+cMumQb6_M7RdK9sFJ#cREaf`vQVQkScO60US!z_!*V;_d$D#v z+|Nq}HJ{)APUxdIR1Lj}CsZowNjQhK4vpc>Clq^6mp<xe<vu5GkV4>Le9U8HLXjAm zU`|sdd08xe8srPnKvmv(vJ1_3*jfO;zd2v`{V|7De}>siTE0imh|Obq`OWZ6{KTNH ze1j1YZ;rKh5$hY$4NIIhTQNaTl@wliyyt<3g+=T|cD47<GI(>I{}yC(#Da|w(W9_M z-T*euJReNtuM+I+rq;O%xNxU`JaAgg*B7bai$|58i>*~EL$Lh&G12Mkpg6(RAmJKS za<QN$Aq;SdbV#$f{dS8{H+>$iRzY}<)%WkY7CDmKa~h6Lfx8}?mq%ppr<jr1N1t3$ zQY;YA%DF|*s*1mQvwu;T?bf6=YUHy1=K=QqOz9v|k%@JSj?2($dd}4#EEf}%3br`D zMl+1Xs}|_s+fJmNxPvp0Z(bE`Ju&Y&vP>Z-wCCYsIcBt3Z9CZF_2v{*%3DUaD2=e( zF6{Dp)`K$zaPb|d!Z75T?a8z4Hd?3C+ryoKFn$yZLKsIsrV5xRW*MQC_;*X=l%-DN ziofbhb2!Sok2g&$v|Rj9yHr$$q~EXVFhBOkmqZtw#^sWQuz_2ZZ&XK*JRNpuTOW4a zmtCZ|KIy}*j`!gU8II8gd{AQ;t0MCi4_e{o59~DX;5Pd`9N5Z2T(}3rHkdc9J7cf! zh%4V1?d!9)`|d@n(X?;y#hxDrrDu2b8LzqjWWZ?4C!^fVYhVXi78n6f7NQ<2pBqN? zZ~}3ui_R|&L|_Ph+<*HiIL<Wv-!C(?^)s%{m|nwv5n9_N%(v^>Ua~Z*HNFFP>eFSU z-WR9^&L2YZhQ+f*PZTm;SGJeCg+Pv-cOe~*zO{t%8U>Dji2c}%)$}G7N$vCttrQ3m z{dJ(I#jT==Zl&iUB`KoUpqbH{xn^!1en^&*F}v*imedKp-sk{j;KGz96}Ql!D&pa} z_hXPTsPL@_f3Pah1p=k1pBFIgGVI)*$1(NMA8#BLot|!-q7aq@N4RrQGhaIe8)yy4 zpkhl<`iHT(hdfG97OG*>D0Hb2{Dun;ZgSfLJX}*f4eIrgN4100{n=)0gSPfdrsd8@ zU0XfM!mp7g#aMRZFTp}$w&AQUeJUkTJU6N46Co`A{R=0)pFTS3pVtHa6<+Gxi0X(J z0{({#|II49@fz~MM8Z}~iIYP26Dv4qmb4K>^#pm#G76bIgLf8YCksO@iehWutisS| z#84;k+Bk{TE#XdMQ8Y}^E9ox{5g*<%g*q;oMDP))4<5dnWE|fMj{2CAUMga-(w$Wu zPgVm?<b!%*a%yJy{Oiv>_gdAtQPd0U>7CT>?UXV;ITxFq4`4|oy7M_-@BKP~b6IiD z3BO8CsDwR788{7SWRl5B(DIh`pl;0l(kCSzx#7ydYR*YXQ8(E^L<X0`c6C@S0s0;x zKYzB6jyd4lBv`%Iq70~(qI`6Hq98AF72&k6DLB!kNoX2haDVP*>EU>e+1MVgWO<Z5 z1uf|#aEPSnRz!WUe7<;ExYq1f-u<}-`Vs*zf|D<|KnbNOl`&vj>rBG!lIHjl!5|XB zq4(m#&0@k`<AJceQ_%4H0k5-3&8NYTogJk5?H_+pu+9ST%KcUBHD;Ln)!vgeB)5`m z-mB6K4MlKp$TBafOH$*ggSdF&_+?)uV=`=0HcfLy5%!nULLHRLWWHD5oE_b26+jsD zlE1<AoIwTn?Dw|Ul6s-p(4b*0Dm7KRWv%0iOK3U5E#(o{Zru|=L_YQaWuc)drEy2w z2yc&HggGl@VFUy6?)AbrKcR5)`4`Rh>-wD947VW8sLR{?pC-T0e)*UrMc>Aov=+o6 zYK4W;Od0deRP@`JPuN}n6P~8A(CpPV={%!6E#rWSH<gJ?kEjkWh5$(SNfY)kNTDWX zHr)YH9p{vG=vhFt5`W}*{1fWV`(#dkhot{6j&xYzjH$eGwFoxRTNv0#%nN2Q1|B6< z-yeG=2Ui#>jp{;4Jc|C_bg7MQ$vDwnwz>PROPD~g$^8fjqtxk{&(?DXU0n_NwzG-a ze4OFgFd*O2AsAXmy<#DMDoeoZE+8HwfnsHqs#B-f_73djmb*RzNj{vJ%$R1VyuOTA z1_pd6w8F5Km-2nI6k(vHC=zDvU;kw3?dUIyvK<LC@<1hC?t&&aLY(x}H>%7o9{Gd| z7Xts2iGHltUscZ;m$6{3vT8oId_ly1*Wwf5><tkD6#|*h4?{V;SP2${M%UOMk=K0b zES*60TN*Tw_anwe3Sc1~zLMKU`r{MtRH2$<rR?$Z(?t`Pg6)*M{a2$27Ll(M=As7R zuae-mNXQjg2u2k{(kxDo#}hKNcuoH&*|AY4nx&ey?_7q4wwx**Y}5xKT&xb6I!nv7 z8g*~r>n|18Fr1eLiFt;s-i`iF90n=iI#2A4vjIZWXt-zlF6y{~%eQ>qFc<j~{&5Vy zaBUksy65%#@n&rULu%JNxL*^5GK3LC+I?Z?(#7ItpF?E7Z;-%I$?4QSMA?`a(T2yR z0X4bK#n&ftIDwc{@`rF8fEM-et3bzoB7*8vq6669>RUs;Am66DSj~&K!8?C-v13GT zhmw16W!X>7CTPyNPD*VWBgJ<yy4QF-TXQ?+KG@DCt}*6={lbRz%s{^ah4-c5A<Wg@ zlM}-@+Us}<m7AMpoY_nh)vzR}eJX+YJC*t?OBrg%+auf#M;-YyhmV|KVBz2q(QiZ4 z1DxQdC=_NeZbL>XVbQM3%R<~u`nvEwTs+_e<7@**Mh5xu#_5lB1QL>qCM&Vg8ZkAl z6OchR-_dTbr=i^OuqDaycx*-OWPN?6MU88St8~Y!1qpo4sUi&S<6THhoD-Z@Ra$81 z=~tAAWB9B+bCeJ}F&P-o$93^JANt#O{-(*98o{A#$bnYmc>iQ3gS({U@NlnwVCeD1 zYpwF5iN+RfNOqX3SD>$RV2Q`s)lLYXO&ZLJ3U2zx1i-MM<M?$>e{E7iz@o^1Zyj|y z-c3yLIAy~bvbz@)`0LZBl>MhZFQd?i$J~l&T|0ZK0v}E&-~|P{%W2nNaL~`b0j1Sx z3wkZCkI&h!ziSc~hB#+;mx%~NpH4yCjNo<8o*7R3b-f^Juyv=j|JjSP9W2t{G%2A_ zi07%6ubv?z#|dLfn~5F@5&~HNp94A@#vU97z|8p=|E_7Z1R!feHi`tIP7B+Cew#rI zAS<dg{O5PgFnxl5j_Guj|9P?<@K_W{ZN(v{F9hI-$I+B>eQ&`uV*VR+{9BXsb@7<g z>}2ejdzjEi&2Yuz7LRY<=01C`l@}s(fs^x|ZmU6f{;8=|8mz$Fc-0xn$&mu6C87cb z7=K~_%4SX#-{77Q|4y#I2VAqjCy4diIOfy0AcnA{^}`3jr<kZlDRBN{a-A*VYp?|H zW^!PmV)C6fV*%1)J+M7~?c@Ny<OkE74{s7hK;XA^g-3)o#gqY_Jqk{P)47NR5D1;U zA$uM0gBIpA5FvK3<o_ELr*Hg@omNpmz@d5sGNWQfD5W4^&dvp1KOvm?xFY8-<b;$t zx&A|wkqE?jJtR8+3}?>yVA6(9?M##_kpAI?UsmP+cRMNxi%>6Is7Alxe@eDW6bgyz z40*^I8b&o?#r_jx1OhoiZP>DSI+Rf%=Os%@iB}IcF8_|$5b9Bje}dc3(E?C@8v$J5 z7{7{p_O!YaU|ASxe&`ZZY`_85`+Xh%mxP0kC{qsNY?2YN1AZEnI^9H)#ukrDEn+jp zJmYWZBMiJ1k$*}@n!7QO!rHqZ&a}-pgaC@~xHN>$I|z2XzmMw_U;n$wISdXtfMrK} zUIA{I6imyR7_2M*X344CgAT|j(kUGL`E|zsAmvVhQ9%#-E5E(#eZ~w0A`tg=ruh@K zNy9&#-EZHjuyEExs9!=VJ=d(MWHEe&{ZAUtCfbe3aQ*iczWon+?ffbABEYzt*m$Qj z0jpL5)sR=J_<tLlxI)Dlj($?^|KryQ+N2BSs(Ulg?R2i4fLl{@sQoc+w@N^?{|IKk z$i5~3;P4Z;cVaOfP7&~kG}K_8i+Wdq2Y5d8m?$UrpCbO0NdLSJMjydEL&KWSHR(1Y zg~YPNhUgVo{6FsE=Yp#PqhgBhP*qO&3>1XO6cSvMYor$gd+)^dA9{s&0ddz%M|$V< z16>H+)Dp6|EaxiX$46JQoXGzKb<UO;RN`fqCN$3(^*vxzEQ??$qeA?gXntE)(DcvJ z?exnth!o;c6SG**&hUswJEH(EaPH8t{DLui1QPNeqdfcZ58R)b0LbR|k`e3lZ5{d; zzP@8Q7#QbzIPE{|;pca5KY}<jJ@a5f$D<t82cv5QmQuuvl^-Z`eg(Jw=lY@ICXl@k zNVv|K8V3WY86Et<Cydm;OcYAG|IJM2&}5~Gfmll$9Ui<o>u(6iqvDgxwPL6Lw?PyT z{DI-KAOD~S&;Ch624q_=&xbPxXMz_Mi{-OsPrmd!!YU+SSAG$mr-b@l`JFfQAz@SG z>`)V&PD}tyRHXkS6czFk6(au;9Pke0F_687R~><vJjE6dm?$qUHO?<Y`*W@DRKW@s z!8lL!Tpd>f7WFbVr*g)IZ~VFLe?YJ^NuUMvRj|UFN9*t;P@Z>o2FSf+Oz`xA^#4uO z`+y}4Em9~v<v_qR7*p>E9-isxpVIlCP0C*hyGw?y5_1^TN_5r;$#%lfTDQ<TGugzD zt$y)`PU-l+du8AOiq!Qp^C=oC9AFJ!0TXlZ)%3OB#O<G}c{m`z5rUrcoxMKF3oIlw zcMd24ec_sa8cJsi@(+CeW3_w$K0@=Q+!4`PsYdPL;6DR7DLWKV_!GK~=tktfpan{j ze`YZ*bn%!&nA)Cm!cl^;NiHxghQeJ)^&j%_-v$Pqk15bEEn8;&Y;dAyl9wMofWmv$ z`odB8uWG&>P)<0b#^`Kx6{5~ar1g>hHl7#i>Ku3!B<j+?t<7!7-`V_vqYlnYl(FaX z8X^bgnjRh;4(%)oca`LiX?9AIiefOfm3FXo1K#_L6cSuP0Q!4K!S$<O3DJVh`6CH} zfl(j?3|}hUopb2t0K&bfD-MQnegV(%pAD{xI50R5x@viNJ>-xuFv13a61w6WF4r$i ztUq_w!Srl^#@g=92{>PdrH_1b`J-h{Vm~o=CLjLZFa7-~Kqdr0ra*3{hi3#|6$i%K z9dG)x$NsBp4_^(uUatohm(DwrADuT0q{zUrBsy!j;G2RWyq`klj0k@#%BO&)4^j$s zJ|7JxSOzhO89bB-C<157<_Aaoo8jw22UxZ2*&cXd^@Gz3#7z*!SS++m{z;HcY@dj~ zVELa!lk-!sq~Qe|B4?O)MWT>+ODi3r3fKPUD*575>QJLWK;;Fdm1>1QbW#86-4DS} zLe2DFN%+s~@5}>6_9jT{oCVcGfF!3=r2hf6bGrX6x&IP{a8?H3=o#8SSLVOD_M7NF ze!q<f@n3=~tI%2cixZw{0czxsIWxea9fAbE`^WqUC4aWAto%SNcoi$1L&F>>=AI$X zIxq}$pHnID6Bz$8GN9U#z(g@#G6A8pfE@Ax##tN;t+nd?Pj6m5+A05+4xy0!M@xK` zA_mfDyufrWYFdDn=Zc>U1;M)ip<ONqk<`J!pj;Q^dnA3q8h>46XEY$txk=V5=HaH# z$ao3N`pP&vRHi_I^WQW+WK<7KJEdxf{|sBwn0OL#soLtQe-Ym5#ZC|YVD422q7>qE zQLR>IatX$H0@x!p*CJ1mI|V}ie+*&hWHvFxV-|A_b)m~UDpMf_Hvp!ZA8vgX+B>I^ zDZ-%W?|ku3LSWPhpbwTK<D5H}fFK!2Q&xw2i4^koKfxHf@C(53%E++*@vae+U0g8Q z|EKk}5exp@bkYK=+K}EndM?lT0QTH>O*1UcCGrol{j=Hdb9Kx>G;T3_&X&#o+>5*g zJXDUj8I`j&9c71o@Sh|>F_@}lmbLpCjY3E>drO4^JZLLf&lmX&cRqJ+Bb@#E--FHM z;Xwdd7u7GHjV1<a7)~vPMuOgZ5DVV?w}k)+h2gZmCgMZm-lstL8<h{f(DzfmpQ7d; z*;YJe^WnwtfpBqOzr~*f^$7pOmibFaQy)t_W)N}O7>*h-<TT6}1cE=x7A%)9qL%+j z-y=3+i^oJPtel6jZiCqG`mw0J(4Qgy_osxAD8!c)gM%*+g9f;YXnprgluKV{_;XVg z^w6pRf{h#7T2R;48K^#0S`b;uEjYO7{1hXj7Md4Sy^sKZ?+jXn0T$H_K)tZoN&s^0 zc*idRtmtE|-un}L{j$B`tN_$t&g77=6NDes^gy4b1irZGisTRb@4qN}bRZ{v9=|`2 zN6~<37H-;H-I1@z|BVg)J=g#q2LpkCf!Iq4pNXz%U^+DCSe}R8Tc1MyDt`aYcD}%y z5i}@`^v>&ovK*9|DSUgAedk*C=jf18@St4wv*B;mb%E;WJlxb4($IxYmKO&53~Baf zGO`+xHSpj2_{CxpR|WVuL`FE(mTPdYZW|Q=V`MG?_19SHAG`G!7`vdqbz8KP3xp_> z0=xx&u|+h)_Br(%egWPu!?=Lo?@i9U03dF=B_d80GH}blKZ1M$(r8wr>Y{h_Uh+}e z-zfI?e$3fgq>_LbM*ICno-=+k1IA_JP|@>W2@c5cZ^0<&<KpswYOCw%1VaXAZ~rBT zpND7_^k0_23P=yTz}0hoREzm3P{94iF4vFor67j<rdq*2ey7(dcxrL+0>qt7&{H)p zr0PSUNiAcnp|V>SZvDb?xmbvQu`*Nd0HReBiU7uPmWBnPhh93sT0@ODe+&zRy|9h` zP!T!{05+}7MLxIMut1oArVKJ6hs*HSNaG)9(pL`<gvt@%+Yu(AG8>$B7YdMh@Z!}u z9xATFTK>7AUoi)umgLWVvGr&a1{uJZ(tZ6y)LoD*2%7=#cP9OtSV0JF41~?$(s|?! z9`QE~{~uj?P{{?*Ec4C#GoQBkx>3CbnCV{?{2!attG+-U5fhAD*cjc=-K-b5WOpFy zGO(r>t$&CPbXJK`M;I8Glat-#)ll%`GSoP}1S7<8_`Pd*-3qk82tF3&OXpF4{eR+g BDe3?K literal 0 HcmV?d00001 diff --git a/web/app/components/nav-links.tsx b/web/app/components/nav-links.tsx index bcf4c9b3..1a533f0b 100644 --- a/web/app/components/nav-links.tsx +++ b/web/app/components/nav-links.tsx @@ -43,26 +43,3 @@ export function NavLinks() { ); } -export function SiteFooter() { - return ( - <footer className="py-8 flex justify-center"> - <div className="flex flex-wrap justify-center items-center gap-4 text-sm text-muted px-6"> - <a - href="https://github.com/manaflow-ai/cmux" - target="_blank" - rel="noopener noreferrer" - onClick={() => posthog.capture("cmuxterm_github_clicked", { location: "footer" })} - className="hover:text-foreground transition-colors" - > - GitHub - </a> - <a href="https://twitter.com/manaflowai" target="_blank" rel="noopener noreferrer" className="hover:text-foreground transition-colors">Twitter</a> - <a href="https://discord.gg/xsgFEVrWCZ" target="_blank" rel="noopener noreferrer" className="hover:text-foreground transition-colors">Discord</a> - <Link href="/privacy-policy" className="hover:text-foreground transition-colors">Privacy</Link> - <Link href="/terms-of-service" className="hover:text-foreground transition-colors">Terms</Link> - <Link href="/eula" className="hover:text-foreground transition-colors">EULA</Link> - <a href="mailto:founders@manaflow.com" className="hover:text-foreground transition-colors">Contact</a> - </div> - </footer> - ); -} diff --git a/web/app/components/site-footer.tsx b/web/app/components/site-footer.tsx new file mode 100644 index 00000000..af247c76 --- /dev/null +++ b/web/app/components/site-footer.tsx @@ -0,0 +1,85 @@ +import Link from "next/link"; + +const columns = [ + { + heading: "Product", + links: [ + { label: "Blog", href: "/blog" }, + { label: "Community", href: "/community" }, + ], + }, + { + heading: "Resources", + links: [ + { label: "Docs", href: "/docs/getting-started" }, + { label: "Changelog", href: "/docs/changelog" }, + ], + }, + { + heading: "Legal", + links: [ + { label: "Privacy", href: "/privacy-policy" }, + { label: "Terms", href: "/terms-of-service" }, + { label: "EULA", href: "/eula" }, + ], + }, + { + heading: "Social", + links: [ + { label: "GitHub", href: "https://github.com/manaflow-ai/cmux" }, + { label: "X / Twitter", href: "https://twitter.com/manaflowai" }, + { label: "Discord", href: "https://discord.gg/xsgFEVrWCZ" }, + { label: "Contact", href: "mailto:founders@manaflow.com" }, + ], + }, +]; + +function isExternal(href: string) { + return href.startsWith("http") || href.startsWith("mailto:"); +} + +export function SiteFooter() { + const year = new Date().getFullYear(); + + return ( + <footer className="mt-16"> + <div className="max-w-2xl mx-auto px-6 py-12"> + <div className="grid grid-cols-2 sm:grid-cols-4 gap-8"> + {columns.map((col) => ( + <div key={col.heading}> + <h3 className="text-xs font-medium text-muted tracking-tight mb-3"> + {col.heading} + </h3> + <ul className="space-y-2"> + {col.links.map((link) => ( + <li key={link.href}> + {isExternal(link.href) ? ( + <a + href={link.href} + target="_blank" + rel="noopener noreferrer" + className="text-sm text-muted hover:text-foreground transition-colors" + > + {link.label} + </a> + ) : ( + <Link + href={link.href} + className="text-sm text-muted hover:text-foreground transition-colors" + > + {link.label} + </Link> + )} + </li> + ))} + </ul> + </div> + ))} + </div> + <p className="text-xs text-muted mt-10"> + © {year} Manaflow + </p> + </div> + </footer> + ); +} diff --git a/web/app/components/spacing-control.tsx b/web/app/components/spacing-control.tsx index 0a525617..c995715b 100644 --- a/web/app/components/spacing-control.tsx +++ b/web/app/components/spacing-control.tsx @@ -10,7 +10,10 @@ type DevValues = { downloadAbove: number; downloadBelow: number; featuresLh: number; - featuresMb: number; + featuresPt: number; + featuresPb: number; + communityGap: number; + faqPt: number; docsPt: number; }; @@ -20,9 +23,12 @@ const defaults: DevValues = { cursorBlink: true, subtitleLh: 1.5, downloadAbove: 21, - downloadBelow: 33, + downloadBelow: 16, featuresLh: 1.275, - featuresMb: 23, + featuresPt: 12, + featuresPb: 15, + communityGap: 6, + faqPt: 0, docsPt: 8, }; @@ -67,8 +73,21 @@ function applyToDOM(v: DevValues) { const featuresUl = el("features-ul"); if (featuresUl) featuresUl.style.lineHeight = `${v.featuresLh}`; - const featuresSpacer = el("features-spacer"); - if (featuresSpacer) featuresSpacer.style.height = `${v.featuresMb}px`; + const features = el("features"); + if (features) { + features.style.paddingTop = `${v.featuresPt}px`; + features.style.paddingBottom = `${v.featuresPb}px`; + } + + const communityUl = el("community-ul"); + if (communityUl) { + communityUl.style.display = "flex"; + communityUl.style.flexDirection = "column"; + communityUl.style.gap = `${v.communityGap}px`; + } + + const faqTopSpacer = el("faq-top-spacer"); + if (faqTopSpacer) faqTopSpacer.style.height = `${v.faqPt}px`; const docsContent = el("docs-content"); if (docsContent) docsContent.style.paddingTop = `${v.docsPt}px`; @@ -156,7 +175,16 @@ export function DevPanel() { <Section label="Features"> <Row label="line-h" value={vals.featuresLh} onChange={(v) => update({ featuresLh: v })} min={1} max={2.5} step={0.025} unit="" w={16} /> - <Row label="mb" value={vals.featuresMb} onChange={(v) => update({ featuresMb: v })} /> + <Row label="pt" value={vals.featuresPt} onChange={(v) => update({ featuresPt: v })} /> + <Row label="pb" value={vals.featuresPb} onChange={(v) => update({ featuresPb: v })} /> + </Section> + + <Section label="Community"> + <Row label="gap" value={vals.communityGap} onChange={(v) => update({ communityGap: v })} /> + </Section> + + <Section label="FAQ"> + <Row label="pt" value={vals.faqPt} onChange={(v) => update({ faqPt: v })} /> </Section> <Section label="Docs"> @@ -173,7 +201,10 @@ export function DevPanel() { `download-above: ${vals.downloadAbove}px`, `download-below: ${vals.downloadBelow}px`, `features-lh: ${vals.featuresLh}`, - `features-mb: ${vals.featuresMb}px`, + `features-pt: ${vals.featuresPt}px`, + `features-pb: ${vals.featuresPb}px`, + `community-gap: ${vals.communityGap}px`, + `faq-pt: ${vals.faqPt}px`, `docs-pt: ${vals.docsPt}px`, ].join(", "); navigator.clipboard.writeText(text); diff --git a/web/app/layout.tsx b/web/app/layout.tsx index a67526c3..9d184d01 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -3,7 +3,7 @@ import { Geist, Geist_Mono } from "next/font/google"; import { Providers } from "./providers"; import { DevPanel } from "./components/spacing-control"; -import { SiteFooter } from "./components/nav-links"; +import { SiteFooter } from "./components/site-footer"; import "./globals.css"; const geistSans = Geist({ @@ -76,6 +76,10 @@ export default function RootLayout({ <html lang="en" suppressHydrationWarning> <head> <meta name="theme-color" content="#0a0a0a" /> + <script + type="application/ld+json" + dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} + /> <script dangerouslySetInnerHTML={{ __html: `(function(){try{var t=localStorage.getItem("theme");var light=t==="light"||(t==="system"&&window.matchMedia("(prefers-color-scheme:light)").matches);if(!light)document.documentElement.classList.add("dark");var m=document.querySelector('meta[name="theme-color"]');if(m)m.content=light?"#fafafa":"#0a0a0a"}catch(e){}})()`, @@ -85,10 +89,6 @@ export default function RootLayout({ <body className={`${geistSans.variable} ${geistMono.variable} font-sans antialiased`} > - <script - type="application/ld+json" - dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} - /> <Providers> {children} <SiteFooter /> diff --git a/web/app/page.tsx b/web/app/page.tsx index 4e346909..525d6275 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -1,8 +1,11 @@ +import Image from "next/image"; import Balancer from "react-wrap-balancer"; +import landingImage from "./assets/landing-image.png"; import { TypingTagline } from "./typing"; import { DownloadButton } from "./components/download-button"; import { GitHubButton } from "./components/github-button"; import { SiteHeader } from "./components/site-header"; +import { testimonials } from "./testimonials"; export default function Home() { return ( @@ -35,13 +38,13 @@ export default function Home() { </p> {/* Download */} - <div className="flex flex-wrap items-center gap-3" data-dev="download" style={{ marginTop: 21, marginBottom: 33 }}> + <div className="flex flex-wrap items-center gap-3" data-dev="download" style={{ marginTop: 21, marginBottom: 16 }}> <DownloadButton location="hero" /> <GitHubButton /> </div> {/* Features */} - <section data-dev="features"> + <section data-dev="features" style={{ paddingTop: 12, paddingBottom: 15 }}> <h2 className="text-xs font-medium text-muted tracking-tight mb-3"> Features </h2> @@ -110,9 +113,140 @@ export default function Home() { </span> </li> </ul> - <div data-dev="features-spacer" style={{ height: 23 }} /> </section> + {/* Screenshot - break out of max-w-2xl to be wider */} + <div data-dev="screenshot" className="mb-12 -mx-6 sm:-mx-24 md:-mx-40 lg:-mx-72 xl:-mx-96"> + <Image + src={landingImage} + alt="cmux terminal app screenshot" + priority + placeholder="blur" + className="w-full rounded-xl" + /> + </div> + + {/* FAQ */} + <div data-dev="faq-top-spacer" style={{ height: 0 }} /> + <section data-dev="faq" className="mb-10"> + <h2 className="text-xs font-medium text-muted tracking-tight mb-3"> + FAQ + </h2> + <div className="space-y-5 text-[15px]" style={{ lineHeight: 1.5 }}> + <div> + <p className="font-medium mb-1">How does cmux relate to Ghostty?</p> + <p className="text-muted"> + cmux is not a fork of Ghostty. It uses{" "} + <a href="https://github.com/ghostty-org/ghostty" className="underline underline-offset-2 decoration-border hover:decoration-foreground transition-colors">libghostty</a>{" "} + as a library for terminal rendering, the same way apps use WebKit for web views. + Ghostty is a standalone terminal; cmux is a different app built on top of its rendering engine. + </p> + </div> + <div> + <p className="font-medium mb-1">What platforms does it support?</p> + <p className="text-muted"> + macOS only, for now. cmux is a native Swift + AppKit app. + </p> + </div> + <div> + <p className="font-medium mb-1">What coding agents does cmux work with?</p> + <p className="text-muted"> + All of them. cmux is a terminal, so any agent that runs in a terminal works out of the + box: Claude Code, Codex, OpenCode, Gemini CLI, Kiro, Aider, Goose, Amp, Cline, + Cursor Agent, and anything else you can launch from the command line. + </p> + </div> + <div> + <p className="font-medium mb-1">How do notifications work?</p> + <p className="text-muted"> + When a process needs attention, cmux shows notification rings around panes, + unread badges in the sidebar, a notification popover, and a macOS desktop + notification. These fire automatically via standard terminal escape sequences + (OSC 9/99/777), or you can trigger them with the{" "} + <a href="/docs/notifications" className="underline underline-offset-2 decoration-border hover:decoration-foreground transition-colors">cmux CLI</a>{" "} + and{" "} + <a href="/docs/notifications" className="underline underline-offset-2 decoration-border hover:decoration-foreground transition-colors">Claude Code hooks</a>. + </p> + </div> + <div> + <p className="font-medium mb-1">Can I customize keyboard shortcuts?</p> + <p className="text-muted"> + Terminal keybindings are read from your Ghostty config + file (<code className="text-xs bg-code-bg px-1.5 py-0.5 rounded">~/.config/ghostty/config</code>). + cmux-specific shortcuts (workspaces, splits, browser, notifications) can be + customized in Settings. See the{" "} + <a href="/docs/keyboard-shortcuts" className="underline underline-offset-2 decoration-border hover:decoration-foreground transition-colors">default shortcuts</a>{" "} + for a full list. + </p> + </div> + <div> + <p className="font-medium mb-1">How does it compare to tmux?</p> + <p className="text-muted"> + tmux is a terminal multiplexer that runs inside any terminal. cmux is a native macOS app + with a GUI: vertical tabs, split panes, an embedded browser, and a socket API are all + built in. No config files or prefix keys needed. + </p> + </div> + <div> + <p className="font-medium mb-1">Is cmux free?</p> + <p className="text-muted"> + Yes, cmux is free to use. The source code is available on{" "} + <a href="https://github.com/manaflow-ai/cmux" className="underline underline-offset-2 decoration-border hover:decoration-foreground transition-colors">GitHub</a>. + </p> + </div> + </div> + </section> + + {/* Community */} + <section data-dev="community" className="mb-10"> + <h2 className="text-xs font-medium text-muted tracking-tight mb-3"> + Community + </h2> + <ul data-dev="community-ul" className="text-[15px]" style={{ lineHeight: 1.5, display: "flex", flexDirection: "column", gap: 6 }}> + {testimonials.map((t) => ( + <li key={t.url}> + <span> + <a + href={t.url} + target="_blank" + rel="noopener noreferrer" + className="group" + > + <span className="text-muted group-hover:text-foreground transition-colors"> + "{t.text}" + </span> + </a> + {" "} + <a + href={t.url} + target="_blank" + rel="noopener noreferrer" + className="inline-flex items-center gap-1 text-muted hover:text-foreground transition-colors" + > + — + {t.avatar && ( + <img + src={t.avatar} + alt={t.name} + width={16} + height={16} + className="rounded-full inline-block" + /> + )} + {t.name} + </a> + </span> + </li> + ))} + </ul> + </section> + + {/* Bottom CTA */} + <div className="flex flex-wrap items-center justify-center gap-3 mt-12"> + <DownloadButton location="bottom" /> + <GitHubButton /> + </div> + </main> </div> diff --git a/web/app/sitemap.ts b/web/app/sitemap.ts index ef80f09e..9527852c 100644 --- a/web/app/sitemap.ts +++ b/web/app/sitemap.ts @@ -5,6 +5,9 @@ export default function sitemap(): MetadataRoute.Sitemap { return [ { url: base, lastModified: new Date(), changeFrequency: "weekly", priority: 1 }, + { url: `${base}/blog`, lastModified: new Date(), changeFrequency: "weekly", priority: 0.8 }, + { url: `${base}/blog/show-hn-launch`, lastModified: "2026-02-21", changeFrequency: "monthly", priority: 0.7 }, + { url: `${base}/blog/introducing-cmux`, lastModified: "2026-02-12", changeFrequency: "monthly", priority: 0.7 }, { url: `${base}/docs/getting-started`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.9 }, { url: `${base}/docs/concepts`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.8 }, { url: `${base}/docs/configuration`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.8 }, @@ -12,5 +15,6 @@ export default function sitemap(): MetadataRoute.Sitemap { { url: `${base}/docs/api`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.8 }, { url: `${base}/docs/notifications`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.8 }, { url: `${base}/docs/changelog`, lastModified: new Date(), changeFrequency: "weekly", priority: 0.5 }, + { url: `${base}/community`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.5 }, ]; } diff --git a/web/app/testimonials.tsx b/web/app/testimonials.tsx new file mode 100644 index 00000000..bfcaf734 --- /dev/null +++ b/web/app/testimonials.tsx @@ -0,0 +1,130 @@ +export const testimonials = [ + { + name: "Mitchell Hashimoto", + handle: "@mitchellh", + avatar: + "https://pbs.twimg.com/profile_images/1141762999838842880/64_Y4_XB_400x400.jpg", + text: "Another day another libghostty-based project, this time a macOS terminal with vertical tabs, better organization/notifications, embedded/scriptable browser specifically targeted towards people who use a ton of terminal-based agentic workflows.", + url: "https://x.com/mitchellh/status/2024913161238053296", + platform: "x" as const, + }, + { + name: "johnthedebs", + handle: "johnthedebs", + avatar: null, + text: "Hey, this looks seriously awesome. Love the ideas here, specifically: the programmability, layered UI, browser w/ api. Looking forward to giving this a spin. Also want to add that I really appreciate Mitchell Hashimoto creating libghostty; it feels like an exciting time to be a terminal user.", + url: "https://news.ycombinator.com/item?id=47083596", + platform: "hn" as const, + }, + { + name: "Joe Riddle", + handle: "@joeriddles10", + avatar: + "https://pbs.twimg.com/profile_images/1466920091707076608/pxfGMeC0_400x400.jpg", + text: "Vertical tabs in my terminal \u{1F924} I never thought of that before. I use and love Firefox vertical tabs.", + url: "https://x.com/joeriddles10/status/2024914132416561465", + platform: "x" as const, + }, + { + name: "dchu17", + handle: "dchu17", + avatar: null, + text: "Gave this a run and it was pretty intuitive. Good work!", + url: "https://news.ycombinator.com/item?id=47082577", + platform: "hn" as const, + }, +]; + +export type Testimonial = (typeof testimonials)[number]; + +export function PlatformIcon({ platform }: { platform: "x" | "hn" }) { + if (platform === "x") { + return ( + <svg + width="14" + height="14" + viewBox="0 0 24 24" + fill="currentColor" + className="text-muted" + > + <path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" /> + </svg> + ); + } + return ( + <svg + width="14" + height="14" + viewBox="0 0 256 256" + className="text-muted" + > + <rect width="256" height="256" rx="28" fill="#ff6600" /> + <text + x="128" + y="188" + fontSize="180" + fontWeight="bold" + fontFamily="sans-serif" + fill="white" + textAnchor="middle" + > + Y + </text> + </svg> + ); +} + +function Initials({ name }: { name: string }) { + const initials = name + .split(/[\s_-]+/) + .map((w) => w[0]) + .join("") + .toUpperCase() + .slice(0, 2); + return ( + <div className="w-10 h-10 rounded-full bg-code-bg border border-border flex items-center justify-center text-xs font-medium text-muted shrink-0"> + {initials} + </div> + ); +} + +export function TestimonialCard({ + testimonial, +}: { + testimonial: Testimonial; +}) { + return ( + <a + href={testimonial.url} + target="_blank" + rel="noopener noreferrer" + className="group block rounded-xl border border-border p-5 hover:bg-code-bg transition-colors break-inside-avoid mb-4" + > + <div className="flex items-center gap-3 mb-3"> + {testimonial.avatar ? ( + <img + src={testimonial.avatar} + alt={testimonial.name} + width={40} + height={40} + className="rounded-full shrink-0" + /> + ) : ( + <Initials name={testimonial.name} /> + )} + <div className="min-w-0 flex-1"> + <div className="font-medium text-sm truncate"> + {testimonial.name} + </div> + <div className="text-xs text-muted truncate"> + {testimonial.handle} + </div> + </div> + <PlatformIcon platform={testimonial.platform} /> + </div> + <p className="text-[15px] leading-relaxed text-muted group-hover:text-foreground transition-colors"> + {testimonial.text} + </p> + </a> + ); +} diff --git a/web/app/wall-of-love/page.tsx b/web/app/wall-of-love/page.tsx index ad769e8a..373daf4f 100644 --- a/web/app/wall-of-love/page.tsx +++ b/web/app/wall-of-love/page.tsx @@ -1,5 +1,6 @@ import type { Metadata } from "next"; import { SiteHeader } from "../components/site-header"; +import { testimonials, TestimonialCard } from "../testimonials"; export const metadata: Metadata = { title: "Wall of Love — cmux", @@ -7,153 +8,6 @@ export const metadata: Metadata = { "What people are saying about cmux, the terminal built for multitasking.", }; -const testimonials = [ - { - name: "Mitchell Hashimoto", - handle: "@mitchellh", - avatar: - "https://pbs.twimg.com/profile_images/1141762999838842880/64_Y4_XB_400x400.jpg", - text: "Another day another libghostty-based project, this time a macOS terminal with vertical tabs, better organization/notifications, embedded/scriptable browser specifically targeted towards people who use a ton of terminal-based agentic workflows.", - url: "https://x.com/mitchellh/status/2024913161238053296", - platform: "x" as const, - }, - { - name: "Oliver Kriška", - handle: "@quatermain32", - avatar: - "https://pbs.twimg.com/profile_images/674992361974464512/ClmHiw_P_400x400.jpg", - text: "I have used it for whole day and it's really great. Some bugs like opening file in integrated agent browser (yes, it has browser) but other than that it's good.", - url: "https://x.com/quatermain32/status/2024919743484891629", - platform: "x" as const, - }, - { - name: "johnthedebs", - handle: "johnthedebs", - avatar: null, - text: "Hey, this looks seriously awesome. Love the ideas here, specifically: the programmability, layered UI, browser w/ api. Looking forward to giving this a spin. Also want to add that I really appreciate Mitchell Hashimoto creating libghostty; it feels like an exciting time to be a terminal user.", - url: "https://news.ycombinator.com/item?id=47079718", - platform: "hn" as const, - }, - { - name: "Joe Riddle", - handle: "@joeriddles10", - avatar: - "https://pbs.twimg.com/profile_images/1466920091707076608/pxfGMeC0_400x400.jpg", - text: "Vertical tabs in my terminal \u{1F924} I never thought of that before. I use and love Firefox vertical tabs.", - url: "https://x.com/joeriddles10/status/2024914132416561465", - platform: "x" as const, - }, - { - name: "Marc", - handle: "@prodigy00", - avatar: - "https://pbs.twimg.com/profile_images/1726697382337724417/AGafbkp1_400x400.jpg", - text: "This is niceeeeee!", - url: "https://x.com/prodigy00/status/2024946851401613399", - platform: "x" as const, - }, - { - name: "dchu17", - handle: "dchu17", - avatar: null, - text: "Gave this a run and it was pretty intuitive. Good work!", - url: "https://news.ycombinator.com/item?id=47082577", - platform: "hn" as const, - }, -]; - -function PlatformIcon({ platform }: { platform: "x" | "hn" }) { - if (platform === "x") { - return ( - <svg - width="14" - height="14" - viewBox="0 0 24 24" - fill="currentColor" - className="text-muted" - > - <path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" /> - </svg> - ); - } - return ( - <svg - width="14" - height="14" - viewBox="0 0 256 256" - className="text-muted" - > - <rect width="256" height="256" rx="28" fill="#ff6600" /> - <text - x="128" - y="188" - fontSize="180" - fontWeight="bold" - fontFamily="sans-serif" - fill="white" - textAnchor="middle" - > - Y - </text> - </svg> - ); -} - -function Initials({ name }: { name: string }) { - const initials = name - .split(/[\s_-]+/) - .map((w) => w[0]) - .join("") - .toUpperCase() - .slice(0, 2); - return ( - <div className="w-10 h-10 rounded-full bg-code-bg border border-border flex items-center justify-center text-xs font-medium text-muted shrink-0"> - {initials} - </div> - ); -} - -function TestimonialCard({ - testimonial, -}: { - testimonial: (typeof testimonials)[number]; -}) { - return ( - <a - href={testimonial.url} - target="_blank" - rel="noopener noreferrer" - className="group block rounded-xl border border-border p-5 hover:bg-code-bg transition-colors break-inside-avoid mb-4" - > - <div className="flex items-center gap-3 mb-3"> - {testimonial.avatar ? ( - <img - src={testimonial.avatar} - alt={testimonial.name} - width={40} - height={40} - className="rounded-full shrink-0" - /> - ) : ( - <Initials name={testimonial.name} /> - )} - <div className="min-w-0 flex-1"> - <div className="font-medium text-sm truncate"> - {testimonial.name} - </div> - <div className="text-xs text-muted truncate"> - {testimonial.handle} - </div> - </div> - <PlatformIcon platform={testimonial.platform} /> - </div> - <p className="text-[15px] leading-relaxed text-muted group-hover:text-foreground transition-colors"> - {testimonial.text} - </p> - </a> - ); -} - export default function WallOfLovePage() { return ( <div className="min-h-screen"> diff --git a/web/bun.lock b/web/bun.lock index 85527331..abaa7c3f 100644 --- a/web/bun.lock +++ b/web/bun.lock @@ -10,6 +10,7 @@ "posthog-js": "^1.350.0", "react": "19.2.3", "react-dom": "19.2.3", + "react-tweet": "^3.3.0", "react-wrap-balancer": "^1.1.1", "shiki": "^3.22.0", }, @@ -430,6 +431,8 @@ "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], @@ -842,6 +845,8 @@ "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + "react-tweet": ["react-tweet@3.3.0", "", { "dependencies": { "@swc/helpers": "^0.5.3", "clsx": "^2.0.0", "swr": "^2.2.4" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-gSIG2169ZK7UH6rBzuU+j1xnQbH3IlOTLEkuGrRiJJTMgETik+h+26yHyyVKrLkzwrOaYPk4K3OtEKycqKgNLw=="], + "react-wrap-balancer": ["react-wrap-balancer@1.1.1", "", { "peerDependencies": { "react": ">=16.8.0 || ^17.0.0 || ^18" } }, "sha512-AB+l7FPRWl6uZ28VcJ8skkwLn2+UC62bjiw8tQUrZPlEWDVnR9MG0lghyn7EyxuJSsFEpht4G+yh2WikEqQ/5Q=="], "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], @@ -928,6 +933,8 @@ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + "swr": ["swr@2.4.0", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-sUlC20T8EOt1pHmDiqueUWMmRRX03W7w5YxovWX7VR2KHEPCTMly85x05vpkP5i6Bu4h44ePSMD9Tc+G2MItFw=="], + "tailwindcss": ["tailwindcss@4.1.18", "", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="], "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], @@ -978,6 +985,8 @@ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 00000000..a7b86b58 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,7548 @@ +{ + "name": "web", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web", + "version": "0.1.0", + "license": "AGPL-3.0-or-later", + "dependencies": { + "next": "16.1.6", + "next-themes": "^0.4.6", + "posthog-js": "^1.350.0", + "react": "19.2.3", + "react-dom": "19.2.3", + "react-wrap-balancer": "^1.1.1", + "shiki": "^3.22.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "16.1.6", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz", + "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.1.6.tgz", + "integrity": "sha512-/Qq3PTagA6+nYVfryAtQ7/9FEr/6YVyvOtl6rZnGsbReGLf0jZU6gkpr1FuChAQpvV46a78p4cmHOVP8mbfSMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz", + "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz", + "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz", + "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz", + "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz", + "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz", + "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz", + "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz", + "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz", + "integrity": "sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", + "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.208.0.tgz", + "integrity": "sha512-jOv40Bs9jy9bZVLo/i8FwUiuCvbjWDI+ZW13wimJm4LjnlwJxGgB+N/VWOZUTpM+ah/awXeQqKdNlpLf2EjvYg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.208.0", + "@opentelemetry/core": "2.2.0", + "@opentelemetry/otlp-exporter-base": "0.208.0", + "@opentelemetry/otlp-transformer": "0.208.0", + "@opentelemetry/sdk-logs": "0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.208.0.tgz", + "integrity": "sha512-gMd39gIfVb2OgxldxUtOwGJYSH8P1kVFFlJLuut32L6KgUC4gl1dMhn+YC2mGn0bDOiQYSk/uHOdSjuKp58vvA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/otlp-transformer": "0.208.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.208.0.tgz", + "integrity": "sha512-DCFPY8C6lAQHUNkzcNT9R+qYExvsk6C5Bto2pbNxgicpcSWbe2WHShLxkOxIdNcBiYPdVHv/e7vH7K6TI+C+fQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.208.0", + "@opentelemetry/core": "2.2.0", + "@opentelemetry/resources": "2.2.0", + "@opentelemetry/sdk-logs": "0.208.0", + "@opentelemetry/sdk-metrics": "2.2.0", + "@opentelemetry/sdk-trace-base": "2.2.0", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", + "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.5.1.tgz", + "integrity": "sha512-BViBCdE/GuXRlp9k7nS1w6wJvY5fnFX5XvuEtWsTAOQFIO89Eru7lGW3WbfbxtCuZ/GbrJfAziXG0w0dpxL7eQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.5.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.1.tgz", + "integrity": "sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.208.0.tgz", + "integrity": "sha512-QlAyL1jRpOeaqx7/leG1vJMp84g0xKP6gJmfELBpnI4O/9xPX+Hu5m1POk9Kl+veNkyth5t19hRlN6tNY1sjbA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.208.0", + "@opentelemetry/core": "2.2.0", + "@opentelemetry/resources": "2.2.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", + "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.2.0.tgz", + "integrity": "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/resources": "2.2.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", + "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz", + "integrity": "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/resources": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", + "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz", + "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@posthog/core": { + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.23.1.tgz", + "integrity": "sha512-GViD5mOv/mcbZcyzz3z9CS0R79JzxVaqEz4sP5Dsea178M/j3ZWe6gaHDZB9yuyGfcmIMQ/8K14yv+7QrK4sQQ==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6" + } + }, + "node_modules/@posthog/types": { + "version": "1.352.0", + "resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.352.0.tgz", + "integrity": "sha512-pp7VBMlkhlLmv2TyOoss028lPPD4ElnZlX5y3hqq6oijK5BMZbjVuTAgvFYNLiKbuze/i5ndFGyXTtfCwlMQeA==", + "license": "MIT" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shikijs/core": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.22.0.tgz", + "integrity": "sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.22.0.tgz", + "integrity": "sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", + "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz", + "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz", + "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz", + "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.0.tgz", + "integrity": "sha512-Yv+fn/o2OmL5fh/Ir62VXItdShnUxfpkMA4Y7jdeC8O81WPB8Kf6TT6GSHvnqgSwDzlB5iT7kDpeXxLsUS0T6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.0" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.0.tgz", + "integrity": "sha512-AZqQzADaj742oqn2xjl5JbIOzZB/DGCYF/7bpvhA8KvjUj9HJkag6bBuwZvH1ps6dfgxNHyuJVlzSr2VpMgdTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.0", + "@tailwindcss/oxide-darwin-arm64": "4.2.0", + "@tailwindcss/oxide-darwin-x64": "4.2.0", + "@tailwindcss/oxide-freebsd-x64": "4.2.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.0", + "@tailwindcss/oxide-linux-x64-musl": "4.2.0", + "@tailwindcss/oxide-wasm32-wasi": "4.2.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.0" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.0.tgz", + "integrity": "sha512-F0QkHAVaW/JNBWl4CEKWdZ9PMb0khw5DCELAOnu+RtjAfx5Zgw+gqCHFvqg3AirU1IAd181fwOtJQ5I8Yx5wtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.0.tgz", + "integrity": "sha512-I0QylkXsBsJMZ4nkUNSR04p6+UptjcwhcVo3Zu828ikiEqHjVmQL9RuQ6uT/cVIiKpvtVA25msu/eRV97JeNSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.0.tgz", + "integrity": "sha512-6TmQIn4p09PBrmnkvbYQ0wbZhLtbaksCDx7Y7R3FYYx0yxNA7xg5KP7dowmQ3d2JVdabIHvs3Hx4K3d5uCf8xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.0.tgz", + "integrity": "sha512-qBudxDvAa2QwGlq9y7VIzhTvp2mLJ6nD/G8/tI70DCDoneaUeLWBJaPcbfzqRIWraj+o969aDQKvKW9dvkUizw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.0.tgz", + "integrity": "sha512-7XKkitpy5NIjFZNUQPeUyNJNJn1CJeV7rmMR+exHfTuOsg8rxIO9eNV5TSEnqRcaOK77zQpsyUkBWmPy8FgdSg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.0.tgz", + "integrity": "sha512-Mff5a5Q3WoQR01pGU1gr29hHM1N93xYrKkGXfPw/aRtK4bOc331Ho4Tgfsm5WDGvpevqMpdlkCojT3qlCQbCpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.0.tgz", + "integrity": "sha512-XKcSStleEVnbH6W/9DHzZv1YhjE4eSS6zOu2eRtYAIh7aV4o3vIBs+t/B15xlqoxt6ef/0uiqJVB6hkHjWD/0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.0.tgz", + "integrity": "sha512-/hlXCBqn9K6fi7eAM0RsobHwJYa5V/xzWspVTzxnX+Ft9v6n+30Pz8+RxCn7sQL/vRHHLS30iQPrHQunu6/vJA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.0.tgz", + "integrity": "sha512-lKUaygq4G7sWkhQbfdRRBkaq4LY39IriqBQ+Gk6l5nKq6Ay2M2ZZb1tlIyRNgZKS8cbErTwuYSor0IIULC0SHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.0.tgz", + "integrity": "sha512-xuDjhAsFdUuFP5W9Ze4k/o4AskUtI8bcAGU4puTYprr89QaYFmhYOPfP+d1pH+k9ets6RoE23BXZM1X1jJqoyw==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.0.tgz", + "integrity": "sha512-2UU/15y1sWDEDNJXxEIrfWKC2Yb4YgIW5Xz2fKFqGzFWfoMHWFlfa1EJlGO2Xzjkq/tvSarh9ZTjvbxqWvLLXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.0.tgz", + "integrity": "sha512-CrFadmFoc+z76EV6LPG1jx6XceDsaCG3lFhyLNo/bV9ByPrE+FnBPckXQVP4XRkN76h3Fjt/a+5Er/oA/nCBvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.0.tgz", + "integrity": "sha512-u6YBacGpOm/ixPfKqfgrJEjMfrYmPD7gEFRoygS/hnQaRtV0VCBdpkx5Ouw9pnaLRwwlgGCuJw8xLpaR0hOrQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.0", + "@tailwindcss/oxide": "4.2.0", + "postcss": "^8.5.6", + "tailwindcss": "4.2.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "20.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", + "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", + "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/type-utils": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.56.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", + "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", + "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.56.0", + "@typescript-eslint/types": "^8.56.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", + "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", + "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", + "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", + "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", + "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.56.0", + "@typescript-eslint/tsconfig-utils": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", + "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", + "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001770", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz", + "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", + "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dompurify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.3", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.1.6.tgz", + "integrity": "sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.1.6", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", + "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz", + "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.1.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.1.6", + "@next/swc-darwin-x64": "16.1.6", + "@next/swc-linux-arm64-gnu": "16.1.6", + "@next/swc-linux-arm64-musl": "16.1.6", + "@next/swc-linux-x64-gnu": "16.1.6", + "@next/swc-linux-x64-musl": "16.1.6", + "@next/swc-win32-arm64-msvc": "16.1.6", + "@next/swc-win32-x64-msvc": "16.1.6", + "sharp": "^0.34.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/posthog-js": { + "version": "1.352.0", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.352.0.tgz", + "integrity": "sha512-LxLKyoE+Y2z+WQ8CTO3PqQQDBuz64mHLJUoRuAYNXmp3vtxzrygZEz7UNnCT+BZ4/G44Qeq6JDYk1TRS7pIRDA==", + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.208.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.208.0", + "@opentelemetry/resources": "^2.2.0", + "@opentelemetry/sdk-logs": "^0.208.0", + "@posthog/core": "1.23.1", + "@posthog/types": "1.352.0", + "core-js": "^3.38.1", + "dompurify": "^3.3.1", + "fflate": "^0.4.8", + "preact": "^10.28.2", + "query-selector-shadow-dom": "^1.0.1", + "web-vitals": "^5.1.0" + } + }, + "node_modules/preact": { + "version": "10.28.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.4.tgz", + "integrity": "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/query-selector-shadow-dom": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", + "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.3" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-wrap-balancer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/react-wrap-balancer/-/react-wrap-balancer-1.1.1.tgz", + "integrity": "sha512-AB+l7FPRWl6uZ28VcJ8skkwLn2+UC62bjiw8tQUrZPlEWDVnR9MG0lghyn7EyxuJSsFEpht4G+yh2WikEqQ/5Q==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0 || ^17.0.0 || ^18" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.22.0.tgz", + "integrity": "sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.22.0", + "@shikijs/engine-javascript": "3.22.0", + "@shikijs/engine-oniguruma": "3.22.0", + "@shikijs/langs": "3.22.0", + "@shikijs/themes": "3.22.0", + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.0.tgz", + "integrity": "sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.0.tgz", + "integrity": "sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.56.0", + "@typescript-eslint/parser": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/utils": "8.56.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/web-vitals": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.1.0.tgz", + "integrity": "sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==", + "license": "Apache-2.0" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/web/package.json b/web/package.json index 499fcc5d..c69800e5 100644 --- a/web/package.json +++ b/web/package.json @@ -15,6 +15,7 @@ "posthog-js": "^1.350.0", "react": "19.2.3", "react-dom": "19.2.3", + "react-tweet": "^3.3.0", "react-wrap-balancer": "^1.1.1", "shiki": "^3.22.0" }, From 4f1d120d2ed94fd27ba8ee8a9f992cf9e1b49a04 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 06:19:14 -0800 Subject: [PATCH 043/214] Fix Show HN blog summary: hit #2, Mitchell Hashimoto, viral in Japan (#277) --- web/app/blog/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app/blog/page.tsx b/web/app/blog/page.tsx index d7707772..e3bccea3 100644 --- a/web/app/blog/page.tsx +++ b/web/app/blog/page.tsx @@ -12,7 +12,7 @@ const posts = [ title: "Launching cmux on Show HN", date: "2026-02-21", summary: - "cmux hit the front page, went viral in Japan, and shipped 18 releases in 48 hours.", + "cmux hit #2 on Hacker News, got shared by Mitchell Hashimoto, and went viral in Japan.", }, { slug: "introducing-cmux", From 64bb248f202802add61a6fa6d844749d78b7c7bf Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 06:24:59 -0800 Subject: [PATCH 044/214] Replace blur placeholder with opacity fade-in on hero screenshot (#278) --- web/app/components/fade-image.tsx | 17 +++++++++++++++++ web/app/page.tsx | 5 ++--- 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 web/app/components/fade-image.tsx diff --git a/web/app/components/fade-image.tsx b/web/app/components/fade-image.tsx new file mode 100644 index 00000000..4813f56a --- /dev/null +++ b/web/app/components/fade-image.tsx @@ -0,0 +1,17 @@ +"use client"; + +import Image, { type ImageProps } from "next/image"; +import { useState } from "react"; + +export function FadeImage(props: ImageProps) { + const [loaded, setLoaded] = useState(false); + + return ( + <Image + {...props} + placeholder={undefined} + className={`${props.className ?? ""} transition-opacity duration-700 ${loaded ? "opacity-100" : "opacity-0"}`} + onLoad={() => setLoaded(true)} + /> + ); +} diff --git a/web/app/page.tsx b/web/app/page.tsx index 525d6275..566d6c68 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -1,4 +1,4 @@ -import Image from "next/image"; +import { FadeImage } from "./components/fade-image"; import Balancer from "react-wrap-balancer"; import landingImage from "./assets/landing-image.png"; import { TypingTagline } from "./typing"; @@ -117,11 +117,10 @@ export default function Home() { {/* Screenshot - break out of max-w-2xl to be wider */} <div data-dev="screenshot" className="mb-12 -mx-6 sm:-mx-24 md:-mx-40 lg:-mx-72 xl:-mx-96"> - <Image + <FadeImage src={landingImage} alt="cmux terminal app screenshot" priority - placeholder="blur" className="w-full rounded-xl" /> </div> From 14603bd9f82cf1fb39f45df7f0adb87b09682020 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 06:26:55 -0800 Subject: [PATCH 045/214] Set community gap to 16px, add dingyi China tweet to blog post (#279) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix community section gap (6px → 16px) - Add dingyi tweet showing cmux went semi-viral in China - Change "semi-viral in Japan" to "viral in Japan" + "semi-viral in China" --- web/app/blog/show-hn-launch/page.tsx | 8 +++++++- web/app/components/spacing-control.tsx | 2 +- web/app/page.tsx | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/web/app/blog/show-hn-launch/page.tsx b/web/app/blog/show-hn-launch/page.tsx index 0800297b..dd02c5e5 100644 --- a/web/app/blog/show-hn-launch/page.tsx +++ b/web/app/blog/show-hn-launch/page.tsx @@ -159,7 +159,7 @@ export default function ShowHNLaunchPage() { </blockquote> <p> - Surprisingly, cmux went semi-viral in Japan! + Surprisingly, cmux went viral in Japan: </p> <Tweet id="2025129675262251026" /> @@ -171,6 +171,12 @@ export default function ShowHNLaunchPage() { it has its own notification system." </p> + <p> + And semi-viral in China: + </p> + + <Tweet id="2024867449947275444" /> + <p> Another exciting thing was seeing people build on top of the cmux CLI. sasha built a pi-cmux extension that shows model info, token diff --git a/web/app/components/spacing-control.tsx b/web/app/components/spacing-control.tsx index c995715b..e3bae491 100644 --- a/web/app/components/spacing-control.tsx +++ b/web/app/components/spacing-control.tsx @@ -27,7 +27,7 @@ const defaults: DevValues = { featuresLh: 1.275, featuresPt: 12, featuresPb: 15, - communityGap: 6, + communityGap: 16, faqPt: 0, docsPt: 8, }; diff --git a/web/app/page.tsx b/web/app/page.tsx index 566d6c68..424945b0 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -201,7 +201,7 @@ export default function Home() { <h2 className="text-xs font-medium text-muted tracking-tight mb-3"> Community </h2> - <ul data-dev="community-ul" className="text-[15px]" style={{ lineHeight: 1.5, display: "flex", flexDirection: "column", gap: 6 }}> + <ul data-dev="community-ul" className="text-[15px]" style={{ lineHeight: 1.5, display: "flex", flexDirection: "column", gap: 16 }}> {testimonials.map((t) => ( <li key={t.url}> <span> From 19f6f9137e62398b1ee96afd7530333af8909f94 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 06:36:19 -0800 Subject: [PATCH 046/214] Sync homepage features with README (#280) * Sync homepage features with README Add missing features: Notification panel, In-app browser, Ghostty compatible. Update existing descriptions to match README (notification rings, vertical tabs, socket API renamed to Scriptable). * Shorten notification feature descriptions * Remove Ghostty compatible from homepage features * Move Vertical tabs to top of features list * Remove Notification panel from homepage features * Shorten Scriptable feature description * Fix notification rings description: panes only --- web/app/page.tsx | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/web/app/page.tsx b/web/app/page.tsx index 424945b0..3324519d 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -49,30 +49,31 @@ export default function Home() { Features </h2> <ul className="space-y-3 text-[15px]" data-dev="features-ul" style={{ lineHeight: 1.275 }}> - <li className="flex gap-3"> - <span className="text-muted shrink-0">-</span> - <span> - <strong className="font-medium">Notification rings</strong> - <span className="text-muted"> - : tabs flash when agents need your input - </span> - </span> - </li> <li className="flex gap-3"> <span className="text-muted shrink-0">-</span> <span> <strong className="font-medium">Vertical tabs</strong> <span className="text-muted"> - : see all your terminals at a glance in a sidebar + : sidebar shows git branch, working directory, ports, and notification text </span> </span> </li> <li className="flex gap-3"> <span className="text-muted shrink-0">-</span> <span> - <strong className="font-medium">GPU-accelerated</strong> + <strong className="font-medium">Notification rings</strong> <span className="text-muted"> - : powered by libghostty for smooth rendering + : panes light up when agents need attention + </span> + </span> + </li> + + <li className="flex gap-3"> + <span className="text-muted shrink-0">-</span> + <span> + <strong className="font-medium">In-app browser</strong> + <span className="text-muted"> + : split a browser alongside your terminal with a scriptable API </span> </span> </li> @@ -88,12 +89,22 @@ export default function Home() { <li className="flex gap-3"> <span className="text-muted shrink-0">-</span> <span> - <strong className="font-medium">Socket API</strong> + <strong className="font-medium">Scriptable</strong> <span className="text-muted"> - : programmatic control for creating tabs, sending input + : CLI and socket API for automation and scripting </span> </span> </li> + <li className="flex gap-3"> + <span className="text-muted shrink-0">-</span> + <span> + <strong className="font-medium">GPU-accelerated</strong> + <span className="text-muted"> + : powered by libghostty for smooth rendering + </span> + </span> + </li> + <li className="flex gap-3"> <span className="text-muted shrink-0">-</span> <span> From 71d087db73604f4dff09dda489afdb57ad38859e Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 15:09:19 -0800 Subject: [PATCH 047/214] Prepare release v0.60.0 (#283) Bump version to 0.60.0 (build 72) and add changelog entry covering all changes since v0.59.0. --- CHANGELOG.md | 56 +++++++++++++++++++++++++++ GhosttyTabs.xcodeproj/project.pbxproj | 24 ++++++------ 2 files changed, 68 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 320506ea..dc79f8fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,62 @@ All notable changes to cmux are documented here. +## [0.60.0] - 2026-02-21 + +### Added +- Tab context menu with rename, close, unread, and workspace actions ([#225](https://github.com/manaflow-ai/cmux/pull/225)) +- Cmd+Shift+T reopens closed browser panels ([#253](https://github.com/manaflow-ai/cmux/pull/253)) +- Vertical sidebar branch layout setting showing git branch and directory per pane +- JavaScript alert/confirm/prompt dialogs in browser panel ([#237](https://github.com/manaflow-ai/cmux/pull/237)) +- File drag-and-drop and file input in browser panel ([#214](https://github.com/manaflow-ai/cmux/pull/214)) +- tmux-compatible command set with matrix tests ([#221](https://github.com/manaflow-ai/cmux/pull/221)) +- Pane resize divider control via CLI ([#223](https://github.com/manaflow-ai/cmux/pull/223)) +- Production read-screen capture APIs ([#219](https://github.com/manaflow-ai/cmux/pull/219)) +- Notification rings on terminal panes ([#132](https://github.com/manaflow-ai/cmux/pull/132)) +- Claude Code integration enabled by default ([#247](https://github.com/manaflow-ai/cmux/pull/247)) +- HTTP host allowlist for embedded browser with save and proceed flow ([#206](https://github.com/manaflow-ai/cmux/pull/206), [#203](https://github.com/manaflow-ai/cmux/pull/203)) +- Setting to disable workspace auto-reorder on notification ([#215](https://github.com/manaflow-ai/cmux/issues/205)) +- Browser panel mouse back/forward buttons and middle-click close ([#139](https://github.com/manaflow-ai/cmux/pull/139)) +- Browser DevTools shortcut wiring and persistence ([#117](https://github.com/manaflow-ai/cmux/pull/117)) +- CJK IME input support for Korean, Chinese, and Japanese ([#125](https://github.com/manaflow-ai/cmux/pull/125)) +- `--help` flag on CLI subcommands ([#128](https://github.com/manaflow-ai/cmux/pull/128)) +- `--command` flag for `new-workspace` CLI command ([#121](https://github.com/manaflow-ai/cmux/pull/121)) +- `rename-tab` socket command ([#260](https://github.com/manaflow-ai/cmux/pull/260)) +- Remap-aware bonsplit tooltips and browser split shortcuts ([#200](https://github.com/manaflow-ai/cmux/pull/200)) + +### Fixed +- IME preedit anchor sizing ([#266](https://github.com/manaflow-ai/cmux/pull/266)) +- Cmd+Shift+T focus against deferred stale callbacks ([#267](https://github.com/manaflow-ai/cmux/pull/267)) +- Unknown Bonsplit tab context actions causing crash ([#264](https://github.com/manaflow-ai/cmux/pull/264)) +- Socket CLI commands stealing macOS app focus ([#260](https://github.com/manaflow-ai/cmux/pull/260)) +- CLI unix socket lag from main-thread blocking ([#259](https://github.com/manaflow-ai/cmux/pull/259)) +- Main-thread notification cascade causing hangs ([#232](https://github.com/manaflow-ai/cmux/pull/232)) +- Favicon out-of-sync during back/forward navigation ([#233](https://github.com/manaflow-ai/cmux/pull/233)) +- Stale sidebar git branch after closing a split +- Browser download UX and crash path ([#235](https://github.com/manaflow-ai/cmux/pull/235)) +- Browser reopen focus across workspace switches ([#257](https://github.com/manaflow-ai/cmux/pull/257)) +- Mark Tab as Unread no-op on focused tab ([#249](https://github.com/manaflow-ai/cmux/pull/249)) +- Split dividers disappearing in tiny panes ([#250](https://github.com/manaflow-ai/cmux/pull/250)) +- Flaky browser download activity accounting ([#246](https://github.com/manaflow-ai/cmux/pull/246)) +- Drag overlay routing and terminal overlay regressions ([#218](https://github.com/manaflow-ai/cmux/pull/218)) +- Initial bonsplit split animation flicker +- Window top inset on new window creation ([#224](https://github.com/manaflow-ai/cmux/pull/224)) +- Cmd+Enter being routed as browser reload ([#213](https://github.com/manaflow-ai/cmux/pull/213)) +- Child-exit close for last-terminal workspaces ([#254](https://github.com/manaflow-ai/cmux/pull/254)) +- Sidebar resizer hitbox and cursor across portals ([#255](https://github.com/manaflow-ai/cmux/pull/255)) +- Workspace-scoped tab action resolution +- IDN host allowlist normalization +- `setup.sh` cache rebuild and stale lock timeout ([#217](https://github.com/manaflow-ai/cmux/pull/217)) +- Inconsistent Tab/Workspace terminology in settings and menus ([#187](https://github.com/manaflow-ai/cmux/pull/187)) + +### Changed +- CLI workspace commands now run off the main thread for better responsiveness ([#270](https://github.com/manaflow-ai/cmux/pull/270)) +- Remove border below titlebar ([#242](https://github.com/manaflow-ai/cmux/pull/242)) +- Slimmer browser omnibar with button hover/press states ([#271](https://github.com/manaflow-ai/cmux/pull/271)) +- Browser under-page background refreshes on theme updates ([#272](https://github.com/manaflow-ai/cmux/pull/272)) +- Command shortcut hints scoped to active window ([#226](https://github.com/manaflow-ai/cmux/pull/226)) +- Nightly and release assets are now immutable (no accidental overwrite) ([#268](https://github.com/manaflow-ai/cmux/pull/268), [#269](https://github.com/manaflow-ai/cmux/pull/269)) + ## [0.59.0] - 2026-02-19 ### Fixed diff --git a/GhosttyTabs.xcodeproj/project.pbxproj b/GhosttyTabs.xcodeproj/project.pbxproj index 7f675483..65cc12e6 100644 --- a/GhosttyTabs.xcodeproj/project.pbxproj +++ b/GhosttyTabs.xcodeproj/project.pbxproj @@ -702,7 +702,7 @@ CODE_SIGN_ENTITLEMENTS = ""; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 71; + CURRENT_PROJECT_VERSION = 72; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = NO; GENERATE_INFOPLIST_FILE = NO; @@ -711,7 +711,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 0.59.0; + MARKETING_VERSION = 0.60.0; OTHER_LDFLAGS = ( "-lc++", "-framework", @@ -741,7 +741,7 @@ CODE_SIGN_ENTITLEMENTS = ""; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 71; + CURRENT_PROJECT_VERSION = 72; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = NO; GENERATE_INFOPLIST_FILE = NO; @@ -750,7 +750,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 0.59.0; + MARKETING_VERSION = 0.60.0; OTHER_LDFLAGS = ( "-lc++", "-framework", @@ -804,10 +804,10 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 71; + CURRENT_PROJECT_VERSION = 72; GENERATE_INFOPLIST_FILE = YES; MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 0.59.0; + MARKETING_VERSION = 0.60.0; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.cmuxterm.appuitests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -821,10 +821,10 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 71; + CURRENT_PROJECT_VERSION = 72; GENERATE_INFOPLIST_FILE = YES; MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 0.59.0; + MARKETING_VERSION = 0.60.0; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.cmuxterm.appuitests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -838,10 +838,10 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 71; + CURRENT_PROJECT_VERSION = 72; GENERATE_INFOPLIST_FILE = YES; MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 0.59.0; + MARKETING_VERSION = 0.60.0; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.cmuxterm.apptests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -857,10 +857,10 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 71; + CURRENT_PROJECT_VERSION = 72; GENERATE_INFOPLIST_FILE = YES; MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 0.59.0; + MARKETING_VERSION = 0.60.0; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.cmuxterm.apptests; PRODUCT_NAME = "$(TARGET_NAME)"; From cf1cd096b13812f8fe7e7a8cd568568da18dd866 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 15:19:10 -0800 Subject: [PATCH 048/214] Make release asset guard idempotent --- .github/workflows/release.yml | 17 +++++++++----- scripts/release_asset_guard.js | 17 ++++++++++++++ scripts/release_asset_guard.test.js | 36 +++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 scripts/release_asset_guard.js create mode 100644 scripts/release_asset_guard.test.js diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a3ca4a1a..a3008abe 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -194,36 +194,41 @@ jobs: ./scripts/sparkle_generate_appcast.sh cmux-macos.dmg "$GITHUB_REF_NAME" appcast.xml - name: Guard immutable release assets + id: guard_release_assets uses: actions/github-script@v7 with: script: | + const { evaluateReleaseAssetGuard } = require('./scripts/release_asset_guard'); const tag = context.ref.replace('refs/tags/', ''); - const requiredAssets = ['cmux-macos.dmg', 'appcast.xml']; try { const release = await github.rest.repos.getReleaseByTag({ owner: context.repo.owner, repo: context.repo.repo, tag, }); - const assetNames = new Set((release.data.assets || []).map((asset) => asset.name)); - const conflicts = requiredAssets.filter((asset) => assetNames.has(asset)); - if (conflicts.length > 0) { - core.setFailed( + const existingAssetNames = (release.data.assets || []).map((asset) => asset.name); + const { conflicts, shouldSkipUpload } = evaluateReleaseAssetGuard({ existingAssetNames }); + if (shouldSkipUpload) { + core.notice( `Release ${tag} already contains immutable assets (${conflicts.join(', ')}). ` + - 'Refusing to overwrite signed artifacts for an existing tag.' + 'Skipping upload to preserve existing signed artifacts.' ); + core.setOutput('skip_upload', 'true'); return; } core.notice(`Release ${tag} exists but does not contain conflicting assets.`); + core.setOutput('skip_upload', 'false'); } catch (error) { if (error.status === 404) { core.notice(`Release ${tag} does not exist yet; safe to publish assets.`); + core.setOutput('skip_upload', 'false'); return; } throw error; } - name: Upload release asset + if: steps.guard_release_assets.outputs.skip_upload != 'true' uses: softprops/action-gh-release@v2 with: files: | diff --git a/scripts/release_asset_guard.js b/scripts/release_asset_guard.js new file mode 100644 index 00000000..0bafc2e1 --- /dev/null +++ b/scripts/release_asset_guard.js @@ -0,0 +1,17 @@ +"use strict"; + +const IMMUTABLE_RELEASE_ASSETS = ["cmux-macos.dmg", "appcast.xml"]; + +function evaluateReleaseAssetGuard({ existingAssetNames, immutableAssetNames = IMMUTABLE_RELEASE_ASSETS }) { + const existing = new Set(existingAssetNames || []); + const conflicts = immutableAssetNames.filter((assetName) => existing.has(assetName)); + return { + conflicts, + shouldSkipUpload: conflicts.length > 0, + }; +} + +module.exports = { + IMMUTABLE_RELEASE_ASSETS, + evaluateReleaseAssetGuard, +}; diff --git a/scripts/release_asset_guard.test.js b/scripts/release_asset_guard.test.js new file mode 100644 index 00000000..fef57e7d --- /dev/null +++ b/scripts/release_asset_guard.test.js @@ -0,0 +1,36 @@ +"use strict"; + +const test = require("node:test"); +const assert = require("node:assert/strict"); + +const { + IMMUTABLE_RELEASE_ASSETS, + evaluateReleaseAssetGuard, +} = require("./release_asset_guard"); + +test("skips upload when immutable assets already exist", () => { + const result = evaluateReleaseAssetGuard({ + existingAssetNames: ["cmux-macos.dmg", "appcast.xml", "notes.txt"], + }); + + assert.deepEqual(result.conflicts, IMMUTABLE_RELEASE_ASSETS); + assert.equal(result.shouldSkipUpload, true); +}); + +test("allows upload when immutable assets are not present", () => { + const result = evaluateReleaseAssetGuard({ + existingAssetNames: ["notes.txt", "checksums.txt"], + }); + + assert.deepEqual(result.conflicts, []); + assert.equal(result.shouldSkipUpload, false); +}); + +test("skips upload when any immutable asset would conflict", () => { + const result = evaluateReleaseAssetGuard({ + existingAssetNames: ["appcast.xml"], + }); + + assert.deepEqual(result.conflicts, ["appcast.xml"]); + assert.equal(result.shouldSkipUpload, true); +}); From 5ac633445f31928b3707d5955f2957eaa7d21cba Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 15:27:24 -0800 Subject: [PATCH 049/214] Fail partial release assets and short-circuit reruns --- .github/workflows/release.yml | 102 ++++++++++++++++++---------- scripts/release_asset_guard.js | 24 ++++++- scripts/release_asset_guard.test.js | 21 ++++-- 3 files changed, 107 insertions(+), 40 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a3008abe..3176697b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,63 @@ jobs: with: submodules: recursive + - name: Guard immutable release assets + id: guard_release_assets + uses: actions/github-script@v7 + with: + script: | + const { evaluateReleaseAssetGuard } = require('./scripts/release_asset_guard'); + const tag = context.ref.replace('refs/tags/', ''); + core.setOutput('skip_all', 'false'); + core.setOutput('skip_upload', 'false'); + core.setOutput('release_state', 'clear'); + try { + const release = await github.rest.repos.getReleaseByTag({ + owner: context.repo.owner, + repo: context.repo.repo, + tag, + }); + const existingAssetNames = (release.data.assets || []).map((asset) => asset.name); + const { + conflicts, + missingImmutableAssets, + guardState, + hasPartialConflict, + shouldSkipBuildAndUpload, + } = evaluateReleaseAssetGuard({ existingAssetNames }); + + core.setOutput('release_state', guardState); + + if (hasPartialConflict) { + core.setFailed( + `Release ${tag} has a partial immutable asset state. Existing immutable assets: ` + + `${conflicts.join(', ')}. Missing immutable assets: ${missingImmutableAssets.join(', ')}. ` + + 'Resolve release assets manually before rerunning.' + ); + return; + } + + if (shouldSkipBuildAndUpload) { + core.notice( + `Release ${tag} already contains immutable assets (${conflicts.join(', ')}). ` + + 'Skipping build, notarization, and upload to preserve existing signed artifacts.' + ); + core.setOutput('skip_all', 'true'); + core.setOutput('skip_upload', 'true'); + return; + } + + core.notice(`Release ${tag} exists but has no immutable release assets yet; continuing.`); + } catch (error) { + if (error.status === 404) { + core.notice(`Release ${tag} does not exist yet; safe to build and publish assets.`); + return; + } + throw error; + } + - name: Select Xcode + if: steps.guard_release_assets.outputs.skip_all != 'true' run: | set -euo pipefail if [ -d "/Applications/Xcode.app/Contents/Developer" ]; then @@ -41,15 +97,18 @@ jobs: xcrun --sdk macosx --show-sdk-path - name: Install build deps + if: steps.guard_release_assets.outputs.skip_all != 'true' run: | brew update brew install zig npm install --global create-dmg - name: Download Metal Toolchain + if: steps.guard_release_assets.outputs.skip_all != 'true' run: xcodebuild -downloadComponent MetalToolchain - name: Build GhosttyKit.xcframework + if: steps.guard_release_assets.outputs.skip_all != 'true' run: | cd ghostty zig build -Demit-xcframework=true -Demit-macos-app=false -Doptimize=ReleaseFast @@ -58,11 +117,13 @@ jobs: cp -R ghostty/macos/GhosttyKit.xcframework GhosttyKit.xcframework - name: Clear SPM cache + if: steps.guard_release_assets.outputs.skip_all != 'true' run: | rm -rf ~/Library/Caches/org.swift.swiftpm rm -rf ~/Library/Developer/Xcode/DerivedData/GhosttyTabs-* - name: Configure SwiftPM cache + if: steps.guard_release_assets.outputs.skip_all != 'true' run: | set -euo pipefail CACHE_DIR="${RUNNER_TEMP}/swiftpm-cache/${GITHUB_RUN_ID}" @@ -71,6 +132,7 @@ jobs: echo "SWIFTPM_CACHE_PATH=$CACHE_DIR" >> "$GITHUB_ENV" - name: Derive Sparkle public key from private key + if: steps.guard_release_assets.outputs.skip_all != 'true' env: SPARKLE_PRIVATE_KEY: ${{ secrets.SPARKLE_PRIVATE_KEY }} run: | @@ -83,10 +145,12 @@ jobs: echo "SPARKLE_PUBLIC_KEY=$DERIVED_PUBLIC_KEY" >> "$GITHUB_ENV" - name: Build app (Release) + if: steps.guard_release_assets.outputs.skip_all != 'true' run: | xcodebuild -scheme cmux -configuration Release -derivedDataPath build CODE_SIGNING_ALLOWED=NO build - name: Inject Sparkle keys into Info.plist + if: steps.guard_release_assets.outputs.skip_all != 'true' run: | APP_PLIST="build/Build/Products/Release/cmux.app/Contents/Info.plist" /usr/libexec/PlistBuddy -c "Delete :SUPublicEDKey" "$APP_PLIST" >/dev/null 2>&1 || true @@ -100,6 +164,7 @@ jobs: /usr/libexec/PlistBuddy -c "Print :SUFeedURL" "$APP_PLIST" - name: Import signing cert + if: steps.guard_release_assets.outputs.skip_all != 'true' env: APPLE_CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }} APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} @@ -123,6 +188,7 @@ jobs: security list-keychains -d user -s build.keychain - name: Codesign app + if: steps.guard_release_assets.outputs.skip_all != 'true' env: APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} run: | @@ -140,6 +206,7 @@ jobs: /usr/bin/codesign --verify --deep --strict --verbose=2 "$APP_PATH" - name: Notarize app + if: steps.guard_release_assets.outputs.skip_all != 'true' env: APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} @@ -184,6 +251,7 @@ jobs: xcrun stapler validate "$DMG_RELEASE" - name: Generate Sparkle appcast + if: steps.guard_release_assets.outputs.skip_all != 'true' env: SPARKLE_PRIVATE_KEY: ${{ secrets.SPARKLE_PRIVATE_KEY }} run: | @@ -193,40 +261,6 @@ jobs: fi ./scripts/sparkle_generate_appcast.sh cmux-macos.dmg "$GITHUB_REF_NAME" appcast.xml - - name: Guard immutable release assets - id: guard_release_assets - uses: actions/github-script@v7 - with: - script: | - const { evaluateReleaseAssetGuard } = require('./scripts/release_asset_guard'); - const tag = context.ref.replace('refs/tags/', ''); - try { - const release = await github.rest.repos.getReleaseByTag({ - owner: context.repo.owner, - repo: context.repo.repo, - tag, - }); - const existingAssetNames = (release.data.assets || []).map((asset) => asset.name); - const { conflicts, shouldSkipUpload } = evaluateReleaseAssetGuard({ existingAssetNames }); - if (shouldSkipUpload) { - core.notice( - `Release ${tag} already contains immutable assets (${conflicts.join(', ')}). ` + - 'Skipping upload to preserve existing signed artifacts.' - ); - core.setOutput('skip_upload', 'true'); - return; - } - core.notice(`Release ${tag} exists but does not contain conflicting assets.`); - core.setOutput('skip_upload', 'false'); - } catch (error) { - if (error.status === 404) { - core.notice(`Release ${tag} does not exist yet; safe to publish assets.`); - core.setOutput('skip_upload', 'false'); - return; - } - throw error; - } - - name: Upload release asset if: steps.guard_release_assets.outputs.skip_upload != 'true' uses: softprops/action-gh-release@v2 diff --git a/scripts/release_asset_guard.js b/scripts/release_asset_guard.js index 0bafc2e1..d16d328e 100644 --- a/scripts/release_asset_guard.js +++ b/scripts/release_asset_guard.js @@ -1,17 +1,37 @@ "use strict"; const IMMUTABLE_RELEASE_ASSETS = ["cmux-macos.dmg", "appcast.xml"]; +const RELEASE_ASSET_GUARD_STATE = Object.freeze({ + CLEAR: "clear", + PARTIAL: "partial", + COMPLETE: "complete", +}); function evaluateReleaseAssetGuard({ existingAssetNames, immutableAssetNames = IMMUTABLE_RELEASE_ASSETS }) { + const immutableAssets = immutableAssetNames || IMMUTABLE_RELEASE_ASSETS; const existing = new Set(existingAssetNames || []); - const conflicts = immutableAssetNames.filter((assetName) => existing.has(assetName)); + const conflicts = immutableAssets.filter((assetName) => existing.has(assetName)); + const missingImmutableAssets = immutableAssets.filter((assetName) => !existing.has(assetName)); + + let guardState = RELEASE_ASSET_GUARD_STATE.CLEAR; + if (conflicts.length === immutableAssets.length && immutableAssets.length > 0) { + guardState = RELEASE_ASSET_GUARD_STATE.COMPLETE; + } else if (conflicts.length > 0) { + guardState = RELEASE_ASSET_GUARD_STATE.PARTIAL; + } + return { conflicts, - shouldSkipUpload: conflicts.length > 0, + missingImmutableAssets, + guardState, + hasPartialConflict: guardState === RELEASE_ASSET_GUARD_STATE.PARTIAL, + shouldSkipBuildAndUpload: guardState === RELEASE_ASSET_GUARD_STATE.COMPLETE, + shouldSkipUpload: guardState === RELEASE_ASSET_GUARD_STATE.COMPLETE, }; } module.exports = { IMMUTABLE_RELEASE_ASSETS, + RELEASE_ASSET_GUARD_STATE, evaluateReleaseAssetGuard, }; diff --git a/scripts/release_asset_guard.test.js b/scripts/release_asset_guard.test.js index fef57e7d..c320cf81 100644 --- a/scripts/release_asset_guard.test.js +++ b/scripts/release_asset_guard.test.js @@ -5,32 +5,45 @@ const assert = require("node:assert/strict"); const { IMMUTABLE_RELEASE_ASSETS, + RELEASE_ASSET_GUARD_STATE, evaluateReleaseAssetGuard, } = require("./release_asset_guard"); -test("skips upload when immutable assets already exist", () => { +test("marks guard as complete and skips build/upload when all immutable assets already exist", () => { const result = evaluateReleaseAssetGuard({ existingAssetNames: ["cmux-macos.dmg", "appcast.xml", "notes.txt"], }); assert.deepEqual(result.conflicts, IMMUTABLE_RELEASE_ASSETS); + assert.deepEqual(result.missingImmutableAssets, []); + assert.equal(result.guardState, RELEASE_ASSET_GUARD_STATE.COMPLETE); + assert.equal(result.hasPartialConflict, false); + assert.equal(result.shouldSkipBuildAndUpload, true); assert.equal(result.shouldSkipUpload, true); }); -test("allows upload when immutable assets are not present", () => { +test("marks guard as clear when immutable assets are not present", () => { const result = evaluateReleaseAssetGuard({ existingAssetNames: ["notes.txt", "checksums.txt"], }); assert.deepEqual(result.conflicts, []); + assert.deepEqual(result.missingImmutableAssets, IMMUTABLE_RELEASE_ASSETS); + assert.equal(result.guardState, RELEASE_ASSET_GUARD_STATE.CLEAR); + assert.equal(result.hasPartialConflict, false); + assert.equal(result.shouldSkipBuildAndUpload, false); assert.equal(result.shouldSkipUpload, false); }); -test("skips upload when any immutable asset would conflict", () => { +test("marks guard as partial when only some immutable assets exist", () => { const result = evaluateReleaseAssetGuard({ existingAssetNames: ["appcast.xml"], }); assert.deepEqual(result.conflicts, ["appcast.xml"]); - assert.equal(result.shouldSkipUpload, true); + assert.deepEqual(result.missingImmutableAssets, ["cmux-macos.dmg"]); + assert.equal(result.guardState, RELEASE_ASSET_GUARD_STATE.PARTIAL); + assert.equal(result.hasPartialConflict, true); + assert.equal(result.shouldSkipBuildAndUpload, false); + assert.equal(result.shouldSkipUpload, false); }); From fb2ae855db75173d8ad6ce478a6d927c61787e63 Mon Sep 17 00:00:00 2001 From: Austin Wang <austinwang115@gmail.com> Date: Sat, 21 Feb 2026 15:39:25 -0800 Subject: [PATCH 050/214] Light mode (#258) --- Sources/Panels/BrowserPanel.swift | 114 +++++++++++++++++- Sources/Panels/BrowserPanelView.swift | 72 ++++++++++- Sources/Workspace.swift | 22 +++- Sources/cmuxApp.swift | 45 +++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 41 +++++++ 5 files changed, 287 insertions(+), 7 deletions(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index dedcdb85..0e9b565e 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -64,6 +64,34 @@ enum BrowserSearchSettings { } } +enum BrowserForcedDarkModeSettings { + static let enabledKey = "browserForcedDarkModeEnabled" + static let opacityKey = "browserForcedDarkModeOpacity" + static let defaultEnabled: Bool = false + static let defaultOpacity: Double = 45 + static let minOpacity: Double = 5 + static let maxOpacity: Double = 90 + + static func enabled(defaults: UserDefaults = .standard) -> Bool { + if defaults.object(forKey: enabledKey) == nil { + return defaultEnabled + } + return defaults.bool(forKey: enabledKey) + } + + static func opacity(defaults: UserDefaults = .standard) -> Double { + if defaults.object(forKey: opacityKey) == nil { + return defaultOpacity + } + return normalizedOpacity(defaults.double(forKey: opacityKey)) + } + + static func normalizedOpacity(_ rawValue: Double) -> Double { + guard rawValue.isFinite else { return defaultOpacity } + return min(maxOpacity, max(minOpacity, rawValue)) + } +} + enum BrowserLinkOpenSettings { static let openTerminalLinksInCmuxBrowserKey = "browserOpenTerminalLinksInCmuxBrowser" static let defaultOpenTerminalLinksInCmuxBrowser: Bool = true @@ -1009,6 +1037,13 @@ final class BrowserPanel: Panel, ObservableObject { CGFloat(max(0.0, min(1.0, opacity))) } + private static func isDarkAppearance( + appAppearance: NSAppearance? = NSApp?.effectiveAppearance + ) -> Bool { + guard let appAppearance else { return false } + return appAppearance.bestMatch(from: [.darkAqua, .aqua]) == .darkAqua + } + private static func resolvedGhosttyBackgroundColor(from notification: Notification? = nil) -> NSColor { let userInfo = notification?.userInfo let baseColor = (userInfo?[GhosttyNotificationKey.backgroundColor] as? NSColor) @@ -1026,6 +1061,16 @@ final class BrowserPanel: Panel, ObservableObject { return baseColor.withAlphaComponent(clampedGhosttyBackgroundOpacity(opacity)) } + private static func resolvedBrowserChromeBackgroundColor( + from notification: Notification? = nil, + appAppearance: NSAppearance? = NSApp?.effectiveAppearance + ) -> NSColor { + if isDarkAppearance(appAppearance: appAppearance) { + return resolvedGhosttyBackgroundColor(from: notification) + } + return NSColor.windowBackgroundColor + } + let id: UUID let panelType: PanelType = .browser @@ -1107,6 +1152,8 @@ final class BrowserPanel: Panel, ObservableObject { private var developerToolsRestoreRetryAttempt: Int = 0 private let developerToolsRestoreRetryDelay: TimeInterval = 0.05 private let developerToolsRestoreRetryMaxAttempts: Int = 40 + private var forcedDarkModeEnabled: Bool + private var forcedDarkModeOpacity: Double var displayTitle: String { if !pageTitle.isEmpty { @@ -1130,6 +1177,8 @@ final class BrowserPanel: Panel, ObservableObject { self.id = UUID() self.workspaceId = workspaceId self.insecureHTTPBypassHostOnce = BrowserInsecureHTTPSettings.normalizeHost(bypassInsecureHTTPHostOnce ?? "") + self.forcedDarkModeEnabled = BrowserForcedDarkModeSettings.enabled() + self.forcedDarkModeOpacity = BrowserForcedDarkModeSettings.opacity() // Configure web view let config = WKWebViewConfiguration() @@ -1155,7 +1204,7 @@ final class BrowserPanel: Panel, ObservableObject { // Match the empty-page background to the terminal theme so newly-created browsers // don't flash white before content loads. - webView.underPageBackgroundColor = Self.resolvedGhosttyBackgroundColor() + webView.underPageBackgroundColor = Self.resolvedBrowserChromeBackgroundColor() // Always present as Safari. webView.customUserAgent = BrowserUserAgentSettings.safariUserAgent @@ -1168,6 +1217,7 @@ final class BrowserPanel: Panel, ObservableObject { BrowserHistoryStore.shared.recordVisit(url: webView.url, title: webView.title) Task { @MainActor [weak self] in self?.refreshFavicon(from: webView) + self?.applyForcedDarkModeIfNeeded() } } navDelegate.didFailNavigation = { [weak self] _, failedURL in @@ -1228,6 +1278,7 @@ final class BrowserPanel: Panel, ObservableObject { // Observe web view properties setupObservers() + applyForcedDarkModeIfNeeded() // Navigate to initial URL if provided if let url = initialURL { @@ -1325,7 +1376,7 @@ final class BrowserPanel: Panel, ObservableObject { NotificationCenter.default.publisher(for: .ghosttyDefaultBackgroundDidChange) .sink { [weak self] notification in guard let self else { return } - self.webView.underPageBackgroundColor = Self.resolvedGhosttyBackgroundColor(from: notification) + self.webView.underPageBackgroundColor = Self.resolvedBrowserChromeBackgroundColor(from: notification) } .store(in: &cancellables) } @@ -1973,6 +2024,16 @@ extension BrowserPanel { try await webView.evaluateJavaScript(script) } + func setForcedDarkMode(enabled: Bool, opacity: Double) { + forcedDarkModeEnabled = enabled + forcedDarkModeOpacity = BrowserForcedDarkModeSettings.normalizedOpacity(opacity) + applyForcedDarkModeIfNeeded() + } + + func refreshAppearanceDrivenColors() { + webView.underPageBackgroundColor = Self.resolvedBrowserChromeBackgroundColor() + } + func suppressOmnibarAutofocus(for seconds: TimeInterval) { suppressOmnibarAutofocusUntil = Date().addingTimeInterval(seconds) } @@ -2049,6 +2110,55 @@ extension BrowserPanel { } private extension BrowserPanel { + func applyForcedDarkModeIfNeeded() { + let script = makeForcedDarkModeScript( + enabled: forcedDarkModeEnabled, + opacityPercent: forcedDarkModeOpacity + ) + webView.evaluateJavaScript(script) { _, error in + #if DEBUG + if let error { + dlog("browser.forcedDarkMode error=\(error.localizedDescription)") + } + #endif + } + } + + func makeForcedDarkModeScript(enabled: Bool, opacityPercent: Double) -> String { + let clampedOpacity = BrowserForcedDarkModeSettings.normalizedOpacity(opacityPercent) / 100.0 + let opacityLiteral = String(format: "%.4f", clampedOpacity) + let enabledLiteral = enabled ? "true" : "false" + return """ + (() => { + const overlayId = 'cmux-forced-dark-mode-overlay'; + const shouldEnable = \(enabledLiteral); + const overlayOpacity = \(opacityLiteral); + const root = document.documentElement || document.body; + if (!root) return; + + let overlay = document.getElementById(overlayId); + if (!overlay) { + overlay = document.createElement('div'); + overlay.id = overlayId; + overlay.style.position = 'fixed'; + overlay.style.top = '0'; + overlay.style.left = '0'; + overlay.style.right = '0'; + overlay.style.bottom = '0'; + overlay.style.backgroundColor = 'black'; + overlay.style.pointerEvents = 'none'; + overlay.style.zIndex = '2147483647'; + overlay.style.transition = 'opacity 120ms ease'; + overlay.style.opacity = '0'; + root.appendChild(overlay); + } + + overlay.style.display = shouldEnable ? 'block' : 'none'; + overlay.style.opacity = shouldEnable ? String(overlayOpacity) : '0'; + })(); + """ + } + func scheduleDeveloperToolsRestoreRetry() { guard preferredDeveloperToolsVisible else { return } guard developerToolsRestoreRetryWorkItem == nil else { return } diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index aaa39f83..9be61c8e 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -162,12 +162,15 @@ struct BrowserPanelView: View { let isVisibleInUI: Bool let portalPriority: Int let onRequestPanelFocus: () -> Void + @Environment(\.colorScheme) private var colorScheme @State private var omnibarState = OmnibarState() @State private var addressBarFocused: Bool = false @AppStorage(BrowserSearchSettings.searchEngineKey) private var searchEngineRaw = BrowserSearchSettings.defaultSearchEngine.rawValue @AppStorage(BrowserSearchSettings.searchSuggestionsEnabledKey) private var searchSuggestionsEnabledStorage = BrowserSearchSettings.defaultSearchSuggestionsEnabled @AppStorage(BrowserDevToolsButtonDebugSettings.iconNameKey) private var devToolsIconNameRaw = BrowserDevToolsButtonDebugSettings.defaultIcon.rawValue @AppStorage(BrowserDevToolsButtonDebugSettings.iconColorKey) private var devToolsIconColorRaw = BrowserDevToolsButtonDebugSettings.defaultColor.rawValue + @AppStorage(BrowserForcedDarkModeSettings.enabledKey) private var forcedDarkModeEnabled = BrowserForcedDarkModeSettings.defaultEnabled + @AppStorage(BrowserForcedDarkModeSettings.opacityKey) private var forcedDarkModeOpacity = BrowserForcedDarkModeSettings.defaultOpacity @State private var suggestionTask: Task<Void, Never>? @State private var isLoadingRemoteSuggestions: Bool = false @State private var latestRemoteSuggestionQuery: String = "" @@ -218,6 +221,21 @@ struct BrowserPanelView: View { BrowserDevToolsIconColorOption(rawValue: devToolsIconColorRaw) ?? BrowserDevToolsButtonDebugSettings.defaultColor } + private var normalizedForcedDarkModeOpacity: Double { + BrowserForcedDarkModeSettings.normalizedOpacity(forcedDarkModeOpacity) + } + + private var browserChromeBackgroundColor: NSColor { + switch colorScheme { + case .dark: + return GhosttyApp.shared.defaultBackgroundColor + case .light: + return .windowBackgroundColor + @unknown default: + return .windowBackgroundColor + } + } + var body: some View { VStack(spacing: 0) { addressBar @@ -274,7 +292,14 @@ struct BrowserPanelView: View { UserDefaults.standard.register(defaults: [ BrowserSearchSettings.searchEngineKey: BrowserSearchSettings.defaultSearchEngine.rawValue, BrowserSearchSettings.searchSuggestionsEnabledKey: BrowserSearchSettings.defaultSearchSuggestionsEnabled, + BrowserForcedDarkModeSettings.enabledKey: BrowserForcedDarkModeSettings.defaultEnabled, + BrowserForcedDarkModeSettings.opacityKey: BrowserForcedDarkModeSettings.defaultOpacity, ]) + panel.refreshAppearanceDrivenColors() + panel.setForcedDarkMode( + enabled: forcedDarkModeEnabled, + opacity: normalizedForcedDarkModeOpacity + ) applyPendingAddressBarFocusRequestIfNeeded() syncURLFromPanel() // If the browser surface is focused but has no URL loaded yet, auto-focus the omnibar. @@ -296,6 +321,25 @@ struct BrowserPanelView: View { addressBarFocused = false } } + .onChange(of: forcedDarkModeEnabled) { _ in + panel.setForcedDarkMode( + enabled: forcedDarkModeEnabled, + opacity: normalizedForcedDarkModeOpacity + ) + } + .onChange(of: forcedDarkModeOpacity) { _ in + let normalized = BrowserForcedDarkModeSettings.normalizedOpacity(forcedDarkModeOpacity) + if abs(normalized - forcedDarkModeOpacity) > 0.0001 { + forcedDarkModeOpacity = normalized + } + panel.setForcedDarkMode( + enabled: forcedDarkModeEnabled, + opacity: normalized + ) + } + .onChange(of: colorScheme) { _ in + panel.refreshAppearanceDrivenColors() + } .onChange(of: panel.pendingAddressBarFocusRequestId) { _ in applyPendingAddressBarFocusRequestIfNeeded() } @@ -366,11 +410,12 @@ struct BrowserPanelView: View { .accessibilityIdentifier("BrowserOmnibarPill") .accessibilityLabel("Browser omnibar") + forcedDarkModeButton developerToolsButton } .padding(.horizontal, 8) .padding(.vertical, addressBarVerticalPadding) - .background(Color(nsColor: GhosttyApp.shared.defaultBackgroundColor)) + .background(Color(nsColor: browserChromeBackgroundColor)) // Keep the omnibar stack above WKWebView so the suggestions popup is visible. .zIndex(1) } @@ -459,6 +504,29 @@ struct BrowserPanelView: View { .accessibilityIdentifier("BrowserToggleDevToolsButton") } + private var forcedDarkModeButton: some View { + Button(action: { + forcedDarkModeEnabled.toggle() + panel.setForcedDarkMode( + enabled: forcedDarkModeEnabled, + opacity: normalizedForcedDarkModeOpacity + ) + }) { + Image(systemName: forcedDarkModeEnabled ? "moon.fill" : "moon") + .font(.system(size: devToolsButtonIconSize, weight: .medium)) + .foregroundStyle( + forcedDarkModeEnabled + ? Color.orange + : Color(nsColor: .secondaryLabelColor) + ) + .frame(width: addressBarButtonSize, height: addressBarButtonSize, alignment: .center) + } + .buttonStyle(.plain) + .frame(width: addressBarButtonSize, height: addressBarButtonSize, alignment: .center) + .help(forcedDarkModeEnabled ? "Forced Dark Mode On" : "Forced Dark Mode Off") + .accessibilityIdentifier("BrowserForcedDarkModeButton") + } + private var omnibarField: some View { let showSecureBadge = panel.currentURL?.scheme == "https" @@ -569,7 +637,7 @@ struct BrowserPanelView: View { } }) } else { - Color(nsColor: GhosttyApp.shared.defaultBackgroundColor) + Color(nsColor: browserChromeBackgroundColor) .contentShape(Rectangle()) .onTapGesture { onRequestPanelFocus() diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 17d9654c..c8cdaf24 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -300,11 +300,27 @@ final class Workspace: Identifiable, ObservableObject { bonsplitAppearance(from: config.backgroundColor) } + private static func usesDarkChrome( + appAppearance: NSAppearance? = NSApp?.effectiveAppearance + ) -> Bool { + guard let appAppearance else { return false } + return appAppearance.bestMatch(from: [.darkAqua, .aqua]) == .darkAqua + } + + private static func resolvedChromeBackgroundHex( + from backgroundColor: NSColor, + appAppearance: NSAppearance? = NSApp?.effectiveAppearance + ) -> String? { + guard usesDarkChrome(appAppearance: appAppearance) else { return nil } + return backgroundColor.hexString() + } + private static func bonsplitAppearance(from backgroundColor: NSColor) -> BonsplitConfiguration.Appearance { - BonsplitConfiguration.Appearance( + let backgroundHex = resolvedChromeBackgroundHex(from: backgroundColor) + return BonsplitConfiguration.Appearance( splitButtonTooltips: Self.currentSplitButtonTooltips(), enableAnimations: false, - chromeColors: .init(backgroundHex: backgroundColor.hexString()) + chromeColors: .init(backgroundHex: backgroundHex) ) } @@ -313,7 +329,7 @@ final class Workspace: Identifiable, ObservableObject { } func applyGhosttyChrome(backgroundColor: NSColor) { - let nextHex = backgroundColor.hexString() + let nextHex = Self.resolvedChromeBackgroundHex(from: backgroundColor) if bonsplitController.configuration.appearance.chromeColors.backgroundHex == nextHex { return } diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 3f5a72a8..3cb9d82c 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -2440,6 +2440,8 @@ struct SettingsView: View { @AppStorage("cmuxPortRange") private var cmuxPortRange = 10 @AppStorage(BrowserSearchSettings.searchEngineKey) private var browserSearchEngine = BrowserSearchSettings.defaultSearchEngine.rawValue @AppStorage(BrowserSearchSettings.searchSuggestionsEnabledKey) private var browserSearchSuggestionsEnabled = BrowserSearchSettings.defaultSearchSuggestionsEnabled + @AppStorage(BrowserForcedDarkModeSettings.enabledKey) private var browserForcedDarkModeEnabled = BrowserForcedDarkModeSettings.defaultEnabled + @AppStorage(BrowserForcedDarkModeSettings.opacityKey) private var browserForcedDarkModeOpacity = BrowserForcedDarkModeSettings.defaultOpacity @AppStorage(BrowserLinkOpenSettings.openTerminalLinksInCmuxBrowserKey) private var openTerminalLinksInCmuxBrowser = BrowserLinkOpenSettings.defaultOpenTerminalLinksInCmuxBrowser @AppStorage(BrowserLinkOpenSettings.browserHostWhitelistKey) private var browserHostWhitelist = BrowserLinkOpenSettings.defaultBrowserHostWhitelist @AppStorage(BrowserInsecureHTTPSettings.allowlistKey) private var browserInsecureHTTPAllowlist = BrowserInsecureHTTPSettings.defaultAllowlistText @@ -2642,6 +2644,46 @@ struct SettingsView: View { SettingsCardDivider() + SettingsCardRow( + "Force Dark Mode", + subtitle: "Dims bright pages in the embedded browser with a lightweight overlay." + ) { + Toggle("", isOn: $browserForcedDarkModeEnabled) + .labelsHidden() + .controlSize(.small) + } + + SettingsCardDivider() + + SettingsCardRow( + "Dimmer Opacity", + subtitle: "\(Int(BrowserForcedDarkModeSettings.normalizedOpacity(browserForcedDarkModeOpacity).rounded()))%" + ) { + HStack(spacing: 8) { + Slider( + value: Binding( + get: { + BrowserForcedDarkModeSettings.normalizedOpacity(browserForcedDarkModeOpacity) + }, + set: { newValue in + browserForcedDarkModeOpacity = BrowserForcedDarkModeSettings.normalizedOpacity(newValue) + } + ), + in: BrowserForcedDarkModeSettings.minOpacity...BrowserForcedDarkModeSettings.maxOpacity, + step: 1 + ) + .frame(width: 132) + .disabled(!browserForcedDarkModeEnabled) + + Text("\(Int(BrowserForcedDarkModeSettings.normalizedOpacity(browserForcedDarkModeOpacity).rounded()))%") + .font(.system(size: 12, weight: .medium, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 38, alignment: .trailing) + } + } + + SettingsCardDivider() + SettingsCardRow( "Open Terminal Links in cmux Browser", subtitle: "When off, links clicked in terminal output open in your default browser." @@ -2865,6 +2907,7 @@ struct SettingsView: View { .toggleStyle(.switch) .onAppear { BrowserHistoryStore.shared.loadIfNeeded() + browserForcedDarkModeOpacity = BrowserForcedDarkModeSettings.normalizedOpacity(browserForcedDarkModeOpacity) browserHistoryEntryCount = BrowserHistoryStore.shared.entries.count browserInsecureHTTPAllowlistDraft = browserInsecureHTTPAllowlist } @@ -2897,6 +2940,8 @@ struct SettingsView: View { claudeCodeHooksEnabled = ClaudeCodeIntegrationSettings.defaultHooksEnabled browserSearchEngine = BrowserSearchSettings.defaultSearchEngine.rawValue browserSearchSuggestionsEnabled = BrowserSearchSettings.defaultSearchSuggestionsEnabled + browserForcedDarkModeEnabled = BrowserForcedDarkModeSettings.defaultEnabled + browserForcedDarkModeOpacity = BrowserForcedDarkModeSettings.defaultOpacity openTerminalLinksInCmuxBrowser = BrowserLinkOpenSettings.defaultOpenTerminalLinksInCmuxBrowser browserHostWhitelist = BrowserLinkOpenSettings.defaultBrowserHostWhitelist browserInsecureHTTPAllowlist = BrowserInsecureHTTPSettings.defaultAllowlistText diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 87ee1b28..562e637e 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -183,6 +183,47 @@ final class BrowserDevToolsButtonDebugSettingsTests: XCTestCase { } } +final class BrowserForcedDarkModeSettingsTests: XCTestCase { + private func makeIsolatedDefaults() -> UserDefaults { + let suiteName = "BrowserForcedDarkModeSettingsTests.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + fatalError("Failed to create defaults suite") + } + defaults.removePersistentDomain(forName: suiteName) + addTeardownBlock { + defaults.removePersistentDomain(forName: suiteName) + } + return defaults + } + + func testDefaultsMatchConfiguredFallbacks() { + let defaults = makeIsolatedDefaults() + XCTAssertEqual( + BrowserForcedDarkModeSettings.enabled(defaults: defaults), + BrowserForcedDarkModeSettings.defaultEnabled + ) + XCTAssertEqual( + BrowserForcedDarkModeSettings.opacity(defaults: defaults), + BrowserForcedDarkModeSettings.defaultOpacity + ) + } + + func testOpacityIsClampedToSupportedRange() { + let defaults = makeIsolatedDefaults() + defaults.set(-100.0, forKey: BrowserForcedDarkModeSettings.opacityKey) + XCTAssertEqual( + BrowserForcedDarkModeSettings.opacity(defaults: defaults), + BrowserForcedDarkModeSettings.minOpacity + ) + + defaults.set(999.0, forKey: BrowserForcedDarkModeSettings.opacityKey) + XCTAssertEqual( + BrowserForcedDarkModeSettings.opacity(defaults: defaults), + BrowserForcedDarkModeSettings.maxOpacity + ) + } +} + final class BrowserDeveloperToolsShortcutDefaultsTests: XCTestCase { func testSafariDefaultShortcutForToggleDeveloperTools() { let shortcut = KeyboardShortcutSettings.Action.toggleBrowserDeveloperTools.defaultShortcut From 740b4b11e512ee4734bbc3794af16c29ff248045 Mon Sep 17 00:00:00 2001 From: Austin Wang <austinwang115@gmail.com> Date: Sat, 21 Feb 2026 17:45:52 -0800 Subject: [PATCH 051/214] Deduplicate branch context lines by directory (#288) --- CLI/cmux.swift | 39 ++++++++++++++++++++++++++++++++++++++- Sources/Workspace.swift | 41 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 74 insertions(+), 6 deletions(-) diff --git a/CLI/cmux.swift b/CLI/cmux.swift index 32e62915..d2ea40e7 100644 --- a/CLI/cmux.swift +++ b/CLI/cmux.swift @@ -4293,7 +4293,8 @@ struct CMUXCLI { ] let session = firstString(in: object, keys: ["session_id", "sessionId"]) let message = messageCandidates.compactMap { $0 }.first ?? "Claude needs your input" - let normalizedMessage = normalizedSingleLine(message) + let dedupedMessage = dedupeBranchContextLines(message) + let normalizedMessage = normalizedSingleLine(dedupedMessage) let signal = signalParts.compactMap { $0 }.joined(separator: " ") var classified = classifyClaudeNotification(signal: signal, message: normalizedMessage) @@ -4326,6 +4327,42 @@ struct CMUXCLI { return ("Attention", body) } + private func dedupeBranchContextLines(_ value: String) -> String { + let lines = value.components(separatedBy: .newlines) + guard lines.count > 1 else { return value } + + var lastIndexByPath: [String: Int] = [:] + for (index, line) in lines.enumerated() { + guard let path = branchContextPath(from: line) else { continue } + lastIndexByPath[path] = index + } + guard !lastIndexByPath.isEmpty else { return value } + + let deduped = lines.enumerated().compactMap { index, line -> String? in + guard let path = branchContextPath(from: line) else { return line } + return lastIndexByPath[path] == index ? line : nil + } + return deduped.joined(separator: "\n") + } + + private func branchContextPath(from line: String) -> String? { + let parts = line.split(separator: "•", maxSplits: 1, omittingEmptySubsequences: false) + guard parts.count == 2 else { return nil } + + let branch = parts[0].trimmingCharacters(in: .whitespacesAndNewlines) + let path = parts[1].trimmingCharacters(in: .whitespacesAndNewlines) + guard !branch.isEmpty, !path.isEmpty else { return nil } + + let looksLikePath = path.hasPrefix("/") || path.hasPrefix("~") || path.hasPrefix(".") || path.contains("/") + guard looksLikePath else { return nil } + + let trimmedQuotes = path.trimmingCharacters(in: CharacterSet(charactersIn: "`'\"")) + let expanded = NSString(string: trimmedQuotes).expandingTildeInPath + let standardized = NSString(string: expanded).standardizingPath + let normalized = standardized.trimmingCharacters(in: .whitespacesAndNewlines) + return normalized.isEmpty ? nil : normalized + } + private func firstString(in object: [String: Any], keys: [String]) -> String? { for key in keys { guard let value = object[key] else { continue } diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index c8cdaf24..547cd84b 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -125,8 +125,8 @@ enum SidebarBranchOrdering { fallbackBranch: SidebarGitBranchState? ) -> [BranchDirectoryEntry] { struct EntryKey: Hashable { - let branch: String? let directory: String? + let branch: String? } struct MutableEntry { @@ -141,6 +141,14 @@ enum SidebarBranchOrdering { return trimmed.isEmpty ? nil : trimmed } + func canonicalDirectoryKey(_ directory: String?) -> String? { + guard let directory = normalized(directory) else { return nil } + let expanded = NSString(string: directory).expandingTildeInPath + let standardized = NSString(string: expanded).standardizingPath + let cleaned = standardized.trimmingCharacters(in: .whitespacesAndNewlines) + return cleaned.isEmpty ? nil : cleaned + } + let normalizedFallbackBranch = normalized(fallbackBranch?.branch) let shouldUseFallbackBranchPerPanel = !orderedPanelIds.contains { normalized(panelBranches[$0]?.branch) != nil @@ -161,12 +169,35 @@ enum SidebarBranchOrdering { ? (panelBranches[panelId]?.isDirty ?? false) : defaultBranchDirty - let key = EntryKey(branch: branch, directory: directory) - if entries[key] == nil { + let key: EntryKey + if let directoryKey = canonicalDirectoryKey(directory) { + // Keep one line per directory and allow the latest branch state to overwrite. + key = EntryKey(directory: directoryKey, branch: nil) + } else { + key = EntryKey(directory: nil, branch: branch) + } + + guard key.directory != nil || key.branch != nil else { continue } + + if var existing = entries[key] { + if key.directory != nil { + if let branch { + existing.branch = branch + existing.isDirty = panelDirty + } else if existing.branch == nil { + existing.isDirty = panelDirty + } + if let directory { + existing.directory = directory + } + entries[key] = existing + } else if panelDirty { + existing.isDirty = true + entries[key] = existing + } + } else { order.append(key) entries[key] = MutableEntry(branch: branch, isDirty: panelDirty, directory: directory) - } else if panelDirty { - entries[key]?.isDirty = true } } From 78fe5a9b04d87fa5e2d36fd74d95016e826c1700 Mon Sep 17 00:00:00 2001 From: Austin Wang <austinwang115@gmail.com> Date: Sat, 21 Feb 2026 17:57:00 -0800 Subject: [PATCH 052/214] Fix cmux border resize icon disappearing (#284) * Keep split dividers visible in tiny panes * Fix collapsed split border resize hit-testing * Stabilize sidebar and split divider resize routing * Fix split divider resize cursor routing regressions --- Sources/BrowserWindowPortal.swift | 211 ++++++++++++++- Sources/ContentView.swift | 5 + Sources/TerminalWindowPortal.swift | 255 ++++++++++++++++-- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 119 ++++++++ vendor/bonsplit | 2 +- 5 files changed, 561 insertions(+), 31 deletions(-) diff --git a/Sources/BrowserWindowPortal.swift b/Sources/BrowserWindowPortal.swift index 86fead61..eea7e62d 100644 --- a/Sources/BrowserWindowPortal.swift +++ b/Sources/BrowserWindowPortal.swift @@ -21,10 +21,102 @@ private func browserPortalDebugFrame(_ rect: NSRect) -> String { #endif final class WindowBrowserHostView: NSView { + private struct DividerRegion { + let rectInWindow: NSRect + let isVertical: Bool + } + + private enum DividerCursorKind: Equatable { + case vertical + case horizontal + + var cursor: NSCursor { + switch self { + case .vertical: return .resizeLeftRight + case .horizontal: return .resizeUpDown + } + } + } + override var isOpaque: Bool { false } + private static let sidebarLeadingEdgeEpsilon: CGFloat = 1 + private static let minimumVisibleLeadingContentWidth: CGFloat = 24 private var cachedSidebarDividerX: CGFloat? + private var sidebarDividerMissCount = 0 + private var trackingArea: NSTrackingArea? + private var activeDividerCursorKind: DividerCursorKind? + + override func viewDidMoveToWindow() { + super.viewDidMoveToWindow() + if window == nil { + clearActiveDividerCursor() + } + window?.invalidateCursorRects(for: self) + } + + override func setFrameSize(_ newSize: NSSize) { + super.setFrameSize(newSize) + window?.invalidateCursorRects(for: self) + } + + override func setFrameOrigin(_ newOrigin: NSPoint) { + super.setFrameOrigin(newOrigin) + window?.invalidateCursorRects(for: self) + } + + override func resetCursorRects() { + super.resetCursorRects() + guard let window, let rootView = window.contentView else { return } + var regions: [DividerRegion] = [] + Self.collectSplitDividerRegions(in: rootView, into: ®ions) + let expansion: CGFloat = 4 + for region in regions { + var rectInHost = convert(region.rectInWindow, from: nil) + rectInHost = rectInHost.insetBy( + dx: region.isVertical ? -expansion : 0, + dy: region.isVertical ? 0 : -expansion + ) + let clipped = rectInHost.intersection(bounds) + guard !clipped.isNull, clipped.width > 0, clipped.height > 0 else { continue } + addCursorRect(clipped, cursor: region.isVertical ? .resizeLeftRight : .resizeUpDown) + } + } + + override func updateTrackingAreas() { + if let trackingArea { + removeTrackingArea(trackingArea) + } + let options: NSTrackingArea.Options = [ + .inVisibleRect, + .activeAlways, + .cursorUpdate, + .mouseMoved, + .mouseEnteredAndExited, + .enabledDuringMouseDrag, + ] + let next = NSTrackingArea(rect: .zero, options: options, owner: self, userInfo: nil) + addTrackingArea(next) + trackingArea = next + super.updateTrackingAreas() + } + + override func cursorUpdate(with event: NSEvent) { + let point = convert(event.locationInWindow, from: nil) + updateDividerCursor(at: point) + } + + override func mouseMoved(with event: NSEvent) { + let point = convert(event.locationInWindow, from: nil) + updateDividerCursor(at: point) + } + + override func mouseExited(with event: NSEvent) { + clearActiveDividerCursor() + } override func hitTest(_ point: NSPoint) -> NSView? { + updateDividerCursor(at: point) + if shouldPassThroughToSidebarResizer(at: point) { return nil } @@ -41,13 +133,40 @@ final class WindowBrowserHostView: NSView { let visibleSlots = subviews.compactMap { $0 as? WindowBrowserSlotView } .filter { !$0.isHidden && $0.window != nil && $0.frame.width > 1 && $0.frame.height > 1 } + // If content is flush to the leading edge, sidebar is effectively hidden. + // In that state, treating any internal split edge as a sidebar divider + // steals split-divider cursor/drag behavior. + let hasLeadingContent = visibleSlots.contains { + $0.frame.minX <= Self.sidebarLeadingEdgeEpsilon + && $0.frame.maxX > Self.minimumVisibleLeadingContentWidth + } + if hasLeadingContent { + if cachedSidebarDividerX != nil { + sidebarDividerMissCount += 1 + if sidebarDividerMissCount >= 2 { + cachedSidebarDividerX = nil + sidebarDividerMissCount = 0 + } + } + return false + } + // Ignore transient 0-origin slots during layout churn and preserve the last // known-good divider edge. let dividerCandidates = visibleSlots .map(\.frame.minX) - .filter { $0 > 1 } + .filter { $0 > Self.sidebarLeadingEdgeEpsilon } if let leftMostEdge = dividerCandidates.min() { cachedSidebarDividerX = leftMostEdge + sidebarDividerMissCount = 0 + } else if cachedSidebarDividerX != nil { + // Keep cache briefly for layout churn, but clear if we miss repeatedly + // so stale divider positions don't steal pointer routing. + sidebarDividerMissCount += 1 + if sidebarDividerMissCount >= 4 { + cachedSidebarDividerX = nil + sidebarDividerMissCount = 0 + } } guard let dividerX = cachedSidebarDividerX else { @@ -59,15 +178,39 @@ final class WindowBrowserHostView: NSView { return point.x >= regionMinX && point.x <= regionMaxX } - private func shouldPassThroughToSplitDivider(at point: NSPoint) -> Bool { - guard let window else { return false } - let windowPoint = convert(point, to: nil) - guard let rootView = window.contentView else { return false } - return Self.containsSplitDivider(at: windowPoint, in: rootView) + private func updateDividerCursor(at point: NSPoint) { + if shouldPassThroughToSidebarResizer(at: point) { + clearActiveDividerCursor() + return + } + + guard let nextKind = splitDividerCursorKind(at: point) else { + clearActiveDividerCursor() + return + } + activeDividerCursorKind = nextKind + nextKind.cursor.set() } - private static func containsSplitDivider(at windowPoint: NSPoint, in view: NSView) -> Bool { - guard !view.isHidden else { return false } + private func clearActiveDividerCursor() { + guard activeDividerCursorKind != nil else { return } + window?.invalidateCursorRects(for: self) + activeDividerCursorKind = nil + } + + private func splitDividerCursorKind(at point: NSPoint) -> DividerCursorKind? { + guard let window else { return nil } + let windowPoint = convert(point, to: nil) + guard let rootView = window.contentView else { return nil } + return Self.dividerCursorKind(at: windowPoint, in: rootView) + } + + private func shouldPassThroughToSplitDivider(at point: NSPoint) -> Bool { + splitDividerCursorKind(at: point) != nil + } + + private static func dividerCursorKind(at windowPoint: NSPoint, in view: NSView) -> DividerCursorKind? { + guard !view.isHidden else { return nil } if let splitView = view as? NSSplitView { let pointInSplit = splitView.convert(windowPoint, from: nil) @@ -80,7 +223,10 @@ final class WindowBrowserHostView: NSView { let thickness = splitView.dividerThickness let dividerRect: NSRect if splitView.isVertical { - guard first.width > 1, second.width > 1 else { continue } + // Keep divider hit-testing active even when one side is nearly collapsed, + // so users can drag the divider back out from the border. + // But ignore transient states where both panes are effectively 0-width. + guard first.width > 1 || second.width > 1 else { continue } let x = max(0, first.maxX) dividerRect = NSRect( x: x, @@ -89,7 +235,8 @@ final class WindowBrowserHostView: NSView { height: splitView.bounds.height ) } else { - guard first.height > 1, second.height > 1 else { continue } + // Same behavior for horizontal splits with a near-zero-height pane. + guard first.height > 1 || second.height > 1 else { continue } let y = max(0, first.maxY) dividerRect = NSRect( x: 0, @@ -100,20 +247,56 @@ final class WindowBrowserHostView: NSView { } let expanded = dividerRect.insetBy(dx: -expansion, dy: -expansion) if expanded.contains(pointInSplit) { - return true + return splitView.isVertical ? .vertical : .horizontal } } } } for subview in view.subviews.reversed() { - if containsSplitDivider(at: windowPoint, in: subview) { - return true + if let kind = dividerCursorKind(at: windowPoint, in: subview) { + return kind } } - return false + return nil } + + private static func collectSplitDividerRegions(in view: NSView, into result: inout [DividerRegion]) { + guard !view.isHidden else { return } + + if let splitView = view as? NSSplitView { + let dividerCount = max(0, splitView.arrangedSubviews.count - 1) + for dividerIndex in 0..<dividerCount { + let first = splitView.arrangedSubviews[dividerIndex].frame + let second = splitView.arrangedSubviews[dividerIndex + 1].frame + let thickness = splitView.dividerThickness + let dividerRect: NSRect + if splitView.isVertical { + guard first.width > 1 || second.width > 1 else { continue } + let x = max(0, first.maxX) + dividerRect = NSRect(x: x, y: 0, width: thickness, height: splitView.bounds.height) + } else { + guard first.height > 1 || second.height > 1 else { continue } + let y = max(0, first.maxY) + dividerRect = NSRect(x: 0, y: y, width: splitView.bounds.width, height: thickness) + } + let dividerRectInWindow = splitView.convert(dividerRect, to: nil) + guard dividerRectInWindow.width > 0, dividerRectInWindow.height > 0 else { continue } + result.append( + DividerRegion( + rectInWindow: dividerRectInWindow, + isVertical: splitView.isVertical + ) + ) + } + } + + for subview in view.subviews { + collectSplitDividerRegions(in: subview, into: &result) + } + } + } final class WindowBrowserSlotView: NSView { diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 02dc2311..4ad00b12 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -824,6 +824,7 @@ struct ContentView: View { @State private var sidebarResizerCursorReleaseWorkItem: DispatchWorkItem? @State private var sidebarResizerPointerMonitor: Any? @State private var isResizerBandActive = false + @State private var isSidebarResizerCursorActive = false @State private var sidebarResizerCursorStabilizer: DispatchSourceTimer? private static let fixedSidebarResizeCursor = NSCursor( @@ -846,6 +847,7 @@ struct ContentView: View { private func activateSidebarResizerCursor() { sidebarResizerCursorReleaseWorkItem?.cancel() sidebarResizerCursorReleaseWorkItem = nil + isSidebarResizerCursorActive = true Self.fixedSidebarResizeCursor.set() } @@ -854,6 +856,8 @@ struct ContentView: View { let shouldKeepCursor = !force && (isResizerDragging || isResizerBandActive || !hoveredResizerHandles.isEmpty || isLeftMouseButtonDown) guard !shouldKeepCursor else { return } + guard isSidebarResizerCursorActive else { return } + isSidebarResizerCursorActive = false NSCursor.arrow.set() } @@ -974,6 +978,7 @@ struct ContentView: View { sidebarResizerPointerMonitor = nil } isResizerBandActive = false + isSidebarResizerCursorActive = false stopSidebarResizerCursorStabilizer() scheduleSidebarResizerCursorRelease(force: true) } diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index a4d37f7c..77cf72f5 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -20,13 +20,105 @@ private func portalDebugFrame(_ rect: NSRect) -> String { #endif final class WindowTerminalHostView: NSView { + private struct DividerRegion { + let rectInWindow: NSRect + let isVertical: Bool + } + + private enum DividerCursorKind: Equatable { + case vertical + case horizontal + + var cursor: NSCursor { + switch self { + case .vertical: return .resizeLeftRight + case .horizontal: return .resizeUpDown + } + } + } + override var isOpaque: Bool { false } + private static let sidebarLeadingEdgeEpsilon: CGFloat = 1 + private static let minimumVisibleLeadingContentWidth: CGFloat = 24 private var cachedSidebarDividerX: CGFloat? + private var sidebarDividerMissCount = 0 + private var trackingArea: NSTrackingArea? + private var activeDividerCursorKind: DividerCursorKind? #if DEBUG private var lastDragRouteSignature: String? #endif + override func viewDidMoveToWindow() { + super.viewDidMoveToWindow() + if window == nil { + clearActiveDividerCursor() + } + window?.invalidateCursorRects(for: self) + } + + override func setFrameSize(_ newSize: NSSize) { + super.setFrameSize(newSize) + window?.invalidateCursorRects(for: self) + } + + override func setFrameOrigin(_ newOrigin: NSPoint) { + super.setFrameOrigin(newOrigin) + window?.invalidateCursorRects(for: self) + } + + override func resetCursorRects() { + super.resetCursorRects() + guard let window, let rootView = window.contentView else { return } + var regions: [DividerRegion] = [] + Self.collectSplitDividerRegions(in: rootView, into: ®ions) + let expansion: CGFloat = 4 + for region in regions { + var rectInHost = convert(region.rectInWindow, from: nil) + rectInHost = rectInHost.insetBy( + dx: region.isVertical ? -expansion : 0, + dy: region.isVertical ? 0 : -expansion + ) + let clipped = rectInHost.intersection(bounds) + guard !clipped.isNull, clipped.width > 0, clipped.height > 0 else { continue } + addCursorRect(clipped, cursor: region.isVertical ? .resizeLeftRight : .resizeUpDown) + } + } + + override func updateTrackingAreas() { + if let trackingArea { + removeTrackingArea(trackingArea) + } + let options: NSTrackingArea.Options = [ + .inVisibleRect, + .activeAlways, + .cursorUpdate, + .mouseMoved, + .mouseEnteredAndExited, + .enabledDuringMouseDrag, + ] + let next = NSTrackingArea(rect: .zero, options: options, owner: self, userInfo: nil) + addTrackingArea(next) + trackingArea = next + super.updateTrackingAreas() + } + + override func cursorUpdate(with event: NSEvent) { + let point = convert(event.locationInWindow, from: nil) + updateDividerCursor(at: point) + } + + override func mouseMoved(with event: NSEvent) { + let point = convert(event.locationInWindow, from: nil) + updateDividerCursor(at: point) + } + + override func mouseExited(with event: NSEvent) { + clearActiveDividerCursor() + } + override func hitTest(_ point: NSPoint) -> NSView? { + updateDividerCursor(at: point) + if shouldPassThroughToSidebarResizer(at: point) { return nil } @@ -72,14 +164,41 @@ final class WindowTerminalHostView: NSView { let visibleHostedViews = subviews.compactMap { $0 as? GhosttySurfaceScrollView } .filter { !$0.isHidden && $0.window != nil && $0.frame.width > 1 && $0.frame.height > 1 } + // If content is flush to the leading edge, sidebar is effectively hidden. + // In that state, treating any internal split edge as a sidebar divider + // steals split-divider cursor/drag behavior. + let hasLeadingContent = visibleHostedViews.contains { + $0.frame.minX <= Self.sidebarLeadingEdgeEpsilon + && $0.frame.maxX > Self.minimumVisibleLeadingContentWidth + } + if hasLeadingContent { + if cachedSidebarDividerX != nil { + sidebarDividerMissCount += 1 + if sidebarDividerMissCount >= 2 { + cachedSidebarDividerX = nil + sidebarDividerMissCount = 0 + } + } + return false + } + // Ignore transient 0-origin hosts while layouts churn (e.g. workspace // creation/switching). They can temporarily report minX=0 and would // otherwise clear divider pass-through, causing hover flicker. let dividerCandidates = visibleHostedViews .map(\.frame.minX) - .filter { $0 > 1 } + .filter { $0 > Self.sidebarLeadingEdgeEpsilon } if let leftMostEdge = dividerCandidates.min() { cachedSidebarDividerX = leftMostEdge + sidebarDividerMissCount = 0 + } else if cachedSidebarDividerX != nil { + // Keep cache briefly for layout churn, but clear if we miss repeatedly + // so stale divider positions don't steal pointer routing. + sidebarDividerMissCount += 1 + if sidebarDividerMissCount >= 4 { + cachedSidebarDividerX = nil + sidebarDividerMissCount = 0 + } } guard let dividerX = cachedSidebarDividerX else { @@ -91,15 +210,39 @@ final class WindowTerminalHostView: NSView { return point.x >= regionMinX && point.x <= regionMaxX } - private func shouldPassThroughToSplitDivider(at point: NSPoint) -> Bool { - guard let window else { return false } - let windowPoint = convert(point, to: nil) - guard let rootView = window.contentView else { return false } - return Self.containsSplitDivider(at: windowPoint, in: rootView) + private func updateDividerCursor(at point: NSPoint) { + if shouldPassThroughToSidebarResizer(at: point) { + clearActiveDividerCursor() + return + } + + guard let nextKind = splitDividerCursorKind(at: point) else { + clearActiveDividerCursor() + return + } + activeDividerCursorKind = nextKind + nextKind.cursor.set() } - private static func containsSplitDivider(at windowPoint: NSPoint, in view: NSView) -> Bool { - guard !view.isHidden else { return false } + private func clearActiveDividerCursor() { + guard activeDividerCursorKind != nil else { return } + window?.invalidateCursorRects(for: self) + activeDividerCursorKind = nil + } + + private func splitDividerCursorKind(at point: NSPoint) -> DividerCursorKind? { + guard let window else { return nil } + let windowPoint = convert(point, to: nil) + guard let rootView = window.contentView else { return nil } + return Self.dividerCursorKind(at: windowPoint, in: rootView) + } + + private func shouldPassThroughToSplitDivider(at point: NSPoint) -> Bool { + splitDividerCursorKind(at: point) != nil + } + + private static func dividerCursorKind(at windowPoint: NSPoint, in view: NSView) -> DividerCursorKind? { + guard !view.isHidden else { return nil } if let splitView = view as? NSSplitView { let pointInSplit = splitView.convert(windowPoint, from: nil) @@ -114,7 +257,10 @@ final class WindowTerminalHostView: NSView { let thickness = splitView.dividerThickness let dividerRect: NSRect if splitView.isVertical { - guard first.width > 1, second.width > 1 else { continue } + // Keep divider hit-testing active even when one side is nearly collapsed, + // so users can drag the divider back out from the border. + // But ignore transient states where both panes are effectively 0-width. + guard first.width > 1 || second.width > 1 else { continue } let x = max(0, first.maxX) dividerRect = NSRect( x: x, @@ -123,7 +269,8 @@ final class WindowTerminalHostView: NSView { height: splitView.bounds.height ) } else { - guard first.height > 1, second.height > 1 else { continue } + // Same behavior for horizontal splits with a near-zero-height pane. + guard first.height > 1 || second.height > 1 else { continue } let y = max(0, first.maxY) dividerRect = NSRect( x: 0, @@ -134,19 +281,54 @@ final class WindowTerminalHostView: NSView { } let expandedDividerRect = dividerRect.insetBy(dx: -expansion, dy: -expansion) if expandedDividerRect.contains(pointInSplit) { - return true + return splitView.isVertical ? .vertical : .horizontal } } } } for subview in view.subviews.reversed() { - if containsSplitDivider(at: windowPoint, in: subview) { - return true + if let kind = dividerCursorKind(at: windowPoint, in: subview) { + return kind } } - return false + return nil + } + + private static func collectSplitDividerRegions(in view: NSView, into result: inout [DividerRegion]) { + guard !view.isHidden else { return } + + if let splitView = view as? NSSplitView { + let dividerCount = max(0, splitView.arrangedSubviews.count - 1) + for dividerIndex in 0..<dividerCount { + let first = splitView.arrangedSubviews[dividerIndex].frame + let second = splitView.arrangedSubviews[dividerIndex + 1].frame + let thickness = splitView.dividerThickness + let dividerRect: NSRect + if splitView.isVertical { + guard first.width > 1 || second.width > 1 else { continue } + let x = max(0, first.maxX) + dividerRect = NSRect(x: x, y: 0, width: thickness, height: splitView.bounds.height) + } else { + guard first.height > 1 || second.height > 1 else { continue } + let y = max(0, first.maxY) + dividerRect = NSRect(x: 0, y: y, width: splitView.bounds.width, height: thickness) + } + let dividerRectInWindow = splitView.convert(dividerRect, to: nil) + guard dividerRectInWindow.width > 0, dividerRectInWindow.height > 0 else { continue } + result.append( + DividerRegion( + rectInWindow: dividerRectInWindow, + isVertical: splitView.isVertical + ) + ) + } + } + + for subview in view.subviews { + collectSplitDividerRegions(in: subview, into: &result) + } } #if DEBUG @@ -213,6 +395,7 @@ private final class SplitDividerOverlayView: NSView { private struct DividerSegment { let rect: NSRect let color: NSColor + let isVertical: Bool } override var isOpaque: Bool { false } @@ -227,13 +410,16 @@ private final class SplitDividerOverlayView: NSView { var dividerSegments: [DividerSegment] = [] collectDividerSegments(in: rootView, into: ÷rSegments) guard !dividerSegments.isEmpty else { return } + let hostedFrames = hostedFramesLikelyToOccludeDividers() + let visibleSegments = dividerSegments.filter { shouldRenderOverlay(for: $0, hostedFrames: hostedFrames) } + guard !visibleSegments.isEmpty else { return } NSGraphicsContext.saveGraphicsState() defer { NSGraphicsContext.restoreGraphicsState() } // Keep separators visible above portal-hosted surfaces while matching each split view's // native divider color (avoids visible color shifts at tiny pane sizes). - for segment in dividerSegments where segment.rect.intersects(dirtyRect) { + for segment in visibleSegments where segment.rect.intersects(dirtyRect) { segment.color.setFill() let rect = segment.rect let pixelAligned = NSRect( @@ -275,7 +461,13 @@ private final class SplitDividerOverlayView: NSView { let dividerRectInWindow = splitView.convert(dividerRectInSplit, to: nil) let dividerRectInOverlay = convert(dividerRectInWindow, from: nil) if dividerRectInOverlay.intersects(bounds) { - result.append(DividerSegment(rect: dividerRectInOverlay, color: dividerColor)) + result.append( + DividerSegment( + rect: dividerRectInOverlay, + color: dividerColor, + isVertical: splitView.isVertical + ) + ) } } } @@ -285,6 +477,37 @@ private final class SplitDividerOverlayView: NSView { } } + private func hostedFramesLikelyToOccludeDividers() -> [NSRect] { + guard let hostView = superview else { return [] } + return hostView.subviews.compactMap { subview -> NSRect? in + guard let hosted = subview as? GhosttySurfaceScrollView else { return nil } + guard !hosted.isHidden, hosted.window != nil else { return nil } + return hosted.frame + } + } + + private func shouldRenderOverlay(for segment: DividerSegment, hostedFrames: [NSRect]) -> Bool { + // Draw only when a hosted surface actually intrudes across the divider centerline. + // This preserves tiny-pane visibility fixes without darkening regular dividers. + let axisEpsilon: CGFloat = 0.01 + let axis = segment.isVertical ? segment.rect.midX : segment.rect.midY + let extentRect = segment.rect.insetBy( + dx: segment.isVertical ? 0 : -1, + dy: segment.isVertical ? -1 : 0 + ) + + for frame in hostedFrames where frame.intersects(extentRect) { + if segment.isVertical { + if frame.minX < axis - axisEpsilon && frame.maxX > axis + axisEpsilon { + return true + } + } else if frame.minY < axis - axisEpsilon && frame.maxY > axis + axisEpsilon { + return true + } + } + return false + } + private func overlayDividerColor(for splitView: NSSplitView) -> NSColor { let divider = splitView.dividerColor.usingColorSpace(.deviceRGB) ?? splitView.dividerColor let alpha = divider.alphaComponent diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 562e637e..7514d1e6 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -2909,6 +2909,8 @@ final class WindowTerminalHostViewTests: XCTestCase { } } + private final class BonsplitMockSplitDelegate: NSObject, NSSplitViewDelegate {} + func testHostViewPassesThroughWhenNoTerminalSubviewIsHit() { let host = WindowTerminalHostView(frame: NSRect(x: 0, y: 0, width: 200, height: 120)) @@ -2923,6 +2925,123 @@ final class WindowTerminalHostViewTests: XCTestCase { XCTAssertTrue(host.hitTest(NSPoint(x: 25, y: 20)) === child) XCTAssertNil(host.hitTest(NSPoint(x: 150, y: 100))) } + + func testHostViewPassesThroughDividerWhenAdjacentPaneIsCollapsed() { + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 300, height: 180), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + defer { window.orderOut(nil) } + guard let contentView = window.contentView else { + XCTFail("Expected content view") + return + } + + let splitView = NSSplitView(frame: contentView.bounds) + splitView.autoresizingMask = [.width, .height] + splitView.isVertical = true + splitView.dividerStyle = .thin + let splitDelegate = BonsplitMockSplitDelegate() + splitView.delegate = splitDelegate + let first = NSView(frame: NSRect(x: 0, y: 0, width: 120, height: contentView.bounds.height)) + let second = NSView(frame: NSRect(x: 121, y: 0, width: 179, height: contentView.bounds.height)) + splitView.addSubview(first) + splitView.addSubview(second) + contentView.addSubview(splitView) + splitView.setPosition(1, ofDividerAt: 0) + splitView.adjustSubviews() + contentView.layoutSubtreeIfNeeded() + + let host = WindowTerminalHostView(frame: contentView.bounds) + host.autoresizingMask = [.width, .height] + let child = CapturingView(frame: host.bounds) + child.autoresizingMask = [.width, .height] + host.addSubview(child) + contentView.addSubview(host) + + let dividerPointInSplit = NSPoint( + x: splitView.arrangedSubviews[0].frame.maxX + (splitView.dividerThickness * 0.5), + y: splitView.bounds.midY + ) + let dividerPointInWindow = splitView.convert(dividerPointInSplit, to: nil) + let dividerPointInHost = host.convert(dividerPointInWindow, from: nil) + XCTAssertLessThanOrEqual(splitView.arrangedSubviews[0].frame.width, 1.5) + XCTAssertNil( + host.hitTest(dividerPointInHost), + "Host view must pass through divider hits even when one pane is nearly collapsed" + ) + + let contentPointInSplit = NSPoint(x: dividerPointInSplit.x + 40, y: splitView.bounds.midY) + let contentPointInWindow = splitView.convert(contentPointInSplit, to: nil) + let contentPointInHost = host.convert(contentPointInWindow, from: nil) + XCTAssertTrue(host.hitTest(contentPointInHost) === child) + } +} + +@MainActor +final class WindowBrowserHostViewTests: XCTestCase { + private final class CapturingView: NSView { + override func hitTest(_ point: NSPoint) -> NSView? { + bounds.contains(point) ? self : nil + } + } + + private final class BonsplitMockSplitDelegate: NSObject, NSSplitViewDelegate {} + + func testHostViewPassesThroughDividerWhenAdjacentPaneIsCollapsed() { + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 300, height: 180), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + defer { window.orderOut(nil) } + guard let contentView = window.contentView else { + XCTFail("Expected content view") + return + } + + let splitView = NSSplitView(frame: contentView.bounds) + splitView.autoresizingMask = [.width, .height] + splitView.isVertical = true + splitView.dividerStyle = .thin + let splitDelegate = BonsplitMockSplitDelegate() + splitView.delegate = splitDelegate + let first = NSView(frame: NSRect(x: 0, y: 0, width: 120, height: contentView.bounds.height)) + let second = NSView(frame: NSRect(x: 121, y: 0, width: 179, height: contentView.bounds.height)) + splitView.addSubview(first) + splitView.addSubview(second) + contentView.addSubview(splitView) + splitView.setPosition(1, ofDividerAt: 0) + splitView.adjustSubviews() + contentView.layoutSubtreeIfNeeded() + + let host = WindowBrowserHostView(frame: contentView.bounds) + host.autoresizingMask = [.width, .height] + let child = CapturingView(frame: host.bounds) + child.autoresizingMask = [.width, .height] + host.addSubview(child) + contentView.addSubview(host) + + let dividerPointInSplit = NSPoint( + x: splitView.arrangedSubviews[0].frame.maxX + (splitView.dividerThickness * 0.5), + y: splitView.bounds.midY + ) + let dividerPointInWindow = splitView.convert(dividerPointInSplit, to: nil) + let dividerPointInHost = host.convert(dividerPointInWindow, from: nil) + XCTAssertLessThanOrEqual(splitView.arrangedSubviews[0].frame.width, 1.5) + XCTAssertNil( + host.hitTest(dividerPointInHost), + "Browser host must pass through divider hits even when one pane is nearly collapsed" + ) + + let contentPointInSplit = NSPoint(x: dividerPointInSplit.x + 40, y: splitView.bounds.midY) + let contentPointInWindow = splitView.convert(contentPointInSplit, to: nil) + let contentPointInHost = host.convert(contentPointInWindow, from: nil) + XCTAssertTrue(host.hitTest(contentPointInHost) === child) + } } @MainActor diff --git a/vendor/bonsplit b/vendor/bonsplit index 6e50afe6..cf929c88 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit 6e50afe6d65b933c7bf2266544b69dad182daa73 +Subproject commit cf929c887af79ea8b881e39da5b8c4ee1d6b9009 From 8f2a52fbf2ec901f217d026da965ad2337eb606d Mon Sep 17 00:00:00 2001 From: Austin Wang <austinwang115@gmail.com> Date: Sat, 21 Feb 2026 18:19:14 -0800 Subject: [PATCH 053/214] Fix stuck split resize cursor outside divider range (#291) * Keep split dividers visible in tiny panes * Fix collapsed split border resize hit-testing * Stabilize sidebar and split divider resize routing * Fix split divider resize cursor routing regressions * Fix stuck split resize cursor outside divider range --- Sources/BrowserWindowPortal.swift | 13 ++++++++----- Sources/TerminalWindowPortal.swift | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Sources/BrowserWindowPortal.swift b/Sources/BrowserWindowPortal.swift index eea7e62d..8da7833c 100644 --- a/Sources/BrowserWindowPortal.swift +++ b/Sources/BrowserWindowPortal.swift @@ -49,7 +49,7 @@ final class WindowBrowserHostView: NSView { override func viewDidMoveToWindow() { super.viewDidMoveToWindow() if window == nil { - clearActiveDividerCursor() + clearActiveDividerCursor(restoreArrow: false) } window?.invalidateCursorRects(for: self) } @@ -111,7 +111,7 @@ final class WindowBrowserHostView: NSView { } override func mouseExited(with event: NSEvent) { - clearActiveDividerCursor() + clearActiveDividerCursor(restoreArrow: true) } override func hitTest(_ point: NSPoint) -> NSView? { @@ -180,22 +180,25 @@ final class WindowBrowserHostView: NSView { private func updateDividerCursor(at point: NSPoint) { if shouldPassThroughToSidebarResizer(at: point) { - clearActiveDividerCursor() + clearActiveDividerCursor(restoreArrow: false) return } guard let nextKind = splitDividerCursorKind(at: point) else { - clearActiveDividerCursor() + clearActiveDividerCursor(restoreArrow: true) return } activeDividerCursorKind = nextKind nextKind.cursor.set() } - private func clearActiveDividerCursor() { + private func clearActiveDividerCursor(restoreArrow: Bool) { guard activeDividerCursorKind != nil else { return } window?.invalidateCursorRects(for: self) activeDividerCursorKind = nil + if restoreArrow { + NSCursor.arrow.set() + } } private func splitDividerCursorKind(at point: NSPoint) -> DividerCursorKind? { diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index 77cf72f5..07831c71 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -51,7 +51,7 @@ final class WindowTerminalHostView: NSView { override func viewDidMoveToWindow() { super.viewDidMoveToWindow() if window == nil { - clearActiveDividerCursor() + clearActiveDividerCursor(restoreArrow: false) } window?.invalidateCursorRects(for: self) } @@ -113,7 +113,7 @@ final class WindowTerminalHostView: NSView { } override func mouseExited(with event: NSEvent) { - clearActiveDividerCursor() + clearActiveDividerCursor(restoreArrow: true) } override func hitTest(_ point: NSPoint) -> NSView? { @@ -212,22 +212,25 @@ final class WindowTerminalHostView: NSView { private func updateDividerCursor(at point: NSPoint) { if shouldPassThroughToSidebarResizer(at: point) { - clearActiveDividerCursor() + clearActiveDividerCursor(restoreArrow: false) return } guard let nextKind = splitDividerCursorKind(at: point) else { - clearActiveDividerCursor() + clearActiveDividerCursor(restoreArrow: true) return } activeDividerCursorKind = nextKind nextKind.cursor.set() } - private func clearActiveDividerCursor() { + private func clearActiveDividerCursor(restoreArrow: Bool) { guard activeDividerCursorKind != nil else { return } window?.invalidateCursorRects(for: self) activeDividerCursorKind = nil + if restoreArrow { + NSCursor.arrow.set() + } } private func splitDividerCursorKind(at point: NSPoint) -> DividerCursorKind? { From 4c733d4e8ef3faf2a36560a383cb0e8db5f839d1 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sat, 21 Feb 2026 21:53:39 -0800 Subject: [PATCH 054/214] Add Cmd+Q quit warning with suppression toggle (#295) --- Sources/AppDelegate.swift | 31 +++++++++++++++++++ Sources/cmuxApp.swift | 31 +++++++++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 30 ++++++++++++++++++ 3 files changed, 92 insertions(+) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index debc0e09..3f71d164 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1647,6 +1647,32 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return StoredShortcut(key: key, command: command, shift: shift, option: option, control: control) } + private func handleQuitShortcutWarning() -> Bool { + if !QuitWarningSettings.isEnabled() { + NSApp.terminate(nil) + return true + } + + let alert = NSAlert() + alert.alertStyle = .warning + alert.messageText = "Quit cmux?" + alert.informativeText = "This will close all windows and workspaces." + alert.addButton(withTitle: "Quit") + alert.addButton(withTitle: "Cancel") + alert.showsSuppressionButton = true + alert.suppressionButton?.title = "Don't warn again for Cmd+Q" + + let response = alert.runModal() + if alert.suppressionButton?.state == .on { + QuitWarningSettings.setEnabled(false) + } + + if response == .alertFirstButtonReturn { + NSApp.terminate(nil) + } + return true + } + private func handleCustomShortcut(event: NSEvent) -> Bool { // `charactersIgnoringModifiers` can be nil for some synthetic NSEvents and certain special keys. // Most shortcuts below use keyCode fallbacks, so treat nil as "" rather than bailing out. @@ -1698,6 +1724,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return false } + let normalizedFlags = flags.subtracting([.numericPad, .function]) + if normalizedFlags == [.command], chars == "q" { + return handleQuitShortcutWarning() + } + // When the terminal has active IME composition (e.g. Korean, Japanese, Chinese // input), don't intercept key events — let them flow through to the input method. if let ghosttyView = NSApp.keyWindow?.firstResponder as? GhosttyNSView, diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 3cb9d82c..0fa8eedb 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -2416,6 +2416,22 @@ enum AppearanceSettings { } } +enum QuitWarningSettings { + static let warnBeforeQuitKey = "warnBeforeQuitShortcut" + static let defaultWarnBeforeQuit = true + + static func isEnabled(defaults: UserDefaults = .standard) -> Bool { + if defaults.object(forKey: warnBeforeQuitKey) == nil { + return defaultWarnBeforeQuit + } + return defaults.bool(forKey: warnBeforeQuitKey) + } + + static func setEnabled(_ isEnabled: Bool, defaults: UserDefaults = .standard) { + defaults.set(isEnabled, forKey: warnBeforeQuitKey) + } +} + enum ClaudeCodeIntegrationSettings { static let hooksEnabledKey = "claudeCodeHooksEnabled" static let defaultHooksEnabled = true @@ -2446,6 +2462,7 @@ struct SettingsView: View { @AppStorage(BrowserLinkOpenSettings.browserHostWhitelistKey) private var browserHostWhitelist = BrowserLinkOpenSettings.defaultBrowserHostWhitelist @AppStorage(BrowserInsecureHTTPSettings.allowlistKey) private var browserInsecureHTTPAllowlist = BrowserInsecureHTTPSettings.defaultAllowlistText @AppStorage(NotificationBadgeSettings.dockBadgeEnabledKey) private var notificationDockBadgeEnabled = NotificationBadgeSettings.defaultDockBadgeEnabled + @AppStorage(QuitWarningSettings.warnBeforeQuitKey) private var warnBeforeQuitShortcut = QuitWarningSettings.defaultWarnBeforeQuit @AppStorage(WorkspacePlacementSettings.placementKey) private var newWorkspacePlacement = WorkspacePlacementSettings.defaultPlacement.rawValue @AppStorage(WorkspaceAutoReorderSettings.key) private var workspaceAutoReorder = WorkspaceAutoReorderSettings.defaultValue @AppStorage(SidebarBranchLayoutSettings.key) private var sidebarBranchVerticalLayout = SidebarBranchLayoutSettings.defaultVerticalLayout @@ -2542,6 +2559,19 @@ struct SettingsView: View { SettingsCardDivider() + SettingsCardRow( + "Warn Before Quit", + subtitle: warnBeforeQuitShortcut + ? "Show a confirmation before quitting with Cmd+Q." + : "Cmd+Q quits immediately without confirmation." + ) { + Toggle("", isOn: $warnBeforeQuitShortcut) + .labelsHidden() + .controlSize(.small) + } + + SettingsCardDivider() + SettingsCardRow( "Sidebar Branch Layout", subtitle: sidebarBranchVerticalLayout @@ -2947,6 +2977,7 @@ struct SettingsView: View { browserInsecureHTTPAllowlist = BrowserInsecureHTTPSettings.defaultAllowlistText browserInsecureHTTPAllowlistDraft = BrowserInsecureHTTPSettings.defaultAllowlistText notificationDockBadgeEnabled = NotificationBadgeSettings.defaultDockBadgeEnabled + warnBeforeQuitShortcut = QuitWarningSettings.defaultWarnBeforeQuit newWorkspacePlacement = WorkspacePlacementSettings.defaultPlacement.rawValue workspaceAutoReorder = WorkspaceAutoReorderSettings.defaultValue sidebarBranchVerticalLayout = SidebarBranchLayoutSettings.defaultVerticalLayout diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 7514d1e6..0b48bb1d 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -886,6 +886,36 @@ final class AppearanceSettingsTests: XCTestCase { } } +final class QuitWarningSettingsTests: XCTestCase { + func testDefaultWarnBeforeQuitIsEnabledWhenUnset() { + let suiteName = "QuitWarningSettingsTests.Default.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Failed to create isolated UserDefaults suite") + return + } + defer { defaults.removePersistentDomain(forName: suiteName) } + + defaults.removeObject(forKey: QuitWarningSettings.warnBeforeQuitKey) + + XCTAssertTrue(QuitWarningSettings.isEnabled(defaults: defaults)) + } + + func testStoredPreferenceOverridesDefault() { + let suiteName = "QuitWarningSettingsTests.Stored.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Failed to create isolated UserDefaults suite") + return + } + defer { defaults.removePersistentDomain(forName: suiteName) } + + defaults.set(false, forKey: QuitWarningSettings.warnBeforeQuitKey) + XCTAssertFalse(QuitWarningSettings.isEnabled(defaults: defaults)) + + defaults.set(true, forKey: QuitWarningSettings.warnBeforeQuitKey) + XCTAssertTrue(QuitWarningSettings.isEnabled(defaults: defaults)) + } +} + final class UpdateChannelSettingsTests: XCTestCase { func testResolvedFeedFallsBackWhenInfoFeedMissing() { let resolved = UpdateFeedResolver.resolvedFeedURLString(infoFeedURL: nil) From f184f882c057d579ea61c30891310ef43f322614 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 00:16:01 -0800 Subject: [PATCH 055/214] Add CLI --version output and regression test --- CLI/cmux.swift | 204 ++++++++++++++++++++++++++++++++- tests/test_cli_version_flag.py | 87 ++++++++++++++ 2 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 tests/test_cli_version_flag.py diff --git a/CLI/cmux.swift b/CLI/cmux.swift index d2ea40e7..caa7ed48 100644 --- a/CLI/cmux.swift +++ b/CLI/cmux.swift @@ -435,6 +435,10 @@ struct CMUXCLI { index += 2 continue } + if arg == "-v" || arg == "--version" { + print(versionSummary()) + return + } if arg == "-h" || arg == "--help" { print(usage()) return @@ -450,6 +454,11 @@ struct CMUXCLI { let command = args[index] let commandArgs = Array(args[(index + 1)...]) + if command == "version" { + print(versionSummary()) + return + } + // Check for --help/-h on subcommands before connecting to the socket, // so help text is available even when cmux is not running. if commandArgs.contains("--help") || commandArgs.contains("-h") { @@ -4393,12 +4402,204 @@ struct CMUXCLI { return truncate(normalized, maxLength: 180) } + private func versionSummary() -> String { + let info = resolvedVersionInfo() + if let version = info["CFBundleShortVersionString"], let build = info["CFBundleVersion"] { + return "cmux \(version) (\(build))" + } + if let version = info["CFBundleShortVersionString"] { + return "cmux \(version)" + } + if let build = info["CFBundleVersion"] { + return "cmux build \(build)" + } + return "cmux version unknown" + } + + private func resolvedVersionInfo() -> [String: String] { + if let main = versionInfo(from: Bundle.main.infoDictionary) { + return main + } + + for plistURL in candidateInfoPlistURLs() { + guard let data = try? Data(contentsOf: plistURL), + let raw = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil), + let dictionary = raw as? [String: Any], + let parsed = versionInfo(from: dictionary) + else { + continue + } + return parsed + } + + if let fromProject = versionInfoFromProjectFile() { + return fromProject + } + + return [:] + } + + private func versionInfo(from dictionary: [String: Any]?) -> [String: String]? { + guard let dictionary else { return nil } + + var info: [String: String] = [:] + if let version = dictionary["CFBundleShortVersionString"] as? String { + let trimmed = version.trimmingCharacters(in: .whitespacesAndNewlines) + if !trimmed.isEmpty && !trimmed.contains("$(") { + info["CFBundleShortVersionString"] = trimmed + } + } + if let build = dictionary["CFBundleVersion"] as? String { + let trimmed = build.trimmingCharacters(in: .whitespacesAndNewlines) + if !trimmed.isEmpty && !trimmed.contains("$(") { + info["CFBundleVersion"] = trimmed + } + } + return info.isEmpty ? nil : info + } + + private func versionInfoFromProjectFile() -> [String: String]? { + guard let executable = currentExecutablePath(), !executable.isEmpty else { + return nil + } + + let fileManager = FileManager.default + var current = URL(fileURLWithPath: executable) + .resolvingSymlinksInPath() + .standardizedFileURL + .deletingLastPathComponent() + + while true { + let projectFile = current.appendingPathComponent("GhosttyTabs.xcodeproj/project.pbxproj") + if fileManager.fileExists(atPath: projectFile.path), + let contents = try? String(contentsOf: projectFile, encoding: .utf8) { + var info: [String: String] = [:] + if let version = firstProjectSetting("MARKETING_VERSION", in: contents) { + info["CFBundleShortVersionString"] = version + } + if let build = firstProjectSetting("CURRENT_PROJECT_VERSION", in: contents) { + info["CFBundleVersion"] = build + } + if !info.isEmpty { + return info + } + } + + let parent = current.deletingLastPathComponent() + if parent.path == current.path { + break + } + current = parent + } + + return nil + } + + private func firstProjectSetting(_ key: String, in source: String) -> String? { + let pattern = NSRegularExpression.escapedPattern(for: key) + "\\s*=\\s*([^;]+);" + guard let regex = try? NSRegularExpression(pattern: pattern) else { + return nil + } + let searchRange = NSRange(source.startIndex..<source.endIndex, in: source) + guard let match = regex.firstMatch(in: source, options: [], range: searchRange), + match.numberOfRanges > 1, + let valueRange = Range(match.range(at: 1), in: source) + else { + return nil + } + let value = source[valueRange] + .trimmingCharacters(in: .whitespacesAndNewlines) + .trimmingCharacters(in: CharacterSet(charactersIn: "\"")) + guard !value.isEmpty, !value.contains("$(") else { + return nil + } + return value + } + + private func candidateInfoPlistURLs() -> [URL] { + guard let executable = currentExecutablePath(), !executable.isEmpty else { + return [] + } + + let fileManager = FileManager.default + let executableURL = URL(fileURLWithPath: executable) + .resolvingSymlinksInPath() + .standardizedFileURL + + var candidates: [URL] = [] + var current = executableURL.deletingLastPathComponent() + while true { + if current.pathExtension == "app" { + candidates.append(current.appendingPathComponent("Contents/Info.plist")) + } + if current.lastPathComponent == "Contents" { + candidates.append(current.appendingPathComponent("Info.plist")) + } + + // Local dev fallback: resolve version from the repo's app Info.plist + // when running a standalone cmux-cli binary from build/Debug. + let projectMarker = current.appendingPathComponent("GhosttyTabs.xcodeproj/project.pbxproj") + let repoInfo = current.appendingPathComponent("Resources/Info.plist") + if fileManager.fileExists(atPath: projectMarker.path), + fileManager.fileExists(atPath: repoInfo.path) { + candidates.append(repoInfo) + break + } + + let parent = current.deletingLastPathComponent() + if parent.path == current.path { + break + } + current = parent + } + + let searchRoots = [ + executableURL.deletingLastPathComponent(), + executableURL.deletingLastPathComponent().deletingLastPathComponent() + ] + for root in searchRoots { + guard let entries = try? fileManager.contentsOfDirectory( + at: root, + includingPropertiesForKeys: [.isDirectoryKey], + options: [.skipsHiddenFiles] + ) else { + continue + } + for entry in entries where entry.pathExtension == "app" { + candidates.append(entry.appendingPathComponent("Contents/Info.plist")) + } + } + + var seen: Set<String> = [] + return candidates.filter { url in + let path = url.path + guard !path.isEmpty else { return false } + guard seen.insert(path).inserted else { return false } + return fileManager.fileExists(atPath: path) + } + } + + private func currentExecutablePath() -> String? { + var size: UInt32 = 0 + _ = _NSGetExecutablePath(nil, &size) + if size > 0 { + var buffer = Array<CChar>(repeating: 0, count: Int(size)) + if _NSGetExecutablePath(&buffer, &size) == 0 { + let path = String(cString: buffer).trimmingCharacters(in: .whitespacesAndNewlines) + if !path.isEmpty { + return path + } + } + } + return Bundle.main.executableURL?.path ?? args.first + } + private func usage() -> String { return """ cmux - control cmux via Unix socket Usage: - cmux [--socket PATH] [--window WINDOW] [--json] [--id-format refs|uuids|both] <command> [options] + cmux [--socket PATH] [--window WINDOW] [--json] [--id-format refs|uuids|both] [--version] <command> [options] Handle Inputs: For most v2-backed commands you can use UUIDs, short refs (window:1/workspace:2/pane:3/surface:4), or indexes. @@ -4406,6 +4607,7 @@ struct CMUXCLI { Output defaults to refs; pass --id-format uuids or --id-format both to include UUIDs. Commands: + version ping capabilities identify [--workspace <id|ref|index>] [--surface <id|ref|index>] [--no-caller] diff --git a/tests/test_cli_version_flag.py b/tests/test_cli_version_flag.py new file mode 100644 index 00000000..b48419f2 --- /dev/null +++ b/tests/test_cli_version_flag.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +""" +Regression test: `cmux --version` should print version text without requiring a socket. +""" + +from __future__ import annotations + +import glob +import os +import re +import shutil +import subprocess + + +def resolve_cmux_cli() -> str: + explicit = os.environ.get("CMUX_CLI_BIN") or os.environ.get("CMUX_CLI") + if explicit and os.path.exists(explicit) and os.access(explicit, os.X_OK): + return explicit + + candidates: list[str] = [] + candidates.extend(glob.glob(os.path.expanduser("~/Library/Developer/Xcode/DerivedData/*/Build/Products/Debug/cmux"))) + candidates.extend(glob.glob("/tmp/cmux-*/Build/Products/Debug/cmux")) + candidates = [p for p in candidates if os.path.exists(p) and os.access(p, os.X_OK)] + if candidates: + candidates.sort(key=os.path.getmtime, reverse=True) + return candidates[0] + + in_path = shutil.which("cmux") + if in_path: + return in_path + + raise RuntimeError("Unable to find cmux CLI binary. Set CMUX_CLI_BIN.") + + +def run(cli_path: str, *args: str) -> tuple[int, str, str]: + proc = subprocess.run( + [cli_path, *args], + text=True, + capture_output=True, + check=False, + ) + return proc.returncode, proc.stdout.strip(), proc.stderr.strip() + + +def main() -> int: + try: + cli_path = resolve_cmux_cli() + except Exception as exc: + print(f"FAIL: {exc}") + return 1 + + code, out, err = run(cli_path, "--version") + if code != 0: + print("FAIL: `cmux --version` exited non-zero") + print(f"exit={code}") + print(f"stdout={out}") + print(f"stderr={err}") + return 1 + + if not out: + print("FAIL: `cmux --version` produced empty stdout") + return 1 + + if not re.search(r"\b\d+\.\d+\.\d+\b", out): + print(f"FAIL: version output missing semantic version: {out!r}") + return 1 + + code2, out2, err2 = run(cli_path, "version") + if code2 != 0: + print("FAIL: `cmux version` exited non-zero") + print(f"exit={code2}") + print(f"stdout={out2}") + print(f"stderr={err2}") + return 1 + + if out2 != out: + print("FAIL: `cmux --version` and `cmux version` differ") + print(f"--version: {out!r}") + print(f"version: {out2!r}") + return 1 + + print(f"PASS: cmux version command works ({out})") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 18550e5d1fe4fb53cba72cb0a3e2b107e3a81efc Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 00:55:14 -0800 Subject: [PATCH 056/214] Add expanded socket access modes with password auth Implements https://github.com/manaflow-ai/cmux/issues/296 with new modes: off, cmuxOnly, automation, password, and allowAll. Adds keychain-backed password storage, connection-level auth gates (v1 auth + v2 auth.login), settings UX with warning confirmation, CLI --password support, and regression tests. --- CLI/cmux.swift | 63 ++++++++- Sources/AppDelegate.swift | 2 +- Sources/SocketControlSettings.swift | 210 +++++++++++++++++++++++----- Sources/TerminalController.swift | 128 ++++++++++++++++- Sources/cmuxApp.swift | 126 ++++++++++++++++- cmuxTests/GhosttyConfigTests.swift | 35 +++++ 6 files changed, 521 insertions(+), 43 deletions(-) diff --git a/CLI/cmux.swift b/CLI/cmux.swift index d2ea40e7..791ae8f6 100644 --- a/CLI/cmux.swift +++ b/CLI/cmux.swift @@ -1,5 +1,6 @@ import Foundation import Darwin +import Security struct CLIError: Error, CustomStringConvertible { let message: String @@ -235,6 +236,46 @@ enum CLIIDFormat: String { } } +private enum SocketPasswordResolver { + private static let service = "com.cmuxterm.app.socket-control" + private static let account = "local-socket-password" + + static func resolve(explicit: String?) -> String? { + if let explicit = normalized(explicit), !explicit.isEmpty { + return explicit + } + if let env = normalized(ProcessInfo.processInfo.environment["CMUX_SOCKET_PASSWORD"]), !env.isEmpty { + return env + } + return loadFromKeychain() + } + + private static func normalized(_ value: String?) -> String? { + guard let value else { return nil } + let trimmed = value.trimmingCharacters(in: .newlines) + return trimmed.isEmpty ? nil : trimmed + } + + private static func loadFromKeychain() -> String? { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: account, + kSecReturnData as String: true, + kSecMatchLimit as String: kSecMatchLimitOne, + ] + var result: CFTypeRef? + let status = SecItemCopyMatching(query as CFDictionary, &result) + guard status == errSecSuccess else { + return nil + } + guard let data = result as? Data else { + return nil + } + return String(data: data, encoding: .utf8) + } +} + final class SocketClient { private let path: String private var socketFD: Int32 = -1 @@ -402,6 +443,7 @@ struct CMUXCLI { var jsonOutput = false var idFormatArg: String? = nil var windowId: String? = nil + var socketPasswordArg: String? = nil var index = 1 while index < args.count { @@ -435,6 +477,14 @@ struct CMUXCLI { index += 2 continue } + if arg == "--password" { + guard index + 1 < args.count else { + throw CLIError(message: "--password requires a value") + } + socketPasswordArg = args[index + 1] + index += 2 + continue + } if arg == "-h" || arg == "--help" { print(usage()) return @@ -462,6 +512,14 @@ struct CMUXCLI { try client.connect() defer { client.close() } + if let socketPassword = SocketPasswordResolver.resolve(explicit: socketPasswordArg) { + let authResponse = try client.send(command: "auth \(socketPassword)") + if authResponse.hasPrefix("ERROR:"), + !authResponse.contains("Unknown command 'auth'") { + throw CLIError(message: authResponse) + } + } + let idFormat = try resolvedIDFormat(jsonOutput: jsonOutput, raw: idFormatArg) // If the user explicitly targets a window, focus it first so commands route correctly. @@ -4398,13 +4456,16 @@ struct CMUXCLI { cmux - control cmux via Unix socket Usage: - cmux [--socket PATH] [--window WINDOW] [--json] [--id-format refs|uuids|both] <command> [options] + cmux [--socket PATH] [--window WINDOW] [--password PASSWORD] [--json] [--id-format refs|uuids|both] <command> [options] Handle Inputs: For most v2-backed commands you can use UUIDs, short refs (window:1/workspace:2/pane:3/surface:4), or indexes. `tab-action` also accepts `tab:<n>` in addition to `surface:<n>`. Output defaults to refs; pass --id-format uuids or --id-format both to include UUIDs. + Socket Auth: + --password takes precedence, then CMUX_SOCKET_PASSWORD env var, then keychain password saved in Settings. + Commands: ping capabilities diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 3f71d164..23197bba 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -456,7 +456,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent if isRunningUnderXCTest(env) { let raw = UserDefaults.standard.string(forKey: SocketControlSettings.appStorageKey) ?? SocketControlSettings.defaultMode.rawValue - let userMode = SocketControlMode(rawValue: raw) ?? SocketControlSettings.defaultMode + let userMode = SocketControlSettings.migrateMode(raw) let mode = SocketControlSettings.effectiveMode(userMode: userMode) if mode != .off { TerminalController.shared.start( diff --git a/Sources/SocketControlSettings.swift b/Sources/SocketControlSettings.swift index c0fb35bb..a2586136 100644 --- a/Sources/SocketControlSettings.swift +++ b/Sources/SocketControlSettings.swift @@ -1,16 +1,17 @@ import Foundation +import Security enum SocketControlMode: String, CaseIterable, Identifiable { case off case cmuxOnly - /// Allow any local process to connect (no ancestry check). - /// Only accessible via CMUX_SOCKET_MODE=allowAll env var — not shown in the UI. + case automation + case password + /// Full open access (all local users/processes) with no ancestry or password gate. case allowAll var id: String { rawValue } - /// Cases shown in the Settings UI. `allowAll` is intentionally excluded. - static var uiCases: [SocketControlMode] { [.off, .cmuxOnly] } + static var uiCases: [SocketControlMode] { [.off, .cmuxOnly, .automation, .password, .allowAll] } var displayName: String { switch self { @@ -18,8 +19,12 @@ enum SocketControlMode: String, CaseIterable, Identifiable { return "Off" case .cmuxOnly: return "cmux processes only" + case .automation: + return "Automation mode" + case .password: + return "Password mode" case .allowAll: - return "Allow all processes" + return "Full open access" } } @@ -29,8 +34,126 @@ enum SocketControlMode: String, CaseIterable, Identifiable { return "Disable the local control socket." case .cmuxOnly: return "Only processes started inside cmux terminals can send commands." + case .automation: + return "Allow external local automation clients from this macOS user (no ancestry check)." + case .password: + return "Require socket authentication with a password stored in your keychain." case .allowAll: - return "Allow any local process to connect (no ancestry check)." + return "Allow any local process and user to connect with no auth. Unsafe." + } + } + + var socketFilePermissions: UInt16 { + switch self { + case .allowAll: + return 0o666 + case .off, .cmuxOnly, .automation, .password: + return 0o600 + } + } + + var requiresPasswordAuth: Bool { + self == .password + } +} + +enum SocketControlPasswordStore { + static let service = "com.cmuxterm.app.socket-control" + static let account = "local-socket-password" + + private static var baseQuery: [String: Any] { + [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: account, + ] + } + + static func configuredPassword( + environment: [String: String] = ProcessInfo.processInfo.environment + ) -> String? { + if let envPassword = environment[SocketControlSettings.socketPasswordEnvKey], !envPassword.isEmpty { + return envPassword + } + return try? loadPassword() + } + + static func hasConfiguredPassword( + environment: [String: String] = ProcessInfo.processInfo.environment + ) -> Bool { + guard let configured = configuredPassword(environment: environment) else { return false } + return !configured.isEmpty + } + + static func verify( + password candidate: String, + environment: [String: String] = ProcessInfo.processInfo.environment + ) -> Bool { + guard let expected = configuredPassword(environment: environment), !expected.isEmpty else { + return false + } + return expected == candidate + } + + static func loadPassword() throws -> String? { + var query = baseQuery + query[kSecReturnData as String] = true + query[kSecMatchLimit as String] = kSecMatchLimitOne + + var result: CFTypeRef? + let status = SecItemCopyMatching(query as CFDictionary, &result) + if status == errSecItemNotFound { + return nil + } + guard status == errSecSuccess else { + throw NSError(domain: NSOSStatusErrorDomain, code: Int(status)) + } + guard let data = result as? Data else { + return nil + } + return String(data: data, encoding: .utf8) + } + + static func savePassword(_ password: String) throws { + let normalized = password.trimmingCharacters(in: .newlines) + if normalized.isEmpty { + try clearPassword() + return + } + + let data = Data(normalized.utf8) + var lookup = baseQuery + lookup[kSecReturnData as String] = true + lookup[kSecMatchLimit as String] = kSecMatchLimitOne + + var existing: CFTypeRef? + let lookupStatus = SecItemCopyMatching(lookup as CFDictionary, &existing) + switch lookupStatus { + case errSecSuccess: + let attrsToUpdate: [String: Any] = [ + kSecValueData as String: data + ] + let updateStatus = SecItemUpdate(baseQuery as CFDictionary, attrsToUpdate as CFDictionary) + guard updateStatus == errSecSuccess else { + throw NSError(domain: NSOSStatusErrorDomain, code: Int(updateStatus)) + } + case errSecItemNotFound: + var add = baseQuery + add[kSecValueData as String] = data + add[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly + let addStatus = SecItemAdd(add as CFDictionary, nil) + guard addStatus == errSecSuccess else { + throw NSError(domain: NSOSStatusErrorDomain, code: Int(addStatus)) + } + default: + throw NSError(domain: NSOSStatusErrorDomain, code: Int(lookupStatus)) + } + } + + static func clearPassword() throws { + let status = SecItemDelete(baseQuery as CFDictionary) + guard status == errSecSuccess || status == errSecItemNotFound else { + throw NSError(domain: NSOSStatusErrorDomain, code: Int(status)) } } } @@ -39,19 +162,43 @@ struct SocketControlSettings { static let appStorageKey = "socketControlMode" static let legacyEnabledKey = "socketControlEnabled" static let allowSocketPathOverrideKey = "CMUX_ALLOW_SOCKET_OVERRIDE" + static let socketPasswordEnvKey = "CMUX_SOCKET_PASSWORD" - /// Map old persisted rawValues to the new enum. - static func migrateMode(_ raw: String) -> SocketControlMode { - switch raw { - case "off": return .off - case "cmuxOnly": return .cmuxOnly - case "allowAll": return .allowAll - // Legacy values: - case "notifications", "full": return .cmuxOnly - default: return defaultMode + private static func normalizeMode(_ raw: String) -> String { + raw + .trimmingCharacters(in: .whitespacesAndNewlines) + .lowercased() + .replacingOccurrences(of: "_", with: "") + .replacingOccurrences(of: "-", with: "") + } + + private static func parseMode(_ raw: String) -> SocketControlMode? { + switch normalizeMode(raw) { + case "off": + return .off + case "cmuxonly": + return .cmuxOnly + case "automation": + return .automation + case "password": + return .password + case "allowall", "openaccess", "fullopenaccess": + return .allowAll + // Legacy values from the old socket mode model. + case "notifications": + return .automation + case "full": + return .allowAll + default: + return nil } } + /// Map persisted values to the current enum values. + static func migrateMode(_ raw: String) -> SocketControlMode { + parseMode(raw) ?? defaultMode + } + static var defaultMode: SocketControlMode { return .cmuxOnly } @@ -135,8 +282,10 @@ struct SocketControlSettings { } } - static func envOverrideEnabled() -> Bool? { - guard let raw = ProcessInfo.processInfo.environment["CMUX_SOCKET_ENABLE"], !raw.isEmpty else { + static func envOverrideEnabled( + environment: [String: String] = ProcessInfo.processInfo.environment + ) -> Bool? { + guard let raw = environment["CMUX_SOCKET_ENABLE"], !raw.isEmpty else { return nil } @@ -150,33 +299,30 @@ struct SocketControlSettings { } } - static func envOverrideMode() -> SocketControlMode? { - guard let raw = ProcessInfo.processInfo.environment["CMUX_SOCKET_MODE"], !raw.isEmpty else { + static func envOverrideMode( + environment: [String: String] = ProcessInfo.processInfo.environment + ) -> SocketControlMode? { + guard let raw = environment["CMUX_SOCKET_MODE"], !raw.isEmpty else { return nil } - let cleaned = raw.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() - switch cleaned { - case "off": return .off - case "cmuxonly", "cmux_only", "cmux-only": return .cmuxOnly - case "allowall", "allow_all", "allow-all": return .allowAll - // Legacy env var values — map to allowAll so existing test scripts keep working - case "notifications", "full": return .allowAll - default: return SocketControlMode(rawValue: cleaned) - } + return parseMode(raw) } - static func effectiveMode(userMode: SocketControlMode) -> SocketControlMode { - if let overrideEnabled = envOverrideEnabled() { + static func effectiveMode( + userMode: SocketControlMode, + environment: [String: String] = ProcessInfo.processInfo.environment + ) -> SocketControlMode { + if let overrideEnabled = envOverrideEnabled(environment: environment) { if !overrideEnabled { return .off } - if let overrideMode = envOverrideMode() { + if let overrideMode = envOverrideMode(environment: environment) { return overrideMode } return userMode == .off ? .cmuxOnly : userMode } - if let overrideMode = envOverrideMode() { + if let overrideMode = envOverrideMode(environment: environment) { return overrideMode } diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 5f1a3833..3f61f26b 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -312,6 +312,7 @@ class TerminalController { if isRunning { if self.socketPath == socketPath && acceptLoopAlive { self.accessMode = accessMode + applySocketPermissions() return } stop() @@ -351,8 +352,7 @@ class TerminalController { return } - // Restrict socket to owner only (0600) - chmod(socketPath, 0o600) + applySocketPermissions() // Listen guard listen(serverSocket, 5) >= 0 else { @@ -398,6 +398,104 @@ class TerminalController { unlink(socketPath) } + private func applySocketPermissions() { + let permissions = mode_t(accessMode.socketFilePermissions) + if chmod(socketPath, permissions) != 0 { + print("TerminalController: Failed to set socket permissions to \(String(permissions, radix: 8)) for \(socketPath)") + } + } + + private func writeSocketResponse(_ response: String, to socket: Int32) { + let payload = response + "\n" + payload.withCString { ptr in + _ = write(socket, ptr, strlen(ptr)) + } + } + + private func passwordAuthRequiredResponse(for command: String) -> String { + let message = "Authentication required. Send auth <password> first." + guard command.hasPrefix("{"), + let data = command.data(using: .utf8), + let dict = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String: Any] else { + return "ERROR: Authentication required — send auth <password> first" + } + let id = dict["id"] + return v2Error(id: id, code: "auth_required", message: message) + } + + private func passwordLoginV1ResponseIfNeeded(for command: String, authenticated: inout Bool) -> String? { + let lowered = command.lowercased() + guard lowered == "auth" || lowered.hasPrefix("auth ") else { + return nil + } + guard SocketControlPasswordStore.hasConfiguredPassword() else { + return "ERROR: Password mode is enabled but no socket password is configured in Settings." + } + + let provided: String + if lowered == "auth" { + provided = "" + } else { + provided = String(command.dropFirst(5)) + } + guard !provided.isEmpty else { + return "ERROR: Missing password. Usage: auth <password>" + } + guard SocketControlPasswordStore.verify(password: provided) else { + return "ERROR: Invalid password" + } + authenticated = true + return "OK: Authenticated" + } + + private func passwordLoginV2ResponseIfNeeded(for command: String, authenticated: inout Bool) -> String? { + guard command.hasPrefix("{"), + let data = command.data(using: .utf8), + let dict = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String: Any] else { + return nil + } + let id = dict["id"] + let method = (dict["method"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" + guard method == "auth.login" else { + return nil + } + + guard let params = dict["params"] as? [String: Any], + let provided = params["password"] as? String else { + return v2Error(id: id, code: "invalid_params", message: "auth.login requires params.password") + } + + guard SocketControlPasswordStore.hasConfiguredPassword() else { + return v2Error( + id: id, + code: "auth_unconfigured", + message: "Password mode is enabled but no socket password is configured in Settings." + ) + } + + guard SocketControlPasswordStore.verify(password: provided) else { + return v2Error(id: id, code: "auth_failed", message: "Invalid password") + } + authenticated = true + return v2Ok(id: id, result: ["authenticated": true]) + } + + private func authResponseIfNeeded(for command: String, authenticated: inout Bool) -> String? { + guard accessMode.requiresPasswordAuth else { + return nil + } + if let v2Response = passwordLoginV2ResponseIfNeeded(for: command, authenticated: &authenticated) { + return v2Response + } + if let v1Response = passwordLoginV1ResponseIfNeeded(for: command, authenticated: &authenticated) { + return v1Response + } + if !authenticated { + return passwordAuthRequiredResponse(for: command) + } + return nil + } + private nonisolated func acceptLoop() { acceptLoopAlive = true defer { @@ -447,7 +545,7 @@ class TerminalController { defer { close(socket) } // In cmuxOnly mode, verify the connecting process is a descendant of cmux. - // In allowAll mode (env-var only), skip the ancestry check. + // Other modes allow external clients and apply separate auth controls. if accessMode == .cmuxOnly { // Use pre-captured peer PID if available (captured in accept loop before // the peer can disconnect), falling back to live lookup. @@ -477,6 +575,7 @@ class TerminalController { var buffer = [UInt8](repeating: 0, count: 4096) var pending = "" + var authenticated = false while isRunning { let bytesRead = read(socket, &buffer, buffer.count - 1) @@ -491,11 +590,13 @@ class TerminalController { let trimmed = line.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { continue } - let response = processCommand(trimmed) - let payload = response + "\n" - payload.withCString { ptr in - _ = write(socket, ptr, strlen(ptr)) + if let authResponse = authResponseIfNeeded(for: trimmed, authenticated: &authenticated) { + writeSocketResponse(authResponse, to: socket) + continue } + + let response = processCommand(trimmed) + writeSocketResponse(response, to: socket) } } } @@ -524,6 +625,9 @@ class TerminalController { case "ping": return "PONG" + case "auth": + return "OK: Authentication not required" + case "list_windows": return listWindows() @@ -870,6 +974,14 @@ class TerminalController { case "system.identify": return v2Ok(id: id, result: v2Identify(params: params)) + case "auth.login": + return v2Ok( + id: id, + result: [ + "authenticated": true, + "required": accessMode.requiresPasswordAuth + ] + ) // Windows case "window.list": @@ -1220,6 +1332,7 @@ class TerminalController { "system.ping", "system.capabilities", "system.identify", + "auth.login", "window.list", "window.current", "window.focus", @@ -7719,6 +7832,7 @@ class TerminalController { Available commands: ping - Check if server is running + auth <password> - Authenticate this connection (required in password mode) list_workspaces - List all workspaces with IDs new_workspace - Create a new workspace select_workspace <id|index> - Select workspace by ID or index (0-based) diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 0fa8eedb..09b18c59 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -2471,8 +2471,13 @@ struct SettingsView: View { @State private var topBlurBaselineOffset: CGFloat? @State private var settingsTitleLeadingInset: CGFloat = 92 @State private var showClearBrowserHistoryConfirmation = false + @State private var showOpenAccessConfirmation = false + @State private var pendingOpenAccessMode: SocketControlMode? @State private var browserHistoryEntryCount: Int = 0 @State private var browserInsecureHTTPAllowlistDraft = BrowserInsecureHTTPSettings.defaultAllowlistText + @State private var socketPasswordDraft = "" + @State private var socketPasswordStatusMessage: String? + @State private var socketPasswordStatusIsError = false private var selectedWorkspacePlacement: NewWorkspacePlacement { NewWorkspacePlacement(rawValue: newWorkspacePlacement) ?? WorkspacePlacementSettings.defaultPlacement @@ -2482,6 +2487,29 @@ struct SettingsView: View { SocketControlSettings.migrateMode(socketControlMode) } + private var socketModeSelection: Binding<String> { + Binding( + get: { socketControlMode }, + set: { newValue in + let normalized = SocketControlSettings.migrateMode(newValue) + if normalized == .allowAll && selectedSocketControlMode != .allowAll { + pendingOpenAccessMode = normalized + showOpenAccessConfirmation = true + return + } + socketControlMode = normalized.rawValue + if normalized != .password { + socketPasswordStatusMessage = nil + socketPasswordStatusIsError = false + } + } + ) + } + + private var hasSocketPasswordConfigured: Bool { + SocketControlPasswordStore.hasConfiguredPassword() + } + private var browserHistorySubtitle: String { switch browserHistoryEntryCount { case 0: @@ -2503,6 +2531,37 @@ struct SettingsView: View { return Double(min(max(reveal, 0), 1)) } + private func saveSocketPassword() { + let trimmed = socketPasswordDraft.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { + socketPasswordStatusMessage = "Enter a password first." + socketPasswordStatusIsError = true + return + } + + do { + try SocketControlPasswordStore.savePassword(trimmed) + socketPasswordDraft = "" + socketPasswordStatusMessage = "Password saved to keychain." + socketPasswordStatusIsError = false + } catch { + socketPasswordStatusMessage = "Failed to save password (\(error.localizedDescription))." + socketPasswordStatusIsError = true + } + } + + private func clearSocketPassword() { + do { + try SocketControlPasswordStore.clearPassword() + socketPasswordDraft = "" + socketPasswordStatusMessage = "Password cleared." + socketPasswordStatusIsError = false + } catch { + socketPasswordStatusMessage = "Failed to clear password (\(error.localizedDescription))." + socketPasswordStatusIsError = true + } + } + var body: some View { ZStack(alignment: .top) { ScrollView { @@ -2594,7 +2653,7 @@ struct SettingsView: View { subtitle: selectedSocketControlMode.description, controlWidth: pickerColumnWidth ) { - Picker("", selection: $socketControlMode) { + Picker("", selection: socketModeSelection) { ForEach(SocketControlMode.uiCases) { mode in Text(mode.displayName).tag(mode.rawValue) } @@ -2606,7 +2665,50 @@ struct SettingsView: View { SettingsCardDivider() - SettingsCardNote("Controls access to the local Unix socket for programmatic control. In \"cmux processes only\" mode, only processes spawned inside cmux terminals can connect.") + SettingsCardNote("Controls access to the local Unix socket for programmatic control. Choose a mode that matches your threat model.") + if selectedSocketControlMode == .password { + SettingsCardDivider() + SettingsCardRow( + "Socket Password", + subtitle: hasSocketPasswordConfigured + ? "Stored in login keychain." + : "No password set. External clients will be blocked until one is configured." + ) { + HStack(spacing: 8) { + SecureField("Password", text: $socketPasswordDraft) + .textFieldStyle(.roundedBorder) + .frame(width: 170) + Button(hasSocketPasswordConfigured ? "Change" : "Set") { + saveSocketPassword() + } + .buttonStyle(.bordered) + .controlSize(.small) + .disabled(socketPasswordDraft.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty) + if hasSocketPasswordConfigured { + Button("Clear") { + clearSocketPassword() + } + .buttonStyle(.bordered) + .controlSize(.small) + } + } + } + if let message = socketPasswordStatusMessage { + Text(message) + .font(.caption) + .foregroundStyle(socketPasswordStatusIsError ? Color.red : Color.secondary) + .padding(.horizontal, 14) + .padding(.bottom, 8) + } + } + if selectedSocketControlMode == .allowAll { + SettingsCardDivider() + Text("Warning: Full open access makes the control socket world-readable/writable on this Mac and disables auth checks. Use only for local debugging.") + .font(.caption) + .foregroundStyle(.red) + .padding(.horizontal, 14) + .padding(.vertical, 8) + } SettingsCardNote("Overrides: CMUX_SOCKET_ENABLE, CMUX_SOCKET_MODE, and CMUX_SOCKET_PATH (set CMUX_ALLOW_SOCKET_OVERRIDE=1 for stable/nightly builds).") } @@ -2962,6 +3064,21 @@ struct SettingsView: View { } message: { Text("This removes visited-page suggestions from the browser omnibar.") } + .confirmationDialog( + "Enable full open access?", + isPresented: $showOpenAccessConfirmation, + titleVisibility: .visible + ) { + Button("Enable Full Open Access", role: .destructive) { + socketControlMode = (pendingOpenAccessMode ?? .allowAll).rawValue + pendingOpenAccessMode = nil + } + Button("Cancel", role: .cancel) { + pendingOpenAccessMode = nil + } + } message: { + Text("This disables ancestry and password checks and opens the socket to all local users. Only enable when you understand the risk.") + } } private func resetAllSettings() { @@ -2981,6 +3098,11 @@ struct SettingsView: View { newWorkspacePlacement = WorkspacePlacementSettings.defaultPlacement.rawValue workspaceAutoReorder = WorkspaceAutoReorderSettings.defaultValue sidebarBranchVerticalLayout = SidebarBranchLayoutSettings.defaultVerticalLayout + showOpenAccessConfirmation = false + pendingOpenAccessMode = nil + socketPasswordDraft = "" + socketPasswordStatusMessage = nil + socketPasswordStatusIsError = false KeyboardShortcutSettings.resetAll() shortcutResetToken = UUID() } diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index 5f80a466..effff6ad 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -356,6 +356,41 @@ final class TabManagerNotificationOrderingSourceTests: XCTestCase { } final class SocketControlSettingsTests: XCTestCase { + func testMigrateModeSupportsExpandedSocketModes() { + XCTAssertEqual(SocketControlSettings.migrateMode("off"), .off) + XCTAssertEqual(SocketControlSettings.migrateMode("cmuxOnly"), .cmuxOnly) + XCTAssertEqual(SocketControlSettings.migrateMode("automation"), .automation) + XCTAssertEqual(SocketControlSettings.migrateMode("password"), .password) + XCTAssertEqual(SocketControlSettings.migrateMode("allow-all"), .allowAll) + + // Legacy aliases + XCTAssertEqual(SocketControlSettings.migrateMode("notifications"), .automation) + XCTAssertEqual(SocketControlSettings.migrateMode("full"), .allowAll) + } + + func testSocketModePermissions() { + XCTAssertEqual(SocketControlMode.off.socketFilePermissions, 0o600) + XCTAssertEqual(SocketControlMode.cmuxOnly.socketFilePermissions, 0o600) + XCTAssertEqual(SocketControlMode.automation.socketFilePermissions, 0o600) + XCTAssertEqual(SocketControlMode.password.socketFilePermissions, 0o600) + XCTAssertEqual(SocketControlMode.allowAll.socketFilePermissions, 0o666) + } + + func testInvalidEnvSocketModeDoesNotOverrideUserMode() { + XCTAssertNil( + SocketControlSettings.envOverrideMode( + environment: ["CMUX_SOCKET_MODE": "definitely-not-a-mode"] + ) + ) + XCTAssertEqual( + SocketControlSettings.effectiveMode( + userMode: .password, + environment: ["CMUX_SOCKET_MODE": "definitely-not-a-mode"] + ), + .password + ) + } + func testStableReleaseIgnoresAmbientSocketOverrideByDefault() { let path = SocketControlSettings.socketPath( environment: [ From a205028b2e95f238cb5d64d4b3dc25410ce69ad2 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 01:08:25 -0800 Subject: [PATCH 057/214] Strengthen socket access integration coverage Make tests/test_socket_access.py deterministic across environments and add password-mode auth integration checks (v1 and v2). --- tests/test_socket_access.py | 203 ++++++++++++++++++++++++++++++++---- 1 file changed, 185 insertions(+), 18 deletions(-) diff --git a/tests/test_socket_access.py b/tests/test_socket_access.py index ce0c3e6e..48929bd2 100644 --- a/tests/test_socket_access.py +++ b/tests/test_socket_access.py @@ -20,6 +20,8 @@ import subprocess import sys import tempfile import time +import json +import glob sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from cmux import cmux, cmuxError @@ -69,32 +71,66 @@ def _raw_send(sock, command: str, timeout: float = 3.0) -> str: def _find_app(): - r = subprocess.run( - ["find", "/Users/cmux/Library/Developer/Xcode/DerivedData", - "-path", "*/Build/Products/Debug/cmux DEV.app", "-print", "-quit"], - capture_output=True, text=True, timeout=10 - ) - return r.stdout.strip() + explicit = os.environ.get("CMUX_APP_PATH") + if explicit and os.path.exists(explicit): + return explicit + + candidates = [] + home = os.path.expanduser("~") + candidates.extend(glob.glob(os.path.join( + home, "Library/Developer/Xcode/DerivedData/*/Build/Products/Debug/cmux DEV.app" + ))) + candidates.extend(glob.glob("/tmp/cmux-*/Build/Products/Debug/cmux DEV*.app")) + candidates.extend(glob.glob("/private/tmp/cmux-*/Build/Products/Debug/cmux DEV*.app")) + + candidates = [p for p in candidates if os.path.exists(p)] + if not candidates: + return "" + candidates.sort(key=os.path.getmtime, reverse=True) + return candidates[0] def _wait_for_socket(socket_path: str, timeout: float = 10.0) -> bool: deadline = time.time() + timeout while time.time() < deadline: if os.path.exists(socket_path): - return True + try: + sock = _raw_connect(socket_path, timeout=0.3) + sock.close() + return True + except Exception: + pass time.sleep(0.5) return False -def _kill_cmux(): - subprocess.run(["pkill", "-x", "cmux DEV"], capture_output=True) +def _kill_cmux(app_path: str = None): + if app_path: + exe = os.path.join(app_path, "Contents/MacOS/cmux DEV") + subprocess.run(["pkill", "-f", exe], capture_output=True) + else: + subprocess.run(["pkill", "-x", "cmux DEV"], capture_output=True) time.sleep(1.5) -def _launch_cmux(app_path: str, socket_path: str, mode: str = None): +def _launch_cmux(app_path: str, socket_path: str, mode: str = None, extra_env: dict = None): + if os.path.exists(socket_path): + try: + os.unlink(socket_path) + except OSError: + pass + env_args = [] if mode: env_args = ["--env", f"CMUX_SOCKET_MODE={mode}"] + launch_env = { + "CMUX_SOCKET_PATH": socket_path, + "CMUX_ALLOW_SOCKET_OVERRIDE": "1", + } + if extra_env: + launch_env.update(extra_env) + for key, value in launch_env.items(): + env_args.extend(["--env", f"{key}={value}"]) subprocess.Popen(["open", "-a", app_path] + env_args) if not _wait_for_socket(socket_path): raise RuntimeError(f"Socket {socket_path} not created after launch") @@ -249,8 +285,8 @@ fi f.write(hook_line) # Kill existing cmux, launch in cmuxOnly mode (default) - _kill_cmux() - _launch_cmux(app_path, socket_path) + _kill_cmux(app_path) + _launch_cmux(app_path, socket_path, mode="cmuxOnly") # Wait for marker (the shell sources .zprofile on startup) for _ in range(40): @@ -305,7 +341,7 @@ def test_allowall_mode_works(socket_path: str, app_path: str) -> TestResult: """Verify CMUX_SOCKET_MODE=allowAll bypasses ancestry check.""" result = TestResult("allowAll mode allows external") try: - _kill_cmux() + _kill_cmux(app_path) _launch_cmux(app_path, socket_path, mode="allowAll") sock = _raw_connect(socket_path) @@ -321,6 +357,124 @@ def test_allowall_mode_works(socket_path: str, app_path: str) -> TestResult: return result +def test_password_mode_requires_auth(socket_path: str, app_path: str) -> TestResult: + """Verify password mode rejects unauthenticated commands.""" + result = TestResult("Password mode requires auth") + password = f"cmux-pass-{os.getpid()}" + try: + _kill_cmux(app_path) + _launch_cmux( + app_path, + socket_path, + mode="password", + extra_env={"CMUX_SOCKET_PASSWORD": password} + ) + + sock = _raw_connect(socket_path) + response = _raw_send(sock, "ping") + sock.close() + + if "Authentication required" in response: + result.success("Unauthenticated command rejected in password mode") + else: + result.failure(f"Unexpected response without auth: {response!r}") + except Exception as e: + result.failure(f"{type(e).__name__}: {e}") + return result + + +def test_password_mode_v1_auth_flow(socket_path: str, app_path: str) -> TestResult: + """Verify v1 auth command unlocks the connection only with correct password.""" + result = TestResult("Password mode v1 auth flow") + password = f"cmux-pass-{os.getpid()}" + try: + _kill_cmux(app_path) + _launch_cmux( + app_path, + socket_path, + mode="password", + extra_env={"CMUX_SOCKET_PASSWORD": password} + ) + + sock = _raw_connect(socket_path) + try: + wrong = _raw_send(sock, "auth wrong-password") + if "Invalid password" not in wrong: + result.failure(f"Expected invalid password error, got: {wrong!r}") + return result + + ok = _raw_send(sock, f"auth {password}") + if "OK: Authenticated" not in ok: + result.failure(f"Expected auth success, got: {ok!r}") + return result + + pong = _raw_send(sock, "ping") + if pong != "PONG": + result.failure(f"Expected PONG after auth, got: {pong!r}") + return result + finally: + sock.close() + + result.success("v1 auth gate works") + except Exception as e: + result.failure(f"{type(e).__name__}: {e}") + return result + + +def test_password_mode_v2_auth_flow(socket_path: str, app_path: str) -> TestResult: + """Verify v2 auth.login unlocks subsequent v2 requests.""" + result = TestResult("Password mode v2 auth flow") + password = f"cmux-pass-{os.getpid()}" + try: + _kill_cmux(app_path) + _launch_cmux( + app_path, + socket_path, + mode="password", + extra_env={"CMUX_SOCKET_PASSWORD": password} + ) + + sock = _raw_connect(socket_path) + try: + unauth = _raw_send(sock, json.dumps({ + "id": "1", + "method": "system.ping", + "params": {} + })) + unauth_obj = json.loads(unauth) + if unauth_obj.get("error", {}).get("code") != "auth_required": + result.failure(f"Expected auth_required, got: {unauth!r}") + return result + + login = _raw_send(sock, json.dumps({ + "id": "2", + "method": "auth.login", + "params": {"password": password} + })) + login_obj = json.loads(login) + if not login_obj.get("ok"): + result.failure(f"Expected auth.login success, got: {login!r}") + return result + + pong = _raw_send(sock, json.dumps({ + "id": "3", + "method": "system.ping", + "params": {} + })) + pong_obj = json.loads(pong) + pong_value = pong_obj.get("result", {}).get("pong") + if pong_value is not True: + result.failure(f"Expected pong=true after auth.login, got: {pong!r}") + return result + finally: + sock.close() + + result.success("v2 auth.login gate works") + except Exception as e: + result.failure(f"{type(e).__name__}: {e}") + return result + + # --------------------------------------------------------------------------- # Main # --------------------------------------------------------------------------- @@ -337,7 +491,11 @@ def run_tests(): return 1 print(f"App: {app_path}") - socket_path = _find_socket_path() + socket_path = f"/tmp/cmux-test-socket-access-{os.getpid()}.sock" + try: + os.unlink(socket_path) + except OSError: + pass print(f"Socket: {socket_path}") print() @@ -356,9 +514,9 @@ def run_tests(): print("-" * 50) # Ensure cmux is running in cmuxOnly mode - _kill_cmux() + _kill_cmux(app_path) print(" Launching cmux in cmuxOnly mode...") - _launch_cmux(app_path, socket_path) + _launch_cmux(app_path, socket_path, mode="cmuxOnly") run_test(test_external_rejected, socket_path) run_test(test_connection_closed_after_reject, socket_path) @@ -380,9 +538,18 @@ def run_tests(): run_test(test_allowall_mode_works, socket_path, app_path) print() + # ── Phase 4: password mode auth gate ── + print("Phase 4: password mode — auth required + login flow") + print("-" * 50) + + run_test(test_password_mode_requires_auth, socket_path, app_path) + run_test(test_password_mode_v1_auth_flow, socket_path, app_path) + run_test(test_password_mode_v2_auth_flow, socket_path, app_path) + print() + # ── Cleanup: leave cmux in cmuxOnly mode ── - _kill_cmux() - _launch_cmux(app_path, socket_path) + _kill_cmux(app_path) + _launch_cmux(app_path, socket_path, mode="cmuxOnly") # ── Summary ── print("=" * 60) From 959b5a849f3eecc49f4c6653c7388ffec4c38da5 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 01:15:58 -0800 Subject: [PATCH 058/214] Browser view: add context menu action to open link in default browser --- Sources/Panels/CmuxWebView.swift | 58 ++++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 74 +++++++++++++++++++ 2 files changed, 131 insertions(+), 1 deletion(-) diff --git a/Sources/Panels/CmuxWebView.swift b/Sources/Panels/CmuxWebView.swift index 239c641a..7ee2d00a 100644 --- a/Sources/Panels/CmuxWebView.swift +++ b/Sources/Panels/CmuxWebView.swift @@ -20,6 +20,8 @@ final class CmuxWebView: WKWebView { private static var contextMenuFallbackKey: UInt8 = 0 var onContextMenuDownloadStateChanged: ((Bool) -> Void)? + var contextMenuLinkURLProvider: ((CmuxWebView, NSPoint, @escaping (URL?) -> Void) -> Void)? + var contextMenuDefaultBrowserOpener: ((URL) -> Bool)? override func performKeyEquivalent(with event: NSEvent) -> Bool { // Preserve Cmd+Return/Enter for web content (e.g. editors/forms). Do not @@ -302,6 +304,27 @@ final class CmuxWebView: WKWebView { } } + private func resolveContextMenuLinkURL(at point: NSPoint, completion: @escaping (URL?) -> Void) { + if let contextMenuLinkURLProvider { + contextMenuLinkURLProvider(self, point, completion) + return + } + findLinkURLAtPoint(point, completion: completion) + } + + private func canOpenInDefaultBrowser(_ url: URL) -> Bool { + let scheme = url.scheme?.lowercased() ?? "" + return scheme == "http" || scheme == "https" + } + + private func openContextMenuLinkInDefaultBrowser(_ url: URL) { + if let contextMenuDefaultBrowserOpener { + _ = contextMenuDefaultBrowserOpener(url) + return + } + _ = NSWorkspace.shared.open(url) + } + private func runContextMenuFallback(action: Selector?, target: AnyObject?, sender: Any?) { guard let action else { return } // Guard against accidental self-recursion if fallback gets overwritten. @@ -452,8 +475,22 @@ final class CmuxWebView: WKWebView { override func willOpenMenu(_ menu: NSMenu, with event: NSEvent) { super.willOpenMenu(menu, with: event) lastContextMenuPoint = convert(event.locationInWindow, from: nil) + var openLinkInsertionIndex: Int? + var hasDefaultBrowserOpenLinkItem = false + + for (index, item) in menu.items.enumerated() { + if !hasDefaultBrowserOpenLinkItem, + (item.action == #selector(contextMenuOpenLinkInDefaultBrowser(_:)) + || item.title == "Open Link in Default Browser") { + hasDefaultBrowserOpenLinkItem = true + } + + if openLinkInsertionIndex == nil, + (item.identifier?.rawValue == "WKMenuItemIdentifierOpenLink" + || item.title == "Open Link") { + openLinkInsertionIndex = index + 1 + } - for item in menu.items { // Rename "Open Link in New Window" to "Open Link in New Tab". // The UIDelegate's createWebViewWith already handles the action // by opening the link as a new surface in the same pane. @@ -494,6 +531,25 @@ final class CmuxWebView: WKWebView { item.action = #selector(contextMenuDownloadLinkedFile(_:)) } } + + if let openLinkInsertionIndex, !hasDefaultBrowserOpenLinkItem { + let item = NSMenuItem( + title: "Open Link in Default Browser", + action: #selector(contextMenuOpenLinkInDefaultBrowser(_:)), + keyEquivalent: "" + ) + item.target = self + menu.insertItem(item, at: min(openLinkInsertionIndex, menu.items.count)) + } + } + + @objc private func contextMenuOpenLinkInDefaultBrowser(_ sender: Any?) { + _ = sender + let point = lastContextMenuPoint + resolveContextMenuLinkURL(at: point) { [weak self] url in + guard let self, let url, self.canOpenInDefaultBrowser(url) else { return } + self.openContextMenuLinkInDefaultBrowser(url) + } } @objc private func contextMenuDownloadImage(_ sender: Any?) { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 0b48bb1d..cc8f5395 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -132,6 +132,80 @@ final class CmuxWebViewKeyEquivalentTests: XCTestCase { } } +@MainActor +final class CmuxWebViewContextMenuTests: XCTestCase { + private func makeRightMouseDownEvent() -> NSEvent { + guard let event = NSEvent.mouseEvent( + with: .rightMouseDown, + location: .zero, + modifierFlags: [], + timestamp: ProcessInfo.processInfo.systemUptime, + windowNumber: 0, + context: nil, + eventNumber: 0, + clickCount: 1, + pressure: 1.0 + ) else { + fatalError("Failed to create rightMouseDown event") + } + return event + } + + func testWillOpenMenuAddsOpenLinkInDefaultBrowserAndRoutesSelectionToDefaultBrowserOpener() { + _ = NSApplication.shared + let webView = CmuxWebView(frame: NSRect(x: 0, y: 0, width: 800, height: 600), configuration: WKWebViewConfiguration()) + let menu = NSMenu() + let openLinkItem = NSMenuItem(title: "Open Link", action: nil, keyEquivalent: "") + openLinkItem.identifier = NSUserInterfaceItemIdentifier("WKMenuItemIdentifierOpenLink") + menu.addItem(openLinkItem) + menu.addItem(NSMenuItem(title: "Copy Link", action: nil, keyEquivalent: "")) + + var openedURL: URL? + webView.contextMenuLinkURLProvider = { _, _, completion in + completion(URL(string: "https://example.com/docs")!) + } + webView.contextMenuDefaultBrowserOpener = { url in + openedURL = url + return true + } + + webView.willOpenMenu(menu, with: makeRightMouseDownEvent()) + + guard let defaultBrowserItemIndex = menu.items.firstIndex(where: { $0.title == "Open Link in Default Browser" }) else { + XCTFail("Expected Open Link in Default Browser item in context menu") + return + } + guard let openLinkIndex = menu.items.firstIndex(where: { $0.identifier?.rawValue == "WKMenuItemIdentifierOpenLink" }) else { + XCTFail("Expected Open Link item in context menu") + return + } + + XCTAssertEqual(defaultBrowserItemIndex, openLinkIndex + 1) + let defaultBrowserItem = menu.items[defaultBrowserItemIndex] + XCTAssertTrue(defaultBrowserItem.target === webView) + XCTAssertNotNil(defaultBrowserItem.action) + + let dispatched = NSApp.sendAction( + defaultBrowserItem.action!, + to: defaultBrowserItem.target, + from: defaultBrowserItem + ) + XCTAssertTrue(dispatched) + XCTAssertEqual(openedURL?.absoluteString, "https://example.com/docs") + } + + func testWillOpenMenuSkipsDefaultBrowserItemWhenContextHasNoOpenLinkEntry() { + let webView = CmuxWebView(frame: .zero, configuration: WKWebViewConfiguration()) + let menu = NSMenu() + menu.addItem(NSMenuItem(title: "Back", action: nil, keyEquivalent: "")) + menu.addItem(NSMenuItem(title: "Forward", action: nil, keyEquivalent: "")) + + webView.willOpenMenu(menu, with: makeRightMouseDownEvent()) + + XCTAssertFalse(menu.items.contains { $0.title == "Open Link in Default Browser" }) + } +} + final class BrowserDevToolsButtonDebugSettingsTests: XCTestCase { private func makeIsolatedDefaults() -> UserDefaults { let suiteName = "BrowserDevToolsButtonDebugSettingsTests.\(UUID().uuidString)" From ea87076fe4450cd1fd7e72401dbaae07bce12c3a Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 01:37:42 -0800 Subject: [PATCH 059/214] Fix CLI exit code on v1 auth errors --- CLI/cmux.swift | 42 +++++---- tests/test_socket_access.py | 169 ++++++++++++++++++++++++++++++++++-- 2 files changed, 188 insertions(+), 23 deletions(-) diff --git a/CLI/cmux.swift b/CLI/cmux.swift index d72798aa..c7d6b8d6 100644 --- a/CLI/cmux.swift +++ b/CLI/cmux.swift @@ -539,7 +539,7 @@ struct CMUXCLI { switch command { case "ping": - let response = try client.send(command: "ping") + let response = try sendV1Command("ping", client: client) print(response) case "capabilities": @@ -582,7 +582,7 @@ struct CMUXCLI { print(jsonString(formatIDs(response, mode: idFormat))) case "list-windows": - let response = try client.send(command: "list_windows") + let response = try sendV1Command("list_windows", client: client) if jsonOutput { let windows = parseWindows(response) let payload = windows.map { item -> [String: Any] in @@ -601,7 +601,7 @@ struct CMUXCLI { } case "current-window": - let response = try client.send(command: "current_window") + let response = try sendV1Command("current_window", client: client) if jsonOutput { print(jsonString(["window_id": response])) } else { @@ -609,21 +609,21 @@ struct CMUXCLI { } case "new-window": - let response = try client.send(command: "new_window") + let response = try sendV1Command("new_window", client: client) print(response) case "focus-window": guard let target = optionValue(commandArgs, name: "--window") else { throw CLIError(message: "focus-window requires --window") } - let response = try client.send(command: "focus_window \(target)") + let response = try sendV1Command("focus_window \(target)", client: client) print(response) case "close-window": guard let target = optionValue(commandArgs, name: "--window") else { throw CLIError(message: "close-window requires --window") } - let response = try client.send(command: "close_window \(target)") + let response = try sendV1Command("close_window \(target)", client: client) print(response) case "move-workspace-to-window": @@ -685,7 +685,7 @@ struct CMUXCLI { if let unknown = remaining.first(where: { $0.hasPrefix("--") }) { throw CLIError(message: "new-workspace: unknown flag '\(unknown)'. Known flags: --command <text>") } - let response = try client.send(command: "new_workspace") + let response = try sendV1Command("new_workspace", client: client) print(response) if let commandText = commandOpt { guard response.hasPrefix("OK ") else { @@ -830,11 +830,11 @@ struct CMUXCLI { guard let direction = rem1.first else { throw CLIError(message: "drag-surface-to-split requires a direction") } - let response = try client.send(command: "drag_surface_to_split \(surface) \(direction)") + let response = try sendV1Command("drag_surface_to_split \(surface) \(direction)", client: client) print(response) case "refresh-surfaces": - let response = try client.send(command: "refresh_surfaces") + let response = try sendV1Command("refresh_surfaces", client: client) print(response) case "surface-health": @@ -950,7 +950,7 @@ struct CMUXCLI { printV2Payload(payload, jsonOutput: jsonOutput, idFormat: idFormat, fallbackText: v2OKSummary(payload, idFormat: idFormat, kinds: ["workspace"])) case "current-workspace": - let response = try client.send(command: "current_workspace") + let response = try sendV1Command("current_workspace", client: client) if jsonOutput { print(jsonString(["workspace_id": response])) } else { @@ -1074,11 +1074,11 @@ struct CMUXCLI { let targetSurface = try resolveSurfaceId(surfaceArg, workspaceId: targetWorkspace, client: client) let payload = "\(title)|\(subtitle)|\(body)" - let response = try client.send(command: "notify_target \(targetWorkspace) \(targetSurface) \(payload)") + let response = try sendV1Command("notify_target \(targetWorkspace) \(targetSurface) \(payload)", client: client) print(response) case "list-notifications": - let response = try client.send(command: "list_notifications") + let response = try sendV1Command("list_notifications", client: client) if jsonOutput { let notifications = parseNotifications(response) let payload = notifications.map { item in @@ -1099,7 +1099,7 @@ struct CMUXCLI { } case "clear-notifications": - let response = try client.send(command: "clear_notifications") + let response = try sendV1Command("clear_notifications", client: client) print(response) case "claude-hook": @@ -1107,11 +1107,11 @@ struct CMUXCLI { case "set-app-focus": guard let value = commandArgs.first else { throw CLIError(message: "set-app-focus requires a value") } - let response = try client.send(command: "set_app_focus \(value)") + let response = try sendV1Command("set_app_focus \(value)", client: client) print(response) case "simulate-app-active": - let response = try client.send(command: "simulate_app_active") + let response = try sendV1Command("simulate_app_active", client: client) print(response) case "capture-pane", @@ -1191,6 +1191,14 @@ struct CMUXCLI { } } + private func sendV1Command(_ command: String, client: SocketClient) throws -> String { + let response = try client.send(command: command) + if response.hasPrefix("ERROR:") { + throw CLIError(message: response) + } + return response + } + private func resolvedIDFormat(jsonOutput: Bool, raw: String?) throws -> CLIIDFormat { _ = jsonOutput if let parsed = try CLIIDFormat.parse(raw) { @@ -4086,7 +4094,7 @@ struct CMUXCLI { let subtitle = sanitizeNotificationField(completion.subtitle) let body = sanitizeNotificationField(completion.body) let payload = "\(title)|\(subtitle)|\(body)" - let response = try client.send(command: "notify_target \(workspaceId) \(surfaceId) \(payload)") + let response = try sendV1Command("notify_target \(workspaceId) \(surfaceId) \(payload)", client: client) print(response) } else { print("OK") @@ -4126,7 +4134,7 @@ struct CMUXCLI { ) } - let response = try client.send(command: "notify_target \(workspaceId) \(surfaceId) \(payload)") + let response = try sendV1Command("notify_target \(workspaceId) \(surfaceId) \(payload)", client: client) _ = try? setClaudeStatus( client: client, workspaceId: workspaceId, diff --git a/tests/test_socket_access.py b/tests/test_socket_access.py index 48929bd2..ab24627b 100644 --- a/tests/test_socket_access.py +++ b/tests/test_socket_access.py @@ -22,6 +22,7 @@ import tempfile import time import json import glob +import plistlib sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from cmux import cmux, cmuxError @@ -70,22 +71,123 @@ def _raw_send(sock, command: str, timeout: float = 3.0) -> str: return data.decode().strip() +def _preferred_worktree_slug(): + env_slug = os.environ.get("CMUX_TAG") or os.environ.get("CMUX_BRANCH_SLUG") + if env_slug: + return env_slug.strip().lower() + + cwd = os.getcwd() + marker = "/worktrees/" + if marker in cwd: + tail = cwd.split(marker, 1)[1] + slug = tail.split("/", 1)[0].strip().lower() + if slug: + return slug + return "" + + +def _derived_app_candidates_for_current_worktree(): + project_path = os.path.realpath(os.path.join(os.getcwd(), "GhosttyTabs.xcodeproj")) + info_paths = glob.glob(os.path.expanduser( + "~/Library/Developer/Xcode/DerivedData/GhosttyTabs-*/info.plist" + )) + matches = [] + for info_path in info_paths: + try: + with open(info_path, "rb") as f: + info = plistlib.load(f) + except Exception: + continue + workspace_path = info.get("WorkspacePath") + if not workspace_path: + continue + if os.path.realpath(workspace_path) != project_path: + continue + derived_root = os.path.dirname(info_path) + app_path = os.path.join(derived_root, "Build/Products/Debug/cmux DEV.app") + if os.path.exists(app_path): + matches.append(app_path) + return matches + + def _find_app(): explicit = os.environ.get("CMUX_APP_PATH") if explicit and os.path.exists(explicit): return explicit + preferred_slug = _preferred_worktree_slug() + if preferred_slug: + preferred_tmp = [] + preferred_tmp.extend(glob.glob(f"/tmp/cmux-{preferred_slug}/Build/Products/Debug/cmux DEV*.app")) + preferred_tmp.extend(glob.glob(f"/private/tmp/cmux-{preferred_slug}/Build/Products/Debug/cmux DEV*.app")) + preferred_tmp = [p for p in preferred_tmp if os.path.exists(p)] + if preferred_tmp: + preferred_tmp.sort(key=os.path.getmtime, reverse=True) + return preferred_tmp[0] + + direct_matches = _derived_app_candidates_for_current_worktree() + if direct_matches: + direct_matches.sort(key=os.path.getmtime, reverse=True) + return direct_matches[0] + + home = os.path.expanduser("~") + derived_candidates = glob.glob(os.path.join( + home, "Library/Developer/Xcode/DerivedData/*/Build/Products/Debug/cmux DEV.app" + )) + tmp_candidates = [] + tmp_candidates.extend(glob.glob("/tmp/cmux-*/Build/Products/Debug/cmux DEV*.app")) + tmp_candidates.extend(glob.glob("/private/tmp/cmux-*/Build/Products/Debug/cmux DEV*.app")) + + derived_candidates = [p for p in derived_candidates if os.path.exists(p)] + tmp_candidates = [p for p in tmp_candidates if os.path.exists(p)] + + if preferred_slug: + preferred_derived = [p for p in derived_candidates if preferred_slug in p.lower()] + preferred_tmp = [p for p in tmp_candidates if preferred_slug in p.lower()] + if preferred_derived: + derived_candidates = preferred_derived + if preferred_tmp: + tmp_candidates = preferred_tmp + + if derived_candidates: + derived_candidates.sort(key=os.path.getmtime, reverse=True) + return derived_candidates[0] + + if tmp_candidates: + tmp_candidates.sort(key=os.path.getmtime, reverse=True) + return tmp_candidates[0] + + return "" + + +def _find_cli(preferred_app_path: str = ""): + explicit = os.environ.get("CMUX_CLI_BIN") or os.environ.get("CMUX_CLI") + if explicit and os.path.exists(explicit) and os.access(explicit, os.X_OK): + return explicit + + if preferred_app_path: + debug_dir = os.path.dirname(preferred_app_path) + sibling = os.path.join(debug_dir, "cmux") + if os.path.exists(sibling) and os.access(sibling, os.X_OK): + return sibling + candidates = [] home = os.path.expanduser("~") candidates.extend(glob.glob(os.path.join( - home, "Library/Developer/Xcode/DerivedData/*/Build/Products/Debug/cmux DEV.app" + home, "Library/Developer/Xcode/DerivedData/*/Build/Products/Debug/cmux" ))) - candidates.extend(glob.glob("/tmp/cmux-*/Build/Products/Debug/cmux DEV*.app")) - candidates.extend(glob.glob("/private/tmp/cmux-*/Build/Products/Debug/cmux DEV*.app")) - - candidates = [p for p in candidates if os.path.exists(p)] + candidates.extend(glob.glob("/tmp/cmux-*/Build/Products/Debug/cmux")) + candidates.extend(glob.glob("/private/tmp/cmux-*/Build/Products/Debug/cmux")) + candidates = [p for p in candidates if os.path.exists(p) and os.access(p, os.X_OK)] if not candidates: return "" + + preferred_slug = _preferred_worktree_slug() + if preferred_slug: + preferred = [p for p in candidates if preferred_slug in p.lower()] + if preferred: + candidates = preferred + candidates.sort(key=os.path.getmtime, reverse=True) return candidates[0] @@ -131,7 +233,7 @@ def _launch_cmux(app_path: str, socket_path: str, mode: str = None, extra_env: d launch_env.update(extra_env) for key, value in launch_env.items(): env_args.extend(["--env", f"{key}={value}"]) - subprocess.Popen(["open", "-a", app_path] + env_args) + subprocess.Popen(["open", "-na", app_path] + env_args) if not _wait_for_socket(socket_path): raise RuntimeError(f"Socket {socket_path} not created after launch") time.sleep(8) @@ -475,6 +577,60 @@ def test_password_mode_v2_auth_flow(socket_path: str, app_path: str) -> TestResu return result +def test_password_mode_cli_exit_code(socket_path: str, app_path: str) -> TestResult: + """Verify CLI exits non-zero on auth-required and succeeds with --password.""" + result = TestResult("Password mode CLI exit code") + password = f"cmux-pass-{os.getpid()}" + try: + cli_path = _find_cli(preferred_app_path=app_path) + if not cli_path: + result.failure("Could not find cmux CLI binary") + return result + + _kill_cmux(app_path) + _launch_cmux( + app_path, + socket_path, + mode="password", + extra_env={"CMUX_SOCKET_PASSWORD": password} + ) + + no_auth = subprocess.run( + [cli_path, "--socket", socket_path, "ping"], + capture_output=True, + text=True, + timeout=10 + ) + combined = f"{no_auth.stdout}\n{no_auth.stderr}" + if no_auth.returncode == 0: + result.failure("CLI ping without password exited 0 in password mode") + return result + if "Authentication required" not in combined: + result.failure(f"Unexpected unauthenticated CLI output: {combined!r}") + return result + + with_auth = subprocess.run( + [cli_path, "--socket", socket_path, "--password", password, "ping"], + capture_output=True, + text=True, + timeout=10 + ) + if with_auth.returncode != 0: + result.failure( + f"CLI ping with password failed: exit={with_auth.returncode} " + f"stdout={with_auth.stdout!r} stderr={with_auth.stderr!r}" + ) + return result + if "PONG" not in with_auth.stdout: + result.failure(f"Expected PONG with password, got: {with_auth.stdout!r}") + return result + + result.success("CLI exits non-zero for auth_required and succeeds with --password") + except Exception as e: + result.failure(f"{type(e).__name__}: {e}") + return result + + # --------------------------------------------------------------------------- # Main # --------------------------------------------------------------------------- @@ -545,6 +701,7 @@ def run_tests(): run_test(test_password_mode_requires_auth, socket_path, app_path) run_test(test_password_mode_v1_auth_flow, socket_path, app_path) run_test(test_password_mode_v2_auth_flow, socket_path, app_path) + run_test(test_password_mode_cli_exit_code, socket_path, app_path) print() # ── Cleanup: leave cmux in cmuxOnly mode ── From 1809b06867ca06f4cfa472654e2c25f9f074c6d1 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 01:48:29 -0800 Subject: [PATCH 060/214] Add Nick Schrock testimonial and subtitles to wall of love (#297) * Add Nick Schrock testimonial and subtitles to wall of love - Add Nick Schrock (@schrockn, Dagster Labs founder, GraphQL co-creator) testimonial - Add subtitle field for notable contributors (Mitchell Hashimoto, Nick Schrock) - Render subtitle in TestimonialCard between name and handle * Add Nick Schrock profile photo * Download avatar images to repo instead of hotlinking * Show subtitle after name in attribution lines --- web/app/page.tsx | 2 +- web/app/testimonials.tsx | 21 +++++++++++++++++---- web/public/avatars/joeriddles10.jpg | Bin 0 -> 30232 bytes web/public/avatars/mitchellh.jpg | Bin 0 -> 21607 bytes web/public/avatars/schrockn.jpg | Bin 0 -> 38560 bytes 5 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 web/public/avatars/joeriddles10.jpg create mode 100644 web/public/avatars/mitchellh.jpg create mode 100644 web/public/avatars/schrockn.jpg diff --git a/web/app/page.tsx b/web/app/page.tsx index 3324519d..eb78a272 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -243,7 +243,7 @@ export default function Home() { className="rounded-full inline-block" /> )} - {t.name} + {t.name}{"subtitle" in t && t.subtitle ? `, ${t.subtitle}` : ""} </a> </span> </li> diff --git a/web/app/testimonials.tsx b/web/app/testimonials.tsx index bfcaf734..539afe59 100644 --- a/web/app/testimonials.tsx +++ b/web/app/testimonials.tsx @@ -2,12 +2,21 @@ export const testimonials = [ { name: "Mitchell Hashimoto", handle: "@mitchellh", - avatar: - "https://pbs.twimg.com/profile_images/1141762999838842880/64_Y4_XB_400x400.jpg", + subtitle: "Creator of Ghostty and founder of HashiCorp", + avatar: "/avatars/mitchellh.jpg", text: "Another day another libghostty-based project, this time a macOS terminal with vertical tabs, better organization/notifications, embedded/scriptable browser specifically targeted towards people who use a ton of terminal-based agentic workflows.", url: "https://x.com/mitchellh/status/2024913161238053296", platform: "x" as const, }, + { + name: "Nick Schrock", + handle: "@schrockn", + subtitle: "Creator of Dagster. GraphQL co-creator.", + avatar: "/avatars/schrockn.jpg", + text: "This is exactly the product I've been looking for. After two hours this am I've in love.", + url: "https://x.com/schrockn/status/2025182278637207857", + platform: "x" as const, + }, { name: "johnthedebs", handle: "johnthedebs", @@ -19,8 +28,7 @@ export const testimonials = [ { name: "Joe Riddle", handle: "@joeriddles10", - avatar: - "https://pbs.twimg.com/profile_images/1466920091707076608/pxfGMeC0_400x400.jpg", + avatar: "/avatars/joeriddles10.jpg", text: "Vertical tabs in my terminal \u{1F924} I never thought of that before. I use and love Firefox vertical tabs.", url: "https://x.com/joeriddles10/status/2024914132416561465", platform: "x" as const, @@ -116,6 +124,11 @@ export function TestimonialCard({ <div className="font-medium text-sm truncate"> {testimonial.name} </div> + {"subtitle" in testimonial && testimonial.subtitle && ( + <div className="text-xs text-muted truncate"> + {testimonial.subtitle} + </div> + )} <div className="text-xs text-muted truncate"> {testimonial.handle} </div> diff --git a/web/public/avatars/joeriddles10.jpg b/web/public/avatars/joeriddles10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23c61e6ce85c841b081ac8abc97b7ba1baf058b8 GIT binary patch literal 30232 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 literal 0 HcmV?d00001 diff --git a/web/public/avatars/mitchellh.jpg b/web/public/avatars/mitchellh.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d8d0b1f76e50ae5f496b1c56e9cf153eeb12c66 GIT binary patch literal 21607 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 Y{{YwnfNfogj`ec50YS|P>tLV%+30+hy#N3J literal 0 HcmV?d00001 diff --git a/web/public/avatars/schrockn.jpg b/web/public/avatars/schrockn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51224b227feeb63f13bf09dac0cd4f4bd78875e1 GIT binary patch literal 38560 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 ZHs2WK5n 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 N^s=p-I+O83{eO)s0T=)P literal 0 HcmV?d00001 From d69bd66588f0a0f9771ccf8b5663053bdccf0886 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 15:13:49 -0800 Subject: [PATCH 061/214] Fix Cmd +/- browser zoom shortcut matching --- Sources/AppDelegate.swift | 24 +++++------ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 41 +++++++++++++++++++ 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 23197bba..cfb30cd4 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -118,21 +118,21 @@ func browserZoomShortcutAction( .intersection(.deviceIndependentFlagsMask) .subtracting([.numericPad, .function]) let key = chars.lowercased() + let hasCommand = normalizedFlags.contains(.command) + let hasOnlyCommandAndOptionalShift = hasCommand && normalizedFlags.isDisjoint(with: [.control, .option]) - if normalizedFlags == [.command] { - if key == "=" || keyCode == 24 || keyCode == 69 { // kVK_ANSI_Equal / kVK_ANSI_KeypadPlus - return .zoomIn - } - if key == "-" || keyCode == 27 || keyCode == 78 { // kVK_ANSI_Minus / kVK_ANSI_KeypadMinus - return .zoomOut - } - if key == "0" || keyCode == 29 || keyCode == 82 { // kVK_ANSI_0 / kVK_ANSI_Keypad0 - return .reset - } + guard hasOnlyCommandAndOptionalShift else { return nil } + + if key == "=" || key == "+" || keyCode == 24 || keyCode == 69 { // kVK_ANSI_Equal / kVK_ANSI_KeypadPlus + return .zoomIn } - if normalizedFlags == [.command, .shift] && (key == "=" || key == "+" || keyCode == 24 || keyCode == 69) { - return .zoomIn + if key == "-" || key == "_" || keyCode == 27 || keyCode == 78 { // kVK_ANSI_Minus / kVK_ANSI_KeypadMinus + return .zoomOut + } + + if key == "0" || keyCode == 29 || keyCode == 82 { // kVK_ANSI_0 / kVK_ANSI_Keypad0 + return .reset } return nil diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index cc8f5395..d66de4b7 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -680,6 +680,47 @@ final class BrowserOmnibarCommandNavigationTests: XCTestCase { } } +final class BrowserZoomShortcutActionTests: XCTestCase { + func testZoomInSupportsEqualsAndPlusVariants() { + XCTAssertEqual( + browserZoomShortcutAction(flags: [.command], chars: "=", keyCode: 24), + .zoomIn + ) + XCTAssertEqual( + browserZoomShortcutAction(flags: [.command], chars: "+", keyCode: 24), + .zoomIn + ) + XCTAssertEqual( + browserZoomShortcutAction(flags: [.command, .shift], chars: "+", keyCode: 24), + .zoomIn + ) + } + + func testZoomOutSupportsMinusAndUnderscoreVariants() { + XCTAssertEqual( + browserZoomShortcutAction(flags: [.command], chars: "-", keyCode: 27), + .zoomOut + ) + XCTAssertEqual( + browserZoomShortcutAction(flags: [.command, .shift], chars: "_", keyCode: 27), + .zoomOut + ) + } + + func testZoomRequiresCommandWithoutOptionOrControl() { + XCTAssertNil(browserZoomShortcutAction(flags: [], chars: "=", keyCode: 24)) + XCTAssertNil(browserZoomShortcutAction(flags: [.command, .option], chars: "=", keyCode: 24)) + XCTAssertNil(browserZoomShortcutAction(flags: [.command, .control], chars: "-", keyCode: 27)) + } + + func testResetSupportsCommandZero() { + XCTAssertEqual( + browserZoomShortcutAction(flags: [.command], chars: "0", keyCode: 29), + .reset + ) + } +} + final class SidebarCommandHintPolicyTests: XCTestCase { func testCommandHintRequiresCommandOnlyModifier() { XCTAssertTrue(SidebarCommandHintPolicy.shouldShowHints(for: [.command])) From f366fb0b00ab309332a88837e46feb271446abc8 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 15:25:30 -0800 Subject: [PATCH 062/214] Fix terminal Cmd+F overlay layering and add regression guardrails --- .github/workflows/ci.yml | 9 ++ CLAUDE.md | 1 + Sources/GhosttyTerminalView.swift | 61 ++++++++++++ Sources/Panels/TerminalPanelView.swift | 51 ++++------ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 99 +++++++++++++++++++ scripts/check-terminal-overlay-layering.sh | 36 +++++++ 6 files changed, 226 insertions(+), 31 deletions(-) create mode 100755 scripts/check-terminal-overlay-layering.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e7bb8bc..d004f0a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,15 @@ on: pull_request: jobs: + terminal-overlay-contract: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Enforce terminal overlay layering contract + run: ./scripts/check-terminal-overlay-layering.sh + web-typecheck: runs-on: ubuntu-latest defaults: diff --git a/CLAUDE.md b/CLAUDE.md index bc3d5bba..c7617e40 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -93,6 +93,7 @@ tail -f "$(cat /tmp/cmux-last-debug-log-path 2>/dev/null || echo /tmp/cmux-debug - **Custom UTTypes** for drag-and-drop must be declared in `Resources/Info.plist` under `UTExportedTypeDeclarations` (e.g. `com.splittabbar.tabtransfer`, `com.cmux.sidebar-tab-reorder`). - Do not add an app-level display link or manual `ghostty_surface_draw` loop; rely on Ghostty wakeups/renderer to avoid typing lag. +- **Terminal find layering contract:** `SurfaceSearchOverlay` must be mounted from `GhosttySurfaceScrollView` in `Sources/GhosttyTerminalView.swift` (AppKit portal layer), not from SwiftUI panel containers such as `Sources/Panels/TerminalPanelView.swift`. Portal-hosted terminal views can sit above SwiftUI during split/workspace churn. - **Submodule safety:** When modifying a submodule (ghostty, vendor/bonsplit, etc.), always push the submodule commit to its remote `main` branch BEFORE committing the updated pointer in the parent repo. Never commit on a detached HEAD or temporary branch — the commit will be orphaned and lost. Verify with: `cd <submodule> && git merge-base --is-ancestor HEAD origin/main`. ## Socket command threading policy diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 78121fa0..0ac7a61d 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -3025,6 +3025,7 @@ final class GhosttySurfaceScrollView: NSView { private let notificationRingLayer: CAShapeLayer private let flashOverlayView: GhosttyFlashOverlayView private let flashLayer: CAShapeLayer + private var searchOverlayHostingView: NSHostingView<SurfaceSearchOverlay>? private var observers: [NSObjectProtocol] = [] private var windowObservers: [NSObjectProtocol] = [] private var isLiveScrolling = false @@ -3408,6 +3409,59 @@ final class GhosttySurfaceScrollView: NSView { CATransaction.commit() } + func setSearchOverlay(searchState: TerminalSurface.SearchState?) { + if !Thread.isMainThread { + DispatchQueue.main.async { [weak self] in + self?.setSearchOverlay(searchState: searchState) + } + return + } + + // Layering contract: keep terminal Cmd+F UI inside this portal-hosted AppKit view. + // SwiftUI panel-level overlays can fall behind portal-hosted terminal surfaces. + guard let terminalSurface = surfaceView.terminalSurface, + let searchState else { + searchOverlayHostingView?.removeFromSuperview() + searchOverlayHostingView = nil + return + } + + let rootView = SurfaceSearchOverlay( + surface: terminalSurface, + searchState: searchState, + onClose: { [weak self] in + self?.surfaceView.terminalSurface?.searchState = nil + self?.moveFocus() + } + ) + + if let overlay = searchOverlayHostingView { + overlay.rootView = rootView + if overlay.superview !== self { + overlay.removeFromSuperview() + addSubview(overlay) + NSLayoutConstraint.activate([ + overlay.topAnchor.constraint(equalTo: topAnchor), + overlay.bottomAnchor.constraint(equalTo: bottomAnchor), + overlay.leadingAnchor.constraint(equalTo: leadingAnchor), + overlay.trailingAnchor.constraint(equalTo: trailingAnchor), + ]) + } + return + } + + let overlay = NSHostingView(rootView: rootView) + overlay.translatesAutoresizingMaskIntoConstraints = false + addSubview(overlay) + NSLayoutConstraint.activate([ + overlay.topAnchor.constraint(equalTo: topAnchor), + overlay.bottomAnchor.constraint(equalTo: bottomAnchor), + overlay.leadingAnchor.constraint(equalTo: leadingAnchor), + overlay.trailingAnchor.constraint(equalTo: trailingAnchor), + ]) + searchOverlayHostingView = overlay + } + private func dropZoneOverlayFrame(for zone: DropZone, in size: CGSize) -> CGRect { let padding: CGFloat = 4 switch zone { @@ -3688,6 +3742,11 @@ final class GhosttySurfaceScrollView: NSView { ) } + func debugHasSearchOverlay() -> Bool { + guard let overlay = searchOverlayHostingView else { return false } + return overlay.superview === self && !overlay.isHidden + } + #endif /// Handle file/URL drops, forwarding to the terminal as shell-escaped paths. @@ -4359,6 +4418,7 @@ struct GhosttyTerminalView: NSViewRepresentable { var showsUnreadNotificationRing: Bool = false var inactiveOverlayColor: NSColor = .clear var inactiveOverlayOpacity: Double = 0 + var searchState: TerminalSurface.SearchState? = nil var reattachToken: UInt64 = 0 var onFocus: ((UUID) -> Void)? = nil var onTriggerFlash: (() -> Void)? = nil @@ -4460,6 +4520,7 @@ struct GhosttyTerminalView: NSViewRepresentable { visible: showsInactiveOverlay ) hostedView.setNotificationRing(visible: showsUnreadNotificationRing) + hostedView.setSearchOverlay(searchState: searchState) hostedView.setFocusHandler { onFocus?(terminalSurface.id) } hostedView.setTriggerFlashHandler(onTriggerFlash) let forwardedDropZone = isVisibleInUI ? paneDropZone : nil diff --git a/Sources/Panels/TerminalPanelView.swift b/Sources/Panels/TerminalPanelView.swift index ce0ca87d..200104df 100644 --- a/Sources/Panels/TerminalPanelView.swift +++ b/Sources/Panels/TerminalPanelView.swift @@ -15,37 +15,26 @@ struct TerminalPanelView: View { let onTriggerFlash: () -> Void var body: some View { - ZStack(alignment: .topLeading) { - GhosttyTerminalView( - terminalSurface: panel.surface, - isActive: isFocused, - isVisibleInUI: isVisibleInUI, - portalZPriority: portalPriority, - showsInactiveOverlay: isSplit && !isFocused, - showsUnreadNotificationRing: hasUnreadNotification, - inactiveOverlayColor: appearance.unfocusedOverlayNSColor, - inactiveOverlayOpacity: appearance.unfocusedOverlayOpacity, - reattachToken: panel.viewReattachToken, - onFocus: { _ in onFocus() }, - onTriggerFlash: onTriggerFlash - ) - // Keep the NSViewRepresentable identity stable across bonsplit structural updates. - // This prevents transient teardown/recreate that can momentarily detach the hosted terminal view. - .id(panel.id) - .background(Color.clear) - - // Search overlay - if let searchState = panel.searchState { - SurfaceSearchOverlay( - surface: panel.surface, - searchState: searchState, - onClose: { - panel.searchState = nil - panel.hostedView.moveFocus() - } - ) - } - } + // Layering contract: terminal find UI is mounted in GhosttySurfaceScrollView (AppKit portal layer) + // via `searchState`. Rendering `SurfaceSearchOverlay` in this SwiftUI container can hide it. + GhosttyTerminalView( + terminalSurface: panel.surface, + isActive: isFocused, + isVisibleInUI: isVisibleInUI, + portalZPriority: portalPriority, + showsInactiveOverlay: isSplit && !isFocused, + showsUnreadNotificationRing: hasUnreadNotification, + inactiveOverlayColor: appearance.unfocusedOverlayNSColor, + inactiveOverlayOpacity: appearance.unfocusedOverlayOpacity, + searchState: panel.searchState, + reattachToken: panel.viewReattachToken, + onFocus: { _ in onFocus() }, + onTriggerFlash: onTriggerFlash + ) + // Keep the NSViewRepresentable identity stable across bonsplit structural updates. + // This prevents transient teardown/recreate that can momentarily detach the hosted terminal view. + .id(panel.id) + .background(Color.clear) } } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index cc8f5395..2019101a 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -3164,6 +3164,105 @@ final class GhosttySurfaceOverlayTests: XCTestCase { state = hostedView.debugInactiveOverlayState() XCTAssertTrue(state.isHidden) } + + func testSearchOverlayMountsAndUnmountsWithSearchState() { + let surface = TerminalSurface( + tabId: UUID(), + context: GHOSTTY_SURFACE_CONTEXT_SPLIT, + configTemplate: nil, + workingDirectory: nil + ) + let hostedView = surface.hostedView + XCTAssertFalse(hostedView.debugHasSearchOverlay()) + + let searchState = TerminalSurface.SearchState(needle: "example") + hostedView.setSearchOverlay(searchState: searchState) + XCTAssertTrue(hostedView.debugHasSearchOverlay()) + + hostedView.setSearchOverlay(searchState: nil) + XCTAssertFalse(hostedView.debugHasSearchOverlay()) + } + + func testSearchOverlaySurvivesPortalRebindDuringSplitLikeChurn() { + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 480, height: 320), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + defer { window.orderOut(nil) } + let portal = WindowTerminalPortal(window: window) + + guard let contentView = window.contentView else { + XCTFail("Expected content view") + return + } + + let anchorA = NSView(frame: NSRect(x: 20, y: 20, width: 180, height: 140)) + let anchorB = NSView(frame: NSRect(x: 220, y: 20, width: 180, height: 140)) + contentView.addSubview(anchorA) + contentView.addSubview(anchorB) + + let surface = TerminalSurface( + tabId: UUID(), + context: GHOSTTY_SURFACE_CONTEXT_SPLIT, + configTemplate: nil, + workingDirectory: nil + ) + let hostedView = surface.hostedView + hostedView.setSearchOverlay(searchState: TerminalSurface.SearchState(needle: "split")) + XCTAssertTrue(hostedView.debugHasSearchOverlay()) + + portal.bind(hostedView: hostedView, to: anchorA, visibleInUI: true) + XCTAssertTrue(hostedView.debugHasSearchOverlay()) + + portal.bind(hostedView: hostedView, to: anchorB, visibleInUI: true) + XCTAssertTrue( + hostedView.debugHasSearchOverlay(), + "Split-like anchor churn should not unmount terminal search overlay" + ) + } + + func testSearchOverlaySurvivesPortalVisibilityToggleDuringWorkspaceSwitchLikeChurn() { + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 480, height: 320), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + defer { window.orderOut(nil) } + let portal = WindowTerminalPortal(window: window) + + guard let contentView = window.contentView else { + XCTFail("Expected content view") + return + } + + let anchor = NSView(frame: NSRect(x: 40, y: 40, width: 220, height: 160)) + contentView.addSubview(anchor) + + let surface = TerminalSurface( + tabId: UUID(), + context: GHOSTTY_SURFACE_CONTEXT_SPLIT, + configTemplate: nil, + workingDirectory: nil + ) + let hostedView = surface.hostedView + hostedView.setSearchOverlay(searchState: TerminalSurface.SearchState(needle: "workspace")) + XCTAssertTrue(hostedView.debugHasSearchOverlay()) + + portal.bind(hostedView: hostedView, to: anchor, visibleInUI: true) + XCTAssertTrue(hostedView.debugHasSearchOverlay()) + + portal.bind(hostedView: hostedView, to: anchor, visibleInUI: false) + XCTAssertTrue(hostedView.debugHasSearchOverlay()) + + portal.bind(hostedView: hostedView, to: anchor, visibleInUI: true) + XCTAssertTrue( + hostedView.debugHasSearchOverlay(), + "Workspace-switch-like visibility toggles should not unmount terminal search overlay" + ) + } } @MainActor diff --git a/scripts/check-terminal-overlay-layering.sh b/scripts/check-terminal-overlay-layering.sh new file mode 100755 index 00000000..6a7e9dde --- /dev/null +++ b/scripts/check-terminal-overlay-layering.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")/.." + +allowed_a="Sources/Find/SurfaceSearchOverlay.swift" +allowed_b="Sources/GhosttyTerminalView.swift" +pattern='SurfaceSearchOverlay[[:space:]]*\(' + +if command -v rg >/dev/null 2>&1; then + matches="$( + rg -n --no-heading --glob '*.swift' "$pattern" Sources cmuxTests \ + | grep -v "^${allowed_a}:" \ + | grep -v "^${allowed_b}:" \ + || true + )" +else + matches="$( + grep -RIn --include='*.swift' -E "$pattern" Sources cmuxTests \ + | grep -v "^${allowed_a}:" \ + | grep -v "^${allowed_b}:" \ + || true + )" +fi + +if [[ -n "$matches" ]]; then + echo "Terminal overlay layering contract violation:" + echo "SurfaceSearchOverlay may only be instantiated in:" + echo " - ${allowed_a}" + echo " - ${allowed_b}" + echo + echo "$matches" + exit 1 +fi + +echo "OK: terminal overlay layering contract satisfied." From 04073f1fd8fee3abb63ef198a9464d3a725c3db1 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 15:32:43 -0800 Subject: [PATCH 063/214] Route terminal Cmd zoom shortcuts to Ghostty --- Sources/AppDelegate.swift | 165 +++++++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 51 ++++++ 2 files changed, 208 insertions(+), 8 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index cfb30cd4..535272ad 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -138,6 +138,61 @@ func browserZoomShortcutAction( return nil } +func shouldRouteTerminalFontZoomShortcutToGhostty( + firstResponderIsGhostty: Bool, + flags: NSEvent.ModifierFlags, + chars: String, + keyCode: UInt16 +) -> Bool { + guard firstResponderIsGhostty else { return false } + return browserZoomShortcutAction(flags: flags, chars: chars, keyCode: keyCode) != nil +} + +#if DEBUG +func browserZoomShortcutTraceCandidate( + flags: NSEvent.ModifierFlags, + chars: String, + keyCode: UInt16 +) -> Bool { + let normalizedFlags = flags + .intersection(.deviceIndependentFlagsMask) + .subtracting([.numericPad, .function]) + guard normalizedFlags.contains(.command) else { return false } + + let key = chars.lowercased() + if key == "=" || key == "+" || key == "-" || key == "_" || key == "0" { + return true + } + switch keyCode { + case 24, 27, 29, 69, 78, 82: // ANSI and keypad zoom keys + return true + default: + return false + } +} + +func browserZoomShortcutTraceFlagsString(_ flags: NSEvent.ModifierFlags) -> String { + let normalizedFlags = flags + .intersection(.deviceIndependentFlagsMask) + .subtracting([.numericPad, .function]) + var parts: [String] = [] + if normalizedFlags.contains(.command) { parts.append("Cmd") } + if normalizedFlags.contains(.shift) { parts.append("Shift") } + if normalizedFlags.contains(.option) { parts.append("Opt") } + if normalizedFlags.contains(.control) { parts.append("Ctrl") } + return parts.isEmpty ? "none" : parts.joined(separator: "+") +} + +func browserZoomShortcutTraceActionString(_ action: BrowserZoomShortcutAction?) -> String { + guard let action else { return "none" } + switch action { + case .zoomIn: return "zoomIn" + case .zoomOut: return "zoomOut" + case .reset: return "reset" + } +} +#endif + @MainActor final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDelegate, NSMenuItemValidation { static var shared: AppDelegate? @@ -2044,21 +2099,82 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } } - if let action = browserZoomShortcutAction(flags: flags, chars: chars, keyCode: event.keyCode), - let manager = tabManager { + #if DEBUG + logBrowserZoomShortcutTrace(stage: "probe", event: event, flags: flags, chars: chars) + #endif + let zoomAction = browserZoomShortcutAction(flags: flags, chars: chars, keyCode: event.keyCode) + #if DEBUG + logBrowserZoomShortcutTrace(stage: "match", event: event, flags: flags, chars: chars, action: zoomAction) + #endif + if let action = zoomAction, let manager = tabManager { + let handled: Bool switch action { case .zoomIn: - return manager.zoomInFocusedBrowser() + handled = manager.zoomInFocusedBrowser() case .zoomOut: - return manager.zoomOutFocusedBrowser() + handled = manager.zoomOutFocusedBrowser() case .reset: - return manager.resetZoomFocusedBrowser() + handled = manager.resetZoomFocusedBrowser() } + #if DEBUG + logBrowserZoomShortcutTrace( + stage: "dispatch", + event: event, + flags: flags, + chars: chars, + action: action, + handled: handled + ) + #endif + return handled } + #if DEBUG + if zoomAction != nil, tabManager == nil { + logBrowserZoomShortcutTrace( + stage: "dispatch.noManager", + event: event, + flags: flags, + chars: chars, + action: zoomAction, + handled: false + ) + } + #endif return false } +#if DEBUG + private func logBrowserZoomShortcutTrace( + stage: String, + event: NSEvent, + flags: NSEvent.ModifierFlags, + chars: String, + action: BrowserZoomShortcutAction? = nil, + handled: Bool? = nil + ) { + guard browserZoomShortcutTraceCandidate(flags: flags, chars: chars, keyCode: event.keyCode) else { + return + } + + let keyWindow = NSApp.keyWindow + let firstResponderType = keyWindow?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" + let panel = tabManager?.focusedBrowserPanel + let panelToken = panel.map { String($0.id.uuidString.prefix(8)) } ?? "nil" + let panelZoom = panel?.webView.pageZoom ?? -1 + var line = + "zoom.shortcut stage=\(stage) event=\(NSWindow.keyDescription(event)) " + + "chars='\(chars)' flags=\(browserZoomShortcutTraceFlagsString(flags)) " + + "action=\(browserZoomShortcutTraceActionString(action)) keyWin=\(keyWindow?.windowNumber ?? -1) " + + "fr=\(firstResponderType) panel=\(panelToken) zoom=\(String(format: "%.3f", panelZoom)) " + + "addrBarId=\(browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil")" + if let handled { + line += " handled=\(handled ? 1 : 0)" + } + dlog(line) + } +#endif + @discardableResult private func focusBrowserAddressBar(panelId: UUID) -> Bool { guard let tabManager, @@ -3672,6 +3788,22 @@ private extension NSWindow { #endif return result } + + // Preserve Ghostty's terminal font-size shortcuts (Cmd +/−/0) when + // the terminal is focused. Otherwise our browser menu shortcuts can + // consume the event even when no browser panel is focused. + if shouldRouteTerminalFontZoomShortcutToGhostty( + firstResponderIsGhostty: true, + flags: event.modifierFlags, + chars: event.charactersIgnoringModifiers ?? "", + keyCode: event.keyCode + ) { + ghosttyView.keyDown(with: event) +#if DEBUG + dlog("zoom.shortcut stage=window.ghosttyKeyDownDirect event=\(Self.keyDescription(event)) handled=1") +#endif + return true + } } if AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true { @@ -3686,11 +3818,28 @@ private extension NSWindow { // events directly to the main menu. This avoids the broken SwiftUI focus path. if self.firstResponder is GhosttyNSView, event.modifierFlags.intersection(.deviceIndependentFlagsMask).contains(.command), - let mainMenu = NSApp.mainMenu, mainMenu.performKeyEquivalent(with: event) { + let mainMenu = NSApp.mainMenu { + let consumedByMenu = mainMenu.performKeyEquivalent(with: event) #if DEBUG - dlog(" → consumed by mainMenu (bypassed SwiftUI)") + if browserZoomShortcutTraceCandidate( + flags: event.modifierFlags, + chars: event.charactersIgnoringModifiers ?? "", + keyCode: event.keyCode + ) { + dlog( + "zoom.shortcut stage=window.mainMenuBypass event=\(Self.keyDescription(event)) " + + "consumed=\(consumedByMenu ? 1 : 0) fr=GhosttyNSView" + ) + } #endif - return true + if !consumedByMenu { + // Fall through to the original performKeyEquivalent path below. + } else { +#if DEBUG + dlog(" → consumed by mainMenu (bypassed SwiftUI)") +#endif + return true + } } let result = cmux_performKeyEquivalent(with: event) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index d66de4b7..9099128f 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -721,6 +721,57 @@ final class BrowserZoomShortcutActionTests: XCTestCase { } } +final class BrowserZoomShortcutRoutingPolicyTests: XCTestCase { + func testRoutesWhenGhosttyIsFirstResponderAndShortcutIsZoom() { + XCTAssertTrue( + shouldRouteTerminalFontZoomShortcutToGhostty( + firstResponderIsGhostty: true, + flags: [.command], + chars: "=", + keyCode: 24 + ) + ) + XCTAssertTrue( + shouldRouteTerminalFontZoomShortcutToGhostty( + firstResponderIsGhostty: true, + flags: [.command], + chars: "-", + keyCode: 27 + ) + ) + XCTAssertTrue( + shouldRouteTerminalFontZoomShortcutToGhostty( + firstResponderIsGhostty: true, + flags: [.command], + chars: "0", + keyCode: 29 + ) + ) + } + + func testDoesNotRouteWhenFirstResponderIsNotGhostty() { + XCTAssertFalse( + shouldRouteTerminalFontZoomShortcutToGhostty( + firstResponderIsGhostty: false, + flags: [.command], + chars: "=", + keyCode: 24 + ) + ) + } + + func testDoesNotRouteForNonZoomShortcuts() { + XCTAssertFalse( + shouldRouteTerminalFontZoomShortcutToGhostty( + firstResponderIsGhostty: true, + flags: [.command], + chars: "n", + keyCode: 45 + ) + ) + } +} + final class SidebarCommandHintPolicyTests: XCTestCase { func testCommandHintRequiresCommandOnlyModifier() { XCTAssertTrue(SidebarCommandHintPolicy.shouldShowHints(for: [.command])) From 6d64ca938e8f79206016e9fb15455171f6fd7ca5 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 15:37:22 -0800 Subject: [PATCH 064/214] Add Reddit testimonial from u/afruth to wall of love (#314) --- web/app/testimonials.tsx | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/web/app/testimonials.tsx b/web/app/testimonials.tsx index 539afe59..6b484a9a 100644 --- a/web/app/testimonials.tsx +++ b/web/app/testimonials.tsx @@ -41,11 +41,19 @@ export const testimonials = [ url: "https://news.ycombinator.com/item?id=47082577", platform: "hn" as const, }, + { + name: "afruth", + handle: "u/afruth", + avatar: null, + text: "I like it, ran it in the past day on three parallel projects each with several worktrees. Having this paired with lazygit and yazi / nvim made me a bit more productive than usual without having to chase multiple ghostty / iTerm instances. Also feels more natural than tmux.", + url: "https://www.reddit.com/r/ClaudeCode/comments/1r9g45u/comment/o6sxbr3/", + platform: "reddit" as const, + }, ]; export type Testimonial = (typeof testimonials)[number]; -export function PlatformIcon({ platform }: { platform: "x" | "hn" }) { +export function PlatformIcon({ platform }: { platform: "x" | "hn" | "reddit" }) { if (platform === "x") { return ( <svg @@ -59,6 +67,19 @@ export function PlatformIcon({ platform }: { platform: "x" | "hn" }) { </svg> ); } + if (platform === "reddit") { + return ( + <svg + width="14" + height="14" + viewBox="0 0 24 24" + fill="#FF4500" + className="text-muted" + > + <path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm6.066 13.71c.147.307.222.644.222.994 0 1.987-2.752 3.596-6.148 3.596s-6.148-1.61-6.148-3.596c0-.35.075-.687.222-.994a1.426 1.426 0 01-.468-1.068c0-.798.648-1.446 1.446-1.446.39 0 .744.155 1.003.408 1.018-.67 2.396-1.09 3.917-1.148l.734-3.296a.348.348 0 01.416-.268l2.39.53a1.05 1.05 0 011.976.49c0 .58-.47 1.05-1.05 1.05a1.05 1.05 0 01-1.04-1.18l-2.07-.46-.625 2.81c1.465.076 2.786.493 3.768 1.14a1.44 1.44 0 011.003-.408c.798 0 1.446.648 1.446 1.446 0 .416-.176.79-.468 1.054zM9.06 12.61c-.58 0-1.05.47-1.05 1.05s.47 1.05 1.05 1.05 1.05-.47 1.05-1.05-.47-1.05-1.05-1.05zm5.88 0c-.58 0-1.05.47-1.05 1.05s.47 1.05 1.05 1.05 1.05-.47 1.05-1.05-.47-1.05-1.05-1.05zm-5.04 3.48c-.1-.1-.1-.26 0-.36.1-.1.26-.1.36 0 .58.58 1.39.87 2.19.87s1.61-.29 2.19-.87c.1-.1.26-.1.36 0 .1.1.1.26 0 .36-.68.68-1.59 1.05-2.55 1.05s-1.87-.37-2.55-1.05z" /> + </svg> + ); + } return ( <svg width="14" From 1824d1a8f1e7081149ea83adfdb95e6441b2631d Mon Sep 17 00:00:00 2001 From: Brian Le <brian@brianle.xyz> Date: Sun, 22 Feb 2026 18:38:34 -0500 Subject: [PATCH 065/214] feat(shortcuts): add rename-workspace keybind --- README.md | 1 + Sources/AppDelegate.swift | 35 +++++++++++++++++++ Sources/KeyboardShortcutSettings.swift | 6 ++++ Sources/cmuxApp.swift | 4 +++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 19 ++++++++++ web/app/keyboard-shortcuts.tsx | 5 +++ 6 files changed, 70 insertions(+) diff --git a/README.md b/README.md index 31578c73..e2c10ae0 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ Everything is scriptable through the CLI and socket API — create workspaces/ta | ⌃ ⌘ ] | Next workspace | | ⌃ ⌘ [ | Previous workspace | | ⌘ ⇧ W | Close workspace | +| ⌘ ⇧ R | Rename workspace | | ⌘ B | Toggle sidebar | ### Surfaces diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 23197bba..870bfaf8 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1673,6 +1673,36 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } + func promptRenameSelectedWorkspace() -> Bool { + guard let tabManager, + let tabId = tabManager.selectedTabId, + let tab = tabManager.tabs.first(where: { $0.id == tabId }) else { + NSSound.beep() + return false + } + + let alert = NSAlert() + alert.messageText = "Rename Workspace" + alert.informativeText = "Enter a custom name for this workspace." + let input = NSTextField(string: tab.customTitle ?? tab.title) + input.placeholderString = "Workspace name" + input.frame = NSRect(x: 0, y: 0, width: 240, height: 22) + alert.accessoryView = input + alert.addButton(withTitle: "Rename") + alert.addButton(withTitle: "Cancel") + let alertWindow = alert.window + alertWindow.initialFirstResponder = input + DispatchQueue.main.async { + alertWindow.makeFirstResponder(input) + input.selectText(nil) + } + + let response = alert.runModal() + guard response == .alertFirstButtonReturn else { return true } + tabManager.setCustomTitle(tabId: tab.id, title: input.stringValue) + return true + } + private func handleCustomShortcut(event: NSEvent) -> Bool { // `charactersIgnoringModifiers` can be nil for some synthetic NSEvents and certain special keys. // Most shortcuts below use keyCode fallbacks, so treat nil as "" rather than bailing out. @@ -1877,6 +1907,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } + if matchShortcut(event: event, shortcut: KeyboardShortcutSettings.shortcut(for: .renameWorkspace)) { + _ = promptRenameSelectedWorkspace() + return true + } + // Numeric shortcuts for specific sidebar tabs: Cmd+1-9 (9 = last workspace) if flags == [.command], let manager = tabManager, diff --git a/Sources/KeyboardShortcutSettings.swift b/Sources/KeyboardShortcutSettings.swift index 8b2b8d14..6d1d0978 100644 --- a/Sources/KeyboardShortcutSettings.swift +++ b/Sources/KeyboardShortcutSettings.swift @@ -17,6 +17,7 @@ enum KeyboardShortcutSettings { case prevSurface case nextSidebarTab case prevSidebarTab + case renameWorkspace case newSurface // Panes / splits @@ -48,6 +49,7 @@ enum KeyboardShortcutSettings { case .prevSurface: return "Previous Surface" case .nextSidebarTab: return "Next Workspace" case .prevSidebarTab: return "Previous Workspace" + case .renameWorkspace: return "Rename Workspace" case .newSurface: return "New Surface" case .focusLeft: return "Focus Pane Left" case .focusRight: return "Focus Pane Right" @@ -73,6 +75,7 @@ enum KeyboardShortcutSettings { case .triggerFlash: return "shortcut.triggerFlash" case .nextSidebarTab: return "shortcut.nextSidebarTab" case .prevSidebarTab: return "shortcut.prevSidebarTab" + case .renameWorkspace: return "shortcut.renameWorkspace" case .focusLeft: return "shortcut.focusLeft" case .focusRight: return "shortcut.focusRight" case .focusUp: return "shortcut.focusUp" @@ -108,6 +111,8 @@ enum KeyboardShortcutSettings { return StoredShortcut(key: "]", command: true, shift: false, option: false, control: true) case .prevSidebarTab: return StoredShortcut(key: "[", command: true, shift: false, option: false, control: true) + case .renameWorkspace: + return StoredShortcut(key: "r", command: true, shift: true, option: false, control: false) case .focusLeft: return StoredShortcut(key: "←", command: true, shift: false, option: true, control: false) case .focusRight: @@ -190,6 +195,7 @@ enum KeyboardShortcutSettings { static func nextSidebarTabShortcut() -> StoredShortcut { shortcut(for: .nextSidebarTab) } static func prevSidebarTabShortcut() -> StoredShortcut { shortcut(for: .prevSidebarTab) } + static func renameWorkspaceShortcut() -> StoredShortcut { shortcut(for: .renameWorkspace) } static func focusLeftShortcut() -> StoredShortcut { shortcut(for: .focusLeft) } static func focusRightShortcut() -> StoredShortcut { shortcut(for: .focusRight) } diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 09b18c59..2f74980c 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -478,6 +478,10 @@ struct cmuxApp: App { (AppDelegate.shared?.tabManager ?? tabManager).selectPreviousTab() } + Button("Rename Workspace…") { + _ = AppDelegate.shared?.promptRenameSelectedWorkspace() + } + Divider() splitCommandButton(title: "Split Right", shortcut: splitRightMenuShortcut) { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index cc8f5395..5ff9b633 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -318,6 +318,25 @@ final class BrowserDeveloperToolsShortcutDefaultsTests: XCTestCase { } } +final class WorkspaceRenameShortcutDefaultsTests: XCTestCase { + func testRenameWorkspaceShortcutDefaultsAndMetadata() { + XCTAssertEqual(KeyboardShortcutSettings.Action.renameWorkspace.label, "Rename Workspace") + XCTAssertEqual(KeyboardShortcutSettings.Action.renameWorkspace.defaultsKey, "shortcut.renameWorkspace") + + let shortcut = KeyboardShortcutSettings.Action.renameWorkspace.defaultShortcut + XCTAssertEqual(shortcut.key, "r") + XCTAssertTrue(shortcut.command) + XCTAssertTrue(shortcut.shift) + XCTAssertFalse(shortcut.option) + XCTAssertFalse(shortcut.control) + } + + func testShortcutDefaultsKeysRemainUnique() { + let keys = KeyboardShortcutSettings.Action.allCases.map(\.defaultsKey) + XCTAssertEqual(Set(keys).count, keys.count) + } +} + @MainActor final class BrowserDeveloperToolsConfigurationTests: XCTestCase { func testBrowserPanelEnablesInspectableWebViewAndDeveloperExtras() { diff --git a/web/app/keyboard-shortcuts.tsx b/web/app/keyboard-shortcuts.tsx index f4c483c0..9aa81ddf 100644 --- a/web/app/keyboard-shortcuts.tsx +++ b/web/app/keyboard-shortcuts.tsx @@ -38,6 +38,11 @@ const CATEGORIES: ShortcutCategory[] = [ combos: [["⌘", "⇧", "W"]], description: "Close workspace", }, + { + id: "ws-rename", + combos: [["⌘", "⇧", "R"]], + description: "Rename workspace", + }, ], }, { From 927b0eb2d1aa4bee8264f75daa05b45135e99112 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 15:39:59 -0800 Subject: [PATCH 066/214] Implement session persistence pass 1 with multi-window restore --- GhosttyTabs.xcodeproj/project.pbxproj | 12 + .../cmux-bash-integration.bash | 12 + .../cmux-zsh-integration.zsh | 12 + Sources/AppDelegate.swift | 901 +++++++++++++++++- Sources/ContentView.swift | 45 +- Sources/GhosttyTerminalView.swift | 11 +- Sources/Panels/TerminalPanel.swift | 4 +- Sources/SessionPersistence.swift | 471 +++++++++ Sources/SidebarSelectionState.swift | 7 +- Sources/TabManager.swift | 69 ++ Sources/TerminalController.swift | 137 +++ Sources/Update/UpdateDelegate.swift | 2 + Sources/Workspace.swift | 493 +++++++++- Sources/cmuxApp.swift | 13 +- .../AppDelegateShortcutRoutingTests.swift | 214 +++++ cmuxTests/SessionPersistenceTests.swift | 382 ++++++++ ..._unfocused_workspace_multi_window_cycle.py | 324 +++++++ ...tore_unfocused_workspace_relaunch_cycle.py | 229 +++++ ...t_shell_scrollback_restore_color_replay.py | 62 ++ ...rollback_restore_replay_path_regression.py | 67 ++ 20 files changed, 3434 insertions(+), 33 deletions(-) create mode 100644 Sources/SessionPersistence.swift create mode 100644 cmuxTests/AppDelegateShortcutRoutingTests.swift create mode 100644 cmuxTests/SessionPersistenceTests.swift create mode 100644 tests/test_session_restore_unfocused_workspace_multi_window_cycle.py create mode 100644 tests/test_session_restore_unfocused_workspace_relaunch_cycle.py create mode 100644 tests/test_shell_scrollback_restore_color_replay.py create mode 100644 tests/test_shell_scrollback_restore_replay_path_regression.py diff --git a/GhosttyTabs.xcodeproj/project.pbxproj b/GhosttyTabs.xcodeproj/project.pbxproj index 65cc12e6..57d28a2b 100644 --- a/GhosttyTabs.xcodeproj/project.pbxproj +++ b/GhosttyTabs.xcodeproj/project.pbxproj @@ -54,6 +54,7 @@ A5001208 /* UpdateTitlebarAccessory.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001218 /* UpdateTitlebarAccessory.swift */; }; A5001209 /* WindowToolbarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001219 /* WindowToolbarController.swift */; }; A5001240 /* WindowDecorationsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001241 /* WindowDecorationsController.swift */; }; + A5001600 /* SessionPersistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001601 /* SessionPersistence.swift */; }; A5001100 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A5001101 /* Assets.xcassets */; }; A5001230 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = A5001231 /* Sparkle */; }; B9000002A1B2C3D4E5F60719 /* cmux.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9000001A1B2C3D4E5F60719 /* cmux.swift */; }; @@ -75,6 +76,8 @@ F2000000A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */; }; F3000000A1B2C3D4E5F60718 /* CJKIMEInputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */; }; F4000000A1B2C3D4E5F60718 /* GhosttyConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */; }; + F5000000A1B2C3D4E5F60718 /* SessionPersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5000001A1B2C3D4E5F60718 /* SessionPersistenceTests.swift */; }; + F6000000A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -177,6 +180,7 @@ A5001222 /* WindowAccessor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowAccessor.swift; sourceTree = "<group>"; }; A5001223 /* UpdateLogStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Update/UpdateLogStore.swift; sourceTree = "<group>"; }; A5001241 /* WindowDecorationsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowDecorationsController.swift; sourceTree = "<group>"; }; + A5001601 /* SessionPersistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionPersistence.swift; sourceTree = "<group>"; }; 818DBCD4AB69EB72573E8138 /* SidebarResizeUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarResizeUITests.swift; sourceTree = "<group>"; }; C0B4D9B1A1B2C3D4E5F60718 /* UpdatePillUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePillUITests.swift; sourceTree = "<group>"; }; A5001101 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; @@ -197,6 +201,8 @@ F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePillReleaseVisibilityTests.swift; sourceTree = "<group>"; }; F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CJKIMEInputTests.swift; sourceTree = "<group>"; }; F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhosttyConfigTests.swift; sourceTree = "<group>"; }; + F5000001A1B2C3D4E5F60718 /* SessionPersistenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionPersistenceTests.swift; sourceTree = "<group>"; }; + F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegateShortcutRoutingTests.swift; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -345,6 +351,7 @@ A5001219 /* WindowToolbarController.swift */, A5001241 /* WindowDecorationsController.swift */, A5001222 /* WindowAccessor.swift */, + A5001601 /* SessionPersistence.swift */, ); path = Sources; sourceTree = "<group>"; @@ -402,6 +409,8 @@ F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */, F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */, F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */, + F5000001A1B2C3D4E5F60718 /* SessionPersistenceTests.swift */, + F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */, ); path = cmuxTests; sourceTree = "<group>"; @@ -574,6 +583,7 @@ A5001209 /* WindowToolbarController.swift in Sources */, A5001240 /* WindowDecorationsController.swift in Sources */, A500120C /* WindowAccessor.swift in Sources */, + A5001600 /* SessionPersistence.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -602,6 +612,8 @@ F2000000A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift in Sources */, F3000000A1B2C3D4E5F60718 /* CJKIMEInputTests.swift in Sources */, F4000000A1B2C3D4E5F60718 /* GhosttyConfigTests.swift in Sources */, + F5000000A1B2C3D4E5F60718 /* SessionPersistenceTests.swift in Sources */, + F6000000A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Resources/shell-integration/cmux-bash-integration.bash b/Resources/shell-integration/cmux-bash-integration.bash index 4f8c832f..070b33e9 100644 --- a/Resources/shell-integration/cmux-bash-integration.bash +++ b/Resources/shell-integration/cmux-bash-integration.bash @@ -23,6 +23,18 @@ _cmux_send() { fi } +_cmux_restore_scrollback_once() { + local path="${CMUX_RESTORE_SCROLLBACK_FILE:-}" + [[ -n "$path" ]] || return 0 + unset CMUX_RESTORE_SCROLLBACK_FILE + + if [[ -r "$path" ]]; then + /bin/cat -- "$path" 2>/dev/null || true + /bin/rm -f -- "$path" >/dev/null 2>&1 || true + fi +} +_cmux_restore_scrollback_once + # Throttle heavy work to avoid prompt latency. _CMUX_PWD_LAST_PWD="${_CMUX_PWD_LAST_PWD:-}" _CMUX_GIT_LAST_PWD="${_CMUX_GIT_LAST_PWD:-}" diff --git a/Resources/shell-integration/cmux-zsh-integration.zsh b/Resources/shell-integration/cmux-zsh-integration.zsh index 6c9575f0..3121788f 100644 --- a/Resources/shell-integration/cmux-zsh-integration.zsh +++ b/Resources/shell-integration/cmux-zsh-integration.zsh @@ -24,6 +24,18 @@ _cmux_send() { fi } +_cmux_restore_scrollback_once() { + local path="${CMUX_RESTORE_SCROLLBACK_FILE:-}" + [[ -n "$path" ]] || return 0 + unset CMUX_RESTORE_SCROLLBACK_FILE + + if [[ -r "$path" ]]; then + /bin/cat -- "$path" 2>/dev/null || true + /bin/rm -f -- "$path" >/dev/null 2>&1 || true + fi +} +_cmux_restore_scrollback_once + # Throttle heavy work to avoid prompt latency. typeset -g _CMUX_PWD_LAST_PWD="" typeset -g _CMUX_GIT_LAST_PWD="" diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 23197bba..0f149ffa 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -64,6 +64,14 @@ enum WorkspaceShortcutMapper { } } +private extension NSScreen { + var cmuxDisplayID: UInt32? { + let key = NSDeviceDescriptionKey("NSScreenNumber") + guard let value = deviceDescription[key] as? NSNumber else { return nil } + return value.uint32Value + } +} + func browserOmnibarSelectionDeltaForCommandNavigation( hasFocusedAddressBar: Bool, flags: NSEvent.ModifierFlags, @@ -186,12 +194,19 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } } + struct SessionDisplayGeometry { + let displayID: UInt32? + let frame: CGRect + let visibleFrame: CGRect + } + weak var tabManager: TabManager? weak var notificationStore: TerminalNotificationStore? weak var sidebarState: SidebarState? weak var fullscreenControlsViewModel: TitlebarControlsViewModel? weak var sidebarSelectionState: SidebarSelectionState? private var workspaceObserver: NSObjectProtocol? + private var lifecycleSnapshotObservers: [NSObjectProtocol] = [] private var windowKeyObserver: NSObjectProtocol? private var shortcutMonitor: Any? private var shortcutDefaultsObserver: NSObjectProtocol? @@ -231,6 +246,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent private var didSetupGotoSplitUITest = false private var gotoSplitUITestObservers: [NSObjectProtocol] = [] private var didSetupMultiWindowNotificationsUITest = false + // Keep debug-only windows alive when tests intentionally inject key mismatches. + private var debugDetachedContextWindows: [NSWindow] = [] private func childExitKeyboardProbePath() -> String? { let env = ProcessInfo.processInfo.environment @@ -272,11 +289,66 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent private var mainWindowContexts: [ObjectIdentifier: MainWindowContext] = [:] private var mainWindowControllers: [MainWindowController] = [] + private var startupSessionSnapshot: AppSessionSnapshot? + private var didPrepareStartupSessionSnapshot = false + private var didAttemptStartupSessionRestore = false + private var sessionAutosaveTimer: DispatchSourceTimer? + private var didHandleExplicitOpenIntentAtStartup = false + private var isTerminatingApp = false + private var didInstallLifecycleSnapshotObservers = false + private var didDisableSuddenTermination = false var updateViewModel: UpdateViewModel { updateController.viewModel } +#if DEBUG + private func pointerString(_ object: AnyObject?) -> String { + guard let object else { return "nil" } + return String(describing: Unmanaged.passUnretained(object).toOpaque()) + } + + private func summarizeContextForWorkspaceRouting(_ context: MainWindowContext?) -> String { + guard let context else { return "nil" } + let window = context.window ?? windowForMainWindowId(context.windowId) + let windowNumber = window?.windowNumber ?? -1 + let key = window?.isKeyWindow == true ? 1 : 0 + let main = window?.isMainWindow == true ? 1 : 0 + let visible = window?.isVisible == true ? 1 : 0 + let selected = context.tabManager.selectedTabId.map { String($0.uuidString.prefix(8)) } ?? "nil" + return "wid=\(context.windowId.uuidString.prefix(8)) win=\(windowNumber) key=\(key) main=\(main) vis=\(visible) tabs=\(context.tabManager.tabs.count) sel=\(selected) tm=\(pointerString(context.tabManager))" + } + + private func summarizeAllContextsForWorkspaceRouting() -> String { + guard !mainWindowContexts.isEmpty else { return "<none>" } + return mainWindowContexts.values + .map { summarizeContextForWorkspaceRouting($0) } + .joined(separator: " | ") + } + + private func logWorkspaceCreationRouting( + phase: String, + source: String, + reason: String, + event: NSEvent?, + chosenContext: MainWindowContext?, + workspaceId: UUID? = nil, + workingDirectory: String? = nil + ) { + let eventWindowNumber = event?.window?.windowNumber ?? -1 + let eventNumber = event?.windowNumber ?? -1 + let eventChars = event?.charactersIgnoringModifiers ?? "" + let eventKeyCode = event.map { String($0.keyCode) } ?? "nil" + let keyWindowNumber = NSApp.keyWindow?.windowNumber ?? -1 + let mainWindowNumber = NSApp.mainWindow?.windowNumber ?? -1 + let ws = workspaceId.map { String($0.uuidString.prefix(8)) } ?? "nil" + let wd = workingDirectory.map { String($0.prefix(120)) } ?? "-" + FocusLogStore.shared.append( + "cmdn.route phase=\(phase) src=\(source) reason=\(reason) eventWin=\(eventWindowNumber) eventNum=\(eventNumber) keyCode=\(eventKeyCode) chars=\(eventChars) keyWin=\(keyWindowNumber) mainWin=\(mainWindowNumber) activeTM=\(pointerString(tabManager)) chosen={\(summarizeContextForWorkspaceRouting(chosenContext))} ws=\(ws) wd=\(wd) contexts=[\(summarizeAllContextsForWorkspaceRouting())]" + ) + } +#endif + override init() { super.init() Self.shared = self @@ -433,17 +505,41 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent notificationStore.markRead(forTabId: tabId, surfaceId: surfaceId) } + func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply { + isTerminatingApp = true + _ = saveSessionSnapshot(includeScrollback: true, removeWhenEmpty: false) + return .terminateNow + } + func applicationWillTerminate(_ notification: Notification) { + isTerminatingApp = true + _ = saveSessionSnapshot(includeScrollback: true, removeWhenEmpty: false) + stopSessionAutosaveTimer() TerminalController.shared.stop() BrowserHistoryStore.shared.flushPendingSaves() PostHogAnalytics.shared.flush() notificationStore?.clearAll() + enableSuddenTerminationIfNeeded() + } + + func applicationWillResignActive(_ notification: Notification) { + guard !isTerminatingApp else { return } + _ = saveSessionSnapshot(includeScrollback: false) + } + + func persistSessionForUpdateRelaunch() { + isTerminatingApp = true + _ = saveSessionSnapshot(includeScrollback: true, removeWhenEmpty: false) } func configure(tabManager: TabManager, notificationStore: TerminalNotificationStore, sidebarState: SidebarState) { self.tabManager = tabManager self.notificationStore = notificationStore self.sidebarState = sidebarState + disableSuddenTerminationIfNeeded() + installLifecycleSnapshotObserversIfNeeded() + prepareStartupSessionSnapshotIfNeeded() + startSessionAutosaveTimerIfNeeded() #if DEBUG setupJumpUnreadUITestIfNeeded() setupGotoSplitUITestIfNeeded() @@ -469,6 +565,431 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent #endif } + private func prepareStartupSessionSnapshotIfNeeded() { + guard !didPrepareStartupSessionSnapshot else { return } + didPrepareStartupSessionSnapshot = true + guard SessionRestorePolicy.shouldAttemptRestore() else { return } + startupSessionSnapshot = SessionPersistenceStore.load() + } + + private func attemptStartupSessionRestoreIfNeeded(primaryWindow: NSWindow) { + guard !didAttemptStartupSessionRestore else { return } + didAttemptStartupSessionRestore = true + guard !didHandleExplicitOpenIntentAtStartup else { return } + guard let startupSessionSnapshot else { return } + guard let primaryContext = contextForMainTerminalWindow(primaryWindow) else { return } + guard let primaryWindowSnapshot = startupSessionSnapshot.windows.first else { return } + + applySessionWindowSnapshot( + primaryWindowSnapshot, + to: primaryContext, + window: primaryWindow + ) + + let additionalWindows = startupSessionSnapshot + .windows + .dropFirst() + .prefix(max(0, SessionPersistencePolicy.maxWindowsPerSnapshot - 1)) + if !additionalWindows.isEmpty { + DispatchQueue.main.async { [weak self] in + guard let self else { return } + for windowSnapshot in additionalWindows { + _ = self.createMainWindow(sessionWindowSnapshot: windowSnapshot) + } + } + } + + self.startupSessionSnapshot = nil + } + + private func applySessionWindowSnapshot( + _ snapshot: SessionWindowSnapshot, + to context: MainWindowContext, + window: NSWindow? + ) { + context.tabManager.restoreSessionSnapshot(snapshot.tabManager) + context.sidebarState.isVisible = snapshot.sidebar.isVisible + context.sidebarState.persistedWidth = CGFloat( + SessionPersistencePolicy.sanitizedSidebarWidth(snapshot.sidebar.width) + ) + context.sidebarSelectionState.selection = snapshot.sidebar.selection.sidebarSelection + + if let restoredFrame = resolvedWindowFrame(from: snapshot), let window { + window.setFrame(restoredFrame, display: true) + } + } + + private func resolvedWindowFrame(from snapshot: SessionWindowSnapshot?) -> NSRect? { + let displays = NSScreen.screens.map { screen in + SessionDisplayGeometry( + displayID: screen.cmuxDisplayID, + frame: screen.frame, + visibleFrame: screen.visibleFrame + ) + } + let fallbackDisplay = (NSScreen.main ?? NSScreen.screens.first).map { screen in + SessionDisplayGeometry( + displayID: screen.cmuxDisplayID, + frame: screen.frame, + visibleFrame: screen.visibleFrame + ) + } + + return Self.resolvedWindowFrame( + from: snapshot?.frame, + display: snapshot?.display, + availableDisplays: displays, + fallbackDisplay: fallbackDisplay + ) + } + + nonisolated static func resolvedWindowFrame( + from frameSnapshot: SessionRectSnapshot?, + display displaySnapshot: SessionDisplaySnapshot?, + availableDisplays: [SessionDisplayGeometry], + fallbackDisplay: SessionDisplayGeometry? + ) -> CGRect? { + guard let frameSnapshot else { return nil } + let frame = frameSnapshot.cgRect + guard frame.width.isFinite, + frame.height.isFinite, + frame.origin.x.isFinite, + frame.origin.y.isFinite else { + return nil + } + + let minWidth = CGFloat(SessionPersistencePolicy.minimumWindowWidth) + let minHeight = CGFloat(SessionPersistencePolicy.minimumWindowHeight) + guard frame.width >= minWidth, + frame.height >= minHeight else { + return nil + } + + guard !availableDisplays.isEmpty else { return frame } + + if let targetDisplay = display(for: displaySnapshot, in: availableDisplays) { + return resolvedWindowFrame( + frame: frame, + displaySnapshot: displaySnapshot, + targetDisplay: targetDisplay, + minWidth: minWidth, + minHeight: minHeight + ) + } + + if let intersectingDisplay = availableDisplays.first(where: { $0.visibleFrame.intersects(frame) }) { + return clampFrame( + frame, + within: intersectingDisplay.visibleFrame, + minWidth: minWidth, + minHeight: minHeight + ) + } + + guard let fallbackDisplay else { return frame } + if let sourceReference = displaySnapshot?.visibleFrame?.cgRect ?? displaySnapshot?.frame?.cgRect { + return remappedFrame( + frame, + from: sourceReference, + to: fallbackDisplay.visibleFrame, + minWidth: minWidth, + minHeight: minHeight + ) + } + + return centeredFrame( + frame, + in: fallbackDisplay.visibleFrame, + minWidth: minWidth, + minHeight: minHeight + ) + } + + private nonisolated static func resolvedWindowFrame( + frame: CGRect, + displaySnapshot: SessionDisplaySnapshot?, + targetDisplay: SessionDisplayGeometry, + minWidth: CGFloat, + minHeight: CGFloat + ) -> CGRect { + if targetDisplay.visibleFrame.intersects(frame) { + return clampFrame( + frame, + within: targetDisplay.visibleFrame, + minWidth: minWidth, + minHeight: minHeight + ) + } + + if let sourceReference = displaySnapshot?.visibleFrame?.cgRect ?? displaySnapshot?.frame?.cgRect { + return remappedFrame( + frame, + from: sourceReference, + to: targetDisplay.visibleFrame, + minWidth: minWidth, + minHeight: minHeight + ) + } + + return centeredFrame( + frame, + in: targetDisplay.visibleFrame, + minWidth: minWidth, + minHeight: minHeight + ) + } + + private nonisolated static func display( + for snapshot: SessionDisplaySnapshot?, + in displays: [SessionDisplayGeometry] + ) -> SessionDisplayGeometry? { + guard let snapshot else { return nil } + if let displayID = snapshot.displayID, + let exact = displays.first(where: { $0.displayID == displayID }) { + return exact + } + + guard let referenceRect = (snapshot.visibleFrame ?? snapshot.frame)?.cgRect else { + return nil + } + + let overlaps = displays.map { display -> (display: SessionDisplayGeometry, area: CGFloat) in + (display, intersectionArea(referenceRect, display.visibleFrame)) + } + if let bestOverlap = overlaps.max(by: { $0.area < $1.area }), bestOverlap.area > 0 { + return bestOverlap.display + } + + let referenceCenter = CGPoint(x: referenceRect.midX, y: referenceRect.midY) + return displays.min { lhs, rhs in + let lhsDistance = distanceSquared(lhs.visibleFrame, referenceCenter) + let rhsDistance = distanceSquared(rhs.visibleFrame, referenceCenter) + return lhsDistance < rhsDistance + } + } + + private nonisolated static func remappedFrame( + _ frame: CGRect, + from sourceRect: CGRect, + to targetRect: CGRect, + minWidth: CGFloat, + minHeight: CGFloat + ) -> CGRect { + let source = sourceRect.standardized + let target = targetRect.standardized + guard source.width.isFinite, + source.height.isFinite, + source.width > 1, + source.height > 1, + target.width.isFinite, + target.height.isFinite, + target.width > 0, + target.height > 0 else { + return centeredFrame(frame, in: targetRect, minWidth: minWidth, minHeight: minHeight) + } + + let relativeX = (frame.minX - source.minX) / source.width + let relativeY = (frame.minY - source.minY) / source.height + let relativeWidth = frame.width / source.width + let relativeHeight = frame.height / source.height + + let remapped = CGRect( + x: target.minX + (relativeX * target.width), + y: target.minY + (relativeY * target.height), + width: target.width * relativeWidth, + height: target.height * relativeHeight + ) + return clampFrame(remapped, within: target, minWidth: minWidth, minHeight: minHeight) + } + + private nonisolated static func centeredFrame( + _ frame: CGRect, + in visibleFrame: CGRect, + minWidth: CGFloat, + minHeight: CGFloat + ) -> CGRect { + let centered = CGRect( + x: visibleFrame.midX - (frame.width / 2), + y: visibleFrame.midY - (frame.height / 2), + width: frame.width, + height: frame.height + ) + return clampFrame(centered, within: visibleFrame, minWidth: minWidth, minHeight: minHeight) + } + + private nonisolated static func clampFrame( + _ frame: CGRect, + within visibleFrame: CGRect, + minWidth: CGFloat, + minHeight: CGFloat + ) -> CGRect { + guard visibleFrame.width.isFinite, + visibleFrame.height.isFinite, + visibleFrame.width > 0, + visibleFrame.height > 0 else { + return frame + } + + let maxWidth = max(visibleFrame.width, 1) + let maxHeight = max(visibleFrame.height, 1) + let widthFloor = min(minWidth, maxWidth) + let heightFloor = min(minHeight, maxHeight) + + let width = min(max(frame.width, widthFloor), maxWidth) + let height = min(max(frame.height, heightFloor), maxHeight) + let maxX = visibleFrame.maxX - width + let maxY = visibleFrame.maxY - height + let x = min(max(frame.minX, visibleFrame.minX), maxX) + let y = min(max(frame.minY, visibleFrame.minY), maxY) + + return CGRect(x: x, y: y, width: width, height: height) + } + + private nonisolated static func intersectionArea(_ lhs: CGRect, _ rhs: CGRect) -> CGFloat { + let intersection = lhs.intersection(rhs) + guard !intersection.isNull else { return 0 } + return max(0, intersection.width) * max(0, intersection.height) + } + + private nonisolated static func distanceSquared(_ rect: CGRect, _ point: CGPoint) -> CGFloat { + let dx = rect.midX - point.x + let dy = rect.midY - point.y + return (dx * dx) + (dy * dy) + } + + private func displaySnapshot(for window: NSWindow?) -> SessionDisplaySnapshot? { + guard let window else { return nil } + let screen = window.screen + ?? NSScreen.screens.first(where: { $0.frame.intersects(window.frame) }) + guard let screen else { return nil } + + return SessionDisplaySnapshot( + displayID: screen.cmuxDisplayID, + frame: SessionRectSnapshot(screen.frame), + visibleFrame: SessionRectSnapshot(screen.visibleFrame) + ) + } + + private func startSessionAutosaveTimerIfNeeded() { + guard sessionAutosaveTimer == nil else { return } + let env = ProcessInfo.processInfo.environment + guard !isRunningUnderXCTest(env) else { return } + + let timer = DispatchSource.makeTimerSource(queue: .main) + let interval = SessionPersistencePolicy.autosaveInterval + timer.schedule(deadline: .now() + interval, repeating: interval, leeway: .seconds(1)) + timer.setEventHandler { [weak self] in + _ = self?.saveSessionSnapshot(includeScrollback: false) + } + sessionAutosaveTimer = timer + timer.resume() + } + + private func stopSessionAutosaveTimer() { + sessionAutosaveTimer?.cancel() + sessionAutosaveTimer = nil + } + + private func installLifecycleSnapshotObserversIfNeeded() { + guard !didInstallLifecycleSnapshotObservers else { return } + didInstallLifecycleSnapshotObservers = true + + let workspaceCenter = NSWorkspace.shared.notificationCenter + let powerOffObserver = workspaceCenter.addObserver( + forName: NSWorkspace.willPowerOffNotification, + object: nil, + queue: .main + ) { [weak self] _ in + Task { @MainActor [weak self] in + guard let self else { return } + self.isTerminatingApp = true + _ = self.saveSessionSnapshot(includeScrollback: true, removeWhenEmpty: false) + } + } + lifecycleSnapshotObservers.append(powerOffObserver) + + let sessionResignObserver = workspaceCenter.addObserver( + forName: NSWorkspace.sessionDidResignActiveNotification, + object: nil, + queue: .main + ) { [weak self] _ in + Task { @MainActor [weak self] in + guard let self else { return } + if self.isTerminatingApp { + _ = self.saveSessionSnapshot(includeScrollback: true, removeWhenEmpty: false) + } else { + _ = self.saveSessionSnapshot(includeScrollback: false) + } + } + } + lifecycleSnapshotObservers.append(sessionResignObserver) + } + + private func disableSuddenTerminationIfNeeded() { + guard !didDisableSuddenTermination else { return } + ProcessInfo.processInfo.disableSuddenTermination() + didDisableSuddenTermination = true + } + + private func enableSuddenTerminationIfNeeded() { + guard didDisableSuddenTermination else { return } + ProcessInfo.processInfo.enableSuddenTermination() + didDisableSuddenTermination = false + } + + @discardableResult + private func saveSessionSnapshot(includeScrollback: Bool, removeWhenEmpty: Bool = false) -> Bool { + guard let snapshot = buildSessionSnapshot(includeScrollback: includeScrollback) else { + if removeWhenEmpty { + SessionPersistenceStore.removeSnapshot() + } + return false + } + return SessionPersistenceStore.save(snapshot) + } + + nonisolated static func shouldPersistSnapshotOnWindowUnregister(isTerminatingApp: Bool) -> Bool { + !isTerminatingApp + } + + private func buildSessionSnapshot(includeScrollback: Bool) -> AppSessionSnapshot? { + let contexts = mainWindowContexts.values.sorted { lhs, rhs in + let lhsWindow = lhs.window ?? windowForMainWindowId(lhs.windowId) + let rhsWindow = rhs.window ?? windowForMainWindowId(rhs.windowId) + let lhsIsKey = lhsWindow?.isKeyWindow ?? false + let rhsIsKey = rhsWindow?.isKeyWindow ?? false + if lhsIsKey != rhsIsKey { + return lhsIsKey && !rhsIsKey + } + return lhs.windowId.uuidString < rhs.windowId.uuidString + } + + guard !contexts.isEmpty else { return nil } + + let windows: [SessionWindowSnapshot] = contexts + .prefix(SessionPersistencePolicy.maxWindowsPerSnapshot) + .map { context in + let window = context.window ?? windowForMainWindowId(context.windowId) + return SessionWindowSnapshot( + frame: window.map { SessionRectSnapshot($0.frame) }, + display: displaySnapshot(for: window), + tabManager: context.tabManager.sessionSnapshot(includeScrollback: includeScrollback), + sidebar: SessionSidebarSnapshot( + isVisible: context.sidebarState.isVisible, + selection: SessionSidebarSelection(selection: context.sidebarSelectionState.selection), + width: SessionPersistencePolicy.sanitizedSidebarWidth(Double(context.sidebarState.persistedWidth)) + ) + ) + } + + guard !windows.isEmpty else { return nil } + return AppSessionSnapshot( + version: SessionSnapshotSchema.currentVersion, + createdAt: Date().timeIntervalSince1970, + windows: windows + ) + } + /// Register a terminal window with the AppDelegate so menu commands and socket control /// can target whichever window is currently active. func registerMainWindow( @@ -481,6 +1002,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent let key = ObjectIdentifier(window) if let existing = mainWindowContexts[key] { existing.window = window + } else if let existing = mainWindowContexts.values.first(where: { $0.windowId == windowId }) { + existing.window = window + reindexMainWindowContextIfNeeded(existing, for: window) } else { mainWindowContexts[key] = MainWindowContext( windowId: windowId, @@ -502,6 +1026,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent if window.isKeyWindow { setActiveMainWindow(window) } + + attemptStartupSessionRestoreIfNeeded(primaryWindow: window) + if !isTerminatingApp { + _ = saveSessionSnapshot(includeScrollback: false) + } } struct MainWindowSummary { @@ -591,6 +1120,83 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return NSApp.windows.first(where: { $0.identifier?.rawValue == expectedIdentifier }) } + private func mainWindowId(from window: NSWindow) -> UUID? { + guard let raw = window.identifier?.rawValue else { return nil } + let prefix = "cmux.main." + guard raw.hasPrefix(prefix) else { return nil } + let suffix = String(raw.dropFirst(prefix.count)) + return UUID(uuidString: suffix) + } + + private func reindexMainWindowContextIfNeeded(_ context: MainWindowContext, for window: NSWindow) { + let desiredKey = ObjectIdentifier(window) + if mainWindowContexts[desiredKey] === context { + context.window = window + return + } + + let contextKeys = mainWindowContexts.compactMap { key, value in + value === context ? key : nil + } + for key in contextKeys { + mainWindowContexts.removeValue(forKey: key) + } + + if let conflicting = mainWindowContexts[desiredKey], conflicting !== context { + context.window = window + return + } + + mainWindowContexts[desiredKey] = context + context.window = window + } + + private func contextForMainTerminalWindow(_ window: NSWindow, reindex: Bool = true) -> MainWindowContext? { + guard isMainTerminalWindow(window) else { return nil } + + if let context = mainWindowContexts[ObjectIdentifier(window)] { + context.window = window + return context + } + + if let windowId = mainWindowId(from: window), + let context = mainWindowContexts.values.first(where: { $0.windowId == windowId }) { + if reindex { + reindexMainWindowContextIfNeeded(context, for: window) + } else { + context.window = window + } + return context + } + + let windowNumber = window.windowNumber + if windowNumber >= 0, + let context = mainWindowContexts.values.first(where: { candidate in + let candidateWindow = candidate.window ?? windowForMainWindowId(candidate.windowId) + return candidateWindow?.windowNumber == windowNumber + }) { + if reindex { + reindexMainWindowContextIfNeeded(context, for: window) + } else { + context.window = window + } + return context + } + + return nil + } + + private func unregisterMainWindowContext(for window: NSWindow) -> MainWindowContext? { + guard let removed = contextForMainTerminalWindow(window, reindex: false) else { return nil } + let removedKeys = mainWindowContexts.compactMap { key, value in + value === removed ? key : nil + } + for key in removedKeys { + mainWindowContexts.removeValue(forKey: key) + } + return removed + } + @objc func openNewMainWindow(_ sender: Any?) { _ = createMainWindow() } @@ -621,6 +1227,12 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent target: ServiceOpenTarget, error: AutoreleasingUnsafeMutablePointer<NSString> ) { + didHandleExplicitOpenIntentAtStartup = true + if !didAttemptStartupSessionRestore { + startupSessionSnapshot = nil + didAttemptStartupSessionRestore = true + } + let pathURLs = servicePathURLs(from: pasteboard) guard !pathURLs.isEmpty else { error.pointee = Self.serviceErrorNoPath @@ -672,38 +1284,222 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } private func openWorkspaceFromService(workingDirectory: String) { - if let context = preferredMainWindowContextForServiceWorkspace(), - let window = context.window ?? windowForMainWindowId(context.windowId) { - setActiveMainWindow(window) - bringToFront(window) - _ = context.tabManager.addWorkspace(workingDirectory: workingDirectory) + if addWorkspaceInPreferredMainWindow( + workingDirectory: workingDirectory, + shouldBringToFront: true, + debugSource: "service.openTab" + ) != nil { return } _ = createMainWindow(initialWorkingDirectory: workingDirectory) } - private func preferredMainWindowContextForServiceWorkspace() -> MainWindowContext? { + @discardableResult + func addWorkspaceInPreferredMainWindow( + workingDirectory: String? = nil, + shouldBringToFront: Bool = false, + event: NSEvent? = nil, + debugSource: String = "unspecified" + ) -> UUID? { + #if DEBUG + logWorkspaceCreationRouting( + phase: "request", + source: debugSource, + reason: "add_workspace", + event: event, + chosenContext: nil, + workingDirectory: workingDirectory + ) + #endif + guard let context = preferredMainWindowContextForWorkspaceCreation(event: event, debugSource: debugSource) else { + #if DEBUG + logWorkspaceCreationRouting( + phase: "no_context", + source: debugSource, + reason: "context_selection_failed", + event: event, + chosenContext: nil, + workingDirectory: workingDirectory + ) + #endif + return nil + } + if let window = context.window ?? windowForMainWindowId(context.windowId) { + setActiveMainWindow(window) + if shouldBringToFront { + bringToFront(window) + } + } + + let workspace: Workspace + if let workingDirectory { + workspace = context.tabManager.addWorkspace(workingDirectory: workingDirectory, select: true) + } else { + workspace = context.tabManager.addTab(select: true) + } + #if DEBUG + logWorkspaceCreationRouting( + phase: "created", + source: debugSource, + reason: "workspace_created", + event: event, + chosenContext: context, + workspaceId: workspace.id, + workingDirectory: workingDirectory + ) + #endif + return workspace.id + } + + private func preferredMainWindowContextForWorkspaceCreation( + event: NSEvent? = nil, + debugSource: String = "unspecified" + ) -> MainWindowContext? { + if let context = mainWindowContext(forShortcutEvent: event, debugSource: debugSource) { + return context + } + if let keyWindow = NSApp.keyWindow, - isMainTerminalWindow(keyWindow), - let context = mainWindowContexts[ObjectIdentifier(keyWindow)] { + let context = contextForMainTerminalWindow(keyWindow) { + #if DEBUG + logWorkspaceCreationRouting( + phase: "choose", + source: debugSource, + reason: "key_window", + event: event, + chosenContext: context + ) + #endif return context } if let mainWindow = NSApp.mainWindow, - isMainTerminalWindow(mainWindow), - let context = mainWindowContexts[ObjectIdentifier(mainWindow)] { + let context = contextForMainTerminalWindow(mainWindow) { + #if DEBUG + logWorkspaceCreationRouting( + phase: "choose", + source: debugSource, + reason: "main_window", + event: event, + chosenContext: context + ) + #endif return context } - return mainWindowContexts.values.first + for window in NSApp.orderedWindows where isMainTerminalWindow(window) { + if let context = contextForMainTerminalWindow(window) { + #if DEBUG + logWorkspaceCreationRouting( + phase: "choose", + source: debugSource, + reason: "ordered_windows", + event: event, + chosenContext: context + ) + #endif + return context + } + } + + let fallback = mainWindowContexts.values.first + #if DEBUG + logWorkspaceCreationRouting( + phase: "choose", + source: debugSource, + reason: "fallback_first_context", + event: event, + chosenContext: fallback + ) + #endif + return fallback + } + + private func mainWindowContext( + forShortcutEvent event: NSEvent?, + debugSource: String = "unspecified" + ) -> MainWindowContext? { + guard let event else { return nil } + + if let eventWindow = event.window, + let context = contextForMainTerminalWindow(eventWindow) { + #if DEBUG + logWorkspaceCreationRouting( + phase: "choose", + source: debugSource, + reason: "event_window", + event: event, + chosenContext: context + ) + #endif + return context + } + + if event.windowNumber >= 0, + let numberedWindow = NSApp.window(withWindowNumber: event.windowNumber), + let context = contextForMainTerminalWindow(numberedWindow) { + #if DEBUG + logWorkspaceCreationRouting( + phase: "choose", + source: debugSource, + reason: "event_window_number", + event: event, + chosenContext: context + ) + #endif + return context + } + + if event.windowNumber >= 0, + let context = mainWindowContexts.values.first(where: { candidate in + let window = candidate.window ?? windowForMainWindowId(candidate.windowId) + return window?.windowNumber == event.windowNumber + }) { + #if DEBUG + logWorkspaceCreationRouting( + phase: "choose", + source: debugSource, + reason: "event_window_number_scan", + event: event, + chosenContext: context + ) + #endif + return context + } + + #if DEBUG + logWorkspaceCreationRouting( + phase: "choose", + source: debugSource, + reason: "event_context_not_found", + event: event, + chosenContext: nil + ) + #endif + return nil } @discardableResult - func createMainWindow(initialWorkingDirectory: String? = nil) -> UUID { + func createMainWindow( + initialWorkingDirectory: String? = nil, + sessionWindowSnapshot: SessionWindowSnapshot? = nil + ) -> UUID { let windowId = UUID() let tabManager = TabManager(initialWorkingDirectory: initialWorkingDirectory) - let sidebarState = SidebarState() - let sidebarSelectionState = SidebarSelectionState() + if let tabManagerSnapshot = sessionWindowSnapshot?.tabManager { + tabManager.restoreSessionSnapshot(tabManagerSnapshot) + } + + let sidebarWidth = sessionWindowSnapshot?.sidebar.width + .map(SessionPersistencePolicy.sanitizedSidebarWidth) + ?? SessionPersistencePolicy.defaultSidebarWidth + let sidebarState = SidebarState( + isVisible: sessionWindowSnapshot?.sidebar.isVisible ?? true, + persistedWidth: CGFloat(sidebarWidth) + ) + let sidebarSelectionState = SidebarSelectionState( + selection: sessionWindowSnapshot?.sidebar.selection.sidebarSelection ?? .tabs + ) let notificationStore = TerminalNotificationStore.shared let root = ContentView(updateViewModel: updateViewModel, windowId: windowId) @@ -722,7 +1518,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent window.titleVisibility = .hidden window.titlebarAppearsTransparent = true window.isMovableByWindowBackground = false - window.center() + if let restoredFrame = resolvedWindowFrame(from: sessionWindowSnapshot) { + window.setFrame(restoredFrame, display: false) + } else { + window.center() + } window.contentView = NSHostingView(rootView: root) // Apply shared window styling. @@ -805,8 +1605,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent func showNotificationsPopoverFromMenuBar() { let context: MainWindowContext? = { if let keyWindow = NSApp.keyWindow, - isMainTerminalWindow(keyWindow), - let keyContext = mainWindowContexts[ObjectIdentifier(keyWindow)] { + let keyContext = contextForMainTerminalWindow(keyWindow) { return keyContext } if let first = mainWindowContexts.values.first { @@ -1804,10 +2603,28 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent // Cmd+N semantics: // - If there are no main windows, create a new window. // - Otherwise, create a new workspace in the active window. - if tabManager == nil || mainWindowContexts.isEmpty { + if mainWindowContexts.isEmpty { + #if DEBUG + logWorkspaceCreationRouting( + phase: "fallback_new_window", + source: "shortcut.cmdN", + reason: "no_main_windows", + event: event, + chosenContext: nil + ) + #endif + openNewMainWindow(nil) + } else if addWorkspaceInPreferredMainWindow(event: event, debugSource: "shortcut.cmdN") == nil { + #if DEBUG + logWorkspaceCreationRouting( + phase: "fallback_new_window", + source: "shortcut.cmdN", + reason: "workspace_creation_returned_nil", + event: event, + chosenContext: nil + ) + #endif openNewMainWindow(nil) - } else { - tabManager?.addTab() } return true } @@ -2355,6 +3172,34 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent func debugHandleCustomShortcut(event: NSEvent) -> Bool { handleCustomShortcut(event: event) } + + // Test hook: remap a window context under a detached window key so direct + // ObjectIdentifier(window) lookups fail and fallback logic is exercised. + @discardableResult + func debugInjectWindowContextKeyMismatch(windowId: UUID) -> Bool { + guard let context = mainWindowContexts.values.first(where: { $0.windowId == windowId }), + let window = context.window ?? windowForMainWindowId(windowId) else { + return false + } + + let detachedWindow = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 16, height: 16), + styleMask: [.borderless], + backing: .buffered, + defer: false + ) + debugDetachedContextWindows.append(detachedWindow) + + let contextKeys = mainWindowContexts.compactMap { key, value in + value === context ? key : nil + } + for key in contextKeys { + mainWindowContexts.removeValue(forKey: key) + } + mainWindowContexts[ObjectIdentifier(detachedWindow)] = context + context.window = window + return true + } #endif private func findButton(in view: NSView, titled title: String) -> NSButton? { @@ -2697,8 +3542,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } private func setActiveMainWindow(_ window: NSWindow) { - guard isMainTerminalWindow(window) else { return } - guard let context = mainWindowContexts[ObjectIdentifier(window)] else { return } + guard let context = contextForMainTerminalWindow(window) else { return } tabManager = context.tabManager sidebarState = context.sidebarState sidebarSelectionState = context.sidebarSelectionState @@ -2706,8 +3550,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } private func unregisterMainWindow(_ window: NSWindow) { - let key = ObjectIdentifier(window) - guard let removed = mainWindowContexts.removeValue(forKey: key) else { return } + guard let removed = unregisterMainWindowContext(for: window) else { return } // Avoid stale notifications that can no longer be opened once the owning window is gone. if let store = notificationStore { @@ -2720,8 +3563,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent // Repoint "active" pointers to any remaining main terminal window. let nextContext: MainWindowContext? = { if let keyWindow = NSApp.keyWindow, - isMainTerminalWindow(keyWindow), - let ctx = mainWindowContexts[ObjectIdentifier(keyWindow)] { + let ctx = contextForMainTerminalWindow(keyWindow, reindex: false) { return ctx } return mainWindowContexts.values.first @@ -2739,6 +3581,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent TerminalController.shared.setActiveTabManager(nil) } } + + // During app termination we already persisted a full snapshot (with scrollback) + // in applicationShouldTerminate/applicationWillTerminate. Saving again here would + // overwrite it as windows tear down one-by-one, dropping closed windows and replay. + if Self.shouldPersistSnapshotOnWindowUnregister(isTerminatingApp: isTerminatingApp) { + _ = saveSessionSnapshot(includeScrollback: false) + } } private func isMainTerminalWindow(_ window: NSWindow) -> Bool { diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 4ad00b12..53f9da9a 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -152,7 +152,14 @@ enum WindowGlassEffect { } final class SidebarState: ObservableObject { - @Published var isVisible: Bool = true + @Published var isVisible: Bool + @Published var persistedWidth: CGFloat + + init(isVisible: Bool = true, persistedWidth: CGFloat = CGFloat(SessionPersistencePolicy.defaultSidebarWidth)) { + self.isVisible = isVisible + let sanitized = SessionPersistencePolicy.sanitizedSidebarWidth(Double(persistedWidth)) + self.persistedWidth = CGFloat(sanitized) + } func toggle() { isVisible.toggle() @@ -844,6 +851,15 @@ struct ContentView: View { (NSApp.keyWindow?.screen?.frame.width ?? NSScreen.main?.frame.width ?? 1920) * 2 / 3 } + private func normalizedSidebarWidth(_ candidate: CGFloat) -> CGFloat { + let minWidth = CGFloat(SessionPersistencePolicy.minimumSidebarWidth) + let maxWidth = max(minWidth, maxSidebarWidth) + if !candidate.isFinite { + return CGFloat(SessionPersistencePolicy.defaultSidebarWidth) + } + return max(minWidth, min(maxWidth, candidate)) + } + private func activateSidebarResizerCursor() { sidebarResizerCursorReleaseWorkItem?.cancel() sidebarResizerCursorReleaseWorkItem = nil @@ -1317,6 +1333,13 @@ struct ContentView: View { reconcileMountedWorkspaceIds() previousSelectedWorkspaceId = tabManager.selectedTabId installSidebarResizerPointerMonitorIfNeeded() + let restoredWidth = normalizedSidebarWidth(sidebarState.persistedWidth) + if abs(sidebarWidth - restoredWidth) > 0.5 { + sidebarWidth = restoredWidth + } + if abs(sidebarState.persistedWidth - restoredWidth) > 0.5 { + sidebarState.persistedWidth = restoredWidth + } if selectedTabIds.isEmpty, let selectedId = tabManager.selectedTabId { selectedTabIds = [selectedId] lastSidebarSelectionIndex = tabManager.tabs.firstIndex { $0.id == selectedId } @@ -1456,6 +1479,14 @@ struct ContentView: View { }) view = AnyView(view.onChange(of: sidebarWidth) { _ in + let sanitized = normalizedSidebarWidth(sidebarWidth) + if abs(sidebarWidth - sanitized) > 0.5 { + sidebarWidth = sanitized + return + } + if abs(sidebarState.persistedWidth - sanitized) > 0.5 { + sidebarState.persistedWidth = sanitized + } updateSidebarResizerBandState() }) @@ -1463,6 +1494,18 @@ struct ContentView: View { updateSidebarResizerBandState() }) + view = AnyView(view.onChange(of: sidebarState.persistedWidth) { newValue in + let sanitized = normalizedSidebarWidth(newValue) + if abs(newValue - sanitized) > 0.5 { + sidebarState.persistedWidth = sanitized + return + } + guard !isResizerDragging else { return } + if abs(sidebarWidth - sanitized) > 0.5 { + sidebarWidth = sanitized + } + }) + view = AnyView(view.ignoresSafeArea()) view = AnyView(view.onDisappear { diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 78121fa0..094518d5 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1126,6 +1126,7 @@ final class TerminalSurface: Identifiable, ObservableObject { private let surfaceContext: ghostty_surface_context_e private let configTemplate: ghostty_surface_config_s? private let workingDirectory: String? + private let additionalEnvironment: [String: String] let hostedView: GhosttySurfaceScrollView private let surfaceView: GhosttyNSView private var lastPixelWidth: UInt32 = 0 @@ -1170,13 +1171,15 @@ final class TerminalSurface: Identifiable, ObservableObject { tabId: UUID, context: ghostty_surface_context_e, configTemplate: ghostty_surface_config_s?, - workingDirectory: String? = nil + workingDirectory: String? = nil, + additionalEnvironment: [String: String] = [:] ) { self.id = UUID() self.tabId = tabId self.surfaceContext = context self.configTemplate = configTemplate self.workingDirectory = workingDirectory?.trimmingCharacters(in: .whitespacesAndNewlines) + self.additionalEnvironment = additionalEnvironment // Match Ghostty's own SurfaceView: ensure a non-zero initial frame so the backing layer // has non-zero bounds and the renderer can initialize without presenting a blank/stretched // intermediate frame on the first real resize. @@ -1426,6 +1429,12 @@ final class TerminalSurface: Identifiable, ObservableObject { } } + if !additionalEnvironment.isEmpty { + for (key, value) in additionalEnvironment where !key.isEmpty && !value.isEmpty { + env[key] = value + } + } + if !env.isEmpty { envVars.reserveCapacity(env.count) envStorage.reserveCapacity(env.count) diff --git a/Sources/Panels/TerminalPanel.swift b/Sources/Panels/TerminalPanel.swift index b9a9d767..ede60c40 100644 --- a/Sources/Panels/TerminalPanel.swift +++ b/Sources/Panels/TerminalPanel.swift @@ -83,13 +83,15 @@ final class TerminalPanel: Panel, ObservableObject { context: ghostty_surface_context_e = GHOSTTY_SURFACE_CONTEXT_SPLIT, configTemplate: ghostty_surface_config_s? = nil, workingDirectory: String? = nil, + additionalEnvironment: [String: String] = [:], portOrdinal: Int = 0 ) { let surface = TerminalSurface( tabId: workspaceId, context: context, configTemplate: configTemplate, - workingDirectory: workingDirectory + workingDirectory: workingDirectory, + additionalEnvironment: additionalEnvironment ) surface.portOrdinal = portOrdinal self.init(workspaceId: workspaceId, surface: surface) diff --git a/Sources/SessionPersistence.swift b/Sources/SessionPersistence.swift new file mode 100644 index 00000000..f4459a68 --- /dev/null +++ b/Sources/SessionPersistence.swift @@ -0,0 +1,471 @@ +import CoreGraphics +import Foundation +import Bonsplit + +enum SessionSnapshotSchema { + static let currentVersion = 1 +} + +enum SessionPersistencePolicy { + static let defaultSidebarWidth: Double = 200 + static let minimumSidebarWidth: Double = 186 + static let maximumSidebarWidth: Double = 600 + static let minimumWindowWidth: Double = 300 + static let minimumWindowHeight: Double = 200 + static let autosaveInterval: TimeInterval = 8.0 + static let maxWindowsPerSnapshot: Int = 12 + static let maxWorkspacesPerWindow: Int = 128 + static let maxPanelsPerWorkspace: Int = 512 + static let maxScrollbackLinesPerTerminal: Int = 4000 + static let maxScrollbackCharactersPerTerminal: Int = 400_000 + + static func sanitizedSidebarWidth(_ candidate: Double?) -> Double { + let fallback = defaultSidebarWidth + guard let candidate, candidate.isFinite else { return fallback } + return min(max(candidate, minimumSidebarWidth), maximumSidebarWidth) + } + + static func truncatedScrollback(_ text: String?) -> String? { + guard let text, !text.isEmpty else { return nil } + if text.count <= maxScrollbackCharactersPerTerminal { + return text + } + let initialStart = text.index(text.endIndex, offsetBy: -maxScrollbackCharactersPerTerminal) + let safeStart = ansiSafeTruncationStart(in: text, initialStart: initialStart) + return String(text[safeStart...]) + } + + /// If truncation starts in the middle of an ANSI CSI escape sequence, advance + /// to the first printable character after that sequence to avoid replaying + /// malformed control bytes. + private static func ansiSafeTruncationStart(in text: String, initialStart: String.Index) -> String.Index { + guard initialStart > text.startIndex else { return initialStart } + let escape = "\u{001B}" + + guard let lastEscape = text[..<initialStart].lastIndex(of: Character(escape)) else { + return initialStart + } + let csiMarker = text.index(after: lastEscape) + guard csiMarker < text.endIndex, text[csiMarker] == "[" else { + return initialStart + } + + // If a final CSI byte exists before the truncation boundary, we are not + // inside a partial sequence. + if csiFinalByteIndex(in: text, from: csiMarker, upperBound: initialStart) != nil { + return initialStart + } + + // We are inside a CSI sequence. Skip to the first character after the + // sequence terminator if it exists. + guard let final = csiFinalByteIndex(in: text, from: csiMarker, upperBound: text.endIndex) else { + return initialStart + } + let next = text.index(after: final) + return next < text.endIndex ? next : text.endIndex + } + + private static func csiFinalByteIndex( + in text: String, + from csiMarker: String.Index, + upperBound: String.Index + ) -> String.Index? { + var index = text.index(after: csiMarker) + while index < upperBound { + guard let scalar = text[index].unicodeScalars.first?.value else { + index = text.index(after: index) + continue + } + if scalar >= 0x40, scalar <= 0x7E { + return index + } + index = text.index(after: index) + } + return nil + } +} + +enum SessionRestorePolicy { + static func isRunningUnderAutomatedTests( + environment: [String: String] = ProcessInfo.processInfo.environment + ) -> Bool { + if environment["CMUX_UI_TEST_MODE"] == "1" { + return true + } + if environment.keys.contains(where: { $0.hasPrefix("CMUX_UI_TEST_") }) { + return true + } + if environment["XCTestConfigurationFilePath"] != nil { + return true + } + if environment["XCTestBundlePath"] != nil { + return true + } + if environment["XCTestSessionIdentifier"] != nil { + return true + } + if environment["XCInjectBundle"] != nil { + return true + } + if environment["XCInjectBundleInto"] != nil { + return true + } + if environment["DYLD_INSERT_LIBRARIES"]?.contains("libXCTest") == true { + return true + } + return false + } + + static func shouldAttemptRestore( + arguments: [String] = CommandLine.arguments, + environment: [String: String] = ProcessInfo.processInfo.environment + ) -> Bool { + if environment["CMUX_DISABLE_SESSION_RESTORE"] == "1" { + return false + } + if isRunningUnderAutomatedTests(environment: environment) { + return false + } + + let extraArgs = arguments + .dropFirst() + .filter { !$0.hasPrefix("-psn_") } + + // Any explicit launch argument is treated as an explicit open intent. + return extraArgs.isEmpty + } +} + +struct SessionRectSnapshot: Codable, Equatable, Sendable { + let x: Double + let y: Double + let width: Double + let height: Double + + init(x: Double, y: Double, width: Double, height: Double) { + self.x = x + self.y = y + self.width = width + self.height = height + } + + init(_ rect: CGRect) { + self.x = Double(rect.origin.x) + self.y = Double(rect.origin.y) + self.width = Double(rect.size.width) + self.height = Double(rect.size.height) + } + + var cgRect: CGRect { + CGRect(x: x, y: y, width: width, height: height) + } +} + +struct SessionDisplaySnapshot: Codable, Sendable { + var displayID: UInt32? + var frame: SessionRectSnapshot? + var visibleFrame: SessionRectSnapshot? +} + +enum SessionSidebarSelection: String, Codable, Sendable, Equatable { + case tabs + case notifications + + init(selection: SidebarSelection) { + switch selection { + case .tabs: + self = .tabs + case .notifications: + self = .notifications + } + } + + var sidebarSelection: SidebarSelection { + switch self { + case .tabs: + return .tabs + case .notifications: + return .notifications + } + } +} + +struct SessionSidebarSnapshot: Codable, Sendable { + var isVisible: Bool + var selection: SessionSidebarSelection + var width: Double? +} + +struct SessionStatusEntrySnapshot: Codable, Sendable { + var key: String + var value: String + var icon: String? + var color: String? + var timestamp: TimeInterval +} + +struct SessionLogEntrySnapshot: Codable, Sendable { + var message: String + var level: String + var source: String? + var timestamp: TimeInterval +} + +struct SessionProgressSnapshot: Codable, Sendable { + var value: Double + var label: String? +} + +struct SessionGitBranchSnapshot: Codable, Sendable { + var branch: String + var isDirty: Bool +} + +struct SessionTerminalPanelSnapshot: Codable, Sendable { + var workingDirectory: String? + var scrollback: String? +} + +struct SessionBrowserPanelSnapshot: Codable, Sendable { + var urlString: String? + var shouldRenderWebView: Bool + var pageZoom: Double + var developerToolsVisible: Bool +} + +struct SessionPanelSnapshot: Codable, Sendable { + var id: UUID + var type: PanelType + var title: String? + var customTitle: String? + var directory: String? + var isPinned: Bool + var isManuallyUnread: Bool + var gitBranch: SessionGitBranchSnapshot? + var listeningPorts: [Int] + var ttyName: String? + var terminal: SessionTerminalPanelSnapshot? + var browser: SessionBrowserPanelSnapshot? +} + +enum SessionSplitOrientation: String, Codable, Sendable { + case horizontal + case vertical + + init(_ orientation: SplitOrientation) { + switch orientation { + case .horizontal: + self = .horizontal + case .vertical: + self = .vertical + } + } + + var splitOrientation: SplitOrientation { + switch self { + case .horizontal: + return .horizontal + case .vertical: + return .vertical + } + } +} + +struct SessionPaneLayoutSnapshot: Codable, Sendable { + var panelIds: [UUID] + var selectedPanelId: UUID? +} + +struct SessionSplitLayoutSnapshot: Codable, Sendable { + var orientation: SessionSplitOrientation + var dividerPosition: Double + var first: SessionWorkspaceLayoutSnapshot + var second: SessionWorkspaceLayoutSnapshot +} + +indirect enum SessionWorkspaceLayoutSnapshot: Codable, Sendable { + case pane(SessionPaneLayoutSnapshot) + case split(SessionSplitLayoutSnapshot) + + private enum CodingKeys: String, CodingKey { + case type + case pane + case split + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + let type = try container.decode(String.self, forKey: .type) + switch type { + case "pane": + self = .pane(try container.decode(SessionPaneLayoutSnapshot.self, forKey: .pane)) + case "split": + self = .split(try container.decode(SessionSplitLayoutSnapshot.self, forKey: .split)) + default: + throw DecodingError.dataCorruptedError(forKey: .type, in: container, debugDescription: "Unsupported layout node type: \(type)") + } + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case .pane(let pane): + try container.encode("pane", forKey: .type) + try container.encode(pane, forKey: .pane) + case .split(let split): + try container.encode("split", forKey: .type) + try container.encode(split, forKey: .split) + } + } +} + +struct SessionWorkspaceSnapshot: Codable, Sendable { + var processTitle: String + var customTitle: String? + var isPinned: Bool + var currentDirectory: String + var focusedPanelId: UUID? + var layout: SessionWorkspaceLayoutSnapshot + var panels: [SessionPanelSnapshot] + var statusEntries: [SessionStatusEntrySnapshot] + var logEntries: [SessionLogEntrySnapshot] + var progress: SessionProgressSnapshot? + var gitBranch: SessionGitBranchSnapshot? +} + +struct SessionTabManagerSnapshot: Codable, Sendable { + var selectedWorkspaceIndex: Int? + var workspaces: [SessionWorkspaceSnapshot] +} + +struct SessionWindowSnapshot: Codable, Sendable { + var frame: SessionRectSnapshot? + var display: SessionDisplaySnapshot? + var tabManager: SessionTabManagerSnapshot + var sidebar: SessionSidebarSnapshot +} + +struct AppSessionSnapshot: Codable, Sendable { + var version: Int + var createdAt: TimeInterval + var windows: [SessionWindowSnapshot] +} + +enum SessionPersistenceStore { + static func load(fileURL: URL? = nil) -> AppSessionSnapshot? { + guard let fileURL = fileURL ?? defaultSnapshotFileURL() else { return nil } + guard let data = try? Data(contentsOf: fileURL) else { return nil } + let decoder = JSONDecoder() + guard let snapshot = try? decoder.decode(AppSessionSnapshot.self, from: data) else { return nil } + guard snapshot.version == SessionSnapshotSchema.currentVersion else { return nil } + guard !snapshot.windows.isEmpty else { return nil } + return snapshot + } + + @discardableResult + static func save(_ snapshot: AppSessionSnapshot, fileURL: URL? = nil) -> Bool { + guard let fileURL = fileURL ?? defaultSnapshotFileURL() else { return false } + let directory = fileURL.deletingLastPathComponent() + do { + try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil) + let encoder = JSONEncoder() + encoder.outputFormatting = [.sortedKeys] + let data = try encoder.encode(snapshot) + try data.write(to: fileURL, options: .atomic) + return true + } catch { + return false + } + } + + static func removeSnapshot(fileURL: URL? = nil) { + guard let fileURL = fileURL ?? defaultSnapshotFileURL() else { return } + try? FileManager.default.removeItem(at: fileURL) + } + + static func defaultSnapshotFileURL( + bundleIdentifier: String? = Bundle.main.bundleIdentifier, + appSupportDirectory: URL? = nil + ) -> URL? { + let resolvedAppSupport: URL + if let appSupportDirectory { + resolvedAppSupport = appSupportDirectory + } else if let discovered = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first { + resolvedAppSupport = discovered + } else { + return nil + } + let bundleId = (bundleIdentifier?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty == false) + ? bundleIdentifier! + : "com.cmuxterm.app" + let safeBundleId = bundleId.replacingOccurrences( + of: "[^A-Za-z0-9._-]", + with: "_", + options: .regularExpression + ) + return resolvedAppSupport + .appendingPathComponent("cmux", isDirectory: true) + .appendingPathComponent("session-\(safeBundleId).json", isDirectory: false) + } +} + +enum SessionScrollbackReplayStore { + static let environmentKey = "CMUX_RESTORE_SCROLLBACK_FILE" + private static let directoryName = "cmux-session-scrollback" + private static let ansiEscape = "\u{001B}" + private static let ansiReset = "\u{001B}[0m" + + static func replayEnvironment( + for scrollback: String?, + tempDirectory: URL = FileManager.default.temporaryDirectory + ) -> [String: String] { + guard let replayText = normalizedScrollback(scrollback) else { return [:] } + guard let replayFileURL = writeReplayFile( + contents: replayText, + tempDirectory: tempDirectory + ) else { + return [:] + } + return [environmentKey: replayFileURL.path] + } + + private static func normalizedScrollback(_ scrollback: String?) -> String? { + guard let scrollback else { return nil } + guard scrollback.contains(where: { !$0.isWhitespace }) else { return nil } + guard let truncated = SessionPersistencePolicy.truncatedScrollback(scrollback) else { return nil } + return ansiSafeReplayText(truncated) + } + + /// Preserve ANSI color state safely across replay boundaries. + private static func ansiSafeReplayText(_ text: String) -> String { + guard text.contains(ansiEscape) else { return text } + var output = text + if !output.hasPrefix(ansiReset) { + output = ansiReset + output + } + if !output.hasSuffix(ansiReset) { + output += ansiReset + } + return output + } + + private static func writeReplayFile(contents: String, tempDirectory: URL) -> URL? { + guard let data = contents.data(using: .utf8) else { return nil } + let directory = tempDirectory.appendingPathComponent(directoryName, isDirectory: true) + + do { + try FileManager.default.createDirectory( + at: directory, + withIntermediateDirectories: true, + attributes: nil + ) + let fileURL = directory + .appendingPathComponent(UUID().uuidString, isDirectory: false) + .appendingPathExtension("txt") + try data.write(to: fileURL, options: .atomic) + return fileURL + } catch { + return nil + } + } +} diff --git a/Sources/SidebarSelectionState.swift b/Sources/SidebarSelectionState.swift index 6fed3117..78ea1ab5 100644 --- a/Sources/SidebarSelectionState.swift +++ b/Sources/SidebarSelectionState.swift @@ -2,6 +2,9 @@ import SwiftUI @MainActor final class SidebarSelectionState: ObservableObject { - @Published var selection: SidebarSelection = .tabs -} + @Published var selection: SidebarSelection + init(selection: SidebarSelection = .tabs) { + self.selection = selection + } +} diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 0bcd5ea6..cec81c03 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -2774,6 +2774,75 @@ class TabManager: ObservableObject { #endif } +extension TabManager { + func sessionSnapshot(includeScrollback: Bool) -> SessionTabManagerSnapshot { + let workspaceSnapshots = tabs + .prefix(SessionPersistencePolicy.maxWorkspacesPerWindow) + .map { $0.sessionSnapshot(includeScrollback: includeScrollback) } + let selectedWorkspaceIndex = selectedTabId.flatMap { selectedTabId in + tabs.firstIndex(where: { $0.id == selectedTabId }) + } + return SessionTabManagerSnapshot( + selectedWorkspaceIndex: selectedWorkspaceIndex, + workspaces: workspaceSnapshots + ) + } + + func restoreSessionSnapshot(_ snapshot: SessionTabManagerSnapshot) { + for tab in tabs { + unwireClosedBrowserTracking(for: tab) + } + + tabs.removeAll(keepingCapacity: false) + lastFocusedPanelByTab.removeAll() + pendingPanelTitleUpdates.removeAll() + tabHistory.removeAll() + historyIndex = -1 + isNavigatingHistory = false + pendingWorkspaceUnfocusTarget = nil + workspaceCycleCooldownTask?.cancel() + workspaceCycleCooldownTask = nil + isWorkspaceCycleHot = false + selectionSideEffectsGeneration &+= 1 + recentlyClosedBrowsers = RecentlyClosedBrowserStack(capacity: 20) + + let workspaceSnapshots = snapshot.workspaces + .prefix(SessionPersistencePolicy.maxWorkspacesPerWindow) + for workspaceSnapshot in workspaceSnapshots { + let ordinal = Self.nextPortOrdinal + Self.nextPortOrdinal += 1 + let workspace = Workspace( + title: workspaceSnapshot.processTitle, + workingDirectory: workspaceSnapshot.currentDirectory, + portOrdinal: ordinal + ) + workspace.restoreSessionSnapshot(workspaceSnapshot) + wireClosedBrowserTracking(for: workspace) + tabs.append(workspace) + } + + if tabs.isEmpty { + _ = addWorkspace(select: false) + } + + selectedTabId = nil + if let selectedWorkspaceIndex = snapshot.selectedWorkspaceIndex, + tabs.indices.contains(selectedWorkspaceIndex) { + selectedTabId = tabs[selectedWorkspaceIndex].id + } else { + selectedTabId = tabs.first?.id + } + + if let selectedTabId { + NotificationCenter.default.post( + name: .ghosttyDidFocusTab, + object: nil, + userInfo: [GhosttyNotificationKey.tabId: selectedTabId] + ) + } + } +} + // MARK: - Direction Types for Backwards Compatibility /// Split direction for backwards compatibility with old API diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 3f61f26b..f276f2a6 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -3486,6 +3486,143 @@ class TerminalController { return "OK \(base64)" } + private struct PasteboardItemSnapshot { + let representations: [(type: NSPasteboard.PasteboardType, data: Data)] + } + + nonisolated static func normalizedExportedScreenPath(_ raw: String?) -> String? { + guard let raw else { return nil } + let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return nil } + if let url = URL(string: trimmed), + url.isFileURL, + !url.path.isEmpty { + return url.path + } + return trimmed.hasPrefix("/") ? trimmed : nil + } + + nonisolated static func shouldRemoveExportedScreenDirectory( + fileURL: URL, + temporaryDirectory: URL = FileManager.default.temporaryDirectory + ) -> Bool { + let directory = fileURL.deletingLastPathComponent().standardizedFileURL + let temporary = temporaryDirectory.standardizedFileURL + return directory.path.hasPrefix(temporary.path + "/") + } + + private func snapshotPasteboardItems(_ pasteboard: NSPasteboard) -> [PasteboardItemSnapshot] { + guard let items = pasteboard.pasteboardItems else { return [] } + return items.map { item in + let representations = item.types.compactMap { type -> (type: NSPasteboard.PasteboardType, data: Data)? in + guard let data = item.data(forType: type) else { return nil } + return (type: type, data: data) + } + return PasteboardItemSnapshot(representations: representations) + } + } + + private func restorePasteboardItems( + _ snapshots: [PasteboardItemSnapshot], + to pasteboard: NSPasteboard + ) { + _ = pasteboard.clearContents() + guard !snapshots.isEmpty else { return } + + let restoredItems = snapshots.compactMap { snapshot -> NSPasteboardItem? in + guard !snapshot.representations.isEmpty else { return nil } + let item = NSPasteboardItem() + for representation in snapshot.representations { + item.setData(representation.data, forType: representation.type) + } + return item + } + guard !restoredItems.isEmpty else { return } + _ = pasteboard.writeObjects(restoredItems) + } + + private func readGeneralPasteboardString(_ pasteboard: NSPasteboard) -> String? { + if let urls = pasteboard.readObjects(forClasses: [NSURL.self]) as? [URL], + let firstURL = urls.first, + firstURL.isFileURL { + return firstURL.path + } + if let value = pasteboard.string(forType: .string) { + return value + } + return pasteboard.string(forType: NSPasteboard.PasteboardType("public.utf8-plain-text")) + } + + private func readTerminalTextFromVTExportForSnapshot( + terminalPanel: TerminalPanel, + lineLimit: Int? + ) -> String? { + // read_text strips style state; VT export keeps ANSI escape sequences. + let pasteboard = NSPasteboard.general + let snapshot = snapshotPasteboardItems(pasteboard) + defer { + restorePasteboardItems(snapshot, to: pasteboard) + } + + let initialChangeCount = pasteboard.changeCount + guard terminalPanel.performBindingAction("write_screen_file:copy,vt") else { + return nil + } + guard pasteboard.changeCount != initialChangeCount else { + return nil + } + guard let exportedPath = Self.normalizedExportedScreenPath(readGeneralPasteboardString(pasteboard)) else { + return nil + } + + let fileURL = URL(fileURLWithPath: exportedPath) + defer { + try? FileManager.default.removeItem(at: fileURL) + if Self.shouldRemoveExportedScreenDirectory(fileURL: fileURL) { + try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) + } + } + + guard let data = try? Data(contentsOf: fileURL), + var output = String(data: data, encoding: .utf8) else { + return nil + } + if let lineLimit { + output = tailTerminalLines(output, maxLines: lineLimit) + } + return output + } + + func readTerminalTextForSnapshot( + terminalPanel: TerminalPanel, + includeScrollback: Bool = false, + lineLimit: Int? = nil + ) -> String? { + if includeScrollback, + let vtOutput = readTerminalTextFromVTExportForSnapshot( + terminalPanel: terminalPanel, + lineLimit: lineLimit + ) { + return vtOutput + } + + let response = readTerminalTextBase64( + terminalPanel: terminalPanel, + includeScrollback: includeScrollback, + lineLimit: lineLimit + ) + guard response.hasPrefix("OK ") else { return nil } + let base64 = String(response.dropFirst(3)).trimmingCharacters(in: .whitespacesAndNewlines) + if base64.isEmpty { + return "" + } + guard let data = Data(base64Encoded: base64), + let decoded = String(data: data, encoding: .utf8) else { + return nil + } + return decoded + } + private func v2SurfaceTriggerFlash(params: [String: Any]) -> V2CallResult { guard let tabManager = v2ResolveTabManager(params: params) else { return .err(code: "unavailable", message: "TabManager not available", data: nil) diff --git a/Sources/Update/UpdateDelegate.swift b/Sources/Update/UpdateDelegate.swift index 32e2304c..dfcd457c 100644 --- a/Sources/Update/UpdateDelegate.swift +++ b/Sources/Update/UpdateDelegate.swift @@ -80,7 +80,9 @@ extension UpdateDriver: SPUUpdaterDelegate { } } + @MainActor func updaterWillRelaunchApplication(_ updater: SPUUpdater) { + AppDelegate.shared?.persistSessionForUpdateRelaunch() TerminalController.shared.stop() NSApp.invalidateRestorableState() for window in NSApp.windows { diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 547cd84b..e0180270 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -12,6 +12,487 @@ struct SidebarStatusEntry { let timestamp: Date } +private struct SessionPaneRestoreEntry { + let paneId: PaneID + let snapshot: SessionPaneLayoutSnapshot +} + +extension Workspace { + func sessionSnapshot(includeScrollback: Bool) -> SessionWorkspaceSnapshot { + let tree = bonsplitController.treeSnapshot() + let layout = sessionLayoutSnapshot(from: tree) + + let orderedPanelIds = sidebarOrderedPanelIds() + var seen: Set<UUID> = [] + var allPanelIds: [UUID] = [] + for panelId in orderedPanelIds where seen.insert(panelId).inserted { + allPanelIds.append(panelId) + } + for panelId in panels.keys.sorted(by: { $0.uuidString < $1.uuidString }) where seen.insert(panelId).inserted { + allPanelIds.append(panelId) + } + + let panelSnapshots = allPanelIds + .prefix(SessionPersistencePolicy.maxPanelsPerWorkspace) + .compactMap { sessionPanelSnapshot(panelId: $0, includeScrollback: includeScrollback) } + + let statusSnapshots = statusEntries.values + .sorted { lhs, rhs in lhs.key < rhs.key } + .map { entry in + SessionStatusEntrySnapshot( + key: entry.key, + value: entry.value, + icon: entry.icon, + color: entry.color, + timestamp: entry.timestamp.timeIntervalSince1970 + ) + } + let logSnapshots = logEntries.map { entry in + SessionLogEntrySnapshot( + message: entry.message, + level: entry.level.rawValue, + source: entry.source, + timestamp: entry.timestamp.timeIntervalSince1970 + ) + } + + let progressSnapshot = progress.map { progress in + SessionProgressSnapshot(value: progress.value, label: progress.label) + } + let gitBranchSnapshot = gitBranch.map { branch in + SessionGitBranchSnapshot(branch: branch.branch, isDirty: branch.isDirty) + } + + return SessionWorkspaceSnapshot( + processTitle: processTitle, + customTitle: customTitle, + isPinned: isPinned, + currentDirectory: currentDirectory, + focusedPanelId: focusedPanelId, + layout: layout, + panels: panelSnapshots, + statusEntries: statusSnapshots, + logEntries: logSnapshots, + progress: progressSnapshot, + gitBranch: gitBranchSnapshot + ) + } + + func restoreSessionSnapshot(_ snapshot: SessionWorkspaceSnapshot) { + restoredTerminalScrollbackByPanelId.removeAll(keepingCapacity: false) + + let normalizedCurrentDirectory = snapshot.currentDirectory.trimmingCharacters(in: .whitespacesAndNewlines) + if !normalizedCurrentDirectory.isEmpty { + currentDirectory = normalizedCurrentDirectory + } + + let panelSnapshotsById = Dictionary(uniqueKeysWithValues: snapshot.panels.map { ($0.id, $0) }) + let leafEntries = restoreSessionLayout(snapshot.layout) + var oldToNewPanelIds: [UUID: UUID] = [:] + + for entry in leafEntries { + restorePane( + entry.paneId, + snapshot: entry.snapshot, + panelSnapshotsById: panelSnapshotsById, + oldToNewPanelIds: &oldToNewPanelIds + ) + } + + pruneSurfaceMetadata(validSurfaceIds: Set(panels.keys)) + applySessionDividerPositions(snapshotNode: snapshot.layout, liveNode: bonsplitController.treeSnapshot()) + + applyProcessTitle(snapshot.processTitle) + setCustomTitle(snapshot.customTitle) + isPinned = snapshot.isPinned + + statusEntries = Dictionary( + uniqueKeysWithValues: snapshot.statusEntries.map { entry in + ( + entry.key, + SidebarStatusEntry( + key: entry.key, + value: entry.value, + icon: entry.icon, + color: entry.color, + timestamp: Date(timeIntervalSince1970: entry.timestamp) + ) + ) + } + ) + logEntries = snapshot.logEntries.map { entry in + SidebarLogEntry( + message: entry.message, + level: SidebarLogLevel(rawValue: entry.level) ?? .info, + source: entry.source, + timestamp: Date(timeIntervalSince1970: entry.timestamp) + ) + } + progress = snapshot.progress.map { SidebarProgressState(value: $0.value, label: $0.label) } + gitBranch = snapshot.gitBranch.map { SidebarGitBranchState(branch: $0.branch, isDirty: $0.isDirty) } + + recomputeListeningPorts() + + if let focusedOldPanelId = snapshot.focusedPanelId, + let focusedNewPanelId = oldToNewPanelIds[focusedOldPanelId], + panels[focusedNewPanelId] != nil { + focusPanel(focusedNewPanelId) + } else if let fallbackFocusedPanelId = focusedPanelId, panels[fallbackFocusedPanelId] != nil { + focusPanel(fallbackFocusedPanelId) + } else { + scheduleFocusReconcile() + } + } + + private func sessionLayoutSnapshot(from node: ExternalTreeNode) -> SessionWorkspaceLayoutSnapshot { + switch node { + case .pane(let pane): + let panelIds = sessionPanelIDs(for: pane) + let selectedPanelId = pane.selectedTabId.flatMap(sessionPanelID(forExternalTabIDString:)) + return .pane( + SessionPaneLayoutSnapshot( + panelIds: panelIds, + selectedPanelId: selectedPanelId + ) + ) + case .split(let split): + return .split( + SessionSplitLayoutSnapshot( + orientation: split.orientation.lowercased() == "vertical" ? .vertical : .horizontal, + dividerPosition: split.dividerPosition, + first: sessionLayoutSnapshot(from: split.first), + second: sessionLayoutSnapshot(from: split.second) + ) + ) + } + } + + private func sessionPanelIDs(for pane: ExternalPaneNode) -> [UUID] { + var panelIds: [UUID] = [] + var seen = Set<UUID>() + for tab in pane.tabs { + guard let panelId = sessionPanelID(forExternalTabIDString: tab.id) else { continue } + if seen.insert(panelId).inserted { + panelIds.append(panelId) + } + } + return panelIds + } + + private func sessionPanelID(forExternalTabIDString tabIDString: String) -> UUID? { + guard let tabUUID = UUID(uuidString: tabIDString) else { return nil } + for (surfaceId, panelId) in surfaceIdToPanelId { + guard let surfaceUUID = sessionSurfaceUUID(for: surfaceId) else { continue } + if surfaceUUID == tabUUID { + return panelId + } + } + return nil + } + + private func sessionSurfaceUUID(for surfaceId: TabID) -> UUID? { + struct EncodedSurfaceID: Decodable { + let id: UUID + } + + guard let data = try? JSONEncoder().encode(surfaceId), + let decoded = try? JSONDecoder().decode(EncodedSurfaceID.self, from: data) else { + return nil + } + return decoded.id + } + + private func sessionPanelSnapshot(panelId: UUID, includeScrollback: Bool) -> SessionPanelSnapshot? { + guard let panel = panels[panelId] else { return nil } + + let panelTitle = panelTitle(panelId: panelId) + let customTitle = panelCustomTitles[panelId] + let directory = panelDirectories[panelId] + let isPinned = pinnedPanelIds.contains(panelId) + let isManuallyUnread = manualUnreadPanelIds.contains(panelId) + let branchSnapshot = panelGitBranches[panelId].map { + SessionGitBranchSnapshot(branch: $0.branch, isDirty: $0.isDirty) + } + let listeningPorts = (surfaceListeningPorts[panelId] ?? []).sorted() + let ttyName = surfaceTTYNames[panelId] + + let terminalSnapshot: SessionTerminalPanelSnapshot? + let browserSnapshot: SessionBrowserPanelSnapshot? + switch panel.panelType { + case .terminal: + guard let terminalPanel = panel as? TerminalPanel else { return nil } + let capturedScrollback = includeScrollback + ? TerminalController.shared.readTerminalTextForSnapshot( + terminalPanel: terminalPanel, + includeScrollback: true, + lineLimit: SessionPersistencePolicy.maxScrollbackLinesPerTerminal + ) + : nil + let resolvedScrollback = terminalSnapshotScrollback( + panelId: panelId, + capturedScrollback: capturedScrollback, + includeScrollback: includeScrollback + ) + terminalSnapshot = SessionTerminalPanelSnapshot( + workingDirectory: panelDirectories[panelId], + scrollback: resolvedScrollback + ) + browserSnapshot = nil + case .browser: + guard let browserPanel = panel as? BrowserPanel else { return nil } + terminalSnapshot = nil + browserSnapshot = SessionBrowserPanelSnapshot( + urlString: browserPanel.currentURL?.absoluteString, + shouldRenderWebView: browserPanel.shouldRenderWebView, + pageZoom: Double(browserPanel.webView.pageZoom), + developerToolsVisible: browserPanel.isDeveloperToolsVisible() + ) + } + + return SessionPanelSnapshot( + id: panelId, + type: panel.panelType, + title: panelTitle, + customTitle: customTitle, + directory: directory, + isPinned: isPinned, + isManuallyUnread: isManuallyUnread, + gitBranch: branchSnapshot, + listeningPorts: listeningPorts, + ttyName: ttyName, + terminal: terminalSnapshot, + browser: browserSnapshot + ) + } + + nonisolated static func resolvedSnapshotTerminalScrollback( + capturedScrollback: String?, + fallbackScrollback: String? + ) -> String? { + if let captured = SessionPersistencePolicy.truncatedScrollback(capturedScrollback) { + return captured + } + return SessionPersistencePolicy.truncatedScrollback(fallbackScrollback) + } + + private func terminalSnapshotScrollback( + panelId: UUID, + capturedScrollback: String?, + includeScrollback: Bool + ) -> String? { + guard includeScrollback else { return nil } + let fallback = restoredTerminalScrollbackByPanelId[panelId] + let resolved = Self.resolvedSnapshotTerminalScrollback( + capturedScrollback: capturedScrollback, + fallbackScrollback: fallback + ) + if let resolved { + restoredTerminalScrollbackByPanelId[panelId] = resolved + } else { + restoredTerminalScrollbackByPanelId.removeValue(forKey: panelId) + } + return resolved + } + + private func restoreSessionLayout(_ layout: SessionWorkspaceLayoutSnapshot) -> [SessionPaneRestoreEntry] { + guard let rootPaneId = bonsplitController.allPaneIds.first else { + return [] + } + + var leaves: [SessionPaneRestoreEntry] = [] + restoreSessionLayoutNode(layout, inPane: rootPaneId, leaves: &leaves) + return leaves + } + + private func restoreSessionLayoutNode( + _ node: SessionWorkspaceLayoutSnapshot, + inPane paneId: PaneID, + leaves: inout [SessionPaneRestoreEntry] + ) { + switch node { + case .pane(let pane): + leaves.append(SessionPaneRestoreEntry(paneId: paneId, snapshot: pane)) + case .split(let split): + var anchorPanelId = bonsplitController + .tabs(inPane: paneId) + .compactMap { panelIdFromSurfaceId($0.id) } + .first + + if anchorPanelId == nil { + anchorPanelId = newTerminalSurface(inPane: paneId, focus: false)?.id + } + + guard let anchorPanelId, + let newSplitPanel = newTerminalSplit( + from: anchorPanelId, + orientation: split.orientation.splitOrientation, + insertFirst: false, + focus: false + ), + let secondPaneId = self.paneId(forPanelId: newSplitPanel.id) else { + leaves.append( + SessionPaneRestoreEntry( + paneId: paneId, + snapshot: SessionPaneLayoutSnapshot(panelIds: [], selectedPanelId: nil) + ) + ) + return + } + + restoreSessionLayoutNode(split.first, inPane: paneId, leaves: &leaves) + restoreSessionLayoutNode(split.second, inPane: secondPaneId, leaves: &leaves) + } + } + + private func restorePane( + _ paneId: PaneID, + snapshot: SessionPaneLayoutSnapshot, + panelSnapshotsById: [UUID: SessionPanelSnapshot], + oldToNewPanelIds: inout [UUID: UUID] + ) { + let existingPanelIds = bonsplitController + .tabs(inPane: paneId) + .compactMap { panelIdFromSurfaceId($0.id) } + let desiredOldPanelIds = snapshot.panelIds.filter { panelSnapshotsById[$0] != nil } + + var createdPanelIds: [UUID] = [] + for oldPanelId in desiredOldPanelIds { + guard let panelSnapshot = panelSnapshotsById[oldPanelId] else { continue } + guard let createdPanelId = createPanel(from: panelSnapshot, inPane: paneId) else { continue } + createdPanelIds.append(createdPanelId) + oldToNewPanelIds[oldPanelId] = createdPanelId + } + + guard !createdPanelIds.isEmpty else { return } + + for oldPanelId in existingPanelIds where !createdPanelIds.contains(oldPanelId) { + _ = closePanel(oldPanelId, force: true) + } + + for (index, panelId) in createdPanelIds.enumerated() { + _ = reorderSurface(panelId: panelId, toIndex: index) + } + + let selectedPanelId: UUID? = { + if let selectedOldId = snapshot.selectedPanelId { + return oldToNewPanelIds[selectedOldId] + } + return createdPanelIds.first + }() + + if let selectedPanelId, + let selectedTabId = surfaceIdFromPanelId(selectedPanelId) { + bonsplitController.focusPane(paneId) + bonsplitController.selectTab(selectedTabId) + } + } + + private func createPanel(from snapshot: SessionPanelSnapshot, inPane paneId: PaneID) -> UUID? { + switch snapshot.type { + case .terminal: + let workingDirectory = snapshot.terminal?.workingDirectory ?? snapshot.directory ?? currentDirectory + let replayEnvironment = SessionScrollbackReplayStore.replayEnvironment( + for: snapshot.terminal?.scrollback + ) + guard let terminalPanel = newTerminalSurface( + inPane: paneId, + focus: false, + workingDirectory: workingDirectory, + startupEnvironment: replayEnvironment + ) else { + return nil + } + let fallbackScrollback = SessionPersistencePolicy.truncatedScrollback(snapshot.terminal?.scrollback) + if let fallbackScrollback { + restoredTerminalScrollbackByPanelId[terminalPanel.id] = fallbackScrollback + } else { + restoredTerminalScrollbackByPanelId.removeValue(forKey: terminalPanel.id) + } + applySessionPanelMetadata(snapshot, toPanelId: terminalPanel.id) + return terminalPanel.id + case .browser: + let initialURL = snapshot.browser?.urlString.flatMap { URL(string: $0) } + guard let browserPanel = newBrowserSurface( + inPane: paneId, + url: initialURL, + focus: false + ) else { + return nil + } + applySessionPanelMetadata(snapshot, toPanelId: browserPanel.id) + return browserPanel.id + } + } + + private func applySessionPanelMetadata(_ snapshot: SessionPanelSnapshot, toPanelId panelId: UUID) { + if let title = snapshot.title?.trimmingCharacters(in: .whitespacesAndNewlines), !title.isEmpty { + panelTitles[panelId] = title + } + + setPanelCustomTitle(panelId: panelId, title: snapshot.customTitle) + setPanelPinned(panelId: panelId, pinned: snapshot.isPinned) + + if snapshot.isManuallyUnread { + markPanelUnread(panelId) + } else { + clearManualUnread(panelId: panelId) + } + + if let directory = snapshot.directory?.trimmingCharacters(in: .whitespacesAndNewlines), !directory.isEmpty { + updatePanelDirectory(panelId: panelId, directory: directory) + } + + if let branch = snapshot.gitBranch { + panelGitBranches[panelId] = SidebarGitBranchState(branch: branch.branch, isDirty: branch.isDirty) + } else { + panelGitBranches.removeValue(forKey: panelId) + } + + surfaceListeningPorts[panelId] = Array(Set(snapshot.listeningPorts)).sorted() + + if let ttyName = snapshot.ttyName?.trimmingCharacters(in: .whitespacesAndNewlines), !ttyName.isEmpty { + surfaceTTYNames[panelId] = ttyName + } else { + surfaceTTYNames.removeValue(forKey: panelId) + } + + if let browserSnapshot = snapshot.browser, + let browserPanel = browserPanel(for: panelId) { + let pageZoom = CGFloat(max(0.25, min(5.0, browserSnapshot.pageZoom))) + if pageZoom.isFinite { + browserPanel.webView.pageZoom = pageZoom + } + + if browserSnapshot.developerToolsVisible { + _ = browserPanel.showDeveloperTools() + browserPanel.requestDeveloperToolsRefreshAfterNextAttach(reason: "session_restore") + } else { + _ = browserPanel.hideDeveloperTools() + } + } + } + + private func applySessionDividerPositions( + snapshotNode: SessionWorkspaceLayoutSnapshot, + liveNode: ExternalTreeNode + ) { + switch (snapshotNode, liveNode) { + case (.split(let snapshotSplit), .split(let liveSplit)): + if let splitID = UUID(uuidString: liveSplit.id) { + _ = bonsplitController.setDividerPosition( + CGFloat(snapshotSplit.dividerPosition), + forSplit: splitID, + fromExternal: true + ) + } + applySessionDividerPositions(snapshotNode: snapshotSplit.first, liveNode: liveSplit.first) + applySessionDividerPositions(snapshotNode: snapshotSplit.second, liveNode: liveSplit.second) + default: + return + } + } +} + enum SidebarLogLevel: String { case info case progress @@ -302,6 +783,7 @@ final class Workspace: Identifiable, ObservableObject { @Published var surfaceListeningPorts: [UUID: [Int]] = [:] @Published var listeningPorts: [Int] = [] var surfaceTTYNames: [UUID: String] = [:] + private var restoredTerminalScrollbackByPanelId: [UUID: String] = [:] var focusedSurfaceId: UUID? { focusedPanelId } var surfaceDirectories: [UUID: String] { @@ -995,7 +1477,12 @@ final class Workspace: Identifiable, ObservableObject { /// true = force focus/selection of the new surface, /// false = never focus (used for internal placeholder repair paths). @discardableResult - func newTerminalSurface(inPane paneId: PaneID, focus: Bool? = nil) -> TerminalPanel? { + func newTerminalSurface( + inPane paneId: PaneID, + focus: Bool? = nil, + workingDirectory: String? = nil, + startupEnvironment: [String: String] = [:] + ) -> TerminalPanel? { let shouldFocusNewTab = focus ?? (bonsplitController.focusedPaneId == paneId) // Get an existing terminal panel to inherit config from @@ -1014,6 +1501,8 @@ final class Workspace: Identifiable, ObservableObject { workspaceId: id, context: GHOSTTY_SURFACE_CONTEXT_SPLIT, configTemplate: inheritedConfig, + workingDirectory: workingDirectory, + additionalEnvironment: startupEnvironment, portOrdinal: portOrdinal ) panels[newPanel.id] = newPanel @@ -2158,6 +2647,7 @@ extension Workspace: BonsplitDelegate { manualUnreadMarkedAt.removeValue(forKey: panelId) panelSubscriptions.removeValue(forKey: panelId) surfaceTTYNames.removeValue(forKey: panelId) + restoredTerminalScrollbackByPanelId.removeValue(forKey: panelId) PortScanner.shared.unregisterPanel(workspaceId: id, panelId: panelId) // Keep the workspace invariant: always retain at least one real panel. @@ -2250,6 +2740,7 @@ extension Workspace: BonsplitDelegate { panelSubscriptions.removeValue(forKey: panelId) surfaceTTYNames.removeValue(forKey: panelId) surfaceListeningPorts.removeValue(forKey: panelId) + restoredTerminalScrollbackByPanelId.removeValue(forKey: panelId) PortScanner.shared.unregisterPanel(workspaceId: id, panelId: panelId) } diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 09b18c59..cdbc0175 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -343,7 +343,18 @@ struct cmuxApp: App { .keyboardShortcut("n", modifiers: [.command, .shift]) Button("New Workspace") { - (AppDelegate.shared?.tabManager ?? tabManager).addTab() + if let appDelegate = AppDelegate.shared { + if appDelegate.addWorkspaceInPreferredMainWindow(debugSource: "menu.newWorkspace") == nil { +#if DEBUG + FocusLogStore.shared.append( + "cmdn.route phase=fallback_new_window src=menu.newWorkspace reason=workspace_creation_returned_nil" + ) +#endif + appDelegate.openNewMainWindow(nil) + } + } else { + tabManager.addTab() + } } } diff --git a/cmuxTests/AppDelegateShortcutRoutingTests.swift b/cmuxTests/AppDelegateShortcutRoutingTests.swift new file mode 100644 index 00000000..dae9faff --- /dev/null +++ b/cmuxTests/AppDelegateShortcutRoutingTests.swift @@ -0,0 +1,214 @@ +import XCTest + +#if canImport(cmux_DEV) +@testable import cmux_DEV +#elseif canImport(cmux) +@testable import cmux +#endif + +@MainActor +final class AppDelegateShortcutRoutingTests: XCTestCase { + func testCmdNUsesEventWindowContextWhenActiveManagerIsStale() { + guard let appDelegate = AppDelegate.shared else { + XCTFail("Expected AppDelegate.shared") + return + } + + let firstWindowId = appDelegate.createMainWindow() + let secondWindowId = appDelegate.createMainWindow() + + defer { + closeWindow(withId: firstWindowId) + closeWindow(withId: secondWindowId) + } + + guard let firstManager = appDelegate.tabManagerFor(windowId: firstWindowId), + let secondManager = appDelegate.tabManagerFor(windowId: secondWindowId), + let secondWindow = window(withId: secondWindowId) else { + XCTFail("Expected both window contexts to exist") + return + } + + let firstCount = firstManager.tabs.count + let secondCount = secondManager.tabs.count + + XCTAssertTrue(appDelegate.focusMainWindow(windowId: firstWindowId)) + + guard let event = NSEvent.keyEvent( + with: .keyDown, + location: .zero, + modifierFlags: [.command], + timestamp: ProcessInfo.processInfo.systemUptime, + windowNumber: secondWindow.windowNumber, + context: nil, + characters: "n", + charactersIgnoringModifiers: "n", + isARepeat: false, + keyCode: 45 + ) else { + XCTFail("Failed to construct Cmd+N event") + return + } + +#if DEBUG + XCTAssertTrue(appDelegate.debugHandleCustomShortcut(event: event)) +#else + XCTFail("debugHandleCustomShortcut is only available in DEBUG") +#endif + + XCTAssertEqual(firstManager.tabs.count, firstCount, "Cmd+N should not add workspace to stale active window") + XCTAssertEqual(secondManager.tabs.count, secondCount + 1, "Cmd+N should add workspace to the event's window") + } + + func testAddWorkspaceInPreferredMainWindowIgnoresStaleTabManagerPointer() { + guard let appDelegate = AppDelegate.shared else { + XCTFail("Expected AppDelegate.shared") + return + } + + let firstWindowId = appDelegate.createMainWindow() + let secondWindowId = appDelegate.createMainWindow() + + defer { + closeWindow(withId: firstWindowId) + closeWindow(withId: secondWindowId) + } + + guard let firstManager = appDelegate.tabManagerFor(windowId: firstWindowId), + let secondManager = appDelegate.tabManagerFor(windowId: secondWindowId), + let secondWindow = window(withId: secondWindowId) else { + XCTFail("Expected both window contexts to exist") + return + } + + let firstCount = firstManager.tabs.count + let secondCount = secondManager.tabs.count + + secondWindow.makeKeyAndOrderFront(nil) + RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.05)) + + // Force a stale app-level pointer to a different manager. + appDelegate.tabManager = firstManager + XCTAssertTrue(appDelegate.tabManager === firstManager) + + _ = appDelegate.addWorkspaceInPreferredMainWindow() + + XCTAssertEqual(firstManager.tabs.count, firstCount, "Stale pointer must not receive menu-driven workspace creation") + XCTAssertEqual(secondManager.tabs.count, secondCount + 1, "Workspace creation should target key/main window context") + } + + func testCmdNResolvesEventWindowWhenObjectKeyLookupIsMismatched() { + guard let appDelegate = AppDelegate.shared else { + XCTFail("Expected AppDelegate.shared") + return + } + + let firstWindowId = appDelegate.createMainWindow() + let secondWindowId = appDelegate.createMainWindow() + + defer { + closeWindow(withId: firstWindowId) + closeWindow(withId: secondWindowId) + } + + guard let firstManager = appDelegate.tabManagerFor(windowId: firstWindowId), + let secondManager = appDelegate.tabManagerFor(windowId: secondWindowId), + let secondWindow = window(withId: secondWindowId) else { + XCTFail("Expected both window contexts to exist") + return + } + + secondWindow.makeKeyAndOrderFront(nil) + RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.05)) + +#if DEBUG + XCTAssertTrue(appDelegate.debugInjectWindowContextKeyMismatch(windowId: secondWindowId)) +#else + XCTFail("debugInjectWindowContextKeyMismatch is only available in DEBUG") +#endif + + // Ensure stale active-manager pointer does not mask routing errors. + appDelegate.tabManager = firstManager + + let firstCount = firstManager.tabs.count + let secondCount = secondManager.tabs.count + + guard let event = NSEvent.keyEvent( + with: .keyDown, + location: .zero, + modifierFlags: [.command], + timestamp: ProcessInfo.processInfo.systemUptime, + windowNumber: secondWindow.windowNumber, + context: nil, + characters: "n", + charactersIgnoringModifiers: "n", + isARepeat: false, + keyCode: 45 + ) else { + XCTFail("Failed to construct Cmd+N event") + return + } + +#if DEBUG + XCTAssertTrue(appDelegate.debugHandleCustomShortcut(event: event)) +#else + XCTFail("debugHandleCustomShortcut is only available in DEBUG") +#endif + + XCTAssertEqual(firstManager.tabs.count, firstCount, "Cmd+N should not route to another window when object-key lookup misses") + XCTAssertEqual(secondManager.tabs.count, secondCount + 1, "Cmd+N should still route by event window metadata when object-key lookup misses") + } + + func testAddWorkspaceInPreferredMainWindowUsesKeyWindowWhenObjectKeyLookupIsMismatched() { + guard let appDelegate = AppDelegate.shared else { + XCTFail("Expected AppDelegate.shared") + return + } + + let firstWindowId = appDelegate.createMainWindow() + let secondWindowId = appDelegate.createMainWindow() + + defer { + closeWindow(withId: firstWindowId) + closeWindow(withId: secondWindowId) + } + + guard let firstManager = appDelegate.tabManagerFor(windowId: firstWindowId), + let secondManager = appDelegate.tabManagerFor(windowId: secondWindowId), + let secondWindow = window(withId: secondWindowId) else { + XCTFail("Expected both window contexts to exist") + return + } + + secondWindow.makeKeyAndOrderFront(nil) + RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.05)) + +#if DEBUG + XCTAssertTrue(appDelegate.debugInjectWindowContextKeyMismatch(windowId: secondWindowId)) +#else + XCTFail("debugInjectWindowContextKeyMismatch is only available in DEBUG") +#endif + + // Stale pointer should not receive the new workspace. + appDelegate.tabManager = firstManager + + let firstCount = firstManager.tabs.count + let secondCount = secondManager.tabs.count + + _ = appDelegate.addWorkspaceInPreferredMainWindow() + + XCTAssertEqual(firstManager.tabs.count, firstCount, "Menu-driven add workspace should not route to stale window") + XCTAssertEqual(secondManager.tabs.count, secondCount + 1, "Menu-driven add workspace should still route to key window context when object-key lookup misses") + } + + private func window(withId windowId: UUID) -> NSWindow? { + let identifier = "cmux.main.\(windowId.uuidString)" + return NSApp.windows.first(where: { $0.identifier?.rawValue == identifier }) + } + + private func closeWindow(withId windowId: UUID) { + guard let window = window(withId: windowId) else { return } + window.performClose(nil) + RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.05)) + } +} diff --git a/cmuxTests/SessionPersistenceTests.swift b/cmuxTests/SessionPersistenceTests.swift new file mode 100644 index 00000000..fd2fff77 --- /dev/null +++ b/cmuxTests/SessionPersistenceTests.swift @@ -0,0 +1,382 @@ +import XCTest + +#if canImport(cmux_DEV) +@testable import cmux_DEV +#elseif canImport(cmux) +@testable import cmux +#endif + +final class SessionPersistenceTests: XCTestCase { + func testSaveAndLoadRoundTripWithCustomSnapshotPath() { + let tempDir = FileManager.default.temporaryDirectory + .appendingPathComponent("cmux-session-tests-\(UUID().uuidString)", isDirectory: true) + try? FileManager.default.createDirectory(at: tempDir, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: tempDir) } + + let snapshotURL = tempDir.appendingPathComponent("session.json", isDirectory: false) + let snapshot = makeSnapshot(version: SessionSnapshotSchema.currentVersion) + + XCTAssertTrue(SessionPersistenceStore.save(snapshot, fileURL: snapshotURL)) + + let loaded = SessionPersistenceStore.load(fileURL: snapshotURL) + XCTAssertNotNil(loaded) + XCTAssertEqual(loaded?.version, SessionSnapshotSchema.currentVersion) + XCTAssertEqual(loaded?.windows.count, 1) + XCTAssertEqual(loaded?.windows.first?.sidebar.selection, .tabs) + } + + func testLoadRejectsSchemaVersionMismatch() { + let tempDir = FileManager.default.temporaryDirectory + .appendingPathComponent("cmux-session-tests-\(UUID().uuidString)", isDirectory: true) + try? FileManager.default.createDirectory(at: tempDir, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: tempDir) } + + let snapshotURL = tempDir.appendingPathComponent("session.json", isDirectory: false) + XCTAssertTrue(SessionPersistenceStore.save(makeSnapshot(version: SessionSnapshotSchema.currentVersion + 1), fileURL: snapshotURL)) + + XCTAssertNil(SessionPersistenceStore.load(fileURL: snapshotURL)) + } + + func testDefaultSnapshotPathSanitizesBundleIdentifier() { + let tempDir = FileManager.default.temporaryDirectory + .appendingPathComponent("cmux-session-tests-\(UUID().uuidString)", isDirectory: true) + try? FileManager.default.createDirectory(at: tempDir, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: tempDir) } + + let path = SessionPersistenceStore.defaultSnapshotFileURL( + bundleIdentifier: "com.example/unsafe id", + appSupportDirectory: tempDir + ) + + XCTAssertNotNil(path) + XCTAssertTrue(path?.path.contains("com.example_unsafe_id") == true) + } + + func testRestorePolicySkipsWhenLaunchHasExplicitArguments() { + let shouldRestore = SessionRestorePolicy.shouldAttemptRestore( + arguments: ["/Applications/cmux.app/Contents/MacOS/cmux", "--window", "window:1"], + environment: [:] + ) + + XCTAssertFalse(shouldRestore) + } + + func testRestorePolicyAllowsFinderStyleLaunchArgumentsOnly() { + let shouldRestore = SessionRestorePolicy.shouldAttemptRestore( + arguments: ["/Applications/cmux.app/Contents/MacOS/cmux", "-psn_0_12345"], + environment: [:] + ) + + XCTAssertTrue(shouldRestore) + } + + func testRestorePolicySkipsWhenRunningUnderXCTest() { + let shouldRestore = SessionRestorePolicy.shouldAttemptRestore( + arguments: ["/Applications/cmux.app/Contents/MacOS/cmux"], + environment: ["XCTestConfigurationFilePath": "/tmp/xctest.xctestconfiguration"] + ) + + XCTAssertFalse(shouldRestore) + } + + func testSidebarWidthSanitizationClampsToPolicyRange() { + XCTAssertEqual( + SessionPersistencePolicy.sanitizedSidebarWidth(-20), + SessionPersistencePolicy.minimumSidebarWidth, + accuracy: 0.001 + ) + XCTAssertEqual( + SessionPersistencePolicy.sanitizedSidebarWidth(10_000), + SessionPersistencePolicy.maximumSidebarWidth, + accuracy: 0.001 + ) + XCTAssertEqual( + SessionPersistencePolicy.sanitizedSidebarWidth(nil), + SessionPersistencePolicy.defaultSidebarWidth, + accuracy: 0.001 + ) + } + + func testScrollbackReplayEnvironmentWritesReplayFile() { + let tempDir = FileManager.default.temporaryDirectory + .appendingPathComponent("cmux-scrollback-replay-\(UUID().uuidString)", isDirectory: true) + try? FileManager.default.createDirectory(at: tempDir, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: tempDir) } + + let environment = SessionScrollbackReplayStore.replayEnvironment( + for: "line one\nline two\n", + tempDirectory: tempDir + ) + + let path = environment[SessionScrollbackReplayStore.environmentKey] + XCTAssertNotNil(path) + XCTAssertTrue(path?.hasPrefix(tempDir.path) == true) + + guard let path else { return } + let contents = try? String(contentsOfFile: path, encoding: .utf8) + XCTAssertEqual(contents, "line one\nline two\n") + } + + func testScrollbackReplayEnvironmentSkipsWhitespaceOnlyContent() { + let tempDir = FileManager.default.temporaryDirectory + .appendingPathComponent("cmux-scrollback-replay-\(UUID().uuidString)", isDirectory: true) + try? FileManager.default.createDirectory(at: tempDir, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: tempDir) } + + let environment = SessionScrollbackReplayStore.replayEnvironment( + for: " \n\t ", + tempDirectory: tempDir + ) + + XCTAssertTrue(environment.isEmpty) + } + + func testScrollbackReplayEnvironmentPreservesANSIColorSequences() { + let tempDir = FileManager.default.temporaryDirectory + .appendingPathComponent("cmux-scrollback-replay-\(UUID().uuidString)", isDirectory: true) + try? FileManager.default.createDirectory(at: tempDir, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: tempDir) } + + let red = "\u{001B}[31m" + let reset = "\u{001B}[0m" + let source = "\(red)RED\(reset)\n" + let environment = SessionScrollbackReplayStore.replayEnvironment( + for: source, + tempDirectory: tempDir + ) + + guard let path = environment[SessionScrollbackReplayStore.environmentKey] else { + XCTFail("Expected replay file path") + return + } + + guard let contents = try? String(contentsOfFile: path, encoding: .utf8) else { + XCTFail("Expected replay file contents") + return + } + + XCTAssertTrue(contents.contains("\(red)RED\(reset)")) + XCTAssertTrue(contents.hasPrefix(reset)) + XCTAssertTrue(contents.hasSuffix(reset)) + } + + func testTruncatedScrollbackAvoidsLeadingPartialANSICSISequence() { + let maxChars = SessionPersistencePolicy.maxScrollbackCharactersPerTerminal + let source = "\u{001B}[31m" + + String(repeating: "X", count: maxChars - 7) + + "\u{001B}[0m" + + guard let truncated = SessionPersistencePolicy.truncatedScrollback(source) else { + XCTFail("Expected truncated scrollback") + return + } + + XCTAssertFalse(truncated.hasPrefix("31m")) + XCTAssertFalse(truncated.hasPrefix("[31m")) + XCTAssertFalse(truncated.hasPrefix("m")) + } + + func testNormalizedExportedScreenPathAcceptsAbsoluteAndFileURL() { + XCTAssertEqual( + TerminalController.normalizedExportedScreenPath("/tmp/cmux-screen.txt"), + "/tmp/cmux-screen.txt" + ) + XCTAssertEqual( + TerminalController.normalizedExportedScreenPath(" file:///tmp/cmux-screen.txt "), + "/tmp/cmux-screen.txt" + ) + } + + func testNormalizedExportedScreenPathRejectsRelativeAndWhitespace() { + XCTAssertNil(TerminalController.normalizedExportedScreenPath("relative/path.txt")) + XCTAssertNil(TerminalController.normalizedExportedScreenPath(" ")) + XCTAssertNil(TerminalController.normalizedExportedScreenPath(nil)) + } + + func testShouldRemoveExportedScreenDirectoryOnlyWithinTemporaryRoot() { + let tempRoot = URL(fileURLWithPath: "/tmp") + .appendingPathComponent("cmux-export-tests-\(UUID().uuidString)", isDirectory: true) + let tempFile = tempRoot + .appendingPathComponent(UUID().uuidString, isDirectory: true) + .appendingPathComponent("screen.txt", isDirectory: false) + let outsideFile = URL(fileURLWithPath: "/Users/example/screen.txt") + + XCTAssertTrue( + TerminalController.shouldRemoveExportedScreenDirectory( + fileURL: tempFile, + temporaryDirectory: tempRoot + ) + ) + XCTAssertFalse( + TerminalController.shouldRemoveExportedScreenDirectory( + fileURL: outsideFile, + temporaryDirectory: tempRoot + ) + ) + } + + func testWindowUnregisterSnapshotPersistencePolicy() { + XCTAssertTrue( + AppDelegate.shouldPersistSnapshotOnWindowUnregister(isTerminatingApp: false) + ) + XCTAssertFalse( + AppDelegate.shouldPersistSnapshotOnWindowUnregister(isTerminatingApp: true) + ) + } + + func testResolvedWindowFramePrefersSavedDisplayIdentity() { + let savedFrame = SessionRectSnapshot(x: 1_200, y: 100, width: 600, height: 400) + let savedDisplay = SessionDisplaySnapshot( + displayID: 2, + frame: SessionRectSnapshot(x: 1_000, y: 0, width: 1_000, height: 800), + visibleFrame: SessionRectSnapshot(x: 1_000, y: 0, width: 1_000, height: 800) + ) + + // Display 1 and 2 swapped horizontal positions between snapshot and restore. + let display1 = AppDelegate.SessionDisplayGeometry( + displayID: 1, + frame: CGRect(x: 1_000, y: 0, width: 1_000, height: 800), + visibleFrame: CGRect(x: 1_000, y: 0, width: 1_000, height: 800) + ) + let display2 = AppDelegate.SessionDisplayGeometry( + displayID: 2, + frame: CGRect(x: 0, y: 0, width: 1_000, height: 800), + visibleFrame: CGRect(x: 0, y: 0, width: 1_000, height: 800) + ) + + let restored = AppDelegate.resolvedWindowFrame( + from: savedFrame, + display: savedDisplay, + availableDisplays: [display1, display2], + fallbackDisplay: display1 + ) + + XCTAssertNotNil(restored) + guard let restored else { return } + XCTAssertTrue(display2.visibleFrame.intersects(restored)) + XCTAssertFalse(display1.visibleFrame.intersects(restored)) + XCTAssertEqual(restored.width, 600, accuracy: 0.001) + XCTAssertEqual(restored.height, 400, accuracy: 0.001) + XCTAssertEqual(restored.minX, 200, accuracy: 0.001) + XCTAssertEqual(restored.minY, 100, accuracy: 0.001) + } + + func testResolvedWindowFrameKeepsIntersectingFrameWithoutDisplayMetadata() { + let savedFrame = SessionRectSnapshot(x: 120, y: 80, width: 500, height: 350) + let display = AppDelegate.SessionDisplayGeometry( + displayID: 1, + frame: CGRect(x: 0, y: 0, width: 1_000, height: 800), + visibleFrame: CGRect(x: 0, y: 0, width: 1_000, height: 800) + ) + + let restored = AppDelegate.resolvedWindowFrame( + from: savedFrame, + display: nil, + availableDisplays: [display], + fallbackDisplay: display + ) + + XCTAssertNotNil(restored) + guard let restored else { return } + XCTAssertEqual(restored.minX, 120, accuracy: 0.001) + XCTAssertEqual(restored.minY, 80, accuracy: 0.001) + XCTAssertEqual(restored.width, 500, accuracy: 0.001) + XCTAssertEqual(restored.height, 350, accuracy: 0.001) + } + + func testResolvedWindowFrameCentersInFallbackDisplayWhenOffscreen() { + let savedFrame = SessionRectSnapshot(x: 4_000, y: 4_000, width: 900, height: 700) + let display = AppDelegate.SessionDisplayGeometry( + displayID: 1, + frame: CGRect(x: 0, y: 0, width: 1_000, height: 800), + visibleFrame: CGRect(x: 0, y: 0, width: 1_000, height: 800) + ) + + let restored = AppDelegate.resolvedWindowFrame( + from: savedFrame, + display: nil, + availableDisplays: [display], + fallbackDisplay: display + ) + + XCTAssertNotNil(restored) + guard let restored else { return } + XCTAssertTrue(display.visibleFrame.contains(restored)) + XCTAssertEqual(restored.minX, 50, accuracy: 0.001) + XCTAssertEqual(restored.minY, 50, accuracy: 0.001) + XCTAssertEqual(restored.width, 900, accuracy: 0.001) + XCTAssertEqual(restored.height, 700, accuracy: 0.001) + } + + func testResolvedSnapshotTerminalScrollbackPrefersCaptured() { + let resolved = Workspace.resolvedSnapshotTerminalScrollback( + capturedScrollback: "captured-value", + fallbackScrollback: "fallback-value" + ) + + XCTAssertEqual(resolved, "captured-value") + } + + func testResolvedSnapshotTerminalScrollbackFallsBackWhenCaptureMissing() { + let resolved = Workspace.resolvedSnapshotTerminalScrollback( + capturedScrollback: nil, + fallbackScrollback: "fallback-value" + ) + + XCTAssertEqual(resolved, "fallback-value") + } + + func testResolvedSnapshotTerminalScrollbackTruncatesFallback() { + let oversizedFallback = String( + repeating: "x", + count: SessionPersistencePolicy.maxScrollbackCharactersPerTerminal + 37 + ) + let resolved = Workspace.resolvedSnapshotTerminalScrollback( + capturedScrollback: nil, + fallbackScrollback: oversizedFallback + ) + + XCTAssertEqual( + resolved?.count, + SessionPersistencePolicy.maxScrollbackCharactersPerTerminal + ) + } + + private func makeSnapshot(version: Int) -> AppSessionSnapshot { + let workspace = SessionWorkspaceSnapshot( + processTitle: "Terminal", + customTitle: "Restored", + isPinned: true, + currentDirectory: "/tmp", + focusedPanelId: nil, + layout: .pane(SessionPaneLayoutSnapshot(panelIds: [], selectedPanelId: nil)), + panels: [], + statusEntries: [], + logEntries: [], + progress: nil, + gitBranch: nil + ) + + let tabManager = SessionTabManagerSnapshot( + selectedWorkspaceIndex: 0, + workspaces: [workspace] + ) + + let window = SessionWindowSnapshot( + frame: SessionRectSnapshot(x: 10, y: 20, width: 900, height: 700), + display: SessionDisplaySnapshot( + displayID: 42, + frame: SessionRectSnapshot(x: 0, y: 0, width: 1920, height: 1200), + visibleFrame: SessionRectSnapshot(x: 0, y: 25, width: 1920, height: 1175) + ), + tabManager: tabManager, + sidebar: SessionSidebarSnapshot(isVisible: true, selection: .tabs, width: 240) + ) + + return AppSessionSnapshot( + version: version, + createdAt: Date().timeIntervalSince1970, + windows: [window] + ) + } +} diff --git a/tests/test_session_restore_unfocused_workspace_multi_window_cycle.py b/tests/test_session_restore_unfocused_workspace_multi_window_cycle.py new file mode 100644 index 00000000..0f63b2b9 --- /dev/null +++ b/tests/test_session_restore_unfocused_workspace_multi_window_cycle.py @@ -0,0 +1,324 @@ +#!/usr/bin/env python3 +""" +Regression: unfocused workspace scrollback must persist across relaunchs in multi-window setups. +""" + +from __future__ import annotations + +import os +import plistlib +import re +import socket +import subprocess +import time +from pathlib import Path + +from cmux import cmux + + +def _bundle_id(app_path: Path) -> str: + info_path = app_path / "Contents" / "Info.plist" + if not info_path.exists(): + raise RuntimeError(f"Missing Info.plist at {info_path}") + with info_path.open("rb") as f: + info = plistlib.load(f) + bundle_id = str(info.get("CFBundleIdentifier", "")).strip() + if not bundle_id: + raise RuntimeError("Missing CFBundleIdentifier") + return bundle_id + + +def _snapshot_path(bundle_id: str) -> Path: + safe_bundle = re.sub(r"[^A-Za-z0-9._-]", "_", bundle_id) + return Path.home() / "Library/Application Support/cmux" / f"session-{safe_bundle}.json" + + +def _sanitize_tag_slug(raw: str) -> str: + cleaned = re.sub(r"[^a-z0-9]+", "-", (raw or "").strip().lower()) + cleaned = re.sub(r"-+", "-", cleaned).strip("-") + return cleaned or "agent" + + +def _socket_candidates(app_path: Path, preferred: Path) -> list[Path]: + candidates = [preferred] + app_name = app_path.stem + prefix = "cmux DEV " + if app_name.startswith(prefix): + tag = app_name[len(prefix):] + slug = _sanitize_tag_slug(tag) + candidates.append(Path(f"/tmp/cmux-debug-{slug}.sock")) + deduped: list[Path] = [] + seen: set[str] = set() + for candidate in candidates: + key = str(candidate) + if key in seen: + continue + seen.add(key) + deduped.append(candidate) + return deduped + + +def _socket_reachable(socket_path: Path) -> bool: + if not socket_path.exists(): + return False + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + try: + sock.settimeout(0.3) + sock.connect(str(socket_path)) + sock.sendall(b"ping\n") + data = sock.recv(1024) + return b"PONG" in data + except OSError: + return False + finally: + sock.close() + + +def _wait_for_socket(candidates: list[Path], timeout: float = 20.0) -> Path: + deadline = time.time() + timeout + while time.time() < deadline: + for candidate in candidates: + if _socket_reachable(candidate): + return candidate + time.sleep(0.2) + joined = ", ".join(str(path) for path in candidates) + raise RuntimeError(f"Socket did not become reachable: {joined}") + + +def _wait_for_socket_closed(socket_path: Path, timeout: float = 20.0) -> None: + deadline = time.time() + timeout + while time.time() < deadline: + if not _socket_reachable(socket_path): + return + time.sleep(0.2) + raise RuntimeError(f"Socket still reachable after quit: {socket_path}") + + +def _kill_existing(app_path: Path) -> None: + exe = app_path / "Contents" / "MacOS" / "cmux DEV" + subprocess.run(["pkill", "-f", str(exe)], capture_output=True, text=True) + time.sleep(1.0) + + +def _launch(app_path: Path, preferred_socket_path: Path) -> Path: + try: + preferred_socket_path.unlink() + except FileNotFoundError: + pass + subprocess.run( + [ + "open", + "-na", + str(app_path), + "--env", + f"CMUX_SOCKET_PATH={preferred_socket_path}", + "--env", + "CMUX_ALLOW_SOCKET_OVERRIDE=1", + ], + check=True, + ) + resolved_socket_path = _wait_for_socket(_socket_candidates(app_path, preferred_socket_path)) + time.sleep(1.5) + return resolved_socket_path + + +def _quit(bundle_id: str, socket_path: Path) -> None: + subprocess.run( + ["osascript", "-e", f'tell application id "{bundle_id}" to quit'], + capture_output=True, + text=True, + check=True, + ) + _wait_for_socket_closed(socket_path) + try: + socket_path.unlink() + except FileNotFoundError: + pass + time.sleep(0.8) + + +def _connect(socket_path: Path) -> cmux: + client = cmux(socket_path=str(socket_path)) + client.connect() + if not client.ping(): + raise RuntimeError("ping failed") + return client + + +def _read_scrollback(client: cmux) -> str: + return client._send_command("read_screen --scrollback") + + +def _wait_for_marker(client: cmux, marker: str, timeout: float = 8.0) -> bool: + deadline = time.time() + timeout + while time.time() < deadline: + if marker in _read_scrollback(client): + return True + time.sleep(0.25) + return False + + +def _consume_visible_markers(client: cmux, remaining: set[str], timeout: float = 4.0) -> None: + if not remaining: + return + deadline = time.time() + timeout + while time.time() < deadline and remaining: + text = _read_scrollback(client) + matched = [marker for marker in remaining if marker in text] + if matched: + for marker in matched: + remaining.discard(marker) + if not remaining: + return + time.sleep(0.25) + + +def _ensure_workspaces(client: cmux, count: int) -> None: + while len(client.list_workspaces()) < count: + client.new_workspace() + time.sleep(0.3) + + +def _list_windows(client: cmux) -> list[str]: + response = client._send_command("list_windows") + if response == "No windows": + return [] + window_ids: list[str] = [] + for line in response.splitlines(): + line = line.strip() + if not line: + continue + parts = line.lstrip("* ").split(" ", 2) + if len(parts) >= 2: + window_ids.append(parts[1]) + return window_ids + + +def _new_window(client: cmux) -> str: + response = client._send_command("new_window") + if not response.startswith("OK "): + raise RuntimeError(f"new_window failed: {response}") + return response.split(" ", 1)[1].strip() + + +def _focus_window(client: cmux, window_id: str) -> None: + response = client._send_command(f"focus_window {window_id}") + if response != "OK": + raise RuntimeError(f"focus_window failed for {window_id}: {response}") + + +def main() -> int: + app_path_str = os.environ.get("CMUX_APP_PATH", "").strip() + if not app_path_str: + print("SKIP: set CMUX_APP_PATH to a built cmux DEV .app path") + return 0 + app_path = Path(app_path_str) + if not app_path.exists(): + print(f"SKIP: CMUX_APP_PATH does not exist: {app_path}") + return 0 + + bundle_id = _bundle_id(app_path) + snapshot = _snapshot_path(bundle_id) + # Keep the override path short enough for Darwin's Unix socket path limit. + bundle_suffix = re.sub(r"[^A-Za-z0-9]", "", bundle_id)[-16:] or "bundle" + socket_path = Path(f"/tmp/cmux-mw-restore-{bundle_suffix}.sock") + + markers = { + "w1_ws0": "CMUX_MW_RESTORE_W1_WS0", + "w1_ws1": "CMUX_MW_RESTORE_W1_WS1", + "w2_ws0": "CMUX_MW_RESTORE_W2_WS0", + "w2_ws1": "CMUX_MW_RESTORE_W2_WS1", + } + failures: list[str] = [] + + _kill_existing(app_path) + snapshot.unlink(missing_ok=True) + + try: + # Launch 1: create 2 windows x 2 workspaces; write markers. + socket_path = _launch(app_path, socket_path) + client = _connect(socket_path) + try: + # Window 1 setup. + _ensure_workspaces(client, 2) + client.select_workspace(0) + client.send(f"echo {markers['w1_ws0']}\n") + if not _wait_for_marker(client, markers["w1_ws0"]): + failures.append("missing marker for window1 workspace0 during setup") + client.select_workspace(1) + client.send(f"echo {markers['w1_ws1']}\n") + if not _wait_for_marker(client, markers["w1_ws1"]): + failures.append("missing marker for window1 workspace1 during setup") + client.select_workspace(0) # leave workspace 1 unfocused in window 1 + + # Window 2 setup. + _new_window(client) + time.sleep(0.5) + _ensure_workspaces(client, 2) + client.select_workspace(0) + client.send(f"echo {markers['w2_ws0']}\n") + if not _wait_for_marker(client, markers["w2_ws0"]): + failures.append("missing marker for window2 workspace0 during setup") + client.select_workspace(1) + client.send(f"echo {markers['w2_ws1']}\n") + if not _wait_for_marker(client, markers["w2_ws1"]): + failures.append("missing marker for window2 workspace1 during setup") + client.select_workspace(0) # leave workspace 1 unfocused in window 2 + finally: + client.close() + _quit(bundle_id, socket_path) + + # Launch 2: immediate quit without focusing unfocused workspaces. + socket_path = _launch(app_path, socket_path) + client = _connect(socket_path) + try: + window_ids = _list_windows(client) + if len(window_ids) < 2: + failures.append(f"expected >=2 windows after first relaunch, got {len(window_ids)}") + finally: + client.close() + _quit(bundle_id, socket_path) + + # Launch 3: verify all markers still present across windows/workspaces. + socket_path = _launch(app_path, socket_path) + client = _connect(socket_path) + try: + window_ids = _list_windows(client) + if len(window_ids) < 2: + failures.append(f"expected >=2 windows after second relaunch, got {len(window_ids)}") + + remaining = set(markers.values()) + for window_id in window_ids: + _focus_window(client, window_id) + time.sleep(0.3) + workspace_count = len(client.list_workspaces()) + for idx in range(min(workspace_count, 2)): + client.select_workspace(idx) + _consume_visible_markers(client, remaining, timeout=6.0) + if not remaining: + break + if not remaining: + break + + if remaining: + failures.append(f"missing markers after second relaunch: {sorted(remaining)}") + finally: + client.close() + _quit(bundle_id, socket_path) + finally: + _kill_existing(app_path) + socket_path.unlink(missing_ok=True) + snapshot.unlink(missing_ok=True) + + if failures: + print("FAIL:") + for failure in failures: + print(f"- {failure}") + return 1 + + print("PASS: multi-window unfocused workspaces survive repeated relaunch") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_session_restore_unfocused_workspace_relaunch_cycle.py b/tests/test_session_restore_unfocused_workspace_relaunch_cycle.py new file mode 100644 index 00000000..87164820 --- /dev/null +++ b/tests/test_session_restore_unfocused_workspace_relaunch_cycle.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python3 +""" +Regression: unfocused restored workspaces must survive a second relaunch. + +Repro for the historical bug: +1) Launch and save workspaces with marker scrollback. +2) Relaunch, do not focus the non-selected workspaces, then quit again. +3) Relaunch and verify marker scrollback still exists for every workspace. +""" + +from __future__ import annotations + +import os +import plistlib +import re +import socket +import subprocess +import time +from pathlib import Path + +from cmux import cmux + + +def _bundle_id(app_path: Path) -> str: + info_path = app_path / "Contents" / "Info.plist" + if not info_path.exists(): + raise RuntimeError(f"Missing Info.plist at {info_path}") + with info_path.open("rb") as f: + info = plistlib.load(f) + bundle_id = str(info.get("CFBundleIdentifier", "")).strip() + if not bundle_id: + raise RuntimeError("Missing CFBundleIdentifier") + return bundle_id + + +def _snapshot_path(bundle_id: str) -> Path: + safe_bundle = re.sub(r"[^A-Za-z0-9._-]", "_", bundle_id) + return Path.home() / "Library/Application Support/cmux" / f"session-{safe_bundle}.json" + + +def _socket_reachable(socket_path: Path) -> bool: + if not socket_path.exists(): + return False + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + try: + sock.settimeout(0.3) + sock.connect(str(socket_path)) + sock.sendall(b"ping\n") + data = sock.recv(1024) + return b"PONG" in data + except OSError: + return False + finally: + sock.close() + + +def _wait_for_socket(socket_path: Path, timeout: float = 20.0) -> None: + deadline = time.time() + timeout + while time.time() < deadline: + if _socket_reachable(socket_path): + return + time.sleep(0.2) + raise RuntimeError(f"Socket did not become reachable: {socket_path}") + + +def _wait_for_socket_closed(socket_path: Path, timeout: float = 20.0) -> None: + deadline = time.time() + timeout + while time.time() < deadline: + if not _socket_reachable(socket_path): + return + time.sleep(0.2) + raise RuntimeError(f"Socket still reachable after quit: {socket_path}") + + +def _kill_existing(app_path: Path) -> None: + exe = app_path / "Contents" / "MacOS" / "cmux DEV" + subprocess.run(["pkill", "-f", str(exe)], capture_output=True, text=True) + time.sleep(1.0) + + +def _launch(app_path: Path, socket_path: Path) -> None: + try: + socket_path.unlink() + except FileNotFoundError: + pass + subprocess.run( + [ + "open", + "-na", + str(app_path), + "--env", + f"CMUX_SOCKET_PATH={socket_path}", + "--env", + "CMUX_ALLOW_SOCKET_OVERRIDE=1", + ], + check=True, + ) + _wait_for_socket(socket_path) + time.sleep(1.5) + + +def _quit(bundle_id: str, socket_path: Path) -> None: + subprocess.run( + ["osascript", "-e", f'tell application id "{bundle_id}" to quit'], + capture_output=True, + text=True, + check=True, + ) + _wait_for_socket_closed(socket_path) + try: + socket_path.unlink() + except FileNotFoundError: + pass + time.sleep(0.8) + + +def _connect(socket_path: Path) -> cmux: + client = cmux(socket_path=str(socket_path)) + client.connect() + if not client.ping(): + raise RuntimeError("ping failed") + return client + + +def _read_scrollback(client: cmux) -> str: + return client._send_command("read_screen --scrollback") + + +def _wait_for_marker(client: cmux, marker: str, timeout: float = 8.0) -> bool: + deadline = time.time() + timeout + while time.time() < deadline: + if marker in _read_scrollback(client): + return True + time.sleep(0.25) + return False + + +def main() -> int: + app_path_str = os.environ.get("CMUX_APP_PATH", "").strip() + if not app_path_str: + print("SKIP: set CMUX_APP_PATH to a built cmux DEV .app path") + return 0 + app_path = Path(app_path_str) + if not app_path.exists(): + print(f"SKIP: CMUX_APP_PATH does not exist: {app_path}") + return 0 + + bundle_id = _bundle_id(app_path) + snapshot = _snapshot_path(bundle_id) + socket_path = Path(f"/tmp/cmux-session-restore-cycle-{bundle_id.replace('.', '-')}.sock") + + markers = [f"CMUX_RESTORE_EDGE_{i}" for i in range(3)] + failures: list[str] = [] + + _kill_existing(app_path) + snapshot.unlink(missing_ok=True) + + try: + # First launch: seed three workspaces with marker scrollback. + _launch(app_path, socket_path) + client = _connect(socket_path) + try: + while len(client.list_workspaces()) < 3: + client.new_workspace() + time.sleep(0.3) + + for idx, marker in enumerate(markers): + client.select_workspace(idx) + time.sleep(0.4) + client.send(f"echo {marker}\n") + if not _wait_for_marker(client, marker, timeout=6.0): + failures.append(f"setup marker missing in workspace {idx}: {marker}") + + # Keep selected workspace deterministic. + client.select_workspace(1) + time.sleep(0.3) + finally: + client.close() + _quit(bundle_id, socket_path) + + # Second launch: do not focus unfocused workspaces. Quit immediately. + _launch(app_path, socket_path) + client = _connect(socket_path) + try: + restored = client.list_workspaces() + if len(restored) < 3: + failures.append(f"expected >=3 workspaces after first relaunch, got {len(restored)}") + selected_indices = [idx for idx, _wid, _title, selected in restored if selected] + if selected_indices != [1]: + failures.append(f"expected selected workspace index [1], got {selected_indices}") + finally: + client.close() + _quit(bundle_id, socket_path) + + # Third launch: every workspace should still contain its marker. + _launch(app_path, socket_path) + client = _connect(socket_path) + try: + restored = client.list_workspaces() + if len(restored) < 3: + failures.append(f"expected >=3 workspaces after second relaunch, got {len(restored)}") + + for idx, marker in enumerate(markers): + client.select_workspace(idx) + if not _wait_for_marker(client, marker, timeout=8.0): + tail = "\n".join(_read_scrollback(client).splitlines()[-10:]) + failures.append( + f"workspace {idx} missing marker {marker} after second relaunch; tail:\n{tail}" + ) + finally: + client.close() + _quit(bundle_id, socket_path) + finally: + _kill_existing(app_path) + socket_path.unlink(missing_ok=True) + snapshot.unlink(missing_ok=True) + + if failures: + print("FAIL:") + for failure in failures: + print(f"- {failure}") + return 1 + + print("PASS: unfocused workspace scrollback survives repeated relaunch") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_shell_scrollback_restore_color_replay.py b/tests/test_shell_scrollback_restore_color_replay.py new file mode 100644 index 00000000..fed1088e --- /dev/null +++ b/tests/test_shell_scrollback_restore_color_replay.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +""" +Regression: ANSI color escape bytes in replay content must be preserved. +""" + +from __future__ import annotations + +import os +import shutil +import subprocess +from pathlib import Path + + +def main() -> int: + root = Path(__file__).resolve().parents[1] + integration_script = root / "Resources" / "shell-integration" / "cmux-zsh-integration.zsh" + if not integration_script.exists(): + print(f"SKIP: missing zsh integration script at {integration_script}") + return 0 + + base = Path("/tmp") / f"cmux_scrollback_color_replay_{os.getpid()}" + try: + shutil.rmtree(base, ignore_errors=True) + base.mkdir(parents=True, exist_ok=True) + + replay_file = base / "replay.bin" + replay_file.write_bytes(b"\x1b[31mRED\x1b[0m\n") + + env = dict(os.environ) + env["PATH"] = str(base / "empty-bin") + env["CMUX_RESTORE_SCROLLBACK_FILE"] = str(replay_file) + env["CMUX_TEST_INTEGRATION_SCRIPT"] = str(integration_script) + + result = subprocess.run( + ["/bin/zsh", "-f", "-c", 'source "$CMUX_TEST_INTEGRATION_SCRIPT"'], + env=env, + capture_output=True, + timeout=5, + ) + if result.returncode != 0: + print(f"FAIL: zsh exited non-zero rc={result.returncode}") + if result.stderr: + print(result.stderr.decode("utf-8", errors="replace").strip()) + return 1 + + output = (result.stdout or b"") + (result.stderr or b"") + if b"\x1b[31mRED\x1b[0m" not in output: + print("FAIL: ANSI color escape sequence not preserved in replay output") + return 1 + + if replay_file.exists(): + print("FAIL: replay file was not deleted after replay") + return 1 + + print("PASS: ANSI color escape sequence preserved during replay") + return 0 + finally: + shutil.rmtree(base, ignore_errors=True) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_shell_scrollback_restore_replay_path_regression.py b/tests/test_shell_scrollback_restore_replay_path_regression.py new file mode 100644 index 00000000..2f7d549e --- /dev/null +++ b/tests/test_shell_scrollback_restore_replay_path_regression.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +""" +Regression: scrollback replay must not depend on PATH containing coreutils. + +cmux can launch shells with PATH initially pointing at app resources. If replay +relies on bare `cat`/`rm`, startup replay silently fails before user rc files +restore PATH. +""" + +from __future__ import annotations + +import os +import shutil +import subprocess +from pathlib import Path + + +def main() -> int: + root = Path(__file__).resolve().parents[1] + integration_script = root / "Resources" / "shell-integration" / "cmux-zsh-integration.zsh" + if not integration_script.exists(): + print(f"SKIP: missing zsh integration script at {integration_script}") + return 0 + + base = Path("/tmp") / f"cmux_scrollback_restore_{os.getpid()}" + try: + shutil.rmtree(base, ignore_errors=True) + base.mkdir(parents=True, exist_ok=True) + + replay_file = base / "replay.txt" + replay_file.write_text("scrollback-line-1\nscrollback-line-2\n", encoding="utf-8") + + env = dict(os.environ) + env["PATH"] = str(base / "empty-bin") + env["CMUX_RESTORE_SCROLLBACK_FILE"] = str(replay_file) + env["CMUX_TEST_INTEGRATION_SCRIPT"] = str(integration_script) + + result = subprocess.run( + ["/bin/zsh", "-f", "-c", 'source "$CMUX_TEST_INTEGRATION_SCRIPT"'], + env=env, + capture_output=True, + text=True, + timeout=5, + ) + if result.returncode != 0: + print(f"FAIL: zsh exited non-zero rc={result.returncode}") + if result.stderr.strip(): + print(result.stderr.strip()) + return 1 + + output = (result.stdout or "") + (result.stderr or "") + if "scrollback-line-1" not in output or "scrollback-line-2" not in output: + print("FAIL: replay text was not printed during integration startup") + return 1 + + if replay_file.exists(): + print("FAIL: replay file was not deleted after replay") + return 1 + + print("PASS: scrollback replay works with minimal PATH") + return 0 + finally: + shutil.rmtree(base, ignore_errors=True) + + +if __name__ == "__main__": + raise SystemExit(main()) From f7457055f11cf015c0fd082b08bcb5eaf0c3e08e Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 16:06:32 -0800 Subject: [PATCH 067/214] Add sidebar metadata CLI subcommands and API docs (#305) * Add sidebar metadata CLI subcommands and API docs Expose set-status, clear-status, list-status, set-progress, clear-progress, log, clear-log, list-log, and sidebar-state as proper CLI subcommands with --help support and usage() listing. Previously these only existed as raw socket commands. Also adds a "Sidebar metadata commands" section to the docs site API reference page. * Quote multi-word values in socket command strings Fix set-progress --label and log message forwarding to properly quote values before sending to the socket tokenizer. Without quoting, multi-word labels like "Build step one" would be split into separate tokens. Also quote --source values for consistency. * Fix socket quoting: escape backslashes and quote status values Add socketQuote() helper that escapes both backslashes and double quotes before wrapping in quotes. Apply it to: - set-status value (prevents --flags in values being parsed as options) - set-status --icon and --color values - set-progress --label - log --source and message text Fixes values like "pytest --maxfail=1" or "C:\new\build" being mangled by the socket tokenizer. * Escape newlines in socketQuote to prevent socket framing breakage The socket protocol uses newline as message terminator, so embedded newlines/carriage returns in values would truncate the command. * Parse flags before positionals in set-status, clear-status, set-progress Fixes flags-first invocation like `cmux set-status --workspace workspace:2 build compiling` which previously grabbed `--workspace` as the key. Now all flags are extracted first, then positional args are validated. --- CLI/cmux.swift | 253 ++++++++++++++++++++++++++++++++++++++ web/app/docs/api/page.tsx | 70 ++++++++++- 2 files changed, 322 insertions(+), 1 deletion(-) diff --git a/CLI/cmux.swift b/CLI/cmux.swift index c7d6b8d6..3d3daf92 100644 --- a/CLI/cmux.swift +++ b/CLI/cmux.swift @@ -1105,6 +1105,109 @@ struct CMUXCLI { case "claude-hook": try runClaudeHook(commandArgs: commandArgs, client: client) + case "set-status": + let (icon, r1) = parseOption(commandArgs, name: "--icon") + let (color, r2) = parseOption(r1, name: "--color") + let (wsFlag, r3) = parseOption(r2, name: "--workspace") + guard r3.count >= 2 else { + throw CLIError(message: "set-status requires <key> and <value>") + } + let key = r3[0] + let value = r3.dropFirst().joined(separator: " ") + guard !value.isEmpty else { + throw CLIError(message: "set-status requires a non-empty value") + } + let workspaceArg = wsFlag ?? (windowId == nil ? ProcessInfo.processInfo.environment["CMUX_WORKSPACE_ID"] : nil) + let wsId = try resolveWorkspaceId(workspaceArg, client: client) + var socketCmd = "set_status \(key) \(socketQuote(value))" + if let icon { socketCmd += " --icon=\(socketQuote(icon))" } + if let color { socketCmd += " --color=\(socketQuote(color))" } + socketCmd += " --tab=\(wsId)" + let response = try sendV1Command(socketCmd, client: client) + print(response) + + case "clear-status": + let (wsFlag, csRemaining) = parseOption(commandArgs, name: "--workspace") + guard let key = csRemaining.first else { + throw CLIError(message: "clear-status requires a <key>") + } + let workspaceArg = wsFlag ?? (windowId == nil ? ProcessInfo.processInfo.environment["CMUX_WORKSPACE_ID"] : nil) + let wsId = try resolveWorkspaceId(workspaceArg, client: client) + let response = try sendV1Command("clear_status \(key) --tab=\(wsId)", client: client) + print(response) + + case "list-status": + let (wsFlag, _) = parseOption(commandArgs, name: "--workspace") + let workspaceArg = wsFlag ?? (windowId == nil ? ProcessInfo.processInfo.environment["CMUX_WORKSPACE_ID"] : nil) + let wsId = try resolveWorkspaceId(workspaceArg, client: client) + let response = try sendV1Command("list_status --tab=\(wsId)", client: client) + print(response) + + case "set-progress": + let (label, spR1) = parseOption(commandArgs, name: "--label") + let (wsFlag, spR2) = parseOption(spR1, name: "--workspace") + guard let valueStr = spR2.first else { + throw CLIError(message: "set-progress requires a progress value (0.0-1.0)") + } + let workspaceArg = wsFlag ?? (windowId == nil ? ProcessInfo.processInfo.environment["CMUX_WORKSPACE_ID"] : nil) + let wsId = try resolveWorkspaceId(workspaceArg, client: client) + var socketCmd = "set_progress \(valueStr)" + if let label { socketCmd += " --label=\(socketQuote(label))" } + socketCmd += " --tab=\(wsId)" + let response = try sendV1Command(socketCmd, client: client) + print(response) + + case "clear-progress": + let (wsFlag, _) = parseOption(commandArgs, name: "--workspace") + let workspaceArg = wsFlag ?? (windowId == nil ? ProcessInfo.processInfo.environment["CMUX_WORKSPACE_ID"] : nil) + let wsId = try resolveWorkspaceId(workspaceArg, client: client) + let response = try sendV1Command("clear_progress --tab=\(wsId)", client: client) + print(response) + + case "log": + let (level, r1) = parseOption(commandArgs, name: "--level") + let (source, r2) = parseOption(r1, name: "--source") + let (wsFlag, r3) = parseOption(r2, name: "--workspace") + // Strip leading "--" separator if present + let positional = r3.first == "--" ? Array(r3.dropFirst()) : r3 + let message = positional.joined(separator: " ") + guard !message.isEmpty else { + throw CLIError(message: "log requires a message") + } + let workspaceArg = wsFlag ?? (windowId == nil ? ProcessInfo.processInfo.environment["CMUX_WORKSPACE_ID"] : nil) + let wsId = try resolveWorkspaceId(workspaceArg, client: client) + var socketCmd = "log" + if let level { socketCmd += " --level=\(level)" } + if let source { socketCmd += " --source=\(socketQuote(source))" } + socketCmd += " --tab=\(wsId) -- \(socketQuote(message))" + let response = try sendV1Command(socketCmd, client: client) + print(response) + + case "clear-log": + let (wsFlag, _) = parseOption(commandArgs, name: "--workspace") + let workspaceArg = wsFlag ?? (windowId == nil ? ProcessInfo.processInfo.environment["CMUX_WORKSPACE_ID"] : nil) + let wsId = try resolveWorkspaceId(workspaceArg, client: client) + let response = try sendV1Command("clear_log --tab=\(wsId)", client: client) + print(response) + + case "list-log": + let (limitStr, r1) = parseOption(commandArgs, name: "--limit") + let (wsFlag, _) = parseOption(r1, name: "--workspace") + let workspaceArg = wsFlag ?? (windowId == nil ? ProcessInfo.processInfo.environment["CMUX_WORKSPACE_ID"] : nil) + let wsId = try resolveWorkspaceId(workspaceArg, client: client) + var socketCmd = "list_log" + if let limitStr { socketCmd += " --limit=\(limitStr)" } + socketCmd += " --tab=\(wsId)" + let response = try sendV1Command(socketCmd, client: client) + print(response) + + case "sidebar-state": + let (wsFlag, _) = parseOption(commandArgs, name: "--workspace") + let workspaceArg = wsFlag ?? (windowId == nil ? ProcessInfo.processInfo.environment["CMUX_WORKSPACE_ID"] : nil) + let wsId = try resolveWorkspaceId(workspaceArg, client: client) + let response = try sendV1Command("sidebar_state --tab=\(wsId)", client: client) + print(response) + case "set-app-focus": guard let value = commandArgs.first else { throw CLIError(message: "set-app-focus requires a value") } let response = try sendV1Command("set_app_focus \(value)", client: client) @@ -3453,6 +3556,130 @@ struct CMUXCLI { cmux notify --title "Build done" --body "All tests passed" cmux notify --title "Error" --subtitle "test.swift" --body "Line 42: syntax error" """ + case "set-status": + return """ + Usage: cmux set-status <key> <value> [flags] + + Set a sidebar status entry for a workspace. Status entries appear as + pills in the sidebar tab row. Use a unique key so different tools + (e.g. "claude_code", "build") can manage their own entries. + + Flags: + --icon <name> Icon name (e.g. "sparkle", "hammer") + --color <#hex> Pill color (e.g. "#ff9500") + --workspace <id|ref> Target workspace (default: $CMUX_WORKSPACE_ID) + + Example: + cmux set-status build "compiling" --icon hammer --color "#ff9500" + cmux set-status deploy "v1.2.3" --workspace workspace:2 + """ + case "clear-status": + return """ + Usage: cmux clear-status <key> [flags] + + Remove a sidebar status entry by key. + + Flags: + --workspace <id|ref> Target workspace (default: $CMUX_WORKSPACE_ID) + + Example: + cmux clear-status build + """ + case "list-status": + return """ + Usage: cmux list-status [flags] + + List all sidebar status entries for a workspace. + + Flags: + --workspace <id|ref> Target workspace (default: $CMUX_WORKSPACE_ID) + + Example: + cmux list-status + cmux list-status --workspace workspace:2 + """ + case "set-progress": + return """ + Usage: cmux set-progress <0.0-1.0> [flags] + + Set a progress bar in the sidebar for a workspace. + + Flags: + --label <text> Label shown next to the progress bar + --workspace <id|ref> Target workspace (default: $CMUX_WORKSPACE_ID) + + Example: + cmux set-progress 0.5 --label "Building..." + cmux set-progress 1.0 --label "Done" + """ + case "clear-progress": + return """ + Usage: cmux clear-progress [flags] + + Clear the sidebar progress bar for a workspace. + + Flags: + --workspace <id|ref> Target workspace (default: $CMUX_WORKSPACE_ID) + + Example: + cmux clear-progress + """ + case "log": + return """ + Usage: cmux log [flags] [--] <message> + + Append a log entry to the sidebar for a workspace. + + Flags: + --level <level> Log level: info, progress, success, warning, error (default: info) + --source <name> Source label (e.g. "build", "test") + --workspace <id|ref> Target workspace (default: $CMUX_WORKSPACE_ID) + + Example: + cmux log "Build started" + cmux log --level error --source build "Compilation failed" + cmux log --level success -- "All 42 tests passed" + """ + case "clear-log": + return """ + Usage: cmux clear-log [flags] + + Clear all sidebar log entries for a workspace. + + Flags: + --workspace <id|ref> Target workspace (default: $CMUX_WORKSPACE_ID) + + Example: + cmux clear-log + """ + case "list-log": + return """ + Usage: cmux list-log [flags] + + List sidebar log entries for a workspace. + + Flags: + --limit <n> Show only the last N entries + --workspace <id|ref> Target workspace (default: $CMUX_WORKSPACE_ID) + + Example: + cmux list-log + cmux list-log --limit 5 + """ + case "sidebar-state": + return """ + Usage: cmux sidebar-state [flags] + + Dump all sidebar metadata for a workspace (cwd, git branch, ports, + status entries, progress, log entries). + + Flags: + --workspace <id|ref> Target workspace (default: $CMUX_WORKSPACE_ID) + + Example: + cmux sidebar-state + cmux sidebar-state --workspace workspace:2 + """ case "claude-hook": return """ Usage: cmux claude-hook <session-start|stop|notification> [flags] @@ -3515,6 +3742,20 @@ struct CMUXCLI { return true } + /// Escape and quote a string for safe embedding in a v1 socket command. + /// The socket tokenizer treats `\` and `"` as special inside quoted strings, + /// so both must be escaped before wrapping in double quotes. Newlines and + /// carriage returns must also be escaped since the socket protocol uses + /// newline as the message terminator. + private func socketQuote(_ s: String) -> String { + let escaped = s + .replacingOccurrences(of: "\\", with: "\\\\") + .replacingOccurrences(of: "\"", with: "\\\"") + .replacingOccurrences(of: "\n", with: "\\n") + .replacingOccurrences(of: "\r", with: "\\r") + return "\"\(escaped)\"" + } + private func parseOption(_ args: [String], name: String) -> (String?, [String]) { var remaining: [String] = [] var value: String? @@ -4721,6 +4962,18 @@ struct CMUXCLI { list-notifications clear-notifications claude-hook <session-start|stop|notification> [--workspace <id|ref>] [--surface <id|ref>] + + # sidebar metadata commands + set-status <key> <value> [--icon <name>] [--color <#hex>] [--workspace <id|ref>] + clear-status <key> [--workspace <id|ref>] + list-status [--workspace <id|ref>] + set-progress <0.0-1.0> [--label <text>] [--workspace <id|ref>] + clear-progress [--workspace <id|ref>] + log [--level <level>] [--source <name>] [--workspace <id|ref>] [--] <message> + clear-log [--workspace <id|ref>] + list-log [--limit <n>] [--workspace <id|ref>] + sidebar-state [--workspace <id|ref>] + set-app-focus <active|inactive|clear> simulate-app-active diff --git a/web/app/docs/api/page.tsx b/web/app/docs/api/page.tsx index 6f7322e7..bd24302b 100644 --- a/web/app/docs/api/page.tsx +++ b/web/app/docs/api/page.tsx @@ -5,7 +5,7 @@ import { Callout } from "../../components/callout"; export const metadata: Metadata = { title: "API Reference", description: - "cmux CLI and Unix socket API reference. Workspace management, split panes, input control, notifications, environment variables, and detection methods.", + "cmux CLI and Unix socket API reference. Workspace management, split panes, input control, notifications, sidebar metadata (status, progress, logs), environment variables, and detection methods.", }; function Cmd({ @@ -281,6 +281,74 @@ cmux list-notifications --json`} socket={`{"id":"notif-clear","method":"notification.clear","params":{}}`} /> + <h2>Sidebar metadata commands</h2> + <p> + Set status pills, progress bars, and log entries in the sidebar for any + workspace. Useful for build scripts, CI integrations, and AI coding + agents that want to surface state at a glance. + </p> + + <Cmd + name="set-status" + desc="Set a sidebar status pill. Use a unique key so different tools can manage their own entries." + cli={`cmux set-status build "compiling" --icon hammer --color "#ff9500" +cmux set-status deploy "v1.2.3" --workspace workspace:2`} + socket={`set_status build compiling --icon=hammer --color=#ff9500 --tab=<workspace-uuid>`} + /> + <Cmd + name="clear-status" + desc="Remove a sidebar status entry by key." + cli={`cmux clear-status build`} + socket={`clear_status build --tab=<workspace-uuid>`} + /> + <Cmd + name="list-status" + desc="List all sidebar status entries for a workspace." + cli={`cmux list-status`} + socket={`list_status --tab=<workspace-uuid>`} + /> + <Cmd + name="set-progress" + desc="Set a progress bar in the sidebar (0.0 to 1.0)." + cli={`cmux set-progress 0.5 --label "Building..." +cmux set-progress 1.0 --label "Done"`} + socket={`set_progress 0.5 --label=Building... --tab=<workspace-uuid>`} + /> + <Cmd + name="clear-progress" + desc="Clear the sidebar progress bar." + cli={`cmux clear-progress`} + socket={`clear_progress --tab=<workspace-uuid>`} + /> + <Cmd + name="log" + desc="Append a log entry to the sidebar. Levels: info, progress, success, warning, error." + cli={`cmux log "Build started" +cmux log --level error --source build "Compilation failed" +cmux log --level success -- "All 42 tests passed"`} + socket={`log --level=error --source=build --tab=<workspace-uuid> -- Compilation failed`} + /> + <Cmd + name="clear-log" + desc="Clear all sidebar log entries." + cli={`cmux clear-log`} + socket={`clear_log --tab=<workspace-uuid>`} + /> + <Cmd + name="list-log" + desc="List sidebar log entries." + cli={`cmux list-log +cmux list-log --limit 5`} + socket={`list_log --limit=5 --tab=<workspace-uuid>`} + /> + <Cmd + name="sidebar-state" + desc="Dump all sidebar metadata (cwd, git branch, ports, status, progress, logs)." + cli={`cmux sidebar-state +cmux sidebar-state --workspace workspace:2`} + socket={`sidebar_state --tab=<workspace-uuid>`} + /> + <h2>Utility commands</h2> <Cmd From 8cbb7ea11909649ea808fda7a97fbf65172667eb Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 16:18:03 -0800 Subject: [PATCH 068/214] Remove terminal overlay static contract CI check --- .github/workflows/ci.yml | 9 ------ scripts/check-terminal-overlay-layering.sh | 36 ---------------------- 2 files changed, 45 deletions(-) delete mode 100755 scripts/check-terminal-overlay-layering.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d004f0a5..9e7bb8bc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,15 +7,6 @@ on: pull_request: jobs: - terminal-overlay-contract: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Enforce terminal overlay layering contract - run: ./scripts/check-terminal-overlay-layering.sh - web-typecheck: runs-on: ubuntu-latest defaults: diff --git a/scripts/check-terminal-overlay-layering.sh b/scripts/check-terminal-overlay-layering.sh deleted file mode 100755 index 6a7e9dde..00000000 --- a/scripts/check-terminal-overlay-layering.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -cd "$(dirname "$0")/.." - -allowed_a="Sources/Find/SurfaceSearchOverlay.swift" -allowed_b="Sources/GhosttyTerminalView.swift" -pattern='SurfaceSearchOverlay[[:space:]]*\(' - -if command -v rg >/dev/null 2>&1; then - matches="$( - rg -n --no-heading --glob '*.swift' "$pattern" Sources cmuxTests \ - | grep -v "^${allowed_a}:" \ - | grep -v "^${allowed_b}:" \ - || true - )" -else - matches="$( - grep -RIn --include='*.swift' -E "$pattern" Sources cmuxTests \ - | grep -v "^${allowed_a}:" \ - | grep -v "^${allowed_b}:" \ - || true - )" -fi - -if [[ -n "$matches" ]]; then - echo "Terminal overlay layering contract violation:" - echo "SurfaceSearchOverlay may only be instantiated in:" - echo " - ${allowed_a}" - echo " - ${allowed_b}" - echo - echo "$matches" - exit 1 -fi - -echo "OK: terminal overlay layering contract satisfied." From 716a97420c6c124f3fb4068a1d36abfad8d798f4 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 16:18:44 -0800 Subject: [PATCH 069/214] Add contributor credits to release skills (#319) Release changelogs now credit contributors inline (Bun-style): - Per-entry "thanks @user!" for community code contributions - Per-entry "thanks @user for the report!" for bug reporters - "Thanks to N contributors!" summary section at bottom of each release - Core team (lawrencecchen, austinywang) excluded from per-entry callouts --- .claude/commands/release-local.md | 34 +++++++++++++++++++- .claude/commands/release-nightly.md | 34 +++++++++++++++++++- .claude/commands/release.md | 49 ++++++++++++++++++++++++++--- skills/release/SKILL.md | 13 +++++++- 4 files changed, 122 insertions(+), 8 deletions(-) diff --git a/.claude/commands/release-local.md b/.claude/commands/release-local.md index 8aeea134..1e8dcff9 100644 --- a/.claude/commands/release-local.md +++ b/.claude/commands/release-local.md @@ -9,19 +9,29 @@ Full end-to-end release built locally. Bumps version, updates changelog, tags, t - Get the current version from `GhosttyTabs.xcodeproj/project.pbxproj` (look for `MARKETING_VERSION`) - Bump the minor version unless the user specifies otherwise (e.g., 0.54.0 → 0.55.0) -### 2. Gather changes since the last release +### 2. Gather changes and contributors since the last release - Find the most recent git tag: `git describe --tags --abbrev=0` - Get commits since that tag: `git log --oneline <last-tag>..HEAD --no-merges` - **Filter for end-user visible changes only** — ignore developer tooling, CI, docs, tests - Categorize changes into: Added, Changed, Fixed, Removed - If there are no user-facing changes, ask the user if they still want to release +- **Collect contributors:** For each PR referenced in the commits, get the author: + ```bash + gh pr view <N> --repo manaflow-ai/cmux --json author --jq '.author.login' + ``` +- Also check for linked issue reporters (the person who filed the bug): + ```bash + gh issue view <N> --repo manaflow-ai/cmux --json author --jq '.author.login' + ``` +- Build a deduplicated list of all contributor `@handle`s for the release ### 3. Update the changelog - Add a new section at the top of `CHANGELOG.md` with the new version and today's date - **Only include changes that affect the end-user experience** - Write clear, user-facing descriptions (not raw commit messages) +- **Credit contributors inline** (see Contributor Credits below) - Also update `docs-site/content/docs/changelog.mdx` if it exists ### 4. Bump the version @@ -72,3 +82,25 @@ If the script fails, run `say "cmux release failed"`. - Group by category: Added, Changed, Fixed, Removed - Be concise but descriptive - Focus on what the user experiences, not how it was implemented + +## Contributor Credits + +Credit the people who made each release happen. This builds community and encourages contributions. + +**Per-entry attribution** — append contributor credit after each changelog bullet: +- For code contributions (PR author): `— thanks @user!` +- For bug reports (issue reporter, if different from PR author): `— thanks @reporter for the report!` +- Core team (`lawrencecchen`, `austinywang`) contributions get no per-entry callout — core work is the baseline + +**Summary section** — add a "Thanks to N contributors!" section at the bottom of each release: +```markdown +### Thanks to N contributors! + +- [@user1](https://github.com/user1) +- [@user2](https://github.com/user2) +``` +- List all contributors alphabetically by GitHub handle (including core team) +- Link each handle to their GitHub profile +- Include everyone: PR authors, issue reporters, anyone whose work is in the release + +**GitHub Release body** — when the release is published, the GitHub Release should also include the "Thanks to N contributors!" section with linked handles. diff --git a/.claude/commands/release-nightly.md b/.claude/commands/release-nightly.md index c5ce83dc..36f1a8d2 100644 --- a/.claude/commands/release-nightly.md +++ b/.claude/commands/release-nightly.md @@ -13,16 +13,26 @@ End-to-end release via PR flow: bump version, update changelog, create PR, merge 2. **Create a release branch** - Create branch: `git checkout -b release/vX.Y.Z` -3. **Gather changes since the last release** +3. **Gather changes and contributors since the last release** - Find the most recent git tag: `git describe --tags --abbrev=0` - Get commits since that tag: `git log --oneline <last-tag>..HEAD --no-merges` - **Filter for end-user visible changes only** - ignore developer tooling, CI, docs, tests - Categorize changes into: Added, Changed, Fixed, Removed + - **Collect contributors:** For each PR referenced in the commits, get the author: + ```bash + gh pr view <N> --repo manaflow-ai/cmux --json author --jq '.author.login' + ``` + - Also check for linked issue reporters (the person who filed the bug): + ```bash + gh issue view <N> --repo manaflow-ai/cmux --json author --jq '.author.login' + ``` + - Build a deduplicated list of all contributor `@handle`s for the release 4. **Update the changelog** - Add a new section at the top of `CHANGELOG.md` with the new version and today's date - **Only include changes that affect the end-user experience** - Write clear, user-facing descriptions (not raw commit messages) + - **Credit contributors inline** (see Contributor Credits below) - Also update `docs-site/content/docs/changelog.mdx` if it exists - If there are no user-facing changes, ask the user if they still want to release @@ -73,3 +83,25 @@ If the script fails, run `say "cmux release failed"`. - Test additions or fixes - Internal refactoring with no user-visible effect - Dependency updates (unless they fix a user-facing bug) + +## Contributor Credits + +Credit the people who made each release happen. This builds community and encourages contributions. + +**Per-entry attribution** — append contributor credit after each changelog bullet: +- For code contributions (PR author): `— thanks @user!` +- For bug reports (issue reporter, if different from PR author): `— thanks @reporter for the report!` +- Core team (`lawrencecchen`, `austinywang`) contributions get no per-entry callout — core work is the baseline + +**Summary section** — add a "Thanks to N contributors!" section at the bottom of each release: +```markdown +### Thanks to N contributors! + +- [@user1](https://github.com/user1) +- [@user2](https://github.com/user2) +``` +- List all contributors alphabetically by GitHub handle (including core team) +- Link each handle to their GitHub profile +- Include everyone: PR authors, issue reporters, anyone whose work is in the release + +**GitHub Release body** — when the release is published, the GitHub Release should also include the "Thanks to N contributors!" section with linked handles. diff --git a/.claude/commands/release.md b/.claude/commands/release.md index 9ef7c00f..9903627d 100644 --- a/.claude/commands/release.md +++ b/.claude/commands/release.md @@ -11,16 +11,26 @@ Prepare a new release for cmux. This command updates the changelog, bumps the ve 2. **Create a release branch** - Create branch: `git checkout -b release/vX.Y.Z` -3. **Gather changes since the last release** +3. **Gather changes and contributors since the last release** - Find the most recent git tag: `git describe --tags --abbrev=0` - Get commits since that tag: `git log --oneline <last-tag>..HEAD --no-merges` - **Filter for end-user visible changes only** - ignore developer tooling, CI, docs, tests - Categorize changes into: Added, Changed, Fixed, Removed + - **Collect contributors:** For each PR referenced in the commits, get the author: + ```bash + gh pr view <N> --repo manaflow-ai/cmux --json author --jq '.author.login' + ``` + - Also check for linked issue reporters (the person who filed the bug): + ```bash + gh issue view <N> --repo manaflow-ai/cmux --json author --jq '.author.login' + ``` + - Build a deduplicated list of all contributor `@handle`s for the release 4. **Update the changelog** - Add a new section at the top of `CHANGELOG.md` with the new version and today's date - **Only include changes that affect the end-user experience** - things users will see, feel, or interact with - Write clear, user-facing descriptions (not raw commit messages) + - **Credit contributors inline** (see Contributor Credits below) - Also update `docs-site/content/docs/changelog.mdx` with the same content - If there are no user-facing changes, ask the user if they still want to release @@ -89,18 +99,47 @@ Prepare a new release for cmux. This command updates the changelog, bumps the ve - Focus on what the user experiences, not how it was implemented - Link to issues/PRs if relevant +## Contributor Credits + +Credit the people who made each release happen. This builds community and encourages contributions. + +**Per-entry attribution** — append contributor credit after each changelog bullet: +- For code contributions (PR author): `— thanks @user!` +- For bug reports (issue reporter, if different from PR author): `— thanks @reporter for the report!` +- Core team (`lawrencecchen`, `austinywang`) contributions get no per-entry callout — core work is the baseline + +**Summary section** — add a "Thanks to N contributors!" section at the bottom of each release: +```markdown +### Thanks to N contributors! + +- [@user1](https://github.com/user1) +- [@user2](https://github.com/user2) +``` +- List all contributors alphabetically by GitHub handle (including core team) +- Link each handle to their GitHub profile +- Include everyone: PR authors, issue reporters, anyone whose work is in the release + +**GitHub Release body** — when the release is published, the GitHub Release should also include the "Thanks to N contributors!" section with linked handles. + ## Example Changelog Entry ```markdown ## [0.13.0] - 2025-01-30 ### Added -- New keyboard shortcut for quick tab switching +- New keyboard shortcut for quick tab switching ([#42](https://github.com/manaflow-ai/cmux/pull/42)) — thanks @contributor! ### Fixed -- Memory leak when closing split panes -- Notification badges not clearing properly +- Memory leak when closing split panes ([#38](https://github.com/manaflow-ai/cmux/pull/38)) — thanks @fixer! +- Notification badges not clearing properly ([#35](https://github.com/manaflow-ai/cmux/pull/35)) — thanks @reporter for the report! ### Changed -- Improved terminal rendering performance +- Improved terminal rendering performance ([#40](https://github.com/manaflow-ai/cmux/pull/40)) + +### Thanks to 4 contributors! + +- [@contributor](https://github.com/contributor) +- [@fixer](https://github.com/fixer) +- [@lawrencechen](https://github.com/lawrencechen) +- [@reporter](https://github.com/reporter) ``` diff --git a/skills/release/SKILL.md b/skills/release/SKILL.md index 0f5cd1ff..9144e22b 100644 --- a/skills/release/SKILL.md +++ b/skills/release/SKILL.md @@ -16,15 +16,18 @@ Run this workflow to prepare and publish a cmux release. 2. Create a release branch: - `git checkout -b release/vX.Y.Z` -3. Gather user-facing changes since the last tag: +3. Gather user-facing changes and contributors since the last tag: - `git describe --tags --abbrev=0` - `git log --oneline <last-tag>..HEAD --no-merges` - Keep only end-user visible changes (features, bug fixes, UX/perf behavior). +- **Collect contributors:** For each PR, get the author with `gh pr view <N> --repo manaflow-ai/cmux --json author --jq '.author.login'`. Also check linked issue reporters with `gh issue view <N> --json author --jq '.author.login'`. +- Build a deduplicated list of all contributor `@handle`s. 4. Update changelogs: - Update `CHANGELOG.md`. - Update `docs-site/content/docs/changelog.mdx`. - Use categories `Added`, `Changed`, `Fixed`, `Removed`. +- **Credit contributors inline** (see Contributor Credits below). - If no user-facing changes exist, confirm with the user before continuing. 5. Bump app version metadata: @@ -63,3 +66,11 @@ Run this workflow to prepare and publish a cmux release. - Include only user-visible changes. - Exclude internal-only changes (CI, tests, docs-only edits, refactors without behavior changes). - Write concise user-facing bullets in present tense. + +## Contributor Credits + +Credit the people who made each release happen: + +- **Per-entry:** Append `— thanks @user!` for community code contributions. Use `— thanks @user for the report!` for bug reporters (when different from PR author). No callout for core team (`lawrencecchen`, `austinywang`) — core work is the baseline. +- **Summary:** Add a `### Thanks to N contributors!` section at the bottom of each release with an alphabetical list of all `[@handle](https://github.com/handle)` links (including core team). +- **GitHub Release body:** Include the same "Thanks to N contributors!" section with linked handles. From 07796232d7de28d97a8eab7c37a3721bcc561094 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 16:24:43 -0800 Subject: [PATCH 070/214] Sync customizable shortcuts across menus and tooltips --- Sources/AppDelegate.swift | 18 +++ Sources/ContentView.swift | 29 +++- Sources/KeyboardShortcutSettings.swift | 65 ++++++++ Sources/Panels/BrowserPanelView.swift | 2 +- Sources/WorkspaceContentView.swift | 77 +++++++--- Sources/cmuxApp.swift | 141 +++++++++++------- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 77 ++++++++++ 7 files changed, 329 insertions(+), 80 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 870bfaf8..a1a60972 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1912,6 +1912,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } + if matchShortcut(event: event, shortcut: KeyboardShortcutSettings.shortcut(for: .closeWorkspace)) { + tabManager?.closeCurrentWorkspaceWithConfirmation() + return true + } + // Numeric shortcuts for specific sidebar tabs: Cmd+1-9 (9 = last workspace) if flags == [.command], let manager = tabManager, @@ -3189,6 +3194,9 @@ final class MenuBarExtraController: NSObject, NSMenuDelegate { stateHintItem.title = snapshot.stateHintTitle + applyShortcut(KeyboardShortcutSettings.shortcut(for: .showNotifications), to: showNotificationsItem) + applyShortcut(KeyboardShortcutSettings.shortcut(for: .jumpToUnread), to: jumpToUnreadItem) + jumpToUnreadItem.isEnabled = snapshot.hasUnreadNotifications markAllReadItem.isEnabled = snapshot.hasUnreadNotifications clearAllItem.isEnabled = snapshot.hasNotifications @@ -3203,6 +3211,16 @@ final class MenuBarExtraController: NSObject, NSMenuDelegate { } } + private func applyShortcut(_ shortcut: StoredShortcut, to item: NSMenuItem) { + guard let keyEquivalent = shortcut.menuItemKeyEquivalent else { + item.keyEquivalent = "" + item.keyEquivalentModifierMask = [] + return + } + item.keyEquivalent = keyEquivalent + item.keyEquivalentModifierMask = shortcut.modifierFlags + } + private func rebuildInlineNotificationItems(recentNotifications: [TerminalNotification]) { for item in notificationItems { menu.removeItem(item) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 4ad00b12..470c5d81 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -2544,7 +2544,7 @@ private struct TabItemView: View { .foregroundColor(isActive ? .white.opacity(0.7) : .secondary) } .buttonStyle(.plain) - .help("Close Workspace (\(StoredShortcut(key: "w", command: true, shift: true, option: false, control: false).displayString))") + .help(KeyboardShortcutSettings.Action.closeWorkspace.tooltip("Close Workspace")) .frame(width: 16, height: 16, alignment: .center) .opacity(showCloseButton && !showsWorkspaceShortcutHint ? 1 : 0) .allowsHitTesting(showCloseButton && !showsWorkspaceShortcutHint) @@ -2772,6 +2772,8 @@ private struct TabItemView: View { let closeLabel = targetIds.count > 1 ? "Close Workspaces" : "Close Workspace" let markReadLabel = targetIds.count > 1 ? "Mark Workspaces as Read" : "Mark Workspace as Read" let markUnreadLabel = targetIds.count > 1 ? "Mark Workspaces as Unread" : "Mark Workspace as Unread" + let renameWorkspaceShortcut = KeyboardShortcutSettings.shortcut(for: .renameWorkspace) + let closeWorkspaceShortcut = KeyboardShortcutSettings.shortcut(for: .closeWorkspace) Button(pinLabel) { for id in targetIds { if let tab = tabManager.tabs.first(where: { $0.id == id }) { @@ -2781,8 +2783,15 @@ private struct TabItemView: View { syncSelectionAfterMutation() } - Button("Rename Workspace…") { - promptRename() + if let key = renameWorkspaceShortcut.keyEquivalent { + Button("Rename Workspace…") { + promptRename() + } + .keyboardShortcut(key, modifiers: renameWorkspaceShortcut.eventModifiers) + } else { + Button("Rename Workspace…") { + promptRename() + } } if tab.hasCustomTitle { @@ -2811,10 +2820,18 @@ private struct TabItemView: View { Divider() - Button(closeLabel) { - closeTabs(targetIds, allowPinned: true) + if let key = closeWorkspaceShortcut.keyEquivalent { + Button(closeLabel) { + closeTabs(targetIds, allowPinned: true) + } + .keyboardShortcut(key, modifiers: closeWorkspaceShortcut.eventModifiers) + .disabled(targetIds.isEmpty) + } else { + Button(closeLabel) { + closeTabs(targetIds, allowPinned: true) + } + .disabled(targetIds.isEmpty) } - .disabled(targetIds.isEmpty) Button("Close Other Workspaces") { closeOtherTabs(targetIds) diff --git a/Sources/KeyboardShortcutSettings.swift b/Sources/KeyboardShortcutSettings.swift index 6d1d0978..4316a41e 100644 --- a/Sources/KeyboardShortcutSettings.swift +++ b/Sources/KeyboardShortcutSettings.swift @@ -18,6 +18,7 @@ enum KeyboardShortcutSettings { case nextSidebarTab case prevSidebarTab case renameWorkspace + case closeWorkspace case newSurface // Panes / splits @@ -50,6 +51,7 @@ enum KeyboardShortcutSettings { case .nextSidebarTab: return "Next Workspace" case .prevSidebarTab: return "Previous Workspace" case .renameWorkspace: return "Rename Workspace" + case .closeWorkspace: return "Close Workspace" case .newSurface: return "New Surface" case .focusLeft: return "Focus Pane Left" case .focusRight: return "Focus Pane Right" @@ -76,6 +78,7 @@ enum KeyboardShortcutSettings { case .nextSidebarTab: return "shortcut.nextSidebarTab" case .prevSidebarTab: return "shortcut.prevSidebarTab" case .renameWorkspace: return "shortcut.renameWorkspace" + case .closeWorkspace: return "shortcut.closeWorkspace" case .focusLeft: return "shortcut.focusLeft" case .focusRight: return "shortcut.focusRight" case .focusUp: return "shortcut.focusUp" @@ -113,6 +116,8 @@ enum KeyboardShortcutSettings { return StoredShortcut(key: "[", command: true, shift: false, option: false, control: true) case .renameWorkspace: return StoredShortcut(key: "r", command: true, shift: true, option: false, control: false) + case .closeWorkspace: + return StoredShortcut(key: "w", command: true, shift: true, option: false, control: false) case .focusLeft: return StoredShortcut(key: "←", command: true, shift: false, option: true, control: false) case .focusRight: @@ -196,6 +201,7 @@ enum KeyboardShortcutSettings { static func nextSidebarTabShortcut() -> StoredShortcut { shortcut(for: .nextSidebarTab) } static func prevSidebarTabShortcut() -> StoredShortcut { shortcut(for: .prevSidebarTab) } static func renameWorkspaceShortcut() -> StoredShortcut { shortcut(for: .renameWorkspace) } + static func closeWorkspaceShortcut() -> StoredShortcut { shortcut(for: .closeWorkspace) } static func focusLeftShortcut() -> StoredShortcut { shortcut(for: .focusLeft) } static func focusRightShortcut() -> StoredShortcut { shortcut(for: .focusRight) } @@ -250,6 +256,65 @@ struct StoredShortcut: Codable, Equatable { return flags } + var keyEquivalent: KeyEquivalent? { + switch key { + case "←": + return .leftArrow + case "→": + return .rightArrow + case "↑": + return .upArrow + case "↓": + return .downArrow + case "\t": + return .tab + default: + let lowered = key.lowercased() + guard lowered.count == 1, let character = lowered.first else { return nil } + return KeyEquivalent(character) + } + } + + var eventModifiers: EventModifiers { + var modifiers: EventModifiers = [] + if command { + modifiers.insert(.command) + } + if shift { + modifiers.insert(.shift) + } + if option { + modifiers.insert(.option) + } + if control { + modifiers.insert(.control) + } + return modifiers + } + + var menuItemKeyEquivalent: String? { + switch key { + case "←": + guard let scalar = UnicodeScalar(NSLeftArrowFunctionKey) else { return nil } + return String(Character(scalar)) + case "→": + guard let scalar = UnicodeScalar(NSRightArrowFunctionKey) else { return nil } + return String(Character(scalar)) + case "↑": + guard let scalar = UnicodeScalar(NSUpArrowFunctionKey) else { return nil } + return String(Character(scalar)) + case "↓": + guard let scalar = UnicodeScalar(NSDownArrowFunctionKey) else { return nil } + return String(Character(scalar)) + case "\t": + return "\t" + default: + let lowered = key.lowercased() + guard lowered.count == 1 else { return nil } + return lowered + } + } + static func from(event: NSEvent) -> StoredShortcut? { guard let key = storedKey(from: event) else { return nil } diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 9be61c8e..eb81cf24 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -500,7 +500,7 @@ struct BrowserPanelView: View { } .buttonStyle(OmnibarAddressButtonStyle()) .frame(width: addressBarButtonSize, height: addressBarButtonSize, alignment: .center) - .help("Toggle Developer Tools") + .help(KeyboardShortcutSettings.Action.toggleBrowserDeveloperTools.tooltip("Toggle Developer Tools")) .accessibilityIdentifier("BrowserToggleDevToolsButton") } diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index defce523..4ba398be 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -177,6 +177,8 @@ extension WorkspaceContentView { struct EmptyPanelView: View { @ObservedObject var workspace: Workspace let paneId: PaneID + @AppStorage(KeyboardShortcutSettings.Action.newSurface.defaultsKey) private var newSurfaceShortcutData = Data() + @AppStorage(KeyboardShortcutSettings.Action.openBrowser.defaultsKey) private var openBrowserShortcutData = Data() private struct ShortcutHint: View { let text: String @@ -211,6 +213,49 @@ struct EmptyPanelView: View { _ = workspace.newBrowserSurface(inPane: paneId) } + private var newSurfaceShortcut: StoredShortcut { + decodeShortcut(from: newSurfaceShortcutData, fallback: KeyboardShortcutSettings.Action.newSurface.defaultShortcut) + } + + private var openBrowserShortcut: StoredShortcut { + decodeShortcut(from: openBrowserShortcutData, fallback: KeyboardShortcutSettings.Action.openBrowser.defaultShortcut) + } + + private func decodeShortcut(from data: Data, fallback: StoredShortcut) -> StoredShortcut { + guard !data.isEmpty, + let shortcut = try? JSONDecoder().decode(StoredShortcut.self, from: data) else { + return fallback + } + return shortcut + } + + @ViewBuilder + private func emptyPaneActionButton( + title: String, + systemImage: String, + shortcut: StoredShortcut, + action: @escaping () -> Void + ) -> some View { + if let key = shortcut.keyEquivalent { + Button(action: action) { + HStack(spacing: 10) { + Label(title, systemImage: systemImage) + ShortcutHint(text: shortcut.displayString) + } + } + .buttonStyle(.borderedProminent) + .keyboardShortcut(key, modifiers: shortcut.eventModifiers) + } else { + Button(action: action) { + HStack(spacing: 10) { + Label(title, systemImage: systemImage) + ShortcutHint(text: shortcut.displayString) + } + } + .buttonStyle(.borderedProminent) + } + } + var body: some View { VStack(spacing: 16) { Image(systemName: "terminal.fill") @@ -222,27 +267,19 @@ struct EmptyPanelView: View { .foregroundStyle(.secondary) HStack(spacing: 12) { - Button { - createTerminal() - } label: { - HStack(spacing: 10) { - Label("Terminal", systemImage: "terminal.fill") - ShortcutHint(text: "⌘T") - } - } - .buttonStyle(.borderedProminent) - .keyboardShortcut("t", modifiers: [.command]) + emptyPaneActionButton( + title: "Terminal", + systemImage: "terminal.fill", + shortcut: newSurfaceShortcut, + action: createTerminal + ) - Button { - createBrowser() - } label: { - HStack(spacing: 10) { - Label("Browser", systemImage: "globe") - ShortcutHint(text: "⌘⇧L") - } - } - .buttonStyle(.borderedProminent) - .keyboardShortcut("l", modifiers: [.command, .shift]) + emptyPaneActionButton( + title: "Browser", + systemImage: "globe", + shortcut: openBrowserShortcut, + action: createBrowser + ) } } .frame(maxWidth: .infinity, maxHeight: .infinity) diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 2f74980c..60190705 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -13,6 +13,15 @@ struct cmuxApp: App { @AppStorage("titlebarControlsStyle") private var titlebarControlsStyle = TitlebarControlsStyle.classic.rawValue @AppStorage(ShortcutHintDebugSettings.alwaysShowHintsKey) private var alwaysShowShortcutHints = ShortcutHintDebugSettings.defaultAlwaysShowHints @AppStorage(SocketControlSettings.appStorageKey) private var socketControlMode = SocketControlSettings.defaultMode.rawValue + @AppStorage(KeyboardShortcutSettings.Action.toggleSidebar.defaultsKey) private var toggleSidebarShortcutData = Data() + @AppStorage(KeyboardShortcutSettings.Action.newTab.defaultsKey) private var newWorkspaceShortcutData = Data() + @AppStorage(KeyboardShortcutSettings.Action.newWindow.defaultsKey) private var newWindowShortcutData = Data() + @AppStorage(KeyboardShortcutSettings.Action.showNotifications.defaultsKey) private var showNotificationsShortcutData = Data() + @AppStorage(KeyboardShortcutSettings.Action.jumpToUnread.defaultsKey) private var jumpToUnreadShortcutData = Data() + @AppStorage(KeyboardShortcutSettings.Action.nextSurface.defaultsKey) private var nextSurfaceShortcutData = Data() + @AppStorage(KeyboardShortcutSettings.Action.prevSurface.defaultsKey) private var prevSurfaceShortcutData = Data() + @AppStorage(KeyboardShortcutSettings.Action.nextSidebarTab.defaultsKey) private var nextWorkspaceShortcutData = Data() + @AppStorage(KeyboardShortcutSettings.Action.prevSidebarTab.defaultsKey) private var prevWorkspaceShortcutData = Data() @AppStorage(KeyboardShortcutSettings.Action.splitRight.defaultsKey) private var splitRightShortcutData = Data() @AppStorage(KeyboardShortcutSettings.Action.splitDown.defaultsKey) private var splitDownShortcutData = Data() @AppStorage(KeyboardShortcutSettings.Action.toggleBrowserDeveloperTools.defaultsKey) @@ -21,6 +30,8 @@ struct cmuxApp: App { private var showBrowserJavaScriptConsoleShortcutData = Data() @AppStorage(KeyboardShortcutSettings.Action.splitBrowserRight.defaultsKey) private var splitBrowserRightShortcutData = Data() @AppStorage(KeyboardShortcutSettings.Action.splitBrowserDown.defaultsKey) private var splitBrowserDownShortcutData = Data() + @AppStorage(KeyboardShortcutSettings.Action.renameWorkspace.defaultsKey) private var renameWorkspaceShortcutData = Data() + @AppStorage(KeyboardShortcutSettings.Action.closeWorkspace.defaultsKey) private var closeWorkspaceShortcutData = Data() @NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate init() { @@ -257,11 +268,11 @@ struct cmuxApp: App { Divider() } - Button("Show Notifications") { + splitCommandButton(title: "Show Notifications", shortcut: showNotificationsMenuShortcut) { showNotificationsPopover() } - Button("Jump to Latest Unread") { + splitCommandButton(title: "Jump to Latest Unread", shortcut: jumpToUnreadMenuShortcut) { appDelegate.jumpToLatestUnread() } .disabled(!snapshot.hasUnreadNotifications) @@ -337,12 +348,11 @@ struct cmuxApp: App { // New tab commands CommandGroup(replacing: .newItem) { - Button("New Window") { + splitCommandButton(title: "New Window", shortcut: newWindowMenuShortcut) { appDelegate.openNewMainWindow(nil) } - .keyboardShortcut("n", modifiers: [.command, .shift]) - Button("New Workspace") { + splitCommandButton(title: "New Workspace", shortcut: newWorkspaceMenuShortcut) { (AppDelegate.shared?.tabManager ?? tabManager).addTab() } } @@ -359,10 +369,9 @@ struct cmuxApp: App { // Cmd+Shift+W closes the current workspace (with confirmation if needed). If this // is the last workspace, it closes the window. - Button("Close Workspace") { + splitCommandButton(title: "Close Workspace", shortcut: closeWorkspaceMenuShortcut) { closeTabOrWindow() } - .keyboardShortcut("w", modifiers: [.command, .shift]) Button("Reopen Closed Browser Panel") { _ = (AppDelegate.shared?.tabManager ?? tabManager).reopenMostRecentlyClosedBrowserPanel() @@ -408,17 +417,17 @@ struct cmuxApp: App { // Tab navigation CommandGroup(after: .toolbar) { - Button("Toggle Sidebar") { + splitCommandButton(title: "Toggle Sidebar", shortcut: toggleSidebarMenuShortcut) { sidebarState.toggle() } Divider() - Button("Next Surface") { + splitCommandButton(title: "Next Surface", shortcut: nextSurfaceMenuShortcut) { (AppDelegate.shared?.tabManager ?? tabManager).selectNextSurface() } - Button("Previous Surface") { + splitCommandButton(title: "Previous Surface", shortcut: prevSurfaceMenuShortcut) { (AppDelegate.shared?.tabManager ?? tabManager).selectPreviousSurface() } @@ -470,15 +479,15 @@ struct cmuxApp: App { BrowserHistoryStore.shared.clearHistory() } - Button("Next Workspace") { + splitCommandButton(title: "Next Workspace", shortcut: nextWorkspaceMenuShortcut) { (AppDelegate.shared?.tabManager ?? tabManager).selectNextTab() } - Button("Previous Workspace") { + splitCommandButton(title: "Previous Workspace", shortcut: prevWorkspaceMenuShortcut) { (AppDelegate.shared?.tabManager ?? tabManager).selectPreviousTab() } - Button("Rename Workspace…") { + splitCommandButton(title: "Rename Workspace…", shortcut: renameWorkspaceMenuShortcut) { _ = AppDelegate.shared?.promptRenameSelectedWorkspace() } @@ -515,11 +524,11 @@ struct cmuxApp: App { Divider() - Button("Jump to Latest Unread") { + splitCommandButton(title: "Jump to Latest Unread", shortcut: jumpToUnreadMenuShortcut) { AppDelegate.shared?.jumpToLatestUnread() } - Button("Show Notifications") { + splitCommandButton(title: "Show Notifications", shortcut: showNotificationsMenuShortcut) { showNotificationsPopover() } } @@ -578,6 +587,54 @@ struct cmuxApp: App { decodeShortcut(from: splitRightShortcutData, fallback: KeyboardShortcutSettings.Action.splitRight.defaultShortcut) } + private var toggleSidebarMenuShortcut: StoredShortcut { + decodeShortcut(from: toggleSidebarShortcutData, fallback: KeyboardShortcutSettings.Action.toggleSidebar.defaultShortcut) + } + + private var newWorkspaceMenuShortcut: StoredShortcut { + decodeShortcut(from: newWorkspaceShortcutData, fallback: KeyboardShortcutSettings.Action.newTab.defaultShortcut) + } + + private var newWindowMenuShortcut: StoredShortcut { + decodeShortcut(from: newWindowShortcutData, fallback: KeyboardShortcutSettings.Action.newWindow.defaultShortcut) + } + + private var showNotificationsMenuShortcut: StoredShortcut { + decodeShortcut( + from: showNotificationsShortcutData, + fallback: KeyboardShortcutSettings.Action.showNotifications.defaultShortcut + ) + } + + private var jumpToUnreadMenuShortcut: StoredShortcut { + decodeShortcut( + from: jumpToUnreadShortcutData, + fallback: KeyboardShortcutSettings.Action.jumpToUnread.defaultShortcut + ) + } + + private var nextSurfaceMenuShortcut: StoredShortcut { + decodeShortcut(from: nextSurfaceShortcutData, fallback: KeyboardShortcutSettings.Action.nextSurface.defaultShortcut) + } + + private var prevSurfaceMenuShortcut: StoredShortcut { + decodeShortcut(from: prevSurfaceShortcutData, fallback: KeyboardShortcutSettings.Action.prevSurface.defaultShortcut) + } + + private var nextWorkspaceMenuShortcut: StoredShortcut { + decodeShortcut( + from: nextWorkspaceShortcutData, + fallback: KeyboardShortcutSettings.Action.nextSidebarTab.defaultShortcut + ) + } + + private var prevWorkspaceMenuShortcut: StoredShortcut { + decodeShortcut( + from: prevWorkspaceShortcutData, + fallback: KeyboardShortcutSettings.Action.prevSidebarTab.defaultShortcut + ) + } + private var splitDownMenuShortcut: StoredShortcut { decodeShortcut(from: splitDownShortcutData, fallback: KeyboardShortcutSettings.Action.splitDown.defaultShortcut) } @@ -610,6 +667,20 @@ struct cmuxApp: App { ) } + private var renameWorkspaceMenuShortcut: StoredShortcut { + decodeShortcut( + from: renameWorkspaceShortcutData, + fallback: KeyboardShortcutSettings.Action.renameWorkspace.defaultShortcut + ) + } + + private var closeWorkspaceMenuShortcut: StoredShortcut { + decodeShortcut( + from: closeWorkspaceShortcutData, + fallback: KeyboardShortcutSettings.Action.closeWorkspace.defaultShortcut + ) + } + private var notificationMenuSnapshot: NotificationMenuSnapshot { NotificationMenuSnapshotBuilder.make(notifications: notificationStore.notifications) } @@ -651,50 +722,14 @@ struct cmuxApp: App { @ViewBuilder private func splitCommandButton(title: String, shortcut: StoredShortcut, action: @escaping () -> Void) -> some View { - if let key = keyEquivalent(for: shortcut) { + if let key = shortcut.keyEquivalent { Button(title, action: action) - .keyboardShortcut(key, modifiers: eventModifiers(for: shortcut)) + .keyboardShortcut(key, modifiers: shortcut.eventModifiers) } else { Button(title, action: action) } } - private func keyEquivalent(for shortcut: StoredShortcut) -> KeyEquivalent? { - switch shortcut.key { - case "←": - return .leftArrow - case "→": - return .rightArrow - case "↑": - return .upArrow - case "↓": - return .downArrow - case "\t": - return .tab - default: - let lowered = shortcut.key.lowercased() - guard lowered.count == 1, let character = lowered.first else { return nil } - return KeyEquivalent(character) - } - } - - private func eventModifiers(for shortcut: StoredShortcut) -> EventModifiers { - var modifiers: EventModifiers = [] - if shortcut.command { - modifiers.insert(.command) - } - if shortcut.shift { - modifiers.insert(.shift) - } - if shortcut.option { - modifiers.insert(.option) - } - if shortcut.control { - modifiers.insert(.control) - } - return modifiers - } - private func closePanelOrWindow() { if let window = NSApp.keyWindow, window.identifier?.rawValue == "cmux.settings" { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 5ff9b633..62599dec 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1,6 +1,7 @@ import XCTest import AppKit import WebKit +import SwiftUI import ObjectiveC.runtime #if canImport(cmux_DEV) @@ -331,6 +332,82 @@ final class WorkspaceRenameShortcutDefaultsTests: XCTestCase { XCTAssertFalse(shortcut.control) } + func testRenameWorkspaceShortcutConvertsToMenuShortcut() { + let shortcut = KeyboardShortcutSettings.Action.renameWorkspace.defaultShortcut + XCTAssertNotNil(shortcut.keyEquivalent) + XCTAssertTrue(shortcut.eventModifiers.contains(.command)) + XCTAssertTrue(shortcut.eventModifiers.contains(.shift)) + XCTAssertFalse(shortcut.eventModifiers.contains(.option)) + XCTAssertFalse(shortcut.eventModifiers.contains(.control)) + } + + func testCloseWorkspaceShortcutDefaultsAndMetadata() { + XCTAssertEqual(KeyboardShortcutSettings.Action.closeWorkspace.label, "Close Workspace") + XCTAssertEqual(KeyboardShortcutSettings.Action.closeWorkspace.defaultsKey, "shortcut.closeWorkspace") + + let shortcut = KeyboardShortcutSettings.Action.closeWorkspace.defaultShortcut + XCTAssertEqual(shortcut.key, "w") + XCTAssertTrue(shortcut.command) + XCTAssertTrue(shortcut.shift) + XCTAssertFalse(shortcut.option) + XCTAssertFalse(shortcut.control) + } + + func testCloseWorkspaceShortcutConvertsToMenuShortcut() { + let shortcut = KeyboardShortcutSettings.Action.closeWorkspace.defaultShortcut + XCTAssertNotNil(shortcut.keyEquivalent) + XCTAssertTrue(shortcut.eventModifiers.contains(.command)) + XCTAssertTrue(shortcut.eventModifiers.contains(.shift)) + XCTAssertFalse(shortcut.eventModifiers.contains(.option)) + XCTAssertFalse(shortcut.eventModifiers.contains(.control)) + } + + func testNextPreviousWorkspaceShortcutDefaultsAndMetadata() { + XCTAssertEqual(KeyboardShortcutSettings.Action.nextSidebarTab.label, "Next Workspace") + XCTAssertEqual(KeyboardShortcutSettings.Action.prevSidebarTab.label, "Previous Workspace") + XCTAssertEqual(KeyboardShortcutSettings.Action.nextSidebarTab.defaultsKey, "shortcut.nextSidebarTab") + XCTAssertEqual(KeyboardShortcutSettings.Action.prevSidebarTab.defaultsKey, "shortcut.prevSidebarTab") + + let nextShortcut = KeyboardShortcutSettings.Action.nextSidebarTab.defaultShortcut + XCTAssertEqual(nextShortcut.key, "]") + XCTAssertTrue(nextShortcut.command) + XCTAssertFalse(nextShortcut.shift) + XCTAssertFalse(nextShortcut.option) + XCTAssertTrue(nextShortcut.control) + + let prevShortcut = KeyboardShortcutSettings.Action.prevSidebarTab.defaultShortcut + XCTAssertEqual(prevShortcut.key, "[") + XCTAssertTrue(prevShortcut.command) + XCTAssertFalse(prevShortcut.shift) + XCTAssertFalse(prevShortcut.option) + XCTAssertTrue(prevShortcut.control) + } + + func testNextPreviousWorkspaceShortcutsConvertToMenuShortcut() { + let nextShortcut = KeyboardShortcutSettings.Action.nextSidebarTab.defaultShortcut + XCTAssertNotNil(nextShortcut.keyEquivalent) + XCTAssertEqual(nextShortcut.menuItemKeyEquivalent, "]") + XCTAssertTrue(nextShortcut.eventModifiers.contains(.command)) + XCTAssertTrue(nextShortcut.eventModifiers.contains(.control)) + + let prevShortcut = KeyboardShortcutSettings.Action.prevSidebarTab.defaultShortcut + XCTAssertNotNil(prevShortcut.keyEquivalent) + XCTAssertEqual(prevShortcut.menuItemKeyEquivalent, "[") + XCTAssertTrue(prevShortcut.eventModifiers.contains(.command)) + XCTAssertTrue(prevShortcut.eventModifiers.contains(.control)) + } + + func testMenuItemKeyEquivalentHandlesArrowAndTabKeys() { + XCTAssertNotNil(StoredShortcut(key: "←", command: true, shift: false, option: false, control: false).menuItemKeyEquivalent) + XCTAssertNotNil(StoredShortcut(key: "→", command: true, shift: false, option: false, control: false).menuItemKeyEquivalent) + XCTAssertNotNil(StoredShortcut(key: "↑", command: true, shift: false, option: false, control: false).menuItemKeyEquivalent) + XCTAssertNotNil(StoredShortcut(key: "↓", command: true, shift: false, option: false, control: false).menuItemKeyEquivalent) + XCTAssertEqual( + StoredShortcut(key: "\t", command: true, shift: false, option: false, control: false).menuItemKeyEquivalent, + "\t" + ) + } + func testShortcutDefaultsKeysRemainUnique() { let keys = KeyboardShortcutSettings.Action.allCases.map(\.defaultsKey) XCTAssertEqual(Set(keys).count, keys.count) From 26d44e84da1a81a070a1d44ff0516a82d21da12e Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 16:24:59 -0800 Subject: [PATCH 071/214] Fix changelog page rendering markdown links as raw text (#320) The InlineCode component only handled backtick code spans but ignored markdown links, causing PR/issue references to display as raw [#N](url) text instead of clickable links. Rename to InlineMarkdown and add link parsing to the split regex. --- web/app/docs/changelog/page.tsx | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/web/app/docs/changelog/page.tsx b/web/app/docs/changelog/page.tsx index ed6a9307..f3f3140a 100644 --- a/web/app/docs/changelog/page.tsx +++ b/web/app/docs/changelog/page.tsx @@ -75,17 +75,24 @@ function parseChangelog(markdown: string): ChangelogVersion[] { return versions; } -function InlineCode({ text }: { text: string }) { - const parts = text.split(/(`[^`]+`)/g); +function InlineMarkdown({ text }: { text: string }) { + const parts = text.split(/(`[^`]+`|\[[^\]]+\]\([^)]+\))/g); return ( <> - {parts.map((part, i) => - part.startsWith("`") && part.endsWith("`") ? ( - <code key={i}>{part.slice(1, -1)}</code> - ) : ( - <span key={i}>{part}</span> - ) - )} + {parts.map((part, i) => { + if (part.startsWith("`") && part.endsWith("`")) { + return <code key={i}>{part.slice(1, -1)}</code>; + } + const linkMatch = part.match(/^\[([^\]]+)\]\(([^)]+)\)$/); + if (linkMatch) { + return ( + <a key={i} href={linkMatch[2]}> + {linkMatch[1]} + </a> + ); + } + return <span key={i}>{part}</span>; + })} </> ); } @@ -115,7 +122,7 @@ export default function ChangelogPage() { <ul> {section.items.map((item, j) => ( <li key={j}> - <InlineCode text={item} /> + <InlineMarkdown text={item} /> </li> ))} </ul> From 72791f32bc76024e0551893099c12a0baa93cfee Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 16:29:35 -0800 Subject: [PATCH 072/214] Break terminal find overlay retain cycle --- Sources/Find/SurfaceSearchOverlay.swift | 26 +++++++++++-------- Sources/GhosttyTerminalView.swift | 15 ++++++++--- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 21 +++++++++++++++ 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/Sources/Find/SurfaceSearchOverlay.swift b/Sources/Find/SurfaceSearchOverlay.swift index d8bf5463..0900b2ce 100644 --- a/Sources/Find/SurfaceSearchOverlay.swift +++ b/Sources/Find/SurfaceSearchOverlay.swift @@ -2,8 +2,11 @@ import Bonsplit import SwiftUI struct SurfaceSearchOverlay: View { - let surface: TerminalSurface + let tabId: UUID + let surfaceId: UUID @ObservedObject var searchState: TerminalSurface.SearchState + let onMoveFocusToTerminal: () -> Void + let onNavigateSearch: (_ action: String) -> Void let onClose: () -> Void @State private var corner: Corner = .topRight @State private var dragOffset: CGSize = .zero @@ -44,22 +47,22 @@ struct SurfaceSearchOverlay: View { if searchState.needle.isEmpty { onClose() } else { - surface.hostedView.moveFocus() + onMoveFocusToTerminal() } } .backport.onKeyPress(.return) { modifiers in let action = modifiers.contains(.shift) ? "navigate_search:previous" : "navigate_search:next" - _ = surface.performBindingAction(action) + onNavigateSearch(action) return .handled } Button(action: { #if DEBUG - dlog("findbar.next surface=\(surface.id.uuidString.prefix(5))") + dlog("findbar.next surface=\(surfaceId.uuidString.prefix(5))") #endif - _ = surface.performBindingAction("navigate_search:next") + onNavigateSearch("navigate_search:next") }) { Image(systemName: "chevron.up") } @@ -68,9 +71,9 @@ struct SurfaceSearchOverlay: View { Button(action: { #if DEBUG - dlog("findbar.prev surface=\(surface.id.uuidString.prefix(5))") + dlog("findbar.prev surface=\(surfaceId.uuidString.prefix(5))") #endif - _ = surface.performBindingAction("navigate_search:previous") + onNavigateSearch("navigate_search:previous") }) { Image(systemName: "chevron.down") } @@ -79,7 +82,7 @@ struct SurfaceSearchOverlay: View { Button(action: { #if DEBUG - dlog("findbar.close surface=\(surface.id.uuidString.prefix(5))") + dlog("findbar.close surface=\(surfaceId.uuidString.prefix(5))") #endif onClose() }) { @@ -93,12 +96,13 @@ struct SurfaceSearchOverlay: View { .clipShape(clipShape) .shadow(radius: 4) .onAppear { - NSLog("Find: overlay appear tab=%@ surface=%@", surface.tabId.uuidString, surface.id.uuidString) + NSLog("Find: overlay appear tab=%@ surface=%@", tabId.uuidString, surfaceId.uuidString) isSearchFieldFocused = true } .onReceive(NotificationCenter.default.publisher(for: .ghosttySearchFocus)) { notification in - guard notification.object as? TerminalSurface === surface else { return } - NSLog("Find: overlay focus tab=%@ surface=%@", surface.tabId.uuidString, surface.id.uuidString) + guard let focusedSurface = notification.object as? TerminalSurface, + focusedSurface.id == surfaceId else { return } + NSLog("Find: overlay focus tab=%@ surface=%@", tabId.uuidString, surfaceId.uuidString) DispatchQueue.main.async { isSearchFieldFocused = true } diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 0ac7a61d..1bd23f8d 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -3426,11 +3426,20 @@ final class GhosttySurfaceScrollView: NSView { return } + let tabId = terminalSurface.tabId + let surfaceId = terminalSurface.id let rootView = SurfaceSearchOverlay( - surface: terminalSurface, + tabId: tabId, + surfaceId: surfaceId, searchState: searchState, - onClose: { [weak self] in - self?.surfaceView.terminalSurface?.searchState = nil + onMoveFocusToTerminal: { [weak self] in + self?.moveFocus() + }, + onNavigateSearch: { [weak terminalSurface] action in + _ = terminalSurface?.performBindingAction(action) + }, + onClose: { [weak self, weak terminalSurface] in + terminalSurface?.searchState = nil self?.moveFocus() } ) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 6212d2f6..6365ee87 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -3275,6 +3275,27 @@ final class GhosttySurfaceOverlayTests: XCTestCase { XCTAssertFalse(hostedView.debugHasSearchOverlay()) } + func testSearchOverlayMountDoesNotRetainTerminalSurface() { + weak var weakSurface: TerminalSurface? + + let hostedView: GhosttySurfaceScrollView = { + let surface = TerminalSurface( + tabId: UUID(), + context: GHOSTTY_SURFACE_CONTEXT_SPLIT, + configTemplate: nil, + workingDirectory: nil + ) + weakSurface = surface + let hostedView = surface.hostedView + hostedView.setSearchOverlay(searchState: TerminalSurface.SearchState(needle: "retain-check")) + return hostedView + }() + + RunLoop.main.run(until: Date().addingTimeInterval(0.01)) + XCTAssertTrue(hostedView.debugHasSearchOverlay()) + XCTAssertNil(weakSurface, "Mounted search overlay must not retain TerminalSurface") + } + func testSearchOverlaySurvivesPortalRebindDuringSplitLikeChurn() { let window = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 480, height: 320), From 61e4ad9f940ed789b7bd59aa379a720ed9e777e8 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 16:58:24 -0800 Subject: [PATCH 073/214] Annotate jump-to-unread shortcut in notifications view --- Sources/NotificationsPage.swift | 68 +++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/Sources/NotificationsPage.swift b/Sources/NotificationsPage.swift index 45e9e3f2..f04841ed 100644 --- a/Sources/NotificationsPage.swift +++ b/Sources/NotificationsPage.swift @@ -5,6 +5,7 @@ struct NotificationsPage: View { @EnvironmentObject var tabManager: TabManager @Binding var selection: SidebarSelection @FocusState private var focusedNotificationId: UUID? + @AppStorage(KeyboardShortcutSettings.Action.jumpToUnread.defaultsKey) private var jumpToUnreadShortcutData = Data() var body: some View { VStack(spacing: 0) { @@ -73,6 +74,8 @@ struct NotificationsPage: View { Spacer() if !notificationStore.notifications.isEmpty { + jumpToUnreadButton + Button("Clear All") { notificationStore.clearAll() } @@ -97,11 +100,76 @@ struct NotificationsPage: View { .frame(maxWidth: .infinity, maxHeight: .infinity) } + @ViewBuilder + private var jumpToUnreadButton: some View { + if let key = jumpToUnreadShortcut.keyEquivalent { + Button(action: { + AppDelegate.shared?.jumpToLatestUnread() + }) { + HStack(spacing: 6) { + Text("Jump to Latest Unread") + ShortcutAnnotation(text: jumpToUnreadShortcut.displayString) + } + } + .buttonStyle(.bordered) + .keyboardShortcut(key, modifiers: jumpToUnreadShortcut.eventModifiers) + .help(KeyboardShortcutSettings.Action.jumpToUnread.tooltip("Jump to Latest Unread")) + .disabled(!hasUnreadNotifications) + } else { + Button(action: { + AppDelegate.shared?.jumpToLatestUnread() + }) { + HStack(spacing: 6) { + Text("Jump to Latest Unread") + ShortcutAnnotation(text: jumpToUnreadShortcut.displayString) + } + } + .buttonStyle(.bordered) + .help(KeyboardShortcutSettings.Action.jumpToUnread.tooltip("Jump to Latest Unread")) + .disabled(!hasUnreadNotifications) + } + } + + private var jumpToUnreadShortcut: StoredShortcut { + decodeShortcut( + from: jumpToUnreadShortcutData, + fallback: KeyboardShortcutSettings.Action.jumpToUnread.defaultShortcut + ) + } + + private var hasUnreadNotifications: Bool { + notificationStore.notifications.contains(where: { !$0.isRead }) + } + + private func decodeShortcut(from data: Data, fallback: StoredShortcut) -> StoredShortcut { + guard !data.isEmpty, + let shortcut = try? JSONDecoder().decode(StoredShortcut.self, from: data) else { + return fallback + } + return shortcut + } + private func tabTitle(for tabId: UUID) -> String? { AppDelegate.shared?.tabTitle(for: tabId) ?? tabManager.tabs.first(where: { $0.id == tabId })?.title } } +private struct ShortcutAnnotation: View { + let text: String + + var body: some View { + Text(text) + .font(.system(size: 10, weight: .semibold, design: .rounded)) + .foregroundStyle(.primary) + .padding(.horizontal, 6) + .padding(.vertical, 2) + .background( + RoundedRectangle(cornerRadius: 5) + .fill(Color(nsColor: .controlBackgroundColor)) + ) + } +} + private struct NotificationRow: View { let notification: TerminalNotification let tabTitle: String? From 018554cc473e320b3a6523733ed1bc553120538f Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 17:10:11 -0800 Subject: [PATCH 074/214] Fix theme toggle using system preference instead of selected theme (#326) Tailwind v4 defaults dark: utilities to @media (prefers-color-scheme) strategy. Add @custom-variant to use class-based dark mode matching the next-themes ThemeProvider attribute="class" configuration. Fixes https://github.com/manaflow-ai/cmux/issues/325 --- web/app/globals.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/app/globals.css b/web/app/globals.css index 92263fbf..a80da967 100644 --- a/web/app/globals.css +++ b/web/app/globals.css @@ -1,5 +1,7 @@ @import "tailwindcss"; +@custom-variant dark (&:where(.dark, .dark *)); + :root { --background: #fafafa; --foreground: #171717; From b7d49228b74bc599f9118768ff146c20ecf7f3be Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 17:19:38 -0800 Subject: [PATCH 075/214] Fix pane shortcut hints to active window --- vendor/bonsplit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/bonsplit b/vendor/bonsplit index cf929c88..0dd965a7 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit cf929c887af79ea8b881e39da5b8c4ee1d6b9009 +Subproject commit 0dd965a75f02f7a358f87fd607a9e2034450a79c From 0105b6256a868b6a1cd4b54b24b42c150465c39f Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 17:30:30 -0800 Subject: [PATCH 076/214] Add workspace tab color schemes and debug scheme toggle (#324) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add tab color feature to sidebar workspaces Lets users assign a custom background color to any sidebar workspace tab via a right-click "Tab Color" submenu. The primary motivation is working across multiple projects simultaneously — coloring tabs by project makes it instant to visually locate the right workspace without reading the title. - Workspace: adds `customColor: String?` (@Published hex string) and `setCustomColor()` setter - TabManager: adds `setTabColor(tabId:color:)` convenience method - ContentView: 16-color dark palette (all luminance < 0.30, white text always readable), `Color(hex:)` extension, `coloredCircleImage(hex:)` helper to render bitmapped NSImage circles (needed because macOS menus strip SwiftUI foregroundColor from SF Symbols), updated `backgroundColor` to use custom color at full/70%/35% opacity for active/inactive/ multi-selected states, "Tab Color" submenu in context menu with "Clear Color" option, and a 1.5pt `Color.primary` border overlay on the active tab for clear selection indication when custom colors are set * Add workspace tab color schemes with settings and debug toggles * Remove Kelly scheme and keep only original tab color palette * Preserve neutral grayscale when brightening tab colors * Harden UpdatePill UI test polling timeouts --------- Co-authored-by: Andreas Fruth <andreas.fruth@gmail.com> --- Sources/AppDelegate.swift | 28 ++ Sources/ContentView.swift | 270 ++++++++++++++++-- Sources/TabManager.swift | 254 ++++++++++++++++ Sources/Workspace.swift | 5 + Sources/cmuxApp.swift | 210 ++++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 204 +++++++++++++ cmuxUITests/UpdatePillUITests.swift | 81 +++--- .../scripts/debug_windows_snapshot.sh | 2 + 8 files changed, 995 insertions(+), 59 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 87fb732a..a270f941 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -935,6 +935,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } #if DEBUG + private let debugColorWorkspaceTitlePrefix = "Debug Color - " + @objc func openDebugScrollbackTab(_ sender: Any?) { guard let tabManager else { return } let tab = tabManager.addTab() @@ -958,6 +960,32 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent sendTextWhenReady(payload, to: tab) } + @objc func openDebugColorComparisonWorkspaces(_ sender: Any?) { + guard let tabManager else { return } + + let palette = WorkspaceTabColorSettings.palette() + guard !palette.isEmpty else { return } + + var existingByTitle: [String: Workspace] = [:] + for tab in tabManager.tabs { + guard let title = tab.customTitle, + title.hasPrefix(debugColorWorkspaceTitlePrefix) else { continue } + existingByTitle[title] = tab + } + + for entry in palette { + let title = "\(debugColorWorkspaceTitlePrefix)\(entry.name)" + let targetTab: Workspace + if let existing = existingByTitle[title] { + targetTab = existing + } else { + targetTab = tabManager.addTab() + } + tabManager.setCustomTitle(tabId: targetTab.id, title: title) + tabManager.setTabColor(tabId: targetTab.id, color: entry.hex) + } + } + private func sendTextWhenReady(_ text: String, to tab: Tab, attempt: Int = 0) { let maxAttempts = 60 if let terminalPanel = tab.focusedTerminalPanel, terminalPanel.surface.surface != nil { diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 470c5d81..82de33b1 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -5,6 +5,29 @@ import ObjectiveC import UniformTypeIdentifiers import WebKit +private extension Color { + init?(hex: String) { + let hex = hex.trimmingCharacters(in: .init(charactersIn: "#")) + guard hex.count == 6, let value = UInt64(hex, radix: 16) else { return nil } + self.init( + red: Double((value >> 16) & 0xFF) / 255.0, + green: Double((value >> 8) & 0xFF) / 255.0, + blue: Double( value & 0xFF) / 255.0 + ) + } +} + +private func coloredCircleImage(color: NSColor) -> NSImage { + let size = NSSize(width: 14, height: 14) + let image = NSImage(size: size, flipped: false) { rect in + color.setFill() + NSBezierPath(ovalIn: rect.insetBy(dx: 1, dy: 1)).fill() + return true + } + image.isTemplate = false + return image +} + struct ShortcutHintPillBackground: View { var emphasis: Double = 1.0 @@ -2439,6 +2462,7 @@ private struct SidebarEmptyArea: View { private struct TabItemView: View { @EnvironmentObject var tabManager: TabManager @EnvironmentObject var notificationStore: TerminalNotificationStore + @Environment(\.colorScheme) private var colorScheme @ObservedObject var tab: Tab let index: Int let rowSpacing: CGFloat @@ -2461,6 +2485,8 @@ private struct TabItemView: View { @AppStorage("sidebarShowLog") private var sidebarShowLog = true @AppStorage("sidebarShowProgress") private var sidebarShowProgress = true @AppStorage("sidebarShowStatusPills") private var sidebarShowStatusPills = true + @AppStorage(SidebarActiveTabIndicatorSettings.styleKey) + private var activeTabIndicatorStyleRaw = SidebarActiveTabIndicatorSettings.defaultStyle.rawValue var isActive: Bool { tabManager.selectedTabId == tab.id @@ -2474,6 +2500,65 @@ private struct TabItemView: View { draggedTabId == tab.id } + private var activeTabIndicatorStyle: SidebarActiveTabIndicatorStyle { + SidebarActiveTabIndicatorSettings.resolvedStyle(rawValue: activeTabIndicatorStyleRaw) + } + + private var titleFontWeight: Font.Weight { + .semibold + } + + private var showsLeadingRail: Bool { + explicitRailColor != nil + } + + private var activeBorderLineWidth: CGFloat { + switch activeTabIndicatorStyle { + case .leftRail: + return 0 + case .solidFill: + return isActive ? 1.5 : 0 + } + } + + private var activeBorderColor: Color { + guard isActive else { return .clear } + switch activeTabIndicatorStyle { + case .leftRail: + return .clear + case .solidFill: + return Color.primary.opacity(0.5) + } + } + + private var usesInvertedActiveForeground: Bool { + isActive + } + + private var activePrimaryTextColor: Color { + usesInvertedActiveForeground ? .white : .primary + } + + private func activeSecondaryColor(_ opacity: Double = 0.75) -> Color { + usesInvertedActiveForeground ? .white.opacity(opacity) : .secondary + } + + private var activeUnreadBadgeFillColor: Color { + usesInvertedActiveForeground ? Color.white.opacity(0.25) : Color.accentColor + } + + private var activeProgressTrackColor: Color { + usesInvertedActiveForeground ? Color.white.opacity(0.15) : Color.secondary.opacity(0.2) + } + + private var activeProgressFillColor: Color { + usesInvertedActiveForeground ? Color.white.opacity(0.8) : Color.accentColor + } + + private var shortcutHintEmphasis: Double { + usesInvertedActiveForeground ? 1.0 : 0.9 + } + private var workspaceShortcutDigit: Int? { WorkspaceShortcutMapper.commandDigitForWorkspace(at: index, workspaceCount: tabManager.tabs.count) } @@ -2510,7 +2595,7 @@ private struct TabItemView: View { if unreadCount > 0 { ZStack { Circle() - .fill(isActive ? Color.white.opacity(0.25) : Color.accentColor) + .fill(activeUnreadBadgeFillColor) Text("\(unreadCount)") .font(.system(size: 9, weight: .semibold)) .foregroundColor(.white) @@ -2521,12 +2606,12 @@ private struct TabItemView: View { if tab.isPinned { Image(systemName: "pin.fill") .font(.system(size: 9, weight: .semibold)) - .foregroundColor(isActive ? .white.opacity(0.8) : .secondary) + .foregroundColor(activeSecondaryColor(0.8)) } Text(tab.title) - .font(.system(size: 12.5, weight: .semibold)) - .foregroundColor(isActive ? .white : .primary) + .font(.system(size: 12.5, weight: titleFontWeight)) + .foregroundColor(activePrimaryTextColor) .lineLimit(1) .truncationMode(.tail) @@ -2541,7 +2626,7 @@ private struct TabItemView: View { }) { Image(systemName: "xmark") .font(.system(size: 9, weight: .medium)) - .foregroundColor(isActive ? .white.opacity(0.7) : .secondary) + .foregroundColor(activeSecondaryColor(0.7)) } .buttonStyle(.plain) .help(KeyboardShortcutSettings.Action.closeWorkspace.tooltip("Close Workspace")) @@ -2555,10 +2640,10 @@ private struct TabItemView: View { .fixedSize(horizontal: true, vertical: false) .font(.system(size: 10, weight: .semibold, design: .rounded)) .monospacedDigit() - .foregroundColor(isActive ? .white : .primary) + .foregroundColor(activePrimaryTextColor) .padding(.horizontal, 6) .padding(.vertical, 2) - .background(ShortcutHintPillBackground(emphasis: isActive ? 1.0 : 0.9)) + .background(ShortcutHintPillBackground(emphasis: shortcutHintEmphasis)) .offset( x: ShortcutHintDebugSettings.clamped(sidebarShortcutHintXOffset), y: ShortcutHintDebugSettings.clamped(sidebarShortcutHintYOffset) @@ -2573,7 +2658,7 @@ private struct TabItemView: View { if let subtitle = latestNotificationText { Text(subtitle) .font(.system(size: 10)) - .foregroundColor(isActive ? .white.opacity(0.8) : .secondary) + .foregroundColor(activeSecondaryColor(0.8)) .lineLimit(2) .truncationMode(.tail) .multilineTextAlignment(.leading) @@ -2585,7 +2670,7 @@ private struct TabItemView: View { if lhs.timestamp != rhs.timestamp { return lhs.timestamp > rhs.timestamp } return lhs.key < rhs.key }), - isActive: isActive, + isActive: usesInvertedActiveForeground, onFocus: { updateSelection() } ) .transition(.opacity.combined(with: .move(edge: .top))) @@ -2596,10 +2681,10 @@ private struct TabItemView: View { HStack(spacing: 4) { Image(systemName: logLevelIcon(latestLog.level)) .font(.system(size: 8)) - .foregroundColor(logLevelColor(latestLog.level, isActive: isActive)) + .foregroundColor(logLevelColor(latestLog.level, isActive: usesInvertedActiveForeground)) Text(latestLog.message) .font(.system(size: 10)) - .foregroundColor(isActive ? .white.opacity(0.8) : .secondary) + .foregroundColor(activeSecondaryColor(0.8)) .lineLimit(1) .truncationMode(.tail) } @@ -2612,9 +2697,9 @@ private struct TabItemView: View { GeometryReader { geo in ZStack(alignment: .leading) { Capsule() - .fill(isActive ? Color.white.opacity(0.15) : Color.secondary.opacity(0.2)) + .fill(activeProgressTrackColor) Capsule() - .fill(isActive ? Color.white.opacity(0.8) : Color.accentColor) + .fill(activeProgressFillColor) .frame(width: max(0, geo.size.width * CGFloat(progress.value))) } } @@ -2623,7 +2708,7 @@ private struct TabItemView: View { if let label = progress.label { Text(label) .font(.system(size: 9)) - .foregroundColor(isActive ? .white.opacity(0.6) : .secondary) + .foregroundColor(activeSecondaryColor(0.6)) .lineLimit(1) } } @@ -2637,7 +2722,7 @@ private struct TabItemView: View { if sidebarShowGitBranchIcon, sidebarShowGitBranch, verticalRowsContainBranch { Image(systemName: "arrow.triangle.branch") .font(.system(size: 9)) - .foregroundColor(isActive ? .white.opacity(0.6) : .secondary) + .foregroundColor(activeSecondaryColor(0.6)) } VStack(alignment: .leading, spacing: 1) { ForEach(Array(verticalBranchDirectoryLines.enumerated()), id: \.offset) { _, line in @@ -2645,20 +2730,20 @@ private struct TabItemView: View { if let branch = line.branch { Text(branch) .font(.system(size: 10, design: .monospaced)) - .foregroundColor(isActive ? .white.opacity(0.75) : .secondary) + .foregroundColor(activeSecondaryColor(0.75)) .lineLimit(1) .truncationMode(.tail) } if line.branch != nil, line.directory != nil { Image(systemName: "circle.fill") .font(.system(size: 3)) - .foregroundColor(isActive ? .white.opacity(0.6) : .secondary) + .foregroundColor(activeSecondaryColor(0.6)) .padding(.horizontal, 1) } if let directory = line.directory { Text(directory) .font(.system(size: 10, design: .monospaced)) - .foregroundColor(isActive ? .white.opacity(0.75) : .secondary) + .foregroundColor(activeSecondaryColor(0.75)) .lineLimit(1) .truncationMode(.tail) } @@ -2672,11 +2757,11 @@ private struct TabItemView: View { if sidebarShowGitBranch && gitBranchSummaryText != nil && sidebarShowGitBranchIcon { Image(systemName: "arrow.triangle.branch") .font(.system(size: 9)) - .foregroundColor(isActive ? .white.opacity(0.6) : .secondary) + .foregroundColor(activeSecondaryColor(0.6)) } Text(dirRow) .font(.system(size: 10, design: .monospaced)) - .foregroundColor(isActive ? .white.opacity(0.75) : .secondary) + .foregroundColor(activeSecondaryColor(0.75)) .lineLimit(1) .truncationMode(.tail) } @@ -2686,7 +2771,7 @@ private struct TabItemView: View { if sidebarShowPorts, !tab.listeningPorts.isEmpty { Text(tab.listeningPorts.map { ":\($0)" }.joined(separator: ", ")) .font(.system(size: 10, design: .monospaced)) - .foregroundColor(isActive ? .white.opacity(0.75) : .secondary) + .foregroundColor(activeSecondaryColor(0.75)) .lineLimit(1) .truncationMode(.tail) } @@ -2698,6 +2783,20 @@ private struct TabItemView: View { .background( RoundedRectangle(cornerRadius: 6) .fill(backgroundColor) + .overlay { + RoundedRectangle(cornerRadius: 6) + .strokeBorder(activeBorderColor, lineWidth: activeBorderLineWidth) + } + .overlay(alignment: .leading) { + if showsLeadingRail { + Capsule(style: .continuous) + .fill(railColor) + .frame(width: 3) + .padding(.leading, 4) + .padding(.vertical, 5) + .offset(x: -1) + } + } ) .padding(.horizontal, 6) .background { @@ -2765,6 +2864,7 @@ private struct TabItemView: View { } .contextMenu { let targetIds = contextTargetIds() + let tabColorPalette = WorkspaceTabColorSettings.palette() let shouldPin = !tab.isPinned let pinLabel = targetIds.count > 1 ? (shouldPin ? "Pin Workspaces" : "Unpin Workspaces") @@ -2800,6 +2900,38 @@ private struct TabItemView: View { } } + Menu("Tab Color") { + if tab.customColor != nil { + Button { + applyTabColor(nil, targetIds: targetIds) + } label: { + Label("Clear Color", systemImage: "xmark.circle") + } + } + + Button { + promptCustomColor(targetIds: targetIds) + } label: { + Label("Choose Custom Color…", systemImage: "paintpalette") + } + + if !tabColorPalette.isEmpty { + Divider() + } + + ForEach(tabColorPalette, id: \.id) { entry in + Button { + applyTabColor(entry.hex, targetIds: targetIds) + } label: { + Label { + Text(entry.name) + } icon: { + Image(nsImage: coloredCircleImage(color: tabColorSwatchColor(for: entry.hex))) + } + } + } + } + Divider() Button("Move Up") { @@ -2863,13 +2995,50 @@ private struct TabItemView: View { } private var backgroundColor: Color { - if isActive { - return Color.accentColor + switch activeTabIndicatorStyle { + case .leftRail: + if isActive { return Color.accentColor } + if isMultiSelected { return Color.accentColor.opacity(0.25) } + return Color.clear + case .solidFill: + if let custom = resolvedCustomTabColor { + if isActive { return custom } + if isMultiSelected { return custom.opacity(0.35) } + return custom.opacity(0.7) + } + if isActive { return Color.accentColor } + if isMultiSelected { return Color.accentColor.opacity(0.25) } + return Color.clear } - if isMultiSelected { - return Color.accentColor.opacity(0.25) + } + + private var railColor: Color { + explicitRailColor ?? .clear + } + + private var explicitRailColor: Color? { + guard activeTabIndicatorStyle == .leftRail, + let custom = resolvedCustomTabColor else { + return nil } - return Color.clear + return custom.opacity(0.95) + } + + private var resolvedCustomTabColor: Color? { + guard let hex = tab.customColor else { return nil } + return WorkspaceTabColorSettings.displayColor( + hex: hex, + colorScheme: colorScheme, + forceBright: activeTabIndicatorStyle == .leftRail + ) + } + + private func tabColorSwatchColor(for hex: String) -> NSColor { + WorkspaceTabColorSettings.displayNSColor( + hex: hex, + colorScheme: colorScheme, + forceBright: activeTabIndicatorStyle == .leftRail + ) ?? NSColor(hex: hex) ?? .gray } private var showsCenteredTopDropIndicator: Bool { @@ -3142,6 +3311,55 @@ private struct TabItemView: View { return trimmed } + private func applyTabColor(_ hex: String?, targetIds: [UUID]) { + for targetId in targetIds { + tabManager.setTabColor(tabId: targetId, color: hex) + } + } + + private func promptCustomColor(targetIds: [UUID]) { + let alert = NSAlert() + alert.messageText = "Custom Tab Color" + alert.informativeText = "Enter a hex color in the format #RRGGBB." + + let seed = tab.customColor ?? WorkspaceTabColorSettings.customColors().first ?? "" + let input = NSTextField(string: seed) + input.placeholderString = "#1565C0" + input.frame = NSRect(x: 0, y: 0, width: 240, height: 22) + alert.accessoryView = input + alert.addButton(withTitle: "Apply") + alert.addButton(withTitle: "Cancel") + + let alertWindow = alert.window + alertWindow.initialFirstResponder = input + DispatchQueue.main.async { + alertWindow.makeFirstResponder(input) + input.selectText(nil) + } + + let response = alert.runModal() + guard response == .alertFirstButtonReturn else { return } + guard let normalized = WorkspaceTabColorSettings.addCustomColor(input.stringValue) else { + showInvalidColorAlert(input.stringValue) + return + } + applyTabColor(normalized, targetIds: targetIds) + } + + private func showInvalidColorAlert(_ value: String) { + let alert = NSAlert() + alert.alertStyle = .warning + alert.messageText = "Invalid Color" + let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines) + if trimmed.isEmpty { + alert.informativeText = "Enter a hex color in the format #RRGGBB." + } else { + alert.informativeText = "\"\(trimmed)\" is not a valid hex color. Use #RRGGBB." + } + alert.addButton(withTitle: "OK") + _ = alert.runModal() + } + private func promptRename() { let alert = NSAlert() alert.messageText = "Rename Workspace" diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 0bcd5ea6..114a3f78 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -63,6 +63,48 @@ enum SidebarBranchLayoutSettings { } } +enum SidebarActiveTabIndicatorStyle: String, CaseIterable, Identifiable { + case leftRail + case solidFill + + var id: String { rawValue } + + var displayName: String { + switch self { + case .leftRail: + return "Left Rail" + case .solidFill: + return "Solid Fill" + } + } +} + +enum SidebarActiveTabIndicatorSettings { + static let styleKey = "sidebarActiveTabIndicatorStyle" + static let defaultStyle: SidebarActiveTabIndicatorStyle = .solidFill + + static func resolvedStyle(rawValue: String?) -> SidebarActiveTabIndicatorStyle { + guard let rawValue else { return defaultStyle } + if let style = SidebarActiveTabIndicatorStyle(rawValue: rawValue) { + return style + } + + // Legacy values from earlier iterations map to the closest modern option. + switch rawValue { + case "rail": + return .leftRail + case "border", "wash", "lift", "typography", "washRail", "blueWashColorRail": + return .solidFill + default: + return defaultStyle + } + } + + static func current(defaults: UserDefaults = .standard) -> SidebarActiveTabIndicatorStyle { + resolvedStyle(rawValue: defaults.string(forKey: styleKey)) + } +} + enum WorkspacePlacementSettings { static let placementKey = "newWorkspacePlacement" static let defaultPlacement: NewWorkspacePlacement = .afterCurrent @@ -104,6 +146,213 @@ enum WorkspacePlacementSettings { } } +struct WorkspaceTabColorEntry: Equatable, Identifiable { + let name: String + let hex: String + + var id: String { "\(name)-\(hex)" } +} + +enum WorkspaceTabColorSettings { + static let defaultOverridesKey = "workspaceTabColor.defaultOverrides" + static let customColorsKey = "workspaceTabColor.customColors" + static let maxCustomColors = 24 + + private static let originalPRPalette: [WorkspaceTabColorEntry] = [ + WorkspaceTabColorEntry(name: "Red", hex: "#C0392B"), + WorkspaceTabColorEntry(name: "Crimson", hex: "#922B21"), + WorkspaceTabColorEntry(name: "Orange", hex: "#A04000"), + WorkspaceTabColorEntry(name: "Amber", hex: "#7D6608"), + WorkspaceTabColorEntry(name: "Olive", hex: "#4A5C18"), + WorkspaceTabColorEntry(name: "Green", hex: "#196F3D"), + WorkspaceTabColorEntry(name: "Teal", hex: "#006B6B"), + WorkspaceTabColorEntry(name: "Aqua", hex: "#0E6B8C"), + WorkspaceTabColorEntry(name: "Blue", hex: "#1565C0"), + WorkspaceTabColorEntry(name: "Navy", hex: "#1A5276"), + WorkspaceTabColorEntry(name: "Indigo", hex: "#283593"), + WorkspaceTabColorEntry(name: "Purple", hex: "#6A1B9A"), + WorkspaceTabColorEntry(name: "Magenta", hex: "#AD1457"), + WorkspaceTabColorEntry(name: "Rose", hex: "#880E4F"), + WorkspaceTabColorEntry(name: "Brown", hex: "#7B3F00"), + WorkspaceTabColorEntry(name: "Charcoal", hex: "#3E4B5E"), + ] + + static var defaultPalette: [WorkspaceTabColorEntry] { + originalPRPalette + } + + static func palette(defaults: UserDefaults = .standard) -> [WorkspaceTabColorEntry] { + defaultPaletteWithOverrides(defaults: defaults) + customColorEntries(defaults: defaults) + } + + static func defaultPaletteWithOverrides(defaults: UserDefaults = .standard) -> [WorkspaceTabColorEntry] { + let palette = defaultPalette + let overrides = defaultOverrideMap(defaults: defaults) + return palette.map { entry in + WorkspaceTabColorEntry(name: entry.name, hex: overrides[entry.name] ?? entry.hex) + } + } + + static func defaultColorHex(named name: String, defaults: UserDefaults = .standard) -> String { + let palette = defaultPalette + guard let entry = palette.first(where: { $0.name == name }) else { + return palette.first?.hex ?? "#1565C0" + } + return defaultOverrideMap(defaults: defaults)[name] ?? entry.hex + } + + static func setDefaultColor(named name: String, hex: String, defaults: UserDefaults = .standard) { + let palette = defaultPalette + guard let entry = palette.first(where: { $0.name == name }), + let normalized = normalizedHex(hex) else { return } + + var overrides = defaultOverrideMap(defaults: defaults) + if normalized == entry.hex { + overrides.removeValue(forKey: name) + } else { + overrides[name] = normalized + } + saveDefaultOverrideMap(overrides, defaults: defaults) + } + + static func customColors(defaults: UserDefaults = .standard) -> [String] { + guard let raw = defaults.array(forKey: customColorsKey) as? [String] else { return [] } + var result: [String] = [] + var seen: Set<String> = [] + for value in raw { + guard let normalized = normalizedHex(value), seen.insert(normalized).inserted else { continue } + result.append(normalized) + if result.count >= maxCustomColors { break } + } + return result + } + + static func customColorEntries(defaults: UserDefaults = .standard) -> [WorkspaceTabColorEntry] { + customColors(defaults: defaults).enumerated().map { index, hex in + WorkspaceTabColorEntry(name: "Custom \(index + 1)", hex: hex) + } + } + + @discardableResult + static func addCustomColor(_ hex: String, defaults: UserDefaults = .standard) -> String? { + guard let normalized = normalizedHex(hex) else { return nil } + var colors = customColors(defaults: defaults) + colors.removeAll { $0 == normalized } + colors.insert(normalized, at: 0) + setCustomColors(colors, defaults: defaults) + return normalized + } + + static func removeCustomColor(_ hex: String, defaults: UserDefaults = .standard) { + guard let normalized = normalizedHex(hex) else { return } + var colors = customColors(defaults: defaults) + colors.removeAll { $0 == normalized } + setCustomColors(colors, defaults: defaults) + } + + static func setCustomColors(_ hexes: [String], defaults: UserDefaults = .standard) { + var normalizedColors: [String] = [] + var seen: Set<String> = [] + for value in hexes { + guard let normalized = normalizedHex(value), seen.insert(normalized).inserted else { continue } + normalizedColors.append(normalized) + if normalizedColors.count >= maxCustomColors { break } + } + + if normalizedColors.isEmpty { + defaults.removeObject(forKey: customColorsKey) + } else { + defaults.set(normalizedColors, forKey: customColorsKey) + } + } + + static func reset(defaults: UserDefaults = .standard) { + defaults.removeObject(forKey: defaultOverridesKey) + defaults.removeObject(forKey: customColorsKey) + } + + static func normalizedHex(_ raw: String) -> String? { + let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return nil } + let body = trimmed.hasPrefix("#") ? String(trimmed.dropFirst()) : trimmed + guard body.count == 6 else { return nil } + guard UInt64(body, radix: 16) != nil else { return nil } + return "#" + body.uppercased() + } + + static func displayColor( + hex: String, + colorScheme: ColorScheme, + forceBright: Bool = false + ) -> Color? { + guard let color = displayNSColor(hex: hex, colorScheme: colorScheme, forceBright: forceBright) else { + return nil + } + return Color(nsColor: color) + } + + static func displayNSColor( + hex: String, + colorScheme: ColorScheme, + forceBright: Bool = false + ) -> NSColor? { + guard let normalized = normalizedHex(hex), + let baseColor = NSColor(hex: normalized) else { + return nil + } + + if forceBright || colorScheme == .dark { + return brightenedForDarkAppearance(baseColor) + } + return baseColor + } + + private static func defaultOverrideMap(defaults: UserDefaults) -> [String: String] { + guard let raw = defaults.dictionary(forKey: defaultOverridesKey) as? [String: String] else { return [:] } + let validNames = Set(defaultPalette.map(\.name)) + var normalized: [String: String] = [:] + for (name, hex) in raw { + guard validNames.contains(name), + let normalizedHex = normalizedHex(hex) else { continue } + normalized[name] = normalizedHex + } + return normalized + } + + private static func saveDefaultOverrideMap(_ map: [String: String], defaults: UserDefaults) { + if map.isEmpty { + defaults.removeObject(forKey: defaultOverridesKey) + } else { + defaults.set(map, forKey: defaultOverridesKey) + } + } + + private static func brightenedForDarkAppearance(_ color: NSColor) -> NSColor { + let rgbColor = color.usingColorSpace(.sRGB) ?? color + var hue: CGFloat = 0 + var saturation: CGFloat = 0 + var brightness: CGFloat = 0 + var alpha: CGFloat = 0 + rgbColor.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) + + let boostedBrightness = min(1, max(brightness, 0.62) + ((1 - brightness) * 0.28)) + // Preserve neutral grays when brightening to avoid introducing hue shifts. + let boostedSaturation: CGFloat + if saturation <= 0.08 { + boostedSaturation = saturation + } else { + boostedSaturation = min(1, saturation + ((1 - saturation) * 0.12)) + } + + return NSColor( + hue: hue, + saturation: boostedSaturation, + brightness: boostedBrightness, + alpha: alpha + ) + } +} + /// Coalesces repeated main-thread signals into one callback after a short delay. /// Useful for notification storms where only the latest update matters. final class NotificationBurstCoalescer { @@ -632,6 +881,11 @@ class TabManager: ObservableObject { setCustomTitle(tabId: tabId, title: nil) } + func setTabColor(tabId: UUID, color: String?) { + guard let tab = tabs.first(where: { $0.id == tabId }) else { return } + tab.setCustomColor(color) + } + func togglePin(tabId: UUID) { guard let index = tabs.firstIndex(where: { $0.id == tabId }) else { return } let tab = tabs[index] diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 547cd84b..bb0345d4 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -243,6 +243,7 @@ final class Workspace: Identifiable, ObservableObject { @Published var title: String @Published var customTitle: String? @Published var isPinned: Bool = false + @Published var customColor: String? // hex string, e.g. "#C0392B" @Published var currentDirectory: String /// Ordinal for CMUX_PORT range assignment (monotonically increasing per app session) @@ -755,6 +756,10 @@ final class Workspace: Identifiable, ObservableObject { self.title = title } + func setCustomColor(_ hex: String?) { + customColor = hex + } + func setCustomTitle(_ title: String?) { let trimmed = title?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" if trimmed.isEmpty { diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 60190705..024d1ce8 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -298,6 +298,10 @@ struct cmuxApp: App { appDelegate.openDebugScrollbackTab(nil) } + Button("Open Workspaces for All Tab Colors") { + appDelegate.openDebugColorComparisonWorkspaces(nil) + } + Divider() Menu("Debug Windows") { Button("Debug Window Controls…") { @@ -1223,6 +1227,7 @@ private enum DebugWindowConfigSnapshot { sidebarTintOpacity=\(String(format: "%.2f", doubleValue(defaults, key: "sidebarTintOpacity", fallback: 0.18))) sidebarCornerRadius=\(String(format: "%.1f", doubleValue(defaults, key: "sidebarCornerRadius", fallback: 0.0))) sidebarBranchVerticalLayout=\(boolValue(defaults, key: SidebarBranchLayoutSettings.key, fallback: SidebarBranchLayoutSettings.defaultVerticalLayout)) + sidebarActiveTabIndicatorStyle=\(stringValue(defaults, key: SidebarActiveTabIndicatorSettings.styleKey, fallback: SidebarActiveTabIndicatorSettings.defaultStyle.rawValue)) shortcutHintSidebarXOffset=\(String(format: "%.1f", doubleValue(defaults, key: ShortcutHintDebugSettings.sidebarHintXKey, fallback: ShortcutHintDebugSettings.defaultSidebarHintX))) shortcutHintSidebarYOffset=\(String(format: "%.1f", doubleValue(defaults, key: ShortcutHintDebugSettings.sidebarHintYKey, fallback: ShortcutHintDebugSettings.defaultSidebarHintY))) shortcutHintTitlebarXOffset=\(String(format: "%.1f", doubleValue(defaults, key: ShortcutHintDebugSettings.titlebarHintXKey, fallback: ShortcutHintDebugSettings.defaultTitlebarHintX))) @@ -1319,6 +1324,8 @@ private struct DebugWindowControlsView: View { @AppStorage(ShortcutHintDebugSettings.paneHintXKey) private var paneShortcutHintXOffset = ShortcutHintDebugSettings.defaultPaneHintX @AppStorage(ShortcutHintDebugSettings.paneHintYKey) private var paneShortcutHintYOffset = ShortcutHintDebugSettings.defaultPaneHintY @AppStorage(ShortcutHintDebugSettings.alwaysShowHintsKey) private var alwaysShowShortcutHints = ShortcutHintDebugSettings.defaultAlwaysShowHints + @AppStorage(SidebarActiveTabIndicatorSettings.styleKey) + private var sidebarActiveTabIndicatorStyle = SidebarActiveTabIndicatorSettings.defaultStyle.rawValue @AppStorage("debugTitlebarLeadingExtra") private var titlebarLeadingExtra: Double = 0 @AppStorage(BrowserDevToolsButtonDebugSettings.iconNameKey) private var browserDevToolsIconNameRaw = BrowserDevToolsButtonDebugSettings.defaultIcon.rawValue @AppStorage(BrowserDevToolsButtonDebugSettings.iconColorKey) private var browserDevToolsIconColorRaw = BrowserDevToolsButtonDebugSettings.defaultColor.rawValue @@ -1331,6 +1338,17 @@ private struct DebugWindowControlsView: View { BrowserDevToolsIconColorOption(rawValue: browserDevToolsIconColorRaw) ?? BrowserDevToolsButtonDebugSettings.defaultColor } + private var selectedSidebarActiveTabIndicatorStyle: SidebarActiveTabIndicatorStyle { + SidebarActiveTabIndicatorSettings.resolvedStyle(rawValue: sidebarActiveTabIndicatorStyle) + } + + private var sidebarIndicatorStyleSelection: Binding<String> { + Binding( + get: { selectedSidebarActiveTabIndicatorStyle.rawValue }, + set: { sidebarActiveTabIndicatorStyle = $0 } + ) + } + var body: some View { ScrollView { VStack(alignment: .leading, spacing: 14) { @@ -1396,6 +1414,22 @@ private struct DebugWindowControlsView: View { .padding(.top, 2) } + GroupBox("Active Workspace Indicator") { + VStack(alignment: .leading, spacing: 8) { + Picker("Style", selection: sidebarIndicatorStyleSelection) { + ForEach(SidebarActiveTabIndicatorStyle.allCases) { style in + Text(style.displayName).tag(style.rawValue) + } + } + .pickerStyle(.menu) + + Button("Reset Indicator Style") { + sidebarActiveTabIndicatorStyle = SidebarActiveTabIndicatorSettings.defaultStyle.rawValue + } + } + .padding(.top, 2) + } + GroupBox("Titlebar Spacing") { VStack(alignment: .leading, spacing: 6) { HStack(spacing: 8) { @@ -1797,6 +1831,19 @@ private struct SidebarDebugView: View { @AppStorage(ShortcutHintDebugSettings.paneHintXKey) private var paneShortcutHintXOffset = ShortcutHintDebugSettings.defaultPaneHintX @AppStorage(ShortcutHintDebugSettings.paneHintYKey) private var paneShortcutHintYOffset = ShortcutHintDebugSettings.defaultPaneHintY @AppStorage(ShortcutHintDebugSettings.alwaysShowHintsKey) private var alwaysShowShortcutHints = ShortcutHintDebugSettings.defaultAlwaysShowHints + @AppStorage(SidebarActiveTabIndicatorSettings.styleKey) + private var sidebarActiveTabIndicatorStyle = SidebarActiveTabIndicatorSettings.defaultStyle.rawValue + + private var selectedSidebarIndicatorStyle: SidebarActiveTabIndicatorStyle { + SidebarActiveTabIndicatorSettings.resolvedStyle(rawValue: sidebarActiveTabIndicatorStyle) + } + + private var sidebarIndicatorStyleSelection: Binding<String> { + Binding( + get: { selectedSidebarIndicatorStyle.rawValue }, + set: { sidebarActiveTabIndicatorStyle = $0 } + ) + } var body: some View { ScrollView { @@ -1898,6 +1945,17 @@ private struct SidebarDebugView: View { .padding(.top, 2) } + GroupBox("Active Workspace Indicator") { + VStack(alignment: .leading, spacing: 8) { + Picker("Style", selection: sidebarIndicatorStyleSelection) { + ForEach(SidebarActiveTabIndicatorStyle.allCases) { style in + Text(style.displayName).tag(style.rawValue) + } + } + } + .padding(.top, 2) + } + GroupBox("Workspace Metadata") { VStack(alignment: .leading, spacing: 8) { Toggle("Render branch list vertically", isOn: $sidebarBranchVerticalLayout) @@ -1925,6 +1983,9 @@ private struct SidebarDebugView: View { Button("Reset Hints") { resetShortcutHintOffsets() } + Button("Reset Active Indicator") { + sidebarActiveTabIndicatorStyle = SidebarActiveTabIndicatorSettings.defaultStyle.rawValue + } } Button("Copy Config") { @@ -1992,6 +2053,7 @@ private struct SidebarDebugView: View { sidebarTintOpacity=\(String(format: "%.2f", sidebarTintOpacity)) sidebarCornerRadius=\(String(format: "%.1f", sidebarCornerRadius)) sidebarBranchVerticalLayout=\(sidebarBranchVerticalLayout) + sidebarActiveTabIndicatorStyle=\(sidebarActiveTabIndicatorStyle) shortcutHintSidebarXOffset=\(String(format: "%.1f", ShortcutHintDebugSettings.clamped(sidebarShortcutHintXOffset))) shortcutHintSidebarYOffset=\(String(format: "%.1f", ShortcutHintDebugSettings.clamped(sidebarShortcutHintYOffset))) shortcutHintTitlebarXOffset=\(String(format: "%.1f", ShortcutHintDebugSettings.clamped(titlebarShortcutHintXOffset))) @@ -2505,6 +2567,8 @@ struct SettingsView: View { @AppStorage(WorkspacePlacementSettings.placementKey) private var newWorkspacePlacement = WorkspacePlacementSettings.defaultPlacement.rawValue @AppStorage(WorkspaceAutoReorderSettings.key) private var workspaceAutoReorder = WorkspaceAutoReorderSettings.defaultValue @AppStorage(SidebarBranchLayoutSettings.key) private var sidebarBranchVerticalLayout = SidebarBranchLayoutSettings.defaultVerticalLayout + @AppStorage(SidebarActiveTabIndicatorSettings.styleKey) + private var sidebarActiveTabIndicatorStyle = SidebarActiveTabIndicatorSettings.defaultStyle.rawValue @State private var shortcutResetToken = UUID() @State private var topBlurOpacity: Double = 0 @State private var topBlurBaselineOffset: CGFloat? @@ -2517,11 +2581,24 @@ struct SettingsView: View { @State private var socketPasswordDraft = "" @State private var socketPasswordStatusMessage: String? @State private var socketPasswordStatusIsError = false + @State private var workspaceTabDefaultEntries = WorkspaceTabColorSettings.defaultPaletteWithOverrides() + @State private var workspaceTabCustomColors = WorkspaceTabColorSettings.customColors() private var selectedWorkspacePlacement: NewWorkspacePlacement { NewWorkspacePlacement(rawValue: newWorkspacePlacement) ?? WorkspacePlacementSettings.defaultPlacement } + private var selectedSidebarActiveTabIndicatorStyle: SidebarActiveTabIndicatorStyle { + SidebarActiveTabIndicatorSettings.resolvedStyle(rawValue: sidebarActiveTabIndicatorStyle) + } + + private var sidebarIndicatorStyleSelection: Binding<String> { + Binding( + get: { selectedSidebarActiveTabIndicatorStyle.rawValue }, + set: { sidebarActiveTabIndicatorStyle = $0 } + ) + } + private var selectedSocketControlMode: SocketControlMode { SocketControlSettings.migrateMode(socketControlMode) } @@ -2683,6 +2760,97 @@ struct SettingsView: View { .labelsHidden() .pickerStyle(.menu) } + + SettingsCardDivider() + + SettingsCardRow( + "Active Workspace Indicator", + controlWidth: pickerColumnWidth + ) { + Picker("", selection: sidebarIndicatorStyleSelection) { + ForEach(SidebarActiveTabIndicatorStyle.allCases) { style in + Text(style.displayName).tag(style.rawValue) + } + } + .labelsHidden() + .pickerStyle(.menu) + } + } + + SettingsSectionHeader(title: "Workspace Colors") + SettingsCard { + SettingsCardNote("Customize the workspace color palette used by Sidebar > Tab Color. \"Choose Custom Color...\" entries are persisted below.") + + ForEach(Array(workspaceTabDefaultEntries.enumerated()), id: \.element.name) { index, entry in + if index > 0 { + SettingsCardDivider() + } + SettingsCardRow( + entry.name, + subtitle: "Base: \(baseTabColorHex(for: entry.name))" + ) { + HStack(spacing: 8) { + ColorPicker( + "", + selection: defaultTabColorBinding(for: entry.name), + supportsOpacity: false + ) + .labelsHidden() + .frame(width: 38) + + Text(entry.hex) + .font(.system(size: 12, weight: .medium, design: .monospaced)) + .foregroundStyle(.secondary) + .frame(width: 76, alignment: .trailing) + } + } + } + + SettingsCardDivider() + + if workspaceTabCustomColors.isEmpty { + SettingsCardNote("Custom colors: none yet. Use \"Choose Custom Color...\" from a workspace context menu.") + } else { + VStack(alignment: .leading, spacing: 8) { + Text("Custom Colors") + .font(.system(size: 13, weight: .semibold)) + + ForEach(workspaceTabCustomColors, id: \.self) { hex in + HStack(spacing: 8) { + Circle() + .fill(Color(nsColor: NSColor(hex: hex) ?? .gray)) + .frame(width: 11, height: 11) + + Text(hex) + .font(.system(size: 12, weight: .medium, design: .monospaced)) + .foregroundStyle(.secondary) + + Spacer(minLength: 8) + + Button("Remove") { + removeWorkspaceCustomColor(hex) + } + .buttonStyle(.bordered) + .controlSize(.small) + } + } + } + .padding(.horizontal, 14) + .padding(.vertical, 10) + } + + SettingsCardDivider() + + SettingsCardRow( + "Reset Palette", + subtitle: "Restore built-in defaults and clear all custom colors." + ) { + Button("Reset") { + resetWorkspaceTabColors() + } + .buttonStyle(.bordered) + .controlSize(.small) + } } SettingsSectionHeader(title: "Automation") @@ -3081,6 +3249,7 @@ struct SettingsView: View { browserForcedDarkModeOpacity = BrowserForcedDarkModeSettings.normalizedOpacity(browserForcedDarkModeOpacity) browserHistoryEntryCount = BrowserHistoryStore.shared.entries.count browserInsecureHTTPAllowlistDraft = browserInsecureHTTPAllowlist + reloadWorkspaceTabColorSettings() } .onChange(of: browserInsecureHTTPAllowlist) { oldValue, newValue in // Keep draft in sync with external changes unless the user has local unsaved edits. @@ -3091,6 +3260,9 @@ struct SettingsView: View { .onReceive(BrowserHistoryStore.shared.$entries) { entries in browserHistoryEntryCount = entries.count } + .onReceive(NotificationCenter.default.publisher(for: UserDefaults.didChangeNotification)) { _ in + reloadWorkspaceTabColorSettings() + } .confirmationDialog( "Clear browser history?", isPresented: $showClearBrowserHistoryConfirmation, @@ -3137,15 +3309,53 @@ struct SettingsView: View { newWorkspacePlacement = WorkspacePlacementSettings.defaultPlacement.rawValue workspaceAutoReorder = WorkspaceAutoReorderSettings.defaultValue sidebarBranchVerticalLayout = SidebarBranchLayoutSettings.defaultVerticalLayout + sidebarActiveTabIndicatorStyle = SidebarActiveTabIndicatorSettings.defaultStyle.rawValue showOpenAccessConfirmation = false pendingOpenAccessMode = nil socketPasswordDraft = "" socketPasswordStatusMessage = nil socketPasswordStatusIsError = false KeyboardShortcutSettings.resetAll() + WorkspaceTabColorSettings.reset() + reloadWorkspaceTabColorSettings() shortcutResetToken = UUID() } + private func defaultTabColorBinding(for name: String) -> Binding<Color> { + Binding( + get: { + let hex = WorkspaceTabColorSettings.defaultColorHex(named: name) + return Color(nsColor: NSColor(hex: hex) ?? .systemBlue) + }, + set: { newValue in + let hex = NSColor(newValue).hexString() + WorkspaceTabColorSettings.setDefaultColor(named: name, hex: hex) + reloadWorkspaceTabColorSettings() + } + ) + } + + private func baseTabColorHex(for name: String) -> String { + WorkspaceTabColorSettings.defaultPalette + .first(where: { $0.name == name })? + .hex ?? "#1565C0" + } + + private func removeWorkspaceCustomColor(_ hex: String) { + WorkspaceTabColorSettings.removeCustomColor(hex) + reloadWorkspaceTabColorSettings() + } + + private func resetWorkspaceTabColors() { + WorkspaceTabColorSettings.reset() + reloadWorkspaceTabColorSettings() + } + + private func reloadWorkspaceTabColorSettings() { + workspaceTabDefaultEntries = WorkspaceTabColorSettings.defaultPaletteWithOverrides() + workspaceTabCustomColors = WorkspaceTabColorSettings.customColors() + } + private func saveBrowserInsecureHTTPAllowlist() { browserInsecureHTTPAllowlist = browserInsecureHTTPAllowlistDraft } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 0cd08c71..01777355 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1,5 +1,6 @@ import XCTest import AppKit +import SwiftUI import WebKit import SwiftUI import ObjectiveC.runtime @@ -1066,6 +1067,171 @@ final class WorkspacePlacementSettingsTests: XCTestCase { } } +final class WorkspaceTabColorSettingsTests: XCTestCase { + func testNormalizedHexAcceptsAndNormalizesValidInput() { + XCTAssertEqual(WorkspaceTabColorSettings.normalizedHex("#abc123"), "#ABC123") + XCTAssertEqual(WorkspaceTabColorSettings.normalizedHex(" aBcDeF "), "#ABCDEF") + XCTAssertNil(WorkspaceTabColorSettings.normalizedHex("#1234")) + XCTAssertNil(WorkspaceTabColorSettings.normalizedHex("#GG1234")) + } + + func testBuiltInPaletteMatchesOriginalPRPalette() { + let suiteName = "WorkspaceTabColorSettingsTests.BuiltInPalette.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Failed to create isolated UserDefaults suite") + return + } + defer { defaults.removePersistentDomain(forName: suiteName) } + + let palette = WorkspaceTabColorSettings.defaultPaletteWithOverrides(defaults: defaults) + XCTAssertEqual(palette.count, 16) + XCTAssertEqual(palette.first?.name, "Red") + XCTAssertEqual(palette.first?.hex, "#C0392B") + XCTAssertEqual(palette.last?.name, "Charcoal") + XCTAssertFalse(palette.contains(where: { $0.name == "Gold" })) + } + + func testDefaultOverrideRoundTripFallsBackWhenResetToBase() { + let suiteName = "WorkspaceTabColorSettingsTests.DefaultOverride.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Failed to create isolated UserDefaults suite") + return + } + defer { defaults.removePersistentDomain(forName: suiteName) } + + let first = WorkspaceTabColorSettings.defaultPalette[0] + XCTAssertEqual( + WorkspaceTabColorSettings.defaultColorHex(named: first.name, defaults: defaults), + first.hex + ) + + WorkspaceTabColorSettings.setDefaultColor(named: first.name, hex: "#00aa33", defaults: defaults) + XCTAssertEqual( + WorkspaceTabColorSettings.defaultColorHex(named: first.name, defaults: defaults), + "#00AA33" + ) + + WorkspaceTabColorSettings.setDefaultColor(named: first.name, hex: first.hex, defaults: defaults) + XCTAssertEqual( + WorkspaceTabColorSettings.defaultColorHex(named: first.name, defaults: defaults), + first.hex + ) + } + + func testAddCustomColorPersistsAndDeduplicatesByMostRecent() { + let suiteName = "WorkspaceTabColorSettingsTests.CustomColors.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Failed to create isolated UserDefaults suite") + return + } + defer { defaults.removePersistentDomain(forName: suiteName) } + + XCTAssertEqual( + WorkspaceTabColorSettings.addCustomColor(" #00aa33 ", defaults: defaults), + "#00AA33" + ) + XCTAssertEqual( + WorkspaceTabColorSettings.addCustomColor("#112233", defaults: defaults), + "#112233" + ) + XCTAssertEqual( + WorkspaceTabColorSettings.addCustomColor("#00AA33", defaults: defaults), + "#00AA33" + ) + XCTAssertNil(WorkspaceTabColorSettings.addCustomColor("nope", defaults: defaults)) + + XCTAssertEqual( + WorkspaceTabColorSettings.customColors(defaults: defaults), + ["#00AA33", "#112233"] + ) + } + + func testPaletteIncludesCustomEntriesAndResetClearsAll() { + let suiteName = "WorkspaceTabColorSettingsTests.Reset.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Failed to create isolated UserDefaults suite") + return + } + defer { defaults.removePersistentDomain(forName: suiteName) } + + let first = WorkspaceTabColorSettings.defaultPalette[0] + WorkspaceTabColorSettings.setDefaultColor(named: first.name, hex: "#334455", defaults: defaults) + _ = WorkspaceTabColorSettings.addCustomColor("#778899", defaults: defaults) + + let paletteBeforeReset = WorkspaceTabColorSettings.palette(defaults: defaults) + XCTAssertEqual(paletteBeforeReset.count, WorkspaceTabColorSettings.defaultPalette.count + 1) + XCTAssertEqual(paletteBeforeReset[0].hex, "#334455") + XCTAssertEqual(paletteBeforeReset.last?.name, "Custom 1") + XCTAssertEqual(paletteBeforeReset.last?.hex, "#778899") + + WorkspaceTabColorSettings.reset(defaults: defaults) + + XCTAssertEqual(WorkspaceTabColorSettings.customColors(defaults: defaults), []) + XCTAssertEqual( + WorkspaceTabColorSettings.defaultColorHex(named: first.name, defaults: defaults), + first.hex + ) + } + + func testDisplayColorLightModeKeepsOriginalHex() { + let originalHex = "#1A5276" + let rendered = WorkspaceTabColorSettings.displayNSColor( + hex: originalHex, + colorScheme: .light + ) + + XCTAssertEqual(rendered?.hexString(), originalHex) + } + + func testDisplayColorDarkModeBrightensColor() { + let originalHex = "#1A5276" + guard let base = NSColor(hex: originalHex), + let rendered = WorkspaceTabColorSettings.displayNSColor( + hex: originalHex, + colorScheme: .dark + ) else { + XCTFail("Expected valid color conversion") + return + } + + XCTAssertNotEqual(rendered.hexString(), originalHex) + XCTAssertGreaterThan(rendered.luminance, base.luminance) + } + + func testDisplayColorDarkModeKeepsGrayscaleNeutral() { + let originalHex = "#808080" + guard let base = NSColor(hex: originalHex), + let rendered = WorkspaceTabColorSettings.displayNSColor( + hex: originalHex, + colorScheme: .dark + ), + let renderedSRGB = rendered.usingColorSpace(.sRGB) else { + XCTFail("Expected valid color conversion") + return + } + + XCTAssertGreaterThan(rendered.luminance, base.luminance) + XCTAssertLessThan(abs(renderedSRGB.redComponent - renderedSRGB.greenComponent), 0.003) + XCTAssertLessThan(abs(renderedSRGB.greenComponent - renderedSRGB.blueComponent), 0.003) + } + + func testDisplayColorForceBrightensInLightMode() { + let originalHex = "#1A5276" + guard let base = NSColor(hex: originalHex), + let rendered = WorkspaceTabColorSettings.displayNSColor( + hex: originalHex, + colorScheme: .light, + forceBright: true + ) else { + XCTFail("Expected valid color conversion") + return + } + + XCTAssertNotEqual(rendered.hexString(), originalHex) + XCTAssertGreaterThan(rendered.luminance, base.luminance) + } +} + final class WorkspaceAutoReorderSettingsTests: XCTestCase { func testDefaultIsEnabled() { let suiteName = "WorkspaceAutoReorderSettingsTests.Default.\(UUID().uuidString)" @@ -1131,6 +1297,44 @@ final class SidebarBranchLayoutSettingsTests: XCTestCase { } } +final class SidebarActiveTabIndicatorSettingsTests: XCTestCase { + func testDefaultStyleWhenUnset() { + let suiteName = "SidebarActiveTabIndicatorSettingsTests.Default.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Failed to create isolated UserDefaults suite") + return + } + defer { defaults.removePersistentDomain(forName: suiteName) } + + defaults.removeObject(forKey: SidebarActiveTabIndicatorSettings.styleKey) + XCTAssertEqual( + SidebarActiveTabIndicatorSettings.current(defaults: defaults), + SidebarActiveTabIndicatorSettings.defaultStyle + ) + } + + func testStoredStyleParsesAndInvalidFallsBack() { + let suiteName = "SidebarActiveTabIndicatorSettingsTests.Stored.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Failed to create isolated UserDefaults suite") + return + } + defer { defaults.removePersistentDomain(forName: suiteName) } + + defaults.set(SidebarActiveTabIndicatorStyle.leftRail.rawValue, forKey: SidebarActiveTabIndicatorSettings.styleKey) + XCTAssertEqual(SidebarActiveTabIndicatorSettings.current(defaults: defaults), .leftRail) + + defaults.set("rail", forKey: SidebarActiveTabIndicatorSettings.styleKey) + XCTAssertEqual(SidebarActiveTabIndicatorSettings.current(defaults: defaults), .leftRail) + + defaults.set("not-a-style", forKey: SidebarActiveTabIndicatorSettings.styleKey) + XCTAssertEqual( + SidebarActiveTabIndicatorSettings.current(defaults: defaults), + SidebarActiveTabIndicatorSettings.defaultStyle + ) + } +} + final class AppearanceSettingsTests: XCTestCase { func testResolvedModeDefaultsToSystemWhenUnset() { let suiteName = "AppearanceSettingsTests.Default.\(UUID().uuidString)" diff --git a/cmuxUITests/UpdatePillUITests.swift b/cmuxUITests/UpdatePillUITests.swift index 88c00b53..b8abb185 100644 --- a/cmuxUITests/UpdatePillUITests.swift +++ b/cmuxUITests/UpdatePillUITests.swift @@ -1,6 +1,24 @@ import XCTest import Foundation +// UI runners can adjust wall clock time mid-test; use monotonic uptime for polling deadlines. +private func pollUntil( + timeout: TimeInterval, + pollInterval: TimeInterval = 0.05, + condition: () -> Bool +) -> Bool { + let start = ProcessInfo.processInfo.systemUptime + while true { + if condition() { + return true + } + if (ProcessInfo.processInfo.systemUptime - start) >= timeout { + return false + } + RunLoop.current.run(until: Date().addingTimeInterval(pollInterval)) + } +} + final class UpdatePillUITests: XCTestCase { override func setUp() { super.setUp() @@ -131,25 +149,28 @@ final class UpdatePillUITests: XCTestCase { } private func waitForWindowCount(atLeast count: Int, app: XCUIApplication, timeout: TimeInterval) -> Bool { - let deadline = Date().addingTimeInterval(timeout) - while Date() < deadline { - if app.windows.count >= count { return true } - RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + pollUntil(timeout: timeout) { + app.windows.count >= count } - return app.windows.count >= count } private func assertVisibleSize(_ element: XCUIElement, timeout: TimeInterval = 2.0) { - let deadline = Date().addingTimeInterval(timeout) + let pollInterval: TimeInterval = 0.05 var size = element.frame.size - while Date() < deadline { + var exists = element.exists + var hittable = element.isHittable + + let visible = pollUntil(timeout: timeout, pollInterval: pollInterval) { size = element.frame.size - if size.width > 20 && size.height > 10 { - return - } - RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + exists = element.exists + hittable = element.isHittable + return size.width > 20 && size.height > 10 + } + if !visible { + XCTFail( + "Expected UpdatePill to have visible size, got \(size), exists=\(exists), hittable=\(hittable)" + ) } - XCTFail("Expected UpdatePill to have visible size, got \(size)") } private func attachScreenshot(name: String, screenshot: XCUIScreenshot = XCUIScreen.main.screenshot()) { @@ -197,12 +218,14 @@ final class UpdatePillUITests: XCTestCase { private func launchAndActivate(_ app: XCUIApplication, activateTimeout: TimeInterval = 2.0) { app.launch() - let deadline = Date().addingTimeInterval(activateTimeout) - while Date() < deadline, app.state != .runningForeground { + let activated = pollUntil(timeout: activateTimeout) { + guard app.state != .runningForeground else { + return true + } app.activate() - RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + return app.state == .runningForeground } - if app.state != .runningForeground { + if !activated { app.activate() } } @@ -293,40 +316,32 @@ final class TitlebarShortcutHintsUITests: XCTestCase { app.launchArguments += ["-shortcutHintTitlebarYOffset", "0"] app.launch() - let deadline = Date().addingTimeInterval(2.0) - while Date() < deadline, app.state != .runningForeground { + _ = pollUntil(timeout: 2.0) { + guard app.state != .runningForeground else { + return true + } app.activate() - RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + return app.state == .runningForeground } return app } private func waitForWindowCount(atLeast count: Int, app: XCUIApplication, timeout: TimeInterval) -> Bool { - let deadline = Date().addingTimeInterval(timeout) - while Date() < deadline { - if app.windows.count >= count { return true } - RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + pollUntil(timeout: timeout) { + app.windows.count >= count } - return app.windows.count >= count } private func waitForElementVisible(_ element: XCUIElement, timeout: TimeInterval) -> Bool { - let deadline = Date().addingTimeInterval(timeout) - while Date() < deadline { + pollUntil(timeout: timeout) { if element.exists { let frame = element.frame if frame.width > 1, frame.height > 1 { return true } } - RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + return false } - - if element.exists { - let frame = element.frame - return frame.width > 1 && frame.height > 1 - } - return false } } diff --git a/skills/cmux-debug-windows/scripts/debug_windows_snapshot.sh b/skills/cmux-debug-windows/scripts/debug_windows_snapshot.sh index ac08502d..7798e8e7 100755 --- a/skills/cmux-debug-windows/scripts/debug_windows_snapshot.sh +++ b/skills/cmux-debug-windows/scripts/debug_windows_snapshot.sh @@ -93,6 +93,7 @@ sidebarBlurOpacity="$(format_number "$(read_value sidebarBlurOpacity 0.79)" 2)" sidebarTintHex="$(read_value sidebarTintHex '#101010')" sidebarTintOpacity="$(format_number "$(read_value sidebarTintOpacity 0.54)" 2)" sidebarCornerRadius="$(format_number "$(read_value sidebarCornerRadius 0.0)" 1)" +sidebarActiveTabIndicatorStyle="$(read_value sidebarActiveTabIndicatorStyle solidFill)" shortcutHintSidebarXOffset="$(format_number "$(read_value shortcutHintSidebarXOffset 0.0)" 1)" shortcutHintSidebarYOffset="$(format_number "$(read_value shortcutHintSidebarYOffset 0.0)" 1)" shortcutHintTitlebarXOffset="$(format_number "$(read_value shortcutHintTitlebarXOffset 4.0)" 1)" @@ -141,6 +142,7 @@ sidebarBlurOpacity=$sidebarBlurOpacity sidebarTintHex=$sidebarTintHex sidebarTintOpacity=$sidebarTintOpacity sidebarCornerRadius=$sidebarCornerRadius +sidebarActiveTabIndicatorStyle=$sidebarActiveTabIndicatorStyle shortcutHintSidebarXOffset=$shortcutHintSidebarXOffset shortcutHintSidebarYOffset=$shortcutHintSidebarYOffset shortcutHintTitlebarXOffset=$shortcutHintTitlebarXOffset From d496a07a84464a449ebe5e80f8d603b68932c25c Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 17:41:10 -0800 Subject: [PATCH 077/214] Hide new-tab toggles and align dark-mode button styling (#322) * Hide new-tab browser toggles and align dark-mode button style * Switch forced dark mode from dimming overlay to dark theme * Add tri-state browser theme mode for embedded web view * Hide browser theme menu chevron in toolbar * Use outline icons for browser theme toggle * Align browser theme icon tint with DevTools button * Force monochrome rendering for browser toolbar icons * Reduce browser theme icon weight for visual parity * Tune browser theme icon stroke for perceptual color match * Force flat SF Symbol color rendering for toolbar icons * Use button popover for browser theme selector --- Sources/Panels/BrowserPanel.swift | 162 +++++++++++------- Sources/Panels/BrowserPanelView.swift | 128 +++++++++----- Sources/cmuxApp.swift | 65 +++---- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 62 +++++-- 4 files changed, 260 insertions(+), 157 deletions(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 0e9b565e..ee3452d2 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -64,31 +64,62 @@ enum BrowserSearchSettings { } } -enum BrowserForcedDarkModeSettings { - static let enabledKey = "browserForcedDarkModeEnabled" - static let opacityKey = "browserForcedDarkModeOpacity" - static let defaultEnabled: Bool = false - static let defaultOpacity: Double = 45 - static let minOpacity: Double = 5 - static let maxOpacity: Double = 90 +enum BrowserThemeMode: String, CaseIterable, Identifiable { + case system + case light + case dark - static func enabled(defaults: UserDefaults = .standard) -> Bool { - if defaults.object(forKey: enabledKey) == nil { - return defaultEnabled + var id: String { rawValue } + + var displayName: String { + switch self { + case .system: + return "System" + case .light: + return "Light" + case .dark: + return "Dark" } - return defaults.bool(forKey: enabledKey) } - static func opacity(defaults: UserDefaults = .standard) -> Double { - if defaults.object(forKey: opacityKey) == nil { - return defaultOpacity + var iconName: String { + switch self { + case .system: + return "circle.lefthalf.filled" + case .light: + return "sun.max" + case .dark: + return "moon" } - return normalizedOpacity(defaults.double(forKey: opacityKey)) + } +} + +enum BrowserThemeSettings { + static let modeKey = "browserThemeMode" + static let legacyForcedDarkModeEnabledKey = "browserForcedDarkModeEnabled" + static let defaultMode: BrowserThemeMode = .system + + static func mode(for rawValue: String?) -> BrowserThemeMode { + guard let rawValue, let mode = BrowserThemeMode(rawValue: rawValue) else { + return defaultMode + } + return mode } - static func normalizedOpacity(_ rawValue: Double) -> Double { - guard rawValue.isFinite else { return defaultOpacity } - return min(maxOpacity, max(minOpacity, rawValue)) + static func mode(defaults: UserDefaults = .standard) -> BrowserThemeMode { + let resolvedMode = mode(for: defaults.string(forKey: modeKey)) + if defaults.string(forKey: modeKey) != nil { + return resolvedMode + } + + // Migrate the legacy bool toggle only when the new mode key is unset. + if defaults.object(forKey: legacyForcedDarkModeEnabledKey) != nil { + let migratedMode: BrowserThemeMode = defaults.bool(forKey: legacyForcedDarkModeEnabledKey) ? .dark : .system + defaults.set(migratedMode.rawValue, forKey: modeKey) + return migratedMode + } + + return defaultMode } } @@ -1097,6 +1128,11 @@ final class BrowserPanel: Panel, ObservableObject { /// New browser tabs stay in an empty "new tab" state until first navigation. @Published private(set) var shouldRenderWebView: Bool = false + /// True when the browser is showing the internal empty new-tab page (no WKWebView attached yet). + var isShowingNewTabPage: Bool { + !shouldRenderWebView + } + /// Published page title @Published private(set) var pageTitle: String = "" @@ -1152,8 +1188,7 @@ final class BrowserPanel: Panel, ObservableObject { private var developerToolsRestoreRetryAttempt: Int = 0 private let developerToolsRestoreRetryDelay: TimeInterval = 0.05 private let developerToolsRestoreRetryMaxAttempts: Int = 40 - private var forcedDarkModeEnabled: Bool - private var forcedDarkModeOpacity: Double + private var browserThemeMode: BrowserThemeMode var displayTitle: String { if !pageTitle.isEmpty { @@ -1177,8 +1212,7 @@ final class BrowserPanel: Panel, ObservableObject { self.id = UUID() self.workspaceId = workspaceId self.insecureHTTPBypassHostOnce = BrowserInsecureHTTPSettings.normalizeHost(bypassInsecureHTTPHostOnce ?? "") - self.forcedDarkModeEnabled = BrowserForcedDarkModeSettings.enabled() - self.forcedDarkModeOpacity = BrowserForcedDarkModeSettings.opacity() + self.browserThemeMode = BrowserThemeSettings.mode() // Configure web view let config = WKWebViewConfiguration() @@ -1217,7 +1251,7 @@ final class BrowserPanel: Panel, ObservableObject { BrowserHistoryStore.shared.recordVisit(url: webView.url, title: webView.title) Task { @MainActor [weak self] in self?.refreshFavicon(from: webView) - self?.applyForcedDarkModeIfNeeded() + self?.applyBrowserThemeModeIfNeeded() } } navDelegate.didFailNavigation = { [weak self] _, failedURL in @@ -1278,7 +1312,7 @@ final class BrowserPanel: Panel, ObservableObject { // Observe web view properties setupObservers() - applyForcedDarkModeIfNeeded() + applyBrowserThemeModeIfNeeded() // Navigate to initial URL if provided if let url = initialURL { @@ -2024,10 +2058,9 @@ extension BrowserPanel { try await webView.evaluateJavaScript(script) } - func setForcedDarkMode(enabled: Bool, opacity: Double) { - forcedDarkModeEnabled = enabled - forcedDarkModeOpacity = BrowserForcedDarkModeSettings.normalizedOpacity(opacity) - applyForcedDarkModeIfNeeded() + func setBrowserThemeMode(_ mode: BrowserThemeMode) { + browserThemeMode = mode + applyBrowserThemeModeIfNeeded() } func refreshAppearanceDrivenColors() { @@ -2110,51 +2143,62 @@ extension BrowserPanel { } private extension BrowserPanel { - func applyForcedDarkModeIfNeeded() { - let script = makeForcedDarkModeScript( - enabled: forcedDarkModeEnabled, - opacityPercent: forcedDarkModeOpacity - ) + func applyBrowserThemeModeIfNeeded() { + switch browserThemeMode { + case .system: + webView.appearance = nil + case .light: + webView.appearance = NSAppearance(named: .aqua) + case .dark: + webView.appearance = NSAppearance(named: .darkAqua) + } + + let script = makeBrowserThemeModeScript(mode: browserThemeMode) webView.evaluateJavaScript(script) { _, error in #if DEBUG if let error { - dlog("browser.forcedDarkMode error=\(error.localizedDescription)") + dlog("browser.themeMode error=\(error.localizedDescription)") } #endif } } - func makeForcedDarkModeScript(enabled: Bool, opacityPercent: Double) -> String { - let clampedOpacity = BrowserForcedDarkModeSettings.normalizedOpacity(opacityPercent) / 100.0 - let opacityLiteral = String(format: "%.4f", clampedOpacity) - let enabledLiteral = enabled ? "true" : "false" + func makeBrowserThemeModeScript(mode: BrowserThemeMode) -> String { + let colorSchemeLiteral: String + switch mode { + case .system: + colorSchemeLiteral = "null" + case .light: + colorSchemeLiteral = "'light'" + case .dark: + colorSchemeLiteral = "'dark'" + } + return """ (() => { - const overlayId = 'cmux-forced-dark-mode-overlay'; - const shouldEnable = \(enabledLiteral); - const overlayOpacity = \(opacityLiteral); + const metaId = 'cmux-browser-theme-mode-meta'; + const colorScheme = \(colorSchemeLiteral); const root = document.documentElement || document.body; if (!root) return; - let overlay = document.getElementById(overlayId); - if (!overlay) { - overlay = document.createElement('div'); - overlay.id = overlayId; - overlay.style.position = 'fixed'; - overlay.style.top = '0'; - overlay.style.left = '0'; - overlay.style.right = '0'; - overlay.style.bottom = '0'; - overlay.style.backgroundColor = 'black'; - overlay.style.pointerEvents = 'none'; - overlay.style.zIndex = '2147483647'; - overlay.style.transition = 'opacity 120ms ease'; - overlay.style.opacity = '0'; - root.appendChild(overlay); + let meta = document.getElementById(metaId); + if (colorScheme) { + root.style.setProperty('color-scheme', colorScheme, 'important'); + root.setAttribute('data-cmux-browser-theme', colorScheme); + if (!meta) { + meta = document.createElement('meta'); + meta.id = metaId; + meta.name = 'color-scheme'; + (document.head || root).appendChild(meta); + } + meta.setAttribute('content', colorScheme); + } else { + root.style.removeProperty('color-scheme'); + root.removeAttribute('data-cmux-browser-theme'); + if (meta) { + meta.remove(); + } } - - overlay.style.display = shouldEnable ? 'block' : 'none'; - overlay.style.opacity = shouldEnable ? String(overlayOpacity) : '0'; })(); """ } diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index eb81cf24..37f0af44 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -155,6 +155,17 @@ private struct OmnibarAddressButtonStyleBody: View { } } +private extension View { + @ViewBuilder + func cmuxFlatSymbolColorRendering() -> some View { + if #available(macOS 26.0, *) { + self.symbolColorRenderingMode(.flat) + } else { + self + } + } +} + /// View for rendering a browser panel with address bar struct BrowserPanelView: View { @ObservedObject var panel: BrowserPanel @@ -169,8 +180,7 @@ struct BrowserPanelView: View { @AppStorage(BrowserSearchSettings.searchSuggestionsEnabledKey) private var searchSuggestionsEnabledStorage = BrowserSearchSettings.defaultSearchSuggestionsEnabled @AppStorage(BrowserDevToolsButtonDebugSettings.iconNameKey) private var devToolsIconNameRaw = BrowserDevToolsButtonDebugSettings.defaultIcon.rawValue @AppStorage(BrowserDevToolsButtonDebugSettings.iconColorKey) private var devToolsIconColorRaw = BrowserDevToolsButtonDebugSettings.defaultColor.rawValue - @AppStorage(BrowserForcedDarkModeSettings.enabledKey) private var forcedDarkModeEnabled = BrowserForcedDarkModeSettings.defaultEnabled - @AppStorage(BrowserForcedDarkModeSettings.opacityKey) private var forcedDarkModeOpacity = BrowserForcedDarkModeSettings.defaultOpacity + @AppStorage(BrowserThemeSettings.modeKey) private var browserThemeModeRaw = BrowserThemeSettings.defaultMode.rawValue @State private var suggestionTask: Task<Void, Never>? @State private var isLoadingRemoteSuggestions: Bool = false @State private var latestRemoteSuggestionQuery: String = "" @@ -183,6 +193,7 @@ struct BrowserPanelView: View { @State private var focusFlashFadeWorkItem: DispatchWorkItem? @State private var omnibarPillFrame: CGRect = .zero @State private var lastHandledAddressBarFocusRequestId: UUID? + @State private var isBrowserThemeMenuPresented = false private let omnibarPillCornerRadius: CGFloat = 12 private let addressBarButtonSize: CGFloat = 22 private let addressBarButtonHitSize: CGFloat = 26 @@ -221,8 +232,8 @@ struct BrowserPanelView: View { BrowserDevToolsIconColorOption(rawValue: devToolsIconColorRaw) ?? BrowserDevToolsButtonDebugSettings.defaultColor } - private var normalizedForcedDarkModeOpacity: Double { - BrowserForcedDarkModeSettings.normalizedOpacity(forcedDarkModeOpacity) + private var browserThemeMode: BrowserThemeMode { + BrowserThemeSettings.mode(for: browserThemeModeRaw) } private var browserChromeBackgroundColor: NSColor { @@ -292,14 +303,14 @@ struct BrowserPanelView: View { UserDefaults.standard.register(defaults: [ BrowserSearchSettings.searchEngineKey: BrowserSearchSettings.defaultSearchEngine.rawValue, BrowserSearchSettings.searchSuggestionsEnabledKey: BrowserSearchSettings.defaultSearchSuggestionsEnabled, - BrowserForcedDarkModeSettings.enabledKey: BrowserForcedDarkModeSettings.defaultEnabled, - BrowserForcedDarkModeSettings.opacityKey: BrowserForcedDarkModeSettings.defaultOpacity, + BrowserThemeSettings.modeKey: BrowserThemeSettings.defaultMode.rawValue, ]) + let resolvedThemeMode = BrowserThemeSettings.mode(defaults: .standard) + if browserThemeModeRaw != resolvedThemeMode.rawValue { + browserThemeModeRaw = resolvedThemeMode.rawValue + } panel.refreshAppearanceDrivenColors() - panel.setForcedDarkMode( - enabled: forcedDarkModeEnabled, - opacity: normalizedForcedDarkModeOpacity - ) + panel.setBrowserThemeMode(browserThemeMode) applyPendingAddressBarFocusRequestIfNeeded() syncURLFromPanel() // If the browser surface is focused but has no URL loaded yet, auto-focus the omnibar. @@ -321,21 +332,12 @@ struct BrowserPanelView: View { addressBarFocused = false } } - .onChange(of: forcedDarkModeEnabled) { _ in - panel.setForcedDarkMode( - enabled: forcedDarkModeEnabled, - opacity: normalizedForcedDarkModeOpacity - ) - } - .onChange(of: forcedDarkModeOpacity) { _ in - let normalized = BrowserForcedDarkModeSettings.normalizedOpacity(forcedDarkModeOpacity) - if abs(normalized - forcedDarkModeOpacity) > 0.0001 { - forcedDarkModeOpacity = normalized + .onChange(of: browserThemeModeRaw) { _ in + let normalizedMode = BrowserThemeSettings.mode(for: browserThemeModeRaw) + if browserThemeModeRaw != normalizedMode.rawValue { + browserThemeModeRaw = normalizedMode.rawValue } - panel.setForcedDarkMode( - enabled: forcedDarkModeEnabled, - opacity: normalized - ) + panel.setBrowserThemeMode(normalizedMode) } .onChange(of: colorScheme) { _ in panel.refreshAppearanceDrivenColors() @@ -410,8 +412,10 @@ struct BrowserPanelView: View { .accessibilityIdentifier("BrowserOmnibarPill") .accessibilityLabel("Browser omnibar") - forcedDarkModeButton - developerToolsButton + if !panel.isShowingNewTabPage { + browserThemeModeButton + developerToolsButton + } } .padding(.horizontal, 8) .padding(.vertical, addressBarVerticalPadding) @@ -494,6 +498,8 @@ struct BrowserPanelView: View { openDevTools() }) { Image(systemName: devToolsIconOption.rawValue) + .symbolRenderingMode(.monochrome) + .cmuxFlatSymbolColorRendering() .font(.system(size: devToolsButtonIconSize, weight: .medium)) .foregroundStyle(devToolsColorOption.color) .frame(width: addressBarButtonSize, height: addressBarButtonSize, alignment: .center) @@ -504,27 +510,60 @@ struct BrowserPanelView: View { .accessibilityIdentifier("BrowserToggleDevToolsButton") } - private var forcedDarkModeButton: some View { + private var browserThemeModeButton: some View { Button(action: { - forcedDarkModeEnabled.toggle() - panel.setForcedDarkMode( - enabled: forcedDarkModeEnabled, - opacity: normalizedForcedDarkModeOpacity - ) + isBrowserThemeMenuPresented.toggle() }) { - Image(systemName: forcedDarkModeEnabled ? "moon.fill" : "moon") + Image(systemName: browserThemeMode.iconName) + .symbolRenderingMode(.monochrome) + .cmuxFlatSymbolColorRendering() .font(.system(size: devToolsButtonIconSize, weight: .medium)) - .foregroundStyle( - forcedDarkModeEnabled - ? Color.orange - : Color(nsColor: .secondaryLabelColor) - ) + .foregroundStyle(browserThemeModeIconColor) .frame(width: addressBarButtonSize, height: addressBarButtonSize, alignment: .center) } - .buttonStyle(.plain) + .buttonStyle(OmnibarAddressButtonStyle()) .frame(width: addressBarButtonSize, height: addressBarButtonSize, alignment: .center) - .help(forcedDarkModeEnabled ? "Forced Dark Mode On" : "Forced Dark Mode Off") - .accessibilityIdentifier("BrowserForcedDarkModeButton") + .popover(isPresented: $isBrowserThemeMenuPresented, arrowEdge: .bottom) { + browserThemeModePopover + } + .help("Browser Theme: \(browserThemeMode.displayName)") + .accessibilityIdentifier("BrowserThemeModeButton") + } + + private var browserThemeModePopover: some View { + VStack(alignment: .leading, spacing: 2) { + ForEach(BrowserThemeMode.allCases) { mode in + Button { + applyBrowserThemeModeSelection(mode) + isBrowserThemeMenuPresented = false + } label: { + HStack(spacing: 8) { + Image(systemName: mode == browserThemeMode ? "checkmark" : "circle") + .font(.system(size: 10, weight: .semibold)) + .opacity(mode == browserThemeMode ? 1.0 : 0.0) + .frame(width: 12, alignment: .center) + Text(mode.displayName) + .font(.system(size: 12)) + Spacer(minLength: 0) + } + .padding(.horizontal, 8) + .frame(height: 24) + .contentShape(Rectangle()) + .background( + RoundedRectangle(cornerRadius: 6, style: .continuous) + .fill(mode == browserThemeMode ? Color.primary.opacity(0.12) : Color.clear) + ) + } + .buttonStyle(.plain) + .accessibilityIdentifier("BrowserThemeModeOption\(mode.rawValue.capitalized)") + } + } + .padding(8) + .frame(minWidth: 128) + } + + private var browserThemeModeIconColor: Color { + devToolsColorOption.color } private var omnibarField: some View { @@ -719,6 +758,13 @@ struct BrowserPanelView: View { } } + private func applyBrowserThemeModeSelection(_ mode: BrowserThemeMode) { + if browserThemeModeRaw != mode.rawValue { + browserThemeModeRaw = mode.rawValue + } + panel.setBrowserThemeMode(mode) + } + private func handleOmnibarTap() { onRequestPanelFocus() guard !addressBarFocused else { return } diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 024d1ce8..5fc53154 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -2557,8 +2557,7 @@ struct SettingsView: View { @AppStorage("cmuxPortRange") private var cmuxPortRange = 10 @AppStorage(BrowserSearchSettings.searchEngineKey) private var browserSearchEngine = BrowserSearchSettings.defaultSearchEngine.rawValue @AppStorage(BrowserSearchSettings.searchSuggestionsEnabledKey) private var browserSearchSuggestionsEnabled = BrowserSearchSettings.defaultSearchSuggestionsEnabled - @AppStorage(BrowserForcedDarkModeSettings.enabledKey) private var browserForcedDarkModeEnabled = BrowserForcedDarkModeSettings.defaultEnabled - @AppStorage(BrowserForcedDarkModeSettings.opacityKey) private var browserForcedDarkModeOpacity = BrowserForcedDarkModeSettings.defaultOpacity + @AppStorage(BrowserThemeSettings.modeKey) private var browserThemeMode = BrowserThemeSettings.defaultMode.rawValue @AppStorage(BrowserLinkOpenSettings.openTerminalLinksInCmuxBrowserKey) private var openTerminalLinksInCmuxBrowser = BrowserLinkOpenSettings.defaultOpenTerminalLinksInCmuxBrowser @AppStorage(BrowserLinkOpenSettings.browserHostWhitelistKey) private var browserHostWhitelist = BrowserLinkOpenSettings.defaultBrowserHostWhitelist @AppStorage(BrowserInsecureHTTPSettings.allowlistKey) private var browserInsecureHTTPAllowlist = BrowserInsecureHTTPSettings.defaultAllowlistText @@ -2603,6 +2602,19 @@ struct SettingsView: View { SocketControlSettings.migrateMode(socketControlMode) } + private var selectedBrowserThemeMode: BrowserThemeMode { + BrowserThemeSettings.mode(for: browserThemeMode) + } + + private var browserThemeModeSelection: Binding<String> { + Binding( + get: { browserThemeMode }, + set: { newValue in + browserThemeMode = BrowserThemeSettings.mode(for: newValue).rawValue + } + ) + } + private var socketModeSelection: Binding<String> { Binding( get: { socketControlMode }, @@ -2984,41 +2996,19 @@ struct SettingsView: View { SettingsCardDivider() SettingsCardRow( - "Force Dark Mode", - subtitle: "Dims bright pages in the embedded browser with a lightweight overlay." + "Browser Theme", + subtitle: selectedBrowserThemeMode == .system + ? "System follows app and macOS appearance." + : "\(selectedBrowserThemeMode.displayName) forces that color scheme for compatible pages.", + controlWidth: pickerColumnWidth ) { - Toggle("", isOn: $browserForcedDarkModeEnabled) - .labelsHidden() - .controlSize(.small) - } - - SettingsCardDivider() - - SettingsCardRow( - "Dimmer Opacity", - subtitle: "\(Int(BrowserForcedDarkModeSettings.normalizedOpacity(browserForcedDarkModeOpacity).rounded()))%" - ) { - HStack(spacing: 8) { - Slider( - value: Binding( - get: { - BrowserForcedDarkModeSettings.normalizedOpacity(browserForcedDarkModeOpacity) - }, - set: { newValue in - browserForcedDarkModeOpacity = BrowserForcedDarkModeSettings.normalizedOpacity(newValue) - } - ), - in: BrowserForcedDarkModeSettings.minOpacity...BrowserForcedDarkModeSettings.maxOpacity, - step: 1 - ) - .frame(width: 132) - .disabled(!browserForcedDarkModeEnabled) - - Text("\(Int(BrowserForcedDarkModeSettings.normalizedOpacity(browserForcedDarkModeOpacity).rounded()))%") - .font(.system(size: 12, weight: .medium, design: .monospaced)) - .foregroundStyle(.secondary) - .frame(width: 38, alignment: .trailing) + Picker("", selection: browserThemeModeSelection) { + ForEach(BrowserThemeMode.allCases) { mode in + Text(mode.displayName).tag(mode.rawValue) + } } + .labelsHidden() + .pickerStyle(.menu) } SettingsCardDivider() @@ -3246,7 +3236,7 @@ struct SettingsView: View { .toggleStyle(.switch) .onAppear { BrowserHistoryStore.shared.loadIfNeeded() - browserForcedDarkModeOpacity = BrowserForcedDarkModeSettings.normalizedOpacity(browserForcedDarkModeOpacity) + browserThemeMode = BrowserThemeSettings.mode(defaults: .standard).rawValue browserHistoryEntryCount = BrowserHistoryStore.shared.entries.count browserInsecureHTTPAllowlistDraft = browserInsecureHTTPAllowlist reloadWorkspaceTabColorSettings() @@ -3298,8 +3288,7 @@ struct SettingsView: View { claudeCodeHooksEnabled = ClaudeCodeIntegrationSettings.defaultHooksEnabled browserSearchEngine = BrowserSearchSettings.defaultSearchEngine.rawValue browserSearchSuggestionsEnabled = BrowserSearchSettings.defaultSearchSuggestionsEnabled - browserForcedDarkModeEnabled = BrowserForcedDarkModeSettings.defaultEnabled - browserForcedDarkModeOpacity = BrowserForcedDarkModeSettings.defaultOpacity + browserThemeMode = BrowserThemeSettings.defaultMode.rawValue openTerminalLinksInCmuxBrowser = BrowserLinkOpenSettings.defaultOpenTerminalLinksInCmuxBrowser browserHostWhitelist = BrowserLinkOpenSettings.defaultBrowserHostWhitelist browserInsecureHTTPAllowlist = BrowserInsecureHTTPSettings.defaultAllowlistText diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 01777355..8355569e 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -259,9 +259,9 @@ final class BrowserDevToolsButtonDebugSettingsTests: XCTestCase { } } -final class BrowserForcedDarkModeSettingsTests: XCTestCase { +final class BrowserThemeSettingsTests: XCTestCase { private func makeIsolatedDefaults() -> UserDefaults { - let suiteName = "BrowserForcedDarkModeSettingsTests.\(UUID().uuidString)" + let suiteName = "BrowserThemeSettingsTests.\(UUID().uuidString)" guard let defaults = UserDefaults(suiteName: suiteName) else { fatalError("Failed to create defaults suite") } @@ -275,28 +275,30 @@ final class BrowserForcedDarkModeSettingsTests: XCTestCase { func testDefaultsMatchConfiguredFallbacks() { let defaults = makeIsolatedDefaults() XCTAssertEqual( - BrowserForcedDarkModeSettings.enabled(defaults: defaults), - BrowserForcedDarkModeSettings.defaultEnabled - ) - XCTAssertEqual( - BrowserForcedDarkModeSettings.opacity(defaults: defaults), - BrowserForcedDarkModeSettings.defaultOpacity + BrowserThemeSettings.mode(defaults: defaults), + BrowserThemeSettings.defaultMode ) } - func testOpacityIsClampedToSupportedRange() { + func testModeReadsPersistedValue() { let defaults = makeIsolatedDefaults() - defaults.set(-100.0, forKey: BrowserForcedDarkModeSettings.opacityKey) - XCTAssertEqual( - BrowserForcedDarkModeSettings.opacity(defaults: defaults), - BrowserForcedDarkModeSettings.minOpacity - ) + defaults.set(BrowserThemeMode.dark.rawValue, forKey: BrowserThemeSettings.modeKey) + XCTAssertEqual(BrowserThemeSettings.mode(defaults: defaults), .dark) - defaults.set(999.0, forKey: BrowserForcedDarkModeSettings.opacityKey) - XCTAssertEqual( - BrowserForcedDarkModeSettings.opacity(defaults: defaults), - BrowserForcedDarkModeSettings.maxOpacity - ) + defaults.set(BrowserThemeMode.light.rawValue, forKey: BrowserThemeSettings.modeKey) + XCTAssertEqual(BrowserThemeSettings.mode(defaults: defaults), .light) + } + + func testModeMigratesLegacyForcedDarkModeFlag() { + let defaults = makeIsolatedDefaults() + defaults.set(true, forKey: BrowserThemeSettings.legacyForcedDarkModeEnabledKey) + XCTAssertEqual(BrowserThemeSettings.mode(defaults: defaults), .dark) + XCTAssertEqual(defaults.string(forKey: BrowserThemeSettings.modeKey), BrowserThemeMode.dark.rawValue) + + let otherDefaults = makeIsolatedDefaults() + otherDefaults.set(false, forKey: BrowserThemeSettings.legacyForcedDarkModeEnabledKey) + XCTAssertEqual(BrowserThemeSettings.mode(defaults: otherDefaults), .system) + XCTAssertEqual(otherDefaults.string(forKey: BrowserThemeSettings.modeKey), BrowserThemeMode.system.rawValue) } } @@ -458,9 +460,31 @@ final class BrowserDeveloperToolsConfigurationTests: XCTestCase { XCTAssertEqual(panel.displayTitle, "New tab") XCTAssertFalse(panel.shouldRenderWebView) + XCTAssertTrue(panel.isShowingNewTabPage) XCTAssertNil(panel.webView.url) XCTAssertNil(panel.currentURL) } + + func testBrowserPanelLeavesNewTabPageStateWhenNavigationStarts() { + let panel = BrowserPanel(workspaceId: UUID()) + + XCTAssertTrue(panel.isShowingNewTabPage) + panel.navigate(to: URL(string: "https://example.com")!) + XCTAssertFalse(panel.isShowingNewTabPage) + } + + func testBrowserPanelThemeModeUpdatesWebViewAppearance() { + let panel = BrowserPanel(workspaceId: UUID()) + + panel.setBrowserThemeMode(.dark) + XCTAssertEqual(panel.webView.appearance?.bestMatch(from: [.darkAqua, .aqua]), .darkAqua) + + panel.setBrowserThemeMode(.light) + XCTAssertEqual(panel.webView.appearance?.bestMatch(from: [.aqua, .darkAqua]), .aqua) + + panel.setBrowserThemeMode(.system) + XCTAssertNil(panel.webView.appearance) + } } @MainActor From 923c62820fc0fac0c9415e51f924e33fa2d0b8d5 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 17:45:11 -0800 Subject: [PATCH 078/214] Move workspace indicator setting into workspace colors (#329) --- Sources/cmuxApp.swift | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 5fc53154..1d4f57fb 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -2773,10 +2773,12 @@ struct SettingsView: View { .pickerStyle(.menu) } - SettingsCardDivider() + } + SettingsSectionHeader(title: "Workspace Colors") + SettingsCard { SettingsCardRow( - "Active Workspace Indicator", + "Workspace Color Indicator", controlWidth: pickerColumnWidth ) { Picker("", selection: sidebarIndicatorStyleSelection) { @@ -2787,10 +2789,9 @@ struct SettingsView: View { .labelsHidden() .pickerStyle(.menu) } - } - SettingsSectionHeader(title: "Workspace Colors") - SettingsCard { + SettingsCardDivider() + SettingsCardNote("Customize the workspace color palette used by Sidebar > Tab Color. \"Choose Custom Color...\" entries are persisted below.") ForEach(Array(workspaceTabDefaultEntries.enumerated()), id: \.element.name) { index, entry in From 2c1fd1f8019e90de6bab47f4fb07ea1b43582f65 Mon Sep 17 00:00:00 2001 From: sugakoji <sugasugakoji@gmail.com> Date: Sun, 22 Feb 2026 22:54:52 +0900 Subject: [PATCH 079/214] Add open wrapper to route URLs to embedded browser When running `open https://...` inside a cmux terminal, the URL now opens in the built-in browser panel instead of the system default browser. Non-URL arguments and explicit flags pass through to /usr/bin/open unchanged. Closes #306 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 174623776eb0baef04f5a9ab49b926427c149acd) --- GhosttyTabs.xcodeproj/project.pbxproj | 3 ++ Resources/bin/open | 66 +++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100755 Resources/bin/open diff --git a/GhosttyTabs.xcodeproj/project.pbxproj b/GhosttyTabs.xcodeproj/project.pbxproj index 65cc12e6..58641e08 100644 --- a/GhosttyTabs.xcodeproj/project.pbxproj +++ b/GhosttyTabs.xcodeproj/project.pbxproj @@ -59,6 +59,7 @@ B9000002A1B2C3D4E5F60719 /* cmux.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9000001A1B2C3D4E5F60719 /* cmux.swift */; }; B900000BA1B2C3D4E5F60719 /* cmux in Copy CLI */ = {isa = PBXBuildFile; fileRef = B9000004A1B2C3D4E5F60719 /* cmux */; }; C1ADE00002A1B2C3D4E5F719 /* claude in Copy CLI */ = {isa = PBXBuildFile; fileRef = C1ADE00001A1B2C3D4E5F719 /* claude */; }; + D1BEF00002A1B2C3D4E5F719 /* open in Copy CLI */ = {isa = PBXBuildFile; fileRef = D1BEF00001A1B2C3D4E5F719 /* open */; }; 84E00D47E4584162AE53BC8D /* xterm-ghostty in Resources */ = {isa = PBXBuildFile; fileRef = B2E7294509CC42FE9191870E /* xterm-ghostty */; }; A5002000 /* THIRD_PARTY_LICENSES.md in Resources */ = {isa = PBXBuildFile; fileRef = A5002001 /* THIRD_PARTY_LICENSES.md */; }; B9000012A1B2C3D4E5F60719 /* AutomationSocketUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9000011A1B2C3D4E5F60719 /* AutomationSocketUITests.swift */; }; @@ -96,6 +97,7 @@ files = ( B900000BA1B2C3D4E5F60719 /* cmux in Copy CLI */, C1ADE00002A1B2C3D4E5F719 /* claude in Copy CLI */, + D1BEF00002A1B2C3D4E5F719 /* open in Copy CLI */, ); name = "Copy CLI"; runOnlyForDeploymentPostprocessing = 0; @@ -182,6 +184,7 @@ A5001101 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; B2E7294509CC42FE9191870E /* xterm-ghostty */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ghostty/terminfo/78/xterm-ghostty"; sourceTree = "<group>"; }; C1ADE00001A1B2C3D4E5F719 /* claude */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "Resources/bin/claude"; sourceTree = SOURCE_ROOT; }; + D1BEF00001A1B2C3D4E5F719 /* open */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "Resources/bin/open"; sourceTree = SOURCE_ROOT; }; A5002001 /* THIRD_PARTY_LICENSES.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = THIRD_PARTY_LICENSES.md; sourceTree = SOURCE_ROOT; }; B9000001A1B2C3D4E5F60719 /* cmux.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = cmux.swift; sourceTree = "<group>"; }; B9000004A1B2C3D4E5F60719 /* cmux */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cmux; sourceTree = BUILT_PRODUCTS_DIR; }; diff --git a/Resources/bin/open b/Resources/bin/open new file mode 100755 index 00000000..4000fed6 --- /dev/null +++ b/Resources/bin/open @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +# cmux open wrapper - routes HTTP(S) URLs to cmux's in-app browser +# +# When running inside a cmux terminal (CMUX_SOCKET_PATH is set), this wrapper +# intercepts `open https://...` invocations and opens them in cmux's built-in +# browser within the same workspace. All other arguments pass through to +# /usr/bin/open unchanged. + +# Pass through immediately if not in a cmux terminal. +if [[ -z "$CMUX_SOCKET_PATH" ]]; then + exec /usr/bin/open "$@" +fi + +# No arguments → pass through. +if [[ $# -eq 0 ]]; then + exec /usr/bin/open "$@" +fi + +# Scan for flags that indicate explicit user intent → pass through. +# Also collect non-flag arguments (potential URLs/files). +passthrough=false +urls=() +for arg in "$@"; do + case "$arg" in + -a|-b|-R|-e|-t|-f|-W|-g|-n|-h|-s|-j|-u|--env|--stdin|--stdout|--stderr) + passthrough=true + break + ;; + -*) + # Unknown flag → be conservative, pass through + passthrough=true + break + ;; + http://*|https://*) + urls+=("$arg") + ;; + *) + # Non-URL, non-flag argument (file path, etc.) → pass through all + passthrough=true + break + ;; + esac +done + +if [[ "$passthrough" == true ]] || [[ ${#urls[@]} -eq 0 ]]; then + exec /usr/bin/open "$@" +fi + +# Find cmux CLI (same directory as this script). +SELF_DIR="$(cd "$(dirname "$0")" && pwd)" +CMUX_CLI="$SELF_DIR/cmux" + +if [[ ! -x "$CMUX_CLI" ]]; then + exec /usr/bin/open "$@" +fi + +# Open each URL in cmux's in-app browser. +failed=false +for url in "${urls[@]}"; do + "$CMUX_CLI" browser open "$url" 2>/dev/null || failed=true +done + +# If any failed, fall back to system open for all URLs. +if [[ "$failed" == true ]]; then + exec /usr/bin/open "$@" +fi From f104dbc37f8caf7ec2fffe5be19a4b16e4f4067a Mon Sep 17 00:00:00 2001 From: sugakoji <sugasugakoji@gmail.com> Date: Sun, 22 Feb 2026 23:21:58 +0900 Subject: [PATCH 080/214] Fix double-open on partial failure with multiple URLs When multiple URLs were passed and some succeeded but others failed, the fallback re-opened all URLs via /usr/bin/open, causing duplicates. Now only failed URLs are passed to the system open fallback. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit 3790b0c0f0b98286b78f6f5aa8dbc9756cf756e8) --- Resources/bin/open | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/bin/open b/Resources/bin/open index 4000fed6..b161e8b7 100755 --- a/Resources/bin/open +++ b/Resources/bin/open @@ -54,13 +54,13 @@ if [[ ! -x "$CMUX_CLI" ]]; then exec /usr/bin/open "$@" fi -# Open each URL in cmux's in-app browser. -failed=false +# Open each URL in cmux's in-app browser; track failures individually. +failed_urls=() for url in "${urls[@]}"; do - "$CMUX_CLI" browser open "$url" 2>/dev/null || failed=true + "$CMUX_CLI" browser open "$url" 2>/dev/null || failed_urls+=("$url") done -# If any failed, fall back to system open for all URLs. -if [[ "$failed" == true ]]; then - exec /usr/bin/open "$@" +# Fall back to system open only for URLs that failed. +if [[ ${#failed_urls[@]} -gt 0 ]]; then + exec /usr/bin/open "${failed_urls[@]}" fi From 2428ae5dbd5c6e3804f06b7d95e721e770adf14b Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 18:13:14 -0800 Subject: [PATCH 081/214] Respect browser link settings in open wrapper --- Resources/bin/open | 150 +++++++++++++++++++- Sources/GhosttyTerminalView.swift | 3 + tests/test_open_wrapper.py | 221 ++++++++++++++++++++++++++++++ 3 files changed, 369 insertions(+), 5 deletions(-) create mode 100755 tests/test_open_wrapper.py diff --git a/Resources/bin/open b/Resources/bin/open index b161e8b7..e08a87c1 100755 --- a/Resources/bin/open +++ b/Resources/bin/open @@ -6,14 +6,135 @@ # browser within the same workspace. All other arguments pass through to # /usr/bin/open unchanged. +SYSTEM_OPEN_BIN="${CMUX_OPEN_WRAPPER_SYSTEM_OPEN:-/usr/bin/open}" +DEFAULTS_BIN="${CMUX_OPEN_WRAPPER_DEFAULTS:-/usr/bin/defaults}" + +if [[ ! -x "$SYSTEM_OPEN_BIN" ]]; then + SYSTEM_OPEN_BIN="/usr/bin/open" +fi + +if [[ ! -x "$DEFAULTS_BIN" ]]; then + DEFAULTS_BIN="/usr/bin/defaults" +fi + +settings_domain="${CMUX_BUNDLE_ID:-}" +whitelist_raw="" +whitelist_patterns=() + +system_open() { + exec "$SYSTEM_OPEN_BIN" "$@" +} + +trim() { + local value="$1" + value="${value#"${value%%[![:space:]]*}"}" + value="${value%"${value##*[![:space:]]}"}" + printf '%s' "$value" +} + +normalize_host() { + local value + value="$(trim "$1")" + value="${value,,}" + [[ -z "$value" ]] && return 1 + + if [[ "$value" == *"://"* ]]; then + value="${value#*://}" + fi + + value="${value%%/*}" + value="${value%%\?*}" + value="${value%%\#*}" + + if [[ "$value" == *"@"* ]]; then + value="${value##*@}" + fi + + if [[ "$value" == \[* ]]; then + value="${value#\[}" + value="${value%%\]*}" + elif [[ "$value" == *:* ]]; then + local colons="${value//[^:]}" + if [[ ${#colons} -eq 1 ]] && [[ "$value" =~ :[0-9]+$ ]]; then + value="${value%:*}" + fi + fi + + while [[ "$value" == .* ]]; do + value="${value#.}" + done + while [[ "$value" == *. ]]; do + value="${value%.}" + done + + [[ -z "$value" ]] && return 1 + printf '%s' "$value" +} + +normalize_whitelist_pattern() { + local value + value="$(trim "$1")" + value="${value,,}" + [[ -z "$value" ]] && return 1 + + if [[ "$value" == \*.* ]]; then + local suffix + suffix="$(normalize_host "${value#*.}")" || return 1 + printf '*.%s' "$suffix" + return 0 + fi + + normalize_host "$value" +} + +host_matches_pattern() { + local host="$1" + local pattern="$2" + + if [[ "$pattern" == \*.* ]]; then + local suffix="${pattern#*.}" + [[ "$host" == "$suffix" ]] && return 0 + [[ "$host" == *".$suffix" ]] && return 0 + return 1 + fi + + [[ "$host" == "$pattern" ]] +} + +host_matches_whitelist() { + local url="$1" + if [[ ${#whitelist_patterns[@]} -eq 0 ]]; then + return 0 + fi + + local host + host="$(normalize_host "$url")" || return 1 + for pattern in "${whitelist_patterns[@]}"; do + if host_matches_pattern "$host" "$pattern"; then + return 0 + fi + done + return 1 +} + +load_whitelist_patterns() { + local raw="$1" + local line + while IFS= read -r line || [[ -n "$line" ]]; do + local normalized + normalized="$(normalize_whitelist_pattern "$line")" || continue + whitelist_patterns+=("$normalized") + done <<< "$raw" +} + # Pass through immediately if not in a cmux terminal. if [[ -z "$CMUX_SOCKET_PATH" ]]; then - exec /usr/bin/open "$@" + system_open "$@" fi # No arguments → pass through. if [[ $# -eq 0 ]]; then - exec /usr/bin/open "$@" + system_open "$@" fi # Scan for flags that indicate explicit user intent → pass through. @@ -43,7 +164,22 @@ for arg in "$@"; do done if [[ "$passthrough" == true ]] || [[ ${#urls[@]} -eq 0 ]]; then - exec /usr/bin/open "$@" + system_open "$@" +fi + +# Respect the same settings used for terminal link clicks. +if [[ -n "$settings_domain" ]]; then + open_in_cmux="$("$DEFAULTS_BIN" read "$settings_domain" browserOpenTerminalLinksInCmuxBrowser 2>/dev/null || true)" + case "${open_in_cmux,,}" in + 0|false|no) + system_open "$@" + ;; + esac + + whitelist_raw="$("$DEFAULTS_BIN" read "$settings_domain" browserHostWhitelist 2>/dev/null || true)" + if [[ -n "$whitelist_raw" ]]; then + load_whitelist_patterns "$whitelist_raw" + fi fi # Find cmux CLI (same directory as this script). @@ -51,16 +187,20 @@ SELF_DIR="$(cd "$(dirname "$0")" && pwd)" CMUX_CLI="$SELF_DIR/cmux" if [[ ! -x "$CMUX_CLI" ]]; then - exec /usr/bin/open "$@" + system_open "$@" fi # Open each URL in cmux's in-app browser; track failures individually. failed_urls=() for url in "${urls[@]}"; do + if ! host_matches_whitelist "$url"; then + failed_urls+=("$url") + continue + fi "$CMUX_CLI" browser open "$url" 2>/dev/null || failed_urls+=("$url") done # Fall back to system open only for URLs that failed. if [[ ${#failed_urls[@]} -gt 0 ]]; then - exec /usr/bin/open "${failed_urls[@]}" + system_open "${failed_urls[@]}" fi diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 1bd23f8d..3c3fa1a0 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1365,6 +1365,9 @@ final class TerminalSurface: Identifiable, ObservableObject { env["CMUX_PANEL_ID"] = id.uuidString env["CMUX_TAB_ID"] = tabId.uuidString env["CMUX_SOCKET_PATH"] = SocketControlSettings.socketPath() + if let bundleId = Bundle.main.bundleIdentifier, !bundleId.isEmpty { + env["CMUX_BUNDLE_ID"] = bundleId + } // Port range for this workspace (base/range snapshotted once per app session) do { diff --git a/tests/test_open_wrapper.py b/tests/test_open_wrapper.py new file mode 100755 index 00000000..c4d90c27 --- /dev/null +++ b/tests/test_open_wrapper.py @@ -0,0 +1,221 @@ +#!/usr/bin/env python3 +""" +Regression tests for Resources/bin/open. +""" + +from __future__ import annotations + +import os +import shutil +import subprocess +import tempfile +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +SOURCE_WRAPPER = ROOT / "Resources" / "bin" / "open" + + +def make_executable(path: Path, content: str) -> None: + path.write_text(content, encoding="utf-8") + path.chmod(0o755) + + +def read_log(path: Path) -> list[str]: + if not path.exists(): + return [] + return [line.strip() for line in path.read_text(encoding="utf-8").splitlines() if line.strip()] + + +def run_wrapper( + *, + args: list[str], + open_setting: str | None, + whitelist: str | None, + fail_urls: list[str] | None = None, +) -> tuple[list[str], list[str], int, str]: + with tempfile.TemporaryDirectory(prefix="cmux-open-wrapper-test-") as td: + tmp = Path(td) + wrapper = tmp / "open" + shutil.copy2(SOURCE_WRAPPER, wrapper) + wrapper.chmod(0o755) + + open_log = tmp / "open.log" + cmux_log = tmp / "cmux.log" + system_open = tmp / "system-open" + defaults = tmp / "defaults" + cmux = tmp / "cmux" + + make_executable( + system_open, + """#!/usr/bin/env bash +set -euo pipefail +printf '%s\\n' "$*" >> "$FAKE_OPEN_LOG" +""", + ) + + make_executable( + defaults, + """#!/usr/bin/env bash +set -euo pipefail +if [[ "${1:-}" != "read" ]]; then + exit 1 +fi +key="${3:-}" +case "$key" in + browserOpenTerminalLinksInCmuxBrowser) + if [[ -v FAKE_DEFAULTS_OPEN ]]; then + printf '%s\\n' "$FAKE_DEFAULTS_OPEN" + exit 0 + fi + exit 1 + ;; + browserHostWhitelist) + if [[ -v FAKE_DEFAULTS_WHITELIST ]]; then + printf '%s' "$FAKE_DEFAULTS_WHITELIST" + exit 0 + fi + exit 1 + ;; + *) + exit 1 + ;; +esac +""", + ) + + make_executable( + cmux, + """#!/usr/bin/env bash +set -euo pipefail +printf '%s\\n' "$*" >> "$FAKE_CMUX_LOG" +url="${*: -1}" +if [[ -n "${FAKE_CMUX_FAIL_URLS:-}" ]]; then + IFS=',' read -r -a failures <<< "$FAKE_CMUX_FAIL_URLS" + for fail_url in "${failures[@]}"; do + if [[ "$url" == "$fail_url" ]]; then + exit 1 + fi + done +fi +exit 0 +""", + ) + + env = os.environ.copy() + env["CMUX_SOCKET_PATH"] = "/tmp/cmux-open-wrapper-test.sock" + env["CMUX_BUNDLE_ID"] = "com.cmuxterm.app.debug.test" + env["CMUX_OPEN_WRAPPER_SYSTEM_OPEN"] = str(system_open) + env["CMUX_OPEN_WRAPPER_DEFAULTS"] = str(defaults) + env["FAKE_OPEN_LOG"] = str(open_log) + env["FAKE_CMUX_LOG"] = str(cmux_log) + + if open_setting is None: + env.pop("FAKE_DEFAULTS_OPEN", None) + else: + env["FAKE_DEFAULTS_OPEN"] = open_setting + + if whitelist is None: + env.pop("FAKE_DEFAULTS_WHITELIST", None) + else: + env["FAKE_DEFAULTS_WHITELIST"] = whitelist + + if fail_urls: + env["FAKE_CMUX_FAIL_URLS"] = ",".join(fail_urls) + else: + env.pop("FAKE_CMUX_FAIL_URLS", None) + + result = subprocess.run( + [str(wrapper), *args], + env=env, + capture_output=True, + text=True, + check=False, + ) + + return read_log(open_log), read_log(cmux_log), result.returncode, result.stderr.strip() + + +def expect(condition: bool, message: str, failures: list[str]) -> None: + if not condition: + failures.append(message) + + +def test_toggle_disabled_passthrough(failures: list[str]) -> None: + url = "https://example.com" + open_log, cmux_log, code, stderr = run_wrapper( + args=[url], + open_setting="0", + whitelist="", + ) + expect(code == 0, f"toggle off: wrapper exited {code}: {stderr}", failures) + expect(cmux_log == [], f"toggle off: cmux should not be called, got {cmux_log}", failures) + expect(open_log == [url], f"toggle off: expected system open [{url}], got {open_log}", failures) + + +def test_whitelist_miss_passthrough(failures: list[str]) -> None: + url = "https://example.com" + open_log, cmux_log, code, stderr = run_wrapper( + args=[url], + open_setting="1", + whitelist="localhost\n127.0.0.1", + ) + expect(code == 0, f"whitelist miss: wrapper exited {code}: {stderr}", failures) + expect(cmux_log == [], f"whitelist miss: cmux should not be called, got {cmux_log}", failures) + expect(open_log == [url], f"whitelist miss: expected system open [{url}], got {open_log}", failures) + + +def test_whitelist_match_routes_to_cmux(failures: list[str]) -> None: + url = "https://api.example.com/path?q=1" + open_log, cmux_log, code, stderr = run_wrapper( + args=[url], + open_setting="1", + whitelist="*.example.com", + ) + expect(code == 0, f"whitelist match: wrapper exited {code}: {stderr}", failures) + expect(open_log == [], f"whitelist match: system open should not be called, got {open_log}", failures) + expect(cmux_log == [f"browser open {url}"], f"whitelist match: unexpected cmux log {cmux_log}", failures) + + +def test_partial_failures_only_fallback_failed_urls(failures: list[str]) -> None: + good = "https://api.example.com" + failed = "https://fail.example.com" + external = "https://outside.test" + open_log, cmux_log, code, stderr = run_wrapper( + args=[good, failed, external], + open_setting="1", + whitelist="*.example.com", + fail_urls=[failed], + ) + expect(code == 0, f"partial failure: wrapper exited {code}: {stderr}", failures) + expect( + cmux_log == [f"browser open {good}", f"browser open {failed}"], + f"partial failure: cmux log mismatch {cmux_log}", + failures, + ) + expect( + open_log == [f"{failed} {external}"], + f"partial failure: expected fallback for failed/external only, got {open_log}", + failures, + ) + + +def main() -> int: + failures: list[str] = [] + test_toggle_disabled_passthrough(failures) + test_whitelist_miss_passthrough(failures) + test_whitelist_match_routes_to_cmux(failures) + test_partial_failures_only_fallback_failed_urls(failures) + + if failures: + print("open wrapper regression tests failed:") + for failure in failures: + print(f" - {failure}") + return 1 + + print("open wrapper regression tests passed.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 8c149428c3a20886e3d82681e934c5c410147226 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 18:25:07 -0800 Subject: [PATCH 082/214] Set default workspace indicator style to left rail (#332) --- Sources/TabManager.swift | 2 +- tests/test_sidebar_indicator_default.py | 46 +++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/test_sidebar_indicator_default.py diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 114a3f78..ba6c3261 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -81,7 +81,7 @@ enum SidebarActiveTabIndicatorStyle: String, CaseIterable, Identifiable { enum SidebarActiveTabIndicatorSettings { static let styleKey = "sidebarActiveTabIndicatorStyle" - static let defaultStyle: SidebarActiveTabIndicatorStyle = .solidFill + static let defaultStyle: SidebarActiveTabIndicatorStyle = .leftRail static func resolvedStyle(rawValue: String?) -> SidebarActiveTabIndicatorStyle { guard let rawValue else { return defaultStyle } diff --git a/tests/test_sidebar_indicator_default.py b/tests/test_sidebar_indicator_default.py new file mode 100644 index 00000000..4cf5d77a --- /dev/null +++ b/tests/test_sidebar_indicator_default.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +""" +Regression test for the default sidebar active workspace indicator style. +""" + +from __future__ import annotations + +import re +import subprocess +import sys +from pathlib import Path + + +def get_repo_root() -> Path: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return Path(result.stdout.strip()) + return Path.cwd() + + +def main() -> int: + repo_root = get_repo_root() + tab_manager = repo_root / "Sources" / "TabManager.swift" + + if not tab_manager.exists(): + print(f"FAIL: Missing file {tab_manager}") + return 1 + + content = tab_manager.read_text(encoding="utf-8") + pattern = r"static let defaultStyle:\s*SidebarActiveTabIndicatorStyle\s*=\s*\.leftRail\b" + + if re.search(pattern, content) is None: + rel = tab_manager.relative_to(repo_root) + print(f"FAIL: Expected default style `.leftRail` in {rel}") + return 1 + + print("PASS: sidebar indicator default style is left rail") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) From 0046b674aa4928a08f830d49db75892d173442ff Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 18:26:07 -0800 Subject: [PATCH 083/214] Split open-wrapper interception into its own setting --- Resources/bin/open | 6 ++- Sources/Panels/BrowserPanel.swift | 16 +++++++ Sources/cmuxApp.swift | 18 ++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 20 ++++++++ tests/test_open_wrapper.py | 47 +++++++++++++++---- 5 files changed, 94 insertions(+), 13 deletions(-) diff --git a/Resources/bin/open b/Resources/bin/open index e08a87c1..f4104d90 100755 --- a/Resources/bin/open +++ b/Resources/bin/open @@ -169,7 +169,11 @@ fi # Respect the same settings used for terminal link clicks. if [[ -n "$settings_domain" ]]; then - open_in_cmux="$("$DEFAULTS_BIN" read "$settings_domain" browserOpenTerminalLinksInCmuxBrowser 2>/dev/null || true)" + open_in_cmux="$("$DEFAULTS_BIN" read "$settings_domain" browserInterceptTerminalOpenCommandInCmuxBrowser 2>/dev/null || true)" + if [[ -z "$open_in_cmux" ]]; then + # Backward compatibility for installs that predate the dedicated open-wrapper toggle. + open_in_cmux="$("$DEFAULTS_BIN" read "$settings_domain" browserOpenTerminalLinksInCmuxBrowser 2>/dev/null || true)" + fi case "${open_in_cmux,,}" in 0|false|no) system_open "$@" diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index ee3452d2..534b6edb 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -127,6 +127,9 @@ enum BrowserLinkOpenSettings { static let openTerminalLinksInCmuxBrowserKey = "browserOpenTerminalLinksInCmuxBrowser" static let defaultOpenTerminalLinksInCmuxBrowser: Bool = true + static let interceptTerminalOpenCommandInCmuxBrowserKey = "browserInterceptTerminalOpenCommandInCmuxBrowser" + static let defaultInterceptTerminalOpenCommandInCmuxBrowser: Bool = true + static let browserHostWhitelistKey = "browserHostWhitelist" static let defaultBrowserHostWhitelist: String = "" @@ -137,6 +140,19 @@ enum BrowserLinkOpenSettings { return defaults.bool(forKey: openTerminalLinksInCmuxBrowserKey) } + static func interceptTerminalOpenCommandInCmuxBrowser(defaults: UserDefaults = .standard) -> Bool { + if defaults.object(forKey: interceptTerminalOpenCommandInCmuxBrowserKey) != nil { + return defaults.bool(forKey: interceptTerminalOpenCommandInCmuxBrowserKey) + } + + // Migrate existing behavior for users who only had the link-click toggle. + if defaults.object(forKey: openTerminalLinksInCmuxBrowserKey) != nil { + return defaults.bool(forKey: openTerminalLinksInCmuxBrowserKey) + } + + return defaultInterceptTerminalOpenCommandInCmuxBrowser + } + static func hostWhitelist(defaults: UserDefaults = .standard) -> [String] { let raw = defaults.string(forKey: browserHostWhitelistKey) ?? defaultBrowserHostWhitelist return raw diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 1d4f57fb..47c22d8d 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -2559,6 +2559,8 @@ struct SettingsView: View { @AppStorage(BrowserSearchSettings.searchSuggestionsEnabledKey) private var browserSearchSuggestionsEnabled = BrowserSearchSettings.defaultSearchSuggestionsEnabled @AppStorage(BrowserThemeSettings.modeKey) private var browserThemeMode = BrowserThemeSettings.defaultMode.rawValue @AppStorage(BrowserLinkOpenSettings.openTerminalLinksInCmuxBrowserKey) private var openTerminalLinksInCmuxBrowser = BrowserLinkOpenSettings.defaultOpenTerminalLinksInCmuxBrowser + @AppStorage(BrowserLinkOpenSettings.interceptTerminalOpenCommandInCmuxBrowserKey) + private var interceptTerminalOpenCommandInCmuxBrowser = BrowserLinkOpenSettings.defaultInterceptTerminalOpenCommandInCmuxBrowser @AppStorage(BrowserLinkOpenSettings.browserHostWhitelistKey) private var browserHostWhitelist = BrowserLinkOpenSettings.defaultBrowserHostWhitelist @AppStorage(BrowserInsecureHTTPSettings.allowlistKey) private var browserInsecureHTTPAllowlist = BrowserInsecureHTTPSettings.defaultAllowlistText @AppStorage(NotificationBadgeSettings.dockBadgeEnabledKey) private var notificationDockBadgeEnabled = NotificationBadgeSettings.defaultDockBadgeEnabled @@ -3023,13 +3025,24 @@ struct SettingsView: View { .controlSize(.small) } - if openTerminalLinksInCmuxBrowser { + SettingsCardDivider() + + SettingsCardRow( + "Intercept open http(s) in Terminal", + subtitle: "When off, `open https://...` and `open http://...` always use your default browser." + ) { + Toggle("", isOn: $interceptTerminalOpenCommandInCmuxBrowser) + .labelsHidden() + .controlSize(.small) + } + + if openTerminalLinksInCmuxBrowser || interceptTerminalOpenCommandInCmuxBrowser { SettingsCardDivider() VStack(alignment: .leading, spacing: 6) { SettingsCardRow( "Hosts to Open in Embedded Browser", - subtitle: "When you click links in terminal output, only these hosts open in cmux. Other hosts open in your default browser. One host or wildcard per line (for example: example.com, *.internal.example). Leave empty to open all links in cmux." + subtitle: "Applies to terminal link clicks and intercepted `open https://...` calls. Only these hosts open in cmux. Others open in your default browser. One host or wildcard per line (for example: example.com, *.internal.example). Leave empty to open all hosts in cmux." ) { EmptyView() } @@ -3291,6 +3304,7 @@ struct SettingsView: View { browserSearchSuggestionsEnabled = BrowserSearchSettings.defaultSearchSuggestionsEnabled browserThemeMode = BrowserThemeSettings.defaultMode.rawValue openTerminalLinksInCmuxBrowser = BrowserLinkOpenSettings.defaultOpenTerminalLinksInCmuxBrowser + interceptTerminalOpenCommandInCmuxBrowser = BrowserLinkOpenSettings.defaultInterceptTerminalOpenCommandInCmuxBrowser browserHostWhitelist = BrowserLinkOpenSettings.defaultBrowserHostWhitelist browserInsecureHTTPAllowlist = BrowserInsecureHTTPSettings.defaultAllowlistText browserInsecureHTTPAllowlistDraft = BrowserInsecureHTTPSettings.defaultAllowlistText diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 8355569e..e3b604f5 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -4140,6 +4140,26 @@ final class BrowserLinkOpenSettingsTests: XCTestCase { defaults.set(true, forKey: BrowserLinkOpenSettings.openTerminalLinksInCmuxBrowserKey) XCTAssertTrue(BrowserLinkOpenSettings.openTerminalLinksInCmuxBrowser(defaults: defaults)) } + + func testOpenCommandInterceptionDefaultsToCmuxBrowser() { + XCTAssertTrue(BrowserLinkOpenSettings.interceptTerminalOpenCommandInCmuxBrowser(defaults: defaults)) + } + + func testOpenCommandInterceptionUsesStoredValue() { + defaults.set(false, forKey: BrowserLinkOpenSettings.interceptTerminalOpenCommandInCmuxBrowserKey) + XCTAssertFalse(BrowserLinkOpenSettings.interceptTerminalOpenCommandInCmuxBrowser(defaults: defaults)) + + defaults.set(true, forKey: BrowserLinkOpenSettings.interceptTerminalOpenCommandInCmuxBrowserKey) + XCTAssertTrue(BrowserLinkOpenSettings.interceptTerminalOpenCommandInCmuxBrowser(defaults: defaults)) + } + + func testOpenCommandInterceptionFallsBackToLegacyLinkToggleWhenUnset() { + defaults.set(false, forKey: BrowserLinkOpenSettings.openTerminalLinksInCmuxBrowserKey) + XCTAssertFalse(BrowserLinkOpenSettings.interceptTerminalOpenCommandInCmuxBrowser(defaults: defaults)) + + defaults.set(true, forKey: BrowserLinkOpenSettings.openTerminalLinksInCmuxBrowserKey) + XCTAssertTrue(BrowserLinkOpenSettings.interceptTerminalOpenCommandInCmuxBrowser(defaults: defaults)) + } } final class TerminalOpenURLTargetResolutionTests: XCTestCase { diff --git a/tests/test_open_wrapper.py b/tests/test_open_wrapper.py index c4d90c27..e602eca7 100755 --- a/tests/test_open_wrapper.py +++ b/tests/test_open_wrapper.py @@ -30,7 +30,8 @@ def read_log(path: Path) -> list[str]: def run_wrapper( *, args: list[str], - open_setting: str | None, + intercept_setting: str | None, + legacy_open_setting: str | None = None, whitelist: str | None, fail_urls: list[str] | None = None, ) -> tuple[list[str], list[str], int, str]: @@ -63,9 +64,16 @@ if [[ "${1:-}" != "read" ]]; then fi key="${3:-}" case "$key" in + browserInterceptTerminalOpenCommandInCmuxBrowser) + if [[ -v FAKE_DEFAULTS_INTERCEPT_OPEN ]]; then + printf '%s\\n' "$FAKE_DEFAULTS_INTERCEPT_OPEN" + exit 0 + fi + exit 1 + ;; browserOpenTerminalLinksInCmuxBrowser) - if [[ -v FAKE_DEFAULTS_OPEN ]]; then - printf '%s\\n' "$FAKE_DEFAULTS_OPEN" + if [[ -v FAKE_DEFAULTS_LEGACY_OPEN ]]; then + printf '%s\\n' "$FAKE_DEFAULTS_LEGACY_OPEN" exit 0 fi exit 1 @@ -110,10 +118,15 @@ exit 0 env["FAKE_OPEN_LOG"] = str(open_log) env["FAKE_CMUX_LOG"] = str(cmux_log) - if open_setting is None: - env.pop("FAKE_DEFAULTS_OPEN", None) + if intercept_setting is None: + env.pop("FAKE_DEFAULTS_INTERCEPT_OPEN", None) else: - env["FAKE_DEFAULTS_OPEN"] = open_setting + env["FAKE_DEFAULTS_INTERCEPT_OPEN"] = intercept_setting + + if legacy_open_setting is None: + env.pop("FAKE_DEFAULTS_LEGACY_OPEN", None) + else: + env["FAKE_DEFAULTS_LEGACY_OPEN"] = legacy_open_setting if whitelist is None: env.pop("FAKE_DEFAULTS_WHITELIST", None) @@ -145,7 +158,7 @@ def test_toggle_disabled_passthrough(failures: list[str]) -> None: url = "https://example.com" open_log, cmux_log, code, stderr = run_wrapper( args=[url], - open_setting="0", + intercept_setting="0", whitelist="", ) expect(code == 0, f"toggle off: wrapper exited {code}: {stderr}", failures) @@ -157,7 +170,7 @@ def test_whitelist_miss_passthrough(failures: list[str]) -> None: url = "https://example.com" open_log, cmux_log, code, stderr = run_wrapper( args=[url], - open_setting="1", + intercept_setting="1", whitelist="localhost\n127.0.0.1", ) expect(code == 0, f"whitelist miss: wrapper exited {code}: {stderr}", failures) @@ -169,7 +182,7 @@ def test_whitelist_match_routes_to_cmux(failures: list[str]) -> None: url = "https://api.example.com/path?q=1" open_log, cmux_log, code, stderr = run_wrapper( args=[url], - open_setting="1", + intercept_setting="1", whitelist="*.example.com", ) expect(code == 0, f"whitelist match: wrapper exited {code}: {stderr}", failures) @@ -183,7 +196,7 @@ def test_partial_failures_only_fallback_failed_urls(failures: list[str]) -> None external = "https://outside.test" open_log, cmux_log, code, stderr = run_wrapper( args=[good, failed, external], - open_setting="1", + intercept_setting="1", whitelist="*.example.com", fail_urls=[failed], ) @@ -200,12 +213,26 @@ def test_partial_failures_only_fallback_failed_urls(failures: list[str]) -> None ) +def test_legacy_toggle_fallback_passthrough(failures: list[str]) -> None: + url = "https://example.com" + open_log, cmux_log, code, stderr = run_wrapper( + args=[url], + intercept_setting=None, + legacy_open_setting="0", + whitelist="", + ) + expect(code == 0, f"legacy fallback: wrapper exited {code}: {stderr}", failures) + expect(cmux_log == [], f"legacy fallback: cmux should not be called, got {cmux_log}", failures) + expect(open_log == [url], f"legacy fallback: expected system open [{url}], got {open_log}", failures) + + def main() -> int: failures: list[str] = [] test_toggle_disabled_passthrough(failures) test_whitelist_miss_passthrough(failures) test_whitelist_match_routes_to_cmux(failures) test_partial_failures_only_fallback_failed_urls(failures) + test_legacy_toggle_fallback_passthrough(failures) if failures: print("open wrapper regression tests failed:") From af2b276e98a45a0f711bfdb5af7cebcbb50f856b Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 18:36:27 -0800 Subject: [PATCH 084/214] Make browser omnibar squircle --- Sources/Panels/BrowserPanelView.swift | 4 +++- ..._browser_omnibar_compact_layout_regression.py | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 37f0af44..65f2f25e 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -194,7 +194,9 @@ struct BrowserPanelView: View { @State private var omnibarPillFrame: CGRect = .zero @State private var lastHandledAddressBarFocusRequestId: UUID? @State private var isBrowserThemeMenuPresented = false - private let omnibarPillCornerRadius: CGFloat = 12 + // Keep this below half of the compact omnibar height so it reads as a squircle, + // not a capsule. + private let omnibarPillCornerRadius: CGFloat = 10 private let addressBarButtonSize: CGFloat = 22 private let addressBarButtonHitSize: CGFloat = 26 private let addressBarVerticalPadding: CGFloat = 4 diff --git a/tests/test_browser_omnibar_compact_layout_regression.py b/tests/test_browser_omnibar_compact_layout_regression.py index 3886f495..707c4a8b 100644 --- a/tests/test_browser_omnibar_compact_layout_regression.py +++ b/tests/test_browser_omnibar_compact_layout_regression.py @@ -71,10 +71,26 @@ def main() -> int: f"addressBarVerticalPadding regressed to {vertical_padding:g}; expected <= 4 for compact omnibar height" ) + omnibar_corner_radius = parse_cgfloat_constant(view_source, "omnibarPillCornerRadius") + if omnibar_corner_radius is None: + failures.append("omnibarPillCornerRadius constant is missing") + elif omnibar_corner_radius > 10: + failures.append( + f"omnibarPillCornerRadius regressed to {omnibar_corner_radius:g}; expected <= 10 to keep a squircle profile" + ) + address_bar_block = extract_block(view_source, "private var addressBar: some View") if ".padding(.vertical, addressBarVerticalPadding)" not in address_bar_block: failures.append("addressBar no longer applies compact vertical padding via addressBarVerticalPadding") + omnibar_field_block = extract_block(view_source, "private var omnibarField: some View") + if omnibar_field_block.count( + "RoundedRectangle(cornerRadius: omnibarPillCornerRadius, style: .continuous)" + ) < 2: + failures.append( + "omnibarField no longer uses continuous rounded-rectangle background+stroke tied to omnibarPillCornerRadius" + ) + button_bar_block = extract_block(view_source, "private var addressBarButtonBar: some View") hit_frame_uses = button_bar_block.count("addressBarButtonHitSize") if hit_frame_uses < 3: From 3afa345f3a45bda781a22a8ff67c22ead74ccdf3 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 18:38:37 -0800 Subject: [PATCH 085/214] Harden open wrapper for Bash 3 and IDN host parity --- Resources/bin/open | 99 +++++++++++++++++++++++++++++++++----- tests/test_open_wrapper.py | 95 ++++++++++++++++++++++++++++++++++-- 2 files changed, 176 insertions(+), 18 deletions(-) diff --git a/Resources/bin/open b/Resources/bin/open index f4104d90..9c81ea54 100755 --- a/Resources/bin/open +++ b/Resources/bin/open @@ -8,6 +8,7 @@ SYSTEM_OPEN_BIN="${CMUX_OPEN_WRAPPER_SYSTEM_OPEN:-/usr/bin/open}" DEFAULTS_BIN="${CMUX_OPEN_WRAPPER_DEFAULTS:-/usr/bin/defaults}" +PYTHON3_BIN="${CMUX_OPEN_WRAPPER_PYTHON3:-}" if [[ ! -x "$SYSTEM_OPEN_BIN" ]]; then SYSTEM_OPEN_BIN="/usr/bin/open" @@ -17,6 +18,14 @@ if [[ ! -x "$DEFAULTS_BIN" ]]; then DEFAULTS_BIN="/usr/bin/defaults" fi +if [[ -n "$PYTHON3_BIN" ]]; then + if [[ ! -x "$PYTHON3_BIN" ]]; then + PYTHON3_BIN="" + fi +elif command -v python3 >/dev/null 2>&1; then + PYTHON3_BIN="$(command -v python3)" +fi + settings_domain="${CMUX_BUNDLE_ID:-}" whitelist_raw="" whitelist_patterns=() @@ -32,10 +41,74 @@ trim() { printf '%s' "$value" } +to_lower_ascii() { + # Bash 3.2-compatible lowercase conversion. + LC_ALL=C printf '%s' "$1" | tr '[:upper:]' '[:lower:]' +} + +normalize_boolean() { + to_lower_ascii "$(trim "$1")" +} + +is_false_setting() { + local normalized + normalized="$(normalize_boolean "$1")" + case "$normalized" in + 0|false|no|off) + return 0 + ;; + esac + return 1 +} + +canonicalize_idn_host() { + local value="$1" + [[ -z "$PYTHON3_BIN" ]] && { + printf '%s' "$value" + return 0 + } + + local canonicalized + canonicalized="$("$PYTHON3_BIN" - "$value" <<'PY' 2>/dev/null || true +import sys + +host = sys.argv[1].strip().rstrip(".") +if not host: + raise SystemExit(1) + +labels = host.split(".") +if any(not label for label in labels): + raise SystemExit(1) + +try: + canonical = ".".join(label.encode("idna").decode("ascii") for label in labels) +except Exception: + raise SystemExit(1) + +sys.stdout.write(canonical.lower()) +PY +)" + if [[ -n "$canonicalized" ]]; then + printf '%s' "$canonicalized" + return 0 + fi + printf '%s' "$value" +} + +is_http_url() { + local value="$1" + case "$value" in + [Hh][Tt][Tt][Pp]://*|[Hh][Tt][Tt][Pp][Ss]://*) + return 0 + ;; + esac + return 1 +} + normalize_host() { local value value="$(trim "$1")" - value="${value,,}" + value="$(to_lower_ascii "$value")" [[ -z "$value" ]] && return 1 if [[ "$value" == *"://"* ]]; then @@ -68,13 +141,14 @@ normalize_host() { done [[ -z "$value" ]] && return 1 + value="$(canonicalize_idn_host "$value")" printf '%s' "$value" } normalize_whitelist_pattern() { local value value="$(trim "$1")" - value="${value,,}" + value="$(to_lower_ascii "$value")" [[ -z "$value" ]] && return 1 if [[ "$value" == \*.* ]]; then @@ -152,13 +226,14 @@ for arg in "$@"; do passthrough=true break ;; - http://*|https://*) - urls+=("$arg") - ;; *) - # Non-URL, non-flag argument (file path, etc.) → pass through all - passthrough=true - break + if is_http_url "$arg"; then + urls+=("$arg") + else + # Non-URL, non-flag argument (file path, etc.) → pass through all + passthrough=true + break + fi ;; esac done @@ -174,11 +249,9 @@ if [[ -n "$settings_domain" ]]; then # Backward compatibility for installs that predate the dedicated open-wrapper toggle. open_in_cmux="$("$DEFAULTS_BIN" read "$settings_domain" browserOpenTerminalLinksInCmuxBrowser 2>/dev/null || true)" fi - case "${open_in_cmux,,}" in - 0|false|no) - system_open "$@" - ;; - esac + if is_false_setting "$open_in_cmux"; then + system_open "$@" + fi whitelist_raw="$("$DEFAULTS_BIN" read "$settings_domain" browserHostWhitelist 2>/dev/null || true)" if [[ -n "$whitelist_raw" ]]; then diff --git a/tests/test_open_wrapper.py b/tests/test_open_wrapper.py index e602eca7..6119033a 100755 --- a/tests/test_open_wrapper.py +++ b/tests/test_open_wrapper.py @@ -65,21 +65,21 @@ fi key="${3:-}" case "$key" in browserInterceptTerminalOpenCommandInCmuxBrowser) - if [[ -v FAKE_DEFAULTS_INTERCEPT_OPEN ]]; then + if [[ "${FAKE_DEFAULTS_INTERCEPT_OPEN+x}" == "x" ]]; then printf '%s\\n' "$FAKE_DEFAULTS_INTERCEPT_OPEN" exit 0 fi exit 1 ;; browserOpenTerminalLinksInCmuxBrowser) - if [[ -v FAKE_DEFAULTS_LEGACY_OPEN ]]; then + if [[ "${FAKE_DEFAULTS_LEGACY_OPEN+x}" == "x" ]]; then printf '%s\\n' "$FAKE_DEFAULTS_LEGACY_OPEN" exit 0 fi exit 1 ;; browserHostWhitelist) - if [[ -v FAKE_DEFAULTS_WHITELIST ]]; then + if [[ "${FAKE_DEFAULTS_WHITELIST+x}" == "x" ]]; then printf '%s' "$FAKE_DEFAULTS_WHITELIST" exit 0 fi @@ -97,7 +97,10 @@ esac """#!/usr/bin/env bash set -euo pipefail printf '%s\\n' "$*" >> "$FAKE_CMUX_LOG" -url="${*: -1}" +url="" +for arg in "$@"; do + url="$arg" +done if [[ -n "${FAKE_CMUX_FAIL_URLS:-}" ]]; then IFS=',' read -r -a failures <<< "$FAKE_CMUX_FAIL_URLS" for fail_url in "${failures[@]}"; do @@ -139,7 +142,7 @@ exit 0 env.pop("FAKE_CMUX_FAIL_URLS", None) result = subprocess.run( - [str(wrapper), *args], + ["/bin/bash", str(wrapper), *args], env=env, capture_output=True, text=True, @@ -166,6 +169,26 @@ def test_toggle_disabled_passthrough(failures: list[str]) -> None: expect(open_log == [url], f"toggle off: expected system open [{url}], got {open_log}", failures) +def test_toggle_disabled_case_insensitive_passthrough(failures: list[str]) -> None: + url = "https://example.com" + open_log, cmux_log, code, stderr = run_wrapper( + args=[url], + intercept_setting=" FaLsE ", + whitelist="", + ) + expect(code == 0, f"toggle off (case-insensitive): wrapper exited {code}: {stderr}", failures) + expect( + cmux_log == [], + f"toggle off (case-insensitive): cmux should not be called, got {cmux_log}", + failures, + ) + expect( + open_log == [url], + f"toggle off (case-insensitive): expected system open [{url}], got {open_log}", + failures, + ) + + def test_whitelist_miss_passthrough(failures: list[str]) -> None: url = "https://example.com" open_log, cmux_log, code, stderr = run_wrapper( @@ -226,13 +249,75 @@ def test_legacy_toggle_fallback_passthrough(failures: list[str]) -> None: expect(open_log == [url], f"legacy fallback: expected system open [{url}], got {open_log}", failures) +def test_legacy_toggle_fallback_case_insensitive_passthrough(failures: list[str]) -> None: + url = "https://example.com" + open_log, cmux_log, code, stderr = run_wrapper( + args=[url], + intercept_setting=None, + legacy_open_setting=" Off ", + whitelist="", + ) + expect(code == 0, f"legacy fallback (case-insensitive): wrapper exited {code}: {stderr}", failures) + expect( + cmux_log == [], + f"legacy fallback (case-insensitive): cmux should not be called, got {cmux_log}", + failures, + ) + expect( + open_log == [url], + f"legacy fallback (case-insensitive): expected system open [{url}], got {open_log}", + failures, + ) + + +def test_uppercase_scheme_routes_to_cmux(failures: list[str]) -> None: + url = "HTTPS://api.example.com/path?q=1" + open_log, cmux_log, code, stderr = run_wrapper( + args=[url], + intercept_setting="1", + whitelist="*.example.com", + ) + expect(code == 0, f"uppercase scheme: wrapper exited {code}: {stderr}", failures) + expect(open_log == [], f"uppercase scheme: system open should not be called, got {open_log}", failures) + expect(cmux_log == [f"browser open {url}"], f"uppercase scheme: unexpected cmux log {cmux_log}", failures) + + +def test_unicode_whitelist_matches_punycode_url(failures: list[str]) -> None: + url = "https://xn--bcher-kva.example/path" + open_log, cmux_log, code, stderr = run_wrapper( + args=[url], + intercept_setting="1", + whitelist="bücher.example", + ) + expect(code == 0, f"unicode whitelist: wrapper exited {code}: {stderr}", failures) + expect(open_log == [], f"unicode whitelist: system open should not be called, got {open_log}", failures) + expect(cmux_log == [f"browser open {url}"], f"unicode whitelist: unexpected cmux log {cmux_log}", failures) + + +def test_punycode_whitelist_matches_unicode_url(failures: list[str]) -> None: + url = "https://bücher.example/path" + open_log, cmux_log, code, stderr = run_wrapper( + args=[url], + intercept_setting="1", + whitelist="xn--bcher-kva.example", + ) + expect(code == 0, f"punycode whitelist: wrapper exited {code}: {stderr}", failures) + expect(open_log == [], f"punycode whitelist: system open should not be called, got {open_log}", failures) + expect(cmux_log == [f"browser open {url}"], f"punycode whitelist: unexpected cmux log {cmux_log}", failures) + + def main() -> int: failures: list[str] = [] test_toggle_disabled_passthrough(failures) + test_toggle_disabled_case_insensitive_passthrough(failures) test_whitelist_miss_passthrough(failures) test_whitelist_match_routes_to_cmux(failures) test_partial_failures_only_fallback_failed_urls(failures) test_legacy_toggle_fallback_passthrough(failures) + test_legacy_toggle_fallback_case_insensitive_passthrough(failures) + test_uppercase_scheme_routes_to_cmux(failures) + test_unicode_whitelist_matches_punycode_url(failures) + test_punycode_whitelist_matches_unicode_url(failures) if failures: print("open wrapper regression tests failed:") From 4ee6640e35b1dce0678f79ca2ba6b5286e5564f1 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 18:50:01 -0800 Subject: [PATCH 086/214] Preserve terminal focus for non-focus split opens --- Sources/Workspace.swift | 26 +++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 60 +++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index bb0345d4..ab06df65 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -960,6 +960,7 @@ final class Workspace: Identifiable, ObservableObject { isPinned: false ) surfaceIdToPanelId[newTab.id] = newPanel.id + let previousFocusedPanelId = focusedPanelId // Capture the source terminal's hosted view before bonsplit mutates focusedPaneId, // so we can hand it to focusPanel as the "move focus FROM" view. @@ -989,7 +990,17 @@ final class Workspace: Identifiable, ObservableObject { previousHostedView?.clearSuppressReparentFocus() } } else { - scheduleFocusReconcile() + // Bonsplit focuses the newly-created pane by default; restore the caller's + // pre-split focus context when this split is explicitly non-focus-intent. + if let previousFocusedPanelId, panels[previousFocusedPanelId] != nil { + previousHostedView?.suppressReparentFocus() + focusPanel(previousFocusedPanelId, previousHostedView: previousHostedView) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + previousHostedView?.clearSuppressReparentFocus() + } + } else { + scheduleFocusReconcile() + } } return newPanel @@ -1089,6 +1100,7 @@ final class Workspace: Identifiable, ObservableObject { isPinned: false ) surfaceIdToPanelId[newTab.id] = browserPanel.id + let previousFocusedPanelId = focusedPanelId // Create the split with the browser tab already present. // Mark this split as programmatic so didSplitPane doesn't auto-create a terminal. @@ -1110,7 +1122,17 @@ final class Workspace: Identifiable, ObservableObject { previousHostedView?.clearSuppressReparentFocus() } } else { - scheduleFocusReconcile() + // Bonsplit focuses the newly-created pane by default; restore the caller's + // pre-split focus context when this split is explicitly non-focus-intent. + if let previousFocusedPanelId, panels[previousFocusedPanelId] != nil { + previousHostedView?.suppressReparentFocus() + focusPanel(previousFocusedPanelId, previousHostedView: previousHostedView) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + previousHostedView?.clearSuppressReparentFocus() + } + } else { + scheduleFocusReconcile() + } } installBrowserPanelSubscription(browserPanel) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index e3b604f5..b24947bf 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1800,6 +1800,66 @@ final class TabManagerReopenClosedBrowserFocusTests: XCTestCase { @MainActor final class WorkspacePanelGitBranchTests: XCTestCase { + private func drainMainQueue() { + let expectation = expectation(description: "drain main queue") + DispatchQueue.main.async { + expectation.fulfill() + } + wait(for: [expectation], timeout: 1.0) + } + + func testBrowserSplitWithFocusFalsePreservesOriginalFocusedPanel() { + let workspace = Workspace() + guard let originalFocusedPanelId = workspace.focusedPanelId else { + XCTFail("Expected initial focused panel") + return + } + + guard let browserSplitPanel = workspace.newBrowserSplit( + from: originalFocusedPanelId, + orientation: .horizontal, + focus: false + ) else { + XCTFail("Expected browser split panel to be created") + return + } + + drainMainQueue() + + XCTAssertNotEqual(browserSplitPanel.id, originalFocusedPanelId) + XCTAssertEqual( + workspace.focusedPanelId, + originalFocusedPanelId, + "Expected non-focus browser split to preserve pre-split focus" + ) + } + + func testTerminalSplitWithFocusFalsePreservesOriginalFocusedPanel() { + let workspace = Workspace() + guard let originalFocusedPanelId = workspace.focusedPanelId else { + XCTFail("Expected initial focused panel") + return + } + + guard let terminalSplitPanel = workspace.newTerminalSplit( + from: originalFocusedPanelId, + orientation: .horizontal, + focus: false + ) else { + XCTFail("Expected terminal split panel to be created") + return + } + + drainMainQueue() + + XCTAssertNotEqual(terminalSplitPanel.id, originalFocusedPanelId) + XCTAssertEqual( + workspace.focusedPanelId, + originalFocusedPanelId, + "Expected non-focus terminal split to preserve pre-split focus" + ) + } + func testClosingFocusedSplitRestoresBranchForRemainingFocusedPanel() { let workspace = Workspace() guard let firstPanelId = workspace.focusedPanelId else { From 0dbe95b797d9d7d6fe3a66145e4a1b45459bca78 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:04:57 -0800 Subject: [PATCH 087/214] Reassert non-focus split focus after delayed callbacks --- Sources/Workspace.swift | 189 +++++++++++------- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 54 +++++ 2 files changed, 175 insertions(+), 68 deletions(-) diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index ab06df65..99bdd74e 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -962,49 +962,43 @@ final class Workspace: Identifiable, ObservableObject { surfaceIdToPanelId[newTab.id] = newPanel.id let previousFocusedPanelId = focusedPanelId - // Capture the source terminal's hosted view before bonsplit mutates focusedPaneId, - // so we can hand it to focusPanel as the "move focus FROM" view. - let previousHostedView = focusedTerminalPanel?.hostedView + // Capture the source terminal's hosted view before bonsplit mutates focusedPaneId, + // so we can hand it to focusPanel as the "move focus FROM" view. + let previousHostedView = focusedTerminalPanel?.hostedView - // Create the split with the new tab already present in the new pane. - isProgrammaticSplit = true - defer { isProgrammaticSplit = false } - guard bonsplitController.splitPane(paneId, orientation: orientation, withTab: newTab, insertFirst: insertFirst) != nil else { - panels.removeValue(forKey: newPanel.id) - panelTitles.removeValue(forKey: newPanel.id) - surfaceIdToPanelId.removeValue(forKey: newTab.id) - return nil - } + // Create the split with the new tab already present in the new pane. + isProgrammaticSplit = true + defer { isProgrammaticSplit = false } + guard bonsplitController.splitPane(paneId, orientation: orientation, withTab: newTab, insertFirst: insertFirst) != nil else { + panels.removeValue(forKey: newPanel.id) + panelTitles.removeValue(forKey: newPanel.id) + surfaceIdToPanelId.removeValue(forKey: newTab.id) + return nil + } #if DEBUG - dlog("split.created pane=\(paneId.id.uuidString.prefix(5)) orientation=\(orientation)") + dlog("split.created pane=\(paneId.id.uuidString.prefix(5)) orientation=\(orientation)") #endif - // Suppress the old view's becomeFirstResponder side-effects during SwiftUI reparenting. - // Without this, reparenting triggers onFocus + ghostty_surface_set_focus on the old view, - // stealing focus from the new panel and creating model/surface divergence. - if focus { - previousHostedView?.suppressReparentFocus() - focusPanel(newPanel.id, previousHostedView: previousHostedView) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - previousHostedView?.clearSuppressReparentFocus() - } - } else { - // Bonsplit focuses the newly-created pane by default; restore the caller's - // pre-split focus context when this split is explicitly non-focus-intent. - if let previousFocusedPanelId, panels[previousFocusedPanelId] != nil { - previousHostedView?.suppressReparentFocus() - focusPanel(previousFocusedPanelId, previousHostedView: previousHostedView) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - previousHostedView?.clearSuppressReparentFocus() - } - } else { - scheduleFocusReconcile() - } - } + // Suppress the old view's becomeFirstResponder side-effects during SwiftUI reparenting. + // Without this, reparenting triggers onFocus + ghostty_surface_set_focus on the old view, + // stealing focus from the new panel and creating model/surface divergence. + if focus { + previousHostedView?.suppressReparentFocus() + focusPanel(newPanel.id, previousHostedView: previousHostedView) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + previousHostedView?.clearSuppressReparentFocus() + } + } else { + preserveFocusAfterNonFocusSplit( + preferredPanelId: previousFocusedPanelId, + splitPanelId: newPanel.id, + previousHostedView: previousHostedView + ) + } - return newPanel - } + return newPanel + } /// Create a new surface (nested tab) in the specified pane with a terminal panel. /// - Parameter focus: nil = focus only if the target pane is already focused (default UI behavior), @@ -1102,38 +1096,32 @@ final class Workspace: Identifiable, ObservableObject { surfaceIdToPanelId[newTab.id] = browserPanel.id let previousFocusedPanelId = focusedPanelId - // Create the split with the browser tab already present. - // Mark this split as programmatic so didSplitPane doesn't auto-create a terminal. - isProgrammaticSplit = true - defer { isProgrammaticSplit = false } - guard bonsplitController.splitPane(paneId, orientation: orientation, withTab: newTab, insertFirst: insertFirst) != nil else { - surfaceIdToPanelId.removeValue(forKey: newTab.id) - panels.removeValue(forKey: browserPanel.id) - panelTitles.removeValue(forKey: browserPanel.id) - return nil - } + // Create the split with the browser tab already present. + // Mark this split as programmatic so didSplitPane doesn't auto-create a terminal. + isProgrammaticSplit = true + defer { isProgrammaticSplit = false } + guard bonsplitController.splitPane(paneId, orientation: orientation, withTab: newTab, insertFirst: insertFirst) != nil else { + surfaceIdToPanelId.removeValue(forKey: newTab.id) + panels.removeValue(forKey: browserPanel.id) + panelTitles.removeValue(forKey: browserPanel.id) + return nil + } - // See newTerminalSplit: suppress old view's becomeFirstResponder during reparenting. - let previousHostedView = focusedTerminalPanel?.hostedView - if focus { - previousHostedView?.suppressReparentFocus() - focusPanel(browserPanel.id) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - previousHostedView?.clearSuppressReparentFocus() - } - } else { - // Bonsplit focuses the newly-created pane by default; restore the caller's - // pre-split focus context when this split is explicitly non-focus-intent. - if let previousFocusedPanelId, panels[previousFocusedPanelId] != nil { - previousHostedView?.suppressReparentFocus() - focusPanel(previousFocusedPanelId, previousHostedView: previousHostedView) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - previousHostedView?.clearSuppressReparentFocus() - } - } else { - scheduleFocusReconcile() - } - } + // See newTerminalSplit: suppress old view's becomeFirstResponder during reparenting. + let previousHostedView = focusedTerminalPanel?.hostedView + if focus { + previousHostedView?.suppressReparentFocus() + focusPanel(browserPanel.id) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + previousHostedView?.clearSuppressReparentFocus() + } + } else { + preserveFocusAfterNonFocusSplit( + preferredPanelId: previousFocusedPanelId, + splitPanelId: browserPanel.id, + previousHostedView: previousHostedView + ) + } installBrowserPanelSubscription(browserPanel) @@ -1559,6 +1547,71 @@ final class Workspace: Identifiable, ObservableObject { } // MARK: - Focus Management + private func preserveFocusAfterNonFocusSplit( + preferredPanelId: UUID?, + splitPanelId: UUID, + previousHostedView: GhosttySurfaceScrollView? + ) { + guard let preferredPanelId, panels[preferredPanelId] != nil else { + scheduleFocusReconcile() + return + } + + // Bonsplit splitPane focuses the newly created pane and may emit one delayed + // didSelect/didFocus callback. Re-assert focus over multiple turns so model + // focus and AppKit first responder stay aligned with non-focus-intent splits. + reassertFocusAfterNonFocusSplit( + preferredPanelId: preferredPanelId, + splitPanelId: splitPanelId, + previousHostedView: previousHostedView, + allowPreviousHostedView: true + ) + + DispatchQueue.main.async { [weak self] in + guard let self else { return } + self.reassertFocusAfterNonFocusSplit( + preferredPanelId: preferredPanelId, + splitPanelId: splitPanelId, + previousHostedView: previousHostedView, + allowPreviousHostedView: false + ) + + DispatchQueue.main.async { [weak self] in + guard let self else { return } + self.reassertFocusAfterNonFocusSplit( + preferredPanelId: preferredPanelId, + splitPanelId: splitPanelId, + previousHostedView: previousHostedView, + allowPreviousHostedView: false + ) + self.scheduleFocusReconcile() + } + } + } + + private func reassertFocusAfterNonFocusSplit( + preferredPanelId: UUID, + splitPanelId: UUID, + previousHostedView: GhosttySurfaceScrollView?, + allowPreviousHostedView: Bool + ) { + guard panels[preferredPanelId] != nil else { return } + + if focusedPanelId == splitPanelId { + focusPanel( + preferredPanelId, + previousHostedView: allowPreviousHostedView ? previousHostedView : nil + ) + return + } + + guard focusedPanelId == preferredPanelId, + let terminalPanel = terminalPanel(for: preferredPanelId) else { + return + } + terminalPanel.hostedView.ensureFocus(for: id, surfaceId: preferredPanelId) + } + func focusPanel(_ panelId: UUID, previousHostedView: GhosttySurfaceScrollView? = nil) { #if DEBUG let pane = bonsplitController.focusedPaneId?.id.uuidString.prefix(5) ?? "nil" diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index b24947bf..137ede9e 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1860,6 +1860,60 @@ final class WorkspacePanelGitBranchTests: XCTestCase { ) } + func testBrowserSplitWithFocusFalseRecoversFromDelayedStaleSelection() { + let workspace = Workspace() + guard let originalFocusedPanelId = workspace.focusedPanelId else { + XCTFail("Expected initial focused panel") + return + } + guard let originalPaneId = workspace.paneId(forPanelId: originalFocusedPanelId) else { + XCTFail("Expected focused pane for initial panel") + return + } + + guard let browserSplitPanel = workspace.newBrowserSplit( + from: originalFocusedPanelId, + orientation: .horizontal, + focus: false + ) else { + XCTFail("Expected browser split panel to be created") + return + } + guard let splitPaneId = workspace.paneId(forPanelId: browserSplitPanel.id), + let splitTabId = workspace.surfaceIdFromPanelId(browserSplitPanel.id), + let splitTab = workspace.bonsplitController + .tabs(inPane: splitPaneId) + .first(where: { $0.id == splitTabId }) else { + XCTFail("Expected split pane/tab mapping") + return + } + + // Simulate one delayed stale split-selection callback from bonsplit. + DispatchQueue.main.async { + workspace.splitTabBar(workspace.bonsplitController, didSelectTab: splitTab, inPane: splitPaneId) + } + + drainMainQueue() + drainMainQueue() + drainMainQueue() + + XCTAssertEqual( + workspace.focusedPanelId, + originalFocusedPanelId, + "Expected non-focus split to reassert the pre-split focused panel" + ) + XCTAssertEqual( + workspace.bonsplitController.focusedPaneId, + originalPaneId, + "Expected focused pane to converge back to the pre-split pane" + ) + XCTAssertEqual( + workspace.bonsplitController.selectedTab(inPane: originalPaneId)?.id, + workspace.surfaceIdFromPanelId(originalFocusedPanelId), + "Expected selected tab to converge back to the pre-split focused panel" + ) + } + func testClosingFocusedSplitRestoresBranchForRemainingFocusedPanel() { let workspace = Workspace() guard let firstPanelId = workspace.focusedPanelId else { From a369cf44195f5022e177fcf524e258c22d6132cd Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:13:15 -0800 Subject: [PATCH 088/214] Prevent background webview autofocus from stealing focus --- Sources/Panels/BrowserPanelView.swift | 14 ++++++++ Sources/Panels/CmuxWebView.swift | 8 +++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 33 +++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 37f0af44..98e311e3 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -3112,6 +3112,11 @@ struct WebViewRepresentable: NSViewRepresentable { let webView = panel.webView context.coordinator.panel = panel context.coordinator.webView = webView + Self.applyWebViewFirstResponderPolicy( + panel: panel, + webView: webView, + isPanelFocused: isPanelFocused + ) let shouldUseWindowPortal = panel.shouldPreserveWebViewAttachmentDuringTransientHide() if shouldUseWindowPortal { @@ -3359,6 +3364,15 @@ struct WebViewRepresentable: NSViewRepresentable { } } + private static func applyWebViewFirstResponderPolicy( + panel: BrowserPanel, + webView: WKWebView, + isPanelFocused: Bool + ) { + guard let cmuxWebView = webView as? CmuxWebView else { return } + cmuxWebView.allowsFirstResponderAcquisition = isPanelFocused && !panel.shouldSuppressWebViewFocus() + } + static func dismantleNSView(_ nsView: NSView, coordinator: Coordinator) { coordinator.attachRetryWorkItem?.cancel() coordinator.attachRetryWorkItem = nil diff --git a/Sources/Panels/CmuxWebView.swift b/Sources/Panels/CmuxWebView.swift index 7ee2d00a..93f5a321 100644 --- a/Sources/Panels/CmuxWebView.swift +++ b/Sources/Panels/CmuxWebView.swift @@ -22,6 +22,14 @@ final class CmuxWebView: WKWebView { var onContextMenuDownloadStateChanged: ((Bool) -> Void)? var contextMenuLinkURLProvider: ((CmuxWebView, NSPoint, @escaping (URL?) -> Void) -> Void)? var contextMenuDefaultBrowserOpener: ((URL) -> Bool)? + /// Guard against background panes stealing first responder (e.g. page autofocus). + /// BrowserPanelView updates this as pane focus state changes. + var allowsFirstResponderAcquisition: Bool = true + + override func becomeFirstResponder() -> Bool { + guard allowsFirstResponderAcquisition else { return false } + return super.becomeFirstResponder() + } override func performKeyEquivalent(with event: NSEvent) -> Bool { // Preserve Cmd+Return/Enter for web content (e.g. editors/forms). Do not diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 137ede9e..d536fed5 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -99,6 +99,39 @@ final class CmuxWebViewKeyEquivalentTests: XCTestCase { XCTAssertTrue(spy.invoked) } + @MainActor + func testCanBlockFirstResponderAcquisitionWhenPaneIsUnfocused() { + _ = NSApplication.shared + + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 640, height: 420), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + let container = NSView(frame: window.contentRect(forFrameRect: window.frame)) + window.contentView = container + + let webView = CmuxWebView(frame: container.bounds, configuration: WKWebViewConfiguration()) + webView.autoresizingMask = [.width, .height] + container.addSubview(webView) + + window.makeKeyAndOrderFront(nil) + defer { window.orderOut(nil) } + + webView.allowsFirstResponderAcquisition = true + XCTAssertTrue(window.makeFirstResponder(webView)) + + _ = window.makeFirstResponder(nil) + webView.allowsFirstResponderAcquisition = false + XCTAssertFalse(webView.becomeFirstResponder()) + + _ = window.makeFirstResponder(webView) + if let firstResponderView = window.firstResponder as? NSView { + XCTAssertFalse(firstResponderView === webView || firstResponderView.isDescendant(of: webView)) + } + } + private func installMenu(spy: ActionSpy, key: String, modifiers: NSEvent.ModifierFlags) { let mainMenu = NSMenu() From 4fd669d76e6b73c61e06118689f30f3d1339fd46 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:34:07 -0800 Subject: [PATCH 089/214] Guard NSWindow responder against unfocused webview descendants --- Sources/AppDelegate.swift | 82 ++++++++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 40 +++++++++ 2 files changed, 120 insertions(+), 2 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index a270f941..f3ab91f3 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -278,6 +278,16 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } method_exchangeImplementations(originalMethod, swizzledMethod) }() + private static let didInstallWindowFirstResponderSwizzle: Void = { + let targetClass: AnyClass = NSWindow.self + let originalSelector = #selector(NSWindow.makeFirstResponder(_:)) + let swizzledSelector = #selector(NSWindow.cmux_makeFirstResponder(_:)) + guard let originalMethod = class_getInstanceMethod(targetClass, originalSelector), + let swizzledMethod = class_getInstanceMethod(targetClass, swizzledSelector) else { + return + } + method_exchangeImplementations(originalMethod, swizzledMethod) + }() #if DEBUG private var didSetupJumpUnreadUITest = false @@ -397,7 +407,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent installMainWindowKeyObserver() refreshGhosttyGotoSplitShortcuts() installGhosttyConfigObserver() - installWindowKeyEquivalentSwizzle() + installWindowResponderSwizzles() installBrowserAddressBarFocusObservers() installShortcutMonitor() installShortcutDefaultsObserver() @@ -1533,8 +1543,14 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } } - private func installWindowKeyEquivalentSwizzle() { + static func installWindowResponderSwizzlesForTesting() { + _ = didInstallWindowKeyEquivalentSwizzle + _ = didInstallWindowFirstResponderSwizzle + } + + private func installWindowResponderSwizzles() { _ = Self.didInstallWindowKeyEquivalentSwizzle + _ = Self.didInstallWindowFirstResponderSwizzle } private func installShortcutMonitor() { @@ -3833,6 +3849,21 @@ enum MenuBarIconRenderer { private extension NSWindow { + @objc func cmux_makeFirstResponder(_ responder: NSResponder?) -> Bool { + if let responder, + let webView = Self.cmuxOwningWebView(for: responder), + !webView.allowsFirstResponderAcquisition { +#if DEBUG + dlog( + "focus.guard blockedFirstResponder responder=\(String(describing: type(of: responder))) " + + "window=\(ObjectIdentifier(self))" + ) +#endif + return false + } + return cmux_makeFirstResponder(responder) + } + @objc func cmux_performKeyEquivalent(with event: NSEvent) -> Bool { #if DEBUG let frType = self.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" @@ -3941,4 +3972,51 @@ private extension NSWindow { parts.append("'\(chars)'(\(event.keyCode))") return parts.joined(separator: "+") } + + private static func cmuxOwningWebView(for responder: NSResponder) -> CmuxWebView? { + if let webView = responder as? CmuxWebView { + return webView + } + + if let view = responder as? NSView, + let webView = cmuxOwningWebView(for: view) { + return webView + } + + if let textView = responder as? NSTextView, + let delegateView = textView.delegate as? NSView, + let webView = cmuxOwningWebView(for: delegateView) { + return webView + } + + var current = responder.nextResponder + while let next = current { + if let webView = next as? CmuxWebView { + return webView + } + if let view = next as? NSView, + let webView = cmuxOwningWebView(for: view) { + return webView + } + current = next.nextResponder + } + + return nil + } + + private static func cmuxOwningWebView(for view: NSView) -> CmuxWebView? { + if let webView = view as? CmuxWebView { + return webView + } + + var current: NSView? = view.superview + while let candidate = current { + if let webView = candidate as? CmuxWebView { + return webView + } + current = candidate.superview + } + + return nil + } } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index d536fed5..9b0980fa 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -63,6 +63,10 @@ final class CmuxWebViewKeyEquivalentTests: XCTestCase { } } + private final class FirstResponderView: NSView { + override var acceptsFirstResponder: Bool { true } + } + func testCmdNRoutesToMainMenuWhenWebViewIsFirstResponder() { let spy = ActionSpy() installMenu(spy: spy, key: "n", modifiers: [.command]) @@ -132,6 +136,42 @@ final class CmuxWebViewKeyEquivalentTests: XCTestCase { } } + @MainActor + func testWindowFirstResponderGuardBlocksDescendantWhenPaneIsUnfocused() { + _ = NSApplication.shared + AppDelegate.installWindowResponderSwizzlesForTesting() + + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 640, height: 420), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + let container = NSView(frame: window.contentRect(forFrameRect: window.frame)) + window.contentView = container + + let webView = CmuxWebView(frame: container.bounds, configuration: WKWebViewConfiguration()) + webView.autoresizingMask = [.width, .height] + container.addSubview(webView) + + let descendant = FirstResponderView(frame: NSRect(x: 0, y: 0, width: 10, height: 10)) + webView.addSubview(descendant) + + window.makeKeyAndOrderFront(nil) + defer { window.orderOut(nil) } + + webView.allowsFirstResponderAcquisition = true + XCTAssertTrue(window.makeFirstResponder(descendant)) + + _ = window.makeFirstResponder(nil) + webView.allowsFirstResponderAcquisition = false + XCTAssertFalse(window.makeFirstResponder(descendant)) + + if let firstResponderView = window.firstResponder as? NSView { + XCTAssertFalse(firstResponderView === descendant || firstResponderView.isDescendant(of: webView)) + } + } + private func installMenu(spy: ActionSpy, key: String, modifiers: NSEvent.ModifierFlags) { let mainMenu = NSMenu() From 6f44f17f33399b77661e56c359adf74cc3965cbd Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:55:06 -0800 Subject: [PATCH 090/214] Fix follow-up PR331 settings and split focus regressions --- Sources/Panels/BrowserPanel.swift | 4 + Sources/Workspace.swift | 89 ++++++++++++++++++- Sources/cmuxApp.swift | 2 +- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 37 ++++++++ 4 files changed, 130 insertions(+), 2 deletions(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 534b6edb..2a683ba5 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -153,6 +153,10 @@ enum BrowserLinkOpenSettings { return defaultInterceptTerminalOpenCommandInCmuxBrowser } + static func initialInterceptTerminalOpenCommandInCmuxBrowserValue(defaults: UserDefaults = .standard) -> Bool { + interceptTerminalOpenCommandInCmuxBrowser(defaults: defaults) + } + static func hostWhitelist(defaults: UserDefaults = .standard) -> [String] { let raw = defaults.string(forKey: browserHostWhitelistKey) ?? defaultBrowserHostWhitelist return raw diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 99bdd74e..d8532cc4 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -488,6 +488,14 @@ final class Workspace: Identifiable, ObservableObject { private var focusReconcileScheduled = false private var geometryReconcileScheduled = false private var isNormalizingPinnedTabOrder = false + private var pendingNonFocusSplitFocusReassert: PendingNonFocusSplitFocusReassert? + private var nonFocusSplitFocusReassertGeneration: UInt64 = 0 + + private struct PendingNonFocusSplitFocusReassert { + let generation: UInt64 + let preferredPanelId: UUID + let splitPanelId: UUID + } struct DetachedSurfaceTransfer { let panelId: UUID @@ -1553,14 +1561,21 @@ final class Workspace: Identifiable, ObservableObject { previousHostedView: GhosttySurfaceScrollView? ) { guard let preferredPanelId, panels[preferredPanelId] != nil else { + clearNonFocusSplitFocusReassert() scheduleFocusReconcile() return } + let generation = beginNonFocusSplitFocusReassert( + preferredPanelId: preferredPanelId, + splitPanelId: splitPanelId + ) + // Bonsplit splitPane focuses the newly created pane and may emit one delayed // didSelect/didFocus callback. Re-assert focus over multiple turns so model // focus and AppKit first responder stay aligned with non-focus-intent splits. reassertFocusAfterNonFocusSplit( + generation: generation, preferredPanelId: preferredPanelId, splitPanelId: splitPanelId, previousHostedView: previousHostedView, @@ -1570,6 +1585,7 @@ final class Workspace: Identifiable, ObservableObject { DispatchQueue.main.async { [weak self] in guard let self else { return } self.reassertFocusAfterNonFocusSplit( + generation: generation, preferredPanelId: preferredPanelId, splitPanelId: splitPanelId, previousHostedView: previousHostedView, @@ -1579,23 +1595,37 @@ final class Workspace: Identifiable, ObservableObject { DispatchQueue.main.async { [weak self] in guard let self else { return } self.reassertFocusAfterNonFocusSplit( + generation: generation, preferredPanelId: preferredPanelId, splitPanelId: splitPanelId, previousHostedView: previousHostedView, allowPreviousHostedView: false ) self.scheduleFocusReconcile() + self.clearNonFocusSplitFocusReassert(generation: generation) } } } private func reassertFocusAfterNonFocusSplit( + generation: UInt64, preferredPanelId: UUID, splitPanelId: UUID, previousHostedView: GhosttySurfaceScrollView?, allowPreviousHostedView: Bool ) { - guard panels[preferredPanelId] != nil else { return } + guard matchesPendingNonFocusSplitFocusReassert( + generation: generation, + preferredPanelId: preferredPanelId, + splitPanelId: splitPanelId + ) else { + return + } + + guard panels[preferredPanelId] != nil else { + clearNonFocusSplitFocusReassert(generation: generation) + return + } if focusedPanelId == splitPanelId { focusPanel( @@ -1613,6 +1643,7 @@ final class Workspace: Identifiable, ObservableObject { } func focusPanel(_ panelId: UUID, previousHostedView: GhosttySurfaceScrollView? = nil) { + markExplicitFocusIntent(on: panelId) #if DEBUG let pane = bonsplitController.focusedPaneId?.id.uuidString.prefix(5) ?? "nil" dlog("focus.panel panel=\(panelId.uuidString.prefix(5)) pane=\(pane)") @@ -2054,6 +2085,11 @@ extension Workspace: BonsplitDelegate { let panel = panels[panelId] else { return } + + if shouldTreatCurrentEventAsExplicitFocusIntent() { + markExplicitFocusIntent(on: panelId) + } + syncPinnedStateForTab(selectedTabId, panelId: panelId) syncUnreadBadgeStateForPanel(panelId) @@ -2105,6 +2141,57 @@ extension Workspace: BonsplitDelegate { ) } + private func beginNonFocusSplitFocusReassert( + preferredPanelId: UUID, + splitPanelId: UUID + ) -> UInt64 { + nonFocusSplitFocusReassertGeneration &+= 1 + let generation = nonFocusSplitFocusReassertGeneration + pendingNonFocusSplitFocusReassert = PendingNonFocusSplitFocusReassert( + generation: generation, + preferredPanelId: preferredPanelId, + splitPanelId: splitPanelId + ) + return generation + } + + private func matchesPendingNonFocusSplitFocusReassert( + generation: UInt64, + preferredPanelId: UUID, + splitPanelId: UUID + ) -> Bool { + guard let pending = pendingNonFocusSplitFocusReassert else { return false } + return pending.generation == generation && + pending.preferredPanelId == preferredPanelId && + pending.splitPanelId == splitPanelId + } + + private func clearNonFocusSplitFocusReassert(generation: UInt64? = nil) { + guard let pending = pendingNonFocusSplitFocusReassert else { return } + if let generation, pending.generation != generation { return } + pendingNonFocusSplitFocusReassert = nil + } + + private func shouldTreatCurrentEventAsExplicitFocusIntent() -> Bool { + guard let eventType = NSApp.currentEvent?.type else { return false } + switch eventType { + case .leftMouseDown, .leftMouseUp, .rightMouseDown, .rightMouseUp, + .otherMouseDown, .otherMouseUp, .keyDown, .keyUp, .scrollWheel, + .gesture, .magnify, .rotate, .swipe: + return true + default: + return false + } + } + + private func markExplicitFocusIntent(on panelId: UUID) { + guard let pending = pendingNonFocusSplitFocusReassert, + pending.splitPanelId == panelId else { + return + } + pendingNonFocusSplitFocusReassert = nil + } + func splitTabBar(_ controller: BonsplitController, shouldCloseTab tab: Bonsplit.Tab, inPane pane: PaneID) -> Bool { func recordPostCloseSelection() { let tabs = controller.tabs(inPane: pane) diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 47c22d8d..7ed81980 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -2560,7 +2560,7 @@ struct SettingsView: View { @AppStorage(BrowserThemeSettings.modeKey) private var browserThemeMode = BrowserThemeSettings.defaultMode.rawValue @AppStorage(BrowserLinkOpenSettings.openTerminalLinksInCmuxBrowserKey) private var openTerminalLinksInCmuxBrowser = BrowserLinkOpenSettings.defaultOpenTerminalLinksInCmuxBrowser @AppStorage(BrowserLinkOpenSettings.interceptTerminalOpenCommandInCmuxBrowserKey) - private var interceptTerminalOpenCommandInCmuxBrowser = BrowserLinkOpenSettings.defaultInterceptTerminalOpenCommandInCmuxBrowser + private var interceptTerminalOpenCommandInCmuxBrowser = BrowserLinkOpenSettings.initialInterceptTerminalOpenCommandInCmuxBrowserValue() @AppStorage(BrowserLinkOpenSettings.browserHostWhitelistKey) private var browserHostWhitelist = BrowserLinkOpenSettings.defaultBrowserHostWhitelist @AppStorage(BrowserInsecureHTTPSettings.allowlistKey) private var browserInsecureHTTPAllowlist = BrowserInsecureHTTPSettings.defaultAllowlistText @AppStorage(NotificationBadgeSettings.dockBadgeEnabledKey) private var notificationDockBadgeEnabled = NotificationBadgeSettings.defaultDockBadgeEnabled diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 9b0980fa..89b59080 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1987,6 +1987,35 @@ final class WorkspacePanelGitBranchTests: XCTestCase { ) } + func testBrowserSplitWithFocusFalseAllowsSubsequentExplicitFocusOnSplitPanel() { + let workspace = Workspace() + guard let originalFocusedPanelId = workspace.focusedPanelId else { + XCTFail("Expected initial focused panel") + return + } + + guard let browserSplitPanel = workspace.newBrowserSplit( + from: originalFocusedPanelId, + orientation: .horizontal, + focus: false + ) else { + XCTFail("Expected browser split panel to be created") + return + } + + workspace.focusPanel(browserSplitPanel.id) + + drainMainQueue() + drainMainQueue() + drainMainQueue() + + XCTAssertEqual( + workspace.focusedPanelId, + browserSplitPanel.id, + "Expected explicit focus intent to keep the split panel focused" + ) + } + func testClosingFocusedSplitRestoresBranchForRemainingFocusedPanel() { let workspace = Workspace() guard let firstPanelId = workspace.focusedPanelId else { @@ -4347,6 +4376,14 @@ final class BrowserLinkOpenSettingsTests: XCTestCase { defaults.set(true, forKey: BrowserLinkOpenSettings.openTerminalLinksInCmuxBrowserKey) XCTAssertTrue(BrowserLinkOpenSettings.interceptTerminalOpenCommandInCmuxBrowser(defaults: defaults)) } + + func testSettingsInitialOpenCommandInterceptionValueFallsBackToLegacyLinkToggleWhenUnset() { + defaults.set(false, forKey: BrowserLinkOpenSettings.openTerminalLinksInCmuxBrowserKey) + XCTAssertFalse(BrowserLinkOpenSettings.initialInterceptTerminalOpenCommandInCmuxBrowserValue(defaults: defaults)) + + defaults.set(true, forKey: BrowserLinkOpenSettings.openTerminalLinksInCmuxBrowserKey) + XCTAssertTrue(BrowserLinkOpenSettings.initialInterceptTerminalOpenCommandInCmuxBrowserValue(defaults: defaults)) + } } final class TerminalOpenURLTargetResolutionTests: XCTestCase { From 283b8983077de715548c7dbccc55a72e57e0be5a Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:57:46 -0800 Subject: [PATCH 091/214] Match bonsplit border styling to Ghostty split divider color --- Sources/Workspace.swift | 64 +++++++++++++++++++++++++++++++++++------ vendor/bonsplit | 2 +- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 99bdd74e..79be6461 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -329,7 +329,10 @@ final class Workspace: Identifiable, ObservableObject { } private static func bonsplitAppearance(from config: GhosttyConfig) -> BonsplitConfiguration.Appearance { - bonsplitAppearance(from: config.backgroundColor) + bonsplitAppearance( + from: config.backgroundColor, + splitDividerColor: config.resolvedSplitDividerColor + ) } private static func usesDarkChrome( @@ -347,25 +350,70 @@ final class Workspace: Identifiable, ObservableObject { return backgroundColor.hexString() } - private static func bonsplitAppearance(from backgroundColor: NSColor) -> BonsplitConfiguration.Appearance { - let backgroundHex = resolvedChromeBackgroundHex(from: backgroundColor) + private static func resolvedChromeBorderColor( + from backgroundColor: NSColor, + splitDividerColor: NSColor? + ) -> NSColor { + if let splitDividerColor { + return splitDividerColor + } + let isLightBackground = backgroundColor.isLightColor + return backgroundColor.darken(by: isLightBackground ? 0.08 : 0.4) + } + + private static func resolvedChromeColors( + from backgroundColor: NSColor, + splitDividerColor: NSColor? = nil + ) -> BonsplitConfiguration.Appearance.ChromeColors { + guard let backgroundHex = resolvedChromeBackgroundHex(from: backgroundColor) else { + return .init() + } + let borderHex = resolvedChromeBorderColor( + from: backgroundColor, + splitDividerColor: splitDividerColor + ).hexString() + return .init(backgroundHex: backgroundHex, borderHex: borderHex) + } + + private static func bonsplitAppearance( + from backgroundColor: NSColor, + splitDividerColor: NSColor? = nil + ) -> BonsplitConfiguration.Appearance { + let chromeColors = resolvedChromeColors( + from: backgroundColor, + splitDividerColor: splitDividerColor + ) return BonsplitConfiguration.Appearance( splitButtonTooltips: Self.currentSplitButtonTooltips(), enableAnimations: false, - chromeColors: .init(backgroundHex: backgroundHex) + chromeColors: chromeColors ) } func applyGhosttyChrome(from config: GhosttyConfig) { - applyGhosttyChrome(backgroundColor: config.backgroundColor) + applyGhosttyChrome( + backgroundColor: config.backgroundColor, + splitDividerColor: config.resolvedSplitDividerColor + ) } func applyGhosttyChrome(backgroundColor: NSColor) { - let nextHex = Self.resolvedChromeBackgroundHex(from: backgroundColor) - if bonsplitController.configuration.appearance.chromeColors.backgroundHex == nextHex { + applyGhosttyChrome(backgroundColor: backgroundColor, splitDividerColor: nil) + } + + private func applyGhosttyChrome( + backgroundColor: NSColor, + splitDividerColor: NSColor? + ) { + let nextChromeColors = Self.resolvedChromeColors( + from: backgroundColor, + splitDividerColor: splitDividerColor + ) + if bonsplitController.configuration.appearance.chromeColors.backgroundHex == nextChromeColors.backgroundHex && + bonsplitController.configuration.appearance.chromeColors.borderHex == nextChromeColors.borderHex { return } - bonsplitController.configuration.appearance.chromeColors.backgroundHex = nextHex + bonsplitController.configuration.appearance.chromeColors = nextChromeColors } init(title: String = "Terminal", workingDirectory: String? = nil, portOrdinal: Int = 0) { diff --git a/vendor/bonsplit b/vendor/bonsplit index 0dd965a7..6cdbea4f 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit 0dd965a75f02f7a358f87fd607a9e2034450a79c +Subproject commit 6cdbea4f9051517d292d0e859ae71427e04e7fde From d31cbb7123bdf30925958275a7a5d95c9df18812 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 20:01:37 -0800 Subject: [PATCH 092/214] Use gray separator borders and drop active-tab bottom border --- Sources/Workspace.swift | 52 ++++++----------------------------------- vendor/bonsplit | 2 +- 2 files changed, 8 insertions(+), 46 deletions(-) diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 79be6461..e6a5d83f 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -329,10 +329,7 @@ final class Workspace: Identifiable, ObservableObject { } private static func bonsplitAppearance(from config: GhosttyConfig) -> BonsplitConfiguration.Appearance { - bonsplitAppearance( - from: config.backgroundColor, - splitDividerColor: config.resolvedSplitDividerColor - ) + bonsplitAppearance(from: config.backgroundColor) } private static func usesDarkChrome( @@ -350,39 +347,17 @@ final class Workspace: Identifiable, ObservableObject { return backgroundColor.hexString() } - private static func resolvedChromeBorderColor( - from backgroundColor: NSColor, - splitDividerColor: NSColor? - ) -> NSColor { - if let splitDividerColor { - return splitDividerColor - } - let isLightBackground = backgroundColor.isLightColor - return backgroundColor.darken(by: isLightBackground ? 0.08 : 0.4) - } - private static func resolvedChromeColors( - from backgroundColor: NSColor, - splitDividerColor: NSColor? = nil + from backgroundColor: NSColor ) -> BonsplitConfiguration.Appearance.ChromeColors { guard let backgroundHex = resolvedChromeBackgroundHex(from: backgroundColor) else { return .init() } - let borderHex = resolvedChromeBorderColor( - from: backgroundColor, - splitDividerColor: splitDividerColor - ).hexString() - return .init(backgroundHex: backgroundHex, borderHex: borderHex) + return .init(backgroundHex: backgroundHex) } - private static func bonsplitAppearance( - from backgroundColor: NSColor, - splitDividerColor: NSColor? = nil - ) -> BonsplitConfiguration.Appearance { - let chromeColors = resolvedChromeColors( - from: backgroundColor, - splitDividerColor: splitDividerColor - ) + private static func bonsplitAppearance(from backgroundColor: NSColor) -> BonsplitConfiguration.Appearance { + let chromeColors = resolvedChromeColors(from: backgroundColor) return BonsplitConfiguration.Appearance( splitButtonTooltips: Self.currentSplitButtonTooltips(), enableAnimations: false, @@ -391,24 +366,11 @@ final class Workspace: Identifiable, ObservableObject { } func applyGhosttyChrome(from config: GhosttyConfig) { - applyGhosttyChrome( - backgroundColor: config.backgroundColor, - splitDividerColor: config.resolvedSplitDividerColor - ) + applyGhosttyChrome(backgroundColor: config.backgroundColor) } func applyGhosttyChrome(backgroundColor: NSColor) { - applyGhosttyChrome(backgroundColor: backgroundColor, splitDividerColor: nil) - } - - private func applyGhosttyChrome( - backgroundColor: NSColor, - splitDividerColor: NSColor? - ) { - let nextChromeColors = Self.resolvedChromeColors( - from: backgroundColor, - splitDividerColor: splitDividerColor - ) + let nextChromeColors = Self.resolvedChromeColors(from: backgroundColor) if bonsplitController.configuration.appearance.chromeColors.backgroundHex == nextChromeColors.backgroundHex && bonsplitController.configuration.appearance.chromeColors.borderHex == nextChromeColors.borderHex { return diff --git a/vendor/bonsplit b/vendor/bonsplit index 6cdbea4f..f3761ac6 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit 6cdbea4f9051517d292d0e859ae71427e04e7fde +Subproject commit f3761ac696294c3aa85a2e2e5d28e3c37477524e From 4e172abb66958148bc85121d6191feec9fd288aa Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 20:03:39 -0800 Subject: [PATCH 093/214] Update bonsplit for selected-tab separator fix --- vendor/bonsplit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/bonsplit b/vendor/bonsplit index f3761ac6..3758476b 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit f3761ac696294c3aa85a2e2e5d28e3c37477524e +Subproject commit 3758476b10f85fe4df24bc8ee27e892ea7867c25 From 881ebb2386507f152d295b4f6873e7f6594edaca Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 20:07:22 -0800 Subject: [PATCH 094/214] Update bonsplit for selected-tab separator gap --- vendor/bonsplit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/bonsplit b/vendor/bonsplit index 3758476b..ad6ca8c3 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit 3758476b10f85fe4df24bc8ee27e892ea7867c25 +Subproject commit ad6ca8c3de070f10e7ac8f2941ddb3bcbc023820 From 42f1933c80f617167968b25acce4bdae63662134 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 22:21:54 -0800 Subject: [PATCH 095/214] Update bonsplit submodule to fix Release build (#341) Picks up manaflow-ai/bonsplit#8 which moves ThemedSplitView outside #if DEBUG so it compiles in Release configuration (fixes nightly). --- vendor/bonsplit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/bonsplit b/vendor/bonsplit index ad6ca8c3..c9186860 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit ad6ca8c3de070f10e7ac8f2941ddb3bcbc023820 +Subproject commit c91868601ef27e673ca884639a724f2d10fcd54d From e90b45f75eccb30a1088007b59bf646451732dc4 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Sun, 22 Feb 2026 23:48:13 -0800 Subject: [PATCH 096/214] Match bonsplit chrome to Ghostty theme --- Sources/Workspace.swift | 22 ++-------------------- cmuxTests/GhosttyConfigTests.swift | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 572fbc57..6c8d20cc 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -332,28 +332,10 @@ final class Workspace: Identifiable, ObservableObject { bonsplitAppearance(from: config.backgroundColor) } - private static func usesDarkChrome( - appAppearance: NSAppearance? = NSApp?.effectiveAppearance - ) -> Bool { - guard let appAppearance else { return false } - return appAppearance.bestMatch(from: [.darkAqua, .aqua]) == .darkAqua - } - - private static func resolvedChromeBackgroundHex( - from backgroundColor: NSColor, - appAppearance: NSAppearance? = NSApp?.effectiveAppearance - ) -> String? { - guard usesDarkChrome(appAppearance: appAppearance) else { return nil } - return backgroundColor.hexString() - } - - private static func resolvedChromeColors( + nonisolated static func resolvedChromeColors( from backgroundColor: NSColor ) -> BonsplitConfiguration.Appearance.ChromeColors { - guard let backgroundHex = resolvedChromeBackgroundHex(from: backgroundColor) else { - return .init() - } - return .init(backgroundHex: backgroundHex) + .init(backgroundHex: backgroundColor.hexString()) } private static func bonsplitAppearance(from backgroundColor: NSColor) -> BonsplitConfiguration.Appearance { diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index effff6ad..25946b38 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -208,6 +208,30 @@ final class GhosttyConfigTests: XCTestCase { } } +final class WorkspaceChromeThemeTests: XCTestCase { + func testResolvedChromeColorsUsesLightGhosttyBackground() { + guard let backgroundColor = NSColor(hex: "#FDF6E3") else { + XCTFail("Expected valid test color") + return + } + + let colors = Workspace.resolvedChromeColors(from: backgroundColor) + XCTAssertEqual(colors.backgroundHex, "#FDF6E3") + XCTAssertNil(colors.borderHex) + } + + func testResolvedChromeColorsUsesDarkGhosttyBackground() { + guard let backgroundColor = NSColor(hex: "#272822") else { + XCTFail("Expected valid test color") + return + } + + let colors = Workspace.resolvedChromeColors(from: backgroundColor) + XCTAssertEqual(colors.backgroundHex, "#272822") + XCTAssertNil(colors.borderHex) + } +} + final class NotificationBurstCoalescerTests: XCTestCase { func testSignalsInSameBurstFlushOnce() { let coalescer = NotificationBurstCoalescer(delay: 0.01) From 963bb03e99e7380cfa86225e3fb36074df74274e Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 00:06:39 -0800 Subject: [PATCH 097/214] Refactor workspace theme refresh to shared resolver --- Sources/WorkspaceContentView.swift | 22 +++++++++++---- cmuxTests/GhosttyConfigTests.swift | 45 ++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index 4ba398be..ad1d48d2 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -9,7 +9,7 @@ struct WorkspaceContentView: View { let isWorkspaceVisible: Bool let isWorkspaceInputActive: Bool let workspacePortalPriority: Int - @State private var config = GhosttyConfig.load() + @State private var config = WorkspaceContentView.resolveGhosttyAppearanceConfig() @Environment(\.colorScheme) private var colorScheme @EnvironmentObject var notificationStore: TerminalNotificationStore @@ -87,7 +87,7 @@ struct WorkspaceContentView: View { .frame(maxWidth: .infinity, maxHeight: .infinity) .onAppear { syncBonsplitNotificationBadges() - workspace.applyGhosttyChrome(backgroundColor: GhosttyApp.shared.defaultBackgroundColor) + refreshGhosttyAppearanceConfig() } .onChange(of: notificationStore.notifications) { _, _ in syncBonsplitNotificationBadges() @@ -104,9 +104,9 @@ struct WorkspaceContentView: View { } .onReceive(NotificationCenter.default.publisher(for: .ghosttyDefaultBackgroundDidChange)) { notification in if let backgroundColor = notification.userInfo?[GhosttyNotificationKey.backgroundColor] as? NSColor { - workspace.applyGhosttyChrome(backgroundColor: backgroundColor) + refreshGhosttyAppearanceConfig(backgroundOverride: backgroundColor) } else { - workspace.applyGhosttyChrome(backgroundColor: GhosttyApp.shared.defaultBackgroundColor) + refreshGhosttyAppearanceConfig() } } } @@ -141,8 +141,18 @@ struct WorkspaceContentView: View { } } - private func refreshGhosttyAppearanceConfig() { - let next = GhosttyConfig.load() + static func resolveGhosttyAppearanceConfig( + backgroundOverride: NSColor? = nil, + loadConfig: () -> GhosttyConfig = GhosttyConfig.load, + defaultBackground: () -> NSColor = { GhosttyApp.shared.defaultBackgroundColor } + ) -> GhosttyConfig { + var next = loadConfig() + next.backgroundColor = backgroundOverride ?? defaultBackground() + return next + } + + private func refreshGhosttyAppearanceConfig(backgroundOverride: NSColor? = nil) { + let next = Self.resolveGhosttyAppearanceConfig(backgroundOverride: backgroundOverride) config = next workspace.applyGhosttyChrome(from: next) } diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index 25946b38..2e28bf5f 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -232,6 +232,51 @@ final class WorkspaceChromeThemeTests: XCTestCase { } } +final class WorkspaceAppearanceConfigResolutionTests: XCTestCase { + func testResolvedAppearanceConfigPrefersGhosttyRuntimeBackgroundOverLoadedConfig() { + guard let loadedBackground = NSColor(hex: "#112233"), + let runtimeBackground = NSColor(hex: "#FDF6E3"), + let loadedForeground = NSColor(hex: "#ABCDEF") else { + XCTFail("Expected valid test colors") + return + } + + var loaded = GhosttyConfig() + loaded.backgroundColor = loadedBackground + loaded.foregroundColor = loadedForeground + loaded.unfocusedSplitOpacity = 0.42 + + let resolved = WorkspaceContentView.resolveGhosttyAppearanceConfig( + loadConfig: { loaded }, + defaultBackground: { runtimeBackground } + ) + + XCTAssertEqual(resolved.backgroundColor.hexString(), "#FDF6E3") + XCTAssertEqual(resolved.foregroundColor.hexString(), "#ABCDEF") + XCTAssertEqual(resolved.unfocusedSplitOpacity, 0.42, accuracy: 0.0001) + } + + func testResolvedAppearanceConfigPrefersExplicitBackgroundOverride() { + guard let loadedBackground = NSColor(hex: "#112233"), + let runtimeBackground = NSColor(hex: "#FDF6E3"), + let explicitOverride = NSColor(hex: "#272822") else { + XCTFail("Expected valid test colors") + return + } + + var loaded = GhosttyConfig() + loaded.backgroundColor = loadedBackground + + let resolved = WorkspaceContentView.resolveGhosttyAppearanceConfig( + backgroundOverride: explicitOverride, + loadConfig: { loaded }, + defaultBackground: { runtimeBackground } + ) + + XCTAssertEqual(resolved.backgroundColor.hexString(), "#272822") + } +} + final class NotificationBurstCoalescerTests: XCTestCase { func testSignalsInSameBurstFlushOnce() { let coalescer = NotificationBurstCoalescer(delay: 0.01) From 8f68ddb947edcfa1f25b49b36fa3075ea5cbfbec Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 00:14:10 -0800 Subject: [PATCH 098/214] Add filesystem logs for theme resolution flow --- Sources/GhosttyTerminalView.swift | 25 +++++++++++++- Sources/Workspace.swift | 15 +++++++-- Sources/WorkspaceContentView.swift | 54 ++++++++++++++++++++++++------ 3 files changed, 81 insertions(+), 13 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 3c3fa1a0..ed21b275 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -166,10 +166,33 @@ class GhosttyApp { private(set) var config: ghostty_config_t? private(set) var defaultBackgroundColor: NSColor = .windowBackgroundColor private(set) var defaultBackgroundOpacity: Double = 1.0 + private static func resolveBackgroundLogURL( + environment: [String: String] = ProcessInfo.processInfo.environment + ) -> URL { + if let explicitPath = environment["CMUX_DEBUG_BG_LOG"], + !explicitPath.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + return URL(fileURLWithPath: explicitPath) + } + + if let debugLogPath = environment["CMUX_DEBUG_LOG"], + !debugLogPath.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + let baseURL = URL(fileURLWithPath: debugLogPath) + let extensionSeparatorIndex = baseURL.lastPathComponent.lastIndex(of: ".") + let stem = extensionSeparatorIndex.map { String(baseURL.lastPathComponent[..<$0]) } ?? baseURL.lastPathComponent + let bgName = "\(stem)-bg.log" + return baseURL.deletingLastPathComponent().appendingPathComponent(bgName) + } + + return URL(fileURLWithPath: "/tmp/cmux-bg.log") + } + let backgroundLogEnabled = { if ProcessInfo.processInfo.environment["CMUX_DEBUG_BG"] == "1" { return true } + if ProcessInfo.processInfo.environment["CMUX_DEBUG_LOG"] != nil { + return true + } if ProcessInfo.processInfo.environment["GHOSTTYTABS_DEBUG_BG"] == "1" { return true } @@ -178,7 +201,7 @@ class GhosttyApp { } return UserDefaults.standard.bool(forKey: "GhosttyTabsDebugBG") }() - private let backgroundLogURL = URL(fileURLWithPath: "/tmp/cmux-bg.log") + private let backgroundLogURL = GhosttyApp.resolveBackgroundLogURL() private var appObservers: [NSObjectProtocol] = [] // Scroll lag tracking diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 6c8d20cc..99d17dcf 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -352,9 +352,20 @@ final class Workspace: Identifiable, ObservableObject { } func applyGhosttyChrome(backgroundColor: NSColor) { + let currentChromeColors = bonsplitController.configuration.appearance.chromeColors let nextChromeColors = Self.resolvedChromeColors(from: backgroundColor) - if bonsplitController.configuration.appearance.chromeColors.backgroundHex == nextChromeColors.backgroundHex && - bonsplitController.configuration.appearance.chromeColors.borderHex == nextChromeColors.borderHex { + let isNoOp = currentChromeColors.backgroundHex == nextChromeColors.backgroundHex && + currentChromeColors.borderHex == nextChromeColors.borderHex + + if GhosttyApp.shared.backgroundLogEnabled { + let currentBackgroundHex = currentChromeColors.backgroundHex ?? "nil" + let nextBackgroundHex = nextChromeColors.backgroundHex ?? "nil" + GhosttyApp.shared.logBackground( + "theme apply workspace=\(id.uuidString) currentBg=\(currentBackgroundHex) nextBg=\(nextBackgroundHex) currentBorder=\(currentChromeColors.borderHex ?? "nil") nextBorder=\(nextChromeColors.borderHex ?? "nil") noop=\(isNoOp)" + ) + } + + if isNoOp { return } bonsplitController.configuration.appearance.chromeColors = nextChromeColors diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index ad1d48d2..ebe6a414 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -9,7 +9,7 @@ struct WorkspaceContentView: View { let isWorkspaceVisible: Bool let isWorkspaceInputActive: Bool let workspacePortalPriority: Int - @State private var config = WorkspaceContentView.resolveGhosttyAppearanceConfig() + @State private var config = WorkspaceContentView.resolveGhosttyAppearanceConfig(reason: "stateInit") @Environment(\.colorScheme) private var colorScheme @EnvironmentObject var notificationStore: TerminalNotificationStore @@ -87,7 +87,7 @@ struct WorkspaceContentView: View { .frame(maxWidth: .infinity, maxHeight: .infinity) .onAppear { syncBonsplitNotificationBadges() - refreshGhosttyAppearanceConfig() + refreshGhosttyAppearanceConfig(reason: "onAppear") } .onChange(of: notificationStore.notifications) { _, _ in syncBonsplitNotificationBadges() @@ -96,17 +96,20 @@ struct WorkspaceContentView: View { syncBonsplitNotificationBadges() } .onReceive(NotificationCenter.default.publisher(for: .ghosttyConfigDidReload)) { _ in - refreshGhosttyAppearanceConfig() + refreshGhosttyAppearanceConfig(reason: "ghosttyConfigDidReload") } - .onChange(of: colorScheme) { _, _ in + .onChange(of: colorScheme) { oldValue, newValue in // Keep split overlay color/opacity in sync with light/dark theme transitions. - refreshGhosttyAppearanceConfig() + refreshGhosttyAppearanceConfig(reason: "colorSchemeChanged:\(oldValue)->\(newValue)") } .onReceive(NotificationCenter.default.publisher(for: .ghosttyDefaultBackgroundDidChange)) { notification in if let backgroundColor = notification.userInfo?[GhosttyNotificationKey.backgroundColor] as? NSColor { - refreshGhosttyAppearanceConfig(backgroundOverride: backgroundColor) + refreshGhosttyAppearanceConfig( + reason: "ghosttyDefaultBackgroundDidChange:withPayload", + backgroundOverride: backgroundColor + ) } else { - refreshGhosttyAppearanceConfig() + refreshGhosttyAppearanceConfig(reason: "ghosttyDefaultBackgroundDidChange:withoutPayload") } } } @@ -142,20 +145,51 @@ struct WorkspaceContentView: View { } static func resolveGhosttyAppearanceConfig( + reason: String = "unspecified", backgroundOverride: NSColor? = nil, loadConfig: () -> GhosttyConfig = GhosttyConfig.load, defaultBackground: () -> NSColor = { GhosttyApp.shared.defaultBackgroundColor } ) -> GhosttyConfig { var next = loadConfig() - next.backgroundColor = backgroundOverride ?? defaultBackground() + let loadedBackgroundHex = next.backgroundColor.hexString() + let defaultBackgroundHex: String + let resolvedBackground: NSColor + + if let backgroundOverride { + resolvedBackground = backgroundOverride + defaultBackgroundHex = "skipped" + } else { + let fallback = defaultBackground() + resolvedBackground = fallback + defaultBackgroundHex = fallback.hexString() + } + + next.backgroundColor = resolvedBackground + if GhosttyApp.shared.backgroundLogEnabled { + GhosttyApp.shared.logBackground( + "theme resolve reason=\(reason) loadedBg=\(loadedBackgroundHex) overrideBg=\(backgroundOverride?.hexString() ?? "nil") defaultBg=\(defaultBackgroundHex) finalBg=\(next.backgroundColor.hexString()) theme=\(next.theme ?? "nil")" + ) + } return next } - private func refreshGhosttyAppearanceConfig(backgroundOverride: NSColor? = nil) { - let next = Self.resolveGhosttyAppearanceConfig(backgroundOverride: backgroundOverride) + private func refreshGhosttyAppearanceConfig(reason: String, backgroundOverride: NSColor? = nil) { + let previousBackgroundHex = config.backgroundColor.hexString() + let next = Self.resolveGhosttyAppearanceConfig( + reason: reason, + backgroundOverride: backgroundOverride + ) + logTheme( + "theme refresh workspace=\(workspace.id.uuidString) reason=\(reason) previousBg=\(previousBackgroundHex) nextBg=\(next.backgroundColor.hexString()) overrideBg=\(backgroundOverride?.hexString() ?? "nil")" + ) config = next workspace.applyGhosttyChrome(from: next) } + + private func logTheme(_ message: String) { + guard GhosttyApp.shared.backgroundLogEnabled else { return } + GhosttyApp.shared.logBackground(message) + } } extension WorkspaceContentView { From 790f3c8287f0a4bfa7375c6820f07279bbcd9d60 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 00:20:12 -0800 Subject: [PATCH 099/214] Ignore stale background payload in theme refresh --- Sources/WorkspaceContentView.swift | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index ebe6a414..1ab7655f 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -103,14 +103,13 @@ struct WorkspaceContentView: View { refreshGhosttyAppearanceConfig(reason: "colorSchemeChanged:\(oldValue)->\(newValue)") } .onReceive(NotificationCenter.default.publisher(for: .ghosttyDefaultBackgroundDidChange)) { notification in - if let backgroundColor = notification.userInfo?[GhosttyNotificationKey.backgroundColor] as? NSColor { - refreshGhosttyAppearanceConfig( - reason: "ghosttyDefaultBackgroundDidChange:withPayload", - backgroundOverride: backgroundColor - ) - } else { - refreshGhosttyAppearanceConfig(reason: "ghosttyDefaultBackgroundDidChange:withoutPayload") - } + let payloadHex = (notification.userInfo?[GhosttyNotificationKey.backgroundColor] as? NSColor)?.hexString() ?? "nil" + // Payload ordering can lag across rapid config/theme updates. + // Resolve from GhosttyApp.shared.defaultBackgroundColor to keep tabs aligned + // with Ghostty's current runtime theme. + refreshGhosttyAppearanceConfig( + reason: "ghosttyDefaultBackgroundDidChange:payload=\(payloadHex)" + ) } } From afba0fb4597f185f8ff319d5a5afa17762a42fc8 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 00:29:16 -0800 Subject: [PATCH 100/214] Coalesce Ghostty background notifications to latest value --- Sources/GhosttyTerminalView.swift | 63 ++++++++++++++++++------- cmuxTests/GhosttyConfigTests.swift | 75 ++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 16 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index ed21b275..af2a94a4 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -124,6 +124,48 @@ enum TerminalOpenURLTarget: Equatable { } } +/// Coalesces Ghostty background notifications so consumers only observe +/// the latest runtime background for a burst of updates. +final class GhosttyDefaultBackgroundNotificationDispatcher { + private let coalescer: NotificationBurstCoalescer + private let postNotification: ([AnyHashable: Any]) -> Void + private var pendingUserInfo: [AnyHashable: Any]? + + init( + delay: TimeInterval = 1.0 / 30.0, + postNotification: @escaping ([AnyHashable: Any]) -> Void = { userInfo in + NotificationCenter.default.post( + name: .ghosttyDefaultBackgroundDidChange, + object: nil, + userInfo: userInfo + ) + } + ) { + coalescer = NotificationBurstCoalescer(delay: delay) + self.postNotification = postNotification + } + + func signal(backgroundColor: NSColor, opacity: Double) { + let signalOnMain = { [self] in + pendingUserInfo = [ + GhosttyNotificationKey.backgroundColor: backgroundColor, + GhosttyNotificationKey.backgroundOpacity: opacity + ] + coalescer.signal { [self] in + guard let userInfo = pendingUserInfo else { return } + pendingUserInfo = nil + postNotification(userInfo) + } + } + + if Thread.isMainThread { + signalOnMain() + } else { + DispatchQueue.main.async(execute: signalOnMain) + } + } +} + func resolveTerminalOpenURLTarget(_ rawValue: String) -> TerminalOpenURLTarget? { let trimmed = rawValue.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return nil } @@ -203,6 +245,7 @@ class GhosttyApp { }() private let backgroundLogURL = GhosttyApp.resolveBackgroundLogURL() private var appObservers: [NSObjectProtocol] = [] + private let defaultBackgroundNotificationDispatcher = GhosttyDefaultBackgroundNotificationDispatcher() // Scroll lag tracking private(set) var isScrolling = false @@ -631,22 +674,10 @@ class GhosttyApp { } private func notifyDefaultBackgroundDidChange() { - let userInfo: [AnyHashable: Any] = [ - GhosttyNotificationKey.backgroundColor: defaultBackgroundColor, - GhosttyNotificationKey.backgroundOpacity: defaultBackgroundOpacity - ] - let post = { - NotificationCenter.default.post( - name: .ghosttyDefaultBackgroundDidChange, - object: nil, - userInfo: userInfo - ) - } - if Thread.isMainThread { - post() - } else { - DispatchQueue.main.async(execute: post) - } + defaultBackgroundNotificationDispatcher.signal( + backgroundColor: defaultBackgroundColor, + opacity: defaultBackgroundOpacity + ) } private func performOnMain<T>(_ work: @MainActor () -> T) -> T { diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index 2e28bf5f..80a5d1f4 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -340,6 +340,81 @@ final class NotificationBurstCoalescerTests: XCTestCase { } } +final class GhosttyDefaultBackgroundNotificationDispatcherTests: XCTestCase { + func testSignalCoalescesBurstToLatestBackground() { + guard let dark = NSColor(hex: "#272822"), + let light = NSColor(hex: "#FDF6E3") else { + XCTFail("Expected valid test colors") + return + } + + let expectation = expectation(description: "coalesced notification") + expectation.expectedFulfillmentCount = 1 + var postedUserInfos: [[AnyHashable: Any]] = [] + + let dispatcher = GhosttyDefaultBackgroundNotificationDispatcher(delay: 0.01) { userInfo in + postedUserInfos.append(userInfo) + expectation.fulfill() + } + + DispatchQueue.main.async { + dispatcher.signal(backgroundColor: dark, opacity: 0.95) + dispatcher.signal(backgroundColor: light, opacity: 0.75) + } + + wait(for: [expectation], timeout: 1.0) + XCTAssertEqual(postedUserInfos.count, 1) + XCTAssertEqual( + (postedUserInfos[0][GhosttyNotificationKey.backgroundColor] as? NSColor)?.hexString(), + "#FDF6E3" + ) + XCTAssertEqual( + postedOpacity(from: postedUserInfos[0][GhosttyNotificationKey.backgroundOpacity]), + 0.75, + accuracy: 0.0001 + ) + } + + func testSignalAcrossSeparateBurstsPostsMultipleNotifications() { + guard let dark = NSColor(hex: "#272822"), + let light = NSColor(hex: "#FDF6E3") else { + XCTFail("Expected valid test colors") + return + } + + let expectation = expectation(description: "two notifications") + expectation.expectedFulfillmentCount = 2 + var postedHexes: [String] = [] + + let dispatcher = GhosttyDefaultBackgroundNotificationDispatcher(delay: 0.01) { userInfo in + let hex = (userInfo[GhosttyNotificationKey.backgroundColor] as? NSColor)?.hexString() ?? "nil" + postedHexes.append(hex) + expectation.fulfill() + } + + DispatchQueue.main.async { + dispatcher.signal(backgroundColor: dark, opacity: 1.0) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + dispatcher.signal(backgroundColor: light, opacity: 1.0) + } + } + + wait(for: [expectation], timeout: 1.0) + XCTAssertEqual(postedHexes, ["#272822", "#FDF6E3"]) + } + + private func postedOpacity(from value: Any?) -> Double { + if let value = value as? Double { + return value + } + if let value = value as? NSNumber { + return value.doubleValue + } + XCTFail("Expected background opacity payload") + return -1 + } +} + final class RecentlyClosedBrowserStackTests: XCTestCase { func testPopReturnsEntriesInLIFOOrder() { var stack = RecentlyClosedBrowserStack(capacity: 20) From cd570dbab22ebd432936202c42c579fcb4c6170c Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 01:03:16 -0800 Subject: [PATCH 101/214] Unify runtime theme reload path and prioritize surface background updates --- Sources/AppDelegate.swift | 5 + Sources/GhosttyTerminalView.swift | 285 ++++++++++++++++++++++++----- Sources/WorkspaceContentView.swift | 4 +- Sources/cmuxApp.swift | 2 +- cmuxTests/GhosttyConfigTests.swift | 73 ++++++-- 5 files changed, 307 insertions(+), 62 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index f3ab91f3..7bafbc8e 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1857,6 +1857,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent if normalizedFlags == [.command], chars == "q" { return handleQuitShortcutWarning() } + if normalizedFlags == [.command, .shift], + (chars == "," || chars == "<" || event.keyCode == 43) { + GhosttyApp.shared.reloadConfiguration(source: "shortcut.cmd_shift_comma") + return true + } // When the terminal has active IME composition (e.g. Korean, Japanese, Chinese // input), don't intercept key events — let them flow through to the input method. diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index af2a94a4..2b80a7f3 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -124,15 +124,33 @@ enum TerminalOpenURLTarget: Equatable { } } +enum GhosttyDefaultBackgroundUpdateScope: Int { + case unscoped = 0 + case app = 1 + case surface = 2 + + var logLabel: String { + switch self { + case .unscoped: return "unscoped" + case .app: return "app" + case .surface: return "surface" + } + } +} + /// Coalesces Ghostty background notifications so consumers only observe /// the latest runtime background for a burst of updates. final class GhosttyDefaultBackgroundNotificationDispatcher { private let coalescer: NotificationBurstCoalescer private let postNotification: ([AnyHashable: Any]) -> Void private var pendingUserInfo: [AnyHashable: Any]? + private var pendingEventId: UInt64 = 0 + private var pendingSource: String = "unspecified" + private let logEvent: ((String) -> Void)? init( delay: TimeInterval = 1.0 / 30.0, + logEvent: ((String) -> Void)? = nil, postNotification: @escaping ([AnyHashable: Any]) -> Void = { userInfo in NotificationCenter.default.post( name: .ghosttyDefaultBackgroundDidChange, @@ -142,18 +160,29 @@ final class GhosttyDefaultBackgroundNotificationDispatcher { } ) { coalescer = NotificationBurstCoalescer(delay: delay) + self.logEvent = logEvent self.postNotification = postNotification } - func signal(backgroundColor: NSColor, opacity: Double) { + func signal(backgroundColor: NSColor, opacity: Double, eventId: UInt64, source: String) { let signalOnMain = { [self] in + pendingEventId = eventId + pendingSource = source pendingUserInfo = [ GhosttyNotificationKey.backgroundColor: backgroundColor, - GhosttyNotificationKey.backgroundOpacity: opacity + GhosttyNotificationKey.backgroundOpacity: opacity, + GhosttyNotificationKey.backgroundEventId: NSNumber(value: eventId), + GhosttyNotificationKey.backgroundSource: source ] + logEvent?( + "bg notify queued id=\(eventId) source=\(source) color=\(backgroundColor.hexString()) opacity=\(String(format: "%.3f", opacity))" + ) coalescer.signal { [self] in guard let userInfo = pendingUserInfo else { return } + let eventId = pendingEventId + let source = pendingSource pendingUserInfo = nil + logEvent?("bg notify flushed id=\(eventId) source=\(source)") postNotification(userInfo) } } @@ -203,6 +232,11 @@ func resolveTerminalOpenURLTarget(_ rawValue: String) -> TerminalOpenURLTarget? class GhosttyApp { static let shared = GhosttyApp() + private static let backgroundLogTimestampFormatter: ISO8601DateFormatter = { + let formatter = ISO8601DateFormatter() + formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] + return formatter + }() private(set) var app: ghostty_app_t? private(set) var config: ghostty_config_t? @@ -245,7 +279,14 @@ class GhosttyApp { }() private let backgroundLogURL = GhosttyApp.resolveBackgroundLogURL() private var appObservers: [NSObjectProtocol] = [] - private let defaultBackgroundNotificationDispatcher = GhosttyDefaultBackgroundNotificationDispatcher() + private var backgroundEventCounter: UInt64 = 0 + private var defaultBackgroundUpdateScope: GhosttyDefaultBackgroundUpdateScope = .unscoped + private var defaultBackgroundScopeSource: String = "initialize" + private lazy var defaultBackgroundNotificationDispatcher: GhosttyDefaultBackgroundNotificationDispatcher = + GhosttyDefaultBackgroundNotificationDispatcher(logEvent: { [weak self] message in + guard let self, self.backgroundLogEnabled else { return } + self.logBackground(message) + }) // Scroll lag tracking private(set) var isScrolling = false @@ -361,7 +402,7 @@ class GhosttyApp { // Load default config (includes user config). If this fails hard (e.g. due to // invalid user config), ghostty_app_new may return nil; we fall back below. loadDefaultConfigFilesWithLegacyFallback(primaryConfig) - updateDefaultBackground(from: primaryConfig) + updateDefaultBackground(from: primaryConfig, source: "initialize.primaryConfig") // Create runtime config with callbacks var runtimeConfig = ghostty_runtime_config_s() @@ -483,7 +524,7 @@ class GhosttyApp { } ghostty_config_finalize(fallbackConfig) - updateDefaultBackground(from: fallbackConfig) + updateDefaultBackground(from: fallbackConfig, source: "initialize.fallbackConfig") guard let created = ghostty_app_new(&runtimeConfig, fallbackConfig) else { #if DEBUG @@ -543,6 +584,13 @@ class GhosttyApp { return true } + static func shouldApplyDefaultBackgroundUpdate( + currentScope: GhosttyDefaultBackgroundUpdateScope, + incomingScope: GhosttyDefaultBackgroundUpdateScope + ) -> Bool { + incomingScope.rawValue >= currentScope.rawValue + } + private func loadLegacyGhosttyConfigIfNeeded(_ config: ghostty_config_t) { #if os(macOS) // Ghostty 1.3+ prefers `config.ghostty`, but some users still have their real @@ -590,18 +638,31 @@ class GhosttyApp { } } - func reloadConfiguration(soft: Bool = false) { - guard let app else { return } + func reloadConfiguration(soft: Bool = false, source: String = "unspecified") { + guard let app else { + logThemeAction("reload skipped source=\(source) soft=\(soft) reason=no_app") + return + } + logThemeAction("reload begin source=\(source) soft=\(soft)") + resetDefaultBackgroundUpdateScope(source: "reloadConfiguration(source=\(source))") if soft, let config { ghostty_app_update_config(app, config) NotificationCenter.default.post(name: .ghosttyConfigDidReload, object: nil) + logThemeAction("reload end source=\(source) soft=\(soft) mode=soft") return } - guard let newConfig = ghostty_config_new() else { return } + guard let newConfig = ghostty_config_new() else { + logThemeAction("reload skipped source=\(source) soft=\(soft) reason=config_alloc_failed") + return + } loadDefaultConfigFilesWithLegacyFallback(newConfig) ghostty_app_update_config(app, newConfig) - updateDefaultBackground(from: newConfig) + updateDefaultBackground( + from: newConfig, + source: "reloadConfiguration(source=\(source))", + scope: .unscoped + ) DispatchQueue.main.async { self.applyBackgroundToKeyWindow() } @@ -610,18 +671,7 @@ class GhosttyApp { } config = newConfig NotificationCenter.default.post(name: .ghosttyConfigDidReload, object: nil) - } - - func reloadConfiguration(for surface: ghostty_surface_t, soft: Bool = false) { - if soft, let config { - ghostty_surface_update_config(surface, config) - return - } - - guard let newConfig = ghostty_config_new() else { return } - loadDefaultConfigFilesWithLegacyFallback(newConfig) - ghostty_surface_update_config(surface, newConfig) - ghostty_config_free(newConfig) + logThemeAction("reload end source=\(source) soft=\(soft) mode=full") } func openConfigurationInTextEdit() { @@ -643,15 +693,30 @@ class GhosttyApp { return String(decoding: buffer, as: UTF8.self) } - private func updateDefaultBackground(from config: ghostty_config_t?) { - guard let config else { return } - let previousHex = defaultBackgroundColor.hexString() - let previousOpacity = defaultBackgroundOpacity + private func resetDefaultBackgroundUpdateScope(source: String) { + let previousScope = defaultBackgroundUpdateScope + let previousScopeSource = defaultBackgroundScopeSource + defaultBackgroundUpdateScope = .unscoped + defaultBackgroundScopeSource = "reset:\(source)" + if backgroundLogEnabled { + logBackground( + "default background scope reset source=\(source) previousScope=\(previousScope.logLabel) previousSource=\(previousScopeSource)" + ) + } + } + private func updateDefaultBackground( + from config: ghostty_config_t?, + source: String, + scope: GhosttyDefaultBackgroundUpdateScope = .unscoped + ) { + guard let config else { return } + + var resolvedColor = defaultBackgroundColor var color = ghostty_config_color_s() let bgKey = "background" if ghostty_config_get(config, &color, bgKey, UInt(bgKey.lengthOfBytes(using: .utf8))) { - defaultBackgroundColor = NSColor( + resolvedColor = NSColor( red: CGFloat(color.r) / 255, green: CGFloat(color.g) / 255, blue: CGFloat(color.b) / 255, @@ -659,24 +724,99 @@ class GhosttyApp { ) } - var opacity: Double = 1.0 + var opacity = defaultBackgroundOpacity let opacityKey = "background-opacity" _ = ghostty_config_get(config, &opacity, opacityKey, UInt(opacityKey.lengthOfBytes(using: .utf8))) + applyDefaultBackground( + color: resolvedColor, + opacity: opacity, + source: source, + scope: scope + ) + } + + private func applyDefaultBackground( + color: NSColor, + opacity: Double, + source: String, + scope: GhosttyDefaultBackgroundUpdateScope + ) { + let previousScope = defaultBackgroundUpdateScope + let previousScopeSource = defaultBackgroundScopeSource + guard Self.shouldApplyDefaultBackgroundUpdate(currentScope: previousScope, incomingScope: scope) else { + if backgroundLogEnabled { + logBackground( + "default background skipped source=\(source) incomingScope=\(scope.logLabel) currentScope=\(previousScope.logLabel) currentSource=\(previousScopeSource) color=\(color.hexString()) opacity=\(String(format: "%.3f", opacity))" + ) + } + return + } + + defaultBackgroundUpdateScope = scope + defaultBackgroundScopeSource = source + + let previousHex = defaultBackgroundColor.hexString() + let previousOpacity = defaultBackgroundOpacity + defaultBackgroundColor = color defaultBackgroundOpacity = opacity let hasChanged = previousHex != defaultBackgroundColor.hexString() || abs(previousOpacity - defaultBackgroundOpacity) > 0.0001 if hasChanged { - notifyDefaultBackgroundDidChange() + notifyDefaultBackgroundDidChange(source: source) } if backgroundLogEnabled { - logBackground("default background updated color=\(defaultBackgroundColor) opacity=\(String(format: "%.3f", defaultBackgroundOpacity))") + logBackground( + "default background updated source=\(source) scope=\(scope.logLabel) previousScope=\(previousScope.logLabel) previousScopeSource=\(previousScopeSource) previousColor=\(previousHex) previousOpacity=\(String(format: "%.3f", previousOpacity)) color=\(defaultBackgroundColor) opacity=\(String(format: "%.3f", defaultBackgroundOpacity)) changed=\(hasChanged)" + ) } } - private func notifyDefaultBackgroundDidChange() { - defaultBackgroundNotificationDispatcher.signal( - backgroundColor: defaultBackgroundColor, - opacity: defaultBackgroundOpacity + private func nextBackgroundEventId() -> UInt64 { + precondition(Thread.isMainThread, "Background event IDs must be generated on main thread") + backgroundEventCounter &+= 1 + return backgroundEventCounter + } + + private func notifyDefaultBackgroundDidChange(source: String) { + let signal = { [self] in + let eventId = nextBackgroundEventId() + defaultBackgroundNotificationDispatcher.signal( + backgroundColor: defaultBackgroundColor, + opacity: defaultBackgroundOpacity, + eventId: eventId, + source: source + ) + } + if Thread.isMainThread { + signal() + } else { + DispatchQueue.main.async(execute: signal) + } + } + + private func logThemeAction(_ message: String) { + guard backgroundLogEnabled else { return } + logBackground("theme action \(message)") + } + + private func actionLabel(for action: ghostty_action_s) -> String { + switch action.tag { + case GHOSTTY_ACTION_RELOAD_CONFIG: + return "reload_config" + case GHOSTTY_ACTION_CONFIG_CHANGE: + return "config_change" + case GHOSTTY_ACTION_COLOR_CHANGE: + return "color_change" + default: + return String(describing: action.tag) + } + } + + private func logAction(_ action: ghostty_action_s, target: ghostty_target_s, tabId: UUID?, surfaceId: UUID?) { + guard backgroundLogEnabled else { return } + let targetLabel = target.tag == GHOSTTY_TARGET_SURFACE ? "surface" : "app" + logBackground( + "action event target=\(targetLabel) action=\(actionLabel(for: action)) tab=\(tabId?.uuidString ?? "nil") surface=\(surfaceId?.uuidString ?? "nil")" ) } @@ -725,6 +865,12 @@ class GhosttyApp { private func handleAction(target: ghostty_target_s, action: ghostty_action_s) -> Bool { if target.tag != GHOSTTY_TARGET_SURFACE { + if action.tag == GHOSTTY_ACTION_RELOAD_CONFIG || + action.tag == GHOSTTY_ACTION_CONFIG_CHANGE || + action.tag == GHOSTTY_ACTION_COLOR_CHANGE { + logAction(action, target: target, tabId: nil, surfaceId: nil) + } + if action.tag == GHOSTTY_ACTION_DESKTOP_NOTIFICATION { let actionTitle = action.action.desktop_notification.title .flatMap { String(cString: $0) } ?? "" @@ -752,8 +898,9 @@ class GhosttyApp { if action.tag == GHOSTTY_ACTION_RELOAD_CONFIG { let soft = action.action.reload_config.soft + logThemeAction("reload request target=app soft=\(soft)") performOnMain { - GhosttyApp.shared.reloadConfiguration(soft: soft) + GhosttyApp.shared.reloadConfiguration(soft: soft, source: "action.reload_config.app") } return true } @@ -761,16 +908,18 @@ class GhosttyApp { if action.tag == GHOSTTY_ACTION_COLOR_CHANGE, action.action.color_change.kind == GHOSTTY_ACTION_COLOR_KIND_BACKGROUND { let change = action.action.color_change - defaultBackgroundColor = NSColor( + let resolvedColor = NSColor( red: CGFloat(change.r) / 255, green: CGFloat(change.g) / 255, blue: CGFloat(change.b) / 255, alpha: 1.0 ) - if backgroundLogEnabled { - logBackground("OSC background change (app target) color=\(defaultBackgroundColor)") - } - notifyDefaultBackgroundDidChange() + applyDefaultBackground( + color: resolvedColor, + opacity: defaultBackgroundOpacity, + source: "action.color_change.app", + scope: .app + ) DispatchQueue.main.async { GhosttyApp.shared.applyBackgroundToKeyWindow() } @@ -778,7 +927,11 @@ class GhosttyApp { } if action.tag == GHOSTTY_ACTION_CONFIG_CHANGE { - updateDefaultBackground(from: action.action.config_change.config) + updateDefaultBackground( + from: action.action.config_change.config, + source: "action.config_change.app", + scope: .app + ) DispatchQueue.main.async { GhosttyApp.shared.applyBackgroundToKeyWindow() } @@ -789,6 +942,16 @@ class GhosttyApp { } guard let userdata = ghostty_surface_userdata(target.target.surface) else { return false } let surfaceView = Unmanaged<GhosttyNSView>.fromOpaque(userdata).takeUnretainedValue() + if action.tag == GHOSTTY_ACTION_RELOAD_CONFIG || + action.tag == GHOSTTY_ACTION_CONFIG_CHANGE || + action.tag == GHOSTTY_ACTION_COLOR_CHANGE { + logAction( + action, + target: target, + tabId: surfaceView.tabId, + surfaceId: surfaceView.terminalSurface?.id + ) + } switch action.tag { case GHOSTTY_ACTION_NEW_SPLIT: @@ -998,19 +1161,26 @@ class GhosttyApp { } return true case GHOSTTY_ACTION_CONFIG_CHANGE: - updateDefaultBackground(from: action.action.config_change.config) + updateDefaultBackground( + from: action.action.config_change.config, + source: "action.config_change.surface tab=\(surfaceView.tabId?.uuidString ?? "nil") surface=\(surfaceView.terminalSurface?.id.uuidString ?? "nil")", + scope: .surface + ) DispatchQueue.main.async { surfaceView.applyWindowBackgroundIfActive() } return true case GHOSTTY_ACTION_RELOAD_CONFIG: let soft = action.action.reload_config.soft + logThemeAction( + "reload request target=surface tab=\(surfaceView.tabId?.uuidString ?? "nil") surface=\(surfaceView.terminalSurface?.id.uuidString ?? "nil") soft=\(soft)" + ) return performOnMain { - if let surface = surfaceView.terminalSurface?.surface { - GhosttyApp.shared.reloadConfiguration(for: surface, soft: soft) - } else { - GhosttyApp.shared.reloadConfiguration(soft: soft) - } + // Keep all runtime theme/default-background state in the same path. + GhosttyApp.shared.reloadConfiguration( + soft: soft, + source: "action.reload_config.surface tab=\(surfaceView.tabId?.uuidString ?? "nil") surface=\(surfaceView.terminalSurface?.id.uuidString ?? "nil")" + ) return true } case GHOSTTY_ACTION_KEY_SEQUENCE: @@ -1102,7 +1272,8 @@ class GhosttyApp { } func logBackground(_ message: String) { - let line = "cmux bg: \(message)\n" + let timestamp = Self.backgroundLogTimestampFormatter.string(from: Date()) + let line = "\(timestamp) cmux bg: \(message)\n" if let data = line.data(using: .utf8) { if FileManager.default.fileExists(atPath: backgroundLogURL.path) == false { FileManager.default.createFile(atPath: backgroundLogURL.path, contents: nil) @@ -1963,6 +2134,12 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { override func viewDidChangeEffectiveAppearance() { super.viewDidChangeEffectiveAppearance() + if GhosttyApp.shared.backgroundLogEnabled { + let bestMatch = effectiveAppearance.bestMatch(from: [.darkAqua, .aqua]) + GhosttyApp.shared.logBackground( + "surface appearance changed tab=\(tabId?.uuidString ?? "nil") surface=\(terminalSurface?.id.uuidString ?? "nil") bestMatch=\(bestMatch?.rawValue ?? "nil")" + ) + } applySurfaceColorScheme() } @@ -2105,10 +2282,22 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { ? GHOSTTY_COLOR_SCHEME_DARK : GHOSTTY_COLOR_SCHEME_LIGHT if !force, appliedColorScheme == scheme { + if GhosttyApp.shared.backgroundLogEnabled { + let schemeLabel = scheme == GHOSTTY_COLOR_SCHEME_DARK ? "dark" : "light" + GhosttyApp.shared.logBackground( + "surface color scheme tab=\(tabId?.uuidString ?? "nil") surface=\(terminalSurface?.id.uuidString ?? "nil") bestMatch=\(bestMatch?.rawValue ?? "nil") scheme=\(schemeLabel) force=\(force) applied=false" + ) + } return } ghostty_surface_set_color_scheme(surface, scheme) appliedColorScheme = scheme + if GhosttyApp.shared.backgroundLogEnabled { + let schemeLabel = scheme == GHOSTTY_COLOR_SCHEME_DARK ? "dark" : "light" + GhosttyApp.shared.logBackground( + "surface color scheme tab=\(tabId?.uuidString ?? "nil") surface=\(terminalSurface?.id.uuidString ?? "nil") bestMatch=\(bestMatch?.rawValue ?? "nil") scheme=\(schemeLabel) force=\(force) applied=true" + ) + } } @discardableResult @@ -3028,6 +3217,8 @@ enum GhosttyNotificationKey { static let title = "ghostty.title" static let backgroundColor = "ghostty.backgroundColor" static let backgroundOpacity = "ghostty.backgroundOpacity" + static let backgroundEventId = "ghostty.backgroundEventId" + static let backgroundSource = "ghostty.backgroundSource" } extension Notification.Name { diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index 1ab7655f..3c33f1ab 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -104,11 +104,13 @@ struct WorkspaceContentView: View { } .onReceive(NotificationCenter.default.publisher(for: .ghosttyDefaultBackgroundDidChange)) { notification in let payloadHex = (notification.userInfo?[GhosttyNotificationKey.backgroundColor] as? NSColor)?.hexString() ?? "nil" + let eventId = (notification.userInfo?[GhosttyNotificationKey.backgroundEventId] as? NSNumber)?.uint64Value + let source = (notification.userInfo?[GhosttyNotificationKey.backgroundSource] as? String) ?? "nil" // Payload ordering can lag across rapid config/theme updates. // Resolve from GhosttyApp.shared.defaultBackgroundColor to keep tabs aligned // with Ghostty's current runtime theme. refreshGhosttyAppearanceConfig( - reason: "ghosttyDefaultBackgroundDidChange:payload=\(payloadHex)" + reason: "ghosttyDefaultBackgroundDidChange:event=\(eventId.map(String.init) ?? "nil"):source=\(source):payload=\(payloadHex)" ) } } diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 7ed81980..091d274e 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -211,7 +211,7 @@ struct cmuxApp: App { GhosttyApp.shared.openConfigurationInTextEdit() } Button("Reload Configuration") { - GhosttyApp.shared.reloadConfiguration() + GhosttyApp.shared.reloadConfiguration(source: "menu.reload_configuration") } .keyboardShortcut(",", modifiers: [.command, .shift]) Divider() diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index 80a5d1f4..1971d481 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -162,6 +162,39 @@ final class GhosttyConfigTests: XCTestCase { ) } + func testDefaultBackgroundUpdateScopePrioritizesSurfaceOverAppAndUnscoped() { + XCTAssertTrue( + GhosttyApp.shouldApplyDefaultBackgroundUpdate( + currentScope: .unscoped, + incomingScope: .app + ) + ) + XCTAssertTrue( + GhosttyApp.shouldApplyDefaultBackgroundUpdate( + currentScope: .app, + incomingScope: .surface + ) + ) + XCTAssertTrue( + GhosttyApp.shouldApplyDefaultBackgroundUpdate( + currentScope: .surface, + incomingScope: .surface + ) + ) + XCTAssertFalse( + GhosttyApp.shouldApplyDefaultBackgroundUpdate( + currentScope: .surface, + incomingScope: .app + ) + ) + XCTAssertFalse( + GhosttyApp.shouldApplyDefaultBackgroundUpdate( + currentScope: .surface, + incomingScope: .unscoped + ) + ) + } + func testClaudeCodeIntegrationDefaultsToEnabledWhenUnset() { let suiteName = "cmux.tests.claude-hooks.\(UUID().uuidString)" guard let defaults = UserDefaults(suiteName: suiteName) else { @@ -352,14 +385,17 @@ final class GhosttyDefaultBackgroundNotificationDispatcherTests: XCTestCase { expectation.expectedFulfillmentCount = 1 var postedUserInfos: [[AnyHashable: Any]] = [] - let dispatcher = GhosttyDefaultBackgroundNotificationDispatcher(delay: 0.01) { userInfo in - postedUserInfos.append(userInfo) - expectation.fulfill() - } + let dispatcher = GhosttyDefaultBackgroundNotificationDispatcher( + delay: 0.01, + postNotification: { userInfo in + postedUserInfos.append(userInfo) + expectation.fulfill() + } + ) DispatchQueue.main.async { - dispatcher.signal(backgroundColor: dark, opacity: 0.95) - dispatcher.signal(backgroundColor: light, opacity: 0.75) + dispatcher.signal(backgroundColor: dark, opacity: 0.95, eventId: 1, source: "test.dark") + dispatcher.signal(backgroundColor: light, opacity: 0.75, eventId: 2, source: "test.light") } wait(for: [expectation], timeout: 1.0) @@ -373,6 +409,14 @@ final class GhosttyDefaultBackgroundNotificationDispatcherTests: XCTestCase { 0.75, accuracy: 0.0001 ) + XCTAssertEqual( + (postedUserInfos[0][GhosttyNotificationKey.backgroundEventId] as? NSNumber)?.uint64Value, + 2 + ) + XCTAssertEqual( + postedUserInfos[0][GhosttyNotificationKey.backgroundSource] as? String, + "test.light" + ) } func testSignalAcrossSeparateBurstsPostsMultipleNotifications() { @@ -386,16 +430,19 @@ final class GhosttyDefaultBackgroundNotificationDispatcherTests: XCTestCase { expectation.expectedFulfillmentCount = 2 var postedHexes: [String] = [] - let dispatcher = GhosttyDefaultBackgroundNotificationDispatcher(delay: 0.01) { userInfo in - let hex = (userInfo[GhosttyNotificationKey.backgroundColor] as? NSColor)?.hexString() ?? "nil" - postedHexes.append(hex) - expectation.fulfill() - } + let dispatcher = GhosttyDefaultBackgroundNotificationDispatcher( + delay: 0.01, + postNotification: { userInfo in + let hex = (userInfo[GhosttyNotificationKey.backgroundColor] as? NSColor)?.hexString() ?? "nil" + postedHexes.append(hex) + expectation.fulfill() + } + ) DispatchQueue.main.async { - dispatcher.signal(backgroundColor: dark, opacity: 1.0) + dispatcher.signal(backgroundColor: dark, opacity: 1.0, eventId: 1, source: "test.dark") DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - dispatcher.signal(backgroundColor: light, opacity: 1.0) + dispatcher.signal(backgroundColor: light, opacity: 1.0, eventId: 2, source: "test.light") } } From 1b954f1d680ff3e007a4bad460af7b73f3c39522 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 01:11:27 -0800 Subject: [PATCH 102/214] Sync theme updates in same frame on theme switch --- Sources/ContentView.swift | 21 +++++++++++++++------ Sources/GhosttyTerminalView.swift | 4 +++- Sources/WorkspaceContentView.swift | 4 +++- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 82de33b1..21f40272 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -843,7 +843,6 @@ struct ContentView: View { @State private var titlebarThemeGeneration: UInt64 = 0 @State private var sidebarDraggedTabId: UUID? @State private var titlebarTextUpdateCoalescer = NotificationBurstCoalescer(delay: 1.0 / 30.0) - @State private var titlebarThemeUpdateCoalescer = NotificationBurstCoalescer(delay: 1.0 / 30.0) @State private var sidebarResizerCursorReleaseWorkItem: DispatchWorkItem? @State private var sidebarResizerPointerMonitor: Any? @State private var isResizerBandActive = false @@ -1261,10 +1260,15 @@ struct ContentView: View { } } - private func scheduleTitlebarThemeRefresh() { - titlebarThemeUpdateCoalescer.signal { + private func scheduleTitlebarThemeRefresh(reason: String) { + withTransaction(Transaction(animation: nil)) { titlebarThemeGeneration &+= 1 } + if GhosttyApp.shared.backgroundLogEnabled { + GhosttyApp.shared.logBackground( + "titlebar theme refresh reason=\(reason) generation=\(titlebarThemeGeneration)" + ) + } } private var focusedDirectory: String? { @@ -1406,11 +1410,16 @@ struct ContentView: View { }) view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: Notification.Name("ghosttyConfigDidReload"))) { _ in - scheduleTitlebarThemeRefresh() + scheduleTitlebarThemeRefresh(reason: "ghosttyConfigDidReload") }) - view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: Notification.Name("ghosttyDefaultBackgroundDidChange"))) { _ in - scheduleTitlebarThemeRefresh() + view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: Notification.Name("ghosttyDefaultBackgroundDidChange"))) { notification in + let payloadHex = (notification.userInfo?[GhosttyNotificationKey.backgroundColor] as? NSColor)?.hexString() ?? "nil" + let eventId = (notification.userInfo?[GhosttyNotificationKey.backgroundEventId] as? NSNumber)?.uint64Value + let source = (notification.userInfo?[GhosttyNotificationKey.backgroundSource] as? String) ?? "nil" + scheduleTitlebarThemeRefresh( + reason: "ghosttyDefaultBackgroundDidChange:event=\(eventId.map(String.init) ?? "nil"):source=\(source):payload=\(payloadHex)" + ) }) view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: .ghosttyDidBecomeFirstResponderSurface)) { notification in diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 2b80a7f3..f0dd19e6 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -283,7 +283,9 @@ class GhosttyApp { private var defaultBackgroundUpdateScope: GhosttyDefaultBackgroundUpdateScope = .unscoped private var defaultBackgroundScopeSource: String = "initialize" private lazy var defaultBackgroundNotificationDispatcher: GhosttyDefaultBackgroundNotificationDispatcher = - GhosttyDefaultBackgroundNotificationDispatcher(logEvent: { [weak self] message in + // Theme chrome should track terminal theme changes in the same frame. + // Keep coalescing semantics, but flush in the next main turn instead of waiting ~1 frame. + GhosttyDefaultBackgroundNotificationDispatcher(delay: 0, logEvent: { [weak self] message in guard let self, self.backgroundLogEnabled else { return } self.logBackground(message) }) diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index 3c33f1ab..24743fe4 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -183,7 +183,9 @@ struct WorkspaceContentView: View { logTheme( "theme refresh workspace=\(workspace.id.uuidString) reason=\(reason) previousBg=\(previousBackgroundHex) nextBg=\(next.backgroundColor.hexString()) overrideBg=\(backgroundOverride?.hexString() ?? "nil")" ) - config = next + withTransaction(Transaction(animation: nil)) { + config = next + } workspace.applyGhosttyChrome(from: next) } From a3f3e20d72c176f4cb54d1536d227794e2acd8a6 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 02:31:22 -0800 Subject: [PATCH 103/214] Unify Cmd+Shift+H flash path across panel types --- Sources/GhosttyTerminalView.swift | 20 ++++++----- Sources/Panels/BrowserPanelView.swift | 31 +++++++++------- Sources/Panels/Panel.swift | 36 +++++++++++++++++++ Sources/Workspace.swift | 9 +---- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 34 ++++++++++++++++++ 5 files changed, 101 insertions(+), 29 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 2b80a7f3..f4a83671 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -3884,15 +3884,17 @@ final class GhosttySurfaceScrollView: NSView { self.flashLayer.removeAllAnimations() self.flashLayer.opacity = 0 let animation = CAKeyframeAnimation(keyPath: "opacity") - animation.values = [0, 1, 0, 1, 0] - animation.keyTimes = [0, 0.25, 0.5, 0.75, 1] - animation.duration = 0.9 - animation.timingFunctions = [ - CAMediaTimingFunction(name: .easeOut), - CAMediaTimingFunction(name: .easeIn), - CAMediaTimingFunction(name: .easeOut), - CAMediaTimingFunction(name: .easeIn) - ] + animation.values = FocusFlashPattern.values.map { NSNumber(value: $0) } + animation.keyTimes = FocusFlashPattern.keyTimes.map { NSNumber(value: $0) } + animation.duration = FocusFlashPattern.duration + animation.timingFunctions = FocusFlashPattern.curves.map { curve in + switch curve { + case .easeIn: + return CAMediaTimingFunction(name: .easeIn) + case .easeOut: + return CAMediaTimingFunction(name: .easeOut) + } + } self.flashLayer.add(animation, forKey: "cmux.flash") } } diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 027edb1b..d4f9b2ba 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -190,7 +190,7 @@ struct BrowserPanelView: View { @State private var omnibarHasMarkedText: Bool = false @State private var suppressNextFocusLostRevert: Bool = false @State private var focusFlashOpacity: Double = 0.0 - @State private var focusFlashFadeWorkItem: DispatchWorkItem? + @State private var focusFlashAnimationGeneration: Int = 0 @State private var omnibarPillFrame: CGRect = .zero @State private var lastHandledAddressBarFocusRequestId: UUID? @State private var isBrowserThemeMenuPresented = false @@ -692,20 +692,27 @@ struct BrowserPanelView: View { } private func triggerFocusFlashAnimation() { - focusFlashFadeWorkItem?.cancel() - focusFlashFadeWorkItem = nil + focusFlashAnimationGeneration &+= 1 + let generation = focusFlashAnimationGeneration + focusFlashOpacity = FocusFlashPattern.values.first ?? 0 - withAnimation(.easeOut(duration: 0.08)) { - focusFlashOpacity = 1.0 - } - - let item = DispatchWorkItem { - withAnimation(.easeOut(duration: 0.35)) { - focusFlashOpacity = 0.0 + for segment in FocusFlashPattern.segments { + DispatchQueue.main.asyncAfter(deadline: .now() + segment.delay) { + guard focusFlashAnimationGeneration == generation else { return } + withAnimation(focusFlashAnimation(for: segment.curve, duration: segment.duration)) { + focusFlashOpacity = segment.targetOpacity + } } } - focusFlashFadeWorkItem = item - DispatchQueue.main.asyncAfter(deadline: .now() + 0.18, execute: item) + } + + private func focusFlashAnimation(for curve: FocusFlashCurve, duration: TimeInterval) -> Animation { + switch curve { + case .easeIn: + return .easeIn(duration: duration) + case .easeOut: + return .easeOut(duration: duration) + } } private func syncURLFromPanel() { diff --git a/Sources/Panels/Panel.swift b/Sources/Panels/Panel.swift index 427d53c8..4a9f62ff 100644 --- a/Sources/Panels/Panel.swift +++ b/Sources/Panels/Panel.swift @@ -7,6 +7,39 @@ public enum PanelType: String, Codable, Sendable { case browser } +enum FocusFlashCurve: Equatable { + case easeIn + case easeOut +} + +struct FocusFlashSegment: Equatable { + let delay: TimeInterval + let duration: TimeInterval + let targetOpacity: Double + let curve: FocusFlashCurve +} + +enum FocusFlashPattern { + static let values: [Double] = [0, 1, 0, 1, 0] + static let keyTimes: [Double] = [0, 0.25, 0.5, 0.75, 1] + static let duration: TimeInterval = 0.9 + static let curves: [FocusFlashCurve] = [.easeOut, .easeIn, .easeOut, .easeIn] + + static var segments: [FocusFlashSegment] { + let stepCount = min(curves.count, values.count - 1, keyTimes.count - 1) + return (0..<stepCount).map { index in + let startTime = keyTimes[index] + let endTime = keyTimes[index + 1] + return FocusFlashSegment( + delay: startTime * duration, + duration: (endTime - startTime) * duration, + targetOpacity: values[index + 1], + curve: curves[index] + ) + } + } +} + /// Protocol for all panel types (terminal, browser, etc.) @MainActor public protocol Panel: AnyObject, Identifiable, ObservableObject where ID == UUID { @@ -33,6 +66,9 @@ public protocol Panel: AnyObject, Identifiable, ObservableObject where ID == UUI /// Unfocus the panel func unfocus() + + /// Trigger a focus flash animation for this panel. + func triggerFlash() } /// Extension providing default implementations diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 99d17dcf..cb343d56 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -1773,14 +1773,7 @@ final class Workspace: Identifiable, ObservableObject { // MARK: - Flash/Notification Support func triggerFocusFlash(panelId: UUID) { - if let terminalPanel = terminalPanel(for: panelId) { - terminalPanel.triggerFlash() - return - } - if let browserPanel = browserPanel(for: panelId) { - browserPanel.triggerFlash() - return - } + panels[panelId]?.triggerFlash() } func triggerNotificationFocusFlash( diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 89b59080..689b736a 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -207,6 +207,40 @@ final class CmuxWebViewKeyEquivalentTests: XCTestCase { } } +final class FocusFlashPatternTests: XCTestCase { + func testFocusFlashPatternMatchesTerminalDoublePulseShape() { + XCTAssertEqual(FocusFlashPattern.values, [0, 1, 0, 1, 0]) + XCTAssertEqual(FocusFlashPattern.keyTimes, [0, 0.25, 0.5, 0.75, 1]) + XCTAssertEqual(FocusFlashPattern.duration, 0.9, accuracy: 0.0001) + XCTAssertEqual(FocusFlashPattern.curves, [.easeOut, .easeIn, .easeOut, .easeIn]) + } + + func testFocusFlashPatternSegmentsCoverFullDoublePulseTimeline() { + let segments = FocusFlashPattern.segments + XCTAssertEqual(segments.count, 4) + + XCTAssertEqual(segments[0].delay, 0.0, accuracy: 0.0001) + XCTAssertEqual(segments[0].duration, 0.225, accuracy: 0.0001) + XCTAssertEqual(segments[0].targetOpacity, 1, accuracy: 0.0001) + XCTAssertEqual(segments[0].curve, .easeOut) + + XCTAssertEqual(segments[1].delay, 0.225, accuracy: 0.0001) + XCTAssertEqual(segments[1].duration, 0.225, accuracy: 0.0001) + XCTAssertEqual(segments[1].targetOpacity, 0, accuracy: 0.0001) + XCTAssertEqual(segments[1].curve, .easeIn) + + XCTAssertEqual(segments[2].delay, 0.45, accuracy: 0.0001) + XCTAssertEqual(segments[2].duration, 0.225, accuracy: 0.0001) + XCTAssertEqual(segments[2].targetOpacity, 1, accuracy: 0.0001) + XCTAssertEqual(segments[2].curve, .easeOut) + + XCTAssertEqual(segments[3].delay, 0.675, accuracy: 0.0001) + XCTAssertEqual(segments[3].duration, 0.225, accuracy: 0.0001) + XCTAssertEqual(segments[3].targetOpacity, 0, accuracy: 0.0001) + XCTAssertEqual(segments[3].curve, .easeIn) + } +} + @MainActor final class CmuxWebViewContextMenuTests: XCTestCase { private func makeRightMouseDownEvent() -> NSEvent { From e4379a136c7287984029d058d55d40cecd4a1eec Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 02:37:48 -0800 Subject: [PATCH 104/214] Match terminal flash ring padding to browser --- Sources/GhosttyTerminalView.swift | 23 +++++++++++++++---- Sources/Panels/BrowserPanelView.swift | 4 ++-- Sources/Panels/Panel.swift | 2 ++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 2 ++ 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index f4a83671..71258f18 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -4429,16 +4429,29 @@ final class GhosttySurfaceScrollView: NSView { } private func updateNotificationRingPath() { - updateOverlayRingPath(layer: notificationRingLayer, bounds: notificationRingOverlayView.bounds) + updateOverlayRingPath( + layer: notificationRingLayer, + bounds: notificationRingOverlayView.bounds, + inset: 2, + radius: 6 + ) } private func updateFlashPath() { - updateOverlayRingPath(layer: flashLayer, bounds: flashOverlayView.bounds) + updateOverlayRingPath( + layer: flashLayer, + bounds: flashOverlayView.bounds, + inset: CGFloat(FocusFlashPattern.ringInset), + radius: CGFloat(FocusFlashPattern.ringCornerRadius) + ) } - private func updateOverlayRingPath(layer: CAShapeLayer, bounds: CGRect) { - let inset: CGFloat = 2 - let radius: CGFloat = 6 + private func updateOverlayRingPath( + layer: CAShapeLayer, + bounds: CGRect, + inset: CGFloat, + radius: CGFloat + ) { layer.frame = bounds guard bounds.width > inset * 2, bounds.height > inset * 2 else { layer.path = nil diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index d4f9b2ba..f0c65a81 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -255,10 +255,10 @@ struct BrowserPanelView: View { webView } .overlay { - RoundedRectangle(cornerRadius: 10) + RoundedRectangle(cornerRadius: FocusFlashPattern.ringCornerRadius) .stroke(Color.accentColor.opacity(focusFlashOpacity), lineWidth: 3) .shadow(color: Color.accentColor.opacity(focusFlashOpacity * 0.35), radius: 10) - .padding(6) + .padding(FocusFlashPattern.ringInset) .allowsHitTesting(false) } .overlay(alignment: .topLeading) { diff --git a/Sources/Panels/Panel.swift b/Sources/Panels/Panel.swift index 4a9f62ff..a0a719c4 100644 --- a/Sources/Panels/Panel.swift +++ b/Sources/Panels/Panel.swift @@ -24,6 +24,8 @@ enum FocusFlashPattern { static let keyTimes: [Double] = [0, 0.25, 0.5, 0.75, 1] static let duration: TimeInterval = 0.9 static let curves: [FocusFlashCurve] = [.easeOut, .easeIn, .easeOut, .easeIn] + static let ringInset: Double = 6 + static let ringCornerRadius: Double = 10 static var segments: [FocusFlashSegment] { let stepCount = min(curves.count, values.count - 1, keyTimes.count - 1) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 689b736a..45e2a54e 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -213,6 +213,8 @@ final class FocusFlashPatternTests: XCTestCase { XCTAssertEqual(FocusFlashPattern.keyTimes, [0, 0.25, 0.5, 0.75, 1]) XCTAssertEqual(FocusFlashPattern.duration, 0.9, accuracy: 0.0001) XCTAssertEqual(FocusFlashPattern.curves, [.easeOut, .easeIn, .easeOut, .easeIn]) + XCTAssertEqual(FocusFlashPattern.ringInset, 6, accuracy: 0.0001) + XCTAssertEqual(FocusFlashPattern.ringCornerRadius, 10, accuracy: 0.0001) } func testFocusFlashPatternSegmentsCoverFullDoublePulseTimeline() { From eb1f0bdd43c93f6061fb81c80306290eec13788b Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 02:44:28 -0800 Subject: [PATCH 105/214] Unify theme refresh path across workspace and titlebar --- Sources/ContentView.swift | 65 ++++++++++++++++++++++-------- Sources/GhosttyTerminalView.swift | 41 +++++++++++++++++-- Sources/Workspace.swift | 13 ++++-- Sources/WorkspaceContentView.swift | 62 ++++++++++++++++++++++++++-- 4 files changed, 153 insertions(+), 28 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 21f40272..7a8cb326 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -1127,7 +1127,16 @@ struct ContentView: View { workspace: tab, isWorkspaceVisible: isVisible, isWorkspaceInputActive: isInputActive, - workspacePortalPriority: portalPriority + workspacePortalPriority: portalPriority, + onThemeRefreshRequest: { reason, eventId, source, payloadHex in + scheduleTitlebarThemeRefreshFromWorkspace( + workspaceId: tab.id, + reason: reason, + backgroundEventId: eventId, + backgroundSource: source, + notificationPayloadHex: payloadHex + ) + } ) .opacity(isVisible ? 1 : 0) .allowsHitTesting(isSelectedWorkspace) @@ -1260,17 +1269,47 @@ struct ContentView: View { } } - private func scheduleTitlebarThemeRefresh(reason: String) { - withTransaction(Transaction(animation: nil)) { - titlebarThemeGeneration &+= 1 - } + private func scheduleTitlebarThemeRefresh( + reason: String, + backgroundEventId: UInt64? = nil, + backgroundSource: String? = nil, + notificationPayloadHex: String? = nil + ) { + let previousGeneration = titlebarThemeGeneration + titlebarThemeGeneration &+= 1 if GhosttyApp.shared.backgroundLogEnabled { + let eventLabel = backgroundEventId.map(String.init) ?? "nil" + let sourceLabel = backgroundSource ?? "nil" + let payloadLabel = notificationPayloadHex ?? "nil" GhosttyApp.shared.logBackground( - "titlebar theme refresh reason=\(reason) generation=\(titlebarThemeGeneration)" + "titlebar theme refresh scheduled reason=\(reason) event=\(eventLabel) source=\(sourceLabel) payload=\(payloadLabel) previousGeneration=\(previousGeneration) generation=\(titlebarThemeGeneration) appBg=\(GhosttyApp.shared.defaultBackgroundColor.hexString()) appOpacity=\(String(format: "%.3f", GhosttyApp.shared.defaultBackgroundOpacity))" ) } } + private func scheduleTitlebarThemeRefreshFromWorkspace( + workspaceId: UUID, + reason: String, + backgroundEventId: UInt64?, + backgroundSource: String?, + notificationPayloadHex: String? + ) { + guard tabManager.selectedTabId == workspaceId else { + guard GhosttyApp.shared.backgroundLogEnabled else { return } + GhosttyApp.shared.logBackground( + "titlebar theme refresh skipped workspace=\(workspaceId.uuidString) selected=\(tabManager.selectedTabId?.uuidString ?? "nil") reason=\(reason)" + ) + return + } + + scheduleTitlebarThemeRefresh( + reason: reason, + backgroundEventId: backgroundEventId, + backgroundSource: backgroundSource, + notificationPayloadHex: notificationPayloadHex + ) + } + private var focusedDirectory: String? { guard let selectedId = tabManager.selectedTabId, let tab = tabManager.tabs.first(where: { $0.id == selectedId }) else { @@ -1409,16 +1448,10 @@ struct ContentView: View { scheduleTitlebarTextRefresh() }) - view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: Notification.Name("ghosttyConfigDidReload"))) { _ in - scheduleTitlebarThemeRefresh(reason: "ghosttyConfigDidReload") - }) - - view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: Notification.Name("ghosttyDefaultBackgroundDidChange"))) { notification in - let payloadHex = (notification.userInfo?[GhosttyNotificationKey.backgroundColor] as? NSColor)?.hexString() ?? "nil" - let eventId = (notification.userInfo?[GhosttyNotificationKey.backgroundEventId] as? NSNumber)?.uint64Value - let source = (notification.userInfo?[GhosttyNotificationKey.backgroundSource] as? String) ?? "nil" - scheduleTitlebarThemeRefresh( - reason: "ghosttyDefaultBackgroundDidChange:event=\(eventId.map(String.init) ?? "nil"):source=\(source):payload=\(payloadHex)" + view = AnyView(view.onChange(of: titlebarThemeGeneration) { oldValue, newValue in + guard GhosttyApp.shared.backgroundLogEnabled else { return } + GhosttyApp.shared.logBackground( + "titlebar theme refresh applied oldGeneration=\(oldValue) generation=\(newValue) appBg=\(GhosttyApp.shared.defaultBackgroundColor.hexString()) appOpacity=\(String(format: "%.3f", GhosttyApp.shared.defaultBackgroundOpacity))" ) }) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index f0dd19e6..8636e1ae 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -183,7 +183,9 @@ final class GhosttyDefaultBackgroundNotificationDispatcher { let source = pendingSource pendingUserInfo = nil logEvent?("bg notify flushed id=\(eventId) source=\(source)") + logEvent?("bg notify posting id=\(eventId) source=\(source)") postNotification(userInfo) + logEvent?("bg notify posted id=\(eventId) source=\(source)") } } @@ -278,6 +280,9 @@ class GhosttyApp { return UserDefaults.standard.bool(forKey: "GhosttyTabsDebugBG") }() private let backgroundLogURL = GhosttyApp.resolveBackgroundLogURL() + private let backgroundLogStartUptime = ProcessInfo.processInfo.systemUptime + private let backgroundLogLock = NSLock() + private var backgroundLogSequence: UInt64 = 0 private var appObservers: [NSObjectProtocol] = [] private var backgroundEventCounter: UInt64 = 0 private var defaultBackgroundUpdateScope: GhosttyDefaultBackgroundUpdateScope = .unscoped @@ -1168,8 +1173,10 @@ class GhosttyApp { source: "action.config_change.surface tab=\(surfaceView.tabId?.uuidString ?? "nil") surface=\(surfaceView.terminalSurface?.id.uuidString ?? "nil")", scope: .surface ) - DispatchQueue.main.async { - surfaceView.applyWindowBackgroundIfActive() + if backgroundLogEnabled { + logBackground( + "surface config change deferred terminal bg apply tab=\(surfaceView.tabId?.uuidString ?? "nil") surface=\(surfaceView.terminalSurface?.id.uuidString ?? "nil")" + ) } return true case GHOSTTY_ACTION_RELOAD_CONFIG: @@ -1275,7 +1282,16 @@ class GhosttyApp { func logBackground(_ message: String) { let timestamp = Self.backgroundLogTimestampFormatter.string(from: Date()) - let line = "\(timestamp) cmux bg: \(message)\n" + let uptimeMs = (ProcessInfo.processInfo.systemUptime - backgroundLogStartUptime) * 1000 + let frame60 = Int((CACurrentMediaTime() * 60.0).rounded(.down)) + let frame120 = Int((CACurrentMediaTime() * 120.0).rounded(.down)) + let threadLabel = Thread.isMainThread ? "main" : "background" + backgroundLogLock.lock() + defer { backgroundLogLock.unlock() } + backgroundLogSequence &+= 1 + let sequence = backgroundLogSequence + let line = + "\(timestamp) seq=\(sequence) t+\(String(format: "%.3f", uptimeMs))ms thread=\(threadLabel) frame60=\(frame60) frame120=\(frame120) cmux bg: \(message)\n" if let data = line.data(using: .utf8) { if FileManager.default.fileExists(atPath: backgroundLogURL.path) == false { FileManager.default.createFile(atPath: backgroundLogURL.path, contents: nil) @@ -1967,6 +1983,8 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { var onTriggerFlash: (() -> Void)? var backgroundColor: NSColor? private var appliedColorScheme: ghostty_color_scheme_e? + private var lastLoggedSurfaceBackgroundSignature: String? + private var lastLoggedWindowBackgroundSignature: String? private var keySequence: [ghostty_input_trigger_s] = [] private var keyTables: [String] = [] #if DEBUG @@ -2027,6 +2045,15 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { CATransaction.commit() } terminalSurface?.hostedView.setBackgroundColor(color) + if GhosttyApp.shared.backgroundLogEnabled { + let signature = "\(color.hexString()):\(String(format: "%.3f", color.alphaComponent))" + if signature != lastLoggedSurfaceBackgroundSignature { + lastLoggedSurfaceBackgroundSignature = signature + GhosttyApp.shared.logBackground( + "surface background applied tab=\(tabId?.uuidString ?? "unknown") surface=\(terminalSurface?.id.uuidString ?? "unknown") color=\(color.hexString()) opacity=\(String(format: "%.3f", color.alphaComponent))" + ) + } + } } func applyWindowBackgroundIfActive() { @@ -2044,7 +2071,13 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { window.isOpaque = color.alphaComponent >= 1.0 } if GhosttyApp.shared.backgroundLogEnabled { - GhosttyApp.shared.logBackground("applied window background tab=\(tabId?.uuidString ?? "unknown") color=\(color) opacity=\(String(format: "%.3f", color.alphaComponent))") + let signature = "\(cmuxShouldUseTransparentBackgroundWindow() ? "transparent" : color.hexString()):\(String(format: "%.3f", color.alphaComponent))" + if signature != lastLoggedWindowBackgroundSignature { + lastLoggedWindowBackgroundSignature = signature + GhosttyApp.shared.logBackground( + "window background applied tab=\(tabId?.uuidString ?? "unknown") surface=\(terminalSurface?.id.uuidString ?? "unknown") transparent=\(cmuxShouldUseTransparentBackgroundWindow()) color=\(color.hexString()) opacity=\(String(format: "%.3f", color.alphaComponent))" + ) + } } } diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 99d17dcf..cded0114 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -347,11 +347,11 @@ final class Workspace: Identifiable, ObservableObject { ) } - func applyGhosttyChrome(from config: GhosttyConfig) { - applyGhosttyChrome(backgroundColor: config.backgroundColor) + func applyGhosttyChrome(from config: GhosttyConfig, reason: String = "unspecified") { + applyGhosttyChrome(backgroundColor: config.backgroundColor, reason: reason) } - func applyGhosttyChrome(backgroundColor: NSColor) { + func applyGhosttyChrome(backgroundColor: NSColor, reason: String = "unspecified") { let currentChromeColors = bonsplitController.configuration.appearance.chromeColors let nextChromeColors = Self.resolvedChromeColors(from: backgroundColor) let isNoOp = currentChromeColors.backgroundHex == nextChromeColors.backgroundHex && @@ -361,7 +361,7 @@ final class Workspace: Identifiable, ObservableObject { let currentBackgroundHex = currentChromeColors.backgroundHex ?? "nil" let nextBackgroundHex = nextChromeColors.backgroundHex ?? "nil" GhosttyApp.shared.logBackground( - "theme apply workspace=\(id.uuidString) currentBg=\(currentBackgroundHex) nextBg=\(nextBackgroundHex) currentBorder=\(currentChromeColors.borderHex ?? "nil") nextBorder=\(nextChromeColors.borderHex ?? "nil") noop=\(isNoOp)" + "theme apply workspace=\(id.uuidString) reason=\(reason) currentBg=\(currentBackgroundHex) nextBg=\(nextBackgroundHex) currentBorder=\(currentChromeColors.borderHex ?? "nil") nextBorder=\(nextChromeColors.borderHex ?? "nil") noop=\(isNoOp)" ) } @@ -369,6 +369,11 @@ final class Workspace: Identifiable, ObservableObject { return } bonsplitController.configuration.appearance.chromeColors = nextChromeColors + if GhosttyApp.shared.backgroundLogEnabled { + GhosttyApp.shared.logBackground( + "theme applied workspace=\(id.uuidString) reason=\(reason) resultingBg=\(bonsplitController.configuration.appearance.chromeColors.backgroundHex ?? "nil") resultingBorder=\(bonsplitController.configuration.appearance.chromeColors.borderHex ?? "nil")" + ) + } } init(title: String = "Terminal", workingDirectory: String? = nil, portOrdinal: Int = 0) { diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index 24743fe4..d209b4d2 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -9,6 +9,12 @@ struct WorkspaceContentView: View { let isWorkspaceVisible: Bool let isWorkspaceInputActive: Bool let workspacePortalPriority: Int + let onThemeRefreshRequest: (( + _ reason: String, + _ backgroundEventId: UInt64?, + _ backgroundSource: String?, + _ notificationPayloadHex: String? + ) -> Void)? @State private var config = WorkspaceContentView.resolveGhosttyAppearanceConfig(reason: "stateInit") @Environment(\.colorScheme) private var colorScheme @EnvironmentObject var notificationStore: TerminalNotificationStore @@ -106,11 +112,17 @@ struct WorkspaceContentView: View { let payloadHex = (notification.userInfo?[GhosttyNotificationKey.backgroundColor] as? NSColor)?.hexString() ?? "nil" let eventId = (notification.userInfo?[GhosttyNotificationKey.backgroundEventId] as? NSNumber)?.uint64Value let source = (notification.userInfo?[GhosttyNotificationKey.backgroundSource] as? String) ?? "nil" + logTheme( + "theme notification workspace=\(workspace.id.uuidString) event=\(eventId.map(String.init) ?? "nil") source=\(source) payload=\(payloadHex) appBg=\(GhosttyApp.shared.defaultBackgroundColor.hexString()) appOpacity=\(String(format: "%.3f", GhosttyApp.shared.defaultBackgroundOpacity))" + ) // Payload ordering can lag across rapid config/theme updates. // Resolve from GhosttyApp.shared.defaultBackgroundColor to keep tabs aligned // with Ghostty's current runtime theme. refreshGhosttyAppearanceConfig( - reason: "ghosttyDefaultBackgroundDidChange:event=\(eventId.map(String.init) ?? "nil"):source=\(source):payload=\(payloadHex)" + reason: "ghosttyDefaultBackgroundDidChange", + backgroundEventId: eventId, + backgroundSource: source, + notificationPayloadHex: payloadHex ) } } @@ -174,19 +186,61 @@ struct WorkspaceContentView: View { return next } - private func refreshGhosttyAppearanceConfig(reason: String, backgroundOverride: NSColor? = nil) { + private func refreshGhosttyAppearanceConfig( + reason: String, + backgroundOverride: NSColor? = nil, + backgroundEventId: UInt64? = nil, + backgroundSource: String? = nil, + notificationPayloadHex: String? = nil + ) { let previousBackgroundHex = config.backgroundColor.hexString() let next = Self.resolveGhosttyAppearanceConfig( reason: reason, backgroundOverride: backgroundOverride ) + let eventLabel = backgroundEventId.map(String.init) ?? "nil" + let sourceLabel = backgroundSource ?? "nil" + let payloadLabel = notificationPayloadHex ?? "nil" + let backgroundChanged = previousBackgroundHex != next.backgroundColor.hexString() + let shouldRequestTitlebarRefresh = backgroundChanged || reason == "onAppear" logTheme( - "theme refresh workspace=\(workspace.id.uuidString) reason=\(reason) previousBg=\(previousBackgroundHex) nextBg=\(next.backgroundColor.hexString()) overrideBg=\(backgroundOverride?.hexString() ?? "nil")" + "theme refresh begin workspace=\(workspace.id.uuidString) reason=\(reason) event=\(eventLabel) source=\(sourceLabel) payload=\(payloadLabel) previousBg=\(previousBackgroundHex) nextBg=\(next.backgroundColor.hexString()) overrideBg=\(backgroundOverride?.hexString() ?? "nil")" ) withTransaction(Transaction(animation: nil)) { config = next + if shouldRequestTitlebarRefresh { + onThemeRefreshRequest?( + reason, + backgroundEventId, + backgroundSource, + notificationPayloadHex + ) + } } - workspace.applyGhosttyChrome(from: next) + if !shouldRequestTitlebarRefresh { + logTheme( + "theme refresh titlebar-skip workspace=\(workspace.id.uuidString) reason=\(reason) event=\(eventLabel) previousBg=\(previousBackgroundHex) nextBg=\(next.backgroundColor.hexString())" + ) + } + logTheme( + "theme refresh config-applied workspace=\(workspace.id.uuidString) reason=\(reason) event=\(eventLabel) configBg=\(config.backgroundColor.hexString())" + ) + let chromeReason = + "refreshGhosttyAppearanceConfig:reason=\(reason):event=\(eventLabel):source=\(sourceLabel):payload=\(payloadLabel)" + workspace.applyGhosttyChrome(from: next, reason: chromeReason) + if let terminalPanel = workspace.focusedTerminalPanel { + terminalPanel.applyWindowBackgroundIfActive() + logTheme( + "theme refresh terminal-applied workspace=\(workspace.id.uuidString) reason=\(reason) event=\(eventLabel) panel=\(workspace.focusedPanelId?.uuidString ?? "nil")" + ) + } else { + logTheme( + "theme refresh terminal-skipped workspace=\(workspace.id.uuidString) reason=\(reason) event=\(eventLabel) focusedPanel=\(workspace.focusedPanelId?.uuidString ?? "nil")" + ) + } + logTheme( + "theme refresh end workspace=\(workspace.id.uuidString) reason=\(reason) event=\(eventLabel) chromeBg=\(workspace.bonsplitController.configuration.appearance.chromeColors.backgroundHex ?? "nil")" + ) } private func logTheme(_ message: String) { From cb0efa3eddf55afcdec20e39aaaaa9595d37026a Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 02:59:59 -0800 Subject: [PATCH 106/214] Fix early split child-exit close race --- Sources/GhosttyTerminalView.swift | 29 +++++++----- Sources/TabManager.swift | 48 ++++++++++++++------ cmuxUITests/CloseWorkspaceCmdDUITests.swift | 49 +++++++++++++++++++++ 3 files changed, 100 insertions(+), 26 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 1a936ec0..a040b3be 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1126,11 +1126,13 @@ class GhosttyApp { // "Process exited. Press any key..." into the terminal unless the host // handles this action. For cmux, the correct behavior is to close // the panel immediately (no prompt). + let callbackTabId = surfaceView.tabId + let callbackSurfaceId = surfaceView.terminalSurface?.id #if DEBUG cmuxWriteChildExitProbe( [ - "probeShowChildExitedTabId": surfaceView.tabId?.uuidString ?? "", - "probeShowChildExitedSurfaceId": surfaceView.terminalSurface?.id.uuidString ?? "", + "probeShowChildExitedTabId": callbackTabId?.uuidString ?? "", + "probeShowChildExitedSurfaceId": callbackSurfaceId?.uuidString ?? "", ], increments: ["probeShowChildExitedCount": 1] ) @@ -1139,12 +1141,12 @@ class GhosttyApp { // dispatching this action callback. DispatchQueue.main.async { guard let app = AppDelegate.shared else { return } - if let tabId = surfaceView.tabId, - let surfaceId = surfaceView.terminalSurface?.id, - let manager = app.tabManagerFor(tabId: tabId) ?? app.tabManager, - let workspace = manager.tabs.first(where: { $0.id == tabId }), - workspace.panels[surfaceId] != nil { - manager.closePanelAfterChildExited(tabId: tabId, surfaceId: surfaceId) + if let callbackTabId, + let callbackSurfaceId, + let manager = app.tabManagerFor(tabId: callbackTabId) ?? app.tabManager, + let workspace = manager.tabs.first(where: { $0.id == callbackTabId }), + workspace.panels[callbackSurfaceId] != nil { + manager.closePanelAfterChildExited(tabId: callbackTabId, surfaceId: callbackSurfaceId) } } // Always report handled so Ghostty doesn't print the fallback prompt. @@ -1945,7 +1947,10 @@ final class TerminalSurface: Identifiable, ObservableObject { } deinit { - if let surface = surface { + guard let surface else { return } + + // Defer teardown to the next main-actor turn so close callbacks can unwind first. + Task.detached { @MainActor in ghostty_surface_free(surface) } } @@ -4066,7 +4071,7 @@ final class GhosttySurfaceScrollView: NSView { /// This exercises the same key path as real keyboard input (ghostty_surface_key), /// unlike `sendText`, which bypasses key translation. @discardableResult - func sendSyntheticCtrlDForUITest() -> Bool { + func sendSyntheticCtrlDForUITest(modifierFlags: NSEvent.ModifierFlags = [.control]) -> Bool { guard let window else { return false } window.makeFirstResponder(surfaceView) @@ -4074,7 +4079,7 @@ final class GhosttySurfaceScrollView: NSView { guard let keyDown = NSEvent.keyEvent( with: .keyDown, location: .zero, - modifierFlags: [.control], + modifierFlags: modifierFlags, timestamp: timestamp, windowNumber: window.windowNumber, context: nil, @@ -4087,7 +4092,7 @@ final class GhosttySurfaceScrollView: NSView { guard let keyUp = NSEvent.keyEvent( with: .keyUp, location: .zero, - modifierFlags: [.control], + modifierFlags: modifierFlags, timestamp: timestamp + 0.001, windowNumber: window.windowNumber, context: nil, diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index ba6c3261..ce3e2b3b 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -2732,6 +2732,8 @@ class TabManager: ObservableObject { let strictKeyOnly = env["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_STRICT"] == "1" let triggerMode = (env["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_TRIGGER_MODE"] ?? "shell_input") .trimmingCharacters(in: .whitespacesAndNewlines) + let useEarlyCtrlShiftTrigger = triggerMode == "early_ctrl_shift_d" + let triggerUsesShift = triggerMode == "ctrl_shift_d" || useEarlyCtrlShiftTrigger let layout = (env["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_LAYOUT"] ?? "lr") .trimmingCharacters(in: .whitespacesAndNewlines) let expectedPanelsAfter = max( @@ -2870,7 +2872,9 @@ class TabManager: ObservableObject { } tab.focusPanel(exitPanelId) - try? await Task.sleep(nanoseconds: 100_000_000) + if !useEarlyCtrlShiftTrigger { + try? await Task.sleep(nanoseconds: 100_000_000) + } let focusedPanelBefore = tab.focusedPanelId?.uuidString ?? "" let firstResponderPanelBefore = tab.panels.compactMap { (panelId, panel) -> UUID? in @@ -2974,21 +2978,31 @@ class TabManager: ObservableObject { return } - // Wait for the target panel to be fully attached after split churn. - let readyDeadline = Date().addingTimeInterval(2.0) + let triggerModifiers: NSEvent.ModifierFlags = triggerUsesShift + ? [.control, .shift] + : [.control] + let shouldWaitForSurface = !useEarlyCtrlShiftTrigger + var attachedBeforeTrigger = false var hasSurfaceBeforeTrigger = false - while Date() < readyDeadline { - guard let panel = tab.terminalPanel(for: exitPanelId) else { - write(["autoTriggerError": "missingExitPanelBeforeTrigger"]) - return + if shouldWaitForSurface { + // Wait for the target panel to be fully attached after split churn. + let readyDeadline = Date().addingTimeInterval(2.0) + while Date() < readyDeadline { + guard let panel = tab.terminalPanel(for: exitPanelId) else { + write(["autoTriggerError": "missingExitPanelBeforeTrigger"]) + return + } + attachedBeforeTrigger = panel.hostedView.window != nil + hasSurfaceBeforeTrigger = panel.surface.surface != nil + if attachedBeforeTrigger, hasSurfaceBeforeTrigger { + break + } + try? await Task.sleep(nanoseconds: 50_000_000) } + } else if let panel = tab.terminalPanel(for: exitPanelId) { attachedBeforeTrigger = panel.hostedView.window != nil hasSurfaceBeforeTrigger = panel.surface.surface != nil - if attachedBeforeTrigger, hasSurfaceBeforeTrigger { - break - } - try? await Task.sleep(nanoseconds: 50_000_000) } write([ "exitPanelAttachedBeforeTrigger": attachedBeforeTrigger ? "1" : "0", @@ -3000,7 +3014,7 @@ class TabManager: ObservableObject { return } // Exercise the real key path (ghostty_surface_key for Ctrl+D). - if panel.hostedView.sendSyntheticCtrlDForUITest() { + if panel.hostedView.sendSyntheticCtrlDForUITest(modifierFlags: triggerModifiers) { write(["autoTriggerSentCtrlDKey1": "1"]) } else { write([ @@ -3012,13 +3026,19 @@ class TabManager: ObservableObject { // In strict mode, never mask routing bugs with fallback writes. if strictKeyOnly { - write(["autoTriggerMode": "strict_ctrl_d"]) + let strictModeLabel: String = { + if useEarlyCtrlShiftTrigger { return "strict_early_ctrl_shift_d" } + if triggerUsesShift { return "strict_ctrl_shift_d" } + return "strict_ctrl_d" + }() + write(["autoTriggerMode": strictModeLabel]) return } // Non-strict mode keeps one additional Ctrl+D retry for startup timing variance. try? await Task.sleep(nanoseconds: 450_000_000) - if tab.panels[exitPanelId] != nil, panel.hostedView.sendSyntheticCtrlDForUITest() { + if tab.panels[exitPanelId] != nil, + panel.hostedView.sendSyntheticCtrlDForUITest(modifierFlags: triggerModifiers) { write(["autoTriggerSentCtrlDKey2": "1"]) } } diff --git a/cmuxUITests/CloseWorkspaceCmdDUITests.swift b/cmuxUITests/CloseWorkspaceCmdDUITests.swift index 02ec9239..d8054225 100644 --- a/cmuxUITests/CloseWorkspaceCmdDUITests.swift +++ b/cmuxUITests/CloseWorkspaceCmdDUITests.swift @@ -546,6 +546,55 @@ final class CloseWorkspaceCmdDUITests: XCTestCase { } } + func testCtrlShiftDEarlyDuringSplitStartupKeepsWindowOpen() { + let attempts = 12 + for attempt in 1...attempts { + let app = XCUIApplication() + let dataPath = "/tmp/cmux-ui-test-child-exit-keyboard-lr-early-shift-\(UUID().uuidString).json" + try? FileManager.default.removeItem(atPath: dataPath) + app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_SETUP"] = "1" + app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_PATH"] = dataPath + app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_LAYOUT"] = "lr" + app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_EXPECTED_PANELS_AFTER"] = "1" + app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_AUTO_TRIGGER"] = "1" + app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_STRICT"] = "1" + app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_TRIGGER_MODE"] = "early_ctrl_shift_d" + app.launch() + app.activate() + defer { app.terminate() } + + XCTAssertTrue( + waitForAnyJSON(atPath: dataPath, timeout: 12.0), + "Attempt \(attempt): expected early Ctrl+Shift+D setup data at \(dataPath)" + ) + guard let done = waitForJSONKey("done", equals: "1", atPath: dataPath, timeout: 10.0) else { + XCTFail("Attempt \(attempt): timed out waiting for done=1 after early Ctrl+Shift+D. data=\(loadJSON(atPath: dataPath) ?? [:])") + return + } + + if let setupError = done["setupError"], !setupError.isEmpty { + XCTFail("Attempt \(attempt): setup failed: \(setupError)") + return + } + + let workspaceCountAfter = Int(done["workspaceCountAfter"] ?? "") ?? -1 + let panelCountAfter = Int(done["panelCountAfter"] ?? "") ?? -1 + let closedWorkspace = (done["closedWorkspace"] ?? "") == "1" + let timedOut = (done["timedOut"] ?? "") == "1" + let triggerMode = done["autoTriggerMode"] ?? "" + + XCTAssertFalse(timedOut, "Attempt \(attempt): early Ctrl+Shift+D timed out. data=\(done)") + XCTAssertEqual(triggerMode, "strict_early_ctrl_shift_d", "Attempt \(attempt): expected strict early Ctrl+Shift+D trigger mode. data=\(done)") + XCTAssertFalse(closedWorkspace, "Attempt \(attempt): workspace/window should stay open after early Ctrl+Shift+D. data=\(done)") + XCTAssertEqual(workspaceCountAfter, 1, "Attempt \(attempt): workspace should remain open after early Ctrl+Shift+D. data=\(done)") + XCTAssertEqual(panelCountAfter, 1, "Attempt \(attempt): only focused pane should close after early Ctrl+Shift+D. data=\(done)") + XCTAssertTrue( + waitForWindowCount(app: app, atLeast: 1, timeout: 2.0), + "Attempt \(attempt): app window should remain open after early Ctrl+Shift+D. data=\(done)" + ) + } + } + private func waitForCloseWorkspaceAlert(app: XCUIApplication, timeout: TimeInterval) -> Bool { let deadline = Date().addingTimeInterval(timeout) while Date() < deadline { From 2499ba1bb2fbabfaff40522de8d12e1a985a06ae Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:09:19 -0800 Subject: [PATCH 107/214] Fix browser-surface click focus without regressing open (#355) * Allow click-to-focus for unfocused browser surfaces * Add browser click-focus diagnostics and guard fix * Allow pointer-initiated browser focus through responder guard --- Sources/AppDelegate.swift | 110 +++++++++++++++- Sources/Panels/BrowserPanel.swift | 10 ++ Sources/Panels/BrowserPanelView.swift | 38 +++++- Sources/Panels/CmuxWebView.swift | 64 ++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 123 ++++++++++++++++++ 5 files changed, 335 insertions(+), 10 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 7bafbc8e..f9003b88 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1548,6 +1548,18 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent _ = didInstallWindowFirstResponderSwizzle } +#if DEBUG + static func setWindowFirstResponderGuardTesting(currentEvent: NSEvent?, hitView: NSView?) { + cmuxFirstResponderGuardCurrentEventOverride = currentEvent + cmuxFirstResponderGuardHitViewOverride = hitView + } + + static func clearWindowFirstResponderGuardTesting() { + cmuxFirstResponderGuardCurrentEventOverride = nil + cmuxFirstResponderGuardHitViewOverride = nil + } +#endif + private func installWindowResponderSwizzles() { _ = Self.didInstallWindowKeyEquivalentSwizzle _ = Self.didInstallWindowFirstResponderSwizzle @@ -2887,6 +2899,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent ) { [weak self] notification in guard let self else { return } guard let panelId = notification.object as? UUID else { return } + self.browserPanel(for: panelId)?.endSuppressWebViewFocusForAddressBar() if self.browserAddressBarFocusedPanelId == panelId { self.browserAddressBarFocusedPanelId = nil self.stopBrowserOmnibarSelectionRepeat() @@ -3853,19 +3866,59 @@ enum MenuBarIconRenderer { } +#if DEBUG +private var cmuxFirstResponderGuardCurrentEventOverride: NSEvent? +private var cmuxFirstResponderGuardHitViewOverride: NSView? +#endif + private extension NSWindow { @objc func cmux_makeFirstResponder(_ responder: NSResponder?) -> Bool { if let responder, let webView = Self.cmuxOwningWebView(for: responder), - !webView.allowsFirstResponderAcquisition { -#if DEBUG - dlog( - "focus.guard blockedFirstResponder responder=\(String(describing: type(of: responder))) " + - "window=\(ObjectIdentifier(self))" + !webView.allowsFirstResponderAcquisitionEffective { + let currentEvent = Self.cmuxCurrentEvent(for: self) + let pointerInitiatedFocus = Self.cmuxShouldAllowPointerInitiatedWebViewFocus( + window: self, + webView: webView, + event: currentEvent ) + if pointerInitiatedFocus { +#if DEBUG + dlog( + "focus.guard allowPointerFirstResponder responder=\(String(describing: type(of: responder))) " + + "window=\(ObjectIdentifier(self)) " + + "web=\(ObjectIdentifier(webView)) " + + "policy=\(webView.allowsFirstResponderAcquisition ? 1 : 0) " + + "pointerDepth=\(webView.debugPointerFocusAllowanceDepth) " + + "eventType=\(currentEvent.map { String(describing: $0.type) } ?? "nil")" + ) #endif - return false + } else { +#if DEBUG + dlog( + "focus.guard blockedFirstResponder responder=\(String(describing: type(of: responder))) " + + "window=\(ObjectIdentifier(self)) " + + "web=\(ObjectIdentifier(webView)) " + + "policy=\(webView.allowsFirstResponderAcquisition ? 1 : 0) " + + "pointerDepth=\(webView.debugPointerFocusAllowanceDepth) " + + "eventType=\(currentEvent.map { String(describing: $0.type) } ?? "nil")" + ) +#endif + return false + } } +#if DEBUG + if let responder, + let webView = Self.cmuxOwningWebView(for: responder) { + dlog( + "focus.guard allowFirstResponder responder=\(String(describing: type(of: responder))) " + + "window=\(ObjectIdentifier(self)) " + + "web=\(ObjectIdentifier(webView)) " + + "policy=\(webView.allowsFirstResponderAcquisition ? 1 : 0) " + + "pointerDepth=\(webView.debugPointerFocusAllowanceDepth)" + ) + } +#endif return cmux_makeFirstResponder(responder) } @@ -4024,4 +4077,49 @@ private extension NSWindow { return nil } + + private static func cmuxCurrentEvent(for _: NSWindow) -> NSEvent? { +#if DEBUG + if let override = cmuxFirstResponderGuardCurrentEventOverride { + return override + } +#endif + return NSApp.currentEvent + } + + private static func cmuxHitViewForCurrentEvent(in window: NSWindow, event: NSEvent) -> NSView? { +#if DEBUG + if let override = cmuxFirstResponderGuardHitViewOverride { + return override + } +#endif + return window.contentView?.hitTest(event.locationInWindow) + } + + private static func cmuxShouldAllowPointerInitiatedWebViewFocus( + window: NSWindow, + webView: CmuxWebView, + event: NSEvent? + ) -> Bool { + guard let event else { return false } + switch event.type { + case .leftMouseDown, .rightMouseDown, .otherMouseDown: + break + default: + return false + } + + if event.windowNumber != 0, event.windowNumber != window.windowNumber { + return false + } + if let eventWindow = event.window, eventWindow !== window { + return false + } + + guard let hitView = cmuxHitViewForCurrentEvent(in: window, event: event), + let hitWebView = cmuxOwningWebView(for: hitView) else { + return false + } + return hitWebView === webView + } } diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 2a683ba5..6255672e 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -2117,10 +2117,20 @@ extension BrowserPanel { } func beginSuppressWebViewFocusForAddressBar() { + if !suppressWebViewFocusForAddressBar { +#if DEBUG + dlog("browser.focus.addressBarSuppress.begin panel=\(id.uuidString.prefix(5))") +#endif + } suppressWebViewFocusForAddressBar = true } func endSuppressWebViewFocusForAddressBar() { + if suppressWebViewFocusForAddressBar { +#if DEBUG + dlog("browser.focus.addressBarSuppress.end panel=\(id.uuidString.prefix(5))") +#endif + } suppressWebViewFocusForAddressBar = false } diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index f0c65a81..0294766f 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -291,6 +291,13 @@ struct BrowserPanelView: View { guard let webView = note.object as? CmuxWebView else { return false } return webView === panel?.webView }) { _ in +#if DEBUG + dlog( + "browser.focus.clickIntent panel=\(panel.id.uuidString.prefix(5)) " + + "isFocused=\(isFocused ? 1 : 0) " + + "addressFocused=\(addressBarFocused ? 1 : 0)" + ) +#endif onRequestPanelFocus() } .onReceive(NotificationCenter.default.publisher(for: .webViewMiddleClickedLink).filter { [weak panel] note in @@ -317,6 +324,7 @@ struct BrowserPanelView: View { syncURLFromPanel() // If the browser surface is focused but has no URL loaded yet, auto-focus the omnibar. autoFocusOmnibarIfBlank() + syncWebViewResponderPolicyWithViewState(reason: "onAppear") BrowserHistoryStore.shared.loadIfNeeded() } .onChange(of: panel.focusFlashToken) { _ in @@ -356,6 +364,7 @@ struct BrowserPanelView: View { hideSuggestions() addressBarFocused = false } + syncWebViewResponderPolicyWithViewState(reason: "panelFocusChanged") } .onChange(of: addressBarFocused) { focused in let urlString = panel.preferredURLStringForOmnibar() ?? "" @@ -383,6 +392,7 @@ struct BrowserPanelView: View { } inlineCompletion = nil } + syncWebViewResponderPolicyWithViewState(reason: "addressBarFocusChanged") } .onReceive(NotificationCenter.default.publisher(for: .browserMoveOmnibarSelection)) { notification in guard let panelId = notification.object as? UUID, panelId == panel.id else { return } @@ -715,6 +725,21 @@ struct BrowserPanelView: View { } } + private func syncWebViewResponderPolicyWithViewState(reason: String) { + guard let cmuxWebView = panel.webView as? CmuxWebView else { return } + let next = isFocused && !panel.shouldSuppressWebViewFocus() + if cmuxWebView.allowsFirstResponderAcquisition != next { +#if DEBUG + dlog( + "browser.focus.policy.resync panel=\(panel.id.uuidString.prefix(5)) " + + "web=\(ObjectIdentifier(cmuxWebView)) old=\(cmuxWebView.allowsFirstResponderAcquisition ? 1 : 0) " + + "new=\(next ? 1 : 0) reason=\(reason)" + ) +#endif + } + cmuxWebView.allowsFirstResponderAcquisition = next + } + private func syncURLFromPanel() { let urlString = panel.preferredURLStringForOmnibar() ?? "" let effects = omnibarReduce(state: &omnibarState, event: .panelURLChanged(currentURLString: urlString)) @@ -3379,7 +3404,18 @@ struct WebViewRepresentable: NSViewRepresentable { isPanelFocused: Bool ) { guard let cmuxWebView = webView as? CmuxWebView else { return } - cmuxWebView.allowsFirstResponderAcquisition = isPanelFocused && !panel.shouldSuppressWebViewFocus() + let next = isPanelFocused && !panel.shouldSuppressWebViewFocus() + if cmuxWebView.allowsFirstResponderAcquisition != next { +#if DEBUG + dlog( + "browser.focus.policy panel=\(panel.id.uuidString.prefix(5)) " + + "web=\(ObjectIdentifier(cmuxWebView)) old=\(cmuxWebView.allowsFirstResponderAcquisition ? 1 : 0) " + + "new=\(next ? 1 : 0) isPanelFocused=\(isPanelFocused ? 1 : 0) " + + "suppress=\(panel.shouldSuppressWebViewFocus() ? 1 : 0)" + ) +#endif + } + cmuxWebView.allowsFirstResponderAcquisition = next } static func dismantleNSView(_ nsView: NSView, coordinator: Coordinator) { diff --git a/Sources/Panels/CmuxWebView.swift b/Sources/Panels/CmuxWebView.swift index 93f5a321..83941484 100644 --- a/Sources/Panels/CmuxWebView.swift +++ b/Sources/Panels/CmuxWebView.swift @@ -1,4 +1,5 @@ import AppKit +import Bonsplit import ObjectiveC import WebKit @@ -25,10 +26,56 @@ final class CmuxWebView: WKWebView { /// Guard against background panes stealing first responder (e.g. page autofocus). /// BrowserPanelView updates this as pane focus state changes. var allowsFirstResponderAcquisition: Bool = true + private var pointerFocusAllowanceDepth: Int = 0 + var allowsFirstResponderAcquisitionEffective: Bool { + allowsFirstResponderAcquisition || pointerFocusAllowanceDepth > 0 + } + var debugPointerFocusAllowanceDepth: Int { pointerFocusAllowanceDepth } override func becomeFirstResponder() -> Bool { - guard allowsFirstResponderAcquisition else { return false } - return super.becomeFirstResponder() + guard allowsFirstResponderAcquisitionEffective else { +#if DEBUG + let eventType = NSApp.currentEvent.map { String(describing: $0.type) } ?? "nil" + dlog( + "browser.focus.blockedBecome web=\(ObjectIdentifier(self)) " + + "policy=\(allowsFirstResponderAcquisition ? 1 : 0) " + + "pointerDepth=\(pointerFocusAllowanceDepth) eventType=\(eventType)" + ) +#endif + return false + } + let result = super.becomeFirstResponder() +#if DEBUG + let eventType = NSApp.currentEvent.map { String(describing: $0.type) } ?? "nil" + dlog( + "browser.focus.become web=\(ObjectIdentifier(self)) result=\(result ? 1 : 0) " + + "policy=\(allowsFirstResponderAcquisition ? 1 : 0) " + + "pointerDepth=\(pointerFocusAllowanceDepth) eventType=\(eventType)" + ) +#endif + return result + } + + /// Temporarily permits focus acquisition for explicit pointer-driven interactions + /// (mouse click into this webview) while keeping background autofocus blocked. + func withPointerFocusAllowance(_ body: () -> Void) { + pointerFocusAllowanceDepth += 1 +#if DEBUG + dlog( + "browser.focus.pointerAllowance.enter web=\(ObjectIdentifier(self)) " + + "depth=\(pointerFocusAllowanceDepth)" + ) +#endif + defer { + pointerFocusAllowanceDepth = max(0, pointerFocusAllowanceDepth - 1) +#if DEBUG + dlog( + "browser.focus.pointerAllowance.exit web=\(ObjectIdentifier(self)) " + + "depth=\(pointerFocusAllowanceDepth)" + ) +#endif + } + body() } override func performKeyEquivalent(with event: NSEvent) -> Bool { @@ -71,8 +118,19 @@ final class CmuxWebView: WKWebView { // NSView (WKWebView), not to sibling SwiftUI overlays. Notify the panel system so // bonsplit focus tracks which pane the user clicked in. override func mouseDown(with event: NSEvent) { +#if DEBUG + let windowNumber = window?.windowNumber ?? -1 + let firstResponderType = window?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" + dlog( + "browser.focus.mouseDown web=\(ObjectIdentifier(self)) " + + "policy=\(allowsFirstResponderAcquisition ? 1 : 0) " + + "pointerDepth=\(pointerFocusAllowanceDepth) win=\(windowNumber) fr=\(firstResponderType)" + ) +#endif NotificationCenter.default.post(name: .webViewDidReceiveClick, object: self) - super.mouseDown(with: event) + withPointerFocusAllowance { + super.mouseDown(with: event) + } } // MARK: - Mouse back/forward buttons & middle-click diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 45e2a54e..05af20eb 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -136,6 +136,38 @@ final class CmuxWebViewKeyEquivalentTests: XCTestCase { } } + @MainActor + func testPointerFocusAllowanceCanTemporarilyOverrideBlockedFirstResponderAcquisition() { + _ = NSApplication.shared + + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 640, height: 420), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + let container = NSView(frame: window.contentRect(forFrameRect: window.frame)) + window.contentView = container + + let webView = CmuxWebView(frame: container.bounds, configuration: WKWebViewConfiguration()) + webView.autoresizingMask = [.width, .height] + container.addSubview(webView) + + window.makeKeyAndOrderFront(nil) + defer { window.orderOut(nil) } + + webView.allowsFirstResponderAcquisition = false + _ = window.makeFirstResponder(nil) + XCTAssertFalse(webView.becomeFirstResponder(), "Expected focus to stay blocked by policy") + + webView.withPointerFocusAllowance { + XCTAssertTrue(webView.becomeFirstResponder(), "Expected explicit pointer intent to bypass policy") + } + + _ = window.makeFirstResponder(nil) + XCTAssertFalse(webView.becomeFirstResponder(), "Expected pointer allowance to be temporary") + } + @MainActor func testWindowFirstResponderGuardBlocksDescendantWhenPaneIsUnfocused() { _ = NSApplication.shared @@ -172,6 +204,97 @@ final class CmuxWebViewKeyEquivalentTests: XCTestCase { } } + @MainActor + func testWindowFirstResponderGuardAllowsDescendantDuringPointerFocusAllowance() { + _ = NSApplication.shared + AppDelegate.installWindowResponderSwizzlesForTesting() + + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 640, height: 420), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + let container = NSView(frame: window.contentRect(forFrameRect: window.frame)) + window.contentView = container + + let webView = CmuxWebView(frame: container.bounds, configuration: WKWebViewConfiguration()) + webView.autoresizingMask = [.width, .height] + container.addSubview(webView) + + let descendant = FirstResponderView(frame: NSRect(x: 0, y: 0, width: 10, height: 10)) + webView.addSubview(descendant) + + window.makeKeyAndOrderFront(nil) + defer { window.orderOut(nil) } + + webView.allowsFirstResponderAcquisition = false + _ = window.makeFirstResponder(nil) + XCTAssertFalse(window.makeFirstResponder(descendant), "Expected blocked focus outside pointer allowance") + + _ = window.makeFirstResponder(nil) + webView.withPointerFocusAllowance { + XCTAssertTrue(window.makeFirstResponder(descendant), "Expected pointer allowance to bypass guard") + } + + _ = window.makeFirstResponder(nil) + XCTAssertFalse(window.makeFirstResponder(descendant), "Expected pointer allowance to remain temporary") + } + + @MainActor + func testWindowFirstResponderGuardAllowsPointerInitiatedClickFocusWhenPolicyIsBlocked() { + _ = NSApplication.shared + AppDelegate.installWindowResponderSwizzlesForTesting() + + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 640, height: 420), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + let container = NSView(frame: window.contentRect(forFrameRect: window.frame)) + window.contentView = container + + let webView = CmuxWebView(frame: container.bounds, configuration: WKWebViewConfiguration()) + webView.autoresizingMask = [.width, .height] + container.addSubview(webView) + + let descendant = FirstResponderView(frame: NSRect(x: 0, y: 0, width: 10, height: 10)) + webView.addSubview(descendant) + + window.makeKeyAndOrderFront(nil) + defer { + AppDelegate.clearWindowFirstResponderGuardTesting() + window.orderOut(nil) + } + + webView.allowsFirstResponderAcquisition = false + _ = window.makeFirstResponder(nil) + XCTAssertFalse(window.makeFirstResponder(descendant), "Expected blocked focus without pointer click context") + + let timestamp = ProcessInfo.processInfo.systemUptime + let pointerDownEvent = NSEvent.mouseEvent( + with: .leftMouseDown, + location: NSPoint(x: 5, y: 5), + modifierFlags: [], + timestamp: timestamp, + windowNumber: window.windowNumber, + context: nil, + eventNumber: 1, + clickCount: 1, + pressure: 1.0 + ) + XCTAssertNotNil(pointerDownEvent) + + AppDelegate.setWindowFirstResponderGuardTesting(currentEvent: pointerDownEvent, hitView: descendant) + _ = window.makeFirstResponder(nil) + XCTAssertTrue(window.makeFirstResponder(descendant), "Expected pointer click context to bypass blocked policy") + + AppDelegate.clearWindowFirstResponderGuardTesting() + _ = window.makeFirstResponder(nil) + XCTAssertFalse(window.makeFirstResponder(descendant), "Expected pointer bypass to be limited to click context") + } + private func installMenu(spy: ActionSpy, key: String, modifiers: NSEvent.ModifierFlags) { let mainMenu = NSMenu() From aeabcdd58352c3ade82d69e914ad568dbca72578 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:13:33 -0800 Subject: [PATCH 108/214] Fix titlebar folder icon drag hit-testing --- Sources/WindowDragHandleView.swift | 25 ++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 55 +++++++++++++++++++ 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/Sources/WindowDragHandleView.swift b/Sources/WindowDragHandleView.swift index e534e1bc..da9127e4 100644 --- a/Sources/WindowDragHandleView.swift +++ b/Sources/WindowDragHandleView.swift @@ -1,6 +1,26 @@ import AppKit import SwiftUI +/// Returns whether the titlebar drag handle should capture a hit at `point`. +/// We only claim the hit when no sibling view already handles it, so interactive +/// controls layered in the titlebar (e.g. proxy folder icon) keep their gestures. +func windowDragHandleShouldCaptureHit(_ point: NSPoint, in dragHandleView: NSView) -> Bool { + guard dragHandleView.bounds.contains(point) else { return false } + guard let superview = dragHandleView.superview else { return true } + + for sibling in superview.subviews.reversed() { + guard sibling !== dragHandleView else { continue } + guard !sibling.isHidden, sibling.alphaValue > 0 else { continue } + + let pointInSibling = dragHandleView.convert(point, to: sibling) + if sibling.hitTest(pointInSibling) != nil { + return false + } + } + + return true +} + /// A transparent view that enables dragging the window when clicking in empty titlebar space. /// This lets us keep `window.isMovableByWindowBackground = false` so drags in the app content /// (e.g. sidebar tab reordering) don't move the whole window. @@ -15,7 +35,8 @@ struct WindowDragHandleView: NSViewRepresentable { private final class DraggableView: NSView { override var mouseDownCanMoveWindow: Bool { true } - override func hitTest(_ point: NSPoint) -> NSView? { self } + override func hitTest(_ point: NSPoint) -> NSView? { + windowDragHandleShouldCaptureHit(point, in: self) ? self : nil + } } } - diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 45e2a54e..9a2fa303 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -3816,6 +3816,61 @@ final class WindowBrowserHostViewTests: XCTestCase { } } +@MainActor +final class WindowDragHandleHitTests: XCTestCase { + private final class CapturingView: NSView { + override func hitTest(_ point: NSPoint) -> NSView? { + bounds.contains(point) ? self : nil + } + } + + func testDragHandleCapturesHitWhenNoSiblingClaimsPoint() { + let container = NSView(frame: NSRect(x: 0, y: 0, width: 220, height: 36)) + let dragHandle = NSView(frame: container.bounds) + container.addSubview(dragHandle) + + XCTAssertTrue( + windowDragHandleShouldCaptureHit(NSPoint(x: 180, y: 18), in: dragHandle), + "Empty titlebar space should drag the window" + ) + } + + func testDragHandleYieldsWhenSiblingClaimsPoint() { + let container = NSView(frame: NSRect(x: 0, y: 0, width: 220, height: 36)) + let dragHandle = NSView(frame: container.bounds) + container.addSubview(dragHandle) + + let folderIconHost = CapturingView(frame: NSRect(x: 10, y: 10, width: 16, height: 16)) + container.addSubview(folderIconHost) + + XCTAssertFalse( + windowDragHandleShouldCaptureHit(NSPoint(x: 14, y: 14), in: dragHandle), + "Interactive titlebar controls should receive the mouse event" + ) + XCTAssertTrue(windowDragHandleShouldCaptureHit(NSPoint(x: 180, y: 18), in: dragHandle)) + } + + func testDragHandleIgnoresHiddenSiblingWhenResolvingHit() { + let container = NSView(frame: NSRect(x: 0, y: 0, width: 220, height: 36)) + let dragHandle = NSView(frame: container.bounds) + container.addSubview(dragHandle) + + let hidden = CapturingView(frame: NSRect(x: 10, y: 10, width: 16, height: 16)) + hidden.isHidden = true + container.addSubview(hidden) + + XCTAssertTrue(windowDragHandleShouldCaptureHit(NSPoint(x: 14, y: 14), in: dragHandle)) + } + + func testDragHandleDoesNotCaptureOutsideBounds() { + let container = NSView(frame: NSRect(x: 0, y: 0, width: 220, height: 36)) + let dragHandle = NSView(frame: container.bounds) + container.addSubview(dragHandle) + + XCTAssertFalse(windowDragHandleShouldCaptureHit(NSPoint(x: 240, y: 18), in: dragHandle)) + } +} + @MainActor final class GhosttySurfaceOverlayTests: XCTestCase { func testInactiveOverlayVisibilityTracksRequestedState() { From 9ed3744485f72cebae6a594741431ff7530b3e6a Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:15:31 -0800 Subject: [PATCH 109/214] Align startup split regression with Ctrl+D --- Sources/TabManager.swift | 7 +++++-- cmuxUITests/CloseWorkspaceCmdDUITests.swift | 22 ++++++++++----------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index ce3e2b3b..d01ae0e7 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -2733,6 +2733,8 @@ class TabManager: ObservableObject { let triggerMode = (env["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_TRIGGER_MODE"] ?? "shell_input") .trimmingCharacters(in: .whitespacesAndNewlines) let useEarlyCtrlShiftTrigger = triggerMode == "early_ctrl_shift_d" + let useEarlyCtrlDTrigger = triggerMode == "early_ctrl_d" + let useEarlyTrigger = useEarlyCtrlShiftTrigger || useEarlyCtrlDTrigger let triggerUsesShift = triggerMode == "ctrl_shift_d" || useEarlyCtrlShiftTrigger let layout = (env["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_LAYOUT"] ?? "lr") .trimmingCharacters(in: .whitespacesAndNewlines) @@ -2872,7 +2874,7 @@ class TabManager: ObservableObject { } tab.focusPanel(exitPanelId) - if !useEarlyCtrlShiftTrigger { + if !useEarlyTrigger { try? await Task.sleep(nanoseconds: 100_000_000) } @@ -2981,7 +2983,7 @@ class TabManager: ObservableObject { let triggerModifiers: NSEvent.ModifierFlags = triggerUsesShift ? [.control, .shift] : [.control] - let shouldWaitForSurface = !useEarlyCtrlShiftTrigger + let shouldWaitForSurface = !useEarlyTrigger var attachedBeforeTrigger = false var hasSurfaceBeforeTrigger = false @@ -3028,6 +3030,7 @@ class TabManager: ObservableObject { if strictKeyOnly { let strictModeLabel: String = { if useEarlyCtrlShiftTrigger { return "strict_early_ctrl_shift_d" } + if useEarlyCtrlDTrigger { return "strict_early_ctrl_d" } if triggerUsesShift { return "strict_ctrl_shift_d" } return "strict_ctrl_d" }() diff --git a/cmuxUITests/CloseWorkspaceCmdDUITests.swift b/cmuxUITests/CloseWorkspaceCmdDUITests.swift index d8054225..6955591a 100644 --- a/cmuxUITests/CloseWorkspaceCmdDUITests.swift +++ b/cmuxUITests/CloseWorkspaceCmdDUITests.swift @@ -546,11 +546,11 @@ final class CloseWorkspaceCmdDUITests: XCTestCase { } } - func testCtrlShiftDEarlyDuringSplitStartupKeepsWindowOpen() { + func testCtrlDEarlyDuringSplitStartupKeepsWindowOpen() { let attempts = 12 for attempt in 1...attempts { let app = XCUIApplication() - let dataPath = "/tmp/cmux-ui-test-child-exit-keyboard-lr-early-shift-\(UUID().uuidString).json" + let dataPath = "/tmp/cmux-ui-test-child-exit-keyboard-lr-early-ctrl-\(UUID().uuidString).json" try? FileManager.default.removeItem(atPath: dataPath) app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_SETUP"] = "1" app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_PATH"] = dataPath @@ -558,17 +558,17 @@ final class CloseWorkspaceCmdDUITests: XCTestCase { app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_EXPECTED_PANELS_AFTER"] = "1" app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_AUTO_TRIGGER"] = "1" app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_STRICT"] = "1" - app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_TRIGGER_MODE"] = "early_ctrl_shift_d" + app.launchEnvironment["CMUX_UI_TEST_CHILD_EXIT_KEYBOARD_TRIGGER_MODE"] = "early_ctrl_d" app.launch() app.activate() defer { app.terminate() } XCTAssertTrue( waitForAnyJSON(atPath: dataPath, timeout: 12.0), - "Attempt \(attempt): expected early Ctrl+Shift+D setup data at \(dataPath)" + "Attempt \(attempt): expected early Ctrl+D setup data at \(dataPath)" ) guard let done = waitForJSONKey("done", equals: "1", atPath: dataPath, timeout: 10.0) else { - XCTFail("Attempt \(attempt): timed out waiting for done=1 after early Ctrl+Shift+D. data=\(loadJSON(atPath: dataPath) ?? [:])") + XCTFail("Attempt \(attempt): timed out waiting for done=1 after early Ctrl+D. data=\(loadJSON(atPath: dataPath) ?? [:])") return } @@ -583,14 +583,14 @@ final class CloseWorkspaceCmdDUITests: XCTestCase { let timedOut = (done["timedOut"] ?? "") == "1" let triggerMode = done["autoTriggerMode"] ?? "" - XCTAssertFalse(timedOut, "Attempt \(attempt): early Ctrl+Shift+D timed out. data=\(done)") - XCTAssertEqual(triggerMode, "strict_early_ctrl_shift_d", "Attempt \(attempt): expected strict early Ctrl+Shift+D trigger mode. data=\(done)") - XCTAssertFalse(closedWorkspace, "Attempt \(attempt): workspace/window should stay open after early Ctrl+Shift+D. data=\(done)") - XCTAssertEqual(workspaceCountAfter, 1, "Attempt \(attempt): workspace should remain open after early Ctrl+Shift+D. data=\(done)") - XCTAssertEqual(panelCountAfter, 1, "Attempt \(attempt): only focused pane should close after early Ctrl+Shift+D. data=\(done)") + XCTAssertFalse(timedOut, "Attempt \(attempt): early Ctrl+D timed out. data=\(done)") + XCTAssertEqual(triggerMode, "strict_early_ctrl_d", "Attempt \(attempt): expected strict early Ctrl+D trigger mode. data=\(done)") + XCTAssertFalse(closedWorkspace, "Attempt \(attempt): workspace/window should stay open after early Ctrl+D. data=\(done)") + XCTAssertEqual(workspaceCountAfter, 1, "Attempt \(attempt): workspace should remain open after early Ctrl+D. data=\(done)") + XCTAssertEqual(panelCountAfter, 1, "Attempt \(attempt): only focused pane should close after early Ctrl+D. data=\(done)") XCTAssertTrue( waitForWindowCount(app: app, atLeast: 1, timeout: 2.0), - "Attempt \(attempt): app window should remain open after early Ctrl+Shift+D. data=\(done)" + "Attempt \(attempt): app window should remain open after early Ctrl+D. data=\(done)" ) } } From 0c970858eea8cf180ad2929d26c6cdcfef498e7a Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:23:06 -0800 Subject: [PATCH 110/214] Fix surface userdata lifetime during async free --- Sources/GhosttyTerminalView.swift | 51 +++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index a040b3be..c3c369f7 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -227,6 +227,14 @@ func resolveTerminalOpenURLTarget(_ rawValue: String) -> TerminalOpenURLTarget? return .external(fallback) } +private final class GhosttySurfaceCallbackContext { + weak var surfaceView: GhosttyNSView? + + init(surfaceView: GhosttyNSView) { + self.surfaceView = surfaceView + } +} + // Minimal Ghostty wrapper for terminal rendering // This uses libghostty (GhosttyKit.xcframework) for actual terminal emulation @@ -425,8 +433,7 @@ class GhosttyApp { } runtimeConfig.read_clipboard_cb = { userdata, location, state in // Read clipboard - guard let userdata else { return } - let surfaceView = Unmanaged<GhosttyNSView>.fromOpaque(userdata).takeUnretainedValue() + guard let surfaceView = GhosttyApp.surfaceView(from: userdata) else { return } guard let surface = surfaceView.terminalSurface?.surface else { return } let pasteboard = GhosttyPasteboardHelper.pasteboard(for: location) @@ -437,8 +444,8 @@ class GhosttyApp { } } runtimeConfig.confirm_read_clipboard_cb = { userdata, content, state, _ in - guard let userdata, let content else { return } - let surfaceView = Unmanaged<GhosttyNSView>.fromOpaque(userdata).takeUnretainedValue() + guard let content else { return } + guard let surfaceView = GhosttyApp.surfaceView(from: userdata) else { return } guard let surface = surfaceView.terminalSurface?.surface else { return } ghostty_surface_complete_clipboard_request(surface, content, state, true) @@ -471,8 +478,7 @@ class GhosttyApp { } } runtimeConfig.close_surface_cb = { userdata, needsConfirmClose in - guard let userdata else { return } - let surfaceView = Unmanaged<GhosttyNSView>.fromOpaque(userdata).takeUnretainedValue() + guard let surfaceView = GhosttyApp.surfaceView(from: userdata) else { return } let callbackSurfaceId = surfaceView.terminalSurface?.id let callbackTabId = surfaceView.tabId @@ -870,6 +876,12 @@ class GhosttyApp { } } + private static func surfaceView(from userdata: UnsafeMutableRawPointer?) -> GhosttyNSView? { + guard let userdata else { return nil } + let context = Unmanaged<GhosttySurfaceCallbackContext>.fromOpaque(userdata).takeUnretainedValue() + return context.surfaceView + } + private func handleAction(target: ghostty_target_s, action: ghostty_action_s) -> Bool { if target.tag != GHOSTTY_TARGET_SURFACE { if action.tag == GHOSTTY_ACTION_RELOAD_CONFIG || @@ -947,8 +959,8 @@ class GhosttyApp { return false } - guard let userdata = ghostty_surface_userdata(target.target.surface) else { return false } - let surfaceView = Unmanaged<GhosttyNSView>.fromOpaque(userdata).takeUnretainedValue() + let surfaceView = Self.surfaceView(from: ghostty_surface_userdata(target.target.surface)) + guard let surfaceView else { return false } if action.tag == GHOSTTY_ACTION_RELOAD_CONFIG || action.tag == GHOSTTY_ACTION_CONFIG_CHANGE || action.tag == GHOSTTY_ACTION_COLOR_CHANGE { @@ -1381,6 +1393,7 @@ final class TerminalSurface: Identifiable, ObservableObject { private var pendingTextBytes: Int = 0 private let maxPendingTextBytes = 1_048_576 private var backgroundSurfaceStartQueued = false + private var surfaceCallbackContext: Unmanaged<GhosttySurfaceCallbackContext>? @Published var searchState: SearchState? = nil { didSet { if let searchState { @@ -1578,7 +1591,10 @@ final class TerminalSurface: Identifiable, ObservableObject { surfaceConfig.platform = ghostty_platform_u(macos: ghostty_platform_macos_s( nsview: Unmanaged.passUnretained(view).toOpaque() )) - surfaceConfig.userdata = Unmanaged.passUnretained(view).toOpaque() + let callbackContext = Unmanaged.passRetained(GhosttySurfaceCallbackContext(surfaceView: view)) + surfaceConfig.userdata = callbackContext.toOpaque() + surfaceCallbackContext?.release() + surfaceCallbackContext = callbackContext surfaceConfig.scale_factor = scaleFactors.layer surfaceConfig.context = surfaceContext var envVars: [ghostty_env_var_s] = [] @@ -1707,6 +1723,8 @@ final class TerminalSurface: Identifiable, ObservableObject { } if surface == nil { + surfaceCallbackContext?.release() + surfaceCallbackContext = nil print("Failed to create ghostty surface") #if DEBUG Self.surfaceLog("createSurface FAILED surface=\(id.uuidString): ghostty_surface_new returned nil") @@ -1947,11 +1965,20 @@ final class TerminalSurface: Identifiable, ObservableObject { } deinit { - guard let surface else { return } + let callbackContext = surfaceCallbackContext + surfaceCallbackContext = nil - // Defer teardown to the next main-actor turn so close callbacks can unwind first. - Task.detached { @MainActor in + guard let surface else { + callbackContext?.release() + return + } + + // Keep teardown asynchronous to avoid re-entrant close/deinit loops, but retain + // callback userdata until surface free completes so callbacks never dereference + // a deallocated view pointer. + Task { @MainActor in ghostty_surface_free(surface) + callbackContext?.release() } } } From 5d63c5f035ad23d051c1c81998602ce019071d3c Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:26:36 -0800 Subject: [PATCH 111/214] Add command palette (Cmd+Shift+P) (#358) Implements a VS Code-style command palette with fuzzy search, workspace/surface switching, rename mode, and keyboard navigation. Closes https://github.com/manaflow-ai/cmux/issues/133 --- Sources/AppDelegate.swift | 302 +- Sources/ContentView.swift | 3092 ++++++++++++++++- Sources/TabManager.swift | 15 +- Sources/TerminalController.swift | 322 +- Sources/cmuxApp.swift | 46 +- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 261 ++ cmuxTests/WorkspaceManualUnreadTests.swift | 331 ++ tests_v2/cmux.py | 21 + .../test_command_palette_backspace_go_back.py | 158 + tests_v2/test_command_palette_focus.py | 97 + ...mand_palette_focus_lock_workspace_spawn.py | 125 + .../test_command_palette_fuzzy_ranking.py | 133 + tests_v2/test_command_palette_modes.py | 194 ++ .../test_command_palette_navigation_keys.py | 143 + tests_v2/test_command_palette_rename_enter.py | 106 + .../test_command_palette_rename_select_all.py | 185 + ...test_command_palette_search_action_sync.py | 122 + ...command_palette_search_typing_stability.py | 121 + ..._switcher_cross_workspace_surface_focus.py | 172 + ...ommand_palette_switcher_renamed_surface.py | 160 + ...and_palette_switcher_surface_precedence.py | 155 + ...st_command_palette_switcher_type_labels.py | 127 + tests_v2/test_command_palette_window_scope.py | 99 + tests_v2/test_shortcut_window_scope.py | 107 + 24 files changed, 6581 insertions(+), 13 deletions(-) create mode 100644 tests_v2/test_command_palette_backspace_go_back.py create mode 100644 tests_v2/test_command_palette_focus.py create mode 100644 tests_v2/test_command_palette_focus_lock_workspace_spawn.py create mode 100644 tests_v2/test_command_palette_fuzzy_ranking.py create mode 100644 tests_v2/test_command_palette_modes.py create mode 100644 tests_v2/test_command_palette_navigation_keys.py create mode 100644 tests_v2/test_command_palette_rename_enter.py create mode 100644 tests_v2/test_command_palette_rename_select_all.py create mode 100644 tests_v2/test_command_palette_search_action_sync.py create mode 100644 tests_v2/test_command_palette_search_typing_stability.py create mode 100644 tests_v2/test_command_palette_switcher_cross_workspace_surface_focus.py create mode 100644 tests_v2/test_command_palette_switcher_renamed_surface.py create mode 100644 tests_v2/test_command_palette_switcher_surface_precedence.py create mode 100644 tests_v2/test_command_palette_switcher_type_labels.py create mode 100644 tests_v2/test_command_palette_window_scope.py create mode 100644 tests_v2/test_shortcut_window_scope.py diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index f9003b88..419276d6 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -103,12 +103,57 @@ func browserOmnibarShouldSubmitOnReturn(flags: NSEvent.ModifierFlags) -> Bool { return normalizedFlags == [] || normalizedFlags == [.shift] } +func commandPaletteSelectionDeltaForKeyboardNavigation( + flags: NSEvent.ModifierFlags, + chars: String, + keyCode: UInt16 +) -> Int? { + let normalizedFlags = flags + .intersection(.deviceIndependentFlagsMask) + .subtracting([.numericPad, .function]) + let normalizedChars = chars.lowercased() + + if normalizedFlags == [] { + switch keyCode { + case 125: return 1 // Down arrow + case 126: return -1 // Up arrow + default: break + } + } + + if normalizedFlags == [.control] { + // Control modifiers can surface as either printable chars or ASCII control chars. + if keyCode == 45 || normalizedChars == "n" || normalizedChars == "\u{0e}" { return 1 } // Ctrl+N + if keyCode == 35 || normalizedChars == "p" || normalizedChars == "\u{10}" { return -1 } // Ctrl+P + if keyCode == 38 || normalizedChars == "j" || normalizedChars == "\u{0a}" { return 1 } // Ctrl+J + if keyCode == 40 || normalizedChars == "k" || normalizedChars == "\u{0b}" { return -1 } // Ctrl+K + } + + return nil +} + enum BrowserZoomShortcutAction: Equatable { case zoomIn case zoomOut case reset } +struct CommandPaletteDebugResultRow { + let commandId: String + let title: String + let shortcutHint: String? + let trailingLabel: String? + let score: Int +} + +struct CommandPaletteDebugSnapshot { + let query: String + let mode: String + let results: [CommandPaletteDebugResultRow] + + static let empty = CommandPaletteDebugSnapshot(query: "", mode: "commands", results: []) +} + func browserZoomShortcutAction( flags: NSEvent.ModifierFlags, chars: String, @@ -337,6 +382,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent private var mainWindowContexts: [ObjectIdentifier: MainWindowContext] = [:] private var mainWindowControllers: [MainWindowController] = [] + private var commandPaletteVisibilityByWindowId: [UUID: Bool] = [:] + private var commandPaletteSelectionByWindowId: [UUID: Int] = [:] + private var commandPaletteSnapshotByWindowId: [UUID: CommandPaletteDebugSnapshot] = [:] var updateViewModel: UpdateViewModel { updateController.viewModel @@ -563,6 +611,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent self.unregisterMainWindow(closing) } } + commandPaletteVisibilityByWindowId[windowId] = false + commandPaletteSelectionByWindowId[windowId] = 0 + commandPaletteSnapshotByWindowId[windowId] = .empty if window.isKeyWindow { setActiveMainWindow(window) @@ -599,6 +650,111 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent mainWindowContexts.values.first(where: { $0.tabManager === tabManager })?.windowId } + func mainWindow(for windowId: UUID) -> NSWindow? { + windowForMainWindowId(windowId) + } + + func setCommandPaletteVisible(_ visible: Bool, for window: NSWindow) { + guard let windowId = mainWindowId(for: window) else { return } + commandPaletteVisibilityByWindowId[windowId] = visible + } + + func isCommandPaletteVisible(windowId: UUID) -> Bool { + commandPaletteVisibilityByWindowId[windowId] ?? false + } + + func setCommandPaletteSelectionIndex(_ index: Int, for window: NSWindow) { + guard let windowId = mainWindowId(for: window) else { return } + commandPaletteSelectionByWindowId[windowId] = max(0, index) + } + + func commandPaletteSelectionIndex(windowId: UUID) -> Int { + commandPaletteSelectionByWindowId[windowId] ?? 0 + } + + func setCommandPaletteSnapshot(_ snapshot: CommandPaletteDebugSnapshot, for window: NSWindow) { + guard let windowId = mainWindowId(for: window) else { return } + commandPaletteSnapshotByWindowId[windowId] = snapshot + } + + func commandPaletteSnapshot(windowId: UUID) -> CommandPaletteDebugSnapshot { + commandPaletteSnapshotByWindowId[windowId] ?? .empty + } + + func isCommandPaletteVisible(for window: NSWindow) -> Bool { + guard let windowId = mainWindowId(for: window) else { return false } + return commandPaletteVisibilityByWindowId[windowId] ?? false + } + + func shouldBlockFirstResponderChangeWhileCommandPaletteVisible( + window: NSWindow, + responder: NSResponder? + ) -> Bool { + guard isCommandPaletteVisible(for: window) else { return false } + guard let responder else { return false } + guard !isCommandPaletteResponder(responder) else { return false } + return isFocusStealingResponderWhileCommandPaletteVisible(responder) + } + + private func isCommandPaletteResponder(_ responder: NSResponder) -> Bool { + if let textView = responder as? NSTextView, textView.isFieldEditor { + if let delegateView = textView.delegate as? NSView { + return isInsideCommandPaletteOverlay(delegateView) + } + // SwiftUI can attach a non-view delegate to TextField editors. + // When command palette is visible, its search/rename editor is the + // only expected field editor inside the main window. + return true + } + if let view = responder as? NSView { + return isInsideCommandPaletteOverlay(view) + } + return false + } + + private func isFocusStealingResponderWhileCommandPaletteVisible(_ responder: NSResponder) -> Bool { + if responder is GhosttyNSView || responder is WKWebView { + return true + } + + if let textView = responder as? NSTextView, + !textView.isFieldEditor, + let delegateView = textView.delegate as? NSView { + return isTerminalOrBrowserView(delegateView) + } + + if let view = responder as? NSView { + return isTerminalOrBrowserView(view) + } + + return false + } + + private func isTerminalOrBrowserView(_ view: NSView) -> Bool { + if view is GhosttyNSView || view is WKWebView { + return true + } + var current: NSView? = view.superview + while let candidate = current { + if candidate is GhosttyNSView || candidate is WKWebView { + return true + } + current = candidate.superview + } + return false + } + + private func isInsideCommandPaletteOverlay(_ view: NSView) -> Bool { + var current: NSView? = view + while let candidate = current { + if candidate.identifier == commandPaletteOverlayContainerIdentifier { + return true + } + current = candidate.superview + } + return false + } + func locateSurface(surfaceId: UUID) -> (windowId: UUID, workspaceId: UUID, tabManager: TabManager)? { for ctx in mainWindowContexts.values { for ws in ctx.tabManager.tabs { @@ -656,6 +812,99 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return NSApp.windows.first(where: { $0.identifier?.rawValue == expectedIdentifier }) } + private func mainWindowId(for window: NSWindow) -> UUID? { + if let context = mainWindowContexts[ObjectIdentifier(window)] { + return context.windowId + } + guard let rawIdentifier = window.identifier?.rawValue, + rawIdentifier.hasPrefix("cmux.main.") else { return nil } + let idPart = String(rawIdentifier.dropFirst("cmux.main.".count)) + return UUID(uuidString: idPart) + } + + private func activeCommandPaletteWindow() -> NSWindow? { + if let keyWindow = NSApp.keyWindow, + let windowId = mainWindowId(for: keyWindow), + commandPaletteVisibilityByWindowId[windowId] == true { + return keyWindow + } + if let mainWindow = NSApp.mainWindow, + let windowId = mainWindowId(for: mainWindow), + commandPaletteVisibilityByWindowId[windowId] == true { + return mainWindow + } + if let visibleWindowId = commandPaletteVisibilityByWindowId.first(where: { $0.value })?.key { + return windowForMainWindowId(visibleWindowId) + } + return nil + } + + private func contextForMainWindow(_ window: NSWindow?) -> MainWindowContext? { + guard let window, isMainTerminalWindow(window) else { return nil } + return mainWindowContexts[ObjectIdentifier(window)] + } + + private func preferredMainWindowContextForShortcuts(event: NSEvent) -> MainWindowContext? { + if let context = contextForMainWindow(event.window) { + return context + } + if let context = contextForMainWindow(NSApp.keyWindow) { + return context + } + if let context = contextForMainWindow(NSApp.mainWindow) { + return context + } + return mainWindowContexts.values.first + } + + private func activateMainWindowContextForShortcutEvent(_ event: NSEvent) { + guard let context = preferredMainWindowContextForShortcuts(event: event), + let window = context.window ?? windowForMainWindowId(context.windowId) else { return } + setActiveMainWindow(window) + } + + @discardableResult + func toggleSidebarInActiveMainWindow() -> Bool { + if let activeManager = tabManager, + let activeContext = mainWindowContexts.values.first(where: { $0.tabManager === activeManager }) { + if let window = activeContext.window ?? windowForMainWindowId(activeContext.windowId) { + setActiveMainWindow(window) + } + activeContext.sidebarState.toggle() + return true + } + if let keyContext = contextForMainWindow(NSApp.keyWindow) { + if let window = keyContext.window ?? windowForMainWindowId(keyContext.windowId) { + setActiveMainWindow(window) + } + keyContext.sidebarState.toggle() + return true + } + if let mainContext = contextForMainWindow(NSApp.mainWindow) { + if let window = mainContext.window ?? windowForMainWindowId(mainContext.windowId) { + setActiveMainWindow(window) + } + mainContext.sidebarState.toggle() + return true + } + if let fallbackContext = mainWindowContexts.values.first { + if let window = fallbackContext.window ?? windowForMainWindowId(fallbackContext.windowId) { + setActiveMainWindow(window) + } + fallbackContext.sidebarState.toggle() + return true + } + if let sidebarState { + sidebarState.toggle() + return true + } + return false + } + + func sidebarVisibility(windowId: UUID) -> Bool? { + mainWindowContexts.values.first(where: { $0.windowId == windowId })?.sidebarState.isVisible + } + @objc func openNewMainWindow(_ sender: Any?) { _ = createMainWindow() } @@ -1865,7 +2114,36 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return false } - let normalizedFlags = flags.subtracting([.numericPad, .function]) + let normalizedFlags = flags.subtracting([.numericPad, .function, .capsLock]) + + if let delta = commandPaletteSelectionDeltaForKeyboardNavigation( + flags: event.modifierFlags, + chars: chars, + keyCode: event.keyCode + ), + let paletteWindow = activeCommandPaletteWindow() { + NotificationCenter.default.post( + name: .commandPaletteMoveSelection, + object: paletteWindow, + userInfo: ["delta": delta] + ) + return true + } + + let isCommandP = normalizedFlags == [.command] && (chars == "p" || event.keyCode == 35) + if isCommandP { + let targetWindow = activeCommandPaletteWindow() ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow + NotificationCenter.default.post(name: .commandPaletteSwitcherRequested, object: targetWindow) + return true + } + + let isCommandShiftP = normalizedFlags == [.command, .shift] && (chars == "p" || event.keyCode == 35) + if isCommandShiftP { + let targetWindow = activeCommandPaletteWindow() ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow + NotificationCenter.default.post(name: .commandPaletteRequested, object: targetWindow) + return true + } + if normalizedFlags == [.command], chars == "q" { return handleQuitShortcutWarning() } @@ -1895,6 +2173,10 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } + // Route all shortcut handling through the window that actually produced + // the event to avoid cross-window actions when app-global pointers are stale. + activateMainWindowContextForShortcutEvent(event) + // Keep keyboard routing deterministic after split close/reparent transitions: // before processing shortcuts, converge first responder with the focused terminal panel. if isControlD { @@ -1942,7 +2224,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent // Primary UI shortcuts if matchShortcut(event: event, shortcut: KeyboardShortcutSettings.shortcut(for: .toggleSidebar)) { - sidebarState?.toggle() + _ = toggleSidebarInActiveMainWindow() return true } @@ -2926,6 +3208,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent private func unregisterMainWindow(_ window: NSWindow) { let key = ObjectIdentifier(window) guard let removed = mainWindowContexts.removeValue(forKey: key) else { return } + commandPaletteVisibilityByWindowId.removeValue(forKey: removed.windowId) + commandPaletteSelectionByWindowId.removeValue(forKey: removed.windowId) + commandPaletteSnapshotByWindowId.removeValue(forKey: removed.windowId) // Avoid stale notifications that can no longer be opened once the owning window is gone. if let store = notificationStore { @@ -3873,6 +4158,19 @@ private var cmuxFirstResponderGuardHitViewOverride: NSView? private extension NSWindow { @objc func cmux_makeFirstResponder(_ responder: NSResponder?) -> Bool { + if AppDelegate.shared?.shouldBlockFirstResponderChangeWhileCommandPaletteVisible( + window: self, + responder: responder + ) == true { +#if DEBUG + dlog( + "focus.guard commandPaletteBlocked responder=\(String(describing: responder.map { type(of: $0) })) " + + "window=\(ObjectIdentifier(self))" + ) +#endif + return false + } + if let responder, let webView = Self.cmuxOwningWebView(for: responder), !webView.allowsFirstResponderAcquisitionEffective { diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 7a8cb326..8359f265 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -718,6 +718,272 @@ final class FileDropOverlayView: NSView { } var fileDropOverlayKey: UInt8 = 0 +private var commandPaletteWindowOverlayKey: UInt8 = 0 +let commandPaletteOverlayContainerIdentifier = NSUserInterfaceItemIdentifier("cmux.commandPalette.overlay.container") + +@MainActor +private final class CommandPaletteOverlayContainerView: NSView { + var capturesMouseEvents = false + + override var isOpaque: Bool { false } + override var acceptsFirstResponder: Bool { true } + + override func hitTest(_ point: NSPoint) -> NSView? { + guard capturesMouseEvents else { return nil } + return super.hitTest(point) + } +} + +@MainActor +private final class WindowCommandPaletteOverlayController: NSObject { + private weak var window: NSWindow? + private let containerView = CommandPaletteOverlayContainerView(frame: .zero) + private let hostingView = NSHostingView(rootView: AnyView(EmptyView())) + private var installConstraints: [NSLayoutConstraint] = [] + private weak var installedThemeFrame: NSView? + private var focusLockTimer: DispatchSourceTimer? + private var scheduledFocusWorkItem: DispatchWorkItem? + + init(window: NSWindow) { + self.window = window + super.init() + containerView.translatesAutoresizingMaskIntoConstraints = false + containerView.wantsLayer = true + containerView.layer?.backgroundColor = NSColor.clear.cgColor + containerView.isHidden = true + containerView.alphaValue = 0 + containerView.capturesMouseEvents = false + containerView.identifier = commandPaletteOverlayContainerIdentifier + hostingView.translatesAutoresizingMaskIntoConstraints = false + hostingView.wantsLayer = true + hostingView.layer?.backgroundColor = NSColor.clear.cgColor + containerView.addSubview(hostingView) + NSLayoutConstraint.activate([ + hostingView.topAnchor.constraint(equalTo: containerView.topAnchor), + hostingView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), + hostingView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), + hostingView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), + ]) + _ = ensureInstalled() + } + + @discardableResult + private func ensureInstalled() -> Bool { + guard let window, + let contentView = window.contentView, + let themeFrame = contentView.superview else { return false } + + if containerView.superview !== themeFrame { + NSLayoutConstraint.deactivate(installConstraints) + installConstraints.removeAll() + containerView.removeFromSuperview() + themeFrame.addSubview(containerView, positioned: .above, relativeTo: nil) + installConstraints = [ + containerView.topAnchor.constraint(equalTo: contentView.topAnchor), + containerView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), + containerView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), + containerView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), + ] + NSLayoutConstraint.activate(installConstraints) + installedThemeFrame = themeFrame + } else if themeFrame.subviews.last !== containerView { + themeFrame.addSubview(containerView, positioned: .above, relativeTo: nil) + } + + return true + } + + private func isPaletteResponder(_ responder: NSResponder?) -> Bool { + guard let responder else { return false } + + if let view = responder as? NSView, view.isDescendant(of: containerView) { + return true + } + + if let textView = responder as? NSTextView { + if let delegateView = textView.delegate as? NSView, + delegateView.isDescendant(of: containerView) { + return true + } + } + + return false + } + + private func isPaletteFieldEditor(_ textView: NSTextView) -> Bool { + guard textView.isFieldEditor else { return false } + + if let delegateView = textView.delegate as? NSView, + delegateView.isDescendant(of: containerView) { + return true + } + + // SwiftUI text fields can keep a field editor delegate that isn't an NSView. + // Fall back to validating editor ownership from the mounted palette text field. + if let textField = firstEditableTextField(in: hostingView), + textField.currentEditor() === textView { + return true + } + + return false + } + + private func isPaletteTextInputFirstResponder(_ responder: NSResponder?) -> Bool { + guard let responder else { return false } + + if let textView = responder as? NSTextView { + return isPaletteFieldEditor(textView) + } + + if let textField = responder as? NSTextField { + return textField.isDescendant(of: containerView) + } + + return false + } + + private func firstEditableTextField(in view: NSView) -> NSTextField? { + if let textField = view as? NSTextField, + textField.isEditable, + textField.isEnabled, + !textField.isHiddenOrHasHiddenAncestor { + return textField + } + + for subview in view.subviews { + if let match = firstEditableTextField(in: subview) { + return match + } + } + return nil + } + + private func scheduleFocusIntoPalette(retries: Int = 4) { + scheduledFocusWorkItem?.cancel() + let workItem = DispatchWorkItem { [weak self] in + self?.scheduledFocusWorkItem = nil + self?.focusIntoPalette(retries: retries) + } + scheduledFocusWorkItem = workItem + DispatchQueue.main.async(execute: workItem) + } + + private func focusIntoPalette(retries: Int) { + guard let window else { return } + if isPaletteTextInputFirstResponder(window.firstResponder) { + return + } + + if let textField = firstEditableTextField(in: hostingView), + window.makeFirstResponder(textField), + isPaletteTextInputFirstResponder(window.firstResponder) { + normalizeSelectionAfterProgrammaticFocus() + return + } + + if window.makeFirstResponder(containerView) { + if let textField = firstEditableTextField(in: hostingView), + window.makeFirstResponder(textField), + isPaletteTextInputFirstResponder(window.firstResponder) { + normalizeSelectionAfterProgrammaticFocus() + return + } + } + + guard retries > 0 else { return } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.02) { [weak self] in + self?.focusIntoPalette(retries: retries - 1) + } + } + + private func startFocusLockTimer() { + guard focusLockTimer == nil else { return } + let timer = DispatchSource.makeTimerSource(queue: .main) + timer.schedule(deadline: .now(), repeating: .milliseconds(80), leeway: .milliseconds(12)) + timer.setEventHandler { [weak self] in + guard let self else { return } + guard let window = self.window else { + self.stopFocusLockTimer() + return + } + if self.isPaletteTextInputFirstResponder(window.firstResponder) { + return + } + self.focusIntoPalette(retries: 1) + } + focusLockTimer = timer + timer.resume() + } + + private func stopFocusLockTimer() { + focusLockTimer?.cancel() + focusLockTimer = nil + scheduledFocusWorkItem?.cancel() + scheduledFocusWorkItem = nil + } + + private func normalizeSelectionAfterProgrammaticFocus() { + guard let window, + let editor = window.firstResponder as? NSTextView, + editor.isFieldEditor else { return } + + let text = editor.string + let length = (text as NSString).length + let selection = editor.selectedRange() + guard length > 0 else { return } + guard selection.location == 0, selection.length == length else { return } + + // Keep commands-mode prefix semantics stable after focus re-assertions: + // if AppKit selected the entire query (e.g. ">foo"), restore caret-at-end + // so the next keystroke appends instead of replacing and switching modes. + guard text.hasPrefix(">") else { return } + editor.setSelectedRange(NSRange(location: length, length: 0)) + } + + func update(rootView: AnyView, isVisible: Bool) { + guard ensureInstalled() else { return } + if isVisible { + hostingView.rootView = rootView + containerView.capturesMouseEvents = true + containerView.isHidden = false + containerView.alphaValue = 1 + if let themeFrame = installedThemeFrame, themeFrame.subviews.last !== containerView { + themeFrame.addSubview(containerView, positioned: .above, relativeTo: nil) + } + startFocusLockTimer() + if let window, !isPaletteTextInputFirstResponder(window.firstResponder) { + scheduleFocusIntoPalette(retries: 8) + } + } else { + stopFocusLockTimer() + if let window, isPaletteResponder(window.firstResponder) { + _ = window.makeFirstResponder(nil) + } + hostingView.rootView = AnyView(EmptyView()) + containerView.capturesMouseEvents = false + containerView.alphaValue = 0 + containerView.isHidden = true + } + } +} + +@MainActor +private func commandPaletteWindowOverlayController(for window: NSWindow) -> WindowCommandPaletteOverlayController { + if let existing = objc_getAssociatedObject(window, &commandPaletteWindowOverlayKey) as? WindowCommandPaletteOverlayController { + return existing + } + let controller = WindowCommandPaletteOverlayController(window: window) + objc_setAssociatedObject(window, &commandPaletteWindowOverlayKey, controller, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + return controller +} + +private struct CommandPaletteRowFramePreferenceKey: PreferenceKey { + static var defaultValue: [Int: CGRect] = [:] + + static func reduce(value: inout [Int: CGRect], nextValue: () -> [Int: CGRect]) { + value.merge(nextValue(), uniquingKeysWith: { _, rhs in rhs }) + } +} enum WorkspaceMountPolicy { // Keep only the selected workspace mounted to minimize layer-tree traversal. @@ -848,11 +1114,226 @@ struct ContentView: View { @State private var isResizerBandActive = false @State private var isSidebarResizerCursorActive = false @State private var sidebarResizerCursorStabilizer: DispatchSourceTimer? + @State private var isCommandPalettePresented = false + @State private var commandPaletteQuery: String = "" + @State private var commandPaletteMode: CommandPaletteMode = .commands + @State private var commandPaletteRenameDraft: String = "" + @State private var commandPaletteSelectedResultIndex: Int = 0 + @State private var commandPaletteHoveredResultIndex: Int? + @State private var commandPaletteLastSelectionIndex: Int = 0 + @State private var commandPaletteRowFrames: [Int: CGRect] = [:] + @State private var commandPaletteRestoreFocusTarget: CommandPaletteRestoreFocusTarget? + @State private var commandPaletteUsageHistoryByCommandId: [String: CommandPaletteUsageEntry] = [:] + @AppStorage(CommandPaletteRenameSelectionSettings.selectAllOnFocusKey) + private var commandPaletteRenameSelectAllOnFocus = CommandPaletteRenameSelectionSettings.defaultSelectAllOnFocus + @FocusState private var isCommandPaletteSearchFocused: Bool + @FocusState private var isCommandPaletteRenameFocused: Bool + + private enum CommandPaletteMode { + case commands + case renameInput(CommandPaletteRenameTarget) + case renameConfirm(CommandPaletteRenameTarget, proposedName: String) + } + + private enum CommandPaletteListScope: String { + case commands + case switcher + } + + private struct CommandPaletteRenameTarget: Equatable { + enum Kind: Equatable { + case workspace(workspaceId: UUID) + case tab(workspaceId: UUID, panelId: UUID) + } + + let kind: Kind + let currentName: String + + var title: String { + switch kind { + case .workspace: + return "Rename Workspace" + case .tab: + return "Rename Tab" + } + } + + var description: String { + switch kind { + case .workspace: + return "Choose a custom workspace name." + case .tab: + return "Choose a custom tab name." + } + } + + var placeholder: String { + switch kind { + case .workspace: + return "Workspace name" + case .tab: + return "Tab name" + } + } + } + + private struct CommandPaletteRestoreFocusTarget { + let workspaceId: UUID + let panelId: UUID + } + + private enum CommandPaletteInputFocusTarget { + case search + case rename + } + + private enum CommandPaletteTextSelectionBehavior { + case caretAtEnd + case selectAll + } + + private enum CommandPaletteTrailingLabelStyle { + case shortcut + case kind + } + + enum CommandPaletteScrollAnchor: Equatable { + case top + case bottom + } + + private struct CommandPaletteTrailingLabel { + let text: String + let style: CommandPaletteTrailingLabelStyle + } + + private struct CommandPaletteInputFocusPolicy { + let focusTarget: CommandPaletteInputFocusTarget + let selectionBehavior: CommandPaletteTextSelectionBehavior + + static let search = CommandPaletteInputFocusPolicy( + focusTarget: .search, + selectionBehavior: .caretAtEnd + ) + } + + private struct CommandPaletteCommand: Identifiable { + let id: String + let rank: Int + let title: String + let subtitle: String + let shortcutHint: String? + let keywords: [String] + let dismissOnRun: Bool + let action: () -> Void + + var searchableTexts: [String] { + [title, subtitle] + keywords + } + } + + private struct CommandPaletteUsageEntry: Codable { + var useCount: Int + var lastUsedAt: TimeInterval + } + + private struct CommandPaletteContextSnapshot { + private var boolValues: [String: Bool] = [:] + private var stringValues: [String: String] = [:] + + mutating func setBool(_ key: String, _ value: Bool) { + boolValues[key] = value + } + + mutating func setString(_ key: String, _ value: String?) { + guard let value, !value.isEmpty else { + stringValues.removeValue(forKey: key) + return + } + stringValues[key] = value + } + + func bool(_ key: String) -> Bool { + boolValues[key] ?? false + } + + func string(_ key: String) -> String? { + stringValues[key] + } + } + + private enum CommandPaletteContextKeys { + static let hasWorkspace = "workspace.hasSelection" + static let workspaceName = "workspace.name" + static let workspaceHasCustomName = "workspace.hasCustomName" + static let workspaceShouldPin = "workspace.shouldPin" + + static let hasFocusedPanel = "panel.hasFocus" + static let panelName = "panel.name" + static let panelIsBrowser = "panel.isBrowser" + static let panelIsTerminal = "panel.isTerminal" + static let panelHasCustomName = "panel.hasCustomName" + static let panelShouldPin = "panel.shouldPin" + static let panelHasUnread = "panel.hasUnread" + } + + private struct CommandPaletteCommandContribution { + let commandId: String + let title: (CommandPaletteContextSnapshot) -> String + let subtitle: (CommandPaletteContextSnapshot) -> String + let shortcutHint: String? + let keywords: [String] + let dismissOnRun: Bool + let when: (CommandPaletteContextSnapshot) -> Bool + let enablement: (CommandPaletteContextSnapshot) -> Bool + + init( + commandId: String, + title: @escaping (CommandPaletteContextSnapshot) -> String, + subtitle: @escaping (CommandPaletteContextSnapshot) -> String, + shortcutHint: String? = nil, + keywords: [String] = [], + dismissOnRun: Bool = true, + when: @escaping (CommandPaletteContextSnapshot) -> Bool = { _ in true }, + enablement: @escaping (CommandPaletteContextSnapshot) -> Bool = { _ in true } + ) { + self.commandId = commandId + self.title = title + self.subtitle = subtitle + self.shortcutHint = shortcutHint + self.keywords = keywords + self.dismissOnRun = dismissOnRun + self.when = when + self.enablement = enablement + } + } + + private struct CommandPaletteHandlerRegistry { + private var handlers: [String: () -> Void] = [:] + + mutating func register(commandId: String, handler: @escaping () -> Void) { + handlers[commandId] = handler + } + + func handler(for commandId: String) -> (() -> Void)? { + handlers[commandId] + } + } + + private struct CommandPaletteSearchResult: Identifiable { + let command: CommandPaletteCommand + let score: Int + let titleMatchIndices: Set<Int> + + var id: String { command.id } + } private static let fixedSidebarResizeCursor = NSCursor( image: NSCursor.resizeLeftRight.image, hotSpot: NSCursor.resizeLeftRight.hotSpot ) + private static let commandPaletteUsageDefaultsKey = "commandPalette.commandUsage.v1" + private static let commandPaletteCommandsPrefix = ">" private enum SidebarResizerHandle: Hashable { case divider @@ -1193,7 +1674,7 @@ struct ContentView: View { TitlebarControlsView( notificationStore: TerminalNotificationStore.shared, viewModel: fullscreenControlsViewModel, - onToggleSidebar: { AppDelegate.shared?.sidebarState?.toggle() }, + onToggleSidebar: { sidebarState.toggle() }, onToggleNotifications: { [fullscreenControlsViewModel] in AppDelegate.shared?.toggleNotificationsPopover( animated: true, @@ -1367,6 +1848,7 @@ struct ContentView: View { var body: some View { var view = AnyView( contentAndSidebarLayout + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) .overlay(alignment: .topLeading) { if isFullScreen && sidebarState.isVisible { fullscreenControls @@ -1496,6 +1978,97 @@ struct ContentView: View { #endif }) + view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: .commandPaletteToggleRequested)) { notification in + let requestedWindow = notification.object as? NSWindow + guard Self.shouldHandleCommandPaletteRequest( + observedWindow: observedWindow, + requestedWindow: requestedWindow, + keyWindow: NSApp.keyWindow, + mainWindow: NSApp.mainWindow + ) else { return } + toggleCommandPalette() + }) + + view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: .commandPaletteRequested)) { notification in + let requestedWindow = notification.object as? NSWindow + guard Self.shouldHandleCommandPaletteRequest( + observedWindow: observedWindow, + requestedWindow: requestedWindow, + keyWindow: NSApp.keyWindow, + mainWindow: NSApp.mainWindow + ) else { return } + openCommandPaletteCommands() + }) + + view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: .commandPaletteSwitcherRequested)) { notification in + let requestedWindow = notification.object as? NSWindow + guard Self.shouldHandleCommandPaletteRequest( + observedWindow: observedWindow, + requestedWindow: requestedWindow, + keyWindow: NSApp.keyWindow, + mainWindow: NSApp.mainWindow + ) else { return } + openCommandPaletteSwitcher() + }) + + view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: .commandPaletteRenameTabRequested)) { notification in + let requestedWindow = notification.object as? NSWindow + guard Self.shouldHandleCommandPaletteRequest( + observedWindow: observedWindow, + requestedWindow: requestedWindow, + keyWindow: NSApp.keyWindow, + mainWindow: NSApp.mainWindow + ) else { return } + openCommandPaletteRenameTabInput() + }) + + view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: .commandPaletteMoveSelection)) { notification in + guard isCommandPalettePresented else { return } + guard case .commands = commandPaletteMode else { return } + let requestedWindow = notification.object as? NSWindow + guard Self.shouldHandleCommandPaletteRequest( + observedWindow: observedWindow, + requestedWindow: requestedWindow, + keyWindow: NSApp.keyWindow, + mainWindow: NSApp.mainWindow + ) else { return } + guard let delta = notification.userInfo?["delta"] as? Int, delta != 0 else { return } + moveCommandPaletteSelection(by: delta) + }) + + view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: .commandPaletteRenameInputInteractionRequested)) { notification in + guard isCommandPalettePresented else { return } + guard case .renameInput = commandPaletteMode else { return } + let requestedWindow = notification.object as? NSWindow + guard Self.shouldHandleCommandPaletteRequest( + observedWindow: observedWindow, + requestedWindow: requestedWindow, + keyWindow: NSApp.keyWindow, + mainWindow: NSApp.mainWindow + ) else { return } + handleCommandPaletteRenameInputInteraction() + }) + + view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: .commandPaletteRenameInputDeleteBackwardRequested)) { notification in + guard isCommandPalettePresented else { return } + guard case .renameInput = commandPaletteMode else { return } + let requestedWindow = notification.object as? NSWindow + guard Self.shouldHandleCommandPaletteRequest( + observedWindow: observedWindow, + requestedWindow: requestedWindow, + keyWindow: NSApp.keyWindow, + mainWindow: NSApp.mainWindow + ) else { return } + _ = handleCommandPaletteRenameDeleteBackward(modifiers: []) + }) + + view = AnyView(view.background(WindowAccessor(dedupeByWindow: false) { window in + MainActor.assumeIsolated { + let overlayController = commandPaletteWindowOverlayController(for: window) + overlayController.update(rootView: AnyView(commandPaletteOverlay), isVisible: isCommandPalettePresented) + } + })) + view = AnyView(view.onChange(of: bgGlassTintHex) { _ in updateWindowGlassTint() }) @@ -1547,6 +2120,7 @@ struct ContentView: View { DispatchQueue.main.async { observedWindow = window isFullScreen = window.styleMask.contains(.fullScreen) + syncCommandPaletteDebugStateForObservedWindow() installSidebarResizerPointerMonitorIfNeeded() updateSidebarResizerBandState() } @@ -1748,6 +2322,1956 @@ struct ContentView: View { #endif } + private var commandPaletteOverlay: some View { + GeometryReader { proxy in + let maxAllowedWidth = max(340, proxy.size.width - 260) + let targetWidth = min(560, maxAllowedWidth) + + ZStack(alignment: .top) { + Color.clear + .ignoresSafeArea() + .contentShape(Rectangle()) + .onTapGesture { + dismissCommandPalette() + } + + VStack(spacing: 0) { + switch commandPaletteMode { + case .commands: + commandPaletteCommandListView + case .renameInput(let target): + commandPaletteRenameInputView(target: target) + case let .renameConfirm(target, proposedName): + commandPaletteRenameConfirmView(target: target, proposedName: proposedName) + } + } + .frame(width: targetWidth) + .background( + RoundedRectangle(cornerRadius: 8, style: .continuous) + .fill(Color(nsColor: .windowBackgroundColor).opacity(0.98)) + ) + .overlay( + RoundedRectangle(cornerRadius: 8, style: .continuous) + .stroke(Color(nsColor: .separatorColor).opacity(0.7), lineWidth: 1) + ) + .shadow(color: Color.black.opacity(0.24), radius: 10, x: 0, y: 5) + .padding(.top, 40) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + .onExitCommand { + dismissCommandPalette() + } + .zIndex(2000) + } + + private var commandPaletteCommandListView: some View { + let visibleResults = Array(commandPaletteResults) + let selectedIndex = commandPaletteSelectedIndex(resultCount: visibleResults.count) + let commandPaletteListMaxHeight: CGFloat = 216 + let commandPaletteRowHeight: CGFloat = 24 + let commandPaletteEmptyStateHeight: CGFloat = 44 + let commandPaletteListContentHeight = visibleResults.isEmpty + ? commandPaletteEmptyStateHeight + : CGFloat(visibleResults.count) * commandPaletteRowHeight + let commandPaletteListHeight = min(commandPaletteListMaxHeight, commandPaletteListContentHeight) + return VStack(spacing: 0) { + HStack(spacing: 8) { + TextField(commandPaletteSearchPlaceholder, text: $commandPaletteQuery) + .textFieldStyle(.plain) + .font(.system(size: 13, weight: .regular)) + .tint(.blue) + .focused($isCommandPaletteSearchFocused) + .onSubmit { + runSelectedCommandPaletteResult(visibleResults: visibleResults) + } + .backport.onKeyPress(.downArrow) { _ in + moveCommandPaletteSelection(by: 1) + return .handled + } + .backport.onKeyPress(.upArrow) { _ in + moveCommandPaletteSelection(by: -1) + return .handled + } + .backport.onKeyPress("n") { modifiers in + handleCommandPaletteControlNavigationKey(modifiers: modifiers, delta: 1) + } + .backport.onKeyPress("p") { modifiers in + handleCommandPaletteControlNavigationKey(modifiers: modifiers, delta: -1) + } + .backport.onKeyPress("j") { modifiers in + handleCommandPaletteControlNavigationKey(modifiers: modifiers, delta: 1) + } + .backport.onKeyPress("k") { modifiers in + handleCommandPaletteControlNavigationKey(modifiers: modifiers, delta: -1) + } + + } + .padding(.horizontal, 9) + .padding(.vertical, 7) + + Divider() + + ScrollViewReader { proxy in + ScrollView { + LazyVStack(spacing: 0) { + if visibleResults.isEmpty { + Text(commandPaletteEmptyStateText) + .font(.system(size: 13, weight: .regular)) + .foregroundStyle(.secondary) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 12) + .padding(.vertical, 12) + } else { + ForEach(Array(visibleResults.enumerated()), id: \.element.id) { index, result in + let isSelected = index == selectedIndex + let isHovered = commandPaletteHoveredResultIndex == index + let rowBackground: Color = isSelected + ? Color.accentColor.opacity(0.12) + : (isHovered ? Color.primary.opacity(0.08) : .clear) + + Button { + runCommandPaletteCommand(result.command) + } label: { + HStack(spacing: 8) { + commandPaletteHighlightedTitleText( + result.command.title, + matchedIndices: result.titleMatchIndices + ) + .font(.system(size: 13, weight: .regular)) + .lineLimit(1) + Spacer() + + if let trailingLabel = commandPaletteTrailingLabel(for: result.command) { + switch trailingLabel.style { + case .shortcut: + Text(trailingLabel.text) + .font(.system(size: 11, weight: .medium)) + .foregroundStyle(.secondary) + .padding(.horizontal, 4) + .padding(.vertical, 1) + .background(Color.primary.opacity(0.08), in: RoundedRectangle(cornerRadius: 4, style: .continuous)) + case .kind: + Text(trailingLabel.text) + .font(.system(size: 11, weight: .regular)) + .foregroundStyle(.secondary) + .lineLimit(1) + } + } + } + .padding(.horizontal, 9) + .padding(.vertical, 2) + .frame(maxWidth: .infinity, alignment: .leading) + .background(rowBackground) + .background( + GeometryReader { geometry in + Color.clear.preference( + key: CommandPaletteRowFramePreferenceKey.self, + value: [index: geometry.frame(in: .named("commandPaletteListScroll"))] + ) + } + ) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .id(index) + .onHover { hovering in + if hovering { + commandPaletteHoveredResultIndex = index + } else if commandPaletteHoveredResultIndex == index { + commandPaletteHoveredResultIndex = nil + } + } + } + } + } + // Force a fresh row tree per query so rendered labels/actions stay in lockstep. + .id(commandPaletteQuery) + } + .coordinateSpace(name: "commandPaletteListScroll") + .frame(height: commandPaletteListHeight) + .onChange(of: commandPaletteSelectedResultIndex) { _ in + guard !visibleResults.isEmpty else { return } + let index = commandPaletteSelectedIndex(resultCount: visibleResults.count) + let previousIndex = commandPaletteLastSelectionIndex + defer { commandPaletteLastSelectionIndex = index } + + guard let anchorDecision = Self.commandPaletteScrollAnchor( + selectedIndex: index, + previousIndex: previousIndex, + resultCount: visibleResults.count, + selectedFrame: commandPaletteRowFrames[index], + viewportHeight: commandPaletteListHeight, + contentHeight: commandPaletteListContentHeight + ) else { return } + + let anchor: UnitPoint + switch anchorDecision { + case .top: + anchor = .top + case .bottom: + anchor = .bottom + } + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.1)) { + proxy.scrollTo(index, anchor: anchor) + } + } + } + .onChange(of: visibleResults.count) { _ in + commandPaletteLastSelectionIndex = commandPaletteSelectedIndex(resultCount: visibleResults.count) + } + .onPreferenceChange(CommandPaletteRowFramePreferenceKey.self) { frames in + commandPaletteRowFrames = frames + guard !visibleResults.isEmpty else { return } + let index = commandPaletteSelectedIndex(resultCount: visibleResults.count) + guard let anchorDecision = Self.commandPaletteEdgeVisibilityCorrectionAnchor( + selectedIndex: index, + resultCount: visibleResults.count, + selectedFrame: frames[index], + viewportHeight: commandPaletteListHeight, + contentHeight: commandPaletteListContentHeight + ) else { return } + let anchor: UnitPoint = anchorDecision == .top ? .top : .bottom + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.08)) { + proxy.scrollTo(index, anchor: anchor) + } + } + } + } + + // Keep Esc-to-close behavior without showing footer controls. + Button(action: { dismissCommandPalette() }) { + EmptyView() + } + .buttonStyle(.plain) + .keyboardShortcut(.cancelAction) + .frame(width: 0, height: 0) + .opacity(0) + .accessibilityHidden(true) + } + .onAppear { + commandPaletteHoveredResultIndex = nil + commandPaletteLastSelectionIndex = commandPaletteSelectedResultIndex + commandPaletteRowFrames = [:] + resetCommandPaletteSearchFocus() + } + .onChange(of: commandPaletteQuery) { _ in + commandPaletteSelectedResultIndex = 0 + commandPaletteHoveredResultIndex = nil + commandPaletteLastSelectionIndex = 0 + commandPaletteRowFrames = [:] + syncCommandPaletteDebugStateForObservedWindow() + } + .onChange(of: visibleResults.count) { _ in + commandPaletteSelectedResultIndex = commandPaletteSelectedIndex(resultCount: visibleResults.count) + commandPaletteLastSelectionIndex = commandPaletteSelectedResultIndex + if let hoveredIndex = commandPaletteHoveredResultIndex, hoveredIndex >= visibleResults.count { + commandPaletteHoveredResultIndex = nil + } + syncCommandPaletteDebugStateForObservedWindow() + } + .onChange(of: commandPaletteSelectedResultIndex) { _ in + syncCommandPaletteDebugStateForObservedWindow() + } + } + + private func commandPaletteRenameInputView(target: CommandPaletteRenameTarget) -> some View { + VStack(spacing: 0) { + TextField(target.placeholder, text: $commandPaletteRenameDraft) + .textFieldStyle(.plain) + .font(.system(size: 13, weight: .regular)) + .tint(.blue) + .focused($isCommandPaletteRenameFocused) + .backport.onKeyPress(.delete) { modifiers in + handleCommandPaletteRenameDeleteBackward(modifiers: modifiers) + } + .onSubmit { + continueRenameFlow(target: target) + } + .onTapGesture { + handleCommandPaletteRenameInputInteraction() + } + .padding(.horizontal, 9) + .padding(.vertical, 7) + + Divider() + + Text("Enter a \(renameTargetNoun(target)) name. Press Enter to rename, Escape to cancel.") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + .lineLimit(1) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 9) + .padding(.vertical, 6) + + Button(action: { + continueRenameFlow(target: target) + }) { + EmptyView() + } + .buttonStyle(.plain) + .keyboardShortcut(.defaultAction) + .frame(width: 0, height: 0) + .opacity(0) + .accessibilityHidden(true) + } + .onAppear { + resetCommandPaletteRenameFocus() + } + } + + private func commandPaletteRenameConfirmView( + target: CommandPaletteRenameTarget, + proposedName: String + ) -> some View { + let trimmedName = proposedName.trimmingCharacters(in: .whitespacesAndNewlines) + let nextName = trimmedName.isEmpty ? "(clear custom name)" : trimmedName + + return VStack(spacing: 0) { + Text(nextName) + .font(.system(size: 13, weight: .regular)) + .lineLimit(1) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 9) + .padding(.vertical, 7) + + Divider() + + Text("Press Enter to apply this \(renameTargetNoun(target)) name, or Escape to cancel.") + .font(.system(size: 11)) + .foregroundStyle(.secondary) + .lineLimit(1) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 9) + .padding(.vertical, 6) + + Button(action: { + applyRenameFlow(target: target, proposedName: proposedName) + }) { + EmptyView() + } + .buttonStyle(.plain) + .keyboardShortcut(.defaultAction) + .frame(width: 0, height: 0) + .opacity(0) + .accessibilityHidden(true) + } + } + + private func renameTargetNoun(_ target: CommandPaletteRenameTarget) -> String { + switch target.kind { + case .workspace: + return "workspace" + case .tab: + return "tab" + } + } + + private var commandPaletteListScope: CommandPaletteListScope { + if commandPaletteQuery.hasPrefix(Self.commandPaletteCommandsPrefix) { + return .commands + } + return .switcher + } + + private var commandPaletteSearchPlaceholder: String { + switch commandPaletteListScope { + case .commands: + return "Type a command" + case .switcher: + return "Search workspaces and tabs" + } + } + + private var commandPaletteEmptyStateText: String { + switch commandPaletteListScope { + case .commands: + return "No commands match your search." + case .switcher: + return "No workspaces or tabs match your search." + } + } + + private var commandPaletteQueryForMatching: String { + switch commandPaletteListScope { + case .commands: + let suffix = String(commandPaletteQuery.dropFirst(Self.commandPaletteCommandsPrefix.count)) + return suffix.trimmingCharacters(in: .whitespacesAndNewlines) + case .switcher: + return commandPaletteQuery.trimmingCharacters(in: .whitespacesAndNewlines) + } + } + + private var commandPaletteEntries: [CommandPaletteCommand] { + switch commandPaletteListScope { + case .commands: + return commandPaletteCommands() + case .switcher: + return commandPaletteSwitcherEntries() + } + } + + private var commandPaletteResults: [CommandPaletteSearchResult] { + let entries = commandPaletteEntries + let query = commandPaletteQueryForMatching + let queryIsEmpty = query.isEmpty + + let results: [CommandPaletteSearchResult] = queryIsEmpty + ? entries.map { entry in + CommandPaletteSearchResult( + command: entry, + score: commandPaletteHistoryBoost(for: entry.id, queryIsEmpty: true), + titleMatchIndices: [] + ) + } + : entries.compactMap { entry in + guard let fuzzyScore = CommandPaletteFuzzyMatcher.score(query: query, candidates: entry.searchableTexts) else { + return nil + } + return CommandPaletteSearchResult( + command: entry, + score: fuzzyScore + commandPaletteHistoryBoost(for: entry.id, queryIsEmpty: false), + titleMatchIndices: CommandPaletteFuzzyMatcher.matchCharacterIndices( + query: query, + candidate: entry.title + ) + ) + } + + return results + .sorted { lhs, rhs in + if lhs.score != rhs.score { return lhs.score > rhs.score } + if lhs.command.rank != rhs.command.rank { return lhs.command.rank < rhs.command.rank } + return lhs.command.title.localizedCaseInsensitiveCompare(rhs.command.title) == .orderedAscending + } + } + + private func commandPaletteHighlightedTitleText(_ title: String, matchedIndices: Set<Int>) -> Text { + guard !matchedIndices.isEmpty else { + return Text(title).foregroundColor(.primary) + } + + let chars = Array(title) + var index = 0 + var result = Text("") + + while index < chars.count { + let isMatched = matchedIndices.contains(index) + var end = index + 1 + while end < chars.count, matchedIndices.contains(end) == isMatched { + end += 1 + } + + let segment = String(chars[index..<end]) + if isMatched { + result = result + Text(segment).foregroundColor(.blue) + } else { + result = result + Text(segment).foregroundColor(.primary) + } + index = end + } + + return result + } + + private func commandPaletteTrailingLabel(for command: CommandPaletteCommand) -> CommandPaletteTrailingLabel? { + if let shortcutHint = command.shortcutHint { + return CommandPaletteTrailingLabel(text: shortcutHint, style: .shortcut) + } + + guard commandPaletteListScope == .switcher else { return nil } + if command.id.hasPrefix("switcher.workspace.") { + return CommandPaletteTrailingLabel(text: "Workspace", style: .kind) + } + if command.id.hasPrefix("switcher.surface.") { + return CommandPaletteTrailingLabel(text: "Surface", style: .kind) + } + return nil + } + + private func commandPaletteSwitcherEntries() -> [CommandPaletteCommand] { + var workspaces = tabManager.tabs + guard !workspaces.isEmpty else { return [] } + + if let selectedWorkspaceId = tabManager.selectedTabId, + let selectedIndex = workspaces.firstIndex(where: { $0.id == selectedWorkspaceId }) { + let selectedWorkspace = workspaces.remove(at: selectedIndex) + workspaces.insert(selectedWorkspace, at: 0) + } + + var entries: [CommandPaletteCommand] = [] + entries.reserveCapacity(workspaces.count * 4) + var nextRank = 0 + + for workspace in workspaces { + let workspaceName = workspaceDisplayName(workspace) + let workspaceCommandId = "switcher.workspace.\(workspace.id.uuidString.lowercased())" + let workspaceKeywords = CommandPaletteSwitcherSearchIndexer.keywords( + baseKeywords: [ + "workspace", + "switch", + "go", + "open", + workspaceName + ], + metadata: commandPaletteWorkspaceSearchMetadata(for: workspace), + detail: .workspace + ) + entries.append( + CommandPaletteCommand( + id: workspaceCommandId, + rank: nextRank, + title: workspaceName, + subtitle: "Workspace", + shortcutHint: nil, + keywords: workspaceKeywords, + dismissOnRun: true, + action: { + tabManager.focusTab(workspace.id, suppressFlash: true) + } + ) + ) + nextRank += 1 + + var orderedPanelIds = workspace.sidebarOrderedPanelIds() + if let focusedPanelId = workspace.focusedPanelId, + let focusedIndex = orderedPanelIds.firstIndex(of: focusedPanelId) { + orderedPanelIds.remove(at: focusedIndex) + orderedPanelIds.insert(focusedPanelId, at: 0) + } + + for panelId in orderedPanelIds { + guard let panel = workspace.panels[panelId] else { continue } + let panelTitle = panelDisplayName(workspace: workspace, panelId: panelId, fallback: panel.displayTitle) + let typeLabel: String = (panel.panelType == .browser) ? "Browser" : "Terminal" + let panelKeywords = CommandPaletteSwitcherSearchIndexer.keywords( + baseKeywords: [ + "tab", + "surface", + "panel", + "switch", + "go", + workspaceName, + panelTitle, + typeLabel.lowercased() + ], + metadata: commandPalettePanelSearchMetadata(in: workspace, panelId: panelId) + ) + entries.append( + CommandPaletteCommand( + id: "switcher.surface.\(workspace.id.uuidString.lowercased()).\(panelId.uuidString.lowercased())", + rank: nextRank, + title: panelTitle, + subtitle: "\(typeLabel) • \(workspaceName)", + shortcutHint: nil, + keywords: panelKeywords, + dismissOnRun: true, + action: { + tabManager.focusTab(workspace.id, surfaceId: panelId, suppressFlash: true) + } + ) + ) + nextRank += 1 + } + } + + return entries + } + + private func commandPaletteWorkspaceSearchMetadata(for workspace: Workspace) -> CommandPaletteSwitcherSearchMetadata { + // Keep workspace rows coarse so surface rows win for directory/branch-specific queries. + let directories = [workspace.currentDirectory] + let branches = [workspace.gitBranch?.branch].compactMap { $0 } + let ports = workspace.listeningPorts + return CommandPaletteSwitcherSearchMetadata( + directories: directories, + branches: branches, + ports: ports + ) + } + + private func commandPalettePanelSearchMetadata(in workspace: Workspace, panelId: UUID) -> CommandPaletteSwitcherSearchMetadata { + var directories: [String] = [] + if let directory = workspace.panelDirectories[panelId] { + directories.append(directory) + } else if workspace.focusedPanelId == panelId { + directories.append(workspace.currentDirectory) + } + + var branches: [String] = [] + if let branch = workspace.panelGitBranches[panelId]?.branch { + branches.append(branch) + } else if workspace.focusedPanelId == panelId, let branch = workspace.gitBranch?.branch { + branches.append(branch) + } + + var ports = workspace.surfaceListeningPorts[panelId] ?? [] + if ports.isEmpty, workspace.panels.count == 1 { + ports = workspace.listeningPorts + } + + return CommandPaletteSwitcherSearchMetadata( + directories: directories, + branches: branches, + ports: ports + ) + } + + private func commandPaletteCommands() -> [CommandPaletteCommand] { + let context = commandPaletteContextSnapshot() + let contributions = commandPaletteCommandContributions() + var handlerRegistry = CommandPaletteHandlerRegistry() + registerCommandPaletteHandlers(&handlerRegistry) + + var commands: [CommandPaletteCommand] = [] + commands.reserveCapacity(contributions.count) + var nextRank = 0 + + for contribution in contributions { + guard contribution.when(context), contribution.enablement(context) else { continue } + guard let action = handlerRegistry.handler(for: contribution.commandId) else { + assertionFailure("No command palette handler registered for \(contribution.commandId)") + continue + } + commands.append( + CommandPaletteCommand( + id: contribution.commandId, + rank: nextRank, + title: contribution.title(context), + subtitle: contribution.subtitle(context), + shortcutHint: commandPaletteShortcutHint(for: contribution), + keywords: contribution.keywords, + dismissOnRun: contribution.dismissOnRun, + action: action + ) + ) + nextRank += 1 + } + + return commands + } + + private func commandPaletteShortcutHint(for contribution: CommandPaletteCommandContribution) -> String? { + if let action = commandPaletteShortcutAction(for: contribution.commandId) { + return KeyboardShortcutSettings.shortcut(for: action).displayString + } + if let staticShortcut = commandPaletteStaticShortcutHint(for: contribution.commandId) { + return staticShortcut + } + return contribution.shortcutHint + } + + private func commandPaletteShortcutAction(for commandId: String) -> KeyboardShortcutSettings.Action? { + switch commandId { + case "palette.newWorkspace": + return .newTab + case "palette.newTerminalTab": + return .newSurface + case "palette.newBrowserTab": + return .openBrowser + case "palette.toggleSidebar": + return .toggleSidebar + case "palette.showNotifications": + return .showNotifications + case "palette.jumpUnread": + return .jumpToUnread + case "palette.renameWorkspace": + return .renameWorkspace + case "palette.nextWorkspace": + return .nextSidebarTab + case "palette.previousWorkspace": + return .prevSidebarTab + case "palette.nextTabInPane": + return .nextSurface + case "palette.previousTabInPane": + return .prevSurface + case "palette.browserToggleDevTools": + return .toggleBrowserDeveloperTools + case "palette.browserConsole": + return .showBrowserJavaScriptConsole + case "palette.browserSplitRight", "palette.terminalSplitBrowserRight": + return .splitBrowserRight + case "palette.browserSplitDown", "palette.terminalSplitBrowserDown": + return .splitBrowserDown + case "palette.terminalSplitRight": + return .splitRight + case "palette.terminalSplitDown": + return .splitDown + default: + return nil + } + } + + private func commandPaletteStaticShortcutHint(for commandId: String) -> String? { + switch commandId { + case "palette.closeTab": + return "⌘W" + case "palette.closeWorkspace": + return "⌘⇧W" + case "palette.reopenClosedBrowserTab": + return "⌘⇧T" + case "palette.openSettings": + return "⌘," + case "palette.browserBack": + return "⌘[" + case "palette.browserForward": + return "⌘]" + case "palette.browserReload": + return "⌘R" + case "palette.browserFocusAddressBar": + return "⌘L" + case "palette.browserZoomIn": + return "⌘=" + case "palette.browserZoomOut": + return "⌘-" + case "palette.browserZoomReset": + return "⌘0" + case "palette.terminalFind": + return "⌘F" + case "palette.terminalFindNext": + return "⌘G" + case "palette.terminalFindPrevious": + return "⌘⇧G" + case "palette.terminalHideFind": + return "⌘⇧F" + case "palette.terminalUseSelectionForFind": + return "⌘E" + default: + return nil + } + } + + private func commandPaletteContextSnapshot() -> CommandPaletteContextSnapshot { + var snapshot = CommandPaletteContextSnapshot() + + if let workspace = tabManager.selectedWorkspace { + snapshot.setBool(CommandPaletteContextKeys.hasWorkspace, true) + snapshot.setString(CommandPaletteContextKeys.workspaceName, workspaceDisplayName(workspace)) + snapshot.setBool(CommandPaletteContextKeys.workspaceHasCustomName, workspace.customTitle != nil) + snapshot.setBool(CommandPaletteContextKeys.workspaceShouldPin, !workspace.isPinned) + } + + if let panelContext = focusedPanelContext { + let workspace = panelContext.workspace + let panelId = panelContext.panelId + snapshot.setBool(CommandPaletteContextKeys.hasFocusedPanel, true) + snapshot.setString( + CommandPaletteContextKeys.panelName, + panelDisplayName(workspace: workspace, panelId: panelId, fallback: panelContext.panel.displayTitle) + ) + snapshot.setBool(CommandPaletteContextKeys.panelIsBrowser, panelContext.panel.panelType == .browser) + snapshot.setBool(CommandPaletteContextKeys.panelIsTerminal, panelContext.panel.panelType == .terminal) + snapshot.setBool(CommandPaletteContextKeys.panelHasCustomName, workspace.panelCustomTitles[panelId] != nil) + snapshot.setBool(CommandPaletteContextKeys.panelShouldPin, !workspace.isPanelPinned(panelId)) + let hasUnread = workspace.manualUnreadPanelIds.contains(panelId) + || notificationStore.hasUnreadNotification(forTabId: workspace.id, surfaceId: panelId) + snapshot.setBool(CommandPaletteContextKeys.panelHasUnread, hasUnread) + } + + return snapshot + } + + private func commandPaletteCommandContributions() -> [CommandPaletteCommandContribution] { + func constant(_ value: String) -> (CommandPaletteContextSnapshot) -> String { + { _ in value } + } + + func workspaceSubtitle(_ context: CommandPaletteContextSnapshot) -> String { + let name = context.string(CommandPaletteContextKeys.workspaceName) ?? "Workspace" + return "Workspace • \(name)" + } + + func panelSubtitle(_ context: CommandPaletteContextSnapshot) -> String { + let name = context.string(CommandPaletteContextKeys.panelName) ?? "Tab" + return "Tab • \(name)" + } + + func browserPanelSubtitle(_ context: CommandPaletteContextSnapshot) -> String { + let name = context.string(CommandPaletteContextKeys.panelName) ?? "Tab" + return "Browser • \(name)" + } + + func terminalPanelSubtitle(_ context: CommandPaletteContextSnapshot) -> String { + let name = context.string(CommandPaletteContextKeys.panelName) ?? "Tab" + return "Terminal • \(name)" + } + + var contributions: [CommandPaletteCommandContribution] = [] + + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.newWorkspace", + title: constant("New Workspace"), + subtitle: constant("Workspace"), + keywords: ["create", "new", "workspace"] + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.newTerminalTab", + title: constant("New Tab (Terminal)"), + subtitle: constant("Tab"), + shortcutHint: "⌘T", + keywords: ["new", "terminal", "tab"] + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.newBrowserTab", + title: constant("New Tab (Browser)"), + subtitle: constant("Tab"), + shortcutHint: "⌘⇧L", + keywords: ["new", "browser", "tab", "web"] + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.closeTab", + title: constant("Close Tab"), + subtitle: constant("Tab"), + shortcutHint: "⌘W", + keywords: ["close", "tab"] + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.closeWorkspace", + title: constant("Close Workspace"), + subtitle: constant("Workspace"), + shortcutHint: "⌘⇧W", + keywords: ["close", "workspace"] + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.reopenClosedBrowserTab", + title: constant("Reopen Closed Browser Tab"), + subtitle: constant("Browser"), + shortcutHint: "⌘⇧T", + keywords: ["reopen", "closed", "browser"] + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.toggleSidebar", + title: constant("Toggle Sidebar"), + subtitle: constant("Layout"), + keywords: ["toggle", "sidebar", "layout"] + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.showNotifications", + title: constant("Show Notifications"), + subtitle: constant("Notifications"), + keywords: ["notifications", "inbox"] + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.jumpUnread", + title: constant("Jump to Latest Unread"), + subtitle: constant("Notifications"), + keywords: ["jump", "unread", "notification"] + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.openSettings", + title: constant("Open Settings"), + subtitle: constant("Global"), + shortcutHint: "⌘,", + keywords: ["settings", "preferences"] + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.checkForUpdates", + title: constant("Check for Updates"), + subtitle: constant("Global"), + keywords: ["update", "upgrade", "release"] + ) + ) + + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.renameWorkspace", + title: constant("Rename Workspace…"), + subtitle: workspaceSubtitle, + keywords: ["rename", "workspace", "title"], + dismissOnRun: false, + when: { $0.bool(CommandPaletteContextKeys.hasWorkspace) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.clearWorkspaceName", + title: constant("Clear Workspace Name"), + subtitle: workspaceSubtitle, + keywords: ["clear", "workspace", "name"], + when: { + $0.bool(CommandPaletteContextKeys.hasWorkspace) + && $0.bool(CommandPaletteContextKeys.workspaceHasCustomName) + } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.toggleWorkspacePin", + title: { context in + context.bool(CommandPaletteContextKeys.workspaceShouldPin) ? "Pin Workspace" : "Unpin Workspace" + }, + subtitle: workspaceSubtitle, + keywords: ["workspace", "pin", "pinned"], + when: { $0.bool(CommandPaletteContextKeys.hasWorkspace) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.nextWorkspace", + title: constant("Next Workspace"), + subtitle: constant("Workspace Navigation"), + keywords: ["next", "workspace", "navigate"], + when: { $0.bool(CommandPaletteContextKeys.hasWorkspace) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.previousWorkspace", + title: constant("Previous Workspace"), + subtitle: constant("Workspace Navigation"), + keywords: ["previous", "workspace", "navigate"], + when: { $0.bool(CommandPaletteContextKeys.hasWorkspace) } + ) + ) + + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.renameTab", + title: constant("Rename Tab…"), + subtitle: panelSubtitle, + keywords: ["rename", "tab", "title"], + dismissOnRun: false, + when: { $0.bool(CommandPaletteContextKeys.hasFocusedPanel) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.clearTabName", + title: constant("Clear Tab Name"), + subtitle: panelSubtitle, + keywords: ["clear", "tab", "name"], + when: { + $0.bool(CommandPaletteContextKeys.hasFocusedPanel) + && $0.bool(CommandPaletteContextKeys.panelHasCustomName) + } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.toggleTabPin", + title: { context in + context.bool(CommandPaletteContextKeys.panelShouldPin) ? "Pin Tab" : "Unpin Tab" + }, + subtitle: panelSubtitle, + keywords: ["tab", "pin", "pinned"], + when: { $0.bool(CommandPaletteContextKeys.hasFocusedPanel) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.toggleTabUnread", + title: { context in + context.bool(CommandPaletteContextKeys.panelHasUnread) ? "Mark Tab as Read" : "Mark Tab as Unread" + }, + subtitle: panelSubtitle, + keywords: ["tab", "read", "unread", "notification"], + when: { $0.bool(CommandPaletteContextKeys.hasFocusedPanel) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.nextTabInPane", + title: constant("Next Tab in Pane"), + subtitle: constant("Tab Navigation"), + keywords: ["next", "tab", "pane"], + when: { $0.bool(CommandPaletteContextKeys.hasFocusedPanel) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.previousTabInPane", + title: constant("Previous Tab in Pane"), + subtitle: constant("Tab Navigation"), + keywords: ["previous", "tab", "pane"], + when: { $0.bool(CommandPaletteContextKeys.hasFocusedPanel) } + ) + ) + + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserBack", + title: constant("Back"), + subtitle: browserPanelSubtitle, + shortcutHint: "⌘[", + keywords: ["browser", "back", "history"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserForward", + title: constant("Forward"), + subtitle: browserPanelSubtitle, + shortcutHint: "⌘]", + keywords: ["browser", "forward", "history"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserReload", + title: constant("Reload Page"), + subtitle: browserPanelSubtitle, + shortcutHint: "⌘R", + keywords: ["browser", "reload", "refresh"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserOpenDefault", + title: constant("Open Current Page in Default Browser"), + subtitle: browserPanelSubtitle, + keywords: ["open", "default", "external", "browser"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserFocusAddressBar", + title: constant("Focus Address Bar"), + subtitle: browserPanelSubtitle, + shortcutHint: "⌘L", + keywords: ["browser", "address", "omnibar", "url"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserToggleDevTools", + title: constant("Toggle Developer Tools"), + subtitle: browserPanelSubtitle, + keywords: ["browser", "devtools", "inspector"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserConsole", + title: constant("Show JavaScript Console"), + subtitle: browserPanelSubtitle, + keywords: ["browser", "console", "javascript"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserZoomIn", + title: constant("Zoom In"), + subtitle: browserPanelSubtitle, + keywords: ["browser", "zoom", "in"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserZoomOut", + title: constant("Zoom Out"), + subtitle: browserPanelSubtitle, + keywords: ["browser", "zoom", "out"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserZoomReset", + title: constant("Actual Size"), + subtitle: browserPanelSubtitle, + keywords: ["browser", "zoom", "reset", "actual size"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserClearHistory", + title: constant("Clear Browser History"), + subtitle: constant("Browser"), + keywords: ["browser", "history", "clear"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserSplitRight", + title: constant("Split Browser Right"), + subtitle: constant("Browser Layout"), + keywords: ["browser", "split", "right"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserSplitDown", + title: constant("Split Browser Down"), + subtitle: constant("Browser Layout"), + keywords: ["browser", "split", "down"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.browserDuplicateRight", + title: constant("Duplicate Browser to the Right"), + subtitle: constant("Browser Layout"), + keywords: ["browser", "duplicate", "clone", "split"], + when: { $0.bool(CommandPaletteContextKeys.panelIsBrowser) } + ) + ) + + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.terminalOpenDirectory", + title: constant("Open Current Directory in IDE"), + subtitle: terminalPanelSubtitle, + keywords: ["terminal", "directory", "open", "ide", "code", "default app"], + when: { $0.bool(CommandPaletteContextKeys.panelIsTerminal) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.terminalFind", + title: constant("Find…"), + subtitle: terminalPanelSubtitle, + shortcutHint: "⌘F", + keywords: ["terminal", "find", "search"], + when: { $0.bool(CommandPaletteContextKeys.panelIsTerminal) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.terminalFindNext", + title: constant("Find Next"), + subtitle: terminalPanelSubtitle, + shortcutHint: "⌘G", + keywords: ["terminal", "find", "next", "search"], + when: { $0.bool(CommandPaletteContextKeys.panelIsTerminal) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.terminalFindPrevious", + title: constant("Find Previous"), + subtitle: terminalPanelSubtitle, + shortcutHint: "⌘⇧G", + keywords: ["terminal", "find", "previous", "search"], + when: { $0.bool(CommandPaletteContextKeys.panelIsTerminal) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.terminalHideFind", + title: constant("Hide Find Bar"), + subtitle: terminalPanelSubtitle, + shortcutHint: "⌘⇧F", + keywords: ["terminal", "hide", "find", "search"], + when: { $0.bool(CommandPaletteContextKeys.panelIsTerminal) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.terminalUseSelectionForFind", + title: constant("Use Selection for Find"), + subtitle: terminalPanelSubtitle, + keywords: ["terminal", "selection", "find"], + when: { $0.bool(CommandPaletteContextKeys.panelIsTerminal) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.terminalSplitRight", + title: constant("Split Right"), + subtitle: constant("Terminal Layout"), + keywords: ["terminal", "split", "right"], + when: { $0.bool(CommandPaletteContextKeys.panelIsTerminal) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.terminalSplitDown", + title: constant("Split Down"), + subtitle: constant("Terminal Layout"), + keywords: ["terminal", "split", "down"], + when: { $0.bool(CommandPaletteContextKeys.panelIsTerminal) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.terminalSplitBrowserRight", + title: constant("Split Browser Right"), + subtitle: constant("Terminal Layout"), + keywords: ["terminal", "split", "browser", "right"], + when: { $0.bool(CommandPaletteContextKeys.panelIsTerminal) } + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.terminalSplitBrowserDown", + title: constant("Split Browser Down"), + subtitle: constant("Terminal Layout"), + keywords: ["terminal", "split", "browser", "down"], + when: { $0.bool(CommandPaletteContextKeys.panelIsTerminal) } + ) + ) + + return contributions + } + + private func registerCommandPaletteHandlers(_ registry: inout CommandPaletteHandlerRegistry) { + registry.register(commandId: "palette.newWorkspace") { + tabManager.addWorkspace() + } + registry.register(commandId: "palette.newTerminalTab") { + tabManager.newSurface() + } + registry.register(commandId: "palette.newBrowserTab") { + _ = tabManager.openBrowser() + } + registry.register(commandId: "palette.closeTab") { + tabManager.closeCurrentPanelWithConfirmation() + } + registry.register(commandId: "palette.closeWorkspace") { + tabManager.closeCurrentWorkspaceWithConfirmation() + } + registry.register(commandId: "palette.reopenClosedBrowserTab") { + _ = tabManager.reopenMostRecentlyClosedBrowserPanel() + } + registry.register(commandId: "palette.toggleSidebar") { + sidebarState.toggle() + } + registry.register(commandId: "palette.showNotifications") { + AppDelegate.shared?.toggleNotificationsPopover(animated: false) + } + registry.register(commandId: "palette.jumpUnread") { + AppDelegate.shared?.jumpToLatestUnread() + } + registry.register(commandId: "palette.openSettings") { + NSApp.sendAction(Selector(("showSettingsWindow:")), to: nil, from: nil) + } + registry.register(commandId: "palette.checkForUpdates") { + AppDelegate.shared?.checkForUpdates(nil) + } + + registry.register(commandId: "palette.renameWorkspace") { + beginRenameWorkspaceFlow() + } + registry.register(commandId: "palette.clearWorkspaceName") { + guard let workspace = tabManager.selectedWorkspace else { + NSSound.beep() + return + } + tabManager.clearCustomTitle(tabId: workspace.id) + } + registry.register(commandId: "palette.toggleWorkspacePin") { + guard let workspace = tabManager.selectedWorkspace else { + NSSound.beep() + return + } + tabManager.setPinned(workspace, pinned: !workspace.isPinned) + } + registry.register(commandId: "palette.nextWorkspace") { + tabManager.selectNextTab() + } + registry.register(commandId: "palette.previousWorkspace") { + tabManager.selectPreviousTab() + } + + registry.register(commandId: "palette.renameTab") { + beginRenameTabFlow() + } + registry.register(commandId: "palette.clearTabName") { + guard let panelContext = focusedPanelContext else { + NSSound.beep() + return + } + panelContext.workspace.setPanelCustomTitle(panelId: panelContext.panelId, title: nil) + } + registry.register(commandId: "palette.toggleTabPin") { + guard let panelContext = focusedPanelContext else { + NSSound.beep() + return + } + panelContext.workspace.setPanelPinned( + panelId: panelContext.panelId, + pinned: !panelContext.workspace.isPanelPinned(panelContext.panelId) + ) + } + registry.register(commandId: "palette.toggleTabUnread") { + guard let panelContext = focusedPanelContext else { + NSSound.beep() + return + } + let hasUnread = panelContext.workspace.manualUnreadPanelIds.contains(panelContext.panelId) + || notificationStore.hasUnreadNotification(forTabId: panelContext.workspace.id, surfaceId: panelContext.panelId) + if hasUnread { + panelContext.workspace.markPanelRead(panelContext.panelId) + } else { + panelContext.workspace.markPanelUnread(panelContext.panelId) + } + } + registry.register(commandId: "palette.nextTabInPane") { + tabManager.selectNextSurface() + } + registry.register(commandId: "palette.previousTabInPane") { + tabManager.selectPreviousSurface() + } + + registry.register(commandId: "palette.browserBack") { + tabManager.focusedBrowserPanel?.goBack() + } + registry.register(commandId: "palette.browserForward") { + tabManager.focusedBrowserPanel?.goForward() + } + registry.register(commandId: "palette.browserReload") { + tabManager.focusedBrowserPanel?.reload() + } + registry.register(commandId: "palette.browserOpenDefault") { + if !openFocusedBrowserInDefaultBrowser() { + NSSound.beep() + } + } + registry.register(commandId: "palette.browserFocusAddressBar") { + if !focusFocusedBrowserAddressBar() { + NSSound.beep() + } + } + registry.register(commandId: "palette.browserToggleDevTools") { + if !tabManager.toggleDeveloperToolsFocusedBrowser() { + NSSound.beep() + } + } + registry.register(commandId: "palette.browserConsole") { + if !tabManager.showJavaScriptConsoleFocusedBrowser() { + NSSound.beep() + } + } + registry.register(commandId: "palette.browserZoomIn") { + if !tabManager.zoomInFocusedBrowser() { + NSSound.beep() + } + } + registry.register(commandId: "palette.browserZoomOut") { + if !tabManager.zoomOutFocusedBrowser() { + NSSound.beep() + } + } + registry.register(commandId: "palette.browserZoomReset") { + if !tabManager.resetZoomFocusedBrowser() { + NSSound.beep() + } + } + registry.register(commandId: "palette.browserClearHistory") { + BrowserHistoryStore.shared.clearHistory() + } + registry.register(commandId: "palette.browserSplitRight") { + _ = tabManager.createBrowserSplit(direction: .right) + } + registry.register(commandId: "palette.browserSplitDown") { + _ = tabManager.createBrowserSplit(direction: .down) + } + registry.register(commandId: "palette.browserDuplicateRight") { + let url = tabManager.focusedBrowserPanel?.preferredURLStringForOmnibar().flatMap(URL.init(string:)) + _ = tabManager.createBrowserSplit(direction: .right, url: url) + } + + registry.register(commandId: "palette.terminalOpenDirectory") { + if !openFocusedDirectoryInDefaultApp() { + NSSound.beep() + } + } + registry.register(commandId: "palette.terminalFind") { + tabManager.startSearch() + } + registry.register(commandId: "palette.terminalFindNext") { + tabManager.findNext() + } + registry.register(commandId: "palette.terminalFindPrevious") { + tabManager.findPrevious() + } + registry.register(commandId: "palette.terminalHideFind") { + tabManager.hideFind() + } + registry.register(commandId: "palette.terminalUseSelectionForFind") { + tabManager.searchSelection() + } + registry.register(commandId: "palette.terminalSplitRight") { + tabManager.createSplit(direction: .right) + } + registry.register(commandId: "palette.terminalSplitDown") { + tabManager.createSplit(direction: .down) + } + registry.register(commandId: "palette.terminalSplitBrowserRight") { + _ = tabManager.createBrowserSplit(direction: .right) + } + registry.register(commandId: "palette.terminalSplitBrowserDown") { + _ = tabManager.createBrowserSplit(direction: .down) + } + } + + private var focusedPanelContext: (workspace: Workspace, panelId: UUID, panel: any Panel)? { + guard let workspace = tabManager.selectedWorkspace, + let panelId = workspace.focusedPanelId, + let panel = workspace.panels[panelId] else { + return nil + } + return (workspace, panelId, panel) + } + + private func workspaceDisplayName(_ workspace: Workspace) -> String { + let custom = workspace.customTitle?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" + if !custom.isEmpty { + return custom + } + let title = workspace.title.trimmingCharacters(in: .whitespacesAndNewlines) + return title.isEmpty ? "Workspace" : title + } + + private func panelDisplayName(workspace: Workspace, panelId: UUID, fallback: String) -> String { + let title = workspace.panelTitle(panelId: panelId)?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" + if !title.isEmpty { + return title + } + let trimmedFallback = fallback.trimmingCharacters(in: .whitespacesAndNewlines) + return trimmedFallback.isEmpty ? "Tab" : trimmedFallback + } + + private func commandPaletteSelectedIndex(resultCount: Int) -> Int { + guard resultCount > 0 else { return 0 } + return min(max(commandPaletteSelectedResultIndex, 0), resultCount - 1) + } + + static func commandPaletteScrollAnchor( + selectedIndex: Int, + previousIndex: Int, + resultCount: Int, + selectedFrame: CGRect?, + viewportHeight: CGFloat, + contentHeight: CGFloat, + epsilon: CGFloat = 0.5 + ) -> CommandPaletteScrollAnchor? { + guard resultCount > 0 else { return nil } + guard contentHeight > viewportHeight else { return nil } + + // Always pin edges exactly into view when selection reaches first/last. + if selectedIndex <= 0 { + return .top + } + if selectedIndex >= resultCount - 1 { + return .bottom + } + + if let frame = selectedFrame, + frame.minY >= (0 - epsilon), + frame.maxY <= (viewportHeight + epsilon) { + return nil + } + + return selectedIndex >= previousIndex ? .bottom : .top + } + + static func commandPaletteEdgeVisibilityCorrectionAnchor( + selectedIndex: Int, + resultCount: Int, + selectedFrame: CGRect?, + viewportHeight: CGFloat, + contentHeight: CGFloat, + epsilon: CGFloat = 0.5 + ) -> CommandPaletteScrollAnchor? { + guard resultCount > 0 else { return nil } + guard contentHeight > viewportHeight else { return nil } + + let isTop = selectedIndex <= 0 + let isBottom = selectedIndex >= (resultCount - 1) + guard isTop || isBottom else { return nil } + + guard let frame = selectedFrame else { + return isTop ? .top : .bottom + } + + if isTop { + let topDelta = abs(frame.minY) + return topDelta > epsilon ? .top : nil + } + + let bottomDelta = abs(frame.maxY - viewportHeight) + return bottomDelta > epsilon ? .bottom : nil + } + + private func moveCommandPaletteSelection(by delta: Int) { + let count = commandPaletteResults.count + guard count > 0 else { + NSSound.beep() + return + } + let current = commandPaletteSelectedIndex(resultCount: count) + commandPaletteSelectedResultIndex = min(max(current + delta, 0), count - 1) + syncCommandPaletteDebugStateForObservedWindow() + } + + private func handleCommandPaletteControlNavigationKey( + modifiers: EventModifiers, + delta: Int + ) -> BackportKeyPressResult { + guard modifiers.contains(.control), + !modifiers.contains(.command), + !modifiers.contains(.shift), + !modifiers.contains(.option) else { + return .ignored + } + moveCommandPaletteSelection(by: delta) + return .handled + } + + static func commandPaletteShouldPopRenameInputOnDelete( + renameDraft: String, + modifiers: EventModifiers + ) -> Bool { + let blockedModifiers: EventModifiers = [.command, .control, .option, .shift] + guard modifiers.intersection(blockedModifiers).isEmpty else { return false } + return renameDraft.isEmpty + } + + private func handleCommandPaletteRenameDeleteBackward( + modifiers: EventModifiers + ) -> BackportKeyPressResult { + guard case .renameInput = commandPaletteMode else { return .ignored } + let blockedModifiers: EventModifiers = [.command, .control, .option, .shift] + guard modifiers.intersection(blockedModifiers).isEmpty else { return .ignored } + + if Self.commandPaletteShouldPopRenameInputOnDelete( + renameDraft: commandPaletteRenameDraft, + modifiers: modifiers + ) { + commandPaletteMode = .commands + resetCommandPaletteSearchFocus() + syncCommandPaletteDebugStateForObservedWindow() + return .handled + } + + if let window = observedWindow ?? NSApp.keyWindow ?? NSApp.mainWindow, + let editor = window.firstResponder as? NSTextView, + editor.isFieldEditor { + editor.deleteBackward(nil) + commandPaletteRenameDraft = editor.string + } else if !commandPaletteRenameDraft.isEmpty { + commandPaletteRenameDraft.removeLast() + } + + syncCommandPaletteDebugStateForObservedWindow() + return .handled + } + + private func runSelectedCommandPaletteResult(visibleResults: [CommandPaletteSearchResult]? = nil) { + let visibleResults = visibleResults ?? Array(commandPaletteResults) + guard !visibleResults.isEmpty else { + NSSound.beep() + return + } + let index = commandPaletteSelectedIndex(resultCount: visibleResults.count) + runCommandPaletteCommand(visibleResults[index].command) + } + + private func runCommandPaletteCommand(_ command: CommandPaletteCommand) { + recordCommandPaletteUsage(command.id) + command.action() + if command.dismissOnRun { + dismissCommandPalette(restoreFocus: false) + } + } + + private func toggleCommandPalette() { + if isCommandPalettePresented { + dismissCommandPalette() + } else { + presentCommandPalette(initialQuery: Self.commandPaletteCommandsPrefix) + } + } + + private func openCommandPaletteCommands() { + toggleCommandPalette(initialQuery: Self.commandPaletteCommandsPrefix) + } + + private func openCommandPaletteSwitcher() { + toggleCommandPalette(initialQuery: "") + } + + private func toggleCommandPalette(initialQuery: String) { + if isCommandPalettePresented { + dismissCommandPalette() + } else { + presentCommandPalette(initialQuery: initialQuery) + } + } + + private func openCommandPaletteRenameTabInput() { + if !isCommandPalettePresented { + presentCommandPalette(initialQuery: Self.commandPaletteCommandsPrefix) + } + beginRenameTabFlow() + } + + static func shouldHandleCommandPaletteRequest( + observedWindow: NSWindow?, + requestedWindow: NSWindow?, + keyWindow: NSWindow?, + mainWindow: NSWindow? + ) -> Bool { + guard let observedWindow else { return false } + if let requestedWindow { + return requestedWindow === observedWindow + } + if let keyWindow { + return keyWindow === observedWindow + } + if let mainWindow { + return mainWindow === observedWindow + } + return false + } + + private func syncCommandPaletteDebugStateForObservedWindow() { + guard let window = observedWindow ?? NSApp.keyWindow ?? NSApp.mainWindow else { return } + AppDelegate.shared?.setCommandPaletteVisible(isCommandPalettePresented, for: window) + let visibleResultCount = commandPaletteResults.count + let selectedIndex = isCommandPalettePresented ? commandPaletteSelectedIndex(resultCount: visibleResultCount) : 0 + AppDelegate.shared?.setCommandPaletteSelectionIndex(selectedIndex, for: window) + AppDelegate.shared?.setCommandPaletteSnapshot(commandPaletteDebugSnapshot(), for: window) + } + + private func commandPaletteDebugSnapshot() -> CommandPaletteDebugSnapshot { + guard isCommandPalettePresented else { return .empty } + + let mode: String + switch commandPaletteMode { + case .commands: + mode = commandPaletteListScope.rawValue + case .renameInput: + mode = "rename_input" + case .renameConfirm: + mode = "rename_confirm" + } + + let rows = Array(commandPaletteResults.prefix(20)).map { result in + CommandPaletteDebugResultRow( + commandId: result.command.id, + title: result.command.title, + shortcutHint: result.command.shortcutHint, + trailingLabel: commandPaletteTrailingLabel(for: result.command)?.text, + score: result.score + ) + } + + return CommandPaletteDebugSnapshot( + query: commandPaletteQueryForMatching, + mode: mode, + results: rows + ) + } + + private func presentCommandPalette(initialQuery: String) { + if let panelContext = focusedPanelContext { + commandPaletteRestoreFocusTarget = CommandPaletteRestoreFocusTarget( + workspaceId: panelContext.workspace.id, + panelId: panelContext.panelId + ) + } else { + commandPaletteRestoreFocusTarget = nil + } + isCommandPalettePresented = true + refreshCommandPaletteUsageHistory() + resetCommandPaletteListState(initialQuery: initialQuery) + } + + private func resetCommandPaletteListState(initialQuery: String) { + commandPaletteMode = .commands + commandPaletteQuery = initialQuery + commandPaletteRenameDraft = "" + commandPaletteSelectedResultIndex = 0 + commandPaletteHoveredResultIndex = nil + commandPaletteLastSelectionIndex = 0 + commandPaletteRowFrames = [:] + resetCommandPaletteSearchFocus() + syncCommandPaletteDebugStateForObservedWindow() + } + + private func dismissCommandPalette(restoreFocus: Bool = true) { + let focusTarget = commandPaletteRestoreFocusTarget + isCommandPalettePresented = false + commandPaletteMode = .commands + commandPaletteQuery = "" + commandPaletteRenameDraft = "" + commandPaletteSelectedResultIndex = 0 + commandPaletteHoveredResultIndex = nil + commandPaletteLastSelectionIndex = 0 + commandPaletteRowFrames = [:] + isCommandPaletteSearchFocused = false + isCommandPaletteRenameFocused = false + commandPaletteRestoreFocusTarget = nil + if let window = observedWindow { + _ = window.makeFirstResponder(nil) + } + syncCommandPaletteDebugStateForObservedWindow() + + guard restoreFocus, let focusTarget else { return } + restoreCommandPaletteFocus(target: focusTarget, attemptsRemaining: 6) + } + + private func restoreCommandPaletteFocus( + target: CommandPaletteRestoreFocusTarget, + attemptsRemaining: Int + ) { + guard !isCommandPalettePresented else { return } + guard tabManager.tabs.contains(where: { $0.id == target.workspaceId }) else { return } + + if let window = observedWindow, !window.isKeyWindow { + window.makeKeyAndOrderFront(nil) + } + tabManager.focusTab(target.workspaceId, surfaceId: target.panelId, suppressFlash: true) + + guard attemptsRemaining > 0 else { return } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.03) { + guard !isCommandPalettePresented else { return } + if let context = focusedPanelContext, + context.workspace.id == target.workspaceId, + context.panelId == target.panelId { + return + } + restoreCommandPaletteFocus(target: target, attemptsRemaining: attemptsRemaining - 1) + } + } + + private func resetCommandPaletteSearchFocus() { + applyCommandPaletteInputFocusPolicy(.search) + } + + private func resetCommandPaletteRenameFocus() { + applyCommandPaletteInputFocusPolicy(commandPaletteRenameInputFocusPolicy()) + } + + private func handleCommandPaletteRenameInputInteraction() { + guard isCommandPalettePresented else { return } + guard case .renameInput = commandPaletteMode else { return } + applyCommandPaletteInputFocusPolicy(commandPaletteRenameInputFocusPolicy()) + } + + private func commandPaletteRenameInputFocusPolicy() -> CommandPaletteInputFocusPolicy { + let selectAllOnFocus = CommandPaletteRenameSelectionSettings.selectAllOnFocusEnabled() + let selectionBehavior: CommandPaletteTextSelectionBehavior = selectAllOnFocus + ? .selectAll + : .caretAtEnd + return CommandPaletteInputFocusPolicy( + focusTarget: .rename, + selectionBehavior: selectionBehavior + ) + } + + private func applyCommandPaletteInputFocusPolicy(_ policy: CommandPaletteInputFocusPolicy) { + DispatchQueue.main.async { + switch policy.focusTarget { + case .search: + isCommandPaletteRenameFocused = false + isCommandPaletteSearchFocused = true + case .rename: + isCommandPaletteSearchFocused = false + isCommandPaletteRenameFocused = true + } + applyCommandPaletteTextSelection(policy.selectionBehavior) + } + } + + private func applyCommandPaletteTextSelection( + _ behavior: CommandPaletteTextSelectionBehavior, + attemptsRemaining: Int = 20 + ) { + guard isCommandPalettePresented else { return } + switch behavior { + case .selectAll: + guard case .renameInput = commandPaletteMode else { return } + case .caretAtEnd: + switch commandPaletteMode { + case .commands, .renameInput: + break + case .renameConfirm: + return + } + } + guard let window = observedWindow ?? NSApp.keyWindow ?? NSApp.mainWindow else { return } + + if let editor = window.firstResponder as? NSTextView, editor.isFieldEditor { + let length = (editor.string as NSString).length + switch behavior { + case .selectAll: + editor.setSelectedRange(NSRange(location: 0, length: length)) + case .caretAtEnd: + editor.setSelectedRange(NSRange(location: length, length: 0)) + } + return + } + + guard attemptsRemaining > 0 else { return } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.02) { + applyCommandPaletteTextSelection(behavior, attemptsRemaining: attemptsRemaining - 1) + } + } + + private func refreshCommandPaletteUsageHistory() { + commandPaletteUsageHistoryByCommandId = loadCommandPaletteUsageHistory() + } + + private func loadCommandPaletteUsageHistory() -> [String: CommandPaletteUsageEntry] { + guard let data = UserDefaults.standard.data(forKey: Self.commandPaletteUsageDefaultsKey) else { + return [:] + } + return (try? JSONDecoder().decode([String: CommandPaletteUsageEntry].self, from: data)) ?? [:] + } + + private func persistCommandPaletteUsageHistory(_ history: [String: CommandPaletteUsageEntry]) { + guard let data = try? JSONEncoder().encode(history) else { return } + UserDefaults.standard.set(data, forKey: Self.commandPaletteUsageDefaultsKey) + } + + private func recordCommandPaletteUsage(_ commandId: String) { + var history = commandPaletteUsageHistoryByCommandId + var entry = history[commandId] ?? CommandPaletteUsageEntry(useCount: 0, lastUsedAt: 0) + entry.useCount += 1 + entry.lastUsedAt = Date().timeIntervalSince1970 + history[commandId] = entry + commandPaletteUsageHistoryByCommandId = history + persistCommandPaletteUsageHistory(history) + } + + private func commandPaletteHistoryBoost(for commandId: String, queryIsEmpty: Bool) -> Int { + guard let entry = commandPaletteUsageHistoryByCommandId[commandId] else { return 0 } + + let now = Date().timeIntervalSince1970 + let ageDays = max(0, now - entry.lastUsedAt) / 86_400 + let recencyBoost = max(0, 320 - Int(ageDays * 20)) + let countBoost = min(180, entry.useCount * 12) + let totalBoost = recencyBoost + countBoost + + return queryIsEmpty ? totalBoost : max(0, totalBoost / 3) + } + + private func beginRenameWorkspaceFlow() { + guard let workspace = tabManager.selectedWorkspace else { + NSSound.beep() + return + } + let target = CommandPaletteRenameTarget( + kind: .workspace(workspaceId: workspace.id), + currentName: workspaceDisplayName(workspace) + ) + startRenameFlow(target) + } + + private func beginRenameTabFlow() { + guard let panelContext = focusedPanelContext else { + NSSound.beep() + return + } + let panelName = panelDisplayName( + workspace: panelContext.workspace, + panelId: panelContext.panelId, + fallback: panelContext.panel.displayTitle + ) + let target = CommandPaletteRenameTarget( + kind: .tab(workspaceId: panelContext.workspace.id, panelId: panelContext.panelId), + currentName: panelName + ) + startRenameFlow(target) + } + + private func startRenameFlow(_ target: CommandPaletteRenameTarget) { + commandPaletteRenameDraft = target.currentName + commandPaletteMode = .renameInput(target) + resetCommandPaletteRenameFocus() + syncCommandPaletteDebugStateForObservedWindow() + } + + private func continueRenameFlow(target: CommandPaletteRenameTarget) { + guard case .renameInput(let activeTarget) = commandPaletteMode, + activeTarget == target else { return } + applyRenameFlow(target: target, proposedName: commandPaletteRenameDraft) + } + + private func applyRenameFlow(target: CommandPaletteRenameTarget, proposedName: String) { + let trimmedName = proposedName.trimmingCharacters(in: .whitespacesAndNewlines) + let normalizedName: String? = trimmedName.isEmpty ? nil : trimmedName + + switch target.kind { + case .workspace(let workspaceId): + tabManager.setCustomTitle(tabId: workspaceId, title: normalizedName) + case .tab(let workspaceId, let panelId): + guard let workspace = tabManager.tabs.first(where: { $0.id == workspaceId }) else { + NSSound.beep() + return + } + workspace.setPanelCustomTitle(panelId: panelId, title: normalizedName) + } + + dismissCommandPalette() + } + + private func focusFocusedBrowserAddressBar() -> Bool { + guard let panel = tabManager.focusedBrowserPanel else { return false } + _ = panel.requestAddressBarFocus() + NotificationCenter.default.post(name: .browserFocusAddressBar, object: panel.id) + return true + } + + private func openFocusedBrowserInDefaultBrowser() -> Bool { + guard let panel = tabManager.focusedBrowserPanel, + let rawURL = panel.preferredURLStringForOmnibar(), + let url = URL(string: rawURL), + let scheme = url.scheme?.lowercased(), + scheme == "http" || scheme == "https" else { + return false + } + return NSWorkspace.shared.open(url) + } + + private func openFocusedDirectoryInDefaultApp() -> Bool { + guard let directoryURL = focusedTerminalDirectoryURL() else { return false } + return NSWorkspace.shared.open(directoryURL) + } + + private func focusedTerminalDirectoryURL() -> URL? { + guard let workspace = tabManager.selectedWorkspace else { return nil } + let rawDirectory: String = { + if let focusedPanelId = workspace.focusedPanelId, + let directory = workspace.panelDirectories[focusedPanelId] { + return directory + } + return workspace.currentDirectory + }() + let trimmed = rawDirectory.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return nil } + guard FileManager.default.fileExists(atPath: trimmed) else { return nil } + return URL(fileURLWithPath: trimmed, isDirectory: true) + } + #if DEBUG private func debugShortWorkspaceId(_ id: UUID?) -> String { guard let id else { return "nil" } @@ -1765,6 +4289,572 @@ struct ContentView: View { #endif } +struct CommandPaletteSwitcherSearchMetadata { + let directories: [String] + let branches: [String] + let ports: [Int] + + init( + directories: [String] = [], + branches: [String] = [], + ports: [Int] = [] + ) { + self.directories = directories + self.branches = branches + self.ports = ports + } +} + +enum CommandPaletteSwitcherSearchIndexer { + enum MetadataDetail { + case workspace + case surface + } + + private static let metadataDelimiters = CharacterSet(charactersIn: "/\\.:_- ") + + static func keywords( + baseKeywords: [String], + metadata: CommandPaletteSwitcherSearchMetadata, + detail: MetadataDetail = .surface + ) -> [String] { + let metadataKeywords = metadataKeywordsForSearch(metadata, detail: detail) + return uniqueNormalizedPreservingOrder(baseKeywords + metadataKeywords) + } + + private static func metadataKeywordsForSearch( + _ metadata: CommandPaletteSwitcherSearchMetadata, + detail: MetadataDetail + ) -> [String] { + let directoryTokens = metadata.directories.flatMap { directoryTokensForSearch($0, detail: detail) } + let branchTokens = metadata.branches.flatMap { branchTokensForSearch($0, detail: detail) } + let portTokens = metadata.ports.flatMap(portTokensForSearch) + + var contextKeywords: [String] = [] + if !directoryTokens.isEmpty { + contextKeywords.append(contentsOf: ["directory", "dir", "cwd", "path"]) + } + if !branchTokens.isEmpty { + contextKeywords.append(contentsOf: ["branch", "git"]) + } + if !portTokens.isEmpty { + contextKeywords.append(contentsOf: ["port", "ports"]) + } + + return contextKeywords + directoryTokens + branchTokens + portTokens + } + + private static func directoryTokensForSearch( + _ rawDirectory: String, + detail: MetadataDetail + ) -> [String] { + let trimmed = rawDirectory.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return [] } + + let standardized = (trimmed as NSString).standardizingPath + let canonical = standardized.isEmpty ? trimmed : standardized + let abbreviated = (canonical as NSString).abbreviatingWithTildeInPath + switch detail { + case .workspace: + return uniqueNormalizedPreservingOrder([trimmed, canonical, abbreviated]) + case .surface: + let basename = URL(fileURLWithPath: canonical, isDirectory: true).lastPathComponent + let components = canonical.components(separatedBy: metadataDelimiters).filter { !$0.isEmpty } + return uniqueNormalizedPreservingOrder( + [trimmed, canonical, abbreviated, basename] + components + ) + } + } + + private static func branchTokensForSearch( + _ rawBranch: String, + detail: MetadataDetail + ) -> [String] { + let trimmed = rawBranch.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return [] } + switch detail { + case .workspace: + return [trimmed] + case .surface: + let components = trimmed.components(separatedBy: metadataDelimiters).filter { !$0.isEmpty } + return uniqueNormalizedPreservingOrder([trimmed] + components) + } + } + + private static func portTokensForSearch(_ port: Int) -> [String] { + guard (1...65535).contains(port) else { return [] } + let portText = String(port) + return [portText, ":\(portText)"] + } + + private static func uniqueNormalizedPreservingOrder(_ values: [String]) -> [String] { + var result: [String] = [] + var seen: Set<String> = [] + result.reserveCapacity(values.count) + + for value in values { + let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { continue } + let normalizedKey = trimmed + .folding(options: [.diacriticInsensitive, .caseInsensitive], locale: .current) + .lowercased() + guard seen.insert(normalizedKey).inserted else { continue } + result.append(trimmed) + } + return result + } +} + +enum CommandPaletteFuzzyMatcher { + private static let tokenBoundaryChars: Set<Character> = [" ", "-", "_", "/", ".", ":"] + + static func score(query: String, candidate: String) -> Int? { + score(query: query, candidates: [candidate]) + } + + static func score(query: String, candidates: [String]) -> Int? { + let normalizedQuery = normalize(query) + guard !normalizedQuery.isEmpty else { return 0 } + let tokens = normalizedQuery.split(separator: " ").map(String.init).filter { !$0.isEmpty } + guard !tokens.isEmpty else { return 0 } + + let normalizedCandidates = candidates + .map(normalize) + .filter { !$0.isEmpty } + guard !normalizedCandidates.isEmpty else { return nil } + + var totalScore = 0 + for token in tokens { + var bestTokenScore: Int? + for candidate in normalizedCandidates { + guard let candidateScore = scoreToken(token, in: candidate) else { continue } + bestTokenScore = max(bestTokenScore ?? candidateScore, candidateScore) + } + guard let bestTokenScore else { return nil } + totalScore += bestTokenScore + } + return totalScore + } + + static func matchCharacterIndices(query: String, candidate: String) -> Set<Int> { + let normalizedQuery = normalize(query) + guard !normalizedQuery.isEmpty else { return [] } + + let tokens = normalizedQuery.split(separator: " ").map(String.init).filter { !$0.isEmpty } + guard !tokens.isEmpty else { return [] } + + let loweredCandidate = normalize(candidate) + guard !loweredCandidate.isEmpty else { return [] } + + let candidateChars = Array(loweredCandidate) + var matched: Set<Int> = [] + + for token in tokens { + if token == loweredCandidate { + matched.formUnion(0..<candidateChars.count) + continue + } + + if loweredCandidate.hasPrefix(token) { + matched.formUnion(0..<min(token.count, candidateChars.count)) + continue + } + + if let range = loweredCandidate.range(of: token) { + let start = loweredCandidate.distance(from: loweredCandidate.startIndex, to: range.lowerBound) + let end = min(candidateChars.count, start + token.count) + matched.formUnion(start..<end) + continue + } + + if let initialism = initialismMatchIndices(token: token, candidate: loweredCandidate) { + matched.formUnion(initialism) + continue + } + + if let stitched = stitchedWordPrefixMatchIndices(token: token, candidate: loweredCandidate) { + matched.formUnion(stitched) + continue + } + + guard token.count <= 3 else { continue } + if let subsequence = subsequenceMatchIndices(token: token, candidate: loweredCandidate) { + matched.formUnion(subsequence) + } + } + + return matched + } + + private static func normalize(_ text: String) -> String { + text + .trimmingCharacters(in: .whitespacesAndNewlines) + .folding(options: [.diacriticInsensitive, .caseInsensitive], locale: .current) + .lowercased() + } + + private static func scoreToken(_ token: String, in candidate: String) -> Int? { + guard !token.isEmpty else { return 0 } + + let candidateChars = Array(candidate) + let tokenChars = Array(token) + guard tokenChars.count <= candidateChars.count else { return nil } + + if token == candidate { + return 8000 + } + if candidate.hasPrefix(token) { + return 6800 - max(0, candidate.count - token.count) + } + + var bestScore: Int? + if let wordExactScore = bestWordScore(tokenChars: tokenChars, candidateChars: candidateChars, requireExactWord: true) { + bestScore = max(bestScore ?? wordExactScore, wordExactScore) + } + if let wordPrefixScore = bestWordScore(tokenChars: tokenChars, candidateChars: candidateChars, requireExactWord: false) { + bestScore = max(bestScore ?? wordPrefixScore, wordPrefixScore) + } + + if let range = candidate.range(of: token) { + let distance = candidate.distance(from: candidate.startIndex, to: range.lowerBound) + let lengthPenalty = max(0, candidate.count - token.count) + let boundaryBoost: Int = { + guard distance > 0 else { return 220 } + let prior = candidateChars[distance - 1] + return tokenBoundaryChars.contains(prior) ? 180 : 0 + }() + let containsScore = 4200 + boundaryBoost - (distance * 9) - lengthPenalty + bestScore = max(bestScore ?? containsScore, containsScore) + } + + if let initialismScore = initialismScore(tokenChars: tokenChars, candidateChars: candidateChars) { + bestScore = max(bestScore ?? initialismScore, initialismScore) + } + + if let stitchedScore = stitchedWordPrefixScore(tokenChars: tokenChars, candidateChars: candidateChars) { + bestScore = max(bestScore ?? stitchedScore, stitchedScore) + } + + if tokenChars.count <= 3, let subsequence = subsequenceScore(token: token, candidate: candidate) { + bestScore = max(bestScore ?? subsequence, subsequence) + } + + guard let bestScore else { return nil } + return max(1, bestScore) + } + + private static func bestWordScore( + tokenChars: [Character], + candidateChars: [Character], + requireExactWord: Bool + ) -> Int? { + guard !tokenChars.isEmpty else { return nil } + + var best: Int? + for segment in wordSegments(candidateChars) { + let wordLength = segment.end - segment.start + guard tokenChars.count <= wordLength else { continue } + + var matchesPrefix = true + for offset in 0..<tokenChars.count where candidateChars[segment.start + offset] != tokenChars[offset] { + matchesPrefix = false + break + } + guard matchesPrefix else { continue } + if requireExactWord && tokenChars.count != wordLength { continue } + + let lengthPenalty = max(0, wordLength - tokenChars.count) * 6 + let distancePenalty = segment.start * 8 + let trailingPenalty = max(0, candidateChars.count - wordLength) + let scoreBase = requireExactWord ? 6200 : 5600 + let score = scoreBase - distancePenalty - lengthPenalty - trailingPenalty + best = max(best ?? score, score) + } + + return best + } + + private static func initialismScore(tokenChars: [Character], candidateChars: [Character]) -> Int? { + guard !tokenChars.isEmpty else { return nil } + let segments = wordSegments(candidateChars) + guard tokenChars.count <= segments.count else { return nil } + + var matchedStarts: [Int] = [] + var searchWordIndex = 0 + + for tokenChar in tokenChars { + var found = false + while searchWordIndex < segments.count { + let segment = segments[searchWordIndex] + searchWordIndex += 1 + if candidateChars[segment.start] == tokenChar { + matchedStarts.append(segment.start) + found = true + break + } + } + if !found { return nil } + } + + let firstStart = matchedStarts.first ?? 0 + let skippedWords = max(0, segments.count - tokenChars.count) + return 3000 + (tokenChars.count * 160) - (firstStart * 5) - (skippedWords * 30) + } + + private static func tokenPrefixMatches( + tokenChars: [Character], + tokenStart: Int, + length: Int, + candidateChars: [Character], + candidateStart: Int + ) -> Bool { + guard length > 0 else { return false } + guard tokenStart + length <= tokenChars.count else { return false } + guard candidateStart + length <= candidateChars.count else { return false } + + for offset in 0..<length where tokenChars[tokenStart + offset] != candidateChars[candidateStart + offset] { + return false + } + return true + } + + private static func stitchedWordPrefixScore(tokenChars: [Character], candidateChars: [Character]) -> Int? { + guard tokenChars.count >= 4 else { return nil } + let segments = wordSegments(candidateChars) + guard segments.count >= 2 else { return nil } + + struct StitchState: Hashable { + let tokenIndex: Int + let wordIndex: Int + let usedWords: Int + } + + var memo: [StitchState: Int?] = [:] + + func dfs(tokenIndex: Int, wordIndex: Int, usedWords: Int) -> Int? { + if tokenIndex == tokenChars.count { + return usedWords >= 2 ? 0 : nil + } + guard wordIndex < segments.count else { return nil } + + let state = StitchState(tokenIndex: tokenIndex, wordIndex: wordIndex, usedWords: usedWords) + if let cached = memo[state] { + return cached + } + + var best: Int? + let remainingChars = tokenChars.count - tokenIndex + for segmentIndex in wordIndex..<segments.count { + let segment = segments[segmentIndex] + let segmentLength = segment.end - segment.start + let maxChunk = min(segmentLength, remainingChars) + guard maxChunk > 0 else { continue } + + let skippedWords = max(0, segmentIndex - wordIndex) + let skipPenalty = skippedWords * 120 + for chunkLength in stride(from: maxChunk, through: 1, by: -1) { + guard tokenPrefixMatches( + tokenChars: tokenChars, + tokenStart: tokenIndex, + length: chunkLength, + candidateChars: candidateChars, + candidateStart: segment.start + ) else { + continue + } + guard let suffixScore = dfs( + tokenIndex: tokenIndex + chunkLength, + wordIndex: segmentIndex + 1, + usedWords: min(2, usedWords + 1) + ) else { + continue + } + + let chunkCoverage = chunkLength * 220 + let contiguityBonus = segmentIndex == wordIndex ? 80 : 0 + let segmentRemainderPenalty = max(0, segmentLength - chunkLength) * 9 + let distancePenalty = segment.start * 4 + let chunkScore = chunkCoverage + contiguityBonus - segmentRemainderPenalty - distancePenalty - skipPenalty + let totalScore = suffixScore + chunkScore + best = max(best ?? totalScore, totalScore) + } + } + + memo[state] = best + return best + } + + guard let stitchedScore = dfs(tokenIndex: 0, wordIndex: 0, usedWords: 0) else { return nil } + let lengthPenalty = max(0, candidateChars.count - tokenChars.count) + return 3500 + stitchedScore - lengthPenalty + } + + private static func stitchedWordPrefixMatchIndices(token: String, candidate: String) -> Set<Int>? { + let tokenChars = Array(token) + let candidateChars = Array(candidate) + guard tokenChars.count >= 4 else { return nil } + + let segments = wordSegments(candidateChars) + guard segments.count >= 2 else { return nil } + + var tokenIndex = 0 + var nextWordIndex = 0 + var usedWords = 0 + var matchedIndices: Set<Int> = [] + + while tokenIndex < tokenChars.count { + let remainingChars = tokenChars.count - tokenIndex + var foundMatch = false + + for segmentIndex in nextWordIndex..<segments.count { + let segment = segments[segmentIndex] + let segmentLength = segment.end - segment.start + let maxChunk = min(segmentLength, remainingChars) + guard maxChunk > 0 else { continue } + + for chunkLength in stride(from: maxChunk, through: 1, by: -1) { + guard tokenPrefixMatches( + tokenChars: tokenChars, + tokenStart: tokenIndex, + length: chunkLength, + candidateChars: candidateChars, + candidateStart: segment.start + ) else { + continue + } + + matchedIndices.formUnion(segment.start..<(segment.start + chunkLength)) + tokenIndex += chunkLength + nextWordIndex = segmentIndex + 1 + usedWords += 1 + foundMatch = true + break + } + + if foundMatch { break } + } + + if !foundMatch { return nil } + } + + guard usedWords >= 2 else { return nil } + return matchedIndices + } + + private static func wordSegments(_ candidateChars: [Character]) -> [(start: Int, end: Int)] { + var segments: [(start: Int, end: Int)] = [] + var index = 0 + + while index < candidateChars.count { + while index < candidateChars.count, tokenBoundaryChars.contains(candidateChars[index]) { + index += 1 + } + guard index < candidateChars.count else { break } + let start = index + while index < candidateChars.count, !tokenBoundaryChars.contains(candidateChars[index]) { + index += 1 + } + segments.append((start: start, end: index)) + } + + return segments + } + + private static func subsequenceScore(token: String, candidate: String) -> Int? { + let tokenChars = Array(token) + let candidateChars = Array(candidate) + guard tokenChars.count <= candidateChars.count else { return nil } + + var searchIndex = 0 + var previousMatch = -1 + var consecutiveRun = 0 + var score = 0 + + for tokenChar in tokenChars { + var foundIndex: Int? + while searchIndex < candidateChars.count { + if candidateChars[searchIndex] == tokenChar { + foundIndex = searchIndex + break + } + searchIndex += 1 + } + guard let matchedIndex = foundIndex else { return nil } + + score += 90 + if matchedIndex == 0 || tokenBoundaryChars.contains(candidateChars[matchedIndex - 1]) { + score += 140 + } + if matchedIndex == previousMatch + 1 { + consecutiveRun += 1 + score += min(200, consecutiveRun * 45) + } else { + consecutiveRun = 0 + score -= min(120, max(0, matchedIndex - previousMatch - 1) * 4) + } + + previousMatch = matchedIndex + searchIndex = matchedIndex + 1 + } + + score -= max(0, candidateChars.count - tokenChars.count) + return max(1, score) + } + + private static func subsequenceMatchIndices(token: String, candidate: String) -> Set<Int>? { + let tokenChars = Array(token) + let candidateChars = Array(candidate) + guard tokenChars.count <= candidateChars.count else { return nil } + + var indices: Set<Int> = [] + var searchIndex = 0 + + for tokenChar in tokenChars { + var foundIndex: Int? + while searchIndex < candidateChars.count { + if candidateChars[searchIndex] == tokenChar { + foundIndex = searchIndex + break + } + searchIndex += 1 + } + guard let matchIndex = foundIndex else { return nil } + indices.insert(matchIndex) + searchIndex = matchIndex + 1 + } + + return indices + } + + private static func initialismMatchIndices(token: String, candidate: String) -> Set<Int>? { + let tokenChars = Array(token) + let candidateChars = Array(candidate) + guard !tokenChars.isEmpty else { return nil } + + let segments = wordSegments(candidateChars) + guard tokenChars.count <= segments.count else { return nil } + + var matched: Set<Int> = [] + var searchWordIndex = 0 + + for tokenChar in tokenChars { + var found = false + while searchWordIndex < segments.count { + let segment = segments[searchWordIndex] + searchWordIndex += 1 + if candidateChars[segment.start] == tokenChar { + matched.insert(segment.start) + found = true + break + } + } + if !found { return nil } + } + + return matched + } +} + private struct SidebarResizerAccessibilityModifier: ViewModifier { let accessibilityIdentifier: String? diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index ba6c3261..4dbd0a23 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -1450,7 +1450,11 @@ class TabManager: ObservableObject { } func focusTab(_ tabId: UUID, surfaceId: UUID? = nil, suppressFlash: Bool = false) { - guard tabs.contains(where: { $0.id == tabId }) else { return } + guard let tab = tabs.first(where: { $0.id == tabId }) else { return } + if let surfaceId, tab.panels[surfaceId] != nil { + // Keep selected-surface intent stable across selectedTabId didSet async restore. + lastFocusedPanelByTab[tabId] = surfaceId + } selectedTabId = tabId NotificationCenter.default.post( name: .ghosttyDidFocusTab, @@ -1469,7 +1473,7 @@ class TabManager: ObservableObject { if let surfaceId { if !suppressFlash { focusSurface(tabId: tabId, surfaceId: surfaceId) - } else if let tab = tabs.first(where: { $0.id == tabId }) { + } else { tab.focusPanel(surfaceId) } } @@ -3055,6 +3059,13 @@ enum ResizeDirection { } extension Notification.Name { + static let commandPaletteToggleRequested = Notification.Name("cmux.commandPaletteToggleRequested") + static let commandPaletteRequested = Notification.Name("cmux.commandPaletteRequested") + static let commandPaletteSwitcherRequested = Notification.Name("cmux.commandPaletteSwitcherRequested") + static let commandPaletteRenameTabRequested = Notification.Name("cmux.commandPaletteRenameTabRequested") + static let commandPaletteMoveSelection = Notification.Name("cmux.commandPaletteMoveSelection") + static let commandPaletteRenameInputInteractionRequested = Notification.Name("cmux.commandPaletteRenameInputInteractionRequested") + static let commandPaletteRenameInputDeleteBackwardRequested = Notification.Name("cmux.commandPaletteRenameInputDeleteBackwardRequested") static let ghosttyDidSetTitle = Notification.Name("ghosttyDidSetTitle") static let ghosttyDidFocusTab = Notification.Name("ghosttyDidFocusTab") static let ghosttyDidFocusSurface = Notification.Name("ghosttyDidFocusSurface") diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 3f61f26b..3622c596 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -45,6 +45,7 @@ class TerminalController { "browser.focus_webview", "browser.focus", "browser.tab.switch", + "debug.command_palette.toggle", "debug.notification.focus", "debug.app.activate" ] @@ -1279,6 +1280,26 @@ class TerminalController { return v2Result(id: id, self.v2DebugType(params: params)) case "debug.app.activate": return v2Result(id: id, self.v2DebugActivateApp()) + case "debug.command_palette.toggle": + return v2Result(id: id, self.v2DebugToggleCommandPalette(params: params)) + case "debug.command_palette.rename_tab.open": + return v2Result(id: id, self.v2DebugOpenCommandPaletteRenameTabInput(params: params)) + case "debug.command_palette.visible": + return v2Result(id: id, self.v2DebugCommandPaletteVisible(params: params)) + case "debug.command_palette.selection": + return v2Result(id: id, self.v2DebugCommandPaletteSelection(params: params)) + case "debug.command_palette.results": + return v2Result(id: id, self.v2DebugCommandPaletteResults(params: params)) + case "debug.command_palette.rename_input.interact": + return v2Result(id: id, self.v2DebugCommandPaletteRenameInputInteraction(params: params)) + case "debug.command_palette.rename_input.delete_backward": + return v2Result(id: id, self.v2DebugCommandPaletteRenameInputDeleteBackward(params: params)) + case "debug.command_palette.rename_input.selection": + return v2Result(id: id, self.v2DebugCommandPaletteRenameInputSelection(params: params)) + case "debug.command_palette.rename_input.select_all": + return v2Result(id: id, self.v2DebugCommandPaletteRenameInputSelectAll(params: params)) + case "debug.sidebar.visible": + return v2Result(id: id, self.v2DebugSidebarVisible(params: params)) case "debug.terminal.is_focused": return v2Result(id: id, self.v2DebugIsTerminalFocused(params: params)) case "debug.terminal.read_text": @@ -1475,6 +1496,16 @@ class TerminalController { "debug.shortcut.simulate", "debug.type", "debug.app.activate", + "debug.command_palette.toggle", + "debug.command_palette.rename_tab.open", + "debug.command_palette.visible", + "debug.command_palette.selection", + "debug.command_palette.results", + "debug.command_palette.rename_input.interact", + "debug.command_palette.rename_input.delete_backward", + "debug.command_palette.rename_input.selection", + "debug.command_palette.rename_input.select_all", + "debug.sidebar.visible", "debug.terminal.is_focused", "debug.terminal.read_text", "debug.terminal.render_stats", @@ -7564,6 +7595,268 @@ class TerminalController { return resp == "OK" ? .ok([:]) : .err(code: "internal_error", message: resp, data: nil) } + private func v2DebugToggleCommandPalette(params: [String: Any]) -> V2CallResult { + let requestedWindowId = v2UUID(params, "window_id") + var result: V2CallResult = .ok([:]) + DispatchQueue.main.sync { + let targetWindow: NSWindow? + if let requestedWindowId { + guard let window = AppDelegate.shared?.mainWindow(for: requestedWindowId) else { + result = .err( + code: "not_found", + message: "Window not found", + data: ["window_id": requestedWindowId.uuidString, "window_ref": v2Ref(kind: .window, uuid: requestedWindowId)] + ) + return + } + targetWindow = window + } else { + targetWindow = NSApp.keyWindow ?? NSApp.mainWindow + } + NotificationCenter.default.post(name: .commandPaletteToggleRequested, object: targetWindow) + } + return result + } + + private func v2DebugOpenCommandPaletteRenameTabInput(params: [String: Any]) -> V2CallResult { + let requestedWindowId = v2UUID(params, "window_id") + var result: V2CallResult = .ok([:]) + DispatchQueue.main.sync { + let targetWindow: NSWindow? + if let requestedWindowId { + guard let window = AppDelegate.shared?.mainWindow(for: requestedWindowId) else { + result = .err( + code: "not_found", + message: "Window not found", + data: [ + "window_id": requestedWindowId.uuidString, + "window_ref": v2Ref(kind: .window, uuid: requestedWindowId) + ] + ) + return + } + targetWindow = window + } else { + targetWindow = NSApp.keyWindow ?? NSApp.mainWindow + } + NotificationCenter.default.post(name: .commandPaletteRenameTabRequested, object: targetWindow) + } + return result + } + + private func v2DebugCommandPaletteVisible(params: [String: Any]) -> V2CallResult { + guard let windowId = v2UUID(params, "window_id") else { + return .err(code: "invalid_params", message: "Missing or invalid window_id", data: nil) + } + var visible = false + DispatchQueue.main.sync { + visible = AppDelegate.shared?.isCommandPaletteVisible(windowId: windowId) ?? false + } + return .ok([ + "window_id": windowId.uuidString, + "window_ref": v2Ref(kind: .window, uuid: windowId), + "visible": visible + ]) + } + + private func v2DebugCommandPaletteSelection(params: [String: Any]) -> V2CallResult { + guard let windowId = v2UUID(params, "window_id") else { + return .err(code: "invalid_params", message: "Missing or invalid window_id", data: nil) + } + var visible = false + var selectedIndex = 0 + DispatchQueue.main.sync { + visible = AppDelegate.shared?.isCommandPaletteVisible(windowId: windowId) ?? false + selectedIndex = AppDelegate.shared?.commandPaletteSelectionIndex(windowId: windowId) ?? 0 + } + return .ok([ + "window_id": windowId.uuidString, + "window_ref": v2Ref(kind: .window, uuid: windowId), + "visible": visible, + "selected_index": max(0, selectedIndex) + ]) + } + + private func v2DebugCommandPaletteResults(params: [String: Any]) -> V2CallResult { + guard let windowId = v2UUID(params, "window_id") else { + return .err(code: "invalid_params", message: "Missing or invalid window_id", data: nil) + } + let requestedLimit = params["limit"] as? Int + let limit = max(1, min(100, requestedLimit ?? 20)) + + var visible = false + var selectedIndex = 0 + var snapshot = CommandPaletteDebugSnapshot.empty + + DispatchQueue.main.sync { + visible = AppDelegate.shared?.isCommandPaletteVisible(windowId: windowId) ?? false + selectedIndex = AppDelegate.shared?.commandPaletteSelectionIndex(windowId: windowId) ?? 0 + snapshot = AppDelegate.shared?.commandPaletteSnapshot(windowId: windowId) ?? .empty + } + + let rows = Array(snapshot.results.prefix(limit)).map { row in + [ + "command_id": row.commandId, + "title": row.title, + "shortcut_hint": v2OrNull(row.shortcutHint), + "trailing_label": v2OrNull(row.trailingLabel), + "score": row.score + ] as [String: Any] + } + + return .ok([ + "window_id": windowId.uuidString, + "window_ref": v2Ref(kind: .window, uuid: windowId), + "visible": visible, + "selected_index": max(0, selectedIndex), + "query": snapshot.query, + "mode": snapshot.mode, + "results": rows + ]) + } + + private func v2DebugCommandPaletteRenameInputInteraction(params: [String: Any]) -> V2CallResult { + let requestedWindowId = v2UUID(params, "window_id") + var result: V2CallResult = .ok([:]) + DispatchQueue.main.sync { + let targetWindow: NSWindow? + if let requestedWindowId { + guard let window = AppDelegate.shared?.mainWindow(for: requestedWindowId) else { + result = .err( + code: "not_found", + message: "Window not found", + data: [ + "window_id": requestedWindowId.uuidString, + "window_ref": v2Ref(kind: .window, uuid: requestedWindowId) + ] + ) + return + } + targetWindow = window + } else { + targetWindow = NSApp.keyWindow ?? NSApp.mainWindow + } + NotificationCenter.default.post(name: .commandPaletteRenameInputInteractionRequested, object: targetWindow) + } + return result + } + + private func v2DebugCommandPaletteRenameInputDeleteBackward(params: [String: Any]) -> V2CallResult { + let requestedWindowId = v2UUID(params, "window_id") + var result: V2CallResult = .ok([:]) + DispatchQueue.main.sync { + let targetWindow: NSWindow? + if let requestedWindowId { + guard let window = AppDelegate.shared?.mainWindow(for: requestedWindowId) else { + result = .err( + code: "not_found", + message: "Window not found", + data: [ + "window_id": requestedWindowId.uuidString, + "window_ref": v2Ref(kind: .window, uuid: requestedWindowId) + ] + ) + return + } + targetWindow = window + } else { + targetWindow = NSApp.keyWindow ?? NSApp.mainWindow + } + NotificationCenter.default.post(name: .commandPaletteRenameInputDeleteBackwardRequested, object: targetWindow) + } + return result + } + + private func v2DebugCommandPaletteRenameInputSelection(params: [String: Any]) -> V2CallResult { + guard let windowId = v2UUID(params, "window_id") else { + return .err(code: "invalid_params", message: "Missing or invalid window_id", data: nil) + } + + var result: V2CallResult = .ok([ + "window_id": windowId.uuidString, + "window_ref": v2Ref(kind: .window, uuid: windowId), + "focused": false, + "selection_location": 0, + "selection_length": 0, + "text_length": 0 + ]) + + DispatchQueue.main.sync { + guard let window = AppDelegate.shared?.mainWindow(for: windowId) else { + result = .err( + code: "not_found", + message: "Window not found", + data: ["window_id": windowId.uuidString, "window_ref": v2Ref(kind: .window, uuid: windowId)] + ) + return + } + guard let editor = window.firstResponder as? NSTextView, editor.isFieldEditor else { + return + } + let selectedRange = editor.selectedRange() + let textLength = (editor.string as NSString).length + result = .ok([ + "window_id": windowId.uuidString, + "window_ref": v2Ref(kind: .window, uuid: windowId), + "focused": true, + "selection_location": max(0, selectedRange.location), + "selection_length": max(0, selectedRange.length), + "text_length": max(0, textLength) + ]) + } + + return result + } + + private func v2DebugCommandPaletteRenameInputSelectAll(params: [String: Any]) -> V2CallResult { + if let rawEnabled = params["enabled"] { + guard let enabled = rawEnabled as? Bool else { + return .err( + code: "invalid_params", + message: "enabled must be a bool", + data: ["enabled": rawEnabled] + ) + } + DispatchQueue.main.sync { + UserDefaults.standard.set( + enabled, + forKey: CommandPaletteRenameSelectionSettings.selectAllOnFocusKey + ) + } + } + + var enabled = CommandPaletteRenameSelectionSettings.defaultSelectAllOnFocus + DispatchQueue.main.sync { + enabled = CommandPaletteRenameSelectionSettings.selectAllOnFocusEnabled() + } + + return .ok([ + "enabled": enabled + ]) + } + + private func v2DebugSidebarVisible(params: [String: Any]) -> V2CallResult { + guard let windowId = v2UUID(params, "window_id") else { + return .err(code: "invalid_params", message: "Missing or invalid window_id", data: nil) + } + var visibility: Bool? + DispatchQueue.main.sync { + visibility = AppDelegate.shared?.sidebarVisibility(windowId: windowId) + } + guard let visible = visibility else { + return .err( + code: "not_found", + message: "Window not found", + data: ["window_id": windowId.uuidString, "window_ref": v2Ref(kind: .window, uuid: windowId)] + ) + } + return .ok([ + "window_id": windowId.uuidString, + "window_ref": v2Ref(kind: .window, uuid: windowId), + "visible": visible + ]) + } + private func v2DebugIsTerminalFocused(params: [String: Any]) -> V2CallResult { guard let surfaceId = v2String(params, "surface_id") else { return .err(code: "invalid_params", message: "Missing surface_id", data: nil) @@ -8003,17 +8296,24 @@ class TerminalController { var result = "ERROR: Failed to create event" DispatchQueue.main.sync { - // Tests can run while the app is activating (no keyWindow yet). Prefer a visible - // window to keep input simulation deterministic in debug builds. - let targetWindow = NSApp.keyWindow - ?? NSApp.mainWindow - ?? NSApp.windows.first(where: { $0.isVisible }) - ?? NSApp.windows.first + // Prefer the current active-tab-manager window so shortcut simulation stays + // scoped to the intended window even when NSApp.keyWindow is stale. + let targetWindow: NSWindow? = { + if let activeTabManager = self.tabManager, + let windowId = AppDelegate.shared?.windowId(for: activeTabManager), + let window = AppDelegate.shared?.mainWindow(for: windowId) { + return window + } + return NSApp.keyWindow + ?? NSApp.mainWindow + ?? NSApp.windows.first(where: { $0.isVisible }) + ?? NSApp.windows.first + }() if let targetWindow { NSApp.activate(ignoringOtherApps: true) targetWindow.makeKeyAndOrderFront(nil) } - let windowNumber = (NSApp.keyWindow ?? targetWindow)?.windowNumber ?? 0 + let windowNumber = targetWindow?.windowNumber ?? 0 guard let keyDownEvent = NSEvent.keyEvent( with: .keyDown, location: .zero, @@ -8706,6 +9006,10 @@ class TerminalController { let charactersIgnoringModifiers: String switch keyToken.lowercased() { + case "esc", "escape": + storedKey = "\u{1b}" + keyCode = UInt16(kVK_Escape) + charactersIgnoringModifiers = storedKey case "left": storedKey = "←" keyCode = 123 @@ -8726,6 +9030,10 @@ class TerminalController { storedKey = "\r" keyCode = UInt16(kVK_Return) charactersIgnoringModifiers = storedKey + case "backspace", "delete", "del": + storedKey = "\u{7f}" + keyCode = UInt16(kVK_Delete) + charactersIgnoringModifiers = storedKey default: let key = keyToken.lowercased() guard let code = keyCodeForShortcutKey(key) else { return nil } diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 091d274e..a5950c24 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -363,6 +363,20 @@ struct cmuxApp: App { // Close tab/workspace CommandGroup(after: .newItem) { + Button("Go to Workspace or Tab…") { + let targetWindow = NSApp.keyWindow ?? NSApp.mainWindow + NotificationCenter.default.post(name: .commandPaletteSwitcherRequested, object: targetWindow) + } + .keyboardShortcut("p", modifiers: [.command]) + + Button("Command Palette…") { + let targetWindow = NSApp.keyWindow ?? NSApp.mainWindow + NotificationCenter.default.post(name: .commandPaletteRequested, object: targetWindow) + } + .keyboardShortcut("p", modifiers: [.command, .shift]) + + Divider() + // Terminal semantics: // Cmd+W closes the focused tab (with confirmation if needed). If this is the last // tab in the last workspace, it closes the window. @@ -422,7 +436,9 @@ struct cmuxApp: App { // Tab navigation CommandGroup(after: .toolbar) { splitCommandButton(title: "Toggle Sidebar", shortcut: toggleSidebarMenuShortcut) { - sidebarState.toggle() + if AppDelegate.shared?.toggleSidebarInActiveMainWindow() != true { + sidebarState.toggle() + } } Divider() @@ -2533,6 +2549,18 @@ enum QuitWarningSettings { } } +enum CommandPaletteRenameSelectionSettings { + static let selectAllOnFocusKey = "commandPalette.renameSelectAllOnFocus" + static let defaultSelectAllOnFocus = true + + static func selectAllOnFocusEnabled(defaults: UserDefaults = .standard) -> Bool { + if defaults.object(forKey: selectAllOnFocusKey) == nil { + return defaultSelectAllOnFocus + } + return defaults.bool(forKey: selectAllOnFocusKey) + } +} + enum ClaudeCodeIntegrationSettings { static let hooksEnabledKey = "claudeCodeHooksEnabled" static let defaultHooksEnabled = true @@ -2565,6 +2593,8 @@ struct SettingsView: View { @AppStorage(BrowserInsecureHTTPSettings.allowlistKey) private var browserInsecureHTTPAllowlist = BrowserInsecureHTTPSettings.defaultAllowlistText @AppStorage(NotificationBadgeSettings.dockBadgeEnabledKey) private var notificationDockBadgeEnabled = NotificationBadgeSettings.defaultDockBadgeEnabled @AppStorage(QuitWarningSettings.warnBeforeQuitKey) private var warnBeforeQuitShortcut = QuitWarningSettings.defaultWarnBeforeQuit + @AppStorage(CommandPaletteRenameSelectionSettings.selectAllOnFocusKey) + private var commandPaletteRenameSelectAllOnFocus = CommandPaletteRenameSelectionSettings.defaultSelectAllOnFocus @AppStorage(WorkspacePlacementSettings.placementKey) private var newWorkspacePlacement = WorkspacePlacementSettings.defaultPlacement.rawValue @AppStorage(WorkspaceAutoReorderSettings.key) private var workspaceAutoReorder = WorkspaceAutoReorderSettings.defaultValue @AppStorage(SidebarBranchLayoutSettings.key) private var sidebarBranchVerticalLayout = SidebarBranchLayoutSettings.defaultVerticalLayout @@ -2761,6 +2791,19 @@ struct SettingsView: View { SettingsCardDivider() + SettingsCardRow( + "Rename Selects Existing Name", + subtitle: commandPaletteRenameSelectAllOnFocus + ? "Command Palette rename starts with all text selected." + : "Command Palette rename keeps the caret at the end." + ) { + Toggle("", isOn: $commandPaletteRenameSelectAllOnFocus) + .labelsHidden() + .controlSize(.small) + } + + SettingsCardDivider() + SettingsCardRow( "Sidebar Branch Layout", subtitle: sidebarBranchVerticalLayout @@ -3310,6 +3353,7 @@ struct SettingsView: View { browserInsecureHTTPAllowlistDraft = BrowserInsecureHTTPSettings.defaultAllowlistText notificationDockBadgeEnabled = NotificationBadgeSettings.defaultDockBadgeEnabled warnBeforeQuitShortcut = QuitWarningSettings.defaultWarnBeforeQuit + commandPaletteRenameSelectAllOnFocus = CommandPaletteRenameSelectionSettings.defaultSelectAllOnFocus newWorkspacePlacement = WorkspacePlacementSettings.defaultPlacement.rawValue workspaceAutoReorder = WorkspaceAutoReorderSettings.defaultValue sidebarBranchVerticalLayout = SidebarBranchLayoutSettings.defaultVerticalLayout diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 05af20eb..a9a8eba6 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1125,6 +1125,267 @@ final class BrowserZoomShortcutRoutingPolicyTests: XCTestCase { } } +final class CommandPaletteKeyboardNavigationTests: XCTestCase { + func testArrowKeysMoveSelectionWithoutModifiers() { + XCTAssertEqual( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [], + chars: "", + keyCode: 125 + ), + 1 + ) + XCTAssertEqual( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [], + chars: "", + keyCode: 126 + ), + -1 + ) + XCTAssertNil( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.shift], + chars: "", + keyCode: 125 + ) + ) + } + + func testControlLetterNavigationSupportsPrintableAndControlChars() { + XCTAssertEqual( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.control], + chars: "n", + keyCode: 45 + ), + 1 + ) + XCTAssertEqual( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.control], + chars: "\u{0e}", + keyCode: 45 + ), + 1 + ) + XCTAssertEqual( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.control], + chars: "p", + keyCode: 35 + ), + -1 + ) + XCTAssertEqual( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.control], + chars: "\u{10}", + keyCode: 35 + ), + -1 + ) + XCTAssertEqual( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.control], + chars: "j", + keyCode: 38 + ), + 1 + ) + XCTAssertEqual( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.control], + chars: "\u{0a}", + keyCode: 38 + ), + 1 + ) + XCTAssertEqual( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.control], + chars: "k", + keyCode: 40 + ), + -1 + ) + XCTAssertEqual( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.control], + chars: "\u{0b}", + keyCode: 40 + ), + -1 + ) + } + + func testIgnoresUnsupportedModifiersAndKeys() { + XCTAssertNil( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.command], + chars: "n", + keyCode: 45 + ) + ) + XCTAssertNil( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.control, .shift], + chars: "n", + keyCode: 45 + ) + ) + XCTAssertNil( + commandPaletteSelectionDeltaForKeyboardNavigation( + flags: [.control], + chars: "x", + keyCode: 7 + ) + ) + } +} + +final class CommandPaletteRenameSelectionSettingsTests: XCTestCase { + private let suiteName = "cmux.tests.commandPaletteRenameSelection.\(UUID().uuidString)" + + private func makeDefaults() -> UserDefaults { + let defaults = UserDefaults(suiteName: suiteName)! + defaults.removePersistentDomain(forName: suiteName) + return defaults + } + + func testDefaultsToSelectAllWhenUnset() { + let defaults = makeDefaults() + XCTAssertTrue(CommandPaletteRenameSelectionSettings.selectAllOnFocusEnabled(defaults: defaults)) + } + + func testReturnsFalseWhenStoredFalse() { + let defaults = makeDefaults() + defaults.set(false, forKey: CommandPaletteRenameSelectionSettings.selectAllOnFocusKey) + XCTAssertFalse(CommandPaletteRenameSelectionSettings.selectAllOnFocusEnabled(defaults: defaults)) + } + + func testReturnsTrueWhenStoredTrue() { + let defaults = makeDefaults() + defaults.set(true, forKey: CommandPaletteRenameSelectionSettings.selectAllOnFocusKey) + XCTAssertTrue(CommandPaletteRenameSelectionSettings.selectAllOnFocusEnabled(defaults: defaults)) + } +} + +final class CommandPaletteSelectionScrollBehaviorTests: XCTestCase { + func testFirstEntryAlwaysPinsToTopWhenScrollable() { + let anchor = ContentView.commandPaletteScrollAnchor( + selectedIndex: 0, + previousIndex: 1, + resultCount: 20, + selectedFrame: CGRect(x: 0, y: 8, width: 200, height: 24), + viewportHeight: 216, + contentHeight: 480 + ) + XCTAssertEqual(anchor, .top) + } + + func testLastEntryAlwaysPinsToBottomWhenScrollable() { + let anchor = ContentView.commandPaletteScrollAnchor( + selectedIndex: 19, + previousIndex: 18, + resultCount: 20, + selectedFrame: CGRect(x: 0, y: 188, width: 200, height: 24), + viewportHeight: 216, + contentHeight: 480 + ) + XCTAssertEqual(anchor, .bottom) + } + + func testFullyVisibleMiddleEntryDoesNotScroll() { + let anchor = ContentView.commandPaletteScrollAnchor( + selectedIndex: 6, + previousIndex: 5, + resultCount: 20, + selectedFrame: CGRect(x: 0, y: 120, width: 200, height: 24), + viewportHeight: 216, + contentHeight: 480 + ) + XCTAssertNil(anchor) + } + + func testOutOfViewMiddleEntryUsesDirectionForAnchor() { + let downAnchor = ContentView.commandPaletteScrollAnchor( + selectedIndex: 9, + previousIndex: 8, + resultCount: 20, + selectedFrame: CGRect(x: 0, y: 210, width: 200, height: 24), + viewportHeight: 216, + contentHeight: 480 + ) + XCTAssertEqual(downAnchor, .bottom) + + let upAnchor = ContentView.commandPaletteScrollAnchor( + selectedIndex: 8, + previousIndex: 9, + resultCount: 20, + selectedFrame: CGRect(x: 0, y: -6, width: 200, height: 24), + viewportHeight: 216, + contentHeight: 480 + ) + XCTAssertEqual(upAnchor, .top) + } +} + +final class CommandPaletteEdgeVisibilityCorrectionTests: XCTestCase { + func testTopEdgeReturnsTopWhenNotPinned() { + let anchor = ContentView.commandPaletteEdgeVisibilityCorrectionAnchor( + selectedIndex: 0, + resultCount: 20, + selectedFrame: CGRect(x: 0, y: 6, width: 200, height: 24), + viewportHeight: 216, + contentHeight: 480 + ) + XCTAssertEqual(anchor, .top) + } + + func testBottomEdgeReturnsBottomWhenNotPinned() { + let anchor = ContentView.commandPaletteEdgeVisibilityCorrectionAnchor( + selectedIndex: 19, + resultCount: 20, + selectedFrame: CGRect(x: 0, y: 170, width: 200, height: 24), + viewportHeight: 216, + contentHeight: 480 + ) + XCTAssertEqual(anchor, .bottom) + } + + func testPinnedTopAndBottomReturnNil() { + let topAnchor = ContentView.commandPaletteEdgeVisibilityCorrectionAnchor( + selectedIndex: 0, + resultCount: 20, + selectedFrame: CGRect(x: 0, y: 0, width: 200, height: 24), + viewportHeight: 216, + contentHeight: 480 + ) + XCTAssertNil(topAnchor) + + let bottomAnchor = ContentView.commandPaletteEdgeVisibilityCorrectionAnchor( + selectedIndex: 19, + resultCount: 20, + selectedFrame: CGRect(x: 0, y: 192, width: 200, height: 24), + viewportHeight: 216, + contentHeight: 480 + ) + XCTAssertNil(bottomAnchor) + } + + func testMiddleSelectionNeverForcesCorrection() { + let anchor = ContentView.commandPaletteEdgeVisibilityCorrectionAnchor( + selectedIndex: 8, + resultCount: 20, + selectedFrame: CGRect(x: 0, y: 96, width: 200, height: 24), + viewportHeight: 216, + contentHeight: 480 + ) + XCTAssertNil(anchor) + } +} + final class SidebarCommandHintPolicyTests: XCTestCase { func testCommandHintRequiresCommandOnlyModifier() { XCTAssertTrue(SidebarCommandHintPolicy.shouldShowHints(for: [.command])) diff --git a/cmuxTests/WorkspaceManualUnreadTests.swift b/cmuxTests/WorkspaceManualUnreadTests.swift index d5464d73..1610dc34 100644 --- a/cmuxTests/WorkspaceManualUnreadTests.swift +++ b/cmuxTests/WorkspaceManualUnreadTests.swift @@ -1,4 +1,5 @@ import XCTest +import AppKit #if canImport(cmux_DEV) @testable import cmux_DEV @@ -106,3 +107,333 @@ final class WorkspaceManualUnreadTests: XCTestCase { ) } } + +final class CommandPaletteFuzzyMatcherTests: XCTestCase { + func testExactMatchScoresHigherThanPrefixAndContains() { + let exact = CommandPaletteFuzzyMatcher.score(query: "rename tab", candidate: "rename tab") + let prefix = CommandPaletteFuzzyMatcher.score(query: "rename tab", candidate: "rename tab now") + let contains = CommandPaletteFuzzyMatcher.score(query: "rename tab", candidate: "command rename tab flow") + + XCTAssertNotNil(exact) + XCTAssertNotNil(prefix) + XCTAssertNotNil(contains) + XCTAssertGreaterThan(exact ?? 0, prefix ?? 0) + XCTAssertGreaterThan(prefix ?? 0, contains ?? 0) + } + + func testInitialismMatchReturnsScore() { + let score = CommandPaletteFuzzyMatcher.score(query: "ocdi", candidate: "open current directory in ide") + XCTAssertNotNil(score) + XCTAssertGreaterThan(score ?? 0, 0) + } + + func testLongTokenLooseSubsequenceDoesNotMatch() { + let score = CommandPaletteFuzzyMatcher.score(query: "rename", candidate: "open current directory in ide") + XCTAssertNil(score) + } + + func testStitchedWordPrefixMatchesRetabForRenameTab() { + let score = CommandPaletteFuzzyMatcher.score(query: "retab", candidate: "Rename Tab…") + XCTAssertNotNil(score) + XCTAssertGreaterThan(score ?? 0, 0) + } + + func testRetabPrefersRenameTabOverDistantTabWord() { + let renameTabScore = CommandPaletteFuzzyMatcher.score(query: "retab", candidate: "Rename Tab…") + let reopenTabScore = CommandPaletteFuzzyMatcher.score(query: "retab", candidate: "Reopen Closed Browser Tab") + + XCTAssertNotNil(renameTabScore) + XCTAssertNotNil(reopenTabScore) + XCTAssertGreaterThan(renameTabScore ?? 0, reopenTabScore ?? 0) + } + + func testRenameScoresHigherThanUnrelatedCommand() { + let renameScore = CommandPaletteFuzzyMatcher.score( + query: "rename", + candidates: ["Rename Tab…", "Tab • Terminal 1", "rename", "tab", "title"] + ) + let unrelatedScore = CommandPaletteFuzzyMatcher.score( + query: "rename", + candidates: [ + "Open Current Directory in IDE", + "Terminal • Terminal 1", + "terminal", + "directory", + "open", + "ide", + "code", + "default app" + ] + ) + + XCTAssertNotNil(renameScore) + XCTAssertNotNil(unrelatedScore) + XCTAssertGreaterThan(renameScore ?? 0, unrelatedScore ?? 0) + } + + func testTokenMatchingRequiresAllTokens() { + let match = CommandPaletteFuzzyMatcher.score( + query: "rename workspace", + candidates: ["Rename Workspace", "Workspace settings"] + ) + let miss = CommandPaletteFuzzyMatcher.score( + query: "rename workspace", + candidates: ["Rename Tab", "Tab settings"] + ) + + XCTAssertNotNil(match) + XCTAssertNil(miss) + } + + func testEmptyQueryReturnsZeroScore() { + let score = CommandPaletteFuzzyMatcher.score(query: " ", candidate: "anything") + XCTAssertEqual(score, 0) + } + + func testMatchCharacterIndicesForContainsMatch() { + let indices = CommandPaletteFuzzyMatcher.matchCharacterIndices( + query: "workspace", + candidate: "New Workspace" + ) + XCTAssertTrue(indices.contains(4)) + XCTAssertTrue(indices.contains(12)) + XCTAssertFalse(indices.contains(0)) + } + + func testMatchCharacterIndicesForSubsequenceMatch() { + let indices = CommandPaletteFuzzyMatcher.matchCharacterIndices( + query: "nws", + candidate: "New Workspace" + ) + XCTAssertTrue(indices.contains(0)) + XCTAssertTrue(indices.contains(2)) + XCTAssertTrue(indices.contains(8)) + } + + func testMatchCharacterIndicesForStitchedWordPrefixMatch() { + let indices = CommandPaletteFuzzyMatcher.matchCharacterIndices( + query: "retab", + candidate: "Rename Tab…" + ) + XCTAssertTrue(indices.contains(0)) + XCTAssertTrue(indices.contains(1)) + XCTAssertTrue(indices.contains(7)) + XCTAssertTrue(indices.contains(8)) + XCTAssertTrue(indices.contains(9)) + } +} + +final class CommandPaletteSwitcherSearchIndexerTests: XCTestCase { + func testKeywordsIncludeDirectoryBranchAndPortMetadata() { + let metadata = CommandPaletteSwitcherSearchMetadata( + directories: ["/Users/example/dev/cmuxterm-hq/worktrees/feat-cmd-palette"], + branches: ["feature/cmd-palette-indexing"], + ports: [3000, 9222] + ) + + let keywords = CommandPaletteSwitcherSearchIndexer.keywords( + baseKeywords: ["workspace", "switch"], + metadata: metadata + ) + + XCTAssertTrue(keywords.contains("/Users/example/dev/cmuxterm-hq/worktrees/feat-cmd-palette")) + XCTAssertTrue(keywords.contains("feat-cmd-palette")) + XCTAssertTrue(keywords.contains("feature/cmd-palette-indexing")) + XCTAssertTrue(keywords.contains("cmd-palette-indexing")) + XCTAssertTrue(keywords.contains("3000")) + XCTAssertTrue(keywords.contains(":9222")) + } + + func testFuzzyMatcherMatchesDirectoryBranchAndPortMetadata() { + let metadata = CommandPaletteSwitcherSearchMetadata( + directories: ["/tmp/cmuxterm/worktrees/issue-123-switcher-search"], + branches: ["fix/switcher-metadata"], + ports: [4317] + ) + + let candidates = CommandPaletteSwitcherSearchIndexer.keywords( + baseKeywords: ["workspace"], + metadata: metadata + ) + + XCTAssertNotNil(CommandPaletteFuzzyMatcher.score(query: "switcher-search", candidates: candidates)) + XCTAssertNotNil(CommandPaletteFuzzyMatcher.score(query: "switcher-metadata", candidates: candidates)) + XCTAssertNotNil(CommandPaletteFuzzyMatcher.score(query: "4317", candidates: candidates)) + } + + func testWorkspaceDetailOmitsSplitDirectoryAndBranchTokens() { + let metadata = CommandPaletteSwitcherSearchMetadata( + directories: ["/Users/example/dev/cmuxterm-hq/worktrees/feat-cmd-palette"], + branches: ["feature/cmd-palette-indexing"], + ports: [3000] + ) + + let keywords = CommandPaletteSwitcherSearchIndexer.keywords( + baseKeywords: ["workspace"], + metadata: metadata, + detail: .workspace + ) + + XCTAssertTrue(keywords.contains("/Users/example/dev/cmuxterm-hq/worktrees/feat-cmd-palette")) + XCTAssertTrue(keywords.contains("feature/cmd-palette-indexing")) + XCTAssertTrue(keywords.contains("3000")) + XCTAssertFalse(keywords.contains("feat-cmd-palette")) + XCTAssertFalse(keywords.contains("cmd-palette-indexing")) + } + + func testSurfaceDetailOutranksWorkspaceDetailForPathToken() { + let metadata = CommandPaletteSwitcherSearchMetadata( + directories: ["/tmp/worktrees/cmux"], + branches: ["feature/cmd-palette"], + ports: [] + ) + + let workspaceKeywords = CommandPaletteSwitcherSearchIndexer.keywords( + baseKeywords: ["workspace"], + metadata: metadata, + detail: .workspace + ) + let surfaceKeywords = CommandPaletteSwitcherSearchIndexer.keywords( + baseKeywords: ["surface"], + metadata: metadata, + detail: .surface + ) + + let workspaceScore = try XCTUnwrap( + CommandPaletteFuzzyMatcher.score(query: "cmux", candidates: workspaceKeywords) + ) + let surfaceScore = try XCTUnwrap( + CommandPaletteFuzzyMatcher.score(query: "cmux", candidates: surfaceKeywords) + ) + + XCTAssertGreaterThan( + surfaceScore, + workspaceScore, + "Surface rows should rank ahead of workspace rows for directory-token matches." + ) + } +} + +@MainActor +final class CommandPaletteRequestRoutingTests: XCTestCase { + private func makeWindow() -> NSWindow { + NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 320, height: 240), + styleMask: [.titled, .closable, .resizable], + backing: .buffered, + defer: false + ) + } + + func testRequestedWindowTargetsOnlyMatchingObservedWindow() { + let windowA = makeWindow() + let windowB = makeWindow() + + XCTAssertTrue( + ContentView.shouldHandleCommandPaletteRequest( + observedWindow: windowA, + requestedWindow: windowA, + keyWindow: windowA, + mainWindow: windowA + ) + ) + XCTAssertFalse( + ContentView.shouldHandleCommandPaletteRequest( + observedWindow: windowB, + requestedWindow: windowA, + keyWindow: windowA, + mainWindow: windowA + ) + ) + } + + func testNilRequestedWindowFallsBackToKeyWindow() { + let key = makeWindow() + let other = makeWindow() + + XCTAssertTrue( + ContentView.shouldHandleCommandPaletteRequest( + observedWindow: key, + requestedWindow: nil, + keyWindow: key, + mainWindow: nil + ) + ) + XCTAssertFalse( + ContentView.shouldHandleCommandPaletteRequest( + observedWindow: other, + requestedWindow: nil, + keyWindow: key, + mainWindow: nil + ) + ) + } + + func testNilRequestedAndKeyFallsBackToMainWindow() { + let main = makeWindow() + let other = makeWindow() + + XCTAssertTrue( + ContentView.shouldHandleCommandPaletteRequest( + observedWindow: main, + requestedWindow: nil, + keyWindow: nil, + mainWindow: main + ) + ) + XCTAssertFalse( + ContentView.shouldHandleCommandPaletteRequest( + observedWindow: other, + requestedWindow: nil, + keyWindow: nil, + mainWindow: main + ) + ) + } + + func testNoObservedWindowNeverHandlesRequest() { + XCTAssertFalse( + ContentView.shouldHandleCommandPaletteRequest( + observedWindow: nil, + requestedWindow: makeWindow(), + keyWindow: makeWindow(), + mainWindow: makeWindow() + ) + ) + } +} + +final class CommandPaletteBackNavigationTests: XCTestCase { + func testBackspaceOnEmptyRenameInputReturnsToCommandList() { + XCTAssertTrue( + ContentView.commandPaletteShouldPopRenameInputOnDelete( + renameDraft: "", + modifiers: [] + ) + ) + } + + func testBackspaceWithRenameTextDoesNotReturnToCommandList() { + XCTAssertFalse( + ContentView.commandPaletteShouldPopRenameInputOnDelete( + renameDraft: "Terminal 1", + modifiers: [] + ) + ) + } + + func testModifiedBackspaceDoesNotReturnToCommandList() { + XCTAssertFalse( + ContentView.commandPaletteShouldPopRenameInputOnDelete( + renameDraft: "", + modifiers: [.control] + ) + ) + XCTAssertFalse( + ContentView.commandPaletteShouldPopRenameInputOnDelete( + renameDraft: "", + modifiers: [.command] + ) + ) + } +} diff --git a/tests_v2/cmux.py b/tests_v2/cmux.py index cf94aae2..18af2284 100755 --- a/tests_v2/cmux.py +++ b/tests_v2/cmux.py @@ -918,6 +918,27 @@ class cmux: def activate_app(self) -> None: self._call("debug.app.activate") + def open_command_palette_rename_tab_input(self, window_id: Optional[str] = None) -> None: + params: Dict[str, Any] = {} + if window_id is not None: + params["window_id"] = str(window_id) + self._call("debug.command_palette.rename_tab.open", params) + + def command_palette_results(self, window_id: str, limit: int = 20) -> dict: + res = self._call( + "debug.command_palette.results", + {"window_id": str(window_id), "limit": int(limit)}, + ) or {} + return dict(res) + + def command_palette_rename_select_all(self) -> bool: + res = self._call("debug.command_palette.rename_input.select_all") or {} + return bool(res.get("enabled")) + + def set_command_palette_rename_select_all(self, enabled: bool) -> bool: + res = self._call("debug.command_palette.rename_input.select_all", {"enabled": bool(enabled)}) or {} + return bool(res.get("enabled")) + def is_terminal_focused(self, panel: Union[str, int]) -> bool: sid = self._resolve_surface_id(panel) res = self._call("debug.terminal.is_focused", {"surface_id": sid}) or {} diff --git a/tests_v2/test_command_palette_backspace_go_back.py b/tests_v2/test_command_palette_backspace_go_back.py new file mode 100644 index 00000000..7b152daa --- /dev/null +++ b/tests_v2/test_command_palette_backspace_go_back.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 +""" +Regression test: backspace on empty rename input returns to command list. + +Coverage: +- First backspace clears selected rename text. +- Second backspace on empty rename input navigates back to command list mode. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s=4.0, interval_s=0.05, message="timeout"): + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client, window_id): + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _palette_results(client, window_id): + return client.command_palette_results(window_id, limit=20) + + +def _rename_selection(client, window_id): + return client._call("debug.command_palette.rename_input.selection", {"window_id": window_id}) or {} + + +def _int_or(value, default): + try: + return int(value) + except (TypeError, ValueError): + return int(default) + + +def _open_rename_input(client, window_id): + client.activate_app() + client.focus_window(window_id) + time.sleep(0.1) + + if _palette_visible(client, window_id): + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: not _palette_visible(client, window_id), + message="command palette failed to close before setup", + ) + + client.open_command_palette_rename_tab_input(window_id=window_id) + _wait_until( + lambda: _palette_visible(client, window_id), + message="command palette failed to open", + ) + _wait_until( + lambda: str(_palette_results(client, window_id).get("mode") or "") == "rename_input", + message="command palette did not enter rename input mode", + ) + + +def main(): + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + window_id = client.current_window() + + original_select_all = client.command_palette_rename_select_all() + + try: + client.set_command_palette_rename_select_all(True) + _open_rename_input(client, window_id) + + _wait_until( + lambda: bool(_rename_selection(client, window_id).get("focused")), + message="rename input did not focus", + ) + + selection = _rename_selection(client, window_id) + text_length = _int_or(selection.get("text_length"), 0) + selection_location = _int_or(selection.get("selection_location"), -1) + selection_length = _int_or(selection.get("selection_length"), -1) + if not ( + text_length > 0 + and selection_location in (-1, 0) + and selection_length == text_length + ): + raise cmuxError( + "rename input was not select-all on open: " + f"text_length={text_length} selection=({selection_location}, {selection_length})" + ) + + client._call( + "debug.command_palette.rename_input.delete_backward", + {"window_id": window_id}, + ) + + first_backspace_cleared = False + last_selection = {} + for _ in range(40): + last_selection = _rename_selection(client, window_id) + if _int_or(last_selection.get("text_length"), -1) == 0: + first_backspace_cleared = True + break + time.sleep(0.05) + if not first_backspace_cleared: + raise cmuxError( + "first backspace did not clear rename input: " + f"selection={last_selection} results={_palette_results(client, window_id)}" + ) + after_first = _palette_results(client, window_id) + if str(after_first.get("mode") or "") != "rename_input": + raise cmuxError(f"palette exited rename mode too early after first backspace: {after_first}") + + client._call( + "debug.command_palette.rename_input.delete_backward", + {"window_id": window_id}, + ) + + _wait_until( + lambda: str(_palette_results(client, window_id).get("mode") or "") == "commands", + message="second backspace on empty input did not return to commands mode", + ) + + if not _palette_visible(client, window_id): + raise cmuxError("palette closed unexpectedly instead of navigating back to command list") + + finally: + try: + client.set_command_palette_rename_select_all(original_select_all) + except Exception: + pass + + if _palette_visible(client, window_id): + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: not _palette_visible(client, window_id), + message="command palette failed to close during cleanup", + ) + + print("PASS: backspace on empty rename input navigates back to command list") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_focus.py b/tests_v2/test_command_palette_focus.py new file mode 100644 index 00000000..859de7b8 --- /dev/null +++ b/tests_v2/test_command_palette_focus.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +""" +Regression test: opening the command palette must move focus away from terminal. + +Why: if terminal remains first responder under the palette, typing goes into the shell +instead of the palette search field. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _focused_surface_id(client: cmux) -> str: + surfaces = client.list_surfaces() + for _, sid, focused in surfaces: + if focused: + return sid + raise cmuxError(f"No focused surface in list_surfaces: {surfaces}") + + +def _palette_visible(client: cmux, window_id: str) -> bool: + res = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(res.get("visible")) + + +def _wait_until(predicate, timeout_s: float = 3.0, interval_s: float = 0.05, message: str = "timeout") -> None: + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def main() -> int: + token = "CMUX_PALETTE_FOCUS_PROBE_9412" + restore_token = "CMUX_PALETTE_RESTORE_PROBE_7731" + + with cmux(SOCKET_PATH) as client: + client.new_workspace() + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + panel_id = _focused_surface_id(client) + _wait_until( + lambda: client.is_terminal_focused(panel_id), + timeout_s=5.0, + message=f"terminal never became focused for panel {panel_id}", + ) + + pre_text = client.read_terminal_text(panel_id) + + # Open palette via debug method and assert terminal focus drops. + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id), + timeout_s=3.0, + message="command palette did not open", + ) + + # Typing now should target palette input, not the terminal. + client.simulate_type(token) + time.sleep(0.15) + post_text = client.read_terminal_text(panel_id) + + if token in post_text and token not in pre_text: + raise cmuxError("typed probe text leaked into terminal while palette is open") + + # Close palette and ensure focus returns to previously-focused terminal. + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: not _palette_visible(client, window_id), + timeout_s=3.0, + message="command palette did not close", + ) + + client.simulate_type(restore_token) + time.sleep(0.15) + restore_text = client.read_terminal_text(panel_id) + if restore_token not in restore_text: + raise cmuxError("terminal did not receive typing after closing command palette") + + print("PASS: command palette steals and restores terminal focus") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_focus_lock_workspace_spawn.py b/tests_v2/test_command_palette_focus_lock_workspace_spawn.py new file mode 100644 index 00000000..d859b912 --- /dev/null +++ b/tests_v2/test_command_palette_focus_lock_workspace_spawn.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python3 +""" +Regression test: command palette focus must remain stable while a new workspace shell spawns. + +Why: when a terminal steals first responder during workspace bootstrap, the command-palette +search field can re-focus with full selection, so the next keystroke replaces the whole query. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s: float = 5.0, interval_s: float = 0.05, message: str = "timeout") -> None: + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client: cmux, window_id: str) -> bool: + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _palette_results(client: cmux, window_id: str, limit: int = 20) -> dict: + return client.command_palette_results(window_id=window_id, limit=limit) + + +def _palette_input_selection(client: cmux, window_id: str) -> dict: + return client._call("debug.command_palette.rename_input.selection", {"window_id": window_id}) or {} + + +def _close_palette_if_open(client: cmux, window_id: str) -> None: + if _palette_visible(client, window_id): + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: not _palette_visible(client, window_id), + message="command palette failed to close", + ) + + +def _assert_caret_at_end(selection: dict, context: str) -> None: + if not selection.get("focused"): + raise cmuxError(f"{context}: palette input is not focused") + text_length = int(selection.get("text_length") or 0) + selection_location = int(selection.get("selection_location") or 0) + selection_length = int(selection.get("selection_length") or 0) + if selection_location != text_length or selection_length != 0: + raise cmuxError( + f"{context}: expected caret-at-end, got location={selection_location}, " + f"length={selection_length}, text_length={text_length}" + ) + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + + _close_palette_if_open(client, window_id) + workspace_count_before = len(client.list_workspaces(window_id=window_id)) + + client.simulate_shortcut("cmd+shift+p") + _wait_until( + lambda: _palette_visible(client, window_id), + message="cmd+shift+p did not open command palette", + ) + _wait_until( + lambda: str(_palette_results(client, window_id).get("mode") or "") == "commands", + message="palette did not open in commands mode", + ) + + selection = _palette_input_selection(client, window_id) + _assert_caret_at_end(selection, "initial state") + + client.new_workspace(window_id=window_id) + _wait_until( + lambda: len(client.list_workspaces(window_id=window_id)) >= workspace_count_before + 1, + message="workspace.create did not add a new workspace", + ) + + # Sample across shell bootstrap; focus and caret should stay stable. + sample_deadline = time.time() + 2.0 + while time.time() < sample_deadline: + selection = _palette_input_selection(client, window_id) + _assert_caret_at_end(selection, "after workspace spawn") + time.sleep(0.01) + + client.simulate_type("focuslock") + _wait_until( + lambda: str(_palette_results(client, window_id).get("mode") or "") == "commands", + message="typing after workspace spawn switched palette out of commands mode", + ) + _wait_until( + lambda: "focuslock" in str(_palette_results(client, window_id).get("query") or "").lower(), + message="typing after workspace spawn did not append into command query", + ) + + print("PASS: command palette keeps focus/caret during workspace shell spawn") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_fuzzy_ranking.py b/tests_v2/test_command_palette_fuzzy_ranking.py new file mode 100644 index 00000000..8d6e30b2 --- /dev/null +++ b/tests_v2/test_command_palette_fuzzy_ranking.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +""" +Regression test: command palette fuzzy ranking for rename commands. + +Validates: +- Typing `rename` is captured by the palette query. +- The top-ranked command is a rename command. +- Pressing Enter opens rename input (instead of running an unrelated command). +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") +RENAME_COMMAND_IDS = {"palette.renameTab", "palette.renameWorkspace"} + + +def _wait_until(predicate, timeout_s=5.0, interval_s=0.05, message="timeout"): + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client: cmux, window_id: str) -> bool: + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _rename_input_selection(client: cmux, window_id: str) -> dict: + return client._call("debug.command_palette.rename_input.selection", {"window_id": window_id}) or {} + + +def _palette_results(client: cmux, window_id: str, limit: int = 10) -> dict: + return client.command_palette_results(window_id=window_id, limit=limit) + + +def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: + if _palette_visible(client, window_id) == visible: + return + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id) == visible, + message=f"palette visibility did not become {visible}", + ) + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + + workspace_id = client.new_workspace(window_id=window_id) + client.select_workspace(workspace_id) + time.sleep(0.2) + + _set_palette_visible(client, window_id, False) + _set_palette_visible(client, window_id, True) + + # Force command mode query regardless transient field-editor selection state. + time.sleep(0.2) + client.simulate_shortcut("cmd+a") + client.simulate_type(">rename") + _wait_until( + lambda: "rename" in str(_palette_results(client, window_id).get("query") or "").strip().lower(), + message="palette query did not update to 'rename'", + ) + + payload = _palette_results(client, window_id, limit=12) + rows = payload.get("results") or [] + if not rows: + raise cmuxError(f"palette returned no results for rename query: {payload}") + + top = rows[0] or {} + top_id = str(top.get("command_id") or "") + top_title = str(top.get("title") or "") + if top_id not in RENAME_COMMAND_IDS: + titles = [str(row.get("title") or "") for row in rows] + raise cmuxError( + f"unexpected top result for 'rename': id={top_id!r} title={top_title!r} results={titles}" + ) + + client.simulate_shortcut("cmd+a") + client.simulate_type(">retab") + _wait_until( + lambda: "retab" in str(_palette_results(client, window_id).get("query") or "").strip().lower(), + message="palette query did not update to 'retab'", + ) + + retab_payload = _palette_results(client, window_id, limit=12) + retab_rows = retab_payload.get("results") or [] + if not retab_rows: + raise cmuxError(f"palette returned no results for retab query: {retab_payload}") + top_retabs = [str(row.get("command_id") or "") for row in retab_rows[:3]] + if "palette.renameTab" not in top_retabs: + raise cmuxError( + f"'retab' did not rank Rename Tab near top: top3={top_retabs} rows={retab_rows}" + ) + + client.simulate_shortcut("enter") + _wait_until( + lambda: _palette_visible(client, window_id) + and bool(_rename_input_selection(client, window_id).get("focused")), + message="Enter did not open rename input for top rename result", + ) + + _set_palette_visible(client, window_id, False) + + print("PASS: command palette fuzzy ranking prioritizes rename commands") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_modes.py b/tests_v2/test_command_palette_modes.py new file mode 100644 index 00000000..482e1c45 --- /dev/null +++ b/tests_v2/test_command_palette_modes.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python3 +""" +Regression test: VSCode-like command palette modes. + +Validates: +- Cmd+Shift+P opens commands mode (leading '>' semantics). +- Cmd+P opens workspace/tab switcher mode. +- Repeating Cmd+Shift+P or Cmd+P toggles visibility (open/close). +- Switcher search can jump to another workspace by pressing Enter. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s: float = 5.0, interval_s: float = 0.05, message: str = "timeout") -> None: + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client: cmux, window_id: str) -> bool: + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _palette_results(client: cmux, window_id: str, limit: int = 20) -> dict: + return client.command_palette_results(window_id=window_id, limit=limit) + + +def _palette_input_selection(client: cmux, window_id: str) -> dict: + return client._call("debug.command_palette.rename_input.selection", {"window_id": window_id}) or {} + + +def _wait_for_palette_input_caret_at_end( + client: cmux, + window_id: str, + expected_text_length: int, + message: str, + timeout_s: float = 1.2, +) -> None: + def _matches() -> bool: + selection = _palette_input_selection(client, window_id) + if not selection.get("focused"): + return False + text_length = int(selection.get("text_length") or 0) + selection_location = int(selection.get("selection_location") or 0) + selection_length = int(selection.get("selection_length") or 0) + return ( + text_length == expected_text_length + and selection_location == expected_text_length + and selection_length == 0 + ) + + _wait_until(_matches, timeout_s=timeout_s, message=message) + + +def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: + if _palette_visible(client, window_id) == visible: + return + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id) == visible, + timeout_s=3.0, + message=f"palette visibility did not become {visible}", + ) + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + + ws_a = client.new_workspace(window_id=window_id) + client.select_workspace(ws_a) + client.rename_workspace("alpha-workspace", workspace=ws_a) + + ws_b = client.new_workspace(window_id=window_id) + client.select_workspace(ws_b) + client.rename_workspace("bravo-workspace", workspace=ws_b) + + client.select_workspace(ws_a) + _wait_until( + lambda: client.current_workspace() == ws_a, + message="failed to select workspace alpha before switcher jump", + ) + + _set_palette_visible(client, window_id, False) + + # Cmd+P: switcher mode. + client.simulate_shortcut("cmd+p") + _wait_until( + lambda: _palette_visible(client, window_id), + message="cmd+p did not open command palette", + ) + _wait_until( + lambda: str(_palette_results(client, window_id).get("mode") or "") == "switcher", + message="cmd+p did not open switcher mode", + ) + + time.sleep(0.2) + client.simulate_type("bravo") + _wait_until( + lambda: "bravo" in str(_palette_results(client, window_id).get("query") or "").strip().lower(), + message="switcher query did not include bravo", + ) + switched_rows = (_palette_results(client, window_id, limit=12).get("results") or []) + if not switched_rows: + raise cmuxError("switcher returned no rows for workspace query") + top_id = str((switched_rows[0] or {}).get("command_id") or "") + if not top_id.startswith("switcher."): + raise cmuxError(f"expected switcher row on top for cmd+p query, got: {switched_rows[0]}") + + client.simulate_shortcut("enter") + _wait_until( + lambda: not _palette_visible(client, window_id), + message="palette did not close after selecting switcher row", + ) + _wait_until( + lambda: client.current_workspace() == ws_b, + message="Enter on switcher result did not move to target workspace", + ) + + # Cmd+Shift+P: commands mode. + client.simulate_shortcut("cmd+shift+p") + _wait_until( + lambda: _palette_visible(client, window_id), + message="cmd+shift+p did not open command palette", + ) + _wait_until( + lambda: str(_palette_results(client, window_id).get("mode") or "") == "commands", + message="cmd+shift+p did not open commands mode", + ) + _wait_for_palette_input_caret_at_end( + client, + window_id, + expected_text_length=1, + message="cmd+shift+p should prefill '>' with caret at end (not selected)", + ) + + command_rows = (_palette_results(client, window_id, limit=8).get("results") or []) + if not command_rows: + raise cmuxError("commands mode returned no rows") + top_command_id = str((command_rows[0] or {}).get("command_id") or "") + if not top_command_id.startswith("palette."): + raise cmuxError(f"expected command row in commands mode, got: {command_rows[0]}") + + # Repeating either shortcut should toggle visibility. + client.simulate_shortcut("cmd+shift+p") + _wait_until( + lambda: not _palette_visible(client, window_id), + message="second cmd+shift+p did not close the command palette", + ) + + client.simulate_shortcut("cmd+p") + _wait_until( + lambda: _palette_visible(client, window_id) + and str(_palette_results(client, window_id).get("mode") or "") == "switcher", + message="cmd+p did not reopen switcher mode after toggle-close", + ) + client.simulate_shortcut("cmd+p") + _wait_until( + lambda: not _palette_visible(client, window_id), + message="second cmd+p did not close the command palette", + ) + + print("PASS: command palette cmd+p/cmd+shift+p open correct modes and toggle on repeat") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_navigation_keys.py b/tests_v2/test_command_palette_navigation_keys.py new file mode 100644 index 00000000..6a3d4b2a --- /dev/null +++ b/tests_v2/test_command_palette_navigation_keys.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 +""" +Regression test: command palette list navigation keys. + +Validates: +- Down: ArrowDown, Ctrl+N, Ctrl+J +- Up: ArrowUp, Ctrl+P, Ctrl+K +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until( + predicate, + timeout_s: float = 4.0, + interval_s: float = 0.05, + message: str = "timeout", +) -> None: + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client: cmux, window_id: str) -> bool: + res = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(res.get("visible")) + + +def _palette_selected_index(client: cmux, window_id: str) -> int: + res = client._call("debug.command_palette.selection", {"window_id": window_id}) or {} + return int(res.get("selected_index") or 0) + + +def _has_focused_surface(client: cmux) -> bool: + try: + return any(bool(row[2]) for row in client.list_surfaces()) + except Exception: + return False + + +def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: + if _palette_visible(client, window_id) == visible: + return + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id) == visible, + message=f"palette visibility did not become {visible}", + ) + + +def _open_palette_with_query(client: cmux, window_id: str, query: str) -> None: + _set_palette_visible(client, window_id, False) + _set_palette_visible(client, window_id, True) + client.simulate_type(query) + _wait_until( + lambda: _palette_selected_index(client, window_id) == 0, + message="palette selected index did not reset to zero", + ) + + +def _assert_move(client: cmux, window_id: str, combo: str, start_index: int, expected_index: int) -> None: + _open_palette_with_query(client, window_id, "new") + for _ in range(start_index): + client.simulate_shortcut("down") + _wait_until( + lambda: _palette_selected_index(client, window_id) == start_index, + message=f"failed to seed start index {start_index}", + ) + + client.simulate_shortcut(combo) + _wait_until( + lambda: _palette_visible(client, window_id) + and _palette_selected_index(client, window_id) == expected_index, + message=f"{combo} did not move selection from {start_index} to {expected_index}", + ) + + +def _assert_can_navigate_past_ten_results(client: cmux, window_id: str) -> None: + _open_palette_with_query(client, window_id, "") + + for _ in range(12): + client.simulate_shortcut("down") + + _wait_until( + lambda: _palette_visible(client, window_id) + and _palette_selected_index(client, window_id) >= 10, + message="selection did not move past index 9 (results may be capped)", + ) + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + client.new_workspace() + time.sleep(0.2) + + window_id = client.current_window() + # Isolate this test to one window so stale palettes in other windows + # cannot steal navigation notifications. + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + _wait_until( + lambda: _has_focused_surface(client), + timeout_s=5.0, + message="no focused surface available for command palette context", + ) + + for combo in ("down", "ctrl+n", "ctrl+j"): + _assert_move(client, window_id, combo, start_index=0, expected_index=1) + + for combo in ("up", "ctrl+p", "ctrl+k"): + _assert_move(client, window_id, combo, start_index=1, expected_index=0) + + _assert_can_navigate_past_ten_results(client, window_id) + + _set_palette_visible(client, window_id, False) + + print("PASS: command palette navigation keys and uncapped result navigation") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_rename_enter.py b/tests_v2/test_command_palette_rename_enter.py new file mode 100644 index 00000000..749e0ac0 --- /dev/null +++ b/tests_v2/test_command_palette_rename_enter.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +""" +Regression test: command-palette rename flow responds to Enter. + +Coverage: +- Enter in rename input applies the new tab name and closes the palette. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s=4.0, interval_s=0.05, message="timeout"): + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client, window_id): + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _rename_input_selection(client, window_id): + return client._call("debug.command_palette.rename_input.selection", {"window_id": window_id}) or {} + + +def _focused_pane_id(client): + panes = client.list_panes() + focused = [row for row in panes if bool(row[3])] + if not focused: + raise cmuxError(f"no focused pane: {panes}") + return str(focused[0][1]) + + +def _selected_surface_title(client, pane_id): + rows = client.list_pane_surfaces(pane_id) + selected = [row for row in rows if bool(row[3])] + if not selected: + raise cmuxError(f"no selected surface in pane {pane_id}: {rows}") + return str(selected[0][2]) + + +def main(): + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + + workspace_id = client.new_workspace(window_id=window_id) + client.select_workspace(workspace_id) + time.sleep(0.2) + + pane_id = _focused_pane_id(client) + rename_to = f"rename-enter-{int(time.time())}" + + client.open_command_palette_rename_tab_input(window_id=window_id) + _wait_until( + lambda: _palette_visible(client, window_id), + message="command palette did not open", + ) + _wait_until( + lambda: bool(_rename_input_selection(client, window_id).get("focused")), + message="rename input did not focus", + ) + + client.simulate_type(rename_to) + time.sleep(0.1) + + client.simulate_shortcut("enter") + _wait_until( + lambda: not _palette_visible(client, window_id), + message="Enter did not apply rename and close palette", + ) + + new_title = _selected_surface_title(client, pane_id) + if new_title != rename_to: + raise cmuxError(f"rename not applied: expected '{rename_to}', got '{new_title}'") + + print("PASS: command-palette rename flow accepts Enter in input") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_rename_select_all.py b/tests_v2/test_command_palette_rename_select_all.py new file mode 100644 index 00000000..0b05ab4a --- /dev/null +++ b/tests_v2/test_command_palette_rename_select_all.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 +""" +Regression test: command-palette rename input keeps select-all on interaction. + +Coverage: +- With select-all setting enabled, rename input selects all existing text + immediately and stays selected after interaction. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s=4.0, interval_s=0.05, message="timeout"): + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client, window_id): + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _rename_input_selection(client, window_id): + return client._call("debug.command_palette.rename_input.selection", {"window_id": window_id}) or {} + + +def _rename_select_all_setting(client): + payload = client._call("debug.command_palette.rename_input.select_all", {}) or {} + return bool(payload.get("enabled")) + + +def _set_rename_select_all_setting(client, enabled): + payload = client._call( + "debug.command_palette.rename_input.select_all", + {"enabled": bool(enabled)}, + ) or {} + return bool(payload.get("enabled")) + + +def _wait_for_rename_selection( + client, + window_id, + expect_select_all, + message, + timeout_s=0.6, +): + def _matches(): + selection = _rename_input_selection(client, window_id) + if not selection.get("focused"): + return False + text_length = int(selection.get("text_length") or 0) + selection_location = int(selection.get("selection_location") or 0) + selection_length = int(selection.get("selection_length") or 0) + if expect_select_all: + return text_length > 0 and selection_location == 0 and selection_length == text_length + return selection_location == text_length and selection_length == 0 + + _wait_until(_matches, timeout_s=timeout_s, message=message) + + +def _exercise_rename_selection_setting( + client, + window_id, + expect_select_all, + cycles, + label, +): + for cycle in range(cycles): + _open_rename_tab_input(client, window_id) + _wait_for_rename_selection( + client, + window_id, + expect_select_all=expect_select_all, + timeout_s=0.4, + message=( + f"{label}: rename input not ready with expected selection " + f"on open (cycle {cycle + 1}/{cycles})" + ), + ) + client._call("debug.command_palette.rename_input.interact", {"window_id": window_id}) + _wait_for_rename_selection( + client, + window_id, + expect_select_all=expect_select_all, + timeout_s=0.6, + message=( + f"{label}: rename input selection changed after interaction " + f"(cycle {cycle + 1}/{cycles})" + ), + ) + + if _palette_visible(client, window_id): + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: not _palette_visible(client, window_id), + message=f"{label}: command palette failed to close (cycle {cycle + 1}/{cycles})", + ) + + +def _open_rename_tab_input(client, window_id): + client.activate_app() + client.focus_window(window_id) + time.sleep(0.1) + + if _palette_visible(client, window_id): + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: not _palette_visible(client, window_id), + message="command palette failed to close before setup", + ) + + client.open_command_palette_rename_tab_input(window_id=window_id) + _wait_until( + lambda: _palette_visible(client, window_id), + message="command palette failed to open rename-tab input", + ) + + +def main(): + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + original_select_all = _rename_select_all_setting(client) + + workspace_id = client.new_workspace() + client.select_workspace(workspace_id) + client.rename_workspace("SeedName", workspace_id) + time.sleep(0.25) + window_id = client.current_window() + + try: + stress_cycles = 8 + + # ON: immediate select-all and interaction-preserved select-all. + _set_rename_select_all_setting(client, True) + _exercise_rename_selection_setting( + client, + window_id, + expect_select_all=True, + cycles=stress_cycles, + label="select-all enabled", + ) + + # OFF: immediate caret-at-end and interaction-preserved caret-at-end. + _set_rename_select_all_setting(client, False) + _exercise_rename_selection_setting( + client, + window_id, + expect_select_all=False, + cycles=stress_cycles, + label="select-all disabled", + ) + + finally: + try: + _set_rename_select_all_setting(client, original_select_all) + except Exception: + pass + if _palette_visible(client, window_id): + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: not _palette_visible(client, window_id), + message="command palette failed to close during cleanup", + ) + + print("PASS: command-palette rename input obeys select-all setting (on/off)") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_search_action_sync.py b/tests_v2/test_command_palette_search_action_sync.py new file mode 100644 index 00000000..533cb7e3 --- /dev/null +++ b/tests_v2/test_command_palette_search_action_sync.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +""" +Regression test: command-palette search updates rows and executed action in sync. + +Why: if query replacement doesn't fully refresh the result list, the top row text +can lag behind the action executed on Enter. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s=4.0, interval_s=0.05, message="timeout"): + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client, window_id): + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _set_palette_visible(client, window_id, visible): + if _palette_visible(client, window_id) == visible: + return + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id) == visible, + message=f"command palette did not become visible={visible}", + ) + + +def _palette_results(client, window_id, limit=10): + return client.command_palette_results(window_id=window_id, limit=limit) + + +def _palette_input_selection(client, window_id): + # Shared field-editor probe used by other command palette regressions. + return client._call("debug.command_palette.rename_input.selection", {"window_id": window_id}) or {} + + +def main(): + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + + workspace_id = client.new_workspace(window_id=window_id) + client.select_workspace(workspace_id) + time.sleep(0.2) + + _set_palette_visible(client, window_id, False) + _set_palette_visible(client, window_id, True) + _wait_until( + lambda: bool(_palette_input_selection(client, window_id).get("focused")), + message="palette search input did not focus", + ) + + client.simulate_shortcut("cmd+a") + client.simulate_type(">open") + _wait_until( + lambda: "open" in str(_palette_results(client, window_id).get("query") or "").strip().lower(), + message="palette query did not become 'open'", + ) + + before = _palette_results(client, window_id, limit=8) + before_rows = before.get("results") or [] + if not before_rows: + raise cmuxError(f"no results for 'open': {before}") + if str(before_rows[0].get("command_id") or "") != "palette.terminalOpenDirectory": + raise cmuxError(f"unexpected top command for 'open': {before_rows[0]}") + + client.simulate_shortcut("cmd+a") + client.simulate_type(">rename") + _wait_until( + lambda: "rename" in str(_palette_results(client, window_id).get("query") or "").strip().lower(), + message="palette query did not become 'rename' after replacement", + ) + after = _palette_results(client, window_id, limit=8) + after_rows = after.get("results") or [] + if not after_rows: + raise cmuxError(f"no results for 'rename' after replacement: {after}") + top_after = str(after_rows[0].get("command_id") or "") + if top_after not in {"palette.renameWorkspace", "palette.renameTab"}: + raise cmuxError(f"top result did not update to rename command after replacement: {after_rows[0]}") + + client.simulate_shortcut("enter") + _wait_until( + lambda: bool(_palette_input_selection(client, window_id).get("focused")), + message="Enter did not trigger renamed top command input", + ) + + _set_palette_visible(client, window_id, False) + + print("PASS: command-palette search replacement keeps row text/action in sync") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_search_typing_stability.py b/tests_v2/test_command_palette_search_typing_stability.py new file mode 100644 index 00000000..09b34722 --- /dev/null +++ b/tests_v2/test_command_palette_search_typing_stability.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 +""" +Regression test: command-palette search typing should not reset selection. + +Why: if focus-lock logic repeatedly re-focuses the text field, typing behaves +like Cmd+A is being spammed and each character replaces the previous query. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s=4.0, interval_s=0.04, message="timeout"): + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client, window_id): + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _palette_input_selection(client, window_id): + # Uses the shared field-editor probe; works for search and rename modes. + return client._call("debug.command_palette.rename_input.selection", {"window_id": window_id}) or {} + + +def _wait_for_input_state(client, window_id, expected_text_length, message, timeout_s=0.8): + def _matches(): + selection = _palette_input_selection(client, window_id) + if not selection.get("focused"): + return False + text_length = int(selection.get("text_length") or 0) + selection_location = int(selection.get("selection_location") or 0) + selection_length = int(selection.get("selection_length") or 0) + return ( + text_length == expected_text_length + and selection_location == expected_text_length + and selection_length == 0 + ) + + _wait_until(_matches, timeout_s=timeout_s, message=message) + + +def _close_palette_if_open(client, window_id): + if _palette_visible(client, window_id): + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: not _palette_visible(client, window_id), + message="command palette failed to close", + ) + + +def _open_palette(client, window_id): + _close_palette_if_open(client, window_id) + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id), + message="command palette failed to open", + ) + _wait_for_input_state( + client, + window_id, + expected_text_length=0, + message="search input did not focus with empty query", + ) + + +def main(): + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + + # Keep a single active window for deterministic first-responder behavior. + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + + probe = "typingstability" + cycles = 4 + for cycle in range(cycles): + _open_palette(client, window_id) + for idx, ch in enumerate(probe, start=1): + client.simulate_type(ch) + _wait_for_input_state( + client, + window_id, + expected_text_length=idx, + timeout_s=0.7, + message=( + f"search typing did not accumulate at cycle {cycle + 1}/{cycles}, " + f"char {idx}/{len(probe)}" + ), + ) + _close_palette_if_open(client, window_id) + + print("PASS: command-palette search typing accumulates text without select-all churn") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_switcher_cross_workspace_surface_focus.py b/tests_v2/test_command_palette_switcher_cross_workspace_surface_focus.py new file mode 100644 index 00000000..ba427506 --- /dev/null +++ b/tests_v2/test_command_palette_switcher_cross_workspace_surface_focus.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python3 +""" +Regression test: cmd+p switcher surface selection across workspaces must focus that surface. + +Why: switching workspaces with an explicit target surface could be overridden by stale +per-workspace remembered focus, leaving the destination workspace selected but the wrong +surface focused. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s: float = 6.0, interval_s: float = 0.05, message: str = "timeout") -> None: + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client: cmux, window_id: str) -> bool: + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _palette_results(client: cmux, window_id: str, limit: int = 20) -> dict: + return client.command_palette_results(window_id=window_id, limit=limit) + + +def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: + if _palette_visible(client, window_id) == visible: + return + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id) == visible, + message=f"palette visibility did not become {visible}", + ) + + +def _open_switcher(client: cmux, window_id: str) -> None: + _set_palette_visible(client, window_id, False) + client.simulate_shortcut("cmd+p") + _wait_until( + lambda: _palette_visible(client, window_id), + message="cmd+p did not open switcher", + ) + _wait_until( + lambda: str(_palette_results(client, window_id).get("mode") or "") == "switcher", + message="cmd+p did not open switcher mode", + ) + + +def _rename_surface(client: cmux, surface_id: str, title: str) -> None: + client._call( + "surface.action", + { + "surface_id": surface_id, + "action": "rename", + "title": title, + }, + ) + + +def _current_surface_id(client: cmux, workspace_id: str) -> str: + payload = client._call("surface.current", {"workspace_id": workspace_id}) or {} + return str(payload.get("surface_id") or "") + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + + ws_a = client.new_workspace(window_id=window_id) + client.select_workspace(ws_a) + client.rename_workspace("source-workspace", workspace=ws_a) + + ws_b = client.new_workspace(window_id=window_id) + client.select_workspace(ws_b) + client.rename_workspace("target-workspace", workspace=ws_b) + time.sleep(0.2) + + right_surface_id = client.new_split("right") + time.sleep(0.2) + + payload = client._call("surface.list", {"workspace_id": ws_b}) or {} + rows = payload.get("surfaces") or [] + if len(rows) < 2: + raise cmuxError(f"expected at least two surfaces after split: {payload}") + + left_surface_id = "" + for row in rows: + sid = str(row.get("id") or "") + if sid and sid != right_surface_id: + left_surface_id = sid + break + if not left_surface_id: + raise cmuxError(f"failed to resolve left surface id: {payload}") + + token = f"cmdp-crossws-{int(time.time() * 1000)}" + _rename_surface(client, right_surface_id, token) + time.sleep(0.2) + + client.focus_surface(left_surface_id) + _wait_until( + lambda: _current_surface_id(client, ws_b).lower() == left_surface_id.lower(), + message="failed to prime remembered focus on non-target surface", + ) + + client.select_workspace(ws_a) + _wait_until( + lambda: client.current_workspace() == ws_a, + message="failed to return to source workspace before cmd+p navigation", + ) + + _open_switcher(client, window_id) + client.simulate_type(token) + _wait_until( + lambda: token in str(_palette_results(client, window_id).get("query") or "").strip().lower(), + message="switcher query did not update to target token", + ) + + target_command_id = f"switcher.surface.{ws_b.lower()}.{right_surface_id.lower()}" + _wait_until( + lambda: str(((_palette_results(client, window_id, limit=24).get("results") or [{}])[0] or {}).get("command_id") or "") == target_command_id, + message="target surface row did not become top switcher result", + ) + + client.simulate_shortcut("enter") + _wait_until( + lambda: not _palette_visible(client, window_id), + message="palette did not close after selecting cross-workspace surface row", + ) + _wait_until( + lambda: client.current_workspace() == ws_b, + message="Enter on switcher surface row did not move to target workspace", + ) + _wait_until( + lambda: _current_surface_id(client, ws_b).lower() == right_surface_id.lower(), + message="Enter on cross-workspace switcher surface row did not focus target surface", + ) + + client.close_workspace(ws_b) + client.close_workspace(ws_a) + + print("PASS: cmd+p switcher focuses selected surface after cross-workspace navigation") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_switcher_renamed_surface.py b/tests_v2/test_command_palette_switcher_renamed_surface.py new file mode 100644 index 00000000..99b2fce0 --- /dev/null +++ b/tests_v2/test_command_palette_switcher_renamed_surface.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +""" +Regression test: cmd+p switcher should search and navigate to renamed surfaces. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s: float = 6.0, interval_s: float = 0.05, message: str = "timeout") -> None: + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client: cmux, window_id: str) -> bool: + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _palette_results(client: cmux, window_id: str, limit: int = 20) -> dict: + return client.command_palette_results(window_id=window_id, limit=limit) + + +def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: + if _palette_visible(client, window_id) == visible: + return + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id) == visible, + message=f"palette visibility did not become {visible}", + ) + + +def _open_switcher(client: cmux, window_id: str) -> None: + _set_palette_visible(client, window_id, False) + client.simulate_shortcut("cmd+p") + _wait_until( + lambda: _palette_visible(client, window_id), + message="cmd+p did not open switcher", + ) + _wait_until( + lambda: str(_palette_results(client, window_id).get("mode") or "") == "switcher", + message="cmd+p did not open switcher mode", + ) + + +def _rename_surface(client: cmux, surface_id: str, title: str) -> None: + client._call( + "surface.action", + { + "surface_id": surface_id, + "action": "rename", + "title": title, + }, + ) + + +def _current_surface_id(client: cmux, workspace_id: str) -> str: + payload = client._call("surface.current", {"workspace_id": workspace_id}) or {} + return str(payload.get("surface_id") or "") + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + + workspace_id = client.new_workspace(window_id=window_id) + client.select_workspace(workspace_id) + time.sleep(0.2) + + right_surface_id = client.new_split("right") + time.sleep(0.2) + + payload = client._call("surface.list", {"workspace_id": workspace_id}) or {} + rows = payload.get("surfaces") or [] + if len(rows) < 2: + raise cmuxError(f"expected at least two surfaces after split: {payload}") + + left_surface_id = "" + for row in rows: + sid = str(row.get("id") or "") + if sid and sid != right_surface_id: + left_surface_id = sid + break + if not left_surface_id: + raise cmuxError(f"failed to resolve left surface id: {payload}") + + token = f"renamed-surface-{int(time.time() * 1000)}" + _rename_surface(client, right_surface_id, token) + time.sleep(0.2) + + client.focus_surface(left_surface_id) + time.sleep(0.2) + + _open_switcher(client, window_id) + client.simulate_type(token) + _wait_until( + lambda: token in str(_palette_results(client, window_id).get("query") or "").strip().lower(), + message="switcher query did not update to renamed surface token", + ) + + result_rows = (_palette_results(client, window_id, limit=24).get("results") or []) + if not result_rows: + raise cmuxError("switcher returned no rows for renamed surface query") + + top_row = result_rows[0] or {} + top_id = str(top_row.get("command_id") or "") + top_title = str(top_row.get("title") or "") + if not top_id.startswith("switcher.surface."): + raise cmuxError( + f"expected renamed surface row on top, got top={top_id!r} rows={result_rows}" + ) + if top_title != token: + raise cmuxError( + f"expected top surface row title to match renamed title {token!r}, got {top_title!r}" + ) + + client.simulate_shortcut("enter") + _wait_until( + lambda: not _palette_visible(client, window_id), + message="palette did not close after selecting renamed surface row", + ) + + _wait_until( + lambda: _current_surface_id(client, workspace_id).lower() == right_surface_id.lower(), + message="Enter on renamed surface switcher row did not focus target surface", + ) + + client.close_workspace(workspace_id) + + print("PASS: cmd+p switcher searches and navigates renamed surfaces") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_switcher_surface_precedence.py b/tests_v2/test_command_palette_switcher_surface_precedence.py new file mode 100644 index 00000000..ec3850f5 --- /dev/null +++ b/tests_v2/test_command_palette_switcher_surface_precedence.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python3 +""" +Regression test: switcher should prioritize matching surfaces over workspace rows. + +Why: workspace rows used to index metadata from all surfaces, so a path-token query +could rank the workspace row above the actual surface row (because of stable rank +tie-breaks), making Enter jump to workspace instead of the intended surface. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s: float = 6.0, interval_s: float = 0.05, message: str = "timeout") -> None: + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client: cmux, window_id: str) -> bool: + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _palette_results(client: cmux, window_id: str, limit: int = 20) -> dict: + return client.command_palette_results(window_id=window_id, limit=limit) + + +def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: + if _palette_visible(client, window_id) == visible: + return + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id) == visible, + message=f"palette visibility did not become {visible}", + ) + + +def _open_switcher(client: cmux, window_id: str) -> None: + _set_palette_visible(client, window_id, False) + client.simulate_shortcut("cmd+p") + _wait_until( + lambda: _palette_visible(client, window_id), + message="cmd+p did not open switcher", + ) + _wait_until( + lambda: str(_palette_results(client, window_id).get("mode") or "") == "switcher", + message="cmd+p did not open switcher mode", + ) + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + + workspace_id = client.new_workspace(window_id=window_id) + client.select_workspace(workspace_id) + client.rename_workspace("workspace-no-token", workspace=workspace_id) + time.sleep(0.2) + + right_surface_id = client.new_split("right") + time.sleep(0.2) + + payload = client._call("surface.list", {"workspace_id": workspace_id}) or {} + rows = payload.get("surfaces") or [] + if len(rows) < 2: + raise cmuxError(f"expected at least two surfaces after split: {payload}") + + left_surface_id = "" + for row in rows: + sid = str(row.get("id") or "") + if sid and sid != right_surface_id: + left_surface_id = sid + break + if not left_surface_id: + raise cmuxError(f"failed to resolve left surface id: {payload}") + + token = f"cmdp-switcher-target-{int(time.time() * 1000)}" + target_dir = f"/tmp/{token}" + + client.send_surface(left_surface_id, "cd /tmp\n") + client.send_surface( + right_surface_id, + f"mkdir -p {target_dir} && cd {target_dir}\n", + ) + client.focus_surface(left_surface_id) + time.sleep(0.8) + + _open_switcher(client, window_id) + client.simulate_type(token) + _wait_until( + lambda: token in str(_palette_results(client, window_id).get("query") or "").strip().lower(), + message="switcher query did not update to target token", + ) + + def _has_surface_match() -> bool: + result_rows = (_palette_results(client, window_id, limit=24).get("results") or []) + return any(str((row or {}).get("command_id") or "").startswith("switcher.surface.") for row in result_rows) + + _wait_until( + _has_surface_match, + timeout_s=8.0, + message="switcher results never produced a matching surface row for token query", + ) + + result_rows = (_palette_results(client, window_id, limit=24).get("results") or []) + if not result_rows: + raise cmuxError("switcher returned no rows for token query") + + top_id = str((result_rows[0] or {}).get("command_id") or "") + if not top_id.startswith("switcher.surface."): + raise cmuxError(f"expected a surface row on top for token query, got top={top_id!r} rows={result_rows}") + + workspace_matches = [ + str((row or {}).get("command_id") or "") + for row in result_rows + if str((row or {}).get("command_id") or "").startswith("switcher.workspace.") + ] + if workspace_matches: + raise cmuxError( + f"workspace row should not match a non-focused surface path token; workspace matches={workspace_matches} rows={result_rows}" + ) + + _set_palette_visible(client, window_id, False) + client.close_workspace(workspace_id) + + print("PASS: switcher ranks matching surface rows ahead of workspace rows for path-token queries") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_switcher_type_labels.py b/tests_v2/test_command_palette_switcher_type_labels.py new file mode 100644 index 00000000..dbbe2fcd --- /dev/null +++ b/tests_v2/test_command_palette_switcher_type_labels.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +""" +Regression test: cmd+p switcher rows expose right-side type labels. + +Expected trailing labels: +- switcher.workspace.* => Workspace +- switcher.surface.* => Surface +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s: float = 6.0, interval_s: float = 0.05, message: str = "timeout") -> None: + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client: cmux, window_id: str) -> bool: + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _palette_results(client: cmux, window_id: str, limit: int = 20) -> dict: + return client.command_palette_results(window_id=window_id, limit=limit) + + +def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: + if _palette_visible(client, window_id) == visible: + return + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id) == visible, + message=f"palette visibility did not become {visible}", + ) + + +def _open_switcher(client: cmux, window_id: str) -> None: + _set_palette_visible(client, window_id, False) + client.simulate_shortcut("cmd+p") + _wait_until( + lambda: _palette_visible(client, window_id), + message="cmd+p did not open switcher", + ) + _wait_until( + lambda: str(_palette_results(client, window_id).get("mode") or "") == "switcher", + message="cmd+p did not open switcher mode", + ) + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + + workspace_id = client.new_workspace(window_id=window_id) + client.select_workspace(workspace_id) + token = f"switchertype{int(time.time() * 1000)}" + client.rename_workspace(token, workspace=workspace_id) + _ = client.new_split("right") + time.sleep(0.3) + + _open_switcher(client, window_id) + client.simulate_type(token) + _wait_until( + lambda: token in str(_palette_results(client, window_id, limit=60).get("query") or "").strip().lower(), + message="switcher query did not update to workspace token", + ) + + rows = (_palette_results(client, window_id, limit=60).get("results") or []) + if not rows: + raise cmuxError("switcher returned no rows for token query") + + workspace_rows = [ + row for row in rows + if str((row or {}).get("command_id") or "").startswith("switcher.workspace.") + ] + surface_rows = [ + row for row in rows + if str((row or {}).get("command_id") or "").startswith("switcher.surface.") + ] + + if not workspace_rows: + raise cmuxError(f"expected workspace rows for switcher query: rows={rows}") + if not surface_rows: + raise cmuxError(f"expected surface rows for switcher query: rows={rows}") + + bad_workspace = [row for row in workspace_rows if str((row or {}).get("trailing_label") or "") != "Workspace"] + if bad_workspace: + raise cmuxError(f"workspace rows missing 'Workspace' trailing label: {bad_workspace}") + + bad_surface = [row for row in surface_rows if str((row or {}).get("trailing_label") or "") != "Surface"] + if bad_surface: + raise cmuxError(f"surface rows missing 'Surface' trailing label: {bad_surface}") + + _set_palette_visible(client, window_id, False) + client.close_workspace(workspace_id) + + print("PASS: cmd+p switcher rows report Workspace/Surface trailing labels") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_command_palette_window_scope.py b/tests_v2/test_command_palette_window_scope.py new file mode 100644 index 00000000..63236c34 --- /dev/null +++ b/tests_v2/test_command_palette_window_scope.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +""" +Regression test: command palette should open only in the active window. + +Why: if command-palette toggle is broadcast to all windows, inactive windows can +end up with an open palette that steals focus once they become key. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s: float = 5.0, interval_s: float = 0.05, message: str = "timeout") -> None: + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client: cmux, window_id: str) -> bool: + res = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(res.get("visible")) + + +def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: + if _palette_visible(client, window_id) == visible: + return + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id) == visible, + timeout_s=3.0, + message=f"palette in {window_id} did not become {visible}", + ) + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + w1 = client.current_window() + w2 = client.new_window() + time.sleep(0.25) + + ws1 = client.new_workspace(window_id=w1) + ws2 = client.new_workspace(window_id=w2) + time.sleep(0.25) + _set_palette_visible(client, w1, False) + _set_palette_visible(client, w2, False) + + # Open palette in window1 and verify window2 remains untouched. + client._call("debug.command_palette.toggle", {"window_id": w1}) + _wait_until( + lambda: _palette_visible(client, w1), + timeout_s=3.0, + message="window1 command palette did not open", + ) + if _palette_visible(client, w2): + raise cmuxError("window2 palette became visible when toggling window1") + + # Closing window1 palette should not affect window2. + client._call("debug.command_palette.toggle", {"window_id": w1}) + _wait_until( + lambda: not _palette_visible(client, w1), + timeout_s=3.0, + message="window1 command palette did not close", + ) + + # Mirror the same check in the other direction. + client._call("debug.command_palette.toggle", {"window_id": w2}) + _wait_until( + lambda: _palette_visible(client, w2), + timeout_s=3.0, + message="window2 command palette did not open", + ) + if _palette_visible(client, w1): + raise cmuxError("window1 palette became visible when toggling window2") + client._call("debug.command_palette.toggle", {"window_id": w2}) + _wait_until( + lambda: not _palette_visible(client, w2), + timeout_s=3.0, + message="window2 command palette did not close", + ) + + print("PASS: command palette is scoped to active window") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_shortcut_window_scope.py b/tests_v2/test_shortcut_window_scope.py new file mode 100644 index 00000000..a13750e2 --- /dev/null +++ b/tests_v2/test_shortcut_window_scope.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +""" +Regression test: app shortcuts must apply to the focused window only. + +Covers: +- Cmd+B (toggle sidebar) should only affect the active window. +- Cmd+T (new terminal tab/surface) should only affect the active window. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s: float = 4.0, interval_s: float = 0.05, message: str = "timeout") -> None: + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _sidebar_visible(client: cmux, window_id: str) -> bool: + payload = client._call("debug.sidebar.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _surface_count(client: cmux, workspace_id: str) -> int: + payload = client._call("surface.list", {"workspace_id": workspace_id}) or {} + return len(payload.get("surfaces") or []) + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_a = client.current_window() + window_b = client.new_window() + time.sleep(0.25) + + workspace_a = client.new_workspace(window_id=window_a) + workspace_b = client.new_workspace(window_id=window_b) + time.sleep(0.25) + + client.focus_window(window_a) + client.activate_app() + time.sleep(0.2) + + a_before = _sidebar_visible(client, window_a) + b_before = _sidebar_visible(client, window_b) + + client.simulate_shortcut("cmd+b") + _wait_until( + lambda: _sidebar_visible(client, window_a) != a_before, + message="Cmd+B did not toggle sidebar in active window A", + ) + a_after = _sidebar_visible(client, window_a) + b_after = _sidebar_visible(client, window_b) + if b_after != b_before: + raise cmuxError("Cmd+B in window A incorrectly toggled sidebar in window B") + + client.focus_window(window_b) + client.activate_app() + time.sleep(0.2) + + client.simulate_shortcut("cmd+b") + _wait_until( + lambda: _sidebar_visible(client, window_b) != b_after, + message="Cmd+B did not toggle sidebar in active window B", + ) + if _sidebar_visible(client, window_a) != a_after: + raise cmuxError("Cmd+B in window B incorrectly toggled sidebar in window A") + + client.focus_window(window_a) + client.activate_app() + time.sleep(0.2) + client.select_workspace(workspace_a) + time.sleep(0.1) + + count_a_before = _surface_count(client, workspace_a) + count_b_before = _surface_count(client, workspace_b) + + client.simulate_shortcut("cmd+t") + _wait_until( + lambda: _surface_count(client, workspace_a) == count_a_before + 1, + message="Cmd+T did not create a new surface in active window A", + ) + + count_b_after = _surface_count(client, workspace_b) + if count_b_after != count_b_before: + raise cmuxError("Cmd+T in window A incorrectly created a surface in window B") + + print("PASS: window-scoped shortcuts stay in the active window (Cmd+B, Cmd+T)") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 8d03657c946a4b02cbeb2e99d5ef8b4a284b5207 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 04:08:01 -0800 Subject: [PATCH 112/214] Command palette caret uses white tint (#361) * Set command palette caret tint to white * Add command palette window actions and shortcut sync --- Sources/AppDelegate.swift | 19 +++ Sources/ContentView.swift | 48 ++++++- Sources/KeyboardShortcutSettings.swift | 10 ++ Sources/TerminalController.swift | 55 +++++--- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 24 ++++ tests/test_lint_swiftui_patterns.py | 68 +++++++++- ...test_command_palette_shortcut_hint_sync.py | 119 ++++++++++++++++++ tests_v2/test_lint_swiftui_patterns.py | 68 +++++++++- 8 files changed, 380 insertions(+), 31 deletions(-) create mode 100644 tests_v2/test_command_palette_shortcut_hint_sync.py diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 419276d6..35af3c73 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -2315,6 +2315,25 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } + if matchShortcut(event: event, shortcut: KeyboardShortcutSettings.shortcut(for: .closeWindow)) { + guard let targetWindow = event.window ?? NSApp.keyWindow ?? NSApp.mainWindow else { + NSSound.beep() + return true + } + targetWindow.performClose(nil) + return true + } + + if matchShortcut(event: event, shortcut: KeyboardShortcutSettings.shortcut(for: .renameTab)) { + // Keep Cmd+R browser reload behavior when a browser panel is focused. + if tabManager?.focusedBrowserPanel != nil { + return false + } + let targetWindow = activeCommandPaletteWindow() ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow + NotificationCenter.default.post(name: .commandPaletteRenameTabRequested, object: targetWindow) + return true + } + // Numeric shortcuts for specific sidebar tabs: Cmd+1-9 (9 = last workspace) if flags == [.command], let manager = tabManager, diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 8359f265..7817856d 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -2380,7 +2380,7 @@ struct ContentView: View { TextField(commandPaletteSearchPlaceholder, text: $commandPaletteQuery) .textFieldStyle(.plain) .font(.system(size: 13, weight: .regular)) - .tint(.blue) + .tint(.white) .focused($isCommandPaletteSearchFocused) .onSubmit { runSelectedCommandPaletteResult(visibleResults: visibleResults) @@ -2582,7 +2582,7 @@ struct ContentView: View { TextField(target.placeholder, text: $commandPaletteRenameDraft) .textFieldStyle(.plain) .font(.system(size: 13, weight: .regular)) - .tint(.blue) + .tint(.white) .focused($isCommandPaletteRenameFocused) .backport.onKeyPress(.delete) { modifiers in handleCommandPaletteRenameDeleteBackward(modifiers: modifiers) @@ -2941,7 +2941,7 @@ struct ContentView: View { rank: nextRank, title: contribution.title(context), subtitle: contribution.subtitle(context), - shortcutHint: commandPaletteShortcutHint(for: contribution), + shortcutHint: commandPaletteShortcutHint(for: contribution, context: context), keywords: contribution.keywords, dismissOnRun: contribution.dismissOnRun, action: action @@ -2953,7 +2953,15 @@ struct ContentView: View { return commands } - private func commandPaletteShortcutHint(for contribution: CommandPaletteCommandContribution) -> String? { + private func commandPaletteShortcutHint( + for contribution: CommandPaletteCommandContribution, + context: CommandPaletteContextSnapshot + ) -> String? { + // Preserve browser reload semantics for Cmd+R when a browser tab is focused. + if contribution.commandId == "palette.renameTab", + context.bool(CommandPaletteContextKeys.panelIsBrowser) { + return nil + } if let action = commandPaletteShortcutAction(for: contribution.commandId) { return KeyboardShortcutSettings.shortcut(for: action).displayString } @@ -2967,16 +2975,22 @@ struct ContentView: View { switch commandId { case "palette.newWorkspace": return .newTab + case "palette.newWindow": + return .newWindow case "palette.newTerminalTab": return .newSurface case "palette.newBrowserTab": return .openBrowser + case "palette.closeWindow": + return .closeWindow case "palette.toggleSidebar": return .toggleSidebar case "palette.showNotifications": return .showNotifications case "palette.jumpUnread": return .jumpToUnread + case "palette.renameTab": + return .renameTab case "palette.renameWorkspace": return .renameWorkspace case "palette.nextWorkspace": @@ -3108,6 +3122,14 @@ struct ContentView: View { keywords: ["create", "new", "workspace"] ) ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.newWindow", + title: constant("New Window"), + subtitle: constant("Window"), + keywords: ["create", "new", "window"] + ) + ) contributions.append( CommandPaletteCommandContribution( commandId: "palette.newTerminalTab", @@ -3144,6 +3166,14 @@ struct ContentView: View { keywords: ["close", "workspace"] ) ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.closeWindow", + title: constant("Close Window"), + subtitle: constant("Window"), + keywords: ["close", "window"] + ) + ) contributions.append( CommandPaletteCommandContribution( commandId: "palette.reopenClosedBrowserTab", @@ -3543,6 +3573,9 @@ struct ContentView: View { registry.register(commandId: "palette.newWorkspace") { tabManager.addWorkspace() } + registry.register(commandId: "palette.newWindow") { + AppDelegate.shared?.openNewMainWindow(nil) + } registry.register(commandId: "palette.newTerminalTab") { tabManager.newSurface() } @@ -3555,6 +3588,13 @@ struct ContentView: View { registry.register(commandId: "palette.closeWorkspace") { tabManager.closeCurrentWorkspaceWithConfirmation() } + registry.register(commandId: "palette.closeWindow") { + guard let window = observedWindow ?? NSApp.keyWindow ?? NSApp.mainWindow else { + NSSound.beep() + return + } + window.performClose(nil) + } registry.register(commandId: "palette.reopenClosedBrowserTab") { _ = tabManager.reopenMostRecentlyClosedBrowserPanel() } diff --git a/Sources/KeyboardShortcutSettings.swift b/Sources/KeyboardShortcutSettings.swift index 4316a41e..61d7b799 100644 --- a/Sources/KeyboardShortcutSettings.swift +++ b/Sources/KeyboardShortcutSettings.swift @@ -8,6 +8,7 @@ enum KeyboardShortcutSettings { case toggleSidebar case newTab case newWindow + case closeWindow case showNotifications case jumpToUnread case triggerFlash @@ -17,6 +18,7 @@ enum KeyboardShortcutSettings { case prevSurface case nextSidebarTab case prevSidebarTab + case renameTab case renameWorkspace case closeWorkspace case newSurface @@ -43,6 +45,7 @@ enum KeyboardShortcutSettings { case .toggleSidebar: return "Toggle Sidebar" case .newTab: return "New Workspace" case .newWindow: return "New Window" + case .closeWindow: return "Close Window" case .showNotifications: return "Show Notifications" case .jumpToUnread: return "Jump to Latest Unread" case .triggerFlash: return "Flash Focused Panel" @@ -50,6 +53,7 @@ enum KeyboardShortcutSettings { case .prevSurface: return "Previous Surface" case .nextSidebarTab: return "Next Workspace" case .prevSidebarTab: return "Previous Workspace" + case .renameTab: return "Rename Tab" case .renameWorkspace: return "Rename Workspace" case .closeWorkspace: return "Close Workspace" case .newSurface: return "New Surface" @@ -72,11 +76,13 @@ enum KeyboardShortcutSettings { case .toggleSidebar: return "shortcut.toggleSidebar" case .newTab: return "shortcut.newTab" case .newWindow: return "shortcut.newWindow" + case .closeWindow: return "shortcut.closeWindow" case .showNotifications: return "shortcut.showNotifications" case .jumpToUnread: return "shortcut.jumpToUnread" case .triggerFlash: return "shortcut.triggerFlash" case .nextSidebarTab: return "shortcut.nextSidebarTab" case .prevSidebarTab: return "shortcut.prevSidebarTab" + case .renameTab: return "shortcut.renameTab" case .renameWorkspace: return "shortcut.renameWorkspace" case .closeWorkspace: return "shortcut.closeWorkspace" case .focusLeft: return "shortcut.focusLeft" @@ -104,6 +110,8 @@ enum KeyboardShortcutSettings { return StoredShortcut(key: "n", command: true, shift: false, option: false, control: false) case .newWindow: return StoredShortcut(key: "n", command: true, shift: true, option: false, control: false) + case .closeWindow: + return StoredShortcut(key: "w", command: true, shift: false, option: false, control: true) case .showNotifications: return StoredShortcut(key: "i", command: true, shift: false, option: false, control: false) case .jumpToUnread: @@ -114,6 +122,8 @@ enum KeyboardShortcutSettings { return StoredShortcut(key: "]", command: true, shift: false, option: false, control: true) case .prevSidebarTab: return StoredShortcut(key: "[", command: true, shift: false, option: false, control: true) + case .renameTab: + return StoredShortcut(key: "r", command: true, shift: false, option: false, control: false) case .renameWorkspace: return StoredShortcut(key: "r", command: true, shift: true, option: false, control: false) case .closeWorkspace: diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 3622c596..9b392625 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -8230,6 +8230,37 @@ class TerminalController { } #if DEBUG + private func debugShortcutName(for action: KeyboardShortcutSettings.Action) -> String { + let snakeCase = action.rawValue.replacingOccurrences( + of: "([a-z0-9])([A-Z])", + with: "$1_$2", + options: .regularExpression + ) + return snakeCase.lowercased() + } + + private func debugShortcutAction(named rawName: String) -> KeyboardShortcutSettings.Action? { + let normalized = rawName + .trimmingCharacters(in: .whitespacesAndNewlines) + .lowercased() + .replacingOccurrences(of: "-", with: "_") + + for action in KeyboardShortcutSettings.Action.allCases { + let snakeCaseName = debugShortcutName(for: action) + if normalized == snakeCaseName || normalized == snakeCaseName.replacingOccurrences(of: "_", with: "") { + return action + } + } + return nil + } + + private func debugShortcutSupportedNames() -> String { + KeyboardShortcutSettings.Action.allCases + .map(debugShortcutName(for:)) + .sorted() + .joined(separator: ", ") + } + private func setShortcut(_ args: String) -> String { let trimmed = args.trimmingCharacters(in: .whitespacesAndNewlines) let parts = trimmed.split(separator: " ", maxSplits: 1).map(String.init) @@ -8237,29 +8268,15 @@ class TerminalController { return "ERROR: Usage: set_shortcut <name> <combo|clear>" } - let name = parts[0].lowercased() + let name = parts[0] let combo = parts[1].trimmingCharacters(in: .whitespacesAndNewlines) - let defaultsKey: String? - switch name { - case "focus_left", "focusleft": - defaultsKey = KeyboardShortcutSettings.focusLeftKey - case "focus_right", "focusright": - defaultsKey = KeyboardShortcutSettings.focusRightKey - case "focus_up", "focusup": - defaultsKey = KeyboardShortcutSettings.focusUpKey - case "focus_down", "focusdown": - defaultsKey = KeyboardShortcutSettings.focusDownKey - default: - defaultsKey = nil - } - - guard let defaultsKey else { - return "ERROR: Unknown shortcut name. Supported: focus_left, focus_right, focus_up, focus_down" + guard let action = debugShortcutAction(named: name) else { + return "ERROR: Unknown shortcut name. Supported: \(debugShortcutSupportedNames())" } if combo.lowercased() == "clear" || combo.lowercased() == "default" || combo.lowercased() == "reset" { - UserDefaults.standard.removeObject(forKey: defaultsKey) + UserDefaults.standard.removeObject(forKey: action.defaultsKey) return "OK" } @@ -8277,7 +8294,7 @@ class TerminalController { guard let data = try? JSONEncoder().encode(shortcut) else { return "ERROR: Failed to encode shortcut" } - UserDefaults.standard.set(data, forKey: defaultsKey) + UserDefaults.standard.set(data, forKey: action.defaultsKey) return "OK" } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index a9a8eba6..8341c5f1 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -555,6 +555,30 @@ final class BrowserDeveloperToolsShortcutDefaultsTests: XCTestCase { } final class WorkspaceRenameShortcutDefaultsTests: XCTestCase { + func testRenameTabShortcutDefaultsAndMetadata() { + XCTAssertEqual(KeyboardShortcutSettings.Action.renameTab.label, "Rename Tab") + XCTAssertEqual(KeyboardShortcutSettings.Action.renameTab.defaultsKey, "shortcut.renameTab") + + let shortcut = KeyboardShortcutSettings.Action.renameTab.defaultShortcut + XCTAssertEqual(shortcut.key, "r") + XCTAssertTrue(shortcut.command) + XCTAssertFalse(shortcut.shift) + XCTAssertFalse(shortcut.option) + XCTAssertFalse(shortcut.control) + } + + func testCloseWindowShortcutDefaultsAndMetadata() { + XCTAssertEqual(KeyboardShortcutSettings.Action.closeWindow.label, "Close Window") + XCTAssertEqual(KeyboardShortcutSettings.Action.closeWindow.defaultsKey, "shortcut.closeWindow") + + let shortcut = KeyboardShortcutSettings.Action.closeWindow.defaultShortcut + XCTAssertEqual(shortcut.key, "w") + XCTAssertTrue(shortcut.command) + XCTAssertFalse(shortcut.shift) + XCTAssertFalse(shortcut.option) + XCTAssertTrue(shortcut.control) + } + func testRenameWorkspaceShortcutDefaultsAndMetadata() { XCTAssertEqual(KeyboardShortcutSettings.Action.renameWorkspace.label, "Rename Workspace") XCTAssertEqual(KeyboardShortcutSettings.Action.renameWorkspace.defaultsKey, "shortcut.renameWorkspace") diff --git a/tests/test_lint_swiftui_patterns.py b/tests/test_lint_swiftui_patterns.py index f5d82c14..685480eb 100644 --- a/tests/test_lint_swiftui_patterns.py +++ b/tests/test_lint_swiftui_patterns.py @@ -9,6 +9,7 @@ This test checks for: from __future__ import annotations +import re import subprocess import sys from pathlib import Path @@ -94,6 +95,48 @@ def check_autoupdating_text_styles(files: List[Path]) -> List[Tuple[Path, int, s return violations +def check_command_palette_caret_tint(repo_root: Path) -> List[str]: + """Ensure command palette text inputs keep a white caret tint.""" + content_view = repo_root / "Sources" / "ContentView.swift" + if not content_view.exists(): + return [f"Missing expected file: {content_view}"] + + try: + content = content_view.read_text() + except Exception as e: + return [f"Could not read {content_view}: {e}"] + + checks = [ + ( + "search input", + r"TextField\(commandPaletteSearchPlaceholder, text: \$commandPaletteQuery\)(?P<body>.*?)" + r"\.focused\(\$isCommandPaletteSearchFocused\)", + ), + ( + "rename input", + r"TextField\(target\.placeholder, text: \$commandPaletteRenameDraft\)(?P<body>.*?)" + r"\.focused\(\$isCommandPaletteRenameFocused\)", + ), + ] + + violations: List[str] = [] + for label, pattern in checks: + match = re.search(pattern, content, flags=re.DOTALL) + if not match: + violations.append( + f"Could not locate command palette {label} TextField block in Sources/ContentView.swift" + ) + continue + + body = match.group("body") + if ".tint(.white)" not in body: + violations.append( + f"Command palette {label} TextField must use `.tint(.white)` in Sources/ContentView.swift" + ) + + return violations + + def main(): """Run the lint checks.""" repo_root = get_repo_root() @@ -102,15 +145,18 @@ def main(): print(f"Checking {len(swift_files)} Swift files for performance issues...") # Check for auto-updating Text styles - violations = check_autoupdating_text_styles(swift_files) + style_violations = check_autoupdating_text_styles(swift_files) + tint_violations = check_command_palette_caret_tint(repo_root) + has_failures = False - if violations: + if style_violations: + has_failures = True print("\n❌ LINT FAILURES: Auto-updating Text styles found") print("=" * 60) print("These patterns cause continuous SwiftUI view updates and high CPU usage:") print() - for file_path, line_num, line in violations: + for file_path, line_num, line in style_violations: rel_path = file_path.relative_to(repo_root) print(f" {rel_path}:{line_num}") print(f" {line}") @@ -120,9 +166,23 @@ def main(): print(" Instead of: Text(date, style: .time)") print(" Use: Text(date.formatted(date: .omitted, time: .shortened))") print() + + if tint_violations: + has_failures = True + print("\n❌ LINT FAILURES: Command palette caret tint drifted") + print("=" * 60) + print("The command palette search and rename text fields must keep a white caret:") + print() + for message in tint_violations: + print(f" {message}") + print() + print("FIX: Set command palette TextField tint modifiers to `.white`.") + print() + + if has_failures: return 1 - print("✅ No auto-updating Text style patterns found") + print("✅ No linted SwiftUI pattern regressions found") return 0 diff --git a/tests_v2/test_command_palette_shortcut_hint_sync.py b/tests_v2/test_command_palette_shortcut_hint_sync.py new file mode 100644 index 00000000..c6acc01a --- /dev/null +++ b/tests_v2/test_command_palette_shortcut_hint_sync.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +""" +Regression test: command-palette shortcut hints stay in sync with editable shortcuts. + +Validates: +- New Window / Close Window / Rename Tab commands are present in command mode. +- Their displayed shortcut hints reflect the current KeyboardShortcutSettings values. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s=4.0, interval_s=0.05, message="timeout"): + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client: cmux, window_id: str) -> bool: + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: + if _palette_visible(client, window_id) == visible: + return + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id) == visible, + message=f"command palette did not become visible={visible}", + ) + + +def _palette_results(client: cmux, window_id: str, limit=12) -> dict: + return client.command_palette_results(window_id=window_id, limit=limit) + + +def _open_palette_and_rows(client: cmux, window_id: str, limit: int = 80) -> list: + _set_palette_visible(client, window_id, False) + _set_palette_visible(client, window_id, True) + payload = _palette_results(client, window_id, limit=limit) + rows = payload.get("results") or [] + if not rows: + raise cmuxError(f"command palette returned no rows: {payload}") + return rows + + +def _assert_shortcut_hint(rows: list, command_id: str, expected_hint: str) -> None: + row = next((row for row in rows if str((row or {}).get("command_id") or "") == command_id), None) + if row is None: + raise cmuxError(f"missing command palette row for {command_id!r}; rows={rows}") + shortcut_hint = str((row or {}).get("shortcut_hint") or "") + if shortcut_hint != expected_hint: + raise cmuxError( + f"unexpected shortcut hint for {command_id}: expected {expected_hint!r}, got {shortcut_hint!r} row={row}" + ) + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_id = client.current_window() + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_id: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_id) + client.activate_app() + time.sleep(0.2) + + workspace_id = client.new_workspace(window_id=window_id) + client.select_workspace(workspace_id) + time.sleep(0.2) + + shortcut_names = ["new_window", "close_window", "rename_tab"] + try: + rows = _open_palette_and_rows(client, window_id) + _assert_shortcut_hint(rows, "palette.newWindow", "⇧⌘N") + _assert_shortcut_hint(rows, "palette.closeWindow", "⌃⌘W") + _assert_shortcut_hint(rows, "palette.renameTab", "⌘R") + + client.set_shortcut("new_window", "cmd+opt+n") + client.set_shortcut("close_window", "cmd+opt+w") + client.set_shortcut("rename_tab", "cmd+ctrl+r") + + rows = _open_palette_and_rows(client, window_id) + _assert_shortcut_hint(rows, "palette.newWindow", "⌥⌘N") + _assert_shortcut_hint(rows, "palette.closeWindow", "⌥⌘W") + _assert_shortcut_hint(rows, "palette.renameTab", "⌃⌘R") + finally: + for name in shortcut_names: + try: + client.set_shortcut(name, "clear") + except cmuxError: + pass + _set_palette_visible(client, window_id, False) + + print("PASS: command-palette shortcut hints track editable shortcuts for new/close/rename window-tab actions") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_lint_swiftui_patterns.py b/tests_v2/test_lint_swiftui_patterns.py index f5d82c14..685480eb 100644 --- a/tests_v2/test_lint_swiftui_patterns.py +++ b/tests_v2/test_lint_swiftui_patterns.py @@ -9,6 +9,7 @@ This test checks for: from __future__ import annotations +import re import subprocess import sys from pathlib import Path @@ -94,6 +95,48 @@ def check_autoupdating_text_styles(files: List[Path]) -> List[Tuple[Path, int, s return violations +def check_command_palette_caret_tint(repo_root: Path) -> List[str]: + """Ensure command palette text inputs keep a white caret tint.""" + content_view = repo_root / "Sources" / "ContentView.swift" + if not content_view.exists(): + return [f"Missing expected file: {content_view}"] + + try: + content = content_view.read_text() + except Exception as e: + return [f"Could not read {content_view}: {e}"] + + checks = [ + ( + "search input", + r"TextField\(commandPaletteSearchPlaceholder, text: \$commandPaletteQuery\)(?P<body>.*?)" + r"\.focused\(\$isCommandPaletteSearchFocused\)", + ), + ( + "rename input", + r"TextField\(target\.placeholder, text: \$commandPaletteRenameDraft\)(?P<body>.*?)" + r"\.focused\(\$isCommandPaletteRenameFocused\)", + ), + ] + + violations: List[str] = [] + for label, pattern in checks: + match = re.search(pattern, content, flags=re.DOTALL) + if not match: + violations.append( + f"Could not locate command palette {label} TextField block in Sources/ContentView.swift" + ) + continue + + body = match.group("body") + if ".tint(.white)" not in body: + violations.append( + f"Command palette {label} TextField must use `.tint(.white)` in Sources/ContentView.swift" + ) + + return violations + + def main(): """Run the lint checks.""" repo_root = get_repo_root() @@ -102,15 +145,18 @@ def main(): print(f"Checking {len(swift_files)} Swift files for performance issues...") # Check for auto-updating Text styles - violations = check_autoupdating_text_styles(swift_files) + style_violations = check_autoupdating_text_styles(swift_files) + tint_violations = check_command_palette_caret_tint(repo_root) + has_failures = False - if violations: + if style_violations: + has_failures = True print("\n❌ LINT FAILURES: Auto-updating Text styles found") print("=" * 60) print("These patterns cause continuous SwiftUI view updates and high CPU usage:") print() - for file_path, line_num, line in violations: + for file_path, line_num, line in style_violations: rel_path = file_path.relative_to(repo_root) print(f" {rel_path}:{line_num}") print(f" {line}") @@ -120,9 +166,23 @@ def main(): print(" Instead of: Text(date, style: .time)") print(" Use: Text(date.formatted(date: .omitted, time: .shortened))") print() + + if tint_violations: + has_failures = True + print("\n❌ LINT FAILURES: Command palette caret tint drifted") + print("=" * 60) + print("The command palette search and rename text fields must keep a white caret:") + print() + for message in tint_violations: + print(f" {message}") + print() + print("FIX: Set command palette TextField tint modifiers to `.white`.") + print() + + if has_failures: return 1 - print("✅ No auto-updating Text style patterns found") + print("✅ No linted SwiftUI pattern regressions found") return 0 From 1e8859f92201efdac3db11034c4b8790f47c7036 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 04:13:15 -0800 Subject: [PATCH 113/214] Show Cmd+P switcher results across all windows --- Sources/ContentView.swift | 228 +++++++++++++----- ...st_command_palette_switcher_all_windows.py | 128 ++++++++++ 2 files changed, 295 insertions(+), 61 deletions(-) create mode 100644 tests_v2/test_command_palette_switcher_all_windows.py diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 8359f265..ada87fba 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -1328,6 +1328,13 @@ struct ContentView: View { var id: String { command.id } } + private struct CommandPaletteSwitcherWindowContext { + let windowId: UUID + let tabManager: TabManager + let selectedWorkspaceId: UUID? + let windowLabel: String? + } + private static let fixedSidebarResizeCursor = NSCursor( image: NSCursor.resizeLeftRight.image, hotSpot: NSCursor.resizeLeftRight.hotSpot @@ -2792,94 +2799,193 @@ struct ContentView: View { } private func commandPaletteSwitcherEntries() -> [CommandPaletteCommand] { - var workspaces = tabManager.tabs - guard !workspaces.isEmpty else { return [] } - - if let selectedWorkspaceId = tabManager.selectedTabId, - let selectedIndex = workspaces.firstIndex(where: { $0.id == selectedWorkspaceId }) { - let selectedWorkspace = workspaces.remove(at: selectedIndex) - workspaces.insert(selectedWorkspace, at: 0) - } + let windowContexts = commandPaletteSwitcherWindowContexts() + guard !windowContexts.isEmpty else { return [] } var entries: [CommandPaletteCommand] = [] - entries.reserveCapacity(workspaces.count * 4) + let estimatedCount = windowContexts.reduce(0) { partial, context in + partial + max(1, context.tabManager.tabs.count) * 4 + } + entries.reserveCapacity(estimatedCount) var nextRank = 0 - for workspace in workspaces { - let workspaceName = workspaceDisplayName(workspace) - let workspaceCommandId = "switcher.workspace.\(workspace.id.uuidString.lowercased())" - let workspaceKeywords = CommandPaletteSwitcherSearchIndexer.keywords( - baseKeywords: [ - "workspace", - "switch", - "go", - "open", - workspaceName - ], - metadata: commandPaletteWorkspaceSearchMetadata(for: workspace), - detail: .workspace - ) - entries.append( - CommandPaletteCommand( - id: workspaceCommandId, - rank: nextRank, - title: workspaceName, - subtitle: "Workspace", - shortcutHint: nil, - keywords: workspaceKeywords, - dismissOnRun: true, - action: { - tabManager.focusTab(workspace.id, suppressFlash: true) - } - ) - ) - nextRank += 1 + for context in windowContexts { + var workspaces = context.tabManager.tabs + guard !workspaces.isEmpty else { continue } - var orderedPanelIds = workspace.sidebarOrderedPanelIds() - if let focusedPanelId = workspace.focusedPanelId, - let focusedIndex = orderedPanelIds.firstIndex(of: focusedPanelId) { - orderedPanelIds.remove(at: focusedIndex) - orderedPanelIds.insert(focusedPanelId, at: 0) + let selectedWorkspaceId = context.selectedWorkspaceId ?? context.tabManager.selectedTabId + if let selectedWorkspaceId, + let selectedIndex = workspaces.firstIndex(where: { $0.id == selectedWorkspaceId }) { + let selectedWorkspace = workspaces.remove(at: selectedIndex) + workspaces.insert(selectedWorkspace, at: 0) } - for panelId in orderedPanelIds { - guard let panel = workspace.panels[panelId] else { continue } - let panelTitle = panelDisplayName(workspace: workspace, panelId: panelId, fallback: panel.displayTitle) - let typeLabel: String = (panel.panelType == .browser) ? "Browser" : "Terminal" - let panelKeywords = CommandPaletteSwitcherSearchIndexer.keywords( + let windowId = context.windowId + let windowTabManager = context.tabManager + let windowKeywords = commandPaletteWindowKeywords(windowLabel: context.windowLabel) + for workspace in workspaces { + let workspaceName = workspaceDisplayName(workspace) + let workspaceCommandId = "switcher.workspace.\(workspace.id.uuidString.lowercased())" + let workspaceKeywords = CommandPaletteSwitcherSearchIndexer.keywords( baseKeywords: [ - "tab", - "surface", - "panel", + "workspace", "switch", "go", - workspaceName, - panelTitle, - typeLabel.lowercased() - ], - metadata: commandPalettePanelSearchMetadata(in: workspace, panelId: panelId) + "open", + workspaceName + ] + windowKeywords, + metadata: commandPaletteWorkspaceSearchMetadata(for: workspace), + detail: .workspace ) + let workspaceId = workspace.id entries.append( CommandPaletteCommand( - id: "switcher.surface.\(workspace.id.uuidString.lowercased()).\(panelId.uuidString.lowercased())", + id: workspaceCommandId, rank: nextRank, - title: panelTitle, - subtitle: "\(typeLabel) • \(workspaceName)", + title: workspaceName, + subtitle: commandPaletteSwitcherSubtitle(base: "Workspace", windowLabel: context.windowLabel), shortcutHint: nil, - keywords: panelKeywords, + keywords: workspaceKeywords, dismissOnRun: true, action: { - tabManager.focusTab(workspace.id, surfaceId: panelId, suppressFlash: true) + focusCommandPaletteSwitcherTarget( + windowId: windowId, + tabManager: windowTabManager, + workspaceId: workspaceId, + panelId: nil + ) } ) ) nextRank += 1 + + var orderedPanelIds = workspace.sidebarOrderedPanelIds() + if let focusedPanelId = workspace.focusedPanelId, + let focusedIndex = orderedPanelIds.firstIndex(of: focusedPanelId) { + orderedPanelIds.remove(at: focusedIndex) + orderedPanelIds.insert(focusedPanelId, at: 0) + } + + for panelId in orderedPanelIds { + guard let panel = workspace.panels[panelId] else { continue } + let panelTitle = panelDisplayName(workspace: workspace, panelId: panelId, fallback: panel.displayTitle) + let typeLabel: String = (panel.panelType == .browser) ? "Browser" : "Terminal" + let panelKeywords = CommandPaletteSwitcherSearchIndexer.keywords( + baseKeywords: [ + "tab", + "surface", + "panel", + "switch", + "go", + workspaceName, + panelTitle, + typeLabel.lowercased() + ] + windowKeywords, + metadata: commandPalettePanelSearchMetadata(in: workspace, panelId: panelId) + ) + entries.append( + CommandPaletteCommand( + id: "switcher.surface.\(workspace.id.uuidString.lowercased()).\(panelId.uuidString.lowercased())", + rank: nextRank, + title: panelTitle, + subtitle: commandPaletteSwitcherSubtitle( + base: "\(typeLabel) • \(workspaceName)", + windowLabel: context.windowLabel + ), + shortcutHint: nil, + keywords: panelKeywords, + dismissOnRun: true, + action: { + focusCommandPaletteSwitcherTarget( + windowId: windowId, + tabManager: windowTabManager, + workspaceId: workspaceId, + panelId: panelId + ) + } + ) + ) + nextRank += 1 + } } } return entries } + private func commandPaletteSwitcherWindowContexts() -> [CommandPaletteSwitcherWindowContext] { + let fallback = CommandPaletteSwitcherWindowContext( + windowId: windowId, + tabManager: tabManager, + selectedWorkspaceId: tabManager.selectedTabId, + windowLabel: nil + ) + + guard let appDelegate = AppDelegate.shared else { return [fallback] } + let summaries = appDelegate.listMainWindowSummaries() + guard !summaries.isEmpty else { return [fallback] } + + let orderedSummaries = summaries.sorted { lhs, rhs in + let lhsIsCurrent = lhs.windowId == windowId + let rhsIsCurrent = rhs.windowId == windowId + if lhsIsCurrent != rhsIsCurrent { return lhsIsCurrent } + if lhs.isKeyWindow != rhs.isKeyWindow { return lhs.isKeyWindow } + if lhs.isVisible != rhs.isVisible { return lhs.isVisible } + return lhs.windowId.uuidString < rhs.windowId.uuidString + } + + var windowLabelById: [UUID: String] = [:] + if orderedSummaries.count > 1 { + for (index, summary) in orderedSummaries.enumerated() where summary.windowId != windowId { + windowLabelById[summary.windowId] = "Window \(index + 1)" + } + } + + var contexts: [CommandPaletteSwitcherWindowContext] = [] + var seenWindowIds: Set<UUID> = [] + for summary in orderedSummaries { + guard let manager = appDelegate.tabManagerFor(windowId: summary.windowId) else { continue } + guard seenWindowIds.insert(summary.windowId).inserted else { continue } + contexts.append( + CommandPaletteSwitcherWindowContext( + windowId: summary.windowId, + tabManager: manager, + selectedWorkspaceId: summary.selectedWorkspaceId, + windowLabel: windowLabelById[summary.windowId] + ) + ) + } + + if contexts.isEmpty { + return [fallback] + } + return contexts + } + + private func commandPaletteSwitcherSubtitle(base: String, windowLabel: String?) -> String { + guard let windowLabel else { return base } + return "\(base) • \(windowLabel)" + } + + private func commandPaletteWindowKeywords(windowLabel: String?) -> [String] { + guard let windowLabel else { return [] } + return ["window", windowLabel.lowercased()] + } + + private func focusCommandPaletteSwitcherTarget( + windowId: UUID, + tabManager: TabManager, + workspaceId: UUID, + panelId: UUID? + ) { + _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) + if let panelId { + tabManager.focusTab(workspaceId, surfaceId: panelId, suppressFlash: true) + } else { + tabManager.focusTab(workspaceId, suppressFlash: true) + } + } + private func commandPaletteWorkspaceSearchMetadata(for workspace: Workspace) -> CommandPaletteSwitcherSearchMetadata { // Keep workspace rows coarse so surface rows win for directory/branch-specific queries. let directories = [workspace.currentDirectory] diff --git a/tests_v2/test_command_palette_switcher_all_windows.py b/tests_v2/test_command_palette_switcher_all_windows.py new file mode 100644 index 00000000..b779d383 --- /dev/null +++ b/tests_v2/test_command_palette_switcher_all_windows.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +""" +Regression test: cmd+p switcher should include workspaces from every window. + +Why: switcher rows were sourced from the current window's TabManager only, so +Cmd+P could not jump to workspaces/tabs owned by other windows. +""" + +import os +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") + + +def _wait_until(predicate, timeout_s: float = 6.0, interval_s: float = 0.05, message: str = "timeout") -> None: + start = time.time() + while time.time() - start < timeout_s: + if predicate(): + return + time.sleep(interval_s) + raise cmuxError(message) + + +def _palette_visible(client: cmux, window_id: str) -> bool: + payload = client._call("debug.command_palette.visible", {"window_id": window_id}) or {} + return bool(payload.get("visible")) + + +def _palette_results(client: cmux, window_id: str, limit: int = 20) -> dict: + return client.command_palette_results(window_id=window_id, limit=limit) + + +def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: + if _palette_visible(client, window_id) == visible: + return + client._call("debug.command_palette.toggle", {"window_id": window_id}) + _wait_until( + lambda: _palette_visible(client, window_id) == visible, + message=f"palette visibility in {window_id} did not become {visible}", + ) + + +def main() -> int: + with cmux(SOCKET_PATH) as client: + client.activate_app() + time.sleep(0.2) + + window_a = client.current_window() + for row in client.list_windows(): + other_id = str(row.get("id") or "") + if other_id and other_id != window_a: + client.close_window(other_id) + time.sleep(0.2) + + client.focus_window(window_a) + client.activate_app() + time.sleep(0.2) + + window_b = client.new_window() + time.sleep(0.25) + + token_suffix = f"{int(time.time() * 1000)}" + token_a = f"cmdp-window-a-{token_suffix}" + token_b = f"cmdp-window-b-{token_suffix}" + + workspace_a = client.new_workspace(window_id=window_a) + client.rename_workspace(token_a, workspace=workspace_a) + + workspace_b = client.new_workspace(window_id=window_b) + client.rename_workspace(token_b, workspace=workspace_b) + time.sleep(0.25) + + client.focus_window(window_a) + client.activate_app() + time.sleep(0.2) + _set_palette_visible(client, window_a, False) + _set_palette_visible(client, window_b, False) + + client.simulate_shortcut("cmd+p") + _wait_until( + lambda: _palette_visible(client, window_a), + message="cmd+p did not open palette in window A", + ) + _wait_until( + lambda: str(_palette_results(client, window_a).get("mode") or "") == "switcher", + message="cmd+p did not open switcher mode in window A", + ) + + client.simulate_type(token_b) + _wait_until( + lambda: token_b in str(_palette_results(client, window_a).get("query") or "").strip().lower(), + message="switcher query did not update with window B token", + ) + + result_rows = (_palette_results(client, window_a, limit=64).get("results") or []) + target_workspace_command = f"switcher.workspace.{workspace_b.lower()}" + if not any(str((row or {}).get("command_id") or "") == target_workspace_command for row in result_rows): + raise cmuxError( + f"cmd+p switcher in window A did not include workspace from window B " + f"(expected {target_workspace_command}); rows={result_rows[:8]}" + ) + + client.simulate_shortcut("enter") + _wait_until( + lambda: not _palette_visible(client, window_a), + message="palette did not close after selecting cross-window switcher row", + ) + _wait_until( + lambda: client.current_workspace().lower() == workspace_b.lower(), + message="Enter on cross-window switcher row did not move to window B workspace", + ) + _wait_until( + lambda: client.current_window().lower() == window_b.lower(), + message="Enter on cross-window switcher row did not focus window B", + ) + + print("PASS: cmd+p switcher includes and navigates to workspaces from other windows") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 82d2d0e474d58817d6f51896c19485961f4ca644 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 04:53:25 -0800 Subject: [PATCH 114/214] Add command palette apply and attempt update actions --- Sources/AppDelegate.swift | 10 ++ Sources/ContentView.swift | 22 ++++ Sources/Update/UpdateController.swift | 38 ++++++ tests/test_command_palette_update_commands.py | 114 ++++++++++++++++++ 4 files changed, 184 insertions(+) create mode 100755 tests/test_command_palette_update_commands.py diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 35af3c73..8cc8586b 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1078,6 +1078,16 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent updateController.checkForUpdates() } + @objc func applyUpdateIfAvailable(_ sender: Any?) { + updateViewModel.overrideState = nil + updateController.installUpdate() + } + + @objc func attemptUpdate(_ sender: Any?) { + updateViewModel.overrideState = nil + updateController.attemptUpdate() + } + private func setupMenuBarExtra() { let store = TerminalNotificationStore.shared menuBarExtraController = MenuBarExtraController( diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index b887a15e..f8efb60a 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -3330,6 +3330,22 @@ struct ContentView: View { keywords: ["update", "upgrade", "release"] ) ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.applyUpdateIfAvailable", + title: constant("Apply Update (If Available)"), + subtitle: constant("Global"), + keywords: ["apply", "install", "update", "available"] + ) + ) + contributions.append( + CommandPaletteCommandContribution( + commandId: "palette.attemptUpdate", + title: constant("Attempt Update"), + subtitle: constant("Global"), + keywords: ["attempt", "check", "update", "upgrade", "release"] + ) + ) contributions.append( CommandPaletteCommandContribution( @@ -3719,6 +3735,12 @@ struct ContentView: View { registry.register(commandId: "palette.checkForUpdates") { AppDelegate.shared?.checkForUpdates(nil) } + registry.register(commandId: "palette.applyUpdateIfAvailable") { + AppDelegate.shared?.applyUpdateIfAvailable(nil) + } + registry.register(commandId: "palette.attemptUpdate") { + AppDelegate.shared?.attemptUpdate(nil) + } registry.register(commandId: "palette.renameWorkspace") { beginRenameWorkspaceFlow() diff --git a/Sources/Update/UpdateController.swift b/Sources/Update/UpdateController.swift index 0fc1c4e1..94fae950 100644 --- a/Sources/Update/UpdateController.swift +++ b/Sources/Update/UpdateController.swift @@ -8,6 +8,8 @@ class UpdateController { private(set) var updater: SPUUpdater private let userDriver: UpdateDriver private var installCancellable: AnyCancellable? + private var attemptInstallCancellable: AnyCancellable? + private var didObserveAttemptUpdateProgress: Bool = false private var noUpdateDismissCancellable: AnyCancellable? private var noUpdateDismissWorkItem: DispatchWorkItem? private var readyCheckWorkItem: DispatchWorkItem? @@ -46,6 +48,7 @@ class UpdateController { deinit { installCancellable?.cancel() + attemptInstallCancellable?.cancel() noUpdateDismissCancellable?.cancel() noUpdateDismissWorkItem?.cancel() readyCheckWorkItem?.cancel() @@ -107,6 +110,35 @@ class UpdateController { } } + /// Check for updates and auto-confirm install if one is found. + func attemptUpdate() { + stopAttemptUpdateMonitoring() + didObserveAttemptUpdateProgress = false + + attemptInstallCancellable = viewModel.$state + .receive(on: DispatchQueue.main) + .sink { [weak self] state in + guard let self else { return } + + if state.isInstallable || !state.isIdle { + self.didObserveAttemptUpdateProgress = true + } + + if case .updateAvailable = state { + UpdateLogStore.shared.append("attemptUpdate auto-confirming available update") + state.confirm() + return + } + + guard self.didObserveAttemptUpdateProgress, !state.isInstallable else { + return + } + self.stopAttemptUpdateMonitoring() + } + + checkForUpdates() + } + /// Check for updates (used by the menu item). @objc func checkForUpdates() { UpdateLogStore.shared.append("checkForUpdates invoked (state=\(viewModel.state.isIdle ? "idle" : "busy"))") @@ -175,6 +207,12 @@ class UpdateController { return true } + private func stopAttemptUpdateMonitoring() { + attemptInstallCancellable?.cancel() + attemptInstallCancellable = nil + didObserveAttemptUpdateProgress = false + } + private func installNoUpdateDismissObserver() { noUpdateDismissCancellable = Publishers.CombineLatest(viewModel.$state, viewModel.$overrideState) .receive(on: DispatchQueue.main) diff --git a/tests/test_command_palette_update_commands.py b/tests/test_command_palette_update_commands.py new file mode 100755 index 00000000..b126d6e8 --- /dev/null +++ b/tests/test_command_palette_update_commands.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +"""Regression test for command-palette update command wiring.""" + +from __future__ import annotations + +import re +import subprocess +from pathlib import Path + + +def get_repo_root() -> Path: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return Path(result.stdout.strip()) + return Path.cwd() + + +def read_text(path: Path) -> str: + return path.read_text(encoding="utf-8") + + +def expect_regex(content: str, pattern: str, message: str, failures: list[str]) -> None: + if re.search(pattern, content, flags=re.DOTALL) is None: + failures.append(message) + + +def main() -> int: + repo_root = get_repo_root() + content_view_path = repo_root / "Sources" / "ContentView.swift" + app_delegate_path = repo_root / "Sources" / "AppDelegate.swift" + controller_path = repo_root / "Sources" / "Update" / "UpdateController.swift" + + missing_paths = [ + str(path) + for path in [content_view_path, app_delegate_path, controller_path] + if not path.exists() + ] + if missing_paths: + print("Missing expected files:") + for path in missing_paths: + print(f" - {path}") + return 1 + + content_view = read_text(content_view_path) + app_delegate = read_text(app_delegate_path) + controller = read_text(controller_path) + + failures: list[str] = [] + + expect_regex( + content_view, + r'commandId:\s*"palette\.applyUpdateIfAvailable".*?title:\s*constant\("Apply Update \(If Available\)"\).*?keywords:\s*\[[^\]]*"apply"[^\]]*"install"[^\]]*"update"[^\]]*"available"[^\]]*\]', + "Missing or incomplete `palette.applyUpdateIfAvailable` contribution", + failures, + ) + expect_regex( + content_view, + r'commandId:\s*"palette\.attemptUpdate".*?title:\s*constant\("Attempt Update"\).*?keywords:\s*\[[^\]]*"attempt"[^\]]*"check"[^\]]*"update"[^\]]*\]', + "Missing or incomplete `palette.attemptUpdate` contribution", + failures, + ) + expect_regex( + content_view, + r'registry\.register\(commandId:\s*"palette\.applyUpdateIfAvailable"\)\s*\{\s*AppDelegate\.shared\?\.applyUpdateIfAvailable\(nil\)\s*\}', + "Missing handler registration for `palette.applyUpdateIfAvailable`", + failures, + ) + expect_regex( + content_view, + r'registry\.register\(commandId:\s*"palette\.attemptUpdate"\)\s*\{\s*AppDelegate\.shared\?\.attemptUpdate\(nil\)\s*\}', + "Missing handler registration for `palette.attemptUpdate`", + failures, + ) + + expect_regex( + app_delegate, + r'@objc\s+func\s+applyUpdateIfAvailable\(_\s+sender:\s+Any\?\)\s*\{\s*updateViewModel\.overrideState\s*=\s*nil\s*updateController\.installUpdate\(\)\s*\}', + "`AppDelegate.applyUpdateIfAvailable` is missing or does not call `updateController.installUpdate()`", + failures, + ) + expect_regex( + app_delegate, + r'@objc\s+func\s+attemptUpdate\(_\s+sender:\s+Any\?\)\s*\{\s*updateViewModel\.overrideState\s*=\s*nil\s*updateController\.attemptUpdate\(\)\s*\}', + "`AppDelegate.attemptUpdate` is missing or does not call `updateController.attemptUpdate()`", + failures, + ) + + expect_regex( + controller, + r'func\s+attemptUpdate\(\)\s*\{', + "`UpdateController.attemptUpdate()` is missing", + failures, + ) + if "state.confirm()" not in controller: + failures.append("`UpdateController.attemptUpdate()` no longer auto-confirms update installation") + if "checkForUpdates()" not in controller: + failures.append("`UpdateController.attemptUpdate()` no longer triggers a check before install") + + if failures: + print("FAIL: command-palette update command regression(s) detected") + for failure in failures: + print(f"- {failure}") + return 1 + + print("PASS: command-palette update commands expose apply + attempt wiring") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From bf69fcbdcf6b7a10b4987b8679371b0da1a31b73 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 04:56:48 -0800 Subject: [PATCH 115/214] Hide apply-update command until update is available --- Sources/ContentView.swift | 9 ++++++++- tests/test_command_palette_update_commands.py | 16 ++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index f8efb60a..21b5f01b 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -1275,6 +1275,8 @@ struct ContentView: View { static let panelHasCustomName = "panel.hasCustomName" static let panelShouldPin = "panel.shouldPin" static let panelHasUnread = "panel.hasUnread" + + static let updateHasAvailable = "update.hasAvailable" } private struct CommandPaletteCommandContribution { @@ -3190,6 +3192,10 @@ struct ContentView: View { snapshot.setBool(CommandPaletteContextKeys.panelHasUnread, hasUnread) } + if case .updateAvailable = updateViewModel.effectiveState { + snapshot.setBool(CommandPaletteContextKeys.updateHasAvailable, true) + } + return snapshot } @@ -3335,7 +3341,8 @@ struct ContentView: View { commandId: "palette.applyUpdateIfAvailable", title: constant("Apply Update (If Available)"), subtitle: constant("Global"), - keywords: ["apply", "install", "update", "available"] + keywords: ["apply", "install", "update", "available"], + when: { $0.bool(CommandPaletteContextKeys.updateHasAvailable) } ) ) contributions.append( diff --git a/tests/test_command_palette_update_commands.py b/tests/test_command_palette_update_commands.py index b126d6e8..f5035037 100755 --- a/tests/test_command_palette_update_commands.py +++ b/tests/test_command_palette_update_commands.py @@ -53,8 +53,20 @@ def main() -> int: expect_regex( content_view, - r'commandId:\s*"palette\.applyUpdateIfAvailable".*?title:\s*constant\("Apply Update \(If Available\)"\).*?keywords:\s*\[[^\]]*"apply"[^\]]*"install"[^\]]*"update"[^\]]*"available"[^\]]*\]', - "Missing or incomplete `palette.applyUpdateIfAvailable` contribution", + r'static\s+let\s+updateHasAvailable\s*=\s*"update\.hasAvailable"', + "Missing `CommandPaletteContextKeys.updateHasAvailable`", + failures, + ) + expect_regex( + content_view, + r'if\s+case\s+\.updateAvailable\s*=\s*updateViewModel\.effectiveState\s*\{\s*snapshot\.setBool\(CommandPaletteContextKeys\.updateHasAvailable,\s*true\)\s*\}', + "Command palette context no longer tracks update-available state", + failures, + ) + expect_regex( + content_view, + r'commandId:\s*"palette\.applyUpdateIfAvailable".*?title:\s*constant\("Apply Update \(If Available\)"\).*?keywords:\s*\[[^\]]*"apply"[^\]]*"install"[^\]]*"update"[^\]]*"available"[^\]]*\].*?when:\s*\{\s*\$0\.bool\(CommandPaletteContextKeys\.updateHasAvailable\)\s*\}', + "Missing or incomplete `palette.applyUpdateIfAvailable` contribution visibility gating", failures, ) expect_regex( From 5070b137a4c920361c62a38a9de1fcecab539a09 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 05:19:58 -0800 Subject: [PATCH 116/214] Fix early Cmd+D then Ctrl+D split startup hang (#364) * Harden early Ctrl+D child-exit callback routing * Add Ctrl+D close-path tracing and suppress tiny-frame focus churn * Suppress hidden-surface onFocus callbacks during portal churn --- Sources/AppDelegate.swift | 8 + Sources/GhosttyTerminalView.swift | 175 ++++++++++++++------ Sources/TabManager.swift | 22 ++- cmuxUITests/CloseWorkspaceCmdDUITests.swift | 13 ++ 4 files changed, 165 insertions(+), 53 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 8cc8586b..f6811ae8 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -2190,8 +2190,16 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent // Keep keyboard routing deterministic after split close/reparent transitions: // before processing shortcuts, converge first responder with the focused terminal panel. if isControlD { +#if DEBUG + let selected = tabManager?.selectedTabId?.uuidString.prefix(5) ?? "nil" + let focused = tabManager?.selectedWorkspace?.focusedPanelId?.uuidString.prefix(5) ?? "nil" + let frType = NSApp.keyWindow?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" + dlog("shortcut.ctrlD stage=preReconcile selected=\(selected) focused=\(focused) fr=\(frType)") +#endif tabManager?.reconcileFocusedPanelFromFirstResponderForKeyboard() #if DEBUG + let frAfterType = NSApp.keyWindow?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" + dlog("shortcut.ctrlD stage=postReconcile fr=\(frAfterType)") writeChildExitKeyboardProbe([:], increments: ["probeAppShortcutCtrlDPassedCount": 1]) #endif // Ctrl+D belongs to the focused terminal surface; never treat it as an app shortcut. diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index c3c369f7..38998db0 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -229,9 +229,21 @@ func resolveTerminalOpenURLTarget(_ rawValue: String) -> TerminalOpenURLTarget? private final class GhosttySurfaceCallbackContext { weak var surfaceView: GhosttyNSView? + weak var terminalSurface: TerminalSurface? + let surfaceId: UUID - init(surfaceView: GhosttyNSView) { + init(surfaceView: GhosttyNSView, terminalSurface: TerminalSurface) { self.surfaceView = surfaceView + self.terminalSurface = terminalSurface + self.surfaceId = terminalSurface.id + } + + var tabId: UUID? { + terminalSurface?.tabId ?? surfaceView?.tabId + } + + var runtimeSurface: ghostty_surface_t? { + terminalSurface?.surface ?? surfaceView?.terminalSurface?.surface } } @@ -433,8 +445,8 @@ class GhosttyApp { } runtimeConfig.read_clipboard_cb = { userdata, location, state in // Read clipboard - guard let surfaceView = GhosttyApp.surfaceView(from: userdata) else { return } - guard let surface = surfaceView.terminalSurface?.surface else { return } + guard let callbackContext = GhosttyApp.callbackContext(from: userdata), + let surface = callbackContext.runtimeSurface else { return } let pasteboard = GhosttyPasteboardHelper.pasteboard(for: location) let value = pasteboard.flatMap { GhosttyPasteboardHelper.stringContents(from: $0) } ?? "" @@ -445,8 +457,8 @@ class GhosttyApp { } runtimeConfig.confirm_read_clipboard_cb = { userdata, content, state, _ in guard let content else { return } - guard let surfaceView = GhosttyApp.surfaceView(from: userdata) else { return } - guard let surface = surfaceView.terminalSurface?.surface else { return } + guard let callbackContext = GhosttyApp.callbackContext(from: userdata), + let surface = callbackContext.runtimeSurface else { return } ghostty_surface_complete_clipboard_request(surface, content, state, true) } @@ -478,16 +490,16 @@ class GhosttyApp { } } runtimeConfig.close_surface_cb = { userdata, needsConfirmClose in - guard let surfaceView = GhosttyApp.surfaceView(from: userdata) else { return } - let callbackSurfaceId = surfaceView.terminalSurface?.id - let callbackTabId = surfaceView.tabId + guard let callbackContext = GhosttyApp.callbackContext(from: userdata) else { return } + let callbackSurfaceId = callbackContext.surfaceId + let callbackTabId = callbackContext.tabId #if DEBUG cmuxWriteChildExitProbe( [ "probeCloseSurfaceNeedsConfirm": needsConfirmClose ? "1" : "0", "probeCloseSurfaceTabId": callbackTabId?.uuidString ?? "", - "probeCloseSurfaceSurfaceId": callbackSurfaceId?.uuidString ?? "", + "probeCloseSurfaceSurfaceId": callbackSurfaceId.uuidString, ], increments: ["probeCloseSurfaceCbCount": 1] ) @@ -498,7 +510,6 @@ class GhosttyApp { // Close requests must be resolved by the callback's workspace/surface IDs only. // If the mapping is already gone (duplicate/stale callback), ignore it. if let callbackTabId, - let callbackSurfaceId, let manager = app.tabManagerFor(tabId: callbackTabId) ?? app.tabManager, let workspace = manager.tabs.first(where: { $0.id == callbackTabId }), workspace.panels[callbackSurfaceId] != nil { @@ -876,10 +887,9 @@ class GhosttyApp { } } - private static func surfaceView(from userdata: UnsafeMutableRawPointer?) -> GhosttyNSView? { + private static func callbackContext(from userdata: UnsafeMutableRawPointer?) -> GhosttySurfaceCallbackContext? { guard let userdata else { return nil } - let context = Unmanaged<GhosttySurfaceCallbackContext>.fromOpaque(userdata).takeUnretainedValue() - return context.surfaceView + return Unmanaged<GhosttySurfaceCallbackContext>.fromOpaque(userdata).takeUnretainedValue() } private func handleAction(target: ghostty_target_s, action: ghostty_action_s) -> Bool { @@ -959,16 +969,55 @@ class GhosttyApp { return false } - let surfaceView = Self.surfaceView(from: ghostty_surface_userdata(target.target.surface)) - guard let surfaceView else { return false } + let callbackContext = Self.callbackContext(from: ghostty_surface_userdata(target.target.surface)) + let callbackTabId = callbackContext?.tabId + let callbackSurfaceId = callbackContext?.surfaceId + + if action.tag == GHOSTTY_ACTION_SHOW_CHILD_EXITED { + // The child (shell) exited. Ghostty will fall back to printing + // "Process exited. Press any key..." into the terminal unless the host + // handles this action. For cmux, the correct behavior is to close + // the panel immediately (no prompt). +#if DEBUG + dlog( + "surface.action.showChildExited tab=\(callbackTabId?.uuidString.prefix(5) ?? "nil") " + + "surface=\(callbackSurfaceId?.uuidString.prefix(5) ?? "nil")" + ) +#endif +#if DEBUG + cmuxWriteChildExitProbe( + [ + "probeShowChildExitedTabId": callbackTabId?.uuidString ?? "", + "probeShowChildExitedSurfaceId": callbackSurfaceId?.uuidString ?? "", + ], + increments: ["probeShowChildExitedCount": 1] + ) +#endif + // Keep host-close async to avoid re-entrant close/deinit while Ghostty is still + // dispatching this action callback. + DispatchQueue.main.async { + guard let app = AppDelegate.shared else { return } + if let callbackTabId, + let callbackSurfaceId, + let manager = app.tabManagerFor(tabId: callbackTabId) ?? app.tabManager, + let workspace = manager.tabs.first(where: { $0.id == callbackTabId }), + workspace.panels[callbackSurfaceId] != nil { + manager.closePanelAfterChildExited(tabId: callbackTabId, surfaceId: callbackSurfaceId) + } + } + // Always report handled so Ghostty doesn't print the fallback prompt. + return true + } + + guard let surfaceView = callbackContext?.surfaceView else { return false } if action.tag == GHOSTTY_ACTION_RELOAD_CONFIG || action.tag == GHOSTTY_ACTION_CONFIG_CHANGE || action.tag == GHOSTTY_ACTION_COLOR_CHANGE { logAction( action, target: target, - tabId: surfaceView.tabId, - surfaceId: surfaceView.terminalSurface?.id + tabId: callbackTabId ?? surfaceView.tabId, + surfaceId: callbackSurfaceId ?? surfaceView.terminalSurface?.id ) } @@ -1133,36 +1182,6 @@ class GhosttyApp { ) } return true - case GHOSTTY_ACTION_SHOW_CHILD_EXITED: - // The child (shell) exited. Ghostty will fall back to printing - // "Process exited. Press any key..." into the terminal unless the host - // handles this action. For cmux, the correct behavior is to close - // the panel immediately (no prompt). - let callbackTabId = surfaceView.tabId - let callbackSurfaceId = surfaceView.terminalSurface?.id -#if DEBUG - cmuxWriteChildExitProbe( - [ - "probeShowChildExitedTabId": callbackTabId?.uuidString ?? "", - "probeShowChildExitedSurfaceId": callbackSurfaceId?.uuidString ?? "", - ], - increments: ["probeShowChildExitedCount": 1] - ) -#endif - // Keep host-close async to avoid re-entrant close/deinit while Ghostty is still - // dispatching this action callback. - DispatchQueue.main.async { - guard let app = AppDelegate.shared else { return } - if let callbackTabId, - let callbackSurfaceId, - let manager = app.tabManagerFor(tabId: callbackTabId) ?? app.tabManager, - let workspace = manager.tabs.first(where: { $0.id == callbackTabId }), - workspace.panels[callbackSurfaceId] != nil { - manager.closePanelAfterChildExited(tabId: callbackTabId, surfaceId: callbackSurfaceId) - } - } - // Always report handled so Ghostty doesn't print the fallback prompt. - return true case GHOSTTY_ACTION_COLOR_CHANGE: if action.action.color_change.kind == GHOSTTY_ACTION_COLOR_KIND_BACKGROUND { let change = action.action.color_change @@ -1591,7 +1610,7 @@ final class TerminalSurface: Identifiable, ObservableObject { surfaceConfig.platform = ghostty_platform_u(macos: ghostty_platform_macos_s( nsview: Unmanaged.passUnretained(view).toOpaque() )) - let callbackContext = Unmanaged.passRetained(GhosttySurfaceCallbackContext(surfaceView: view)) + let callbackContext = Unmanaged.passRetained(GhosttySurfaceCallbackContext(surfaceView: view, terminalSurface: self)) surfaceConfig.userdata = callbackContext.toOpaque() surfaceCallbackContext?.release() surfaceCallbackContext = callbackContext @@ -2037,6 +2056,10 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { private var lastSizeSkipSignature: String? #endif + private var hasUsableFocusGeometry: Bool { + bounds.width > 1 && bounds.height > 1 + } + // Visibility is used for focus gating, not for libghostty occlusion. fileprivate var isVisibleInUI: Bool { visibleInUI } fileprivate func setVisibleInUI(_ visible: Bool) { @@ -2435,8 +2458,16 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { // focus/selection can converge. Previously this was gated on `surface != nil`, which // allowed a mismatch where AppKit focus moved but the UI focus indicator (bonsplit) // stayed behind. - if isVisibleInUI { + let hiddenInHierarchy = isHiddenOrHasHiddenAncestor + if isVisibleInUI && hasUsableFocusGeometry && !hiddenInHierarchy { onFocus?() + } else if isVisibleInUI && (!hasUsableFocusGeometry || hiddenInHierarchy) { +#if DEBUG + dlog( + "focus.firstResponder SUPPRESSED (hidden_or_tiny) surface=\(terminalSurface?.id.uuidString.prefix(5) ?? "nil") " + + "frame=\(String(format: "%.1fx%.1f", bounds.width, bounds.height)) hidden=\(hiddenInHierarchy ? 1 : 0)" + ) +#endif } } if result, let surface = ensureSurfaceReadyForInput() { @@ -2690,15 +2721,23 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { keyEvent.unshifted_codepoint = unshiftedCodepointFromEvent(event) let text = (event.charactersIgnoringModifiers ?? event.characters ?? "") + let handled: Bool if text.isEmpty { keyEvent.text = nil - _ = ghostty_surface_key(surface, keyEvent) + handled = ghostty_surface_key(surface, keyEvent) } else { - text.withCString { ptr in + handled = text.withCString { ptr in keyEvent.text = ptr - _ = ghostty_surface_key(surface, keyEvent) + return ghostty_surface_key(surface, keyEvent) } } +#if DEBUG + dlog( + "key.ctrl path=ghostty surface=\(terminalSurface?.id.uuidString.prefix(5) ?? "nil") " + + "handled=\(handled ? 1 : 0) keyCode=\(event.keyCode) chars=\(cmuxScalarHex(event.characters)) " + + "ign=\(cmuxScalarHex(event.charactersIgnoringModifiers)) mods=\(event.modifierFlags.rawValue)" + ) +#endif return } @@ -4143,6 +4182,12 @@ final class GhosttySurfaceScrollView: NSView { } } + let hasUsablePortalGeometry: Bool = { + let size = bounds.size + return size.width > 1 && size.height > 1 + }() + let isHiddenForFocus = isHiddenOrHasHiddenAncestor || surfaceView.isHiddenOrHasHiddenAncestor + guard isActive else { return } guard surfaceView.terminalSurface?.searchState == nil else { return } guard let window else { return } @@ -4150,6 +4195,17 @@ final class GhosttySurfaceScrollView: NSView { retry() return } + guard !isHiddenForFocus, hasUsablePortalGeometry else { +#if DEBUG + dlog( + "focus.ensure.defer surface=\(surfaceView.terminalSurface?.id.uuidString.prefix(5) ?? "nil") " + + "reason=hidden_or_tiny hidden=\(isHiddenForFocus ? 1 : 0) " + + "frame=\(String(format: "%.1fx%.1f", bounds.width, bounds.height)) attempts=\(attemptsRemaining)" + ) +#endif + retry() + return + } guard let delegate = AppDelegate.shared, let tabManager = delegate.tabManagerFor(tabId: tabId) ?? delegate.tabManager, @@ -4207,8 +4263,23 @@ final class GhosttySurfaceScrollView: NSView { } private func applyFirstResponderIfNeeded() { + let hasUsablePortalGeometry: Bool = { + let size = bounds.size + return size.width > 1 && size.height > 1 + }() + let isHiddenForFocus = isHiddenOrHasHiddenAncestor || surfaceView.isHiddenOrHasHiddenAncestor + guard isActive else { return } guard surfaceView.isVisibleInUI else { return } + guard !isHiddenForFocus, hasUsablePortalGeometry else { +#if DEBUG + dlog( + "focus.apply.skip surface=\(surfaceView.terminalSurface?.id.uuidString.prefix(5) ?? "nil") " + + "reason=hidden_or_tiny hidden=\(isHiddenForFocus ? 1 : 0) frame=\(String(format: "%.1fx%.1f", bounds.width, bounds.height))" + ) +#endif + return + } guard surfaceView.terminalSurface?.searchState == nil else { return } guard let window, window.isKeyWindow else { return } if let fr = window.firstResponder as? NSView, diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 212040a3..17f13cb3 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -1137,11 +1137,24 @@ class TabManager: ObservableObject { guard let tab = tabs.first(where: { $0.id == tabId }) else { return } guard tab.panels[surfaceId] != nil else { return } +#if DEBUG + dlog( + "surface.close.runtime tab=\(tabId.uuidString.prefix(5)) " + + "surface=\(surfaceId.uuidString.prefix(5)) panelsBefore=\(tab.panels.count)" + ) +#endif + // Keep AppKit first responder in sync with workspace focus before routing the close. // If split reparenting caused a temporary model/view mismatch, fallback close logic in // Workspace.closePanel uses focused selection to resolve the correct tab deterministically. reconcileFocusedPanelFromFirstResponderForKeyboard() - _ = tab.closePanel(surfaceId, force: true) + let closed = tab.closePanel(surfaceId, force: true) +#if DEBUG + dlog( + "surface.close.runtime.done tab=\(tabId.uuidString.prefix(5)) " + + "surface=\(surfaceId.uuidString.prefix(5)) closed=\(closed ? 1 : 0) panelsAfter=\(tab.panels.count)" + ) +#endif AppDelegate.shared?.notificationStore?.clearNotifications(forTabId: tab.id, surfaceId: surfaceId) } @@ -1153,6 +1166,13 @@ class TabManager: ObservableObject { guard let tab = tabs.first(where: { $0.id == tabId }) else { return } guard tab.panels[surfaceId] != nil else { return } +#if DEBUG + dlog( + "surface.close.childExited tab=\(tabId.uuidString.prefix(5)) " + + "surface=\(surfaceId.uuidString.prefix(5)) panels=\(tab.panels.count) workspaces=\(tabs.count)" + ) +#endif + // Child-exit on the last panel should collapse the workspace, matching explicit close // semantics (and close the window when it was the last workspace). if tab.panels.count <= 1 { diff --git a/cmuxUITests/CloseWorkspaceCmdDUITests.swift b/cmuxUITests/CloseWorkspaceCmdDUITests.swift index 6955591a..578b3005 100644 --- a/cmuxUITests/CloseWorkspaceCmdDUITests.swift +++ b/cmuxUITests/CloseWorkspaceCmdDUITests.swift @@ -582,12 +582,25 @@ final class CloseWorkspaceCmdDUITests: XCTestCase { let closedWorkspace = (done["closedWorkspace"] ?? "") == "1" let timedOut = (done["timedOut"] ?? "") == "1" let triggerMode = done["autoTriggerMode"] ?? "" + let exitPanelId = done["exitPanelId"] ?? "" + let workspaceId = done["workspaceId"] ?? "" + let probeSurfaceId = done["probeShowChildExitedSurfaceId"] ?? "" + let probeTabId = done["probeShowChildExitedTabId"] ?? "" XCTAssertFalse(timedOut, "Attempt \(attempt): early Ctrl+D timed out. data=\(done)") XCTAssertEqual(triggerMode, "strict_early_ctrl_d", "Attempt \(attempt): expected strict early Ctrl+D trigger mode. data=\(done)") XCTAssertFalse(closedWorkspace, "Attempt \(attempt): workspace/window should stay open after early Ctrl+D. data=\(done)") XCTAssertEqual(workspaceCountAfter, 1, "Attempt \(attempt): workspace should remain open after early Ctrl+D. data=\(done)") XCTAssertEqual(panelCountAfter, 1, "Attempt \(attempt): only focused pane should close after early Ctrl+D. data=\(done)") + if let showChildExitedCount = Int(done["probeShowChildExitedCount"] ?? "") { + XCTAssertEqual(showChildExitedCount, 1, "Attempt \(attempt): expected exactly one SHOW_CHILD_EXITED callback for one early Ctrl+D. data=\(done)") + } + if !exitPanelId.isEmpty, !probeSurfaceId.isEmpty { + XCTAssertEqual(probeSurfaceId, exitPanelId, "Attempt \(attempt): SHOW_CHILD_EXITED should target the split opened by Cmd+D. data=\(done)") + } + if !workspaceId.isEmpty, !probeTabId.isEmpty { + XCTAssertEqual(probeTabId, workspaceId, "Attempt \(attempt): SHOW_CHILD_EXITED should resolve to the active workspace. data=\(done)") + } XCTAssertTrue( waitForWindowCount(app: app, atLeast: 1, timeout: 2.0), "Attempt \(attempt): app window should remain open after early Ctrl+D. data=\(done)" From 2426590e9156ae813c5a1c06daeb2ca7e7e6cd18 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 05:50:10 -0800 Subject: [PATCH 117/214] Fix terminal focus when window loses key (#359) * Fix terminal blur when window loses key * Fix shortcut routing across multiple windows * Fix shortcut window detection when identifiers change --- Sources/AppDelegate.swift | 171 +++++++++++++++++- Sources/GhosttyTerminalView.swift | 9 +- Sources/cmuxApp.swift | 54 +++--- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 165 +++++++++++++++++ 4 files changed, 369 insertions(+), 30 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index f6811ae8..87a25c04 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -592,6 +592,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent sidebarSelectionState: SidebarSelectionState ) { let key = ObjectIdentifier(window) + #if DEBUG + let priorManagerToken = debugManagerToken(self.tabManager) + #endif if let existing = mainWindowContexts[key] { existing.window = window } else { @@ -615,6 +618,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent commandPaletteSelectionByWindowId[windowId] = 0 commandPaletteSnapshotByWindowId[windowId] = .empty +#if DEBUG + dlog( + "mainWindow.register windowId=\(String(windowId.uuidString.prefix(8))) window={\(debugWindowToken(window))} manager=\(debugManagerToken(tabManager)) priorActiveMgr=\(priorManagerToken) \(debugShortcutRouteSnapshot())" + ) +#endif if window.isKeyWindow { setActiveMainWindow(window) } @@ -844,6 +852,117 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return mainWindowContexts[ObjectIdentifier(window)] } +#if DEBUG + private func debugManagerToken(_ manager: TabManager?) -> String { + guard let manager else { return "nil" } + return String(describing: Unmanaged.passUnretained(manager).toOpaque()) + } + + private func debugWindowToken(_ window: NSWindow?) -> String { + guard let window else { return "nil" } + let id = mainWindowId(for: window).map { String($0.uuidString.prefix(8)) } ?? "none" + let ident = window.identifier?.rawValue ?? "nil" + let shortIdent: String + if ident.count > 120 { + shortIdent = String(ident.prefix(120)) + "..." + } else { + shortIdent = ident + } + return "num=\(window.windowNumber) id=\(id) ident=\(shortIdent) key=\(window.isKeyWindow ? 1 : 0) main=\(window.isMainWindow ? 1 : 0)" + } + + private func debugContextToken(_ context: MainWindowContext?) -> String { + guard let context else { return "nil" } + let selected = context.tabManager.selectedTabId.map { String($0.uuidString.prefix(5)) } ?? "nil" + let hasWindow = (context.window != nil || windowForMainWindowId(context.windowId) != nil) ? 1 : 0 + return "id=\(String(context.windowId.uuidString.prefix(8))) mgr=\(debugManagerToken(context.tabManager)) tabs=\(context.tabManager.tabs.count) selected=\(selected) hasWindow=\(hasWindow)" + } + + private func debugShortcutRouteSnapshot(event: NSEvent? = nil) -> String { + let activeManager = tabManager + let activeWindowId = activeManager.flatMap { windowId(for: $0) }.map { String($0.uuidString.prefix(8)) } ?? "nil" + let selectedWorkspace = activeManager?.selectedTabId.map { String($0.uuidString.prefix(5)) } ?? "nil" + + let contexts = mainWindowContexts.values + .map { context in + let marker = (activeManager != nil && context.tabManager === activeManager) ? "*" : "-" + let window = context.window ?? windowForMainWindowId(context.windowId) + let selected = context.tabManager.selectedTabId.map { String($0.uuidString.prefix(5)) } ?? "nil" + return "\(marker)\(String(context.windowId.uuidString.prefix(8))){mgr=\(debugManagerToken(context.tabManager)),win=\(window?.windowNumber ?? -1),key=\((window?.isKeyWindow ?? false) ? 1 : 0),main=\((window?.isMainWindow ?? false) ? 1 : 0),tabs=\(context.tabManager.tabs.count),selected=\(selected)}" + } + .sorted() + .joined(separator: ",") + + let eventWindowNumber = event.map { String($0.windowNumber) } ?? "nil" + let eventWindow = event?.window + return "eventWinNum=\(eventWindowNumber) eventWin={\(debugWindowToken(eventWindow))} keyWin={\(debugWindowToken(NSApp.keyWindow))} mainWin={\(debugWindowToken(NSApp.mainWindow))} activeMgr=\(debugManagerToken(activeManager)) activeWinId=\(activeWindowId) activeSelected=\(selectedWorkspace) contexts=[\(contexts)]" + } +#endif + + private func mainWindowForShortcutEvent(_ event: NSEvent) -> NSWindow? { + if let window = event.window, isMainTerminalWindow(window) { + return window + } + let eventWindowNumber = event.windowNumber + if eventWindowNumber > 0, + let numberedWindow = NSApp.window(withWindowNumber: eventWindowNumber), + isMainTerminalWindow(numberedWindow) { + return numberedWindow + } + if let keyWindow = NSApp.keyWindow, isMainTerminalWindow(keyWindow) { + return keyWindow + } + if let mainWindow = NSApp.mainWindow, isMainTerminalWindow(mainWindow) { + return mainWindow + } + return nil + } + + /// Re-sync app-level active window pointers from the currently focused main terminal window. + /// This keeps menu/shortcut actions window-scoped even if the cached `tabManager` drifts. + @discardableResult + func synchronizeActiveMainWindowContext(preferredWindow: NSWindow? = nil) -> TabManager? { + let (context, source): (MainWindowContext?, String) = { + if let preferredWindow, + let context = contextForMainWindow(preferredWindow) { + return (context, "preferredWindow") + } + if let context = contextForMainWindow(NSApp.keyWindow) { + return (context, "keyWindow") + } + if let context = contextForMainWindow(NSApp.mainWindow) { + return (context, "mainWindow") + } + if let activeManager = tabManager, + let activeContext = mainWindowContexts.values.first(where: { $0.tabManager === activeManager }) { + return (activeContext, "activeManager") + } + return (mainWindowContexts.values.first, "firstContextFallback") + }() + +#if DEBUG + let beforeManagerToken = debugManagerToken(tabManager) + dlog( + "shortcut.sync.pre source=\(source) preferred={\(debugWindowToken(preferredWindow))} chosen={\(debugContextToken(context))} \(debugShortcutRouteSnapshot())" + ) +#endif + guard let context else { return tabManager } + if let window = context.window ?? windowForMainWindowId(context.windowId) { + setActiveMainWindow(window) + } else { + tabManager = context.tabManager + sidebarState = context.sidebarState + sidebarSelectionState = context.sidebarSelectionState + TerminalController.shared.setActiveTabManager(context.tabManager) + } +#if DEBUG + dlog( + "shortcut.sync.post source=\(source) beforeMgr=\(beforeManagerToken) afterMgr=\(debugManagerToken(tabManager)) chosen={\(debugContextToken(context))} \(debugShortcutRouteSnapshot())" + ) +#endif + return context.tabManager + } + private func preferredMainWindowContextForShortcuts(event: NSEvent) -> MainWindowContext? { if let context = contextForMainWindow(event.window) { return context @@ -854,13 +973,26 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent if let context = contextForMainWindow(NSApp.mainWindow) { return context } + if let activeManager = tabManager, + let activeContext = mainWindowContexts.values.first(where: { $0.tabManager === activeManager }) { + return activeContext + } return mainWindowContexts.values.first } private func activateMainWindowContextForShortcutEvent(_ event: NSEvent) { - guard let context = preferredMainWindowContextForShortcuts(event: event), - let window = context.window ?? windowForMainWindowId(context.windowId) else { return } - setActiveMainWindow(window) + let preferredWindow = mainWindowForShortcutEvent(event) +#if DEBUG + dlog( + "shortcut.activate.pre event=\(NSWindow.keyDescription(event)) preferred={\(debugWindowToken(preferredWindow))} \(debugShortcutRouteSnapshot(event: event))" + ) +#endif + _ = synchronizeActiveMainWindowContext(preferredWindow: preferredWindow) +#if DEBUG + dlog( + "shortcut.activate.post event=\(NSWindow.keyDescription(event)) preferred={\(debugWindowToken(preferredWindow))} \(debugShortcutRouteSnapshot(event: event))" + ) +#endif } @discardableResult @@ -1838,7 +1970,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent dlog("key.latency path=appMonitor ms=\(delayText) keyCode=\(event.keyCode) mods=\(event.modifierFlags.rawValue) repeat=\(event.isARepeat ? 1 : 0)") } let frType = NSApp.keyWindow?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" - dlog("monitor.keyDown: \(NSWindow.keyDescription(event)) fr=\(frType) addrBarId=\(self.browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil")") + dlog( + "monitor.keyDown: \(NSWindow.keyDescription(event)) fr=\(frType) addrBarId=\(self.browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil") \(self.debugShortcutRouteSnapshot(event: event))" + ) if let probeKind = self.developerToolsShortcutProbeKind(event: event) { self.logDeveloperToolsShortcutSnapshot(phase: "monitor.pre.\(probeKind)", event: event) } @@ -2247,6 +2381,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } if matchShortcut(event: event, shortcut: KeyboardShortcutSettings.shortcut(for: .newTab)) { +#if DEBUG + dlog("shortcut.action name=newWorkspace \(debugShortcutRouteSnapshot(event: event))") +#endif // Cmd+N semantics: // - If there are no main windows, create a new window. // - Otherwise, create a new workspace in the active window. @@ -2357,6 +2494,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent let manager = tabManager, let num = Int(chars), let targetIndex = WorkspaceShortcutMapper.workspaceIndex(forCommandDigit: num, workspaceCount: manager.tabs.count) { +#if DEBUG + dlog( + "shortcut.action name=workspaceDigit digit=\(num) targetIndex=\(targetIndex) manager=\(debugManagerToken(manager)) \(debugShortcutRouteSnapshot(event: event))" + ) +#endif manager.selectTab(at: targetIndex) return true } @@ -2425,11 +2567,17 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent // Split actions: Cmd+D / Cmd+Shift+D if matchShortcut(event: event, shortcut: KeyboardShortcutSettings.shortcut(for: .splitRight)) { +#if DEBUG + dlog("shortcut.action name=splitRight \(debugShortcutRouteSnapshot(event: event))") +#endif _ = performSplitShortcut(direction: .right) return true } if matchShortcut(event: event, shortcut: KeyboardShortcutSettings.shortcut(for: .splitDown)) { +#if DEBUG + dlog("shortcut.action name=splitDown \(debugShortcutRouteSnapshot(event: event))") +#endif _ = performSplitShortcut(direction: .down) return true } @@ -2807,6 +2955,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent @discardableResult func performSplitShortcut(direction: SplitDirection) -> Bool { + _ = synchronizeActiveMainWindowContext(preferredWindow: NSApp.keyWindow ?? NSApp.mainWindow) + let directionLabel: String switch direction { case .left: directionLabel = "left" @@ -2872,6 +3022,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent @discardableResult func performBrowserSplitShortcut(direction: SplitDirection) -> Bool { + _ = synchronizeActiveMainWindowContext(preferredWindow: NSApp.keyWindow ?? NSApp.mainWindow) + guard let panelId = tabManager?.createBrowserSplit(direction: direction) else { return false } _ = focusBrowserAddressBar(panelId: panelId) return true @@ -3236,10 +3388,18 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent private func setActiveMainWindow(_ window: NSWindow) { guard isMainTerminalWindow(window) else { return } guard let context = mainWindowContexts[ObjectIdentifier(window)] else { return } +#if DEBUG + let beforeManagerToken = debugManagerToken(tabManager) +#endif tabManager = context.tabManager sidebarState = context.sidebarState sidebarSelectionState = context.sidebarSelectionState TerminalController.shared.setActiveTabManager(context.tabManager) +#if DEBUG + dlog( + "mainWindow.active window={\(debugWindowToken(window))} context={\(debugContextToken(context))} beforeMgr=\(beforeManagerToken) afterMgr=\(debugManagerToken(tabManager)) \(debugShortcutRouteSnapshot())" + ) +#endif } private func unregisterMainWindow(_ window: NSWindow) { @@ -3282,6 +3442,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } private func isMainTerminalWindow(_ window: NSWindow) -> Bool { + if mainWindowContexts[ObjectIdentifier(window)] != nil { + return true + } guard let raw = window.identifier?.rawValue else { return false } return raw == "cmux.main" || raw.hasPrefix("cmux.main.") } diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 38998db0..1acbb97e 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -3713,8 +3713,13 @@ final class GhosttySurfaceScrollView: NSView { object: window, queue: .main ) { [weak self] _ in - // No-op: focus is driven by first-responder changes. - _ = self + guard let self, let window = self.window else { return } + // Losing key window does not always trigger first-responder resignation, so force + // the focused terminal view to yield responder to keep Ghostty cursor/focus state in sync. + if let fr = window.firstResponder as? NSView, + fr === self.surfaceView || fr.isDescendant(of: self.surfaceView) { + window.makeFirstResponder(nil) + } }) if window.isKeyWindow { applyFirstResponderIfNeeded() } } diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index a5950c24..23b683de 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -357,7 +357,7 @@ struct cmuxApp: App { } splitCommandButton(title: "New Workspace", shortcut: newWorkspaceMenuShortcut) { - (AppDelegate.shared?.tabManager ?? tabManager).addTab() + activeTabManager.addTab() } } @@ -392,7 +392,7 @@ struct cmuxApp: App { } Button("Reopen Closed Browser Panel") { - _ = (AppDelegate.shared?.tabManager ?? tabManager).reopenMostRecentlyClosedBrowserPanel() + _ = activeTabManager.reopenMostRecentlyClosedBrowserPanel() } .keyboardShortcut("t", modifiers: [.command, .shift]) } @@ -401,35 +401,35 @@ struct cmuxApp: App { CommandGroup(after: .textEditing) { Menu("Find") { Button("Find…") { - (AppDelegate.shared?.tabManager ?? tabManager).startSearch() + activeTabManager.startSearch() } .keyboardShortcut("f", modifiers: .command) Button("Find Next") { - (AppDelegate.shared?.tabManager ?? tabManager).findNext() + activeTabManager.findNext() } .keyboardShortcut("g", modifiers: .command) Button("Find Previous") { - (AppDelegate.shared?.tabManager ?? tabManager).findPrevious() + activeTabManager.findPrevious() } .keyboardShortcut("g", modifiers: [.command, .shift]) Divider() Button("Hide Find Bar") { - (AppDelegate.shared?.tabManager ?? tabManager).hideFind() + activeTabManager.hideFind() } .keyboardShortcut("f", modifiers: [.command, .shift]) - .disabled(!((AppDelegate.shared?.tabManager ?? tabManager).isFindVisible)) + .disabled(!(activeTabManager.isFindVisible)) Divider() Button("Use Selection for Find") { - (AppDelegate.shared?.tabManager ?? tabManager).searchSelection() + activeTabManager.searchSelection() } .keyboardShortcut("e", modifiers: .command) - .disabled(!((AppDelegate.shared?.tabManager ?? tabManager).canUseSelectionForFind)) + .disabled(!(activeTabManager.canUseSelectionForFind)) } } @@ -444,54 +444,54 @@ struct cmuxApp: App { Divider() splitCommandButton(title: "Next Surface", shortcut: nextSurfaceMenuShortcut) { - (AppDelegate.shared?.tabManager ?? tabManager).selectNextSurface() + activeTabManager.selectNextSurface() } splitCommandButton(title: "Previous Surface", shortcut: prevSurfaceMenuShortcut) { - (AppDelegate.shared?.tabManager ?? tabManager).selectPreviousSurface() + activeTabManager.selectPreviousSurface() } Button("Back") { - (AppDelegate.shared?.tabManager ?? tabManager).focusedBrowserPanel?.goBack() + activeTabManager.focusedBrowserPanel?.goBack() } .keyboardShortcut("[", modifiers: .command) Button("Forward") { - (AppDelegate.shared?.tabManager ?? tabManager).focusedBrowserPanel?.goForward() + activeTabManager.focusedBrowserPanel?.goForward() } .keyboardShortcut("]", modifiers: .command) Button("Reload Page") { - (AppDelegate.shared?.tabManager ?? tabManager).focusedBrowserPanel?.reload() + activeTabManager.focusedBrowserPanel?.reload() } .keyboardShortcut("r", modifiers: .command) splitCommandButton(title: "Toggle Developer Tools", shortcut: toggleBrowserDeveloperToolsMenuShortcut) { - let manager = (AppDelegate.shared?.tabManager ?? tabManager) + let manager = activeTabManager if !manager.toggleDeveloperToolsFocusedBrowser() { NSSound.beep() } } splitCommandButton(title: "Show JavaScript Console", shortcut: showBrowserJavaScriptConsoleMenuShortcut) { - let manager = (AppDelegate.shared?.tabManager ?? tabManager) + let manager = activeTabManager if !manager.showJavaScriptConsoleFocusedBrowser() { NSSound.beep() } } Button("Zoom In") { - _ = (AppDelegate.shared?.tabManager ?? tabManager).zoomInFocusedBrowser() + _ = activeTabManager.zoomInFocusedBrowser() } .keyboardShortcut("=", modifiers: .command) Button("Zoom Out") { - _ = (AppDelegate.shared?.tabManager ?? tabManager).zoomOutFocusedBrowser() + _ = activeTabManager.zoomOutFocusedBrowser() } .keyboardShortcut("-", modifiers: .command) Button("Actual Size") { - _ = (AppDelegate.shared?.tabManager ?? tabManager).resetZoomFocusedBrowser() + _ = activeTabManager.resetZoomFocusedBrowser() } .keyboardShortcut("0", modifiers: .command) @@ -500,11 +500,11 @@ struct cmuxApp: App { } splitCommandButton(title: "Next Workspace", shortcut: nextWorkspaceMenuShortcut) { - (AppDelegate.shared?.tabManager ?? tabManager).selectNextTab() + activeTabManager.selectNextTab() } splitCommandButton(title: "Previous Workspace", shortcut: prevWorkspaceMenuShortcut) { - (AppDelegate.shared?.tabManager ?? tabManager).selectPreviousTab() + activeTabManager.selectPreviousTab() } splitCommandButton(title: "Rename Workspace…", shortcut: renameWorkspaceMenuShortcut) { @@ -534,7 +534,7 @@ struct cmuxApp: App { // Cmd+1 through Cmd+9 for workspace selection (9 = last workspace) ForEach(1...9, id: \.self) { number in Button("Workspace \(number)") { - let manager = (AppDelegate.shared?.tabManager ?? tabManager) + let manager = activeTabManager if let targetIndex = WorkspaceShortcutMapper.workspaceIndex(forCommandDigit: number, workspaceCount: manager.tabs.count) { manager.selectTab(at: targetIndex) } @@ -705,6 +705,12 @@ struct cmuxApp: App { NotificationMenuSnapshotBuilder.make(notifications: notificationStore.notifications) } + private var activeTabManager: TabManager { + AppDelegate.shared?.synchronizeActiveMainWindowContext( + preferredWindow: NSApp.keyWindow ?? NSApp.mainWindow + ) ?? tabManager + } + private func decodeShortcut(from data: Data, fallback: StoredShortcut) -> StoredShortcut { guard !data.isEmpty, let shortcut = try? JSONDecoder().decode(StoredShortcut.self, from: data) else { @@ -756,11 +762,11 @@ struct cmuxApp: App { window.performClose(nil) return } - (AppDelegate.shared?.tabManager ?? tabManager).closeCurrentPanelWithConfirmation() + activeTabManager.closeCurrentPanelWithConfirmation() } private func closeTabOrWindow() { - (AppDelegate.shared?.tabManager ?? tabManager).closeCurrentTabWithConfirmation() + activeTabManager.closeCurrentTabWithConfirmation() } private func showNotificationsPopover() { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 8341c5f1..06f7d6a3 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -330,6 +330,127 @@ final class CmuxWebViewKeyEquivalentTests: XCTestCase { } } +@MainActor +final class AppDelegateWindowContextRoutingTests: XCTestCase { + private func makeMainWindow(id: UUID) -> NSWindow { + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 500, height: 320), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + window.identifier = NSUserInterfaceItemIdentifier("cmux.main.\(id.uuidString)") + return window + } + + func testSynchronizeActiveMainWindowContextPrefersProvidedWindowOverStaleActiveManager() { + _ = NSApplication.shared + let app = AppDelegate() + + let windowAId = UUID() + let windowBId = UUID() + let windowA = makeMainWindow(id: windowAId) + let windowB = makeMainWindow(id: windowBId) + defer { + windowA.orderOut(nil) + windowB.orderOut(nil) + } + + let managerA = TabManager() + let managerB = TabManager() + app.registerMainWindow( + windowA, + windowId: windowAId, + tabManager: managerA, + sidebarState: SidebarState(), + sidebarSelectionState: SidebarSelectionState() + ) + app.registerMainWindow( + windowB, + windowId: windowBId, + tabManager: managerB, + sidebarState: SidebarState(), + sidebarSelectionState: SidebarSelectionState() + ) + + windowB.makeKeyAndOrderFront(nil) + _ = app.synchronizeActiveMainWindowContext(preferredWindow: windowB) + XCTAssertTrue(app.tabManager === managerB) + + windowA.makeKeyAndOrderFront(nil) + let resolved = app.synchronizeActiveMainWindowContext(preferredWindow: windowA) + XCTAssertTrue(resolved === managerA, "Expected provided active window to win over stale active manager") + XCTAssertTrue(app.tabManager === managerA) + } + + func testSynchronizeActiveMainWindowContextFallsBackToActiveManagerWithoutFocusedWindow() { + _ = NSApplication.shared + let app = AppDelegate() + + let windowAId = UUID() + let windowBId = UUID() + let windowA = makeMainWindow(id: windowAId) + let windowB = makeMainWindow(id: windowBId) + defer { + windowA.orderOut(nil) + windowB.orderOut(nil) + } + + let managerA = TabManager() + let managerB = TabManager() + app.registerMainWindow( + windowA, + windowId: windowAId, + tabManager: managerA, + sidebarState: SidebarState(), + sidebarSelectionState: SidebarSelectionState() + ) + app.registerMainWindow( + windowB, + windowId: windowBId, + tabManager: managerB, + sidebarState: SidebarState(), + sidebarSelectionState: SidebarSelectionState() + ) + + // Seed active manager and clear focus windows to force fallback routing. + windowA.makeKeyAndOrderFront(nil) + _ = app.synchronizeActiveMainWindowContext(preferredWindow: windowA) + XCTAssertTrue(app.tabManager === managerA) + windowA.orderOut(nil) + windowB.orderOut(nil) + + let resolved = app.synchronizeActiveMainWindowContext(preferredWindow: nil) + XCTAssertTrue(resolved === managerA, "Expected fallback to preserve current active manager instead of arbitrary window") + XCTAssertTrue(app.tabManager === managerA) + } + + func testSynchronizeActiveMainWindowContextUsesRegisteredWindowEvenIfIdentifierMutates() { + _ = NSApplication.shared + let app = AppDelegate() + + let windowId = UUID() + let window = makeMainWindow(id: windowId) + defer { window.orderOut(nil) } + + let manager = TabManager() + app.registerMainWindow( + window, + windowId: windowId, + tabManager: manager, + sidebarState: SidebarState(), + sidebarSelectionState: SidebarSelectionState() + ) + + // SwiftUI can replace the NSWindow identifier string at runtime. + window.identifier = NSUserInterfaceItemIdentifier("SwiftUI.AppWindow.IdentifierChanged") + + let resolved = app.synchronizeActiveMainWindowContext(preferredWindow: window) + XCTAssertTrue(resolved === manager, "Expected registered window object identity to win even if identifier string changed") + XCTAssertTrue(app.tabManager === manager) + } +} + final class FocusFlashPatternTests: XCTestCase { func testFocusFlashPatternMatchesTerminalDoublePulseShape() { XCTAssertEqual(FocusFlashPattern.values, [0, 1, 0, 1, 0]) @@ -4241,6 +4362,50 @@ final class GhosttySurfaceOverlayTests: XCTestCase { XCTAssertTrue(state.isHidden) } + func testWindowResignKeyClearsFocusedTerminalFirstResponder() { + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 360, height: 240), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + defer { window.orderOut(nil) } + + guard let contentView = window.contentView else { + XCTFail("Expected content view") + return + } + + let hostedView = GhosttySurfaceScrollView( + surfaceView: GhosttyNSView(frame: NSRect(x: 0, y: 0, width: 160, height: 120)) + ) + hostedView.frame = contentView.bounds + hostedView.autoresizingMask = [.width, .height] + contentView.addSubview(hostedView) + + window.makeKeyAndOrderFront(nil) + window.displayIfNeeded() + contentView.layoutSubtreeIfNeeded() + RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + + hostedView.setVisibleInUI(true) + hostedView.setActive(true) + hostedView.moveFocus() + RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + XCTAssertTrue( + hostedView.isSurfaceViewFirstResponder(), + "Expected terminal surface to be first responder before window blur" + ) + + NotificationCenter.default.post(name: NSWindow.didResignKeyNotification, object: window) + RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + + XCTAssertFalse( + hostedView.isSurfaceViewFirstResponder(), + "Window blur should force terminal surface to resign first responder" + ) + } + func testSearchOverlayMountsAndUnmountsWithSearchState() { let surface = TerminalSurface( tabId: UUID(), From df779d32eaf3d5d3ac3bcd0b9edb0c88cafcea36 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 05:54:02 -0800 Subject: [PATCH 118/214] Portal: hide terminal view before hidden-frame updates --- Sources/TerminalWindowPortal.swift | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index 07831c71..0fbde41d 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -870,6 +870,22 @@ final class WindowTerminalPortal: NSObject { ) } #endif + + // Hide before updating the frame when this entry should not be visible. + // This avoids a one-frame flash of unrendered terminal background when a portal + // briefly transitions through offscreen/tiny geometry during rapid split churn. + if shouldHide, !hostedView.isHidden { +#if DEBUG + dlog( + "portal.hidden hosted=\(portalDebugToken(hostedView)) value=1 " + + "visibleInUI=\(entry.visibleInUI ? 1 : 0) anchorHidden=\(anchorHidden ? 1 : 0) " + + "tiny=\(tinyFrame ? 1 : 0) finite=\(hasFiniteFrame ? 1 : 0) " + + "outside=\(outsideHostBounds ? 1 : 0) frame=\(portalDebugFrame(frameInHost))" + ) +#endif + hostedView.isHidden = true + } + if !Self.rectApproximatelyEqual(oldFrame, frameInHost) { CATransaction.begin() CATransaction.setDisableActions(true) @@ -877,21 +893,22 @@ final class WindowTerminalPortal: NSObject { CATransaction.commit() if abs(oldFrame.size.width - frameInHost.size.width) > 0.5 || - abs(oldFrame.size.height - frameInHost.size.height) > 0.5 { + abs(oldFrame.size.height - frameInHost.size.height) > 0.5, + !shouldHide { hostedView.reconcileGeometryNow() } } - if hostedView.isHidden != shouldHide { + if !shouldHide, hostedView.isHidden { #if DEBUG dlog( - "portal.hidden hosted=\(portalDebugToken(hostedView)) value=\(shouldHide ? 1 : 0) " + + "portal.hidden hosted=\(portalDebugToken(hostedView)) value=0 " + "visibleInUI=\(entry.visibleInUI ? 1 : 0) anchorHidden=\(anchorHidden ? 1 : 0) " + "tiny=\(tinyFrame ? 1 : 0) finite=\(hasFiniteFrame ? 1 : 0) " + "outside=\(outsideHostBounds ? 1 : 0) frame=\(portalDebugFrame(frameInHost))" ) #endif - hostedView.isHidden = shouldHide + hostedView.isHidden = false } ensureDividerOverlayOnTop() From b34b3a530ae93eb839eabcab9e0b956f9999f168 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 05:57:23 -0800 Subject: [PATCH 119/214] Portal: log Bonsplit container frame changes --- Sources/TerminalWindowPortal.swift | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index 0fbde41d..a2f0c8c8 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -17,6 +17,12 @@ private func portalDebugToken(_ view: NSView?) -> String { private func portalDebugFrame(_ rect: NSRect) -> String { String(format: "%.1f,%.1f %.1fx%.1f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height) } + +private func portalDebugFrameInWindow(_ view: NSView?) -> String { + guard let view else { return "nil" } + guard view.window != nil else { return "no-window" } + return portalDebugFrame(view.convert(view.bounds, to: nil)) +} #endif final class WindowTerminalHostView: NSView { @@ -536,6 +542,9 @@ final class WindowTerminalPortal: NSObject { private weak var installedReferenceView: NSView? private var installConstraints: [NSLayoutConstraint] = [] private var hasDeferredFullSyncScheduled = false +#if DEBUG + private var lastLoggedBonsplitContainerSignature: String? +#endif private struct Entry { weak var hostedView: GhosttySurfaceScrollView? @@ -649,6 +658,35 @@ final class WindowTerminalPortal: NSObject { return viewIndex > referenceIndex } +#if DEBUG + private func nearestBonsplitContainer(from anchorView: NSView) -> NSView? { + var current: NSView? = anchorView + while let view = current { + let className = NSStringFromClass(type(of: view)) + if className.contains("PaneDragContainerView") || className.contains("Bonsplit") { + return view + } + current = view.superview + } + return installedReferenceView + } + + private func logBonsplitContainerFrameIfNeeded(anchorView: NSView, hostedView: GhosttySurfaceScrollView) { + guard let container = nearestBonsplitContainer(from: anchorView) else { return } + let containerFrame = container.convert(container.bounds, to: nil) + let signature = "\(ObjectIdentifier(container)):\(portalDebugFrame(containerFrame))" + guard signature != lastLoggedBonsplitContainerSignature else { return } + lastLoggedBonsplitContainerSignature = signature + + let containerClass = NSStringFromClass(type(of: container)) + dlog( + "portal.bonsplit.container hosted=\(portalDebugToken(hostedView)) " + + "class=\(containerClass) frame=\(portalDebugFrame(containerFrame)) " + + "host=\(portalDebugFrameInWindow(hostView)) anchor=\(portalDebugFrameInWindow(anchorView))" + ) + } +#endif + func detachHostedView(withId hostedId: ObjectIdentifier) { guard let entry = entriesByHostedId.removeValue(forKey: hostedId) else { return } if let anchor = entry.anchorView { @@ -839,6 +877,9 @@ final class WindowTerminalPortal: NSObject { let frameInWindow = anchorView.convert(anchorView.bounds, to: nil) let frameInHost = hostView.convert(frameInWindow, from: nil) +#if DEBUG + logBonsplitContainerFrameIfNeeded(anchorView: anchorView, hostedView: hostedView) +#endif let hasFiniteFrame = frameInHost.origin.x.isFinite && frameInHost.origin.y.isFinite && From 3c1f1792c030861b04668b5b79ef402c8978b464 Mon Sep 17 00:00:00 2001 From: Austin Wang <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 10:27:04 -0800 Subject: [PATCH 120/214] Fix browser workspace focus handoff lag (#381) --- Sources/ContentView.swift | 25 ++++++++++++++++++++++++- Sources/Panels/BrowserPanelView.swift | 5 +++-- Sources/Panels/CmuxWebView.swift | 3 +++ Sources/TabManager.swift | 1 + 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 21b5f01b..7fc7b561 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -1610,7 +1610,11 @@ struct ContentView: View { ForEach(mountedWorkspaces) { tab in let isSelectedWorkspace = selectedWorkspaceId == tab.id let isRetiringWorkspace = retiringWorkspaceId == tab.id - let isInputActive = isSelectedWorkspace || isRetiringWorkspace + // Keep the retiring workspace visible during handoff, but never input-active. + // Allowing both selected+retiring workspaces to be input-active lets the + // old workspace steal first responder (notably with WKWebView), which can + // delay handoff completion and make browser returns feel laggy. + let isInputActive = isSelectedWorkspace let isVisible = isSelectedWorkspace || isRetiringWorkspace let portalPriority = isSelectedWorkspace ? 2 : (isRetiringWorkspace ? 1 : 0) WorkspaceContentView( @@ -1952,6 +1956,25 @@ struct ContentView: View { completeWorkspaceHandoffIfNeeded(focusedTabId: tabId, reason: "first_responder") }) + view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: .browserDidBecomeFirstResponderWebView)) { notification in + guard let webView = notification.object as? WKWebView, + let selectedTabId = tabManager.selectedTabId, + let selectedWorkspace = tabManager.selectedWorkspace, + let focusedPanelId = selectedWorkspace.focusedPanelId, + let focusedBrowser = selectedWorkspace.browserPanel(for: focusedPanelId), + focusedBrowser.webView === webView else { return } + completeWorkspaceHandoffIfNeeded(focusedTabId: selectedTabId, reason: "browser_first_responder") + }) + + view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: .browserDidFocusAddressBar)) { notification in + guard let panelId = notification.object as? UUID, + let selectedTabId = tabManager.selectedTabId, + let selectedWorkspace = tabManager.selectedWorkspace, + selectedWorkspace.focusedPanelId == panelId, + selectedWorkspace.browserPanel(for: panelId) != nil else { return } + completeWorkspaceHandoffIfNeeded(focusedTabId: selectedTabId, reason: "browser_address_bar") + }) + view = AnyView(view.onReceive(tabManager.$tabs) { tabs in let existingIds = Set(tabs.map { $0.id }) if let retiringWorkspaceId, !existingIds.contains(retiringWorkspaceId) { diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 0294766f..ac19b086 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -3070,6 +3070,7 @@ struct WebViewRepresentable: NSViewRepresentable { coordinator: Coordinator, generation: Int ) { + let retryInterval: TimeInterval = 1.0 / 60.0 // Don't schedule multiple overlapping retries. guard coordinator.attachRetryWorkItem == nil else { return } @@ -3102,7 +3103,7 @@ struct WebViewRepresentable: NSViewRepresentable { // Be generous here: bonsplit structural updates can keep a representable // container off-window longer than a few seconds under load. if coordinator.attachRetryCount < 400 { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + DispatchQueue.main.asyncAfter(deadline: .now() + retryInterval) { scheduleAttachRetry( webView, panel: panel, @@ -3139,7 +3140,7 @@ struct WebViewRepresentable: NSViewRepresentable { } coordinator.attachRetryWorkItem = work - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05, execute: work) + DispatchQueue.main.asyncAfter(deadline: .now() + retryInterval, execute: work) } func updateNSView(_ nsView: NSView, context: Context) { diff --git a/Sources/Panels/CmuxWebView.swift b/Sources/Panels/CmuxWebView.swift index 83941484..8f2a3a28 100644 --- a/Sources/Panels/CmuxWebView.swift +++ b/Sources/Panels/CmuxWebView.swift @@ -45,6 +45,9 @@ final class CmuxWebView: WKWebView { return false } let result = super.becomeFirstResponder() + if result { + NotificationCenter.default.post(name: .browserDidBecomeFirstResponderWebView, object: self) + } #if DEBUG let eventType = NSApp.currentEvent.map { String(describing: $0.type) } ?? "nil" dlog( diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 17f13cb3..f9c6b17d 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -3113,6 +3113,7 @@ extension Notification.Name { static let ghosttyDidFocusTab = Notification.Name("ghosttyDidFocusTab") static let ghosttyDidFocusSurface = Notification.Name("ghosttyDidFocusSurface") static let ghosttyDidBecomeFirstResponderSurface = Notification.Name("ghosttyDidBecomeFirstResponderSurface") + static let browserDidBecomeFirstResponderWebView = Notification.Name("browserDidBecomeFirstResponderWebView") static let browserFocusAddressBar = Notification.Name("browserFocusAddressBar") static let browserMoveOmnibarSelection = Notification.Name("browserMoveOmnibarSelection") static let browserDidExitAddressBar = Notification.Name("browserDidExitAddressBar") From 65b3b570c9de069d25011d0539bdc1b2e7dd387d Mon Sep 17 00:00:00 2001 From: Austin Wang <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 10:27:13 -0800 Subject: [PATCH 121/214] Fix Caps Lock handling in browser omnibar keyboard paths (#382) --- Sources/AppDelegate.swift | 28 +++++------ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 46 +++++++++++++++++++ 2 files changed, 60 insertions(+), 14 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 87a25c04..0d671e90 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -70,10 +70,9 @@ func browserOmnibarSelectionDeltaForCommandNavigation( chars: String ) -> Int? { guard hasFocusedAddressBar else { return nil } - let normalizedFlags = flags - .intersection(.deviceIndependentFlagsMask) - .subtracting([.numericPad, .function]) - guard normalizedFlags == [.control] else { return nil } + let normalizedFlags = browserOmnibarNormalizedModifierFlags(flags) + let isCommandOrControlOnly = normalizedFlags == [.command] || normalizedFlags == [.control] + guard isCommandOrControlOnly else { return nil } if chars == "n" { return 1 } if chars == "p" { return -1 } return nil @@ -85,9 +84,7 @@ func browserOmnibarSelectionDeltaForArrowNavigation( keyCode: UInt16 ) -> Int? { guard hasFocusedAddressBar else { return nil } - let normalizedFlags = flags - .intersection(.deviceIndependentFlagsMask) - .subtracting([.numericPad, .function]) + let normalizedFlags = browserOmnibarNormalizedModifierFlags(flags) guard normalizedFlags == [] else { return nil } switch keyCode { case 125: return 1 @@ -96,10 +93,14 @@ func browserOmnibarSelectionDeltaForArrowNavigation( } } -func browserOmnibarShouldSubmitOnReturn(flags: NSEvent.ModifierFlags) -> Bool { - let normalizedFlags = flags +func browserOmnibarNormalizedModifierFlags(_ flags: NSEvent.ModifierFlags) -> NSEvent.ModifierFlags { + flags .intersection(.deviceIndependentFlagsMask) - .subtracting([.numericPad, .function]) + .subtracting([.numericPad, .function, .capsLock]) +} + +func browserOmnibarShouldSubmitOnReturn(flags: NSEvent.ModifierFlags) -> Bool { + let normalizedFlags = browserOmnibarNormalizedModifierFlags(flags) return normalizedFlags == [] || normalizedFlags == [.shift] } @@ -2766,10 +2767,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent chars: String ) -> Bool { guard browserAddressBarFocusedPanelId != nil else { return false } - let normalizedFlags = flags - .intersection(.deviceIndependentFlagsMask) - .subtracting([.numericPad, .function]) - guard normalizedFlags == [.control] else { return false } + let normalizedFlags = browserOmnibarNormalizedModifierFlags(flags) + let isCommandOrControlOnly = normalizedFlags == [.command] || normalizedFlags == [.control] + guard isCommandOrControlOnly else { return false } return chars == "n" || chars == "p" } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 06f7d6a3..fc1c546f 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1123,6 +1123,25 @@ final class BrowserOmnibarCommandNavigationTests: XCTestCase { ) } + func testArrowNavigationDeltaIgnoresCapsLockModifier() { + XCTAssertEqual( + browserOmnibarSelectionDeltaForArrowNavigation( + hasFocusedAddressBar: true, + flags: [.capsLock], + keyCode: 126 + ), + -1 + ) + XCTAssertEqual( + browserOmnibarSelectionDeltaForArrowNavigation( + hasFocusedAddressBar: true, + flags: [.capsLock], + keyCode: 125 + ), + 1 + ) + } + func testCommandNavigationDeltaRequiresFocusedAddressBarAndCommandOrControlOnly() { XCTAssertNil( browserOmnibarSelectionDeltaForCommandNavigation( @@ -1176,6 +1195,33 @@ final class BrowserOmnibarCommandNavigationTests: XCTestCase { 1 ) } + + func testCommandNavigationDeltaIgnoresCapsLockModifier() { + XCTAssertEqual( + browserOmnibarSelectionDeltaForCommandNavigation( + hasFocusedAddressBar: true, + flags: [.control, .capsLock], + chars: "n" + ), + 1 + ) + XCTAssertEqual( + browserOmnibarSelectionDeltaForCommandNavigation( + hasFocusedAddressBar: true, + flags: [.command, .capsLock], + chars: "p" + ), + -1 + ) + } + + func testSubmitOnReturnIgnoresCapsLockModifier() { + XCTAssertTrue(browserOmnibarShouldSubmitOnReturn(flags: [])) + XCTAssertTrue(browserOmnibarShouldSubmitOnReturn(flags: [.shift])) + XCTAssertTrue(browserOmnibarShouldSubmitOnReturn(flags: [.capsLock])) + XCTAssertTrue(browserOmnibarShouldSubmitOnReturn(flags: [.shift, .capsLock])) + XCTAssertFalse(browserOmnibarShouldSubmitOnReturn(flags: [.command, .capsLock])) + } } final class BrowserZoomShortcutActionTests: XCTestCase { From d42126a08220c44c024fd7ce2716ff2fe6383729 Mon Sep 17 00:00:00 2001 From: Austin Wang <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 10:51:28 -0800 Subject: [PATCH 122/214] Handle deeplink URL schemes in embedded browser (#392) --- Sources/Panels/BrowserPanel.swift | 41 +++++++++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 32 +++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 6255672e..420ba6d1 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -380,6 +380,21 @@ func browserPreparedNavigationRequest(_ request: URLRequest) -> URLRequest { return preparedRequest } +private let browserEmbeddedNavigationSchemes: Set<String> = [ + "about", + "applewebdata", + "blob", + "data", + "http", + "https", + "javascript", +] + +func browserShouldOpenURLExternally(_ url: URL) -> Bool { + guard let scheme = url.scheme?.lowercased(), !scheme.isEmpty else { return false } + return !browserEmbeddedNavigationSchemes.contains(scheme) +} + enum BrowserUserAgentSettings { // Force a Safari UA. Some WebKit builds return a minimal UA without Version/Safari tokens, // and some installs may have legacy Chrome UA overrides. Both can cause Google to serve @@ -2638,6 +2653,22 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { return } + // WebKit cannot open app-specific deeplinks (discord://, slack://, zoommtg://, etc.). + // Hand these off to macOS so the owning app can handle them. + if let url = navigationAction.request.url, + navigationAction.targetFrame?.isMainFrame != false, + browserShouldOpenURLExternally(url) { + let opened = NSWorkspace.shared.open(url) + if !opened { + NSLog("BrowserPanel external navigation failed to open URL: %@", url.absoluteString) + } + #if DEBUG + dlog("browser.navigation.external source=navDelegate opened=\(opened ? 1 : 0) url=\(url.absoluteString)") + #endif + decisionHandler(.cancel) + return + } + // target=_blank or window.open() — navigate in the current webview if navigationAction.targetFrame == nil, navigationAction.request.url != nil { @@ -2761,6 +2792,16 @@ private class BrowserUIDelegate: NSObject, WKUIDelegate { windowFeatures: WKWindowFeatures ) -> WKWebView? { if let url = navigationAction.request.url { + if browserShouldOpenURLExternally(url) { + let opened = NSWorkspace.shared.open(url) + if !opened { + NSLog("BrowserPanel external navigation failed to open URL: %@", url.absoluteString) + } + #if DEBUG + dlog("browser.navigation.external source=uiDelegate opened=\(opened ? 1 : 0) url=\(url.absoluteString)") + #endif + return nil + } if let requestNavigation { let intent: BrowserInsecureHTTPNavigationIntent = navigationAction.modifierFlags.contains(.command) ? .newTab : .currentTab diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index fc1c546f..59208945 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -5111,6 +5111,38 @@ final class TerminalOpenURLTargetResolutionTests: XCTestCase { } } +final class BrowserExternalNavigationSchemeTests: XCTestCase { + func testCustomAppSchemesOpenExternally() throws { + let discord = try XCTUnwrap(URL(string: "discord://login/one-time?token=abc")) + let slack = try XCTUnwrap(URL(string: "slack://open")) + let zoom = try XCTUnwrap(URL(string: "zoommtg://zoom.us/join")) + let mailto = try XCTUnwrap(URL(string: "mailto:test@example.com")) + + XCTAssertTrue(browserShouldOpenURLExternally(discord)) + XCTAssertTrue(browserShouldOpenURLExternally(slack)) + XCTAssertTrue(browserShouldOpenURLExternally(zoom)) + XCTAssertTrue(browserShouldOpenURLExternally(mailto)) + } + + func testEmbeddedBrowserSchemesStayInWebView() throws { + let https = try XCTUnwrap(URL(string: "https://example.com")) + let http = try XCTUnwrap(URL(string: "http://example.com")) + let about = try XCTUnwrap(URL(string: "about:blank")) + let data = try XCTUnwrap(URL(string: "data:text/plain,hello")) + let blob = try XCTUnwrap(URL(string: "blob:https://example.com/550e8400-e29b-41d4-a716-446655440000")) + let javascript = try XCTUnwrap(URL(string: "javascript:void(0)")) + let webkitInternal = try XCTUnwrap(URL(string: "applewebdata://local/page")) + + XCTAssertFalse(browserShouldOpenURLExternally(https)) + XCTAssertFalse(browserShouldOpenURLExternally(http)) + XCTAssertFalse(browserShouldOpenURLExternally(about)) + XCTAssertFalse(browserShouldOpenURLExternally(data)) + XCTAssertFalse(browserShouldOpenURLExternally(blob)) + XCTAssertFalse(browserShouldOpenURLExternally(javascript)) + XCTAssertFalse(browserShouldOpenURLExternally(webkitInternal)) + } +} + final class BrowserHostWhitelistTests: XCTestCase { private var suiteName: String! private var defaults: UserDefaults! From c1822fdaaca52a1d5937ec100bb1821287b5b8f7 Mon Sep 17 00:00:00 2001 From: Austin Wang <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 11:14:34 -0800 Subject: [PATCH 123/214] Fix sidebar resize regression with 1/3 width cap (#393) --- Sources/ContentView.swift | 50 ++++++++++++++++++++++++-- cmuxUITests/SidebarResizeUITests.swift | 27 ++++++++++++++ 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 7fc7b561..2325908c 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -1343,6 +1343,8 @@ struct ContentView: View { ) private static let commandPaletteUsageDefaultsKey = "commandPalette.commandUsage.v1" private static let commandPaletteCommandsPrefix = ">" + private static let minimumSidebarWidth: CGFloat = 186 + private static let maximumSidebarWidthRatio: CGFloat = 1.0 / 3.0 private enum SidebarResizerHandle: Hashable { case divider @@ -1352,8 +1354,31 @@ struct ContentView: View { SidebarResizeInteraction.hitWidthPerSide } - private var maxSidebarWidth: CGFloat { - (NSApp.keyWindow?.screen?.frame.width ?? NSScreen.main?.frame.width ?? 1920) * 2 / 3 + private func maxSidebarWidth(availableWidth: CGFloat? = nil) -> CGFloat { + let resolvedAvailableWidth = availableWidth + ?? observedWindow?.contentView?.bounds.width + ?? observedWindow?.contentLayoutRect.width + ?? NSApp.keyWindow?.contentView?.bounds.width + ?? NSApp.keyWindow?.contentLayoutRect.width + if let resolvedAvailableWidth, resolvedAvailableWidth > 0 { + return max(Self.minimumSidebarWidth, resolvedAvailableWidth * Self.maximumSidebarWidthRatio) + } + + let fallbackScreenWidth = NSApp.keyWindow?.screen?.frame.width + ?? NSScreen.main?.frame.width + ?? 1920 + return max(Self.minimumSidebarWidth, fallbackScreenWidth * Self.maximumSidebarWidthRatio) + } + + private func clampSidebarWidthIfNeeded(availableWidth: CGFloat? = nil) { + let nextWidth = max( + Self.minimumSidebarWidth, + min(maxSidebarWidth(availableWidth: availableWidth), sidebarWidth) + ) + guard abs(nextWidth - sidebarWidth) > 0.5 else { return } + withTransaction(Transaction(animation: nil)) { + sidebarWidth = nextWidth + } } private func activateSidebarResizerCursor() { @@ -1498,6 +1523,7 @@ struct ContentView: View { private func sidebarResizerHandleOverlay( _ handle: SidebarResizerHandle, width: CGFloat, + availableWidth: CGFloat, accessibilityIdentifier: String? = nil ) -> some View { Color.clear @@ -1543,7 +1569,10 @@ struct ContentView: View { activateSidebarResizerCursor() let startWidth = sidebarDragStartWidth ?? sidebarWidth - let nextWidth = max(186, min(maxSidebarWidth, startWidth + value.translation.width)) + let nextWidth = max( + Self.minimumSidebarWidth, + min(maxSidebarWidth(availableWidth: availableWidth), startWidth + value.translation.width) + ) withTransaction(Transaction(animation: nil)) { sidebarWidth = nextWidth } @@ -1574,6 +1603,7 @@ struct ContentView: View { sidebarResizerHandleOverlay( .divider, width: sidebarResizerHitWidthPerSide * 2, + availableWidth: totalWidth, accessibilityIdentifier: "SidebarResizer" ) @@ -1582,6 +1612,12 @@ struct ContentView: View { .allowsHitTesting(false) } .frame(width: totalWidth, height: proxy.size.height, alignment: .leading) + .onAppear { + clampSidebarWidthIfNeeded(availableWidth: totalWidth) + } + .onChange(of: totalWidth) { + clampSidebarWidthIfNeeded(availableWidth: totalWidth) + } } } @@ -2125,6 +2161,13 @@ struct ContentView: View { AppDelegate.shared?.fullscreenControlsViewModel = nil }) + view = AnyView(view.onReceive(NotificationCenter.default.publisher(for: NSWindow.didResizeNotification)) { notification in + guard let window = notification.object as? NSWindow, + window === observedWindow else { return } + clampSidebarWidthIfNeeded(availableWidth: window.contentView?.bounds.width ?? window.contentLayoutRect.width) + updateSidebarResizerBandState() + }) + view = AnyView(view.onChange(of: sidebarWidth) { _ in updateSidebarResizerBandState() }) @@ -2152,6 +2195,7 @@ struct ContentView: View { DispatchQueue.main.async { observedWindow = window isFullScreen = window.styleMask.contains(.fullScreen) + clampSidebarWidthIfNeeded(availableWidth: window.contentView?.bounds.width ?? window.contentLayoutRect.width) syncCommandPaletteDebugStateForObservedWindow() installSidebarResizerPointerMonitorIfNeeded() updateSidebarResizerBandState() diff --git a/cmuxUITests/SidebarResizeUITests.swift b/cmuxUITests/SidebarResizeUITests.swift index 57c47214..6844cbeb 100644 --- a/cmuxUITests/SidebarResizeUITests.swift +++ b/cmuxUITests/SidebarResizeUITests.swift @@ -35,4 +35,31 @@ final class SidebarResizeUITests: XCTestCase { XCTAssertLessThanOrEqual(leftDelta, -40, "Expected drag-left to move resizer left") XCTAssertGreaterThanOrEqual(leftDelta, -122, "Resizer moved farther than requested drag-left offset") } + + func testSidebarResizerHasMaximumWidthCap() { + let app = XCUIApplication() + app.launch() + + let window = app.windows.firstMatch + XCTAssertTrue(window.waitForExistence(timeout: 5.0)) + + let elements = app.descendants(matching: .any) + let resizer = elements["SidebarResizer"] + XCTAssertTrue(resizer.waitForExistence(timeout: 5.0)) + + let start = resizer.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)) + let farRight = start.withOffset(CGVector(dx: 5000, dy: 0)) + start.press(forDuration: 0.1, thenDragTo: farRight) + + let windowFrame = window.frame + let remainingWidth = max(0, windowFrame.maxX - resizer.frame.maxX) + let minimumExpectedRemaining = windowFrame.width * 0.45 + + XCTAssertGreaterThanOrEqual( + remainingWidth, + minimumExpectedRemaining, + "Expected sidebar max-width clamp to leave substantial terminal width. " + + "remaining=\(remainingWidth), window=\(windowFrame.width)" + ) + } } From 6598a38fe33b0b3b8a71802569ca2090184cee80 Mon Sep 17 00:00:00 2001 From: Austin Wang <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 11:26:11 -0800 Subject: [PATCH 124/214] Fix terminal zoom inheritance for new splits/surfaces/workspaces (#384) * Fix terminal Cmd zoom routing for Ghostty focus descendants (#383) * Inherit new terminal zoom from last terminal context Prefer pane-selected terminal as Ghostty config inheritance source when creating splits/new terminals, then focused/fallback terminals. This preserves runtime zoom/font size when opening the next terminal. * Fix terminal zoom inheritance across split/tab/workspace creation --- Sources/AppDelegate.swift | 57 +++- Sources/GhosttyTerminalView.swift | 41 ++- Sources/TabManager.swift | 38 ++- Sources/Workspace.swift | 303 +++++++++++++++--- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 163 ++++++++++ 5 files changed, 551 insertions(+), 51 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 0d671e90..11fca42f 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -194,6 +194,54 @@ func shouldRouteTerminalFontZoomShortcutToGhostty( return browserZoomShortcutAction(flags: flags, chars: chars, keyCode: keyCode) != nil } +func cmuxOwningGhosttyView(for responder: NSResponder?) -> GhosttyNSView? { + guard let responder else { return nil } + if let ghosttyView = responder as? GhosttyNSView { + return ghosttyView + } + + if let view = responder as? NSView, + let ghosttyView = cmuxOwningGhosttyView(for: view) { + return ghosttyView + } + + if let textView = responder as? NSTextView, + let delegateView = textView.delegate as? NSView, + let ghosttyView = cmuxOwningGhosttyView(for: delegateView) { + return ghosttyView + } + + var current = responder.nextResponder + while let next = current { + if let ghosttyView = next as? GhosttyNSView { + return ghosttyView + } + if let view = next as? NSView, + let ghosttyView = cmuxOwningGhosttyView(for: view) { + return ghosttyView + } + current = next.nextResponder + } + + return nil +} + +private func cmuxOwningGhosttyView(for view: NSView) -> GhosttyNSView? { + if let ghosttyView = view as? GhosttyNSView { + return ghosttyView + } + + var current: NSView? = view.superview + while let candidate = current { + if let ghosttyView = candidate as? GhosttyNSView { + return ghosttyView + } + current = candidate.superview + } + + return nil +} + #if DEBUG func browserZoomShortcutTraceCandidate( flags: NSEvent.ModifierFlags, @@ -2300,7 +2348,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent // When the terminal has active IME composition (e.g. Korean, Japanese, Chinese // input), don't intercept key events — let them flow through to the input method. - if let ghosttyView = NSApp.keyWindow?.firstResponder as? GhosttyNSView, + if let ghosttyView = cmuxOwningGhosttyView(for: NSApp.keyWindow?.firstResponder), ghosttyView.hasMarkedText() { return false } @@ -2345,7 +2393,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent // (e.g., split that doesn't properly blur the address bar). If the first responder // is a terminal surface, the address bar can't be focused. if browserAddressBarFocusedPanelId != nil, - NSApp.keyWindow?.firstResponder is GhosttyNSView { + cmuxOwningGhosttyView(for: NSApp.keyWindow?.firstResponder) != nil { #if DEBUG dlog("handleCustomShortcut: clearing stale browserAddressBarFocusedPanelId") #endif @@ -4441,7 +4489,8 @@ private extension NSWindow { // Command shortcuts when the terminal is focused — the local event monitor // (handleCustomShortcut) already handles app-level shortcuts, and anything // remaining should be menu items. - if let ghosttyView = self.firstResponder as? GhosttyNSView { + let firstResponderGhosttyView = cmuxOwningGhosttyView(for: self.firstResponder) + if let ghosttyView = firstResponderGhosttyView { // If the IME is composing, don't intercept key events — let them flow // through normal AppKit event dispatch so the input method can process them. if ghosttyView.hasMarkedText() { @@ -4484,7 +4533,7 @@ private extension NSWindow { // When the terminal is focused, skip the full NSWindow.performKeyEquivalent // (which walks the SwiftUI content view hierarchy) and dispatch Command-key // events directly to the main menu. This avoids the broken SwiftUI focus path. - if self.firstResponder is GhosttyNSView, + if firstResponderGhosttyView != nil, event.modifierFlags.intersection(.deviceIndependentFlagsMask).contains(.command), let mainMenu = NSApp.mainMenu { let consumedByMenu = mainMenu.performKeyEquivalent(with: event) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 1acbb97e..0e01b157 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1616,6 +1616,13 @@ final class TerminalSurface: Identifiable, ObservableObject { surfaceCallbackContext = callbackContext surfaceConfig.scale_factor = scaleFactors.layer surfaceConfig.context = surfaceContext +#if DEBUG + let templateFontText = String(format: "%.2f", surfaceConfig.font_size) + dlog( + "zoom.create surface=\(id.uuidString.prefix(5)) context=\(cmuxSurfaceContextName(surfaceContext)) " + + "templateFont=\(templateFontText)" + ) +#endif var envVars: [ghostty_env_var_s] = [] var envStorage: [(UnsafeMutablePointer<CChar>, UnsafeMutablePointer<CChar>)] = [] defer { @@ -1761,6 +1768,7 @@ final class TerminalSurface: Identifiable, ObservableObject { #endif return } + guard let createdSurface = surface else { return } // For vsync-driven rendering, Ghostty needs to know which display we're on so it can // start a CVDisplayLink with the right refresh rate. If we don't set this early, the @@ -1772,21 +1780,48 @@ final class TerminalSurface: Identifiable, ObservableObject { if let screen = view.window?.screen ?? NSScreen.main, let displayID = screen.displayID, displayID != 0 { - ghostty_surface_set_display_id(surface, displayID) + ghostty_surface_set_display_id(createdSurface, displayID) } - ghostty_surface_set_content_scale(surface, scaleFactors.x, scaleFactors.y) + ghostty_surface_set_content_scale(createdSurface, scaleFactors.x, scaleFactors.y) let wpx = UInt32((view.bounds.width * scaleFactors.x).rounded(.toNearestOrAwayFromZero)) let hpx = UInt32((view.bounds.height * scaleFactors.y).rounded(.toNearestOrAwayFromZero)) if wpx > 0, hpx > 0 { - ghostty_surface_set_size(surface, wpx, hpx) + ghostty_surface_set_size(createdSurface, wpx, hpx) lastPixelWidth = wpx lastPixelHeight = hpx lastXScale = scaleFactors.x lastYScale = scaleFactors.y } + // Some GhosttyKit builds can drop inherited font_size during post-create + // config/scale reconciliation. If runtime points don't match the inherited + // template points, re-apply via binding action so all creation paths + // (new surface, split, new workspace) preserve zoom from the source terminal. + if let inheritedFontPoints = configTemplate?.font_size, + inheritedFontPoints > 0 { + let currentFontPoints = cmuxCurrentSurfaceFontSizePoints(createdSurface) + let shouldReapply = { + guard let currentFontPoints else { return true } + return abs(currentFontPoints - inheritedFontPoints) > 0.05 + }() + if shouldReapply { + let action = String(format: "set_font_size:%.3f", inheritedFontPoints) + _ = performBindingAction(action) + } + } + flushPendingTextIfNeeded() + +#if DEBUG + let runtimeFontText = cmuxCurrentSurfaceFontSizePoints(createdSurface).map { + String(format: "%.2f", $0) + } ?? "nil" + dlog( + "zoom.create.done surface=\(id.uuidString.prefix(5)) context=\(cmuxSurfaceContextName(surfaceContext)) " + + "runtimeFont=\(runtimeFontText)" + ) +#endif } func updateSize(width: CGFloat, height: CGFloat, xScale: CGFloat, yScale: CGFloat, layerScale: CGFloat) { diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index f9c6b17d..0e38e366 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -753,9 +753,15 @@ class TabManager: ObservableObject { @discardableResult func addWorkspace(workingDirectory overrideWorkingDirectory: String? = nil, select: Bool = true) -> Workspace { let workingDirectory = normalizedWorkingDirectory(overrideWorkingDirectory) ?? preferredWorkingDirectoryForNewTab() + let inheritedConfig = inheritedTerminalConfigForNewWorkspace() let ordinal = Self.nextPortOrdinal Self.nextPortOrdinal += 1 - let newWorkspace = Workspace(title: "Terminal \(tabs.count + 1)", workingDirectory: workingDirectory, portOrdinal: ordinal) + let newWorkspace = Workspace( + title: "Terminal \(tabs.count + 1)", + workingDirectory: workingDirectory, + portOrdinal: ordinal, + configTemplate: inheritedConfig + ) wireClosedBrowserTracking(for: newWorkspace) let insertIndex = newTabInsertIndex() if insertIndex >= 0 && insertIndex <= tabs.count { @@ -785,6 +791,36 @@ class TabManager: ObservableObject { @discardableResult func addTab(select: Bool = true) -> Workspace { addWorkspace(select: select) } + func terminalPanelForWorkspaceConfigInheritanceSource() -> TerminalPanel? { + guard let workspace = selectedWorkspace else { return nil } + if let focusedTerminal = workspace.focusedTerminalPanel { + return focusedTerminal + } + if let rememberedTerminal = workspace.lastRememberedTerminalPanelForConfigInheritance() { + return rememberedTerminal + } + if let focusedPaneId = workspace.bonsplitController.focusedPaneId, + let paneTerminal = workspace.terminalPanelForConfigInheritance(inPane: focusedPaneId) { + return paneTerminal + } + return workspace.terminalPanelForConfigInheritance() + } + + private func inheritedTerminalConfigForNewWorkspace() -> ghostty_surface_config_s? { + if let sourceSurface = terminalPanelForWorkspaceConfigInheritanceSource()?.surface.surface { + return cmuxInheritedSurfaceConfig( + sourceSurface: sourceSurface, + context: GHOSTTY_SURFACE_CONTEXT_TAB + ) + } + if let fallbackFontPoints = selectedWorkspace?.lastRememberedTerminalFontPointsForConfigInheritance() { + var config = ghostty_surface_config_new() + config.font_size = fallbackFontPoints + return config + } + return nil + } + private func normalizedWorkingDirectory(_ directory: String?) -> String? { guard let directory else { return nil } let normalized = normalizeDirectory(directory) diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index a0838d0d..9697b271 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -3,6 +3,58 @@ import SwiftUI import AppKit import Bonsplit import Combine +import CoreText + +func cmuxSurfaceContextName(_ context: ghostty_surface_context_e) -> String { + switch context { + case GHOSTTY_SURFACE_CONTEXT_WINDOW: + return "window" + case GHOSTTY_SURFACE_CONTEXT_TAB: + return "tab" + case GHOSTTY_SURFACE_CONTEXT_SPLIT: + return "split" + default: + return "unknown(\(context))" + } +} + +func cmuxCurrentSurfaceFontSizePoints(_ surface: ghostty_surface_t) -> Float? { + guard let quicklookFont = ghostty_surface_quicklook_font(surface) else { + return nil + } + + let ctFont = Unmanaged<CTFont>.fromOpaque(quicklookFont).takeRetainedValue() + let points = Float(CTFontGetSize(ctFont)) + guard points > 0 else { return nil } + return points +} + +func cmuxInheritedSurfaceConfig( + sourceSurface: ghostty_surface_t, + context: ghostty_surface_context_e +) -> ghostty_surface_config_s { + let inherited = ghostty_surface_inherited_config(sourceSurface, context) + var config = inherited + + // Make runtime zoom inheritance explicit, even when Ghostty's + // inherit-font-size config is disabled. + let runtimePoints = cmuxCurrentSurfaceFontSizePoints(sourceSurface) + if let points = runtimePoints { + config.font_size = points + } + +#if DEBUG + let inheritedText = String(format: "%.2f", inherited.font_size) + let runtimeText = runtimePoints.map { String(format: "%.2f", $0) } ?? "nil" + let finalText = String(format: "%.2f", config.font_size) + dlog( + "zoom.inherit context=\(cmuxSurfaceContextName(context)) " + + "inherited=\(inheritedText) runtime=\(runtimeText) final=\(finalText)" + ) +#endif + + return config +} struct SidebarStatusEntry { let key: String @@ -261,6 +313,15 @@ final class Workspace: Identifiable, ObservableObject { /// When true, suppresses auto-creation in didSplitPane (programmatic splits handle their own panels) private var isProgrammaticSplit = false + /// Last terminal panel used as an inheritance source (typically last focused terminal). + private var lastTerminalConfigInheritancePanelId: UUID? + /// Last known terminal font points from inheritance sources. Used as fallback when + /// no live terminal surface is currently available. + private var lastTerminalConfigInheritanceFontPoints: Float? + /// Per-panel inherited zoom lineage. Descendants reuse this root value unless + /// a panel is explicitly re-zoomed by the user. + private var terminalInheritanceFontPointsByPanelId: [UUID: Float] = [:] + /// Callback used by TabManager to capture recently closed browser panels for Cmd+Shift+T restore. var onClosedBrowserPanel: ((ClosedBrowserPanelRestoreSnapshot) -> Void)? @@ -376,7 +437,12 @@ final class Workspace: Identifiable, ObservableObject { } } - init(title: String = "Terminal", workingDirectory: String? = nil, portOrdinal: Int = 0) { + init( + title: String = "Terminal", + workingDirectory: String? = nil, + portOrdinal: Int = 0, + configTemplate: ghostty_surface_config_s? = nil + ) { self.id = UUID() self.portOrdinal = portOrdinal self.processTitle = title @@ -414,11 +480,13 @@ final class Workspace: Identifiable, ObservableObject { let terminalPanel = TerminalPanel( workspaceId: id, context: GHOSTTY_SURFACE_CONTEXT_TAB, + configTemplate: configTemplate, workingDirectory: hasWorkingDirectory ? trimmedWorkingDirectory : nil, portOrdinal: portOrdinal ) panels[terminalPanel.id] = terminalPanel panelTitles[terminalPanel.id] = terminalPanel.displayTitle + seedTerminalInheritanceFontPoints(panelId: terminalPanel.id, configTemplate: configTemplate) // Create initial tab in bonsplit and store the mapping var initialTabId: TabID? @@ -919,6 +987,169 @@ final class Workspace: Identifiable, ObservableObject { // MARK: - Panel Operations + private func seedTerminalInheritanceFontPoints( + panelId: UUID, + configTemplate: ghostty_surface_config_s? + ) { + guard let fontPoints = configTemplate?.font_size, fontPoints > 0 else { return } + terminalInheritanceFontPointsByPanelId[panelId] = fontPoints + lastTerminalConfigInheritanceFontPoints = fontPoints + } + + private func resolvedTerminalInheritanceFontPoints( + for terminalPanel: TerminalPanel, + sourceSurface: ghostty_surface_t, + inheritedConfig: ghostty_surface_config_s + ) -> Float? { + let runtimePoints = cmuxCurrentSurfaceFontSizePoints(sourceSurface) + if let rooted = terminalInheritanceFontPointsByPanelId[terminalPanel.id], rooted > 0 { + if let runtimePoints, abs(runtimePoints - rooted) > 0.05 { + // Runtime zoom changed after lineage was seeded (manual zoom on descendant); + // treat runtime as the new root for future descendants. + return runtimePoints + } + return rooted + } + if inheritedConfig.font_size > 0 { + return inheritedConfig.font_size + } + return runtimePoints + } + + private func rememberTerminalConfigInheritanceSource(_ terminalPanel: TerminalPanel) { + lastTerminalConfigInheritancePanelId = terminalPanel.id + if let sourceSurface = terminalPanel.surface.surface, + let runtimePoints = cmuxCurrentSurfaceFontSizePoints(sourceSurface) { + let existing = terminalInheritanceFontPointsByPanelId[terminalPanel.id] + if existing == nil || abs((existing ?? runtimePoints) - runtimePoints) > 0.05 { + terminalInheritanceFontPointsByPanelId[terminalPanel.id] = runtimePoints + } + lastTerminalConfigInheritanceFontPoints = + terminalInheritanceFontPointsByPanelId[terminalPanel.id] ?? runtimePoints + } + } + + func lastRememberedTerminalPanelForConfigInheritance() -> TerminalPanel? { + guard let panelId = lastTerminalConfigInheritancePanelId else { return nil } + return terminalPanel(for: panelId) + } + + func lastRememberedTerminalFontPointsForConfigInheritance() -> Float? { + lastTerminalConfigInheritanceFontPoints + } + + /// Candidate terminal panels used as the source when creating inherited Ghostty config. + /// Preference order: + /// 1) explicitly preferred terminal panel (when the caller has one), + /// 2) selected terminal in the target pane, + /// 3) currently focused terminal in the workspace, + /// 4) last remembered terminal source, + /// 5) first terminal tab in the target pane, + /// 6) deterministic workspace fallback. + private func terminalPanelConfigInheritanceCandidates( + preferredPanelId: UUID? = nil, + inPane preferredPaneId: PaneID? = nil + ) -> [TerminalPanel] { + var candidates: [TerminalPanel] = [] + var seen: Set<UUID> = [] + + func appendCandidate(_ panel: TerminalPanel?) { + guard let panel, seen.insert(panel.id).inserted else { return } + candidates.append(panel) + } + + if let preferredPanelId, + let terminalPanel = terminalPanel(for: preferredPanelId) { + appendCandidate(terminalPanel) + } + + if let preferredPaneId, + let selectedSurfaceId = bonsplitController.selectedTab(inPane: preferredPaneId)?.id, + let selectedPanelId = panelIdFromSurfaceId(selectedSurfaceId), + let selectedTerminalPanel = terminalPanel(for: selectedPanelId) { + appendCandidate(selectedTerminalPanel) + } + + if let focusedTerminalPanel { + appendCandidate(focusedTerminalPanel) + } + + if let rememberedTerminalPanel = lastRememberedTerminalPanelForConfigInheritance() { + appendCandidate(rememberedTerminalPanel) + } + + if let preferredPaneId { + for tab in bonsplitController.tabs(inPane: preferredPaneId) { + guard let panelId = panelIdFromSurfaceId(tab.id), + let terminalPanel = terminalPanel(for: panelId) else { continue } + appendCandidate(terminalPanel) + } + } + + for terminalPanel in panels.values + .compactMap({ $0 as? TerminalPanel }) + .sorted(by: { $0.id.uuidString < $1.id.uuidString }) { + appendCandidate(terminalPanel) + } + + return candidates + } + + /// Picks the first terminal panel candidate used as the inheritance source. + func terminalPanelForConfigInheritance( + preferredPanelId: UUID? = nil, + inPane preferredPaneId: PaneID? = nil + ) -> TerminalPanel? { + terminalPanelConfigInheritanceCandidates( + preferredPanelId: preferredPanelId, + inPane: preferredPaneId + ).first + } + + private func inheritedTerminalConfig( + preferredPanelId: UUID? = nil, + inPane preferredPaneId: PaneID? = nil + ) -> ghostty_surface_config_s? { + // Walk candidates in priority order and use the first panel with a live surface. + // This avoids returning nil when the top candidate exists but is not attached yet. + for terminalPanel in terminalPanelConfigInheritanceCandidates( + preferredPanelId: preferredPanelId, + inPane: preferredPaneId + ) { + guard let sourceSurface = terminalPanel.surface.surface else { continue } + var config = cmuxInheritedSurfaceConfig( + sourceSurface: sourceSurface, + context: GHOSTTY_SURFACE_CONTEXT_SPLIT + ) + if let rootedFontPoints = resolvedTerminalInheritanceFontPoints( + for: terminalPanel, + sourceSurface: sourceSurface, + inheritedConfig: config + ), rootedFontPoints > 0 { + config.font_size = rootedFontPoints + terminalInheritanceFontPointsByPanelId[terminalPanel.id] = rootedFontPoints + } + rememberTerminalConfigInheritanceSource(terminalPanel) + if config.font_size > 0 { + lastTerminalConfigInheritanceFontPoints = config.font_size + } + return config + } + + if let fallbackFontPoints = lastTerminalConfigInheritanceFontPoints { + var config = ghostty_surface_config_new() + config.font_size = fallbackFontPoints +#if DEBUG + dlog( + "zoom.inherit fallback=lastKnownFont context=split font=\(String(format: "%.2f", fallbackFontPoints))" + ) +#endif + return config + } + + return nil + } + /// Create a new split with a terminal panel @discardableResult func newTerminalSplit( @@ -927,22 +1158,6 @@ final class Workspace: Identifiable, ObservableObject { insertFirst: Bool = false, focus: Bool = true ) -> TerminalPanel? { - // Get inherited config from the source terminal when possible. - // If the split is initiated from a non-terminal panel (for example browser), - // fall back to any terminal in the workspace. - let inheritedConfig: ghostty_surface_config_s? = { - if let sourceTerminal = terminalPanel(for: panelId), - let existing = sourceTerminal.surface.surface { - return ghostty_surface_inherited_config(existing, GHOSTTY_SURFACE_CONTEXT_SPLIT) - } - if let fallbackSurface = panels.values - .compactMap({ ($0 as? TerminalPanel)?.surface.surface }) - .first { - return ghostty_surface_inherited_config(fallbackSurface, GHOSTTY_SURFACE_CONTEXT_SPLIT) - } - return nil - }() - // Find the pane containing the source panel guard let sourceTabId = surfaceIdFromPanelId(panelId) else { return nil } var sourcePaneId: PaneID? @@ -955,6 +1170,7 @@ final class Workspace: Identifiable, ObservableObject { } guard let paneId = sourcePaneId else { return nil } + let inheritedConfig = inheritedTerminalConfig(preferredPanelId: panelId, inPane: paneId) // Create the new terminal panel. let newPanel = TerminalPanel( @@ -965,6 +1181,7 @@ final class Workspace: Identifiable, ObservableObject { ) panels[newPanel.id] = newPanel panelTitles[newPanel.id] = newPanel.displayTitle + seedTerminalInheritanceFontPoints(panelId: newPanel.id, configTemplate: inheritedConfig) // Pre-generate the bonsplit tab ID so we can install the panel mapping before bonsplit // mutates layout state (avoids transient "Empty Panel" flashes during split). @@ -989,6 +1206,7 @@ final class Workspace: Identifiable, ObservableObject { panels.removeValue(forKey: newPanel.id) panelTitles.removeValue(forKey: newPanel.id) surfaceIdToPanelId.removeValue(forKey: newTab.id) + terminalInheritanceFontPointsByPanelId.removeValue(forKey: newPanel.id) return nil } @@ -1024,16 +1242,7 @@ final class Workspace: Identifiable, ObservableObject { func newTerminalSurface(inPane paneId: PaneID, focus: Bool? = nil) -> TerminalPanel? { let shouldFocusNewTab = focus ?? (bonsplitController.focusedPaneId == paneId) - // Get an existing terminal panel to inherit config from - let inheritedConfig: ghostty_surface_config_s? = { - for panel in panels.values { - if let terminalPanel = panel as? TerminalPanel, - let surface = terminalPanel.surface.surface { - return ghostty_surface_inherited_config(surface, GHOSTTY_SURFACE_CONTEXT_SPLIT) - } - } - return nil - }() + let inheritedConfig = inheritedTerminalConfig(inPane: paneId) // Create new terminal panel let newPanel = TerminalPanel( @@ -1044,6 +1253,7 @@ final class Workspace: Identifiable, ObservableObject { ) panels[newPanel.id] = newPanel panelTitles[newPanel.id] = newPanel.displayTitle + seedTerminalInheritanceFontPoints(panelId: newPanel.id, configTemplate: inheritedConfig) // Create tab in bonsplit guard let newTabId = bonsplitController.createTab( @@ -1056,6 +1266,7 @@ final class Workspace: Identifiable, ObservableObject { ) else { panels.removeValue(forKey: newPanel.id) panelTitles.removeValue(forKey: newPanel.id) + terminalInheritanceFontPointsByPanelId.removeValue(forKey: newPanel.id) return nil } @@ -1819,14 +2030,19 @@ final class Workspace: Identifiable, ObservableObject { /// Create a new terminal panel (used when replacing the last panel) @discardableResult func createReplacementTerminalPanel() -> TerminalPanel { + let inheritedConfig = inheritedTerminalConfig( + preferredPanelId: focusedPanelId, + inPane: bonsplitController.focusedPaneId + ) let newPanel = TerminalPanel( workspaceId: id, context: GHOSTTY_SURFACE_CONTEXT_TAB, - configTemplate: nil, + configTemplate: inheritedConfig, portOrdinal: portOrdinal ) panels[newPanel.id] = newPanel panelTitles[newPanel.id] = newPanel.displayTitle + seedTerminalInheritanceFontPoints(panelId: newPanel.id, configTemplate: inheritedConfig) // Create tab in bonsplit if let newTabId = bonsplitController.createTab( @@ -2100,6 +2316,9 @@ extension Workspace: BonsplitDelegate { } panel.focus() + if let terminalPanel = panel as? TerminalPanel { + rememberTerminalConfigInheritanceSource(terminalPanel) + } let isManuallyUnread = manualUnreadPanelIds.contains(panelId) let markedAt = manualUnreadMarkedAt[panelId] if Self.shouldClearManualUnread( @@ -2327,6 +2546,10 @@ extension Workspace: BonsplitDelegate { panelSubscriptions.removeValue(forKey: panelId) surfaceTTYNames.removeValue(forKey: panelId) PortScanner.shared.unregisterPanel(workspaceId: id, panelId: panelId) + terminalInheritanceFontPointsByPanelId.removeValue(forKey: panelId) + if lastTerminalConfigInheritancePanelId == panelId { + lastTerminalConfigInheritancePanelId = nil + } // Keep the workspace invariant: always retain at least one real panel. // This prevents runtime close callbacks from ever collapsing into a tabless workspace. @@ -2519,15 +2742,7 @@ extension Workspace: BonsplitDelegate { // Keep the existing placeholder tab identity and replace only the panel mapping. // This avoids an extra create+close tab churn that can transiently render an // empty pane during drag-to-split of a single-tab pane. - let inheritedConfig: ghostty_surface_config_s? = { - for panel in panels.values { - if let terminalPanel = panel as? TerminalPanel, - let surface = terminalPanel.surface.surface { - return ghostty_surface_inherited_config(surface, GHOSTTY_SURFACE_CONTEXT_SPLIT) - } - } - return nil - }() + let inheritedConfig = inheritedTerminalConfig(inPane: originalPane) let replacementPanel = TerminalPanel( workspaceId: id, @@ -2537,6 +2752,7 @@ extension Workspace: BonsplitDelegate { ) panels[replacementPanel.id] = replacementPanel panelTitles[replacementPanel.id] = replacementPanel.displayTitle + seedTerminalInheritanceFontPoints(panelId: replacementPanel.id, configTemplate: inheritedConfig) surfaceIdToPanelId[replacementTab.id] = replacementPanel.id bonsplitController.updateTab( @@ -2579,7 +2795,7 @@ extension Workspace: BonsplitDelegate { // Get the focused terminal in the original pane to inherit config from guard let sourceTabId = controller.selectedTab(inPane: originalPane)?.id, let sourcePanelId = panelIdFromSurfaceId(sourceTabId), - let sourcePanel = terminalPanel(for: sourcePanelId) else { return } + terminalPanel(for: sourcePanelId) != nil else { return } #if DEBUG dlog( @@ -2588,11 +2804,10 @@ extension Workspace: BonsplitDelegate { ) #endif - let inheritedConfig: ghostty_surface_config_s? = if let existing = sourcePanel.surface.surface { - ghostty_surface_inherited_config(existing, GHOSTTY_SURFACE_CONTEXT_SPLIT) - } else { - nil - } + let inheritedConfig = inheritedTerminalConfig( + preferredPanelId: sourcePanelId, + inPane: originalPane + ) let newPanel = TerminalPanel( workspaceId: id, @@ -2602,6 +2817,7 @@ extension Workspace: BonsplitDelegate { ) panels[newPanel.id] = newPanel panelTitles[newPanel.id] = newPanel.displayTitle + seedTerminalInheritanceFontPoints(panelId: newPanel.id, configTemplate: inheritedConfig) guard let newTabId = bonsplitController.createTab( title: newPanel.displayTitle, @@ -2613,6 +2829,7 @@ extension Workspace: BonsplitDelegate { ) else { panels.removeValue(forKey: newPanel.id) panelTitles.removeValue(forKey: newPanel.id) + terminalInheritanceFontPointsByPanelId.removeValue(forKey: newPanel.id) return } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 59208945..c12d2c08 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1238,6 +1238,10 @@ final class BrowserZoomShortcutActionTests: XCTestCase { browserZoomShortcutAction(flags: [.command, .shift], chars: "+", keyCode: 24), .zoomIn ) + XCTAssertEqual( + browserZoomShortcutAction(flags: [.command], chars: "+", keyCode: 30), + .zoomIn + ) } func testZoomOutSupportsMinusAndUnderscoreVariants() { @@ -1316,6 +1320,30 @@ final class BrowserZoomShortcutRoutingPolicyTests: XCTestCase { } } +final class GhosttyResponderResolutionTests: XCTestCase { + private final class FocusProbeView: NSView { + override var acceptsFirstResponder: Bool { true } + } + + func testResolvesGhosttyViewFromDescendantResponder() { + let ghosttyView = GhosttyNSView(frame: NSRect(x: 0, y: 0, width: 200, height: 120)) + let descendant = FocusProbeView(frame: NSRect(x: 0, y: 0, width: 40, height: 40)) + ghosttyView.addSubview(descendant) + + XCTAssertTrue(cmuxOwningGhosttyView(for: descendant) === ghosttyView) + } + + func testResolvesGhosttyViewFromGhosttyResponder() { + let ghosttyView = GhosttyNSView(frame: NSRect(x: 0, y: 0, width: 200, height: 120)) + XCTAssertTrue(cmuxOwningGhosttyView(for: ghosttyView) === ghosttyView) + } + + func testReturnsNilForUnrelatedResponder() { + let view = FocusProbeView(frame: NSRect(x: 0, y: 0, width: 40, height: 40)) + XCTAssertNil(cmuxOwningGhosttyView(for: view)) + } +} + final class CommandPaletteKeyboardNavigationTests: XCTestCase { func testArrowKeysMoveSelectionWithoutModifiers() { XCTAssertEqual( @@ -2313,6 +2341,141 @@ final class TabManagerSurfaceCreationTests: XCTestCase { } } +@MainActor +final class WorkspaceTerminalConfigInheritanceSelectionTests: XCTestCase { + func testPrefersSelectedTerminalInTargetPaneOverFocusedTerminalElsewhere() { + let manager = TabManager() + guard let workspace = manager.selectedWorkspace, + let leftPanelId = workspace.focusedPanelId, + let rightPanel = workspace.newTerminalSplit(from: leftPanelId, orientation: .horizontal), + let leftPaneId = workspace.paneId(forPanelId: leftPanelId) else { + XCTFail("Expected workspace split setup to succeed") + return + } + + // Programmatic split focuses the new right panel by default. + XCTAssertEqual(workspace.focusedPanelId, rightPanel.id) + + let sourcePanel = workspace.terminalPanelForConfigInheritance(inPane: leftPaneId) + XCTAssertEqual( + sourcePanel?.id, + leftPanelId, + "Expected inheritance to use the selected terminal in the target pane" + ) + } + + func testFallsBackToAnotherTerminalInPaneWhenSelectedTabIsBrowser() { + let manager = TabManager() + guard let workspace = manager.selectedWorkspace, + let terminalPanelId = workspace.focusedPanelId, + let paneId = workspace.paneId(forPanelId: terminalPanelId), + let browserPanel = workspace.newBrowserSurface(inPane: paneId, focus: true) else { + XCTFail("Expected workspace browser setup to succeed") + return + } + + XCTAssertEqual(workspace.focusedPanelId, browserPanel.id) + + let sourcePanel = workspace.terminalPanelForConfigInheritance(inPane: paneId) + XCTAssertEqual( + sourcePanel?.id, + terminalPanelId, + "Expected inheritance to fall back to a terminal in the pane when browser is selected" + ) + } + + func testPreferredTerminalPanelWinsWhenProvided() { + let manager = TabManager() + guard let workspace = manager.selectedWorkspace, + let terminalPanelId = workspace.focusedPanelId else { + XCTFail("Expected selected workspace with a terminal panel") + return + } + + let sourcePanel = workspace.terminalPanelForConfigInheritance(preferredPanelId: terminalPanelId) + XCTAssertEqual(sourcePanel?.id, terminalPanelId) + } + + func testPrefersLastFocusedTerminalWhenBrowserFocusedInDifferentPane() { + let manager = TabManager() + guard let workspace = manager.selectedWorkspace, + let leftTerminalPanelId = workspace.focusedPanelId, + let rightTerminalPanel = workspace.newTerminalSplit(from: leftTerminalPanelId, orientation: .horizontal), + let rightPaneId = workspace.paneId(forPanelId: rightTerminalPanel.id) else { + XCTFail("Expected split setup to succeed") + return + } + + workspace.focusPanel(leftTerminalPanelId) + _ = workspace.newBrowserSurface(inPane: rightPaneId, focus: true) + XCTAssertNotEqual(workspace.focusedPanelId, leftTerminalPanelId) + + let sourcePanel = workspace.terminalPanelForConfigInheritance(inPane: rightPaneId) + XCTAssertEqual( + sourcePanel?.id, + leftTerminalPanelId, + "Expected inheritance to prefer last focused terminal when browser is focused in another pane" + ) + } +} + +@MainActor +final class TabManagerWorkspaceConfigInheritanceSourceTests: XCTestCase { + func testUsesFocusedTerminalWhenTerminalIsFocused() { + let manager = TabManager() + guard let workspace = manager.selectedWorkspace, + let terminalPanelId = workspace.focusedPanelId else { + XCTFail("Expected selected workspace with focused terminal") + return + } + + let sourcePanel = manager.terminalPanelForWorkspaceConfigInheritanceSource() + XCTAssertEqual(sourcePanel?.id, terminalPanelId) + } + + func testFallsBackToTerminalWhenBrowserIsFocused() { + let manager = TabManager() + guard let workspace = manager.selectedWorkspace, + let terminalPanelId = workspace.focusedPanelId, + let paneId = workspace.paneId(forPanelId: terminalPanelId), + let browserPanel = workspace.newBrowserSurface(inPane: paneId, focus: true) else { + XCTFail("Expected selected workspace setup to succeed") + return + } + + XCTAssertEqual(workspace.focusedPanelId, browserPanel.id) + + let sourcePanel = manager.terminalPanelForWorkspaceConfigInheritanceSource() + XCTAssertEqual( + sourcePanel?.id, + terminalPanelId, + "Expected new workspace inheritance source to resolve to the pane terminal when browser is focused" + ) + } + + func testPrefersLastFocusedTerminalAcrossPanesWhenBrowserIsFocused() { + let manager = TabManager() + guard let workspace = manager.selectedWorkspace, + let leftTerminalPanelId = workspace.focusedPanelId, + let rightTerminalPanel = workspace.newTerminalSplit(from: leftTerminalPanelId, orientation: .horizontal), + let rightPaneId = workspace.paneId(forPanelId: rightTerminalPanel.id) else { + XCTFail("Expected split setup to succeed") + return + } + + workspace.focusPanel(leftTerminalPanelId) + _ = workspace.newBrowserSurface(inPane: rightPaneId, focus: true) + XCTAssertNotEqual(workspace.focusedPanelId, leftTerminalPanelId) + + let sourcePanel = manager.terminalPanelForWorkspaceConfigInheritanceSource() + XCTAssertEqual( + sourcePanel?.id, + leftTerminalPanelId, + "Expected workspace inheritance source to use last focused terminal across panes" + ) + } +} + @MainActor final class TabManagerReopenClosedBrowserFocusTests: XCTestCase { func testReopenFromDifferentWorkspaceFocusesReopenedBrowser() { From 4bc3da65b67e274855fb5b90723e4b21684200d5 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 12:19:52 -0800 Subject: [PATCH 125/214] Fix terminal/web portal overflow during narrow pane resizing --- Sources/BrowserWindowPortal.swift | 93 ++++- Sources/GhosttyTerminalView.swift | 98 ++++-- Sources/TerminalWindowPortal.swift | 319 +++++++++++++++++- ...test_terminal_resize_portal_regressions.py | 106 ++++++ vendor/bonsplit | 2 +- 5 files changed, 582 insertions(+), 36 deletions(-) create mode 100644 tests/test_terminal_resize_portal_regressions.py diff --git a/Sources/BrowserWindowPortal.swift b/Sources/BrowserWindowPortal.swift index 8da7833c..2e82cb66 100644 --- a/Sources/BrowserWindowPortal.swift +++ b/Sources/BrowserWindowPortal.swift @@ -326,6 +326,8 @@ final class WindowBrowserPortal: NSObject { private weak var installedContainerView: NSView? private weak var installedReferenceView: NSView? private var hasDeferredFullSyncScheduled = false + private var hasExternalGeometrySyncScheduled = false + private var geometryObservers: [NSObjectProtocol] = [] private struct Entry { weak var webView: WKWebView? @@ -345,9 +347,73 @@ final class WindowBrowserPortal: NSObject { hostView.layer?.masksToBounds = true hostView.translatesAutoresizingMaskIntoConstraints = true hostView.autoresizingMask = [] + installGeometryObservers(for: window) _ = ensureInstalled() } + private func installGeometryObservers(for window: NSWindow) { + guard geometryObservers.isEmpty else { return } + + let center = NotificationCenter.default + geometryObservers.append(center.addObserver( + forName: NSWindow.didResizeNotification, + object: window, + queue: .main + ) { [weak self] _ in + MainActor.assumeIsolated { + self?.scheduleExternalGeometrySynchronize() + } + }) + geometryObservers.append(center.addObserver( + forName: NSWindow.didEndLiveResizeNotification, + object: window, + queue: .main + ) { [weak self] _ in + MainActor.assumeIsolated { + self?.scheduleExternalGeometrySynchronize() + } + }) + geometryObservers.append(center.addObserver( + forName: NSSplitView.didResizeSubviewsNotification, + object: nil, + queue: .main + ) { [weak self] notification in + MainActor.assumeIsolated { + guard let self, + let splitView = notification.object as? NSSplitView, + let window = self.window, + splitView.window === window else { return } + self.scheduleExternalGeometrySynchronize() + } + }) + } + + private func removeGeometryObservers() { + for observer in geometryObservers { + NotificationCenter.default.removeObserver(observer) + } + geometryObservers.removeAll() + } + + private func scheduleExternalGeometrySynchronize() { + guard !hasExternalGeometrySyncScheduled else { return } + hasExternalGeometrySyncScheduled = true + DispatchQueue.main.async { [weak self] in + guard let self else { return } + self.hasExternalGeometrySyncScheduled = false + self.synchronizeAllEntriesFromExternalGeometryChange() + } + } + + private func synchronizeAllEntriesFromExternalGeometryChange() { + guard ensureInstalled() else { return } + installedContainerView?.layoutSubtreeIfNeeded() + installedReferenceView?.layoutSubtreeIfNeeded() + hostView.superview?.layoutSubtreeIfNeeded() + hostView.layoutSubtreeIfNeeded() + synchronizeAllWebViews(excluding: nil, source: "externalGeometry") + } + @discardableResult private func ensureInstalled() -> Bool { guard let window else { return false } @@ -419,13 +485,32 @@ final class WindowBrowserPortal: NSObject { return false } - private static func rectApproximatelyEqual(_ lhs: NSRect, _ rhs: NSRect, epsilon: CGFloat = 0.5) -> Bool { + private static func rectApproximatelyEqual(_ lhs: NSRect, _ rhs: NSRect, epsilon: CGFloat = 0.01) -> Bool { abs(lhs.origin.x - rhs.origin.x) <= epsilon && abs(lhs.origin.y - rhs.origin.y) <= epsilon && abs(lhs.size.width - rhs.size.width) <= epsilon && abs(lhs.size.height - rhs.size.height) <= epsilon } + private static func pixelSnappedRect(_ rect: NSRect, in view: NSView) -> NSRect { + guard rect.origin.x.isFinite, + rect.origin.y.isFinite, + rect.size.width.isFinite, + rect.size.height.isFinite else { + return rect + } + let scale = max(1.0, view.window?.backingScaleFactor ?? NSScreen.main?.backingScaleFactor ?? 1.0) + func snap(_ value: CGFloat) -> CGFloat { + (value * scale).rounded(.toNearestOrAwayFromZero) / scale + } + return NSRect( + x: snap(rect.origin.x), + y: snap(rect.origin.y), + width: max(0, snap(rect.size.width)), + height: max(0, snap(rect.size.height)) + ) + } + private static func frameExtendsOutsideBounds(_ frame: NSRect, bounds: NSRect, epsilon: CGFloat = 0.5) -> Bool { frame.minX < bounds.minX - epsilon || frame.minY < bounds.minY - epsilon || @@ -765,7 +850,8 @@ final class WindowBrowserPortal: NSObject { _ = synchronizeHostFrameToReference() let frameInWindow = anchorView.convert(anchorView.bounds, to: nil) - let frameInHost = hostView.convert(frameInWindow, from: nil) + let frameInHostRaw = hostView.convert(frameInWindow, from: nil) + let frameInHost = Self.pixelSnappedRect(frameInHostRaw, in: hostView) let hostBounds = hostView.bounds let hasFiniteHostBounds = hostBounds.origin.x.isFinite && @@ -838,6 +924,8 @@ final class WindowBrowserPortal: NSObject { CATransaction.setDisableActions(true) containerView.frame = targetFrame CATransaction.commit() + webView.needsLayout = true + webView.layoutSubtreeIfNeeded() } let expectedContainerBounds = NSRect(origin: .zero, size: targetFrame.size) @@ -952,6 +1040,7 @@ final class WindowBrowserPortal: NSObject { } func tearDown() { + removeGeometryObservers() for webViewId in Array(entriesByWebViewId.keys) { detachWebView(withId: webViewId) } diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 0e01b157..f42d79ae 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1501,6 +1501,17 @@ final class TerminalSurface: Identifiable, ObservableObject { } #endif + /// Match upstream Ghostty AppKit sizing: framebuffer dimensions are derived + /// from backing-space points and truncated (never rounded up). + private func pixelDimension(from value: CGFloat) -> UInt32 { + guard value.isFinite else { return 0 } + let floored = floor(max(0, value)) + if floored >= CGFloat(UInt32.max) { + return UInt32.max + } + return UInt32(floored) + } + private func scaleFactors(for view: GhosttyNSView) -> (x: CGFloat, y: CGFloat, layer: CGFloat) { let scale = max( 1.0, @@ -1784,8 +1795,9 @@ final class TerminalSurface: Identifiable, ObservableObject { } ghostty_surface_set_content_scale(createdSurface, scaleFactors.x, scaleFactors.y) - let wpx = UInt32((view.bounds.width * scaleFactors.x).rounded(.toNearestOrAwayFromZero)) - let hpx = UInt32((view.bounds.height * scaleFactors.y).rounded(.toNearestOrAwayFromZero)) + let backingSize = view.convertToBacking(NSRect(origin: .zero, size: view.bounds.size)).size + let wpx = pixelDimension(from: backingSize.width) + let hpx = pixelDimension(from: backingSize.height) if wpx > 0, hpx > 0 { ghostty_surface_set_size(createdSurface, wpx, hpx) lastPixelWidth = wpx @@ -1824,12 +1836,21 @@ final class TerminalSurface: Identifiable, ObservableObject { #endif } - func updateSize(width: CGFloat, height: CGFloat, xScale: CGFloat, yScale: CGFloat, layerScale: CGFloat) { + func updateSize( + width: CGFloat, + height: CGFloat, + xScale: CGFloat, + yScale: CGFloat, + layerScale: CGFloat, + backingSize: CGSize? = nil + ) { guard let surface = surface else { return } _ = layerScale - let wpx = UInt32((width * xScale).rounded(.toNearestOrAwayFromZero)) - let hpx = UInt32((height * yScale).rounded(.toNearestOrAwayFromZero)) + let resolvedBackingWidth = backingSize?.width ?? (width * xScale) + let resolvedBackingHeight = backingSize?.height ?? (height * yScale) + let wpx = pixelDimension(from: resolvedBackingWidth) + let hpx = pixelDimension(from: resolvedBackingHeight) guard wpx > 0, hpx > 0 else { return } let scaleChanged = !scaleApproximatelyEqual(xScale, lastXScale) || !scaleApproximatelyEqual(yScale, lastYScale) @@ -2114,6 +2135,8 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { private func setup() { // Only enable our instrumented CAMetalLayer in targeted debug/test scenarios. // The lock in GhosttyMetalLayer.nextDrawable() adds overhead we don't want in normal runs. + wantsLayer = true + layer?.masksToBounds = true installEventMonitor() updateTrackingAreas() registerForDraggedTypes(Array(Self.dropTypes)) @@ -2241,17 +2264,11 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { ghostty_surface_set_display_id(surface, displayID) } - // Recompute from current bounds after layout, not stale pending sizes. + // Recompute from current bounds after layout. Pending size is only a fallback + // when we don't have usable bounds (e.g. detached/off-window transitions). superview?.layoutSubtreeIfNeeded() layoutSubtreeIfNeeded() - let targetSize: CGSize = { - let current = bounds.size - if current.width > 0, current.height > 0 { - return current - } - return pendingSurfaceSize ?? current - }() - updateSurfaceSize(size: targetSize) + updateSurfaceSize() applySurfaceBackground() applySurfaceColorScheme(force: true) applyWindowBackgroundIfActive() @@ -2291,9 +2308,30 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { override var isOpaque: Bool { false } + private func resolvedSurfaceSize(preferred size: CGSize?) -> CGSize { + if let size, + size.width > 0, + size.height > 0 { + return size + } + + let currentBounds = bounds.size + if currentBounds.width > 0, currentBounds.height > 0 { + return currentBounds + } + + if let pending = pendingSurfaceSize, + pending.width > 0, + pending.height > 0 { + return pending + } + + return currentBounds + } + private func updateSurfaceSize(size: CGSize? = nil) { guard let terminalSurface = terminalSurface else { return } - let size = size ?? bounds.size + let size = resolvedSurfaceSize(preferred: size) guard size.width > 0 && size.height > 0 else { #if DEBUG let signature = "nonPositive-\(Int(size.width))x\(Int(size.height))" @@ -2353,12 +2391,17 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { let xScale = backingSize.width / size.width let yScale = backingSize.height / size.height let layerScale = max(1.0, window.backingScaleFactor) + let drawablePixelSize = CGSize( + width: floor(max(0, backingSize.width)), + height: floor(max(0, backingSize.height)) + ) CATransaction.begin() CATransaction.setDisableActions(true) layer?.contentsScale = layerScale + layer?.masksToBounds = true if let metalLayer = layer as? CAMetalLayer { - metalLayer.drawableSize = backingSize + metalLayer.drawableSize = drawablePixelSize } CATransaction.commit() @@ -2367,9 +2410,9 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { height: size.height, xScale: xScale, yScale: yScale, - layerScale: layerScale + layerScale: layerScale, + backingSize: backingSize ) - pendingSurfaceSize = nil } fileprivate func pushTargetSurfaceSize(_ size: CGSize) { @@ -3559,6 +3602,8 @@ final class GhosttySurfaceScrollView: NSView { documentView.addSubview(surfaceView) super.init(frame: .zero) + wantsLayer = true + layer?.masksToBounds = true backgroundView.wantsLayer = true backgroundView.layer?.backgroundColor = @@ -3696,6 +3741,12 @@ final class GhosttySurfaceScrollView: NSView { synchronizeGeometryAndContent() } + /// Request an immediate terminal redraw after geometry updates so stale IOSurface + /// contents do not remain stretched during live resize churn. + func refreshSurfaceNow() { + surfaceView.terminalSurface?.forceRefresh() + } + private func synchronizeGeometryAndContent() { CATransaction.begin() CATransaction.setDisableActions(true) @@ -3705,7 +3756,6 @@ final class GhosttySurfaceScrollView: NSView { scrollView.frame = bounds let targetSize = scrollView.bounds.size surfaceView.frame.size = targetSize - surfaceView.pushTargetSurfaceSize(targetSize) documentView.frame.size.width = scrollView.bounds.width inactiveOverlayView.frame = bounds if let zone = activeDropZone { @@ -3729,6 +3779,7 @@ final class GhosttySurfaceScrollView: NSView { updateFlashPath() synchronizeScrollView() synchronizeSurfaceView() + synchronizeCoreSurface() } override func viewDidMoveToWindow() { @@ -4606,6 +4657,15 @@ final class GhosttySurfaceScrollView: NSView { surfaceView.frame.origin = visibleRect.origin } + /// Match upstream Ghostty behavior: use content area width (excluding non-content + /// regions such as scrollbar space) when telling libghostty the terminal size. + private func synchronizeCoreSurface() { + let width = scrollView.contentSize.width + let height = surfaceView.frame.height + guard width > 0, height > 0 else { return } + surfaceView.pushTargetSurfaceSize(CGSize(width: width, height: height)) + } + private func updateNotificationRingPath() { updateOverlayRingPath( layer: notificationRingLayer, diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index 07831c71..cec6847e 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -536,6 +536,8 @@ final class WindowTerminalPortal: NSObject { private weak var installedReferenceView: NSView? private var installConstraints: [NSLayoutConstraint] = [] private var hasDeferredFullSyncScheduled = false + private var hasExternalGeometrySyncScheduled = false + private var geometryObservers: [NSObjectProtocol] = [] private struct Entry { weak var hostedView: GhosttySurfaceScrollView? @@ -550,13 +552,141 @@ final class WindowTerminalPortal: NSObject { init(window: NSWindow) { self.window = window super.init() - hostView.wantsLayer = false + hostView.wantsLayer = true + hostView.layer?.masksToBounds = true + hostView.postsFrameChangedNotifications = true + hostView.postsBoundsChangedNotifications = true hostView.translatesAutoresizingMaskIntoConstraints = false dividerOverlayView.translatesAutoresizingMaskIntoConstraints = true dividerOverlayView.autoresizingMask = [.width, .height] + installGeometryObservers(for: window) _ = ensureInstalled() } + private func installGeometryObservers(for window: NSWindow) { + guard geometryObservers.isEmpty else { return } + + let center = NotificationCenter.default + geometryObservers.append(center.addObserver( + forName: NSWindow.didResizeNotification, + object: window, + queue: .main + ) { [weak self] _ in + MainActor.assumeIsolated { + self?.scheduleExternalGeometrySynchronize() + } + }) + geometryObservers.append(center.addObserver( + forName: NSWindow.didEndLiveResizeNotification, + object: window, + queue: .main + ) { [weak self] _ in + MainActor.assumeIsolated { + self?.scheduleExternalGeometrySynchronize() + } + }) + geometryObservers.append(center.addObserver( + forName: NSSplitView.didResizeSubviewsNotification, + object: nil, + queue: .main + ) { [weak self] notification in + MainActor.assumeIsolated { + guard let self, + let splitView = notification.object as? NSSplitView, + let window = self.window, + splitView.window === window else { return } + self.scheduleExternalGeometrySynchronize() + } + }) + geometryObservers.append(center.addObserver( + forName: NSView.frameDidChangeNotification, + object: hostView, + queue: .main + ) { [weak self] _ in + MainActor.assumeIsolated { + self?.scheduleExternalGeometrySynchronize() + } + }) + geometryObservers.append(center.addObserver( + forName: NSView.boundsDidChangeNotification, + object: hostView, + queue: .main + ) { [weak self] _ in + MainActor.assumeIsolated { + self?.scheduleExternalGeometrySynchronize() + } + }) + } + + private func removeGeometryObservers() { + for observer in geometryObservers { + NotificationCenter.default.removeObserver(observer) + } + geometryObservers.removeAll() + } + + private func scheduleExternalGeometrySynchronize() { + guard !hasExternalGeometrySyncScheduled else { return } + hasExternalGeometrySyncScheduled = true + DispatchQueue.main.async { [weak self] in + guard let self else { return } + self.hasExternalGeometrySyncScheduled = false + self.synchronizeAllEntriesFromExternalGeometryChange() + } + } + + private func synchronizeLayoutHierarchy() { + installedContainerView?.layoutSubtreeIfNeeded() + installedReferenceView?.layoutSubtreeIfNeeded() + hostView.superview?.layoutSubtreeIfNeeded() + hostView.layoutSubtreeIfNeeded() + _ = synchronizeHostFrameToReference() + } + + @discardableResult + private func synchronizeHostFrameToReference() -> Bool { + guard let container = installedContainerView, + let reference = installedReferenceView else { + return false + } + let frameInContainer = container.convert(reference.bounds, from: reference) + let hasFiniteFrame = + frameInContainer.origin.x.isFinite && + frameInContainer.origin.y.isFinite && + frameInContainer.size.width.isFinite && + frameInContainer.size.height.isFinite + guard hasFiniteFrame else { return false } + + if !Self.rectApproximatelyEqual(hostView.frame, frameInContainer) { + CATransaction.begin() + CATransaction.setDisableActions(true) + hostView.frame = frameInContainer + CATransaction.commit() +#if DEBUG + dlog( + "portal.hostFrame.update host=\(portalDebugToken(hostView)) " + + "frame=\(portalDebugFrame(frameInContainer))" + ) +#endif + } + return frameInContainer.width > 1 && frameInContainer.height > 1 + } + + private func synchronizeAllEntriesFromExternalGeometryChange() { + guard ensureInstalled() else { return } + synchronizeLayoutHierarchy() + synchronizeAllHostedViews(excluding: nil) + + // During live resize, AppKit can deliver frame churn where host/container geometry + // settles a tick before the terminal's own scroll/surface hierarchy. Force a final + // in-place geometry + surface refresh for all visible entries in this window. + for entry in entriesByHostedId.values { + guard let hostedView = entry.hostedView, !hostedView.isHidden else { continue } + hostedView.reconcileGeometryNow() + hostedView.refreshSurfaceNow() + } + } + private func ensureDividerOverlayOnTop() { if dividerOverlayView.superview !== hostView { dividerOverlayView.frame = hostView.bounds @@ -605,6 +735,8 @@ final class WindowTerminalPortal: NSObject { container.addSubview(overlay, positioned: .above, relativeTo: hostView) } + synchronizeLayoutHierarchy() + _ = synchronizeHostFrameToReference() ensureDividerOverlayOnTop() return true @@ -634,13 +766,32 @@ final class WindowTerminalPortal: NSObject { return false } - private static func rectApproximatelyEqual(_ lhs: NSRect, _ rhs: NSRect, epsilon: CGFloat = 0.5) -> Bool { + private static func rectApproximatelyEqual(_ lhs: NSRect, _ rhs: NSRect, epsilon: CGFloat = 0.01) -> Bool { abs(lhs.origin.x - rhs.origin.x) <= epsilon && abs(lhs.origin.y - rhs.origin.y) <= epsilon && abs(lhs.size.width - rhs.size.width) <= epsilon && abs(lhs.size.height - rhs.size.height) <= epsilon } + private static func pixelSnappedRect(_ rect: NSRect, in view: NSView) -> NSRect { + guard rect.origin.x.isFinite, + rect.origin.y.isFinite, + rect.size.width.isFinite, + rect.size.height.isFinite else { + return rect + } + let scale = max(1.0, view.window?.backingScaleFactor ?? NSScreen.main?.backingScaleFactor ?? 1.0) + func snap(_ value: CGFloat) -> CGFloat { + (value * scale).rounded(.toNearestOrAwayFromZero) / scale + } + return NSRect( + x: snap(rect.origin.x), + y: snap(rect.origin.y), + width: max(0, snap(rect.size.width)), + height: max(0, snap(rect.size.height)) + ) + } + private static func isView(_ view: NSView, above reference: NSView, in container: NSView) -> Bool { guard let viewIndex = container.subviews.firstIndex(of: view), let referenceIndex = container.subviews.firstIndex(of: reference) else { @@ -649,6 +800,58 @@ final class WindowTerminalPortal: NSObject { return viewIndex > referenceIndex } + /// Convert an anchor view's bounds to window coordinates while honoring ancestor clipping. + /// SwiftUI/AppKit hosting layers can report an anchor bounds wider than its split pane when + /// intrinsic-size content overflows; intersecting through ancestor bounds gives the effective + /// visible rect that should drive portal geometry. + private func effectiveAnchorFrameInWindow(for anchorView: NSView) -> NSRect { + var frameInWindow = anchorView.convert(anchorView.bounds, to: nil) + var current = anchorView.superview + while let ancestor = current { + let ancestorBoundsInWindow = ancestor.convert(ancestor.bounds, to: nil) + let finiteAncestorBounds = + ancestorBoundsInWindow.origin.x.isFinite && + ancestorBoundsInWindow.origin.y.isFinite && + ancestorBoundsInWindow.size.width.isFinite && + ancestorBoundsInWindow.size.height.isFinite + if finiteAncestorBounds { + frameInWindow = frameInWindow.intersection(ancestorBoundsInWindow) + if frameInWindow.isNull { return .zero } + } + if ancestor === installedReferenceView { break } + current = ancestor.superview + } + return frameInWindow + } + + private func seededFrameInHost(for anchorView: NSView) -> NSRect? { + _ = synchronizeHostFrameToReference() + let frameInWindow = effectiveAnchorFrameInWindow(for: anchorView) + let frameInHostRaw = hostView.convert(frameInWindow, from: nil) + let frameInHost = Self.pixelSnappedRect(frameInHostRaw, in: hostView) + let hasFiniteFrame = + frameInHost.origin.x.isFinite && + frameInHost.origin.y.isFinite && + frameInHost.size.width.isFinite && + frameInHost.size.height.isFinite + guard hasFiniteFrame else { return nil } + + let hostBounds = hostView.bounds + let hasFiniteHostBounds = + hostBounds.origin.x.isFinite && + hostBounds.origin.y.isFinite && + hostBounds.size.width.isFinite && + hostBounds.size.height.isFinite + if hasFiniteHostBounds { + let clampedFrame = frameInHost.intersection(hostBounds) + if !clampedFrame.isNull, clampedFrame.width > 1, clampedFrame.height > 1 { + return clampedFrame + } + } + + return frameInHost + } + func detachHostedView(withId hostedId: ObjectIdentifier) { guard let entry = entriesByHostedId.removeValue(forKey: hostedId) else { return } if let anchor = entry.anchorView { @@ -740,6 +943,32 @@ final class WindowTerminalPortal: NSObject { } #endif + _ = synchronizeHostFrameToReference() + + // Seed frame/bounds before entering the window so a freshly reparented + // surface doesn't do a transient 800x600 size update on viewDidMoveToWindow. + if let seededFrame = seededFrameInHost(for: anchorView), + seededFrame.width > 0, + seededFrame.height > 0 { + CATransaction.begin() + CATransaction.setDisableActions(true) + hostedView.frame = seededFrame + hostedView.bounds = NSRect(origin: .zero, size: seededFrame.size) + CATransaction.commit() + } else { + // If anchor geometry is still unsettled, keep this hidden/zero-sized until + // synchronizeHostedView resolves a valid target frame on the next layout tick. + CATransaction.begin() + CATransaction.setDisableActions(true) + hostedView.frame = .zero + hostedView.bounds = .zero + CATransaction.commit() + hostedView.isHidden = true + } + // Keep inner scroll/surface geometry in sync with the seeded outer frame + // before the hosted view enters a window. + hostedView.reconcileGeometryNow() + if hostedView.superview !== hostView { #if DEBUG dlog( @@ -765,10 +994,13 @@ final class WindowTerminalPortal: NSObject { ensureDividerOverlayOnTop() synchronizeHostedView(withId: hostedId) + scheduleDeferredFullSynchronizeAll() pruneDeadEntries() } func synchronizeHostedViewForAnchor(_ anchorView: NSView) { + guard ensureInstalled() else { return } + synchronizeLayoutHierarchy() pruneDeadEntries() let anchorId = ObjectIdentifier(anchorView) let primaryHostedId = hostedByAnchorId[anchorId] @@ -795,6 +1027,7 @@ final class WindowTerminalPortal: NSObject { private func synchronizeAllHostedViews(excluding hostedIdToSkip: ObjectIdentifier?) { guard ensureInstalled() else { return } + synchronizeLayoutHierarchy() pruneDeadEntries() let hostedIds = Array(entriesByHostedId.keys) for hostedId in hostedIds { @@ -837,16 +1070,44 @@ final class WindowTerminalPortal: NSObject { return } - let frameInWindow = anchorView.convert(anchorView.bounds, to: nil) - let frameInHost = hostView.convert(frameInWindow, from: nil) + _ = synchronizeHostFrameToReference() + let frameInWindow = effectiveAnchorFrameInWindow(for: anchorView) + let frameInHostRaw = hostView.convert(frameInWindow, from: nil) + let frameInHost = Self.pixelSnappedRect(frameInHostRaw, in: hostView) + let hostBounds = hostView.bounds + let hasFiniteHostBounds = + hostBounds.origin.x.isFinite && + hostBounds.origin.y.isFinite && + hostBounds.size.width.isFinite && + hostBounds.size.height.isFinite + let hostBoundsReady = hasFiniteHostBounds && hostBounds.width > 1 && hostBounds.height > 1 + if !hostBoundsReady { +#if DEBUG + dlog( + "portal.sync.defer hosted=\(portalDebugToken(hostedView)) " + + "reason=hostBoundsNotReady host=\(portalDebugFrame(hostBounds)) " + + "anchor=\(portalDebugFrame(frameInHost)) visibleInUI=\(entry.visibleInUI ? 1 : 0)" + ) +#endif + hostedView.isHidden = true + scheduleDeferredFullSynchronizeAll() + return + } + let hasFiniteFrame = frameInHost.origin.x.isFinite && frameInHost.origin.y.isFinite && frameInHost.size.width.isFinite && frameInHost.size.height.isFinite + let clampedFrame = frameInHost.intersection(hostBounds) + let hasVisibleIntersection = + !clampedFrame.isNull && + clampedFrame.width > 1 && + clampedFrame.height > 1 + let targetFrame = (hasFiniteFrame && hasVisibleIntersection) ? clampedFrame : frameInHost let anchorHidden = Self.isHiddenOrAncestorHidden(anchorView) - let tinyFrame = frameInHost.width <= 1 || frameInHost.height <= 1 - let outsideHostBounds = !frameInHost.intersects(hostView.bounds) + let tinyFrame = targetFrame.width <= 1 || targetFrame.height <= 1 + let outsideHostBounds = !hasVisibleIntersection let shouldHide = !entry.visibleInUI || anchorHidden || @@ -856,29 +1117,45 @@ final class WindowTerminalPortal: NSObject { let oldFrame = hostedView.frame #if DEBUG + let frameWasClamped = hasFiniteFrame && !Self.rectApproximatelyEqual(frameInHost, targetFrame) + if frameWasClamped { + dlog( + "portal.frame.clamp hosted=\(portalDebugToken(hostedView)) " + + "anchor=\(portalDebugToken(anchorView)) " + + "raw=\(portalDebugFrame(frameInHost)) clamped=\(portalDebugFrame(targetFrame)) " + + "host=\(portalDebugFrame(hostBounds))" + ) + } let collapsedToTiny = oldFrame.width > 1 && oldFrame.height > 1 && tinyFrame let restoredFromTiny = (oldFrame.width <= 1 || oldFrame.height <= 1) && !tinyFrame if collapsedToTiny { dlog( "portal.frame.collapse hosted=\(portalDebugToken(hostedView)) anchor=\(portalDebugToken(anchorView)) " + - "old=\(portalDebugFrame(oldFrame)) new=\(portalDebugFrame(frameInHost))" + "old=\(portalDebugFrame(oldFrame)) new=\(portalDebugFrame(targetFrame))" ) } else if restoredFromTiny { dlog( "portal.frame.restore hosted=\(portalDebugToken(hostedView)) anchor=\(portalDebugToken(anchorView)) " + - "old=\(portalDebugFrame(oldFrame)) new=\(portalDebugFrame(frameInHost))" + "old=\(portalDebugFrame(oldFrame)) new=\(portalDebugFrame(targetFrame))" ) } #endif - if !Self.rectApproximatelyEqual(oldFrame, frameInHost) { + if hasFiniteFrame && !Self.rectApproximatelyEqual(oldFrame, targetFrame) { CATransaction.begin() CATransaction.setDisableActions(true) - hostedView.frame = frameInHost + hostedView.frame = targetFrame CATransaction.commit() + hostedView.reconcileGeometryNow() + hostedView.refreshSurfaceNow() + } - if abs(oldFrame.size.width - frameInHost.size.width) > 0.5 || - abs(oldFrame.size.height - frameInHost.size.height) > 0.5 { - hostedView.reconcileGeometryNow() + if hasFiniteFrame { + let expectedBounds = NSRect(origin: .zero, size: targetFrame.size) + if !Self.rectApproximatelyEqual(hostedView.bounds, expectedBounds) { + CATransaction.begin() + CATransaction.setDisableActions(true) + hostedView.bounds = expectedBounds + CATransaction.commit() } } @@ -888,12 +1165,25 @@ final class WindowTerminalPortal: NSObject { "portal.hidden hosted=\(portalDebugToken(hostedView)) value=\(shouldHide ? 1 : 0) " + "visibleInUI=\(entry.visibleInUI ? 1 : 0) anchorHidden=\(anchorHidden ? 1 : 0) " + "tiny=\(tinyFrame ? 1 : 0) finite=\(hasFiniteFrame ? 1 : 0) " + - "outside=\(outsideHostBounds ? 1 : 0) frame=\(portalDebugFrame(frameInHost))" + "outside=\(outsideHostBounds ? 1 : 0) frame=\(portalDebugFrame(targetFrame)) " + + "host=\(portalDebugFrame(hostBounds))" ) #endif hostedView.isHidden = shouldHide } +#if DEBUG + dlog( + "portal.sync.result hosted=\(portalDebugToken(hostedView)) " + + "anchor=\(portalDebugToken(anchorView)) host=\(portalDebugToken(hostView)) " + + "hostWin=\(hostView.window?.windowNumber ?? -1) " + + "old=\(portalDebugFrame(oldFrame)) raw=\(portalDebugFrame(frameInHost)) " + + "target=\(portalDebugFrame(targetFrame)) hide=\(shouldHide ? 1 : 0) " + + "entryVisible=\(entry.visibleInUI ? 1 : 0) hostedHidden=\(hostedView.isHidden ? 1 : 0) " + + "hostBounds=\(portalDebugFrame(hostBounds))" + ) +#endif + ensureDividerOverlayOnTop() } @@ -927,6 +1217,7 @@ final class WindowTerminalPortal: NSObject { } func tearDown() { + removeGeometryObservers() for hostedId in Array(entriesByHostedId.keys) { detachHostedView(withId: hostedId) } diff --git a/tests/test_terminal_resize_portal_regressions.py b/tests/test_terminal_resize_portal_regressions.py new file mode 100644 index 00000000..055b5e54 --- /dev/null +++ b/tests/test_terminal_resize_portal_regressions.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +"""Static regression checks for terminal tiny-pane resize/overflow fixes. + +Guards the key invariants for issue #348: +1) Terminal portal sync must stabilize layout and clamp hosted frames to host bounds. +2) Surface sizing must prefer live bounds over stale pending values when available. +""" + +from __future__ import annotations + +import subprocess +from pathlib import Path + + +def repo_root() -> Path: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return Path(result.stdout.strip()) + return Path(__file__).resolve().parents[1] + + +def extract_block(source: str, signature: str) -> str: + start = source.find(signature) + if start < 0: + raise ValueError(f"Missing signature: {signature}") + brace_start = source.find("{", start) + if brace_start < 0: + raise ValueError(f"Missing opening brace for: {signature}") + + depth = 0 + for idx in range(brace_start, len(source)): + char = source[idx] + if char == "{": + depth += 1 + elif char == "}": + depth -= 1 + if depth == 0: + return source[brace_start : idx + 1] + raise ValueError(f"Unbalanced braces for: {signature}") + + +def main() -> int: + root = repo_root() + failures: list[str] = [] + + portal_path = root / "Sources" / "TerminalWindowPortal.swift" + portal_source = portal_path.read_text(encoding="utf-8") + + if "hostView.layer?.masksToBounds = true" not in portal_source: + failures.append("WindowTerminalPortal init no longer enables hostView layer clipping") + if "hostView.postsFrameChangedNotifications = true" not in portal_source: + failures.append("WindowTerminalPortal init no longer enables hostView frame-change notifications") + if "hostView.postsBoundsChangedNotifications = true" not in portal_source: + failures.append("WindowTerminalPortal init no longer enables hostView bounds-change notifications") + + if "private func synchronizeLayoutHierarchy()" not in portal_source: + failures.append("WindowTerminalPortal missing synchronizeLayoutHierarchy()") + if "private func synchronizeHostFrameToReference() -> Bool" not in portal_source: + failures.append("WindowTerminalPortal missing synchronizeHostFrameToReference()") + if "hostedView.reconcileGeometryNow()" not in extract_block( + portal_source, + "func bind(hostedView: GhosttySurfaceScrollView, to anchorView: NSView, visibleInUI: Bool, zPriority: Int = 0)", + ): + failures.append("bind() no longer pre-reconciles hosted geometry before attach") + + sync_block = extract_block(portal_source, "private func synchronizeHostedView(withId hostedId: ObjectIdentifier)") + for required in [ + "let hostBounds = hostView.bounds", + "let clampedFrame = frameInHost.intersection(hostBounds)", + "let targetFrame = (hasFiniteFrame && hasVisibleIntersection) ? clampedFrame : frameInHost", + "scheduleDeferredFullSynchronizeAll()", + "hostedView.reconcileGeometryNow()", + "hostedView.refreshSurfaceNow()", + ]: + if required not in sync_block: + failures.append(f"terminal portal sync missing: {required}") + + terminal_view_path = root / "Sources" / "GhosttyTerminalView.swift" + terminal_view_source = terminal_view_path.read_text(encoding="utf-8") + + resolved_block = extract_block(terminal_view_source, "private func resolvedSurfaceSize(preferred size: CGSize?) -> CGSize") + bounds_index = resolved_block.find("let currentBounds = bounds.size") + pending_index = resolved_block.find("if let pending = pendingSurfaceSize") + if bounds_index < 0 or pending_index < 0 or bounds_index > pending_index: + failures.append("resolvedSurfaceSize() no longer prefers bounds before pendingSurfaceSize") + + update_block = extract_block(terminal_view_source, "private func updateSurfaceSize(size: CGSize? = nil)") + if "let size = resolvedSurfaceSize(preferred: size)" not in update_block: + failures.append("updateSurfaceSize() no longer resolves size via resolvedSurfaceSize()") + + if failures: + print("FAIL: terminal resize/portal regression guards failed") + for item in failures: + print(f" - {item}") + return 1 + + print("PASS: terminal resize/portal regression guards are in place") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/vendor/bonsplit b/vendor/bonsplit index c9186860..2d0d05aa 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit c91868601ef27e673ca884639a724f2d10fcd54d +Subproject commit 2d0d05aad8e1c2c1c56c290718063f9b53408849 From f3fc8804684a81b10d48da4a4f01dac6f5838c85 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 14:58:17 -0800 Subject: [PATCH 126/214] Guard self-hosted CI from fork pull requests --- .github/workflows/ci.yml | 11 +++++++++++ tests/test_ci_self_hosted_guard.sh | 29 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100755 tests/test_ci_self_hosted_guard.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e7bb8bc..cd3dc3a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,15 @@ on: pull_request: jobs: + workflow-guard-tests: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Validate self-hosted runner guards + run: ./tests/test_ci_self_hosted_guard.sh + web-typecheck: runs-on: ubuntu-latest defaults: @@ -26,6 +35,8 @@ jobs: run: bun tsc --noEmit ui-tests: + # Never run self-hosted jobs for fork pull requests. + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository runs-on: self-hosted concurrency: group: self-hosted-build diff --git a/tests/test_ci_self_hosted_guard.sh b/tests/test_ci_self_hosted_guard.sh new file mode 100755 index 00000000..f046141c --- /dev/null +++ b/tests/test_ci_self_hosted_guard.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Regression test for https://github.com/manaflow-ai/cmux/issues/385. +# Ensures self-hosted UI tests are never run for fork pull requests. +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +WORKFLOW_FILE="$ROOT_DIR/.github/workflows/ci.yml" + +EXPECTED_IF="if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository" + +if ! grep -Fq "$EXPECTED_IF" "$WORKFLOW_FILE"; then + echo "FAIL: Missing fork pull_request guard for ui-tests in $WORKFLOW_FILE" + echo "Expected line:" + echo " $EXPECTED_IF" + exit 1 +fi + +if ! awk ' + /^ ui-tests:/ { in_ui_tests=1; next } + in_ui_tests && /^ [^[:space:]]/ { in_ui_tests=0 } + in_ui_tests && /runs-on: self-hosted/ { saw_self_hosted=1 } + in_ui_tests && /github.event.pull_request.head.repo.full_name == github.repository/ { saw_guard=1 } + END { exit !(saw_self_hosted && saw_guard) } +' "$WORKFLOW_FILE"; then + echo "FAIL: ui-tests block must keep both self-hosted and fork guard" + exit 1 +fi + +echo "PASS: ui-tests self-hosted fork guard is present" From c5d20ae0320f9a981e835691b7a16ac7b19f0c53 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:02:48 -0800 Subject: [PATCH 127/214] Add Cmd+P open-directory shortcuts for installed apps (#368) * Add smart Cmd+P directory-open app shortcuts * Fix command palette scroll snap and jank * Fix command palette selection-follow scrolling * Use scrollPosition for command palette list scrolling * Remove generic IDE directory command from Cmd+P * Increase command palette max height to 450px --- Sources/AppDelegate.swift | 182 +++++++++ Sources/ContentView.swift | 359 ++++++++---------- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 166 ++++---- 3 files changed, 410 insertions(+), 297 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 11fca42f..ccf70a6a 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -36,6 +36,188 @@ enum FinderServicePathResolver { } } +enum TerminalDirectoryOpenTarget: String, CaseIterable { + case vscode + case cursor + case windsurf + case antigravity + case finder + case terminal + case iterm2 + case ghostty + case warp + case xcode + case androidStudio + case zed + + struct DetectionEnvironment { + let homeDirectoryPath: String + let fileExistsAtPath: (String) -> Bool + + static let live = DetectionEnvironment( + homeDirectoryPath: FileManager.default.homeDirectoryForCurrentUser.path, + fileExistsAtPath: { FileManager.default.fileExists(atPath: $0) } + ) + } + + static var commandPaletteShortcutTargets: [Self] { + Array(allCases) + } + + static func availableTargets(in environment: DetectionEnvironment = .live) -> Set<Self> { + Set(commandPaletteShortcutTargets.filter { $0.isAvailable(in: environment) }) + } + + static let cachedLiveAvailableTargets: Set<Self> = availableTargets(in: .live) + + var commandPaletteCommandId: String { + "palette.terminalOpenDirectory.\(rawValue)" + } + + var commandPaletteTitle: String { + switch self { + case .vscode: + return "Open Current Directory in VS Code" + case .cursor: + return "Open Current Directory in Cursor" + case .windsurf: + return "Open Current Directory in Windsurf" + case .antigravity: + return "Open Current Directory in Antigravity" + case .finder: + return "Open Current Directory in Finder" + case .terminal: + return "Open Current Directory in Terminal" + case .iterm2: + return "Open Current Directory in iTerm2" + case .ghostty: + return "Open Current Directory in Ghostty" + case .warp: + return "Open Current Directory in Warp" + case .xcode: + return "Open Current Directory in Xcode" + case .androidStudio: + return "Open Current Directory in Android Studio" + case .zed: + return "Open Current Directory in Zed" + } + } + + var commandPaletteKeywords: [String] { + let common = ["terminal", "directory", "open", "ide"] + switch self { + case .vscode: + return common + ["vs", "code", "visual", "studio"] + case .cursor: + return common + ["cursor"] + case .windsurf: + return common + ["windsurf"] + case .antigravity: + return common + ["antigravity"] + case .finder: + return common + ["finder", "file", "manager", "reveal"] + case .terminal: + return common + ["terminal", "shell"] + case .iterm2: + return common + ["iterm", "iterm2", "terminal", "shell"] + case .ghostty: + return common + ["ghostty", "terminal", "shell"] + case .warp: + return common + ["warp", "terminal", "shell"] + case .xcode: + return common + ["xcode", "apple"] + case .androidStudio: + return common + ["android", "studio"] + case .zed: + return common + ["zed"] + } + } + + func isAvailable(in environment: DetectionEnvironment = .live) -> Bool { + applicationPath(in: environment) != nil + } + + func applicationURL(in environment: DetectionEnvironment = .live) -> URL? { + guard let path = applicationPath(in: environment) else { return nil } + return URL(fileURLWithPath: path, isDirectory: true) + } + + private func applicationPath(in environment: DetectionEnvironment) -> String? { + for path in expandedCandidatePaths(in: environment) where environment.fileExistsAtPath(path) { + return path + } + return nil + } + + private func expandedCandidatePaths(in environment: DetectionEnvironment) -> [String] { + let globalPrefix = "/Applications/" + let userPrefix = "\(environment.homeDirectoryPath)/Applications/" + var expanded: [String] = [] + + for candidate in applicationBundlePathCandidates { + expanded.append(candidate) + if candidate.hasPrefix(globalPrefix) { + let suffix = String(candidate.dropFirst(globalPrefix.count)) + expanded.append(userPrefix + suffix) + } + } + + return uniquePreservingOrder(expanded) + } + + private var applicationBundlePathCandidates: [String] { + switch self { + case .vscode: + return [ + "/Applications/Visual Studio Code.app", + "/Applications/Code.app", + ] + case .cursor: + return [ + "/Applications/Cursor.app", + "/Applications/Cursor Preview.app", + "/Applications/Cursor Nightly.app", + ] + case .windsurf: + return ["/Applications/Windsurf.app"] + case .antigravity: + return ["/Applications/Antigravity.app"] + case .finder: + return ["/System/Library/CoreServices/Finder.app"] + case .terminal: + return ["/System/Applications/Utilities/Terminal.app"] + case .iterm2: + return [ + "/Applications/iTerm.app", + "/Applications/iTerm2.app", + ] + case .ghostty: + return ["/Applications/Ghostty.app"] + case .warp: + return ["/Applications/Warp.app"] + case .xcode: + return ["/Applications/Xcode.app"] + case .androidStudio: + return ["/Applications/Android Studio.app"] + case .zed: + return [ + "/Applications/Zed.app", + "/Applications/Zed Preview.app", + "/Applications/Zed Nightly.app", + ] + } + } + + private func uniquePreservingOrder(_ paths: [String]) -> [String] { + var seen: Set<String> = [] + var deduped: [String] = [] + for path in paths where seen.insert(path).inserted { + deduped.append(path) + } + return deduped + } +} + enum WorkspaceShortcutMapper { /// Maps Cmd+digit workspace shortcuts to a zero-based workspace index. /// Cmd+1...Cmd+8 target fixed indices; Cmd+9 always targets the last workspace. diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 2325908c..51c4c694 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -977,14 +977,6 @@ private func commandPaletteWindowOverlayController(for window: NSWindow) -> Wind return controller } -private struct CommandPaletteRowFramePreferenceKey: PreferenceKey { - static var defaultValue: [Int: CGRect] = [:] - - static func reduce(value: inout [Int: CGRect], nextValue: () -> [Int: CGRect]) { - value.merge(nextValue(), uniquingKeysWith: { _, rhs in rhs }) - } -} - enum WorkspaceMountPolicy { // Keep only the selected workspace mounted to minimize layer-tree traversal. static let maxMountedWorkspaces = 1 @@ -1120,8 +1112,8 @@ struct ContentView: View { @State private var commandPaletteRenameDraft: String = "" @State private var commandPaletteSelectedResultIndex: Int = 0 @State private var commandPaletteHoveredResultIndex: Int? - @State private var commandPaletteLastSelectionIndex: Int = 0 - @State private var commandPaletteRowFrames: [Int: CGRect] = [:] + @State private var commandPaletteScrollTargetIndex: Int? + @State private var commandPaletteScrollTargetAnchor: UnitPoint? @State private var commandPaletteRestoreFocusTarget: CommandPaletteRestoreFocusTarget? @State private var commandPaletteUsageHistoryByCommandId: [String: CommandPaletteUsageEntry] = [:] @AppStorage(CommandPaletteRenameSelectionSettings.selectAllOnFocusKey) @@ -1197,11 +1189,6 @@ struct ContentView: View { case kind } - enum CommandPaletteScrollAnchor: Equatable { - case top - case bottom - } - private struct CommandPaletteTrailingLabel { let text: String let style: CommandPaletteTrailingLabelStyle @@ -1277,6 +1264,10 @@ struct ContentView: View { static let panelHasUnread = "panel.hasUnread" static let updateHasAvailable = "update.hasAvailable" + + static func terminalOpenTargetAvailable(_ target: TerminalDirectoryOpenTarget) -> String { + "terminal.openTarget.\(target.rawValue).available" + } } private struct CommandPaletteCommandContribution { @@ -2444,7 +2435,7 @@ struct ContentView: View { private var commandPaletteCommandListView: some View { let visibleResults = Array(commandPaletteResults) let selectedIndex = commandPaletteSelectedIndex(resultCount: visibleResults.count) - let commandPaletteListMaxHeight: CGFloat = 216 + let commandPaletteListMaxHeight: CGFloat = 450 let commandPaletteRowHeight: CGFloat = 24 let commandPaletteEmptyStateHeight: CGFloat = 44 let commandPaletteListContentHeight = visibleResults.isEmpty @@ -2488,133 +2479,85 @@ struct ContentView: View { Divider() - ScrollViewReader { proxy in - ScrollView { - LazyVStack(spacing: 0) { - if visibleResults.isEmpty { - Text(commandPaletteEmptyStateText) - .font(.system(size: 13, weight: .regular)) - .foregroundStyle(.secondary) - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.horizontal, 12) - .padding(.vertical, 12) - } else { - ForEach(Array(visibleResults.enumerated()), id: \.element.id) { index, result in - let isSelected = index == selectedIndex - let isHovered = commandPaletteHoveredResultIndex == index - let rowBackground: Color = isSelected - ? Color.accentColor.opacity(0.12) - : (isHovered ? Color.primary.opacity(0.08) : .clear) + ScrollView { + LazyVStack(spacing: 0) { + if visibleResults.isEmpty { + Text(commandPaletteEmptyStateText) + .font(.system(size: 13, weight: .regular)) + .foregroundStyle(.secondary) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 12) + .padding(.vertical, 12) + } else { + ForEach(Array(visibleResults.enumerated()), id: \.element.id) { index, result in + let isSelected = index == selectedIndex + let isHovered = commandPaletteHoveredResultIndex == index + let rowBackground: Color = isSelected + ? Color.accentColor.opacity(0.12) + : (isHovered ? Color.primary.opacity(0.08) : .clear) - Button { - runCommandPaletteCommand(result.command) - } label: { - HStack(spacing: 8) { - commandPaletteHighlightedTitleText( - result.command.title, - matchedIndices: result.titleMatchIndices - ) - .font(.system(size: 13, weight: .regular)) - .lineLimit(1) - Spacer() - - if let trailingLabel = commandPaletteTrailingLabel(for: result.command) { - switch trailingLabel.style { - case .shortcut: - Text(trailingLabel.text) - .font(.system(size: 11, weight: .medium)) - .foregroundStyle(.secondary) - .padding(.horizontal, 4) - .padding(.vertical, 1) - .background(Color.primary.opacity(0.08), in: RoundedRectangle(cornerRadius: 4, style: .continuous)) - case .kind: - Text(trailingLabel.text) - .font(.system(size: 11, weight: .regular)) - .foregroundStyle(.secondary) - .lineLimit(1) - } - } - } - .padding(.horizontal, 9) - .padding(.vertical, 2) - .frame(maxWidth: .infinity, alignment: .leading) - .background(rowBackground) - .background( - GeometryReader { geometry in - Color.clear.preference( - key: CommandPaletteRowFramePreferenceKey.self, - value: [index: geometry.frame(in: .named("commandPaletteListScroll"))] - ) - } + Button { + runCommandPaletteCommand(result.command) + } label: { + HStack(spacing: 8) { + commandPaletteHighlightedTitleText( + result.command.title, + matchedIndices: result.titleMatchIndices ) - .contentShape(Rectangle()) - } - .buttonStyle(.plain) - .id(index) - .onHover { hovering in - if hovering { - commandPaletteHoveredResultIndex = index - } else if commandPaletteHoveredResultIndex == index { - commandPaletteHoveredResultIndex = nil + .font(.system(size: 13, weight: .regular)) + .lineLimit(1) + Spacer() + + if let trailingLabel = commandPaletteTrailingLabel(for: result.command) { + switch trailingLabel.style { + case .shortcut: + Text(trailingLabel.text) + .font(.system(size: 11, weight: .medium)) + .foregroundStyle(.secondary) + .padding(.horizontal, 4) + .padding(.vertical, 1) + .background(Color.primary.opacity(0.08), in: RoundedRectangle(cornerRadius: 4, style: .continuous)) + case .kind: + Text(trailingLabel.text) + .font(.system(size: 11, weight: .regular)) + .foregroundStyle(.secondary) + .lineLimit(1) + } } } + .padding(.horizontal, 9) + .padding(.vertical, 2) + .frame(maxWidth: .infinity, alignment: .leading) + .background(rowBackground) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .id(index) + .onHover { hovering in + if hovering { + commandPaletteHoveredResultIndex = index + } else if commandPaletteHoveredResultIndex == index { + commandPaletteHoveredResultIndex = nil + } } } } - // Force a fresh row tree per query so rendered labels/actions stay in lockstep. - .id(commandPaletteQuery) - } - .coordinateSpace(name: "commandPaletteListScroll") - .frame(height: commandPaletteListHeight) - .onChange(of: commandPaletteSelectedResultIndex) { _ in - guard !visibleResults.isEmpty else { return } - let index = commandPaletteSelectedIndex(resultCount: visibleResults.count) - let previousIndex = commandPaletteLastSelectionIndex - defer { commandPaletteLastSelectionIndex = index } - - guard let anchorDecision = Self.commandPaletteScrollAnchor( - selectedIndex: index, - previousIndex: previousIndex, - resultCount: visibleResults.count, - selectedFrame: commandPaletteRowFrames[index], - viewportHeight: commandPaletteListHeight, - contentHeight: commandPaletteListContentHeight - ) else { return } - - let anchor: UnitPoint - switch anchorDecision { - case .top: - anchor = .top - case .bottom: - anchor = .bottom - } - DispatchQueue.main.async { - withAnimation(.easeOut(duration: 0.1)) { - proxy.scrollTo(index, anchor: anchor) - } - } - } - .onChange(of: visibleResults.count) { _ in - commandPaletteLastSelectionIndex = commandPaletteSelectedIndex(resultCount: visibleResults.count) - } - .onPreferenceChange(CommandPaletteRowFramePreferenceKey.self) { frames in - commandPaletteRowFrames = frames - guard !visibleResults.isEmpty else { return } - let index = commandPaletteSelectedIndex(resultCount: visibleResults.count) - guard let anchorDecision = Self.commandPaletteEdgeVisibilityCorrectionAnchor( - selectedIndex: index, - resultCount: visibleResults.count, - selectedFrame: frames[index], - viewportHeight: commandPaletteListHeight, - contentHeight: commandPaletteListContentHeight - ) else { return } - let anchor: UnitPoint = anchorDecision == .top ? .top : .bottom - DispatchQueue.main.async { - withAnimation(.easeOut(duration: 0.08)) { - proxy.scrollTo(index, anchor: anchor) - } - } } + .scrollTargetLayout() + // Force a fresh row tree per query so rendered labels/actions stay in lockstep. + .id(commandPaletteQuery) + } + .frame(height: commandPaletteListHeight) + .scrollPosition( + id: Binding( + get: { commandPaletteScrollTargetIndex }, + // Ignore passive readback so manual scrolling doesn't mutate selection-follow state. + set: { _ in } + ), + anchor: commandPaletteScrollTargetAnchor + ) + .onChange(of: commandPaletteSelectedResultIndex) { _ in + updateCommandPaletteScrollTarget(resultCount: visibleResults.count, animated: true) } // Keep Esc-to-close behavior without showing footer controls. @@ -2629,20 +2572,19 @@ struct ContentView: View { } .onAppear { commandPaletteHoveredResultIndex = nil - commandPaletteLastSelectionIndex = commandPaletteSelectedResultIndex - commandPaletteRowFrames = [:] + updateCommandPaletteScrollTarget(resultCount: visibleResults.count, animated: false) resetCommandPaletteSearchFocus() } .onChange(of: commandPaletteQuery) { _ in commandPaletteSelectedResultIndex = 0 commandPaletteHoveredResultIndex = nil - commandPaletteLastSelectionIndex = 0 - commandPaletteRowFrames = [:] + commandPaletteScrollTargetIndex = nil + commandPaletteScrollTargetAnchor = nil syncCommandPaletteDebugStateForObservedWindow() } .onChange(of: visibleResults.count) { _ in commandPaletteSelectedResultIndex = commandPaletteSelectedIndex(resultCount: visibleResults.count) - commandPaletteLastSelectionIndex = commandPaletteSelectedResultIndex + updateCommandPaletteScrollTarget(resultCount: visibleResults.count, animated: false) if let hoveredIndex = commandPaletteHoveredResultIndex, hoveredIndex >= visibleResults.count { commandPaletteHoveredResultIndex = nil } @@ -3245,18 +3187,29 @@ struct ContentView: View { if let panelContext = focusedPanelContext { let workspace = panelContext.workspace let panelId = panelContext.panelId + let panelIsTerminal = panelContext.panel.panelType == .terminal snapshot.setBool(CommandPaletteContextKeys.hasFocusedPanel, true) snapshot.setString( CommandPaletteContextKeys.panelName, panelDisplayName(workspace: workspace, panelId: panelId, fallback: panelContext.panel.displayTitle) ) snapshot.setBool(CommandPaletteContextKeys.panelIsBrowser, panelContext.panel.panelType == .browser) - snapshot.setBool(CommandPaletteContextKeys.panelIsTerminal, panelContext.panel.panelType == .terminal) + snapshot.setBool(CommandPaletteContextKeys.panelIsTerminal, panelIsTerminal) snapshot.setBool(CommandPaletteContextKeys.panelHasCustomName, workspace.panelCustomTitles[panelId] != nil) snapshot.setBool(CommandPaletteContextKeys.panelShouldPin, !workspace.isPanelPinned(panelId)) let hasUnread = workspace.manualUnreadPanelIds.contains(panelId) || notificationStore.hasUnreadNotification(forTabId: workspace.id, surfaceId: panelId) snapshot.setBool(CommandPaletteContextKeys.panelHasUnread, hasUnread) + + if panelIsTerminal { + let availableTargets = TerminalDirectoryOpenTarget.cachedLiveAvailableTargets + for target in TerminalDirectoryOpenTarget.commandPaletteShortcutTargets { + snapshot.setBool( + CommandPaletteContextKeys.terminalOpenTargetAvailable(target), + availableTargets.contains(target) + ) + } + } } if case .updateAvailable = updateViewModel.effectiveState { @@ -3667,15 +3620,20 @@ struct ContentView: View { ) ) - contributions.append( - CommandPaletteCommandContribution( - commandId: "palette.terminalOpenDirectory", - title: constant("Open Current Directory in IDE"), - subtitle: terminalPanelSubtitle, - keywords: ["terminal", "directory", "open", "ide", "code", "default app"], - when: { $0.bool(CommandPaletteContextKeys.panelIsTerminal) } + for target in TerminalDirectoryOpenTarget.commandPaletteShortcutTargets { + contributions.append( + CommandPaletteCommandContribution( + commandId: target.commandPaletteCommandId, + title: constant(target.commandPaletteTitle), + subtitle: terminalPanelSubtitle, + keywords: target.commandPaletteKeywords, + when: { context in + context.bool(CommandPaletteContextKeys.panelIsTerminal) + && context.bool(CommandPaletteContextKeys.terminalOpenTargetAvailable(target)) + } + ) ) - ) + } contributions.append( CommandPaletteCommandContribution( commandId: "palette.terminalFind", @@ -3938,9 +3896,11 @@ struct ContentView: View { _ = tabManager.createBrowserSplit(direction: .right, url: url) } - registry.register(commandId: "palette.terminalOpenDirectory") { - if !openFocusedDirectoryInDefaultApp() { - NSSound.beep() + for target in TerminalDirectoryOpenTarget.commandPaletteShortcutTargets { + registry.register(commandId: target.commandPaletteCommandId) { + if !openFocusedDirectory(in: target) { + NSSound.beep() + } } } registry.register(commandId: "palette.terminalFind") { @@ -4004,61 +3964,43 @@ struct ContentView: View { return min(max(commandPaletteSelectedResultIndex, 0), resultCount - 1) } - static func commandPaletteScrollAnchor( + static func commandPaletteScrollPositionAnchor( selectedIndex: Int, - previousIndex: Int, - resultCount: Int, - selectedFrame: CGRect?, - viewportHeight: CGFloat, - contentHeight: CGFloat, - epsilon: CGFloat = 0.5 - ) -> CommandPaletteScrollAnchor? { + resultCount: Int + ) -> UnitPoint? { guard resultCount > 0 else { return nil } - guard contentHeight > viewportHeight else { return nil } - - // Always pin edges exactly into view when selection reaches first/last. if selectedIndex <= 0 { - return .top + return UnitPoint.top } if selectedIndex >= resultCount - 1 { - return .bottom + return UnitPoint.bottom } - - if let frame = selectedFrame, - frame.minY >= (0 - epsilon), - frame.maxY <= (viewportHeight + epsilon) { - return nil - } - - return selectedIndex >= previousIndex ? .bottom : .top + return nil } - static func commandPaletteEdgeVisibilityCorrectionAnchor( - selectedIndex: Int, - resultCount: Int, - selectedFrame: CGRect?, - viewportHeight: CGFloat, - contentHeight: CGFloat, - epsilon: CGFloat = 0.5 - ) -> CommandPaletteScrollAnchor? { - guard resultCount > 0 else { return nil } - guard contentHeight > viewportHeight else { return nil } - - let isTop = selectedIndex <= 0 - let isBottom = selectedIndex >= (resultCount - 1) - guard isTop || isBottom else { return nil } - - guard let frame = selectedFrame else { - return isTop ? .top : .bottom + private func updateCommandPaletteScrollTarget(resultCount: Int, animated: Bool) { + guard resultCount > 0 else { + commandPaletteScrollTargetIndex = nil + commandPaletteScrollTargetAnchor = nil + return } - if isTop { - let topDelta = abs(frame.minY) - return topDelta > epsilon ? .top : nil - } + let selectedIndex = commandPaletteSelectedIndex(resultCount: resultCount) + commandPaletteScrollTargetAnchor = Self.commandPaletteScrollPositionAnchor( + selectedIndex: selectedIndex, + resultCount: resultCount + ) - let bottomDelta = abs(frame.maxY - viewportHeight) - return bottomDelta > epsilon ? .bottom : nil + let assignTarget = { + commandPaletteScrollTargetIndex = selectedIndex + } + if animated { + withAnimation(.easeOut(duration: 0.1)) { + assignTarget() + } + } else { + assignTarget() + } } private func moveCommandPaletteSelection(by delta: Int) { @@ -4252,8 +4194,8 @@ struct ContentView: View { commandPaletteRenameDraft = "" commandPaletteSelectedResultIndex = 0 commandPaletteHoveredResultIndex = nil - commandPaletteLastSelectionIndex = 0 - commandPaletteRowFrames = [:] + commandPaletteScrollTargetIndex = nil + commandPaletteScrollTargetAnchor = nil resetCommandPaletteSearchFocus() syncCommandPaletteDebugStateForObservedWindow() } @@ -4266,8 +4208,8 @@ struct ContentView: View { commandPaletteRenameDraft = "" commandPaletteSelectedResultIndex = 0 commandPaletteHoveredResultIndex = nil - commandPaletteLastSelectionIndex = 0 - commandPaletteRowFrames = [:] + commandPaletteScrollTargetIndex = nil + commandPaletteScrollTargetAnchor = nil isCommandPaletteSearchFocused = false isCommandPaletteRenameFocused = false commandPaletteRestoreFocusTarget = nil @@ -4494,9 +4436,22 @@ struct ContentView: View { return NSWorkspace.shared.open(url) } - private func openFocusedDirectoryInDefaultApp() -> Bool { + private func openFocusedDirectory(in target: TerminalDirectoryOpenTarget) -> Bool { guard let directoryURL = focusedTerminalDirectoryURL() else { return false } - return NSWorkspace.shared.open(directoryURL) + return openFocusedDirectory(directoryURL, in: target) + } + + private func openFocusedDirectory(_ directoryURL: URL, in target: TerminalDirectoryOpenTarget) -> Bool { + switch target { + case .finder: + NSWorkspace.shared.selectFile(nil, inFileViewerRootedAtPath: directoryURL.path) + return true + default: + guard let applicationURL = target.applicationURL() else { return false } + let configuration = NSWorkspace.OpenConfiguration() + NSWorkspace.shared.open([directoryURL], withApplicationAt: applicationURL, configuration: configuration) + return true + } } private func focusedTerminalDirectoryURL() -> URL? { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index c12d2c08..ba914a50 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1491,115 +1491,34 @@ final class CommandPaletteRenameSelectionSettingsTests: XCTestCase { } final class CommandPaletteSelectionScrollBehaviorTests: XCTestCase { - func testFirstEntryAlwaysPinsToTopWhenScrollable() { - let anchor = ContentView.commandPaletteScrollAnchor( + func testFirstEntryPinsToTopAnchor() { + let anchor = ContentView.commandPaletteScrollPositionAnchor( selectedIndex: 0, - previousIndex: 1, - resultCount: 20, - selectedFrame: CGRect(x: 0, y: 8, width: 200, height: 24), - viewportHeight: 216, - contentHeight: 480 + resultCount: 20 ) - XCTAssertEqual(anchor, .top) + XCTAssertEqual(anchor, UnitPoint.top) } - func testLastEntryAlwaysPinsToBottomWhenScrollable() { - let anchor = ContentView.commandPaletteScrollAnchor( + func testLastEntryPinsToBottomAnchor() { + let anchor = ContentView.commandPaletteScrollPositionAnchor( selectedIndex: 19, - previousIndex: 18, - resultCount: 20, - selectedFrame: CGRect(x: 0, y: 188, width: 200, height: 24), - viewportHeight: 216, - contentHeight: 480 + resultCount: 20 ) - XCTAssertEqual(anchor, .bottom) + XCTAssertEqual(anchor, UnitPoint.bottom) } - func testFullyVisibleMiddleEntryDoesNotScroll() { - let anchor = ContentView.commandPaletteScrollAnchor( + func testMiddleEntryUsesNilAnchorForMinimalScroll() { + let anchor = ContentView.commandPaletteScrollPositionAnchor( selectedIndex: 6, - previousIndex: 5, - resultCount: 20, - selectedFrame: CGRect(x: 0, y: 120, width: 200, height: 24), - viewportHeight: 216, - contentHeight: 480 + resultCount: 20 ) XCTAssertNil(anchor) } - func testOutOfViewMiddleEntryUsesDirectionForAnchor() { - let downAnchor = ContentView.commandPaletteScrollAnchor( - selectedIndex: 9, - previousIndex: 8, - resultCount: 20, - selectedFrame: CGRect(x: 0, y: 210, width: 200, height: 24), - viewportHeight: 216, - contentHeight: 480 - ) - XCTAssertEqual(downAnchor, .bottom) - - let upAnchor = ContentView.commandPaletteScrollAnchor( - selectedIndex: 8, - previousIndex: 9, - resultCount: 20, - selectedFrame: CGRect(x: 0, y: -6, width: 200, height: 24), - viewportHeight: 216, - contentHeight: 480 - ) - XCTAssertEqual(upAnchor, .top) - } -} - -final class CommandPaletteEdgeVisibilityCorrectionTests: XCTestCase { - func testTopEdgeReturnsTopWhenNotPinned() { - let anchor = ContentView.commandPaletteEdgeVisibilityCorrectionAnchor( + func testEmptyResultsProduceNoAnchor() { + let anchor = ContentView.commandPaletteScrollPositionAnchor( selectedIndex: 0, - resultCount: 20, - selectedFrame: CGRect(x: 0, y: 6, width: 200, height: 24), - viewportHeight: 216, - contentHeight: 480 - ) - XCTAssertEqual(anchor, .top) - } - - func testBottomEdgeReturnsBottomWhenNotPinned() { - let anchor = ContentView.commandPaletteEdgeVisibilityCorrectionAnchor( - selectedIndex: 19, - resultCount: 20, - selectedFrame: CGRect(x: 0, y: 170, width: 200, height: 24), - viewportHeight: 216, - contentHeight: 480 - ) - XCTAssertEqual(anchor, .bottom) - } - - func testPinnedTopAndBottomReturnNil() { - let topAnchor = ContentView.commandPaletteEdgeVisibilityCorrectionAnchor( - selectedIndex: 0, - resultCount: 20, - selectedFrame: CGRect(x: 0, y: 0, width: 200, height: 24), - viewportHeight: 216, - contentHeight: 480 - ) - XCTAssertNil(topAnchor) - - let bottomAnchor = ContentView.commandPaletteEdgeVisibilityCorrectionAnchor( - selectedIndex: 19, - resultCount: 20, - selectedFrame: CGRect(x: 0, y: 192, width: 200, height: 24), - viewportHeight: 216, - contentHeight: 480 - ) - XCTAssertNil(bottomAnchor) - } - - func testMiddleSelectionNeverForcesCorrection() { - let anchor = ContentView.commandPaletteEdgeVisibilityCorrectionAnchor( - selectedIndex: 8, - resultCount: 20, - selectedFrame: CGRect(x: 0, y: 96, width: 200, height: 24), - viewportHeight: 216, - contentHeight: 480 + resultCount: 0 ) XCTAssertNil(anchor) } @@ -3292,6 +3211,63 @@ final class FinderServicePathResolverTests: XCTestCase { } } +final class TerminalDirectoryOpenTargetAvailabilityTests: XCTestCase { + private func environment( + existingPaths: Set<String>, + homeDirectoryPath: String = "/Users/tester" + ) -> TerminalDirectoryOpenTarget.DetectionEnvironment { + TerminalDirectoryOpenTarget.DetectionEnvironment( + homeDirectoryPath: homeDirectoryPath, + fileExistsAtPath: { existingPaths.contains($0) } + ) + } + + func testAvailableTargetsDetectSystemApplications() { + let env = environment( + existingPaths: [ + "/Applications/Visual Studio Code.app", + "/System/Library/CoreServices/Finder.app", + "/System/Applications/Utilities/Terminal.app", + "/Applications/Zed Preview.app", + ] + ) + + let availableTargets = TerminalDirectoryOpenTarget.availableTargets(in: env) + XCTAssertTrue(availableTargets.contains(.vscode)) + XCTAssertTrue(availableTargets.contains(.finder)) + XCTAssertTrue(availableTargets.contains(.terminal)) + XCTAssertTrue(availableTargets.contains(.zed)) + XCTAssertFalse(availableTargets.contains(.cursor)) + } + + func testAvailableTargetsFallbackToUserApplications() { + let env = environment( + existingPaths: [ + "/Users/tester/Applications/Cursor.app", + "/Users/tester/Applications/Warp.app", + "/Users/tester/Applications/Android Studio.app", + ] + ) + + let availableTargets = TerminalDirectoryOpenTarget.availableTargets(in: env) + XCTAssertTrue(availableTargets.contains(.cursor)) + XCTAssertTrue(availableTargets.contains(.warp)) + XCTAssertTrue(availableTargets.contains(.androidStudio)) + XCTAssertFalse(availableTargets.contains(.vscode)) + } + + func testITerm2DetectsLegacyBundleName() { + let env = environment(existingPaths: ["/Applications/iTerm.app"]) + XCTAssertTrue(TerminalDirectoryOpenTarget.iterm2.isAvailable(in: env)) + } + + func testCommandPaletteShortcutsExcludeGenericIDEEntry() { + let targets = TerminalDirectoryOpenTarget.commandPaletteShortcutTargets + XCTAssertFalse(targets.contains(where: { $0.commandPaletteTitle == "Open Current Directory in IDE" })) + XCTAssertFalse(targets.contains(where: { $0.commandPaletteCommandId == "palette.terminalOpenDirectory" })) + } +} + final class BrowserSearchEngineTests: XCTestCase { func testGoogleSearchURL() throws { let url = try XCTUnwrap(BrowserSearchEngine.google.searchURL(query: "hello world")) From e9d9c6faf509c759082c3691ce2f958a9ebf878c Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:25:16 -0800 Subject: [PATCH 128/214] Preserve startup window geometry when session snapshot is missing --- Sources/AppDelegate.swift | 155 +++++++++++++++++++----- cmuxTests/SessionPersistenceTests.swift | 68 +++++++++++ 2 files changed, 191 insertions(+), 32 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 49220f6c..9c8ad174 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -349,6 +349,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent let visibleFrame: CGRect } + private struct PersistedWindowGeometry: Codable, Sendable { + let frame: SessionRectSnapshot + let display: SessionDisplaySnapshot? + } + + private static let persistedWindowGeometryDefaultsKey = "cmux.session.lastWindowGeometry.v1" + weak var tabManager: TabManager? weak var notificationStore: TerminalNotificationStore? weak var sidebarState: SidebarState? @@ -734,29 +741,94 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent startupSessionSnapshot = SessionPersistenceStore.load() } + private func persistedWindowGeometry( + defaults: UserDefaults = .standard + ) -> PersistedWindowGeometry? { + guard let data = defaults.data(forKey: Self.persistedWindowGeometryDefaultsKey) else { + return nil + } + return try? JSONDecoder().decode(PersistedWindowGeometry.self, from: data) + } + + private func persistWindowGeometry( + frame: SessionRectSnapshot?, + display: SessionDisplaySnapshot?, + defaults: UserDefaults = .standard + ) { + guard let frame else { return } + let payload = PersistedWindowGeometry(frame: frame, display: display) + guard let data = try? JSONEncoder().encode(payload) else { return } + defaults.set(data, forKey: Self.persistedWindowGeometryDefaultsKey) + } + + private func persistWindowGeometry(from window: NSWindow?) { + guard let window else { return } + persistWindowGeometry( + frame: SessionRectSnapshot(window.frame), + display: displaySnapshot(for: window) + ) + } + + private func currentDisplayGeometries() -> ( + available: [SessionDisplayGeometry], + fallback: SessionDisplayGeometry? + ) { + let available = NSScreen.screens.map { screen in + SessionDisplayGeometry( + displayID: screen.cmuxDisplayID, + frame: screen.frame, + visibleFrame: screen.visibleFrame + ) + } + let fallback = (NSScreen.main ?? NSScreen.screens.first).map { screen in + SessionDisplayGeometry( + displayID: screen.cmuxDisplayID, + frame: screen.frame, + visibleFrame: screen.visibleFrame + ) + } + return (available, fallback) + } + private func attemptStartupSessionRestoreIfNeeded(primaryWindow: NSWindow) { guard !didAttemptStartupSessionRestore else { return } didAttemptStartupSessionRestore = true guard !didHandleExplicitOpenIntentAtStartup else { return } - guard let startupSessionSnapshot else { return } guard let primaryContext = contextForMainTerminalWindow(primaryWindow) else { return } - guard let primaryWindowSnapshot = startupSessionSnapshot.windows.first else { return } - applySessionWindowSnapshot( - primaryWindowSnapshot, - to: primaryContext, - window: primaryWindow - ) + let startupSnapshot = startupSessionSnapshot + let primaryWindowSnapshot = startupSnapshot?.windows.first + if let primaryWindowSnapshot { + applySessionWindowSnapshot( + primaryWindowSnapshot, + to: primaryContext, + window: primaryWindow + ) + } else { + let displays = currentDisplayGeometries() + let fallbackGeometry = persistedWindowGeometry() + if let restoredFrame = Self.resolvedStartupPrimaryWindowFrame( + primarySnapshot: nil, + fallbackFrame: fallbackGeometry?.frame, + fallbackDisplaySnapshot: fallbackGeometry?.display, + availableDisplays: displays.available, + fallbackDisplay: displays.fallback + ) { + primaryWindow.setFrame(restoredFrame, display: true) + } + } - let additionalWindows = startupSessionSnapshot - .windows - .dropFirst() - .prefix(max(0, SessionPersistencePolicy.maxWindowsPerSnapshot - 1)) - if !additionalWindows.isEmpty { - DispatchQueue.main.async { [weak self] in - guard let self else { return } - for windowSnapshot in additionalWindows { - _ = self.createMainWindow(sessionWindowSnapshot: windowSnapshot) + if let startupSnapshot { + let additionalWindows = startupSnapshot + .windows + .dropFirst() + .prefix(max(0, SessionPersistencePolicy.maxWindowsPerSnapshot - 1)) + if !additionalWindows.isEmpty { + DispatchQueue.main.async { [weak self] in + guard let self else { return } + for windowSnapshot in additionalWindows { + _ = self.createMainWindow(sessionWindowSnapshot: windowSnapshot) + } } } } @@ -782,25 +854,35 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } private func resolvedWindowFrame(from snapshot: SessionWindowSnapshot?) -> NSRect? { - let displays = NSScreen.screens.map { screen in - SessionDisplayGeometry( - displayID: screen.cmuxDisplayID, - frame: screen.frame, - visibleFrame: screen.visibleFrame - ) - } - let fallbackDisplay = (NSScreen.main ?? NSScreen.screens.first).map { screen in - SessionDisplayGeometry( - displayID: screen.cmuxDisplayID, - frame: screen.frame, - visibleFrame: screen.visibleFrame - ) - } - + let displays = currentDisplayGeometries() return Self.resolvedWindowFrame( from: snapshot?.frame, display: snapshot?.display, - availableDisplays: displays, + availableDisplays: displays.available, + fallbackDisplay: displays.fallback + ) + } + + nonisolated static func resolvedStartupPrimaryWindowFrame( + primarySnapshot: SessionWindowSnapshot?, + fallbackFrame: SessionRectSnapshot?, + fallbackDisplaySnapshot: SessionDisplaySnapshot?, + availableDisplays: [SessionDisplayGeometry], + fallbackDisplay: SessionDisplayGeometry? + ) -> CGRect? { + if let primary = resolvedWindowFrame( + from: primarySnapshot?.frame, + display: primarySnapshot?.display, + availableDisplays: availableDisplays, + fallbackDisplay: fallbackDisplay + ) { + return primary + } + + return resolvedWindowFrame( + from: fallbackFrame, + display: fallbackDisplaySnapshot, + availableDisplays: availableDisplays, fallbackDisplay: fallbackDisplay ) } @@ -1107,6 +1189,12 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } return false } + if let primaryWindow = snapshot.windows.first { + persistWindowGeometry( + frame: primaryWindow.frame, + display: primaryWindow.display + ) + } return SessionPersistenceStore.save(snapshot) } @@ -4301,6 +4389,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } private func unregisterMainWindow(_ window: NSWindow) { + // Keep geometry available as a fallback even if the full session snapshot + // is removed when the last window closes. + persistWindowGeometry(from: window) guard let removed = unregisterMainWindowContext(for: window) else { return } commandPaletteVisibilityByWindowId.removeValue(forKey: removed.windowId) commandPaletteSelectionByWindowId.removeValue(forKey: removed.windowId) diff --git a/cmuxTests/SessionPersistenceTests.swift b/cmuxTests/SessionPersistenceTests.swift index 266d13dc..1fb01fa0 100644 --- a/cmuxTests/SessionPersistenceTests.swift +++ b/cmuxTests/SessionPersistenceTests.swift @@ -312,6 +312,74 @@ final class SessionPersistenceTests: XCTestCase { XCTAssertEqual(restored.height, 350, accuracy: 0.001) } + func testResolvedStartupPrimaryWindowFrameFallsBackToPersistedGeometryWhenPrimaryMissing() { + let fallbackFrame = SessionRectSnapshot(x: 180, y: 140, width: 900, height: 640) + let fallbackDisplay = SessionDisplaySnapshot( + displayID: 1, + frame: SessionRectSnapshot(x: 0, y: 0, width: 1_600, height: 1_000), + visibleFrame: SessionRectSnapshot(x: 0, y: 0, width: 1_600, height: 1_000) + ) + let display = AppDelegate.SessionDisplayGeometry( + displayID: 1, + frame: CGRect(x: 0, y: 0, width: 1_600, height: 1_000), + visibleFrame: CGRect(x: 0, y: 0, width: 1_600, height: 1_000) + ) + + let restored = AppDelegate.resolvedStartupPrimaryWindowFrame( + primarySnapshot: nil, + fallbackFrame: fallbackFrame, + fallbackDisplaySnapshot: fallbackDisplay, + availableDisplays: [display], + fallbackDisplay: display + ) + + XCTAssertNotNil(restored) + guard let restored else { return } + XCTAssertEqual(restored.minX, 180, accuracy: 0.001) + XCTAssertEqual(restored.minY, 140, accuracy: 0.001) + XCTAssertEqual(restored.width, 900, accuracy: 0.001) + XCTAssertEqual(restored.height, 640, accuracy: 0.001) + } + + func testResolvedStartupPrimaryWindowFramePrefersPrimarySnapshotOverFallback() { + let primarySnapshot = SessionWindowSnapshot( + frame: SessionRectSnapshot(x: 220, y: 160, width: 980, height: 700), + display: SessionDisplaySnapshot( + displayID: 1, + frame: SessionRectSnapshot(x: 0, y: 0, width: 1_600, height: 1_000), + visibleFrame: SessionRectSnapshot(x: 0, y: 0, width: 1_600, height: 1_000) + ), + tabManager: SessionTabManagerSnapshot(selectedWorkspaceIndex: nil, workspaces: []), + sidebar: SessionSidebarSnapshot(isVisible: true, selection: .tabs, width: 220) + ) + let fallbackFrame = SessionRectSnapshot(x: 40, y: 30, width: 700, height: 500) + let fallbackDisplay = SessionDisplaySnapshot( + displayID: 1, + frame: SessionRectSnapshot(x: 0, y: 0, width: 1_600, height: 1_000), + visibleFrame: SessionRectSnapshot(x: 0, y: 0, width: 1_600, height: 1_000) + ) + let display = AppDelegate.SessionDisplayGeometry( + displayID: 1, + frame: CGRect(x: 0, y: 0, width: 1_600, height: 1_000), + visibleFrame: CGRect(x: 0, y: 0, width: 1_600, height: 1_000) + ) + + let restored = AppDelegate.resolvedStartupPrimaryWindowFrame( + primarySnapshot: primarySnapshot, + fallbackFrame: fallbackFrame, + fallbackDisplaySnapshot: fallbackDisplay, + availableDisplays: [display], + fallbackDisplay: display + ) + + XCTAssertNotNil(restored) + guard let restored else { return } + XCTAssertEqual(restored.minX, 220, accuracy: 0.001) + XCTAssertEqual(restored.minY, 160, accuracy: 0.001) + XCTAssertEqual(restored.width, 980, accuracy: 0.001) + XCTAssertEqual(restored.height, 700, accuracy: 0.001) + } + func testResolvedWindowFrameCentersInFallbackDisplayWhenOffscreen() { let savedFrame = SessionRectSnapshot(x: 4_000, y: 4_000, width: 900, height: 700) let display = AppDelegate.SessionDisplayGeometry( From 310d807767f7e21f450a4ca70a0e31628efc740a Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:28:23 -0800 Subject: [PATCH 129/214] Add VM split-churn fuzz tests and harden portal reveal gating --- Sources/TerminalWindowPortal.swift | 32 +- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 52 ++ .../test_split_cmd_d_ctrl_d_geometry_fuzz.py | 211 ++++++++ ...split_cmd_d_ctrl_d_two_pane_frame_guard.py | 487 ++++++++++++++++++ 4 files changed, 777 insertions(+), 5 deletions(-) create mode 100644 tests_v2/test_split_cmd_d_ctrl_d_geometry_fuzz.py create mode 100644 tests_v2/test_split_cmd_d_ctrl_d_two_pane_frame_guard.py diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index a2f0c8c8..4c0dc9c3 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -535,6 +535,10 @@ private final class SplitDividerOverlayView: NSView { @MainActor final class WindowTerminalPortal: NSObject { + private static let tinyHideThreshold: CGFloat = 1 + private static let minimumRevealWidth: CGFloat = 24 + private static let minimumRevealHeight: CGFloat = 18 + private weak var window: NSWindow? private let hostView = WindowTerminalHostView(frame: .zero) private let dividerOverlayView = SplitDividerOverlayView(frame: .zero) @@ -886,7 +890,12 @@ final class WindowTerminalPortal: NSObject { frameInHost.size.width.isFinite && frameInHost.size.height.isFinite let anchorHidden = Self.isHiddenOrAncestorHidden(anchorView) - let tinyFrame = frameInHost.width <= 1 || frameInHost.height <= 1 + let tinyFrame = + frameInHost.width <= Self.tinyHideThreshold || + frameInHost.height <= Self.tinyHideThreshold + let revealReadyForDisplay = + frameInHost.width >= Self.minimumRevealWidth && + frameInHost.height >= Self.minimumRevealHeight let outsideHostBounds = !frameInHost.intersects(hostView.bounds) let shouldHide = !entry.visibleInUI || @@ -894,6 +903,7 @@ final class WindowTerminalPortal: NSObject { tinyFrame || !hasFiniteFrame || outsideHostBounds + let shouldDeferReveal = !shouldHide && hostedView.isHidden && !revealReadyForDisplay let oldFrame = hostedView.frame #if DEBUG @@ -920,7 +930,7 @@ final class WindowTerminalPortal: NSObject { dlog( "portal.hidden hosted=\(portalDebugToken(hostedView)) value=1 " + "visibleInUI=\(entry.visibleInUI ? 1 : 0) anchorHidden=\(anchorHidden ? 1 : 0) " + - "tiny=\(tinyFrame ? 1 : 0) finite=\(hasFiniteFrame ? 1 : 0) " + + "tiny=\(tinyFrame ? 1 : 0) revealReady=\(revealReadyForDisplay ? 1 : 0) finite=\(hasFiniteFrame ? 1 : 0) " + "outside=\(outsideHostBounds ? 1 : 0) frame=\(portalDebugFrame(frameInHost))" ) #endif @@ -935,17 +945,29 @@ final class WindowTerminalPortal: NSObject { if abs(oldFrame.size.width - frameInHost.size.width) > 0.5 || abs(oldFrame.size.height - frameInHost.size.height) > 0.5, - !shouldHide { + !shouldHide, + (!hostedView.isHidden || revealReadyForDisplay) { hostedView.reconcileGeometryNow() } } - if !shouldHide, hostedView.isHidden { + if shouldDeferReveal { +#if DEBUG + if !Self.rectApproximatelyEqual(oldFrame, frameInHost) { + dlog( + "portal.hidden.deferReveal hosted=\(portalDebugToken(hostedView)) " + + "frame=\(portalDebugFrame(frameInHost)) min=\(Int(Self.minimumRevealWidth))x\(Int(Self.minimumRevealHeight))" + ) + } +#endif + } + + if !shouldHide, hostedView.isHidden, revealReadyForDisplay { #if DEBUG dlog( "portal.hidden hosted=\(portalDebugToken(hostedView)) value=0 " + "visibleInUI=\(entry.visibleInUI ? 1 : 0) anchorHidden=\(anchorHidden ? 1 : 0) " + - "tiny=\(tinyFrame ? 1 : 0) finite=\(hasFiniteFrame ? 1 : 0) " + + "tiny=\(tinyFrame ? 1 : 0) revealReady=\(revealReadyForDisplay ? 1 : 0) finite=\(hasFiniteFrame ? 1 : 0) " + "outside=\(outsideHostBounds ? 1 : 0) frame=\(portalDebugFrame(frameInHost))" ) #endif diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 8341c5f1..92e0fcd0 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -4364,6 +4364,14 @@ final class GhosttySurfaceOverlayTests: XCTestCase { @MainActor final class TerminalWindowPortalLifecycleTests: XCTestCase { + private func realizeWindowLayout(_ window: NSWindow) { + window.makeKeyAndOrderFront(nil) + window.displayIfNeeded() + window.contentView?.layoutSubtreeIfNeeded() + RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + window.contentView?.layoutSubtreeIfNeeded() + } + func testPortalHostInstallsAboveContentViewForVisibility() { let window = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 320, height: 240), @@ -4553,6 +4561,50 @@ final class TerminalWindowPortalLifecycleTests: XCTestCase { "Promoting z-priority should bring an already-visible terminal to front" ) } + + func testHiddenPortalDefersRevealUntilFrameHasUsableSize() { + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 700, height: 420), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + defer { window.orderOut(nil) } + + let portal = WindowTerminalPortal(window: window) + realizeWindowLayout(window) + guard let contentView = window.contentView else { + XCTFail("Expected content view") + return + } + + let anchor = NSView(frame: NSRect(x: 40, y: 40, width: 280, height: 220)) + contentView.addSubview(anchor) + + let hosted = GhosttySurfaceScrollView( + surfaceView: GhosttyNSView(frame: NSRect(x: 0, y: 0, width: 120, height: 80)) + ) + portal.bind(hostedView: hosted, to: anchor, visibleInUI: true) + XCTAssertFalse(hosted.isHidden, "Healthy geometry should be visible") + + // Collapse to a tiny frame first. + anchor.frame = NSRect(x: 160.5, y: 1037.0, width: 79.0, height: 0.0) + portal.synchronizeHostedViewForAnchor(anchor) + XCTAssertTrue(hosted.isHidden, "Tiny geometry should hide the portal-hosted terminal") + + // Then restore to a non-zero but still too-small frame. It should remain hidden. + anchor.frame = NSRect(x: 160.9, y: 1026.5, width: 93.6, height: 10.3) + portal.synchronizeHostedViewForAnchor(anchor) + XCTAssertTrue( + hosted.isHidden, + "Portal should defer reveal until geometry reaches a usable size" + ) + + // Once the frame is large enough again, reveal should resume. + anchor.frame = NSRect(x: 40, y: 40, width: 180, height: 40) + portal.synchronizeHostedViewForAnchor(anchor) + XCTAssertFalse(hosted.isHidden, "Portal should unhide after geometry is usable") + } } @MainActor diff --git a/tests_v2/test_split_cmd_d_ctrl_d_geometry_fuzz.py b/tests_v2/test_split_cmd_d_ctrl_d_geometry_fuzz.py new file mode 100644 index 00000000..bc0cf9f3 --- /dev/null +++ b/tests_v2/test_split_cmd_d_ctrl_d_geometry_fuzz.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python3 +""" +Fuzz regression: rapid Cmd+D / Ctrl+D churn must not shift the outer bonsplit container frame. + +This targets the user-reported visual shift/flash while spamming split + close. +We treat any drift in x/y/width/height of the outer container frame as a failure. +""" + +from collections import deque +import os +import random +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") +FUZZ_SEED = int(os.environ.get("CMUX_SPLIT_FUZZ_SEED", "424242")) +FUZZ_STEPS = int(os.environ.get("CMUX_SPLIT_FUZZ_STEPS", "1400")) +SAMPLES_PER_STEP = int(os.environ.get("CMUX_SPLIT_FUZZ_SAMPLES", "4")) +SAMPLE_INTERVAL_S = float(os.environ.get("CMUX_SPLIT_FUZZ_SAMPLE_INTERVAL_S", "0.0015")) +ACTION_JITTER_MAX_S = float(os.environ.get("CMUX_SPLIT_FUZZ_ACTION_JITTER_MAX_S", "0.0035")) +BURST_MAX = int(os.environ.get("CMUX_SPLIT_FUZZ_BURST_MAX", "3")) +MAX_PANES = int(os.environ.get("CMUX_SPLIT_FUZZ_MAX_PANES", "10")) +EPSILON = float(os.environ.get("CMUX_SPLIT_FUZZ_EPSILON", "0.0")) +TRACE_TAIL = int(os.environ.get("CMUX_SPLIT_FUZZ_TRACE_TAIL", "40")) +ASSERT_NO_UNDERFLOW = os.environ.get("CMUX_SPLIT_FUZZ_ASSERT_NO_UNDERFLOW", "0") == "1" +ASSERT_NO_EMPTY_PANEL = os.environ.get("CMUX_SPLIT_FUZZ_ASSERT_NO_EMPTY_PANEL", "0") == "1" + + +def _pane_count(layout_payload: dict) -> int: + layout = layout_payload.get("layout") or {} + panes = layout.get("panes") or [] + return len(panes) + + +def _largest_split_frame(layout_payload: dict) -> dict: + selected = layout_payload.get("selectedPanels") or [] + best = None + best_area = -1.0 + + for row in selected: + for split in row.get("splitViews") or []: + frame = split.get("frame") + if not frame: + continue + + try: + x = float(frame.get("x", 0.0)) + y = float(frame.get("y", 0.0)) + width = float(frame.get("width", 0.0)) + height = float(frame.get("height", 0.0)) + except (TypeError, ValueError): + continue + + if width <= 0.0 or height <= 0.0: + continue + + area = width * height + if area > best_area: + best_area = area + best = {"x": x, "y": y, "width": width, "height": height} + + if best is None: + raise cmuxError(f"layout_debug contains no usable split-view frame: {layout_payload}") + return best + + +def _container_frame(layout_payload: dict) -> dict: + container = (layout_payload.get("layout") or {}).get("containerFrame") + if container: + try: + return { + "x": float(container.get("x", 0.0)), + "y": float(container.get("y", 0.0)), + "width": float(container.get("width", 0.0)), + "height": float(container.get("height", 0.0)), + } + except (TypeError, ValueError): + pass + + # Back-compat fallback for older payloads that don't expose containerFrame. + return _largest_split_frame(layout_payload) + + +def _assert_same_frame( + current: dict, + baseline: dict, + *, + step: int, + sample: int, + action: str, + seed: int, + action_index: int, + trace: list[str], +) -> None: + deltas = { + key: abs(float(current[key]) - float(baseline[key])) + for key in ("x", "y", "width", "height") + } + shifted = {k: v for k, v in deltas.items() if v > EPSILON} + if shifted: + raise cmuxError( + "Outer split container shifted during fuzz churn " + f"(step={step}, sample={sample}, action={action}, action_index={action_index}, seed={seed}, " + f"baseline={baseline}, current={current}, deltas={deltas}, epsilon={EPSILON})" + f"; recent_actions={trace}" + ) + + +def _warm_start_split(c: cmux) -> dict: + # Ensure we have at least one split so the container frame exists in layout_debug. + c.simulate_shortcut("cmd+d") + deadline = time.time() + 2.0 + last = None + while time.time() < deadline: + payload = c.layout_debug() + last = payload + if _pane_count(payload) >= 2: + return payload + time.sleep(0.02) + raise cmuxError(f"Timed out waiting for first split to appear: {last}") + + +def main() -> int: + rng = random.Random(FUZZ_SEED) + recent_actions: deque[str] = deque(maxlen=max(8, TRACE_TAIL)) + total_actions = 0 + + with cmux(SOCKET_PATH) as c: + ws = c.new_workspace() + c.select_workspace(ws) + c.activate_app() + time.sleep(0.2) + + c.reset_bonsplit_underflow_count() + c.reset_empty_panel_count() + + initial = _warm_start_split(c) + baseline = _container_frame(initial) + if _pane_count(initial) < 2: + raise cmuxError("Expected at least 2 panes after warm start split") + + for step in range(1, FUZZ_STEPS + 1): + burst = rng.randint(1, max(1, BURST_MAX)) + + for burst_index in range(1, burst + 1): + before = c.layout_debug() + pane_count = _pane_count(before) + + if pane_count <= 2: + action = "cmd+d" + elif pane_count >= MAX_PANES: + action = "ctrl+d" + else: + # Bias toward split to keep churn dense while still frequently collapsing via ctrl+d. + action = "cmd+d" if rng.random() < 0.60 else "ctrl+d" + + if action == "cmd+d": + c.simulate_shortcut("cmd+d") + else: + # Ctrl+D equivalent sent directly to the focused terminal surface. + c.send_ctrl_d() + + total_actions += 1 + recent_actions.append( + f"step={step}/burst={burst_index}/{burst} panes_before={pane_count} action={action}" + ) + + # Random micro-jitter to emulate uneven key-repeat timing while keeping churn fast. + if ACTION_JITTER_MAX_S > 0: + time.sleep(rng.uniform(0.0, ACTION_JITTER_MAX_S)) + + # Sample repeatedly after each burst to catch transient shifts. + for sample in range(0, SAMPLES_PER_STEP + 1): + payload = c.layout_debug() + current = _container_frame(payload) + _assert_same_frame( + current, + baseline, + step=step, + sample=sample, + action="burst", + seed=FUZZ_SEED, + action_index=total_actions, + trace=list(recent_actions), + ) + if SAMPLE_INTERVAL_S > 0: + time.sleep(rng.uniform(0.0, SAMPLE_INTERVAL_S)) + + underflows = c.bonsplit_underflow_count() + if ASSERT_NO_UNDERFLOW and underflows != 0: + raise cmuxError(f"bonsplit arranged-subview underflow observed during fuzz run: {underflows}") + + flashes = c.empty_panel_count() + if ASSERT_NO_EMPTY_PANEL and flashes != 0: + raise cmuxError(f"EmptyPanelView appeared during fuzz run (count={flashes})") + + print( + "PASS: cmd+d/ctrl+d fuzz geometry invariant " + f"(seed={FUZZ_SEED}, steps={FUZZ_STEPS}, samples={SAMPLES_PER_STEP}, burst_max={BURST_MAX}, " + f"actions={total_actions}, epsilon={EPSILON}, underflows={underflows}, empty_panel={flashes})" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests_v2/test_split_cmd_d_ctrl_d_two_pane_frame_guard.py b/tests_v2/test_split_cmd_d_ctrl_d_two_pane_frame_guard.py new file mode 100644 index 00000000..b4413d83 --- /dev/null +++ b/tests_v2/test_split_cmd_d_ctrl_d_two_pane_frame_guard.py @@ -0,0 +1,487 @@ +#!/usr/bin/env python3 +""" +Focused fuzz regression for rapid Cmd+D / Ctrl+D churn in a strict 1<->2 pane loop. + +Intent: + - Keep topology limited to one pane or two left/right panes only. + - Run across multiple fresh workspaces. + - Sample layout as fast as the debug socket allows during transitions/holds. + - Fail immediately if outer container x/y/width/height drifts at any sampled frame. +""" + +from collections import deque +import os +import random +import sys +import time +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from cmux import cmux, cmuxError + + +SOCKET_PATH = os.environ.get("CMUX_SOCKET", "/tmp/cmux-debug.sock") +FUZZ_SEED = int(os.environ.get("CMUX_SPLIT_2PANE_SEED", "20260223")) +WORKSPACES = int(os.environ.get("CMUX_SPLIT_2PANE_WORKSPACES", "3")) +CYCLES_PER_WORKSPACE = int(os.environ.get("CMUX_SPLIT_2PANE_CYCLES", "220")) +TRANSITION_TIMEOUT_S = float(os.environ.get("CMUX_SPLIT_2PANE_TIMEOUT_S", "2.0")) +HOLD_MIN_S = float(os.environ.get("CMUX_SPLIT_2PANE_HOLD_MIN_S", "0.003")) +HOLD_MAX_S = float(os.environ.get("CMUX_SPLIT_2PANE_HOLD_MAX_S", "0.018")) +PRE_ACTION_JITTER_MAX_S = float(os.environ.get("CMUX_SPLIT_2PANE_ACTION_JITTER_MAX_S", "0.002")) +EPSILON = float(os.environ.get("CMUX_SPLIT_2PANE_EPSILON", "0.0")) +TRACE_TAIL = int(os.environ.get("CMUX_SPLIT_2PANE_TRACE_TAIL", "64")) +LAYOUT_POLL_SLEEP_S = float(os.environ.get("CMUX_SPLIT_2PANE_POLL_SLEEP_S", "0.0008")) +LAYOUT_TIMEOUT_RETRIES = int(os.environ.get("CMUX_SPLIT_2PANE_LAYOUT_TIMEOUT_RETRIES", "4")) +LAYOUT_TIMEOUT_RETRY_SLEEP_S = float(os.environ.get("CMUX_SPLIT_2PANE_LAYOUT_TIMEOUT_RETRY_SLEEP_S", "0.0015")) +MAX_LAYOUT_TIMEOUTS = int(os.environ.get("CMUX_SPLIT_2PANE_MAX_LAYOUT_TIMEOUTS", "80")) +CTRL_D_RETRY_INTERVAL_S = float(os.environ.get("CMUX_SPLIT_2PANE_CTRL_D_RETRY_INTERVAL_S", "0.18")) +CTRL_D_MAX_EXTRA = int(os.environ.get("CMUX_SPLIT_2PANE_CTRL_D_MAX_EXTRA", "6")) + + +def _pane_count(layout_payload: dict) -> int: + layout = layout_payload.get("layout") or {} + return len(layout.get("panes") or []) + + +def _largest_split_frame(layout_payload: dict) -> dict: + selected = layout_payload.get("selectedPanels") or [] + best = None + best_area = -1.0 + for row in selected: + for split in row.get("splitViews") or []: + frame = split.get("frame") + if not frame: + continue + try: + x = float(frame.get("x", 0.0)) + y = float(frame.get("y", 0.0)) + width = float(frame.get("width", 0.0)) + height = float(frame.get("height", 0.0)) + except (TypeError, ValueError): + continue + if width <= 0.0 or height <= 0.0: + continue + area = width * height + if area > best_area: + best_area = area + best = {"x": x, "y": y, "width": width, "height": height} + if best is None: + raise cmuxError(f"layout_debug contains no usable split-view frame: {layout_payload}") + return best + + +def _container_frame(layout_payload: dict) -> dict: + container = (layout_payload.get("layout") or {}).get("containerFrame") + if container: + try: + return { + "x": float(container.get("x", 0.0)), + "y": float(container.get("y", 0.0)), + "width": float(container.get("width", 0.0)), + "height": float(container.get("height", 0.0)), + } + except (TypeError, ValueError): + pass + return _largest_split_frame(layout_payload) + + +def _pane_frames_sorted_x(layout_payload: dict) -> list[dict]: + layout = layout_payload.get("layout") or {} + panes = layout.get("panes") or [] + frames: list[dict] = [] + for pane in panes: + frame = pane.get("frame") or {} + try: + frames.append( + { + "pane_id": str(pane.get("paneId") or ""), + "x": float(frame.get("x", 0.0)), + "y": float(frame.get("y", 0.0)), + "width": float(frame.get("width", 0.0)), + "height": float(frame.get("height", 0.0)), + } + ) + except (TypeError, ValueError): + continue + return sorted(frames, key=lambda p: (p["x"], p["y"])) + + +def _assert_same_frame( + *, + current: dict, + baseline: dict, + workspace_index: int, + cycle: int, + phase: str, + sample: int, + trace: list[str], +) -> None: + deltas = { + key: abs(float(current[key]) - float(baseline[key])) + for key in ("x", "y", "width", "height") + } + shifted = {k: v for k, v in deltas.items() if v > EPSILON} + if shifted: + raise cmuxError( + "Container frame shifted " + f"(workspace={workspace_index}, cycle={cycle}, phase={phase}, sample={sample}, " + f"baseline={baseline}, current={current}, deltas={deltas}, epsilon={EPSILON}); " + f"recent_actions={trace}" + ) + + +def _assert_two_panes_left_right(layout_payload: dict, *, workspace_index: int, cycle: int, trace: list[str]) -> None: + panes = _pane_frames_sorted_x(layout_payload) + if len(panes) != 2: + raise cmuxError( + f"Expected exactly 2 panes in two-pane phase, got {len(panes)} " + f"(workspace={workspace_index}, cycle={cycle}); panes={panes}; recent_actions={trace}" + ) + + left, right = panes[0], panes[1] + if left["width"] <= 0.0 or left["height"] <= 0.0 or right["width"] <= 0.0 or right["height"] <= 0.0: + raise cmuxError( + f"Collapsed pane in two-pane phase (workspace={workspace_index}, cycle={cycle}): " + f"left={left} right={right}; recent_actions={trace}" + ) + + if left["x"] >= right["x"]: + raise cmuxError( + f"Two-pane geometry is not left/right (workspace={workspace_index}, cycle={cycle}): " + f"left={left} right={right}; recent_actions={trace}" + ) + + +def _selected_panel_by_pane(layout_payload: dict) -> dict[str, str]: + out: dict[str, str] = {} + for row in layout_payload.get("selectedPanels") or []: + pane_id = str(row.get("paneId") or "") + panel_id = str(row.get("panelId") or "") + if pane_id and panel_id: + out[pane_id] = panel_id + return out + + +def _rightmost_pane_id(layout_payload: dict) -> str: + panes = _pane_frames_sorted_x(layout_payload) + if len(panes) < 2: + raise cmuxError(f"Expected at least 2 panes to resolve rightmost pane: {panes}") + pane_id = str(panes[-1].get("pane_id") or "") + if not pane_id: + raise cmuxError(f"Rightmost pane is missing pane_id: {panes[-1]}") + return pane_id + + +def _rightmost_panel_id(layout_payload: dict) -> str: + pane_id = _rightmost_pane_id(layout_payload) + selected = _selected_panel_by_pane(layout_payload) + panel_id = str(selected.get(pane_id) or "") + if not panel_id: + raise cmuxError(f"Missing selected panel for rightmost pane: pane_id={pane_id}, selected={selected}") + return panel_id + + +def _safe_layout_debug(c: cmux, *, timeout_state: dict[str, int], context: str) -> dict: + for attempt in range(0, max(0, LAYOUT_TIMEOUT_RETRIES) + 1): + try: + return c.layout_debug() + except cmuxError as exc: + if "timed out waiting for response" not in str(exc).lower(): + raise + + timeout_state["count"] = timeout_state.get("count", 0) + 1 + count = timeout_state["count"] + if count > max(0, MAX_LAYOUT_TIMEOUTS): + raise cmuxError( + f"Exceeded layout_debug timeout budget (count={count}, max={MAX_LAYOUT_TIMEOUTS}, context={context})" + ) from exc + + if attempt >= max(0, LAYOUT_TIMEOUT_RETRIES): + raise cmuxError( + f"layout_debug timed out after retries (attempts={attempt + 1}, count={count}, context={context})" + ) from exc + + if LAYOUT_TIMEOUT_RETRY_SLEEP_S > 0: + time.sleep(LAYOUT_TIMEOUT_RETRY_SLEEP_S) + + raise cmuxError(f"layout_debug retry loop exhausted unexpectedly (context={context})") + + +def _sample_while( + c: cmux, + *, + baseline: dict, + deadline: float, + workspace_index: int, + cycle: int, + phase: str, + trace: list[str], + timeout_state: dict[str, int], +) -> int: + sampled = 0 + while time.time() < deadline: + payload = _safe_layout_debug( + c, + timeout_state=timeout_state, + context=f"sample workspace={workspace_index} cycle={cycle} phase={phase} sample={sampled}", + ) + current = _container_frame(payload) + _assert_same_frame( + current=current, + baseline=baseline, + workspace_index=workspace_index, + cycle=cycle, + phase=phase, + sample=sampled, + trace=trace, + ) + + panes_now = _pane_count(payload) + if panes_now > 2: + raise cmuxError( + f"Observed >2 panes in strict two-pane fuzz " + f"(workspace={workspace_index}, cycle={cycle}, phase={phase}, panes={panes_now}); " + f"recent_actions={trace}" + ) + sampled += 1 + if LAYOUT_POLL_SLEEP_S > 0: + time.sleep(LAYOUT_POLL_SLEEP_S) + return sampled + + +def _wait_for_panes( + c: cmux, + *, + target_panes: int, + baseline: dict, + workspace_index: int, + cycle: int, + phase: str, + timeout_s: float, + trace: list[str], + timeout_state: dict[str, int], +) -> tuple[dict, int]: + deadline = time.time() + timeout_s + sampled = 0 + last = None + + while time.time() < deadline: + payload = _safe_layout_debug( + c, + timeout_state=timeout_state, + context=f"wait workspace={workspace_index} cycle={cycle} phase={phase} sample={sampled}", + ) + last = payload + current = _container_frame(payload) + _assert_same_frame( + current=current, + baseline=baseline, + workspace_index=workspace_index, + cycle=cycle, + phase=phase, + sample=sampled, + trace=trace, + ) + + panes_now = _pane_count(payload) + if panes_now > 2: + raise cmuxError( + f"Observed >2 panes in strict two-pane fuzz while waiting " + f"(workspace={workspace_index}, cycle={cycle}, phase={phase}, panes={panes_now}); " + f"recent_actions={trace}" + ) + if panes_now == target_panes: + return payload, sampled + 1 + sampled += 1 + if LAYOUT_POLL_SLEEP_S > 0: + time.sleep(LAYOUT_POLL_SLEEP_S) + + raise cmuxError( + f"Timed out waiting for {target_panes} panes " + f"(workspace={workspace_index}, cycle={cycle}, phase={phase}, sampled={sampled}, " + f"last_panes={_pane_count(last or {})}, timeout_s={timeout_s}); recent_actions={trace}" + ) + + +def _wait_for_single_pane_after_ctrl_d( + c: cmux, + *, + baseline: dict, + workspace_index: int, + cycle: int, + phase: str, + timeout_s: float, + recent_actions: deque[str], + timeout_state: dict[str, int], +) -> tuple[dict, int, int]: + deadline = time.time() + timeout_s + sampled = 0 + extra_ctrl_d = 0 + last = None + next_retry_at = time.time() + max(0.0, CTRL_D_RETRY_INTERVAL_S) + + while time.time() < deadline: + payload = _safe_layout_debug( + c, + timeout_state=timeout_state, + context=f"wait workspace={workspace_index} cycle={cycle} phase={phase} sample={sampled}", + ) + last = payload + current = _container_frame(payload) + trace = list(recent_actions) + _assert_same_frame( + current=current, + baseline=baseline, + workspace_index=workspace_index, + cycle=cycle, + phase=phase, + sample=sampled, + trace=trace, + ) + + panes_now = _pane_count(payload) + if panes_now > 2: + raise cmuxError( + f"Observed >2 panes in strict two-pane fuzz while waiting " + f"(workspace={workspace_index}, cycle={cycle}, phase={phase}, panes={panes_now}); " + f"recent_actions={trace}" + ) + if panes_now == 1: + return payload, sampled + 1, extra_ctrl_d + + now = time.time() + if panes_now == 2 and extra_ctrl_d < max(0, CTRL_D_MAX_EXTRA) and now >= next_retry_at: + retry_right_panel_id = _rightmost_panel_id(payload) + try: + c.send_key_surface(retry_right_panel_id, "ctrl-d") + except cmuxError as exc: + # Pane/surface can disappear between layout sample and send call under heavy churn. + # Skip this retry tick and re-sample. + if "not_found" in str(exc).lower(): + next_retry_at = now + max(0.0, CTRL_D_RETRY_INTERVAL_S) + sampled += 1 + if LAYOUT_POLL_SLEEP_S > 0: + time.sleep(LAYOUT_POLL_SLEEP_S) + continue + raise + extra_ctrl_d += 1 + recent_actions.append( + f"ws={workspace_index} cycle={cycle} action=ctrl+d(extra:{extra_ctrl_d}/{CTRL_D_MAX_EXTRA},surface={retry_right_panel_id})" + ) + next_retry_at = now + max(0.0, CTRL_D_RETRY_INTERVAL_S) + + sampled += 1 + if LAYOUT_POLL_SLEEP_S > 0: + time.sleep(LAYOUT_POLL_SLEEP_S) + + raise cmuxError( + f"Timed out waiting for 1 pane after ctrl+d " + f"(workspace={workspace_index}, cycle={cycle}, phase={phase}, sampled={sampled}, " + f"extra_ctrl_d={extra_ctrl_d}, last_panes={_pane_count(last or {})}, timeout_s={timeout_s}); " + f"recent_actions={list(recent_actions)}" + ) + + +def main() -> int: + rng = random.Random(FUZZ_SEED) + recent_actions: deque[str] = deque(maxlen=max(8, TRACE_TAIL)) + total_samples = 0 + total_cycles = 0 + total_extra_ctrl_d = 0 + timeout_state: dict[str, int] = {"count": 0} + + with cmux(SOCKET_PATH) as c: + c.activate_app() + + for workspace_index in range(1, WORKSPACES + 1): + ws = c.new_workspace() + c.select_workspace(ws) + c.activate_app() + time.sleep(0.08) + + start = _safe_layout_debug(c, timeout_state=timeout_state, context=f"workspace={workspace_index} start") + baseline = _container_frame(start) + start_panes = _pane_count(start) + if start_panes != 1: + raise cmuxError(f"New workspace did not start as single pane (workspace={workspace_index}, panes={start_panes})") + + for cycle in range(1, CYCLES_PER_WORKSPACE + 1): + total_cycles += 1 + + if PRE_ACTION_JITTER_MAX_S > 0: + time.sleep(rng.uniform(0.0, PRE_ACTION_JITTER_MAX_S)) + + recent_actions.append(f"ws={workspace_index} cycle={cycle} action=cmd+d") + c.simulate_shortcut("cmd+d") + + after_split, sampled = _wait_for_panes( + c, + target_panes=2, + baseline=baseline, + workspace_index=workspace_index, + cycle=cycle, + phase="after_cmd+d", + timeout_s=TRANSITION_TIMEOUT_S, + trace=list(recent_actions), + timeout_state=timeout_state, + ) + total_samples += sampled + _assert_two_panes_left_right(after_split, workspace_index=workspace_index, cycle=cycle, trace=list(recent_actions)) + + hold_split = rng.uniform(HOLD_MIN_S, HOLD_MAX_S) + total_samples += _sample_while( + c, + baseline=baseline, + deadline=time.time() + hold_split, + workspace_index=workspace_index, + cycle=cycle, + phase="hold_2pane", + trace=list(recent_actions), + timeout_state=timeout_state, + ) + + if PRE_ACTION_JITTER_MAX_S > 0: + time.sleep(rng.uniform(0.0, PRE_ACTION_JITTER_MAX_S)) + + right_panel_id = _rightmost_panel_id(after_split) + recent_actions.append(f"ws={workspace_index} cycle={cycle} action=ctrl+d(surface={right_panel_id})") + c.send_key_surface(right_panel_id, "ctrl-d") + + _, sampled, extra_ctrl_d = _wait_for_single_pane_after_ctrl_d( + c, + baseline=baseline, + workspace_index=workspace_index, + cycle=cycle, + phase="after_ctrl+d", + timeout_s=TRANSITION_TIMEOUT_S, + recent_actions=recent_actions, + timeout_state=timeout_state, + ) + total_samples += sampled + total_extra_ctrl_d += extra_ctrl_d + + hold_single = rng.uniform(HOLD_MIN_S, HOLD_MAX_S) + total_samples += _sample_while( + c, + baseline=baseline, + deadline=time.time() + hold_single, + workspace_index=workspace_index, + cycle=cycle, + phase="hold_1pane", + trace=list(recent_actions), + timeout_state=timeout_state, + ) + + c.close_workspace(ws) + time.sleep(0.05) + + print( + "PASS: strict two-pane cmd+d/ctrl+d frame guard " + f"(seed={FUZZ_SEED}, workspaces={WORKSPACES}, cycles={total_cycles}, samples={total_samples}, " + f"extra_ctrl_d={total_extra_ctrl_d}, epsilon={EPSILON}, layout_timeouts={timeout_state.get('count', 0)})" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 561f052fdd26f81338feefe704fdd1f9da63ea23 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:31:24 -0800 Subject: [PATCH 130/214] Use theme background for browser omnibar chrome in light mode --- Sources/Panels/BrowserPanelView.swift | 24 ++++++++----- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 34 +++++++++++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index ac19b086..f3e7e861 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -166,6 +166,18 @@ private extension View { } } +func resolvedBrowserChromeBackgroundColor( + for colorScheme: ColorScheme, + themeBackgroundColor: NSColor +) -> NSColor { + switch colorScheme { + case .dark, .light: + return themeBackgroundColor + @unknown default: + return themeBackgroundColor + } +} + /// View for rendering a browser panel with address bar struct BrowserPanelView: View { @ObservedObject var panel: BrowserPanel @@ -239,14 +251,10 @@ struct BrowserPanelView: View { } private var browserChromeBackgroundColor: NSColor { - switch colorScheme { - case .dark: - return GhosttyApp.shared.defaultBackgroundColor - case .light: - return .windowBackgroundColor - @unknown default: - return .windowBackgroundColor - } + resolvedBrowserChromeBackgroundColor( + for: colorScheme, + themeBackgroundColor: GhosttyApp.shared.defaultBackgroundColor + ) } var body: some View { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index ba914a50..e7205bb1 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -655,6 +655,40 @@ final class BrowserThemeSettingsTests: XCTestCase { } } +final class BrowserPanelChromeBackgroundColorTests: XCTestCase { + func testLightModeUsesThemeBackgroundColor() { + assertResolvedColorMatchesTheme(for: .light) + } + + func testDarkModeUsesThemeBackgroundColor() { + assertResolvedColorMatchesTheme(for: .dark) + } + + private func assertResolvedColorMatchesTheme( + for colorScheme: ColorScheme, + file: StaticString = #filePath, + line: UInt = #line + ) { + let themeBackground = NSColor(srgbRed: 0.13, green: 0.29, blue: 0.47, alpha: 1.0) + + guard + let actual = resolvedBrowserChromeBackgroundColor( + for: colorScheme, + themeBackgroundColor: themeBackground + ).usingColorSpace(.sRGB), + let expected = themeBackground.usingColorSpace(.sRGB) + else { + XCTFail("Expected sRGB-convertible colors", file: file, line: line) + return + } + + XCTAssertEqual(actual.redComponent, expected.redComponent, accuracy: 0.001, file: file, line: line) + XCTAssertEqual(actual.greenComponent, expected.greenComponent, accuracy: 0.001, file: file, line: line) + XCTAssertEqual(actual.blueComponent, expected.blueComponent, accuracy: 0.001, file: file, line: line) + XCTAssertEqual(actual.alphaComponent, expected.alphaComponent, accuracy: 0.001, file: file, line: line) + } +} + final class BrowserDeveloperToolsShortcutDefaultsTests: XCTestCase { func testSafariDefaultShortcutForToggleDeveloperTools() { let shortcut = KeyboardShortcutSettings.Action.toggleBrowserDeveloperTools.defaultShortcut From 0eef387d5dfab57a2c598c4ec14715a7582459c9 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:55:01 -0800 Subject: [PATCH 131/214] Tint browser omnibar pill with theme accent --- Sources/Panels/BrowserPanelView.swift | 28 ++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 40 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index f3e7e861..abe6975d 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -178,6 +178,24 @@ func resolvedBrowserChromeBackgroundColor( } } +func resolvedBrowserOmnibarPillBackgroundColor( + for colorScheme: ColorScheme, + themeBackgroundColor: NSColor, + accentColor: NSColor +) -> NSColor { + let accentMix: CGFloat + switch colorScheme { + case .light: + accentMix = 0.08 + case .dark: + accentMix = 0.12 + @unknown default: + accentMix = 0.08 + } + + return themeBackgroundColor.blended(withFraction: accentMix, of: accentColor) ?? themeBackgroundColor +} + /// View for rendering a browser panel with address bar struct BrowserPanelView: View { @ObservedObject var panel: BrowserPanel @@ -257,6 +275,14 @@ struct BrowserPanelView: View { ) } + private var omnibarPillBackgroundColor: NSColor { + resolvedBrowserOmnibarPillBackgroundColor( + for: colorScheme, + themeBackgroundColor: browserChromeBackgroundColor, + accentColor: .controlAccentColor + ) + } + var body: some View { VStack(spacing: 0) { addressBar @@ -656,7 +682,7 @@ struct BrowserPanelView: View { .padding(.vertical, 4) .background( RoundedRectangle(cornerRadius: omnibarPillCornerRadius, style: .continuous) - .fill(Color(nsColor: .textBackgroundColor)) + .fill(Color(nsColor: omnibarPillBackgroundColor)) ) .overlay( RoundedRectangle(cornerRadius: omnibarPillCornerRadius, style: .continuous) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index e7205bb1..201942d3 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -689,6 +689,46 @@ final class BrowserPanelChromeBackgroundColorTests: XCTestCase { } } +final class BrowserPanelOmnibarPillBackgroundColorTests: XCTestCase { + func testLightModeUsesSubtleAccentTintOverThemeBackground() { + assertResolvedColorMatchesExpectedBlend(for: .light, accentMix: 0.08) + } + + func testDarkModeUsesSlightlyStrongerAccentTintOverThemeBackground() { + assertResolvedColorMatchesExpectedBlend(for: .dark, accentMix: 0.12) + } + + private func assertResolvedColorMatchesExpectedBlend( + for colorScheme: ColorScheme, + accentMix: CGFloat, + file: StaticString = #filePath, + line: UInt = #line + ) { + let themeBackground = NSColor(srgbRed: 0.94, green: 0.93, blue: 0.91, alpha: 1.0) + let accent = NSColor(srgbRed: 0.25, green: 0.47, blue: 0.92, alpha: 1.0) + let expected = themeBackground.blended(withFraction: accentMix, of: accent) ?? themeBackground + + guard + let actual = resolvedBrowserOmnibarPillBackgroundColor( + for: colorScheme, + themeBackgroundColor: themeBackground, + accentColor: accent + ).usingColorSpace(.sRGB), + let expectedSRGB = expected.usingColorSpace(.sRGB), + let themeSRGB = themeBackground.usingColorSpace(.sRGB) + else { + XCTFail("Expected sRGB-convertible colors", file: file, line: line) + return + } + + XCTAssertEqual(actual.redComponent, expectedSRGB.redComponent, accuracy: 0.001, file: file, line: line) + XCTAssertEqual(actual.greenComponent, expectedSRGB.greenComponent, accuracy: 0.001, file: file, line: line) + XCTAssertEqual(actual.blueComponent, expectedSRGB.blueComponent, accuracy: 0.001, file: file, line: line) + XCTAssertEqual(actual.alphaComponent, expectedSRGB.alphaComponent, accuracy: 0.001, file: file, line: line) + XCTAssertNotEqual(actual.redComponent, themeSRGB.redComponent, file: file, line: line) + } +} + final class BrowserDeveloperToolsShortcutDefaultsTests: XCTestCase { func testSafariDefaultShortcutForToggleDeveloperTools() { let shortcut = KeyboardShortcutSettings.Action.toggleBrowserDeveloperTools.defaultShortcut From 41b24b788316c4cc154a6248636f3e476bdf0a92 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:01:35 -0800 Subject: [PATCH 132/214] Guard split shortcuts during transient focus fallback --- Sources/AppDelegate.swift | 60 +++++++++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 46 ++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index f6811ae8..6d789500 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -183,6 +183,17 @@ func browserZoomShortcutAction( return nil } +func shouldSuppressSplitShortcutForTransientTerminalFocusInputs( + firstResponderIsWindow: Bool, + hostedSize: CGSize, + hostedHiddenInHierarchy: Bool, + hostedAttachedToWindow: Bool +) -> Bool { + guard firstResponderIsWindow else { return false } + let tinyGeometry = hostedSize.width <= 1 || hostedSize.height <= 1 + return tinyGeometry || hostedHiddenInHierarchy || !hostedAttachedToWindow +} + func shouldRouteTerminalFontZoomShortcutToGhostty( firstResponderIsGhostty: Bool, flags: NSEvent.ModifierFlags, @@ -2425,11 +2436,17 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent // Split actions: Cmd+D / Cmd+Shift+D if matchShortcut(event: event, shortcut: KeyboardShortcutSettings.shortcut(for: .splitRight)) { + if shouldSuppressSplitShortcutForTransientTerminalFocusState(direction: .right) { + return true + } _ = performSplitShortcut(direction: .right) return true } if matchShortcut(event: event, shortcut: KeyboardShortcutSettings.shortcut(for: .splitDown)) { + if shouldSuppressSplitShortcutForTransientTerminalFocusState(direction: .down) { + return true + } _ = performSplitShortcut(direction: .down) return true } @@ -2564,6 +2581,49 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return false } + private func shouldSuppressSplitShortcutForTransientTerminalFocusState(direction: SplitDirection) -> Bool { + guard let tabManager, + let workspace = tabManager.selectedWorkspace, + let focusedPanelId = workspace.focusedPanelId, + let terminalPanel = workspace.terminalPanel(for: focusedPanelId) else { + return false + } + + let hostedView = terminalPanel.hostedView + let hostedSize = hostedView.bounds.size + let hostedHiddenInHierarchy = hostedView.isHiddenOrHasHiddenAncestor + let hostedAttachedToWindow = hostedView.window != nil + let firstResponderIsWindow = NSApp.keyWindow?.firstResponder is NSWindow + + let shouldSuppress = shouldSuppressSplitShortcutForTransientTerminalFocusInputs( + firstResponderIsWindow: firstResponderIsWindow, + hostedSize: hostedSize, + hostedHiddenInHierarchy: hostedHiddenInHierarchy, + hostedAttachedToWindow: hostedAttachedToWindow + ) + guard shouldSuppress else { return false } + + tabManager.reconcileFocusedPanelFromFirstResponderForKeyboard() + +#if DEBUG + let directionLabel: String + switch direction { + case .left: directionLabel = "left" + case .right: directionLabel = "right" + case .up: directionLabel = "up" + case .down: directionLabel = "down" + } + let firstResponderType = NSApp.keyWindow?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" + dlog( + "split.shortcut suppressed dir=\(directionLabel) reason=transient_focus_state " + + "fr=\(firstResponderType) hidden=\(hostedHiddenInHierarchy ? 1 : 0) " + + "attached=\(hostedAttachedToWindow ? 1 : 0) " + + "frame=\(String(format: "%.1fx%.1f", hostedSize.width, hostedSize.height))" + ) +#endif + return true + } + #if DEBUG private func logBrowserZoomShortcutTrace( stage: String, diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 92e0fcd0..682e33c8 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -54,6 +54,52 @@ private func installCmuxUnitTestInspectorOverride() { cmuxUnitTestInspectorOverrideInstalled = true } +final class SplitShortcutTransientFocusGuardTests: XCTestCase { + func testSuppressesWhenFirstResponderFallsBackAndHostedViewIsTiny() { + XCTAssertTrue( + shouldSuppressSplitShortcutForTransientTerminalFocusInputs( + firstResponderIsWindow: true, + hostedSize: CGSize(width: 79, height: 0), + hostedHiddenInHierarchy: false, + hostedAttachedToWindow: true + ) + ) + } + + func testSuppressesWhenFirstResponderFallsBackAndHostedViewIsDetached() { + XCTAssertTrue( + shouldSuppressSplitShortcutForTransientTerminalFocusInputs( + firstResponderIsWindow: true, + hostedSize: CGSize(width: 1051.5, height: 1207), + hostedHiddenInHierarchy: false, + hostedAttachedToWindow: false + ) + ) + } + + func testAllowsWhenFirstResponderFallsBackButGeometryIsHealthy() { + XCTAssertFalse( + shouldSuppressSplitShortcutForTransientTerminalFocusInputs( + firstResponderIsWindow: true, + hostedSize: CGSize(width: 1051.5, height: 1207), + hostedHiddenInHierarchy: false, + hostedAttachedToWindow: true + ) + ) + } + + func testAllowsWhenFirstResponderIsTerminalEvenIfViewIsTiny() { + XCTAssertFalse( + shouldSuppressSplitShortcutForTransientTerminalFocusInputs( + firstResponderIsWindow: false, + hostedSize: CGSize(width: 79, height: 0), + hostedHiddenInHierarchy: false, + hostedAttachedToWindow: true + ) + ) + } +} + final class CmuxWebViewKeyEquivalentTests: XCTestCase { private final class ActionSpy: NSObject { private(set) var invoked: Bool = false From 0d03b58be8f58c2870e4e19b4e85aac2e65bc390 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 17:02:19 -0800 Subject: [PATCH 133/214] Tune omnibar pill tint toward theme background --- Sources/Panels/BrowserPanelView.swift | 6 +++--- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index abe6975d..7aa2a29b 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -186,11 +186,11 @@ func resolvedBrowserOmnibarPillBackgroundColor( let accentMix: CGFloat switch colorScheme { case .light: - accentMix = 0.08 + accentMix = 0.02 case .dark: - accentMix = 0.12 + accentMix = 0.03 @unknown default: - accentMix = 0.08 + accentMix = 0.02 } return themeBackgroundColor.blended(withFraction: accentMix, of: accentColor) ?? themeBackgroundColor diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 201942d3..0bce884b 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -691,11 +691,11 @@ final class BrowserPanelChromeBackgroundColorTests: XCTestCase { final class BrowserPanelOmnibarPillBackgroundColorTests: XCTestCase { func testLightModeUsesSubtleAccentTintOverThemeBackground() { - assertResolvedColorMatchesExpectedBlend(for: .light, accentMix: 0.08) + assertResolvedColorMatchesExpectedBlend(for: .light, accentMix: 0.02) } func testDarkModeUsesSlightlyStrongerAccentTintOverThemeBackground() { - assertResolvedColorMatchesExpectedBlend(for: .dark, accentMix: 0.12) + assertResolvedColorMatchesExpectedBlend(for: .dark, accentMix: 0.03) } private func assertResolvedColorMatchesExpectedBlend( From 0d98db72774eb58625c824df7b4e4299f21b5100 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 17:03:55 -0800 Subject: [PATCH 134/214] Fix titlebar text dragging while preserving folder icon drag --- Sources/AppDelegate.swift | 66 +++++ Sources/ContentView.swift | 137 +++++++++- Sources/WindowDragHandleView.swift | 215 ++++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 253 ++++++++++++++++++ 4 files changed, 656 insertions(+), 15 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 7bafbc8e..936f5475 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -193,6 +193,29 @@ func browserZoomShortcutTraceActionString(_ action: BrowserZoomShortcutAction?) } #endif +func shouldSuppressWindowMoveForFolderDrag(hitView: NSView?) -> Bool { + var candidate = hitView + while let view = candidate { + if view is DraggableFolderNSView { + return true + } + candidate = view.superview + } + return false +} + +func shouldSuppressWindowMoveForFolderDrag(window: NSWindow, event: NSEvent) -> Bool { + guard event.type == .leftMouseDown, + window.isMovable, + let contentView = window.contentView else { + return false + } + + let contentPoint = contentView.convert(event.locationInWindow, from: nil) + let hitView = contentView.hitTest(contentPoint) + return shouldSuppressWindowMoveForFolderDrag(hitView: hitView) +} + @MainActor final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDelegate, NSMenuItemValidation { static var shared: AppDelegate? @@ -288,6 +311,16 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } method_exchangeImplementations(originalMethod, swizzledMethod) }() + private static let didInstallWindowSendEventSwizzle: Void = { + let targetClass: AnyClass = NSWindow.self + let originalSelector = #selector(NSWindow.sendEvent(_:)) + let swizzledSelector = #selector(NSWindow.cmux_sendEvent(_:)) + guard let originalMethod = class_getInstanceMethod(targetClass, originalSelector), + let swizzledMethod = class_getInstanceMethod(targetClass, swizzledSelector) else { + return + } + method_exchangeImplementations(originalMethod, swizzledMethod) + }() #if DEBUG private var didSetupJumpUnreadUITest = false @@ -787,6 +820,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent window.titleVisibility = .hidden window.titlebarAppearsTransparent = true window.isMovableByWindowBackground = false + window.isMovable = false window.center() window.contentView = NSHostingView(rootView: root) @@ -1546,11 +1580,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent static func installWindowResponderSwizzlesForTesting() { _ = didInstallWindowKeyEquivalentSwizzle _ = didInstallWindowFirstResponderSwizzle + _ = didInstallWindowSendEventSwizzle } private func installWindowResponderSwizzles() { _ = Self.didInstallWindowKeyEquivalentSwizzle _ = Self.didInstallWindowFirstResponderSwizzle + _ = Self.didInstallWindowSendEventSwizzle } private func installShortcutMonitor() { @@ -3869,6 +3905,36 @@ private extension NSWindow { return cmux_makeFirstResponder(responder) } + @objc func cmux_sendEvent(_ event: NSEvent) { + guard shouldSuppressWindowMoveForFolderDrag(window: self, event: event), + let contentView = self.contentView else { + cmux_sendEvent(event) + return + } + + let contentPoint = contentView.convert(event.locationInWindow, from: nil) + let hitView = contentView.hitTest(contentPoint) + let previousMovableState = isMovable + if previousMovableState { + isMovable = false + } + + #if DEBUG + let hitDesc = hitView.map { String(describing: type(of: $0)) } ?? "nil" + dlog("window.sendEvent.folderDown suppress=1 hit=\(hitDesc) wasMovable=\(previousMovableState)") + #endif + + cmux_sendEvent(event) + + if previousMovableState { + isMovable = previousMovableState + } + + #if DEBUG + dlog("window.sendEvent.folderDown restore nowMovable=\(isMovable)") + #endif + } + @objc func cmux_performKeyEquivalent(with event: NSEvent) -> Bool { #if DEBUG let frType = self.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 7a8cb326..0d216936 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -1211,6 +1211,7 @@ struct ContentView: View { WindowDragHandleView() TitlebarLeadingInsetReader(inset: $titlebarLeadingInset) + .allowsHitTesting(false) HStack(spacing: 8) { if isFullScreen && !sidebarState.isVisible { @@ -1226,6 +1227,7 @@ struct ContentView: View { .font(.system(size: 13, weight: .bold)) .foregroundColor(fakeTitlebarTextColor) .lineLimit(1) + .allowsHitTesting(false) Spacer() @@ -1238,9 +1240,6 @@ struct ContentView: View { .frame(height: titlebarPadding) .frame(maxWidth: .infinity) .contentShape(Rectangle()) - .onTapGesture(count: 2) { - NSApp.keyWindow?.zoom(nil) - } .background(fakeTitlebarBackground) .overlay(alignment: .bottom) { Rectangle() @@ -1540,6 +1539,9 @@ struct ContentView: View { // Do not make the entire background draggable; it interferes with drag gestures // like sidebar tab reordering in multi-window mode. window.isMovableByWindowBackground = false + // Keep the window immovable by default so titlebar controls (like the folder icon) + // cannot accidentally initiate native window drags. + window.isMovable = false window.styleMask.insert(.fullSizeContentView) // Track this window for fullscreen notifications @@ -4042,9 +4044,21 @@ private struct DraggableFolderIconRepresentable: NSViewRepresentable { } } -private final class DraggableFolderNSView: NSView, NSDraggingSource { +final class DraggableFolderNSView: NSView, NSDraggingSource { + private final class FolderIconImageView: NSImageView { + override var mouseDownCanMoveWindow: Bool { false } + } + var directory: String - private var imageView: NSImageView! + private var imageView: FolderIconImageView! + private var previousWindowMovableState: Bool? + private weak var suppressedWindow: NSWindow? + private var hasActiveDragSession = false + private var didArmWindowDragSuppression = false + + private func formatPoint(_ point: NSPoint) -> String { + String(format: "(%.1f,%.1f)", point.x, point.y) + } init(directory: String) { self.directory = directory @@ -4060,8 +4074,10 @@ private final class DraggableFolderNSView: NSView, NSDraggingSource { NSSize(width: 16, height: 16) } + override var mouseDownCanMoveWindow: Bool { false } + private func setupImageView() { - imageView = NSImageView() + imageView = FolderIconImageView() imageView.imageScaling = .scaleProportionallyDown imageView.translatesAutoresizingMaskIntoConstraints = false addSubview(imageView) @@ -4086,9 +4102,40 @@ private final class DraggableFolderNSView: NSView, NSDraggingSource { return context == .outsideApplication ? [.copy, .link] : .copy } - override func mouseDown(with event: NSEvent) { + func draggingSession(_ session: NSDraggingSession, endedAt screenPoint: NSPoint, operation: NSDragOperation) { + hasActiveDragSession = false + restoreWindowMovableStateIfNeeded() #if DEBUG - dlog("folder.dragStart dir=\(directory)") + let nowMovable = window.map { String($0.isMovable) } ?? "nil" + let windowOrigin = window.map { formatPoint($0.frame.origin) } ?? "nil" + dlog("folder.dragEnd dir=\(directory) operation=\(operation.rawValue) screen=\(formatPoint(screenPoint)) nowMovable=\(nowMovable) windowOrigin=\(windowOrigin)") + #endif + } + + override func hitTest(_ point: NSPoint) -> NSView? { + guard bounds.contains(point) else { return nil } + maybeDisableWindowDraggingEarly(trigger: "hitTest") + let hit = super.hitTest(point) + #if DEBUG + let hitDesc = hit.map { String(describing: type(of: $0)) } ?? "nil" + let imageHit = (hit === imageView) + let wasMovable = previousWindowMovableState.map(String.init) ?? "nil" + let nowMovable = window.map { String($0.isMovable) } ?? "nil" + dlog("folder.hitTest point=\(formatPoint(point)) hit=\(hitDesc) imageViewHit=\(imageHit) returning=DraggableFolderNSView wasMovable=\(wasMovable) nowMovable=\(nowMovable)") + #endif + return self + } + + override func mouseDown(with event: NSEvent) { + maybeDisableWindowDraggingEarly(trigger: "mouseDown") + hasActiveDragSession = false + #if DEBUG + let localPoint = convert(event.locationInWindow, from: nil) + let responderDesc = window?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" + let wasMovable = previousWindowMovableState.map(String.init) ?? "nil" + let nowMovable = window.map { String($0.isMovable) } ?? "nil" + let windowOrigin = window.map { formatPoint($0.frame.origin) } ?? "nil" + dlog("folder.mouseDown dir=\(directory) point=\(formatPoint(localPoint)) firstResponder=\(responderDesc) wasMovable=\(wasMovable) nowMovable=\(nowMovable) windowOrigin=\(windowOrigin)") #endif let fileURL = URL(fileURLWithPath: directory) let draggingItem = NSDraggingItem(pasteboardWriter: fileURL as NSURL) @@ -4097,7 +4144,19 @@ private final class DraggableFolderNSView: NSView, NSDraggingSource { iconImage.size = NSSize(width: 32, height: 32) draggingItem.setDraggingFrame(bounds, contents: iconImage) - beginDraggingSession(with: [draggingItem], event: event, source: self) + let session = beginDraggingSession(with: [draggingItem], event: event, source: self) + hasActiveDragSession = true + #if DEBUG + let itemCount = session.draggingPasteboard.pasteboardItems?.count ?? 0 + dlog("folder.dragStart dir=\(directory) pasteboardItems=\(itemCount)") + #endif + } + + override func mouseUp(with event: NSEvent) { + super.mouseUp(with: event) + if !hasActiveDragSession { + restoreWindowMovableStateIfNeeded() + } } override func rightMouseDown(with event: NSEvent) { @@ -4166,6 +4225,59 @@ private final class DraggableFolderNSView: NSView, NSDraggingSource { // Open "Computer" view in Finder (shows all volumes) NSWorkspace.shared.open(URL(fileURLWithPath: "/", isDirectory: true)) } + + private func restoreWindowMovableStateIfNeeded() { + guard didArmWindowDragSuppression || previousWindowMovableState != nil else { return } + let targetWindow = suppressedWindow ?? window + let depthAfter = endWindowDragSuppression(window: targetWindow) + restoreWindowDragging(window: targetWindow, previousMovableState: previousWindowMovableState) + self.previousWindowMovableState = nil + self.suppressedWindow = nil + self.didArmWindowDragSuppression = false + #if DEBUG + let nowMovable = targetWindow.map { String($0.isMovable) } ?? "nil" + dlog("folder.dragSuppression restore depth=\(depthAfter) nowMovable=\(nowMovable)") + #endif + } + + private func maybeDisableWindowDraggingEarly(trigger: String) { + guard !didArmWindowDragSuppression else { return } + guard let eventType = NSApp.currentEvent?.type, + eventType == .leftMouseDown || eventType == .leftMouseDragged else { + return + } + guard let currentWindow = window else { return } + + didArmWindowDragSuppression = true + suppressedWindow = currentWindow + let suppressionDepth = beginWindowDragSuppression(window: currentWindow) ?? 0 + if currentWindow.isMovable { + previousWindowMovableState = temporarilyDisableWindowDragging(window: currentWindow) + } else { + previousWindowMovableState = nil + } + #if DEBUG + let wasMovable = previousWindowMovableState.map(String.init) ?? "nil" + let nowMovable = String(currentWindow.isMovable) + dlog( + "folder.dragSuppression trigger=\(trigger) event=\(eventType) depth=\(suppressionDepth) wasMovable=\(wasMovable) nowMovable=\(nowMovable)" + ) + #endif + } +} + +func temporarilyDisableWindowDragging(window: NSWindow?) -> Bool? { + guard let window else { return nil } + let wasMovable = window.isMovable + if wasMovable { + window.isMovable = false + } + return wasMovable +} + +func restoreWindowDragging(window: NSWindow?, previousMovableState: Bool?) { + guard let window, let previousMovableState else { return } + window.isMovable = previousMovableState } /// Wrapper view that tries NSGlassEffectView (macOS 26+) when available or requested @@ -4247,11 +4359,16 @@ private struct SidebarVisualEffectBackground: NSViewRepresentable { /// Reads the leading inset required to clear traffic lights + left titlebar accessories. +final class TitlebarLeadingInsetPassthroughView: NSView { + override var mouseDownCanMoveWindow: Bool { false } + override func hitTest(_ point: NSPoint) -> NSView? { nil } +} + private struct TitlebarLeadingInsetReader: NSViewRepresentable { @Binding var inset: CGFloat func makeNSView(context: Context) -> NSView { - let view = NSView() + let view = TitlebarLeadingInsetPassthroughView() view.setFrameSize(.zero) return view } diff --git a/Sources/WindowDragHandleView.swift b/Sources/WindowDragHandleView.swift index da9127e4..ebc62a05 100644 --- a/Sources/WindowDragHandleView.swift +++ b/Sources/WindowDragHandleView.swift @@ -1,23 +1,184 @@ import AppKit +import Bonsplit import SwiftUI +private func windowDragHandleFormatPoint(_ point: NSPoint) -> String { + String(format: "(%.1f,%.1f)", point.x, point.y) +} + +private var windowDragSuppressionDepthKey: UInt8 = 0 + +func beginWindowDragSuppression(window: NSWindow?) -> Int? { + guard let window else { return nil } + let current = windowDragSuppressionDepth(window: window) + let next = current + 1 + objc_setAssociatedObject( + window, + &windowDragSuppressionDepthKey, + NSNumber(value: next), + .OBJC_ASSOCIATION_RETAIN_NONATOMIC + ) + return next +} + +@discardableResult +func endWindowDragSuppression(window: NSWindow?) -> Int { + guard let window else { return 0 } + let current = windowDragSuppressionDepth(window: window) + let next = max(0, current - 1) + if next == 0 { + objc_setAssociatedObject(window, &windowDragSuppressionDepthKey, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } else { + objc_setAssociatedObject( + window, + &windowDragSuppressionDepthKey, + NSNumber(value: next), + .OBJC_ASSOCIATION_RETAIN_NONATOMIC + ) + } + return next +} + +func windowDragSuppressionDepth(window: NSWindow?) -> Int { + guard let window, + let value = objc_getAssociatedObject(window, &windowDragSuppressionDepthKey) as? NSNumber else { + return 0 + } + return value.intValue +} + +func isWindowDragSuppressed(window: NSWindow?) -> Bool { + windowDragSuppressionDepth(window: window) > 0 +} + +/// Temporarily enables window movability for explicit drag-handle drags, then +/// restores the previous movability state after `body` finishes. +@discardableResult +func withTemporaryWindowMovableEnabled(window: NSWindow?, _ body: () -> Void) -> Bool? { + guard let window else { + body() + return nil + } + + let previousMovableState = window.isMovable + if !previousMovableState { + window.isMovable = true + } + defer { + if window.isMovable != previousMovableState { + window.isMovable = previousMovableState + } + } + + body() + return previousMovableState +} + +private enum WindowDragHandleHitTestState { + static var isResolvingTopHit = false +} + +/// SwiftUI/AppKit hosting wrappers can appear as the top hit even for empty +/// titlebar space. Treat those as pass-through so explicit sibling checks decide. +func windowDragHandleShouldTreatTopHitAsPassiveHost(_ view: NSView) -> Bool { + let className = String(describing: type(of: view)) + if className.contains("HostContainerView") + || className.contains("AppKitWindowHostingView") + || className.contains("NSHostingView") { + return true + } + if let window = view.window, view === window.contentView { + return true + } + return false +} + /// Returns whether the titlebar drag handle should capture a hit at `point`. /// We only claim the hit when no sibling view already handles it, so interactive /// controls layered in the titlebar (e.g. proxy folder icon) keep their gestures. func windowDragHandleShouldCaptureHit(_ point: NSPoint, in dragHandleView: NSView) -> Bool { - guard dragHandleView.bounds.contains(point) else { return false } - guard let superview = dragHandleView.superview else { return true } + if isWindowDragSuppressed(window: dragHandleView.window) { + #if DEBUG + let depth = windowDragSuppressionDepth(window: dragHandleView.window) + dlog( + "titlebar.dragHandle.hitTest capture=false reason=suppressed depth=\(depth) point=\(windowDragHandleFormatPoint(point))" + ) + #endif + return false + } + + guard dragHandleView.bounds.contains(point) else { + #if DEBUG + dlog("titlebar.dragHandle.hitTest capture=false reason=outside point=\(windowDragHandleFormatPoint(point))") + #endif + return false + } + + guard let superview = dragHandleView.superview else { + #if DEBUG + dlog("titlebar.dragHandle.hitTest capture=true reason=noSuperview point=\(windowDragHandleFormatPoint(point))") + #endif + return true + } + + if let window = dragHandleView.window, + let contentView = window.contentView, + !WindowDragHandleHitTestState.isResolvingTopHit { + let pointInWindow = dragHandleView.convert(point, to: nil) + let pointInContent = contentView.convert(pointInWindow, from: nil) + + WindowDragHandleHitTestState.isResolvingTopHit = true + let topHit = contentView.hitTest(pointInContent) + WindowDragHandleHitTestState.isResolvingTopHit = false + + if let topHit { + let ownsTopHit = topHit === dragHandleView || topHit.isDescendant(of: dragHandleView) + let isPassiveHostHit = windowDragHandleShouldTreatTopHitAsPassiveHost(topHit) + #if DEBUG + dlog( + "titlebar.dragHandle.hitTest capture=\(ownsTopHit) strategy=windowTopHit point=\(windowDragHandleFormatPoint(point)) top=\(type(of: topHit)) passiveHost=\(isPassiveHostHit)" + ) + #endif + if ownsTopHit { + return true + } + if !isPassiveHostHit { + return false + } + } + } + + #if DEBUG + let siblingCount = superview.subviews.count + #endif for sibling in superview.subviews.reversed() { guard sibling !== dragHandleView else { continue } guard !sibling.isHidden, sibling.alphaValue > 0 else { continue } let pointInSibling = dragHandleView.convert(point, to: sibling) - if sibling.hitTest(pointInSibling) != nil { + if let hitView = sibling.hitTest(pointInSibling) { + let passiveHostHit = windowDragHandleShouldTreatTopHitAsPassiveHost(hitView) + if passiveHostHit { + #if DEBUG + dlog( + "titlebar.dragHandle.hitTest capture=defer point=\(windowDragHandleFormatPoint(point)) sibling=\(type(of: sibling)) hit=\(type(of: hitView)) passiveHost=true" + ) + #endif + continue + } + #if DEBUG + dlog( + "titlebar.dragHandle.hitTest capture=false point=\(windowDragHandleFormatPoint(point)) siblingCount=\(siblingCount) sibling=\(type(of: sibling)) hit=\(type(of: hitView)) passiveHost=false" + ) + #endif return false } } + #if DEBUG + dlog("titlebar.dragHandle.hitTest capture=true point=\(windowDragHandleFormatPoint(point)) siblingCount=\(siblingCount)") + #endif return true } @@ -34,9 +195,53 @@ struct WindowDragHandleView: NSViewRepresentable { } private final class DraggableView: NSView { - override var mouseDownCanMoveWindow: Bool { true } + override var mouseDownCanMoveWindow: Bool { false } + override func hitTest(_ point: NSPoint) -> NSView? { - windowDragHandleShouldCaptureHit(point, in: self) ? self : nil + let shouldCapture = windowDragHandleShouldCaptureHit(point, in: self) + #if DEBUG + dlog( + "titlebar.dragHandle.hitTestResult capture=\(shouldCapture) point=\(windowDragHandleFormatPoint(point)) window=\(window != nil)" + ) + #endif + return shouldCapture ? self : nil + } + + override func mouseDown(with event: NSEvent) { + #if DEBUG + let point = convert(event.locationInWindow, from: nil) + let depth = windowDragSuppressionDepth(window: window) + dlog( + "titlebar.dragHandle.mouseDown point=\(windowDragHandleFormatPoint(point)) clickCount=\(event.clickCount) depth=\(depth)" + ) + #endif + + if event.clickCount >= 2 { + window?.zoom(nil) + #if DEBUG + dlog("titlebar.dragHandle.mouseDownDoubleClick zoom=1") + #endif + return + } + + guard !isWindowDragSuppressed(window: window) else { + #if DEBUG + dlog("titlebar.dragHandle.mouseDownIgnored reason=suppressed") + #endif + return + } + + if let window { + let previousMovableState = withTemporaryWindowMovableEnabled(window: window) { + window.performDrag(with: event) + } + #if DEBUG + let restored = previousMovableState.map { String($0) } ?? "nil" + dlog("titlebar.dragHandle.mouseDownComplete restoredMovable=\(restored) nowMovable=\(window.isMovable)") + #endif + } else { + super.mouseDown(with: event) + } } } } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 9a2fa303..f97bc015 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -3824,6 +3824,14 @@ final class WindowDragHandleHitTests: XCTestCase { } } + private final class HostContainerView: NSView {} + private final class PassiveHostContainerView: NSView { + override func hitTest(_ point: NSPoint) -> NSView? { + guard bounds.contains(point) else { return nil } + return super.hitTest(point) ?? self + } + } + func testDragHandleCapturesHitWhenNoSiblingClaimsPoint() { let container = NSView(frame: NSRect(x: 0, y: 0, width: 220, height: 36)) let dragHandle = NSView(frame: container.bounds) @@ -3869,6 +3877,251 @@ final class WindowDragHandleHitTests: XCTestCase { XCTAssertFalse(windowDragHandleShouldCaptureHit(NSPoint(x: 240, y: 18), in: dragHandle)) } + + func testPassiveHostingTopHitClassification() { + XCTAssertTrue(windowDragHandleShouldTreatTopHitAsPassiveHost(HostContainerView(frame: .zero))) + XCTAssertFalse(windowDragHandleShouldTreatTopHitAsPassiveHost(NSButton(frame: .zero))) + } + + func testDragHandleIgnoresPassiveHostSiblingHit() { + let container = NSView(frame: NSRect(x: 0, y: 0, width: 220, height: 36)) + let dragHandle = NSView(frame: container.bounds) + container.addSubview(dragHandle) + + let passiveHost = PassiveHostContainerView(frame: container.bounds) + container.addSubview(passiveHost) + + XCTAssertTrue( + windowDragHandleShouldCaptureHit(NSPoint(x: 180, y: 18), in: dragHandle), + "Passive host wrappers should not block titlebar drag capture" + ) + } + + func testDragHandleRespectsInteractiveChildInsidePassiveHost() { + let container = NSView(frame: NSRect(x: 0, y: 0, width: 220, height: 36)) + let dragHandle = NSView(frame: container.bounds) + container.addSubview(dragHandle) + + let passiveHost = PassiveHostContainerView(frame: container.bounds) + let folderControl = CapturingView(frame: NSRect(x: 10, y: 10, width: 16, height: 16)) + passiveHost.addSubview(folderControl) + container.addSubview(passiveHost) + + XCTAssertFalse( + windowDragHandleShouldCaptureHit(NSPoint(x: 14, y: 14), in: dragHandle), + "Interactive controls inside passive host wrappers should still receive hits" + ) + } +} + +@MainActor +final class DraggableFolderHitTests: XCTestCase { + func testFolderHitTestReturnsContainerWhenInsideBounds() { + let folderView = DraggableFolderNSView(directory: "/tmp") + folderView.frame = NSRect(x: 0, y: 0, width: 16, height: 16) + + guard let hit = folderView.hitTest(NSPoint(x: 8, y: 8)) else { + XCTFail("Expected folder icon to capture inside hit") + return + } + XCTAssertTrue(hit === folderView) + } + + func testFolderHitTestReturnsNilOutsideBounds() { + let folderView = DraggableFolderNSView(directory: "/tmp") + folderView.frame = NSRect(x: 0, y: 0, width: 16, height: 16) + + XCTAssertNil(folderView.hitTest(NSPoint(x: 20, y: 8))) + } + + func testFolderIconDisablesWindowMoveBehavior() { + let folderView = DraggableFolderNSView(directory: "/tmp") + XCTAssertFalse(folderView.mouseDownCanMoveWindow) + } +} + +@MainActor +final class TitlebarLeadingInsetPassthroughViewTests: XCTestCase { + func testLeadingInsetViewDoesNotParticipateInHitTesting() { + let view = TitlebarLeadingInsetPassthroughView(frame: NSRect(x: 0, y: 0, width: 200, height: 40)) + XCTAssertNil(view.hitTest(NSPoint(x: 20, y: 10))) + } + + func testLeadingInsetViewCannotMoveWindowViaMouseDown() { + let view = TitlebarLeadingInsetPassthroughView(frame: NSRect(x: 0, y: 0, width: 200, height: 40)) + XCTAssertFalse(view.mouseDownCanMoveWindow) + } +} + +@MainActor +final class FolderWindowMoveSuppressionTests: XCTestCase { + private func makeWindow() -> NSWindow { + NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 320, height: 180), + styleMask: [.titled, .closable, .miniaturizable, .resizable], + backing: .buffered, + defer: false + ) + } + + func testSuppressionDisablesMovableWindow() { + let window = makeWindow() + window.isMovable = true + + let previous = temporarilyDisableWindowDragging(window: window) + + XCTAssertEqual(previous, true) + XCTAssertFalse(window.isMovable) + } + + func testSuppressionPreservesAlreadyImmovableWindow() { + let window = makeWindow() + window.isMovable = false + + let previous = temporarilyDisableWindowDragging(window: window) + + XCTAssertEqual(previous, false) + XCTAssertFalse(window.isMovable) + } + + func testRestoreAppliesPreviousMovableState() { + let window = makeWindow() + window.isMovable = false + + restoreWindowDragging(window: window, previousMovableState: true) + XCTAssertTrue(window.isMovable) + + restoreWindowDragging(window: window, previousMovableState: false) + XCTAssertFalse(window.isMovable) + } + + func testWindowDragSuppressionDepthLifecycle() { + let window = makeWindow() + XCTAssertEqual(windowDragSuppressionDepth(window: window), 0) + XCTAssertFalse(isWindowDragSuppressed(window: window)) + + XCTAssertEqual(beginWindowDragSuppression(window: window), 1) + XCTAssertEqual(windowDragSuppressionDepth(window: window), 1) + XCTAssertTrue(isWindowDragSuppressed(window: window)) + + XCTAssertEqual(endWindowDragSuppression(window: window), 0) + XCTAssertEqual(windowDragSuppressionDepth(window: window), 0) + XCTAssertFalse(isWindowDragSuppressed(window: window)) + } + + func testWindowDragSuppressionIsReferenceCounted() { + let window = makeWindow() + XCTAssertEqual(beginWindowDragSuppression(window: window), 1) + XCTAssertEqual(beginWindowDragSuppression(window: window), 2) + XCTAssertEqual(windowDragSuppressionDepth(window: window), 2) + XCTAssertTrue(isWindowDragSuppressed(window: window)) + + XCTAssertEqual(endWindowDragSuppression(window: window), 1) + XCTAssertEqual(windowDragSuppressionDepth(window: window), 1) + XCTAssertTrue(isWindowDragSuppressed(window: window)) + + XCTAssertEqual(endWindowDragSuppression(window: window), 0) + XCTAssertEqual(windowDragSuppressionDepth(window: window), 0) + XCTAssertFalse(isWindowDragSuppressed(window: window)) + } + + func testTemporaryWindowMovableEnableRestoresImmovableWindow() { + let window = makeWindow() + window.isMovable = false + + let previous = withTemporaryWindowMovableEnabled(window: window) { + XCTAssertTrue(window.isMovable) + } + + XCTAssertEqual(previous, false) + XCTAssertFalse(window.isMovable) + } + + func testTemporaryWindowMovableEnablePreservesMovableWindow() { + let window = makeWindow() + window.isMovable = true + + let previous = withTemporaryWindowMovableEnabled(window: window) { + XCTAssertTrue(window.isMovable) + } + + XCTAssertEqual(previous, true) + XCTAssertTrue(window.isMovable) + } +} + +@MainActor +final class WindowMoveSuppressionHitPathTests: XCTestCase { + private func makeWindowWithContentView() -> (NSWindow, NSView) { + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 320, height: 180), + styleMask: [.titled, .closable], + backing: .buffered, + defer: false + ) + let contentView = NSView(frame: window.contentRect(forFrameRect: window.frame)) + window.contentView = contentView + return (window, contentView) + } + + private func makeMouseEvent(type: NSEvent.EventType, location: NSPoint, window: NSWindow) -> NSEvent { + guard let event = NSEvent.mouseEvent( + with: type, + location: location, + modifierFlags: [], + timestamp: ProcessInfo.processInfo.systemUptime, + windowNumber: window.windowNumber, + context: nil, + eventNumber: 0, + clickCount: 1, + pressure: 1.0 + ) else { + fatalError("Failed to create \(type) mouse event") + } + return event + } + + func testSuppressionHitPathRecognizesFolderView() { + let folderView = DraggableFolderNSView(directory: "/tmp") + XCTAssertTrue(shouldSuppressWindowMoveForFolderDrag(hitView: folderView)) + } + + func testSuppressionHitPathRecognizesDescendantOfFolderView() { + let folderView = DraggableFolderNSView(directory: "/tmp") + let child = NSView(frame: .zero) + folderView.addSubview(child) + XCTAssertTrue(shouldSuppressWindowMoveForFolderDrag(hitView: child)) + } + + func testSuppressionHitPathIgnoresUnrelatedViews() { + XCTAssertFalse(shouldSuppressWindowMoveForFolderDrag(hitView: NSView(frame: .zero))) + XCTAssertFalse(shouldSuppressWindowMoveForFolderDrag(hitView: nil)) + } + + func testSuppressionEventPathRecognizesFolderHitInsideWindow() { + let (window, contentView) = makeWindowWithContentView() + window.isMovable = true + let folderView = DraggableFolderNSView(directory: "/tmp") + folderView.frame = NSRect(x: 10, y: 10, width: 16, height: 16) + contentView.addSubview(folderView) + + let event = makeMouseEvent(type: .leftMouseDown, location: NSPoint(x: 14, y: 14), window: window) + + XCTAssertTrue(shouldSuppressWindowMoveForFolderDrag(window: window, event: event)) + } + + func testSuppressionEventPathRejectsNonFolderAndNonMouseDownEvents() { + let (window, contentView) = makeWindowWithContentView() + window.isMovable = true + let plainView = NSView(frame: NSRect(x: 0, y: 0, width: 40, height: 40)) + contentView.addSubview(plainView) + + let down = makeMouseEvent(type: .leftMouseDown, location: NSPoint(x: 20, y: 20), window: window) + XCTAssertFalse(shouldSuppressWindowMoveForFolderDrag(window: window, event: down)) + + let dragged = makeMouseEvent(type: .leftMouseDragged, location: NSPoint(x: 20, y: 20), window: window) + XCTAssertFalse(shouldSuppressWindowMoveForFolderDrag(window: window, event: dragged)) + } } @MainActor From cfce7e93e0e3f44843d5559549ecbce9bb890fbb Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 17:08:46 -0800 Subject: [PATCH 135/214] Darken omnibar pill relative to theme background --- Sources/Panels/BrowserPanelView.swift | 16 +++++++--------- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 16 +++++++--------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 7aa2a29b..f91855dd 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -180,20 +180,19 @@ func resolvedBrowserChromeBackgroundColor( func resolvedBrowserOmnibarPillBackgroundColor( for colorScheme: ColorScheme, - themeBackgroundColor: NSColor, - accentColor: NSColor + themeBackgroundColor: NSColor ) -> NSColor { - let accentMix: CGFloat + let darkenMix: CGFloat switch colorScheme { case .light: - accentMix = 0.02 + darkenMix = 0.04 case .dark: - accentMix = 0.03 + darkenMix = 0.05 @unknown default: - accentMix = 0.02 + darkenMix = 0.04 } - return themeBackgroundColor.blended(withFraction: accentMix, of: accentColor) ?? themeBackgroundColor + return themeBackgroundColor.blended(withFraction: darkenMix, of: .black) ?? themeBackgroundColor } /// View for rendering a browser panel with address bar @@ -278,8 +277,7 @@ struct BrowserPanelView: View { private var omnibarPillBackgroundColor: NSColor { resolvedBrowserOmnibarPillBackgroundColor( for: colorScheme, - themeBackgroundColor: browserChromeBackgroundColor, - accentColor: .controlAccentColor + themeBackgroundColor: browserChromeBackgroundColor ) } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 0bce884b..c3a0ef37 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -690,29 +690,27 @@ final class BrowserPanelChromeBackgroundColorTests: XCTestCase { } final class BrowserPanelOmnibarPillBackgroundColorTests: XCTestCase { - func testLightModeUsesSubtleAccentTintOverThemeBackground() { - assertResolvedColorMatchesExpectedBlend(for: .light, accentMix: 0.02) + func testLightModeSlightlyDarkensThemeBackground() { + assertResolvedColorMatchesExpectedBlend(for: .light, darkenMix: 0.04) } - func testDarkModeUsesSlightlyStrongerAccentTintOverThemeBackground() { - assertResolvedColorMatchesExpectedBlend(for: .dark, accentMix: 0.03) + func testDarkModeSlightlyDarkensThemeBackground() { + assertResolvedColorMatchesExpectedBlend(for: .dark, darkenMix: 0.05) } private func assertResolvedColorMatchesExpectedBlend( for colorScheme: ColorScheme, - accentMix: CGFloat, + darkenMix: CGFloat, file: StaticString = #filePath, line: UInt = #line ) { let themeBackground = NSColor(srgbRed: 0.94, green: 0.93, blue: 0.91, alpha: 1.0) - let accent = NSColor(srgbRed: 0.25, green: 0.47, blue: 0.92, alpha: 1.0) - let expected = themeBackground.blended(withFraction: accentMix, of: accent) ?? themeBackground + let expected = themeBackground.blended(withFraction: darkenMix, of: .black) ?? themeBackground guard let actual = resolvedBrowserOmnibarPillBackgroundColor( for: colorScheme, - themeBackgroundColor: themeBackground, - accentColor: accent + themeBackgroundColor: themeBackground ).usingColorSpace(.sRGB), let expectedSRGB = expected.usingColorSpace(.sRGB), let themeSRGB = themeBackground.usingColorSpace(.sRGB) From 53ef6a5f7dddb79b035de2e92d30f20fcea0c391 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 17:11:01 -0800 Subject: [PATCH 136/214] Upgrade Sentry: tracing, breadcrumbs, dSYM upload (#366) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Upgrade Sentry: tracing, breadcrumbs, dSYM upload - Enhanced Sentry SDK init with performance tracing (10% sample), explicit app hang timeout, stack trace attachment, and HTTP failure capture - Added breadcrumbs for key user actions: workspace switch/create/close, split creation, command palette open/close, app focus — these give context to hang/crash reports - Added dSYM upload step to nightly and release CI workflows so hang stacks are fully symbolicated (requires SENTRY_AUTH_TOKEN secret) - Created SentryHelper.swift with lightweight breadcrumb helper Closes https://github.com/manaflow-ai/cmux/issues/365 * Remove command palette breadcrumbs Not useful for hang diagnosis — keep only workspace/tab/split/focus breadcrumbs that correlate with heavy operations. --- .github/workflows/nightly.yml | 13 +++++++++++++ .github/workflows/release.yml | 14 ++++++++++++++ GhosttyTabs.xcodeproj/project.pbxproj | 4 ++++ Sources/AppDelegate.swift | 12 ++++++++++++ Sources/SentryHelper.swift | 9 +++++++++ Sources/TabManager.swift | 6 ++++++ 6 files changed, 58 insertions(+) create mode 100644 Sources/SentryHelper.swift diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index e200f251..a8ebeea4 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -294,6 +294,19 @@ jobs: # by appcast URLs to prevent signature/asset mismatch races. cp "$DMG_RELEASE" "$NIGHTLY_DMG_IMMUTABLE" + - name: Upload dSYMs to Sentry + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_ORG: manaflow + SENTRY_PROJECT: cmuxterm-macos + run: | + if [ -z "$SENTRY_AUTH_TOKEN" ]; then + echo "SENTRY_AUTH_TOKEN not set, skipping dSYM upload" + exit 0 + fi + brew install getsentry/tools/sentry-cli || true + sentry-cli debug-files upload --include-sources build/Build/Products/Release/ + - name: Generate Sparkle appcast (nightly) env: SPARKLE_PRIVATE_KEY: ${{ secrets.SPARKLE_PRIVATE_KEY }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3176697b..9063de75 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -250,6 +250,20 @@ jobs: xcrun stapler staple "$DMG_RELEASE" xcrun stapler validate "$DMG_RELEASE" + - name: Upload dSYMs to Sentry + if: steps.guard_release_assets.outputs.skip_all != 'true' + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_ORG: manaflow + SENTRY_PROJECT: cmuxterm-macos + run: | + if [ -z "$SENTRY_AUTH_TOKEN" ]; then + echo "SENTRY_AUTH_TOKEN not set, skipping dSYM upload" + exit 0 + fi + brew install getsentry/tools/sentry-cli || true + sentry-cli debug-files upload --include-sources build/Build/Products/Release/ + - name: Generate Sparkle appcast if: steps.guard_release_assets.outputs.skip_all != 'true' env: diff --git a/GhosttyTabs.xcodeproj/project.pbxproj b/GhosttyTabs.xcodeproj/project.pbxproj index 58641e08..3448b298 100644 --- a/GhosttyTabs.xcodeproj/project.pbxproj +++ b/GhosttyTabs.xcodeproj/project.pbxproj @@ -22,6 +22,7 @@ A5001500 /* CmuxWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001510 /* CmuxWebView.swift */; }; A5001501 /* UITestRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001511 /* UITestRecorder.swift */; }; A5001226 /* SocketControlSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001225 /* SocketControlSettings.swift */; }; + A5001601 /* SentryHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001600 /* SentryHelper.swift */; }; A5001400 /* Panel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001410 /* Panel.swift */; }; A5001401 /* TerminalPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001411 /* TerminalPanel.swift */; }; A5001402 /* BrowserPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001412 /* BrowserPanel.swift */; }; @@ -146,6 +147,7 @@ A5001017 /* ghostty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ghostty.h; sourceTree = "<group>"; }; A5001018 /* cmux-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "cmux-Bridging-Header.h"; sourceTree = "<group>"; }; A5001019 /* TerminalController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalController.swift; sourceTree = "<group>"; }; + A5001600 /* SentryHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryHelper.swift; sourceTree = "<group>"; }; A5001510 /* CmuxWebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/CmuxWebView.swift; sourceTree = "<group>"; }; A5001511 /* UITestRecorder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestRecorder.swift; sourceTree = "<group>"; }; A5001520 /* PostHogAnalytics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogAnalytics.swift; sourceTree = "<group>"; }; @@ -322,6 +324,7 @@ A5001019 /* TerminalController.swift */, A5001541 /* PortScanner.swift */, A5001225 /* SocketControlSettings.swift */, + A5001600 /* SentryHelper.swift */, A5001090 /* AppDelegate.swift */, A5001091 /* NotificationsPage.swift */, A5001092 /* TerminalNotificationStore.swift */, @@ -551,6 +554,7 @@ A5001007 /* TerminalController.swift in Sources */, A5001540 /* PortScanner.swift in Sources */, A5001226 /* SocketControlSettings.swift in Sources */, + A5001601 /* SentryHelper.swift in Sources */, A5001093 /* AppDelegate.swift in Sources */, A5001094 /* NotificationsPage.swift in Sources */, A5001095 /* TerminalNotificationStore.swift in Sources */, diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 5fc94aa0..ef7215c0 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -699,6 +699,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent options.debug = false #endif options.sendDefaultPii = true + + // Performance tracing (10% of transactions) + options.tracesSampleRate = 0.1 + // App hang timeout (default is 2s, be explicit) + options.appHangTimeoutInterval = 2.0 + // Attach stack traces to all events + options.attachStacktrace = true + // Capture failed HTTP requests + options.enableCaptureFailedRequests = true } if !isRunningUnderXCTest { @@ -804,6 +813,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent #endif func applicationDidBecomeActive(_ notification: Notification) { + sentryBreadcrumb("app.didBecomeActive", category: "lifecycle", data: [ + "tabCount": tabManager?.tabs.count ?? 0 + ]) let env = ProcessInfo.processInfo.environment if !isRunningUnderXCTest(env) { PostHogAnalytics.shared.trackDailyActive(reason: "didBecomeActive") diff --git a/Sources/SentryHelper.swift b/Sources/SentryHelper.swift new file mode 100644 index 00000000..9877a46c --- /dev/null +++ b/Sources/SentryHelper.swift @@ -0,0 +1,9 @@ +import Sentry + +/// Add a Sentry breadcrumb for user-action context in hang/crash reports. +func sentryBreadcrumb(_ message: String, category: String = "ui", data: [String: Any]? = nil) { + let crumb = Breadcrumb(level: .info, category: category) + crumb.message = message + crumb.data = data + SentrySDK.addBreadcrumb(crumb) +} diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 0e38e366..5a59b82a 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -567,6 +567,9 @@ class TabManager: ObservableObject { @Published var selectedTabId: UUID? { didSet { guard selectedTabId != oldValue else { return } + sentryBreadcrumb("workspace.switch", data: [ + "tabCount": tabs.count + ]) let previousTabId = oldValue if let previousTabId, let previousPanelId = focusedPanelId(for: previousTabId) { @@ -752,6 +755,7 @@ class TabManager: ObservableObject { @discardableResult func addWorkspace(workingDirectory overrideWorkingDirectory: String? = nil, select: Bool = true) -> Workspace { + sentryBreadcrumb("workspace.create", data: ["tabCount": tabs.count + 1]) let workingDirectory = normalizedWorkingDirectory(overrideWorkingDirectory) ?? preferredWorkingDirectoryForNewTab() let inheritedConfig = inheritedTerminalConfigForNewWorkspace() let ordinal = Self.nextPortOrdinal @@ -963,6 +967,7 @@ class TabManager: ObservableObject { func closeWorkspace(_ workspace: Workspace) { guard tabs.count > 1 else { return } + sentryBreadcrumb("workspace.close", data: ["tabCount": tabs.count - 1]) AppDelegate.shared?.notificationStore?.clearNotifications(forTabId: workspace.id) unwireClosedBrowserTracking(for: workspace) @@ -1725,6 +1730,7 @@ class TabManager: ObservableObject { guard let selectedTabId, let tab = tabs.first(where: { $0.id == selectedTabId }), let focusedPanelId = tab.focusedPanelId else { return } + sentryBreadcrumb("split.create", data: ["direction": String(describing: direction)]) _ = newSplit(tabId: selectedTabId, surfaceId: focusedPanelId, direction: direction) } From ed0dd1ccb71f7cfc8f3e7bc476baa5beb3b82da5 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:39:58 -0800 Subject: [PATCH 137/214] Make omnibar suggestions popup/rows squircle --- Sources/Panels/BrowserPanelView.swift | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index f91855dd..c98e913a 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -2627,10 +2627,10 @@ private struct OmnibarSuggestionsView: View { let onCommit: (OmnibarSuggestion) -> Void let onHighlight: (Int) -> Void - // Keep radii below the smallest rendered heights so corners don't get - // auto-clamped and visually change as popup height changes. - private let popupCornerRadius: CGFloat = 16 - private let rowHighlightCornerRadius: CGFloat = 12 + // Keep radii below half of the smallest rendered heights so this keeps a + // squircle silhouette instead of auto-clamping into a capsule. + private let popupCornerRadius: CGFloat = 12 + private let rowHighlightCornerRadius: CGFloat = 9 private let singleLineRowHeight: CGFloat = 24 private let rowSpacing: CGFloat = 1 private let topInset: CGFloat = 3 @@ -2802,8 +2802,9 @@ private struct OmnibarSuggestionsView: View { lineWidth: 1 ) ) + .clipShape(RoundedRectangle(cornerRadius: popupCornerRadius, style: .continuous)) .shadow(color: Color.black.opacity(0.45), radius: 20, y: 10) - .contentShape(Rectangle()) + .contentShape(RoundedRectangle(cornerRadius: popupCornerRadius, style: .continuous)) .accessibilityElement(children: .contain) .accessibilityRespondsToUserInteraction(true) .accessibilityIdentifier("BrowserOmnibarSuggestions") From b87d4fecda028ba96850b081ef5b0b711eafbd82 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:43:39 -0800 Subject: [PATCH 138/214] Move omnibar suggestions popover up by 2px --- Sources/Panels/BrowserPanelView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index c98e913a..5da2592a 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -310,7 +310,7 @@ struct BrowserPanelView: View { } ) .frame(width: omnibarPillFrame.width) - .offset(x: omnibarPillFrame.minX, y: omnibarPillFrame.maxY + 6) + .offset(x: omnibarPillFrame.minX, y: omnibarPillFrame.maxY + 4) .zIndex(1000) } } From 82ef5b8f6ee574035b2c1d0b99fcbf01d9f1a6cd Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:51:32 -0800 Subject: [PATCH 139/214] Move omnibar suggestions popover up 1px --- Sources/Panels/BrowserPanelView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 5da2592a..88cbfb56 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -310,7 +310,7 @@ struct BrowserPanelView: View { } ) .frame(width: omnibarPillFrame.width) - .offset(x: omnibarPillFrame.minX, y: omnibarPillFrame.maxY + 4) + .offset(x: omnibarPillFrame.minX, y: omnibarPillFrame.maxY + 3) .zIndex(1000) } } From 88c1dbc5d6af07a6dfc731d22f8a4f817ae37be9 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:00:01 -0800 Subject: [PATCH 140/214] Fix omnibar focus thrash when another text field takes focus --- Sources/Panels/BrowserPanelView.swift | 37 ++++++++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 29 +++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index f91855dd..46f9147c 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -2181,6 +2181,13 @@ struct OmnibarSuggestion: Identifiable, Hashable { } } +func browserOmnibarShouldReacquireFocusAfterEndEditing( + suppressWebViewFocus: Bool, + nextResponderIsOtherTextField: Bool +) -> Bool { + suppressWebViewFocus && !nextResponderIsOtherTextField +} + private final class OmnibarNativeTextField: NSTextField { var onPointerDown: (() -> Void)? var onHandleKeyEvent: ((NSEvent, NSTextView?) -> Bool)? @@ -2293,6 +2300,29 @@ private struct OmnibarTextFieldRepresentable: NSViewRepresentable { } } + private func nextResponderIsOtherTextField(window: NSWindow?) -> Bool { + guard let window, let field = parentField else { return false } + let responder = window.firstResponder + + if let editor = responder as? NSTextView, + let delegateField = editor.delegate as? NSTextField { + return delegateField !== field + } + + if let textField = responder as? NSTextField { + return textField !== field + } + + return false + } + + private func shouldReacquireFocusAfterEndEditing(window: NSWindow?) -> Bool { + return browserOmnibarShouldReacquireFocusAfterEndEditing( + suppressWebViewFocus: parent.shouldSuppressWebViewFocus(), + nextResponderIsOtherTextField: nextResponderIsOtherTextField(window: window) + ) + } + func controlTextDidBeginEditing(_ obj: Notification) { if !parent.isFocused { DispatchQueue.main.async { @@ -2305,15 +2335,18 @@ private struct OmnibarTextFieldRepresentable: NSViewRepresentable { func controlTextDidEndEditing(_ obj: Notification) { if parent.isFocused { - if parent.shouldSuppressWebViewFocus() { + if shouldReacquireFocusAfterEndEditing(window: parentField?.window) { guard pendingFocusRequest != true else { return } pendingFocusRequest = true DispatchQueue.main.async { [weak self] in guard let self else { return } self.pendingFocusRequest = nil guard self.parent.isFocused else { return } - guard self.parent.shouldSuppressWebViewFocus() else { return } guard let field = self.parentField, let window = field.window else { return } + guard self.shouldReacquireFocusAfterEndEditing(window: window) else { + self.parent.onFieldLostFocus() + return + } // Check both the field itself AND its field editor (which becomes // the actual first responder when the text field is being edited). let fr = window.firstResponder diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index c875cf11..d74c082b 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -6012,3 +6012,32 @@ final class TerminalControllerSocketTextChunkTests: XCTestCase { ) } } + +final class BrowserOmnibarFocusPolicyTests: XCTestCase { + func testReacquiresFocusWhenWebViewSuppressionIsActiveAndNextResponderIsNotAnotherTextField() { + XCTAssertTrue( + browserOmnibarShouldReacquireFocusAfterEndEditing( + suppressWebViewFocus: true, + nextResponderIsOtherTextField: false + ) + ) + } + + func testDoesNotReacquireFocusWhenAnotherTextFieldAlreadyTookFocus() { + XCTAssertFalse( + browserOmnibarShouldReacquireFocusAfterEndEditing( + suppressWebViewFocus: true, + nextResponderIsOtherTextField: true + ) + ) + } + + func testDoesNotReacquireFocusWhenWebViewSuppressionIsInactive() { + XCTAssertFalse( + browserOmnibarShouldReacquireFocusAfterEndEditing( + suppressWebViewFocus: false, + nextResponderIsOtherTextField: false + ) + ) + } +} From 05101a1a104e3c544eb52d752330ce94f1ec0d09 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:06:50 -0800 Subject: [PATCH 141/214] Fix light theme omnibar suggestions popover styling --- Sources/Panels/BrowserPanelView.swift | 116 +++++++++++++++++++++++--- 1 file changed, 103 insertions(+), 13 deletions(-) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 88cbfb56..f91b71e8 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -2626,6 +2626,7 @@ private struct OmnibarSuggestionsView: View { let searchSuggestionsEnabled: Bool let onCommit: (OmnibarSuggestion) -> Void let onHighlight: (Int) -> Void + @Environment(\.colorScheme) private var colorScheme // Keep radii below half of the smallest rendered heights so this keeps a // squircle silhouette instead of auto-clamping into a capsule. @@ -2683,6 +2684,101 @@ private struct OmnibarSuggestionsView: View { contentHeight > maxPopupHeight } + private var listTextColor: Color { + switch colorScheme { + case .light: + return Color(nsColor: .labelColor) + case .dark: + return Color.white.opacity(0.9) + @unknown default: + return Color(nsColor: .labelColor) + } + } + + private var badgeTextColor: Color { + switch colorScheme { + case .light: + return Color(nsColor: .secondaryLabelColor) + case .dark: + return Color.white.opacity(0.72) + @unknown default: + return Color(nsColor: .secondaryLabelColor) + } + } + + private var badgeBackgroundColor: Color { + switch colorScheme { + case .light: + return Color.black.opacity(0.06) + case .dark: + return Color.white.opacity(0.08) + @unknown default: + return Color.black.opacity(0.06) + } + } + + private var rowHighlightColor: Color { + switch colorScheme { + case .light: + return Color.black.opacity(0.07) + case .dark: + return Color.white.opacity(0.12) + @unknown default: + return Color.black.opacity(0.07) + } + } + + private var popupOverlayGradientColors: [Color] { + switch colorScheme { + case .light: + return [ + Color.white.opacity(0.55), + Color.white.opacity(0.2), + ] + case .dark: + return [ + Color.black.opacity(0.26), + Color.black.opacity(0.14), + ] + @unknown default: + return [ + Color.white.opacity(0.55), + Color.white.opacity(0.2), + ] + } + } + + private var popupBorderGradientColors: [Color] { + switch colorScheme { + case .light: + return [ + Color.white.opacity(0.65), + Color.black.opacity(0.12), + ] + case .dark: + return [ + Color.white.opacity(0.22), + Color.white.opacity(0.06), + ] + @unknown default: + return [ + Color.white.opacity(0.65), + Color.black.opacity(0.12), + ] + } + } + + private var popupShadowColor: Color { + switch colorScheme { + case .light: + return Color.black.opacity(0.18) + case .dark: + return Color.black.opacity(0.45) + @unknown default: + return Color.black.opacity(0.18) + } + } + @ViewBuilder private var rowsView: some View { VStack(spacing: rowSpacing) { @@ -2696,18 +2792,18 @@ private struct OmnibarSuggestionsView: View { HStack(spacing: 6) { Text(item.listText) .font(.system(size: 11)) - .foregroundStyle(Color.white.opacity(0.9)) + .foregroundStyle(listTextColor) .lineLimit(1) .truncationMode(.tail) if let badge = item.trailingBadgeText { Text(badge) .font(.system(size: 9.5, weight: .medium)) - .foregroundStyle(Color.white.opacity(0.72)) + .foregroundStyle(badgeTextColor) .padding(.horizontal, 6) .padding(.vertical, 2) .background( RoundedRectangle(cornerRadius: 7, style: .continuous) - .fill(Color.white.opacity(0.08)) + .fill(badgeBackgroundColor) ) } Spacer(minLength: 0) @@ -2723,7 +2819,7 @@ private struct OmnibarSuggestionsView: View { RoundedRectangle(cornerRadius: rowHighlightCornerRadius, style: .continuous) .fill( idx == selectedIndex - ? Color.white.opacity(0.12) + ? rowHighlightColor : Color.clear ) ) @@ -2778,10 +2874,7 @@ private struct OmnibarSuggestionsView: View { RoundedRectangle(cornerRadius: popupCornerRadius, style: .continuous) .fill( LinearGradient( - colors: [ - Color.black.opacity(0.26), - Color.black.opacity(0.14), - ], + colors: popupOverlayGradientColors, startPoint: .top, endPoint: .bottom ) @@ -2792,10 +2885,7 @@ private struct OmnibarSuggestionsView: View { RoundedRectangle(cornerRadius: popupCornerRadius, style: .continuous) .stroke( LinearGradient( - colors: [ - Color.white.opacity(0.22), - Color.white.opacity(0.06), - ], + colors: popupBorderGradientColors, startPoint: .top, endPoint: .bottom ), @@ -2803,7 +2893,7 @@ private struct OmnibarSuggestionsView: View { ) ) .clipShape(RoundedRectangle(cornerRadius: popupCornerRadius, style: .continuous)) - .shadow(color: Color.black.opacity(0.45), radius: 20, y: 10) + .shadow(color: popupShadowColor, radius: 20, y: 10) .contentShape(RoundedRectangle(cornerRadius: popupCornerRadius, style: .continuous)) .accessibilityElement(children: .contain) .accessibilityRespondsToUserInteraction(true) From 011abb62c9208170243c9f99f452baeb21975b48 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:10:02 -0800 Subject: [PATCH 142/214] Refine command palette focus restore and shortcut gating --- Sources/AppDelegate.swift | 54 ++++++++ Sources/ContentView.swift | 51 +++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 120 ++++++++++++++++++ 3 files changed, 224 insertions(+), 1 deletion(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index ef7215c0..28c72ae1 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -315,6 +315,42 @@ func commandPaletteSelectionDeltaForKeyboardNavigation( return nil } +func shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: Bool, + normalizedFlags: NSEvent.ModifierFlags, + chars: String, + keyCode: UInt16 +) -> Bool { + guard isCommandPaletteVisible else { return false } + guard normalizedFlags.contains(.command) else { return false } + + let normalizedChars = chars.lowercased() + + if normalizedFlags == [.command] { + if normalizedChars == "a" + || normalizedChars == "c" + || normalizedChars == "v" + || normalizedChars == "x" + || normalizedChars == "z" + || normalizedChars == "y" { + return false + } + + switch keyCode { + case 51, 117, 123, 124: + return false + default: + break + } + } + + if normalizedFlags == [.command, .shift], normalizedChars == "z" { + return false + } + + return true +} + enum BrowserZoomShortcutAction: Equatable { case zoomIn case zoomOut @@ -2578,6 +2614,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } + if shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: activeCommandPaletteWindow() != nil, + normalizedFlags: normalizedFlags, + chars: chars, + keyCode: event.keyCode + ) { + return true + } + if normalizedFlags == [.command], chars == "q" { return handleQuitShortcutWarning() } @@ -3100,6 +3145,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent NotificationCenter.default.post(name: .browserFocusAddressBar, object: panel.id) } + func focusedBrowserAddressBarPanelId() -> UUID? { + browserAddressBarFocusedPanelId + } + + @discardableResult + func requestBrowserAddressBarFocus(panelId: UUID) -> Bool { + focusBrowserAddressBar(panelId: panelId) + } + private func shouldBypassAppShortcutForFocusedBrowserAddressBar( flags: NSEvent.ModifierFlags, chars: String diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 55e8ec22..dd0b9520 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -1169,9 +1169,15 @@ struct ContentView: View { } } + private enum CommandPaletteRestoreFocusIntent { + case panel + case browserAddressBar + } + private struct CommandPaletteRestoreFocusTarget { let workspaceId: UUID let panelId: UUID + let intent: CommandPaletteRestoreFocusIntent } private enum CommandPaletteInputFocusTarget { @@ -4137,6 +4143,14 @@ struct ContentView: View { return false } + static func shouldRestoreBrowserAddressBarAfterCommandPaletteDismiss( + focusedPanelIsBrowser: Bool, + focusedBrowserAddressBarPanelId: UUID?, + focusedPanelId: UUID + ) -> Bool { + focusedPanelIsBrowser && focusedBrowserAddressBarPanelId == focusedPanelId + } + private func syncCommandPaletteDebugStateForObservedWindow() { guard let window = observedWindow ?? NSApp.keyWindow ?? NSApp.mainWindow else { return } AppDelegate.shared?.setCommandPaletteVisible(isCommandPalettePresented, for: window) @@ -4178,9 +4192,15 @@ struct ContentView: View { private func presentCommandPalette(initialQuery: String) { if let panelContext = focusedPanelContext { + let shouldRestoreBrowserAddressBar = Self.shouldRestoreBrowserAddressBarAfterCommandPaletteDismiss( + focusedPanelIsBrowser: panelContext.panel.panelType == .browser, + focusedBrowserAddressBarPanelId: AppDelegate.shared?.focusedBrowserAddressBarPanelId(), + focusedPanelId: panelContext.panelId + ) commandPaletteRestoreFocusTarget = CommandPaletteRestoreFocusTarget( workspaceId: panelContext.workspace.id, - panelId: panelContext.panelId + panelId: panelContext.panelId, + intent: shouldRestoreBrowserAddressBar ? .browserAddressBar : .panel ) } else { commandPaletteRestoreFocusTarget = nil @@ -4236,18 +4256,47 @@ struct ContentView: View { } tabManager.focusTab(target.workspaceId, surfaceId: target.panelId, suppressFlash: true) + if let context = focusedPanelContext, + context.workspace.id == target.workspaceId, + context.panelId == target.panelId { + restoreCommandPaletteInputFocusIfNeeded(target: target, attemptsRemaining: 6) + return + } + guard attemptsRemaining > 0 else { return } DispatchQueue.main.asyncAfter(deadline: .now() + 0.03) { guard !isCommandPalettePresented else { return } if let context = focusedPanelContext, context.workspace.id == target.workspaceId, context.panelId == target.panelId { + restoreCommandPaletteInputFocusIfNeeded(target: target, attemptsRemaining: 6) return } restoreCommandPaletteFocus(target: target, attemptsRemaining: attemptsRemaining - 1) } } + private func restoreCommandPaletteInputFocusIfNeeded( + target: CommandPaletteRestoreFocusTarget, + attemptsRemaining: Int + ) { + guard !isCommandPalettePresented else { return } + guard target.intent == .browserAddressBar else { return } + guard attemptsRemaining > 0 else { return } + guard let appDelegate = AppDelegate.shared else { return } + + if appDelegate.requestBrowserAddressBarFocus(panelId: target.panelId) { + return + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.03) { + restoreCommandPaletteInputFocusIfNeeded( + target: target, + attemptsRemaining: attemptsRemaining - 1 + ) + } + } + private func resetCommandPaletteSearchFocus() { applyCommandPaletteInputFocusPolicy(.search) } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index d74c082b..3239d633 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1581,6 +1581,126 @@ final class CommandPaletteKeyboardNavigationTests: XCTestCase { } } +final class CommandPaletteOpenShortcutConsumptionTests: XCTestCase { + func testDoesNotConsumeWhenPaletteIsNotVisible() { + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: false, + normalizedFlags: [.command], + chars: "n", + keyCode: 45 + ) + ) + } + + func testConsumesAppCommandShortcutsWhenPaletteIsVisible() { + XCTAssertTrue( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "n", + keyCode: 45 + ) + ) + XCTAssertTrue( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "t", + keyCode: 17 + ) + ) + XCTAssertTrue( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command, .shift], + chars: ",", + keyCode: 43 + ) + ) + } + + func testAllowsClipboardAndUndoShortcutsForPaletteTextEditing() { + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "v", + keyCode: 9 + ) + ) + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "z", + keyCode: 6 + ) + ) + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command, .shift], + chars: "z", + keyCode: 6 + ) + ) + } + + func testAllowsArrowAndDeleteEditingCommandsForPaletteTextEditing() { + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "", + keyCode: 123 + ) + ) + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "", + keyCode: 51 + ) + ) + } +} + +final class CommandPaletteRestoreFocusStateMachineTests: XCTestCase { + func testRestoresBrowserAddressBarWhenPaletteOpenedFromFocusedAddressBar() { + let panelId = UUID() + XCTAssertTrue( + ContentView.shouldRestoreBrowserAddressBarAfterCommandPaletteDismiss( + focusedPanelIsBrowser: true, + focusedBrowserAddressBarPanelId: panelId, + focusedPanelId: panelId + ) + ) + } + + func testDoesNotRestoreBrowserAddressBarWhenFocusedPanelIsNotBrowser() { + let panelId = UUID() + XCTAssertFalse( + ContentView.shouldRestoreBrowserAddressBarAfterCommandPaletteDismiss( + focusedPanelIsBrowser: false, + focusedBrowserAddressBarPanelId: panelId, + focusedPanelId: panelId + ) + ) + } + + func testDoesNotRestoreBrowserAddressBarWhenAnotherPanelHadAddressBarFocus() { + XCTAssertFalse( + ContentView.shouldRestoreBrowserAddressBarAfterCommandPaletteDismiss( + focusedPanelIsBrowser: true, + focusedBrowserAddressBarPanelId: UUID(), + focusedPanelId: UUID() + ) + ) + } +} + final class CommandPaletteRenameSelectionSettingsTests: XCTestCase { private let suiteName = "cmux.tests.commandPaletteRenameSelection.\(UUID().uuidString)" From 0dee87826816f8a1a28ceb86a04d972e5168f407 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:14:32 -0800 Subject: [PATCH 143/214] Fix light-mode sidebar typing indicator contrast --- Sources/ContentView.swift | 26 +++++++++++++-- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 32 +++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index dd0b9520..7a6c5d8d 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -28,6 +28,19 @@ private func coloredCircleImage(color: NSColor) -> NSImage { return image } +func sidebarStatusPillActiveForegroundNSColor( + colorScheme: ColorScheme, + opacity: CGFloat +) -> NSColor { + let clampedOpacity = max(0, min(opacity, 1)) + switch colorScheme { + case .dark: + return NSColor.white.withAlphaComponent(clampedOpacity) + default: + return NSColor.black.withAlphaComponent(clampedOpacity) + } +} + struct ShortcutHintPillBackground: View { var emphasis: Double = 1.0 @@ -6768,12 +6781,13 @@ private struct SidebarStatusPillsRow: View { let onFocus: () -> Void @State private var isExpanded: Bool = false + @Environment(\.colorScheme) private var colorScheme var body: some View { VStack(alignment: .leading, spacing: 2) { Text(statusText) .font(.system(size: 10)) - .foregroundColor(isActive ? .white.opacity(0.8) : .secondary) + .foregroundColor(isActive ? activePrimaryTextColor : .secondary) .lineLimit(isExpanded ? nil : 3) .truncationMode(.tail) .multilineTextAlignment(.leading) @@ -6796,13 +6810,21 @@ private struct SidebarStatusPillsRow: View { } .buttonStyle(.plain) .font(.system(size: 10, weight: .semibold)) - .foregroundColor(isActive ? .white.opacity(0.65) : .secondary.opacity(0.9)) + .foregroundColor(isActive ? activeSecondaryTextColor : .secondary.opacity(0.9)) .frame(maxWidth: .infinity, alignment: .leading) } } .help(statusText) } + private var activePrimaryTextColor: Color { + Color(nsColor: sidebarStatusPillActiveForegroundNSColor(colorScheme: colorScheme, opacity: 0.8)) + } + + private var activeSecondaryTextColor: Color { + Color(nsColor: sidebarStatusPillActiveForegroundNSColor(colorScheme: colorScheme, opacity: 0.65)) + } + private var statusText: String { entries .map { entry in diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 3239d633..99a27709 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -773,6 +773,38 @@ final class BrowserPanelOmnibarPillBackgroundColorTests: XCTestCase { } } +final class SidebarStatusPillActiveForegroundColorTests: XCTestCase { + func testLightModeUsesBlackWithRequestedOpacity() { + guard let color = sidebarStatusPillActiveForegroundNSColor( + colorScheme: .light, + opacity: 0.8 + ).usingColorSpace(.sRGB) else { + XCTFail("Expected sRGB-convertible color") + return + } + + XCTAssertEqual(color.redComponent, 0, accuracy: 0.001) + XCTAssertEqual(color.greenComponent, 0, accuracy: 0.001) + XCTAssertEqual(color.blueComponent, 0, accuracy: 0.001) + XCTAssertEqual(color.alphaComponent, 0.8, accuracy: 0.001) + } + + func testDarkModeUsesWhiteWithRequestedOpacity() { + guard let color = sidebarStatusPillActiveForegroundNSColor( + colorScheme: .dark, + opacity: 0.65 + ).usingColorSpace(.sRGB) else { + XCTFail("Expected sRGB-convertible color") + return + } + + XCTAssertEqual(color.redComponent, 1, accuracy: 0.001) + XCTAssertEqual(color.greenComponent, 1, accuracy: 0.001) + XCTAssertEqual(color.blueComponent, 1, accuracy: 0.001) + XCTAssertEqual(color.alphaComponent, 0.65, accuracy: 0.001) + } +} + final class BrowserDeveloperToolsShortcutDefaultsTests: XCTestCase { func testSafariDefaultShortcutForToggleDeveloperTools() { let shortcut = KeyboardShortcutSettings.Action.toggleBrowserDeveloperTools.defaultShortcut From e9de2fa2ea32b4af74f2177787c6920eed024eb9 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:18:43 -0800 Subject: [PATCH 144/214] Add star history chart to README --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index e2c10ae0..9122c289 100644 --- a/README.md +++ b/README.md @@ -194,6 +194,16 @@ Browser developer-tool shortcuts follow Safari defaults and are customizable in cmux NIGHTLY is a separate app with its own bundle ID, so it runs alongside the stable version. Built automatically from the latest `main` commit and auto-updates via its own Sparkle feed. +## Star History + +<a href="https://star-history.com/#manaflow-ai/cmux&Date"> + <picture> + <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=manaflow-ai/cmux&type=Date&theme=dark" /> + <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=manaflow-ai/cmux&type=Date" /> + <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=manaflow-ai/cmux&type=Date" width="600" /> + </picture> +</a> + ## Community - [Discord](https://discord.gg/xsgFEVrWCZ) From 666ef75d1eaff174dbd22d42160d2762bfaa3c48 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:22:39 -0800 Subject: [PATCH 145/214] Fix light-mode typing indicator contrast in active sidebar --- Sources/ContentView.swift | 41 ++++++++++--------- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 24 ++++++----- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 7a6c5d8d..a57755cf 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -28,17 +28,14 @@ private func coloredCircleImage(color: NSColor) -> NSImage { return image } -func sidebarStatusPillActiveForegroundNSColor( - colorScheme: ColorScheme, - opacity: CGFloat +func sidebarActiveForegroundNSColor( + opacity: CGFloat, + appAppearance: NSAppearance? = NSApp?.effectiveAppearance ) -> NSColor { let clampedOpacity = max(0, min(opacity, 1)) - switch colorScheme { - case .dark: - return NSColor.white.withAlphaComponent(clampedOpacity) - default: - return NSColor.black.withAlphaComponent(clampedOpacity) - } + let bestMatch = appAppearance?.bestMatch(from: [.darkAqua, .aqua]) + let baseColor: NSColor = (bestMatch == .darkAqua) ? .white : .black + return baseColor.withAlphaComponent(clampedOpacity) } struct ShortcutHintPillBackground: View { @@ -5929,11 +5926,13 @@ private struct TabItemView: View { } private var activePrimaryTextColor: Color { - usesInvertedActiveForeground ? .white : .primary + usesInvertedActiveForeground ? Color(nsColor: sidebarActiveForegroundNSColor(opacity: 1.0)) : .primary } private func activeSecondaryColor(_ opacity: Double = 0.75) -> Color { - usesInvertedActiveForeground ? .white.opacity(opacity) : .secondary + usesInvertedActiveForeground + ? Color(nsColor: sidebarActiveForegroundNSColor(opacity: CGFloat(opacity))) + : .secondary } private var activeUnreadBadgeFillColor: Color { @@ -6676,11 +6675,16 @@ private struct TabItemView: View { private func logLevelColor(_ level: SidebarLogLevel, isActive: Bool) -> Color { if isActive { switch level { - case .info: return .white.opacity(0.5) - case .progress: return .white.opacity(0.8) - case .success: return .white.opacity(0.9) - case .warning: return .white.opacity(0.9) - case .error: return .white.opacity(0.9) + case .info: + return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.5)) + case .progress: + return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.8)) + case .success: + return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9)) + case .warning: + return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9)) + case .error: + return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9)) } } switch level { @@ -6781,7 +6785,6 @@ private struct SidebarStatusPillsRow: View { let onFocus: () -> Void @State private var isExpanded: Bool = false - @Environment(\.colorScheme) private var colorScheme var body: some View { VStack(alignment: .leading, spacing: 2) { @@ -6818,11 +6821,11 @@ private struct SidebarStatusPillsRow: View { } private var activePrimaryTextColor: Color { - Color(nsColor: sidebarStatusPillActiveForegroundNSColor(colorScheme: colorScheme, opacity: 0.8)) + Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.8)) } private var activeSecondaryTextColor: Color { - Color(nsColor: sidebarStatusPillActiveForegroundNSColor(colorScheme: colorScheme, opacity: 0.65)) + Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.65)) } private var statusText: String { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 99a27709..8484c957 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -773,12 +773,13 @@ final class BrowserPanelOmnibarPillBackgroundColorTests: XCTestCase { } } -final class SidebarStatusPillActiveForegroundColorTests: XCTestCase { - func testLightModeUsesBlackWithRequestedOpacity() { - guard let color = sidebarStatusPillActiveForegroundNSColor( - colorScheme: .light, - opacity: 0.8 - ).usingColorSpace(.sRGB) else { +final class SidebarActiveForegroundColorTests: XCTestCase { + func testLightAppearanceUsesBlackWithRequestedOpacity() { + guard let lightAppearance = NSAppearance(named: .aqua), + let color = sidebarActiveForegroundNSColor( + opacity: 0.8, + appAppearance: lightAppearance + ).usingColorSpace(.sRGB) else { XCTFail("Expected sRGB-convertible color") return } @@ -789,11 +790,12 @@ final class SidebarStatusPillActiveForegroundColorTests: XCTestCase { XCTAssertEqual(color.alphaComponent, 0.8, accuracy: 0.001) } - func testDarkModeUsesWhiteWithRequestedOpacity() { - guard let color = sidebarStatusPillActiveForegroundNSColor( - colorScheme: .dark, - opacity: 0.65 - ).usingColorSpace(.sRGB) else { + func testDarkAppearanceUsesWhiteWithRequestedOpacity() { + guard let darkAppearance = NSAppearance(named: .darkAqua), + let color = sidebarActiveForegroundNSColor( + opacity: 0.65, + appAppearance: darkAppearance + ).usingColorSpace(.sRGB) else { XCTFail("Expected sRGB-convertible color") return } From 78d1a43733f6c81d6412ac066ee1a36961fb0b6f Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:27:32 -0800 Subject: [PATCH 146/214] Persist workspace tab colors across session restore --- GhosttyTabs.xcodeproj/project.pbxproj | 8 +++--- Sources/SessionPersistence.swift | 1 + Sources/Workspace.swift | 8 +++++- cmuxTests/SessionPersistenceTests.swift | 33 +++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/GhosttyTabs.xcodeproj/project.pbxproj b/GhosttyTabs.xcodeproj/project.pbxproj index 0b100e14..7a798706 100644 --- a/GhosttyTabs.xcodeproj/project.pbxproj +++ b/GhosttyTabs.xcodeproj/project.pbxproj @@ -55,7 +55,7 @@ A5001208 /* UpdateTitlebarAccessory.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001218 /* UpdateTitlebarAccessory.swift */; }; A5001209 /* WindowToolbarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001219 /* WindowToolbarController.swift */; }; A5001240 /* WindowDecorationsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001241 /* WindowDecorationsController.swift */; }; - A5001600 /* SessionPersistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001601 /* SessionPersistence.swift */; }; + A5001610 /* SessionPersistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001611 /* SessionPersistence.swift */; }; A5001100 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A5001101 /* Assets.xcassets */; }; A5001230 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = A5001231 /* Sparkle */; }; B9000002A1B2C3D4E5F60719 /* cmux.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9000001A1B2C3D4E5F60719 /* cmux.swift */; }; @@ -184,7 +184,7 @@ A5001222 /* WindowAccessor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowAccessor.swift; sourceTree = "<group>"; }; A5001223 /* UpdateLogStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Update/UpdateLogStore.swift; sourceTree = "<group>"; }; A5001241 /* WindowDecorationsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowDecorationsController.swift; sourceTree = "<group>"; }; - A5001601 /* SessionPersistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionPersistence.swift; sourceTree = "<group>"; }; + A5001611 /* SessionPersistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionPersistence.swift; sourceTree = "<group>"; }; 818DBCD4AB69EB72573E8138 /* SidebarResizeUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarResizeUITests.swift; sourceTree = "<group>"; }; C0B4D9B1A1B2C3D4E5F60718 /* UpdatePillUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePillUITests.swift; sourceTree = "<group>"; }; A5001101 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; @@ -357,7 +357,7 @@ A5001219 /* WindowToolbarController.swift */, A5001241 /* WindowDecorationsController.swift */, A5001222 /* WindowAccessor.swift */, - A5001601 /* SessionPersistence.swift */, + A5001611 /* SessionPersistence.swift */, ); path = Sources; sourceTree = "<group>"; @@ -590,7 +590,7 @@ A5001209 /* WindowToolbarController.swift in Sources */, A5001240 /* WindowDecorationsController.swift in Sources */, A500120C /* WindowAccessor.swift in Sources */, - A5001600 /* SessionPersistence.swift in Sources */, + A5001610 /* SessionPersistence.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Sources/SessionPersistence.swift b/Sources/SessionPersistence.swift index f4459a68..d660d467 100644 --- a/Sources/SessionPersistence.swift +++ b/Sources/SessionPersistence.swift @@ -322,6 +322,7 @@ indirect enum SessionWorkspaceLayoutSnapshot: Codable, Sendable { struct SessionWorkspaceSnapshot: Codable, Sendable { var processTitle: String var customTitle: String? + var customColor: String? var isPinned: Bool var currentDirectory: String var focusedPanelId: UUID? diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index a9b8021c..1fda66ce 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -118,6 +118,7 @@ extension Workspace { return SessionWorkspaceSnapshot( processTitle: processTitle, customTitle: customTitle, + customColor: customColor, isPinned: isPinned, currentDirectory: currentDirectory, focusedPanelId: focusedPanelId, @@ -156,6 +157,7 @@ extension Workspace { applyProcessTitle(snapshot.processTitle) setCustomTitle(snapshot.customTitle) + setCustomColor(snapshot.customColor) isPinned = snapshot.isPinned statusEntries = Dictionary( @@ -1323,7 +1325,11 @@ final class Workspace: Identifiable, ObservableObject { } func setCustomColor(_ hex: String?) { - customColor = hex + if let hex { + customColor = WorkspaceTabColorSettings.normalizedHex(hex) + } else { + customColor = nil + } } func setCustomTitle(_ title: String?) { diff --git a/cmuxTests/SessionPersistenceTests.swift b/cmuxTests/SessionPersistenceTests.swift index 1fb01fa0..638e8794 100644 --- a/cmuxTests/SessionPersistenceTests.swift +++ b/cmuxTests/SessionPersistenceTests.swift @@ -25,6 +25,38 @@ final class SessionPersistenceTests: XCTestCase { XCTAssertEqual(loaded?.windows.first?.sidebar.selection, .tabs) } + func testSaveAndLoadRoundTripPreservesWorkspaceCustomColor() { + let tempDir = FileManager.default.temporaryDirectory + .appendingPathComponent("cmux-session-tests-\(UUID().uuidString)", isDirectory: true) + try? FileManager.default.createDirectory(at: tempDir, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: tempDir) } + + let snapshotURL = tempDir.appendingPathComponent("session.json", isDirectory: false) + var snapshot = makeSnapshot(version: SessionSnapshotSchema.currentVersion) + snapshot.windows[0].tabManager.workspaces[0].customColor = "#C0392B" + + XCTAssertTrue(SessionPersistenceStore.save(snapshot, fileURL: snapshotURL)) + + let loaded = SessionPersistenceStore.load(fileURL: snapshotURL) + XCTAssertEqual( + loaded?.windows.first?.tabManager.workspaces.first?.customColor, + "#C0392B" + ) + } + + func testWorkspaceCustomColorDecodeSupportsMissingLegacyField() throws { + var snapshot = makeSnapshot(version: SessionSnapshotSchema.currentVersion) + snapshot.windows[0].tabManager.workspaces[0].customColor = nil + + let encoder = JSONEncoder() + let data = try encoder.encode(snapshot) + let json = try XCTUnwrap(String(data: data, encoding: .utf8)) + XCTAssertFalse(json.contains("\"customColor\"")) + + let decoded = try JSONDecoder().decode(AppSessionSnapshot.self, from: data) + XCTAssertNil(decoded.windows.first?.tabManager.workspaces.first?.customColor) + } + func testLoadRejectsSchemaVersionMismatch() { let tempDir = FileManager.default.temporaryDirectory .appendingPathComponent("cmux-session-tests-\(UUID().uuidString)", isDirectory: true) @@ -442,6 +474,7 @@ final class SessionPersistenceTests: XCTestCase { let workspace = SessionWorkspaceSnapshot( processTitle: "Terminal", customTitle: "Restored", + customColor: nil, isPinned: true, currentDirectory: "/tmp", focusedPanelId: nil, From 89756bad658666794f6e0fe41d00e5a0aebfdfe6 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:28:48 -0800 Subject: [PATCH 147/214] Fix command palette caret color in light mode --- Sources/ContentView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index a57755cf..dc0adaaf 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -2465,7 +2465,7 @@ struct ContentView: View { TextField(commandPaletteSearchPlaceholder, text: $commandPaletteQuery) .textFieldStyle(.plain) .font(.system(size: 13, weight: .regular)) - .tint(.white) + .tint(Color(nsColor: sidebarActiveForegroundNSColor(opacity: 1.0))) .focused($isCommandPaletteSearchFocused) .onSubmit { runSelectedCommandPaletteResult(visibleResults: visibleResults) @@ -2618,7 +2618,7 @@ struct ContentView: View { TextField(target.placeholder, text: $commandPaletteRenameDraft) .textFieldStyle(.plain) .font(.system(size: 13, weight: .regular)) - .tint(.white) + .tint(Color(nsColor: sidebarActiveForegroundNSColor(opacity: 1.0))) .focused($isCommandPaletteRenameFocused) .backport.onKeyPress(.delete) { modifiers in handleCommandPaletteRenameDeleteBackward(modifiers: modifiers) From b57087f796653b966d8b6c59517920fdcd13c336 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:05:34 -0800 Subject: [PATCH 148/214] Implement cross-window tab and workspace move UI --- Sources/AppDelegate.swift | 301 ++++++++++++++++++++++++++++++++++++++ Sources/ContentView.swift | 148 +++++++++++++++++++ Sources/Workspace.swift | 125 ++++++++++++++++ vendor/bonsplit | 2 +- 4 files changed, 575 insertions(+), 1 deletion(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 28c72ae1..2a7a3d86 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -959,6 +959,29 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent let selectedWorkspaceId: UUID? } + struct WindowMoveTarget: Identifiable { + let windowId: UUID + let label: String + let tabManager: TabManager + let isCurrentWindow: Bool + + var id: UUID { windowId } + } + + struct WorkspaceMoveTarget: Identifiable { + let windowId: UUID + let workspaceId: UUID + let windowLabel: String + let workspaceTitle: String + let tabManager: TabManager + let isCurrentWindow: Bool + + var id: String { "\(windowId.uuidString):\(workspaceId.uuidString)" } + var label: String { + isCurrentWindow ? workspaceTitle : "\(workspaceTitle) (\(windowLabel))" + } + } + func listMainWindowSummaries() -> [MainWindowSummary] { let contexts = Array(mainWindowContexts.values) return contexts.map { ctx in @@ -973,6 +996,235 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } } + func windowMoveTargets(referenceWindowId: UUID?) -> [WindowMoveTarget] { + let orderedSummaries = orderedMainWindowSummaries(referenceWindowId: referenceWindowId) + let labels = windowLabelsById(orderedSummaries: orderedSummaries, referenceWindowId: referenceWindowId) + return orderedSummaries.compactMap { summary in + guard let manager = tabManagerFor(windowId: summary.windowId) else { return nil } + let label = labels[summary.windowId] ?? "Window" + return WindowMoveTarget( + windowId: summary.windowId, + label: label, + tabManager: manager, + isCurrentWindow: summary.windowId == referenceWindowId + ) + } + } + + func workspaceMoveTargets(excludingWorkspaceId: UUID? = nil, referenceWindowId: UUID?) -> [WorkspaceMoveTarget] { + let orderedSummaries = orderedMainWindowSummaries(referenceWindowId: referenceWindowId) + let labels = windowLabelsById(orderedSummaries: orderedSummaries, referenceWindowId: referenceWindowId) + + var targets: [WorkspaceMoveTarget] = [] + targets.reserveCapacity(orderedSummaries.reduce(0) { partial, summary in + partial + summary.workspaceCount + }) + + for summary in orderedSummaries { + guard let manager = tabManagerFor(windowId: summary.windowId) else { continue } + let windowLabel = labels[summary.windowId] ?? "Window" + let isCurrentWindow = summary.windowId == referenceWindowId + for workspace in manager.tabs { + if workspace.id == excludingWorkspaceId { + continue + } + targets.append( + WorkspaceMoveTarget( + windowId: summary.windowId, + workspaceId: workspace.id, + windowLabel: windowLabel, + workspaceTitle: workspaceDisplayName(workspace), + tabManager: manager, + isCurrentWindow: isCurrentWindow + ) + ) + } + } + + return targets + } + + @discardableResult + func moveWorkspaceToWindow(workspaceId: UUID, windowId: UUID, focus: Bool = true) -> Bool { + guard let sourceManager = tabManagerFor(tabId: workspaceId), + let destinationManager = tabManagerFor(windowId: windowId) else { + return false + } + + if sourceManager === destinationManager { + if focus { + destinationManager.focusTab(workspaceId, suppressFlash: true) + _ = focusMainWindow(windowId: windowId) + TerminalController.shared.setActiveTabManager(destinationManager) + } + return true + } + + guard let workspace = sourceManager.detachWorkspace(tabId: workspaceId) else { return false } + destinationManager.attachWorkspace(workspace, select: focus) + + if focus { + _ = focusMainWindow(windowId: windowId) + TerminalController.shared.setActiveTabManager(destinationManager) + } + return true + } + + @discardableResult + func moveWorkspaceToNewWindow(workspaceId: UUID, focus: Bool = true) -> UUID? { + let windowId = createMainWindow() + guard let destinationManager = tabManagerFor(windowId: windowId) else { return nil } + let bootstrapWorkspaceId = destinationManager.tabs.first?.id + + guard moveWorkspaceToWindow(workspaceId: workspaceId, windowId: windowId, focus: focus) else { + _ = closeMainWindow(windowId: windowId) + return nil + } + + // Remove the bootstrap workspace from the new window once the moved workspace arrives. + if let bootstrapWorkspaceId, + bootstrapWorkspaceId != workspaceId, + let bootstrapWorkspace = destinationManager.tabs.first(where: { $0.id == bootstrapWorkspaceId }), + destinationManager.tabs.count > 1 { + destinationManager.closeWorkspace(bootstrapWorkspace) + } + return windowId + } + + func locateBonsplitSurface(tabId: UUID) -> (windowId: UUID, workspaceId: UUID, panelId: UUID, tabManager: TabManager)? { + let bonsplitTabId = TabID(uuid: tabId) + for context in mainWindowContexts.values { + for workspace in context.tabManager.tabs { + if let panelId = workspace.panelIdFromSurfaceId(bonsplitTabId) { + return (context.windowId, workspace.id, panelId, context.tabManager) + } + } + } + return nil + } + + @discardableResult + func moveSurface( + panelId: UUID, + toWorkspace targetWorkspaceId: UUID, + targetPane: PaneID? = nil, + targetIndex: Int? = nil, + splitTarget: (orientation: SplitOrientation, insertFirst: Bool)? = nil, + focus: Bool = true, + focusWindow: Bool = true + ) -> Bool { + guard let source = locateSurface(surfaceId: panelId), + let sourceWorkspace = source.tabManager.tabs.first(where: { $0.id == source.workspaceId }), + let destinationManager = tabManagerFor(tabId: targetWorkspaceId), + let destinationWorkspace = destinationManager.tabs.first(where: { $0.id == targetWorkspaceId }) else { + return false + } + + let resolvedTargetPane = targetPane.flatMap { pane in + destinationWorkspace.bonsplitController.allPaneIds.first(where: { $0 == pane }) + } ?? destinationWorkspace.bonsplitController.focusedPaneId + ?? destinationWorkspace.bonsplitController.allPaneIds.first + + guard let resolvedTargetPane else { return false } + + if destinationWorkspace.id == sourceWorkspace.id { + if let splitTarget { + guard let sourceTabId = sourceWorkspace.surfaceIdFromPanelId(panelId), + sourceWorkspace.bonsplitController.splitPane( + resolvedTargetPane, + orientation: splitTarget.orientation, + movingTab: sourceTabId, + insertFirst: splitTarget.insertFirst + ) != nil else { + return false + } + if focus { + source.tabManager.focusTab(sourceWorkspace.id, surfaceId: panelId, suppressFlash: true) + } + return true + } + + return sourceWorkspace.moveSurface( + panelId: panelId, + toPane: resolvedTargetPane, + atIndex: targetIndex, + focus: focus + ) + } + + let sourcePane = sourceWorkspace.paneId(forPanelId: panelId) + let sourceIndex = sourceWorkspace.indexInPane(forPanelId: panelId) + + guard let detached = sourceWorkspace.detachSurface(panelId: panelId) else { return false } + guard destinationWorkspace.attachDetachedSurface( + detached, + inPane: resolvedTargetPane, + atIndex: targetIndex, + focus: focus + ) != nil else { + rollbackDetachedSurface( + detached, + to: sourceWorkspace, + sourcePane: sourcePane, + sourceIndex: sourceIndex, + focus: focus + ) + return false + } + + if let splitTarget { + guard let movedTabId = destinationWorkspace.surfaceIdFromPanelId(panelId), + destinationWorkspace.bonsplitController.splitPane( + resolvedTargetPane, + orientation: splitTarget.orientation, + movingTab: movedTabId, + insertFirst: splitTarget.insertFirst + ) != nil else { + if let detachedFromDestination = destinationWorkspace.detachSurface(panelId: panelId) { + rollbackDetachedSurface( + detachedFromDestination, + to: sourceWorkspace, + sourcePane: sourcePane, + sourceIndex: sourceIndex, + focus: focus + ) + } + return false + } + } + + if focus { + if focusWindow, let destinationWindowId = windowId(for: destinationManager) { + _ = focusMainWindow(windowId: destinationWindowId) + } + destinationManager.focusTab(targetWorkspaceId, surfaceId: panelId, suppressFlash: true) + } + + return true + } + + @discardableResult + func moveBonsplitTab( + tabId: UUID, + toWorkspace targetWorkspaceId: UUID, + targetPane: PaneID? = nil, + targetIndex: Int? = nil, + splitTarget: (orientation: SplitOrientation, insertFirst: Bool)? = nil, + focus: Bool = true, + focusWindow: Bool = true + ) -> Bool { + guard let located = locateBonsplitSurface(tabId: tabId) else { return false } + return moveSurface( + panelId: located.panelId, + toWorkspace: targetWorkspaceId, + targetPane: targetPane, + targetIndex: targetIndex, + splitTarget: splitTarget, + focus: focus, + focusWindow: focusWindow + ) + } + func tabManagerFor(windowId: UUID) -> TabManager? { mainWindowContexts.values.first(where: { $0.windowId == windowId })?.tabManager } @@ -1134,6 +1386,55 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } + private func orderedMainWindowSummaries(referenceWindowId: UUID?) -> [MainWindowSummary] { + let summaries = listMainWindowSummaries() + return summaries.sorted { lhs, rhs in + let lhsIsReference = lhs.windowId == referenceWindowId + let rhsIsReference = rhs.windowId == referenceWindowId + if lhsIsReference != rhsIsReference { return lhsIsReference } + if lhs.isKeyWindow != rhs.isKeyWindow { return lhs.isKeyWindow } + if lhs.isVisible != rhs.isVisible { return lhs.isVisible } + return lhs.windowId.uuidString < rhs.windowId.uuidString + } + } + + private func windowLabelsById(orderedSummaries: [MainWindowSummary], referenceWindowId: UUID?) -> [UUID: String] { + var labels: [UUID: String] = [:] + for (index, summary) in orderedSummaries.enumerated() { + if summary.windowId == referenceWindowId { + labels[summary.windowId] = "Current Window" + } else { + labels[summary.windowId] = "Window \(index + 1)" + } + } + return labels + } + + private func workspaceDisplayName(_ workspace: Workspace) -> String { + let trimmed = workspace.title.trimmingCharacters(in: .whitespacesAndNewlines) + return trimmed.isEmpty ? "Workspace" : trimmed + } + + private func rollbackDetachedSurface( + _ detached: Workspace.DetachedSurfaceTransfer, + to workspace: Workspace, + sourcePane: PaneID?, + sourceIndex: Int?, + focus: Bool + ) { + let rollbackPane = sourcePane.flatMap { pane in + workspace.bonsplitController.allPaneIds.first(where: { $0 == pane }) + } ?? workspace.bonsplitController.focusedPaneId + ?? workspace.bonsplitController.allPaneIds.first + guard let rollbackPane else { return } + _ = workspace.attachDetachedSurface( + detached, + inPane: rollbackPane, + atIndex: sourceIndex, + focus: focus + ) + } + private func windowForMainWindowId(_ windowId: UUID) -> NSWindow? { if let ctx = mainWindowContexts.values.first(where: { $0.windowId == windowId }), let window = ctx.window { diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index dc0adaaf..9c73af0e 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -6239,6 +6239,12 @@ private struct TabItemView: View { dragAutoScrollController: dragAutoScrollController, dropIndicator: $dropIndicator )) + .onDrop(of: [BonsplitTabDragPayload.typeIdentifier], delegate: SidebarBonsplitTabDropDelegate( + targetWorkspaceId: tab.id, + tabManager: tabManager, + selectedTabIds: $selectedTabIds, + lastSidebarSelectionIndex: $lastSidebarSelectionIndex + )) .onTapGesture { updateSelection() } @@ -6342,6 +6348,28 @@ private struct TabItemView: View { } .disabled(targetIds.isEmpty) + let referenceWindowId = AppDelegate.shared?.windowId(for: tabManager) + let windowMoveTargets = AppDelegate.shared?.windowMoveTargets(referenceWindowId: referenceWindowId) ?? [] + let moveMenuTitle = targetIds.count > 1 ? "Move Workspaces to Window" : "Move Workspace to Window" + Menu(moveMenuTitle) { + Button("New Window") { + moveWorkspacesToNewWindow(targetIds) + } + .disabled(targetIds.isEmpty) + + if !windowMoveTargets.isEmpty { + Divider() + } + + ForEach(windowMoveTargets) { target in + Button(target.label) { + moveWorkspaces(targetIds, toWindow: target.windowId) + } + .disabled(target.isCurrentWindow || targetIds.isEmpty) + } + } + .disabled(targetIds.isEmpty) + Divider() if let key = closeWorkspaceShortcut.keyEquivalent { @@ -6570,6 +6598,43 @@ private struct TabItemView: View { } } + private func moveWorkspaces(_ workspaceIds: [UUID], toWindow windowId: UUID) { + guard let app = AppDelegate.shared else { return } + let orderedWorkspaceIds = tabManager.tabs.compactMap { workspaceIds.contains($0.id) ? $0.id : nil } + guard !orderedWorkspaceIds.isEmpty else { return } + + for (index, workspaceId) in orderedWorkspaceIds.enumerated() { + let shouldFocus = index == orderedWorkspaceIds.count - 1 + _ = app.moveWorkspaceToWindow(workspaceId: workspaceId, windowId: windowId, focus: shouldFocus) + } + + selectedTabIds.subtract(orderedWorkspaceIds) + syncSelectionAfterMutation() + } + + private func moveWorkspacesToNewWindow(_ workspaceIds: [UUID]) { + guard let app = AppDelegate.shared else { return } + let orderedWorkspaceIds = tabManager.tabs.compactMap { workspaceIds.contains($0.id) ? $0.id : nil } + guard let firstWorkspaceId = orderedWorkspaceIds.first else { return } + + let shouldFocusImmediately = orderedWorkspaceIds.count == 1 + guard let newWindowId = app.moveWorkspaceToNewWindow(workspaceId: firstWorkspaceId, focus: shouldFocusImmediately) else { + return + } + + if orderedWorkspaceIds.count > 1 { + for workspaceId in orderedWorkspaceIds.dropFirst() { + _ = app.moveWorkspaceToWindow(workspaceId: workspaceId, windowId: newWindowId, focus: false) + } + if let finalWorkspaceId = orderedWorkspaceIds.last { + _ = app.moveWorkspaceToWindow(workspaceId: finalWorkspaceId, windowId: newWindowId, focus: true) + } + } + + selectedTabIds.subtract(orderedWorkspaceIds) + syncSelectionAfterMutation() + } + private var latestNotificationText: String? { guard let notification = notificationStore.latestNotification(forTabId: tab.id) else { return nil } let text = notification.body.isEmpty ? notification.title : notification.body @@ -7127,6 +7192,89 @@ private enum SidebarTabDragPayload { } } +private enum BonsplitTabDragPayload { + static let typeIdentifier = "com.splittabbar.tabtransfer" + + struct Transfer: Decodable { + struct TabInfo: Decodable { + let id: UUID + } + + let tab: TabInfo + let sourcePaneId: UUID + } + + static func currentTransfer() -> Transfer? { + let pasteboard = NSPasteboard(name: .drag) + let type = NSPasteboard.PasteboardType(typeIdentifier) + + if let data = pasteboard.data(forType: type), + let transfer = try? JSONDecoder().decode(Transfer.self, from: data) { + return transfer + } + + if let raw = pasteboard.string(forType: type), + let data = raw.data(using: .utf8), + let transfer = try? JSONDecoder().decode(Transfer.self, from: data) { + return transfer + } + + return nil + } +} + +private struct SidebarBonsplitTabDropDelegate: DropDelegate { + let targetWorkspaceId: UUID + let tabManager: TabManager + @Binding var selectedTabIds: Set<UUID> + @Binding var lastSidebarSelectionIndex: Int? + + func validateDrop(info: DropInfo) -> Bool { + guard info.hasItemsConforming(to: [BonsplitTabDragPayload.typeIdentifier]) else { return false } + return BonsplitTabDragPayload.currentTransfer() != nil + } + + func dropUpdated(info: DropInfo) -> DropProposal? { + guard validateDrop(info: info) else { return nil } + return DropProposal(operation: .move) + } + + func performDrop(info: DropInfo) -> Bool { + guard validateDrop(info: info), + let transfer = BonsplitTabDragPayload.currentTransfer(), + let app = AppDelegate.shared else { + return false + } + + if let source = app.locateBonsplitSurface(tabId: transfer.tab.id), + source.workspaceId == targetWorkspaceId { + syncSidebarSelection() + return true + } + + guard app.moveBonsplitTab( + tabId: transfer.tab.id, + toWorkspace: targetWorkspaceId, + focus: true, + focusWindow: true + ) else { + return false + } + + selectedTabIds = [targetWorkspaceId] + syncSidebarSelection() + return true + } + + private func syncSidebarSelection() { + if let selectedId = tabManager.selectedTabId { + lastSidebarSelectionIndex = tabManager.tabs.firstIndex { $0.id == selectedId } + } else { + lastSidebarSelectionIndex = nil + } + } +} + private struct SidebarTabDropDelegate: DropDelegate { let targetTabId: UUID? let tabManager: TabManager diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 9697b271..fe19f64c 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -506,6 +506,10 @@ final class Workspace: Identifiable, ObservableObject { bonsplitController.closeTab(welcomeTabId) } + bonsplitController.onExternalTabDrop = { [weak self] request in + self?.handleExternalTabDrop(request) ?? false + } + // Set ourselves as delegate bonsplitController.delegate = self @@ -2224,6 +2228,122 @@ final class Workspace: Identifiable, ObservableObject { setPanelCustomTitle(panelId: panelId, title: input.stringValue) } + private enum PanelMoveDestination { + case newWorkspaceInCurrentWindow + case selectedWorkspaceInNewWindow + case existingWorkspace(UUID) + } + + private func promptMovePanel(tabId: TabID) { + guard let panelId = panelIdFromSurfaceId(tabId), + let app = AppDelegate.shared else { return } + + let currentWindowId = app.tabManagerFor(tabId: id).flatMap { app.windowId(for: $0) } + let workspaceTargets = app.workspaceMoveTargets( + excludingWorkspaceId: id, + referenceWindowId: currentWindowId + ) + + var options: [(title: String, destination: PanelMoveDestination)] = [ + ("New Workspace in Current Window", .newWorkspaceInCurrentWindow), + ("Selected Workspace in New Window", .selectedWorkspaceInNewWindow), + ] + options.append(contentsOf: workspaceTargets.map { target in + (target.label, .existingWorkspace(target.workspaceId)) + }) + + let alert = NSAlert() + alert.messageText = "Move Tab" + alert.informativeText = "Choose a destination for this tab." + let popup = NSPopUpButton(frame: NSRect(x: 0, y: 0, width: 320, height: 26), pullsDown: false) + for option in options { + popup.addItem(withTitle: option.title) + } + popup.selectItem(at: 0) + alert.accessoryView = popup + alert.addButton(withTitle: "Move") + alert.addButton(withTitle: "Cancel") + + guard alert.runModal() == .alertFirstButtonReturn else { return } + let selectedIndex = max(0, min(popup.indexOfSelectedItem, options.count - 1)) + let destination = options[selectedIndex].destination + + let moved: Bool + switch destination { + case .newWorkspaceInCurrentWindow: + guard let manager = app.tabManagerFor(tabId: id) else { return } + let workspace = manager.addWorkspace(select: true) + moved = app.moveSurface( + panelId: panelId, + toWorkspace: workspace.id, + focus: true, + focusWindow: false + ) + + case .selectedWorkspaceInNewWindow: + let newWindowId = app.createMainWindow() + guard let destinationManager = app.tabManagerFor(windowId: newWindowId), + let destinationWorkspaceId = destinationManager.selectedTabId else { + return + } + moved = app.moveSurface( + panelId: panelId, + toWorkspace: destinationWorkspaceId, + focus: true, + focusWindow: true + ) + if !moved { + _ = app.closeMainWindow(windowId: newWindowId) + } + + case .existingWorkspace(let workspaceId): + moved = app.moveSurface( + panelId: panelId, + toWorkspace: workspaceId, + focus: true, + focusWindow: true + ) + } + + if !moved { + let failure = NSAlert() + failure.alertStyle = .warning + failure.messageText = "Move Failed" + failure.informativeText = "cmux could not move this tab to the selected destination." + failure.addButton(withTitle: "OK") + _ = failure.runModal() + } + } + + private func handleExternalTabDrop(_ request: BonsplitController.ExternalTabDropRequest) -> Bool { + guard let app = AppDelegate.shared else { return false } + + let targetPane: PaneID + let targetIndex: Int? + let splitTarget: (orientation: SplitOrientation, insertFirst: Bool)? + + switch request.destination { + case .insert(let paneId, let index): + targetPane = paneId + targetIndex = index + splitTarget = nil + case .split(let paneId, let orientation, let insertFirst): + targetPane = paneId + targetIndex = nil + splitTarget = (orientation, insertFirst) + } + + return app.moveBonsplitTab( + tabId: request.tabId.uuid, + toWorkspace: id, + targetPane: targetPane, + targetIndex: targetIndex, + splitTarget: splitTarget, + focus: true, + focusWindow: true + ) + } + } // MARK: - BonsplitDelegate @@ -2878,6 +2998,8 @@ extension Workspace: BonsplitDelegate { closeTabs(tabIdsToRight(of: tab.id, inPane: pane)) case .closeOthers: closeTabs(tabIdsToCloseOthers(of: tab.id, inPane: pane)) + case .move: + promptMovePanel(tabId: tab.id) case .newTerminalToRight: createTerminalToRight(of: tab.id, inPane: pane) case .newBrowserToRight: @@ -2892,6 +3014,9 @@ extension Workspace: BonsplitDelegate { guard let panelId = panelIdFromSurfaceId(tab.id) else { return } let shouldPin = !pinnedPanelIds.contains(panelId) setPanelPinned(panelId: panelId, pinned: shouldPin) + case .markAsRead: + guard let panelId = panelIdFromSurfaceId(tab.id) else { return } + clearManualUnread(panelId: panelId) case .markAsUnread: guard let panelId = panelIdFromSurfaceId(tab.id) else { return } markPanelUnread(panelId) diff --git a/vendor/bonsplit b/vendor/bonsplit index 2d0d05aa..1ec5120d 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit 2d0d05aad8e1c2c1c56c290718063f9b53408849 +Subproject commit 1ec5120d94126f5c78e20618d426ee4ef5593c70 From d8022db404a74f081d167e39b6affab6a97ebe15 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:57:10 -0800 Subject: [PATCH 149/214] Handle moving the last surface out of a window --- Sources/AppDelegate.swift | 21 ++++++++++++++ Sources/Workspace.swift | 11 ++++++-- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 28 +++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 2a7a3d86..a9735bd2 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1193,6 +1193,12 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } } + cleanupEmptySourceWorkspaceAfterSurfaceMove( + sourceWorkspace: sourceWorkspace, + sourceManager: source.tabManager, + sourceWindowId: source.windowId + ) + if focus { if focusWindow, let destinationWindowId = windowId(for: destinationManager) { _ = focusMainWindow(windowId: destinationWindowId) @@ -1435,6 +1441,21 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent ) } + private func cleanupEmptySourceWorkspaceAfterSurfaceMove( + sourceWorkspace: Workspace, + sourceManager: TabManager, + sourceWindowId: UUID + ) { + guard sourceWorkspace.panels.isEmpty else { return } + guard sourceManager.tabs.contains(where: { $0.id == sourceWorkspace.id }) else { return } + + if sourceManager.tabs.count > 1 { + sourceManager.closeWorkspace(sourceWorkspace) + } else { + _ = closeMainWindow(windowId: sourceWindowId) + } + } + private func windowForMainWindowId(_ windowId: UUID) -> NSWindow? { if let ctx = mainWindowContexts.values.first(where: { $0.windowId == windowId }), let window = ctx.window { diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index fe19f64c..79f5a14d 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -2671,9 +2671,16 @@ extension Workspace: BonsplitDelegate { lastTerminalConfigInheritancePanelId = nil } - // Keep the workspace invariant: always retain at least one real panel. - // This prevents runtime close callbacks from ever collapsing into a tabless workspace. + // Keep the workspace invariant for normal close paths. + // Detach/move flows intentionally allow a temporary empty workspace so AppDelegate can + // prune the source workspace/window after the tab is attached elsewhere. if panels.isEmpty { + if isDetaching { + scheduleTerminalGeometryReconcile() + scheduleFocusReconcile() + return + } + let replacement = createReplacementTerminalPanel() if let replacementTabId = surfaceIdFromPanelId(replacement.id), let replacementPane = bonsplitController.allPaneIds.first { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 8484c957..7e75378d 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -2898,6 +2898,34 @@ final class WorkspacePanelGitBranchTests: XCTestCase { ) } + func testDetachLastSurfaceLeavesWorkspaceTemporarilyEmptyForMoveFlow() { + let workspace = Workspace() + guard let panelId = workspace.focusedPanelId, + let paneId = workspace.paneId(forPanelId: panelId) else { + XCTFail("Expected initial panel and pane") + return + } + + XCTAssertEqual(workspace.panels.count, 1) + + guard let detached = workspace.detachSurface(panelId: panelId) else { + XCTFail("Expected detach of last surface to succeed") + return + } + + XCTAssertEqual(detached.panelId, panelId) + XCTAssertTrue( + workspace.panels.isEmpty, + "Detaching the last surface should not auto-create a replacement panel" + ) + XCTAssertNil(workspace.surfaceIdFromPanelId(panelId)) + XCTAssertEqual(workspace.bonsplitController.tabs(inPane: paneId).count, 0) + + let restoredPanelId = workspace.attachDetachedSurface(detached, inPane: paneId, focus: false) + XCTAssertEqual(restoredPanelId, panelId) + XCTAssertEqual(workspace.panels.count, 1) + } + func testBrowserSplitWithFocusFalseRecoversFromDelayedStaleSelection() { let workspace = Workspace() guard let originalFocusedPanelId = workspace.focusedPanelId else { From 2c2190b231458c04e2a95e18bdce4e42b5cf0d6e Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:33:19 -0800 Subject: [PATCH 150/214] Block tab drags across cmux app instances --- Sources/ContentView.swift | 26 ++++++++++++++++++++++++-- vendor/bonsplit | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 9c73af0e..50ebfd3c 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -7194,6 +7194,7 @@ private enum SidebarTabDragPayload { private enum BonsplitTabDragPayload { static let typeIdentifier = "com.splittabbar.tabtransfer" + private static let currentProcessId = Int32(ProcessInfo.processInfo.processIdentifier) struct Transfer: Decodable { struct TabInfo: Decodable { @@ -7202,6 +7203,25 @@ private enum BonsplitTabDragPayload { let tab: TabInfo let sourcePaneId: UUID + let sourceProcessId: Int32 + + private enum CodingKeys: String, CodingKey { + case tab + case sourcePaneId + case sourceProcessId + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.tab = try container.decode(TabInfo.self, forKey: .tab) + self.sourcePaneId = try container.decode(UUID.self, forKey: .sourcePaneId) + // Legacy payloads won't include this field. Treat as foreign process. + self.sourceProcessId = try container.decodeIfPresent(Int32.self, forKey: .sourceProcessId) ?? -1 + } + } + + private static func isCurrentProcessTransfer(_ transfer: Transfer) -> Bool { + transfer.sourceProcessId == currentProcessId } static func currentTransfer() -> Transfer? { @@ -7209,13 +7229,15 @@ private enum BonsplitTabDragPayload { let type = NSPasteboard.PasteboardType(typeIdentifier) if let data = pasteboard.data(forType: type), - let transfer = try? JSONDecoder().decode(Transfer.self, from: data) { + let transfer = try? JSONDecoder().decode(Transfer.self, from: data), + isCurrentProcessTransfer(transfer) { return transfer } if let raw = pasteboard.string(forType: type), let data = raw.data(using: .utf8), - let transfer = try? JSONDecoder().decode(Transfer.self, from: data) { + let transfer = try? JSONDecoder().decode(Transfer.self, from: data), + isCurrentProcessTransfer(transfer) { return transfer } diff --git a/vendor/bonsplit b/vendor/bonsplit index 1ec5120d..f24ba922 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit 1ec5120d94126f5c78e20618d426ee4ef5593c70 +Subproject commit f24ba9222651ecc170869662eec9a5880404a82c From 946b0f28e65b5a6a4d87d28856d62d49bbec19d1 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:48:55 -0800 Subject: [PATCH 151/214] Fix theme bg sync on appearance changes --- Sources/GhosttyTerminalView.swift | 47 ++++++++++++++++++++++++++++++ cmuxTests/GhosttyConfigTests.swift | 30 +++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 27541a3a..24002650 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -307,6 +307,7 @@ class GhosttyApp { private var backgroundEventCounter: UInt64 = 0 private var defaultBackgroundUpdateScope: GhosttyDefaultBackgroundUpdateScope = .unscoped private var defaultBackgroundScopeSource: String = "initialize" + private var lastAppearanceColorScheme: GhosttyConfig.ColorSchemePreference? private lazy var defaultBackgroundNotificationDispatcher: GhosttyDefaultBackgroundNotificationDispatcher = // Theme chrome should track terminal theme changes in the same frame. // Keep coalescing semantics, but flush in the next main turn instead of waiting ~1 frame. @@ -565,6 +566,7 @@ class GhosttyApp { } // Notify observers that a usable config is available (initial load). + lastAppearanceColorScheme = GhosttyConfig.currentColorSchemePreference() NotificationCenter.default.post(name: .ghosttyConfigDidReload, object: nil) #if os(macOS) @@ -615,6 +617,13 @@ class GhosttyApp { incomingScope.rawValue >= currentScope.rawValue } + static func shouldReloadConfigurationForAppearanceChange( + previousColorScheme: GhosttyConfig.ColorSchemePreference?, + currentColorScheme: GhosttyConfig.ColorSchemePreference + ) -> Bool { + previousColorScheme != currentColorScheme + } + private func loadLegacyGhosttyConfigIfNeeded(_ config: ghostty_config_t) { #if os(macOS) // Ghostty 1.3+ prefers `config.ghostty`, but some users still have their real @@ -671,6 +680,7 @@ class GhosttyApp { resetDefaultBackgroundUpdateScope(source: "reloadConfiguration(source=\(source))") if soft, let config { ghostty_app_update_config(app, config) + lastAppearanceColorScheme = GhosttyConfig.currentColorSchemePreference() NotificationCenter.default.post(name: .ghosttyConfigDidReload, object: nil) logThemeAction("reload end source=\(source) soft=\(soft) mode=soft") return @@ -694,10 +704,39 @@ class GhosttyApp { ghostty_config_free(oldConfig) } config = newConfig + lastAppearanceColorScheme = GhosttyConfig.currentColorSchemePreference() NotificationCenter.default.post(name: .ghosttyConfigDidReload, object: nil) logThemeAction("reload end source=\(source) soft=\(soft) mode=full") } + func synchronizeThemeWithAppearance(_ appearance: NSAppearance?, source: String) { + let currentColorScheme = GhosttyConfig.currentColorSchemePreference( + appAppearance: appearance ?? NSApp?.effectiveAppearance + ) + let shouldReload = Self.shouldReloadConfigurationForAppearanceChange( + previousColorScheme: lastAppearanceColorScheme, + currentColorScheme: currentColorScheme + ) + if backgroundLogEnabled { + let previousLabel: String + switch lastAppearanceColorScheme { + case .light: + previousLabel = "light" + case .dark: + previousLabel = "dark" + case nil: + previousLabel = "nil" + } + let currentLabel: String = currentColorScheme == .dark ? "dark" : "light" + logBackground( + "appearance sync source=\(source) previous=\(previousLabel) current=\(currentLabel) reload=\(shouldReload)" + ) + } + guard shouldReload else { return } + lastAppearanceColorScheme = currentColorScheme + reloadConfiguration(source: "appearanceSync:\(source)") + } + func openConfigurationInTextEdit() { #if os(macOS) let path = ghosttyStringValue(ghostty_config_open_path()) @@ -2280,6 +2319,10 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { updateSurfaceSize() applySurfaceBackground() applySurfaceColorScheme(force: true) + GhosttyApp.shared.synchronizeThemeWithAppearance( + effectiveAppearance, + source: "surface.viewDidMoveToWindow" + ) applyWindowBackgroundIfActive() } @@ -2292,6 +2335,10 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { ) } applySurfaceColorScheme() + GhosttyApp.shared.synchronizeThemeWithAppearance( + effectiveAppearance, + source: "surface.viewDidChangeEffectiveAppearance" + ) } fileprivate func updateOcclusionState() { diff --git a/cmuxTests/GhosttyConfigTests.swift b/cmuxTests/GhosttyConfigTests.swift index 1971d481..220767ba 100644 --- a/cmuxTests/GhosttyConfigTests.swift +++ b/cmuxTests/GhosttyConfigTests.swift @@ -195,6 +195,36 @@ final class GhosttyConfigTests: XCTestCase { ) } + func testAppearanceChangeReloadsWhenColorSchemeChanges() { + XCTAssertTrue( + GhosttyApp.shouldReloadConfigurationForAppearanceChange( + previousColorScheme: .dark, + currentColorScheme: .light + ) + ) + XCTAssertTrue( + GhosttyApp.shouldReloadConfigurationForAppearanceChange( + previousColorScheme: nil, + currentColorScheme: .dark + ) + ) + } + + func testAppearanceChangeSkipsReloadWhenColorSchemeUnchanged() { + XCTAssertFalse( + GhosttyApp.shouldReloadConfigurationForAppearanceChange( + previousColorScheme: .light, + currentColorScheme: .light + ) + ) + XCTAssertFalse( + GhosttyApp.shouldReloadConfigurationForAppearanceChange( + previousColorScheme: .dark, + currentColorScheme: .dark + ) + ) + } + func testClaudeCodeIntegrationDefaultsToEnabledWhenUnset() { let suiteName = "cmux.tests.claude-hooks.\(UUID().uuidString)" guard let defaults = UserDefaults(suiteName: suiteName) else { From 8736421e8c64ce2af2dfa51d2fb9415c79db8633 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:22:11 -0800 Subject: [PATCH 152/214] Prevent stale host visibility thrash after tab move --- Sources/GhosttyTerminalView.swift | 37 ++++++++++++++-- Sources/TerminalWindowPortal.swift | 15 +++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 42 +++++++++++++++++++ 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index f42d79ae..d5d0d719 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -4980,6 +4980,16 @@ struct GhosttyTerminalView: NSViewRepresentable { Coordinator() } + static func shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: Bool, + hostedViewHasSuperview: Bool, + isBoundToCurrentHost: Bool + ) -> Bool { + if !hostWindowAttached { return true } + if isBoundToCurrentHost { return true } + return !hostedViewHasSuperview + } + func makeNSView(context: Context) -> NSView { let container = HostContainerView() container.wantsLayer = false @@ -5022,8 +5032,6 @@ struct GhosttyTerminalView: NSViewRepresentable { // Keep the surface lifecycle and handlers updated even if we defer re-parenting. hostedView.attachSurface(terminalSurface) - hostedView.setVisibleInUI(isVisibleInUI) - hostedView.setActive(isActive) hostedView.setInactiveOverlay( color: inactiveOverlayColor, opacity: CGFloat(inactiveOverlayOpacity), @@ -5058,7 +5066,8 @@ struct GhosttyTerminalView: NSViewRepresentable { coordinator.attachGeneration += 1 let generation = coordinator.attachGeneration - if let host = nsView as? HostContainerView { + let hostContainer = nsView as? HostContainerView + if let host = hostContainer { host.onDidMoveToWindow = { [weak host, weak hostedView, weak coordinator] in guard let host, let hostedView, let coordinator else { return } guard coordinator.attachGeneration == generation else { return } @@ -5109,6 +5118,28 @@ struct GhosttyTerminalView: NSViewRepresentable { ) } } + + let hostWindowAttached = hostContainer?.window != nil + let isBoundToCurrentHost = hostContainer.map { host in + TerminalWindowPortalRegistry.isHostedView(hostedView, boundTo: host) + } ?? true + let shouldApplyImmediateHostedState = Self.shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: hostWindowAttached, + hostedViewHasSuperview: hostedView.superview != nil, + isBoundToCurrentHost: isBoundToCurrentHost + ) + + if shouldApplyImmediateHostedState { + hostedView.setVisibleInUI(isVisibleInUI) + hostedView.setActive(isActive) + } else { + // Preserve portal entry visibility while a stale host is still receiving SwiftUI updates. + // The currently bound host remains authoritative for immediate visible/active state. + TerminalWindowPortalRegistry.updateEntryVisibility( + for: hostedView, + visibleInUI: isVisibleInUI + ) + } } static func dismantleNSView(_ nsView: NSView, coordinator: Coordinator) { diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index e3f19c3d..2daddf4b 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -934,6 +934,12 @@ final class WindowTerminalPortal: NSObject { entriesByHostedId[hostedId] = entry } + func isHostedViewBoundToAnchor(withId hostedId: ObjectIdentifier, anchorView: NSView) -> Bool { + guard let entry = entriesByHostedId[hostedId], + let boundAnchor = entry.anchorView else { return false } + return boundAnchor === anchorView + } + func bind(hostedView: GhosttySurfaceScrollView, to anchorView: NSView, visibleInUI: Bool, zPriority: Int = 0) { guard ensureInstalled() else { return } @@ -1462,6 +1468,15 @@ enum TerminalWindowPortalRegistry { portal.updateEntryVisibility(forHostedId: hostedId, visibleInUI: visibleInUI) } + static func isHostedView(_ hostedView: GhosttySurfaceScrollView, boundTo anchorView: NSView) -> Bool { + let hostedId = ObjectIdentifier(hostedView) + guard let window = anchorView.window else { return false } + let windowId = ObjectIdentifier(window) + guard hostedToWindowId[hostedId] == windowId, + let portal = portalsByWindowId[windowId] else { return false } + return portal.isHostedViewBoundToAnchor(withId: hostedId, anchorView: anchorView) + } + static func viewAtWindowPoint(_ windowPoint: NSPoint, in window: NSWindow) -> NSView? { let portal = portal(for: window) return portal.viewAtWindowPoint(windowPoint) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 7e75378d..dcdc1eb2 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -6223,3 +6223,45 @@ final class BrowserOmnibarFocusPolicyTests: XCTestCase { ) } } + +final class GhosttyTerminalViewVisibilityPolicyTests: XCTestCase { + func testImmediateStateUpdateAllowedWhenHostNotInWindow() { + XCTAssertTrue( + GhosttyTerminalView.shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: false, + hostedViewHasSuperview: true, + isBoundToCurrentHost: false + ) + ) + } + + func testImmediateStateUpdateAllowedWhenBoundToCurrentHost() { + XCTAssertTrue( + GhosttyTerminalView.shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: true, + hostedViewHasSuperview: true, + isBoundToCurrentHost: true + ) + ) + } + + func testImmediateStateUpdateSkippedForStaleHostBoundElsewhere() { + XCTAssertFalse( + GhosttyTerminalView.shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: true, + hostedViewHasSuperview: true, + isBoundToCurrentHost: false + ) + ) + } + + func testImmediateStateUpdateAllowedWhenUnboundAndNotAttachedAnywhere() { + XCTAssertTrue( + GhosttyTerminalView.shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: true, + hostedViewHasSuperview: false, + isBoundToCurrentHost: false + ) + ) + } +} From a90e0a739ee01c9f2a0ff684f79367b5e3941fcf Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:36:17 -0800 Subject: [PATCH 153/214] Keep focus on destination after cross-window surface move --- Sources/Workspace.swift | 38 +++++++++++---- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 47 +++++++++++++++++++ 2 files changed, 77 insertions(+), 8 deletions(-) diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 79f5a14d..4aee7153 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -566,6 +566,9 @@ final class Workspace: Identifiable, ObservableObject { private var pendingTabSelection: (tabId: TabID, pane: PaneID)? private var isReconcilingFocusState = false private var focusReconcileScheduled = false +#if DEBUG + private(set) var debugFocusReconcileScheduledDuringDetachCount: Int = 0 +#endif private var geometryReconcileScheduled = false private var isNormalizingPinnedTabOrder = false private var pendingNonFocusSplitFocusReassert: PendingNonFocusSplitFocusReassert? @@ -594,6 +597,8 @@ final class Workspace: Identifiable, ObservableObject { private var detachingTabIds: Set<TabID> = [] private var pendingDetachedSurfaces: [TabID: DetachedSurfaceTransfer] = [:] + private var activeDetachCloseTransactions: Int = 0 + private var isDetachingCloseTransaction: Bool { activeDetachCloseTransactions > 0 } func panelIdFromSurfaceId(_ surfaceId: TabID) -> UUID? { surfaceIdToPanelId[surfaceId] @@ -1684,6 +1689,8 @@ final class Workspace: Identifiable, ObservableObject { detachingTabIds.insert(tabId) forceCloseTabIds.insert(tabId) + activeDetachCloseTransactions += 1 + defer { activeDetachCloseTransactions = max(0, activeDetachCloseTransactions - 1) } guard bonsplitController.closeTab(tabId) else { detachingTabIds.remove(tabId) pendingDetachedSurfaces.removeValue(forKey: tabId) @@ -2129,6 +2136,11 @@ final class Workspace: Identifiable, ObservableObject { /// Reconcile focus/first-responder convergence. /// Coalesce to the next main-queue turn so bonsplit selection/pane mutations settle first. private func scheduleFocusReconcile() { +#if DEBUG + if isDetachingCloseTransaction { + debugFocusReconcileScheduledDuringDetachCount += 1 + } +#endif guard !focusReconcileScheduled else { return } focusReconcileScheduled = true DispatchQueue.main.async { [weak self] in @@ -2613,6 +2625,7 @@ extension Workspace: BonsplitDelegate { forceCloseTabIds.remove(tabId) let selectTabId = postCloseSelectTabId.removeValue(forKey: tabId) let closedBrowserRestoreSnapshot = pendingClosedBrowserRestoreSnapshots.removeValue(forKey: tabId) + let isDetaching = detachingTabIds.remove(tabId) != nil || isDetachingCloseTransaction // Clean up our panel guard let panelId = panelIdFromSurfaceId(tabId) else { @@ -2620,7 +2633,9 @@ extension Workspace: BonsplitDelegate { NSLog("[Workspace] didCloseTab: no panelId for tabId") #endif scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() + if !isDetaching { + scheduleFocusReconcile() + } return } @@ -2628,7 +2643,6 @@ extension Workspace: BonsplitDelegate { NSLog("[Workspace] didCloseTab panelId=\(panelId) remainingPanels=\(panels.count - 1) remainingPanes=\(controller.allPaneIds.count)") #endif - let isDetaching = detachingTabIds.remove(tabId) != nil let panel = panels[panelId] if isDetaching, let panel { @@ -2677,7 +2691,6 @@ extension Workspace: BonsplitDelegate { if panels.isEmpty { if isDetaching { scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() return } @@ -2712,7 +2725,9 @@ extension Workspace: BonsplitDelegate { normalizePinnedTabs(in: pane) } scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() + if !isDetaching { + scheduleFocusReconcile() + } } func splitTabBar(_ controller: BonsplitController, didSelectTab tab: Bonsplit.Tab, inPane pane: PaneID) { @@ -2732,7 +2747,9 @@ extension Workspace: BonsplitDelegate { normalizePinnedTabs(in: source) normalizePinnedTabs(in: destination) scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() + if !isDetachingCloseTransaction { + scheduleFocusReconcile() + } } func splitTabBar(_ controller: BonsplitController, didFocusPane pane: PaneID) { @@ -2754,6 +2771,7 @@ extension Workspace: BonsplitDelegate { func splitTabBar(_ controller: BonsplitController, didClosePane paneId: PaneID) { let closedPanelIds = pendingPaneClosePanelIds.removeValue(forKey: paneId.id) ?? [] + let shouldScheduleFocusReconcile = !isDetachingCloseTransaction if !closedPanelIds.isEmpty { for panelId in closedPanelIds { @@ -2778,13 +2796,15 @@ extension Workspace: BonsplitDelegate { if let focusedPane = bonsplitController.focusedPaneId, let focusedTabId = bonsplitController.selectedTab(inPane: focusedPane)?.id { applyTabSelection(tabId: focusedTabId, inPane: focusedPane) - } else { + } else if shouldScheduleFocusReconcile { scheduleFocusReconcile() } } scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() + if shouldScheduleFocusReconcile { + scheduleFocusReconcile() + } } func splitTabBar(_ controller: BonsplitController, shouldClosePane pane: PaneID) -> Bool { @@ -3035,7 +3055,9 @@ extension Workspace: BonsplitDelegate { func splitTabBar(_ controller: BonsplitController, didChangeGeometry snapshot: LayoutSnapshot) { _ = snapshot scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() + if !isDetachingCloseTransaction { + scheduleFocusReconcile() + } } // No post-close polling refresh loop: we rely on view invariants and Ghostty's wakeups. diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index dcdc1eb2..7f5dcb51 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -2907,6 +2907,9 @@ final class WorkspacePanelGitBranchTests: XCTestCase { } XCTAssertEqual(workspace.panels.count, 1) +#if DEBUG + let baselineFocusReconcileDuringDetach = workspace.debugFocusReconcileScheduledDuringDetachCount +#endif guard let detached = workspace.detachSurface(panelId: panelId) else { XCTFail("Expected detach of last surface to succeed") @@ -2921,11 +2924,55 @@ final class WorkspacePanelGitBranchTests: XCTestCase { XCTAssertNil(workspace.surfaceIdFromPanelId(panelId)) XCTAssertEqual(workspace.bonsplitController.tabs(inPane: paneId).count, 0) + drainMainQueue() + drainMainQueue() +#if DEBUG + XCTAssertEqual( + workspace.debugFocusReconcileScheduledDuringDetachCount, + baselineFocusReconcileDuringDetach, + "Detaching during cross-workspace moves should not schedule delayed source focus reconciliation" + ) +#endif + let restoredPanelId = workspace.attachDetachedSurface(detached, inPane: paneId, focus: false) XCTAssertEqual(restoredPanelId, panelId) XCTAssertEqual(workspace.panels.count, 1) } + func testDetachSurfaceWithRemainingPanelsSkipsDelayedFocusReconcile() { + let workspace = Workspace() + guard let originalPanelId = workspace.focusedPanelId, + let movedPanel = workspace.newTerminalSplit(from: originalPanelId, orientation: .horizontal) else { + XCTFail("Expected two panels before detach") + return + } + + drainMainQueue() + drainMainQueue() +#if DEBUG + let baselineFocusReconcileDuringDetach = workspace.debugFocusReconcileScheduledDuringDetachCount +#endif + + guard let detached = workspace.detachSurface(panelId: movedPanel.id) else { + XCTFail("Expected detach to succeed") + return + } + + XCTAssertEqual(detached.panelId, movedPanel.id) + XCTAssertEqual(workspace.panels.count, 1, "Expected source workspace to retain only the surviving panel") + XCTAssertNotNil(workspace.panels[originalPanelId], "Expected the original panel to remain after detach") + + drainMainQueue() + drainMainQueue() +#if DEBUG + XCTAssertEqual( + workspace.debugFocusReconcileScheduledDuringDetachCount, + baselineFocusReconcileDuringDetach, + "Detaching into another workspace should not enqueue delayed source focus reconciliation" + ) +#endif + } + func testBrowserSplitWithFocusFalseRecoversFromDelayedStaleSelection() { let workspace = Workspace() guard let originalFocusedPanelId = workspace.focusedPanelId else { From 5c65e25b66c40b9679991912ba6c515801a2174b Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:44:53 -0800 Subject: [PATCH 154/214] Reassert destination focus after cross-window tab moves --- Sources/AppDelegate.swift | 45 ++++++++++++++++++++++++++++++++++++++- Sources/TabManager.swift | 9 ++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index a9735bd2..e27c6195 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1200,10 +1200,20 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent ) if focus { - if focusWindow, let destinationWindowId = windowId(for: destinationManager) { + let destinationWindowId = focusWindow ? windowId(for: destinationManager) : nil + if let destinationWindowId { _ = focusMainWindow(windowId: destinationWindowId) } destinationManager.focusTab(targetWorkspaceId, surfaceId: panelId, suppressFlash: true) + if let destinationWindowId { + reassertCrossWindowSurfaceMoveFocusIfNeeded( + destinationWindowId: destinationWindowId, + sourceWindowId: source.windowId, + destinationWorkspaceId: targetWorkspaceId, + destinationPanelId: panelId, + destinationManager: destinationManager + ) + } } return true @@ -1456,6 +1466,39 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } } + private func reassertCrossWindowSurfaceMoveFocusIfNeeded( + destinationWindowId: UUID, + sourceWindowId: UUID, + destinationWorkspaceId: UUID, + destinationPanelId: UUID, + destinationManager: TabManager + ) { + let reassert: () -> Void = { [weak self, weak destinationManager] in + guard let self, let destinationManager else { return } + guard let workspace = destinationManager.tabs.first(where: { $0.id == destinationWorkspaceId }), + workspace.panels[destinationPanelId] != nil else { + return + } + guard let destinationWindow = self.mainWindow(for: destinationWindowId) else { return } + guard let keyWindow = NSApp.keyWindow, + let keyWindowId = self.mainWindowId(for: keyWindow), + keyWindowId == sourceWindowId, + keyWindow !== destinationWindow else { + return + } + + self.bringToFront(destinationWindow) + destinationManager.focusTab( + destinationWorkspaceId, + surfaceId: destinationPanelId, + suppressFlash: true + ) + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05, execute: reassert) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.16, execute: reassert) + } + private func windowForMainWindowId(_ windowId: UUID) -> NSWindow? { if let ctx = mainWindowContexts.values.first(where: { $0.windowId == windowId }), let window = ctx.window { diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 5a59b82a..0f2242d6 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -1523,10 +1523,15 @@ class TabManager: ObservableObject { userInfo: [GhosttyNotificationKey.tabId: tabId] ) - DispatchQueue.main.async { + DispatchQueue.main.async { [weak self] in + guard let self else { return } NSApp.activate(ignoringOtherApps: true) NSApp.unhide(nil) - if let window = NSApp.keyWindow ?? NSApp.windows.first { + if let app = AppDelegate.shared, + let windowId = app.windowId(for: self), + let window = app.mainWindow(for: windowId) { + window.makeKeyAndOrderFront(nil) + } else if let window = NSApp.keyWindow ?? NSApp.windows.first { window.makeKeyAndOrderFront(nil) } } From 66a9435da6b55ae5b30dd42c342121023319868a Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:52:01 -0800 Subject: [PATCH 155/214] Add background source diagnostics for theme sync --- Sources/GhosttyTerminalView.swift | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 24002650..914fc57b 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1230,6 +1230,11 @@ class GhosttyApp { blue: CGFloat(change.b) / 255, alpha: 1.0 ) + if backgroundLogEnabled { + logBackground( + "surface override set tab=\(surfaceView.tabId?.uuidString ?? "nil") surface=\(surfaceView.terminalSurface?.id.uuidString ?? "nil") override=\(surfaceView.backgroundColor?.hexString() ?? "nil") default=\(defaultBackgroundColor.hexString()) source=action.color_change.surface" + ) + } surfaceView.applySurfaceBackground() if backgroundLogEnabled { logBackground("OSC background change tab=\(surfaceView.tabId?.uuidString ?? "unknown") color=\(surfaceView.backgroundColor?.description ?? "nil")") @@ -1247,7 +1252,7 @@ class GhosttyApp { ) if backgroundLogEnabled { logBackground( - "surface config change deferred terminal bg apply tab=\(surfaceView.tabId?.uuidString ?? "nil") surface=\(surfaceView.terminalSurface?.id.uuidString ?? "nil")" + "surface config change deferred terminal bg apply tab=\(surfaceView.tabId?.uuidString ?? "nil") surface=\(surfaceView.terminalSurface?.id.uuidString ?? "nil") override=\(surfaceView.backgroundColor?.hexString() ?? "nil") default=\(defaultBackgroundColor.hexString())" ) } return true @@ -2210,8 +2215,12 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { let signature = "\(color.hexString()):\(String(format: "%.3f", color.alphaComponent))" if signature != lastLoggedSurfaceBackgroundSignature { lastLoggedSurfaceBackgroundSignature = signature + let hasOverride = backgroundColor != nil + let overrideHex = backgroundColor?.hexString() ?? "nil" + let defaultHex = GhosttyApp.shared.defaultBackgroundColor.hexString() + let source = hasOverride ? "surfaceOverride" : "defaultBackground" GhosttyApp.shared.logBackground( - "surface background applied tab=\(tabId?.uuidString ?? "unknown") surface=\(terminalSurface?.id.uuidString ?? "unknown") color=\(color.hexString()) opacity=\(String(format: "%.3f", color.alphaComponent))" + "surface background applied tab=\(tabId?.uuidString ?? "unknown") surface=\(terminalSurface?.id.uuidString ?? "unknown") source=\(source) override=\(overrideHex) default=\(defaultHex) color=\(color.hexString()) opacity=\(String(format: "%.3f", color.alphaComponent))" ) } } @@ -2235,8 +2244,12 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { let signature = "\(cmuxShouldUseTransparentBackgroundWindow() ? "transparent" : color.hexString()):\(String(format: "%.3f", color.alphaComponent))" if signature != lastLoggedWindowBackgroundSignature { lastLoggedWindowBackgroundSignature = signature + let hasOverride = backgroundColor != nil + let overrideHex = backgroundColor?.hexString() ?? "nil" + let defaultHex = GhosttyApp.shared.defaultBackgroundColor.hexString() + let source = hasOverride ? "surfaceOverride" : "defaultBackground" GhosttyApp.shared.logBackground( - "window background applied tab=\(tabId?.uuidString ?? "unknown") surface=\(terminalSurface?.id.uuidString ?? "unknown") transparent=\(cmuxShouldUseTransparentBackgroundWindow()) color=\(color.hexString()) opacity=\(String(format: "%.3f", color.alphaComponent))" + "window background applied tab=\(tabId?.uuidString ?? "unknown") surface=\(terminalSurface?.id.uuidString ?? "unknown") source=\(source) override=\(overrideHex) default=\(defaultHex) transparent=\(cmuxShouldUseTransparentBackgroundWindow()) color=\(color.hexString()) opacity=\(String(format: "%.3f", color.alphaComponent))" ) } } From 1c3f8458ee282c533a2cd5ce00d3904a74ec8f48 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:54:54 -0800 Subject: [PATCH 156/214] Clear stale surface bg override on config changes --- Sources/GhosttyTerminalView.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 914fc57b..aaea7a19 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1245,6 +1245,18 @@ class GhosttyApp { } return true case GHOSTTY_ACTION_CONFIG_CHANGE: + if let staleOverride = surfaceView.backgroundColor { + surfaceView.backgroundColor = nil + if backgroundLogEnabled { + logBackground( + "surface override cleared tab=\(surfaceView.tabId?.uuidString ?? "nil") surface=\(surfaceView.terminalSurface?.id.uuidString ?? "nil") cleared=\(staleOverride.hexString()) source=action.config_change.surface" + ) + } + surfaceView.applySurfaceBackground() + DispatchQueue.main.async { + surfaceView.applyWindowBackgroundIfActive() + } + } updateDefaultBackground( from: action.action.config_change.config, source: "action.config_change.surface tab=\(surfaceView.tabId?.uuidString ?? "nil") surface=\(surfaceView.terminalSurface?.id.uuidString ?? "nil")", From 8f94fd0f503d353a219d464792fa562da26aadf3 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 19:56:38 -0800 Subject: [PATCH 157/214] Fix stale browser favicon after navigation --- Sources/Panels/BrowserPanel.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 420ba6d1..39805285 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1647,6 +1647,9 @@ final class BrowserPanel: Panel, ObservableObject { faviconTask?.cancel() faviconTask = nil lastFaviconURLString = nil + // Clear the previous page's favicon so it never persists across navigations. + // The loading spinner covers this gap; didFinish will fetch the new favicon. + faviconPNGData = nil loadingGeneration &+= 1 loadingEndWorkItem?.cancel() loadingEndWorkItem = nil @@ -2526,6 +2529,10 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { NSLog("BrowserPanel navigation failed: %@", error.localizedDescription) + // Treat committed-navigation failures the same as provisional ones so + // stale favicon/title state from the prior page gets cleared. + let failedURL = webView.url?.absoluteString ?? "" + didFailNavigation?(webView, failedURL) } func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { From e5448ac48a34fb7f5af6fb3a7ebc06b2f133a862 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 19:56:41 -0800 Subject: [PATCH 158/214] Fix stuck titlebar drag suppression --- Sources/ContentView.swift | 7 +++---- Sources/WindowDragHandleView.swift | 31 +++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 50ebfd3c..67d8987d 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -7645,7 +7645,6 @@ final class DraggableFolderNSView: NSView, NSDraggingSource { override func hitTest(_ point: NSPoint) -> NSView? { guard bounds.contains(point) else { return nil } - maybeDisableWindowDraggingEarly(trigger: "hitTest") let hit = super.hitTest(point) #if DEBUG let hitDesc = hit.map { String(describing: type(of: $0)) } ?? "nil" @@ -7685,9 +7684,9 @@ final class DraggableFolderNSView: NSView, NSDraggingSource { override func mouseUp(with event: NSEvent) { super.mouseUp(with: event) - if !hasActiveDragSession { - restoreWindowMovableStateIfNeeded() - } + // Always restore suppression on mouse-up; drag-session callbacks can be + // skipped for non-started drags, which would otherwise leave suppression stuck. + restoreWindowMovableStateIfNeeded() } override func rightMouseDown(with event: NSEvent) { diff --git a/Sources/WindowDragHandleView.swift b/Sources/WindowDragHandleView.swift index ebc62a05..e9ce93f4 100644 --- a/Sources/WindowDragHandleView.swift +++ b/Sources/WindowDragHandleView.swift @@ -51,6 +51,16 @@ func isWindowDragSuppressed(window: NSWindow?) -> Bool { windowDragSuppressionDepth(window: window) > 0 } +@discardableResult +func clearWindowDragSuppression(window: NSWindow?) -> Int { + guard let window else { return 0 } + var depth = windowDragSuppressionDepth(window: window) + while depth > 0 { + depth = endWindowDragSuppression(window: window) + } + return depth +} + /// Temporarily enables window movability for explicit drag-handle drags, then /// restores the previous movability state after `body` finishes. @discardableResult @@ -98,13 +108,24 @@ func windowDragHandleShouldTreatTopHitAsPassiveHost(_ view: NSView) -> Bool { /// controls layered in the titlebar (e.g. proxy folder icon) keep their gestures. func windowDragHandleShouldCaptureHit(_ point: NSPoint, in dragHandleView: NSView) -> Bool { if isWindowDragSuppressed(window: dragHandleView.window) { + // Recover from stale suppression if a prior interaction missed cleanup. + // We only keep suppression active while the left mouse button is down. + if (NSEvent.pressedMouseButtons & 0x1) == 0 { + let clearedDepth = clearWindowDragSuppression(window: dragHandleView.window) + #if DEBUG + dlog( + "titlebar.dragHandle.hitTest suppressionRecovered clearedDepth=\(clearedDepth) point=\(windowDragHandleFormatPoint(point))" + ) + #endif + } else { #if DEBUG - let depth = windowDragSuppressionDepth(window: dragHandleView.window) - dlog( - "titlebar.dragHandle.hitTest capture=false reason=suppressed depth=\(depth) point=\(windowDragHandleFormatPoint(point))" - ) + let depth = windowDragSuppressionDepth(window: dragHandleView.window) + dlog( + "titlebar.dragHandle.hitTest capture=false reason=suppressed depth=\(depth) point=\(windowDragHandleFormatPoint(point))" + ) #endif - return false + return false + } } guard dragHandleView.bounds.contains(point) else { From a97e0edea8eadae895029e1ca66a06cc01d10e00 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:05:12 -0800 Subject: [PATCH 159/214] Add drag transfer timing logs for bonsplit tabs --- Sources/AppDelegate.swift | 173 ++++++++++++++++++++++++++++++++++++-- Sources/Workspace.swift | 112 ++++++++++++++++++++++-- 2 files changed, 271 insertions(+), 14 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index e27c6195..34497d6c 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1113,19 +1113,67 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent focus: Bool = true, focusWindow: Bool = true ) -> Bool { - guard let source = locateSurface(surfaceId: panelId), - let sourceWorkspace = source.tabManager.tabs.first(where: { $0.id == source.workspaceId }), - let destinationManager = tabManagerFor(tabId: targetWorkspaceId), - let destinationWorkspace = destinationManager.tabs.first(where: { $0.id == targetWorkspaceId }) else { +#if DEBUG + let moveStart = ProcessInfo.processInfo.systemUptime + let splitLabel = splitTarget.map { split in + "\(split.orientation.rawValue):\(split.insertFirst ? 1 : 0)" + } ?? "none" + func elapsedMs(since start: TimeInterval) -> String { + let ms = (ProcessInfo.processInfo.systemUptime - start) * 1000 + return String(format: "%.2f", ms) + } + dlog( + "surface.move.begin panel=\(panelId.uuidString.prefix(5)) targetWs=\(targetWorkspaceId.uuidString.prefix(5)) " + + "targetPane=\(targetPane?.id.uuidString.prefix(5) ?? "auto") targetIndex=\(targetIndex.map(String.init) ?? "nil") " + + "split=\(splitLabel) focus=\(focus ? 1 : 0) focusWindow=\(focusWindow ? 1 : 0)" + ) +#endif + guard let source = locateSurface(surfaceId: panelId) else { +#if DEBUG + dlog("surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=sourcePanelNotFound elapsedMs=\(elapsedMs(since: moveStart))") +#endif return false } + guard let sourceWorkspace = source.tabManager.tabs.first(where: { $0.id == source.workspaceId }) else { +#if DEBUG + dlog("surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=sourceWorkspaceMissing elapsedMs=\(elapsedMs(since: moveStart))") +#endif + return false + } + guard let destinationManager = tabManagerFor(tabId: targetWorkspaceId) else { +#if DEBUG + dlog("surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=destinationManagerMissing elapsedMs=\(elapsedMs(since: moveStart))") +#endif + return false + } + guard let destinationWorkspace = destinationManager.tabs.first(where: { $0.id == targetWorkspaceId }) else { +#if DEBUG + dlog("surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=destinationWorkspaceMissing elapsedMs=\(elapsedMs(since: moveStart))") +#endif + return false + } +#if DEBUG + dlog( + "surface.move.route panel=\(panelId.uuidString.prefix(5)) sourceWs=\(sourceWorkspace.id.uuidString.prefix(5)) " + + "sourceWin=\(source.windowId.uuidString.prefix(5)) destinationWs=\(destinationWorkspace.id.uuidString.prefix(5)) " + + "sameWorkspace=\(destinationWorkspace.id == sourceWorkspace.id ? 1 : 0)" + ) +#endif let resolvedTargetPane = targetPane.flatMap { pane in destinationWorkspace.bonsplitController.allPaneIds.first(where: { $0 == pane }) } ?? destinationWorkspace.bonsplitController.focusedPaneId ?? destinationWorkspace.bonsplitController.allPaneIds.first - guard let resolvedTargetPane else { return false } + guard let resolvedTargetPane else { +#if DEBUG + dlog( + "surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=targetPaneMissing " + + "destinationWs=\(destinationWorkspace.id.uuidString.prefix(5)) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif + return false + } if destinationWorkspace.id == sourceWorkspace.id { if let splitTarget { @@ -1136,26 +1184,62 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent movingTab: sourceTabId, insertFirst: splitTarget.insertFirst ) != nil else { +#if DEBUG + dlog( + "surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=sameWorkspaceSplitFailed " + + "targetPane=\(resolvedTargetPane.id.uuidString.prefix(5)) split=\(splitLabel) " + + "elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif return false } if focus { source.tabManager.focusTab(sourceWorkspace.id, surfaceId: panelId, suppressFlash: true) } +#if DEBUG + dlog( + "surface.move.end panel=\(panelId.uuidString.prefix(5)) path=sameWorkspaceSplit moved=1 " + + "targetPane=\(resolvedTargetPane.id.uuidString.prefix(5)) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif return true } - return sourceWorkspace.moveSurface( + let moved = sourceWorkspace.moveSurface( panelId: panelId, toPane: resolvedTargetPane, atIndex: targetIndex, focus: focus ) +#if DEBUG + dlog( + "surface.move.end panel=\(panelId.uuidString.prefix(5)) path=sameWorkspaceMove moved=\(moved ? 1 : 0) " + + "targetPane=\(resolvedTargetPane.id.uuidString.prefix(5)) targetIndex=\(targetIndex.map(String.init) ?? "nil") " + + "elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif + return moved } let sourcePane = sourceWorkspace.paneId(forPanelId: panelId) let sourceIndex = sourceWorkspace.indexInPane(forPanelId: panelId) +#if DEBUG + let detachStart = ProcessInfo.processInfo.systemUptime +#endif - guard let detached = sourceWorkspace.detachSurface(panelId: panelId) else { return false } + guard let detached = sourceWorkspace.detachSurface(panelId: panelId) else { +#if DEBUG + dlog( + "surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=detachFailed " + + "elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif + return false + } +#if DEBUG + let detachMs = elapsedMs(since: detachStart) + let attachStart = ProcessInfo.processInfo.systemUptime +#endif guard destinationWorkspace.attachDetachedSurface( detached, inPane: resolvedTargetPane, @@ -1169,10 +1253,23 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent sourceIndex: sourceIndex, focus: focus ) +#if DEBUG + dlog( + "surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=attachFailed " + + "detachMs=\(detachMs) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif return false } +#if DEBUG + let attachMs = elapsedMs(since: attachStart) + var splitMs = "0.00" +#endif if let splitTarget { +#if DEBUG + let splitStart = ProcessInfo.processInfo.systemUptime +#endif guard let movedTabId = destinationWorkspace.surfaceIdFromPanelId(panelId), destinationWorkspace.bonsplitController.splitPane( resolvedTargetPane, @@ -1189,15 +1286,31 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent focus: focus ) } +#if DEBUG + dlog( + "surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=postAttachSplitFailed " + + "detachMs=\(detachMs) attachMs=\(attachMs) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif return false } +#if DEBUG + splitMs = elapsedMs(since: splitStart) +#endif } +#if DEBUG + let cleanupStart = ProcessInfo.processInfo.systemUptime +#endif cleanupEmptySourceWorkspaceAfterSurfaceMove( sourceWorkspace: sourceWorkspace, sourceManager: source.tabManager, sourceWindowId: source.windowId ) +#if DEBUG + let cleanupMs = elapsedMs(since: cleanupStart) + let focusStart = ProcessInfo.processInfo.systemUptime +#endif if focus { let destinationWindowId = focusWindow ? windowId(for: destinationManager) : nil @@ -1215,6 +1328,16 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent ) } } +#if DEBUG + let focusMs = elapsedMs(since: focusStart) + dlog( + "surface.move.end panel=\(panelId.uuidString.prefix(5)) path=crossWorkspace moved=1 " + + "sourceWs=\(sourceWorkspace.id.uuidString.prefix(5)) destinationWs=\(destinationWorkspace.id.uuidString.prefix(5)) " + + "targetPane=\(resolvedTargetPane.id.uuidString.prefix(5)) targetIndex=\(targetIndex.map(String.init) ?? "nil") " + + "split=\(splitLabel) detachMs=\(detachMs) attachMs=\(attachMs) splitMs=\(splitMs) " + + "cleanupMs=\(cleanupMs) focusMs=\(focusMs) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif return true } @@ -1229,8 +1352,33 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent focus: Bool = true, focusWindow: Bool = true ) -> Bool { - guard let located = locateBonsplitSurface(tabId: tabId) else { return false } - return moveSurface( +#if DEBUG + let moveStart = ProcessInfo.processInfo.systemUptime + func elapsedMs(since start: TimeInterval) -> String { + let ms = (ProcessInfo.processInfo.systemUptime - start) * 1000 + return String(format: "%.2f", ms) + } + dlog( + "surface.moveBonsplit.begin tab=\(tabId.uuidString.prefix(5)) targetWs=\(targetWorkspaceId.uuidString.prefix(5)) " + + "targetPane=\(targetPane?.id.uuidString.prefix(5) ?? "auto") targetIndex=\(targetIndex.map(String.init) ?? "nil")" + ) +#endif + guard let located = locateBonsplitSurface(tabId: tabId) else { +#if DEBUG + dlog( + "surface.moveBonsplit.fail tab=\(tabId.uuidString.prefix(5)) reason=tabNotFound " + + "targetWs=\(targetWorkspaceId.uuidString.prefix(5)) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif + return false + } +#if DEBUG + dlog( + "surface.moveBonsplit.located tab=\(tabId.uuidString.prefix(5)) panel=\(located.panelId.uuidString.prefix(5)) " + + "sourceWs=\(located.workspaceId.uuidString.prefix(5)) sourceWin=\(located.windowId.uuidString.prefix(5))" + ) +#endif + let moved = moveSurface( panelId: located.panelId, toWorkspace: targetWorkspaceId, targetPane: targetPane, @@ -1239,6 +1387,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent focus: focus, focusWindow: focusWindow ) +#if DEBUG + dlog( + "surface.moveBonsplit.end tab=\(tabId.uuidString.prefix(5)) panel=\(located.panelId.uuidString.prefix(5)) " + + "moved=\(moved ? 1 : 0) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif + return moved } func tabManagerFor(windowId: UUID) -> TabManager? { diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 4aee7153..8877961d 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -568,6 +568,8 @@ final class Workspace: Identifiable, ObservableObject { private var focusReconcileScheduled = false #if DEBUG private(set) var debugFocusReconcileScheduledDuringDetachCount: Int = 0 + private var debugLastDidMoveTabTimestamp: TimeInterval = 0 + private var debugDidMoveTabEventCount: UInt64 = 0 #endif private var geometryReconcileScheduled = false private var isNormalizingPinnedTabOrder = false @@ -600,6 +602,13 @@ final class Workspace: Identifiable, ObservableObject { private var activeDetachCloseTransactions: Int = 0 private var isDetachingCloseTransaction: Bool { activeDetachCloseTransactions > 0 } +#if DEBUG + private func debugElapsedMs(since start: TimeInterval) -> String { + let ms = (ProcessInfo.processInfo.systemUptime - start) * 1000 + return String(format: "%.2f", ms) + } +#endif + func panelIdFromSurfaceId(_ surfaceId: TabID) -> UUID? { surfaceIdToPanelId[surfaceId] } @@ -1686,6 +1695,14 @@ final class Workspace: Identifiable, ObservableObject { func detachSurface(panelId: UUID) -> DetachedSurfaceTransfer? { guard let tabId = surfaceIdFromPanelId(panelId) else { return nil } guard panels[panelId] != nil else { return nil } +#if DEBUG + let detachStart = ProcessInfo.processInfo.systemUptime + dlog( + "split.detach.begin ws=\(id.uuidString.prefix(5)) panel=\(panelId.uuidString.prefix(5)) " + + "tab=\(tabId.uuid.uuidString.prefix(5)) activeDetachTxn=\(activeDetachCloseTransactions) " + + "pendingDetached=\(pendingDetachedSurfaces.count)" + ) +#endif detachingTabIds.insert(tabId) forceCloseTabIds.insert(tabId) @@ -1695,10 +1712,24 @@ final class Workspace: Identifiable, ObservableObject { detachingTabIds.remove(tabId) pendingDetachedSurfaces.removeValue(forKey: tabId) forceCloseTabIds.remove(tabId) +#if DEBUG + dlog( + "split.detach.fail ws=\(id.uuidString.prefix(5)) panel=\(panelId.uuidString.prefix(5)) " + + "tab=\(tabId.uuid.uuidString.prefix(5)) reason=closeTabRejected elapsedMs=\(debugElapsedMs(since: detachStart))" + ) +#endif return nil } - return pendingDetachedSurfaces.removeValue(forKey: tabId) + let detached = pendingDetachedSurfaces.removeValue(forKey: tabId) +#if DEBUG + dlog( + "split.detach.end ws=\(id.uuidString.prefix(5)) panel=\(panelId.uuidString.prefix(5)) " + + "tab=\(tabId.uuid.uuidString.prefix(5)) transfer=\(detached != nil ? 1 : 0) " + + "elapsedMs=\(debugElapsedMs(since: detachStart))" + ) +#endif + return detached } @discardableResult @@ -1708,8 +1739,31 @@ final class Workspace: Identifiable, ObservableObject { atIndex index: Int? = nil, focus: Bool = true ) -> UUID? { - guard bonsplitController.allPaneIds.contains(paneId) else { return nil } - guard panels[detached.panelId] == nil else { return nil } +#if DEBUG + let attachStart = ProcessInfo.processInfo.systemUptime + dlog( + "split.attach.begin ws=\(id.uuidString.prefix(5)) panel=\(detached.panelId.uuidString.prefix(5)) " + + "pane=\(paneId.id.uuidString.prefix(5)) index=\(index.map(String.init) ?? "nil") focus=\(focus ? 1 : 0)" + ) +#endif + guard bonsplitController.allPaneIds.contains(paneId) else { +#if DEBUG + dlog( + "split.attach.fail ws=\(id.uuidString.prefix(5)) panel=\(detached.panelId.uuidString.prefix(5)) " + + "reason=invalidPane elapsedMs=\(debugElapsedMs(since: attachStart))" + ) +#endif + return nil + } + guard panels[detached.panelId] == nil else { +#if DEBUG + dlog( + "split.attach.fail ws=\(id.uuidString.prefix(5)) panel=\(detached.panelId.uuidString.prefix(5)) " + + "reason=panelExists elapsedMs=\(debugElapsedMs(since: attachStart))" + ) +#endif + return nil + } panels[detached.panelId] = detached.panel if let terminalPanel = detached.panel as? TerminalPanel { @@ -1760,6 +1814,12 @@ final class Workspace: Identifiable, ObservableObject { manualUnreadPanelIds.remove(detached.panelId) manualUnreadMarkedAt.removeValue(forKey: detached.panelId) panelSubscriptions.removeValue(forKey: detached.panelId) +#if DEBUG + dlog( + "split.attach.fail ws=\(id.uuidString.prefix(5)) panel=\(detached.panelId.uuidString.prefix(5)) " + + "reason=createTabFailed elapsedMs=\(debugElapsedMs(since: attachStart))" + ) +#endif return nil } @@ -1781,6 +1841,14 @@ final class Workspace: Identifiable, ObservableObject { } scheduleTerminalGeometryReconcile() +#if DEBUG + dlog( + "split.attach.end ws=\(id.uuidString.prefix(5)) panel=\(detached.panelId.uuidString.prefix(5)) " + + "tab=\(newTabId.uuid.uuidString.prefix(5)) pane=\(paneId.id.uuidString.prefix(5)) " + + "index=\(index.map(String.init) ?? "nil") focus=\(focus ? 1 : 0) " + + "elapsedMs=\(debugElapsedMs(since: attachStart))" + ) +#endif return detached.panelId } // MARK: - Focus Management @@ -2329,23 +2397,41 @@ final class Workspace: Identifiable, ObservableObject { private func handleExternalTabDrop(_ request: BonsplitController.ExternalTabDropRequest) -> Bool { guard let app = AppDelegate.shared else { return false } +#if DEBUG + let dropStart = ProcessInfo.processInfo.systemUptime +#endif let targetPane: PaneID let targetIndex: Int? let splitTarget: (orientation: SplitOrientation, insertFirst: Bool)? +#if DEBUG + let destinationLabel: String +#endif switch request.destination { case .insert(let paneId, let index): targetPane = paneId targetIndex = index splitTarget = nil +#if DEBUG + destinationLabel = "insert pane=\(paneId.id.uuidString.prefix(5)) index=\(index.map(String.init) ?? "nil")" +#endif case .split(let paneId, let orientation, let insertFirst): targetPane = paneId targetIndex = nil splitTarget = (orientation, insertFirst) +#if DEBUG + destinationLabel = "split pane=\(paneId.id.uuidString.prefix(5)) orientation=\(orientation.rawValue) insertFirst=\(insertFirst ? 1 : 0)" +#endif } - return app.moveBonsplitTab( + #if DEBUG + dlog( + "split.externalDrop.begin ws=\(id.uuidString.prefix(5)) tab=\(request.tabId.uuid.uuidString.prefix(5)) " + + "sourcePane=\(request.sourcePaneId.id.uuidString.prefix(5)) destination=\(destinationLabel)" + ) + #endif + let moved = app.moveBonsplitTab( tabId: request.tabId.uuid, toWorkspace: id, targetPane: targetPane, @@ -2354,6 +2440,13 @@ final class Workspace: Identifiable, ObservableObject { focus: true, focusWindow: true ) +#if DEBUG + dlog( + "split.externalDrop.end ws=\(id.uuidString.prefix(5)) tab=\(request.tabId.uuid.uuidString.prefix(5)) " + + "moved=\(moved ? 1 : 0) elapsedMs=\(debugElapsedMs(since: dropStart))" + ) +#endif + return moved } } @@ -2736,9 +2829,18 @@ extension Workspace: BonsplitDelegate { func splitTabBar(_ controller: BonsplitController, didMoveTab tab: Bonsplit.Tab, fromPane source: PaneID, toPane destination: PaneID) { #if DEBUG + let now = ProcessInfo.processInfo.systemUptime + let sincePrev: String + if debugLastDidMoveTabTimestamp > 0 { + sincePrev = String(format: "%.2f", (now - debugLastDidMoveTabTimestamp) * 1000) + } else { + sincePrev = "first" + } + debugLastDidMoveTabTimestamp = now + debugDidMoveTabEventCount += 1 let movedPanel = panelIdFromSurfaceId(tab.id)?.uuidString.prefix(5) ?? "unknown" dlog( - "split.moveTab panel=\(movedPanel) " + + "split.moveTab idx=\(debugDidMoveTabEventCount) dtSincePrevMs=\(sincePrev) panel=\(movedPanel) " + "from=\(source.id.uuidString.prefix(5)) to=\(destination.id.uuidString.prefix(5)) " + "sourceTabs=\(controller.tabs(inPane: source).count) destTabs=\(controller.tabs(inPane: destination).count)" ) From 3c1650d3e099159e70d473ac06f3dffb808dddf3 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:08:21 -0800 Subject: [PATCH 160/214] Fix Cmd+P/Cmd+Shift+P window routing (#413) * Fix command palette shortcuts to stay window-scoped * Fix cross-window command palette typing focus lock --- Sources/AppDelegate.swift | 22 +++- Sources/ContentView.swift | 56 +++++++- tests_v2/test_command_palette_window_scope.py | 124 +++++++++++++++++- 3 files changed, 191 insertions(+), 11 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index e27c6195..befa7e43 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1535,6 +1535,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return nil } + private func commandPaletteWindowForShortcutEvent(_ event: NSEvent) -> NSWindow? { + if let scopedWindow = mainWindowForShortcutEvent(event) { + return scopedWindow + } + return activeCommandPaletteWindow() + } + private func contextForMainWindow(_ window: NSWindow?) -> MainWindowContext? { guard let window, isMainTerminalWindow(window) else { return nil } return mainWindowContexts[ObjectIdentifier(window)] @@ -2950,13 +2957,18 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } let normalizedFlags = flags.subtracting([.numericPad, .function, .capsLock]) + let commandPaletteTargetWindow = commandPaletteWindowForShortcutEvent(event) + let commandPaletteVisibleInTargetWindow = commandPaletteTargetWindow.map { + isCommandPaletteVisible(for: $0) + } ?? false if let delta = commandPaletteSelectionDeltaForKeyboardNavigation( flags: event.modifierFlags, chars: chars, keyCode: event.keyCode ), - let paletteWindow = activeCommandPaletteWindow() { + commandPaletteVisibleInTargetWindow, + let paletteWindow = commandPaletteTargetWindow { NotificationCenter.default.post( name: .commandPaletteMoveSelection, object: paletteWindow, @@ -2967,20 +2979,20 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent let isCommandP = normalizedFlags == [.command] && (chars == "p" || event.keyCode == 35) if isCommandP { - let targetWindow = activeCommandPaletteWindow() ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow + let targetWindow = commandPaletteTargetWindow ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow NotificationCenter.default.post(name: .commandPaletteSwitcherRequested, object: targetWindow) return true } let isCommandShiftP = normalizedFlags == [.command, .shift] && (chars == "p" || event.keyCode == 35) if isCommandShiftP { - let targetWindow = activeCommandPaletteWindow() ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow + let targetWindow = commandPaletteTargetWindow ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow NotificationCenter.default.post(name: .commandPaletteRequested, object: targetWindow) return true } if shouldConsumeShortcutWhileCommandPaletteVisible( - isCommandPaletteVisible: activeCommandPaletteWindow() != nil, + isCommandPaletteVisible: commandPaletteVisibleInTargetWindow, normalizedFlags: normalizedFlags, chars: chars, keyCode: event.keyCode @@ -3184,7 +3196,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent if tabManager?.focusedBrowserPanel != nil { return false } - let targetWindow = activeCommandPaletteWindow() ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow + let targetWindow = commandPaletteTargetWindow ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow NotificationCenter.default.post(name: .commandPaletteRenameTabRequested, object: targetWindow) return true } diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 67d8987d..bbb4cbe5 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -753,6 +753,9 @@ private final class WindowCommandPaletteOverlayController: NSObject { private weak var installedThemeFrame: NSView? private var focusLockTimer: DispatchSourceTimer? private var scheduledFocusWorkItem: DispatchWorkItem? + private var isPaletteVisible = false + private var windowDidBecomeKeyObserver: NSObjectProtocol? + private var windowDidResignKeyObserver: NSObjectProtocol? init(window: NSWindow) { self.window = window @@ -775,6 +778,7 @@ private final class WindowCommandPaletteOverlayController: NSObject { hostingView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), ]) _ = ensureInstalled() + installWindowKeyObservers() } @discardableResult @@ -906,6 +910,52 @@ private final class WindowCommandPaletteOverlayController: NSObject { } } + private func installWindowKeyObservers() { + guard let window else { return } + windowDidBecomeKeyObserver = NotificationCenter.default.addObserver( + forName: NSWindow.didBecomeKeyNotification, + object: window, + queue: .main + ) { [weak self] _ in + Task { @MainActor [weak self] in + self?.updateFocusLockForWindowState() + } + } + windowDidResignKeyObserver = NotificationCenter.default.addObserver( + forName: NSWindow.didResignKeyNotification, + object: window, + queue: .main + ) { [weak self] _ in + Task { @MainActor [weak self] in + self?.updateFocusLockForWindowState() + } + } + } + + private func updateFocusLockForWindowState() { + guard let window else { + stopFocusLockTimer() + return + } + guard isPaletteVisible else { + stopFocusLockTimer() + return + } + + guard window.isKeyWindow else { + stopFocusLockTimer() + if isPaletteResponder(window.firstResponder) { + _ = window.makeFirstResponder(nil) + } + return + } + + startFocusLockTimer() + if !isPaletteTextInputFirstResponder(window.firstResponder) { + scheduleFocusIntoPalette(retries: 8) + } + } + private func startFocusLockTimer() { guard focusLockTimer == nil else { return } let timer = DispatchSource.makeTimerSource(queue: .main) @@ -952,6 +1002,7 @@ private final class WindowCommandPaletteOverlayController: NSObject { func update(rootView: AnyView, isVisible: Bool) { guard ensureInstalled() else { return } + isPaletteVisible = isVisible if isVisible { hostingView.rootView = rootView containerView.capturesMouseEvents = true @@ -960,10 +1011,7 @@ private final class WindowCommandPaletteOverlayController: NSObject { if let themeFrame = installedThemeFrame, themeFrame.subviews.last !== containerView { themeFrame.addSubview(containerView, positioned: .above, relativeTo: nil) } - startFocusLockTimer() - if let window, !isPaletteTextInputFirstResponder(window.firstResponder) { - scheduleFocusIntoPalette(retries: 8) - } + updateFocusLockForWindowState() } else { stopFocusLockTimer() if let window, isPaletteResponder(window.firstResponder) { diff --git a/tests_v2/test_command_palette_window_scope.py b/tests_v2/test_command_palette_window_scope.py index 63236c34..e6cfeab7 100644 --- a/tests_v2/test_command_palette_window_scope.py +++ b/tests_v2/test_command_palette_window_scope.py @@ -32,6 +32,10 @@ def _palette_visible(client: cmux, window_id: str) -> bool: return bool(res.get("visible")) +def _palette_results(client: cmux, window_id: str, limit: int = 20) -> dict: + return client.command_palette_results(window_id=window_id, limit=limit) + + def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: if _palette_visible(client, window_id) == visible: return @@ -43,6 +47,116 @@ def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: ) +def _focus_window(client: cmux, window_id: str) -> None: + client.focus_window(window_id) + client.activate_app() + _wait_until( + lambda: client.current_window().lower() == window_id.lower(), + timeout_s=3.0, + message=f"failed to focus window {window_id}", + ) + time.sleep(0.15) + + +def _assert_shortcut_window_scoped(client: cmux, shortcut: str, w1: str, w2: str) -> None: + _set_palette_visible(client, w1, False) + _set_palette_visible(client, w2, False) + + _focus_window(client, w1) + client.simulate_shortcut(shortcut) + _wait_until( + lambda: _palette_visible(client, w1), + timeout_s=3.0, + message=f"{shortcut} did not open palette in window1", + ) + if _palette_visible(client, w2): + raise cmuxError(f"{shortcut} in window1 incorrectly opened palette in window2") + + _focus_window(client, w2) + client.simulate_shortcut(shortcut) + _wait_until( + lambda: _palette_visible(client, w2), + timeout_s=3.0, + message=f"{shortcut} did not open palette in window2", + ) + if not _palette_visible(client, w1): + raise cmuxError( + f"{shortcut} in window2 incorrectly toggled window1 palette off " + "(cross-window routing regression)" + ) + + client.simulate_shortcut(shortcut) + _wait_until( + lambda: not _palette_visible(client, w2), + timeout_s=3.0, + message=f"second {shortcut} did not close palette in window2", + ) + if not _palette_visible(client, w1): + raise cmuxError( + f"second {shortcut} in window2 incorrectly changed window1 palette visibility" + ) + + _focus_window(client, w1) + client.simulate_shortcut(shortcut) + _wait_until( + lambda: not _palette_visible(client, w1), + timeout_s=3.0, + message=f"second {shortcut} did not close palette in window1", + ) + + +def _assert_cross_window_typing_after_mixed_shortcuts(client: cmux, w1: str, w2: str) -> None: + _set_palette_visible(client, w1, False) + _set_palette_visible(client, w2, False) + + _focus_window(client, w1) + client.simulate_shortcut("cmd+shift+p") + _wait_until( + lambda: _palette_visible(client, w1), + timeout_s=3.0, + message="cmd+shift+p did not open palette in window1", + ) + _wait_until( + lambda: str(_palette_results(client, w1).get("mode") or "") == "commands", + timeout_s=3.0, + message="window1 palette did not enter commands mode", + ) + window1_query_before = str(_palette_results(client, w1).get("query") or "") + + _focus_window(client, w2) + client.simulate_shortcut("cmd+p") + _wait_until( + lambda: _palette_visible(client, w2), + timeout_s=3.0, + message="cmd+p did not open palette in window2", + ) + _wait_until( + lambda: str(_palette_results(client, w2).get("mode") or "") == "switcher", + timeout_s=3.0, + message="window2 palette did not enter switcher mode", + ) + + typed = "" + for ch in "crosswindow": + typed += ch + client.simulate_type(ch) + _wait_until( + lambda expected=typed: str(_palette_results(client, w2).get("query") or "").lower() == expected, + timeout_s=1.8, + message=( + "typing into window2 palette did not accumulate query text " + f"(expected {typed!r})" + ), + ) + + window1_query_now = str(_palette_results(client, w1).get("query") or "") + if window1_query_now != window1_query_before: + raise cmuxError( + "typing in window2 changed window1 command-palette query " + f"(before={window1_query_before!r}, now={window1_query_now!r})" + ) + + def main() -> int: with cmux(SOCKET_PATH) as client: client.activate_app() @@ -51,8 +165,8 @@ def main() -> int: w2 = client.new_window() time.sleep(0.25) - ws1 = client.new_workspace(window_id=w1) - ws2 = client.new_workspace(window_id=w2) + _ = client.new_workspace(window_id=w1) + _ = client.new_workspace(window_id=w2) time.sleep(0.25) _set_palette_visible(client, w1, False) _set_palette_visible(client, w2, False) @@ -91,6 +205,12 @@ def main() -> int: message="window2 command palette did not close", ) + # Reproduce keyboard-shortcut window-scoping path: + # opening from window2 must not jump back and toggle window1. + _assert_shortcut_window_scoped(client, "cmd+shift+p", w1, w2) + _assert_shortcut_window_scoped(client, "cmd+p", w1, w2) + _assert_cross_window_typing_after_mixed_shortcuts(client, w1, w2) + print("PASS: command palette is scoped to active window") return 0 From f502f841442b9115b5a21390bbae403a5d5c9dc5 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:09:44 -0800 Subject: [PATCH 161/214] Add Read the Docs link below bottom CTA on homepage (#411) * Add "Read the Docs" link below bottom CTA on homepage * Increase top padding on Read the Docs link * Reduce docs horizontal padding on mobile * Align docs content with header on mobile, increase top padding * Make sticky header fully opaque with subtle bottom border * Fix sticky header on mobile by containing horizontal overflow in content area Wide content (hierarchy diagrams, code blocks) was causing horizontal page scroll, which breaks position:sticky on mobile browsers. Added overflow-x:hidden to the main content area (below the header in DOM) and overflow-x:auto to docs pre blocks so they scroll internally. * Remove bottom border from sticky header --- web/app/components/site-header.tsx | 2 +- web/app/docs/docs-nav.tsx | 6 +++--- web/app/globals.css | 5 +++++ web/app/page.tsx | 8 ++++++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/web/app/components/site-header.tsx b/web/app/components/site-header.tsx index ad7e6202..bc4da923 100644 --- a/web/app/components/site-header.tsx +++ b/web/app/components/site-header.tsx @@ -22,7 +22,7 @@ export function SiteHeader({ return ( <> - <header className="sticky top-0 z-30 w-full bg-background/80 backdrop-blur-sm"> + <header className="sticky top-0 z-30 w-full bg-background"> <div className="w-full max-w-6xl mx-auto flex items-center px-6 h-12"> {/* Left: logo + section */} <div className="flex flex-1 items-center gap-3 min-w-0"> diff --git a/web/app/docs/docs-nav.tsx b/web/app/docs/docs-nav.tsx index 30827c7d..243fac73 100644 --- a/web/app/docs/docs-nav.tsx +++ b/web/app/docs/docs-nav.tsx @@ -11,7 +11,7 @@ export function DocsNav({ children }: { children: React.ReactNode }) { const { open, toggle, close, drawerRef, buttonRef } = useMobileDrawer(); return ( - <div className="max-w-6xl mx-auto flex px-4"> + <div className="max-w-6xl mx-auto flex px-0 md:px-4"> {/* Mobile menu button */} <button ref={buttonRef} @@ -62,8 +62,8 @@ export function DocsNav({ children }: { children: React.ReactNode }) { </aside> {/* Content */} - <main className="flex-1 min-w-0"> - <div className="max-w-3xl px-6 pb-10 ml-0" data-dev="docs-content" style={{ paddingTop: 8 }}> + <main className="flex-1 min-w-0 overflow-x-hidden"> + <div className="max-w-full px-6 pb-10 ml-0" data-dev="docs-content" style={{ paddingTop: 16 }}> <div className="docs-content text-[15px]">{children}</div> <DocsPager /> </div> diff --git a/web/app/globals.css b/web/app/globals.css index a80da967..a10df622 100644 --- a/web/app/globals.css +++ b/web/app/globals.css @@ -159,6 +159,11 @@ body { box-shadow: 0 1px 0 rgba(0, 0, 0, 0.4); } +.docs-content pre { + overflow-x: auto; + max-width: 100%; +} + .docs-content pre code { background: none; padding: 0; diff --git a/web/app/page.tsx b/web/app/page.tsx index eb78a272..a15bc106 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -256,6 +256,14 @@ export default function Home() { <DownloadButton location="bottom" /> <GitHubButton /> </div> + <div className="flex justify-center mt-6"> + <a + href="/docs" + className="text-sm text-muted hover:text-foreground transition-colors underline underline-offset-2 decoration-border hover:decoration-foreground" + > + Read the Docs + </a> + </div> </main> From 8dc4f5bd0566ffbe9e381e601d61b8e8876df2e1 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:19:45 -0800 Subject: [PATCH 162/214] Fix ASCII diagram font rendering on concepts page (#420) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix ASCII diagram rendering: use system mono font for box-drawing chars Geist Mono renders box-drawing characters (┌─┐│└┘) at double width, breaking alignment in the concepts page diagram. Use system monospace fonts (Menlo, Monaco, Consolas) for ascii-variant code blocks, which handle these characters at correct single width. * Fix CSS specificity: code element was overriding pre font-family .docs-content code sets font-family to Geist Mono, which overrides the system mono font set on the parent pre element. Geist Mono is loaded with Latin subset only, lacking box-drawing glyphs (U+2500-257F), so browsers fall back to CJK-aware fonts that render them double-width. Fix: add font-family: inherit to .docs-content pre code so code elements inside pre blocks inherit the correct font from their parent. --- web/app/components/code-block.tsx | 18 ++++++++++++++---- web/app/globals.css | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/web/app/components/code-block.tsx b/web/app/components/code-block.tsx index e915e9d6..e31537d6 100644 --- a/web/app/components/code-block.tsx +++ b/web/app/components/code-block.tsx @@ -48,11 +48,21 @@ export async function CodeBlock({ </div> )} <pre - className={`bg-code-bg border border-border px-4 py-3 overflow-x-auto text-[13px] ${lineHeightClass} font-mono ${ - title ? "rounded-b-lg" : "rounded-lg" - }`} + className={`bg-code-bg border border-border px-4 py-3 overflow-x-auto text-[13px] ${lineHeightClass} ${ + variant === "ascii" ? "" : "font-mono " + }${title ? "rounded-b-lg" : "rounded-lg"}`} + style={ + variant === "ascii" + ? { + fontFamily: + "Menlo, Monaco, Consolas, 'Courier New', monospace", + } + : undefined + } > - <code>{children}</code> + <code style={variant === "ascii" ? { fontFamily: "inherit" } : undefined}> + {children} + </code> </pre> </div> ); diff --git a/web/app/globals.css b/web/app/globals.css index a10df622..0ecea6bb 100644 --- a/web/app/globals.css +++ b/web/app/globals.css @@ -168,6 +168,7 @@ body { background: none; padding: 0; font-size: 1em; + font-family: inherit; } /* Shiki dual theme */ From fb1802a54d64c0a228c5ea58398f845b62a51940 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:20:55 -0800 Subject: [PATCH 163/214] Guard terminal onFocus from re-entrant focus loops --- Sources/GhosttyTerminalView.swift | 4 +- Sources/Workspace.swift | 33 ++++++++-- Sources/WorkspaceContentView.swift | 2 +- ..._focus_panel_reentrant_guard_regression.py | 64 +++++++++++++++++++ 4 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 tests/test_focus_panel_reentrant_guard_regression.py diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index d5d0d719..15068928 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -2517,6 +2517,7 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { override func becomeFirstResponder() -> Bool { let result = super.becomeFirstResponder() + var shouldApplySurfaceFocus = false if result { // If we become first responder before the ghostty surface exists (e.g. during // split/tab creation while the surface is still being created), record the desired focus. @@ -2538,6 +2539,7 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { // stayed behind. let hiddenInHierarchy = isHiddenOrHasHiddenAncestor if isVisibleInUI && hasUsableFocusGeometry && !hiddenInHierarchy { + shouldApplySurfaceFocus = true onFocus?() } else if isVisibleInUI && (!hasUsableFocusGeometry || hiddenInHierarchy) { #if DEBUG @@ -2548,7 +2550,7 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { #endif } } - if result, let surface = ensureSurfaceReadyForInput() { + if result, shouldApplySurfaceFocus, let surface = ensureSurfaceReadyForInput() { let now = CACurrentMediaTime() let deltaMs = (now - lastScrollEventTime) * 1000 Self.focusLog("becomeFirstResponder: surface=\(terminalSurface?.id.uuidString ?? "nil") deltaSinceScrollMs=\(String(format: "%.2f", deltaMs))") diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 8877961d..9ea80bd3 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -347,6 +347,11 @@ final class Workspace: Identifiable, ObservableObject { return panel } + enum FocusPanelTrigger { + case standard + case terminalFirstResponder + } + /// Published directory for each panel @Published var panelDirectories: [UUID: String] = [:] @Published var panelTitles: [UUID: String] = [:] @@ -1940,12 +1945,19 @@ final class Workspace: Identifiable, ObservableObject { terminalPanel.hostedView.ensureFocus(for: id, surfaceId: preferredPanelId) } - func focusPanel(_ panelId: UUID, previousHostedView: GhosttySurfaceScrollView? = nil) { + func focusPanel( + _ panelId: UUID, + previousHostedView: GhosttySurfaceScrollView? = nil, + trigger: FocusPanelTrigger = .standard + ) { markExplicitFocusIntent(on: panelId) #if DEBUG let pane = bonsplitController.focusedPaneId?.id.uuidString.prefix(5) ?? "nil" - dlog("focus.panel panel=\(panelId.uuidString.prefix(5)) pane=\(pane)") - FocusLogStore.shared.append("Workspace.focusPanel panelId=\(panelId.uuidString) focusedPane=\(pane)") + let triggerLabel = trigger == .terminalFirstResponder ? "firstResponder" : "standard" + dlog("focus.panel panel=\(panelId.uuidString.prefix(5)) pane=\(pane) trigger=\(triggerLabel)") + FocusLogStore.shared.append( + "Workspace.focusPanel panelId=\(panelId.uuidString) focusedPane=\(pane) trigger=\(triggerLabel)" + ) #endif guard let tabId = surfaceIdFromPanelId(panelId) else { return } let currentlyFocusedPanelId = focusedPanelId @@ -1968,6 +1980,15 @@ final class Workspace: Identifiable, ObservableObject { return bonsplitController.focusedPaneId == targetPaneId && bonsplitController.selectedTab(inPane: targetPaneId)?.id == tabId }() + let shouldSuppressReentrantRefocus = trigger == .terminalFirstResponder && selectionAlreadyConverged +#if DEBUG + if shouldSuppressReentrantRefocus { + dlog( + "focus.panel.skipReentrant panel=\(panelId.uuidString.prefix(5)) " + + "reason=firstResponderAlreadyConverged" + ) + } +#endif if let targetPaneId, !selectionAlreadyConverged { bonsplitController.focusPane(targetPaneId) @@ -1979,11 +2000,11 @@ final class Workspace: Identifiable, ObservableObject { // Also focus the underlying panel if let panel = panels[panelId] { - if currentlyFocusedPanelId != panelId || !selectionAlreadyConverged { + if (currentlyFocusedPanelId != panelId || !selectionAlreadyConverged) && !shouldSuppressReentrantRefocus { panel.focus() } - if let terminalPanel = panel as? TerminalPanel { + if !shouldSuppressReentrantRefocus, let terminalPanel = panel as? TerminalPanel { // Avoid re-entrant focus loops when focus was initiated by AppKit first-responder // (becomeFirstResponder -> onFocus -> focusPanel). if !terminalPanel.hostedView.isSurfaceViewFirstResponder() { @@ -1991,7 +2012,7 @@ final class Workspace: Identifiable, ObservableObject { } } } - if let targetPaneId { + if let targetPaneId, !shouldSuppressReentrantRefocus { applyTabSelection(tabId: tabId, inPane: targetPaneId) } } diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index d209b4d2..392f9986 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -67,7 +67,7 @@ struct WorkspaceContentView: View { // indicator and where keyboard input/flash-focus actually lands. guard isWorkspaceInputActive else { return } guard workspace.panels[panel.id] != nil else { return } - workspace.focusPanel(panel.id) + workspace.focusPanel(panel.id, trigger: .terminalFirstResponder) }, onRequestPanelFocus: { guard isWorkspaceInputActive else { return } diff --git a/tests/test_focus_panel_reentrant_guard_regression.py b/tests/test_focus_panel_reentrant_guard_regression.py new file mode 100644 index 00000000..fbe2a5c3 --- /dev/null +++ b/tests/test_focus_panel_reentrant_guard_regression.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +"""Static regression checks for re-entrant terminal focus guard. + +Guards the fix for split-drag focus churn where: +becomeFirstResponder -> onFocus -> Workspace.focusPanel -> refocus side-effects +could repeatedly re-enter and spike CPU. +""" + +from __future__ import annotations + +import subprocess +from pathlib import Path + + +def repo_root() -> Path: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return Path(result.stdout.strip()) + return Path(__file__).resolve().parents[1] + + +def main() -> int: + root = repo_root() + failures: list[str] = [] + + workspace_path = root / "Sources" / "Workspace.swift" + workspace_source = workspace_path.read_text(encoding="utf-8") + + required_workspace_snippets = [ + "enum FocusPanelTrigger {", + "case terminalFirstResponder", + "trigger: FocusPanelTrigger = .standard", + "let shouldSuppressReentrantRefocus = trigger == .terminalFirstResponder && selectionAlreadyConverged", + "if let targetPaneId, !shouldSuppressReentrantRefocus {", + "reason=firstResponderAlreadyConverged", + ] + for snippet in required_workspace_snippets: + if snippet not in workspace_source: + failures.append(f"Workspace focus guard missing snippet: {snippet}") + + workspace_content_view_path = root / "Sources" / "WorkspaceContentView.swift" + workspace_content_view_source = workspace_content_view_path.read_text(encoding="utf-8") + focus_callback_snippet = "workspace.focusPanel(panel.id, trigger: .terminalFirstResponder)" + if focus_callback_snippet not in workspace_content_view_source: + failures.append( + "WorkspaceContentView terminal onFocus callback no longer passes .terminalFirstResponder trigger" + ) + + if failures: + print("FAIL: focus-panel re-entrant guard regression checks failed") + for item in failures: + print(f" - {item}") + return 1 + + print("PASS: focus-panel re-entrant guard is in place") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From b0d86a4f0ddf0b59289df0e83a5923fa13919993 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 20:45:25 -0800 Subject: [PATCH 164/214] Fix double-click titlebar zoom not working on browser panel side The browser portal's hit-test was intercepting clicks in the titlebar region, preventing double-click-to-zoom from reaching the window. Three fixes: - BrowserWindowPortal: pass through hits landing in the native titlebar - WindowDragHandleView: only let titlebar-overlay views block capture, not underlay browser content; respect AppleActionOnDoubleClick pref - ContentView: use shared performStandardTitlebarDoubleClick() helper Closes https://github.com/manaflow-ai/cmux/issues/422 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --- Sources/BrowserWindowPortal.swift | 11 +++++++ Sources/ContentView.swift | 11 +++---- Sources/WindowDragHandleView.swift | 50 +++++++++++++++++++++++++++--- 3 files changed, 61 insertions(+), 11 deletions(-) diff --git a/Sources/BrowserWindowPortal.swift b/Sources/BrowserWindowPortal.swift index 2e82cb66..448f0e46 100644 --- a/Sources/BrowserWindowPortal.swift +++ b/Sources/BrowserWindowPortal.swift @@ -117,6 +117,9 @@ final class WindowBrowserHostView: NSView { override func hitTest(_ point: NSPoint) -> NSView? { updateDividerCursor(at: point) + if shouldPassThroughToTitlebar(at: point) { + return nil + } if shouldPassThroughToSidebarResizer(at: point) { return nil } @@ -127,6 +130,14 @@ final class WindowBrowserHostView: NSView { return hitView === self ? nil : hitView } + private func shouldPassThroughToTitlebar(at point: NSPoint) -> Bool { + guard let window else { return false } + // Window-level portal hosts sit above SwiftUI content. Never intercept + // hits that land in the native titlebar region. + let windowPoint = convert(point, to: nil) + return windowPoint.y >= (window.contentLayoutRect.maxY - 0.5) + } + private func shouldPassThroughToSidebarResizer(at point: NSPoint) -> Bool { // Browser portal host sits above SwiftUI content. Allow pointer/mouse events // to reach the SwiftUI sidebar divider resizer zone. diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index bbb4cbe5..3a21ed9d 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -5241,8 +5241,8 @@ struct VerticalTabsSidebar: View { .allowsHitTesting(false) } .overlay(alignment: .top) { - // Double-click the sidebar title-bar area to zoom the - // window, matching the panel top-bar behaviour. + // Double-click the sidebar title-bar area to trigger the + // standard macOS titlebar action (zoom/minimize). DoubleClickZoomView() .frame(height: trafficLightPadding) } @@ -7492,11 +7492,10 @@ private struct DoubleClickZoomView: NSViewRepresentable { override var mouseDownCanMoveWindow: Bool { true } override func hitTest(_ point: NSPoint) -> NSView? { self } override func mouseDown(with event: NSEvent) { - if event.clickCount == 2 { - window?.zoom(nil) - } else { - super.mouseDown(with: event) + if event.clickCount == 2, performStandardTitlebarDoubleClick(window: window) { + return } + super.mouseDown(with: event) } } } diff --git a/Sources/WindowDragHandleView.swift b/Sources/WindowDragHandleView.swift index e9ce93f4..a468c088 100644 --- a/Sources/WindowDragHandleView.swift +++ b/Sources/WindowDragHandleView.swift @@ -6,6 +6,40 @@ private func windowDragHandleFormatPoint(_ point: NSPoint) -> String { String(format: "(%.1f,%.1f)", point.x, point.y) } +/// Runs the same action macOS titlebars use for double-click: +/// zoom by default, or minimize when the user preference is set. +@discardableResult +func performStandardTitlebarDoubleClick(window: NSWindow?) -> Bool { + guard let window else { return false } + + let globalDefaults = UserDefaults.standard.persistentDomain(forName: UserDefaults.globalDomain) ?? [:] + if let action = (globalDefaults["AppleActionOnDoubleClick"] as? String)? + .trimmingCharacters(in: .whitespacesAndNewlines) + .lowercased() { + switch action { + case "minimize": + window.miniaturize(nil) + return true + case "none": + return false + case "maximize", "zoom": + window.zoom(nil) + return true + default: + break + } + } + + if let miniaturizeOnDoubleClick = globalDefaults["AppleMiniaturizeOnDoubleClick"] as? Bool, + miniaturizeOnDoubleClick { + window.miniaturize(nil) + return true + } + + window.zoom(nil) + return true +} + private var windowDragSuppressionDepthKey: UInt8 = 0 func beginWindowDragSuppression(window: NSWindow?) -> Int? { @@ -154,16 +188,20 @@ func windowDragHandleShouldCaptureHit(_ point: NSPoint, in dragHandleView: NSVie if let topHit { let ownsTopHit = topHit === dragHandleView || topHit.isDescendant(of: dragHandleView) + let topHitBelongsToTitlebarOverlay = topHit === superview || topHit.isDescendant(of: superview) let isPassiveHostHit = windowDragHandleShouldTreatTopHitAsPassiveHost(topHit) #if DEBUG dlog( - "titlebar.dragHandle.hitTest capture=\(ownsTopHit) strategy=windowTopHit point=\(windowDragHandleFormatPoint(point)) top=\(type(of: topHit)) passiveHost=\(isPassiveHostHit)" + "titlebar.dragHandle.hitTest capture=\(ownsTopHit) strategy=windowTopHit point=\(windowDragHandleFormatPoint(point)) top=\(type(of: topHit)) inTitlebarOverlay=\(topHitBelongsToTitlebarOverlay) passiveHost=\(isPassiveHostHit)" ) #endif if ownsTopHit { return true } - if !isPassiveHostHit { + // Underlay content can transiently overlap titlebar space (notably browser + // chrome/webview layers). Only let top-hits block capture when they belong + // to this titlebar overlay stack. + if topHitBelongsToTitlebarOverlay && !isPassiveHostHit { return false } } @@ -238,11 +276,13 @@ struct WindowDragHandleView: NSViewRepresentable { #endif if event.clickCount >= 2 { - window?.zoom(nil) + let handled = performStandardTitlebarDoubleClick(window: window) #if DEBUG - dlog("titlebar.dragHandle.mouseDownDoubleClick zoom=1") + dlog("titlebar.dragHandle.mouseDownDoubleClick handled=\(handled ? 1 : 0)") #endif - return + if handled { + return + } } guard !isWindowDragSuppressed(window: window) else { From 3d592fb09a14631d9686d5c02647945013e72cbf Mon Sep 17 00:00:00 2001 From: "Amar Sood (tekacs)" <pkg@tekacs.com> Date: Mon, 23 Feb 2026 23:45:57 -0500 Subject: [PATCH 165/214] Fix window title updates applying to wrong window TabManager.updateWindowTitle() used NSApp.keyWindow to find the target window, meaning any terminal title change (e.g. a spinner) would update whichever window happened to be focused, not the window that owns that TabManager. This corrupted the macOS Accessibility title attribute and caused visible title flapping in multi-window setups. Add a weak back-reference from TabManager to its owning NSWindow, set by AppDelegate.registerMainWindow(), and use it instead of keyWindow. --- Sources/AppDelegate.swift | 2 ++ Sources/TabManager.swift | 8 ++++++-- vendor/bonsplit | 1 - 3 files changed, 8 insertions(+), 3 deletions(-) delete mode 160000 vendor/bonsplit diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index debc0e09..dd7e7fac 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -478,6 +478,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent sidebarState: SidebarState, sidebarSelectionState: SidebarSelectionState ) { + tabManager.window = window + let key = ObjectIdentifier(window) if let existing = mainWindowContexts[key] { existing.window = window diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 6c84d402..eb922785 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -309,6 +309,10 @@ fileprivate func cmuxVsyncIOSurfaceTimelineCallback( @MainActor class TabManager: ObservableObject { + /// The window that owns this TabManager. Set by AppDelegate.registerMainWindow(). + /// Used to apply title updates to the correct window instead of NSApp.keyWindow. + weak var window: NSWindow? + @Published var tabs: [Workspace] = [] @Published private(set) var isWorkspaceCycleHot: Bool = false @@ -1161,8 +1165,8 @@ class TabManager: ObservableObject { private func updateWindowTitle(for tab: Workspace?) { let title = windowTitle(for: tab) - let targetWindow = NSApp.keyWindow ?? NSApp.mainWindow ?? NSApp.windows.first - targetWindow?.title = title + guard let targetWindow = window else { return } + targetWindow.title = title } private func windowTitle(for tab: Workspace?) -> String { diff --git a/vendor/bonsplit b/vendor/bonsplit deleted file mode 160000 index dd20247b..00000000 --- a/vendor/bonsplit +++ /dev/null @@ -1 +0,0 @@ -Subproject commit dd20247b5536b4bd5b9b15cdf940e847daa1a18d From 1893fc4c7a426b5b2dde0b315f48aecf9d5c6714 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:09:36 -0800 Subject: [PATCH 166/214] Use native WebKit middle-click handling for browser links (#416) * Add middle-click debug logging for browser links * Handle browser middle-click via native WebKit actions * Fix flaky middle-click new-tab detection in browser --- Sources/Panels/BrowserPanel.swift | 165 ++++++++++++++++-- Sources/Panels/BrowserPanelView.swift | 8 - Sources/Panels/CmuxWebView.swift | 74 ++++++-- Sources/TabManager.swift | 1 - cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 108 ++++++++++++ 5 files changed, 314 insertions(+), 42 deletions(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 39805285..9427b67d 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1857,15 +1857,43 @@ extension BrowserPanel { /// Open a link in a new browser surface in the same pane func openLinkInNewTab(url: URL, bypassInsecureHTTPHostOnce: String? = nil) { - guard let tabManager = AppDelegate.shared?.tabManager, - let workspace = tabManager.tabs.first(where: { $0.id == workspaceId }), - let paneId = workspace.paneId(forPanelId: id) else { return } +#if DEBUG + dlog( + "browser.newTab.open.begin panel=\(id.uuidString.prefix(5)) " + + "workspace=\(workspaceId.uuidString.prefix(5)) url=\(url.absoluteString) " + + "bypass=\(bypassInsecureHTTPHostOnce ?? "nil")" + ) +#endif + guard let tabManager = AppDelegate.shared?.tabManager else { +#if DEBUG + dlog("browser.newTab.open.abort panel=\(id.uuidString.prefix(5)) reason=missingTabManager") +#endif + return + } + guard let workspace = tabManager.tabs.first(where: { $0.id == workspaceId }) else { +#if DEBUG + dlog("browser.newTab.open.abort panel=\(id.uuidString.prefix(5)) reason=workspaceMissing") +#endif + return + } + guard let paneId = workspace.paneId(forPanelId: id) else { +#if DEBUG + dlog("browser.newTab.open.abort panel=\(id.uuidString.prefix(5)) reason=paneMissing") +#endif + return + } workspace.newBrowserSurface( inPane: paneId, url: url, focus: true, bypassInsecureHTTPHostOnce: bypassInsecureHTTPHostOnce ) +#if DEBUG + dlog( + "browser.newTab.open.done panel=\(id.uuidString.prefix(5)) " + + "workspace=\(workspace.id.uuidString.prefix(5)) pane=\(paneId.id.uuidString.prefix(5))" + ) +#endif } /// Reload the current page @@ -2507,6 +2535,39 @@ private class BrowserDownloadDelegate: NSObject, WKDownloadDelegate { // MARK: - Navigation Delegate +func browserNavigationShouldOpenInNewTab( + navigationType: WKNavigationType, + modifierFlags: NSEvent.ModifierFlags, + buttonNumber: Int, + hasRecentMiddleClickIntent: Bool = false, + currentEventType: NSEvent.EventType? = NSApp.currentEvent?.type, + currentEventButtonNumber: Int? = NSApp.currentEvent?.buttonNumber +) -> Bool { + guard navigationType == .linkActivated || navigationType == .other else { + return false + } + + if modifierFlags.contains(.command) { + return true + } + if buttonNumber == 2 { + return true + } + // In some WebKit paths, middle-click arrives as buttonNumber=4. + // Recover intent when we just observed a local middle-click. + if buttonNumber == 4, hasRecentMiddleClickIntent { + return true + } + + // WebKit can omit buttonNumber for middle-click link activations. + if let currentEventType, + (currentEventType == .otherMouseDown || currentEventType == .otherMouseUp), + currentEventButtonNumber == 2 { + return true + } + return false +} + private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { var didFinish: ((WKWebView) -> Void)? var didFailNavigation: ((WKWebView, String) -> Void)? @@ -2645,16 +2706,41 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void ) { + let hasRecentMiddleClickIntent = CmuxWebView.hasRecentMiddleClickIntent(for: webView) + let shouldOpenInNewTab = browserNavigationShouldOpenInNewTab( + navigationType: navigationAction.navigationType, + modifierFlags: navigationAction.modifierFlags, + buttonNumber: navigationAction.buttonNumber, + hasRecentMiddleClickIntent: hasRecentMiddleClickIntent + ) +#if DEBUG + let currentEventType = NSApp.currentEvent.map { String(describing: $0.type) } ?? "nil" + let currentEventButton = NSApp.currentEvent.map { String($0.buttonNumber) } ?? "nil" + let navType = String(describing: navigationAction.navigationType) + dlog( + "browser.nav.decidePolicy navType=\(navType) button=\(navigationAction.buttonNumber) " + + "mods=\(navigationAction.modifierFlags.rawValue) targetNil=\(navigationAction.targetFrame == nil ? 1 : 0) " + + "eventType=\(currentEventType) eventButton=\(currentEventButton) " + + "recentMiddleIntent=\(hasRecentMiddleClickIntent ? 1 : 0) " + + "openInNewTab=\(shouldOpenInNewTab ? 1 : 0)" + ) +#endif + if let url = navigationAction.request.url, navigationAction.targetFrame?.isMainFrame != false, shouldBlockInsecureHTTPNavigation?(url) == true { let intent: BrowserInsecureHTTPNavigationIntent - if navigationAction.navigationType == .linkActivated, - navigationAction.modifierFlags.contains(.command) { + if shouldOpenInNewTab { intent = .newTab } else { intent = .currentTab } +#if DEBUG + dlog( + "browser.nav.decidePolicy.action kind=blockedInsecure intent=\(intent == .newTab ? "newTab" : "currentTab") " + + "url=\(url.absoluteString)" + ) +#endif handleBlockedInsecureHTTPNavigation?(navigationAction.request, intent) decisionHandler(.cancel) return @@ -2676,23 +2762,33 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { return } - // target=_blank or window.open() — navigate in the current webview - if navigationAction.targetFrame == nil, - navigationAction.request.url != nil { - webView.load(navigationAction.request) - decisionHandler(.cancel) - return - } - - // Cmd+click on a regular link — open in a new tab - if navigationAction.navigationType == .linkActivated, - navigationAction.modifierFlags.contains(.command), + // Cmd+click and middle-click on regular links should always open in a new tab. + if shouldOpenInNewTab, let url = navigationAction.request.url { +#if DEBUG + dlog("browser.nav.decidePolicy.action kind=openInNewTab url=\(url.absoluteString)") +#endif openInNewTab?(url) decisionHandler(.cancel) return } + // target=_blank or window.open() without explicit new-tab intent — navigate in-place. + if navigationAction.targetFrame == nil, + navigationAction.request.url != nil { +#if DEBUG + let targetURL = navigationAction.request.url?.absoluteString ?? "nil" + dlog("browser.nav.decidePolicy.action kind=loadInPlaceFromNilTarget url=\(targetURL)") +#endif + webView.load(navigationAction.request) + decisionHandler(.cancel) + return + } + +#if DEBUG + let targetURL = navigationAction.request.url?.absoluteString ?? "nil" + dlog("browser.nav.decidePolicy.action kind=allow url=\(targetURL)") +#endif decisionHandler(.allow) } @@ -2791,13 +2887,32 @@ private class BrowserUIDelegate: NSObject, WKUIDelegate { } /// Returning nil tells WebKit not to open a new window. - /// Cmd+click opens in a new tab; regular target=_blank navigates in-place. + /// Cmd+click and middle-click open in a new tab; regular target=_blank navigates in-place. func webView( _ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures ) -> WKWebView? { + let hasRecentMiddleClickIntent = CmuxWebView.hasRecentMiddleClickIntent(for: webView) + let shouldOpenInNewTab = browserNavigationShouldOpenInNewTab( + navigationType: navigationAction.navigationType, + modifierFlags: navigationAction.modifierFlags, + buttonNumber: navigationAction.buttonNumber, + hasRecentMiddleClickIntent: hasRecentMiddleClickIntent + ) +#if DEBUG + let currentEventType = NSApp.currentEvent.map { String(describing: $0.type) } ?? "nil" + let currentEventButton = NSApp.currentEvent.map { String($0.buttonNumber) } ?? "nil" + let navType = String(describing: navigationAction.navigationType) + dlog( + "browser.nav.createWebView navType=\(navType) button=\(navigationAction.buttonNumber) " + + "mods=\(navigationAction.modifierFlags.rawValue) targetNil=\(navigationAction.targetFrame == nil ? 1 : 0) " + + "eventType=\(currentEventType) eventButton=\(currentEventButton) " + + "recentMiddleIntent=\(hasRecentMiddleClickIntent ? 1 : 0) " + + "openInNewTab=\(shouldOpenInNewTab ? 1 : 0)" + ) +#endif if let url = navigationAction.request.url { if browserShouldOpenURLExternally(url) { let opened = NSWorkspace.shared.open(url) @@ -2811,11 +2926,23 @@ private class BrowserUIDelegate: NSObject, WKUIDelegate { } if let requestNavigation { let intent: BrowserInsecureHTTPNavigationIntent = - navigationAction.modifierFlags.contains(.command) ? .newTab : .currentTab + shouldOpenInNewTab ? .newTab : .currentTab +#if DEBUG + dlog( + "browser.nav.createWebView.action kind=requestNavigation intent=\(intent == .newTab ? "newTab" : "currentTab") " + + "url=\(url.absoluteString)" + ) +#endif requestNavigation(navigationAction.request, intent) - } else if navigationAction.modifierFlags.contains(.command) { + } else if shouldOpenInNewTab { +#if DEBUG + dlog("browser.nav.createWebView.action kind=openInNewTab url=\(url.absoluteString)") +#endif openInNewTab?(url) } else { +#if DEBUG + dlog("browser.nav.createWebView.action kind=loadInPlace url=\(url.absoluteString)") +#endif webView.load(navigationAction.request) } } diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 71518994..82069f74 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -332,14 +332,6 @@ struct BrowserPanelView: View { #endif onRequestPanelFocus() } - .onReceive(NotificationCenter.default.publisher(for: .webViewMiddleClickedLink).filter { [weak panel] note in - guard let webView = note.object as? CmuxWebView else { return false } - return webView === panel?.webView - }) { note in - if let url = note.userInfo?["url"] as? URL { - panel.openLinkInNewTab(url: url) - } - } .onAppear { UserDefaults.standard.register(defaults: [ BrowserSearchSettings.searchEngineKey: BrowserSearchSettings.defaultSearchEngine.rawValue, diff --git a/Sources/Panels/CmuxWebView.swift b/Sources/Panels/CmuxWebView.swift index 8f2a3a28..68a13282 100644 --- a/Sources/Panels/CmuxWebView.swift +++ b/Sources/Panels/CmuxWebView.swift @@ -8,6 +8,37 @@ import WebKit /// key equivalents first so app-level shortcuts continue to work when WebKit is /// the first responder. final class CmuxWebView: WKWebView { + // Some sites/WebKit paths report middle-click link activations as + // WKNavigationAction.buttonNumber=4 instead of 2. Track a recent local + // middle-click so navigation delegates can recover intent reliably. + private struct MiddleClickIntent { + let webViewID: ObjectIdentifier + let uptime: TimeInterval + } + + private static var lastMiddleClickIntent: MiddleClickIntent? + private static let middleClickIntentMaxAge: TimeInterval = 0.8 + + static func hasRecentMiddleClickIntent(for webView: WKWebView) -> Bool { + guard let webView = webView as? CmuxWebView else { return false } + guard let intent = lastMiddleClickIntent else { return false } + + let age = ProcessInfo.processInfo.systemUptime - intent.uptime + if age > middleClickIntentMaxAge { + lastMiddleClickIntent = nil + return false + } + + return intent.webViewID == ObjectIdentifier(webView) + } + + private static func recordMiddleClickIntent(for webView: CmuxWebView) { + lastMiddleClickIntent = MiddleClickIntent( + webViewID: ObjectIdentifier(webView), + uptime: ProcessInfo.processInfo.systemUptime + ) + } + private final class ContextMenuFallbackBox: NSObject { weak var target: AnyObject? let action: Selector? @@ -136,16 +167,33 @@ final class CmuxWebView: WKWebView { } } - // MARK: - Mouse back/forward buttons & middle-click + // MARK: - Mouse back/forward buttons override func otherMouseDown(with event: NSEvent) { + if event.buttonNumber == 2 { + Self.recordMiddleClickIntent(for: self) + } +#if DEBUG + let point = convert(event.locationInWindow, from: nil) + let mods = event.modifierFlags.intersection(.deviceIndependentFlagsMask).rawValue + dlog( + "browser.mouse.otherDown web=\(ObjectIdentifier(self)) button=\(event.buttonNumber) " + + "clicks=\(event.clickCount) mods=\(mods) point=(\(Int(point.x)),\(Int(point.y)))" + ) +#endif // Button 3 = back, button 4 = forward (multi-button mice like Logitech). // Consume the event so WebKit doesn't handle it. switch event.buttonNumber { case 3: +#if DEBUG + dlog("browser.mouse.otherDown.action web=\(ObjectIdentifier(self)) kind=goBack canGoBack=\(canGoBack ? 1 : 0)") +#endif goBack() return case 4: +#if DEBUG + dlog("browser.mouse.otherDown.action web=\(ObjectIdentifier(self)) kind=goForward canGoForward=\(canGoForward ? 1 : 0)") +#endif goForward() return default: @@ -155,25 +203,23 @@ final class CmuxWebView: WKWebView { } override func otherMouseUp(with event: NSEvent) { - // Middle-click (button 2) on a link opens it in a new tab. if event.buttonNumber == 2 { - let point = convert(event.locationInWindow, from: nil) - findLinkAtPoint(point) { [weak self] url in - guard let self, let url else { return } - NotificationCenter.default.post( - name: .webViewMiddleClickedLink, - object: self, - userInfo: ["url": url] - ) - } - return + Self.recordMiddleClickIntent(for: self) } +#if DEBUG + let point = convert(event.locationInWindow, from: nil) + let mods = event.modifierFlags.intersection(.deviceIndependentFlagsMask).rawValue + dlog( + "browser.mouse.otherUp web=\(ObjectIdentifier(self)) button=\(event.buttonNumber) " + + "clicks=\(event.clickCount) mods=\(mods) point=(\(Int(point.x)),\(Int(point.y)))" + ) +#endif super.otherMouseUp(with: event) } - /// Use JavaScript to find the nearest anchor element at the given view-local point. + /// Finds the nearest anchor element at a given view-local point. + /// Used as a context-menu download fallback. private func findLinkAtPoint(_ point: NSPoint, completion: @escaping (URL?) -> Void) { - // WKWebView's coordinate system is flipped (origin top-left for web content). let flippedY = bounds.height - point.y let js = """ (() => { diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 0f2242d6..461b1abe 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -3167,5 +3167,4 @@ extension Notification.Name { static let browserDidFocusAddressBar = Notification.Name("browserDidFocusAddressBar") static let browserDidBlurAddressBar = Notification.Name("browserDidBlurAddressBar") static let webViewDidReceiveClick = Notification.Name("webViewDidReceiveClick") - static let webViewMiddleClickedLink = Notification.Name("webViewMiddleClickedLink") } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 7f5dcb51..9ca9fb4d 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1016,6 +1016,114 @@ final class BrowserDeveloperToolsConfigurationTests: XCTestCase { } } +final class BrowserNavigationNewTabDecisionTests: XCTestCase { + func testLinkActivatedCmdClickOpensInNewTab() { + XCTAssertTrue( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [.command], + buttonNumber: 0 + ) + ) + } + + func testLinkActivatedMiddleClickOpensInNewTab() { + XCTAssertTrue( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [], + buttonNumber: 2 + ) + ) + } + + func testLinkActivatedPlainLeftClickStaysInCurrentTab() { + XCTAssertFalse( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [], + buttonNumber: 0 + ) + ) + } + + func testOtherNavigationMiddleClickOpensInNewTab() { + XCTAssertTrue( + browserNavigationShouldOpenInNewTab( + navigationType: .other, + modifierFlags: [], + buttonNumber: 2 + ) + ) + } + + func testOtherNavigationLeftClickStaysInCurrentTab() { + XCTAssertFalse( + browserNavigationShouldOpenInNewTab( + navigationType: .other, + modifierFlags: [], + buttonNumber: 0 + ) + ) + } + + func testLinkActivatedButtonFourWithoutMiddleIntentStaysInCurrentTab() { + XCTAssertFalse( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [], + buttonNumber: 4, + hasRecentMiddleClickIntent: false + ) + ) + } + + func testLinkActivatedButtonFourWithRecentMiddleIntentOpensInNewTab() { + XCTAssertTrue( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [], + buttonNumber: 4, + hasRecentMiddleClickIntent: true + ) + ) + } + + func testLinkActivatedUsesCurrentEventFallbackForMiddleClick() { + XCTAssertTrue( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [], + buttonNumber: 0, + currentEventType: .otherMouseUp, + currentEventButtonNumber: 2 + ) + ) + } + + func testCurrentEventFallbackDoesNotAffectNonLinkNavigation() { + XCTAssertFalse( + browserNavigationShouldOpenInNewTab( + navigationType: .reload, + modifierFlags: [], + buttonNumber: 0, + currentEventType: .otherMouseUp, + currentEventButtonNumber: 2 + ) + ) + } + + func testNonLinkNavigationNeverForcesNewTab() { + XCTAssertFalse( + browserNavigationShouldOpenInNewTab( + navigationType: .reload, + modifierFlags: [.command], + buttonNumber: 2 + ) + ) + } +} + @MainActor final class BrowserJavaScriptDialogDelegateTests: XCTestCase { func testBrowserPanelUIDelegateImplementsJavaScriptDialogSelectors() { From 161e7538f27c5a1179cd0c3dcb5f676722c9f1da Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:34:25 -0800 Subject: [PATCH 167/214] Add new testimonials to wall of love (#427) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add three new testimonials to wall of love - Norihiro Narayama (@northprint) — Japanese testimonial with subtle translation - Kishore Neelamegam (@indykish) - かたりん (@kataring) — Japanese testimonial with subtle translation * Add あさざ (@asaza_0928) testimonial to wall of love * Move あさざ testimonial to third position --- web/app/page.tsx | 3 +++ web/app/testimonials.tsx | 40 ++++++++++++++++++++++++++++++ web/public/avatars/asaza_0928.jpg | Bin 0 -> 41869 bytes web/public/avatars/indykish.jpg | Bin 0 -> 20720 bytes web/public/avatars/kataring.jpg | Bin 0 -> 12131 bytes web/public/avatars/northprint.jpg | Bin 0 -> 9221 bytes 6 files changed, 43 insertions(+) create mode 100644 web/public/avatars/asaza_0928.jpg create mode 100644 web/public/avatars/indykish.jpg create mode 100644 web/public/avatars/kataring.jpg create mode 100644 web/public/avatars/northprint.jpg diff --git a/web/app/page.tsx b/web/app/page.tsx index a15bc106..2093dd33 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -225,6 +225,9 @@ export default function Home() { <span className="text-muted group-hover:text-foreground transition-colors"> "{t.text}" </span> + {"translation" in t && t.translation && ( + <span className="text-muted/60 text-xs italic"> — {t.translation}</span> + )} </a> {" "} <a diff --git a/web/app/testimonials.tsx b/web/app/testimonials.tsx index 6b484a9a..9b0d5b10 100644 --- a/web/app/testimonials.tsx +++ b/web/app/testimonials.tsx @@ -17,6 +17,15 @@ export const testimonials = [ url: "https://x.com/schrockn/status/2025182278637207857", platform: "x" as const, }, + { + name: "あさざ", + handle: "@asaza_0928", + avatar: "/avatars/asaza_0928.jpg", + text: "cmux 良さそうすぎてついにバイバイ VSCode するときなのかもしれない", + translation: "cmux looks so good it might finally be time to say goodbye to VSCode", + url: "https://x.com/asaza_0928/status/2026057269075698015", + platform: "x" as const, + }, { name: "johnthedebs", handle: "johnthedebs", @@ -49,6 +58,32 @@ export const testimonials = [ url: "https://www.reddit.com/r/ClaudeCode/comments/1r9g45u/comment/o6sxbr3/", platform: "reddit" as const, }, + { + name: "Norihiro Narayama", + handle: "@northprint", + avatar: "/avatars/northprint.jpg", + text: "cmux良さそうなので入れてみたけれど、良い", + translation: "Tried cmux since it looked good — it's good", + url: "https://x.com/northprint/status/2025740286677434581", + platform: "x" as const, + }, + { + name: "Kishore Neelamegam", + handle: "@indykish", + avatar: "/avatars/indykish.jpg", + text: "cmux is pretty good.", + url: "https://x.com/indykish/status/2025318347970412673", + platform: "x" as const, + }, + { + name: "かたりん", + handle: "@kataring", + avatar: "/avatars/kataring.jpg", + text: "cmux.dev に乗り換えた", + translation: "Switched to cmux.dev", + url: "https://x.com/kataring/status/2026189035056832718", + platform: "x" as const, + }, ]; export type Testimonial = (typeof testimonials)[number]; @@ -159,6 +194,11 @@ export function TestimonialCard({ <p className="text-[15px] leading-relaxed text-muted group-hover:text-foreground transition-colors"> {testimonial.text} </p> + {"translation" in testimonial && testimonial.translation && ( + <p className="text-xs text-muted/60 mt-1.5 italic"> + {testimonial.translation} + </p> + )} </a> ); } diff --git a/web/public/avatars/asaza_0928.jpg b/web/public/avatars/asaza_0928.jpg new file mode 100644 index 0000000000000000000000000000000000000000..947179f80ace30bd3d150620219219e7a8115789 GIT binary patch literal 41869 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 RcS+-l#0jxa>@@IK|Jfv4fLH(k literal 0 HcmV?d00001 diff --git a/web/public/avatars/indykish.jpg b/web/public/avatars/indykish.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d7e5fab637bbd97a40a8325e79577918b2eeff5 GIT binary patch literal 20720 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 literal 0 HcmV?d00001 diff --git a/web/public/avatars/kataring.jpg b/web/public/avatars/kataring.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de7c58ba3f133df55292bee809443503f714c6bd GIT binary patch literal 12131 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 PiIMuf*nK>6xB9;T)&dP@ literal 0 HcmV?d00001 diff --git a/web/public/avatars/northprint.jpg b/web/public/avatars/northprint.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c48824404ee8ac0019d1f0051de475db16825a2 GIT binary patch literal 9221 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 T!X2*>uBhfkV0Su{GVy-^haZ7J literal 0 HcmV?d00001 From cd030732406d84aac71e75ec273d5be7e3cebc29 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:57:09 -0800 Subject: [PATCH 168/214] Fix tab drag blank state and preserve non-custom titles across window drops --- GhosttyTabs.xcodeproj/project.pbxproj | 56 +++++++------- Sources/GhosttyTerminalView.swift | 77 ++++++++++++++++--- Sources/Workspace.swift | 29 ++++++- Sources/WorkspaceContentView.swift | 17 +++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 45 +++++++++++ .../WorkspaceContentViewVisibilityTests.swift | 49 ++++++++++++ 6 files changed, 234 insertions(+), 39 deletions(-) create mode 100644 cmuxTests/WorkspaceContentViewVisibilityTests.swift diff --git a/GhosttyTabs.xcodeproj/project.pbxproj b/GhosttyTabs.xcodeproj/project.pbxproj index 3448b298..82c0d154 100644 --- a/GhosttyTabs.xcodeproj/project.pbxproj +++ b/GhosttyTabs.xcodeproj/project.pbxproj @@ -77,6 +77,7 @@ F2000000A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */; }; F3000000A1B2C3D4E5F60718 /* CJKIMEInputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */; }; F4000000A1B2C3D4E5F60718 /* GhosttyConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */; }; + F5000000A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5000001A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -198,10 +199,11 @@ D0E0F0B1A1B2C3D4E5F60718 /* BrowserPaneNavigationKeybindUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowserPaneNavigationKeybindUITests.swift; sourceTree = "<group>"; }; D0E0F0B3A1B2C3D4E5F60718 /* BrowserOmnibarSuggestionsUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowserOmnibarSuggestionsUITests.swift; sourceTree = "<group>"; }; E1000001A1B2C3D4E5F60718 /* MenuKeyEquivalentRoutingUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuKeyEquivalentRoutingUITests.swift; sourceTree = "<group>"; }; - F1000001A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmuxWebViewKeyEquivalentTests.swift; sourceTree = "<group>"; }; - F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePillReleaseVisibilityTests.swift; sourceTree = "<group>"; }; - F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CJKIMEInputTests.swift; sourceTree = "<group>"; }; - F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhosttyConfigTests.swift; sourceTree = "<group>"; }; + F1000001A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmuxWebViewKeyEquivalentTests.swift; sourceTree = "<group>"; }; + F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePillReleaseVisibilityTests.swift; sourceTree = "<group>"; }; + F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CJKIMEInputTests.swift; sourceTree = "<group>"; }; + F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhosttyConfigTests.swift; sourceTree = "<group>"; }; + F5000001A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceContentViewVisibilityTests.swift; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -401,17 +403,18 @@ path = cmuxUITests; sourceTree = "<group>"; }; - F1000003A1B2C3D4E5F60718 /* cmuxTests */ = { - isa = PBXGroup; - children = ( - F1000001A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift */, - F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */, - F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */, - F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */, - ); - path = cmuxTests; - sourceTree = "<group>"; - }; + F1000003A1B2C3D4E5F60718 /* cmuxTests */ = { + isa = PBXGroup; + children = ( + F1000001A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift */, + F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */, + F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */, + F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */, + F5000001A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift */, + ); + path = cmuxTests; + sourceTree = "<group>"; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -601,17 +604,18 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F1000005A1B2C3D4E5F60718 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F1000000A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift in Sources */, - F2000000A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift in Sources */, - F3000000A1B2C3D4E5F60718 /* CJKIMEInputTests.swift in Sources */, - F4000000A1B2C3D4E5F60718 /* GhosttyConfigTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; + F1000005A1B2C3D4E5F60718 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F1000000A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift in Sources */, + F2000000A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift in Sources */, + F3000000A1B2C3D4E5F60718 /* CJKIMEInputTests.swift in Sources */, + F4000000A1B2C3D4E5F60718 /* GhosttyConfigTests.swift in Sources */, + F5000000A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; B9000006A1B2C3D4E5F60719 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 15068928..ecb5b7dc 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -4104,9 +4104,11 @@ final class GhosttySurfaceScrollView: NSView { isHidden = !visible #if DEBUG if wasVisible != visible { + let transition = "\(wasVisible ? 1 : 0)->\(visible ? 1 : 0)" + let suffix = debugVisibilityStateSuffix(transition: transition) debugLogWorkspaceSwitchTiming( event: "ws.term.visible", - suffix: "surface=\(surfaceView.terminalSurface?.id.uuidString.prefix(5) ?? "nil") value=\(visible ? 1 : 0)" + suffix: suffix ) } #endif @@ -4126,9 +4128,11 @@ final class GhosttySurfaceScrollView: NSView { isActive = active #if DEBUG if wasActive != active { + let transition = "\(wasActive ? 1 : 0)->\(active ? 1 : 0)" + let suffix = debugVisibilityStateSuffix(transition: transition) debugLogWorkspaceSwitchTiming( event: "ws.term.active", - suffix: "surface=\(surfaceView.terminalSurface?.id.uuidString.prefix(5) ?? "nil") value=\(active ? 1 : 0)" + suffix: suffix ) } #endif @@ -4150,6 +4154,37 @@ final class GhosttySurfaceScrollView: NSView { let dtMs = (CACurrentMediaTime() - snapshot.startedAt) * 1000 dlog("\(event) id=\(snapshot.id) dt=\(String(format: "%.2fms", dtMs)) \(suffix)") } + + private func debugFirstResponderLabel() -> String { + guard let window, let firstResponder = window.firstResponder else { return "nil" } + if let view = firstResponder as? NSView { + if view === surfaceView { + return "surfaceView" + } + if view.isDescendant(of: surfaceView) { + return "surfaceDescendant" + } + return String(describing: type(of: view)) + } + return String(describing: type(of: firstResponder)) + } + + private func debugVisibilityStateSuffix(transition: String) -> String { + let surface = surfaceView.terminalSurface?.id.uuidString.prefix(5) ?? "nil" + let hiddenInHierarchy = (isHiddenOrHasHiddenAncestor || surfaceView.isHiddenOrHasHiddenAncestor) ? 1 : 0 + let inWindow = window != nil ? 1 : 0 + let hasSuperview = superview != nil ? 1 : 0 + let hostHidden = isHidden ? 1 : 0 + let surfaceHidden = surfaceView.isHidden ? 1 : 0 + let boundsText = String(format: "%.1fx%.1f", bounds.width, bounds.height) + let frameText = String(format: "%.1fx%.1f", frame.width, frame.height) + let responder = debugFirstResponderLabel() + return + "surface=\(surface) transition=\(transition) active=\(isActive ? 1 : 0) " + + "visibleFlag=\(surfaceView.isVisibleInUI ? 1 : 0) hostHidden=\(hostHidden) surfaceHidden=\(surfaceHidden) " + + "hiddenHierarchy=\(hiddenInHierarchy) inWindow=\(inWindow) hasSuperview=\(hasSuperview) " + + "bounds=\(boundsText) frame=\(frameText) firstResponder=\(responder)" + } #endif func moveFocus(from previous: GhosttySurfaceScrollView? = nil, delay: TimeInterval? = nil) { @@ -5001,32 +5036,36 @@ struct GhosttyTerminalView: NSViewRepresentable { func updateNSView(_ nsView: NSView, context: Context) { let hostedView = terminalSurface.hostedView let coordinator = context.coordinator -#if DEBUG let previousDesiredIsActive = coordinator.desiredIsActive -#endif let previousDesiredIsVisibleInUI = coordinator.desiredIsVisibleInUI let previousDesiredShowsUnreadNotificationRing = coordinator.desiredShowsUnreadNotificationRing let previousDesiredPortalZPriority = coordinator.desiredPortalZPriority + let desiredStateChanged = + previousDesiredIsActive != isActive || + previousDesiredIsVisibleInUI != isVisibleInUI || + previousDesiredPortalZPriority != portalZPriority coordinator.desiredIsActive = isActive coordinator.desiredIsVisibleInUI = isVisibleInUI coordinator.desiredShowsUnreadNotificationRing = showsUnreadNotificationRing coordinator.desiredPortalZPriority = portalZPriority coordinator.hostedView = hostedView #if DEBUG - if previousDesiredIsActive != isActive || - previousDesiredIsVisibleInUI != isVisibleInUI || - previousDesiredPortalZPriority != portalZPriority { + if desiredStateChanged { if let snapshot = AppDelegate.shared?.tabManager?.debugCurrentWorkspaceSwitchSnapshot() { let dtMs = (CACurrentMediaTime() - snapshot.startedAt) * 1000 dlog( "ws.swiftui.update id=\(snapshot.id) dt=\(String(format: "%.2fms", dtMs)) " + "surface=\(terminalSurface.id.uuidString.prefix(5)) visible=\(isVisibleInUI ? 1 : 0) " + - "active=\(isActive ? 1 : 0) z=\(portalZPriority)" + "active=\(isActive ? 1 : 0) z=\(portalZPriority) " + + "hostWindow=\(nsView.window != nil ? 1 : 0) hostedWindow=\(hostedView.window != nil ? 1 : 0) " + + "hostedSuperview=\(hostedView.superview != nil ? 1 : 0)" ) } else { dlog( "ws.swiftui.update id=none surface=\(terminalSurface.id.uuidString.prefix(5)) " + - "visible=\(isVisibleInUI ? 1 : 0) active=\(isActive ? 1 : 0) z=\(portalZPriority)" + "visible=\(isVisibleInUI ? 1 : 0) active=\(isActive ? 1 : 0) z=\(portalZPriority) " + + "hostWindow=\(nsView.window != nil ? 1 : 0) hostedWindow=\(hostedView.window != nil ? 1 : 0) " + + "hostedSuperview=\(hostedView.superview != nil ? 1 : 0)" ) } } @@ -5114,6 +5153,16 @@ struct GhosttyTerminalView: NSViewRepresentable { // Bind is deferred until host moves into a window. Update the // existing portal entry's visibleInUI now so that any portal sync // that runs before the deferred bind completes won't hide the view. +#if DEBUG + if desiredStateChanged { + dlog( + "ws.hostState.deferBind surface=\(terminalSurface.id.uuidString.prefix(5)) " + + "reason=hostNoWindow visible=\(coordinator.desiredIsVisibleInUI ? 1 : 0) " + + "active=\(coordinator.desiredIsActive ? 1 : 0) z=\(coordinator.desiredPortalZPriority) " + + "hostedWindow=\(hostedView.window != nil ? 1 : 0) hostedSuperview=\(hostedView.superview != nil ? 1 : 0)" + ) + } +#endif TerminalWindowPortalRegistry.updateEntryVisibility( for: hostedView, visibleInUI: coordinator.desiredIsVisibleInUI @@ -5137,6 +5186,16 @@ struct GhosttyTerminalView: NSViewRepresentable { } else { // Preserve portal entry visibility while a stale host is still receiving SwiftUI updates. // The currently bound host remains authoritative for immediate visible/active state. +#if DEBUG + if desiredStateChanged { + dlog( + "ws.hostState.deferApply surface=\(terminalSurface.id.uuidString.prefix(5)) " + + "reason=staleHostBinding hostWindow=\(hostWindowAttached ? 1 : 0) " + + "boundToCurrent=\(isBoundToCurrentHost ? 1 : 0) hostedSuperview=\(hostedView.superview != nil ? 1 : 0) " + + "visible=\(isVisibleInUI ? 1 : 0) active=\(isActive ? 1 : 0)" + ) + } +#endif TerminalWindowPortalRegistry.updateEntryVisibility( for: hostedView, visibleInUI: isVisibleInUI diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 9ea80bd3..582f1d33 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -2761,17 +2761,19 @@ extension Workspace: BonsplitDelegate { if isDetaching, let panel { let browserPanel = panel as? BrowserPanel + let cachedTitle = panelTitles[panelId] + let transferFallbackTitle = cachedTitle ?? panel.displayTitle pendingDetachedSurfaces[tabId] = DetachedSurfaceTransfer( panelId: panelId, panel: panel, - title: resolvedPanelTitle(panelId: panelId, fallback: panel.displayTitle), + title: resolvedPanelTitle(panelId: panelId, fallback: transferFallbackTitle), icon: panel.displayIcon, iconImageData: browserPanel?.faviconPNGData, kind: surfaceKind(for: panel), isLoading: browserPanel?.isLoading ?? false, isPinned: pinnedPanelIds.contains(panelId), directory: panelDirectories[panelId], - cachedTitle: panelTitles[panelId], + cachedTitle: cachedTitle, customTitle: panelCustomTitles[panelId], manuallyUnread: manualUnreadPanelIds.contains(panelId) ) @@ -2859,14 +2861,35 @@ extension Workspace: BonsplitDelegate { } debugLastDidMoveTabTimestamp = now debugDidMoveTabEventCount += 1 - let movedPanel = panelIdFromSurfaceId(tab.id)?.uuidString.prefix(5) ?? "unknown" + let movedPanelId = panelIdFromSurfaceId(tab.id) + let movedPanel = movedPanelId?.uuidString.prefix(5) ?? "unknown" + let selectedBefore = controller.selectedTab(inPane: destination) + .map { String(String(describing: $0.id).prefix(5)) } ?? "nil" + let focusedPaneBefore = controller.focusedPaneId?.id.uuidString.prefix(5) ?? "nil" + let focusedPanelBefore = focusedPanelId?.uuidString.prefix(5) ?? "nil" dlog( "split.moveTab idx=\(debugDidMoveTabEventCount) dtSincePrevMs=\(sincePrev) panel=\(movedPanel) " + "from=\(source.id.uuidString.prefix(5)) to=\(destination.id.uuidString.prefix(5)) " + "sourceTabs=\(controller.tabs(inPane: source).count) destTabs=\(controller.tabs(inPane: destination).count)" ) + dlog( + "split.moveTab.state.before idx=\(debugDidMoveTabEventCount) panel=\(movedPanel) " + + "destSelected=\(selectedBefore) focusedPane=\(focusedPaneBefore) focusedPanel=\(focusedPanelBefore)" + ) #endif applyTabSelection(tabId: tab.id, inPane: destination) +#if DEBUG + let selectedAfter = controller.selectedTab(inPane: destination) + .map { String(String(describing: $0.id).prefix(5)) } ?? "nil" + let focusedPaneAfter = controller.focusedPaneId?.id.uuidString.prefix(5) ?? "nil" + let focusedPanelAfter = focusedPanelId?.uuidString.prefix(5) ?? "nil" + let movedPanelFocused = (movedPanelId != nil && movedPanelId == focusedPanelId) ? 1 : 0 + dlog( + "split.moveTab.state.after idx=\(debugDidMoveTabEventCount) panel=\(movedPanel) " + + "destSelected=\(selectedAfter) focusedPane=\(focusedPaneAfter) focusedPanel=\(focusedPanelAfter) " + + "movedFocused=\(movedPanelFocused)" + ) +#endif normalizePinnedTabs(in: source) normalizePinnedTabs(in: destination) scheduleTerminalGeometryReconcile() diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index 392f9986..3e058a47 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -19,6 +19,17 @@ struct WorkspaceContentView: View { @Environment(\.colorScheme) private var colorScheme @EnvironmentObject var notificationStore: TerminalNotificationStore + static func panelVisibleInUI( + isWorkspaceVisible: Bool, + isSelectedInPane: Bool, + isFocused: Bool + ) -> Bool { + guard isWorkspaceVisible else { return false } + // During pane/tab reparenting, Bonsplit can transiently report selected=false + // for the currently focused panel. Keep focused content visible to avoid blank frames. + return isSelectedInPane || isFocused + } + var body: some View { let appearance = PanelAppearance.fromConfig(config) let isSplit = workspace.bonsplitController.allPaneIds.count > 1 || @@ -47,7 +58,11 @@ struct WorkspaceContentView: View { if let panel = workspace.panel(for: tab.id) { let isFocused = isWorkspaceInputActive && workspace.focusedPanelId == panel.id let isSelectedInPane = workspace.bonsplitController.selectedTab(inPane: paneId)?.id == tab.id - let isVisibleInUI = isWorkspaceVisible && isSelectedInPane + let isVisibleInUI = Self.panelVisibleInUI( + isWorkspaceVisible: isWorkspaceVisible, + isSelectedInPane: isSelectedInPane, + isFocused: isFocused + ) let hasUnreadNotification = Workspace.shouldShowUnreadIndicator( hasUnreadNotification: notificationStore.hasUnreadNotification(forTabId: workspace.id, surfaceId: panel.id), isManuallyUnread: workspace.manualUnreadPanelIds.contains(panel.id) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 7f5dcb51..eb305a1d 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -2973,6 +2973,51 @@ final class WorkspacePanelGitBranchTests: XCTestCase { #endif } + func testDetachAttachAcrossWorkspacesPreservesNonCustomPanelTitle() { + let source = Workspace() + guard let panelId = source.focusedPanelId else { + XCTFail("Expected source focused panel") + return + } + + XCTAssertTrue(source.updatePanelTitle(panelId: panelId, title: "detached-runtime-title")) + + guard let detached = source.detachSurface(panelId: panelId) else { + XCTFail("Expected detach to succeed") + return + } + + XCTAssertEqual(detached.cachedTitle, "detached-runtime-title") + XCTAssertNil(detached.customTitle) + XCTAssertEqual( + detached.title, + "detached-runtime-title", + "Detached transfer should carry the cached non-custom title" + ) + + let destination = Workspace() + guard let destinationPane = destination.bonsplitController.allPaneIds.first else { + XCTFail("Expected destination pane") + return + } + + let attachedPanelId = destination.attachDetachedSurface( + detached, + inPane: destinationPane, + focus: false + ) + XCTAssertEqual(attachedPanelId, panelId) + XCTAssertEqual(destination.panelTitle(panelId: panelId), "detached-runtime-title") + + guard let attachedTabId = destination.surfaceIdFromPanelId(panelId), + let attachedTab = destination.bonsplitController.tab(attachedTabId) else { + XCTFail("Expected attached tab mapping") + return + } + XCTAssertEqual(attachedTab.title, "detached-runtime-title") + XCTAssertFalse(attachedTab.hasCustomTitle) + } + func testBrowserSplitWithFocusFalseRecoversFromDelayedStaleSelection() { let workspace = Workspace() guard let originalFocusedPanelId = workspace.focusedPanelId else { diff --git a/cmuxTests/WorkspaceContentViewVisibilityTests.swift b/cmuxTests/WorkspaceContentViewVisibilityTests.swift new file mode 100644 index 00000000..6e8d62e3 --- /dev/null +++ b/cmuxTests/WorkspaceContentViewVisibilityTests.swift @@ -0,0 +1,49 @@ +import XCTest + +#if canImport(cmux_DEV) +@testable import cmux_DEV +#elseif canImport(cmux) +@testable import cmux +#endif + +final class WorkspaceContentViewVisibilityTests: XCTestCase { + func testPanelVisibleInUIReturnsFalseWhenWorkspaceHidden() { + XCTAssertFalse( + WorkspaceContentView.panelVisibleInUI( + isWorkspaceVisible: false, + isSelectedInPane: true, + isFocused: true + ) + ) + } + + func testPanelVisibleInUIReturnsTrueForSelectedPanel() { + XCTAssertTrue( + WorkspaceContentView.panelVisibleInUI( + isWorkspaceVisible: true, + isSelectedInPane: true, + isFocused: false + ) + ) + } + + func testPanelVisibleInUIReturnsTrueForFocusedPanelDuringTransientSelectionGap() { + XCTAssertTrue( + WorkspaceContentView.panelVisibleInUI( + isWorkspaceVisible: true, + isSelectedInPane: false, + isFocused: true + ) + ) + } + + func testPanelVisibleInUIReturnsFalseWhenNeitherSelectedNorFocused() { + XCTAssertFalse( + WorkspaceContentView.panelVisibleInUI( + isWorkspaceVisible: true, + isSelectedInPane: false, + isFocused: false + ) + ) + } +} From 7d59e550bc81b8da692bd596253a3cee485efd0a Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 23:57:13 -0800 Subject: [PATCH 169/214] Fix browser Return/Enter routing and add enter trace logs --- Sources/AppDelegate.swift | 65 +++++++++- Sources/Panels/CmuxWebView.swift | 111 +++++++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 36 ++++++ 3 files changed, 206 insertions(+), 6 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index befa7e43..20c3a27a 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -2660,6 +2660,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent guard let self else { return event } if event.type == .keyDown { #if DEBUG + let isEnterKey = event.keyCode == 36 || event.keyCode == 76 if (ProcessInfo.processInfo.environment["CMUX_KEY_LATENCY_PROBE"] == "1" || UserDefaults.standard.bool(forKey: "cmuxKeyLatencyProbe")), event.timestamp > 0 { @@ -2671,18 +2672,36 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent dlog( "monitor.keyDown: \(NSWindow.keyDescription(event)) fr=\(frType) addrBarId=\(self.browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil") \(self.debugShortcutRouteSnapshot(event: event))" ) + if isEnterKey { + dlog( + "enter.trace stage=app.monitor.pre event=\(NSWindow.keyDescription(event)) " + + "fr=\(frType) addrBarId=\(self.browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil")" + ) + } if let probeKind = self.developerToolsShortcutProbeKind(event: event) { self.logDeveloperToolsShortcutSnapshot(phase: "monitor.pre.\(probeKind)", event: event) } #endif if self.handleCustomShortcut(event: event) { #if DEBUG + if isEnterKey { + dlog( + "enter.trace stage=app.monitor.consume event=\(NSWindow.keyDescription(event)) " + + "reason=handleCustomShortcut" + ) + } dlog(" → consumed by handleCustomShortcut") DebugEventLog.shared.dump() #endif return nil // Consume the event } #if DEBUG + if isEnterKey { + dlog( + "enter.trace stage=app.monitor.pass event=\(NSWindow.keyDescription(event)) " + + "reason=handleCustomShortcutReturnedFalse" + ) + } DebugEventLog.shared.dump() #endif return event // Pass through @@ -3802,7 +3821,18 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent /// through the same app-level shortcut handler used by the local key monitor. @discardableResult func handleBrowserSurfaceKeyEquivalent(_ event: NSEvent) -> Bool { - handleCustomShortcut(event: event) + let consumed = handleCustomShortcut(event: event) +#if DEBUG + if event.keyCode == 36 || event.keyCode == 76 { + let frType = NSApp.keyWindow?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" + dlog( + "enter.trace stage=app.browserSurfaceKeyEquivalent event=\(NSWindow.keyDescription(event)) " + + "consumed=\(consumed ? 1 : 0) fr=\(frType) " + + "addrBarId=\(browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil")" + ) + } +#endif + return consumed } #if DEBUG @@ -5220,9 +5250,19 @@ private extension NSWindow { } @objc func cmux_performKeyEquivalent(with event: NSEvent) -> Bool { + let isEnterKey = event.keyCode == 36 || event.keyCode == 76 #if DEBUG let frType = self.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" dlog("performKeyEquiv: \(Self.keyDescription(event)) fr=\(frType)") + if isEnterKey { + let frGhostty = cmuxOwningGhosttyView(for: self.firstResponder) != nil + let frWeb = self.firstResponder.flatMap { Self.cmuxOwningWebView(for: $0) } != nil + dlog( + "enter.trace stage=window.performKeyEquivalent.start event=\(Self.keyDescription(event)) " + + "fr=\(frType) frGhostty=\(frGhostty ? 1 : 0) frWeb=\(frWeb ? 1 : 0) " + + "win=\(self.windowNumber)" + ) + } #endif // When the terminal surface is the first responder, prevent SwiftUI's @@ -5253,6 +5293,12 @@ private extension NSWindow { let result = ghosttyView.performKeyEquivalent(with: event) #if DEBUG dlog(" → ghostty direct: \(result)") + if isEnterKey { + dlog( + "enter.trace stage=window.performKeyEquivalent.ghosttyDirect " + + "event=\(Self.keyDescription(event)) consumed=\(result ? 1 : 0)" + ) + } #endif return result } @@ -5274,7 +5320,16 @@ private extension NSWindow { } } - if AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true { + let consumedByBrowserSurface = AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true +#if DEBUG + if isEnterKey { + dlog( + "enter.trace stage=window.performKeyEquivalent.browserSurface event=\(Self.keyDescription(event)) " + + "consumed=\(consumedByBrowserSurface ? 1 : 0)" + ) + } +#endif + if consumedByBrowserSurface { #if DEBUG dlog(" → consumed by handleBrowserSurfaceKeyEquivalent") #endif @@ -5313,6 +5368,12 @@ private extension NSWindow { let result = cmux_performKeyEquivalent(with: event) #if DEBUG if result { dlog(" → consumed by original performKeyEquivalent") } + if isEnterKey { + dlog( + "enter.trace stage=window.performKeyEquivalent.original event=\(Self.keyDescription(event)) " + + "consumed=\(result ? 1 : 0)" + ) + } #endif return result } diff --git a/Sources/Panels/CmuxWebView.swift b/Sources/Panels/CmuxWebView.swift index 68a13282..788e417e 100644 --- a/Sources/Panels/CmuxWebView.swift +++ b/Sources/Panels/CmuxWebView.swift @@ -63,6 +63,72 @@ final class CmuxWebView: WKWebView { } var debugPointerFocusAllowanceDepth: Int { pointerFocusAllowanceDepth } +#if DEBUG + private func debugKeyDescription(_ event: NSEvent) -> String { + var parts: [String] = [] + let flags = event.modifierFlags.intersection(.deviceIndependentFlagsMask) + if flags.contains(.command) { parts.append("Cmd") } + if flags.contains(.shift) { parts.append("Shift") } + if flags.contains(.option) { parts.append("Opt") } + if flags.contains(.control) { parts.append("Ctrl") } + let chars = event.charactersIgnoringModifiers ?? "?" + parts.append("'\(chars)'(\(event.keyCode))") + return parts.joined(separator: "+") + } + + private func debugEnterTrace( + stage: String, + event: NSEvent, + consumed: Bool? = nil, + note: String? = nil + ) { + let firstResponderType = window?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" + let host = url?.host ?? "nil" + var line = + "enter.trace stage=\(stage) web=\(ObjectIdentifier(self)) " + + "event=\(debugKeyDescription(event)) fr=\(firstResponderType) " + + "win=\(window?.windowNumber ?? -1) host=\(host)" + if let consumed { + line += " consumed=\(consumed ? 1 : 0)" + } + if let note { + line += " note=\(note)" + } + dlog(line) + } + + private func debugLogActiveElementForEnter(stage: String) { + let js = """ + (() => { + const el = document.activeElement; + if (!el) return 'none'; + const tag = (el.tagName || '').toLowerCase(); + const id = el.id || '-'; + const name = el.getAttribute('name') || '-'; + const type = el.getAttribute('type') || '-'; + return `${tag}|${id}|${name}|${type}`; + })(); + """ + evaluateJavaScript(js) { [weak self] result, error in + guard let self else { return } + let activeSummary: String + if let error { + activeSummary = "error=\(error.localizedDescription)" + } else if let text = result as? String { + activeSummary = text + } else if let result { + activeSummary = String(describing: result) + } else { + activeSummary = "nil" + } + dlog( + "enter.trace stage=\(stage).dom web=\(ObjectIdentifier(self)) " + + "active=\(activeSummary)" + ) + } + } +#endif + override func becomeFirstResponder() -> Bool { guard allowsFirstResponderAcquisitionEffective else { #if DEBUG @@ -113,13 +179,27 @@ final class CmuxWebView: WKWebView { } override func performKeyEquivalent(with event: NSEvent) -> Bool { - // Preserve Cmd+Return/Enter for web content (e.g. editors/forms). Do not - // route it through app/menu key equivalents, which can trigger unintended actions. - let flags = event.modifierFlags.intersection(.deviceIndependentFlagsMask) - if flags.contains(.command), event.keyCode == 36 || event.keyCode == 76 { + if event.keyCode == 36 || event.keyCode == 76 { + // Always bypass app/menu key-equivalent routing for Return/Enter so WebKit + // receives the keyDown path used by form submission handlers. +#if DEBUG + debugEnterTrace( + stage: "web.performKeyEquivalent.bypass", + event: event, + consumed: false, + note: "returnFalseForEnter" + ) +#endif return false } + let flags = event.modifierFlags.intersection(.deviceIndependentFlagsMask) + // Menu/app shortcut routing is only needed for Command equivalents + // (New Tab, Close Tab, tab switching, split commands, etc). + guard flags.contains(.command) else { + return super.performKeyEquivalent(with: event) + } + // Let the app menu handle key equivalents first (New Tab, Close Tab, tab switching, etc). if let menu = NSApp.mainMenu, menu.performKeyEquivalent(with: event) { return true @@ -135,14 +215,37 @@ final class CmuxWebView: WKWebView { } override func keyDown(with event: NSEvent) { +#if DEBUG + if event.keyCode == 36 || event.keyCode == 76 { + debugEnterTrace(stage: "web.keyDown.pre", event: event, note: "beforeSuper") + debugLogActiveElementForEnter(stage: "web.keyDown.pre") + } +#endif + // Some Cmd-based key paths in WebKit don't consistently invoke performKeyEquivalent. // Route them through the same app-level shortcut handler as a fallback. if event.modifierFlags.intersection(.deviceIndependentFlagsMask).contains(.command), AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true { +#if DEBUG + if event.keyCode == 36 || event.keyCode == 76 { + debugEnterTrace( + stage: "web.keyDown.commandConsumed", + event: event, + consumed: true, + note: "handleBrowserSurfaceKeyEquivalent" + ) + } +#endif return } super.keyDown(with: event) +#if DEBUG + if event.keyCode == 36 || event.keyCode == 76 { + debugEnterTrace(stage: "web.keyDown.post", event: event, note: "afterSuper") + debugLogActiveElementForEnter(stage: "web.keyDown.post") + } +#endif } // MARK: - Focus on click diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 9ca9fb4d..a1ad944f 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -149,6 +149,42 @@ final class CmuxWebViewKeyEquivalentTests: XCTestCase { XCTAssertTrue(spy.invoked) } + func testReturnDoesNotRouteToMainMenuWhenWebViewIsFirstResponder() { + let spy = ActionSpy() + installMenu(spy: spy, key: "\r", modifiers: []) + + let webView = CmuxWebView(frame: .zero, configuration: WKWebViewConfiguration()) + let event = makeKeyDownEvent(key: "\r", modifiers: [], keyCode: 36) // kVK_Return + XCTAssertNotNil(event) + + XCTAssertFalse(webView.performKeyEquivalent(with: event!)) + XCTAssertFalse(spy.invoked) + } + + func testCmdReturnDoesNotRouteToMainMenuWhenWebViewIsFirstResponder() { + let spy = ActionSpy() + installMenu(spy: spy, key: "\r", modifiers: [.command]) + + let webView = CmuxWebView(frame: .zero, configuration: WKWebViewConfiguration()) + let event = makeKeyDownEvent(key: "\r", modifiers: [.command], keyCode: 36) // kVK_Return + XCTAssertNotNil(event) + + XCTAssertFalse(webView.performKeyEquivalent(with: event!)) + XCTAssertFalse(spy.invoked) + } + + func testKeypadEnterDoesNotRouteToMainMenuWhenWebViewIsFirstResponder() { + let spy = ActionSpy() + installMenu(spy: spy, key: "\r", modifiers: []) + + let webView = CmuxWebView(frame: .zero, configuration: WKWebViewConfiguration()) + let event = makeKeyDownEvent(key: "\r", modifiers: [], keyCode: 76) // kVK_ANSI_KeypadEnter + XCTAssertNotNil(event) + + XCTAssertFalse(webView.performKeyEquivalent(with: event!)) + XCTAssertFalse(spy.invoked) + } + @MainActor func testCanBlockFirstResponderAcquisitionWhenPaneIsUnfocused() { _ = NSApplication.shared From e510bf2d1721d2141a892b32123aaefb55925b1f Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Tue, 24 Feb 2026 00:09:53 -0800 Subject: [PATCH 170/214] Remove temporary Enter tracing instrumentation --- Sources/AppDelegate.swift | 65 +-------------------- Sources/Panels/CmuxWebView.swift | 97 -------------------------------- 2 files changed, 2 insertions(+), 160 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 20c3a27a..befa7e43 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -2660,7 +2660,6 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent guard let self else { return event } if event.type == .keyDown { #if DEBUG - let isEnterKey = event.keyCode == 36 || event.keyCode == 76 if (ProcessInfo.processInfo.environment["CMUX_KEY_LATENCY_PROBE"] == "1" || UserDefaults.standard.bool(forKey: "cmuxKeyLatencyProbe")), event.timestamp > 0 { @@ -2672,36 +2671,18 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent dlog( "monitor.keyDown: \(NSWindow.keyDescription(event)) fr=\(frType) addrBarId=\(self.browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil") \(self.debugShortcutRouteSnapshot(event: event))" ) - if isEnterKey { - dlog( - "enter.trace stage=app.monitor.pre event=\(NSWindow.keyDescription(event)) " + - "fr=\(frType) addrBarId=\(self.browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil")" - ) - } if let probeKind = self.developerToolsShortcutProbeKind(event: event) { self.logDeveloperToolsShortcutSnapshot(phase: "monitor.pre.\(probeKind)", event: event) } #endif if self.handleCustomShortcut(event: event) { #if DEBUG - if isEnterKey { - dlog( - "enter.trace stage=app.monitor.consume event=\(NSWindow.keyDescription(event)) " + - "reason=handleCustomShortcut" - ) - } dlog(" → consumed by handleCustomShortcut") DebugEventLog.shared.dump() #endif return nil // Consume the event } #if DEBUG - if isEnterKey { - dlog( - "enter.trace stage=app.monitor.pass event=\(NSWindow.keyDescription(event)) " + - "reason=handleCustomShortcutReturnedFalse" - ) - } DebugEventLog.shared.dump() #endif return event // Pass through @@ -3821,18 +3802,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent /// through the same app-level shortcut handler used by the local key monitor. @discardableResult func handleBrowserSurfaceKeyEquivalent(_ event: NSEvent) -> Bool { - let consumed = handleCustomShortcut(event: event) -#if DEBUG - if event.keyCode == 36 || event.keyCode == 76 { - let frType = NSApp.keyWindow?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" - dlog( - "enter.trace stage=app.browserSurfaceKeyEquivalent event=\(NSWindow.keyDescription(event)) " + - "consumed=\(consumed ? 1 : 0) fr=\(frType) " + - "addrBarId=\(browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil")" - ) - } -#endif - return consumed + handleCustomShortcut(event: event) } #if DEBUG @@ -5250,19 +5220,9 @@ private extension NSWindow { } @objc func cmux_performKeyEquivalent(with event: NSEvent) -> Bool { - let isEnterKey = event.keyCode == 36 || event.keyCode == 76 #if DEBUG let frType = self.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" dlog("performKeyEquiv: \(Self.keyDescription(event)) fr=\(frType)") - if isEnterKey { - let frGhostty = cmuxOwningGhosttyView(for: self.firstResponder) != nil - let frWeb = self.firstResponder.flatMap { Self.cmuxOwningWebView(for: $0) } != nil - dlog( - "enter.trace stage=window.performKeyEquivalent.start event=\(Self.keyDescription(event)) " + - "fr=\(frType) frGhostty=\(frGhostty ? 1 : 0) frWeb=\(frWeb ? 1 : 0) " + - "win=\(self.windowNumber)" - ) - } #endif // When the terminal surface is the first responder, prevent SwiftUI's @@ -5293,12 +5253,6 @@ private extension NSWindow { let result = ghosttyView.performKeyEquivalent(with: event) #if DEBUG dlog(" → ghostty direct: \(result)") - if isEnterKey { - dlog( - "enter.trace stage=window.performKeyEquivalent.ghosttyDirect " + - "event=\(Self.keyDescription(event)) consumed=\(result ? 1 : 0)" - ) - } #endif return result } @@ -5320,16 +5274,7 @@ private extension NSWindow { } } - let consumedByBrowserSurface = AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true -#if DEBUG - if isEnterKey { - dlog( - "enter.trace stage=window.performKeyEquivalent.browserSurface event=\(Self.keyDescription(event)) " + - "consumed=\(consumedByBrowserSurface ? 1 : 0)" - ) - } -#endif - if consumedByBrowserSurface { + if AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true { #if DEBUG dlog(" → consumed by handleBrowserSurfaceKeyEquivalent") #endif @@ -5368,12 +5313,6 @@ private extension NSWindow { let result = cmux_performKeyEquivalent(with: event) #if DEBUG if result { dlog(" → consumed by original performKeyEquivalent") } - if isEnterKey { - dlog( - "enter.trace stage=window.performKeyEquivalent.original event=\(Self.keyDescription(event)) " + - "consumed=\(result ? 1 : 0)" - ) - } #endif return result } diff --git a/Sources/Panels/CmuxWebView.swift b/Sources/Panels/CmuxWebView.swift index 788e417e..bcd77ed2 100644 --- a/Sources/Panels/CmuxWebView.swift +++ b/Sources/Panels/CmuxWebView.swift @@ -63,72 +63,6 @@ final class CmuxWebView: WKWebView { } var debugPointerFocusAllowanceDepth: Int { pointerFocusAllowanceDepth } -#if DEBUG - private func debugKeyDescription(_ event: NSEvent) -> String { - var parts: [String] = [] - let flags = event.modifierFlags.intersection(.deviceIndependentFlagsMask) - if flags.contains(.command) { parts.append("Cmd") } - if flags.contains(.shift) { parts.append("Shift") } - if flags.contains(.option) { parts.append("Opt") } - if flags.contains(.control) { parts.append("Ctrl") } - let chars = event.charactersIgnoringModifiers ?? "?" - parts.append("'\(chars)'(\(event.keyCode))") - return parts.joined(separator: "+") - } - - private func debugEnterTrace( - stage: String, - event: NSEvent, - consumed: Bool? = nil, - note: String? = nil - ) { - let firstResponderType = window?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" - let host = url?.host ?? "nil" - var line = - "enter.trace stage=\(stage) web=\(ObjectIdentifier(self)) " + - "event=\(debugKeyDescription(event)) fr=\(firstResponderType) " + - "win=\(window?.windowNumber ?? -1) host=\(host)" - if let consumed { - line += " consumed=\(consumed ? 1 : 0)" - } - if let note { - line += " note=\(note)" - } - dlog(line) - } - - private func debugLogActiveElementForEnter(stage: String) { - let js = """ - (() => { - const el = document.activeElement; - if (!el) return 'none'; - const tag = (el.tagName || '').toLowerCase(); - const id = el.id || '-'; - const name = el.getAttribute('name') || '-'; - const type = el.getAttribute('type') || '-'; - return `${tag}|${id}|${name}|${type}`; - })(); - """ - evaluateJavaScript(js) { [weak self] result, error in - guard let self else { return } - let activeSummary: String - if let error { - activeSummary = "error=\(error.localizedDescription)" - } else if let text = result as? String { - activeSummary = text - } else if let result { - activeSummary = String(describing: result) - } else { - activeSummary = "nil" - } - dlog( - "enter.trace stage=\(stage).dom web=\(ObjectIdentifier(self)) " + - "active=\(activeSummary)" - ) - } - } -#endif - override func becomeFirstResponder() -> Bool { guard allowsFirstResponderAcquisitionEffective else { #if DEBUG @@ -182,14 +116,6 @@ final class CmuxWebView: WKWebView { if event.keyCode == 36 || event.keyCode == 76 { // Always bypass app/menu key-equivalent routing for Return/Enter so WebKit // receives the keyDown path used by form submission handlers. -#if DEBUG - debugEnterTrace( - stage: "web.performKeyEquivalent.bypass", - event: event, - consumed: false, - note: "returnFalseForEnter" - ) -#endif return false } @@ -215,37 +141,14 @@ final class CmuxWebView: WKWebView { } override func keyDown(with event: NSEvent) { -#if DEBUG - if event.keyCode == 36 || event.keyCode == 76 { - debugEnterTrace(stage: "web.keyDown.pre", event: event, note: "beforeSuper") - debugLogActiveElementForEnter(stage: "web.keyDown.pre") - } -#endif - // Some Cmd-based key paths in WebKit don't consistently invoke performKeyEquivalent. // Route them through the same app-level shortcut handler as a fallback. if event.modifierFlags.intersection(.deviceIndependentFlagsMask).contains(.command), AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true { -#if DEBUG - if event.keyCode == 36 || event.keyCode == 76 { - debugEnterTrace( - stage: "web.keyDown.commandConsumed", - event: event, - consumed: true, - note: "handleBrowserSurfaceKeyEquivalent" - ) - } -#endif return } super.keyDown(with: event) -#if DEBUG - if event.keyCode == 36 || event.keyCode == 76 { - debugEnterTrace(stage: "web.keyDown.post", event: event, note: "afterSuper") - debugLogActiveElementForEnter(stage: "web.keyDown.post") - } -#endif } // MARK: - Focus on click From 5dc2d8d800a3ab3bf1cfd6533a7148f284abb61f Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Tue, 24 Feb 2026 13:54:52 -0800 Subject: [PATCH 171/214] wip --- Sources/AppDelegate.swift | 35 +++++++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 38 +++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 1f107216..442313d7 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -286,6 +286,14 @@ func browserOmnibarShouldSubmitOnReturn(flags: NSEvent.ModifierFlags) -> Bool { return normalizedFlags == [] || normalizedFlags == [.shift] } +func shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: UInt16, + firstResponderIsBrowser: Bool +) -> Bool { + guard firstResponderIsBrowser else { return false } + return keyCode == 36 || keyCode == 76 +} + func commandPaletteSelectionDeltaForKeyboardNavigation( flags: NSEvent.ModifierFlags, chars: String, @@ -5279,6 +5287,7 @@ enum MenuBarIconRenderer { private var cmuxFirstResponderGuardCurrentEventOverride: NSEvent? private var cmuxFirstResponderGuardHitViewOverride: NSView? #endif +private var cmuxBrowserReturnForwardingDepth = 0 private extension NSWindow { @objc func cmux_makeFirstResponder(_ responder: NSResponder?) -> Bool { @@ -5396,6 +5405,7 @@ private extension NSWindow { // (handleCustomShortcut) already handles app-level shortcuts, and anything // remaining should be menu items. let firstResponderGhosttyView = cmuxOwningGhosttyView(for: self.firstResponder) + let firstResponderWebView = self.firstResponder.flatMap { Self.cmuxOwningWebView(for: $0) } if let ghosttyView = firstResponderGhosttyView { // If the IME is composing, don't intercept key events — let them flow // through normal AppKit event dispatch so the input method can process them. @@ -5429,6 +5439,31 @@ private extension NSWindow { } } + // Web forms rely on Return/Enter flowing through keyDown. If the original + // NSWindow.performKeyEquivalent consumes Enter first, submission never reaches + // WebKit. Route Return/Enter directly to the current first responder and + // mark handled to avoid the AppKit alert sound path. + if shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: event.keyCode, + firstResponderIsBrowser: firstResponderWebView != nil + ) { + // Forwarding keyDown can re-enter performKeyEquivalent in WebKit/AppKit internals. + // On re-entry, fall back to normal dispatch to avoid an infinite loop. + if cmuxBrowserReturnForwardingDepth > 0 { +#if DEBUG + dlog(" → browser Return/Enter reentry; using normal dispatch") +#endif + return false + } + cmuxBrowserReturnForwardingDepth += 1 + defer { cmuxBrowserReturnForwardingDepth = max(0, cmuxBrowserReturnForwardingDepth - 1) } +#if DEBUG + dlog(" → browser Return/Enter routed to firstResponder.keyDown") +#endif + self.firstResponder?.keyDown(with: event) + return true + } + if AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true { #if DEBUG dlog(" → consumed by handleBrowserSurfaceKeyEquivalent") diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index ca812481..110c8d4d 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1520,6 +1520,44 @@ final class BrowserOmnibarCommandNavigationTests: XCTestCase { } } +final class BrowserReturnKeyDownRoutingTests: XCTestCase { + func testRoutesForReturnWhenBrowserFirstResponder() { + XCTAssertTrue( + shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: 36, + firstResponderIsBrowser: true + ) + ) + } + + func testRoutesForKeypadEnterWhenBrowserFirstResponder() { + XCTAssertTrue( + shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: 76, + firstResponderIsBrowser: true + ) + ) + } + + func testDoesNotRouteForNonEnterKey() { + XCTAssertFalse( + shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: 13, + firstResponderIsBrowser: true + ) + ) + } + + func testDoesNotRouteWhenFirstResponderIsNotBrowser() { + XCTAssertFalse( + shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: 36, + firstResponderIsBrowser: false + ) + ) + } +} + final class BrowserZoomShortcutActionTests: XCTestCase { func testZoomInSupportsEqualsAndPlusVariants() { XCTAssertEqual( From 6c17bbf64edb88e4667428b52f7bf26b32cb2710 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 24 Feb 2026 13:58:32 -0800 Subject: [PATCH 172/214] Restore vendor/bonsplit submodule pointer --- vendor/bonsplit | 1 + 1 file changed, 1 insertion(+) create mode 160000 vendor/bonsplit diff --git a/vendor/bonsplit b/vendor/bonsplit new file mode 160000 index 00000000..f24ba922 --- /dev/null +++ b/vendor/bonsplit @@ -0,0 +1 @@ +Subproject commit f24ba9222651ecc170869662eec9a5880404a82c From c56ef6775016530c3a0fffca862cdff12381564a Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:05:45 -0800 Subject: [PATCH 173/214] Fix browser chrome contrast for mixed light/dark themes --- Sources/Panels/BrowserPanelView.swift | 22 ++- ...test_browser_chrome_contrast_regression.py | 126 ++++++++++++++++++ 2 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 tests/test_browser_chrome_contrast_regression.py diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 82069f74..9234e84a 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -178,6 +178,17 @@ func resolvedBrowserChromeBackgroundColor( } } +func resolvedBrowserChromeColorScheme( + for colorScheme: ColorScheme, + themeBackgroundColor: NSColor +) -> ColorScheme { + let backgroundColor = resolvedBrowserChromeBackgroundColor( + for: colorScheme, + themeBackgroundColor: themeBackgroundColor + ) + return backgroundColor.isLightColor ? .light : .dark +} + func resolvedBrowserOmnibarPillBackgroundColor( for colorScheme: ColorScheme, themeBackgroundColor: NSColor @@ -274,9 +285,16 @@ struct BrowserPanelView: View { ) } + private var browserChromeColorScheme: ColorScheme { + resolvedBrowserChromeColorScheme( + for: colorScheme, + themeBackgroundColor: GhosttyApp.shared.defaultBackgroundColor + ) + } + private var omnibarPillBackgroundColor: NSColor { resolvedBrowserOmnibarPillBackgroundColor( - for: colorScheme, + for: browserChromeColorScheme, themeBackgroundColor: browserChromeBackgroundColor ) } @@ -312,6 +330,7 @@ struct BrowserPanelView: View { .frame(width: omnibarPillFrame.width) .offset(x: omnibarPillFrame.minX, y: omnibarPillFrame.maxY + 3) .zIndex(1000) + .environment(\.colorScheme, browserChromeColorScheme) } } .coordinateSpace(name: "BrowserPanelViewSpace") @@ -458,6 +477,7 @@ struct BrowserPanelView: View { .background(Color(nsColor: browserChromeBackgroundColor)) // Keep the omnibar stack above WKWebView so the suggestions popup is visible. .zIndex(1) + .environment(\.colorScheme, browserChromeColorScheme) } private var addressBarButtonBar: some View { diff --git a/tests/test_browser_chrome_contrast_regression.py b/tests/test_browser_chrome_contrast_regression.py new file mode 100644 index 00000000..a2552f2f --- /dev/null +++ b/tests/test_browser_chrome_contrast_regression.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +"""Static regression guards for browser chrome contrast in mixed theme setups.""" + +from __future__ import annotations + +import subprocess +from pathlib import Path + + +def repo_root() -> Path: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return Path(result.stdout.strip()) + return Path(__file__).resolve().parents[1] + + +def extract_block(source: str, signature: str) -> str: + start = source.find(signature) + if start < 0: + raise ValueError(f"Missing signature: {signature}") + + brace_start = source.find("{", start) + if brace_start < 0: + raise ValueError(f"Missing opening brace for: {signature}") + + depth = 0 + for idx in range(brace_start, len(source)): + char = source[idx] + if char == "{": + depth += 1 + elif char == "}": + depth -= 1 + if depth == 0: + return source[brace_start : idx + 1] + + raise ValueError(f"Unbalanced braces for: {signature}") + + +def main() -> int: + root = repo_root() + view_path = root / "Sources" / "Panels" / "BrowserPanelView.swift" + source = view_path.read_text(encoding="utf-8") + failures: list[str] = [] + + try: + browser_panel_view_block = extract_block(source, "struct BrowserPanelView: View") + except ValueError as error: + failures.append(str(error)) + browser_panel_view_block = "" + + try: + resolver_block = extract_block(source, "func resolvedBrowserChromeColorScheme(") + except ValueError as error: + failures.append(str(error)) + resolver_block = "" + + if resolver_block: + if "backgroundColor.isLightColor ? .light : .dark" not in resolver_block: + failures.append( + "resolvedBrowserChromeColorScheme must map luminance to a light/dark ColorScheme" + ) + + try: + chrome_scheme_block = extract_block( + browser_panel_view_block, + "private var browserChromeColorScheme: ColorScheme", + ) + except ValueError as error: + failures.append(str(error)) + chrome_scheme_block = "" + + if chrome_scheme_block and "resolvedBrowserChromeColorScheme(" not in chrome_scheme_block: + failures.append("browserChromeColorScheme must use resolvedBrowserChromeColorScheme") + + try: + omnibar_background_block = extract_block( + browser_panel_view_block, + "private var omnibarPillBackgroundColor: NSColor", + ) + except ValueError as error: + failures.append(str(error)) + omnibar_background_block = "" + + if omnibar_background_block and "for: browserChromeColorScheme" not in omnibar_background_block: + failures.append("omnibar pill background must use browserChromeColorScheme") + + try: + address_bar_block = extract_block( + browser_panel_view_block, + "private var addressBar: some View", + ) + except ValueError as error: + failures.append(str(error)) + address_bar_block = "" + + if address_bar_block and ".environment(\\.colorScheme, browserChromeColorScheme)" not in address_bar_block: + failures.append("addressBar must apply browserChromeColorScheme via environment") + + try: + body_block = extract_block(browser_panel_view_block, "var body: some View") + except ValueError as error: + failures.append(str(error)) + body_block = "" + + if body_block: + if "OmnibarSuggestionsView(" not in body_block: + failures.append("Expected OmnibarSuggestionsView block in BrowserPanelView body") + elif ".environment(\\.colorScheme, browserChromeColorScheme)" not in body_block: + failures.append("Omnibar suggestions must apply browserChromeColorScheme via environment") + + if failures: + print("FAIL: browser chrome contrast regression guards failed") + for failure in failures: + print(f" - {failure}") + return 1 + + print("PASS: browser chrome contrast regression guards are in place") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 233876018640fae167e2f422048a0f39ec013479 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:12:15 -0800 Subject: [PATCH 174/214] Set selected sidebar workspace colors and white text --- Sources/ContentView.swift | 49 ++++++++++++++----- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 38 ++++++++++++++ 2 files changed, 75 insertions(+), 12 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 3a21ed9d..752ffa29 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -38,6 +38,30 @@ func sidebarActiveForegroundNSColor( return baseColor.withAlphaComponent(clampedOpacity) } +func sidebarSelectedWorkspaceBackgroundNSColor(for colorScheme: ColorScheme) -> NSColor { + switch colorScheme { + case .dark: + return NSColor( + srgbRed: 63.0 / 255.0, + green: 142.0 / 255.0, + blue: 252.0 / 255.0, + alpha: 1.0 + ) + default: + return NSColor( + srgbRed: 62.0 / 255.0, + green: 133.0 / 255.0, + blue: 252.0 / 255.0, + alpha: 1.0 + ) + } +} + +func sidebarSelectedWorkspaceForegroundNSColor(opacity: CGFloat) -> NSColor { + let clampedOpacity = max(0, min(opacity, 1)) + return NSColor.white.withAlphaComponent(clampedOpacity) +} + struct ShortcutHintPillBackground: View { var emphasis: Double = 1.0 @@ -5974,12 +5998,14 @@ private struct TabItemView: View { } private var activePrimaryTextColor: Color { - usesInvertedActiveForeground ? Color(nsColor: sidebarActiveForegroundNSColor(opacity: 1.0)) : .primary + usesInvertedActiveForeground + ? Color(nsColor: sidebarSelectedWorkspaceForegroundNSColor(opacity: 1.0)) + : .primary } private func activeSecondaryColor(_ opacity: Double = 0.75) -> Color { usesInvertedActiveForeground - ? Color(nsColor: sidebarActiveForegroundNSColor(opacity: CGFloat(opacity))) + ? Color(nsColor: sidebarSelectedWorkspaceForegroundNSColor(opacity: CGFloat(opacity))) : .secondary } @@ -6465,16 +6491,15 @@ private struct TabItemView: View { private var backgroundColor: Color { switch activeTabIndicatorStyle { case .leftRail: - if isActive { return Color.accentColor } + if isActive { return Color(nsColor: sidebarSelectedWorkspaceBackgroundNSColor(for: colorScheme)) } if isMultiSelected { return Color.accentColor.opacity(0.25) } return Color.clear case .solidFill: + if isActive { return Color(nsColor: sidebarSelectedWorkspaceBackgroundNSColor(for: colorScheme)) } if let custom = resolvedCustomTabColor { - if isActive { return custom } if isMultiSelected { return custom.opacity(0.35) } return custom.opacity(0.7) } - if isActive { return Color.accentColor } if isMultiSelected { return Color.accentColor.opacity(0.25) } return Color.clear } @@ -6789,15 +6814,15 @@ private struct TabItemView: View { if isActive { switch level { case .info: - return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.5)) + return Color(nsColor: sidebarSelectedWorkspaceForegroundNSColor(opacity: 0.5)) case .progress: - return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.8)) + return Color(nsColor: sidebarSelectedWorkspaceForegroundNSColor(opacity: 0.8)) case .success: - return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9)) + return Color(nsColor: sidebarSelectedWorkspaceForegroundNSColor(opacity: 0.9)) case .warning: - return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9)) + return Color(nsColor: sidebarSelectedWorkspaceForegroundNSColor(opacity: 0.9)) case .error: - return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9)) + return Color(nsColor: sidebarSelectedWorkspaceForegroundNSColor(opacity: 0.9)) } } switch level { @@ -6934,11 +6959,11 @@ private struct SidebarStatusPillsRow: View { } private var activePrimaryTextColor: Color { - Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.8)) + Color(nsColor: sidebarSelectedWorkspaceForegroundNSColor(opacity: 0.8)) } private var activeSecondaryTextColor: Color { - Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.65)) + Color(nsColor: sidebarSelectedWorkspaceForegroundNSColor(opacity: 0.65)) } private var statusText: String { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 110c8d4d..7f742558 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -843,6 +843,44 @@ final class SidebarActiveForegroundColorTests: XCTestCase { } } +final class SidebarSelectedWorkspaceColorTests: XCTestCase { + func testLightModeUsesConfiguredSelectedWorkspaceBackgroundColor() { + guard let color = sidebarSelectedWorkspaceBackgroundNSColor(for: .light).usingColorSpace(.sRGB) else { + XCTFail("Expected sRGB-convertible color") + return + } + + XCTAssertEqual(color.redComponent, 62.0 / 255.0, accuracy: 0.001) + XCTAssertEqual(color.greenComponent, 133.0 / 255.0, accuracy: 0.001) + XCTAssertEqual(color.blueComponent, 252.0 / 255.0, accuracy: 0.001) + XCTAssertEqual(color.alphaComponent, 1.0, accuracy: 0.001) + } + + func testDarkModeUsesConfiguredSelectedWorkspaceBackgroundColor() { + guard let color = sidebarSelectedWorkspaceBackgroundNSColor(for: .dark).usingColorSpace(.sRGB) else { + XCTFail("Expected sRGB-convertible color") + return + } + + XCTAssertEqual(color.redComponent, 63.0 / 255.0, accuracy: 0.001) + XCTAssertEqual(color.greenComponent, 142.0 / 255.0, accuracy: 0.001) + XCTAssertEqual(color.blueComponent, 252.0 / 255.0, accuracy: 0.001) + XCTAssertEqual(color.alphaComponent, 1.0, accuracy: 0.001) + } + + func testSelectedWorkspaceForegroundAlwaysUsesWhiteWithRequestedOpacity() { + guard let color = sidebarSelectedWorkspaceForegroundNSColor(opacity: 0.65).usingColorSpace(.sRGB) else { + XCTFail("Expected sRGB-convertible color") + return + } + + XCTAssertEqual(color.redComponent, 1.0, accuracy: 0.001) + XCTAssertEqual(color.greenComponent, 1.0, accuracy: 0.001) + XCTAssertEqual(color.blueComponent, 1.0, accuracy: 0.001) + XCTAssertEqual(color.alphaComponent, 0.65, accuracy: 0.001) + } +} + final class BrowserDeveloperToolsShortcutDefaultsTests: XCTestCase { func testSafariDefaultShortcutForToggleDeveloperTools() { let shortcut = KeyboardShortcutSettings.Action.toggleBrowserDeveloperTools.defaultShortcut From e76de71f3e12f35e623411a6c0f0e0d868a01e71 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Tue, 24 Feb 2026 14:18:58 -0800 Subject: [PATCH 175/214] Fix sidebar titlebar drag and double-click passthrough --- Sources/BrowserWindowPortal.swift | 8 ++++++-- Sources/ContentView.swift | 27 +++------------------------ 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/Sources/BrowserWindowPortal.swift b/Sources/BrowserWindowPortal.swift index 448f0e46..1a5ea166 100644 --- a/Sources/BrowserWindowPortal.swift +++ b/Sources/BrowserWindowPortal.swift @@ -133,9 +133,13 @@ final class WindowBrowserHostView: NSView { private func shouldPassThroughToTitlebar(at point: NSPoint) -> Bool { guard let window else { return false } // Window-level portal hosts sit above SwiftUI content. Never intercept - // hits that land in the native titlebar region. + // hits that land in native titlebar space or the custom titlebar strip + // we reserve directly under it for window drag/double-click behaviors. let windowPoint = convert(point, to: nil) - return windowPoint.y >= (window.contentLayoutRect.maxY - 0.5) + let nativeTitlebarHeight = window.frame.height - window.contentLayoutRect.height + let customTitlebarBandHeight = max(28, min(72, nativeTitlebarHeight)) + let interactionBandMinY = window.contentLayoutRect.maxY - customTitlebarBandHeight - 0.5 + return windowPoint.y >= interactionBandMinY } private func shouldPassThroughToSidebarResizer(at point: NSPoint) -> Bool { diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 3a21ed9d..8f3e6157 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -5241,9 +5241,9 @@ struct VerticalTabsSidebar: View { .allowsHitTesting(false) } .overlay(alignment: .top) { - // Double-click the sidebar title-bar area to trigger the - // standard macOS titlebar action (zoom/minimize). - DoubleClickZoomView() + // Match native titlebar behavior in the sidebar top strip: + // drag-to-move and double-click action (zoom/minimize). + WindowDragHandleView() .frame(height: trafficLightPadding) } .background(Color.clear) @@ -7479,27 +7479,6 @@ private struct SidebarTabDropDelegate: DropDelegate { } } -/// AppKit-level double-click handler for the sidebar title-bar area. -/// Uses NSView hit-testing so it isn't swallowed by the SwiftUI ScrollView underneath. -private struct DoubleClickZoomView: NSViewRepresentable { - func makeNSView(context: Context) -> NSView { - DoubleClickZoomNSView() - } - - func updateNSView(_ nsView: NSView, context: Context) {} - - private final class DoubleClickZoomNSView: NSView { - override var mouseDownCanMoveWindow: Bool { true } - override func hitTest(_ point: NSPoint) -> NSView? { self } - override func mouseDown(with event: NSEvent) { - if event.clickCount == 2, performStandardTitlebarDoubleClick(window: window) { - return - } - super.mouseDown(with: event) - } - } -} - private struct MiddleClickCapture: NSViewRepresentable { let onMiddleClick: () -> Void From 98cf07ce2a78e2740cf7bab37a70e10464520e8f Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Tue, 24 Feb 2026 14:20:14 -0800 Subject: [PATCH 176/214] Stabilize terminal render recovery after split topology churn --- Sources/GhosttyTerminalView.swift | 8 ++++ Sources/Workspace.swift | 66 +++++++++++++++++++++++++++---- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index ecb5b7dc..5dd0385c 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1914,6 +1914,14 @@ final class TerminalSurface: Identifiable, ObservableObject { return } + // Reassert display id on topology churn (split close/reparent) before forcing a refresh. + // This avoids a first-run stuck-vsync state where Ghostty believes vsync is active + // but callbacks have not resumed for the current display. + if let displayID = (view.window?.screen ?? NSScreen.main)?.displayID, + displayID != 0 { + ghostty_surface_set_display_id(surface, displayID) + } + view.forceRefreshSurface() ghostty_surface_refresh(surface) } diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 582f1d33..272bd086 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -577,6 +577,7 @@ final class Workspace: Identifiable, ObservableObject { private var debugDidMoveTabEventCount: UInt64 = 0 #endif private var geometryReconcileScheduled = false + private var geometryReconcileNeedsRerun = false private var isNormalizingPinnedTabOrder = false private var pendingNonFocusSplitFocusReassert: PendingNonFocusSplitFocusReassert? private var nonFocusSplitFocusReassertGeneration: UInt64 = 0 @@ -2241,18 +2242,67 @@ final class Workspace: Identifiable, ObservableObject { /// Reconcile remaining terminal view geometries after split topology changes. /// This keeps AppKit bounds and Ghostty surface sizes in sync in the next runloop turn. + private func reconcileTerminalGeometryPass() -> Bool { + var needsFollowUpPass = false + + // Flush pending AppKit layout first so terminal-host bounds reflect latest split topology. + for window in NSApp.windows { + window.contentView?.layoutSubtreeIfNeeded() + } + + for panel in panels.values { + guard let terminalPanel = panel as? TerminalPanel else { continue } + let hostedView = terminalPanel.hostedView + let hasUsableBounds = hostedView.bounds.width > 1 && hostedView.bounds.height > 1 + let hasSurface = terminalPanel.surface.surface != nil + let isAttached = hostedView.window != nil && hostedView.superview != nil + + // Split close/reparent churn can transiently detach a surviving terminal view. + // Force one SwiftUI representable update so the portal binding reattaches it. + if !isAttached || !hasUsableBounds || !hasSurface { + terminalPanel.requestViewReattach() + needsFollowUpPass = true + } + + hostedView.reconcileGeometryNow() + terminalPanel.surface.forceRefresh() + } + + return needsFollowUpPass + } + + private func runScheduledTerminalGeometryReconcile(remainingPasses: Int) { + guard remainingPasses > 0 else { + geometryReconcileScheduled = false + geometryReconcileNeedsRerun = false + return + } + + let needsFollowUpPass = reconcileTerminalGeometryPass() + let shouldRunAgain = geometryReconcileNeedsRerun || needsFollowUpPass + + if shouldRunAgain, remainingPasses > 1 { + geometryReconcileNeedsRerun = false + DispatchQueue.main.async { [weak self] in + guard let self else { return } + self.runScheduledTerminalGeometryReconcile(remainingPasses: remainingPasses - 1) + } + return + } + + geometryReconcileScheduled = false + geometryReconcileNeedsRerun = false + } + private func scheduleTerminalGeometryReconcile() { - guard !geometryReconcileScheduled else { return } + guard !geometryReconcileScheduled else { + geometryReconcileNeedsRerun = true + return + } geometryReconcileScheduled = true DispatchQueue.main.async { [weak self] in guard let self else { return } - self.geometryReconcileScheduled = false - - for panel in self.panels.values { - guard let terminalPanel = panel as? TerminalPanel else { continue } - terminalPanel.hostedView.reconcileGeometryNow() - terminalPanel.surface.forceRefresh() - } + self.runScheduledTerminalGeometryReconcile(remainingPasses: 4) } } From aeda5f827de8118d843bd72a0f3dc9e02b096ab0 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:22:58 -0800 Subject: [PATCH 177/214] Adopt custom blue accent across active UI states --- Sources/ContentView.swift | 48 +++++++++++++------ Sources/GhosttyTerminalView.swift | 4 +- Sources/NotificationsPage.swift | 4 +- Sources/Panels/BrowserPanelView.swift | 8 ++-- Sources/Update/UpdateTitlebarAccessory.swift | 6 +-- Sources/Update/UpdateViewModel.swift | 4 +- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 12 ++--- 7 files changed, 53 insertions(+), 33 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 752ffa29..36fca195 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -38,25 +38,45 @@ func sidebarActiveForegroundNSColor( return baseColor.withAlphaComponent(clampedOpacity) } -func sidebarSelectedWorkspaceBackgroundNSColor(for colorScheme: ColorScheme) -> NSColor { +func cmuxAccentNSColor(for colorScheme: ColorScheme) -> NSColor { switch colorScheme { case .dark: return NSColor( - srgbRed: 63.0 / 255.0, - green: 142.0 / 255.0, - blue: 252.0 / 255.0, + srgbRed: 0, + green: 145.0 / 255.0, + blue: 1.0, alpha: 1.0 ) default: return NSColor( - srgbRed: 62.0 / 255.0, - green: 133.0 / 255.0, - blue: 252.0 / 255.0, + srgbRed: 0, + green: 136.0 / 255.0, + blue: 1.0, alpha: 1.0 ) } } +func cmuxAccentNSColor(for appAppearance: NSAppearance?) -> NSColor { + let bestMatch = appAppearance?.bestMatch(from: [.darkAqua, .aqua]) + let scheme: ColorScheme = (bestMatch == .darkAqua) ? .dark : .light + return cmuxAccentNSColor(for: scheme) +} + +func cmuxAccentNSColor() -> NSColor { + NSColor(name: nil) { appearance in + cmuxAccentNSColor(for: appearance) + } +} + +func cmuxAccentColor() -> Color { + Color(nsColor: cmuxAccentNSColor()) +} + +func sidebarSelectedWorkspaceBackgroundNSColor(for colorScheme: ColorScheme) -> NSColor { + cmuxAccentNSColor(for: colorScheme) +} + func sidebarSelectedWorkspaceForegroundNSColor(opacity: CGFloat) -> NSColor { let clampedOpacity = max(0, min(opacity, 1)) return NSColor.white.withAlphaComponent(clampedOpacity) @@ -2583,7 +2603,7 @@ struct ContentView: View { let isSelected = index == selectedIndex let isHovered = commandPaletteHoveredResultIndex == index let rowBackground: Color = isSelected - ? Color.accentColor.opacity(0.12) + ? cmuxAccentColor().opacity(0.12) : (isHovered ? Color.primary.opacity(0.08) : .clear) Button { @@ -5903,7 +5923,7 @@ private struct SidebarEmptyArea: View { .overlay(alignment: .top) { if shouldShowTopDropIndicator { Rectangle() - .fill(Color.accentColor) + .fill(cmuxAccentColor()) .frame(height: 2) .padding(.horizontal, 8) .offset(y: -(rowSpacing / 2)) @@ -6010,7 +6030,7 @@ private struct TabItemView: View { } private var activeUnreadBadgeFillColor: Color { - usesInvertedActiveForeground ? Color.white.opacity(0.25) : Color.accentColor + usesInvertedActiveForeground ? Color.white.opacity(0.25) : cmuxAccentColor() } private var activeProgressTrackColor: Color { @@ -6018,7 +6038,7 @@ private struct TabItemView: View { } private var activeProgressFillColor: Color { - usesInvertedActiveForeground ? Color.white.opacity(0.8) : Color.accentColor + usesInvertedActiveForeground ? Color.white.opacity(0.8) : cmuxAccentColor() } private var shortcutHintEmphasis: Double { @@ -6289,7 +6309,7 @@ private struct TabItemView: View { .overlay(alignment: .top) { if showsCenteredTopDropIndicator { Rectangle() - .fill(Color.accentColor) + .fill(cmuxAccentColor()) .frame(height: 2) .padding(.horizontal, 8) .offset(y: index == 0 ? 0 : -(rowSpacing / 2)) @@ -6492,7 +6512,7 @@ private struct TabItemView: View { switch activeTabIndicatorStyle { case .leftRail: if isActive { return Color(nsColor: sidebarSelectedWorkspaceBackgroundNSColor(for: colorScheme)) } - if isMultiSelected { return Color.accentColor.opacity(0.25) } + if isMultiSelected { return cmuxAccentColor().opacity(0.25) } return Color.clear case .solidFill: if isActive { return Color(nsColor: sidebarSelectedWorkspaceBackgroundNSColor(for: colorScheme)) } @@ -6500,7 +6520,7 @@ private struct TabItemView: View { if isMultiSelected { return custom.opacity(0.35) } return custom.opacity(0.7) } - if isMultiSelected { return Color.accentColor.opacity(0.25) } + if isMultiSelected { return cmuxAccentColor().opacity(0.25) } return Color.clear } } diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index ecb5b7dc..89229133 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -3619,8 +3619,8 @@ final class GhosttySurfaceScrollView: NSView { inactiveOverlayView.isHidden = true addSubview(inactiveOverlayView) dropZoneOverlayView.wantsLayer = true - dropZoneOverlayView.layer?.backgroundColor = NSColor.controlAccentColor.withAlphaComponent(0.25).cgColor - dropZoneOverlayView.layer?.borderColor = NSColor.controlAccentColor.cgColor + dropZoneOverlayView.layer?.backgroundColor = cmuxAccentNSColor().withAlphaComponent(0.25).cgColor + dropZoneOverlayView.layer?.borderColor = cmuxAccentNSColor().cgColor dropZoneOverlayView.layer?.borderWidth = 2 dropZoneOverlayView.layer?.cornerRadius = 8 dropZoneOverlayView.isHidden = true diff --git a/Sources/NotificationsPage.swift b/Sources/NotificationsPage.swift index f04841ed..53cc8737 100644 --- a/Sources/NotificationsPage.swift +++ b/Sources/NotificationsPage.swift @@ -182,11 +182,11 @@ private struct NotificationRow: View { Button(action: onOpen) { HStack(alignment: .top, spacing: 12) { Circle() - .fill(notification.isRead ? Color.clear : Color.accentColor) + .fill(notification.isRead ? Color.clear : cmuxAccentColor()) .frame(width: 8, height: 8) .overlay( Circle() - .stroke(Color.accentColor.opacity(notification.isRead ? 0.2 : 1), lineWidth: 1) + .stroke(cmuxAccentColor().opacity(notification.isRead ? 0.2 : 1), lineWidth: 1) ) .padding(.top, 6) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 82069f74..b3ff4844 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -71,7 +71,7 @@ enum BrowserDevToolsIconColorOption: String, CaseIterable, Identifiable { // Matches Bonsplit tab icon tint for active tabs. return Color(nsColor: .labelColor) case .accent: - return .accentColor + return cmuxAccentColor() case .tertiary: return Color(nsColor: .tertiaryLabelColor) } @@ -288,8 +288,8 @@ struct BrowserPanelView: View { } .overlay { RoundedRectangle(cornerRadius: FocusFlashPattern.ringCornerRadius) - .stroke(Color.accentColor.opacity(focusFlashOpacity), lineWidth: 3) - .shadow(color: Color.accentColor.opacity(focusFlashOpacity * 0.35), radius: 10) + .stroke(cmuxAccentColor().opacity(focusFlashOpacity), lineWidth: 3) + .shadow(color: cmuxAccentColor().opacity(focusFlashOpacity * 0.35), radius: 10) .padding(FocusFlashPattern.ringInset) .allowsHitTesting(false) } @@ -676,7 +676,7 @@ struct BrowserPanelView: View { ) .overlay( RoundedRectangle(cornerRadius: omnibarPillCornerRadius, style: .continuous) - .stroke(addressBarFocused ? Color.accentColor : Color.clear, lineWidth: 1) + .stroke(addressBarFocused ? cmuxAccentColor() : Color.clear, lineWidth: 1) ) .accessibilityElement(children: .contain) .background { diff --git a/Sources/Update/UpdateTitlebarAccessory.swift b/Sources/Update/UpdateTitlebarAccessory.swift index ff73c91a..84ac40d3 100644 --- a/Sources/Update/UpdateTitlebarAccessory.swift +++ b/Sources/Update/UpdateTitlebarAccessory.swift @@ -333,7 +333,7 @@ struct TitlebarControlsView: View { .foregroundColor(.white) .frame(width: config.badgeSize, height: config.badgeSize) .background( - Circle().fill(Color.accentColor) + Circle().fill(cmuxAccentColor()) ) .offset(x: config.badgeOffset.width, y: config.badgeOffset.height) } @@ -905,11 +905,11 @@ private struct NotificationPopoverRow: View { Button(action: onOpen) { HStack(alignment: .top, spacing: 10) { Circle() - .fill(notification.isRead ? Color.clear : Color.accentColor) + .fill(notification.isRead ? Color.clear : cmuxAccentColor()) .frame(width: 8, height: 8) .overlay( Circle() - .stroke(Color.accentColor.opacity(notification.isRead ? 0.2 : 1), lineWidth: 1) + .stroke(cmuxAccentColor().opacity(notification.isRead ? 0.2 : 1), lineWidth: 1) ) .padding(.top, 6) diff --git a/Sources/Update/UpdateViewModel.swift b/Sources/Update/UpdateViewModel.swift index 8aa275af..dd8a6697 100644 --- a/Sources/Update/UpdateViewModel.swift +++ b/Sources/Update/UpdateViewModel.swift @@ -132,7 +132,7 @@ class UpdateViewModel: ObservableObject { case .checking: return .secondary case .updateAvailable: - return .accentColor + return cmuxAccentColor() case .downloading, .extracting, .installing: return .secondary case .notFound: @@ -147,7 +147,7 @@ class UpdateViewModel: ObservableObject { case .permissionRequest: return Color(nsColor: NSColor.systemBlue.blended(withFraction: 0.3, of: .black) ?? .systemBlue) case .updateAvailable: - return .accentColor + return cmuxAccentColor() case .notFound: return Color(nsColor: NSColor.systemBlue.blended(withFraction: 0.5, of: .black) ?? .systemBlue) case .error: diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 7f742558..132f2374 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -850,9 +850,9 @@ final class SidebarSelectedWorkspaceColorTests: XCTestCase { return } - XCTAssertEqual(color.redComponent, 62.0 / 255.0, accuracy: 0.001) - XCTAssertEqual(color.greenComponent, 133.0 / 255.0, accuracy: 0.001) - XCTAssertEqual(color.blueComponent, 252.0 / 255.0, accuracy: 0.001) + XCTAssertEqual(color.redComponent, 0, accuracy: 0.001) + XCTAssertEqual(color.greenComponent, 136.0 / 255.0, accuracy: 0.001) + XCTAssertEqual(color.blueComponent, 1.0, accuracy: 0.001) XCTAssertEqual(color.alphaComponent, 1.0, accuracy: 0.001) } @@ -862,9 +862,9 @@ final class SidebarSelectedWorkspaceColorTests: XCTestCase { return } - XCTAssertEqual(color.redComponent, 63.0 / 255.0, accuracy: 0.001) - XCTAssertEqual(color.greenComponent, 142.0 / 255.0, accuracy: 0.001) - XCTAssertEqual(color.blueComponent, 252.0 / 255.0, accuracy: 0.001) + XCTAssertEqual(color.redComponent, 0, accuracy: 0.001) + XCTAssertEqual(color.greenComponent, 145.0 / 255.0, accuracy: 0.001) + XCTAssertEqual(color.blueComponent, 1.0, accuracy: 0.001) XCTAssertEqual(color.alphaComponent, 1.0, accuracy: 0.001) } From 9db730718bcd59a3e136ab4db91e27ca4ca0104d Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:29:01 -0800 Subject: [PATCH 178/214] Fix browser eval CLI output --- CLI/cmux.swift | 29 ++++++- ...test_browser_eval_cli_output_regression.py | 87 +++++++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 tests/test_browser_eval_cli_output_regression.py diff --git a/CLI/cmux.swift b/CLI/cmux.swift index 3d3daf92..191ff350 100644 --- a/CLI/cmux.swift +++ b/CLI/cmux.swift @@ -2007,6 +2007,27 @@ struct CMUXCLI { } } + func displayBrowserValue(_ value: Any) -> String { + if value is NSNull { + return "null" + } + if let string = value as? String { + return string + } + if let bool = value as? Bool { + return bool ? "true" : "false" + } + if let number = value as? NSNumber { + return number.stringValue + } + if JSONSerialization.isValidJSONObject(value), + let data = try? JSONSerialization.data(withJSONObject: value, options: [.prettyPrinted]), + let text = String(data: data, encoding: .utf8) { + return text + } + return String(describing: value) + } + func nonFlagArgs(_ values: [String]) -> [String] { values.filter { !$0.hasPrefix("-") } } @@ -2174,7 +2195,13 @@ struct CMUXCLI { throw CLIError(message: "browser eval requires a script") } let payload = try client.sendV2(method: "browser.eval", params: ["surface_id": sid, "script": trimmed]) - output(payload, fallback: "OK") + let fallback: String + if let value = payload["value"] { + fallback = displayBrowserValue(value) + } else { + fallback = "OK" + } + output(payload, fallback: fallback) return } diff --git a/tests/test_browser_eval_cli_output_regression.py b/tests/test_browser_eval_cli_output_regression.py new file mode 100644 index 00000000..b8778a52 --- /dev/null +++ b/tests/test_browser_eval_cli_output_regression.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +"""Static regression guard for browser eval CLI output formatting. + +Ensures `cmux browser <surface> eval <script>` prints the evaluated value +instead of always printing `OK`. +""" + +from __future__ import annotations + +import subprocess +from pathlib import Path + + +def repo_root() -> Path: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return Path(result.stdout.strip()) + return Path(__file__).resolve().parents[1] + + +def extract_block(source: str, signature: str) -> str: + start = source.find(signature) + if start < 0: + raise ValueError(f"Missing signature: {signature}") + brace_start = source.find("{", start) + if brace_start < 0: + raise ValueError(f"Missing opening brace for: {signature}") + depth = 0 + for idx in range(brace_start, len(source)): + char = source[idx] + if char == "{": + depth += 1 + elif char == "}": + depth -= 1 + if depth == 0: + return source[brace_start : idx + 1] + raise ValueError(f"Unbalanced braces for: {signature}") + + +def main() -> int: + root = repo_root() + failures: list[str] = [] + + cli_path = root / "CLI" / "cmux.swift" + cli_source = cli_path.read_text(encoding="utf-8") + browser_block = extract_block(cli_source, "private func runBrowserCommand(") + + if "func displayBrowserValue(_ value: Any) -> String" not in browser_block: + failures.append("runBrowserCommand() is missing displayBrowserValue() helper") + else: + value_block = extract_block(browser_block, "func displayBrowserValue(_ value: Any) -> String") + required_guards = [ + "if value is NSNull", + "if let string = value as? String", + "if let bool = value as? Bool", + "if let number = value as? NSNumber", + ] + for guard in required_guards: + if guard not in value_block: + failures.append(f"displayBrowserValue() no longer handles: {guard}") + + eval_block = extract_block(browser_block, 'if subcommand == "eval"') + if 'let payload = try client.sendV2(method: "browser.eval"' not in eval_block: + failures.append("browser eval path no longer calls browser.eval v2 method") + if 'if let value = payload["value"]' not in eval_block: + failures.append("browser eval path no longer reads payload value") + if "fallback = displayBrowserValue(value)" not in eval_block: + failures.append("browser eval path no longer formats payload value for CLI output") + if 'output(payload, fallback: "OK")' in eval_block: + failures.append("browser eval path regressed to unconditional OK output") + + if failures: + print("FAIL: browser eval CLI output regression guard failed") + for item in failures: + print(f" - {item}") + return 1 + + print("PASS: browser eval CLI output regression guard is in place") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From aa222dbc0d6d23c23d4c6dd22f9a4b06aa450ef3 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:32:56 -0800 Subject: [PATCH 179/214] Sidebar double-click appends workspace to end --- Sources/ContentView.swift | 2 +- Sources/TabManager.swift | 12 +++-- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 53 +++++++++++++++++++ 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 495e218a..9dbaec0b 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -5903,7 +5903,7 @@ private struct SidebarEmptyArea: View { .contentShape(Rectangle()) .frame(maxWidth: .infinity, maxHeight: .infinity) .onTapGesture(count: 2) { - tabManager.addTab() + tabManager.addWorkspace(placementOverride: .end) if let selectedId = tabManager.selectedTabId { selectedTabIds = [selectedId] lastSidebarSelectionIndex = tabManager.tabs.firstIndex { $0.id == selectedId } diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 5f0a5482..901b2587 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -758,7 +758,11 @@ class TabManager: ObservableObject { } @discardableResult - func addWorkspace(workingDirectory overrideWorkingDirectory: String? = nil, select: Bool = true) -> Workspace { + func addWorkspace( + workingDirectory overrideWorkingDirectory: String? = nil, + select: Bool = true, + placementOverride: NewWorkspacePlacement? = nil + ) -> Workspace { sentryBreadcrumb("workspace.create", data: ["tabCount": tabs.count + 1]) let workingDirectory = normalizedWorkingDirectory(overrideWorkingDirectory) ?? preferredWorkingDirectoryForNewTab() let inheritedConfig = inheritedTerminalConfigForNewWorkspace() @@ -771,7 +775,7 @@ class TabManager: ObservableObject { configTemplate: inheritedConfig ) wireClosedBrowserTracking(for: newWorkspace) - let insertIndex = newTabInsertIndex() + let insertIndex = newTabInsertIndex(placementOverride: placementOverride) if insertIndex >= 0 && insertIndex <= tabs.count { tabs.insert(newWorkspace, at: insertIndex) } else { @@ -836,8 +840,8 @@ class TabManager: ObservableObject { return trimmed.isEmpty ? nil : normalized } - private func newTabInsertIndex() -> Int { - let placement = WorkspacePlacementSettings.current() + private func newTabInsertIndex(placementOverride: NewWorkspacePlacement? = nil) -> Int { + let placement = placementOverride ?? WorkspacePlacementSettings.current() let pinnedCount = tabs.filter { $0.isPinned }.count let selectedIndex = selectedTabId.flatMap { tabId in tabs.firstIndex(where: { $0.id == tabId }) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 132f2374..7292f8ad 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -2214,6 +2214,59 @@ final class WorkspacePlacementSettingsTests: XCTestCase { } } +@MainActor +final class WorkspaceCreationPlacementTests: XCTestCase { + func testAddWorkspaceDefaultPlacementMatchesCurrentSetting() { + let currentPlacement = WorkspacePlacementSettings.current() + + let defaultManager = makeManagerWithThreeWorkspaces() + let defaultBaselineOrder = defaultManager.tabs.map(\.id) + let defaultInserted = defaultManager.addWorkspace() + guard let defaultInsertedIndex = defaultManager.tabs.firstIndex(where: { $0.id == defaultInserted.id }) else { + XCTFail("Expected inserted workspace in tab list") + return + } + XCTAssertEqual(defaultManager.tabs.map(\.id).filter { $0 != defaultInserted.id }, defaultBaselineOrder) + + let explicitManager = makeManagerWithThreeWorkspaces() + let explicitBaselineOrder = explicitManager.tabs.map(\.id) + let explicitInserted = explicitManager.addWorkspace(placementOverride: currentPlacement) + guard let explicitInsertedIndex = explicitManager.tabs.firstIndex(where: { $0.id == explicitInserted.id }) else { + XCTFail("Expected inserted workspace in tab list") + return + } + XCTAssertEqual(explicitManager.tabs.map(\.id).filter { $0 != explicitInserted.id }, explicitBaselineOrder) + XCTAssertEqual(defaultInsertedIndex, explicitInsertedIndex) + } + + func testAddWorkspaceEndOverrideAlwaysAppends() { + let manager = makeManagerWithThreeWorkspaces() + let baselineCount = manager.tabs.count + guard baselineCount >= 3 else { + XCTFail("Expected at least three workspaces for placement regression test") + return + } + + let inserted = manager.addWorkspace(placementOverride: .end) + guard let insertedIndex = manager.tabs.firstIndex(where: { $0.id == inserted.id }) else { + XCTFail("Expected inserted workspace in tab list") + return + } + + XCTAssertEqual(insertedIndex, baselineCount) + } + + private func makeManagerWithThreeWorkspaces() -> TabManager { + let manager = TabManager() + _ = manager.addWorkspace() + _ = manager.addWorkspace() + if let first = manager.tabs.first { + manager.selectWorkspace(first) + } + return manager + } +} + final class WorkspaceTabColorSettingsTests: XCTestCase { func testNormalizedHexAcceptsAndNormalizesValidInput() { XCTAssertEqual(WorkspaceTabColorSettings.normalizedHex("#abc123"), "#ABC123") From 06cd25ed526b2de2ac1e49605ec71dbf2e3e108f Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:20:19 -0800 Subject: [PATCH 180/214] Fix session restore routing and browser history persistence --- Sources/AppDelegate.swift | 275 +++++++++++++++++- Sources/Panels/BrowserPanel.swift | 167 ++++++++++- Sources/SessionPersistence.swift | 2 + Sources/Workspace.swift | 13 +- .../AppDelegateShortcutRoutingTests.swift | 236 +++++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 66 +++++ cmuxTests/SessionPersistenceTests.swift | 136 ++++++++- 7 files changed, 878 insertions(+), 17 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 4e31697b..9f53b63e 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -684,6 +684,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent private var startupSessionSnapshot: AppSessionSnapshot? private var didPrepareStartupSessionSnapshot = false private var didAttemptStartupSessionRestore = false + private var isApplyingStartupSessionRestore = false private var sessionAutosaveTimer: DispatchSourceTimer? private var didHandleExplicitOpenIntentAtStartup = false private var isTerminatingApp = false @@ -1037,6 +1038,14 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent let startupSnapshot = startupSessionSnapshot let primaryWindowSnapshot = startupSnapshot?.windows.first if let primaryWindowSnapshot { + isApplyingStartupSessionRestore = true +#if DEBUG + dlog( + "session.restore.start windows=\(startupSnapshot?.windows.count ?? 0) " + + "primaryFrame={\(debugSessionRectDescription(primaryWindowSnapshot.frame))} " + + "primaryDisplay={\(debugSessionDisplayDescription(primaryWindowSnapshot.display))}" + ) +#endif applySessionWindowSnapshot( primaryWindowSnapshot, to: primaryContext, @@ -1057,21 +1066,37 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } if let startupSnapshot { - let additionalWindows = startupSnapshot + let additionalWindows = Array(startupSnapshot .windows .dropFirst() - .prefix(max(0, SessionPersistencePolicy.maxWindowsPerSnapshot - 1)) + .prefix(max(0, SessionPersistencePolicy.maxWindowsPerSnapshot - 1))) +#if DEBUG + for (index, windowSnapshot) in additionalWindows.enumerated() { + dlog( + "session.restore.enqueueAdditional idx=\(index + 1) " + + "frame={\(debugSessionRectDescription(windowSnapshot.frame))} " + + "display={\(debugSessionDisplayDescription(windowSnapshot.display))}" + ) + } +#endif if !additionalWindows.isEmpty { DispatchQueue.main.async { [weak self] in guard let self else { return } for windowSnapshot in additionalWindows { _ = self.createMainWindow(sessionWindowSnapshot: windowSnapshot) } + self.completeStartupSessionRestore() } + } else { + completeStartupSessionRestore() } } + } - self.startupSessionSnapshot = nil + private func completeStartupSessionRestore() { + startupSessionSnapshot = nil + isApplyingStartupSessionRestore = false + _ = saveSessionSnapshot(includeScrollback: false) } private func applySessionWindowSnapshot( @@ -1079,6 +1104,14 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent to context: MainWindowContext, window: NSWindow? ) { +#if DEBUG + dlog( + "session.restore.apply window=\(context.windowId.uuidString.prefix(8)) " + + "liveWin=\(window?.windowNumber ?? -1) " + + "snapshotFrame={\(debugSessionRectDescription(snapshot.frame))} " + + "snapshotDisplay={\(debugSessionDisplayDescription(snapshot.display))}" + ) +#endif context.tabManager.restoreSessionSnapshot(snapshot.tabManager) context.sidebarState.isVisible = snapshot.sidebar.isVisible context.sidebarState.persistedWidth = CGFloat( @@ -1088,6 +1121,12 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent if let restoredFrame = resolvedWindowFrame(from: snapshot), let window { window.setFrame(restoredFrame, display: true) +#if DEBUG + dlog( + "session.restore.frameApplied window=\(context.windowId.uuidString.prefix(8)) " + + "applied={\(debugNSRectDescription(window.frame))}" + ) +#endif } } @@ -1150,6 +1189,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent guard !availableDisplays.isEmpty else { return frame } if let targetDisplay = display(for: displaySnapshot, in: availableDisplays) { + if shouldPreserveExactFrame( + frame: frame, + displaySnapshot: displaySnapshot, + targetDisplay: targetDisplay + ) { + return frame + } return resolvedWindowFrame( frame: frame, displaySnapshot: displaySnapshot, @@ -1339,6 +1385,45 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return (dx * dx) + (dy * dy) } + private nonisolated static func shouldPreserveExactFrame( + frame: CGRect, + displaySnapshot: SessionDisplaySnapshot?, + targetDisplay: SessionDisplayGeometry + ) -> Bool { + guard let displaySnapshot else { return false } + guard let snapshotDisplayID = displaySnapshot.displayID, + let targetDisplayID = targetDisplay.displayID, + snapshotDisplayID == targetDisplayID else { + return false + } + + let visibleMatches = displaySnapshot.visibleFrame.map { + rectApproximatelyEqual($0.cgRect, targetDisplay.visibleFrame) + } ?? false + let frameMatches = displaySnapshot.frame.map { + rectApproximatelyEqual($0.cgRect, targetDisplay.frame) + } ?? false + guard visibleMatches || frameMatches else { return false } + + return frame.width.isFinite + && frame.height.isFinite + && frame.origin.x.isFinite + && frame.origin.y.isFinite + } + + private nonisolated static func rectApproximatelyEqual( + _ lhs: CGRect, + _ rhs: CGRect, + tolerance: CGFloat = 1 + ) -> Bool { + let lhsStd = lhs.standardized + let rhsStd = rhs.standardized + return abs(lhsStd.origin.x - rhsStd.origin.x) <= tolerance + && abs(lhsStd.origin.y - rhsStd.origin.y) <= tolerance + && abs(lhsStd.size.width - rhsStd.size.width) <= tolerance + && abs(lhsStd.size.height - rhsStd.size.height) <= tolerance + } + private func displaySnapshot(for window: NSWindow?) -> SessionDisplaySnapshot? { guard let window else { return nil } let screen = window.screen @@ -1421,6 +1506,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent @discardableResult private func saveSessionSnapshot(includeScrollback: Bool, removeWhenEmpty: Bool = false) -> Bool { + if Self.shouldSkipSessionSaveDuringStartupRestore( + isApplyingStartupSessionRestore: isApplyingStartupSessionRestore, + includeScrollback: includeScrollback + ) { +#if DEBUG + dlog("session.save.skipped reason=startup_restore_in_progress includeScrollback=0") +#endif + return false + } guard let snapshot = buildSessionSnapshot(includeScrollback: includeScrollback) else { if removeWhenEmpty { SessionPersistenceStore.removeSnapshot() @@ -1433,6 +1527,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent display: primaryWindow.display ) } +#if DEBUG + debugLogSessionSaveSnapshot(snapshot, includeScrollback: includeScrollback) +#endif return SessionPersistenceStore.save(snapshot) } @@ -1446,6 +1543,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent !isTerminatingApp } + nonisolated static func shouldSkipSessionSaveDuringStartupRestore( + isApplyingStartupSessionRestore: Bool, + includeScrollback: Bool + ) -> Bool { + isApplyingStartupSessionRestore && !includeScrollback + } + private func buildSessionSnapshot(includeScrollback: Bool) -> AppSessionSnapshot? { let contexts = mainWindowContexts.values.sorted { lhs, rhs in let lhsWindow = lhs.window ?? windowForMainWindowId(lhs.windowId) @@ -1484,6 +1588,54 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent ) } +#if DEBUG + private func debugLogSessionSaveSnapshot( + _ snapshot: AppSessionSnapshot, + includeScrollback: Bool + ) { + dlog( + "session.save includeScrollback=\(includeScrollback ? 1 : 0) " + + "windows=\(snapshot.windows.count)" + ) + for (index, windowSnapshot) in snapshot.windows.enumerated() { + let workspaceCount = windowSnapshot.tabManager.workspaces.count + let selectedWorkspace = windowSnapshot.tabManager.selectedWorkspaceIndex.map(String.init) ?? "nil" + dlog( + "session.save.window idx=\(index) " + + "frame={\(debugSessionRectDescription(windowSnapshot.frame))} " + + "display={\(debugSessionDisplayDescription(windowSnapshot.display))} " + + "workspaces=\(workspaceCount) selected=\(selectedWorkspace)" + ) + } + } + + private func debugSessionRectDescription(_ rect: SessionRectSnapshot?) -> String { + guard let rect else { return "nil" } + return "x=\(debugSessionNumber(rect.x)) y=\(debugSessionNumber(rect.y)) " + + "w=\(debugSessionNumber(rect.width)) h=\(debugSessionNumber(rect.height))" + } + + private func debugNSRectDescription(_ rect: NSRect?) -> String { + guard let rect else { return "nil" } + return "x=\(debugSessionNumber(Double(rect.origin.x))) " + + "y=\(debugSessionNumber(Double(rect.origin.y))) " + + "w=\(debugSessionNumber(Double(rect.size.width))) " + + "h=\(debugSessionNumber(Double(rect.size.height)))" + } + + private func debugSessionDisplayDescription(_ display: SessionDisplaySnapshot?) -> String { + guard let display else { return "nil" } + let displayIdText = display.displayID.map(String.init) ?? "nil" + return "id=\(displayIdText) " + + "frame={\(debugSessionRectDescription(display.frame))} " + + "visible={\(debugSessionRectDescription(display.visibleFrame))}" + } + + private func debugSessionNumber(_ value: Double) -> String { + String(format: "%.1f", value) + } +#endif + /// Register a terminal window with the AppDelegate so menu commands and socket control /// can target whichever window is currently active. func registerMainWindow( @@ -2186,9 +2338,24 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return context } + // If a keyboard event identifies a specific window but that context + // can't be resolved, do not fall back to another window. + if shortcutEventHasAddressableWindow(event) { +#if DEBUG + logWorkspaceCreationRouting( + phase: "choose", + source: debugSource, + reason: "event_context_required_no_fallback", + event: event, + chosenContext: nil + ) +#endif + return nil + } + if let keyWindow = NSApp.keyWindow, let context = contextForMainTerminalWindow(keyWindow) { - #if DEBUG +#if DEBUG logWorkspaceCreationRouting( phase: "choose", source: debugSource, @@ -2238,10 +2405,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent event: event, chosenContext: fallback ) - #endif +#endif return fallback } + private func shortcutEventHasAddressableWindow(_ event: NSEvent?) -> Bool { + guard let event else { return false } + return event.window != nil || event.windowNumber >= 0 + } + private func mainWindowContext( forShortcutEvent event: NSEvent?, debugSource: String = "unspecified" @@ -2306,6 +2478,76 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return nil } + private func preferredMainWindowContextForShortcutRouting(event: NSEvent) -> MainWindowContext? { + if let context = mainWindowContext(forShortcutEvent: event, debugSource: "shortcut.routing") { + return context + } + + if shortcutEventHasAddressableWindow(event) { +#if DEBUG + logWorkspaceCreationRouting( + phase: "choose", + source: "shortcut.routing", + reason: "event_context_required_no_fallback", + event: event, + chosenContext: nil + ) +#endif + return nil + } + + if let keyWindow = NSApp.keyWindow, + let context = contextForMainTerminalWindow(keyWindow) { + return context + } + + if let mainWindow = NSApp.mainWindow, + let context = contextForMainTerminalWindow(mainWindow) { + return context + } + + if let activeManager = tabManager, + let context = mainWindowContexts.values.first(where: { $0.tabManager === activeManager }) { + return context + } + + return mainWindowContexts.values.first + } + + @discardableResult + private func synchronizeShortcutRoutingContext(event: NSEvent) -> Bool { + guard let context = preferredMainWindowContextForShortcutRouting(event: event) else { +#if DEBUG + FocusLogStore.shared.append( + "shortcut.route reason=no_context_no_fallback eventWin=\(event.windowNumber) keyCode=\(event.keyCode)" + ) +#endif + return false + } + + let alreadyActive = + tabManager === context.tabManager + && sidebarState === context.sidebarState + && sidebarSelectionState === context.sidebarSelectionState + if alreadyActive { return true } + + if let window = context.window ?? windowForMainWindowId(context.windowId) { + setActiveMainWindow(window) + } else { + tabManager = context.tabManager + sidebarState = context.sidebarState + sidebarSelectionState = context.sidebarSelectionState + TerminalController.shared.setActiveTabManager(context.tabManager) + } + +#if DEBUG + FocusLogStore.shared.append( + "shortcut.route reason=sync activeTM=\(pointerString(tabManager)) chosen={\(summarizeContextForWorkspaceRouting(context))}" + ) +#endif + return true + } + @discardableResult func createMainWindow( initialWorkingDirectory: String? = nil, @@ -2346,7 +2588,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent window.titlebarAppearsTransparent = true window.isMovableByWindowBackground = false window.isMovable = false - if let restoredFrame = resolvedWindowFrame(from: sessionWindowSnapshot) { + let restoredFrame = resolvedWindowFrame(from: sessionWindowSnapshot) + if let restoredFrame { window.setFrame(restoredFrame, display: false) } else { window.center() @@ -2384,6 +2627,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent setActiveMainWindow(window) NSApp.activate(ignoringOtherApps: true) } + if let restoredFrame { + window.setFrame(restoredFrame, display: true) +#if DEBUG + dlog( + "session.restore.frameApplied window=\(windowId.uuidString.prefix(8)) " + + "applied={\(debugNSRectDescription(window.frame))}" + ) +#endif + } return windowId } @@ -3500,9 +3752,14 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } - // Route all shortcut handling through the window that actually produced - // the event to avoid cross-window actions when app-global pointers are stale. - activateMainWindowContextForShortcutEvent(event) + let hasEventWindowContext = shortcutEventHasAddressableWindow(event) + let didSynchronizeShortcutContext = synchronizeShortcutRoutingContext(event: event) + if hasEventWindowContext && !didSynchronizeShortcutContext { +#if DEBUG + dlog("handleCustomShortcut: unresolved event window context; bypassing app shortcut handling") +#endif + return false + } // Keep keyboard routing deterministic after split close/reparent transitions: // before processing shortcuts, converge first responder with the focused terminal panel. diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 420ba6d1..443d1f94 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1186,6 +1186,13 @@ final class BrowserPanel: Panel, ObservableObject { /// Published can go forward state @Published private(set) var canGoForward: Bool = false + private var nativeCanGoBack: Bool = false + private var nativeCanGoForward: Bool = false + private var usesRestoredSessionHistory: Bool = false + private var restoredBackHistoryStack: [URL] = [] + private var restoredForwardHistoryStack: [URL] = [] + private var restoredHistoryCurrentURL: URL? + /// Published estimated progress (0.0 - 1.0) @Published private(set) var estimatedProgress: Double = 0.0 @@ -1388,6 +1395,43 @@ final class BrowserPanel: Panel, ObservableObject { focusFlashToken &+= 1 } + func sessionNavigationHistorySnapshot() -> ( + backHistoryURLStrings: [String], + forwardHistoryURLStrings: [String] + ) { + if usesRestoredSessionHistory { + let back = restoredBackHistoryStack.compactMap { Self.serializableSessionHistoryURLString($0) } + // `restoredForwardHistoryStack` stores nearest-forward entries at the end. + let forward = restoredForwardHistoryStack.reversed().compactMap { Self.serializableSessionHistoryURLString($0) } + return (back, forward) + } + + let back = webView.backForwardList.backList.compactMap { + Self.serializableSessionHistoryURLString($0.url) + } + let forward = webView.backForwardList.forwardList.compactMap { + Self.serializableSessionHistoryURLString($0.url) + } + return (back, forward) + } + + func restoreSessionNavigationHistory( + backHistoryURLStrings: [String], + forwardHistoryURLStrings: [String], + currentURLString: String? + ) { + let restoredBack = Self.sanitizedSessionHistoryURLs(backHistoryURLStrings) + let restoredForward = Self.sanitizedSessionHistoryURLs(forwardHistoryURLStrings) + guard !restoredBack.isEmpty || !restoredForward.isEmpty else { return } + + usesRestoredSessionHistory = true + restoredBackHistoryStack = restoredBack + // Store nearest-forward entries at the end to make stack pop operations trivial. + restoredForwardHistoryStack = Array(restoredForward.reversed()) + restoredHistoryCurrentURL = Self.sanitizedSessionHistoryURL(currentURLString) + refreshNavigationAvailability() + } + private func setupObservers() { // URL changes let urlObserver = webView.observe(\.url, options: [.new]) { [weak self] webView, _ in @@ -1421,7 +1465,9 @@ final class BrowserPanel: Panel, ObservableObject { // Can go back let backObserver = webView.observe(\.canGoBack, options: [.new]) { [weak self] webView, _ in Task { @MainActor in - self?.canGoBack = webView.canGoBack + guard let self else { return } + self.nativeCanGoBack = webView.canGoBack + self.refreshNavigationAvailability() } } webViewObservers.append(backObserver) @@ -1429,7 +1475,9 @@ final class BrowserPanel: Panel, ObservableObject { // Can go forward let forwardObserver = webView.observe(\.canGoForward, options: [.new]) { [weak self] webView, _ in Task { @MainActor in - self?.canGoForward = webView.canGoForward + guard let self else { return } + self.nativeCanGoForward = webView.canGoForward + self.refreshNavigationAvailability() } } webViewObservers.append(forwardObserver) @@ -1692,13 +1740,28 @@ final class BrowserPanel: Panel, ObservableObject { navigateWithoutInsecureHTTPPrompt(request: request, recordTypedNavigation: recordTypedNavigation) } - private func navigateWithoutInsecureHTTPPrompt(to url: URL, recordTypedNavigation: Bool) { + private func navigateWithoutInsecureHTTPPrompt( + to url: URL, + recordTypedNavigation: Bool, + preserveRestoredSessionHistory: Bool = false + ) { let request = URLRequest(url: url) - navigateWithoutInsecureHTTPPrompt(request: request, recordTypedNavigation: recordTypedNavigation) + navigateWithoutInsecureHTTPPrompt( + request: request, + recordTypedNavigation: recordTypedNavigation, + preserveRestoredSessionHistory: preserveRestoredSessionHistory + ) } - private func navigateWithoutInsecureHTTPPrompt(request: URLRequest, recordTypedNavigation: Bool) { + private func navigateWithoutInsecureHTTPPrompt( + request: URLRequest, + recordTypedNavigation: Bool, + preserveRestoredSessionHistory: Bool = false + ) { guard let url = request.url else { return } + if !preserveRestoredSessionHistory { + abandonRestoredSessionHistoryIfNeeded() + } // Some installs can end up with a legacy Chrome UA override; keep this pinned. webView.customUserAgent = BrowserUserAgentSettings.safariUserAgent shouldRenderWebView = true @@ -1843,12 +1906,48 @@ extension BrowserPanel { /// Go back in history func goBack() { guard canGoBack else { return } + if usesRestoredSessionHistory { + guard let targetURL = restoredBackHistoryStack.popLast() else { + refreshNavigationAvailability() + return + } + if let current = resolvedCurrentSessionHistoryURL() { + restoredForwardHistoryStack.append(current) + } + restoredHistoryCurrentURL = targetURL + refreshNavigationAvailability() + navigateWithoutInsecureHTTPPrompt( + to: targetURL, + recordTypedNavigation: false, + preserveRestoredSessionHistory: true + ) + return + } + webView.goBack() } /// Go forward in history func goForward() { guard canGoForward else { return } + if usesRestoredSessionHistory { + guard let targetURL = restoredForwardHistoryStack.popLast() else { + refreshNavigationAvailability() + return + } + if let current = resolvedCurrentSessionHistoryURL() { + restoredBackHistoryStack.append(current) + } + restoredHistoryCurrentURL = targetURL + refreshNavigationAvailability() + navigateWithoutInsecureHTTPPrompt( + to: targetURL, + recordTypedNavigation: false, + preserveRestoredSessionHistory: true + ) + return + } + webView.goForward() } @@ -2185,6 +2284,64 @@ extension BrowserPanel { return nil } + private func resolvedCurrentSessionHistoryURL() -> URL? { + if let webViewURL = webView.url, + Self.serializableSessionHistoryURLString(webViewURL) != nil { + return webViewURL + } + if let currentURL, + Self.serializableSessionHistoryURLString(currentURL) != nil { + return currentURL + } + return restoredHistoryCurrentURL + } + + private func refreshNavigationAvailability() { + let resolvedCanGoBack: Bool + let resolvedCanGoForward: Bool + if usesRestoredSessionHistory { + resolvedCanGoBack = !restoredBackHistoryStack.isEmpty + resolvedCanGoForward = !restoredForwardHistoryStack.isEmpty + } else { + resolvedCanGoBack = nativeCanGoBack + resolvedCanGoForward = nativeCanGoForward + } + + if canGoBack != resolvedCanGoBack { + canGoBack = resolvedCanGoBack + } + if canGoForward != resolvedCanGoForward { + canGoForward = resolvedCanGoForward + } + } + + private func abandonRestoredSessionHistoryIfNeeded() { + guard usesRestoredSessionHistory else { return } + usesRestoredSessionHistory = false + restoredBackHistoryStack.removeAll(keepingCapacity: false) + restoredForwardHistoryStack.removeAll(keepingCapacity: false) + restoredHistoryCurrentURL = nil + refreshNavigationAvailability() + } + + private static func serializableSessionHistoryURLString(_ url: URL?) -> String? { + guard let url else { return nil } + let value = url.absoluteString.trimmingCharacters(in: .whitespacesAndNewlines) + guard !value.isEmpty, value != "about:blank" else { return nil } + return value + } + + private static func sanitizedSessionHistoryURL(_ raw: String?) -> URL? { + guard let raw else { return nil } + let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty, trimmed != "about:blank" else { return nil } + return URL(string: trimmed) + } + + private static func sanitizedSessionHistoryURLs(_ values: [String]) -> [URL] { + values.compactMap { sanitizedSessionHistoryURL($0) } + } + } private extension BrowserPanel { diff --git a/Sources/SessionPersistence.swift b/Sources/SessionPersistence.swift index d660d467..289909df 100644 --- a/Sources/SessionPersistence.swift +++ b/Sources/SessionPersistence.swift @@ -231,6 +231,8 @@ struct SessionBrowserPanelSnapshot: Codable, Sendable { var shouldRenderWebView: Bool var pageZoom: Double var developerToolsVisible: Bool + var backHistoryURLStrings: [String]? + var forwardHistoryURLStrings: [String]? } struct SessionPanelSnapshot: Codable, Sendable { diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 1fda66ce..1140c6e3 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -295,11 +295,14 @@ extension Workspace { case .browser: guard let browserPanel = panel as? BrowserPanel else { return nil } terminalSnapshot = nil + let historySnapshot = browserPanel.sessionNavigationHistorySnapshot() browserSnapshot = SessionBrowserPanelSnapshot( - urlString: browserPanel.currentURL?.absoluteString, + urlString: browserPanel.preferredURLStringForOmnibar(), shouldRenderWebView: browserPanel.shouldRenderWebView, pageZoom: Double(browserPanel.webView.pageZoom), - developerToolsVisible: browserPanel.isDeveloperToolsVisible() + developerToolsVisible: browserPanel.isDeveloperToolsVisible(), + backHistoryURLStrings: historySnapshot.backHistoryURLStrings, + forwardHistoryURLStrings: historySnapshot.forwardHistoryURLStrings ) } @@ -512,6 +515,12 @@ extension Workspace { if let browserSnapshot = snapshot.browser, let browserPanel = browserPanel(for: panelId) { + browserPanel.restoreSessionNavigationHistory( + backHistoryURLStrings: browserSnapshot.backHistoryURLStrings ?? [], + forwardHistoryURLStrings: browserSnapshot.forwardHistoryURLStrings ?? [], + currentURLString: browserSnapshot.urlString + ) + let pageZoom = CGFloat(max(0.25, min(5.0, browserSnapshot.pageZoom))) if pageZoom.isFinite { browserPanel.webView.pageZoom = pageZoom diff --git a/cmuxTests/AppDelegateShortcutRoutingTests.swift b/cmuxTests/AppDelegateShortcutRoutingTests.swift index dae9faff..59796d6d 100644 --- a/cmuxTests/AppDelegateShortcutRoutingTests.swift +++ b/cmuxTests/AppDelegateShortcutRoutingTests.swift @@ -201,6 +201,242 @@ final class AppDelegateShortcutRoutingTests: XCTestCase { XCTAssertEqual(secondManager.tabs.count, secondCount + 1, "Menu-driven add workspace should still route to key window context when object-key lookup misses") } + func testCmdDigitRoutesToEventWindowWhenActiveManagerIsStale() { + guard let appDelegate = AppDelegate.shared else { + XCTFail("Expected AppDelegate.shared") + return + } + + let firstWindowId = appDelegate.createMainWindow() + let secondWindowId = appDelegate.createMainWindow() + + defer { + closeWindow(withId: firstWindowId) + closeWindow(withId: secondWindowId) + } + + guard let firstManager = appDelegate.tabManagerFor(windowId: firstWindowId), + let secondManager = appDelegate.tabManagerFor(windowId: secondWindowId), + let secondWindow = window(withId: secondWindowId) else { + XCTFail("Expected both window contexts to exist") + return + } + + _ = firstManager.addTab(select: true) + _ = secondManager.addTab(select: true) + + guard let firstSelectedBefore = firstManager.selectedTabId, + let secondSelectedBefore = secondManager.selectedTabId else { + XCTFail("Expected selected tabs in both windows") + return + } + guard let secondFirstTabId = secondManager.tabs.first?.id else { + XCTFail("Expected at least one tab in second window") + return + } + + appDelegate.tabManager = firstManager + XCTAssertTrue(appDelegate.tabManager === firstManager) + + guard let event = makeKeyDownEvent( + key: "1", + modifiers: [.command], + keyCode: 18, // kVK_ANSI_1 + windowNumber: secondWindow.windowNumber + ) else { + XCTFail("Failed to construct Cmd+1 event") + return + } + +#if DEBUG + XCTAssertTrue(appDelegate.debugHandleCustomShortcut(event: event)) +#else + XCTFail("debugHandleCustomShortcut is only available in DEBUG") +#endif + + XCTAssertEqual(firstManager.selectedTabId, firstSelectedBefore, "Cmd+1 must not select a tab in stale active window") + XCTAssertNotEqual(secondManager.selectedTabId, secondSelectedBefore, "Cmd+1 should change tab selection in event window") + XCTAssertEqual(secondManager.selectedTabId, secondFirstTabId, "Cmd+1 should select first tab in the event window") + XCTAssertTrue(appDelegate.tabManager === secondManager, "Shortcut routing should retarget active manager to event window") + } + + func testCmdTRoutesToEventWindowWhenActiveManagerIsStale() { + guard let appDelegate = AppDelegate.shared else { + XCTFail("Expected AppDelegate.shared") + return + } + + let firstWindowId = appDelegate.createMainWindow() + let secondWindowId = appDelegate.createMainWindow() + + defer { + closeWindow(withId: firstWindowId) + closeWindow(withId: secondWindowId) + } + + guard let firstManager = appDelegate.tabManagerFor(windowId: firstWindowId), + let secondManager = appDelegate.tabManagerFor(windowId: secondWindowId), + let secondWindow = window(withId: secondWindowId), + let firstWorkspace = firstManager.selectedWorkspace, + let secondWorkspace = secondManager.selectedWorkspace else { + XCTFail("Expected both window contexts to exist") + return + } + + let firstSurfaceCount = firstWorkspace.panels.count + let secondSurfaceCount = secondWorkspace.panels.count + + appDelegate.tabManager = firstManager + XCTAssertTrue(appDelegate.tabManager === firstManager) + + guard let event = makeKeyDownEvent( + key: "t", + modifiers: [.command], + keyCode: 17, // kVK_ANSI_T + windowNumber: secondWindow.windowNumber + ) else { + XCTFail("Failed to construct Cmd+T event") + return + } + +#if DEBUG + XCTAssertTrue(appDelegate.debugHandleCustomShortcut(event: event)) +#else + XCTFail("debugHandleCustomShortcut is only available in DEBUG") +#endif + RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.05)) + + XCTAssertEqual(firstWorkspace.panels.count, firstSurfaceCount, "Cmd+T must not create a surface in stale active window") + XCTAssertEqual(secondWorkspace.panels.count, secondSurfaceCount + 1, "Cmd+T should create a surface in the event window") + XCTAssertTrue(appDelegate.tabManager === secondManager, "Shortcut routing should retarget active manager to event window") + } + + func testCmdDigitDoesNotFallbackToOtherWindowWhenEventWindowContextIsMissing() { + guard let appDelegate = AppDelegate.shared else { + XCTFail("Expected AppDelegate.shared") + return + } + + let firstWindowId = appDelegate.createMainWindow() + let secondWindowId = appDelegate.createMainWindow() + + defer { + closeWindow(withId: firstWindowId) + closeWindow(withId: secondWindowId) + } + + guard let firstManager = appDelegate.tabManagerFor(windowId: firstWindowId), + let secondManager = appDelegate.tabManagerFor(windowId: secondWindowId), + let secondWindow = window(withId: secondWindowId) else { + XCTFail("Expected both window contexts to exist") + return + } + + _ = firstManager.addTab(select: true) + _ = secondManager.addTab(select: true) + guard let firstSelectedBefore = firstManager.selectedTabId, + let secondSelectedBefore = secondManager.selectedTabId else { + XCTFail("Expected selected tabs in both windows") + return + } + + secondWindow.makeKeyAndOrderFront(nil) + RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.05)) + + // Force stale app-level manager to first window while keyboard event + // references no known window. + appDelegate.tabManager = firstManager + + guard let event = makeKeyDownEvent( + key: "1", + modifiers: [.command], + keyCode: 18, + windowNumber: Int.max + ) else { + XCTFail("Failed to construct Cmd+1 event") + return + } + +#if DEBUG + XCTAssertFalse(appDelegate.debugHandleCustomShortcut(event: event)) +#else + XCTFail("debugHandleCustomShortcut is only available in DEBUG") +#endif + + XCTAssertEqual(firstManager.selectedTabId, firstSelectedBefore, "Unresolved event window must not route Cmd+1 into stale manager") + XCTAssertEqual(secondManager.selectedTabId, secondSelectedBefore, "Unresolved event window must not route Cmd+1 into key/main fallback manager") + XCTAssertTrue(appDelegate.tabManager === firstManager, "Unresolved event window should not retarget active manager") + } + + func testCmdNDoesNotFallbackToOtherWindowWhenEventWindowContextIsMissing() { + guard let appDelegate = AppDelegate.shared else { + XCTFail("Expected AppDelegate.shared") + return + } + + let firstWindowId = appDelegate.createMainWindow() + let secondWindowId = appDelegate.createMainWindow() + + defer { + closeWindow(withId: firstWindowId) + closeWindow(withId: secondWindowId) + } + + guard let firstManager = appDelegate.tabManagerFor(windowId: firstWindowId), + let secondManager = appDelegate.tabManagerFor(windowId: secondWindowId), + let secondWindow = window(withId: secondWindowId) else { + XCTFail("Expected both window contexts to exist") + return + } + + secondWindow.makeKeyAndOrderFront(nil) + RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.05)) + + let firstCount = firstManager.tabs.count + let secondCount = secondManager.tabs.count + appDelegate.tabManager = firstManager + + guard let event = makeKeyDownEvent( + key: "n", + modifiers: [.command], + keyCode: 45, + windowNumber: Int.max + ) else { + XCTFail("Failed to construct Cmd+N event") + return + } + +#if DEBUG + XCTAssertFalse(appDelegate.debugHandleCustomShortcut(event: event)) +#else + XCTFail("debugHandleCustomShortcut is only available in DEBUG") +#endif + + XCTAssertEqual(firstManager.tabs.count, firstCount, "Unresolved event window must not create workspace in stale manager") + XCTAssertEqual(secondManager.tabs.count, secondCount, "Unresolved event window must not create workspace in fallback window") + XCTAssertTrue(appDelegate.tabManager === firstManager, "Unresolved event window should not retarget active manager") + } + + private func makeKeyDownEvent( + key: String, + modifiers: NSEvent.ModifierFlags, + keyCode: UInt16, + windowNumber: Int + ) -> NSEvent? { + NSEvent.keyEvent( + with: .keyDown, + location: .zero, + modifierFlags: modifiers, + timestamp: ProcessInfo.processInfo.systemUptime, + windowNumber: windowNumber, + context: nil, + characters: key, + charactersIgnoringModifiers: key, + isARepeat: false, + keyCode: keyCode + ) + } + private func window(withId windowId: UUID) -> NSWindow? { let identifier = "cmux.main.\(windowId.uuidString)" return NSApp.windows.first(where: { $0.identifier?.rawValue == identifier }) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index c875cf11..91160e05 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1024,6 +1024,72 @@ final class BrowserJavaScriptDialogDelegateTests: XCTestCase { } } +@MainActor +final class BrowserSessionHistoryRestoreTests: XCTestCase { + func testSessionNavigationHistorySnapshotUsesRestoredStacks() { + let panel = BrowserPanel(workspaceId: UUID()) + + panel.restoreSessionNavigationHistory( + backHistoryURLStrings: [ + "https://example.com/a", + "https://example.com/b" + ], + forwardHistoryURLStrings: [ + "https://example.com/d" + ], + currentURLString: "https://example.com/c" + ) + + XCTAssertTrue(panel.canGoBack) + XCTAssertTrue(panel.canGoForward) + + let snapshot = panel.sessionNavigationHistorySnapshot() + XCTAssertEqual( + snapshot.backHistoryURLStrings, + ["https://example.com/a", "https://example.com/b"] + ) + XCTAssertEqual( + snapshot.forwardHistoryURLStrings, + ["https://example.com/d"] + ) + } + + func testSessionNavigationHistoryBackAndForwardUpdateStacks() { + let panel = BrowserPanel(workspaceId: UUID()) + + panel.restoreSessionNavigationHistory( + backHistoryURLStrings: [ + "https://example.com/a", + "https://example.com/b" + ], + forwardHistoryURLStrings: [ + "https://example.com/d" + ], + currentURLString: "https://example.com/c" + ) + + panel.goBack() + let afterBack = panel.sessionNavigationHistorySnapshot() + XCTAssertEqual(afterBack.backHistoryURLStrings, ["https://example.com/a"]) + XCTAssertEqual( + afterBack.forwardHistoryURLStrings, + ["https://example.com/c", "https://example.com/d"] + ) + XCTAssertTrue(panel.canGoBack) + XCTAssertTrue(panel.canGoForward) + + panel.goForward() + let afterForward = panel.sessionNavigationHistorySnapshot() + XCTAssertEqual( + afterForward.backHistoryURLStrings, + ["https://example.com/a", "https://example.com/b"] + ) + XCTAssertEqual(afterForward.forwardHistoryURLStrings, ["https://example.com/d"]) + XCTAssertTrue(panel.canGoBack) + XCTAssertTrue(panel.canGoForward) + } +} + @MainActor final class BrowserDeveloperToolsVisibilityPersistenceTests: XCTestCase { private final class FakeInspector: NSObject { diff --git a/cmuxTests/SessionPersistenceTests.swift b/cmuxTests/SessionPersistenceTests.swift index 638e8794..cd98ab5a 100644 --- a/cmuxTests/SessionPersistenceTests.swift +++ b/cmuxTests/SessionPersistenceTests.swift @@ -7,7 +7,7 @@ import XCTest #endif final class SessionPersistenceTests: XCTestCase { - func testSaveAndLoadRoundTripWithCustomSnapshotPath() { + func testSaveAndLoadRoundTripWithCustomSnapshotPath() throws { let tempDir = FileManager.default.temporaryDirectory .appendingPathComponent("cmux-session-tests-\(UUID().uuidString)", isDirectory: true) try? FileManager.default.createDirectory(at: tempDir, withIntermediateDirectories: true) @@ -23,6 +23,14 @@ final class SessionPersistenceTests: XCTestCase { XCTAssertEqual(loaded?.version, SessionSnapshotSchema.currentVersion) XCTAssertEqual(loaded?.windows.count, 1) XCTAssertEqual(loaded?.windows.first?.sidebar.selection, .tabs) + let frame = try XCTUnwrap(loaded?.windows.first?.frame) + XCTAssertEqual(frame.x, 10, accuracy: 0.001) + XCTAssertEqual(frame.y, 20, accuracy: 0.001) + XCTAssertEqual(frame.width, 900, accuracy: 0.001) + XCTAssertEqual(frame.height, 700, accuracy: 0.001) + XCTAssertEqual(loaded?.windows.first?.display?.displayID, 42) + let visibleFrame = try XCTUnwrap(loaded?.windows.first?.display?.visibleFrame) + XCTAssertEqual(visibleFrame.y, 25, accuracy: 0.001) } func testSaveAndLoadRoundTripPreservesWorkspaceCustomColor() { @@ -129,6 +137,56 @@ final class SessionPersistenceTests: XCTestCase { ) } + func testSessionRectSnapshotEncodesXYWidthHeightKeys() throws { + let snapshot = SessionRectSnapshot(x: 101.25, y: 202.5, width: 903.75, height: 704.5) + let data = try JSONEncoder().encode(snapshot) + let object = try XCTUnwrap(try JSONSerialization.jsonObject(with: data) as? [String: Double]) + + XCTAssertEqual(Set(object.keys), Set(["x", "y", "width", "height"])) + XCTAssertEqual(try XCTUnwrap(object["x"]), 101.25, accuracy: 0.001) + XCTAssertEqual(try XCTUnwrap(object["y"]), 202.5, accuracy: 0.001) + XCTAssertEqual(try XCTUnwrap(object["width"]), 903.75, accuracy: 0.001) + XCTAssertEqual(try XCTUnwrap(object["height"]), 704.5, accuracy: 0.001) + } + + func testSessionBrowserPanelSnapshotHistoryRoundTrip() throws { + let source = SessionBrowserPanelSnapshot( + urlString: "https://example.com/current", + shouldRenderWebView: true, + pageZoom: 1.2, + developerToolsVisible: true, + backHistoryURLStrings: [ + "https://example.com/a", + "https://example.com/b" + ], + forwardHistoryURLStrings: [ + "https://example.com/d" + ] + ) + + let data = try JSONEncoder().encode(source) + let decoded = try JSONDecoder().decode(SessionBrowserPanelSnapshot.self, from: data) + XCTAssertEqual(decoded.urlString, source.urlString) + XCTAssertEqual(decoded.backHistoryURLStrings, source.backHistoryURLStrings) + XCTAssertEqual(decoded.forwardHistoryURLStrings, source.forwardHistoryURLStrings) + } + + func testSessionBrowserPanelSnapshotHistoryDecodesWhenKeysAreMissing() throws { + let json = """ + { + "urlString": "https://example.com/current", + "shouldRenderWebView": true, + "pageZoom": 1.0, + "developerToolsVisible": false + } + """.data(using: .utf8)! + + let decoded = try JSONDecoder().decode(SessionBrowserPanelSnapshot.self, from: json) + XCTAssertEqual(decoded.urlString, "https://example.com/current") + XCTAssertNil(decoded.backHistoryURLStrings) + XCTAssertNil(decoded.forwardHistoryURLStrings) + } + func testScrollbackReplayEnvironmentWritesReplayFile() { let tempDir = FileManager.default.temporaryDirectory .appendingPathComponent("cmux-scrollback-replay-\(UUID().uuidString)", isDirectory: true) @@ -284,6 +342,27 @@ final class SessionPersistenceTests: XCTestCase { ) } + func testShouldSkipSessionSaveDuringStartupRestorePolicy() { + XCTAssertTrue( + AppDelegate.shouldSkipSessionSaveDuringStartupRestore( + isApplyingStartupSessionRestore: true, + includeScrollback: false + ) + ) + XCTAssertFalse( + AppDelegate.shouldSkipSessionSaveDuringStartupRestore( + isApplyingStartupSessionRestore: true, + includeScrollback: true + ) + ) + XCTAssertFalse( + AppDelegate.shouldSkipSessionSaveDuringStartupRestore( + isApplyingStartupSessionRestore: false, + includeScrollback: false + ) + ) + } + func testResolvedWindowFramePrefersSavedDisplayIdentity() { let savedFrame = SessionRectSnapshot(x: 1_200, y: 100, width: 600, height: 400) let savedDisplay = SessionDisplaySnapshot( @@ -436,6 +515,61 @@ final class SessionPersistenceTests: XCTestCase { XCTAssertEqual(restored.height, 700, accuracy: 0.001) } + func testResolvedWindowFramePreservesExactGeometryWhenDisplayIsUnchanged() { + let savedFrame = SessionRectSnapshot(x: 1_303, y: -90, width: 1_280, height: 1_410) + let savedDisplay = SessionDisplaySnapshot( + displayID: 2, + frame: SessionRectSnapshot(x: 0, y: 0, width: 2_560, height: 1_440), + visibleFrame: SessionRectSnapshot(x: 0, y: 0, width: 2_560, height: 1_410) + ) + let display = AppDelegate.SessionDisplayGeometry( + displayID: 2, + frame: CGRect(x: 0, y: 0, width: 2_560, height: 1_440), + visibleFrame: CGRect(x: 0, y: 0, width: 2_560, height: 1_410) + ) + + let restored = AppDelegate.resolvedWindowFrame( + from: savedFrame, + display: savedDisplay, + availableDisplays: [display], + fallbackDisplay: display + ) + + XCTAssertNotNil(restored) + guard let restored else { return } + XCTAssertEqual(restored.minX, 1_303, accuracy: 0.001) + XCTAssertEqual(restored.minY, -90, accuracy: 0.001) + XCTAssertEqual(restored.width, 1_280, accuracy: 0.001) + XCTAssertEqual(restored.height, 1_410, accuracy: 0.001) + } + + func testResolvedWindowFrameClampsWhenDisplayGeometryChangesEvenWithSameDisplayID() { + let savedFrame = SessionRectSnapshot(x: 1_303, y: -90, width: 1_280, height: 1_410) + let savedDisplay = SessionDisplaySnapshot( + displayID: 2, + frame: SessionRectSnapshot(x: 0, y: 0, width: 2_560, height: 1_440), + visibleFrame: SessionRectSnapshot(x: 0, y: 0, width: 2_560, height: 1_410) + ) + let resizedDisplay = AppDelegate.SessionDisplayGeometry( + displayID: 2, + frame: CGRect(x: 0, y: 0, width: 1_920, height: 1_080), + visibleFrame: CGRect(x: 0, y: 0, width: 1_920, height: 1_050) + ) + + let restored = AppDelegate.resolvedWindowFrame( + from: savedFrame, + display: savedDisplay, + availableDisplays: [resizedDisplay], + fallbackDisplay: resizedDisplay + ) + + XCTAssertNotNil(restored) + guard let restored else { return } + XCTAssertTrue(resizedDisplay.visibleFrame.contains(restored)) + XCTAssertNotEqual(restored.minX, 1_303, "Changed display geometry should clamp/remap frame") + XCTAssertNotEqual(restored.minY, -90, "Changed display geometry should clamp/remap frame") + } + func testResolvedSnapshotTerminalScrollbackPrefersCaptured() { let resolved = Workspace.resolvedSnapshotTerminalScrollback( capturedScrollback: "captured-value", From c74479d0b4d2d82a6616e0fee59a54363baf46f0 Mon Sep 17 00:00:00 2001 From: "Amar Sood (tekacs)" <pkg@tekacs.com> Date: Mon, 23 Feb 2026 23:45:57 -0500 Subject: [PATCH 181/214] Fix window title updates applying to wrong window TabManager.updateWindowTitle() used NSApp.keyWindow to find the target window, meaning any terminal title change (e.g. a spinner) would update whichever window happened to be focused, not the window that owns that TabManager. This corrupted the macOS Accessibility title attribute and caused visible title flapping in multi-window setups. Add a weak back-reference from TabManager to its owning NSWindow, set by AppDelegate.registerMainWindow(), and use it instead of keyWindow. --- Sources/AppDelegate.swift | 2 ++ Sources/TabManager.swift | 8 ++++++-- vendor/bonsplit | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 9f53b63e..0a4a0295 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1645,6 +1645,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent sidebarState: SidebarState, sidebarSelectionState: SidebarSelectionState ) { + tabManager.window = window + let key = ObjectIdentifier(window) #if DEBUG let priorManagerToken = debugManagerToken(self.tabManager) diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 702f935e..87649b3f 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -558,6 +558,10 @@ fileprivate func cmuxVsyncIOSurfaceTimelineCallback( @MainActor class TabManager: ObservableObject { + /// The window that owns this TabManager. Set by AppDelegate.registerMainWindow(). + /// Used to apply title updates to the correct window instead of NSApp.keyWindow. + weak var window: NSWindow? + @Published var tabs: [Workspace] = [] @Published private(set) var isWorkspaceCycleHot: Bool = false @@ -1496,8 +1500,8 @@ class TabManager: ObservableObject { private func updateWindowTitle(for tab: Workspace?) { let title = windowTitle(for: tab) - let targetWindow = NSApp.keyWindow ?? NSApp.mainWindow ?? NSApp.windows.first - targetWindow?.title = title + guard let targetWindow = window else { return } + targetWindow.title = title } private func windowTitle(for tab: Workspace?) -> String { diff --git a/vendor/bonsplit b/vendor/bonsplit index 2d0d05aa..f24ba922 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit 2d0d05aad8e1c2c1c56c290718063f9b53408849 +Subproject commit f24ba9222651ecc170869662eec9a5880404a82c From 1bcee15c78ec9673d1275f549725a5ed22eb6c7c Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:18:43 -0800 Subject: [PATCH 182/214] Add star history chart to README --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index e2c10ae0..9122c289 100644 --- a/README.md +++ b/README.md @@ -194,6 +194,16 @@ Browser developer-tool shortcuts follow Safari defaults and are customizable in cmux NIGHTLY is a separate app with its own bundle ID, so it runs alongside the stable version. Built automatically from the latest `main` commit and auto-updates via its own Sparkle feed. +## Star History + +<a href="https://star-history.com/#manaflow-ai/cmux&Date"> + <picture> + <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=manaflow-ai/cmux&type=Date&theme=dark" /> + <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=manaflow-ai/cmux&type=Date" /> + <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=manaflow-ai/cmux&type=Date" width="600" /> + </picture> +</a> + ## Community - [Discord](https://discord.gg/xsgFEVrWCZ) From b892d15d589832cfb311a7dcc797ab19363ec4d6 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:00:01 -0800 Subject: [PATCH 183/214] Fix omnibar focus thrash when another text field takes focus --- Sources/Panels/BrowserPanelView.swift | 37 ++++++++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 29 +++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index f91b71e8..71518994 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -2181,6 +2181,13 @@ struct OmnibarSuggestion: Identifiable, Hashable { } } +func browserOmnibarShouldReacquireFocusAfterEndEditing( + suppressWebViewFocus: Bool, + nextResponderIsOtherTextField: Bool +) -> Bool { + suppressWebViewFocus && !nextResponderIsOtherTextField +} + private final class OmnibarNativeTextField: NSTextField { var onPointerDown: (() -> Void)? var onHandleKeyEvent: ((NSEvent, NSTextView?) -> Bool)? @@ -2293,6 +2300,29 @@ private struct OmnibarTextFieldRepresentable: NSViewRepresentable { } } + private func nextResponderIsOtherTextField(window: NSWindow?) -> Bool { + guard let window, let field = parentField else { return false } + let responder = window.firstResponder + + if let editor = responder as? NSTextView, + let delegateField = editor.delegate as? NSTextField { + return delegateField !== field + } + + if let textField = responder as? NSTextField { + return textField !== field + } + + return false + } + + private func shouldReacquireFocusAfterEndEditing(window: NSWindow?) -> Bool { + return browserOmnibarShouldReacquireFocusAfterEndEditing( + suppressWebViewFocus: parent.shouldSuppressWebViewFocus(), + nextResponderIsOtherTextField: nextResponderIsOtherTextField(window: window) + ) + } + func controlTextDidBeginEditing(_ obj: Notification) { if !parent.isFocused { DispatchQueue.main.async { @@ -2305,15 +2335,18 @@ private struct OmnibarTextFieldRepresentable: NSViewRepresentable { func controlTextDidEndEditing(_ obj: Notification) { if parent.isFocused { - if parent.shouldSuppressWebViewFocus() { + if shouldReacquireFocusAfterEndEditing(window: parentField?.window) { guard pendingFocusRequest != true else { return } pendingFocusRequest = true DispatchQueue.main.async { [weak self] in guard let self else { return } self.pendingFocusRequest = nil guard self.parent.isFocused else { return } - guard self.parent.shouldSuppressWebViewFocus() else { return } guard let field = self.parentField, let window = field.window else { return } + guard self.shouldReacquireFocusAfterEndEditing(window: window) else { + self.parent.onFieldLostFocus() + return + } // Check both the field itself AND its field editor (which becomes // the actual first responder when the text field is being edited). let fr = window.firstResponder diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 91160e05..fc289dd1 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -6078,3 +6078,32 @@ final class TerminalControllerSocketTextChunkTests: XCTestCase { ) } } + +final class BrowserOmnibarFocusPolicyTests: XCTestCase { + func testReacquiresFocusWhenWebViewSuppressionIsActiveAndNextResponderIsNotAnotherTextField() { + XCTAssertTrue( + browserOmnibarShouldReacquireFocusAfterEndEditing( + suppressWebViewFocus: true, + nextResponderIsOtherTextField: false + ) + ) + } + + func testDoesNotReacquireFocusWhenAnotherTextFieldAlreadyTookFocus() { + XCTAssertFalse( + browserOmnibarShouldReacquireFocusAfterEndEditing( + suppressWebViewFocus: true, + nextResponderIsOtherTextField: true + ) + ) + } + + func testDoesNotReacquireFocusWhenWebViewSuppressionIsInactive() { + XCTAssertFalse( + browserOmnibarShouldReacquireFocusAfterEndEditing( + suppressWebViewFocus: false, + nextResponderIsOtherTextField: false + ) + ) + } +} From 92d558cb95466116efc2338a51d516b72c0e2112 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:10:02 -0800 Subject: [PATCH 184/214] Refine command palette focus restore and shortcut gating --- Sources/AppDelegate.swift | 54 ++++++++ Sources/ContentView.swift | 51 +++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 120 ++++++++++++++++++ 3 files changed, 224 insertions(+), 1 deletion(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 0a4a0295..f25250d3 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -323,6 +323,42 @@ func commandPaletteSelectionDeltaForKeyboardNavigation( return nil } +func shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: Bool, + normalizedFlags: NSEvent.ModifierFlags, + chars: String, + keyCode: UInt16 +) -> Bool { + guard isCommandPaletteVisible else { return false } + guard normalizedFlags.contains(.command) else { return false } + + let normalizedChars = chars.lowercased() + + if normalizedFlags == [.command] { + if normalizedChars == "a" + || normalizedChars == "c" + || normalizedChars == "v" + || normalizedChars == "x" + || normalizedChars == "z" + || normalizedChars == "y" { + return false + } + + switch keyCode { + case 51, 117, 123, 124: + return false + default: + break + } + } + + if normalizedFlags == [.command, .shift], normalizedChars == "z" { + return false + } + + return true +} + enum BrowserZoomShortcutAction: Equatable { case zoomIn case zoomOut @@ -3725,6 +3761,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } + if shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: activeCommandPaletteWindow() != nil, + normalizedFlags: normalizedFlags, + chars: chars, + keyCode: event.keyCode + ) { + return true + } + if normalizedFlags == [.command], chars == "q" { return handleQuitShortcutWarning() } @@ -4270,6 +4315,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent NotificationCenter.default.post(name: .browserFocusAddressBar, object: panel.id) } + func focusedBrowserAddressBarPanelId() -> UUID? { + browserAddressBarFocusedPanelId + } + + @discardableResult + func requestBrowserAddressBarFocus(panelId: UUID) -> Bool { + focusBrowserAddressBar(panelId: panelId) + } + private func shouldBypassAppShortcutForFocusedBrowserAddressBar( flags: NSEvent.ModifierFlags, chars: String diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index a88e5bd9..48aaacb5 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -1176,9 +1176,15 @@ struct ContentView: View { } } + private enum CommandPaletteRestoreFocusIntent { + case panel + case browserAddressBar + } + private struct CommandPaletteRestoreFocusTarget { let workspaceId: UUID let panelId: UUID + let intent: CommandPaletteRestoreFocusIntent } private enum CommandPaletteInputFocusTarget { @@ -4180,6 +4186,14 @@ struct ContentView: View { return false } + static func shouldRestoreBrowserAddressBarAfterCommandPaletteDismiss( + focusedPanelIsBrowser: Bool, + focusedBrowserAddressBarPanelId: UUID?, + focusedPanelId: UUID + ) -> Bool { + focusedPanelIsBrowser && focusedBrowserAddressBarPanelId == focusedPanelId + } + private func syncCommandPaletteDebugStateForObservedWindow() { guard let window = observedWindow ?? NSApp.keyWindow ?? NSApp.mainWindow else { return } AppDelegate.shared?.setCommandPaletteVisible(isCommandPalettePresented, for: window) @@ -4221,9 +4235,15 @@ struct ContentView: View { private func presentCommandPalette(initialQuery: String) { if let panelContext = focusedPanelContext { + let shouldRestoreBrowserAddressBar = Self.shouldRestoreBrowserAddressBarAfterCommandPaletteDismiss( + focusedPanelIsBrowser: panelContext.panel.panelType == .browser, + focusedBrowserAddressBarPanelId: AppDelegate.shared?.focusedBrowserAddressBarPanelId(), + focusedPanelId: panelContext.panelId + ) commandPaletteRestoreFocusTarget = CommandPaletteRestoreFocusTarget( workspaceId: panelContext.workspace.id, - panelId: panelContext.panelId + panelId: panelContext.panelId, + intent: shouldRestoreBrowserAddressBar ? .browserAddressBar : .panel ) } else { commandPaletteRestoreFocusTarget = nil @@ -4279,18 +4299,47 @@ struct ContentView: View { } tabManager.focusTab(target.workspaceId, surfaceId: target.panelId, suppressFlash: true) + if let context = focusedPanelContext, + context.workspace.id == target.workspaceId, + context.panelId == target.panelId { + restoreCommandPaletteInputFocusIfNeeded(target: target, attemptsRemaining: 6) + return + } + guard attemptsRemaining > 0 else { return } DispatchQueue.main.asyncAfter(deadline: .now() + 0.03) { guard !isCommandPalettePresented else { return } if let context = focusedPanelContext, context.workspace.id == target.workspaceId, context.panelId == target.panelId { + restoreCommandPaletteInputFocusIfNeeded(target: target, attemptsRemaining: 6) return } restoreCommandPaletteFocus(target: target, attemptsRemaining: attemptsRemaining - 1) } } + private func restoreCommandPaletteInputFocusIfNeeded( + target: CommandPaletteRestoreFocusTarget, + attemptsRemaining: Int + ) { + guard !isCommandPalettePresented else { return } + guard target.intent == .browserAddressBar else { return } + guard attemptsRemaining > 0 else { return } + guard let appDelegate = AppDelegate.shared else { return } + + if appDelegate.requestBrowserAddressBarFocus(panelId: target.panelId) { + return + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.03) { + restoreCommandPaletteInputFocusIfNeeded( + target: target, + attemptsRemaining: attemptsRemaining - 1 + ) + } + } + private func resetCommandPaletteSearchFocus() { applyCommandPaletteInputFocusPolicy(.search) } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index fc289dd1..d2ee116a 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1647,6 +1647,126 @@ final class CommandPaletteKeyboardNavigationTests: XCTestCase { } } +final class CommandPaletteOpenShortcutConsumptionTests: XCTestCase { + func testDoesNotConsumeWhenPaletteIsNotVisible() { + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: false, + normalizedFlags: [.command], + chars: "n", + keyCode: 45 + ) + ) + } + + func testConsumesAppCommandShortcutsWhenPaletteIsVisible() { + XCTAssertTrue( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "n", + keyCode: 45 + ) + ) + XCTAssertTrue( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "t", + keyCode: 17 + ) + ) + XCTAssertTrue( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command, .shift], + chars: ",", + keyCode: 43 + ) + ) + } + + func testAllowsClipboardAndUndoShortcutsForPaletteTextEditing() { + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "v", + keyCode: 9 + ) + ) + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "z", + keyCode: 6 + ) + ) + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command, .shift], + chars: "z", + keyCode: 6 + ) + ) + } + + func testAllowsArrowAndDeleteEditingCommandsForPaletteTextEditing() { + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "", + keyCode: 123 + ) + ) + XCTAssertFalse( + shouldConsumeShortcutWhileCommandPaletteVisible( + isCommandPaletteVisible: true, + normalizedFlags: [.command], + chars: "", + keyCode: 51 + ) + ) + } +} + +final class CommandPaletteRestoreFocusStateMachineTests: XCTestCase { + func testRestoresBrowserAddressBarWhenPaletteOpenedFromFocusedAddressBar() { + let panelId = UUID() + XCTAssertTrue( + ContentView.shouldRestoreBrowserAddressBarAfterCommandPaletteDismiss( + focusedPanelIsBrowser: true, + focusedBrowserAddressBarPanelId: panelId, + focusedPanelId: panelId + ) + ) + } + + func testDoesNotRestoreBrowserAddressBarWhenFocusedPanelIsNotBrowser() { + let panelId = UUID() + XCTAssertFalse( + ContentView.shouldRestoreBrowserAddressBarAfterCommandPaletteDismiss( + focusedPanelIsBrowser: false, + focusedBrowserAddressBarPanelId: panelId, + focusedPanelId: panelId + ) + ) + } + + func testDoesNotRestoreBrowserAddressBarWhenAnotherPanelHadAddressBarFocus() { + XCTAssertFalse( + ContentView.shouldRestoreBrowserAddressBarAfterCommandPaletteDismiss( + focusedPanelIsBrowser: true, + focusedBrowserAddressBarPanelId: UUID(), + focusedPanelId: UUID() + ) + ) + } +} + final class CommandPaletteRenameSelectionSettingsTests: XCTestCase { private let suiteName = "cmux.tests.commandPaletteRenameSelection.\(UUID().uuidString)" From 9953fa58d99d0fce8555015e296bc4ef6f3b4c35 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:14:32 -0800 Subject: [PATCH 185/214] Fix light-mode sidebar typing indicator contrast --- Sources/ContentView.swift | 26 +++++++++++++-- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 32 +++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 48aaacb5..cb4e565b 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -28,6 +28,19 @@ private func coloredCircleImage(color: NSColor) -> NSImage { return image } +func sidebarStatusPillActiveForegroundNSColor( + colorScheme: ColorScheme, + opacity: CGFloat +) -> NSColor { + let clampedOpacity = max(0, min(opacity, 1)) + switch colorScheme { + case .dark: + return NSColor.white.withAlphaComponent(clampedOpacity) + default: + return NSColor.black.withAlphaComponent(clampedOpacity) + } +} + struct ShortcutHintPillBackground: View { var emphasis: Double = 1.0 @@ -6811,12 +6824,13 @@ private struct SidebarStatusPillsRow: View { let onFocus: () -> Void @State private var isExpanded: Bool = false + @Environment(\.colorScheme) private var colorScheme var body: some View { VStack(alignment: .leading, spacing: 2) { Text(statusText) .font(.system(size: 10)) - .foregroundColor(isActive ? .white.opacity(0.8) : .secondary) + .foregroundColor(isActive ? activePrimaryTextColor : .secondary) .lineLimit(isExpanded ? nil : 3) .truncationMode(.tail) .multilineTextAlignment(.leading) @@ -6839,13 +6853,21 @@ private struct SidebarStatusPillsRow: View { } .buttonStyle(.plain) .font(.system(size: 10, weight: .semibold)) - .foregroundColor(isActive ? .white.opacity(0.65) : .secondary.opacity(0.9)) + .foregroundColor(isActive ? activeSecondaryTextColor : .secondary.opacity(0.9)) .frame(maxWidth: .infinity, alignment: .leading) } } .help(statusText) } + private var activePrimaryTextColor: Color { + Color(nsColor: sidebarStatusPillActiveForegroundNSColor(colorScheme: colorScheme, opacity: 0.8)) + } + + private var activeSecondaryTextColor: Color { + Color(nsColor: sidebarStatusPillActiveForegroundNSColor(colorScheme: colorScheme, opacity: 0.65)) + } + private var statusText: String { entries .map { entry in diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index d2ee116a..3c212b85 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -773,6 +773,38 @@ final class BrowserPanelOmnibarPillBackgroundColorTests: XCTestCase { } } +final class SidebarStatusPillActiveForegroundColorTests: XCTestCase { + func testLightModeUsesBlackWithRequestedOpacity() { + guard let color = sidebarStatusPillActiveForegroundNSColor( + colorScheme: .light, + opacity: 0.8 + ).usingColorSpace(.sRGB) else { + XCTFail("Expected sRGB-convertible color") + return + } + + XCTAssertEqual(color.redComponent, 0, accuracy: 0.001) + XCTAssertEqual(color.greenComponent, 0, accuracy: 0.001) + XCTAssertEqual(color.blueComponent, 0, accuracy: 0.001) + XCTAssertEqual(color.alphaComponent, 0.8, accuracy: 0.001) + } + + func testDarkModeUsesWhiteWithRequestedOpacity() { + guard let color = sidebarStatusPillActiveForegroundNSColor( + colorScheme: .dark, + opacity: 0.65 + ).usingColorSpace(.sRGB) else { + XCTFail("Expected sRGB-convertible color") + return + } + + XCTAssertEqual(color.redComponent, 1, accuracy: 0.001) + XCTAssertEqual(color.greenComponent, 1, accuracy: 0.001) + XCTAssertEqual(color.blueComponent, 1, accuracy: 0.001) + XCTAssertEqual(color.alphaComponent, 0.65, accuracy: 0.001) + } +} + final class BrowserDeveloperToolsShortcutDefaultsTests: XCTestCase { func testSafariDefaultShortcutForToggleDeveloperTools() { let shortcut = KeyboardShortcutSettings.Action.toggleBrowserDeveloperTools.defaultShortcut From e0e66a69cc8ba8b926ecd6c51a5aef9594e6ebe4 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:22:39 -0800 Subject: [PATCH 186/214] Fix light-mode typing indicator contrast in active sidebar --- Sources/ContentView.swift | 41 ++++++++++--------- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 24 ++++++----- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index cb4e565b..f77e2329 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -28,17 +28,14 @@ private func coloredCircleImage(color: NSColor) -> NSImage { return image } -func sidebarStatusPillActiveForegroundNSColor( - colorScheme: ColorScheme, - opacity: CGFloat +func sidebarActiveForegroundNSColor( + opacity: CGFloat, + appAppearance: NSAppearance? = NSApp?.effectiveAppearance ) -> NSColor { let clampedOpacity = max(0, min(opacity, 1)) - switch colorScheme { - case .dark: - return NSColor.white.withAlphaComponent(clampedOpacity) - default: - return NSColor.black.withAlphaComponent(clampedOpacity) - } + let bestMatch = appAppearance?.bestMatch(from: [.darkAqua, .aqua]) + let baseColor: NSColor = (bestMatch == .darkAqua) ? .white : .black + return baseColor.withAlphaComponent(clampedOpacity) } struct ShortcutHintPillBackground: View { @@ -5972,11 +5969,13 @@ private struct TabItemView: View { } private var activePrimaryTextColor: Color { - usesInvertedActiveForeground ? .white : .primary + usesInvertedActiveForeground ? Color(nsColor: sidebarActiveForegroundNSColor(opacity: 1.0)) : .primary } private func activeSecondaryColor(_ opacity: Double = 0.75) -> Color { - usesInvertedActiveForeground ? .white.opacity(opacity) : .secondary + usesInvertedActiveForeground + ? Color(nsColor: sidebarActiveForegroundNSColor(opacity: CGFloat(opacity))) + : .secondary } private var activeUnreadBadgeFillColor: Color { @@ -6719,11 +6718,16 @@ private struct TabItemView: View { private func logLevelColor(_ level: SidebarLogLevel, isActive: Bool) -> Color { if isActive { switch level { - case .info: return .white.opacity(0.5) - case .progress: return .white.opacity(0.8) - case .success: return .white.opacity(0.9) - case .warning: return .white.opacity(0.9) - case .error: return .white.opacity(0.9) + case .info: + return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.5)) + case .progress: + return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.8)) + case .success: + return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9)) + case .warning: + return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9)) + case .error: + return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9)) } } switch level { @@ -6824,7 +6828,6 @@ private struct SidebarStatusPillsRow: View { let onFocus: () -> Void @State private var isExpanded: Bool = false - @Environment(\.colorScheme) private var colorScheme var body: some View { VStack(alignment: .leading, spacing: 2) { @@ -6861,11 +6864,11 @@ private struct SidebarStatusPillsRow: View { } private var activePrimaryTextColor: Color { - Color(nsColor: sidebarStatusPillActiveForegroundNSColor(colorScheme: colorScheme, opacity: 0.8)) + Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.8)) } private var activeSecondaryTextColor: Color { - Color(nsColor: sidebarStatusPillActiveForegroundNSColor(colorScheme: colorScheme, opacity: 0.65)) + Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.65)) } private var statusText: String { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 3c212b85..de5ef2b6 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -773,12 +773,13 @@ final class BrowserPanelOmnibarPillBackgroundColorTests: XCTestCase { } } -final class SidebarStatusPillActiveForegroundColorTests: XCTestCase { - func testLightModeUsesBlackWithRequestedOpacity() { - guard let color = sidebarStatusPillActiveForegroundNSColor( - colorScheme: .light, - opacity: 0.8 - ).usingColorSpace(.sRGB) else { +final class SidebarActiveForegroundColorTests: XCTestCase { + func testLightAppearanceUsesBlackWithRequestedOpacity() { + guard let lightAppearance = NSAppearance(named: .aqua), + let color = sidebarActiveForegroundNSColor( + opacity: 0.8, + appAppearance: lightAppearance + ).usingColorSpace(.sRGB) else { XCTFail("Expected sRGB-convertible color") return } @@ -789,11 +790,12 @@ final class SidebarStatusPillActiveForegroundColorTests: XCTestCase { XCTAssertEqual(color.alphaComponent, 0.8, accuracy: 0.001) } - func testDarkModeUsesWhiteWithRequestedOpacity() { - guard let color = sidebarStatusPillActiveForegroundNSColor( - colorScheme: .dark, - opacity: 0.65 - ).usingColorSpace(.sRGB) else { + func testDarkAppearanceUsesWhiteWithRequestedOpacity() { + guard let darkAppearance = NSAppearance(named: .darkAqua), + let color = sidebarActiveForegroundNSColor( + opacity: 0.65, + appAppearance: darkAppearance + ).usingColorSpace(.sRGB) else { XCTFail("Expected sRGB-convertible color") return } From 7b59954a8811e3588d324ac06845c3e9812b07cf Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:28:48 -0800 Subject: [PATCH 187/214] Fix command palette caret color in light mode --- Sources/ContentView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index f77e2329..6210a99b 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -2508,7 +2508,7 @@ struct ContentView: View { TextField(commandPaletteSearchPlaceholder, text: $commandPaletteQuery) .textFieldStyle(.plain) .font(.system(size: 13, weight: .regular)) - .tint(.white) + .tint(Color(nsColor: sidebarActiveForegroundNSColor(opacity: 1.0))) .focused($isCommandPaletteSearchFocused) .onSubmit { runSelectedCommandPaletteResult(visibleResults: visibleResults) @@ -2661,7 +2661,7 @@ struct ContentView: View { TextField(target.placeholder, text: $commandPaletteRenameDraft) .textFieldStyle(.plain) .font(.system(size: 13, weight: .regular)) - .tint(.white) + .tint(Color(nsColor: sidebarActiveForegroundNSColor(opacity: 1.0))) .focused($isCommandPaletteRenameFocused) .backport.onKeyPress(.delete) { modifiers in handleCommandPaletteRenameDeleteBackward(modifiers: modifiers) From ce681bac672afa42b68ac0b65475c3de9d286736 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:05:34 -0800 Subject: [PATCH 188/214] Implement cross-window tab and workspace move UI --- Sources/AppDelegate.swift | 301 ++++++++++++++++++++++++++++++++++++++ Sources/ContentView.swift | 148 +++++++++++++++++++ Sources/Workspace.swift | 125 ++++++++++++++++ 3 files changed, 574 insertions(+) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index f25250d3..eeecd66d 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1736,6 +1736,29 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent let selectedWorkspaceId: UUID? } + struct WindowMoveTarget: Identifiable { + let windowId: UUID + let label: String + let tabManager: TabManager + let isCurrentWindow: Bool + + var id: UUID { windowId } + } + + struct WorkspaceMoveTarget: Identifiable { + let windowId: UUID + let workspaceId: UUID + let windowLabel: String + let workspaceTitle: String + let tabManager: TabManager + let isCurrentWindow: Bool + + var id: String { "\(windowId.uuidString):\(workspaceId.uuidString)" } + var label: String { + isCurrentWindow ? workspaceTitle : "\(workspaceTitle) (\(windowLabel))" + } + } + func listMainWindowSummaries() -> [MainWindowSummary] { let contexts = Array(mainWindowContexts.values) return contexts.map { ctx in @@ -1750,6 +1773,235 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } } + func windowMoveTargets(referenceWindowId: UUID?) -> [WindowMoveTarget] { + let orderedSummaries = orderedMainWindowSummaries(referenceWindowId: referenceWindowId) + let labels = windowLabelsById(orderedSummaries: orderedSummaries, referenceWindowId: referenceWindowId) + return orderedSummaries.compactMap { summary in + guard let manager = tabManagerFor(windowId: summary.windowId) else { return nil } + let label = labels[summary.windowId] ?? "Window" + return WindowMoveTarget( + windowId: summary.windowId, + label: label, + tabManager: manager, + isCurrentWindow: summary.windowId == referenceWindowId + ) + } + } + + func workspaceMoveTargets(excludingWorkspaceId: UUID? = nil, referenceWindowId: UUID?) -> [WorkspaceMoveTarget] { + let orderedSummaries = orderedMainWindowSummaries(referenceWindowId: referenceWindowId) + let labels = windowLabelsById(orderedSummaries: orderedSummaries, referenceWindowId: referenceWindowId) + + var targets: [WorkspaceMoveTarget] = [] + targets.reserveCapacity(orderedSummaries.reduce(0) { partial, summary in + partial + summary.workspaceCount + }) + + for summary in orderedSummaries { + guard let manager = tabManagerFor(windowId: summary.windowId) else { continue } + let windowLabel = labels[summary.windowId] ?? "Window" + let isCurrentWindow = summary.windowId == referenceWindowId + for workspace in manager.tabs { + if workspace.id == excludingWorkspaceId { + continue + } + targets.append( + WorkspaceMoveTarget( + windowId: summary.windowId, + workspaceId: workspace.id, + windowLabel: windowLabel, + workspaceTitle: workspaceDisplayName(workspace), + tabManager: manager, + isCurrentWindow: isCurrentWindow + ) + ) + } + } + + return targets + } + + @discardableResult + func moveWorkspaceToWindow(workspaceId: UUID, windowId: UUID, focus: Bool = true) -> Bool { + guard let sourceManager = tabManagerFor(tabId: workspaceId), + let destinationManager = tabManagerFor(windowId: windowId) else { + return false + } + + if sourceManager === destinationManager { + if focus { + destinationManager.focusTab(workspaceId, suppressFlash: true) + _ = focusMainWindow(windowId: windowId) + TerminalController.shared.setActiveTabManager(destinationManager) + } + return true + } + + guard let workspace = sourceManager.detachWorkspace(tabId: workspaceId) else { return false } + destinationManager.attachWorkspace(workspace, select: focus) + + if focus { + _ = focusMainWindow(windowId: windowId) + TerminalController.shared.setActiveTabManager(destinationManager) + } + return true + } + + @discardableResult + func moveWorkspaceToNewWindow(workspaceId: UUID, focus: Bool = true) -> UUID? { + let windowId = createMainWindow() + guard let destinationManager = tabManagerFor(windowId: windowId) else { return nil } + let bootstrapWorkspaceId = destinationManager.tabs.first?.id + + guard moveWorkspaceToWindow(workspaceId: workspaceId, windowId: windowId, focus: focus) else { + _ = closeMainWindow(windowId: windowId) + return nil + } + + // Remove the bootstrap workspace from the new window once the moved workspace arrives. + if let bootstrapWorkspaceId, + bootstrapWorkspaceId != workspaceId, + let bootstrapWorkspace = destinationManager.tabs.first(where: { $0.id == bootstrapWorkspaceId }), + destinationManager.tabs.count > 1 { + destinationManager.closeWorkspace(bootstrapWorkspace) + } + return windowId + } + + func locateBonsplitSurface(tabId: UUID) -> (windowId: UUID, workspaceId: UUID, panelId: UUID, tabManager: TabManager)? { + let bonsplitTabId = TabID(uuid: tabId) + for context in mainWindowContexts.values { + for workspace in context.tabManager.tabs { + if let panelId = workspace.panelIdFromSurfaceId(bonsplitTabId) { + return (context.windowId, workspace.id, panelId, context.tabManager) + } + } + } + return nil + } + + @discardableResult + func moveSurface( + panelId: UUID, + toWorkspace targetWorkspaceId: UUID, + targetPane: PaneID? = nil, + targetIndex: Int? = nil, + splitTarget: (orientation: SplitOrientation, insertFirst: Bool)? = nil, + focus: Bool = true, + focusWindow: Bool = true + ) -> Bool { + guard let source = locateSurface(surfaceId: panelId), + let sourceWorkspace = source.tabManager.tabs.first(where: { $0.id == source.workspaceId }), + let destinationManager = tabManagerFor(tabId: targetWorkspaceId), + let destinationWorkspace = destinationManager.tabs.first(where: { $0.id == targetWorkspaceId }) else { + return false + } + + let resolvedTargetPane = targetPane.flatMap { pane in + destinationWorkspace.bonsplitController.allPaneIds.first(where: { $0 == pane }) + } ?? destinationWorkspace.bonsplitController.focusedPaneId + ?? destinationWorkspace.bonsplitController.allPaneIds.first + + guard let resolvedTargetPane else { return false } + + if destinationWorkspace.id == sourceWorkspace.id { + if let splitTarget { + guard let sourceTabId = sourceWorkspace.surfaceIdFromPanelId(panelId), + sourceWorkspace.bonsplitController.splitPane( + resolvedTargetPane, + orientation: splitTarget.orientation, + movingTab: sourceTabId, + insertFirst: splitTarget.insertFirst + ) != nil else { + return false + } + if focus { + source.tabManager.focusTab(sourceWorkspace.id, surfaceId: panelId, suppressFlash: true) + } + return true + } + + return sourceWorkspace.moveSurface( + panelId: panelId, + toPane: resolvedTargetPane, + atIndex: targetIndex, + focus: focus + ) + } + + let sourcePane = sourceWorkspace.paneId(forPanelId: panelId) + let sourceIndex = sourceWorkspace.indexInPane(forPanelId: panelId) + + guard let detached = sourceWorkspace.detachSurface(panelId: panelId) else { return false } + guard destinationWorkspace.attachDetachedSurface( + detached, + inPane: resolvedTargetPane, + atIndex: targetIndex, + focus: focus + ) != nil else { + rollbackDetachedSurface( + detached, + to: sourceWorkspace, + sourcePane: sourcePane, + sourceIndex: sourceIndex, + focus: focus + ) + return false + } + + if let splitTarget { + guard let movedTabId = destinationWorkspace.surfaceIdFromPanelId(panelId), + destinationWorkspace.bonsplitController.splitPane( + resolvedTargetPane, + orientation: splitTarget.orientation, + movingTab: movedTabId, + insertFirst: splitTarget.insertFirst + ) != nil else { + if let detachedFromDestination = destinationWorkspace.detachSurface(panelId: panelId) { + rollbackDetachedSurface( + detachedFromDestination, + to: sourceWorkspace, + sourcePane: sourcePane, + sourceIndex: sourceIndex, + focus: focus + ) + } + return false + } + } + + if focus { + if focusWindow, let destinationWindowId = windowId(for: destinationManager) { + _ = focusMainWindow(windowId: destinationWindowId) + } + destinationManager.focusTab(targetWorkspaceId, surfaceId: panelId, suppressFlash: true) + } + + return true + } + + @discardableResult + func moveBonsplitTab( + tabId: UUID, + toWorkspace targetWorkspaceId: UUID, + targetPane: PaneID? = nil, + targetIndex: Int? = nil, + splitTarget: (orientation: SplitOrientation, insertFirst: Bool)? = nil, + focus: Bool = true, + focusWindow: Bool = true + ) -> Bool { + guard let located = locateBonsplitSurface(tabId: tabId) else { return false } + return moveSurface( + panelId: located.panelId, + toWorkspace: targetWorkspaceId, + targetPane: targetPane, + targetIndex: targetIndex, + splitTarget: splitTarget, + focus: focus, + focusWindow: focusWindow + ) + } + func tabManagerFor(windowId: UUID) -> TabManager? { mainWindowContexts.values.first(where: { $0.windowId == windowId })?.tabManager } @@ -1911,6 +2163,55 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } + private func orderedMainWindowSummaries(referenceWindowId: UUID?) -> [MainWindowSummary] { + let summaries = listMainWindowSummaries() + return summaries.sorted { lhs, rhs in + let lhsIsReference = lhs.windowId == referenceWindowId + let rhsIsReference = rhs.windowId == referenceWindowId + if lhsIsReference != rhsIsReference { return lhsIsReference } + if lhs.isKeyWindow != rhs.isKeyWindow { return lhs.isKeyWindow } + if lhs.isVisible != rhs.isVisible { return lhs.isVisible } + return lhs.windowId.uuidString < rhs.windowId.uuidString + } + } + + private func windowLabelsById(orderedSummaries: [MainWindowSummary], referenceWindowId: UUID?) -> [UUID: String] { + var labels: [UUID: String] = [:] + for (index, summary) in orderedSummaries.enumerated() { + if summary.windowId == referenceWindowId { + labels[summary.windowId] = "Current Window" + } else { + labels[summary.windowId] = "Window \(index + 1)" + } + } + return labels + } + + private func workspaceDisplayName(_ workspace: Workspace) -> String { + let trimmed = workspace.title.trimmingCharacters(in: .whitespacesAndNewlines) + return trimmed.isEmpty ? "Workspace" : trimmed + } + + private func rollbackDetachedSurface( + _ detached: Workspace.DetachedSurfaceTransfer, + to workspace: Workspace, + sourcePane: PaneID?, + sourceIndex: Int?, + focus: Bool + ) { + let rollbackPane = sourcePane.flatMap { pane in + workspace.bonsplitController.allPaneIds.first(where: { $0 == pane }) + } ?? workspace.bonsplitController.focusedPaneId + ?? workspace.bonsplitController.allPaneIds.first + guard let rollbackPane else { return } + _ = workspace.attachDetachedSurface( + detached, + inPane: rollbackPane, + atIndex: sourceIndex, + focus: focus + ) + } + private func windowForMainWindowId(_ windowId: UUID) -> NSWindow? { if let ctx = mainWindowContexts.values.first(where: { $0.windowId == windowId }), let window = ctx.window { diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 6210a99b..f2143b41 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -6282,6 +6282,12 @@ private struct TabItemView: View { dragAutoScrollController: dragAutoScrollController, dropIndicator: $dropIndicator )) + .onDrop(of: [BonsplitTabDragPayload.typeIdentifier], delegate: SidebarBonsplitTabDropDelegate( + targetWorkspaceId: tab.id, + tabManager: tabManager, + selectedTabIds: $selectedTabIds, + lastSidebarSelectionIndex: $lastSidebarSelectionIndex + )) .onTapGesture { updateSelection() } @@ -6385,6 +6391,28 @@ private struct TabItemView: View { } .disabled(targetIds.isEmpty) + let referenceWindowId = AppDelegate.shared?.windowId(for: tabManager) + let windowMoveTargets = AppDelegate.shared?.windowMoveTargets(referenceWindowId: referenceWindowId) ?? [] + let moveMenuTitle = targetIds.count > 1 ? "Move Workspaces to Window" : "Move Workspace to Window" + Menu(moveMenuTitle) { + Button("New Window") { + moveWorkspacesToNewWindow(targetIds) + } + .disabled(targetIds.isEmpty) + + if !windowMoveTargets.isEmpty { + Divider() + } + + ForEach(windowMoveTargets) { target in + Button(target.label) { + moveWorkspaces(targetIds, toWindow: target.windowId) + } + .disabled(target.isCurrentWindow || targetIds.isEmpty) + } + } + .disabled(targetIds.isEmpty) + Divider() if let key = closeWorkspaceShortcut.keyEquivalent { @@ -6613,6 +6641,43 @@ private struct TabItemView: View { } } + private func moveWorkspaces(_ workspaceIds: [UUID], toWindow windowId: UUID) { + guard let app = AppDelegate.shared else { return } + let orderedWorkspaceIds = tabManager.tabs.compactMap { workspaceIds.contains($0.id) ? $0.id : nil } + guard !orderedWorkspaceIds.isEmpty else { return } + + for (index, workspaceId) in orderedWorkspaceIds.enumerated() { + let shouldFocus = index == orderedWorkspaceIds.count - 1 + _ = app.moveWorkspaceToWindow(workspaceId: workspaceId, windowId: windowId, focus: shouldFocus) + } + + selectedTabIds.subtract(orderedWorkspaceIds) + syncSelectionAfterMutation() + } + + private func moveWorkspacesToNewWindow(_ workspaceIds: [UUID]) { + guard let app = AppDelegate.shared else { return } + let orderedWorkspaceIds = tabManager.tabs.compactMap { workspaceIds.contains($0.id) ? $0.id : nil } + guard let firstWorkspaceId = orderedWorkspaceIds.first else { return } + + let shouldFocusImmediately = orderedWorkspaceIds.count == 1 + guard let newWindowId = app.moveWorkspaceToNewWindow(workspaceId: firstWorkspaceId, focus: shouldFocusImmediately) else { + return + } + + if orderedWorkspaceIds.count > 1 { + for workspaceId in orderedWorkspaceIds.dropFirst() { + _ = app.moveWorkspaceToWindow(workspaceId: workspaceId, windowId: newWindowId, focus: false) + } + if let finalWorkspaceId = orderedWorkspaceIds.last { + _ = app.moveWorkspaceToWindow(workspaceId: finalWorkspaceId, windowId: newWindowId, focus: true) + } + } + + selectedTabIds.subtract(orderedWorkspaceIds) + syncSelectionAfterMutation() + } + private var latestNotificationText: String? { guard let notification = notificationStore.latestNotification(forTabId: tab.id) else { return nil } let text = notification.body.isEmpty ? notification.title : notification.body @@ -7170,6 +7235,89 @@ private enum SidebarTabDragPayload { } } +private enum BonsplitTabDragPayload { + static let typeIdentifier = "com.splittabbar.tabtransfer" + + struct Transfer: Decodable { + struct TabInfo: Decodable { + let id: UUID + } + + let tab: TabInfo + let sourcePaneId: UUID + } + + static func currentTransfer() -> Transfer? { + let pasteboard = NSPasteboard(name: .drag) + let type = NSPasteboard.PasteboardType(typeIdentifier) + + if let data = pasteboard.data(forType: type), + let transfer = try? JSONDecoder().decode(Transfer.self, from: data) { + return transfer + } + + if let raw = pasteboard.string(forType: type), + let data = raw.data(using: .utf8), + let transfer = try? JSONDecoder().decode(Transfer.self, from: data) { + return transfer + } + + return nil + } +} + +private struct SidebarBonsplitTabDropDelegate: DropDelegate { + let targetWorkspaceId: UUID + let tabManager: TabManager + @Binding var selectedTabIds: Set<UUID> + @Binding var lastSidebarSelectionIndex: Int? + + func validateDrop(info: DropInfo) -> Bool { + guard info.hasItemsConforming(to: [BonsplitTabDragPayload.typeIdentifier]) else { return false } + return BonsplitTabDragPayload.currentTransfer() != nil + } + + func dropUpdated(info: DropInfo) -> DropProposal? { + guard validateDrop(info: info) else { return nil } + return DropProposal(operation: .move) + } + + func performDrop(info: DropInfo) -> Bool { + guard validateDrop(info: info), + let transfer = BonsplitTabDragPayload.currentTransfer(), + let app = AppDelegate.shared else { + return false + } + + if let source = app.locateBonsplitSurface(tabId: transfer.tab.id), + source.workspaceId == targetWorkspaceId { + syncSidebarSelection() + return true + } + + guard app.moveBonsplitTab( + tabId: transfer.tab.id, + toWorkspace: targetWorkspaceId, + focus: true, + focusWindow: true + ) else { + return false + } + + selectedTabIds = [targetWorkspaceId] + syncSidebarSelection() + return true + } + + private func syncSidebarSelection() { + if let selectedId = tabManager.selectedTabId { + lastSidebarSelectionIndex = tabManager.tabs.firstIndex { $0.id == selectedId } + } else { + lastSidebarSelectionIndex = nil + } + } +} + private struct SidebarTabDropDelegate: DropDelegate { let targetTabId: UUID? let tabManager: TabManager diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 1140c6e3..0f29bb7a 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -999,6 +999,10 @@ final class Workspace: Identifiable, ObservableObject { bonsplitController.closeTab(welcomeTabId) } + bonsplitController.onExternalTabDrop = { [weak self] request in + self?.handleExternalTabDrop(request) ?? false + } + // Set ourselves as delegate bonsplitController.delegate = self @@ -2728,6 +2732,122 @@ final class Workspace: Identifiable, ObservableObject { setPanelCustomTitle(panelId: panelId, title: input.stringValue) } + private enum PanelMoveDestination { + case newWorkspaceInCurrentWindow + case selectedWorkspaceInNewWindow + case existingWorkspace(UUID) + } + + private func promptMovePanel(tabId: TabID) { + guard let panelId = panelIdFromSurfaceId(tabId), + let app = AppDelegate.shared else { return } + + let currentWindowId = app.tabManagerFor(tabId: id).flatMap { app.windowId(for: $0) } + let workspaceTargets = app.workspaceMoveTargets( + excludingWorkspaceId: id, + referenceWindowId: currentWindowId + ) + + var options: [(title: String, destination: PanelMoveDestination)] = [ + ("New Workspace in Current Window", .newWorkspaceInCurrentWindow), + ("Selected Workspace in New Window", .selectedWorkspaceInNewWindow), + ] + options.append(contentsOf: workspaceTargets.map { target in + (target.label, .existingWorkspace(target.workspaceId)) + }) + + let alert = NSAlert() + alert.messageText = "Move Tab" + alert.informativeText = "Choose a destination for this tab." + let popup = NSPopUpButton(frame: NSRect(x: 0, y: 0, width: 320, height: 26), pullsDown: false) + for option in options { + popup.addItem(withTitle: option.title) + } + popup.selectItem(at: 0) + alert.accessoryView = popup + alert.addButton(withTitle: "Move") + alert.addButton(withTitle: "Cancel") + + guard alert.runModal() == .alertFirstButtonReturn else { return } + let selectedIndex = max(0, min(popup.indexOfSelectedItem, options.count - 1)) + let destination = options[selectedIndex].destination + + let moved: Bool + switch destination { + case .newWorkspaceInCurrentWindow: + guard let manager = app.tabManagerFor(tabId: id) else { return } + let workspace = manager.addWorkspace(select: true) + moved = app.moveSurface( + panelId: panelId, + toWorkspace: workspace.id, + focus: true, + focusWindow: false + ) + + case .selectedWorkspaceInNewWindow: + let newWindowId = app.createMainWindow() + guard let destinationManager = app.tabManagerFor(windowId: newWindowId), + let destinationWorkspaceId = destinationManager.selectedTabId else { + return + } + moved = app.moveSurface( + panelId: panelId, + toWorkspace: destinationWorkspaceId, + focus: true, + focusWindow: true + ) + if !moved { + _ = app.closeMainWindow(windowId: newWindowId) + } + + case .existingWorkspace(let workspaceId): + moved = app.moveSurface( + panelId: panelId, + toWorkspace: workspaceId, + focus: true, + focusWindow: true + ) + } + + if !moved { + let failure = NSAlert() + failure.alertStyle = .warning + failure.messageText = "Move Failed" + failure.informativeText = "cmux could not move this tab to the selected destination." + failure.addButton(withTitle: "OK") + _ = failure.runModal() + } + } + + private func handleExternalTabDrop(_ request: BonsplitController.ExternalTabDropRequest) -> Bool { + guard let app = AppDelegate.shared else { return false } + + let targetPane: PaneID + let targetIndex: Int? + let splitTarget: (orientation: SplitOrientation, insertFirst: Bool)? + + switch request.destination { + case .insert(let paneId, let index): + targetPane = paneId + targetIndex = index + splitTarget = nil + case .split(let paneId, let orientation, let insertFirst): + targetPane = paneId + targetIndex = nil + splitTarget = (orientation, insertFirst) + } + + return app.moveBonsplitTab( + tabId: request.tabId.uuid, + toWorkspace: id, + targetPane: targetPane, + targetIndex: targetIndex, + splitTarget: splitTarget, + focus: true, + focusWindow: true + ) + } + } // MARK: - BonsplitDelegate @@ -3384,6 +3504,8 @@ extension Workspace: BonsplitDelegate { closeTabs(tabIdsToRight(of: tab.id, inPane: pane)) case .closeOthers: closeTabs(tabIdsToCloseOthers(of: tab.id, inPane: pane)) + case .move: + promptMovePanel(tabId: tab.id) case .newTerminalToRight: createTerminalToRight(of: tab.id, inPane: pane) case .newBrowserToRight: @@ -3398,6 +3520,9 @@ extension Workspace: BonsplitDelegate { guard let panelId = panelIdFromSurfaceId(tab.id) else { return } let shouldPin = !pinnedPanelIds.contains(panelId) setPanelPinned(panelId: panelId, pinned: shouldPin) + case .markAsRead: + guard let panelId = panelIdFromSurfaceId(tab.id) else { return } + clearManualUnread(panelId: panelId) case .markAsUnread: guard let panelId = panelIdFromSurfaceId(tab.id) else { return } markPanelUnread(panelId) From 58376c3fbcfd9de15bc29fc8c7f0a7253758d99c Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:57:10 -0800 Subject: [PATCH 189/214] Handle moving the last surface out of a window --- Sources/AppDelegate.swift | 21 ++++++++++++++ Sources/Workspace.swift | 11 ++++++-- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 28 +++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index eeecd66d..91dd96fb 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1970,6 +1970,12 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } } + cleanupEmptySourceWorkspaceAfterSurfaceMove( + sourceWorkspace: sourceWorkspace, + sourceManager: source.tabManager, + sourceWindowId: source.windowId + ) + if focus { if focusWindow, let destinationWindowId = windowId(for: destinationManager) { _ = focusMainWindow(windowId: destinationWindowId) @@ -2212,6 +2218,21 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent ) } + private func cleanupEmptySourceWorkspaceAfterSurfaceMove( + sourceWorkspace: Workspace, + sourceManager: TabManager, + sourceWindowId: UUID + ) { + guard sourceWorkspace.panels.isEmpty else { return } + guard sourceManager.tabs.contains(where: { $0.id == sourceWorkspace.id }) else { return } + + if sourceManager.tabs.count > 1 { + sourceManager.closeWorkspace(sourceWorkspace) + } else { + _ = closeMainWindow(windowId: sourceWindowId) + } + } + private func windowForMainWindowId(_ windowId: UUID) -> NSWindow? { if let ctx = mainWindowContexts.values.first(where: { $0.windowId == windowId }), let window = ctx.window { diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 0f29bb7a..a1228670 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -3176,9 +3176,16 @@ extension Workspace: BonsplitDelegate { lastTerminalConfigInheritancePanelId = nil } - // Keep the workspace invariant: always retain at least one real panel. - // This prevents runtime close callbacks from ever collapsing into a tabless workspace. + // Keep the workspace invariant for normal close paths. + // Detach/move flows intentionally allow a temporary empty workspace so AppDelegate can + // prune the source workspace/window after the tab is attached elsewhere. if panels.isEmpty { + if isDetaching { + scheduleTerminalGeometryReconcile() + scheduleFocusReconcile() + return + } + let replacement = createReplacementTerminalPanel() if let replacementTabId = surfaceIdFromPanelId(replacement.id), let replacementPane = bonsplitController.allPaneIds.first { diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index de5ef2b6..f663ff5f 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -2964,6 +2964,34 @@ final class WorkspacePanelGitBranchTests: XCTestCase { ) } + func testDetachLastSurfaceLeavesWorkspaceTemporarilyEmptyForMoveFlow() { + let workspace = Workspace() + guard let panelId = workspace.focusedPanelId, + let paneId = workspace.paneId(forPanelId: panelId) else { + XCTFail("Expected initial panel and pane") + return + } + + XCTAssertEqual(workspace.panels.count, 1) + + guard let detached = workspace.detachSurface(panelId: panelId) else { + XCTFail("Expected detach of last surface to succeed") + return + } + + XCTAssertEqual(detached.panelId, panelId) + XCTAssertTrue( + workspace.panels.isEmpty, + "Detaching the last surface should not auto-create a replacement panel" + ) + XCTAssertNil(workspace.surfaceIdFromPanelId(panelId)) + XCTAssertEqual(workspace.bonsplitController.tabs(inPane: paneId).count, 0) + + let restoredPanelId = workspace.attachDetachedSurface(detached, inPane: paneId, focus: false) + XCTAssertEqual(restoredPanelId, panelId) + XCTAssertEqual(workspace.panels.count, 1) + } + func testBrowserSplitWithFocusFalseRecoversFromDelayedStaleSelection() { let workspace = Workspace() guard let originalFocusedPanelId = workspace.focusedPanelId else { From 5c584dd7f766d62cbbf2a9c9c0c84670d3e52c40 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:33:19 -0800 Subject: [PATCH 190/214] Block tab drags across cmux app instances --- Sources/ContentView.swift | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index f2143b41..63d03d54 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -7237,6 +7237,7 @@ private enum SidebarTabDragPayload { private enum BonsplitTabDragPayload { static let typeIdentifier = "com.splittabbar.tabtransfer" + private static let currentProcessId = Int32(ProcessInfo.processInfo.processIdentifier) struct Transfer: Decodable { struct TabInfo: Decodable { @@ -7245,6 +7246,25 @@ private enum BonsplitTabDragPayload { let tab: TabInfo let sourcePaneId: UUID + let sourceProcessId: Int32 + + private enum CodingKeys: String, CodingKey { + case tab + case sourcePaneId + case sourceProcessId + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.tab = try container.decode(TabInfo.self, forKey: .tab) + self.sourcePaneId = try container.decode(UUID.self, forKey: .sourcePaneId) + // Legacy payloads won't include this field. Treat as foreign process. + self.sourceProcessId = try container.decodeIfPresent(Int32.self, forKey: .sourceProcessId) ?? -1 + } + } + + private static func isCurrentProcessTransfer(_ transfer: Transfer) -> Bool { + transfer.sourceProcessId == currentProcessId } static func currentTransfer() -> Transfer? { @@ -7252,13 +7272,15 @@ private enum BonsplitTabDragPayload { let type = NSPasteboard.PasteboardType(typeIdentifier) if let data = pasteboard.data(forType: type), - let transfer = try? JSONDecoder().decode(Transfer.self, from: data) { + let transfer = try? JSONDecoder().decode(Transfer.self, from: data), + isCurrentProcessTransfer(transfer) { return transfer } if let raw = pasteboard.string(forType: type), let data = raw.data(using: .utf8), - let transfer = try? JSONDecoder().decode(Transfer.self, from: data) { + let transfer = try? JSONDecoder().decode(Transfer.self, from: data), + isCurrentProcessTransfer(transfer) { return transfer } From b0b73e88785c2eafac89dd547c1f813f2bde2b13 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:22:11 -0800 Subject: [PATCH 191/214] Prevent stale host visibility thrash after tab move --- Sources/GhosttyTerminalView.swift | 37 ++++++++++++++-- Sources/TerminalWindowPortal.swift | 15 +++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 42 +++++++++++++++++++ 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index aaea7a19..1e614aad 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -5061,6 +5061,16 @@ struct GhosttyTerminalView: NSViewRepresentable { Coordinator() } + static func shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: Bool, + hostedViewHasSuperview: Bool, + isBoundToCurrentHost: Bool + ) -> Bool { + if !hostWindowAttached { return true } + if isBoundToCurrentHost { return true } + return !hostedViewHasSuperview + } + func makeNSView(context: Context) -> NSView { let container = HostContainerView() container.wantsLayer = false @@ -5103,8 +5113,6 @@ struct GhosttyTerminalView: NSViewRepresentable { // Keep the surface lifecycle and handlers updated even if we defer re-parenting. hostedView.attachSurface(terminalSurface) - hostedView.setVisibleInUI(isVisibleInUI) - hostedView.setActive(isActive) hostedView.setInactiveOverlay( color: inactiveOverlayColor, opacity: CGFloat(inactiveOverlayOpacity), @@ -5139,7 +5147,8 @@ struct GhosttyTerminalView: NSViewRepresentable { coordinator.attachGeneration += 1 let generation = coordinator.attachGeneration - if let host = nsView as? HostContainerView { + let hostContainer = nsView as? HostContainerView + if let host = hostContainer { host.onDidMoveToWindow = { [weak host, weak hostedView, weak coordinator] in guard let host, let hostedView, let coordinator else { return } guard coordinator.attachGeneration == generation else { return } @@ -5190,6 +5199,28 @@ struct GhosttyTerminalView: NSViewRepresentable { ) } } + + let hostWindowAttached = hostContainer?.window != nil + let isBoundToCurrentHost = hostContainer.map { host in + TerminalWindowPortalRegistry.isHostedView(hostedView, boundTo: host) + } ?? true + let shouldApplyImmediateHostedState = Self.shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: hostWindowAttached, + hostedViewHasSuperview: hostedView.superview != nil, + isBoundToCurrentHost: isBoundToCurrentHost + ) + + if shouldApplyImmediateHostedState { + hostedView.setVisibleInUI(isVisibleInUI) + hostedView.setActive(isActive) + } else { + // Preserve portal entry visibility while a stale host is still receiving SwiftUI updates. + // The currently bound host remains authoritative for immediate visible/active state. + TerminalWindowPortalRegistry.updateEntryVisibility( + for: hostedView, + visibleInUI: isVisibleInUI + ) + } } static func dismantleNSView(_ nsView: NSView, coordinator: Coordinator) { diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index e3f19c3d..2daddf4b 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -934,6 +934,12 @@ final class WindowTerminalPortal: NSObject { entriesByHostedId[hostedId] = entry } + func isHostedViewBoundToAnchor(withId hostedId: ObjectIdentifier, anchorView: NSView) -> Bool { + guard let entry = entriesByHostedId[hostedId], + let boundAnchor = entry.anchorView else { return false } + return boundAnchor === anchorView + } + func bind(hostedView: GhosttySurfaceScrollView, to anchorView: NSView, visibleInUI: Bool, zPriority: Int = 0) { guard ensureInstalled() else { return } @@ -1462,6 +1468,15 @@ enum TerminalWindowPortalRegistry { portal.updateEntryVisibility(forHostedId: hostedId, visibleInUI: visibleInUI) } + static func isHostedView(_ hostedView: GhosttySurfaceScrollView, boundTo anchorView: NSView) -> Bool { + let hostedId = ObjectIdentifier(hostedView) + guard let window = anchorView.window else { return false } + let windowId = ObjectIdentifier(window) + guard hostedToWindowId[hostedId] == windowId, + let portal = portalsByWindowId[windowId] else { return false } + return portal.isHostedViewBoundToAnchor(withId: hostedId, anchorView: anchorView) + } + static func viewAtWindowPoint(_ windowPoint: NSPoint, in window: NSWindow) -> NSView? { let portal = portal(for: window) return portal.viewAtWindowPoint(windowPoint) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index f663ff5f..e54d5401 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -6289,3 +6289,45 @@ final class BrowserOmnibarFocusPolicyTests: XCTestCase { ) } } + +final class GhosttyTerminalViewVisibilityPolicyTests: XCTestCase { + func testImmediateStateUpdateAllowedWhenHostNotInWindow() { + XCTAssertTrue( + GhosttyTerminalView.shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: false, + hostedViewHasSuperview: true, + isBoundToCurrentHost: false + ) + ) + } + + func testImmediateStateUpdateAllowedWhenBoundToCurrentHost() { + XCTAssertTrue( + GhosttyTerminalView.shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: true, + hostedViewHasSuperview: true, + isBoundToCurrentHost: true + ) + ) + } + + func testImmediateStateUpdateSkippedForStaleHostBoundElsewhere() { + XCTAssertFalse( + GhosttyTerminalView.shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: true, + hostedViewHasSuperview: true, + isBoundToCurrentHost: false + ) + ) + } + + func testImmediateStateUpdateAllowedWhenUnboundAndNotAttachedAnywhere() { + XCTAssertTrue( + GhosttyTerminalView.shouldApplyImmediateHostedStateUpdate( + hostWindowAttached: true, + hostedViewHasSuperview: false, + isBoundToCurrentHost: false + ) + ) + } +} From bcd024d8f8e4faed34a7e346d34ac059816c55ab Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:36:17 -0800 Subject: [PATCH 192/214] Keep focus on destination after cross-window surface move --- Sources/Workspace.swift | 38 +++++++++++---- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 47 +++++++++++++++++++ 2 files changed, 77 insertions(+), 8 deletions(-) diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index a1228670..4354bf8a 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -1059,6 +1059,9 @@ final class Workspace: Identifiable, ObservableObject { private var pendingTabSelection: (tabId: TabID, pane: PaneID)? private var isReconcilingFocusState = false private var focusReconcileScheduled = false +#if DEBUG + private(set) var debugFocusReconcileScheduledDuringDetachCount: Int = 0 +#endif private var geometryReconcileScheduled = false private var isNormalizingPinnedTabOrder = false private var pendingNonFocusSplitFocusReassert: PendingNonFocusSplitFocusReassert? @@ -1087,6 +1090,8 @@ final class Workspace: Identifiable, ObservableObject { private var detachingTabIds: Set<TabID> = [] private var pendingDetachedSurfaces: [TabID: DetachedSurfaceTransfer] = [:] + private var activeDetachCloseTransactions: Int = 0 + private var isDetachingCloseTransaction: Bool { activeDetachCloseTransactions > 0 } func panelIdFromSurfaceId(_ surfaceId: TabID) -> UUID? { surfaceIdToPanelId[surfaceId] @@ -2188,6 +2193,8 @@ final class Workspace: Identifiable, ObservableObject { detachingTabIds.insert(tabId) forceCloseTabIds.insert(tabId) + activeDetachCloseTransactions += 1 + defer { activeDetachCloseTransactions = max(0, activeDetachCloseTransactions - 1) } guard bonsplitController.closeTab(tabId) else { detachingTabIds.remove(tabId) pendingDetachedSurfaces.removeValue(forKey: tabId) @@ -2633,6 +2640,11 @@ final class Workspace: Identifiable, ObservableObject { /// Reconcile focus/first-responder convergence. /// Coalesce to the next main-queue turn so bonsplit selection/pane mutations settle first. private func scheduleFocusReconcile() { +#if DEBUG + if isDetachingCloseTransaction { + debugFocusReconcileScheduledDuringDetachCount += 1 + } +#endif guard !focusReconcileScheduled else { return } focusReconcileScheduled = true DispatchQueue.main.async { [weak self] in @@ -3117,6 +3129,7 @@ extension Workspace: BonsplitDelegate { forceCloseTabIds.remove(tabId) let selectTabId = postCloseSelectTabId.removeValue(forKey: tabId) let closedBrowserRestoreSnapshot = pendingClosedBrowserRestoreSnapshots.removeValue(forKey: tabId) + let isDetaching = detachingTabIds.remove(tabId) != nil || isDetachingCloseTransaction // Clean up our panel guard let panelId = panelIdFromSurfaceId(tabId) else { @@ -3124,7 +3137,9 @@ extension Workspace: BonsplitDelegate { NSLog("[Workspace] didCloseTab: no panelId for tabId") #endif scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() + if !isDetaching { + scheduleFocusReconcile() + } return } @@ -3132,7 +3147,6 @@ extension Workspace: BonsplitDelegate { NSLog("[Workspace] didCloseTab panelId=\(panelId) remainingPanels=\(panels.count - 1) remainingPanes=\(controller.allPaneIds.count)") #endif - let isDetaching = detachingTabIds.remove(tabId) != nil let panel = panels[panelId] if isDetaching, let panel { @@ -3182,7 +3196,6 @@ extension Workspace: BonsplitDelegate { if panels.isEmpty { if isDetaching { scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() return } @@ -3217,7 +3230,9 @@ extension Workspace: BonsplitDelegate { normalizePinnedTabs(in: pane) } scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() + if !isDetaching { + scheduleFocusReconcile() + } } func splitTabBar(_ controller: BonsplitController, didSelectTab tab: Bonsplit.Tab, inPane pane: PaneID) { @@ -3237,7 +3252,9 @@ extension Workspace: BonsplitDelegate { normalizePinnedTabs(in: source) normalizePinnedTabs(in: destination) scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() + if !isDetachingCloseTransaction { + scheduleFocusReconcile() + } } func splitTabBar(_ controller: BonsplitController, didFocusPane pane: PaneID) { @@ -3259,6 +3276,7 @@ extension Workspace: BonsplitDelegate { func splitTabBar(_ controller: BonsplitController, didClosePane paneId: PaneID) { let closedPanelIds = pendingPaneClosePanelIds.removeValue(forKey: paneId.id) ?? [] + let shouldScheduleFocusReconcile = !isDetachingCloseTransaction if !closedPanelIds.isEmpty { for panelId in closedPanelIds { @@ -3284,13 +3302,15 @@ extension Workspace: BonsplitDelegate { if let focusedPane = bonsplitController.focusedPaneId, let focusedTabId = bonsplitController.selectedTab(inPane: focusedPane)?.id { applyTabSelection(tabId: focusedTabId, inPane: focusedPane) - } else { + } else if shouldScheduleFocusReconcile { scheduleFocusReconcile() } } scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() + if shouldScheduleFocusReconcile { + scheduleFocusReconcile() + } } func splitTabBar(_ controller: BonsplitController, shouldClosePane pane: PaneID) -> Bool { @@ -3541,7 +3561,9 @@ extension Workspace: BonsplitDelegate { func splitTabBar(_ controller: BonsplitController, didChangeGeometry snapshot: LayoutSnapshot) { _ = snapshot scheduleTerminalGeometryReconcile() - scheduleFocusReconcile() + if !isDetachingCloseTransaction { + scheduleFocusReconcile() + } } // No post-close polling refresh loop: we rely on view invariants and Ghostty's wakeups. diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index e54d5401..162441d4 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -2973,6 +2973,9 @@ final class WorkspacePanelGitBranchTests: XCTestCase { } XCTAssertEqual(workspace.panels.count, 1) +#if DEBUG + let baselineFocusReconcileDuringDetach = workspace.debugFocusReconcileScheduledDuringDetachCount +#endif guard let detached = workspace.detachSurface(panelId: panelId) else { XCTFail("Expected detach of last surface to succeed") @@ -2987,11 +2990,55 @@ final class WorkspacePanelGitBranchTests: XCTestCase { XCTAssertNil(workspace.surfaceIdFromPanelId(panelId)) XCTAssertEqual(workspace.bonsplitController.tabs(inPane: paneId).count, 0) + drainMainQueue() + drainMainQueue() +#if DEBUG + XCTAssertEqual( + workspace.debugFocusReconcileScheduledDuringDetachCount, + baselineFocusReconcileDuringDetach, + "Detaching during cross-workspace moves should not schedule delayed source focus reconciliation" + ) +#endif + let restoredPanelId = workspace.attachDetachedSurface(detached, inPane: paneId, focus: false) XCTAssertEqual(restoredPanelId, panelId) XCTAssertEqual(workspace.panels.count, 1) } + func testDetachSurfaceWithRemainingPanelsSkipsDelayedFocusReconcile() { + let workspace = Workspace() + guard let originalPanelId = workspace.focusedPanelId, + let movedPanel = workspace.newTerminalSplit(from: originalPanelId, orientation: .horizontal) else { + XCTFail("Expected two panels before detach") + return + } + + drainMainQueue() + drainMainQueue() +#if DEBUG + let baselineFocusReconcileDuringDetach = workspace.debugFocusReconcileScheduledDuringDetachCount +#endif + + guard let detached = workspace.detachSurface(panelId: movedPanel.id) else { + XCTFail("Expected detach to succeed") + return + } + + XCTAssertEqual(detached.panelId, movedPanel.id) + XCTAssertEqual(workspace.panels.count, 1, "Expected source workspace to retain only the surviving panel") + XCTAssertNotNil(workspace.panels[originalPanelId], "Expected the original panel to remain after detach") + + drainMainQueue() + drainMainQueue() +#if DEBUG + XCTAssertEqual( + workspace.debugFocusReconcileScheduledDuringDetachCount, + baselineFocusReconcileDuringDetach, + "Detaching into another workspace should not enqueue delayed source focus reconciliation" + ) +#endif + } + func testBrowserSplitWithFocusFalseRecoversFromDelayedStaleSelection() { let workspace = Workspace() guard let originalFocusedPanelId = workspace.focusedPanelId else { From b059d0721c36f1cc5b9564a98eb5f6cdd03c4223 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:44:53 -0800 Subject: [PATCH 193/214] Reassert destination focus after cross-window tab moves --- Sources/AppDelegate.swift | 45 ++++++++++++++++++++++++++++++++++++++- Sources/TabManager.swift | 9 ++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 91dd96fb..cc798ff7 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1977,10 +1977,20 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent ) if focus { - if focusWindow, let destinationWindowId = windowId(for: destinationManager) { + let destinationWindowId = focusWindow ? windowId(for: destinationManager) : nil + if let destinationWindowId { _ = focusMainWindow(windowId: destinationWindowId) } destinationManager.focusTab(targetWorkspaceId, surfaceId: panelId, suppressFlash: true) + if let destinationWindowId { + reassertCrossWindowSurfaceMoveFocusIfNeeded( + destinationWindowId: destinationWindowId, + sourceWindowId: source.windowId, + destinationWorkspaceId: targetWorkspaceId, + destinationPanelId: panelId, + destinationManager: destinationManager + ) + } } return true @@ -2233,6 +2243,39 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } } + private func reassertCrossWindowSurfaceMoveFocusIfNeeded( + destinationWindowId: UUID, + sourceWindowId: UUID, + destinationWorkspaceId: UUID, + destinationPanelId: UUID, + destinationManager: TabManager + ) { + let reassert: () -> Void = { [weak self, weak destinationManager] in + guard let self, let destinationManager else { return } + guard let workspace = destinationManager.tabs.first(where: { $0.id == destinationWorkspaceId }), + workspace.panels[destinationPanelId] != nil else { + return + } + guard let destinationWindow = self.mainWindow(for: destinationWindowId) else { return } + guard let keyWindow = NSApp.keyWindow, + let keyWindowId = self.mainWindowId(for: keyWindow), + keyWindowId == sourceWindowId, + keyWindow !== destinationWindow else { + return + } + + self.bringToFront(destinationWindow) + destinationManager.focusTab( + destinationWorkspaceId, + surfaceId: destinationPanelId, + suppressFlash: true + ) + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05, execute: reassert) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.16, execute: reassert) + } + private func windowForMainWindowId(_ windowId: UUID) -> NSWindow? { if let ctx = mainWindowContexts.values.first(where: { $0.windowId == windowId }), let window = ctx.window { diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 87649b3f..c4f9b57e 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -1527,10 +1527,15 @@ class TabManager: ObservableObject { userInfo: [GhosttyNotificationKey.tabId: tabId] ) - DispatchQueue.main.async { + DispatchQueue.main.async { [weak self] in + guard let self else { return } NSApp.activate(ignoringOtherApps: true) NSApp.unhide(nil) - if let window = NSApp.keyWindow ?? NSApp.windows.first { + if let app = AppDelegate.shared, + let windowId = app.windowId(for: self), + let window = app.mainWindow(for: windowId) { + window.makeKeyAndOrderFront(nil) + } else if let window = NSApp.keyWindow ?? NSApp.windows.first { window.makeKeyAndOrderFront(nil) } } From 05209e7d50b19f9338ac76a69d85cc7a0a661de6 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 19:56:38 -0800 Subject: [PATCH 194/214] Fix stale browser favicon after navigation --- Sources/Panels/BrowserPanel.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 443d1f94..e0f61109 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1695,6 +1695,9 @@ final class BrowserPanel: Panel, ObservableObject { faviconTask?.cancel() faviconTask = nil lastFaviconURLString = nil + // Clear the previous page's favicon so it never persists across navigations. + // The loading spinner covers this gap; didFinish will fetch the new favicon. + faviconPNGData = nil loadingGeneration &+= 1 loadingEndWorkItem?.cancel() loadingEndWorkItem = nil @@ -2683,6 +2686,10 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { NSLog("BrowserPanel navigation failed: %@", error.localizedDescription) + // Treat committed-navigation failures the same as provisional ones so + // stale favicon/title state from the prior page gets cleared. + let failedURL = webView.url?.absoluteString ?? "" + didFailNavigation?(webView, failedURL) } func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { From 04eee73a221bf962123a314a7987d696a1406d16 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 19:56:41 -0800 Subject: [PATCH 195/214] Fix stuck titlebar drag suppression --- Sources/ContentView.swift | 7 +++---- Sources/WindowDragHandleView.swift | 31 +++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 63d03d54..79f17cda 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -7688,7 +7688,6 @@ final class DraggableFolderNSView: NSView, NSDraggingSource { override func hitTest(_ point: NSPoint) -> NSView? { guard bounds.contains(point) else { return nil } - maybeDisableWindowDraggingEarly(trigger: "hitTest") let hit = super.hitTest(point) #if DEBUG let hitDesc = hit.map { String(describing: type(of: $0)) } ?? "nil" @@ -7728,9 +7727,9 @@ final class DraggableFolderNSView: NSView, NSDraggingSource { override func mouseUp(with event: NSEvent) { super.mouseUp(with: event) - if !hasActiveDragSession { - restoreWindowMovableStateIfNeeded() - } + // Always restore suppression on mouse-up; drag-session callbacks can be + // skipped for non-started drags, which would otherwise leave suppression stuck. + restoreWindowMovableStateIfNeeded() } override func rightMouseDown(with event: NSEvent) { diff --git a/Sources/WindowDragHandleView.swift b/Sources/WindowDragHandleView.swift index ebc62a05..e9ce93f4 100644 --- a/Sources/WindowDragHandleView.swift +++ b/Sources/WindowDragHandleView.swift @@ -51,6 +51,16 @@ func isWindowDragSuppressed(window: NSWindow?) -> Bool { windowDragSuppressionDepth(window: window) > 0 } +@discardableResult +func clearWindowDragSuppression(window: NSWindow?) -> Int { + guard let window else { return 0 } + var depth = windowDragSuppressionDepth(window: window) + while depth > 0 { + depth = endWindowDragSuppression(window: window) + } + return depth +} + /// Temporarily enables window movability for explicit drag-handle drags, then /// restores the previous movability state after `body` finishes. @discardableResult @@ -98,13 +108,24 @@ func windowDragHandleShouldTreatTopHitAsPassiveHost(_ view: NSView) -> Bool { /// controls layered in the titlebar (e.g. proxy folder icon) keep their gestures. func windowDragHandleShouldCaptureHit(_ point: NSPoint, in dragHandleView: NSView) -> Bool { if isWindowDragSuppressed(window: dragHandleView.window) { + // Recover from stale suppression if a prior interaction missed cleanup. + // We only keep suppression active while the left mouse button is down. + if (NSEvent.pressedMouseButtons & 0x1) == 0 { + let clearedDepth = clearWindowDragSuppression(window: dragHandleView.window) + #if DEBUG + dlog( + "titlebar.dragHandle.hitTest suppressionRecovered clearedDepth=\(clearedDepth) point=\(windowDragHandleFormatPoint(point))" + ) + #endif + } else { #if DEBUG - let depth = windowDragSuppressionDepth(window: dragHandleView.window) - dlog( - "titlebar.dragHandle.hitTest capture=false reason=suppressed depth=\(depth) point=\(windowDragHandleFormatPoint(point))" - ) + let depth = windowDragSuppressionDepth(window: dragHandleView.window) + dlog( + "titlebar.dragHandle.hitTest capture=false reason=suppressed depth=\(depth) point=\(windowDragHandleFormatPoint(point))" + ) #endif - return false + return false + } } guard dragHandleView.bounds.contains(point) else { From 710ed9b068f336432497aae5f2c16d0aa052d736 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:08:21 -0800 Subject: [PATCH 196/214] Fix Cmd+P/Cmd+Shift+P window routing (#413) * Fix command palette shortcuts to stay window-scoped * Fix cross-window command palette typing focus lock --- Sources/AppDelegate.swift | 22 +++- Sources/ContentView.swift | 56 +++++++- tests_v2/test_command_palette_window_scope.py | 124 +++++++++++++++++- 3 files changed, 191 insertions(+), 11 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index cc798ff7..f3c5e73d 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -2389,6 +2389,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return nil } + private func commandPaletteWindowForShortcutEvent(_ event: NSEvent) -> NSWindow? { + if let scopedWindow = mainWindowForShortcutEvent(event) { + return scopedWindow + } + return activeCommandPaletteWindow() + } + private func contextForMainWindow(_ window: NSWindow?) -> MainWindowContext? { guard let window, isMainTerminalWindow(window) else { return nil } return mainWindowContexts[ObjectIdentifier(window)] @@ -4097,13 +4104,18 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent } let normalizedFlags = flags.subtracting([.numericPad, .function, .capsLock]) + let commandPaletteTargetWindow = commandPaletteWindowForShortcutEvent(event) + let commandPaletteVisibleInTargetWindow = commandPaletteTargetWindow.map { + isCommandPaletteVisible(for: $0) + } ?? false if let delta = commandPaletteSelectionDeltaForKeyboardNavigation( flags: event.modifierFlags, chars: chars, keyCode: event.keyCode ), - let paletteWindow = activeCommandPaletteWindow() { + commandPaletteVisibleInTargetWindow, + let paletteWindow = commandPaletteTargetWindow { NotificationCenter.default.post( name: .commandPaletteMoveSelection, object: paletteWindow, @@ -4114,20 +4126,20 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent let isCommandP = normalizedFlags == [.command] && (chars == "p" || event.keyCode == 35) if isCommandP { - let targetWindow = activeCommandPaletteWindow() ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow + let targetWindow = commandPaletteTargetWindow ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow NotificationCenter.default.post(name: .commandPaletteSwitcherRequested, object: targetWindow) return true } let isCommandShiftP = normalizedFlags == [.command, .shift] && (chars == "p" || event.keyCode == 35) if isCommandShiftP { - let targetWindow = activeCommandPaletteWindow() ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow + let targetWindow = commandPaletteTargetWindow ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow NotificationCenter.default.post(name: .commandPaletteRequested, object: targetWindow) return true } if shouldConsumeShortcutWhileCommandPaletteVisible( - isCommandPaletteVisible: activeCommandPaletteWindow() != nil, + isCommandPaletteVisible: commandPaletteVisibleInTargetWindow, normalizedFlags: normalizedFlags, chars: chars, keyCode: event.keyCode @@ -4354,7 +4366,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent if tabManager?.focusedBrowserPanel != nil { return false } - let targetWindow = activeCommandPaletteWindow() ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow + let targetWindow = commandPaletteTargetWindow ?? event.window ?? NSApp.keyWindow ?? NSApp.mainWindow NotificationCenter.default.post(name: .commandPaletteRenameTabRequested, object: targetWindow) return true } diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 79f17cda..d2010f74 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -760,6 +760,9 @@ private final class WindowCommandPaletteOverlayController: NSObject { private weak var installedThemeFrame: NSView? private var focusLockTimer: DispatchSourceTimer? private var scheduledFocusWorkItem: DispatchWorkItem? + private var isPaletteVisible = false + private var windowDidBecomeKeyObserver: NSObjectProtocol? + private var windowDidResignKeyObserver: NSObjectProtocol? init(window: NSWindow) { self.window = window @@ -782,6 +785,7 @@ private final class WindowCommandPaletteOverlayController: NSObject { hostingView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), ]) _ = ensureInstalled() + installWindowKeyObservers() } @discardableResult @@ -913,6 +917,52 @@ private final class WindowCommandPaletteOverlayController: NSObject { } } + private func installWindowKeyObservers() { + guard let window else { return } + windowDidBecomeKeyObserver = NotificationCenter.default.addObserver( + forName: NSWindow.didBecomeKeyNotification, + object: window, + queue: .main + ) { [weak self] _ in + Task { @MainActor [weak self] in + self?.updateFocusLockForWindowState() + } + } + windowDidResignKeyObserver = NotificationCenter.default.addObserver( + forName: NSWindow.didResignKeyNotification, + object: window, + queue: .main + ) { [weak self] _ in + Task { @MainActor [weak self] in + self?.updateFocusLockForWindowState() + } + } + } + + private func updateFocusLockForWindowState() { + guard let window else { + stopFocusLockTimer() + return + } + guard isPaletteVisible else { + stopFocusLockTimer() + return + } + + guard window.isKeyWindow else { + stopFocusLockTimer() + if isPaletteResponder(window.firstResponder) { + _ = window.makeFirstResponder(nil) + } + return + } + + startFocusLockTimer() + if !isPaletteTextInputFirstResponder(window.firstResponder) { + scheduleFocusIntoPalette(retries: 8) + } + } + private func startFocusLockTimer() { guard focusLockTimer == nil else { return } let timer = DispatchSource.makeTimerSource(queue: .main) @@ -959,6 +1009,7 @@ private final class WindowCommandPaletteOverlayController: NSObject { func update(rootView: AnyView, isVisible: Bool) { guard ensureInstalled() else { return } + isPaletteVisible = isVisible if isVisible { hostingView.rootView = rootView containerView.capturesMouseEvents = true @@ -967,10 +1018,7 @@ private final class WindowCommandPaletteOverlayController: NSObject { if let themeFrame = installedThemeFrame, themeFrame.subviews.last !== containerView { themeFrame.addSubview(containerView, positioned: .above, relativeTo: nil) } - startFocusLockTimer() - if let window, !isPaletteTextInputFirstResponder(window.firstResponder) { - scheduleFocusIntoPalette(retries: 8) - } + updateFocusLockForWindowState() } else { stopFocusLockTimer() if let window, isPaletteResponder(window.firstResponder) { diff --git a/tests_v2/test_command_palette_window_scope.py b/tests_v2/test_command_palette_window_scope.py index 63236c34..e6cfeab7 100644 --- a/tests_v2/test_command_palette_window_scope.py +++ b/tests_v2/test_command_palette_window_scope.py @@ -32,6 +32,10 @@ def _palette_visible(client: cmux, window_id: str) -> bool: return bool(res.get("visible")) +def _palette_results(client: cmux, window_id: str, limit: int = 20) -> dict: + return client.command_palette_results(window_id=window_id, limit=limit) + + def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: if _palette_visible(client, window_id) == visible: return @@ -43,6 +47,116 @@ def _set_palette_visible(client: cmux, window_id: str, visible: bool) -> None: ) +def _focus_window(client: cmux, window_id: str) -> None: + client.focus_window(window_id) + client.activate_app() + _wait_until( + lambda: client.current_window().lower() == window_id.lower(), + timeout_s=3.0, + message=f"failed to focus window {window_id}", + ) + time.sleep(0.15) + + +def _assert_shortcut_window_scoped(client: cmux, shortcut: str, w1: str, w2: str) -> None: + _set_palette_visible(client, w1, False) + _set_palette_visible(client, w2, False) + + _focus_window(client, w1) + client.simulate_shortcut(shortcut) + _wait_until( + lambda: _palette_visible(client, w1), + timeout_s=3.0, + message=f"{shortcut} did not open palette in window1", + ) + if _palette_visible(client, w2): + raise cmuxError(f"{shortcut} in window1 incorrectly opened palette in window2") + + _focus_window(client, w2) + client.simulate_shortcut(shortcut) + _wait_until( + lambda: _palette_visible(client, w2), + timeout_s=3.0, + message=f"{shortcut} did not open palette in window2", + ) + if not _palette_visible(client, w1): + raise cmuxError( + f"{shortcut} in window2 incorrectly toggled window1 palette off " + "(cross-window routing regression)" + ) + + client.simulate_shortcut(shortcut) + _wait_until( + lambda: not _palette_visible(client, w2), + timeout_s=3.0, + message=f"second {shortcut} did not close palette in window2", + ) + if not _palette_visible(client, w1): + raise cmuxError( + f"second {shortcut} in window2 incorrectly changed window1 palette visibility" + ) + + _focus_window(client, w1) + client.simulate_shortcut(shortcut) + _wait_until( + lambda: not _palette_visible(client, w1), + timeout_s=3.0, + message=f"second {shortcut} did not close palette in window1", + ) + + +def _assert_cross_window_typing_after_mixed_shortcuts(client: cmux, w1: str, w2: str) -> None: + _set_palette_visible(client, w1, False) + _set_palette_visible(client, w2, False) + + _focus_window(client, w1) + client.simulate_shortcut("cmd+shift+p") + _wait_until( + lambda: _palette_visible(client, w1), + timeout_s=3.0, + message="cmd+shift+p did not open palette in window1", + ) + _wait_until( + lambda: str(_palette_results(client, w1).get("mode") or "") == "commands", + timeout_s=3.0, + message="window1 palette did not enter commands mode", + ) + window1_query_before = str(_palette_results(client, w1).get("query") or "") + + _focus_window(client, w2) + client.simulate_shortcut("cmd+p") + _wait_until( + lambda: _palette_visible(client, w2), + timeout_s=3.0, + message="cmd+p did not open palette in window2", + ) + _wait_until( + lambda: str(_palette_results(client, w2).get("mode") or "") == "switcher", + timeout_s=3.0, + message="window2 palette did not enter switcher mode", + ) + + typed = "" + for ch in "crosswindow": + typed += ch + client.simulate_type(ch) + _wait_until( + lambda expected=typed: str(_palette_results(client, w2).get("query") or "").lower() == expected, + timeout_s=1.8, + message=( + "typing into window2 palette did not accumulate query text " + f"(expected {typed!r})" + ), + ) + + window1_query_now = str(_palette_results(client, w1).get("query") or "") + if window1_query_now != window1_query_before: + raise cmuxError( + "typing in window2 changed window1 command-palette query " + f"(before={window1_query_before!r}, now={window1_query_now!r})" + ) + + def main() -> int: with cmux(SOCKET_PATH) as client: client.activate_app() @@ -51,8 +165,8 @@ def main() -> int: w2 = client.new_window() time.sleep(0.25) - ws1 = client.new_workspace(window_id=w1) - ws2 = client.new_workspace(window_id=w2) + _ = client.new_workspace(window_id=w1) + _ = client.new_workspace(window_id=w2) time.sleep(0.25) _set_palette_visible(client, w1, False) _set_palette_visible(client, w2, False) @@ -91,6 +205,12 @@ def main() -> int: message="window2 command palette did not close", ) + # Reproduce keyboard-shortcut window-scoping path: + # opening from window2 must not jump back and toggle window1. + _assert_shortcut_window_scoped(client, "cmd+shift+p", w1, w2) + _assert_shortcut_window_scoped(client, "cmd+p", w1, w2) + _assert_cross_window_typing_after_mixed_shortcuts(client, w1, w2) + print("PASS: command palette is scoped to active window") return 0 From 87f6231561597e0990cc588c14993e9203643ef5 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:09:44 -0800 Subject: [PATCH 197/214] Add Read the Docs link below bottom CTA on homepage (#411) * Add "Read the Docs" link below bottom CTA on homepage * Increase top padding on Read the Docs link * Reduce docs horizontal padding on mobile * Align docs content with header on mobile, increase top padding * Make sticky header fully opaque with subtle bottom border * Fix sticky header on mobile by containing horizontal overflow in content area Wide content (hierarchy diagrams, code blocks) was causing horizontal page scroll, which breaks position:sticky on mobile browsers. Added overflow-x:hidden to the main content area (below the header in DOM) and overflow-x:auto to docs pre blocks so they scroll internally. * Remove bottom border from sticky header --- web/app/components/site-header.tsx | 2 +- web/app/docs/docs-nav.tsx | 6 +++--- web/app/globals.css | 5 +++++ web/app/page.tsx | 8 ++++++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/web/app/components/site-header.tsx b/web/app/components/site-header.tsx index ad7e6202..bc4da923 100644 --- a/web/app/components/site-header.tsx +++ b/web/app/components/site-header.tsx @@ -22,7 +22,7 @@ export function SiteHeader({ return ( <> - <header className="sticky top-0 z-30 w-full bg-background/80 backdrop-blur-sm"> + <header className="sticky top-0 z-30 w-full bg-background"> <div className="w-full max-w-6xl mx-auto flex items-center px-6 h-12"> {/* Left: logo + section */} <div className="flex flex-1 items-center gap-3 min-w-0"> diff --git a/web/app/docs/docs-nav.tsx b/web/app/docs/docs-nav.tsx index 30827c7d..243fac73 100644 --- a/web/app/docs/docs-nav.tsx +++ b/web/app/docs/docs-nav.tsx @@ -11,7 +11,7 @@ export function DocsNav({ children }: { children: React.ReactNode }) { const { open, toggle, close, drawerRef, buttonRef } = useMobileDrawer(); return ( - <div className="max-w-6xl mx-auto flex px-4"> + <div className="max-w-6xl mx-auto flex px-0 md:px-4"> {/* Mobile menu button */} <button ref={buttonRef} @@ -62,8 +62,8 @@ export function DocsNav({ children }: { children: React.ReactNode }) { </aside> {/* Content */} - <main className="flex-1 min-w-0"> - <div className="max-w-3xl px-6 pb-10 ml-0" data-dev="docs-content" style={{ paddingTop: 8 }}> + <main className="flex-1 min-w-0 overflow-x-hidden"> + <div className="max-w-full px-6 pb-10 ml-0" data-dev="docs-content" style={{ paddingTop: 16 }}> <div className="docs-content text-[15px]">{children}</div> <DocsPager /> </div> diff --git a/web/app/globals.css b/web/app/globals.css index a80da967..a10df622 100644 --- a/web/app/globals.css +++ b/web/app/globals.css @@ -159,6 +159,11 @@ body { box-shadow: 0 1px 0 rgba(0, 0, 0, 0.4); } +.docs-content pre { + overflow-x: auto; + max-width: 100%; +} + .docs-content pre code { background: none; padding: 0; diff --git a/web/app/page.tsx b/web/app/page.tsx index eb78a272..a15bc106 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -256,6 +256,14 @@ export default function Home() { <DownloadButton location="bottom" /> <GitHubButton /> </div> + <div className="flex justify-center mt-6"> + <a + href="/docs" + className="text-sm text-muted hover:text-foreground transition-colors underline underline-offset-2 decoration-border hover:decoration-foreground" + > + Read the Docs + </a> + </div> </main> From 59446f923bb1dbdff326b47babf78f4a1de1f680 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:19:45 -0800 Subject: [PATCH 198/214] Fix ASCII diagram font rendering on concepts page (#420) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix ASCII diagram rendering: use system mono font for box-drawing chars Geist Mono renders box-drawing characters (┌─┐│└┘) at double width, breaking alignment in the concepts page diagram. Use system monospace fonts (Menlo, Monaco, Consolas) for ascii-variant code blocks, which handle these characters at correct single width. * Fix CSS specificity: code element was overriding pre font-family .docs-content code sets font-family to Geist Mono, which overrides the system mono font set on the parent pre element. Geist Mono is loaded with Latin subset only, lacking box-drawing glyphs (U+2500-257F), so browsers fall back to CJK-aware fonts that render them double-width. Fix: add font-family: inherit to .docs-content pre code so code elements inside pre blocks inherit the correct font from their parent. --- web/app/components/code-block.tsx | 18 ++++++++++++++---- web/app/globals.css | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/web/app/components/code-block.tsx b/web/app/components/code-block.tsx index e915e9d6..e31537d6 100644 --- a/web/app/components/code-block.tsx +++ b/web/app/components/code-block.tsx @@ -48,11 +48,21 @@ export async function CodeBlock({ </div> )} <pre - className={`bg-code-bg border border-border px-4 py-3 overflow-x-auto text-[13px] ${lineHeightClass} font-mono ${ - title ? "rounded-b-lg" : "rounded-lg" - }`} + className={`bg-code-bg border border-border px-4 py-3 overflow-x-auto text-[13px] ${lineHeightClass} ${ + variant === "ascii" ? "" : "font-mono " + }${title ? "rounded-b-lg" : "rounded-lg"}`} + style={ + variant === "ascii" + ? { + fontFamily: + "Menlo, Monaco, Consolas, 'Courier New', monospace", + } + : undefined + } > - <code>{children}</code> + <code style={variant === "ascii" ? { fontFamily: "inherit" } : undefined}> + {children} + </code> </pre> </div> ); diff --git a/web/app/globals.css b/web/app/globals.css index a10df622..0ecea6bb 100644 --- a/web/app/globals.css +++ b/web/app/globals.css @@ -168,6 +168,7 @@ body { background: none; padding: 0; font-size: 1em; + font-family: inherit; } /* Shiki dual theme */ From 7a75988c5b8edb55c5233929bbd0b2d359e09449 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 20:45:25 -0800 Subject: [PATCH 199/214] Fix double-click titlebar zoom not working on browser panel side The browser portal's hit-test was intercepting clicks in the titlebar region, preventing double-click-to-zoom from reaching the window. Three fixes: - BrowserWindowPortal: pass through hits landing in the native titlebar - WindowDragHandleView: only let titlebar-overlay views block capture, not underlay browser content; respect AppleActionOnDoubleClick pref - ContentView: use shared performStandardTitlebarDoubleClick() helper Closes https://github.com/manaflow-ai/cmux/issues/422 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --- Sources/BrowserWindowPortal.swift | 11 +++++++ Sources/ContentView.swift | 11 +++---- Sources/WindowDragHandleView.swift | 50 +++++++++++++++++++++++++++--- 3 files changed, 61 insertions(+), 11 deletions(-) diff --git a/Sources/BrowserWindowPortal.swift b/Sources/BrowserWindowPortal.swift index 2e82cb66..448f0e46 100644 --- a/Sources/BrowserWindowPortal.swift +++ b/Sources/BrowserWindowPortal.swift @@ -117,6 +117,9 @@ final class WindowBrowserHostView: NSView { override func hitTest(_ point: NSPoint) -> NSView? { updateDividerCursor(at: point) + if shouldPassThroughToTitlebar(at: point) { + return nil + } if shouldPassThroughToSidebarResizer(at: point) { return nil } @@ -127,6 +130,14 @@ final class WindowBrowserHostView: NSView { return hitView === self ? nil : hitView } + private func shouldPassThroughToTitlebar(at point: NSPoint) -> Bool { + guard let window else { return false } + // Window-level portal hosts sit above SwiftUI content. Never intercept + // hits that land in the native titlebar region. + let windowPoint = convert(point, to: nil) + return windowPoint.y >= (window.contentLayoutRect.maxY - 0.5) + } + private func shouldPassThroughToSidebarResizer(at point: NSPoint) -> Bool { // Browser portal host sits above SwiftUI content. Allow pointer/mouse events // to reach the SwiftUI sidebar divider resizer zone. diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index d2010f74..99dfaf88 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -5284,8 +5284,8 @@ struct VerticalTabsSidebar: View { .allowsHitTesting(false) } .overlay(alignment: .top) { - // Double-click the sidebar title-bar area to zoom the - // window, matching the panel top-bar behaviour. + // Double-click the sidebar title-bar area to trigger the + // standard macOS titlebar action (zoom/minimize). DoubleClickZoomView() .frame(height: trafficLightPadding) } @@ -7535,11 +7535,10 @@ private struct DoubleClickZoomView: NSViewRepresentable { override var mouseDownCanMoveWindow: Bool { true } override func hitTest(_ point: NSPoint) -> NSView? { self } override func mouseDown(with event: NSEvent) { - if event.clickCount == 2 { - window?.zoom(nil) - } else { - super.mouseDown(with: event) + if event.clickCount == 2, performStandardTitlebarDoubleClick(window: window) { + return } + super.mouseDown(with: event) } } } diff --git a/Sources/WindowDragHandleView.swift b/Sources/WindowDragHandleView.swift index e9ce93f4..a468c088 100644 --- a/Sources/WindowDragHandleView.swift +++ b/Sources/WindowDragHandleView.swift @@ -6,6 +6,40 @@ private func windowDragHandleFormatPoint(_ point: NSPoint) -> String { String(format: "(%.1f,%.1f)", point.x, point.y) } +/// Runs the same action macOS titlebars use for double-click: +/// zoom by default, or minimize when the user preference is set. +@discardableResult +func performStandardTitlebarDoubleClick(window: NSWindow?) -> Bool { + guard let window else { return false } + + let globalDefaults = UserDefaults.standard.persistentDomain(forName: UserDefaults.globalDomain) ?? [:] + if let action = (globalDefaults["AppleActionOnDoubleClick"] as? String)? + .trimmingCharacters(in: .whitespacesAndNewlines) + .lowercased() { + switch action { + case "minimize": + window.miniaturize(nil) + return true + case "none": + return false + case "maximize", "zoom": + window.zoom(nil) + return true + default: + break + } + } + + if let miniaturizeOnDoubleClick = globalDefaults["AppleMiniaturizeOnDoubleClick"] as? Bool, + miniaturizeOnDoubleClick { + window.miniaturize(nil) + return true + } + + window.zoom(nil) + return true +} + private var windowDragSuppressionDepthKey: UInt8 = 0 func beginWindowDragSuppression(window: NSWindow?) -> Int? { @@ -154,16 +188,20 @@ func windowDragHandleShouldCaptureHit(_ point: NSPoint, in dragHandleView: NSVie if let topHit { let ownsTopHit = topHit === dragHandleView || topHit.isDescendant(of: dragHandleView) + let topHitBelongsToTitlebarOverlay = topHit === superview || topHit.isDescendant(of: superview) let isPassiveHostHit = windowDragHandleShouldTreatTopHitAsPassiveHost(topHit) #if DEBUG dlog( - "titlebar.dragHandle.hitTest capture=\(ownsTopHit) strategy=windowTopHit point=\(windowDragHandleFormatPoint(point)) top=\(type(of: topHit)) passiveHost=\(isPassiveHostHit)" + "titlebar.dragHandle.hitTest capture=\(ownsTopHit) strategy=windowTopHit point=\(windowDragHandleFormatPoint(point)) top=\(type(of: topHit)) inTitlebarOverlay=\(topHitBelongsToTitlebarOverlay) passiveHost=\(isPassiveHostHit)" ) #endif if ownsTopHit { return true } - if !isPassiveHostHit { + // Underlay content can transiently overlap titlebar space (notably browser + // chrome/webview layers). Only let top-hits block capture when they belong + // to this titlebar overlay stack. + if topHitBelongsToTitlebarOverlay && !isPassiveHostHit { return false } } @@ -238,11 +276,13 @@ struct WindowDragHandleView: NSViewRepresentable { #endif if event.clickCount >= 2 { - window?.zoom(nil) + let handled = performStandardTitlebarDoubleClick(window: window) #if DEBUG - dlog("titlebar.dragHandle.mouseDownDoubleClick zoom=1") + dlog("titlebar.dragHandle.mouseDownDoubleClick handled=\(handled ? 1 : 0)") #endif - return + if handled { + return + } } guard !isWindowDragSuppressed(window: window) else { From afbfb5a117c94a02afca0004ef6d2666c0899cf1 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:09:36 -0800 Subject: [PATCH 200/214] Use native WebKit middle-click handling for browser links (#416) * Add middle-click debug logging for browser links * Handle browser middle-click via native WebKit actions * Fix flaky middle-click new-tab detection in browser --- Sources/Panels/BrowserPanel.swift | 165 ++++++++++++++++-- Sources/Panels/BrowserPanelView.swift | 8 - Sources/Panels/CmuxWebView.swift | 74 ++++++-- Sources/TabManager.swift | 1 - cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 108 ++++++++++++ 5 files changed, 314 insertions(+), 42 deletions(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index e0f61109..71f297bb 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1956,15 +1956,43 @@ extension BrowserPanel { /// Open a link in a new browser surface in the same pane func openLinkInNewTab(url: URL, bypassInsecureHTTPHostOnce: String? = nil) { - guard let tabManager = AppDelegate.shared?.tabManager, - let workspace = tabManager.tabs.first(where: { $0.id == workspaceId }), - let paneId = workspace.paneId(forPanelId: id) else { return } +#if DEBUG + dlog( + "browser.newTab.open.begin panel=\(id.uuidString.prefix(5)) " + + "workspace=\(workspaceId.uuidString.prefix(5)) url=\(url.absoluteString) " + + "bypass=\(bypassInsecureHTTPHostOnce ?? "nil")" + ) +#endif + guard let tabManager = AppDelegate.shared?.tabManager else { +#if DEBUG + dlog("browser.newTab.open.abort panel=\(id.uuidString.prefix(5)) reason=missingTabManager") +#endif + return + } + guard let workspace = tabManager.tabs.first(where: { $0.id == workspaceId }) else { +#if DEBUG + dlog("browser.newTab.open.abort panel=\(id.uuidString.prefix(5)) reason=workspaceMissing") +#endif + return + } + guard let paneId = workspace.paneId(forPanelId: id) else { +#if DEBUG + dlog("browser.newTab.open.abort panel=\(id.uuidString.prefix(5)) reason=paneMissing") +#endif + return + } workspace.newBrowserSurface( inPane: paneId, url: url, focus: true, bypassInsecureHTTPHostOnce: bypassInsecureHTTPHostOnce ) +#if DEBUG + dlog( + "browser.newTab.open.done panel=\(id.uuidString.prefix(5)) " + + "workspace=\(workspace.id.uuidString.prefix(5)) pane=\(paneId.id.uuidString.prefix(5))" + ) +#endif } /// Reload the current page @@ -2664,6 +2692,39 @@ private class BrowserDownloadDelegate: NSObject, WKDownloadDelegate { // MARK: - Navigation Delegate +func browserNavigationShouldOpenInNewTab( + navigationType: WKNavigationType, + modifierFlags: NSEvent.ModifierFlags, + buttonNumber: Int, + hasRecentMiddleClickIntent: Bool = false, + currentEventType: NSEvent.EventType? = NSApp.currentEvent?.type, + currentEventButtonNumber: Int? = NSApp.currentEvent?.buttonNumber +) -> Bool { + guard navigationType == .linkActivated || navigationType == .other else { + return false + } + + if modifierFlags.contains(.command) { + return true + } + if buttonNumber == 2 { + return true + } + // In some WebKit paths, middle-click arrives as buttonNumber=4. + // Recover intent when we just observed a local middle-click. + if buttonNumber == 4, hasRecentMiddleClickIntent { + return true + } + + // WebKit can omit buttonNumber for middle-click link activations. + if let currentEventType, + (currentEventType == .otherMouseDown || currentEventType == .otherMouseUp), + currentEventButtonNumber == 2 { + return true + } + return false +} + private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { var didFinish: ((WKWebView) -> Void)? var didFailNavigation: ((WKWebView, String) -> Void)? @@ -2802,16 +2863,41 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void ) { + let hasRecentMiddleClickIntent = CmuxWebView.hasRecentMiddleClickIntent(for: webView) + let shouldOpenInNewTab = browserNavigationShouldOpenInNewTab( + navigationType: navigationAction.navigationType, + modifierFlags: navigationAction.modifierFlags, + buttonNumber: navigationAction.buttonNumber, + hasRecentMiddleClickIntent: hasRecentMiddleClickIntent + ) +#if DEBUG + let currentEventType = NSApp.currentEvent.map { String(describing: $0.type) } ?? "nil" + let currentEventButton = NSApp.currentEvent.map { String($0.buttonNumber) } ?? "nil" + let navType = String(describing: navigationAction.navigationType) + dlog( + "browser.nav.decidePolicy navType=\(navType) button=\(navigationAction.buttonNumber) " + + "mods=\(navigationAction.modifierFlags.rawValue) targetNil=\(navigationAction.targetFrame == nil ? 1 : 0) " + + "eventType=\(currentEventType) eventButton=\(currentEventButton) " + + "recentMiddleIntent=\(hasRecentMiddleClickIntent ? 1 : 0) " + + "openInNewTab=\(shouldOpenInNewTab ? 1 : 0)" + ) +#endif + if let url = navigationAction.request.url, navigationAction.targetFrame?.isMainFrame != false, shouldBlockInsecureHTTPNavigation?(url) == true { let intent: BrowserInsecureHTTPNavigationIntent - if navigationAction.navigationType == .linkActivated, - navigationAction.modifierFlags.contains(.command) { + if shouldOpenInNewTab { intent = .newTab } else { intent = .currentTab } +#if DEBUG + dlog( + "browser.nav.decidePolicy.action kind=blockedInsecure intent=\(intent == .newTab ? "newTab" : "currentTab") " + + "url=\(url.absoluteString)" + ) +#endif handleBlockedInsecureHTTPNavigation?(navigationAction.request, intent) decisionHandler(.cancel) return @@ -2833,23 +2919,33 @@ private class BrowserNavigationDelegate: NSObject, WKNavigationDelegate { return } - // target=_blank or window.open() — navigate in the current webview - if navigationAction.targetFrame == nil, - navigationAction.request.url != nil { - webView.load(navigationAction.request) - decisionHandler(.cancel) - return - } - - // Cmd+click on a regular link — open in a new tab - if navigationAction.navigationType == .linkActivated, - navigationAction.modifierFlags.contains(.command), + // Cmd+click and middle-click on regular links should always open in a new tab. + if shouldOpenInNewTab, let url = navigationAction.request.url { +#if DEBUG + dlog("browser.nav.decidePolicy.action kind=openInNewTab url=\(url.absoluteString)") +#endif openInNewTab?(url) decisionHandler(.cancel) return } + // target=_blank or window.open() without explicit new-tab intent — navigate in-place. + if navigationAction.targetFrame == nil, + navigationAction.request.url != nil { +#if DEBUG + let targetURL = navigationAction.request.url?.absoluteString ?? "nil" + dlog("browser.nav.decidePolicy.action kind=loadInPlaceFromNilTarget url=\(targetURL)") +#endif + webView.load(navigationAction.request) + decisionHandler(.cancel) + return + } + +#if DEBUG + let targetURL = navigationAction.request.url?.absoluteString ?? "nil" + dlog("browser.nav.decidePolicy.action kind=allow url=\(targetURL)") +#endif decisionHandler(.allow) } @@ -2948,13 +3044,32 @@ private class BrowserUIDelegate: NSObject, WKUIDelegate { } /// Returning nil tells WebKit not to open a new window. - /// Cmd+click opens in a new tab; regular target=_blank navigates in-place. + /// Cmd+click and middle-click open in a new tab; regular target=_blank navigates in-place. func webView( _ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures ) -> WKWebView? { + let hasRecentMiddleClickIntent = CmuxWebView.hasRecentMiddleClickIntent(for: webView) + let shouldOpenInNewTab = browserNavigationShouldOpenInNewTab( + navigationType: navigationAction.navigationType, + modifierFlags: navigationAction.modifierFlags, + buttonNumber: navigationAction.buttonNumber, + hasRecentMiddleClickIntent: hasRecentMiddleClickIntent + ) +#if DEBUG + let currentEventType = NSApp.currentEvent.map { String(describing: $0.type) } ?? "nil" + let currentEventButton = NSApp.currentEvent.map { String($0.buttonNumber) } ?? "nil" + let navType = String(describing: navigationAction.navigationType) + dlog( + "browser.nav.createWebView navType=\(navType) button=\(navigationAction.buttonNumber) " + + "mods=\(navigationAction.modifierFlags.rawValue) targetNil=\(navigationAction.targetFrame == nil ? 1 : 0) " + + "eventType=\(currentEventType) eventButton=\(currentEventButton) " + + "recentMiddleIntent=\(hasRecentMiddleClickIntent ? 1 : 0) " + + "openInNewTab=\(shouldOpenInNewTab ? 1 : 0)" + ) +#endif if let url = navigationAction.request.url { if browserShouldOpenURLExternally(url) { let opened = NSWorkspace.shared.open(url) @@ -2968,11 +3083,23 @@ private class BrowserUIDelegate: NSObject, WKUIDelegate { } if let requestNavigation { let intent: BrowserInsecureHTTPNavigationIntent = - navigationAction.modifierFlags.contains(.command) ? .newTab : .currentTab + shouldOpenInNewTab ? .newTab : .currentTab +#if DEBUG + dlog( + "browser.nav.createWebView.action kind=requestNavigation intent=\(intent == .newTab ? "newTab" : "currentTab") " + + "url=\(url.absoluteString)" + ) +#endif requestNavigation(navigationAction.request, intent) - } else if navigationAction.modifierFlags.contains(.command) { + } else if shouldOpenInNewTab { +#if DEBUG + dlog("browser.nav.createWebView.action kind=openInNewTab url=\(url.absoluteString)") +#endif openInNewTab?(url) } else { +#if DEBUG + dlog("browser.nav.createWebView.action kind=loadInPlace url=\(url.absoluteString)") +#endif webView.load(navigationAction.request) } } diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 71518994..82069f74 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -332,14 +332,6 @@ struct BrowserPanelView: View { #endif onRequestPanelFocus() } - .onReceive(NotificationCenter.default.publisher(for: .webViewMiddleClickedLink).filter { [weak panel] note in - guard let webView = note.object as? CmuxWebView else { return false } - return webView === panel?.webView - }) { note in - if let url = note.userInfo?["url"] as? URL { - panel.openLinkInNewTab(url: url) - } - } .onAppear { UserDefaults.standard.register(defaults: [ BrowserSearchSettings.searchEngineKey: BrowserSearchSettings.defaultSearchEngine.rawValue, diff --git a/Sources/Panels/CmuxWebView.swift b/Sources/Panels/CmuxWebView.swift index 8f2a3a28..68a13282 100644 --- a/Sources/Panels/CmuxWebView.swift +++ b/Sources/Panels/CmuxWebView.swift @@ -8,6 +8,37 @@ import WebKit /// key equivalents first so app-level shortcuts continue to work when WebKit is /// the first responder. final class CmuxWebView: WKWebView { + // Some sites/WebKit paths report middle-click link activations as + // WKNavigationAction.buttonNumber=4 instead of 2. Track a recent local + // middle-click so navigation delegates can recover intent reliably. + private struct MiddleClickIntent { + let webViewID: ObjectIdentifier + let uptime: TimeInterval + } + + private static var lastMiddleClickIntent: MiddleClickIntent? + private static let middleClickIntentMaxAge: TimeInterval = 0.8 + + static func hasRecentMiddleClickIntent(for webView: WKWebView) -> Bool { + guard let webView = webView as? CmuxWebView else { return false } + guard let intent = lastMiddleClickIntent else { return false } + + let age = ProcessInfo.processInfo.systemUptime - intent.uptime + if age > middleClickIntentMaxAge { + lastMiddleClickIntent = nil + return false + } + + return intent.webViewID == ObjectIdentifier(webView) + } + + private static func recordMiddleClickIntent(for webView: CmuxWebView) { + lastMiddleClickIntent = MiddleClickIntent( + webViewID: ObjectIdentifier(webView), + uptime: ProcessInfo.processInfo.systemUptime + ) + } + private final class ContextMenuFallbackBox: NSObject { weak var target: AnyObject? let action: Selector? @@ -136,16 +167,33 @@ final class CmuxWebView: WKWebView { } } - // MARK: - Mouse back/forward buttons & middle-click + // MARK: - Mouse back/forward buttons override func otherMouseDown(with event: NSEvent) { + if event.buttonNumber == 2 { + Self.recordMiddleClickIntent(for: self) + } +#if DEBUG + let point = convert(event.locationInWindow, from: nil) + let mods = event.modifierFlags.intersection(.deviceIndependentFlagsMask).rawValue + dlog( + "browser.mouse.otherDown web=\(ObjectIdentifier(self)) button=\(event.buttonNumber) " + + "clicks=\(event.clickCount) mods=\(mods) point=(\(Int(point.x)),\(Int(point.y)))" + ) +#endif // Button 3 = back, button 4 = forward (multi-button mice like Logitech). // Consume the event so WebKit doesn't handle it. switch event.buttonNumber { case 3: +#if DEBUG + dlog("browser.mouse.otherDown.action web=\(ObjectIdentifier(self)) kind=goBack canGoBack=\(canGoBack ? 1 : 0)") +#endif goBack() return case 4: +#if DEBUG + dlog("browser.mouse.otherDown.action web=\(ObjectIdentifier(self)) kind=goForward canGoForward=\(canGoForward ? 1 : 0)") +#endif goForward() return default: @@ -155,25 +203,23 @@ final class CmuxWebView: WKWebView { } override func otherMouseUp(with event: NSEvent) { - // Middle-click (button 2) on a link opens it in a new tab. if event.buttonNumber == 2 { - let point = convert(event.locationInWindow, from: nil) - findLinkAtPoint(point) { [weak self] url in - guard let self, let url else { return } - NotificationCenter.default.post( - name: .webViewMiddleClickedLink, - object: self, - userInfo: ["url": url] - ) - } - return + Self.recordMiddleClickIntent(for: self) } +#if DEBUG + let point = convert(event.locationInWindow, from: nil) + let mods = event.modifierFlags.intersection(.deviceIndependentFlagsMask).rawValue + dlog( + "browser.mouse.otherUp web=\(ObjectIdentifier(self)) button=\(event.buttonNumber) " + + "clicks=\(event.clickCount) mods=\(mods) point=(\(Int(point.x)),\(Int(point.y)))" + ) +#endif super.otherMouseUp(with: event) } - /// Use JavaScript to find the nearest anchor element at the given view-local point. + /// Finds the nearest anchor element at a given view-local point. + /// Used as a context-menu download fallback. private func findLinkAtPoint(_ point: NSPoint, completion: @escaping (URL?) -> Void) { - // WKWebView's coordinate system is flipped (origin top-left for web content). let flippedY = bounds.height - point.y let js = """ (() => { diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index c4f9b57e..5a11d1df 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -3240,5 +3240,4 @@ extension Notification.Name { static let browserDidFocusAddressBar = Notification.Name("browserDidFocusAddressBar") static let browserDidBlurAddressBar = Notification.Name("browserDidBlurAddressBar") static let webViewDidReceiveClick = Notification.Name("webViewDidReceiveClick") - static let webViewMiddleClickedLink = Notification.Name("webViewMiddleClickedLink") } diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 162441d4..12265867 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1016,6 +1016,114 @@ final class BrowserDeveloperToolsConfigurationTests: XCTestCase { } } +final class BrowserNavigationNewTabDecisionTests: XCTestCase { + func testLinkActivatedCmdClickOpensInNewTab() { + XCTAssertTrue( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [.command], + buttonNumber: 0 + ) + ) + } + + func testLinkActivatedMiddleClickOpensInNewTab() { + XCTAssertTrue( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [], + buttonNumber: 2 + ) + ) + } + + func testLinkActivatedPlainLeftClickStaysInCurrentTab() { + XCTAssertFalse( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [], + buttonNumber: 0 + ) + ) + } + + func testOtherNavigationMiddleClickOpensInNewTab() { + XCTAssertTrue( + browserNavigationShouldOpenInNewTab( + navigationType: .other, + modifierFlags: [], + buttonNumber: 2 + ) + ) + } + + func testOtherNavigationLeftClickStaysInCurrentTab() { + XCTAssertFalse( + browserNavigationShouldOpenInNewTab( + navigationType: .other, + modifierFlags: [], + buttonNumber: 0 + ) + ) + } + + func testLinkActivatedButtonFourWithoutMiddleIntentStaysInCurrentTab() { + XCTAssertFalse( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [], + buttonNumber: 4, + hasRecentMiddleClickIntent: false + ) + ) + } + + func testLinkActivatedButtonFourWithRecentMiddleIntentOpensInNewTab() { + XCTAssertTrue( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [], + buttonNumber: 4, + hasRecentMiddleClickIntent: true + ) + ) + } + + func testLinkActivatedUsesCurrentEventFallbackForMiddleClick() { + XCTAssertTrue( + browserNavigationShouldOpenInNewTab( + navigationType: .linkActivated, + modifierFlags: [], + buttonNumber: 0, + currentEventType: .otherMouseUp, + currentEventButtonNumber: 2 + ) + ) + } + + func testCurrentEventFallbackDoesNotAffectNonLinkNavigation() { + XCTAssertFalse( + browserNavigationShouldOpenInNewTab( + navigationType: .reload, + modifierFlags: [], + buttonNumber: 0, + currentEventType: .otherMouseUp, + currentEventButtonNumber: 2 + ) + ) + } + + func testNonLinkNavigationNeverForcesNewTab() { + XCTAssertFalse( + browserNavigationShouldOpenInNewTab( + navigationType: .reload, + modifierFlags: [.command], + buttonNumber: 2 + ) + ) + } +} + @MainActor final class BrowserJavaScriptDialogDelegateTests: XCTestCase { func testBrowserPanelUIDelegateImplementsJavaScriptDialogSelectors() { From 5e44aea2c99d55c22740a1d881d9e68b0435bb63 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:34:25 -0800 Subject: [PATCH 201/214] Add new testimonials to wall of love (#427) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add three new testimonials to wall of love - Norihiro Narayama (@northprint) — Japanese testimonial with subtle translation - Kishore Neelamegam (@indykish) - かたりん (@kataring) — Japanese testimonial with subtle translation * Add あさざ (@asaza_0928) testimonial to wall of love * Move あさざ testimonial to third position --- web/app/page.tsx | 3 +++ web/app/testimonials.tsx | 40 ++++++++++++++++++++++++++++++ web/public/avatars/asaza_0928.jpg | Bin 0 -> 41869 bytes web/public/avatars/indykish.jpg | Bin 0 -> 20720 bytes web/public/avatars/kataring.jpg | Bin 0 -> 12131 bytes web/public/avatars/northprint.jpg | Bin 0 -> 9221 bytes 6 files changed, 43 insertions(+) create mode 100644 web/public/avatars/asaza_0928.jpg create mode 100644 web/public/avatars/indykish.jpg create mode 100644 web/public/avatars/kataring.jpg create mode 100644 web/public/avatars/northprint.jpg diff --git a/web/app/page.tsx b/web/app/page.tsx index a15bc106..2093dd33 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -225,6 +225,9 @@ export default function Home() { <span className="text-muted group-hover:text-foreground transition-colors"> "{t.text}" </span> + {"translation" in t && t.translation && ( + <span className="text-muted/60 text-xs italic"> — {t.translation}</span> + )} </a> {" "} <a diff --git a/web/app/testimonials.tsx b/web/app/testimonials.tsx index 6b484a9a..9b0d5b10 100644 --- a/web/app/testimonials.tsx +++ b/web/app/testimonials.tsx @@ -17,6 +17,15 @@ export const testimonials = [ url: "https://x.com/schrockn/status/2025182278637207857", platform: "x" as const, }, + { + name: "あさざ", + handle: "@asaza_0928", + avatar: "/avatars/asaza_0928.jpg", + text: "cmux 良さそうすぎてついにバイバイ VSCode するときなのかもしれない", + translation: "cmux looks so good it might finally be time to say goodbye to VSCode", + url: "https://x.com/asaza_0928/status/2026057269075698015", + platform: "x" as const, + }, { name: "johnthedebs", handle: "johnthedebs", @@ -49,6 +58,32 @@ export const testimonials = [ url: "https://www.reddit.com/r/ClaudeCode/comments/1r9g45u/comment/o6sxbr3/", platform: "reddit" as const, }, + { + name: "Norihiro Narayama", + handle: "@northprint", + avatar: "/avatars/northprint.jpg", + text: "cmux良さそうなので入れてみたけれど、良い", + translation: "Tried cmux since it looked good — it's good", + url: "https://x.com/northprint/status/2025740286677434581", + platform: "x" as const, + }, + { + name: "Kishore Neelamegam", + handle: "@indykish", + avatar: "/avatars/indykish.jpg", + text: "cmux is pretty good.", + url: "https://x.com/indykish/status/2025318347970412673", + platform: "x" as const, + }, + { + name: "かたりん", + handle: "@kataring", + avatar: "/avatars/kataring.jpg", + text: "cmux.dev に乗り換えた", + translation: "Switched to cmux.dev", + url: "https://x.com/kataring/status/2026189035056832718", + platform: "x" as const, + }, ]; export type Testimonial = (typeof testimonials)[number]; @@ -159,6 +194,11 @@ export function TestimonialCard({ <p className="text-[15px] leading-relaxed text-muted group-hover:text-foreground transition-colors"> {testimonial.text} </p> + {"translation" in testimonial && testimonial.translation && ( + <p className="text-xs text-muted/60 mt-1.5 italic"> + {testimonial.translation} + </p> + )} </a> ); } diff --git a/web/public/avatars/asaza_0928.jpg b/web/public/avatars/asaza_0928.jpg new file mode 100644 index 0000000000000000000000000000000000000000..947179f80ace30bd3d150620219219e7a8115789 GIT binary patch literal 41869 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 RcS+-l#0jxa>@@IK|Jfv4fLH(k literal 0 HcmV?d00001 diff --git a/web/public/avatars/indykish.jpg b/web/public/avatars/indykish.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d7e5fab637bbd97a40a8325e79577918b2eeff5 GIT binary patch literal 20720 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 literal 0 HcmV?d00001 diff --git a/web/public/avatars/kataring.jpg b/web/public/avatars/kataring.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de7c58ba3f133df55292bee809443503f714c6bd GIT binary patch literal 12131 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 PiIMuf*nK>6xB9;T)&dP@ literal 0 HcmV?d00001 diff --git a/web/public/avatars/northprint.jpg b/web/public/avatars/northprint.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c48824404ee8ac0019d1f0051de475db16825a2 GIT binary patch literal 9221 zcmbVxcT`i&w{~dK1Vrgo1w;vmiYOou3rYt8=_LYEBQ=2ZA_9s)1f)nW0wM{ag&K&| zAiam)dy#}1fg~UAd%yL&Ykhxx_de&$%w9A5>{-vOnLT^$Lm8*c11@R2P=5iSq5=Ta z&L03}0igBV*U26L(AEY>0000609BL|fc9KER{`*y7XW}JhYCP*-ctS3mqY!Z(as#2 z|Cawzr0f9XUOKvYxj`M>+^@>qz5|eZs;*7@kF|6BD~tUrUK$aMnScQ*Xg5L`Q@4pv zgDJlN><oZTKqn2=bpSOx6%9KTr41l_J|`X3zxemF^NNa^hL-LEJp&^X^SJ`*5`dbD zhK8D!hK}x^X{dtE#{snLbeFH)eRAQ7o;Ce-4~~0b@wp5lPs^J*^#}2yGB%#?8JW1a zd3gE6ZiwH!C2?Q&!9zKDg=Z?yU#P07YZ$yTG%_|ZHM4zVXYb(X<P7!l_Ic;)=O6wd zA~NdZr|5*luSv-%so&D_^1l}p7X2vxSy5Sqs;;T6t8Zy-Ywy5z{_YwY9vL0OjZaK2 zEG{jttgfwZY!deN4-SuxiGNT2;dQ>A|3&M({x4?#4=?s}UevU-G_>^p@S>uA_YZM) zTDog@FI;}2M{n(M<@&ua29Brkx#i7_A~O1TP8-ibCN9zY3u1(SsQt_A|Bu-F{}r?U z5c_XlQ-Egx>VH8)O-(~bLqkJ%f$kg^7%uz+1}27o!SsJ|@n5k11GfKwa&Cm`+y*Tz zE&cg>iJ6i4(*GEgne%PQLYV|yq@g<BOf>8O5a57~&5<_gFJ$_@5{r$Yy%}<W#BO`u z9-K0>hqZ@Tul-$0car&gEYZ!O??M+Fr2~XlmTk0a+Sv|AZ|+Fedw|oH%E=BB*6sxm zb0K=p!6}o2#nQ<M06izh#a;=xa@Ti%Ha9|MXS?3R{L(~#QO1LCn&{zZ+$5ThI6P7i zc`v`JL$2gE#B6YiO{2Q{aP?JtW_gaS6cVK+1+jZAxcP)(v92Kc!7IJbN6xwxr$)Pp zTWZ!qNgz|<a`}D8j^XTZT+&eLbCt2B0w)0ju>pB`DVfR2mCD`d?b&I*eJ}$tkBwLN z=gh{oux?ddfEth2m*%~$zZ5_SkOH9U_dh5*6u+sFH~9e5Z};~saU1$7r&>@c{s6A| zSzs;tKpo+!V5E2y<coa97AFU>)|II*pC?$1&O})OM{mC+ZdlCBq*wvh%To8TZPvP? zjb&Ty9tx!il_J#gNQcIXqtX{ASS05WZ?Mg<w#*vA_t~oOC1POgoRkM<Tzsf0aqND< zH?^r=sPMSRDe6R-`J-83q62o(^Xuv)h%#{6pi|BqO6N1i6)2@YyrbY@iHI%I0UmE- z`GQTuTe&3RC&tE3PDA+>sEv5b=LOYw+XIar@&w)BXB9&sT$`Qciluf)bZ?(skVAfJ zvw=CsQZpd7o?JaD9=a;gRp2KJ6dWjgS|0FffesV{Rd0wx^({{zLZvxs7xVA2j`Tl> zGvZb`)59W+_MKF!{+d9qcTn*ba?nqvit-fk8op`}kcdg}f308nBzF(9<41_o4WDDW z4Swz(sJp0sMSXCozsI!{ma=MFDxz<`3D~vF{^iEN#&{+>c#xkk_&D0MX<xuD^)x|U z_HV>u2!HpfN$_-an(~*`wH6S|xA_{8)RlVrw-p4e^p~Q+C&<aq%yQdrbE{&kZ64?2 zIZurF?6Sv+iZ={porj_k#`REeLpTL+QE6BFL7bLiWB%8%Dd}Vi0Ji)xnH6pHW^8mA z{j^x~k}UpJNs59hHx$wi#TjKnt-_QrC~He|@5M&+ZOMJeOU1FhzB=YDWz=ShPt)k{ z*-7ukrV^?cMM)!pJ<U^Pw2|&O_85Y}RBg4t2}+!7YKfGYQ4TKUH=qoX9+g!K7(3X$ zm0PUXmO8m;Y->kPjWO=ItJ=D7laI@1DGpdr9nSMJxy+Vxz`S*+3B>(T`F+H7$Ll<Z zn@hh6+fqwH0m?}Wqs7qS4{xsmyb46wtkrtM4Bw<sSLoHbBvj=X8mDvWn}^by^(Aj{ z;&j=djHCA_mu7PwiWEXFYoZMwG#;0Zzn+pW_^1G`+8_IB$+V)47u;w$@E?QGcAoqm zLtq;Nold>U1Mz_uiGn}63#a{puM@7ifOKBEZ}wr(U)fIVGf8U5V!D&O$_6?^+JpeA zSxh?H<niLl+K%k0n(6}Sf~|5?!8D7s4wEPR;i73M1@JbmDb#p7_=0bM?!&&MKxYcT zzEv7xcu?i77mR?AM*80R$aiGsHw+5rg7BKU5wJpEjnhTt65fYqX!!acWt&W@ehjz+ zV?EluY}`LbrO5AuKV8WBv@m7T_LSMTnI`VD)rvqJvfFp<qr@6-wfOy#M$<a;ic{b+ zyh*hnBKiXd_cP7#mkO&Hu=rjzKhC{Jf&t$=+neD5AN_IK*X=7EKFgPOamM+7?UVR( zG28;RQ|$>HD7D_Q=-pO=te2T2cD4;Fc96%RrXYLH$vN{wIP$8$@t9tFKvB3+ToGl6 z<XIM8#5q3kY^YrF`i7-Th9z+K?jbC#Wms0qX2bjoHk3s#!jKz!39y_vgj$%~<W;j% z!d`DOX4lJ_xoMJV%&{uM(MaF;M8r0FQDb|3JW^d@%wqp^q_R6^jI)P`RAqa*CS_L5 z_$O$KFJRgs4dMMR1}7a*Ec&>z`mPn3pB~zU{8)~XJyJ;PO?(L;ZO)4mSVmV`CY_9S zJ-2=S=<P}K{!PyjHd|2CCeSo1Uk++|K*)?se|UD<HtRK~MUz3k(8&8DNp`pLlZNMn z&<d$AdzSOMvqVUAlVbW&5|NQ3Cj8adE&#N3t?G5uMiK%czBKo1#ya_tFmHE350=WC zhfg`^_aqR67ywSZlJB1?TG|Q}CCWn!){ljZ8W(fLl8O!Xu~%;2`0DRs5E^h9xYv3_ zM|7N(BmQQs^X5&!J*U>n%CbE;iwsdXa+?CpgRr}wvVbXz;HY+FjG~kSb-R7N)@<OH zr}>grlGLWD2|j<8sGH7@@%sQGqayb_{V3|Dc2oWjc|Z0JoW%jH&=VR|h(Y(m?t5U? zm56Rghi`^OLUGq&w0~{W&q0g&!$imB=tM-nY#zvPyU-+0&354>fW8c|E`E$uu0r?S z@yDsVKr^7=P9C@z%ro-(n#09L#*)ro1dAQ?MEl$J8v(c|vm}^)M)!A`K4*AweB7ZE ztB00%XQ^X@jB#<82Pd?~{jjvf>j=*L;{=EN@Y5X^)(n0&R)LP*l(yM2&C){_<%4Gw z&Ay^QlwndzIgF>YbWn~n>`kVOrS{JQWC>P_;68X?OZg2O58w|^^EzZ1_DKQM2BOuy zfx=IjX1DGYPrH2AMQuReP2wMDnUW8l>q65`FSF}gOqyG%j2-L2f3(ux>Gexh9INIk zQo4a2*3b(scPiSqiuzGp2=DJ90m)4K6aa&Afp8QB;0R{u&wby_Z8`*-y1xOM1d=O2 z$7)hLU>73Wl4?tT^rZhLh)q$?wp8WUU6UI^&NRb;+EE7EkC9i2zfUEIy4a(K;#$wE zvg{sx`QbRH6rBYm0GFh<vk5Zu9kt}^c#ry_?_u5FtK-&l;x@ZHF+Y%_6?}o>nPzc! z(RA;Qmiz|X`lRYw$od{uYKw@SjV)onpnftV>AFRCO!O*J9P3Z^4dxGNRslKoM;J5a z`_2rvS6^Dt@{j&n%LJ-Zc%ArXq2xe%0ei+_JMRWtio>-fbT6<x|3xRQ9N>vPt-RTx zG|qGa-(UaR#v3FXovUqgQ`TESI#YJGd-hCf)la4;S4s$0sXRN1lH0Ly@cBiJHfXoH zH|V8(J%q!zX@A>HMV=v?<kHRhi7!sa-^1__EU?Z;YS`j3i+N}!R%P#Z`|1}(*ZeOu zx2~=>siAAff~ASyAtyPv3a13CxiHNfwz110LG^28$lffWyp#%!p|dzfoJAjrm3aw+ zWs3<0;*E-=-%p&0<vqK?<ASKIjeooajC&D8b%IL??#2c46AN<W6K>`aI3wxSUtdgE z`#z!gWroBOgg_8ww3Rs;hrh=NKj0EnDk1Qz5{y3vGXxsdj^3xgt6gZR7RxJVnj_V9 z=fLg^CVRU3fy`wMML&?HdnBo%pDF*YI^px)JFD2~dBnH6_Mbs)lPW}rBL_8IVECz( zGhaw6lD06`rpw#KD>a{nF8@OaJjCq}42cT5wV)eQFCG&JbX%NJn3sabCx5vTe&y!h z(MBfRG6<{t2^YfIbj?}l+PfQFGRvm9>t*7AB@z-Hj5-SD_PtkLS9AM8X7S*d`mwp{ z?&#kezC_8P0(I1s=h`n=Og1l?W^sxcL<LD<_uISaX!^OWJ0r8pSN8N1zI7=%dnx?~ z8ngs4Ig?++y|m3#HV+t{qYdFMU&Y+S*vv%{d{a7V_zt(NbIM<Sj_+9dO}Y!t4^|>V z>1HsKE*w}<ReuHd&er@}+s}g?mWo(k<0p2^{N8ZbYKv|o{9MUf1)JXv?(|%#6019A zjVjejtj-QrZ1_mLdLU9Rl!Ggru!!tn2^7JXEV33XYRjXQkeIVqW<302iu|dnPlE`! z*`{iIR&`oZo*J7H8AXgWfxg(@Y8@Lb#g?1(4%IXJDex_B7l<-#N?A3zacf`)tk<Bq zv0?36L7N#;zuGMYVvIk@+WX)7x?+Wj^7_U((1|uu>cT@x*rc=|A}}-zVec0_+UVN| zdH5QcTVODw7#%-C86o|w&};YR%8y=!M`>(I`7@m;LKNZm9@q#lRZeXgF0`AH`S3+` z8*K=ncdtj&wZZ!cpTTXE`J3A4$4@R&k-f(?;~-4yN2O>*Es5+@3P2cR?Z)6c#2>5K z$}WW(?0)-;MtL@gSVMpw`4X@#rxW>&RX$<r%~&_vSxm_za%7Vhk(9S?))XbFfPzCW zI*49`bztoA`)%;us1*u;F=;Y<_VO6p%HZFQ{vN!?Y@fy<*NlI5g3z@wSB%5%gsuvn zoI!rkxR|2(`}ZcFb>pjWQX9aw@HrIB2y)qRYx&I*6?>qD()0**m4YS72^HveVab1y zuZgGld}AW!oeNj8XWCOL0mz^Hq5<QzsLy16-|S{%UC7T#g%3(TY2;XZ1AogzHIV(; zM|ipHjY-dAgQhN-rsVBOjAr(=lzqdNjtX4bHYt1%;}jARa%ty-|BbS0+->>l1|hAS ztm!j&$jlAQU67MD?|lm3W8z#3eM(@%o&uLZh{WG*E`ubw>qtxIwAh2Y%>htRLhCVY zjJe|h?>g{AHxhj<KXLUHVIs((t2D!IRCW;gNXb~cPr+A}2~9|b<qoV{$rFU5ytEBk zPwa+O?MkkiCW_MtYMfk_Q_ic!-*dm2hp{Y*C}PxbkJd4(nVFo-^eEz((u5vH9T~x% z<5l0!C!g#w2Yg0m9(Vo>b`64T7ZDTj%TqjuY?qw|-pkKHdC2ydOk|bLg+US9O-LS| z0*H{M061m}O4D8Uxvx6V;`Xq-zA{PH#Unj38Qt;f)l<>NE;AFB)pIJPJvU$5Z^}b0 zNP%Nyu|TB(G^B8oEI?4s_V&7Aa#nkreeyZ<J?7Rivi6Jyi6#B8iN$!ka~V<qVcsOj zp5{WzHU_@V#keS?-zQfHkV|;U_k{dMwVMb92L#^5iE^90a-EZl$)x~7zW|BIPwwA5 z5r%f28O2yDrvk3CA#-WV!1x&>OnJMW_SrkI&kqvk@N!piY4u>eF@2uq>Qu+yO}ckn z8DZdWOYujk_FiSOV5_8bdW|8Sq<!yqN*~|e-IADhhgjAdS+*Op{Qd!b7+wl_=y-rI zFCVLf%zY;f_xw1&mq$tP3MJqVlp@pec6xy~7vk4yQzE~huK2}+hl@*`4n*e+)v)Ng zaa_1kzrL7y)P=G?QJk2YJhHK#=qu5it(pc*CC^|@yuE?(r%z<s7fyfE<J;EuIFINy z-|+n{TC$HP<>pzuFqT;F3SkEuzAu5u{KD$3#^le)EK5h|7aZk^u4SI;E>sy820kU4 zE`a&R(R>AYG8OoFXeTmLnT;4ZrIuwkCa!5%F3qtkLi=h@owi&KV1sU5I^G$!wyz|b z&#&Gt{mPMO=-s2{FMLgRR^+tJc3Acl!-Q9U_z2t2^1h%aGu>@L9Wg~tUx)Sjy24jN z3#-4nac`z8>yh%vERMn#Wd)jxpRe|*$4v`#sTS)E1f>1ds6Mn*1rwBul*{3|%K1TF zQ{U6{`~K*9YTN$iZ(EhWFlLo=gxuX_sSr@sjwE-R%(>_RYwN_js;g|@iSaiz2D}Yo zUUQNsE#1sRm`+TCr=<`-xs&!o6*4a3*5xCW<G4N$<UV<}Fjk+6HT=E8F;$@uLW5l} zMNRnznm?MHcm%LBoV_v=x+biJ+d=-?jl{52?XXT6;Y+4AJvwtfEnRCqs~2`Y6Rj(2 zth7maS@p(0dN)`g(2TI#lKINHiD}fXLNr`deug&3$G5*LxVCc}a-IT!p>O;mDEL(y zN9+F>OG!}_P8i(_tlHyr93i^7iJWi{GVWsY6hZ+^zMT88*7O$g{fY|R`M4Kn<Hqqs z=A)rOvV=*|2gT<_4^kG@^MSk{xN9=sC-@vc3)Nv0I^4_#><F6^+R1t0UR(uI0~A1& zvOU=b^Rc!jlJM<O+d$8)JzbUhqIdO>7cg$lUIUrt0ho>xNYgY}d{Z?t>V#JQfODP8 zw!o855R(MCY@1U$J9r032z=W=f**X4gAkiH<N@%MY|0@se;z9NzLo7?GBu`0ICc8M z(<A3c2h0);Y_rj_nZ1^1S5!J?vT;-ISofZr0cDJoT^^h?YKGBRlzg*cY4<&Y>15hl zrnRMWGuJx0sS$X6W<Pp3h5(i~QpiFJg<VhUuGJcAg%U?^r6?8aC#9~&>Hkq&MK^TR zKOXVgun`fz&=|ccxr~zuaTJYBihP0$VK&(-=jd;h{@lca8VK|V$%71pw87ezx@{&H zYG~p+u@(+<X%1l+TTA*jcErqRn_ljE`AvZ!$S!!2d;YK}=DvA}lgR0krvmJopq~-g z9kRIlVUAPQEo%1qx%cuT07z+jSE^@y79V}w-z!sY$}dL_-kV-*47}I!0-hp0q3@*b zFK&-p4i5QLB-y~JKp=Cfz9UV%I|vHw>u$@gbZD82AhV7JnwF^C_^eT#U@z675l26A z9>+e@M=M0;LIYn(Pm228QDDK!32TtNNR7dFpSa<1n)usE4^LD-+V6{F&rX}eVZ<v* z*a6&fX;|JY5oS^~=(T)L_ucipus?pFh!77F-=5+F^Mpm2o~JJjnvmbG1z?&e0MADf z8c_d+>5($LYeTW)L!oP^>UXFbIZ1kYK?rn#Wu-BtZH`6TCwD$zJkNdRL6?sJ1u$oL z>V$7S3K*<{eHbL#?@egcynNsGqfZUl35x|WdxOJ6*e}@JokVnX)7XX@hEtI_vjN0@ za+&SjI%R7+fv4H!dpZx6gIxl;8&)mjq2JSv{oTk8TWp^}cG*<E9pl|}6_edpJ0;{+ zn{E+PPT7c2DskpJY%(f!B97#wlePI7oo+q6PduU|TyPYwPqW>{;z!>B`h3D2e&Dp+ zQ2UBsjXBHYl!>hT%Rz4Y0x%nhkT7&Z0wHdz=CYe`2TA8veP}6ZbnajuB-SMC%jNbV zSpgY`HpzQ519P+Gzj%i}Dp80;=Ye4kaTfkG$D|1HSd`+jt1GWf53COwxWO$b*THKp z*nG0uv_Z7PV~mMgr8UuKc5ewzo|h#NCbr9<y}>999@f#=-vP$!%&|h!JhEH2ucyX* zc&$K!Y~W|57tW7if%(Tf6oC1MynOMzU{{H;)4G5{hcC;c;_^!+0hQS;m}H>c=CMN~ zxerqVYR1G~$Eh^dgPDC3ETqTX-cX5!sM*OGAJMbyfOEKh++kQ7p2eiHeF`ZDwPC2W zMUSd0?t5gE+?2ea@H+0f|GQtiQ|3p}q|7Wq`VOB;-_};H<y-GJCW^x7!4kH~Jc68I zLaFdd467Uz)ELZy71N^tdXyY~gVZ$4G>3N2RB?kPMsZ0?MczOEW)E3t4k6Z7+5>;% zxsS?;(x*?xU(7O%83~%)lyOQ)jocHNTNaI?8D-===)O!B@?gzRNJhG?n-NwZ;VpuG zlNJKgRr<E8U(BnTc6<H3feB8k86lrmR+<gKDf20O8%vH9TRMdI%S;wECZ0!|NeB0x zPK#jrX4w=RDYPuTz=z8dFOQTj%Z`uUep}cFJh&J{vw}ylu1;!=wdq=*;CVH#6XlR! z+lH08WMr||^SyV~U}@<Hzti(njLh?R6WpaY2c>B$w1$k<y*_#f+cd<ZEGT?^VD2fQ zEA%}}pfF+W2s(IXXDcyd{>8Q%d*9)0`5m&Tb*ISQA##Wpv7h!=_o#sw0l}xtgFm57 zOvLuhQK&D9SD<p^AN+U3J&rgJO<7s1A91VFM~)S!-^7kKi1f4#MSos3^9E(J=q?FG zITddTvnq>?7k$2Od3#aQSDMGA?s1gs`U?1)zmJ@9(iR0kEg9lq$=p%qTcbm`|1p|M zQ~Sw_^-mN)VKe}g3|Yin@D<l5MlEhhvpTKY)nUH6UVRg)V;UPgy&h7|9kFvJY+JNh zufh#wNRiw~7VvS+!xRKs7l0%DJSF6cbvSMPT1e9Q6hKXyzuAtIB`mRd`9vYrbnkY* z$yxH&a=%L%abf<}&d4OhNS7~^>T)S4GqCtn0|KH87I*A*f)nHV`W8Sd-`}Wh#m%#R z4}zF29dY6{)igFdiz+O%^7k$Ra|c4KDF7NXodgQN`g@y~OmaE}@azVLDmS|$No};C zr+_QXslXnk{m4rpKY0n11tiaetOgRklZUv+W;utN_yff%>Iq66-&~XP2>C$a&O5xY z8E_lU2|suAjt~Vqd&2fPSYkT!#rhrJ9gaj7_G94=)s-D^ps)Cm&tMf#el)X6<o)#@ zxvI;+4NLmwYCbLJFC7<@N?>;unMS9lj{VYIXWUAW2UDGMEME*_pBt4x(<T~I@+N{E z7|#=bGucr)B8DF?ynJL_GimnWWsZk|`6L~H$_)RDE^y|ps_puQ-YxC?apya!(ukoq z*6(?rAgKuyz;-si8>=qb(*CwIT~zV0wCusQo(<v$cEReo=}cCH-1r%Uu(nO_k?+im zSdUk$oO(cXtJ+{eEUS3(-1nuW0MIM}H7(N7AYnzoHT+u4xbLZYI75X7*RW{>J&jm( zyGPh`lI<VJfsYpZdl?I#$^{pC!@qwJ20em27x_-QETE|)tyub)l$!6=vAO{%XO}UG zN+O~Sg$|O6S61U-okiy^h-ZCPvi#IF^-m0aKP{n3rXxt`Ayrg)2b*)&rWKp4M!&{q z^{$qcl$?HxAZO;^wX!QiMf8t`jV#kKOK&{KvLc@!G(v#A$KRW>dEwbr0k|Q(+&@`T z8ui(f0g_HxExiEF!Omj{U8!5Y(d$$F&=Pn!-O3cmb-8ZCDDhymp5L$Dn8pD*oVI~* zRe*x|V_JouN5OsA)zi>$hEjh<BEn>48`6T%z!vKibT3oOysUR9khk#A$3xO>Eqi`n zTg1?V=Hb~~L#J&`f<)Ou-Fl^apdJ1dgZMS=q)#S35;@uVOr%*H%3O-(MH9}O+XUf7 z6s=8~3cV~Q*+!<uByJIq!K3HSc&z9rU@ta6&xwuT=ku{y1l$au#{5u@kv9_JO&0$o zL+{LUQ@)0@nihRnBV*;GsI}5$sKNg`+cTv3L5M^0h<M^+WP{6I8TFhmnQGbrhX|e# zRJcRE%_HDd>af7wn)zq}8&);PYV!2@C6(Mzo@J(kR<|8+455hMMy3bHp0*e)k<i#6 zmCw1H6pz!qkV{85upF1@>fZs9@OLUh&O8P&Z7TOat~o-c`Bsp^q6AZ|-j`yX>79o! z*%X-smGCZVi>MTF@X$<_em7Z{u;!sIV50NXLG&&$Uo@n_7l^Wc<)Yaz{GQnO)Y$If z>jW($i+y*eeeLM>y4o$vk()CaDCbL-I>401+O1y8hPo|_f*qU{WW(LW0NXYu<5udw zZwhk!S#xX&0q)2iesyo!m^VZgpZ{uL82*Fhm7N^7Tob^>IhjRw<wTaQb{rSUlGwhz zw)%-(9+x!2B1|pgfIqA11(^1_fwLJnV<*4iG-8G;!->TM(S!7WFA!(u=y{jY6R7#X zKZd#&-Qh<+aF1@T_F9;N_*Sj!mJp7r?svz~(Y4Tl2!nYf@fNtl06%=>-+*6D2c?ww zb{P&YGP$?V?CZ>F=bw8W|0ehIY^_~z-`s@1!I=($uKKo{yUncfCR;rS;rDJw&m-hi zk33-nx>yzUkdN)XiqF2wisIfgZQ>eJ$c*f%9e%eZEhOwr+<IY)q0PyKuNYejJR(c> zg35h$8Czco{#=y$h@2fFa|n~_zfSJDuH6t)9zvHWC4WA2$f5oFg6@9KLE$I5N4{8D zqTshp`sADJFpZZZ>A(8@Wm)LP>7CtaP%kX}4fwS5?744<GR1yxH+CvF6wT)R?({&V z&@{oqkkR4i(Db}Fy!em*zU7EJR#u~Jc>1Cd%jf`abD_n|;c8uXLmwK~@S!=&GVrmL zrN>wu{}$T5uo1o0>&cDF^h3gby@t_qegcAL4&m9TwC)k<$G^p++sQ+^yG$o1Jlx&o z`-dJ1*_5G^E3Neuzzly0?qKHm8$&zgBtl^rk`uUZT<a)wjpwB~A_U^W##UQB1j@J< zGa+l=pASbiZow;?`s9%U!>If5PmD@C`p!IhgUw;xXjpB_V!sKhY2Ns`OTcj2Ubp45 zYDj)H<`|jSzCu=Qe8%N(!JT;z5<{#c2n{b}x4MLM97l<0qWsvQJqht22LdWzGbPWS zUv}EQY*;0QwM9X4*gP%W!E&ZI^RDV%+|`(q_Y-a|`D3*eXZ4@kniq}#45QIQqXnx+ zRxUyXikj6?3BfI(3rH_>=DANz_Y7`hkiB9nZE?zO3O=){%HP_9(+m0qAw7zB?Obx4 zxK8YTMyS1_fthV4;Qeu#Z9J2I<L;F{x<cr!KE3_hN8K?+C4Nc+Zp+D8p|Dabgt~fO zx)Jk-#SyasxG>3UL*?}9N71@fOl#zEB_|Bz_{T}UaLvQXrN+m{0^V>Lzg@#Dy#H8v zbA`~=sen?6m=vqSSg}8k#=LN|hf|ugea@+gW{`4|WA2P4*(9Z-M`L2`6hNatF_5a+ zn8R_#YTmol_0MsswthWke&3>ZHW!z6q9_Dj_9e!c+8>=FWwCQ$yk8+09QNCJAK_-H zHkxGC)GygJou)1<ABz<&9Zx%|E-#Tld0?g}fE^t3BHN`mHN6%gM|kq_7Px3$4tngo zPRuZJubZF@?^_C+O1yGKS`C~%Hg@X;D{qAOK}HVFV~F95eLC$TuMn=4)Nh3-<*x&1 z_2XdY!yp+`_0U!*Sl%&{tMT)*okL{1%rwjWDK(Nfu&oziy5&<J)#&9j8KndHfZDJW ztkF2z=YA?awy@c`gE(ZRm$l&toh8+U-lK{cW5Ku~-aZ>J?z3?xC`HS@@h;mGlrJI7 zo#O6tI}dzD_{ln|>=qej@_|oBwt{v|^hlFs3QUVh44HR-_J##zMShvfHtR97hLb*M zc=P7q$cLu8q|NvZL#yfto^M_7&zI*;_<GV`_WQ@_B&A6C-*;45DK>hde7>Y@bt4MP z!>e%3(!xf#62tVq#Av+H*30u1Z#*je!RWJL#%;;sF^QRWJ_%$MlFGUvQ3Z!8%zYd+ zd|wUhK+UmVX;>|7u-qJ7np}H<9IXvGkJ{KGdOe^xgD+#Kp_L}*)sSlQv2P{bvSDDv T!X2*>uBhfkV0Su{GVy-^haZ7J literal 0 HcmV?d00001 From 06adb6228c616195cf01d2dbca039036735266fd Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:05:12 -0800 Subject: [PATCH 202/214] Add drag transfer timing logs for bonsplit tabs --- Sources/AppDelegate.swift | 173 ++++++++++++++++++++++++++++++++++++-- Sources/Workspace.swift | 112 ++++++++++++++++++++++-- 2 files changed, 271 insertions(+), 14 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index f3c5e73d..ac461f9b 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -1890,19 +1890,67 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent focus: Bool = true, focusWindow: Bool = true ) -> Bool { - guard let source = locateSurface(surfaceId: panelId), - let sourceWorkspace = source.tabManager.tabs.first(where: { $0.id == source.workspaceId }), - let destinationManager = tabManagerFor(tabId: targetWorkspaceId), - let destinationWorkspace = destinationManager.tabs.first(where: { $0.id == targetWorkspaceId }) else { +#if DEBUG + let moveStart = ProcessInfo.processInfo.systemUptime + let splitLabel = splitTarget.map { split in + "\(split.orientation.rawValue):\(split.insertFirst ? 1 : 0)" + } ?? "none" + func elapsedMs(since start: TimeInterval) -> String { + let ms = (ProcessInfo.processInfo.systemUptime - start) * 1000 + return String(format: "%.2f", ms) + } + dlog( + "surface.move.begin panel=\(panelId.uuidString.prefix(5)) targetWs=\(targetWorkspaceId.uuidString.prefix(5)) " + + "targetPane=\(targetPane?.id.uuidString.prefix(5) ?? "auto") targetIndex=\(targetIndex.map(String.init) ?? "nil") " + + "split=\(splitLabel) focus=\(focus ? 1 : 0) focusWindow=\(focusWindow ? 1 : 0)" + ) +#endif + guard let source = locateSurface(surfaceId: panelId) else { +#if DEBUG + dlog("surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=sourcePanelNotFound elapsedMs=\(elapsedMs(since: moveStart))") +#endif return false } + guard let sourceWorkspace = source.tabManager.tabs.first(where: { $0.id == source.workspaceId }) else { +#if DEBUG + dlog("surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=sourceWorkspaceMissing elapsedMs=\(elapsedMs(since: moveStart))") +#endif + return false + } + guard let destinationManager = tabManagerFor(tabId: targetWorkspaceId) else { +#if DEBUG + dlog("surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=destinationManagerMissing elapsedMs=\(elapsedMs(since: moveStart))") +#endif + return false + } + guard let destinationWorkspace = destinationManager.tabs.first(where: { $0.id == targetWorkspaceId }) else { +#if DEBUG + dlog("surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=destinationWorkspaceMissing elapsedMs=\(elapsedMs(since: moveStart))") +#endif + return false + } +#if DEBUG + dlog( + "surface.move.route panel=\(panelId.uuidString.prefix(5)) sourceWs=\(sourceWorkspace.id.uuidString.prefix(5)) " + + "sourceWin=\(source.windowId.uuidString.prefix(5)) destinationWs=\(destinationWorkspace.id.uuidString.prefix(5)) " + + "sameWorkspace=\(destinationWorkspace.id == sourceWorkspace.id ? 1 : 0)" + ) +#endif let resolvedTargetPane = targetPane.flatMap { pane in destinationWorkspace.bonsplitController.allPaneIds.first(where: { $0 == pane }) } ?? destinationWorkspace.bonsplitController.focusedPaneId ?? destinationWorkspace.bonsplitController.allPaneIds.first - guard let resolvedTargetPane else { return false } + guard let resolvedTargetPane else { +#if DEBUG + dlog( + "surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=targetPaneMissing " + + "destinationWs=\(destinationWorkspace.id.uuidString.prefix(5)) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif + return false + } if destinationWorkspace.id == sourceWorkspace.id { if let splitTarget { @@ -1913,26 +1961,62 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent movingTab: sourceTabId, insertFirst: splitTarget.insertFirst ) != nil else { +#if DEBUG + dlog( + "surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=sameWorkspaceSplitFailed " + + "targetPane=\(resolvedTargetPane.id.uuidString.prefix(5)) split=\(splitLabel) " + + "elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif return false } if focus { source.tabManager.focusTab(sourceWorkspace.id, surfaceId: panelId, suppressFlash: true) } +#if DEBUG + dlog( + "surface.move.end panel=\(panelId.uuidString.prefix(5)) path=sameWorkspaceSplit moved=1 " + + "targetPane=\(resolvedTargetPane.id.uuidString.prefix(5)) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif return true } - return sourceWorkspace.moveSurface( + let moved = sourceWorkspace.moveSurface( panelId: panelId, toPane: resolvedTargetPane, atIndex: targetIndex, focus: focus ) +#if DEBUG + dlog( + "surface.move.end panel=\(panelId.uuidString.prefix(5)) path=sameWorkspaceMove moved=\(moved ? 1 : 0) " + + "targetPane=\(resolvedTargetPane.id.uuidString.prefix(5)) targetIndex=\(targetIndex.map(String.init) ?? "nil") " + + "elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif + return moved } let sourcePane = sourceWorkspace.paneId(forPanelId: panelId) let sourceIndex = sourceWorkspace.indexInPane(forPanelId: panelId) +#if DEBUG + let detachStart = ProcessInfo.processInfo.systemUptime +#endif - guard let detached = sourceWorkspace.detachSurface(panelId: panelId) else { return false } + guard let detached = sourceWorkspace.detachSurface(panelId: panelId) else { +#if DEBUG + dlog( + "surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=detachFailed " + + "elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif + return false + } +#if DEBUG + let detachMs = elapsedMs(since: detachStart) + let attachStart = ProcessInfo.processInfo.systemUptime +#endif guard destinationWorkspace.attachDetachedSurface( detached, inPane: resolvedTargetPane, @@ -1946,10 +2030,23 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent sourceIndex: sourceIndex, focus: focus ) +#if DEBUG + dlog( + "surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=attachFailed " + + "detachMs=\(detachMs) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif return false } +#if DEBUG + let attachMs = elapsedMs(since: attachStart) + var splitMs = "0.00" +#endif if let splitTarget { +#if DEBUG + let splitStart = ProcessInfo.processInfo.systemUptime +#endif guard let movedTabId = destinationWorkspace.surfaceIdFromPanelId(panelId), destinationWorkspace.bonsplitController.splitPane( resolvedTargetPane, @@ -1966,15 +2063,31 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent focus: focus ) } +#if DEBUG + dlog( + "surface.move.fail panel=\(panelId.uuidString.prefix(5)) reason=postAttachSplitFailed " + + "detachMs=\(detachMs) attachMs=\(attachMs) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif return false } +#if DEBUG + splitMs = elapsedMs(since: splitStart) +#endif } +#if DEBUG + let cleanupStart = ProcessInfo.processInfo.systemUptime +#endif cleanupEmptySourceWorkspaceAfterSurfaceMove( sourceWorkspace: sourceWorkspace, sourceManager: source.tabManager, sourceWindowId: source.windowId ) +#if DEBUG + let cleanupMs = elapsedMs(since: cleanupStart) + let focusStart = ProcessInfo.processInfo.systemUptime +#endif if focus { let destinationWindowId = focusWindow ? windowId(for: destinationManager) : nil @@ -1992,6 +2105,16 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent ) } } +#if DEBUG + let focusMs = elapsedMs(since: focusStart) + dlog( + "surface.move.end panel=\(panelId.uuidString.prefix(5)) path=crossWorkspace moved=1 " + + "sourceWs=\(sourceWorkspace.id.uuidString.prefix(5)) destinationWs=\(destinationWorkspace.id.uuidString.prefix(5)) " + + "targetPane=\(resolvedTargetPane.id.uuidString.prefix(5)) targetIndex=\(targetIndex.map(String.init) ?? "nil") " + + "split=\(splitLabel) detachMs=\(detachMs) attachMs=\(attachMs) splitMs=\(splitMs) " + + "cleanupMs=\(cleanupMs) focusMs=\(focusMs) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif return true } @@ -2006,8 +2129,33 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent focus: Bool = true, focusWindow: Bool = true ) -> Bool { - guard let located = locateBonsplitSurface(tabId: tabId) else { return false } - return moveSurface( +#if DEBUG + let moveStart = ProcessInfo.processInfo.systemUptime + func elapsedMs(since start: TimeInterval) -> String { + let ms = (ProcessInfo.processInfo.systemUptime - start) * 1000 + return String(format: "%.2f", ms) + } + dlog( + "surface.moveBonsplit.begin tab=\(tabId.uuidString.prefix(5)) targetWs=\(targetWorkspaceId.uuidString.prefix(5)) " + + "targetPane=\(targetPane?.id.uuidString.prefix(5) ?? "auto") targetIndex=\(targetIndex.map(String.init) ?? "nil")" + ) +#endif + guard let located = locateBonsplitSurface(tabId: tabId) else { +#if DEBUG + dlog( + "surface.moveBonsplit.fail tab=\(tabId.uuidString.prefix(5)) reason=tabNotFound " + + "targetWs=\(targetWorkspaceId.uuidString.prefix(5)) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif + return false + } +#if DEBUG + dlog( + "surface.moveBonsplit.located tab=\(tabId.uuidString.prefix(5)) panel=\(located.panelId.uuidString.prefix(5)) " + + "sourceWs=\(located.workspaceId.uuidString.prefix(5)) sourceWin=\(located.windowId.uuidString.prefix(5))" + ) +#endif + let moved = moveSurface( panelId: located.panelId, toWorkspace: targetWorkspaceId, targetPane: targetPane, @@ -2016,6 +2164,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent focus: focus, focusWindow: focusWindow ) +#if DEBUG + dlog( + "surface.moveBonsplit.end tab=\(tabId.uuidString.prefix(5)) panel=\(located.panelId.uuidString.prefix(5)) " + + "moved=\(moved ? 1 : 0) elapsedMs=\(elapsedMs(since: moveStart))" + ) +#endif + return moved } func tabManagerFor(windowId: UUID) -> TabManager? { diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 4354bf8a..28857550 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -1061,6 +1061,8 @@ final class Workspace: Identifiable, ObservableObject { private var focusReconcileScheduled = false #if DEBUG private(set) var debugFocusReconcileScheduledDuringDetachCount: Int = 0 + private var debugLastDidMoveTabTimestamp: TimeInterval = 0 + private var debugDidMoveTabEventCount: UInt64 = 0 #endif private var geometryReconcileScheduled = false private var isNormalizingPinnedTabOrder = false @@ -1093,6 +1095,13 @@ final class Workspace: Identifiable, ObservableObject { private var activeDetachCloseTransactions: Int = 0 private var isDetachingCloseTransaction: Bool { activeDetachCloseTransactions > 0 } +#if DEBUG + private func debugElapsedMs(since start: TimeInterval) -> String { + let ms = (ProcessInfo.processInfo.systemUptime - start) * 1000 + return String(format: "%.2f", ms) + } +#endif + func panelIdFromSurfaceId(_ surfaceId: TabID) -> UUID? { surfaceIdToPanelId[surfaceId] } @@ -2190,6 +2199,14 @@ final class Workspace: Identifiable, ObservableObject { func detachSurface(panelId: UUID) -> DetachedSurfaceTransfer? { guard let tabId = surfaceIdFromPanelId(panelId) else { return nil } guard panels[panelId] != nil else { return nil } +#if DEBUG + let detachStart = ProcessInfo.processInfo.systemUptime + dlog( + "split.detach.begin ws=\(id.uuidString.prefix(5)) panel=\(panelId.uuidString.prefix(5)) " + + "tab=\(tabId.uuid.uuidString.prefix(5)) activeDetachTxn=\(activeDetachCloseTransactions) " + + "pendingDetached=\(pendingDetachedSurfaces.count)" + ) +#endif detachingTabIds.insert(tabId) forceCloseTabIds.insert(tabId) @@ -2199,10 +2216,24 @@ final class Workspace: Identifiable, ObservableObject { detachingTabIds.remove(tabId) pendingDetachedSurfaces.removeValue(forKey: tabId) forceCloseTabIds.remove(tabId) +#if DEBUG + dlog( + "split.detach.fail ws=\(id.uuidString.prefix(5)) panel=\(panelId.uuidString.prefix(5)) " + + "tab=\(tabId.uuid.uuidString.prefix(5)) reason=closeTabRejected elapsedMs=\(debugElapsedMs(since: detachStart))" + ) +#endif return nil } - return pendingDetachedSurfaces.removeValue(forKey: tabId) + let detached = pendingDetachedSurfaces.removeValue(forKey: tabId) +#if DEBUG + dlog( + "split.detach.end ws=\(id.uuidString.prefix(5)) panel=\(panelId.uuidString.prefix(5)) " + + "tab=\(tabId.uuid.uuidString.prefix(5)) transfer=\(detached != nil ? 1 : 0) " + + "elapsedMs=\(debugElapsedMs(since: detachStart))" + ) +#endif + return detached } @discardableResult @@ -2212,8 +2243,31 @@ final class Workspace: Identifiable, ObservableObject { atIndex index: Int? = nil, focus: Bool = true ) -> UUID? { - guard bonsplitController.allPaneIds.contains(paneId) else { return nil } - guard panels[detached.panelId] == nil else { return nil } +#if DEBUG + let attachStart = ProcessInfo.processInfo.systemUptime + dlog( + "split.attach.begin ws=\(id.uuidString.prefix(5)) panel=\(detached.panelId.uuidString.prefix(5)) " + + "pane=\(paneId.id.uuidString.prefix(5)) index=\(index.map(String.init) ?? "nil") focus=\(focus ? 1 : 0)" + ) +#endif + guard bonsplitController.allPaneIds.contains(paneId) else { +#if DEBUG + dlog( + "split.attach.fail ws=\(id.uuidString.prefix(5)) panel=\(detached.panelId.uuidString.prefix(5)) " + + "reason=invalidPane elapsedMs=\(debugElapsedMs(since: attachStart))" + ) +#endif + return nil + } + guard panels[detached.panelId] == nil else { +#if DEBUG + dlog( + "split.attach.fail ws=\(id.uuidString.prefix(5)) panel=\(detached.panelId.uuidString.prefix(5)) " + + "reason=panelExists elapsedMs=\(debugElapsedMs(since: attachStart))" + ) +#endif + return nil + } panels[detached.panelId] = detached.panel if let terminalPanel = detached.panel as? TerminalPanel { @@ -2264,6 +2318,12 @@ final class Workspace: Identifiable, ObservableObject { manualUnreadPanelIds.remove(detached.panelId) manualUnreadMarkedAt.removeValue(forKey: detached.panelId) panelSubscriptions.removeValue(forKey: detached.panelId) +#if DEBUG + dlog( + "split.attach.fail ws=\(id.uuidString.prefix(5)) panel=\(detached.panelId.uuidString.prefix(5)) " + + "reason=createTabFailed elapsedMs=\(debugElapsedMs(since: attachStart))" + ) +#endif return nil } @@ -2285,6 +2345,14 @@ final class Workspace: Identifiable, ObservableObject { } scheduleTerminalGeometryReconcile() +#if DEBUG + dlog( + "split.attach.end ws=\(id.uuidString.prefix(5)) panel=\(detached.panelId.uuidString.prefix(5)) " + + "tab=\(newTabId.uuid.uuidString.prefix(5)) pane=\(paneId.id.uuidString.prefix(5)) " + + "index=\(index.map(String.init) ?? "nil") focus=\(focus ? 1 : 0) " + + "elapsedMs=\(debugElapsedMs(since: attachStart))" + ) +#endif return detached.panelId } // MARK: - Focus Management @@ -2833,23 +2901,41 @@ final class Workspace: Identifiable, ObservableObject { private func handleExternalTabDrop(_ request: BonsplitController.ExternalTabDropRequest) -> Bool { guard let app = AppDelegate.shared else { return false } +#if DEBUG + let dropStart = ProcessInfo.processInfo.systemUptime +#endif let targetPane: PaneID let targetIndex: Int? let splitTarget: (orientation: SplitOrientation, insertFirst: Bool)? +#if DEBUG + let destinationLabel: String +#endif switch request.destination { case .insert(let paneId, let index): targetPane = paneId targetIndex = index splitTarget = nil +#if DEBUG + destinationLabel = "insert pane=\(paneId.id.uuidString.prefix(5)) index=\(index.map(String.init) ?? "nil")" +#endif case .split(let paneId, let orientation, let insertFirst): targetPane = paneId targetIndex = nil splitTarget = (orientation, insertFirst) +#if DEBUG + destinationLabel = "split pane=\(paneId.id.uuidString.prefix(5)) orientation=\(orientation.rawValue) insertFirst=\(insertFirst ? 1 : 0)" +#endif } - return app.moveBonsplitTab( + #if DEBUG + dlog( + "split.externalDrop.begin ws=\(id.uuidString.prefix(5)) tab=\(request.tabId.uuid.uuidString.prefix(5)) " + + "sourcePane=\(request.sourcePaneId.id.uuidString.prefix(5)) destination=\(destinationLabel)" + ) + #endif + let moved = app.moveBonsplitTab( tabId: request.tabId.uuid, toWorkspace: id, targetPane: targetPane, @@ -2858,6 +2944,13 @@ final class Workspace: Identifiable, ObservableObject { focus: true, focusWindow: true ) +#if DEBUG + dlog( + "split.externalDrop.end ws=\(id.uuidString.prefix(5)) tab=\(request.tabId.uuid.uuidString.prefix(5)) " + + "moved=\(moved ? 1 : 0) elapsedMs=\(debugElapsedMs(since: dropStart))" + ) +#endif + return moved } } @@ -3241,9 +3334,18 @@ extension Workspace: BonsplitDelegate { func splitTabBar(_ controller: BonsplitController, didMoveTab tab: Bonsplit.Tab, fromPane source: PaneID, toPane destination: PaneID) { #if DEBUG + let now = ProcessInfo.processInfo.systemUptime + let sincePrev: String + if debugLastDidMoveTabTimestamp > 0 { + sincePrev = String(format: "%.2f", (now - debugLastDidMoveTabTimestamp) * 1000) + } else { + sincePrev = "first" + } + debugLastDidMoveTabTimestamp = now + debugDidMoveTabEventCount += 1 let movedPanel = panelIdFromSurfaceId(tab.id)?.uuidString.prefix(5) ?? "unknown" dlog( - "split.moveTab panel=\(movedPanel) " + + "split.moveTab idx=\(debugDidMoveTabEventCount) dtSincePrevMs=\(sincePrev) panel=\(movedPanel) " + "from=\(source.id.uuidString.prefix(5)) to=\(destination.id.uuidString.prefix(5)) " + "sourceTabs=\(controller.tabs(inPane: source).count) destTabs=\(controller.tabs(inPane: destination).count)" ) From 6c6f363e4bd121f8e09c245ad753f428cd0774f0 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:20:55 -0800 Subject: [PATCH 203/214] Guard terminal onFocus from re-entrant focus loops --- Sources/GhosttyTerminalView.swift | 4 +- Sources/Workspace.swift | 33 ++++++++-- Sources/WorkspaceContentView.swift | 2 +- ..._focus_panel_reentrant_guard_regression.py | 64 +++++++++++++++++++ 4 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 tests/test_focus_panel_reentrant_guard_regression.py diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 1e614aad..68e717ed 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -2598,6 +2598,7 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { override func becomeFirstResponder() -> Bool { let result = super.becomeFirstResponder() + var shouldApplySurfaceFocus = false if result { // If we become first responder before the ghostty surface exists (e.g. during // split/tab creation while the surface is still being created), record the desired focus. @@ -2619,6 +2620,7 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { // stayed behind. let hiddenInHierarchy = isHiddenOrHasHiddenAncestor if isVisibleInUI && hasUsableFocusGeometry && !hiddenInHierarchy { + shouldApplySurfaceFocus = true onFocus?() } else if isVisibleInUI && (!hasUsableFocusGeometry || hiddenInHierarchy) { #if DEBUG @@ -2629,7 +2631,7 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { #endif } } - if result, let surface = ensureSurfaceReadyForInput() { + if result, shouldApplySurfaceFocus, let surface = ensureSurfaceReadyForInput() { let now = CACurrentMediaTime() let deltaMs = (now - lastScrollEventTime) * 1000 Self.focusLog("becomeFirstResponder: surface=\(terminalSurface?.id.uuidString ?? "nil") deltaSinceScrollMs=\(String(format: "%.2f", deltaMs))") diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 28857550..7e6658f6 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -839,6 +839,11 @@ final class Workspace: Identifiable, ObservableObject { return panel } + enum FocusPanelTrigger { + case standard + case terminalFirstResponder + } + /// Published directory for each panel @Published var panelDirectories: [UUID: String] = [:] @Published var panelTitles: [UUID: String] = [:] @@ -2444,12 +2449,19 @@ final class Workspace: Identifiable, ObservableObject { terminalPanel.hostedView.ensureFocus(for: id, surfaceId: preferredPanelId) } - func focusPanel(_ panelId: UUID, previousHostedView: GhosttySurfaceScrollView? = nil) { + func focusPanel( + _ panelId: UUID, + previousHostedView: GhosttySurfaceScrollView? = nil, + trigger: FocusPanelTrigger = .standard + ) { markExplicitFocusIntent(on: panelId) #if DEBUG let pane = bonsplitController.focusedPaneId?.id.uuidString.prefix(5) ?? "nil" - dlog("focus.panel panel=\(panelId.uuidString.prefix(5)) pane=\(pane)") - FocusLogStore.shared.append("Workspace.focusPanel panelId=\(panelId.uuidString) focusedPane=\(pane)") + let triggerLabel = trigger == .terminalFirstResponder ? "firstResponder" : "standard" + dlog("focus.panel panel=\(panelId.uuidString.prefix(5)) pane=\(pane) trigger=\(triggerLabel)") + FocusLogStore.shared.append( + "Workspace.focusPanel panelId=\(panelId.uuidString) focusedPane=\(pane) trigger=\(triggerLabel)" + ) #endif guard let tabId = surfaceIdFromPanelId(panelId) else { return } let currentlyFocusedPanelId = focusedPanelId @@ -2472,6 +2484,15 @@ final class Workspace: Identifiable, ObservableObject { return bonsplitController.focusedPaneId == targetPaneId && bonsplitController.selectedTab(inPane: targetPaneId)?.id == tabId }() + let shouldSuppressReentrantRefocus = trigger == .terminalFirstResponder && selectionAlreadyConverged +#if DEBUG + if shouldSuppressReentrantRefocus { + dlog( + "focus.panel.skipReentrant panel=\(panelId.uuidString.prefix(5)) " + + "reason=firstResponderAlreadyConverged" + ) + } +#endif if let targetPaneId, !selectionAlreadyConverged { bonsplitController.focusPane(targetPaneId) @@ -2483,11 +2504,11 @@ final class Workspace: Identifiable, ObservableObject { // Also focus the underlying panel if let panel = panels[panelId] { - if currentlyFocusedPanelId != panelId || !selectionAlreadyConverged { + if (currentlyFocusedPanelId != panelId || !selectionAlreadyConverged) && !shouldSuppressReentrantRefocus { panel.focus() } - if let terminalPanel = panel as? TerminalPanel { + if !shouldSuppressReentrantRefocus, let terminalPanel = panel as? TerminalPanel { // Avoid re-entrant focus loops when focus was initiated by AppKit first-responder // (becomeFirstResponder -> onFocus -> focusPanel). if !terminalPanel.hostedView.isSurfaceViewFirstResponder() { @@ -2495,7 +2516,7 @@ final class Workspace: Identifiable, ObservableObject { } } } - if let targetPaneId { + if let targetPaneId, !shouldSuppressReentrantRefocus { applyTabSelection(tabId: tabId, inPane: targetPaneId) } } diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index d209b4d2..392f9986 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -67,7 +67,7 @@ struct WorkspaceContentView: View { // indicator and where keyboard input/flash-focus actually lands. guard isWorkspaceInputActive else { return } guard workspace.panels[panel.id] != nil else { return } - workspace.focusPanel(panel.id) + workspace.focusPanel(panel.id, trigger: .terminalFirstResponder) }, onRequestPanelFocus: { guard isWorkspaceInputActive else { return } diff --git a/tests/test_focus_panel_reentrant_guard_regression.py b/tests/test_focus_panel_reentrant_guard_regression.py new file mode 100644 index 00000000..fbe2a5c3 --- /dev/null +++ b/tests/test_focus_panel_reentrant_guard_regression.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +"""Static regression checks for re-entrant terminal focus guard. + +Guards the fix for split-drag focus churn where: +becomeFirstResponder -> onFocus -> Workspace.focusPanel -> refocus side-effects +could repeatedly re-enter and spike CPU. +""" + +from __future__ import annotations + +import subprocess +from pathlib import Path + + +def repo_root() -> Path: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return Path(result.stdout.strip()) + return Path(__file__).resolve().parents[1] + + +def main() -> int: + root = repo_root() + failures: list[str] = [] + + workspace_path = root / "Sources" / "Workspace.swift" + workspace_source = workspace_path.read_text(encoding="utf-8") + + required_workspace_snippets = [ + "enum FocusPanelTrigger {", + "case terminalFirstResponder", + "trigger: FocusPanelTrigger = .standard", + "let shouldSuppressReentrantRefocus = trigger == .terminalFirstResponder && selectionAlreadyConverged", + "if let targetPaneId, !shouldSuppressReentrantRefocus {", + "reason=firstResponderAlreadyConverged", + ] + for snippet in required_workspace_snippets: + if snippet not in workspace_source: + failures.append(f"Workspace focus guard missing snippet: {snippet}") + + workspace_content_view_path = root / "Sources" / "WorkspaceContentView.swift" + workspace_content_view_source = workspace_content_view_path.read_text(encoding="utf-8") + focus_callback_snippet = "workspace.focusPanel(panel.id, trigger: .terminalFirstResponder)" + if focus_callback_snippet not in workspace_content_view_source: + failures.append( + "WorkspaceContentView terminal onFocus callback no longer passes .terminalFirstResponder trigger" + ) + + if failures: + print("FAIL: focus-panel re-entrant guard regression checks failed") + for item in failures: + print(f" - {item}") + return 1 + + print("PASS: focus-panel re-entrant guard is in place") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 6505f0c5047dee991519846b35c76a6faea4059a Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:57:09 -0800 Subject: [PATCH 204/214] Fix tab drag blank state and preserve non-custom titles across window drops --- GhosttyTabs.xcodeproj/project.pbxproj | 92 ++++++++++--------- Sources/GhosttyTerminalView.swift | 77 ++++++++++++++-- Sources/Workspace.swift | 29 +++++- Sources/WorkspaceContentView.swift | 17 +++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 45 +++++++++ .../WorkspaceContentViewVisibilityTests.swift | 49 ++++++++++ 6 files changed, 252 insertions(+), 57 deletions(-) create mode 100644 cmuxTests/WorkspaceContentViewVisibilityTests.swift diff --git a/GhosttyTabs.xcodeproj/project.pbxproj b/GhosttyTabs.xcodeproj/project.pbxproj index 7a798706..dc05ce47 100644 --- a/GhosttyTabs.xcodeproj/project.pbxproj +++ b/GhosttyTabs.xcodeproj/project.pbxproj @@ -74,13 +74,14 @@ D0E0F0B0A1B2C3D4E5F60718 /* BrowserPaneNavigationKeybindUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E0F0B1A1B2C3D4E5F60718 /* BrowserPaneNavigationKeybindUITests.swift */; }; D0E0F0B2A1B2C3D4E5F60718 /* BrowserOmnibarSuggestionsUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E0F0B3A1B2C3D4E5F60718 /* BrowserOmnibarSuggestionsUITests.swift */; }; E1000000A1B2C3D4E5F60718 /* MenuKeyEquivalentRoutingUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1000001A1B2C3D4E5F60718 /* MenuKeyEquivalentRoutingUITests.swift */; }; - F1000000A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1000001A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift */; }; - F2000000A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */; }; - F3000000A1B2C3D4E5F60718 /* CJKIMEInputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */; }; - F4000000A1B2C3D4E5F60718 /* GhosttyConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */; }; - F5000000A1B2C3D4E5F60718 /* SessionPersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5000001A1B2C3D4E5F60718 /* SessionPersistenceTests.swift */; }; - F6000000A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */; }; - /* End PBXBuildFile section */ + F1000000A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1000001A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift */; }; + F2000000A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */; }; + F3000000A1B2C3D4E5F60718 /* CJKIMEInputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */; }; + F4000000A1B2C3D4E5F60718 /* GhosttyConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */; }; + F5000000A1B2C3D4E5F60718 /* SessionPersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5000001A1B2C3D4E5F60718 /* SessionPersistenceTests.swift */; }; + F6000000A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */; }; + F7000000A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7000001A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift */; }; + /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ A5001020 /* Embed Frameworks */ = { @@ -199,16 +200,17 @@ B9000016A1B2C3D4E5F60719 /* MultiWindowNotificationsUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiWindowNotificationsUITests.swift; sourceTree = "<group>"; }; B9000019A1B2C3D4E5F60719 /* CloseWorkspaceConfirmDialogUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseWorkspaceConfirmDialogUITests.swift; sourceTree = "<group>"; }; B9000022A1B2C3D4E5F60719 /* CloseWorkspaceCmdDUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseWorkspaceCmdDUITests.swift; sourceTree = "<group>"; }; - D0E0F0B1A1B2C3D4E5F60718 /* BrowserPaneNavigationKeybindUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowserPaneNavigationKeybindUITests.swift; sourceTree = "<group>"; }; - D0E0F0B3A1B2C3D4E5F60718 /* BrowserOmnibarSuggestionsUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowserOmnibarSuggestionsUITests.swift; sourceTree = "<group>"; }; - E1000001A1B2C3D4E5F60718 /* MenuKeyEquivalentRoutingUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuKeyEquivalentRoutingUITests.swift; sourceTree = "<group>"; }; - F1000001A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmuxWebViewKeyEquivalentTests.swift; sourceTree = "<group>"; }; - F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePillReleaseVisibilityTests.swift; sourceTree = "<group>"; }; - F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CJKIMEInputTests.swift; sourceTree = "<group>"; }; - F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhosttyConfigTests.swift; sourceTree = "<group>"; }; - F5000001A1B2C3D4E5F60718 /* SessionPersistenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionPersistenceTests.swift; sourceTree = "<group>"; }; - F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegateShortcutRoutingTests.swift; sourceTree = "<group>"; }; - /* End PBXFileReference section */ + D0E0F0B1A1B2C3D4E5F60718 /* BrowserPaneNavigationKeybindUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowserPaneNavigationKeybindUITests.swift; sourceTree = "<group>"; }; + D0E0F0B3A1B2C3D4E5F60718 /* BrowserOmnibarSuggestionsUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowserOmnibarSuggestionsUITests.swift; sourceTree = "<group>"; }; + E1000001A1B2C3D4E5F60718 /* MenuKeyEquivalentRoutingUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuKeyEquivalentRoutingUITests.swift; sourceTree = "<group>"; }; + F1000001A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmuxWebViewKeyEquivalentTests.swift; sourceTree = "<group>"; }; + F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePillReleaseVisibilityTests.swift; sourceTree = "<group>"; }; + F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CJKIMEInputTests.swift; sourceTree = "<group>"; }; + F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhosttyConfigTests.swift; sourceTree = "<group>"; }; + F5000001A1B2C3D4E5F60718 /* SessionPersistenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionPersistenceTests.swift; sourceTree = "<group>"; }; + F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegateShortcutRoutingTests.swift; sourceTree = "<group>"; }; + F7000001A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceContentViewVisibilityTests.swift; sourceTree = "<group>"; }; + /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ A5001030 /* Frameworks */ = { @@ -408,19 +410,20 @@ path = cmuxUITests; sourceTree = "<group>"; }; - F1000003A1B2C3D4E5F60718 /* cmuxTests */ = { - isa = PBXGroup; - children = ( - F1000001A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift */, - F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */, - F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */, - F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */, - F5000001A1B2C3D4E5F60718 /* SessionPersistenceTests.swift */, - F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */, - ); - path = cmuxTests; - sourceTree = "<group>"; - }; + F1000003A1B2C3D4E5F60718 /* cmuxTests */ = { + isa = PBXGroup; + children = ( + F1000001A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift */, + F2000001A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift */, + F3000001A1B2C3D4E5F60718 /* CJKIMEInputTests.swift */, + F4000001A1B2C3D4E5F60718 /* GhosttyConfigTests.swift */, + F5000001A1B2C3D4E5F60718 /* SessionPersistenceTests.swift */, + F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */, + F7000001A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift */, + ); + path = cmuxTests; + sourceTree = "<group>"; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -611,20 +614,21 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F1000005A1B2C3D4E5F60718 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F1000000A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift in Sources */, - F2000000A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift in Sources */, - F3000000A1B2C3D4E5F60718 /* CJKIMEInputTests.swift in Sources */, - F4000000A1B2C3D4E5F60718 /* GhosttyConfigTests.swift in Sources */, - F5000000A1B2C3D4E5F60718 /* SessionPersistenceTests.swift in Sources */, - F6000000A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B9000006A1B2C3D4E5F60719 /* Sources */ = { + F1000005A1B2C3D4E5F60718 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F1000000A1B2C3D4E5F60718 /* CmuxWebViewKeyEquivalentTests.swift in Sources */, + F2000000A1B2C3D4E5F60718 /* UpdatePillReleaseVisibilityTests.swift in Sources */, + F3000000A1B2C3D4E5F60718 /* CJKIMEInputTests.swift in Sources */, + F4000000A1B2C3D4E5F60718 /* GhosttyConfigTests.swift in Sources */, + F5000000A1B2C3D4E5F60718 /* SessionPersistenceTests.swift in Sources */, + F6000000A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift in Sources */, + F7000000A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B9000006A1B2C3D4E5F60719 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 68e717ed..6643f58b 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -4185,9 +4185,11 @@ final class GhosttySurfaceScrollView: NSView { isHidden = !visible #if DEBUG if wasVisible != visible { + let transition = "\(wasVisible ? 1 : 0)->\(visible ? 1 : 0)" + let suffix = debugVisibilityStateSuffix(transition: transition) debugLogWorkspaceSwitchTiming( event: "ws.term.visible", - suffix: "surface=\(surfaceView.terminalSurface?.id.uuidString.prefix(5) ?? "nil") value=\(visible ? 1 : 0)" + suffix: suffix ) } #endif @@ -4207,9 +4209,11 @@ final class GhosttySurfaceScrollView: NSView { isActive = active #if DEBUG if wasActive != active { + let transition = "\(wasActive ? 1 : 0)->\(active ? 1 : 0)" + let suffix = debugVisibilityStateSuffix(transition: transition) debugLogWorkspaceSwitchTiming( event: "ws.term.active", - suffix: "surface=\(surfaceView.terminalSurface?.id.uuidString.prefix(5) ?? "nil") value=\(active ? 1 : 0)" + suffix: suffix ) } #endif @@ -4231,6 +4235,37 @@ final class GhosttySurfaceScrollView: NSView { let dtMs = (CACurrentMediaTime() - snapshot.startedAt) * 1000 dlog("\(event) id=\(snapshot.id) dt=\(String(format: "%.2fms", dtMs)) \(suffix)") } + + private func debugFirstResponderLabel() -> String { + guard let window, let firstResponder = window.firstResponder else { return "nil" } + if let view = firstResponder as? NSView { + if view === surfaceView { + return "surfaceView" + } + if view.isDescendant(of: surfaceView) { + return "surfaceDescendant" + } + return String(describing: type(of: view)) + } + return String(describing: type(of: firstResponder)) + } + + private func debugVisibilityStateSuffix(transition: String) -> String { + let surface = surfaceView.terminalSurface?.id.uuidString.prefix(5) ?? "nil" + let hiddenInHierarchy = (isHiddenOrHasHiddenAncestor || surfaceView.isHiddenOrHasHiddenAncestor) ? 1 : 0 + let inWindow = window != nil ? 1 : 0 + let hasSuperview = superview != nil ? 1 : 0 + let hostHidden = isHidden ? 1 : 0 + let surfaceHidden = surfaceView.isHidden ? 1 : 0 + let boundsText = String(format: "%.1fx%.1f", bounds.width, bounds.height) + let frameText = String(format: "%.1fx%.1f", frame.width, frame.height) + let responder = debugFirstResponderLabel() + return + "surface=\(surface) transition=\(transition) active=\(isActive ? 1 : 0) " + + "visibleFlag=\(surfaceView.isVisibleInUI ? 1 : 0) hostHidden=\(hostHidden) surfaceHidden=\(surfaceHidden) " + + "hiddenHierarchy=\(hiddenInHierarchy) inWindow=\(inWindow) hasSuperview=\(hasSuperview) " + + "bounds=\(boundsText) frame=\(frameText) firstResponder=\(responder)" + } #endif func moveFocus(from previous: GhosttySurfaceScrollView? = nil, delay: TimeInterval? = nil) { @@ -5082,32 +5117,36 @@ struct GhosttyTerminalView: NSViewRepresentable { func updateNSView(_ nsView: NSView, context: Context) { let hostedView = terminalSurface.hostedView let coordinator = context.coordinator -#if DEBUG let previousDesiredIsActive = coordinator.desiredIsActive -#endif let previousDesiredIsVisibleInUI = coordinator.desiredIsVisibleInUI let previousDesiredShowsUnreadNotificationRing = coordinator.desiredShowsUnreadNotificationRing let previousDesiredPortalZPriority = coordinator.desiredPortalZPriority + let desiredStateChanged = + previousDesiredIsActive != isActive || + previousDesiredIsVisibleInUI != isVisibleInUI || + previousDesiredPortalZPriority != portalZPriority coordinator.desiredIsActive = isActive coordinator.desiredIsVisibleInUI = isVisibleInUI coordinator.desiredShowsUnreadNotificationRing = showsUnreadNotificationRing coordinator.desiredPortalZPriority = portalZPriority coordinator.hostedView = hostedView #if DEBUG - if previousDesiredIsActive != isActive || - previousDesiredIsVisibleInUI != isVisibleInUI || - previousDesiredPortalZPriority != portalZPriority { + if desiredStateChanged { if let snapshot = AppDelegate.shared?.tabManager?.debugCurrentWorkspaceSwitchSnapshot() { let dtMs = (CACurrentMediaTime() - snapshot.startedAt) * 1000 dlog( "ws.swiftui.update id=\(snapshot.id) dt=\(String(format: "%.2fms", dtMs)) " + "surface=\(terminalSurface.id.uuidString.prefix(5)) visible=\(isVisibleInUI ? 1 : 0) " + - "active=\(isActive ? 1 : 0) z=\(portalZPriority)" + "active=\(isActive ? 1 : 0) z=\(portalZPriority) " + + "hostWindow=\(nsView.window != nil ? 1 : 0) hostedWindow=\(hostedView.window != nil ? 1 : 0) " + + "hostedSuperview=\(hostedView.superview != nil ? 1 : 0)" ) } else { dlog( "ws.swiftui.update id=none surface=\(terminalSurface.id.uuidString.prefix(5)) " + - "visible=\(isVisibleInUI ? 1 : 0) active=\(isActive ? 1 : 0) z=\(portalZPriority)" + "visible=\(isVisibleInUI ? 1 : 0) active=\(isActive ? 1 : 0) z=\(portalZPriority) " + + "hostWindow=\(nsView.window != nil ? 1 : 0) hostedWindow=\(hostedView.window != nil ? 1 : 0) " + + "hostedSuperview=\(hostedView.superview != nil ? 1 : 0)" ) } } @@ -5195,6 +5234,16 @@ struct GhosttyTerminalView: NSViewRepresentable { // Bind is deferred until host moves into a window. Update the // existing portal entry's visibleInUI now so that any portal sync // that runs before the deferred bind completes won't hide the view. +#if DEBUG + if desiredStateChanged { + dlog( + "ws.hostState.deferBind surface=\(terminalSurface.id.uuidString.prefix(5)) " + + "reason=hostNoWindow visible=\(coordinator.desiredIsVisibleInUI ? 1 : 0) " + + "active=\(coordinator.desiredIsActive ? 1 : 0) z=\(coordinator.desiredPortalZPriority) " + + "hostedWindow=\(hostedView.window != nil ? 1 : 0) hostedSuperview=\(hostedView.superview != nil ? 1 : 0)" + ) + } +#endif TerminalWindowPortalRegistry.updateEntryVisibility( for: hostedView, visibleInUI: coordinator.desiredIsVisibleInUI @@ -5218,6 +5267,16 @@ struct GhosttyTerminalView: NSViewRepresentable { } else { // Preserve portal entry visibility while a stale host is still receiving SwiftUI updates. // The currently bound host remains authoritative for immediate visible/active state. +#if DEBUG + if desiredStateChanged { + dlog( + "ws.hostState.deferApply surface=\(terminalSurface.id.uuidString.prefix(5)) " + + "reason=staleHostBinding hostWindow=\(hostWindowAttached ? 1 : 0) " + + "boundToCurrent=\(isBoundToCurrentHost ? 1 : 0) hostedSuperview=\(hostedView.superview != nil ? 1 : 0) " + + "visible=\(isVisibleInUI ? 1 : 0) active=\(isActive ? 1 : 0)" + ) + } +#endif TerminalWindowPortalRegistry.updateEntryVisibility( for: hostedView, visibleInUI: isVisibleInUI diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 7e6658f6..d107e54e 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -3265,17 +3265,19 @@ extension Workspace: BonsplitDelegate { if isDetaching, let panel { let browserPanel = panel as? BrowserPanel + let cachedTitle = panelTitles[panelId] + let transferFallbackTitle = cachedTitle ?? panel.displayTitle pendingDetachedSurfaces[tabId] = DetachedSurfaceTransfer( panelId: panelId, panel: panel, - title: resolvedPanelTitle(panelId: panelId, fallback: panel.displayTitle), + title: resolvedPanelTitle(panelId: panelId, fallback: transferFallbackTitle), icon: panel.displayIcon, iconImageData: browserPanel?.faviconPNGData, kind: surfaceKind(for: panel), isLoading: browserPanel?.isLoading ?? false, isPinned: pinnedPanelIds.contains(panelId), directory: panelDirectories[panelId], - cachedTitle: panelTitles[panelId], + cachedTitle: cachedTitle, customTitle: panelCustomTitles[panelId], manuallyUnread: manualUnreadPanelIds.contains(panelId) ) @@ -3364,14 +3366,35 @@ extension Workspace: BonsplitDelegate { } debugLastDidMoveTabTimestamp = now debugDidMoveTabEventCount += 1 - let movedPanel = panelIdFromSurfaceId(tab.id)?.uuidString.prefix(5) ?? "unknown" + let movedPanelId = panelIdFromSurfaceId(tab.id) + let movedPanel = movedPanelId?.uuidString.prefix(5) ?? "unknown" + let selectedBefore = controller.selectedTab(inPane: destination) + .map { String(String(describing: $0.id).prefix(5)) } ?? "nil" + let focusedPaneBefore = controller.focusedPaneId?.id.uuidString.prefix(5) ?? "nil" + let focusedPanelBefore = focusedPanelId?.uuidString.prefix(5) ?? "nil" dlog( "split.moveTab idx=\(debugDidMoveTabEventCount) dtSincePrevMs=\(sincePrev) panel=\(movedPanel) " + "from=\(source.id.uuidString.prefix(5)) to=\(destination.id.uuidString.prefix(5)) " + "sourceTabs=\(controller.tabs(inPane: source).count) destTabs=\(controller.tabs(inPane: destination).count)" ) + dlog( + "split.moveTab.state.before idx=\(debugDidMoveTabEventCount) panel=\(movedPanel) " + + "destSelected=\(selectedBefore) focusedPane=\(focusedPaneBefore) focusedPanel=\(focusedPanelBefore)" + ) #endif applyTabSelection(tabId: tab.id, inPane: destination) +#if DEBUG + let selectedAfter = controller.selectedTab(inPane: destination) + .map { String(String(describing: $0.id).prefix(5)) } ?? "nil" + let focusedPaneAfter = controller.focusedPaneId?.id.uuidString.prefix(5) ?? "nil" + let focusedPanelAfter = focusedPanelId?.uuidString.prefix(5) ?? "nil" + let movedPanelFocused = (movedPanelId != nil && movedPanelId == focusedPanelId) ? 1 : 0 + dlog( + "split.moveTab.state.after idx=\(debugDidMoveTabEventCount) panel=\(movedPanel) " + + "destSelected=\(selectedAfter) focusedPane=\(focusedPaneAfter) focusedPanel=\(focusedPanelAfter) " + + "movedFocused=\(movedPanelFocused)" + ) +#endif normalizePinnedTabs(in: source) normalizePinnedTabs(in: destination) scheduleTerminalGeometryReconcile() diff --git a/Sources/WorkspaceContentView.swift b/Sources/WorkspaceContentView.swift index 392f9986..3e058a47 100644 --- a/Sources/WorkspaceContentView.swift +++ b/Sources/WorkspaceContentView.swift @@ -19,6 +19,17 @@ struct WorkspaceContentView: View { @Environment(\.colorScheme) private var colorScheme @EnvironmentObject var notificationStore: TerminalNotificationStore + static func panelVisibleInUI( + isWorkspaceVisible: Bool, + isSelectedInPane: Bool, + isFocused: Bool + ) -> Bool { + guard isWorkspaceVisible else { return false } + // During pane/tab reparenting, Bonsplit can transiently report selected=false + // for the currently focused panel. Keep focused content visible to avoid blank frames. + return isSelectedInPane || isFocused + } + var body: some View { let appearance = PanelAppearance.fromConfig(config) let isSplit = workspace.bonsplitController.allPaneIds.count > 1 || @@ -47,7 +58,11 @@ struct WorkspaceContentView: View { if let panel = workspace.panel(for: tab.id) { let isFocused = isWorkspaceInputActive && workspace.focusedPanelId == panel.id let isSelectedInPane = workspace.bonsplitController.selectedTab(inPane: paneId)?.id == tab.id - let isVisibleInUI = isWorkspaceVisible && isSelectedInPane + let isVisibleInUI = Self.panelVisibleInUI( + isWorkspaceVisible: isWorkspaceVisible, + isSelectedInPane: isSelectedInPane, + isFocused: isFocused + ) let hasUnreadNotification = Workspace.shouldShowUnreadIndicator( hasUnreadNotification: notificationStore.hasUnreadNotification(forTabId: workspace.id, surfaceId: panel.id), isManuallyUnread: workspace.manualUnreadPanelIds.contains(panel.id) diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 12265867..11664821 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -3147,6 +3147,51 @@ final class WorkspacePanelGitBranchTests: XCTestCase { #endif } + func testDetachAttachAcrossWorkspacesPreservesNonCustomPanelTitle() { + let source = Workspace() + guard let panelId = source.focusedPanelId else { + XCTFail("Expected source focused panel") + return + } + + XCTAssertTrue(source.updatePanelTitle(panelId: panelId, title: "detached-runtime-title")) + + guard let detached = source.detachSurface(panelId: panelId) else { + XCTFail("Expected detach to succeed") + return + } + + XCTAssertEqual(detached.cachedTitle, "detached-runtime-title") + XCTAssertNil(detached.customTitle) + XCTAssertEqual( + detached.title, + "detached-runtime-title", + "Detached transfer should carry the cached non-custom title" + ) + + let destination = Workspace() + guard let destinationPane = destination.bonsplitController.allPaneIds.first else { + XCTFail("Expected destination pane") + return + } + + let attachedPanelId = destination.attachDetachedSurface( + detached, + inPane: destinationPane, + focus: false + ) + XCTAssertEqual(attachedPanelId, panelId) + XCTAssertEqual(destination.panelTitle(panelId: panelId), "detached-runtime-title") + + guard let attachedTabId = destination.surfaceIdFromPanelId(panelId), + let attachedTab = destination.bonsplitController.tab(attachedTabId) else { + XCTFail("Expected attached tab mapping") + return + } + XCTAssertEqual(attachedTab.title, "detached-runtime-title") + XCTAssertFalse(attachedTab.hasCustomTitle) + } + func testBrowserSplitWithFocusFalseRecoversFromDelayedStaleSelection() { let workspace = Workspace() guard let originalFocusedPanelId = workspace.focusedPanelId else { diff --git a/cmuxTests/WorkspaceContentViewVisibilityTests.swift b/cmuxTests/WorkspaceContentViewVisibilityTests.swift new file mode 100644 index 00000000..6e8d62e3 --- /dev/null +++ b/cmuxTests/WorkspaceContentViewVisibilityTests.swift @@ -0,0 +1,49 @@ +import XCTest + +#if canImport(cmux_DEV) +@testable import cmux_DEV +#elseif canImport(cmux) +@testable import cmux +#endif + +final class WorkspaceContentViewVisibilityTests: XCTestCase { + func testPanelVisibleInUIReturnsFalseWhenWorkspaceHidden() { + XCTAssertFalse( + WorkspaceContentView.panelVisibleInUI( + isWorkspaceVisible: false, + isSelectedInPane: true, + isFocused: true + ) + ) + } + + func testPanelVisibleInUIReturnsTrueForSelectedPanel() { + XCTAssertTrue( + WorkspaceContentView.panelVisibleInUI( + isWorkspaceVisible: true, + isSelectedInPane: true, + isFocused: false + ) + ) + } + + func testPanelVisibleInUIReturnsTrueForFocusedPanelDuringTransientSelectionGap() { + XCTAssertTrue( + WorkspaceContentView.panelVisibleInUI( + isWorkspaceVisible: true, + isSelectedInPane: false, + isFocused: true + ) + ) + } + + func testPanelVisibleInUIReturnsFalseWhenNeitherSelectedNorFocused() { + XCTAssertFalse( + WorkspaceContentView.panelVisibleInUI( + isWorkspaceVisible: true, + isSelectedInPane: false, + isFocused: false + ) + ) + } +} From ab1368828bf94a56dff4eff10c2b9627fb9b781d Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Mon, 23 Feb 2026 23:57:13 -0800 Subject: [PATCH 205/214] Fix browser Return/Enter routing and add enter trace logs --- Sources/AppDelegate.swift | 65 +++++++++- Sources/Panels/CmuxWebView.swift | 111 +++++++++++++++++- cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 36 ++++++ 3 files changed, 206 insertions(+), 6 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index ac461f9b..b743a4b7 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -3962,6 +3962,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent guard let self else { return event } if event.type == .keyDown { #if DEBUG + let isEnterKey = event.keyCode == 36 || event.keyCode == 76 if (ProcessInfo.processInfo.environment["CMUX_KEY_LATENCY_PROBE"] == "1" || UserDefaults.standard.bool(forKey: "cmuxKeyLatencyProbe")), event.timestamp > 0 { @@ -3973,18 +3974,36 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent dlog( "monitor.keyDown: \(NSWindow.keyDescription(event)) fr=\(frType) addrBarId=\(self.browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil") \(self.debugShortcutRouteSnapshot(event: event))" ) + if isEnterKey { + dlog( + "enter.trace stage=app.monitor.pre event=\(NSWindow.keyDescription(event)) " + + "fr=\(frType) addrBarId=\(self.browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil")" + ) + } if let probeKind = self.developerToolsShortcutProbeKind(event: event) { self.logDeveloperToolsShortcutSnapshot(phase: "monitor.pre.\(probeKind)", event: event) } #endif if self.handleCustomShortcut(event: event) { #if DEBUG + if isEnterKey { + dlog( + "enter.trace stage=app.monitor.consume event=\(NSWindow.keyDescription(event)) " + + "reason=handleCustomShortcut" + ) + } dlog(" → consumed by handleCustomShortcut") DebugEventLog.shared.dump() #endif return nil // Consume the event } #if DEBUG + if isEnterKey { + dlog( + "enter.trace stage=app.monitor.pass event=\(NSWindow.keyDescription(event)) " + + "reason=handleCustomShortcutReturnedFalse" + ) + } DebugEventLog.shared.dump() #endif return event // Pass through @@ -5127,7 +5146,18 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent /// through the same app-level shortcut handler used by the local key monitor. @discardableResult func handleBrowserSurfaceKeyEquivalent(_ event: NSEvent) -> Bool { - handleCustomShortcut(event: event) + let consumed = handleCustomShortcut(event: event) +#if DEBUG + if event.keyCode == 36 || event.keyCode == 76 { + let frType = NSApp.keyWindow?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" + dlog( + "enter.trace stage=app.browserSurfaceKeyEquivalent event=\(NSWindow.keyDescription(event)) " + + "consumed=\(consumed ? 1 : 0) fr=\(frType) " + + "addrBarId=\(browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil")" + ) + } +#endif + return consumed } #if DEBUG @@ -6585,9 +6615,19 @@ private extension NSWindow { } @objc func cmux_performKeyEquivalent(with event: NSEvent) -> Bool { + let isEnterKey = event.keyCode == 36 || event.keyCode == 76 #if DEBUG let frType = self.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" dlog("performKeyEquiv: \(Self.keyDescription(event)) fr=\(frType)") + if isEnterKey { + let frGhostty = cmuxOwningGhosttyView(for: self.firstResponder) != nil + let frWeb = self.firstResponder.flatMap { Self.cmuxOwningWebView(for: $0) } != nil + dlog( + "enter.trace stage=window.performKeyEquivalent.start event=\(Self.keyDescription(event)) " + + "fr=\(frType) frGhostty=\(frGhostty ? 1 : 0) frWeb=\(frWeb ? 1 : 0) " + + "win=\(self.windowNumber)" + ) + } #endif // When the terminal surface is the first responder, prevent SwiftUI's @@ -6618,6 +6658,12 @@ private extension NSWindow { let result = ghosttyView.performKeyEquivalent(with: event) #if DEBUG dlog(" → ghostty direct: \(result)") + if isEnterKey { + dlog( + "enter.trace stage=window.performKeyEquivalent.ghosttyDirect " + + "event=\(Self.keyDescription(event)) consumed=\(result ? 1 : 0)" + ) + } #endif return result } @@ -6639,7 +6685,16 @@ private extension NSWindow { } } - if AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true { + let consumedByBrowserSurface = AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true +#if DEBUG + if isEnterKey { + dlog( + "enter.trace stage=window.performKeyEquivalent.browserSurface event=\(Self.keyDescription(event)) " + + "consumed=\(consumedByBrowserSurface ? 1 : 0)" + ) + } +#endif + if consumedByBrowserSurface { #if DEBUG dlog(" → consumed by handleBrowserSurfaceKeyEquivalent") #endif @@ -6678,6 +6733,12 @@ private extension NSWindow { let result = cmux_performKeyEquivalent(with: event) #if DEBUG if result { dlog(" → consumed by original performKeyEquivalent") } + if isEnterKey { + dlog( + "enter.trace stage=window.performKeyEquivalent.original event=\(Self.keyDescription(event)) " + + "consumed=\(result ? 1 : 0)" + ) + } #endif return result } diff --git a/Sources/Panels/CmuxWebView.swift b/Sources/Panels/CmuxWebView.swift index 68a13282..788e417e 100644 --- a/Sources/Panels/CmuxWebView.swift +++ b/Sources/Panels/CmuxWebView.swift @@ -63,6 +63,72 @@ final class CmuxWebView: WKWebView { } var debugPointerFocusAllowanceDepth: Int { pointerFocusAllowanceDepth } +#if DEBUG + private func debugKeyDescription(_ event: NSEvent) -> String { + var parts: [String] = [] + let flags = event.modifierFlags.intersection(.deviceIndependentFlagsMask) + if flags.contains(.command) { parts.append("Cmd") } + if flags.contains(.shift) { parts.append("Shift") } + if flags.contains(.option) { parts.append("Opt") } + if flags.contains(.control) { parts.append("Ctrl") } + let chars = event.charactersIgnoringModifiers ?? "?" + parts.append("'\(chars)'(\(event.keyCode))") + return parts.joined(separator: "+") + } + + private func debugEnterTrace( + stage: String, + event: NSEvent, + consumed: Bool? = nil, + note: String? = nil + ) { + let firstResponderType = window?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" + let host = url?.host ?? "nil" + var line = + "enter.trace stage=\(stage) web=\(ObjectIdentifier(self)) " + + "event=\(debugKeyDescription(event)) fr=\(firstResponderType) " + + "win=\(window?.windowNumber ?? -1) host=\(host)" + if let consumed { + line += " consumed=\(consumed ? 1 : 0)" + } + if let note { + line += " note=\(note)" + } + dlog(line) + } + + private func debugLogActiveElementForEnter(stage: String) { + let js = """ + (() => { + const el = document.activeElement; + if (!el) return 'none'; + const tag = (el.tagName || '').toLowerCase(); + const id = el.id || '-'; + const name = el.getAttribute('name') || '-'; + const type = el.getAttribute('type') || '-'; + return `${tag}|${id}|${name}|${type}`; + })(); + """ + evaluateJavaScript(js) { [weak self] result, error in + guard let self else { return } + let activeSummary: String + if let error { + activeSummary = "error=\(error.localizedDescription)" + } else if let text = result as? String { + activeSummary = text + } else if let result { + activeSummary = String(describing: result) + } else { + activeSummary = "nil" + } + dlog( + "enter.trace stage=\(stage).dom web=\(ObjectIdentifier(self)) " + + "active=\(activeSummary)" + ) + } + } +#endif + override func becomeFirstResponder() -> Bool { guard allowsFirstResponderAcquisitionEffective else { #if DEBUG @@ -113,13 +179,27 @@ final class CmuxWebView: WKWebView { } override func performKeyEquivalent(with event: NSEvent) -> Bool { - // Preserve Cmd+Return/Enter for web content (e.g. editors/forms). Do not - // route it through app/menu key equivalents, which can trigger unintended actions. - let flags = event.modifierFlags.intersection(.deviceIndependentFlagsMask) - if flags.contains(.command), event.keyCode == 36 || event.keyCode == 76 { + if event.keyCode == 36 || event.keyCode == 76 { + // Always bypass app/menu key-equivalent routing for Return/Enter so WebKit + // receives the keyDown path used by form submission handlers. +#if DEBUG + debugEnterTrace( + stage: "web.performKeyEquivalent.bypass", + event: event, + consumed: false, + note: "returnFalseForEnter" + ) +#endif return false } + let flags = event.modifierFlags.intersection(.deviceIndependentFlagsMask) + // Menu/app shortcut routing is only needed for Command equivalents + // (New Tab, Close Tab, tab switching, split commands, etc). + guard flags.contains(.command) else { + return super.performKeyEquivalent(with: event) + } + // Let the app menu handle key equivalents first (New Tab, Close Tab, tab switching, etc). if let menu = NSApp.mainMenu, menu.performKeyEquivalent(with: event) { return true @@ -135,14 +215,37 @@ final class CmuxWebView: WKWebView { } override func keyDown(with event: NSEvent) { +#if DEBUG + if event.keyCode == 36 || event.keyCode == 76 { + debugEnterTrace(stage: "web.keyDown.pre", event: event, note: "beforeSuper") + debugLogActiveElementForEnter(stage: "web.keyDown.pre") + } +#endif + // Some Cmd-based key paths in WebKit don't consistently invoke performKeyEquivalent. // Route them through the same app-level shortcut handler as a fallback. if event.modifierFlags.intersection(.deviceIndependentFlagsMask).contains(.command), AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true { +#if DEBUG + if event.keyCode == 36 || event.keyCode == 76 { + debugEnterTrace( + stage: "web.keyDown.commandConsumed", + event: event, + consumed: true, + note: "handleBrowserSurfaceKeyEquivalent" + ) + } +#endif return } super.keyDown(with: event) +#if DEBUG + if event.keyCode == 36 || event.keyCode == 76 { + debugEnterTrace(stage: "web.keyDown.post", event: event, note: "afterSuper") + debugLogActiveElementForEnter(stage: "web.keyDown.post") + } +#endif } // MARK: - Focus on click diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 11664821..29556211 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -149,6 +149,42 @@ final class CmuxWebViewKeyEquivalentTests: XCTestCase { XCTAssertTrue(spy.invoked) } + func testReturnDoesNotRouteToMainMenuWhenWebViewIsFirstResponder() { + let spy = ActionSpy() + installMenu(spy: spy, key: "\r", modifiers: []) + + let webView = CmuxWebView(frame: .zero, configuration: WKWebViewConfiguration()) + let event = makeKeyDownEvent(key: "\r", modifiers: [], keyCode: 36) // kVK_Return + XCTAssertNotNil(event) + + XCTAssertFalse(webView.performKeyEquivalent(with: event!)) + XCTAssertFalse(spy.invoked) + } + + func testCmdReturnDoesNotRouteToMainMenuWhenWebViewIsFirstResponder() { + let spy = ActionSpy() + installMenu(spy: spy, key: "\r", modifiers: [.command]) + + let webView = CmuxWebView(frame: .zero, configuration: WKWebViewConfiguration()) + let event = makeKeyDownEvent(key: "\r", modifiers: [.command], keyCode: 36) // kVK_Return + XCTAssertNotNil(event) + + XCTAssertFalse(webView.performKeyEquivalent(with: event!)) + XCTAssertFalse(spy.invoked) + } + + func testKeypadEnterDoesNotRouteToMainMenuWhenWebViewIsFirstResponder() { + let spy = ActionSpy() + installMenu(spy: spy, key: "\r", modifiers: []) + + let webView = CmuxWebView(frame: .zero, configuration: WKWebViewConfiguration()) + let event = makeKeyDownEvent(key: "\r", modifiers: [], keyCode: 76) // kVK_ANSI_KeypadEnter + XCTAssertNotNil(event) + + XCTAssertFalse(webView.performKeyEquivalent(with: event!)) + XCTAssertFalse(spy.invoked) + } + @MainActor func testCanBlockFirstResponderAcquisitionWhenPaneIsUnfocused() { _ = NSApplication.shared From df9f1a1e6cd16bb1f69c679db16b618b661acce2 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Tue, 24 Feb 2026 00:09:53 -0800 Subject: [PATCH 206/214] Remove temporary Enter tracing instrumentation --- Sources/AppDelegate.swift | 65 +-------------------- Sources/Panels/CmuxWebView.swift | 97 -------------------------------- 2 files changed, 2 insertions(+), 160 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index b743a4b7..ac461f9b 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -3962,7 +3962,6 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent guard let self else { return event } if event.type == .keyDown { #if DEBUG - let isEnterKey = event.keyCode == 36 || event.keyCode == 76 if (ProcessInfo.processInfo.environment["CMUX_KEY_LATENCY_PROBE"] == "1" || UserDefaults.standard.bool(forKey: "cmuxKeyLatencyProbe")), event.timestamp > 0 { @@ -3974,36 +3973,18 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent dlog( "monitor.keyDown: \(NSWindow.keyDescription(event)) fr=\(frType) addrBarId=\(self.browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil") \(self.debugShortcutRouteSnapshot(event: event))" ) - if isEnterKey { - dlog( - "enter.trace stage=app.monitor.pre event=\(NSWindow.keyDescription(event)) " + - "fr=\(frType) addrBarId=\(self.browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil")" - ) - } if let probeKind = self.developerToolsShortcutProbeKind(event: event) { self.logDeveloperToolsShortcutSnapshot(phase: "monitor.pre.\(probeKind)", event: event) } #endif if self.handleCustomShortcut(event: event) { #if DEBUG - if isEnterKey { - dlog( - "enter.trace stage=app.monitor.consume event=\(NSWindow.keyDescription(event)) " + - "reason=handleCustomShortcut" - ) - } dlog(" → consumed by handleCustomShortcut") DebugEventLog.shared.dump() #endif return nil // Consume the event } #if DEBUG - if isEnterKey { - dlog( - "enter.trace stage=app.monitor.pass event=\(NSWindow.keyDescription(event)) " + - "reason=handleCustomShortcutReturnedFalse" - ) - } DebugEventLog.shared.dump() #endif return event // Pass through @@ -5146,18 +5127,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent /// through the same app-level shortcut handler used by the local key monitor. @discardableResult func handleBrowserSurfaceKeyEquivalent(_ event: NSEvent) -> Bool { - let consumed = handleCustomShortcut(event: event) -#if DEBUG - if event.keyCode == 36 || event.keyCode == 76 { - let frType = NSApp.keyWindow?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" - dlog( - "enter.trace stage=app.browserSurfaceKeyEquivalent event=\(NSWindow.keyDescription(event)) " + - "consumed=\(consumed ? 1 : 0) fr=\(frType) " + - "addrBarId=\(browserAddressBarFocusedPanelId?.uuidString.prefix(8) ?? "nil")" - ) - } -#endif - return consumed + handleCustomShortcut(event: event) } #if DEBUG @@ -6615,19 +6585,9 @@ private extension NSWindow { } @objc func cmux_performKeyEquivalent(with event: NSEvent) -> Bool { - let isEnterKey = event.keyCode == 36 || event.keyCode == 76 #if DEBUG let frType = self.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" dlog("performKeyEquiv: \(Self.keyDescription(event)) fr=\(frType)") - if isEnterKey { - let frGhostty = cmuxOwningGhosttyView(for: self.firstResponder) != nil - let frWeb = self.firstResponder.flatMap { Self.cmuxOwningWebView(for: $0) } != nil - dlog( - "enter.trace stage=window.performKeyEquivalent.start event=\(Self.keyDescription(event)) " + - "fr=\(frType) frGhostty=\(frGhostty ? 1 : 0) frWeb=\(frWeb ? 1 : 0) " + - "win=\(self.windowNumber)" - ) - } #endif // When the terminal surface is the first responder, prevent SwiftUI's @@ -6658,12 +6618,6 @@ private extension NSWindow { let result = ghosttyView.performKeyEquivalent(with: event) #if DEBUG dlog(" → ghostty direct: \(result)") - if isEnterKey { - dlog( - "enter.trace stage=window.performKeyEquivalent.ghosttyDirect " + - "event=\(Self.keyDescription(event)) consumed=\(result ? 1 : 0)" - ) - } #endif return result } @@ -6685,16 +6639,7 @@ private extension NSWindow { } } - let consumedByBrowserSurface = AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true -#if DEBUG - if isEnterKey { - dlog( - "enter.trace stage=window.performKeyEquivalent.browserSurface event=\(Self.keyDescription(event)) " + - "consumed=\(consumedByBrowserSurface ? 1 : 0)" - ) - } -#endif - if consumedByBrowserSurface { + if AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true { #if DEBUG dlog(" → consumed by handleBrowserSurfaceKeyEquivalent") #endif @@ -6733,12 +6678,6 @@ private extension NSWindow { let result = cmux_performKeyEquivalent(with: event) #if DEBUG if result { dlog(" → consumed by original performKeyEquivalent") } - if isEnterKey { - dlog( - "enter.trace stage=window.performKeyEquivalent.original event=\(Self.keyDescription(event)) " + - "consumed=\(result ? 1 : 0)" - ) - } #endif return result } diff --git a/Sources/Panels/CmuxWebView.swift b/Sources/Panels/CmuxWebView.swift index 788e417e..bcd77ed2 100644 --- a/Sources/Panels/CmuxWebView.swift +++ b/Sources/Panels/CmuxWebView.swift @@ -63,72 +63,6 @@ final class CmuxWebView: WKWebView { } var debugPointerFocusAllowanceDepth: Int { pointerFocusAllowanceDepth } -#if DEBUG - private func debugKeyDescription(_ event: NSEvent) -> String { - var parts: [String] = [] - let flags = event.modifierFlags.intersection(.deviceIndependentFlagsMask) - if flags.contains(.command) { parts.append("Cmd") } - if flags.contains(.shift) { parts.append("Shift") } - if flags.contains(.option) { parts.append("Opt") } - if flags.contains(.control) { parts.append("Ctrl") } - let chars = event.charactersIgnoringModifiers ?? "?" - parts.append("'\(chars)'(\(event.keyCode))") - return parts.joined(separator: "+") - } - - private func debugEnterTrace( - stage: String, - event: NSEvent, - consumed: Bool? = nil, - note: String? = nil - ) { - let firstResponderType = window?.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" - let host = url?.host ?? "nil" - var line = - "enter.trace stage=\(stage) web=\(ObjectIdentifier(self)) " + - "event=\(debugKeyDescription(event)) fr=\(firstResponderType) " + - "win=\(window?.windowNumber ?? -1) host=\(host)" - if let consumed { - line += " consumed=\(consumed ? 1 : 0)" - } - if let note { - line += " note=\(note)" - } - dlog(line) - } - - private func debugLogActiveElementForEnter(stage: String) { - let js = """ - (() => { - const el = document.activeElement; - if (!el) return 'none'; - const tag = (el.tagName || '').toLowerCase(); - const id = el.id || '-'; - const name = el.getAttribute('name') || '-'; - const type = el.getAttribute('type') || '-'; - return `${tag}|${id}|${name}|${type}`; - })(); - """ - evaluateJavaScript(js) { [weak self] result, error in - guard let self else { return } - let activeSummary: String - if let error { - activeSummary = "error=\(error.localizedDescription)" - } else if let text = result as? String { - activeSummary = text - } else if let result { - activeSummary = String(describing: result) - } else { - activeSummary = "nil" - } - dlog( - "enter.trace stage=\(stage).dom web=\(ObjectIdentifier(self)) " + - "active=\(activeSummary)" - ) - } - } -#endif - override func becomeFirstResponder() -> Bool { guard allowsFirstResponderAcquisitionEffective else { #if DEBUG @@ -182,14 +116,6 @@ final class CmuxWebView: WKWebView { if event.keyCode == 36 || event.keyCode == 76 { // Always bypass app/menu key-equivalent routing for Return/Enter so WebKit // receives the keyDown path used by form submission handlers. -#if DEBUG - debugEnterTrace( - stage: "web.performKeyEquivalent.bypass", - event: event, - consumed: false, - note: "returnFalseForEnter" - ) -#endif return false } @@ -215,37 +141,14 @@ final class CmuxWebView: WKWebView { } override func keyDown(with event: NSEvent) { -#if DEBUG - if event.keyCode == 36 || event.keyCode == 76 { - debugEnterTrace(stage: "web.keyDown.pre", event: event, note: "beforeSuper") - debugLogActiveElementForEnter(stage: "web.keyDown.pre") - } -#endif - // Some Cmd-based key paths in WebKit don't consistently invoke performKeyEquivalent. // Route them through the same app-level shortcut handler as a fallback. if event.modifierFlags.intersection(.deviceIndependentFlagsMask).contains(.command), AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true { -#if DEBUG - if event.keyCode == 36 || event.keyCode == 76 { - debugEnterTrace( - stage: "web.keyDown.commandConsumed", - event: event, - consumed: true, - note: "handleBrowserSurfaceKeyEquivalent" - ) - } -#endif return } super.keyDown(with: event) -#if DEBUG - if event.keyCode == 36 || event.keyCode == 76 { - debugEnterTrace(stage: "web.keyDown.post", event: event, note: "afterSuper") - debugLogActiveElementForEnter(stage: "web.keyDown.post") - } -#endif } // MARK: - Focus on click From d255942f92b085951c4011e48ac0a1cd900a8367 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Tue, 24 Feb 2026 13:54:52 -0800 Subject: [PATCH 207/214] wip --- Sources/AppDelegate.swift | 35 +++++++++++++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 38 +++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index ac461f9b..414ece9b 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -294,6 +294,14 @@ func browserOmnibarShouldSubmitOnReturn(flags: NSEvent.ModifierFlags) -> Bool { return normalizedFlags == [] || normalizedFlags == [.shift] } +func shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: UInt16, + firstResponderIsBrowser: Bool +) -> Bool { + guard firstResponderIsBrowser else { return false } + return keyCode == 36 || keyCode == 76 +} + func commandPaletteSelectionDeltaForKeyboardNavigation( flags: NSEvent.ModifierFlags, chars: String, @@ -6489,6 +6497,7 @@ enum MenuBarIconRenderer { private var cmuxFirstResponderGuardCurrentEventOverride: NSEvent? private var cmuxFirstResponderGuardHitViewOverride: NSView? #endif +private var cmuxBrowserReturnForwardingDepth = 0 private extension NSWindow { @objc func cmux_makeFirstResponder(_ responder: NSResponder?) -> Bool { @@ -6606,6 +6615,7 @@ private extension NSWindow { // (handleCustomShortcut) already handles app-level shortcuts, and anything // remaining should be menu items. let firstResponderGhosttyView = cmuxOwningGhosttyView(for: self.firstResponder) + let firstResponderWebView = self.firstResponder.flatMap { Self.cmuxOwningWebView(for: $0) } if let ghosttyView = firstResponderGhosttyView { // If the IME is composing, don't intercept key events — let them flow // through normal AppKit event dispatch so the input method can process them. @@ -6639,6 +6649,31 @@ private extension NSWindow { } } + // Web forms rely on Return/Enter flowing through keyDown. If the original + // NSWindow.performKeyEquivalent consumes Enter first, submission never reaches + // WebKit. Route Return/Enter directly to the current first responder and + // mark handled to avoid the AppKit alert sound path. + if shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: event.keyCode, + firstResponderIsBrowser: firstResponderWebView != nil + ) { + // Forwarding keyDown can re-enter performKeyEquivalent in WebKit/AppKit internals. + // On re-entry, fall back to normal dispatch to avoid an infinite loop. + if cmuxBrowserReturnForwardingDepth > 0 { +#if DEBUG + dlog(" → browser Return/Enter reentry; using normal dispatch") +#endif + return false + } + cmuxBrowserReturnForwardingDepth += 1 + defer { cmuxBrowserReturnForwardingDepth = max(0, cmuxBrowserReturnForwardingDepth - 1) } +#if DEBUG + dlog(" → browser Return/Enter routed to firstResponder.keyDown") +#endif + self.firstResponder?.keyDown(with: event) + return true + } + if AppDelegate.shared?.handleBrowserSurfaceKeyEquivalent(event) == true { #if DEBUG dlog(" → consumed by handleBrowserSurfaceKeyEquivalent") diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 29556211..3d0972e1 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1586,6 +1586,44 @@ final class BrowserOmnibarCommandNavigationTests: XCTestCase { } } +final class BrowserReturnKeyDownRoutingTests: XCTestCase { + func testRoutesForReturnWhenBrowserFirstResponder() { + XCTAssertTrue( + shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: 36, + firstResponderIsBrowser: true + ) + ) + } + + func testRoutesForKeypadEnterWhenBrowserFirstResponder() { + XCTAssertTrue( + shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: 76, + firstResponderIsBrowser: true + ) + ) + } + + func testDoesNotRouteForNonEnterKey() { + XCTAssertFalse( + shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: 13, + firstResponderIsBrowser: true + ) + ) + } + + func testDoesNotRouteWhenFirstResponderIsNotBrowser() { + XCTAssertFalse( + shouldDispatchBrowserReturnViaFirstResponderKeyDown( + keyCode: 36, + firstResponderIsBrowser: false + ) + ) + } +} + final class BrowserZoomShortcutActionTests: XCTestCase { func testZoomInSupportsEqualsAndPlusVariants() { XCTAssertEqual( From 03b05c0f84b271359d2a319a7c5c4535161d0bb5 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:05:45 -0800 Subject: [PATCH 208/214] Fix browser chrome contrast for mixed light/dark themes --- Sources/Panels/BrowserPanelView.swift | 22 ++- ...test_browser_chrome_contrast_regression.py | 126 ++++++++++++++++++ 2 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 tests/test_browser_chrome_contrast_regression.py diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index 82069f74..9234e84a 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -178,6 +178,17 @@ func resolvedBrowserChromeBackgroundColor( } } +func resolvedBrowserChromeColorScheme( + for colorScheme: ColorScheme, + themeBackgroundColor: NSColor +) -> ColorScheme { + let backgroundColor = resolvedBrowserChromeBackgroundColor( + for: colorScheme, + themeBackgroundColor: themeBackgroundColor + ) + return backgroundColor.isLightColor ? .light : .dark +} + func resolvedBrowserOmnibarPillBackgroundColor( for colorScheme: ColorScheme, themeBackgroundColor: NSColor @@ -274,9 +285,16 @@ struct BrowserPanelView: View { ) } + private var browserChromeColorScheme: ColorScheme { + resolvedBrowserChromeColorScheme( + for: colorScheme, + themeBackgroundColor: GhosttyApp.shared.defaultBackgroundColor + ) + } + private var omnibarPillBackgroundColor: NSColor { resolvedBrowserOmnibarPillBackgroundColor( - for: colorScheme, + for: browserChromeColorScheme, themeBackgroundColor: browserChromeBackgroundColor ) } @@ -312,6 +330,7 @@ struct BrowserPanelView: View { .frame(width: omnibarPillFrame.width) .offset(x: omnibarPillFrame.minX, y: omnibarPillFrame.maxY + 3) .zIndex(1000) + .environment(\.colorScheme, browserChromeColorScheme) } } .coordinateSpace(name: "BrowserPanelViewSpace") @@ -458,6 +477,7 @@ struct BrowserPanelView: View { .background(Color(nsColor: browserChromeBackgroundColor)) // Keep the omnibar stack above WKWebView so the suggestions popup is visible. .zIndex(1) + .environment(\.colorScheme, browserChromeColorScheme) } private var addressBarButtonBar: some View { diff --git a/tests/test_browser_chrome_contrast_regression.py b/tests/test_browser_chrome_contrast_regression.py new file mode 100644 index 00000000..a2552f2f --- /dev/null +++ b/tests/test_browser_chrome_contrast_regression.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +"""Static regression guards for browser chrome contrast in mixed theme setups.""" + +from __future__ import annotations + +import subprocess +from pathlib import Path + + +def repo_root() -> Path: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return Path(result.stdout.strip()) + return Path(__file__).resolve().parents[1] + + +def extract_block(source: str, signature: str) -> str: + start = source.find(signature) + if start < 0: + raise ValueError(f"Missing signature: {signature}") + + brace_start = source.find("{", start) + if brace_start < 0: + raise ValueError(f"Missing opening brace for: {signature}") + + depth = 0 + for idx in range(brace_start, len(source)): + char = source[idx] + if char == "{": + depth += 1 + elif char == "}": + depth -= 1 + if depth == 0: + return source[brace_start : idx + 1] + + raise ValueError(f"Unbalanced braces for: {signature}") + + +def main() -> int: + root = repo_root() + view_path = root / "Sources" / "Panels" / "BrowserPanelView.swift" + source = view_path.read_text(encoding="utf-8") + failures: list[str] = [] + + try: + browser_panel_view_block = extract_block(source, "struct BrowserPanelView: View") + except ValueError as error: + failures.append(str(error)) + browser_panel_view_block = "" + + try: + resolver_block = extract_block(source, "func resolvedBrowserChromeColorScheme(") + except ValueError as error: + failures.append(str(error)) + resolver_block = "" + + if resolver_block: + if "backgroundColor.isLightColor ? .light : .dark" not in resolver_block: + failures.append( + "resolvedBrowserChromeColorScheme must map luminance to a light/dark ColorScheme" + ) + + try: + chrome_scheme_block = extract_block( + browser_panel_view_block, + "private var browserChromeColorScheme: ColorScheme", + ) + except ValueError as error: + failures.append(str(error)) + chrome_scheme_block = "" + + if chrome_scheme_block and "resolvedBrowserChromeColorScheme(" not in chrome_scheme_block: + failures.append("browserChromeColorScheme must use resolvedBrowserChromeColorScheme") + + try: + omnibar_background_block = extract_block( + browser_panel_view_block, + "private var omnibarPillBackgroundColor: NSColor", + ) + except ValueError as error: + failures.append(str(error)) + omnibar_background_block = "" + + if omnibar_background_block and "for: browserChromeColorScheme" not in omnibar_background_block: + failures.append("omnibar pill background must use browserChromeColorScheme") + + try: + address_bar_block = extract_block( + browser_panel_view_block, + "private var addressBar: some View", + ) + except ValueError as error: + failures.append(str(error)) + address_bar_block = "" + + if address_bar_block and ".environment(\\.colorScheme, browserChromeColorScheme)" not in address_bar_block: + failures.append("addressBar must apply browserChromeColorScheme via environment") + + try: + body_block = extract_block(browser_panel_view_block, "var body: some View") + except ValueError as error: + failures.append(str(error)) + body_block = "" + + if body_block: + if "OmnibarSuggestionsView(" not in body_block: + failures.append("Expected OmnibarSuggestionsView block in BrowserPanelView body") + elif ".environment(\\.colorScheme, browserChromeColorScheme)" not in body_block: + failures.append("Omnibar suggestions must apply browserChromeColorScheme via environment") + + if failures: + print("FAIL: browser chrome contrast regression guards failed") + for failure in failures: + print(f" - {failure}") + return 1 + + print("PASS: browser chrome contrast regression guards are in place") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 37be8efeb0293d1d7830ebf303747079b936723e Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:57:55 -0800 Subject: [PATCH 209/214] Print browser console/errors in non-JSON mode --- CLI/cmux.swift | 33 ++++++- ...er_console_errors_cli_output_regression.py | 86 +++++++++++++++++++ 2 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 tests/test_browser_console_errors_cli_output_regression.py diff --git a/CLI/cmux.swift b/CLI/cmux.swift index 191ff350..da0161b3 100644 --- a/CLI/cmux.swift +++ b/CLI/cmux.swift @@ -2028,6 +2028,33 @@ struct CMUXCLI { return String(describing: value) } + func displayBrowserLogItems(_ value: Any?) -> String? { + guard let items = value as? [Any], !items.isEmpty else { + return nil + } + + let lines = items.map { item -> String in + guard let dict = item as? [String: Any] else { + return displayBrowserValue(item) + } + + let text = (dict["text"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" + let levelRaw = (dict["level"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" + let level = levelRaw.isEmpty ? "log" : levelRaw + + if text.isEmpty { + if let message = (dict["message"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines), + !message.isEmpty { + return "[error] \(message)" + } + return displayBrowserValue(dict) + } + return "[\(level)] \(text)" + } + + return lines.joined(separator: "\n") + } + func nonFlagArgs(_ values: [String]) -> [String] { values.filter { !$0.hasPrefix("-") } } @@ -2812,7 +2839,8 @@ struct CMUXCLI { throw CLIError(message: "Unsupported browser console subcommand: \(consoleVerb)") } let payload = try client.sendV2(method: method, params: ["surface_id": sid]) - output(payload, fallback: "OK") + let fallback = displayBrowserLogItems(payload["entries"]) ?? "OK" + output(payload, fallback: fallback) return } @@ -2826,7 +2854,8 @@ struct CMUXCLI { throw CLIError(message: "Unsupported browser errors subcommand: \(errorsVerb)") } let payload = try client.sendV2(method: "browser.errors.list", params: params) - output(payload, fallback: "OK") + let fallback = displayBrowserLogItems(payload["errors"]) ?? "OK" + output(payload, fallback: fallback) return } diff --git a/tests/test_browser_console_errors_cli_output_regression.py b/tests/test_browser_console_errors_cli_output_regression.py new file mode 100644 index 00000000..40561356 --- /dev/null +++ b/tests/test_browser_console_errors_cli_output_regression.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +"""Static regression guard for browser console/errors CLI output formatting. + +Ensures non-JSON `browser console list` and `browser errors list` do not fall +back to unconditional `OK` when logs exist. +""" + +from __future__ import annotations + +import subprocess +from pathlib import Path + + +def repo_root() -> Path: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return Path(result.stdout.strip()) + return Path(__file__).resolve().parents[1] + + +def extract_block(source: str, signature: str) -> str: + start = source.find(signature) + if start < 0: + raise ValueError(f"Missing signature: {signature}") + brace_start = source.find("{", start) + if brace_start < 0: + raise ValueError(f"Missing opening brace for: {signature}") + depth = 0 + for idx in range(brace_start, len(source)): + char = source[idx] + if char == "{": + depth += 1 + elif char == "}": + depth -= 1 + if depth == 0: + return source[brace_start : idx + 1] + raise ValueError(f"Unbalanced braces for: {signature}") + + +def main() -> int: + root = repo_root() + failures: list[str] = [] + + cli_path = root / "CLI" / "cmux.swift" + cli_source = cli_path.read_text(encoding="utf-8") + browser_block = extract_block(cli_source, "private func runBrowserCommand(") + + if "func displayBrowserLogItems(_ value: Any?) -> String?" not in browser_block: + failures.append("runBrowserCommand() is missing displayBrowserLogItems() helper") + else: + helper_block = extract_block(browser_block, "func displayBrowserLogItems(_ value: Any?) -> String?") + if "return \"[\\(level)] \\(text)\"" not in helper_block: + failures.append("displayBrowserLogItems() no longer renders level-prefixed log lines") + if "return \"[error] \\(message)\"" not in helper_block: + failures.append("displayBrowserLogItems() no longer renders concise JS error messages") + if "return displayBrowserValue(dict)" not in helper_block: + failures.append("displayBrowserLogItems() no longer falls back to structured formatting") + + console_block = extract_block(browser_block, 'if subcommand == "console"') + if 'displayBrowserLogItems(payload["entries"])' not in console_block: + failures.append("browser console path no longer formats entries for non-JSON output") + if 'output(payload, fallback: "OK")' in console_block: + failures.append("browser console path regressed to unconditional OK output") + + errors_block = extract_block(browser_block, 'if subcommand == "errors"') + if 'displayBrowserLogItems(payload["errors"])' not in errors_block: + failures.append("browser errors path no longer formats errors for non-JSON output") + if 'output(payload, fallback: "OK")' in errors_block: + failures.append("browser errors path regressed to unconditional OK output") + + if failures: + print("FAIL: browser console/errors CLI output regression guard failed") + for item in failures: + print(f" - {item}") + return 1 + + print("PASS: browser console/errors CLI output regression guard is in place") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From c01ecc4532618063323b033bddce1fe828a83ac0 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Tue, 24 Feb 2026 15:49:55 -0800 Subject: [PATCH 210/214] Guard terminal forceRefresh when surface is nil --- Sources/GhosttyTerminalView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index e18487f8..022c5268 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1988,6 +1988,7 @@ final class TerminalSurface: Identifiable, ObservableObject { } view.forceRefreshSurface() + guard let surface = surface else { return } ghostty_surface_refresh(surface) } From f33d65f986629f0ecef6f837d13b198d010648b3 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Tue, 24 Feb 2026 16:00:00 -0800 Subject: [PATCH 211/214] Fix terminal blanking after full-surface tab drops --- Sources/GhosttyTerminalView.swift | 14 ++++++++-- Sources/TerminalController.swift | 45 ++++++++++++++++++++---------- Sources/TerminalWindowPortal.swift | 5 ++++ Sources/Workspace.swift | 39 ++++++++++++++++++++++++-- vendor/bonsplit | 2 +- 5 files changed, 84 insertions(+), 21 deletions(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 6b1028d3..f1c44d0b 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1825,6 +1825,12 @@ final class TerminalSurface: Identifiable, ObservableObject { flushPendingTextIfNeeded() + // Kick an initial draw after creation/size setup. On some startup paths Ghostty can + // miss the first vsync callback and sit on a blank frame until another focus/visibility + // transition nudges the renderer. + view.forceRefreshSurface() + ghostty_surface_refresh(createdSurface) + #if DEBUG let runtimeFontText = cmuxCurrentSurfaceFontSizePoints(createdSurface).map { String(format: "%.2f", $0) @@ -1886,14 +1892,15 @@ final class TerminalSurface: Identifiable, ObservableObject { /// Force a full size recalculation and surface redraw. func forceRefresh() { + let hasSurface = surface != nil let viewState: String if let view = attachedView { let inWindow = view.window != nil let bounds = view.bounds let metalOK = (view.layer as? CAMetalLayer) != nil - viewState = "inWindow=\(inWindow) bounds=\(bounds) metalOK=\(metalOK)" + viewState = "inWindow=\(inWindow) bounds=\(bounds) metalOK=\(metalOK) hasSurface=\(hasSurface)" } else { - viewState = "NO_ATTACHED_VIEW" + viewState = "NO_ATTACHED_VIEW hasSurface=\(hasSurface)" } #if DEBUG let ts = ISO8601DateFormatter().string(from: Date()) @@ -1907,7 +1914,8 @@ final class TerminalSurface: Identifiable, ObservableObject { FileManager.default.createFile(atPath: logPath, contents: line.data(using: .utf8)) } #endif - guard let view = attachedView, + guard let surface, + let view = attachedView, view.window != nil, view.bounds.width > 0, view.bounds.height > 0 else { diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 9b392625..66c4d986 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -8409,20 +8409,20 @@ class TerminalController { // Socket commands are line-based; allow callers to express control chars with backslash escapes. let text = unescapeSocketText(raw) - var result = "ERROR: No window" - DispatchQueue.main.sync { - // Like simulate_shortcut, prefer a visible window so debug automation doesn't - // fail during key window transitions. - guard let window = NSApp.keyWindow - ?? NSApp.mainWindow - ?? NSApp.windows.first(where: { $0.isVisible }) - ?? NSApp.windows.first else { return } - NSApp.activate(ignoringOtherApps: true) - window.makeKeyAndOrderFront(nil) - guard let fr = window.firstResponder else { - result = "ERROR: No first responder" - return - } + var result = "ERROR: No window" + DispatchQueue.main.sync { + // Like simulate_shortcut, prefer a visible window so debug automation doesn't + // fail during key window transitions. + guard let window = NSApp.keyWindow + ?? NSApp.mainWindow + ?? NSApp.windows.first(where: { $0.isVisible }) + ?? NSApp.windows.first else { return } + NSApp.activate(ignoringOtherApps: true) + window.makeKeyAndOrderFront(nil) + guard let fr = window.firstResponder else { + result = "ERROR: No first responder" + return + } if let client = fr as? NSTextInputClient { client.insertText(text, replacementRange: NSRange(location: NSNotFound, length: 0)) @@ -8430,7 +8430,22 @@ class TerminalController { return } - // Fall back to the responder chain insertText action. + // If workspace handoff temporarily leaves a non-terminal first responder, + // route debug typing to the selected terminal's focused panel directly. + if let tabManager, + let tabId = tabManager.selectedTabId, + let tab = tabManager.tabs.first(where: { $0.id == tabId }), + let panelId = tab.focusedPanelId, + let terminalPanel = tab.terminalPanel(for: panelId), + !terminalPanel.hostedView.isSurfaceViewFirstResponder() { + // Match Enter semantics expected by tests/debug tooling when bypassing AppKit. + let directText = text.replacingOccurrences(of: "\n", with: "\r") + terminalPanel.surface.sendText(directText) + result = "OK" + return + } + + // Fall back to the responder-chain insertText action. (fr as? NSResponder)?.insertText(text) result = "OK" } diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index 2daddf4b..7dda1b50 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -1254,6 +1254,11 @@ final class WindowTerminalPortal: NSObject { ) #endif hostedView.isHidden = false + // A reveal can happen without any frame delta (same targetFrame), which means the + // normal frame-change refresh path won't run. Nudge geometry + redraw so newly + // revealed terminals don't sit on a stale/blank IOSurface until later focus churn. + hostedView.reconcileGeometryNow() + hostedView.refreshSurfaceNow() } #if DEBUG diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 272bd086..e31d831c 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -2265,7 +2265,11 @@ final class Workspace: Identifiable, ObservableObject { } hostedView.reconcileGeometryNow() - terminalPanel.surface.forceRefresh() + if hasSurface { + terminalPanel.surface.forceRefresh() + } else if isAttached && hasUsableBounds { + terminalPanel.surface.requestBackgroundSurfaceStartIfNeeded() + } } return needsFollowUpPass @@ -2306,6 +2310,31 @@ final class Workspace: Identifiable, ObservableObject { } } + private func scheduleMovedTerminalRefresh(panelId: UUID) { + guard terminalPanel(for: panelId) != nil else { return } + + // Force an NSViewRepresentable update after drag/move reparenting. This keeps + // portal host binding current when a pane auto-closes during tab moves. + terminalPanel(for: panelId)?.requestViewReattach() + + let runRefreshPass: (TimeInterval) -> Void = { [weak self] delay in + DispatchQueue.main.asyncAfter(deadline: .now() + delay) { + guard let self, let panel = self.terminalPanel(for: panelId) else { return } + panel.hostedView.reconcileGeometryNow() + if panel.surface.surface != nil { + panel.surface.forceRefresh() + } else { + panel.surface.requestBackgroundSurfaceStartIfNeeded() + } + } + } + + // Run once immediately and once on the next turn so rapid split close/reparent + // sequences still get a post-layout redraw. + runRefreshPass(0) + runRefreshPass(0.03) + } + private func closeTabs(_ tabIds: [TabID], skipPinned: Bool = true) { for tabId in tabIds { if skipPinned, @@ -2928,12 +2957,18 @@ extension Workspace: BonsplitDelegate { ) #endif applyTabSelection(tabId: tab.id, inPane: destination) +#if DEBUG + let movedPanelIdAfter = panelIdFromSurfaceId(tab.id) +#endif + if let movedPanelId = panelIdFromSurfaceId(tab.id) { + scheduleMovedTerminalRefresh(panelId: movedPanelId) + } #if DEBUG let selectedAfter = controller.selectedTab(inPane: destination) .map { String(String(describing: $0.id).prefix(5)) } ?? "nil" let focusedPaneAfter = controller.focusedPaneId?.id.uuidString.prefix(5) ?? "nil" let focusedPanelAfter = focusedPanelId?.uuidString.prefix(5) ?? "nil" - let movedPanelFocused = (movedPanelId != nil && movedPanelId == focusedPanelId) ? 1 : 0 + let movedPanelFocused = (movedPanelIdAfter != nil && movedPanelIdAfter == focusedPanelId) ? 1 : 0 dlog( "split.moveTab.state.after idx=\(debugDidMoveTabEventCount) panel=\(movedPanel) " + "destSelected=\(selectedAfter) focusedPane=\(focusedPaneAfter) focusedPanel=\(focusedPanelAfter) " + diff --git a/vendor/bonsplit b/vendor/bonsplit index f24ba922..21db26f8 160000 --- a/vendor/bonsplit +++ b/vendor/bonsplit @@ -1 +1 @@ -Subproject commit f24ba9222651ecc170869662eec9a5880404a82c +Subproject commit 21db26f8a6a0c7707af10da672c0d7cf07076c66 From 2877531ea26a1a23f06ed195635a548a5034e7cc Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 24 Feb 2026 16:00:03 -0800 Subject: [PATCH 212/214] Auto-focus omnibar when focusing blank browser surfaces (#448) * Auto-focus omnibar when focusing blank browser surfaces * Fix browser omnibar autofocus across pane and palette paths * Fix Cmd+P switcher omnibar autofocus timing --- Sources/AppDelegate.swift | 16 +- Sources/ContentView.swift | 21 +- Sources/Panels/BrowserPanelView.swift | 25 ++ Sources/TerminalController.swift | 29 ++ Sources/Workspace.swift | 45 ++ ...t_browser_new_tab_surface_focus_omnibar.py | 388 ++++++++++++++++++ 6 files changed, 513 insertions(+), 11 deletions(-) create mode 100644 tests/test_browser_new_tab_surface_focus_omnibar.py diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 414ece9b..6ec802a2 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -4661,9 +4661,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent // Open browser: Cmd+Shift+L if matchShortcut(event: event, shortcut: KeyboardShortcutSettings.shortcut(for: .openBrowser)) { - if let panelId = tabManager?.openBrowser(insertAtEnd: true) { - focusBrowserAddressBar(panelId: panelId) - } + _ = openBrowserAndFocusAddressBar(insertAtEnd: true) return true } @@ -4712,8 +4710,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } - if let panelId = tabManager?.openBrowser(insertAtEnd: true) { - focusBrowserAddressBar(panelId: panelId) + if openBrowserAndFocusAddressBar(insertAtEnd: true) != nil { return true } } @@ -4849,6 +4846,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } + @discardableResult + func openBrowserAndFocusAddressBar(url: URL? = nil, insertAtEnd: Bool = false) -> UUID? { + guard let panelId = tabManager?.openBrowser(url: url, insertAtEnd: insertAtEnd) else { + return nil + } + _ = focusBrowserAddressBar(panelId: panelId) + return panelId + } + private func focusBrowserAddressBar(in panel: BrowserPanel) { _ = panel.requestAddressBarFocus() browserAddressBarFocusedPanelId = panel.id diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 90e9dbfc..04a6433a 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -3141,11 +3141,16 @@ struct ContentView: View { workspaceId: UUID, panelId: UUID? ) { - _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) - if let panelId { - tabManager.focusTab(workspaceId, surfaceId: panelId, suppressFlash: true) - } else { - tabManager.focusTab(workspaceId, suppressFlash: true) + // Switcher commands dismiss the palette after action dispatch. + // Defer focus mutation one turn so browser omnibar autofocus can run + // without being blocked by the palette-visibility guard. + DispatchQueue.main.async { + _ = AppDelegate.shared?.focusMainWindow(windowId: windowId) + if let panelId { + tabManager.focusTab(workspaceId, surfaceId: panelId, suppressFlash: true) + } else { + tabManager.focusTab(workspaceId, suppressFlash: true) + } } } @@ -3886,7 +3891,11 @@ struct ContentView: View { tabManager.newSurface() } registry.register(commandId: "palette.newBrowserTab") { - _ = tabManager.openBrowser() + // Let command-palette dismissal complete first so omnibar focus + // is not blocked by the palette visibility guard. + DispatchQueue.main.async { + _ = AppDelegate.shared?.openBrowserAndFocusAddressBar() + } } registry.register(commandId: "palette.closeTab") { tabManager.closeCurrentPanelWithConfirmation() diff --git a/Sources/Panels/BrowserPanelView.swift b/Sources/Panels/BrowserPanelView.swift index a274599f..699b856a 100644 --- a/Sources/Panels/BrowserPanelView.swift +++ b/Sources/Panels/BrowserPanelView.swift @@ -790,8 +790,32 @@ struct BrowserPanelView: View { applyOmnibarEffects(effects) } + private func isCommandPaletteVisibleForPanelWindow() -> Bool { + guard let app = AppDelegate.shared else { return false } + + if let window = panel.webView.window, app.isCommandPaletteVisible(for: window) { + return true + } + + if let manager = app.tabManagerFor(tabId: panel.workspaceId), + let windowId = app.windowId(for: manager), + let window = app.mainWindow(for: windowId), + app.isCommandPaletteVisible(for: window) { + return true + } + + if let keyWindow = NSApp.keyWindow, app.isCommandPaletteVisible(for: keyWindow) { + return true + } + if let mainWindow = NSApp.mainWindow, app.isCommandPaletteVisible(for: mainWindow) { + return true + } + return false + } + private func applyPendingAddressBarFocusRequestIfNeeded() { guard let requestId = panel.pendingAddressBarFocusRequestId else { return } + guard !isCommandPaletteVisibleForPanelWindow() else { return } guard lastHandledAddressBarFocusRequestId != requestId else { return } lastHandledAddressBarFocusRequestId = requestId panel.beginSuppressWebViewFocusForAddressBar() @@ -819,6 +843,7 @@ struct BrowserPanelView: View { private func autoFocusOmnibarIfBlank() { guard isFocused else { return } guard !addressBarFocused else { return } + guard !isCommandPaletteVisibleForPanelWindow() else { return } // If a test/automation explicitly focused WebKit, don't steal focus back. guard !panel.shouldSuppressOmnibarAutofocus() else { return } // If a real navigation is underway (e.g. open_browser https://...), don't steal focus. diff --git a/Sources/TerminalController.swift b/Sources/TerminalController.swift index 94bae0ef..c4e2e0eb 100644 --- a/Sources/TerminalController.swift +++ b/Sources/TerminalController.swift @@ -1298,6 +1298,8 @@ class TerminalController { return v2Result(id: id, self.v2DebugCommandPaletteRenameInputSelection(params: params)) case "debug.command_palette.rename_input.select_all": return v2Result(id: id, self.v2DebugCommandPaletteRenameInputSelectAll(params: params)) + case "debug.browser.address_bar_focused": + return v2Result(id: id, self.v2DebugBrowserAddressBarFocused(params: params)) case "debug.sidebar.visible": return v2Result(id: id, self.v2DebugSidebarVisible(params: params)) case "debug.terminal.is_focused": @@ -1505,6 +1507,7 @@ class TerminalController { "debug.command_palette.rename_input.delete_backward", "debug.command_palette.rename_input.selection", "debug.command_palette.rename_input.select_all", + "debug.browser.address_bar_focused", "debug.sidebar.visible", "debug.terminal.is_focused", "debug.terminal.read_text", @@ -7983,6 +7986,32 @@ class TerminalController { ]) } + private func v2DebugBrowserAddressBarFocused(params: [String: Any]) -> V2CallResult { + let requestedSurfaceId = v2UUID(params, "surface_id") ?? v2UUID(params, "panel_id") + var focusedSurfaceId: UUID? + DispatchQueue.main.sync { + focusedSurfaceId = AppDelegate.shared?.focusedBrowserAddressBarPanelId() + } + + var payload: [String: Any] = [ + "focused_surface_id": v2OrNull(focusedSurfaceId?.uuidString), + "focused_surface_ref": v2Ref(kind: .surface, uuid: focusedSurfaceId), + "focused_panel_id": v2OrNull(focusedSurfaceId?.uuidString), + "focused_panel_ref": v2Ref(kind: .surface, uuid: focusedSurfaceId), + "focused": focusedSurfaceId != nil + ] + + if let requestedSurfaceId { + payload["surface_id"] = requestedSurfaceId.uuidString + payload["surface_ref"] = v2Ref(kind: .surface, uuid: requestedSurfaceId) + payload["panel_id"] = requestedSurfaceId.uuidString + payload["panel_ref"] = v2Ref(kind: .surface, uuid: requestedSurfaceId) + payload["focused"] = (focusedSurfaceId == requestedSurfaceId) + } + + return .ok(payload) + } + private func v2DebugSidebarVisible(params: [String: Any]) -> V2CallResult { guard let windowId = v2UUID(params, "window_id") else { return .err(code: "invalid_params", message: "Missing or invalid window_id", data: nil) diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index aabf85f4..276d5f3e 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -2520,6 +2520,44 @@ final class Workspace: Identifiable, ObservableObject { if let targetPaneId, !shouldSuppressReentrantRefocus { applyTabSelection(tabId: tabId, inPane: targetPaneId) } + + if let browserPanel = panels[panelId] as? BrowserPanel { + maybeAutoFocusBrowserAddressBarOnPanelFocus(browserPanel, trigger: trigger) + } + } + + private func maybeAutoFocusBrowserAddressBarOnPanelFocus( + _ browserPanel: BrowserPanel, + trigger: FocusPanelTrigger + ) { + guard trigger == .standard else { return } + guard !isCommandPaletteVisibleForWorkspaceWindow() else { return } + guard !browserPanel.shouldSuppressOmnibarAutofocus() else { return } + guard browserPanel.isShowingNewTabPage || browserPanel.preferredURLStringForOmnibar() == nil else { return } + + _ = browserPanel.requestAddressBarFocus() + NotificationCenter.default.post(name: .browserFocusAddressBar, object: browserPanel.id) + } + + private func isCommandPaletteVisibleForWorkspaceWindow() -> Bool { + guard let app = AppDelegate.shared else { + return false + } + + if let manager = app.tabManagerFor(tabId: id), + let windowId = app.windowId(for: manager), + let window = app.mainWindow(for: windowId), + app.isCommandPaletteVisible(for: window) { + return true + } + + if let keyWindow = NSApp.keyWindow, app.isCommandPaletteVisible(for: keyWindow) { + return true + } + if let mainWindow = NSApp.mainWindow, app.isCommandPaletteVisible(for: mainWindow) { + return true + } + return false } func moveFocus(direction: NavigationDirection) { @@ -3116,6 +3154,13 @@ extension Workspace: BonsplitDelegate { } panel.focus() + let focusIntentAllowsBrowserOmnibarAutofocus = + shouldTreatCurrentEventAsExplicitFocusIntent() || + TerminalController.socketCommandAllowsInAppFocusMutations() + if let browserPanel = panel as? BrowserPanel, + previousFocusedPanelId != panelId || focusIntentAllowsBrowserOmnibarAutofocus { + maybeAutoFocusBrowserAddressBarOnPanelFocus(browserPanel, trigger: .standard) + } if let terminalPanel = panel as? TerminalPanel { rememberTerminalConfigInheritanceSource(terminalPanel) } diff --git a/tests/test_browser_new_tab_surface_focus_omnibar.py b/tests/test_browser_new_tab_surface_focus_omnibar.py new file mode 100644 index 00000000..b66bb505 --- /dev/null +++ b/tests/test_browser_new_tab_surface_focus_omnibar.py @@ -0,0 +1,388 @@ +#!/usr/bin/env python3 +""" +Regression test: +1. Focusing a blank browser surface should focus the omnibar. +2. Focusing a pane that contains a blank browser should focus the omnibar. +3. If command palette is open, focusing that blank browser surface must not steal input. +4. Cmd+P switcher focusing an existing blank browser surface should focus the omnibar. +""" + +import json +import os +import sys +import time +from typing import Any + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +from cmux import cmux, cmuxError + + +def v2_call(client: cmux, method: str, params: dict[str, Any] | None = None, request_id: str = "1") -> dict[str, Any]: + payload = { + "id": request_id, + "method": method, + "params": params or {}, + } + raw = client._send_command(json.dumps(payload)) + try: + parsed = json.loads(raw) + except json.JSONDecodeError as exc: + raise cmuxError(f"Invalid v2 JSON response for {method}: {raw}") from exc + + if not parsed.get("ok"): + raise cmuxError(f"v2 {method} failed: {parsed.get('error')}") + + result = parsed.get("result") + return result if isinstance(result, dict) else {} + + +def wait_for(predicate, timeout_s: float, interval_s: float = 0.1) -> bool: + deadline = time.time() + timeout_s + while time.time() < deadline: + if predicate(): + return True + time.sleep(interval_s) + return False + + +def browser_address_bar_focus_state(client: cmux, surface_id: str | None = None, request_id: str = "browser-focus") -> dict[str, Any]: + params: dict[str, Any] = {} + if surface_id: + params["surface_id"] = surface_id + return v2_call(client, "debug.browser.address_bar_focused", params, request_id=request_id) + + +def set_command_palette_visible(client: cmux, window_id: str, target_visible: bool) -> bool: + for idx in range(5): + state = v2_call( + client, + "debug.command_palette.visible", + {"window_id": window_id}, + request_id=f"palette-visible-{idx}", + ) + is_visible = bool(state.get("visible")) + if is_visible == target_visible: + return True + v2_call( + client, + "debug.command_palette.toggle", + {"window_id": window_id}, + request_id=f"palette-toggle-{idx}", + ) + time.sleep(0.15) + return False + + +def command_palette_results(client: cmux, window_id: str, limit: int = 20) -> list[dict[str, Any]]: + payload = v2_call( + client, + "debug.command_palette.results", + {"window_id": window_id, "limit": limit}, + request_id="palette-results" + ) + rows = payload.get("results") + if isinstance(rows, list): + return [row for row in rows if isinstance(row, dict)] + return [] + + +def command_palette_selected_index(client: cmux, window_id: str) -> int: + payload = v2_call( + client, + "debug.command_palette.selection", + {"window_id": window_id}, + request_id="palette-selection" + ) + selected_index = payload.get("selected_index") + if isinstance(selected_index, int): + return max(0, selected_index) + return 0 + + +def move_command_palette_selection_to_index(client: cmux, window_id: str, target_index: int) -> bool: + target = max(0, target_index) + for _ in range(40): + current = command_palette_selected_index(client, window_id) + if current == target: + return True + if current < target: + client.simulate_shortcut("down") + else: + client.simulate_shortcut("up") + time.sleep(0.05) + return False + + +def current_window_id(client: cmux) -> str: + window_current = v2_call(client, "window.current", request_id="window-current") + window_id = window_current.get("window_id") + if not isinstance(window_id, str) or not window_id: + raise cmuxError(f"Invalid window.current payload: {window_current}") + return window_id + + +def main() -> int: + client = cmux() + workspace_ids: list[str] = [] + window_id: str | None = None + + try: + client.connect() + client.activate_app() + + # Scenario 1: focus_surface on a blank browser should focus omnibar. + workspace_id = client.new_workspace() + workspace_ids.append(workspace_id) + client.select_workspace(workspace_id) + time.sleep(0.4) + window_id = current_window_id(client) + if not set_command_palette_visible(client, window_id, False): + raise cmuxError("Failed to ensure command palette is hidden for scenario 1") + + browser_id = client.new_surface(panel_type="browser") + time.sleep(0.3) + + surfaces = client.list_surfaces() + terminal_id = next((surface_id for _, surface_id, _ in surfaces if surface_id != browser_id), None) + if not terminal_id: + raise cmuxError("Missing terminal surface for focus setup") + + client.focus_surface_by_panel(terminal_id) + time.sleep(0.2) + + # Primary behavior: focusing a blank browser tab should focus the omnibar. + client.focus_surface_by_panel(browser_id) + did_focus_address_bar = wait_for( + lambda: bool( + browser_address_bar_focus_state( + client, + surface_id=browser_id, + request_id="browser-focus-primary" + ).get("focused") + ), + timeout_s=3.0, + interval_s=0.1 + ) + if not did_focus_address_bar: + raise cmuxError("Blank browser surface did not focus omnibar after focus_surface") + + client.close_workspace(workspace_id) + workspace_ids.remove(workspace_id) + time.sleep(0.3) + + # Scenario 2: focusing a pane that contains a blank browser should focus omnibar. + workspace_id = client.new_workspace() + workspace_ids.append(workspace_id) + client.select_workspace(workspace_id) + time.sleep(0.4) + window_id = current_window_id(client) + if not set_command_palette_visible(client, window_id, False): + raise cmuxError("Failed to ensure command palette is hidden for scenario 2") + + initial_surfaces = client.list_surfaces() + left_terminal_id = next((surface_id for _, surface_id, _ in initial_surfaces), None) + if not left_terminal_id: + raise cmuxError("Missing initial terminal surface for split setup") + + split_browser_id = client.new_pane(direction="right", panel_type="browser") + time.sleep(0.3) + + pane_rows = client.list_panes() + left_pane: str | None = None + browser_pane: str | None = None + for _, pane_id, _, _ in pane_rows: + pane_surface_ids = {surface_id for _, surface_id, _, _ in client.list_pane_surfaces(pane_id)} + if left_terminal_id in pane_surface_ids: + left_pane = pane_id + if split_browser_id in pane_surface_ids: + browser_pane = pane_id + + if not left_pane or not browser_pane: + raise cmuxError("Failed to locate split panes for pane-focus scenario") + + client.focus_pane(left_pane) + time.sleep(0.2) + client.focus_pane(browser_pane) + + did_focus_split_browser = wait_for( + lambda: bool( + browser_address_bar_focus_state( + client, + surface_id=split_browser_id, + request_id="browser-focus-pane" + ).get("focused") + ), + timeout_s=3.0, + interval_s=0.1 + ) + if not did_focus_split_browser: + raise cmuxError("Blank browser pane did not focus omnibar after focus_pane") + + client.close_workspace(workspace_id) + workspace_ids.remove(workspace_id) + time.sleep(0.3) + + # Scenario 3: command palette should keep input focus when switching to a blank browser surface. + workspace_id = client.new_workspace() + workspace_ids.append(workspace_id) + client.select_workspace(workspace_id) + time.sleep(0.4) + window_id = current_window_id(client) + if not set_command_palette_visible(client, window_id, False): + raise cmuxError("Failed to reset command palette before scenario 3") + + blank_browser_id = client.new_surface(panel_type="browser") + time.sleep(0.3) + + surfaces = client.list_surfaces() + terminal_id = next((surface_id for _, surface_id, _ in surfaces if surface_id != blank_browser_id), None) + if not terminal_id: + raise cmuxError("Missing terminal surface for command palette scenario") + + client.focus_surface_by_panel(terminal_id) + wait_for( + lambda: not bool( + browser_address_bar_focus_state( + client, + request_id="browser-focus-cleared" + ).get("focused") + ), + timeout_s=2.0, + interval_s=0.1 + ) + + if not set_command_palette_visible(client, window_id, True): + raise cmuxError("Failed to open command palette") + + client.focus_surface_by_panel(blank_browser_id) + time.sleep(0.2) + + palette_visible_after_focus = bool( + v2_call( + client, + "debug.command_palette.visible", + {"window_id": window_id}, + request_id="palette-visible-after-focus" + ).get("visible") + ) + if not palette_visible_after_focus: + raise cmuxError("Command palette closed unexpectedly after focus_surface") + + blank_focus_state = browser_address_bar_focus_state( + client, + surface_id=blank_browser_id, + request_id="browser-focus-palette" + ) + if bool(blank_focus_state.get("focused")): + raise cmuxError("Blank browser tab stole omnibar focus while command palette was visible") + + client.close_workspace(workspace_id) + workspace_ids.remove(workspace_id) + time.sleep(0.3) + + # Scenario 4: Cmd+P switcher selecting an existing blank browser surface should focus omnibar. + workspace_id = client.new_workspace() + workspace_ids.append(workspace_id) + client.select_workspace(workspace_id) + time.sleep(0.4) + window_id = current_window_id(client) + if not set_command_palette_visible(client, window_id, False): + raise cmuxError("Failed to reset command palette before scenario 4") + + switcher_browser_id = client.new_surface(panel_type="browser") + time.sleep(0.3) + + switcher_surfaces = client.list_surfaces() + switcher_terminal_id = next((surface_id for _, surface_id, _ in switcher_surfaces if surface_id != switcher_browser_id), None) + if not switcher_terminal_id: + raise cmuxError("Missing terminal surface for Cmd+P switcher scenario") + + client.focus_surface_by_panel(switcher_terminal_id) + time.sleep(0.2) + + client.simulate_shortcut("cmd+p") + if not wait_for( + lambda: bool( + v2_call( + client, + "debug.command_palette.visible", + {"window_id": window_id}, + request_id="palette-visible-switcher-open" + ).get("visible") + ), + timeout_s=2.0, + interval_s=0.1 + ): + raise cmuxError("Cmd+P did not open command palette switcher") + + client.simulate_type("new tab") + time.sleep(0.2) + + target_command_id = f"switcher.surface.{workspace_id.lower()}.{switcher_browser_id.lower()}" + switcher_results = command_palette_results(client, window_id, limit=50) + target_index = next( + ( + idx for idx, row in enumerate(switcher_results) + if isinstance(row.get("command_id"), str) and row.get("command_id") == target_command_id + ), + None + ) + if target_index is None: + raise cmuxError(f"Cmd+P switcher did not list target surface command {target_command_id}") + + if not move_command_palette_selection_to_index(client, window_id, target_index): + raise cmuxError(f"Failed to move Cmd+P selection to result index {target_index}") + + client.simulate_shortcut("enter") + + did_focus_switcher_target = wait_for( + lambda: ( + not bool( + v2_call( + client, + "debug.command_palette.visible", + {"window_id": window_id}, + request_id="palette-visible-switcher-after-enter" + ).get("visible") + ) + and bool( + browser_address_bar_focus_state( + client, + surface_id=switcher_browser_id, + request_id="browser-focus-switcher" + ).get("focused") + ) + ), + timeout_s=3.0, + interval_s=0.1 + ) + if not did_focus_switcher_target: + raise cmuxError("Cmd+P switcher focus to blank browser did not focus omnibar") + + print("PASS: blank-browser focus paths (surface, pane, and Cmd+P switcher) drive omnibar, while command palette visibility blocks focus stealing") + return 0 + + except cmuxError as exc: + print(f"FAIL: {exc}") + return 1 + + finally: + if window_id: + try: + _ = set_command_palette_visible(client, window_id, False) + except Exception: + pass + for workspace_id in list(workspace_ids): + try: + client.close_workspace(workspace_id) + except Exception: + pass + try: + client.close() + except Exception: + pass + + +if __name__ == "__main__": + raise SystemExit(main()) From 15647ca4df6371a7d3893768f108498c630f07a6 Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Tue, 24 Feb 2026 16:10:37 -0800 Subject: [PATCH 213/214] fix ci/cd --- Sources/GhosttyTerminalView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index d61b905b..266bc3b1 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -1996,7 +1996,7 @@ final class TerminalSurface: Identifiable, ObservableObject { } view.forceRefreshSurface() - guard let surface = surface else { return } + guard let surface = self.surface else { return } ghostty_surface_refresh(surface) } From ba73c6f90c83b3d09049ba78137096cc6289e7ab Mon Sep 17 00:00:00 2001 From: austinpower1258 <austinwang115@gmail.com> Date: Tue, 24 Feb 2026 16:33:38 -0800 Subject: [PATCH 214/214] Fix Cmd+N routing when browser events have windowNumber 0 --- Sources/AppDelegate.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 6ec802a2..337ad9f3 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -2984,7 +2984,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent private func shortcutEventHasAddressableWindow(_ event: NSEvent?) -> Bool { guard let event else { return false } - return event.window != nil || event.windowNumber >= 0 + // NSEvent.windowNumber can be 0 for responder-chain events that are not + // actually bound to an NSWindow (notably some WebKit key paths). + return event.window != nil || event.windowNumber > 0 } private func mainWindowContext( @@ -3007,7 +3009,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return context } - if event.windowNumber >= 0, + if event.windowNumber > 0, let numberedWindow = NSApp.window(withWindowNumber: event.windowNumber), let context = contextForMainTerminalWindow(numberedWindow) { #if DEBUG @@ -3022,7 +3024,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return context } - if event.windowNumber >= 0, + if event.windowNumber > 0, let context = mainWindowContexts.values.first(where: { candidate in let window = candidate.window ?? windowForMainWindowId(candidate.windowId) return window?.windowNumber == event.windowNumber