From c604f81002965ab02cc5a80ac24e34ee1530f5d9 Mon Sep 17 00:00:00 2001 From: Bowen Xue Date: Mon, 9 Nov 2026 13:55:00 +0000 Subject: [PATCH 01/44] Show GPU memory and temperature in a top-bar system status panel, and keep the preview updating... Show GPU memory and temperature in a top-bar system status panel, and keep the preview updating through the second pass Adds an optional system status setting: the top bar shows graphics memory and temperature, and a panel lists the graphics card, memory, utilization, temperature and free disk space, with a two-step stop control. The sampling preview keeps updating during the second pass of two-pass generation. --- __init__.py | 2 + freevideo_engine/comfy_front.py | 4 +- freevideo_engine/comfy_monitor.py | 171 ++++++++++++++++++++++++++++++ freevideo_engine/refine.py | 5 + web/health.js | 2 +- web/monitor_panel.css | 18 ++++ web/monitor_panel.js | 109 +++++++++++++++++++ web/setup.js | 12 ++- web/studio.css | 5 + web/studio.js | 4 +- web/studio_header_fit.js | 29 +++-- 11 files changed, 349 insertions(+), 12 deletions(-) create mode 100644 freevideo_engine/comfy_monitor.py create mode 100644 web/monitor_panel.css create mode 100644 web/monitor_panel.js diff --git a/__init__.py b/__init__.py index 50ac057a..72647257 100644 --- a/__init__.py +++ b/__init__.py @@ -53,6 +53,8 @@ async def comfy_entrypoint(): editor_export_routes() from .freevideo_engine.comfy_capabilities import register as capabilities_routes capabilities_routes() + from .freevideo_engine.comfy_monitor import register as monitor_routes + monitor_routes() from .freevideo_engine.subtitle_ears import register as subtitle_ears_routes subtitle_ears_routes() from .freevideo_engine.editor_music import register as editor_music_routes diff --git a/freevideo_engine/comfy_front.py b/freevideo_engine/comfy_front.py index 590c66b1..f042659f 100644 --- a/freevideo_engine/comfy_front.py +++ b/freevideo_engine/comfy_front.py @@ -97,6 +97,8 @@ def __init__(self, server, scheduler, workers, *, envelope=None, validate=None, self.dispatch_lock = asyncio.Lock() self.loop = getattr(server, 'loop', None) self.closed = False + # Set by the top-bar stop: pending requests stay queued and nothing new is sent to a worker. + self.paused = False self.background = set() # Devices whose executor exited. Their work moves to the others until the control process restarts. self.unavailable = set() @@ -382,7 +384,7 @@ async def pump(self): self._reap_exited() auxiliary_busy = self.auxiliary_busy() with self.lock: - assignments = self.scheduler.dispatch() if not self.closed and not auxiliary_busy else [] + assignments = self.scheduler.dispatch() if not self.closed and not self.paused and not auxiliary_busy else [] workers = {worker.device.uuid: worker for worker in self.workers()} selected, moved = [], False for task, device in assignments: diff --git a/freevideo_engine/comfy_monitor.py b/freevideo_engine/comfy_monitor.py new file mode 100644 index 00000000..5056b1d5 --- /dev/null +++ b/freevideo_engine/comfy_monitor.py @@ -0,0 +1,171 @@ +"""Top-bar system status: GPU memory, load and temperature, free disk, and an immediate stop. + +Stopping ends what is generating and pauses the waiting requests; it deletes none of them. +Readings that the driver cannot give are left out of the answer rather than reported as unknown. +""" +import ctypes +import logging +import os +import threading +import time + +from .monitoring import Memory, Utilization, nvml_device + + +class Reader: + """One open NVML handle, read on demand; a machine without NVML answers with no GPU rows.""" + def __init__(self, open_device=nvml_device): + self.open_device, self.lock, self.state, self.failed = open_device, threading.Lock(), None, False + + def _open(self): + if self.state is None and not self.failed: + try: + lib, handle, _ = self.open_device(0) + name = ctypes.create_string_buffer(96) + label = name.value.decode('utf-8', 'replace') if lib.nvmlDeviceGetName(handle, name, 96) == 0 else '' + self.state = (lib, handle, label) + except (OSError, RuntimeError, ValueError, AttributeError): + self.failed = True + return self.state + + def read(self): + with self.lock: + state = self._open() + if state is None: + return {} + lib, handle, label = state + result = {} + if label: + result['name'] = label + memory = Memory() + if lib.nvmlDeviceGetMemoryInfo(handle, ctypes.byref(memory)) == 0 and memory.total and memory.used <= memory.total: + result['memory_used'], result['memory_total'] = int(memory.used), int(memory.total) + load = Utilization() + if lib.nvmlDeviceGetUtilizationRates(handle, ctypes.byref(load)) == 0 and load.gpu <= 100: + result['utilization'] = int(load.gpu) + degrees = ctypes.c_uint() + if lib.nvmlDeviceGetTemperature(handle, 0, ctypes.byref(degrees)) == 0 and 0 < degrees.value < 150: + result['temperature'] = int(degrees.value) + return result + + +class Gate: + """Holds the waiting requests back while paused; the running one is not touched.""" + def __init__(self): + self.paused = False + self.changed = threading.Event() + + def pause(self): + self.paused = True + + def resume(self): + self.paused = False + self.changed.set() + self.changed.clear() + + def hold(self, timeout): + """True when a paused queue spent the wait, so the caller reports nothing to run.""" + if not self.paused: + return False + self.changed.wait(1.0 if timeout is None else min(timeout, 1.0)) + return True + + +def install_gate(queue, gate): + """Make a Comfy PromptQueue take no new request while the gate is paused.""" + if getattr(queue, '_freevideo_gate', None) is not None: + return queue._freevideo_gate + original = queue.get + + def get(timeout=None): + deadline = None if timeout is None else time.monotonic() + timeout + while gate.hold(timeout): + if deadline is not None and time.monotonic() >= deadline: + return None + return original(timeout) + + queue.get = get + queue._freevideo_gate = gate + return gate + + +def disk_free(path): + from .disk_space import free_bytes + try: + free = free_bytes(path) + except (OSError, ValueError): + return None + return int(free) if isinstance(free, (int, float)) and free >= 0 else None + + +def snapshot(reader, root, busy, paused): + result = {'busy': bool(busy), 'paused': bool(paused)} + result.update(reader.read()) + free = disk_free(root) + if free is not None: + result['disk_free'] = free + return result + + +def register(): + from aiohttp import web + import asyncio + import folder_paths + from server import PromptServer + server = PromptServer.instance + if server is None or getattr(server, '_freevideo_monitor', None) is not None: + return + reader, gate = Reader(), Gate() + server._freevideo_monitor = gate + install_gate(server.prompt_queue, gate) + root = folder_paths.base_path + + def front(): + return getattr(server, '_freevideo_front', None) + + def running(): + found = front() + if found is not None: + return found.current_queue()[0] + return server.prompt_queue.get_current_queue()[0] + + def busy(): + return bool(running()) + + def reply(value, status=200): + return web.json_response(value, status=status, headers={'Cache-Control': 'no-store'}) + + @server.routes.get('/freevideo/monitor') + async def read(request): + return reply(await asyncio.to_thread(snapshot, reader, root, busy(), gate.paused)) + + @server.routes.post('/freevideo/monitor/stop') + async def stop(request): + gate.pause() + found = front() + if found is not None: + found.paused = True + for row in running(): + found.cancel(row[1]) + else: + import nodes + nodes.interrupt_processing() + from . import comfy_chain + runner = comfy_chain.RUNNER + if runner is not None: + with runner.lock: + active = [key for key, row in runner.records.items() if row['state'] in ('queued', 'running')] + for key in active: + try: + runner.cancel(key) + except Exception: + logging.getLogger(__name__).warning('Could not stop chain %s', key, exc_info=True) + return reply({'paused': True}) + + @server.routes.post('/freevideo/monitor/resume') + async def resume(request): + gate.resume() + found = front() + if found is not None: + found.paused = False + return reply({'paused': False}) diff --git a/freevideo_engine/refine.py b/freevideo_engine/refine.py index 094cd503..67ca2050 100644 --- a/freevideo_engine/refine.py +++ b/freevideo_engine/refine.py @@ -147,6 +147,11 @@ def generate_latents(transformer, prompt_embeds, text_token_tags, num_frames, nu encoder_hidden_states=prompt_embeds[None], timestep=times, timestep_indices=time_ids, token_tags=tags, position_ids=positions, video_indices=video_ids, audio_indices=audio_ids, text_indices=text_ids, return_dict=False) + if refine_schedule is not None: + # This schedule's scheduler is the upstream class, which does not look at + # the frame preview itself. The call only reads; the update below is unchanged. + from .frame_preview import observe + observe(prediction[0, condition_rows:], video_t, video_rows[condition_rows:]) video_rows[condition_rows:] = video_scheduler.step( prediction[0, condition_rows:].float(), video_t, video_rows[condition_rows:], return_dict=False)[0] if step_seconds is not None: diff --git a/web/health.js b/web/health.js index 507a00d0..815f161f 100644 --- a/web/health.js +++ b/web/health.js @@ -13,7 +13,7 @@ const t = (en, zh) => cn ? zh : en; // launcher.js removes this flag during setup; read it before that. const launchVisit = query.get('freevideo') === 'launch'; // Every script this folder ships; a test keeps the list in step with web/*.js. -export const MODULES = ['audio_original.js', 'chat_data.js', 'phone_model.js', 'phone.js', 'lan_access.js', 'qrcodegen.js', 'agent_activity.js', 'agent_confirm_settings.js', 'agent_connect.js', 'agent_session.js', 'autopilot.js', 'autopilot_chat.js', 'chat_attachments.js', 'autopilot_conversations.js', 'browser_extension.js', 'caret_rect.js', 'chain_support.js', 'chain_rules.js', 'timed_prompt.js', 'capability_view.js', 'cast_generate.js', 'cast_mention.js', 'cast_overlay.js', 'cast_source.js', 'compatibility.js', 'entry_showcase.js', 'engine_exit.js', 'error_panel.js', 'first_run_guide.js', 'fonts.js', 'freevideo.js', 'generation_progress.js', +export const MODULES = ['audio_original.js', 'chat_data.js', 'phone_model.js', 'phone.js', 'lan_access.js', 'monitor_panel.js', 'qrcodegen.js', 'agent_activity.js', 'agent_confirm_settings.js', 'agent_connect.js', 'agent_session.js', 'autopilot.js', 'autopilot_chat.js', 'chat_attachments.js', 'autopilot_conversations.js', 'browser_extension.js', 'caret_rect.js', 'chain_support.js', 'chain_rules.js', 'timed_prompt.js', 'capability_view.js', 'cast_generate.js', 'cast_mention.js', 'cast_overlay.js', 'cast_source.js', 'compatibility.js', 'entry_showcase.js', 'engine_exit.js', 'error_panel.js', 'first_run_guide.js', 'fonts.js', 'freevideo.js', 'generation_progress.js', 'editor.js', 'editor_actions.js', 'editor_lifecycle.js', 'editor_adjust.js', 'editor_adjust_picture.js', 'editor_picture_fields.js', 'editor_picture_session.js', 'editor_preview_picture.js', 'editor_entry.js', 'editor_expand.js', 'editor_export_dialog.js', 'editor_first_frame.js', 'editor_media_references.js', 'editor_references.js', 'editor_genbar.js', 'editor_duration.js', 'editor_geometry.js', 'editor_library.js', 'editor_menu.js', 'editor_stems.js', 'editor_record.js', 'editor_record_model.js', 'editor_voice.js', 'editor_voice_install.js', 'editor_voice_model.js', 'editor_voice_store.js', 'editor_model.js', 'editor_frame.js', 'editor_player.js', 'editor_room.js', 'editor_select.js', 'editor_state.js', 'editor_store.js', 'editor_tracks.js', 'editor_generation.js', 'editor_transport.js', 'editor_transport_model.js', 'editor_audio.js', 'editor_audio_model.js', 'editor_audio_notes.js', 'editor_audio_replace.js', 'editor_audio_rules.js', 'editor_music.js', 'editor_music_model.js', 'editor_speed.js', 'editor_speed_model.js', 'editor_failure.js', 'editor_header_fit.js', 'studio_header_fit.js', 'editor_loader.js', 'editor_text_coverage.js', 'editor_text.js', 'editor_toolbar_more.js', 'editor_text_model.js', 'editor_text_layout.js', 'editor_notes.js', 'editor_icons.js', 'dialog_keys.js', 'done_notify.js', 'failure_issue.js', 'feedback.js', 'frame_sizes.js', 'health.js', 'image_commands.js', 'image_editor.js', 'image_editor_engine.js', 'image_generation.js', 'image_lora.js', 'launch_visit.js', 'launcher.js', 'length_plan.js', 'lora_triggers.js', 'lora_check.js', 'library.js', 'motion.js', 'native_errors.js', 'translate_guard.js', 'output_download.js', 'port_notice.js', 'preview_scene.js', 'progress_connection.js', 'prompt_draft.js', 'prompt_enhance.js', 'prompt_references.js', 'prompt_sections.js', 'prompt_terms.js', 'request_assets.js', 'repair_hint.js', 'report_issue.js', 'issue_button.js', 'studio_recent.js', 'task_groups.js', diff --git a/web/monitor_panel.css b/web/monitor_panel.css new file mode 100644 index 00000000..a6516129 --- /dev/null +++ b/web/monitor_panel.css @@ -0,0 +1,18 @@ +.fv-monitor{position:relative;display:inline-flex;flex:none;font-size:var(--fv-body);color:var(--fv-ink)}.fv-monitor[hidden]{display:none} +.fv-monitor button{font:inherit;cursor:pointer;color:inherit;border:0;touch-action:manipulation}.fv-monitor button:disabled{opacity:.45;cursor:default} +.fv-monitor .fv-monitor-trigger{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 10px 0 8px;border-radius:99px;background:var(--fv-raised);border:1px solid var(--fv-border);white-space:nowrap} +.fv-monitor-trigger:hover,.fv-monitor-trigger[aria-expanded=true]{background:var(--fv-hover)!important} +.fv-monitor svg{width:16px;height:16px;fill:none;stroke:var(--fv-muted);stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;display:block;flex:none} +.fv-monitor-text[hidden]{display:none}.fv-monitor .fv-monitor-warn{color:var(--fv-danger)} +.fv-monitor-panel{position:fixed;z-index:1000;box-sizing:border-box;width:280px;max-width:calc(100vw - 16px);padding:16px;background:var(--fv-card);border:1px solid var(--fv-border);border-radius:var(--fv-r-md);box-shadow:0 12px 36px #0006;text-align:left} +.fv-monitor-name{display:block;font-size:calc(var(--fv-body) + 1px);font-weight:var(--fv-semibold)}.fv-monitor-name[hidden]{display:none} +.fv-monitor-rows{display:flex;flex-direction:column;gap:12px;margin-top:12px}.fv-monitor-rows:empty{display:none} +.fv-monitor-line{display:flex;justify-content:space-between;gap:12px}.fv-monitor-title{color:var(--fv-muted)} +.fv-monitor-bar{height:4px;margin-top:6px;border-radius:99px;background:var(--fv-hover);overflow:hidden}.fv-monitor-bar i{display:block;height:100%;background:var(--fv-accent)}.fv-monitor-bar i.fv-monitor-warn{background:var(--fv-danger)} +.fv-monitor-stopped button{white-space:nowrap;flex:none}.fv-monitor-stopped{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:14px;color:var(--fv-muted)}.fv-monitor-stopped[hidden]{display:none} +.fv-monitor .fv-monitor-resume{background:none;color:var(--fv-accent);height:32px;padding:0 4px} +.fv-monitor .fv-monitor-stop{display:block;width:100%;height:36px;margin-top:14px;border-radius:var(--fv-r-sm);background:transparent;border:1px solid var(--fv-danger);color:var(--fv-danger);font-weight:var(--fv-semibold)} +.fv-monitor .fv-monitor-stop:disabled{border-color:var(--fv-border);color:var(--fv-muted);opacity:1} +.fv-monitor .fv-monitor-stop.fv-monitor-confirm{background:var(--fv-danger);color:var(--fv-bg)} +.fv-monitor :focus-visible{outline:2px solid var(--fv-accent);outline-offset:2px} +@media(pointer:coarse){.fv-monitor .fv-monitor-trigger{height:44px}.fv-monitor-panel button{min-height:44px}} diff --git a/web/monitor_panel.js b/web/monitor_panel.js new file mode 100644 index 00000000..b2928142 --- /dev/null +++ b/web/monitor_panel.js @@ -0,0 +1,109 @@ +const css = document.createElement('link'); css.rel = 'stylesheet'; css.href = new URL('./monitor_panel.css', import.meta.url).href; document.head.append(css); +const shownKey = 'freevideo.monitor.shown', changed = 'freevideo-monitor-shown'; +const el = (tag, cls, text) => { const e = document.createElement(tag); if (cls) e.className = cls; if (text != null) e.textContent = text; return e; }; +const GIB = 2 ** 30, memoryLimit = 95, temperatureLimit = 85; +export function monitorShown() { try { return localStorage.getItem(shownKey) === '1'; } catch { return false; } } +export function setMonitorShown(value) { + try { localStorage.setItem(shownKey, value ? '1' : '0'); } catch {} + window.dispatchEvent(new Event(changed)); +} +export function onMonitorShown(listener) { + const storage = event => { if (event.key === shownKey) listener(); }; + window.addEventListener(changed, listener); window.addEventListener('storage', storage); + return () => { window.removeEventListener(changed, listener); window.removeEventListener('storage', storage); }; +} +const gib = bytes => (bytes / GIB).toFixed(1); +const svg = d => { + const root = document.createElementNS('http://www.w3.org/2000/svg', 'svg'), path = document.createElementNS(root.namespaceURI, 'path'); + root.setAttribute('viewBox', '0 0 24 24'); root.setAttribute('aria-hidden', 'true'); path.setAttribute('d', d); root.append(path); return root; +}; +// The top-bar capsule and its panel. Nothing is read from the server while the setting is off. +export function createMonitor(t, api) { + const element = el('div', 'fv-monitor'), trigger = el('button', 'fv-monitor-trigger'), text = el('span', 'fv-monitor-text'), panel = el('section', 'fv-monitor-panel'); + const label = t('System status', '运行状态'); + trigger.type = 'button'; trigger.setAttribute('aria-label', label); trigger.setAttribute('aria-expanded', 'false'); trigger.setAttribute('aria-haspopup', 'dialog'); + trigger.append(svg('M3 12h4l3-8 4 16 3-8h4'), text); + panel.hidden = true; panel.setAttribute('role', 'dialog'); panel.setAttribute('aria-label', label); + const name = el('strong', 'fv-monitor-name'), rows = el('div', 'fv-monitor-rows'), stop = el('button', 'fv-monitor-stop', t('Stop now', '立即停止')); + stop.type = 'button'; + const stopped = el('div', 'fv-monitor-stopped'), stoppedText = el('span', '', t('Stopped. The queue is paused.', '已停止,队列已暂停。')), resume = el('button', 'fv-monitor-resume', t('Resume queue', '继续队列')); + resume.type = 'button'; stopped.append(stoppedText, resume); stopped.hidden = true; + panel.append(name, rows, stopped, stop); element.append(trigger, panel); element.hidden = true; + let state = {}, timer = null, reading = false, disposed = false, confirming = null, active = false; + const row = (title, value, bar, warn) => { + const line = el('div', 'fv-monitor-row'), head = el('div', 'fv-monitor-line'); + const number = el('span', warn ? 'fv-monitor-value fv-monitor-warn' : 'fv-monitor-value', value); + head.append(el('span', 'fv-monitor-title', title), number); line.append(head); + if (bar != null) { const track = el('div', 'fv-monitor-bar'), fill = el('i'); fill.style.width = `${Math.min(100, bar)}%`; if (warn) fill.className = 'fv-monitor-warn'; track.append(fill); line.append(track); } + return line; + }; + const percent = value => state.memory_total ? Math.round(100 * state.memory_used / state.memory_total) : null; + function render() { + const memory = state.memory_total ? percent() : null, hot = state.temperature >= temperatureLimit, full = memory != null && memory >= memoryLimit; + text.replaceChildren(); + const parts = []; + if (memory != null) parts.push([`${t('VRAM', '显存')} `, `${memory}%`, full]); + if (state.temperature != null) parts.push(['', `${state.temperature} °C`, hot]); + parts.forEach(([label, value, warn], index) => { + if (index) text.append(document.createTextNode(' · ')); + if (label) text.append(document.createTextNode(label)); + text.append(el('span', warn ? 'fv-monitor-warn' : '', value)); + }); + text.hidden = !parts.length; + name.textContent = state.name || ''; name.hidden = !state.name; + const list = []; + if (memory != null) list.push(row(t('VRAM', '显存'), `${gib(state.memory_used)} / ${gib(state.memory_total)} GiB`, memory, full)); + if (state.utilization != null) list.push(row(t('Utilization', '使用率'), `${state.utilization}%`)); + if (state.temperature != null) list.push(row(t('Temperature', '温度'), `${state.temperature} °C`, null, hot)); + if (state.disk_free != null) list.push(row(t('Disk', '硬盘'), t(`${gib(state.disk_free)} GiB free`, `剩余 ${gib(state.disk_free)} GiB`))); + rows.replaceChildren(...list); + stopped.hidden = !state.paused; + stop.disabled = !state.busy; + if (!confirming) stop.textContent = t('Stop now', '立即停止'); + } + async function read() { + clearTimeout(timer); + if (disposed || !active || reading) return; + reading = true; + try { + const response = await api.fetchApi('/freevideo/monitor', {signal: AbortSignal.timeout(10000)}); + if (response.ok && !disposed && active) { state = await response.json(); render(); } + } catch {} + finally { reading = false; if (!disposed && active) timer = setTimeout(read, document.hidden ? 10000 : 2000); } + } + function position() { + if (panel.hidden) return; + const box = trigger.getBoundingClientRect(); panel.style.top = `${box.bottom + 8}px`; + panel.style.left = `${Math.max(8, Math.min(box.left, window.innerWidth - 288))}px`; + } + function revert() { clearTimeout(confirming); confirming = null; stop.classList.remove('fv-monitor-confirm'); stop.textContent = t('Stop now', '立即停止'); } + function close() { panel.hidden = true; trigger.setAttribute('aria-expanded', 'false'); revert(); } + trigger.onclick = () => { if (panel.hidden) { panel.hidden = false; trigger.setAttribute('aria-expanded', 'true'); position(); } else close(); }; + stop.onclick = async () => { + if (stop.disabled) return; + if (!confirming) { + stop.classList.add('fv-monitor-confirm'); stop.textContent = t('Confirm stop', '确认停止'); + confirming = setTimeout(revert, 4000); return; + } + revert(); stop.disabled = true; + try { await api.fetchApi('/freevideo/monitor/stop', {method: 'POST'}); } catch {} + state = {...state, paused: true, busy: false}; render(); read(); + }; + resume.onclick = async () => { + resume.disabled = true; + try { await api.fetchApi('/freevideo/monitor/resume', {method: 'POST'}); state = {...state, paused: false}; } catch {} + resume.disabled = false; render(); read(); + }; + const outside = event => { if (!element.contains(event.target)) close(); }; + // Escape reaches the panel only through the dialog's cancel: the studio routes its keys itself. + const dismiss = () => { if (panel.hidden) return false; close(); trigger.focus(); return true; }; + document.addEventListener('pointerdown', outside, true); window.addEventListener('resize', position); + function apply() { + const wanted = monitorShown(); + if (wanted === active) return; + active = wanted; element.hidden = !wanted; + if (wanted) read(); else { clearTimeout(timer); close(); state = {}; } + } + const stopWatching = onMonitorShown(apply); apply(); + return {element, dismiss, dispose() { disposed = true; active = false; clearTimeout(timer); revert(); stopWatching(); document.removeEventListener('pointerdown', outside, true); window.removeEventListener('resize', position); }}; +} diff --git a/web/setup.js b/web/setup.js index 47a64c8f..6d956c8a 100644 --- a/web/setup.js +++ b/web/setup.js @@ -6,6 +6,7 @@ import { createGuideReplayEntry } from './first_run_guide.js'; import { issueButton } from './issue_button.js'; import { agentConfirmSettings } from './agent_confirm_settings.js'; import { previewStyle, loadPreviewStyle, applyPreviewStyle, onPreviewStyle } from './preview_style.js'; +import { monitorShown, setMonitorShown, onMonitorShown } from './monitor_panel.js'; const css = document.createElement('link'); css.rel = 'stylesheet'; css.href = new URL('./setup.css', import.meta.url).href; @@ -230,13 +231,22 @@ export async function openSetup(options) { dialog.addEventListener('close', stopWatching); loadPreviewStyle(api).then(paintPreview); preview.append(loopLabel, previewStatus); + const status = node('section'); status.dataset.section = 'status'; + status.append(node('h3', t('System status', '运行状态'))); + const statusLabel = node('label'); statusLabel.className = 'fv-check'; + const statusSwitch = node('input'); statusSwitch.type = 'checkbox'; statusSwitch.checked = monitorShown(); + statusLabel.append(statusSwitch, node('span', t('Show system status in the top bar', '在顶栏显示运行状态'))); + statusSwitch.onchange = () => setMonitorShown(statusSwitch.checked); + const stopStatusWatching = onMonitorShown(() => { statusSwitch.checked = monitorShown(); }); + dialog.addEventListener('close', stopStatusWatching); + status.append(statusLabel); const showSection = name => { if (name !== 'preview') return; preview.scrollIntoView({block: 'center'}); loopSwitch.focus({preventScroll: true}); }; dialog.addEventListener('fv-setup-section', event => showSection(event.detail)); - dialog.append(heading, installation, downloads, preview, agentConfirm.element, advanced, guideReplay); + dialog.append(heading, installation, downloads, preview, status, agentConfirm.element, advanced, guideReplay); const motions = [...dialog.querySelectorAll('details')].map(animateDetails); dialog.addEventListener('cancel', e => { e.preventDefault(); closeDialog(dialog); }); document.body.append(dialog); dialog.showModal(); diff --git a/web/studio.css b/web/studio.css index 178bb573..08ffc07b 100644 --- a/web/studio.css +++ b/web/studio.css @@ -309,3 +309,8 @@ .fv-studio:not(.fv-editor):not(.fv-autopilot) .fv-header[data-fit~=wrap]{height:auto;min-height:98px;grid-template-columns:minmax(0,1fr) auto;padding-block:10px} .fv-studio:not(.fv-editor):not(.fv-autopilot) .fv-header[data-fit~=wrap]>.fv-view-switch{grid-column:1/-1;grid-row:2;justify-self:center} .fv-studio:not(.fv-editor):not(.fv-autopilot) .fv-header[data-fit~=wrap]>.fv-header-actions{grid-column:2;grid-row:1} +.fv-studio:not(.fv-editor):not(.fv-autopilot) .fv-header[data-fit~=small] .fv-wordmark{width:150px} +.fv-studio:not(.fv-editor):not(.fv-autopilot) .fv-header[data-fit~=compact] .fv-monitor-text{display:none} +.fv-studio:not(.fv-editor):not(.fv-autopilot) .fv-header[data-fit~=shift]{grid-template-columns:minmax(0,1fr) auto auto} +.fv-studio:not(.fv-editor):not(.fv-autopilot) .fv-header[data-fit~=gone] .fv-monitor{display:none} +.fv-studio:not(.fv-editor):not(.fv-autopilot) .fv-header[data-fit~=compact] .fv-monitor .fv-monitor-trigger{padding:0 8px} diff --git a/web/studio.js b/web/studio.js index d6262beb..f4a753ee 100644 --- a/web/studio.js +++ b/web/studio.js @@ -1,4 +1,5 @@ import {createLanAccess} from './lan_access.js'; +import {createMonitor} from './monitor_panel.js'; import { createErrorPanel, errorText, createErrorReport } from './error_panel.js'; import {createExpandButton} from './editor_expand.js'; import {allowEmptyPrompt, cleanOptionalPrompt, clonePrompt} from './optional_inputs.js'; @@ -667,6 +668,7 @@ export function openStudio(node, {extendFrom = null} = {}) { brand.append(wordmark()); const tools = el('div', null, 'fv-header-actions'); const agents = createAgentActivity(t, api, dialog); tools.append(agents.element); cleanup.push(agents.dispose); + const monitor = createMonitor(t, api); tools.append(monitor.element); cleanup.push(monitor.dispose); const phoneAccess = createLanAccess(t, api); tools.append(phoneAccess.element); cleanup.push(phoneAccess.dispose); const versionInfo = createVersionInfo(cn); tools.append(versionInfo.element); cleanup.push(versionInfo.dispose); tools.append(guideButton(t), feedbackButton(t), button(t('Settings', '设置'), openSetup, 'fv-quiet')); @@ -2183,7 +2185,7 @@ export function openStudio(node, {extendFrom = null} = {}) { cleanup.push(isolateDialogKeys(dialog, event => routeDialogKey(event, dialog))); // Escape first closes the recent videos panel of a narrower window, then the studio. - dialog.addEventListener('cancel', e => { e.preventDefault(); if (!recent.dismiss()) closeDialog(dialog); }); + dialog.addEventListener('cancel', e => { e.preventDefault(); if (!monitor.dismiss() && !recent.dismiss()) closeDialog(dialog); }); dialog.onclose = () => { disposed = true; blockOriginal('extend', false); blockOriginal('preview', false); for (const f of cleanup) f(); stage.querySelector('video')?.pause(); dialog.remove(); if (current?.dialog === dialog) { current = null; viewChanged('nodes', node); } }; capabilityView = createCapabilityView({node, api, t, getState: () => ({ratio, custom: selected === 'custom', steps: Number(baseSteps.value), twoPass: twoPass.checked, diff --git a/web/studio_header_fit.js b/web/studio_header_fit.js index b3fdb6f6..fd19129c 100644 --- a/web/studio_header_fit.js +++ b/web/studio_header_fit.js @@ -1,5 +1,5 @@ // The creation panel's header keeps its view switch centred. When the actions beside it would not fit, the phone entry steps -// aside first, then the feedback entry, then the switch moves to a second row; on two rows the same entries still leave +// aside first (after the status capsule gives way: first its words, then the capsule), then the feedback entry, then the switch moves to a second row; on two rows the same entries still leave // in that order, and the Tutorial entry last. export function fitStudioHeader(header, brand, navigation, actions) { if (typeof ResizeObserver !== 'function' || typeof getComputedStyle !== 'function') return {check() {}, dispose() {}}; @@ -13,13 +13,26 @@ export function fitStudioHeader(header, brand, navigation, actions) { const need = shown.reduce((sum, child) => sum + Math.max(child.getBoundingClientRect().width, child.scrollWidth), 0) + apart * Math.max(0, shown.length - 1); const width = selector => { const found = actions.querySelector(selector); return found && found.offsetWidth > 0 ? found.offsetWidth + apart : 0; }; const away = width('.fv-lan'), spare = width('.fv-feedback-entry:not(.fv-guide-entry)'), last = width('.fv-guide-entry'); - const items = [...brand.children].filter(child => child.offsetWidth > 0), mark = items.reduce((sum, child) => sum + child.getBoundingClientRect().width, 0) + px(getComputedStyle(brand).columnGap) * Math.max(0, items.length - 1), side = (inner - navigation.offsetWidth - 2 * gap) / 2; - const one = room => side >= Math.max(room, mark); - const row = room => inner - mark - gap >= room; - const steps = [['', need, one], ['tight', need - away, one], ['tight lean', need - away - spare, one], - ['wrap', need, row], ['wrap tight', need - away, row], ['wrap tight lean', need - away - spare, row], ['wrap tight lean least', need - away - spare - last, row]]; - const found = steps.find(([, room, fits]) => fits(room)); - const fit = found ? found[0] : 'wrap tight lean least'; + const capsule = width('.fv-monitor'), label = actions.querySelector('.fv-monitor-text'), words = label && label.offsetWidth > 0 ? label.offsetWidth + px(getComputedStyle(label.parentElement).columnGap) : 0; + const items = [...brand.children].filter(child => child.offsetWidth > 0), mark = items.reduce((sum, child) => sum + child.getBoundingClientRect().width, 0) + px(getComputedStyle(brand).columnGap) * Math.max(0, items.length - 1); + const logo = brand.querySelector('.fv-wordmark'), smaller = logo ? Math.max(0, logo.offsetWidth - 150) : 0; + // The one-row fit for a given brand width; the wrapped layout only needs the brand and the actions side by side. + const one = (room, brandWidth) => (inner - navigation.offsetWidth - 2 * gap) / 2 >= Math.max(room, brandWidth); + const row = (room, brandWidth) => inner - brandWidth - gap >= room; + // Before anything gives way, the switch may sit a little left of centre when the actions only just overflow their half. + const shifted = (room, brandWidth) => inner - brandWidth - navigation.offsetWidth - 2 * gap >= room; + // What gives way, in order: the switch moves left, the wordmark shrinks, the capsule's words, the capsule, the phone entry, the feedback entry, the guide entry. + // The capsule never comes back once it has gone: the wrapped layout starts without it. + const order = [['compact', words], ['gone', capsule - words], ['tight', away], ['lean', spare], ['least', last]]; + const steps = [['', need, mark, one], ['shift', need, mark, shifted]]; + let room = need, tokens = ['shift']; + if (smaller) { tokens.push('small'); steps.push([tokens.join(' '), room, mark - smaller, shifted]); } + for (const [token, saved] of order.slice(0, 4)) { room -= saved; tokens.push(token); steps.push([tokens.join(' '), room, mark - smaller, shifted]); } + room = need - capsule; tokens = ['wrap', 'gone']; + steps.push([tokens.join(' '), room, mark, row]); + for (const [token, saved] of order.slice(2)) { room -= saved; tokens.push(token); steps.push([tokens.join(' '), room, mark, row]); } + const found = steps.find(([, room, width, fits]) => fits(room, width)); + const fit = found ? found[0] : steps[steps.length - 1][0]; if (fit) header.dataset.fit = fit; } const observer = new ResizeObserver(check); From 7461e5019e1a216a7684aebe28b17e8d99106eab Mon Sep 17 00:00:00 2001 From: Bowen Xue Date: Mon, 9 Nov 2026 14:16:59 +0000 Subject: [PATCH 02/44] Agent: a request for a picture alone is one picture call, not a video Agent: a request for a picture alone is one picture call, not a video; the introduction, skill, rules, tool text and greeting example offer pictures beside videos --- freevideo_engine/agent/guide.py | 15 ++++++++++----- freevideo_engine/agent/mcp.py | 4 ++-- freevideo_engine/agent/skill/freevideo/SKILL.txt | 7 ++++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/freevideo_engine/agent/guide.py b/freevideo_engine/agent/guide.py index 2ffceea7..5694be09 100644 --- a/freevideo_engine/agent/guide.py +++ b/freevideo_engine/agent/guide.py @@ -262,8 +262,9 @@ 'otherwise make its reference pictures with POST /cast/{id}/generate. ' 'Before shooting, tell the user the casting in one sentence. Later shots use the card\'s current pictures. ' 'Keep cards you made so later films can reuse them.', - 'Pictures. When the user wants a picture, or a first frame or reference picture that does not exist yet, make ' - 'it with freevideo_generate_image; to change a picture, pass it in images. The result is an input file: use ' + 'Pictures. When the user wants a picture, make it with freevideo_generate_image and stop there: do not read the video ' + 'prompt guide, plan or start a video, and tell the user where the picture is. The same tool makes a first frame or ' + 'reference picture that does not exist yet; to change a picture, pass it in images. The result is an input file: use ' 'result.file as a first frame, as a reference, or in images again. When where people stand in the shot matters, ' 'make the first frame with scene_image and people (cast card IDs or pictures, x, height, facing left/right, ' 'framing full/half), then generate the video from result.file. Use dimensions divisible by 32. ' @@ -306,7 +307,8 @@ '先选角,再拍摄。先搜索角色库,使用用户指定的卡片或明确符合要求的卡片;拿不准时询问用户。' '只有找不到合适卡片时才新建:用户提供了照片就用照片,否则通过 POST /cast/{id}/generate 生成参考图。' '开拍前用一句话告诉用户选角结果。后续镜头使用卡片当前的图片。保留你创建的卡片,方便以后拍片复用。', - '图片。用户要一张图,或者缺一张首帧、参考图时,用 freevideo_generate_image 生成;要改一张图,把它放进 images。' + '图片。用户要一张图时,用 freevideo_generate_image 生成,到此为止:不读视频提示词指南,不做视频规划,也不生成视频,告诉用户图片在哪里。' + '缺一张首帧、参考图时也用它生成;要改一张图,把它放进 images。' '结果是一个输入文件:result.file 可以当首帧、当参考图,也可以再放进 images。镜头里人物站位要紧时,' '先用 people(角色图和各自的位置)做出首帧,再用它生成视频。', '默认切镜头。能切镜头的地方就切:新镜头直接用对应的参考图(人物卡、场景图)生成,不接上一段视频。' @@ -458,7 +460,9 @@ def connection_discovery(root, base, lang=None): def introduction(zh, offers): """What the agent tells the user first: only what this installation is known to carry through.""" rows = ['按描述生成视频,可以给首帧图片或参考图' if zh else - 'Make a video from a description, optionally from a first-frame picture or reference pictures'] + 'Make a video from a description, optionally from a first-frame picture or reference pictures', + '按描述生成图片,也可以修改、合成已有的图片;只要图片时不会生成视频' if zh else + 'Make a picture from a description, or change and combine pictures; a request for a picture alone makes no video'] if offers.get('editing'): rows.append('剪辑:把片段排上时间线,分割、裁剪、删除,再导出成片' if zh else 'Edit: put clips on a timeline, split, trim and remove them, then export the finished video') @@ -489,6 +493,7 @@ def connection_guide(root, base, lang=None, offers=None, resumed=False): '# client is the name the user sees as connected: put your own, for example "Claude Code" or "Codex".', 'call("POST", "/connect/hello", {"client": "Local Agent", "via": "http"})', 'print(call("GET", ""))', + '# A request for a picture alone: POST /jobs {"kind": "image", "prompt": ..., "label": ..., "ref": ...} and no video job; the result is result.file.', '# Only after the user asks for a video:', '# label is the short name the user sees on the job, in their language: what the video shows, 2 to 8 characters.', '# seconds and aspect are what the user asked for (10 seconds and 16:9 when they said nothing): send them the first time.', @@ -557,7 +562,7 @@ def connection_guide(root, base, lang=None, offers=None, resumed=False): 'without id). Its "session" is the conversation the user is in (it changes when the user opens or returns to another one; always post to the session the latest wait named); POST ' + base + PREFIX + '/sessions/{session}/events ' 'with {"type":"message","text":"..."} (MCP: freevideo_session_post). Say only one short sentence ' 'there first, at most 12 words, no list and no examples (the page already shows examples), for example ' - '"Connected. Describe the video you want.", in the language the user writes to you in. Give the introduction in your own window as usual, but it ' + '"Connected. Describe the video or picture you want.", in the language the user writes to you in. Give the introduction in your own window as usual, but it ' 'does not end your turn: right after it, call the wait. Then stay in this conversation: call the wait again; it answers within about 50 seconds, and ' '"again": true means the user has not spoken yet, so call it again at once, time after time, with no ' 'limit. Nothing new is not a reason to finish: do not end your reply and do not stop to ask the ' diff --git a/freevideo_engine/agent/mcp.py b/freevideo_engine/agent/mcp.py index 41d51d51..e56c6ae7 100644 --- a/freevideo_engine/agent/mcp.py +++ b/freevideo_engine/agent/mcp.py @@ -23,7 +23,7 @@ JOB_WAIT = 45. # freevideo_wait only; the other waits keep 25 s. Fewer empty turns, each of which carries the whole context again. PROTOCOLS = ('2025-06-18', '2025-03-26', '2024-11-05') -INSTRUCTIONS = """FreeVideo generates videos (MiniMax H3) on this computer's GPU. +INSTRUCTIONS = """FreeVideo generates videos (MiniMax H3) and pictures on this computer's GPU. A request for a picture alone is one freevideo_generate_image call: no video prompt guide, no plan, no video job. Start with freevideo_status and freevideo_capabilities. Picture editing, storyboards (submit_batch), editor operations and plan are not listed in full: freevideo_tool_help {name} gives the schema, freevideo_call runs them. If a parameter is unclear, read the schema or check with freevideo_plan; do not submit a test job. Write prompts as the guide says (freevideo_prompt_guide): English sections integrated_multimodal_description / overall_soundscape / non_diegetic_music, [Shot N] cuts, (S1) [Language] ... dialogue. Generation uses continuous chains and takes minutes: submit, then call freevideo_wait (up to 45 seconds; it returns as soon as the job ends) @@ -51,7 +51,7 @@ def tool_list(): dict(name='freevideo_schema', title='Job JSON Schemas', description='JSON Schemas of every job kind and of image edit recipes.', annotations=read), dict(name='freevideo_plan', title='Plan a job', description="Validate a job without running it: actual frames/seconds, sampling passes, warnings and a time estimate from this computer's history. Same fields as freevideo_generate.", annotations=read), dict(name='freevideo_generate', title='Generate a video', description='Generate one video from an H3 prompt, up to 60 seconds. Under 30 s defaults to one generation if the device supports this size and quality; unknown limits use 15 s. Otherwise the video is cut into as few parts as possible, each continuing part 10 s or longer where the length allows and never under 5 s, and how many parts depends on how long this computer can generate in one run; the parts continue and join automatically. Prefer a new shot with its reference pictures wherever the film can cut; continue only a take, action or sound that must stay unbroken. Use this for any single video, also after freevideo_enhance_prompt (pass its job id as prompt, {from_job: id}); the drama tools are only for a film of several separately chosen shots. Optionally from first/last frames or references (files, local paths, or frames of earlier jobs). Returns the job; with wait, its result (video path and URL).', annotations=write), - dict(name='freevideo_generate_image', title='Generate a picture', description='Generate a picture from a prompt; with images, change or combine input pictures; with people, make a first frame with them near the places you say, in the scene from scene_image or the prompt. The result is an input file to use as a first frame, as a reference, or in images again.', annotations=write), + dict(name='freevideo_generate_image', title='Generate a picture', description='Generate a picture from a prompt, on its own or as a first frame; with images, change or combine input pictures; with people, make a first frame with them near the places you say, in the scene from scene_image or the prompt. The result is an input file to use as a first frame, as a reference, or in images again.', annotations=write), dict(name='freevideo_submit_batch', title='Submit a storyboard', description='Submit several jobs at once. Each row is a job object with "kind" (generate default, assemble, vlm, enhance, image) and an optional "ref"; later rows use "@ref" wherever a job id is expected (from_job, after, clips, refine_from). FreeVideo runs them in dependency order.', annotations=write), dict(name='freevideo_job', title='Job status', description='Status, progress, result or error of a job.', annotations=read), dict(name='freevideo_wait', title='Wait for a job or the user', description="Wait up to 45 seconds for a job (with id) or, without id, at most 50 seconds for what the user says in FreeVideo (inbox). again=true means nothing new yet: call it again. A job wait returns early when the user says something. If the job is still active, call it again with the same ID; do not resubmit.", annotations=read), diff --git a/freevideo_engine/agent/skill/freevideo/SKILL.txt b/freevideo_engine/agent/skill/freevideo/SKILL.txt index 4b747e6a..f303d1b6 100644 --- a/freevideo_engine/agent/skill/freevideo/SKILL.txt +++ b/freevideo_engine/agent/skill/freevideo/SKILL.txt @@ -1,6 +1,6 @@ --- name: freevideo -description: Make videos with the user's local FreeVideo through its MCP tools or the `freevideo agent` command line. Use when the user asks to generate or continue a video, edit a picture, cut a timeline or make a multi-shot film in FreeVideo. +description: Make videos and pictures with the user's local FreeVideo through its MCP tools or the `freevideo agent` command line. Use when the user asks to generate or continue a video, make or edit a picture, cut a timeline or make a multi-shot film in FreeVideo. --- # FreeVideo @@ -10,12 +10,13 @@ FreeVideo runs on the user's own computer. Everything below goes through its MCP ## Before anything else 1. Call `freevideo_status`. If it is not ready, tell the user what is missing; do not retry in a loop. -2. Read `freevideo_prompt_guide` once before writing a prompt. Prompts are English sections; dialogue and on-screen text stay in the user's language. -3. Call `freevideo_plan` with the job you intend to run. It returns the real frame count, the number of parts and a time estimate for this computer. Tell the user the estimate before a long run. +2. Before writing a video prompt, read `freevideo_prompt_guide` once (not needed for a picture alone). Prompts are English sections; dialogue and on-screen text stay in the user's language. +3. Before a video, call `freevideo_plan` with the job you intend to run (it plans videos only). It returns the real frame count, the number of parts and a time estimate for this computer. Tell the user the estimate before a long run. 4. The user sees the same work in the FreeVideo window. A tool may answer `needs_confirmation`: wait for the user (`freevideo_wait` without an id), then repeat the identical call once approved. If the user declines, stop and say so; do not retry with a changed reference. ## Pick the right task +- Only a picture asked for (a drawing, a poster, a character, a scene, no motion): one `freevideo_generate_image` call and stop. No video prompt guide, no plan, no video job; report where the picture is. Several pictures are several calls, or one `freevideo_submit_batch`. - One video, up to 60 seconds: `freevideo_generate`. Longer than the device can do in one run is cut into parts and joined automatically. The device limit is a hard cap, not a target: aim for 15 to 20 seconds per generation. - Start from or end on a picture: pass it as first or last frame. Make the picture first with `freevideo_generate_image`. - A story, scene or short drama: follow "Making a short drama" below. Several shots to choose between: the `freevideo_drama_*` tools; see `references/film.md`. From c9fc4cb48b14b681aed074866e4549d9fe66e56e Mon Sep 17 00:00:00 2001 From: Bowen Xue Date: Mon, 9 Nov 2026 14:20:35 +0000 Subject: [PATCH 03/44] Connection card: say when FreeVideo on this computer could not be reached, and name the kind in... Connection card: say when FreeVideo on this computer could not be reached, and name the kind in the report --- web/agent_connect.js | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/web/agent_connect.js b/web/agent_connect.js index e1fe3ecd..e841d2fd 100644 --- a/web/agent_connect.js +++ b/web/agent_connect.js @@ -23,6 +23,13 @@ export async function agentInterfaceState(api) { } catch { return 'unknown'; } } +// What to tell the user when the lookup got no usable answer at all (no refusal came back): the request failed, the +// reply could not be read, or it held no address. The page cannot tell these apart for the user, and in each the +// way back is the same. +export function noAnswerHint(kind, t) { + return kind ? t('Could not reach FreeVideo on this computer. Make sure it is still running, then retry.', '无法连接本机的 FreeVideo 服务,请确认它仍在运行后重试。') : ''; +} + // What to tell the user when the address lookup is refused: only refusals that say what to do are named; any other // failure keeps the plain "could not get address". export function refusalHint(code, t) { @@ -65,17 +72,17 @@ export function agentConnectCard(t, api, shown = () => true, changed = () => {}) const status = el('p', 'fv-agent-connect-status', t('Getting the connection address…', '正在获取连接地址…')); status.setAttribute('role', 'status'); body.append(mark, title, intro, subtitle, actions, sentence, status); - let feedback = false, text = '', failures = 0, refusal = null; + let feedback = false, text = '', failures = 0, refusal = null, noAnswer = null; let timer, feedbackTimer, controller, generation = 0; const active = () => body.isConnected && shown(); const render = () => { label.textContent = !text && failures >= 3 ? t('Could not get address. Retry', '获取失败,重试') : feedback ? t('Copied', '已复制') : t('Copy', '复制'); if (!text && failures >= 3) { - if (!issue) { issue = issueButton(t, () => ({where: ['Agent connection', 'Agent 连接'], message: refusal ? `${label.textContent} (HTTP ${refusal.status}${refusal.code ? ' ' + refusal.code : ''})` : label.textContent, kind: refusal?.code || null})); button.after(issue); } + if (!issue) { issue = issueButton(t, () => ({where: ['Agent connection', 'Agent 连接'], message: refusal ? `${label.textContent} (HTTP ${refusal.status}${refusal.code ? ' ' + refusal.code : ''})` : label.textContent, kind: refusal?.code || noAnswer})); button.after(issue); } } else if (issue) { issue.remove(); issue = null; } button.disabled = !text && failures < 3; button.title = !text && failures < 3 ? t('Getting the connection address…', '正在获取连接地址…') : ''; - status.hidden = !!text; status.textContent = !text && failures < 3 ? t('Getting the connection address…', '正在获取连接地址…') : !text ? refusalHint(refusal?.code, t) : ''; + status.hidden = !!text; status.textContent = !text && failures < 3 ? t('Getting the connection address…', '正在获取连接地址…') : !text ? refusalHint(refusal?.code, t) || noAnswerHint(noAnswer, t) : ''; }; render(); @@ -101,7 +108,9 @@ export function agentConnectCard(t, api, shown = () => true, changed = () => {}) // Only the sentence is read here, until it is known; who is connected comes from the surface that holds the card. async function load() { const current = generation; - const request = new AbortController(); controller = request; refusal = null; + const request = new AbortController(); controller = request; refusal = null; noAnswer = null; + // What the lookup lacked if it fails without a refusal: the request itself fails first, then the reply is read. + let lacked = 'unreachable'; try { // The sentence carries no parameter: the server gives the agent the language this card showed. const response = await api.fetchApi('/freevideo/agent/connect?lang=' + t('en', 'zh'), {cache: 'no-store', signal: request.signal}); @@ -109,12 +118,13 @@ export function agentConnectCard(t, api, shown = () => true, changed = () => {}) if (current !== generation) return; if (!response.ok || !connect?.address) { refusal = !response.ok ? {status: response.status, code: String(connect?.error?.code || '').slice(0, 40) || null} : null; + lacked = connect ? 'no_address' : 'unreadable'; throw new Error('Missing address'); } text = connectionSentence(connect.address, t); - failures = 0; refusal = null; render(); + failures = 0; refusal = null; noAnswer = null; render(); if (await state === 'unknown') { state = agentInterfaceState(api); changed(await state); } - } catch { if (current === generation) { failures++; render(); } } + } catch { if (current === generation) { noAnswer = refusal ? null : lacked; failures++; render(); } } finally { if (current === generation) { controller = null; From 620877b663bc5541090feb598eda5ce6eb6770c1 Mon Sep 17 00:00:00 2001 From: Bowen Xue Date: Mon, 9 Nov 2026 10:46:22 +0000 Subject: [PATCH 04/44] Launcher: a graphics card below the hardware floor shows the unsupported-card notice even when... Launcher: a graphics card below the hardware floor shows the unsupported-card notice even when its driver is also old Setup reports an old driver and an unsupported card together, and the first matching notice was shown. A driver update cannot help a card below compute capability 8.0, so the unsupported-card notice now comes first. Old-driver notices for supported cards are unchanged. --- freevideo_engine/failure_details.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/freevideo_engine/failure_details.py b/freevideo_engine/failure_details.py index a248dc3c..f338a3ab 100644 --- a/freevideo_engine/failure_details.py +++ b/freevideo_engine/failure_details.py @@ -704,6 +704,13 @@ def _launcher_failure(value, *, zh=False, other_disk=False, disk_name='', can_re ('If this computer has an NVIDIA graphics card, install NVIDIA driver 580 or newer, ' 'restart the computer, then click "Retry installation".', '如果这台电脑有 NVIDIA 显卡,请安装 580 或更新版本的 NVIDIA 显卡驱动,重启电脑后点击“重试安装”。')), + # Setup reports an unsupported card and an old driver together; the first match is shown, and + # a driver update cannot help a card below the hardware floor, so that card comes first. + (r'CUDA_ARCH_UNSUPPORTED', 'gpu-architecture', + ('This GPU is not supported', '这张显卡不受支持'), + ('FreeVideo requires a GPU with compute capability 8.0 or higher, such as an NVIDIA GeForce RTX 30 series card or newer. ' + 'This requirement does not depend on the amount of VRAM, and a driver update cannot change it.', + 'FreeVideo 需要计算能力 8.0 及以上的显卡,例如 NVIDIA GeForce RTX 30 系列及更新型号。这一要求与显存大小无关,更新驱动也无法改变。')), (r'NVIDIA driver(?: [\w.]+)?(?: \([^)]*\))? is older than 580', 'gpu-driver-old', ('The NVIDIA driver is too old', 'NVIDIA 显卡驱动版本过低'), ('Update the NVIDIA driver to version 580 or newer, restart the computer, then click "Retry installation".', @@ -712,11 +719,6 @@ def _launcher_failure(value, *, zh=False, other_disk=False, disk_name='', can_re ('The NVIDIA driver is installed but not running', 'NVIDIA 显卡驱动已安装但未运行'), ('Restart the computer, then click "Retry installation". If it still fails after the restart, reinstall the NVIDIA driver.', '请重启电脑后点击“重试安装”。重启后仍然失败时,请重新安装 NVIDIA 显卡驱动。')), - (r'CUDA_ARCH_UNSUPPORTED', 'gpu-architecture', - ('This GPU is not supported', '这张显卡不受支持'), - ('FreeVideo requires a GPU with compute capability 8.0 or higher, such as an NVIDIA GeForce RTX 30 series card or newer. ' - 'This requirement does not depend on the amount of VRAM, and a driver update cannot change it.', - 'FreeVideo 需要计算能力 8.0 及以上的显卡,例如 NVIDIA GeForce RTX 30 系列及更新型号。这一要求与显存大小无关,更新驱动也无法改变。')), (r'CUDA_CAPABILITY_UNKNOWN', 'gpu-detection', ('GPU information could not be read', '未能读取显卡信息'), ('Retry hardware detection. If it still fails, export the report; it includes the GPU identity and the raw driver query.', From 6675373ad457422f5aeff82fc474bad15a5eb2bd Mon Sep 17 00:00:00 2001 From: Bowen Xue Date: Mon, 9 Nov 2026 17:11:08 +0000 Subject: [PATCH 05/44] Show the Windows protection card when an import is blocked by application control ComfyUI stopping on an import that Windows refused to load (Smart App Control or another application control policy) was shown as a missing environment with a Repair button. Reinstalling the package cannot lift the block, so the launcher now shows the card that names the setting. --- freevideo_engine/failure_details.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/freevideo_engine/failure_details.py b/freevideo_engine/failure_details.py index f338a3ab..bc86ddc9 100644 --- a/freevideo_engine/failure_details.py +++ b/freevideo_engine/failure_details.py @@ -351,6 +351,9 @@ def _model_unchanged(tail): # missing file often surfaces as some other package's ImportError instead. ENVIRONMENT_FILES = 'Files are missing or changed in these ComfyUI environment packages: ' +# Windows refused to load a file (Smart App Control or another application control policy). +APPLICATION_CONTROL = r'WinError 4551|Application Control policy has blocked' + def _stopped_on_missing_module(text): """ComfyUI itself stopped on an import, not a custom node that logged one and loaded on.""" @@ -361,6 +364,14 @@ def _stopped_on_missing_module(text): and not any('for custom nodes' in line for line in lines[errors[-1] + 1:]) +def _stopped_on_application_control(text): + """The import ComfyUI stopped on was refused by Windows, so reinstalling the package changes nothing.""" + lines = [line.strip() for line in text.splitlines() if line.strip()] + errors = [i for i, line in enumerate(lines) if re.match(r'^[\w.]+(?:Error|Exception)\b', line)] + return bool(errors) and bool(re.search(APPLICATION_CONTROL, lines[errors[-1]])) \ + and not any('for custom nodes' in line for line in lines[errors[-1] + 1:]) + + def _without_ready_curl_diagnostics(text): """Ignore successful tool checks only when matching failure guidance. @@ -575,7 +586,8 @@ def _launcher_failure(value, *, zh=False, other_disk=False, disk_name='', can_re if zh else 'Need %s; %s available. Free another %s, then click “Check again”.' % sizes) return dict(title='磁盘空间不足' if zh else 'Not enough disk space', kind='disk', detail=detail, action='重新检查' if zh else 'Check again') - if text.startswith('ComfyUI could not start.'): + # A block by Windows' application control is not a missing file: its own card applies (rules below). + if text.startswith('ComfyUI could not start.') and not _stopped_on_application_control(summary): if can_repair and repairs_comfy and (_stopped_on_missing_module(summary) or ENVIRONMENT_FILES in summary): return dict(title=DEPENDENCIES[0][zh], detail='', action=DEPENDENCIES[1][zh], kind='dependencies') return dict(title='ComfyUI 启动失败' if zh else 'ComfyUI could not start', @@ -800,7 +812,7 @@ def _launcher_failure(value, *, zh=False, other_disk=False, disk_name='', can_re '安全软件或 Windows 的保护功能拦截了 FreeVideo 运行环境中的 Python 文件。请在其中允许 FreeVideo 所在的文件夹' '(Windows 安全中心:病毒和威胁防护 → 管理勒索软件防护 → 受控文件夹访问,以及排除项),然后点“重试安装”。')), # Windows refuses PyTorch's unsigned DLLs under Smart App Control; reinstalling changes nothing. - (r'WinError 4551|Application Control policy has blocked', 'app-control', + (APPLICATION_CONTROL, 'app-control', ('Windows blocked some runtime files', 'Windows 拦截了运行组件'), ('Smart App Control in Windows blocked these files. Search Windows for "Smart App Control", or open Windows Security → App & browser control → Smart App Control settings.', 'Windows 的“智能应用控制”拦截了这些文件。在 Windows 中搜索“智能应用控制”,或打开“Windows 安全中心 → 应用和浏览器控制 → 智能应用控制设置”。')), From bca69f2019b86c45396a97b6b2983a0ca1a19540 Mon Sep 17 00:00:00 2001 From: Bowen Xue Date: Mon, 9 Nov 2026 17:18:58 +0000 Subject: [PATCH 06/44] Mac setup: when FreeVideo's own Git cannot be prepared, the message names the failed step and... Mac setup: when FreeVideo's own Git cannot be prepared, the message names the failed step and its cause The failure card still matches the opening sentence; the cause follows on its own line, redacted and bounded, so a report shows whether the download, the verification or the environment step failed. --- freevideo_engine/macos_bootstrap.py | 12 ++++++++++++ freevideo_engine/macos_setup.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/freevideo_engine/macos_bootstrap.py b/freevideo_engine/macos_bootstrap.py index 2fb7f192..ea8a9192 100644 --- a/freevideo_engine/macos_bootstrap.py +++ b/freevideo_engine/macos_bootstrap.py @@ -76,6 +76,18 @@ def probe_links(root): GIT_UNAVAILABLE = 'Git is unavailable. Check the network connection, or install Git (Apple Command Line Tools), then retry.' +def git_unavailable(error): + """The standard message plus why FreeVideo's own Git could not be prepared. + + The message keeps its opening sentence, which the failure card matches on; + the cause follows on its own line, redacted and bounded, so a report shows which step failed. + """ + from .diagnostics import Redactor + text = Redactor().text(' '.join(str(error).split())) + text = (type(error).__name__ + ': ' + text)[:400] if text else type(error).__name__ + return GIT_UNAVAILABLE + '\nCause: ' + text + + def available_git(): executable = shutil.which('git') if not executable: diff --git a/freevideo_engine/macos_setup.py b/freevideo_engine/macos_setup.py index 5f409ee8..ab7f10b1 100644 --- a/freevideo_engine/macos_setup.py +++ b/freevideo_engine/macos_setup.py @@ -37,7 +37,7 @@ def install_git(self): except Exception as error: if self.cancel.is_set(): raise - raise RuntimeError(native.GIT_UNAVAILABLE) from error + raise RuntimeError(native.git_unavailable(error)) from error def component_tasks(self, uv): tasks = {} From 22b344ec76694f512c27d6fe03e5338e5765d1a8 Mon Sep 17 00:00:00 2001 From: Bowen Xue Date: Mon, 9 Nov 2026 20:46:44 +0000 Subject: [PATCH 07/44] Tutorial: change part of a picture chapter Adds the local image edit chapter with zh/en pictures, the image service fixture and the chapter tests. --- web/tutorial/local-image-edit-1.webp | Bin 0 -> 44344 bytes web/tutorial/local-image-edit-2.webp | Bin 0 -> 45404 bytes web/tutorial_book_content.js | 18 ++++++++++++++++++ 3 files changed, 18 insertions(+) create mode 100644 web/tutorial/local-image-edit-1.webp create mode 100644 web/tutorial/local-image-edit-2.webp diff --git a/web/tutorial/local-image-edit-1.webp b/web/tutorial/local-image-edit-1.webp new file mode 100644 index 0000000000000000000000000000000000000000..dee59486d582a8d1d6716b5aaa39765963d40790 GIT binary patch literal 44344 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 L;N8d-A<+K-D{HwJ literal 0 HcmV?d00001 diff --git a/web/tutorial/local-image-edit-2.webp b/web/tutorial/local-image-edit-2.webp new file mode 100644 index 0000000000000000000000000000000000000000..de87c9fccba9da2776e4f7268b7ff40ac82f195c GIT binary patch literal 45404 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

>*G^9bP31;Y$mdF4^x|3XZZU!fgHOv?A5?YqJ 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 Date: Mon, 9 Nov 2026 21:08:19 +0000 Subject: [PATCH 08/44] Return freed heap pages to the OS around VAE loading and admit Linux machines with 8 GB of RAM... Return freed heap pages to the OS around VAE loading and admit Linux machines with 8 GB of RAM from 3.6 GiB free --- freevideo_engine/decode.py | 2 ++ freevideo_engine/policy.py | 11 ++++++++++- freevideo_engine/ram.py | 19 +++++++++++++++++++ freevideo_engine/vae_weights.py | 14 ++++++++++++++ freevideo_engine/worker.py | 2 ++ 5 files changed, 47 insertions(+), 1 deletion(-) diff --git a/freevideo_engine/decode.py b/freevideo_engine/decode.py index 2f315440..e054f312 100644 --- a/freevideo_engine/decode.py +++ b/freevideo_engine/decode.py @@ -88,6 +88,8 @@ def room(): converted_store=getattr(model_cache, 'converted_store', None)) vae, compute_cache_metrics = load_video_decoder(base, resident_blocks=count, weight_source=weight_source, linear_fp16=linear_compute_cache) + from .ram import release_freed_heap + release_freed_heap() vae.eval().requires_grad_(False) if type(resident_blocks) is not int or not 0 <= resident_blocks <= len(vae.decoder.transformer_blocks): raise ValueError('VAE resident block count is outside this decoder') diff --git a/freevideo_engine/policy.py b/freevideo_engine/policy.py index 0ab19354..fc9a13b0 100644 --- a/freevideo_engine/policy.py +++ b/freevideo_engine/policy.py @@ -359,6 +359,14 @@ def interpolate(group): # request's budget. Cached or preencoded conditioning skips the encoder # entirely and this does not apply. ENCODER_HOST_BYTES = int(3.6 * GiB) +# The host floor for the video stage is 4 GiB. On Linux, freed VAE-load +# temporaries are returned to the OS (ram.release_freed_heap), which took the +# measured 1344x768/10 s anonymous peak from 4.8 to 3.5 GiB; full runs passed +# with 4.0, 4.5 and 5.0 GiB of RAM. There the floor is the encoder floor, so one +# request is not admitted for the video stage and then refused for the encoder +# in front of it. Windows and macOS do not run that trim and keep 4 GiB. +VIDEO_HOST_BYTES = 4*GiB +LINUX_VIDEO_HOST_BYTES = ENCODER_HOST_BYTES # Residual placement keeps the same head/FF/projection kernels. Full-capacity # qualification and its platform scope are recorded in docs/POLICY.md. This @@ -955,7 +963,8 @@ def _choose(hardware: Hardware, *, vram_gib=None, ram_gib=None, attention='auto' # The encoding phase already has a measured host floor. Do not discard a # preloaded encoder because the later video stage needs a larger minimum; # automatic_profile replans generation after conditioning has been saved. - ram_minimum = ENCODER_HOST_BYTES if stage == 'encoding' else 4*GiB + ram_minimum = (ENCODER_HOST_BYTES if stage == 'encoding' else + LINUX_VIDEO_HOST_BYTES if hardware.system == 'Linux' else VIDEO_HOST_BYTES) # Let a Windows foreground request spend RAM growth headroom before # rejecting it, as the GPU's is spent below: the default 2 GiB is taken # from live available memory, so a machine whose free RAM sits a few diff --git a/freevideo_engine/ram.py b/freevideo_engine/ram.py index 1df1d7f1..1516ef26 100644 --- a/freevideo_engine/ram.py +++ b/freevideo_engine/ram.py @@ -4,6 +4,25 @@ from .system import windows +def release_freed_heap(): + """Return freed heap pages to the OS; glibc keeps them in the arena otherwise. + + Loading a checkpoint one converted tensor at a time frees every read buffer, + but the allocator keeps those pages as anonymous memory, about half of the + bytes uploaded. Elsewhere (Windows, musl, macOS) there is nothing to trim. + """ + import gc + gc.collect() + if sys.platform != 'linux': + return False + try: + import ctypes + ctypes.CDLL('libc.so.6').malloc_trim(0) + except (OSError, AttributeError): + return False + return True + + def inference_working_pss(rollup, protected_file_bytes=None): """Keep anonymous/shared/dirty pages; clean file pages may be reclaimed. diff --git a/freevideo_engine/vae_weights.py b/freevideo_engine/vae_weights.py index 83a91edd..498fff2d 100644 --- a/freevideo_engine/vae_weights.py +++ b/freevideo_engine/vae_weights.py @@ -80,6 +80,11 @@ def _owns_storage(tensor): return tensor.storage_offset() == 0 and tensor.untyped_storage().nbytes() == tensor.numel() * tensor.element_size() +# Freed read buffers stay in the allocator's arena; handing them back this often +# keeps the loading peak near the live weights instead of half the bytes read. +TRIM_INTERVAL_BYTES = 256 << 20 + + def load_state(model, paths, *, device_for_name, skip=(), linear_dtype=None, mapped=False): """Read one tensor at a time, with no retained full state dictionary. @@ -123,6 +128,7 @@ def load_state(model, paths, *, device_for_name, skip=(), linear_dtype=None, map if set(sources) != set(expected): raise ValueError('Missing VAE weights: ' + ', '.join(sorted(set(expected) - set(sources)))) converted, loaded, mapped_bytes, streamed_count, streamed_bytes = 0, 0, 0, 0, 0 + since_trim = trimmed = 0 for path, stamp in files.items(): names = [name for name in _file_order(path) if sources.get(name) == path] if not names: @@ -165,12 +171,20 @@ def load_state(model, paths, *, device_for_name, skip=(), linear_dtype=None, map loaded += target.numel() * target.element_size() mapped_bytes += target.numel() * target.element_size() if view and target is source else 0 del source, value + since_trim += loaded - trimmed + trimmed = loaded + if since_trim >= TRIM_INTERVAL_BYTES: + from .ram import release_freed_heap + release_freed_heap() + since_trim = 0 if parameter: owner._parameters[leaf] = torch.nn.Parameter(target, requires_grad=False) else: owner._buffers[leaf] = target del target del views + from .ram import release_freed_heap + release_freed_heap() current = path.stat() if (current.st_size, current.st_mtime_ns, current.st_ctime_ns) != stamp: raise ValueError('VAE checkpoint changed during preparation: ' + str(path)) diff --git a/freevideo_engine/worker.py b/freevideo_engine/worker.py index 954a086c..e1670f6e 100644 --- a/freevideo_engine/worker.py +++ b/freevideo_engine/worker.py @@ -651,6 +651,8 @@ def refined_complete(video, sound, receipt): else: engine.close() metrics['transformer_released_before_decode'] = released(engine) + from .ram import release_freed_heap + release_freed_heap() # Keep the bounded file reader alive through transformer teardown. # Releasing DiT mappings is independent of the decoder checkpoint, # so both operations can run concurrently and give slow storage From ef6fd5b1c28e29e8e716183ada93097db56a0cb8 Mon Sep 17 00:00:00 2001 From: Bowen Xue Date: Mon, 9 Nov 2026 16:56:19 +0000 Subject: [PATCH 09/44] Editor Creations list follows deletes, undos and new results made in the Creations panel --- web/editor_library.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/web/editor_library.js b/web/editor_library.js index c0215c54..2ad1d9ef 100644 --- a/web/editor_library.js +++ b/web/editor_library.js @@ -190,6 +190,16 @@ export function createEditorLibrary(host, {store, t, actions, state}) { })().finally(() => { refreshTask = null; }); return refreshTask; } + // The Creations panel shares this page: what it generates, deletes or restores changes this list too. + const generated = event => { const video = event.detail?.value?.video; if (video) refresh({outputs: [video]}); }; + const deleted = event => { + const video = event.detail?.video; if (!video || disposed) return; + if (rows.some(row => row.video === video)) { rows = rows.filter(row => row.video !== video); render(); } + }; + const restored = () => { refresh(); }; + window.addEventListener('freevideo-result', generated); + window.addEventListener('freevideo-library-deleted', deleted); + window.addEventListener('freevideo-library-restored', restored); function choose(value) { tab = value; render(); scheduleMore(); } works.onclick = () => choose('work'); imports.onclick = () => choose('import'); tabs.onkeydown = event => { if (['ArrowLeft', 'ArrowRight'].includes(event.key)) { event.preventDefault(); choose(tab === 'work' ? 'import' : 'work'); (tab === 'work' ? works : imports).focus(); } }; @@ -253,5 +263,5 @@ export function createEditorLibrary(host, {store, t, actions, state}) { }); const stopUsed = state?.subscribe(event => { if (event.type === 'record') updateUsed(); }); render(); load(); - return {element: host, importFiles, refresh, dispose() { disposed = true; pendingAdds.clear(); host.removeEventListener('scroll', scheduleMore); resize.disconnect(); cancelAnimationFrame(moreFrame); stop(); stopUsed?.(); clearTimeout(retryTimer); finishRetry?.(); }}; + return {element: host, importFiles, refresh, dispose() { disposed = true; pendingAdds.clear(); window.removeEventListener('freevideo-result', generated); window.removeEventListener('freevideo-library-deleted', deleted); window.removeEventListener('freevideo-library-restored', restored); host.removeEventListener('scroll', scheduleMore); resize.disconnect(); cancelAnimationFrame(moreFrame); stop(); stopUsed?.(); clearTimeout(retryTimer); finishRetry?.(); }}; } From 3efc491bc9852e19f70f8f77f7789c8446cab342 Mon Sep 17 00:00:00 2001 From: Bowen Xue Date: Tue, 10 Nov 2026 00:48:36 +0000 Subject: [PATCH 10/44] Tutorial book: scenes and props, edit a picture --- web/tutorial/edit-image-1.webp | Bin 0 -> 41042 bytes web/tutorial/edit-image-2.webp | Bin 0 -> 41740 bytes web/tutorial/scenes-props-1.webp | Bin 0 -> 14066 bytes web/tutorial/scenes-props-2.webp | Bin 0 -> 14694 bytes web/tutorial_book_content.js | 36 +++++++++++++++++++++++++++++++ 5 files changed, 36 insertions(+) create mode 100644 web/tutorial/edit-image-1.webp create mode 100644 web/tutorial/edit-image-2.webp create mode 100644 web/tutorial/scenes-props-1.webp create mode 100644 web/tutorial/scenes-props-2.webp diff --git a/web/tutorial/edit-image-1.webp b/web/tutorial/edit-image-1.webp new file mode 100644 index 0000000000000000000000000000000000000000..35a8f4384f3607476a144e86ea39d3c6a1fe15d4 GIT binary patch literal 41042 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 T$D{V&rms>j9uqMf7rUsC*^Ghs|josGXp zuD@iP%&xPv#fQ&s-@h5own0L}mFa;0+qyTmRV*vdZ#tdKtFag-VMwkdQ9{`BU z1pK>q7rZU1v+uquKs$SY} z;kT+@Ui6r|@y;v3n)+3TVvG ztRD@8;8*zYf9oD&kOq>yLp^P!0(bqSX)*7-XL1h-(*=w_fKNQ{Sffat0>VIApuk7X z8pBBHf&RSz7|`}(^z-WU?qjOtpbzNz>ApO+HdPEP|2+D1{{+6|D%+n3bbp?BDSldi zARX$z)YRtg1g8Cgz?r8AAaH%_(jJ)W zCa`)11l~h@gi&bC#9V0FFXf{2Ips3&lLjB~>-k8)jQVsu$Dk#>c;4VqQs3U~a>^?o z91S>Rm5xn??{F!k{x>;Pzm;ho8UIt<<@xz~=tPSa_WMoz!jz)APwKV}>c~e?1z(YQ z%nBskUu}?`Yxy(}Xv8~4=1r-VPFb#vq^{Y1JU=)L$XXoag5eXy=Jpkz%- zLbNK*?q{g)U_Vz}xG+}D<36SNJ+`@0$F`2n{@Ad-F?vK|weo28tim8rjU)T0|1x{zL zLVG>44`sT8^q71!OLGK_+hM9rcKmEvWxaFn$oWsxj`Xb@$W+sBxGS3=~;?r^v@FPh6F{5 zW0UQ>1Iz>tLp>yq@{m#D+W+XD`M!fO|EDm59Zfy?SezktXMinENY5F6e`0!dyoN;n zA?U1PCF@b&>-nhWAm1HGTN-({7Y;}Ar<EHJ9hu@nTwIty@)e|Pah@m3&IOJjB zqW#?_GBD{0KS$WJhShK#WxJYMwLR;YdX-KkXwJRe7dYdw6rRU;30nL?IH?w%9e`;~vQTr!!mrtpZ-A8R4R zFarbQ=HJ{UF|;shjT-E1M!5^P{cYhyuCIh%zxuzEqk0tDIPx8zb5w|K)JKdAQgr3* zzcm~pe(34idNnF8LAt3 z_&NT=B@k&@^|UwqSO>_z=(UTC2NAXPk<;`5H&gaOq}YaDU+i|&Z0_&TxM!fgZ+AdQU#rVx(z6mpe%^)4@3n>bO}bJs zVuj!%6af}=NyU&Sj;}62+t`dR+9D>oCQ?vI$}^{rSD0G9d~=NL<+2;m#&l!~NhnPF zbvP9EW5HG^u%*tb6l_F)49l0_$hI8A|4(dRF}R+l0SJ+B0*nz$YW$elgN#f76ar=d zvAW`X1Ik;foG@rXDM4)CM(v_ay8ZrykV7ZX@@+!VON^ug;kKXOkaY3SQF~{ zcO1-zeGk8aO}A&ewTJ(vl1a{m%w0r1vjcy%;FJ7ZE{A*6PaMg*_tBooCPs-7@ms3D zoXrptW@y(ih?AUHUk;JoTpNP}dEh%WHm-x*jc)saLAOykt??+z2@tWJwi%wRoXR2S z*q8Bw$w8bd+U47ar-tc8eC%ivH)&}(x1Y5GS^Ali%?5Q($kgWIYiF9fA?atNJDEJC zP@qdg8d(V#Jv_=siF(^1oo0roj5A>*``9;2R7Q+U3|zX@Qjy^k&42w~k`^UY7WI2= zA`}A?1}%=#Tg_)rAi~_&GYd5d%7_G#fYI(GA3V^TmPWVzKHmROqV0WZKwLdi?cN@L z>S_ndxoFl*jCq%nz=Q%ZeS9}Wb~@bKeE~W&>bkNA{xrV@@_Jc7A)~%Co!s67SZ^!5yFupIbhQ5bS2`3u5=m}F-mEn+p&Sv=1B*hqh*o{PGif_M$VQ$4JYB;<{>Zfa9 z931YQYNIWE1A$cghYN?N$;yFj_4>V$;4gQ)YeUd!*1b=#(yPoz?Xpb3}OXi<(C!T2z>ma&!DjHmh1fU?ig>s(-Qv=t&T>!KNxltSbmv9wn71Ya zw;ToXm3t?mxea#64|Lym%UmrNg?@O*<0Oz?-Y$&&{Xk(Qq)A>qA{}|hUO2{oQdd|2 zg{Z(DZr2xTY~cP@6fDO5Lzjtch+)K8;A`smJb>MsD63I@j1SIsJNs%lP;|_)a>Woz zymQjDYh$i8*F@kRs&13Xg1! z;Z%!3khtBsdbS!x$yn|@4k8xcXuaUn;L?p@* z#gJED^Gwrg(fzp(_@-dn^>{XzP9{^x78~$5;&&&&Rn5$g6Kb||!qrQt#?&0EzZE20 zrAk8BN-o|n^moJANy`8%&COx7aWR`Jstz1eN~c`Zv*1@_h7QJ54SS8?@d5=vpP0B> zsnJ!aS4rejql@Pw$k%DBGabxSOJZ~YU5xOHu1aBGsdHT1q~P!71D~qy>qbBGKy?tK zq6vZ7>yXHlU4^HGND`tM$QNc-j3q@=WMSiE)%xEHdmbwa+TM7gYWL zRqxP%@Ta(yqW@dRT;`8)VR7YhoCp=@PuUK_+6{q(cRxw4BtmJDRhkaisfoO;F*|BV zneQBY5C&{(+P>IBXkvzNOd|~xl~8ja+0)kEg~u0=S%zPHsSo#DY{fJd~Nxb9<$yzUvD13 z=h;2fa!#6Td+8n9(!)?M&C`+2oooQ-Rlecn+AT99aw2uSUX^PXD-Cvv2z_uq<6isS z(M@RRwSID};C7hTOF<0IctrruOe7~<{m+x_w}!JMdL!LKTaPikw9uhS@`CR1>HE`U zzMjH^C}rmF6s&}hY$GA>A6HG{!Y6BD_E-aWH0rmGQiAdayJT`R#Ju%FdQGtI2Mzx= zN9exe#z;;`@|PbRWfw5_p9A8~vAA&hIM=xW&oaM+v`x?{PtM8|YF5;o-FTgW~QC_-vlsU4qn*d`B4(MS;W`|T=g%yR^R2W&- z&GkwS1&UfB;~1BUZlU(Kr_Sf4Ck%J*LL6+9H*W62w)~P}*-m?LK%NgL!ng0=J2}6O z2S3@`kc%R*Mq9R88cB8Rfsst}Nf7kI;(iJ_LBsI@M%Yu3Ojb$_h>xNz$#xKx32t77 z!;C>~E>V@js&za{fr9%U`nHK2c|B6pI^D&;RW7GjlEYrlTmzOMERIi>Fj(RextNb@ z_$)#fPmD*YAK8wa+jLnnN3wGX*>+e@B1}zr9@9^1yZ!%YSrv35Cb@Gj`obMot4OtF zLOb`iI_&37t_I2-NME7j&N>Q_fDxxJ4!4rL=jdiGv#ZAkIQ|92sPUa-!q4*cacusU z6yu^L8U;FDvSXR(Vr*;(I#W!Dgbjr&|3MK{;0CRfMAyw^O5C%TE#(EP;Lo}Mf2kGm{puP8ZN$^re{T5DqGbRn#|0hh}Kw2Ar5ii`N;(=_DdJsVXda?;~+9`{8nM z1sQh)#p%?oWc+PZ1Bq>Fbhw9er^raL?Y-wUpBDuEWG{E8M0L%`2wP3l-1Uw!Q$1wP zaFi@fbz9Nz*Q7m#UxPyd_3AKZv}}WMzYym!2M6@dejmR7l$wjBOQ40-lr_Y8v33Iu zDR=Qj^%OyOmdvO^hKvbLs))dTB6c}Lu}r4vyhLH~O2kdQkFlqxuLB2^V=RUZH{my> z^Y~p0JoK@Jsq1tiMG-VHO#G73WoZpAL6tY~Xg%Mlla#?}vDcCZ_Wqcl-wwy>7t$*{ z>$*g7jS<*_SNCtM8U~_2yk5vR6LSK@xILzfPm(pII1aLweB(h&l1w-B7r#~jmZuQO zPV$|>1t=fG^!bN)z1m_S2wahAS6Xa zBPYR38jH&tmbsDq(aBojcEDTS>MdDzvLbALvGfc?fyL&kZC-`S^AUdN$POrIYF^neIW?I=u($7SGzjL7=oUiXUlWl8OTwcZYSWpV=gsvyTVW z1nLigV2YZVM&XOK*&VrHS@>_!Rdl^6j7)9UGl=Tay%#u?J!Z`{>{kb!csau2ytlqD znpxJ0-0#6+ThmV*T^*~PU{;zIQx z<%hg1GZPg48lfOVFz7-F59KL%D7{8gy)ZTv(1D4*Y?xC?gtC4cwrqLicZ}8Wx#p+G zZx&9A9}{2}_n)0K-Rm_Z92hX&*<-MVHWtI)8Qy;t?nrt4@#?kD`lKsll%PN_bAEkq zrxzgc9~RI;&1PsS4a}7|Aui7Lx9Deoz-@_#;0<~d8E1iTn|8Cca3lGNCCisNtbIK0#0F zq-Bo*5(>G|c_DYMGY^QB(|$OU^4^lH_~noev|k`$BSyhgIV90>-mJt0L%>gI$H)6V zfqTlDqX!ijQ*k>^V>NPlGjGZ`i2c%AQ5-Y_-7}`YDHzX26}vUko>W1_Zf$YcOIsO$ z-(pC1?~X0Zit$05F?FPAUco%t7j-kZRy;ew?MBPh@qr?1g0XZuTV#gEADfMv+Hv`> z#cxCI)@}m04?-!C2T?TP7Z{5hW}MC>HCu5-=f7T&7H~vU6XzQ5336pV8glKTr7y*~ ztStanPDqdVx{TwBT@_nZb+ncAM%iZ6HSKEq~K_25RxH`r4;FI{lhopilPBW>-|#SAkf6pnfzZ z9=O)7eJq7!^;v0KP120|6g$IgPQbw+Uk*jrUKd8_d|s7o;Y1D2thz8BQ6%<3+OQXl ztKEQj%CD!vEtrp6M~{ZqmSeCDL^s6-@3AbB?2bY2M1Q^PxG~B>f(?*K0127iNc>CI zA=)G)!6KaXF1hk>$cYE0bOlyHJs4C!)8{ngG&Qk#)0v~Aq%T#d64{P?R;)`EG=Ne` zTzQFa4!v3#C9pXKW)F+i`vw=or4>OEsNZOlu8(XUu&>L8(8_N|2Twc)p)ylgg0FX? zmygrpRj7U+AuB4LHWkEGn05T_)>fowlMk_frYYCrTfu?GO`TI;*$U^joUZSi7`k+8 zn>AOb!B(Z*?c!AKEgSOV2Ddbo97{3;U+v`3&t&GEqZTGVx+Bf!s??#vcf@e$nL`IP z?0yM-bXUq!JeUaLBqOPfrN&+c84%wZb(}1XwQ(J?)kP!Z!58=q$C>%R&49HGJHL$S zHWcmoZ(EVZQW6G`CshzshL=lk7-0X1^bjQU6RcOt4jS&z zI(A`r`1j((K+J_Kc*N$*meOK|IO4+mWMbOzo|QJ^O;F!c4>Z*?j-0jjPA0TvIE|BDyIu65{hp)bWempfs?i8?T)DbGgnAe2YCm^( zu9ux2Jb#K+-NVK!H>Icblt~`1l$SW&=%N^zYx7vh!Dzj+z0ynk@pAr2PJ%nW&n%e7 z5{4**u;E7YU66}o-|!G2mXNnzC9q4oLy#e8ZO0sxk+>@aDW_uz zJ^Xv74XRjsne_(1at@yKT>L)zeKmO0){%r-@4U!noKS^po18g zkPU%d3VP8{TC>K$3lJu15OPuUD7;UW+{dxUpN;rNS`7n8j*53J!rRCUyV*!sK~png z0#BH{an&e{!Q4er7Xv;E;n`posSq6o*BSnF5h|(1FzgQDlsy#Z7r)VPn@lQdN-#L%-~HY}?7OgO8#xk$#%e$}hu zUW&~5O5jOhrB9tpNXPE1uF|UVUZF$EXxbjibwmhrp4E1kYZBs3% zKl;hX>h<>F zAkdz{<^uk^*lbHFJYftfbRu0@f615Ir?qGvU9HM+dUtB;vMuTP-?7I40ssh^lQ3wsa<%iiZ}GnMR4eQW|>+Khm<}v4N`M zpi7Hb@;nu8#6$vHMgIOj$0!lK=zoZbIrZ^{%rhOzqU_EljupOk#pSOW3x+DFl^pA6 zbAydk`#%UJicv3SIuPIA; z3GAXQ@&4lBFK7G6KX+*RZm=-eTv8NRFm&b`!kCF7v)nW<*iBZwN5~4y3h6~`Bcv=p z$4UoB9EP%?Q3PWt;`XT2T?rGlbi$d09Xf(a{-tH-7PeIHu~TXlukd<96_$%z41e8f zFf>1WPL#>V>-{=(F{6koBk}3jA}7iYgP2!8Gqa(9$8m%3ejKU>nQ;I7YfGuLMi#1N zo@pq&L0Ga+zN)LUSitUyCB8;$1Ic}2G6YN^xdg5j_2NTeEJVPs=T4#uamn~#)&E=k zQLCIzz}11Zoh{Y$sbz^4x0Cf%!hSa^Xiyy1I3m-T1V&QJcc{_@Ys8`Va* zMkyHYuqy^q-DnWYF#)EgJl!B4Xcg524qPheL^TcA=%%OLhVfh8Ao*)6CqnznsAD^p z?X_=xIQ`6=_I~IyCJ{p5^e!<=?Yd!u``*8mYY5Ae*Wqis?4uYi=;ah2;1EoX19}Ss z>T&z}vR5`h(tOT&*LqBPK_ufNQdrZ*Emmusr$@C*U(C@pn?E8)LjOIqR&(903$ZN@ z_dxJWMuu}ysGKZ&g}1Wz`1Av=YAvfVUpnYh_GG+@deO_!hJ$APjls{@*gUWq4XxSCPW&QnIin8}#do9U#7qgz~(ROiin7DbV{Kb zjcIs4@k~S^Xiyky0>DO^Hl=LipN;_Ms4+EJ%NhQQnO5eVe;&1T91?MmFL&|Bs+)<5 z8CMCQyyuS%^L1kcrhf>#y4FiI7oWa|c?T^)L{eyAiT*fCTab&puBxEkE=z&WBqCce z&s1;k)CNex*`eG#|AE}R$EU0=(#1U07NDgc{MfPflNDjE&9)Tn4W>VWubZcR*DlTp zx&VQvqdseDl&BnfNxq2RP@LOaMw*ZSo(F%AP89d9)GJ)&!DY3Ez>5a$kbORz1-~t1}a#>lt4!27C)+jnm;=?~5Jm-7Cr%?60wj zL_qP6j*}KTYUAD|zWo|717h z=WOENX<4gDF3c@KUvJQCu_MPE3@vNG3}e`25>L!Cv{LeEx6Y z@`CFxK|7f~6z03)nmbK>I{W_y#r&URXzJF6(5qVhpO-r5#_MF`0D#XI(wD@9x*{ma zt8ALwGrjJoSDpfiWB=C3cT=WMV+#MYiLkAKke^+X8H$tei&5~D%~Bowknh+XzBGf7 zq@j8Nqe(9(=Uy9k#ICm_uH45%mWCrshRo3~rq-P9B?J56caR71m^Y)&w*h9Q2)haxn}0Cl zgFs-QB2UC(I^zg=Un9t?v0Y|OC!%N_;{+WC#RGaRFgrwO7qT8!jG6p@)58XZz)2D} zEef23{V+)SsTg3sycZofkM0#mEflo#6(Tm|D9M=2i&I*eSL-gH*8qk~REE6*A^3Ng z29jM!k*VH5btn>%)MkxQCxhyz(doi=!Hf=qKN4SU?YwQ%tRpPo5lp@o~wR*sg@~yXzS8^hBR+1ND=t#EHfj83Wca$^I^TV8!+L_|P zz@T~7NzMq-ueQL0(Lj6R=PrW|n4vE*9ft2_#H^4sYSc2DlN^%NL}D2>&xrtOlB?r< z4^E^~LpkeD&chadRXgHGJ(IxaDNOOzzE%W>&B6zQA;2N0xLr5~q(zXj(zUi*)`HaZ z1XwVl@L5uLf})lOx}uNe-7!FKyBb7rk4HvivfOc&*czaoz}LQT`oTY1IihLQN5O&2 zKnOE`Pd!4IGwc2HfRXz^>R%&O#@G!{yH}d>LkaRN$X71;%1txd_G($wn$bdctTIz3 zp~5XrR)D5RVrfzHjV&zLel|w3z%J*dOlvYAdUr*XFTlqk+shZ!Ebqvoz`R9(6 zi0hg_R)_)CsT=L3ZuT%>Z=rmb+ZhwBY3A77img^l6yT*5)ew)j0QjRj5rB051@iV#-@Iam2e71dgy+u$+2`@^W5TLju~J(T$k8U_4NX4UcR(S8AWXC{lN=tON2%rnP%m|GH;0_820SF&z0>}JHy;`E1(c4isubu+n_Dot@{6RNwP@tWk)-r6 zCAqt%a%n&0L<&Yndac0YUss<~XD%0`@WbF;6?HPF+E`Q~;6^v@zM@91|Ntr#4=gVw2g~?q5TZ+5HeJ6Fo zPku#=esDppaVFigG`f*@V;d_G{V8fLeCGVIwyM$E(N^M+ z%vU74(BBl>Vt>>B^#vQ5lqya!yw5@M?8PX>3{Ltc$l$|(8;N1ueuZ#Y`|>NH2#&Qi zAN;ookTL|$?x!qd?kfbUBw1rdYljcBwrGY@hwa>j7>RvRsVK5I{7iAyPf#0UyP|~Z+9x6~IpAwjnfNm@GS3ObBOGfyYhhoX*H#Hz zx2;%&NyQO&e z!1f=1mrJ)w%%?uL&b7)k$IzA}D=#qJ-)Bh`);Q{rm&wM-!Si&e_IT59Q>&J&q!NC2 zdm^WE3HwsHSP);zKg9R|9JKJFpHoL+G%t=~GLUMLtMNLsFc%CwgxY5d);F|)G^}3l z$|A$`2U`tbl{odW{H82{{WsVFLEBv|%0tBU@I|mL7!I~tl*Z>|8=bSK_cjeKA#`lI zvTG~@ZMHVm9o{cRH-)(KT*rG9pof(Q@8+^4$4F+!PpMg|g>L8duQ@kB2+jk=bUv2} zs9P~}pKssq(kRw8vy0+Zmo=-(hVEMVhx3hw?8(nw7R$=)0DLqO_q%wO3MO;G}dPeEotSO@_Q z#HMms4GG~t{euT13LVc-d2gbUj*lI?9wJyFTd@eOqv~@yQaeFa*rc~W9l|Qgxch)F zWdML?){V6@z7TWg+bU(~%jwHal<+wM7SaRm!6pJi&6c232(d@HsQ}iWCv!-v-?+Qi zL%CJx_AXtOmC|fJ?nzxKQ;cI1tI!o}i+F5OxSB|z4BpX`NrL5cW6mV|r zkxAq`-64^a<$Ae|2-9{}i_wUc^F9rs6(&c_vJY;~Mvd1x%dRt)gyws)|GE}L zzCkb6h?jpVv#_VY_0~M%Cl}F)9b)EPnt&FTgrGj`r@8EqNE&XC=ELlGwEra&T(OC= zIjxpo^~hY5U;O%(tke!zJ>^qa`uC-z_3Z=Ib+XiVY3#z1ClYcWTL>TMGG50sjLB;E z7i11M-1-shmFbp}zlJo5aMZs*qIm@~EG(?(mqBQhqNj7O2VlyT>1@bb1xOs^E1o4) zCB{_Aj8a84U^Aa2k3eF|R+mXs(F~uL;vGD(a0IuV1vS@Q822COi9LQEOA3)fWuzesLcuT6iPk`}3_e?%XsbbwvR zQOE=kq4W2=(s|3goknK013VB!119+{x`?Wwk%Wj*IrfMLp5py;SPsG4D`ddMf` zV%8hnr)V#WBR2`l>~h;3`(99{f?G{7S^t>d^fB-ru`l1N7na=f z8o}TSCezY)>)iy~S~*Ku@aHdtU=OFG>?yI1ULPBL)pvK+G34Z57HD8~-s>A^zt`Mk^>WYXYW+bZoy0VJ9==u zAu-z#$-VPR{yBH#VCJX_&%+mz4{!DFg9!k>@4b}*-iZ`5kG)s?Bck8m@+egK!YVvE z;dio(R3mibjJ;yYiAKxK**Th<26I|Vb4RZai|R@^1tEoRqhwO@efLV9&9zfV?7OrF z+Hy2gB4l8a2_a|0iR<0ouxmi)PSIM-RNGC~Fj zMnG}7P#}fKv#i3VQ95-Z-HGte4FF5WHEfGxnG_m&H){ zlTJDF6-gD=FXRT8quQu{z0az+g_5{8uiFpWI#IVzHhL%v!+SF?U}Fj(%-4PrGC zm0LMmZO#(9*X#QYg%*P3dBlPa+jH*ALj9=`5QEdFf9mFjxVxsu*&hT0zia-C@0%3* z@Er_yD8gTn?xaCFQ*VGol^R8dG2OHgD){Y$Cg!Uj(Yr2g$#}d>XfU-zH6wfT+4L4a z>l9iAQse4>E$k?Pd23rr0eu;S>^@fhh-RWH)k!}7;1x`JnoGuWMy(D{vz?~tR7mhr zhj#Ue-3QJ}D~U)wQT3V#%|Ea!tHI$cwy@8Yk^U+Bf*zX9>H#ap5me!GXj(!~+q423 zUy~nm-*ZCjYwqJtsplqn65mYBZ3vwE`^i2Kt!|k>5Q)ZHLzKj!gfSZ{&#G2?{)UbS zUE+w}s<*~B8LVw}^1+((j0W=d8LxL)fMgul6R)?;6#&}0-O?LQ%c|h7NpEZxnU9M#v%UrMs+kG&Qte#K1l$rdTnJeq-mjY9ufL?*riwXD)Jq)WIYwxo$XwI38 zB$rprnLLIAQyu1`4#3Z!Uoj_YAI8J{9qPHwN!ND(y9=WZcY9pEG(T5RV{1nOJyaX= z3h2X0f6a9E(MVEa9p8sJ|1jA#^;lJ3B&cEls#eNbl``dBgTqSN%8q+!1TVMhUx~hp z%eC*9+4c@)q?hGwAu8nn(%&?w>Hmu0CjNcf_u4O)W0kJtv^)x=*B^KP+x1t;*eSHm z=AUr=gYMr;-;Bv+3kc3iveh?wQw@gnmEQ*8f?;DlAs@iIm%i2IHPZUMf3Fs*(X&}< zyrG#zhz||~XSOYBo@d@BTI4`%4)s>cK@)~jM>7xwg$o%K3(w6nW$$z}zaTTb9lGgV zQQaM%rQ13cj76o6BJf1S3nLu8%Jy59lS1+BhX8*>4%Lqc`1;bQ+cABCtx@i0#cQ5X zLb$jXiukMiO8iaWR;PSPa^}438wAZBqhE~@PvK&n)+qd`&;_NoHg|W9L$MiW-s(5oOGA$LU60^^e3l}+UgU}IZGdKI zO+dw46iUiX!-VXne-v43DdI-9YO?V@!I-VQ-N+=XJ@qu?2{Q)N>@Km-qXdr(6T#AP zi0wonTNc=`RJFcl9>+HG_T_B_iy4fs{RV3TlGAh6b$;s-;ZpjH6rk|gNM}d~>e+*= zSYrBC2j4#J+9l1={)us(H5O#^{=$xUTAKs}@42?M+i@pY-(22v#r1~MF0z+rMA_vB2|FHOz;;7fT zvjk2F#QePIwZVO5=SnD~oRe4c?E4A$^C`rU&Bgh$U>lEkW`y1AcN=ex1HmG$U@jhIoPx^#0-LRH&I#?LFM0>v! z*|w@nd3ikjg1nxBOGzw4Qbwqpw_Ca2#Zi2=#@^$9N1cLVwY0Nr*fI>i?AOrT8CqQA z_<4@zkGZgka-$%yhz8B3D-UbWG+U4moU}UBv|7j!d6Wp|6pQ`m6~rUGS>HJai9KWl zT9~(GNn`HWR(|!XcOv<0e}U{$2f~gHn)6oW_%~Kh zksQnv&?K~mDE@P7Db$}~#de$L4VZuS*ra%yb^wTf>K$VBu5l-S)|o*}8UPUMO4fB| zp&?9`kn9l^cBu8|2KG)|lDZDVLxjae0su~S&w?0v_*G*dchPUAE89cU9JwM2m+IT@ z#1Xht!TzRhJQvHzbQ>j@$()Gi0Jw^>1tMACslXGs$fIF>zzyk;C%e!cEiVex?^eh|Q@9-%#+9 zve~ach7;XG&=Qm8FG`?u+K|WHxExPa?=syOHw*Mhg0Pyz(igI1{6syQP2)%X7~*rO zrxrOQozzuv_jVGoss+?cdue1@>)*BCTh&x5|D}>`oNT?mAH}0-CF{}kS&~;qY(Oq5 zY|YS*@}%y>C)C?{)&csbVU`@BT2{qufELNZc7&#?$P}yq56TpDqcu_(7A#Cof!7)u z7Esy*`uDf{LbIKpK1fOihMK1&Em|n+bB^4)I7m07DEKYaXrtrA`Q~&K?RneF+)N_+ z4-(FMVT;pPF>ogY*T%pu@N6Yd{bo`U!KXF_YJIxZk)TLv!4mx7Qu#3Bf?}A<&l9~_ zrj)y20}sMrK;Pf9xZ&?39-XSz_C99#aorE#PwFcDX>s6D1Du8?x4qg)Tcvc-iSCZ^g?7@;7&sS_#+&{m8h?pS^7imbsqS;AmAyw8s-NR(@b{MypZQtC7@UH zX}$50GiPD!XbSiF!FugR`zH}R^P3m^DsGXob-(n$6@O5<24a2ZP25t$$#(=ijzxD5?}g{8&=mJ6wDhE(p3oWc=6bCdCRwJfd0eFA~Ux%5-mJeaD~=)BR*RKoHJM+5BSW7+ly8w?E)=Xt*4MSIi~)eCu26kiyzKZ3 zQs~xU9C4QmVOGfW#Dd^htOHkux`}dhIkN4tpcreK2ArCeH|}`8tQpbPjehny419#U zI!qa*ure`}jh_YSv43gN%x9+Gx;M13(`s5kpFjvOf_%T>cXZHc7+y%kPi%xFVDZD0 zhvj!4#J&JX=p7I1m9K0Jg-tW$5hnT_z+_9y`h*$AewH+m+|9Uw>WELU?b!*OSf>6O z!uon3) zzk&-I*z*YyRUQ}5HuZbubO7Qp7Dk&ZO+T>zNT>}A%=P~lxF~h+aa_L8S2Z=u^81^f zczF!{=Gpxa5M2k&dVZ@gC=0VufGYYD6G(O+H)ae`4mn`;@^Ikg3YVC#S)mn( z^9i z>xN#ysgS%;%UhjBM#I~BKOeROOA@&KxtRx0c{&tT2x+A;32cj7>EO|sF^9hO5#mK1 z{G>YPo;A+Pvjl!Zb(a#n-Xac@aB&SaiK$%0U5w7_S@fxFR!GoQUzlqa>bXsdA6yqa z>Dyc2L8h#I3W(iYr-{N_3VwU15R`irV3}PWmLO@SoJkBmt-*2M_}9yS;B^TMZP@r| z>+LseOJ#QqOh3ootE4$v?NFcyXXt8#4nL071A|}Y_MHkY>1dh2q8sqXgxf;pX~cZH zWpF3+uiGWo_4<}Y>5;&w(uJ{%Q(I-#2PR13`6wvWa!Xh4&c7NuYBmV#gB2N@h*Zv! zYQ{CsKQrm&v76{89e%4A#G^p>ssv^8RsQy$`ChT2Z^{fN&pLPWD^*6DjuYbEf$$XO zQ!g-xZ{=?wc~#|`ndb{X|kYGK;Ax#?I-3;W_{o87U9m7V_!3uh~cbiu0I z6}%NTs|wtPGeIU$!4xhm;&fNW9S%qmA>y^G&Mc#&7J_{@vsIrr;6~-MIF+&?!1veGvl5z*= z99H>zndBnijkj91bj=3()@ioovYT|>Y$J7vX_-b8AV;fyHeBSt)k*N-O!TehtY-7! z6_(2~fHp^OgkRyp!*d|yF+N@USQ8kjlq)4*r?Ug^wqkl)#s2${Hfr~GZ*|Bl^xnGB z$V0X7I$1O0mWO@A3`07azrJI57$j*%*lA;POW|++u)S8RfwMOctdURg(U=suxuN2~ zqjPK!b6j77dOHB@Wn@8YT$Hd6@xc3k!FT{-{NDe?)HlWovNc^F+nPCZY}>YN+qP}n zwr$(CZQK6lz4t!Jw>sJBU!8QPch#;{tEw|hAnnKCy75d;74g7XCc)zTR# ziA2xT%P9You9)TqUIp_WaG=WJgpuP4(HO-ME}2LxJYg?y1BVDCXZdoWJ5tG!qrrR4 zBJ7jO@KfjKalQ*h)Jbei;{0pn9{jE`&xqf6=DOl_MVYy6zG;)8 zim8ki^Z#Ds%YvqPmea2&;4uGrYQ;Mh+WuJS*|6Iy5h0YCL?EoE@i8bno-MKbZx;nW z*dCkt(hblx8auz$(yZ=Yk27=2{N47>^kH{R(@Bp78}|=w#)y2v$6A(|Gih=?5mL&H z)G9OJh3i|Q155IH`I!}61>?&(Z=S~r z7ZfC}zsh=_jL`}FVSl|*woLLVar$X=m0eiwH$qWmr56UVv*(ACuvmCWDUExBH@Km- zPjJF7X*Xrhuz3PS(0$7|*E!PRVv7huRj5Sg&AU|pLHKp(=Wg%X?CdCNJuS0Rb@D}H zEWS@nDzpV_ukiytz2Zr^BPFFH1*Se+ZR+26{nKezu-5PMU{QO-1#|7VANHjL;|+c| zi(HaGtm5QEvW~n793d1unjHkR=>_KKneGHuQe+aE909Xvj&5XVr?Cup7S|pNJ6r|Ly@^1k?jRMfkE)T&M zJCGEF%8PPow0Yzj&f`SFcP%bD69v8^0gOww;!sG_v14r8W$@4e2p#GsI^qeu-6xqw zsysMl*z`Q!Errq@HnbD>dA9DQaHDpPHA6JdvC^%xcFcC;NXa7ci9j`XaEY~w_+J0k z$cUuQWDPtfNm)iC*J^InDeC+}fbGZ*6c{mX;E&`X!Gcu=m7ag&tqqzi;JsRCcnd$_ zCa4YHSC-Na2|diy&X#)O0}eIS(Ln~ht%v@1=YNKrTy54)sC-_*d#_vUWaZs#UR3MkxNGF;()j?Pe2MT*Z!;4_*=}PH=n1n)rFUO$e zSmRDTgy~D&`4-wWm1E94B{4{Nqch>`*Xq}^mxi=44GKl6RvirmV#criY3mXiTdmL0 zM*GIk`- z*|mGP8<;`1p3OZOD#sxS?5v!h|G_5ZJ0HRg*;Vc>@XM~`fmvEsBq-x!g$Wyt(omIP zadVyW$r&mNZv$*(Fh+q$3h56Kq0`SrLbDOjs8mj^G~hgyDbbuU z%^J8)F`39r#6&YHHKK-zyqg^X6L6e4Y6CL(j}I6531je|K<(qlDGA>jJ-(iSqSAHy z3-SUgd%`w6EwILE%;UHl;NH%_7@MNYCFe`W3T=*;x}?Wo5gu_Z>UE)C?iD;{Mr%N} zK&CC*@0dLBAedhXU~3y!p=$eFpB3Du7+xXl{zu=;@4bm)$c|gBw;hZi92x+bHb+H6 zJpY0Le>6?wTA}W-^!y4tej}ej3eUVti74{Y&{T-Lc36R>ah&1_<~*00KiZDD!{Z-> z2p{0IfyLrhJk_r7rT^>bZ8QmTq73c+1MqSx*Q^V9Ci{#)b==@IcgR#_L z^zR`K20o+BIPP}>$z5tqfM>Vx)Owq|0Ah46MAai2K5tCaS(gb}(}}#m?Ifjz()lRd zEj&&>l)HB`GgRD5WiR=Xg++-=4hOPaw;Lp{zIX9sEuSiX=~iw)9p5Z1K=chU0&p79 zl(Sj3cfD^QT8wlQ1pDkCtCtA36b8RBsudGvff)_8bkWeRS@D4oh6uP%vawoBa?W&N zGVglb-gubZuoD-1VF{R_pD8_jAz3pZ{87agm{8yL>xbEe$3{7-8TF8jQ1L2 zm0<0%iXMF38a%&kIHL?c=cb1Az5cXLVjD|oC4c3)x)WuT0BXuhHMKtXd??$wD6Il% z@i=b)q!xIXx6kVLIHF^F#~B(?fMu&|QREQKs%bEjMrgGDjx}x=d$b)r?bOTzL;^65 z#QQB+rauyGvr(gJ=SNPk{^Kr$pf9W5Csceo*CauC^D)MOJ7oOia=Fun@v&kx>f4>y zv>fI*=5M(&v0Q2+=D?*3003&nGAp*e)0#a8)(vIRzU-QBkIOH~p7~vdRnQcPG5!0M zmN7pXC$DmrK)|KJ=j6+IXVU3qN?!!9ao`A%iEh?L@Hkqay$-OUYR-CS^C4TJQLyGs zAQ2W5n-g9!b~&1D7&@s*$WNf-@_Tf_&8x0;ah-o6Pw8CcCus(iSfDJ4^DbwR|BQ`# z`ycG|^D?&OU=M7>+AkFX+8LmInHHiA2kK*o{cIA$z+9)t*Lr6?k4$|A4KJ82#V7OM z+BGR>l#+xBWrA(ZofaRoW94*H;V+j=<*m~jfA??(6Mz)kw5_!ilJF@T^OH12^5)q# z)K4En8(_E~E*m>uFc`v-+ykxE0DMKQcRB+WZfPha{LsCp?yIkIS`aZm@ENxuTNXT4i$u5YQTLOVBM*E;hd2NMR28pHdVsHr`@Da7v zz*5e4f9UZBv=w6w9A_{Sb3&xxd_8$0E!}E4yW3pixAkr)r#aPr-5R@5xf)duP3{ZP zG5B~%rYFMJh`mpd`2Hk7p8M1exKRnNd(D`BeA;FHLQ(azwFWu!XJgZ6rufeVh5R3( zfg$fVQ1ZV(jSl5?;ZKW@0^xw3`4I1xk9Z43413}&Z87-V%q!3c*P%fNOqPrUD*ZRy zHi=5?QxV7BUWFI&H>w^hi*j^nFfJMWkEo$ zMZP6_{wfDPB@bf!C?yU|7JvH?y8-7v zx04SNtk%`{z7*lH{lq&pDJ$4@AWC)0zkfvt+xE53t}^Q5Qbp9uD5VHmA$%}gefHmh z46kMoalAk$oTr=wfYAef2T@JzHNdcUf1 z{#44|ul8M%_VrcG=AZn`s5b(o4_q7Ofi;@Q%|&Z>>$3f`z0>z|A)mv-BrNa+_`sKJxYzhmlRQ;oAGA;cpljk>aAeA@ne? z8?PuJeOEb{*Y-qg3w`Z4?c(T)v*q14R9m%+QTxNGcT0$8d+8kh#Jo6+CdK{^cUBxH z#zfyhm|f|V@>)#@iuV<@GmEr3h!!Hc;~tGt-UbS*5mAbR(nL=yW%Y~lJ%L4lnyKZS zhAQNybUGHR62rOA>()L?o7$-A?Ws~TiDHfj03vZFxh2QPU^LeAqEjnGmxh9nQB&q3 zTy71gzD9qXp6Y4;R8gfN7hq8fa~yK9+&{djz-)4--|-}ofxp$5te!&8n(j_-{~x{) zRwXQZ%cjfz7TA-m%LEjH!(<*VFC#iGW!}v&gopK7+*01>Y@TZzF}7J0z|+SwISl%9 zV<|~kIVzF_ha&``l6@~Pc%46ACBblFm0vjwPaO$5Jm_0cGgrMH*$5|bCxv!a7NTC7 z9e@aK`G_na@blFxHKG@IqMMc462UIgoqPE2tJVoDtuQgh3$$fL5!=$5{}iS{q|r9< zddj2>{w93=el=U-#$C?@VzNsaECnZUN_9--ONT`*V$SQz^iuPVb8D6yWG^)+(>xFP zx)4vI8aUHoGfHGG1?C2(85X`ka|Au^M>4(mJ;J8G$I1S%D5VcK(7*XxdWx6qD2YEF zGi@n()ynyhN6uB74_SWk_|RRgX(LC%^K=v?UO#kb`OxyTN{Y`}uctBM1O&8mnKAEpGYR%t)_*cGIHEF8u7Xek1rf(?J(M zkP_l(^Nsq2@hNNUz!F<;3vzaIU7msBUoCnxSK;MP@#Fq!!kn~6Ov;BbI#=yImV}zc z*@#U3CU#19of(D}&MXOUih={IkCa%mA3RNO=y>Y_@@kUJx&nU;wkkLN%?1MKeni0C z|168sNtJO&P0z0iRm@&=dvrxjS<`R9MkJDKHWpq(6Pvw#-_xOHj(j5#C2}FFe0QRV?02Rh`p@K46XGc>#!< zS>fMYs}Hs*f}Y*43>aC-?Lb1fMsx`_W_J3Gm7Vf0$)+2FaMjAL1wuyikTt=C8T{2V zNdOS(zqSXat3qQzg_H=klk8F-7KWvXr)L}G(8M=9B50GCP{&H|h=`IJH~z#IIq{)B zA%DWmw44I##WFvNLxbU0z&Zz}v7WOdZXz-* zFDf76JpLDZGa`G>%?H{BDx~x1*vrn5K0n}CQ%{bhXA~C-i>IFoHtwH#6vb7quSX6} zhbX&4Mm0{u@7FN#!EK`D#&ncD!;rn53R5tSi?bRWpsYnD*1JS4A7mKV>_!uOe#`UTE0^miwYAGj-r$OV{_QkWPhw~%DL~upx5L;y$ z3&!jiE(f%x9wO^B!?-bNX)zXjtNK`k&58`7_BKiZsiC}t9Au4UM;EH!%TvC)UG5E( zRxXmRP^|z^NQv&wB;H@O(%LSmkB)}YP#CkK?$~ml{Af6|ryo~lkMuuV^4c#AZH-xu zw@VUh=^#FpmoI7A1BnLdjlgdk?oUL`$BE1QJ6XLC+Hg9{lT1|~$vq9_(68jNsl)V* z2~S%@vL}#Ro9&w$vMB=+$u9Quc2WGe>=)b6bQNM^|FVhJ+V_A`OpZ*al*;!pw=i-X zk19qYlxJHt;R>pX@7_^+#aNGzwwFK&Q}KaM?Y3tMGwM{-oZ@}(KD z5O{ll8PhBSJ{qCraeCNsyk`MOOXgNZ_4T*wa~cM7l`o{y+;Q@0b`=LGe?Z}^6fS8e zezYoTG90U+MKsqgXP~CSGS~(31{U6R<@aT@zEI?6R3^dyiQf=LRsT}WahQ&9n&y1j zpJ~YJJhl&YdnKGQ_^qSau1Rqsa5A`4p5{%+xj^9N@RTkC_sofMl=Pb@20MMsk1Jw~ zNQ;APJhlpl{!#(9+QrvI7p$(y*3QH+6q!z^=Yu?2M+OPYVtG(MSMD%1(9hZBH`G+# zu14c)+nF_0H>)Cw+bVNM0WvTf*!EWL8ozf-m8~F}5%bNiL5EgQI>AB{*TT%jY|-RV zh~Bq)h&j{4UEZ#D|DH#~X3nQMO@Js~!2|QmY$?Qm6OsQxHt~u7Wm9r;V((;XlTC6uU^k-8hIgV*O9# zrkfDo?TfON!Qq(T6JLM9_+zYufe0dP)&$rETn<*fUsd%4LLR^@b<{tPH#sXn;MvY? z2Yj1&8v{_D83?xYp&7#r;mm2yVMZ155Ou9UH~W)aX`HnCIxc*03zYv_6SKI_7^7!c zhQvEK3(O+Z$#6GUk}hxsMf#DVoMt;xDI)70KI=b1&ZxLf|5mtw`77={0T1wQ!jfJ= z+M(NVVw6Uwk5_k-1z8>Bb*f1lT>;JvN7W&Vq;StrWx#iQaR8k8KMcLFG`1qkvwWH} zWDUsk5C^~58sa?0oih?1uUeh$Ma`DisNpQ{No9uz$OheIshgBvHwE7TJ}g;JdL^(N z{us0JhegQ+pX58$n?Cm*zfXjx!`8pJ^c#pQ;qb3v!igyW9%4i_4|I!G`L>bAHyMW8 ztTOh8)@t!`?oyPM$Kw@7%yN!j34Eo zU-z+XYur3&Kk~?-_)&v2DeY6jS*lqH!;fp*QCUKG@F8@W+0P?3z*Nc0KCXGy+*&%U zkZpgN#A6)=YQFEqh$50+WJrjh;PNOuw=q8X z1`LHk;Ov_h->FGEa90k7W0OqM{PUguE+ai*{&sC2UK-ufL2h_Lns-0Zh?c2S51X=| zEo6RYtX3LrWm-duufK|Ft-^Z{^>&maA+=QE>nfw;rrtMpWfA2q9;=W7cYwh(tq{}KoEl=;P z%rx*L?WZ1dE1kiVJQiQ~53HehZY`OOAfJ5RS5%u{rX!n6mvNQID;9d*sobI<7 zVg(0hrM^+un8x?kBD!H94F&6k!3Gf^1`aWV;}3;qbt2x5JRnFZ+~C<%zMz&5lH9{^ zXWLE7i$4GUpTm6wZi*zvrY1t{BTdQNg_q3d^}86OU}hlgIXuUX0f8>on` zL^01KHit#%nIMz2B?BW4;B^G>PHl(RJDRqys~^0t3gG;_pTlNLeWt_#;S5^B{aBPmYxH$AOHuvnf1_qTWFt~gJ0b9Mjq3MKazeoXK?V+ zhIYjC*oKaE)201ULns*uNbwlY=)`MW^6a)!#+X53Cfv^{lGbHs$^Nr+>bi1CMMh4# zpQeEP!13<^#m2@~)lV-r55MZEVo*kN#~kqVAtNC?Xm>hU%{`(y3hhLr7-6Vs!H{v? zwL}d{9l!i#$zjQ^ijno%)1n7{;+{Lukv19&f|GedF*K43(?hXi{1NURK^?);smxMO zzYPoew;wZaZ-8UTz{4P^=Wj`6ZmYw@AxOepN(HM)c}M`I@q2jyizCsg6PGVwd2?x> zaOibt#9Z>w-KWAmU)`C}kL{R8qX4d4si=dyOMm zz*AmNJVz=);_O`6rn0ZNq(gXM?-#)NQ~ z4umOB0&BFId$h~Tk{Tc>ThN;?Fwd@N0m@-;zR}Z*cOPyY;?pMP4D*y`Fxm|@vc7;f zN#JbBde%w|Xa*Bl?0Rhaz++~*d0s;QMdC7jzKZXEldH2at`Fgvws6-eKS)*#Hh=2C z9*mKX*u)=oC!&P(k%uyFeb~6D8xz8))6B9a*Cz{cUe!<|Tk=ZFXr8K9Ur4^4_w%8R2|$zE~*ex z#_x1vSW2#r3y%@N)y>QwuJ5F0MI9q{hjCMn;;en43|?8YB07juUu~@K5LhH_+!_~w z*U9N}dsD0!^hGT>UfW@z^b(A$=C)*qbqQnFCD)~W)qzmGC81?n=3Zm7d87k2w3Oci zH$te0)O9H#)4!Y_=ev4{D8-U;pEi!-n6Z79Bylw}yT?O7Vw`s>KT$CYNGd@A_S@1+ zZi>VMhrQgZApe-b!%>T-d0XVCcA~n4R)e>iF$4<f?CeP+()tDUb#cx_yNwbFR&+7LR_&kZR*IZ?F@J} zFzFj8P_FG`aAZMgNIteDtsdZKbL(}$aRYrQx_BJW4 zV8;jOufzS4I*i2DgJ}6^R3$F3cXq>_XuhE7h+Vg8XhUoZ1nU7*p7)d&TcY_qq2$9R z*Ap+j3jG^J2-4vm1mq7VAKwh(m{f4fU2#!LoGK83JSqnAYrk)hw@T_~)-*oWQrUa= z=QB1*KmSr}?i|(p=PFh?FXrQH88T*^crAA8I}uhgx}D_>ach4=UDY?*DbbU~XR*~9 z>RjVH&AV@6uei;*FB;fCOasJvs6aUQFioaW&8lntEu>By`0SGBV=!oNjRy_NPK=X+ z2yqxQdIz`0{t4fjRf+rt=7Ru>wSG?WK0-727m@iFSzPPtk z>IU%0!RO#z1(Pu2{M?yU&+k|*`f|w&Y!7g?=`bOZQCzyz;dK_T=+em$IUijt@Apfm z=1Vthit?VaBg`-3uF(&?MX4&vCOH&_Og^rz+;b8 zb>4SQW;br}jNI~f%bHrL>~5pd%zb5i*W&*2NZvVJoSgibdy||lW$bisYTh1LwDKWTbd|MsR^TfdUAaL^Z{-HsWu_r1RIoS}qIF5B~t z5`3USeW#Zq9pIh}bpOEXmd=EzDDVroEh-*w01dL{T=NPrF* zua?ZR)9*naEULb#6`rV%*54@A`M_2wf^``yQ$HUfB3)N{9@i*T7+!4C!Izf743a+dBf^ z1pv5}HN8n5z+D3UXr}PjzqrDO=k?)hdV@Lhu~1sZYmMZQ_@>m>>JnF!*6|21iias&mvhU?475lkto)8gIzg%b`nn(j}vi) z@jYtW=h%#A<&&z>JiGj^_(mNw(rVTct;w$s^xun#t9?N8-m!olmweFV&_NL{NC}NM zhkXJx2eK!B=4%Iy)hj*7nlef`Z6BY;S=u1^A1(7RuLZ1onJSr%>tvM$JYh3~Jt?E6 zPuRo+^gWTE`_|x#$j<8z1NPsA7*Ufh z;737iA#+MDKc`-hk3g~le$%9g0cXvySO%#0x9$u%E9H6pXNl{x^BKtHeUtbF1YxEJ zgq2ox|I}HA$a9*Vc_6jBC(D-iPNz?<3ti=gQ<8=Fd0DW_18Gr%*B*3sF3t4!SSj_p zOm6YB8RB5gqpW}I!C8YOMb!GPH`uiDBR2}w1t8Fh2 zp|1qj*xN7)b6sQzTSk1}-x{R^{b zM(jO4GH$i9)EEcHWf4t)WvNM0wd_q|ZDscAX-n+{0pIplJ)a;o2`0ZhJ>TG#0PaE8 zYzM2MLq4{Ka^`)~mBAB7udU@zbpuk1r`He2-XSF0r;APqY|cd~^WgY+2fuYxLgCgf zmz99>FSvh;YTsy$FH}e*UwxO*djrKm{_?0Jt>?;1-1|YL63hUC=NXoHhzk+PGq!3o0bFURC6&ji*Ay)L=o@H+MK8&=k!@fDYQ&IN|IoXa><91ygx zui^ArGLYHwUeC36-}K{aT2eSUM7`FS1^ng*0NHn3kJ`~8Yl$_j8iheYBFg>z;bvP3 z1Lso{{=jJU)S2@;hCMVY}GCk=SEk|jh<>Od8HRD-vc5;B6fn| zWnQKyWun8AY%@sBio>~%UIUHU6`;9R%l$gSPfKvH4RhZ^HZ(A&Y!(Od?Fqs|VjchR z5-Sv99JxsNygwMtf2D3DxbwZjC|Bj;^Athnf3q^@6jgk&7OUv8^*kG z6Cq*JSD0%zyly=$(9Z3AF~t6ZL~a>=_^f~+>?Gv3QNVSUyPM*_Fc;^?MX{Q)alJ36 zrjFF}g5I8Ad?kv_p5f7r>Cs6>?KH zZ7jKZl_eGjID*z0H)}(UVJ5c&g2pmf%v@($u@^OCn2(t(-N=NfxcBuTTebm%n0sc5 zn&Y=wA%Q)sY_s708}WR+(mem8UCs()Gh9yvUY1yz7UXXqopCxtsI6ydYC0Aw5%@(* z@UUU1oN)bPAiL&)kW6YJcsp`Q3z`6a)1z;4lvspuX%T!OGsOCsg??Mdv}34eN)eun93>9y5p_qPU5QE$CHj{Td&V zzqLds_^?gy_AhY|rX$(#GNS#nZ^;Jzq3q|;w9nC7T$|M-f;BLlfF1|!Et6{>ih+Ozzy0G1t6%U~wN#)>1Dhe=xGG=X#>$yN%!BZrDcu?B z?Xf_suEB9y)OJlPhBz#TgmfZbE{v7|hOmh#`Exn0X&v>Vrj{l4W^Rx+=okwG{$`)QFS)v!(XxP!A> zAIvI^545Tp&{=cv=tDAVov;5Sv5cKbt28V^;@xpIgi3;7_Oq2`oyG0;0zV zTZKD0WzyCi>1)j=6?kEs89zA+B!z+3@qjX&ZduP=|dJk)$u9J+Sj ziOsq>*gu?^>?32yIe)JM3x{AYV+p8gySAORLQ6{!lu;FxuS(?09zesln?^->M+E$q zIf}83r$xnk70H}8Q*$=L=%VWfPZO|XZBnS>T4$v74uAec$}WhDRwz$Zv< zjLSBKGj=xk&ZZSYFkK`cl9=IX0qisGQv_e^BoP!_`o9QvL)A0gz!ftlW>zbgC2jzM z=$EL@fDKw*2e0VGc`Fw>K7)iW+3nt@7*#ieII#srhiQ*Bs~q_WLWh3{l!IL!iO%!M zmrpa;_qo6ds=&NOaoBefieZ%k1f`&I?GQxXiI*Z7p-Qan~ga;0Z~iL%9zIWJM-c!}>BW z{S7fM>u-#i<$7(Yg<67{NKEi0#aaK4HTHx~%x``BvMI5XRo+C-9s7g#-`Le?Ru~p$ zm7rTov(im9-?vOs1q!)D8fjo&VA!0D*I0w-I0u6YS3VR85 z5aVSa#jawAD-4I>iK>XojH&h|;9Cxdj9Al!dmNOILLnW)*_f+n;!8)9C`0|_SRvFYB{G93Gl_(;N>`@O11uPU267893yNfX9*m;fbe&HFxGc>u0? zGGasL9IKJ@WEqqat#%KbGdJse{otPabhssmiqmsY0m~{$tRmN6<7Z8*owX(e^rGul`~OJ(n;_)jQI`q?ED^d3A?)==0rcC5N3tWl zRe5cBbXP>)!>8;EDxcZ#&Xtu8*ePuDhuPlK-j}2`{>5yS-xUNa4UEVzHuJoP+o>WK zw_h<%UGMo6vGW@b;~vPz;iYSKEShgyFN$dA8<_4VndeBfj)a4C_sUk*9(4rplV`n$ z_c1Q3j)%r4=U)BD&xR>!+UStj1_8S5PF%!O=!y53?Y zt{ewHB@^?nA4&1lmDHK#<4aKQzAlXYJr(z#ggTf+?<_X`l~Puw`y2-0LH(DBdg~KK zzz)yLu;0)YTS+&AyhqBp%k^}w*S0=%rxL?-V-F#$9Mt?**6G_+DV=*xBN!k2nl~QigfXha8VpSS7-bzLlIZWh>b2ufG9`J zBkziN4;mRBXu%LjO57Eq38R9P4W(d;^1i#MchJL-+No@WLhaUoLFk5{@AR&YA{xFr z8&+)_dxF5+2xQi(%`6uQqBB&Zx#c4Yd*L1{d5NX0!_p6(_oPA|%j+#}9nwOtv;W`H zs8$&kx2I>z;U*)*&=zLDE!B)ksrN|`(A9DAVcmIR@CrGwrt1=EnzD6mz+oDnnp(50 z2GS+IE-8j{;cRMxaUD)-pxu%<|7|0B0q~*o7M9qf@U4x6vXFn% z2M3h)#fV2^GKR{YoS#b~9tHikK;pBMRT^4tgGRWMu`LN`6*QJcM~Fp8WN z`TERN(u43lJtoeYqRNP4T3i8y#vqgj1Cl&Y<0piW|nnxMNB-G)n)R7_aZbmWl zB^q2of4Unk_)o^PmRF>lisfNfMf8F?X!(y4`QyNw$j3CRIj2FB!XHbUbh0^Z+xoq5 zSfJN08fOP$y@gu!Z?@$RWsTx@GfZyut#LrXkRbw{ByPU>o?;?$^rk^gQMGl2QP5Y_oVxTRYi*Nx`XSB?Z)e}n%KW5K)nHxofIAFIH|Wq?m<6TTxU zWVExA%rYh=51WlEr+kH z>t7lE+dJhhn1n60WGm~zH}4beFg?<;YRvYx%}pxYDbA*joZKXR(Qg(OMr}-D1O`l= zhhg@s0n8$RJ3$wTF>w%zl1T?CCDg4t*<(vjHcMS#S)Mj3%^{)wi)qHC#IziVbDCad zhCnH4a!qlOr`KiLj*)l-xn7)x?cOY&mlZ#lS2W~zi^^CX!Ut8U)BWoWie@-f_D#+y zc<%`}Dr;6x}rkltUhp>Xleo^_M%xp9i9SPs&F? zE()Sn{%>35`CwV0-c6JKpsO`z!u?Yj4NiSNZLLbfJ?<{}+h{q8v0Y$LQYzT@I%s9O zG0$u~H=`X#G%TZI%9+gXdIFsedf)qCUDlDNdBUk!IdQSSPM2Z8w6}&xMX9|J09S6T zy_%~`+bLim*9`5zpp08T6b#uJtI*dno9p#=Vt}JHCJ9T0pdV7f4GAFFP+P$0vVUE7 zX&1~gHJ9+lRXzvBG|P@<8_R3osan|u0smQl{ZX5}OE}R4!IK~=>Nb=p^X_%}&<$Dm zGy+gi?1j+1$O$#0h-E#{8_f}g5^!4aDf3_A5UnZqGj4#xn^3QbEi}hAOedy| zxiY=+g`Kgw1jT!2o2=d06iKauo1dGXgBwxVsgLb;sdo17{8bVnV!O2D!^~303QclK zbwjrv>Y(5InV3RK{rtBaYQ5R*$ic(WPiS_>Y7-_``#9c<%pyjL_|INioYHpBxPz!% z@a|1(YUnDJeQSg*jK_cb+5pKvkdJlBj}$;O=wHohKdMnuac7PI2FmEx zi2xY1go}pH-bm<_=l?1*0mQY)TG5Es&cIl{Q8QqKkDkzU=Skb0czg=?J|4Jq+iAJU z0v*5Pyh{&-I5%KZNTLE$s&VnxQ=Q$sbl@4NT% zL5Yay8ZP{_h>~75_d{h5G7k(REyK601HxEK@E4k?8m)j!-Za$N{bJ=?#N7ooc+;NF zlp9SFG~aa2dn!4&rajRhd(Cqd2^^<6FOQxYuVB}2IKI&X|b;sp3r zjupJVg5#p6f9hg!;2MFZKoIGwpFVuk1|aS)*U0OsII zT^&L#6~p%_oEpqDBA;y!evK0GoNA592RS*Dbx;30SK^{|-!2dK&wT;=c}X(A-`O7X z{|KDJsC^?Yf=dHR^#Fb2zw?e#O!dKh6%=o~GAVkgb9Z}MAQB`Nrl8!lxFNxWtw4^=^M$ecS6^Fzf;NpqCvk&&Zk3*#I=63J{bAh_$|Eb^c~?x9`3*mgBPvP5p4fCZk|UPMd-zc1Q8EjCnMYf zFn3~x0QjfaG4}o`OjFT=Q~dlNoX!U21K@BWAn@e)W?#8Hg>|hd;%U=^ICkpJLech1 zR4FKwkhSsr9uw2~mIooxs6%0%ih7lCM5`(66RIR-j<+r*?Yp^Ur{>hn2pLLuWq>XJ zJFZ8DLp$bYL-SD-CBB1jV_EVL#<3H}lIH!36E4N9^U*Rn_Bi(j3#RjuKY!czeD~gF zLVMA%YEKqtm@gzR%YPt~|E0M4$g z=3BO98`V|j^CZOs1i19`Iqo6H^?mp;5)(6fNa3Q}Mh;s_Tz{Ov0)IFbBX?ik=xUIt z3)SY>u}j-ZurkS#KLxW+<|7Za6trk?qOb4-T%Gm(%HP?Q~ z$(=7iA&8Vbi`{000`_F1J8fo&`=J6j>^Wbrb8C*+8|GR@m$@kBKF0f{gD#^;aH-s3 zdd3G10FV%Gx4p}cUTb7KR?HosmPAB0K2Hro)g$Z-^VP!iWaDa4xSaS$Hu2H9{nCL- z(eUEcWp<$0{C;}3n*B!j5vDCfew0y$ht-Qy^ovx$FReuyRn`DU`jqSE+SWCqV9DQ^`%9nJL1k7&%ira2!JsR(V_Y)8KA9WOg0}Ln8p@Uyzw9w0&xmeBhZgFX{r+1B2A+t^3 zGKn8HtC%T+nA6=yF~ysTy_B~c)u1;maAi7PBukKQ-QVHG?|4V?wEoXkqUpPiW6@@f zvC$KcuC+@{gG6j1?6D-@)5wGX(Ny4MpQmQ= z2vsIBqkhtUA4P7zQ9i>LZNd90c*E#pA94_kaN#Rd3g1bRrp^6J4=<5~XTlNv#eafE zE(bLyNA3BS}^!J zd+Mx@FixNdB>Sv4slzKr(3vrtBD4 zh3Y)VhAOb(y3j`3&LHtuB*ps=ddV?NA&;$C<$24Vmh7_K5x<4{ku}&o2v(c7;|4*u z=|$QLAk2H7;C~w^$$zpq)tv67$!X#xQp(LMjy2$fQeH%8l^J2&w`D+fe#ancV}lH_ zFATl0L&$&L8RK09SD{2s!CRy&IHq@GEVdy^V=x_50LU`M`;!Y#P2@q*gPRqDYx=!6Wk-G`{gnExPCK z8McRcKR?J4s0}WeLQ(C!3VzUWTJuRK0@mL@$;OpY+HH>olh4Mb_kWY#*MHz`F8|=z z%HvSW|ULR9(r=4T$JSI``8sNVc=?K2Pp9z6yf5qKInwl;fH| z$h~~Yqa)0)gw(maQ5n?sJVh8N6Yfm1icZ8GLa=*25_g*}$U*4+`|r2~vEXf*ZMA!F zV<8Cc!+Px3Z2WsB*+gF4hS6t`8)!3!QQo)7)$+%6JDtuU&iSb^`lPyH0r#g!6O>Q- zXmj9M>BY>G$x6MkR{b&n1ZgCkJ|E@x)wF16E*8UvvbjA_o-<0^jGv>!S#3mhMPRPOIf3jY)z+SA?cIW zxHT?7FETIgk@6oilQ%aLZx^e}H?0qwm}g+(0xW$A`X{`l$>It99bvtf(OL0T0%(Sh zG!(*i(S*@&NhbmVxLd4E9D7v?WjFX>LI(!auVwS9^*KT%jY;%>;IX2DYCY2VaH(+1 zn$o5+^DAoGQ+f$#$v|U>K#_G`bn&Aw>JEOy#|Zy3ubdGggjNjlO=?F;PRtPok82Wc zq#T{f&zN}+;<|?>H=Fh(Slr$!Sd+Ppi->;=j4|GCNc;2-HSvW^_;$|&os~%`S@y<^ zkI3`MfH7X^Z*-*)&(duJ+i138=*-7(sfc>ys|Grw&C7aQ+Xv)LXXXYa+9mV+FkaJ- z;mY=%><5z@n{OC`AaPxeE2|Q)jb*2&IO$BifaVMwv{m)p2hVyifq!HCJo=;!bP#QaxJvu_Z~hXGsY1 zTm?iEV0h1tmV(c?rEO`XkB^3AeMFPTmm2{$_2P{tlMKtR;1Y&rW~8Zy)X4w9;4g z5|T)0t2P29<45`zPJz~{r<`ow>sRCu@sBkOm!+Db44_Yw@ zzyS7eA|6A^YaUJ6PA3f46E34RzCK<>!mnOF*5QqUoS@*OANnk2)>ew#@#D6C9jX54 zefYPzaJ_>Y!v_}p+Wrbh#