From 63f4ad7612e87554aa3bdb92edbedeeeee81a7d2 Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 10:29:14 +0200 Subject: [PATCH 01/27] chore: name the bluebird theme in menu the default theme --- src/aare/gui/main_window.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index ac34b442..ad3a4a79 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -1910,7 +1910,7 @@ class MainWindow(QMainWindow): self._theme_action_group = QActionGroup(self) self._theme_action_group.setExclusive(True) - self._use_legacy_theme_action = QAction("Sunrise Theme (default)", self) + self._use_legacy_theme_action = QAction("Sunrise Theme", self) self._use_legacy_theme_action.setCheckable(True) self._use_legacy_theme_action.setChecked(self._theme_mode == THEME_SUNRISE) self._use_legacy_theme_action.triggered.connect(self.use_legacy_theme) @@ -1922,7 +1922,7 @@ class MainWindow(QMainWindow): self._use_portrait_theme_action.triggered.connect(self.use_portrait_theme) self._theme_action_group.addAction(self._use_portrait_theme_action) - self._use_bluebird_theme_action = QAction("Bluebird Theme", self) + self._use_bluebird_theme_action = QAction("Bluebird Theme (default)", self) self._use_bluebird_theme_action.setCheckable(True) self._use_bluebird_theme_action.setChecked(self._theme_mode == THEME_BLUEBIRD) self._use_bluebird_theme_action.triggered.connect(self.use_bluebird_theme) -- 2.54.0 From 69178945e5b64e73413169056673714a3db2d8cf Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 10:31:57 +0200 Subject: [PATCH 02/27] fix: prevent libzmq abort and per-frame decode errors in prediction subscriber Sniff for '{' before JSON-parsing zmq parts: JPEG frames start with 0xff and raised UnicodeDecodeError on every frame. Stop closing the socket from the GUI thread in stop(): zmq sockets are not thread-safe and the concurrent close/recv tripped the signaler.cpp POLLIN assertion (core dump); run() closes it in its own thread via the 500ms RCVTIMEO. uv.lock: sync version to 0.8.3. Co-Authored-By: Claude Fable 5 --- src/aare/gui/threads/prediction_subscriber.py | 14 ++++++----- tests/unit/gui/test_prediction_subscriber.py | 24 +++++++++++++++++++ uv.lock | 2 +- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/aare/gui/threads/prediction_subscriber.py b/src/aare/gui/threads/prediction_subscriber.py index 044fe99f..29fe7876 100644 --- a/src/aare/gui/threads/prediction_subscriber.py +++ b/src/aare/gui/threads/prediction_subscriber.py @@ -87,6 +87,10 @@ class PredictionSubscriber(QThread): self._measure_focus = enabled def _try_parse_json(self, part: bytes) -> dict | None: + # Binary frames (JPEG starts with 0xff) are not JSON; decoding them as + # utf-8 raises UnicodeDecodeError on every frame. Cheap sniff instead. + if not part.lstrip()[:1] == b"{": + return None try: decoded = json.loads(part.decode("utf-8")) return decoded if isinstance(decoded, dict) else None @@ -254,11 +258,9 @@ class PredictionSubscriber(QThread): self.running = False self.requestInterruption() - try: - if self._sock is not None: - self._sock.close(0) - except Exception: - logger.debug("Error while stopping the prediction subscriber", exc_info=True) - + # Do NOT close the socket here: zmq sockets are not thread-safe, and + # closing from the GUI thread while run() uses it aborts libzmq + # (Assertion failed: pfd.revents & POLLIN, signaler.cpp). RCVTIMEO=500ms + # guarantees run() notices running=False and closes it in its own thread. if not self.wait(1500): logger.warning("PredictionSubscriber did not stop within timeout") diff --git a/tests/unit/gui/test_prediction_subscriber.py b/tests/unit/gui/test_prediction_subscriber.py index e69de29b..6617ba55 100644 --- a/tests/unit/gui/test_prediction_subscriber.py +++ b/tests/unit/gui/test_prediction_subscriber.py @@ -0,0 +1,24 @@ +"""Checks the binary-frame sniff in _try_parse_json: JPEG frames (0xff lead +byte) must be rejected without attempting utf-8 decode (previously raised +UnicodeDecodeError on every frame).""" + +from aare.gui.threads.prediction_subscriber import PredictionSubscriber + + +def _parse(part: bytes): + # Called unbound: _try_parse_json touches no instance state, so no + # QThread/zmq construction is needed. + return PredictionSubscriber._try_parse_json(object(), part) + + +def test_binary_jpeg_frame_is_not_json(): + assert _parse(b"\xff\xd8\xff\xe0somejpegbytes") is None + + +def test_json_dict_is_parsed(): + assert _parse(b'{"encoding": "jpeg"}') == {"encoding": "jpeg"} + + +def test_json_non_dict_is_rejected(): + assert _parse(b"[1, 2]") is None + assert _parse(b"") is None diff --git a/uv.lock b/uv.lock index 9a39da31..72a73a21 100644 --- a/uv.lock +++ b/uv.lock @@ -31,7 +31,7 @@ wheels = [ [[package]] name = "aaredaq" -version = "0.8.1" +version = "0.8.3" source = { editable = "." } dependencies = [ { name = "aarecommon" }, -- 2.54.0 From ac5936f7be272e956a937ecf164b3ce28bb53680 Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 10:39:36 +0200 Subject: [PATCH 03/27] fix: exposure wheel only increased when Alt held Qt xcb/windows swap wheel axes while Alt is held, so angleDelta().y() is 0 and copysign(_, 0) is always positive. Fall back to angleDelta().x() and ignore genuine zero deltas. Co-Authored-By: Claude Fable 5 --- src/aare/gui/widgets/camera_image.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/aare/gui/widgets/camera_image.py b/src/aare/gui/widgets/camera_image.py index 27ee8a54..14b8a0dd 100644 --- a/src/aare/gui/widgets/camera_image.py +++ b/src/aare/gui/widgets/camera_image.py @@ -1354,7 +1354,13 @@ class SampleCameraImageLabel(QGraphicsView): def wheelEvent(self, event: QWheelEvent): if not self.wheel_event_timer.isActive(): - delta_y = event.angleDelta().y() + # Qt's xcb/windows platform plugins swap wheel axes while Alt is held, + # so a vertical scroll lands in angleDelta().x() and y() is 0. Without + # this fallback, copysign(_, 0) is always positive and Alt+wheel + # exposure can only ever increase. + delta_y = event.angleDelta().y() or event.angleDelta().x() + if delta_y == 0: + return match self._state: case SampleCameraImageState.BEAM_MARKING: if event.modifiers() & Qt.KeyboardModifier.AltModifier: -- 2.54.0 From b8177bd764b584a09ab925dedeff811b69ec4d66 Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 10:47:02 +0200 Subject: [PATCH 04/27] chore: specify the omega panel 0 degree is a go-to not a move-by --- src/aare/gui/panels/omega_panel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aare/gui/panels/omega_panel.py b/src/aare/gui/panels/omega_panel.py index 52260b54..8f7aee08 100644 --- a/src/aare/gui/panels/omega_panel.py +++ b/src/aare/gui/panels/omega_panel.py @@ -35,7 +35,7 @@ class OmegaPanel(QWidget): grid_layout.setColumnStretch(0, 1) grid_layout.setColumnStretch(1, 1) omega_settings = [ - {"name": " 0°", "payload": {"abs": 0.0}}, + {"name": "Go to 0°", "payload": {"abs": 0.0}}, {"name": "-10°", "payload": {"rel": -10.0}}, {"name": "+10°", "payload": {"rel": 10.0}}, {"name": "-45°", "payload": {"rel": -45.0}}, -- 2.54.0 From e18c7feded837db8d26d20ee021b58057137cc5d Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 10:56:32 +0200 Subject: [PATCH 05/27] feat: stage motor entry values, apply moves in one click Chi/Phi boxes in the Smargon tab no longer move on Enter: edits stage the target (orange), the Move button sends all staged axes at once (green), and boxes return to neutral when the motor reports arrival. Out-of-range entries stay red and are never sent; limit tips pop as tooltips. MotorMoveGroup is opt-in per box so other panels can adopt the same logic later. Co-Authored-By: Claude Fable 5 --- src/aare/gui/panels/smargon_panel.py | 34 +++--- src/aare/gui/styles.py | 24 +++++ src/aare/gui/widgets/motor_move_group.py | 132 +++++++++++++++++++++++ tests/unit/gui/test_motor_move_group.py | 67 ++++++++++++ 4 files changed, 243 insertions(+), 14 deletions(-) create mode 100644 src/aare/gui/widgets/motor_move_group.py create mode 100644 tests/unit/gui/test_motor_move_group.py diff --git a/src/aare/gui/panels/smargon_panel.py b/src/aare/gui/panels/smargon_panel.py index 3ed71dce..949d6c80 100644 --- a/src/aare/gui/panels/smargon_panel.py +++ b/src/aare/gui/panels/smargon_panel.py @@ -5,6 +5,7 @@ from PySide6.QtCore import Signal, Slot from PySide6.QtWidgets import QGridLayout, QLabel, QPushButton, QWidget from aare.gui.widgets.button_with_payload import ButtonWithPayload +from aare.gui.widgets.motor_move_group import MotorMoveGroup from aare.gui.widgets.number_line_edit import NumberLineEdit from aare.gui.widgets.title_label import TitleLabel @@ -59,28 +60,34 @@ class SmargonPanel(QWidget): grid_layout = QGridLayout(self) grid_layout.addWidget( - TitleLabel("Smargon", self, collapsible=True, default_collapsed=False), 0, 0, 1, 6 + TitleLabel("Smargon", self, collapsible=True, default_collapsed=False), 0, 0, 1, 7 ) grid_layout.addWidget(QLabel("Chi", parent=self), 1, 0) self.chi_enter = NumberLineEdit(-0.2, 40, decimals=1, parent=self) - self.chi_enter.newValue.connect(self.chi) grid_layout.addWidget(self.chi_enter, 1, 1) grid_layout.addWidget(QLabel("°", parent=self), 1, 2) grid_layout.addWidget(QLabel("Phi", parent=self), 1, 3) self.phi_enter = NumberLineEdit(-0.2, 360, decimals=1, parent=self) - self.phi_enter.newValue.connect(self.phi) grid_layout.addWidget(self.phi_enter, 1, 4) grid_layout.addWidget(QLabel("°", parent=self), 1, 5) + # Chi/Phi are staged (orange) and only sent on Move (green until the + # motor reports the target reached) — see MotorMoveGroup. + self.move_group = MotorMoveGroup(parent=self) + self.move_group.add_box("chi", self.chi_enter) + self.move_group.add_box("phi", self.phi_enter) + self.move_group.applied.connect(self._move_axes) + grid_layout.addWidget(self.move_group.button, 1, 6) + self.home_button = QPushButton("Move home", parent=self) - grid_layout.addWidget(self.home_button, 2, 0, 1, 6) + grid_layout.addWidget(self.home_button, 2, 0, 1, 7) self.home_button.clicked.connect(self.home) self.move_panel = SmargonMoveWidget(parent=self) - grid_layout.addWidget(self.move_panel, 3, 0, 1, 6) + grid_layout.addWidget(self.move_panel, 3, 0, 1, 7) self.move_panel.smargon_rel.connect(self.smargon_rel) grid_layout.addWidget(QLabel("Step", parent=self), 4, 0) @@ -98,18 +105,17 @@ class SmargonPanel(QWidget): # TODO move SMARGON_HOME to REDIS, allow GUI to read this value self.smargon.emit(SmargonCoordinate(sh_mm=Coordinate(x=0, y=0, z=18), phi_deg=0, chi_deg=0)) - @Slot(float) - def phi(self, f: float): - self.smargon.emit(SmargonCoordinate(phi_deg=f)) - - @Slot(float) - def chi(self, f: float): - self.smargon.emit(SmargonCoordinate(chi_deg=f)) + @Slot(dict) + def _move_axes(self, targets: dict): + # only the staged axes move — absent keys stay None (no motion) + self.smargon.emit( + SmargonCoordinate(chi_deg=targets.get("chi"), phi_deg=targets.get("phi")) + ) @Slot(DAQStatusModel) def update_daq_status(self, s: DAQStatusModel): - self.chi_enter.update_value(s.geom.smargon.chi_deg) - self.phi_enter.update_value(s.geom.smargon.phi_deg) + self.move_group.update_actual("chi", s.geom.smargon.chi_deg) + self.move_group.update_actual("phi", s.geom.smargon.phi_deg) self._geom = s.geom @Slot(Coordinate) diff --git a/src/aare/gui/styles.py b/src/aare/gui/styles.py index 9394a5c7..1f35f723 100644 --- a/src/aare/gui/styles.py +++ b/src/aare/gui/styles.py @@ -348,6 +348,12 @@ INPUT_BG = "rgba(255, 255, 255, 33%)" INPUT_INVALID_BG = "#e9c4cf" # red 20% over latte base INPUT_DISABLED_BG = "#e6e9ef" # latte mantle INPUT_DISABLED_INVALID_BG = "#ecdae2" # faint red wash +# Motor batch-move states (MotorMoveGroup "movestate" dynamic property): +# staged-but-not-sent target vs motor in motion — see motor_move_group.py. +INPUT_PENDING_BG = "#f2cdba" # peach 25% over latte base +INPUT_MOVING_BG = "#c3ddc3" # green 25% over latte base +DARK_INPUT_PENDING_BG = "#473741" # warn (copper) 25% over bg +DARK_INPUT_MOVING_BG = "#2f4e5d" # green 25% over bg # -- Status bar flags (Catppuccin Latte) ------------------------------------ STATUS_OK = "#40a02b" # closed / idle / owned / tell ok (green) @@ -715,6 +721,16 @@ def _sunrise_stylesheet(overrides: dict[str, str] | None = None) -> str: background-color: $input_disabled_bg; } + /* Motor batch-move states (before the invalid rules on purpose: equal + specificity, so out-of-range red must come last to win). */ + QLineEdit[movestate="pending"] { + background-color: $input_pending_bg; + } + + QLineEdit[movestate="moving"] { + background-color: $input_moving_bg; + } + QLineEdit[invalid="true"] { background-color: $input_invalid_bg; } @@ -1380,6 +1396,14 @@ def _sunset_stylesheet() -> str: background-color: $dark_disabled; } + QLineEdit[movestate="pending"] { + background-color: $dark_input_pending_bg; + } + + QLineEdit[movestate="moving"] { + background-color: $dark_input_moving_bg; + } + QLineEdit[invalid="true"] { background-color: $dark_error_bg; } diff --git a/src/aare/gui/widgets/motor_move_group.py b/src/aare/gui/widgets/motor_move_group.py new file mode 100644 index 00000000..f04fcb91 --- /dev/null +++ b/src/aare/gui/widgets/motor_move_group.py @@ -0,0 +1,132 @@ +"""Batch entry -> apply for motor value boxes. + +Why: typing into a motor box used to fire the move on Enter, one axis at a +time. Operators want to stage several targets, review them, then start all +motors with one click. The group tracks a per-box state machine: + + neutral (theme default) --user edit--> pending (orange) + pending --Move clicked--> moving (green) + moving --actual reaches target--> neutral + +Colors are QSS dynamic properties ("movestate" on the box), styled per theme +in styles.py — same pattern as NumberLineEdit's "invalid" property, so the +existing out-of-range red still wins while typing. + +Modular on purpose: any panel opts a NumberLineEdit in with add_box(); boxes +not registered keep their old behavior. +""" + +from PySide6.QtCore import QEvent, QObject, QPoint, Qt, Signal, Slot +from PySide6.QtWidgets import QPushButton, QToolTip + +from aare.gui.widgets.number_line_edit import NumberLineEdit + + +class MotorMoveGroup(QObject): + # {name: target} for every box that was pending when Move was clicked + applied = Signal(dict) + + def __init__(self, button_text: str = "Move", parent=None): + super().__init__(parent) + self.button = QPushButton(button_text) + self.button.setEnabled(False) + self.button.clicked.connect(self._apply) + self._boxes: dict[str, NumberLineEdit] = {} + self._tols: dict[str, float] = {} + self._state: dict[str, str] = {} # "" (neutral) | "pending" | "moving" + self._targets: dict[str, float] = {} + + def add_box(self, name: str, box: NumberLineEdit, tol: float = 0.1): + # tol is the "at target" window — hardware never lands exactly on the + # setpoint, so this stays a per-box knob (encoder resolution differs + # per motor). + self._boxes[name] = box + self._tols[name] = tol + self._state[name] = "" + box.textEdited.connect(lambda _text, n=name: self._on_edited(n)) + # Below-min can only be judged on Enter (typing "3" may become "30"), + # and the validator swallows editingFinished for out-of-range text — + # so catch the key directly. + box.installEventFilter(self) + + # -- panel-facing API ---------------------------------------------------- + @Slot(str, float) + def update_actual(self, name: str, value: float): + """Feed the motor's actual position. Neutral boxes track it (same as + the old direct update_value call); pending/moving boxes keep showing + the user's target until the move completes.""" + box = self._boxes[name] + state = self._state[name] + if state == "moving" and abs(value - self._targets[name]) <= self._tols[name]: + self._set_state(name, "") + state = "" + if state == "": + box.update_value(value) + + # -- internals ----------------------------------------------------------- + def _on_edited(self, name: str): + box = self._boxes[name] + try: + value = float(box.text()) + except ValueError: + # incomplete entry ("", "-", "1e"): stay/become pending, no tips + self._set_state(name, "pending") + return + top = box.validator.top() + if value > top: + QToolTip.showText( + box.mapToGlobal(QPoint(0, box.height())), + f"Maximum value: {box.to_string(top)}", + box, + ) + # editing back to the current position cancels the pending move + if abs(value - box.saved_value) <= self._tols[name]: + self._set_state(name, "") + else: + self._set_state(name, "pending") + + def eventFilter(self, obj, event): + if event.type() == QEvent.Type.KeyPress and event.key() in ( + Qt.Key.Key_Return, + Qt.Key.Key_Enter, + ): + for box in self._boxes.values(): + if obj is box: + try: + value = float(box.text()) + except ValueError: + break + bottom = box.validator.bottom() + if value < bottom: + QToolTip.showText( + box.mapToGlobal(QPoint(0, box.height())), + f"Too small — minimum value: {box.to_string(bottom)}", + box, + ) + break + return super().eventFilter(obj, event) + + @Slot() + def _apply(self): + targets = {} + for name, box in self._boxes.items(): + # out-of-range text stays pending (red via the invalid property); + # only valid targets are sent + if self._state[name] == "pending" and box.validate(box.text()): + targets[name] = box.value + self._targets[name] = box.value + self._set_state(name, "moving") + if targets: + self.applied.emit(targets) + # ponytail: no timeout — a move that never reaches target leaves the + # box green until the user re-edits it; add a watchdog if that bites. + + def _set_state(self, name: str, state: str): + box = self._boxes[name] + if box.property("movestate") != state: + box.setProperty("movestate", state) + # property selectors only re-evaluate on repolish + box.style().unpolish(box) + box.style().polish(box) + self._state[name] = state + self.button.setEnabled(any(s == "pending" for s in self._state.values())) diff --git a/tests/unit/gui/test_motor_move_group.py b/tests/unit/gui/test_motor_move_group.py new file mode 100644 index 00000000..daf08375 --- /dev/null +++ b/tests/unit/gui/test_motor_move_group.py @@ -0,0 +1,67 @@ +"""MotorMoveGroup is motor protection UX: typing must never start a move — +targets are staged (orange), sent only by the Move button (green), and the +box returns to neutral when the motor actually arrives.""" + +import pytest + +from aare.gui.widgets.motor_move_group import MotorMoveGroup +from aare.gui.widgets.number_line_edit import NumberLineEdit + + +@pytest.fixture +def chi(qtbot): + box = NumberLineEdit(-0.2, 40, decimals=1) + qtbot.addWidget(box) + group = MotorMoveGroup() + group.add_box("chi", box) + return group, box + + +def _type(qtbot, box, text): + box.clear() + qtbot.keyClicks(box, text) + + +def test_stage_apply_settle(chi, qtbot): + group, box = chi + sent = [] + group.applied.connect(sent.append) + + _type(qtbot, box, "25.0") + assert box.property("movestate") == "pending" + assert group.button.isEnabled() + assert not sent # typing (even Enter) must not move the motor + + group.button.click() + assert sent == [{"chi": 25.0}] + assert box.property("movestate") == "moving" + assert not group.button.isEnabled() + + group.update_actual("chi", 10.0) # still travelling + assert box.property("movestate") == "moving" + assert box.value == 25.0 # box keeps showing the target + + group.update_actual("chi", 25.05) # within tol -> arrived + assert box.property("movestate") == "" + group.update_actual("chi", 3.0) # neutral boxes track the actual again + assert box.value == 3.0 + + +def test_edit_back_to_current_cancels_pending(chi, qtbot): + group, box = chi + _type(qtbot, box, "5.0") + assert group.button.isEnabled() + _type(qtbot, box, "0.0") # back to the actual position + assert box.property("movestate") == "" + assert not group.button.isEnabled() + + +def test_over_max_is_invalid_and_never_sent(chi, qtbot): + group, box = chi + sent = [] + group.applied.connect(sent.append) + _type(qtbot, box, "500") + assert box.property("invalid") is True # red via existing validator path + group.button.click() + assert not sent # out-of-range target is never applied + assert box.property("movestate") == "pending" -- 2.54.0 From ebe0860ed4446d76005b00493ebf2c05aec5d93e Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 11:00:20 +0200 Subject: [PATCH 06/27] feat: add More link in sample camera help overlay opening F1 dialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Underlined 'More… (F1)' line at the bottom of the painted help box emits open_full_help, wired to the existing Mouse / Keyboard Controls dialog. Co-Authored-By: Claude Fable 5 --- src/aare/gui/main_window.py | 1 + src/aare/gui/widgets/camera_image.py | 39 +++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index ad3a4a79..118427fd 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -913,6 +913,7 @@ class MainWindow(QMainWindow): self.sample_camera.smargon.connect(self.daq.move_smargon) self.beamline.smargon_panel.smargon.connect(self.daq.move_smargon) self.sample_camera.samcam_updated.connect(self.daq.samcam_settings) + self.sample_camera.open_full_help.connect(self.show_controls_help) self.raster.omega.connect(self.daq.set_omega) self.raster.smargon.connect(self.daq.move_smargon) diff --git a/src/aare/gui/widgets/camera_image.py b/src/aare/gui/widgets/camera_image.py index 14b8a0dd..7895aa88 100644 --- a/src/aare/gui/widgets/camera_image.py +++ b/src/aare/gui/widgets/camera_image.py @@ -98,6 +98,8 @@ class SampleCameraImageLabel(QGraphicsView): samcam_updated = Signal(SampleCameraSettings) switch_raster_grid = Signal() + # "More…" link in the help overlay; main window opens the full F1 dialog. + open_full_help = Signal() def __init__( self, @@ -147,6 +149,7 @@ class SampleCameraImageLabel(QGraphicsView): # legend visibility is already handled by the panel checkboxes. self._help_expanded = False self._help_hit_rect: QRectF | None = None # viewport coords, set on paint + self._help_more_rect: QRectF | None = None # "More…" link inside the overlay self._target_point = None self._target_shape = None self._target_color_name = "Cyan" @@ -471,6 +474,19 @@ class SampleCameraImageLabel(QGraphicsView): self._scaling() def mousePressEvent(self, event): + # "More…" link before the box toggle: its rect lies inside the help box, + # so the toggle below would swallow the click otherwise. + if ( + event.button() == Qt.MouseButton.LeftButton + and self._help_more_rect is not None + and self._help_more_rect.contains(QPointF(self.viewport().mapFrom(self, event.pos()))) + ): + self._help_expanded = False + self.update() + self.open_full_help.emit() + event.accept() + return + # Help badge first: pure UI affordance, must work even when camera # interaction is disabled (session overlay etc.). if ( @@ -1087,6 +1103,7 @@ class SampleCameraImageLabel(QGraphicsView): def _draw_help_overlay(self, painter: QPainter): self._help_hit_rect = None + self._help_more_rect = None if not self._help_expanded: self._draw_help_badge(painter) return @@ -1114,8 +1131,15 @@ class SampleCameraImageLabel(QGraphicsView): for entry in entries: max_width = max(max_width, fm.horizontalAdvance(entry)) + more_text = "More… (F1)" + max_width = max(max_width, fm.horizontalAdvance(more_text)) + width = max_width + padding * 2 - height = len(self._HELP_SECTIONS) * header_height + n_lines * line_height + padding * 2 + height = ( + len(self._HELP_SECTIONS) * header_height + + (n_lines + 1) * line_height # +1: trailing "More…" link line + + padding * 2 + ) bg_rect = QRectF(18, max(18, self.viewport().height() - height - 18), width, height) self._help_hit_rect = bg_rect # click anywhere on the box to close @@ -1135,6 +1159,19 @@ class SampleCameraImageLabel(QGraphicsView): painter.drawText(QPointF(bg_rect.left() + padding, y + fm.ascent()), entry) y += line_height + # Trailing link to the full F1 dialog; underlined so it reads as clickable. + link_font = QFont(font) + link_font.setUnderline(True) + painter.setFont(link_font) + painter.setPen(QPen(qcolor(LEGEND_TEXT), 1)) + painter.drawText(QPointF(bg_rect.left() + padding, y + fm.ascent()), more_text) + self._help_more_rect = QRectF( + bg_rect.left() + padding, + y, + fm.horizontalAdvance(more_text), + line_height, + ) + painter.restore() def _draw_overlay_legend(self, painter: QPainter): -- 2.54.0 From c837e6c44d26f96477a72753b7123805878803c7 Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 11:00:20 +0200 Subject: [PATCH 07/27] fix: reserve sign width for GM labels; annotate red-highlight mismatch Value column was content-sized, so rows shifted whenever a value flipped negative. Labels now reserve '-88.888' width; right alignment keeps digits anchored. Also TODO: red colors on live aerotech while labels display aerotech_meas - intent unconfirmed, do not change condition until decided. Co-Authored-By: Claude Fable 5 --- src/aare/gui/panels/abr_tweak_panel.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/aare/gui/panels/abr_tweak_panel.py b/src/aare/gui/panels/abr_tweak_panel.py index db949e33..e1deec91 100644 --- a/src/aare/gui/panels/abr_tweak_panel.py +++ b/src/aare/gui/panels/abr_tweak_panel.py @@ -71,6 +71,13 @@ class AbrTweakButtons(QWidget): self.gmz_label.setAlignment(Qt.AlignmentFlag.AlignRight) grid_layout.addWidget(self.gmz_label, 2, 3) + # Reserve room for the sign up front: the column is content-sized, so + # without this it widens whenever a value flips negative and the whole + # row shifts. Right alignment keeps the digits anchored in the gap. + sign_width = self.fontMetrics().horizontalAdvance("-88.888") + for label in (self.gmx_label, self.gmy_label, self.gmz_label): + label.setMinimumWidth(sign_width) + @Slot(dict) def abr_button(self, payload: dict): self.abr_tweak.emit( @@ -149,6 +156,13 @@ class AbrTweakWidget(QWidget): @Slot(DAQStatusModel) def update_daq_status(self, s: DAQStatusModel): + # TODO(confirm intent): labels DISPLAY aerotech_meas (saved measurement + # pos) but the red highlight CHECKS aerotech (live stage pos), so a + # label can read 0.000 and still be red. Guess: red was meant to warn + # "live stage is off the meas pos", i.e. the check should be + # abs(aerotech - aerotech_meas) >= 0.001 per axis; alternative reading + # is it should flag the displayed meas value itself being nonzero. + # Confirm which and re-evaluate before changing the condition. self._abr_buttons.gmx_label.setText(f"{s.geom.aerotech_meas.x:.3f}") if abs(s.geom.aerotech.x) >= 0.001: self._abr_buttons.gmx_label.setStyleSheet(f"color: {ALERT_TEXT};") -- 2.54.0 From 70107e6219aa25ce6736fb7af04894ecc355fe10 Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 11:23:39 +0200 Subject: [PATCH 08/27] fix: unsqueeze Chi/Phi row and widen Step box in smargon panel Move button gets its own full-width row instead of sharing row 1 with the Chi/Phi entries; Step box spans columns 1-4 instead of the narrow Chi column. Co-Authored-By: Claude Fable 5 --- src/aare/gui/panels/smargon_panel.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/aare/gui/panels/smargon_panel.py b/src/aare/gui/panels/smargon_panel.py index 949d6c80..dd7fb0ca 100644 --- a/src/aare/gui/panels/smargon_panel.py +++ b/src/aare/gui/panels/smargon_panel.py @@ -80,20 +80,23 @@ class SmargonPanel(QWidget): self.move_group.add_box("chi", self.chi_enter) self.move_group.add_box("phi", self.phi_enter) self.move_group.applied.connect(self._move_axes) - grid_layout.addWidget(self.move_group.button, 1, 6) + # Own row: sharing row 1 squeezed the Chi/Phi entry boxes. + grid_layout.addWidget(self.move_group.button, 2, 0, 1, 7) self.home_button = QPushButton("Move home", parent=self) - grid_layout.addWidget(self.home_button, 2, 0, 1, 7) + grid_layout.addWidget(self.home_button, 3, 0, 1, 7) self.home_button.clicked.connect(self.home) self.move_panel = SmargonMoveWidget(parent=self) - grid_layout.addWidget(self.move_panel, 3, 0, 1, 7) + grid_layout.addWidget(self.move_panel, 4, 0, 1, 7) self.move_panel.smargon_rel.connect(self.smargon_rel) - grid_layout.addWidget(QLabel("Step", parent=self), 4, 0) + grid_layout.addWidget(QLabel("Step", parent=self), 5, 0) self.step = NumberLineEdit(1, 1000, 100, 0, parent=self) - grid_layout.addWidget(self.step, 4, 1) - grid_layout.addWidget(QLabel("μm", parent=self), 4, 2) + # Span to the μm label so the box gets real width instead of the + # narrow column shared with the Chi entry. + grid_layout.addWidget(self.step, 5, 1, 1, 4) + grid_layout.addWidget(QLabel("μm", parent=self), 5, 5) self.step.newValue.connect(self.step_changed) @Slot(float) -- 2.54.0 From 252e08384dd69955f0e53151445e24a62e19a4ce Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 11:27:18 +0200 Subject: [PATCH 09/27] chore: Use rock and goto for better understanding --- src/aare/gui/panels/monochromator_panel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aare/gui/panels/monochromator_panel.py b/src/aare/gui/panels/monochromator_panel.py index aee95e50..29f3ebe3 100644 --- a/src/aare/gui/panels/monochromator_panel.py +++ b/src/aare/gui/panels/monochromator_panel.py @@ -17,7 +17,7 @@ class MonochromatorPanel(QWidget): TitleLabel("Monochromator", self, collapsible=True, default_collapsed=False), 0, 0, 1, 3 ) - self.mono_pitch_scan_button = QPushButton("Mono Pitch Scan", parent=self) + self.mono_pitch_scan_button = QPushButton("Mono Pitch Rock and Go to Max", parent=self) self.mono_pitch_scan_button.clicked.connect(self.mono_pitch_scan.emit) grid_layout.addWidget(self.mono_pitch_scan_button, 1, 0, 1, 3) -- 2.54.0 From c618354c0146e6a071873507aad4d085c71e344f Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 11:46:44 +0200 Subject: [PATCH 10/27] feat: add Change Energy row to experiment configuration Copy of the Beamline Setup energy row (keV display, eV emit), placed below the ML Loop Centring / Make Raster Grid row and always visible. Wired to the same daq.change_energy; not staff-gated, server enforces write permission. Co-Authored-By: Claude Fable 5 --- src/aare/gui/main_window.py | 4 +++ .../gui/panels/data_collection_settings.py | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index 118427fd..8963be34 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -925,6 +925,10 @@ class MainWindow(QMainWindow): self.beamline.illumination_panel.front_light.connect(self.daq.front_light) self.beamline.illumination_panel.back_light.connect(self.daq.back_light) + # Energy row inside Exp. Config. — not staff-gated like the Beamline + # Setup copy; the server enforces write permission anyway. + self.data_collection.change_energy.connect(self.daq.change_energy) + if self._decoded_token.staff: self.monochromator_panel.mono_pitch_scan.connect(self.daq.mono_pitch_scan) self.monochromator_panel.change_energy.connect(self.daq.change_energy) diff --git a/src/aare/gui/panels/data_collection_settings.py b/src/aare/gui/panels/data_collection_settings.py index 3a5fbc14..ecd2282e 100644 --- a/src/aare/gui/panels/data_collection_settings.py +++ b/src/aare/gui/panels/data_collection_settings.py @@ -3,8 +3,10 @@ from aarecommon.math.sample_geometry import SampleGeometryModel from aarecommon.models.models import DAQStatusModel from PySide6.QtCore import Signal, Slot from PySide6.QtWidgets import ( + QDoubleSpinBox, QFrame, QHBoxLayout, + QLabel, QPushButton, QSizePolicy, QStackedWidget, @@ -26,6 +28,8 @@ from aare.gui.widgets.title_label import TitleLabel, tighten_column class DataCollectionSettings(QFrame): cancel = Signal() + # Same convention as the Beamline Setup panel: keV in the GUI, eV on emit. + change_energy = Signal(float) set_width = 400 @@ -81,6 +85,22 @@ class DataCollectionSettings(QFrame): centering_layout.addWidget(self.find_tip) centering_layout.addWidget(self.bounding_box) + # Energy row copied from the Beamline Setup panel so users can change + # energy without leaving the experiment configuration. + self.energy_spin = QDoubleSpinBox(parent=self) + self.energy_spin.setDecimals(3) + self.energy_spin.setRange(1.0, 30.0) + self.energy_spin.setSingleStep(0.1) + self.energy_spin.setValue(12.0) + self.change_energy_button = QPushButton("Change Energy", parent=self) + self.change_energy_button.clicked.connect(self._emit_change_energy) + energy_row = QWidget(self) + energy_layout = QHBoxLayout(energy_row) + energy_layout.setContentsMargins(0, 0, 0, 0) + energy_layout.addWidget(QLabel("Energy (keV)", parent=energy_row)) + energy_layout.addWidget(self.energy_spin) + energy_layout.addWidget(self.change_energy_button) + # Pane frame carries the border QTabWidget::pane used to draw # (#expConfigPane rule in styles.py). pane = QFrame(self) @@ -90,6 +110,7 @@ class DataCollectionSettings(QFrame): # border, and the Abort button should hug the pane. pane_layout.setContentsMargins(6, 6, 6, 0) pane_layout.addWidget(centering_row) + pane_layout.addWidget(energy_row) pane_layout.addWidget(self._stack) # Own container: TitleLabel collapse hides its siblings, so without it @@ -147,6 +168,10 @@ class DataCollectionSettings(QFrame): page.setSizePolicy(QSizePolicy.Policy.Preferred, vertical) self._stack.adjustSize() + @Slot() + def _emit_change_energy(self): + self.change_energy.emit(float(self.energy_spin.value()) * 1000.0) + @Slot() def switch_to_raster(self): self._tab_bar.setCurrentIndex(0) -- 2.54.0 From bb447b15670addb7fb339db41690abbe21b7533a Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 11:46:45 +0200 Subject: [PATCH 11/27] feat: rename Monochromator panel to Beamline Setup, add WIP beam-to-box row Display title only; class and file keep their names. New full-width 'Move Beam to Box (center) (WIP)' button under the Energy row, disabled with a coming-soon tooltip until a DAQ endpoint exists. Co-Authored-By: Claude Fable 5 --- src/aare/gui/panels/monochromator_panel.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/aare/gui/panels/monochromator_panel.py b/src/aare/gui/panels/monochromator_panel.py index 29f3ebe3..e94224eb 100644 --- a/src/aare/gui/panels/monochromator_panel.py +++ b/src/aare/gui/panels/monochromator_panel.py @@ -8,13 +8,20 @@ from aare.gui.widgets.title_label import TitleLabel class MonochromatorPanel(QWidget): mono_pitch_scan = Signal() change_energy = Signal(float) + move_beam_to_box = Signal() def __init__(self, parent=None): super().__init__(parent) grid_layout = QGridLayout(self) grid_layout.addWidget( - TitleLabel("Monochromator", self, collapsible=True, default_collapsed=False), 0, 0, 1, 3 + TitleLabel( + "Beamline Setup", self, collapsible=True, default_collapsed=False + ), + 0, + 0, + 1, + 3, ) self.mono_pitch_scan_button = QPushButton("Mono Pitch Rock and Go to Max", parent=self) @@ -38,6 +45,16 @@ class MonochromatorPanel(QWidget): self.change_energy_button.clicked.connect(self._emit_change_energy) grid_layout.addWidget(self.change_energy_button, 2, 2) + # TODO(wire backend): no DAQ endpoint exists yet for moving the beam + # to the box center — shown disabled as WIP until the operation is + # defined server-side; then drop "(WIP)", enable, and connect the + # signal in main_window. + self.move_beam_to_box_button = QPushButton("Move Beam to Box (center) (WIP)", parent=self) + self.move_beam_to_box_button.setToolTip("Coming soon — not functional yet.") + self.move_beam_to_box_button.setEnabled(False) + self.move_beam_to_box_button.clicked.connect(self.move_beam_to_box.emit) + grid_layout.addWidget(self.move_beam_to_box_button, 3, 0, 1, 3) + @Slot() def _emit_change_energy(self): self.change_energy.emit(float(self.energy_spin.value()) * 1000.0) -- 2.54.0 From d94fb88148ad317f8cf7e44ca35ccc0c9eb6d184 Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 13:41:36 +0200 Subject: [PATCH 12/27] chore: using aare_banner.png since svg could be rendered wrong at rhel9 consoles --- src/aare/gui/graphics/aare_banner.png | Bin 0 -> 215175 bytes src/aare/gui/gui.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/aare/gui/graphics/aare_banner.png diff --git a/src/aare/gui/graphics/aare_banner.png b/src/aare/gui/graphics/aare_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f4e829ca391113923d5b75a740861e64a4bb04 GIT binary patch literal 215175 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%0A(dtA(5 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%0DX&GesSKh3E4{d77c=6jA{2TMOc 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 HPs)(TSnInK(dF9qA`C9g#svf*HBZ) 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°9vfk*&f1>;0Ct#P(+98 z;+DtlpmW=~Y(}b@i+XANjy9`D93qdL^P4MNK{QnI|V9-HF6JkuH8j&DH3gI23!@3a$SO*%r~8+Q_vraKl9Fi5=4*f zP35sJQ9u3i?f1kO7dxAoP|bT-OUPqKIz2ZHzuhbH`ilw4TAKvVdtW~wP-$51 zwRnj7RaBE4Zw90ASRlNRGz>;^fw*m3gBC$wy=PfqJxCr4*|AnfZ9c0Q-9 zhfyYjE{_WuHAa5{0#o6Qou#45Pvr&wh#*+~X)uQZ6RHw1Byo)bGt2EbUmSOP3|hH~ z^##AB1col=o8ogz2KM(~7gkcAB?-r+Fc6#*K5-C{>u5%Mt)+-vt|$Qo+OuWWKtz=4 zY$*hB#4swV$Tyo~yscozZ6}L~P6%o?+C=w6d2`SK9&J2Ay^re(s~W#qm6Wb?8z2H6 zx*WQ{hv?4yUOIyLJeFNGcp4n0>0$a|?7aR(yaDx1cr^FSuKp>ZI)2$*?>f}^cC^Ig zqL zdA+`&{7KVqg`*)f|5aPJ{LyV%Pl{{%+nu$xzES;`29GL%YUBLmYjr7#tfj2~)|@w7 zC8s58y*rJ6bF%z~!R7a3RULECI9q>vL-*es9EBLu#W79VS?9Psp^NY8>h$AVw6-`^ zC-v_4YaD<1M!jC&)2(_;s_TB=7wPt&x=!o6kLoy+b{1Cis#n6>JpZf7>laL3pGqo@ z6RSF}ouPJkO;hWiHS5}b0pUkpsq=hvjdgtPU-x>xQw9(F#R2|ng5~#b)$@Ens_H5S z9Vd#k%TvWFu4uYjuHODvJ>6~}&Hmldc>nj`smJ}v>vf(7lJR~ctM>o(wzm9Rv%W{| z<MU2nvd*`(MuZ-V#uhpy?2Prjv_nJ6Q6XibkdOmL2%dJG8 zNUE0c^-mhVDuFr|X@7p^&N%s$`Ter~FV5&F=iA>KFf3Jg+!0`oM`;0 zuQQ*g@9vIo_txBpg9h&raJm}pW|0`x#Eh0FJ&*3MN@!~WpNa)e@sJ+Qb^+?!9BaKIiy z)bSWiP(7&kP%)xN3Y6Kt5t-ya&JJ2@thjlMb(mnR60L<>3$qlsqPjKAS?@@lk|?w( z=Q{RjhIIe~q9kR)g9$@*XF0p zDD2qLp5!qeaT{L{&BDGT8PZI|#OZdiU1FY54RZyd8t;mBz}|>Js1tUi!as!Occ|84 z5SFwz-YbaaA-pad%*wi)?LF&<#Syw}CT89Tg8}82CyMyb1S!4T!2$7V0{XeEn5iTVb~? z4i^dq3dJcDihC*U?gXc}OL3RtUaUxg6p9s>;$GZ~1}F|ef)hLh4;tXlyU*{Oi|^Ze zUp^P>YOOV%F~%HoPNu2`;Y0E#%x`2c+UbxZ;FrvCX;~d{nG!8sK=g4L+21@+Q#b%u zB@xtjJKrHx>taI6KG#9^q;O>Mrr`EMAWA!)dQLvodb?kzKl<| z>q2KhsalaQrs>nBBJ7`<>B79kv1CN*$TT|@k|NrsR&Vgk zMpN^>vCt~udJCd^p5GSslo8t2biqKTZkx6r+=xYtvX$ z9h}XBc6Iz|uj$dZt%mac3^8>fZ0-JdQ8Te?XAEtC*o=irQqBd8Znun^+;GMSgQxmeMYo|JKk5UNtA(5| zr@Qvn*D2U&{7rB|9YfaF-X>5#$|sot^|Ls0gWDw6+}L5dOcNdJZE1T4O_B`WJ?ov| z5RM$PY~B+a&_e6&vc8SOgBXY*{g5 zRQ)B#I{bEaA#oB+Ln&`}@A&vZ9UE{{e~PrV7j^mm72u}K!_hGttp5#lz{n{!Z8{`~ zBM17xZJ0Sid)O)QVGnO!7tJpPDXP1!9N5%mls+snry#*uYV`7#lGtI3ub6n0n50lv z=Q(dHJ8C%Z%B%Z=J1I$~` zQNib&xd=U0)AyDq6+J4{=6fF8;VZEiT!!9B*r}Z!lk4;EXGeNLu&*!ku+E|}zb27A zO|Y4-9IvGas%F;LvM9vCrL~7)JS$qq_C)0V<9>ml(4w~BoU}9KkUbGK>3t40ze;@^kf*jqAzpki8z86b z{&4#Gqg*PH>CT^a$nTmgtMYG1|BsjwzJy~G{@fnXw~8c{QRg2lFWgOWWJVhcyRaK{ z)QIK&Vn~X)RSAzk?NX>m-2>6uC-=}rz33%4rTDk~p-CNB_Yt2?=mFWxH}0#LdObSu zvdRml@{t8DXV#95%(pk1nS1&w=e93gqV7FSU>MX6dw(BJhqs#%x*`Pvdp79MvQFn5 z{?N0(1P3W$f_g1eZ_V7Y@rcU!tqX?WP@HJ{lL$o@y4ts$8>FZH5qjZ19Yd%$b&Ksa zy-(?0toN4|=2vf0Y75Z&9_}}mv`a&od>Ajo)Zxs!PnNX|5taqVY z+)?b>ci+H&SB68)t1#};74)Nny{p`uAKKfdhkBHTMow1BsyW-tVO`K{i!6bwym-}K zM{RLaMy5Bdwo(b8jRS4jjrsl;oNke{)vZxcWscl z?^2gt-sD{=AKkVp_jIt2_=tx7I6+T~FkX754>Dala|XWt}9|GbokIEQbnG zt%poyKOqRqsKv{m$nzU_wyGOr#SvyAZ3EfrgJS1xC?3j1t> z4loJzz5Pm@zm2y{D8Fm#OmHPT(Z#OVLK1NGT|3>R(u1I*Il;{e-?sQC3Ik!oP!@lF z8_$2Vdhg!sonq?lOaDn>VgF`H^ZDzx3~R8x$WFs2>zS}YM^oeb;m6`mwR8_37)T_B zFH9R|abkhir=q$OBw9rP%Sn~i`N_Wl8emmSp7w5qAW&Nx7(3}x-2ga0aROzfZ)Qfk zHgVng&ojipgNbwdF{+Gw;%UFJri)hTM?4nsm_f-ur~Zv3Z!9kvhPNckoG3Pbe}~e? z3t?>rAXzq+?C~z;S0Ct{rT;D2b6%p;#ryQ*hFYQqD5%dizEHmbB-)DPJz@S*CLd^N zx&kyg{ll&F+6YUpWxeF8gDC%90G%FuMN-%#a#56~%TegTg(Oi5ga)LTt1z)J}O8 zFA3TS8GVQ0YFF>S57{?}7v-sD*^wb?1-}C8>s1?n(x@99ijM#@FXqbA(A~3vz}0ms zVV~=|MPoZ3BtxSs!H>-7ZZd()fZhHGMA=PKb|iB2>LjE40{ON{;*B4skFJ@awa} z;gb0qLgHq9#`t{N$d@&u{T_T@)Ua?eA3}d-= zaukL?k=MI09K)BBz-jKrB07SZ%XO!D!JQGB5Iy^&AKE^Nli@ctU#IE>6taKHuZ%Trg3iJ5=-7$eZIO#>y|*6ANg57f8>X3@NR19^mf_|=dQ(q$geadb3LAjEqI63Y_MRq=PpP@+WwuQ^SGicr+y`sc6lZ>YPt_L;#RAB#LJ7^=q1{<$6JW2TG)DLImk7*No2n|>!+$((?95ZEG)Bh+ znkL^#)->y%8=az9DyMWM_6&??2puXCoCx8qB7Uo%bCX3Nc?+M`!X+Wxfl8jE5~T~o z#!bX~#$}!u42@`Ip2kcb76gYezwE~WH_H6o+`Z-*g<3c7t?}L#Bns`rBJ?>vXaRA1 zQtrr9tR1IRWmFm)Fuk|mefqKgM|?MlUD!y-h8QeFuqKWz3M>hEHqYF12D}187$>x= zF0dFRXm{+*UR!Ov#hju0A?-N&sR>P!m`bGKYZe+cO?c=jhc1VT6M8`Mo2W5#nbfER zr&F*V&qM0>(IPwgdaOMP{V~P5ID{V;dT=uk0>1nF^OGcNEncoUO&LDF`P>|MW3l?> zQTZLRrN=G69&2+_WM{gnbbiUk%k9y5v34wvzw=`eC$i-}7Q>^_X%v<0Bjxzt%5Ts$w>ebmvH>sfqtGrr&$ zY*mF&e^xT=xS{F$O!tX>8d*6;{If-FkUS!X{s%1>o-1Jp^%fZW)}WC1LFzZ6@mbwP zvUcsv_cbb^CqQ9tV9~j?K&j}5)o0UZ&+a~Q`iS}OOD)mP*^Tqv#Kf!;k>k&vT@PL= z_iq{tdo;W@Rf4SyO7F4{u8TC=BD$(hQf=-PoXojz7rlokzgpD$Q>*HDzr;uYVg1~o zz*$=r^@>^VR)XzeR_9SUh&wzS>OBUer}Z2=KG?OuJdWB0#w%Iilam`3w=P-f!oVJ@ z`Ci}GU{%;Sc8_f8N~-;XWJ34qwr}3tRRXnl_uiU!?Zw@{T(grW_u|~89-cgaU zU*xZU(&(Lm?2UJZ^bddPm-j z!Nai0uluQM`UG~sNlt7V-@G?iGpQ>r5;64T-f)bR^>yg#A%rPvaqCo23&Ph^+BdZd z5KAHw3TiMA%J?7*uO-z z0Ni^%J3q%Q@_G|yf^X^Lq=MUSCqeyn@aZtrAny6&Dlw;%73Wv^Z?j`B-2=tE53_VW z?lPJL^o}jO>!Hzux2nFcXDFe@9M$TcKf!4VW~P^{sb>&7e!HPbZpHgSe1(C}zc7*l z@s4|1#Qrnj14Vnv`FQBjWzkL=?F);cm(j7Y@=RzSgMa#*DEuio}Uq~}=ierQ+_mG`K$5E(=EN?O%hee-dAEIj5Pc=8v z%M@T&{uR~V>1Ih${f+)-Uglxrv559E$cff;$mQ*kY^o6RVu1+pKTkie1OAJ1Ya&s7 zw?1!-K&gK``!nsoX-ch^R!uQ>(m=J}ylIs7ScR~=<$lpL^=15_@r41tZGhio1*_`3 z3JPXnjahKjRBoju@}sZXz6jU&yx+dvAVw&cWFp&PAx=nv!LE!`Z+Z#Z>y(P%vs1~Q zC=E~SoS&}2sDvvH-bue0qX+X!zk|)h!HZ&C9I8+yR5N5gYC0Mzn6EfkhKv>=?-_2& zH|QYIkEEaFPHjM(Lbp}78a4rYtFS+GW4C%!g5e=s0l^VL(K4^{=xj4VTC2FK6Ms@b z541nmseV%DTIO3r2bzzs`O8Z$oW8vXc&Ki7#rh7nZN4%M@xAtz4177qC+pB*O1)qv z>A19#Ol3EM7F^$J1({>#5CGB}hpc%?Jc&+Yb*|u#T=5RBxi`rbt}1=0oqJ$9v7U#= z#&)c};=5RBojG&m-n&)%Mz&}>v21lPM4uM8f8(nX{BXp7d(02Jj1~(WfIPfgwK>0O?_E9qRB@IGteK9Fo)O2>lLhFSl16F_8XlQUh zuM{dq_slU|5#%n=l?^^YwEK7TmVZ946YbE4cNQold}j;_nG51D7ONo?$*9ib@(+@A zwZ{h;0OqMV}>(&fQNQ;Se)!+VGk zNHX+kZR+Aa`83GLi=7w#@;(K(19uogWEG%E}AV#NBb@oBQdoDUuGn~cqjDm z>0?54z(F(95F5M|Evb~M*ASOG&h3Z|lhH}=g8jUF8@o_tM;rf7s!w1Rm8d!+QQRp} zF%puBWb?0}?A+InnM2dm1cd5y<$9gH4iJi{dHJV$OW(0(fUPN^@`ZU|f2fJ)XWqTf zZ7ulciONTHIO(aw47PrP*qUgm7QR1rX~C2OdAfVxy5BG9?flJI zCw=WaCzH5PBnm>d&$I$*P5KbRM=;9HcY2;oQ=-zgtbFEfpU?|{mIpyV;k={Cg{H&x z&54g?6s(A7HPcD8Sp&oMW?<#*9p#n#+MOI;%glD`KvB>wK{pM{dhlt)LMTq2WJAkw zo29SZ<>8IZD&}3Ez1~q&H(h&`w+GIlj3wYh7(NjV7TRltQ`ebuBprX?ay&w7A|(1R zeK>ug3;U5t)PhDVb=m^sFlS$`(&FBFk5@u_^>-fg%9s%J+UQL-brWBi4J*wM}*(Vu{?7H{DjeHS1sQQBiqjxAUxu7HZD{#ETW@d3w*s2K?RNdSd3_JihX!l zMao~qf*(&!H0#_FE}$7y@^{$d#oUT5qeK^<-U{l2&BPfTYh6C?m z@9VbmL6Z6&lKK~aV2G8r<9`d&U0Qjzm2Aup@5|CI#I4VRk%Vk}o>!rHsi2;~f2UK> zMb5%S%Hgc&j>I1C9&;~bLuknS_a74{m(M`)aHb~4X!mp-mQy;>FEQO~G$~oV=O8&r z{p77Xv1f8?veMoYI?+S2W4HZ${b#eIxj&75e-?4>HFTc>4<;7iL6n$bc_r6N?_b_C zydyiuag*wQa~96ksIFk#0Zz4DY2{cyHJ^5UbCeDlRn&+V{j!vtOn!}X{wt$pReBjG za_x+lHW)u1ddfoOzk=fq3zb=C{vrIbzU2AXYbLoZz7O;Ljl0dmB8yKK+=TJt4}NuQ zuEDRDwmHC4q=?sjI%IHePN_{q|1m zwzZ5GpD?S2v{l|8Bhp4CRLdXkI~I19IV1cK$`fKyG!Dj2O>ff6;%e-oVD84hMG*y@ zMcBsoMsn!`r1A}ACy6Z);e$nK9lX;xd_K6>tcA15O2f5HZ#A6i-uR%pu)LWzI5aE~ zR8a$}py#0{-`zYg+_Y+)vVQP%1ztLT4EuMLx<=8!Rc}D(;Ha17SY3(@m7tFQ_boN^ zI>QV+IYh#7bsYyD>NP8kdV2b`V9#0#*&JGfG>}@ucMv-pf6xn`x{2r3EZv5Q*Sa_U zi_bkHH_Cs>@c*BqdnV=$Wmzd!_Q@`R5Cx{#ZTALIFY~GWDA6S;vaI_E+HX$D70r12Ku*%1 z`g+Loun6^);b5e5sLG45uOA2~>evoJgq`#2lwbcfOP;e6lYunipueAEcMt+U0!sq__ z@?ZHCw+AsIAY43pYB^w$HwL9-%ONvOj&~gXCCg%Kbc~mE(j2^DhrXvZubMLwrByRO z0>zFmgI{9kyI{n%b#DO_X zEVTJNCcXvT3ed3DD-vg+?DOD5CJH!0*etLfIzD)=zTWCc_E;T?$ZI!qp*(wMB|rQZ zPcFNg3L=7fj_vbpCWaRk^oV?MC{E$o zy4b`#B{dnmQ9by>bm%zleI$_TrI>^FZfsM8*6~bTHwH&U8Qa?nFV?vCHb%i)0@!(8 z?1>Rxlgz7*yMxO+#6#_1Pn^H=R}%*@Qo*g0o%={s6n zo)RN?$hK-Dm?@RhLPG;4RXqvl{m%X?sPx}|{2K&|IA|5u$Aa`Fz|H^2975Dtx9kw; z*ut551GXde`q>CA`eY^iU#)Q=1URq$sw3U{lq!=6kvytK?%wq|nGmjb`5|VukEa0t z%;hxok7a3s_vYCUq6`9`psW;xtlznPdN!8W+W9?<#Y{dACU}m8#s^zwbJI?IV^zFl z(X*@mJSw-rMHNHqB#fD1LBaIz3oEMhlos)8Ow?5%Fm0wTV6IT*=aH^tOD=$Z6m(?= zhnPOivUUu_EU!ZhFA|l~jP!|y60YWwSm$78I-~3AGJ$1cbbdhL^%Y-JEz`ZLI|@6H zzo7~fe1juKpNK}I{>fkq`Av4sO0~2dyD>wG8T$)?kC;LFVz(};OnkS9lB%G$I z@BlodUg%NksE6-?+N2qF%NM#PvM&DK>G-n-CY9cWqs-@7yw^e7|Ja9YWxDK?%6|P2 z<4Y6cGtetJzm$C^_v0^-x4~Q|fi!s220HQU#&bmy+IpmR7399oOX}V9J=NpL4m6tP zZ4_{KZE-63<6K4|0XSDmu3erjq9ZBh?W@fD9JHdlk!zl?SQ~#1V*E$`{`YWc!H$N+ zoom8Bhf{@t2*PT`p@Wk*xeJs^CqJo!mI1pZvk(n%qCoRH=RwcZ4@Vlky!S`gm~I6t z6H4>-Js2%Xrl`fr8%_FoIIjBXcNlP~l$bo+b!Q*6Gi99*AdQ?WZh5dIcNhL->dJ8| zR0u|JiKiSQEu5#7Rg-c~J!{6Jdr`J+e9oV$B|%>(q%$txeW&2pBuRw+y63P}7o>Yw ze2e&`Lb-PsAoUYcu-}?;C+fpt32=l+b#?;c$W%qw34xTKPUN~mUQ===FCVY>hIqai z5ke!lT9;=bGpv8f$MAVMMIC>+NltZLIJ}*X){n}_Yjys82fyL?gWi#ld=VqRGPG~P zTmHL@F^UU4yTk{xY^;eN4>!w-9fKdEP=SA4I98j`f+0)I7OB zs!xo6myh*Lph8QVYF#`2-^D|IcPJou78fAPI?;rv!kt+tYQ z6-Y>9btkfC{|Bgl0r%bF0RB3v9dln0ojq1ye7qsWrf?OLeR{mgTXcdi3RO1T&vlt% z`xpH7Z}2z}&zo}OzE3r|&QtYKy};-WIn~W~t&R}!Abx!F7IUJgj5!Q5v#fuJN>N;% zf?@w$#Far>1(9+iGy47niECNYZ;n=mfz@3xqfLoP6{&&OL`3XK{GJ(KdaT}a;?*O6 zpK(xX=#;+44>k6%BKnod*S6fCkf^dFg2_cLje;S@!v?*px>Kg@5=@grD~vxp(4PYi zE!N^zfBPO%*9UtCdoStWUBP=RiItL}?z;u$O9w}v+L6t7psV%LHA2-(R`4M8fB#ec zC;RkYj?)Vijr?2`zwSzaMI}M2W*1nzi1gup-mPnMFv4qBlw7(xBzs?_m!m?u=iPNS zEB&3-PbJ=|$kO2SQZ=qVxN$f4b2Yx{s5v;iS(K4vbMH=-9E9+vORYq+#%P&brC71$ zfUQnn%VplRnn){R+Gt2M{-#l2I8j3*Ai$d;&mRd~ypI+|`kNF<`M;X`VZRqT^)bz4 zioa3Gv;yLCFXW<>jhUzs*!eMk7$(D)fwOLz z|H&WGGAVAHqsBj3vH47g=9g9+u=*{mJNKU%MXhdaAVnA)I$#0{JHW8iAgKL*@MU=5 z)UwJqh$Di@O2!%gP3llYJU9pxwGxxy+sq>Y`lTsUd*;C!;lx8Oj& zpJQHOo`2-938r)RQ%s}+WjQ7|CbyDi==39*(n`MiuZHuprto5NBQW)hnGt%rqeVv1 zg!n0zB@G?1p6|kxVRXRO>1u?oMpI1#Sp)u|No7u_0WVLMEM+EEM*#M{rmQwVkO_H; zcjoS0Ks_HH`HOK!mWjs!OMT#P`*YXr+v9#f2xi-iXHy1sbyu(}^P%<^Upu#-J^OX= z5;zu=pS=_-`K#7kCa{z}$lEiUd}~5+0Ay_ME9F)c41XBzoKPI61-cehKkgHUjdr9> zy$=n0`9PG*={4+^uZvbD*zWh$O&iQuKj1$G-2k{Z<<4D_61LK5rZ)-8OBKeq(Nd2A zp$QUA^o?Z##m2HpgDivo!`lJ59|hAp%Cy&ZMX;frnwv-vBJ81YKw^pZiGq9vr(4L| z_>rslWknakWQkBp$!tdnDFvNc3pK^s!i|_-0_lIplmFkf5T+(AwfYZ|q9_sbtcU)S zdcK9|WOv!cHcQss>t7@H9(y;l&aL`SMCdd+AGfW(Kb>IHt(2_G&x)4K52~|ShvhhD z`Z;8!;GoD*HVPZ=vWxxD{UAFE@V=)M%r@Qhi=v^r)*oQK-aoCO1o%Z8%PT{dC~L;0 zc1Rn+<8Vzpe8CUl^#I+AoV23awBzcg7NGtPKHp+|{k zxC#ChtziGYnyrQ$n~2*}Ki9{6{zy7v9j^CsHX&SXw}iXKp67e6m79a2Ooo4Im@qZs zhkuTdtUS|n!nCC4XnET z;YWsrW2GjfW%Lt4{HSn~(^`y}Z)S&j*LP>OQ=4lr{%V|f&+MxnwN&#ju^DH%-yNTj z@-VpTiT!9_Y)yPAFBE-x;lNm5EYm{5bgWd~%fl&@SVk~eWHXEMaHZ9+q1?z9wAaw< zHvz!@f^`QyvxA1pz&N2Vk9sm*Uwi>?*yHAqRqGFQXExc91VemgwKnzpU|R6H|0 zI$hk%PI|+yE<#3045w}kg!0@K^V8&Ijxo!!R45*p>{!UFN1FqZGHRlM5I= z#cP8cG`4_TlVq>oTy@cW5p|k~zbt~RK(-XSnI8z_A8tCKl6iRendjjKI}4e~K{*11 z^PLwd@;~b;gs$)zb}m5rL`3b{XEwFsq|)-JiB@ zYr0|Sy3bz$uOp64CvP*wZUOo|9($s1wcDj18Z%3) zrJQB#Fb}jcr-dbtdjjmQPS@^C)mmS3ouA`EGfy^olra#(-kaM$k01E)SAIE09RB`Z z8yztn8G49-p_CnQ-*#NE9H&znO)qep5P}wBWD;IoIoFQYOs#uI0u}N<6;i#gbH)5L zf;9xU77DA2=2zS1KhupO{uWbhC(Tq{t90e4Z2Q2jawM#EoQ z*xuzh;E2Xt@GH|jfIZua+HVn;pUaF}Oc@v*n4;lVlB@JXpP+o(0`=@D5=m>D?L>P$ zRA=6$)co<&Ty#Ux34^w7wVE#8iKn(tvB^5!FEr2e^RQxPMW^X;JO0HUQ;Elbb0~w1?!;*+4!VO;k))==Ux`(^iUw44uZS z@D3YGAUXBD2DsfF^k*CEzTREjzQ#lnt%F29UC}tgHF4BcEZv}qstK)_gD!@L$)~IR zp$&NTGJtR=g?*>V;{G6QIti|Ne`-?N59cE)pxWFlEYt8Vt+A2Og}+DJOcy-c|Adl2 z=@3UlN;Vmf&N+ssNw$vFcT-s+ca1GVws3%FDf-d0=MVX0{4(FmMz)u~0wz4B`RHx? z4)EoQO_-Qi*4O;k5up?W@D2~)BKpIjXz0go+eM=^F`a6RN829Ig~Hxtp{O!C%QLj+w~BVxqHpmDC%=z=&~C`g618Jcx#il2#Sz;PmH|CW1%1+LJG|z0# z31K0IG~6fgS7`!BujK?KUZv27aSYdwby54+VJ$ij=vVn#AusYKSiRzF z3EjI!Bz`pOA-h+S6|?K{(|QU@cX)@5ad#U4NlP93Jfoqk=Zw zG>R|BoCQMdrFwaemozqaeVGmPtaY`N#t46pV_n7huYwOnDQ?p)ZfP|0sq0m~S^V+* zQZFcHp-*nmu9)fr5DD(zx$FIZ_Ouao34L5 zZSgDj4W@HDV$qRvg9uaQz97gR-{BFJyR6>k{xzg(jhp-#JJKl}AS|oF_(qdd_2aya zETLvNSsCXBHBo7)(X*Ly_c?%1$r#B3E*d%GSPLfar3w>bJQA|$Yjc^`R#ukEC>Odx zRUExRug;&$lj>EI<~#n0xrbU^0kjStqLYebj3L}aeyH|c(XwphlB=auL~}fDj{B&u zNb`Zouw1_)#vrC+EtR`ZvutKb_(imqL}X6QAF;+|GuLT;c|FLh&)9l<$+e|2XcNUB z9S49fI91exx=4~UkaS1!sRqoZbLf0e5o;fNAyhptb*Ib8Y&h@_JBLSOC_4%C{_Z}8 zY&Na^JJAJNhtQg)V!RAtLZGT`KJ;@MO&n0ZQ|s}tT^{qbk((_2nHtl5_`jGX&u{+~ zrXMN-=kJB7II10XSh@ZK?_(I9-^faXdBF9V*A3p%OJ<1#z-@PcpOD-8RKDL)8>g-W zV|*OH_rf+UYAiL^MQklMReuMlKoSN|oIf_TOjmrP_AftU=bo*>Pgc9M4V9gX4>%w^ z5n>;VZZk4>3UO-E2UX3lKIXe!s!Mk|rT7w-QjUo^h!3Lc?wQC67ME`xJLf&1Af!jnPT;o;h8lWxA9Sf{IxJTGu>E0^E>a z&sd1mB_+&1`cP)V@I;U1M9idrTRwzeQY!5P(PxtJZv_p_9uS}Bf+Di~0f*-D)FC^i zg!rX`>e1TC`#k<K;eQ#5vTQOnz0ZFXc1J`Eu}O2qi{+B=sHQKAG+6|V>Mkb3EO zn_>*$4=%3AhO@YSpnTiGeHIla6KSR)!nU2{EC7qRLuU!4XIGK6-x2aQ_9B<95x zwS`^>abVh~8Bl_07b?GjevHz%^J5O+`^}^B?Vpwy=~pDdGq{hUEC3Y;4yxa#NFi*k ztNS%Wy1{C8xHZ9#E`8xJ4Vg1?PX-~WNz6pNG9N?upSw$0tOxJM!6WE;eqhLEcVMFV zg~8pgy{FZYy&R#q6OMt)LK@G2yTbn+;eI_M+|P;b+W#P&55C{k{f)W$!R&tAotuqL zpoDnrjlzKsgzBiTW6BIO(3+jo6=R>`hagmE_=|2Tjy3sAD-|UWs=@$RKq4xFDW9o#+0c-4rf)S2?Nw> zCMtH#f-PaQpGP%$DvfDJN;KJ@D&ML+1kf)iT_pk925!S`H7}}t$pK`sRX@kii{zy% zKWu4;WAZUPC*HDxGwN`^12FP>{eq|(+Tw5SB-X?kZ|V1Se7UQr(UKrT^r4!0%B8q` zXg(=sp&#CESpb$4k>%R}#6;=EqC=c-79pM1RKE1ggGTh(u49wqTu>`*1`H=v#D*&Ud{4xe204MOuCzCBbYn8-b%TJg>pN)xwVc|)`8v1{okCHGP|LBznjKw<>m zEN=>>=Bk|JBiozgZMS~PJ?e-AN-li8DHq8<96oUI2$+g zOsE1ekrfZ#5yE=Qm61nA@L~(LXE&4Q#Cp3kx@(6^h1i9}cHyf5%m$VC17KYM~kCL_W)h3Jc%J53ltsa#S)5(^tLJHyV$Hz4=!GRu6E=hODl-&gM}co`Rln0NR4dtc^7tQE3Ak8knBC^ zKjrcNg%y?1ed_9HEbk5GdbXD=E(jK1qNdv1iMJXWV~4-c_n6uUh14X{=$ULui}(Gc zpj#;$d;^hbJ&uFhH7z%%?l_wHR4Mr^ck7DOw{)?+tm}$57~B-ARyV-ABB&FCdBlWa z=6{s2>QQcT2Uh<~l`En8M_AfMt5x~VK&H_#kE~W7@!nj&F-?lXy^68btb>1~C+IU? z1Y7>EuW4L5wID}Ij;s$tl8)lWE)g2!>2Tz&W*2UJ4`WCbRph%jn-Vb?oA?XkJSTkK zmt0g^)on<>J+X1L_gMiXpY1rR$Vum;_+A!Zme_t~B{^r)l-I!5&a`K5>N6`)VH5Q)8Z&*l&G{9_!ov*~RhQNI zNIUC+A!}$|(9s`#{giTEP8c}c!oZYEcQ^IJ3gA%QrHmP-_@PTSWl#I?Q#nod@`UL2 z%JR};FXPHBPuMQu;$Wf(QQCvbyV21bF-f~u@ulCNrws_^DL2Rcqs<17JRHpFuXPecHva_;Eu}2blUOUX6)HntmiIlaN{_YD68M1u15X({p9E z`29O0ddgcuFIN3By=Y!jbS<)cOt-J`c_7^>k$U9(4P|X2KvQQgXMxCAMvlPm+CfY{ z0n;0ExitA#BhwH4%D3~U`w(g0*l)p&D9m6ySdZM|MF3hiqY|Kr1XfFdIcC9ts!92D z7_fa&J)~==>C1)yc^jE=7EPI0B2Av&pUwFt%{TofI1d8F{YNtsMbo#eDcx#ow(pf)ox)e@LFC9)9!D0p9pO%}#igcKZBOs3*aE`1{K9u#R|~% z8z;(5J9trlzL`CwMk?MwnXT}apu zFQS|HP|nc9>DKYDs3bI|(MOj0G4nBj0UpUQ_-@mcuUoL*nRwe}o#UvGBuy36zY0+b`MQjbK_cbj<;ol(p zBJ*%nvxJ(;Ffl#%W;Dedx`z|R2eeXtw_mQWWOhCy(%yJoq4J{i_KC7h%DoP6B(zTM z+VYvu{q?@DqMty7rzfC84uOV{h-#v@kGT}p)D#g{!r`|^9LO7XkeW-@d^OP3#m{vV zUlzb0RwW~u;byFKiGaJo6qa+UNG@I%t~6s@7cn@GI|2U^5r_FOo-m0k^7=WQC*9?T z432o+Nsf)Fn+NgaJmu_Uk%tZkws!qb71aL&kOj#Kbptkx65gi@fH0q| z1qPWCOiZ3pR?-t^FBg;MGZD52FpjeXI0P(m?rm4)GuJMmHh^a;J4g*@RH`c)=cfrN zPi&s?Ta`+IY(6*pNBO5BSL<6>%E|C2DK+3XuK^P8EAwY8YQxBI(40L?0}=Z%tGXqa za($2em~e6Y*kps>E_-nh52jY@-^NSQ^Rng+6q`WGlH$8ErPMj+C@W_X8{L5;Yw+$I zcSyOojG7QUwXmb8N#;`7r`q@Qtxn2$cfdU}O0CoFhw-~6;!DiWUC%q7m7y=nYeF+t zE_yk>wQtk;IP2Abnt6b@PSs8@H%U_WoD?5xQ6I$Z^mG9j_XNMqBHFi}s+G0Eq$l>u z7w9M1E5Z3Dch-uZVX@k=`eF73^bgcd<~H` zo7Jm((m2KaEA_(+gFT`-GR@$`^m3>pua;I&wwmEvgsRCEpxdV>Ad$oFw5OBq?XU!d0Sw&;JjsL!Pr~gO#_xX)(P=#N- zlkbJ`^u!sxxbl#{N{-}xId!?Dc)dbhreR$s_^xj`eHroxLa=9+1}V;Up;4?8Z(X%l zc=L9xe*E^Fzvx`u>(_c}_53yL;~WvKfEqQ# zv>K23Was}rfCBv67X6<&I9;Awyyuvza$gz5T>pG_G3=7-&8FHTYP z0WW}`*sIgI@SA00g&GvHHGb&OVB_e{G`!jSW{cWSlK#RQo~3EKg-fQyw0Js*h8h*# z-ivOeH0IL2Z&D9&7XX4`95TDKgk_7^TV8#nA1fXQiG`@JK@FMgL_?Yq6DV>X!?y>7NVk$}Z-aTyqKNI=>1 zMnR87UST4&A~O<+>zYMRIArAuxW|Zk!MvIQON@bTv)xL};KJL$ZIfVTY7vFqAJ6Lt z-!}23EvCZnk5rhCO+T4`eYzR=*SHvta_im^fYuVJAn{Qk)cdiO%Avz?pulnOwu5TL ze6WeKLWKKOeC=z~h?HB+JWnx$mT9;yu=|6x zYt2;;X0-#ueJ_7H=Ta3t5@_DPoGQV{Q@+L9dV6X!d${WQi=|(S(Y6jy#jvZ_(A=b= zhQyWW;vLGA{;||0;@o#k<&b4iq}%Gvk-k;*$_VJ6ai|(O?O5~ zl9(=F{jyl;Mzbe;P4co1Sc89rfW|!=Xb-THPhy)$p-qeDf5*!Nr`-%%5LpZZTR%m;l)A|0*vVrpLB;xICzs7d4r8k&;4~{r$d-Og% zg?WqsR0C$>n|dgPnMKrxqi4xaVtJI?$^;NWd*Kq7+e43uQ`-jofgdnc+mFOVVcwAH z{g-~%w{RZ8vgX*JXFa)vn|$M$Rws_cT~@;Yl#OqK8l@cepBQd&7Wn#8SGYdT#MvF_ z4So{w<0fh1+yvX*&y+`z149cE9&UKu;F{zb)tF9ZKA1;Ifw{MY{S05cJ|UqlyD!uM z+zub?0{L=8oqUnuaUpf~>7UN{) zKXOP^xVOnDXtDI0zwzr?l{bEDSH_f!Qa`6EWh|4&_ek=q##;JoxI4qfPu&^wE3vTU z1K}jUM5`~2=N(@ityX6>z$y=TI$yJX;`ZZKx6o*$+yH0Ep>y4RiGfIgR z%)7|})kFq)Du`o99K#4RMNgtA59AX;?K0aLj0~3kXNuXz8 z{%Fm2ek)NoN!AYiOS*!(N|{9~++CBzj){>jxyU)+pF5}cSd=rv%+a@~7FlTC^!;~m z%vyk#1l= zVTW9aHt0$HH1VQU2e+1!`M}t5aOEcR$`cpEjeaGOv5lBTXyyluNP2yBes^dl?xHQC zjbitP4K&-Gv&PJa`stbQFW}m<&x(myPoU59i_RZ}Nj66deJk?UsBsW=|8%f)b>MgV zIeDQ@hMVwX)BZ)g#g16Rtk=RAChtYz&8t=B6^*O5;$!&#UE|ehi+l%h;pTqfIWlJ& zLC@!p$Ln#AF1Gb+Z1kJSN$&JR{M!NaY+!R_aNv}r8?q7{-IkcAFv}hIU9&I&bRcvA zsLY8iCQ6HJuqj0xNrFd6nnN*{%TDhh^<7Y`Ma)lWckRS^k$X}{Oy}BOaECoFCaNSV zjg7wYC|3P%+&a zKy6k@g%J@|lczAH6~48UM=Iab?{DL}igs zDYdP#gv~PFk9+3s;GU)R^Dw$ZH|t$r#D5p8I1oofbM3aA5>L$F=FKQ7?9m-;+4@LJKBg}^*C5)+lo2F=O4=hEA*U2>%piO0%K?B3S)xa+RC7(C8 zk!E&?b;uuS#=DItyh$_A1-_DCK9uUA>GTtB6nJz0)X&k635H*#7D+=IBR^x6==^%N z9rKt?A20^I=EuSyw2n6pv0IH}|HDth`qonp(2st^@J4u)4DlPcx}5vy0H4nnouM4; zzR__bxdrUdJ&UaesSDBe2#~L#R=8-RpO=gmj3c~m3aA8p`7uQdBKo~4o3N6!1P#+5 z4oLqJ;o&+pzk9@TTmCQc;tyj%c+xa6bh{R|UY5o|5H-7`pxg=H>!T(o8v1XQ4*^Co z45=>`LTR{aJ0!0D?0F;_mXp2uMy)|Pm1Jv3Dv(XxtK>CgNF2nqbKcNoktn3IZ<^>a zk>`!^2$yGy^>y5tRYd=1LzrL!X&u$c6=joY6|q0kSe>^lzv}L8OJM*zz)5L_fKNE2 zbzgQtw`)%2aB)OuuS*p45Udm5pEn1yk2gDVQwr;cSE@60EQ=KJ<%gc#EN$J*(b zomt>Ij>C_B2y6R;F!O)Ih5uhoscz8E4$Bs*L_g*KP(tJAxX}KEnrAf2;CvOl83<*Qqd(tH?oDz(F9*f(8r({VOEOQWo5zD@4Q zNpu$Zk`&4Td;4LUS?(4&`<@1Bm^)tdGEt0jTH6^|c|mmLAq?@4{$I%Y7w54dWm|Ol zYAcn8&1^~J3M)&D-0~-m9yB`6gU_p5zeXF~bz9HrT|=Z{mW2E%{bPPU%C@JsF48p} zRL`Hj4`1HRR28ZE(Kr-)nJoIhst+?q%tsQ@a5xeEhqmXNr>f%Wr<(DNm62%hV1B{_PSenC4O?B1nOX(3a9$1+&L$UTe&aym>bjUuG_<^I-92JnBU@ zqWmOPCX-_F;O zi**y4ZZLmZK6|9piaTNfxy$YZv5k z!cZuSBL5Z)%c-v^d7C`?QwoO=?`fK~rY>sFmpk=Tn|B9U+B=&dh)+KqW6P%_o>)kt zKj$g*c83-p8b3S&pT<0|tF(31Lg4Vh`~SolUeFd>_DL6xo4G({lzG8#pe?tni@ zpzc)>acI=%t?j}+JW=UQBPsr5V%f*Q*mBxqajHtYwd7P@4AjL&_()sBX>&I zyxsFChii4PR0h(ZT>-{GBN{9cI;~{KU6k# zsq@=0>wU^%l72$fs*@dSnFut&FE4jGjhSd>R((gyDYUd{z!yb%cVysclgp&8j&0m1>6wyiZnaSf54K1pT%B zOr(D>9r$;Z6w}u|79p1afx{X__IdBKbpDd02#BIHM35~pRK5{q zp9K#IYwyb;X6A1yb-N`olbS4q7S2JzH>{6DV?<6bQgn0&C7d7@`34UDzv9Qr7?r_R z=^Q$JF!VIZD`Z)}ai*D#9Vh53+|UzY)JViv*2ht>q=l9!psycMSF|&oh(3d~XxgB@9`R`xz|Bu$-KfWS$LkL&h`2R_@eSj~4%v*hL&K3ua+LKG9{fZ0H#}>fN-!=_5Nim#_gJox4lY03ubsARY|M@! znfl-LKU$gp!}+ydwm+~3z)+xr+QV5d>J4Vwih<+HaV3VnZIHK@r`skwD79cHQzw1? z8@*=?et6-|CyuY#Ycyp;t)(95mn(bL>qKcbBX|UBzPQY!$Ve*uJ5g(VNXZe{=uS3= zN^W}SF(;CI+lrbQzeaY5tf*vUn^V6IlK9weV`i*?f8dX-oj>Ntj#dN|ukMv?nTUO>uMY{YIWDBi&?88z z&hfYd>d~*{S4G+7QPRbiI8;Bk1MLH*Y|WOB4v6^a1$$!u_!Dj~*?-YocVuM!irn$d zoG*mrG!yZNiEgFda#>}jDiqeI{u9=a2Hatq=~q>K68nF{v0YQzo;jT`oee8@mo30{ ze6*4iZ~7d=Ce72zXAe(wsfwq)XX7AxM{5#l)y3yX=Pi3_*J6Y7C&mu_JQPrt&bl;6 zFY(jBNS%m~r{MVswAp7z z-J#>PtU8!vQU9cE7z>Cg|KgzNq<6U$>sSV058_myn;z1`j@0}G?0?{|(8jfVg|g(H zL{n-9>1cAEep)75NuzsA?D%-hS6JjcC@}MRHV<2Xgj5G%N;3-M+dFanoyN*-4MPlM z=}r2o_n|it*3ZSfh+@4gM1^XEITCjju-vd(uH`?*5#*LdA@qh1K}uw0mJEUd6M{U zP!1r0-&yr8qk@aMliWWI#0;6i$-fAe78x8i)Z!mWQ4ym z_w46}vAWgkk4p}SnzqcY0IJBmUviZnvzV3;*L`N>e>Yq`uU6fa!SKPy@hi62bOBB6 z2f4_$P2g=x31gPGc#K6=Fn+*TjRT2G9oYxhzx|9fB)6LV>!wFkzIDvgA@mw>zXhw9 zRM>_yb#jrh>f_@^BArE#2(ClN4-7%URfl;3J$`7e`)JD2b2*r+7NLVeETr!_@Eco|`Mu3B3k5q$ zHR8<3)QZDJND@UPh6T4+ll*_Gr7On3z~xS(TU*ztZ!9Af$orN%n`qap_@q1#yTM6@L&=; z^MRUQv?ckm*PDI07n`MLUXSQ%?B!lpGq3LS~rozVP3pf6p zLw+`dSIng|+AaWR?Ku=XzR}LlXViVW@l^Am)_i%D0^=0z&4tClf#d+=-K04^{ziHc zFCH+yu`O3QG2Oa6+2~s{F0?kJ;pW&Ex_*9l47%@dbsAf0J}-*~c1c}yr06sE8tnfh zHm%);h}8t_c=z-`2bZ)v5|l1Vb@sWGT3+{Qez)3LzLD564Ia)m?SrebF9qW)_x)-K zCwZOy_+bfQP(OzM6f-KO*ugBL_Y2eWMGf>Kb(%$<_8Ktd+6kL|u_ZQq+#^~?gYNee zslC;EOy3XuVdocm*2`Xrx{T*`{0%7Uz%3zs=9*n*2F~><45#qs#N4R5dDE0{7*GIf zJ;*IoIi&~p*GpC5N(5<$?P;FGZEFJfWGtbjdrAQ!>ii@Jle1r`AG z`nywdl^esQ)NzcV=+bnVZq^f*Xa>$5-~Szv;ciOvI$buvEM5@WBw16jDP<;8saX3b z{2_cZyTsBhD1JI4xy+`(maC!1yDAO(`q$@M(Lr+dSQqYySHROp`Z zLo~lU&q+j~9ml=MQ!8nXe#ocG(Lrso1u;xE48`=y1k7|%^+WNJ=KMvHs9#Iil9l{! z4VMejd0iAd=H`r~A{_bE89azDJS;8=qY_GluM`e}n4`DTAQrbOCH{b|5O|qDVsT`} zF?9f5Z1^zF9$lcjL8_Aa-ee}D(w`}sJiF~kc`EVeFIzKa2mJL-a4~t$4<|e>XmR!0 zA$!!iD~sjEIHCpGba^4AIMT780#<4)N-DKJr9kq5>G}Iwv|137KP!Gx{z|mnC2l~2 zOJY!oXT9pohk!tAjG{HHru`BVi$b_g^zF0-!zeZ$8+Je>cKs595_F$rA*G&Nnje+8 z-%vxr3$pgNlUvB}>*2z}dPx9Fv`2bt>#o`JFk}EC^t6M>zxBGg1nTv@n4}Q`y&m1A zF6)5_l(IzSq^w~dC5txtdhWQE@QTzd()5PinY*(?9c$U&x;Ie>p-Xky}xY^@@3r(XA*awcktGYfFT-SYDi!teS z3;?V{&4a-a5bonbW8sFa=Uq4G`5ys2dOzYDFq20Pn5TT=rEA21nF`3qwSDnYwQHz1 z;=gTPJAG+wb{Ab+zg_5|zc(6CJOItP=Sv_#dv&uqQds`S`R7ESC)Qo4rn9EiZ!t=E z>8x7VTQ$zGMvVT_hnc{z_w-*P#DLeEec#(1f#?5@`@R#g@2{cF&*UB$|H%Z1Fz1{n z7js1R8vb*`)u*r9`nxMV_3W~T=P`SiE!=}P0V}WE8%Zy_B7_wYQb##uh{c%kk!My| zbh*EDS28Z>+i1n#V#jH`2g?khDYzFR$o_}6z5YY3gEVgA$;m+8c3zeAwCX{=UHA9zV>Kthd;UbywV}-aTNP>fjflA_PtdN1o!2C6P4-cW4QPb$)l_U~p6Ve_AU& zg4;;gpJSS?)^H$}Slhi0hW|6NAj!#Jx?tee*J&$Re(31}K88>A808nK=Kp zK07_dj^D0z>E8CXJik(k1WliNzd#i>wrQg`aQ|HK`QIB8Ll!yXpN`UcraYk&JU*{W z_7efke|=+C3xr!&eg$|jKFrrG$4l@x33F)CE*Bd^4DRntM)=R}cXpo*?et#O!2-3v zF1wAF#||F_=Jp{5$MHq;|Ic;)Db`0egZA;M+*P8tAy?u{yTfFD%sNzt;J$LG;i1;ig*)ah8Ek-DA@@R8%Ck?C!K<+j?ab zr6r7DmRF@?&26tqYM{Q-@1*5RGdJQ~pSQ#to=*<{?&rppO#EN1O0M@@ZV3qTWDd>a z2ZPxy*Xp9wwi%UUZTJyPUxl?ZJcr^3>F++eNhE5 zpD~O=PHdT~STBf(30-UeNA2Snq3;65QsiS%aUm}oZ!H_zVrsX;f3aMz>f`j%<78eUl`-8zU z$6GFN7~uCz7BAbm*IRx~bsBY=Q_|L>ggO~CLn#W4COek!M*?8%-G0!`OrNYT!&l)Y zL!FvuO7C+SJg!@a-&tkWg2h^I-F2#}#-lyHARTEi63#Ju&45^G6b){XtyVAoU-T{{ z#eX2jpS{1uMjPbz@@wws;n*g(l^cgDxciQvShMc_k66XFSN`=x$N z=|rXNNVW%eQB?X^o+s+nA`0np^4J}8@2p13Gq|}tkG`+id+1^e?S>yvpsC@voh)w+ z4OK%j-3onxYb>39Epz&-Zl)MAq~O-QZz>vd%Y8iYYBSS<|i;PzU2 z0`locc3DQAHSh9s!0Wl20NT4*)@V2VnPb+XQzt8Z%HZ*joaPhFKWMNhn_pSBe`m-Q zxTaL<=b?pm`5$y}+~{h~ot5{b9E@DHybwn{ud)-L{;k3hP+WdFYjg%eoJO6iGmv}q zPG5cFrW=&r>*FEwWy>++d!ig!7aDvB%U@)V@3!h`1+7VDi*!*@4& zgoRFfQaP^IC=)4%FCc6V=u;jjK&`fFuB!7e$Eup7Q{IWRMjwglmHl7W06&4pat3#t(!A@$nN z8hD~L{=?|;(&zK~wOo8^ttas9D6xAma&3(=o8w&c=9?jAkaS#fIfkmx2&#s_YhcKg zKgD>Sc(FI$@C%RnXQkOv=v)^$ZTPgqK;{>!{zb=EWH$#XLR;Pq^p~ z&E81s{m14b&(NrG?oU-R)g@0(!AL~MCd6$TWOiRxyF+Zw9N z;?^2eyuTbP@=Rv@BJ6ffLYfREb>1y1@%rVaYUTW?*5N>~h+fV)w$SZkyEe(r-w~*Y zBM&adwCQ0ue9O5jgb=E=AJ?w7pjjeH87H^(uixnm%4sW=+eWYVU~9V+W504<&G@T_ z@4oF~5Y@*$uN&jhdPX-lO;+^A&uuBYA=J@M$b#TzzRo@(*O~Q(1a{&Ovf2`MS?;pS zaQd(z@f=X%NQ7!m__h^+5=^?j^RxO@Eg5;bGwO+&{}s^Q?lHTs=Q+W(l-Cyel((4i z0NJqmT3dDBh|BPngMZq3((hjV^G>PZrjZusp`Gi(&7HWmE&E(p%hF$}4{E>6LUPZ$ z?M8)|9M82{NZFNV3<;QAWO&mU55I#*Mvv4D9{0kX9cSBr3CU5s?6o(2l8kSs6u(4m z-@3dx7NUvE)jhUk)el4#A^&R*d4> zr5RvzjRRPtHIm_i8|o)MRW+gpFm?hSZp+8!3-e6_5-L$2pKq7Y^&#uhN@ zhwI(~^u!_vm_VsiONp^dcRd(qK`%e{2{$k)goesl#M%eH7snG{hBb8M52Z02FEpHs zEKnyrNxLLOG77WzE4HfO;qM;OY5m*H>h<5g_l_PGuj(FTGRcn^n zM7^4tAC9pp+_bYT5%>gIJ&DQe)@My+Y^_T6HWsmXZ75l(l)e-v%9jGWR#DnB8BJ^jbjLp z9#0kpZ??s#Cz&7QPIk{VcBN_Uq%{bNK-<4>=AlL6KhkZ2Nw_L%jJBDIKTTIF!JY)r z^i_pqXqJTO4fykk# zGd#X_9?gdnYL)2O8N^|ep9_TlNDcGjfN&N)pQ=3bhQ}`vII+pjtXl_iw~VVYB`X#b zemxjrA@63AZIo+N%dJsr&byAa<_UZ9HEhmrlwqC{Y_6Q<|yFm{Rfd4)uBr5V5Cd5F^_ zfupAUq%^BANL@^TI*|{4DwpgwwgeGzINC~i#Aco{r`lVCGcf2!#|If-nXddt^=#2? z;ZER168wN?bVv8qB+*Gd^Fpn_VOo#-4Q(xha4)nie4sp|oJQz6kv6o@sJ4$p>PGZC zX2?s7W!0X9CKzRzd1m64aw%ZFXZ<$q9Oe0P?R^yj(Whg$rMJVh(KozIfR3eg+-Z-K z(L8?iWE^DrzyLjcq2|w-#HTIE9wQ)06Hj;p2v_YX@4$x}L@4y1hy9 zdK^{KH{Xn*);AuW3*OTs`j0pvm9|wTxppfZnB1D{Z9=SMNesPIy5}mU0xensuRBD7 z@~Q<7%k9_0ww_(*DRI#ZX>M=LKVJ-O0Mmwj`=Ljw+jTYZ9^Hu&FAp-B01Di&v_Y4% zi$A8O#6Hs(CPgtLKPK%13i(z>Vn3c5`rYlg37T)}tsA|0v}j$03cbzoYBs*I5WKhi2k zsCqhYKYkRmZ@#xTJ*@6F*7Uq`+Y*~Ej@3EOS@SqbIac<=e^|1#q^0EqoqwZc=J`t@ zLuEFXc&m_I68kyz2C<;4T47>mxU*Y3l|5lFDPkyZ;l?|$R-FlKvO#RZpx(tsr5Jr@ zqP{UfqbNnjyeKs>Hg6IOC=CS`8Id|FHPP}KMI_;iCOM`2Q!-$3+cn8s_@uP%Y}Ia@ z!n2PhuH*f<@B6k_pQm>lz5j?8R4^Eo`8)iPJdh0oBHdHwZjX9YXdsp;EN%>gNKTSH zYSq?ume){Y?svNyZ;{79&eRxhjoy4Fjp_BHDk-FL>OyW>=|%5%jO0hmun73{P&3}( zo1a67#U-DnnK@JWlr>|?ZySY@bQpKeeH6a-357a*ybmsmb+;xL7PXI+T9Ac=rOFa% zoMGf@R@&GqmS!%Zr}J=3c0T2gwyB!>6Hcl?5;VJI2Cc76WfMS@jdx0j8p#zDl7fK= zKVt;wLZxZKcSgQ|H7u8;3fcpKHk1Xn(kzZZN<@mg7caG0s z=YkJ{W{_?-9`jo5!U&SfmbK5oU4Za?8|SIJ1kH=Y6Kz(73dbV87bLUvinE|nnC2+> zXZFHT;g5h@>K-!Tw-EI8fN5&g%P%W8q5hY|JvM-p7eMKgJMvAyF;8nR^8{pUdG%6k z>B2?q{N@~fS=fdB)Npy^OmtIfRtlO)_dd`#>ea|g|9Gi+)AmfGc*B@hB4nrU*EI&b zlgnn}h}y0IMmy()IfGu%w#Q%gyxEjYAo}--%K@$^+>nCp&Zp#a8TIW$cafQOCT60r zWpD$UCPd)i@XqO!xuOoX&HAooo>&0 zhJ`zeztCn!xcwNy&FM1VTbPyX;8!2zX%D!uz&S)ZZJ8H`>g4TF0^5;Os?yj#q;HL z-XG0R-DRNK$`G)*n!G+XLml{QkQR=PbhczD0{6pWSR`OzvMpBG#(BWCd&?Cqho1IF z0?%SZ>Ksd5^d}!cAxtrqEQhi)=@PlI0YduWzBawC?Lf4mbtbOkO1awG0$Sp+BYCP3 zCD~c`Poz~I%EVKJx;UYE@WFnO(nwYlnsjhWU}^smY)z!p8ZtLu!xgW$w%aYLy3QMr z#qx1tFedjlQMz2wG5-eV+{R8ZR~6F%)ftV3m9{^Ko0e^{uZ)Q@Qc<^bFuyF~6LL-s znvaxqEnpVwQuLeY_RcTrk2=F`H_M+^X&Ojagyw~4;w!I$?>#MT%mlb5X_mYRsg^%k z!M?R;hO7OO6;vj&w}ajGGW9XB*C>C%!GU7fD?0p87yuF|lD1%BbOnpvPEn~*W!>^A zVSIH_>{EU!>b6E=S` z%cma$Vk<^wq0WPnM&cC6+G@>zp@_BeoYnleD3Zy5AeU^iR3RTJ@qCIQMLwlVyqe8f&)jyL-`*0be`ssX)o8a5 zv8U@BJ%AU3Q^{l8;y&4_?zF!Dgy|f>bb@IPo7WO~%rX%XuVuc{k=X{c7Hc;; zH41psIus8SXmGA`3#g_{@W*PH1i3n{kAVJ4V8Mo=yx{&S-ys~Q0h_=I z{P!OmY>NObtpF+M>OTc4K~HHMGGZ=X&%^>AcF<5ILkSj>yCL^Bf`CcOuv7YXE1uQVDDCSbyP&5uUAC*DXYpFd9 zr)(Y#I1=yoC#h_<>_8tSj&zC4d|ucwq?NGh_^>ri57X8w{^j3IbCx5dsTcRFEJ92F z;jm?^vPqSGmWB%%(qnXLrTiRCcOI$Ej|xxe`uuRxWjUKovwM#z1}|=F2S1PVJe?Zj zDWTbe{g&M93;8eY-(S+b!gFMt6nEC(7V|rni&FVZk^Rfd7jnz6;zTrW6L#kN)-+`U zX~YjT{}fqZCRhknA!rUcpG;H^cxgh-HS z?adK>BFG=Z74OwN3Xlp(0*CO@jNk&=|M=F?rr_n$S$tc%NL3+(BralnhEaVCyap{i|r*W zU35@N6Vm&d`&|;zmvsRDo2%S;{N6{U93SuHUMQf5;hFWII@9FczgP>&YK^;yUYd&Y z^SDj*fIYt)VFynb1RU_5!>`9@7w@@&k8NxQv%gJ`$m&QjBC*!+O?8zvdVQc7Ye1^`Km)V|R09#bXS zc&0S8x-UqMKBf(_IE^N}sn=y0K(PAV6v0oLwnvA~?Zt z-q8r4-vZ3nMnV?C^sd%Y*}FArYwZ&L4pYn-YiTK_d>}3tBos@S#2kERBH3r(c>;!owIK^!^=y?xI4_>@PsvK$?!`6 z1qSro#E*(z4z5GDwqu0s*Db^O+hj}zP{QVw6BWnaza>NzDp904O9%YGhAg#J@*xD zl}{&FG@*ajQPYR*ZW+LiZLHS#4l#|t#t)@?BtBzkdXw>+*k%hHtYG>j1#`z@fsqk62p3^0%6dw5gUw?vk%tyxr6M zK5PQ#UCAW6uQ%|27}4yzoIvJilF0!btz3{--n)HQnwm3o9(mZuFfer|z~G0m$D$_t z8*iT1bLmG0-iExxqyCpo64WIU+cjfP0iK<|&A1H2E9`BHT-ztLcy@%2G7m#9YU;+Pt!xB)gXoGVgj~u7HPdljFy~qDF4Mm(>gtdK~|wt^I#v zzAuvRfd&r(HK7KY!USeO)&d9}tt;JX@%NlKXC<;w{RIJQ;I6+d{5cjSV^5kaZ8>_gr(hL9pla!CHa=< z(W!NZiEmxbS`d|qS+>&_Y-oq|r~bor*}pVWX7%X5pSWonu_7=_$-eT5M<%2y9>bOn z$|5SrB$NP3sb>)jLu1B~6FkXA{IPQ=fwCP~8J=atO`PZw9kxtGuqTAC%6?4gVkcN_ z6oIuINOB4d0cSlj8_@z7MkH5pMu^9eXRk(NLdE)1+rAH`ds0ZpetDO@Ukdev^}$-g zPk@T|B~NUvWQEu2iFTaBaJ}iZGhCbul7z=@JDg{cKlrzr;_xZYsf2nHykM&;D2TG~ zl{V_UI}AiF;7W9ZX>#Nl)F0ug*)^t_o9Yy~OpEaVii^h8HjP3szHwqo9UuJF8yq+y zf8!k{QaLxqgGVnaRKjh7+Lk#uo8YaPn8#@5eq~FCwzBNA)`1YPB$pK;#60AzeG|k! zbrm%AoL7F}Tl7!1B#z_<=om1;hN6G7g7(2OS`jOl5Z##H?lvX|bj3YcXFkoo{d-(83P;bWK{g2a6>Nj-YzW)+jymzW%f6D!KH{GLrzm=$gfF9t< zs<*Rjb-?fQ%dECSPOpAfmYehL+5B?B_fEh=rIRyCJb6=VeM4&%Fd5fMx&R}R%OzRj zq+1cKxc@YJW|v^74N3Sd;lnzzN1N6EM-Mc&co=#Yb%2NRt5Y{e7wj2}SsiYaMeG?k_P z`%8YE!M7j%!AVli14#_t7?=p!1&^*$W{ORrInSbUNgotilOJOy4v!iSMOQQTlt!e^ zKR*F{_C)K@*k2;ahvx5d(QFm0$hBdz{B|9_hVpoEvHF3(JZ?N@XRdzsq*#} zvv|=VOicLa7TO|Shs=IMkgiTj4@UIKF~~a@q=5eA4+p~3%SZB&RpIafWN0)L_-~ga z1ZzL7a9ap-t!z*#?&2WQ|5~mhIHR98ICI%L7VprW#*q9<_F7Up51vI_neZ2d+&*gb z1gvDWo%xr5f1{;R8dYb{hbL%0K2t;*N~`P6(*X3h9pO8y(F zj7^tfo`L%~w_VU!O#O^tFQ8%6hxA5-wJXKYmk zLa`MWL_?$~O{)uufRFTjEhvKT21i`w+0+x$o~2ATV)v8^2b%J}v@Fas&_we_3hvWx zwc-`b0xynd)h^!Q${JY+^8D6l)AbgJNL5J)9h*kVUwz{_cxfoldt>o%%g^yKmHF%~ zH5_dsT?><@=AC;Yh4KCLvv89dLh}*M#CMU*~k=T%qQ=edlm5k#|xj z(_M%;9J1!}!xqx#xzL0E;=VqHe>a5HgK1{wP~1i5aYtWq?dfp)hwQ0$q;(v)x9CH0 zms{>)`R3w?MH1y0w>%XFCfJJwBRB{Kpw}X+Q#UWUTqW_O!iLEFE@JfS!Ps;&k;kM< zZDRdPJ{<}9L35S2d23%dT$d&9Cm_@NhtB;Ve#vk3bDMw_oAPG-Z zwuq^mBwyPq)xgdDq?g;K>Szf%B)7rQ#=>Nt8$!elQlc-IwLR5YZL?dR-^sPs zPo0S{*K`Gl2bd+2KHO!}l0`Kb{PU4(B2Vk^5*6VszkBrG8?-CYM_rxxvi2xIDEP3{ ztg-9ZJ-@IaqT#7;T-s{hYZJgJ)O-~y(+u9Eff}8K(cUdHdu_=XU^XqntCF=9h#3J9 zpwqVPn@0%;4`Fs!yQdj%K7G(B>>DDCyqOcd_D9LP_RKqv%|E{Nc{d6%xi%1=mEq=< z*B{=UME6lahI+X8$ACHkq`O3_0Ws*^v7#XQ{XCBs^M62vO2(y-uu+zRMHaL6x$7igA&{Q`Bb9rp2jYkKu?Bw!+v7lQN+6a6 zBg-WQ+Ws#Aq1&CiHNu^5A!B7P$vOLe@fQe-_F(+GN!Ds1!!;a3)gN0p8Y&88iEE=G z${_C~p3tq0f7tANBGmgFrGqwjFubhPe2H>7Yf@!J|EQ_t5HZmewIoxv6llJ)y^s-; zyA%>KCV3P!tUPjpWe19X#pWqaWabvV;de>R;kFoGeC|*frNn-MWyZ>QyuP2Yyt4hC zaKbEuE(3q%2<=B}riYV``PEOr14NQ&_r12K(U-hd$#dw8{jnTo+Z?I;RTSYW!axZ4 zSvUbeR&FePqIddY?Y&5(uP0J!T&h^e3D(A-VweXNhU|;V>=7&|LQ4Qe3l7RbDZ{pV z!8z!w52s51f|7SNa^bU~93Y2N?XGwX#P{Y)E+P=7xywa2ggbgtf_)!vBDrD*XpHgv zq0}wrY4I3PL@5iX9^vpm;2?j(u<1)n=`Uu8EWkY#U?)ix#S?Td8;%!HfNi>nJo7(I zT7R*>7iQQWG;bhry9_CQWCi6v7L(lO#l`=#_%bIvoR+WSAS^;_%H{6mW3`Tte-i(! zv9d`9l$*<2IDQsSSaTc@cCR|qN! zT_J4AJ`Ylg_e_xFNDtvhc?y7eTx!kl61CR@1q1O(izC`ZoEe7IuSuFR&HV`U6NZ+v zFBCWjRz&g9)}C@pJiji*?Fz|OV0o?!#){5Y`rxYcmtxnU^@|wjYnU5m@C}Q(V^f8a z_&$D4`#E)j@1`FkSX7mc#x{hQIf2IvK*bNFIW0<3$!?{Uv6 zt-O%K=+KBa`G05Qx=h}B9taL!_+_ZoYdtBkjU*e-s2)}7h<4D!M>OH*tjTfxZ_McW zSFnC0-SzG$Ssf276Bxb~qS*I*XgCxJEA#lpq4{?0#iDk{QfjIB$>MBw5-&4!+xAYG z7(kv24<(qKxle$1%e@e6n}5#?=pE(1C|Wa7ml*_o27-^{AThN==~5^1s&ekulmI zlqsl?%fgVOwDSrt-_nPd<@u^ zwV~3xHx<88Co2Y87x0EYp@mYghq@p0qj{YQaeBK$>oZ2B3^tT7rK8X0Ir%Rz zb_UnAGXr_N5QsH1?(b13fhpkzWvAdK1S%3RfNp}=~Gr>ho zg^L-5QYdTQmR6tCs=zM<3eKWUKkcfy=knoW8*tt?H@mdLZRM3IoFwY^beOn$)O!Z~ zKxy8hul-|9yMYj=8f<&DO4<(II1MRn&(Dz)h=BK&GS#Kq(Wg06<)i(3&Z)LsRt(Ay zG0|q|w{>=>r6N$BcqB1dcO&O;%!{{#K_~%Dt{3JWlYl9x68!3pjJhr!(m?(T!j;7-s9?i$=(f;++8-I-yA!|&Za@9y`VJ^Rm8O-(&jQ_tPq z_to83Uya_ropgb)M(xT{I+%+Q)p)SIL#My_n~vM@9+Zw*_!PdTY#OaCc4rDyt*T3P z7f#1Y0o{McW+4_lG+S1$6&x*Ttft6=e@dkkp##coiPK+i%<69);2I?OS0MN<(#(!V z{?_pN(Wug%Qz*3wVo$rr-gZ0Z6wu3Kebqh9-g*pwdC$nG8kB;d}^W<`7 z$AF1n+v(sl9B?#(Ty-cqc+K9op$ng3h24G|LM)$f)NNGl-iIC6Cmes<5v`V>-27=J(H5FMJrsDP%x z9LZ54tHrHw{DMA9A3g6DUk91`qPD+x&9R{c8nLh+JNdD?epl=O-loUcbJT@))ARcK ztah3!_$c&4ChysUBUM;eE=H4ukAn)t5^V}idlVO%ru8V0iS2^6`D)5tOkL36{+rh+ z!K1{ZH^E;dN&DkD=5`uF{!oL)_0KOPhpg^Bfx4)DI#c!bq4Ss3Ma@{nbS$40U9Nw= zv0fDPJ2SO;zBFrCohn6*bT80PRk-_VyukRWIcMR%zge$Az3kT8{_iWt7^45+*Z)(9 z(0q$DeV>rh-R^w&;u__YNR;u~_y+gSI9qs}kj);g0+Msp0<8BmDQ51WR&N1l1ZnJz zHSD1HWRCD{+RrQ1MXCsx4k6)~pF*^yr}DfmV`jn?es1-ZFg@<|SxR+==Je6Q8dHhm zr9n~pvw*dcJBwk;&9t+1N@sdT>0{{daKecc7?4?unu&XtD?qw)`o>( zDr00RT8pzx=@-(+FEB;Y#Ge79ih@QIS0PR}GrxzcgKZ`xdP95x#>#|K7k8jH^Nro# zJ#xS3#)+$^;%qi!&)Vzn(Q#dpeFCvhB%=HB!NmA}pEGN!Rx8kt{0mGEWF)>M4ZT)s{ ztHPtFSNbyLA<8$$%iX6d(*1iZG?jh*_Ggb>1mO;5QB)9A7a!>$!vcNS4=OPdRPJ@i zz3CQcd(X9STYETkP^9}I=efaJeFp5%JPkcbJ%blxuTyJ>SDY+ zMYI@{Nh`nXG@Bh({8O;s!WyF$GN)1PHuZmT9EKzcJ)UQ6CR|`-FHlU0g2Z`2=G+m~ z9oPV9A~2-aMuhS-*qt+lJET|GfsN3Si9_Va(q^b&L0=pCxz8JYDuG;yUyB@$TLRo9 z<=@m4R(ug4Jy_&H^<?LLC=6Q(r7J*`5>6gZ*U4?NWzrb71cr^REpARcgzn|nHe-- zHie%0ie%o!rSo&N$`3%dj9;v1_n+6LA~r|B7{*2@^9kT#rOxYRz1!r8HFF1g?jqC9BN=QJGTMJr6WiR=Reae_pcxIH~PC6a0j}@09Zx0vd;%tF++-PLpI2EM9SaODL9GsAo69T zc*~dLE}C@Wk#|xhh2;5xpJHcm$c+eo103Jr+G!MfhB4SM9AZrI8I}krjJtJc_+w!_ zUgL+W6A)t*9e>&+KaRWur@3z`4!5unI{oha0msMYD>m*NWTfGjRyZCXP2H6s&XvdV z>mK88?0V+RR%xZ4%h?K;5_9(v;Px;)mqxa4rD_7KyC1jP`%<=@>j-H+M-QGv?jXxM zoW7t-@pmf$INaeooxb*!sI}xo>!i$@@Y?sw>s|!c=Fm~7Z{=~(0mX9|HNy@;UThj< zkbt{VLlvrZljz)91Q{hbH-z(vIUelWd+t87b;IpZ-`+d-%JavJJaxMfeO-R8B)TW* z%*#7egM?9oA6{6i1+KM5@5(zocODDD2$%wY%Fp+|t!m7vkU@Pai$1U4sly#xC%|X- ztS1b6x9uIHPmQIc&oJt}^@gW>Cj(@>kiORGO4;6QQiqN`qc-5dZL}lL)Yk3hanq`G z>1dd5Wfo1$16M-MuC~TMk^M`D!ufyqQ&Im`(qZsaPtJ^5gYYoqUy3m78NS7V;1K zC(e?(C+t{fl1CiSjY_d-P^3C9fn?`p1iz4ANhEG9mXCZO{`*Y!RlyIBHY_UHsASueSYI4jf(lyg znW~$>pElDa#gG$F`rZtsLNpjEZ1yjBFi!-I55rSQO;m5p*P2|5Frjqt|N}~Gi@ZLR_YB`=i_T28(I( zonE}K^+}&#FPGY`&UpRVge61Ez}>p-CS?!?_qV+ooD16Bml2@r!Kz)?dr*cJyVb(q zrit6eMfb1ke~tOi>Y-2I^m0G7WKa0D&sf59^)bW%q0(>R&KWS|%5w;eS>2DFWApRp$Wv&YkDqMw|rq8rw^*Uk6$BN+Z(eD=;VFt7SR^Y_uqH0xH~ zru~yS&C*-%yv+v7$O3(hvX?2N=un1#PZV~MRr8|LR>ZLACB0;QUCQJap%a~(*UTQh zNstw&;QjUl>|uPqQV95PJf%Vs@vY7C6l8txlZ$774aNjFs{ssH?_tf7mF48DAv;qN z!G-`9wTHL0Z3GI&d00G6Z?aYtC5!eNVw9-30gW$%%Lv_EFT29Ow#Kud zN^q(4xY!uWH%X`<HOO8(g?$T0apQWm{Kow8lHA6k9o=0 zl(Ajo`TkbrvVsK7x9Zm}xxYhxh&M1fXEi2zX#Fiv|u=BPuoLX>^EV4m#&F%bm9 zO6*sj{>W!Egw5=)Jr6H4Et0_YHD=d0V=2PA*vKzZ%Kkn+ci1`5bng7te=t0bnb&Pr z{OTeuAgjX}`D|ZS)FS)P!c}vi41Rn}_w1Z_9yE`>0J`<=;94|rLr_#fNm$$lpSVR_ zeG_-9DkB6(WE&t(WqzLO?Hfz2mGMZ^ff+4t@sQN-`PV*Q7*<}e2g%R_s+~4LJ)b+2 zHbsF3?fQ4kX0UDFy+^=PMt7VpIC%f`vo?vAVNkNO-qx)P%hqwv^4FO2PPYqx{r~un zkJj~OI?@&sjk``2Wpj{rE`ycKtbbE#2oWT)0*s!o1=4GpJ6@8O08@#L$JhcPm7@Tz zGbl_TmN;AjSkd&m>9olE{W|kTe5w%YHp6T&uY+R${@{$20x*7@E5Z?SnKC)9<9{Q=DWQ*wyu>)PGo{fk(ge}_akS}(_R!ydF8*Yu_xch) z{UVj2>1&0=2RC0Z1$}={S(9qd1Zr=4l3F;0D6|v=V@qMG;dv&_LOw(E&24ha?8THm z_C%5&@0-Wz`d~F~%RWi*WpK;Oeb0WU{Kk8km5TMd^xpn%`w{C?W0_{^YjrCk8u4Rf zZ7AZFH-k6JxTT-FwRz&h_*EX(sC(V#?y^>DVye!$c6fH&(>dDR0?%u?%g;$gbn&qQ z1p=#^R%<&is*QX24;Sw`CDU8x*Rh!p!yHUK)Sy6DK84_<+2W--zLi?P-aXgU(+J?5 z7T}@k`c8Zb&rj0tAmX1wozJ@q)H^h;=CICEW?O*M)*+Qf&H8bA5KKq{ZQi|(urc$8 z*HwSHr+Zd2KcvQ_lcRw7?aBUi3Ul;A!A(z-YLywd=dj?ltTbQwZ(RL;7);uiuAR@| zVU3;gn#QMKVjJ9%x_>rq=;++U1IrNDe&OO{9i}cG4}s_Z`t3ibMIKifFkC|S8^E1* zH@`{j?UHZzRM2*w=mgi}GS-^nbH2 z2E^Bo!$*I@2flBRBx>LpELP6X%}@1l`rKd{o*Mg&X1)Dc?G(}c;O=FKI}X?t zR0Zr`E>qx@Eo*(BXEpNe)E9>fk@&le{i2@;=lI+2C1kr;baXg4V|;ijY|ep9YDKvM zy~$GS&wLX!ga4R#{X2P&oTGma#l24y@cyM0G6XF{5Gcp7Z=En2yTy7^8Iwl84hvno&< zf0HrLdwnT}P`s^9Ag$7NUDs?d1)53QyZPKg#2$hLRPm0Jiry2IiS&43Tz)h%YbhD@ z8vU}nfIE*xex}%Ymk{0y`EwJA6`ywJ`3!q<^*W(1fVpNBkL!%^g9tA%q_>h3stNo! zQ?`SR?y{29GtD?UT%dI^OGSW>2~0%x18#!Jo*Q#a=0v+y05d@g-B51F%(^&_401Z8 zJ@LYU-% zWRDR1byNzU{?_OUeo39(5#62;gqB}3zbOD>n(cn5SaqXl^hg8Sf|wD++(R0wr5aq| zj|0yHm79q&B<*R45R!94VDp5}*WZqFW8OQr$7p2@erN0a!K z-4|OS<(?5W&#?J(9h)clNa*tVP$6J)l;oJ*;H6l%PoaL@OpPn(ByfM7+(jQ+ZLj@w zb$q0>d^Wg=jvQ98=TT*U<+Dau-P^eQ=##q#nRpmI1hKYDVQ#FWX)-`}UrIS}l9cG_ zvP*;?TU@cJO+x?7(bmne#S-q@y<|1soUz+t3#@*n6FykKD<{;ua$}c#mrV_^{ve+Q zdbFN6duKiNuC!#I3#OiH@N7P45e(igTzi~-YNbd62QOD;9%BwtY{U9T9$PM^-@i!h zR3+|1b&H-w?#LfE`_>nmS;y_u2W|gtjy+q-$#^Krh_=}-M=DLJ?p>khfTeNNv{=$bjWlbce z-3@WqEjwOE-WG4{QqP8p<2 z`=yF~wE?0EzZ?){H1B32^@M!&$BFrXB}uXCQL#HOJ{Q-en6ud&>qD+~WK0eG&g43U zRrG-3E`v0d?AU`{YvD84--^I%#HE)l;cMUQ0bGS>=iY zzF1|{B6;!{CxUh@8%G*&C<{rJDm^9Jgd4n#I-@{{$Mw$(D@1eTK^7d|>s^y>3uZ59 zTL($DueSEwKDXTkb6z4>l0dZ&gL^!ed(%?S;4?kWG}MCa(3Y*`syHkz%k#=M!gm+Z zJGVdSayjoLU<#v)(~4_C-m5s5(VI7)Ga}&W z_-Nnnk(KjT8MBArgd1ozczIwHOTovS=cacmXw%s%$u0CD2C#Q)6FFFH>oYXqZNM#L zA7-E2KXTgpNZvBN$4bIANCT>K<~%OwSg8DsESAE&N^{Qu)veSZI2H68dRf|g0xa^Y zA<_FY(CV{L0L{$&nb`b%Woa^$_xU#pMN7BPMyE*OFk`8bDOV{9&g%Ea_ZeR%m8Nmid zg5@)h_Z)>$G9cVkAv34_$=$}n=7-_s<-iAwMqAJVw2PsTi^|)D#ss}2Z>W|l_GhURMLlX5t zJaeCtmkeV6cz2s?OZ}P-ppbb5xp)y|QQa5AYh8-_OePWKnt*;XbDcJ1i!js{#4eLB z1>eIAyfDWMHlEIVmh-6|xldh)WZ3ldj{h)mKovj*W$Gj;h`#`CN~@tC$&9Ee(xP`CLyvXO*VaIQ22USxO70-@2QDqM+=A)_nBDX+W9i z@)D=KiBVeii_BllSQ0~Vqz9OAbSzwLkgXw(um!)KKvsydO2@qk15nUZJcLGKB}uq&1@ks--XDAX_h5C`Ww8I#j|&g{-vnhZ(2fNu zU`zT%t80>de>QZmT)=+pgktl+HqSbO*@OE=FkixPpZn&{n|4%QSOW9(!M>Pxp?Ty_i_e zd2jbcGsP*f4LTU5qgzb2?hRoBkE=N)tWh~rAieVOcLJLYq z1aX*v(Eb?!(`gLpd7}bdPE!))0?MZBq4!VbD5V+KN_0}AkJ&WNID}l@^A;E;Qs4HL zj5J6KisLUndh2;lgA}b&6~VU*cUSM$`_?{VKC-vdsr^(5QE_OyENWHT{Jj?LzEpX! zfot9&=)QXvP7Hb;pZLQ!6Z5wAaY%3VKSz}QQ=_oCCz^0d`f(#^BeZP@haMQWzy+(rO8b(eI% zVJcYbmW{tFNuRdd{}>#yfg@sV?-N-JpdTpq&e9yq915EIwLG&YUgjd+7Lajz=w<8R z%{KNR2^Hl9Mkh)gdI47+u^e)W4m240y;yT4@9c_g{1&b4BVts%=m# z^6M|rBWRNu1n%2m{)OPORDB}pk7Z8gA_%Tew3tRwo-TsY2!)igiMtgFa1XOSQ)f4I zdr|U>^~5g`w7xwaqvIMnjBn4D=y3@IWS&)?FE+?-#PEKPeI6GdF-s{|oBrkHkNVPCSOgX*oMaz5G|oo$*NI*e~U}cmu0J zaM2rAj62DZ8)@^~Vf&G?z%cqQnu@ehR~w4QR?(e6GCv@tJK zZ5mVT78rq+vGE?STxs>7g-cNkoWV?2T|9P6;T}MvimIQBW_yet=s1%~{bX^D$py{w zK)3Fx@WZ!~X3~DQrWU$?xBj-zBKFuul;e6BST0(A*%;bM%4@q!4SUh@mj{&2 zz|VGQ>^%Q!*y*$Lxm^vtS?+~FKRwQvE6~@gw~uo;ko-4x$G?sCzihY+KVYJAy4&J&s%76Gz>hMHm1tCgH^{W$s3s9a%=3u4}^~S*@byA!}ksioB-3 z`^X3x&f+|B#9s?ibUen2)7PRF4207|q>3R_YOiR>`Ep&z1E`+n>r?5K>j}6O0w(&6*=R*zUBDz*%%SsA!h2h;6nwnDt$6RS{UR zyoEdmEb!=I4h0_5vl9w7adGS@J5StKPC8tmW>vJ}RCW}L%MS`D-TJfkWB0YLwf$s< zcP6uz1O@>#Uq=o1!L!+ycD;$X*(CN#t@j}mMX@o_Hb6>Uzy2lp;{mtetDR5YD4Axq2hKs(TTP&|gM|wdKU=;E3#{uVCA zT+l*a5nv@7vDbs0rsv9a8I?7NU^7QWG@!HO}t%_X4k(f$M0DW#;Z`CJMob7F)E7Z2?+JVM1$buI&O*=g7S{@$)adKRi*G6 zeem`&w;{M{uq)HLK-_KLZEvIq;1wj2m*n33oT7?CHpR=;DQLA3{IwKiE+K*Lqksr1 zRL;AO{9d#U?o213gqM8}=yCBbMYCET$^K#aXE1f%HQ76g#(oCJU`g1dBR9$a4#1-( z$w~q+>jagYxJL=*RcZ1gQ%cOh+l4K++5D5X-aB9JR3WplZp#{=4Fy!}1L_7iy;@m| zL5?PwYss2w+XIq6ygn^$`^evNqy-qxf#s5nBx5BvVwN$g70vG%P-eCZ+%wZ3{(2pl zYxvzbqYBM164)C89^B-#v&d!06cP&G5B-bk0%lvzw3O5zn8Lt1r8^ z_UB88;ys;u*M?tbW2U~aZT}N^{v+`BUw-(XURwPgo#ozNLnM<){N?8jT5^X2zfm6! zxS~$QW7(9`<+PsB~9Hz`?t+1RpL4k*Ak2y1yN>7jZos_^Bike##rsSxd~3q3_T|9CHR+wcR3AV z`I)AejZ#n=Sb;f039B8qa2?DdmJ zl)}78WhZ4!Emx;FeMKzo9Kj26kvYnlIN{PJ*;R#p$M%i^Jl$LfP3kY*Zr7LR9*cXc zuj-8qBKq}iN#6vkARd$TtVguV$T{HFero4c$c)|Q-N;kJbF13B6)V%l4BLuTXvwo7 zeyyNCI_zG7K>uOWDj-EUNIu*>#;ugrv{L;7H_T#+EUP}$cTp*!Gsb<1FMIs3e#^aM zNn+AiRnDwxGq_~d+qv!?AAXYz|#TJgEHltz8?+& z5wxE!7LrcFVjEPG#7p&H!%v#OUC8I^NR-~#yU1ic5o9p0UF6Q69&d9N#p;K;XTwt< z&}l$X)7*lM$>9Hg?ElBIV(?z*>bF1BWVq17x|}E`J!y_6eD`*jpEq#tOF1V9J>{Vx zXf_%ow`Z!zlB#VvzG09>jy0V93XtRi?JfVgPkrUD3)<1`h@E_`^2;HqC?ZgFtviOo zuX)+l!(5#&jWmjfZXNpg7LWpJ$Z%@m!kRuMt28LrmC$5~V-jQQ3CuL2P9*I)!f!{UFt_FjyDwLMnIJsVYrglU&JQoU;0BZo*9lio@sj z(pe5n@0+1>p6Hp0VwLGwext0ET`!{}GHg0FZ)7*o-pbaxvl(oz_;K3;N~v%eKgy6! zCkc{bP+f;LGcu3#uL0BY=?|wOWRw;voVqkYi!^96FXFey-q8q*d-xu*PR&6dHWR56 zUqzFa6co_TwB?s1RK7CsoITHY%qqIfewg<#Q!be(mYoAZdwPmw+;Jz?aH7vhJRysX z?vmy<2GEV!h5cFu-Ld}_Z*Tk*A@y57{E7FIAp9T1;`4462S!&SX`u5kT>@Aybw}ds z>|_v>6>>4XIXwuzZx=gNMJs7Hhfq9ox0v0apJ_c$5?sbfownpeqhE7fhJDX!wjj%i z_cS+_D*2NXwuJs1o%9vQ$o^>rg=)oNq7S)Q8f6hly0X4Rc}q-zdy0LUu7p*Y;A^a% z+EE>Zhb!}R8>7QZJX*B!fGE6AB*99G2Av9H`11uP8P%SpZ;PI>8mIZRT=J9mn0POn zsL<#iHqJT?UMkDIldwY-d3lUGHic3Z{i9gO&e?h(R!KA-XQbz?D1UI;64C?dQL3Uz#iLwoEYg?F zHqe@*)d@p(ArjH8Ea-P|HF5N_sxj@kP%4|UnJ@LHmhIubjCBJX3k*ro>o0!Bk)rUd z3OyRp{Y_@}?6(Ovmi$)Dm!rJ~yd6fnIhPc~xi@IE(~Iw@l40~z7~=ZtE-v0jNc6G@3(&%-D6$hr7XWi-`!K<0EGyd1a3_=8eTCNT}n zp9;&b6Nb?I*C1j&9=~xL(a}Xw-tS;?c2bEe#!?P3+BcM5-!B|S7fD6X+7p(bf)fQ2gw;|gUz379mPB@>W@487SV%S`YP?FR z)8_|3#+s#e4*YVkHJrbuH+#j>-=dH0F=ZAE&VY(lsLdIY4ZtrB*^w@_5rqF2lLZYz;WzX_En{$9SQ-cC^t!w83UZS`UOHZfYuAW0Fn4g*LHGHgeO8ivvtVpu+FH$@h1)<%FtHlj{ z&S*C4u+&7f(beWu%pyMh)_cPr?Jsfhe}e@MQREv$dD~9C|Dp-KLU8@=_x@;n7?I=) zUsFdp6Bt(M1>c2_PK;-Bw%V1gLEFVh1a7)W49e^xNJz>O9SFeikEGJ!5z>OJ_|s|h zN^BD=8-u9#a)DTIw!4c|!5q^yR^B0lj%TvVsZ$^?>vt3t-jb%8HY!Gnmz^`%?mNj# zx&oWoU-7-b>%KBHU*h|u!q+Y>6&$oc3n%$97Mavp=-O02MO566@+UTw#x_@jznv^P z^HQqavo9qDMn1wvQAVpr7%`+o*)bS%;}qU08DrC>24BIiK{IvwO9imaz8Y#Cv#;Vy z;_{qmmi*Q1&Iq?6ZHRN3!XcRozdo~c9`Xb=iA5_+C0TJuYW*1nsGC}Ss6DR{WIq@ozBaAp`MxJgzUzZysfUouc5&SjaE< zww29%NK-$Brz_l?bXL%Ji^ETpJG!d$0!8w&i27kQi?Zl=-hz{9LUof_G2MnXCrv>q zfqy$T$|-5SkwVv?r(8tafEF>@Ns?q?`H!{h5w~;|8IVDP%JL+X?lj9*O_PG%xdu5KH+CJ~Yx zD`DkF-4HT!AN6HWUh`br-qv{H;NArTyc}jC*Br*A$FQ=J+0DO*q*xpAki^112 z#(137{wJ*dZzLaJf*LSg^No~?_#ezZMApTXuzb|d49_CbZFS@2ef(R*-+Hr$+}plD z(stX0CNaBqG5ID8ZsZ=0C4fAa&Pw#0yo48PqqwFqo3_?1(zq78@6_iCV<^C*6%ni( zdf?Tg@%gjH&$M8Mh?{V&`E5whaX-g+P7G4q!Ue5f9Xk}+iF^r{vWOvRXa+?laj5?` z1oMD;Eb8t;kD7-VNsf~@tt5J#jrjW~KHbPD-8ZG9$L;Xtl!T0UJLZuJ*#pc;3oYIJ)*1Jv z^n%+0puHbD+ZZ5)koWMewfO&UzV+`jd?7)a^Ym30Q%*q|K|Oif zpMK9t55IKQUfX44=xjGw3N?F-(+EPT)cZQf-i$c*3e6aR@0_ga^fH(xNIQ(V@uNxC z*pK(u+?aHuqGE&d9JC&u|3W`=^OVxVbYSVDJ9CLND4wdXUMCOw2mX3TgmYQXZRGp9 z(&h7;sbm*;@i8Bf9`1q$Z&@+JaiJ$I?fW1!BpekbTvIi+;^Oe&bh(58eugSf_l4(7 z-g_5~)w82)X|n{+m62G%`)ud4_I;phnU}Hwxb*HPi(FIp`dd^+?(D<4@Fsr`f!tTB zwDAs%7(P4dwcZep+oF3yQSe8(x3DG_BdzpUR7O)jy9l3Zp(9UVOxX?tL%F%o+?l=e z+cFuOYP26xUYDs`^Fe*6ztz+e~Y}e+-O01Kz_erQ2#Ixsp&8p zcY#Pado3#P?74pVvu(XuZ(3NN?O6LKN3aJh@!Se}WAKR&N#tzz4;DCH+dpblSDBGACaFx^T*L2SE>rHVo~=JQMzDm#q6 zt6eovLBZ*?ZF0>{-QI_n@4J01!4xmGuke6fKfro!juvm1nwau9t+rY%Q9Wo(EwhMb z6WLFXqS;GMj?mu6q$r{yqD@#cdgw!C7as+6+x+)nN}*?*s7g!W zr`3*??IyWpQQx8Io>zBj@t~pgaKGwz9q+P3YZv|qhzT;FVsLG$0ITS74h*0C(p&u zTEknKcx+?PV_S4lS1>3gI6Nb6^Cwd{g4F0rZiUlC({8Mh?9tMJap3o{x~&AK`s&-0xMSAWk;19yg58BM-!0k zqn_X8=MUsH5NKVBg(2Jg5kIZV*1g2;K%C2WuX`C90%EWB7c1&|M>@F`t%M!f>9eJ=FVwJZ>9e2Yv7P2kbpP$%|6mD3 zm!>q;wEXS;KnXcQns7xZUel!j0_#WXcOBhTZtrIpfK;Mi-z2?RQbb^Xg=bv2@D@k5 zz`Ep+=B=#E$;)m8le}^9Jbd||`nLquwo%KyJgAbx!3WBe(V1j%4ncWoAJLOdY+n!Z z5L36&_r&#ShXCtv1Ou5^)P4$Xa0H@~Hnkt)%kpqw74fT-j4cq*$@Ud=lFTw(>;a=1 zllYlNCV?wp#8NI2=%o)COg5Ma>L`>#=HEsdabGV#g{;J6Rc6E5m({oW?hBy6v5Uf2VHJ(!T{hg$HE+xytH*y>WCc)U5$Z?ot*M%*wH zmY_1AYa{;LuM;7bC4}rtI57i##c1QVJcNQ~5E~wRx%x44Q_wHFQJiqgg9Q^SHQUeg zK{=Dk@8&z-K{9SIkyw8YonTP2iqU!&voWf+i53A0+f+BCq*Yn%jW$Nn1(R z8+q|l19(MtayKX*2d{m;ePmkt(aqO{>OQ5u%u{jiuo(l^u92Uy2fGe3?XMx*wO@)M zd-RZ2ePf>3*XdC61Oc8WPY$#Y)`!7)w6{MAAe@%GT*AR* z!u$IS%0D`f@Ds+UhxNV+{Eix1A<(R$!RU(kaV9<|5f|AX<8I3yiX4%L-nNE?Uj1FK$vSLLaIOPd5*lq} z9HH+55iT~CdxaN&SL+aM?A%7nipD30*daA~7^frDgt zDx3L-&-g((OIdJ@i(wD@tU-InCby<0^Pt+G(sIFNGPevcqCUbb~8YDK-MJpJalczTSxrD3Op-D2Y?d=t496Eif| z?~TSq>~O~0cIVDTcyKrWv8173WN3udbGl;eYiYLxt>Y>7~(1-G(8Xb z2#H;3s^6Ra_7YJyq|k@TbMzMqrS;=q)~?xfYBxxi3H={ev)o%Ggkj`Fqi(P0e`4#U zXcxLh+gLlI`5zV>gmTX0*tpb$ctMXWGh3TYUp;!7O|?xQve(ty#5-rpuMd|kpSB!Yl&ixIo@S>YeqXU zaBb*!&h1}faFg!4AryBS)`H%uvOMwkQ(AFQ^J~@v;f5cA^yJbk5AT%#rr!-a{k7{; z1&s7ZX>aL1cF}AwgCGgAm8#eDcG`zvj?pfNk&hoWNyl{(`*R=#k*78HG0_<#&I9dn z*%!2n%c{<;Fucj`SoiPG6lxFQfagoGtyOQDGRi=Pm?~5#CtfD@_I0?(q<31*Ct435 zH&X--xe1_+xgTMMt+JO#wE=_aMN0T^ol6f~aV66ytaKEeQ=2ZRX~+K0s{ghK>(v7a zY?4Gan^z12W$RI^0Et)?ynN}$Xzp-{tg)qt*uNDg8l)j-8M0q3Z4zX841|bPZ zTiEOh-?4sVNRH(REJAsC3|_p5Pex;svPwApS!W5Q_lork*|2wM0!O30X5 zwPS9W#JBhWnoJ~@Ogn0@bYN6IsmfIFdu+eLJcz}z6<+cz!^1Gp2qx*Gm{oEYq^sr#jcT@O$NxdW{A2=&%xqHqbmH|Z;(*7aM`t1M&0QWd z@$>B~c7ygyDzb>xHjhOTHmM*e*CZwayBzEdn<7j;R_d0n&0SlpwGL>h!mhhIBK{gQ z)3Xw={~nE}2j+XJx^PmPzRo%m^?XxUKeNa2)zZhb==bq@>)FxilCeRP-QR%&;m*X6 zwwZGGJqY!j+CSE>OeTz{alKP-c}uU&|3tQ*yzZu0I2YQcD(AtfotB%&c@`{0>J@+= zU=r>>E-Vmg7`s_=bHDXPkeip|<@tZ|SZ=#_2Onp*-?nFKQn38RaQMFb#$fGnn1sl| z_yg3f<@k|1MNO61S;Qt(3Wi2HHgii7y82U%f3Q@ zX8QY!2n?1fBi%a4DuEG0hVGY_6&fdNMMbq$+v%uNdATx~#0$dOKNh3=RF8?7DnnSh zDp5X$M2j|bsXFsJ)}Xd?mbF`pTzu+NLH>S+vcZ)}dy>(yxj<*+qAw^s0``UsxR*^{ z_>w^yuwce{(qsB%Os^#UlUc4(m8E=gv)oec*5LZ*%97Y3xB(SgBhW8r_fJnI`LKGX*GjY zzsYMaL6%ECIO*5aeBu2UYb573wLJ1YPtOp2*q69c;9VrAu6o^*JN ziij%t5k8(}Z^Ca4uQ2NZUp`pBIl0{5Hyd~lg_a?dtso(!=uq|zCLe2m*E8XCRVA`2 zxhgOb{l>98V)zXD=Hn}DUKK-%_q}jKi;*&mdE7SNm^a}9K)B#MMpM@;xjcMttZx-U zQfy4NL4r0dE3HV2NYc+L_Z>+ac?L!nI}VV&sW|9!^`R2D=WpAniMoA@CoZgP4D_#x z`%Yx#Ns_nOgZM=ywpKb8O)ZopLAYvLPN~m#vA1Y>1IaADBlS(YF%pyHc_UQ6S(n?8 zcw+;w0Xg!ODU`i>PlsETEp5G*(0~%{xcd|KIwp-!CIELB@dC9Ra9ic^G%~Jf^P%Hg z2f{_yRSsb$NgrUIEL5fbJBqBC;N+W^KR0X|>jNjGp&^MZd-vZyo}^JSy7e6p9e1 zTze_~2 zz>~?$ey_`d_g+hrw#T=5sSst6=DkhdAHeyA27dQV@Aipnmiui|i2b1KseX#{ zjx;q~WFQ1bxZ6qoW+R}OMCC||-S|rwa$=L}Ns50sjFwf6@#v3`%1ZorWWh!8g5vA$ z0AQ{C?cXIUl`bJw4e?DO${<9%aGAxe`@)55(YC1*XU}|FLxw`RJQ^&+C*FDp{%J5O z!TY94+Nh8)Ia>VDP?zrs6XB`FCPAo*b!9$2;xortw_2YmKVYk^%20hsak9_3Ke&qWT8^CR1fBw zEiQ(l*4apx{;Dosb}!D67arGd!}zjTq<=w?<&QCqLE+Zm37y+Fn*O2_Vrlv{nwwOC zLj1$<15ZNaqRCb~yqC9zsWcNMADcAZ{6v(EdX&nInv?2ZjkP(q6c3VdQLj0-$`<=B zTny$W%DQd$BlhQ;&3pfwzhza)VdkUcm?wPvnUw1tJBI+kzUKbjSJV|`&1-+i8(=*` zf5_F4ZD-fPM>J%~c!DgVG*=Z-yog>}1wp~b4*nEHyVj2zAeDUIVeGr5yXX5P_6pv| zS?bq;H~)~-1e|P{YX|q>cO#>5)T(m4Gp(w3(8|TPA*eG{!rRUwFn@(_do=h65nG;p z(gpEFBo$5)g)=saOY84glaDJ)NE?xGAdt zn?Od2!d+k}8vGlie-_25=m~wi_ZQG}LHlh&$~yPyu*NSA_Dc{jF8Af_`h$p2BkG`p zJz)`Xl4s_@w?>|V)sf!MQ!y8zpYy5&V+G3zN_$b1sqCIK)dPV!S({h*0p{mh3*BeoL5F2yn_%=)`fZ-wtl3iEdQKVn{ed;0 zV~VKVx*u@TN%kHjS&J#@t}uGpA^Dw#UJ?AB?`t*@6DWpxP`vWJDgczv&f_wLf`DW7 zQPJ1JCTw!|s#r<%D-o)!@29UbMvIk4Fi~1H?6e}ZPoyd1GQCLG685{2`ih4EqZ(7} z={*e)n>^#u6$hED=r(@5wRKL|ur;UCgvq|p%Tx26)%K6#Y-LJd3pM|jOm55i$>9lO zciwsxPB|_}$4FrV>)r&P8q}Ay#eY?0jM{7ZX@Bs+Fe#Vq$zkk#*Sd|B7hCFiU+!g| zFYbBv-B9y%#i>u}>Vov;FP@>GSL0%h-17vC=Q(So#QQqy-Nu|X=^?$dsL$-_1fb}l zgK-Bf3*6u3sKw$XY)G@<-9@kN7-yF2!2Yq%h_&xpVtN(vIut39WV4@%6wIjdj=C7Y{ZCrr?#jEl&&}_cg~^8aMb<7J_Y>!>vuFe`33*0jr#H6 zF0uEj-^E2s{Tov_aQDU=ENzMB3uRe4hM|mcW6A6X8P8|&qi4r0WKf?re)o%~o~zb< zUy~?E9R!*4HA(gcmHCeCwxq-MfgCc_?`W?y5% z6zbez`S?fGKxm0;ESoPP=wm2y7|?g?0k-paDpB&?EB)V=q#Pa^nvv7wXJ2daSomDbxF+iS!M;R5|QKW_|Ql%Z`!BU|s}a&kGTUi5VnuqX0z-#-FS{@{qT zkf6}PRBmJxg!^F{gW8U5ZryG>AG3?mN-O0bR*PLxK=!;b8WJVx#NqV1H!jGpuXCmv z788^u-e!+DK;rd?#TW9 z+7X)QxhTyP)ruEv=Ss!ETN|3qv)Y#QtyO^Rua1feWMM?C z-I+eBc9ibH$K8-KR%Q7yE2LoLI9X#gt=z-=eMcJC?%f0Di#O3Kwy8@eW#@UH$AI3- z|F{)L5)OZ&)>H-68qX89 z5}P!d!+grDdKl>~>P&40J-+wiEq;iJ#~Bd=%<0iPm=xRz*1a1D;qBp4#PM$`t5*w= zI#pTz*1j-cQI!qY4nSb5Odc>F8i@6*$y|Ali#_Yfg_wYU&?dtZAd2*|We?U?@M2o8 zjM&@8YM?#6i2j_yVIwm}d?M2m{fE0Kha)!V##AT8Ph%frrp(90DdceOd7yL+DSPK( z;!=BzEZ8)~uqz5xkwIO-B;%n^=j$GAmVPg8G&r+@LA$1qmslO+|( z;b@b|aXE3VlFgWiIro3{fgc-?v`+zUZ1y`w+U(W5vj#MQcL{2gDlSwEC-P3WM6Cpv zrJOR?)mI#g=b2~fMF92PC-0D-rpK7Qc9OyZej7^6aaViF4+<7xx@4O?Iw5J9^Xam$ zywrh(=PRj)pmjAHvDV{?YMs#YJojUYBHA=_;p^O+EF1N5@Zj+u$(ScuYQ4j<2LQHmx;jz=bCh%@&M$Od0F_Jn)rmE9XkYA*jshkLq* zv)1obt=O)BU+yR>LMHaBJB+}vyRWA^MHT-mG>Fqs$g4UB2N*~NKm2nh6>0uR+T5-z zRh~q{#=C+HiikSqP1*H3H;1j!9dx~|-0tR|-B^_cu_>2VeUFI(omv;^DUD*ny*~0T zfSfpJKYm-G(@-4Nm(}INub|(ix>pt(o$QVj0#0p4S$i$h|$SZAHrv-^fUF7}b2)aQO z&h7+K`aW}PuT4&y@ri>agIOSU;=T5ugen6bi2qNKA^7c0#YN;>KjJ`%?~9^VlyBNs zq|ZM~@l5DsZ&Uxgl~Z%@uYGB|X*-t2&YRDL!U>ZB8V zRc<1I$^;0->{yPY7-Qgb-8}*M9sh3okYmnh&j2-?s|Xs`3MUVQ%oD;e$#Jf~r@sj^ zMBU`BZnE?|yA6ii7$#2ZT8%_b%V5AC>BvsMk0BDtLy>RRe%r<1a5%Nhl9Mv5O`o0< zY8Ix_rM_2Et=+!TNwp69a(@)WW$Qr^elBpx)7etn#6j>CMa?nxN{=vVf+R(eu5@jE zUjCO|s||@EwA9uH>ey7#Ai@|{6roWMTWpytTsCAfipg#8(07f~6(+3d$kN;W<|;2J zk1PESu|06pyW1mrKP={95$szf3?`6Bcq-nuCv-`%j}umtw+ZrnUO-wV>P#dV^lj|% zW(*FRA0bKiqR=+RvUiF8u_Lqjs|H~7rCYk0MJmaY9^yWA$uY6~sJG`nMKgeYb(S1l z#9C^XY~N9t9!DdUH@kq}phWp9@fhOewtqDOq#f(915ikiBdUEVF|h&bMs1>+w@l$4 z(3myH;c54ahykX|Ez8_1Ss8|``jQR5lko*+QJc~{!^0tLsm`6-acCZR@9CT{w*2aQ2mkoV40u!Uuv|Zk!kM%DqTAa z)$28!nqlhY;nW*Fz2s8w`!p;|fZ3?&d?^Ea8V zEQ&^+byL-)5D3fMwGU1FD|4b;JN`l$;9(_PAp;bkWMsod?oiK(A}K){ObHMuxv<(N zm$hRgyQR;jz{l*4XD};1ga6six|L1At&WMKze-*g7n)WR@tGz{=uJ)$-cLJHwGup2 zVNfcLSyYmYpWh2IssCA|(8#Nm!Ng;Z-Ry&aVZr#@Oh03P7L#Zn_ff?To7w?6etzH7`vOP2L z&2|#qQ}x>0(iPU4EKjT+{FaW6BnP{!74giX)HzQM+}bJi(^+3Z zuRN1xuG6qdY@gme>yZNxOX4MY^YbB+OZ(>rk|JMS<>y2Mj6+~U((Y%x{?7tf8wc3v z@0lDAlA%*?B9dcSfFHCe{7(|7v5Bmit@dTKeYjN~7lvg#E@>4lHSVT6^y?y@EcoJ| z6qC#r87&LjMJWDqa^95fx@1#2JxWB(`^E`JUviKYDWtn+aZ})@_8|pR=!9 zMkGx+=~C_Cxl^(xU1kb8amNmyKUcO3Qum+Tt$~)R-tAYv7?!)4)f@betC-^c<4Yn0 zheyl3epVdz2ESy9tVSdyw#Ct9;oYcgM!nmuEuMyh?wXtQhG`HxyYlVFn+aySM>sr< zh6BSGJibutSnqEyXJr=%nqD#=%HJu#$k=UAsSV|Y~r#n3@-ZtvJ(5G#j z=(s~Lpa#*tvoq_xxyWM~1eEHkeh$D!RnYI8!U7oj=b4Y#gl@V|>f5pZI>2`Kzd+qF zJD@0<((fG+%Ve_%Pi6RuaEv6t3Z(tm^D}bRtdkfd9V)WKmWK{UJSrai;hMbxTd*nX z&G$tm4oaLFwQ|Vws6Q5F&884-yUcu{>|5yM^~#jcA`(!>HL3fC&*Vu=XopXnV)^ZFU(>1dk|wAF9((6+;x(6vh)BT{0tJFRlm8vc(%UjOAZulgU)tR(qiWc z#T_~?)CiQvp+LgAoujAWeD)L0+tq?nbC5fdbIqt@Niy#vY z72MatRUJSqiN1+~W%q6c^FhB!BmQ4G*N#t5zomRw`j&tD)ZZwk%-!OBEr>i9vY!+2 z)ihu|8;swIx0NmZ@-#!=^<4|S;vD;w8a}AF%EL7DQ|VRXRFh_v@aFe$xoD@us&LAZ zCTD@Do>W)!&g^GPLLKcSSieP7*f)k;)>IPG4(vIX$;Z24Z|GKi-HWAcea>HvEf259JDw;ZamVcjb6sqMK-|AMsp=7pJiJ!R43LX;~#ISwoQzELwD z#IgINx!Px5k^edff_KQf=4}zt8`pL=3v9`HmtHmQG#fiwYbC-$udc!WRPT) z>y{4}D}OF4MPq`1j)NA>myU=)GK;1)#j-3}UeahOFWG}Tj?G-E+kLH>5mNGFX4Zd? zqZRzCHH&{w4kv`8Jxf)}_m+FPnNM!M7DIOg_PO1JgyAT1K9osa);YF!^mB1oD5m85 z#jUYo!u9!Z%T2XTDpRe1ct7YkM87*MAhKaVL`0rlg1`&oK8stEnF~n|Q?5RDhVy;8 z)9@v+q5yS~vABkTeu^RF3O^+i6;+3Y{_DK0WCb_lgkdpQ&lzo>l2wU7U1`y3yU zPPuRI)kM-Qr0mcC(eTZ}VQXZTq@YmWYSp-a(_c@ajFHYCOWjvhM>SAOyLQlV9}H_P zCcx)a8kI-UPcA$|Mg|-_-N3M>}BG<*U(lTh%zpQ$(ihf)77h)vT;8%rH=!aquIdg8NZUSE>J7os5!j8cen5kl=Ms&W#G4gY_rpGn^ z;3`1*cdxR$54M1&PW>t^Ju9u5`Gu(U8y34WhzsRhPe>>D2)D?b#|rjjwKB&%r0xjl zq|u}_p|i=-R&WZ$FFIn`1p_hrE-M6~5A-gbSypY;&)x$YBabaA0|vhT`e*(*MaEvV zes>P9tni;?W{1>&10`QQV*4YXnP;s5G^4X}{mOW2MdY>)xhQL67L%j|87Y%kzlDG4 zsvGHY5aWQn0dHfPl~-qmy&W%(PmNP!cA)vhz!l?! zmRkhNcCrGPy=!1xZDN%)wfH51d7YAMm7@A-dkE=OtkP^lJp6UB#jIGDOL>Ltq|YY* zT!`~<2|Cb-dcO;4<5cgyo!F1E^dx+=VqIwW;Sk+mFjwd;{KXeduV@F!^GKDY!=7wx z;k{+=OT?-~=3-u&i`NWQSULAwf4+zDmhT8tRytEG-a>cot=RiaKRFbKiIfogfdP(h zkI@&m4&0l*g$UOvI`|>9Ek@%_^*qN}gxEPbC=pyY7=q~CnR0HBcuV_fuGV&GyZ#(x^G`b4vaDR z1wTM16cBiGQGHVyE|OP zoKhitoUQNiIwLxS8wPNtxrI^RP|gXxETx87FRa%!Jn+pd7m6$&{_wSb)Y^g9J7H{8 z?YGvlOn;1-pQD1aOsB9btMD{OO13XcGF_>Z!DyJH77QjmwQr2IB=+x-JdjzyvhPhU z8gz`+S$o-+=)GfV_3)inPE1@SrE%cCly3LfGxcRf^)EVImgSk{RUtk`Po6g%rqH1= zyjS~O-`-OJtRKA1SGweh&wqUIx|i<#s*{NV`;#?0_rbuG)z({2gyvj!qRP}oq^z?$ z7D9Y@RZJ-gyC<5$C0HI%85$kujX-Lq(e(bUz*bTTR6m_Lm06B|gtaTb2zD|Sr+Ah7 zY-l0~c8ABVSJ9GZQY!y1Il{+ytCX$$8@@C-4>x5Lg(@ms@(A(uf~|#zjbBk7dgnis zvw1@6L%5)VflJV4tD1EGHC{0<_{EdbkJf~I^APq=DnLkC~ zz;OLeNb25((l*qnj(S03T6RnfQ3ab>9|Thl^#{es9wYKsEmiwON=7)P{ZQ3hbmw=l z8OgI^SL`hD4IQQP0`&(FP5>rQhR-`D8YRG~D#e(Z)Pm9w14^RrTj9jqnU>@SME&?; z>ElN=G%K_#eQnB|`{nqCKxnS=K0y`#T~LwoVGRJb5P}W#YTD4T-h5EoHL0IP`TS{< zt~PwSs6_=YTy!q5(x)ma$!!EF?#V&G@Op>=H-S9~dM) zbMNs5pAaW;dYLAXvngn#zcgnqH;!N!_(+zJTfm{{?tgY41C|9P)y>j1s~+tuSmdZx zg2L;vJ`{Xb(XB4W!UDQKS>@z-WB8i7?{x`Bx#>1MHvPp(&8~o!-C3TFu;nbG>nJd2PTMfY})&ryX_WknY+3)0%R%u zRtT$a17#O4#z*E;zqW+YG2>eFnF;Ku;l=XeJMh3AM{H3q+ zgW+3zo)jK=m-5yhFK@tL-!r^S+3Y2;&<63~OjORIAzOL9_!Kmc#tN$)Jx#K5>8X^T z4N@ef-WBakZJ2LKN+=LxU=<=3U{pyP*GaZT@$0`WW0Xy-UnF1XuH$=InmiE0bn1yq z#jSTBYy^uhM<{PSht#y3!+$zy&eASnm}zhS@sqGp8{bz2@|rc#6f7GVutUpyhB=-s zl!TYmECRmo@0#?(?mGJEnYb(U1P|OL&*%lT1#o?Q&I5pY$czK*%89^Q6o@GISU1OsXuY=)?Zar zypwn&jU&pJE!`;3pUb+zDR!ec`01D*%OZ4-fI{*^N1k*(m|ymWp{xOBa2bN&>z@9^ zI|#tzCpgZ5_4y91rBJ{8cH6luPZMn7HOv71Z6zw?Q+%Phn zT7ZSsUR}%o*N|Y$MU(v!#7hEhF|3s~j-&G9+pNuf&z5j5D*~~Nu)oS`Iq8j3649^+ z$sCdO8df)Ih&>kO#ZvOFtr-G-f7zVlqAOW5B7qA=0cYc@8XN7&5BP^83ty%`jreD%}l`YLdWXcR^XcAGo zufz2Sa(@X2F9Vz;a<%%vH%DG`%ZpinLp#~rRoS6n-jxGUb&&QSbZ#tW@A#LCvOX$30XAQ}CPRqq%Go_O@ z<|J=hs0D&>`0pwd7{1h|Ul2c9 zUNmJH&z~)sFEn5;=z?QD9%IQOO#XFseoEAA?IGI3M!h}Bb8%dky+l^`d0oW!Qkx)f zI6*RUbU?vt-I4r-)wEvecy3?q;{N1!fPH;p0)pY9i{TBR>a_aKyXfv1w5A~F@R~aQ z$A0md#_#U)fAdFt(zguiwHxEE=58l$;mBAW)_;9n8`;~u*HgKZ*6SW8&(11fj(X|B zKlZkwpB=poo7Tk2&va8hJge*;%5t0KuhZh?0x0u-@r;Tgky&5~zM<&2!Y;sk;a7tD zG$$Xp?6;Kl&YeoxUzHUuc5eR%`Y16=sN@F+bmAXqvwr~VIW}T?bzLtX!{raU$_r)M zoU(-5Tw;#jOK{OB>}Ypiw@MfZP2Tq5r^pDt{bcoJ20DN;du;ZN2J0E}#$aoU1{rec zI(8YF$n#?p= z18hCyBnpIuPo97J-AXCPh5o)J>z~k&F0%?-x|i`c8PaSJ=aEzWhPrfa$7U{;^iG~0 z{`D|Cp)%vOVDz|=Q8?LaCiPyQXIkINA2RuoN@xbVs`p{e6 zj{7#ZxX07YgT_|-f=t6c<0oy3V8;}SYk$~V`xg&LMwQPKPStB)kNivI$%JItS2xZ) z0);evg4gjz+qR@wBMtN^%6rM{(K{5Mn!00}87InTQ7QB^3QKSKa@ zWP(-qnm28iCZ5ihE%p>$Bj3H3W+>}Rd#vr;9+F(3R-@Jop2;jTx0zALPp@Ztf}uML zIcd3Bm{}+Gkk5Y6LGVq%h;`=IHC*Wx|80SypuZ1O(s5z5=?zrS)5MwqEUexE?&6Gl z)+Ytzh(}Dh<;(qVVb9JJNA(^%^kYY`?m9;!xugvd31{U{+86rSI2z>UcJVgmxhLgW zX01tg^>c%aL|Ss&C{eHt^}5jr3a==;c8kl?K$-iA*Tx}C(C{uM`u~&QEtCtR%`M91 z+}Fq73V{IyPBB08W~bR`*%2d@$O|%S1bmSaIw?$@DH;Pgm(fn2nM^G)^^SebOh(ncRy&k3wzCCVYOdEhDuFIV|%8WF(==Cdu$ES09eu|1Re(YoT=bBD+VKxIsxJzDFnP zr8V;DBl zduyS$&oRv(wy8`H17{|&o=;<{kN)s0Bdk}VMf2jM@yafCzJ(+BEb+nQwTaLqpn+7< zuLk3atn87OssmRgNru#t*umtHHbdqXeN0$$-!tQVIDbr`Bi!r%uS%T7{TS8lVDdxy zF-m7*xnG5<@kJ^_i_Sis()wT#SY`Vu$9=}tbFSjc%b`oB=lJumUM0`^Ws*ZV{uAW_`R`mVL*QtAO1M-c8 zquNUV){v%c$-ec7?0P!=l6gG&(Q9|e?!y+#Q1#`*q02kDTxBsmduMH0h;~Q%@>QB# zKPsDPW`Y8}VO5OJ?#BmFw=F)_1P{qg{h9A%)nJdE)88S21Qe54hc9^U`gfT1P#hTl z4zyr@(hE!hc@XMFm048El9_v(!C190S0R2v^rMaOY(uB(W-S$4;^+0i5mfnnVR_(_ z-v5`DJ8=G(;s4i$lrQcVHhVI*gt-L8;%`44hu#WL&WKu`l`o7vB;Qq>9G-Y)Uo3iE zU66Sszw3Aw)wAQYAdU^PfOz+<^-=5>^>&7meEs`wkf*QwvtOkoi&$_{TU3u9jeoGa zo^1Ny$7GR@m&jshFSP*=|K1B#FEY%nBcAu($yBw~^W$DwNV3I`|2i zH%zGy9}MP373fZ8eH0}$FKaF)hb`om)ca7~bce&tw zRMStvRplPt0LB~iZIj(Fu^U-We3YrA&{RKM43Z5DPCYs?b`CJkHFvK*rzIxNW9ldW zb48KGj{S5IV@f-+Zx_5~V5M`_KAkp2#XmC3@N$Q9E4EnN=El^=U7ijrCo*{cp^sC&nxRjsH+&_u71`MFD zx1Ug`IKI@2L2GlVJg99ShPoB+z|lC2e}t52Jx@wJcfRk0=`F|rxGYF(w=(pT$@U3f zZqbno5YaV}e*hSwPHq{TR*_7b&qak2*A@z1cnNHkt(3K{XBD37g z)!S%q+@UZYJWHF>oemw*VYeIInzrghv-qR;D=)MI=$rumUk-jidyNHfIX%rCK3C?# z5J>cQ_z6*gY_PY*W*X*5QEevw8Gv1R4r|MeaLI^~8!i>6d`&@b%X5nPLV~jD$70|R zlZA^NA)VZdq|4RsdUS!CkNHLRA;d?;$*H>>1<`;sPc!onr9{hur-+2RRq4m95rF7s zr&zz~)V|tHp4R!)T&r?vzO; zKE>EQfE(%7lQ0CfcljbtB5Fct0%cShzcZ8uC0!0ON+9{8vSW0Ta8DN$rI_!PKyEg8 zPcw8;7}0Nb>cuKQ$Ubeo+4=kn|HiakY*kZ2Ql#8%k-pq$QP>2(j&y)`M~k|A?suD_ z2SEMoIFvtVq9?c0hZs0if#H^9!DUhDG)lwti|g{*74~y7G=6Q| zZM{YGYUpD$-}EcpO%_aZutf+Cd4tRNG}b&*xd#1F+u*&ei(1rKH-qMDt7&uy7k|yJ z65ICLF?Ym>&+gVxk`(Kpu^O{u z&{sO1?X{-JK1yj^tfx@6EwKkw-qd|QrF50C_e{Cz!i&hi}{_B{im@#A1z8LqJ+Pb3roaVQs5@OsowO49=eF8V*v2#4SDt`bqnVxq>RbND~SJiKY)I zL0MHNl2_h#YEADv!XV885-7E+10x7^1?=*F00aI_)rd=jUH4QylR~#X`tF9;1KU|D z+Wt#^*`L7-Hzw&E@JT$E+^jo;8hTO#_2FGG|Enb&iQ$XTsno-zG|K{G5xHJyN`7yFSqqS7_rluI;qKUZ|{utx?*vKQhKb+FlOGogm1p127_0-lYra>PsW1Sv<4&CMEybnH{Gw^@iDBto@H{2$;Ue!6|LS9NBc z`tEd97K8yLhs0n<(NR^*N&q15gsdmdmBEUei#E|9CA;q-hnTPpnq>dpq~llMxAAj~ zn@GE>CclO|{zJ0O3yJ;`&nhz3(ZDx=A8CCFY_`KQnAMUeh4qk^P@rX-U7E(K$bIi9 zvf!z8=P&n(>$~d+M~CM&=(xY=L3V_+aUCvbw2;KmQY-5)So4SJckgJ2-$>&LM+OY} zx4fwW9)_ilm(S*yhwPZuFWPvV>04Uf2~(5PPRz1juk((rqung!g3X6JCh4HAX}i_W z!mS0jk&3ccm@mugTUs}1@;AL%ib}zkkp`ZL3mvg1jk`9`AiYDuZm?pzFu_?E;Yy`F zyIw%=$dJX-c9pk)!hTnBG{4V_)lO061nrIXl+V@*$Z?|d)_7(4ot;Y3Jmj%s2I^9C z!qKk$-vTQ|9|hs;My0agczU35eC*3WrE4Vyj@;Rc)~h?=x5Ez%bDL~$}`8I$Jo z`$fO8LCe=vBvhixE&mzTI1v-`voR+LMSu6Hht}?Z)@#w}OSGEO_xzn_#b>eX<&#cG;s5)3k>Q?*_U}WrWd3P)wnB)8hXd*~Kga6l zFIYFNHE}u(<(K*x0n>y#Mak+8ISd z>-gdh8*wj&6qO3K1iOap*Fr;I*FPj)`k@l1%G`99IXtS)(k49Y+&a{Gqk0aZ*Ov(P zbZY+jZEl=?nyPUZhMLzx(ZX(|Y|`|& z&wKbjq#yCwCa997MC>E!*A^rPikRp3Vu=Msdk@^8$eiDH0ao#|w@=3U6XVkwS`Ws# z#QhL7g+VbQ1}l(gvAnkY^cD8ud7*Gwh!HV_oEZBrgiBvX{qE9|faaIer?9InP@lqD zXY-nr$tp@}ABWSfd!I)5RaS!q#;7olcfXRYir0BA(WuHsori_P1~zg>bDu*;PLHdvHbBUSw40_&cgn@=w#Wo!F3MO znjIt(!uYaixRUik^8Bo54{YM~q^H@_(;IrZOOxy1(roqB4t6kSUuL`~{K3*H7wE&r zEuj={QrC~EeAUit^RkY1G&k=}hB~33UP@oC^!%biS)@{qdPNI6b=N)LI9>KBy*YH% z#JB5YR&XjGj!BQhSZ1`beaeuL5W<__9y;esI|N<2Q>>>wu_?z6@bLzE=I%`pF8Q+3 z*E96&Ltq_g@1gZ0mF-`muRW`8i0On?MVa09nc|$`$?eDE z^bPlOLt$9$M~D?Dq(=GB3IZqRJ@2LsmKKlC;(@X`e=0Qx$^N9if6=70LAwnfxz<4a%AgohwlB~O zY;-4|H`VL&UkLK3GbMYnPl#g(9vG2s$I#>>`iQ##YCRTNZnO$OzK+m|iT&^!DBMD7 zHhQA44Iq(fHSX^5rrsefo~3)giQ57a=4UHLLdOrkuZ2JO@@f%4xBY%f8y*5Ji(43hpz>L3Z(jQ}v1PoK>2-QJpgbb%_x_ri z@|MKroRhToi6RM<2I{{*<>fqXIh=58DV%Zd8c~Lw$2*?ZU_VbEJh!i$Q`wh>X%N`0 ziE5!tMonX-Ik0Rb7PD3)VZd?{FnBAJGL7qs$}`StBdEAu*CZ4|*u zBJR3MIBoYvCr(jJz3gddz%;~Qey+4$p_AUirD|eWvATBe>0A5ta5Ga}R?Ioan!ez3 z9ed-DcXP<lVf$ld}lBin~p0T%2xVR{B!A*0|B3n%)&(+R0M@;>}t!x7ppQV5yh# z_KRi2vdSWzJyYXr2Z~xV`^%~_KY^SGmMCNYt8@6EWP0liY6Y}lRTpNVH$wiUG~HMz zHxD)G{dKc*3Yuw=e!N=r-cTxs30`hQ(0ZHQfd1zV=1)Sgg1gbqt=Ru3E*Nm&D(^@A z(|p|b%-hFN!9_l)cq{4L9nRa>hLDFj=7=Jhv$G60@tTX}#nG;pr~4M!FJ^@%EO^za zQ!ur=@`U$<@o>(Mj~Sv$tP|kx2L@C;q9n>C;dKIc-4z*M5+GoolG~zhX3$)5G?!E7$GK8 zWj_?DO*shX_S>Br#gg4DKcRusx%>fYz|Cu;+`Tb40d3R*$wxAl zDOEo4*YTJA5JTdsDfu-MFZP{z?^q#?cb>hQsW8Ut0bZT{wAG;PW;V~R^L+#U{azsl z+x5vd7io*+nV0Hkm9sXd2=9yNqScM6xnAo-s)J!-@lBC3rj#pnI+c%d!QLH$QiQL? z>&^93rBdSi(uH%-62K}i)otWWiYi)!WdPlE_ld+@=VR2I2)=rTvPO`(%lS7}{KWHQ zDAg*r)lys7a&pm64~Gmh_0t`ld4#T(X>S5Lo!V;T&ypSIme`+)Pir-JMweU)*VqSM5~ZR6 zNeFK3kA1F(k{G+ARFVkTU<^!#S7)dnw~0tIPRqp! z{Akfb>#K3Writ%^GKoioih|3faYsEx>L^ENn(Q}9mrlGGML1|(FX!PKnZHZ>ql+kF ziqtON70w5alZ;CK)e{P1Vb+QUVHUmH{MJh)f#efHg>{Fr^ZV`Lg^*Nl=yiC!+v1rU z+Kkk>R@wc$cpK<<-cB!=ZS^DUr!v$fjs5v46@V!2!rewCm>V{;C06MTrhtgmoWPgA;s8m*XHiJg2 zyutO@jz8J|4rX!FhAilz+y|-3=72h48LyISs2yaAMX8|e?ueSaySCVMgXQ*LD)>fr zZY&k*F)Bp3cU7vVNE^uswlb3>=|%#~LvTx+3J-wg*$<+LBGV>e{OvqaFks_f*@2QZ z@ZI6@o^a=i;+2n>C?4o!ose{6Uu{vXd4mQ$Yrw=uV(vvT+U>@g0T zrBs$7z!q$TnJUq=T=fDcPTIu%9w!({NoFT|z%1?Nv}9e*7_;>PMlUU@0B>0hjp;NWW%N$B z2T00LxZ~{;0##`HEyJcLf_5R^@MAdu!U$!HqES_Rkyh+#k) za{!A@Pm+aQ4t^fOsW|V+;tI9VYK#d+KQ)0H7rYwW`7m?`F;n2FAhGlJJ^s0fJ9H*k z4so1;aS3$hS>L8k{7Yv z9KP9aMEx6<|3n%fC&ZkbjZ@;pt`Fu6t`@OEXiYnCgrsI7gF#Q_dX5ne;Ve;&BDN7K zQs*0P3r2R;c^7HhQX=DdKAO zuZ2klFCe@EG$8PpMdXS=BCt?j?&d)TUr#tqS%4)bqz548eXGV$o+XW^Z=DIahGsq3Y6fLZlqHan@4f0XLtTg0-_+_LPB2KC$Zjy9wRW6P}_H4=4tM_g3(8N|b z-r3IPPaJc&=a;UpuHE57EonRGmN#2Sdwo<}LmE$E2V5VurP`CYR{<1ZId~ z$b(k6N?QUpewrfGrQ$%5?$D&-qGOW&M{n~2*YOMZ%MXMK{xuJaKHdUuFH3WYitR2Q zJMAzc3gtb$D65t#K)DwEA}Opd@>tdefWI+y%7 zGVj=>=nNB$H*nSB!s18?o=Y7kSo|XC4|p#Z3A_@Rv$5=txG2c@kyT>Y4*bw<^`QjA zo>)G09~%GMiFfZt2tpxJCJ1 z=)m$ZUB>r_%-t`Sv>c47O{e6ZC7#!P2EQft^cUIwjBZWW`SK|9={QMG{688$gLi9p z*GY-~#SWosUc(uJ0R1qR62{1Cr8b@5j2=(jQ#;rCM0)Ah-7DAcoE2ev6R9rowOHJ( zY0|4Xp>b0Em>wHjhELf=;lyvq8lNAXReV?aQQyQ+73hyK*QUYFp-)K9yY#kxr*QY` z7fb$#G&A`uL8rfyGWw`>8Mkn21QgQqC6F)3;JhF!d)SKC<)E2ix&{IM|rTPRFjdLC;l|5}7;XteG6v>I4hGF+)L zkTBuK)KfNtN)%%T%}IbZVtfk z-_sN^;z#x}LuEP&o&GhE%X8+?J&^=z6Bj^VS=L}m{lygx<67TMhpp4Y>-&#c#jX63 zVqC4v$CS(JwMUP~xg}V0>X<`1<6zObxlx+uaJj*1mosdaHZq;=zH?WW+sw_rA?>a5 z(&BlyLeT9G`yA?GM-E3^4yFh41J6++-?2WlsB+T`Mjt&nH_ZtrsI*#V2|Mn;u*JW-#--;N@(sH`Bvc-h8+^Mj z^vB+63=ijk=0mMO0JQ#0{hv|KPa+2u>!gykjY*I(*?Bs>U_r|-(ts9b%vc~wS`d5Y2ZtV-!bw>5eyPIc3TH>>A3(a^= zsGmH<2p+#X z_GZXXH)n}=ZDyt0xRB$_?71rTwyKhLImlReLnEmCswbOhH=!vLb&mL&b$(9d==1Y4DH*SYk371eeuDbQwlCBou|!bJL?(G#)Xe%yQME#}{e4jdbCxU4PO(2&;fhZ)y<^Q}pCWRezL z+;bZ+VVSJ=nc7OM>UD1y>vOlM7(O1Oa%AV=(I@q%Y7YP7ZQ)1Sm`{ai32Vpy8sgh6 zJrU_m)Q7J>;?{!f_;|y$rxEHQPZd@iaMq;i|utVt6G5WKe;cB;P^Nhqw-bo&! zMuGTN>pR`Z?@itFGa=9%Bz@a3pOzo_pj~E|(Oj)PRR80q!0ceQ;_v%z0+$3<+m9*qzw#ZRrdV zIR0z@C$W{W-?{n*tGoh8TEZu2Uw*wvTe=xbi9IETK_~PETk7R_dbQcQ=3T17SE7h< zeB0pvvAmJpAEnP9nhjv*15E$zg5JyHBl*8Ur8{Gqqvc=JuRmmLj5hb z#rgB1A=&Qc=2pe-xBkQO>j%mPhsRC@QRHj9D3?L-=QydU2-`ErNiW~l!8N(nS80U; zHwF(Lmq`5d^a4HN@rA+j#Y;CHz1z3E@|8~VgC;)#qtJsR`$7p<@8Rp;s~nDR_X|dL zRe{FA?K@k;^V9@s$x$JD@qBn-q?LtBAEaeU-*2ok2y}mipA_S5t`y(}41x0^(?}wX8 zzwAxlp2mZTgHK_{TR@fsC7gutba~|P#4We-`;W!W1ou>GM!6+2(C9OlcT%kq4UG~b zqc#fP3)_L6L!#zoJ$`PX?tL)7v{-U}tZw9Z4D^pP?rFaRv;Ui&x}bjC0x_l;ls}yC zSF-Sxe$2~jGbhDQ$lsg_L|2BM^qm;XrSzsjuO!6q9gFEKGQB~Ws+G$je|PJC7tbFr zCTIJ}a}PBxSWG8Jul-1Q`aX0{w03jwdn4kMf*Gj22;z8>L(;r3>?L)kdSy7ZjF0X6b^oxjRoUY3 zT5ZJ2!CCFrqD;k}Fx4p3$2WZzwjVT`gq8yClzjI@ad6e}hF65=^Vv-`h(4>HV@Che z)Kl=<^Uao6?6TXT_?Mc;!Y8VQ&t(7N+IG6up7Q=-;BOJiT{)%`LNzGw9UGzr~{kr}EtXp80t)ojap`jo)Nj+=HFgk1_y>C9t zA{?RI2xVzx;0ASfb^2OqiY3HYHuztFXcFKsWkJBhSiKIm2H7)T)`AO6F-pXVR_sB0A zKE^4wNq!yd^NlrZ^^F6YMcX9rJx@3OLr2cs{^u3L{x%Muz{hr6ZA!G!(52s zy)C+0rPLFWn`A1fv-{;Ag5sdn(fczxk4*OScCtii^Dfnqx1oA(hVeri3RbTQIv~hC{Yu&@gLYSz2&9QoT$r{!;4= zGJ?YR9Sba;G#gN576Aa73Igi-xyMDWzhl?(wc7i=0qFU`!BaA8GB0}lA{(E*NQLs3 z)Xij_5ac9xQb7aryd|1FX3bh&(3tcEle=m<3Qoj;zwv;cxtE$Oujz>RQ3^y_c68t?z>Wrd? z!+nu9_|gYv=!M3!>3KaK08wnDJo2eLXigfGj{#7C$rBtkp0bLA3qDIlu8QQ$0eB|% z>wwWmtPb*NbzVe&_q!&>lJlnz_NH!3-^NbSa0+xO#tXX?@g*kd8oL7U{VB~BKz>fPozd^ zU0?{jV~y#0sm_&L5?H%&D(of4~>n}fAr2b&~|O~Dtt zZXkScY7K9|l1$Q`3eey}yy2~1Almy+L2Wy>i!=ycU?mqPd{j!%!6#ZU2PcqYyzvkF zUWm%=TV)D^Tp>MuX&}2uq@b?c{L%q@)i{+K+q_tj9$J6pq zmwL1f(WRj*Eo;|k%ER9UsOHst(ROCoM*3 z?;+gI%O@~xkvG@QC2uV8nTSldCQmfqDJcDBr8off5H{f`{5!d0hXLoVhagZsfRT-1#pCau&eO6j}57pOD zDxf*1w9n*+-t=>+vf<%Mh~bJQOzo$M{VInU%WpPkl2g+8?yzH125myoHzRY|hqe$H z`gWmqMb#N;=^{#|4Me+J-B-=sJZ%LXubuPoS9`*9;B{B8Z4TBJ z{p8@_VAOtQfs6Ge9y$cnn$8?}rv>{wEf_Dr|0CAp+1)@Fqq!ha%)45AqIa&Z!;_vO zI_}|)N9`I)n*3ou2c90FzYyNYE{8AzH?CN5lpDR5Z}iK`^%U4RyPiuRk-S+N8|zAc z%=r&nyL4Wa!uH)iF<^Y`NJD5Gb*KCku0>Y!@_A%2%@E^LYGyfER$k_ zZ~jz07n_4c2AFy+UN33S40s&tpG0W{ljp!o4z6Xj*Na8Tro4e;=NCl&SCMl=m7nTq2?!`8 z^v;SnZF@}sWZN*p9N)gP;MpweI@y2fO=qsH1PC#;-TDUS;}8-amfhIXO6TZr!%M5G z5?$VUY(Vx16T!s}+JcsR07*q(C{owdsU7!Wcc<5gFI9&e09H75$4VCO456prfKEXlsrb^`aAgsI(;d$z|@M4qC7J;+ViO zd%tXLKZn2T{(mmlhuE+kf>)-mG5)&R$*OM_;f82pe<`hPpVtdk`Bn)P&^nS~v$?b) zoIypLg1KpDU-uru%X*{LTPjw1&Z{V18&1SFv|3Kj$yk|_Phh-VnnE;=;wx4*l!=joFRcJnK5MIYzZ-lN}yaT1@4R_k?4Eyq=Rz;FXcrPfGD6 zJCwC%Uy%9YGt9Y`#shCvmMMvIlz9I7=2hfWkXKXQ){!C_IqX;_@%?Cb?k%$8?%qUz zK0($MkF5cVD#Np;tDcvMZdB=1l*Tq=uUlE0uXL?Rr3l~0^Ip@|G!u-~bpmT}2n|-P z8<+|aNi{sh%6060KVbGxR>K{=%n^zP+O+}szyg#c&XS*aogp(E<6y1kog}zl2}XiR z?+QuDwf2@3KCv?K-tjWeeV1nVk<4U+t!y| z%WcX=MymSMD!0?#cOo*I$4Z1VxhLxtl*&oc(e4=A>^F4YvIO}3sby`s%6Ph6)y1rG z*Q~@@X#+w;`m~Drpfi49e#zuEmFzD$P=h`=U~+Uv=MxiMdAz@Pb&I^XJG~A3wpa}I z$XeIQH6{TYcT2P@^8G?(E&^tmd~vv4k9+d4F@=c_!V)K})))6&yI>^$Xxd~Dy(zBA zd3z`@v>~j)=t*ecKCNUmz)J;Q|C-Q7Wydy|PF4xU$4)A|T~YQX)jmns+J~$>iqF(v zdQ7&fc~qs!zLs@A5eJwr8$K;4elR;wOic*=WnAIt9B$cZb|g4Mvx94m+DrQqsh z1Gwwytr5T~28gk8UFxkMT}sCrJMKO+$Ap$kmxTruHq6vAHm7kR-z|k>FXc9UF|UXW zqh$l_Tz!yfphCmbul^N#{;vD&Y9k|&=H zABNiw#7%Y*j<`Q*jy+Zn{B+4eOGT67j~|oIdWrTL7IrLDo^#O_u0F9Kwqr1&<7{kc zmS%&mr*=u20cY>efeY@iF5fnIKemkaDQ7~$tSm!>z}s}&fzAj1@69UQvubSt$qp<1 zM#4iyBNYxQ!`VSdW0MlaT5}j6L<4lUKleF_MEH>-9A6lat5zp3pKcn|CJ)c*rvM|=d?TGDwZ@h~z&R`^+edPT z&bZppb`w7Rm7_Jw>b=)6r5azKJ-+3P2Sc~Rp2d3(dVaE<0TZ!R&9ABTW*9dGJpwoipN|eT#JbT zV7zy$T3Dv7Z^jtESMW2h0GAFc@`3QjE_5|SCY<)pVo_sy!W?0q4a<>KXErNglzb>v zL&EE((XC3e>Gtmfix%ycSWC_*dos4*W6^=ER>{j|GM|Q_1DVT>!i-Wwq0PA;1xqvV@6(oJ`_J`SWJe)3dUb^5^JC?pRGngY z)6DDuV}|O+VOdgK+L2^eGPx3?@r!p1ZARD~wd};OX&MF^q?j$ilriT`(=+-mm+5yw z%iUYBU2XW@k8>WMXMqil&@Hsyr7O4Y}> z@yOP;?WUC`8gUG#=xaUxh@Ze~Rm~XZ7}2ER4Z7QW7e*;v3uBbk?f7VIU-!xW3L@a6 z6w4BL{Z2-}oU%B)#c`x{z0q^(-K!N}+q?0yF1wX_fY~)y%Kf3i3X_i0MGk{WYxZuu z;f8gh6POinR|!{-C(&$x4H-oJ6ikd&sa8DKP(y8a*?&f>?MNp~iq)nGS5M%CZ z5^Y;Ap{BU~EpDW5a*=+GdT^x0zBC^2BX`*(d{7lM+H`D{w``G|Cp_cf6!CxJ*t2<|9cZiyn_SQsfMn}Bq5EiCrokLr0MXSR)k*gpe)1MJj1 zL_>JWgPx+%6vrIMJ6QIoNyWhxms;?!|6I6LvcaGxkr^?Y6GR_5%BrBGsDHN(5FIqq zpen65f<1a89KD;p(f$4MQw?&;nsBIgfBaHxfl0iUx8YjLQTt+*jKGEk#xqv>*M^qd z4cdH)&ocREF<<5Qw0|9abeoo#{F}0VD5TDlIiG{DYd}GonuZ_j*}z)=3}4jGeNK&+Jq#W;_0W}LhxA)$%GiJ zDjl2pN}KkAapYD(pqTtR8-#Sow~b!JNHWkxt0>jkEWRZeW9q1B0QlrC@&ABhUw!^q z%|{5Zd-TAIE-1g^(xx6|4DlHHpb7bkDfUg^P_e+NEB=x>nsCJi!W9^NV?yKd?rK&~ z5n-*k*&eieGZZvh+K?OAx1mu~EMX=Ddzf8O+3a9!&Shj+DqvZ3dQjSG?0%454#wP} z3RVh=aHyu{Wxz7ZEf!BQWH9OAnw{*`-#ZDG%(B)`8B3*o3h3C%VQDJ{%T6=CNb;(` zqzJ=wqNzfY$JbZevIK$6^VxqHaLt|>I(y5rKQACt``7i-X}@90tqzjjudePCdRtI$ zWmS1-{m{D#d>0);=Ws+#Pesm71yl`A!h%*^6YeY6Vuq<7a)hxk4W!@B75BJ|Po@Ku zE4D4{1OwgdDpq6jSZYp^ zE6p(5ukw;2A>t6q{WEi&m>6w6)NlbEO$G*9l5wjDDvCZ9yKnmR|KT-09P=cER)&CWjSOs^{IZ)wv-kRR3ER!`kk8Zt1ypk09)(eKkMGb9_5}Io(ofTiB#- z37=AZ7^2O<^Jpn)TJ29pT}y#QmX)-IhM^0^BX`CW(Is4ErncU=i77~&L$z8-*P5@> zRwcaH+`dFUPCchp^{e`2t&O@KRlM3$sckEyO<)64yQpMx4vEOJk6bpG%KbzFS}Zbu z`3s22Zz5mlE-2XB!kru;v``6`z?y6pk zzUoCw&?wkB8J_0$Z}0eao4p2gI@Cx10fQ??es-iWqNX8qjj@XqT2SLBoV4G%|AJ}p%yk4 zD)GZ6ZYt;jTD!QJpzWjXM9C0X$X>Lo_3$<}UVNc+ufD!{;3C>QvqXGEJ_|T9n`Ecy zt0tH4Gqg&d;xAFQ=)^$PuenlhE%ZN(Zt17;mvcQ+4kds)RwD;)`b6jSd5|53#8dn; zV>)Rs3hxK5xpn3)oN81_G$oCcBTbQHF5dWg@%j6Hk{A4kqrLbt^LBdKi;fw4PV77l z-;tCp71Ex@RkiuS)^!JGIkCW<*8B0Dq%vp}es_7nXulOv}CH}8+7Ux019 z2f=d2O3Fu4QwvF2m=z7Ay>47|-?p5mueA5Yv@#8ilqg5l5Is!lc@XumlDVkA8paV2 zwpI*i9nZ0;|G~;zGznk3Vdr{O|KH`#Nt?&}C*0=jBj=2#!^;bCb;W-vp?}{Oxqkl0 z4zKfn**d1>CH*Z#XNA2S%UdqXE^Va(nPtc9#!FcyW%#92I(x=nDGh6D6}W@@pq;CY zDgcWFe~e6(hkm{y7FiqW6boMHnj~VwI|ri?Xu_c3d5<|S;(Ble;itH7iWNS)q|Bn@ z32&xo*IG)P;g$3UaGolI*h~v@qXYStHS20t0ZaQHp$?u#R#Fg}x#$x;)7VvR=0!c< zmW0%IH#CBsn5M_f@xVfOVs&!{t#6s8+iH2Tmph^zO;@Xa)>Xx{&bv(ZHVo%UvfF2t zlTOHWFK7+d!IM3mCkM%##k{0R`O?DNYij!SE4-QfN&~33mDD7GC5=`?Ro7eDWmY&d zikoYaqB)RSyHpyRvzk8NzoymL+dop6yH%!9A8J2F-{=Z}*bpBDz@uiq>`cr_PW`ku zF)l2@WVd>+9;$ZAwXxmm__?#(4jb7xr3qcnAiXfB@Va}WIlN$_@jk(21+}s%O#89# z>TAR96NZMBpUBuCrHZF>G2O!5h50_LN!LqSEw&Y#be2X+Hcme4mh8A>{&A6ml=Ksw z-sFodSLEToq>77>XuX~94(CwG+{6}o-mFa7Y%R>vQ!^|6=g!NQjq+bo)nNBQ`@z739eE7!gs6$;kxTNjJ69$4@iP=$Xm0F>wd`~i~2G<1vyLK03BW2 z1Mh*uIzB(=)3y})zBt@Owzj2P1;$r(AH){+qp6RGV&$h*>^wFgdM=am9} zNku@{Fj$Bv4Su`KNN`^|6aKlu4Dd{Nq(H$|L45>|uq&|v=nH3CC8&!I{#2XBRlBEw znoEXqja-L}v!%ivz|r2u2PZptJS~AdgEjXWmdk1SR*NZOLtc0(G|Q>=hJ=?ZQsfm) z)I^vT!;OcfC4eRmid;||d0i6pt-<2ib1l2-n5~-79OZ z3|#-Dc{VGlwIAB)PPv?-o|TJBiDBN=HYR=kAb`4FTkD67SnD$WkdvpyXIU#L{3~p8 z#j?6DqLM#ddzoXfylgB`rt)EW+EAAo3tt*XLUmeQbhbr*80_n z9R%ZzrS|M2#yT2Uql)x_guRJ`h$@&1mBFR6j3Js!!vmKgpNbxEo*ZBOd9d#-G8fiBYZHr64a1UR0e8t zw|2P~Fs*HKMfii5!V0$Vusi}!!=~yVhdUe7Z~RacZ8Q{F(rs7D4!wm-oGK%kGF4y}G z_PJLs9E20^KhLE<5ul=ZYX+U<=EI#Z56NGB>I+yeukI8<@9u9~><9?t5G+iTs!y7XNLT69~MPG1$=oga}4O-}$Ec^j2knbmR z`q#r|Iq|=B{(ZBT93u%M#qxj3{#S=Me`;U#vodnA9YQ}s-e#EJDNv#LGPn|O;4xhW z^fBWuK(Gu|3EilcMaRVlTC8h?bv1l&XFMC@3c{VY6ru!%!Mq9zlv&N>%4{IHVWbtK zJ`rC82xN-e7fC+M1sHpwKHn=sVAhwXF=cDzc<&8rgxqF`t4*OLAP)j}wOM@2;jkF6 z^tJCTmA@i~WVdr{nxpC-afF+b}z~Y+Jq)* z|MQPphrZ4oiyCRS?6(7907F%Z6eHe2^A&c%)4yTGdVst!Cc8_$r~^?vJ5ksW zguPGG@OkXS-2KIsl!~eiKPjIJDh|k!jzBp|TxDaEtR>keWip#?q-NKhI? z8w=u6%_5hZH&{KThgoL+@BDK%+y)~6ajcAz#qw*~Q-QW68JDtW6p>x#75254vMZME zl=SUhG7?^b;aim{BTXe6CaR90fo`pW9aV&@nuexprtyKzz8(L`Ub3}#cgA?}wG~v- z1fDS}k@5Anj$oeUfmnZ*lHu5}s$?3NkV^sPpXdC@9KGtKNvSrUCjxoT#ts8uN zZ_i$6XDg9-_F};#iwfmkN96!q4$>%&3*N;<`b*3_}ukxpD-odP8cI#FwnC3U>vn|MU)HDi3;m1#5tRf%PD~_8u&@G@E(BYXv^buR;i$Y3siJ5T)1@%R0d1&~8{w(~5=(t8}zy}CfOA@y97}K>QV9J=-yirv7i>Htp_?8v)dAE}JT5NAC zYYfJ0xLB3Hud0jv(`Y}zUa7!G=aW3)zl|5Pk7V^ab89{K_N5va$UVZ6HtCJ?^0pGQ zx~}@c7I*K`AYB3o-A6``v!!7^H_~^x^48hSLN%f=;$B4F-;G3M*MM-yFLnqGSufpw zv^g!S>X?+C=8?|0Zw!6@UK7Q_Zi%`r7A!4-=qS%>twrBb>hNRRXRMv7FQyxC!~^Ef zbz{Rq@Aja4((6Kpk25aqrmOM)xDlE4{T!BV`bNy*iFfy8M$Ox2Q>-eJxv|RB7iIm* zpBb7v2W#FV8us@Bylr*fNLS1$)v7j* zEnogLdP6n|Oljiuu?uzrsv1B1%g6Ar`9Y?~W!|Lo94M_I*nanM&cB{K3J-4jZL#87 z-SiE}lN7{EK3Q1}UHXuQJQEyjcQc6p9HJ(lB|X0DgPB3{;Q+E}$sT>|OEY0u@K5@y zZ<(p*7f%AS@NzYCUn!c0Ejz;<3)VZXMb70Wja#U)$R;Px$&aa6PAr8@1K*uHva5Ay zUn}=9L|&~YLM4*}l?`KVB-9=JE*PL8H`@}t6=XHq8?syrJdYL*D~oZ>;74;#7U}X3 zhUu$E`O$jv%So0WMF7zoopFa+TUy`kg~q9w3y`oGl;;=1*BDC2;->E;N8GlaJi)hB z&M_wO_&SQsueC8xj;;}a{>lnVVxk@iYsDG&Cpuz?hb73Z4R_n}C~3y`L!i&6iFY0z z`a>b-dA^FOF*G~#=k>pt=7aLSYcy3QCUh(r=)G*v&07_{TG;WHBwhz^4Xe|&lKSHP zafgXAr16dE_v;piBj!l_q|FKspuV;PO8w(5&PgKJ#9HQ5j3PnfStqOZUEaH*R-`zN zHjwCNj_3CF6{k;N6k6kwfAm7rb_whqPVPm;_8cTYi2?mnV+7S|2b&iDd=Hnz%^J4h zU_G|#+nL#R9D0M(L$H1)#Ci|B5T>*tlbEMJ=u@%1Vj2Ts!l#WMgk>D*nR$Ze1#*vO zew`wAd6Qm+7VEFF2ES|y(GA?O@%k>>TF-Z#s7a;kF&^@{Uquf~+_^ofK=2^#SH#iP>Jx>p4|~CT=*~Ed2Wq z@p^6I5Wqfrq#CD4^Itkd@}C8sT4=aNkcFjeOG=2<;ojgr@rKJcCsqpUCWZ_7^vEmb zPF^uW@)wV1*e=k%x~Ei(;T}@c&nAJZR2bM?#ja2I&_{OL1j=tq;9MmKQ3*G!ok@z& zWIcerYUyoU-`|*0bHjfS;NUWO@LXsejUemmJ5GwuvNCc(glm!U7)o*RW`fXJF0^pj z6g*pCW~hFwcc~w8y3LT%&)6U*?lyrr2t@0Kd70WLXvHEsPtCjkxncfm>%3xE-Ifz; zRl58HMzQff6tLIyOf1Q%=)TxKCrwihMroedo`Blsqe5i}aVmJ?$z>M=u*@D7?BR6# zumslRSE_r3ildZOI_COh)+=tO_?}|;qH#oy zMN*UB+nq7l?;lVor*t9UldJcx)w7Wg2bv93zL-$^raA7snw@d=qTWM0sVVHOZ>J3{ zYI*FCNW-_)pwxx*zsM+p)8W(qu37JBMwWL<=K- z$+%UIpz9kFwfQ_Hhh|QaG*A1{?-e9Rr~9FleDzO3;FTD0^wK^)G6PTZArCcpNj8>j z`#HF$`U#iSGExK$kSi`MXoJlh;-FNbDVvjOdwYet9;785x@0TZ8Vyi7J=R$0Nb{Fi zriiFFAI85CdS4e{Uf@+7ytjWNwB;y*HKKRmo4e-^(IlNhdxQBU|FCcW-O*d8uz6(m zTnVnShM766d{0hHIlhZ^?Dr0~m6U8Fz3~H-o$BcZXs?XWgPW>VGIlwEcgLw7NkP&Y zGGuh$0d1h#S$g5B(Baq%m`JLaxX{wHNj}@k8E27jdkcxUTI<4&gNW!RfCy)LKyf@k;Rp2Uo}? zO?qQ8{Y7?!<#*oRo^*GE@X(^2+MabE>lD4OztVf#)I)D*g#K!h6lCS$-elPChZCJa zzwDg__ed49ge-_vuvXLGg>9F8xT^Abb|ZK9Un%duw|5Qud>cmk8f?=b5}cOFE1o8s z#`*3JpQqu?Vd6R>Y1Y!j=3cgwJNhda?`${Yad&fT#IX$G@hC{q0*8v zV;5>TV3qU?tYtl}{4`{Vb8(acxxagzLTqfsgXUu$x@%S>+2HNbJ-hizy zefH%T=04Jj8@g(}i+$UWGV^d-GTrtm^F{p+LnI0@zf=c5hD|(gs5%Y_?RzJLzOyw) z=)Z9q=KtJc(OWQG)DIpVVb7vbM#`p=kjh0SlaTk8s;!zGeJ3D1U6RQ>N@D*xfX zl^FB;<)?_<*N(p$4IGarXB_K%V{;rJ4{96MI$Wug*F=y&64~ePUc2^O@;qAxsVDn( zJzwRUiE5sXd(c@R_#%?YY42s%S&uTxb9maCcBczhDN?Jp@P23xV0ElsW<}fH9ujS4 zwwgkvPeu-dQZ(;K6RfUs5Prn`ptd?zhdst$+Ta*D2>%TxPj6we;Dr6ksxO6MK5ruy zaKDUu0Ez_dsjFLg6qM40Z_0_Hx5z*?GC=&|7j%;|6!5yGP+Z-VoZ)p#qz>nZ;8rcg zd@t$!XE8IEcn2L(-)=X2)t14SLdrg|J^-H#}7g1SLl9^Plzki|^FsonUKSYLhSzRHp$J|sU-|Bq!o7@HPh zpSOAmOTOtpfaRXBbxfVyd*XX-zaoX(`zCOJ5cPG4C+n?dcVk0_uaYh#{U!CXvF6zQT8`vg?r|3VB@9oDYPyA#r)ysVLTu(k>v-v0o;qA4^6bKy6 z-O^~%qctqUM@`L4dBLzh^a7~Rf=*g|zce|O=UVKo$iB{g-*)DmWSVM%pIO`J)k`y$ zPxE2H72iuL{o5x$J+C1|oelkbqs3~!sbCtqe`Q+5FqPWs6?6=aE0TCY4P{;h-IV`C zvTR!5?A3J4hZsM3dxJ-Ka%t_Y_&}G+NblY;^;b`!avDqTgg+H{w38^iQ)bY;8kY~y zjf=In?ABdK@9*wnyJm~t%TesbAtpHYPE4wRU9NVsS_`u~a+CgjsfTE;_;e^Se93&*N07NUmX{z#3Jbu>*ncR1lh&mU4T@qO+ErWV))86b761X7GtXNLjy|GCcY;M|G@{}#(A$&9GOla zt_%GCD_=bn5#cM#^%rm1G3d@wv~1&)|G4R+&(RwW)w^o|X=-f|;JT^bl*j4F*UIG!pNMFFuY5}7YKI1P#9HZ|4Cv~=FN@9UTUc-Mf#|K0WG)bW=pP{c;{IMM8Lr~?1OY2(Ux_jem9GrGQ03j8dScbUCOu? z4sqm^!lHJ}pz=?A4$YvfuEqX0M*Ytm@$Du1{OkG2H2uA21rbFv!^Phcxp|U$j2_Qe z=1+sZFkIywoW|6m3650O znF}R-h3Oz>kzj}TYnx==8dLl2yQQ*{vp*@0%cA%Lvh8~EBOK+JAm`dCkX`5XfUfB{ z-~z9f7WLRhrn#M|Gyv-ktuMO(7^WyvQ8^IWrz zPQM=0LTpt_tbDI5JY};29)bml?LUFJ=B75Y`$9b0&nDq()y2JX!x|!XQ~OpRLHtS! zta=A!2q@aFrmm~j$NwOz;m#7`uPxb&gfeU*v*BIU%9q)3Zf*X?!O0xra3X@?fL!ua z-6+Z#9EY=;y#qcD9vBN+NHc%BDYU3zk^cybEt-h#==F|zeVHxD84Sa#+o2my3S=PL zbsjPwl=!F!orbiUKq@D+uOqwz_j1Nb8`#AbMBoRM>nxJeKW+8YdCxAiZP_;P_BDT} zSxiII?Ed^;%H<^dC4;Z?1?3*?f3M3Y-k-VGLvqtgLuXD2Z&pXQle{*j^%0gD8mb46 zSS<6$bBPmz#n%-u!Y1c^B%kN+%)gAZ3_V27QRCo0+ z8L`lc62B~tdL;j3llGh*=vAJQAoi92ue~b`OLC32r@=aw=}FTZQk!r{(=ts>g|bm` zD74fZ&~nxywbT^hR1TSChNzf1oisD&DICFh%y1r1K*J#mazH^u;Bq>*bL&3Oz4!0^ zA-{M&;Dz^P@Aa*<_Ws^aP*vDT1#2%K?}u4gML#@*=9cO!ZoS89J$LzIeV?UDFS+Ym zJuzGAZ{VuGEI0w4vPP9Z`Z-TS>;7~&U9P4u@B2F?6R@}dPvKNn9jhEv+7k{thMlOu z`j_#|LaqMF$cQE*p^MAgQ7!%Sf)KH%v$NaH^9yw($^&m4zz^9z?(hp~FnqlNw&}#o zBn!VU`>-`Q?&73^I`j$#as)`^CdpE8$@u*moU4vA-|k`jH7iROXS2dVUU3VzzyNp? zL_f`^tz8H%BRQWfxS(v;I{fI$i8qG~t|$)7(`^5q&g?+=Z~$om?%yRbl7RAO>TMr< zDIwM=leX;NcJB$hDOP65?_T67!{7(n@Uu;)SyoCGba@5DEhUTDwx+R~cTQ_u$|jZ^ zSwL;(EhC2=d=XH&y-xYGapX%yr)A3y!N}hQV5EILuM1wu$qf6&^blD2#cD^{jg0df?8R%7dK|A7$JRPP7NR2uD*A z)YE{0RxMQ*O@hZ{WxN{A;=*!(@TvZU%6)spH21zT5NN{ZzR*r~ulHz5qolb(w*_KG zYZRk%HMVW5@T(@N_Er-xpmt%i@VqusrKe2u0KJW)HNselxvfWjF;lzG>D~JHA&E&h zQlelUU_qT~oVQN;6qy7%qL2oR)lUdvPRrLGIQk39 z167L;@5b2^Dks?yRY6cF2BnBqGromM&qJqvzW+A&*u_ss6I1E(zE+@*&fBouf`QK< z&OoedMyA8>6@*J%Y+klJC%+=&+TPYj{%a|Mcwq(A-mIu~@C522k$*_j*wv%EY}Q8XCfV5m(+tBCN&rgg??uP0)h>IWKP$ucnCb&|(2gca zDh4zKO~og5E~-}GCkvKA*n!HAh86rQ!?Jbb zHFAv{CxllpB6pniQh0>D_z6&BuBCQ4h7gCwSV4hu9W7n>G-yQ*4S0+#CBf#EK)w2)Y zD^u^+$q+2NQ#U=lKIW#Cm>k_t2LOxC(4XF2BbdGtOMJ;_sOjX@KDIYEV@`og;YEnC z{dmxbz0vb!Uccfmyy+h+tKLajV1pxyjT;+T70*!qFRCW=8XVppsY`*(Kdub#?iNoB zL0XRP{Yd*gt7Ucz(K1;Sx}%++Sam+_Rsl?9mqS^jw)G#&nANgpLNZDrmNzLE2Edq|sb10Ba4g^!%O_8r_-8oE)HO7_=|P74 z{X0Ev$KUcZ?#gsbJP&o@^nH6V6Dm`VFHoXFs1Qdc3s;P9XpQP>hy@dov!(lmP3HM5 z+bTNi&ak_X>ij_jkr0~AzO0-SS3Tf_#1D)yo^ zBq`{)JA*rfL6V;}*o+UArePXsK8Z`&yyCq1&spSi0S=ml@vG^w0C;nFKUe{z3hFLr z7?%mm3KqY%H%P1#{NhFPvsvylapb7Tf}{k{vrjpx3Xj*BHeUfYh{lVrN5LV^rGA{V zH`A4t#H-EJKgaHzw!8dK)A{GEM_63=HGT)kg zzo;6*RCbSe!yftOH6h(^*<-qxEUa4HgAP@x%JJ@frs=r9W8OQl_)hkUtJT+rHa8HG zxL=r%!gz3x^C25W=0sh8bK}fHQwZB(#9m>qtHk*qarCnm-+$?}#%0pD%H$l1&`lBY6k+5u( zp80XLP4p)pHz^b%Yz#c?Rx4>cT0CSqq~$p4%DeYhS1rs$Omxo~e3~keADnOJgWW=)ZC_UnFcw886L~IvNavpt>9vnL%a7OBL3=GydXka5)DP@8d2O z5B^FSGy8JW{CwHPql;}e;9>e%!_76NRP&w9YMyvOg)M`m!3vPDMi$QnM)W(6sX9V6 zRMKC>p=?%?Gt@}N`T%dU%%H=rRG2%Uce*Q^&z&yq2)fq6W3fg*Mq1ikl*3L6mMoEB zoN9O9y(u*?DpI9f?H$D}Z5MlRtwCpfOThYV3(-P(`lX$_(EPxzu7UXKD6b5pnQ0SV*M)N1)xn^fz|zG~U^pjDK+W1UY1E#vZ&%->`*hDL zzx7jAxry$}d1{OIhu?NMBu|`w#6^e%N@JC?Bg(q(JAY1Z0gmj3{NiE!XP`N2O2!Gt zV(hN?mgkaO#a0Fh$Zjlu~P$$j9zFw5*(ZXdtS?AGN6yO*ExJ5G~8P#zH zJD_fOD$tG8qrZo_|E!UrhD&CQ5s)IYz_KG6^_0VGrik;m{uqdVhLTtpIbEX&xeYUd zjxp-*<+*_rywN?tEms6yy}fxKRMw69Qd0cm5stt&>D-mg4M;Naw9zIq>av(&lp81- z%WEcW(d0q_8%XpBClV-Io}pl{=<6Y92#@j=pbp0pF!WH5Kl_e~<%d6=@GL{><|nRF zpNW4%WlYtCwa$DQge;dg*I($j2NO#O?s#(f7{zbY14k5WWW}(m5{QRc9ggofBt1xG zWkKM^%?%i(TdFCAX&jp^Ld!J1f0*g(nHXN>XJ3TR97w;lR)S9&;q9m%lc<>W2;J$< zi8{ljr!IX@g+oV=4e`P~vsmf8pCQ9pQ7X>IMxs07y}r=iaax%c^p0D^nTy_8s;+Qq zccqfl-E`BAN?Mun&eE>OrW~qShpG?<-y~SXztFwT$>*0yc?q<(p)(xQ8fJP4b91pH z+tua*k-GM7Zr+RW6kOAo^C49Q;#)Mu*o$~$G5oVt7bU@JI^O}=$^+R%DUba(dJ91Ot|%zjKc z#jnnH9~QHi%^6#FvUhTzvEdIFA7cnMd44i$qKPaGXJ~za-6?{Ono8^lldin_4zZ@0`q4XH8rg?tvH2Cp;=E(=#X%~gi zF+Z2uUrJf2u#UuF&7iUekCD- z?yB@XdVm8y=jjEI?KSa=wo>HAn15y5&w=ve*Zes4z~zs)=-#TujFh>V91ul)QIH#Y zgn_RHB}dp29||5M2`Imh&83i@f`@=%2Cn*sbYOzgFV(@H4bp!{UE1pUWvTFjLBuG& z_>OV;YvdpcO&(WI(J5KFV6OT?c(IZJPK{pA0^?n(&sb@Rn9+$;T*Mxx7z&dYx` z_W19U`1f;y7q%(yx5}Bt*sq+_73;S4e(p6hd115|yE$;1uC4c>f2+p=7XWym9xuX- zZfdvqS-|}*V2Y8yw};P~1^AGH9hk((GV@v^z?|e8ht6i*8WitRe0*5N-}@2B|NOl_ zroM6Pzxru5p8cPZ{=bFtMo4WW(?$wyq|gRNY#`wV5^f;j1`=){;RX_JAmIiQZXn?X l5^f;j|05)HhV5SEpX;bClJgYZ{hQ!na^B)xp|SJB{{ZhPzwQ74 literal 0 HcmV?d00001 diff --git a/src/aare/gui/gui.py b/src/aare/gui/gui.py index 02303885..3e680ea9 100644 --- a/src/aare/gui/gui.py +++ b/src/aare/gui/gui.py @@ -23,7 +23,7 @@ def main(): icon_path = os.path.join(basedir, "graphics/aaregui_logo.svg") # The banner is an SVG now; the old aare_banner.png no longer exists # and yielded a null splash pixmap. - banner_path = os.path.join(basedir, "graphics/aare_banner.svg") + banner_path = os.path.join(basedir, "graphics/aare_banner.png") except Exception: logger.exception("Failed to load resources for splash screen") sys.exit(1) -- 2.54.0 From 869a66ff4b7c51133609ff7f4d5eb8d70fdbf85a Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 13:42:07 +0200 Subject: [PATCH 13/27] fix: send light slider changes from every input path, guard readback Sliders only emitted on sliderReleased, so right-click+wheel, arrow keys and groove clicks changed the value locally without a PUT and the 500 ms status poll snapped it back. setTracking(False) + valueChanged now sends one PUT per deliberate change; readback setValue is wrapped in blockSignals to avoid echoing PUTs, and a 1.5 s grace window stops in-flight stale status responses from bouncing the slider. Co-Authored-By: Claude Fable 5 --- src/aare/gui/panels/illumination_panel.py | 96 ++++++++++++++++++++--- 1 file changed, 85 insertions(+), 11 deletions(-) diff --git a/src/aare/gui/panels/illumination_panel.py b/src/aare/gui/panels/illumination_panel.py index 160d00df..1c8d2dd7 100644 --- a/src/aare/gui/panels/illumination_panel.py +++ b/src/aare/gui/panels/illumination_panel.py @@ -1,9 +1,15 @@ +import time + from aarecommon.models.models import DAQStatusModel from PySide6.QtCore import Qt, Signal, Slot from PySide6.QtWidgets import QGridLayout, QLabel, QSlider, QWidget from aare.gui.widgets.title_label import TitleLabel +# Skip readback updates this long after a user change: a status response already +# in flight when the PUT was queued would otherwise snap the slider back. +READBACK_GRACE_S = 1.5 + class IlluminationPanel(QWidget): front_light = Signal(int) @@ -21,11 +27,18 @@ class IlluminationPanel(QWidget): front_label.setAlignment(Qt.AlignmentFlag.AlignCenter) grid_layout.addWidget(front_label, 1, 0, 1, 2) self.is_sliding = False + self._last_user_change = 0.0 self.front_light_slider = QSlider(orientation=Qt.Orientation.Horizontal, parent=self) self.front_light_slider.setRange(0, 100) + # tracking off: valueChanged fires once per deliberate change (wheel notch, + # key step, groove page-step, drag release). sliderReleased alone missed + # every path except a handle drag, so wheel adjustments were never sent + # and the 500 ms status poll reverted them. + self.front_light_slider.setTracking(False) self.front_light_slider.sliderPressed.connect(self.on_slider_pressed) - self.front_light_slider.sliderReleased.connect(self.on_front_slider_released) + self.front_light_slider.sliderReleased.connect(self.on_slider_released) + self.front_light_slider.valueChanged.connect(self.on_front_value_changed) grid_layout.addWidget(self.front_light_slider, 2, 0, 1, 2) back_label = QLabel("Back light", parent=self) @@ -34,8 +47,10 @@ class IlluminationPanel(QWidget): self.back_light_slider = QSlider(orientation=Qt.Orientation.Horizontal, parent=self) self.back_light_slider.setRange(0, 100) + self.back_light_slider.setTracking(False) self.back_light_slider.sliderPressed.connect(self.on_slider_pressed) - self.back_light_slider.sliderReleased.connect(self.on_back_slider_released) + self.back_light_slider.sliderReleased.connect(self.on_slider_released) + self.back_light_slider.valueChanged.connect(self.on_back_value_changed) grid_layout.addWidget(self.back_light_slider, 4, 0, 1, 2) @Slot() @@ -43,17 +58,76 @@ class IlluminationPanel(QWidget): self.is_sliding = True @Slot() - def on_front_slider_released(self): + def on_slider_released(self): self.is_sliding = False - self.front_light.emit(self.front_light_slider.value()) - @Slot() - def on_back_slider_released(self): - self.is_sliding = False - self.back_light.emit(self.back_light_slider.value()) + @Slot(int) + def on_front_value_changed(self, v: int): + self._last_user_change = time.monotonic() + self.front_light.emit(v) + + @Slot(int) + def on_back_value_changed(self, v: int): + self._last_user_change = time.monotonic() + self.back_light.emit(v) @Slot(DAQStatusModel) def update_daq_status(self, s: DAQStatusModel): - if not self.is_sliding: # Update only if not sliding - self.front_light_slider.setValue(round(s.bl.front_light)) - self.back_light_slider.setValue(round(s.bl.back_light)) + if self.is_sliding or time.monotonic() - self._last_user_change < READBACK_GRACE_S: + return + # blockSignals: readback must not loop back into valueChanged and echo + # a PUT to the server every poll. + for slider, val in ( + (self.front_light_slider, s.bl.front_light), + (self.back_light_slider, s.bl.back_light), + ): + slider.blockSignals(True) + slider.setValue(round(val)) + slider.blockSignals(False) + + +if __name__ == "__main__": + # ponytail: smallest check that fails if the send/readback wiring breaks + import os + from types import SimpleNamespace + + os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") + from PySide6.QtCore import QPoint, QPointF + from PySide6.QtGui import QWheelEvent + from PySide6.QtWidgets import QApplication + + app = QApplication([]) + panel = IlluminationPanel() + sent = [] + panel.front_light.connect(sent.append) + + # wheel notch must emit (was silently discarded before) + panel.front_light_slider.setFocus() + QApplication.sendEvent( + panel.front_light_slider, + QWheelEvent( + QPointF(5, 5), + QPointF(5, 5), + QPoint(0, 0), + QPoint(0, 120), + Qt.MouseButton.RightButton, + Qt.KeyboardModifier.NoModifier, + Qt.ScrollPhase.NoScrollPhase, + False, + ), + ) + assert sent, "wheel adjustment must emit front_light" + + # readback right after a user change must not clobber the slider + held = panel.front_light_slider.value() + status = SimpleNamespace(bl=SimpleNamespace(front_light=90.0, back_light=10.0)) + panel.update_daq_status(status) + assert panel.front_light_slider.value() == held, "grace window must hold user value" + + # after the grace window, readback applies without emitting a PUT + panel._last_user_change = time.monotonic() - READBACK_GRACE_S - 1 + n_sent = len(sent) + panel.update_daq_status(status) + assert panel.front_light_slider.value() == 90, "readback must apply after grace" + assert len(sent) == n_sent, "readback must not echo a PUT" + print("gude") -- 2.54.0 From c5a6a175bddda9acb517acea74ecf93776cae3cb Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 14:35:20 +0200 Subject: [PATCH 14/27] feat: disable Beamline tab when active pgroup is outside token pgroups Switching to a visitor pgroup means running a user experiment: grey out the Beamline tab (tooltip: beamline scientists only), bring the Experiment tab forward with Dataset path and Exp. Config. opened. Gate applies on transitions only so manual tab choices survive the 1 Hz status ticks. Co-Authored-By: Claude Fable 5 --- src/aare/gui/main_window.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index 8963be34..e94cbc2a 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -596,6 +596,9 @@ class MainWindow(QMainWindow): # Tracks beamline-state TRANSITIONS for the default sample-tab switch # (see _apply_default_sample_tab). self._last_beamline_state: BeamlineStateEnum | None = None + # None = not yet evaluated, so the first status tick always applies + # the gate (the GUI may start while a visitor pgroup is active). + self._beamline_tab_gated: bool | None = None # Wrapper for the left inset: QTabWidget ignores its own contents # margins for the tab bar, so the padding lives one level up. Aligns @@ -2578,10 +2581,33 @@ class MainWindow(QMainWindow): else: self.sample_lists_tabs.setCurrentIndex(0) + def _apply_pgroup_gate(self, pgroup: str | None) -> None: + # Switching to a pgroup outside the token's own (admin) pgroups means + # running a visitor's experiment: the Beamline tab is then off-limits, + # and the Experiment tab comes up with Dataset path + Exp. Config. + # open. Applied only on gate TRANSITIONS so a manual tab choice + # survives the 1 Hz status ticks. + gated = pgroup is not None and pgroup not in (self._decoded_token.pgroups or []) + if gated == self._beamline_tab_gated: + return + self._beamline_tab_gated = gated + self.left_column_tabs.setTabEnabled(0, not gated) + self.left_column_tabs.setTabToolTip( + 0, "Only accessible for beamline scientists" if gated else "" + ) + if gated: + self.left_column_tabs.setCurrentIndex(1) + # persist=False: programmatic open must not overwrite the user's + # saved per-panel collapse choice (same rule as the session gate). + for banner in self.data_collection.findChildren(TitleLabel): + if banner.text() in ("Dataset path", "Experiment configuration"): + banner.set_collapsed(False, persist=False) + @Slot(DAQStatusModel) def update_daq_status(self, s: DAQStatusModel): self._latest_daq_status = s self._apply_session_gate(getattr(getattr(s, "session", None), "session", None)) + self._apply_pgroup_gate(getattr(getattr(s, "session", None), "current_pgroup", None)) # Default tab only on state TRANSITIONS — a manual tab choice # survives while the state stays put. -- 2.54.0 From 656b44159322c857ef6f6a2a0623a5e0cbf8792b Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 15:05:42 +0200 Subject: [PATCH 15/27] feat: default beamline state on login by role Staff land in BeamLocation, users in SampleAlignment. One-shot on the first status tick where the GUI owns the session and the beamline is idle, so a running operation or a watch-only GUI is never disturbed. Co-Authored-By: Claude Fable 5 --- src/aare/gui/main_window.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index e94cbc2a..b0a2c1e8 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -173,6 +173,7 @@ class MainWindow(QMainWindow): _default_dock_split_done: bool = False _pre_watch_dock_state: QByteArray | None = None _pre_watch_visibility: list[tuple[QWidget, bool]] | None = None + _login_default_state_sent: bool = False def __init__( self, @@ -2609,6 +2610,18 @@ class MainWindow(QMainWindow): self._apply_session_gate(getattr(getattr(s, "session", None), "session", None)) self._apply_pgroup_gate(getattr(getattr(s, "session", None), "current_pgroup", None)) + # Login default: staff start in BeamLocation, users in SampleAlignment. + # One-shot on the first status tick where this GUI owns the session and + # the beamline is idle — a busy beamline or watch-only GUI must never + # have its state yanked by someone merely logging in. + if not self._login_default_state_sent and self._session_operations_enabled and not s.busy: + self._login_default_state_sent = True + if self._decoded_token.staff: + if s.state != BeamlineStateEnum.BeamLocation: + self.daq.beam_location() + elif s.state != BeamlineStateEnum.SampleAlignment: + self.daq.sample_alignment() + # Default tab only on state TRANSITIONS — a manual tab choice # survives while the state stays put. new_beamline_state = getattr(s, "state", None) -- 2.54.0 From 1bce76e6fcd0c430cee449e82679cc36c946b414 Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 15:05:42 +0200 Subject: [PATCH 16/27] feat: show locked beamline banners to non-staff Beamline setup, ABR meas. pos. and Beam configuration banners stay visible for non-staff instead of vanishing, but are locked stand-ins: clicking one pops the staff-only notice (same pattern as the Auxiliary-puck tab) telling the user to log in as staff or contact their local contact. Co-Authored-By: Claude Fable 5 --- src/aare/gui/main_window.py | 40 ++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index b0a2c1e8..ddf0c036 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -362,6 +362,10 @@ class MainWindow(QMainWindow): beamline_layout = QVBoxLayout(beamline_page) beamline_layout.setContentsMargins(0, 0, 0, 0) self.samcam = SamcamPanel(beamline_page) + # Non-staff keep the staff-only banners visible (locked stand-ins, a + # click explains the gate) so the Beamline tab reads the same for + # every role instead of looking amputated. + self._locked_beamline_banners: list[TitleLabel] = [] if self._decoded_token.staff: self.monochromator_panel = MonochromatorPanel(beamline_page) self.abr_tweak = AbrTweakWidget(beamline_page) @@ -372,6 +376,20 @@ class MainWindow(QMainWindow): beamline_layout.addWidget(self.monochromator_panel) beamline_layout.addWidget(self.abr_tweak) beamline_layout.addWidget(self.beam_config) + else: + for title in ("Beamline setup", "ABR meas. pos.", "Beam configuration"): + # Holder with default layout margins so the banner aligns with + # the real panels' banners (same trick as BeamConfigPanel). + holder = QWidget(beamline_page) + holder_layout = QVBoxLayout(holder) + holder_layout.setSpacing(0) + banner = TitleLabel(title, holder) + banner.setCursor(Qt.CursorShape.PointingHandCursor) + banner.setToolTip("Only accessible for beamline scientists") + banner.installEventFilter(self) + holder_layout.addWidget(banner) + beamline_layout.addWidget(holder) + self._locked_beamline_banners.append(banner) # Samcam last: the beam panels are the ones tweaked most. beamline_layout.addWidget(self.samcam) beamline_layout.addStretch() @@ -403,7 +421,13 @@ class MainWindow(QMainWindow): # Dewar-tabs look: first banner flush under the tab bar (no top # margin) and the tab row starting at the banners' left edge. The # Experiment side needs two levels: the frame AND its first panel. - beamline_first = self.monochromator_panel if self._decoded_token.staff else self.samcam + beamline_first = ( + self.monochromator_panel + if self._decoded_token.staff + # Non-staff: the first locked banner's holder is the column's + # first widget now, not samcam. + else self._locked_beamline_banners[0].parentWidget() + ) for first in (beamline_first, self.data_collection, self.data_collection.file_path_panel): first_layout = first.layout() assert first_layout is not None # panels build their layouts in __init__ @@ -1391,6 +1415,15 @@ class MainWindow(QMainWindow): "The Auxiliary puck (reference tools) view is available to staff accounts only.", ) + def _show_beamline_staff_only_popup(self) -> None: + QMessageBox.information( + self, + "Staff only", + "Beamline configuration is available to staff accounts only.\n" + "Log in with a staff account or contact your local contact " + "to configure the beamline.", + ) + @Slot() def _raise_reference_tools(self) -> None: if not self._decoded_token.staff: @@ -3182,6 +3215,11 @@ class MainWindow(QMainWindow): ): self._show_reference_tools_staff_only_popup() return True + # Non-staff click on a locked Beamline banner: same treatment as the + # Auxiliary-puck tab — explain the gate instead of eating the click. + if event.type() == QEvent.Type.MouseButtonPress and obj in self._locked_beamline_banners: + self._show_beamline_staff_only_popup() + return True return super().eventFilter(obj, event) def _start_remote_close_countdown( -- 2.54.0 From 75d7bed380b8ababd876b86335079648ca05b51e Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 15:05:42 +0200 Subject: [PATCH 17/27] chore: rename Beamline Setup to Beamline setup, comment tweaks Panel title case now matches the other banner names. Also clarify the splash banner comment in gui.py. Co-Authored-By: Claude Fable 5 --- src/aare/gui/gui.py | 3 +-- src/aare/gui/main_window.py | 4 ++-- src/aare/gui/panels/data_collection_settings.py | 4 ++-- src/aare/gui/panels/monochromator_panel.py | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/aare/gui/gui.py b/src/aare/gui/gui.py index 3e680ea9..1b1fb78f 100644 --- a/src/aare/gui/gui.py +++ b/src/aare/gui/gui.py @@ -21,8 +21,7 @@ def main(): try: basedir = os.path.dirname(__file__) icon_path = os.path.join(basedir, "graphics/aaregui_logo.svg") - # The banner is an SVG now; the old aare_banner.png no longer exists - # and yielded a null splash pixmap. + # SVG looks strange on consoles...only show one line banner_path = os.path.join(basedir, "graphics/aare_banner.png") except Exception: logger.exception("Failed to load resources for splash screen") diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index ddf0c036..b6090f42 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -953,8 +953,8 @@ class MainWindow(QMainWindow): self.beamline.illumination_panel.front_light.connect(self.daq.front_light) self.beamline.illumination_panel.back_light.connect(self.daq.back_light) - # Energy row inside Exp. Config. — not staff-gated like the Beamline - # Setup copy; the server enforces write permission anyway. + # Energy row inside Exp. Config. — not staff-gated like the + # Beamline setup copy; the server enforces write permission anyway. self.data_collection.change_energy.connect(self.daq.change_energy) if self._decoded_token.staff: diff --git a/src/aare/gui/panels/data_collection_settings.py b/src/aare/gui/panels/data_collection_settings.py index ecd2282e..e501dc45 100644 --- a/src/aare/gui/panels/data_collection_settings.py +++ b/src/aare/gui/panels/data_collection_settings.py @@ -28,7 +28,7 @@ from aare.gui.widgets.title_label import TitleLabel, tighten_column class DataCollectionSettings(QFrame): cancel = Signal() - # Same convention as the Beamline Setup panel: keV in the GUI, eV on emit. + # Same convention as the Beamline setup panel: keV in the GUI, eV on emit. change_energy = Signal(float) set_width = 400 @@ -85,7 +85,7 @@ class DataCollectionSettings(QFrame): centering_layout.addWidget(self.find_tip) centering_layout.addWidget(self.bounding_box) - # Energy row copied from the Beamline Setup panel so users can change + # Energy row copied from the Beamline setup panel so users can change # energy without leaving the experiment configuration. self.energy_spin = QDoubleSpinBox(parent=self) self.energy_spin.setDecimals(3) diff --git a/src/aare/gui/panels/monochromator_panel.py b/src/aare/gui/panels/monochromator_panel.py index e94224eb..4f669893 100644 --- a/src/aare/gui/panels/monochromator_panel.py +++ b/src/aare/gui/panels/monochromator_panel.py @@ -16,7 +16,7 @@ class MonochromatorPanel(QWidget): grid_layout = QGridLayout(self) grid_layout.addWidget( TitleLabel( - "Beamline Setup", self, collapsible=True, default_collapsed=False + "Beamline setup", self, collapsible=True, default_collapsed=False ), 0, 0, -- 2.54.0 From 69d552c0683a1c7b7768c9491b78130cf52a1330 Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 15:15:23 +0200 Subject: [PATCH 18/27] fix: busy flag in Axis views as plain status text, not a badge Gonio camera, Beamline view and the combined view showed BEAMLINE BUSY in the rounded badge pill, which reads as a clickable button. These views are passive, so draw the same shadowed colored text the sample camera uses for its warnings; the pill stays only on the sample-camera session badges, which really are click targets. Co-Authored-By: Claude Fable 5 --- src/aare/gui/widgets/busy_overlay.py | 25 +++++++++++++++++++++++++ src/aare/gui/widgets/video_image.py | 8 ++++---- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/aare/gui/widgets/busy_overlay.py b/src/aare/gui/widgets/busy_overlay.py index e41604f6..235684f8 100644 --- a/src/aare/gui/widgets/busy_overlay.py +++ b/src/aare/gui/widgets/busy_overlay.py @@ -23,6 +23,7 @@ from aare.gui.styles import ( BUSY_YELLOW_BORDER, BUSY_YELLOW_DOT, BUSY_YELLOW_TEXT_DARK, + SHADOW, WHITE, qcolor, ) @@ -99,6 +100,30 @@ def draw_busy_badge( return bg_rect +def draw_busy_status_text( + painter: QPainter, + viewport_width: int, + viewport_height: int, + style: BusyOverlayStyle, +) -> None: + """Non-clickable busy status for the passive Axis views: solid colored + text with a 1px shadow, no badge box — the pill read as a button (same + look as the sample camera's own warning text). Same position/typeface as + draw_busy_badge so the message reads identically everywhere.""" + font = QFont() + font.setPointSize(24) + font.setBold(True) + font_metrics = QFontMetrics(font) + painter.setFont(font) + + x = (viewport_width - font_metrics.horizontalAdvance(style.text)) // 2 + baseline = int(viewport_height * 0.68) + font_metrics.ascent() // 2 + painter.setPen(QPen(qcolor(SHADOW, 200))) + painter.drawText(QPoint(x + 1, baseline + 1), style.text) + painter.setPen(QPen(qcolor(style.badge_bg))) + painter.drawText(QPoint(x, baseline), style.text) + + def build_busy_overlay_style( *, is_busy: bool, diff --git a/src/aare/gui/widgets/video_image.py b/src/aare/gui/widgets/video_image.py index bfbb52af..263433a5 100644 --- a/src/aare/gui/widgets/video_image.py +++ b/src/aare/gui/widgets/video_image.py @@ -2,7 +2,7 @@ from PySide6.QtCore import QRectF, Qt, Slot from PySide6.QtGui import QImage, QPainter, QPixmap from PySide6.QtWidgets import QGraphicsPixmapItem, QGraphicsScene, QGraphicsView -from aare.gui.widgets.busy_overlay import BusyOverlayStyle, draw_busy_badge +from aare.gui.widgets.busy_overlay import BusyOverlayStyle, draw_busy_status_text class VideoGraphicsView(QGraphicsView): @@ -114,9 +114,9 @@ class VideoGraphicsView(QGraphicsView): painter.save() painter.resetTransform() painter.setRenderHint(QPainter.RenderHint.Antialiasing, True) - # Shared renderer with the sample camera, so every view shows the - # identical badge (this view used to draw its own dot+text variant). - draw_busy_badge( + # Plain shadowed text like the sample camera's warnings, not the + # badge pill: these views are passive and the pill read as a button. + draw_busy_status_text( painter, self.viewport().width(), self.viewport().height(), self._busy_overlay_style ) painter.restore() -- 2.54.0 From d659f0500934e462ea195d09d7234fe1213a659a Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 15:42:00 +0200 Subject: [PATCH 19/27] fix: grey out whole state strip while beamline is busy Busy now empties the available-target set exactly like Moving, so no entry looks clickable and no transition can be posted mid-operation (same guard the status-bar menu already had). The current/pending entry keeps its highlight as orientation. Co-Authored-By: Claude Fable 5 --- src/aare/gui/panels/beamline_state_panel.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/aare/gui/panels/beamline_state_panel.py b/src/aare/gui/panels/beamline_state_panel.py index 50536ad8..0719ded7 100644 --- a/src/aare/gui/panels/beamline_state_panel.py +++ b/src/aare/gui/panels/beamline_state_panel.py @@ -132,6 +132,7 @@ class BeamlineStatePanel(QFrame): self._current_state: BeamlineStateEnum | None = None self._hovered_state: BeamlineStateEnum | None = None self._pending_target_state: BeamlineStateEnum | None = None + self._busy = False # After 3 s of hovering an unavailable state, explain which states # it can be reached from. @@ -238,7 +239,9 @@ class BeamlineStatePanel(QFrame): def _available_targets(self) -> frozenset[BeamlineStateEnum]: current = self._current_state - if current is None or current == BeamlineStateEnum.Moving: + # Busy greys the whole strip like Moving does: a transition posted + # mid-operation would clobber it (same guard as the status-bar menu). + if self._busy or current is None or current == BeamlineStateEnum.Moving: return frozenset() # Reachable in one step: the route graph plus the status-bar # shortcut transitions. @@ -399,4 +402,7 @@ class BeamlineStatePanel(QFrame): self._apply_highlight() def update_daq_status(self, status: DAQStatusModel) -> None: + self._busy = bool(status.busy) + # set_current_state re-applies the highlight, so a busy flip + # restyles the strip on the same tick even if the state held. self.set_current_state(status.state) -- 2.54.0 From 58bde9379bd09b6c22bf0409b829894b753e59c9 Mon Sep 17 00:00:00 2001 From: Dawn Date: Thu, 13 Aug 2026 15:42:00 +0200 Subject: [PATCH 20/27] feat: switch to Beamline combined view while busy Generalize the robot-mount auto-switch: any busy period now brings up the combined view so the motion can be watched, and the sample camera returns when busy clears. Edge-triggered, so manual tab choices survive between transitions; _mounting renamed to _watching_motion. Co-Authored-By: Claude Fable 5 --- src/aare/gui/main_window.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index b6090f42..183934e1 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -199,7 +199,7 @@ class MainWindow(QMainWindow): self._base_url = base_url self._token = token - self._mounting = False + self._watching_motion = False self._samcam_feed_banner_active = False self._samcam_feed_banner_message = "Sample camera feed unavailable" @@ -2707,11 +2707,16 @@ class MainWindow(QMainWindow): if self._remote_close_deadline_ts is not None: self._clear_remote_close_request() - if not self._mounting and s.state == BeamlineStateEnum.RobotSampleExchange: - self._mounting = True + # Busy (or the robot station) means something is physically moving: + # show the Beamline combined view so the motion can be watched, and + # return to the sample camera once it is done. Edge-triggered so a + # manual tab choice survives between transitions. + moving = bool(s.busy) or s.state == BeamlineStateEnum.RobotSampleExchange + if moving and not self._watching_motion: + self._watching_motion = True self.video_tab.setCurrentWidget(self.beamline_combined_panel) - elif self._mounting and s.state != BeamlineStateEnum.RobotSampleExchange: - self._mounting = False + elif not moving and self._watching_motion: + self._watching_motion = False self.video_tab.setCurrentWidget(self.sample_camera) # ========== BATON DIALOG HANDLING ========== -- 2.54.0 From b4896105ab529e62374f6f11b0424a8cc54c7d30 Mon Sep 17 00:00:00 2001 From: Dawn Date: Fri, 14 Aug 2026 07:23:20 +0200 Subject: [PATCH 21/27] chore: satisfy ruff format and SIM201 lint ruff format collapsed lines the Beamline setup rename and other edits left splittable; SIM201 wanted != over 'not ... ==' in the prediction subscriber's JSON sniff. Co-Authored-By: Claude Fable 5 --- src/aare/gui/panels/monochromator_panel.py | 4 +--- src/aare/gui/panels/smargon_panel.py | 4 +--- src/aare/gui/threads/prediction_subscriber.py | 2 +- src/aare/gui/widgets/busy_overlay.py | 5 +---- src/aare/gui/widgets/camera_image.py | 5 +---- 5 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/aare/gui/panels/monochromator_panel.py b/src/aare/gui/panels/monochromator_panel.py index 4f669893..6e2efb8e 100644 --- a/src/aare/gui/panels/monochromator_panel.py +++ b/src/aare/gui/panels/monochromator_panel.py @@ -15,9 +15,7 @@ class MonochromatorPanel(QWidget): grid_layout = QGridLayout(self) grid_layout.addWidget( - TitleLabel( - "Beamline setup", self, collapsible=True, default_collapsed=False - ), + TitleLabel("Beamline setup", self, collapsible=True, default_collapsed=False), 0, 0, 1, diff --git a/src/aare/gui/panels/smargon_panel.py b/src/aare/gui/panels/smargon_panel.py index dd7fb0ca..3b1ae2a4 100644 --- a/src/aare/gui/panels/smargon_panel.py +++ b/src/aare/gui/panels/smargon_panel.py @@ -111,9 +111,7 @@ class SmargonPanel(QWidget): @Slot(dict) def _move_axes(self, targets: dict): # only the staged axes move — absent keys stay None (no motion) - self.smargon.emit( - SmargonCoordinate(chi_deg=targets.get("chi"), phi_deg=targets.get("phi")) - ) + self.smargon.emit(SmargonCoordinate(chi_deg=targets.get("chi"), phi_deg=targets.get("phi"))) @Slot(DAQStatusModel) def update_daq_status(self, s: DAQStatusModel): diff --git a/src/aare/gui/threads/prediction_subscriber.py b/src/aare/gui/threads/prediction_subscriber.py index 29fe7876..85b5a24f 100644 --- a/src/aare/gui/threads/prediction_subscriber.py +++ b/src/aare/gui/threads/prediction_subscriber.py @@ -89,7 +89,7 @@ class PredictionSubscriber(QThread): def _try_parse_json(self, part: bytes) -> dict | None: # Binary frames (JPEG starts with 0xff) are not JSON; decoding them as # utf-8 raises UnicodeDecodeError on every frame. Cheap sniff instead. - if not part.lstrip()[:1] == b"{": + if part.lstrip()[:1] != b"{": return None try: decoded = json.loads(part.decode("utf-8")) diff --git a/src/aare/gui/widgets/busy_overlay.py b/src/aare/gui/widgets/busy_overlay.py index 235684f8..ca67a0aa 100644 --- a/src/aare/gui/widgets/busy_overlay.py +++ b/src/aare/gui/widgets/busy_overlay.py @@ -101,10 +101,7 @@ def draw_busy_badge( def draw_busy_status_text( - painter: QPainter, - viewport_width: int, - viewport_height: int, - style: BusyOverlayStyle, + painter: QPainter, viewport_width: int, viewport_height: int, style: BusyOverlayStyle ) -> None: """Non-clickable busy status for the passive Axis views: solid colored text with a 1px shadow, no badge box — the pill read as a button (same diff --git a/src/aare/gui/widgets/camera_image.py b/src/aare/gui/widgets/camera_image.py index 7895aa88..f58f2528 100644 --- a/src/aare/gui/widgets/camera_image.py +++ b/src/aare/gui/widgets/camera_image.py @@ -1166,10 +1166,7 @@ class SampleCameraImageLabel(QGraphicsView): painter.setPen(QPen(qcolor(LEGEND_TEXT), 1)) painter.drawText(QPointF(bg_rect.left() + padding, y + fm.ascent()), more_text) self._help_more_rect = QRectF( - bg_rect.left() + padding, - y, - fm.horizontalAdvance(more_text), - line_height, + bg_rect.left() + padding, y, fm.horizontalAdvance(more_text), line_height ) painter.restore() -- 2.54.0 From 5871c959e22f9399430195ba2a1d41b9dc16c662 Mon Sep 17 00:00:00 2001 From: Dawn Date: Fri, 14 Aug 2026 08:52:01 +0200 Subject: [PATCH 22/27] fix: clear basedpyright diff violations Rename NumberLineEdit.validator to range_validator: the instance attr shadowed QLineEdit.validator() and broke type checking at call sites. Annotate the smargon _move_axes dict and cast the stand-in self in the prediction subscriber test. Co-Authored-By: Claude Fable 5 --- src/aare/gui/panels/smargon_panel.py | 2 +- src/aare/gui/widgets/motor_move_group.py | 4 ++-- src/aare/gui/widgets/number_line_edit.py | 16 +++++++++------- tests/unit/gui/test_prediction_subscriber.py | 7 +++++-- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/aare/gui/panels/smargon_panel.py b/src/aare/gui/panels/smargon_panel.py index 3b1ae2a4..462030e0 100644 --- a/src/aare/gui/panels/smargon_panel.py +++ b/src/aare/gui/panels/smargon_panel.py @@ -109,7 +109,7 @@ class SmargonPanel(QWidget): self.smargon.emit(SmargonCoordinate(sh_mm=Coordinate(x=0, y=0, z=18), phi_deg=0, chi_deg=0)) @Slot(dict) - def _move_axes(self, targets: dict): + def _move_axes(self, targets: dict[str, float]): # only the staged axes move — absent keys stay None (no motion) self.smargon.emit(SmargonCoordinate(chi_deg=targets.get("chi"), phi_deg=targets.get("phi"))) diff --git a/src/aare/gui/widgets/motor_move_group.py b/src/aare/gui/widgets/motor_move_group.py index f04fcb91..2013d110 100644 --- a/src/aare/gui/widgets/motor_move_group.py +++ b/src/aare/gui/widgets/motor_move_group.py @@ -72,7 +72,7 @@ class MotorMoveGroup(QObject): # incomplete entry ("", "-", "1e"): stay/become pending, no tips self._set_state(name, "pending") return - top = box.validator.top() + top = box.range_validator.top() if value > top: QToolTip.showText( box.mapToGlobal(QPoint(0, box.height())), @@ -96,7 +96,7 @@ class MotorMoveGroup(QObject): value = float(box.text()) except ValueError: break - bottom = box.validator.bottom() + bottom = box.range_validator.bottom() if value < bottom: QToolTip.showText( box.mapToGlobal(QPoint(0, box.height())), diff --git a/src/aare/gui/widgets/number_line_edit.py b/src/aare/gui/widgets/number_line_edit.py index 98f22441..3a0de0db 100644 --- a/src/aare/gui/widgets/number_line_edit.py +++ b/src/aare/gui/widgets/number_line_edit.py @@ -17,12 +17,14 @@ class NumberLineEdit(QLineEdit): self._read_only: bool = False self._is_valid: bool = True - # Use a QDoubleValidator to only allow valid floating point numbers - self.validator = QDoubleValidator() - self.validator.setNotation(QDoubleValidator.Notation.StandardNotation) + # Use a QDoubleValidator to only allow valid floating point numbers. + # Named range_validator: plain "validator" would shadow + # QLineEdit.validator() and break type checking at call sites. + self.range_validator = QDoubleValidator() + self.range_validator.setNotation(QDoubleValidator.Notation.StandardNotation) self.decimal_count = decimals - self.validator.setRange(min_val, max_val, self.decimal_count) - self.setValidator(self.validator) + self.range_validator.setRange(min_val, max_val, self.decimal_count) + self.setValidator(self.range_validator) self.setAlignment(Qt.AlignmentFlag.AlignRight) self.setToolTip( f"Minimum: {self.to_string(min_val):s}\nMaximum: {self.to_string(max_val):s}" @@ -80,13 +82,13 @@ class NumberLineEdit(QLineEdit): @Slot(float, float) def update_limits(self, min_val: float, max_val: float): - self.validator.setRange(min_val, max_val, self.decimal_count) + self.range_validator.setRange(min_val, max_val, self.decimal_count) self.setToolTip( f"Minimum: {self.to_string(min_val):s}\nMaximum: {self.to_string(max_val):s}" ) def validate(self, text) -> bool: - return self.validator.validate(str(text), 0)[0] == QDoubleValidator.State.Acceptable + return self.range_validator.validate(str(text), 0)[0] == QDoubleValidator.State.Acceptable def setReadOnly(self, ro: bool): # Colors follow via the QSS :read-only pseudo-class (updates without diff --git a/tests/unit/gui/test_prediction_subscriber.py b/tests/unit/gui/test_prediction_subscriber.py index 6617ba55..c57552fb 100644 --- a/tests/unit/gui/test_prediction_subscriber.py +++ b/tests/unit/gui/test_prediction_subscriber.py @@ -2,13 +2,16 @@ byte) must be rejected without attempting utf-8 decode (previously raised UnicodeDecodeError on every frame).""" +from typing import cast + from aare.gui.threads.prediction_subscriber import PredictionSubscriber def _parse(part: bytes): # Called unbound: _try_parse_json touches no instance state, so no - # QThread/zmq construction is needed. - return PredictionSubscriber._try_parse_json(object(), part) + # QThread/zmq construction is needed. cast keeps basedpyright happy + # about the stand-in self. + return PredictionSubscriber._try_parse_json(cast(PredictionSubscriber, object()), part) def test_binary_jpeg_frame_is_not_json(): -- 2.54.0 From 16e112f44a4eac6024e94d359c17a9704e78a2a8 Mon Sep 17 00:00:00 2001 From: Dawn Date: Fri, 14 Aug 2026 08:52:01 +0200 Subject: [PATCH 23/27] test: lift diff coverage over the 80 percent gate Promote the illumination panel's __main__ self-check to a real pytest file so CI counts it, add busy-overlay render checks (status text paints, video view routes through it), and cover the motor group's incomplete-entry and below-min Enter paths. Local diff coverage from the gui suite alone: 82 percent. Co-Authored-By: Claude Fable 5 --- src/aare/gui/panels/illumination_panel.py | 47 ------------- tests/unit/gui/test_busy_overlay.py | 36 ++++++++++ tests/unit/gui/test_illumination_panel.py | 80 +++++++++++++++++++++++ tests/unit/gui/test_motor_move_group.py | 19 ++++++ 4 files changed, 135 insertions(+), 47 deletions(-) create mode 100644 tests/unit/gui/test_busy_overlay.py create mode 100644 tests/unit/gui/test_illumination_panel.py diff --git a/src/aare/gui/panels/illumination_panel.py b/src/aare/gui/panels/illumination_panel.py index 1c8d2dd7..d96bcbc6 100644 --- a/src/aare/gui/panels/illumination_panel.py +++ b/src/aare/gui/panels/illumination_panel.py @@ -84,50 +84,3 @@ class IlluminationPanel(QWidget): slider.blockSignals(True) slider.setValue(round(val)) slider.blockSignals(False) - - -if __name__ == "__main__": - # ponytail: smallest check that fails if the send/readback wiring breaks - import os - from types import SimpleNamespace - - os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") - from PySide6.QtCore import QPoint, QPointF - from PySide6.QtGui import QWheelEvent - from PySide6.QtWidgets import QApplication - - app = QApplication([]) - panel = IlluminationPanel() - sent = [] - panel.front_light.connect(sent.append) - - # wheel notch must emit (was silently discarded before) - panel.front_light_slider.setFocus() - QApplication.sendEvent( - panel.front_light_slider, - QWheelEvent( - QPointF(5, 5), - QPointF(5, 5), - QPoint(0, 0), - QPoint(0, 120), - Qt.MouseButton.RightButton, - Qt.KeyboardModifier.NoModifier, - Qt.ScrollPhase.NoScrollPhase, - False, - ), - ) - assert sent, "wheel adjustment must emit front_light" - - # readback right after a user change must not clobber the slider - held = panel.front_light_slider.value() - status = SimpleNamespace(bl=SimpleNamespace(front_light=90.0, back_light=10.0)) - panel.update_daq_status(status) - assert panel.front_light_slider.value() == held, "grace window must hold user value" - - # after the grace window, readback applies without emitting a PUT - panel._last_user_change = time.monotonic() - READBACK_GRACE_S - 1 - n_sent = len(sent) - panel.update_daq_status(status) - assert panel.front_light_slider.value() == 90, "readback must apply after grace" - assert len(sent) == n_sent, "readback must not echo a PUT" - print("gude") diff --git a/tests/unit/gui/test_busy_overlay.py b/tests/unit/gui/test_busy_overlay.py new file mode 100644 index 00000000..2b83d71c --- /dev/null +++ b/tests/unit/gui/test_busy_overlay.py @@ -0,0 +1,36 @@ +"""The Axis views' busy flag is a passive status: plain shadowed text, not +the badge pill (which reads as a button). These checks fail if the text +renderer stops painting or the video view stops routing through it.""" + +from PySide6.QtCore import Qt +from PySide6.QtGui import QPainter, QPixmap + +from aare.gui.widgets.busy_overlay import build_busy_overlay_style, draw_busy_status_text +from aare.gui.widgets.video_image import VideoGraphicsView + + +def _busy_style(): + style = build_busy_overlay_style(is_busy=True, tell_state=None) + assert style is not None and style.text == "BEAMLINE BUSY" + return style + + +def test_status_text_paints_something(qapp): + pixmap = QPixmap(400, 300) + pixmap.fill(Qt.GlobalColor.black) + blank = pixmap.toImage() + painter = QPainter(pixmap) + draw_busy_status_text(painter, 400, 300, _busy_style()) + painter.end() + assert pixmap.toImage() != blank, "busy text must actually paint" + + +def test_video_view_paints_busy_text(qtbot): + view = VideoGraphicsView() + qtbot.addWidget(view) + view.resize(400, 300) + idle = view.grab().toImage() + view.set_busy_overlay_style(_busy_style()) + assert view.grab().toImage() != idle, "busy style must change the rendered view" + view.set_busy_overlay_style(None) + assert view.grab().toImage() == idle, "clearing the style must restore the view" diff --git a/tests/unit/gui/test_illumination_panel.py b/tests/unit/gui/test_illumination_panel.py new file mode 100644 index 00000000..897509cb --- /dev/null +++ b/tests/unit/gui/test_illumination_panel.py @@ -0,0 +1,80 @@ +"""Send/readback wiring for the light sliders (was a __main__ self-check in +the panel; promoted here so CI counts it). Every deliberate input path must +emit, and the status-poll readback must neither clobber a fresh user change +nor echo a PUT back to the server.""" + +import time +from types import SimpleNamespace + +import pytest +from PySide6.QtCore import QPoint, QPointF, Qt +from PySide6.QtGui import QWheelEvent +from PySide6.QtWidgets import QApplication + +from aare.gui.panels.illumination_panel import READBACK_GRACE_S, IlluminationPanel + + +@pytest.fixture +def panel(qtbot): + panel = IlluminationPanel() + qtbot.addWidget(panel) + return panel + + +def _wheel_notch(slider): + # One wheel notch; sliderReleased never fires for this path, which is + # exactly the case the valueChanged wiring exists for. + QApplication.sendEvent( + slider, + QWheelEvent( + QPointF(5, 5), + QPointF(5, 5), + QPoint(0, 0), + QPoint(0, 120), + Qt.MouseButton.NoButton, + Qt.KeyboardModifier.NoModifier, + Qt.ScrollPhase.NoScrollPhase, + False, + ), + ) + + +def _status(front=90.0, back=10.0): + return SimpleNamespace(bl=SimpleNamespace(front_light=front, back_light=back)) + + +def test_wheel_notch_emits_both_lights(panel): + front, back = [], [] + panel.front_light.connect(front.append) + panel.back_light.connect(back.append) + _wheel_notch(panel.front_light_slider) + _wheel_notch(panel.back_light_slider) + assert front, "wheel adjustment must emit front_light" + assert back, "wheel adjustment must emit back_light" + + +def test_readback_grace_holds_user_value(panel): + _wheel_notch(panel.front_light_slider) + held = panel.front_light_slider.value() + panel.update_daq_status(_status()) + assert panel.front_light_slider.value() == held, "grace window must hold user value" + + +def test_readback_applies_after_grace_without_echo(panel): + sent = [] + panel.front_light.connect(sent.append) + panel._last_user_change = time.monotonic() - READBACK_GRACE_S - 1 + panel.update_daq_status(_status()) + assert panel.front_light_slider.value() == 90, "readback must apply after grace" + assert panel.back_light_slider.value() == 10 + assert not sent, "readback must not echo a PUT" + + +def test_readback_skipped_while_sliding(panel): + panel.on_slider_pressed() + panel._last_user_change = 0.0 + panel.update_daq_status(_status(front=55.0)) + assert panel.front_light_slider.value() != 55 + panel.on_slider_released() + panel.update_daq_status(_status(front=55.0)) + assert panel.front_light_slider.value() == 55 diff --git a/tests/unit/gui/test_motor_move_group.py b/tests/unit/gui/test_motor_move_group.py index daf08375..20143fd8 100644 --- a/tests/unit/gui/test_motor_move_group.py +++ b/tests/unit/gui/test_motor_move_group.py @@ -3,6 +3,7 @@ targets are staged (orange), sent only by the Move button (green), and the box returns to neutral when the motor actually arrives.""" import pytest +from PySide6.QtCore import Qt from aare.gui.widgets.motor_move_group import MotorMoveGroup from aare.gui.widgets.number_line_edit import NumberLineEdit @@ -65,3 +66,21 @@ def test_over_max_is_invalid_and_never_sent(chi, qtbot): group.button.click() assert not sent # out-of-range target is never applied assert box.property("movestate") == "pending" + + +def test_incomplete_entry_stays_pending(chi, qtbot): + _group, box = chi + _type(qtbot, box, "-") # not a number (yet): no tips, no crash + assert box.property("movestate") == "pending" + # Enter on the incomplete text must be swallowed just as quietly + qtbot.keyClick(box, Qt.Key.Key_Return) + assert box.property("movestate") == "pending" + + +def test_below_min_enter_hints_but_never_sends(chi, qtbot): + group, box = chi + sent = [] + group.applied.connect(sent.append) + _type(qtbot, box, "-5") # below the -0.2 bottom + qtbot.keyClick(box, Qt.Key.Key_Return) # triggers the min-value tooltip path + assert not sent # Enter must never start a move -- 2.54.0 From 6c720d29d328563ca186be6af71e17c458ce824e Mon Sep 17 00:00:00 2001 From: Dawn Date: Fri, 14 Aug 2026 09:20:44 +0200 Subject: [PATCH 24/27] fix: explain gated Beamline tab clicks; drop login state POST Two changes folded together because they touch the same status path: - Revert the login-default state POST: a state transition can move motors, and merely opening the GUI must never move hardware. The GUI now adopts whatever state the server reports. - A click on the pgroup-gated (disabled) Beamline tab used to be eaten silently by the tab bar. An event filter now pops the explanation: visitor-pgroup wording for staff, the staff-only message for users (same pattern as the Auxiliary-puck tab). Co-Authored-By: Claude Fable 5 --- src/aare/gui/main_window.py | 45 +++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index 183934e1..41ed7607 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -173,7 +173,6 @@ class MainWindow(QMainWindow): _default_dock_split_done: bool = False _pre_watch_dock_state: QByteArray | None = None _pre_watch_visibility: list[tuple[QWidget, bool]] | None = None - _login_default_state_sent: bool = False def __init__( self, @@ -404,6 +403,10 @@ class MainWindow(QMainWindow): self.left_column_tabs.addTab(beamline_page, "Beamline") self.left_column_tabs.addTab(experiment_page, "Experiment") + # A click on the pgroup-gated (disabled) Beamline tab is otherwise + # eaten silently by the tab bar — the filter pops the explanation + # instead (same pattern as the Auxiliary-puck tab). + self.left_column_tabs.tabBar().installEventFilter(self) # Only the visible page counts toward the height — same trick as the # content stack below, else the taller page pads the other tab. @@ -1424,6 +1427,20 @@ class MainWindow(QMainWindow): "to configure the beamline.", ) + def _show_beamline_tab_gated_popup(self) -> None: + # The tab is only ever disabled by the pgroup gate; staff hitting it + # are running a visitor's pgroup, users simply lack the rights. + if self._decoded_token.staff: + QMessageBox.information( + self, + "Beamline tab disabled", + "The active pgroup is not one of yours, so the Beamline tab " + "is disabled while running a visitor's experiment. Switch " + "back to your own pgroup to configure the beamline.", + ) + else: + self._show_beamline_staff_only_popup() + @Slot() def _raise_reference_tools(self) -> None: if not self._decoded_token.staff: @@ -2643,17 +2660,9 @@ class MainWindow(QMainWindow): self._apply_session_gate(getattr(getattr(s, "session", None), "session", None)) self._apply_pgroup_gate(getattr(getattr(s, "session", None), "current_pgroup", None)) - # Login default: staff start in BeamLocation, users in SampleAlignment. - # One-shot on the first status tick where this GUI owns the session and - # the beamline is idle — a busy beamline or watch-only GUI must never - # have its state yanked by someone merely logging in. - if not self._login_default_state_sent and self._session_operations_enabled and not s.busy: - self._login_default_state_sent = True - if self._decoded_token.staff: - if s.state != BeamlineStateEnum.BeamLocation: - self.daq.beam_location() - elif s.state != BeamlineStateEnum.SampleAlignment: - self.daq.sample_alignment() + # No login-default state: the GUI adopts whatever state the server + # reports and never posts a transition on startup — a state POST can + # move motors, and merely logging in must not move hardware. # Default tab only on state TRANSITIONS — a manual tab choice # survives while the state stays put. @@ -3225,6 +3234,18 @@ class MainWindow(QMainWindow): if event.type() == QEvent.Type.MouseButtonPress and obj in self._locked_beamline_banners: self._show_beamline_staff_only_popup() return True + # Click on the pgroup-gated (disabled) Beamline tab: tabAt() is + # geometric, so it still sees the disabled tab under the cursor. + left_tab_bar = self.left_column_tabs.tabBar() + if ( + event.type() == QEvent.Type.MouseButtonPress + and left_tab_bar is not None + and obj is left_tab_bar + and left_tab_bar.tabAt(event.position().toPoint()) == 0 + and not self.left_column_tabs.isTabEnabled(0) + ): + self._show_beamline_tab_gated_popup() + return True return super().eventFilter(obj, event) def _start_remote_close_countdown( -- 2.54.0 From aa6c226103401234b371f26727c5b544aa686329 Mon Sep 17 00:00:00 2001 From: Dawn Date: Fri, 14 Aug 2026 09:20:44 +0200 Subject: [PATCH 25/27] test: cover every changed line in the branch diff Diff coverage vs main now 100 percent from the gui suite alone: non-staff locked banners and both gated-tab popups, remote-close bookkeeping in update_daq_status, smargon staged moves, camera More link and Alt-wheel axis fallback, number box relimits, energy row emit, and the gui.main() banner/graceful-exit path. Co-Authored-By: Claude Fable 5 --- tests/unit/gui/test_camera_image.py | 49 +++++++++++ tests/unit/gui/test_gui_entry.py | 23 +++++ tests/unit/gui/test_main_window.py | 107 +++++++++++++++++++++++- tests/unit/gui/test_motor_move_group.py | 8 ++ tests/unit/gui/test_panels.py | 18 ++++ 5 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 tests/unit/gui/test_gui_entry.py diff --git a/tests/unit/gui/test_camera_image.py b/tests/unit/gui/test_camera_image.py index 3dd977f0..a5836b95 100644 --- a/tests/unit/gui/test_camera_image.py +++ b/tests/unit/gui/test_camera_image.py @@ -160,3 +160,52 @@ def test_vacant_badge_hover_click_and_theme(camera, qtbot): with qtbot.waitSignal(camera.session_badge_clicked, timeout=1000): qtbot.mouseClick(camera.viewport(), Qt.MouseButton.LeftButton, pos=badge.center()) + + +def test_help_more_link_opens_full_dialog(camera, qtbot): + camera.grab() # paint records the "?" badge hit rect + badge = camera._help_hit_rect + qtbot.mouseClick(camera.viewport(), Qt.MouseButton.LeftButton, pos=badge.center().toPoint()) + assert camera._help_expanded + camera.grab() # expanded overlay paint records the More... link rect + more = camera._help_more_rect + assert more is not None + + opened = [] + camera.open_full_help.connect(lambda: opened.append(True)) + qtbot.mouseClick(camera.viewport(), Qt.MouseButton.LeftButton, pos=more.center().toPoint()) + assert opened, "More... must open the full F1 dialog" + assert not camera._help_expanded # cheatsheet folds behind the dialog + + +def _wheel(widget, *, x=0, y=0, modifiers=Qt.KeyboardModifier.NoModifier): + from PySide6.QtGui import QWheelEvent + + return QWheelEvent( + QPointF(5, 5), + QPointF(widget.mapToGlobal(QPoint(5, 5))), + QPoint(0, 0), + QPoint(x, y), + Qt.MouseButton.NoButton, + modifiers, + Qt.ScrollPhase.NoScrollPhase, + False, + ) + + +def test_alt_wheel_axis_swap_still_changes_exposure(camera): + """xcb/windows swap wheel axes while Alt is held: the scroll lands in + angleDelta().x(). The fallback must still reach the exposure branch — + and a genuinely empty wheel event must do nothing.""" + camera.update_daq_status(_status(busy=False, session=SessionsStateEnum.OwnedByYou)) + sent = [] + camera.samcam_updated.connect(sent.append) + + camera.wheelEvent(_wheel(camera, x=-120, modifiers=Qt.KeyboardModifier.AltModifier)) + assert sent, "Alt+wheel with x-only delta must still adjust exposure" + assert sent[0].exposure < 0.02, "negative delta must decrease exposure" + + camera.wheel_event_timer.stop() # bypass the throttle for the second event + n = len(sent) + camera.wheelEvent(_wheel(camera)) # zero delta: ignored + assert len(sent) == n diff --git a/tests/unit/gui/test_gui_entry.py b/tests/unit/gui/test_gui_entry.py new file mode 100644 index 00000000..a29a0d14 --- /dev/null +++ b/tests/unit/gui/test_gui_entry.py @@ -0,0 +1,23 @@ +"""gui.main() startup path: the splash banner is a PNG again (the SVG +rendered wrong on RHEL9 consoles), so the resource block must resolve it — +and a failed startup must exit through the graceful error path, not crash.""" + +from unittest.mock import MagicMock, patch + +import pytest + + +def test_main_resolves_banner_and_exits_gracefully(qapp): + from aare.gui import gui + + with ( + # A second QApplication would abort; hand main() a stand-in instead. + patch.object(gui, "QApplication", return_value=MagicMock()), + # process() on the stand-in app exits the interpreter at C level + # ("argument list cannot be empty") — option defaults still apply. + patch.object(gui.QCommandLineParser, "process", lambda self, app: None), + patch.object(gui, "QMessageBox"), + patch.object(gui, "auth", side_effect=RuntimeError("no server")), + pytest.raises(SystemExit), + ): + gui.main() diff --git a/tests/unit/gui/test_main_window.py b/tests/unit/gui/test_main_window.py index 8a0c5046..10516ad9 100644 --- a/tests/unit/gui/test_main_window.py +++ b/tests/unit/gui/test_main_window.py @@ -1,7 +1,7 @@ from unittest.mock import MagicMock, patch import pytest -from PySide6.QtCore import QSettings +from PySide6.QtCore import QSettings, Qt from PySide6.QtWidgets import QDockWidget from aare.gui.main_window import MainWindow @@ -213,6 +213,33 @@ def test_automation_activity_refreshes_idle_timestamp(qtbot, mock_ui_state): assert win._last_user_interaction_ts == 250.0 + # Remote-close bookkeeping in the same status loop: an unreadable + # session entry is skipped, a close request for THIS session starts + # the countdown, and its disappearance clears it again. + from types import SimpleNamespace + + unreadable = status.model_copy(update={"open_guis": [SimpleNamespace(session="bad")]}) + win.update_daq_status(unreadable) + assert win._remote_close_deadline_ts is None + + close_req = status.model_copy( + update={ + "open_guis": [ + SimpleNamespace( + session=15, + close_requested=True, + close_requested_by="ops", + close_grace_seconds=5, + ) + ] + } + ) + win.update_daq_status(close_req) + assert win._remote_close_deadline_ts is not None + + win.update_daq_status(status) + assert win._remote_close_deadline_ts is None + def test_idle_timeout_closes_when_inactive_and_not_running(qtbot, mock_ui_state): with ( @@ -484,3 +511,81 @@ def test_close_restores_pre_watch_layout(qtbot, mock_ui_state): # closeEvent put the pre-watch layout back before saving state, so # the all-hidden fold was not persisted. assert not win.tell_samples_dock.isHidden() + + +def test_nonstaff_beamline_gate_popups(qtbot, mock_ui_state): + """Non-staff must SEE the staff-only Beamline panels (as locked banners) + and get an explanation on click — both on a banner and on the + pgroup-gated (disabled) Beamline tab, which used to eat clicks silently.""" + with ( + patch("requests.get"), + patch("aare.gui.main_window.DAQWorker"), + patch("aare.gui.main_window.PredictionSubscriber"), + patch("aare.gui.main_window.VideoThread"), + patch("aare.gui.main_window.JFJochDBusClient"), + patch("aare.gui.main_window.jwt.decode") as mock_jwt, + ): + mock_jwt.return_value = { + "sub": "visitor", + "staff": False, + "pgroups": ["p123"], + "session": 15, + } + win = _make_window(qtbot) + + # Locked stand-ins exist in place of the real staff panels + titles = [b.text() for b in win._locked_beamline_banners] + assert titles == ["Beamline setup", "ABR meas. pos.", "Beam configuration"] + assert not hasattr(win, "monochromator_panel") + + with patch("aare.gui.main_window.QMessageBox") as popup: + qtbot.mousePress(win._locked_beamline_banners[0], Qt.MouseButton.LeftButton) + assert popup.information.called, "banner click must explain the staff gate" + + # Active pgroup outside the token disables the whole Beamline tab; + # a click on the disabled tab must explain itself, not vanish. + win._apply_pgroup_gate("p999") + assert not win.left_column_tabs.isTabEnabled(0) + bar = win.left_column_tabs.tabBar() + with patch("aare.gui.main_window.QMessageBox") as popup: + qtbot.mousePress(bar, Qt.MouseButton.LeftButton, pos=bar.tabRect(0).center()) + assert popup.information.called, "gated tab click must explain the gate" + + +def test_staff_gated_tab_and_aux_default_tab(qtbot, mock_ui_state): + """Staff variants of the gates: the gated-tab popup explains the visitor + pgroup (not the staff gate), and alignment states raise the Auxiliary + puck as the default sample tab.""" + from aarecommon.models.models import BeamlineStateEnum + + with ( + patch("requests.get"), + patch("aare.gui.main_window.DAQWorker"), + patch("aare.gui.main_window.PredictionSubscriber"), + patch("aare.gui.main_window.VideoThread"), + patch("aare.gui.main_window.JFJochDBusClient"), + patch("aare.gui.main_window.jwt.decode") as mock_jwt, + ): + mock_jwt.return_value = { + "sub": "testuser", + "staff": True, + "pgroups": ["p123"], + "session": 15, + } + win = _make_window(qtbot) + + with patch("aare.gui.main_window.QMessageBox") as popup: + win._show_beamline_tab_gated_popup() + assert popup.information.called + + win._apply_default_sample_tab(BeamlineStateEnum.BeamLocation) + assert win.sample_lists_tabs.currentIndex() == 1 # Auxiliary puck + win._apply_default_sample_tab(BeamlineStateEnum.DataCollection) + assert win.sample_lists_tabs.currentIndex() == 0 + + # Energy row inside Exp. Config. emits eV (the GUI shows keV) + sent = [] + win.data_collection.change_energy.connect(sent.append) + win.data_collection.energy_spin.setValue(12.4) + win.data_collection._emit_change_energy() + assert sent and abs(sent[0] - 12400.0) < 1e-6 diff --git a/tests/unit/gui/test_motor_move_group.py b/tests/unit/gui/test_motor_move_group.py index 20143fd8..0eee1b70 100644 --- a/tests/unit/gui/test_motor_move_group.py +++ b/tests/unit/gui/test_motor_move_group.py @@ -84,3 +84,11 @@ def test_below_min_enter_hints_but_never_sends(chi, qtbot): _type(qtbot, box, "-5") # below the -0.2 bottom qtbot.keyClick(box, Qt.Key.Key_Return) # triggers the min-value tooltip path assert not sent # Enter must never start a move + + +def test_update_limits_reranges_box(chi, qtbot): + _group, box = chi + box.update_limits(-1.0, 50.0) + assert box.range_validator.bottom() == -1.0 + assert box.range_validator.top() == 50.0 + assert "50" in box.toolTip() diff --git a/tests/unit/gui/test_panels.py b/tests/unit/gui/test_panels.py index d6e1113f..c4463105 100644 --- a/tests/unit/gui/test_panels.py +++ b/tests/unit/gui/test_panels.py @@ -87,3 +87,21 @@ def test_status_panel_low_current(qtbot, mock_daq_status): assert f"color: {STATUS_ALERT}" in panel.ring_current.text() assert "300.0" in panel.ring_current.text() + + +def test_smargon_staged_axes_move_and_actual_tracking(qtbot, mock_daq_status): + """_move_axes sends only the staged axes (absent keys stay None = no + motion) and the status tick feeds actuals back into the move group.""" + from aare.gui.panels.smargon_panel import SmargonPanel + + panel = SmargonPanel() + qtbot.addWidget(panel) + sent = [] + panel.smargon.connect(sent.append) + + panel._move_axes({"chi": 2.0}) + assert sent and sent[0].chi_deg == 2.0 + assert sent[0].phi_deg is None # phi was not staged: must not move + + panel.update_daq_status(mock_daq_status) + assert panel._geom is mock_daq_status.geom -- 2.54.0 From 727f19d52a3810a9ad7cf15cd07305b224359dae Mon Sep 17 00:00:00 2001 From: Dawn Date: Fri, 14 Aug 2026 10:54:20 +0200 Subject: [PATCH 26/27] ci: run pytest with -s -vv in the test jobs Per-test lines and live (uncaptured) output: the pxiii_bec job sat silent at 81 percent for hours, and file-level dots could not say which test wedged. With -s -vv a hang names its test and streams the last log lines before it. Co-Authored-By: Claude Fable 5 --- .gitea/workflows/ci.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 41c49264..6fe73b17 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -72,7 +72,11 @@ jobs: BEAMLINE: SIMULATED run: | source .venv/bin/activate - pytest ./tests/unit + # -vv: one line per test, so a hung job shows the exact test it + # died in, not just a file of dots. -s: no output capture — prints + # and logs stream live instead of vanishing with a wedged worker + # (a pxiii_bec job once sat silent at 81% for hours). + pytest -s -vv ./tests/unit test-with-beamline-plugins: runs-on: ubuntu-latest @@ -105,7 +109,9 @@ jobs: BEAMLINE: SIMULATED run: | source .venv/bin/activate - pytest ./tests/unit + # Same -s -vv rationale as the plain test job: live, per-test + # output so a plugin-variant hang is diagnosable from the log. + pytest -s -vv ./tests/unit test-with-coverage: runs-on: ubuntu-latest -- 2.54.0 From 190e728734559a22fe1155cf3932c9c7ed0cb528 Mon Sep 17 00:00:00 2001 From: Dawn Date: Fri, 14 Aug 2026 10:54:20 +0200 Subject: [PATCH 27/27] fix: install gate event filters after eventFilter's targets exist The locked-banner and Beamline-tab-bar filters were installed mid __init__, but MainWindow.eventFilter reads sample_lists_tabs, which is created later - every event delivered in between raised AttributeError inside the filter ('Error calling Python override of eventFilter()' spam) and broke widget teardown, cascading errors across CI tests and wedging the pxiii_bec job. Filters now install late, next to installEventFilter(self), and the filter guards its attribute reads so construction/teardown-time events can never raise. Also fold the staff-gate assertions into test_main_window_init: every extra MainWindow construction raises the odds of the pre-existing PySide SystemError flake, so don't build a window just for them. Co-Authored-By: Claude Fable 5 --- src/aare/gui/main_window.py | 82 +++++++++++++++++------------- tests/unit/gui/test_main_window.py | 62 +++++++++------------- 2 files changed, 73 insertions(+), 71 deletions(-) diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index 41ed7607..4022bbed 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -385,7 +385,8 @@ class MainWindow(QMainWindow): banner = TitleLabel(title, holder) banner.setCursor(Qt.CursorShape.PointingHandCursor) banner.setToolTip("Only accessible for beamline scientists") - banner.installEventFilter(self) + # eventFilter install happens LATE in __init__ (next to + # installEventFilter(self)) — see the comment there. holder_layout.addWidget(banner) beamline_layout.addWidget(holder) self._locked_beamline_banners.append(banner) @@ -403,10 +404,6 @@ class MainWindow(QMainWindow): self.left_column_tabs.addTab(beamline_page, "Beamline") self.left_column_tabs.addTab(experiment_page, "Experiment") - # A click on the pgroup-gated (disabled) Beamline tab is otherwise - # eaten silently by the tab bar — the filter pops the explanation - # instead (same pattern as the Auxiliary-puck tab). - self.left_column_tabs.tabBar().installEventFilter(self) # Only the visible page counts toward the height — same trick as the # content stack below, else the taller page pads the other tab. @@ -431,6 +428,7 @@ class MainWindow(QMainWindow): # first widget now, not samcam. else self._locked_beamline_banners[0].parentWidget() ) + assert beamline_first is not None # the locked banner always has its holder for first in (beamline_first, self.data_collection, self.data_collection.file_path_panel): first_layout = first.layout() assert first_layout is not None # panels build their layouts in __init__ @@ -887,6 +885,15 @@ class MainWindow(QMainWindow): self.daq = DAQWorker(base_url=self._base_url, token=self._token) self.installEventFilter(self) + # These share MainWindow.eventFilter, which reads sample_lists_tabs + # and left_column_tabs on every event — so they must install only + # HERE, after every attribute the filter touches exists. Installing + # them at widget-construction time made each early event raise + # AttributeError inside the filter ("Error calling Python override + # of QObject::eventFilter()" spam that poisoned CI teardowns). + self.left_column_tabs.tabBar().installEventFilter(self) + for locked_banner in self._locked_beamline_banners: + locked_banner.installEventFilter(self) self._idle_timer = QTimer(self) self._idle_timer.setInterval(60_000) @@ -3217,35 +3224,42 @@ class MainWindow(QMainWindow): self._mark_user_interaction() except Exception as e: logger.debug(f"GUI interaction event filter error: {e}", exc_info=True) - # Non-staff click on the greyed-out Auxiliary-puck tab: only installed - # for non-staff, and tabAt() is geometric so it still sees the - # disabled tab — explain the lock instead of silently eating the click. - sample_tab_bar = self.sample_lists_tabs.tabBar() - if ( - event.type() == QEvent.Type.MouseButtonPress - and sample_tab_bar is not None - and obj is sample_tab_bar - and sample_tab_bar.tabAt(event.position().toPoint()) == 1 - ): - self._show_reference_tools_staff_only_popup() - return True - # Non-staff click on a locked Beamline banner: same treatment as the - # Auxiliary-puck tab — explain the gate instead of eating the click. - if event.type() == QEvent.Type.MouseButtonPress and obj in self._locked_beamline_banners: - self._show_beamline_staff_only_popup() - return True - # Click on the pgroup-gated (disabled) Beamline tab: tabAt() is - # geometric, so it still sees the disabled tab under the cursor. - left_tab_bar = self.left_column_tabs.tabBar() - if ( - event.type() == QEvent.Type.MouseButtonPress - and left_tab_bar is not None - and obj is left_tab_bar - and left_tab_bar.tabAt(event.position().toPoint()) == 0 - and not self.left_column_tabs.isTabEnabled(0) - ): - self._show_beamline_tab_gated_popup() - return True + # getattr defaults: this filter also runs for events delivered while + # __init__ is still building (or teardown is tearing down) the very + # widgets it inspects — a raise here spams every event and breaks + # widget cleanup, so missing attributes must mean "not my click". + if event.type() == QEvent.Type.MouseButtonPress: + # Non-staff click on the greyed-out Auxiliary-puck tab: only + # installed for non-staff, and tabAt() is geometric so it still + # sees the disabled tab — explain the lock instead of silently + # eating the click. + sample_tabs = getattr(self, "sample_lists_tabs", None) + sample_tab_bar = sample_tabs.tabBar() if sample_tabs is not None else None + if ( + sample_tab_bar is not None + and obj is sample_tab_bar + and sample_tab_bar.tabAt(event.position().toPoint()) == 1 + ): + self._show_reference_tools_staff_only_popup() + return True + # Non-staff click on a locked Beamline banner: same treatment as + # the Auxiliary-puck tab — explain the gate, don't eat the click. + if obj in getattr(self, "_locked_beamline_banners", ()): + self._show_beamline_staff_only_popup() + return True + # Click on the pgroup-gated (disabled) Beamline tab: tabAt() is + # geometric, so it still sees the disabled tab under the cursor. + left_tabs = getattr(self, "left_column_tabs", None) + if left_tabs is not None: + left_tab_bar = left_tabs.tabBar() + if ( + left_tab_bar is not None + and obj is left_tab_bar + and left_tab_bar.tabAt(event.position().toPoint()) == 0 + and not left_tabs.isTabEnabled(0) + ): + self._show_beamline_tab_gated_popup() + return True return super().eventFilter(obj, event) def _start_remote_close_countdown( diff --git a/tests/unit/gui/test_main_window.py b/tests/unit/gui/test_main_window.py index 10516ad9..c1cd7040 100644 --- a/tests/unit/gui/test_main_window.py +++ b/tests/unit/gui/test_main_window.py @@ -50,6 +50,27 @@ def test_main_window_init(qtbot, mock_ui_state): assert win.windowTitle() == "AareGUI" assert win.isVisible() + # Staff-side gate behaviors piggyback on this window: every extra + # MainWindow construction raises the odds of the PySide SystemError + # flake, so don't build another one just for these. + from aarecommon.models.models import BeamlineStateEnum + + with patch("aare.gui.main_window.QMessageBox") as popup: + win._show_beamline_tab_gated_popup() + assert popup.information.called, "staff popup must explain the visitor pgroup" + + win._apply_default_sample_tab(BeamlineStateEnum.BeamLocation) + assert win.sample_lists_tabs.currentIndex() == 1 # Auxiliary puck + win._apply_default_sample_tab(BeamlineStateEnum.DataCollection) + assert win.sample_lists_tabs.currentIndex() == 0 + + # Energy row inside Exp. Config. emits eV (the GUI shows keV) + sent = [] + win.data_collection.change_energy.connect(sent.append) + win.data_collection.energy_spin.setValue(12.4) + win.data_collection._emit_change_energy() + assert sent and abs(sent[0] - 12400.0) < 1e-6 + def test_main_window_mount_view(qtbot, mock_ui_state): with ( @@ -551,41 +572,8 @@ def test_nonstaff_beamline_gate_popups(qtbot, mock_ui_state): qtbot.mousePress(bar, Qt.MouseButton.LeftButton, pos=bar.tabRect(0).center()) assert popup.information.called, "gated tab click must explain the gate" - -def test_staff_gated_tab_and_aux_default_tab(qtbot, mock_ui_state): - """Staff variants of the gates: the gated-tab popup explains the visitor - pgroup (not the staff gate), and alignment states raise the Auxiliary - puck as the default sample tab.""" - from aarecommon.models.models import BeamlineStateEnum - - with ( - patch("requests.get"), - patch("aare.gui.main_window.DAQWorker"), - patch("aare.gui.main_window.PredictionSubscriber"), - patch("aare.gui.main_window.VideoThread"), - patch("aare.gui.main_window.JFJochDBusClient"), - patch("aare.gui.main_window.jwt.decode") as mock_jwt, - ): - mock_jwt.return_value = { - "sub": "testuser", - "staff": True, - "pgroups": ["p123"], - "session": 15, - } - win = _make_window(qtbot) - + # The greyed-out Auxiliary-puck tab explains itself the same way. + aux_bar = win.sample_lists_tabs.tabBar() with patch("aare.gui.main_window.QMessageBox") as popup: - win._show_beamline_tab_gated_popup() - assert popup.information.called - - win._apply_default_sample_tab(BeamlineStateEnum.BeamLocation) - assert win.sample_lists_tabs.currentIndex() == 1 # Auxiliary puck - win._apply_default_sample_tab(BeamlineStateEnum.DataCollection) - assert win.sample_lists_tabs.currentIndex() == 0 - - # Energy row inside Exp. Config. emits eV (the GUI shows keV) - sent = [] - win.data_collection.change_energy.connect(sent.append) - win.data_collection.energy_spin.setValue(12.4) - win.data_collection._emit_change_energy() - assert sent and abs(sent[0] - 12400.0) < 1e-6 + qtbot.mousePress(aux_bar, Qt.MouseButton.LeftButton, pos=aux_bar.tabRect(1).center()) + assert popup.information.called, "aux-puck tab click must explain the lock" -- 2.54.0