From 4cabfc2b89756a84fa443c388884d3b5f44824e1 Mon Sep 17 00:00:00 2001 From: Patrick Schaper Date: Wed, 21 Oct 2026 16:32:04 +0200 Subject: [PATCH 1/8] feat: add native Matrix desktop wallpaper app - add passive per-display windows and menu bar controls - share saver options with live visual updates - preserve coordinated animation across sleep and lock - add playback tests, AppKit checks, and build documentation --- .github/workflows/tests.yml | 9 + README.md | 46 ++++ Resources/Wallpaper-Info.plist | 24 ++ .../MatrixScreenSaverOptions.swift | 29 ++- .../MatrixScreenSaverView.swift | 60 ++++- .../NativeMatrixRenderer.swift | 29 ++- .../MatrixScreenSaver/NeoMessageScene.swift | 7 + .../ScreenSyncCoordinator.swift | 30 +++ Sources/MatrixWallpaper/DesktopWindow.swift | 32 +++ Sources/MatrixWallpaper/WallpaperApp.swift | 225 ++++++++++++++++++ .../WallpaperPlaybackState.swift | 36 +++ Sources/MatrixWallpaper/main.swift | 9 + .../NativeMatrixRendererTests.swift | 91 +++++++ .../ScreenSyncCoordinatorTests.swift | 19 ++ .../WallpaperPlaybackStateTests.swift | 29 +++ Tests/MatrixScreenSaverTests/main.swift | 1 + .../SharedSaverTests.swift | 118 +++++++++ .../WallpaperAppTests.swift | 58 +++++ Tests/MatrixWallpaperTests/main.swift | 59 +++++ build-wallpaper.sh | 37 +++ tests.sh | 2 + wallpaper-tests.sh | 28 +++ 22 files changed, 956 insertions(+), 22 deletions(-) create mode 100644 Resources/Wallpaper-Info.plist create mode 100644 Sources/MatrixWallpaper/DesktopWindow.swift create mode 100644 Sources/MatrixWallpaper/WallpaperApp.swift create mode 100644 Sources/MatrixWallpaper/WallpaperPlaybackState.swift create mode 100644 Sources/MatrixWallpaper/main.swift create mode 100644 Tests/MatrixScreenSaverTests/WallpaperPlaybackStateTests.swift create mode 100644 Tests/MatrixWallpaperTests/SharedSaverTests.swift create mode 100644 Tests/MatrixWallpaperTests/WallpaperAppTests.swift create mode 100644 Tests/MatrixWallpaperTests/main.swift create mode 100755 build-wallpaper.sh create mode 100755 wallpaper-tests.sh diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index daca352..9f6a015 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -23,3 +23,12 @@ jobs: - name: Run tests run: ./tests.sh + + - name: Build screen saver + run: ./build.sh + + - name: Build wallpaper app + run: ./build-wallpaper.sh + + - name: Run wallpaper AppKit checks + run: ./wallpaper-tests.sh diff --git a/README.md b/README.md index 9c8a50d..6f8fbd9 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,52 @@ The saver exposes a native **Options…** sheet. The values are stored with `Scr ## Development +### Desktop wallpaper app + +Build and launch the separate native menu bar app: + +```bash +./build-wallpaper.sh +open build/MatrixWallpaper.app +``` + +The **Matrix** menu provides **Start / Stop**, **Options…**, and **Quit**. +It renders the real saver independently on each display, with distinct rain and +coordinated scenes. Passive desktop-level windows leave input to Finder and do +not change your macOS wallpaper settings. Stop or Quit reveals your existing wallpaper. + +Options use the same `dev.patsch.MatrixScreenSaver` preferences as the screen saver. +Changes made in the app apply to all wallpaper displays and future saver sessions. +Glow, twinkle, rain density, glyphs, frame rate, error rate, and scan lines update +in place without replaying the intro. Character size, intro settings, and rain +cycle mode/duration restart all displays together. +Changes made elsewhere are reloaded on Start and when opening Options; running +processes do not continuously synchronize preferences. + +Playback suspends for sleep, inactive sessions, lock, and screen saver activity. +Stop remains stopped after wake or unlock. Temporary suspension preserves the +current rain and intro state and excludes paused time from scene clocks. +Actual display geometry/scaling changes rebuild the coordinated session; +unchanged display notifications on wake do not restart it. +Lock and saver detection supplements public workspace notifications with +best-effort macOS distributed signals; delivery is not guaranteed. + +No automatic login startup, System Settings wallpaper registration, or private +Wallpaper.framework integration is installed. The existing `.saver` build and +installation remain separate. Desktop behavior across widgets, Spaces, Show Desktop, +Stage Manager, and fullscreen apps should be checked on the macOS version you use. + +Run the additional AppKit checks from a logged-in graphical macOS session: + +```bash +./wallpaper-tests.sh +``` + +These check native animation, passive windows, shared options UI, menu actions, +notification-driven suspension, display reconciliation, and cleanup. They briefly +create desktop windows and open Options; they do not alter your saved saver settings. +Actual lock/sleep/saver transitions and physical display hotplug still need live checks. + ### Current state - Native Swift/AppKit screen saver bundle diff --git a/Resources/Wallpaper-Info.plist b/Resources/Wallpaper-Info.plist new file mode 100644 index 0000000..81f1fed --- /dev/null +++ b/Resources/Wallpaper-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleExecutable + MatrixWallpaper + CFBundleIdentifier + dev.patsch.MatrixWallpaper + CFBundleName + Matrix Wallpaper + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.0.0 + CFBundleVersion + 0.0.0 + LSUIElement + + NSHighResolutionCapable + + NSPrincipalClass + NSApplication + + diff --git a/Sources/MatrixScreenSaver/MatrixScreenSaverOptions.swift b/Sources/MatrixScreenSaver/MatrixScreenSaverOptions.swift index ca23bfe..6849323 100644 --- a/Sources/MatrixScreenSaver/MatrixScreenSaverOptions.swift +++ b/Sources/MatrixScreenSaver/MatrixScreenSaverOptions.swift @@ -88,6 +88,18 @@ struct MatrixScreenSaverOptions: Equatable { var scanLinesIntensity = defaultScanLinesIntensity var scanLinesVertical = defaultScanLinesVertical + /// Identifies changes that rebuild the grid or alter the coordinated scene sequence. + /// + /// - Parameter previous: Configuration currently applied to the session. + /// - Returns: Whether all displays must restart together rather than update in place. + func requiresSceneRestart(comparedTo previous: MatrixScreenSaverOptions) -> Bool { + characterWidth != previous.characterWidth || characterHeight != previous.characterHeight || + neoMessageSceneEnabled != previous.neoMessageSceneEnabled || + neoMessageSpeedFactor != previous.neoMessageSpeedFactor || neoMessageLines != previous.neoMessageLines || + numberSceneEnabled != previous.numberSceneEnabled || + rainRunForever != previous.rainRunForever || rainDurationSeconds != previous.rainDurationSeconds + } + /// Converts persisted options into the renderer configuration type. func rendererConfiguration(isPreview: Bool = false) -> NativeMatrixRenderer.Configuration { NativeMatrixRenderer.Configuration( @@ -243,7 +255,8 @@ final class MatrixScreenSaverOptionsSheetController: NSObject, } } - private weak var owner: MatrixScreenSaverView? + /// Delivers validated options to either the saver view or the wallpaper host. + private let onApply: (MatrixScreenSaverOptions) -> Void var onClose: (() -> Void)? private let window: NSWindow @@ -301,9 +314,11 @@ final class MatrixScreenSaverOptionsSheetController: NSObject, private let charactersField = NSTextField(string: "") private var didClose = false - /// Creates the options sheet controller for a specific saver view instance. - init(owner: MatrixScreenSaverView) { - self.owner = owner + /// Creates native options UI with a host-owned apply action. + /// + /// - Parameter onApply: Receives validated options when the user chooses Apply. + init(onApply: @escaping (MatrixScreenSaverOptions) -> Void) { + self.onApply = onApply window = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 1, height: 1), styleMask: [.titled, .closable], @@ -349,12 +364,8 @@ final class MatrixScreenSaverOptionsSheetController: NSObject, /// Validates and applies the edited options. @objc private func apply(_ sender: Any?) { do { - guard let owner else { - closeSheet(with: .cancel) - return - } let options = try validatedOptions() - owner.applySaverOptionsFromSheet(options) + onApply(options) closeSheet(with: .OK) } catch { presentValidationAlert(message: error.localizedDescription) diff --git a/Sources/MatrixScreenSaver/MatrixScreenSaverView.swift b/Sources/MatrixScreenSaver/MatrixScreenSaverView.swift index ad20a59..5bf9b23 100644 --- a/Sources/MatrixScreenSaver/MatrixScreenSaverView.swift +++ b/Sources/MatrixScreenSaver/MatrixScreenSaverView.swift @@ -6,8 +6,9 @@ final class MatrixScreenSaverView: ScreenSaverView { private static let terminalTitle = "cxxmatrix" private static let screenSaverWillStopNotification = Notification.Name("com.apple.screensaver.willstop") private static let screenSaverDidStopNotification = Notification.Name("com.apple.screensaver.didstop") - private static let defaults: ScreenSaverDefaults = { - let moduleName = Bundle(for: MatrixScreenSaverView.self).bundleIdentifier ?? "MatrixScreenSaver" + /// Keeps saver preferences shared even when this view is compiled into a different host. + static let defaults: ScreenSaverDefaults = { + let moduleName = "dev.patsch.MatrixScreenSaver" guard let defaults = ScreenSaverDefaults(forModuleWithName: moduleName) else { fatalError("Unable to create ScreenSaverDefaults for \(moduleName)") } @@ -34,6 +35,12 @@ final class MatrixScreenSaverView: ScreenSaverView { ]) private var animationActive = false + /// Whether the wallpaper host has suspended the framework timer while preserving renderer state. + private var wallpaperAnimationPaused = false + + /// Enables coordinated scenes while the wallpaper app owns system suspension handling. + /// Set before starting animation; ordinary saver and preview hosts keep the default. + var isWallpaperHost = false private var terminalSize: TerminalSize? private var hasLoggedFirstDraw = false private var geometrySyncInProgress = false @@ -184,7 +191,7 @@ final class MatrixScreenSaverView: ScreenSaverView { saverOptions = Self.loadSaverOptions() } shouldReloadOptionsOnStart = true - let skipSyncDelay = isPreview || !Self.isRunningInScreenSaverEngine + let skipSyncDelay = isPreview || (!isWallpaperHost && !Self.isRunningInScreenSaverEngine) nativeRenderer.updateConfiguration(saverOptions.rendererConfiguration(isPreview: skipSyncDelay)) animationTimeInterval = nativeRenderer.preferredAnimationTimeInterval NSLog("MatrixScreenSaver startAnimation bounds=%@", NSStringFromRect(bounds)) @@ -210,6 +217,7 @@ final class MatrixScreenSaverView: ScreenSaverView { override func stopAnimation() { let wasActive = animationActive animationActive = false + wallpaperAnimationPaused = false pendingSync = false pendingRestart = false pendingSceneAdvance = false @@ -225,10 +233,12 @@ final class MatrixScreenSaverView: ScreenSaverView { /// Advances the simulation and schedules redraws when the frame changed. override func animateOneFrame() { - guard animationActive else { + guard animationActive && !wallpaperAnimationPaused else { return } guard isHostWindowVisibleForAnimation else { + // The wallpaper app owns resumption when desktop visibility changes. + guard !isWallpaperHost else { return } let now = Date.timeIntervalSinceReferenceDate if firstHiddenFrameTime == 0 { firstHiddenFrameTime = now @@ -252,6 +262,9 @@ final class MatrixScreenSaverView: ScreenSaverView { guard let time = startTime else { return } + nativeRenderer.overrideSceneContentStartTime = pendingRestart + ? ScreenSyncCoordinator.shared.restartContentTime + : ScreenSyncCoordinator.shared.startContentTime pendingSync = false if pendingRestart { ScreenSyncCoordinator.shared.finishRestart(ObjectIdentifier(self)) @@ -429,7 +442,7 @@ final class MatrixScreenSaverView: ScreenSaverView { guard let self, self.animationActive else { return } - if !window.isVisible { + if !window.isVisible && !self.isWallpaperHost { self.handleHostDetachment(reason: "window-hidden") } }, @@ -465,6 +478,7 @@ final class MatrixScreenSaverView: ScreenSaverView { /// Starts observing distributed screen saver lifecycle notifications. private func updateScreenSaverLifecycleObservation() { stopObservingScreenSaverLifecycle() + guard !isWallpaperHost else { return } let center = DistributedNotificationCenter.default() screenSaverLifecycleObservers = [ @@ -994,7 +1008,32 @@ final class MatrixScreenSaverView: ScreenSaverView { /// Applies options coming back from the configure sheet. func applySaverOptionsFromSheet(_ options: MatrixScreenSaverOptions) { - applySaverOptions(options, persist: true, restartAnimation: animationActive) + let restart = options.sanitized().requiresSceneRestart(comparedTo: saverOptions) + applySaverOptions(options, persist: true, restartAnimation: animationActive && restart) + } + + /// Applies host-persisted rendering options without resetting a coordinated wallpaper session. + /// + /// - Parameter options: Visual options that do not require a grid or scene rebuild. + func applyWallpaperOptions(_ options: MatrixScreenSaverOptions) { + applySaverOptions(options, persist: false, restartAnimation: false) + } + + /// Stops framework frame scheduling without releasing cells or scene-barrier membership. + func pauseWallpaperAnimation() { + guard isWallpaperHost, animationActive, !wallpaperAnimationPaused else { return } + wallpaperAnimationPaused = true + super.stopAnimation() + } + + /// Resumes the preserved wallpaper scene after excluding a shared suspension interval. + /// + /// - Parameter duration: Wall-clock pause duration, identical for every display. + func resumeWallpaperAnimation(after duration: TimeInterval) { + guard wallpaperAnimationPaused else { return } + nativeRenderer.shiftTimeline(by: duration) + wallpaperAnimationPaused = false + super.startAnimation() } /// Applies options to the live saver and optionally persists or restarts it. @@ -1011,7 +1050,8 @@ final class MatrixScreenSaverView: ScreenSaverView { stopAnimation() } - nativeRenderer.updateConfiguration(sanitizedOptions.rendererConfiguration()) + let skipSyncDelay = isPreview || (!isWallpaperHost && !Self.isRunningInScreenSaverEngine) + nativeRenderer.updateConfiguration(sanitizedOptions.rendererConfiguration(isPreview: skipSyncDelay)) animationTimeInterval = nativeRenderer.preferredAnimationTimeInterval updateLayout() @@ -1024,14 +1064,16 @@ final class MatrixScreenSaverView: ScreenSaverView { } /// Loads persisted options from ScreenSaverDefaults. - private static func loadSaverOptions() -> MatrixScreenSaverOptions { + static func loadSaverOptions() -> MatrixScreenSaverOptions { defaults.synchronize() return MatrixScreenSaverOptions.load(from: defaults) } /// Creates a fresh configure-sheet controller for each presentation. private func makeOptionsSheetController() -> MatrixScreenSaverOptionsSheetController { - let controller = MatrixScreenSaverOptionsSheetController(owner: self) + let controller = MatrixScreenSaverOptionsSheetController { [weak self] options in + self?.applySaverOptionsFromSheet(options) + } controller.onClose = { [weak self, weak controller] in guard let self, let controller, self.optionsSheetController === controller else { return diff --git a/Sources/MatrixScreenSaver/NativeMatrixRenderer.swift b/Sources/MatrixScreenSaver/NativeMatrixRenderer.swift index ef2927c..304771f 100644 --- a/Sources/MatrixScreenSaver/NativeMatrixRenderer.swift +++ b/Sources/MatrixScreenSaver/NativeMatrixRenderer.swift @@ -253,6 +253,9 @@ final class NativeMatrixRenderer { /// moment. var overrideSceneStartTime: TimeInterval? + /// Stable scripted-content date supplied separately when a shared playback anchor was paused. + var overrideSceneContentStartTime: TimeInterval? + private var configuration = Configuration() private var activeGlyphPool: [UnicodeScalar] = NativeMatrixRenderer.defaultGlyphPool @@ -300,6 +303,8 @@ final class NativeMatrixRenderer { private var numberIntroCursorVisible = false private var numberIntroRainFrame = 0 private var sceneStartTime: TimeInterval = 0 // 5-second-quantised anchor — shared across displays + /// Immutable session date keeps scripted text identical when displays cross a phase barrier around a pause. + private var sceneContentStartTime: TimeInterval = 0 private var sceneSeed: UInt64 = 0 // seed derived from sceneStartTime private var numberSceneRNG: Xorshift64 = Xorshift64(seed: 1) private var rainRNG: Xorshift64 = Xorshift64(seed: 1) @@ -374,6 +379,18 @@ final class NativeMatrixRenderer { running = false } + /// Excludes paused wall-clock time while retaining cells, random state, and scene progress. + /// + /// - Parameter duration: Shared suspension duration for all participating displays. + func shiftTimeline(by duration: TimeInterval) { + lastUpdateTime += duration + sceneStartTime += duration + numberIntroAnchor += duration + rainStartTime += duration + if let start = overrideSceneStartTime { overrideSceneStartTime = start + duration } + neoScene.shiftTimeline(by: duration) + } + /// Returns whether a restart has been requested (by `stepRainFrame()` when /// rain drains), then clears the flag. The View uses this to coordinate /// the restart across all displays via the ``ScreenSyncCoordinator``. @@ -437,8 +454,10 @@ final class NativeMatrixRenderer { let previousConfiguration = self.configuration let sanitizedConfiguration = configuration.sanitized() self.configuration = sanitizedConfiguration - lastUpdateTime = Date.timeIntervalSinceReferenceDate - pendingSimulationSteps = 0.0 + if !running { + lastUpdateTime = Date.timeIntervalSinceReferenceDate + pendingSimulationSteps = 0.0 + } activeGlyphPool = Self.resolveGlyphPool(characters: sanitizedConfiguration.characters) @@ -455,6 +474,7 @@ final class NativeMatrixRenderer { } else if columns > 0, rows > 0, activeScene == .rainForever { constructRenderContent() } + markAllRowsDirty() } /// Advances the renderer by the elapsed time and reports whether output changed. @@ -566,7 +586,7 @@ final class NativeMatrixRenderer { let cursorBlinkEnd = Double(Self.numberIntroCursorBlinkCount * 2) * Self.numberIntroCursorBlinkPeriod - let blinkEndDate = Date(timeIntervalSinceReferenceDate: numberIntroAnchor + cursorBlinkEnd) + let blinkEndDate = Date(timeIntervalSinceReferenceDate: sceneContentStartTime + neoWallDuration + cursorBlinkEnd) let formatter = DateFormatter() formatter.dateFormat = "MM-dd-yy" let dateString = formatter.string(from: blinkEndDate) @@ -905,7 +925,8 @@ final class NativeMatrixRenderer { let syncWindow: TimeInterval = 10.0 sceneStartTime = floor(nowTime / syncWindow) * syncWindow + syncWindow } - sceneSeed = UInt64(bitPattern: Int64(sceneStartTime)) + sceneContentStartTime = overrideSceneContentStartTime ?? sceneStartTime + sceneSeed = UInt64(bitPattern: Int64(sceneContentStartTime)) rainRNG = Xorshift64(seed: sceneSeed &+ 3 &+ seedOffset) guard columns > 0, rows > 0 else { diff --git a/Sources/MatrixScreenSaver/NeoMessageScene.swift b/Sources/MatrixScreenSaver/NeoMessageScene.swift index a27c535..549458d 100644 --- a/Sources/MatrixScreenSaver/NeoMessageScene.swift +++ b/Sources/MatrixScreenSaver/NeoMessageScene.swift @@ -88,6 +88,13 @@ struct NeoMessageScene { cursorVisible = true } + /// Excludes a suspended interval without rebuilding the typing schedule. + /// + /// - Parameter duration: Wall-clock seconds during which animation was paused. + mutating func shiftTimeline(by duration: TimeInterval) { + startTime += duration + } + mutating func advance(now: TimeInterval) { guard !schedule.isEmpty else { return } diff --git a/Sources/MatrixScreenSaver/ScreenSyncCoordinator.swift b/Sources/MatrixScreenSaver/ScreenSyncCoordinator.swift index 851ea47..d53efcb 100644 --- a/Sources/MatrixScreenSaver/ScreenSyncCoordinator.swift +++ b/Sources/MatrixScreenSaver/ScreenSyncCoordinator.swift @@ -29,6 +29,12 @@ final class ScreenSyncCoordinator { private var firstRegistrationTime: TimeInterval = 0 private var resolvedTime: TimeInterval? + /// Immutable startup date used for scripted content and seeds even if playback clocks pause. + private(set) var startContentTime: TimeInterval? + + /// Immutable content date for the currently resolved rain restart. + private(set) var restartContentTime: TimeInterval? + /// Instances that have requested a rain restart. private var restartRequestedIDs: Set = [] /// Resolved time for the next coordinated restart, once all displays are ready. @@ -70,6 +76,7 @@ final class ScreenSyncCoordinator { self.maxExpectedCount = max(expectedCount, 1) firstRegistrationTime = Date.timeIntervalSinceReferenceDate resolvedTime = nil + startContentTime = nil } else { // Update maxExpectedCount if a larger count is seen (handles delayed OS discovery). maxExpectedCount = max(maxExpectedCount, expectedCount) @@ -92,7 +99,9 @@ final class ScreenSyncCoordinator { phaseAdvanceRequestedIDs.remove(id) if registeredIDs.isEmpty { resolvedTime = nil + startContentTime = nil restartResolvedTime = nil + restartContentTime = nil phaseAdvanceResolvedTime = nil expectedCount = 0 maxExpectedCount = 0 @@ -116,6 +125,7 @@ final class ScreenSyncCoordinator { guard resolvedTime == nil, !registeredIDs.isEmpty else { return } if registeredIDs.count >= maxExpectedCount { resolvedTime = Date.timeIntervalSinceReferenceDate + Self.startDelay + startContentTime = resolvedTime } } @@ -128,6 +138,7 @@ final class ScreenSyncCoordinator { guard restartResolvedTime == nil, !restartRequestedIDs.isEmpty else { return } if restartRequestedIDs.count >= registeredIDs.count { restartResolvedTime = Date.timeIntervalSinceReferenceDate + Self.startDelay + restartContentTime = restartResolvedTime } } @@ -144,6 +155,7 @@ final class ScreenSyncCoordinator { if elapsed >= Self.registrationTimeout { let time = Date.timeIntervalSinceReferenceDate + Self.startDelay resolvedTime = time + startContentTime = time return time } return nil @@ -162,6 +174,7 @@ final class ScreenSyncCoordinator { if restartRequestedIDs.isEmpty { firstRestartRequestTime = Date.timeIntervalSinceReferenceDate restartResolvedTime = nil + restartContentTime = nil } restartRequestedIDs.insert(id) @@ -182,6 +195,7 @@ final class ScreenSyncCoordinator { if elapsed >= Self.restartSafetyTimeout { let time = Date.timeIntervalSinceReferenceDate + Self.startDelay restartResolvedTime = time + restartContentTime = time return time } return nil @@ -198,6 +212,7 @@ final class ScreenSyncCoordinator { restartRequestedIDs.remove(id) if restartRequestedIDs.isEmpty { restartResolvedTime = nil + restartContentTime = nil } } @@ -264,6 +279,19 @@ final class ScreenSyncCoordinator { } } + /// Excludes a shared pause from startup and scene-barrier deadlines without unregistering views. + /// + /// - Parameter duration: Wall-clock seconds during which every participant was paused. + func shiftTimeline(by duration: TimeInterval) { + guard !registeredIDs.isEmpty else { return } + firstRegistrationTime += duration + firstRestartRequestTime += duration + firstPhaseAdvanceRequestTime += duration + if let time = resolvedTime { resolvedTime = time + duration } + if let time = restartResolvedTime { restartResolvedTime = time + duration } + if let time = phaseAdvanceResolvedTime { phaseAdvanceResolvedTime = time + duration } + } + /// Resets the coordinator to a clean state (for testing only). func _resetForTesting() { expectedCount = 0 @@ -271,8 +299,10 @@ final class ScreenSyncCoordinator { registeredIDs = [] firstRegistrationTime = 0 resolvedTime = nil + startContentTime = nil restartRequestedIDs = [] restartResolvedTime = nil + restartContentTime = nil firstRestartRequestTime = 0 phaseAdvanceRequestedIDs = [] phaseAdvanceResolvedTime = nil diff --git a/Sources/MatrixWallpaper/DesktopWindow.swift b/Sources/MatrixWallpaper/DesktopWindow.swift new file mode 100644 index 0000000..fb68f87 --- /dev/null +++ b/Sources/MatrixWallpaper/DesktopWindow.swift @@ -0,0 +1,32 @@ +import AppKit +import ScreenSaver + +/// A passive desktop surface that leaves input and desktop management to macOS. +final class DesktopWindow: NSWindow { + /// Prevents wallpaper windows from receiving keyboard focus. + override var canBecomeKey: Bool { false } + + /// Excludes wallpaper windows from the application's main-window role. + override var canBecomeMain: Bool { false } + + /// Hosts a full-quality saver at the display's full desktop frame. + /// + /// - Parameters: + /// - screen: Display whose desktop this window covers. + /// - saverView: Native saver view, created with preview mode disabled. + init(screen: NSScreen, saverView: ScreenSaverView) { + super.init(contentRect: screen.frame, styleMask: .borderless, backing: .buffered, defer: false) + // Explicit global coordinates also cover displays left of or above the primary display. + setFrame(screen.frame, display: false) + level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.desktopWindow))) + collectionBehavior = [.canJoinAllSpaces, .stationary, .ignoresCycle, .fullScreenNone] + ignoresMouseEvents = true + hasShadow = false + isOpaque = true + backgroundColor = .black + isReleasedWhenClosed = false + animationBehavior = .none + saverView.autoresizingMask = [.width, .height] + contentView = saverView + } +} diff --git a/Sources/MatrixWallpaper/WallpaperApp.swift b/Sources/MatrixWallpaper/WallpaperApp.swift new file mode 100644 index 0000000..01f958e --- /dev/null +++ b/Sources/MatrixWallpaper/WallpaperApp.swift @@ -0,0 +1,225 @@ +import AppKit +import ScreenSaver + +/// Menu bar host for native Matrix animation behind desktop content. +final class WallpaperApp: NSObject, NSApplicationDelegate { + /// Retains the status item for the lifetime of the application. + private var statusItem: NSStatusItem? + + /// Owns the native desktop surfaces until playback ends. + private var windows: [DesktopWindow] = [] + + /// User intent and independent suspension conditions for this session. + private var playback = WallpaperPlaybackState() + + /// Menu action whose label follows requested playback, not temporary suspension. + private let playbackItem = NSMenuItem(title: "Stop", action: #selector(togglePlayback(_:)), keyEquivalent: "") + + /// Retains native options UI independently of transient wallpaper views. + private var optionsController: MatrixScreenSaverOptionsSheetController? + + /// Notification registrations paired with their owning centers for deterministic cleanup. + private var observers: [(NotificationCenter, NSObjectProtocol)] = [] + + /// Shared wall-clock pause anchor; duplicate suspension events must not replace it. + private var suspendedAt: TimeInterval? + + /// Options currently applied to the preserved session. + private var currentOptions = MatrixScreenSaverOptions() + + /// Captured display geometry distinguishes real topology changes from wake notifications. + private struct DisplayLayout: Equatable { + let id: UInt32 + let frame: NSRect + let scale: CGFloat + } + + private var displayLayout: [DisplayLayout] = [] + + private var currentDisplayLayout: [DisplayLayout] { + NSScreen.screens.map { + DisplayLayout(id: $0.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? UInt32 ?? 0, + frame: $0.frame, scale: $0.backingScaleFactor) + }.sorted { $0.id < $1.id } + } + + /// Creates menu controls and begins observing desktop playback conditions. + func applicationDidFinishLaunching(_ notification: Notification) { + let item = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) + item.button?.title = "Matrix" + let menu = NSMenu() + playbackItem.target = self + menu.addItem(playbackItem) + let options = NSMenuItem(title: "Options…", action: #selector(showOptions(_:)), keyEquivalent: "") + options.target = self + menu.addItem(options) + menu.addItem(.separator()) + let quit = NSMenuItem(title: "Quit Matrix Wallpaper", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q") + quit.target = NSApp + menu.addItem(quit) + item.menu = menu + statusItem = item + + observeSystemState() + if let session = CGSessionCopyCurrentDictionary() as? [String: Any] { + playback.setSuspended(.sessionInactive, (session[kCGSessionOnConsoleKey as String] as? Bool) == false) + } + playback.setSuspended(.displaysSleeping, NSScreen.screens.allSatisfy { screen in + guard let id = screen.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? UInt32 else { return false } + return CGDisplayIsAsleep(id) != 0 + }) + reconcilePlayback() + } + + /// Starts or stops at the user's request without overriding system suspension. + @objc private func togglePlayback(_ sender: Any?) { + playback.isRequested.toggle() + reconcilePlayback() + } + + /// Presents the shared native options window; only this explicit action activates the app. + @objc private func showOptions(_ sender: Any?) { + if let optionsController { + optionsController.configureSheet().makeKeyAndOrderFront(nil) + NSApp.activate(ignoringOtherApps: true) + return + } + let controller = MatrixScreenSaverOptionsSheetController { [weak self] options in + self?.applyOptions(options) + } + controller.onClose = { [weak self] in self?.optionsController = nil } + controller.prepare(using: MatrixScreenSaverView.loadSaverOptions()) + optionsController = controller + controller.configureSheet().center() + controller.configureSheet().makeKeyAndOrderFront(nil) + NSApp.activate(ignoringOtherApps: true) + } + + /// Updates ordinary rendering settings in place; grid and scene-cycle changes restart together. + private func applyOptions(_ options: MatrixScreenSaverOptions) { + let options = options.sanitized() + let restart = options.requiresSceneRestart(comparedTo: currentOptions) + options.save(to: MatrixScreenSaverView.defaults) + currentOptions = options + if restart { + reconcilePlayback(restart: true) + } else { + for window in windows { (window.contentView as? MatrixScreenSaverView)?.applyWallpaperOptions(options) } + } + } + + /// Rebuilds the whole participating session, never leaving stale scene-barrier members. + /// + /// - Parameter restart: Forces coordinated reconstruction after options or display changes. + private func reconcilePlayback(restart: Bool = false) { + playbackItem.title = playback.isRequested ? "Stop" : "Start" + if !playback.isRequested || restart { removeDesktopWindows() } + guard playback.isRequested else { return } + guard playback.shouldRun else { + if suspendedAt == nil && !windows.isEmpty { + suspendedAt = Date.timeIntervalSinceReferenceDate + for window in windows { + (window.contentView as? MatrixScreenSaverView)?.pauseWallpaperAnimation() + window.orderOut(nil) + } + } + return + } + if let suspendedAt { + let duration = Date.timeIntervalSinceReferenceDate - suspendedAt + ScreenSyncCoordinator.shared.shiftTimeline(by: duration) + for window in windows { + window.orderBack(nil) + (window.contentView as? MatrixScreenSaverView)?.resumeWallpaperAnimation(after: duration) + } + self.suspendedAt = nil + } + guard windows.isEmpty else { return } + currentOptions = MatrixScreenSaverView.loadSaverOptions() + displayLayout = currentDisplayLayout + for screen in NSScreen.screens { + guard let saver = MatrixScreenSaverView(frame: NSRect(origin: .zero, size: screen.frame.size), isPreview: false) else { + let alert = NSAlert() + alert.messageText = "Could not start Matrix Wallpaper" + alert.informativeText = "The native screen saver view could not be created." + alert.runModal() + NSApp.terminate(nil) + return + } + saver.isWallpaperHost = true + let window = DesktopWindow(screen: screen, saverView: saver) + windows.append(window) + } + // Attach every display before starting registration and the framework's animation timers. + for window in windows { + window.orderBack(nil) + (window.contentView as? ScreenSaverView)?.startAnimation() + } + } + + /// Unregisters every view before closing any window or starting a replacement session. + private func removeDesktopWindows() { + for window in windows { (window.contentView as? ScreenSaverView)?.stopAnimation() } + for window in windows { + window.close() + } + windows.removeAll() + suspendedAt = nil + displayLayout = [] + } + + /// Observes documented workspace state plus best-effort lock/saver distributed signals. + private func observeSystemState() { + let workspace = NSWorkspace.shared.notificationCenter + for (start, end, reason) in [ + (NSWorkspace.willSleepNotification, NSWorkspace.didWakeNotification, WallpaperPlaybackState.Suspension.sleeping), + (NSWorkspace.screensDidSleepNotification, NSWorkspace.screensDidWakeNotification, .displaysSleeping), + (NSWorkspace.sessionDidResignActiveNotification, NSWorkspace.sessionDidBecomeActiveNotification, .sessionInactive), + ] { + observeSuspension(in: workspace, start: start, end: end, reason: reason) + } + let distributed = DistributedNotificationCenter.default() + // These names are best-effort macOS observations, not a documented lock/security contract. + observeSuspension(in: distributed, start: Notification.Name("com.apple.screenIsLocked"), + end: Notification.Name("com.apple.screenIsUnlocked"), reason: .locked) + observeSuspension(in: distributed, start: Notification.Name("com.apple.screensaver.didstart"), + end: Notification.Name("com.apple.screensaver.didstop"), reason: .screenSaver) + observe(distributed, name: Notification.Name("com.apple.screensaver.willstart")) { [weak self] in + self?.setSuspended(.screenSaver, true) + } + observe(NotificationCenter.default, name: NSApplication.didChangeScreenParametersNotification) { [weak self] in + guard let self, self.displayLayout != self.currentDisplayLayout else { return } + self.reconcilePlayback(restart: true) + } + } + + /// Registers a matching pair of notifications for one independent suspension reason. + private func observeSuspension(in center: NotificationCenter, start: Notification.Name, end: Notification.Name, + reason: WallpaperPlaybackState.Suspension) { + observe(center, name: start) { [weak self] in self?.setSuspended(reason, true) } + observe(center, name: end) { [weak self] in self?.setSuspended(reason, false) } + } + + /// Retains a main-thread notification registration until Quit. + private func observe(_ center: NotificationCenter, name: Notification.Name, action: @escaping () -> Void) { + let token = center.addObserver(forName: name, object: nil, queue: .main) { _ in action() } + observers.append((center, token)) + } + + /// Applies a system condition without starting a stopped or still-suspended session. + private func setSuspended(_ reason: WallpaperPlaybackState.Suspension, _ suspended: Bool) { + playback.setSuspended(reason, suspended) + reconcilePlayback() + } + + /// Removes observers and native animation work before the process exits. + func applicationWillTerminate(_ notification: Notification) { + for (center, token) in observers { center.removeObserver(token) } + observers.removeAll() + removeDesktopWindows() + optionsController?.configureSheet().close() + optionsController = nil + if let statusItem { NSStatusBar.system.removeStatusItem(statusItem) } + statusItem = nil + } +} diff --git a/Sources/MatrixWallpaper/WallpaperPlaybackState.swift b/Sources/MatrixWallpaper/WallpaperPlaybackState.swift new file mode 100644 index 0000000..b9ad656 --- /dev/null +++ b/Sources/MatrixWallpaper/WallpaperPlaybackState.swift @@ -0,0 +1,36 @@ +import Foundation + +/// Keeps explicit playback intent separate from overlapping temporary system conditions. +struct WallpaperPlaybackState { + /// Independent reasons why rendering must remain suspended. + enum Suspension: Hashable { + /// The computer is sleeping. + case sleeping + /// The displays are asleep independently of computer sleep. + case displaysSleeping + /// Another login session is active. + case sessionInactive + /// The screen is locked. + case locked + /// The real screen saver is active. + case screenSaver + } + + /// Whether the user wants wallpaper playback, even if it cannot run right now. + var isRequested = true + + /// Conditions that have not yet received a matching resume notification. + private var suspensions: Set = [] + + /// Whether animation may run after combining user intent and system state. + var shouldRun: Bool { isRequested && suspensions.isEmpty } + + /// Updates one condition idempotently without clearing unrelated conditions. + /// + /// - Parameters: + /// - reason: System condition reported by the host. + /// - suspended: Whether that condition is currently active. + mutating func setSuspended(_ reason: Suspension, _ suspended: Bool) { + if suspended { suspensions.insert(reason) } else { suspensions.remove(reason) } + } +} diff --git a/Sources/MatrixWallpaper/main.swift b/Sources/MatrixWallpaper/main.swift new file mode 100644 index 0000000..fe2527b --- /dev/null +++ b/Sources/MatrixWallpaper/main.swift @@ -0,0 +1,9 @@ +import AppKit + +/// Accessory application without a Dock icon or desktop activation. +let app = NSApplication.shared +/// Retains the application delegate for the lifetime of the menu bar host. +let delegate = WallpaperApp() +app.setActivationPolicy(.accessory) +app.delegate = delegate +withExtendedLifetime(delegate) { app.run() } diff --git a/Tests/MatrixScreenSaverTests/NativeMatrixRendererTests.swift b/Tests/MatrixScreenSaverTests/NativeMatrixRendererTests.swift index 576e5f5..5940e5a 100644 --- a/Tests/MatrixScreenSaverTests/NativeMatrixRendererTests.swift +++ b/Tests/MatrixScreenSaverTests/NativeMatrixRendererTests.swift @@ -1,3 +1,5 @@ +import Foundation + func nativeMatrixRendererTests() { ok(NativeMatrixRenderer().seedOffset == 0, "NativeMatrixRenderer: seedOffset defaults to 0") @@ -31,4 +33,93 @@ func nativeMatrixRendererTests() { for _ in 0..<60 { r1.advance(); r2.advance() } let differ = (0..<20).contains { row in (0..<40).contains { col in r1[row, col] != r2[row, col] } } ok(differ, "NativeMatrixRenderer: renderers with different seedOffsets diverge after 60 frames") + + var neo = NeoMessageScene() + neo.reset(startTime: 100, seed: 1) + neo.advance(now: 100.25) + let before = neo.renderState + neo.shiftTimeline(by: 3600) + neo.advance(now: 3700.25) + let after = neo.renderState + ok(before.currentLine == after.currentLine && before.visibleCharCount == after.visibleCharCount && before.cursorVisible == after.cursorVisible, + "NeoMessageScene: suspension preserves text and cursor rather than skipping the intro") + + let paused = NativeMatrixRenderer() + var intro = NativeMatrixRenderer.Configuration() + intro.neoMessageSpeedFactor = 0.1 + paused.updateConfiguration(intro) + paused.resize(to: TerminalSize(columns: 40, rows: 20)) + paused.overrideSceneStartTime = Date.timeIntervalSinceReferenceDate - 0.25 + paused.start() + Thread.sleep(forTimeInterval: 0.05) + paused.advance() + let cursorBefore = paused.neoSceneCursor + let rain = NativeMatrixRenderer() + cfg.twinkleEnabled = false + rain.updateConfiguration(cfg) + rain.resize(to: TerminalSize(columns: 40, rows: 20)) + rain.start() + let rainBefore = (0..<20).flatMap { row in (0..<40).map { rain[row, $0] } } + let pauseStart = Date.timeIntervalSinceReferenceDate + Thread.sleep(forTimeInterval: 1.2) + let pausedDuration = Date.timeIntervalSinceReferenceDate - pauseStart + paused.shiftTimeline(by: pausedDuration) + rain.shiftTimeline(by: pausedDuration) + paused.advance() + rain.advance() + let rainAfter = (0..<20).flatMap { row in (0..<40).map { rain[row, $0] } } + ok(rainBefore == rainAfter, "NativeMatrixRenderer: rain cells retain their positions across suspension") + let cursorAfter = paused.neoSceneCursor + ok(cursorBefore != nil && cursorBefore?.column == cursorAfter?.column && cursorBefore?.visible == cursorAfter?.visible, + "NativeMatrixRenderer: resuming excludes suspended time without resetting the intro") + + let early = NativeMatrixRenderer(), late = NativeMatrixRenderer(), lateStartup = NativeMatrixRenderer() + var scripted = NativeMatrixRenderer.Configuration() + scripted.neoMessageLines = ["X"] + scripted.neoMessageSpeedFactor = 1000 + let sharedStart = Date.timeIntervalSinceReferenceDate - 3 + var schedule = NeoMessageScene() + schedule.reset(startTime: sharedStart, seed: UInt64(bitPattern: Int64(sharedStart)) &+ 1, + lines: scripted.neoMessageLines, speedFactor: scripted.neoMessageSpeedFactor) + for renderer in [early, late] { + renderer.updateConfiguration(scripted) + renderer.resize(to: TerminalSize(columns: 100, rows: 12)) + renderer.overrideSceneStartTime = sharedStart + renderer.start() + } + early.advanceToNextScene() + let suspendedAt = Date.timeIntervalSinceReferenceDate + Thread.sleep(forTimeInterval: 1.2) + let duration = Date.timeIntervalSinceReferenceDate - suspendedAt + early.shiftTimeline(by: duration) + late.shiftTimeline(by: duration) + late.advanceToNextScene() + lateStartup.updateConfiguration(scripted) + lateStartup.resize(to: TerminalSize(columns: 100, rows: 12)) + lateStartup.overrideSceneStartTime = sharedStart + duration + lateStartup.overrideSceneContentStartTime = sharedStart + lateStartup.start() + lateStartup.advanceToNextScene() + let timestamp = Date(timeIntervalSinceReferenceDate: sharedStart + schedule.scheduledDuration + 2) + let formatter = DateFormatter() + formatter.dateFormat = "MM-dd-yy" + let dateText = formatter.string(from: timestamp) + formatter.dateFormat = "H:mm:ss" + let expectedText = "Call trans opt: received. \(dateText) \(formatter.string(from: timestamp)) REC:Log>" + var typingRNG = Xorshift64(seed: UInt64(bitPattern: Int64(sharedStart)) &+ 2) + let typingDuration = NativeMatrixRenderer.naturalTypingTimings(for: expectedText, + baseInterval: 1.0 / 40 / scripted.neoMessageSpeedFactor, + rng: &typingRNG).last ?? 0 + let typingTime = sharedStart + duration + schedule.scheduledDuration + 2 + typingDuration + 0.1 + Thread.sleep(forTimeInterval: max(0, typingTime - Date.timeIntervalSinceReferenceDate)) + early.advance() + late.advance() + lateStartup.advance() + let row = NativeMatrixRenderer.contentMargin + let earlyText = (0..<100).map { early[row, $0].scalar } + let lateText = (0..<100).map { late[row, $0].scalar } + let startupText = (0..<100).map { lateStartup[row, $0].scalar } + ok(String(String.UnicodeScalarView(earlyText)).contains(expectedText) && earlyText == lateText, + "NativeMatrixRenderer: pause between display phase advances preserves identical Number-scene timestamps") + ok(earlyText == startupText, "NativeMatrixRenderer: a display starting after resume keeps the same scripted content and seed") } diff --git a/Tests/MatrixScreenSaverTests/ScreenSyncCoordinatorTests.swift b/Tests/MatrixScreenSaverTests/ScreenSyncCoordinatorTests.swift index 0e159d2..a269875 100644 --- a/Tests/MatrixScreenSaverTests/ScreenSyncCoordinatorTests.swift +++ b/Tests/MatrixScreenSaverTests/ScreenSyncCoordinatorTests.swift @@ -2,6 +2,25 @@ import Foundation /// Tests for ScreenSyncCoordinator restart barrier resolution logic. func screenSyncCoordinatorTests() { + do { + let coordinator = ScreenSyncCoordinator.shared + coordinator._resetForTesting() + let participant = NSObject() + let id = ObjectIdentifier(participant) + coordinator.register(id, expectedCount: 1) + coordinator.requestRestart(id) + coordinator.requestPhaseAdvance(id) + let start = coordinator.resolvedStartTime()! + let restart = coordinator.resolvedRestartTime()! + let phase = coordinator.resolvedPhaseAdvanceTime()! + coordinator.shiftTimeline(by: 3600) + ok(coordinator.resolvedStartTime() == start + 3600 && coordinator.resolvedRestartTime() == restart + 3600 && coordinator.resolvedPhaseAdvanceTime() == phase + 3600, + "ScreenSyncCoordinator: suspension shifts all shared anchors without losing participants") + ok(coordinator.registeredCount == 1, "ScreenSyncCoordinator: suspension preserves barrier membership") + ok(coordinator.startContentTime == start && coordinator.restartContentTime == restart, + "ScreenSyncCoordinator: pause leaves session content timestamps immutable") + coordinator.unregister(id) + } // Test 1: All displays requesting → immediate resolution do { ScreenSyncCoordinator.shared._resetForTesting() diff --git a/Tests/MatrixScreenSaverTests/WallpaperPlaybackStateTests.swift b/Tests/MatrixScreenSaverTests/WallpaperPlaybackStateTests.swift new file mode 100644 index 0000000..1cfbe9f --- /dev/null +++ b/Tests/MatrixScreenSaverTests/WallpaperPlaybackStateTests.swift @@ -0,0 +1,29 @@ +import Foundation + +/// Verifies user intent remains independent of overlapping system suspension reasons. +func wallpaperPlaybackStateTests() { + var state = WallpaperPlaybackState() + ok(state.shouldRun, "WallpaperPlaybackState: launches with playback requested") + state.setSuspended(.locked, true) + state.setSuspended(.locked, true) + state.setSuspended(.sleeping, true) + ok(!state.shouldRun, "WallpaperPlaybackState: duplicate and overlapping suspension is idempotent") + state.setSuspended(.sleeping, false) + ok(!state.shouldRun, "WallpaperPlaybackState: waking does not override lock") + state.isRequested = false + state.setSuspended(.locked, false) + ok(!state.shouldRun, "WallpaperPlaybackState: Stop while suspended survives unlocking") + state.setSuspended(.screenSaver, true) + state.isRequested = true + ok(!state.shouldRun, "WallpaperPlaybackState: Start does not override an active screen saver") + state.setSuspended(.screenSaver, false) + ok(state.shouldRun, "WallpaperPlaybackState: resumes after the last suspension clears") + for reason in [WallpaperPlaybackState.Suspension.sessionInactive, .displaysSleeping] { + state.setSuspended(reason, true) + } + state.setSuspended(.sessionInactive, false) + ok(!state.shouldRun, "WallpaperPlaybackState: session activation does not override display sleep") + state.setSuspended(.displaysSleeping, false) + state.setSuspended(.displaysSleeping, false) + ok(state.shouldRun, "WallpaperPlaybackState: duplicate resume notifications are harmless") +} diff --git a/Tests/MatrixScreenSaverTests/main.swift b/Tests/MatrixScreenSaverTests/main.swift index 014d59c..5070fe5 100644 --- a/Tests/MatrixScreenSaverTests/main.swift +++ b/Tests/MatrixScreenSaverTests/main.swift @@ -18,6 +18,7 @@ func ok(_ condition: Bool, _ description: String, file: StaticString = #file, li xorshift64Tests() screenSyncCoordinatorTests() nativeMatrixRendererTests() +wallpaperPlaybackStateTests() print("1..\(testCount)") exit(failCount == 0 ? 0 : 1) diff --git a/Tests/MatrixWallpaperTests/SharedSaverTests.swift b/Tests/MatrixWallpaperTests/SharedSaverTests.swift new file mode 100644 index 0000000..10a634c --- /dev/null +++ b/Tests/MatrixWallpaperTests/SharedSaverTests.swift @@ -0,0 +1,118 @@ +import AppKit +import ScreenSaver + +/// Exercises the shared view and options controller through their hosting boundaries. +func sharedSaverTests() { + guard let screen = NSScreen.main, + let first = MatrixScreenSaverView(frame: screen.frame, isPreview: false), + let second = MatrixScreenSaverView(frame: screen.frame, isPreview: false) else { + check(false, "shared saver views can be created") + return + } + first.isWallpaperHost = true + second.isWallpaperHost = true + let firstWindow = DesktopWindow(screen: screen, saverView: first) + let secondWindow = DesktopWindow(screen: screen, saverView: second) + let additionalWindows = NSScreen.screens.dropFirst(2).map { screen -> DesktopWindow in + let saver = MatrixScreenSaverView(frame: screen.frame, isPreview: false)! + saver.isWallpaperHost = true + return DesktopWindow(screen: screen, saverView: saver) + } + secondWindow.setFrame(NSRect(x: screen.frame.minX, y: screen.frame.minY, width: 960, height: 600), display: false) + firstWindow.orderBack(nil) + secondWindow.orderBack(nil) + first.startAnimation() + second.startAnimation() + for window in additionalWindows { + window.orderBack(nil) + (window.contentView as! ScreenSaverView).startAnimation() + } + check(ScreenSyncCoordinator.shared.registeredCount == 2 + additionalWindows.count, "wallpaper hosts register for coordinated scenes") + check(first.bounds.size != second.bounds.size, "coordinated hosts retain their individual canvas sizes") + wait(2) + check(ScreenSyncCoordinator.shared.resolvedStartTime() != nil, "wallpaper participants share a resolved start") + let sharedStart = ScreenSyncCoordinator.shared.resolvedStartTime() + var liveOptions = MatrixScreenSaverView.loadSaverOptions() + liveOptions.frameRate = 42 + liveOptions.characters = "ATGC" + first.applyWallpaperOptions(liveOptions) + second.applyWallpaperOptions(liveOptions) + check(first.animationTimeInterval == 1.0 / 42 && second.animationTimeInterval == 1.0 / 42, + "live options update frame scheduling across wallpaper views") + check(ScreenSyncCoordinator.shared.resolvedStartTime() == sharedStart, + "live options preserve the coordinated scene anchor") + for name in ["com.apple.screensaver.willstop", "com.apple.screensaver.didstop"] { + DistributedNotificationCenter.default().postNotificationName(Notification.Name(name), object: nil, userInfo: nil, deliverImmediately: true) + } + wait(0.2) + check(first.isAnimating && second.isAnimating, "saver-stop notifications do not disable wallpaper-host views") + firstWindow.orderOut(nil) + wait(0.1) + check(first.isAnimating, "temporarily hidden wallpaper retains animation for automatic resumption") + firstWindow.orderBack(nil) + first.stopAnimation() + second.stopAnimation() + for window in additionalWindows { + (window.contentView as! ScreenSaverView).stopAnimation() + window.close() + } + check(ScreenSyncCoordinator.shared.registeredCount == 0, "stopping all hosts removes synchronization membership") + firstWindow.close() + secondWindow.close() + + // Keep real saver preferences untouched while exercising persistence and the native Apply action. + let domain = "dev.patsch.MatrixWallpaper.tests.\(UUID().uuidString)" + let defaults = ScreenSaverDefaults(forModuleWithName: domain)! + defer { defaults.removePersistentDomain(forName: domain); defaults.synchronize() } + MatrixScreenSaverOptions.registerDefaults(in: defaults) + var options = MatrixScreenSaverOptions.load(from: defaults) + options.frameRate = 42 + options.neoMessageLines = ["Shared options"] + var applied = false + let controller = MatrixScreenSaverOptionsSheetController { edited in + edited.save(to: defaults) + applied = true + } + controller.prepare(using: options) + let applyButton = buttons(in: controller.configureSheet().contentView!).first { $0.title == "OK" } + check(applyButton != nil, "native options window exposes Apply") + applyButton?.performClick(nil) + let loaded = MatrixScreenSaverOptions.load(from: defaults) + check(applied && loaded.frameRate == 42 && loaded.neoMessageLines == ["Shared options"], + "native Apply validates and delivers options through the reusable callback") + options.frameRate = -10 + options.save(to: defaults) + check(MatrixScreenSaverOptions.load(from: defaults).frameRate > 0, "shared persistence retains option sanitization") + + let original = MatrixScreenSaverOptions() + var live = original + live.twinkleEnabled.toggle() + live.diffuseEnabled.toggle() + live.rainDensity = 2 + live.frameRate = 42 + live.errorRate = 2 + live.characters = "ATGC" + live.scanLinesIntensity = 0.5 + live.scanLinesVertical.toggle() + check(!live.requiresSceneRestart(comparedTo: original), "visual and rain rendering settings apply without scene restart") + let structuralChanges: [(String, (inout MatrixScreenSaverOptions) -> Void)] = [ + ("character size", { $0.characterWidth += 1 }), + ("character height", { $0.characterHeight += 1 }), + ("Neo enablement", { $0.neoMessageSceneEnabled.toggle() }), + ("intro speed", { $0.neoMessageSpeedFactor = 2 }), + ("Neo lines", { $0.neoMessageLines = ["Changed intro"] }), + ("number intro", { $0.numberSceneEnabled.toggle() }), + ("rain cycle mode", { $0.rainRunForever.toggle() }), + ("rain cycle duration", { $0.rainDurationSeconds += 1 }), + ] + for (name, change) in structuralChanges { + var changed = original + change(&changed) + check(changed.requiresSceneRestart(comparedTo: original), "\(name) requests a coordinated scene restart") + } +} + +/// Finds actual controls so integration checks use the native UI action, not private methods. +private func buttons(in view: NSView) -> [NSButton] { + (view as? NSButton).map { [$0] } ?? view.subviews.flatMap { buttons(in: $0) } +} diff --git a/Tests/MatrixWallpaperTests/WallpaperAppTests.swift b/Tests/MatrixWallpaperTests/WallpaperAppTests.swift new file mode 100644 index 0000000..04e85ac --- /dev/null +++ b/Tests/MatrixWallpaperTests/WallpaperAppTests.swift @@ -0,0 +1,58 @@ +import AppKit + +/// Exercises the real host's menu actions, notifications, rebuilds, and cleanup. +func wallpaperAppTests() { + let host = WallpaperApp() + host.applicationDidFinishLaunching(Notification(name: NSApplication.didFinishLaunchingNotification)) + defer { host.applicationWillTerminate(Notification(name: NSApplication.willTerminateNotification)) } + check(desktopWindowCount() == NSScreen.screens.count, "app creates one desktop window per display") + check(ScreenSyncCoordinator.shared.registeredCount == NSScreen.screens.count, "app starts every display as one coordinated session") + let originalWindows = NSApp.windows.compactMap { $0 as? DesktopWindow }.filter(\.isVisible) + let originalIDs = Set(originalWindows.map(ObjectIdentifier.init)) + + let workspace = NSWorkspace.shared.notificationCenter + workspace.post(name: NSWorkspace.willSleepNotification, object: nil) + check(desktopWindowCount() == 0 && ScreenSyncCoordinator.shared.registeredCount == originalWindows.count, + "sleep hides windows but retains scene synchronization membership") + check(originalWindows.allSatisfy { ($0.contentView as? MatrixScreenSaverView)?.isAnimating == false }, + "sleep stops framework animation scheduling without destroying the views") + workspace.post(name: NSWorkspace.screensDidSleepNotification, object: nil) + workspace.post(name: NSWorkspace.didWakeNotification, object: nil) + check(desktopWindowCount() == 0, "computer wake does not override display sleep") + + workspace.post(name: NSWorkspace.screensDidWakeNotification, object: nil) + let resumedIDs = Set(NSApp.windows.filter { $0 is DesktopWindow && $0.isVisible }.map(ObjectIdentifier.init)) + check(resumedIDs == originalIDs && originalWindows.allSatisfy { ($0.contentView as? MatrixScreenSaverView)?.isAnimating == true }, + "wake resumes the same native views instead of replaying the intro") + NotificationCenter.default.post(name: NSApplication.didChangeScreenParametersNotification, object: nil) + check(Set(NSApp.windows.filter { $0 is DesktopWindow && $0.isVisible }.map(ObjectIdentifier.init)) == originalIDs, + "unchanged display notifications do not restart a resumed scene") + workspace.post(name: NSWorkspace.willSleepNotification, object: nil) + + check(NSApp.sendAction(NSSelectorFromString("togglePlayback:"), to: host, from: nil), "Stop menu action is connected") + workspace.post(name: NSWorkspace.didWakeNotification, object: nil) + workspace.post(name: NSWorkspace.screensDidWakeNotification, object: nil) + check(desktopWindowCount() == 0, "host preserves Stop after suspension clears") + NSApp.sendAction(NSSelectorFromString("showOptions:"), to: host, from: nil) + wait(0.1) + let optionsWindow = NSApp.windows.first { $0.isVisible && !($0 is DesktopWindow) && $0.canBecomeKey } + check(optionsWindow != nil, "Options opens a normal native window while stopped") + check(desktopWindowCount() == 0, "opening Options does not start stopped playback") + optionsWindow?.performClose(nil) + + NSApp.sendAction(NSSelectorFromString("togglePlayback:"), to: host, from: nil) + check(desktopWindowCount() == NSScreen.screens.count, "Start recreates wallpaper on all displays") + NotificationCenter.default.post(name: NSApplication.didChangeScreenParametersNotification, object: nil) + check(desktopWindowCount() == NSScreen.screens.count && ScreenSyncCoordinator.shared.registeredCount == NSScreen.screens.count, + "display reconciliation replaces rather than duplicates session membership") + host.applicationWillTerminate(Notification(name: NSApplication.willTerminateNotification)) + check(desktopWindowCount() == 0 && ScreenSyncCoordinator.shared.registeredCount == 0, "Quit removes windows and animation participants") + workspace.post(name: NSWorkspace.didWakeNotification, object: nil) + NotificationCenter.default.post(name: NSApplication.didChangeScreenParametersNotification, object: nil) + check(desktopWindowCount() == 0, "Quit unregisters system observers") +} + +/// Counts visible desktop surfaces without inspecting the host's private storage. +private func desktopWindowCount() -> Int { + NSApp.windows.filter { $0 is DesktopWindow && $0.isVisible }.count +} diff --git a/Tests/MatrixWallpaperTests/main.swift b/Tests/MatrixWallpaperTests/main.swift new file mode 100644 index 0000000..949c445 --- /dev/null +++ b/Tests/MatrixWallpaperTests/main.swift @@ -0,0 +1,59 @@ +import AppKit +import ScreenSaver + +/// Counts failed AppKit checks without requiring XCTest or Xcode. +var failures = 0 + +/// Reports one self-check result and records failures. +func check(_ condition: Bool, _ description: String) { + print("\(condition ? "ok" : "not ok") - \(description)") + if !condition { failures += 1 } +} + +/// Captures the actual native view output, without advancing it from the test. +func pixels(of view: NSView) -> Data? { + guard let bitmap = view.bitmapImageRepForCachingDisplay(in: view.bounds) else { return nil } + view.cacheDisplay(in: view.bounds, to: bitmap) + guard let bytes = bitmap.bitmapData else { return nil } + return Data(bytes: bytes, count: bitmap.bytesPerRow * bitmap.pixelsHigh) +} + +/// Pumps AppKit's run loop so only the framework's animation scheduling drives frames. +func wait(_ seconds: TimeInterval) { + RunLoop.current.run(until: Date(timeIntervalSinceNow: seconds)) +} + +let app = NSApplication.shared +app.setActivationPolicy(.accessory) +app.finishLaunching() +guard let screen = NSScreen.main, + let saver = MatrixScreenSaverView(frame: NSRect(x: 0, y: 0, width: 640, height: 360), isPreview: false) else { + fatalError("Wallpaper self-check requires a logged-in graphical macOS session") +} +let window = DesktopWindow(screen: screen, saverView: saver) +check(window.frame == screen.frame, "window fills the entire display") +check(window.level.rawValue == Int(CGWindowLevelForKey(.desktopWindow)), "window uses the desktop level") +check(window.ignoresMouseEvents && !window.canBecomeKey && !window.canBecomeMain, + "desktop window rejects mouse and keyboard focus") +check(window.collectionBehavior.contains([.canJoinAllSpaces, .stationary, .ignoresCycle, .fullScreenNone]), + "window joins desktop Spaces without joining fullscreen apps or window cycling") +check(!saver.isPreview, "host uses the full-quality saver mode") +let previousApp = NSWorkspace.shared.frontmostApplication?.processIdentifier +window.orderBack(nil) +saver.startAnimation() +wait(0.5) +check(window.isVisible && !window.isKeyWindow && !window.isMainWindow, "wallpaper is visible without focus") +check(NSWorkspace.shared.frontmostApplication?.processIdentifier == previousApp, "showing wallpaper does not activate its app") +let initial = pixels(of: saver) +wait(2) +let advanced = pixels(of: saver) +check(initial != nil && advanced != nil && initial != advanced, "native animation advances without a second timer") +saver.stopAnimation() +let stopped = pixels(of: saver) +wait(0.3) +check(stopped != nil && pixels(of: saver) == stopped, "native animation stays stopped") +window.close() +check(!window.isVisible, "closing removes the desktop window") +sharedSaverTests() +wallpaperAppTests() +exit(failures == 0 ? EXIT_SUCCESS : EXIT_FAILURE) diff --git a/build-wallpaper.sh b/build-wallpaper.sh new file mode 100755 index 0000000..c7ca21a --- /dev/null +++ b/build-wallpaper.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" +SOURCE_DIR="$ROOT_DIR/Sources/MatrixScreenSaver" +WALLPAPER_DIR="$ROOT_DIR/Sources/MatrixWallpaper" +BUNDLE_DIR="$ROOT_DIR/build/MatrixWallpaper.app" + +if [[ ! -s "$ROOT_DIR/VERSION" ]]; then + echo "VERSION file is missing or empty." >&2 + exit 1 +fi +BUNDLE_VERSION="$(tr -d '[:space:]' < "$ROOT_DIR/VERSION")" +mkdir -p "$BUNDLE_DIR/Contents/MacOS" + +swiftc -O -module-name MatrixWallpaper \ + -framework Foundation -framework AppKit -framework ScreenSaver \ + "$SOURCE_DIR/TerminalSupport.swift" \ + "$SOURCE_DIR/MatrixScreenSaverOptions.swift" \ + "$SOURCE_DIR/Xorshift64.swift" \ + "$SOURCE_DIR/NeoMessageScene.swift" \ + "$SOURCE_DIR/MatrixRendererLimits.swift" \ + "$SOURCE_DIR/NativeMatrixRenderer.swift" \ + "$SOURCE_DIR/ScreenSyncCoordinator.swift" \ + "$SOURCE_DIR/MatrixScreenSaverView.swift" \ + "$WALLPAPER_DIR/DesktopWindow.swift" \ + "$WALLPAPER_DIR/WallpaperPlaybackState.swift" \ + "$WALLPAPER_DIR/WallpaperApp.swift" \ + "$WALLPAPER_DIR/main.swift" \ + -o "$BUNDLE_DIR/Contents/MacOS/MatrixWallpaper" + +cp "$ROOT_DIR/Resources/Wallpaper-Info.plist" "$BUNDLE_DIR/Contents/Info.plist" +/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $BUNDLE_VERSION" "$BUNDLE_DIR/Contents/Info.plist" +/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUNDLE_VERSION" "$BUNDLE_DIR/Contents/Info.plist" +plutil -lint "$BUNDLE_DIR/Contents/Info.plist" >/dev/null +codesign --force --deep --sign - "$BUNDLE_DIR" >/dev/null +echo "Built $BUNDLE_DIR" diff --git a/tests.sh b/tests.sh index 3307231..d8e0152 100755 --- a/tests.sh +++ b/tests.sh @@ -16,9 +16,11 @@ swiftc \ "$SRC/MatrixRendererLimits.swift" \ "$SRC/ScreenSyncCoordinator.swift" \ "$SRC/NativeMatrixRenderer.swift" \ + "$ROOT/Sources/MatrixWallpaper/WallpaperPlaybackState.swift" \ "$TESTS/Xorshift64Tests.swift" \ "$TESTS/ScreenSyncCoordinatorTests.swift" \ "$TESTS/NativeMatrixRendererTests.swift" \ + "$TESTS/WallpaperPlaybackStateTests.swift" \ "$TESTS/main.swift" \ -o "$TEST_BIN" diff --git a/wallpaper-tests.sh b/wallpaper-tests.sh new file mode 100755 index 0000000..2c499f1 --- /dev/null +++ b/wallpaper-tests.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" +SOURCE_DIR="$ROOT_DIR/Sources/MatrixScreenSaver" +WALLPAPER_DIR="$ROOT_DIR/Sources/MatrixWallpaper" +TEST_DIR="$ROOT_DIR/Tests/MatrixWallpaperTests" +TEST_BIN="$(mktemp "${TMPDIR:-/tmp}/matrix-wallpaper-tests.XXXXXX")" +trap 'rm -f "$TEST_BIN"' EXIT + +swiftc -framework Foundation -framework AppKit -framework ScreenSaver \ + "$SOURCE_DIR/TerminalSupport.swift" \ + "$SOURCE_DIR/MatrixScreenSaverOptions.swift" \ + "$SOURCE_DIR/Xorshift64.swift" \ + "$SOURCE_DIR/NeoMessageScene.swift" \ + "$SOURCE_DIR/MatrixRendererLimits.swift" \ + "$SOURCE_DIR/NativeMatrixRenderer.swift" \ + "$SOURCE_DIR/ScreenSyncCoordinator.swift" \ + "$SOURCE_DIR/MatrixScreenSaverView.swift" \ + "$WALLPAPER_DIR/DesktopWindow.swift" \ + "$WALLPAPER_DIR/WallpaperPlaybackState.swift" \ + "$WALLPAPER_DIR/WallpaperApp.swift" \ + "$TEST_DIR/SharedSaverTests.swift" \ + "$TEST_DIR/WallpaperAppTests.swift" \ + "$TEST_DIR/main.swift" \ + -o "$TEST_BIN" + +"$TEST_BIN" From 46df19277da69cfd2c08411a83990cca387131bc Mon Sep 17 00:00:00 2001 From: Patrick Schaper Date: Wed, 21 Oct 2026 17:13:46 +0200 Subject: [PATCH 2/8] feat: add wallpaper installation and login startup - install safely and gracefully quit running wallpaper copies - add one system-backed Launch at Login checkbox - test registration states and installer rollback in CI --- .github/workflows/tests.yml | 3 + README.md | 42 ++++++- .../MatrixWallpaper/LoginItemController.swift | 108 ++++++++++++++++++ Sources/MatrixWallpaper/WallpaperApp.swift | 15 +++ .../MatrixWallpaperTests/LoginItemTests.swift | 92 +++++++++++++++ Tests/MatrixWallpaperTests/main.swift | 1 + build-wallpaper.sh | 3 +- install-wallpaper.sh | 86 ++++++++++++++ wallpaper-install-tests.sh | 76 ++++++++++++ wallpaper-tests.sh | 4 +- 10 files changed, 424 insertions(+), 6 deletions(-) create mode 100644 Sources/MatrixWallpaper/LoginItemController.swift create mode 100644 Tests/MatrixWallpaperTests/LoginItemTests.swift create mode 100755 install-wallpaper.sh create mode 100755 wallpaper-install-tests.sh diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9f6a015..2cf9b82 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -30,5 +30,8 @@ jobs: - name: Build wallpaper app run: ./build-wallpaper.sh + - name: Check wallpaper installation and rollback + run: ./wallpaper-install-tests.sh + - name: Run wallpaper AppKit checks run: ./wallpaper-tests.sh diff --git a/README.md b/README.md index 6f8fbd9..035f8cd 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,35 @@ Build and launch the separate native menu bar app: open build/MatrixWallpaper.app ``` -The **Matrix** menu provides **Start / Stop**, **Options…**, and **Quit**. +To install a stable copy in your user Applications folder: + +```bash +./install-wallpaper.sh +open ~/Applications/MatrixWallpaper.app +``` + +The installer gracefully quits running Matrix Wallpaper copies before building or +updating, and cancels if they do not quit within five seconds. It builds and +verifies the app before replacing an existing installation; preferences +are kept outside the bundle. It does not launch the app or enable login startup. +You can also double-click the installed app in Finder. It appears in the menu bar, +not the Dock. + +The **Matrix** menu provides **Start / Stop**, **Options…**, one **Launch at Login** +checkbox, and **Quit**. On macOS 13+, Launch at Login uses the +system's registration, and refreshes whenever the menu opens so changes made in +System Settings are reflected. Checking registers and enables startup; unchecking +stops future login launches. Apple's API does this by unregistering, so keeping a +disabled entry visible in System Settings is not guaranteed. An unchecked item +marked **Approval Required** means macOS has not granted approval (or approval was +revoked). Settings opens automatically when approval is needed; clicking the +unapproved item opens Settings again without removing its registration. Errors are +reported without claiming startup is enabled. Disabling startup does not stop the +current wallpaper, and Quit does not disable startup. Older macOS versions support +manual launching only. Use the installed copy when enabling startup; login and +approval behavior still need verification on your macOS version with these +locally ad-hoc-signed builds. + It renders the real saver independently on each display, with distinct rain and coordinated scenes. Passive desktop-level windows leave input to Finder and do not change your macOS wallpaper settings. Stop or Quit reveals your existing wallpaper. @@ -70,8 +98,8 @@ unchanged display notifications on wake do not restart it. Lock and saver detection supplements public workspace notifications with best-effort macOS distributed signals; delivery is not guaranteed. -No automatic login startup, System Settings wallpaper registration, or private -Wallpaper.framework integration is installed. The existing `.saver` build and +No System Settings wallpaper registration or private Wallpaper.framework +integration is installed. The existing `.saver` build and installation remain separate. Desktop behavior across widgets, Spaces, Show Desktop, Stage Manager, and fullscreen apps should be checked on the macOS version you use. @@ -79,12 +107,18 @@ Run the additional AppKit checks from a logged-in graphical macOS session: ```bash ./wallpaper-tests.sh +./wallpaper-install-tests.sh # requires a built wallpaper app; uses a temporary HOME ``` These check native animation, passive windows, shared options UI, menu actions, notification-driven suspension, display reconciliation, and cleanup. They briefly create desktop windows and open Options; they do not alter your saved saver settings. -Actual lock/sleep/saver transitions and physical display hotplug still need live checks. +Login-item tests substitute system operations and do not change your real login +items. Installer checks exercise copying, verification, replacement, and rollback +without touching your Applications folder. Actual login startup (one instance +after logout/login, then none after disabling), System Settings approval and +synchronization, lock/sleep/saver transitions, and physical display hotplug still +need live checks. ### Current state diff --git a/Sources/MatrixWallpaper/LoginItemController.swift b/Sources/MatrixWallpaper/LoginItemController.swift new file mode 100644 index 0000000..d70f4e6 --- /dev/null +++ b/Sources/MatrixWallpaper/LoginItemController.swift @@ -0,0 +1,108 @@ +import AppKit +import ServiceManagement + +/// Keeps the login menu tied to macOS registration rather than a saved preference. +final class LoginItemController: NSObject, NSMenuDelegate { + /// System registration states, including availability on older macOS versions. + enum Status { + case enabled, notRegistered, requiresApproval, notFound, unavailable + } + + /// Menu control for adding or removing the main application as a login item. + let item = NSMenuItem(title: "Launch at Login", action: #selector(toggle), keyEquivalent: "") + + /// Reads the authoritative state each time the menu opens or an operation finishes. + private let readStatus: () -> Status + /// Registers the app; injectable so tests cannot change actual login items. + private let register: () throws -> Void + /// Removes registration without stopping the current wallpaper session. + private let unregister: () throws -> Void + /// Opens the documented Login Items pane. + private let openSettings: () -> Void + /// Presents operation errors without changing the displayed system state. + private let reportError: (Error) -> Void + + /// Creates menu actions with system operations, or substitutes for isolated tests. + /// + /// - Parameters: + /// - readStatus: Current macOS registration state. + /// - register: Operation to enable login startup. + /// - unregister: Operation to disable login startup. + /// - openSettings: Action for reviewing system approval. + /// - reportError: Presentation for failed operations. + init(readStatus: @escaping () -> Status = LoginItemController.systemStatus, + register: @escaping () throws -> Void = { + if #available(macOS 13.0, *) { try SMAppService.mainApp.register() } + }, + unregister: @escaping () throws -> Void = { + if #available(macOS 13.0, *) { try SMAppService.mainApp.unregister() } + }, + openSettings: @escaping () -> Void = { + if #available(macOS 13.0, *) { SMAppService.openSystemSettingsLoginItems() } + }, + reportError: @escaping (Error) -> Void = { error in + let alert = NSAlert() + alert.messageText = "Could not change Launch at Login" + alert.informativeText = "\(error.localizedDescription)\nInstall Matrix Wallpaper in Applications and review Login Items Settings." + NSApp.activate(ignoringOtherApps: true) + alert.runModal() + }) { + self.readStatus = readStatus + self.register = register + self.unregister = unregister + self.openSettings = openSettings + self.reportError = reportError + super.init() + item.target = self + refresh() + } + + /// Refreshes external System Settings changes before showing the menu. + func menuWillOpen(_ menu: NSMenu) { refresh() } + + /// Displays only the current registration, including unapproved or unsupported states. + private func refresh() { + let status = readStatus() + item.state = status == .enabled ? .on : .off + item.title = status == .requiresApproval ? "Launch at Login — Approval Required" : "Launch at Login" + item.isEnabled = status != .unavailable + switch status { + case .requiresApproval: + item.toolTip = "Click to approve Matrix Wallpaper in System Settings." + case .notFound: + item.toolTip = "Click to register Matrix Wallpaper for launch at login." + case .unavailable: + item.toolTip = "Launch at Login requires macOS 13 or later." + default: + item.toolTip = nil + } + } + + /// Toggles from the latest system state, never from a potentially stale menu tick. + @objc private func toggle() { + do { + switch readStatus() { + case .enabled: try unregister() + case .requiresApproval: break + case .notRegistered, .notFound: try register() + case .unavailable: return + } + } catch { + if readStatus() != .requiresApproval { reportError(error) } + } + refresh() + if readStatus() == .requiresApproval { openSettings() } + } + + /// Maps Service Management state without requiring macOS 13 for manual launching. + static func systemStatus() -> Status { + guard #available(macOS 13.0, *) else { return .unavailable } + switch SMAppService.mainApp.status { + case .enabled: return .enabled + case .notRegistered: return .notRegistered + case .requiresApproval: return .requiresApproval + case .notFound: return .notFound + @unknown default: return .notFound + } + } +} diff --git a/Sources/MatrixWallpaper/WallpaperApp.swift b/Sources/MatrixWallpaper/WallpaperApp.swift index 01f958e..54ddfd8 100644 --- a/Sources/MatrixWallpaper/WallpaperApp.swift +++ b/Sources/MatrixWallpaper/WallpaperApp.swift @@ -6,6 +6,17 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { /// Retains the status item for the lifetime of the application. private var statusItem: NSStatusItem? + /// Owns login controls independently of wallpaper playback and preferences. + private let loginItems: LoginItemController + + /// Creates the host with system login operations, or an isolated test controller. + /// + /// - Parameter loginItems: Menu controller backed by macOS registration. + init(loginItems: LoginItemController = LoginItemController()) { + self.loginItems = loginItems + super.init() + } + /// Owns the native desktop surfaces until playback ends. private var windows: [DesktopWindow] = [] @@ -48,12 +59,16 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { let item = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) item.button?.title = "Matrix" let menu = NSMenu() + menu.autoenablesItems = false + menu.delegate = loginItems playbackItem.target = self menu.addItem(playbackItem) let options = NSMenuItem(title: "Options…", action: #selector(showOptions(_:)), keyEquivalent: "") options.target = self menu.addItem(options) menu.addItem(.separator()) + menu.addItem(loginItems.item) + menu.addItem(.separator()) let quit = NSMenuItem(title: "Quit Matrix Wallpaper", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q") quit.target = NSApp menu.addItem(quit) diff --git a/Tests/MatrixWallpaperTests/LoginItemTests.swift b/Tests/MatrixWallpaperTests/LoginItemTests.swift new file mode 100644 index 0000000..187cab5 --- /dev/null +++ b/Tests/MatrixWallpaperTests/LoginItemTests.swift @@ -0,0 +1,92 @@ +import AppKit + +/// Exercises menu state and operations without registering real login items. +func loginItemTests() { + var status = LoginItemController.Status.notRegistered + var registrationStatus = LoginItemController.Status.enabled + var registrations = 0 + var removals = 0 + var settingsOpened = false + var shouldFail = false + var errors = 0 + let controller = LoginItemController( + readStatus: { status }, + register: { + if shouldFail { throw NSError(domain: "LoginItemTests", code: 1) } + registrations += 1 + status = registrationStatus + }, + unregister: { + if shouldFail { throw NSError(domain: "LoginItemTests", code: 2) } + removals += 1 + status = .notRegistered + }, + openSettings: { settingsOpened = true }, + reportError: { _ in errors += 1 } + ) + let menu = NSMenu() + menu.autoenablesItems = false + menu.delegate = controller + menu.addItem(controller.item) + controller.menuWillOpen(menu) + check(controller.item.state == .off && controller.item.isEnabled, "unregistered login item is unchecked") + menu.performActionForItem(at: 0) + check(registrations == 1 && controller.item.state == .on, "checking Launch at Login registers and refreshes system state") + menu.performActionForItem(at: 0) + check(removals == 1 && controller.item.state == .off, "unchecking Launch at Login unregisters") + status = .enabled + controller.menuWillOpen(menu) + check(controller.item.state == .on, "menu opening reflects login enabled in Settings") + status = .notRegistered + controller.menuWillOpen(menu) + check(controller.item.state == .off, "menu opening reflects login disabled in Settings") + status = .enabled + controller.menuWillOpen(menu) + shouldFail = true + menu.performActionForItem(at: 0) + check(errors == 1 && controller.item.state == .on, "failed removal reports error and retains actual enabled state") + status = .notRegistered + menu.performActionForItem(at: 0) + check(errors == 2 && controller.item.state == .off, "failed registration does not show a false checkmark") + shouldFail = false + registrationStatus = .requiresApproval + menu.performActionForItem(at: 0) + check(registrations == 2 && controller.item.state == .off && settingsOpened, + "registration requiring approval opens Settings without a false checkmark") + controller.menuWillOpen(menu) + check(controller.item.state == .off && controller.item.title.contains("Approval Required"), "pending approval is distinct from enabled") + settingsOpened = false + menu.performActionForItem(at: 0) + check(settingsOpened && removals == 1, "clicking unapproved login startup opens Settings rather than removing it") + status = .notFound + controller.menuWillOpen(menu) + check(controller.item.state == .off && controller.item.isEnabled, + "not-found login service remains clickable for initial registration") + shouldFail = true + menu.performActionForItem(at: 0) + check(errors == 3 && controller.item.state == .off, + "failed registration from not-found reports the error without a false checkmark") + shouldFail = false + registrationStatus = .enabled + menu.performActionForItem(at: 0) + check(registrations == 3 && controller.item.state == .on, + "clicking a not-found login service attempts registration and enables startup") + status = .unavailable + controller.menuWillOpen(menu) + check(!controller.item.isEnabled, "older macOS disables unsupported login control") + + status = .enabled + menu.removeAllItems() + let host = WallpaperApp(loginItems: controller) + host.applicationDidFinishLaunching(Notification(name: NSApplication.didFinishLaunchingNotification)) + let hostMenu = controller.item.menu! + check(hostMenu.delegate === controller && hostMenu.items.filter { $0.target === controller }.count == 1, + "host menu contains exactly one login control and refreshes system status") + let windows = Set(NSApp.windows.filter { $0 is DesktopWindow && $0.isVisible }.map(ObjectIdentifier.init)) + hostMenu.delegate?.menuWillOpen?(hostMenu) + hostMenu.performActionForItem(at: hostMenu.index(of: controller.item)) + check(Set(NSApp.windows.filter { $0 is DesktopWindow && $0.isVisible }.map(ObjectIdentifier.init)) == windows, + "changing login startup leaves existing wallpaper playback untouched") + host.applicationWillTerminate(Notification(name: NSApplication.willTerminateNotification)) + check(removals == 2, "quitting does not change login registration") +} diff --git a/Tests/MatrixWallpaperTests/main.swift b/Tests/MatrixWallpaperTests/main.swift index 949c445..62c057d 100644 --- a/Tests/MatrixWallpaperTests/main.swift +++ b/Tests/MatrixWallpaperTests/main.swift @@ -56,4 +56,5 @@ window.close() check(!window.isVisible, "closing removes the desktop window") sharedSaverTests() wallpaperAppTests() +loginItemTests() exit(failures == 0 ? EXIT_SUCCESS : EXIT_FAILURE) diff --git a/build-wallpaper.sh b/build-wallpaper.sh index c7ca21a..c6448d1 100755 --- a/build-wallpaper.sh +++ b/build-wallpaper.sh @@ -14,7 +14,7 @@ BUNDLE_VERSION="$(tr -d '[:space:]' < "$ROOT_DIR/VERSION")" mkdir -p "$BUNDLE_DIR/Contents/MacOS" swiftc -O -module-name MatrixWallpaper \ - -framework Foundation -framework AppKit -framework ScreenSaver \ + -framework Foundation -framework AppKit -framework ScreenSaver -framework ServiceManagement \ "$SOURCE_DIR/TerminalSupport.swift" \ "$SOURCE_DIR/MatrixScreenSaverOptions.swift" \ "$SOURCE_DIR/Xorshift64.swift" \ @@ -25,6 +25,7 @@ swiftc -O -module-name MatrixWallpaper \ "$SOURCE_DIR/MatrixScreenSaverView.swift" \ "$WALLPAPER_DIR/DesktopWindow.swift" \ "$WALLPAPER_DIR/WallpaperPlaybackState.swift" \ + "$WALLPAPER_DIR/LoginItemController.swift" \ "$WALLPAPER_DIR/WallpaperApp.swift" \ "$WALLPAPER_DIR/main.swift" \ -o "$BUNDLE_DIR/Contents/MacOS/MatrixWallpaper" diff --git a/install-wallpaper.sh b/install-wallpaper.sh new file mode 100755 index 0000000..a65b3c9 --- /dev/null +++ b/install-wallpaper.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" +SOURCE_BUNDLE="${1:-$ROOT_DIR/build/MatrixWallpaper.app}" +INSTALL_DIR="$HOME/Applications" +INSTALL_BUNDLE="$INSTALL_DIR/MatrixWallpaper.app" + +if ! osascript -l JavaScript <<'JXA' +ObjC.import('AppKit'); +const apps = $.NSRunningApplication.runningApplicationsWithBundleIdentifier('dev.patsch.MatrixWallpaper'); +for (let i = 0; i < apps.count; i++) { + if (!apps.objectAtIndex(i).terminate) { + throw new Error('Matrix Wallpaper refused to quit.'); + } +} +const deadline = Date.now() + 5000; +for (let i = 0; i < apps.count; i++) { + while (!apps.objectAtIndex(i).terminated) { + if (Date.now() >= deadline) { + throw new Error('Matrix Wallpaper did not quit within five seconds.'); + } + // NSRunningApplication updates termination state through the run loop. + $.NSRunLoop.currentRunLoop.runUntilDate($.NSDate.dateWithTimeIntervalSinceNow(0.1)); + } +} +JXA +then + echo "Could not quit Matrix Wallpaper. Quit it from its menu and try again; installation cancelled." >&2 + exit 1 +fi + +if [[ $# -eq 0 ]]; then + "$ROOT_DIR/build-wallpaper.sh" +fi + +if [[ -L "$INSTALL_BUNDLE" || ( -e "$INSTALL_BUNDLE" && ! -d "$INSTALL_BUNDLE" ) ]]; then + echo "Refusing to replace a symlink or non-directory: $INSTALL_BUNDLE" >&2 + exit 1 +fi + +verify_bundle() { + local bundle="$1" + [[ -x "$bundle/Contents/MacOS/MatrixWallpaper" ]] && + [[ "$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "$bundle/Contents/Info.plist")" == "dev.patsch.MatrixWallpaper" ]] && + codesign --verify --deep --strict "$bundle" +} + +if ! verify_bundle "$SOURCE_BUNDLE"; then + echo "Source is not a valid signed Matrix Wallpaper app: $SOURCE_BUNDLE" >&2 + exit 1 +fi + +mkdir -p "$INSTALL_DIR" +STAGING="$(mktemp -d "$INSTALL_DIR/.MatrixWallpaper-install.XXXXXX")" + +cleanup() { + local result=$? + if [[ -d "$STAGING/previous.app" && ! -e "$INSTALL_BUNDLE" ]]; then + if ! mv "$STAGING/previous.app" "$INSTALL_BUNDLE"; then + echo "Restore failed. Your previous app is preserved at $STAGING/previous.app" >&2 + return 1 + fi + fi + rm -rf "$STAGING" + return "$result" +} +trap cleanup EXIT +trap 'exit 130' INT +trap 'exit 143' TERM + +ditto "$SOURCE_BUNDLE" "$STAGING/MatrixWallpaper.app" +verify_bundle "$STAGING/MatrixWallpaper.app" +SOURCE_HASH="$(shasum -a 256 "$SOURCE_BUNDLE/Contents/MacOS/MatrixWallpaper" | awk '{print $1}')" +COPIED_HASH="$(shasum -a 256 "$STAGING/MatrixWallpaper.app/Contents/MacOS/MatrixWallpaper" | awk '{print $1}')" +if [[ "$SOURCE_HASH" != "$COPIED_HASH" ]]; then + echo "Copied executable does not match the source; installation cancelled." >&2 + exit 1 +fi + +if [[ -d "$INSTALL_BUNDLE" ]]; then + mv "$INSTALL_BUNDLE" "$STAGING/previous.app" +fi +mv "$STAGING/MatrixWallpaper.app" "$INSTALL_BUNDLE" +echo "Installed $INSTALL_BUNDLE" +echo "Double-click it in Finder, or run: open \"$INSTALL_BUNDLE\"" diff --git a/wallpaper-install-tests.sh b/wallpaper-install-tests.sh new file mode 100755 index 0000000..cae7980 --- /dev/null +++ b/wallpaper-install-tests.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" +SOURCE_BUNDLE="${1:-$ROOT_DIR/build/MatrixWallpaper.app}" +if [[ ! -d "$SOURCE_BUNDLE" ]]; then + echo "Build the app with ./build-wallpaper.sh before running installer checks." >&2 + exit 1 +fi +TEST_DIR="$(mktemp -d "${TMPDIR:-/tmp}/matrix-wallpaper-install-tests.XXXXXX")" +trap 'rm -rf "$TEST_DIR"' EXIT +export HOME="$TEST_DIR/home" +mkdir -p "$HOME" "$TEST_DIR/bin" +export PATH="$TEST_DIR/bin:$PATH" + +# Test copies never start an app or interact with real running processes. +export QUIT_LOG="$TEST_DIR/quit-request" +cat > "$TEST_DIR/bin/osascript" <<'SCRIPT' +#!/bin/bash +cat >/dev/null +[[ "${SIMULATE_QUIT_FAILURE:-0}" != 1 ]] || exit 1 +touch "$QUIT_LOG" +SCRIPT +cat > "$TEST_DIR/bin/ditto" <<'SCRIPT' +#!/bin/bash +[[ "${FAIL_COPY:-0}" != 1 ]] || exit 1 +/usr/bin/ditto "$@" +if [[ "${CORRUPT_COPY:-0}" == 1 ]]; then + printf 'corrupt' >> "$2/Contents/MacOS/MatrixWallpaper" +fi +SCRIPT +cat > "$TEST_DIR/bin/mv" <<'SCRIPT' +#!/bin/bash +if [[ "${FAIL_PROMOTION:-0}" == 1 && "$1" == */.MatrixWallpaper-install.*/MatrixWallpaper.app ]]; then + exit 1 +fi +/bin/mv "$@" +SCRIPT +chmod +x "$TEST_DIR/bin/osascript" "$TEST_DIR/bin/ditto" "$TEST_DIR/bin/mv" + +install_app() { bash "$ROOT_DIR/install-wallpaper.sh" "$SOURCE_BUNDLE" > "$TEST_DIR/output" 2>&1; } +expect_failure() { + if install_app; then + echo "not ok - $1" >&2 + exit 1 + fi + [[ "$(stat -f %i "$HOME/Applications/MatrixWallpaper.app")" == "$OLD_INODE" ]] + codesign --verify --deep --strict "$HOME/Applications/MatrixWallpaper.app" + echo "ok - $1 preserves the working installation" +} + +install_app +[[ -f "$QUIT_LOG" ]] +codesign --verify --deep --strict "$HOME/Applications/MatrixWallpaper.app" +cmp "$SOURCE_BUNDLE/Contents/MacOS/MatrixWallpaper" "$HOME/Applications/MatrixWallpaper.app/Contents/MacOS/MatrixWallpaper" +echo "ok - installs a verified app into user Applications" +OLD_INODE="$(stat -f %i "$HOME/Applications/MatrixWallpaper.app")" +mkdir -p "$HOME/Library/Preferences" +printf 'unchanged preferences' > "$HOME/Library/Preferences/dev.patsch.MatrixScreenSaver.plist" +export FAIL_COPY=1 +expect_failure "copy failure" +unset FAIL_COPY +export CORRUPT_COPY=1 +expect_failure "signature verification failure" +unset CORRUPT_COPY +export FAIL_PROMOTION=1 +expect_failure "promotion failure" +unset FAIL_PROMOTION +export SIMULATE_QUIT_FAILURE=1 +expect_failure "app refusing to quit" +unset SIMULATE_QUIT_FAILURE +install_app +[[ "$(stat -f %i "$HOME/Applications/MatrixWallpaper.app")" != "$OLD_INODE" ]] +[[ "$(cat "$HOME/Library/Preferences/dev.patsch.MatrixScreenSaver.plist")" == 'unchanged preferences' ]] +[[ -z "$(find "$HOME/Applications" -maxdepth 1 -name '.MatrixWallpaper-install.*' -print)" ]] +echo "ok - reinstall replaces the old bundle and cleans staging" diff --git a/wallpaper-tests.sh b/wallpaper-tests.sh index 2c499f1..cae237d 100755 --- a/wallpaper-tests.sh +++ b/wallpaper-tests.sh @@ -8,7 +8,7 @@ TEST_DIR="$ROOT_DIR/Tests/MatrixWallpaperTests" TEST_BIN="$(mktemp "${TMPDIR:-/tmp}/matrix-wallpaper-tests.XXXXXX")" trap 'rm -f "$TEST_BIN"' EXIT -swiftc -framework Foundation -framework AppKit -framework ScreenSaver \ +swiftc -framework Foundation -framework AppKit -framework ScreenSaver -framework ServiceManagement \ "$SOURCE_DIR/TerminalSupport.swift" \ "$SOURCE_DIR/MatrixScreenSaverOptions.swift" \ "$SOURCE_DIR/Xorshift64.swift" \ @@ -19,9 +19,11 @@ swiftc -framework Foundation -framework AppKit -framework ScreenSaver \ "$SOURCE_DIR/MatrixScreenSaverView.swift" \ "$WALLPAPER_DIR/DesktopWindow.swift" \ "$WALLPAPER_DIR/WallpaperPlaybackState.swift" \ + "$WALLPAPER_DIR/LoginItemController.swift" \ "$WALLPAPER_DIR/WallpaperApp.swift" \ "$TEST_DIR/SharedSaverTests.swift" \ "$TEST_DIR/WallpaperAppTests.swift" \ + "$TEST_DIR/LoginItemTests.swift" \ "$TEST_DIR/main.swift" \ -o "$TEST_BIN" From e8064fdbe2729ee2e574c95d3f08ade66e154617 Mon Sep 17 00:00:00 2001 From: Patrick Schaper Date: Wed, 21 Oct 2026 18:17:36 +0200 Subject: [PATCH 3/8] feat: install saver and wallpaper together with Homebrew - package and validate both bundles in releases - add native app lifecycle and guarded tap migration - print activation guidance and verify install and rollback flows - consolidate wallpaper commands into development documentation --- .github/workflows/release.yml | 13 +- Homebrew/Casks/matrix-screen-saver.rb | 25 ++- Homebrew/README.md | 73 +++++--- README.md | 116 ++++--------- Scripts/render-homebrew-release.py | 32 ++-- Scripts/update-homebrew-tap.py | 8 +- Tests/Homebrew/cask_lifecycle_test.rb | 57 ++++-- Tests/Homebrew/documentation_test.py | 7 + .../Homebrew/fixtures/legacy-screen-saver.rb | 43 +++++ Tests/Homebrew/fixtures/release_fixture.py | 15 +- Tests/Homebrew/integration_lifecycle.sh | 1 + Tests/Homebrew/release_metadata_test.py | 108 +++++++++++- Tests/Homebrew/support/fake_cask_dsl.rb | 26 ++- Tests/Homebrew/support/integration_driver.rb | 162 +++++++++++++----- Tests/Homebrew/tap_update_test.py | 27 ++- 15 files changed, 518 insertions(+), 195 deletions(-) create mode 100644 Tests/Homebrew/fixtures/legacy-screen-saver.rb diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 38edb40..6ca779b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -131,8 +131,12 @@ jobs: shell: bash run: | set -euo pipefail + printf '%s\n' "${{ steps.version.outputs.next }}" > VERSION rm -rf build ./build.sh + ./build-wallpaper.sh + codesign --verify --deep --strict "build/MatrixScreenSaver.saver" + codesign --verify --deep --strict "build/MatrixWallpaper.app" - name: Update CHANGELOG id: changelog @@ -195,7 +199,6 @@ jobs: version="${{ steps.version.outputs.next }}" branch="${{ steps.version.outputs.branch }}" - printf '%s\n' "${version}" > VERSION git add VERSION CHANGELOG.md git commit -m "chore(release): ${version}" -m "- bump VERSION to ${version}" -m "- update CHANGELOG.md" echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" @@ -214,7 +217,7 @@ jobs: changelog_section="$(awk "/^## \[${version}\]/{found=1; next} found && /^## /{exit} found{print}" CHANGELOG.md)" pr_body="$( - printf '## What'\''s changing\n\n%s\n\n## Validation\n- `./build.sh`\n' "${changelog_section}" + printf '## What'\''s changing\n\n%s\n\n## Validation\n- `./build.sh`\n- `./build-wallpaper.sh`\n- Strict codesign verification of both bundles\n' "${changelog_section}" )" # Close any existing release PR so the new one starts with a clean @@ -406,13 +409,16 @@ jobs: echo "exists=false" >> "$GITHUB_OUTPUT" fi - - name: Build screen saver + - name: Build screen saver and wallpaper app if: steps.release.outputs.exists != 'true' shell: bash run: | set -euo pipefail rm -rf build ./build.sh + ./build-wallpaper.sh + codesign --verify --deep --strict "build/MatrixScreenSaver.saver" + codesign --verify --deep --strict "build/MatrixWallpaper.app" - name: Stage release files if: steps.release.outputs.exists != 'true' @@ -427,6 +433,7 @@ jobs: rm -rf "${release_dir}" mkdir -p "${release_dir}" ditto "build/MatrixScreenSaver.saver" "${release_dir}/MatrixScreenSaver.saver" + ditto "build/MatrixWallpaper.app" "${release_dir}/MatrixWallpaper.app" echo "dir=${release_dir}" >> "$GITHUB_OUTPUT" diff --git a/Homebrew/Casks/matrix-screen-saver.rb b/Homebrew/Casks/matrix-screen-saver.rb index b358601..6d6766a 100644 --- a/Homebrew/Casks/matrix-screen-saver.rb +++ b/Homebrew/Casks/matrix-screen-saver.rb @@ -4,32 +4,45 @@ url "https://github.com/patrickschaper/matrixScreenSaver/releases/download/#{version}/#{version}.zip" name "MatrixScreenSaver" - desc "Native terminal-style Matrix screen saver" + desc "Native terminal-style Matrix screen saver and wallpaper" homepage "https://github.com/patrickschaper/matrixScreenSaver" depends_on arch: :arm64 depends_on macos: :sequoia + app "MatrixWallpaper.app" screen_saver "MatrixScreenSaver.saver" preflight_steps do if_path_exists "MatrixScreenSaver.saver", base: :screen_saverdir do # Homebrew also grants read access here when the native target is under HOME. run "/bin/echo", - args: ["Existing screen saver at {{screen_saverdir}}/MatrixScreenSaver.saver. " \ + args: ["Existing screen saver in Homebrew's configured screen-saver directory. " \ "To replace it while retaining options, run: " \ "brew install --cask --force patrickschaper/tap/matrix-screen-saver"], print_stdout: true, writable_paths: [{ path: "MatrixScreenSaver.saver", base: :screen_saverdir }] end + if_path_exists "MatrixWallpaper.app", base: :appdir do + run "/bin/echo", + args: ["Existing app at {{appdir}}/MatrixWallpaper.app. " \ + "To replace it while retaining options, run: " \ + "brew install --cask --force patrickschaper/tap/matrix-screen-saver"], + print_stdout: true, + writable_paths: [{ path: "MatrixWallpaper.app", base: :appdir }] + end + run "/bin/echo", args: ["Removing staged quarantine bypasses Gatekeeper quarantine checks; " \ - "this does not make the saver notarized or Apple-approved."], + "this does not make either bundle notarized or Apple-approved."], print_stdout: true run "/usr/bin/xattr", args: ["-dr", "com.apple.quarantine", "{{staged_path}}/MatrixScreenSaver.saver"], writable_paths: ["{{staged_path}}/MatrixScreenSaver.saver"] + run "/usr/bin/xattr", + args: ["-dr", "com.apple.quarantine", "{{staged_path}}/MatrixWallpaper.app"], + writable_paths: ["{{staged_path}}/MatrixWallpaper.app"] end postflight_steps do @@ -39,5 +52,11 @@ run "/bin/echo", args: ["Open System Settings > Wallpaper > Screen Saver and select MatrixScreenSaver."], print_stdout: true + run "/bin/echo", + args: ["Open {{appdir}}/MatrixWallpaper.app to start Matrix Wallpaper. " \ + "Launch at Login is optional in its Matrix menu."], + print_stdout: true end + + uninstall quit: "dev.patsch.MatrixWallpaper", login_item: "Matrix Wallpaper" end diff --git a/Homebrew/README.md b/Homebrew/README.md index 645b7a8..44a3a9b 100644 --- a/Homebrew/README.md +++ b/Homebrew/README.md @@ -4,7 +4,10 @@ The public tap is [patrickschaper/homebrew-tap](https://github.com/patrickschape `Casks/matrix-screen-saver.rb` here is the source payload for the same path in that repository. Users add it with `brew tap patrickschaper/tap`. -The payload uses Homebrew's native `screen_saver` artifact, not the local installer. +The next release payload uses Homebrew's native `screen_saver` and `app` artifacts, +not the local installers, to manage `MatrixScreenSaver.saver` and `MatrixWallpaper.app` +together. The live tap gains this behavior only after a new dual-bundle release and +tap update; immutable older releases remain saver-only. It retains the `dev.patsch.MatrixScreenSaver` preferences domain and has no zap or preference-cleanup hook. Its published binary requires Apple Silicon (ARM64) and macOS 15 (Sequoia) or newer. @@ -28,18 +31,26 @@ The fully qualified install trusts this cask, not the entire tap. Explicit `brew trust --cask` also permits subsequent installs using the short name. **Security:** preflight removes quarantine recursively only from the -checksum-verified staged `MatrixScreenSaver.saver`, before Homebrew moves it. -This bypasses Gatekeeper quarantine checks; it does not make the bundle notarized +checksum-verified staged `MatrixScreenSaver.saver` and `MatrixWallpaper.app`, before +Homebrew moves them. This bypasses Gatekeeper quarantine checks; it does not make either bundle notarized or Apple-approved. Install only if you trust the release publisher. The cask prints this disclosure before invoking `/usr/bin/xattr`; failure aborts installation. After installation, open **System Settings > Wallpaper > Screen Saver** and select **MatrixScreenSaver** manually. Modern Homebrew's sandbox blocks opening Settings, so automatic opening was intentionally removed. The cask never selects -the saver or opens a browser. Successful install, upgrade, and reinstall print: +the saver, launches the wallpaper on a fresh install, enables login startup, or opens +a browser. Open **MatrixWallpaper** from Homebrew's configured `appdir` (normally +`/Applications`) yourself, then use its single **Launch at Login** checkbox if wanted. +Homebrew may reopen an already-running app following an upgrade. Successful install, +upgrade, and reinstall print: > There is no spoon. There is coffee: https://www.buymeacoffee.com/yesman82 +They also print both the screen-saver selection instructions and the actual +installed app path to open for Matrix Wallpaper, including custom `appdir` values, +with a reminder that Launch at Login is optional. + An existing manual bundle is not silently replaced. The native artifact rejects an unforced conflict; opt in to replacement while retaining saved options with: @@ -47,7 +58,7 @@ an unforced conflict; opt in to replacement while retaining saved options with: brew install --cask --force patrickschaper/tap/matrix-screen-saver ``` -The conditional guidance honors Homebrew's configured `screen_saverdir`. +The conditional guidance honors Homebrew's configured `screen_saverdir` and `appdir`. Homebrew 7.0.7's `if_path_exists` checks `exist?`, not `symlink?`: a dangling symlink is still rejected by the native artifact, but does not print the custom migration message. Use the same explicit `--force` command to replace it. @@ -65,34 +76,48 @@ Upgrades and reinstalls remain native Homebrew operations. An upgrade may print the existing-target guidance because Homebrew can leave an empty target directory during replacement; no prior-receipt snapshot or initial-install-only behavior is needed. Custom destinations are honored, and other saver copies are not removed. +The native app and screen-saver artifacts are both installed and removed by the +same cask. Uninstall requests that `dev.patsch.MatrixWallpaper` quit and asks +Homebrew to remove its login items. Homebrew skips login-item cleanup when an +upgrade/reinstall successor exists; no unconditional unregister script runs. +This cleanup is best effort, not a guarantee of immediate `SMAppService` entry +removal. macOS may retain deleted entries until its maintenance runs. Disable +**Launch at Login** before uninstall if you want the app to unregister explicitly. Migration, upgrade, reinstall, and ordinary uninstall retain the `dev.patsch.MatrixScreenSaver` options domain. There is no zap hook or preference -rewrite. Uninstall prints neither coffee nor installation guidance. +rewrite. Uninstall prints neither coffee nor installation guidance. Manual copies +outside Homebrew's configured destinations are not removed. The local wallpaper +installer defaults to `~/Applications`; it can coexist with Homebrew's default +`/Applications` copy. Quit the manual copy before migrating, or select +`--appdir=~/Applications` and explicitly use `--force` to replace it. ## Release handoff After publication, the Release workflow downloads the **existing published** -versioned zip, including on reruns. It checks the asset digest, bundle identity -and version, archive layout, thin ARM64 Mach-O bundle, and minimum macOS version. +versioned zip, including on reruns. Release preparation and publication build both +products and the archive contains both bundle roots. Validation checks the asset +digest, both bundle identities and matching versions, archive layout, thin ARM64 +Mach-O bundle/executable types, and the greater of their minimum macOS versions. It uploads `homebrew-handoff-VERSION-ATTEMPT`, containing `Casks/matrix-screen-saver.rb` -and `manifest.json` with version, URL, SHA-256, architecture, OS floor, and provenance. +and `manifest.json` with version, URL, SHA-256, architecture, OS floor, both bundle +identifiers, and provenance. The workflow then automatically commits matching release metadata to the tap's default branch when the target variable and dedicated token are configured. Each workflow attempt gets a separate artifact so reruns preserve earlier handoffs without upload-name conflicts. The artifacts remain available for manual recovery. -Offline validation: +Offline validation of a newly published dual-bundle release: ```bash python3 -B Scripts/render-homebrew-release.py \ - --version 0.2.0 --archive /path/to/0.2.0.zip \ - --asset-url https://github.com/patrickschaper/matrixScreenSaver/releases/download/0.2.0/0.2.0.zip \ - --digest sha256:7a60c8ec2855a2df4cb008da7f79ea9e8526385897e3048bb53bb42421e07acd \ - --provenance manual-release-download --output /path/to/handoff + --version VERSION --provenance manual-release-download --output /path/to/handoff ``` -Omit `--archive`, `--asset-url`, and `--digest` to retrieve the release through -`gh`; the renderer never builds a replacement archive. A new unsupported OS floor +Replace `VERSION` with the actual published version. To use an existing local +download, also provide `--archive`, its immutable `--asset-url`, and its +`--digest sha256:...`. Otherwise the renderer retrieves the release through `gh`; +it never builds or replaces a published archive. Saver-only old archives fail +validation rather than generating a cask with a missing app. A new unsupported OS floor or architecture fails closed until the compatibility policy is updated. ## Automatic tap updates (token pending) @@ -116,7 +141,10 @@ after validating the published asset and uploading the handoff. It writes only `Casks/matrix-screen-saver.rb` on the tap's default branch; no tap PR or merge is required. This replaces the previous optional, human-merged tap PR behavior. Only version, SHA-256, and minimum macOS metadata may differ from the source -template. Unrelated cask edits or a missing cask fail closed for manual review. +template. For the first dual-bundle release, the exact frozen saver-only predecessor +is also accepted for a strictly newer version, using its normalized structure hash. +This one reviewed transition does not allow arbitrary structural edits. Unrelated +cask edits or a missing cask fail closed for manual review. Identical reruns make no commit, older versions are skipped, and conflicting same-version metadata is rejected. Each write includes the current file SHA; concurrent changes cause a failure, never a blind retry or forced overwrite. @@ -147,6 +175,7 @@ ruby -c Homebrew/Casks/matrix-screen-saver.rb bash -n Tests/Homebrew/integration_lifecycle.sh ./tests.sh ./build.sh +./build-wallpaper.sh ``` `.github/workflows/homebrew-tests.yml` runs offline tests without publishing secrets, @@ -158,16 +187,20 @@ authorization for a disposable environment first, then run: bash Tests/Homebrew/integration_lifecycle.sh ``` -The test requires an ARM64 macOS host and Homebrew 7.0.7. It redirects the native +The test requires an ARM64 macOS host and Homebrew 7.0.7 or newer. CI pins 7.0.7 +as the compatibility baseline. It redirects the native destination, all artifact directories, Caskroom, cache, logs, and fixture tap into one temporary directory. It uses real installers, upgrade orchestration, downloads, -native moves, sandboxed install steps, echo stdout, and quarantine operations. +native moves for both bundles, sandboxed install steps, echo stdout, and quarantine operations. +Only the operating-system process/login-item command boundary is substituted, so +the fixture never quits a real app or changes real login settings. Homebrew's +actual uninstall dispatch and successor handling still run. There is no Settings-launch mock: the cask contains no Settings-launch command. A separate sentinel outside the artifact destination verifies preference retention; it does not access the actual defaults domain. HOME alone is not used as isolation. -Native integration covers install, conflict failure, forced migration, upgrade, +Native integration covers saver-only migration, dual install, conflict failure, forced migration, upgrade, reinstall, uninstall, quarantine removal, broken-symlink conflict/force semantics, and developer-mode acceptance without legacy warnings on definition load or uninstall. Run workflow lint (for example `actionlint`) separately; never conceal diff --git a/README.md b/README.md index 035f8cd..e32d4fa 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ -# macOS Matrix Screen Saver +# macOS Matrix Screen Saver and Wallpaper ![macOS Matrix Screen Saver demo](docs/matrix-screensaver.gif) This is a macOS screen saver based on the iconic rain of characters and symbols known from the movie The Matrix. +It also comes with an app replacing your wallpaper with the screen saver animation if you wish so. + ## Quick install ```bash @@ -40,86 +42,6 @@ The saver exposes a native **Options…** sheet. The values are stored with `Scr ## Development -### Desktop wallpaper app - -Build and launch the separate native menu bar app: - -```bash -./build-wallpaper.sh -open build/MatrixWallpaper.app -``` - -To install a stable copy in your user Applications folder: - -```bash -./install-wallpaper.sh -open ~/Applications/MatrixWallpaper.app -``` - -The installer gracefully quits running Matrix Wallpaper copies before building or -updating, and cancels if they do not quit within five seconds. It builds and -verifies the app before replacing an existing installation; preferences -are kept outside the bundle. It does not launch the app or enable login startup. -You can also double-click the installed app in Finder. It appears in the menu bar, -not the Dock. - -The **Matrix** menu provides **Start / Stop**, **Options…**, one **Launch at Login** -checkbox, and **Quit**. On macOS 13+, Launch at Login uses the -system's registration, and refreshes whenever the menu opens so changes made in -System Settings are reflected. Checking registers and enables startup; unchecking -stops future login launches. Apple's API does this by unregistering, so keeping a -disabled entry visible in System Settings is not guaranteed. An unchecked item -marked **Approval Required** means macOS has not granted approval (or approval was -revoked). Settings opens automatically when approval is needed; clicking the -unapproved item opens Settings again without removing its registration. Errors are -reported without claiming startup is enabled. Disabling startup does not stop the -current wallpaper, and Quit does not disable startup. Older macOS versions support -manual launching only. Use the installed copy when enabling startup; login and -approval behavior still need verification on your macOS version with these -locally ad-hoc-signed builds. - -It renders the real saver independently on each display, with distinct rain and -coordinated scenes. Passive desktop-level windows leave input to Finder and do -not change your macOS wallpaper settings. Stop or Quit reveals your existing wallpaper. - -Options use the same `dev.patsch.MatrixScreenSaver` preferences as the screen saver. -Changes made in the app apply to all wallpaper displays and future saver sessions. -Glow, twinkle, rain density, glyphs, frame rate, error rate, and scan lines update -in place without replaying the intro. Character size, intro settings, and rain -cycle mode/duration restart all displays together. -Changes made elsewhere are reloaded on Start and when opening Options; running -processes do not continuously synchronize preferences. - -Playback suspends for sleep, inactive sessions, lock, and screen saver activity. -Stop remains stopped after wake or unlock. Temporary suspension preserves the -current rain and intro state and excludes paused time from scene clocks. -Actual display geometry/scaling changes rebuild the coordinated session; -unchanged display notifications on wake do not restart it. -Lock and saver detection supplements public workspace notifications with -best-effort macOS distributed signals; delivery is not guaranteed. - -No System Settings wallpaper registration or private Wallpaper.framework -integration is installed. The existing `.saver` build and -installation remain separate. Desktop behavior across widgets, Spaces, Show Desktop, -Stage Manager, and fullscreen apps should be checked on the macOS version you use. - -Run the additional AppKit checks from a logged-in graphical macOS session: - -```bash -./wallpaper-tests.sh -./wallpaper-install-tests.sh # requires a built wallpaper app; uses a temporary HOME -``` - -These check native animation, passive windows, shared options UI, menu actions, -notification-driven suspension, display reconciliation, and cleanup. They briefly -create desktop windows and open Options; they do not alter your saved saver settings. -Login-item tests substitute system operations and do not change your real login -items. Installer checks exercise copying, verification, replacement, and rollback -without touching your Applications folder. Actual login startup (one instance -after logout/login, then none after disabling), System Settings approval and -synchronization, lock/sleep/saver transitions, and physical display hotplug still -need live checks. - ### Current state - Native Swift/AppKit screen saver bundle @@ -149,15 +71,17 @@ Full Xcode is not required. ```bash ./build.sh +./build-wallpaper.sh ``` -This creates the screen saver bundle: +These create the screen saver bundle and wallpaper app: ```text build/MatrixScreenSaver.saver +build/MatrixWallpaper.app ``` -`build.sh` reads the current version from `./VERSION` and writes it into the saver bundle metadata. +Both build scripts read the current version from `./VERSION` and write it into their bundle metadata. ### Test @@ -167,6 +91,16 @@ build/MatrixScreenSaver.saver Compiles and runs the test suite using `swiftc`. No Xcode required — Command Line Tools are sufficient. +For wallpaper checks, build the app first and run from a logged-in graphical macOS session: + +```bash +./wallpaper-tests.sh +./wallpaper-install-tests.sh +``` + +The UI tests briefly create desktop windows and open Options. Installer tests use a +temporary home directory; neither suite changes your real login items. + ### Preview without installing ```bash @@ -175,6 +109,12 @@ Compiles and runs the test suite using `swiftc`. No Xcode required — Command L This rebuilds the bundle, compiles the preview host, and opens the saver in a normal macOS window for quick iteration. +To launch the built wallpaper app without installing: + +```bash +open build/MatrixWallpaper.app +``` + ### Install ```bash @@ -199,6 +139,16 @@ To relaunch the screen saver host manually: open -a ScreenSaverEngine ``` +To install and launch the wallpaper app in your user Applications folder: + +```bash +./install-wallpaper.sh +open ~/Applications/MatrixWallpaper.app +``` + +The installer builds and verifies the app, gracefully quits running copies before +replacement, and retains preferences. It does not launch the app or enable login startup. + ### Origin This project started as an attempt to wrap `cxxmatrix` inside a macOS screen saver. diff --git a/Scripts/render-homebrew-release.py b/Scripts/render-homebrew-release.py index c6cc65f..3a55482 100644 --- a/Scripts/render-homebrew-release.py +++ b/Scripts/render-homebrew-release.py @@ -25,12 +25,12 @@ def asset_url(version): return f"https://github.com/{REPOSITORY}/releases/download/{validate_version(version)}/{version}.zip" -def binary_minimum(data): +def binary_minimum(data, expected_kind=8): if len(data) < 32: raise ValueError("Truncated Mach-O header") magic, cpu, _, kind, count, size, _, _ = struct.unpack_from("<8I", data) - if magic != 0xFEEDFACF or cpu != 0x0100000C or kind != 8: - raise ValueError("Release must contain a thin ARM64 Mach-O bundle") + if magic != 0xFEEDFACF or cpu != 0x0100000C or kind != expected_kind: + raise ValueError("Release must contain thin ARM64 Mach-O binaries of the expected type") end = 32 + size if end > len(data): raise ValueError("Truncated Mach-O commands") @@ -73,17 +73,22 @@ def render(archive_path, version, url, digest, provenance, output): path = PurePosixPath(entry.filename) if path.is_absolute() or ".." in path.parts or "\\" in entry.filename: raise ValueError("Unsafe archive path") - if not path.parts or path.parts[0] not in ("MatrixScreenSaver.saver", "__MACOSX"): - raise ValueError("Unexpected saver archive layout") + if not path.parts or path.parts[0] not in ("MatrixScreenSaver.saver", "MatrixWallpaper.app", "__MACOSX"): + raise ValueError("Unexpected release archive layout") if (entry.external_attr >> 16) & 0o170000 == 0o120000: raise ValueError("Symlinks are not supported in release archives") - info = plistlib.loads(archive.read("MatrixScreenSaver.saver/Contents/Info.plist")) - if (info.get("CFBundleIdentifier") != "dev.patsch.MatrixScreenSaver" - or info.get("CFBundleShortVersionString") != version - or info.get("CFBundleVersion") != version - or info.get("CFBundleExecutable") != "MatrixScreenSaver"): - raise ValueError("Bundle identity, executable, or version mismatch") - minimum = binary_minimum(archive.read("MatrixScreenSaver.saver/Contents/MacOS/MatrixScreenSaver")) + minimum = (0, 0, 0) + identifiers = [] + for name, extension, kind in [("MatrixScreenSaver", "saver", 8), ("MatrixWallpaper", "app", 2)]: + root = f"{name}.{extension}/Contents" + info = plistlib.loads(archive.read(f"{root}/Info.plist")) + if (info.get("CFBundleIdentifier") != f"dev.patsch.{name}" + or info.get("CFBundleShortVersionString") != version + or info.get("CFBundleVersion") != version + or info.get("CFBundleExecutable") != name): + raise ValueError("Bundle identity, executable, or version mismatch") + identifiers.append(info["CFBundleIdentifier"]) + minimum = max(minimum, binary_minimum(archive.read(f"{root}/MacOS/{name}"), kind)) # Select the next known OS floor, never silently understate the binary requirement. if minimum <= (15, 0, 0): floor, symbol = "15.0", "sequoia" @@ -99,7 +104,8 @@ def render(archive_path, version, url, digest, provenance, output): raise ValueError("Cask template no longer matches renderer contract") manifest = {"version": version, "asset_url": url, "sha256": sha256, "architecture": "arm64", "minimum_macos": ".".join(map(str, minimum)), - "cask_macos_floor": floor, "bundle_identifier": info["CFBundleIdentifier"], + "cask_macos_floor": floor, "bundle_identifier": identifiers[0], + "bundle_identifiers": identifiers, "provenance": provenance} output = Path(output) (output / "Casks").mkdir(parents=True, exist_ok=True) diff --git a/Scripts/update-homebrew-tap.py b/Scripts/update-homebrew-tap.py index 0544b68..fcf7285 100644 --- a/Scripts/update-homebrew-tap.py +++ b/Scripts/update-homebrew-tap.py @@ -2,6 +2,7 @@ """Publish verified release metadata to the tap's default branch, failing closed.""" import argparse import base64 +import hashlib import json import os from pathlib import Path @@ -11,6 +12,7 @@ import urllib.request TEMPLATE = Path(__file__).resolve().parents[1] / "Homebrew/Casks/matrix-screen-saver.rb" +LEGACY_STRUCTURE_SHA256 = "5887ff0f5de0edcb895128458af2b519c4243ebe67b6de3a78374c1934c24e59" def cask_metadata(content): @@ -65,7 +67,8 @@ def update(api, target, version, content): raise ValueError("Tap cask is missing or not a regular file; inspect it before publication") current = base64.b64decode(existing["content"]).decode() previous, previous_structure = cask_metadata(current) - if previous_structure != structure: + if (previous_structure != structure + and hashlib.sha256(previous_structure.encode()).hexdigest() != LEGACY_STRUCTURE_SHA256): raise ValueError("Tap cask has unrelated edits; review the manual handoff (no overwrite)") if tuple(map(int, previous[0].split("."))) > tuple(map(int, version.split("."))): return f"Tap already has newer version {previous[0]}; skipped {version}" @@ -98,7 +101,8 @@ def main(): expected_url = ("https://github.com/patrickschaper/matrixScreenSaver/releases/download/" f"{manifest['version']}/{manifest['version']}.zip") if (manifest["asset_url"] != expected_url or metadata[1] != manifest["sha256"] - or {"sequoia": "15.0", "tahoe": "26.0"}[metadata[2]] != manifest["cask_macos_floor"]): + or {"sequoia": "15.0", "tahoe": "26.0"}[metadata[2]] != manifest["cask_macos_floor"] + or manifest.get("bundle_identifiers") != ["dev.patsch.MatrixScreenSaver", "dev.patsch.MatrixWallpaper"]): raise ValueError("Cask does not match the verified handoff manifest") print(update(GitHubAPI(token), args.target, manifest["version"], content)) except (ValueError, RuntimeError, OSError, KeyError) as error: diff --git a/Tests/Homebrew/cask_lifecycle_test.rb b/Tests/Homebrew/cask_lifecycle_test.rb index 4c0bf30..6d5b3bd 100644 --- a/Tests/Homebrew/cask_lifecycle_test.rb +++ b/Tests/Homebrew/cask_lifecycle_test.rb @@ -13,12 +13,14 @@ def setup def teardown = FileUtils.remove_entry(@root) - def definition(occupied: false, broken: false) + def definition(occupied: false, broken: false, artifact_index: 1) dsl = FakeCaskDSL.new(@root) dsl.load_definition - artifact = dsl.artifacts.first - FileUtils.mkdir_p(artifact.source) - (artifact.source/"executable").write("new") + dsl.artifacts.each do |item| + FileUtils.mkdir_p(item.source) + (item.source/"executable").write("new") + end + artifact = dsl.artifacts.fetch(artifact_index) FileUtils.mkdir_p(artifact.target.dirname) if broken File.symlink("missing", artifact.target) @@ -33,11 +35,15 @@ def assert_success(dsl) assert_equal 1, dsl.messages.count(COFFEE) refute dsl.commands.any? { |cmd, _| cmd == "/usr/bin/open" } assert_equal "saved options\x00", @prefs.read - assert_equal "new", (dsl.artifacts.first.target/"executable").read - quarantine = dsl.commands.find { |cmd, _| cmd == "/usr/bin/xattr" } - assert_equal ["-dr", "com.apple.quarantine", dsl.artifacts.first.source.to_s], quarantine[1] - assert_equal ["{{staged_path}}/MatrixScreenSaver.saver"], quarantine[2][:writable_paths] + dsl.artifacts.each do |artifact| + assert_equal "new", (artifact.target/"executable").read + quarantine = dsl.commands.find { |cmd, args| cmd == "/usr/bin/xattr" && args.last == artifact.source.to_s } + assert quarantine, "missing quarantine removal for #{artifact.source}" + assert_equal ["-dr", "com.apple.quarantine", artifact.source.to_s], quarantine[1] + assert_equal ["{{staged_path}}/#{artifact.source.basename}"], quarantine[2][:writable_paths] + end assert dsl.messages.any? { |m| m.include?("Open System Settings") } + assert dsl.messages.any? { |m| m.include?("Open #{dsl.artifacts.first.target} to start Matrix Wallpaper.") } end def test_modern_definition_is_inert_until_install @@ -52,7 +58,7 @@ def test_modern_definition_is_inert_until_install def test_unforced_conflict_is_delegated_and_never_prints_success dsl = definition(occupied: true) assert_raises(RuntimeError) { dsl.install } - assert_equal "manual", (dsl.artifacts.first.target/"executable").read + assert_equal "manual", (dsl.artifacts.fetch(1).target/"executable").read assert dsl.messages.any? { |m| m.include?("brew install --cask --force patrickschaper/tap/matrix-screen-saver") } guidance = dsl.commands.find { |_, args, _| args.any? { |arg| arg.include?("--force") } } assert_equal [{ path: "MatrixScreenSaver.saver", base: :screen_saverdir }], guidance[2][:writable_paths] @@ -70,7 +76,7 @@ def test_forced_migration def test_broken_symlink_is_left_to_native_conflict_handling dsl = definition(broken: true) assert_raises(RuntimeError) { dsl.install } - assert dsl.artifacts.first.target.symlink? + assert dsl.artifacts.fetch(1).target.symlink? refute dsl.messages.any? { |m| m.include?("--force") } refute_includes dsl.messages, COFFEE dsl.install(force: true) @@ -83,7 +89,7 @@ def test_quarantine_failure_and_missing_source_abort assert_raises(RuntimeError) { dsl.install } refute dsl.artifacts.first.target.exist? refute_includes dsl.messages, COFFEE - FileUtils.rm_rf(dsl.artifacts.first.source) + FileUtils.rm_rf(dsl.artifacts.fetch(1).source) dsl.fail_quarantine = false assert_raises(RuntimeError) { dsl.install } assert_equal 2, dsl.commands.count { |cmd, _| cmd == "/usr/bin/xattr" } @@ -93,8 +99,33 @@ def test_quarantine_failure_and_missing_source_abort def test_no_preference_cleanup_artifact dsl = definition - assert_equal 1, dsl.artifacts.length + assert_equal ["MatrixWallpaper.app", "MatrixScreenSaver.saver"], dsl.artifacts.map { |a| a.source.basename.to_s } + assert_equal({quit: "dev.patsch.MatrixWallpaper", login_item: "Matrix Wallpaper"}, dsl.uninstall_directives) source = File.read(File.expand_path("../../Homebrew/Casks/matrix-screen-saver.rb", __dir__)) - refute_match(/\b(zap|defaults|uninstall)\b/, source) + refute_match(/\b(zap|defaults|unregister|launchctl)\b/, source) + refute_match(/\b(?:preflight|postflight|uninstall_preflight|uninstall_postflight)\s+do/, source) + refute_match(/\/usr\/bin\/open|osascript|--register/, source) + end + + def test_app_conflict_uses_custom_appdir_and_never_prints_success + dsl = definition(occupied: true, artifact_index: 0) + assert_raises(RuntimeError) { dsl.install } + assert_equal "manual", (dsl.artifacts.first.target/"executable").read + guidance = dsl.commands.find { |_, args| args.any? { |arg| arg.include?("Existing app at #{@root}/custom apps/MatrixWallpaper.app") } } + assert guidance, "missing custom appdir conflict guidance" + assert_equal [{path: "MatrixWallpaper.app", base: :appdir}], guidance[2][:writable_paths] + refute_includes dsl.messages, COFFEE + assert_equal "saved options\x00", @prefs.read + dsl.install(force: true) + assert_success(dsl) + end + + def test_missing_app_aborts_before_install_success + dsl = definition + FileUtils.remove_entry(dsl.artifacts.first.source) + assert_raises(RuntimeError) { dsl.install } + refute dsl.artifacts.any? { |a| a.target.exist? } + refute_includes dsl.messages, COFFEE + assert_equal "saved options\x00", @prefs.read end end diff --git a/Tests/Homebrew/documentation_test.py b/Tests/Homebrew/documentation_test.py index 392a205..dfee1b6 100644 --- a/Tests/Homebrew/documentation_test.py +++ b/Tests/Homebrew/documentation_test.py @@ -12,6 +12,7 @@ def test_user_lifecycle_and_security(self): self.assertIn("brew install --cask patrickschaper/tap/matrix-screen-saver", quick) self.assertLessEqual(len(quick.strip().splitlines()), 5) self.assertNotIn("## Homebrew install", text) + self.assertNotIn("## Homebrew lifecycle", text) self.assertNotIn("## Manual quick install", text) self.assertIn("## Buy me a coffee", text) self.assertIn("https://www.buymeacoffee.com/yesman82", text) @@ -25,6 +26,12 @@ def test_maintainer_permissions_and_compatibility(self): "patrickschaper/homebrew-tap", "token pending"]: self.assertIn(phrase, text) + def test_maintainer_dual_bundle_lifecycle_is_documented(self): + maintainer = (ROOT / "Homebrew/README.md").read_text() + for phrase in ["both bundle", "successor", "no unconditional unregister script", + "normalized structure hash", "never quits a real app"]: + self.assertIn(phrase, maintainer) + def test_release_publishes_tap_after_verified_handoff_without_blocking_release(self): text = (ROOT / ".github/workflows/release.yml").read_text() self.assertLess(text.index("Scripts/render-homebrew-release.py"), text.index("Scripts/update-homebrew-tap.py")) diff --git a/Tests/Homebrew/fixtures/legacy-screen-saver.rb b/Tests/Homebrew/fixtures/legacy-screen-saver.rb new file mode 100644 index 0000000..b358601 --- /dev/null +++ b/Tests/Homebrew/fixtures/legacy-screen-saver.rb @@ -0,0 +1,43 @@ +cask "matrix-screen-saver" do + version "0.2.0" + sha256 "7a60c8ec2855a2df4cb008da7f79ea9e8526385897e3048bb53bb42421e07acd" + + url "https://github.com/patrickschaper/matrixScreenSaver/releases/download/#{version}/#{version}.zip" + name "MatrixScreenSaver" + desc "Native terminal-style Matrix screen saver" + homepage "https://github.com/patrickschaper/matrixScreenSaver" + + depends_on arch: :arm64 + depends_on macos: :sequoia + + screen_saver "MatrixScreenSaver.saver" + + preflight_steps do + if_path_exists "MatrixScreenSaver.saver", base: :screen_saverdir do + # Homebrew also grants read access here when the native target is under HOME. + run "/bin/echo", + args: ["Existing screen saver at {{screen_saverdir}}/MatrixScreenSaver.saver. " \ + "To replace it while retaining options, run: " \ + "brew install --cask --force patrickschaper/tap/matrix-screen-saver"], + print_stdout: true, + writable_paths: [{ path: "MatrixScreenSaver.saver", base: :screen_saverdir }] + end + + run "/bin/echo", + args: ["Removing staged quarantine bypasses Gatekeeper quarantine checks; " \ + "this does not make the saver notarized or Apple-approved."], + print_stdout: true + run "/usr/bin/xattr", + args: ["-dr", "com.apple.quarantine", "{{staged_path}}/MatrixScreenSaver.saver"], + writable_paths: ["{{staged_path}}/MatrixScreenSaver.saver"] + end + + postflight_steps do + run "/bin/echo", + args: ["There is no spoon. There is coffee: https://www.buymeacoffee.com/yesman82"], + print_stdout: true + run "/bin/echo", + args: ["Open System Settings > Wallpaper > Screen Saver and select MatrixScreenSaver."], + print_stdout: true + end +end diff --git a/Tests/Homebrew/fixtures/release_fixture.py b/Tests/Homebrew/fixtures/release_fixture.py index a9062d5..6e20d76 100644 --- a/Tests/Homebrew/fixtures/release_fixture.py +++ b/Tests/Homebrew/fixtures/release_fixture.py @@ -1,10 +1,11 @@ -"""Tiny deterministic release archives; not executable screen savers.""" +"""Tiny deterministic release archives; not runnable bundles.""" import plistlib import struct import zipfile -def write_archive(path, version="1.2.3", cpu=0x0100000C, minimum=15, root="MatrixScreenSaver.saver"): +def write_archive(path, version="1.2.3", cpu=0x0100000C, minimum=15, root="MatrixScreenSaver.saver", + *, wallpaper=True, wallpaper_minimum=15): command = struct.pack("<6I", 0x32, 24, 1, minimum << 16, minimum << 16, 0) binary = struct.pack("<8I", 0xFEEDFACF, cpu, 0, 8, 1, len(command), 0, 0) + command info = plistlib.dumps({"CFBundleIdentifier": "dev.patsch.MatrixScreenSaver", @@ -14,3 +15,13 @@ def write_archive(path, version="1.2.3", cpu=0x0100000C, minimum=15, root="Matri for name, data in [(f"{root}/Contents/Info.plist", info), (f"{root}/Contents/MacOS/MatrixScreenSaver", binary)]: archive.writestr(zipfile.ZipInfo(name, (2026, 1, 1, 0, 0, 0)), data) + if wallpaper: + command = struct.pack("<6I", 0x32, 24, 1, wallpaper_minimum << 16, wallpaper_minimum << 16, 0) + binary = struct.pack("<8I", 0xFEEDFACF, cpu, 0, 2, 1, len(command), 0, 0) + command + info = plistlib.dumps({"CFBundleIdentifier": "dev.patsch.MatrixWallpaper", + "CFBundleShortVersionString": version, "CFBundleVersion": version, + "CFBundleExecutable": "MatrixWallpaper", + "CFBundlePackageType": "APPL", "CFBundleName": "MatrixWallpaper"}) + for name, data in [("MatrixWallpaper.app/Contents/Info.plist", info), + ("MatrixWallpaper.app/Contents/MacOS/MatrixWallpaper", binary)]: + archive.writestr(zipfile.ZipInfo(name, (2026, 1, 1, 0, 0, 0)), data) diff --git a/Tests/Homebrew/integration_lifecycle.sh b/Tests/Homebrew/integration_lifecycle.sh index a95f6bd..11f8d94 100644 --- a/Tests/Homebrew/integration_lifecycle.sh +++ b/Tests/Homebrew/integration_lifecycle.sh @@ -23,6 +23,7 @@ import sys sys.path.insert(0, "Tests/Homebrew") from fixtures.release_fixture import write_archive root = Path(sys.argv[1]) +write_archive(root / "1.2.2.zip", version="1.2.2", wallpaper=False) for version in ("1.2.3", "1.2.4"): write_archive(root / f"{version}.zip", version=version) PY diff --git a/Tests/Homebrew/release_metadata_test.py b/Tests/Homebrew/release_metadata_test.py index 4788d9e..503057d 100644 --- a/Tests/Homebrew/release_metadata_test.py +++ b/Tests/Homebrew/release_metadata_test.py @@ -2,10 +2,14 @@ import importlib.util import json from pathlib import Path +import plistlib +import struct import subprocess import sys import tempfile import unittest +import warnings +import zipfile from fixtures.release_fixture import write_archive @@ -23,11 +27,11 @@ def setUp(self): def tearDown(self): self.temp.cleanup() - def run_render(self, version="1.2.3", digest=None): + def run_render(self, version="1.2.3", digest=None, url=None): digest = digest or "sha256:" + hashlib.sha256(self.archive.read_bytes()).hexdigest() - return subprocess.run([sys.executable, str(SCRIPT), "--archive", str(self.archive), + return subprocess.run([sys.executable, "-B", str(SCRIPT), "--archive", str(self.archive), "--version", version, "--digest", digest, - "--asset-url", f"https://github.com/patrickschaper/matrixScreenSaver/releases/download/{version}/{version}.zip", + "--asset-url", url or f"https://github.com/patrickschaper/matrixScreenSaver/releases/download/{version}/{version}.zip", "--provenance", "fixture", "--output", str(self.root / "out")], capture_output=True, text=True) @@ -37,6 +41,9 @@ def test_pinned_handoff_and_deterministic_rerun(self): manifest = json.loads((self.root / "out/manifest.json").read_text()) self.assertEqual("1.2.3", manifest["version"]) self.assertEqual("arm64", manifest["architecture"]) + self.assertEqual("dev.patsch.MatrixScreenSaver", manifest["bundle_identifier"]) + self.assertEqual(["dev.patsch.MatrixScreenSaver", "dev.patsch.MatrixWallpaper"], + manifest["bundle_identifiers"]) self.assertEqual(hashlib.sha256(self.archive.read_bytes()).hexdigest(), manifest["sha256"]) cask = (self.root / "out/Casks/matrix-screen-saver.rb").read_text() self.assertIn('version "1.2.3"', cask) @@ -46,7 +53,8 @@ def test_pinned_handoff_and_deterministic_rerun(self): self.assertEqual(cask, (self.root / "out/Casks/matrix-screen-saver.rb").read_text()) def test_rejects_invalid_inputs_without_handoff(self): - cases = [dict(version="../oops"), dict(digest="sha256:" + "0" * 64)] + cases = [dict(version="../oops"), dict(digest="sha256:" + "0" * 64), + dict(url="https://github.com/patrickschaper/matrixScreenSaver/releases/latest/download/1.2.3.zip")] for case in cases: with self.subTest(case=case): self.assertNotEqual(0, self.run_render(**case).returncode) @@ -65,6 +73,98 @@ def test_floor_never_lower_than_binary(self): self.assertEqual(0, result.returncode, result.stderr) self.assertIn("depends_on macos: :tahoe", (self.root / "out/Casks/matrix-screen-saver.rb").read_text()) + def test_wallpaper_sets_aggregate_floor(self): + write_archive(self.archive, wallpaper_minimum=26) + result = self.run_render() + self.assertEqual(0, result.returncode, result.stderr) + manifest = json.loads(result.stdout) + self.assertEqual("26.0.0", manifest["minimum_macos"]) + self.assertEqual("26.0", manifest["cask_macos_floor"]) + + def test_rejects_missing_bundles(self): + write_archive(self.archive, wallpaper=False) + self.assertNotEqual(0, self.run_render().returncode) + write_archive(self.archive) + with zipfile.ZipFile(self.archive) as archive: + app = [(entry, archive.read(entry)) for entry in archive.infolist() + if entry.filename.startswith("MatrixWallpaper.app/")] + with zipfile.ZipFile(self.archive, "w") as archive: + for entry, data in app: + archive.writestr(entry, data) + self.assertNotEqual(0, self.run_render().returncode) + self.assertFalse((self.root / "out").exists()) + + def test_rejects_invalid_wallpaper_metadata_and_binary(self): + plist_path = "MatrixWallpaper.app/Contents/Info.plist" + binary_path = "MatrixWallpaper.app/Contents/MacOS/MatrixWallpaper" + cases = [(plist_path, key, value) for key, value in [ + ("CFBundleIdentifier", "dev.patsch.Other"), + ("CFBundleShortVersionString", "9.9.9"), ("CFBundleVersion", "9.9.9"), + ("CFBundleExecutable", "Other")]] + # Mach-O offsets: CPU, file type, platform, minimum OS, load command type. + cases += [(binary_path, offset, value) for offset, value in [ + (4, 0x01000007), (12, 8), (40, 2), (44, 27 << 16), (32, 0)]] + cases.append(("MatrixScreenSaver.saver/Contents/MacOS/MatrixScreenSaver", 12, 2)) + for path, field, value in cases: + with self.subTest(field=field, value=value): + write_archive(self.archive) + with zipfile.ZipFile(self.archive) as archive: + entries = [(entry, archive.read(entry)) for entry in archive.infolist()] + with zipfile.ZipFile(self.archive, "w") as archive: + for entry, data in entries: + if entry.filename == path: + if path == plist_path: + info = plistlib.loads(data) + info[field] = value + data = plistlib.dumps(info) + else: + data = bytearray(data) + struct.pack_into(" VERSION'), + prepare.index("./build.sh\n")) + self.assertIn('ditto "build/MatrixWallpaper.app" "${release_dir}/MatrixWallpaper.app"', publish) + def test_fetch_consumes_existing_asset_and_missing_asset_fails(self): from unittest.mock import Mock, call, patch spec = importlib.util.spec_from_file_location("render_release", SCRIPT) diff --git a/Tests/Homebrew/support/fake_cask_dsl.rb b/Tests/Homebrew/support/fake_cask_dsl.rb index 1c8d7f6..233feab 100644 --- a/Tests/Homebrew/support/fake_cask_dsl.rb +++ b/Tests/Homebrew/support/fake_cask_dsl.rb @@ -5,7 +5,7 @@ class FakeCaskDSL Artifact = Struct.new(:source, :target) attr_accessor :fail_quarantine - attr_reader :artifacts, :commands, :dependencies, :messages + attr_reader :artifacts, :commands, :dependencies, :messages, :uninstall_directives def initialize(root) @root = Pathname(root) @@ -29,6 +29,12 @@ def screen_saver(name) @artifacts << Artifact.new(@root/"stage"/name, @root/"custom savers"/name) end + def app(name) + @artifacts << Artifact.new(@root/"stage"/name, @root/"custom apps"/name) + end + + def uninstall(**directives) = @uninstall_directives = directives + def preflight_steps(&block) @steps = @preflight instance_eval(&block) @@ -51,6 +57,7 @@ def run(command, **options) = @steps << [command, options, @guard] def expand(value) value.gsub("{{staged_path}}", (@root/"stage").to_s) .gsub("{{screen_saverdir}}", (@root/"custom savers").to_s) + .gsub("{{appdir}}", (@root/"custom apps").to_s) end def execute(steps) @@ -61,21 +68,22 @@ def execute(steps) @commands << [command, args, options] @messages.concat(args) if command == "/bin/echo" && options[:print_stdout] if command == "/usr/bin/xattr" - raise "quarantine failed" if @fail_quarantine || !@artifacts.first.source.directory? + raise "quarantine failed" if @fail_quarantine || !Pathname(args.last).directory? end end end def install(force: false) execute(@preflight) - artifact = @artifacts.first - if artifact.target.exist? || artifact.target.symlink? - raise "native conflict" unless force - - FileUtils.rm_rf(artifact.target) + # Only models conflict rejection, not Homebrew's filesystem rollback. + @artifacts.each do |artifact| + raise "native conflict" if !force && (artifact.target.exist? || artifact.target.symlink?) + end + @artifacts.each do |artifact| + FileUtils.rm_rf(artifact.target) if force + FileUtils.mkdir_p(artifact.target.dirname) + FileUtils.mv(artifact.source, artifact.target) end - FileUtils.mkdir_p(artifact.target.dirname) - FileUtils.mv(artifact.source, artifact.target) execute(@postflight) end end diff --git a/Tests/Homebrew/support/integration_driver.rb b/Tests/Homebrew/support/integration_driver.rb index a391cab..38ad989 100644 --- a/Tests/Homebrew/support/integration_driver.rb +++ b/Tests/Homebrew/support/integration_driver.rb @@ -8,7 +8,7 @@ ENV["HOMEBREW_DEVELOPER"] = "1" ROOT = Pathname(ARGV.fetch(0)).realpath raise "Unsafe test root" unless ROOT.basename.to_s.start_with?("matrix-homebrew-integration.") -raise "Homebrew 7.0.7 is required for this compatibility test" unless HOMEBREW_VERSION.start_with?("7.0.7") +raise "Homebrew 7.0.7 or newer is required for this compatibility test" if Version.new(HOMEBREW_VERSION) < Version.new("7.0.7") raise "Cache escaped isolation" unless HOMEBREW_CACHE.realpath.to_s.start_with?("#{ROOT}/") raise "Native checks require Homebrew's sandbox" unless Sandbox.use_for?("running cask artifact operations") @@ -19,25 +19,46 @@ (TAP.path/"Casks").mkpath CONFIG = Cask::Config.new(explicit: Cask::Config::DEFAULT_DIRS.keys.to_h { |key| [key, ROOT/key.to_s] }) TARGET = CONFIG.screen_saverdir/"MatrixScreenSaver.saver" +APP_TARGET = CONFIG.appdir/"MatrixWallpaper.app" +TARGETS = [TARGET, APP_TARGET].freeze PREFS = ROOT/"preferences-sentinel" PREFS.write("saved options\x00") COFFEE = "There is no spoon. There is coffee: https://www.buymeacoffee.com/yesman82".freeze check_source = Pathname("Homebrew/Casks/matrix-screen-saver.rb").read raise "Cask must not launch Settings" if check_source.include?("/usr/bin/open") +# Keep native directive dispatch and successor checks, but never cross the +# AppleScript boundary into the user's running app or real login items. +OSASCRIPT_CALLS = [] +FAILED_STATUS = SystemCommand.run("/usr/bin/false").status +module IsolatedUninstallAutomation + def system_command(executable, **options) + return super unless File.basename(executable.to_s) == "osascript" + + raise "Unexpected automation artifact" unless cask.token == "matrix-screen-saver" + + OSASCRIPT_CALLS << options.fetch(:args) + # Not running; login removal fails to exercise native best-effort handling. + SystemCommand::Result.new([executable.to_s, *options.fetch(:args)], [], FAILED_STATUS, secrets: []) + end +end +Cask::Artifact::AbstractUninstall.prepend(IsolatedUninstallAutomation) + # Observe real stage ordering and plant real quarantine on fixture bytes before -# preflight. No native filesystem/download/artifact/quarantine operation is mocked. +# preflight. No native filesystem/download/quarantine operation is mocked. module StageObservation def stage super raise "Receipt missing after real stage" unless cask.installed? - saver = cask.artifacts.grep(Cask::Artifact::ScreenSaver).fetch(0) - raise "Source or target escaped isolation" unless [saver.source, saver.target].all? { |p| p.to_s.start_with?("#{ROOT}/") } + cask.artifacts.select { |a| a.is_a?(Cask::Artifact::ScreenSaver) || a.is_a?(Cask::Artifact::App) }.each do |artifact| + raise "Source or target escaped isolation" unless [artifact.source, artifact.target].all? { |p| p.to_s.start_with?("#{ROOT}/") } - SystemCommand.run!("/usr/bin/xattr", args: ["-w", "com.apple.quarantine", "0081;00000000;fixture;", saver.source.to_s]) - SystemCommand.run!("/usr/bin/xattr", args: ["-w", "com.apple.quarantine", "0081;00000000;fixture;", - (saver.source/"Contents/MacOS/MatrixScreenSaver").to_s]) + executable = artifact.source.extname == ".app" ? "MatrixWallpaper" : "MatrixScreenSaver" + [artifact.source, artifact.source/"Contents/MacOS"/executable].each do |path| + SystemCommand.run!("/usr/bin/xattr", args: ["-w", "com.apple.quarantine", "0081;00000000;fixture;", path.to_s]) + end + end end end Cask::Installer.prepend(StageObservation) @@ -56,8 +77,8 @@ def capture $stdout, $stderr = old_out, old_err end -def definition(version) - content = Pathname("Homebrew/Casks/matrix-screen-saver.rb").read +def definition(version, legacy: false) + content = Pathname(legacy ? "Tests/Homebrew/fixtures/legacy-screen-saver.rb" : "Homebrew/Casks/matrix-screen-saver.rb").read content.sub!('version "0.2.0"', "version \"#{version}\"") content.sub!(/sha256 "[0-9a-f]+"/, "sha256 \"#{Digest::SHA256.file(ROOT/"#{version}.zip").hexdigest}\"") content.sub!(/^ url .+$/, " url \"file://#{ROOT}/#{version}.zip\"") @@ -69,22 +90,31 @@ def definition(version) loaded end -def verify_target(version) - info = SystemCommand.run!("/usr/libexec/PlistBuddy", - args: ["-c", "Print :CFBundleShortVersionString", (TARGET/"Contents/Info.plist").to_s]) - check(info.stdout.strip == version, "Native target has wrong version") - [TARGET, TARGET/"Contents/MacOS/MatrixScreenSaver"].each do |path| - result = SystemCommand.run("/usr/bin/xattr", args: ["-p", "com.apple.quarantine", path.to_s], print_stderr: false) - check(!result.success?, "Quarantine survived preflight") +def verify_target(version, targets: TARGETS) + targets.each do |target| + info = SystemCommand.run!("/usr/libexec/PlistBuddy", + args: ["-c", "Print :CFBundleShortVersionString", (target/"Contents/Info.plist").to_s]) + check(info.stdout.strip == version, "Native target has wrong version") + executable = target.extname == ".app" ? "MatrixWallpaper" : "MatrixScreenSaver" + [target, target/"Contents/MacOS"/executable].each do |path| + result = SystemCommand.run("/usr/bin/xattr", args: ["-p", "com.apple.quarantine", path.to_s], print_stderr: false) + check(!result.success?, "Quarantine survived preflight") + end end check(PREFS.read == "saved options\x00", "Preferences changed") end def uninstall(cask) + OSASCRIPT_CALLS.clear output = capture { Cask::Installer.new(cask).uninstall } check(!output.match?(/deprecated/i), "Uninstall emitted deprecation warnings") check(!output.include?(COFFEE), "Uninstall printed install success") - check(!TARGET.exist? && !TARGET.symlink?, "Native uninstall left target") + check(TARGETS.none? { |target| target.exist? || target.symlink? }, "Native uninstall left target") + check(OSASCRIPT_CALLS.any? { |args| args.last == "dev.patsch.MatrixWallpaper" }, "Native quit did not probe running app") + login_calls = OSASCRIPT_CALLS.select { |args| args.join.include?("delete every login item") } + check(login_calls.any? { |args| args.last.include?(APP_TARGET.to_s.inspect) }, "Native path login removal not attempted") + check(login_calls.any? { |args| args.last.include?("Matrix Wallpaper".inspect) }, "Native named login removal not attempted") + check(output.include?("failed"), "Failed login cleanup did not warn") check(PREFS.read == "saved options\x00", "Uninstall changed preferences") end @@ -106,12 +136,53 @@ def uninstall(cask) puts output check(output.scan(COFFEE).length == 1, "Fresh coffee output count wrong") check(output.include?("Open System Settings > Wallpaper > Screen Saver"), "Manual selection guidance missing") +check(output.include?("Open #{APP_TARGET} to start Matrix Wallpaper."), "Wallpaper launch guidance missing configured app path") check(!output.match?(/deprecated/i), "Install emitted deprecation warnings") verify_target("1.2.3") +check(OSASCRIPT_CALLS.empty?, "Install attempted startup or cleanup") puts "PASS AE1 sandboxed native fresh install and actual coffee stdout" +uninstall(fresh) +OSASCRIPT_CALLS.clear +legacy = definition("1.2.2", legacy: true) +capture { Cask::Installer.new(legacy).install } +verify_target("1.2.2", targets: [TARGET]) +check(!APP_TARGET.exist?, "Legacy fixture installed an app") +APP_TARGET.mkpath +(APP_TARGET/"manual-executable").write("manual sentinel") +conflicting = definition("1.2.3") +failed = false +output = capture do + begin + Cask::Upgrade.upgrade_cask(legacy, conflicting, binaries: true, force: false, + require_sha: true, quit: false, skip_cask_deps: false, verbose: false, + download_queue: Homebrew::DownloadQueue.default, + new_cask_installer: Cask::Installer.new(conflicting, upgrade: true)) + rescue Cask::CaskError + failed = true + end +end +check(failed, "Legacy upgrade unexpectedly replaced a manual app") +check((APP_TARGET/"manual-executable").read == "manual sentinel", "Legacy upgrade changed manual app") +verify_target("1.2.2", targets: [TARGET]) +check(output.include?("Reverting upgrade"), "Failed legacy upgrade did not report rollback") +FileUtils.remove_entry(APP_TARGET) +puts "PASS native legacy upgrade conflict preserves manual app and restores saver" +fresh = definition("1.2.3") +output = capture do + Cask::Upgrade.upgrade_cask(legacy, fresh, binaries: true, force: false, + require_sha: true, quit: false, skip_cask_deps: false, verbose: false, + download_queue: Homebrew::DownloadQueue.default, + new_cask_installer: Cask::Installer.new(fresh, upgrade: true)) +end +verify_target("1.2.3") +check(output.scan(COFFEE).length == 1, "Legacy migration coffee output count wrong") +check(OSASCRIPT_CALLS.empty?, "Legacy migration attempted automation") +puts "PASS native legacy saver-only to dual-bundle migration" + # AE4: successor evaluates while prior metadata exists, before native upgrade. successor = definition("1.2.4") +OSASCRIPT_CALLS.clear check(successor.installed?, "Successor did not observe prior metadata") output = capture do Cask::Upgrade.upgrade_cask(fresh, successor, binaries: true, force: false, @@ -122,42 +193,49 @@ def uninstall(cask) verify_target("1.2.4") check(output.scan(COFFEE).length == 1, "Upgrade coffee output count wrong") check(!output.match?(/deprecated/i), "Upgrade emitted deprecation warnings") +check(OSASCRIPT_CALLS.none? { |args| args.join.include?("delete every login item") }, "Upgrade removed login items") puts "PASS AE4 real two-version native upgrade" reinstall = definition("1.2.4") +OSASCRIPT_CALLS.clear output = capture { Cask::Installer.new(reinstall, reinstall: true).install } +check(OSASCRIPT_CALLS.none? { |args| args.join.include?("delete every login item") }, "Reinstall removed login items") check(output.scan(COFFEE).length == 1, "Reinstall coffee output count wrong") verify_target("1.2.4") uninstall(reinstall) puts "PASS AE5 native uninstall and managed reinstall preference retention" # AE2/AE3: existing manual bundle survives native rejection, then explicit force replaces. -TARGET.mkpath -(TARGET/"manual-executable").write("manual sentinel") -SystemCommand.run!("/usr/bin/xattr", args: ["-w", "com.apple.quarantine", "manual-quarantine", TARGET.to_s]) -manual = definition("1.2.3") -failed = false -output = capture do - begin - Cask::Installer.new(manual).install - rescue Cask::CaskError => error - failed = true - check(error.message.include?("already"), "Unexpected native conflict: #{error}") +TARGETS.each do |target| + target.mkpath + (target/"manual-executable").write("manual sentinel") + SystemCommand.run!("/usr/bin/xattr", args: ["-w", "com.apple.quarantine", "manual-quarantine", target.to_s]) + manual = definition("1.2.3") + failed = false + output = capture do + begin + Cask::Installer.new(manual).install + rescue Cask::CaskError => error + failed = true + check(error.message.include?("already"), "Unexpected native conflict: #{error}") + end end + check(failed, "Native artifact did not reject manual conflict") + check((target/"manual-executable").read == "manual sentinel", "Manual bundle changed") + check((TARGETS - [target]).none?(&:exist?), "Native rollback left the other bundle installed") + quarantine = SystemCommand.run!("/usr/bin/xattr", args: ["-p", "com.apple.quarantine", target.to_s]) + check(quarantine.stdout.strip == "manual-quarantine", "Preflight changed manual target quarantine") + check(output.include?("brew install --cask --force patrickschaper/tap/matrix-screen-saver"), "Missing qualified migration guidance") + check(output.include?(APP_TARGET.to_s), "Missing configured app destination guidance") if target == APP_TARGET + check(!output.include?(COFFEE), "Failure printed success") + check(PREFS.read == "saved options\x00", "Conflict changed preferences") + forced = definition("1.2.3") + output = capture { Cask::Installer.new(forced, force: true).install } + verify_target("1.2.3") + check(!(target/"manual-executable").exist?, "Force did not replace manual bundle") + check(output.scan(COFFEE).length == 1, "Forced migration success output wrong") + uninstall(forced) end -check(failed, "Native artifact did not reject manual conflict") -check((TARGET/"manual-executable").read == "manual sentinel", "Manual bundle changed") -quarantine = SystemCommand.run!("/usr/bin/xattr", args: ["-p", "com.apple.quarantine", TARGET.to_s]) -check(quarantine.stdout.strip == "manual-quarantine", "Preflight changed manual target quarantine") -check(output.include?("brew install --cask --force patrickschaper/tap/matrix-screen-saver"), "Missing qualified migration guidance") -check(!output.include?(COFFEE), "Failure printed success") -check(PREFS.read == "saved options\x00", "Conflict changed preferences") -forced = definition("1.2.3") -output = capture { Cask::Installer.new(forced, force: true).install } -verify_target("1.2.3") -check(!(TARGET/"manual-executable").exist?, "Force did not replace manual bundle") -check(output.scan(COFFEE).length == 1, "Forced migration success output wrong") -uninstall(forced) puts "PASS AE2/AE3 native conflict rejection and explicit force replacement" # Homebrew 7.0.7's existence guard misses dangling symlinks, but its native @@ -182,4 +260,4 @@ def uninstall(cask) puts "PASS native broken-symlink conflict and explicit force replacement" definition("1.2.3") puts "PASS developer-mode definition load and uninstall without legacy warnings" -puts "PASS all native lifecycle checks; installed saver and real Settings were never touched" +puts "PASS all native lifecycle checks; real apps, login items, installed bundles and Settings were never touched" diff --git a/Tests/Homebrew/tap_update_test.py b/Tests/Homebrew/tap_update_test.py index aa87b1c..57b6097 100644 --- a/Tests/Homebrew/tap_update_test.py +++ b/Tests/Homebrew/tap_update_test.py @@ -7,6 +7,7 @@ ROOT = Path(__file__).resolve().parents[2] SCRIPT = ROOT / "Scripts/update-homebrew-tap.py" TEMPLATE = (ROOT / "Homebrew/Casks/matrix-screen-saver.rb").read_text() +LEGACY = (ROOT / "Tests/Homebrew/fixtures/legacy-screen-saver.rb").read_text() def cask(version="1.2.3", digest="a" * 64, floor="sequoia"): @@ -40,6 +41,29 @@ def setUp(self): self.module = importlib.util.module_from_spec(spec) spec.loader.exec_module(self.module) + def test_known_saver_only_cask_migrates_without_allowing_unrelated_changes(self): + self.assertIn('app "MatrixWallpaper.app"', cask()) + api = FakeAPI(LEGACY) + self.module.update(api, "owner/homebrew-test", "1.2.3", cask()) + self.assertEqual(cask(), api.content) + self.assertEqual(1, sum(method == "PUT" for method, _, _ in api.calls)) + for content in (LEGACY + "# unreviewed change\n", + LEGACY.replace('desc "Native', 'desc "Custom Native')): + api = FakeAPI(content) + with self.subTest(content=content), self.assertRaises(ValueError): + self.module.update(api, "owner/homebrew-test", "1.2.3", cask()) + self.assertTrue(all(method == "GET" for method, _, _ in api.calls)) + + def test_legacy_migration_never_rewrites_same_or_newer_version(self): + for version in ("0.1.0", "0.2.0"): + api = FakeAPI(LEGACY) + if version == "0.2.0": + with self.assertRaises(ValueError): + self.module.update(api, "owner/homebrew-test", version, cask(version)) + else: + self.module.update(api, "owner/homebrew-test", version, cask(version)) + self.assertTrue(all(method == "GET" for method, _, _ in api.calls)) + def test_newer_release_is_published_once_to_default_branch(self): api = FakeAPI() content = cask(floor="tahoe") @@ -132,7 +156,8 @@ def test_verified_fixture_handoff_reaches_publication_and_tampering_fails(self): self.assertEqual((handoff / "Casks/matrix-screen-saver.rb").read_text(), api.content) manifest = json.loads((handoff / "manifest.json").read_text()) for field, value in [("sha256", "b" * 64), ("asset_url", "https://example.com/evil.zip"), - ("cask_macos_floor", "26.0")]: + ("cask_macos_floor", "26.0"), + ("bundle_identifiers", ["dev.patsch.MatrixScreenSaver"])]: with self.subTest(field=field): tampered = dict(manifest, **{field: value}) (handoff / "manifest.json").write_text(json.dumps(tampered)) From b5cc1ec74becc8830878306485f48a2b96378017 Mon Sep 17 00:00:00 2001 From: Patrick Schaper Date: Wed, 21 Oct 2026 18:17:41 +0200 Subject: [PATCH 4/8] chore: ignore local tooling and platform artifacts - ignore agent metadata and operating-system files - exclude editor history and backup files --- .gitignore | 18 ++++++++++++++++++ README.md | 3 +++ Tests/Homebrew/documentation_test.py | 4 +++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7610430..0ad617a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,10 @@ build/ DerivedData/ out/ +# Local agent tooling +.serena/ +.projectatlas/ + # macOS .DS_Store *.DS_Store @@ -12,6 +16,16 @@ out/ .LSOverride .localized __MACOSX/ +.Spotlight-V100/ +.Trashes/ +.TemporaryItems/ +.fseventsd/ + +# Windows +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ # Editors and IDEs .idea/ @@ -49,6 +63,10 @@ fastlane/test_output *.orig *.swp *.swo +.history/ +.vim/ +*.swn +*.bak *.temp *.tmp *~ diff --git a/README.md b/README.md index e32d4fa..d7362f8 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,9 @@ brew trust --cask patrickschaper/tap/matrix-screen-saver brew install --cask patrickschaper/tap/matrix-screen-saver ``` +- Wallpaper: open **MatrixWallpaper** in Applications. +- Saver options: **System Settings → Wallpaper → Screen Saver → MatrixScreenSaver → Options…**. + ## Buy me a coffee There is no spoon. There is coffee. Donations help fund a developer license for signing the screen saver. diff --git a/Tests/Homebrew/documentation_test.py b/Tests/Homebrew/documentation_test.py index dfee1b6..155197d 100644 --- a/Tests/Homebrew/documentation_test.py +++ b/Tests/Homebrew/documentation_test.py @@ -10,7 +10,9 @@ def test_user_lifecycle_and_security(self): quick = text.split("## Quick install\n", 1)[1].split("\n## ", 1)[0] self.assertIn("brew trust --cask patrickschaper/tap/matrix-screen-saver", quick) self.assertIn("brew install --cask patrickschaper/tap/matrix-screen-saver", quick) - self.assertLessEqual(len(quick.strip().splitlines()), 5) + self.assertLessEqual(len(quick.strip().splitlines()), 7) + self.assertIn("open **MatrixWallpaper** in Applications", quick) + self.assertIn("MatrixScreenSaver → Options…", quick) self.assertNotIn("## Homebrew install", text) self.assertNotIn("## Homebrew lifecycle", text) self.assertNotIn("## Manual quick install", text) From 51190fcc7e61004c170f160e3a056b550534bbcf Mon Sep 17 00:00:00 2001 From: Patrick Schaper Date: Thu, 22 Oct 2026 11:19:42 +0200 Subject: [PATCH 5/8] feat: add Matrix app and menu bar icons - reuse the SVG M outline with green glow and scanlines - bundle native app and monochrome menu bar assets - add reproducible artwork generation and icon regression checks --- Resources/MenuBarIcon.pdf | Bin 0 -> 5027 bytes Resources/Wallpaper-Info.plist | 2 + Resources/WallpaperIcon.icns | Bin 0 -> 505994 bytes Resources/WallpaperIcon.png | Bin 0 -> 221092 bytes Sources/MatrixWallpaper/WallpaperApp.swift | 10 +- .../WallpaperAppTests.swift | 46 ++++++ Tools/GenerateWallpaperIcons.swift | 150 ++++++++++++++++++ build-wallpaper.sh | 3 +- 8 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 Resources/MenuBarIcon.pdf create mode 100644 Resources/WallpaperIcon.icns create mode 100644 Resources/WallpaperIcon.png create mode 100644 Tools/GenerateWallpaperIcons.swift diff --git a/Resources/MenuBarIcon.pdf b/Resources/MenuBarIcon.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5c15d28e5d84f043da0ed28e223f88f4015bf17a GIT binary patch literal 5027 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 literal 0 HcmV?d00001 diff --git a/Resources/Wallpaper-Info.plist b/Resources/Wallpaper-Info.plist index 81f1fed..f0f252e 100644 --- a/Resources/Wallpaper-Info.plist +++ b/Resources/Wallpaper-Info.plist @@ -8,6 +8,8 @@ dev.patsch.MatrixWallpaper CFBundleName Matrix Wallpaper + CFBundleIconFile + WallpaperIcon CFBundlePackageType APPL CFBundleShortVersionString diff --git a/Resources/WallpaperIcon.icns b/Resources/WallpaperIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..c9753fa9ac2faf01c32c65be799ba875872a8d8b GIT binary patch literal 505994 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 z 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 )Rlwp zLs07rJPsnn{`6dowJ<7k{akAeO?FqRaR)RK1Oz@kk(T7%rJY%CTdx_5$$sojoEc-M zIg2~mnu0fh>T1}uWj-t7+$E4DyDQp^u$YR!zMc{gQI@B>h*Gja_L8DMw zEK~$F^Qhlir%`P-kGnB`!3qe!yzeFI9qk>&%1zv;_tKTix@Tlzsgn1rhh*+<3tuGI z&2~G@MvYg^G*srZYU4J2ct!a9peXm!J(zcXr%voxShA3zx1}<^;j1WZ*wjEbEqwfh zJ9bSJ)wqs#q2k^mpn7Ot-3}Uh4Lfn>^Yj9CU7N?Q)sW$!XY8_D*n6D6H8!%?g#5 zM@6hRtgkuv;8`C8y52g|0RBKA$j7aJ@9U?TpZqZXr72?$*1}mhkB2nYj(^AknUnGz zn3N9YO6Lj4>r&sjy&r=;Y4;-SfG~}qSB1%NQc-$VT9W+3@AeoshY{lMH|~5*m%HbJ zR>eD7al)y0t3jQrT3y$~@=tE&4zE@6ESxQI{2Z};L;mif?567v@^5xg^PRFEcI>mv z3mB;&Tw()D%Z=Xhb5O}O^Ih*snDUL_jrqszheqM!81(ayX~g^9*v&bvy0X)Tf-3oF zzC@OimVJr$&5vF*0a6F0W2~jyrBL6LI_$-kExPTzzj14wNx~K!Nl!SXcWcU*&W;22 z%)OQ-kFYzTb9YxKt5Bfj^!eFDoube54D-0URTR9S8jCmhoL4CNC#c6A+nIqIe(d?_%fZ}zcRco$u?vInV` z4ZPrg0*!&J5+g!S6N4LFOB(Q$Wmh*g%BHC;8 zMzrdMARc{q8(qnmu>j!0+xX+AXatPU3hn>4Vq;k~ zkKVSL8hSb-;J-oQh_5HAdx~6 zrsT5DYcyw4Poz98= zA#?f9lV?A80k3o_uDSn6?7q` z5a$cp7+6s>92y_QY~(R0h)uWZdeonaSM-BddLe(5f)xISvl07 z=y816YP&V2>GE4IBb4&vhw^?Q;=&bz@ud6~$Qzc45Pf<1t2c=6ozTz#@eUnCTxG<;m+Di$uzd40uNN`YNT{n?sEY2# z&M^4e!Z}No(1M@|@_4paXWN4YaO)Go0?88Gfmq1*qgo4AS7mRK&B#~FN2jlc=CTOT z2Hj0A!HP@1i?a=z^(MQtRa!KGeQkbSm&!h0c4#r!&xKs?))pbJ>SMHSjIqOBVvdol zuSgBTzOeiVi@O3upLiDdE=sAfcs2pxVNsBfb6mMw%MPpK?FWMG9y%G{ir-4s<0 z^}Mw!$)BZuL$yrz2+L}WK3$;5>S)Wu#GPh-wTU1>h2yPZ)gB`^7br3 zwX8BGX~8JZ{^K;0Na$Dil3-q~#G)S2#SJYm(pue`HfEhrrOD3Pmz>$9_PTWzosnO# zv$-4iZjB~#rS>BGP(s{Y95kU;)>HQ2Xs)O+ys$~@wPrI>HW;>00rUX_)l z&W)kufcMJ0cvtew`PA+6^1WhvL3GjYlRWzX+314cP`+Ckh6!xQxMuqb!19FsrzK0x z!gLj)=4Nl1uW7Ir(45#5-NoTU59ULSCY@uc1zHe=PNQb_I(_&guko?7Xvj>G$(g?V0&_S|Nk%jlmMYw{*A2`^s=rn0x%y<)mJLj zN;Z)$_RpRJ0H6Xz19c@@Y+O77LLwq!A|gTpd^}uiTzmp`Kg@}ka4?>qIsqQ0Ha8ZH zolAg6pdOFLQpYFs!(@JhgaMcgOhg36WP!y0@9cl-0*MLy|ECGQ@BiF@rxuUKRwuy4 z$DpIbpu=>e=Ib8-1_uQA{?`vSh7f#$2tphJ3>i4s-2f1Wopb~MKpO+VWi!JE04P;4 zB^)vW005r=4S)ht(F8n9%&hFJtjr8Nk!T`HQgTWvYHBJ`Y41W4zf7aILHmx+2 z%xE+d9Vw++qc`IdMr~y(a!iM8#AFoIkLc)V9#N5#@`R(Y$%skGDZ(kS$jL}3BhdtG zbPSBl%#4h5Pg2p;3Wl17I%;Z$YHB)$3Yvxrm_$SnMTAR0gsIRp498)^#l^$J#l^wF z!+=CM7~bJy7>Aia93llB0vxgWKTV#@dcV5|!O`@bfbF9YTa0ALjX0a%zE z_}{f6(Eq9h0gABxpYneViI5G^|I1e~7Mm1CcKxOvKCm9#+V`eD`K7z_Qb|Y_tH~7C9aXI9->r!^;aWwI!#o zM=f*L-gjx2#23VjyjZXj3Hi)Mag5$dnDS|Pl)6j^AUM4s5oRuD#`X}hAZL8Beja;B z5ri9r>v>Mxt~-dvT6{REyC3iHyqu&jcJ|I%y6a45k; zZKJqz@DeZIzgpegh)#fn2SoSLeIOw!V=)^UIQBoo#SFM=2*5)2lN?Fv0So10m^_dP z#=Ql>4_n%tCvtxv&VPj_HwsM-IH5W&FeG0PTf`6}Qo62P?_w7_t(T@3gIc!!V~7?c z@~@2CAll3WUEE0PdQj?Agh_A_C-~eA^6DQK|@7O|q(@P!>NHW^lu=;y$0Vd#n{5)i@tOZ!$hu{l|%FKU^dj z9yWE=^y_{xL++#7EV2{OEW>?q<2n-d<*1_JG%@&pQCm)o(27QH7AFa^uDn4sN&aY6Csj!!^%?;_m(Q$Jk`%|nCuD>b6CFo z`Co9AEY^Q1iwjG>Difi@4YB!_MKq=m2J(&=HZqji*j3H;n!5sd{9gnwAJfC{%VA|l z5D)pXh=FgZ^lTM`HUG2mV8jDS*Yscr9wd7 zL*Gj2Q}9Bx`UA9}vz4eaVte!byx_C99Y6k)i+p;piqUHFhD#UJ`2fcA?MdDb4D#}k zL%M6svx>&j_HD-lWLDRAwop=Mp1HvZF7_J`<^<>a)v+xm`;g8e1`}EvbrC^i5Z=`< z3i_W}`>I1eZyxCf9|yDS(Mveu(n-@R(`yAwVmQ$OKTRLu2N(W8@>d<3Tj|2I} z|5klF-;0+v=rR{pTuYFGeyV0JbAn^jBYpZ&1|G1$$oZzXLvnpAC%?izD&1QznqV`Q zTl6io#7PYeBq#p(_Vpo$=(DWQx6kWeFk9afNBTjyuQGsKXxO)--{n8x{t3a|C1(vf zN3ar(;3zT3>@{lpuhVw+sZfxee3<_(2cvJd_rKxWzo)yRe;Y7U$%%yuL1ekyIc1e9 z8aFWAyM^z{`-WMvbt*6UKnBs->ArGe8$qMD%3!WLf9XE7i2c%LT}Y;w^hB9ceC_D& z8=rug1rH1&ZmfU`UUWg@+VquZR=KHh4JStCJAJPTNA7bQn0A+_i4O+_ck}sWD3m75 zmov>(C;mKypmxZT)1lXTYnI@_mFWG(f{240;K1_4+|{SXhZ036nL!Mafxh7*FSomx z`ZnpCCtil!hP^y znhjlqz=N1qU7$aN0HhN_y+`ts1I7j^uj9aD?`8?Qsg~G0d@OUAH(*4$_Q#t6{igQj z39u34@!j7mpM$P!Lx}IZS5`&6J46sUQhCtHtI)ZFpRdB6W9R~>A5Tl?<38yO9-6gR_2(AhC1r&>PDA*cMsY_FM&2l0d_U~<~oRQ@7*~R$%)c8J= zY2}pPN0K;}OQcQG)0UlXK79zEql7Gvl>GNj>+#cC6J1B?Ksi!48U7_LmT}&BC%`1_ zi6ZjHns`-IwF;B3jocFqD(53?hvm;=&Bv0hA|6hWzh|=Ew?*!3F1=5pZxSsCuMVai z7aME{p=qsHaf+V{4Z;-+z?D<~eP`)$&ledy{+fm1>WPLUWNSD07n4`5-&iFJWn#RO zwJFf_e#=fLRO`reI)&5vVB$PV(hWlAtb;Pleo^#J4^JUK=HGY@+ye76dCPpMi)XdC=iGkN;EMsiJ#V$=2zrAkJ zzZy618|7pDDwArGeOHIWtYzIc3U`~YXLJus-^~tt7Or*12W6oJbD{Rus02}8R?F!a zEMDLKw?-QN`q!mA>vP}8anbhi4{c&kF`kLZ+}iTOX1tC}m&7Gc66!|>T;z1! zQI=OT_RG9`i}BvHo^uWz(_Rz6ql8?`fSEL(9Qj1utCNt4u9=Z8Xhln5RTY|deW#u2 z#P^5`@rV{}-hh6uE+1pB?eAuv=M-u6BPx4!=VMf1Q|Ogt^Wnkm_)Fi)%z(!t7)`wG zu*I^f=H4tcMbe3=Eib;KrZU_;S|V}6D76~%rzJuUjxf7jU%b5o{N_DSR!k?4xBh-~ zx%AK1H6?AoLHJ6CQOk$sQVVz6A(mI9ae~y@I+$ZJ-v93SSHOyZ&_br2;JW0m{6@=x zPgxm1|M~EAO8NgcXO3{8ikUSZPIJf?wHo>Y-8Yw|#CL=Z|C}0D!v4-Oag4gzALeRj zZH(;)^ndP^c9HgIOCr_V15OV3T3JZ1Gf71V^~)MDvivq^cNMSyDA*8O8XSue{aRvF z{NkOfhgXZ;k({Y7RJO06vY3`Ud*VJ!X~`|cYA&$8eHP76b!BkaVv;z|M4y{zk2H{3 z%G#^WzT+A$&2HoBEzS0o^OgFSmstCO1f`_ByYXw%(q|&dBeZQ<)caBd!S&*1y5aH~ z`02v~X;&FmSjoK5N}T$}xYTgVZNozwSAQv;Z_viC+O7tZgT@O33AL2;)1Af|L41+KcwyEC?0Wto(!+`WpbG-3+makJ{P0)Z)MlH#&;Li zHt13v8FLJN-(B+Do%Wp1YFyLkwSKtG)f@UHL#bM_1TgeMI&y#{I_Lq8o#CubL|RU z8$89{VM?g&UD1Rmh2d8Me{Kc#T0(A@Zaa7KIQD<3 zjSg^{a+d6_@mZQQ=X_gT>$_!dQjzgn*hbNalSPEX=6F?SW`VYG7hrqUy9Tc%TRS0V zT;{2KC$<4M;`TzL0W@M9>zr<`9Ra3&X79q)2Rd zXF12fm~F0VRyU`#!$O>7USxNz@7p_fg0%Q8IVlpm?U#&+-TkznIf}M@IgX*Tx;f>{ zu{lPj3$7V*t@u6N?pht|tvr~^*{^;}Dft*}{Pn=ws@$$G0siMY%YWgdXZp|qWgots zP;=v3-z~XOG~#4(&h=y*dfU)XY)Q^I+L*ECO~Wq1K5cyCGM)3u{&Re8M~-ElMz(&f zPnL5VvYvQZ4!*?RrMC@AsqGrYn)f1Z+3jPysq<;s)a|r9N7rEH{H}`5IX1oQ?RGnN z(aU}ev@f^+^0fD%(z4s`g+NZn?N*+z1O7MK`1;>z%2~3y&*zZAyp5H8w`?f|OSnb- z3SS^wbvBAdjHtQJR83{)e5$cwcHMQfch|VK_!g7x6Fv!voy5zrCYU57cH$dt%f`93 z0%}UGGn<-F*%bUf`bJzQ?rRiaMw5=bK>nY5S*B_4SrW`|VU-q=V%LAo$(?)0IQB zx(~lJfVX~Ia-+!NginImT&HzpY{DlYvFk9|p^57=(?G1QG`F!TXPBisU_;xxk1aVV z5Hs0^=k4W@!G5woxV9IL4pRnM{7d)7D? z*$*zVu1!9k5X-v&zqV0bZ|-(`0`PZrIzRcOr}WUlU>|;IlAH6(y4G)EOBu*GV`g>o z$#!GVRek2AoW;!OTYu!LD|ljUZ3SoiA}xk3{}NMSqCWd?$pyD{JTv~;m!MldrLMp= zc61c`1Rt7lC-|f+;Q+PR(9I}kRFgWcqQEho^0*w|^dfV_InUdL)?M;?5ywp(7hjkU zc^}|=F23qpQ{$~k^Q}477pmH~X*30a;mtw?Ngo~ z2YRWtU!SV4r*u304#3yx6rOhSKeUhR8&uW~5N(|7mu(Y135l(TV4W!j$DQbk2e#JU z>g)%tTk#8Q*6-u9-%9=_xP5VD4_uBp=QCp$Y;$*3d_u=g#rbd>LKl{e%{nl_n~{*% zDW43mNu2Nz@C>^g?+or2=5ow-I*+F3If#1R6)f}TiFqF1+=k4bE2f-}k*l^1#Jt$T z9Kl?1Ta=4W@2yGe!>ab3+IYNk+Hy!ncVW3O=gOSA)n(sooA5>0rL%1=o^7ND+tl?R|~oA5>0rL)cPkgKjV9$ReLRzSP(xVLu8HKr6f zcD3Vc+ZpNHlYmus{kiUR47F`;PqB$?+S=j^HZbf|h(q!51s|GuUA71B01^@#5w_%3 zG2;`CX*c7Ntha_eMw^J??a-s}xiUS}AH3^6B|S^KqHSu_F^=u5_1ll!TwGzUV9vPq zbbJ4YBMzuZACy-fF;^ny3TUX^$an|p$EykURQ&f|7 zyPk++K;vt*+hO@Uw7sjycRSd!-8Sn?sej3~r7uqQt<+4a)2cQ`t}l3YD#iz&gv9Q| zg|X~fpKOEQXK(SRlF!>0&g!50>mkQ>*7^>q<528b&!zk2Mb+ne&e~r4ucy2N@R+uz z*SlOjzPtL@TszKE$6TCN zm*cuywU|TX9M67h;^us~FWP?>b$x5<*cIpWHs%cGj_*5tRkyB&+hGClHMcIk3pM*9 zSTN73_xa=tGGjCEz}7)CU+q#lo-siUE`C{OQ>9{vQRNam$IbOs-i)Yyt!m|cdfPpD zBhL*yPdCaCRT+LZd5}YHb@d*>4K%rmR-hYeV!te-i!EXBvv0LWgmwA?oy4d*Gor2oRjEE%&&PTY@t{@Z64v@Uxl3=p+KQ89 zL~n%2`jF>zjsZZWh_k+7Z}4+E$H=ze*_DzpsN7cDLzjgGzKyd0JF5E7zHl&prNc^C z9Qz^Iqb6%lutUz@TI^h3+SQD;aoZSY^=soS%X}q}mjQo!8FIBPr=J*aZGOH|)nEN% zJY?|5*vxYtkgfA1ZaFUsGOoTHmwfXAfw)yJ!D=jwDtRK$a*NA0w+kI*OKucv27`8B zLSA}0;K`mg`UwG5Mm=J%-ys??kuhj9#yDw1kBqGzNB~Be81}1F%o;r*U8=7XHGGK! z#`cy+zAA-dIHVkcZ~N(7J!|8w#pOEI)SvPD_~@H^Ky5qSZ|2-Gb|yZ)?kRaroLSFDR}pleX;kQ+kJN8AFHmmt!wITeGZp@RxYnO z-0f<3tnIQ_<7lR>?4Bz%D2#jgHu1N_HTKLCxT+VqNt^DGYKhcB4(USqE;yBd8b$ zpY6z3p_Ic|Y%00fRrZ)8Cp-Q31(5R!$gV1O+IGcmx<`$ZbCS=$0XgPe4BO{yHAVr= z#jlvc?22RT#Zl&xZ@jqbF0Lk@wu`Ir;%a)cs(RIhRCh=gm$3N)%#CjGTXIsE&D3!{ zkyctNK?Z{l6F&uA#!c?#i`_o>c>_lYBBk}{;2jg5QsttsKESdgS6$0zgKU%;)nqbb zP{{*}`S$ML6SnaTSmCQF6Q$@YRsH^E&6e59e!P&eytKF?QN^7sb5Rb|}vH!|Bh-<&zF~yZj!<=x&$sC_h?_;_d&7DTicn2|G79&0(`H`%LuZ zusy+=wv)E?Q2b5JSGm~nXL5I(>R)`RHf+WtdrLZS6fYRSQ1GRAA!0o`+k$78O2#F1 zu#-Wg2-f+|9w559iSdN*#elI{A9!{u=)q7jkJ$?h#{d()Fe-VGU^!^9RUSsggJ-F_ z4#bYL3o~a69lKH--!jy7W!)UV7B}ZRr`vUITl_9;?mw*`@{;e8K74i%IjB&Qr$zO)x3l<>QY_}}+xF~>8F(!CGDsD>=>tKu?o%Mlj3?9$O5LA3j@QTSXhfX_mH?-wP|JXgzgX6ex2wpb*kBOQ(eS9}%3K90GFNikim{US!O!(Wv``{#;tKW9U?=(pgoE8d~8 z+A4O%Zn0}*&VO6lHnxy#-?9~B8`nN9p1QHk>BA;t8w>sAEX*n2dO4eR_Ez-;z}a(m zxTi0a!#&q~xDF2{m6i~mfWdidCwSz*X$J=07~*o$1 z9A68BkJz%u`v4L`UmREjz=m@$2r2|?WZHz9UFDG}NrzjD3*8JRR}pa*c5#deO#CD+ zc#Z8?gIf%c3~@|JUSgMUlfKb7FZwh%i%YQ%jYGVpSgvaqrM|WKovVj_luK@ZV;cL^ zOnr{K6l-l9+Ci)~j@x(0vD)W!^jaMk}ii<)<9<1YYSOj(=7C7ds)wzVxj z%h_k5R}f^|nY<`<0vC_1PU?jR1|~Kf5})yoV=T~!r5!Q6VW$|s#Jinab`&bv9DR916`YP9iIU3oz07z{7=;t+Cia}*VOBQC;Osf!bX>QPt<`0<4w3c!G|85?A1T> zwuw?4CwT30o3Mo*|BFtmpfwvnv?93S=E;Km?*82ic+Cij6HV-cT0g`bNt=Rc<-#GHTVOZ;7A z$#<8JZS8rUYhUgPxvuPMzX`Tfl69zvk$pqAgq6PaFVICoTMqSE40dJ%a|(0IzdUn< zOXzqV7XY7e3G;k0P2xg{jh%U@WK^D1vE`EO@G;>R%H!+sl>;^=w7?WQlcVihlfAI{ z8w6o56-Qg-h_C%I5u4(+niloAcqxLhh_;8bcSY&J!-Eu`<)cFmDn1qjP|eQNiH$pb z>cGaNT{mPLRj48s1u}w-#e-<%O*(v7Ab^XH0z~6o08y0aqg}zEEM-Ba+Bj}8!2=hT z7`RZ3iMXRG_6}KT@xy3cf{#84W7`te_RC0Vb6e(gVBD{apTo`SW|T83hux~D8qUGA zZFi{L7jm2ED=yjB_&Ka~bH4VgF~wvY`Z@p5%h39xzdVJxr7r+3&-s{b$>m%CxYN%z z`9Nj9P?ubnFtmfs6SL)@+S$e;fC(!W1KP#JZyh+>Oo^NI$YpULbxf+z*uWK?$h@v# z0uM;V@warNIpP>sRFeUPfyf(7OzfiQaAxv;Mr~%&hL5{<2`mKSvA=BSC-vis4nI+f zp9sXa9AX6^ot#));L8q7Ehv#qZ78x$wud}pWAH>x*}}+RyW<(t4!R}u7-(U?53|p{ z5H{5K?kh_e@|;T}R@0om^#$DGS~)O{vJp3RE*WO(sZQr$IKM9KvH6_mCe7iEBM#UJ zrUakpO2A!y#ch_*&g^SYTetNWOPO2#?!{Jl+S>XPfYavp^wG=pwzDEI`A(XPEOgRW zUK5!92abvFP6<#i6fEBXNF^2r3W7)s`%+KDE;_JGj$ubo34FE}pJ+?r!8x{65j14j zP=u;3EPzmK8>Q{Rgu#jdCQ~N&c=1olnEbVaGNC`Ix?=K|;z@0^;VEu&Cd5+rpmwthY}DxMVxp zHdoqnzldv`TR+UL@0Q#u=6q%_bFtCovf!2>i@eVtfHuy=mW=L$NmVC$=cdI>VwKiR zbP8sl+?EMu#xJmqZ-HF`ayf4<&ykqxwg7mEa`D`A<_q(X7UJg%7{8E{4qKg6 zrH5ytzf*c9cqlTH`d!+f-mt+_ti#`Y=(VGcS`U1|K*I(#FNPQ{Td`!wK7qxD0Bedy z9|jvf3&jNr~f8sbK^DaQNLq2sOP=|nw zpR*K>dtaG@w0^OEE_{oS<2#LXy&=AXTE|m@!uuN77GD*blP|tfKLC1J2itz4Biv9Ww#;pVDQBW zUR%|NW|Yyp-GR@td4U2aIpRs6PM6Gs%Y%{mO2sf41ByF*WNrE%lRgUpCV%LML_b7b z$g)#6HVXAH*|QM9mqPpfEdc;=_h0mGBiQ;e070trZa(}3iHaqJocyy4PoX^wroh;l z53E%7*)`xg1|e=`iDPIQK-=2Vs}E*|xRz zixjo$3b^&%Ww(uRxKCs$9Lv>hVHzLfE+=J{Kd=-?Y}$dfPt{{bkG=5KW}WmdK3>aE1|bF}4^HM|(wE@J{7mGY_@5BZW5D<&@P=Xc(B#b(snCzv9zb_zlED8VzNHp=ZzxpP9#>k`kfW^nL za!6pddmxVZ2I0GL1wN6pt@UfM;oR)9e`DGb!R{*i?DlPOTXLgl#5jJ(f<|tOVhh_S z8gXZ=Tu0Q?D$XeT)aG^*s-FK8w_=N~%H=>>pKM>W?TLk%@QyVnqnj(O-yG(&I_8+~ zK5Z2j7yY^|06yX3Qg@4LYA@V@!T8bw&CVwXWdresYupx`alK}Bd?o9qX zEr>WJrqmPJby=V5wJmhTFY7$n%T(V(AP$X>c(A2jD8;dYFS7+f7EWGReAZp)$g*8gJU zYcZCwN2?{3LrLTBwfgE+>W%H+(%T<`wN z4s%B${+U zFlP)gLRa)2aE+^WDa<=g(4xovGL?EvsZr!Fmqy&=L7-z{bDZd>J_A16avQ97%!#Z@mayP2f9VT=OL~r2%)I21w(Zt5 z%NMk3_uz%TZerrIf9c{00296@JtqGLl+suTl*IrG0G<%U#{k7oVhj#J3m>tyn@seQ z(R)&Fd1Trb)Vu`ZQfza5S!Wx*E}4&@WfX#VKw{EoFhYip&;3Pt?9U^A762d6Gk!02 z92=jQ^VJx5@)j=-N-1${bTH%b*e{Mvdfpj`#ejI?kdqh`0TjR7=E~35fuqith=ooi z&bdG}tm`T^usLivHM`bM%v=ZX7Sn{-X~*~2CC7{$qzbYPb(S-Bl|IFdSjj1|fokOz z--KH9F)p7|>oWB@%Jo*C0z}To?EZi`YzYUO&pmN#JPB=m)s}F(VuWo67CXhq)`qmH@o)a}cMiYs zPkw3~;27kdQa8i=jK% zh;@(!Y#&v z)=*^IeEl!LR;%0k_QgLY{xy$%?C=Zsy-5?eW^g|#h<66GXo{ct)zbnBKO)2|j~EB; zR)$eKwF-Yf1!16sM;9fxy43;LVF%9nuLHNS#V-%a#Hn)fi5SASvD_3w?JBv-eYjor zY$Ik{+I~KV!DkmP`()fIeQD65U(?`>i*_~k(5d2F_Y7pUs`i28QO{}7wHTj!%*F;U zfp(#zOn3>kAIVlROZo*&8y7hj^5=T8{?_r2sp@y!y6TTt^L1JPy!d!&xulWWfn=_k zEk@T)E!l=1IVij~=C61cK!TnGe8ZRj$HgGBRk+%5@>SmgY=fSqwDHdyuWdsczqN1b zd+Lindi*GaNuQ4g_$VYkE?@zm+5Tw~C)+d3{N{bTFG^LRw=NVY%jB=RjXMN`BkF9_7H~MBNoUeS& z+y?reeer=0T9iwD!Twuz`MDm)q6rgz0Rt`<>ToRUbDXS$r`@M3FFsx9i;aAp768w= z*wkH<+I*pKF-0-+jOI2zK_3CW)@&WIcIJBHGxw2VGrz%)n#~B~kqYXviMP3et;63w z;L$rKGR4@;kGlExZCVrV$v@*G2fX}vmnQ$aHQD>?kasC|d=x-C7+`%YX`<&7Lk2FM ztkgD(=PQQ{YW`*bzaGf(K*0O24o;5IF@&l5Io*Pt*e)|GI3N%XUV@?^=mB&N@4$Wp|& zO(cX(6ulRvUI+x%@rZ+8@j-1nl#=bOF6`P_kG!wscJISpto_=|HP>kY@W{pXflFFj zT%cSzsWf6(@`VV`+{J~@R(=TQDP660_0;PrE=3O(oG~cO8}HZgpp$JW-7WfV5r++^Hku2ZDGCz#@Pn<{bck zCD4yy`KW;RE5a^9iNRUA_(|bnW5Q<<5TOdcb`gLN4Te%OA97X{-q>)M+1X`wP!~S? z8#5E;%qr?{3-#=_T7ehHj*hFkH4gdJMqdLfW)GOu0)I9~P%Ub|8);-pY_Tssr(tq`uw zTyvck0FT~^o^U1WEZ14Ybo$29~z$4SK^+2 z{K?^&C;Z5JaupLuTMiyItlZfbN^$J7#v7w7@7LG&bfK>QezCTo5IncoHADM0*2 zfa37Sf#R{F57Yp>t}T($icP}6jI~E zTQ54%XIt^HU1IeMp530px$*e{8s}00ts}Piyclqw#V0TYM7uK%8wE4A+*iUctlKu! z#urGCIiJ94=XPfN<>9Z*Tyvck0M}+!c9eeZL5GW!3p^Ked>-whIVs+7=MUm=$I6Rt zn)JW_mw$46`HkNL_;79I7Xj~(eBX0FY`Fi!9~|y`=z-z>2ksm0zyJQ>zPs-o?q|E} zZvB4Hy~BMs?;7sEA^zq)!+pbD`c8rP8`41~L+^>N)Vd*=dUSBx84;`lXMVJAKT#;- zR1G=BZ>+>^rD^nU|B(I!_z(QLCVl0{UzOyp{%-lkuLp{cJQItpJPk0G{m_8N2t=~rA2^a0IT^};!7;d)SF8loF}|MV6!g!Wqu7N<9G3KJUal{ zKH-aybq+)OT+CW$8N2z`W_@6aVBH)x+pr^ha}3K+imyq_qjuc8j;w3>+6Rll*S*g- zeapOkncykZ8T~9I?WD)F?`Z&a;tSU84qigG$y|%^C^BCGi8-%5g*qa8ZRVQmv;cV4 z5l`^-2$e5Nj))7gUZrB=uD|HH_<8gnlfS;-&S%$5RJgGD?RR|!{*;~u{LvqLaQLG; z-aTUIMf|u;_$Us8Rs0n}>0`nxIwm+aCO4>Xciy9gfff=EJ^aw{&;t(+A9mmU!^8JH zI6V8#2Zl%PcyRcL8xIc8zwz+!QNzPpD&Q!;D2!(C(6MYD_>WCSOVcUi0%4@c<3|op z2i@2=9~uzZ*?NYFmWiKyaOWS308#!x5XZ?!0FhhTS89xJ1Rx5-T|UQ4d&zNuM7~gS z=bv09jpqhR{&1LE1Yn9%Fp&=jw+?`L)2tJ})}?W)VbRZ(T-}^~PKQrh)=YkL7{|)C zR%e+y%^P3k(x5H90m+y1NbzJIymmliD?Sj;ZH`$?6CM7o9$j1Le=*?;?DNU>?MWCs zbzwsv{i*~BU-51`eGRO?IS?>>cbuzKKss>4=)^^tzbTw&3K}yQLw;o5To9EPxVXh3>XL1(U-PCbrA7$$WTS+J%IRA z!m@FfAA_!Hjz|C0E**;_C<7?IeD<%@j*AAc(lhvxYY)sc9+`p;Og$ou#it%&(HT=* zao<~T#m@u0`RuqfIJ?>iQDRK|BplL~>^sLtTZ zY2^}+*s&Fv7@U6B$+^VU80?m93thq44y8EGD2;pf4XASsB`!O7`X!9(vM%}-7%AA) zHKV;j)o>O8_<*NwFjd~8mwDT##K7j_c$Qnb&)(usFJGIv<~l6^?mqo_za}+sF}rY~ z-+@9KeEcCCjC`IgT`UeX5HQj42t4k9MLjuBCTm@(3@B`Mk{9m<02G^P#7H{y)M5Wv zWT;-fX!oSr^_GA0w&5*zzhijA-9IwC>fMhH&wl-H4o~Z81cf7zcTnW>7RQ1<^|}`f z!=vK7u!&ssG%~2IRcKh zSP;nOqvgrOy2AZC^*qAH#+@oQ7636J3(Euu9}}YNbz&6HfWbt@ z#vl?ncnO~H!=7*L#WAQ&EL3PK$4C2k3J?RX;`rMDQrE|_B!h(j zct%pbJrM5&2v61Vn*!3u1cD>VQheN11tUx=2V6?d+b)~qni@;B6y(gKvkXsZF|B<> zZT1i6^utcusk>8zYK7FxlSl z5;yH7$Xt=0bIv*N28?Uj=Y_th|6|{<9z|(Si~|z6PQgw}sn_39sSPT1Vx}HX-c?@E z=h!WF&X#rXuBX*soP2HOn(MRxxHYS?==c}c^H$Xq6F|9W=h}ykVjI^xlMEAC+*LC9 z^DJKmu`yBc`}cQ9_T+z4hIk`h_1rA_n8?L@VGxtPWCppq5P;W~7XjEpr}~))xjRPY zX@e(!scL(Pr_bNt@w@LD-uTcj4zIiUiPZ#*B1F|8qqh#Z{o3I;I)YGpRYv^yRzbw1 z&SQf#i;b0WS^m1R$4&pxG}QqV5vMdh0A_N}PSg z7(**9%%WTZukqi7A%1MywLIq$T~HVm&LJ$Dc?2+Y2kOEW8@p0$OQ*`F@%#zv^9Y8G zZpapT1t3QJ{zTGYi;11O#N!7LJ$(+jnCirvW&30uzEvK>&iY2XsIMvHptU)kp>r79 zPET*mTyuisx=srKW~{4Ue8C;#NOr}-78hB$*qD@3}tCxiUTi}X~iI1^)@q~bh9@zsPKaj)V#=!EVD1N+S;K%#Kz)tVutT8At@y9|yJd{b(k1Pcl+a!Wt zJS7lSoFDzew+vtOtdAeZpj{HcGcj1W?^+ua%CvDeeIgU+o zJVKS7f>Ye#a~wLRxEmw4MJ8|gV*nf&)b>3IAjf_p5WM0Rr>gRgDI?xJA#73#<(i{@KQ#>2O`Di@&r=k!%qm?{%D>0rHaJ}7hnFuoq< z=&TNB`4Oht(W$u3QJU_f-$})}ri*b};c16uX!INUpKReHCD%PRoTw8__=$(2*Z+;J zU_?S6?JAh8i+*QJp(3-T`pHUNhZg%E>UVbh^_XjP{MTs#aQ4%A9X;a$ zGJG8XY%3H!0|FpFo(>)-6$Xl!^wj^c2QPfw-3sG7f8Y!rOytxVcf8{H-F#1)G4Ke; zU4A?=$B7D%6E95+e$>IF$%2AOG9J4>GraTNzdii@um9V_(;vimn)1}^UN{UdQoZ$~ z4%Huv6}26J4%)Y_y@k>n^kF5l!t#KZUd@K^}Yl2xQ#P zAj4M%KPtzcfz5-B*pU~8rw!<1AWS?l7?6S%JaTMQ`^@l#|MS-l&mW#u$1I`5kMH?I z$0DDEm`WRq(Zwmq8=iXeF#PL@oa=eg5Mbg&+y5M|_R1L&3?3S*?z-Am6isM#UI{OEe zFXw(&@qoVzGiQsslOc{H$*{)QR%u}@2e$ZHH|M*h6S(5-pLCoKiYI%p(RamQt8&p} zn=Am59$WSex!6S_7VRS@1|Lw344wE(;Q<8SuqTS5+6&Lc&!E8o!eA0qBL#8c8Q|c3b;I7|X#px4%Z5OKFU2av zz`_)}>qB30Vl0dP{_uhLoq%cXUMF90huwr-anfwXtJWmz_ zGDVS{dP@5%KF$GpierpY-BT^aFnIi;K7>@P$H(~012rbO?PQ~k3E}pj%6x)svBnXr z@&)DiS-+)g{Ib3J6$TQMcc#=OLrmn*Vl!nihacydjriCmajc6baGXIs&8!86t{2*kipV$~SnijU(H51xy^ z4s;5lc``QcZeyU6Oze=cXFWW2Q84fxB&8ZFC`9smpZOEL6UgY63&3(5p*9blE6aEm z6LBm|+VKa0G{W*yBm-^aLNq1;DG0+xiAflp{J}DiJ|Tu=p^SwK;#t=3BbAd zaG1oi8oej`fXGHE@L=Nnj_N8`48Y=p6Id5=UfUtoP*dZeb2{5S5m;WLQQwj=>5ZdK zN~LDdWj;_FolQ{Vs!mMh8@u(M@bNY8z6!>A&QWaO#QP&8W24W@01cdWJXxB<(kT58 zo5-e-VmW0ziGniea}NE)jQ3@@j-m8Fp58?tQZO*NZ%G>O?1gcC^etf2&2hOep`&CS zAltEpU(q4EWS=<pjg%j+b{*o6C!^f#I9?Rd&09q!04*sSZ#6}*7|Nh${XJ%ASbB27{E6as+T7S40t*3@D!<|1Z5{ZSSXOJ zuQDD5V;VN=Mt4wAJlNV?shBwb28!C2RCS`ry39v=vqC&^TrzK6ruNUc310;3pxI}_ zm%!+j@V*O=IKczh+s*u50JCU7dyBT zx>9s)F{agLc?~AxJHImnbhlovO9r^`JdpXAtn>8_MVFrfR32N}h*7aJ#N)tFYFDnr zh|g$-qjU^3u}Q~d$7Iid7Lzuj+KE-sD#yuG8p>sZ2H{na5r5H+ojR$X;^WnNeFM<9X zlel>LJecUe@{2wrIVOEkK2~yHpIj?oi6abgsYL&48{+zuOg~^_A;82R3jpyvaf*!v zDZbkH3F~+aAUh={esrZThSH)ikqc4az#?D87i{P;6b!l|24xrHM8Sr=(GfHEE&GF| zwDPF!`*UWXF96P&z}4=)cv^?JFzDUqD08v*>0;pEqEo$b;gu^a76Vdd8moV>(tE;T zf(eZD@Vo%W0LCB_kI6;#^S$F|=IF4CGMM=ZfCsi16lDwF62k+eDZe?uOLuGxkP(Y` zH-g21596!Z_Ig>u$P>AExAdAdj3yk)OkHJz; z2Z~$x!iOxop9X}i_;J@JJ0AxGPCM$NkbgnO0b4wF56&E$Cw&Y)EK_60ii#ur_i)&$G z;uno;SMm8)4!*Q0bgF}o3D9vYQ1l!N*Lq;kX=6u!3?4f=mDX1E1#gV?;gojxXB)>H z<5R+P_GlUC3xK1g@)8B&0*VV!6y6iKo0#oc7kcgTB3|6{ zHvv$L{N|7UjETX*K~tcrqss6aNTmw|gR`M-cO0uQ{7NDNE{g#ER5E`i_zux{F9E0G z8+nr)`4ooYmjhWigiO6EVFn9>O?v!%E{PQr0vH@rifb^z7YqQf0Ti__vV9}K%r4>- zAIu(*9nLOu`W9pCJ{on-fZ`aWx7`$|c`)WfpX7-iql)piSq@vWBXi!tc|+#(u%QcC zj86A>_m3UfoAfMXk(v0pPUthfMxgh~&cZo#l6f)!-q(lQpipu0eEzuekGp?S7Lgy+ zMqm6B#kfxk9Mg=L^G04^-m2UNtxz(p}v>fk+RY;-w}{j7sBnZ!jbJ_Z6VNcgg4J7WZs zJsSgnzrrT|;@-X)3F!BWc5Cu}SNr1YQ(Wf7nl zzxSqJ9lrJN|F8m_rabkfFC2!~sy;?h@)hkb^)uMU-$@YVGggj~0hjjU!p4rAQX;pK zV*o}EFC`Qo?igdjmyUN1SQtRPP=Iom=5xT0Dus)5w9OU4QZMH#)944-REjC=RX|B8 zu`DK4n7vC?T4mRe=j;_Y!+_7Fm9q^#j=3l&d}~V>#{>_*PsTN4!$&*v?g`m<{h`w? z`nE8hxHE~~S_K>xUMZZ*($hmC#A7x9HHruF&QbLYG z+2iZ}X`czeIMH49IiIeZ%|KrO%%QF)$194Bv$AR2J)|CmRHKl4{US7XBssc!}ydEJL22V6FB>~9K(E-<0Hp{bVo zM~Zbs(j@*dR+YGt9{R|8h8KM2?!VB94~GDyn1}8w?;iem_^jbi1RLuf>qi=o1=;Ny z>CNHwZ~wvJU2lFzSjNSb2J*?^t6W9yp@K27*HU!6ti=<6psEGD>Kxwz5Q__gF%v_W zwBx)Xw1X*XN>K0x6OP3Y@dLHlm2fp)Ke>iB*T}}6G3ft5xBcJrU;MrCJTd9>l)x08w#9W# zgXwSBOS{|th3vjXzmse3K3JzRv4x|w*rJ~Fs}Z@`+lQP+f0e2F72YJmwm+W1rK~; zF}NZ?@X&F;k+4i3*>5AlZE-h#1h8n9!L`k|XP4)P5BCpjhm=3}*sF)vzvZ2y3pr!( z%cQ$5+rOR z3o457Q3)C;!bfb>TYSx9Yl{cu0|_!JptmliV-z(GLOe?d$P6I zEITGT^6Z$F^Id;T{sqUmL56zruT*;9{m0#YnfM>jP#oJ`!)JWa=M0~I$72c>i55M3 z;q91MT*Su%>T5h9pdWrndfF6EkZ7;!pdWIaJYgbv@SNi!j>lhQnKtdybgoKYNcAG~1K*GlG};#~5hZc!$>ii8nrac;scz8{YHQ-yZL}7=ZKL7rFDq&q2gQuMro@g`Eyxx+=a$@r1dHi$4O5%c#0|YalY}3Ne%@CfOw0cE4yL}X^zi2 z`z`5g-$n6ti8e~G&J=sgXW91b4{r=~NuKx=91~(Z0Z4w6MSucw?!YmjGQooPV|b`P z!s78hpYz9Ke+|Rj{c8bm$D{WSuf6Z(x?1SLxxaE!Xz+M)rV^I<{{J-B9d$7A`^7*$ zQu>hUXCV-6Ra^qHV4-kK^gnEIjmwCMjpK2@fl|Vao#djb{mQa&mcwUsseLgpB|dyF zC(l4%0GvFwF0^Y;eztTgwe6$LetIzS=iXA#I;&%;MkZv7yxwLhXOzAalnVg z0XRNyWN?6|J}9Ns{nUFNA720E-#qH-o&eyW6!XP*R35NDG~TK4+f9G*pZlocJufK( zZCwB;!B0y^4!Qbx7l4HTlLa~PfXhJZg+RP-A(>RgR&X&uiwA38SooOO085c|wgm-C z5rA{&5`D%p&f=?>u+c|kD3A@!n9<##S5e}*L|ZH*n)R6nf=rA_oTA5033~!qHmw*j zyOn(Z4zXpZ7nY{_vpq2k#nQdCx}Q!yi5Q`^pOo0VNU2-55V8y}HLGaN5K9fOOu~@7Tk`lD&h=UxoFxG+H7{~fUSJd!eDULBp+xxQ)^2D7h z)|-N9`7Ap|t7T-B$!ipark)BCT+y2kwg`E^C=YXLu znMc>k#${W^w0w?l9=fIw%Rb=Yb*%Lyxh_-2&KtvLz5G?f_x;|Fj*~ubXR~n^NZwd1 zku-gUTN7^B^~gz18YD(ZH%bl$sFbt;3P=k|cQZPLQ3_H65m1pvngJ36k!}%2NjIYx zAHVN?-+$q`?&rDAInTMzk>Bsb(sn+%< znggQfD>isp13M({v6mFf=&(9l#d^BUUHn0G{G?2-!X_MZsogZBF+i{HUu8T$f1_XF z4KC5Q7iF0x&6Qq7-OA0PeH`4Tmf)V-Lt1Tiap;LKknLR+6NzEJ@7EQrrA> zjNAiIQpQN%cFJJ+)B5}~n3k%QF^p(z3TS`xh|+3Lm&AE__LA`mNHnR4yB+mgjC!Uq zXy272&aMtAx*7ne>e)(v9C!g|fgTQ@(?BoRlu5;oxB*jup)n z1`J*nELSeSkl*Lz;^d-s*IF7P(ULi6r0W~emOt|<^y1W#dOJILZ+gEKTa#Wx<2Lv- z?!$<){K4&aXEqmW%CGKWN9zv2T!hi2^7yKGhkx0 z_9ufdJQCJM`h~{~F@_#J`vbK4`ebMAwp6;1?(*m2C^s?od!gj$pOmHld=S zLsjytTV8GEyajkIt8f1J^qnSd75xN@co5MylYSv5@a20ig9D`c_i2OhyDAN@QqqY` zLM(q-u(ZtHr0)*h)w2-N_cq`CkjMC1lxgC)pR3d5L@kyYp0BLGQ`Em1r6pkw8J{d% zCfa*N^ZNWTl2Ga8$fwBVuZuFx4{==6`s7>f6Z*5+4U|(U3VQX=czwZtK@ma#?Xwr) zx(~nw*qNZ;VLF3Ptd1j>2{+MDz))r>>Vp~f&`~HejzRwnd>a?uBH`|EQto>6p@ICy zvs>4+GN2Bzq=WxvAVuomHngUER7J3X3*LJ~`|8TfNn3CxO_C8THQLFq;n50yGbvI#Wa+&KB}Mvt=X=-^!!yYctoV|A)8)FQmp+!NpCpHU($;*g>4B3uNSbp- zPQopPPvWg~zuxcu!#fiz(meiDA<6MN@d&nmf}Z#L-gSfnUzt-2c&*>%Mf1&2EvZ-~EMbTDZ@2)OvV%n92{S+0SHogTJaTggH`Z;&t+ZQJn7Ja`yC z{`Mtkb$V=CS&P7T_n$anyERVmICs3%T5Svq@#+75QdmsNr1S*hG@K1r(g_JAws zmG<{by3>*^OE4hPFY(uR+D>g!^Sz;_97)Lfr|~}qk!v%jj>G=}4Mktm*|8aGi%g}I zrcJTT)n7`7F0s+yIWvs@GR0rfMs_)b$QnJ&2I+L=iz9*?8G@)YYj0AekhBFRL5FK@ zNeNKq+lPsR;PvIS=39F(lzW@^#RtcB_ls{EZGHg_$T~D_b{OOUe#`0KCd7-qAbj4z zvdtBG?;PY0LSSlOZ!fkGfhQLaKQAtb3LXJtpOzggu2v?t{Yo3bulDK<@DC(KWrv&H z3b&b%;F_XDsTBa7403?})zP-H?r$ybGr!Y*&J#=Bn`N?^P$d5BLxrsoueo$$MyQ^E z&J&Bbp>qX+7O7pR*NgQD%^-#&FFh1pa<5uVAdeb?=G7!F3%QMF&wy^cR4O3$5I?LJ zV?s4Yc+G>@4;IlH}A}JSIJ{R$`R*er*bG97bnSN8cf_<8|czbS~}j39kOMK1`2W zb>A#8MUeUxKq~dPmcyznsfAH1s{5L7i0fwG$9-L{3Y&El!EoL&Dnlfsvvx3q=kmHG zD{cyT``uhHAemcb06=c#$w8RQ#m8WnO+c&`4nlNjw;YgDB(#Xt-5nn-n5oWb?@79fLDd3(PiIS6=hm+hepj~mJDImf!Vf4i1%qH zLp@ed2?i_XoA#<*)4n7ahwd-0!_7WoEmUp!_?O=q>g;odL_M*b`5L6|oEm#kGPVfOJ?<0^+ym>A6gX^sW95g^p~U)v z;F#m0Ow(+A?r5Y|)*wB(O5j56gjUU)3ByBjat@gdz5oi0sUcqP3euc70Di?z6<&WU zU>G-YC+tiV-?;4f&o9yIq^LD++4p6HH{_d=7YoEy^Gu-c>U$Ck(OwxXU9;6T>rZi} z>mQZ>E$mssCjT2_b8{=%8V zM;zI@sOB$zQh#*OYWuV4O$z_T!=_S`aMu)h&? zrVXKkb#33AG?Z_cJ9qJ9{_R>(@lQH3>COrUJa)`3f2JLqil5CAwoHn}ufBF~ zsCftEAC{+_2vBdNh3SAD#~oMGpbSvhzA2VZ64$?6BF{DUhR^2i%zNGY%W3nrV9dI{ zmW%e=z5u*4J z$H$8F`cS;#{a(lCMo!9DP8QGVUg5@=h}=FV6G>f+-ukA>QTG##GEPGh;^MjZh}cN5 zEIh(L5&b@GPLaMOD}6KaFI^c9;?^DBlBJ2+aS1M z=wV6s{C-%g0O^mc0d7@Fquf9}4)iS}$PEuZ2Vm3rn#T#*X4@G|HeYh=nAw{#t1rpV z`URPi&U*|eR@w%oF&9i>8YN}75w>8?2SODfc4a1?C0>KHu_uZ1LYXQpCF!oljo}QI ze3HG2R*x=P1C@rj-(sh#PO%v1I4loT@;G z?ZM=~uNm=JIcGVS6zZj#Eo4ZUYyy=r? zk1-6W{u!|-T>;cnjmqqJtWP*OiZd58+b$HJ7s&$9yI>YE0dc5ksG!Nv~3t&yU{}%Ep>PH4K)!D>9Jg9 z6$aI-rW46Y1i`yt;z>9t_^@l)6?U22J%5q?xVMZ{$&|6ewz~1+?lnzV#;PdSEC;(Q zylo(AHE~rA;aYNcSo*z*PJgYsGqh9TN%&IFrIm=YG_87j>x%f)#A)4sipO02Ut0&x zkSEGbfE8QemgjPlS54OSNmS4Jnw%K9QPuD_7mP$9{k=r0a(?3<&lw^v{=T@`YLN1b z16g1dhLcYj#*>K2c|x-5J1=PEL&jdf_1Vq-^!2c^w^0YuabMSUY%|0fUT%-DIJrQB zEwtWr7qcf-OxJVuedJ1PL`z|}Wjmm4M?=t06zY3n8nTpDWYi)b!RIy+-K#Kx+?##A zUtk(u!K0dRdvY%?U~GugkZDrH%)VYn5924~K5Rt$GLI zRhY@gQ41Z6p668=PgPIgkHRku!-mS^;Di)7|8ZKPp_+cnimEK6C}}M#Y^_xerS0k| z_NN)wKmCtkHO67qM@&pcxS#QwtT@Q>)TupN#kGm)^wsaN{I(A_PK>}rNl!8h1!VTZ z@8_ud;EZ=dB+9hZq)_y^u`X_BYdH)~~Z_CfB1_i<`+gPWb+?EC!q%_EQzewr%Wn z+(%OP2LrIrA%?`;t+&$yDR09Gy&3MzO47^mGlZ)OfX}^{zX78S2BmXlfKB1i-{x`S zRFOIC;ZN;fKD<`o)DvrEChB{zL5Y`mT}R7a>)My|3GE<1%m}%pga+Jg?7Mx_dFdVC z1-@hfGayO#uR_nk9WQv;I3@jWEPMRis>DrpO@u%YsH*LfV3|z@SdP+IiiB?u|AB96A0Ej9)`*I&t^6o4xC4MW6qgo!Z{0H^rEI)h(ay7n;=s595l>ur1qy2-|0PJD} z;BGE3Kci`_ILH$W)JC8LA`hT{;#7g%ffIiN=^ zkV5JeKI*L<-R=3I6S@1& zpC6%W6yjzr-ht*zhc|OEEV?G}#9EZR$Xrw%!-Zwd2bZ%0OyPeAtG?BuRt;RSxSJ1^ z`0~lc!7d9kyF1+f0-sKz_;Tp;V^PQYIOOx^?&EI_Ke1n zk~^d(qU51fIx<`HEo`n_8850!HCQY7wOMM(Z|;af?`K-$a~AX|OQ`{dtZI_{`AOhf z0Tw7pl1X>J0HB@nDBLOZnvk+waDBkJh?~Lp9^&9oHk-FE*VZQ!D%$ooy^5Nh59KfW zx~xJ2e0me?PLDp_HTBfH%iFUd<6`2mV9YM3+xIRf8FXw?oSa`=If1Om3#}fL3|932 zk4yX&wz#E6z>w7e6cd$Zo&a}bAExZ+v^F*A&W|YyL;*-FmMBjjvHGu#OQ#mvMFNvR zifVCIdf3g>=J>HUTKU$?cG5;J4RPXgdr1sv?s!3>+9=8SI^<3JlrwV8yQGlFQJC~6 zi>~xRz{U?yx1`F6ayQ{*9kKYAr>~LC2hv8m>3+{6=D3k~g(7@AR_3EtSZ{{%T7PKT zPCm5Ol|v)#(Tc~4#UNMER!F7b)1XA_42^d=3^fhKaaB+CdNNXM{|XHq@cBuP$z}D# zQqH-`-)DYnS@K9eY2bo5e!v9M?7(x|AOG#1DsOo00JA@SWz`NKe6iml2!rA!B}u~m zmP6eFh8o+epH?TW@kc(v=FBQ~1Y$FeFW(c+gEh}{fW49MRgoH3D!NuyIo;Bw5PFhg z&JFpj#E&%&91v+CMbZ{AVBvv5+J8>AN6$eCTRVQkC=$pq#2o3II(OV)}*1g>>0lNe^YlOFafgmD@H zml3zt4GPde>vSH$wagese;kA?o`Xek|LU>qia)D89IGp+9lEWtSf}Ux;D3N^3df9k zJ8RxKpuuc_LjbS-m^$IU+*QNFP@OGg&Z%2)q`ukwUdBJg#bN1>g9$og{)DAEF80gP z17OSyxr7g~)DbEPHvaFXVv5jlvK$--+Zl#GWm!-SfYzczZmD(4DLl%kzZ8D^eZuy; z@bsJdPKNkoy9C}Yr45vT(hSnN!&;0FkhX#t+G(%*5wxiJdCR+}>;7m6s&mrE;+QR1|LWv($jxcoMIdb3_%|V`z3r{q5)y>KF2h9L%o#-i#x@ zv2xs6gRlrY{;(WJ7=h8Hj%`)9zr2k!qD-rx>Q(el@jbyS$F&mrPGSZ3$4C#dh%P@` zhcSdJYae&@^{hNf4MhJ#{nVxl)V*zJ*MoAz-|QjRnbCESF0c=##7sBDOQY4k#jDtf&8$}R)5WzL?DoE%YltthY~Nv# z2>5485FN>f!Y&f!39G$Onksd7TKQA1P9Sn06$i#gffIFau?bVW=~j+;)Se^Oo78|i z)$;wW0kAE$SM+H}8ux!!K07HBvNIr2bF4^XwO5;>;3z)n|J}^dwfp|*4psP*g4vLm zgKv)FZl>>CR&5iK?uoJ^D`X|4ES)@$n8jFEIVKc@819i2d6r6lTvfIsSshS4{1a%L zW@nn4oqa(`TcG*JfE~gbhPRY8RnTsbD7%OV(v3RB~$N4m-){ zkjAcz5OzGr9e-LACy<5P9!dcGGa;PI!-#)@9lN7V*OD2qJgu8;{Z7vA!B@Cn%M+@&n( z8jdt!_3ng(19o^mX^&^T?YfyFbMz+IC_y3(#G6UKQP|%*RC@S$bW}@hZ>6QOe}P)n zHBS+A6I%MWnbnd7#1ec*BA6V)z2WDT)d%=0 ztE>L^E>G1B?26gOyBG?vuN8fI1zpGt-&ONC7wdf?k^>C4?Q*5kB&!;4d%0Nb-oeW% z&m_G`KzLFy1#Fj)f|#B>Ek^cl_A{InK8h{739GO<=T$3nSgT;TW&RhJbiRRa8!_f0 zphp)7sKpcPxa@IPBjmI}>8pma>S7t#M00ID4JMRP1x^2Uz^)+3=kb>zx;7J0Z4)O< z7RLLye}l95-!2IPRPl#W)mGwS_;Rje!rP$`N_1nZPTABGgeNU=NPE9)y2T`g`tA4a zjf3gJc0#Wuf3MuSBDuDJ7rC0$^gm^oA!hc_0g$X{qIwYrZhKb=M2sf&MLWJwnE#v@ zP)f&OGbwAde(=KXgMWU3)&{YJTw9mX@2vP@nR-4dx0XV+4)tKbs}qAxOWj|OU!AQi zS3n7(t9*9MM1S>VKI-AUK7E@FqEs`8J}C}6X5DyT=EX!sGEos=d=zIwbCGtBV3M91+!96>Id5JjW4m-%bD0Z!D1%2>0>+`47<+z1n_~duUIANS_peQQl+z|G>0YZwo_EQ&b>f41{VO6#VLjuG~$gl`@)O3OK)W_EoDB5(ID@P zCFZ|H+mP{8gh{Zb+%|rd;@uu8${}^Nr;^_f{}xM*h#w{mW4^ zxMKqD{Hp3C-}hY6Ki~oSItX^KhZ{oQIcwfAcisyw&*|7qy>O38ZI-#1DT1bGC{u_qKqR?=JFB^c6Q+u!fV1#YF(fm1g)7csy6) zkbOB(VhFnp+dCxRjvWl=`i15zNUmZboS!ea^t{dfXAupjG>|G;p|Z!xpR(8`&Q)(%Aql3C+1xJj)$%&zluEu z^K8!J5OVtBkM~DtbUDA_G?h)=5eE{M$u;9z+Y!FR9-rM>^fW`Ncfj+;i7LMxC$HgJ zf`o`HVol|zT=nKL-&BwJLk0JlsqzCamorGrHDcnrQXa0A{dr`Uu|QHYUmm)Jt!9@S z|JO;I!*B%ol811+{9vkAbv<2`VxkZeB?&b8n%VsHm5+DmtbV}p7{~w|v~exZ0Dw|! zn;3Urh;WPQK}iZpZ&nUcQ#YaMPyLAA)@~?0zHeCY@Vv)ro4=-fn}2jWS!_memeci- z_p3rr;HPb~=qmk*xi9%I)1KKYA&hNFEwrRLK|YPnq)1gCU5+ceLGUY$wdwodbY&fI zHEpgyF*+1&MZQROd$^~<6?Y=g$r3W~xO4_~TE4+*?kH0C=Atb(^PFHjRbJ{}K$yj} zlphBZ)#NJ&<5Yp#P&lp?Zf(duv$dzh?u+rX9$FWQ2uw+LWYej|#P1(p-6X~#avQYt&Dr9mn!91TE zxU_VN{tUBp!--4+M?$@V_IyWjhe9iHahNiO(}B&mt* za<5ugU7l12gIfBLJ6ZqMTZfQzCJ03WX)kG_b7MV~QHHAAKJ3y(>CI~S)nSL#gDZA5 zIZxtxJJz~-usr~OHD(~eYz^NLb`)xU^1HG&|cNA+#eH3=zUi7@*YI6G$*Gra(N zJ<`Ks!j`uO^mEi%E8!#cZ-&T?kglXsWuJ2dxb)YLMStAM$D)@9Dg=s9qP2ks1?<{! zPo@I5n?+Tnl}A$m_BMQS4VLZuQF~tueN#71(!(?9LhVt#EPQ>QgKa(nk3T_dMf6anECZG~+u>efl9G><~;C#*`CQp-GtEOFOSZH}2ua=GXV^-H58w*X99jY@=1To)>S4 z3I?BMH4=IU?N#}Uq28h~__Xrtn9met#&B-`1Bz&bIFf@J+gQ(tF2Q?YX; z%PgEH%xe0?ZdXU=hVHPLd4~{4({`V8SupHjBMsy69{Okk<^8HQ%-fBRvE-YQd`KpZ z?K~5^_PJ+k{3dGWO)lA`g!!&%fNqd=J^*reAuJ;1_3bK~Z9vjrSf-ML+V=)NeTZh) z5xl+cyTkOX`7vLnBf5roB_Si|A*cCZO@eKwxz~!`#1I-=yX8$dg&O5#jybxlaX4En zgXZ;gcl3*eI8+BP1fSJJCgnw;Xt z`&zZTC^@%nJRzPs9`}0)m*M9hx+Cwh)zNc8$|FPZ;`CZgASX>0g#EV&BW$6aOO>s> zXE0<|CzmpmpO?2Fl!?^2qZ?)C2txZ79|HG9;^_VaOUJ)?j-~36d3Bt?iWY2ZgTv0v zg3q7l{Kq!^JI-fhky?LrF*5z=w=UyH48|yV(w@d^cN+@Q>^oAz&NR}H-jGtLXmd<;rp;JT*FQ1VoyOPbjl6rp$ zG<&ENCJuj?ukJlPg8r&W{_aXYA~(`53AbGJwxn%HJW~4ATgtFG*O6RR-}W#O1!aJX z@HGp``yykV^J84cCF_J z@DRw`_=&2-y?)O(5|nJUQAD>Jk;#^k25+-%ET*spas4ycH!%}bfyjN3<#DQKKn7f~ zg(66~S5x05me4TI0*7JZ$P*3S=Vf{KYtn`lZ?M++Uw`O>=eOay`Et%l^c0?eSS1k)3xc z5j8DIKx_fzH*>EQ)4i*b&BaqlsJ8bfop|-5`&Ww14=Nf}uZ3#;>PS$A_*RlKe-sap zAXoiRa^Nr?62Rb)@F{rb=0Y-Uq=13DC9J|HFH9F?7S19a^*|v@=MAPG1EJwy@~5PN zJX7$82unaZQwB-m-86?@D}SO|S+xll!JqZ40j%T>ySKS_W*FJ5ZMq&!|8=p0Zi!{U zq3|J^tnSWJC(R<^pacW4o6xg*FYogRe`*SGIMT)tkfWbZZM`E7t0taYJJ1PNvdZ{j zZiV07QZ!xoCUBlI>S(8IBl?p#525OXM{bRw{+JT#mAg+!WZ$vAvG?|tD=C^Q7aeNd78e|M|S}JreTYv`H935#KYfSlSu8qMUJ} znPWDp_lMJAnBvO5ihF0vQ4Dqz!BVU{ZA^K(tj+kN@(^CJOFzq`nvv2!8j|nn za+xI0Zl=g=_rqiUHIkQvP6V{q0I+7<@AxM3BJRrGnQ_oyR(6g~*6D3F(XjWwe z>NR0Fv-6qgRrmygHu2Qq81YN=#foy-2(CqPbkP6SP0xI8<%h;_;>}x!)aL~qu$GMs zf9FU+McX}rkVSKR_WOh%mk^Zy{%=>eCvs=!*l}}n3O*B_+?5g+y{q7Raq!TNv))?^ z7MyblUt#5ZR)1+zYbuUtSt}xw#z=0^h%IKN=E4U*Bm)H?FLyss@R#& zmds(oC<@LfOw97Q9Vse=4{yQhRz&)=xIyr&mfcEpoe%i3#qqC<3VxO(7f2kaA_XG8 zdQ~4%MW=s!YfnyacHmk@1MLILLPW;txrPvLSf zVW5*H{f&tq?!-O6!1qUG*1_M5@A6OjM{`G>>}9^Wn#3GpmT;iq(30(d@uJ6auvofx z)q7A=h>XjFD3WiEF~4GIEB$~@?->0DJ~*3H?U{xA1NB&vWwriyR{!=r@qiC_5885+ zO&C|6A$>rRHGxR2J$=rbEcN|>=+ma&rVNuFtlZE zqNbpJI#}01bgT4kzsCV#2As2aZiVlD-gz|I4bwcwBT8B@VIK&58>Q!MM_>-g(e%^Y zSM}m0P~xrf!=-QXa5bhnaVE&4(QkfPrC$IOH6#cr))UIzb3Iq5^ObChM zrn#r+pz1dsEB8MJ4w&J}Bvmfc-{}B=8MShBO=olR`jVFqtQ0J-_uNxS^ye3esy$F! z5nE$h@=$D;C6#adbvfIj#~voJ5o;`qN{D-agM=Mth5aBC6T;nNA4wDuE!E;ZQrQin z-~8gICE|0xWt7Y8rp)$Fl;BYnYz=h;{apq6MWueeor4<(NPT#*`f#QuzT}#4aUp4S z%PZR0j}>|)c}Sgof}6PWeSF@4Eo+?2OtZnYIqC7P^{z!c$MhVS1IEu2!fk&|iZ1RFewf#XLKUj5<^ zSsUdKgZ(p6+HAQx_a{_+EVyoAQSLc2#Fz3}Y)|VLue;IV7vfHR4Y{y`;&(D5PqwRy z`*Kyb6&-+&XIA{m)3nqPMs*}jfxTrbCealy<4Js|YGQ;?tKASosXBlnWWnk(8odWEO^5hBF_Q`Yh>#a3)_4gH6lfeF~X_&L1Do4-4xbkd+ zoXFhhaycvJl)^FZYF6mZifanW{o;S{G_D^mg!{SJ-crXIX-z#|d1VG9BxtxB?xu z$9Pk;Cl0gg?C#7k{PZ>ZK?@STDM4`Dzr?&gh38(sG{dFG0UC?NJ)5Pr^rqxlM0sx_ z9;s4yS_@k?d4GL_%`;Z>w{DVE5uyGYB|Er^8cG^`7rl+O}1SCncIMq10x zJN`L3JY$#IQGk;iYsx-}ySq6Swx&gBUfB}+{s3GN));y{SULhR#4Woz-sK@^-)@uf zyMgMB#GebmfK09&K66|%S?Bxb8-D+n1@JK3{dV|BdDTM6H>#mo~TpVM9z@iA<2Op{gAG=r9=q5*i^^&2mF%7dZfJP4IOKX zXIUzcD(pWbELdW-0iKUg#q<$=Fs0h|#c4YOtsguZHrzlSJe$CT^ltbWC?&LbZL)=* zcO1c(BTiXIR>JN;N6gRM!#o>h)s3@=Hx1z=C~8&zM=fjF!{wJTnE&v3>SC)Il8rru zT@u!hB@$Q1Y<_S_ua`X(o9ivTGMzJ7NE07Ou!>N)e^gxeT~W{=#KO()6N#x4_6Pd# z(-s-}`+?m-cmnC9`+a_`<(aK zouog5f2F5nx2ut)FlPO|m{}WWtDTCwK($vuXB-DYJRrTt@{}Nt;EUFeZHe4VDwy?? z(Ci`po;%Q6XJ;etl!g699ZdU&-AZt}&t)wABdXwmpoaj_(oT=^(c@)vK>8ct(l_&} z`~m_E0&01#g)}190>16KA3Ab?9S&Kz!ohs0b+0yBoXc+5p*aVmoGn#~=M`ptQQCY4 zKX)uxTUeAI(4Z6`;D(#m`yP~hzUACgEO-3nChJufy!oF(R`|GpSDj#|sD8=DdDg6i zG*AXctnWf6<>>F(52ZsJE>{K91bLpah22PbwN)XaeuLyMuu92=&%SJb*D~sKDIgL$ z7MD@&5)y59u<)5G9WTbop@Rg)v%M?z`rEZ4cIw}CtTK({?+4GIeszcIYK94q{*(xR z`0DbyEb^J58;v~+w`g!WU&4k^D`1iX+F1Bw-sPpH=pD|w!!L!nKxyy8NewsQTR?ruR zKqvD@!Q0Xzv-1;-h20I$;;bpw*G39|L#-{2z?h#YUi7ktV6(O;Wy*Q;rnoKP zV&b!rw&jK`v>yG&~M~6APD0Na}Vco7C&9U*p%Hy{I?`Xy1riYGj+S zAKvNlMJ?r=l7^=RJSeu|X>~1DKa08jwDCo4s2_ELkSM01_xCduKb_4Z&-sL|F-+GM z!~Et$f;}-{NN8XOcHIrDjX)l4Z@rLTL}p__t;jafB_t@+%K*PIdHDk@G!J92`0&D0 zYH?SC;dS_SzQpz>T0@(3RligG=$FOE|Ja?uj_(3i99$La%dPl(qCr@DmgI`IEc?*{ zLpbTCLip^XY4Td+)w#l52Q*FmgOeDV*~Vn;gt*E-(T!on0a!;>NGPT(Oue+uMQ?T$ zpt${n%uXfTe`*JDKc7H$7foIaTkEoG8^bqU^|W8=SLJZ6EX$(FjZ9Y9iM|_LieFuc z0npSp-6gPeGbCN-TY|_<22D)m-8p-fPBeAucR`)G!}~vXS!dN{S{SWJ9+FxY4)E^x z(VI=@;n;Fi&I+D@<3334t5V*uqXHro0L=OnuBSyGDnQkDp*_%!w?6+7AeBIf4LpSn zHt&=Mqc05CJZ{srA~(<%$6MGzU#p0<5n4c~dWn#1BMFAOQwx0o2a#v3nIX#LJ6x3e zkR2yx-|m#rerdeknw;AG{oE-ZkhlIAl?}*SgO4GVIRC*zB^O0oVIQ)3anllZ%L?X)9eG<%$)Lh)>XjHub~S1pzURv z^bSElPvH}v3;h(4^HS&1*2UvEW9^`yOzk1yfcaL=?q$cf-lfp9E}N?{mf#%epXnhw z%+N|J9AvjHc_b0O@E^gOwLD`~SOXX)RS%gdn;%E`mQ-@%r~KVUI_r;n6EE(dtv|mnsQ5746Ntq!OyDN?CMqUq9t%*_ z_R#iy9xtX+QWBCYns_sdKvd3zVUi_7*D?LUKSK3Pe({H|jfh8}d{aB;n3fa)&{Ih^ zos@1#^7NDiqDqE=yw8o!ES=?q*I8Ey`9!u~k&pU(x6T4$67*^4IQ?jNy)2W&LNH&P z`~#{%f9|v_^9N$46V%od!lgp9@VuA7KsAL7Kq$%5x@0J_vIiMVcw<%l>usnnngNl2 zQ|1viFm_J3A9xZ=jr&}y=<&u)5C#JL+aqG~7At)9b+U%T&>F)0PxUJZ>F2kz0_`ufi0RJIiTe=Ru-o5o>f%#>UUem()rB>5!?;L}J{Db}!{#d{_-0^l zPoxS3iGJ~7?WL-2t%sdvxDW>A6MiQkIuo;XBK#?PCLZytUA^FeygBIs+(G!=8iGVN zTRoW&Z($mYRkqzQj@JY92rxWVVKb>p~Ut$RzgNE?=Rm2wEgVeu6a$GWO3Y@ z!tA{}=CFT;elJc>rl9TwtNROKDAydTv}Q-vD#x|1=CHQh6#AJ%;LyG8 zdKa8tH0k0ti{DCCp6bvx;(Z6A?lyC1H;ugB4Ki|ksg8Px#wbo?SOpA*9H5l}$Ns@n zueUXh9cwjNAVF?d7wm*{JLYO@d}&sr46_f4>2wE1s^#J>4z~{Le7KK0dG@|_ZR&Li zeDc4`roG@pc1ODNFwW=cVJC7)s_(_h(T|Wrt@Z9-`uf%+?=_!a_I5eQHC=&1hkZ8W zkxIrAx9TXbckP1AbC+rkLVJB?a* zU*b;mIvH}vQb&&?xzY4SHs8J4`MC4_NqS_PSB`~%dw4WscO;L-Q5+HCV=&Zb{P+lZwk#4fAHt>aX{>HFPubGj&-E^MSHY@ z@DA7YIeF0q?nJ)};0R@Tm4Kn*3H>lxJxYkqW0K~U~Fb~KRgc0y|0F!svYrbCq5OzB(a>FZCOq@S#UebS#H zXIOYr)JnRkOwn%>2W|;>Q&{L;jLwc1^e<&>rupVO35H_!tb6r8p<)vNL7F``1y%(* z0NmhNN6OBtYq76YZx9tvEmXC_0wP7scl3J0-Udaun2XO8W~n)@l)bXOy;r9mr%Y^jIVmc`8@)K` zE{Y{0Cz$WI*tHM}MjA*<_}^Pm@V}{{S^^SJY1SCv+pe+%a#>!pbPkx%JosP`uTRgQ zG~Wjh>l`lYgV#ezhDs+6!}A@-$>hB#{?#Qs_U&%iPXApaEl#YGu&~FdNsAZ=54>MJ z_^6I#NgS4rbQ#W(ndnC2M@r-31p2RynzjcKvMNWHNZCYCbUiMIdH>LT6Xi9 zN-e;XxPfNE12eR{T@||Mb0XjNU7kc*U&J^T(E1{T>vGpoZkW<%|N52U!cmmfWPZUn zrdd8iRaF%X?Skp+q!zq^ngFqj;|aAI7v-7?AncZrnM9~LqGxl1C_3;q4Y%;AC18L~ z3n)HTYHE{%jws;r!Rsw4tNHscySn3K791Cr=@}X~^e`gQ}CVmR2 z291SHd5fFX< zvgw~VOuOeuJ&l7ByJ-#$zyiuq6QBOm3tu3AQ!`^@tSCJ+o*jlBW&Nu9e?)!dUlV?~ z_QrsLlz<9I%LJ7UL2@G`q*PkEQM#Lr21zMFVj$fhNT-5?A|+A+1L>|2gKcO2p3ig6 zAFvnOzIR@6e|lD$IEd&&wvI6QFVMzx28-Lp>DJrsc;WdG{bX?p(Q9cJU$h;(&j!7d zt^zL`bY7f2c<0^wl&7X0^I@xEzIOgv_2zlyrBuEv2v$iA@$n&UAxT~x5J2z{r4R@x zo$#T)pRqA*aj`i?efGVnk`9bch_PNhyYSf(o{(MQT;y!-hTXmhucqm8xjJ{21yAr$ zE~hh&K@MA|c{7(``KSIIFws>YP}gWJ z1bR!A4zeYAsaWaU7)QKG{E%&T_19`%vfBRY+s;#UZG5{#F>hyE?&>)3ttDAf%!Ou0 zL{4M&J+ZT2Q!QheoDI2T`uN6KG(!~k&^&`#6C_0cdaz+{6jGr{R0Ho9or*m1WR4j1 zzM-sNU^c3rakRe5cURF|QCm_BRNa&Lh#yUeBMxdsh>Z|P2R zr3T9wRpJP|Ff}3M*c(GD3qoPUK(R+KXido@eqry<^Tn*c?y)0vxJ#!+kEvx(-Y41TAT*vbtFbaGHkfmRg^ zHE+I%N;xB5`D4Su)4Lh@kU2(1;BaiY*=cO6EH<~vVnq$u>bo27IQmK|KIqSr~m#+#lU4&=9>+b}W)m^+nW(#4F2* zxUJk0iS7Py-(6)rAWp5borP&_tE>{PO%1W@*Jh6x_%@GwDdaE0Pg(tUPO#mv?d&^L zMQb2>V1IfVw^-aP{s|370bwhjn{?iv&7wCb6NbC?`OO2b6~IZJuGmdw1tu=O80Azs zVaa?$68qNwmns52?_bk8QnuP8U$Dkmj1k?-ZXL<$mjxX9xgpXP*_3Y5J-i{7`q=d;4*hcv&tuB<6}u_zj}Ymt z?)ih%Q&K6LqDo4xqpq`&Tb~Q)SLh1MVV9Ks@ozZ7&k4*su$SL7d%Mq*Eo;H2==-yx zFRT;*dq`~Y(wq%SQbNn1y!KdTsD>ZCH%ig})A&%kqcj*T$P0&p#xTiEFW;Zm;z=Qe z6xT+Dl?)igZBd}f&TTF4f76Oiuz#YFByLeG&qU-9RZVo3KIv@Jhtju1n(rQ-_q-s8 zhICmyQeO0QiGD@o$TO>vu2Q1Ze%&slfX>;&eCAETU~kI}Hvgcuvu``?f?xi?NkFlt z-;;J91b}Bf@BP-R?QoXDYjxHqlf&{rhgyj3o@T%d2?{5wmdp;KJ6;|_IOV{KeZ%@{ zOdWR}L^Y2dJ4-EnU6+cL;2ZBtX47j9b&w+$ikw(DP+&P^o4$VsRH55%Rro z4H?2|aZyaGVBe%f-ji6;s}{R9jQ6OQCQWi&(YhkUK(_M2j=1X*hHtM}x2 z9eu+i@0@@HkXnksG0VdTZHJlH*PWBC-B{_T9>Ah~pf+4<6d>dvz4h4;ayvcP47wAr zKXA&|Q~R0%S02HzD5Hu0{eAs*HGSqbcs&wU<>ZeV9nzMWaRsFPOHlp%iab)%B3(W! z4bRX;h>+y?vnwm&IP}wu#ha3hF)RUUQ9TgtcDituxvQQNZMMH%A6TBD5f|HEpBbIMd_Ujb&=O0WhgqiW=SGykF_- zI6r%iHx>!hm`&n$ppzj_;>Yt85u!tFA4e7N_$T?xCKL5$ZJ&@Q&*d7kbf#nbefQ&| zBJc133t8BDpeQ0cZW}%6aS7wq<#4?zIoi!wGlgjb>dh-+RWb4$p>FtyE*9Ny709)v;=_6@UANKq}9p;@g(&Jb0Zfz0~&J_*=wwQ_*bud zF)}@4)?x|yH7PQ7k|4p4OUVG_z|YvFx;4V?k&H29Hw2EfeNTL zUU5kSx)P+MI{DJsr9YW)pM}Hx%9<+_EUb3cDcGk|J9tdE!jZ1c97{#25dPkx(fpIV zI40>j#oQ@?mCH~>PRR#Y6Rl)6rLqac>FWDQodV!h*Y)VXbojO6oYOr+lWH3AW$SK; zCuQ!Ns%P`fTMciC45W_!g3k(c2GU(HRbwpLA~fq?4nx|^E*ki%K}_YnQZk0(IZZx% z^zTiDER#vzFy|jp`8YA%t&D%aAmwVEdZ=axk#vBra^KZ(@l=R#QMrIT)26ITb)~D& z$c>2iPIQL+l!^$2s`uB{*sKy1pnL~ma6qY=H%GsZmS~A-Wfae=vyR? zbNQ+g{;_*^))T(o)>3<$zQaq^Rx)$R($6s30RKhfOD1v8RRd9mX$`!l5NiEYYZmB) zNb5YojM{Yy964GQ2ANej#cEyls*6|dYMl49f!s<2mq_&G$iG@%@J_?Fsz9V4_;&en zMunTR7)f7EO6djCc+e?DnWI1JNE+4ZR5Ock_^mgMp7DM(|JAgijq{;30Suk*;&%z| z@b-Wb`G=zD095^JjPb#gD=}Xu1Bz%ETC>9-YyF|?g}JfkOC1qwx*lghh$!Or!)_p| zNU+tMxTtBhAJ$sEtn|=$*P%=!nDz?o^ht&pB_%$OlYAp*%s|Zy!$rMwU7_ud4>&SX z5AGQR+>{B}rW#Qi@Jf~3inAkJh$%ZyT^*YXK;pi_g*DH&n?~J3eU-0c4Kf1pZ+Mn2 zHx4BPZZRKj7&GcuT#9EpEp)GhsucVE9UVQ5%vsXS1FAN=_B(#r3~P2u>?zXBOcYke zkuB?|sxSS^924h9vx1?}MR6B&AB$Wyv$F_i44a8_h0N&_)t;*dZv`B+3gzm%wp%Ap zy+>($pOnb;f^3pa=f{=9~+&-AUcdwVO{ry;IsME}?>EDPwfn1le zWtGruQhBMlK;TOocjQVT1J6$H@++z(`b)rs$YYD%QcH~z9aef*RbVw>Uv(+wyC#%i zV3N2$+q!-LSp@%>A4a6YNEqpuqC((akxj02VpM7r_2xJ0$3x>8ze$ZZ{WrB9i=`2xWr9JkKP?V#g7He=4ROF;p*GbcL|1Xhr4#4-L2->g zA={Nst>u*IQry?a)2~$FozFKA*F~j>-Eq-Dgwui=yXK7&SL0&by$un5>3~)}W1yIXJ zLBcJDNy6-1u2@(z|7J-%x^z@nF$PrO(w|(sHcla|Kw=hOF@60$8r!{`Csb@*M3#ia zo%h|HYZ$;$GG+>&4nFP z5qr4W+?WM5;T^A^1fs(Uidw<@PiTOcI|z-Q3rT$k%ZtID(81+O84POkY;NFzR-hYB zJj^$Xjcc{$X61GH4iI-s-!Krhf(C%XzP+H)x8M+&v|@}&BDxR;pk2xP$eG#>6MkBJ zzE4vqQtfIRT_ac4*2+ldR?XWKeE6-2$y%ilZ7pmzzU3IIbSZ~P&p z4POO*!6g8O?m&s(g_HjRd^$gQpfbH%cQn3RuEKqP#*G8?QQbJ_!gkCRDD*Jpg+4xy zPwlLD^urZN_Yr3F-G*lcQ_k6So(sr-sy1=!{Mxp!hWyCtAfQQPQ=-P;w7$OH3szHo z#5X6`%(zuG-Zk*&Y};go)VH5D_HOq?3sP*IHqLBBYw=&GtOhp+lz=b7UH|GTu^KF> ziV8tm3+Gp8DQ{-W%g|JWV~sykT`hGUtcKH&BQOYmQWW%3;pkDO{D<&W^3n3<+|`G) z^ax}CUJU!ClaWs`A?fKb5t2A##hqgHd)k<)2f>|aO%*X+PMMNgF>5dYQPn1bh-M@l z9H{3Z$$eOhOA{bw7|SAlRp#dc<8<@XEV5z8xi zYL7xN@I2JvTs@o2F9m|{zSw^qfDCDMEr)V>7JQ9mjb!&r!06Houwg1w0j~J(dFyUM zmL5wtccWT=94D}dN9hu+lXfx?E*nH@+NRsR^CNFqNE8TWK(B@o5jHcpYIB>2} zi^+?8C9o~!NFndwcRR37lKeS$mj#E{3acJo7#js7kCgy%553Fjpv#Dl)u6jSlyVL{ zye%J+Cr(2VRpP`0oXxr;*x-MUgUMN<$ipfp^X5lh52dJkapWG8eYb*9$p|T~(jaS_ z!`l*4m2j8f3rD!fkD{1BoXjP>Fi|j|WFOmnfGriUfYo%8AF5-_Cpvw6j5^Tfhb@>S zLGKZJmaMBgL^sz1unW+cSu-$1rCfXX^0sEwx%|TkyXEuCeCdh>OLu*&&Tr85P*vSo zPyb#hC1tM?4Qq$)ilr1yhP%@@HZk?=GY{skiVy%HKzDnVo{6+dekz>p&-!Hlg!e49F-*cDfPvT@6ev7C}i z1CVeP^$*0LG9IsTR}B5n3zodZ~OPJn;-!UGy;W^PPpX1$hf=+x_6Kov4HZW2VPtEQzAyVy37*1WEN36P<{-_u# zc1Rt3+g^yiL?BBXFMyZnfY?pnJ02}9baUUi}0wR7g1qJX%y;*aXXdOrI9bO$-bhQJ-!RLqD71>t$hqlx;iT=@qBb=_bj)0p%vCv{ zg|d2R6DeKcx+4fPH^Gfd4`Hx15-TICPQoBBV{$SJ2CK{VGuSwp=K`l*ZSZa7yXKNuormiip_RL6xo*ok`Gj z)_-|nE3_DTAq6W+yU!$bJo=1D$?Q zfObIK*$E&)<(n(dK>qL}R%}cqm6vSUj=HPk{6a;%LGSRbs<4J<+`=i4 zRIzeVuYoZu)KRPe`5iO7y?^1dTJpC7UUsG@V#JNq!xb}P-ZzEWUaR!a^jsN%FV{GG zI`-d(a13?9+POY=YwY}TFV^Gv&W!s}c+&Tl=j;lC7!8fT;A4!lo9Nqsq^hoBmXKgX zO|+q+jnG&-N85}+$9J&*_1UZv!#rwGJ4{eHJ~gc!RP?)pV zvx$CU;xNQ^bzqh;Env*QmVvCo&L=7;fxm&PRsm`GG~p`^moT+ zY&W=qdmxCv_g`Tr^Xj`Ne9OP5JEnJm>V{A8BVx zEKj6N<9CoPH=I>}9HM534Hll6*Z(VpH8bjgvCQ9K1@1e8H?L4n0)(Wr^4Bv%AB8h@ zfagmt^qd265qZEFl5&-m=aGZTNa@p?3&}Kt?-e^^tQTg%B{AR44lK%KC;iw73 z_`IFW1;}_SPLCh0mBLkz{y{`Vun}Qvn~5mm1H@DA=8_2?{>qjr$%9}8QWy79Qw{JI ztgoRL_UM`@I0ipbUv^hGiD)LId$InY*6__dk{rQ~am<{8B5BISon1n)8j)VO4lyRI z5%l|*4Cs*6)tQt5u`LR?(H_cg#}&0*p)O!=nJK~ zVa+jE@!H&z36$|IRDhuuz?9eG-SdZmd0_`l*`qCIZ{6RcRYiGN&>IchyEK(ut3H~M zFQf3Ho~FuG4xD}w8#yIR&N;MYY$m3;bmkGCcQ=2bG2CEk-3S3ufRdGAj(uPUM1zTt zVJy6hi9?J%WnBM4gUkV`vaO?h8TlBcVBIu(gP9?l#dHAa2#}{;0+seA%-7lNj&; zchb~-ssZS83H6P3;01nIq*uEeN@fb$#-y4v?XO;#H%2q7Z&q8p1G_#1m;82pUcEcJ z1C)#8t&(+<3P3#wS7$F$f=zQ(*J)0weB+?-doFOwm-`o1_+~q?J>eGRW~_X$BA5N= z4aInahzWbWL097BMj!b(>NC!-iP@>Ttb~04HKjEuH=s*nlnBDa<|l|qNj`Z0U5;iV zR8xH;{qw~K2Tk<>RRwD66idFlrtc#YHP^U6e;MMbh=8BW^iM{fEqSvz_i>H>hWh}v zCkdn!Q)Q|NgDv&Gcl{+RUB}ZT2lM#0eG@n#XYQn2-7PuT`8*;Ddz&`a6H0&4Y)qSj* zO`0*d<$i#={*9shj5g62(2SyokOh}SE&Y^znt)hMO zw^1Thd1)Zr6DH=wOZAZ9Q+M+_GQ1{sJ(LUg7e4nP(0w7q{*iXYh1Px=%b#!0%L+8ZKB&Vp*lk=P`^E&PoI zlsO$XfBPWUM*KARgZ9!b_?4==-;F_b-1SKC;ecvJ6dZ!2 z+qL8+{uA!_rD=IN$Y%)42bw)F=;^Ri7i#32)*yhHqL2bLfBmBJ!Aa{mjrNjViUM9i z#kDnln;Jl$D}$xMc7aQ_1UuBVco6V&0+q(BM%MtZL4*pXfQe~VjD!hm7ZOuB&#UGY zjYv>*o!lejh429FUOK0#YNn!H)ctNfpZ@=drd9%LI%79UlPRq}Uzi@hp>LyB7)wtY z5$G5_JKyTu$L|^Zh_!x?my-nL8@&Dk$zGZY1OQgk=Ib4JooU`qSAlB%L@toJjvO4r=&L@fAFzWQ3vF6Dk^z&o+5Mj@#> zuAaAZ+BNC~n7=mCt8dhsQ}Q0_H=xm+4npg7z~uyBdHQw5^^f1LL&RIJV=mwXd{DBC z-aQ!4{)c+|hY~64lTk?<^ynFWXaBT#%RBk|z32U~8j@5dACGNmd=^>q=}8ATq>+J= zc-oW>6O)8+j>NhZeACe@%H$ggf3ZHgBGVIJ?RVT zRcx}*T6n$ilF*t^sHK%PpGxg@f4HmNAbqeQeAuRmmb8rC`+|S5tW0hQ3$MMNg7M&g z>qCt>?jmpO6Wo`UZgJI|m6XSz>M%c*Th z2^7`;a9o*NOq8h%YZ)^!*?b)1f*r zXHFx(9b+*9d?zQ6cY9SZ$mRoXdBMHqIR847g z>3I>0w-}lwK^ffD#w=i5gU7`difgGSw08jrf>i-}G#CyS=u9kT09~6T{t1~2Rm8~+gZ~(LyhjyzQR2dOLW8WN-cIfwrfy0$ zrbPOskwnko<%CZf!(mE6%I#^XhD`4mcGZMrKq%lVF@YNGLQ$r{vS(yYYSe(Cp;4f! z>Vy^DVLBlbNpwAT7cwCVD@siMsP>kyXrQxgcE;pc#xxLr;*#%*wg*NS4SiA|^xYHn zA8pr0ZwnHQ%YNQz+GN7^yob%Ign!U`gnF1KcFrX>aRx(Nf- z-!TT!-|oYv&NO@fNazj>)uaraV8)vwE_)P-3thcm19F?3?phZq$XvWsWx6@?QPG6= zrNd4Ucmp9+O%Do!*2#0a2`AX)H-`(=lK%GFCnz=vdxH;!ej*$;c*<>p6VI1dx20yf zCW>UOzZky37kY$5`ADeRB~^H6Wqb*thRx7`9&ytH;eX}PKPT~x3-rK8FlotK;5*qG z)GgT1oYjOH9_3vUGi-L|4z;$*eMm^ej8yVge)Vs4g7~}ft2E#X+Hu*1 z@yhXzc=7WOB&3WFp*6Mc69%W+iB8yaR>17|xtyC5tldGHhL^5^Epzpxa4feeM+X!{ zM8I~=SXyu+!fT1{D4pm{K3uuk+y6KOrI_QKcZAAXTYvGKac?{S#cLw} zIwP{Te`3+e6EV@w3K2dgUL#OO=}i~&(}#jh7SyC(10b%yzc}1`oC;2+q_F44e>*BN zc2ko!V^7cc5T?c~(W+HZvORI6AeW@gG|9|%)?b3?y5N%rxU}rXx7V0cYtN51JJ2Pv zL4!F}!^>8Sl&aKBH##YrWyz*F#RXNb#?)vqc8uBfZAr)x35d>kqlgAXrid9EA~$YmoxbfXME!CegB*zyTSO*bQ7)p!F9 zqZJ(wWP3Q0`_d88U?k(M_&tFutER_por>nc7)ORJCV<)9ufFA`G`WVwz+85lc=RUY z%+*`{#%?MO$)UH#L^Qlv9a!Jet%Km_UrNagneeY=DG2Y`fsNRPu4niT6L~5`B{%qh z{f}QwCGP4@XsS$nPzOC?A?kAh6!eLc7KAfFEPJ=qK96alYO?aQuxr~Y5M?@S20}P4 zbq<2sd$sYErfJw**VM1%D96+E-s!~xLKP`t!EqzDGv$WQpbN=GTJDE=jOEm?xkTo) z*~iT`Z`7rs7rJ$ec?$hWEh37Ksb_ANvt) z0%1;J^ZEOmyj5g)8+{%FNdAx|TrKx{3c5w;9Jqg_u5)rliV>77M9fkVG1;t;MuMOZ!jDb2lW#*zlc`<-|DdiU%N z+H=GrpRnW{`@_J_l8<6^0mkxjI%6hac$B4bjB6Mz4?)LCaS|7K#lcxuekzA7+!U~@ zDokshWBE_OS>NvDZMX}>%|zEbjl0|upbDGeqhj-R(_q=nSk-ft0y481()?h`ujeTN zJ6bww_lc&@MK)kY6)G(KG=8M<44nnNWXrMIx|R}ge|~&& z;!@D_!W~EwkBbXkYCVl?>gatuBm9;`1Cf|5=yn*fs;TJk89v#lJ z(e!^vA7+!e061VAGYZxBf6isk7d1pGq7AsK{B7Jef&0iFO>?$wE&>HS_~D#*Eu@W^ zPET`wG=C+T{+@a^cr5|0@%sV?&jaQ!wb;$LkBL#k8$j@JK>u_5i?mcy->$95CXRq0 zb#MDu3N}%J^@k&fX!2gLVjSgo~l=E?e_ICXRcc)90lH5T$-Fg7pWXa0Vuw)$$?X>YyNxYSDEP+ z>F2X#!d|Prf=x-;gR#)=4i&nxV{pw+ho8Zd1#J3 zp+l-g&b@NU?lC}7^35ec@(&tZc^4$4X_uf5;3lq}+CbIr7~PC*zG_I9za))eV?h;%tf0xl;V7Mh5Cq#4j*T$UA54BwVvz|R?@*EQIdCh{eqJ` zu}gtVEMMJURVA#h==}1I6#dU;K*OX&R96jmCc4hrJjWyv_7_V10DLO!)H476t&pmy zLs;k-s!)Od{gbq>S{7_(&v-U``jNL6?!7e{60zcq(a#{ ze_*)8g>7c3wehWY{l#W6g^kFfZxvY(m1AE8J-T55fN;z79y!Xc4I2)iUcBye&o3^i1vv&)Oi5bm=f+noL)>9}i)a+zCcB&s-Jd!|p z44_`VV&l57(iya>PceA@Z`9}Aw93Pj2(>_#3F)-l=OPgC24p-n?nk;pX|Y))s61}T zEX6qcdyoaXEb}Xpe}(dR4C~N#_&_y-@>)x7Wfo_rkemz9Z-nTWwS@1Q$vT};F1Yk4 zp`Fn2?}?*I`uKvQ;)7Fo>S;eA}<>LI^@V znJ-Trp3mQvn&B?4&CExiW7U5uAskl~Wro;2*`>zCsUJDXq*BMdGm&_&D4zM!2lEk} zEgRIN>Bq?7S5(c%v#a|vBlv})%je*+gk1;e<3jB4|7F_xXChA^FA7M=c@~qy^ynUE>>m!wEk(JO zf=cpko{+6%Pn(Y^2lx$OPxfQr#oxB`gR5hH0dEeun{((7Pq9Bh?>f$xpqRoN;r`V3 zmWVjGr)3$Xkl`3We%}d1HPd4m==9oL8<*j7nt(3)8wi*DBd*oaXm8xU&;@Nhq=apY zU?QO!?CrG3U#{^D$M1{(C12aE_0P$RAj+HVq}47EE8f^UPgyPUof(2(bZH5?Tsn4} z+p-qdT`=tS@tX_9uCvL4k`D!%)16H{K<_c0fF#Dho0 z&*Xy6v!|Yfyf)u7-781y4eqypXUjJ22|lISEDbvm;_&7gf63!DOMWj@O1VW@2>LwZ_{@y zLsz!Nv6*sTdm>HnOSm5_;i9&`MLrs(>`m!$9w=J6Z9}g@!s3>e>68t z0ppN6gh^P5E5~N1Nrx6F9E!@CmoqTkw2*GQ*D$(xrUPb$=ylPlD%h@RclN~J)!sHD zNfGh3K_i=4=wxZYZICVW5`FHUM~G1ffZ2t{LJ6I}#gif%6nvO;{Nw>NGaZU9a>*kr ztMT1prkcf+@_~qf*%k&@4-XdpJs(_~0O9W#5X8|grFPrk_{4I^E#%nK)R>A@88nY1 z>q1E@egxh6?K1y(9H?umaNa`8awzqn4A~w&w~%6et6qArqBZBgg_6B%tu6mK0?eX3 z4BSS%bZ%M=*EUQMN$z!GIqbZrlZAqDZiE_#)xVmV(c%$WBdDUaiAK1)%%+|pBYG;5 zdqM;eLTXVF--rm;A9cgw1?`>S|k4|De%@BY4 zDo}qua?E0Ufwz*3iLlIo6}8PR_40LM8gbEcde(0ci+z~oI3(cYOEL?@QYbh~8jRj= zCwg{V6L*UsQRwgm^o5&O%`?)x4pWH#+k_98I2WQ?LG>4{VU)wqG~O}XremhO z4#AonbypbNx&nvk%6Daq;)DOc7r>3pT2PZzDk7ImkJCpaCuhiO>`f65vDNt0GaY#3 zhpYU@+^KYii4YA3ZXkg_jzyV&{ndMbVcV=`kwzPTS-O1dzcR%G zc2x@9fzj~Vm-OjodOnCIgkGZ3e-=o;!|^Kr9zP-Qf4U{iSXo| z0|@XarNt~-i;Rjiu@c!Sz9G!UsVA|m;(=Cz&2-b`L#`s|_(qAI`|4kIus$E0LUF=^ zY@4>=4#1(*Aq7l~RWmn$?j|@p;5qeC5Z=78`N}r48m~dzvJb@sgl(%LV|K+p-A|TH zjc$f};1;2KYzBC`%eH{EC5M`ZwG~<62leF&74r2i?RAy;^eu2LzO;M*_NONw=_z>> zhZy5bA-ub5N|iI8re*U>Ht$6!qrcyeShRE17w_oxQ$M0L-PB&P0 z4Jmvc+cm%VBNsyjTJQO}uPFO1GqLjRO;I$^9wouQ7{J)?DLKNZ^zv&~?G<6W7Ptsu zUWG{N&qDH?S`|V3CW5{hE~J?^Ii%}ed(D&O$ssZ|YOEqu&J-gA$HaO|?eNJuVDXgnV zaeXGvth#!}0>W5}uW4yON9MlY4z#2-IQagboKeL4^wkgA01FmX#y*+t+eGIou0A2!*pJ~_dCcm%E9WnN?-50S!E4U8!K;CBP}gL@0d!s z62iT8A&xjj1)@hlA#WKa(`UD7X3uXl%{)}B(qovzMW^lM6{rE!l3j`F`l&UKH<$q1 znpP!n!(3(^L12*nWv}krlH{9{=3XR#lG-QvxfhY0$M1g_<6o{WcKZS#qrag`czAl( z<i>oO$TVYt<` zKDg#9KMm&;|JYZ0eIxp4%BOhL>A#v1xb@SbpGi04Teo{1Q?@wu%k(7Ibm6=Bj4sUS z`w-7~FAVC6!E-8eyxsQ4Jr;`2*pqKT?up4dokxcGD#HDSqKP zI?<_tZ!IVVzd>c2J<;seh8FM411e}@-%k^t064r?#Q_JzgP>4cFZ-N8XCGD;fL(^p zUcI`l@qLp4$~Wr}WOT$V!BlwL_9X*1(X@I`QC}+H2zu=}dHQ;9cudifeEb?6n6vTZFZ&3tfx)Q4amx=m;UP$W;=>zttAkmeveAqT1XE=%!qeE zjeE6?_JHJ4^502e4|-waOVz$oCS)zn40IM~+3NomNIU7RFL(MaUV^_iih>+23a!3L z5{Q;}{D%8$n7+wnN==1Ip@|LHcmFCHtv>GY>Aev9pkP{)@Pz#N8#fi|k?kxAqGQv5 zI(9k7*d!&T3C9vq_ppX}uI{;vyPgJDMwfCr&75q%ux~pU2P>_oTpbx;y{Z@ffU$a8 zMR2Qz!`ACId1sH@4>>;(kfX^z8bo~b2YrH(^j$)!0K7-Rq2`L(+!djxI9k51-8eL4 z&a~M4ME8YIEOJRWe^Co__)(gMpES>u2Jk_AtW-ZN_0)PKYVJiw$6ok9bT_u$7^qtBXUT> zUN^v#-x8rUI|c#skU4ls0h~mZIUmk^i(uR?3NK0m(F5|DHkyHk37?K_MPOkooq(Xv z{O)@SPOW!8k|`U$W@>YGhi!12<$1UCmCl@WUNGy`4m7^BGYEt1POsc(kUBeHDsw>_ z0ajEy%Pn|ERe9>DIBYie;OSd^OS%`So2l0Yo_=7MjQ6EUHSTh;yEl|!b0W`$hY8B? z!}bM{d}?B4lRyG($PLV7pxl-xAe`uOtOn&_B& znLX(OyByyUkFEb5eY!$$bf3h*pbicv2hei8hIk%T6Sw%Z^aWB#l2 zB605x%>B$^DortCYyp zu+5ke^#UuRgVt;J%0D3;ajg;jJ_^O`|s6ap2Q+q8EQg##2eKz{%$W#>$fG^ zDmwXbs4Y3uFZDG9SH`%4(inYMv^3ms$IN!iGhKg8@JYM=q#WKm>3rUsZTBczwHdN+ zBQgI$5I8znsz;ll4G9@nq#5^3ZCIo8mqdu-G?z)^&AGh654OBc>mMu6YE0syZ*%$r z(E)iOWt%R0N{1pGAzsn3H>7XvlCBoR%&@$wbnpbV7mxrOHAJI4Cx#l43hh|U1CXVj zKE@wO+*Eyw1tY{n-T1UVsWbPFa2Rp45vuX28&@pS7wn`-bSsJc1M(W&3}Sj;z`lZp z>qP5k@&rH1_TdN0wOjm}!jw>5L@gHkUQggm*Q$?8|C6SbqSv6s2}^hXM9K4kY}}j` zY%EAEPiU=L2u`jQ)u+Pb%2Yj9W8}Mi&o^Dd6<|6~R70@j{a1MEe!}ddO3@f41=hpl)vnJ`DM+Gs=Lyk0$ z@%&huMqja8pd7+<#p5V~U?kZZ6 zxQT7juRt>)#P6I*70Ic)KWv^mq3k&)m~_pwnFv2*_kSPj;{i)D0RwzI3@n^dug6~8 z0rP6nAybo_f}|0vk0eupDg5SJm=nB5dq^K+@0uDJX$(74(B|ely%}3PsCN8&=xH?q zV%<#${(EXV=5$TT^Qy)f9QDaLCp$!SWm_wnItP|BF~ z^=!ad(#QoRpq`)=fc>kDzms~mc0-Hhht>28Ke$)=e6IA+kH(`9CSk3P5i&)yeP0+f zjxUS!mjE)h9sncqFG=JDb9O@9t%_H9&7%Dp^l`_kGMj1$+_QW?I*X<<*D2(#_NEb{ zivm%Y|C>S1yPI*Z_Q>VsCGw^D7!PE5mv~Ho0658qRBJ(?mlrjL^?xZ-|^0}-!)|vk|HvKaDAgU`&6BCaj zN(PhXCT0h{VF5dq7R!T;R)b*zpB`9ScNy%X5N}Oiw6E?vy2w4f6Q6ecHT*;?Xi}3_ z_AE^?jH`9#1xOY!N)U+<>_{zL^&CY2-#Wg1WhnbJ)~laEnn+I4{!xyxmc(kMSDOT0 zhSja(0X{1;!&X}PGbTe8zxy;w%F&RoOCq?>HXz8`bL#|gOta~kdMaR%=)%t>vJv*V z;~xVgZFyB2K8%nfK-$!ldx-T9Z*zG3(%)byL?gZE6 zM(GgP8EhH`K6}7_eBLT#c-%aQGKcBMz@U1YJE9_}c)&2%Rk_gFZkyf2 zC#o-OJ@rOov?AnRy#6+?T2&+p9YQ1!9?PZ(5h`y>l3b~J3`E%9F;}mGfSx%7$F zOiK_MmWXpyT{RyS2-;nlMy;F-|Ea>2Bat8rIu2GriWTo3f50cb0W$c&*bw>+@UB5Lb`AeuD~}-$r(wZg-C31cFLkqoZ7S(t1i#r{VFS$#xSs*mZABOzh4=>2 zz=oSl<82%6y9T8Mv3J}bjR;rTmGJQD>%k zy#WVp#DRVxr4XTG78bworRGm~Z0SV7LzBF($KxM0rV=x8P@mi$NEeu2y(1<`p4c}! z4e{R;<|Xj2WN4Fnp)G+Q7BTKjc>r8Q4VU0!kKDvFxQ6PGEb$9M<)dJYk&V&y0pK4523xATjZ1S zyzt=31HDC%J#W!)^KiOVV_?=kE&jo|_T!t(Zc&T3A#F3GW^$>1hX2FVTevm({eQq4 zqZ{cQp){kUVWSZ#6%~*akdW?Xqq{@|Bt|G;&`1cchxhC|*#(Oz0eMCRt6US~|7knGi5~4r<;EYMZ-@c1tQ4 zx~5uumR%c(dc?LLcp@)l8V}`@%AkHenKVx`QxVC}*f_}H=)gONEAJQ~x+gAGH_-{< zJUKs9VWG-=@UYF}IcbN9LSD`8?DjvVMPSX(oF`L0hwPS{z)G6ppUpqW!gZr?Eu=Lo zg?o>MmasWJ%4HG@I7UHprEhkuzw*3<2(|hv`#|84 zJueUK=oN6RWgg&}5&nZ`u1NmY5A_!u+N@zImfZHH7`6jo&WIPWln4fbun!Xg*d)Cv z8<+>gR#xwNnj?>5`92tQ9n{kD7H4;@V2;2x_^^cGHRmur@33do{tgjYnC!0bO=Qf? z$Va5SR20KsOS~azVo!6IP{5DU%0B~J%Sy~8JX>v%+;ycDsDE|N995^PiA?b+0D{hIGUfi*Q&V8>F!^+Ii7fa}1z6Ol zMEvE1o@x|(5wVH6NhK0W*6#Cd{rjCX>J6_7wbu!gRzp(ghZe>^A7Zf<5{>%G{iL7@ z5eFx_!i=dKYfOXA0R@7R6jplM;Al+=aeEAF%1Rg{Cf7ynRApOT$pX}x*CH_)QjFwT|48%^TRy?&nmt5E z0$%NInT^v=p6CGK$G5)$Oh_Ia;BhIN{RAQ7U&9DBh6iy~UW=vl)k-~uRjyU;r(Gca zlg{(nGv#fArRkewGW?2A#WphhT{~9_R>78_2AK#rY3{oGp#u0w0E@}PerOi?S5X{G z0yGth-J+~^3lp`dK-KyKjgC;SJ9{7L_snVNL>vD*O<3%Fr&PRalH&|`qk4YLEiqf$ zAXf3e>fKL7^0^jU6@awOfMyku-yqWRh7WB!5~^hK@F z@rnS$gQt(h2yE=Se}Yom-I%0}L-a2+y8vo|HJB{bhM0^9u_VqM&~A#thHj1Ax(u z)~+e(yOJ2LY+hfr;SYi^2D-iO5bjlQzN@s1%EK#6i&x(vxr@sAYJO~{p}zTlSs|^ze`R&?vQP-n+u@#INfe?0XlHEMxoPd%xcG;nK` zz`X7DBmaCe`|&{k39yJ@ypn*$Ca}0JHR@iOfAGu1C9UcsTm;#WPmgM+r_zZj35^2e z**>F~9YG(VsQ3wf06-7WT@IyVn-&>~7ACg=C42-M-)-@7Yry3M3)gb&IP~5{iu_L{ ze<|7=PaunSN~ziM|G5-Rt;irtvZ$E`xkt~K8zuk5QQy}$7g4FlQFpiVt0iJannmU& z^0ANUy2yCP0qF4;?@I8DP?mUH!FhSG-B)u^;t<1|EThKXY8@Q%TxmYoHSIEsSs z7sdu6)~fPOCLiV<`IgjHEx~HxW`D?*ynyITO90c|!-SJ3wdY&k0L;(+R4yxD+ot?? zjhtjZGx;wJC|n~>9LjLI{ms|Wr_UoTm2pV(Y6o667y~~V=SReK*TOGXR^Y*l&slu^ zYg)<^#sR;;&?dn0|y>O&(6e=PC*e}8AY-C zpMp;mfa!bf_}YN+ru-Sp>%ps!&VXN*ts#FbF@YD~IHL#=p9i!<#S?76wC6SdV;T&3#+{2JvSs)H9_X8OH_V=^YZ?xk3QK{us_~D7(JVW=Sq|`9QlaVOdYQ9 zqzIkmpwr)Y8>}hL8kj$j8<%9@NxiCX;phXLIJ{*tSBlau~}6z=L`Qwm7)S0Ao~B zysMh6+pzRW@S|y{U;v_Sf&!ToV3*1yTwfQ%bGAj5Ip{gTA1Xd#An(4m$wg0YPOb>m zWLAmpZG0FkoLW_4!StX?*oxo*9KB%)XuuEx8{t-QN9@dM#leH)KC%BQ>$Q*O8*XNw z_evd1Xww-$+qXbwMOi}?jx47Js(cK9MK1{%h?34&W14nJ54Yea0Z13(|&0yRDy1ZA^0IvKP z*(9?@vYy3?gABZ7C~0@|Iv`n68@puKu`$^w2X+}dv!;%_m8!#_^dK|*6Tl`e69tGH zX#tk}?8eFin&cxBH?_V};~VjLh|1Ep#*O8PlV?UzJ}cjjnY@qA&33d2^CX%?Crq^Q zyQrJXU0X%xn}u`ds|X3f$jj8u$5o(yj~LkTuNTjIXIc;4nAbZ*$$msnFFracbsOpB zg#jEn{Tp6@a29T$Uuaax-YVX9g0JKABd7Z1?5a!ubOsg%kAF9@O5KO6NJGPfzUz~w1fz0F^#81EE zD!UV#*+ka_*G{!CV4p@)RVOQ63&!@j=mW|?LB%-GrC5X|2_ zQ*VR*`Ed8=z@=L>vg9LQj`PccDakSmCo1b^Shz`v#uBgg=)%znY)kG;qAn0Tfj>w^ zL}_6|t-WlB*`!uDZ(FSD#jszX|GUwQ(IusC*&#C}{pD)5>)V`SLd;kcY}EiZ12`6- zs48*W3btOiY0cySl(0oW$x{6?K2Tz*m5AQ%x%O1&%V;T@r_>pxE>bDHktYfE;{&aS z3&akw#XjFX0QUEHX?}N1zV?`4=4Qt}1bGlmZ+Go|>1&B6o20!W9~G#R1Z*(OUd(3z zvV~>Gtqq~+0lN3=k8f9Vv)TEQp-GgLXs%>p^;nfi-md(l3W#2LWwhopDzlfkEb(!G z&d7Ev;hSdy9WHa_wHFtQ3q*jcBGPIRD@2se z5;Cwfq9gX=7pd2k-?CYIsot_sZgP$ehq=AiR!Q0{a~j}RS(&Q>qT@JgktDEy@@`#X z_01H|MVO(TCwaz4Nd-gap!O?<8CF0LtRk#G6_9ZRHe_01Dp*0#J68c5Fd5Wh9`6e;l1FEV}EnN&R2y$$#5Q|LtB-ZSNgV( zaP{ka14wMws*f7(bEn*)7tT-ga)IN6bVzX{oy=pjPFE`Tm)H?qUoq6`<6&Y#c>IqnZl0C@9n|2*n@|isYz%g_ z8^nrh^FYcDO11sSnjy_lH2{PrB%h7nNavdkV&Vc*m%Vu~ltppy`_4c6-4w{68gvhyVA&{!nJzK4}AlJg=E z@_INO|LTbFo^CF$UtPMUDdQi1LM|F+^|(v0f4#&3mkNLq3-9Z~;>CNMGTe6?OuH2r zZnnWzkoX4jlJ8b$K{k}HaEVI3+Qrp#GH-B<2lSRVn`+>Hyd;4Ff&cpuQKi5#Gm|qAA4-sMIU$t85sI z=yffi^C2C>Sr}fRCPvbMLLaW0E=3~#-%)ng>YuJT6~(LEY*yZ0Y~!R*%ajyfwI0h? zDP=(0F+vgaBUjciK|g#UHqiBDHNH>3KfL2>&6Fk88&8l&`(3D5(2XlMp@2GU;%U3e z3)&zPtfWOdTTI*Lj=gK$nD!%2v))>A=(*n{vkz@j!zQ~~47Ed>s8ZcUVii{pbZA?n zea_JQ-H1}+x=bc!2W_r_S@|+QtIVLc@mVAjN|m=+P^5vMWj!den!Tga-L|&si$=H z1uNCkRXp$^0VwGh^CR{B&JJqZ^#|Cc4oI-hqKWY1=@(L3ZeCCGg@WCGQI~;gqi`47 zHv5BDsVefrNjmBaN>}4K(VLHPaKnSnAT-W`kO-19XxaB08IYA zdSB%UdGsTa=nF-z!3gp{SpXCDr&(0`nRfZkWgfNo3zzopys8E5Y%%G=au*gFE6Aq1 zt=#w39NCvJ;i?Yd$6Gk5lEMgP^%*Y;ri}>luB!7P_`|yxuOIL@7%9qE)2<{f_u}Qw z`tYO~;C8AA70V_+A&m!4^Ptykr!5Y70SNbp;$ zR4Cgj&&pzGAeCH%o&6<K$3sPl;6e8g=(jxe}+-NpQ5Uy;9+?J#QbhdYe9xSFe z-W*>lCL{#hvjd0Q-CXZM^he`LTA_5-Cw-%d^VfhD3bZ zRCj}ECQyM!U3Ub8mLB6Lg#x{EH4f@Bx`)ZPU|tCk#Kni?C;B^r9~@T(6zWsIfWT;Z zjxG73{S7ThuSc|4X9{H#u??{{Yv-H+1%l#=-g@c4O66eBN@ zke9yiPypIk&O2^w)hF(IP2@{GyDp-`|9HNV6=RjM%bhnw-6QOsT%ezOkNvtj)b90< zTW~%t?UC)!f=S@Kpq3=+_rtB3O58||uZG(DoA1~N?xC}0pSBnNR3;1F{c@*rB1EWr z+S`JgbN11KV#>xYQuBV#s$rf2aRXrKDPaC!tA*jFU@_A)YC$(#+m$Mu)@l%Mi`Qah z#UH7Ne)PrkrBinQ1jAD_E^gN0O>4$hOAFyPr6Rk7Cs!bgUBvMOl2w-y&6XAi*b{|1 zSZ7e_8j$ zyiWhu0Nkfr_@-Z=zp_x~BkF2WL#eIm5=~lrkv8;IMD}^qVp&43FKkxOPv?U?trM2z zQ+CIb3}--{5ue@x(W5-?h(_yKAu~sSqRwI&I!D0uE4H6hoc&DXzSY!GSSe|MZM?%|{v??5p|fQz#YYu;l(&++1f9t}!MMK?>m`w5&6*|{{m zYj!_Ucf6jB{FSr@y)w;MsEUM2r-hF-?*c7dB=HHw{Bv*=XDUMI%b=7&EBE@~+QRmi z*A6j|=6Wr%8PaErl`jlSCWNVSxB0bfGWn(K_0uH^s1g#HGSNM3{@|24ohM(@^{Cy4 zX$?yU#~NM<9A5!rBaoIFB3Py_Ce)IG>%-T9HNW8l6jd0GCJK}X+uRHIwN<(S~5<+>x_B-@S9yV*gc!bj!k>nOAkn zX8LSO*};NGb^{~XuFKLsZ@`_$x(pg`f<;7cSvNCtvZv*#y*W`!_ZSwc??Jl`>fFyG zLY|3Ba+83Sgn}p9PKulXx*D(3`G@AIMOpzK#2Hq1v^tv8I^O$38aQXN`dMwXz`wK- zuan@(uycG-BiHYWK-U7c3E&*jg3~PKXP3#}FFo5r5nRsrhUZo|fZZgI*<}9&vPDBd zDS48Wnu;SN)AEGdp+I{7$XLk6+y9KlG`JcsaNe-(^9p{*wmwz9n&OzkWTvE#?G2vuH!hb25t681}j``uIbX zU!g!tGR3NYq$um=&vzF!oWj##llzX{Nm{oP0-GgG#(h(ju zX|{f|ALg1^5*J6Bw#(3Ci+huj0z2Kf<2AP#rv~4~cZ6Fm2fSV1#sB{5k@<;lJQ5Aq)6y5sTy!Tnv7-{lJ}#mEZ8>$*CN9oN6w7s?+-Ao^FVDb>C+vXe zpO|aR#o2wY$4!34oJjY;GmZb9!_0(JlK(y!c5M3!?ka2#9R}ei@0ocg+cI|~1@ze6 z68iJ$#H-ixRG1dR@yh3EIxV}Okgpd?ppi?QKZFmIn#8A!iY79C7Ah$?c1IG@c`B#uCP-fYd!~x{d6Cy;hU?baeVeROllnI5 z2}k+X)};u_4s1fC{a^|_@-f{ZFe$(@+|xPSTvCa{8J|p2WPoQ18z3?CTT@AYIGLrl zS^q}Df$H!WH84S?^~Pw;s+t}7Je@H;po26*S8Ct|;i`D5TjG?> z{2el;enM@hW` z8`29 zo*-1IG`OagUd9Cbvagb-Q6r31vPg0%9np$$NT2h9fI}WHcJ^BK*Qtu>aS{#Wm(l7? z0dYoybV%+q26Hf>#I1uu+D{;Qyner)jaE~5zd^qJugnhz+VJhvo_>-<=j1mjvXJu7 zH!w@5R#c<3-b7@Tt|0mqTe@waHEWw@n$mBj$J8!fhm1y$)iwZ$&H+i3izJ}`m{VPx z7%R%2i!#0a-QW#Ad{aZ!W1H+QeTR3#l?;1Z#!Zu=n#~s7_I=9S1K1}6dMluv;S6Fa zPG#Zz%%-xDV70OG{3IiC7=c1$WLx=l92(4@2yspp`3)Hwyy4ntgs%|S6#*YEeuW-E zcKna-StXqB{}6Szzq5$7XNOO%b9C9$WxW^_dy=Z`$Yr0(4!ZN4^V|{vx zY1&@cmt+Aaq?$!aU!<^A^9?#4@=Mifv0(%UntQ$Gv^5qZH)x@K_(?(rRNJ0V#=PD6 zxpqwI=I7#z`KGR`Vy=I)U*F)s^}pnYCSm((<39mnnm5~O?1d`X13XrkOUEP9Z)P__ zPh4I(`;yiIzn9%VF72s(^7%aSS=?i4)EiAL>G;4&$;F9*A3&xo{@fd8m?Il=pC%y8 zmzPu60s&(($F`{WW3Ie>rqPaZNF`HqA3xg+1~X&!3H!3 z&N1)+Pps1~D*bW$0WtCe{%PVA>TG?XStc<3xj(bFA(3~ zorPR-FNPAIi2+)8dRgxQZrJlb9e_@f%1mxGsw(@^a)*m6?z3MS zVqnRloSHO#LuIgj^W7P*{}C+t18si$4lW99WZAIGKUgfg_X!YoRaj>c)wGs1UJD7PlwX*HRr=NxhMxiKH;-NcgUsa-_AwLNZV5E$RZula3U*+;A)h@&H`L%8^j4L2Kr#2 zr&CD`pErSN?lfid4aif!)TSpG_S%J(fxG@=pKU+fJQ#(Q$8itxn>hq`OH*;3o5@23 zlcOT!!E~fgWB{*G8ZKh@6R45uXb9oBA>GnIgX~!mSg^& zS$Z)3Qm5swX%agYifbO&)?Ysc%>5>mhfBPjbzdi(L`o)~s-t79t@_`g`v*4A3;-7L^W>~Db9+{bpZtf*mc-`>D6bX>qy^MFMN9G^;7{l38-)LY!e;J8@zfhHP#s%vL9!Sf$$ix$ zN*YoZs0?;uQea1Fo)KWdaSupYOl5TrZ&N;gD1kQb#)_rc$+Mq2X!?xz8vZqS76`dC zR=?}Y`^o>lxTn6?hQvW{gBBFz6j5+`Xj&zg&6iTWXi(BKc158G$a+4iNoOfVKNrlv zy*K#+m+`uNDNgF&361l9eNdKR$#`wuAIT&Q{a}ECh5c3go6p_@;AXns^k2kV20y8B zp@fkn*k|{eL`9LBdJFSIZm;AUo^JAsH%-{ZF3s_Zf7Gb1$YpwP55R$fb>8~%hDyy` z_3i+#q;~WjUXv3m8UR7s4Jll)zK4SA=l+6KI0J9Sy#9U<5A7a{imf3=+1!E{pnQKU z6?7*B!wz>*sK!gBRq+AgOQ>M4)tSj8-I<~=58wM{p1BUv#ma@jLH`X=d&2k~i6m0`o?1J8X}@nH$!1Pg@&_N|YPiJRY) zq>Q~?;X%tthgTN^m*S*>zE1Wg`=zq8gZrE|-xjXG&To!B0M@iab0) zE<>}5o$kvPO%_k(AF)T*gL==$^&G9eR%L^JceT3@5j;R}nRL4BriEHa+0LWiFUvRU zrzBe$CWPD*$Y4bI0%LnF$!l$ACcWtt64{Neuc|DJ1MEU7p$*Z7yCTGfC2yn^=XRgX z#MwmqREW$uzm*Aa#|*3x&ggB{wOMTlO84xNlQYx~Jz*lhg{IpzYVRj$w|-9fc0Bx! z|01Q{KH2K+ktZo9uBtP_+^E+?S2E1=O_g;OJ*5BFt|l4GV>52xzn` zk+*!pR*wIU`q|@Fki$V%z)Y*M_gE@f7M_fxGxJ*y5D}2~0vxMWmzudD4z&^!+kDv* z5&P!DG0nZb06JNFL(}bzI zI*eUCFas1H0)xxGU%5YI4>o?T(39+9-tYXqV&}(zcZY+$+buM%&yg;Z(f=rIv70T2 zF)*a8gY|VG#?;F6u9e|%j(L*MtA}d z6puIE7h6bgFQtWbFw+;4AZiJojGq7@U;q`+rMYEWFZ$1X4bg-#V!^fH+-prtNjYxo zLrQz>RyRP20Zh%7LtPxa(10y0HaeW`B>mmu$W+3Lx61LE%!OeZ>5qb0O$d??2P)e& zUw6l;kop*;>+uU}*nHk zT1V)Mfzp1d8}RrY&!b?ye*oSeOr&r1spe?EH*=wb-;>lDAsgQ<|CTn1qND^xc!}&B z5}&i9hXbmC4g;ArS+m}DXl{O1W<1E7`AK~@dp|RY4;&8k&gvUT{t}g5>YtDP?S!Fy z9I5+)?z>jh0)*GBm=CQL%{0eauU~wHw;*n<8(z-7)a{1fd{SQBXpcDubmDg)kj{fN zgJq$?PHw9+vl?n(#F-C$Uu#d;!m>d;_rO-vOhL0_RzPIMca;Z9R-g+-^$ti%Y(4eZ2@a^aZ}e@G+IY3(cVCr?7Sa8tExmbKi9eI#a&E&8(AT_&XjG+bRcLAVq|A_r@GpvtmFR|^x*YM3ALT~!g_|EH8cOS_uIUf- zzBghGy&!4Fe)<@*Mm%5 z%9ejajfsgOU67wyxU;W3_1;zs>ts14F#qEm_bWW(Ncom@R;sGzan`a^9| z)19|G^&aoZE66R=Ynl(awdT8H1KGEZ=uBv>h8589_Jh~qbIX4Lp_FQaInnnFHABRd zZrrz&rU=Tm@H5HFJ7sM&-Df%&1$Gs=AfZE{#c&_Y^}z$ka9=L|rxF~5C=|nE4w3#A zfWyp+E5QQsXhoh0C7x8%^sIhT|5Aq70muY85wdr`*F31Z(#!2DglaEv{odliiX!em z95o=kefJlmy74MZ`+t6qzU5=;F1~0z?k8E zT{^*P+T4?bbuH=V{jkIjMFSq}ItOJ$Jl;n@&vx6Vf*atSK&*A8-#z@;U z*8THqR5}rzQ70&6dk{5Pt?byYn{82_x$5`h#T(18M(+C14i3=~8Bgu>Lc$V$hNjj*LJ15GQUU7B$C5?J?QBUN_+ADUNj6^XAw=uOKguTr1p5c2@3;5Ux62hf za1Gm3lqYI}fjxC3ARWJ}C|i+}b-d_Jl=7tZ|LX-XG*o+&V_i(rjcNgDOZ{2hwWanS zcw1O+w7mvCvw!y(%!S^X zj$oPGvp-fmWJ|HU?M*d3IEkukOCzAYcfsFS9rw*fN%L>_6cgu@kQkm6(|_lt@*Rlf zuzgE0kSigRRUrUY-gRM(Ax(0C5A^^pN;n_1(em(zZu5#Pg(JCOkn8p;15dNP?k#kb z7zl#15=5|^c@Wk2`|#!T<=z>u28=1U9o+aZKaY$$XcQ+R?%!S&3DWYe2W4r2r%HwS zL!yE6R9#Qaz|boBh#^~PbV~2Rilj2hBFd)YrjWH`kjGGU?MptSP1}=-om0x2VYz)Q zekSlmEX@@1#C77R$K&ibC9_f<6wn`SvO7`FJ$!3)Fog{iKgG{itAE$<;8ie}$HI$F zNrX9}KzCI`=aU!z!qw&|$PUUWkH+dQU!w3q^K=C^B{DrXOO2uA#?D<)P*;t{hc2qF zZ*Fl2H%ZOS*Q{+dpi1W3uWu>VvXSI^cJSl{`)U@BTuZC<%J6rxQhgM*eVCPSRt>-u zKJPMjo@auy+Av450K>VDy5L?qep+QcVp5+79xZgEQKiBN}ixM<7 z2Z-l7z9e*Xrm+$GoLOBg=7Gl&h?oST z7dzpx*Pju|DpaJ&RbBj5c7-plfa-Pf#h~DP7SQ7L*OZi?EuOoV)tKSn!rk%wVXrBo zCD5e?KV{?*LeR{{=A=XZx((Jz^dN#`kf=yLKCUx*>YOXZQ|#0?wMUAC%-{JPa^@ji zNl@u=X`f#G8Qf`Bsv}iHlq<#*`P{vjSc;T=JRhongr*lkr{OK_+5h9{$fRaS-zyNS zaX%HcJTaTKnnkPK-C`Ur;oEYjNNp1PC7RsF!Mo4Mqa$cn#O5st;VgA$T(o1ImXb9t z*;a3p*bc6f3^Bz@mt!@suV5X!nN#Vkz$0Lzx3>>-Q7!OMaASn=iHg76T12Q?-PFWb zFvUS&5*2U4{v~?Cmc;53U)33!S9@Jgj_K7_YQ>7NwKcS1sjfc2Nt_-o(O7si<*qK9 zDW>EO6ZUzGq?(J{^X!{}yAJzf0*N9UtIF<0J71`2@l-Q!6BHY6LB`R_sM$a-{jl&`Z z!E?iFVD1Y|@X3dO?!cKQ?b7Myym#Mbw0XEf>R!%jgzw(tQ|jdumE7SMAb+6rF`o04 z!ZoUR1#Jf6Dsy}zzygaDQ`e*v_n8rHP^D4_Mt*RCF;#sc5phhHL}t0UM6*u#^M(Y3 z1$FLbZRRcY9ngo@jopacSj47Y;TwFi%p%2Ywkjutu}mSpC-EKrYyM4q!ikV@T6$Oc z#uuv27MBoeeK^~QfI65{#3)yMRV*;+p(2f7LP$rQ9+|vhbU9|QDmvZnTH~PP^><)WUr8I~McjwqVGC_s zj*&;y-EvWj#qjJuAay>zo1S;CN#jJMej&T>a+dOmbtr4Z@vEH!Z>{*cH7dEZkZl>KK9;DG zk?#iGGnUmeIIs6rF-GOA+}698=P}NpqpqaFo5eNRU3HK1eOT!1fnevW6RfmTgKEk1 z8j8)Yg$_aK-{q#lO5Yw3sKI};x;`!%sw>1vCy9{zcrxx(D0Msn@8Or`CBG3UFR->a zV~xc17S%>o5PheEV6nS(r>^abghtx7rI;OQlartTI{Fla69lvn3AYl|6e)nMu0tbM)~-tyLgP`x;Wbwow&WGDhe9O; zoS9%Mt)=!Fgq6PTN`@^GWkSt}I_T-g>zOzT&@pjbp>xEf5dMpj7@I))T$B=$+3HA% zqo~_B9gT7R48$^FJK5M$Vz72(X(k@3uP@3^xu`sx4Y|!!Hh}`<*54t$U%o}#x;Abo z3?(ibwNGRZF{J!%t9#LY2d1#^8T7v)jh*7Ybl*E~&em$Y#~gI}+!)_hNn2?b4g4?5 zVj@s2!&rea8zL;jYurW5-BvG7MyE!$jeG59Ml(1x5b@x_*k2$e@80u)^+=pB*VsdG z{;_uipxpb2DvD{=ZcN!$w0PyJ@F}fiPM=-?^HM-){STqjK$IV!0~M)@f(-VSZHHCJ zp;#>B=4F`GCF|b&Ejy33yk5GZ8@6(RND{%b8ExvXUkZrPVxg?&_T-r$rFeqP`&Kua zEp&BaMPx&Kpe!3rgRzRI`sROW*_^NYP> ziWf&Ia|1Jt8H2xK_w^OAnE_cRH@@% zq^9ZsP>J?$gNVFImQb&JSjOgo5n}40$w%|2tExylVCI<)4}g%uMkV*_Vsd}WVHWhG!rAbwVKUDfg`O$9BRxx;WmN)c>>njPkq6W~jM1otr`Ltk}co;!=)@&2foZShdY67q7QtrpspWON_2;>9OAwYxSg3|&SRh1 z?~J{ykF{?GU~Q2*A*3Z?p|76hUpq~Xp0k-vHr8$)LkiOcuG133@P|x1$w+CMfs%XX ztcJ6P5CWH$Gmd4n8jviNf+$Qf&Ad>a(|hs`KjsDLn$X*72iPd#R=*ncdC}E{FsRec zDejz4;d>W)x18~vYqjC0n`M$_=PA;e7nywyeWZDk7SNq7Hdgr)z*nsJs~3h^^Q7(W z{J4cU@8mA&(9~}Cnff?M9Tt+Td3EK1WkKZg-axFY8i@WLcnTH_Wjvfj1=2V;Snf_! z3tH?7)zA9jrg4F@MgME_8%x8rqw<(Mi4;y%em)g!G?h2GpR1pAR%-jf;#Bf_`9;Gw zW8=k-2W5EEZ)5;o+U!-1&q->t`aXzt)!?l!cG;;u`+-~r_G}fPl)M$1Lpxs71bvuv zAj3F&mlqW;qX{2D!^gyn3#LUhx>HJ;fr1s(A>Rog19JKRgma1%iVAMfw`t;g_;Q+n z|26W=D(nzKti3O6_d-lLAvY_2vx{^$`umL$7v8GqpPWtpO+dOcqDq%wuia$h=sOKP zCDQzpnwi@I*Wx+SM?D6)y$5j!0rAe%Jwi%Agw`O-g5ylx;fk!)N9l@`HE$E}nmy;; z(jK7u41%i#WMk+)q1O`p`C$A@%kLz_kaKm8=~uZc>%jk=k;a6V3Mb?z6zfnreaiD+ zg|a4@Gdj9m%{baiae-Y`3r|IJTZ|^S-`rutJYu4~W{tt;%w(BfdDjrbgu|IXr~$0G zMTzrI_gNl}UzD z-I^=!j)~w@_hk*m@Ec`QHBBs)MzLE8mOhfwh9zIpi$|n#2hS{tXgHSkFyZPYoKlKb zF3Ixw`;1S_c@s&wOj|R&9#J+gH|>0#SnBLa#iz-L`qO`h&V9#ryToDey~(O&Uz(kM zixkZ4V~zjU0S!q(%Xkfm6`~3*C!Y!;3!1Lpg&P~O{K}VHa8MP$$ zHKNvm-K+*gW&s08J8`OmO>4CBTr8mtu{&Y>`74FB(y;tN_UvG*~k!e@uL!sF8QvY zj8ci?;weX$GF(J;mo0PC*`%vAufB%T1ttf)#NOGoSSox^47&JS*>y2G08VvJ&375O zZ%obG5NCPzCMO~{NLk*RMOi8CfUQf;JR2!ynbI<%`oE$6rAAfA%J4qYE$BswCEMrg z@^f#uOUaKixF5B{qQj%b+w@21XLaDf_7Wo1#@uL0I<8ZdC^z=PoDk^gR5mq6SfVLD?|^@0Jd(x zkN+yJ&Kv^)Nk3joCmM~<;>Wi-Pg>7wpHM6k?5zm(WU`CxjTsm6H2YKU53|kcjz`@~ z+ZCDhR}c>MUm5JUdk;s23)w)A21whP{@WUMWFN7&PmqXPMA<5{9aqQHq8X*&Gn(e$_XxgJFI7)h zY;-AI5TF8g{x?zBcNad;=iP{EkN;#J`s3@4t`~bo<1g^!$O~2JTPgX1*|%||htSY{ zKd_M@!E)i2lKomEVVeFmtzsHgN!lg%>J#8`Hxqv{KM83#y>4VDvwBZYXR5H372lFr zRAG|eueX-K&Re`HHuNXOFal~PUGxnMpvg4hprk2YB0vlscIfl#pJR$wW{^%IzENg` z)e%|yp~1erq|G~4VmoH4uQ}bR}~#h)Q_AMbNBNXBch! zseYA^VR<$aX3D=6@xBDt^%Rzd6F8+tXitNppKktwhVjT6I?85ndvY()xqoe#bgfJx zP4bLS{N>*$5xzT32&&Tk_cA>1x@Ytx;TH!f^s*O|23p+JvOI35kH`PjHfVY9(|uXi zu6IJQ(dG`YcTG^~J0k-w%P`t7@t9a)emH`;aMisdODc|m+4>!CkLd$%uirL~TX!m} z27Yx>@s^Hj$A!=$431REqTx3)Kw-r zNqCiQud-dNE}fru%d>#Wwgs9mIUUjr;qi8P0 zNbdC@k%s0CT?aj{V3YhV+ks~;3a|$_(Ge{7LMv;NkzyAZ!G%5mSz301W3)HDe=5y9 zOUc|L%a$@LhO|SsuX3~AGfC}i|2P?}<-xZ0Ye@V;cpa=o${`56w4fhFkx#M9d+;k^ zOJ*pfp)e-p0L2-gptLg5c_rmkPqn|A=uUGl;K_7sCfRk0i6ER1nkOu{EunuIH# z6@+%v+AxaZ7C7oXCIUiJqF6-~S2L|#KTaKTZ(u6Ep$}6eWdVu(!@vqAvaFLI?j25Y240?rtQcYxDp~NtLhC zIZ`?#WOU~Ur5gbi1V(qKv?w(?hk%S8H7@?{y??^BiBFKxt1)||(nhQ8sVO<4 zmJSUi5}wiq-hEm~kcg)82d=jE?5brP7S-dU+(QoBf+IF6P=bKQ{0Cx$sGAK(ra#1O zhLo2f(v@}3I-eNB60pAH@uT7(D~m-| zBo*1%81e{P1%`TBag6#$qWk5sULIq_I&*WQvj3)&x4EobY0gCqAc+q1^cUZl#kaK` z+ic(cG9+og;8?BH4TQq$F993?eV8S zeh02{ql`OsQ%crq0JS|uBi?IkhM19~>`~pcf${qBv|jgu4qyAG7e4^^o}h(JKrt8_B!BY7jhK>cCIQ!(;0lO`aDJFJB0pZHd;nsyM$T3^~;m zqnZ|uOWdfzV)AqM`Y8gXD^{>yDns;RrN&r(&b%Gy_$crz2a-(A0w)oNR_9jjw?F7v zI{)LBG)5oriQ7Lni6A}+!4>qxjkFSrN;aY;mqBG zQfnUKA(1_tb7?2KU93Ks9eUBRE5gjBLpH+#wlb0SiC1ja)B$sHuJuP}$P43b4l0>N zmn#`GbbZF$xjo-hEMYx<6yg+2AS4hIqCW_(>VE5vzRg_s1rW_zCPl?-M2yJSc)6zdSt&!TKd zv2$r=0~mFHu!QQfJ(O>Eepmhf1~$Nt`XVX28T=bex%?3l5$(zI&skFq8-HIE%S2oZ zq%EpF(YF^Z`lL>3epn&UhN4RPt0c^w&dc5|r0Wx8D_-7Hb?wW3LnY4b@tZz^$D5B& zYnmz`^e;GFJcL$pKLyeNrt4+YdW_?k1I+I;HIV~VB z+U5jl+-ZxJEl{O$8^VKAy@zYsn|YnL%7#MBhBCeHyxsuvHm9VXSqP!2*Ovq+?=7f9 z*!aYf8`4jxoR}9x2t5SoxxmrFbhT9|gsXw9%W3YDX@D;v%VWLVk3WF=cA>kQ)vPVUH2)aB`c)m#8>5;#_s)eUAQbVt%&8PouZO>=?8Js4b@)RHN75EYR(bret zxpoomZR?L?>MT4=He1MUA3AL(2*dc*7mlahXCK~n9Uyq%IhhYqO*|O37kUwT{ zkFqZG-DqELY|ES2+$3#zsHqPIKIwMn(fq51uE{J*!|v)W`*$|7-tH+ICiVBKzUCCU z^j<%AbZCt6GEbxeSbyf_q{~N&~5Us_}DNgc3Y;>=oetBI!;9TE~hP*iu zz~nvLPTADI8`-si=4Dy1O-pyAm;rkOrg;QJXg0uhQAR#XA9}CKZe%&9>;lgPh;EF7 zyG@i51#o$9%$_3q!WLXmnTeZI^dU4D?%TdUGKGa!D?G(Ug13!0UXwnmKdkOA7z^QS z^)JAby`$ZUEOV#DGF~fTS)I=q8_AujtZqCDp1AxtRds+aR?xHdh2;MWwt4#RxAv7X zHk4V3kIl1B`wN5qispbxMF`U#NH*CwZqJAymQ3~sHi3}&I5`w$PInu9iyi4SzDIDX zG=HaZDV=H_SAm{ZKYo@jr568L`V3DRUM6_6H-@(Iae1bLyZ@D})-oe+b4UErcNhJF zx++z?3l&P(`x@nsgqA!i3T&|}*}Um6JJnAW%h30~5slB>)Y{q2<8BW>=f9(=mdNxO z6j29(4HXUYycI!F3;|F4t8qWC?iH0JL+-JPWM?mHLoZVG@g>driJRuw? zj5++PgAYD49lqf5aLS1_*c!+8gp_!$N9%9`Ok_Z|#$7jbsp~(W-!@>{KXI<9dn>oR z|8Jrs$2?iVYqT5J_)%jc_hSWwd$xWdcj(|ci7vv3TlmS3kn002&UD-lh=r)+F0tJM zSNGrm(V}uvdY8%}iPJifx3P%uqXajak3r`Zwe1a?iZ@1+I@{mGak(LPW_Q~5U5N8c zQ!KjI1H5+~__0wvnUA)?C4zUNozr{WH%VnZiLm_B>*{$+vpc7td{=ptA%86||D-)IWPt8+-FQqkcn@U%J7wlAp8 zdHVE)?7%ZcZDGT7X^h|j4gkmyE5)u#h6Z`VDCQ5K%ExKszaV>$4*jbG;W1u%uJBd; zF2CjC-`$y#ZYU7dN?xy2{C8bpUk(2uc{(05*(sXD7uzwqEc*;r4|X;Va=$4s>&}J#}ad z8wg2FByUHJ&5<6#9*dWwwfW9>@n(m;06wLV_Mx*(MfTjb6Y0+t8$gx3+dyHq=7#3{x1P0m$P3YL!VB^O2~+nNDXKfN782 z!<6$GH9!#4i?N7SkCr<=ZAlZxI@s;SsHO#R%obLAvZ>Sa5uJ=>dG7#eahT$Ggd<2u zq6yo)dP!CCv62IltrxkVsUKpk7QY9*&AIu~SWQT5@7Y%p6{SRjfh-<2(uOMJ(qc~A z=tLyYGWbpdKo}4b6mR7G4b}UrIG16l&%fG`lX=w{yZbM;SJHHDIbT&S?(1cV8gDSA zqN~rityRA75R9_l*44N_rE%KhRT zM#^nfF)`lG}TUX8rJ?HPE1YrX2{ao!Uc_K}A zhpkho$IacqgYF7^w?NS}zT2IBWM1tB>~&Tw`y6Ad(q5fpzfI8MG|xG`Un)=WPo^zq zkluiXddNN{>1~jD<^k4B1cnP|gylhq%gimh3wsL`f}qpI;PGvsJ~LKYO~hF^qE1SL z3p_Fi8lwjDYA{3L+&`^Ti5cj1FnqwI@9VN%V=QB-mxEr$93Kt1>e8$v*C_lO%`B;0 z;xqjTxjY=HI26aoV@xzc<;4fMRe2x%e7mGOIT;11i;H!Q4}PNH8a1SNgA$9ob1lGV z;lAssr=@lO-EZt9eKbX>zcLaytR#6xhV?jQ25 zwU5H}G3tmc7z0{fhHX3*5z2qr_NhM_!9^xMOrzo$lKe#Ff%fLkqZ{oM!}`l1C(6{V zwHA5G5$Z{mA6~fCvtXOJFW2G9_GBHaiIj8szZf6BwyxIfya!qvxiN?C{O*~5351at zZm=t%?*kPN(yw|ak`>-p)r0M9Y)#9BSW;J}Wo1})!bBX4kw9D*?r{{btn3<{WW}G< zQKN)b>Vpecjpo^fvLpMzl#3ZbE)hotL-p>>FFF>vPx(c$IAb5hU_?B{)eCx}oYMPP zt(E}=xO-0TC+}cW9P3X<-hAq2qc_A3UN`?hmr_VXb!=s&6t-4$yZWd>RouhT(@ea5 zT>o;EL`Y@qDUK%hn8Le3j}3CDfP_qLG#QmiR+C17PtGG1pN`cLO6dbfz#Tqa8Q1=N z5ao8jX#tmJO!4@yzud|nG^}p%c%!uG$^Y0Un$@Fh1lF-qT$l*iz|9_#(S!c-D#Jw^ zG;=?*-OJ^!5&zTJXoCfvrZ#hTAK0s7NaKkdFoJ|e%q?KAM_|2t@`RBvcFSMMV1rSn zdI*xSi~kb6Zz}h0c>F0NVBoWXK*^ihiRf3{tvVL#$}xyKy&A*|Hql}^i8GZE~;8EBFj*z4x23~_RP?vng=@!B^Jovo@nXtun|Jj zq^XilFR1Br8zxzFeK3i?ZH=;5S6>%q|3boLe|*WThRD{7wazzIOA!^_5g9}bbXx$| z(K`5NZO@`(odk@4=aR;M4+Z}>&%--kA^WmB?one5w2rK~^38B*&V2T-id;vwGq^w5#dmM+2o~H}<_cjCW zK3Gwc`h-2`)>Q5Ad)53Jxo7vR?}9b0hE}#P*LTT zsKSxk_}{y+3Yb#fht~AZ50=k7y+XATkKW6NGX?C1a*Q64xLHFQ+%S+b9GTyz4BW?o zbvsYuhSOlBM^=ve5T>5Z6Ij83>RC2!Pf9;+m(Sk>NAR^Z7<@|gf_J_7{2;>^0t0|g zcIrc{p*0>uvI}cuDZ-*fVN6&eFKuRLdR5(*mioO)T;PXOs`7Od%V^ zieED;@8%y3e&2`PmbuU79sq{tl3(D;QfhJM_rgCcPRM@luZ~5|NtUOQ0MBUVgpPa` zF?9RFtqt!zU}Q%&+(Fqg8cSPoAtXx;abR6diZip8SC(cxiv9R0=> z!uN(JSM*GrGl@geZG->V4ZVdkp*4$bwo-QjXTBDYobksmi7re|SaD?q8ztR+m zJXhoMCs#o;kq+hI7`kaoW=jQ39nI{IwU?jYh9gKG(fr)aRL*y=s|1fb62S?&!sjRK zER1cELAD*imoeSfUL|Q`7%73m6vdAMUw%s}u0hWkLGca1Ue&piqJ*q~w0M{D3BRY| z1oo0(tn&_7@p_6PCB%_7(6)?|{7KdtE?$PrK`VCzFxmwgkD$6P{YHDDFMc zSj8PN#NL~-SekT@i0jeVd!QZ!3dzX&_xRvzmow+nhU&b_gaP*86p8$#hW0aq&v(}u z=@5+pVdcR$?+9TH*%^AD!F$g_Rl#{MLJ2R#j2cS^_t>8Iz_YEtlq<=si~q8{2C%^a zxBB6szDj@5o+BG8|1{gR86^|V0~1Roc?6eF>(r$#nh}Y)m&lazyyc#xO11J?@b44M z^ZPc8%ObnrwOAe-DuKz~m6bLW?WGXw)XDwfM$4h78VccfjWw zG34IcU3B6m8>8b$SON_L;W`2}?#IeR{$5ky6rj|(M$ZY&{zwl_CcI`bBTh-Yl71BY z6re-uD&88kD<6G;7x!*s4)8QYjU;GxrTQ`D3c>e>W&c$OFp?`uH>@cY=7ooO@)WAM|reG`jvLX%KV_i%elvox1ur8C!XQ=zIj!%J=*x1Ni zI(aWP4X5cs6tB5zZ94Bath^UOFkBi@#A%i*IcY8#Opr<9D<>#!mPLJ-Q ztrE+K)hSduqv+2^N~eyfYIQpu2Ms%n@3V2kv<6K!1bw=wQ+3WfKN9B(>RjyA@39ZaaG1#VGGuyqQ#<+;6M+-#^2{CpJXbU7aqKT~h*#bgO2qN7|zK}r3 zhJd)@?zykkn`xxba$P6?Di&Lal5{e(s^|~ z*^esM`RO2Hjna`dvqrPZ)8Owg2HzD9RA2w(-dzZFP+|?8G*X6+o!ijKo!aFY|MEY1 zE#E8|ts{Gr#KKA&C~~63z3rQVlY%i5)l|D}p0P!B|3>;me=#5I{UcG zpGyCn!u~{%0Mw08v!zG?MPUSRkLjeOMpbxlVi_!J^a`&{!qt;UYA5J(c&Be7Aj_08B+k?O|lS4S@RL3I%s!O1xGH;tTaVjKN0!}QkQlt7! zuGgE@UeE{am~F~T0aiu4eQISLnq05WN>~eI^IZoC4QRgV6~e*ErDAgFaKgi_5@ult zn2%~Y`H{S(135Lux|?;tylskMLfxT?K^rySN+FXd7jmNUM+#|f&2t7yCKf8Q2BWb= zxgM(q`CSB{1xz z*kK?G1?j4UTyN?G2PiEQ1(?|-f!h7+SHSeU6}9BtWdKUX$I0qgNCsm0xKuImHyy41R+oj%E6$t>xg~Dm@B{R0*7pfHt2P4|2;*sHt#53Sc%U{~G>a1RS5-{T(O0l_uDe6Z&U}o*bDsMa9(-E`2E{P_kppM`ftYaCBmY#@eg0PymJ<*cl9y+dV4+GsdY+a9lTHrJN_QL^rv9^pj2mJVj(<3j(N4$M>sJ&OB0A(?c&OYy)5=!Uu<6|DN z$Z;S)n16f!I51!A5^;ENfzal!c{s2m-zp4T?RCFMPjz|PMss)a0T*Cds7nxY$;F4e zDuxhwN+~7*b0xQd?_?~tZCV+0yiaoaENI`=N-UP{iH)iiI&<(*cx|IqO6V z)KKP_O-rlfYcEy(J-j5C>%~TFo_IF%*N>TP(hff1ww+=v2+!z}=^}cKAP6HaREg)B zI@IHEas(^nnrjvzdQ1;xn?^EHU+jr{wD+ar}nV#6;sw{l*760 zJa@BB9{Si|W-xh_lw~CgKOtkZ)-#NDjZopTbD@1YQ`k%B;T8I(R6?p{%R*k$NHru4OPXHNb{O9K|;zprN4eyYZd>p$J79Or!eB zUw6fBnx4??bx|9!SST3ZKaUG*FBAKFY@J*tM@d)$;QOdY?hf_4B1DW8$7!ot9#}h! zv2dl1C;67+5TvD~teQcWh*3Brj~^$*2r3Rb9O%Ky==U?;A?qZbTG;Vc?s5UtQMo%F zr2NJ$ELpX)07&<2uD$2PJ*iA0XJo}VB~g&tu19}7dULrV<+DWCy~X%H^wv!6N~!^O z96S&g$0NGm}#pw`!_+i@^o6T<{GqL`Wgd$eBNN8}b0xc1ycefAB zu1yFr#qKa+b+QP{kr#jUXi@s^hXjH8ROHjS^!;ft9%m1U?4?dyfl)3~m&yW)s4LN4 zX7i0P>5>bF-ZGNe{mYO(WLf-o=yFH-F|jtuoF9#l&PduYUWRt z^!gBqrI%K69Cg5rDY=0Hf;!1w6j@-|C4D1fc`8er#d~H7DD9cY*7Piz$}ST7 zIw5xU+lmHfh35CGM7kpWwRJbkZ`PEcmRq95oR?a}UlY{h$?Qj>TPrub?zp-jxIN=G z3HLH0Hb10&h5!%j&b@QzxC7ov4{nTCb$n0%{%;DfVgzc_oRvo+7`~10;ny|<^=Ml? zYWWq6QWX%8e4v65q`aCIq-D7}ff< zd0}uR&}(*R01NjybkvdNWB*l`X8@@Zx0`-O-NgWJVs5k8i0Y#oo=9{!xwAEtyBDq# z|65h9OEr#u^o{R=cOH1yQ)^X*Fo~K^=??!W_M|y#Vw@^sPqqlLXqBB$Q#WqlcPiU?Hb@MsizX?1pwy2DS zMGG4h-c8U?%u$Tz2G!LU9ksc7#WOIQC(GY^oCs?iz$#%cin(w(Lf%*VjL34iWh%37 zOYk`qy2)j;z(zgC9M07WEZ9cKSPy4f83$3`5e08^l77=@5phmyOe+c8X(@>OSYYxA z_GAQ`R=tYqqLNhBtc7OB3XSbi?pe?7*EI`?Y8?l=FKD^Yxl)Uw=p^KQ*grdOv#(Gk zEjKt#9Bxmjud@pRj4CTBI(pdCr_71^nGy&{7MF%b490tf);Ul<*DPI3USHSN;2MT? zRJRMAT(bM#`-+AbEqlkhVU|L&38C|qsIw)@RUe=dT8O((3DMdkU~&YTt?D1>SLb!t zwa3qoKu338t{bdC;#a5otPH2u`>p7?zPlG-M{$YS7jevSRXlS_{{^>N$r zg1w>Shyo5|JY6vRuU^<9K*m&|!FV#iqrlr?yyglr32x`?#w_2f*ChQkwf;Jr0Ksmn0tSLV` zs7ljOu0kVSo8W;{=-j+{lchTAtj=ms2`$QgybFK5t+PH80F#awbbS^^llCHcG_2`O zdeH8`qJhwk!LNJxKGi$dR`)gGJ-^4FA>fq~j8%4U{Q0I`$=a9W>yW#IM{+iLsEO`0erQJU9xySQHx`unE=C3-t z4;-Ss3Owh?IcM6S&C_tUoZ>qOgt)^Zl#G9 z;)CZaHUPXlm-3+zr;osr!=(06C_&{4+3UXjTgfZR4E}9H?%Pgj4^>wC9zcdnp#hNE zzquSxG|rCPRpr2gj_MFmvJU1X^-b&qO#Zy>56Jt?SvnmN01OqsHM_a83*L4~ql}=v zv3htq!CQELIyhL-a9==jRugQW?QaXTx6+rTVA277$10GY_KPUjSF`HVDV8D@#-y)y zDHeCqYG~lMvt7V&a!RZ>gBfd(KI$ZcSP3jI-va08`Mb1l zsOr0=U;4UuvHdWSGcW9;H3l)}ooq2aAjmcC)`4UxQz0HU0!#ft5Ynxcul7hmrJ`*1GYXd}@7pQVW8O^+pHg?nwmrBo=H7;}>UASdKCH&EXVzu{~3?Rb9Qr24-~MDa&I$GYU^T6w$p9UStX z+WmcDdkboMukq_h$VP#Je*eJ5O{UP*{XHk&ra3a|OaSmGb$U2zfbC$EA(cH6@#5Dd zKF+if_m5uTP4?yq0^_fV6kAGjkx5M4&UM99so+(+Y4ZZmIM8pR0&&@5dY#T%Tdole z0?KR+uez$T7eF1r!&uM&T+Bj}QSy$9nZGA(?g;N8?@G%7MB4y^bdnWM{{pW2jbFE3 z=2ln;m_cUAi_x6Dcc6)eM(o;eFlQ>K>UNn}_x}X|Yap4%Hpn+T{({^-*XNr) z5iH+kS8#KhG;Ve23&T{_>uqAb3>()k{*u~KXK9$tS>|d#E}x+^kk2wXdkk^b5F6H* zicV{Ec6QMMYS=V4GR1n{op{xlN1lnS{Shm>qOA2hScx;`&=TUGHHf__%v{*h> zDm)48dc?Szsw*TPRkvyv?lC2!UWmZ(_Mh78x5I1pUEzrg0c3$q2d+w3EAw{(wZGGs z6|zho+5QFF!w69GgkmdUWZJlD7Ub-KPR2pc1-U%-5dUp+e!KLII;TaR9egAzgH3F? zXcjl>6Qn0hJ=rFM;C&NMvfU2TS{VDcSF1cd9P0rWU;#`nLS0eh8;sUz;Y|j8YHa$K z2#P{}C^%teE87iN@0N578g(BN0!`g`TkyWAx+v>s;@*r3huVvi6{-0 zM@Gkc_V{p?z<%3-9y`JAfi{xWch1R*@b_JCmJw5qT;N1;ss-uXD3OJufKCS;qQeou$VR!oPJ05A$3+d4i|~4K#OwOQ zC3cx^?cKZt?W5r*^F-xroossFoa-xcaA6zl08hKNpm>(EoJTtaaXgQ5D9}x3=QoA z)$wk_DF9MyL-;GH8G#jf&lzAytsTXmsIx2}^JgjnqlCv{Xz(sPx?=!Lk$j(`AFL3) zPZ#g>*;HmTw*L~3HZqADTZ_ZI`oea<2-02?~^RI(6_*FECp#XsmL2tPnf)5lwbMid=vdasgfG_4=4fml$1LH6BN41XjbSn*F~${kDo zq~lgMG*ffPiip6W9b=(Q9Q~l+hAGVGLaNsOi%+LnCz9+Fb%&{Wu%a-JLg3}aZsW&)#_?_B51-RI^a|ToRT>e+(rqN&FGJC)1 zFw#sV>TiR3gcj_`xwV7{97~^rNr!FJEyb>AXITQbq~0NyXV&U+dDzkrO?W<{sbO2B z`4zXlyV{DVH1CkS+dKKg;RMLtDJ!vpFlwVr5%N%YMBjY zZGX)~RBWZv!8VE{j%-+X^Y#SWj0(hb+75 z`S9?A;j#MwOh{_L!thO>*QzCFB=BV*zEFdFZwWA4-_ zVSdXeWOG8a`lnpXBEGe!ZH|&q zRm!9RZ4L??6$!5J6J?6hsT(Vs60#)HG~Rb26#w-Rl9y(&i84q;!)1_>Pe#;QM_#BB zZ7}s1S-Q^OIlpTUY}>1oYrlOT+__?Y@#g)7RK0n9{ViOwf0^kO%~AUW(D+@&9R|&w z2V+#I`R4N;w_E3gmZ$dZN&pgCB73}UBhF`cOY)fX zLqC6`zu*{Yy^A*duOC$evcjB$JFO+A>C%yOm70e;Q@VCk+h&p|N0Myu6=Hdmh|B2P za}-*Mzf*AEY!Kb}1sTZl^3HmQjgp_VGg`a3)?KxcvieTBWL7nEOvPOZJ;Q!U_e_>2 zf@6r%?AR)n$y;)VK^S1+FR9`1j@`d*8<@b?{$)6Q#{I3Qi+{Q)p$rA55OxZ0qb956 zw+MEhFPg}fdnnBso#Tr&i;Vu zv1wC-Q5p#)wDi_Qt**%>KfNSKyoiVoZtXMIITJTKUiHQ-?jj9jJrv(O$2UMKudRRR z+1-u3Oy#HB+k|#?6wP{{z z_ATEew>HTEuJU%7TGow`*aPLZ-vtMU{3({W39>t^NZugu4;KX-vX2O_hIt=-6TQMdIMW5Pw8&OQg1XnJGZr*!3*rUxr^jolgP^Tlg z{I;)ks2uh?PA{&2PLELLyOJMRCL=Q?OpPx@Mz&B^z=7G8m6qlcdad*g{>d~-s3Ubu8Hfbo7W*fY8D4CNW2bO zfH6sD1ES-mhg5sJrz?4#^T(ATS6zL^G!x6S?u%7$laS}jiZ*b*x2LN=f{8QXJ@TtJ zEK(ysWs4$o_-}#*PB(u0{d78|k)f!&+b1nUZMz+xnWhc9hIDk3wr=k9BJGcNWDD^H zNOD=}My#B1#4KGR7)LpVV`UQ=(N!-Ef^$XE*49E z;QeoUIU9WdF)H|B^og?k2sOCw*SB#Z+x0e1xro5dr5uh%8Wpkwk)`K!GLwrJBOXNa z0)l@{L}I@_ZF*}NoFo{m5UkhjYqlZm=kliDm947AW!bff%l(a3@H-~m|V|>&)uwJ3=Yw(iGaS4-kB&i(B#w)X=@6?1vH z74yU7peM^MRQhI&I(2o4BAh?z6He3m23u={yvE*8TL8>%HU=nL?amO!6<1DEuUs;? zV~D6nNnbDtQpizonIw`^BI!z_!fZZQ7G7q~rL}Sg(Qjd5phKfN|C}^o-n@=kv%*u? zdiP&4AEYq^?1t$fFq`j{uU!Lx=t(NL>2RvpXIeBT>9;It8_@D zuB`jsg=A~CZ1c0zGgV9b*;)06nYm=$k5lx+3mc`rleY`+JpJ=-#<6MlCMOv0ZI_Am z-s#~P=T$^jj#g~)PQ0oc8=Xhaw5=}RHD0*aY~l1=G6@%K{2}>iqpn4Q#O}w9{`(p!B*qeEtU6<0}=2=gUwwC;rV0X!ji zgm(SEP)2R^rLsnPuELTvh#nz5 z`g!K$3l1CgfeE1~#MpDCgvkiX=n^49L|pFrE9_Y2>CM;cEb*AVAqZT?2Hempt#zj6 zLNYH~11+Y~7}(ww*GZh%ZUoX+4rfAWcIegAKO219eyKNDMt320|1#HMsg2h2eQTNT zkBhW=TKT{4*7q1#n=(Vcc{Z?wF$guE1aw>|xTTaKbSg$oZ8dj!dyJVW+VI(C4R>BZ zK|13kL8yVs;09Sev036vW#Rt*yipo3m9V1bGUvxS#sOmG^bZsz%8jbfq!H**Nzb-# zb5C0L(wLQm9{O|Zmf=m)sI}0?U&~IqDKmVa(wfmXF)=R%NMiHHLcbj(_i)sL(`H@S z5Avrb_cDx3f|@rs^AupJ@B*0P+|%}-GB4Bm^+(-D%eiWu{|E_XWfLf#_rY#VkDv3g1RCG6JO9JW#e$WOV28E*NXy}VSW?QsgLwvO6f z(9sKLUtb+BUvE3luCFqiH_m%OmB(+*%)p6H|AxeGr4nR-aD#t~e5CA!lwRB#4x@r@AvOU0U3r303Q!uAV$AjX? zH8D*n3==a6R2AuX#TM2lLvJWs%~iiJ&Nz8xVnB+lgbuK_)-Xf6-q)*2^EyiY{WXs* z)Tb=WJnkTUE;w4LgY8Jong2>LiG4O+RQ9WppW}DV505`0W&Olx+E}mN3AfMpYmwBe zH|g1KPPw_ldz8bzZgJi^*YSD3CX3&$k?+lmQA3AISho^xGCT!Y+%5ZmZ+=<2CV1Yx zJFDW1R+zl$^smpI=cq6<-&fETjtbS#E@JJBwF*pDBFKf0%lrQF!#W^w{Zk~Gz4B9P zaas#6jtM8Jt4$*ThTp)Qe?gt@Lgir8Uk1}9A<`0iyzuoR7T1C-LdFPJSy-XYf5+({ z4^VHVxz^p1K1c&tA|i(x%mWI0ybV?oHdYE1Yl8yMaBf(f3fpdr9*;qs3m^Eu4;qtpdGj{mCv)s9B43job_;A?P^qD5 zZ!WWmd!-khwla|kX@A7{MG&p;TP;RRAiMTR&qDd<$F%qx6u)02wZcZ(d5wHnbr5UB zSlF1>FR`9XCBovPfj%C?pLdi~Zy1=`?027+WO&=!(J|NTT^4O@x(D^EJhsSfJ@}Jf zA&Isy+x>5(ElYOSAej5YAe8D2r%OY$43HDg91C(iHQOd2gbn%bjuDEM(pq`I>G`Tp zCBMIg8^dF;+>x>%u#uZI8qHJa!zLc0`56g*UG& z?^7;j^lN!ws~qogX(m{RD!uskGg40DAKMWuEs^xLbUgGBZpwQij3Hj`h@?++Slbqg z>s45tSS{5Y$wRLIfqR52(!j>TVcYLVAHV0*en*>lcrtICkF+5gN55Cv33?Woi3pzT z9(vVfT$h-;xoTwb;%|KoFx?Fu<5RR=5+_O3uCA*Jko}uf#G|S7(9~R%ytyxfDe2-C zaf*7iMqK4Ah$&&|i(ysAE2Xe)GW$md^dX8==k&X4Uygo0=YIOT761%3oFmW_Y;eLj zqe;R^uH^33V3KY{ry>-=MB{e15^5`pid?l3$^U_58}wN+9Nj49f=V+74s+nEywCcy z6B!RWQW+CHio@S~>z-{VKKw28g&g;v(}EIOhF^McygA-&CO35pm==t z?oGhLMNF{l`70uCI%cSD^#TC2#HMP+m_Bd3=JwD}Yy0-S0M^3ua&Q3M%?m#+!|jb? zV9oyc>bTZv>?{l?J+c2~nX$267UZxDcINUze&d&;ujKqBw-KlB+3(pK?~1|d3kk>G zi}97s8mb2hc-mCkop}j5S$5m2asG}5ko<%3^WR&{qP^wb(Y1P+#&vHx`D|CpS<^eG z)tPj89LzxNQDoG<5nk&Wk4B2UB80$#yf$Z`t#raj=0+MoXe)XM7_5!{mTGSC&|S{bw3Pi z4w8;mzQ0;a1D_eMvIp?xvqfH6I1GX02@R0v*s*?_6Nxi_l1zLj!m1Ztn=hy#bV@sV5 z7JLZfYz2>j*?@TpH5ZPn^xxMPH+uH-Fj8|)<1NE$rlIRz?o2ip( zZ~CZrCV`XSZ_flNKi}}jv;ux*J%*lFzeU6!P}N-1HzNn%lIw}` zZs@iCmR(vcjJ4`~@1?Jy``MpsZJ%{yuttVm6j&y$i$df+Dtd&zQXdOy^amk78Mq+ zfZyu$Npbn5u}?%|B)^}PO*kbi6=s=vq6_Y+bJd@H+3x%V=(KCFhLblN@gSm|2D$acBB)I_Zq1GURt`}tx%*39UD zaWyyT>CiN=#VB*0=ePsQk%*5yCIxt@QAf7Nm5=H)cC#4b(5mcZ9}bg!h>w>;E034# z&YM+C@HhjS1!^;3s0ml z0Uh6tYjYe?<;C?w8@7dJEbHa_`RkP)7nsSg-i(tJgOV;j;O!Pg3i_6r#m9}(cFhXr zcQcfdM%JvDZ~xY$?GoyVgjO4mQBVfQ9)9$LA#9mGsjkOKa-;-?i;aLs986p#yeOj% zJ<@h-mzoA+uM?22iuw{5rSRi1q#*KvxmS1=t&!oi$9>t4o4zaKlibbKcsV0*^f9He z=Q0f2B?HrTHey2DX6+K*@eq4@PGyCkkARY@#dQ;dc|rZ`Q_NyZ6-i|gRz$9dwEEuZ zl#-SHEs)U28twALvR8!8ONBK583|DBRMv?W^;pUY!&HLM?B?ipVX&q*-2zkXGq;3Y z2?g^$%R}>YUF)q>!9kP3)iE^rBxXXaSi^L1dZp|>Ju^uqKI`cQ~6n$!>2Mu zPLUG#ZCfik^h56;$X`4^hng!jUaUJ6LXq;#B8c&8$qz08?mvB;W29P!^8n*e@|jyi z?=MlY=<|Vk9*qx}V=calilp2K3eL9c7G|rVugMj??4zkFs>IaL6CUInu4dpslR5aj z7>yp4O+315g`0&(mum`xAry>@gKQyp6{%p$R z3j2mBD9Mo?`P$2Fo6->Pi#Q0tTaNXCK$o$tg%WW|hQIGOcAz}Z_0_Irzkzt;ffN~% zbk8~e;(T_!KIJIhfV=nGc7*fC6>kEgD#eCW))vzTI7{{+Es&C!VL0z|wXHCJqLdDz z&#{FiIjLpA%>va7($R2X$60dYQs3mU6xHjOowe6=fR}P-Wn)*(4+Kx;_u~!z@&l6c zrnOxkSjY!+7eaY54;Cf^o<%$HCx6zD)TBA9Nh-4a&!qKE-WrOqWSS|2kMR-FSAv=I zn=G!TuKlqIZ>3b}_jDI(8X4s&@&Xc)pK5?k-M1(0Y$b8YTa!pZ(NHA+-&&60hb0Ml zg|KgJw!p!nHH=^jw#y52(%W_{xW})1*N5(!Y_js#*>j0;Z7JE`qk2Hy9IslqLB7oH zGv}%o4X9*|cf=(@{=V_9-ldu?yKEF2s&0!^s~#aSvDW*1{#GcX1lD}Iiv$EfaAc{F z1iW1{W5~to7F~|A$n=Qz)n|ou}^b*?SwzOFX>@9IG zbpOsPb(NB&xAMy96`vG`*Nw9!ZMCl@*++4sPoANz5Kd}@koJ?#(Io-;%H9NY3R{i& zf-qxS>4l8irWe1+B{pjf4A^8|E)3ZHdTyG(e)H#7wj!-9=6L_EG3uF9|F7Uw+P~~)^ z>c6=4w6*kJ%VV43x6@m>r>_CDM?*sLpqN(CxCLgT_4k(x4yr|;nm(x!^CSF?zB>9| zRJ;bNRW$*u)>$%cx6$8{$(=QSYOeOAC|D4QN+lyem<)MadiBBVsj({OH97T%$<5Wa zXF|Sqy=|*PdnwchrG|!6>)}cC0C-cY*1`oY+OInHFSV=^KXKbdZ2d(vh_U&F^^nSW znAP8znu6-fB-#IhcyoU9$0EchJEi?cbHtKb@OaVZF)d1tD zx4RNEJc88=HF@vx<)vxhtLP!|-hzR3U0D*VMJmS|@376z;VbNWIsEE)>#Vb9$^@_Lu zaX$Itr&K;0klK4q7cD$l$4`V4Z_S83Pj;Q1s}au$z((JwA-3k@A{;22B7aw!%r1An zZRO86f+5JgRq3t{HTHi;SXdC(t(GcVIi8v`wi<4V1Y913)_SiAmK$B4^*_)jB-)LA zWc1|tDv@fNy}PFtP$Oe=8gViC0bZu*&A*T^n!}qBO#X#HSg;q+Vzl~AT$1 zof~MNPP<+SOOXA`Y^*@;{n50&@S0xfsx5k{VN>0mWI;OgG+!8N`wMs|JqpzpmLu+I zvuAJ*eR}}a*qu{(D^7jKC^&sxZuzZm!dT*mt2#}(|Kuqa@@wAB)+nbJJ|iQ|<@Y9A z7>kTqZ&V0r6?oug>L?Dtli%WnkRvWh_DA(E8L}U9W-pD)_9rte+-^$_a~qu#xN7}& zj?~zv>2UY*L(0E5eoSP(P{4o-C?a-%FJUg{o;~nl>t|$K00V~J`u(e1|W64p>a=-zfMYp|Kf0>cRDh@ciMYDT*7ebhI-KEX4pa4?M?9eY0lL%>Yit8|?w zJG9d8HkY$~pat`fu#<{#cbnFCXo19Y`cuX^w*lrjPIGS3&eW!T<;&QCvFx!B0E zV_S32A6v`vd@J1!zV)BV|3d{|vHutd9?k!~_+JeEwbTE1c3?()&G!19Vin_o#x(%{ zQMl)|79e@RR;qAa)5s;!rTeAo4v~TFj{ky>occ_=S~8#avM&^a!=MCKV$9oBNx(| zYQM$hub5dzW|rs7t`*X%;q;n^n=?Mm&p83#glQz7%T0t1EyH_$JMtm5lxAXZ}MM(2Z4&w%yA7-mlq__1025EZ{RMGsl zN^R}KYXKReT3uqD7fl8jR3euCt*o!_e*fp2VKS_J`z6 zYRDTR^!0AVRW~F(#ukdhvpOHEttz?RG0MRzRqwmECZ_xUOP?(LVo0ycYs9U*Fx<~K z%hgi+@quR`K57rHJnmk8Lnq-p2L2;1Uf|*$02?Jf5T3Bzl94!L|!7iaJ{Nw-w&Ta<}g z#@bHc@DY@xIgie4`h0(43#<1LUjL`Ix#W9F!8dU=Hy<#KC8PcZ<7R*HB!9kZteP~} zIW?t|u-#$@RfkvqF_<<*k-fT~H!_g7{k~B!|fpLdgGAcxH!j;VQQ^2kQfo&524R_NwUHOAHjn#su)=jr zdP@UYk^kzl>lDABMRUPFyGUbnf2%zgwPf8EW3|=FmG>;Q0AF}+-!{YPgC{rdF{|gz z*FF(#_uVRP21b}Xo)3)`=N)c@OKG%$ zgkH@@NXEpMu;zdlZZYDVx-K;!tsVhWwH7_VPPW}D-`LkzMrfT|%(?oV)AeDJJ>5}= zg1leX$zra`X?T(wh=VSZpB4gEfRk9OZdhaD#Uw{*{Uwy7-xw7?JmxcNo zJZ^b|aq>alB*j62VoRR==WpCOE?`ofH^OF^Vo;h?B^z zkozXRW`6WUBr#X_b16IC=3AgA8GTnN)hz26TJmiq|9Tp)^!?W;&`bhI9`)zi`*Mvk zDlXzD!o z00l~*11me+{aGXWQ<(dJ^8{%-4dyY#$sn0^sg*3nY-ic6OVWv+!QBWNOUt34C&^Ox5=VzFzLp$(J#wEWX58vxLe{DVKwTx6qshm$GSJ zdf)ekur6x|II6K5RUgEvG1L9VJE4q3yO}m;%Zs=~ofxPEfop<%h4%d7Cg=eq&y>_z zFN}7iZaSjDO;Cg7Wzx+rz3dlBMxQ40h3u7-PRG3j4Jiz%wh@rVtuk+I&!U&$;?|2} za(!=Nom)pSL=-(@D+|?_za35)Hx-aKPYrqHANo+A_v9lCf4K-LJ%pen<>i?M>HEI13J+gnJV6 zyAcBw1}_XCSI+~yhCZ=9JbCus(r0DetBS>;+-0DMjT#XSHqs@~y;?CLhY$Asht$H`|g#)VmA+19K$Iqb9x4URDb5fSD&16*8QwqJiCb(#+_HY$R{C>)GfRNKGn zbk`h7w?K;cPs#On$oCNbrQ;L6V(yF51|cTyKdfu@2OZ9Ds%n<6YGgxQiXuy+pmV*x zMl!Zb8S8bY<7(U4&J(@%8S^dSo{2a7DKTb7mk}b+M+T!IL~mg3s5W+dUn8~fsp?qv z(Fn^{-t@+s0JiaR;m}MqFYyqO!l+8mMM>X>c-bHp9Jv4tJ!tpEPeC zbwCkdBT@|9#=klx%OccHcD+$;<9%&0h4mT5#W&oGYfUV>P%OvZ1Ns|K^^L27Y>1gM z%+@Rw9AH=wm^8N*8<A|BVz+{c7;mxH* zes;kx5h(31CHO&0n91vwC+2j{@t2e>bv%X^!EKmDw&9+mN6PE`5;`jV@NLfok8Y3yxHwcEi zp@#ZWi!74<0$noN%xr@iO*Z0{vHaCu*G(GPm6 zB-EAfYm9BQ;iN}p)5Hxg&56c#y$)iEg)s$ThSQM7ByN->U2ybfCpB_(WG6v^P|3|y zM0wD?%hzw#m#T&hoKS%fc;k$SQeE*q6k_7UfQ5^l|!CVJQU8H|WHVl4a|TxaphJ(gqtLHWS!X1(#J>@VyZ7ps$R zI(g}_g>&+Avd!sAAbr-cgT-Whw;TP0*oFoRBb3}{-r!&+?Iaatqd&S)?Nc{6&UDWH zCf_!uKJ%UP9oW)TaJv8VL;@ck9JFemNubuXK5y|vnDfj~bZ5P~`SMwmv~9>FZcwEO z7{-31ElY1kwwxJWvQGpIC4)zZB5NQ?9jRKiwiTd?;^Z>WfPRs#L6%*oXARYB~eVmASJR})jybt=WW8IZ1 z+n_z)Z6yS%pv9TXnq~5L^DagXw(zMHF|X@*ce0=S76VhJG0za2e~7;C9B7T5CYfVj zCr!Ju6PK6$jD}eZ#Hw|-m3CG87yx;RfVGKHtT5V1f~zo!B~^&5I}62H5z?{I=%iF* z30EyE`Fp=#x3UpcnkMMnzwQlojjFiMN%IjS^P2}HKxmWshh z5NGh>XF^~5+b4Rj?Gx>#+zwuz_~u7ZIDU6d*e==E{r+Oz8)UH6XyKsobsseKZX_&D zKB!~OT?=gKU*kk?>^0sIo)4Kk%)7nXAVxj7H=}|HKj1-ujA_u$rCX&`Weu`I<@x ze>)K3y)2w|*n182wpWO@NPk!3Q>>N%WvWPb*QIFboXf7g_aPtquhbS!4d8 z_4F9FN?Kvkc0=bGsyo=1MAJSB@Soba{H-XK%R=G{q)!^vj zurxr@@U+hUa*m{D&tOYTkpAxa8bX^7B_b)`)u(AMfforK?4OzcfK@%X60=#Dmn|fa zwJj{(EPEE{Ie9(%L}w`=0ZvM?{*rd(Z{H7k9Psjw`AfVaDs~h2vW+Q1hdjNpvWxVB zLFpaU`!)mA;1X42?+YaAT*8Mw;a!93C|!oobWK;H4#<<+iaxv8Y%Kb`FYr0xm^9BN z)Vh;&qHY3t4zG%8ru1dRG6&Wo>@v1ev*@Rz;jV+#s0MfovI_qyn~PmfF+R1v$o+JD zobdhvt7-TvaFyf{ZuVyM+ndS;%GMWtwLT!{te&MHwSZ~;Tvv0u-<*%jw*;qugl~zA z$`zHos4eFKCuK_+zri%d{Id?JGv;~EPp0dh#o`7PyJKd`7W^%P_2~sEABXbDOI_~e z1PI)(EWKea%%|5vm7~2TUeZrf@>i6o0Mn`Z8v(5~9}OIKU|xiKZmyEDXTNffhTDzV ze5_+r4*MG>988rMdtRDZx*qhx%!ak#YuTw?0~;XUm4fH)rVz+&@Z}S}5WXAgPbNQs z7Y@C*Yh9&9uBQ_-LBQ;iHc^-h?Zqv&?@pY!U%ZQe>Z##DF0f{tWXaDqp|pcK=J}&1 z&`t>yCV0Z&!1F#*g@xWIiPD2@!Hd6T6ZC1hSn;q}VuHQ^U282h7;}wFq8Qu&db6&$ zjgNHq`b>*0#u>wgP-2_4@So6*gl*E)slC1mvs_06k;h3t&fxNofqWs#ZKAUucF1UE zV2ltP`SxxaoCqmwxuv>YrPBLlDzEw*lu4mqeU(Kh*)HXU{#TNSg-q&Y!B1xejbg#5G8 z;!xu>ZenEGMg&RC#N6gKNik@j%x+?LxpMx)HAfxX$%0ZpT4G(qjNT6FrtSS2soHhs z$n=^%A!<-kus!ALmnrTH@-oHLz59FQjm*2`JM?SL12D;$oOOvX&$$P@hwI@Utn)J= z0~ybAQe(ar*4*oCn)=P$uI~hjN2u)IK*PQX9rC=Iv7U z0Z)h=d5QH%Ud%H%|WK~CrVQcbFePhH)36~j%_kE5AjdC+(yL)qD zW=_Qo97CO!>c7EWdt^y;lcry}d*PZdF5oA`J|?C+p!H%rz3bZfmIub=`4v=FMoB7q z931@sJS)^>REBrH%uC|N_N8_p`%$W0Nf-#3!X|EbU5{+Gg%7px$=X>Ga2 zy}DXhzi1Av1gv`57Q^^=CeBaG?W%sqg}fSKuT~yzhej`vi3x6NhP~O}zs>gD!=Q#_ z7eGzTbiZarTWFak+FE=$wx~8l=3PqIB6c`yuU=SYjIC)4$S$MQ_!D9?CKQb=I>yAz z=zOm5k>8e?)MUDaIJ<0ds#F)OyEobTIPlP#cnQaq+yFj^q?u0+5c z#?wub5!AWU8C<@tmthw;4|dqkjYVPThc+`VwjLv46Xz89%j(;@sO*bX`SEqnA++H| zX>JqIUQ$i&WTU>!%IdlD<%_cm>0lY`itje8l*JfLz-j-ADxwOtA1gTpE9(nYlWkcpsG(qmP)!mpAsV$E@x5UbNk_I#wi(V9<=@ywFz53ophqDEkU> zY4%iN>@KX5cSME~3~+A*yIE8Iv{c5wxtjSrIpJ#My_DXC#7c}!!aJ^&ULf&PNa^}k zzOF&f$#M>#Ew?eDBWv)v=Iv^T=_WLt>*L8q-sc20TI zEkNAz`5@&M?lQ%+l{X8)XR=r6P^}Q;dQO#VE`Z7F7x(#vwuk>@bzMJuI9_lU~qu= zv}lYQU71On@AXU#Kv};OA3n2}5V$K`(!!kReMsnEr^VlH!yC!t@dV|J=ohOcW3f=O zr?n*xgc-j!^psraO&2>SCD3{&V_G)<_@U5OAuEyYm)37$B8yqy1KuSwoD^yfJd}BC zP*6%M>K#theUhNi!V_%v@)vV}!^K~H8QbOJu2sp2v5fr-+(wF*97Jl?VQoej##sWG z98;5NbL&d6?eE%1l1h4Wor1{US+ecTJzBDrg-1DPJSYXiMGF?cDD#^n68q7${=?cf zW%HJS@GF@TJPTIFR7B-|dgfOM<-AK%_ev7G^4NW!e8VXlha+gs@N_%wHE7Aq=9o2% zM+HF4N(r1Yv)v9eyrropc!FvvK_bH1;y>ICmy9ZG5M`Le7=Lu=dOjrq+K81gD}puh z3XD|OvENjm=P+%%f)GZV;`ITdnFTz%QUbf09UYShA75e51gql0i!>o<1;59411a139yk09Pu#_O<+_Fsx ziAwCmD=CaHcLkh;N6d1kD1nM{?(=cdohj)8QcwlH)mwkgmR2(!G)k+|-rcaJp zw-bFwFxXX^^m{wPY`g2@TC77;-6nqtM@9{zaDU0hv$DW*JXq81JzZki8R0;b{XWQ9 zBWZBVN#?7z9?vV{KuQ|f+Xme#J8OtpAkKqGf%HlC@x}rRO}fVF&oW?J#naCQ{op{m zc*b#aVKen!BE;Fr&OA-cKDo|@<*K&P<{jRe?&x$=uhln=?V&BWhh}N34+{koqEdRe zvD?uNfn;z_qf2lu|TyLUWw>24>Y%mbQOT*xnqz}msH7@+r!R*X>VgmKG zE=bl_3Y}`(iP+M)K*P9(a2(0d45bL9chVXrS`~<&pT{irXw$ZLG95YQujs(!O2=aJ*HI}d{*J6Fw z6$s96py-UQBohIXu{3Hh&kK*aTFf%H(uuE2-W2eG@cK<|Iz{XB=C z0Md+WcQ3aqP{(B7>qfyyA>OXa{*t$SPVplQY-zDMR;ub4U z1GoTMk4yxdxq^R05e$0&#;{(?#|QwU>%$a<42rLwyesc8`u6%_Jpw8Vep9b^1;6y9A->pSF5}O-1D9iDX09=4qBD{XjY={bg_RfZpl{EorDNhsd2?>%L5GA^e- zoQmepYcMwcrvntK6UMJ-3~w$Wo6ppg6FWw#DP&q+M_Sa|E! zIt3fE5m`{oR0Z+^K>gZ?S?5+;2vqP6&n;VXbkKK$)vw%&p&$g=EIG&L`%ZK)r$|!e z%V+%VQCOWo5cwB!CuK!L(?rL(mXVhN=PzC&l*%ch-ZW+Fl-SZ|w^W~{6^8o6E7{{& zsxHQq;n9uw^@hyoS4Cpc7`L8s^t#KD9zWpVudKl)znC!MyPNGYo?Ss%H>Ha`RUogX znh)4N4gUF=${ds2#N|pzA5*Nl8B9XVA;wIdu^(;5I~_Q;E#)ZL#b za(C__{YVLx$BCwO4eYWQ)SJ^ZL_Jg)4)uXHv<)#>YC16}ooB!NL5aF*G$=py+I_Q^ zNWeDU9YbW0;>?l(*h?Ekq+F_vKS00w@ojQ!%b)Y&r`hj!i5_ZW{ZIF4S<|-1 zWe;n@HJCZwvCb)F!K^o5i^s%{7UKk~LaA%M785YD9nUOuKk^51Y-m{bEREcc56=j{ zp!kSmDxf+Gf$iThlAJTzBlM3UG5wiXIwk2&9TS76=%5e3XD8_QQDcESikZsAv<4TD zdo>-!tOI6S5zW?oppL}PrqYj-jRJdd66p*VebgMM{>*0gGhPK}AcWRsbDwsm`fey) z8kqOGCB{Io9_hA5J9q0#wryKUYcykB^TNKu-_!6+!MvDiJKMf$$wt-WtVVjNX%v{G?dSWsMZ z*%{L<6M+W`pp~%FE1~--OEur=j_cgH1Ioi{LMz?m|F(Ao(q^n?y`kU%(%n)Y92yIc zl7erxb^kIDH)qz$dqQ_xI3TJk&}v0R(p%?|A0meE?Xm&jWBf*zL3<{z#j70jOM9Vq zBKib|I`zo#x-6a(3SH~{4l9Fz7$B(`hI-C*NQtul23@fF@c8MCz z`!CF=)PoB6dHvMwn6k0$LG2L)9G^H&-S^e{k}j(Qh4Eor8cYuomlPpYi`*`^z9@hC zsmlE95mMDT?^j!>&Vu(TC1ni->~Unv22~cV%y=+=e=-TL#KqDZ?y|gj80L5SWl^o# ztvYilwAg1fv^C5&6(l=Qyqhq?v*v9n2rVC3tyoBSjA%l!`H2m6CPeN8Dr#|huIF?q zn|_;6cDZYrF_S=Q*)32O<=}5X=q%yDkNTRlRReGjcix|Yt}Ht@tdZdv>z3BZ7+Sx? zQGn7kvqQl@TR(YnxN`~Pmw%!&=gQhY6?M#eZ&YVR>rr~Q%XJWo3WPB5gUZc&fc{;f z0NaRnY{ZWol>6FkPvZlGjAg=ApJz~pJ0pjFp$Ppx`!2nFcE~SR^#)t{L&nLsh#%g`ncX{N9K!%Tnpf zn)5$(DroM8?LSsBkrvMGibP{&Ad+KlkZmk_!X^o1_!En@W#O0FY2X6@_kYu<=1Qsc z(q}BEvgg3V=s~2GGCw`6*6ItvEdj#&^Xz?eWCZRmX!nPHsyCrhqJfI!b2QZ!wU3XC z_qs?8LF1v8@gt41{-_EMe?m@)CB;nD#DT#6z^`W?x&#@CBBZ>{A?IvyKr#Xj-;L0> zvTqG~Dn5ye-8~kZuB2*9e0_1nM*wg-H9E3?I(04tcvWy{54^k;9>E@zdRa-X_Ctm| zr)?^kvPkn}T695@__4i3xS7>MISl$w0p73h1EBlO!?f0w*(Qcz+wudG7jZ=%dUfk? zx~BRBL0i3fx9)h>qBhF0PR*Q~xqlpD@{nzrpVK1R<6_kgy;$5}Pv#dRD}DR(RF;0> z@g2QsVq#Le@&{imI7D#nodO&jz9WsIpJs~{uhV}bIEnsveDq^;D_;~ayfG7oN&C9A z1MndWaKMVfVrJ_Qds0Yy9eikX2nY5i9)++GGmG>@yU`;g40vac zFeSrqJ#+#W=_`zl@(giZjIF_F3es z7db&NxzOv+N34!fg)r^`Db?Yh$SdJ*p33_hc(qD5OgVr3F`FGU+CR0s4)_UJ}~rmT^tQ|!n{=3jR!?ztw2z`g;yqI7z>%l&Ou z>E?sUmI*%EP%e+k%N9SP{4gDwF%eRgzwdB;;6~B9 zr{-hByuh%Mt|8uW8QBeR7Sn#*rQ=o{DHz`t(QO{XdwaO2H4RDzN-Go1b5bOkv9Ws4 zxu%{}VaFbt(Ow@osG6zJJ&8^#HyOh|^#N{MRAy96lvI`f?m!Wn+ome0_>#`4tn!Rri8 z?4DYJ&_2M>b}&8vh4~B*+`q$E)~hX~bbecziC%*KVBNFgdSX8&f75NIVKe6Qp{pLC3FmHI|LZH--@GK5 z@7<&--*gD81Xq*TTB$p|TtNCQ?~cS9WY?n#tva;Rfz~{sU0`~4)jo=;6!M0twc26R zYZD>sdC3)|m=QyQ<9Y_Hw2bcp9KKaDosP`f#pOZ|4o zZsoep-o;*V^RWY_vHhll)5nfsZm<9QrD(gadYr5g<%&fwr!IhN=u^w8K%6Xc=#g?* z)1w6pO_ShzEuXu9&U(qUCv8Gmd>_Nn%Vs=UKUE9*KqPa4vXGo9u@7d-lt&XR2#wDm zbjx=vql5m0|KI_0cSGdtR@_6Ob+&R^bLw2&z@i9$a5@eQU;7(V?0Y1BZpocm>OC|= ze4YW{_ovj0SAw@+gJ5U%tjM3FG(H4G{PdfSyj#%JqQKnQ+~)#7gAGKKcN!f4RX;Um z5Qp~u;V2|8bQrlN27JXv&@y4iQVv`5ToyU~YAVv&9`k+h&hpp0n-$@;^#R2l^T34> zDGuSTsezb=vlECO%}%fE@>7zgOZP;Mn?}*;i>)ti+%RuiIVlEXIIs23b(%NC{OLtw zVhH?xVRD;mOF%1Y&%RvSMJa`9^oUSU{<*|#K-v_4ojhEl#=D!*_s*b-WaqBBT~*^t z6&&w&IXI8AB7Ept(RzY53?AssMxPRiCqnF}QWx#=XZ~e0zly#3rXRXS! zAQjqX`fS5Hwgq22hz{f zm&ku%s&f#02Q||bjMDbGv(9Z$3_Bj%;^vp9q)Qdz8erO;+|P`63aCzSvRe6()f}nv zSU2u(yxT7o?@P1I=sS>$Zf(4)%3N>)>@EE<>b75%;hmZMr^_S(?swas_&r@?0r;{H z$C#Yu`JF!h&Hp;QUAF3AsWJL&f2tdQ;tc~(-tswdf)|< z2+i66&!z*}@%D2@vpVjU%9C4yw%_3#4S%SRDN_-EUQe~M`!p$$joaA~j~Ek=lVcQT zBbM5ZxBsYaGg7Adkfy>yK>NW#EP6|xkH0{KOAT+mG&~_SY}DXe`larsFGYhbrYafK zhvLm4W-cP#k$sDI(y=NH5ryDUyS}7oX(2v!Yx&#CWbZBK))ZsQy~oM+Fn!|lQo7G& z?_x6NWsjHh1Df|B3RcmgnQ8hDPTQ5;Oj*3Ular?_TSpXfmkhBSwmyW(^S2kcB7ch#C$2j@eH6mKbE!*C6*>{o{XKIE#z(kB6*PJiMk>Fz zu+1FM&ra<0oT&*8NyjOc0XGM_L-3!f7QE!uq=~8L*$<2PG0x;$U|05@_8MwhjpYuI zfaC}mv|nyudQ6r+oBq2VzxnCmx&}e<)0(p;2FHvpPQlx68$~FXZj02+eEuy^gb^F- zrhorMBBRY_9cFpCx>)*OOeQV0VDUaXuR;;=WYY95-mKW465Ml+>y%55$UcPq_oLRE zL||_2zo9rE!;K2i&-2f8{gW z+yNKgeYn&5__@I;&3h7E z4n>`iZ0jS3n=jY5aFmw~9Pm}7(YKY7Yx}eAQj&-mX&OYa^gTgTBx}Z1fA{Qz7G>OR zz1>UQ7oGJ0g}gs&+46p7fWkAKB_-a0u@oiNRL&+jW4!y-!si~xvfI9sv=m?(xQO`T zO7Z4Ge?Sk+*myQ!2{(=~o@Expls)x=lJ~1elq&XT!Dbqxi)_!(B#8FOW|TO*zX_ha zz&*xz#rq8V3t6>m4RBo|o4`^SzOL!jN9=P68xe#{l*$B4KJkLAec!^9AWz&^+dIDV zP2fXx7+Hm3w&`+7>qb4!r`-D6oFco4_^H>`~6&!Da(Hi;h?0U0Hh5f{cpNr7tJ-`o4x(V@q)z}3nXX}LFCZpVs?QF*5{%Dqfz@~dZAfkKUBc1oP> zA=UJ>XGnNLc!sy*IvWD;@mh`w*{cBf3POLjiFCO2=x&Dr5UJ$V>*W8oMIE}Hq0b(* zPW<88F$r|bI6_14D;q*$_SI;ElO+e4 zj8^|-@--9mCLX@uH)m~v$(cO|QVl_(b(LvYu8Ua>KpVb7i)7n}y~kKZ25DE5H*8l0 zw@8il?WN%NidrS81ie=|sfBnTN9-#bf2Mx=Jj^t``S|ekVtetksbwo-{eSHERNq^+ zu2a-G&FO1(w!ZK26XMQWbQxL*;SrIqvO{mPgXNl5IMQq9JqU)}+V+wDEB(K8IAP{z zddNo|nba_$y^Sz}2Rn-JqP-SbZ*TW`mfh(E=2F!L@oM!tsQX`p;ftot4pt`M#ZV%p z0CRe=F)(S+{b%0CvNi{*tT`{WW2Iek29oiS#F|&GRQu2#b@_D}zyFV>v+!&3joSF= zlo};9x@(~1V1R@mEecAPsDQLIBP2(I0um#nL@AMOHU5PF z<4;Ca@;Hv)erV&fWbKU_CFwldX}zP=F-K|Ubh8EKns~RPiq^A+^BoR8wXD8P^ut#& zTRaU@l{IlrRdM{{FH_n~14|xzLB#ZM8}b+X&O1*U+rC-4a-|W`l+e>#ReraGq*a5? zg_5@$rO#Q}#b&1NmUU_V@@6H%M^?U)eY9AX6Fgsu>|MtMy|Zo~UBsBk*yp#ct4IO% z)USejgztKTJG@JlqO>@}F8R2U!-}MACF$-k$d2PEA$yTJYRV?U?zYvmq8wH8WcvkatU!98 z>DnPHI$Hg>osD*&4AWVk=qy0-@h&R~F$y5geXF{xiqwUboQqRRu;-7X&PZ%pY?LU8 zR4#i}iCnBQacZ*_!_a!!-(lohmF3*achub$W)$u^+#(#eJ-(!_{&@t^cS+8F8{h|N zZT?{t^dR>)^kVLr?b`?Szs@l;=aX(?6$y($91f6;seq{1x>h9TJ;NR8CtignR3?BQ z&SfTiUl<2on{0_HBaZH327zxd_f&B=5z9eIk9;r!JP~AU*YY8GEe7zPfceI~1Kjkp z+P0fk+Wm{Tsvm6nnC&LffS24;+WWS+eJ>a=#2Scb@4r$#hV%~(7K$sd0>FGU-$^M! zz|x%nC+5+}KJCFlUM8g=sv_(_kvCtC5{|UgVbv%UH#Lf6&noj)8A61PgvOz}&&mg2 zS6H@fqi9t{XRc=~zpMgEW;*gi)&i-o$Frbnw9qr_RWJ%%Wh80wTmr3k5k$>EQj5XQ z1I(wHcF*`Lr54As*>ySLL#f8EPoDXfSOha~zv;9@TuMBq4f9A8X%Y!C z4*tq1kfbgkjFPT^0 z5)W{y;4xWzWH+`kBlUXZT>!SW@|S%<*#F+Ht#@l0H}P!KhmU_T12x*7Z_LG~I&n^` zX3+wl{COmIb|`62-T*ekU7QBqKUsr4j0+O5JN_eio;!pJb!5oub|G(TXNa7B$3`@x zRe7FA*`}(y{vt*MR{b(Gv2t{23D>dDv4|g&p{wgSOZ-Ke%&+~6udIcx?P_jCNhR7e z^pWl*{;?+V!^rb5&(}1vbpU}!;Inw^S;iPE@js7n52DsmV~J#L9gy7nS(2&l{U~-Sh;}tL?@#fM=g-?8ExFSMR?@^|P`)X`9K-&fPf+dtZ|i3$R{J zN=Zzs>%`sF?4}=;S;oDIOyrp*;enPf~SbCPrbaK5xA1be5{-Q zLd0|WnR2R;FGTBYVf4d4D}G!m6|I~CEjq$pXU+gF_Nfy!DqeI1KSL)*+ckEmQ~A}L z1%~6HAF*tz3yx$)}O5wrJuWlQ>~whFk<)0G$TuFsD+&k-Ig0z%Vj3I$a_ zLwsU<=`6f$9d7N}QMVav2UhHF!|13NKi z3t=Yj!C1;6+X#ppI*~dZC}Tt$G1d2BI67Kij;8}E-+8#uqjq^!N0=X&1R;aoA53lA zDbdQ9cO93}{Q|*RzRE9>Fq9A57zIq|iP&%fEzri&M=-81ooz}fp=;Xi1}ml_5h8G+ zL$CD9Jf#)c_XcC*ufmTRg$;0ge`<+;bocGy9vIzD`%GH-*@p)nCdstx9{uFz5n6GI zj%Gy|&^-LB?9p#wGvV`8Ofu3e^h>hZ$di(za9P8q2BFYGEKM9)*%hutBOEfcHm$tg zIr#Olu`Fbo66|EoHu@LE58|koO$Cp4@L;hHrQHCpoy}6HLT;}};k@vpY~>!-FK@m^ zB(`@wIH^Va)UXHqsQAkvx=MV^QkWVKZ?YNHOo<5rB+`6cX4i(S$SRu!88Bq!y#nFhUpD`&j8EkQtw>F)54IyCm^k`OyuZP9O4{R*qaGLHW&+`#l zvILp7e|8Vek9d=7zzH8mi4AcUg&fLWUZy2y$)kG*`(rD4aI+tSocuicRG?F(O#2Uq zbnUdHI}rfwZWo7J13ruh9Xf%#G(x@um;v9;bRC_EX`=S!uw;u{NV%PNwaDIQTwI{d7=0>Wh91_Or0urHRw@N*h^s>R@cG~1OS{`YDtm7Yam zOEjwUm3+ctE9v8m@5nm9jX(VMTFlN}mteW~NkYs zn5A~MKW@jiriHc;|6qlPbg5n>sdSEJ6g67h2k3WTvJfEiS-HKu93C*Rxb}iboa1|( z#*GC+9NF8?+_8Pn-p5H2etnIN!WTxqWc9ybgn|_*OZ5)TYCNtpqvpw2i-h9vLB4!> zs2>X|!aNt~-lwT)QCUzXWbbW0B*oiko3mk!HKV&(o01?&V!l z?LbUeN#t}g3PTJoB-BTULXw=5%@-a@p=5(DOV!_4d_tq~KS=Hhx9z%=rBJP$6n_hg z_GlPntT`b2i+|En?taUjaP<$dZ@HK80 zdmD$@4M8DSZ=^|%F|&}Xx7Rw7)FEhHT^GH}1c{==#c(=E_cDLn>*c3Bs#xLJ?;^~wL1r9}3cI{ji_PD)z^ z(ig#d==`ZmgXI+VUO5+M8SbPvxT!&2o5^B%1j{)jM70k>5of?I;LzqfnqFV75(WA~ ziSI$IKp#oNIUGgQo&E!JK@!h3tvkX*Vw3~AiTdn?mwj^S>U?p|6;qX>n}QoU8fz>J zRK0C@?_A^;jxLdl$RS-ZtOMpUbxYimwigovv|{tMo9Fv&`f#<_Pi0<>(aNsWY$+4` zFQv@bp#0gGtGX#?p^@q8M`OdkoE^tSSlr$HZtB615i^fvw#Qc#Fn% zc2^^`tXKs%#n!~Fc9njgztZ@|xg^XhQq{@ctH}H@M}(3#NO>R2TwO-$Dxzj3n*OOy zj)%;dLt$Gt(9{evGiOtst3)7AntNvvP&(B9Lof7;7R1L!&davqWVDsao^-o-)~!FM zck>;#nBf1Qy1*8yN8)4S9Ls(sr9q->e+PZ~mv3yUtxWCa z{+{59Uv9xSqp@m_Jc)mcUF`$%RxBj_EceslF`Z5hg4lw`dM?4NK@PdvYx>f%7MU>m zJg&^2_D+L7+6C=08p)akv9LBgisqznExyUi(2Jv`3&-IAFF@p@jcWTf>M!t@b=TA_ z8bmMMwb+uLiR>5RJqUZ15fSVWyOnp&w%NDW>Hv|??=?My^jP<<-MpdAy$K>}(zL~8 zU!Jc#VO|R)V!yN<0)qt-yu;l2U8>o0R|`Z8cC5Grlj^SZzBWiSZb!B!CDw`#SVBCX zh|fX~2RDZMRG!bfefj)1MMxdxpFOC?zFp#{{zP%*L2)^|0W5{WEAMcnT}vkFnk%a{ z=p2%}*>eC_7f==sH&cJ?Ymcyza7YxO^{Lh-xN~C8vkjpR&V0Q{5Dfqa@kvS{6YHMC zQ*8&)@~R36NBEb^#7&gSX3&@|_ww7L*gQ7D%(U(N%5E-fi2600{&QMhE`8YLv+`C#l9j~#8AlDQej>ErF`6p* z2-^uj0|t44X~R0lhh3{~>znm(x!g0VNQ!25W>=aerU8-e4+1@C(;4AGigD10 z^%#zksklP24lIiskBX%NzEW9zYpv!65QK_R&Qf18O<0}eh5xXpNj^zT>oYf@NV3NF z$4hn~$lrXz`%DX~f+$FhRkuphVVZ+P){xiqBV73+;k4?K51r9Ta2ZXaHw|N-@-02v znqn0B-WjYp59c1eQvCQsUS}oR z>ux(~K0xSJ?%F9M0|Yp(I*(502(gLn%wH7f>|!S^MPO8t3~IRTx{y@3yQ33^Eydju zclMaByGhLdV@w*=n2)6C5f{yLh{MFvZXiC@q5{PPj zSff986g4h15^Q+gsDqFUr>7NiddX(NUSwtF#VmGZ%+S`4U|N@SvpXTCvH43wZoi%I z>wB#0O=(L@{-UrzqIz|}mRrkeZXW*1saKz3Dy^Ihu zXpi0bCiEbX&Wc^5%QVtAXWg$iO*|Iv-}IBE&s=6hVsevW#v(~<=aGiKSc9bSquj0s zkDj_tr*G`AC=Eo8mcRXS>qc%UDiY@YfE`Ur-(xa(*Lgrs^b-`T>k6X3o`qVIGsZOnp;w75jP zQg}JM_XxRqanM6cbxY@gTh(6V+`$X+0u(k1K0992@zSy-9VON8&h?T4v?m0w!H?gz zX7Zd5g~qXkZS3`oCDO+O%5&rQB=&i(gYchLOh`GmdA9X9(#U3aIsW}zIrbv-t=M`+ z=vfV--jW{-FW1=U?3F}=8>Y?uJ3pa-k;Na$I=8r%h#25BF<{`m+@{q|zNQ$lmjB4C*oZ6DE7%u?!n&&nVeJUZ5mybr{P|P zcqe}je%99}KO`5m$SaL1As&W!Ny^-#5*+gbh{;nEmuoN_Lp5a2>9P&b}w^LGb+F+=AYNhgO2&@*qv^j zo-Fr0b*oCbhS;*EnbM-88pgKS`S=1|*xTxJmPLimWJUVBJl#2;|Kn^tHW(=`&Kf^E zdHeOoW;EiQMw3bNk+k8@pf+{&+k9rNkQs5b=7 zdI|J<`Y1+_)<1vO_w{FsTh2y2{VBaid^YrSrY3&6=Wk&djj}U#4JElKuzVQ4)_TY` z@WB>zyvkod@z;voK`+HFn^`V{H^(Q`u*Ux^6~slp-7D|FBt6J#FZmyLL5>2w@4&f^X zMcfaWV>U^DUbj^Y@-2Wk@&{uJR{2xW_AYq}XDq+NH9gorCi7niN}A>ne_?N^Zpq2| z?};>izeq#72luZvu)lxIe@Hfr5~UF4Csz~}5~dMG^s+9-Xw0}K=#BLc3hKm8Fj8>r z$TNNv1y{ZCD;XmGok8~M@F9eAyXxMeL)i^|!azI!`oO-UnBDz5j!Ql|=N!%cd@d;d zHz83`JtSz&b(C}Q@b?nWemi^Q;R0LRA#zj`sa?m&_HB(QMbkp*8spPhAf!GLyL0CE z#Q#t1VDN`yaVE6Bi9%44*s)JH4z5o}MivVF8u|69$MQ@rgdO0&5Kj!<_UVmB5h(ETC?OYq> zcCdlcSfp95`53{!;$B21j7EOtx-tl}nNI?qWiLL8l9&#e%CEWetn{8(Yyi>^CQ;Gw zH5@knUylJF!GpJI*p`U;FqlbcY4tNyY>vy$pGSiqNYad^fSHD1jUZEp3E}~5Ru!D7 za65g6JN~riaNEVo9zv%fw#yy%B3V+GRC3p1e`dMVT|jt~cE0pf$9l3`y8?=l3? z07&iZ;)dc&B*ge_fgLKkCIVPvEXv4Hty>n#G%>kzN0j^-*vI&rCU%@iJxlXxgViU- zOs1yIgczo!bbek`AD;|w;^GS{-598!*P4T$=m#C zqM{Q~0S!{s{DDstSf6U?8lv+iT@fP)iT|d&+M~j;JouZD{fTeC5pPv^*f`k4eLeJ3 zJEA<~b*Hjemz1CNCxLh}iu8@=uSeHn3z@|?B1@$6^rpWJx>^r5g{6A&v{x{ES6^NU z_;f7TCjD@5gmb{H>+;dS>D6LdYL>c}+ZP|U`-@hR8H#&@mvp@kIegm0Z@;-B?ak`^ zL%c!sUU*H4+?_e;cF19=Pf?!;x6&1ezQjTBH}M^V#v2K1tlqxWSo6%{))!jgoagS3 znbo)D({AS}HIzp_vF|tZj(f%hQ4Wy&e%1iP5+hw?B(r+#PgXB|Ud`g?5Iz0WDRq~L z2Rs_VL|7p7;_i9Y;K0+Ui1 zcbLgXv=lXv2R7+)w2YU`76*MlD_W^td7`+-&BM(@>!r8+lSEH$zlCvd^uFSWZ?P}8 zp6tt+sXM>-IxZVB8*aV&ZV~@()Ln6(A^F4+zou$;=W^`JK8S}fcJY0q_G6j|0H>{y z{RfQ29mTSdo-y)0#auSFI?0|m0g8m>S4;)pnS~xvb$H||r^)g({WKB1?q?C5*evjO z6mS?P6CBaYaNi_mY)h|TymM3g=-_)@X_RQ-FFl7s6FQhC!H^jT>;hI-%)RVtmk zz5h+p%ncU>8JtMm;q>vqFq7jh)O<*jGQ?USp8W6g61+P!{t_ zlJicu*JRI6JxEWeMrfyK$xp00`8lO;r!{}kwVwUQ!0XKIR$euuM4JS9qL1c7qR&BR zZ+(sTyEQ-kHjWfhYqm?xBr*@P{bs|~KI3ei^;5{uM%2j9dgomM^D_yS$%7%DUXMeK zING#ARio{aq0JaQX=}*DRPhSYuHCI?rw_UbwZ3iw$~=JvXv@Mdw>7=efO`M%{5v~0`rjYgA4IPZZqQH^;jFT>`_r7^V^G#B zpwS74;VQCS+ROE@#uN9hnfykx`=u2#tO>DYO#1;O?KWaCaiG?zBRHms+|i-4JGXj% zUt~H%h8ZL~)+?yyyP0L|ff~X6))eE})O$ftx2M^9X(ld3i)>wnccR?F`WdFc!gm~} zxVMin-Jt2%qoSP!Xvxub?h&wj^dc4E9;J_HxjGJpg5KVuPdRFcM<_y$qnpW6%T}W^#(NH+hF+Di@J;g)vImo}zNY{f6sb`C>=3V%2>YjlT2Ab%&q1uE@-RT9m75V%)?Ux|57 zY|p~v(Nc>^l3J#+?DxV5an0D4cag8xQ(Mx6y{q8^53bFWOuo`ebhX8yd9orVOw@_f zc|!L(^3uqncE+qIH^aWLum9~iUxfzJAuinPRl|-D3zzR=$8IvAGj~M{rHH30X3o)D zpY#TP3x1Q!;z?n+nz=?#(CeEYm+M3FmateXe2hrrNpm`hA5` zh|m^b2yJ%b4OOa}uE;zDyY>p62xVo!CVdC3uVl1Q?!wSsoqqUtZe3pZj~kt@gPOa) zEYamgK=#uppa0#2_;MCS&b!)ndP47<(g)Hbjv8Pu@&6FPhj{G|iwhDWIEpxn%KgRF z+N92J8Kc*$D8pgFVR%e#q!neP3!&Di%p4b^gx`iA(}A-rO^<~r-8U- zH+7ZMy>-o*1>Jb6Qbg=6g>8~#C4So3z5aJV?-u=b_WqF3S69RJNpMmCEajA{Q-e?M zxB=Q3`AUW+IOrUt1e;(lKRfKO|cE^n{3)Q z93;;CZoH+ZVDHj2O^c=oLtgbgtE5yBT04Mj`avU?eI>k|SubYbf`Gjm;M}{aUa5BRueVp)kjwIK3+f5!QJn z=zWRkS`x%J`2%>7%G7gBXzA~FNH;LjF6gSxgoM9MlJ>)g652~}G29J%#0_o!2GpRw zxc`yj5rq#|uNif7{iBie-nX_jX}P!Sdsh`L8+p{f`vq-d@H7$Cx1@x9Kiis~4X)Ku zXO#75H9TO;5@R2p>C{2I%{cstw1-Lq?O6ecvmMJpIE>5Sn=f{AkXR30KM3(Z%0FL9 zxCW`cTRq^9Y@QT;&gIqEP)z^nDI;3kz!cvuTijTR9%NO0nhID*H@hE-i4m)J$#Z)+ z6dc*a_%QqRv9IZW(8gl_LUt~;$2Mm9Nt=^TetpxG{^uFL*Y9w%pAOL!+GuSxzt{U4 ze4jRu0bHFxL0+UOz)EC}9Rx$ezx58B&Sf~u_76r{h{7q!N7rC z()O=0aR8wfXzAx+NG;=G`a9&${tXKVou^g($kODTH6cRAaTjWldU0#*#>hD#BzAdI zxvuUx9Hyqh);BO;Rj|_Q3nJrgi*l_qP5EQddO6>j$kl=u8YlG{UQC)`$;r9oHUxsG zjx0^C4bLHMNy8vJPMXLj%Ak>}QI3cciR+dXx4*BGd=E=H;#UHmM)^TLs`#=&Jatcm z2hTsj*@$*4=@{GWx7hooST4TS{%6>;g-!ie#%7b%4*uTK#kQ`up5?%re-WuljP{{5 zYDu2YC;ZUGt&zObH&Fb#DsXQYvbc`F!U3|vJ4JYf;6&sG!Z7+w!z06;Kl+aJw_%>0 z*1g60;X@6Hm9k<7Uxl{#g<;`!5Z|kxGQlqRxw`BANU2?K0j6xHZf(%p7cf!vw#O%@ zaZrxM>k3!}l?FxsLjVs&XcQ8YAOgrB`K4<&>}V)CA>Ux7Cos$gqLS6{V;-kR`ciO! zSniK5ZzbA$4DHGAxh*l@8+)HVWZKt8!rRV(ZVcWE2yMIt`hMai2DbTu7UU~;-N8Q5 zZK->c_8KT&IRw0e%Lo+99>Ho0iU481 z5!X#Ce-YPgEa^x}OQ6fmQup@?v>1_b84JQMDejirzIik8YI0L#hI#r**b<&b6Xrn% z3SoZWDPGaLJKMGo$j4?-)l#=}JfDoN!QE|= z$B0P>2FqUVCFFMImfYTH%|Eu4$m$Z27M36{z;|Z!nMvdMzEJim3WrvCNRkgxK(d}P z&mKV)=pD@5Uc_LouJ;Lj*zR~xoeU}Fw|b_?8~*8m+ifZ9mw22+)LCJSUK~YSPB%tq zU_Ju(d6l#m2w2R(jy9@SKmJ9Qb|hKk#HYhEW#!8aObhZI)|`rsBsE6@=*S_eq8oId z*hq4<;>@BdNq^Oz^ii5SrKD4h;0C56m~7lSC@F2Ua|iveP|PmIY}Y9zJo(9Q*~qOt z{4NV>@e;rCmDXeROzf%$HZ=T#3b8e*hr+ZQ84>y*w+Xk^3@8u^+q1kBkhvOKDOcnf ze<9!~H2v1#?n=hI6XMSfQu)-&-D}`p`1heG@6FMtRfx=c z#a{}}04ED#a${_O%Au|Ix&Hq4q!(DJ=C`{&A6mGnQQ1Xu~GShEaox>M~3U0 zYPf-iT9w=;B*bO22~ly;Aeo&PJDegxI6S%^Ag=60qgPOn`#k6Mn+e6-=)@@fh$4J& z!3bh4#fyvKB5%cZv@;N&%QQ-8muIE{8Yc0OqkxYj&h7O}@Hxp*(b;hGUrsq3BoXPzWwC}ai!;zWHfSUgQP}o95-;5M4>kwT zr=Ztj<%kZn93cAXsU1wH@a>i>BvvAXUSr~;`O~if_>&u*uEcCCY;U?J2w&Ji@GdyY zW4?UbYlXbOZcW$VfSF;=iv^;GrX^zxgwYmSwYdqG{*mNp?);;fF42U7Xf}W$o>knO zo=Z(jZHX-Hy;i~dU(qz-<^m6iB{&+izW7LCSQF1VKL@0``Kbv@P?Lf3Ut3=m&~+Xe zIFDf+^)$UWH#Ee(!Q=U?YC!e#)D7J6K6Lyv|FptlDfT|=_v1I=2 zRNsOZy0{gQwJO0g!^P>D);S!rnzX8b@GKV^0lziZA8OQehxRHxj9f;Z*^9e_=`_1K zFjBuJkH7r4@tAG;IQf2=Td-s;c&rB3Hgd$Q` zcs-GK3XH=4d2-`wkoAeDx4BdrNjU~iz=_HE!g8B>@pOt|<4@9zIIZRek?fqEw84zL z7hig|fN>^gTcd2xJ)ogBdM^gbIN_gvH}MSS@g%h@$zE>B_dq*wKcS^mn!6EN^3?WZ zwBmW7Q^%-*RhV%8ji2uu=oY^St|8Ke+}D>PE=(3@is?)g*>KQSh*1d3=tDWsRbYYQ zYC@Ne-r11_aFOU_xDxU0e2U$PA20nRw`=~0ClMVN45OKLebS?UDqL7{vy0uUvo%bg z2%gZZa0na;-$=7Z4JW9vl24!)dYFAq>#{7=57Tra@g@;JYvR)gscC`-8A&D@M(r4N zc}NL-Ehl2FLjir?(?@cy?P}=vU*Kx2>x{poq@36g^95O1i0$$7u3R1as}4QHHubEGjtBc#SrQ;AC|vo|%Q`tYA~ zbPf+CE?u6y(1OL1jdZ!`Q7BHvis!QvN1;(QDF6k@cItZZo6O-^PQ%oC40~A{IoF}U z9NS{h33iC4NWODpx94s*?NBJ-@-f7Oc&mdUGnkqojeyGXVpRdJBuo>|KLh;l#Qq5y zYc{T!tpsd}js38WpP-3;&lzdq@>KgmiQ7=JgOzCT-Ujux^s_H?oQp^=o^c(U zh$MeHcaAj6xq#;@m;Ve-An%}$=2}JGEq>;~DvrrG6b8FgrAZyMyZ}{*u2gbQzqYQ| zDV}O(W!>2yG-#j z-YcMikN)Bo@^p=Sad&*n3a{{DS5Q;8|4IxDJ{X2phS(D1Lp(zEmIR>P zr{<$RTs1F0m@C|M|Dc0zP>P?iNv5B#7}?A}VlyyLOKLraHbR9^>8er>SLd9gnQbybVRBOc#3dFIdoNGb1V(t26Q%lVXEnp++?m`a z$eH}6!)hYH+Xc3mmMkT#8sy2O2q&61>Pwy9hfT}SFA;1BHgOH6QnjW@!J9V9%uqIg z?YSVXjeCS~n)uVhw;J6l!8trQd9!+UtSTLDJPs1f)SDG`uB~xkbe16@EU@h^?K-+o zYI^pka~Oc&G$x;>NeTs*Rwb(!~Tqx$81Z- zY!${wWOY;Ij}L>_iY_T+NU|C476I<3>O?*dzaXTp6kY6dFJ4Vwqp(+L(A$nLpRTP> zC4TPQ-SjPKbH^&44fffG2l=BCosV&)LY6*;Lj1@LIS+I11v5?sgTdtYDf9>CWhsSa zwUgbS3&QKiWkQt$|C=TLh}lqT5RS;c0F;wdrXNyl%WJ1@>vy!a8qAL?3&#LRY?i5y zb=U*fCcx>%&e0TbdS#7xd&A4k^tOcY7kY&bE6!k3kLGx(*V=Z|b0W(~Z?tU3e4 z@OwQXFzB_63`xYF8tAK_pDkVW7WMEo!RUvV?`M>If-kcU&fXGELv>HzQ=p>LR>d1U zX&5`$6$~nt!L6i72@AkJS ztqqe2Z?r1O*ROE*n1lQLz&SyNLtrBPzT!Rh1n1nmG+tv)cJn>Xta^l{BG7?<;4+j z-uFcP@j$}z7aq>DihYXMX>w_QVp$v-4x9L^6RA$ihi#9fS+Fgr2SFQ`!YDNc z6qIzbn$E;tewuXpB=-A7Q!g+f#W|6`Ph|rw{Ctx+3o=H~ijQ!qq0OpkZo?q8p-+2n z_h=_h4%$yJmZ79kT|bX+7WLdJfWif~r`(?`xn`IY&;qn_Gp&cLuBKI486LC|k$0A+ zsL<-07_DEaEhl|)X5gXHjXiDy$PUl*bnck;8%@F=It)3YI>?~)fQgrcSF_6LTothE zc0gpH`o1Z&mz&XfwJ#MxxcD`|{8Hqi(hfVZ;bS8ghtW() z*NR}66%YNGA?4`?db?GD`4V3lp~`cL)iGah8KlakatYk?^jo|aZ%01AI;_#>_bTY3 zr~6W5(FCAve}=0YtM06RWxP?y`td`L7Mj>HOMHH&r`Yd?EqA#PNRl?rNed}oCsOzP zRdJqj%eJrgVZS~5dwosadaiFx66;9*6(hrwAHoR{z(G`hIZrqFx#`{uVFWA zITT9F*~Z(qxu*{L{e*%oE1m_VC_}tMm66x4qVN7l|b#3?_M-z@TvBJ`R#GOH3 zhkYXlajL$x;!0?#op8`1EW!@nt;7>XVT|eH|LVJ*GIX0#XMCnXDF>zo9A2x&cMt{- z<3#qxN%wPz&hi{0fRU>A5Bdg?7@hRsrN8L@`;5T`3?|M>*v?{GJ;7yEy^8r13F9%~^7K_45#8e3$VK z>e*~_LWynHHk)+NUrU0-Xdx7aPf{eTqM*0xG`;8)k9m42y7$oWpz9b=k^$vyF{&2> zsMuyn(L@-6$_##ALYsj0wER&JgH zcaOJeA|DpbgvIWEbd!2zne4IZlnB2g!P)&;URu`nxetz2l6{qHQb`nehor=(0-U$1 z>P)gatd5-vHp_6f%+JlmQ_~gc&KYw;*kfO1gU(BHZqxIMrUu|S=pjHs2Ih2zNj ztVGL?Z-S8zvwFanm{G#E&xBjQ192i*q!U&e5SR_&UKv3Q7m*PK2lB+^aP1Ro#HQ%m zD+L{N?2BngF7`&{ASf0L%F~!4#bko+_VMZwB;wNHJQv;FRB>95q-QDA4&JcZq7>!M zsk-r&UF^Q=t>6at_|!{XV|YOTuB~Thto1@B3s#_aY$k)_c@hB1ib$M z-!x_;>K)_7$RhY33~g|i{oNr!(0`tzR(F!dkDSf+O!~PNLy2x=)v23?B5CktF0fy6 zDuiA?>dNe};c8A8j zwg%rG*qvZjK0^r-s{+ofM1PFr@(iziOFzzpP-_^!IV_7fVBffB<;y}tG=8W~wmfqL zYtY6Fej=@{2e)}kO96T7;Ta0#s|RbbBf!Vy`fmGD2y*$vm|J?g+23aHN@Uz;WuxbQ zFw9emIL14Bmn*KTBR!Cl(***J{qe+#I?;yuMNXi&a^JdM$h$zR!9Z#QE=n}8^fi`w z(k#~gP1mQ*vqs{_K->3Q8@VZfp#ixAlU?$ysFj+3@+Yxmvo6HS>YVB_%HSDPSpC@4wnzA;vT7&SL^#2v8=B_fj z9hIdWB+m<}ft~YSIT(Vf{Ytuy>x46N!xBb5g19>*R#5HqD?*EclY?a~Htdn)lJQXh za+PU;L_Qx(eD~n{7)gZlh7$+L#{*ZB*&)%_CsdPMr7fws{G0MY&d*(9MaBo@8L`HI zbKwCr@NPYAv2y1*BEXU`yOg_lveGhq7UX^GIc;L1j-A03kh{N^>-tywg!<>W>T}k7 zqaJNf^y|;NK??@QHQtDMtu&RQU8 zn6C-{cUjM=F!8sS?mZ9(sVYFcI(uhnSae8wo~V4U6< z6tZ!l2n0ZB@0*(q;Kg|*451{&q&Jp>^z=<=rp0TbmyH`L5AK>2X`dqPw*(t%wgktv zQY5F9XSh9e{OpQ-C`z}i-qaaQ&Q=vZ&3NRZf-rL;wb27})BCr$lXk278*rUFe+SuV zt^K|W%2d?{)zjq*mo0@a*^@7lF^nKTdtMz1_p*fzKd6|79oKBITf2#Wd4ccD&psuX z{i>-5EF#PtwbvYk5;YX62Ic4P0-dFWSxt-s37NwE%q^rtHG6_bHs#93&%YfUXBB^Y z$t~)hQ#<$hNND@N^BitJc@uROQw4i-*ASFY<6WF{nI`ET_w{ni`g;a|!O*^GQzJxS+@`V+y4Sy4-Ia;U{T-Uu)`|sZLf|^K}2=L$8Gk}D_BC8dG3@Z=J zJUoUnFrr8-~3Kg*H+vkF7{(Wnkt+xiBK51dC6r)Y$V;)je7y7lX8Y<&e2QW;+&5%5U^M?{c=E@${;4ND`gxF7?_h)>){i9dPLAxn7Y}u^*UR)iZmznaWn7PIyJN_r zguU#-VLs@E45_)(3Q8m5OMz?;P$LuPMK<*BrE6Fw3xq0>6h)fk-qJ*4nx(F=2Rrjn zd9hk^j_t9(ch0GyAi+zj@P3$sqOGpSVhBF_+l|I#URm~!W|jE!7JA4SuBj8;keC{g z1ao;R1FsJAN}lek z5van6)`ssDao&%A_$zp;O+p>4I+hA>aTHK!w(Z)B*{w1ONZ&ZjjLc>XcR{1r1O|P+ zclPg2Q}zCB?G3{QUS&wV?HRqU@ADP2b1Cz>=FQn^uA@^cq9mAoo1xE3MDJI18{cnq z3;1U6&H-0htIVGh+o!OJa@88Mc$XM~1rbJ$Y6z=P_|cE$ZM*P|J6GfL>$@(mi0U)f z<^i3z$Lc5_m;I9v2|dnfA)vmys0)@s{Ulp7EKJYMh6Klw7u^`9~GSuSg3_=_V0T7{uh^W|S40VoM0QetR zwu-C9r)B{oh;AP)t!wa;>+c!s1A%O}r3PY5VpfPYxApgiM5kVBUyR}8&!x-8e}05x zsOkIcaW{`OE_a(1P}AZ&t|r8^!>6^JC<9?~))MEQaoEZAsSzS%UoBrh((?T`l`sLo zxlh~SnzHq^A^9b3Y|s?~#&4xC)JUVzcyLHG;WqJ>^oa;@_q)ahV;@@~RD+EY8{mw| z!6|{>upFgQk&^nF|C#zgNlJd_L}CJM!qtzTS6QzE!?zVZ{`DXaN%`cco*Z9j2*1ye zr@#EW2qXMka<5Re_nST+pn?JTud5R!({S!c3RY~LSPO|m6@;|&eA&BFVYMu#nZwGWt>N-a5z$?#&mMx#5THO-dAHO zRovw45qXLy*}NyIUsbS`wn~Ilns%Y4-|x|-YF+Z=bEByIXlMAl#6oQvhz6|l#Vo%X5_wJu9ToB-rEb*~pYu%njC!&gkGcL^k&wEH^nE!FWW%`J7` zg?gjaX>|%#cEEnV!PNLlm z>BE*!n=SK#p^+eR3sMoj|KaJY-v zMnXVZQo4}_X%I&Wh`>Okn^9x&%OWcFt!x81wNwL5p4#lo`p+0Wn3){t$1ltf74ICXko&zXZ-!K1)v zT>+x#S)-@dMW`PYgmdbfA5+>}e zv%#Jo*UXsNH3%L`nLm4u8(}^Ngi*~I@ov)AV zwOVY2dFLdnE!Kobi&?)Jwxo5*|BE&uJxE?0nj%PqdA9@g-XZ+Kf&)mnJqkYpF7d!TH$#5N zAL`JK2a}h-v)|WKPOLC+$Khj;-C>9YT72g_E%Zc<+ui7KrB&?{_NVxZ@=*^OdFwX*HPHt zZp--1Xut?`P}Y^8o|mzF+)PkT7$P0$I_$pu?bsHkLPo0~iW~IH||RJL<1F*vgWOt5N5%r<&)>O!(NXhKAHiA$LY#?_qsgL*5cCewYKU2eK~Tn^xE zqvI-8+dUV=_43%0%m47^4L*-6NrZRE9WLW@F%PC$d!XrqN0+9vW{9}jO91}&1H=*V z%2|>Lute3oXVn1GPY>?Wk-`Jw^S883#P~c~inoUN2qUeEx53(9(d-#HjPwfJyn$PI zDg;{aYUOfGt`v!D6P_6JyYUhN$*TU?f*{$taYS{I+YN8qO!0Gi$0uX8&l|jKg3m~c zZn}~m@;mtM;;Juseu14bF`?jobuVkJ*jXDBBoUPe>pma2v1H1=5d8&S!43UQlT=rA zOv7CDE_M<`>_)86YsGONy7&I1dfd<3NQE4wZbBS#h(z;h^?W89!m9=%>T9|9Ss3w?4yl`qwI^NWQc&J+g(X8s)MDAVwuFx)Ygl#em{o%T8HOrfW+eO;J4B-I+#_dnAamfCEu7wz@|&>^Rxdp zcEdaUACEoZT`iPKteg;O{ZZw!NG?6lCBvKGfwgaNH8D>4N`BI+YWQ~&oQTfq` zo>_$dZbzsce{V0+&xUnZu$=rk)P+TY*SELbS<>K5y|Ha+Blssp&!bKeli9UIrxi{M z&eT{VJeN9T%%taK)U~B;+WkN=jVtwIpQ|St{0%YhjaY+k=j{l8VnoaE%}Gzs-*Y{d zkw*O3hBvG|9#rR|O-ygwt6pjF=DcdN|1G9~p9f`uNdgo^Xh|^Ujlnf^IwvPa#4Qg) zJl+McjR{x6RM^htf%Ex!PF)du`e{6H`giz?-7GTzbW>uPJf4C*u7-y14qfz$?Up6! zS2prlULVz;+g27bZ6!wHwDWbCnn34Z4Q4_v`oUHOe9Kq*YAkxBhdSBul`rnpEhpEf zsXG1ecS@y{{_sQ=Qhz_y5i^56LZfiBKVZc>{!;~7lJH2nxY~V)k-V6*Y8a^8K4LVI zrrH>e5Ti ztHC_3DX3MRYay^60!gk=4ko(P-=pZ7arYDlu&abWVbekQW#pZa1)jsp4JO^Z;3~X! z!_r<2>EmrQC&jy;LP~HNC8qd&ERV<`RZj)(V>H)s%FG8_CWMp1Nh=<;d}jGc+kx_H zm!xaiiKuraX`(wgfn~n#eE!*rM?+JMLreF_6zBZU*=~l8)UBaeh_5ErWo)HgbZ^-G zkTA#jY54+*?=$QyTqVb80>CNtl5}6s7o>EAuT-JZX4m^}Ng$oYWniuQ(01td^X+4cmx>p~$UH?~!jf10Y5*XF?fv>6Kaz(e zZWP}I0WRd|{zDVM)I~JHYIKHwd5@%sL^Cyn`Ng*ox%^obujOn!>>>g&i4Nu-4p~Z^Z|7 z<-8XSpsxV~rE9OktNwcr@}{hdcsTT@?<3mbd&DJ2RXG3hTVnTake&hggr#FIrHQ%< zNLr$khL_3BoN`*}8?s(+uPZC3RbgKR3}b%6o%j^l`j@8U=9{&7n+Jq$5sn&^H?^rY z5p|zDG1)}ICrUYd0y_YvdRDj`k&h4!~{;&tjJxp}c z&U#~tV~q0$PBUng#B$t1?#juo5pMXcJ&I z^l$8P;;i%ooB_e&mLfF_{IAt47OlfnEOPZL=7FtMCF%rZd+9~@Uwc~vR*_xlM9_(v zxPH`wt;vvebwcafwm_vSXH`fG?0T#ODX)iHb+LbNkDzg@L(G@hs<)67<#Ga2IX-cl z;9ALg(hN6!|DP7XQ-s?s1hS%LskoeS_IQW$Kb6bnC7tF6-^tz=?6she>NTmXomt)Y zDOo*+&ctKbgZIXTM?UEU_r5Iw=4nSJ*{2=y2p4LT-oI$>USB>>SCFs4{_TPX3H@nK z%*j(k4-%RfldJ}#G@QT|s?UDtZFU_ROrwJbHhpzvquV^USP&Q8$M8F$XUxd8kh>71 z$+=sIM~k@f%XE@0y+qIum7?FXw)Ko36;~1HfBkvVa=URC3u^+aFnkyb6jVlUeRNK4 z6h9JJ7%0IQExcO#AUF~Y4V8X!T-Z=4!>1c;>T3NNWaNNtS~>c>O}0{bXnlyN0=|+2 zgD2`Jd{Si{x(hRM*7hB;>Zh__63Pr?F1oK_(*g8wEqQUn`zLOo;S`>={^Gsf7Epe~ zMw)K`M_sTqm;a-F|HDyswa2KS^cQ$UuX&rIbTD zwwx-6<`*lJ@8_WNWOC+Et}359FA%lcFL$i9Y63`h1f$ALYI1T3)OirI3-zuS>B@7PkL-ic9+2&MAM29A9w!wec-$Ink9rt<<-{&^ZSmGzro7J=NpvmRI0z|an1!kJP{OA?0v}JX=~~|TQXIM zlUxbp6U^|c)*kLu58Z8y>;A)t%sB{}8yf9HJXZ^OH1SOc@znh4y7Zlao-4Ht6BmC_ zGI#Xm!*;+78>A(_Y0>#VHU7Ko4M%19xByYFqZt*~M>oLU0wkZ1>BmZohBuR29CKw(=N0I7Y3Th05-Rs42%gx? z_Y?_U5Q4fj7x0lMk1eqBdJN=NZQU~qzSqIQi7s#tM^Yd8q9t&!@av=7w*v|c6vy$z zHnY(z2MgOs+$%eiD_^N5?S8G>V&G1w8*>l+4f+xK=y7$oYPmpm(nB2`pldnBA-SeY*LP#yki^Q=0K?i2*^nC5@PW_LIE63v(g; zz;=cDz3OQM^?XabMs!s5ukeC}AUSX&ieA%F2|jTKm_dnJg$2mn^7h~6deWaBQnp0|X@ zL=BpV>IVxpOg$@9NtJw>3rA1B?J>_Qi?!W`f}WCEOFRge10Wg;zk`nqvmsZ_VK++bJtsd4$;Qkt@s>+PA@ zz3+w&Ie_d9t)UD+_Il!Emn{3=M3|5*N4C!45vz4VaALz4^rRBKzsQ#F#pSscDrJE!i{uX~7wP&PrOMQzXc?`rA4(3&A6Drz;mzSA86P}ROF7EC z;eO3iK~SWa*daJUpO_J9I@AWimUCy^9t~CSi))Cq4(-k=b#gZ!pg&*V`%)+2@kNPK zN&E6i)Ju)PZ;YM6oc@dL?0u{DZ@o$&=e?GgNv5DrqTiB(HSa*Gp*Z=yhInL5;?h5W zH*a=+TY8-~2J-IDJHq>Qf76xJ5vUjW&s27^cukqB!gz&x9+qG$PFYMpnGuUG8)91| zzU6byUJIQ?=Kl1XyDJt&X}MJ&fAj}nu?*9=Y3}K&X=*KA%KCnq!J?@`N?F;5k_FR_ z^LcsIb0O$>Vb}(GIH(Dx{c4m4v5piB9r8))SztuT03c_=ESd>@!sN*bOTcP|k?f)t zC#IeXf?YZ$ItOU=rR&+C&-S^0M6?by9lI~}eNVGkfnao*gP(sb?XSCSt2_bdpV3Mi z(FhS(I{yAu5Lih%1pot~HiTha)%{&T1V?D?=v$c23PWBF(aa-cWb%UWB;YiX3RhGw zCn2d4%6-3Kyy3FMo9nWiSkXz+AWx?5B=DqRf4I#~aa1PLMW&vg;WU*?Rdk+5gR3x7dIC>vzBT{o?BjhZ_ znJ^|5{XIIbCniHP)bD2h^fMkM%$s}ij;H;AyLrAh#^v9&LiMKwn`b#r-_U-9S+OvH z>N3=Ryo+c^(MxF;l4a3~6cW?U{>`nrVl)4scTtTxUJ$n~Juh+B1pZgg_s!YqEX0if zeX~!cI|=MMifOY7PHF$~0qnP90#F@2H-oSfUueqtsJDBwx+j3Xv*MoEd|K8kmz4R- z#`+{9v*N6)R>CIt^bp|yycVo{S#FYwhGVrlD33OU5IxFQEQ@e7)@+fg~OuUBJ|4|K&`vJx(= z@6=l0OVV4!?syL|p6$X()t$Wr6D>k|o*v*%4bs}zXYGm;XZ}4ljU{igyP`cuQQohQ zdb&^|gKyT3n}UzjH~L0(bSyw=YKB(>y|$8HF|@EB-kVZgvM+^hG~B%2vko-LLe(9@ z2E6C8x?U&mGvde?xiU=F0H{^^3Qzoje5Z|0e4}jJ%^}U0y3zN#FJ4dLzO9S3tSC3inCbIgC#Adg76^ zXU$I5@(2ejI~p|Kc$XqEx9fe*VuCKXUbgqdgupXLiaM|HKla8Mb(ubM>$<0M90knF z41#zgC15A3&A1x!IWVC3B3uA2{L90C(4=d%wl->qGjQ?xe6j3HBntPl;{4|Srm;VT z>{$JTpEo74QU+N#<{QT}@nmtc$y;Y#I`Au;Xo?K;_p1luZLb?YWrydw0l()a=E+GZ z_>UJ(>x77F-;~#!ndGZ`H)#~Oh>xs5+aWfW?uE%2qrF|X>i zsiHa}>IXzt;n*>`Tj(9_)$~ekaI~G+S<&b{=j%9VDpKT_1U-J!iMH_{KCwS8?BPTY zVC2qG`O_ZY$YNRl7jBFd-WX=i^#Bo(lbE_MA}5ngz^O`WHBsx|%<@-Yn^+M{wMLb&R(Ey|Xg1>HNUX1B_{HvrFVDE~V}axZlY=(vHbO44nY5TE z4NAe|SVxHhlgz5s>Eb&u>AYD?c1%4Zuc%c&>b}>ZXOLYS1PJu}C>=~}gn-6NrjHOg z_ETh1o)mu@qP2Ybns<`F*NF;}C`2#q-&Ui^8$kp-sU3UP0741Ele?V9b_gFgm+GYJ z*lPF;DtdfiN7fhHpUP^IvAy2xhixxJad(sykyHDh0C9ig^YUIock8E|Xp4x3 z2FOv4{)w$_Ge82c#lo5F2Kd&YGx~JS>oZ5pW}b9NZR~czQ+QJ@ng5gtVMmz0I}h|i z#e?WT9ikwjNuB8|t+7#wY4HUnjpRPn;JglLB;9ym@AG(;>edmpN$&vQJ|(pp)8_m= zCS%4Wfzh2gQ=KCn1wJp)tr@DQ1a`@Z@Vz#*zG)8cd9=u)Lf6w%m5>F>R`di5+ln`E1|g@-gs@4oRXg( z>J3Z1HC@3U8l*BT1=WiPn1r=Mz3Dp_<8-4qNnQhLX(vObKl@`0^$08I$W6UD0y=i% zYu{DvE+JFT;fw%;MQY#|fJdYVrQ}K99pHHjApFVI*S~^rjs9ch4{SHFTP6^HETCd& z`tv`&@J-iusyo;S=uLMOgCp2+`e;r4^U{Q2M1NlEI7`41-TO|Mq+RUmI@?`uf*@kx zMyyKI-_*-*dJaD4!#;`EL01j>FV7!-@acWVSKW^Jv|YYfvxwEWby0C8o9_lvs-WTV z^(FmEmb5-3gy17dCN7|K!bkdlM89u~jm|FWx9?4nabR{vO!OMqg)Nluh3t{$zJ*6(c;at;De3ipnAuJg7-d@LR3x}pYsCHg)MkZ{4d9Vkt%xVQa4757pns; z(!1S$Mthj#zoxq1NzlY=lgej)78W%K(8aD%^xm8Ip|tpUpjgua@Vyu>U-*Z%=g|WT zMa&PGm4q1mxuzb0_KXw29tIYbL&JZhetk>Xt79)1wPMOD?+b`cq>EkTn|eb-9EMqF_F+~H)g za+dyJ*;S0WC)bY#A^iA73uAT0zvOB3t@t~XpuhCd>`dtZ7=pA|SJuPGb{QMKGh~lk z?JY3jl)v)2(55BquiR;=&}N&UP8f$5ro@Mw_+aQ1Kq!m^C_2yo_2MA}pX-P*=$!ux z;E`lz9%DUgnB9>77mf8SQ@?iHc?y^ zun)Qkt-L%z&JL={kjjFQmaUhO$>*eNziqhqdbc7TvA&lVI+|E*ah}*Ni_U4b*p-yb zX3o5Ukg2sKNs7Y%k|Wf#?f=^T?T78i#pUZ(nSVYHTN^$vpZhJNaIAw|bjDrZQyM^- zFu8L7jqzJ!%JB{3gjoe%#uL2NMZK^(>Mv@B-6;gW+y8l}^qw)-@E?54HB7%2dm?E~ zH(=0qr`xTT#V1Y5jO@WfD{@^t{LF0n4B8#s-R#d6&9m2fjc$Y)+WR*hpN$*_HJMYL zlBvgdX~uKFon=LV5*;xK=msP;^Xn5=f^f<$Z1{d+K zL;}PFsjB|`5^i^DJ0F9n>kdT?9n8()my25@>(AgQpwe1Xvwr&d!r3NO{AkyKAT$W8 z0#5XD!)>Xluy6~!S4&Y8mB}|Ivv2*ssUooH088gY)oPP;$sTJlL2^HGhyzV`8FhXBp%r~tK*Adt{IW!@sn`*!isU?P z+Qp_HWoVfP-8;JIc}YAPdd=>c{IaJ@ybqDB%&JMgPKDB(VJxJC{IXZ_T{HuOeJnRQ z0)pGl2Y1_rzx{@jfuhaE689bkf)~8*|1_xSaFHeGcGe|PDCL5VbP+o}Er5A46kc32 zi4#PBvO0or&Q>b+d)HrW=CtP^u5JIcUfJEvQ_adOW*fkg*EJ-99s zAmSjm-DJ$em;@hTp#^$s94YZ%!kL!kbqGJlHW;fIGIqcl5lWTL0Vw2%p8UKU zAoX8@8W2?Fla&+e@?C3qepZACNs2qawjzx^d-iepmJIWIwm{9uU~vC$+fnjm3Uku> z=O#wz#-S+8H{WNQ>;RbwJ#CVCYWEe270+>R{53p4_JXUS)cTv5lkRn6@E^O3l{_vu^{b*L_r67d5T0q0$&mFb!Z;osRN(-GFe{@GniGR+ln?^W^naz|g(j$I+;|M)2kN(ZO&vdSqf4VgfS5OD~6VdKF z`~)=Tw*P%Dvo6d~IYf`3x}ptP3x29G{mR94Ac^SD!Uesy<_-mmYMyrr_v_aTpAcO* z()3uPsmWEs(k&XH^~#c%L~JtDIgp*(SWNM$FR(i5srjt>77+j1&|ek}fLCJc&i>F7 z{uXDW_l-@fXeC#zyLr5*a^6-xUu@ZKh#@hOJ^lkeFVG)KbH!9nu<41>ZhSimX*0iU z5U2vNeCd^yHk9bi?!5&s_(t2;8b*c=Zw*_Sj1^0N<0vD-H|=j3q&?RS zBp=PH;njr@>u0(PKxag1=P3qh*C}-DWK|e!UhW*Nd)2EYS+S>m(bEQUFA-iLGgPGL zv%KV=Q`)Wsk$)1{6Uau2wq!Ds|2Hjb5Jc-q|1=VM)}$}d zys3xxr85PLT@XGO_MF5+e0Dw;6S zuqxprKe(;Y4a5Z=ztMvA3z_D_5IGQbM;`k2X!14a=`2Gn|*Y*Fx2c{r@15=!oo<*SSEA7PkSX zZ(HwLoD+JAbTSe|)$lh~4O6sM{$-A-i{l01P{^{R>sddWVil{4*uD20rY`03Xlad} z>xVHyPP&DPbzM8H(`X+gt)Fy>LjUu2l`vp3aD+3rkDs5eaT=6Y8^Y_0`EwV$f(`Iz zqoqlOS~I+rkmkXba%7g!Zc%${y7ItRHt#5w@(evk-xXBVObC!t5}}ALilLE3k{ng| zRF>nkmHJ*&E_O{lRRWX6{@!`*4^Th|PWWTQ%HN3QIVGzTcdu?tuXSS7t5ppax9TQC zeoL1e8P5uGD^FJAt+Wer(#d^uwQn8_}hlYL8!Ge0O;M|OIkwV;?4qUMv^PNBN@ zO^*L_wo&q0Fj;n%$s58L<~WiiP|G)V#Yn=QiZk#@+4?mTa8_KiDNG<+l0L~UBSLb6 zff>VNij=k~wPeA@@3MOEb>KIAJYeJwg!Drg#SEbS;`E{V++OYRt~wU@rP#u}T{+n`^!t3rbdB6^fG+xO_te)si4D3~^Ksqfe@|r{ z))H6(z6^8w^ZF^f(UOL^2v2L_;u;;*tt@4E+VU`*NfY(;O6TEv7%c??g9so;L9SGe zA7?0k3R|Z@erd^Be?-TC$O|M$;J$S-3#i5?J{u*;BmKDMLAgGbI-%i7R44kYftdS3 zm7G$(U^K*|p+~|a{xSaWP%Af&!k4|cG@i#CV_77q!TLgIl75kfO+f;om%r`6YE{cn z>LAj>4bUT*h>kkn2l#JA?o$c}U4%MZXl32-Pv#+XUmiFH=7qGneSvU$74${3M{xSb zV_q`|abPM^0B(e_+zodTOV5>?e0E(5R;*}Qe{$3!JmjGRI7`|hKO}d#GEfj`%T9KZ zNu}sMo?j5*$%9gp?JaDWx?gW#%@3m#YF-sqNPB* zBOkIm=s(6qYtug%NxlFcF)D}TO43qBmN@eP7c%b%Hw4`0VsViw^0dm%xb>Oe^J(P$ zSPIYS{@XBA5<-@{G}zkah*3(m0`3aCbb^b0FM1z@m%oA+CI|rxFyK^f;pH+{fpk{6{Ak%h4P~*yVZ-U ze7W)^OAkYw{!b8gq_XzBXJ9{+imLZ1Eqll7HA`9Aj~>p091>dCvM|jVHl?HQE_wQr zU#IF~Oj|wh52R|t`)w9~FLqKlthML;JtG7B1zJqYlBtH1X9*eGxb2?0Wu~xGB)Yg- zJJ{YbtkO*2Nv-^7yFm&%pkVx@%I7SD(mX0iNv(48oF4dbuGRMP=jeO*&b{MoY?gwL zotUcWqC|G{SKVhDv)y|whJ>lUl>prD^lOaQ+~#(n%jW?agr5=m%`F+YQ26!!9kNaF z{>`6tcXN=EwwvODQ*%GhCLb~1mzekNz5Lt25m%{lLGdzesL1L4e}3OyFNyY5Z=`pD zf3hRAR)(A?sBThCwD*K@az{8TZLoH(TW8s|6tz$h?l34e9w#%L@t^0Y{d^5W-N{>D znQ2y5V>bN3GYa;BT-q%u8i%Wnvck3?JGmiLoiz$SM-ok#6CbhKg1NdGP$s}~K88E= ze^To2d7OOgX`@W)e{K?;Nwg58%WbY7E!M2&j0BM6pQKgGZp}*t%=c3pdU!#?9z0DD zNC}^js_!6hrEu^nPOzaV(I5<+0ysKXTn9Y_$;RM%>>I6dB(qHJ!Uo*-o|t0OEd2jo%EBY8bE z^bE@X9R{bV%O%xVPkY=B&^4TTSsJ*Mui1y4rpL;4OEaa`_iBm!toa4q5(mWo zE&i-EYT#@5@9rQwjo;_zj;5!Ddvz^O1*ULHS0#$MTNw!mj_5+dL=kqu+DHJ;s(zQF zWwPQ3G@xIic>##}*~1w$B7qC4k?**3vo6izJ;Oq>pSOiYoXAIX#&?GkF*i|-%K%}tJsvGD>`9-$AB^nM12o2d z+w5%#zg-)mOV6or_Iz=h1an7`*<|O!?}P(DN+zOrqrae+8~b07D5GMipsaRZbr_Xg z!Zb+&b$NL7!mxVRn*KBhoB6-IupL?qxs+8ZN`1g0i=AYNa+Sx>)q>6kRacy4T}4|) zW6a!}92;MEhKvT8*NILr4Cw{No}U8Z)d$^3*K4$$qb5+#hw?`sv*X@ZP zEiRSE8TF3du6)< z!snJKhokzye9!e8@YUaYJsk(>AzUL}O6}ZD-P*e|9>oTHW32e^g{S>7eCO9Z2xMs7 zr2uoR-BkZ3Pm0DmW+e}dsE#sLwGo+U=W3fb>KFqDV9ytxGA*Kp_1+1q#igXSW1P>3 zjd$%VJO61a8W7fN33}(^{d}tA^91*N^$ly)`|rs89(sGX??sQHsysSqf35B>hLux| zez<4rk#`ZIKYFboxAI$X22Twq7l@`NJSG?IH(Y_tw_^(0KDP!nZDINIjJiv$31RC_r$ zM2}{&WJ_{+a6&1|`za|#1PgXY$ff;RbtD`^7_Te4E1F0$AJV;CcUWWmb}^3v!HIFo zn1$rgevx!>4aI3kc;h=HSa5G3V-xbABX&0zawf!%IN)Y`sGuEpwlT^ro4k&QS}Rdl?-uD@t*1WZT4CLTBaNGcNaT{!(L@ z(d@<>1dj^jMj7VBSLu*sIDuyr2k&CxlHg39G`!Tl;gI)q8Hgy+a|q&a_lk;5f7`Vj zU)JIH?uPa*DNWMRs##*m^cw8I#B#UD8!8pROOiW3+|#09^XD4>jd=4Tr88}`y-aB7 zHq{*>ZPn}ktjPZjZnvKiytb?JevA6(jg772IV5Q4hnkIE$Vt&2d-N>P)K-a#8xf5JC&& z{81`=yOYo!f17G6S{bIwZQr!18fO$fWp6O-Mw-;gPSYmU1pM_upqAmyk^GNs;_pH8s-7Yi+)_0Rv-S}~3SQwn zB=pA1WfzVLBEBX;3vmK8N>#C8R?0`zH`^bGPmg*(s2$R)zsvCH>F|!!Aqm0`j0npk zKQ9Ore{(E^sC`{>9K}ngY9BR-B+*co1H!$OB%FCktJQZL_)}$X^Cj6NQr$J+rJH{t zDfA`GTFauOh`fYVh%-{W)PZ0^YgLpdp zVTp)pD%h`zdpf{9Ze*#n?V#2c;g&AY#HWK0Wg6lpHcdt}BD5{m*W}hy8g?^>r#B-r z!i)jO1>1U@!}-N!vU(0YH5Kp{qlPfKM#|H)whO|z@clKhy&b*Lz*0j(-qf7j^$s*% zd#$un8_*+x)S1zAJrK5b7%3;Vov&ESg!3#>D%Fs7M(!8*mlh+Hm;}s+8r!{TgZ8v8 z=l`Wd6Ct)*+ry&Fo2vD z2putg_e?&?rcZ!U6?tly(!TX{FD3V-C!a98_lnP{Xm>Q;jP6MVb$Q!FZxgQaHPro7 z0(PWag*C8CevlFPK_atJM7EZ@C+3%4wH9&AUlZZokMy}Gb075+&sxdC?LTvbi19w*22R0;Wy%;lU-vM{Q=B5 zQ2MJ9o%z3$^9`YeM-{bTH)^|fM6ZqJKCtQGpfXrdve4D&P2um5@c>ih;$e5DdYh~&Ej&rsd!@b>sfY>_ zdx0IA40a|6V%`=qbc=0Mmy5Im<|t1E0MT*bJ5})6?iG?3!M{+dzO7`a5ulHQ3wb-V zHsWK<$p@*|H&PpP@98j*zoc2mC5ikEs}o%j`707?X=N>-UV|M7bF&*}fEmL_ZJO!G z%NTqv1((ap6i0CI8tkkRAK|AV#Dwc^-pvD|`qIj6?&|ZBFYi&cm>+72$Wr!DZbb{I zsj3j{XE~va^Qs?s_`mS@{}nTy(i-4SZ@fh`+jhxUH3MgodBq;}x^DNN=7v zXtc$u29hJby>d15=aHHV)mL)4_r`zMM1nZJQxwW&To(?u`Gj9x^7x9)D7xb8cJ-n} zl>T`$aw4zPb!UsGI`XntazXr2ekPBYE12g)-Cb~Se1xN%EKcexPG`gQMDv{;B4mui zU|Oa%_D2jvUb-S=R9rZ?it5dk*JU)pVq}2~Wpq~$vxISjO-d{k*U(Jq?Ew%(se&^k z3=S9S*D6-Kg1b@5!@#a(7xy+UFWm|(bAgxDu}4%r-8J@r*EWfQQ}UM@h|`-!|J%sp zKQ7OWloYiS8D=NubAM`MMq*eRLGl9rh4@PoxYE;Lwf58$W0nt0dzvEhAQbRF z388AeLUESivgbFPHE94NBS@fz#*`KPQ5rE5Np-#O5HTfrSCo+SSu=)6G|=0&xL|TE z-#3ufb1Qd6*#pDhjMS?T`|hc_&$fS&H_hMjRaaUl&?)h;#%MvmXF{9lr|f5Xz5Cu% z&1gzeXIjvsBrR{jKlHCE`EhM)55KW1o&_KXDqGb z8G&wpIq5P78?j3Rz@cWlca++xzjfJF;Zw(K)T_Pxp1{6mrPHAl=38Q}`;-YwUA=vQ zInB;@t&3FTFJEb}+#3I^YRdo0VYdjpi4dt`00l#8mG8NW#@pq$go)IU|MWi~UThM1 zgHMJ2Vq7)^svV*d&$s^=W#_x5iWIEB8NVeIdWJ;$N@>_7mV4@c{1!r^G*1h9%*z0T z|4}~sF->S(VgNo?l9Ra&zLTX*^A#7Gy&hl9r?y9Cj?2o}rO{J=z!MTaFPpTTU-eUq zc>LYiCkOb(^O9GZhahYi<+SR`eC>2cviQX(GIHiekm?$bDI>IAf-~-d9k4KYq3G_c z)b1ch%TM3Hk+FVSIFZwwtq%$&A}~>c|tnPiGd8!t!4-w&HKjPA8X21*kt}-wsofWJw|`% zahPsqA(jU_Kpe%K80B^TD>&!A$nuVd3O!s&{b>j}a31sRxP75(tL7)}ovKh6#))a0 z1z>)+&+m&FZH{p}hrbc z#rtOJW-BiXySD8Dah9VNAP?7-{$X%?uO6YoEESjImeNOoazdx|&Mg-Zt4IkOo)@u` zp*VUDSxPF>^*G99{zBu(E%r-~bJBe4W^L-(Qupg(zQO=?A^m=F3@xL)FZ7ht@Uef=w+NEhE*Pvlz;o?(oN3!>X=pm zxuiJ7k`)qwyv5iJxlyqAyveeSqqyzmayR-n32L@>>+-P~{am_(31-)v3r>b@M2 zxOwQGhr5UQ`tFV3wG_#JC*k%|2q>jZ)7abG^}Mh)hFm6)@)28@W)5~1vQ6w9cxO^J z?r}%vWc_ZmdA~Uw_kL&}gyFcW-MT8bWOEd-lec~d2Bcjo)V)N^?Jg6DJM{Zv4q@8V zMC##pY0h19wp1{||DxN^r)PiIo+~;}nl1YzKnd(3^Z5O1fQhoA{)8zQ9%-re-t8S7 zAMuWp@-#N$n(JQe7qntt;g*nHWnpT|FSh?3aMrau`xx&5@$*r2&XcaUg{a@n3s7_T zxNEcReOxzilLfMJ7}I`d$*boAitt!Om$tvl@Vx1RN>$v*3-!SQr4Eq?|xoTbWLjGeL} zh*M?VkVi>3pPy`=^@IqD92X-;b8U129x=SL$yfp$GEck-H4J#cZ7&cxLN2BUxT`ie zX&cXbY=1_3z5^A503LpKNx+KeVdm0OT^=u9%cP~#EWrN8!?k~2;^Dc#{FSeE^Bxlt zH1Gxxd=fD5!u~Qfh1{=eJEEB@Fj&jS{y!C)$lE__Kj`*~E=FbT5|4v+i7~>>)OMGn z<=-ZbN04*V$`Xjm5Qbp?PAoab|A(os@M`J-`@ds!cSs5dA`MEz=nfSr=@Jm6yEaO? zr6dL@5=tX2B`p#nlG5EH2Ltxb?|Xjn5A2+~d!PKo(>EGn8u>HyT_TvE{f%a@-IMCV z)z5m+^QJk#*hNoK&XjEUN_@(I+`f&JaNU#fC=9-gKgE?&w1cpvgJnFX0#Pz(#8&zq z@^_vuI$a+@+ph9}iNtp~hr}dugfgaMlE<*yGY!}}CyMEJYzE}=rarz~8J3@T zB(?Gl>dFyv?j=qDiG|#b*Y2t@t~h0-GV*kQZrA0=lO9Qkag0@czhpu%08u_>Lh@e* zLmgKb0LBdcPS>B}73Q92wjpcvtD=+t@SqX13elGn#LB3O&c`Wir_0}AJg=Oc8O$fA zK^2(@DUwAc!mp#Gm_XA7tNAlC2YqysIueRxK;oM{=UXUU6k8ir=QaoZnq6FJZK*|W& zU3mv*XyZOc9l(WMJ+-x5y=Oum+k~pmP`JX4p}$Z5bGP7fdus*4{GYtAT1J`))hgC9JHEhA&IfcKe4Ud)+PtEirxfc=;u9eO3RrPn76? zHUrvbpG041++B!nGB?dJh=;F1NFU;z3A;4UXT=Gri#mpfjW2&t5{$=~UmPqw))n2aiH?1S&Bk^U=f#v5fSvZh3`hzyLX+}@~ zjrzRXHU-z8gqk^5FzK}17a0V54K|&c@W)*xw%Yz8s5)WIC`CW}XOIc9BJ(?nf0g)T z{MNDc_@R0x@r|zB>g?Ss#gu%&uz^$GqB&yULe}Mi_^)f1Dw?Dl59hg`y=WCa^X&_l z*QQE%YnrRj+O$p786U=*Xz2G6eoB%XSjYz1C;!^a*FNpH#xK}B@5`!ha3^U`F32~? z#E+ygWkYlkqU7idnts-YNx7tH5L5Kg>Yv z%Ui8cWtj82lFSgR7pv5S80jMynRL?lR5S4`C9&-1zSqTgxw65HI{x%*{vRv(xc6U- zW`;ada{U@Ip1AKQee&UU`2S_vT1^oN&Iwk-^8^Que!;p_G0S&a5fjp153Y=$UQ`^m z_h;^;RK&Cz$0ousaH>u#g!Ift<*7h~tO%~ZzvFZ%4K~TnT}modL0YCCNd4h+xla*x z{qx9Bolfgx@g?bj?qq*0a%O*m<9L$m@mkjNSVY|Xr=59AG45MVC}slWludGe$8`JN zY6|X~@-Cn&IeIBZ>$z_e-$vAQvY~y}L};v&8d{Ye7)S1u@|{Yh5I zzvOGbv-ve;5ll?phFj^%X~P>!tHNwm_=YazS%y>k-r9E>=4U%rZm)}w-c9TUG zoN_GCl=0?eDJPH+n3hh`r;kVZfY>(lT^fEW#OA{>@toUxmf(2U@+A1dIDw8rIg!+@Uz^j%^n!K#bfgSJ zF{O^KxtCTUH?-VjWl}8%KpsTK4e?X$D*bIg5G*hUxIpmIAT)G?#0&DY*8`UAHmy7| zkA5wBu(|x+%UA~$fu{l*& z>+}^V(y|$vCtUMjd!lzB>ObJlnD;;mMh}BX@Y$VT(AhEvCOBy^ldv*Jp50!fJ_SfP zY&mCM&d7Y*O1hQ3er)kVACH;Spo3Cf(SAekTUWw8y@`fBiI-x!01Y5rF>qv!<{A@9CDm|BJmKCodG%j=vshZR^_+DNHTj}$_K^<he5lr=WiO*p-X-`@%|4X=GUGo#Bbw1H7Y>tX%m>adv7ghzH&q;!P}!h|&5M)qUFB2mH^ zijzs}0gy~4f74){=>iw7*P)8W1tWCYLk_l3hhvksUKX&m-iqagVz$|9KM-}YDb_6` zu&S}WqgB3%O(rIKNyXgHX>}-XJ;51x+LOY>X)P2IE{%77*oLKfQWZ~)ktnqL0lg8H zU*_q_oWd0o)*8`)QwZxSC20|g<(Cpyyj%zC_j;%-D}HXtd$UcmovR6)hV}}a9GBMz z+`I42H(}apvf(v1H{yWWG#Y7C-^JRGbIRuzD@D3+^7_0D`Ugp_#QVMaJj#|9_S&WQ z7f}DeIpJ9mitUeGXF2A`i2XOb^4etAjGoW!Z^$OXdi z$8VP{zyIz&x~Aho)a!SDgC6FJ#!8Yt{V9EJ+Ou>O7qB|T4Lo;Gytx4z;~i|?`$d`* zcpJM$goFFSXiw!AH;qetJC%X7o?=I}EEvZ7N-5?|H1ooWD? z9RJt9JT{9ewPlvEdN<+1i^lxyGVagXi4VM;@Wdc~*EKvg%n&8_23~!9sYW7?gp9DAQ zGyI#_mN3hG1Myuo&vRw@nNG4oPE;f%-x$_YKf|kb=BI;G%lGAj?HhNXj-a9RA;s$$ znoM>jz|?-n5kEJkR` ztJc7cCC94zja6CUhqdL36$-VkZ8e_@shXj>eD4Z@+fgq*+%tl=Y>(+@K0rG=ri8IJ zl7xmy*VND%5U+o+GrI6VT8U;fTRDS4TV#Bi%Rgm^?GLq&3nBBqF_G_+S540r>ztB?vz!GkElOa1 zGeN&h*U_`eH!*^Rq?z}zQ@95eXya#JeG2YS;azoReWPJGlp2kdQf*6f(p zaW_WLj-b{sUvQmx!EuWdVe!eZFhX~=^sZ`H@0Ho5S(?HAP~pAx!0!0X+Dd;JLzB!( zWRxE6^o%Vn!)4{cpJ4O1jy6x#db?9+Rkd;LY;$a2-gl$40g60bp8_@ z8b>dgF}q7Pdr8VH1xh$ac}7j zVKidOw`9!aznT)XGiuex@FKIn)1!tVSB&&|MzULm@I7>9$MsoOs8@ow$em;$+fmRt z3otyqqHfcZj;~G%v)9?Ggbw8`aB|cllqH$N_=X^zWGTH$JsgNr{VM3rU*(Y3%efX3 zI-PoulD&DLf-E*`8v7Jr^H~=Ij<5&8VRzlEa{}LbZ)Jho704{=C5`rvZ8`|wtYfeV zf>E5|1C9N2Ixehft*(!~=>P(9<2-rhbYRRx7lVkXeg^%#Sg`L%nY!0y7ri(9WD+|4 zO&5#L*)xYB-1^1ey8w4eGRvAlmF4TsE4W}q(u14yYICvb^Dnd*9V?gj-C<8PQu`dE zPLj~i+9Nj11cfU%VQYbZW;5B;6HPbQDqP&F#6^o->T!&yFYJoch{b>DkK~$N`0M~| zrUvU`McN;$Wk$;XO--Z%jhqkzp`6kKJ;sl}c&1nq_JU!H1Z+bZW9t!@STgKVt|Ixj zpD}@0SU9+>grQoq2o2yAR*~)H_btS2cT$$kaOzZyVZYr18P9qi!5u)qR3X4Nn^Z~V z^FTEf2}|_%$ZP*|!Eh1DZ7Q2TQxIt^GqO&Eo;OCgzlDZgsPLzZhv5!2{&>%Dt{fas zc(qc5wBjo~e@@l2me8cU>&Y7z*gs4Ab()L!;!<-h_`{0Iy>IMfOrIg@La`?k; z`H7`UKPfZ(<~MYdR_C&n|1FUAGFqPR^;tc~``#c5c0_)#>6gS1EouFS`>GiF<+7!w z!lcfzjac{BluXv2boq88AHP>LuS%34c>3C1jr8YkjyTqdd0-8zoO5ilvhpwIPof^- z_46E^bD8(Nj8G<5a{5j8S$^NfwbKuNww-cwrjzehM+N}nwf0JQE!vJdPOS=WJoDe@ zjlwt)lMC8dd{jrhf>Bf*Lg@h7v*=i7Rbvi?=_wE^5A+&_hAbHtn+x`VGlwP(9G_{FPBS=l=96VZGGF5kr~lxe2hU{;k}KcTAnThJ?*- z`v97;)4TKnnZBKVQ{?53Coki3Wmb82wb<(SMZk$B;g z0j2^eYPE+{=H^`#i$7++M77BT3MpoEVo%9Ub8Jqm#8pMduxEE=2<)@m zHK8|@8Cx;~aJ#6&xTxN9W07pVEQS3J%LmV4El={|eIs&_;4S|_b~7yS{f%Vb^7}fa z2&n&nC@@d)k{Qpse6-MHmbdWVSVH4Yp%+3WLO&IE$Y?ySa;b7Vz!>3s1bliB^Tj4DDn0zBkO0R&gSQ}hK85i; zCG-4uP9{A7({^zSry>u>Cy`M7F)X{1+}7~0kaM+U1{E9y_+A0X2a7TNIlt&fWkjJ$c7qg z+|*p_>kd;pHJf~2k`6eizLtoEGt*Utaf>x*WUlQlO&hi**(}@UilHRmrto7bp;aK6pDyQD++pVXI z2*bd}-(Eyr#<4I?dv~DkLCyAD!Qgv)UYE_{&lgo@@zFH*{Xpk|1)*izt_RA;B5a}F z(XoWm)cd&WCGr-xyy}$DM2%;hfp!|O28H|Aq_A{I`+5O@pMLfPjSweSkGsW#Jr;H6 z)2-8D?EA@P!q$qZ#%Jyvv2Z^;7ac6>WPN!+D+Ay0ti5+3Clch_#S*`pUw7skl_#bDNz+QtHy|a6OZOJuD)52r+}|kLS>alrQrI+OoLnm^ z&x8q7NxD$u1pB>Dw_PI?<@F`hLvINJs7ci8770>hhmzNOhjTH_z!6pQ$QYJPyLYFw zLU?&faNtHN2T>%cYKJl%!xHXsgkPE@B0a%CZINJ^85qjJA779m9^Czg6`Su2_D^G* zqv9AUuOiELgrtM!;HbOXJ_zBk@^Z%9MnHDXB<0h$!F2PS2%Qr&|E*nv-(zZU9%ee@ z*qQuk`Wf1zkt7EfoSRFpafI1`w^zC!)p5I~;>lZ+$!A63_t*XUz}@=ij=#SDg-Hq3 zD;NFs<&f6bO}|PpY*>P>@=j$VbsPq}-7fWdnUu#Xzt~>nc6?kCC%r=F6TWBwR_l5>OZVW3!@b-49!Hhi`Ts`q4?5q;TY1@ejes&FgOUlNS zd3DoFw%ST(F*eFjp$?6kUhROEBeKmV%Ec1S4s2Ug3?suuJ1bmnW7!Zln;@Iak=cy9 zC{#8dxspq~?@aKAf^C9h`JTQj&VFXnYj7fo&vlVy{*z-TaN4--&1~RB@=qi&P>azD z$p5R2f0Da*_QOgPhBXX7y!ZI*`}MP@VKn;uXi~n#Ia221Y;O;p_Q};p!zDn*-V-n( z=t(9hntLV0)uMzdXcFzyriwpNm)X{U-Dwv3Q(85axlO_M^|no59YnAXg@5Sed^+h5 zsu8Zwui(!u$GJII_OZtWFo2UnXr(SE zHU(*3ou&}6)__)}IhOloHADqWWiV%+RnHd%PLOWDKMRq4;KlfmE>Kl8OnZ5VxtVD& znds~vaieChrTUh23Y<0o+Wkg!vEzI7|4oqUft)eWB1p^&|Jrxec7GV=^9 z3yfhzA{aYTYc~UD5um@l|2th--FUZQCTp_QM zau`UPl=uL)`93a>+dm^qd;g2`V=O!QYax1uR^&%Zn`9RHt7o(!HTiG#G3*Q$Z6n_U z&_6!!7kEVcJeW9-VPs%XtJMQm5nM80obRUk;f?<=c7LQ=oysPsOs)$_4@+0A$vA}w zL67%Z)4EMXlF%`yILvd!9412IV~vw9ReQ}T9N?U9P=UeEO7-JpalKDsB-oxsBha0(Fv??Zon4 zwlFUn<}?)5=K89-WA95%!%h@bAtkc5+27~j?jM#0kLu@38P~qtjjkY?3eEumKyb!dMYC${7Wnc~lmJ;{p>wkZ1#iWJf5W9< zVdGX-ztN?Z65RHbqIg4-yiOAdj~ddk8Q4fqX$CR`=GSQ-OA;jYj!kn0Yzy;Z_*XI% zDcz9fp!bW{9t;J*U1Sx9;1kc2Qn&e)j84bhyjDhiqd6>9BU0?aM_oa9>gPtnu0nTr z?Z28sthN$C(>U092s4G0wN^I;r0UZu7KF^MilBY&ip`v(F_9YC!PpC9a4ddSrHY6Lfl$ zO&!W_sbLWEd&F$X#1@a2td^w_WDV8mRI3&o`H&qi*75B4X|&vZp=4s~iP(9PnNOkY zRP_V*>}=WQZa%dCz*6TEsu}MPU_84#mZl|2dHSs7jWuq&o_KcE{_M^_riE|SREEK% z$1#KH7O0e@V5;#KUa)G|O%ra_YTm&M?qy^~w^T9z!VMLdvE&D`!x@gtA}acC1AF~S zrd;7o*nv+LhW}){abtS*G#g*gi47YI=?Drm+B6TiCI|mwnadZW{3UOHPnj+#-jvx! zA3=Wv%J|`iEyRNmfY}6b0~WEF#r^X@WNGETt1_tDY^Y?+)MAU{`uhlBQ$H?%M5cam+~1$$hSJAjK~vJg~og2g20zm zDNhz{hzSr6s6D!vcow`TeN1ZOLv|VE&J_yWu;_W6g<>!*YuDwDhGqwed|g_e@&;zp zs*NjG-bA%n9*H#Juh)?3#RY%jv3*6BmpplAj;K>PB7hO%LW(%GPSz!1oTEs6I?N(5 zt|n}+EZqzx3dlCDha!@NsFF}Etl{9Wa21w6p{pVCO;IPkP?kHb6H5$@8%@3Dj9m=84w*5CTO(3O1YcLUT*B@RGGX~@Qij|&Y>$!JkNb#J7D6|OoHORqy@ncHRk zuKoQne_i&IN6+bVFgDi=0V@2^N*B}g8;!W}b})Ku=Nq7h^YjRP6Tj7q5i;&-hsaVq zjVg0nDk86x?9MB5DswsS1hb!YTvlI5?Px7e-^JmfSGhm!z=J=wF~uXrEir14ai6os z&g);&Km`UY#t-_XnD1Ria4HBWiWfMCneFGrC=r1xHTvuA%JSTC z1mYHwxqio&tw~~Ls8x!XeR~lEP@0Jh_P)Isej2%oM*UU;kP) zij`ns9$k$34*P|9^t$BO&9E-hGwvH(8KOdSVA%Quh}30ny2mN|N<_~sdN@5yod)3f2Kx!dX`5E36q#5@DQNj;-ld7*~SU}%h^As zcOrj~a@+*O2AM`^_HF<|Hd4JVso{j9y}EUaYC#|QA+%I`Tm+ccSaY0&MWmmh5KV61 zkMSL)FV}J+Q?xaVf2TT7H)q`UEI1X)r5Mk|c%q$5@;-d|^E7fm8d#MrA|J(G4iMkN zQC>g|kQI82SEiCg^%YMxIiGat#u}k3Ubupv8eLHxf zOeX1gYIOS|!iF}zu_78`IcznrxvbO7u3qPH13m37(WY1d;y@c!)81WkC!=1we9>Q) zp>FvX%<=L~pKo{C8iYaHYZ&Hjmlyt*yV;5(4Fga<#&{(fiHxRoTCP_`8JByd+{CVF zz#O^g;f5#G)00WqgqT4=;N>9|uN6igAtCV@dISvilU)xbAsd#cuofnEfWrG28{Zwi z59Yx2I4#pk>gCdva8h5Uz@dK?1B`XsWzCHp>7DoEQ*2}WbCZ1)VcotTdEkmlIMvHjMZlJ*wQ-J#MarBu% z_2u?Afac|5>59~?W&H13_yog+-tQpL!zw=PK#KF7Z=QA@-`^xAPz@=f_MpWB5zvz{ zc34zbHS~IQ73#laP3!4p*$v!cq+@fpT5g@q$kA%^{@8FhzXN(*x(XOn;~E``V!4;& z+y6X#b|wmUQV!OcoF94k+5b!&lyuOBuJ##g$eA&{9Y9q$0DnxI0~SpYzE|HE!!Rd4 zk4T3K#_2(E-?L3rTHWnFF&k!4dBB}8Sa3De&kOD_*gHx*xB8RQ60&yUrQN;Qz}WZ2 zPJnihS6%So8IB|l>v91UCK|GC#-(jaiGk~G>TCVqC7#w(;v12x6!r}S}^a%a~-QKVjwCL`E zP_u}(mLw#(mjhc%QDF*>4N+O~JO7KeKfbo)h1+x}dMBLzDEoH4yk9k!y%6_Cf z<#I1PIhiZ)re^B|>I#lIm(eTgF?=Q9c&7^E3MG6+$e0~oi*pEnXSIxZ@%4T^Jc=UA zl(GjwAbD2hWKrk+I5kzmjJMK*IU-qiJ7mJ1JFGXl-^OF%3Ub^_XNkdK)7yV~gM7|m zIFxH(QrXcP`>ec=9l_VEFEs+wdj@ps!c_3KiOiX7Df^h0&vv+OJ1ed{h^s^v&dGeR zFL1h)Wa}AF! z`zrmL)3Z)GAg!MM`0}nKSyp0vp1Ua`xDQggMfvW>2zO}1)SIsqOnHxc->2%j*`))fw*0b8$g_(GICkFeRHDz39IAig*kB) zWr7NYzTSZUFF-TDtP6BjyR9;@F@ zsohU5jrNo=`y`T>SBP-kk70M$`<4<8cMF#es1Sax(CdVb7iHkyHxZE2Klau=GtI}& zG#l-Y@P36)FFijia{kf71_A6Cz3c43Hzv;DKZAXR2WxZ-FYxSaI5>~|&=9;`Mq$VW zv$*GcKFi&|uQwW+aO6gYvJ-b``E)37{N6%H~j(iP>ipQLi=4mX~ep!Kf3A z_AIa6zB+&$eQEGFu?@dwNx5JfS%g>lS5G!kAPvKbD&r(>xgx(isvSB>d3aqd8G#=E z;lq|dp);o&ZRxp%Bo+`>t8Ps{&@8-HLaOUx76_us#5J|5+1{k~B9QGtalE_P zP;4Sish{kt(l$C-VO& zcoU>3{1J{CL12?&_G&&ENPj3gX09!lG!JP=$U)UzjcRC5r`Y2#j$c?d6Bl7k1bjhVNc-v^&my zsJ^;dTEGHO`M8xlX0R}oWw>uqNPFbfA6z$-*NRbFk=hD(R$PY4J!2cU?ZU)annd7F zaj}y)to<}~3CA~=@NrE{<=rI9RgkuoD}Hi?pt!b!UmJ>Ih7Rz9dA4NHQXP!aNa`2OYC}U$!9K(DQ&B3utAuC@m?YcOwN2O zfkiTFh$kTr;Z=SwLIy7-3TVvhyEXwPWXQ9lfU|)qblWvQ_DMTwaCCQe(c1VKhfpwQnb4XkYpo=m*ZFGc;W7iPvlT%sKNiHxjYj`U zWoB9ZFHrqoY{?+7*^?ktL9#C44p*Oib-Y#k(>jxVwwV?N6twe*9R)l)zQptQvD6a@UOyxE2Qr zP26wu3YOFvMVKGg>34}!-0iTM3B0YtFZ^kC;b%dZb`vA%sa#MwC-Q#VM(t7W>Wp3R z+hY7Jb6fGfMt@qR1aL}ia|Js7e4~~NuD67F`d*Nw=)qy@C9 zh!%xjcV;#%5gRvQ-*~dk*5kXU>enuRnRfV<#u4-(ZpFbzgQbwSX$KlSeZnqxdw}#B ze&BYY|0up-p)Uc2OiPDAu-;Vz9nZ)pE`rb;RS|-=1R7A8Bq1EW-zVvvYm1$8(h{hw zbUL;kWc>tp)1=V-N;TS6At|8c6ea=wl_jbjtr5Hs>Fe~m68&AHH@LmEYSNS_(-r)t z?XeuM-<=aPrhz(cU}-^R`)%TJm68rRm`qz{jecz2oc6*`G~Zsf?bd7%Ih1RVMaDUs z47JHM5GA>fQ_iy0N6QGdR&&nj6>_UWky4j`$b%MRD@x;UzC)97aqI>JFZJc@yyPTLD9 zIlCF=aQnObAua}2huvK5SR4+Z5~Rh3V^!oABvE4-;ae|mpxQ?reuMO!cQjY+3Pz-% z#z(J@b2?X%48WBLODL;?H7%IMbmPN|%wkIsR>%a*OI4uN%}|vK$H|<|(P2?F;aB%$ z*5$e^zR?*JSxpXov&I0UnM`Nzw~oepf`!6bR$v|tTFem+lXp~<&X&;<^8?j#{{XM0 zJz1k@vvZr;IKsdUfZlFeNtvs_^IxG@UkS3be!zc=0@TExXZw;alt1iUXA|?;JGOOY zmn|r#^9tvEaHJ(M6WDUGeDZTGL-aM|VOjgb7uz>Ng?S+~@-uD()SDsron@Cp&}WYk zZoi;W5ZpdbMXSQZtgF|18^aSu0A~UZ5$zT`<{A%_^J}1 z>nlc|BS<`(B`D>-?K_W2Av0RPq1cE7es4L^@s%F3s0V#JlDV; zseu}o>yKFkeEv^H!oF*g$L5JPi_y_)YYD~WBWM3`4b}?6J`IXC>D%3$b>fevfmW|N zTKvzbQSDS+@xaineBrvx!D1)vAPq3e9-y>@=dFU>{05!%@GD$;6<2`Y@kbNayAL|E zv0P9oZTOBL5zx`r8F;jmRF}bw=*RkGL!P~bC)Y)GSB5_G%e#$#l_0S_gM0Y}dV<^6Jxk%JCb?@Ee;eW!9fDnO zjDM!F$5n2(+Am(4@Dk@TY-rs0F z#>{wOL;0mG!(jMT9ezqe&)$!fo|}724yz5{a3;c}nNb4qIs-F(pC)fo#(un@@ydbM zzbtSaGl9rRT~^}Y=ZMwSVENs<-ShdnMPzU@>DG@eT~iIb2yK`gV1WM6gu0tOB^;lW zG(H2JT33Zpu_NC(&uxbsdY=usX?PC#4C+2{j~ZR`i27L-`dZDZ6YKalODkRhQZoI6 z!{#HG5Sv$ya$kB*y*k@v)qBTG7!8ZMMcb7i{5NiLra1DN!RFM3&bYd$p|;+}2Nqlh zgQ>HIZFy5tc>eoeAC!&zXYu1X~pG><^rw zz$W{!({VVRD&Zh~Via)jNX|CvrwXZsr}yzV5ZvY4=N)ing%V%zarRyvp*O9vYv1a1 z@aJEAzYnE8gLNw)A!BUfW}q1fY*lU@~}vW#OmZuM2-P%Dq9 zb=XpIbdM)wmdi_}T#WP;lJ;|YyFs!8P@{8S?Fj36wtGmu`7F1Q9U!5yR6Ll$;na%k z#pPqT;L$W2-J}J13Y4NWVf3S+AsXh{ii7-soy*eA$jSW4&7*=aF#;fzI%TFu5>?93 z`?0GwYSa{fo+QWYjNkAVobunA`UI`r1|A9D{$%fpvb=dVVZ_#7fZ$+aY(W}#Ymwix zKO-LmCngLw3Voac%?IpV>pwQq3{@SgrN>VbRv?!m84Z-?m+mm}FlSpJB@4wqBbc{l z4P#7zaeo~U(rRYj7+7D}`TEW_LZGo$32z4XB~_`tcH#I#qO2WuC5sexAsdY({#>Hy z80wV4ZhCLl_!%ggC^7_Ys=$M!?xgNp7I%8~&bR6>w4b01 zaj$`(?+yLj0W}xv$%x-=L<@<0DypnQ#1Soa_m}nhq2-YAe(*~o(aYq|EK`22Vg3|s z32yz)y)Pt^O?TcXRb^E7(1-t(Yn`J#c#wS4>Ry%X)t_C7jK`)u^&vjze|0CULMc5;gwc}KkLLt+i=MklOBMl=% zVzzANnQYRVVeZ=QL8k!~&1@|A1)m@@4yz=$|9Hz;z5}4D@GgmcXr7p-8F+)8Z1zB@ zy)m)9#9N?_aVE8w&O(Xxk5bHSEHn;siO#QQ`uoY(DVKg6G>5hDY8Eloski&JdxtxO z$pKwwZFU1#O|TeE^p3-u6vQRtCg_NX?ggZno-y0z3Ll>6a$C52Uy$hgSE4yC>vlZS zpvTm%83%WtaodiI61zf)mW!AtqJP1?xIVao|6U~@vjCw)Y>K01Mcwk-{I@n6x6?bk zub>wuErVi=RJ>K%J{#IS1?$oo0}wuixJ6uDXu7><@G4-0yZBxx{1=BQ(dRh7%eC8gJh}G8 zcZQDr&=cxL?s1kh?Xf=HR+QX}pU>QSOwS*Z3fxQcFiaw4@Z$D#>*J_r;$siE4^D`^ zFVz>0rTffJ(>}&>k#KMtboE3Q<~zA)jIFMEf8P!7BT`>I9F5!)6zDjABIV45U;B5a zjK(_O?K;_MdtK8awMehFg?QXfthsqPgs>eM9cnWW4-I`mb_|O3aSe8L2sRd!yyt+9 z!^zh|QwR0qXnUfLkX~ zCHb`DhNuel+haeyCZ1&q#TBNxODrfJdHegSqf zoO)aQQ3v5AtbJgq+!#J=7dyQ5?cIWoLae5YGd{u9`d%6-1rI*8?)-Umxr*f+iX7tJ>YvK!qSP+Bb33O}ml zDcg(2JUrZt$+Vg0cspdbM56{U86pLy$>rA({+AeQWv*96Z({4-DARF&#S3PrVgJZogR;c4_qmcHh6EsBYfes!%v1)ym96Ai^gC(b%d9@#F&7W~IPUL$H zX=`ONZPr6qv1{@{&z4%{P6YP6Pt?t#FAsk`a{7<$9*3CNBZ(u z)v6Qc_&90j_8^t};iwt#s-QT>TR)|ka8%hL^nIn(H>YU>WU#hgCVC&zzjtx$6G+z8 zd42xqk>=w*c(~SLcY}t92kV2Qb|AjN+h6H*VpVpI~*vf5)$qWb>Nu zy_vsZSAgcB3Tzcg60mB5?am8ZMUjP~S67dqPf7KF(3efG?iv?0y1ed*hp|py&Q0lD zM$28*L5vk0ud5-+L<5l?-325q_BMs7pmCu_o+A5r`pWwQcE{{O)k^dTuKvazw>f2n zrO-`Mx$o!+%nhiP1McK`tIJE}h=i>#1y}P8ou~q)f4g5#f8UK={A0bKL)oz@fLHNu zN0uQ^I=!F83~_CDg8R+rj@!U7&A}758uYVR^R%eD+ThD&=*y@V#C@5HO2Th_Cj^(q z`+tF`Q`xibXdrg<%nSj~r-+J|g(*KxO}JvXZ?)i@VQu+@-q zvy2q(BOX5V+_bsb&8gcx9cjZS~{{p51q{ily)Mkqbi~jZM3?+dlA& z)EC3b(N4SA<$R{dh19<8zW6ah@Mp9BxJQx$&#Uu2!DF0$hn%<_UQk-H7J^VI-Nm)u zooirlIUkQc_k^NOMmXVXeaPgBR;pIJf>wc9yHKjmXab5K!2A-AInJ_zhEWRDZB|sb zWV~k^r_q@re}H0JXGydLc#btg>kaGp2KkcYqVre43iN%mTKY8*?D9L44)YpZj?a+~ zxyr}+S`)^$sRD=Ie6MnRmdU^&=xC?>VacmwrQ4a@!`-E4fHfdl_-yb8554bMB?0qi z7qOW$fEqEddnnLrTW6n!m0R`nkF|cFe-}LiaUY$TmFWcEPp=*L zaGy!2E67Su8V^FL?2}Gn1l)X;ud!>V%&rD|K7keIxPf7og0n+I8E@}tyG$~r&xnNP z$~|*gk%+)4H2RE$))d@a))Sv;nbJxn#E#t&X>Hv7bU)0TDQ+W zP#}8n83;n<)#%K}(y-7q>BnLGr90O2TV4G~b@<%;7|!zE`sJ!g{u|q#B^|P$5Q*~e ztU^f9kKU$`tro9aa>p0nV@Y~WU13okF7bc$lJ5jLp z29iWZZ^A^U$ic4$-%R#39eqxC=GUWT9gbU`gxPA}e|T~1B5?g^w`0jP)UpWqV~GrF zIED_4aW#r(pareA4BT)m`FbGa&L?9jzHEUKT}X=O>)_{J2@M7ahU$f;{>R>Bi*hs$goHLc^X zc=TT8A2q0!)Mkx@x!-I3g?Lh*yhGqacaMgIj-lo(&qQC%(^mrlk{^sPH|za4*xSE3 zNCD8|U&f^t8{5zk4DIV*Wc%~BRAUdqc)`J`;4cq_kb#R+p53_`E9JR$MW|60aJRy*W|=AB%vgU z5Tg;Eu~6!J@q-%1hIRS5CvS#|zWk6R-Ga@}2<=OHr?02h4u=mCObRIoKATbTw}Cfv zYaf)AT34+sF;bVG-&JT-2V1$Suz) zZglol97(x+^rf;ufqzJS$2zi58it=%_D%*YFVI0Kv?Kh1{;UbyGf9f`)Mv3{EfeOw zAikA#RWO<92Ckv^&yC|H!_kyEAtb?dloLUYPjKuB%~Js;_tZgz1w>|-&=#rFXZ(Z4 zT}a+UD=~(1TSbqt9_?MNm%akmy7G^m*gkt}^0{ibZSo)W)G5hTgixNC?4+wn^{N3k$>5cYnw(z`2^EeZIxc*D!7sxje_l zSD{e(DU154I&iNK(n0wvlStNB=5arppmO*FHoY@55&$FZ7RXyQSMP&rWc`7Basb_p zy6yf94(u8Yi>$)#v!E2v>ht`yoZA)a4>{iN>#M((T;uD1crC}(V|Jl8L3SbWkmY_! zBg|iD2$v;L!Z^6uU9AFn;v?D$AgVaByV-XgNw4 z)gkl5qZ>q*Uw?J=Ma0vl1YhCDPZ@e3H_3|SEX`|EkBKm(<1*Qnkj8bk`K3JQBXp*1 zdvAmRU9FBm=z4-HQ&%-S5aL)3aRKG)kk3cC=thCsC5DHeqzQ1}4RnWh_fWN+K+9<# zRzDww4}U`shw#}^PY-AoNwBc^IS$QAbhxaTG?*BQJ!c571@~Nzso9ykt%>^m?QC-y z!gzq(q>!mH=;tZHMLSOZzW%UPJ1N*qG0yE0jR(QX;TSz|j9YKH(CbMe;7_l2N-Hzb z^|1;lm8%Qa-si#AF3c2`nA?9j6J-(Z@rh^7;k}5D3!;A&6Qi7T>$A!NeX1ANjEsR+ zgX4N)+k<5LI&Hl;ZRXa5@5h24crOvE9pbHV{xFC?bCQ{P$lUi13nfA`-%wifsT=oy z$JJP^d1UgPdP*&U+;OEpazjD_HEf0Rx`-eLcTFVfW5`&UL*Lp_4=BF7-n5=EJgAH35% zz|dB%JJH#+&uO%B`^SK12h8pj6AIsJPoK{0dziA=#rl@nFR-iw{HEZ**uq%G0{Z=} zX@bziQ)jAP`fr(-z&q28YMIGt68f*`${js04gt@z!f1TkW8M;V=MfM6i6osIAw$UF|0W5mCi1M-DWKU!4uP zL*D@h$y{m^oYE0LZnzInT?hbK}2V*PGuf-~|u zG&idinfG&Me$mKe?WHI1@xX~ZGkOOSzec2%`sSkkI3Cdb7pm((KdKe+8^UW+#D~&~ z1kHgF4~s5u%t%`5zAtB8=yru&e^y-GXpcGrAaAxI5afP}{<6>@lFQ=Mq=tqlYQ3zT)*drKK|WV#$^J)6;~ak z7CVrC{w^sSx5R1-M2oMI&Q_vIsR?wDqn?FVVX9m5Z^IOa={qbr9xs!}C7LK!nHA|& zP-G#rlPMJb0)lDD(u_(We^~bPi)-@FR1k|`z}cGm?}zNU9PaEpoHwBG1+q|7O8ZLe z@v}fq{A4Ywc`cXxU-Z;lWvL${(KL?w6P`pOX1=&t?rJws?qP$KH!rEvG6dGXq(d=4 z`Jji|N#QP)KQx{#Y;4CE=N4`l17z#3>!ep-SvMowg0oo$C5p;46BABE=Pjs$Jp{BB z%3I||aKH&4bXht^k?hiC40VOvO}$ zAwgyrCOoGctHU7x07@9p^LKS ze{Za=Ov=qEl_(vxWCq$cHHZVazk7xKcY_hx2`S)yX8tWDA04tl!3FIAw&grQ^;cPc z2rBKGkQx#Zo}x@!iLCFgdn@+o)BWLG;if0?P)R-IwTA;e?+w5~=cMhp&!3`p$?vHh zmhm!05+@WnvE!lP&T7=W^Bv&u=D+KHT~5B|H=}JqhkS*BRUiJN61X4G${LwQ@`MET zO;@kdK13{fDF5;XbahZywu2{B=b=mh6)@<*kXaZD5LKO}%9?vka}X6l_FH!5_nke( z$@kV;I7jnIf%zY2_$heWp(2y8pZzbxIrF4x2ftTH%QN|{BF!ouCpz)Erhh6E`6X!1 zG$~d8>!rMnY041T{MQ6gX7bwPs~8SdAeO~4NYGGl{fYKnfGf-6F+7+WPNpQBoPsK0pl(o`! zo$4IOu_@j67s3iH!o3cz_8&vO_h#SxQV0Wv7l_^*V2gdt0NC`(OTm1xNO^9w0(Y`; zYDOQKZz*H+00fPShwMJ;G4=1N@_5w-q2Bddf3Uc}B9H%xrvU_tsJ6alZPhiIIlLdF zGqw6BdJh)LeDi1X#Xn-c=Dx)lI-tncJ)fU+tp>IrTXio?uu{D$L#3SHai8%QBV{Z~ zh(Wp;NF3*~E`A`~?p5gkF=Z)_xfnkU5d}ZcTM(lwF+}kISbjT>RcvReQ0t9^`l^fG zNubN)pc+E+%8r!`_)#r!9JM-WME<{iV``uwFckR>y!cX`WlzIoIHqdU@|E>j{pvFW0k!Hf< zAY&24T+A8e!A{=k1G8!FP5CFr`0YHimtcH-zW-1$?LMthG+Q{cba+yoR4+&o0&5b} z(DbF*_0x`)bypdU<_z>qe2i6Aq^dJPRCRcsU96fD_X`XTQUmHt#}Y*- zY^+Hidtdk!iZ@*DhTp9l|2RX)=@@G{7wj99eAM2@(0;!N#`)ch*+$(4vsIaeQwVIY49_>P{hrAPS?=xbB9dHEQs{9J!zdTE_dqnebsptF_C2YLN&z0l9cOS9 zSpqC^tLM0Aq@+``2E#Y(pdV8^nl7`nFa@{Ixt0zzi*($x>ndz(}Hb>dxmTJgOgLLx!v+ zQAs`fE8>czi~Uv|*9G8?L2jt>+Sgo2tF}8e8;67^<8u30?2Mm7H0@;Zu?zaJ+wJrZ z)h&e_RX|^)(GD8H^_^*CFo_iyJIT*i`%nhDpBcdE_S*p|9&Sn)&|OqexfDfH_}aH} z(u4OEN1}C?FZyr%=jrpUN~F54ml}d744pb7R9!S0o;WMJyklY)Zj_jtuUW&?_m|AK zUopwovXW-IcW~zfcxx66UrDO;Nbw`V)SrZ{pJc?HegPa5*mjya&4a?gR<}Y~h~Qj@ zonan2K3Zknq7t78a7}MUL`BA1%Fb@A)?!QJZrn`^F)znv1>Ae_W{D;I_-PnomDJZawYo>ZWV`BMY>wPwd(7^kT@Kr+|yHLm02skcR_*R}#n zfeWvOX4OPxn12{q$+0B0Agyzn$)FB3t;(?hpIhI}TFbx#oJIRaeU`~TeOXIT@?Npd z_2&NF2IvF-Tl-C37ZtwG#EgWcs8X*!A5UD15~Nqu80jo3R*I{XT0#-nT{yPLmnyCq zdRpFM()&j?2Bmsy-f_p-1asRrYRiV1BcqeW)bHqCcvKv*!!|tnsyaMTiJC0&Lnr?S zn*xVRBK11iB49u+3vltOEh)(#!!2|1<=}fj!OnQ@caKTpCE$eyKUL^qxS)xZ)p3XH zRjV43_;CpPAaS8=Yz#7T@{BXdUG&5|xm$vi+}Ek1c;-o%f}p~GrM-HH(=f+biH>BA zyPQ$R#kQ_RBobt7v=GGCkDP;8&hj5g-GB4VIrzNBfOSaTo?`;Lti3b|vB+GFc zxJ{$JCYZbh;_0;@gZiH)mko%UKQh&I3M$9*(=>+x!9)j}<<}a%9R~^%t$6On{ta_U{B( z)IvqoHL1kBW`ygNsnv->KRT;{K71w>u}>8*&Uob<2}b+!2EGpVNA6^7<}CH@Gr;S{ zu0^iRqLVLg>b){dLdC2wRcK)xDA4;jw!?SLw~f4_U zJHni9z!P~e9y(f)>q(qmn1-)xiBY9M+) zk`6#Y!~{Y}g;F1QGnxcgR|SV0Wp3|#YQ@&AQQuDq+>&zaWr-*m9@X!fG5<1y_jvyy z%Ag#~Ww~=;8|4H%>`W-QUR;yjQFlArQwy5i7er*VE(D2_a}o( z^Y#hS;J+E2pBAC&axsz#A{1Wk%-fX;9Zz|7Zgu1|&?d z$kh_5YwZvhN;a^izL4v}AmZI5u0Wbm+_L^E1P!?BeAAT1%0l+39D>8hXN6k5jgtc& zevZHk0-A}1TL^B7BmkxpYXAm!Ua$}rj~aH5xvJnLkC5H|{$ z!HdM{swTu83=HE45PLoLJ@gahG_ ztgJ~e7SL(Q=L9DylJhXtFnnC`k7&d_ESkSlw;0<2utxA zc9L+lBE-n)RmivSZ+uK>2Zshi9zP!YOGL%HYdf$WiWlY_dm_d^RzV=jJrAiPK(jVu ziq?0FRxS&k(}}2(m|htP>%zYiabn#@^F3ddyKVG)QGjfPym47Ruc@6I#X zxUJ>%&=+2_mJ5WE3ZBkr)3klfCqan@flciw(t!%GgqU|s7m77#6}=*|AvRE!g`z#M zh^7AKdtu&`tNTQ8j-C^J$MvtT$Oh1)rPN5x(K;>4&r&tAK*PQ|sHnl*)$yD??Cx0J z6{P+2p91O?{VcO5N)79lkNhm(Ji0n{J@WWh?w6rNI~z+H`+Z7>!=$-^nd;lw4@LV0 zS?2>Y>#OG$%1rV+{WnavRwF`~sx7wYbOaR~z5OMBjw#c`IwU9S0Q%$Y^8ATCNtgOF zy;#QPi9$rxgAxztPga$SZHUrOb+`e97B=epQ|A+V7}#vsH{|Ps%b;x@x5K{9T0r=( z%FfGLUWG~jWfNC5ypTc&>!4z^MI1+7v!l#C;QzF*2h>_aw*$#a zf`c+&reNqS7DCX{a>THVd;ug% zB!w3w7^j~r&gng?xEb?+bfWbz?EotU{A!y)uLpfyAfr0noc#9La+V~SexBY7>m|z(H&fllu!3ce0c|+3Ob4jeJXyOdKmK=&XJV&hP;!^+3?fEc zhlMm_UR`luS+Ll)#}DVC0%Ul=GpQD!%8Z@p_oIcu%y*_~1kHAY5VJn`X}sTT;s4hB zhElk8L=MQESnfpW*K@%JV_Bm|*$)#=ORYbeorqs8JJf$OG+g|&Uv^{sjU2#Bm$k}X zouD%N&?|ghIRNw3CM(%%&yQ2zj~$Y z09|;4E0wqjFhEWnGD;vBil_I1c*jtoh=BTsR*ig5UQQGEzXtAExotv;wdc9@ZlEy- z6ag}p`$4;VQZ~K`#?25F-C&|jBHBTd+H9HQO(rzNxnQ+c#pcT{=t=Ak- zy+8i7`A|Wv9(2*g@9BZCqv(C9vOmJ!GY5Mt&wN#=iHPc*qS5ydxx;HrJfZrgC zx)Hrp8o_2RSo%~#TP^W|K`bPhD_~|xM8m$c8-z#Pb4)5+xggKw?=?I&<&7ufG;T@r zcuLi@+_>F_UP5*!-=s+0^<@}Uog2kldcVZiFL8G^&6Wz@lK{`Ft2)m|26&QPlXIPi9~si{*2kEizIz*z?XM_n z$)czbv(MUj-!!XO)I6zqSowdT{)NVez?JWN#jpGwO3YcSugcFnUtNfQlEVL}{eJiR zNYNIwYtN@&QSxv?O5kTUh+SC{wp|4C0&y6*nnIhdSQ$_mi0H|Q$=6W$ACm+pROe1 z4aR40#xcm_mb2Ptl#7ITE5baP=xlv$!dZNh^||MV$>x`ir(H{1mFb8}2)p`J8XNw> zlM&$pR^ZbCvUbo<%y)aXVLQ9Hdohds){5Yx6}P)D2mwgsZX9(KvUUMac-g4ytiPMW z3i`C^*x5WaZzdPN=Gf%XKC}S4ZRMex`sKVvQeZw$!K#}3(5S~N?}g_5QRNg z;r)la8xifXpY4Kvv~BBpu%$Ij@k|UmC`&RWqea_~c9MnPcmTBNM(k9yMN0&Vp~D7scJ*sa{?Y`3B<35r6>f1z-j3DZvlF+f0F&6r zij#HeP_vE15$T7IlvtEzNv-+;`Z-+49rYvPY%v7S%9k{QEg$8!dr~YfW`d3RF(L0u z@SV@qQt$#NG~wFQz{uyDQ>ww-(olQpG%k0pC3@Gk`U#h+1hNG8*!U^mhI{axX+lwz z?!UuumvK$&PPkbdq}0n=Oc-c(RmpI>ojM--S6jdN@h{h9X`3Fje1p{;qMkKDg;8ck zd7)kM}|ZU<1Nby-frW^o*sX!>@jz$J`7BCQuCIMYsUoAh3g+G zlS^=ufku1&(r+EA?32l}s*|0pqodal+TF#Og|DBq^_=^<|c`#f6h?mn;jg zY)hc&f&-QU4U4tODYwWRu?xyAzFL9(v~i8VB@={p#B1si2| zSohtt`vJRvV;#YA50s)dIT`LZGf#mRK$?zC;0Wc(;G0Z4&r&k?)V#UOf-wdAs_p)) z=S)I7>px8fxIDnxZmsy{H@r@*Spw$Iv-JC61Z6Je4)6X{97bv=u)ZKFX}_Q2wVcAr zF!EBu5kbAT8t+Q`;PtcV=ydX{BqPBvLTR3`;Fgfi{bo}97r^Y(<8Q3#srPU}pc6y4xFE@w6_AZT&8yHHyDdWLVNMFWZrliwf zfFa9~yAatvBQ+iF6rLd797%2-$`yiaF>t`|omnl{YN8}5XD%3sdZo2t5WyvI*mFco zq?!}~7Li{~w{ZD1iRIcjsQiY)CW%W8+%xBq8?H-1IBz3r2O^U!SD>m|amvtT?%=0i z>P=?H4@{zVdcOQyJzCKzo%vmOocbu43X^kEx!Wy*CYlN~zDd81KF=CC{oJXZ`4$cc1~{=O$ZoEu1Gp zQmJ>p3tu$Dsi_8e9nh=suip>Hhd%8zSfo}PXG=B*Bobn66eh{_bPo>M)J!?>!p`4& zeb)sD+1i8hHf6nz_?`I23~V}Fo*Cd+olPBeXWZP5iA>TRa4`PuOp;72C_r|hwQED? z-A+jZ1~kOdI?7*?%`njb)60s@P@vG0_{$yfT-En+LxjT?~_#Os&GD{5st`-C9Qdr8!k zQV_Q7(CW_T9@m#S3&J>3OARbAJW*xr`WM9LoAFN(Jmff$W6s-qilq>x{{lLvtE!cq zA;+P#rlOaovlY@*v*H@O`}67vF5^AM`1e5)cM+*(B61wdVU)2rSI-*ocHpmmvH9F{ zew$fp}grqsZV^j;5 zggfbnA0dYQ7bh1HylOPU!3Fm9^3)E>lg)BlLSbPh`}9jAYV+W)44%*-Qwm(QwTAHF z8j1L?o+QKNDta-R+ihZ2c1yF0=xjdy)XczwSi1wP**E)Z#UgEx`vCbo==J;qM+@)c zR>g3*#XzkPFw01huCa+ih5^IBQ)s z4&!F5=z5q>g$DQma!i-+xgKJd);MN&eBLTwaH(bfJE=5#Qx8U8yw)QBfPrQ0{ORl6 zV5{kq6qPI+40r7$M#Lg)J9ZqZw;Z*^dqt7}yDR(ccfM3}$&&kF4bZ4PKkec} z1-XGIXiM}z*7kTJfZb*Ej!@~gNRdCSKU+f;xf_ytbIoXk7&>z^)@-G?w&SvvB#sc( zo!LiwOx`^Iw$Hu)MX;@7QhtQlkw4#6@&`&HKkMg$HtZoKE2D<3T$z z?Sz6*=cr>$N5V$Easx>YIguIQam#Y&P2sTd70$NUZ@GQxYg@tS$_jnUO>IM{ELEq6 z(1Sf4Qa6`j;;w#6IDs~)@*MhgmGOE0&C9P050$&l5u%uLDOD@bLyRV*$ebG(|7hZ2*Dx*wS)67VPE|D&J%?*)=w;;YJ|2V&S-qh0@N6+>G;c;UaxHqG|s(($u`9dk}HVR`m#e`wrW)f_mc2It&VRZR6u z*fgb#XHfi3LJ6@PVNAnWvR=ksl0>_VY*HSoPvf;tkb-fEE+xo~*XZ@~VWnKEzZ{zymt?CSEBrcq~`zbB}n^s0h6j{SSjxP9!x*5h1rt&9njNG zbv@b{h0z!@EDF{SoEil58MXD9_l_PvFt}9uz4Z@KQsNq`5;omP`1(d~IsZ)+TyU~s zCVyc2JcTvNR8XAid)WE*BY`ZkAk0imDpG1=+sz|1P_m?wp3U|1fXrdN#PfJeGCLN{fc3F%@pBPiR6()-lNUE$Jy;we={25oLqy8SoS_e05d zTEcYgRl||Q2WBn3r0QeWt;#o4w1m%ot9Efr#Q54PSK&R83p~k*zJor;ae|lK@{!BE zHv#^{95UjX7Z2_w>hjBHfLJM1gxZ|J?K9d_UcNnH>+{)?_J~2&Ob%EdKS0$4nC?)m zz=FNtkO}~R3Q50;o-n+=4&Q^qh0NwORX*zC3tLY9ot-)TvIf61_DwQ{(`N&lk!f^FusaN&|GakEK_0z2A@M6Ba+WqabSsO>74bGo?hlXcn5gh7 zq=ZOfsnIw0TTeu(1pVNq6zb&6eVqclcbvXP^o3<4Gq&S~r|5SPgyCg(ar)cKM2nqn zfQWin`@m7Q8ee|fesSEjY00utH@UH=#WA%&+6Xmp=%g7W!1$EjYOOn<2RP)i{7$7f zL-mx^c2HOC*ZtzRM=J18@JjHB3Y5=m*NIhv!A9Tw`i>51$Tx1W zuOoABxhQ3T-aD;^f6D=0q`*H5)MD$|2k)1%1athNS!lk{=3bMrDDWOqOyMwHA=L=l zXu4FqB2E@L?XpQUPY|0`oh%*FU*G1{IsI>5Zs?wB-@Y3!y+<2+ljYV*(o3|Cs{zx8 ziGJ0_a|%jRhD&VjOb{Mbr;t8K8E7o?gGGArcPh%b36m+Fqkj#tdBSjy$UZz}`?cf1W$jb zH;2w6xO1+!4%G^@>&=-r_XQPmm+X+`p!7^X{hCDg>qmrrOTlPRj_2x0(GC z@;vY2!`B*WT1T&*vX~fk79wovps9YEN+Qd19vrA8K0X zA>wIHJl_;YtNLdB{a(9}S+vkGn}3E-=?~6TE>*)mJ>9S^X8Owz-Ry1PL==&$K$P`% znCrylHIigiH4MXQKqTbXcld|vQ}Z3Znn87Q)m|^aU>^40F2tC9DLS~@%oV8$(8l4bi=s4D{Vg2iPeW+&g6T9LBsaPT#ytBj#5HQy zc%Z?f`C-Sb;Gw7_P#~TV1|#7mty|O;)v(MpDp;v;|iFZd@o}>G5h|ze!Dt=QH&c zFHyppXwiVP6I%kNyK++V!kRtr$My#(YYmnxvrPTS^{7-j$NVp2qYV*qn9(fQx$US+ zBu_4}&7lfGSy~~Uq7dC8%GA*aKI@;UFykT41~`@jDSCRnWv=vcaO4gLps&JMtn69c zXzUZgR;bmIMjWQzuom->SF%(|<_NM-IZX8CcuRGa4XeGdqg)EBzL)*UjPr3F5nLhZ zhW#0BnnFLL`I}opIT99+Hl-AeIvW5>3gI9=7LbT`^nQP_GTiZz=>+CjE>ZOqJF9KQ zfqjq5a9U}>@nwgn)ZRD{sdK~kx?<%cBT&@lDdT0|ywl7z?Kl;$8$#&<>}xf=kv&M_ z-kGG+-o&y=J&Dzai{GBv%tcjoM!ln9XI%xj4b{(A=zEpyLz9RCHSe44?cDnx$ZLl! zA}rO>UkA?P)X2wVl!SifEHO>?n-vX_w#w~3g?GKu2?qJhuJ90+ED` zhOhW|nwwcQXJVWOIw&H{!;iwt8LEyY}b6<#q9d`3>$b zC+sG;EmM=ofM`YRO@Fkwj=mZTpv=-01S%-gp2x0HeCY%hai+fxukD@gubjAZhHIrA zx>Anh4BQCkAKImJw}m&l6JZtjv%icRdyL4|uTv!qW+KXWZJf8@oLwsih@w92qg=AC z^jq|6(vU9ck-#n2Oy+L`2B%UVk|{Dj z5-jYV51JiStmv(Y$4=d^%%GD!Vwr;M`pyy=^hDa4TzMiGcI^a1auxLERujVLs6v}= z4MWpf!eWw->CI@G1AM7EG^^99h@o(+=h{I3Y#bjDM z>`aJmio|t~-^$|PG*HNe&4kIELFn4m+0AT!ztV}>Qa%x8HbAQkVJA;tcd-#Cx(=LL zj3+nXp}*FvG469$cU8;%Ab$Zifty%qPxErDLk^nYi_mcV7LLJWP7`=;)+ z;&~*7j-cijYzDo;KdrvE-;oSUG7vvL;N#|KyB}iT5qcWedG1}7IZTuuEY4I)2>9}! z({c;ZC<<2b&vT^D$ne{x4oWhqZ3)p%}qnK(X1nXF0k-0*R2_+5G#a`N~I%+ z%hAyKj9CjBDUULRa-rvfW1tKh-E|024pcH(*aJcobrWh z?T>q&x(dgSy9^`V%!G;vtA2hbNh)MQ3U}>ej*`5S##y_B>b@{P*6FR~N?HrbJ@y`P za1Txm!_2g}Q4Ynd(A!Ec9}_8%{_+4+)JkDDpKn|zukdm>qau=6*r}H=xDkIIPR7>{ z#0~-K-xk>f(sJLh!BVNuxh-hZlh5P{fuCZmSOc|7({_#Bp!w47HR3*@#u!x617wCj zXFgnerm`5jNmvBTXJUjcwd=BkKLHCKLJ(vul9JC=G{&z{*O;Iu4{Z}T3rsDA5UXX@Q48a^EDp&Z1WPAWQoE*|m7j$VAyQ%1 zh}L7tgBehpixwMaw}?)n8m=Kx z0}u{mpT1b?*J~P^0N%jx1IlRkvJZ4{h5=bJX^;G;y3H(d*GkBP{|yoJe^mVK?ON|0 zvqDWH(w9&My|qK%BZj22cxO87A-~s^oLz@i>t_c2Ex6LVWN%SlguxdH$`<^GNXL!z z5gAr>ZZ`M?o~3Jkn+?$C6}QK5uB5}X$FA+iaYNt`vfq~ z`DL2TB>xVZeT;LPhs@@E(9m@Y0CwWVmBx?|*W6zYN8bcH)I1EkCh^g`v z02=?+>lR-eo7YW6)s3>{2{{g3_cw1@?zI*3@IsiGW(bX^meP-A_NUUO*ZO7Ozu1{q zJ%oBjr5RAFYfandj2=Ri%3#T5HaehRjE3Dg?L|Fl9g|Jj>9W;P&+pjShNm{@@=({w z^7<{QLi!#&>4uP!=7Tt0J6y=gs>Qk41E*t}4!)VZ=@nusSCk~G*Rb8(A zR1P1*xiZp>5G&k@)J`xr6a9jWQg_BEziMVS4luDnm*((qUxBf0 zRMjyGz6UUK5Rld3^j;2dN~av9ba$yyw;_T@cE+Va+0P)BOVQO^#1EIKKDb7!JKhXX zOs4!e4k>(h&^O05i?u``kVEZXfY58ykFif~1$owIE-$kZB!`uXPt$FSVbg)Mv%>M{ z+Yd7m3Zml0V|t{P!QG%4p~jp>O76yZ4gJu^o^3VGb5)~zS=YMH4Y+x|6D&d4Rp}SL zzAkY>cry%^O`sXh(z?s{Hc3Qrr6Gn+H{NoN(S<$N?K}9q?ta6}+m_qe7#o^5N!Rbb zIE#h6)=>^AeGoS&M@?+aCY=8Sk8ql#D`>L7aENsE&tsI{yd9DklwQ0lZ`je^ zsj+@BeN^h6U7Z^`QHDoN#Z) zI^ZJ59eJ`wj=c@vbQg6thn(=z8m-b>pp3id&7m>@7w7Gmh-J|^ZyJ)ARA&+@7$&D+`CAN&pi%6IY2)}`p;l@&Rqto*}1N+LG~w||AS z@3XOU;5ej3&ZF#c=b4@C>f=>2*-rfp0NgLNmKNN8sBsTRS9Y;w5t01;1j$Z^RE`#k zVx3a)P)z%HV(NdZuslnRY=K837^Q_DC#+~rpevhk6RLzLk)0f^d}`MUT{!om!L!LS#(|4s9#2;xQX)Q=U~F-@5Stk-n9?k;quR{c)>h%zzzWzB1`|PEMBL zjs`q)D3Yda6IN8Xl5)qGSHF58zk6Gu#iFOp-Y>J-5ABRGox)C;9v^6#iVQrFOa$C^x3JfTdH0O3$A4cY1I z0>10@H(O`;Mms*U?xTTp1=NE)oVU||krkIMI9LJXyH*xo3y>XrPGRKWAv&Z}ky~rH zezW`R^pBkH9Cha^$N$t@6Lo(wj0F?sqhWS|Kh>FC;=(%68BxaA?#dVer^ub4H8T=k z|K;rD27(Dis(6;#_*g5gOq|WbF*vs_Da@Rt;{}h4RYab$^bC5jjl)B^5cc!wo z&@gg=E;_|iXj_qKJ||LZ21kQTc2rn-W=22f%5V4^%jNO6qU2thz5+UI#~5pTkiqey z?tqO~_jt*164n2WB!ix_tW|E}Z;t%Z0G+k>qtt|3ffsHZlrX(LPLqOf44+sn*1M*z zb>{VCik~gAYlwJ`^kCtqV7+)99%%AJ)7Q9mI1B$5LC%`(^xn%O*0#FWWv%0CJ7@#H z-sT}4MF;{x9@M^Z@6STN>h=7)>^z*sBgp)IeIfGy@KhjG*V-@JlrxgSzB^jiA4kCh z&D*)0xd7>j0~dY78L|4K#rABj?ETh8qm1$O5OIpW%MtGUyT_oLj-r!WDUOoZB5S1l zg@W~=A~;9*$Q)4KHBIust7JU4MC#+H)X^^+7ScZ~zn&zsmWVDcxm$m-Wmavuq?yfo z{D}5rl5Qe{BPzD_^RhSoHWE(OHDZ@^r66JVUEX&9aKrbid+OLAB-2+7^oI2~4Yy_P ztvlc(^L^$q{-^`kuST!rXsg{JMy0GRPsKESVfT_Ej!r2A3Qo6%^DA~`dBfkK_NAgP zDT--(il5cVu63i66C}OaUWl{DTRKYw*)(?6X%(%4+9Q%E(&k-Xne}g9m@Pp44)^|t z0{k&mZF?}OjK#2jLWxk+HHLKQ+Yqw+iiSW%lypHLIA!`1^gS^5*#W|s(SHKGOB$ZM zEP@eZc#1Q-jT`AqRP9th^S+;{12`@Y{VeM}InW0r(@Yz3W_i%hbI2g)4u!}^rQ!z2O z8wa}0zCM5ERw{JI+vw#`zC5Z6vScS;g9`GB+dTTtA0E86)k&@7eJ;-udjO`C;Kmq> zNfI5Zk&LxK@`giP<0|GTixK5+Hhm&WYhzyyu7C5V)nJs-aRu^QldjpalRU>=T{<+O zPn4`OfOn=CcKWio2`^r3MOxP?q5Wt4_1t&+J~dfi9Ai02E+{G_mJqzenYU8Y=~bDQ z%%(aTr1Dc9j63~gF z5B9+lB9N&f+(kuVKoe|4YE}aX1S5vTHKq7gvrq1DCkk5nYS&v5#NdU3$atDnRmLH9Kt)TQOdLxwk*H*F`k>YE{wkM=`7 zW*)h+y4{k*vC1g>@>RTA*ui`_#!#pQ~bkP4@&38@~+=s*g4`06Q1kk@TP+6)5Q@sO{vY?o9e~oQloQ$Io z>TNQFqu8HvGIi9c_^BhOo&N8}V#$>1)hM8-PRyXa`o8%wFe!X2)_6xC>TGI}Yk;lOz9Rd0r1$1Nfalt!B~HB3Z1zkYTwys?Tvvunui%tibS`MM-e(&AUmD;GK1ldp7nj6bK9cos{orv0EAF%&VR z%7M6Yhp(Ys--BJu236?116D~>IGxTT49?#SV-cej=3f&$dm4uj1@n#tV&GJ|X-J&) zD@EAvE7x|%WKB=audIz%oXsDh8#nxt-6}%I*r`|Gkd?zo-mZS5@3?{SjzaO*GijeG zFptud(>r=gdD{iOP2Pmkq%S)|#bfJ(%-d{xSD`4C5g=X;-p zCAna~>=^ypnH|$KbiM>KVAELu^p4L?`_#;Gqc^nq$w#lGE_(wD zehHMLqXK2ar7tZm&KyG5Tr-)Yz!x?*cSePauMYeBs~WG0=#FYb9diThWgTsd6qz`o zs$YOb%4q+nN+TVc9%!i?tvE4Tjccj2%cI6dQ3v}OA{UP=>ygymM+>l=h4k^ZocDjQ zP5IG7l9H?@Q2sOdq|F?Eh0}b?JL8VYmEfzz{EDip zKbG@b5WV7(r9M0D+~-SjiofT(k-d5Phpa6MHax|cCucG0hmFbuxP-lHO!*!nmL@6^ zQ?A9CyH&4L)~?miy0{kg@jkr^5!U9pL)v=7xSCUO08VX0JEq3SH6zRP?1>u^-en}y zuXwg@{V{FobK^n9^>DNqO`UuR?($u@L`>1}t_OPHR`mGit}xx^Y1Q{PwP~Rm{Z>xr zAxx!LbRm1ZwF_0~gW?kvI^P|G-dC_Pd+9#`!!ToSJOW6jJGK6v^`aks?4`c|%S*L= z^;whlCsY?-s=OR$aHfLI1)W<2xVA5A8@Xql`nh`Zet)54S=<9QQ{^Z)Smn6EFg|ct zl4VFA5A(DWo9hjM)4$KQ@YsCX_ISwQUGKOePJwvksH zxR;}YhqpT8+iqMr@-HKJpkD$XP=_0BH5|M?TRl2>T#u%?FDPiQ|JzJJ8Hq&*gw%q{Bk@ip@k_qppsPPtlr$|3!Q>xcCY$LV|( z?+hMjDMOdK=lpa9a#OwByNOc6NFjN&y$sFh;h%er0qa3sLB%c|>x~_ps>!Zm?GvN{ z*pN1}=SzracTVWkZ7wH)PaUN8mbHRoqCbRvTjWbq z6nh9u&yih8x(41wm$%kq6a#?eWqWEzWgLx6X}xn0r)yg41x?JIR|Udysq8GF{%)zZ9ITxC?Mi-<%&8kV0aQ&USU|vWE(Stav!Uljlvz2 ze+-b|Y^ayL)D4j&Mxv1p#6&GV7yIjeW?2?qaZYaxWEpek~oR>qA!1MMOJq58evg#7b*;L7SOZmDTAyxa!~vci>SgA;JM$I)@WbNxa)FJ$kaPC+ z>7M%;{0cL#Mo8~Ji$EguQ`|Br?$(N>TwmdyM+khdoD)L|qQcPbQV?M(Q~6yRaKn)7 zBBwbEF^9!EW1eKHd(!aI3xDM*|KuI5-hi(%?(>nah&X&O63Lk}5I%Z}u= zGy^<>9$^f4fhRid3OtPA4R818Kwg(_>u98%yXlhxo4(sR&D-N3n5EqR`iX)2^clsp z-#BIr_+I&hN1P8@TrqdA9{t!4+O9oKbu*1gblMzP4K3q@DZidmJCx%u zyg~O`Wha_ECv+|b&b>ZtUO<9*d1ldlx3vo z=eQDm-g*FRV7#f@*LGzPw0mhm_C1{=g)0N{0Mw<|gpqt?G9v}u7)%1^i+Oc*p2j?A z?r>*JIeTm#rTO3o`@3tscJ+Abdr)|D9Sy9~8FtWrafdR#d26?rP=E>VH2c@#kns9J`6QP`&sl#`3x+2?&<8yvajd*yv3URzGY_WPsM2rB9xkH2EV;nP|liBEAyfCfnHNt zQ(8M;ck2?YZrFV=s(0@LCM(zhyc9?}M+v+Y{$$Kg&9rK^cC&FNSi0L^r90DaN%=%q zYbj{kv#n`mKDurp*Rh(A9nGh6brrt3jtg5g`cOCktD$nA?ANG0fbo;;7B~Jh*Lh=i zd$rFRA90pi>&BTQcAsM&b3 zJL5D{SBu3V@X(srg|fy0=(Y1l0Rz`dlX<V^SsEm%?auaB16QT^pk*X^e7qHx4E!W+J%a&vcP zc>ZIS7=PM&E!iFUCx|7woWhe&tHv-)T2OTM$*IOxcT&XZJ|B&yEN0;?ECQdm&Cx=H ztoCT;P8f%{e;p_0x!CG@o89kn79&s3f;&@=?f{ckjxvobdr&<2dh6TF6UMfOwS$=Z zu=3CNFqX5yANO^KnhQYL#b7D_P|0ho>J5vZAn;DQbe{8Agr0%S_Z~^6g3$*;t;?_0 zO+vy7nTo!uY5oway_#!qSgAF*MGh-Ljhn@%0~C{MARU@U-I^ z5_h(OI?Q7dXHTUV@lUs3Mj3k^b5p-|z1S>1I7HXZ#q^R`=GW>+DpP86n8kTM%0TV8 z;_WQnOY#1*bhxW#rgA3qFG?-39^1D|8eh5-z1S~b_Dwy0lKh%Z0M#(XNPYJGaV#2N7vfiW zAf?A)M!a`H?qN)i9`Ul#vS2=3mnpf!SdfwA;(6hiJsrk^L9DA=K7BG>n)ppQ#>=0n z7z#4^QpQeQq{|H?DnDZ#uaf)iUdZwz-Q|sdB2S zI+<2#pW(J--EKlFU%gp)3T9oCV;c^B>`*wAams>H?Bru^DmKK~;gy^~u9`c~zEFYW zDyvbw9$9=?!QN+>Uvr_zA^tO&6J(CwZJLH zhsm$G%;Pz&P8{u$L>^IKz9Q7zQ!vj}@up_LVzvCjXhcWm?VwD2!hMZ_>vr?lW79b| z71vUxDaVrG9cIzu)B|D*_H$}tv4UMpjytXi+(Ak!oU$P2P$dJen*yO9mz9$wnu@y9 zhXZVH`G%%DP(c}mWQZS&*BJ7-e25jeQ)IYXf0oKR&+ctB@4S#?C`(OG_b1d z#|6TB{IV&)YlheSQn9NY$L6a-C*IGwvT`=E=f5?q@Xy^@H|Kc{RvmudZ~d~pK7P~j z6q+}DrQaZ_MOrdm$tine+57C&Id^k>)xrfT^rRDdJL;X>u;`-kfkD%S1ff0dtS7PG zNt;1-$zRYsEdi0w*;X0MpH8h>Ind@JC(ieG52-;t4DTQpSmd2Egmknlut)8-_O7o^ z^4EW+v-a}!a)*FQ?zf19ws1Y}Iv4N2@ilKCcC4%34n(TpvdAv~>Q!gs&?WJB4{4&a z-TX&SFz9EI8}7b%e5%&i16k#d%jH`9#w_j_gQR>mj%(Bneku9iZl9;UO--|T;`tmU z^k}i!@>Bfe>aMj~Ak5|hx%IBjJn9~Dbv5Dei6r~lVrpx19xLB)6glI;F=BJvm%F6N z;ULSwn07uUDOg(B&ZPQ)s_!`S23IG(DRf&ntR)c6bDIB!$i8PdpS#9L zu4f73s@(D7;I%>!YSr+akV61$y)@l^NjO0)UPN7;H=XtzsIFP?Tu?okZ}s3c_tS>@ zmb?ZnDe;}J9f zj08-UOxs6an1Q)XOW5wueTkxZK8@6v!}6;1d{cWBYa)q_lG*;g;cQ zNTOroy(8^zqW}fJ*UxExv7fkYep79^fK9M;PqSr;;=Gu$_qgwEYFtVa$l&%m+?4%* zY;D8Z{&*y242uGHcCpUOX%*3(+QX{ZU*;U9Ykesga8+(_F!KZ~Tz0=)wKVz)C zkR+hHE-ra*#Vv^)^JNhtrxF79IP0)09Lvrs9Peh(qMWH`Hh1JQ`S|gXoX|Ipr2Vwd zoekwOx4+u3ID;Iq3mr@i*ALdO79QOgwDipoji+Ymr8DA|W>jYswtvLHw98&_AK~_< zIPdWJSXzT-MpM45%DS8+0(s)yumh1yW}EE!_JZ$ zh(y5{_aR=c7sV!bgE`(-lGn;*TGh7HH9aEER4rf)t<>;Bt?u0Zfv$_^$cR3Ecr3;A z=^#h<#6m&vz{$kTTcO$5K4P}Dfqt$tj~VK0hGVC2l886jM@G7FH0RRb?H%77Nj@K%!XMYS}NQEK5U# zFZC>#q&M7=e-J(L2{uQoO_g&Vd+Ai>2S_ZMEbo14M*x@Xod-{T79mqvHr;7|)rbmk z3WrqNrPdfkTB2yd5pXVJ+@X#^dY0zYH7$;H)!sM5dqpJtESvUJ@)1{W&E|94rE>Yk z%2Ct2^BYC%Kt-_ck24kH*SaF6p>FQg4XT$8^n7W@)yh*}GaGa)uPT~6>R+x=W-IP~ z9>Kc8p{M`G`suQTS?61Jw8EK1me*7x+pW6|Z-c*})2i4se%?f_aq`tZhkv+L&5Pia zsoM){Mr-;%e!Ff`*z4e7xGIjk%EQ=5&OdTx#VA$Fq>nZd(@`8%t!Ab$LUX7i+uokt z%j(W73p1P%dis&8gGML)9%H^vjc#gkPwI9)ayhsTnbtP-)%Cm??oGqe6>M$qHJPWQ zGdD~h4@+njl=s@i$6H9zCggmDf7nbx3RbwMjra*{<_r$3W!TwA)-5h(YgXz`=T^eT zM4G-qEz;V}djopk36~%5?~QF~nw{x=@?08BSc^Aqc_|BqSdU{^L9{~-Z|4S%z$n97 zW{oF>%0e2)6~mK~_qYo56fS-nqtUVFa`*2EyaFmuK@6)C3${yo3r9@&e14vCc-{99 z!uL~4`vx0zMy1@?IaO)oo3fhS8=ctNTh~gIBzzwo4|m(!h|(GUYz<&{$`gO3_`*#f zP@zhRV~V(8RR6eS(8cZU+Zlzt#F4x`_2z zi!9!;b#!!pB(fo2)=3tbM2B)qls{TG4$6qgSXTDx&HFKIcDy?=a`?o$?A&o|t4}is z**GVNZj=G-c4SWds@R`%i`rZ65cP1!$a66Aq^UmCN@OsE*fU;v^qfK$#xAZfff|5g znHrpQi@1hw+h*=!4T7z_x@|WsM6KIy(K( zG?l#%H!yz1*OK5Go}x{WHQlEXJQ_l@N$a=qO8&*{H2%6m%Ro6_P94*k ztt=a83)hj)IkdT5VLq!95ZZZ+AU_>C3bK2)An??C?YowKdhAHhQ<0IwiNmt;?jz;^ z&DNXUem8R^re|)cTXne=H8hd;vT4{P)7(;a^WG;ZT}b<0%GoQN~2gY8!YoQcJ?3a&VO%HpvPD89{ZtV3;2*B;x4 zj${kAy~G7k7BKEXPP}^qxW(^U4}ZK;ndN6{Io`$3c`4L@Cl-dx^REp&p(c`GO$C+_ zD&8w()~)=cF61mb`N~N{bMshT(Ax)B9oAAqig%o|8a6j_3YBoqj;oh@8Z*^at)oQI z)^KJUA>Zl;P-P)9C!&bs!I4HO8RCf205BYm zFsHx%evVG)>X+qM-ugHW4|Xw*2vMdpYH*jhXl(K`cA{lx7^;M*g{ZzvFr~{96uw3^ ztEya+*X>cd{j@ZPtrTY;c#CJ@S5M=5O>b%Ob?IBVj&jm_t6R4}W*p}``TH4UijyzB z4|77PRf9yWSa-OEdM;db8B^d1b zQCvlH*?wfhMC;ytI+OiUzt1ntbA*1R->e5!R(8LXs*SSV;~F-k6=Kj1xLs|Z?#g~q zCYGDk|8y4ap@xZ@bCb*YvdiCjXX;At!fWAFRi5x}LGp`tGoP)*J=EI1_*H&8k$lZI z;Kg;t?jn^6mR+3VhXx-g&pWx&Ab}JKm$!CnQ_oIodh^69=&E&OsqPAR?fF{GOJodY z`bAQ<=L*T)PtLm0aZ-8B;A6Gx$Tja??#LcfGIf{Nb#;{0sbmtK0kz6`lMr{cUzXHC z>^!NaWfLH+DSlm7uJrM%^ZxjDHV@moQbZFM-noadV~s+DuPiUTRxbb1H`jM*KVhVj zB>hpl#oMb_%`zjl-c}y?8fh$ydIu|w4~W_c1s{AL!3Gs}mZ8ske?s@oE|xRn8K=_* z8&93`aVcucw`;~vSwSgZxZeCcfxKFq`P4gK1+75^v1`2WV;XTdy)ieOu0a9`H{Qp< z?uCCZuRA4)WwkhCg<<1~bzP@W(@1`=A;=;y=B{VKPfjg;+ALB`8@}7HldjL{`ecZk zqZyQTChKjhYeTW*E?n%1pJOOwnsj3&>IIa#;<1B59o@c83Z%i0b{94SrsrwBN=G6; zafEfC{$Qx~tDg_cK=eYkR+HDtqBFGkv$m4xo2aIvU)!TK4qAciP6E*X4|qcPgxu zkBjuTL5M9Js;m&(tj*BYg?KlnRV=PBj(wRZ%yB1)EakC zxJ;dynpaBpPR;3Zg!$K~tNbT;{^MV24-DyY-^gQa}uzx~u-Sn<^QW^K>0me84Nw(OHX62J~z`v#bm# z54e9&&0942VGoOEN*!BSS=%a)eB>vM<5rr?4lc&5c6_^;u5SL)&x?IfPU1n;yYfY0 zy-ow&gV6W5To;Cj_YWQFiQpsaI#$uHb!6{D++Td|rjcDdn{aR8_BgKW{(eU&t3x#f zuJt1QHoHM2`t8=d}}tLU)ZgM!y(rempM1 z-d$i%!?|;f(~K2sx5>S`cHP|2r#~R5Y z9ZuoR+?`!uQPt~rn_;J$cV~tCTdHQ6v5I{u=9gJJHz^H06W=85!!9$w*rcq1VO2uJ zWO$g@z1i$|OU6GnNsBr-PG0X_auA0wR_=Ii`Wv+J{LfG=8MMmv`KpxCRGS~%FYIG~ zjHd+nMYDRjoLogLwMSz}ki{}}fn*@EU9I;RiSC^)*Sfb}?wOyvOr;mkLZy9E`MBdG znt^ZVi+jhsgR)F*S>vv$Hs=Q9D4i>XB)NFeLwmvJmzu)DQe?u z=?oZ&=-AHgHi}duZIWuqvZKkHt`Nj|a}xt=BL^X(QiOcz<6iIQ0g>c~x6NgW;jvNW zoS80;J%c6w-S+jtP5Ny>0iP|{GSlCerwJ;is=Yj}7`v4TjZB|>@BVA>{yPv`%wky0 zkkeT6ZMExrnxCa3k2-EWiY!fV4v}g#>wTXmy5_leixJso7`fX()H^UAe*WEVgQ>(6 z=9VmPQiAfFOOmsEXwTDib)u_M=ltF@(46~{?^ma#3tOSvRgG^*s1+@r41I()#+kbK zELE0YGcTPE@-1A=KR=)5?y}FZQkW?;Fsaq*@@oDZx_w*pIdJxvI!M*3o@!V8{a}Y{ z$n^nHo2p)sp#&Hwa9$3x9P>t&-E#3XJ150>tk`I@) z*;=}qXjW{Z^03!%z_q*3aJuA!u$-N`#peDrTt@d@BS+}8aUy!OTdteMBRsKy*~J+b z#sIV2h+h6aF40m0tn(p;EwwxitI57q);H;UQ(0cZ{S!3esh>Zan2A9?zm}R=Y5iD# zQQTLN32x=ZkC_z@y@~E7awkp5Sj31>ee?I(2DQ>qVV}q&$|!K)YSar62}{}6*noA)+FNx z7adF1Yo{cXC#K}q+V3beIX~)lx!886%&~oHwM-ynU;ur$A-MeU(EP22g~8O*j66oW z6PWSrJQ-w-`9O8YDUT!ba<}&qIio|U$ci7wsdN01or$FgTa8Pn6B)?(p#AJTZrZ))%O8p*#C)#}ULft!_CP%o42@)-`xctC zjsAvdZzBSZr%n%M!ORFLUcYjwQKTuq`IUIWv*{0I?=*&=^osaoH9n0_+K&O4b7Nn& z)79s?F=<&IBKnz#mfkts*^cK|CzYmsb*gTP-P`X^u(N9oS-+k-N%TJ3dU)G%IRflb zZPb{}+v>)G@e~=baWGbPPLz@~-%LOdWwjGsNh>aUmtAqcMYe`rBPCKHaF*J&Jo?3G zmKjd9qYlRkQq?}L7(HuYkvr1cd+PK<29#MeX?vIDy54<>;-GV{_EF<8!YQ|8UR-f} zbeZY6HnYU%_okJ+Xmt=$Hp%rsnuDL{33vvJFA#6;+#4N>FwWL6WIZvr%B#%MlZC2T z*J|DBA{qDfQNz609PgG>itm>BQ71aYS(Z^$9Q+LFqt#!sIxW|_-5Kt1*o#EV?aExG zjAF%6jaR)nmV|z{Rfl~ZvDdo#F1+sY49$eW)!T9Je4h(%inM;(dK#H{=G+8LEbn}m z@y6#+iD%65U=#Xcf2ndqg;G_NNTnOO=Fy2!nmC%D`9ehnoFU@w_Vd|-0g!h|X)P70 zEF4=n`1-Jcca>J$tzaaEV3p6O`?i~Pq9gB@HCDWUOOIJpv~8E}r}QB2%I{Wv%&v19 zPs=EMzy|6*U4TJaoi{>wiwA_Srg1y?7Ro>>wj^NI_t3+T+uR|abFR0li-nnqME0Fu z2_f|U^+p_zbX3{w6CuhTWT(RJ&BRj`8D(rT#3ejwR=h90sdEjCGux;#*9!9g{MO)o zXH;?$sAEpy`Jz1ndO`VVjc|m?eA?wKIq6qj$G5A`Hx9nA(kCs8LqtEl8&Q6_b%&33 z-7I8*ekJTdYTAuGX@vKnO9ta1$FYl5bSURNNC#(PRky+5eNe{y()0+hu{l}a9yCqU z3@$V~MZFShbsk6%BYOS`DQlP+9nA4MSN4)KsQMP(46(2&)K*T@DsZz@cXG4v=mLoO z*MPj9Lu#8+I*Qw6&F~ZzU{+$?Y;8^|lZ0@25*U5*@q(6lbu-9&jVF%;$wsVMIO`$g zVJ=v5U#@#Fn+lwCZ6Lxk{7bMukEG{ZMn73HwWkcr5jX|0JQzI_p_q4bQnxJM9$fS=CY4DA z&m68v;yJpL*+7bh#-gF>s75XJ^#;35H;|U>N{nl=?hbV3oKe8ac=v!7M?E#^ZWL_( zATO*W6fBos@9}_+H0sjE!Q0%OaLAa+*o|u!tKJ5f-2RdjTf=m!ZMEV1BC`&7Xzi0c z#{`TB1B*T_o)6fDjh^Y(qYqo>pOte>(j_*j7;5gQkmfFW=enibP3;e!GkfyXT)sP) zdRUQTA_g4MKA-evvD7YuggQ{&McY}fbDR|acJu%rjD)6aKv${BT+uAb$T+1&CZu%64nB+@H#)Ni*sJpC+wH^0aO29^nCxC0Yl^~ny$lgX zr7bTF`{M5GT&>ExnC%q2dD7;5`ojRa=0~5auFWoW=(fq^{R&Q^jxb|AJFwdO{P6m9 z()yKh6Yszy4~{nH4aJz#{rI|wRk=zR-0@cyM+nhQ8o!Gm`s_LVmPl7m9jI3G=F!8G z@k@~vmm_3Q86)qc^6pbV1}n(*f?8cxo>@IP-3u6#;*v+kRWnp_)D1FC@?DCw(l=lL zyt4XdatnU^G54HVCYY-ue%>)wKHd`tHMa`azA%X zdr3DsWAyo@v--=dzw4CB!&`RVT2-{;70Y`4`OQ+sGQyj#!ERe;C?^?@A| zQ$iXLxj20~C(IJg_mzVKuIQughg)oK7hT+VUk+RAlJihAY?=fZRZBMY#R#$@uK(e6VC^+SUrqwd0QXt|+*9aB+!(I>|cn8H@{}-si zx2t~ghcFyB;Q9uB3 zpL&L!$R!OOWw8-%9hp~+3AXC7^M`|-K{H65Tsy&^%o_R|OK+osKFsrPj~hjX-fYvK zl6{VK9pBH_=>b%zeht*iJzo-%=Yw~^9$h-Sa}y@A-BySdxB)x&tbFS}@$bnKqykLr zH$ebt{_n&8WI(Xf|2rPIlj8U;&=^&7>|5bLz#k($Gu^Tat}!><<&;1m@^T$3g9{K6 zQc^e>oE%OOM+KrpP=LwF;bg?5q`xl{k&{zWBB;SMGze-06_}C|P7Wp`gOgH{kr5Co zT3UK~I2{o!9W4!<8csz=K|xMVMn*~sz?4+ZmE%bZq~jG%gsTWLB612YN0IJfw|^5u1JebBtinIISTwkLSnHqL+KMDADth>3B$ z!tu9Q2y*|AaPQNAsR5zVQd0hfkdpky{!$e|7Zm@|2Al*;&>@069=HPNk`zRO2jM{o z5V4e*%QL4JAYvh<;Om0-L0}oN#~_G?t#KR(LUl#yF^EW7U!OA;1UaWA0eoN=5aNyj z5fSmQuo2o5er7>Scv?|bW@c74HsD_-Mg|5z;a~=Vcs!do105qXD?2*}I~ywt05Q_j z)6vl|xZTH-GSD%xuygUk`Dl2#IXMV0GXT>u#No*VXc<{Jc=?6kBDBJS{JcB_oQ;K< zfnGQkPsT*g#LgoidJZm4D|JpxM3A44hliVkm4%Tt7SBP)z{<&AIlZ*7sB~UlMoL0V zL`aa2mkVeNfb>jkJVNJcCuWx$HPloH__={*;4K?$e}No)qSEKpmnRqWE@*2&l@%jq zm&62lIoN-<JU$!(gT9`yF%S#ILa{X>e0M&Ho=LQC+?QE?4$L*)* z6s1J?{szV5pcf~{?FKt4u3R1+)&D+80J(oph>cf7Mpb)!)TReHZ0FtUqd)RpQA(Ki zH^|7!EhKebbEx0a_EY`KzQId+{X+_pLcb?O$H2lRAR!0s?KHON{LoQ<&)`CLudIaN z@1+1BCqW9ITlI`Cm*joc*U?0Nk{03TA_##FSPQSvIk~1{EgjwF7tt_vmBvP3nH+2c zkdBFsn_pD2>a8kN-Jx6!8v5qVM`1oLR)TD4=?MB16f1cxr=X~4Cokv!Fvf|Wn~j<2 zH%QOK%9Zs#F6#!VWbDT zCFh``rDtSe=OZCbY#rGTLB%C0SE;pf{GaM zHss{7WW*#SWcrE-ZAK^+0imL%rlFywp{Aw+`~ZTSfsB-dRv%~!g#rx$7f3^gpf?Bn z?_U*w9!SaD^a0qEl$4x;`buQNyLcwRZ0Uh2G(aB&SK4opw6VPzrI zpr^ZGM@{fvHg0feG=Ni3(J(NvhQve>EF3U!MMMxSP=UhU4GJ~2A>g!t0s}%r?YRI2 zv9kDu_|ek%2Tb4M`8@YYcSM0B)oI8z=vb+t^xL8u0OQ zb6HziU1lV7aMc39qk#_os$gYpY-Y{R$17pZZ*KW-h2J69)tY{I>zCi3u;CkuKE4gp0%2n2{cs;D07S5I;3w zHkXXJc?@Aj`cjY=4)GScJV;=7=3#L32LXap<(kPsjNC;=y@1W0b6 z$;!r|uPzUGDgy(80LTFe0vZ4m4MY`MdR+}>78ZUO3$v8EhAz;YoXmoNQ$c@MproeN zQe%KKGVn1nh@F=gprQnVih~V-0&o&apa)fLMRhtl0=YQ=8W2=WN(xZGNE-@J377&9 z�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 literal 0 HcmV?d00001 diff --git a/Sources/MatrixWallpaper/WallpaperApp.swift b/Sources/MatrixWallpaper/WallpaperApp.swift index 54ddfd8..99ad53f 100644 --- a/Sources/MatrixWallpaper/WallpaperApp.swift +++ b/Sources/MatrixWallpaper/WallpaperApp.swift @@ -57,7 +57,15 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { /// Creates menu controls and begins observing desktop playback conditions. func applicationDidFinishLaunching(_ notification: Notification) { let item = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) - item.button?.title = "Matrix" + if let url = Bundle.main.url(forResource: "MenuBarIcon", withExtension: "pdf"), + let image = NSImage(contentsOf: url) { + image.isTemplate = true + item.button?.image = image + } else { + item.button?.title = "M" + } + item.button?.toolTip = "Matrix Wallpaper" + item.button?.setAccessibilityLabel("Matrix Wallpaper") let menu = NSMenu() menu.autoenablesItems = false menu.delegate = loginItems diff --git a/Tests/MatrixWallpaperTests/WallpaperAppTests.swift b/Tests/MatrixWallpaperTests/WallpaperAppTests.swift index 04e85ac..45570d0 100644 --- a/Tests/MatrixWallpaperTests/WallpaperAppTests.swift +++ b/Tests/MatrixWallpaperTests/WallpaperAppTests.swift @@ -2,6 +2,7 @@ import AppKit /// Exercises the real host's menu actions, notifications, rebuilds, and cleanup. func wallpaperAppTests() { + wallpaperIconTests() let host = WallpaperApp() host.applicationDidFinishLaunching(Notification(name: NSApplication.didFinishLaunchingNotification)) defer { host.applicationWillTerminate(Notification(name: NSApplication.willTerminateNotification)) } @@ -52,6 +53,51 @@ func wallpaperAppTests() { check(desktopWindowCount() == 0, "Quit unregisters system observers") } +/// Checks the shipped artwork rather than duplicating the generator's drawing logic. +private func wallpaperIconTests() { + let resources = URL(fileURLWithPath: #filePath).deletingLastPathComponent() + .deletingLastPathComponent().deletingLastPathComponent().appendingPathComponent("Resources") + guard let image = NSImage(contentsOf: resources.appendingPathComponent("WallpaperIcon.png")), + let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil) else { + check(false, "app icon preview loads") + return + } + let bitmap = NSBitmapImageRep(cgImage: cgImage) + check(bitmap.pixelsWide == 1024 && bitmap.pixelsHigh == 1024, "app icon has a full-resolution master") + check(bitmap.colorAt(x: 0, y: 0)!.alphaComponent == 0 && + bitmap.colorAt(x: 150, y: 512)!.brightnessComponent == 0, + "app icon has transparent outer corners and a black tile") + let greens = (300..<700).map { bitmap.colorAt(x: 380, y: $0)!.usingColorSpace(.sRGB)! } + check(greens.contains { $0.greenComponent > 0.7 && $0.greenComponent > $0.redComponent * 2 }, + "app glyph uses saturated rain green") + check(zip(greens, greens.dropFirst()).contains { abs($0.greenComponent - $1.greenComponent) > 0.2 }, + "app glyph includes contrasting scanlines") + check(bitmap.colorAt(x: 300, y: 267)!.usingColorSpace(.sRGB)!.greenComponent > 0.7 && + bitmap.colorAt(x: 350, y: 760)!.usingColorSpace(.sRGB)!.greenComponent > 0.4 && + bitmap.colorAt(x: 700, y: 760)!.usingColorSpace(.sRGB)!.greenComponent < 0.15, + "app glyph retains the SVG M's stepped shoulder and uneven feet") + let icon = NSImage(contentsOf: resources.appendingPathComponent("WallpaperIcon.icns")) + check(icon != nil && icon!.representations.count > 1, "app icon includes multiple native resolutions") + + guard let document = CGPDFDocument(resources.appendingPathComponent("MenuBarIcon.pdf") as CFURL), + let page = document.page(at: 1), + let context = CGContext(data: nil, width: 72, height: 72, bitsPerComponent: 8, bytesPerRow: 0, + space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) else { + check(false, "menu icon loads as vector artwork") + return + } + check(page.getBoxRect(.mediaBox).size == CGSize(width: 18, height: 18), "menu icon fits the status bar") + context.scaleBy(x: 4, y: 4) + context.drawPDFPage(page) + let menu = NSBitmapImageRep(cgImage: context.makeImage()!) + let stem = (12..<60).map { menu.colorAt(x: 20, y: $0)! } + check(menu.colorAt(x: 0, y: 0)!.alphaComponent == 0 && + stem.contains { $0.alphaComponent == 0 } && stem.contains { $0.alphaComponent > 0.9 }, + "menu icon has transparent background and scanline gaps through the M") + check(stem.allSatisfy { $0.redComponent == $0.greenComponent && $0.greenComponent == $0.blueComponent }, + "menu icon is monochrome for system template tinting") +} + /// Counts visible desktop surfaces without inspecting the host's private storage. private func desktopWindowCount() -> Int { NSApp.windows.filter { $0 is DesktopWindow && $0.isVisible }.count diff --git a/Tools/GenerateWallpaperIcons.swift b/Tools/GenerateWallpaperIcons.swift new file mode 100644 index 0000000..c9eab21 --- /dev/null +++ b/Tools/GenerateWallpaperIcons.swift @@ -0,0 +1,150 @@ +import AppKit + +// Run from the repository root: swift Tools/GenerateWallpaperIcons.swift +// Generated assets are checked in; normal builds do not need to regenerate them. + +/// The M contour from the reference SVG's final white wordmark path. +/// +/// The horizontal connector to the A is trimmed at the M's right stem. +/// Source: https://upload.wikimedia.org/wikipedia/de/2/20/Matrix-logo.svg +/// +/// - Parameter rect: Visible glyph bounds in the output coordinate system. +/// - Returns: The original outline, centered and scaled without a font substitution. +func glyph(in rect: CGRect) -> CGPath { + let path = CGMutablePath() + path.move(to: CGPoint(x: 18.322, y: -14.3147)) + path.addCurve(to: CGPoint(x: 18.0979, y: -14.5228), + control1: CGPoint(x: 18.3215, y: -14.4357), control2: CGPoint(x: 18.2588, y: -14.5226)) + path.addLine(to: CGPoint(x: 17.6334, y: -14.5238)) + path.addLine(to: CGPoint(x: 17.6328, y: -14.6515)) + path.addLine(to: CGPoint(x: 18.2221, y: -14.6575)) + path.addCurve(to: CGPoint(x: 18.1813, y: -14.9078), + control1: CGPoint(x: 18.2092, y: -14.8052), control2: CGPoint(x: 18.2156, y: -14.8674)) + path.addCurve(to: CGPoint(x: 17.8689, y: -14.9787), + control1: CGPoint(x: 18.1372, y: -14.9598), control2: CGPoint(x: 18.0375, y: -14.967)) + path.addCurve(to: CGPoint(x: 17.3196, y: -15.0079), + control1: CGPoint(x: 17.6959, y: -14.9887), control2: CGPoint(x: 17.4926, y: -14.9982)) + path.addLine(to: CGPoint(x: 17.3196, y: -15.1462)) + path.addLine(to: CGPoint(x: 18.7116, y: -15.1462)) + path.addCurve(to: CGPoint(x: 18.723, y: -15.1302), + control1: CGPoint(x: 18.7154, y: -15.1412), control2: CGPoint(x: 18.7192, y: -15.1355)) + path.addLine(to: CGPoint(x: 18.723, y: -14.6575)) + path.addLine(to: CGPoint(x: 18.9876, y: -14.6595)) + path.addLine(to: CGPoint(x: 20.5006, y: -11.4455)) + path.addLine(to: CGPoint(x: 22.0286, y: -14.6545)) + path.addLine(to: CGPoint(x: 22.425, y: -14.6615)) + path.addLine(to: CGPoint(x: 22.4278, y: -14.1231)) + path.addLine(to: CGPoint(x: 22.428, y: -13.9757)) + path.addLine(to: CGPoint(x: 22.428, y: -10.3897)) + path.addLine(to: CGPoint(x: 21.388, y: -10.3738)) + path.addCurve(to: CGPoint(x: 21.388, y: -10.51), + control1: CGPoint(x: 21.3766, y: -10.3897), control2: CGPoint(x: 21.3653, y: -10.4462)) + path.addLine(to: CGPoint(x: 21.8236, y: -10.5394)) + path.addCurve(to: CGPoint(x: 22.0681, y: -10.8599), + control1: CGPoint(x: 21.9744, y: -10.5541), control2: CGPoint(x: 22.0771, y: -10.6028)) + path.addLine(to: CGPoint(x: 22.0681, y: -14.0839)) + path.addLine(to: CGPoint(x: 20.4531, y: -10.6729)) + path.addCurve(to: CGPoint(x: 20.3745, y: -10.3961), + control1: CGPoint(x: 20.4041, y: -10.5695), control2: CGPoint(x: 20.3774, y: -10.5191)) + path.addCurve(to: CGPoint(x: 20.2163, y: -10.3991), + control1: CGPoint(x: 20.3184, y: -10.3931), control2: CGPoint(x: 20.2724, y: -10.4011)) + path.addCurve(to: CGPoint(x: 20.137, y: -10.8077), + control1: CGPoint(x: 20.2162, y: -10.591), control2: CGPoint(x: 20.2033, y: -10.6513)) + path.addCurve(to: CGPoint(x: 18.733, y: -13.6777), + control1: CGPoint(x: 19.7139, y: -11.8046), control2: CGPoint(x: 19.2009, y: -12.7207)) + path.addLine(to: CGPoint(x: 18.7299, y: -11.4417)) + path.addLine(to: CGPoint(x: 18.6162, y: -11.3053)) + path.addLine(to: CGPoint(x: 18.6162, y: -9.7893)) + path.addLine(to: CGPoint(x: 17.6364, y: -9.7893)) + path.addLine(to: CGPoint(x: 17.6336, y: -9.923)) + path.addLine(to: CGPoint(x: 18.1119, y: -9.9967)) + path.addCurve(to: CGPoint(x: 18.3326, y: -10.4054), + control1: CGPoint(x: 18.2991, y: -10.0445), control2: CGPoint(x: 18.3129, y: -10.1846)) + path.addLine(to: CGPoint(x: 18.3215, y: -14.3154)) + path.closeSubpath() + let bounds = path.boundingBoxOfPath + let scale = min(rect.width / bounds.width, rect.height / bounds.height) + var transform = CGAffineTransform(a: scale, b: 0, c: 0, d: -scale, + tx: rect.midX - bounds.midX * scale, ty: rect.midY + bounds.midY * scale) + return path.copy(using: &transform)! +} + +/// Draws the app's black tile and green phosphor glyph at a 1024-point design size. +/// +/// - Parameter context: Output context, already scaled to the design coordinate system. +func drawAppIcon(in context: CGContext) { + context.setFillColor(NSColor.black.cgColor) + context.addPath(CGPath(roundedRect: CGRect(x: 100, y: 100, width: 824, height: 824), + cornerWidth: 184, cornerHeight: 184, transform: nil)) + context.fillPath() + let path = glyph(in: CGRect(x: 270, y: 248, width: 484, height: 528)) + // Rain's xterm-47 green (0, 255, 95), with its pale green leading highlight. + let green = NSColor(srgbRed: 0, green: 1, blue: 95.0 / 255, alpha: 1).cgColor + for blur: CGFloat in [64, 24, 8] { + context.saveGState() + context.setShadow(offset: .zero, blur: blur, color: green) + context.setFillColor(green) + context.addPath(path) + context.fillPath() + context.restoreGState() + } + context.saveGState() + context.addPath(path) + context.clip() + let gradient = CGGradient(colorsSpace: CGColorSpace(name: CGColorSpace.sRGB), colors: [ + NSColor(srgbRed: 0, green: 0.53, blue: 0.2, alpha: 1).cgColor, + green, + NSColor(srgbRed: 0.84, green: 1, blue: 0.84, alpha: 1).cgColor, + ] as CFArray, locations: [0, 0.65, 1])! + context.drawLinearGradient(gradient, start: CGPoint(x: 512, y: 248), + end: CGPoint(x: 512, y: 776), options: []) + context.setFillColor(NSColor(white: 0, alpha: 0.65).cgColor) + for y in stride(from: 248, to: 776, by: 8) { + context.fill(CGRect(x: 260, y: y, width: 504, height: 2)) + } + context.restoreGState() +} + +private let root = URL(fileURLWithPath: FileManager.default.currentDirectoryPath) +private let resources = root.appendingPathComponent("Resources") +private let iconset = root.appendingPathComponent("build/WallpaperIcon.iconset") +try FileManager.default.createDirectory(at: iconset, withIntermediateDirectories: true) +for size in [16, 32, 128, 256, 512] { + for scale in [1, 2] { + let pixels = size * scale + let bitmap = NSBitmapImageRep(bitmapDataPlanes: nil, pixelsWide: pixels, pixelsHigh: pixels, + bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, + colorSpaceName: .deviceRGB, bytesPerRow: 0, bitsPerPixel: 0)! + let context = NSGraphicsContext(bitmapImageRep: bitmap)!.cgContext + context.scaleBy(x: CGFloat(pixels) / 1024, y: CGFloat(pixels) / 1024) + drawAppIcon(in: context) + let png = bitmap.representation(using: .png, properties: [:])! + let name = "icon_\(size)x\(size)\(scale == 2 ? "@2x" : "").png" + try png.write(to: iconset.appendingPathComponent(name)) + if pixels == 1024 { try png.write(to: resources.appendingPathComponent("WallpaperIcon.png")) } + } +} + +// A vector template keeps crisp edges on both standard and Retina menu bars. +private let pdf = NSMutableData() +private let consumer = CGDataConsumer(data: pdf)! +private var bounds = CGRect(x: 0, y: 0, width: 18, height: 18) +private let context = CGContext(consumer: consumer, mediaBox: &bounds, nil)! +context.beginPDFPage(nil) +context.addPath(glyph(in: CGRect(x: 2, y: 2, width: 14, height: 14))) +context.clip() +context.setFillColor(NSColor.black.cgColor) +for y in stride(from: 2.0, to: 16.0, by: 2.0) { + context.fill(CGRect(x: 0, y: y, width: 18, height: 1.35)) +} +context.endPDFPage() +context.closePDF() +try (pdf as Data).write(to: resources.appendingPathComponent("MenuBarIcon.pdf")) + +private let iconutil = Process() +iconutil.executableURL = URL(fileURLWithPath: "/usr/bin/iconutil") +iconutil.arguments = ["-c", "icns", iconset.path, "-o", resources.appendingPathComponent("WallpaperIcon.icns").path] +try iconutil.run() +iconutil.waitUntilExit() +precondition(iconutil.terminationStatus == 0, "iconutil failed") +print("Generated WallpaperIcon.icns, WallpaperIcon.png, and MenuBarIcon.pdf") diff --git a/build-wallpaper.sh b/build-wallpaper.sh index c6448d1..0677096 100755 --- a/build-wallpaper.sh +++ b/build-wallpaper.sh @@ -11,7 +11,7 @@ if [[ ! -s "$ROOT_DIR/VERSION" ]]; then exit 1 fi BUNDLE_VERSION="$(tr -d '[:space:]' < "$ROOT_DIR/VERSION")" -mkdir -p "$BUNDLE_DIR/Contents/MacOS" +mkdir -p "$BUNDLE_DIR/Contents/MacOS" "$BUNDLE_DIR/Contents/Resources" swiftc -O -module-name MatrixWallpaper \ -framework Foundation -framework AppKit -framework ScreenSaver -framework ServiceManagement \ @@ -31,6 +31,7 @@ swiftc -O -module-name MatrixWallpaper \ -o "$BUNDLE_DIR/Contents/MacOS/MatrixWallpaper" cp "$ROOT_DIR/Resources/Wallpaper-Info.plist" "$BUNDLE_DIR/Contents/Info.plist" +cp "$ROOT_DIR/Resources/WallpaperIcon.icns" "$ROOT_DIR/Resources/MenuBarIcon.pdf" "$BUNDLE_DIR/Contents/Resources/" /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $BUNDLE_VERSION" "$BUNDLE_DIR/Contents/Info.plist" /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUNDLE_VERSION" "$BUNDLE_DIR/Contents/Info.plist" plutil -lint "$BUNDLE_DIR/Contents/Info.plist" >/dev/null From 5db28067adbdb01f6e2b5c9bef4ce9c394e6eae2 Mon Sep 17 00:00:00 2001 From: Patrick Schaper Date: Thu, 22 Oct 2026 22:30:54 +0200 Subject: [PATCH 6/8] fix: keep shared wallpaper and saver animation smooth - share completed frames while preserving one simulation per display - compose native layers with Core Image and reusable GPU textures - preserve independent fallback, display leases, and scene synchronization - cover consumer transitions, pixel fidelity, and composition performance --- README.md | 2 + .../MatrixScreenSaverView.swift | 343 +++++++++- .../ScreenSyncCoordinator.swift | 16 +- .../SharedWallpaperCompositor.swift | 197 ++++++ .../SharedWallpaperFrame.swift | 230 +++++++ .../WallpaperFrameReader.swift | 50 ++ Sources/MatrixWallpaper/WallpaperApp.swift | 103 ++- .../WallpaperPlaybackState.swift | 10 +- .../ScreenSyncCoordinatorTests.swift | 19 + .../SharedWallpaperFrameTests.swift | 83 +++ .../WallpaperPlaybackStateTests.swift | 12 + Tests/MatrixScreenSaverTests/main.swift | 1 + Tests/MatrixWallpaperTests/ConsumerHost.swift | 117 ++++ .../GPUCompositionTests.swift | 641 ++++++++++++++++++ .../SharedCompositionTests.swift | 192 ++++++ .../WallpaperAppTests.swift | 55 ++ Tests/MatrixWallpaperTests/main.swift | 21 + build-wallpaper.sh | 3 + build.sh | 3 + tests.sh | 3 + wallpaper-tests.sh | 27 +- 21 files changed, 2076 insertions(+), 52 deletions(-) create mode 100644 Sources/MatrixScreenSaver/SharedWallpaperCompositor.swift create mode 100644 Sources/MatrixScreenSaver/SharedWallpaperFrame.swift create mode 100644 Sources/MatrixScreenSaver/WallpaperFrameReader.swift create mode 100644 Tests/MatrixScreenSaverTests/SharedWallpaperFrameTests.swift create mode 100644 Tests/MatrixWallpaperTests/ConsumerHost.swift create mode 100644 Tests/MatrixWallpaperTests/GPUCompositionTests.swift create mode 100644 Tests/MatrixWallpaperTests/SharedCompositionTests.swift diff --git a/README.md b/README.md index d7362f8..f304e3a 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ brew install --cask patrickschaper/tap/matrix-screen-saver - Wallpaper: open **MatrixWallpaper** in Applications. - Saver options: **System Settings → Wallpaper → Screen Saver → MatrixScreenSaver → Options…**. +While MatrixWallpaper is running, the screen saver continues the same animation on each display, and the wallpaper carries on when it ends. Without the app, the saver runs independently. Previews remain independent. + ## Buy me a coffee There is no spoon. There is coffee. Donations help fund a developer license for signing the screen saver. diff --git a/Sources/MatrixScreenSaver/MatrixScreenSaverView.swift b/Sources/MatrixScreenSaver/MatrixScreenSaverView.swift index 5bf9b23..7d369ec 100644 --- a/Sources/MatrixScreenSaver/MatrixScreenSaverView.swift +++ b/Sources/MatrixScreenSaver/MatrixScreenSaverView.swift @@ -41,6 +41,30 @@ final class MatrixScreenSaverView: ScreenSaverView { /// Enables coordinated scenes while the wallpaper app owns system suspension handling. /// Set before starting animation; ordinary saver and preview hosts keep the default. var isWallpaperHost = false + + /// Lets the wallpaper's sole animation session continue while a saver covers its windows. + var rendersWallpaperWhileHidden = false + + private var wallpaperFrameReader: WallpaperFrameReader? + private var sharedWallpaperImage: CGImage? + private var sharedFrameBuffer: SharedWallpaperFrame? + private var publishedWallpaperImage: CGImage? + /// Full-resolution scene base, reused while only terminal content changes. + private var wallpaperSceneBase: CGImage? + /// Backing-resolution scanlines avoid repainting hundreds of tall stripes each frame. + private var wallpaperScanLines: CGImage? + /// GPU resources are display-local and discarded with the cached visual layers. + private var wallpaperCompositor: SharedWallpaperCompositor? + /// Retains an unchanged cursor raster within the current layout and backing-scale epoch. + private var wallpaperCursor: (column: Int, color: TerminalColor, image: CGImage)? + /// Avoids retrying an unavailable or failed GPU until visual resources are rebuilt. + private var wallpaperGPUAttempted = false + /// Visual edits must publish even when the next simulation tick changes no cells. + private var wallpaperFrameNeedsRedraw = true + /// Keeps independent producer-loss playback independent across later option edits. + private var nativePlaybackSynchronized = false + /// Brief discovery precedes standalone startup so a warm wallpaper does not replay the intro. + private var awaitingWallpaperUntil: TimeInterval? private var terminalSize: TerminalSize? private var hasLoggedFirstDraw = false private var geometrySyncInProgress = false @@ -191,12 +215,28 @@ final class MatrixScreenSaverView: ScreenSaverView { saverOptions = Self.loadSaverOptions() } shouldReloadOptionsOnStart = true - let skipSyncDelay = isPreview || (!isWallpaperHost && !Self.isRunningInScreenSaverEngine) - nativeRenderer.updateConfiguration(saverOptions.rendererConfiguration(isPreview: skipSyncDelay)) - animationTimeInterval = nativeRenderer.preferredAnimationTimeInterval + wallpaperFrameReader = !isWallpaperHost && !isPreview && Self.isRunningInScreenSaverEngine ? WallpaperFrameReader() : nil NSLog("MatrixScreenSaver startAnimation bounds=%@", NSStringFromRect(bounds)) appendDebugLog("[\(debugIdentifier)] startAnimation bounds=\(NSStringFromRect(bounds))") updateScreenSaverLifecycleObservation() + if let wallpaperFrameReader { + nativeRenderer.stop() + awaitingWallpaperUntil = ProcessInfo.processInfo.systemUptime + 1 + _ = wallpaperFrameReader.frame(displayID: UInt32(displaySeed), pointSize: bounds.size) + needsDisplay = true + } else { + startNativeRenderer(synchronize: !isPreview && isWallpaperHost) + } + } + + /// Starts coordinated standalone playback, or an immediate fallback after a lost producer. + private func startNativeRenderer(synchronize: Bool) { + nativePlaybackSynchronized = synchronize + let skipSyncDelay = !synchronize + nativeRenderer.overrideSceneStartTime = nil + nativeRenderer.overrideSceneContentStartTime = nil + nativeRenderer.updateConfiguration(saverOptions.rendererConfiguration(isPreview: skipSyncDelay)) + animationTimeInterval = nativeRenderer.preferredAnimationTimeInterval updateLayout() nativeRenderer.seedOffset = displaySeed @@ -221,6 +261,9 @@ final class MatrixScreenSaverView: ScreenSaverView { pendingSync = false pendingRestart = false pendingSceneAdvance = false + wallpaperFrameReader = nil + sharedWallpaperImage = nil + awaitingWallpaperUntil = nil nativeRenderer.stop() ScreenSyncCoordinator.shared.unregister(ObjectIdentifier(self)) releaseRenderingResources() @@ -236,7 +279,7 @@ final class MatrixScreenSaverView: ScreenSaverView { guard animationActive && !wallpaperAnimationPaused else { return } - guard isHostWindowVisibleForAnimation else { + guard isHostWindowVisibleForAnimation || (isWallpaperHost && rendersWallpaperWhileHidden) else { // The wallpaper app owns resumption when desktop visibility changes. guard !isWallpaperHost else { return } let now = Date.timeIntervalSinceReferenceDate @@ -249,6 +292,31 @@ final class MatrixScreenSaverView: ScreenSaverView { } firstHiddenFrameTime = 0 + if let wallpaperFrameReader { + if let frame = wallpaperFrameReader.frame(displayID: UInt32(displaySeed), pointSize: bounds.size) { + awaitingWallpaperUntil = nil + if sharedWallpaperImage == nil { + nativeRenderer.stop() + ScreenSyncCoordinator.shared.excludeFromSynchronization(ObjectIdentifier(self)) + pendingSync = false + pendingRestart = false + pendingSceneAdvance = false + } + if sharedWallpaperImage !== frame.image { + sharedWallpaperImage = frame.image + needsDisplay = true + } + return + } else if sharedWallpaperImage != nil { + sharedWallpaperImage = nil + startNativeRenderer(synchronize: false) + } else if let deadline = awaitingWallpaperUntil { + guard ProcessInfo.processInfo.systemUptime >= deadline else { return } + awaitingWallpaperUntil = nil + startNativeRenderer(synchronize: true) + } + } + // While waiting for multi-screen sync (either initial startup or rain restart), // poll the coordinator each frame. Once a shared start time is available, // apply it and start the renderer so all displays begin simultaneously. @@ -260,6 +328,7 @@ final class MatrixScreenSaverView: ScreenSaverView { startTime = ScreenSyncCoordinator.shared.resolvedStartTime() } guard let time = startTime else { + sharedFrameBuffer?.refresh() return } nativeRenderer.overrideSceneContentStartTime = pendingRestart @@ -281,6 +350,7 @@ final class MatrixScreenSaverView: ScreenSaverView { // each frame. Once all displays are ready, advance to the next scene. if pendingSceneAdvance { guard let _ = ScreenSyncCoordinator.shared.resolvedPhaseAdvanceTime() else { + sharedFrameBuffer?.refresh() return } pendingSceneAdvance = false @@ -290,9 +360,11 @@ final class MatrixScreenSaverView: ScreenSaverView { } super.animateOneFrame() - if nativeRenderer.advance() { + let advanced = nativeRenderer.advance() + if advanced { needsDisplay = true } + publishWallpaperFrame(redraw: advanced) // After advance, check if the renderer has requested a restart if nativeRenderer.consumeRestartRequest() { @@ -324,6 +396,19 @@ final class MatrixScreenSaverView: ScreenSaverView { /// Paints the full terminal-window scene for the current frame. override func draw(_ dirtyRect: NSRect) { + if let image = sharedWallpaperImage ?? publishedWallpaperImage { + NSGraphicsContext.current?.cgContext.draw(image, in: bounds) + return + } + if awaitingWallpaperUntil != nil { + NSColor.black.setFill() + bounds.fill() + return + } + drawScene() + } + + private func drawScene() { if !hasLoggedFirstDraw { hasLoggedFirstDraw = true NSLog("MatrixScreenSaver draw bounds=%@", NSStringFromRect(bounds)) @@ -401,13 +486,27 @@ final class MatrixScreenSaverView: ScreenSaverView { } markDisplayDirty() + if sharedFrameBuffer != nil { _ = shareWallpaperFrames() } } /// Marks the saver view as needing display on the next run-loop turn. private func markDisplayDirty() { + wallpaperSceneBase = nil + wallpaperScanLines = nil + wallpaperCompositor = nil + wallpaperCursor = nil + wallpaperGPUAttempted = false + wallpaperFrameNeedsRedraw = true needsDisplay = true } + /// Rebuilds full-resolution publication resources after a display scale change. + override func viewDidChangeBackingProperties() { + super.viewDidChangeBackingProperties() + markDisplayDirty() + if sharedFrameBuffer != nil { _ = shareWallpaperFrames() } + } + /// Stops animation and frees resources once the host is no longer visible. private func handleHostDetachment(reason: String) { appendDebugLog("[\(debugIdentifier)] \(reason)") @@ -519,6 +618,7 @@ final class MatrixScreenSaverView: ScreenSaverView { /// Releases transient rendering caches and host observation state. private func releaseRenderingResources() { + stopSharingWallpaperFrames() stopObservingHostWindow() stopObservingScreenSaverLifecycle() releaseNativeFrameResources() @@ -624,7 +724,14 @@ final class MatrixScreenSaverView: ScreenSaverView { } /// Paints the clipped terminal surface and its rendered frame buffer. - private func drawTerminal() { let terminalPath = NSBezierPath( + private func drawTerminal() { + drawTerminalSurface() + drawTerminalContent() + } + + /// Paints the unchanged black surface and rounded border beneath terminal content. + private func drawTerminalSurface() { + let terminalPath = NSBezierPath( roundedRect: terminalRect, xRadius: Self.terminalCornerRadius, yRadius: Self.terminalCornerRadius @@ -635,18 +742,37 @@ final class MatrixScreenSaverView: ScreenSaverView { NSColor(calibratedWhite: 1.0, alpha: 0.03).setStroke() terminalPath.lineWidth = 1 terminalPath.stroke() + } + + /// Paints changing cells, cursor, and scanlines in their original compositing order. + private func drawTerminalContent() { guard let localTerminalSize = terminalSize else { return } NSGraphicsContext.saveGraphicsState() - terminalPath.addClip() + let terminalPath = NSBezierPath(roundedRect: terminalRect, + xRadius: Self.terminalCornerRadius, yRadius: Self.terminalCornerRadius) + if sharedFrameBuffer == nil { terminalPath.addClip() } drawNativeTerminal(localTerminalSize) + if sharedFrameBuffer != nil { terminalPath.addClip() } + + drawNativeCursor() + + NSGraphicsContext.restoreGraphicsState() + + if saverOptions.scanLinesIntensity > 0 { + if let wallpaperScanLines { + NSGraphicsContext.current?.cgContext.draw(wallpaperScanLines, in: bounds) + } else { + drawScanLines() + } + } + } - // Draw the Neo scene cursor directly on top of the frame buffer. - // Covers all phases (startup delay, typing, pause, blank between lines). - // Direct draw bypasses the frame buffer pipeline and is guaranteed to appear. + /// Bypasses the glyph bitmap so the Neo cursor remains visible in every intro phase. + private func drawNativeCursor() { if let cursor = nativeRenderer.neoSceneCursor, cursor.visible { let palette = nativeRenderer.levelColors let level = min(max(palette.count / 2, 1), palette.count - 1) @@ -657,11 +783,6 @@ final class MatrixScreenSaverView: ScreenSaverView { NSRect(x: x, y: y, width: cellWidth, height: lineHeight).fill() } - NSGraphicsContext.restoreGraphicsState() - - if saverOptions.scanLinesIntensity > 0 { - drawScanLines() - } } /// Overlays 1 px dark stripes every 2 px for a CRT scanline effect. @@ -686,19 +807,14 @@ final class MatrixScreenSaverView: ScreenSaverView { ctx.restoreGState() } - /// Repaints dirty terminal rows into the cached frame buffer and presents it. - private func drawNativeTerminal(_ localTerminalSize: TerminalSize) { + /// Repaints dirty rows once and snapshots the bitmap for CPU or GPU composition. + private func nativeTerminalImage(_ localTerminalSize: TerminalSize) -> CGImage? { let visibleRows = min(localTerminalSize.rows, nativeRenderer.rows) let visibleColumns = min(localTerminalSize.columns, nativeRenderer.columns) guard visibleRows > 0, visibleColumns > 0 else { - return - } - guard - let context = NSGraphicsContext.current?.cgContext, - let frameContext = nativeFrameContext - else { - return + return nil } + guard let frameContext = nativeFrameContext else { return nil } let hasDiffuseBackground = saverOptions.diffuseEnabled && !nativeDiffuseColorsByLevel.isEmpty @@ -761,9 +877,13 @@ final class MatrixScreenSaverView: ScreenSaverView { frameContext.flush() nativeRenderer.clearDirtyRows() - guard let image = frameContext.makeImage() else { - return - } + return frameContext.makeImage() + } + + /// Presents the shared dirty-row raster through the unchanged native CPU reference path. + private func drawNativeTerminal(_ localTerminalSize: TerminalSize) { + guard let context = NSGraphicsContext.current?.cgContext, + let image = nativeTerminalImage(localTerminalSize) else { return } let drawRect = CGRect( x: terminalRect.minX, @@ -774,7 +894,23 @@ final class MatrixScreenSaverView: ScreenSaverView { context.saveGState() context.interpolationQuality = .none context.setAlpha(1.0) - context.draw(image, in: drawRect) + if sharedFrameBuffer != nil { + // Only the edge bands need the expensive rounded coverage mask. + let radius = min(Self.terminalCornerRadius, terminalRect.height / 2) + context.saveGState() + context.clip(to: terminalRect.insetBy(dx: 0, dy: radius)) + context.draw(image, in: drawRect) + context.restoreGState() + context.clip(to: [ + CGRect(x: terminalRect.minX, y: terminalRect.minY, width: terminalRect.width, height: radius), + CGRect(x: terminalRect.minX, y: terminalRect.maxY - radius, width: terminalRect.width, height: radius), + ]) + NSBezierPath(roundedRect: terminalRect, xRadius: Self.terminalCornerRadius, + yRadius: Self.terminalCornerRadius).addClip() + context.draw(image, in: drawRect) + } else { + context.draw(image, in: drawRect) + } context.restoreGState() } @@ -1019,6 +1155,152 @@ final class MatrixScreenSaverView: ScreenSaverView { applySaverOptions(options, persist: false, restartAnimation: false) } + /// Offers the current wallpaper frame without copying or restarting its simulation. + /// + /// - Returns: A private shared-memory file, or nil if this host cannot publish it. + func shareWallpaperFrames() -> URL? { + guard isWallpaperHost, animationActive else { return nil } + let scale = window?.backingScaleFactor ?? 1 + if sharedFrameBuffer?.pointSize != bounds.size || sharedFrameBuffer?.displayID != UInt32(displaySeed) || + sharedFrameBuffer?.pixelWidth != Int(ceil(bounds.width * scale)) || + sharedFrameBuffer?.pixelHeight != Int(ceil(bounds.height * scale)) { + stopSharingWallpaperFrames() + sharedFrameBuffer = try? SharedWallpaperFrame(displayID: UInt32(displaySeed), pointSize: bounds.size, scale: scale) + } + publishWallpaperFrame(redraw: publishedWallpaperImage == nil) + return sharedFrameBuffer?.url + } + + /// Unlinks producer storage while retaining the actual animation session. + func stopSharingWallpaperFrames() { + sharedFrameBuffer = nil + publishedWallpaperImage = nil + markDisplayDirty() + } + + /// Builds rounded coverage at backing resolution without changing the CPU fallback geometry. + private func makeWallpaperCompositor(for buffer: SharedWallpaperFrame) -> SharedWallpaperCompositor? { + guard !showsWindowChrome, let base = wallpaperSceneBase, + let context = makeNativeBitmapContext(width: buffer.pixelWidth, height: buffer.pixelHeight) else { return nil } + context.scaleBy(x: CGFloat(buffer.pixelWidth) / bounds.width, y: CGFloat(buffer.pixelHeight) / bounds.height) + context.clear(bounds) + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.current = NSGraphicsContext(cgContext: context, flipped: false) + NSColor.white.setFill() + NSBezierPath(roundedRect: terminalRect, xRadius: Self.terminalCornerRadius, + yRadius: Self.terminalCornerRadius).fill() + NSGraphicsContext.restoreGraphicsState() + guard let mask = context.makeImage() else { return nil } + return SharedWallpaperCompositor(base: base, mask: mask, scanLines: wallpaperScanLines, terminalSize: nativeFrameSize) + } + + /// Rasterizes only the cursor layer; clipping and final layering remain on the GPU. + private func wallpaperCursorImage(for buffer: SharedWallpaperFrame) -> CGImage? { + guard let cursor = nativeRenderer.neoSceneCursor, cursor.visible else { return nil } + let palette = nativeRenderer.levelColors + let color = palette[min(max(palette.count / 2, 1), palette.count - 1)] + if let cached = wallpaperCursor, cached.column == cursor.column, cached.color == color { return cached.image } + guard let context = makeNativeBitmapContext(width: buffer.pixelWidth, height: buffer.pixelHeight) else { return nil } + context.scaleBy(x: CGFloat(buffer.pixelWidth) / bounds.width, y: CGFloat(buffer.pixelHeight) / bounds.height) + context.clear(bounds) + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.current = NSGraphicsContext(cgContext: context, flipped: false) + drawNativeCursor() + NSGraphicsContext.restoreGraphicsState() + guard let image = context.makeImage() else { return nil } + wallpaperCursor = (cursor.column, color, image) + return image + } + + /// Renders the full canvas once at backing resolution only while a consumer needs it. + private func publishWallpaperFrame(redraw: Bool) { + guard let buffer = sharedFrameBuffer else { return } + guard redraw || wallpaperFrameNeedsRedraw || publishedWallpaperImage == nil else { buffer.refresh(); return } + if wallpaperSceneBase == nil, + let context = makeNativeBitmapContext(width: buffer.pixelWidth, height: buffer.pixelHeight) { + context.scaleBy(x: CGFloat(buffer.pixelWidth) / bounds.width, y: CGFloat(buffer.pixelHeight) / bounds.height) + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.current = NSGraphicsContext(cgContext: context, flipped: false) + drawBackground() + if showsWindowChrome { drawWindow() } + drawTerminalSurface() + NSGraphicsContext.restoreGraphicsState() + wallpaperSceneBase = context.makeImage() + if saverOptions.scanLinesIntensity > 0 { + context.clear(bounds) + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.current = NSGraphicsContext(cgContext: context, flipped: false) + drawScanLines() + NSGraphicsContext.restoreGraphicsState() + wallpaperScanLines = context.makeImage() + } + } + var changedBands: [CGRect] = [] + if !wallpaperFrameNeedsRedraw, publishedWallpaperImage != nil, wallpaperSceneBase != nil, + let terminalSize, nativeFrameSize.height > 0 { + let rowHeight = lineHeight * terminalRect.height / nativeFrameSize.height + let scale = CGFloat(buffer.pixelHeight) / bounds.height + for row in 0.. = [] + /// Shared consumers and immediate fallbacks are live displays, but not native barrier participants. + private var excludedIDs: Set = [] private var firstRegistrationTime: TimeInterval = 0 private var resolvedTime: TimeInterval? @@ -71,6 +73,7 @@ final class ScreenSyncCoordinator { /// - id: Unique identity of the registering view (use `ObjectIdentifier`). /// - expectedCount: Total number of displays (typically `NSScreen.screens.count`). func register(_ id: ObjectIdentifier, expectedCount: Int) { + excludedIDs.remove(id) if registeredIDs.isEmpty { self.expectedCount = max(expectedCount, 1) self.maxExpectedCount = max(expectedCount, 1) @@ -94,6 +97,7 @@ final class ScreenSyncCoordinator { /// /// - Parameter id: Unique identity of the unregistering view. func unregister(_ id: ObjectIdentifier) { + excludedIDs.remove(id) registeredIDs.remove(id) restartRequestedIDs.remove(id) phaseAdvanceRequestedIDs.remove(id) @@ -116,6 +120,15 @@ final class ScreenSyncCoordinator { } } + /// Removes a live display from native startup and scene barriers without counting it as missing. + /// + /// - Parameter id: View presenting shared frames or running an immediate independent fallback. + func excludeFromSynchronization(_ id: ObjectIdentifier) { + unregister(id) + excludedIDs.insert(id) + tryResolveStart() + } + /// Attempts to resolve startup time if all currently-registered displays /// have registered. /// @@ -123,7 +136,7 @@ final class ScreenSyncCoordinator { /// so the coordinator can resolve as soon as all live displays have registered. private func tryResolveStart() { guard resolvedTime == nil, !registeredIDs.isEmpty else { return } - if registeredIDs.count >= maxExpectedCount { + if registeredIDs.count >= max(maxExpectedCount - excludedIDs.count, 1) { resolvedTime = Date.timeIntervalSinceReferenceDate + Self.startDelay startContentTime = resolvedTime } @@ -297,6 +310,7 @@ final class ScreenSyncCoordinator { expectedCount = 0 maxExpectedCount = 0 registeredIDs = [] + excludedIDs = [] firstRegistrationTime = 0 resolvedTime = nil startContentTime = nil diff --git a/Sources/MatrixScreenSaver/SharedWallpaperCompositor.swift b/Sources/MatrixScreenSaver/SharedWallpaperCompositor.swift new file mode 100644 index 0000000..c9dd42e --- /dev/null +++ b/Sources/MatrixScreenSaver/SharedWallpaperCompositor.swift @@ -0,0 +1,197 @@ +import Foundation +import CoreGraphics +import CoreImage +import Metal + +/// Composes wallpaper layers on the GPU before synchronously copying completed pixels into transport. +final class SharedWallpaperCompositor { + /// Reuses compiled kernels and the command queue across display-local compositors. + private static let renderer: (device: MTLDevice, context: CIContext)? = { + guard let device = MTLCreateSystemDefaultDevice() else { return nil } + return (device, CIContext(mtlDevice: device, options: [ + .workingColorSpace: NSNull(), .workingFormat: CIFormat.RGBA8, + ])) + }() + + private let context: CIContext + private let background: CIImage + private let mask: CIImage + private let scanLines: CIImage + private let transform: CGAffineTransform + private let terminalSize: CGSize + private let output: MTLBuffer + private let terminalSurface: (buffer: MTLBuffer, texture: MTLTexture, bytesPerRow: Int) + private let destination: CIRenderDestination + private let pixelBounds: CGRect + private let bytesPerRow: Int + + /// Creates resources only when Metal and exact Core Graphics sampling are available. + /// + /// - Parameters: + /// - base: Cached opaque background at backing resolution. + /// - mask: Cached rounded terminal coverage at that same resolution. + /// - scanLines: Cached transparent stripes, or nil when disabled. + /// - terminalSize: Unscaled dirty-row bitmap dimensions. + init?(base: CGImage, mask: CGImage, scanLines: CGImage?, terminalSize: CGSize) { + guard let renderer = Self.renderer, + let phaseX = Self.samplingPhase(source: Int(terminalSize.width), target: base.width, + vertical: false, context: renderer.context), + let phaseY = Self.samplingPhase(source: Int(terminalSize.height), target: base.height, + vertical: true, context: renderer.context) else { return nil } + guard let outputSurface = Self.makeSurface(device: renderer.device, width: base.width, height: base.height), + let terminalSurface = Self.makeSurface(device: renderer.device, width: Int(terminalSize.width), + height: Int(terminalSize.height)) else { return nil } + context = renderer.context + let options: [CIImageOption: Any] = [.colorSpace: NSNull()] + background = CIImage(cgImage: base, options: options) + self.mask = CIImage(cgImage: mask, options: options) + self.scanLines = scanLines.map { CIImage(cgImage: $0, options: options) } ?? CIImage.empty() + self.terminalSize = terminalSize + transform = CGAffineTransform(a: CGFloat(base.width) / terminalSize.width, b: 0, c: 0, + d: CGFloat(base.height) / terminalSize.height, tx: phaseX, ty: -phaseY) + output = outputSurface.buffer + bytesPerRow = outputSurface.bytesPerRow + self.terminalSurface = terminalSurface + pixelBounds = CGRect(x: 0, y: 0, width: base.width, height: base.height) + destination = CIRenderDestination(mtlTexture: outputSurface.texture, commandBuffer: nil) + destination.colorSpace = nil + destination.alphaMode = .premultiplied + destination.isFlipped = true + destination.isDithered = false + } + + /// Publishes only after GPU completion, leaving partial or failed renders in private scratch storage. + /// + /// - Parameters: + /// - terminal: Current immutable snapshot of the native dirty-row bitmap. + /// - cursor: Optional full-resolution cursor raster, not yet rounded-clipped. + /// - buffer: Existing locked transport, which makes its own immutable presentation copy. + /// - Returns: The transport's immutable presentation image, or nil under lock contention. + /// - Throws: GPU submission/completion failure or incompatible frame dimensions. + func publish(terminal: CGImage, cursor: CGImage?, to buffer: SharedWallpaperFrame) throws -> CGImage? { + guard terminal.width == Int(terminalSize.width), terminal.height == Int(terminalSize.height), + buffer.pixelWidth == Int(pixelBounds.width), buffer.pixelHeight == Int(pixelBounds.height) else { + throw NSError(domain: "SharedWallpaperCompositor", code: 1) + } + let options: [CIImageOption: Any] = [.colorSpace: NSNull()] + guard let terminalImage = terminalInputImage(terminal) else { + throw NSError(domain: "SharedWallpaperCompositor", code: 4) + } + let content = terminalImage.clampedToExtent().samplingNearest() + .transformed(by: transform, highQualityDownsample: false) + var scene = clipped(content).composited(over: background).insertingIntermediate(cache: false) + if let cursor { + scene = clipped(CIImage(cgImage: cursor, options: options)) + .composited(over: scene).insertingIntermediate(cache: false) + } + let task = try context.startTask(toRender: scanLines.composited(over: scene), + from: pixelBounds, to: destination, at: .zero) + _ = try task.waitUntilCompleted() + + let retainedOutput = Unmanaged.passRetained(output as AnyObject).toOpaque() + guard let provider = CGDataProvider(dataInfo: retainedOutput, data: output.contents(), + size: bytesPerRow * Int(pixelBounds.height), releaseData: { info, _, _ in + if let info { Unmanaged.fromOpaque(info).release() } + }) else { + Unmanaged.fromOpaque(retainedOutput).release() + throw NSError(domain: "SharedWallpaperCompositor", code: 2) + } + guard let image = CGImage(width: Int(pixelBounds.width), height: Int(pixelBounds.height), bitsPerComponent: 8, + bitsPerPixel: 32, bytesPerRow: bytesPerRow, space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | + CGImageAlphaInfo.premultipliedFirst.rawValue), provider: provider, + decode: nil, shouldInterpolate: false, intent: .defaultIntent) else { + throw NSError(domain: "SharedWallpaperCompositor", code: 3) + } + // This scratch image never escapes: only the transport's completed immutable copy is presented. + return buffer.publish { target in + target.setBlendMode(.copy) + target.interpolationQuality = .none + target.draw(image, in: pixelBounds) + } + } + + /// Quantizes coverage before the next blend, matching Core Graphics' 8-bit intermediate rounding. + private func clipped(_ image: CIImage) -> CIImage { + image.applyingFilter("CIBlendWithAlphaMask", parameters: [ + kCIInputBackgroundImageKey: CIImage.empty(), kCIInputMaskImageKey: mask, + ]).insertingIntermediate(cache: false) + } + + /// Avoids Core Image's per-frame CGImage upload and CPU texture compression. + private func terminalInputImage(_ image: CGImage) -> CIImage? { + guard image.bitsPerComponent == 8, image.bitsPerPixel == 32, image.alphaInfo == .premultipliedFirst, + image.bitmapInfo.intersection(.byteOrderMask) == .byteOrder32Little, + let pixels = image.dataProvider?.data else { return nil } + let data = pixels as Data + let rowBytes = image.width * 4 + guard data.count >= (image.height - 1) * image.bytesPerRow + rowBytes else { return nil } + data.withUnsafeBytes { source in + for row in 0.. (buffer: MTLBuffer, texture: MTLTexture, bytesPerRow: Int)? { + let alignment = max(1, device.minimumLinearTextureAlignment(for: .bgra8Unorm)) + let rowBytes = (width * 4 + alignment - 1) / alignment * alignment + let descriptor = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: .bgra8Unorm, + width: width, height: height, mipmapped: false) + descriptor.storageMode = .shared + descriptor.usage = [.shaderRead, .shaderWrite] + guard let buffer = device.makeBuffer(length: rowBytes * height, options: .storageModeShared), + let texture = buffer.makeTexture(descriptor: descriptor, offset: 0, bytesPerRow: rowBytes) else { return nil } + return (buffer, texture, rowBytes) + } + + /// Calibrates coordinate boundaries once per layout; a global epsilon changes other supported grids. + private static func samplingPhase(source: Int, target: Int, vertical: Bool, context: CIContext) -> CGFloat? { + guard source > 0, target > 0 else { return nil } + let sw = vertical ? 1 : source, sh = vertical ? source : 1 + let width = vertical ? 1 : target, height = vertical ? target : 1 + let bitmapInfo = CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedFirst.rawValue + guard let input = CGContext(data: nil, width: sw, height: sh, bitsPerComponent: 8, + bytesPerRow: sw * 4, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: bitmapInfo), + let bytes = input.data?.assumingMemoryBound(to: UInt8.self), + let reference = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, + bytesPerRow: width * 4, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: bitmapInfo), + let referenceBytes = reference.data else { return nil } + for index in 0..> 8) & 255) + bytes[index * 4 + 2] = 117 + bytes[index * 4 + 3] = 255 + } + guard let image = input.makeImage() else { return nil } + let rect = CGRect(x: 0, y: 0, width: width, height: height) + reference.interpolationQuality = .none + reference.draw(image, in: rect) + let expected = Data(bytes: referenceBytes, count: target * 4) + let ciImage = CIImage(cgImage: image, options: [.colorSpace: NSNull()]).clampedToExtent().samplingNearest() + var actual = Data(count: expected.count) + var bestStart = 0, bestCount = 0, runStart = 0, runCount = 0 + for step in -100...100 { + let shift = CGFloat(step) / 100_000 + let transform = CGAffineTransform(a: CGFloat(width) / CGFloat(sw), b: 0, c: 0, + d: CGFloat(height) / CGFloat(sh), + tx: vertical ? 0 : shift, ty: vertical ? -shift : 0) + actual.withUnsafeMutableBytes { + context.render(ciImage.transformed(by: transform, highQualityDownsample: false), + toBitmap: $0.baseAddress!, rowBytes: width * 4, bounds: rect, format: .BGRA8, colorSpace: nil) + } + if actual == expected { + if runCount == 0 { runStart = step } + runCount += 1 + if runCount > bestCount { bestStart = runStart; bestCount = runCount } + } else { + runCount = 0 + } + } + return bestCount == 0 ? nil : CGFloat(bestStart + bestCount / 2) / 100_000 + } +} diff --git a/Sources/MatrixScreenSaver/SharedWallpaperFrame.swift b/Sources/MatrixScreenSaver/SharedWallpaperFrame.swift new file mode 100644 index 0000000..e58aadd --- /dev/null +++ b/Sources/MatrixScreenSaver/SharedWallpaperFrame.swift @@ -0,0 +1,230 @@ +import Foundation +import CoreGraphics +import Darwin + +/// Shares completed BGRA frames through a private file mapped read-only by the saver. +/// +/// Discovery sends only paths. No renderer state, desktop capture, or writable access +/// to the wallpaper process is given to the screensaver host. +final class SharedWallpaperFrame { + /// Requests a current frame for the display ID carried in the notification object. + static let requestNotification = Notification.Name("dev.patsch.MatrixWallpaper.requestFrame") + /// Announces a producer-owned file path without a sandbox-incompatible userInfo dictionary. + static let offerNotification = Notification.Name("dev.patsch.MatrixWallpaper.frameAvailable") + /// Maximum silence before a consumer falls back to its independent renderer. + static let freshnessInterval: TimeInterval = 3 + private static let filenamePrefix = "MatrixWallpaperFrame-" + /// Fixed header capacity, independent of Swift struct layout. + private static let headerSize = 128 + /// Bounds mapping allocations while supporting an 8K BGRA display. + private static let maximumPixelBytes = 256 * 1024 * 1024 + + /// Word offsets in the versioned, same-machine shared-memory format. + private enum Field: Int { + case magic, version, displayID, width, height, pointWidth, pointHeight, processID, sequence, updatedAt + } + + /// One immutable presentation copy and its source sequence number. + struct Frame { + /// Owned pixels remain stable after the producer releases its write lock. + let image: CGImage + /// Increasing within the lifetime of one producer buffer. + let sequence: UInt64 + } + + /// The path offered to read-only consumers and unlinked by its creator on teardown. + let url: URL + /// Logical canvas size, used to reject mismatched layouts rather than stretch them. + let pointSize: CGSize + /// Width of the physical backing image. + let pixelWidth: Int + /// Height of the physical backing image. + let pixelHeight: Int + /// The display whose animation this mapping contains. + let displayID: UInt32 + /// Locking and mapping must refer to the same open inode, not a replaceable path. + private let descriptor: Int32 + private let memory: UnsafeMutableRawPointer + private let byteCount: Int + private let isProducer: Bool + private var cachedFrame: Frame? + private var cachedUpdate: TimeInterval = 0 + + /// Creates an owner-only buffer at the display's backing resolution. + /// + /// - Parameters: + /// - displayID: Physical display identity shared by both hosts. + /// - pointSize: Full canvas in AppKit points. + /// - scale: Display backing scale, without downsampling Retina output. + /// - Throws: A file-system error or an unsupported-layout error. + convenience init(displayID: UInt32, pointSize: CGSize, scale: CGFloat) throws { + let url = FileManager.default.temporaryDirectory.appendingPathComponent(Self.filenamePrefix + UUID().uuidString) + try self.init(url: url, displayID: displayID, pointSize: pointSize, scale: scale) + } + + /// Imports a private producer file without granting the saver write permission. + /// + /// - Parameters: + /// - url: Path announced by the wallpaper app. + /// - displayID: Expected physical display. + /// - pointSize: Expected full-screen canvas in points. + /// - Throws: Invalid ownership, format, layout, permissions, or file access. + convenience init(reading url: URL, displayID: UInt32, pointSize: CGSize) throws { + try self.init(url: url, displayID: displayID, pointSize: pointSize, scale: nil) + } + + /// Validates the entire fixed layout before mapping any untrusted pixel storage. + private init(url: URL, displayID: UInt32, pointSize: CGSize, scale: CGFloat?) throws { + guard Self.isFrameURL(url), pointSize.width.isFinite, pointSize.height.isFinite, + pointSize.width >= 1, pointSize.height >= 1, pointSize.width <= 16384, pointSize.height <= 16384 else { + throw Self.invalidBuffer() + } + if let scale, !scale.isFinite || scale < 1 || scale > 4 { throw Self.invalidBuffer() } + let creating = scale != nil + let flags = (creating ? O_RDWR | O_CREAT | O_EXCL : O_RDONLY | O_NONBLOCK) | O_NOFOLLOW | O_CLOEXEC + let fd = open(url.path, flags, S_IRUSR | S_IWUSR) + guard fd >= 0 else { throw NSError(domain: NSPOSIXErrorDomain, code: Int(errno)) } + var ready = false + defer { + if !ready { + close(fd) + if creating { unlink(url.path) } + } + } + var info = stat() + guard fstat(fd, &info) == 0, info.st_uid == getuid(), info.st_nlink == 1, + info.st_mode & S_IFMT == S_IFREG, info.st_mode & 0o077 == 0 else { throw Self.invalidBuffer() } + var header = [UInt64](repeating: 0, count: Self.headerSize / 8) + if let scale { + header[Field.magic.rawValue] = 0x4D41545249584631 + header[Field.version.rawValue] = 1 + header[Field.displayID.rawValue] = UInt64(displayID) + header[Field.width.rawValue] = UInt64(ceil(pointSize.width * scale)) + header[Field.height.rawValue] = UInt64(ceil(pointSize.height * scale)) + header[Field.pointWidth.rawValue] = Double(pointSize.width).bitPattern + header[Field.pointHeight.rawValue] = Double(pointSize.height).bitPattern + header[Field.processID.rawValue] = UInt64(getpid()) + } else { + let count = header.withUnsafeMutableBytes { pread(fd, $0.baseAddress, Self.headerSize, 0) } + guard count == Self.headerSize else { throw Self.invalidBuffer() } + } + let width = header[Field.width.rawValue], height = header[Field.height.rawValue] + guard header[Field.magic.rawValue] == 0x4D41545249584631, header[Field.version.rawValue] == 1, + header[Field.displayID.rawValue] == displayID, + header[Field.pointWidth.rawValue] == Double(pointSize.width).bitPattern, + header[Field.pointHeight.rawValue] == Double(pointSize.height).bitPattern, + width > 0, height > 0, width <= 16384, height <= 16384, + width * height * 4 <= Self.maximumPixelBytes, + header[Field.processID.rawValue] > 0, header[Field.processID.rawValue] <= Int32.max else { + throw Self.invalidBuffer() + } + let size = Self.headerSize + Int(width * height * 4) + if creating { + guard ftruncate(fd, off_t(size)) == 0, + header.withUnsafeBytes({ pwrite(fd, $0.baseAddress, Self.headerSize, 0) }) == Self.headerSize else { + throw NSError(domain: NSPOSIXErrorDomain, code: Int(errno)) + } + } + guard fstat(fd, &info) == 0, info.st_uid == getuid(), info.st_nlink == 1, + info.st_mode & S_IFMT == S_IFREG, info.st_mode & 0o077 == 0, info.st_size == size else { + throw Self.invalidBuffer() + } + guard let mapped = mmap(nil, size, PROT_READ | (creating ? PROT_WRITE : 0), MAP_SHARED, fd, 0), mapped != MAP_FAILED else { + throw NSError(domain: NSPOSIXErrorDomain, code: Int(errno)) + } + self.url = url + self.displayID = displayID + self.pointSize = pointSize + pixelWidth = Int(width) + pixelHeight = Int(height) + descriptor = fd + memory = mapped + byteCount = size + isProducer = creating + ready = true + } + + /// Restricts discovery to this product's files in macOS's per-user global temporary tree. + /// + /// - Parameter url: An offered file URL, never a general-purpose file capability. + /// - Returns: Whether its standardized location is eligible for further ownership checks. + static func isFrameURL(_ url: URL) -> Bool { + let path = url.standardizedFileURL.path + return url.isFileURL && (path.hasPrefix("/var/folders/") || path.hasPrefix("/private/var/folders/")) && + url.deletingLastPathComponent().lastPathComponent == "T" && + url.lastPathComponent.hasPrefix(filenamePrefix) + } + + /// Draws one complete frame under a nonblocking exclusive lock. + /// + /// - Parameter draw: Draws into physical pixels, including overlays and scanlines. + /// - Returns: The exact immutable image available to both hosts, or nil under contention. + func publish(_ draw: (CGContext) -> Void) -> CGImage? { + guard isProducer, flock(descriptor, LOCK_EX | LOCK_NB) == 0 else { return nil } + defer { flock(descriptor, LOCK_UN) } + guard let context = CGContext(data: memory.advanced(by: Self.headerSize), width: pixelWidth, height: pixelHeight, + bitsPerComponent: 8, bytesPerRow: pixelWidth * 4, space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedFirst.rawValue) else { return nil } + draw(context) + store(value(.sequence) &+ 1, at: .sequence) + store(ProcessInfo.processInfo.systemUptime.bitPattern, at: .updatedAt) + cachedFrame = copyFrame() + return cachedFrame?.image + } + + /// Keeps a static intro frame fresh without redrawing or copying its pixels. + func refresh() { + guard isProducer, flock(descriptor, LOCK_EX | LOCK_NB) == 0 else { return } + defer { flock(descriptor, LOCK_UN) } + if value(.sequence) > 0 { store(ProcessInfo.processInfo.systemUptime.bitPattern, at: .updatedAt) } + } + + /// Reads a consistent presentation copy, retaining a fresh cached frame during contention. + /// + /// - Returns: A complete, current frame; nil on shutdown, silence, or invalid storage. + func snapshot() -> Frame? { + let now = ProcessInfo.processInfo.systemUptime + var info = stat() + guard fstat(descriptor, &info) == 0, info.st_nlink == 1, info.st_size == byteCount else { return nil } + guard flock(descriptor, LOCK_SH | LOCK_NB) == 0 else { + return now - cachedUpdate < Self.freshnessInterval ? cachedFrame : nil + } + defer { flock(descriptor, LOCK_UN) } + let updatedAt = Double(bitPattern: value(.updatedAt)) + let readTime = ProcessInfo.processInfo.systemUptime + guard updatedAt.isFinite, updatedAt <= readTime, readTime - updatedAt < Self.freshnessInterval, + value(.sequence) > 0 else { return nil } + if cachedFrame?.sequence != value(.sequence) { cachedFrame = copyFrame() } + cachedUpdate = updatedAt + return cachedFrame + } + + /// Copies only under a kernel lock so later writes cannot tear a displayed frame. + private func copyFrame() -> Frame? { + let data = Data(bytes: memory.advanced(by: Self.headerSize), count: byteCount - Self.headerSize) + guard let provider = CGDataProvider(data: data as CFData), + let image = CGImage(width: pixelWidth, height: pixelHeight, bitsPerComponent: 8, bitsPerPixel: 32, + bytesPerRow: pixelWidth * 4, space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedFirst.rawValue), + provider: provider, decode: nil, shouldInterpolate: false, intent: .defaultIntent) else { return nil } + return Frame(image: image, sequence: value(.sequence)) + } + + /// Reads one aligned header word from the validated mapping. + private func value(_ field: Field) -> UInt64 { memory.load(fromByteOffset: field.rawValue * 8, as: UInt64.self) } + + /// Updates one aligned header word while holding the producer lock. + private func store(_ value: UInt64, at field: Field) { memory.storeBytes(of: value, toByteOffset: field.rawValue * 8, as: UInt64.self) } + + private static func invalidBuffer() -> NSError { + NSError(domain: "dev.patsch.MatrixWallpaper.SharedFrame", code: 1, + userInfo: [NSLocalizedDescriptionKey: "Invalid or incompatible wallpaper frame buffer"]) + } + + /// Removes the offer before releasing producer memory so readers fall back immediately. + deinit { + if isProducer { unlink(url.path) } + munmap(memory, byteCount) + close(descriptor) + } +} diff --git a/Sources/MatrixScreenSaver/WallpaperFrameReader.swift b/Sources/MatrixScreenSaver/WallpaperFrameReader.swift new file mode 100644 index 0000000..ff220a2 --- /dev/null +++ b/Sources/MatrixScreenSaver/WallpaperFrameReader.swift @@ -0,0 +1,50 @@ +import AppKit + +/// Discovers one display's wallpaper output without starting another animation session. +final class WallpaperFrameReader { + private var displayID: UInt32 = 0 + private var pointSize = CGSize.zero + private var buffer: SharedWallpaperFrame? + private var lastRequest: TimeInterval = -.infinity + private var observer: NSObjectProtocol? + + /// Observes only path notifications; no Mach lookup or sandbox entitlement is required. + init() { + observer = DistributedNotificationCenter.default().addObserver(forName: SharedWallpaperFrame.offerNotification, + object: nil, queue: .main) { [weak self] notification in + guard let self, let path = notification.object as? String else { return } + let url = URL(fileURLWithPath: path) + guard self.buffer?.url != url else { return } + if let offered = try? SharedWallpaperFrame(reading: url, displayID: self.displayID, pointSize: self.pointSize) { + self.buffer = offered + } + } + } + + /// Requests matching output, then reads only fresh, complete frames. + /// + /// - Parameters: + /// - displayID: Physical display hosting this saver instance. + /// - pointSize: Full canvas in AppKit points. + /// - Returns: Shared output, or nil when the independent renderer must take over. + func frame(displayID: UInt32, pointSize: CGSize) -> SharedWallpaperFrame.Frame? { + if self.displayID != displayID || self.pointSize != pointSize { + buffer = nil + lastRequest = -.infinity + self.displayID = displayID + self.pointSize = pointSize + } + let now = ProcessInfo.processInfo.systemUptime + if now - lastRequest >= 0.5 { + lastRequest = now + DistributedNotificationCenter.default().postNotificationName(SharedWallpaperFrame.requestNotification, + object: String(displayID), userInfo: nil, deliverImmediately: true) + } + return buffer?.snapshot() + } + + /// Unregisters discovery and releases only the consumer's mapping. + deinit { + if let observer { DistributedNotificationCenter.default().removeObserver(observer) } + } +} diff --git a/Sources/MatrixWallpaper/WallpaperApp.swift b/Sources/MatrixWallpaper/WallpaperApp.swift index 99ad53f..35b4cfc 100644 --- a/Sources/MatrixWallpaper/WallpaperApp.swift +++ b/Sources/MatrixWallpaper/WallpaperApp.swift @@ -38,6 +38,9 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { /// Options currently applied to the preserved session. private var currentOptions = MatrixScreenSaverOptions() + private var frameRequests: [UInt32: TimeInterval] = [:] + private var frameLeaseTimer: Timer? + /// Captured display geometry distinguishes real topology changes from wake notifications. private struct DisplayLayout: Equatable { let id: UInt32 @@ -84,6 +87,22 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { statusItem = item observeSystemState() + frameLeaseTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [weak self] _ in + guard let self else { return } + let now = ProcessInfo.processInfo.systemUptime + let expired = self.frameRequests.filter { now - $0.value >= SharedWallpaperFrame.freshnessInterval } + guard !expired.isEmpty else { return } + for id in expired.keys { self.frameRequests.removeValue(forKey: id) } + for window in self.windows { + guard let id = window.screen?.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? UInt32, + expired[id] != nil else { continue } + (window.contentView as? MatrixScreenSaverView)?.stopSharingWallpaperFrames() + } + if self.frameRequests.isEmpty { + self.endFrameSharing() + self.reconcilePlayback() + } + } if let session = CGSessionCopyCurrentDictionary() as? [String: Any] { playback.setSuspended(.sessionInactive, (session[kCGSessionOnConsoleKey as String] as? Bool) == false) } @@ -152,36 +171,44 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { let duration = Date.timeIntervalSinceReferenceDate - suspendedAt ScreenSyncCoordinator.shared.shiftTimeline(by: duration) for window in windows { - window.orderBack(nil) (window.contentView as? MatrixScreenSaverView)?.resumeWallpaperAnimation(after: duration) } self.suspendedAt = nil } - guard windows.isEmpty else { return } - currentOptions = MatrixScreenSaverView.loadSaverOptions() - displayLayout = currentDisplayLayout - for screen in NSScreen.screens { - guard let saver = MatrixScreenSaverView(frame: NSRect(origin: .zero, size: screen.frame.size), isPreview: false) else { - let alert = NSAlert() - alert.messageText = "Could not start Matrix Wallpaper" - alert.informativeText = "The native screen saver view could not be created." - alert.runModal() - NSApp.terminate(nil) - return + if windows.isEmpty { + currentOptions = MatrixScreenSaverView.loadSaverOptions() + displayLayout = currentDisplayLayout + for screen in NSScreen.screens { + guard let saver = MatrixScreenSaverView(frame: NSRect(origin: .zero, size: screen.frame.size), isPreview: false) else { + let alert = NSAlert() + alert.messageText = "Could not start Matrix Wallpaper" + alert.informativeText = "The native screen saver view could not be created." + alert.runModal() + NSApp.terminate(nil) + return + } + saver.isWallpaperHost = true + saver.rendersWallpaperWhileHidden = playback.isServingScreenSaver + let window = DesktopWindow(screen: screen, saverView: saver) + windows.append(window) + } + // Attach every display before starting registration and the framework's animation timers. + for window in windows { + if playback.shouldShowDesktop { window.orderBack(nil) } + (window.contentView as? ScreenSaverView)?.startAnimation() } - saver.isWallpaperHost = true - let window = DesktopWindow(screen: screen, saverView: saver) - windows.append(window) } - // Attach every display before starting registration and the framework's animation timers. for window in windows { - window.orderBack(nil) - (window.contentView as? ScreenSaverView)?.startAnimation() + (window.contentView as? MatrixScreenSaverView)?.rendersWallpaperWhileHidden = playback.isServingScreenSaver + if playback.shouldShowDesktop { + if !window.isVisible { window.orderBack(nil) } + } else if window.isVisible { window.orderOut(nil) } } } /// Unregisters every view before closing any window or starting a replacement session. private func removeDesktopWindows() { + endFrameSharing() for window in windows { (window.contentView as? ScreenSaverView)?.stopAnimation() } for window in windows { window.close() @@ -202,6 +229,12 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { observeSuspension(in: workspace, start: start, end: end, reason: reason) } let distributed = DistributedNotificationCenter.default() + let frameRequests = distributed.addObserver(forName: SharedWallpaperFrame.requestNotification, + object: nil, queue: .main) { [weak self] notification in + guard let id = notification.object as? String, let displayID = UInt32(id) else { return } + self?.shareFrames(for: displayID) + } + observers.append((distributed, frameRequests)) // These names are best-effort macOS observations, not a documented lock/security contract. observeSuspension(in: distributed, start: Notification.Name("com.apple.screenIsLocked"), end: Notification.Name("com.apple.screenIsUnlocked"), reason: .locked) @@ -231,12 +264,46 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { /// Applies a system condition without starting a stopped or still-suspended session. private func setSuspended(_ reason: WallpaperPlaybackState.Suspension, _ suspended: Bool) { + if reason == .screenSaver && !suspended { endFrameSharing() } playback.setSuspended(reason, suspended) reconcilePlayback() } + /// Wakes the existing session for a matching saver, then offers only that display's pixels. + /// + /// - Parameter displayID: Display requested through the sandbox-safe discovery notification. + private func shareFrames(for displayID: UInt32) { + guard playback.isRequested, currentDisplayLayout.contains(where: { $0.id == displayID }) else { return } + let starting = !playback.isServingScreenSaver + if starting { + let options = MatrixScreenSaverView.loadSaverOptions() + if options != currentOptions { applyOptions(options) } + } + frameRequests[displayID] = ProcessInfo.processInfo.systemUptime + playback.isServingScreenSaver = true + if starting { reconcilePlayback() } + guard playback.shouldRun else { return } + for window in windows { + guard let id = window.screen?.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? UInt32, + id == displayID, let saver = window.contentView as? MatrixScreenSaverView, + let url = saver.shareWallpaperFrames() else { continue } + DistributedNotificationCenter.default().postNotificationName(SharedWallpaperFrame.offerNotification, + object: url.path, userInfo: nil, deliverImmediately: true) + } + } + + private func endFrameSharing() { + frameRequests.removeAll() + playback.isServingScreenSaver = false + for window in windows { + (window.contentView as? MatrixScreenSaverView)?.stopSharingWallpaperFrames() + } + } + /// Removes observers and native animation work before the process exits. func applicationWillTerminate(_ notification: Notification) { + frameLeaseTimer?.invalidate() + frameLeaseTimer = nil for (center, token) in observers { center.removeObserver(token) } observers.removeAll() removeDesktopWindows() diff --git a/Sources/MatrixWallpaper/WallpaperPlaybackState.swift b/Sources/MatrixWallpaper/WallpaperPlaybackState.swift index b9ad656..8cc5f1e 100644 --- a/Sources/MatrixWallpaper/WallpaperPlaybackState.swift +++ b/Sources/MatrixWallpaper/WallpaperPlaybackState.swift @@ -19,11 +19,19 @@ struct WallpaperPlaybackState { /// Whether the user wants wallpaper playback, even if it cannot run right now. var isRequested = true + /// A recent matching saver request lets the wallpaper own animation while its desktop is hidden. + var isServingScreenSaver = false + /// Conditions that have not yet received a matching resume notification. private var suspensions: Set = [] /// Whether animation may run after combining user intent and system state. - var shouldRun: Bool { isRequested && suspensions.isEmpty } + var shouldRun: Bool { + isRequested && suspensions.allSatisfy { isServingScreenSaver && ($0 == .screenSaver || $0 == .locked) } + } + + /// Desktop visibility remains separate from rendering for the lock-screen consumer. + var shouldShowDesktop: Bool { isRequested && suspensions.isEmpty } /// Updates one condition idempotently without clearing unrelated conditions. /// diff --git a/Tests/MatrixScreenSaverTests/ScreenSyncCoordinatorTests.swift b/Tests/MatrixScreenSaverTests/ScreenSyncCoordinatorTests.swift index a269875..31feb19 100644 --- a/Tests/MatrixScreenSaverTests/ScreenSyncCoordinatorTests.swift +++ b/Tests/MatrixScreenSaverTests/ScreenSyncCoordinatorTests.swift @@ -2,6 +2,25 @@ import Foundation /// Tests for ScreenSyncCoordinator restart barrier resolution logic. func screenSyncCoordinatorTests() { + do { + let coordinator = ScreenSyncCoordinator.shared + coordinator._resetForTesting() + let native = NSObject(), shared = NSObject() + coordinator.register(ObjectIdentifier(native), expectedCount: 2) + coordinator.excludeFromSynchronization(ObjectIdentifier(shared)) + ok(coordinator.registeredCount == 1 && coordinator.resolvedStartTime() != nil, + "ScreenSyncCoordinator: shared consumers do not delay a remaining native display") + coordinator.unregister(ObjectIdentifier(native)) + coordinator.register(ObjectIdentifier(native), expectedCount: 2) + ok(coordinator.resolvedStartTime() != nil, + "ScreenSyncCoordinator: known shared consumers remain excluded when native startup begins later") + coordinator.unregister(ObjectIdentifier(native)) + coordinator.unregister(ObjectIdentifier(shared)) + coordinator.register(ObjectIdentifier(native), expectedCount: 2) + ok(coordinator.resolvedStartTime() == nil, + "ScreenSyncCoordinator: stopped shared consumers do not leak into the next session") + coordinator.unregister(ObjectIdentifier(native)) + } do { let coordinator = ScreenSyncCoordinator.shared coordinator._resetForTesting() diff --git a/Tests/MatrixScreenSaverTests/SharedWallpaperFrameTests.swift b/Tests/MatrixScreenSaverTests/SharedWallpaperFrameTests.swift new file mode 100644 index 0000000..1dccd85 --- /dev/null +++ b/Tests/MatrixScreenSaverTests/SharedWallpaperFrameTests.swift @@ -0,0 +1,83 @@ +import Foundation +import CoreGraphics +import Darwin + +/// Exercises the actual mapped-file boundary, including read-only consumers and malformed offers. +func sharedWallpaperFrameTests() { + let fifo = FileManager.default.temporaryDirectory.appendingPathComponent("MatrixWallpaperFrame-\(UUID().uuidString)") + if mkfifo(fifo.path, S_IRUSR | S_IWUSR) == 0 { + defer { unlink(fifo.path) } + let finished = DispatchSemaphore(value: 0) + DispatchQueue.global().async { + defer { finished.signal() } + do { + _ = try SharedWallpaperFrame(reading: fifo, displayID: 42, pointSize: CGSize(width: 8, height: 6)) + ok(false, "FIFO offers must never be accepted") + } catch { } + } + ok(finished.wait(timeout: .now() + 1) == .success, + "non-regular frame offers are rejected without blocking the saver") + } else { ok(false, "FIFO rejection fixture can be created") } + do { + var writer: SharedWallpaperFrame? = try SharedWallpaperFrame(displayID: 42, pointSize: CGSize(width: 8, height: 6), scale: 2) + let url = writer!.url + let reader = try SharedWallpaperFrame(reading: url, displayID: 42, pointSize: CGSize(width: 8, height: 6)) + ok(reader.snapshot() == nil, "shared frames are unavailable before the first complete publication") + let image = writer!.publish { context in + context.setFillColor(red: 0, green: 0.5, blue: 0, alpha: 1) + context.fill(CGRect(x: 0, y: 0, width: 16, height: 12)) + } + let first = reader.snapshot() + ok(image?.width == 16 && image?.height == 12 && first?.image.width == 16, + "shared frames retain the display backing resolution") + ok(first != nil && first!.image.dataProvider!.data! as Data == image!.dataProvider!.data! as Data, + "read-only mapping presents exactly the producer's pixels") + let firstPixels = first!.image.dataProvider!.data! as Data + _ = writer!.publish { context in + context.setFillColor(red: 0, green: 1, blue: 0, alpha: 1) + context.fill(CGRect(x: 0, y: 0, width: 16, height: 12)) + } + let second = reader.snapshot()! + ok(second.sequence > first!.sequence && second.image.dataProvider!.data! as Data != firstPixels, + "one mapped animation publishes advancing frames") + ok(first!.image.dataProvider!.data! as Data == firstPixels, + "old presentation images stay immutable across mapped writes") + let reconnected = try SharedWallpaperFrame(reading: url, displayID: 42, pointSize: CGSize(width: 8, height: 6)) + ok(reconnected.snapshot()?.sequence == second.sequence, "reconnecting does not reset the producer's sequence") + let lock = open(url.path, O_RDWR) + defer { close(lock) } + flock(lock, LOCK_EX) + ok(reader.snapshot()?.sequence == second.sequence && writer!.publish { _ in } == nil, + "contended mappings keep a fresh cached frame without blocking animation") + flock(lock, LOCK_UN) + for (display, size) in [(UInt32(43), CGSize(width: 8, height: 6)), (42, CGSize(width: 9, height: 6))] { + do { + _ = try SharedWallpaperFrame(reading: url, displayID: display, pointSize: size) + ok(false, "mismatched display or canvas is rejected") + } catch { ok(true, "mismatched display or canvas is rejected") } + } + try FileManager.default.setAttributes([.posixPermissions: 0o644], ofItemAtPath: url.path) + do { + _ = try SharedWallpaperFrame(reading: url, displayID: 42, pointSize: CGSize(width: 8, height: 6)) + ok(false, "publicly accessible frame files are rejected") + } catch { ok(true, "publicly accessible frame files are rejected") } + try FileManager.default.setAttributes([.posixPermissions: 0o600], ofItemAtPath: url.path) + let malformed = url.deletingLastPathComponent().appendingPathComponent("MatrixWallpaperFrame-\(UUID().uuidString)") + try FileManager.default.copyItem(at: url, to: malformed) + defer { try? FileManager.default.removeItem(at: malformed) } + let file = try FileHandle(forWritingTo: malformed) + try file.write(contentsOf: Data(repeating: 0, count: 8)) + try file.close() + do { + _ = try SharedWallpaperFrame(reading: malformed, displayID: 42, pointSize: CGSize(width: 8, height: 6)) + ok(false, "malformed frame metadata is rejected before mapping") + } catch { ok(true, "malformed frame metadata is rejected before mapping") } + Thread.sleep(forTimeInterval: SharedWallpaperFrame.freshnessInterval + 0.1) + ok(reader.snapshot() == nil, "a silent producer cannot leave a permanently frozen shared frame") + writer!.refresh() + ok(reader.snapshot() != nil, "shutdown invalidation is checked against a still-fresh shared frame") + writer = nil + ok(!FileManager.default.fileExists(atPath: url.path) && reader.snapshot() == nil, + "producer shutdown unlinks its file and immediately invalidates readers") + } catch { ok(false, "shared-frame transport: \(error)") } +} diff --git a/Tests/MatrixScreenSaverTests/WallpaperPlaybackStateTests.swift b/Tests/MatrixScreenSaverTests/WallpaperPlaybackStateTests.swift index 1cfbe9f..f91497e 100644 --- a/Tests/MatrixScreenSaverTests/WallpaperPlaybackStateTests.swift +++ b/Tests/MatrixScreenSaverTests/WallpaperPlaybackStateTests.swift @@ -26,4 +26,16 @@ func wallpaperPlaybackStateTests() { state.setSuspended(.displaysSleeping, false) state.setSuspended(.displaysSleeping, false) ok(state.shouldRun, "WallpaperPlaybackState: duplicate resume notifications are harmless") + state.setSuspended(.screenSaver, true) + state.setSuspended(.locked, true) + state.isServingScreenSaver = true + ok(state.shouldRun && !state.shouldShowDesktop, "WallpaperPlaybackState: shared saver keeps rendering behind the lock screen") + state.setSuspended(.displaysSleeping, true) + ok(!state.shouldRun, "WallpaperPlaybackState: sharing never overrides display sleep") + state.setSuspended(.displaysSleeping, false) + state.setSuspended(.sessionInactive, true) + ok(!state.shouldRun, "WallpaperPlaybackState: sharing never overrides an inactive login session") + state.setSuspended(.sessionInactive, false) + state.isServingScreenSaver = false + ok(!state.shouldRun, "WallpaperPlaybackState: expired consumers restore ordinary lock and saver suspension") } diff --git a/Tests/MatrixScreenSaverTests/main.swift b/Tests/MatrixScreenSaverTests/main.swift index 5070fe5..387a81a 100644 --- a/Tests/MatrixScreenSaverTests/main.swift +++ b/Tests/MatrixScreenSaverTests/main.swift @@ -19,6 +19,7 @@ xorshift64Tests() screenSyncCoordinatorTests() nativeMatrixRendererTests() wallpaperPlaybackStateTests() +sharedWallpaperFrameTests() print("1..\(testCount)") exit(failCount == 0 ? 0 : 1) diff --git a/Tests/MatrixWallpaperTests/ConsumerHost.swift b/Tests/MatrixWallpaperTests/ConsumerHost.swift new file mode 100644 index 0000000..205f3c8 --- /dev/null +++ b/Tests/MatrixWallpaperTests/ConsumerHost.swift @@ -0,0 +1,117 @@ +import AppKit + +/// Reads existing state without adding production-only test hooks. +func stored(_ name: String, in object: Any, as type: Value.Type = Value.self) -> Value? { + guard let value = Mirror(reflecting: object).children.first(where: { $0.label == name })?.value else { return nil } + return value as? Value +} + +/// Waits for an observed transition with a bounded run-loop deadline. +func eventually(_ seconds: TimeInterval = 2, _ condition: () -> Bool) -> Bool { + let deadline = Date(timeIntervalSinceNow: seconds) + repeat { + if condition() { return true } + wait(0.02) + } while Date() < deadline + return condition() +} + +/// Exercises production host detection, discovery, and the real consumer view. +func consumerHostTests() { + check(ProcessInfo.processInfo.processName == "ScreenSaverEngine", "helper uses the production saver process name") + // An unattached-to-window canvas uses display 0, isolating discovery from live wallpaper displays. + let container = NSView(frame: NSRect(x: 0, y: 0, width: 437, height: 293)) + let view = MatrixScreenSaverView(frame: container.bounds, isPreview: false)! + container.addSubview(view) + view.startAnimation() + defer { view.stopAnimation(); view.removeFromSuperview() } + guard let renderer: NativeMatrixRenderer = stored("nativeRenderer", in: view) else { + check(false, "consumer renderer is observable") + return + } + check(stored("wallpaperFrameReader", in: view, as: WallpaperFrameReader?.self) != nil, + "real saver view enters wallpaper discovery") + check(eventually { view.animateOneFrame(); return ScreenSyncCoordinator.shared.registeredCount == 1 }, + "discovery timeout starts coordinated standalone playback") + + var producer: SharedWallpaperFrame? = try! SharedWallpaperFrame(displayID: 0, pointSize: container.bounds.size, scale: 1) + func publish(_ gray: CGFloat) { + _ = producer!.publish { context in + context.setFillColor(CGColor(gray: gray, alpha: 1)) + context.fill(container.bounds) + } + DistributedNotificationCenter.default().postNotificationName(SharedWallpaperFrame.offerNotification, + object: producer!.url.path, userInfo: nil, deliverImmediately: true) + } + publish(0.25) + check(eventually { view.animateOneFrame(); return stored("sharedWallpaperImage", in: view, as: CGImage?.self).flatMap { $0 } != nil }, + "consumer acquires a fresh matching producer") + check(ScreenSyncCoordinator.shared.registeredCount == 0 && stored("running", in: renderer, as: Bool.self) == false, + "shared consumer stops its native simulation and leaves barriers") + let first = pixels(of: view) + let frameIndex: Int? = stored("frameIndex", in: renderer) + publish(0.75) + check(eventually { view.animateOneFrame(); return pixels(of: view) != first }, + "new publication reaches the actual consumer presentation") + check(stored("frameIndex", in: renderer, as: Int.self) == frameIndex, + "shared frame ticks do not advance native simulation") + + let nativeContainers = (1.. NSView in + let container = NSView(frame: NSRect(x: 0, y: 0, width: 503 + index, height: 347)) + let native = MatrixScreenSaverView(frame: container.bounds, isPreview: false)! + container.addSubview(native) + native.startAnimation() + return container + } + let nativeViews = nativeContainers.compactMap { $0.subviews.first as? MatrixScreenSaverView } + defer { nativeViews.forEach { $0.stopAnimation() } } + if !nativeViews.isEmpty { + check(eventually(3) { + nativeViews.forEach { $0.animateOneFrame() } + return ScreenSyncCoordinator.shared.registeredCount == nativeViews.count && + ScreenSyncCoordinator.shared.resolvedStartTime() != nil + }, "actual mixed shared/native views resolve startup without waiting for the shared display") + } + + producer = nil + view.animateOneFrame() + check(stored("running", in: renderer, as: Bool.self) == true && ScreenSyncCoordinator.shared.registeredCount == nativeViews.count, + "producer exit starts immediate independent fallback") + var options = MatrixScreenSaverView.loadSaverOptions() + options.scanLinesIntensity = 0.4 + view.applyWallpaperOptions(options) + let configuration: NativeMatrixRenderer.Configuration? = stored("configuration", in: renderer) + check(configuration?.skipSyncDelay == true, "live visual options retain independent fallback transitions") + options.neoMessageSceneEnabled = true + options.numberSceneEnabled = true + options.neoMessageLines = ["X"] + options.rainRunForever = false + options.rainDurationSeconds = 1 + view.applyWallpaperOptions(options) + var sawRain = false + var restartedRain = false + var returnedToIntro = false + for _ in 0..<200 { + // Advance the existing timeline instead of waiting through scripted intro and drain pauses. + renderer.shiftTimeline(by: -10) + view.animateOneFrame() + if let scene: Any = stored("activeScene", in: renderer), String(describing: scene) == "rainForever" { + if sawRain && returnedToIntro { restartedRain = true; break } + sawRain = true + } else if sawRain { + returnedToIntro = true + } + } + check(sawRain && restartedRain && stored("pendingSceneAdvance", in: view, as: Bool.self) == false && + stored("pendingRestart", in: view, as: Bool.self) == false, + "fallback completes both intros and finite-rain restart without joining native barriers") + + producer = try! SharedWallpaperFrame(displayID: 0, pointSize: container.bounds.size, scale: 1) + publish(0.5) + check(eventually { view.animateOneFrame(); return stored("running", in: renderer, as: Bool.self) == false }, + "producer reconnect stops fallback and rejoins shared presentation") + view.stopAnimation() + nativeViews.forEach { $0.stopAnimation() } + check(ScreenSyncCoordinator.shared.registeredCount == 0 && ScreenSyncCoordinator.shared.expected == 0, + "consumer teardown clears synchronization state") +} diff --git a/Tests/MatrixWallpaperTests/GPUCompositionTests.swift b/Tests/MatrixWallpaperTests/GPUCompositionTests.swift new file mode 100644 index 0000000..d4f5d2c --- /dev/null +++ b/Tests/MatrixWallpaperTests/GPUCompositionTests.swift @@ -0,0 +1,641 @@ +import AppKit +import CoreImage +import Metal + +/// Creates the same device-RGB BGRA storage used by shared publication. +private func gpuReferenceContext(width: Int, height: Int) -> CGContext? { + CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, + bytesPerRow: width * 4, space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedFirst.rawValue) +} + +/// Finds a sampling phase against independent Core Graphics coordinate labels, not scene colors. +/// +/// - Parameters: +/// - sourceLength: Number of terminal pixels on the sampled axis. +/// - targetLength: Number of backing pixels on that axis. +/// - vertical: Whether to label rows instead of columns. +/// - context: Reused Metal-backed context with unmanaged 8-bit processing. +/// - Returns: A phase inside the longest exact interval, or nil if no tested phase matches. +private func gpuSamplingPhase(sourceLength: Int, targetLength: Int, vertical: Bool, + context: CIContext) -> CGFloat? { + let shifts = (-100...100).map { CGFloat($0) / 100_000 } + let sw = vertical ? 1 : sourceLength, sh = vertical ? sourceLength : 1 + let width = vertical ? 1 : targetLength, height = vertical ? targetLength : 1 + guard let source = gpuReferenceContext(width: sw, height: sh), + let sourceBytes = source.data?.assumingMemoryBound(to: UInt8.self), + let reference = gpuReferenceContext(width: width, height: height), + let referenceBytes = reference.data else { + check(false, "GPU sampling boundary fixture allocates its bitmaps") + return nil + } + for index in 0..> 8) & 255) + sourceBytes[index * 4 + 2] = 117 + sourceBytes[index * 4 + 3] = 255 + } + guard let image = source.makeImage() else { + check(false, "GPU sampling boundary fixture supplies an image") + return nil + } + let rect = CGRect(x: 0, y: 0, width: width, height: height) + reference.interpolationQuality = .none + reference.draw(image, in: rect) + let expected = Data(bytes: referenceBytes, count: width * height * 4) + let input = CIImage(cgImage: image, options: [.colorSpace: NSNull()]) + .clampedToExtent().samplingNearest() + var passingShifts = Set() + var minimumDifferences = expected.count + for (index, shift) in shifts.enumerated() { + let transform = CGAffineTransform(a: CGFloat(width) / CGFloat(sw), b: 0, c: 0, + d: CGFloat(height) / CGFloat(sh), + tx: vertical ? 0 : shift, ty: vertical ? -shift : 0) + var actual = Data(count: expected.count) + actual.withUnsafeMutableBytes { + context.render(input.transformed(by: transform, highQualityDownsample: false), + toBitmap: $0.baseAddress!, rowBytes: width * 4, bounds: rect, + format: .BGRA8, colorSpace: nil) + } + let differences = expected.indices.reduce(0) { $0 + (expected[$1] == actual[$1] ? 0 : 1) } + minimumDifferences = min(minimumDifferences, differences) + if differences == 0 { passingShifts.insert(index) } + } + print("GPU phase sweep \(vertical ? "Y" : "X") \(sourceLength)->\(targetLength): \(passingShifts.count)/\(shifts.count) exact phases, minimum differing bytes=\(minimumDifferences)") + var best: [Int] = [], run: [Int] = [] + for index in shifts.indices { + if passingShifts.contains(index) { + run.append(index) + if run.count > best.count { best = run } + } else { + run = [] + } + } + return best.isEmpty ? nil : shifts[best[best.count / 2]] +} + +/// Keeps the smallest counterexamples that reject a universal hard-coded sampling offset. +private func gpuSamplingBoundaryTests(context: CIContext) { + // Reduced from a sweep of all 17 cell presets at eleven canvas sizes and both scales. + for (sourceLength, targetLength, vertical) in [(288, 293, true), (432, 437, false), + (3838, 7680, false), (3818, 7680, false)] { + check(gpuSamplingPhase(sourceLength: sourceLength, targetLength: targetLength, + vertical: vertical, context: context) != nil, + "Core Image per-geometry phase can match \(sourceLength)->\(targetLength) \(vertical ? "Y" : "X") sampling") + } +} + +/// Completes GPU readback into private storage before any shared publication is allowed. +/// +/// - Parameters: +/// - image: Fully composed image in backing-pixel coordinates. +/// - context: Reused Metal-backed context. +/// - output: Private BGRA bitmap, never the mapped publication buffer. +/// - Throws: A task-submission or GPU-completion error. +private func completeGPUImage(_ image: CIImage, context: CIContext, output: CGContext) throws { + let destination = CIRenderDestination(bitmapData: output.data!, width: output.width, + height: output.height, bytesPerRow: output.bytesPerRow, format: .BGRA8) + destination.colorSpace = nil + destination.alphaMode = .premultiplied + destination.isFlipped = true + destination.isDithered = false + let rect = CGRect(x: 0, y: 0, width: output.width, height: output.height) + let task = try context.startTask(toRender: image, from: rect, to: destination, at: .zero) + _ = try task.waitUntilCompleted() +} + +/// Tests direct GPU readback through a private shared-storage texture, without a bitmap conversion copy. +private final class GPUReadbackSurface { + private let buffer: MTLBuffer + private let texture: MTLTexture + private let bytesPerRow: Int + + /// Allocates one reusable, aligned output surface for the given backing dimensions. + init?(device: MTLDevice, width: Int, height: Int) { + let alignment = max(1, device.minimumLinearTextureAlignment(for: .bgra8Unorm)) + let rowBytes = (width * 4 + alignment - 1) / alignment * alignment + let descriptor = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: .bgra8Unorm, + width: width, height: height, mipmapped: false) + descriptor.storageMode = .shared + descriptor.usage = [.shaderRead, .shaderWrite] + guard let buffer = device.makeBuffer(length: rowBytes * height, options: .storageModeShared), + let texture = buffer.makeTexture(descriptor: descriptor, offset: 0, bytesPerRow: rowBytes) else { return nil } + self.buffer = buffer + self.texture = texture + bytesPerRow = rowBytes + } + + /// Completes GPU work before exposing pixels for a synchronous copy into the unchanged transport. + /// + /// The returned image borrows private scratch pixels until the next render. It must never + /// become a presentation image; `SharedWallpaperFrame.publish` makes the immutable copies. + /// - Throws: A task-submission, GPU-completion, or image-creation error. + func render(_ image: CIImage, context: CIContext) throws -> CGImage { + let destination = CIRenderDestination(mtlTexture: texture, commandBuffer: nil) + destination.colorSpace = nil + destination.alphaMode = .premultiplied + destination.isFlipped = true + destination.isDithered = false + let rect = CGRect(x: 0, y: 0, width: texture.width, height: texture.height) + let task = try context.startTask(toRender: image, from: rect, to: destination, at: .zero) + _ = try task.waitUntilCompleted() + let retainedBuffer = Unmanaged.passRetained(buffer as AnyObject).toOpaque() + guard let provider = CGDataProvider(dataInfo: retainedBuffer, data: buffer.contents(), + size: bytesPerRow * texture.height, releaseData: { info, _, _ in + if let info { Unmanaged.fromOpaque(info).release() } + }) else { + Unmanaged.fromOpaque(retainedBuffer).release() + throw NSError(domain: "GPUReadbackSurface", code: 1) + } + guard let result = CGImage(width: texture.width, height: texture.height, bitsPerComponent: 8, + bitsPerPixel: 32, bytesPerRow: bytesPerRow, space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | + CGImageAlphaInfo.premultipliedFirst.rawValue), provider: provider, + decode: nil, shouldInterpolate: false, intent: .defaultIntent) else { + throw NSError(domain: "GPUReadbackSurface", code: 2) + } + return result + } +} + +/// Measures changing GPU composition, completed readback, publication, and both immutable snapshots. +/// +/// This excludes simulation and dirty-glyph rasterization; it cannot establish actual-host acceptance. +private func gpuPublicationBenchmark(terminal: CGContext, transform: CGAffineTransform, base: CGImage, + mask: CGImage, scanLines: CGImage?, context: CIContext, device: MTLDevice, + size: CGSize, scale: CGFloat) { + do { + let background = CIImage(cgImage: base, options: [.colorSpace: NSNull()]) + let stripes = scanLines.map { CIImage(cgImage: $0, options: [.colorSpace: NSNull()]) } ?? CIImage.empty() + for engine in ["CPU", "GPU-bitmap", "GPU-linear"] { + let gpu = engine != "CPU" + let producer = try SharedWallpaperFrame(displayID: 0, pointSize: size, scale: scale) + let reader = try SharedWallpaperFrame(reading: producer.url, displayID: 0, pointSize: size) + let width = producer.pixelWidth, height = producer.pixelHeight + let rect = CGRect(x: 0, y: 0, width: width, height: height) + let maskImage = CIImage(cgImage: mask, options: [.colorSpace: NSNull()]) + guard let surface = GPUReadbackSurface(device: device, width: width, height: height) else { + throw NSError(domain: "GPUCompositionBenchmark", code: 3) + } + var durations: [Double] = [] + var producerDurations: [Double] = [] + var lastSequence: UInt64 = 0 + var previousGreen: UInt8? + var retainedImage: CGImage? + var retainedGreen: UInt8 = 0 + let markerX = Int(25 * CGFloat(width) / CGFloat(terminal.width)) + let markerY = height - 1 - Int(30 * CGFloat(height) / CGFloat(terminal.height)) + let markerOffset = (markerY * width + markerX) * 4 + 1 + for frame in 0..<65 { + let duration: Double = try autoreleasepool { + let start = ProcessInfo.processInfo.systemUptime + terminal.setFillColor(CGColor(red: 0, green: CGFloat(frame % 64) / 63, blue: 0, alpha: 1)) + terminal.fill(CGRect(x: 20, y: 20, width: 13, height: 24)) + guard let input = terminal.makeImage() else { + throw NSError(domain: "GPUCompositionBenchmark", code: 1) + } + let image: CGImage? + if gpu { + let foreground = CIImage(cgImage: input, options: [.colorSpace: NSNull()]) + .clampedToExtent().samplingNearest().transformed(by: transform, highQualityDownsample: false) + let clipped = foreground.applyingFilter("CIBlendWithAlphaMask", parameters: [ + kCIInputBackgroundImageKey: CIImage.empty(), kCIInputMaskImageKey: maskImage, + ]).insertingIntermediate(cache: false) + let scene = clipped.composited(over: background).insertingIntermediate(cache: false) + if engine == "GPU-linear" { + image = try surface.render(stripes.composited(over: scene), context: context) + } else { + guard let output = gpuReferenceContext(width: width, height: height) else { + throw NSError(domain: "GPUCompositionBenchmark", code: 1) + } + try completeGPUImage(stripes.composited(over: scene), context: context, output: output) + image = output.makeImage() + } + } else { + image = input + } + guard let image, producer.publish({ target in + if gpu { + target.setBlendMode(.copy) + target.interpolationQuality = .none + target.draw(image, in: rect) + } else { + target.saveGState() + target.setBlendMode(.copy) + target.interpolationQuality = .none + target.draw(base, in: rect) + target.restoreGState() + target.saveGState() + target.scaleBy(x: scale, y: scale) + target.interpolationQuality = .none + let bounds = CGRect(origin: .zero, size: size) + target.saveGState() + target.clip(to: bounds.insetBy(dx: 0, dy: 10)) + target.draw(image, in: bounds) + target.restoreGState() + target.saveGState() + target.clip(to: [CGRect(x: 0, y: 0, width: size.width, height: 10), + CGRect(x: 0, y: size.height - 10, width: size.width, height: 10)]) + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.current = NSGraphicsContext(cgContext: target, flipped: false) + NSBezierPath(roundedRect: bounds, xRadius: 10, yRadius: 10).addClip() + target.draw(image, in: bounds) + NSGraphicsContext.restoreGraphicsState() + target.restoreGState() + target.restoreGState() + if let scanLines { target.draw(scanLines, in: rect) } + } + }) != nil else { + throw NSError(domain: "GPUCompositionBenchmark", code: 2) + } + let producerEnd = ProcessInfo.processInfo.systemUptime + guard let snapshot = reader.snapshot(), snapshot.sequence > lastSequence else { + throw NSError(domain: "GPUCompositionBenchmark", code: 2) + } + lastSequence = snapshot.sequence + if frame >= 5 { producerDurations.append(producerEnd - start) } + let end = ProcessInfo.processInfo.systemUptime + guard let pixels = snapshot.image.dataProvider?.data else { + throw NSError(domain: "GPUCompositionBenchmark", code: 4) + } + let green = (pixels as Data)[markerOffset] + guard previousGreen == nil || previousGreen != green else { + throw NSError(domain: "GPUCompositionBenchmark", code: 5) + } + previousGreen = green + if frame == 1 { retainedImage = snapshot.image; retainedGreen = green } + return end - start + } + if frame >= 5 { durations.append(duration) } + } + let mean = durations.reduce(0, +) * 1000 / Double(durations.count) + let producerMean = producerDurations.reduce(0, +) * 1000 / Double(producerDurations.count) + let p95 = durations.sorted()[Int(ceil(Double(durations.count) * 0.95)) - 1] * 1000 + print("\(engine) publication \(width)x\(height): producer-mean=\(producerMean)ms total-mean=\(mean)ms total-p95=\(p95)ms; 60 changing frames after 5 warmup, includes publication/immutable snapshots, excludes simulation/glyph rasterization/dirty-band clipping") + check(lastSequence == 65, "\(gpu ? "GPU" : "CPU") benchmark publishes and consumes every completed changing frame") + let retainedPixels = retainedImage?.dataProvider?.data + check(retainedPixels.map { ($0 as Data)[markerOffset] == retainedGreen } == true, + "\(engine) readback reuse leaves old presentation images immutable") + } + } catch { + check(false, "GPU publication benchmark completes without partial publication: \(error)") + } +} + +/// Exercises the production compositor's failure boundary, scratch reuse, and recreation. +private func gpuPublicationFailureTests() { + let size = CGSize(width: 37, height: 23) + guard let base = gpuReferenceContext(width: 37, height: 23), + let mask = gpuReferenceContext(width: 37, height: 23), + let terminal = gpuReferenceContext(width: 37, height: 23), + let invalid = gpuReferenceContext(width: 1, height: 1)?.makeImage() else { + check(false, "GPU publication failure fixture allocates its layers") + return + } + let rect = CGRect(origin: .zero, size: size) + base.setFillColor(CGColor(gray: 0, alpha: 1)); base.fill(rect) + mask.setFillColor(CGColor(gray: 1, alpha: 1)); mask.fill(rect) + terminal.setFillColor(CGColor(red: 0, green: 1, blue: 0, alpha: 1)); terminal.fill(rect) + guard let baseImage = base.makeImage(), let maskImage = mask.makeImage(), let green = terminal.makeImage(), + let compositor = SharedWallpaperCompositor(base: baseImage, mask: maskImage, scanLines: nil, terminalSize: size) else { + check(false, "GPU publication failure fixture creates the production compositor") + return + } + do { + let producer = try SharedWallpaperFrame(displayID: 0, pointSize: size, scale: 1) + let reader = try SharedWallpaperFrame(reading: producer.url, displayID: 0, pointSize: size) + guard let first = try compositor.publish(terminal: green, cursor: nil, to: producer), + let firstPixels = first.dataProvider?.data, let snapshot = reader.snapshot() else { + throw NSError(domain: "GPUCompositionFixture", code: 3) + } + let original = firstPixels as Data + let greenPixels = green.dataProvider?.data.map { $0 as Data } + check(original == greenPixels, "production GPU preserves native device-RGB pixels with an aligned scratch stride") + do { + _ = try compositor.publish(terminal: invalid, cursor: nil, to: producer) + check(false, "incompatible GPU input is rejected before publication") + } catch { + check(reader.snapshot()?.sequence == snapshot.sequence, + "GPU failure does not advance or refresh a partial shared frame") + } + terminal.setFillColor(CGColor(red: 1, green: 0, blue: 0, alpha: 1)); terminal.fill(rect) + guard let red = terminal.makeImage(), + let second = try compositor.publish(terminal: red, cursor: nil, to: producer), + let secondPixels = second.dataProvider?.data else { + throw NSError(domain: "GPUCompositionFixture", code: 4) + } + let redPixels = red.dataProvider?.data.map { $0 as Data } + check((secondPixels as Data) == redPixels && (secondPixels as Data) != original, + "production GPU scratch reuse publishes changed pixels rather than a cached source") + check(first.dataProvider?.data.map { $0 as Data } == original, + "production GPU scratch reuse cannot mutate an old presentation image") + let recreated = SharedWallpaperCompositor(base: baseImage, mask: maskImage, scanLines: nil, terminalSize: size) + check(try recreated?.publish(terminal: red, cursor: nil, to: producer) != nil && reader.snapshot()?.sequence == 3, + "GPU resource recreation preserves transport sequence and publication") + check(SharedWallpaperCompositor(base: baseImage, mask: maskImage, scanLines: nil, terminalSize: .zero) == nil, + "unsupported GPU layout declines composition instead of publishing incomplete pixels") + } catch { + check(false, "production GPU publication checks complete: \(error)") + } +} + +/// Confirms that preview chrome retains its native CPU path at both backing scales. +private func gpuPreviewFallbackTests() { + for scale: CGFloat in [1, 2] { + let view = MatrixScreenSaverView(frame: NSRect(x: 0, y: 0, width: 437, height: 293), isPreview: true)! + let window = CompositionWindow(contentRect: view.bounds, styleMask: [], backing: .buffered, defer: false) + window.isReleasedWhenClosed = false + window.testScale = scale + window.contentView = view + view.startAnimation() + view.isWallpaperHost = true + let reference = scenePixels(view, scale: scale) + _ = view.shareWallpaperFrames() + let compositor: SharedWallpaperCompositor? = stored("wallpaperCompositor", in: view) + check(compositor == nil && reference != nil && scenePixels(view, scale: scale) == reference, + "preview chrome retains byte-equivalent CPU composition at \(scale)x") + view.stopAnimation() + window.close() + } +} + +/// Characterizes the scaling and source-over primitives before attempting rounded clipping or integration. +/// +/// Uses actual frozen renderer layers and an independent native full-scene reference. +/// Run explicitly with `./wallpaper-tests.sh --gpu-composition-tests`; failure blocks integration. +func gpuCompositionFeasibilityTests(benchmark: Bool = false) { + guard let device = MTLCreateSystemDefaultDevice() else { + check(false, "GPU feasibility requires an available Metal device") + return + } + let candidates: [(String, CIContext)] = [ + ("unmanaged-byte", CIContext(mtlDevice: device, options: [ + .workingColorSpace: NSNull(), .workingFormat: CIFormat.RGBA8])), + ] + gpuSamplingBoundaryTests(context: candidates[0].1) + gpuPublicationFailureTests() + gpuPreviewFallbackTests() + let canvases = benchmark ? [(NSSize(width: 1728, height: 1117), 2), (NSSize(width: 1920, height: 1080), 1)] + : [(NSSize(width: 437, height: 293), 1), (NSSize(width: 437, height: 293), 2)] + let scenes = benchmark ? [(true, false, 0.25)] + : [(false, false, 0.0), (false, false, 0.25), (true, false, 0.75), + (true, false, 1.0), (false, true, 0.25), (true, true, 0.75)] + for (size, scale) in canvases { + for (vertical, neo, intensity) in scenes { + let width = Int(size.width) * scale, height = Int(size.height) * scale + let rect = CGRect(x: 0, y: 0, width: width, height: height) + let view = MatrixScreenSaverView(frame: NSRect(origin: .zero, size: size), isPreview: false)! + let window = CompositionWindow(contentRect: view.bounds, styleMask: [], backing: .buffered, defer: false) + window.isReleasedWhenClosed = false + window.testScale = CGFloat(scale) + window.contentView = view + view.startAnimation() + view.isWallpaperHost = true + view.rendersWallpaperWhileHidden = true + defer { view.stopAnimation(); window.close() } + var options = MatrixScreenSaverView.loadSaverOptions() + options.characterWidth = 13 + options.characterHeight = 24 + options.neoMessageSceneEnabled = neo + options.neoMessageLines = ["Wake up, Neo."] + options.numberSceneEnabled = false + options.diffuseEnabled = true + options.scanLinesIntensity = intensity + options.scanLinesVertical = vertical + view.applyWallpaperOptions(options) + let renderer: NativeMatrixRenderer = stored("nativeRenderer", in: view)! + renderer.overrideSceneStartTime = Date.timeIntervalSinceReferenceDate - (neo ? 2 : 120) + renderer.start() + _ = view.shareWallpaperFrames() + for _ in 0..<(neo ? 4 : 12) { + Thread.sleep(forTimeInterval: 0.041) + view.animateOneFrame() + } + guard let frameContext: CGContext = stored("nativeFrameContext", in: view), + let terminal = frameContext.makeImage(), + let base: CGImage = stored("wallpaperSceneBase", in: view), + let reference = gpuReferenceContext(width: width, height: height), + let control = gpuReferenceContext(width: width, height: height) else { + check(false, "GPU feasibility fixture supplies real renderer layers") + return + } + reference.interpolationQuality = .none + reference.draw(base, in: rect) + reference.draw(terminal, in: rect) + guard let image = reference.makeImage(), let bytes = reference.data else { + check(false, "GPU feasibility reference is readable") + return + } + let expected = Data(bytes: bytes, count: width * height * 4) + control.interpolationQuality = .none + control.draw(image, in: rect) + check(control.data.map { Data(bytes: $0, count: expected.count) } == expected, + "GPU fixture CPU round-trip preserves orientation and BGRA bytes at \(scale)x") + check(expected.enumerated().contains { $0.offset % 4 != 3 && $0.element > 32 }, + "GPU fixture contains visible rain rather than an empty frame at \(scale)x") + guard let samplingContext = gpuReferenceContext(width: terminal.width, height: terminal.height), + let samplingBytes = samplingContext.data?.assumingMemoryBound(to: UInt8.self) else { + check(false, "GPU deterministic sampling fixture is writable") + return + } + // Distinct opaque neighbours expose sampling-boundary differences even in blank rain rows. + for y in 0.. \(width)x\(height)): differing-bytes=\(differing)/\(expected.count), max-delta=\(maximumDelta), first: \(first)") + check(actual == expected, "Metal Core Image \(name) preserves scaled rain source-over bytes at \(scale)x") + guard let scaleReference = gpuReferenceContext(width: width, height: height), + let sourceBytes = scaleReference.data else { + check(false, "GPU scale-only reference is readable") + return + } + scaleReference.interpolationQuality = .none + scaleReference.draw(samplingImage, in: rect) + let expectedScaled = Data(bytes: sourceBytes, count: expected.count) + let sampling = samplingInput.clampedToExtent().samplingNearest() + .transformed(by: terminalTransform, highQualityDownsample: false) + actual.withUnsafeMutableBytes { + context.render(sampling, toBitmap: $0.baseAddress!, rowBytes: width * 4, + bounds: rect, format: .BGRA8, colorSpace: nil) + } + let scaleDifferences = expectedScaled.indices.filter { expectedScaled[$0] != actual[$0] }.count + let firstScaled = expectedScaled.indices.first { expectedScaled[$0] != actual[$0] } + let detail = firstScaled.map { + "x=\(($0 / 4) % width) y=\($0 / (width * 4)) BGRA-channel=\($0 % 4) CPU=\(expectedScaled[$0]) GPU=\(actual[$0])" + } ?? "none" + print("GPU scale-only \(name) \(scale)x: differing-bytes=\(scaleDifferences), first: \(detail)") + check(actual == expectedScaled, "Metal Core Image \(name) deterministic nearest sampling matches Core Graphics at \(scale)x") + let clipped = foreground.applyingFilter("CIBlendWithAlphaMask", parameters: [ + kCIInputBackgroundImageKey: CIImage.empty(), + kCIInputMaskImageKey: CIImage(cgImage: mask, options: inputOptions), + ]).insertingIntermediate(cache: false) + let cursor = CIImage(cgImage: cursorImage, options: inputOptions) + .applyingFilter("CIBlendWithAlphaMask", parameters: [ + kCIInputBackgroundImageKey: CIImage.empty(), + kCIInputMaskImageKey: CIImage(cgImage: mask, options: inputOptions), + ]).insertingIntermediate(cache: false) + let scene = clipped.composited(over: background).insertingIntermediate(cache: false) + let withCursor = cursor.composited(over: scene).insertingIntermediate(cache: false) + let stripes = scanLines.map { CIImage(cgImage: $0, options: inputOptions) } ?? CIImage.empty() + let fullScene = stripes.composited(over: withCursor) + do { + guard let output = gpuReferenceContext(width: width, height: height), let bytes = output.data else { + throw NSError(domain: "GPUCompositionFixture", code: 1) + } + try completeGPUImage(fullScene, context: context, output: output) + actual = Data(bytes: bytes, count: fullReference.count) + check(actual == fullReference, "Core Image bitmap-destination fidelity holds before testing linear readback") + guard let surface = GPUReadbackSurface(device: device, width: width, height: height) else { + throw NSError(domain: "GPUCompositionFixture", code: 2) + } + let image = try surface.render(fullScene, context: context) + output.setBlendMode(.copy) + output.interpolationQuality = .none + output.draw(image, in: rect) + actual = Data(bytes: bytes, count: fullReference.count) + } catch { + check(false, "GPU full composition completes before readback: \(error)") + return + } + let fullDifferences = fullReference.indices.filter { fullReference[$0] != actual[$0] }.count + let firstFull = fullReference.indices.first { fullReference[$0] != actual[$0] } + let fullDetail = firstFull.map { + "x=\(($0 / 4) % width) y=\($0 / (width * 4)) BGRA-channel=\($0 % 4) CPU=\(fullReference[$0]) GPU=\(actual[$0])" + } ?? "none" + print("GPU full scene \(name) \(scale)x neo=\(neo) vertical=\(vertical) intensity=\(intensity): differing-bytes=\(fullDifferences), first: \(fullDetail)") + check(actual == fullReference, "Metal Core Image \(name) rounded scene, cursor, and scanlines match native at \(scale)x neo=\(neo) vertical=\(vertical) intensity=\(intensity)") + let filledCorners = sampling.applyingFilter("CIBlendWithAlphaMask", parameters: [ + kCIInputBackgroundImageKey: CIImage.empty(), + kCIInputMaskImageKey: CIImage(cgImage: mask, options: inputOptions), + ]).insertingIntermediate(cache: false).composited(over: background).insertingIntermediate(cache: false) + actual.withUnsafeMutableBytes { + context.render(stripes.composited(over: filledCorners), toBitmap: $0.baseAddress!, rowBytes: width * 4, + bounds: rect, format: .BGRA8, colorSpace: nil) + } + let cornerDifferences = cornerReference.indices.filter { cornerReference[$0] != actual[$0] }.count + print("GPU filled corners \(scale)x intensity=\(intensity): differing-bytes=\(cornerDifferences)") + check(actual == cornerReference, "GPU rounded coverage preserves fully populated corner pixels at \(scale)x intensity=\(intensity)") + if benchmark && failures == 0 { + gpuPublicationBenchmark(terminal: frameContext, transform: terminalTransform, base: base, + mask: mask, scanLines: scanLines, context: context, device: device, + size: size, scale: CGFloat(scale)) + } + } + } + } +} diff --git a/Tests/MatrixWallpaperTests/SharedCompositionTests.swift b/Tests/MatrixWallpaperTests/SharedCompositionTests.swift new file mode 100644 index 0000000..c3389f9 --- /dev/null +++ b/Tests/MatrixWallpaperTests/SharedCompositionTests.swift @@ -0,0 +1,192 @@ +import AppKit + +/// Controls backing resolution without depending on the test machine's attached displays. +final class CompositionWindow: NSWindow { + /// Backing scale requested by this fixture. + var testScale: CGFloat = 1 + override var backingScaleFactor: CGFloat { testScale } +} + +/// Captures the view through the same device-RGB BGRA context used by publication. +func scenePixels(_ view: MatrixScreenSaverView, scale: CGFloat) -> Data? { + let width = Int(ceil(view.bounds.width * scale)), height = Int(ceil(view.bounds.height * scale)) + guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, + bytesPerRow: width * 4, space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedFirst.rawValue) else { return nil } + context.scaleBy(x: scale, y: scale) + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.current = NSGraphicsContext(cgContext: context, flipped: false) + view.draw(view.bounds) + NSGraphicsContext.restoreGraphicsState() + return context.data.map { Data(bytes: $0, count: width * height * 4) } +} + +/// Compares frozen native output against shared publication, including static option edits. +func sharedCompositionTests() { + for scale: CGFloat in [1, 2] { + for vertical in [false, true] { + let size = NSSize(width: 437, height: 293) + let view = MatrixScreenSaverView(frame: NSRect(origin: .zero, size: size), isPreview: false)! + let window = CompositionWindow(contentRect: view.bounds, styleMask: [], backing: .buffered, defer: false) + window.isReleasedWhenClosed = false + window.testScale = scale + window.contentView = view + view.startAnimation() + view.isWallpaperHost = true + view.rendersWallpaperWhileHidden = true + var options = MatrixScreenSaverView.loadSaverOptions() + options.scanLinesVertical = vertical + options.scanLinesIntensity = 0.25 + view.applyWallpaperOptions(options) + let reference = scenePixels(view, scale: scale) + let url = view.shareWallpaperFrames() + check(url != nil && reference != nil && scenePixels(view, scale: scale) == reference, + "shared frozen composition matches native at \(scale)x, vertical=\(vertical)") + let displayID = window.screen?.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? UInt32 ?? 0 + let reader = url.flatMap { try? SharedWallpaperFrame(reading: $0, displayID: displayID, pointSize: size) } + let sequence = reader?.snapshot()?.sequence + options.scanLinesIntensity = 0.75 + view.applyWallpaperOptions(options) + _ = view.shareWallpaperFrames() + check(reader?.snapshot()?.sequence != sequence && scenePixels(view, scale: scale) != reference, + "static visual option edit republishes at \(scale)x, vertical=\(vertical)") + view.stopSharingWallpaperFrames() + let editedReference = scenePixels(view, scale: scale) + _ = view.shareWallpaperFrames() + check(editedReference != nil && scenePixels(view, scale: scale) == editedReference, + "edited shared pixels match uncached native composition") + let renderer: NativeMatrixRenderer = stored("nativeRenderer", in: view)! + for neo in [false, true] { + options.neoMessageSceneEnabled = neo + options.numberSceneEnabled = false + options.diffuseEnabled = true + view.applyWallpaperOptions(options) + renderer.overrideSceneStartTime = Date.timeIntervalSinceReferenceDate - (neo ? 2 : 120) + renderer.start() + for _ in 0..<12 { + Thread.sleep(forTimeInterval: 0.041) + view.animateOneFrame() + } + let incremental = scenePixels(view, scale: scale) + view.stopSharingWallpaperFrames() + let full = scenePixels(view, scale: scale) + check(incremental != nil && incremental == full, + "incremental \(neo ? "Neo/cursor" : "rain/diffuse") matches full composition at \(scale)x, vertical=\(vertical)") + _ = view.shareWallpaperFrames() + } + let resized = NSSize(width: 503, height: 347) + window.setContentSize(resized) + view.layout() + let resizedURL = view.shareWallpaperFrames() + let resizedReader = resizedURL.flatMap { try? SharedWallpaperFrame(reading: $0, displayID: displayID, pointSize: resized) } + check(resizedReader?.pixelWidth == Int(resized.width * scale) && resizedReader?.pixelHeight == Int(resized.height * scale), + "resize rebuilds publication at the current backing resolution") + view.stopAnimation() + window.close() + } + } +} + +/// Measures the real view's complete publication cost; never a machine-dependent CI gate. +func compositionBenchmark() { + for (size, scale) in [(NSSize(width: 1728, height: 1117), CGFloat(2)), + (NSSize(width: 1920, height: 1080), CGFloat(1))] { + let view = MatrixScreenSaverView(frame: NSRect(origin: .zero, size: size), isPreview: false)! + view.rendersWallpaperWhileHidden = true + let window = CompositionWindow(contentRect: view.bounds, styleMask: [], backing: .buffered, defer: false) + window.isReleasedWhenClosed = false + window.testScale = scale + window.contentView = view + view.startAnimation() + // Start independently so a one-display fixture does not wait for absent displays. + view.isWallpaperHost = true + var options = MatrixScreenSaverView.loadSaverOptions() + options.frameRate = 25 + options.characterWidth = 13 + options.characterHeight = 24 + options.neoMessageSceneEnabled = false + options.numberSceneEnabled = false + options.diffuseEnabled = true + options.scanLinesVertical = true + options.scanLinesIntensity = 0.25 + view.applyWallpaperOptions(options) + let renderer: NativeMatrixRenderer = stored("nativeRenderer", in: view)! + renderer.overrideSceneStartTime = Date.timeIntervalSinceReferenceDate - 120 + renderer.start() + _ = view.shareWallpaperFrames() + var durations: [Double] = [] + for _ in 0..<100 { + Thread.sleep(forTimeInterval: 0.041) + let start = ProcessInfo.processInfo.systemUptime + view.animateOneFrame() + durations.append(ProcessInfo.processInfo.systemUptime - start) + } + let sorted = durations.sorted() + print("composition \(Int(size.width * scale))x\(Int(size.height * scale)): mean=\(durations.reduce(0, +) * 1000 / Double(durations.count))ms p95=\(sorted[94] * 1000)ms (25FPS, 13x24, diffuse, vertical 0.25)") + view.stopAnimation() + window.close() + } + threeDisplayCompositionBenchmark() +} + +/// Measures aggregate producer work with three live compositors sharing one Core Image context. +func threeDisplayCompositionBenchmark() { + var fixtures: [(MatrixScreenSaverView, CompositionWindow)] = [] + defer { + for (view, window) in fixtures { view.stopAnimation(); window.close() } + } + for (size, scale, seed) in [(NSSize(width: 1728, height: 1117), CGFloat(2), UInt64(1)), + (NSSize(width: 1920, height: 1080), CGFloat(1), UInt64(5)), + (NSSize(width: 1920, height: 1080), CGFloat(1), UInt64(2))] { + let view = MatrixScreenSaverView(frame: NSRect(origin: .zero, size: size), isPreview: false)! + let window = CompositionWindow(contentRect: view.bounds, styleMask: [], backing: .buffered, defer: false) + window.isReleasedWhenClosed = false + window.testScale = scale + window.contentView = view + fixtures.append((view, window)) + view.rendersWallpaperWhileHidden = true + view.startAnimation() + view.isWallpaperHost = true + var options = MatrixScreenSaverView.loadSaverOptions() + options.frameRate = 25 + options.characterWidth = 13 + options.characterHeight = 24 + options.neoMessageSceneEnabled = false + options.numberSceneEnabled = false + options.diffuseEnabled = true + options.scanLinesVertical = true + options.scanLinesIntensity = 0.25 + view.applyWallpaperOptions(options) + let renderer: NativeMatrixRenderer = stored("nativeRenderer", in: view)! + renderer.seedOffset = seed + renderer.overrideSceneStartTime = Date.timeIntervalSinceReferenceDate - 120 + renderer.start() + _ = view.shareWallpaperFrames() + } + let buffers: [SharedWallpaperFrame?] = fixtures.map { stored("sharedFrameBuffer", in: $0.0) } + let initialSequences = buffers.map { $0?.snapshot()?.sequence ?? 0 } + var durations: [Double] = [] + for frame in 0..<200 { + Thread.sleep(forTimeInterval: 0.041) + let start = ProcessInfo.processInfo.systemUptime + for (view, _) in fixtures { view.animateOneFrame() } + if frame >= 100 { durations.append(ProcessInfo.processInfo.systemUptime - start) } + } + let gpuCount = fixtures.filter { view, _ in + let compositor: SharedWallpaperCompositor? = stored("wallpaperCompositor", in: view) + return compositor != nil + }.count + check(gpuCount == 3, "three-display benchmark exercises all three GPU compositors") + check(zip(buffers, initialSequences).allSatisfy { buffer, initial in + initial > 0 && (buffer?.snapshot()?.sequence ?? 0) > initial + 100 + }, "three-display benchmark publishes changing frames rather than timing startup early returns") + let mean = durations.reduce(0, +) * 1000 / Double(durations.count) + let p95 = durations.sorted()[94] * 1000 + print("composition three-display aggregate: mean=\(mean)ms p95=\(p95)ms; 100 measured cycles after 100 warmup, includes simulation/glyph raster/publication, excludes actual timer scheduling and consumer presentation") + for (view, window) in fixtures { + let shared = scenePixels(view, scale: window.testScale) + view.stopSharingWallpaperFrames() + check(shared != nil && shared == scenePixels(view, scale: window.testScale), + "three-display texture reuse preserves the final dense native frame at \(window.testScale)x") + } +} diff --git a/Tests/MatrixWallpaperTests/WallpaperAppTests.swift b/Tests/MatrixWallpaperTests/WallpaperAppTests.swift index 45570d0..19a0e81 100644 --- a/Tests/MatrixWallpaperTests/WallpaperAppTests.swift +++ b/Tests/MatrixWallpaperTests/WallpaperAppTests.swift @@ -28,6 +28,61 @@ func wallpaperAppTests() { NotificationCenter.default.post(name: NSApplication.didChangeScreenParametersNotification, object: nil) check(Set(NSApp.windows.filter { $0 is DesktopWindow && $0.isVisible }.map(ObjectIdentifier.init)) == originalIDs, "unchanged display notifications do not restart a resumed scene") + if let source = originalWindows.first?.contentView as? MatrixScreenSaverView, + let screen = originalWindows.first?.screen, + let displayID = screen.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? UInt32 { + var reader: WallpaperFrameReader? = WallpaperFrameReader() + _ = reader?.frame(displayID: displayID, pointSize: source.bounds.size) + var first: SharedWallpaperFrame.Frame? + let deadline = Date(timeIntervalSinceNow: 10) + repeat { + wait(0.1) + first = reader?.frame(displayID: displayID, pointSize: source.bounds.size) + } while first == nil && Date() < deadline + check(first != nil, "host discovery publishes a matching display without restarting its renderer") + let distributed = DistributedNotificationCenter.default() + distributed.postNotificationName(Notification.Name("com.apple.screensaver.willstart"), object: nil, + userInfo: nil, deliverImmediately: true) + wait(0.2) + check(desktopWindowCount() == 0 && source.isAnimating, + "active saver consumers hide desktop windows but keep their sole renderer running") + wait(0.6) + let next = reader?.frame(displayID: displayID, pointSize: source.bounds.size) + check(next != nil && next!.sequence > (first?.sequence ?? 0), + "hidden wallpaper publishes advancing frames for the saver") + if let other = originalWindows.first(where: { + ($0.screen?.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? UInt32) != displayID + }), let otherSource = other.contentView as? MatrixScreenSaverView, + let otherID = other.screen?.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? UInt32 { + var otherReader: WallpaperFrameReader? = WallpaperFrameReader() + var otherFrame: SharedWallpaperFrame.Frame? + let deadline = Date(timeIntervalSinceNow: 10) + repeat { + _ = reader?.frame(displayID: displayID, pointSize: source.bounds.size) + otherFrame = otherReader?.frame(displayID: otherID, pointSize: otherSource.bounds.size) + wait(0.1) + } while otherFrame == nil && Date() < deadline + check(otherFrame != nil, "each display offers its own matching wallpaper frame") + let otherURL = otherSource.shareWallpaperFrames() + otherReader = nil + let expiry = Date(timeIntervalSinceNow: SharedWallpaperFrame.freshnessInterval + 0.6) + while Date() < expiry { + _ = reader?.frame(displayID: displayID, pointSize: source.bounds.size) + wait(0.1) + } + check(otherURL != nil && !FileManager.default.fileExists(atPath: otherURL!.path) && source.isAnimating, + "one display's consumer expiry releases its buffer while another stays connected") + } + reader = nil + wait(SharedWallpaperFrame.freshnessInterval + 0.6) + check(!source.isAnimating && desktopWindowCount() == 0, + "an expired consumer lease stops hidden rendering without discarding the session") + distributed.postNotificationName(Notification.Name("com.apple.screensaver.didstop"), object: nil, + userInfo: nil, deliverImmediately: true) + wait(0.2) + check(source.isAnimating && Set(NSApp.windows.filter { $0 is DesktopWindow && $0.isVisible }.map(ObjectIdentifier.init)) == originalIDs, + "saver exit reveals the same wallpaper views without replaying the intro") + } workspace.post(name: NSWorkspace.willSleepNotification, object: nil) check(NSApp.sendAction(NSSelectorFromString("togglePlayback:"), to: host, from: nil), "Stop menu action is connected") diff --git a/Tests/MatrixWallpaperTests/main.swift b/Tests/MatrixWallpaperTests/main.swift index 62c057d..8800e5e 100644 --- a/Tests/MatrixWallpaperTests/main.swift +++ b/Tests/MatrixWallpaperTests/main.swift @@ -26,6 +26,26 @@ func wait(_ seconds: TimeInterval) { let app = NSApplication.shared app.setActivationPolicy(.accessory) app.finishLaunching() +if CommandLine.arguments.contains("--consumer-host") { + consumerHostTests() + exit(failures == 0 ? EXIT_SUCCESS : EXIT_FAILURE) +} +if CommandLine.arguments.contains("--composition-benchmark") { + compositionBenchmark() + exit(failures == 0 ? EXIT_SUCCESS : EXIT_FAILURE) +} +if CommandLine.arguments.contains("--composition-tests") { + sharedCompositionTests() + exit(failures == 0 ? EXIT_SUCCESS : EXIT_FAILURE) +} +if CommandLine.arguments.contains("--gpu-composition-tests") { + gpuCompositionFeasibilityTests() + exit(failures == 0 ? EXIT_SUCCESS : EXIT_FAILURE) +} +if CommandLine.arguments.contains("--gpu-composition-benchmark") { + gpuCompositionFeasibilityTests(benchmark: true) + exit(failures == 0 ? EXIT_SUCCESS : EXIT_FAILURE) +} guard let screen = NSScreen.main, let saver = MatrixScreenSaverView(frame: NSRect(x: 0, y: 0, width: 640, height: 360), isPreview: false) else { fatalError("Wallpaper self-check requires a logged-in graphical macOS session") @@ -55,6 +75,7 @@ check(stopped != nil && pixels(of: saver) == stopped, "native animation stays st window.close() check(!window.isVisible, "closing removes the desktop window") sharedSaverTests() +sharedCompositionTests() wallpaperAppTests() loginItemTests() exit(failures == 0 ? EXIT_SUCCESS : EXIT_FAILURE) diff --git a/build-wallpaper.sh b/build-wallpaper.sh index 0677096..c189c90 100755 --- a/build-wallpaper.sh +++ b/build-wallpaper.sh @@ -22,6 +22,9 @@ swiftc -O -module-name MatrixWallpaper \ "$SOURCE_DIR/MatrixRendererLimits.swift" \ "$SOURCE_DIR/NativeMatrixRenderer.swift" \ "$SOURCE_DIR/ScreenSyncCoordinator.swift" \ + "$SOURCE_DIR/SharedWallpaperFrame.swift" \ + "$SOURCE_DIR/WallpaperFrameReader.swift" \ + "$SOURCE_DIR/SharedWallpaperCompositor.swift" \ "$SOURCE_DIR/MatrixScreenSaverView.swift" \ "$WALLPAPER_DIR/DesktopWindow.swift" \ "$WALLPAPER_DIR/WallpaperPlaybackState.swift" \ diff --git a/build.sh b/build.sh index d7830b5..cf7cd37 100755 --- a/build.sh +++ b/build.sh @@ -39,6 +39,9 @@ swiftc \ "$SOURCE_DIR/MatrixRendererLimits.swift" \ "$SOURCE_DIR/NativeMatrixRenderer.swift" \ "$SOURCE_DIR/ScreenSyncCoordinator.swift" \ + "$SOURCE_DIR/SharedWallpaperFrame.swift" \ + "$SOURCE_DIR/WallpaperFrameReader.swift" \ + "$SOURCE_DIR/SharedWallpaperCompositor.swift" \ "$SOURCE_DIR/MatrixScreenSaverView.swift" cp "$INPUT_RESOURCES_DIR/Info.plist" "$CONTENTS_DIR/Info.plist" diff --git a/tests.sh b/tests.sh index d8e0152..a4a6463 100755 --- a/tests.sh +++ b/tests.sh @@ -15,12 +15,15 @@ swiftc \ "$SRC/NeoMessageScene.swift" \ "$SRC/MatrixRendererLimits.swift" \ "$SRC/ScreenSyncCoordinator.swift" \ + "$SRC/SharedWallpaperFrame.swift" \ + "$SRC/WallpaperFrameReader.swift" \ "$SRC/NativeMatrixRenderer.swift" \ "$ROOT/Sources/MatrixWallpaper/WallpaperPlaybackState.swift" \ "$TESTS/Xorshift64Tests.swift" \ "$TESTS/ScreenSyncCoordinatorTests.swift" \ "$TESTS/NativeMatrixRendererTests.swift" \ "$TESTS/WallpaperPlaybackStateTests.swift" \ + "$TESTS/SharedWallpaperFrameTests.swift" \ "$TESTS/main.swift" \ -o "$TEST_BIN" diff --git a/wallpaper-tests.sh b/wallpaper-tests.sh index cae237d..466d222 100755 --- a/wallpaper-tests.sh +++ b/wallpaper-tests.sh @@ -6,9 +6,15 @@ SOURCE_DIR="$ROOT_DIR/Sources/MatrixScreenSaver" WALLPAPER_DIR="$ROOT_DIR/Sources/MatrixWallpaper" TEST_DIR="$ROOT_DIR/Tests/MatrixWallpaperTests" TEST_BIN="$(mktemp "${TMPDIR:-/tmp}/matrix-wallpaper-tests.XXXXXX")" -trap 'rm -f "$TEST_BIN"' EXIT +HOST_DIR="$(mktemp -d "${TMPDIR:-/tmp}/matrix-consumer-tests.XXXXXX")" +trap 'rm -f "$TEST_BIN" "$HOST_DIR/ScreenSaverEngine"; rmdir "$HOST_DIR"' EXIT -swiftc -framework Foundation -framework AppKit -framework ScreenSaver -framework ServiceManagement \ +OPTIMIZATION="-Onone" +if [[ "${1:-}" == "--gpu-composition-benchmark" || "${1:-}" == "--composition-benchmark" ]]; then + OPTIMIZATION="-O" +fi + +swiftc "$OPTIMIZATION" -framework Foundation -framework AppKit -framework ScreenSaver -framework ServiceManagement \ "$SOURCE_DIR/TerminalSupport.swift" \ "$SOURCE_DIR/MatrixScreenSaverOptions.swift" \ "$SOURCE_DIR/Xorshift64.swift" \ @@ -16,15 +22,32 @@ swiftc -framework Foundation -framework AppKit -framework ScreenSaver -framework "$SOURCE_DIR/MatrixRendererLimits.swift" \ "$SOURCE_DIR/NativeMatrixRenderer.swift" \ "$SOURCE_DIR/ScreenSyncCoordinator.swift" \ + "$SOURCE_DIR/SharedWallpaperFrame.swift" \ + "$SOURCE_DIR/WallpaperFrameReader.swift" \ + "$SOURCE_DIR/SharedWallpaperCompositor.swift" \ "$SOURCE_DIR/MatrixScreenSaverView.swift" \ "$WALLPAPER_DIR/DesktopWindow.swift" \ "$WALLPAPER_DIR/WallpaperPlaybackState.swift" \ "$WALLPAPER_DIR/LoginItemController.swift" \ "$WALLPAPER_DIR/WallpaperApp.swift" \ "$TEST_DIR/SharedSaverTests.swift" \ + "$TEST_DIR/ConsumerHost.swift" \ + "$TEST_DIR/SharedCompositionTests.swift" \ + "$TEST_DIR/GPUCompositionTests.swift" \ "$TEST_DIR/WallpaperAppTests.swift" \ "$TEST_DIR/LoginItemTests.swift" \ "$TEST_DIR/main.swift" \ -o "$TEST_BIN" +if [[ "${1:-}" == "--composition-benchmark" || "${1:-}" == "--composition-tests" || "${1:-}" == "--gpu-composition-tests" || "${1:-}" == "--gpu-composition-benchmark" ]]; then + "$TEST_BIN" "$1" + exit +fi +if [[ "${1:-}" == "--consumer-host" ]]; then + cp "$TEST_BIN" "$HOST_DIR/ScreenSaverEngine" + "$HOST_DIR/ScreenSaverEngine" --consumer-host + exit +fi "$TEST_BIN" +cp "$TEST_BIN" "$HOST_DIR/ScreenSaverEngine" +"$HOST_DIR/ScreenSaverEngine" --consumer-host From 1bea084a24f079140204dda8fd008cf6117d6386 Mon Sep 17 00:00:00 2001 From: Patrick Schaper Date: Thu, 22 Oct 2026 23:12:07 +0200 Subject: [PATCH 7/8] feat: add screen saver sync toggle - show a persistent default-on sync option when the saver is installed - stop and resume frame sharing without overriding playback state - cover menu discovery, persistence, and sharing lifecycle - document the option and implementation plan --- README.md | 21 ++- Sources/MatrixWallpaper/WallpaperApp.swift | 58 ++++++- .../MatrixWallpaperTests/LoginItemTests.swift | 5 +- .../WallpaperAppTests.swift | 103 +++++++++++- ...2249-feat-screen-saver-sync-toggle-plan.md | 147 ++++++++++++++++++ docs/wallpaper-icon.jpg | Bin 0 -> 1711 bytes docs/wallpaper-menubar.jpg | Bin 0 -> 18782 bytes 7 files changed, 322 insertions(+), 12 deletions(-) create mode 100644 docs/plans/2026-10-22-2249-feat-screen-saver-sync-toggle-plan.md create mode 100644 docs/wallpaper-icon.jpg create mode 100644 docs/wallpaper-menubar.jpg diff --git a/README.md b/README.md index f304e3a..32bcdf0 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,13 @@ -# macOS Matrix Screen Saver and Wallpaper +# macOS Matrix Screen Saver and animated Wallpaper ![macOS Matrix Screen Saver demo](docs/matrix-screensaver.gif) This is a macOS screen saver based on the iconic rain of characters and symbols known from the movie The Matrix. -It also comes with an app replacing your wallpaper with the screen saver animation if you wish so. +## Animated Wallpaper +The screen saver also comes with an app replacing your wallpaper with the animation so you can enjoy being in the matrix all the time 🙂. + +![wallpaper-icon.jpg](docs/wallpaper-icon.jpg) ## Quick install @@ -16,8 +19,6 @@ brew install --cask patrickschaper/tap/matrix-screen-saver - Wallpaper: open **MatrixWallpaper** in Applications. - Saver options: **System Settings → Wallpaper → Screen Saver → MatrixScreenSaver → Options…**. -While MatrixWallpaper is running, the screen saver continues the same animation on each display, and the wallpaper carries on when it ends. Without the app, the saver runs independently. Previews remain independent. - ## Buy me a coffee There is no spoon. There is coffee. Donations help fund a developer license for signing the screen saver. @@ -25,7 +26,7 @@ There is no spoon. There is coffee. Donations help fund a developer license for Buy Me a Coffee
Buy Me a Coffee QR code -## Options +## Animation options The saver exposes a native **Options…** sheet. The values are stored with `ScreenSaverDefaults`. @@ -45,6 +46,10 @@ The saver exposes a native **Options…** sheet. The values are stored with `Scr | Scan lines intensity | Opacity of the CRT scan line overlay (0 = off, 100 = fully opaque). | 25 | | Scan lines vertical | Orientation of the scan line overlay (vertical or horizontal). | On (vertical) | +### Wallpaper menubar menu + +![menubar.jpg](docs/wallpaper-menubar.jpg) + ## Development ### Current state @@ -154,6 +159,12 @@ open ~/Applications/MatrixWallpaper.app The installer builds and verifies the app, gracefully quits running copies before replacement, and retains preferences. It does not launch the app or enable login startup. +When MatrixScreenSaver is installed in `~/Library/Screen Savers` or `/Library/Screen Savers`, +the wallpaper menu shows **Sync with Screen Saver**. It is checked by default: the saver +shares the wallpaper's animation. Uncheck it to let the saver animate independently. +The choice survives app restarts and saver reinstallation; opening the menu refreshes +installation detection. This does not change visual options or synchronization between monitors. + ### Origin This project started as an attempt to wrap `cxxmatrix` inside a macOS screen saver. diff --git a/Sources/MatrixWallpaper/WallpaperApp.swift b/Sources/MatrixWallpaper/WallpaperApp.swift index 35b4cfc..d4e084a 100644 --- a/Sources/MatrixWallpaper/WallpaperApp.swift +++ b/Sources/MatrixWallpaper/WallpaperApp.swift @@ -2,19 +2,36 @@ import AppKit import ScreenSaver /// Menu bar host for native Matrix animation behind desktop content. -final class WallpaperApp: NSObject, NSApplicationDelegate { +final class WallpaperApp: NSObject, NSApplicationDelegate, NSMenuDelegate { /// Retains the status item for the lifetime of the application. private var statusItem: NSStatusItem? /// Owns login controls independently of wallpaper playback and preferences. private let loginItems: LoginItemController + /// Wallpaper-only preferences, separate from shared rendering options. + private let defaults: UserDefaults + /// Installed saver locations, replaceable with temporary directories in tests. + private let screenSaverDirectories: [URL] + /// Persists user intent even while no saver is installed. + private static let syncPreferenceKey = "syncWithScreenSaver" + /// Reflects whether the wallpaper may serve frames to the saver. + private let syncItem = NSMenuItem(title: "Sync with Screen Saver", action: #selector(toggleScreenSaverSync(_:)), keyEquivalent: "") + /// Creates the host with system login operations, or an isolated test controller. /// - /// - Parameter loginItems: Menu controller backed by macOS registration. - init(loginItems: LoginItemController = LoginItemController()) { + /// - Parameters: + /// - loginItems: Menu controller backed by macOS registration. + /// - defaults: Store for wallpaper-only preferences. + /// - screenSaverDirectories: User and local installed-saver directories. + init(loginItems: LoginItemController = LoginItemController(), defaults: UserDefaults = .standard, + screenSaverDirectories: [URL] = FileManager.default.urls(for: .libraryDirectory, in: [.userDomainMask, .localDomainMask]) + .map { $0.appendingPathComponent("Screen Savers") }) { self.loginItems = loginItems + self.defaults = defaults + self.screenSaverDirectories = screenSaverDirectories super.init() + defaults.register(defaults: [Self.syncPreferenceKey: true]) } /// Owns the native desktop surfaces until playback ends. @@ -71,12 +88,14 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { item.button?.setAccessibilityLabel("Matrix Wallpaper") let menu = NSMenu() menu.autoenablesItems = false - menu.delegate = loginItems + menu.delegate = self playbackItem.target = self menu.addItem(playbackItem) let options = NSMenuItem(title: "Options…", action: #selector(showOptions(_:)), keyEquivalent: "") options.target = self menu.addItem(options) + syncItem.target = self + menu.addItem(syncItem) menu.addItem(.separator()) menu.addItem(loginItems.item) menu.addItem(.separator()) @@ -85,6 +104,7 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { menu.addItem(quit) item.menu = menu statusItem = item + menuWillOpen(menu) observeSystemState() frameLeaseTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [weak self] _ in @@ -113,6 +133,33 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { reconcilePlayback() } + /// Refreshes both optional controls when installations or system settings change. + func menuWillOpen(_ menu: NSMenu) { + loginItems.menuWillOpen(menu) + syncItem.state = defaults.bool(forKey: Self.syncPreferenceKey) ? .on : .off + syncItem.isHidden = !screenSaverDirectories.contains { directory in + let bundles = (try? FileManager.default.contentsOfDirectory(at: directory, includingPropertiesForKeys: nil)) ?? [] + return bundles.contains { url in + guard url.pathExtension.lowercased() == "saver", + let data = try? Data(contentsOf: url.appendingPathComponent("Contents/Info.plist")), + let metadata = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String: Any] + else { return false } + return metadata["CFBundleIdentifier"] as? String == "dev.patsch.MatrixScreenSaver" + } + } + } + + /// Stores the choice without changing the wallpaper's requested playback state. + @objc private func toggleScreenSaverSync(_ sender: Any?) { + let enabled = !defaults.bool(forKey: Self.syncPreferenceKey) + defaults.set(enabled, forKey: Self.syncPreferenceKey) + syncItem.state = enabled ? .on : .off + if !enabled { + endFrameSharing() + reconcilePlayback() + } + } + /// Starts or stops at the user's request without overriding system suspension. @objc private func togglePlayback(_ sender: Any?) { playback.isRequested.toggle() @@ -273,7 +320,8 @@ final class WallpaperApp: NSObject, NSApplicationDelegate { /// /// - Parameter displayID: Display requested through the sandbox-safe discovery notification. private func shareFrames(for displayID: UInt32) { - guard playback.isRequested, currentDisplayLayout.contains(where: { $0.id == displayID }) else { return } + guard defaults.bool(forKey: Self.syncPreferenceKey), playback.isRequested, + currentDisplayLayout.contains(where: { $0.id == displayID }) else { return } let starting = !playback.isServingScreenSaver if starting { let options = MatrixScreenSaverView.loadSaverOptions() diff --git a/Tests/MatrixWallpaperTests/LoginItemTests.swift b/Tests/MatrixWallpaperTests/LoginItemTests.swift index 187cab5..de28e1f 100644 --- a/Tests/MatrixWallpaperTests/LoginItemTests.swift +++ b/Tests/MatrixWallpaperTests/LoginItemTests.swift @@ -80,8 +80,11 @@ func loginItemTests() { let host = WallpaperApp(loginItems: controller) host.applicationDidFinishLaunching(Notification(name: NSApplication.didFinishLaunchingNotification)) let hostMenu = controller.item.menu! - check(hostMenu.delegate === controller && hostMenu.items.filter { $0.target === controller }.count == 1, + status = .notRegistered + hostMenu.delegate?.menuWillOpen?(hostMenu) + check(hostMenu.items.filter { $0.target === controller }.count == 1 && controller.item.state == .off, "host menu contains exactly one login control and refreshes system status") + status = .enabled let windows = Set(NSApp.windows.filter { $0 is DesktopWindow && $0.isVisible }.map(ObjectIdentifier.init)) hostMenu.delegate?.menuWillOpen?(hostMenu) hostMenu.performActionForItem(at: hostMenu.index(of: controller.item)) diff --git a/Tests/MatrixWallpaperTests/WallpaperAppTests.swift b/Tests/MatrixWallpaperTests/WallpaperAppTests.swift index 19a0e81..231ce20 100644 --- a/Tests/MatrixWallpaperTests/WallpaperAppTests.swift +++ b/Tests/MatrixWallpaperTests/WallpaperAppTests.swift @@ -3,7 +3,11 @@ import AppKit /// Exercises the real host's menu actions, notifications, rebuilds, and cleanup. func wallpaperAppTests() { wallpaperIconTests() - let host = WallpaperApp() + wallpaperSyncMenuTests() + let suite = "MatrixWallpaperPlaybackTests.\(UUID().uuidString)" + let defaults = UserDefaults(suiteName: suite)! + defer { defaults.removePersistentDomain(forName: suite) } + let host = WallpaperApp(defaults: defaults) host.applicationDidFinishLaunching(Notification(name: NSApplication.didFinishLaunchingNotification)) defer { host.applicationWillTerminate(Notification(name: NSApplication.willTerminateNotification)) } check(desktopWindowCount() == NSScreen.screens.count, "app creates one desktop window per display") @@ -50,6 +54,34 @@ func wallpaperAppTests() { let next = reader?.frame(displayID: displayID, pointSize: source.bounds.size) check(next != nil && next!.sequence > (first?.sequence ?? 0), "hidden wallpaper publishes advancing frames for the saver") + let sharedURL = source.shareWallpaperFrames()! + NSApp.sendAction(NSSelectorFromString("toggleScreenSaverSync:"), to: host, from: nil) + check(!FileManager.default.fileExists(atPath: sharedURL.path) && !source.isAnimating, + "disabling sync removes the active offer and stops hidden wallpaper work") + for _ in 0..<3 { + _ = reader?.frame(displayID: displayID, pointSize: source.bounds.size) + wait(0.3) + check(!FileManager.default.fileExists(atPath: sharedURL.path) && !source.isAnimating, + "disabled sync ignores repeated consumer requests") + } + NSApp.sendAction(NSSelectorFromString("toggleScreenSaverSync:"), to: host, from: nil) + check(eventually(5) { + _ = reader?.frame(displayID: displayID, pointSize: source.bounds.size) + return source.isAnimating && stored("sharedFrameBuffer", in: source, as: SharedWallpaperFrame?.self).flatMap { $0 } != nil + }, "re-enabling sync reconnects through normal frame discovery") + check(Set(NSApp.windows.filter { $0 is DesktopWindow }.map(ObjectIdentifier.init)).isSuperset(of: originalIDs), + "sync reconnect retains the existing wallpaper views") + workspace.post(name: NSWorkspace.willSleepNotification, object: nil) + NSApp.sendAction(NSSelectorFromString("toggleScreenSaverSync:"), to: host, from: nil) + NSApp.sendAction(NSSelectorFromString("toggleScreenSaverSync:"), to: host, from: nil) + _ = reader?.frame(displayID: displayID, pointSize: source.bounds.size) + wait(0.6) + check(!source.isAnimating && desktopWindowCount() == 0, "enabling sync cannot override system sleep") + workspace.post(name: NSWorkspace.didWakeNotification, object: nil) + check(eventually(5) { + _ = reader?.frame(displayID: displayID, pointSize: source.bounds.size) + return source.isAnimating && stored("sharedFrameBuffer", in: source, as: SharedWallpaperFrame?.self).flatMap { $0 } != nil + }, "wake resumes frame sharing when sync remains enabled") if let other = originalWindows.first(where: { ($0.screen?.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? UInt32) != displayID }), let otherSource = other.contentView as? MatrixScreenSaverView, @@ -86,6 +118,8 @@ func wallpaperAppTests() { workspace.post(name: NSWorkspace.willSleepNotification, object: nil) check(NSApp.sendAction(NSSelectorFromString("togglePlayback:"), to: host, from: nil), "Stop menu action is connected") + NSApp.sendAction(NSSelectorFromString("toggleScreenSaverSync:"), to: host, from: nil) + NSApp.sendAction(NSSelectorFromString("toggleScreenSaverSync:"), to: host, from: nil) workspace.post(name: NSWorkspace.didWakeNotification, object: nil) workspace.post(name: NSWorkspace.screensDidWakeNotification, object: nil) check(desktopWindowCount() == 0, "host preserves Stop after suspension clears") @@ -108,6 +142,73 @@ func wallpaperAppTests() { check(desktopWindowCount() == 0, "Quit unregisters system observers") } +/// Exercises installation discovery and persistent menu state without touching real installations. +private func wallpaperSyncMenuTests() { + let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString) + let user = root.appendingPathComponent("user") + let local = root.appendingPathComponent("local") + let suite = "MatrixWallpaperTests.\(UUID().uuidString)" + let defaults = UserDefaults(suiteName: suite)! + defer { + defaults.removePersistentDomain(forName: suite) + try? FileManager.default.removeItem(at: root) + } + var loginStatus = LoginItemController.Status.notRegistered + let login = LoginItemController(readStatus: { loginStatus }) + let host = WallpaperApp(loginItems: login, defaults: defaults, screenSaverDirectories: [user, local]) + NSApp.sendAction(NSSelectorFromString("togglePlayback:"), to: host, from: nil) + host.applicationDidFinishLaunching(Notification(name: NSApplication.didFinishLaunchingNotification)) + defer { host.applicationWillTerminate(Notification(name: NSApplication.willTerminateNotification)) } + guard let status: NSStatusItem = stored("statusItem", in: host), let menu = status.menu, + let sync = menu.items.first(where: { $0.title == "Sync with Screen Saver" }) else { + check(false, "host installs the screen saver sync menu control") + return + } + func refresh() { menu.delegate?.menuWillOpen?(menu) } + func install(_ directory: URL, name: String, identifier: String) -> URL { + let bundle = directory.appendingPathComponent(name) + let contents = bundle.appendingPathComponent("Contents") + try! FileManager.default.createDirectory(at: contents, withIntermediateDirectories: true) + let data = try! PropertyListSerialization.data(fromPropertyList: ["CFBundleIdentifier": identifier], + format: .xml, options: 0) + try! data.write(to: contents.appendingPathComponent("Info.plist")) + return bundle + } + refresh() + check(sync.isHidden && sync.state == .on, "sync defaults on but is hidden without an installed saver") + let unrelated = install(user, name: "Other.saver", identifier: "test.other") + refresh() + check(sync.isHidden, "unrelated saver bundles do not expose sync") + let installed = install(user, name: "Renamed.saver", identifier: "dev.patsch.MatrixScreenSaver") + refresh() + check(!sync.isHidden && sync.state == .on, "renamed user installation exposes default-enabled sync") + menu.performActionForItem(at: menu.index(of: sync)) + check(sync.state == .off, "sync menu action unchecks the persisted preference") + try! FileManager.default.removeItem(at: installed) + refresh() + check(sync.isHidden && sync.state == .off, "removal hides sync without resetting its choice") + let localInstall = install(local, name: "Matrix.saver", identifier: "dev.patsch.MatrixScreenSaver") + refresh() + check(!sync.isHidden && sync.state == .off, "local installation restores visibility and preserves sync off") + try! FileManager.default.removeItem(at: localInstall) + try! Data("invalid plist".utf8).write(to: unrelated.appendingPathComponent("Contents/Info.plist")) + refresh() + check(sync.isHidden, "malformed bundle metadata is ignored") + let target = install(root, name: "Target.saver", identifier: "dev.patsch.MatrixScreenSaver") + try! FileManager.default.createSymbolicLink(at: local.appendingPathComponent("Linked.saver"), withDestinationURL: target) + loginStatus = .enabled + refresh() + check(!sync.isHidden && login.item.state == .on, "menu refresh follows saver symlinks and refreshes Launch at Login") + host.applicationWillTerminate(Notification(name: NSApplication.willTerminateNotification)) + let relaunched = WallpaperApp(defaults: UserDefaults(suiteName: suite)!, screenSaverDirectories: [user, local]) + NSApp.sendAction(NSSelectorFromString("togglePlayback:"), to: relaunched, from: nil) + relaunched.applicationDidFinishLaunching(Notification(name: NSApplication.didFinishLaunchingNotification)) + defer { relaunched.applicationWillTerminate(Notification(name: NSApplication.willTerminateNotification)) } + let relaunchedStatus: NSStatusItem? = stored("statusItem", in: relaunched) + check(relaunchedStatus?.menu?.items.first(where: { $0.title == sync.title })?.state == .off, + "explicit sync off survives host relaunch") +} + /// Checks the shipped artwork rather than duplicating the generator's drawing logic. private func wallpaperIconTests() { let resources = URL(fileURLWithPath: #filePath).deletingLastPathComponent() diff --git a/docs/plans/2026-10-22-2249-feat-screen-saver-sync-toggle-plan.md b/docs/plans/2026-10-22-2249-feat-screen-saver-sync-toggle-plan.md new file mode 100644 index 0000000..1c8595a --- /dev/null +++ b/docs/plans/2026-10-22-2249-feat-screen-saver-sync-toggle-plan.md @@ -0,0 +1,147 @@ +--- +title: Screen Saver Sync Toggle - Plan +type: feat +date: 2026-10-22 +artifact_contract: ce-unified-plan/v1 +product_contract_source: ce-plan-bootstrap +execution: code +--- + +# Screen Saver Sync Toggle - Plan + +## Goal Capsule + +- **Objective:** Users can choose whether the Matrix screen saver follows their wallpaper animation or plays independently. +- **Means:** A persistent wallpaper menu toggle gates the existing frame producer (KTD1). +- **Authority:** Product requirements govern behavior; technical decisions govern implementation within those requirements. +- **Execution:** Two small, sequential units; implement and verify locally. Branch creation, commits, pushes, and PRs require explicit user instruction. +- **Stop condition:** Ask before changing the confirmed behavior or introducing a new cross-process protocol. The implementer completes local verification; the user decides when to ship. + +## Product Contract + +### Summary + +Add “Sync with Screen Saver” to the wallpaper menu when the Matrix screen saver is installed. Remember the choice and default to enabled. + +### Problem Frame + +The wallpaper currently serves its animation to the screen saver automatically. Users have no menu control for choosing independent screen-saver playback. + +### Requirements + +**Menu and preference** + +- R1. Show a native checkmarked “Sync with Screen Saver” item only when the Matrix screen saver is installed; refresh availability whenever the menu opens. +- R2. Treat an absent preference as enabled, including first installation and upgrades without this preference; preserve explicit choices across app launches and saver removal/reinstallation. + +**Playback** + +- R3. Checked permits the existing wallpaper-to-screen-saver frame sharing; unchecked makes the saver use its own renderer. +- R4. Disabling ends active sharing and blocks subsequent requests; enabling allows subsequent requests to reconnect without restarting wallpaper animation. +- R5. The toggle preserves wallpaper Start/Stop, sleep/session suspension, Launch at Login, rendering options, and existing within-host multi-monitor coordination. + +### Acceptance Examples + +- AE1. Covers R1, R2: With no saved choice and an installed saver, opening the menu shows the item checked. Without an installed saver, the item is hidden. +- AE2. Covers R2, R3: Uncheck the item and relaunch the app; it remains unchecked and a newly started saver renders independently. +- AE3. Covers R4, R5: Disable during frame sharing; the consumer falls back, hidden wallpaper work stops when suspension requires it, and re-enabling permits discovery to resume without overriding Stop or sleep. +- AE4. Covers R1, R2: Remove and reinstall the saver between menu openings; visibility changes and the previous preference survives. + +### Scope Boundaries + +This controls wallpaper-to-saver sharing, not synchronization between monitors or shared visual options. No new preference in the saver Options sheet, installer changes, dependencies, or background service. Menu-open detection is sufficient; continuous filesystem watching adds no required behavior. + +## Planning Contract + +### Key Technical Decisions + +- KTD1. **Gate the producer in `WallpaperApp`.** Persist a wallpaper-owned Boolean in its `UserDefaults` domain with a registered true default. Check it before `shareFrames(for:)` performs any work. On disable, reuse `endFrameSharing()` followed by `reconcilePlayback()`. The consumer already falls back when the producer disappears and retries discovery, so no shared preference reads or notification-format changes are needed (R2–R5). +- KTD2. **Detect installed bundles without loading their executable.** Inspect direct `.saver` children of the user and local Library `Screen Savers` directories, matching `CFBundleIdentifier` against `dev.patsch.MatrixScreenSaver`. Resolve standard Library locations through Foundation; renamed bundles and symlinked installations should work. Missing, unreadable, malformed, or unrelated bundles count as absent. Build output and Trash are not installed locations. This check controls menu visibility, not whether an already running consumer may request frames (R1). +- KTD3. **Let the app coordinate menu refresh.** Make `WallpaperApp` the menu delegate and forward menu opening to the existing `LoginItemController.menuWillOpen`. Refresh the sync item's visibility and checkmark in that same callback. Keep the small availability helper in the existing app file; inject defaults and search locations for isolated tests, following the constructor-injection pattern already used for login controls (R1, R2, R5). + +### High-Level Technical Design + +```mermaid +flowchart TD + M[Menu opens] --> V[Refresh installed-saver visibility and checkmark] + M --> L[Refresh existing login item] + T[User toggles sync] --> P[Persist preference] + P --> E{Enabled?} + E -->|No| X[End frame sharing and reconcile playback] + E -->|Yes| W[Wait for normal discovery requests] + Q[Saver requests frames] --> G{Preference enabled?} + G -->|No| I[Ignore request; saver uses native fallback] + G -->|Yes| S[Existing sharing and suspension checks] +``` + +### Evidence and Constraints + +- `Sources/MatrixWallpaper/WallpaperApp.swift`: menu delegate currently belongs to `loginItems`; `shareFrames(for:)`, `endFrameSharing()`, and `reconcilePlayback()` own producer lifecycle. +- `Sources/MatrixScreenSaver/WallpaperFrameReader.swift`: consumers retry discovery every 0.5 seconds. +- `Sources/MatrixScreenSaver/SharedWallpaperFrame.swift`: producer teardown unlinks its offer; snapshots reject unavailable/stale output. +- `Sources/MatrixScreenSaver/MatrixScreenSaverView.swift`: lost frames switch to native playback; later shared frames stop that native simulation. +- `Tests/MatrixWallpaperTests/ConsumerHost.swift`: already covers actual consumer fallback and reconnection. Keep this regression coverage rather than duplicating its implementation. +- `Resources/Info.plist`: authoritative saver bundle identifier. +- AppKit interaction requires a logged-in graphical macOS session. Actual System Settings hosting remains a manual verification item; planning has not run it. + +## Implementation Units + +### U1. Add the persistent conditional menu control + +**Goal:** Expose the confirmed preference without disrupting existing menu controls. + +**Requirements:** R1, R2, R5. **Dependencies:** None. + +**Files:** `Sources/MatrixWallpaper/WallpaperApp.swift`; `Tests/MatrixWallpaperTests/WallpaperAppTests.swift`; `Tests/MatrixWallpaperTests/LoginItemTests.swift` if shared test support needs adjustment. + +**Approach:** +1. Add the preference, menu item, and bounded installed-bundle detection per KTD2–KTD3. +2. Persist toggle actions and refresh native menu state. Keep preference storage separate from `MatrixScreenSaverOptions`. +3. Use temporary bundle fixtures and an isolated defaults suite in tests; do not alter the user's installed saver or login registration. + +**Patterns:** Existing `LoginItemController` dependency injection and native menu-action tests. + +**Test scenarios:** +1. Covers AE1: No stored value produces a checked item; an explicit false value survives constructing another host with the same test store. +2. Covers AE4: User/local installation fixtures show the item; removing both hides it; reinstalling retains the saved false value. +3. Renamed and symlinked matching bundles are found; wrong identifiers, malformed metadata, and missing directories are ignored. +4. Opening the real app menu refreshes both sync availability and changed login-item status. + +**Verification:** Menu actions persist the choice, menu-open callbacks refresh both controls, and tests use no real preference or installation changes. + +### U2. Apply the preference to frame sharing and verify the lifecycle + +**Goal:** Make the choice govern real animation sharing. + +**Requirements:** R3–R5. **Dependencies:** U1. + +**Files:** `Sources/MatrixWallpaper/WallpaperApp.swift`; `Tests/MatrixWallpaperTests/WallpaperAppTests.swift`; existing regression coverage in `Tests/MatrixWallpaperTests/ConsumerHost.swift`; `README.md`. + +**Approach:** +1. Apply KTD1 at the shared request entry point and toggle action, retaining existing display validation and suspension checks. +2. Extend host tests through real menu actions and frame discovery, using the existing bounded run-loop helpers. +3. Document the default, persistence, conditional visibility, and independent-playback behavior in the README. + +**Test scenarios:** +1. Covers AE2: With sync off, repeated requests produce no frames and do not wake hidden wallpaper rendering. +2. Covers AE3: Disable an active producer, confirm its offer disappears and no subsequent request recreates it; the existing consumer-host regression proves native fallback. +3. Re-enable and request again; fresh frames return from the same wallpaper views without an animation restart. +4. Toggle while stopped or sleeping; wallpaper remains stopped or suspended. Wake respects the saved preference. +5. Default-enabled behavior still passes existing multi-display sharing, lease expiry, and saver-exit tests. + +**Verification:** Producer tests and consumer-host regressions pass together; the real screen saver visibly switches between shared and independent playback. + +## Verification Contract + +- `./wallpaper-tests.sh`: native menu, preference, producer lifecycle, and consumer-host regressions. +- `./tests.sh`: renderer, shared-frame, and coordination regression suite. +- `./build-wallpaper.sh` and `./build.sh`: both native bundles compile successfully. +- Manual macOS check: menu presence with user/local installation; remembered toggle after relaunch; real saver with sync on and off; normal wallpaper resume after saver exit. Use existing installations where possible and obtain permission before changing the user's installed bundles. +- No CI/release workflow changes or triggers are required. New source files are not planned; if implementation needs one, add it to the applicable explicit compiler source lists. + +## Definition of Done + +- U1 proves R1–R2 through isolated menu/persistence tests; U2 proves R3–R5 through sharing tests and existing consumer regressions. +- Verification gates pass; any unavailable graphical or real-host check is explicitly reported. +- README explains the user-facing option, and new internal declarations follow Swift documentation conventions. +- Abandoned experiments and unused test hooks are removed; no unrelated renderer or installer refactoring remains. diff --git a/docs/wallpaper-icon.jpg b/docs/wallpaper-icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb105217e30a0721c64a4d91c583a6879c578169 GIT binary patch literal 1711 zcmbW0dpJ~S9LL`?Gt3xS#<+x*a?dT75GkoB%5~g%JUb+}VqHSQP`NY`atSHZG2{3CJ8+051 zTU($30Kfr3NF1OM2O$@LWPt$R1KgMj@>37WkctBuKaAee} z=$P2kap%sbq^6}`pkB_+%P+W6SX4~ESyoVxHx{*A~*kvR2&kdj*F&#R|!F#!E-- zbt;Y=PdrjomHa3QmcFAaxdjI4zAv0+f`>-D8PMOlfPyr9lA;OOXdUzHO~Tn1E=o>XMd7U zNMBx*oL-R69}5giFP+saXzETb-Z46R>bXwD?x@ZmKb2Qr+1_n8_(J%iUElR-`u&Uc z3avwC-xp1ir!*qnOyolRl#}

x|Jh;ayuhi$6B7n%;mUb z$JCf|yloO$H~ix6#aHf<%uP)zbra^OW@fxg$|1*MS6p2(rhf>|pPDUNcwmZe36Sl6 zZ%{jKxz}qO!z_;_Q`2MvgI3MV?4cvfUzjcySiGs5#&lCz;~sB}wyl&KCyQ1|B5|_H zONT#r--YFR~Na7lLlN^ZHLr?%()5XB-3&0q2CTu0Wy_U(>rZ}$_<^aCC} z(z`;)&PzKvI%eJ44yQX@v=>JQ25glqReYC9g4(B&-Zm^bh2G3dd?IzM@UCa=z&I(w z9>we=_;^)2S=FUn=(h1xXBe5o16+nWJ&A~qt1?ef9frY7@n3C|cJyR-+d3HZ8h)X4 oW!6#nwSbCx9E$ukynxl?jbzfDbC;4tY2|dPpoF6(pun&H1_IKr00000 literal 0 HcmV?d00001 diff --git a/docs/wallpaper-menubar.jpg b/docs/wallpaper-menubar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df079e179bcac2fd6fcbd50c7c2c39828f86b922 GIT binary patch literal 18782 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 literal 0 HcmV?d00001 From 2361c9b1eae8d5665452dacd4f008123fcef6e9c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 08:41:44 +0000 Subject: [PATCH 8/8] chore(release): 0.3.0 - bump VERSION to 0.3.0 - update CHANGELOG.md --- CHANGELOG.md | 15 +++++++++++++++ VERSION | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d35be87..f4fe104 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.3.0] - 2026-10-23 + +### Features + +- add Matrix desktop wallpaper with Homebrew installation (#102) +- publish Homebrew tap updates automatically (#100) +- distribute MatrixScreenSaver through Homebrew (#99) + +### Bug Fixes + +- avoid pure white rain highlights (#98) +- publish release PR required checks (#95) +- dispatch release checks on release branch (#93) + ## [0.2.0] - 2026-06-10 ### Features diff --git a/VERSION b/VERSION index 0ea3a94..0d91a54 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.0 +0.3.0