From 193943cf55fddf9de2c123670bbd6c5a49187f3c Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:35:31 -0500 Subject: [PATCH 01/38] egocap: time alignment that reproduces the reference aligner's output Resamples a recorded episode onto the index camera's frame times by the aligned dataset format's rules: the common valid range, the downsampling stride, nearest-frame indices by one forward walk (an earlier frame wins a tie, a frame may serve two kept times), and per-field interpolation (slerp for head and controller poses, element-wise linear for the glove, nearest for discrete fields). The times to align on come from the caller and are never adjusted. Sources without a qualified event time, or with a restart inside the episode, are refused. Checked against golden outputs produced by running the reference aligner on synthetic episodes, array for array. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../recording/egocap/recording/alignment.py | 272 +++++++++++++ .../01_jittered_index_offset_wrist.npz | Bin 0 -> 258416 bytes .../03_tracking_late_start_early_end.npz | Bin 0 -> 63891 bytes .../alignment/04_duplicate_timestamps.npz | Bin 0 -> 55964 bytes .../alignment/04b_backwards_timestamp.npz | Bin 0 -> 56883 bytes .../05_irregular_tracking_with_gap.npz | Bin 0 -> 252543 bytes .../alignment/06_single_sample_source.npz | Bin 0 -> 32391 bytes .../fixtures/alignment/07_no_common_range.npz | Bin 0 -> 11384 bytes .../tests/recording/unit/test_alignment.py | 360 ++++++++++++++++++ 9 files changed, 632 insertions(+) create mode 100644 examples/egocap/recording/egocap/recording/alignment.py create mode 100644 examples/egocap/tests/recording/fixtures/alignment/01_jittered_index_offset_wrist.npz create mode 100644 examples/egocap/tests/recording/fixtures/alignment/03_tracking_late_start_early_end.npz create mode 100644 examples/egocap/tests/recording/fixtures/alignment/04_duplicate_timestamps.npz create mode 100644 examples/egocap/tests/recording/fixtures/alignment/04b_backwards_timestamp.npz create mode 100644 examples/egocap/tests/recording/fixtures/alignment/05_irregular_tracking_with_gap.npz create mode 100644 examples/egocap/tests/recording/fixtures/alignment/06_single_sample_source.npz create mode 100644 examples/egocap/tests/recording/fixtures/alignment/07_no_common_range.npz create mode 100644 examples/egocap/tests/recording/unit/test_alignment.py diff --git a/examples/egocap/recording/egocap/recording/alignment.py b/examples/egocap/recording/egocap/recording/alignment.py new file mode 100644 index 0000000000..846e785aff --- /dev/null +++ b/examples/egocap/recording/egocap/recording/alignment.py @@ -0,0 +1,272 @@ +# SPDX-FileCopyrightText: 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +"""Time alignment of a recorded episode, producing the aligned-dataset arrays downstream consumers read. + +The recorded sources are resampled onto one camera's frame times (the index source). The rules are fixed by the +aligned dataset format and are reproduced here exactly, because consumers read the result by array name and +expect these values: + +* the valid range runs from the latest first time to the earliest last time over all sources; an index frame is + kept when it is in that range and on the downsampling stride (``valid_indices``, ``valid_timestamps``); +* a camera other than the index source contributes the position of its frame nearest each kept time + (``aligned_frame_indices``), found by one forward walk, so the earlier frame wins a tie and a frame may serve + two kept times; +* the index source's own fields are only filtered by ``valid_indices``; every other source's fields are + interpolated at the kept times by their declared rule, written as ``_interp``: ``pose`` (4x4 + transforms: linear position, slerp rotation), ``linear`` (element-wise, also used for a 4x4 field with extra + leading dimensions) or ``nearest`` (the value at the nearest sample); ``raw`` fields are not resampled. + +There is no file access here. The times passed in are the ones to align on: a source's recorded capture time, or +its receive time minus a configured latency, chosen by the caller and never adjusted here. +""" + +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from dataclasses import dataclass, field +from typing import Literal + +import numpy as np +from scipy import interpolate +from scipy.spatial import transform as st + +__all__ = [ + "AlignedEpisode", + "AlignedSource", + "AlignmentError", + "FieldRule", + "InsufficientSamplesError", + "TRACKING_FIELD_RULES", + "align_episode", + "find_nearest_timestamp_indices", + "interpolate_field", + "qualified_sources", +] + +#: How one field is resampled onto the kept times. +FieldRule = Literal["pose", "linear", "nearest", "raw"] + + +class AlignmentError(ValueError): + """The episode cannot be aligned: bad input, or no frame of the index source in the common range.""" + + +class InsufficientSamplesError(AlignmentError): + """Fewer than two samples with strictly increasing times remain, so nothing can be interpolated.""" + + +def qualified_sources( + timing: Mapping[str, object] | None, cameras: Sequence[str], tracking: Sequence[str] +) -> dict[str, bool]: + """Which sources' recorded times are qualified event times, from an episode's ``timing`` attribute. + + A camera is qualified only when its entry in ``clock_mapping.streams`` says its time is the sensor's capture + event (``time_meaning == "sensor_capture"``); a clock mapping alone says which clock a time is on, not what it + measures, and a ``frame_ready`` time is not a capture event. A tracking source is qualified only when + ``tracking_semantics.physical_alignment`` says a measurement time is available; it says ``unavailable: ...`` + while tracking carries the host's poll time. Anything the attribute does not vouch for is False. A caller that + aligns on ``receive_time - latency`` instead states that choice itself; this says nothing about it. + """ + timing = timing or {} + # Cameras: a stream whose time means the sensor's capture event (a non-list vouches for nothing). + mapping = timing.get("clock_mapping") + streams = mapping.get("streams") if isinstance(mapping, Mapping) else None + mapped = ( + {s.get("name") for s in streams if isinstance(s, Mapping) and s.get("time_meaning") == "sensor_capture"} + if isinstance(streams, (list, tuple)) + else set() + ) + # Tracking: qualified only if the recording says a measurement time exists. + semantics = timing.get("tracking_semantics") + alignment = semantics.get("physical_alignment") if isinstance(semantics, Mapping) else None + tracking_ok = isinstance(alignment, str) and alignment.startswith("available") + return {**{name: name in mapped for name in cameras}, **{name: tracking_ok for name in tracking}} + + +def find_nearest_timestamp_indices(source_times: np.ndarray, target_times: np.ndarray) -> np.ndarray: + """Position in ``source_times`` of the sample nearest each target, by one forward walk. + + Both arrays are sorted. The walk only moves forward, and advances only when the next sample is strictly closer, + so a tie keeps the earlier sample and one sample can be nearest to several targets. + """ + m, n = len(source_times), len(target_times) + indices = np.empty(n, dtype=int) + j = 0 + for i in range(n): + # Move on only for a strictly closer sample; equal distance stays on the earlier one. + while j < m - 1 and abs(source_times[j + 1] - target_times[i]) < abs(source_times[j] - target_times[i]): + j += 1 + indices[i] = j + return indices + + +def _clean(times: np.ndarray, values: np.ndarray) -> tuple[np.ndarray, np.ndarray]: + """Drop each sample whose time is not later than the sample before it, as recorded.""" + drop = [i for i in range(1, len(times)) if times[i] <= times[i - 1]] + if drop: + times, values = np.delete(times, drop), np.delete(values, drop, axis=0) + # An interpolator needs two distinct times to span anything. + if len(times) < 2: + raise InsufficientSamplesError( + f"interpolation needs at least 2 samples with strictly increasing times; {len(times)} remain" + ) + return times, values + + +def _linear(times: np.ndarray, values: np.ndarray, targets: np.ndarray) -> np.ndarray: + """Element-wise linear interpolation along the first axis; targets outside the sample range are an error.""" + times, values = _clean(times, values) + return interpolate.interp1d(times, values, kind="linear", axis=0)(targets) + + +def _pose(times: np.ndarray, values: np.ndarray, targets: np.ndarray) -> np.ndarray: + """Rigid transforms ``(N, 4, 4)``: linear position and slerp rotation, with a bottom row of [0, 0, 0, 1].""" + times, values = _clean(times, values) + positions = interpolate.interp1d(times, values[:, :3, 3], kind="linear", axis=0)(targets) + rotations = st.Slerp(times, st.Rotation.from_matrix(values[:, :3, :3]))(targets).as_matrix() + out = np.zeros((len(targets), 4, 4)) + out[:, :3, :3], out[:, :3, 3], out[:, 3, 3] = rotations, positions, 1.0 + return out + + +def interpolate_field( + rule: FieldRule, times: np.ndarray, values: np.ndarray, targets: np.ndarray +) -> np.ndarray | None: + """One field resampled at ``targets``; None for a ``raw`` field, which is not resampled. + + A ``pose`` field that is not a plain ``(N, 4, 4)`` array is interpolated linearly instead, element by element. + Targets outside the range of ``times`` are an error (they cannot occur for the kept times of an alignment). + """ + times, values = np.asarray(times, dtype=np.float64), np.asarray(values) + if rule == "raw": + return None + if rule == "nearest": + return values[find_nearest_timestamp_indices(times, targets)] + # A pose rule only applies to a plain stack of transforms; any other shape falls back to element-wise. + if rule == "pose" and values.ndim == 3 and values.shape[1:] == (4, 4): + return _pose(times, values, targets) + if rule in ("pose", "linear"): + return _linear(times, values, targets) + raise AlignmentError(f"unknown field rule {rule!r}") + + +@dataclass(frozen=True) +class AlignedSource: + """What the alignment adds for one source.""" + + #: For a camera: positions of the frames matched to the kept times (the index source's own kept positions). + aligned_frame_indices: np.ndarray | None = None + #: ```` -> values at the kept times; written as ``_interp``. + interpolated: dict[str, np.ndarray] = field(default_factory=dict) + + +@dataclass(frozen=True) +class AlignedEpisode: + """The result of aligning one episode.""" + + index_source: str + #: Boolean mask over the index source's frames: in the valid range and on the downsampling stride. + valid_indices: np.ndarray + #: The index source's times at the kept frames. + valid_timestamps: np.ndarray + #: The valid range that was used, as (first, last). + valid_range: tuple[float, float] + sources: dict[str, AlignedSource] + + +#: How each field of the station's tracking sources is resampled. Head and controller poses are rigid transforms +#: (slerp); the glove's 25 joint transforms per hand are interpolated element-wise; triggers are continuous; the +#: buttons are not resampled, so they stay raw. +TRACKING_FIELD_RULES: dict[str, dict[str, FieldRule]] = { + "pico_controller": { + "head_pose": "pose", + "left_pose": "pose", + "right_pose": "pose", + "left_trigger": "linear", + "right_trigger": "linear", + }, + "manus_glove": {"left_hand_pose": "linear", "right_hand_pose": "linear"}, +} + + +def _check_inputs(index_source: str, times: Mapping[str, np.ndarray], downsample: int) -> None: + """Refuse input that cannot be aligned: a missing index source, a bad stride, or unusable times.""" + if index_source not in times: + raise AlignmentError(f"the index source {index_source!r} has no times") + if downsample < 1: + raise AlignmentError("downsample must be at least 1") + for name, source_times in times.items(): + arr = np.asarray(source_times) + # The forward walk and the range logic assume sorted, finite times. + if arr.ndim != 1 or arr.size == 0 or not np.all(np.isfinite(arr)): + raise AlignmentError(f"{name}: needs a non-empty list of finite times") + if np.any(np.diff(arr) < 0): + raise AlignmentError(f"{name}: times go backwards") + + +def align_episode( + index_source: str, + times: Mapping[str, np.ndarray], + cameras: Sequence[str], + fields: Mapping[str, Mapping[str, np.ndarray]], + rules: Mapping[str, Mapping[str, FieldRule]], + *, + downsample: int = 1, + epochs: Mapping[str, np.ndarray] | None = None, +) -> AlignedEpisode: + """Align every source in ``times`` onto ``index_source``. + + ``times`` maps each source to the times to align on (sorted, finite); ``cameras`` names the sources that are + cameras; ``fields[source][name]`` are a source's arrays and ``rules[source][name]`` how each is resampled (a + field with no rule is not resampled). Raises ``AlignmentError`` if the index source has no frame in the valid + range, so an alignment is never an empty success. ``epochs`` optionally labels each sample of a source with the + unbroken stretch it belongs to (the label changes at a restart, a reconnect or an invalid interval); a source + with more than one label is refused, since interpolating across the break would produce values the sensor + never reported. + """ + _check_inputs(index_source, times, downsample) + for name, labels in (epochs or {}).items(): + # The aligned numbers stay those of the reference rules; a break is refused, not handled differently. + if name not in times or len(labels) != len(times[name]): + raise AlignmentError(f"{name}: epoch labels must be one per sample of a source being aligned") + if len(np.unique(labels)) > 1: + raise AlignmentError(f"{name}: has a restart or invalid interval inside the episode") + index_times = np.asarray(times[index_source], dtype=np.float64) + + # The valid range: every source has data on both sides of a kept time. + lo = max(float(np.min(t)) for t in times.values()) + hi = min(float(np.max(t)) for t in times.values()) + in_range = (index_times >= lo) & (index_times <= hi) + # Downsampling keeps every n-th index frame, counted from the first frame (not from the first kept one). + stride = np.zeros_like(in_range, dtype=bool) + stride[::downsample] = True + valid = in_range & stride + kept = index_times[valid] + if kept.size == 0: + raise AlignmentError(f"no frame of {index_source!r} is in the common range [{lo}, {hi}]") + + sources: dict[str, AlignedSource] = {} + for name, source_times in times.items(): + source_times = np.asarray(source_times, dtype=np.float64) + interpolated: dict[str, np.ndarray] = {} + for field_name, rule in rules.get(name, {}).items(): + # A rule for a field that was not recorded, or a raw field, adds nothing. + if field_name not in fields.get(name, {}) or rule == "raw": + continue + values = np.asarray(fields[name][field_name]) + if name == index_source: + # The index source already sits on the kept times: only filter it. + interpolated[field_name] = values[valid] + else: + interpolated[field_name] = interpolate_field(rule, source_times, values, kept) + frames = None + if name in cameras: + frames = ( + np.flatnonzero(valid) + if name == index_source + else find_nearest_timestamp_indices(source_times, kept) + ) + sources[name] = AlignedSource(frames, interpolated) + return AlignedEpisode(index_source, valid, kept, (lo, hi), sources) diff --git a/examples/egocap/tests/recording/fixtures/alignment/01_jittered_index_offset_wrist.npz b/examples/egocap/tests/recording/fixtures/alignment/01_jittered_index_offset_wrist.npz new file mode 100644 index 0000000000000000000000000000000000000000..d0caafd3a481be4a1aeb2b531ddafd219071cbd5 GIT binary patch literal 258416 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%0Ac{=d;^{;OXBaQ!kJ{VGqz?_ufBp5GtE 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%0AQS?x(npqzt8mhANut>x2 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

y6d>+`rtqA6|PER`QdfHpuDn7(>rhvm=?1 zZ(B_hOTOA4plWo8DdJWK?-CM%P%hKl_BnEm>Rz< z6t2+WO?gXLd;hlJ2^;a^BdxQN3=1F?QYgCe0Pz#8;iEuMSs7q*{v*~V)k`N5_V0EP zPZZMCFC>I0*l?jPDI_ija*!hs_3g|A37>+V4wWtA;zj*Y>|b6NyZ{7#;A#KmM?Ou( zI1c>Ix&*aplM=SiQxgQLXfww1U?FmV4@Is%r$eXamg3;tw?{>^vTubZ4+X!w=pu53 z7UgTwHW2I(J8LnO3>3G2hgR8e0KSYcV=`;;i)Bs83$8;jAm0|IdiQ<`wr!53pRV_N zeG=-K))hwgy|CDD;K4Sintt#D@pzse=5!;F!kMDnl{X&(dqF%qlH_2v9 z67aQiOMi~$%L{j&Kd?%^he3KxM2FGeOSr=G$A(JYU0@{n59xnC!|yydY_V*Y!d zkvnmS2~soz*C9F3s9+b{Q`Q0*WKr%^qw6%t- zyU?Dw!-R2nC_J+{tUNksW93-_?ZzfGJrKc120UmLJY-F5wFovJOx19&8?0(?w}wGR7?(@xBFGzYl#Lt&py|R7=T{{Bw z_0&s$2HJqZ#e8p`Sor(cVJ{)-dmV$7vfS!prWlSbA?IWCYmv zIkhOJO*KQzqz6}A36UGHsyS>;biZ{J+wh7ae%KnjCT)<{IuRcPxi2LdLI1e78vIRb z!ZHp~v2(j|pjIC`76*?H^>DtUj=xuPWz$WL%tz%~vRs<&zkK@>O-eTi7vRbdi(MqF zFj5F-Y~tXP9}d)0*0>&wAJ9qp9iWW~tmZ33HKc>lc}9Dl7)%k^*DE>_@XXo-qgUqKbD98YYX&3)R5euBR6^NoAiN)Y$4J z-qj6dHaScgA1J_+YxKkLO;*OTOVgmlgKG?YemP)}5R6-PI)aN<6KqWA|^4*d{{KUV!O0r%p6BjEneLEM*28Q10i4)!qoSK{9TCfLJHm{Fd?byns$ zSRbjRakFG-Q@^&2wbd={eD|k@joek|x7Gg6kY|(cudC}j6;)7tp1q#FXXg0E5jySm zR3WMBM8CJEvwQE<#dAI514KGUm^uhY)x!}P6n$-p8h>hhm(OCRsI^{+;?vUVDI2-& zhrXeE&NkY`pV`dn@S*YrWn>}yYWv`t2s%O|ZW6bCJ8=F8pBn^T<^*c-tp4)2X1!KR3Z;=5_u z;s-}Nt1;h0S?BZ77&#TJS%Jqlkq8MALr|yp7JJ{;wb?qsu$Z8tDuI1ds>;wd*f^`} zQ-slEx5Ih@M7%zNf*72QwSlO!_@seG{2x&GYE&{~ofiHw=aKMURw;Rp#;iv8qY==*Ork!$!FtXD({E;9cE>D=3Rtyv$wkX(iAa>jp9L!QNd zl>S$N%KbM5`p*u-|3ii9|GPpx|52gg@wB&l=huz1U!2*!tM#_|nje>T-08|ucEyuX z1GC)RHzqXC-UdrTo)*3rVHa??ZhxImY;*JU!RgyKt443GibN(;onjMeqK zQ+LZVC*blP?X<@5r3)DI5uM|DmMWkELlM%Dfr7}W&E9wY2@A?Gm}YKdI7*G{;idGU zi2{<_$A$o$%HGtXIB6cOMbUh4EH7kx_H58o2o~bY?f;UbTqin1WW#-?uSe1L3%yO| z<27ApQWQtmD%zl?yJl(@$Mu%4>zt4>6r_~~h|$Xi_3`Hi`9(M5WwU{V2l230fiGp> z!lPlcuj!@VK~v(ccE_ojOMhUwCxsoT33iH=OBAj9Dn-dJGfQ^E*Vo+JsanIRaFwe( z;cGOFO@Wy!i>6C;-1H1kn37gp(-W)LI?~=4Dcbm-ouoj{9o_?$Lv>D{7YXU&}Q4|GnH> z|7*GI_D5v?9Ql3wKbH00_+rApmh}&|)c`?u1^?^Q6!G-iF{*4P&ZHhC; zADm_VP?UZD`#_|O+|-Lbb6-Vip=2`Q<0pBkiXT_4g~wWI<=8imvMDLIwM|wDBE1CL zo|PWIl^?&rQy67=Q%=Xe2g7T{JJ`h~*J;5y;i^l^tw>{tm&Poth(1pkzjN5>|Kr>f z5Y9^!GhfTnfDm2iHssfVd&jtbcwE;ZynyUJmZac`xBDqUh!j!Gx5SvYbEO+d{AD!p zUmrdN+cN|4yZa8*_^lF_m{wbK5@$hW?S^w12KU2bj_sD(BFjlB3 z!WMzU&Z7^*(TBM>&9%^hdUy6vkf_$*8(A{6MWtc*>g#8*6`!K4uDNi?4og1^!IwWn zxgtlRWGNQ&IIOz=7hr;_B1`SZ10nRhva?w`PdDJg9|l8>gn!f!EUSEa5lxR%5b!6#3f}HP zRlW}c#oM)j6`aVbQ&0q0JUEPPR?8EypgaFX>Zr?|6J%rNaL;(mD}-K{WD+^dEdtB| zJ_aqT5`$@;W%@O%#aWR-F2bbgYDnuuK;ONVhR4ZkKL)ZZv`8xhm;}}4PcJ+(!&xWP zAP>T4-depayOpXOz8Qpn$Abk&QKiLTl?I!9_`vT+pkt4tz!W5NS`<;A`A+IXd1k;R!aWW=o^KegzkgY0t?nJHU~lOM3dGT3K`D*^D|&Due|jLKDxev* z9KfU=e*ZBx{spAH=OnbQ=oJETr>AAIDUNbjtHWthy%AhqJGrm8is(~7G=Vjmgj0sy zq)0uL&+ucB&;{8~&EKVw*1r-7@CrDeZ>aX_b@VpBN$a3*WXr^1aTLOln(pmc^h}DY zGXgPF`;msG44F1mt95|mKLdGnaF#(;Nlv7OrUEB+LWc{fhM3cBDtN<2T5QG|pQ#O# z--PU47s*GY=|i$d1|}IfH_`!Pm}oxkfP>^VLUVkfgN{VZ#<4?<^=#Pl>6CYv#-^Sk zUFIa&{!8Rj)737g?~&j=BQ~g4=H3yi?o_Z$$JA2G1a>z3 z)uBo@r}pslFZESmE_sN-3%QXi^kJ+%nY#HXiE4R`>|Q_5fx^8YsH5hOQct)UG3J>i z#xEHKUaMCA0xXnV1X?6SHM)5*#$ajz8@h~lOaJ&AHmEkC?({6! z-wT?2Gdnt*MRPZAoe+F2>ma_xi~LLFBoU5C5m-Yr7MtfmEYQmvwG!6A6MS*`FY&2~~D!*j7 z6@oIyrFGAWE7y9mzrmI<7XZmO^1#T-t2!IU-r7B0{|J^jWozLHjDF(&(V z5Cw!JmTdrpFNI%+fViAlI5cm~D$^?P48rK(Iy3z3(q3w?h>zi>JGZWpCR`*P{!x=e zDUn6Jnpu=tL@d5zL5B37&BL-wqfTYQMty)$ndQz!AvhuSvCHgS&UK_`oiuWE?kG&b zW!${TeD}#D&$Z8EjQO6%DkGWZXdcmiS}En^x{-*eM;v05E(rVT zBRQa=5H2wYnQ_7x&l6jPWIA<@qAaiTt=?o_`HFho{jK}?7jvm?&v(*Smz_KS=!`iq zHLm=&h=&N0E)|BUhJl%xS8VuqV>`8lICbT|LF%oyxEIHRGarwn_}?}%bRY+gsExvl z6ysdJHL8**uASU(;eU7tLN&0&{exn38@*cYjW90c6&N8J*JOUN{ubkevBQ3+p9MZT zX$@oQ7NoC8hij7bRgIUU?J>M~C*0)Gc8Nx|QqbpDE*ALN65CSk&+)E9>5Q2oaf1U? z8xL&Q=iHW&5tluqkvVnBxa*sYlNrl!KaXMSvY`drNd=@cDNLj}2f` zb5RGVvzTLhnjy?d=Fw~TKYL*rKzWZ}$d-O?;3CSeMX2w?D?|+e$&x>KecGtyr~@tk zw<|myD~*14ib)KA#KQr-D9;LoQ`O1Dum#+mMY|@%kUiN6-*{Mz&aGT%s*sE!eYg@s zG0l#KnL_y57{3=1Fz!1hr3t4C!beA5PmdlJDwL*-KDDUYoi}6~@0Tl=-Sg#kAk>PQ zQr$m9!;A}_9Yu!VL`Xe22j;fa->EaU;V8J}mC{b>a#JGdZ>B7V`6bXE30RyUqtlE= z0dekSu@5t+%8Twk590G(x$z2oV!Ge&8%zghcsdfC>0;YPdU2M*K^g4V!0iPaz&yvU z_E|i3UT6|PEiY*LCyHrU##)aTo77%}v+@u#ych2m$i;qdv1q%ZWLlkX!uaYGLuyNZ znt`4L?LJQYvEn!E&?2;I>12=AEz|kaz(Z*>87*M7L%2;n+=?YU6DHhH-ccfZ#)>R~ zJ{UHBAagJETM4b3O=;(as7W11x;flr*qcx0X>4ke;t7}eiQlq|!qf7F9!TQe$B;JB z+}(%pJE5kxuSwltRA*5DaZcouA|8@`|1FKf71hcT0JK9bzkf7_YFHNP+6A=J z2Wg~lu0= zI7mHP1t)fE-dojGIBAi`W~xADWwP7gW!?QOW=HU$o%oiy?n!1QE$J?>R`tn zYS1W~iK4=KCITA@Z<#7zY#N^Snh8)Ukgi@5MVkY^O_#zlsybVR?wuZ$dtj|Q-OGpt zmd!nRc58|+t=!=`0=!hhvF}2FAgP38IH8 zTTf!7sf~gL^$j~Nl2V79K6fwnt&+W&6KuNn>SS!mS;+l>aRa!1xUwLuaQfs{!B4eB z+5lQ)G2u_;vW3ndQ$me|V{3|9CcywV=>BzN7ip$u(EBfLXG!+m#!+_w5?D@x6rVK zfeq3O55kIB__E>nr2aryyTEYFTHSn!1lb`_@EN)-AgWBg?Ad&lcXY#zpf;SV{Y?g& z42;fl2nE6w_kqSlzZ-X5^GuwS_Y_NsLxSTqZ%k80VdI!u6 zR)xIyfDQIPD0>Iy%))kUvt!$~ZQHi(q~ngQjytxEj&0kv?c|A_JkwLN-~G-0re><< zC#+Sq)?L?mT=#L>cqLFh-mZiBzU}rd?lK}7e`Oh^?Rwltw*y_C8ig{0+&E-ac?H0gR*lTB5TLAG&e+OYIwfTKDJ_jpCuC5!h7H=qjhi zl>9S)j(u`8 zzn=i)Tw=cU&zkp+3J2d%y_QDHTVTFk9t103lhJDd7kM(@xN`4)7d$KW_GLv(MMxLY zeCN*RT_`=QHfUc$`g%p~~W%WqLEID7Tr7k*JDLLjq=N7JBF^VRWfR;3#%lyQZ zGq?(YtOvfc{_%gmu5q_y;56O{Fzjg_N_ktJ2KdipUTM&A`=NMF=O11S5(zVQysk%f#N|Kk>)^ z7+L=l-TWtU82Ya)Bxh_~aX|S;=zhZ!O-H|6Gj&L+s&Mi=47i2l-?V2`Y54TiHWGda zCixg3nkT2xOn~)^UXHW;$GrQ1Rsj~Y6xMJGgS-JfXFq4Wtq0ocMJv~lR(T;I<8f=0 z|3HKM;L^)G&;xb#+dT>t&HA7IrYKUT>)#bz6I{0RVY)6!I2UU(LIQeY6gkfji>_h5 zDq{>=?NLb1J3^vcl)PIUy|odnD`PC9I|QG#Q4mDu-)7l+=(~4dR%ZuPve`x9g0%X3 zDF5>fO`SM|{b!2*KSQnmD}njX6#xHG?(|<{ybtz&jqz)5e91;@Kb*|vq)U<+Xh`J5 z$tMkD{}wk`$gC$eFiEJ(>d=zP6;>tqVUfoA{S(ET;h0%6vyJ8Yo(v^>xL!R@SEnrx(t18?&ar zfH}S9=X?GEK0Dhp3&-Ejoxc+kn<5UL$!Hkv^^brY+?dg7tKYKIgXe2%e2Qz!V5^AB zW6-_c#Tm;}@BP$RD4&V%g*_O3Ivf0D-lNoeJz3Ful?#1L`5$ck?P%_4YaE8}bFek) z_LT6cQUCTYe(HKpg*1c*FN~5k2S$5$X}s5>qQI=3 zn?AU*A3Hd|)XLG09qB8#rSO4%@*CxCN92oqi=xj~9x1-AqtN8BFG8b!6gocI&c)Md z6G#A??*z8@CGCOiE!T5znzHX~6D_;aSNV)JL5Zq=y{3|aBxlo~%n-Y8X z7kF?{2`%t4e%1B1tL}mC8ew-=EDkF=FKDOY$(mmVc2wKFc8A!AOQ3&(9b@)IQtE0kGza=39G)V z44_d5w!RJPWr!u_YdOO>*F^4KVe{!wwe{W8=bTu zgc3op$U0IPJf;fA)GeA*-09JqTbcMXXiNUNTe^4)W3!-oQND*&RCzr&AeQm%X~T?J z9aYbc4A;*0jqKT|t>r1k$46_{tvo_;Iks4n0_asq zU?7?>jDudNBqSIzdVteLf9Tb?kW9j&-XV{`omkqL|GJjLHb8yfwD91AH1AesHZN4p z9e`|h*Fx1fjRtP9?aG4vaZ&im@fVH#an`}Yv~cbs`bVnqv(6DF>tu2p0T6wCl+%Ut z@e64RQGa9qLD~N1UpLMjZSFh%< zkDJIYre(b`9n|fv8{JG_=lnE zDB~y0g>Z}v2ByD_S)Y{~+lc@l2JiRR^EL7Xc;Z+y9FjN-b!qez#ju1}KLexeAV4y3 zTkm#X%Hdt`GWD5eB*&%Bb5oO;m>3Bo3)2I|{~4^2(IM@Z7E5}Vt>3HErD#7a9l#g- z?l!rzQdJ`k6a$ptvQ?Llc$n(<-C7Q3a>pi(DMxTrgv0YNBpNjnL*?Qc)U5{-O!nQNI0FD{D3%Lg#32*YkVyd zgMKoGDppaxvD!k`Z3&C#^ueB;j+*?c5Xp+0;yE!w$AJM0R-tS{_NI8@SS}0kg}@hC zk}3=w6^4dp`g_9s{Cl56y^OV8Q`2&N?!T+c8J)9U&0=d{qZbZ2Ag-;B`%56TIP3{s zaXb``_=qTv4n)nRfB-@_LzDP2QTwIyZkXPQIsBWI{S#___4MH{kJT33$0o@giAZ>2 z#pcACK|yim?n+!2<4|ykny?}z$W7sLgIW2Db7tCgnActG?*gGs#FME@0Pt8eZIF)kwe>ZMc3y+9SpDqM7L z#Wu?3S(WS*c)xzy^%jK#hzDlbV>Zqe2kX%D(zCC?x$&w@ZkAhx|2#Y14+VI#PZ2!# zv4uvUSGxiA-`PRvm5$eSG|oS^Dt4%R3>Evwa@WGUxL{S3-t@4-XUVzI9t0&WoWPQ2 zqo_RuamBMw{PgH^*_3H1VgzKd!5B!??!m@>ofO>rw$;K!Wkx_*&Y^ne62Dp@{_Baxmn)2P%w zpvP~UE_ArsgMYIT?H}JdgmH9h7fGzkEX|;1?2||d_g=|846no79z9L6<<%^_EL(=O z<;5lu`wa?LlXGIwTyyx~c-q1S$EecrAK;P{m#y8|UHoA6ZPavL351>hxZ&ru<^neu zz7E(e;S^zzGoC0VLwQT{*Ncc5DH^!!M%ji1hbAcJAATUqs}T|`@USn)gI;DSyf1wj zM5!ciEXd)B-MWw?YwP87f}30RT^(E` z=82*GDdDGvGIDw*PLpw zBpwL78d^Bu%AQl!-T3XnQ^&F*<5&=keXTrV0R!j5+tsW%)373Gdz(!*qCv5oZX+V4me81-zB8E{F`hn%lVeg-{U=U; za3=x3pm#R(fBh^EueBKnLwH!UPB{!+xvwTXx_vp=IOzjtwzk`;;7L$e-5r}hFydhY zfzx7in)Ig*Kb<|?L0nZ4{>2->AyI}y`t$ioKpEP} z<@G%NNs_M37Lp84i#|cNnQ*A9A^rFOL!C>j@RUAYd`YBj(J<6IDh5zP0dbzjCDzic z+Bqm5(1p9)REV>Lc8z&)qp=pl$7dZDZFq3H75o-ot#ukI9WDPWTp0?uDeNGfL3ceV zfgMyrgvV78^szqg1AlcIZEsAontN((`&K;0iy0i>9vMm$z+S`fzRD^>#PAd)x~THA z4vSa_<`a9vc5U!k+)?o%{GJD8VzK~=(_VFtQ_67EUBX-SFG0`_WaJ5qvgikaU*F45 zRNXqg_zmrH*`2%kO}2TFT@7CQ7x26&=t;vFr_f18-6$78r+A7evr+ddow9uD#tl?$ z=nl@#giIx!)Nilp4rP`D{IRqU&I1f(^QKA)kzSxAvJqgFo1Vn{dvBbv@vYm2`?Doi zz15hnsWf?~8)=_jz_=^TTYgR_@h>6OZ{j|cHDpZM53#Sr+s zOR<0C+Rf3@D)vUkN_dj!*psdOn_bpsFq3P`4Py&pK>uct{VX%3H3;A^E3%7QgZ}do z{h+k*^n+i%#!kHel)DxZN|rq&rcb7J+kt|5PlqDr`V#*reaQ&j{!%jg?)h2$TXyV? zqooF0P7ILAy>xxGxbHbOZ64Z6mT&Us-`4wEOpVbKS27wL_n5qu=lSq1l807faZj!4 zUIX>AOmP-hG3eYnXdL3<2G1L3qc<=+Wc_IZ+&NQGG!x3fk?j}Sc5#=ZHW3~LT8>GPRl1Da65 zc~yFA_9*=aUAdYWPV*O`ers`EL{pJUVR0?`z)eOidE`vtPZcPhv=9X3RcHIL!v$n{ z&D4PSXNBU+MRDII%onqLlL^F+f^ie(C!zzOXB4QWu8D!(Id*wZ(gunE5NFJ==5!Wf zE|5WBTGHDde0{VL%K-Ns#9?)JXN_MVnw86aE|pxb@6fEiNOIsux;B1K<0x@%O+a`K zQ(vbKw*Rn0n`GLdFqOLbiRvUg@~7`b-mQtSlRD8Ia1#7^k9TU>lJ@q)x6&CAPil=w z5z7!Q%9!r8GQ8x1{y?>U&M@~P(8>S0J>gie&o|*#Fy$q*hA92UBvJ_SaLiod^W;#{b}gk-ZX)s=Dja&b`@z3 z=?vG8dUo$^MvQ(HkJgKrd>khR-`&z^D&m^e5I&j(9^wtkfQT$xOcVQ$M+1wG{h6+= z+9(e!bD}>RvlrMht4t^`aAoXBVks=Eo=#YV&zE1iGjDtl{2=ID_5g40jxg7wp4H$8 z<+jJ3Pa9*xZ;vCf7jo6^)0;KhJP_JXkCtyPAi`=B?`{oz-wygiCtvFZ$!$NJp6;a7 zJ21e|nf^J#SR}k~$SPY1guk+Lv33Am-*_|KjH5h6`gt+Yav}zqxR1|&)B_fLbFmhN zEq-p};k6ggq_)TS5PcVmk4tLUZTG0^g&iE1qJwwe9GK*%QhK&*+~Gfu99J1fgt?Za z`KC(`-Peg@cX^)y|D>SblF-q7dt?xPa*%7;HtDFAbs!5#nb)NK!h@--$uF&wzy5(DWA)u6>M<}x_=ho^M(y_?g=4{ri7aUA6enhzdTBD;Bx6SR;p5Z z?%Pp|VON-=EzAt}JE|F^3EDpyU8T;Xv zzMS9&h!0TkpB_dSyrnVnYjm<~POcyXk^dkl(9*rdz^0_IonSIC?O^1`Y(lRdV*{?k zUBY&F`LnBECsWbLgBzJKpT*~(laF87SQ$uUYlIUk!Y;Gt7Zy3yGwdX@yZvr!dCKRX zq`rV7xjwR5n`FiNBwQaar~z%qP@Fc^1i0yfiC`?G;jBMoZ=k(_B6?~wmo4~nU;ar- z1{5$w###*ymwTeWH}|iMem7Ez#L|RbJ5MM%eYKD?=B`0hS76GTLO~lZT)97@zrg<+ zIz*jWh|upVxc@4qN0}0*A8 zW}gY9pR&mW?hw3KPB+Wu10HLbkjOjt$LT@?L0e$@XqqHH&}Z_;h5)nr5<;Y9T6FW? zCFn;rmi9_M>>yWl__{rY@MdzHnT|ZZ=kNCyNU_hDabRAq0mH<(&`+aov(@Ryd;SeT zx|A-`xoIbbHn$SI8un>R9qm1lbvd;J05Zf~8M6<+U%kQZ4i)R=KNBNmEwmDq323o~ zj(Kh~dQd|1gvz3RK*zU2uG>VAH9z<$PQxQ}qVd?|B{7RNsG`cu@_p7(5cK7BZ8&^K z{~(icKv4kv{n5gzMFVxYO}GC`PY^je)0M1(L9R%nK&~j;KDe=GO;zfVF7$!U&70Ja z*!g=Rq4qd;GfdrOzl8n{sc7G(MJhimp?L|=*KkTE92HMWL^0NZc{A_cj>Q38xHZ5L zj|+pQ&c~)Fx$b!&r+|oiVb;ve$`ix> zM9<1bos|EY*2_)Z1kS9QI$EJ`cK&`o4<63-GpTRQ7ORa={9<=IB=f(l4T*~8S4(%2dzVt(?&Cbk$$%@KFW5+8D&3%*$ZF7W)ETWaBT@sR zS<9Vgwj5{*pQmxUB^hPeZ*Kj3KG2ZiUisZ}Kk;Ym@xXk*^qv%=!>1!ATsFACz!C!P zge?~H@c>rQgZkf-oiQ4Ag|qeoDsj-rsX=##>*l&rGOQh&*BJkQb=C^(P14BZ7sO`B zf-p=kS1yA>BmKKsrMOLKMkwo2-1f)pkoUcUO37+N{Ui*vSD0|PtY^Dh+T9tN+9 z!Ma}$Go3$m1OM3`#y(AP4SI)51S|7X;Y9^Zw@97AJ+C&t?Y}>n$!Tjx(z+)^b%wbX zjmk6za~=xT^ovkDr*A&bf;bRDEpF9ePd~+D5D7%SKF!%Pon~&OgkW-G^bt*Eu6_(Y z?SH3NyLNnojN>U@qp0=qU1;-CCDO5oyC7DAL82sMX1>uc<05lwG;#76Bs_MVs zhL(vP#gSC7A35J;Lk$;$LLeDQmAI1^>t1OT^(Y2MvtkX_&^-42`fPk?O>Q`Qx5~(x z8QsZ)%o6{ruQ&*^C$x`gpUv{44J!A}=6aYK^~1cuh6Cx>X)d2{!5(%h!sNa@j(=KK@Ir^Le}U+9Rrt1Vyn9wC9da`&bSUUKVvc# z_gg;{JuZe%{5`eG_1E~+f+w2(>5#Tmg{vLUt2O}6(uABY&oqUFnQo(GtuQIpM-oB% zF9PE1W!VC$bt1tR10u~(OpqdROH7xX3397Qe`b8L=J>&kdNBN-cEiKVV;RcOw)~L8 z)GE6YHDa-Yy)KlfxbwN{o0R)dF#g_6czb%2nNxfV_M0RGRtfIxzDAMs z7oY}BoN?oeufO8eX&x^=xs+Th@A$zEN#Mgx=n{q?(ZP4{SO_qiW4ZEcHKMLxA0Di2 zCjXv@lV_n+rX(iEHp_j^4z77QE!|zJkbFnKI!0jxO+25oK87dnhgz?*K0LY>yb98p z`lShCup9Uy*oljV;VLLMZRR4?Z!vg?9jD8c?EG#8-$d#vd81NTqy|zr>|Yf^0}3r+ z5ZPuZ7=pOvv|U$QDOphjvEZ2s)8v(}g+V47JX^eXZf5Jr{ZptEH&a!5wHL5X>dG7o zn|&Gms<4PMXNBtzpqzsNL>St|vT{Igp6rUY8OEZ+Zuq)zQi=FyrihiB;69lof7~zI z&IKXSm|A8Wo;?akuq;B8a$Bn?!h8|;$^QC`$)6(a=z0Doq<9--7bdtc5}b5cZIwts zz3kWIKF~|YcB{tZ=s7z#KCTgwc>pkrZGM6D@3iFfn!wIGL={Jrt>lxWonQ-osT9|f z%5gXH!eC7p+5XZe9-x@8Ij)%!>PKGnRrZPcLE~2f_O$X3Gs)nm6sE9J!=cVhXrdoYOB2koxEeai!%X&H3yLmxUqY zfTtiLsAB^2FM&w^6KL2fVLAN=XfXUY(D;8rKL2;V@xL>ll>cTvoroYJ|CrA*?KWV< z%^l~(oUCvKB}SA2k580T(^7&gcK}YW;9ail?br9}&qjSmvz2XcX`^r-GAq#;CAGi5 z`N2;tyCxZ#d%hn-JrLcN28%qF=UWZ5cx3s9fzeb|fJA19MP{%@W~hg{AJKK-lXak# z%6+(1gOGLun08_?_Gf+ncCH|N>X4wEprxGPsf2d_=QA6!`riKMng18&`VYkUe{^pC zKRxUJ1#=w#7tG;GFn`X_g}%tVwlZ=095*M?!M`$JPBaQ7Rng^}xO_1%$sqhqtSTkdc9SQK@wz(ND5 zhxoUV{o+*K54dFoc26PJVt~lS=qdpf7nCDo2+Hic&}wj@^X1DX-w7gW|L|rYEQx^A z9m~hcGd*oCX^u~&b0w-;fZVyW|5fm-alI#7st)vaOSj{OKXTKG&79Z~A?PA-{iJ|D zQp$!13c+FCPe}^~VUNteU=Xrcw0z+jm(PqSJW5u}4-J1~e>JX75%^9hjngo3Qe8+I zS^MUQs79gb!Uu%mUP0*c!q_lNVyo-Bv=}fIfEIeuFGSS`us$k$AIS~7EaV%Dp4@_M zf_z>Z&=sAhfu)RVeKr~x8q15@0%oo_jkl!}l~ZpZo{y#q?-glpIRDfjaMko(=?A}Q zl@e-4E|c|EX9pcWAsf0oBSY5It7Kx%vOZ!B#2i7beEvD}DOHJsWcILKGyN)(e|@;G zo`h=D!Y*lc2BKQg&Ven1=vu0(cVR(Q z1C^hdQEJ}vn`%$8Dq-f0DT(WF1v)OQKK54m<`;`7(Y7J^cj}{>e}$q790!}Yb6YYX zOJl2;dg0;ogMW**Pn7ux-?GO`pS=Ypb%X$ZQC;>k5XYvK6eHz2CLsy3OANb^=|>&} zM5{diZ5gJvB2u5~km8@q0%_eI;)MW+5HC5-&%#ApoUtjPCn(ll3&jdAT6fQbWD6A$ zRa80=k$LD0o{7WWur=X6YgK{K-4$FA9{W4-dN3T2MMmkNlBlbdL2pK5X;^)|_t6ZP zXB$~Uep{?)%Y-5Y=iPBNuFlWmyn|523S8sa5M%DT*%e#;z}wNE>3+Q8IFWWFj`}Dr z@PFJ*Zy?|>wwSn^s;VVQ4UJs2@cHZM6PellNJZq6`pP@x|I|-G*2{#nG8^bFeN=tW zBtlHMYau)7Jw4~R3Z0f|RwP2hBf4DS@Izv!3BIQ*E!Z9FAyWK!R(hTb=as1l7M@pK ze-i;p_{(gWN0bfYNsGHBGwW!7)JpRyTk2y!yzs~Q5002X{x?Q3Mqt}8p9L9y%=TBL}l{Qhn zMxo%9ddm;RbV*UCu?-0K&;6F|M}&obe;bjJM--j(L)-S#+F^TC%hCow*S--HV{g9i zfh6Z>eyj`R#`vint5wNmP_rFee(r+~)VfzF)EpE4UV=VyDp9%1I#Do!e~U7DyAAfX z7y4}F^QGsF1Et)uLfX8A4^mcGO4|h_;=G%Mn~_Vbob&?TIuEliz|QFGtm-|hkR`yy zXiK~snf*<&=6r%s_x2`xQk{*Vw~YAxKG>3@a3yv=%tG02-AWQ(+-5+m%YA(p4_F|2 z)Y=-XvBLLkHV2+Mtp39LR*o%#qJz%naVNie~cRfu4>2n`+FDr zJCV~#wTV*F5c>T>cm8zNsKX~OUZtxl3{D=-lOn=`<)if81jZpj>{Qb#flDHZ7+k$b zbXMkJzdIw1D^}Wm1YCx`?fR8`StlD#45#YHZf$W4(zwP8A3TWq@A9AepFi`c zhp}EEZ$*|+W>u>r03)uE8i}A1c7tu_dPn4R6s$ULo}_}_P&Lx@j5x@*ZGY2jG{3Vk zg_lOHzmj0@FH=MS7ia6ogAw9OCS%v$bxV(FX6aZ9fSqB61eHq4i=U2?%89$}SljlG zM-QJr%Pa6VgS-t*7X7Hdo~U}Jc@PY*Ey>tSANTIUl0-V?lO*%754ffh22u~%%)vWx#%?zc67yPjOoy}mCs5n*s%}#rgol>l z>S&IO+9+V-hT>8y%zxuUX#F#heXa1gB1`;C!cZsqT~#Bzp_BdQns!|3r&Gq~TJ;Na zt#|K!&=j>D2SGOJ@T_U#BB!qTxd`@*Cw+AZ-w%fxs6igfvLFuah1ZP|lQl(4I+w#S z%d=?2v$PU|e31$-jo+2tOfB>d0xJcJfuWAz$EK`s$_fQ_U(FwK(zDT*n_o`ogfKsw z2wQT730myC-U~>S72BNJg?)dJgW|jSK`++5SiXkL#F}`zZhzHGaE*N5>Ih`N@svaD7JK>Qt0gMqX!+9Uto+e{E^)NZ`x;}EBW zys!}~L05^2h8PVR4vV*YCJ%4LA|I;sKW88AMycH_B zxZszG`J(y8KYoUTy<0~5)_sT8*+Zubp#wTS$7(Cpo~mayy9N)aT~w)Cn){f4203^K zGx^D>={?pc0o)-SFbdWBt3p8sM+Mh^55A0t%`915opGhNj`Mg!B>S%~e1CcC5{l*V z_u{5v3x{~^rd3}GxfdG9zn@wxa;kIkC#KTtMR7(FmFk+BIsx9BI(cu%+n5LXwTJ~n zOtOr=_-Lf+v0KJLns_?_83-=t-> z>bk(fC2AcMIVkr6?S~))zgguGdYZRu$x%E?-?$0!h=UILyM2V7RqL|cMin(`?L3!n ziqBpCB6)MJTVX@XgQ@Xic|~7gi|=F=RB$mr0|4p>nu(?KIsu#pqnpVPEAGA zhbb8S>#Y2=d%ETg+%&~AJwe1+2M$Lyu1$*m6)(;0(fwj1t9XY(uz5sWBYlF zMi**@Sf3kDz)PMH=85-m9tl&yLA}kmY@iei&3h88K;cp4p-f>X{So5Vto(v`+zYo z!qrVJ-V2(YSkX<5o?h8TLQE*VBeh`=5{%?~rWLDlLg#BoCi)qW%KPqoo z$;A>8+E!DP{W-cpt-w2!b+6vS+;h=1ATiDjVa4r4N{%EFPu49FC$s=btpVZ=AS}+k z&#HzCqJ@b*E;BlI&>xfcV;XbBe>JU*$qUuB{6%hsM9^;Nq83I9u@c3(XzmCpE&!u# zIE`lL*pD*`v-XzeD(}b1>S%xmyb{SNT!)joB81(n>?%sJTR+{n1R`=~Fp_?m#XHzY z!5J#aHIE#Mn9;nim|-R&L24SC-b3o;Ezbv;-wv8MJDmL9`;~s=Z0OAIQ@`n93M);y zel9fSPWp4@6P{4B>&85$Mh%gcevahrc?ddSE`3Iv!a&O5ff<(OhzUw3{d7?M?z&fE z_%SWPjUCYq4tjO}cvnroRi-$;F9AU+uWqCaJK&O*?5%t{BZ+LB3ubshUmj#K=?w3t zi~m#|A=XOz-{8n6vaV4WL1BXWZBZgP0Y?_n{w>7l&Nbri(bfL3`hyq0a!Z+M$RJb* zy>ov4ogw&2f~fThYajnaADT=HFP01k_j8neqAB`G9B)*AtA zm1w1tb7|jS(y1dl?kzo5m=GbY6ow}%m2W+-amz1VZU+y=9`+n)C|ONBxne34={=ph zv2_?HWq4MdD2ppACO)Li(*=<$&7O@WJC>UhqYi?(t=Q^0H)pp}SPc29B&(h@Ic=tZ8RsdhV^_~Pf$UaKdifcGiyw1 zSzdx|Ifx}&>v!0x(H|ISJnVj(31;VE=Wv5Rubd|dZ%NYjJuQp(50Yr04;AA*y)8kZ z+H0YSJPnanZ(I#`d$N9bSH<$N-pB{O#SfR-eaKMTb0fbqB-ZEMy%4Sra1+FqQ(j!R zWrhMHvACn?T8bu%8yfZPIQ#{LS=PN^S;WldP7e3bu}9?EIloB{JFsNn6tM7wNvwN* z<1fHE+?AlSJi+`68<^;8{ZY@d&@++V*`76y+z1hYMPe5>)qLZ&PeYEIU|AVA$jnUK zz`OdlpT*a@v*f@E(137usom9VNR;TkR}3OnMa#oxTu z4`L=Au$pq^Lt0Z-K}g(L-;Whz$fLPLASN@;5JM!b^#X}@0r4c7dIhotrmz(Xe7(DA z7FRyFquoa-*=t6!~7)lX8Wz4(&_H(_g4L%N3%y9wdcOHcn^KW%T z&VIjeXGUftub?|XuA5kGJ|nr^mJ4eQglE8qyWwUk+6`)t)j@|(;J9z=+`n-HSn(>e!Uiw8J2V}!KMJIRF@$VqMe_eul(vvUjIp_x zjMrw)d2W^Xzd14FBDfJ08P@a{Qj?ubk;BfNR!6rvB+WHS8iMCG1*(J`5wyo>7}t1d zNhvttr>~{g_AHk6QM!FJD)9dC%WFB4w<_Xs^7m+*pCW~;!FFh1P_`L*xi|Dj32L^c zIDC66ac7ta$ZfvLDhQPGW|K*d{H+;6;diH6tvogTpnU{3P+~iMzw(zHnsv+F`IruZ zwES6L$`bpOD9L9`P0`Y2&egbnuh2m7k#;w8ytQf+ZSz3kZ%*?o>AE!SbOR#8>{j=y zmM!Efx24R$>d0;8MFxEJv!?NM(&1?WW0;)K>eJP>WH2{h5C-Ql4)6y2by z0=ZQULN$_Fe8x=es^L3He<@K75vX;V|JgOUz}(MY($-@n>*H;ToJHmE*lB?s0%`XU z>5M$76Y_Bbso!j3;NLo)2WPyNUJ1_Mcwd`tvldA_w~TJDxkY*i;|)U>Q2Qxkf}`j4 zBqfMM2H*1oxN8x2d=!FtTLN%q*Ig#xL1g8H_!7^FWPR?on~JNO*F7BA-RMPXQv*8JxY&!IZl7adr?~AEwFvbT~Gy3QppbvcQ!xy|(`+g5^yK><; zA50D}{R-7Q>5C{mH%t0RkrlsP5HKmEWxuFoHVorVPo+F)+Bpv2)~w4;RT}p;svecE zcDS}kS5IaWMSf61Da0ZLIEn=vF93dSn=s3y3viSOhgKr$6pv8-x$HG777RsyBaieC&dpvF;42^on3}wQ0^w(H+bj9 zvzJU(bZ(d z5R>aaV$9r>3?yegMM|@b_6lbF+>AelD8imbxnfLL)1A)f;aISSh4wH#f^}Yy;zgq(Y#~T= z<>%7xkA(f735B7cVCMsR^!=1 zwrBbGc9UAwqvB`x4YO2;VP=Wn+xa93kl9!rhP1bZ1g*tZBQofFZAn+N2T$F56xlLY)cGKOPjg-K3?na&i<2{gaO1Ah=xe7_0nK1H z2^d$Tto*{w#qAoJtsof~E1g#uAuEEjLgnsl<#U z2hM!Qh^(6@T~fs!yn0{p{NS>#c@(f&hhm4w2V_^OAC#r++g6o*|17TwtpRQWJp~r? zbcL=FFRz0G-pnBdvodyuH0=3eQ{P|>AJ?6I?+VXL%1X5K?)pLwIZJ_2v*v@Hj;{GX zvCf-k`7wH^p%-tW-S<;5D&qvZz|+?_CLV7kG5ljwv(PtJK}=n0Uw_G;*QuC2FNgDt zyv$;WLE}<>tX#yIg`Wh_yNmc&j|Y<-!!stXyD!0BT*aDJdgb8ItGtMeLx)CdeRD3yM3NtO!&R`z0DrxFL5;=LXL}| zc((S%nga-%MBDG+1AQ;I`<6dpndLifk|LcCg&xx@a1SkzXWh3ly$Wc`U5QyCXUMJ`;Z zRUJ)2bcf}!nbadYioHyvU>U~ewA7H8U#-QoLj&TJw{fzEn!~gnSxN9%lIwdbrDUbB z8Ed_H$0cotka@6rJ7kARtbB|9~0R7AEHZvo!Xl4=0JxsNbr7(Xy_@5~_dW%8$c^cDc|JdRpK$a}eKG@9r+h6>*hH{u4cdHNAV$?NyP@02<2is7XdOAH_r2L*GWBtJy}; zxz+qXnr&b-WkBq$&+r9|0nG5g128QkMg_2bsD#qfiY(_+q5FnmUfwI2OI)ul{vUoT zAtU?G7Q}WoKJTp@1V-x*XRo^P37%4y==Fi%1tMTulphcAhd}y6W&y#&zh>f)&Fch! zsH2U!=3i?t zq;5QDn+VLN^Ywgb#g>!01EMRR$B>o{=kk~1vgqS)SFg-p(yyW80gU9lnwDUT8wDe( zNxum~*6%^OU6D_>R9GUu=GJce1*mpS~#)EM!H*OtNG_;!Es{;qp*%rq>YjJ^ym znwF{s@+pYZD7>(qQ^7O8Cic#kP!PGc*)!2@+YRHE9O^tglNmqTmF-u~6W+q7Gv_K! z1ud6MbUWZ-bH4^jY&&%#VO{#5U+1IHLm80CZ?Ao*o_TmWcc3*j@%`4~X(pxv!m?oD zD=z>owt3fJUge@%wa*-7J{;1@H@mlAI>Z@o1km_-ZN| zu~s+rv=(lko{N77D;4`FeIZnadK#s~g(-v*2s}uwbp+xCEk@14cYz=wqUk6x;0=lrf z4dfq_e7Xr_Vai`x@h}FM|FpXx)$tN*+U~EC)K$p=fVz8HuwFMpyvFUF5V=E5vEMD0 z)YG2Y1x6`@D`^?tyqE%;Fex8AbUFHy^CWK?>9P!H*{jjyPLpZ%o!8sVS*@#3wK!dHn zUm6ew%7(oXe=;?KlQx4Vz2MS?ra};40_Iuq;WR7{Aipv_p{)1kZU$cIq>Rotn?}{{hs@G>ncBl&8}oAmu%y7vjQpuxjSFw5OT?v z-bA%ujyd6KX1$j-TsZpneGXNJS&eRsl=~W;=250%c3iD1U8!!iZ=J4Q!yMu(s0*OZ zEgGJ}??DF~XcGGi`wDl9Xi@ta03EOQJZUL>jn+O*sBOz{tVWYbPQAAmIOoKe==w(_ z!@X4yQ&;!^MMZH*o3Dgna$eO!CTDaUxBUCCb@^PW?m2GZJHDH{km}liGV{Hl{vX<% zRF*ZJ09du7Nj&T?GGiKLO73-47}J;QH<}o6cx9mt$IUU&Zm^RQ7EAECHZvCenWV4_ ze8Q!jc9X5QD)9=H5&}O>I{JKC97E|8f>i(b{*?e5fBKTXU&w_7=I)a!ru$2MjRq$N zWVfcbKlKVEF^Z>$sHnNooCOa|<99*fW_%XG0Z3{1o{15)l&7&if?x zUM5u_7FxOErUi4$-P!^ivCA%;iqC6?-~au6ietoxdcv`*aesAfCivhrU*VNW)*;9L1TK;lYU(-nGC@Vh0(+dEu^JK**kWg!l>y92U zgjf49bE-&&uCOP*e=32x*65@2Uu*{-^I@q@7)Xh*xgpdlJ7VHj5yU(Ae4)|Yq_J1k zDBpJ5?S44FP}0vQH7l1Gx7mo}@*S(eLS+oSMzFXLGzilVKB|kx3U0YYf!-vB1~Tk*+n;bT>Lueni<2 zL%4qn(lUam0a&2ov)O8{%D!Km z5>GE!E#G=Oqp+-cl7VJzBYkCUgqmBEI}Gd+VcBp;|3)+fj--weE63Kokll|ALL;gD z>6NRV!OsHbpPet`I}gLjKAx~;9?p|UCL{x`-0N%*#AJM&6*U!@gvwu_iJ$mbu1ZFD6# zRTu0-TKt#bBmosV|JD=dfE|N!M=o$DQA%3Fy+olC@HGdJy-wL!P8dWHjQupLU2ss9 zyv!vT4}T-P86o|Z(B2tmr>gOPjEI}u@+UA}>@B(nit-^0a9grG)qd+x5K+)^~KgiDbvhmM1IC_>!TOl3u$ z%~kJL=y0jf5ITT`;PvmXanz+)649HY%#e_Mg*r2}&F46hW#SUCG$XI% z2r5}DNmx6n{fd^EvyW_c_!OoTpEI2(KrqRyK^>0U%@TANH^jmJ(b!o4)wN~o8Yj5B zO9BLk;O_1Y!9Bs<-Q8V-OK|t#?iSpA#KiHV-;hL@q164 zCV(qjGDo7H53^{ z2?}Xfb`a?!m|M}iu`0=#s=|b=q7X8t>dKIJJiU=9Vm}*W`b@`yOK5510(*OazB>!o zYVh)`^>AmgyC7%PzeAfn7q!-TtcItZ%#WF5k8I_v3fGQWr}aK0>aK`@kr_Olv?Rfa9si{)IU~Pp%J!>-nKb=Yy@{%U~b9)g`h52cx_9ch53q8FdTi zrQXnXa4ic<@I%q~!mRr2)3edgN7sVHvG!=?p`I_uE70gU>NJ(ScOlc_@1ON*+;#3W zMVep_scr@cXk~gD-JX>AX`yv$$AOJ!I_aY*xN8^AS`6scXy&222futFlJt;H3GPxgrPCa zGKpI!zE>8Np*lD|TkS>=fX?`A6lQr?UVAu*NAwoUu`ZeQ9cj)%AAc!`sLOj2EEA?@ zizNcd72J)~#4+z_4wL9@J)@d8!8ltaEr3nm9W~uO{@7(n-&+aa8(eYK9o<$Ht3+6e zxP^JH11q{}Nh@^U7a=hG7u(-423JBiXJ$EOjmng@|-RUV)og6=*m_A z=ejxcgLO)U&d%@_clti`v@$7G%_Bt*4(XGi%SVs`or78DJeQ!SNS#>vPtdCZPo+Ce zB=h$;43DJU{;F2IhxL=E?8vx#+YO0mt6{GN$(KARkUDk@JUwlVIC|AR(;DXja}8&V6YM^?PnaN>Uny$RpaRaqf!p9J-g8l)?-RWgyRaI)VC zkpDbKX;#^m3#@3uw$bJyXo9aWHRoVVU0;u5($HOXCE=+sU&!O3TgG#;zmk-8~De ziH5K`k;fpLzyk$J!tH_*TX|pgRo=_H?@~GuUK=-v7#MTgo|`yCaN6>;9(b0p+;`e& zxv~z}_x%p*C3#F(*DOgxX9OfY8>IqIc#J6b!tZanCB{Fpmcnt0!Qi@LEdFrqk?)HQ zgtZEae65%ws&^P^|6R>7D+)d@ki8K4Fm(-f_j76UB+$nUbQ_ebGCw(}-WwM6Wy~ib z3v!RU^eV(7bp`u+dy`A_`BM*eh$JpV#7X{@1KHHi`&h=N+LKlj#5`8# z?8OoYb&!_4#tm|EyDI{|4LNXF6%@_V>q|X1kJ)vA5v)~H5&3Gte9+?UL`YNKyFhqL z=AvyfP}9o8=u#H~QWci)_>+Pkci<=U?~4e`p0KuWoED7UO;a*UEe{v@_%XYOYnKGl zalYDI$Y`@oYsL^Cj@^9YvtDRq{03{4dB)((F&zXuRMq_T7;TNiA1m`J5JJZgTkgI0 zJc6b6O>yt6oNf=!OTL6avYGoT@z?DaW(7XYR=4vcLAKI&JN5AA`MNHvg}%W~Y=TpJ zcN{wpbSZXCoAy`lf`nLF@MphtPQ|*uQ)aj;)OLIZTfy;*0XGMXGBB7VcZWup=XV_b zR4S%qvz@S<_pGY2S7p z(1AkMvnX7;FAG2vv!FK-mig2ghkgy0^VP_*9W%>Ea62&qC`Y@ZQr@O6z8vP#sMZL* z9;5oIT;4QW6S+0ZP1bszd>O7ZnH#|zH+e5=Mout=3M3o#^TLHb5RXMf$lR(-;69`) zc=Gy4ArbRBgBuMz;|1Ut>oXRJl9p{{R+V-|R+SJL@B(n>wX>Z>d_|;ZB1U4Hy(8$| zVQ^6)IYt`S)$yYhD9XjFsTK|hG#`r7`s1p^O+ z*vZ^(N*j)k14Vl5;n$qW@J4W86ic?iJBtiS#4&o@@2D!v^Db@-@!VoB&LpSWl8i zkuimi@^<&7*uZ!1KPGB%YLXisp18D137^W6*>OhBr|3s}EjlEByvM2>zYkbI8g#-( zWQb1-yMmNU7BTPIckGIqyn8zCKJPj4pkmi83C37p&KRo9B=Bi<8p&Nu0NKD8CS&4H z&Hj4Wl-qh|X!f*s|BW2H4ZeX1-?{{#%x;8WD*XgyKm=9)S^+Z!l;G<2wb(1%x90=u zODUEBqNs9PVag(KOTcx_ZfX+@!{8)*Fo$WByz`E!1}FH|%%wyRD0X&7>qVZW8k>f8 z)PXAcbp_s*;q6=u4ns7Bb9*>#us^ZDw;J4Nv#8ZeoofDb!i<4)Y!6!#%rIQzX5DP? z83tGl-!!-Ea|2bfa$L9&>JZma6!LL&cTL)JWvJ5zplgIYK%_Ms==Y*+)nq&*obNId_RK;)x8E0M zmw0{M&I0QBV4)Q~q||aP%E3q2rD8cE;?15I#dq}ME}7q{6vNLU({z+o^gIatq;hNA zdD#BGzn}FXX@h32DGlK^p;^p+Dof88pw_BH+ESQmc!+-kZl_(UU0HDyYHN;cwVCY` z6q&FWko6_$G)^9;wn*=g2S0sdr{4k;MzeyIK{d#h%`Y^Eg6fEs)4)}Z5zc{SNsoIU zQ_wz{wd;-nyQYP1Vb?&ovsD`fe|(O#lk&K|8%O-p8i}G4i&=K3f#ng?1U<;KDHOJ> zGRpkDgSPqikKhY@MBKL^3e}j4gPsM75EWL|ZUYliELiM*y_{*O5cH2$K9|RlpP~rK za7pmZdMw<*Zz#P@qw4yy6vRUy_7|b*5e5`=@142|EU&@(#lFLmK&w<=!JWUF@Iusf zo#sy+mp6!4Omo$K>J9K$H|*ocxa;Yfd9rziXAL^#{wQF`CUeiy!H7CFACjK1_%4*0 zhu3VqY{Q@Wlc>jI>(VYP8aW>FC<+$X>DYt*?n38^WwV3q+Gs7jYy@Y2@dY&>na%jj zva#Cy@(Wie3px5AfyDyigEL}D(`3X_b)Gj}PEhJ%4jeUEIoDO~aKPxa}un;O+bBk;Q#P6Fm(5b{shQtq58aQ>ygL5 zB65q;S%Y}xA?H{;ywjGZ^0Q2E2Ziz3o*sU4?0`DXx`#r~p)}VdU9-C>qM&Z7x z>3m6?vd6wnR6uPDwOjMrjPPqMfLU`|*ky z8npk)OZne(H2yF+_*IR};+Mfe{}b&rFi@ZM_hXtl^V%;tR}~W540F_!;ti3N6cYXe zT}oX`);+k6DzLhxy;nL_W`kRm@!RmGW~vcIwvEW{n!8P3cb7n$D2+$9rzhLTAL?&P zb{>0dC&X};EE>=l8aU-rqO3zk-%0Zf=uBemgJi2FrKD3K+Bm;(5;IA3Yd9kDFa_2> z2ZDkmaZBDy-M@$|yH)IbzZ@qPHV#W8{*H%Z+*^7)1B3aE>4a28eSO!)MpVr*>+{4w z4Y=^>Ed==XE|@e*X#q$z+)sUYca)z%62un`o=YHlQz4Wo$9vHvp=shRU%HmcWJaI4 zz-S)KntMZVL6m06-ZdI`Oj0#}5|<6+-?b6@Q4Cca9|j5+{sA_ww;`w)32ad*cLy3= z-lv=3`j{*$L0cA~Zx1nU{H!_cE5w8*#+d1ZfLf+qKo1@`_3J}7Q%^`$S<&H4JlHJ% zVOPI68~*mRIA_Z=p~__3jld_JGe+(mxYTh(6qAplb?eS;UG*mkz^QgzsI(yvDaFAS zrV}hq>R%)MQ8snjKjLGKJ@~v|Vf10h6R72DK__F;Ax%TE7c&Y>+@dcSn0n_K<2nW( zf+ZdQzFuDuW=L`~bT4LXtsxJUeS?YBwYl;0#5KOilR9K@kQgZqtKgHpx?d4fnCJp= z6^K$blsprDRG!F|OzD~#f{CN^m(v`UxFbDJ@B+yVz|(jb{XyIC^`qK!@s8+rvv~tf z>VRHrwN8`m^OZ6HcR^rL5xNoH4U4v+doIZ8;^0dpUnI|f3Mnn5WJR^B2qy?+w&mW- z3^GTgbUSsdVl}wo&}xq+S^gQu?{i8!21F;@6qUb#Q zF`m=m8<$c07n@9NtvUCV-PWZ_i2TIxVO6!`YOsD**8BO@XgQ2nwrx9kVQI7b#YOIj)CcZ*vsPS|RYN7kt?oGH%q|-}Z@m}o(1Kd_?qZH0_#XjU z7zfiXI@F{l43!w6`Q6bjfI9T~dtboR>@L7$Lf#^WDFR~QaZu#k;2|4Lg=BJ)ALz*A zi9kqY(ffS|Uzb=rBz1#GESd9O7Lqa!TFxX4)yvow%CHzxt7)>Gsu88Sv;GVm@MLX( z8V+Xez)L3lSRy*BQ^KD0_e8H^H178yZaLoVOxZ$s8g-53pKGo zheVGuL*pH80ldmsT@CeLCv;?A5>kf9^js~}2ai3_0@=7#)A?PdTiJl2;ifiDww zI)H_ZxNQNj;E&s4!{JwO2|%v7431OPzi_n^ z4+3R#B!w@Vf>nI_QBv$y%2(_TC7`H=i`wh|!p=Msa7>x-&Pir`-CINZXF?kD_I;a_(5oiJ(E9+^6 zsIz+=vJgNVNprBr+wnSSKQcmjx)m@=Vu}Re=We)$H^$6|a4gpMO^a-)4qBU2eijID z)%&0ZLr>n0;z9sU@3m`tD=tW+>QFRfckY88SAOScdqODBAz)T<&QgMvMU&jq)sW4OtI z$TNf8z+CGcL=3Gl14(czA(Acvv3mlT0td@-in>xQumDW>A-NhCa}=-;s{voLt(DN7 zO3~iCyN-ixcwec$>P>ny3wWqZUsrE{E~x;kY?a z$n)|SWNv79^42e{=#YNHEZf9;^LAbwt9zi{8A zMM(`8pGJ6LSu?aNOPlztbhQL)t$uBaV-3askrCf~2=~}WoWLv}QU%-USvD-vJlHpP zJ{ICN8C=I8znO+^Y)QpYqXGHnpx5(dXlGHbi`64%RBb$R=HICg6WLO%wRBIKnB0(4P2*~H0P6(x&MV)FkXmid$B=L{R zX+QAi=B6KiHyibW3+03(;=#3nrYMhbT?FSx0ukTcfF1{Dym1wAva-s*63%Xe11$@^ z#Kn!$Id(ifV>eIN11fIt&uo-^r$@h6Bk6{O8QQ;tBwhO>YG1NVt|>M^O@+YhTSDYcc)rY z&k{TD0Jj^lFb$F5GQ$PpKUOu$ogb!@F*9h7j2zuV-FCH+rkNkMzMy(D=^L}im#=RU zes}cwz_WajDFVKrL$A1^y#l^&53`!f@_@>HKH#~yo%~=1EH2o_4S`t!Wm%5@03`Nk zdJ`F`0&MMRo#rMAgS*0l%A}0r^O=g2GZkhJ(Y1x0Yu}0Xysl0M;pPx*&e@IfeLX}Y z#pn9Mtpjk2nNVc%IQUj~p61}bgq)-2m`9z5nzQg3w?Ghvz!K;=grH*50VY)X-6 zU?criVJ^z>(~OZd?c9jlK)A-w?X+kxKBiGL^uu>4KE6565uf-pt_Rfs&zP)j<&wpk z;qZ_2hd&eN?xR=Y1zbF}9XoC`=S!!3F>_PqPbD3T2;|Qo=f-HK)?~xK)%g+Iw)bs- zTAWWAwQt41wGv~28~yOf-v!48&b%b816h1G%br%lSnTpcNKrf98FLw$js3F9 z>wn{U;sYRmW|6A0u=!I1`3w$FaGhwV() z@Do7-K?EGO#dR%7^!6eDL{LGG0FW?>d$NURZ4La9*UP^430Bpnk(ZAJH5zc zw-ff`{L0w%uA6L;fK%eBZful)2!fU*jL3ra8w8MhoELOX7Q|Ip?9&_cW2Sh%;6wUk z7pc?AFGTGQ<+$GE4xDO;9fj^;K*N4a8j!)&IlfRCM_pjqU4YIs&s;EEB}tf}abF*4 zX-cr`vb{;SnQ!_^Aa($Te)}F;)n`U9qzH zDHYa}CJ7#oH=^B6+WB2)y^FAB`-t7|Q_l3oHnW z)=y8#)l$&0_d>qP6jn3_Ti$g9Sn+_2QRZt?aPgb{?+Xh~mt-uSL6=`~<@M-(3^t*X zGqlp+cXutxAkb`TKL|qx1M`6fcrd#dxP8r=uEG&@27$O5@<$w19WMMi2|^nHNZENH zx5{mvoAMSFUZ0*67q);&YcNtgF943TK%ccXTz&yLad#QEf+Wv+MiW@qH$KKOLz_J8 zp45%P7!!4ShRRzcUn0{y@WvZ*gSNm?vpQHoS|NI1CKQYi<@lhm=KVFmJZzG6LA4xV zIeQki&uFo0fdDazPi=DhLpIdy$qA&-RX=Vwr;!rlOOM-glfnaolOqit=?vzA?PAD8 zS$(N%!Uq@Lsq=@q{>RIa7gdV(87y3|{)ds=Te*%kQ>%f!5$jLXgx3O+)lkITG;UPM zAIxS2s7kxVmvkq z7_q|_+GiKkMHb^7#6aJ*n70D?Y$Il$QD0lwNr zKy1m`S^JT!v^(>n`}`8mTI4+A4WC^eJ|9pz6wNB!TsWPDa3tDZy!gBf{ynm@{Mn6& zzudkuw+0(r{zk7$5YRip71C8_h6C#-?ZcE;i}!OWXb|0<5!gRHU2(?MRww?G>$)|L zEzf&SK+HF8ym!KSG?t*0NWNgk#;NyfGJvm%hqZ0*q-ZWvGXZ{#;7jY%IjBxfREwuk zy{sXM>2WB*CSExc#u-A^h!fYr%o4GYD6$y)ohrNRkS-L5>`gPn?o4$7_XK2nUhh3z zOp`RjQ>04EA%?DeA7=E_&IZW4O@Yd*bDGzptQZ}WP{Hep@|u-iNJvWj&Hxz+_NSe3 z)#*z9K^Z^WJQLH{fIA)SZQD4;e()`tm9KH`wACdp&%!kCMLD}qn%6bLpRKV2xOcAv zwD>x5uFGzM?xi}?5A|94!>i1d5^{mMPg>OxrG>ToZz#F7ivtLtOO9M<1Pw|v`Yq62 zD?vJc{nWIJ%Zf%y72ZvMLvRbbl1)9yo2p5fagRr2Si}`R=K#;kC`8J9;E3+Bj=AjA z-wHV|pg}hyLf(CTyzX3w6r91afGdqoZYE^y#bMsE`^58fi*Xv>rGbNKB>KaKL6)sE(w_FSFPp*tUnVm3@ zedY!lbdnMXMKRn9s6>C>+~>C93{urvP*{sw=Rf;s4i^62-5QBq4aoJ-G9p9j12O-x zN??8#E#Zb!7=Xeae!9$R^cvJQa}M9K29wYC^NfD1wzKeu2BZd8Cbsp z@6dKwMh%#4dq9ik%M~a#D+bgDkKMj(jq>{@5oUKAiJgn|XC{-#LcZ+^ZJvHWjLcn> z3~(dB)KSE`%cSbGY4OT--zqvrI%T!xMclf*6N6)*!(DK>f5soAPqri(n8mhzc`a-{ z2@ftKqs`#K6*O|%@YpPt7qo-omZf~84*%zH355}{~5kH|!b&%RN%7)`A3`vZDH7%J84>Z=;xjAN` zGf`ed4fUDR*J_NgRzo@ix}Ncq+g!i{(zA%N{RX46lmFAjnw=#_i0a_nTs?ue%tUpt zs=!CdJkny6kmQFO^Gnn^f;?cZ38Ry~J(}(+=Gc@9HBXROCg}WdoC!{j2(A@-M4LMY z%zUlvPLyh+)m#L36PnSImGNtOc0+*Uk&--z%a@YyW=C(Zo>hW!X*P$pE)6r37Gcz7-~#t&jAL~G0C!ihh#_kz4FqX^=$Jqlvgce{2_GR3P4Kk&sr$}jQ_L5sM=`4LvY$TcJC4vUtEO&ibbyD% zF>Vs(hpdDvRLjW@AXIKUW+wW4KJtX7rw+rNHuo7#p>(v5amAs{%ej}t@`6 z_W_GKVJS9ua5Fk2ZW(d{FTEq1A}QZJ6TWZB7)?Vx`GE@yzeZOO+_j|RtdqxA)YpCc zZtkUNeHOdCwjKxm>BbAtUK&b@_`LlPX_E$#zG>zI+MrH)Htf#jQHJWii%=Dc(3O3F zKpql5)2_Crc zSTd9~oS`H?xOxlwEe)}|ap_tY3^XGAiudaS83&`s+WolcfpJ|f%*Fy{oM1Q`0v*w` zbA8(eP|m|4ho5+mH;SLt6v>n8HXA3|!xG@#wm0O6I}^HxM4qJA(N+F9vG7G~OXQGQaO;#JJy$17)BUO>h!fPJDW`~=Yp3n% z(5roSMK;^JjGzXQpC5&OTeeWt3)!c|YMz?Y#i60RxyJ+yL~y8qAKr45V*XRDfp3OL6ef zJLHZQE*H*RxHb{Q#7N;yB)<8SEM+E;bC-ffaB!2;1ErC<`!G84*G)|#v_vR?v?$R5 zcy0-tLT=5HRQ{oWdnA42+{u@1Lj?{=KB^^cynjIQ8nz;L;J{B*03zpC) z-Qx?yW;OBeMOjtf^W7~cG4)JsU#jrOfw){1Q_RAcH^)l$B{J~APd4gg8%aN=J&nom zf2>5`A+4L;GF`dbV zl+Lc^$_G+2LQL<*&moVt4gd`25uo}pp*c8`)6T!K|piJv-1<+VObFb?;BsSKL#_NwP-A6G_WJ=}kO1*R3QMO3(EY7`oGP z2E%9gG{#P;JAgWFgk!0y-2J1Sw0MLX7M)8nvS0tIgP1L%MN>iqJGwcDZ#sktbcd?b zcs76|>At@A(IA5$%f}@|u&Hy?dip-1PwdM_IG?`JOwQQF0E?KK4=5I~*(C;WKR?Lw z?p9(Ds1@L83D?6uN0|uPs|kpddv;`HaB;Fb<9^?>@#z~^((xkAW;D5^w{2eo%tpd! z6lNU^_Tq@x6#;gVGW2CYZ)ilZT zAFGiZw39O|fAt>k`eH257zh@})@DT&8VMYjDvW;0Km7Ek{SV)ga{R9#1>Jv-x&5W9 z_^+Uw`LCc`=)Mdx5Rgc1Zoch(9+f`zXWQvdk@;I_?WQ~Q3KQ|5IbmRf@q-;5lU54V zpN)z}3e8aE*p1k#q9hYXD5~iY(#S!428bNy1J$LgkF@vPT`gUuu=*xVVI5hrHL#LL zkhU%c=t*sGSwe6niETsg-n%KwY0+nn+|9+R?t-UX(Xb9}SkJm6_#?NlB-tfjzBt`Y z;Etfx8u_(xQ=L1r2F}Q*eBNUV)j)eT{;0}sx8;aN&iI{fi%mt^)?8Fs^Ji;Zevdi` zM@C6qr~aLKQ15Z4@`d6j|3jb&@|;+fhz*(1y((JQrflX3M#RD}&a*GV>kF0RkTYQGTPT1MVq0~%<@EjzokW1FX{CMM>EQM~~ zP2Ie`Q_5Ub1a`uoFzscXxfiBKm^#&~OO748K(-Xswl{&PT{cycTI66%MoAdm6OW<< zAt#i8ed*8zr!8H-g4mvFg#=AS8jM_=(pchk$C9*$RS21_$)bhmQaadOR&1#`C|2$d z51vyfhNdcbet~Qog=?!@%9$^ma4e{=D3-Q2 zZM>AI;dcQOdW*P8L@&2XPiTF^abtk%SC=8J;Ektfe=C=%E$mb+z|hOGZ>`CvTR&cq zg&IZ*j!fOp#p~AFqSLwKR(_9@&5YU3rdQ-|OXsKppQnonfYp95Um`n3|_yVphp#GQhwCHnd<=(VA~wqKVQ@Y_2BOGgXaSHo;GLv0&f zyZ`U#{U<>-g6_TI>s00i0|G+-b^Gh97jVSu_kVb9|A!OSpNwf!JE%~s*LygDfN+0f zd;|poGBPzZGx&|6{jdDIKS{!QojlsF+I3zPVf;n{#rv0y&m!n!SI7uJz1}x1N&c~x8BL2`j?(R>M6d}jr>y*y+mtm zE!yjS3_w8df8+e5`In?WIRET2D@$9$zd}Z9aXeW6C30Kv?~%Widi+x*=1ZZF=|7Pl zepC5f{qK>#hjRa9CYpfNh`f>Mv@|##Q z>VNF#e_~IDQ9c{J;2KIl`@hHPYU|nC*;!ir)hMY^5a>z2l5Sty?-Sa@0q8e- zds7PoQ~keQqX`n^p>H1dZ-07zpM@`fK>o2_?OvC>?O%y`b7+6FS@$9W0wVeC<25_| z67wr!|Bp0U{Z~Ic8{NNO9&dJf-LIfGVXy1qUzZoKcHl4I-&9)tH~wEqeY2r^vyyw0 z`uj+DzwUMa7gM@F$M&rbZ2Uj9zHOktE-zsD>|eyc(faRu#b1eiE4TVqD)mk5@7*B$ z?HBr2zy8M}|6f<+Tki8)-tvEvQJViN`L|5yKfB}Y_|eDD^=KcauzSHL0OAQ-P-vXHN0 I&)*8WQoP^ySX6A)1m5h7TS8U+Cb5fL>?3yOe%^bRQ^Qj`uNNXr*g5Ghf5 zP3XM}(jk%FQz+?qexBKTpZDx{=FBCV#BC*EP>tpKGoAX55EVIXE~D|NSX& z=w}|c2mbvW=Qz&s!Yjzr@0o}9D<`P$Gk+&PHBavlPL87-F@OL4e?7PVb#P>DNo>d* z?diVXdA~F_#X8&ei|5yWJX2ls%0B;-`w{x^!G{b96!b$1|FIyme&u^S?lCL!uhW=XW0DW8=sSWM6z`V$S_&%U14-VWl&No-% z9(YjMHxQ!5ScuE=yN=vcJm5*Z459STq-WRJmX7`qH1oI*h*-Y;BjkK8H_BE+|K!J| zmY_%a*;U7Hd_^BME;ahm`dHAS@X)2Ei*KjHM49!f;co~JYT@?0jy=BTKSEj|-}&jI z?W)FHiyt?@QCnAu&+1QDgEsNh@ZCX!E{UbK4LwoRy?epoluaii zThxTMxGkmnMixfAEYmeu;z3)DBX2Ix4BqdDEJC;3d$)jFW8q%L{g?QAAJ=ZX_OPqf z)<*qPX$f+{OB2Zq%3hL?OgDye+qkIF(utaiR)WiaFC3?yuKw>ccuMG z+8ybGS|MLoK|`%fyVO}xreolCTRHEgQu>1rNv5t!qP}M8QqBn& zD3H6lwaN?%)g1~QuO4SSC3utul|rf1o<-Zac~Qhs#MZK28xV%IzxN#EBHv{X@37Yw zV4h%v3<93vC`#N4K~WFRa%rUPfcyOZ#A&kTx%IbIrm-}aIf$(?+X7ke=G5B3jGRcw z=mmiTB`1vQ@66`W0eBOhnY;3M(mNEo8>CgY?&$~3p88x+_sELdLK8VLeX_^XGfghX zEz{=N!nrsrf|pJL8_5pi3JKursfnAz>Dog_m5b}p%X+w(S<@=S5qzV|<5+@Se~U!6 z@M|<(e)I>X@&F$ze^Lpj*LoCsxsMAvuI&+>?WCun4x|~L+`2!;xU^JK#R1*k+q*`k zkXs~9^A$SEhLpBUu!@`0?XJlzsQly^!@9D``(dzDQnw=RamdV7M^;8 z&P2+-3sKT*o|s+eLF>W$4?|1uJY(AMx#8#I;yWlOu9-B8Ty;VOh`hCRy@Mn^YDr-J za_1w$>#oua^e3i#BNZ^GZ@ocpm-I$KZQkCxF@HmzYUuwoH?o#r*pVHX@fw8ssQ})y zD6yKpZxw$XM#|XSI~Gp@Ti<4X%~~CiU#t=&&!iRPSN(L!o{LccHo(jwQmr6!moFs=@Mypj0TrCBQ^DfH~uaI|)o6@b4v z2}(=ki$Jf;grhG8YP3t(BRDYlCGR7fK66JowNP+h!N#=Gp__oy`qGe%04BSIWkTO* zk?IdpZHn|!#N@F%_!6b3k#ZB@*5II6gGu#anC4y$ng_aRWq~oeMpKe_1G=cZ%yt>) zL|7r;b3o@8gfPsJGlsCDIZFiwmrf=t?Zq1@rT_;R`t=vvBAA8eg7P7E|<3i>L&{W^x zHEB7Z=5$8aDEo1)augF-YBB5OxUCgYH+?d&yJye;% zqX;oG75@??y?Byl6*VT0nI$KTNztKeFD1mcB8sPKQ3l9Sf`md)upR|T@K{2rwqVXY ziHpQlN{BV53opM$hgE8{PlRcwfK~Gjc?>orsf5z4pZEt^^^UnakKZ(#aLks2 zNg>4S4?S%4ij8ea_hp;~z{JSes{u)j)lH4=xu=P&d$Sp@cW>9e2$W(IU5&7&=a%GM z+v~m{^u-XVvwA8HK)ZF^Xk(j*3>g_COHDEF^KGBlwcXKNx2upe@xjMB7xWj?$rs|h z>f~WYv-ewTGae-P+)V5iu}gn>o^4W~j}IpBPXgHxwWXyq;pnKc3tWY@vfJO;T$p21 z^00y4V}Vu+=nr{NMjUOz!EZQ;ozvJX@hivEAfZW$Y*#;@OL@I;0BNpSyUi-3hl3J^ zy4xvl6Eugx{#D0!5guPqv!{;5P`uB~)TV zdXy(!aZjk`(^ZX!7N_-BX@xYoORbPa&DS7_fZ;sUL^Mx7#RXqH=WG|5tz)M=Q5_&o z(Xk@_j&%H^=`%LD`2z^&P1uzGfjf%)$W8NGO~uX>AN4&KXQ+23^6G1}VEI4nuM_I` zm=iC@Ba@r(njzcG&pQqE7GG@sY>Fa-6tWNj7o%;Re(SE-SZPyR2PfU}AFLmg$wm6O zg`4p%Nl-rH+{}L7^Z8{+2WVS*QB2(Lhy%JK2W#V+IH~L&Gbx~>OkvmztLU498sdO9 zfOh8}&An$yjKqjtrK@#$$jUpuMZX>YX|FoZg}Hx4$hXo69FA@T{_3CYxPh%xVqF;& zr*QSav>5T+bvq@dJAkU+=Xl~*CP(fjc%BCu#=g4sEvS|UL!Ak2Ps?yN(uuT2>WM{#B7PsmIXqj%-%aeuwpbhU{-N z#y&IuM);5+NwyI(&iN;xXMw#+TMacNL9QoJ_7Sf5*n?~Ri`Oh#CT7$+G3SOVoY|$) z{1|T?iGUPld9qK1ZlKC+lEw~w1|DdFd18R+xhOLi1Ci1Le z;@ks{4iz2d*^keZyMfgjYOgEZi9HR}@NEk&<2n=YeF?{?nG;WQ6`de05|Eks8_Y-3 zNjMkKL72x6+09tjr%Uovk)gNXKN1!bRxV0Ce+_Ck`J;EICrb#!_E6q?r1HueeRN=> zTa)o2q>7+6sMECSJT4(b@X6i2uob%6>>mEY-pp@KEgay4HdJv0 zM0$6A^nv4KVe7OW!zYj=y_GxbMYV)Gd6+S<1NEFD>}OdnLF%f_HCE3>hU1sx3k1B`Qa^=hcm=)<*7RJ7Kc@cD5X;Ba3KRe4{AN(?&UR2jo4(K25*N9&vohttp>f#U@-J8M{n-w4$k*EGqo?VP`^{V{lq^TaDwi~@G=7m^s3*!64d@b=kMUtPVSwyz z==Rd-5=PwSg}q2yITl_;j-3bJu zxV$gug<#?Y^4Yl_NoaDaUOzZBM$DK>F3fQS>bPI>SqU^Q_U7p{r_ah=mJb9iVlqiI zqkabM^q|E4=^-esTN4)TAGZK^UTqgNJb>ucUL{XvY&6=F=Q&)_25#YwXL^*z9CGe)~xzsD?Wq!A72Ip z^4HS~;wQbTOpu@1cBT#zJ$u`PLxt=V*KW2)sK!pgpe&d~-+Z}>Xj=<(*tDcIRdveX+q zcO}$|BV6mwn_p5rTPWmXQKFXd5nCowFa*DLX!IF4uB9^iAE^vsry7n?i@cx@BKmMi4pp#vRcQ5we4$f7T z{h%g&!fdDO$-_+Rv#RN%51-eiDWsp&FdH~~Hg9>U=403K@i9<+_Lr;&7wR?no@&19 z`WnzeZvwODDt5Q9tX$kK3`JOm*`pW~8TQxMrU)B(XO)W4$>B{D~9ENS*w8_?&%W4c=J!f?;tHLS_C|KF@JOH!&C8PfAl)KKPV=PC2uV_zA9f(6y58W=x{o z6v|9Sky|`UfL(&}f#K>KP-ITpRo~?Y0x94IU-`X}?QU+R>d#W4*OW#P-M@=7hSa%H zL*v}g1AjiKoRn2b3{)$UI)8Gi=?;%x@P6T+VV7TI17dndIOy73o7SK1b^n2EJ@y1@ zGCi@yp51nf$Rp8UV@h41ySAea4*O2^yS0bQ%pHrUt9Czf5H#}|BpEnTSD<$+xcUOI zPFWit3yC|G=%r)%ts9ZXJ$QMJEz%rc&E{TYM)+h}TBqFb(Ie*{$u`SbLMjz+W~|=j zfS$a}8LDy4t+(*o7p}9g9`&QE%j=YubS0&+7T{4If(NW$dy?Fz_6D?t=0kxl7}}e* z-AiW2a*299b(dOS{E$`nc8IYmhU?i-SgMAMox+54q&E{LeI>}4d43G_A}>tczPlyJ z<$|c!xpEoON`$e3{8Y)0lST)~7aZ`jrB(P?Psi_nfR&^(#0Wmfb8OcqCbm@=wmvg% zTe8dDvMOzL9ye_o1HN>|#*#fHcL=pFbO>7RUvvvrIC!sxJ4!x`L&3N|rwWK~sY4C&+ zGYOi)rt%HYV$PqZTo#b=n+1`UV;?DLQe!r3()CTwS2ZdH znz%l0fTrYh&r4KamF(M&LH01!7k>AjJ^vjHv8$h$e7I4pBkk*e>LqJmPY7$4C>41C zh?JEX*k8G)T0qO?hY<)?cWJ{s`tEhMU%#<2v3#gR%`c3uvw8v~z0&k}-I6&0eRlLWtMXN z7jLk7^hKAHDrRS5Ed2GTv!U=kt)g<-{ZlZ-2oR+*O65;%L-Z+oX3@j?Am7dBKRl&V zVhLRgOGNtMo7}q&H$}%$*n*(&&=sdO@hoG)ag&Nb7%;8z_y{!fhcK+AhAU*iT#hS* z8Iv3mgWOPBL*_%Im-j7;xw8Fs6aa~r(U#eUo~=9N4!l|PNrdGRz^=pl!M87*qWE2I zEM8hyZU^DLfu5T?OG>PhOFU33bGA$C(4Piwmn1$x?3=9#JJ`)5C^MNGBpiF()3B%`~8h%v2p^C8@HdC^;FLZx*I%E*c#{X)WE| zuW1unjm%OF_Uf@t#$PsED^L9sQ+>h8n0ZB2zj<-c_(h!auHT@R3(wQjqxwgE2Z9c1L2QDpZa$3dKJ9vF?uD>m z-td?6d9icH&#y&Fz@JEn!=Kn4GP(*bNMi$#xr15e_2}s6-E2RDhO7;lgRUNJC#AR7 zl<@}w%i4LrtS(3fyy;p6?*s*$+@sBW`3lP^);p!T!X0gA^0i~~)O({&uFpFkcCZ%Z zjIEM@dD^dYHT^9kJfSY)Q z^1OBX{mwMIk5+1>9L5IrKKtydh5MARX~6&OyTzNRiMiyq@5ofAW<* z-+*OiSb&~?t!8r#Kc{`8Nf$%tlKDjkWPz)Du%fOr?vQxCs2tTGDByUjU%|i+;9cs#XcNn)4_ok+B3)bU|s9rg3 zyuF1i<$i-Ko9DmPRT&if_CM-6`#;^+|5De#J^ugl_BH<{G*gLxcVSr}Pb}6MT|<*; zQD`{fg~~arXT2JqBYwKHzr6VAWJGtSWZZC1?wybKr?lT!PQEWcb1zx%ba{c{3n`6T z>eYlj1cN~dE5jkd6Sfm|`l!Lx5IqWOb_k9ef`i5Asa+hDKhQfBXOJ^L7oFos726kQ z5QMprar^51+!f7Hue~wLQD$d?3Ij8-)^oX&#bCu9`3&!3F{TE4dPeMbhy-Nm_A-qO zETbaN+%c|7M%J+zSFl1FeYy11v5fMQSGwL~kz8hQ*Q^{&65y(ac-YrS~mbFMEWUP6hW?8RGkL zK`ojqe|@-da4IZ)PC^~D`ii)0GLFx}(hifpe&$m~PUO)t5*J(Bs22;*I5zUhH$&dD z^O>df5$Fc-H)w3JzZ{*ofe@k78-!^MDQ~Hv6+YF|m~bIk=(? z=7oNmKLJ}@x9LT?ExPtIC{KuA9n+fA=Nm;A+<)7LqvOoFxi#n6hcFi31u-jh9V(p> zjn6`FSg{3AEt;kUIfsC|b&Oze5%mZH*9iZZ#B3_oZ>xAbCL8C-_T%5}QN_wHmYVZG z&5#_JO46d*H4&)mJas*M!~~W^4rE zvr3h*OZFU?J(Bta*81G`*_D%2=Lr_Rn6z#H8z?wJ&3v??+U@76jwtls$&P_*cC4$d zB-`9(hgaaURLX1FZ1aOf79^hkpTczoyct|Sb{%_})(Mi*Buy<)Ud5%4`N?m2ExsU% z)0C+jF?M)&kIy|d2~+QIBD*}etc$|-yv;nM&CbNV6XRZz}5n|isH?|&J!noB3Tg$_9 zQ&1f@%8>gulDLyo7o>MT%r>W!Q~ox-k801H0bc9Uu{u3?)53d>a?_-mpZFjjUg$yD zlNcX@_8YW_9T%o?hCeWWN{t6vq!~?y1d1=H=v-a{8bS6QF01q(+@Bo@Im2OREr@Aa z&CRU5X&{_E6 zM`5Yx$k*txSBEjaWnEJJUL$9S0|D~H-1?G;qqw-H#9(C{Q<(lh@JPt(5r;YB?nS!9 za?QyopRY4k%E%U2JN)Wa*DikJrbwO0Vh?gdtrMHp4Ey85S5jDAqR=^U`mtAYt1c^XNA zk#}>tQ67AlKu`N?TZB-4>Vq~i4Bg_Z&c4e7o4dAjaUM63!d@n1Dpalx%_5H!Ywa}F zXG7O*8@&YkYU3zems>P7gfHC_#+_@2IIBZbfca=$)9*i0NgXrJ%3EqXdK4&5l8!>4 zKPkyw59SRmwpQWW^w*Yw!DnA~7Ks%7l^v0HH*G*Ki6Ti#%fP`gCpkhkn$7{Vo72$Q zr^G7Oev9UNH(MSYIGyh0(02U~O0^SNoj@X^s=F8CAT9VTciy}0wGD)1?8Rt0R{Acj zuzPHxL8qZWK7=`*kh4l_V^v5yRVtV z2JY&0F%)pPUU+A{Si}`1+oEZ4<=A30;zr{Go9nV&m!FH#S}IPw_Cv@nBJaS7SNk?- zCpC|3ejT#&<=$nSi)9CG%P{SwaQ9-+?0{o1*Rkb?F#T@a=3IIDGX#!43_J?rh03!y zR*!ElduEG$L7nz|(=dr=Z`Q>!zk3?M;J?qU2n>auN_?!ElLwyjbUKW{R?2L94RG|L zl8<1*=`H9F0pycmrNx^};!MLyG_AQ|;n zvjLC)TJJ)i;4+)J*yTRD&TCN3fy9E@ZU*|LX~+_3B}xomj2#o~g6TV-0>&UEe*x3( zFlI|U-Y?O&MQGKkX~dT+b{Aw1vKV}sC1joe?ucAoI+U}84gc84aUW|7Or zuhEUO$x*b9s8lb_l!Npd0oeM@_Zcjnx#e2Yrcc6%^`1jco@M7X-68NYZFkdP(9gqS z8fPE2lP-t#g&zbIu%W8?KqJC32K`EJ05$;l9A8;%qvn+jCh%e{4pSdY^x77Rs*M42 zCefFmSr&Nrbm?KhZjTq*WOJ&TJyrApn6J1U$CylKCLZVz8RniP;I~)vP~TQ>GoX7j zHyfcg%k0}1Oc)ljrZkDh zb{t3Mf5J-bD#fnj=H3LtojJ(xMFYoa&kz8DoGMH!O_KH2?4-;K3u{VUz#&un_?M5&6)z72jz|$Co3Q|J>559P6 zu^Z(XPDN{#N!S376lNg;L9fEu?z~9^k~lLv)lG z$O{2~&0xkk%Q&pX^QIrZXEubaNjNAOXQfOH<5MA41yX|V^@@C9p>(mr%o_DAo!cc? z={9sKRLA@kt4l{6z*b)84?QqDjUCvFs08PF#TCn6x4?;y0sY^znscP@B0P_84wbrT z0N7;Z&LBoAGbH32<@{H>X3bxQqBtQ6?K7Zn@@7WlVK6QSF@weCN4YLHQUV_W# z9w}f*n_6Y=^0NDCRW=H{(U}n$i59gnyQM4ZoqoR56FXp?Xi4wlss;AU_6-(P&w}x@ zU#tQ+rqb)QjN#6n>8nN7uvZV~ifkr9L-^-M>y6X_nM!qGdT!Tl(a7#)hP+kgFQh!; z{5fR%OR}oU4Y?}w05a}GgxA5QH_u|ajR`HtW0j4och+2a|=TW zU8%(joPY2tN{|Y+=*LLr19^SPeWA|>qKz)sjYiqM9eF!$=gw#V*%&TZ70!>$XcC`6 zE?<0tYS3G+Zja)mJmp5mK2SV2bwYMgb9I&*g1H65)8blU7i$5|_8pd_ww;o?j=p&;nf z7_XAK2%mUGiN7uGM=}grxU61cR%vmf6NGyo;OlW@oABs3J)(fZzfxGUTPG4!TEki9`X#xGqW0-S>ElbM7yI~G&Kiq!Y%1-@o+8`C>#Dze$Qnf+oL;i&maeJT|JK0 zE?*T%HBD8$Whd)=Y(jLOyWEW8}5PmZEB210d zOrF^S3wo#(08^h^CQi>Zql&ajr=oQjQZT=VlSjHW59B70BSIyK&ikbEOK6=FwD5=N z0mm*+riQeN*{HK{34GA;bKzcPT9Nu0v!RDKWQ;2W_awfkE>9N9G)5ed%0|@t-RDP%>oJCzNpT_AVguil3~&{pd5;~u3;Ci;rLVH3 zk{I2G=w07piEZB*7wMzY&*_@?JPtt-cHFGMDx*W=b|{-v)@y)cNgTyNEIL$#|V0=Nf$iTT_g0JjBP_!vp`eayL!ZBQfMVYyuzeDprKlRenHq8mM9 zU%=E#jtfWG#{8Ragf!D$&M{+5nj3ZkY3$=mWd7|65kmOD zL^7WlZla}jW2q=^2nR&6Tspt{z=f?NK&1;|QR!cwFzw`S(A=*)(}#PVT+$fo7!gq# zr~g`YwYdd<*{GBPOJc9qfPL;Ie`dfNN5e+2`(Z!n1giEd((!%r&}K2W=+K8>&TE7V zs!ErIZBGvF4_Uvd$Eeqf({MaKxdFD#>1wcooN3Ilg+8Ubam9K&x53grM@h3!uEnsN z`nV_gR?Oskan2%SvERGbb`#&q*7E&xWj0Z_dzKW(7+Wryq)~cL^!`>!rR@>Dg6BQ! z4#9rsDH9;pj8rcze#))NT5$7(FJ>98_gR!`{rgof7xT4V>J{qb_LyOgVDar*FwPuY}jPda-}|D-2Y68bRo{r+^_uu}vvW=OOz zWY+^y|iA4vJZ?m*z z@NYq}2muxRmg@y*E*nlTnKiR4Hy-49C0UakgQpHA3>nnLYJfNG64cVH7L}>`yb0{4 zO9+}>)dMw=p6zUwHT;yX%Dy$La~W_w#CUTHBC$Ux3bDVzhqca|92d0=_E(r&l< z-W`R{AVa!aTnp;`*cf!W#_cSZMr2rcIU%{?vT6Rwbv(+Kg41#GZPvK> zL726%6}#K-x`?EV#eKwT!FpxiBcj9#7ih_GBPvaT$oPk&ch^5HgBgJ$HU45q57JiN zA+DPgsSbIwDl~$JYS>cKs0B_W`Yi^0H!Lgx_Ar)&*ZTo;$+arEqE4&edJ4EfIT29V z#!sw+{w}4Vvg-wNWD$eisolx zn8$(t_)lkRM^x5e+8XrY&;#JA_G$1(?9ZDR2f+bHy_fEFmn*wQ@WrKb9pgBU(*)EU zfrnKj>pN+&zH|#)Q>e2zmus~*`ls*tI>A!|s*CDn+{X+KqjqLL2DDDfJ>LYXKTwuc z584oMckG$KVKSYJuvzpb4xmS+kgXqIb;6?U4RT-Vi{Rn6HZ6WYU0Y)jU#w0}pL_@;}NObnLay(L2wPm~<5Ku^VVpgh#J zRHpr1W}(a7`ldZEdXdHYgovR#U)b`~1Kfpym$P*~7;-j>Y=tD!ys1OB7Mf;1sf+AP zxYKVQwoU2v2>1s~#Sr3?1Ywyi+of&UkbmD>d*7+)BIyD(%EpmC^py!fzl_Lt?8xua ze*rqz_(^@XnL-#?i262i7d9TT@oI%`@vSqg2fNc|MV4$w1T7eLqTw}|y$b%09aPg+ zJHy3X3R^W>zvZ}6dI*a8DFCZ_aF~U>%pIy3SmKDiMB-o=&DWJgcX&CWJpYKR(^U2I z?L7{x`5`^p{VL;QxQbEuNdxco z|C(kj?#*D*j56~6p}#w3eqSuLQx34z@*By<21^FSUXN$kspp`DJZ4J@b5iIz1%0CO zD?7`0SI#|E@PGu3Oht`FuF95zw!s|aw?Q9fYcVy^mDqRK+*5r~JHe(7N2}90|1kIx;_&*| z`8q*4h4dC5*E1KC(|f&-p0!M|`SLmG!ApaflgE4qRO2@<>!WB4+V;dQZt*I5A|z*! zy+g5gM>kQd-O)#+NQ6I%Iem8ozMQSL(rrY3a-T7)-d>z)t1f-DsTH=oSzH zK-wlm%sGdKFi;>sU9B}|0(P#_2^P`y zTbrQ(%g`g!I2nG-uMtfQ7=bwo^XRIFOD68S6XUzPI;i^JFH@)Eq8RFBpSzkNULCK| zWg?A22vR|?C?>lcP(x_arvG?Z3@C&%-x(e(5LDmnqoDEHBBE@A(JO%383R70C|B4TyRkUapB#5+7cK&*Ro+{lG>rBo% zi_TjMwEa!)H7^T@?taP?ezU{A!H8}GCi}>qU}1SK?t++O!M%r#=az#o)nu% zY+8)-leB0uOByPDxlnlmdP{J8=BdDjC_t+$6mz}3W<1SJ!nvx$nGy){Xj^`tXdhjxZ zO5q^z5pyH#;}bK)EAVE>>H61RFVVxO#)~k_Vd#Z-Lv4hH`rNKs5A6uFj`OSbido@a zELxG;yKd?71Gr9q`z+f;*Ok)N=`GJzI|5sz7x=JvsMGPm`uWZZhi++DO#zcWc|F(gYOI4rXWfZpgIyfJN8IOg1TE+(WHYr>*Kqyu z98eDoKWvvpYa8yHniL;y;~&I^s^`){{r~8JH%_RwLbz*|^Km-j<)?66x5>DRiQKE3 zhz(%(G*^q}Sy?QgS1Ly-CK_a4`#Ewt~_vW(8*rxqla z!4|am=rlY<>I9nC0X88q!frKK=UaNa;v-vWe)LaYdU`5u?I_ih>O)+18#t!m;>Jbo ztxo%Z^iiej73*Ifi{C%o6`L;hWwBa_;w%e3qYW3}9m{yp30-K_0wBis?9@M(&mU!)~*9 zgJu<9WAdwBcz$(y74wBD@TwMI@AU0cepsa(1-t$o74}%BlS-ZunP&6BTnDSW0yOd6 zIsh}32*)+*2(mx@Dwo?wEGl;W90MnY23$XT1sIX0`ufSj0*)_3c*W0zFMdwKEeLEQ zd*cIs^i?|Eq~_$vZtu8W+a7jOT=se%WZliKG3SH2?{UHWU>dYCM~iT9Juh`yWP1(p zw|K%Ewsy7!JT9!Zf^pm*(tcSL!OV>i%3~?@W-A#Q7f$wK{D(z@@>3#;oz7a5R6vMdk?FuC+tx7ROeM1u3xaIyu~7%0S> zl;}A2Lq%UAi)1Ih2JtV*@86cAI;R@B8tf8|-$FR?5x>s<9mVpl?^U$AzXrj}xB;lm zV_f1k!K>>!(}iT4c|DfoMKasK(P}CT$eIaxED)4T_UN6wvh3*+^9r@=TTB zEi8OOQUB`mzy}C)HQp@#!Y|S#^O^{fg=5fU z6LYTFj%wE|vtwp%m4v*1T!s#xWI|89oO5&dTPMb)W^Ha$Tm-upCdDO>jW{!{4;4L zs|X7PfLEYIXMMYcJNWO{ygz63gbJC0n*(*uH@cwMD9Ne{v~$ zBm-0R)1=A%s@(zn<09l*+v?N`2sh=-M1)`HpG_k(l`tQ{vLw_j`Xn{fJ&cYc=`?Gu zU{qhrwj(*9vR6-T&adg8U^hKSion`hqeDt^dis&N$!Y@Y*l7W>U6>!nG|Zc&m+~tQ zh?UvFv!Zq{!zlH4F=0)H!SbUCfuf_YL$Kjq=aKtY6fiqmaa3I6u^6fad_MO8y2gPC zd^zp0rl@fY#){dNs~oz02={G~2jjUf6^O3%jPp59@+dnzfSiLYfuXVc`5qs&fP@iz zpI*F864v?mY7!xUgW5|Ai1CV3GpSS4Y1o~eTQbn2^2CrR7x4t=NC)i0(ULm0aH9e; z%2#X`JeJ0EnP`THOe;dmL{xa7^?Urg-yYB0qOk~vNz1PC>mbbG=8$IvkMr3wdpB}N zbwhPU$cb@$P}SlDICP491hx-Tn*90+`!?jQ($kvSG7rC7RJVK?O7XYF>mVVlML$xW z$OSF_xuL!F1Gr4i3j90I-0q_8be|!nc>taI7b5>k?osZ=_6g(PFW4kw6S}}I>Jso& zSriuXy6;ik>HtyVW%@P`MihIPl(Sxx3c#+jGC~iYM4P_KKMJk3A7Fj|CdxcpVZur6 z?Q7`2j0@dUnwMcjfP$V1VfJ=RW+54=px0=-#)y6AVAcLr_Wg_P>2G>7KxJ0FOtgvc zE&+Z)aY)UnVdXV+`{FWX)|fS6&IJt!9)y#ALAKtHBTK;2OO7t6%$t2fr)ung z_ZIB>kv2nI&?<(DJUQzgZAKr@q+H;ICI)ff4(pq;gmO4BQO}SANadN* zy);}IDYqj`l6iC=eTrDsCEu(GJc(vpaMB*)@n}pjXxie1+N3I91JoCTJ@372VW8js zwgm!j;*A~Q(4ov89FS;Vufo_q{@fki}_cG=*>EVvctI9*=ULvWrwKS^eqK< zK@isA&aq<|-yqU5(KT=gDiyqQX5R5Uc4gua;?sQ4xa^L=ek8S=z?-1C#=%r>T6j4P zg`J;(GF-YN%%bgm*bR}Efa7ngCG$hjL2sJ~pOBre@+Vvr|Bf8yZ-zP9UZG#L>!p8u1K}U2w83}q0S!u{SsYp7LRH5cJ1Gv zz)O(*(m$)+cpqlUf@B}TGh7R7=OY6DH!)GK|v3N2pkhtNG;kP$O6J-8;$1>TTAgQF{GL**S@ zyfXL!8ziDo$fO^l;52s_-*8Hepaip1(CL2Iz`LNvp`jwBzdH?+sZi^)Tv&OcB+Qi< zmW{2yBFy+szgfu68Et|5YEZyBtL?7RYHG9=9)&asG0dutFLtRtn_ZGiV8~TmO5d0N zRI~?PfO(fmDy>F%1!f9|4Oe>|f)4ov_Xebf2j65}7h|oDqdN`&q)~a(KggczmSDzindv2egat>+A)42`*ei~O2Xx%|i zZx+*~P@FG;D+7IyuSeW450?Swe(Ao_1*9m_n}AY8KtXzmfQo>Ch=SCJGyx$LsR=~7N|!E8 zM4FU<^p?h63}kY891w7|gOHQ8-Gv3nWaC(XzS-%!)bN{VcFdn+ z1N2l<#NQr7VN(7reVJ_GKL|m+dxXz%jxe^sp4w;CT%!c@fX+rM$%w;W&YZ)XbCD;W zXZWXqn{oq0+vdig!>N8PXx9?sy9?+{=o!~M_pwA~=`%c%?j2z}pB^VO5lBCb9eL5U zAR`$9!+TxBY86dicW=O9S+IuZp({YUmqxSDfjeD|lTul4c`BqaM-B8P1>7?sf%ZV3 zj^>T3r#&#|{&3PAA84nx;o_SMt|BrEz?Cu}cU%>AexH2tTjHKrUGfn(;XZ=AfhM?n z8!}~dAJIsmlU)4<5V3RZD!o%`Ybbuv4*B#r(8?=mzd6KXi^Z`{eq~L_J--Zjdb@pP|t7Z zTr4cx_1;}7-~l1+92j8}Co(p9PmuT+Sb-ZGg{}=RernJ-j(vo#PEz&DN;&?eX2Nfe zUtje9tem72Q^L+w8+TrImgXaXXv*AA8M@g=EE@jqj!2bS#@&}6qyomoydxmKhc>}g zyhM*JMD{q(s~Ks4dXjed&RbF&VxTNCU^N3vAM~!A+&D3mISbgzQb<%SZIuT}P$J(O zx8W{-SbrWHm&cN3@B70SDMu-$1^zn+st3+t8dzX6nBTZnfU$vUF~;$3BSGr}S7 zEVui-<~MWk*L}9VT$b6z5{eB8GWfWH$;o6bu*d-6gQ=W8#mA)t9NOa`cupefyvd9U(wN+gG9g_*=Fs7PI8DHTDq&* z$72TCDzR7DRV`mK7WLH*zT*U5RIVY(6<(ZI;aQs!iNvWt)HqK<+ETyK*RR&y>}N}a z*Zoxv0qTe3N6u2g0M|E=D?sFR-GFocZl#I$QbSWCof_wWu88Z2$YBaXNYmLpjG6iA z!;=cI6v`|5>5@1fZ27#H{pK2dlI(&gD34XmjjLE+Um0<$f|De(PAqUd#bQux79*%9C9`i~KO!Af2DX6(8cI(kxa zjRqD5xO+O^a*5B(6eE@ioHRatl^^J=x`EAH8w9syoHs?>Qxf?|EFN5J$DiAEJCD@r ziOd3fwZ^kWXHXL}s6Z;YCd~z%Sq#Y-F%mA(7aJp5KvAXZv3N9Q_n&6H$mBKbstOmrYm9T8VDj9L@_6*N*2b?JZM8uOw`H(Q%7>DbN$(eecF^V*I`KdZ-2d z85VDg9xSU&Jx^GD58b9M@hnO)fP;mx+7zj%%w>AG#hdigPjJ<5VUx)G%W-I@+GqY> zrr6lGT0zD%KZZp_6j1iJb{mar*Hlftc_$+!j~@}Ht7voayl++Wv+AD|5_DrqdhvJP z-M}2}E1;8z`d?aQZhbjJyyHAywgp>a5GR~48v zlm=+^b?qq?7O|vWXr4wai%|MntX&G0oSBHSx95)}7>GHG=}sxK}RT z4+3|m$RUnHE;u69)4!5KPzt6#el>w~|7TQ4mGba&t;U`y!ayz{c~|fivG5vr;J8vD z>m0(O`v%0jRl$OfX38fl|& z1UY`&=Dbdd@hR?T_VNSR;KPfV0_t-8l|YtBdK8^)vv#CQ6~b^|!N8C`bO(6)Nx}kl z*t_Js-d(w<0QoCC9TXw7NvvYpC+;v$_E!1iLTeGB=e0JIo&gny>d(MYe6CCl3@WXYMgJIc7u|%RbSoj(WTE+%=Djs-n6^YcvbN3&(9R^M4k5TbZv1Hp{VZ0#ma-)U5`@J z;p2e}#iL>z7}-yfrYSmF6?-{04}(ph}YZ|E=$CF59g$&+2g zmkmb&dgrEAk*I(Iz3;n+D2K}!UgfGJULqd(yR_*!0f8&NtNl$0Y-f!!m@1Hp1X!|e zCQJb=^U6&f+;{``{f`QESwZs!8HqY-0dfKMcUCUR488&^*R7L4kc)-)iu~u>)%}*8 z$HYrSL3UuuY6%M3-~^Wc1d4K}K+X$?zy?*47-HJVqns`FuEBRm!pDptHN>XL`e@N9Hf}A4{~D$UFQ}kHI2xBc_n!wtY7CIqzyvBRy`n+iV(C(ULd_=_zauq#<69Q} zBEf_zu3z5bIZ>}H9$CSU$zRhX%$6kr>FVh4WsFylC8^ioRTY$w_M0T{owR$KH8yDo%QFxo4xtRx4{)6%hk2Oal5+Sb z(63khHA|%`im82gHbZ zDMNY_{3Ae`eCR*iX#J?h2$!yr!MrSPNO|kvRRp!M1)@(kNSg;R5kLz{EahPNyaL~1 z^3?ZpFR=5wH)@UpGSSZuS&c9k^Hsa-@pJ3LjuC>JTT`;46dCXcPBOSz!*D2%Wr-*h z_f!Dxh~S2};LJ)ivFjY@>UA@^b+igSKKo6ZSLp|G;BhoLP|?aF6xkh1VX|-Z_520h zN+(8ZPseTF>?z*f`xhbddkE}6B0C&wshENb5ot+b72}*gJ?@Du(!RvVl0m$zf|!9w zX7e_$gV4=&McG#Qei3fpY~|x?J-hO0s{lklww8+qu5|b}0LPcnx+!0_u5z!;L+=@3 zU^36Q>;uid{hV`Ct)JgrY@kiW(4Aq@7x@mwDSuV$5h#lW&bc3g9kUVn1bSM_wjzFA zeaTsXEd$Yb-fB`XNeKkKAl}}oqFiAt_^|4;#5V;-1WbxOWBO zY2~F-Fy8P8i+W$sN?g{y>07)T$1lSOSq}i9?P8mYfZ| z7dmAnSRr;Mqhjb}n$XrE$l}|;=h@gb_UAOff2|HwL)D3#Dm)O`SL`drzB9NG$6O8>&GXHg7VClnz*@h6Ml`Fgm24W0KFUh5vM z(Cwv65@bgWYdJZFA0*?puFe9}ZI+7lvFAS`I+9Opcu6r4{tmQSPg zgioPAbOi$qifS09emp9RHR??yrt@4-5v#FFuxLBn861Fl+Cw1#UsfS4ROIV2D$E^; zLJJ+p%S!q7sN_BFu72&B>KzW$yo4=(WS?S+LE9XSO_d8BPdW?0tAv7%X!33azA{$* zN#x|u8KJIMuPTM4eEa{#yk*uo518jewwREu$4wk7u zUnZg?wum;-3BFRYl5DH5FyC+upkCBG738?_)0}UtiNtdENgzw_a3RU=ChtuHOmh#K zZ}2LrB_uED0*91Z{iK4S-y+3TC_&pkOU}(r9*1fs579|q23t*HACiiv)|fO*Yzp<& zgRMLxpn$>77`1k#`xa**u=8qiWDlv>=69Yko*?>y13%hPuiUrGC}k!hH+zY4cPP$H zKIZZ9M078EVs0K#gwgkc7Oz2$2}(y(Lx?Y4b)=@kqs15<4VWW&2X?_r&iQk8ZkK;S z&T?wqhoojyh%q7i{1+j%h6<=$%>=35H(%58z`0)>W(u{MOnqctDJ}xyzFa!V)qirX z1h!6vc=NT(60aTIGAeBeXa=&QPvd(th$!gOz}vd7m%FQsqmSN0Gdnhr4ZN6q)O(M~ z?gs?Cz5JflW!tjKnpN$!K+DJjy-V?WO~PPfkHLwFQA z*(nj}wPzj0&Psu>4Fv{U?k;HkCFnN-lBNXyA}|$bK@-I_P7f`zJlR^S?GGoLZELEapTS)fSWCdyCPB z@95AOj@Be`jlai64L!u|pG5z3lrVK~8P^?gdnv%4HAqTUl@8vpmo`EuzKqSq15qss zm59)Q7tjPM@QZ$!y=n^z)K~rG81|U@1+m*@1#N-mo&|o6xm=@v^6qeIU9AeSRoQ(% z#zpy{y+;0Q)y(yQnzLubH-5RqV}LIWrVqW+UdLu!zz-nG9LRtiz8*T%{vbMYw)>AJ zJy`1Pk7PdI>SVc|(t}+tguSn@Aoi_^q6d+L)+WwKQnx59kwZ}KitI%4@$)AD5)L~k zpp)5uj@w#PC-}W2^2VGyA};*dkJfMRAcn3%OS+3B>SFatZWGtqT_P1QkTqs=jrvsb z6DpwXfE!6FJWo|7C{hMKHu)A$`y#@4+L?_1R&W_9a z>q+eIk8gS9ZF_~IWZ>5~J>Muysb6l)L%%l_;3lANAqu~v2!NJYf{!cJ1472*i&8_i z!pa?E&6fB+2PzFF#ghX2iK!A@Dd%UzMhyM9UDQ#CX~B*kwvx#33#WNNHvz1g72m48 z5V;jIdbB{w`U@{@RnQd~L3KSZ0D8dmF2R*&*roV{E6G9&4954y*n*X_qkqM zm?y=owW~@lidY9TMS*e5=glmv9PAT>bZmAe1I8)(Wru@Dt#u-j$hL{J{`Llc=zD8* z@<{?noxqizMpL#Zb1j?c{O$bT0gAKR2EKG~vwEuaY~HLG_p<31u~NjJL@&>q#l(HC zwz`TLjWxq>{iv$r#4OJTfwO8Gm4F9Q6G%20BKR#0Jdq=|sdFHp*S)FatyJHl*}G%F zlH76lH?jd6Pt8K&Sje_XX}G{aqVYo^=v&EMriEEU0-V$drdDMiZdMDdq2PBXp{X~Y z5n#v1_YbPx_VMGaB^DiC3t}2}B{w4arHhEqY0!f?`X%hJ?}JKxOvk-|dXp%`_!nHV zb&1gU%u}Mz+5xqjoV?aNXv5q_We|T4b8$#YJv(x>U=QPU>}K)_l2Vjl-UZ;?S^O&3 zL@HudE3*h974vKZsPFr0CPgs{Z@AbDu*i?(KqxCM;_YL=51vSmEvXOSuctsANLuZ1 z?Gs+zQ?oYguwNs?g+ayJ#mi04HL_7uL>*#UB9V)3FyF9cfKdjV|kErIUS!3EojqI+i-dMJ;G!oAV@3HLJn*ct>o{|RyyhnajleBF^l5Tw7^dq-Wg&O} z`Q4n@-0_nQ|G-lv^6cE1Vd;Hhi(0X47CBt8?)qu=2!jeXiskYdLTxEXemyLLc#KoLTa>ulOyb(f%CIjljbU)Un;G_q{h4d%HSM6jF{2ap`VqB_Gv;!%Z zjE6=@ABhhv2U<0%URcdWaZKWC^M0y{8dR;~0E0qA^4+7O7~eB!Af!)ed54U&nTV%3 zV*oI=DpKdUyq*MBigyL`fA2el9?}4ND{}||Fll1ZpR|j#`{WP_g7}W6Zqu!{l#QpP z@Hz$>pvQEiZ{M>aa-eGR6Rdo!ZNS61uSY-~A;9lAlmq^ne_||CK4Nx~v=fr$eg#=) z-R&tm++Rt2P2}AXnEgw$r#ud#hcEu%S|3&>sq}JD0e?#m)^_)Zed77qr0qnx^nir` z=a#7<39b3JTt2a@o+I>q$Pz^?OyWJ1!aF|uX82~_NOwl}6Ono#tofsUDD26HmHHSo z{nG9^m-JB7-xnq?rQn-5W2YyCa)cjYWli`9HlL5nBiXdT$Q(j~7X9IbY0Tbb%8bW+ z4%8YsEaB zH(@)4&VAYviikg~Yk#dQSFs840b9^U#BHekjeXl=tE2OdUtiEkqc>)E1r27sTKKvY z)$EpbkyW_?t`?*mQje@ne)}qFVEh7NDu`X$?r{*>>Qv`p0QXIw7{b~izuwWFnCeH!fWz|hJSx}{l;X@63 z^4BkjBEa_%0CqiWEyAJset_~i5~Z(tw$p~?N>3DQOG&AD2jOgi|8yjU%+KPodvbYJS;A0BwsMWV0id>SLwmef2?zN@ifQU(n?#Q%P~LUs|fX%Y=Cr ztO4eRXCSRj^?1)B$FH3cmDHB&OEF3uT1dS3@Um~I++$4sY|5c-E<+*$FMihg0k#TB zsEXUwaZR9Y9Lc79L5z8@2Q`~}i%igTI-U=)<3gUFZP?~uYa2Rzd!?eiN((O_D54_L zXeAnlp11m&T~?zk(KeMbOo_C(jJwD_$=X!gm^p^D z=96U%^DcibxT!34WR&s=wx*Yh15rz(7Mv-dx3JB6H@-ttzV7X=kAo?#Aj%oaah_8Z zFcy+6%cEe1<~g@|;4)<&@tx}G=3Ds<^=`}USYGejbb|<&`^RBS&8_kUR*#V;F}}UW zyqmoy?Z0KRizY${&@7fIVAA_8*m-!x!B$1^rfK%LHuDjH>R?HHwfhr{2Kop&_L<1F zx@*)U-%XmILl%;ErOK(+hn3o~NWahcc#X`9;pEk@J(%6=*}*CL)+y>)E%mIVIWeTx zY_@5j!ja#)naeCuh@QY_dKF&rfXnNO#NORgel{ub?77hF8s6VY3TF!ctu75fbdx*UMe+aGgxyP z=rMGS%-zPFH#tt+4)?Ji>d5#tIdz3W2&dWEMKND zMVj^Dr&3$tRdS0FI4U8M)exRb0MC}Y#_{S9@(TV6La;cyNpXoGcRZ`V07|}WcTXy` zMgTgfa;7eG=}B;z8v&fXO7qdTMF7j7S$-{2K%VP=h_voLYA}jfV7BUjateDnoOvpE z7gnyi8%&WdV}PmT8s?Wg%O^zqK?=jfRswPO<`B}IK)+i}oRz^isXS?m>Ge-gCH9QZLaH_&-U z)rG`%<2T5cQ?JmcC!H$Liw_Lz$g0fEo5r(a{06l2?90Uq@}%r2Ig%-|U<4&ay5?(Z zf8Y&v`w7LBfa7sxhSrqL57vu_xf=w-tOFga$OokOFQRd}Bb18t>#OgTHSYaZ@F}%B zLec&T_21Jh<8MWrZ)JvH9wXSF6B1OX`CoyV4!ZGE5ws-JwgAew2KI4YuI^D)Nm343W51Sp(@X_XI5DKJ+>9+|BJ%~5l0q^mxY<)1G zL*UCXaW--i?ah8Nl{&;y z0_kTo2&i<^srhqCFAbqMY|zVf@+snHmI3+QH6x;Ucp0l1aeI(cUdi{!V$fSY!$C%e z+%aM^Svq?l<}D<qo#3H(nbe{`%g-o%jvF$utuo$-eAtYBPh3uDne=;67>1 z>ooBz>vJU^UY{#@m*tHnP5M-_NcP9IIN++#ig$HsrvtdDh;9aX=(Uut%|1Pqsz$lV zdD`|B)5w(j>6CIJ$;)m1RDv{KUjSe9nqudPmLb|D4=B2QKo9cY_88#SL3m0apoqT zNlBgwv59XUMxCpm>Ww{1X5BQN3|(h;zMkR5So6*L+*JIHM7!C3j11$kcEW=7^_zsa znT?wsO_hrfot}wwU0vNO^Qr-=4Fm$B@!3~B z=dwi6U7{1_(_aJXPOQ)tdBRs0yh7@vh?9ArsG4CpKIIBQ%{+LUr4+6o!+ZM8?O0eF z`^e!3$fslUy>*z%1=)v7EL~tocQC&l{3FPEx(3MNfXP5L?fwY3j`s3d z*CpsL5LG~+Z{{>Z=D-t7+_O6v+nJ0OznsTUkX=Aoy9-g(A=Bn%Z)k6ZKu5a0Fh7K( z7Bv(KE*|#sT5Z)H?<^>ecG7WOOsfYDN9*7BvC}q=933 zpqgv%2PegNO{>cEv}TvrPM`L(^M;AF|BSIc94U|a9W<~liUfYAL2__XE&kwd8IIQ) z;YW;ox;QQX1<4qXhq2rX4*X_+3XGwtnBE*O5BA4P|#wSw!X;+7>aA zQyM*Teez!OBVa)v{?{Df9bt*OBngagQ~Th-=JjWB5LGOCN&7L}yxbt=TqxUPunXl_ zOR=djeixmjy56Iguz35V>OQUr#O51g-ig-cbD`)PHoj9%kYPm3hO($Aj)!GD=UOI6 zMzlJFd(X3PmpzhvlE6`Z`H24_&maAIm3Kg7hyzftM+tG}p7XCjR=h0TTxoKPrqql6C3WEalUJNBJKOUOMO@qQ!S0-#2uUCeTU0gIce->xzWXYVGq2ec**; zltm2nQ!51Cidab{cY<**6SP?dx{}Z`i`SS)>4Z8)w*2*6PtDDiqqQlf@Gc{Et`WuF zT#H&&=>0b|!)?6iJM*-FERH(AIV!JF*VI?r%la`rc?`Bt6Q*lh;9khk)!1NR4`LRl zv>`p#sE|qNhVc=iIM4$X#<212f5YbRjcs20=d%&|kI%-@^`o7K+y6w*;r+Lo3Hwia zj>YG5zV7Tny9Nb&(}>ECS$dj6_PyV_WKtOFAKG;M%`)?dG#s$b;OqZ3FIekz_;^cN z@Xjm$Z@OYS&+<-Q=_Hzewfmrz9g7(Dv)V+A6;JJ+U#Q{(k>@DzB_56d=CI^P`FMdf zG3uC#l&O0N6a=jJr8%RS7ktVJ_Jg7tJEm-wYmt}!gHCutSVSzc!~}`o@V)o_^fz*@ zwF0Jqo`AUk-IFi?d@5b=Ejb>4g}v9sZ?yOad?$8x8*FRNs^<$X&CQF3qh zqW7Tg&Y;SY+t+t5egZJTJ_4AAUJCSj(4ux}sdV+W+zG-}Upe|zzJrup6^C$*p#yKq z7c5=wIY!(nD7(e!AD}?)aXLbY&I3HJY-#qCX4}sdMCZk5-q$a~M+m^(Vj$I8lgpFF zxIbDq)_^YhkIa+Z$*&+&#WkjCnJ!`uGsNAAtM2#u zQtlSe&x3NmE8nR6coucbq{Q?w-UmVn$Mwf*9yY%h+K1kbJ3|U^tb&vc@Xmah8gl`f zDmeEx!RsD2!J`85{V5j)o_081zAJDi!fS<%yv7h%eP=w-XCw4F+$^C3Q)^io1Qu7~ zLe5R|QUInCu@g43YdX4@AuzhLwG@lk&U4n9HF`e_hqVjfn)Nd$rmtQQuhf~4xanRV~lFIb@7Xmw852+v%GZ_~&jIDu1koz|wvcr53yDtd>a5T;mO(hc1|0Z@f|9%g4 zEth4f)CtOWA!Tp}+Uk#9e|P{GO*wUVfUN#SxB4_d43nYe(91K;;lR{lbU?b0jB)UOyM%UeV2r34*C822goWxON1c zk8)uPF*q6ST|akDh#hIaJN_ed+^70VrvJk z9f2aQG2MQ*E#w->p}w`bz&k8Qv9hZcF9Deh2<F5Zw8yaCgE#?vqi?X(FQtXxj3E0S zpY5(Whqs$QYhl44J9T^kHdspkS%1s9Z)ExwKioLj4Z;A(vse#Sr7eg0$f(&p}n zv4Rlt*RXsX;7AbDhDxq-juF}iSwXnGmF_bJCY+UscGblg_z@h{DxPAT=7rJgZ9_^Y z#}KJ(EP)bIeVO4LXEYb>K~n`=3v?h&Z{PFagk$)8D9&PCR!E7LGz^EE3UL6a02ZuD zf6HOTcU<%3GZsuAv-l3sgJQJ<8f|UKu}B}7FvTSKPUWGreogi?NR+rzxn4M5eA_C3v(S~ zM(zAMe`B)8N!@&67Qc)8$cC9!O*=2!@!kVOKF%nN_fc@Y3>6iE+^GvXb^0rZ4r}9# z%atI|Le?|=(Gy)vg~Z9MlQCbDdHUPOtb6iI8x1nzb;R1iFAv*Nj&OcuL|+=n{axi`TjUjD2E7sNJ_jgvFHuU06wnha=7%zj>X0vLawfaRI z1FqCGN+|+9!%QOK{34NXF8(g*%AtP1Cx@cf8^&C%o)Wbs_g{TucX~!Fe7`u=PFgZ+ zdT{eB*(V}I>Njbl=-~V(VN+6Yu``Zs+(+ltP3(U7PyLYwdk^9<#xpkuBhE2!>5sTc z;&ylstTM*7PAN;a!iA;E?Fgluj3g2c4T*%)l;&RP%t|8Ryt=XfP*tquDllfSBy1k} zy$8C{5wO?Rag1pMg7$V_4yz3m8yZf7ez_S;n#i%-H@KVC=IOj1SXQ||6h^8dfw*2OdLhS^_^);d~viAkSrRECI zJF$fn*>T7t)=Ukr^KQ}W0EY2m1I}y^Q{l6f@YHy1LWOFf*7yYjkB_U(Q&wJSR zRX>=g|1KLwsHE~Q(b?o=-81F{+A)8l>MuRhTMPAv$N9j0zBS;1!@oc{h9nSfmP z2nBQ5ox7~1soD)bOoM&P~{|>@2CxLKYqO1Sx zjuYz@FR{5K5KaW^a$_eiT-geii}&2r0J;yQuMyo&{sqEGb;A#mKsfensCcVk5(ww% z2w!pceS+?;n?W+df;SjtMzJqk(+$qcnjY}^mUKY-loX&vui`W0f1kj_)S_zTcc#v` z7hgvOvFm+23nyVSW5%t? zFdh{YNH6$hvR`wcj=*HVq!+`51|wc-p*_GbW?)HKuddx)6Zd<#<@G)trmO-gjPc*P zd(=4-74fB#gUFJ+(o7QI*@92agpG*9gN87tgl|RAcQ3yRTq4Tz7AL^(Y5JR&=>1yP z%nt++5Vd`P4Z~vk_}0q|sagEhuIyNr9V#z7oHL;?;VGseQnt=4jCAvNE)|QJlfDzB zIheHAWC%X~n;}Nat;cqdE2rmMpCC#6`!+-sh$07;zdDInV># z1DS5jxOAE=NV$*N)KvhE>#9K4ZGgwTqYr}5(-sm)j2`G=BgDYnxnJpbCly5Ob`-X@ zT4r@w5h+_8p(D9b&Cp4tU9)UYtv$&1O9eocPuX+F7!LWpgrGplo%g5hNs#WWKQa-Q znW}i}nq+J?zc!-kLsww2Du(+MWp=IcSw4(t;C3O!8NP?i5m|M0x`oP)WNBgFj2I!P z<{J{T<&B8T$e)t&!d@*z$2Bj83_uf|yMR1(0%$)UZ$dzj{nuvRK*UA)pU&pqe{?pa zKG?z4&K79zK|;3v(-8lcM(3ZV{+~Xy`QN+a%${ETwij2zmf1MPuS(wyv3k@jag#^9 z+I^6*J)BB>Z2E@YXW3F~O$eRU^bMj2`U5-zdj2PMFy;3j!| zrV4#sE_U zEbPTA4Z|5h!>hG-Z1r@CL^b;0Rm{CFuisGnDXM$+P1W4vLpz5|NCiqJ^?}U5bF(|^ zhj<#er{%E0aQz~pX;=!jt2PyY+?*$x&c1nLxw2m0&+@TnrW4tVipyUUDCORXxOtmt z0e#lEzq#c#I5#}APTc2K^v5)o99$wlp17Oh0VVlmw~87rdhb3{i^Bm+^?v$$=Ea*7 zzL>h0y<6gPgY)qR+Z0)&5nXJ}t{SqWW!bwVOQb6Ja;?5udo%5aCknO@0={W$vD%US z?IijtFZA zx3$f?Ezi&MOkK5`5hNdf{N%>=^oQi<+}9w5en)!YwCYZhh<4!1I7DXHX^YlTw^1}dJlxJa~3g1KbeikN}?xx)+HBqN~8FU_#8<$qs69&pZ7FhqhG4Vkw` zLLL)zV@HrS+Q^BA73hbU-Ofh(YdxvVkYYNiP1>@QE7>1`{|2sUaBrZP_`4Ap@VhoG=n%W@I1XaBZ#A+ ze`rdPvJCzQ`f9q4i#3@a>if#=4_jUbVJ^)Y<_rLR8!fYweI3dkl&rcwbwT( z_`JU7AK1PaX|xgYjr>DhSDOd>9gsnNc0d;I1Nx|Wm`kYy7#dD;M*0SY_{8x#F8genVe6?>on8@ zo2p}*vke3pF@f=Z@n10B68#3QJJg2T!J>|O)FTvCGyKV-qTZ;_83qPIqU#q?A}YD9 zB3bkX-eZloMzLCJPgU>UW6;?H%? zJHV2CBKLtonBQL(-TG9q@#>C?JPGNTvrOb`M-9oxLFBz&cI3_XtxWFTSa?hmS<%Ea z^os7r#hq7x)k*TMeJ@t^&vYj)_OG6kT@SDLo=h6jzvbh@y_mVuKLJH>oNoBvV~yEY zd)r2k4s#l4tF8fZX?~G2r+-Ni8CUpFwK#N?K6}lr|4IGFCHYA@toF}aoAZH$kZ+~T zI`5;0nzg9HBBNb;!mfJNYn!tMzjr&jU`+Cl@GgTJ*L(N%dfYwPF}6F7G{|if#_k&* z6hfR z0W!ft^9LWm-S0>A0L_8v>f9zk%kEpPd6{(KDRv=#2G4V$ZBorl&!c`k*k;gTN!N`J zbXpy?84fImm>tlcZ^fPD-P$#wrt0iG<@${5Zh1=kC4VoTGfs9U{w6x*ipMT$%Pw-D z4Sep)F!$=333MU6DL5eVRowB}^bH%;Xt;%yP_7yv3iAQ-AgyctswrK4N*3=Y8=SzH z;m}7ndFDEmeJ%Bj6tjzg3Cu|+@OoC=V9PIaw}h1|WRo`mBK?%ZZ8MezMw5%6^_@uE zs;O06fqJ|3&%o5nhetnTOL~Tx1O&95v5~o~TZE>rBF*n1ZZny~2IoAyiOtO%HcB@; zE_L4TMZZw)NPa)+1%DoL;Kw5j|90h+?BNEF3!B_~(*(@{v$_i@5tF-aCXPRF46gPI zX-}t5x?hfJXo{*U`s8Tt2pwhfDpqEyUL6&@9Tla>d%!&@usm3dO;N)(<^AT30#6H@ zx97KVt->xDD;Oe;oU8jdOhZ!?5$a83~Uo(oCTkLF#P&=_hy z)a%zQqI<2AHY*y=pl*Hg{g$kdQe0&ppKJE*+~`L4gy{M zA*?3tch1Q>Boh_}r<8R+72ll9aO)gvF|z4H>x?{Xn)ZF1+ z1f|JpO+slr(bI+v0)>~I%5E+kkPZ{ zizrjy45%Wi?(pH!0?zW=-ehE1Zx)|yGoE&TvGJ3@aZFp|LbjBw-)O4`6jqRoy)Eqs zC;TkupfP>t8HuN`?P2(BK}>u6DQMHw1hSTf4l!mI6ascnfFz#l9cHJ7W$TRIIK5kZ znw`Na&#JDWNSt{1@y8(;#01I8DX!;}Vu-#-aoy@r9cPyOF zI^kO8(3PY7t8OJ*{OgViER-4*dHH6t76B{++O@T_A4Os1G^f#HJ$H!=?yst8yzog; z1mTHKRT5w>o=_4|Wgne1^h#-f^6jO9#Okwvjb@XLXCl7Wxm{NjSlll33_Fro$$cra zaTzBmv{N-+MN{DcYdfoL`8^s;+xOEvoxka2YRuRJekOisj6Z&1w{M1-brp>-Z`prmEjZA<`kIt~u{4;qb4)+T zYJqpD9)h@sd>nbN4dyUZ3j1xI@Ug~9_$PZ-WzFH&=&jdonF!B04ux-4_}1u=oQFZ~ zR=72ecXng&Ng)-U`o%Oh`-jx6A$MhB6FvE0xRGd_z4ywimvZ6TCbP%wgp2R@c4Yl8cQX8}#nyF3if^0)HqBomD4) zWuNg{O^-WhZh{*PXvPsc6YM*%!*nG(P$9@|g%J*6b-d?^pDnP3%+f{(J7vn{`Hwtq4$ z^V3!{pj5N3Z6wzFjm-0I`mMBr%iuA)$ttGzC=SAp6zxmkyT*&>gPf(EKZl#RG7D>H z(~twW_zeX{#^w$1*RuOdL#z7lv^wwixn0a5<5-e?zge3)xBJJwqsvHB=Z z-l^}i{io8x!_&z{frnvy#>xC5ZFA}(@sr9FkW~#twbH7a=1tHN*w)&Tk6q5%qfb<`&vj z_2`R=cR zCzN(wu)&;HY*+n&UHZ2>-A*I>bs!&`H{aSJOb!fQOV6@BJ)6#W6a74)yQ$%|nV}LV zaqG{(4p!^4s8hG}^3bdddDoMG&pY3kO>AeV>|Gy^jXDXg;b-Jo|I9)|jfF45@@8Hj zmkR96SbHWw8Ht(nA2LEt8IiI6kM(|ry=ZOqV(+`I2X~0pbQM=h(DE|o=cho(H$BBS zKUZiQ*VYElL_)N!V%?Y;A7R_I)CsISiB8n?a?#8`Xha;BR$Hhqq6S}nE|Fc?5En}b z)$G`4?LC(Y*jc1(P+>hVIFoqvxPUSZPQmeU(zkn(5%J)2a&}?7q6$qJLZmMXD40`6 zn?mGYs@oiG9t*f*9=?F z+<%SNO%$XgetA`^P4A)dKy-<7qa~f>HTjgJz-bSlNp(lkWDxzCH#PF0QubbpFN?rA zm}aWAA+6L7GO|S_8qrzVKh|c6Lh90iT@wf#NfI4e^Q-eR;;77Vyr%f!M6u9>NLkc* z&G-PgPci)KBr#v+X=|;!Aq1kDJ4Ve3x^JS6WGr6VHfi1R674+;Io!? z`oCkt-#4erD?_dC|2+&Y&Yts{C`nUe0x#a};5+7c!UDQH1jTl1vY2oFjQ8XAXFcF= z0==WW`@Q=^mP;1R?xanDSM2rpK(BArt>==r9HllTGm3-#O_Nk7FAwi?$J9b=BPq!3 z;40RF+ZK2zzYx=Vlnq%x;rTil;`(i?Z77e_Ihz}KEyQ?qE^a4#-gVJPsQmGOuOvv8 z$&=stlX*zP##*gUaMPHeoMs(WYV-8b{zn?GS!?W$e-`>nOUtmUSyUl`cH&r(7jgYN~m1V0U}T1zShn>30L#e%lo0v*h4mMaKbWHUxcNqLGC9UtD= z+R;LQcub-*Ri#I)u=ttbaCD;u2j8>@hOdm=1vL#{+u;v%dEgDO-+`vAP>FGCD_^9T z7e)bD7?fy$_^a}ze?4Yz6g%%TvG+0U-EtDbBEBdQeuWV4Q8oRBnMx;14ROjYAK}KU z1~cd$d9`--wgX}3<>iWkSAg@wEY~I?=R?!3$&QdermB$5ris^K2~9|MOfqD(J}}BP zQ|feU_}kVHquJ(`X>f0pUAT}E-Gbnkrh5DwB-%udl|e>~N(Dw1=tPD-S2oZ`aV8(! zI{r;RS21AMAW(Hb6%b25-i8pxv2-C;yw5@5K&3;RU@2e`2Z3b`tqHlE0E9LGgfQ85 zY42haH9Sd6qc2chR_*oxLzc$vW84dDQ09|O7T6Y`km^Uy_3gQx){rA`Zp-xi9~b*b zfcAFEg0e4nPFZ0)W7+7wp6!F4n0Zh?`RIA$o~E52E<+I;Wdqs5*PQ0q2#J~qNQy`8 z8f=}gVf0yrN|*pq0sbRGP1Az|aat=8-wu}F0mTN7vqisZ3Nkz%o}&fquB+>gK&21F zR4YYJ;VAUaH{0Xx@qb7=OWFOpESdh6AvMU$uPfVB?u=!=hrM4iYhMp30`{kUX3ku$ZhYPU@^8;Z#GdnV*0pY*!lVi9=6X?eR3dqf zEE^>~uZR4SvXoZdd%9a4apHtQuFakFQVt~_PROpqKMmPj5vq{8+nAI1xVzxYY7>q% zqzR0NfWAydT4u-9aC$J8^TsPiZZIB^`Org;3%VxE8EHC+R*uP<$9j#CXxYDK>ucP0 z8a8uN>CZt-u+U?9IKqtL&m%SYMHRvfXnWay;+y9?-oJtxqWor|(75i&SqsmSpX8%D zA@H@dUHur_YDcY?q^* zWCLx0wpoN`b)WzSM>T<^xO3P|v&JG#OK z-|wB(?`&;AVH?GY`d>W8d*|klGXO<=;@_M2+2%=ceL|Wk6v*hpJ~lm0KG9)l+0+7H zCLGMKb05R4x^^9gQvl}i{VPMW@JP=jE#L&%#=)r3jZtbP?DB|H`1I%E0O*P;wC)?h3^HeP(+KVrfync zpZDdcg+#uO1od#uLd{=1ZGiYZF~9<)<|pQ8u};t7Mtmcko_Jo<4RsV7jr8+s+m!%P zrP^DVwvN0A^SVb}3dwwliarA!^YJ#!{AP`0ZXw`?nDw<6I7krF-;?iyND1-6%U1q* zNhC?KlCbl~%0eBi&GH+js{8#}J-?8z`i=>H+)#nhC*HcZw9nCqfv|eRMFpgGD_UPe z)McT0xiHvLN;IMN)Dkd;PI#QMcaG!b0-+4~G&vvGJw#0d(?fbsV07AQr29JfkQA41 z=3Yv*l~Z$>oA<03o}QGvG?a8_`K8~I0x~(U3*ASx1ASa1jWepk{ElqiobT};P@5Z%NqHs^wViT4FAD{ z&P){Wytw)klN*NbkuUs-(E<88iRdo4D)q#y0No>I?b*j$-Gb(e(Zk z#WMVN6#KuS)c-S?{jZqX^#3iy<&a|i|EXjz$NKL|b|`8i@sg}LD+~5)$T$m$lJz+& z5B6;ExMTdXD$)O%?qaRz0sZF_{149lpD_9Vhph8IpfdXZ1eGy%Hldy5Vp~Y%C{$up z)oE$BWMgEdU&-Z~{6*JkX_79<IH>Nzp zbn<@NHREo0;(vwiBcUlKmykD|G_C#T?|WZW=rD~6EF`>lbZ9XeRvQvBzQg8LlRGop z*X-xZrY9(;{u1!-S8m47oWWb~v+%Srt@Ep}GWPV#+6f&xFP>kge8@OpwL}2=Z8uwR zOe|r}Va-{)_VVq7-ORPFIHfPSVbQ79XN-x~F2LtBq;Hgq(eV=`nnu?R!^Eg@K35?2JUfWp(k6Wq(X>oJ=^Rr zdmOg?0nYOGeF6knb=k`!CA=i}q;HXqXktz?+nbNc*U&xu3q93LNxza=B?R6cl?HCv zEctp@P%D4txi=(P2VdvD=~MLl)Pg`>f+SxHBNp`d1 z-`d#jTSH=KruYuM6g80bIl%jR!pGlHP2p0S_iI8dq#VqWvXEVokC)p9!o;5q`@J=r zq$H#KvaJNkQ~;UR5=X_^O8?FtM36FfyuF##-Je$mN-VLPDpe8_$QqnRunQ$d<;=*3 zLNjZbkp!xE$I8u_ctl7_*0=cbah@v1?<+R^qetw` zRGm_SPVCII z7*4T&ypo$<=w;LbtTw{CnX5WMxMaZZ%g%yKp3M@u-^x)UM*-SgG`aGb;*XZGmO0pp z1tIco&+JA)tTVsAnkAm(=H0MlDW1rEY?A&~J?eFolu5J)GcCNE2L)rwji-gh-zESA z^(c*l))oiY=Es@26dc~Jl%cvtsR#5YJMDIguE+>sr>36`P(9NxneGSH;D!>SogDCk z1Jd?g4`YpSB{(`qyjXad`h9wa7sc!{dWH`^x{>aLE0D2UgU22$UXa3qW`6wo(`uG~ zq@NHEyvDM|!Gq-Cs%dgckv7K89m{R5^iTgPmmjfu(<8KDYsWg2VzBGavw}|vuxGBD z?UlIFfuw<6Po)tZBVHcT8EX-vV^=mup`lfN$djJy>kFM1LVG`5jP61skJRs zD5&+0a%y~y<;dfgy)oEYm&poNE|u7qAXRe-IENEto_FozQxOaq9bHF8jAwo&Q9}nW zQXU#7cHA?s)+=8;j-!uA$)Mp);zBoIYS;1a3&B~LX@gZ#N6qvcK?r2!bgqHf79Jn- zlgBK%ozJsV#V0H5d%i}U#cCClkG98U^I3o&-SWnQy3$BMnLnJJnCW$0iciriyKSIv z7UI{PA0EB;C!Co)Hn_I<;HvcycL%OYAHKjPvcXn}2KK|m8Uu%gRUtd`r z8BQ!YuI=z2?diO`NT@M7;$RWIZ6{zJ-Ai~qsYIqO9MpimXm*Gjl>6&iu$Lx1AnyA} zCv@|JHh5?CRMWq?=ovpk(`iOT-Kkdk3_?s(OCb%{iGSr66c~ke_VIQf@qADGJ2MJlXH~{vIxBQYf(jUTNI+Y4E zE8~=RRkOkkd=P8_MpF@<{_rWgIRhn~`BVhCKJPkTm&Jc(20omV89+uknhN8muxRCG zHg*nm1z|lIpT19eRDGJKFZ+uJ?`SCxi=t1av>Y$--AauJz6 z=@4L93J$T5BiGa8>*UMfVQy1{1!!ZHUS*r7`B8L``}*eKf6PdnNigW^GYEc zvII?=D8uae>8R4upCEkq4tCX<`;?#PdF>z=9M!*Q7750DSx(AbTBrxI zsN9&O!&`-_c4T&K^{e_NGgpP5+3*FQKGJ$%F;#zO3uG&ggH8LhG%=AuCz*Mk%Fu;F zrSt;{OKX<`pH@dR)aGG#z5eicA;uSm#5$*fW}JKIzbGwRDIn7|lGIHewBF*rUv{zL zvyY!Q9=Kz{4+g`7lxjdFV2z_=lIa4_9UKm-nS$VJ6&ORBG=h+Sd_thvXA^} z-qfg$J>ssnCc=NM|28CamGkek|H7 zunI9(l1-vyVHxw=zk-T}dhgGx#ktHOciA>3cvBesWE0ww>{cA9e|lUgRpQ)KJQChy9mQAP!3< zc>E8Xma;Y&s?oVZzCXJB48g?U&+1e8_%n=C*~6RWgRA{kz?XTD7q6zgcC&1+FaX_h z>N3mnY>BWSgZ=f(7E`oJ>!>imn9JgqBT3;Jd#Y8_m{|{{$UZV}PJk8v6{o>IkeyIu zn%UXoRsb$yQ33d*^DFd4I1;TfuQf0tkbTA23$E>Qy+NRn;ycK$!9mlp=$q$P9Jlo> zDGWe7$}{FnRA^HeT5#KX4yk5*=OG@#xT1#@A2P-1o#P)GnIHoCRy;ld%L^lbcEh`; z+=;yVil<51Z{Xm5$?2<_uV3`ux~pdiUTB7dfz7dCz?=d7iV7V5>|)j^O+J+*y5A*~ zPGw4#)NiBYiMzcQ0Pwd?!M$kvDh+=NGd=m3#b`T1iS^YQLIZ#CaQI7i-;vDP5B1}= zIfA@Jl*YI~#3FuF30u76tL%h7K;(~b`<^mlt2wO9?ly45cpRAZRmIR5eQ;iydki{)2|8TKMyv> zB}zPc*sH%216O_#5bXo##uttEI*=sJX<%a%yj@u7?^rrr^J))fjB6h|>|JYZAT-ZB zL&`tNz3!+OYWIwRj*7q1d5qY>C(?Ua_D3f=&Xvm+!Xw2S>@yvfr^Kv$dfMNXHlcDg zKOSi|{C{kq{G`vO8tl=Z>#clLHx8AkoV)n#OnLI6Q5u&jB>VwnGkCB1PEKyV zlDHD-0bRHMCvHO8fYWfz-vX|$-a+Tfp2!w(?WY0Ukc3J_-oZ<`l@URr>DqRf5Tt(P zI=-i@kma`Yw%I!Mh3s0%jsIvghgyi_Bf|!ZBDNU0(#6+{|6JI^ufOnBK2v-f+gCkrI6ZI=7#=mbHHB&7hH~3Sv*vePJcLqVW|E~Jn#zNJHsT_!kQ_dTL zk=k#-D%P%<*)0n8gYMD?HaQqaAc-G)~9=D@LZ<{tV^3lbyt zAZz^m2uG0D4|YMjaETWM`y_sd%)VAZ-K#w+bw-50RpSN01ipcGyi+U)et%z&7Yb!d z?>ud>Ph0n$_tf$a-RYj@4rK>XOU1?;KdKg*YW)l1R}{&B+KHOT-8#UGc)U`MHY#?! z0lsDh@41w3qO?5Do8<>A9#NG9ye!~#PYI}a@(}|JqSL_rQCj+>gyWWMJ7M#)l_>Hu zlG@g;#&}X8aGB5F0TW*%FUWBkUx!EqkkE@WrR(cTIQ%Ka77d}_)?dQv0V^7zc<$|g zm%e-cJ;fxtM6nR|41Yc~CiUw%zsfB}jtF0pSs&B3{mcO{I5lq?#hpt1z*_^(f zdsK%4RRRUIahb=onbrPgcY4sElbxuW>2b>$BjlUw0&1YHUi(F5@cNiHq_Ow92fp3d zTBz^Ld>?<=NfKN#2=B%Zz!1n3lP}||Dtkd9{)kDZi;Mg|wrF&w*M{*@Q+4tcM!S=m0cb!8*Mxgv*`evkWll+{6h>3Q_00`^lY9 z8SQCo4g|Ru%y&6V@*au^IW!?H+XVC^Q+>!X5GL1tpvftQ%D&QH<|@JD{+Jkb6Y6Ek zArt^#t}#`Sjo`TcKnE3Aa%2(jEf2S{rG3Ac%JxxPd?kL@uxPGe|NevF**-(s`T0Rj zZT0j*5W~Xkiip}G=pHKghU-h>vrHZLK3>(5L|VF4!jTp_^1L9YpJHs^*1jv=Rs*rt z5I~@8mj^$Fr9eNLjdQKJWNy`1jvZy9D+@$IZ_s!4pB;b{>*z>w?XqsbzUZ$xzK>%u zV!Q+_Km4ivcN*D7dRb$Ee-XoqK8AK>`7)?;i4jHW3Rt#N($R(gq00HzMo0&C^K3rk zLkUhx&hLVh_83$_VmWx02l01fuwQDH_B-#FphEomRxFccz?Sa55g3WN%0O~KtK;Fv zwg{sQ)~n!Ey;4VJ!t~Lnqd}TxVOV|IfMvVRoPr^fPfiT6kwoJGw(*~|UQc^J&D;6Q z#EG)#PuhFICug>&?1zQe2mbfvmdhqI6_-tZq6#nnz`18R&* z6<|HJ?n_7J-AQv@cc`v(=mEI$atTb$SAhmJ_H2W7&51wJ3o$;MVdy$YLoUIxmC1t2 zAAOVv$PF1jk1RD2doKfSZ5>(ndaMWT`mYF3j7BtV+S=jj@f>C+;p@WJJXvB^6Fm3$ zHXrberx2(Sci0+?^IHvhw5uK73f`Z*n>nN^Fyiw0x`?E$rA9^rX#w0T!5x9Wb^KHq z%%EMy__$e%oV)Fe0d_x76w^lVk!!>mKzcsJ`1F}n5{xI=2SJHhj>ZrGF6dnI3~gYV3{awApM_v z=UB>K&DYYVjbLMwz5$z&?P6c|Q$1QaNTuA+_=QxgyRXVKO7#vapNjwb%ZHp$>^;lY z0q>1qAcL0o*X}~-x|;RL8lLmPL^_w(-;QMCd)s(A_~@KeU++Pthz+u@DS2x6yIM3Sg2ZW*uG%gr=tj&U%e#4&E04}yr1g&+in3E z)^{l?eA>ucdMU7Cf!VtSl4(-gxbno9E||~KtAj78u3#STQJwwZJ#-Yl0~s3(>bWZs zD}c69r5HA&*v-Fe{dy~(zvt~Q>@O?^1UPy^_oN4eJofAa;X>CeD!s2)QhYjIX8Kpk z8X&W~w`STiSO?kvt?t*MLd;pO+VOOEB7BJUh(De@iEPIgP^IbUCibm+Tx@LMq9|9_ zsQ8X;a8a*2r1*P7;lmo&u{|tT(y>{Z46*#`LbfTnNI54_{Mo=C*oEovq1Do_H63=G z@q(Rck14F8_O@%J9Fkx_&4v~Vy}MTLCqoizAe(%GPm zinYVg@o+eZf{=Z_POHFak~J&#;jo7*EUUH@OjY~Q#aBTk_P8*p*pYg|uOyJJny{GQ zM_N*{d(s3G4|U3+xgU7jNbp?U5>U#)x~Es@__z?Or?oS|#wn1Ia7U>g&x%YM7I`w| zOJF^~K&9c%Zm}>Z`^yJ3X20_J^eaBlr)>-d5>(AH-HToK1p{uo}%|8OXBw8255TYahyy6pu`e;UKVjh#_>gY!zvY90NfJp7*e(n9#rRcyUbhfyNSgiy(hB>b|7(|<9Zd2Un<5)8 zj&eXgA1SSvlsQTuw;~->75)XBf;4f-LQWjI=b`29@tOGg2P0yonca)hXa&S!v!0FD zLNo-y4YHpS;O( zi1R7cN}|{{C#Dj8Df4Z$e9bj<7|O3+a*ey51ljur`>gW5q3T3|#0`d2gF05_6Q{1M zi5OS>)B!=E%Cifm2#-eP0dBuKe%XwmT+Yl@aqZhe|9q-Bm~wDS1^d}G>tRNEbqp@% zRY(j^Hug~N1BV~8h3W*W8HXhmU)dBbUQ%X0JLtuLHVh9Lqez}){Jh5jOC*EeqvCTb zL(H0A707VXWbVC6{LXm1ZEw2r-8W&jIXwK|N=6L;$%HUz@O@Gs6%%L6wxE`Dv zRqu220CSBYA>(U%6d}-%8;{t24=wbdE%ibivr-IS~Pnb~?Ra>-K~^7{c%974RuYDu!9F79Pd;^Mw9$={ptIZROa~Gq%MvITy$z zR~IwR?=knDNYJ0$G9qK1<-q3S?C(9V8SrQuBGR!GrzY#^R)qnVzZn3R<(2CA1G2} z)%C5?xh!NPXq54-6;c005Y>aTk7FXSql%qdrwARkygi0S7YJJTbZMtA!eRGsw^<=n zPQpAct;$@uLrWmO+gJnZHDpbHS~*umuU2D2fdd!W?*NJ@- zg4nzd<)<)TM}P)>&jQzT5`nN(=jOw*T6cD0R3ek*XS%gIt<|zqlMj}bcuvSGyxM>y zaQvJzR&R~E+v#L`5&;LtF%L_VYTy>2Pf1Y4y{0-@p}=7KB?OXsz>?9DM+lnnHHK~t z6i7V$gEHAECN-*Weu1^XaGIZ~b{HoOw&3?^*kt*DPk!f3aWzsNsx>F9c!9St$x_E;M2%r)xIUcC35ehs z%D_63L9{+W6p)FA=-Hc7<+y!m!Cc7)0gVG{O;K_SWjD3*O5h{_?ivr{L7L3rT`X-% zZKy>xE*{n%-1FB)1nOpDO@%;vmdH~K$LyWeOsIF~Ydg)kUBEgJK?}jBi;Lb+d-YxO zFm7!QEm1v4w@WG@58_6kSmrulCoVfkyepTJZ4Nu(UIB1gF2il77;?oO@@|JlCE4dr zW1^nyX2AILHEQVN(WrA}OzHq`Cln!bb+ckYpSJZ;%Rb`QA|iHjwi62maW6;o@Q@aFKm3Mc3@bJ_m6N3LTu# zQnu*1zuT1e#x-bjF^{hi6B^1~Q?`tKY}X2!sy~%1y~>f^PGkIt7mVZcpUs4IlZ3v3 zk2*Lbo*ZqQiy6KS##4jl%-+PSbBSa<*DCh`xwUL(3n5`?s7>8LGFCeQ?SWISF$6^H6Uiv()w|jb+_|^fj z+rGNxn|=L$(K0`D8}3(1U+E*RWNv|z|F3-LP#?Q_6FH*40!>Nq=|3V1`;8B?*^m1U zA@|8@{;K?QS39{?wc{eC!89Yr&nFHXl@^@2+FQ8~z03%h?LNhc)Y zb3dZXttr<8X(DgEExeu#PDx?PL--g^%~t^&!N-C@W$)Qvtgb@m>+v8ay)j}sI_;{C zCg;1iCwZ)FE9##^dit+kd?p{+Lu{B!vD`C=9{TUi-}J}NU+R+asZ(sB;&ReG2+wQo`8M#ZnO9kN0?&OUK?X=23dC;p@I+Te{xaw7Zj>wUA z>BZ>?EO8Vqrn@BbljkMMq{-hnv8uxT&2KMwUYCSEj+Xd{`aE05RWD5ht*V+4cJZ7g zWog}fawWLTr{otr?^MuQT}N`PCjH+$D$Q3NT=9%fY%Xj2RtLA2m^Zp}VRv_cZQ?+) zD?XSLG!j2B&IP8Wn@G(N>BJQI8f?Uos?}G+D0``ic0NYGr78&?8D#hzJRIVciMz`( zEylyK9z9eaO+@z3^ScCmYa?T_%6p48eCCxiUByPlKXW=y2mSq-ZxV6(P*4jgi8spL z)0@2*f|~*zD#mhRS!7Cou@5$r<}d}OJ4(^iN%(!vh0ws+eKvrg&10~@ha73^ z`NZp#(5{s|U{re7#t(lMIGT(zifDSa!Vp^(;|>yRJWZPwv@sjve%g88b2vnUyirq+ zn`h#gazvJuV41|q9!3)Xkj`1p)o0!AB`#&2T-9tBQi9|MZUNOJtEf+_(S?N?f~;HT z7kz#-#ILiT{bQddLG*7}I_L5H4L1N=ocA^?u(IuTsoWxwOwgzoyCC>B&KmPqJ1(^O z(kectdDa_Sb-V_fHDEyfd~X<#MVz^T>jVf(i13#sU;fKmnYO_++!qJMvmK8=+H@q{#6a0TbN2(K4jQJJD(mgoa3oI# zx?l_Br@wkQ%=b6g-Z&o>lwAs zgHGf9A;0R@8QO<+E#i?SvOxFUZ(KrycE@|~>2C>=u3W1_FNrOAsaAXH$SPdEt?IeQ zBn{oyyQlM5OWMRd{R)9_Fc(M`(}7u_uVW|hv$9&6#I)xopBuIBKByG6^IOab%$ATQ zZ=@S@3G3h_Zt+OO^!f)|9$DYHzEBnkfzL3;^>;756&Hh7i*)3y)MV|uF=|U?jxMyxpe~kOaS=R zX|1!Z3wUN{X|a04!f)a@8TwMwc)KIN(`p*CT(5UacaHq81frI0jt24Q2v4D^>729v z`ro;atajyq>TPAOdWb$Ds~-5?vk@|-;=0ZG9XVQy@A#0a3gAGIph;u8S{C@6n^j5F zAKEYztbH#T6+etT6YhaD!93$OcPe_IE3qk3R0GS@Yn1!zo^>p`;{e0x{9^@1ei-Ww z1gRfO|61)jVz+tTrGy!HNoFfCxf9z4o>EYI8b=o=ofX)``zoo#eWhs7sT3@~oI6Nf;L>#n(fi44{;nNR`~ZbA7-yS1u}*FWfmB zWS+DhHsGt4YUDh-s+>?B3Y%Rt)RN~2W z-o3;j|F<%E&L9kJ@}lD`Aq<-;gxCE(Rt<~cw)D4QwQ6@SvA^jSCeoyPh+xy_y5Xzw z4iG%`_XA@c2Yo|@zxJ7qyLr|`8D)Lv7GjJat(^$zGif=*s~rc;+nX|I6l>OnxBx0{ z&&oDVj;3RRx^AVAlDUewE%!1jxDo(DyWkm{bGr4uXffyah&@ziYy@rkDS34pPnWelpVAp`Hgk>dfgU%2ap-CkiPj$E&cwx-81)G6H1GBGul6S zdSDsrhjl$SxQ$G7&#}aTRTe|zRS5I-pqjN~9x+4%Ltm#CHvGST5CB$I5rt@EA?YNL)sI;$Dx8lZ-JLi^Z+srN*AM)Kwja^lZ(Xps zkIR%@4pc!H$e@A^kn8nh;;+ndUr6F3hUj20hF$M?6Tqf)gi);%FnI|>^&q=?Bobx7 z#gH!|e4ytOH9Gx4OE4mG8&-wrQmZkFVctgTU=RO%t63RnqLlo+QLQVJAE` z<2a~Z*iPl%1rw$Uw7liC9d+dhZqL|i(_nc zxl(4|SQFWp&kiKkxzE`6BinTxXr{(Tz(Krdzg4g$6_sen?5joVh*kY*^jmgPJv5uI zAI=>aig6kh5FnrsqBaY~^9})Pm1!H}YLxb^s^`6ncjNB`AYkFJE~ny#xw2=MT?8l= z!18eTEttnlqDAFHqFPFKSm}!!gB8)EqW59+#c~hRf|$wG6A>cA#Vys_SU8qYhWRcF zigV(vXb=;^Y&7eB z398R_zpd9jIV^(r4Er`x*`L8CjKPXzcPFQV`-Np51g!vbTNP`HKTi*UKOE=c>PBCF zc0fwhUkKABfmqBSA-lUAA>T<9WX-kXNeF%DM5_30xgKXMnSOPfb>~hbXU_MXNE%`h zEeJ)Iy>FOs{gKoyb~Vrs*o zKMJ1M()#ony`)zgCOP=Hq88R}w@gDU=DmWPmq;BEi}U+H*`DzT8ynsn^EgQ4L6=c#h>+PyJT4i*TexUL7=( z6d8*wQHnem(T6#Ii`id7voI-_qmGlj#%Y2PW`ds_Bjo-DRVnagw2P4~F*zXHZZATC z74x9P4~0${IBt^6T9cC}vi|OhW#h( zbn(fGz*ekh&DPcHi%R<5SaR3S{wI%R`tK3m|7`&Ff3@iQpIZ}D|FM1ezZ{TsNU``o2=V@| zFx+N(lM`wL7`0j~BzZFd`2rZ{7PemIKIPiL$IL$4A5kmN<0NcBYnygHE?+}~8ILtK zuL_n{y-fvs`iulUhnXK?Vk&4PLk1VF3h9rnT;wL{00L$GOkh8L(A4<5=JU)@6r9 z>nm)o!K=hYfZ-^*FLJ!?o6;Ab>DLUuh;8UFnJ?_@(rxX95^(l(MZJ@;*P@`vc4TP6 zZE$Bq$w(iV1^*bw^1hi&CDd;Db-lm8sW}VOU)8a{*?1c^Na;VKKk3$ebQQGtic{+_ z4s>iwi?BOVd+RP*RBbUO+&CfsVwCf7oibQHoyJYuw|wjtv#Vun+-^t!WX!%iUds8Z zy%-|f{@U3f+ReTFb34uU#&dye=ui9d_fyhR^z~`r?QxkQMbAbrer-&a0R!~Q-^h@- zPmf~tB>W=->BcO-OzJYvAclZ;<8$(}a)8FuV)X6N#nC>eI@@qF*4?26Ucukt%YAW) zO2MHWSOMdoOZ&WA_K_Rv87H(AU?HSpe{a@|^v$Yvg|M?#Nk0|;7_C5SxxE%lEFhKmDhk<|d9;uGcTuvn9 zGVh0xJ~dw#87Oec_Yb9rAwaq zfxB6toA-OYv5zVLk6YgOyS|wxe*+~3dxly9&cW8IB zi?aRfq83~#QUU*`855z6ln8T9aInp)|G@&T)^G&*v}nDGk<8P=+qohwDMa3SVHF8G zr+>$yhBKP>Cs#JRQzRHw{K!d`Ws=c6F~jS=4O7F1;VS9n<1l`ij7qSUp4ts_0Rry1 zV_<3RL&zA&K4#UyXm?@axOB|D07dhhisKIt9Diz~gWHFK1V0tvNZOLb?2@~vmCFq5 z2A%$%)XrEl%DfaSk zTLDb)3*x}^vDQDjhQL1pmOUyB^CbF<2deudTh6fU9_&jYX@@QVF$kBSvX+BJbjn{q zUq1vx*xdBz4Yt+kca@-75IfY%S|C>MvbdzR`z7`We|b=XJ;%<)G`Dch$=KU`t$$pK zFCpK>!k{6ap_d#Qs*$9-8Q*X0eOA#6%v2$83vYez3SGQEnMguOMTsPAelL29WO%&7 z1B#hK1H}0VH+C6}Xt(^Tg5ERUc!Gjov+ZhT_zR!o6DX6~Z%iE-{TS&BB$VlFg?$z{ z9ajnkU)N>W2tFyWX?O)ez}CuY;~tnv@78;|&UA#(U(GsCfQ3YRXH!H=SSUztp+tvu zSy5PB!s?_Ki`{g_?yi?NmJa_H{znsRTcKm6yzVAiaD-e|A_M^(uvt9XdelB_7{G>k z|J_Px-)h6aRp6O&ReDDzjtta88VYm~CElw`sHWvA4%AP|itKpY_#y@E+#$GaHsvDo zveIe+C~n_`HdFPLK4E{GK1)t;J=sqRiEIR665fCkK1!FYWqVm%7d_n)RhQ_#)I3ISPdCEggR8A3{%%@2+D zZ|P?%+##n%tr3Bz;ZW>ux1(}JB37P5_ZAQh_|zS~vm zw?5TOJsDm(&|0d`YE3N^__e{mW@9ZJ4)j2?grk=nbRMl=c7e7P8gQdxq4q&4E#b$2 zUi2}l)!)2%H0Bo%?2+&5R7ZS#Ghc=Z5gKA*do3XPtH+}C>;3|>q(lf&(K`FPmYX8K ziOAO=aaWY#0_{;n@bHY)!L*Ni&>&_nZK<#`5gFNeLgx*WpXs%aqr% zxoro{x1Yfh9+i@F+*qX!I=H@@iM!88lA^I-1Vypr({nC<(XJe(Ow}X@Whj`j1U| z8VX{3CU`zD{nTNAm%2u z=a~JSpts2GB&uM5G&BqC-TTRaU4X>UpCl70xC?e97f7b;zxzN?@)ge1@HqQ>(VLLo zlkgUGLmxS>0^UN5g5gxuxW?Bto?*eb2+8nvI1mD2=02;6uKDq%r`LKp;EoyN3A)>_2ck=syG$|b zNu(jtm@bzQoIs9L+Yd;m$M)--;GUU(N;pJO|tf; zz;XbW&K_L%1yz~Kae13=Vgt}z&DS-8UXXAkA8e6UexbtRKR3DTeD)&BV)f6N z_Otj=cy>kf0vl3XnqQuw$4*Wv$y*i2{s(?`PP=UX+FaDDp*UT61zX{Sn6ZzWGmhxy zO6*5_<0Ig(dbARd4L#V~;{iA!ELv~+o74}N%4sA3d+d-bld{| z;NYVL_#gI`N?|TU$;}Hk&jgv~U190eM-0wV8fjvLw}MVv>YWVC3FUuh1&ry{N#q{? z%fV*f4_Pc6z)!JsqLdjg36Y8i`Cq??TZAZ003^rv{q7KCni?tkJGnQ9*38dd zwxQ!B>xYDs>|NKoH`H*`q+as{C?fqyOO*5Ji9$=SghFIMN%3YWG-EA4yKRqW8t60+g3t2h)UN7={N)*xT*vSJ&iMf5oX{NbydPQ0-amA9T&I5 zOgqn=S8SwdTk(3Ir=`K^IODH038>N=zcbffHiXD6@Pv`;=EvBYrDSSoF9TXDs zyJ{15wpkdynYR$hd{~hdXHMk#nczY+ z+^QtUT*OH{-NGWw4zeUJC=@D0-UrparwI_`u@B$fh1Iv}kf|>C$_QYDL!Xg%tGP3} zakIX-_J4L>AC%gt)PHEAS|@T90~oe2s#tnx+NgO&185TXlH<(Uo&?9y!X_Z7*; z5kjwSVNT?2Y#XT(OBz&`6b*5K?%k}IzkC_F&Y?tK_l!ovY6nRXnc0x@89ft%`sAM| z7GzfXCY2*!PPJ*tGpGBCxRVnnD%v?V0w7N9k`$^JeS>qo$$0%x2hA@A*;A( zi5{`$=EAw_z{$%EyYv*y*?xR0S_+A~C}JP4^6slck&}c{vR;F=__~YrZy0}=5ZzNO{}GrcqfEtiWYRhR-Hs(JlgpaDbku#%fU)_r zpcO0h{0aH{j)ddk@V}-ZY#t&_G-b%2Cn?g|$HvEp@R!JRa|;oc(Gk;nR!E5eR!Dgh5wa^0m4R<~N3V0z%Z0XVqdWE4NScpl}zm>}?-utKn_No7zcq!BwI7~_et3V+A}*V#q7><9tRu^^9b`p14Ne)z@Tj+;;Q&)a)+pPY4cDwz;je-B8b>5{ z^*H1wc;jQoY;~DM_aYYVlU(ff1b%Q)G!x1?=&_(1%dGi;U#)>`R@b+xWB=^f`nwYg zIik80|5s~g0u5E)$8knXN|80YN_NIhWUG`c*(($YV`psH&7cPnLZa--5@jj7j3r8X zvX?DJiAnaIVa$7PZ#vC9d7kGz=e_6r=gvK6?q|ODckln+d+zW4e_!P|d`aM_@cO$l z(VD}Pd9Hh>6ce(-=6Ww$VBrzxodR(Ucf+Qs4EEx#MB5F?#26Hz+;~`;W34k%gT<+M zQ{f}^j#T)iv|+`|xH1CG)(EwBu;EF$l%{lhqrpFr6MRF^KAQK4nNKzXbxVIhTsc^c z+9+xd1fm<5-)|)9ak5EXlNwFh4nCdH9hp0OE}n;P(x%EI-lCNko}*|j7xXFc;WoH!|^1?t+CgOy-5!hs(I7H=UVC5vkSW=`}RmK z8AGHrrEfYptyD^3V?!P!9J&V;Qx~%EwN(sLaI++vbiwJ5`~UEkcbuqe5`Wx3`(ZL`^9wa>( zMCg?fIV?9Q)oEChjkDpxQVL`2tgo)DSAI)#f|%axl$AZgHb@Y+A{6>@)bI(%dzsyV z_{rLec^T`36n3D;q%YB@%3ohEj_GZxAs8kVTzoBf$4zD&^C{EhQJf7EU3x#ogHKRQ z-C1J+KHXW!gd*!_!d7_Ev?B!CzO1OpAgE(K*<{k|ucNZ}Lv_+`px~0MRnmDDXfr44$y%tGb4hU=nL$-CrZg{0H@si0-C&4E zXM%5mI`?2*YsC_-pm{lMYmKmshZvxR-b*l_9MIVJSuZv=%`J3|xA*RcD(WNj`B56qLQI(rJr0H8 zg=gjOZ6E4-S>!ZyUeD`<&O)IiCu=}K>z6BbAt`;dt`+qQtfEnbpf|baf;DK1>rGum zGx5)P!jg5=&%8)b;iir{yy<;0&r>&K{Zy!_-?)6fTM94w#d&gNfBvj?FB&b3P!9fe z^O#%z8vfGN963(=2`x4QIRxq{*9@n-o$Aby7^>MY#`zAWR)caU%I=t>Ct7$XHj1we zv7uVBTP2oE1=|H%y#v1T#VJwESSa$^EDCgDVFOMN8wc~K!ut-C$EZ$ykQMlFa@p#4=(R5O0rQKObGUG}Ta*Hu46~jNKbwM|n z%Q){wz-xhZ{sXm!NrDKTxLQHYir}0M3BQh0T5uY)X(Hp>1xY&nsr}F-HO}ebj-}0K za#XjHneiW_vQ*!wPHD#ILLV8qmkcTD>9<)~>I%z=INXbhON>qq+1ouDSoGwOJR%3% zz>cTZ5F1-D-8Ss#W?{PfQ71@w-_&c)bMI&l3n=tsR?IIPw+>TBE0=|-$sSyr5!bdr zSaza)Y*~C@#+sbUn(E=uyOWtw>Owx{9niOVqXwALhMb<42<$=&<$WjvVjDfKR#qL8 zgH-*R=vL7z(2G_QS)F30s9R0(uf~lj_0qLoCTNI6rd-$#SeB-YXm$+$QsMd1N|c-2 zQ9{V!zT8P%0yOH|`-R4hWh>!}JNVsK9}Bo{zJTRnZ3!1tXPc%~7vmg0;4x>%JInb`wanfBz;8q2>8hhR z5YE5nrgLp!^%$b{6d95o$~a%6EYla)x4(LFf|9bzq%87F{;BH2)H&FHcXleqvm*+)^5--qCz(erWT3@{#MA>Vp`lRX9UeA+|I-)lq&q zFc8ZCySneL>vVL!*eeP_nWL7+y_i>IxuQI%n=^eT>4G<`dNNnpdU6}pP<(Qf&VQzz z|0-*x0iQ%(o6LxNI_8~sTQy99Ab{UbLA`AdV7xjf`Yn2JIrweiAulC26}(>b{rWVA zxX71*CGlPoBI|7;^fKe72b6B9)xT^KFs1L%@pH9IayC!WNIBtuv2@aRCx|S@VNNroLt;w8#dA>}55?AsVmzKP< z^Y~T#pVI)pbwk_91MvO-@&IB(%#Xta4U2{d0+kjm{FR+(p0RbxjcS$|uk2woKTOd{ z1^F`6e{zF%2IKhDCQ&=k4!ImV+GhA6X-1c`ei7x3vGO0m<{>_3PHv{sqSeuJ3IFPlDfV&^XybfomRTJwdI7Af1(%s6L*nCIiciY z{Tqju`!`{2@xYMGjKPlePNP{mcg_orMvuyUpP`>&rc1^t` zwtYX4Cu+2}wx?(yN%~!l@z_>(kVDhMt&|MfAt{`MRB707Ig7-{B~v9_n9^9UJvJJv z^1S|Ys`p&Yiuz`;ob6VA|9q!%|D137L>RnN34xB> z{Hef_E!*U#hkCu?tQr>2vBf6F`oPP2TtFIt93n~~3KW3Z3$!C-$`2UL zHGppsKw|{j&V>5zsAcWy?cxC#ZaLXlxLbPu*A0x6kamXs`X%7k*MQ@Yd1rNCjv|i% zKEHc*{iS9)DZ`}jGzD!^W(MMnWULhQYvUf3HnHaR6!zY zp4INuznq9kv7jp;=={uO5MqIVvjvi4(I>}+PI;BUUBTF6kwU$+I~mOP7=}1#?sot3UE$v zx7@vZfW`}T00;(tz|}AO-*p(!w*d4W0HqS|2@~%f@{ZJh*OkHYTfnjL zT`PD3-I-A2UvBRZchUOmAN)=%SQiVdX$6WU4nuDA4thuI|JKRD0btrMVLb?h@{n0@B?^*itP`+UCd&pE&I`#sKip65T$Kd$q*uJgRE`|WXm+_vQ7*Vwmj z-+{eHai7U231{HnOJbkIzDKZNzd#q?r%&9W0WQzn12z4ghVtw?vM+w`>;Gq6|JQ3@ z)`sMo%#oh%+nu+|a?>2LALRQLeD+KC$}9i+IX44(*XG>^NhI`L+M%PtmVK&L0&gTe zPaV(aWk|m=_+)UX>X5`fO|$)bA>972X!=EH-~SWM@x5rCdHK2rLZOe{T^>Q*TzuUF zT>cZ!L*9P{;>`1}cg`OyD4OSlAnB+@yV|1pq-98g?%S)6ICgy})|*>8cZQ}Mbhgnh zACmfIpJ{^!tg1!0FQ1<8FO1Q;pyLssV`Y`dL<3O-@&si=-w6EtmDzsduUA^4AI9!z zO-oolKbqfcJ33ZVZ2G)M+sPchy6c*ayYX|>LVkGx3Vy3V;yaO?H}`p;1^N-`rX9bN zXrrTrzLA#tXS3-Gv=s0*Ws zP8lu2%6D{}f9Wnr|MfW`5%a6R>a=a1ds)y-X4&rY_&ae7~_Ei1T7DiY-N)yI9oYzO;<-VR{B=q+iE z;6753ryyce_(Gi_3h-^ZSn||-2p@}) zzr#!Q4;s6*QPG%wf9gBxL38GFwHAa6@Ar8g7sV-lglCQXzF813I?8a(m5UKuecS;zs1)?ku}R z@tds`=Vv!3>?^mjh%Pu#p;I*HW#PMrfM>n*0z}|;dFA0X+>{i2>2C}rRXyO;CTfzc zx=9?5D0OtsIK&|8KXRF7Lo$1yJm_il%~CNm-NT5Xqux9Qt`dNbi}9kDak+5RyDNz` zfe|luq1ci0)+d4#!m`$bgxQY1Es~JQ6Z4k#rjHR${R(b5szEJdrDxJH4SJF|*f}2P z7Rg6sa!y|LaoKDXs@o9dhTeSdx-oX{^xp$e7$8MoixebVMn43|mBCUw;Dm1I&^t0x zHVSQ{YjBWaX;Go&_aK6<*nv1oCzpD>q6Y-=kqQVEEfCxOW=Xy;En{bb_FJFR-{qh7 zNY)c&jO_CFB?yJ?i}d!PD{_K@#A-DzJ$|)?3_rGL!vgU@nd-7M2jgWSw09ciNMlKF z%a~hQr~>@2-j411;y*C;y_(_ARRVYXJ_4mi^aKhYF5)`MwKa{_U*Ly!lX#&k^wFQt8RNv(*Lcpmd?n z#8qL+;Alf6KTFDkdW0o^@o4022L~Ro2Kt+x?@N?O_#t%RnJ83}mjHShED0~5$&EKi zZwaCY)%L+TU;fESN z+t3=FlHo;9KXf?TDU9WZuKze5dE1UI%BlOyIAuz})PJHGtQ%~?0tMJ_q;Z+#;0O_f z%Dp~*Xr#kIw0to52n%7ui_YB?1?RiB!xL@oRfK0SZweFDaZYm#tXIgPb)vPgV1!7r z61ZOit}!iBrU%>pr?0nkA2eu!2b_;E$k~2&&-IHKTH;TPzk9nq+1z)r@sDYX1h`8FIC7)u>nlxDxs-jyA&{pp|pdkK0HSim)X9t9#06JoQg!P>|y zA2aTt_iRJ@++tD2w;wenh!>!qN>g{vA!fykAb&GDQzdc)!U!Y9#`S*rqu_H0O)k}w zp^j_jMiTDI)0x;3+B{skE*%Hfm*k+^R1rJ5;;*)VufB^@AvOTlcn(sz-^bQPG%vF` zv!NI7^PGc^b5HpaGl=k3C&lsy%Pkb$-EJTfyM%j?=>v3DtQ-+o)_?l}bnGND(VzgC9qwa;^8$Rfr>`diCD_xw@*)JHlJY8)Eea7KYKtGXy zi_oSs3o~{g)fEfp%duT_T$#?AWJj?it){S7OBt?DP#?WmF8Bd(D#jcn3>s+&1n8%t zlDuzmpwIZB3R>zs3u@9YKp$g&MfM^(Sa&FGcT8y@Klz1wfuf{>9_y#55e;)|Q{+d) zZJ;1CHF)JrA78=q1S{9Zj+@KStVtL2!<=qCckYafGTdwXerJh+u^pl|(RiPJXKW5H zZs+_iu^}Tgr7g0vBvNrpEKg^DV86@&UEn$sxSx@yHI}tzfcvANIsQkz42k%5W#EhfRYdqxrbI3vG?8 z(C&jI$IX0p+jo1K@w*-kZrPa}NL8whcaZa~81Ggrr{S<+JccCdwR zr+invuTBqAtiy;dDY^z`o}|P?MwW)Vh97gqK~P%Y?A@>gF|?88!zS;*gWHZbB2t2N znR-11p zf6fe7MjrwjRB+=TU*%GfXEAP&@z>Pl(`$aAeqW0Qrwk>R3172ErG^mwx_C<%NGW;k z@=u7r2#b^Q<)UX3>Nu`N|C==Bw0@%~Wr0tHv~}{?`<5}x=4A%x1L{I+X2#90+_>q> zvf{sI&SEns;!dU{nQ`%al`)O6JK+1H_!8h|U393+HeTKL_eYieXsXsTKth2W+-NE* zp5BQ!zDGax!GGnc6rCv<)n^JW;;3#ql5@}Kk!HLeU0ebON3lD`RHWxhGJM{6VUOc| z#4i0%$$K~+xfAC&NPL#3a2tYkjW|Y=pcYlF3x)p;$oCw#zJH1y5IH-dW3~gUk%MwQ&)&di!0yGoYFEm^3@$Kch?Kiveb=zA9*c4y}s)bd8W-yB zJq#unwSB-ozFg zZo*ZIe51G}W>qh9Y2gE{soI@=P#?=?c^@5ca=0(J8$I$Pn<_blWGawKyt}!sxwio< zA{uv3W?1wFjW_eMpNkRwip{xa?5%2)lA;Xz(v z43$Q);L5VMc%dTKn3Duww5|~FNLxfA_AT)u4aPh?DQ+QS=wygw5St^cAq`b_vXdklId=Tsjo*2vN5WST-ZFt%C&+SGZ* z#boFJt0SVJDFL^>vJ;};V!k)bMwgs1acjW6-?g^DJx(m4B@$2P7)F7NLA=njzH;u} z-0;RC4m2zHEv-p-oe}QW@X%c5!t#vHak6Zr)Nh&`LTFJitatqzrC__P88RwK0o;AD za&#mc_+L7?;^50u|50F)|D%(G1H1yC{V$>X^xpz`>|fgJ|4q1i{C^7f&i(&V?u&fo z6_gXQ+?UhO7Tw+V4UuJ9q=)ZR8A$>z@GYrN2?CG<&N@?38w`at`&yGJg7 zAEa$!G<)6&HjJHx5=c(h8Znykl%1ZOq&N3?>vL9F``=oI_b^?9TkKQGui`W0u)y zvQX|lxzYc-`*0tdPW z1)P!>{7}@$-BmECh*9b3(nSr}QEd^Om`~{21>exeJz$3}!bZxr{j}jrySTvB6DyJMO|HcFj;vbNkx3eCcYhDJxjKW5Te|ASFaK zz+sjyF<;sF5|*p+?W9PsaAjb7E_s+NMW+YZHcfEo~%JP#xYyO?~+4=7b^$S z!rm_}I%S#M{0$B}5uSMbvXiu&qkFDjtO_^;Lb~{8!truT0$UQL!ssBo{@JF)VfiB z>y+a3j%PfT|G4?OTMEXg_TRdD={Jj5thD8$KFkB1W~7}&%h}guf9S=U zX|TEcXr0Jc!a}>!M!eMEY1TS84NTIad*9Teycx|9#D&!+GP;Z=Fe4(kur1q-zi|(| z%wRjvZd5M9O@T`-)^VRzU(C*LKTkaCrSbuBHU6QqxFMuP_b62dcwLx()NvQ#d5%(4 z6*`)-QbJ0j+cu7kR{rvqp=-XMtdgw3pQ(*YI#gUuQfCq3~A{3@8D(iHL_tew_#6_`ozwMF?(!_rMV~mJ*Baq= z6}M#cYyL~}k4=O9K3v?$G@;wZ&Pi?oUQXJ z0C5&(wcL2jFfA*!q*#J@#*wpEHEBOm~qGB=r|+297?-(#SzqEE}%hni+tQw9c3O_+`{iI5#FYOB6?WU}Qwd z_8Fc0zP88oRa>M+w@C7Yi7T%zUOHiy>>^_Xmx1||(@4*|9Ga$=sRsAgoiocietxPl za1zPv(UR*!AoU`jSoo1l_ZWANJtPkZy0E-bNz z579R)jvn@eMYY;%huk~J%64=)r6KkFa5^8s=Ceg{v{d>dS5LLWcEb;`);5NHgW(sw z^}bw>`*fc1GgRg#Xh!7p72)jF(-_&F7jNLl2L{qTVP12=zGv8CO?+YIHwpt(c6#+g zOs-O?#As}g{f}i~`<+uVk$%{`rqs2EzfHBPZAA+TXKo)?g3*?SjQT^LVQvlxZ|3P6 zP+Xh~c;pYIIt3rX@4CgNLKT(8uZ)sb(2p(WXx-(2xs6gFXFV){&c5_}<=8DJA$#d@3c+lgB=z57!6Fd@DVmfvE_{K?ps(hqa&pvM z9{deFO}A*mE`rZ~jP`E;?T5Y*$_H3uZP;H`{Ah=oAtyMIZ&SB$e26>2v5F@x1rl=I zWY?W4fs{^rdPEs%A-*Ulsd*S1kehE!AXVJaUeY#6xz!j)IQKwPTLk82yxLZ3bCo{S zeT1}Y(Sy%QnvF)q`reE-J{^dM70;bw0-l2HF%uD|>0zDmtRI+4RSY-2&D-2>#{rc>E{y_RomdtZLsFhFTgR|Tn z3%sRu?l3pZ{RgI-+3!YL_Yxu#>$JGxBA5h%Q^HTHr86o&V8uR`Z^6rQgr1+KX{nr< zU*z-2Zd&xtSQfq{f+l~B-En4m(d2LXf*Dc}*KM&Mw{aocUxs{^kF6Zem~Lr#ePtWt zszLX7vh-lw5Wk;4d<{2|4UuNyiL@w%c)WrUh!6#;W@o+%-BQCOYPquU{i|Z#ph%q z)cuzpCd__5Sr*o`=ES< z3j5m(f$2q~!ctn9L*b7$Vw_+i%JQcx^f}%LF?is8by8Jd30~dX&w!0-Qlp7aP=2Ix zpmHscXx4ddc2+>d=2o@fa}9;-+?(p;DSMNB5JYNJsMN%q*nH%S2&o{yBHP*#W2yw# z7>MSk5Ul}}6(3ai$D0l;pJgl@n7IYL({j?{|UV1lw=GDbZ8$`M*Au90JLBI z2CHB3L6=l$A}X|?Myb3oWgoO|{1waF!<kpdzZ>RoMB08_r9u}4Yn;Qy{@Mo>ZQw^2YVtx+VbR+cK0_)GK+)(U zaK=q>a$C&{P(d8sg`E=G9k=AA^AQozXvUq|B#?4PFXp<;!aqf$B>H)v6o+!53GjE_ z&6J;ujBv6P-8;b|3P0c^ioSDsfsO1_!aUa{39nyX9IO4bAHY1uhFIt*#m<8owdpo> z+KCvf95BzehrQrLIQ*1fk-Ey#h4SFKG4EaxyI#G;_)F7&i^8;Wf92hHc>oGRat~m~ zG#<&jOY)#izCRQXsakgKAgstuBUt&`+%bb_RB{AAT5ECG9u9b2*kptm-i=qN6@mM1 z36CPAK#vhFB5cokd5;_&#n;;q1ei{as_@(5vAV4wAnQ7)xD3uZ1+1AYOhk2mR zElks@wP<9&R&dQ+Q%2*pTu|3f?)}9hleiLs{gzNJ-ZJ+7A~2pxC3ZU~x9VC>y-$W2mWXDw^7K|nV>K~~_Ecq{fy;$Fq#9e@rSb`3Mhc>|$Vr-3j z&{hT_r-$~@P@Gkyt#}}`oXpmtA;tXg>*~xHSmTW%4xf1%4z7Ymu{NAeUI2*0`Z%z4 zA*bMXpmF_^W=38m>M)vXeR|~HWc~eVAV0Hco0W8J(ewU(++!_K_`=gR`zzEUfhZJb zI%n5fz`7h6{iW#yA+6PDcv2d^&@7XUU4DgYh6r9nB-0b@5Yp?=&Fkon6ss#N>mGl6 z?{?A(0$i@ZDNJTxV+6^N&v`|Nj=mS@!LQS_^FXQv`=ek3Fdnp@Q^vMTu;;WY4|;JX z9geiw0dmjfn%~k%#jN%|`RKVN^SgdlKb}g=5kRBc1>p;WF?UJQ#+@N+O}l6%cz^Mk z1ysc0HM<3Sw_F97r!wMxzz0t+`$&A2W5apy_kd%}jMZ<$+#yU1?7`~=xRt&1$ySJT z13pxTCddRY9p&KMMK^ShKhNVdO&6roRil`<gV);5In2>qI4-_i$UZ*r#@gEc#nr^zk=-ebg)R-=e;pqk~; zdqsJn6KnkFKQp|HbZRe~pNTk0N$eEZ0a~?7MV(7uq6j-N9GQ>Q4hZ~q z0B5H!1J~bG49XuKz?W#=7zFJUO&AfzGULh%b0%(a6h{=888+1#bn;TghZxdhBHQy^~1BW}1{^vZLFLmt00A6ovS|txTv!#c ztlpa>ysY|aawA?P7wuX+O%%EyTiTS>^}Lebzq6*{Aqeb}6CXHLESwI8c#*`Vd!YMoMALm5I0=qRqw`WK$oMNoceK zO$KAQq_RQ({z2zb=+vW!5yf8X9|+?c%D_*B-M82KE$%wrkDbR313K9nZCA$a(0H?Ha!Jjgektb3VndM;WF~o7Wxk~t%!IES0hg!YVex2Rtug{T?EJ- z-)izv&quZstp9L%KrLgL8vIa;vnl8|6D4Z&H)HNAmXmBw;+~^wB%!HM3bAx)^XM-O z+nkg%kma|)Pz8O9n}H5cs_x5?+!2nXq%xgiQ8U4L_(-p;0F<(ce1W~?)=evuQg6+C zl?KxNCWNjp)!va=@Y14BCLUhYPb*X3tO++Ye%=?bV)-UeiC#Y=z4F(h{V@}9qexE- zZSa;0fs|fRFjoiE=@wrUC=I58q~ht17A#iDh-ZoQJcF(DdL6fYV8^@7?Hpro{bDSPOlD3Z^RJ-1aZeoXd;}y-nz>K-J_+?T%AsQjy=GDgGS6rdQ6s2CS#tg*ViL z+v_6*oGrsa^O5h>G8AP3+y0L(1I_Q zF_*`C+lR{*yN+R=Iq}x0|Q}%r}a#FMzRJiw;Z{9}*NU zFEQUc4N4qH#%J|%zi_Tuw&+^+@j|OtELr9zMe>=j1g2fxogCJb7G+|jvp ziYpyH*K*EC!6uE9z)}84E9l7if*gxM4XlV5-(-Egsu!uS+D{>D9p4BJvwY1!wEHTe zk7jr7)-ME}**M!9`C01OJLYJW8GhZE8V%ZY<~P2MTR+wpbUvPH_-ez9y^&#W?Iasu z*Uc>eR-JnM7BMBA+#7#wx*H0F-fp-VBKe@mrl_#guGF9q%#2eVP)KYGErH*$12{Qn zI*HIvyPh8d$9_cGcn@(|P9JFD;}ruWv?%~Wwxh$>F0IJ?J|;5>6mN@c@VS`}0js+y z2N>WAIV3W2TaE6ZLB_rO!=?Gydv0*~(QsD*R(XrmpvpbW?`gz2;3`@L`=Fmmsnl$T zcv2!RqOL*CTg^!0WxDn(Nx=|z1%%ssrAE(=&Ozn;qsmPrE)VfG&{LE?f%>L^WdNjW z@t_XS0$igSof!0>Cz{4H3Nf4UV*ip4t=;~0kp8=?t+XqqUbKZWThjw*=p6++&OGAm zx{Tk+<8*;OVsVH60UXNjeBxRM@Qw*;9j30wnT#*l=5g375=&n0!qCUZ2XSD%U zYh(W|doAt+ZLuNO1t?v@O#>OFUpc*ozeMVF_~H5`{G$aXvoQTx8eMu6N9+`g0S4bP zEiI?qu52qjy2Yt_F1iED@9UZd7OaLMf$JmoYp-tLWsL7-TY6uaHQ3OVnytiebE`s9 zIx4<-E`yHE%lO3EqR1J8nDb{S?6-x+N|@x+^j}F}`cMz5J8m&rw3Mj6!wWSC@R4GR zQB-y@?^mzD-P@(t-bYU5K`n0yQ>}a7-y(!R{zj1qJWT-RT$lM?$F=^zJ>yEjjs4@m zbj$-qgx7n1MHZr=jbV`(9rlhHbQ1&=4UedT@w$T zW@)MC{50|*wkxq9`doO$POl5ft58Yy>`>L)t+=Q^ZQ_j1R(wm)-R$)_ing9 zIMsitt0&ku?QAtV72kptGH!U$@+V%M)DN z0~;q8N$lfpvGngF@f@Y1!}Q*pb-hfO(*e5KZqB#BzeP1YDV!s5SfPvlvst#tJm8BZ z^ip8<)`+#SuF!T8!7tQb2=?i0DzfgS!Ptdc<(SU`E0$;VQ|>^&n=Z8I zLV^-oL-d8t=gJ4%k4KGnkRtv*SWd`Ujz&Rd`gSw35)2@QOVwbCd%S6 zaRy(0I|S)wDx-+jex$kE>GkIUR??Qixh&M28N6wxa3xt|o}p7Vq(<_*`g!*J711bE zy~8{@YOOjIhuKtXAL}ATb;vQPcNYDBa_^Jo@;Gke-3H@OzIO#?q-7n0b2aMm4-pN=kI<2T}JbsMN|O;8gd zn!;j@pPkBbJbKZ*?8tnUob6+b`Hh{der0qbE;}F_*uE$=29ZyP{`x>0ns598U2!jZ zfvOFqpfh0?b{k5M{G^va-V$yt-lm3wMqGednj!_omHSy40^5SOj2Qboa2Ja7;BJ%E2E6Ll46-4= zt%aK*R+(nbu7}^abM4%dJ^;w)SI{U1#*DpZXw^dG+!uf^&8m-tzM_bALZ5)C3?sr* zM9nmo6&$f;9j=)z(|k~p|LJslVYBrUJ6Eu{Nr4Jn`~haow|+6{2+;_ zrocH)&2dD9mG43`v&T331jgmk?kgv)KApgt3VE-JXha--^;;`Cz{LpBtGQqtqlP<= zt|K4Z0)I+Zu_^NY8PE3MYaa#FEN4ps9{-NCu?ineNz)-p?#iK0P-JSew>|H*him4z z{ehi_@JFLm47Z7L@?>uD=%n*GF6h>B)2k;CI<~Q!n{;weu zk_QIb{M48c9`6s&W_gW8V;#41lZQ^)#iK+&4xpcpIMS^R&x_CuD~H5J6b#{J&iUuk zLb;$4ft)LKA_-MDw4yNKdqxrwo|z-X2e;p&d=u9@bD z)PvIE1x{crb1LWT%Cj&+1Ad(|G*~m*%WVy70j!x7Cml+;l%4(1pEJ=kh)Tg%%-IIC z3$A1nvMBYt_|zIMY3+7V>B!67HRjPpNsK$1JTJRhlcUr=#$7L2bD~Eqybx!GFRQ=b zKEV=O=q`2{!I+|=V2=ZvAtlJmxVxe?F`7kaP`}BNqmUM$(ESK%sGLFTnNi8ZsCYX3 zAku9wP_?QCj*`2oUs;uj#`ECdcEa$oYnp)k$7R0>ik!I`m%8EjD&W^C%j)Du z=kikDYLs%daLEPrfVVz?TJpd2gxVrDG zkp<%F3zS0R0rUfc0;yl029uOuir6E#4s7^-!m20ic&?0>Jzl0)p;Thd=Xh7MF2z@; z*-)}dsuAMZqU$lUXQ{TkB#3hi6QQs12$2eswh2#Xy#|D*J!xX_j^Fy%UxJdHZ=r|% zNc}e8FL^{~YgNQ=(=|+FlI-sZ3ApikmscZ@a<3SV-K`Vh#)9x!QlSY~>1(TR_r_>x zaJ!a2OL65-Uc11Gr`e@F#U)IC^=$n(n&otyamNre7lzpyYYtYzUH8w{$OoQl?1jW1 z12cI87768Bivr29u5whWdH0AK58D2z7`*Ixrh01I7(=bIUquqGIz4879nh^P9#dIT zxXkr+(B7Er7lSw17PAJs%*>M!f-MAaw}+AWw}E6HYPdO3X^Fxw4NQ)<#+%G)Gll=*Fx_GX?^?o*l!NSewr` z*#JU|3X`Ec0ZkwI&=X~m z`9gN<)?L$CJTG5<8k{Gzgw#r=)_l1X@}}V?Cq+MM`*wJ_p$vpZh{Wt#O zB1-fOt_HOHb}@pfu&a==@5a9V7~o;1Z#K67t`_vg6+5@9e`quk-`JN zy722l(fF=i8(23DcLnWpU=ubhHr{ZljF0Z{oM%2`qC$%Oio3L*Gci58$BC8$5u~JO zEZ#B>tDLN=1zrIzDeyzpF}ajQvIJ?VuA>ElhMP`nqe2w+Bf6|e1>T;zhbAxuSGll) zTX5RcRPaM{zrXmgq#@DAKtgpIG1nYn`@A8FNEV63y$k=F&=JzN#)l3#8C;Rd4xNI| zGok|)LC-xJg{yg>Xm%_WU};W5*URuF8Ewsw>aAGZV7>5UlE1Wb6jK*xeqdWhgcthj ztSEY-CyrVDSQtH2K<0yEUpDOkZgDSQel@(%L(WzWjG{Nmgfp|v5#Rl9OMU`|E1>u$ z`+_~&d?c@R=+gB_ELBez)V|%c35Iq=j7I$kUSJ+E@@&80@M=34+UL)7-+3;Ee!F*l zLNg*p*8BBEQAP8|h|XP)ugwsod>(f*GX_PFvu+PYhX|r8nQ!(tbtj!rQLDtMw(APz znsRMKd%%9%CmOxKK1SeTzNIv#zr)<)`wffK6KKl*z~aZIcqxcDCnS(mCN~?eD+0q0 zLGkononov3_7s9w(xAkc-pNX|Z%XkwAM_%#WUSfAVgS4c${h z$v<;B0v9JVS6~W zWLl5q1HoP&4>q71Ub3@%wI7PM6lWu17JCOxgL6V1dM?}JlRkwVUO3tC2N`~X^>T+8 z3aHM8<9R43OO=)}(Xu_Lagi6Uzpk`^P2cX;t?D03z6@%ZZ-Mx#WbwE}Y^+CA18Ixzv z^jmo}S66wu8|?p){c(K-A$lqm_!*C&|Gg#)vD?GD@-c+Jul^KmqsK5d-0YWjid-1$ zGq?@P3k}<3N>Dv9Z>hMG>FgCHw4XKCEKa!=q@TM0@w|2j?MCCH>l8n<%07U5=Fbnc zd~;Pc-5V;1d)KN5G(cj(@6z?SHWOkamhY73%O-12ZPsuMMqE4qDSWTW{&t~lpPUx9 zR%W#;N10`$4o6jIz!_!;((aB><(^vZ6Uw-Iy*c8dQNl77+y{|Ew;)gW#_gR^VKie} z#=u3Nxwc~%9^3)kRrIhn>95N*3izq~+Lf|pLd@WBQ4`(=YSF6M@4095w+z-l)tV`T zeg(V}tWO6HuOS*#| z-E2p4@eX-c2XE<;mk3Uny$x_yfh8m|S3rekDO(<%S_E^nz}Nw5yW6Dt6S(0FGVJ34 zblN(bH?qLyz>>mWve*W8j=u{?ar_a;7!g@?oUHUugc8k^G^LjWV^F0LPwgJF0c|nN z`Yq+TPnj44ETGW5>#X<=Q!hYPD!yr-+_l!MtOW1yQKNq% zCbD*9jzL}7(8qlU*P1BQgXGhIx&4k~-<>Y%T>aQy@BZQ8Y~*>29knPCcK15Bs!A0Y zHyRPMpd#^>iWREBCTmgUY9PCJBo3Lb(ey{ey-tp1l7B^RZ4O=p9?XwBFx6fkvU8YB>sGl+w|U*$ z7d}dS!S(<)Q=!7U%D_K7n=l>IKarbu=erQojC4H<&|9MV#lqV_=>2bP{U0cOT^LhyMo@Hbb5krCoLS)(2+YcQuU>D6 zw~X!KOz2-9Uixxo{W}C6h3}mi2X4;}p+5TAoZV=@m_~)P@le%$YVg(tB7QfnEFkTU z!h6W)SYZh@QLx5u&D*r+g3xfnH5Mf#v9_?uOXe`z@f-tfzY)_ekdCWJQ+x!lOecb! zZ3W?sx`XIRwG{tZ?=wpZ`tQi<^4;nqYcxq$u1uF5<{mDE@pZu0np=ECEAkf~BTs$Y zytgEqZ}x{up9(cL8s+c<@GSRw**NfIs#$1Z@!fSspkOPa*N?c0#j=mg`$Slt-+EH% z0VO_~lAZi}@i*Wtx=Ab*XP9+xLSXN8w(tUH_I@hXe9-!LSJ9@#M`CDMnG`}Lb$DWo zOx+Ki$@+((knhi~srKN`$tTuZp|UnpFbKnIXv(4PJdKZ?VRS;t6}YeeN&0tFp82>( zKlkRdU>O!-siGNDuUiOUa)0sBXe;#+T@zg`kR9zGZf&aRw<^5&h{w&hxBkakww+ z(k8|OOiB{QM5A&!ttP88@%tKsXDoMQcHYeGU}kJvAQ?NZ3U0eQI!bW2F#R=v zy|~eIQ==U5L`oD*o|C8lKE~?MBOX6wcwtTRGe9%xVwRc8u3yIvs9vGg6eux%wmdNJ z@j8HhMmJnfH09!D3~eUHzA>L^3?MH|#8RZiyKDSk&fZE;#mj({U((;)iWmUG#Xn-y zeS0#u{5fS0mFeWgwhdd!;G}&RALAWJVmG%EqgdRxpg9=@bN;2L-l`iORKy-L$cy|_ ze-@v$Ip3l?ywI$xQ4tx%KM1iHN`Hp*5Lcru3Sf zCu!-s%LBw_Y9E7e)Pf;QJj>?5sJc4{L>>U^Gs#~@yl3=9%eb<2=dyv#{a+(T%6Cs8 zrX36qIs%1lzatkh0vanEV^A-h zqPXuut6Ctq$w6-5r!T}}w!UoWXaBwgc7)J)+&#D+SJzo+yMP^;m{o4sl3t^Wr)L@V z;HFN%R}ER;Z76vw4Ow+6cDVAj>l~H#iWIz-FkItNvw#?SBjW&iBSM1GQ40A;hJC!7L~y3kBh-}?RqN#|HQ-CPFYm)PXl`As%s_Yndl^n zg?a}}2$hQqQ=03G;2h`(Wbz|q1DvCl)Cl#fdqu^N6OQ1{MZQ@$J@yJS+JCbX^Gs&T zr*>P0)gnAJ4%r%4SkL~|+bNz+)7sE2_2-4wg{5*mN%?mbS)#*p?Y>2(a2~?nN2l%BT4DI7Vj>x(C;1T~tb?-|QPzRDb zTsxe!@P9~qudpWjZSB_vh)5BnC{08Jq&MkAML|WHCe(R7~BIn zq)$r8nf!#%o8`OJgsy!pE6P_6q^HJVVT(nN1$Ht%i&mO+0$6+-#>3MBYw$04GLYOG zX#$kYxKW9$R?j$~&A;ELd4fe?V@+)2@5Hh9{uBTui^j{}O~8Cyk#i0irAA(U5oT+n zm=qQV9IBx4rwun$wIuI@4SsU~*&SeIj}F>N2}Z0v-~}E~ushQ%@YiBBO&BNpQVT}z z&>2XBPka8HjY6OJ_5J{|v@muT?|Kc*J-NhlR2&oLNFg-~5Lne|lhmDJ+T*Y>1s!YZ zDd56bCgpo_^Gr8eP$zbTNh%uO_vgmZT++KA2o+Io&;t6UDI}R{ocMzYc9F(M;;L@{ zSZ>i-sJI5$(5F(J1|sbgqwoiX{;R4xCqm5&HmazJb7x@Qzt7>ncLtV7@!?#3A;a6D zxpM97mB@>NohwZyWh;Z*p$}e>tEddfgkLd)l8bcjY1#4vaJsZNIZP98qIHaFkbsSulmfU!UTE>24 zak`|}zkelg!VzHRdT1L59nxtF=9f>Qv^Cv5hWx%L3SZY=N9G*++7wM2Z7YqNIeCGI z$h9Wxm!1A!eh%dtm$79=uNr#}?&WR25Be%3$PQCqQ(je)PBNpmWTeC0&mTL#;!)WY zRvq|`ByHXS$a@IkE=V(TElaT$6vJ5xX5@sNZ&UlkCZMo)gut!U%p)JiCao4s`vD>AEJ#vld=8n(+MkP4@Cmo)8za`dSejnN@bye|2Zclb*cbc+&Or>F z$?)+D>fWCYzWa#!3t|bNSPO!%4XlL5G7(rWRl8nzW$=0*1aK1F`ra+DYf%1ppAr4+)*Zep@JO+STJr-Uf5b68a+Uj2-XM0#%l zo)!TfdUK^A10`@Q)pTbc$g-PQOP+j7Nc4YzSqrq8-Z*fH_Wgr##bkt7TLNYQ4nkSo zL0>jV=k^ER-aW7|X8?w|o`!w$jwdYicBUYzJ#SG-;Ci8PvI@RykC7DE36Fq6Wd|u& zYVJhgT|b>ZBu+w1hNa{p%W1bs0t28Cf^2u=Gw)+{BRLc`x8r4x=TY3}dGK^PDd>?~ zG`ZN@j=VdUg)joQhTmy1M&%e$S`qFc^vjaQTcQMT^3m~I(c!3?RVdMXHFeMbRV6zD z{@s>mnZM}$)|UK1%`1!bIW|rbPHEi^c4=q0d}sg{1DGOjRRW*L3!-&GcF$6^eR%Pe zxl$d7#n%#Bzd$FEo4mb2_5f}|`Fh@2Z~=V26{qP~F0A~T4NoMWoKMzyc@pu`Z9bpM zL<1Sdd47BW1m9(yhQOBju~OPEbp(!BspjFF_bKMS_S!-C8*6~6bkgXrC|~5gj1Tun zE>>~-I4_$A6;C(89-$*JE&Vs1#{s8+lr2Mo;7S%dq9l@h2W%5hs<0N$r!Y)MKyf=_ z9hop~2Owon48`yBv`p1)zo$E~xon;WXv+?tg)wZKg=xhT5-B2Op|wr=R5$kZlbYAh z?PGu1)B%;ZIVs7GTH6b1Qyiefh1VUS!QW(X8P7`kziMCefp@PLt|pK>_Isb-Cs>ok zI#g#%*Qhkd8b0uGaNA;GsI@8kk5q-8z*QS=0+n@dQ&?|3(sMDp16Kbe)%%*rTf+1B zvkDYm(g_&RM+CqA%WdA1yd#bo{KnOTTP>+g@HC9^0*?vlud2pGzb){XRZQ}GWT(9e zdK4!o^|>Bs6>Fu-C{fJ zZTw?L^ej(=)3UYF2*!ssBegu?JlMF|eYJzI`o~(7(1$i1`iCBR8P#lZp*pJnW$U(CP3{nR)lhQ% zWMVv!J_o9IUtA8yaqJ@gY%>Q>db-s^_D3&Fg{rK7KvFpIW4pjQcK<#dDs^+}VIQFQ z`mR!*HS<1pb`j;a(D#LEB8B+Yr0?cKyW6Tn6}sXjy;k|FhhiyC*R4`#;Iu2~cJ!$~Au zGt|=pfqjlU%-v`j+VDl2M(mllQ6U`29r&J-W81(3NO!4b0C~!2_lN*b{Hz6}0;xamLuj+kI$H$7 zz1^iCTK}(ff6Vi?4PKc=%64YOC%<)SW`&m96Z-3ia;eS!XNCqtEjT-p_!1?2JzEZ{ z=YZo4qQR($Of(e&&jgl@<7g*f*~Al|D$mP!S3e-8rlMc?1$jZ}dC{)-bi#ggG79~j zrOqchpf|{nF5?#-agRNVlz^{`G^64Z6BKx47B$M}6jtSeb(S^Uk z1Wz!eKiabbhPm*zwpXx|%_{gU7*6CWsNRWV)%-Yig*yA)8};i!Hi{p7M(1tQ+D(*3 znCEuBoP7bB5i=Mjx`NSGh4}LQN>rm6G)QwTNlBVFd3HYTLxzjueRjgq!3zeM4E)17 zBaOoq(}X?9H){WaP6GP)Y5OyC*EgQz%S+UP&#u(lx%p}2SM3$3XjE%f~+E!2A6f=#<0+gz~{+><$TWWyc;gsJs-#dlZ%oS~6-UKuIIB1_j&W|bFj}vZUz&(}LpgYT_&%zcZh0&I_ zgmL?x#u}Y6rEy|zgl!J?H1bCVj1_4;C6@-F%XyH>;&-E<`o~uQWBj1@9cDrvI6`i% z>?Cm5CNOz;MwIyg0AYlY7osLnAECL?-le*zeh**OcuY;psd)=B+m($osQ*Dapt>-6+qpg|{Tv#Jvblk8>xH>A%ME z?mh{6yN|{+rnp%ll(mv4FC1k4wu$#XeDfM3u>RJwVhI_n1xVoR76;kRx(oJN{6zQJv&ZV_F;^Hxh3^K)t_5k{54rv>u zk3GewaM+4Rp$lIkZH!?kw!d_8Hh??JZ#uf@b<@WKezz^7ReE zNo)(^y73ug7T+1zvi}+McwA{K#TLHlInC0EJ(nl`g_&?#y5JuE!wTz`|JYef#+S5J zi*wNcGxz3JgaQ9sIaUvU=7Ye!Gq9=73&+n~W|f(S&8kr9iwGS7&gIN+ko8T!q>N`8eTtf;9X#RdPef{L`~mMU z`cl*w-axyUylAS6eu66^&{wpTvJv6X>G>#ue(6@kmX0yca;CZcqKZmta0+R7wNbi* zs!%lHOs?00954+xo?QHCcQ7Xah)3(v$G$ebq3?0+dEd{L(oi!4jZ?#nK=oh_s$n02 za&eKS5VH?{uT4(g)mgp1-cG(n*>HpBg!WJ4*TcX>8gEkV3t^8iq6Q5h0vs=LX9Ct&UIhKwom9R66RLP04B5NBE{p_p zQU+{_yA^C}BM3me3`RwGV-DZ+?II}HQAP`zT|A=Gs2O!rdKeI==pAW%DYt^UX$zJCvhXWhNEr`W)`;+`T^}BXESxCbN zt>KS9A>I{e_uZo0?hDeVzF|h?{ECOq!n091gkqFi)p!dcR?qS5AMi@pdRW1!tk|8c zv!P$32lUBb2ZJ(V3D0gqyzK_9)4_c#WdPCa1CqZT$lOy9AJboPcoifTsJxvdoAEL{ zxas6}@$W@d9^|l~0d=>306hDqYS&EA=J|1m2F@n|b5i&CWK^ z{#A1v5~k6O_s$JTCI&iFgM;b1-bGf-B>AA)LU5%AGR6&>30%FGkIm$4uOkiL>Z^S% zc-X(DWcMXAT`WEDxh#IGSd|YwF87#r)3F6Xgs)L^9Xhdy##u2D(qV;UnW~MgeOPfk zqiCK2&m(d`ug+R!lmSuoF=4z843bLoR_Rwgcp^ z_=N`;_C%eyVeRH}WQ|Mj5m#tii|VJl<20T348S?Hc=83h>1@vU{eB}NA2#%{h{`(@ zK|WZXOaazP$B-*`RIA4`W+OeRscjVDBRTxmgY4kDOV$UWIPPUB+s<-}%0s8wVf0R_ z@hg5G6T}FRp$*yFcs#0OlS#kxM@ZGfIMJ21mCC}PwU{ooF?WaWBgDCCKC0D&_$Zn( z^qyX1W=bbH*qgnBe?9wpNpdsY-ejwm1L}7l&<7|Nh2bND6L=a7;yf3nuOrcd%c?Ri z#FO)$Zo_a4HAeW-9+nh|)$dk8N#zfKzlqQ@PP*7d0b51TL$GxmbluRo3D$6a*}0~x z=QE0-AwT?O5+N!G$O^s%xDb2_6lMV|qZPH5@a|ckf;H8#;`Ls(OXm|HKCB?h6V_GZ z^=Q2RNZ{{w^Cq}P1i`$2v3lHb_pN98&Mne-DF^lORzOtn-H&28q${roY(7{XeUHn$ zGJNEk%k}k_wn$dKVL)Qg6AzLqeyq3>qu;givl`A)@(0SVT|ga=zogG3!?m1~gDbb4 zwv#~X_qMlP3H*e%0>Smp?*WKhYfwvJkmH=v6fIon1h}*e%0&9Xgmf0FqLpV+S3Jz9 zZmHAIt%I6IFX1_y0S0ETKu#t2(rrv0vll^>Q)qxyDL(`pDh$p|wORlqVS6iG5>`k}7nXnN zv|Gx7k8`oG>)NKqQ=;cw?ejJ|I+mzmY>%l9mq3G_+-t%iY1D>}%-|@`Q_%k64>E0; zP2}Fd%b$BT%sB!jceXcf8SOA{8FZDQ6S#6+BcV65`iO{*JF8$<^ow;)z?w@ zzSWu%MCgQLQ?obEa=80Iu2`MtpZKRiNgt9Y+(wyp;VR8_)c1>5ZAbd{>_I5sI5hMQ zy&<_NmT)LMafWK^HhDSt*Kx?@?Kjm|t-F02CJJm0`|>G<)yw3fjqA&Vd1Eii(|7sg zLxCu~PvZ+rO?|Lt{;=L+4?kAPl)n}F_!Qt(dfFv%7gJOYEjR{mguQX6$?k?r0)$f% zUT>WMO+NdD%vxxh@~c;B)jgz|X5KUDIm*1Ndyu#oF+l^LKL)>EYz5}Se}+~)n^TUn8mAaz{c9+Qj>_tJ`OO?I2n_X7I=)Wm-(Wx&sF?Uw+C9*V#XbRbo8 z{tBcyIQ=Q&E7x|Nf{##8$YgQq2)LlE1Pwe`fgQ*>k+sz>5HhSr34C2v(kq7!Lut!C zCIhrYc@!-p9h{BJj9ChGDz>@U)o4^uCav%H-NvT=GN@qG=NRJ7)2@>v6EH&6ff{J; zgCeph$gQD}eXVGJtchF+f7sB8j);ayj|r8;r(y$UNKHjrYFAhWT$7mk7&18l=2#Jy zbgkw9-tdjw2YRS23ly(E-<<0ih+7KFsVI9|m$@IiBDoIvXedFekf|8a-^;EBTL~ZN zProP7ei)Tx3c5!({M2$0CGu6`a@$j?uyo_rfM>`X&-1@e1JORw6x(FgZ6@HhKFxYC zo{03fl%P%|xF^tZ0`BF~WhCu7dVlRFzNLdd^><=U1 z(!1($HkD}n`$Q|VUr%POzE6?t# z{}#(S@DC~a0H9umK*0KIM}8ews~m6~x-xFRUv7Ml?xXM?fcX z0RrSEA{u2K!^&4)?iQ7w$S3CHS>^>(a>h%1vBE5{u@S-G*rPDtS#1MnVl5@-rFc!a z5eglgkCGbItv4Qrmghamz4ip0E<~&-Ggag8&QSK}!s{*BV6Y91**F_X2MBo%+tV#Z zQ;myPmhvnCtNc2N23YR3SPZh?!CFveZgoF(+x4rspYNyz zR(y}b4FpL*f9*kPOA%WM4QkBw6Ko(}YH6WS7ZL2=|9;zEz#}Q>erPEDKYTC?$-8)q zW})*F1A0{WVj3VimW+jyL|YMMPPyF6^w|yahvhk#+`B^&UlBn&S;Z(3rGEmYwgBZC2M~88|mF^u%VEsdRf-~D2xj@!az?vUjzP9bs^$>U69-#a* zN+Y~&2;p>C3*Qvw^Ipa9%ojNdu;&qmwTLIdxW;4)iQpuf zZ`^;5^i`aOmcNfhn&0^Rg*KZdQh8S!ZkiFk~aeM+YlM2--+WI8_jWO%Z}s8>#dM5|=CLe|TESBuNd0LNB& zdJO0ZWqF#i2dg@z;}EP{Be+*i`-UG?&#=+~7<@?o=S|i@f!X|8GJP+b(u~->KU+3l zCpTa6`iyN@vI(Xxjh^TjeC+MMniex0mVc-}_P(LXGwU2|=DW%YeC8cWDyPqss^*qA zUeQ>~Pqf`-hrzBfATG^0D|vcX*=qy9W+f@q9OVu2oN*zwTPI40yU4iYmleQC%LNGu zu(LDB#idErUZv^TPe2NZ-PuLSo4q07`^Y;R!|Cto&ln`~LxOb_eGRF(Il~5EA zGeUE0dX|JX5+8w)!!J-u#3DKbB)3qP=;Ne;7M<`7@f<_;OW_oVoFX`tCbqW z@GGK+n*O8EAKhC8bi>&oEH3D-rfo~ZVDptcfS>mQUD|4jRP>Ci{7#MyKZzVDd+%Q; zwrj6L`F8!V<=fk4KF!&2*c`tWG*B6`kz8e-2CSi1lQp4Tc-z`2=r(P`@g9YpE<9Nj z8A$dAcfI=i`)5#U!v2okY@;tvlhq|-KI+Oe1&5^+28OXAZj^-KA zf@;qGUc`+7IAhF9V76-a2z-_CtH-rWXSj_`V+K~azo+I7iPrn73%KHJ5*{0@rSG!A z0MkMwVh2_Xvc>U;C>tfMbKW`+hPH=6FJAFaiL(Ehpix;^qVUk6a?fXFf)wa1KgfMk z>$oNyOvd6w98<)5b3%m*!hBBw;m?H#DbGz<2uT8Ukt8S#ttJxQnw$VHl~bTTy1@do zs(!oi!im*!K~6G#!|b>AZOGlKPdz%ls;WUkmBfcs+ok1zA$aQ5BhqQnZ4UI5*hy5* z?aY_@gYVGA;6p7iF4e9VS$sF>5O;n3_OY8QOT`m)|* zA!tI_mHz0vMy1j=yfBG^WhG{3RF>=K2@GnGLV#Nb6(1Qt67Ny_7EK%KAG``$2-Dex zb^@HK^;4HXE_f?UqUB*WL`do?5-T=*4^VuIx}H;FJ+;u~eE=GQBTwcdgsxX z1aYI^7d+M^95m$O;E$;(y0L+T?^}?n--drl7sO%-Yv4 zr%-8qG{C=a1JY&GRQ}!uNc@Lwz<^X5JTJtZhf}ZD)y( zDSdYDNT~NOp4E}=p$$~{E?lT+^!cuA?SB33q^y&)q_T-_XvJ-wZ+Ccf?@QBp2{o8z zMH{pR^7pLM3zo?80LY%%W8Cx5luBGU1VL`CaI! zqT#y*)1~s~@^gZn=3=%E73!tMbyX8Sqo0;T{Tj5~lRnxw(kT6?#{mD}wvHg56yW7K{BzQ5C1*42sNYG)w;0cGEum5Ig-tn#BpS6 zeNWiCxrRH$hn--;tMXEI?{#=GdE0P8A&?UmExvJewMaY;^u1Y_@JM^T!UKKoK&4Bf z+=a?Ow5V>)6c~CdwB$on#4q%msawiE(@d%{i~}Z{l4EoHs6V3t0h(u#ZHH&J>OXGE zFEcghv^no^z_@l*Z^eGoVE8j-B2V@; zJeV!o(-U1@^VkY(NCBahNhJv~L4c*YhJ zyEuw|93t#5IGsjLiOw(Rj3TkHST9)%4Spq2-GvLn>K!_uN3c8ak;^;no?WC5;UDvb z`AZ9$+5AwSgO1l)*`4R&)USrVp(Q>;o`B~C&Y=vRS%%r;|3?JXUA5`=e^;{Pf2ibt z?6v-XO4;YXm$IpV&ghjMcG+GD(n$1&M%PY3L!0kASH+%OeteX)T^5ij{Bg>h({cOA zmh)|T@0ZtS;-#%VNW2fP>-~|NdWolux49~N$WKpBl*qB8(+&SZT3ZSn^3B^Id_HVM z)b8DonNy8@k~ZF?do18{NDu&`sxf*=f#&tejXN2?Z`A5eO~voXCg)n=o=hkA70&WN`h3pi$F+g>%Rk)@cv)Q#(RDG`iZWj+ z&c|Xup78so@$w>C;gSaR0osC9eM$cewq105MCQ3F!$S30zdDB*jxC0j8)V4kyxT=k zhf_q0VY-aA@!j)P97=77!6!A|K&zg`7Av%Au*RNZJ(~hJK_v!pkz@Ta1wP}}_(}7& z+(z7zwZ15G)VFojn#62Y!V_|7OSRyWiDuaXDZMWja}(Zm_O8g7A!Fw>e-^ ze>yvGG+xqUpmh32p`p>L7(;fQvw|A$-c>daqgxvv|EM3gp_m%R9GZWcHkVCsGr`dy%N~ zM;6(mnTi?hi-3k75zY41{2GfKIr^16>c!$Lps)R%VdHHdt_*3Gm8+97PJTeB@*Vzx75?|zvP#v>e--n!|4_^?fp-3Wex4qGNB8aiBSr0m$3NfyR~(RSn!}I( zBMvC$pRvLYr)Bl7ym;~AjP4cI^*5a@DXACw>`xfzO6Wxim0ylC`Vr1pckz+>fLF?y z{}J~4Y@&7L?;qq}VaT5TehNTfz{}Sz4nP+V2N(PQmtxfP&*MJ)zdg3ozrv7Z8TBep zp8g+4;>`BO{C%XqauEOfk^YNmD01&%aa_(mD zmG;4^Z)sO-L^K~6(GIoZ1U=`w6^qW#aa(-Y2@mqx?5v}j{3cgrrt99l_ma*?0M z@YI#Oir(W96u?&BW*TR!)jyKgesssbXz&7crSr z9#kO>7UhOelrw}o-1@bA|8W~6LnnOLUlX+8jR}(!r^Pw|1VCQ5ao7`NhJP>oFQp?Q ze_tWde_bIL4?jmAum6NH68uNyw4MLQ`{(T7=f;18x|5Zs&c~!WdfDlHb$VV|c&RA0 z?4`;1zMHYq*-;-KM5&iKrVm_sGNH!jU^x1W%_{=K)W7RqdPk5ArTLD2X zDWSsyKixzGu9J{q+TUfe2-NyeY6@TE3sY#QQH~x!CL}GvR7W4@S)y(2; zx+aKbIn|2rJg@Q>mBN`T!dn5a!=^*xv@SAI# z+v3tS7dHTtlYDTEH$I;Yi>S>uEf%(m0QUN?G2>L%0Tvgqer35QAzrx$?D^{Y`e0~q zHrWx?PyadIY~uwci-AKJ@Wk%lD3-Z9tqAg5+Fpj$8^W;%u7dXK&*dp*(aJBiGq#8p z_#_X=yFO6_mQD|RLQIk`9A`ff1`WDiC1@J>>{Gk!Fl%h^^%nxm+3!cUWbp5sC>m39 zwvw&EgOA4(FxX>A1aw#MVYrL@HZbqt=I4E95kh>98Fi%{Q!+ub^kpN$$qy(<*Ydo$O@j1z&><;D5$=i^$9Nf*8E zgP)q6-xWtI>ryvNS?edl<6ASS@81A_>4RD=41I*&1o}(jLtdYwv|1!~`&u;%Y`V|r zVxqrrtrl5bTJDDp2SaaPm;j?iF>a*>_LyitIZSktOsj=8qoQz>P8N|z{(Fe=*GoRjCGjDw)(ck%*O+Saq#&tWB1(HidL+yT5{yf>DG@th@JnX=hkk}xWYX*D(y{L!2oAe;7>2aJl1t?lq;|_#P?8Yfg{9b7oi~8$WDC zR8cO(Rv%5X2j4iX6QTWjHPm!K;a;Q-bcvVK7ORy;ifoh#&W5dst4#{;eR)`08WPT7 zo+8}ibcx+&*~S*v#4arvq%LGz#C*OE?g%O4SLXwbdNbl1I2r0Y`#3R$i;Jyw(9Jss z1-=}y6EDoVs>bfUi&ki zNNxeF-nX(rjJV=wrH1ltyua&AY5AIT!z`}jw$U8q+3?^^QLq;)WjE*y!KLuV_Rf|t z%0O|)#IiAAU;2e%(*+ncRT%pe#zW8K`M{@@e3Jnvd80Q*`?tZ1dG%B#7`4A|p$>9g zXccGB+vy7tNe4I~6m+RHFBZa0-(oOLC{D_%VA7>Lw%ma3_@PJtkYI7`mCpO&n}AXk z{GG3{NrbeYghd>#AZB$~y_-xb)TV$}1|&){g$nXA7ueE}yR0kWTYB4aGBe;axRu6t z`|xj*y14)k;lpp4Ho5uuaf~j71pSzfe9GQh&o;;i{PW|j+{axeU=l2vQqwc5wi#M` zAJ*=KsX1rd#G6L!zC1>&y1DK4c(;nGiLvUED9UZ4!lMqUjfV8xijnvGeF1t}>sV?E z4X~F$z308#dsw>V({UC!MEDezIHxlOwz%xkqFt?(bFMz-12hqzPK0lsf$0orUpTyR zIf4!)ssQ(cAJBeK_RB?R@sM`VjQCT`>O;i3O+^-dRgxU7&sS-3Dwd7ErI+*oh=(YaUx17o`G^RR}ez#b8b6ts)mT zG>v+72S+#Kwm6N(Y=ixocZNO9gz8IQSh!~BD|T%)HqrE1f6%gcOEMb@TXa@aga#UQ zS`#3#)^FsPlIQL3hog^wAXeoyG1wlz`Crtjn3b)Ei{K58iPle4=0i7Ic6`w*xeA&U z@<`$6f`1O7cP$=}h^f&`D&f`FiK6{XY8J^Hs|x2l-a|0&122u{h23K3?~1qmi%GO# z5-54x-)aG$HVQx9&}97sj#gd6op&HNG+gwy2>STp1nK9cAu`xQZp*~R-vL(1+@eL< zd^Yjfsx5d&2YggIC#$r(*qa<0JN{+C?LRpzAbFJB7|9>Lk8+ zX~H;!E}=7tlurQFaT@a`WXU>XigO*k*2KQAHHc*t-Nyr4uXhdd6?+t+F}p1%~*CDa5X0dj&<(ao8S)k z+8mw)v(8)i#t{;V?jwSt4lnBxp%fla@xj%DA3_3w+_-WCO|kI3M}5!uEq` zNR`fF;CZBAR2dz|MbCYsF&wVx;m4LGCum&?0c@i-H4R1F0}}s0^gB2$jZ{%Vmu~ELPd0}KbeHgrB3)T-@)wfpzfjGZq2g(O-vqa%sn+;k+-$-`Hp9Qd>lLL;DJ@wFleTqK#$E_1!y z)}NJ$9*lSj$=s2GMWO4fB;kYk(R%ncOe6|znVhPB?dAF9cMVuiIewXL9KCItm z{oNXKLOW{?cO+o)FC-EF>%Wjh?Ig&Hw_4wgim%ev@m?jyAsu_d>Qz}x8qY?l0k~5Z z4ZqJ49$Rmog&inn`hT4(#?q;8J^ks(Z%PMQ0)oSPy*dWE`=G9i!4~Z2S1E4pF5s2g zDgd8jyvDt0HON6@VTvd5$^?C~3A;zVuGwd!6-xl+c4}<4KOHCp$Cy#WSzW*)Yd?lF zV4Xc_4I4ZM+HEs*B+-K1eHyc6H6W9%T$5nWG^K<FVw4awN;nU(1v~kFVz{&3kx?{~>#8RyJSYRmvEo5PiZtAZi#Vy@VKfEWO zv8r?{VUQlnT;c*7KMQ1)zD~02!m|06O{58N7e@)c@8c z{XG}>yOnMJXM_E@r`M>>!{Z#BzY6p*U%9%O5eVUQZ1<}{2`DSfF6 zI%hl0NfXDshUJ2Bm05$CKPydtj~y1&nrPh70Z)%z^x=*|=937Qqw?T;W`TkP@8rb= zIRLf6F(*bcyn|L$+=t{0dh_7X%gahxodT{walz843p^E3-OswtnODU4zeX|V*>PD< zcd_Lysh``nVSn6OTo8Y?!li*{`S*@7!?pYT z-(SsNqmqC0^nZ7Z{{b!Z&z3QU`=2f2Gy#wfoL2Lyd=gc8@5T*I$;xj}WUpmB{P0Tm zT;Vm6Y-JP=soTosse@qet|Glr+(YxB<(+;=7+|p!ro3R=;ot@M{6;1&Y{-8Xt+8?U zkBvqVI69*j58s?S(#J>wO>r)lu}}T;!w`b*;&Uzef7+c%w2GkXOVqBLa>@(x%^e%Qv_d@7v^` zpYpoU9Mxg%)dzU(JAaW?pm|5ia@VirutA$yN}7RBsK4H^bcwI;37~Ep-pJ1Vfzjv@ zOyH!b(nei3yH&&*_;nS^_4Y+jD_^W4daz8vdTc*-*1oyByDMU@<1n}R`i1k2TWK1y z$|C*F8P1R=PH!lvcXx5w0V6sWF^UhranP!Xv9^5t_u>;%h5FKkzJ=AJ^iw#>JQhhPoz4oE)ur$@v0*o|f>h9~v+WvD^ z=Up#^k8Z7v+N!>{_brCDH#d|kVjYcdkkqmgJAbOwDB+%3eK_7g7`@F%n(7!|dy;V1 zFzxb;>5DlXoF@(LGomhJ2de#c&YI%>byEG$NW&C4ej0B6#rBy}aCkl6&d(gQkJ?wKI^ddA#jq_ z;>7c~<_ke^f#9cQ57nN3iJZ}Z9bV2YuzKDIw{87mj=<3(5v{A-;9N~#l(7iIGrbLZfjzxLH+7`NFkaBM zo|s@KjosD}GYsl0XLx@`rm}tc;lBQpugN6!a}WQF9YHX)`O1(F;UC7Yc@-`OyNa~U z!*#GV(xR`=5q;OYhb|U=eKZwy-2MLLkEA+a_{x3mc{15x_9*zml+{e#dGqnxBj_R! z#6$_St%VJlW><*CZ+jOZ3&XzJS}so#eq;mvXZ~ zem9MyOJHbfiAI<9`8H4+@NkD>3m04%umQ;_r&oP|_jXXl! zthXJ$sStHaV>J2QIom;FqrIr1=1tM_Dfnx-u+VZgJFV>*a8%|}fDMBzyh&u<>lkT% zT(8lz8yH`9N9@Jt zIh7rHmOtGYE94L4lNU305D~LFooP>AHcI@s4-vlkP;TN#r6eL>;n>WW>1xFer-8TO zmD4&QTvK5}&@&WacaSOPU1<|hM=)(HSw?%xxf%ErRa>P=?+8b}pjwbzC6xn|&RK>s zz3fX~$66)d9`@deIX(>am2Nh=Gt@nukqi9vILm_u>_E=axZEbr_e2X~c%F!$ zY#k+;HLO)7&MYR(Nm{XFmhI;q9)&R^DijTV`^ksuD06;PBOOts5oB8NJ}yGYxL@v5 zfar{oeBdKFVa>NmO#(HaBS?b8p5gv^+_rIGqoUSnCD-J(hUY$*d;Yq;F*%=8mL8}0 z?tx@R4vvZX2iRz?%Zu}*3n2oyd!^6XX!grGFN3Y z3kzd(PzfKbtdPfv?Ke169%z7=FCO;n4|j?zq(4Dq+N37_G-d0%IxC5#TQ&VecCxu5{xT*x;;-kT#U6raVf=0E(}bwoADH-hARQrom> zj5AMb`mT+LtXHl-ZJgIyz3FTtDdisFuM=8?7InRiK=^Iav)(pgke#gY;Wre)yQd(x zID@)^XZSSJFfLgZT}yd9^I?h=E5qFSCDKj9fXDY^$4i9uGNiIdoEBA;>6)9U2E1|D zmD&?Fm8E&QmR!|$^;JjOTqAC~C|^e0h{AR&-rV@D^ybQUPNi)Z_N8HuZfNN3Honxy zvMYgxbsLX!VhwR%R9)s3HDWRwixEzAG3>>z#m!9c)NIEIxyOyG#{G8H+oGLrf?P5gw*32%`-LeJyb{%U)eY1|^CocK{wZuQ)dvC<$=~nkYV=p|51QQfZ{(NZ zj&fj1UUO5t^+B#gVpGHy9Pp^~>;0UQ^^=m_+JLJXBu81cosv`fFCotD7H+qdW`Zpe zq%N$hpBwW>Dx#8o`$F7F(j`1$J$d)UmzwtcTn}$C?6Pvs9a?TnVcz>RReL$SQFQ-+ zMO<2^T6V8IXjkP+kq=P2Y5O4#a)ar*d*TE6RmcFosgXyPMp%8UqLa`(>n9)I9 zhV$m^#!KB|%|<||y49d~U!|6G`{%~5gk($J)9^yfrvcRD9_UHPeh1q+Or$pQFvOX$ z<-y7P#^P(|Vd(Hr;{|+oardZfg2fSAM(C(YG`IYttQB?tjFXWbgRt*+;?f6B+tS{p zuiUQ5iC6p{tacFi=p9M&0v|*J-XEicnyQtB##YHZq96nppk2+EUXMKU&|1#|Qsw6W^6I?GeFl`X{5Rf{C{(v8#Xd-1paL@@Xbl*UxqrYeVr zGD;^3v#N2o%=2c=sqOkFpIq*T2f7v`P`63s6w3o$iIt{20bxs48_5Q4=F^iehP@ZE zD58Qw@61bv@utaiK-(ahsV`OZy5FDDZvHDeYb;KoHta!_2>Zy(r-wXVO@GU8o8RD$ zgRg-jP9pG|GmF++UKLlu$EC8>5}w%dS`L}A9y&2wNMCh*Gxy4N`x}E`9}h_JBH(8J zBDs5-d&Xyi&E9yBa_hw7xE_Xkzx2Fx6wCGeu{2}ho$3qt(SeCTh5MyFsV_^`Lq#SR zn_2l3+cj6TGh>J=hu78DpT79gFiM**vodMu%l=iB&DLm%b=>%6ZSqjkQSo_`0MlOh z*s8YesXoAll{x1p5o<3)!@%o;vO0e5P6jXOnzn)u8y1`8+4^4l%+8|gozdFW?awEi zvvSYM{));^1By4yyXCje^z4Tpp6}2zmX6h^7O6LWw5#cK z_VRQ0;Xo9dd;e4>!df2Z+@PH?5a%Z$ruN)6RIhB zB@Jx$SwiWnoqs`W6t@qT(Zd7ei3gW2sD{_HhA!qrs#BG|P$@#Z`X*dvaN{La6_Bdn zcZ%xZ0|D30g0jbLPI5m-28~cgO#$i>Vr3kvol|e8F29>kc2|}->`5?rw9}OmCi`B; z^4hiEb3Ysz8>-@vS5zS2=s7(BC&U?aPL^jWS`jIjlR6oGc+ZExrX9*%H7hi`E3<= zKw>xI14AQpZrTkeoMM%5RiQ8~6XokS!={l^zxKr!)Nh(hoZJI9db;oLMWL4(FK$k_ z$mhp@8rg;^V0GKpxrIt{PByf38OWnobXATO>y4~X_^(~z83uXyin@d!As3SV$A!=ZLaxMY1?EtYkyfYvA&XX@uM@vJCh47!y-( zXW_iJcN55)Vrsrr-G+QDVsId}$otzPN!&#tJLZN_v=20t2xa>&^-EXa;1xte@3y+; zIgf3+4RZv?oro*(SSf?kL-VwKSEYw|MlRUqgpQ4^en@w2M}%!yy@c%UutIenf{z+a zcM1i}c=IkK!eG-PfgjE|%K|>)PC+t_ON0tW#JXgfAmLloyxnEaM1f0V0*5~z@=F5E zHZ4}A)0k_HTIjMtn0%?kK8cyRMRiLkU}|Q3YmX7~;f>!MC&!BUYj9e&xR^JeY>=aF z1mcgRt4uB$({*`pFa^NXKaY-o?4J+(s_7*9>TRnw2sH8IGGJMdH}u)MXbdXJUn2|k zR2X{!h6|5@gPiQH?*k_b%t@(x1(Q_-AtCDQ@UaKB=3!I|GN{=>E(2UGn__IT-fW|i z+s6*nyi`9`ITRbA6A-+t_s`vBjoU&YBw;`k&StMX=Eg!!m^!GMo;zx z+;|IowT|70%a4${FX1Lau$8tWuz1LKKFRZ%`)MG9vjZZtZj^7$0riV94IPLo-#BLX zp&$;C<(b3{ok9<)!AqS%4sIr=1^eqd!@NIi_s~mwq*Yy8X5ByD0ui2PMP{hag%v_X zMT#o@^KB-+gNDRGwvHQab+Isy6?hty8dPa?C2PaOv6Q9vR{RytU>-B)>HKb6@UFb0 zL(=AdeqGt?FPIi2l;@Upa++6gL$@@3&H7rx5niqZ)BlVE!?_lD3()4mJ=fTp(0Q2H zYua&{6r{m4Q=@zA$D>~Pbs%ni6t`(J6K#?jpdyR!RQB*}!uRWGEmK5~3bME;ue-50 z=E}^7X)!v2Xo?nmL}x(GiSRgNMO#5(OdVmd-PjRE)~Oz?E5n%aU)|q(D+J>_r(WA8 zDJfD-ExUP2LPwleA}U=3fg zK<4H3cg1(%9SK9W+Uxq3X!JGifN9HD*U?XmgT44exbQ@jUrr9x2jX57L*w|pnk(YK z)lcHih@iwOzC_*@`|V?xV-SFIHcM<_Y`J-uy8fRD!t7pRk~9oiaxIJ+&HS2LL;#^+?WpwGjYSif>LhTcykX8B!#2{CGHp<%CV z&DT9d&5y_QrV>10eDL3i)emKR4lZs>)&T*v442N(Fy6z+Hz74(kkpbNs^}`E8+#u$ zWodrK%u_MyBM>hb%+KJBOQ_(zihT#Q=6|BdvCI~;S7G}p|CKOBSqO>I?7TSWX4+HW zzh^LPXIzy0pHrUAw5Y&`Yfj*=zTUwn2hcn&L(1aRlXSR=Hz8K~jaWdajqMZnNs9iW zGCpsIbZ=3(s_dOg^Idv6GpjGlnCj8u3`gsp53Tm6mpw-VFeU?O+d46Pr~t(S<@2i) zqB$z|R3@ekjr@?$i1Vx%^0Gn-TGYXa8Jyp2A@5$lyX$ zPL5^|p^j;~G7%patzhn;!H-cxfW#CGn$S$jh5}!dir1w|`xKUlWc^Y{)$4&YE2Gq8+z(Jte}$VLZA-LScEHK)5G+ zj@HSL1(A9aVq^vuiv6ZKzw6iH9$}iXgTBDo(zTakB=Ra#uORb!~Y?y6r%v-*|S5)Y%^|WG2)R$zG6E?O$V#8uljHN_hZ7RB5EFtz|)gjw2=^ zyvhm5B~9)>dJK-~|2X@&>v9|MY$gF4V)NQ+Pg|Y&g2pF+OR@C&jOk2T=qBd$dwr*d z;%KKp_|K#!P80J4O)TiJc#l#r?wc$OrwtQ(*-dS7^JPIip(vn(1eFpAQJs5j(_&?A zB$8?)t1w-w#pk_mu|9=|N?dv9A-?NF5#djI6F$d0yEN~cm3;qqR|&Du2GW1nF5UlR zyZ;C5{eMTj|DAis{!i}R4l^JKBsL%3>9FgXW{bK2BUE*biUUgnZ7M1hH5C^9hW1^D zq`bYbin{}_cDcOXK~lI^&To+@L|3L`=y@pO7CSKv*d$`k|9)1pZ|1&v!QFEHDs|k= zbbp}x$)!o)Vgz4g1Z`x5e5?bCoC_w?3_;TjX44FXUkjpJ3&C3p=35H|3`rbf z_}@u3GQFP0e@^?qApd_z_Wy@1)&C;ek^dpuEAIlTc5ecA)?^dPWk=D!m=kF8?c=M1 zl7thA6%%xo3W$GCAS$}I3J9_Gqr9T50bkA|j zcI>V}`Qx-a_l7+f1Ign>c6G&P=PsFro}%cim=cGcVsHO^_fY3t@A6#N_~ZN8(elcB z-TKORyVkL8mn%a}EdxtqO)y#%3<&yBh^$sWWHU7b#$tYJCu`HZ3;PlEa!bBug!-_! zj{i^(8OdNaW6z24i<4BA?IlMucDAe5Y>)>DtY5ANW!j!ofZ9ls%oPge4q)@`cKqAjdO47KYfi6Upj?8tLmsHd%(c4tgg+VL_AD zZ%e|wNLhSd^ajw$qM!6HHS@H{qsL~!FyQ2x;DQd&u!B3l7&!q4T}DiW8rrnV1?R(| z$rdW@(Kl0>E7!?KQ{Ds=`I%t=+@K{rf>60icfu)k$)j5fs08Z^>w=Uf&OX91LDymH z9|>RN&kozT@lBXXX-Z+D2kCi7KK?iXdng~t_QN3v6=gx|Pcl(6c8>pi|K<`+TcDM7J438= z$SOPnOY4!f)=a@140j-eSH-k3K=FD%jH3CPk;{JnC-Sc ztN51t#Y@+6)6ZO~R^7$Pw|T|KC~`F#CgI$-Qpl3$d_4jh`+1ESyE zo89!}0?1{SKT|5%H}=j{vBX2imx4&><)u`;m7`l|aCZPf2i9 zqcTalZZ{2dk~47rw8TxdNF}GMfek)TYpq^^19`3ka_ms?;ALJEN z_3Q2|5nJrUzl{8~?kJm5xp;6)5=8grNoV4D&!RISa}F!k5jcvN zmcm?gm=OytQiGLj(*@b-qDz{1^)7^0r2Hex)lb9W>+jtUExXA6LDv~1Y}YX{)YZEb z)_qnW3Crf4nKeaVPWMoOraeKC*TbfGVV*C1yuV3QMEUIF3H0Sj?5r%705VfI1h7B6 z+Fa!pPJkmvkXQ7$C#dVn~wFsARY0v)~v+%JC65kxd?Ru)LWbs&3Qnfs8r3U#O7d?Z6K8ENxAB5-yy4 z*{JcNB_*OY)bI}h$D_Ldk!SilZ?9By1w?h-dELJNrlB^an=XlF17wYA#->j&oB#;G zE-N8SAX$G=yNaECA>K7l&JlewgI|$`w<_Mb;^Gor0PQXus%){Ozw2p%VhiDTm52K+ zOU5s?dQ9&Sp;K#zq4K-moy_aM1^V0GlsP|ZLay$ER8U}8FHy3>Topx5_crB2Yr6@fd z8d`I$?=hdFRv;LV0l5a4#lEAJX_|ip7ZCOW=zA>GrCiMf9k+TUCNs1fnJLn~!a@O% zFb&Z24+W+*wkbG#bkAuH$RUR@ED_n+yUaitX+t9K)d@dm-@oDJmXMltcp7{1`aqzS zJA-JTDtq1uZ1jPJz~)$W?%sX@|FS!;-ZoZ(6y<*sQ)<98Uy*8AFFd7IF}(JU_0+>4 z!Hooi^-frkORDi?KA9n3b?u~|CzD0ox(q>2HF>O!hgp2D^!$L{?O4XuRqhs;j-rH= z`Ru)V49mL3gy3pCX2br%hq*tVlYyInB(1h>%{#}ITq5pbBk3Xz4_c}Cd%2feuy$eL zeJJ{Y%}jN{eet2)mBOLSGOQvT=1-B(RKhZP_8mdHTOhaX*zQoy)dY(2j4Q5_s3r-i zdpYgE5dBmTHJs>yP}ZV(9#$QmePBdx3@}^Y=UIO*u%0cW!muRFm2|}Kfv}4f_B6qu zuEXxybhP@Ly`pZ)#fwS0Xz&*V_ zs1##t{3nOS;{(oiL3s&KQripYt$w=2N2A&@V&A~hjV$5kbqS*!5P9n^%R@_4?fB+G z8TaiBx)(h1CA;plLq5LmI!Zpx4c#0%$Xix$CbW1o$b0dGg`*{n>W0w|%HN6^dn$Gq zq#cwQq^tgW76BvE z-&0y}JA$!$_*OYzCN{i}6MNq$7@2Y&F`0Ln%a!T#_j(u3EhIZ-OPWAJwYc!JhioQL zE$2*TITYT&L6>pg(vBr+l5dNkrwOY4PQ&DT9TT@>y^?-M5dx`KH4C<(ysURqJa^xf ztU>Sg_||1a2YHP6ZgJU-aPjk39O z%6F76wC0E8$m{P(EmoMue0*CUf5^?VeqGKf@nE+mUlySi3gxM2I~O~f5OdAntCV|W z++G%^oJ3BL*_axQ<{df+WqrjGM>4ed$>Z4EdwL0W{`o+>O+Zr}h4kEq7QU|jalDAk zvkTzSO_NhISYkeZ7%bLq`xS$f47E zxmU38ny0cwNuK5BCr2K(-XS1r1pkfK!nH5(VBih?@!6~68%AGH2one2ZM=FVN1a4c zJMKL*nFdRkLI1FXn?uBlZ2Wx7oa8F8lklO!9vWl;at)Jl@R#qCNuSuESK0Ij$INdb zF>CTkZh;jUr5?`L13eDjq8nu%Cb04rX6b5DM(qExi` zXFA*$4MW=dyVbm0``vSzh?lv)+dOh1dXVk^vV`hy*H4#Qho|s_C?2BQ8dg{b$G@*e z-2WBT3g$<;_d(NMsk66nnzIE&iz}C7Vdwia-^@E;U9BOJuh7N4;`vqmg7-SabT zw7-d8V2OvR!p^D_gkC6b|9rjtG-DPf4jkP>#C>FSmtD5Obp?r~`m_rv?!3-u8*oBL zZ4Y*oewCS_?fzjWCxYUB@bdO-c^zkU;gef>= z%UqR1HqH|eku*>K%0fe8o7zDvX@xB0qb@XXa$*p7^!(WFgkO1o8<5Eh_0i0cY3723qfENUecokM}7&;GE3_iHx75!|Uy8AW3 z;n`Z&WUKMjO;AzlX`(`L9LU<~ZshzR(N`g$Phd%M+cKBTrvq(uzT1*wCe1%bzqIcD zawP2YsUlJN3D+a_%)7>%G)A>$Ve)Qfp zSD~2X^~3=8k;>$)S339OYnWEvC}_5i_#NLZ5)YBB{xCW0k4I>BxJ+nr?T^sN_2soK zDdYk>C5%x!LV~7F<1oMgQm1;+qasy&`}yfJCD`vQ$K1>49_J>g9PE|q4 z+HKUum%%w(z1rW0|FKX()?zOuRQq^q8-jGf!j&x%!+dWb46tkuV>$oR^_pY{N6j&e zdOe>N43r`i!ZA8|{-FVZ_ETOq8z8>BGuVl662Z1{CAEFed_Y4b7w6JKuqvyNr%d4j?aQf=qw5Z*J)vg%*%FtYcwZs>${9JcpLOJ zhDjC&JWKIoDI*?`f^mCu>A1;kij%ubQiS= zijxSC(Q8V~$Sz}##ZGC!i;L;8M9QLJbpKRLc(S`1u)Pn`6A4hS%>!@?x9oX^%eaA^ z)8qCCyKZ}{y0mc0bWhD~)PkLU)7JH-o!?Zn%!|NiitLO{<5o!_I`A4VO9B*y6O{b! z`3I+WE!!`Of}}_=$$ZkYfRbCsFga?66l9_`)mt(<6FN(xv&ziy1Vi3{$8`V@tvyb| zBn@NI;I!_s%$F`}+ecMW^rHkc=6O}KvG1(lQ0C(9mw%LXZR>YBt0%mk%Rbd0C$Za2 z(VEto`ogTQ_8v%h>)+RhC=geFG?QVXa za{)+R&+50d+?0ZaMI80%`p3SqT372+Pud_P?}@UO;=8l+`LK=O*rcNbslE26pk4Kn zR^!#PBD%oQd+~kSblZU5!0LdrlcBGH*w&dvzq5<5Ytx_n7G}OFs z9_!%}?#H|e2~P zujy^vm=Q$K^7&597ZYSC^06)Qi~9Vt8u(Fn)V1W^V}{^wR(XjEU4&v{eW|{B0TIzh zEcBU@>)eHnXfhz)t`KoA|#qU+$cvJk)la z&oJtP4PUNcv;G1hfFx`Tbk8?huBBg@1JrnBYkiSM3Hmy5$ zMAna!QLOk_)1*x`@IWa%ZjM>E5=ELV6)*(&z>eTmhOUySbzz4Y{u zWp*(lc(>A;azUie(fJK?hWCD0Y;IH+X{X#vs&nGc{TxdfwHWG<=28?;`P;I4*Ws&T zYV_d4PF=yS5hchHbTbFGMyCt*N3<7Ri!J-hY+_3$eql+^bQE7hf9ZGm&gR;L@T0bA zbg`F~e`C>;2c7dJWrHsRwW2nMyR;3WJ@Hr{6J@=m+>D;i3G%*(+aG+AKRNC8%cA#C zJGGf_WQ}{EC+9m(!q-1DVtu^Y#K3{8!|hCDw@d8)_cXWc>Z;rS577JnoX-3&(Chyn z(7XE1vt+XbWWSD#B_Lo={rgy5qZ-ed%#~`8oOez5m&MbLlzLJ}bq4ZD4ZU6~hpAOTdOW>o?iD zgg{w__rR>YsI2(d;XrejlDRvK)5^>Hs7ID$qANy_@)1)3Yim)9?3bZceqO z_U21B4-3qxQn_kfht;uk=9UNt0S*#+6a1223XdZF`?z3vN-pxoEn<4wDuX<9sh%ZQk(FQ&9oXh^t#eBDKau^!hpdfauUq z0rfUsx7YP;Z|#kT+bCV0s2YY;3WFCbIE6(Zj$JrqABrLo5XXTqgaJkyFn#tT|D zV~1D=raPOMY5F52qEE<{irASo7vv#r+qK^OO+$ObcZ%f95?-2%_qA9;ZG&C&6iov; zmC$c@3}DFGX8fp*ZXbFDg-iwKPy4`#Ci$D<>MMi{*`wW~gYCu%q=2WL!L&dpnQe1o z_K*RjyO@y$z*{!&BD}2yRb$z^*8$waKEUSqs01XM56)P`jhN^wVHEhuTc_eLdZRik z>%~DMyJ>oI+K2lZ;BJpGQ#DN<0L47P{M%y&np%nMcCNM+H!Xu_!q5KGQS zan(W8bISEsq59*HF@VJj$k8dqiT76_{L|smCmscIK^Kp)k9Z!=F9rV^c_- zi|MX)|JaDGRlfB$?Wgm9vnG`U=E@&yGvOfq+kY#D$-=v}n1oM^PevHGnT)C1@81@x zP!k>XEEK4L8SjXlujri3H46oU+YA>Kwu>H;^RZ#$bubCs{rglQu?RPZKf|uA;g}ZI z=y_b*3S*2>l(YMBl@@wiX00{UC^i%pPltC#aVIQ_M=y9egKImwV=>VTJ-(rT-G$>zg^b7#q!_p&BIgtIGs`EWAo_E+|ar=EBDI zt6LJOl>{a3CY(CAogD$JDOi%`_{mQ_wYh2c9^z?bjA-y0AHIlB%}GTj>n;NQpHo_4c|GY^xb0d#M8c;~^%NGok zU7jwe+~1iA(tEB#AX~a+SkVkT7uW6DPVo*5&W^zIR}-mGZjMuII~gKR_<&VhDPQ=F zZhmO9Q`89(x=-o+ZqF(eP}Yd%+K~)|jMbv-?re9qj*EMB1p-}$Y{MKb+Bdw2EW=&N z34%i8-JrI|rTk&&xo)FFs7S_Ht*P-59URb)@1Xz{Ca!(cvg;R7teSh-6C?kUn2UGw zZVxE+J(wg= zsl-j-_4f)weUzKzVpL{xNp$N%`${E2{M7D};Q2P~q-A9^l%qRI$0;Rv8{Fbfh9Nf` zO$%inZ4N2D72Y_>0%XD|^(!4#w=vv#nLQSK3{oYrusa?AwSFJ}j$&CpAy*VWb=2qu zL2yD*6{UA+?VBt1?P5#Z&F^F%PJa@Rt;3i8mCTM8giSR$u78kt=bmWl@JE+UA$LEH zfkiAAXlf$91NZ^+DzQQZAudx~tRO#BX6t?rWz^u9CvHA4_O|>-n=g5pK z=kf-GYCa7my$43&w^xm1cg^~jN^4HE-`!*&9wOX>0die5W76mc23pO!aH#sJplfme@VT z^m>sa>>oOPrPDubc6K{Aq z`-^IlXA$4i-QjW@|3+r_3~aN-gerCtJnq? zic5Vzzc&M#8i^`pJVQ!RsG+u9XC|OIKS>Gx27qR4FJ}h;Ws~K=&zoZP@xM4y(4jb;{-(nN^&s`u`;io!;i*bKtaNd;A>+-3CHp3|Ku7= z)4DoMsHQycl)#S=!cocbVWY^7B46)6%N;}eEDh4#&|r6|>J7?fDp%{-1_-&n zTGEbs22+jt@?>^)2YKp9zNkrb`$XNQ0j4oJB;0f?V}EsIm}-8OoTix~^sawJ*7U(O zKVLamzEO-9T24RcvSrudPKoai^Nc_kp>c2`0Kg{uwy>ps)EjvDG#b<}V>t~Mg~Pm( z?;SEt?WeD?=lF;>O$fIPa5j-&Cw61Zfl9s!g9-UUq;o>RI`$a&4<&W%-z7x2n6*PO zsMix2=Z^g{VS}~MXYO(reZmt(w1U^(XaG9&mdk6;hKmF*7g2B~&tu))*V`R&$?0hv z_2KaSbhxW#Tb0JX3dsH)G@m`fBKgN{XjlLPmRnEs5XD(_$z*ChE^8!YR}R{Jt;y>s ztA^5I?;F1(q^r}#qOQ-jH_)hx3B0BD8fQ(G-2ZqO!deu|ZdVStb%(|S=q5*X1l`_< zW4s@)Qfq)IbRTtlHH!xV>~{Pk_3N|gT>7AJZz4C3-+4EsVpC#BhGa`)_k^{k!#uPH z`j($1yTn)3M=6ZvP)P+T2l-XQMtv=31k4R;;;GfDr2V;ZS@tZmUG8lfhx#)((#{)! zjt9vaFj5SHI5;!Q*w<9>&(XtfatsHY@gdkAc(CGt+5z{0wL}0`3%Bvu*uYG zTB{KEPn(TbD}0=IqWnrHyBK;`pQ`5PYTp5&z}8Ed0GUmp`r;$+EGGDJotaWAQu#qb zz)<>?Ij(dg^_&L2UBF9tVFfN31lUgU$KRe12>C?+Va|7G^PXKt&b4C}g`eP2vmUMA zFkOSF&EFKOAUns<;{-OGW$6OJw~-n=s1@PbkD%~!{3$+Xdu;IU3pueVE>6T&OFO?k z+p!vwd`Qm?DEue>85lq00_l%^K0>rn;`B6n<=rA$362z*_Hso1?9ymr>s5ZLw4{bCIFfyKN0<7O(OGI9??&@q_27uGTKbo0sELGsC&m@E zPUUvQB1l*_*&*(c=M~_f-l~!S|10^+wR(s?ue~VSXHyci@@R^JwpWahxs4s7nQ4K?`r5a5 zsx}H<`p1D*g5z_i2r@fsaIHmSadm7weCw}&PIWfdo4GJ%Uwvr^KoeO|jr08z313b+ zr%thudrT+D?uUolz{AJePzl|11^rT8J_`A3hp0yIhi{-CH zUbUOr-EfXnor@Ftt$nHB<6=#Yyuc3sO|);74-ua6)iYqXb5-yr*N*6vv_y%GN1u$n z1Z@ao<`1(~Ohj$uW+WcC;4=d4I-yJ6$&EcnWB=+FmSJZJJlLzmyP6- z6I}SVJbaVNfUugLZfy!F+DOdY;Zl#R@Zv0TddQ*b*w$dJYjt94Emsiq#$unJj6&D+ zvb>t`sKH>0H6*&FjA9NK))Vwhs~1NixuPPOw9t+Ut-TrjmKxw2oJ?HcTo--7zdcM} z=a~y8&DOQ9Dc-~{He#d_uU++*Xzg@eOLy02uWC3nFah~mYc)Tk*Edo}qGxN6D&u@Q z?)TP0cCKHFqqx8$6L>cJm@oTic4N&L+h|uSG2tevb*~B=0>4D#1V?E6zByCnbtxLC zwL&C!ES(~e*Q9@OnD~y*@t05V039u-nwKK>V<`xyUN1roiYakLhRtS93OW=;nQ78( zX`a0gTgd?n`p|)ngd#8!l5#2BkK zH?MbL*@kYu4Q-s4W}zCc1~ApO_Y@=r7Nyt0GVw?^_!hWs45|+)Nqi!IYK&Xmp8rqf zDr-D6=~1~CyWSBCD<*)dgF_T7%3O3h1_q+Y$B~8iJ_};=h)!c_%I$L%ycZFoSXL;g z-r>jf7-p>EXw!Mr9a;C**SLmr6KDX7+S9&TxB&Z@1J)G4*GLtZQm{Ia*U4jw=m#%WyNOuFo75D@0x#kFbzIp;8#?+DV3OKsaTYZ%wAx8M9mguC zb3i~=@T*|ec2tNwNXlpOd9I|O`+$x?&5YaduBG^lZl4LN%IgN#W*7{y_e1hilzZ$2 za#Bsn{gdP8ui8tj!JuY{0*h%qZp@ohtjwQsN&f|X`e#gkb%q0pM6e~mwaR0@FgcW5 zdoQzfDRHVRKiR*X8}CV=gS2PONEd1ME(m}OCysl5R)OT zOT+$_c4WZtms#F;}lwjbn~u?!SdatHMf* zXgg~|hd=K0hJP;qzJ?D`8A4BcS|T?LAiv`CJ9rx%Tfg6hM_>QMT>jp6t>4CVt#9=( z?tG^!uOO$XYIv6(hw1(G?aPNNMjX;`1uu#T5XpYDEEb%}E|7Kov>j^wYu~QW4&D>- z{5dZIHrIu6u%AC4&}Gr8OmF5QGG>k+Y1F{*VPxVqBGrb-UG=0=6EYLn zTDJh7O_$#H;LE?ezgPo7CBZ^mR2d7-aFq`t;i9Y$)Qqzo%P}fCrJHD8*=An7bw!yw+Cx+~3-NT6Q&kjEjt4+SE=N zUCLcSad_*K3+kE6^Otp|M*Vl+w6+I`;L$QqZb?tuFOw`u-=V{Yhy7Dh%a4e>^)$dK z+|w87m;USL!b57n9n=+&xJznYe(5~U12cAxsie_zA+{=y&Sbgi3@y!uF$w%lk@a(2 zW7W%@RDHYMTk6c?#Z`ta89nl{4ZvadAFP~VMg10*c`snb*DLa3jH@2W58%np?U~%$ zqw<{3)=W1-MKYIQ|M%lk-r4yB(u;McOVP0Qxq(sgZPfRW(~k~*Wo_b)=Ts$N1)u5IvdawUArgpo)#)+i+yji_6E{B6Bv|iH z{QhQx3fMT{pqRu`EbRHxjOooP7Z}QqLyjTo%NfYI+NjKY{2}#K)~&6C#O#N=8CM76cmMc1wjEvxwRFat*ogFz{ic9#u?UM#to{|$_) z<7-A(3I=&w6dWKgyHaQ-6?^ZcAWk?JmD7HTh__Qyr`7dPZgN4eb8edDo(q){yNrfx zMm1M#f`QrG2s!<@qif1i2}$7|je@_f+GN{*UWUaE{iD<)<8p&5{PNaTZKmzeXUjz0 z{%bwVs77E61sNOsItX$e$Jyykefaf&y*{SgH>!4Kzn>fF0GDkNEs*jT8HUf}GYu|v zC$)h0KpO(DvSTL#j53n#`nn;E0Cat;u-s34C{oI?-3Jgpq!p{tS!KJa@$U2Vl-^%B z(f&BP~N~7#R{3eIFrk3}nfGSDM(UlVQrfcQa-$mv$U34Kmq%j@8*JF}mkX z9+(EL<=h@8N0mrv1jelE}7HOy%+jZ7WNrjVel?tZbCcf1asm(aelBBlfN)I-Q3ZWQ#!HWx%T=Wjl-6nZBU>pN$*vi zK_MX{KUHp_o$?AHNiDGf>eHkpu_4hBkM`({#w?zY=vc5Nq@er-DAQ+SLMt9W~`Dc-N(9919nfoJ-a?1TjY(%suwC zoaN>Ci@cS5vv93{2?L`jts^TdnAy?^UEB#~RRuc&#`VBt<`sH~`ly}?q}O0es-uqB7{5A}7ocqSwYn=Z^Pgx*%JhlH?=52|-IF|p*APgPB4 zq8~f?;M&2decjbVvXgriELnwm^;G&^Kci6v(_AJ*hnzAF+t;?Ncc}N5<^wV~ZD>j9 z%?`1DZmP>!{gAk53fD}sPZL;0O)jc}kDRFZv+yw6spK9DrnMg|IbmU&$+KA^=h}BD z|3P~(PWz_pEp1JXIpu7RV~s8CmY*2{7;eNp_$PU55# z5XHl(-{lo+ThW!+Rr0mr1uVB@cDQblKet;pA9GA7@%*=7h8cW^gT2uC1q8%E^v>pd zaY>xr6GL=jrUSR&&TkLKz_2&{C7BdMdq!Rdxnmn2jD$$aJ4gnQsK;9O*A->|;Vmh= zX2#cZ4j*@P^jUwS<+?SMSt`b6?F%dZd$j8-X)Kzhcd+D7%j0g4(Rr=@>Y&2d(tY+5 zYr!=EV(c#(_a29TzDkk~d$I>7j0Nv=)BDP7pep$;EDfV_KeRVGyxOd7} zJcL_)!tG4F(4*AS24~d>q|=uve7$w+ymXxe%Lg2x<+ikjR!_4%&C3PH5G-h>m5i%l zUVD3*pINckFZrgOs~$@FHuqQ`SC!Ll8E`axVj80G_FjRE;M)UW2RXBG)kWRh_DQw#(b1ZM%+;%gU({dic4)$%Eg?D}P9bQl1pg1x#>*;P1;}Z_fo0)sYds`+gA}mgy+) z6QJqP9p0;Wbjt#I+LuurdLHAveuS-}EeIqxJjQPjBLhf6e0Z5~>IuE6j;%Ltnr&Jfa>a(h?cnWjxEC)aJlWZTn}`^5uV=m%76A;8aUNFf1EC;ZM6 zlt0g}?!T5A>i(de`QNM5;uE0$K)pWPcpvB^2319V*ETt3{*uw&3f=ZV-K&Ud#l|2i zBxwDXCAhqTs0WLVXKGa!Z9BA^u9X6zvWV=u1)x$sI5X(r8QuJ_e4`^-)dAJ;fX0p1 zu=kY&=MvWY0$=w)2NHy62+4(LydT_CJCO=p<%~eW7+wn!TqIZ_ z+reh+wGz$@3{TCKt`An~2k z9XsdKTK^k_sJ{(^PK98a7-%7>nz%gTUy8r8Q#tA383&VvJ#Rf(LfX_yx?Wz%-Dt@%*;3Q{?qmH=HK^S*LPgU%($H2+~+>ebIx;}<^IKr z4u!l?hP}7S*%m|Av)-6}_j-^6l=XG56fW()Y>kMo9#`-yvT{52e-ihbQQ zDn5a&2wEb%Q(IGX@wwERb120CbsAVKtQ|Ml^vqpEiQ0eGcq@5i@(J9pW|jG! zVs;rAUqjGfyq}2hUSgaTT|P}f-kiw_Zgq@_m|&rpJkJR^JJ(0k|RM)=0qpxG=W}%b_;T}305(o-&9sY2|fEVy-2A*GP{_$s9@yNA;sY}P~74ULJqrL zrmHyosvXw=b*<%K^0sQY8YJwf7;KrBJ&bDu1V_FC3nNZwJyH4oW%|fAZ**+w(h5FxDlCmFTkzK-s7! zC=4EH;WxV3nSHlW>0Z}a_X^iJCP2Bcf$2p0H z!@Xh3^C8xE^$YY0n*y&ssyQM0C{S%v(2yNoVFE~rOllkQ^ryH==^^@gS3*+aJwmm5qg&(!Z1}Q_R66Q_W zbH;9e^28>_d-KsuX3Z#cIqHT=%S$b;*Nd$Uf;zi}s?U51;H#%_VegZ+SRELPIwGjr zA+)%2$)C4B2-6pUtatT2WoQ~j(dC8oiT?hXcTe#~G!rml)|QYtK1ajGvXjew z>^-0rM+uln><0Aq$xu~&d@F&4Te@|E&fn!`?R0AVM6Ij&!;l>==lJgF*QTZ9 zb_=f%hG*!$%rA7AfmF#l!YS2H5DR2VS(ta|&)WpyPiy5wZR<9+u?@Xgm*6dhIV1>4 z1ks5i!)LYBouAt2d!N3qMEg=WE1oe|txzGu$_3gVH?~k1rQnjkY?0pOH(q@l?VfeL zm6j>^ZRA28;^;B03d}X3MJr3fH`!5$94MX}dCOo$$VYsBrq=RXCwpk#(>9JnIzHFJ z%wjb9A5%0w*Ji+*9Os5RCw7=xiimd;79fLlEUZu86tZU?X{N@NM0Yk*&S2WGDjl+S z;Y?=vvn{oF)_e6gP8{J2nf$9a*DbJ@A7&-^)xw|SM*0b%{;GAy)s`9QcS*O1_h&9B z4r!ACv_D_^{(y6BHa?ciz5Wnt;l@c8h=95^8+=gVd28rMKSmRTo8|gkicax5kHLp- zy1G=)@-ni2$pivsbTSQ~Y>2Q=aaVYJpS4ciq-44-Mhg{w`yi8S1M9X(rB`*{?}){c zx^oQHQ6~Km$HsMEX{C!Q(2R~4cN&Aj%D`ePhhdKPF#Y6+)H2a^Sx&6)vByl-_)=`+ zH;e>7clO679UG2^yqw!=i%x1q8h%uRx!ua<0$uNr6ZT+@-c8x=u~_q7F*bL1C-SLV zQ3G!uim$C`4@=eLX}+)I?J^eX{E%oeMKO2}iF+IF>LvJ+isEjXX~*rHWEJZ#er78* zE!=Leae4mkJX-!YSu)twDX+&n>Gn}^%JnPebqkt3nTq&&GSZbgyeurHdIXe+ieBsPeXQwhyy7vM*lKWo&UnS*S z(eP$@4Vc4xL*+Pg_siIbRn92>fsK-D+gWb}xb5kLx6wD&abF*Xb1=nfdA5ImO{CPp zCRYkqN8*mF=Ur`^iJm={s&iMeDiOtR{8**~T&W{^=Lux9Gr7gcJMv@JrBfcFOAT_& z>0|MIjXmYv$+#On9_nTn@XHW+sl(lTp>9E;5eD<4=Ff9; zpUk(sfORja5Bc7^1eG$2z&3N9YoCr)ZRr;3XET=DDJ-9c4?eb=-+(tS6l=P50+Y&A zZ$&;xxR;b+lb|2DGVU8y)EA9RVUbL-Lr!E$o~vUIjUW{F*;HT?UePX3y{t6jx!7&6 zBYf;qda1Hv*iI9psBpP#qiRMYoL{mhf9*n6{rR1>>51kmS9Dk3G;A@y_Cd77N?S2s zTz_=S4sE9At02;Vcq$uNbZ*M@+{$wAnol!qK-F78#9_HJkkXvB$EZ%%Lv>K*0mtlE zc!*i-h}uzQj==bPJ?##v6TTCB0S*mf)tX;>WwXNnH`GI&Fc7d-0t$;T1gT zHZGo;x$$D7R}R%25L>hABYZ|6&=4^Nt|#Y@Dp*w2&;R6RlBr`odz_a}zT7s&_WjD6 z`c%9F-*sF%^ROqS&}CbpV$?U^SLtacs@8GOG}5oGK}W&shE0)U&s_Bz0#X^q6WWgQ zD93TNNGFJ#I%(J$ZzI3(p+5;_^n55bP^elsFoXWR@L`bPdK=xRy1dpL=rZ&jET5^_ zi~9&et8_I2^5nFKqshmS$X54agazCNGRJ z61t&X&Y3sU^% z!kI^7e2vSETAeQL*(}Er4&f{7BB4m3 z(DUl8&!}xpkZU;=4Y$wAGMEb9Nl+4BC+w4s3FT?7?w;xu`Bk9ez*D`yv*_)XW)}Zx z8~UxX$vxga<4?+_ELOQBxua!Arzs08mN2TF>xzYhr=5#jrR&hT@va1R58^djjF!2= zqmD3u=GLGDnNpT=&Bq$rl3 zTdKqrg(bS9H>&ML&iZUDGv+s9-3MZx`3x3}BzLY16)tx1ZR0;e)O9QB%Ls2%D_0TK zqgZV%9r_X3v~t2&L%-jLH%8bXh^bd{%F+-az}?iicnzx1W?1h6Kq!_dLB>#;3QLmP zLh(i@wkL2qVA+qMFtsdN?3tiWTHHg#5UfM&-Xi9{eZz#G_4_7^L6meZw$C(byeM%& zw?LkAqZ95}meGVy0b$R>73lBR@5F!&dOj-Udem32?EvJwe8<7tMuTA{aLw^jCEx0~ z2VD)!-jOJUBPPu^&saDX^3YYsFO$$rBr*rM)>#1lF&&2 z=Wycnt%0RGD?N$?d_{AOVCs=^G5#%uGv+zJ+pW{k0FQRa_ zNs9itN&Z%cx7#Mg{vX?9`WDZ;p)Oz)QByj3zF|yzTUVj{6|GjtK&69dW%8K96bS8WX_o3HqBHnR<@Yp`SdxO8!-bwxWRmRZID zRzCOMc@cRU3(S?f@>hqyqf(mJ@WZM^;0R0{!BU!wivkniviBbwT`rf_+ge4=jpSk_ zI$NiU>cCDAw_+n)?Gg-KgK7#h1Ps}x`H$qSwl!5?p$k-ydtypuaY>oJ+5#Kz6bK3F z19M&;s7wbPNm(D%BZXWj#ljCIUDQhxsm-yX8f%D3?@lLXa1fPQu5i;S^1gM0CRg!H z)PNgEML(BCy51f_cYWrf6=WNq1C#oJyrpB2h3u2x^FiaVUyi2%B)y* zxNHm3rh<=k5w{bn+{q?l@-ztP2bJ}d01Tb?|IP|jz&CLcndq13%uS}4 z#B6zu_%4z-GZW|CDfn--nyrVQyBE>C=4uD@wD$gw7H&VGgMK5&lK9_N#3sqQyEySR zm^_yF`)_&MzbfDFXRy%RV7PRQxC|#58OI*RB_h?{$)~ZbswK3aR6_HR zcaTW9ON@wZ52>8tS2X(z677fJZppR_943ZCT;%5!zrRtzE$-)#B!DE7Uof#(@case_?dju zd6%<0#&Wc?wguiH`Y$}K5AGf$eMTJ-L<;QU9w3ANF7SY=V*lX(uEUV*6C{HKDb&4N z;zGbKc{kMmT~{X6JR_AWBgIPEf$mPh}EcM?iS&$^tm_deg<``+`N`{T~%S+Gk0)+%X9ZY6<@zlmLtcH#2|J{AN^LAN&ihb^*&%R$i`lfmnlz;k|p8>vmCoM}90ZvOfb~4zaPr-`gji~22 zk*(N=7h;fP`Op>V6G zQEM3;lg_&SdHh-Y;U9Uv-a~CfdAZ(WQ|)(#9Q|6-{I+FZ*WFdMdA5t)vg=eiD)@GsAu zKJ=W2m-{offAbs|><0;S|Cj$FPyWMky8j~$4p&}Q_}zQ=q`Cy63XXsHe6_GXDA)JW zg?N`cGF?5Qx4Ky$8b)fL$#VI`xfpK}R(RsQO=x@wM~z_N%U`DTg-4^zg-oGm$hc@E zo2c#acK^FiH75PgXr@oi*mQ?|_*NB(5^;cU7I0w181X-NB3F8nS&;B1$>DTKc--2o z!=-yGozE@qw|91#DG7j2NC^9c8miCl)vYpD{4Hefn~^ZsT>Xy3<`F<^HZh`uiA3c6 z0W5AcElnA9x2*&{G?VFmP6+`%PScjT-U^IrJT$AJ9zVFTfNnKZ@NYHj4cscR>>Ft! zh9oat##Z+UCpQ>((->G2zc|KQhJ8!$J6Qx-Sbrydq)X}3bN{Qd%QC#QVVplnS+?Za zR7}u{RTzHYt)ez&+s@ZH!pm7r0Kpi$vZ66&k`$ovYCmY^xe!%IT*YO2iKl*&$WB>mx^IiAS~VkH}IAY{x#ybLy#ld~Qk3-|Ry9}REPY!=?w zlA6&*-W#>jx3)UV+&M*9LQCArYFy0RC2%ZU9ly6GXHZQNBP)$Qi`2Ix>YHIP1)0m4 zM^Jaj@1^KGa_v~(Bj68=2=(P3kkiZane9=a$!mh(IzG5!QWDK2c&ackEBvwv$Y+s- z@MR`eiEvt6L5if2$^f3CI72(LE~&uyI@0IO{N-L`Mk7%TKA=VA@{%rkj9fdi`5L_v z$4kI&ehulSXpwu&rK6GCvoBsI0Ml=F-Md8w+hk+*Yk4RlRJ?Ye$Vy0oz>9l4`O%=# z`l=H<1(Sb6?>_*yg+eQlkFnrKJ@sUp#CUIo^O^gn@{XZY8Dg7?p1P4pN&QJn|MfpH zf$L2vegm&uTRfB4TE>oO_WUGjJvv6iK6I&X-d0Y1@r zt~K;EN8QWWn>)Lp3iO#Vr>JR5R}N8l*G)oAq;VyD+?25NOEl9pBB)Djb?wt}tf$hB z-a%6=aVM}vG{zE_AivP+8L%wyhyoU4N3HG~bO7BfcOlmDzU^V#Eb~Ts+=h(?$DrS~ zhA(wX3tpo<@Jri;qu5b{j`us3;J`PWqEDz0fai=x@-iGW$q_j%q76R9<=T2D;kI|q z&hqfe&^$liVdCGggM(lX`rQG0`Cara5eoJXC+cq7?wOS)DX4~W44FUq8}1wCzcMpc|(Kjw#Z{I>_g@YbTzBZ0Pp6Ifg^Jwy?Ir-2=tqHVot>8ivB@KQc z>{fdb@*UmPSVx|m_9ZOsuB-yju3VVEE)mMlF!?POO9e^ZFwe^{nEGaQ^vAI}P1qv9 zE7|}rt0>UbL9d>(V@4e00N$9vW)+33^}61!B_RmgUm(j{V+P$0zmu1QF@-(3;U=)w zda+$u;xQ}u*fE`swoKM%Yfh>8mL%ju?*4cZDBQ+q$sFg<`)}PZ}G8f(k_tDhIlP4W?J&U!r z$L_d`jwJ5O*U3MvmrRrAL*y@4!Yxh_5d>p`+@~MH`i;+qL7GLv0be4AHA_KLmNeg> z?Ko&H=Wf^Fsa#uy5;^$6bN`(YgSF3a^5t&#&=|-WtVm`dtXnw!IWQVAn8b*%+it}p z!xv!4Iveb$RQ(yNm+LIg5yXkm*aU>*EvnrI89RSxEtw*c_absp{08H~Z0FlOa;U3x zV2E!Ev(ft-q}u9Q{>1_iPVdGeqn}A}7?r8B$a^KnyYG!{qD+I_cy{e()ibGA*CGfb z6M=YRCZnx5*`CV#-C>38k9>9b`!xBV=T%Tm&p64y>hc>uLzaBH{qqv(?v153cI}Is z{H3)%j1vnN3{ar)A9mlQcq>a@A*8I#a*wIWc-GHjU|cikmDniE`W=l`3EjdB`V1%P z-RU4M8Xetnp>)!k7~059Ib-$w`_=pbZ+5Wwj-V*mD})twnR;&jq*Q2)43Of`Dr%0n zVst!Fu%di?v4wxP+STk0+UIUN;-w&wk(e=uWL&OO%mwR=M#RD(dgWLI{N~Bc@66m$ex|tf zVzRai4>d}^a#v-I=Azeei;J2HZ4d}mB>5;r0VewoJPkD-LDvG#F~BZ=Imgp$`YyF$ zdBj`CUVQ#2UCbwO0l# z=w3;RYXV8lU9)zX%Bl@Dx@;e_M+z_lyIsN5z0!ZKK+ODSV-}+Y+ z$qEwn5#eF+J)RB#_C5I?X*ImRM3nLHH1qh2_lDY82`i>-zmqmodEniE^uHsx5Zi#S z|H2`n|ApX!1H1yC{|AIS{!a*(`ws;2zk`(jX9yQ7^1mS5&I5)23E^h?-COo&@9U`M z4HX{w3g5J09Rj_&*IJ$2q?@IAcZ7W?ldrmUpDxzmtQ%Hun6>=K`{>t%@mnp=8{Uas zgQsz1F(uqM3go9E*CP4#RQdh`Y=vAo68*1DO8ytv`oC}TKhPHUKlb>Z{U7hVbolMN z_k_BnQ{>!Dj9UIa{+g*>+TwBitx4zl5UV-owb)Z}+1<7D_00G-&XW2+ww--0ipr8E zf1Bf33cmR~@I6kuBKpkLg@ar3^g$H;_7&%wFw3`=G!zL48yXnM4JFM68m{Dq57dKw zZrvEqSnm*0rQOYb*zi_=MEAaMp5&K1Ro^$Kn*{c%8(%CgyL+YZi3(AfCduzS6`35g;8=eVrSBp(Dbj)=3^|4znrC`@~tmyzJoN}dgsEX zQtALd_5RD^v4VpQEv+^X*3`FKl*B(rZ}r+#H}JBOgL(}I2r#=srPGP^;R*OFC$oHWd&9Gr4%e`G+%fMu^v z<`+liRd!u~KlR88Kt^K{%Fr$hd`%v~gmHW)!M(s_9CDO#&xWaGniPXpnTUnjb*M&cJBzyE}iaJ^+^miB%CjUteNQIpTN}1hxnOGBfO5 z*Fy*8ZFAdK)CHnk8c-z#^|d&=Z8yGZEPWIP{^a}0K(N}1AETi#CumEJ=)NIcR0?v` zpW)UEYL9OEDrpMr2xNS+{@f$H&rC)>iHoROxJa+wu&EtkER!A3!jT#nR3u@Fs1wY>nY)5d6Z@cn3vX12AffyeJ7`>BRk462+~l;7-P>!7T; zfiAUf5zEFOkLpov6UWCyUbN1#$j?6}HAlikl>%{sMJUd&=_U!1s6XuO0nx$3l!!0m z1aBs9vTEVF0v3%b$l?by>XQiT%Q7my0h^ke%L9=Zc`PJyb}`0@yt6D{ERV9YD=P-P z^S{tvw&4;K6;UxxS5?hbN@JYv757h*DWo=62eif^3fQzXY= z{)T8;BW!g}FsS~q&#l$+c7=zYfXR)LdxF`)|m zaSP4M2!+DEXTTs$3d~_6*mE|XP(0sR>2S00t zO(?RxHLfM{mvrvJOz8!nzhsq0dZJIgZb|B(Dfn?IpfAT96y!u&XQW5G30zKIV<>&W z%dH?1b-Lf8%xU{)!2d(N%k_oT@)(6Ic36^elY=9#OvNuc@h1&{M}hO;Az zer6ep0jIS2dUax7skIsot1IpAz$rIr9}|H7M$S!HI;2$P&(lknH_y=k(J+5059X8l zAAVA5n+kk!NjBU4{*I`T6_JL0;b!e_#j zGbF8(xNPkcvk565!?V-Ar_A;7ixGZ1f4a_ZefiiEUU!#q{p|EKR&>WVzwNwzV35A9O>dDdN0)qwYF>$mG4ez>Cm51?IVt1P;Hw;UkQNSA?+E zql)F06@iWM>%S8UbgI~$F5Yz6mipGH)%Hn)r~kwq&YWB~8qc>T#W=b*$D`VZ1?|?H z85g~zCGQcGQQ`v|Po0C|%5?j(PvL~Iw*NSb3mE}V{uM^K|2n4rBaHtP3I0tSko`wQ zPYe9>xXKQFWW6TUmE77r&@ugi*YlU#^(W5*l^41*lwXR8wYey{|Gw~cX+G=y@08zz zPxVsd)ZOF@Z0$#$$SLUFJm)as%^6IE(!;@fO}QL0)&n>yBgY1c+QLCSMI@s_6(p{v&UULzqIMgs?{SiV8Za~_}qB7p1 zxAk;`s#3%0M4&#e$(V^|ieFE0`wAr#W5IT=PbjZGl-#8%8U0*d2e`HqZy;gFdM!x_ z{mzKE@@#U%kHqS38njHX7kUkf5qh}NVM8D_OW62B~#)^nRlZhD$3!v1Mh()jG;5?JW#m`x=?w4 ztWYGnQk4@Aewckf5TfM6je;)8k?p-k5AD*go(k&Qi|fBv+P0@k9{lu74Q8oL5xHt! zv0YpKN@H(bJ?Dz_Qv}|&HQd#df{pc`%-!|QYjQBvKtG1&kCCvT{OR!3jZNWHfs~pQr(UNB9UwN)6knW$H5zVoKR)@ zicglj3g!G}W7iySNcPQ>`Cm?gtwVT2ksOO+${Aa!uwRojS;FpJKaU$no&XlkJ*WdgyylRh1jhJG<| z)sHr;riKn4QEM`K5f>FCxya0nZd`giy;knI24tAxq~UmY;2_>rQsl*Bs5HE@C>Y+x&-A-7e} zMZyx|r>vAhLDaNo?M4hzSf2~rOz!n6l?{u2y<)v=10yODzR2-EW(KcXk6XOq;V@@x z>5|P-rewM|hCT$8!x92-+E+0zZWj@CUj=Q4aiSL2ucIjDV%t0%l&v>npuvUXn32Dj zR=eP7gLum6wpJU!kq;F{KTRIQ{Qi@if9B6_ehJeBn_%BX;wEm|idEL$^5^_#|g`&54lx+6MP6lO2(jyQPUdIP|q{uJ9 z_0OEfn6sab&HX8d+t|=dMbzN6I}yeAc&%1uaNdIQHcU3j4myy+vjjO6rwx)XXT`>= zjO;*v`X8mDpsAsQcr{!}4C)BD(Ul9e{4ENZ@6QRI8o%1dOjsWT9_z}vq9o;8v}mZK zZL~6#O%8|&C&kuh7bgJvAl(+mU~SEed%=PwAlXoZca)epFs%x3zu9~3l`lUh7K_Z- z=NPjm8vTIF?`g>E9M~sYFrkGlWHb^=JFRbUFlx{ZzVL!6mR}?Wa>ReWRGuD#>@P+O zZ@ls2k8PS#xy}4shO@};Ep*PT6_Go&a!MfotQf90<5oKzCjS5e}GgRJY7NEMTh#rnDTAq5| zIO~VY$7Y-S2<}~&a@V{W4De=$_`-%stFHBjh)`TWFLy!2CwBRwawr;5bU1FRc>ob}0rx$=)Go}Y}j$2@r6+vWHVwQ5a1#kTTC ze998t-u=Q@x=u)Z9~A0@e;Ujc@EpOHF9zX2O&l~F2dm7sG8(4YLd(=bH7JR?Wu0N) z4`ld@y$sW^<*d*uZExxQnkOpc2Jaw|PRZ~9(Y~M#->bjg2`*J9-+U6-F1OXI-2?oI*~KJsfb&EZmfk|ZQ^8p{qB+4>)H`Unv>L@+u&kQ)rmkP=2(%j_HEyb)AYqdYQCpvBtewgTI$0KRsa0Em?ji`WAi5wgP>Q zq){A`c$*vQV`WX~e*uPY0#`1P&8}uDk|Tbwkq6I*t1(2e%P_IZq?MaF0v0V02NCXY zx9R4i4BiVKh{waM1mPl8@LPdO9PLE-U~BEus|;j`Tqjndov|U6*nlY>IR;gi6(`oD zo#H?bnmM}XRi9&nhBk3+5EVr9AvB$jVAuRQfrw(GpFKi*XfK?FjG#@hmw|XRa>CLW zZVK~brP=?r{$cf-p1ung7JE%nGIVQld?%Sm6M?J>Of;&$q=P<+l5Y}&2*kvimQ2yp zR}D+gBjcoq^;4}{9%UTZkV|V?-9CFsJ7(W`jMA+&7MKoGHu0dKs&ht7lDjakB}FRy zi|DQkvDZf5P84WI-5jnR2GGb)hL`s8hp=2BpPV!!^!`XY<=3D6l_^-_4-+?aeHhFa z)=ma6cDUYpX;tKuZgNCAD;E{`4NiJIbE~Ht0{rz~ox1^=-WV-6hDLZ9l2f+Kdhj;a zC|z+swv*~OP`MkOy7h~4^T}$Pa_hDfe|{pku+nK$J&FeL?7^RfDr1j;N&0OKw1v~l zM%$ySdc{9kHcR-nEnva22>)Nl{3qxwXN+`@F^j*=4tI$J%b=PJS)s&Dw$T~TLNTDH zhO`cA7%`BYk4*!y&4}6Xe zD~?O!HpMCaQ1$}CRdC*WdDb@4Ibx9g=Zgwq0q2&Io#Z-=nvxC>tqqt}c-9JH#gb5? zmcNQz-`em4LN$u$v}b>%hs;2q&;k;XVWx^n@Zt~A-Z3D8>oX1je?#&* z;VEG$zkX>rQ;*zWeTn+1r)8iTSky2ibV)m$krG#2=h+#N+{X2;)Y<~l{jSW3<+f|x zK&cWUOxFYz$TFb77}eU$6g4z$x_2zb&IMY-vw?8m&V02AJQLcIe&5~DIGj#1^3x)B zrry~PCc3x`qlwOh5&6V{AxQE&Nb^Zb?edIMKG^LYe@PX zxFI*Dq%**sNnqk3VJjaeQj_M4>F=njI zYyfM~GuD?g_*5%YN>1k@Jo1FmE;DRlRr&U0lgi`pUiKcN{`^qvXwIURSRd><<_@7B znKxmFp>mOTUtZsBBSj%6;(kcuw8fyrTY)kt5&cx=%B6TZeQ3YU!@Ol|#k2|ytrnzR zTXMCLU$yY;YTZT)$ic~>`!Q*ZxyA4#%afJp%{H>_oEf@NniExSzykKtJ;iYR{r3Y6 z@<5!1g$cBdo!wA_Tj&kIaK+C?Q*~ayHm1UB(&$`*PvDC19_%MI>eZ);Muf!L!%9~v zy-{tLH!oAvVX%#G(xrZmrA3SeI*i8eXd%Bctu2@9MXOU*T3W4e5*c1;fTb)I?gA&= z(y}HjZL(7_V-DlV+fFShu0gTAZ9gJ;1834$OAA`FsSmO zB0p5!RgowPmxy>O*B{GJ!p^hHP>iN}$x|?vEiB|XMy3edGG>&|iV9m*SaBQ^h8m1- zovgbG4gi)l+DRAGwgkbduKH8QcH*oE)+@=v6lpoF?@ew zMjEO^KSExAr@V@_u*Fm%G`4wUP?UHI@+29BSI=d@y&elQAdlphg1hAaq5=#^dSJ$RC~*1`_kLAy-Np$g z(G@rW*nOukK3;_oMz-wcU+x0}T!h4YiCF|(dSQg56=8{9FS30E?yPLUG#oVF`QiAlmt@&ioUQOe_JU78{DdBZEi_{k5@FRfNEtQaabf?C2tm%<-N?n><0 z!SgYSXm?cI6G57gE54ns450sA{yq~&4E+B>xu3avJpcE8{68u8wSQ6W58;ojNzz>c znqDqHR5f)S{+=`G__|eOTQ86!?K+9c{aT6mkn-q!zs;@6>B;lgtYl=4rQg-Q+3@hy z(*5=4?>FAQsd+{p-55cmyYTujDXC=q0u;Rh%}0=y_E34Stb?^->*eRiGq|s6<~vy| zbB$}i)|3uILtN!2LuefAoFPgdRzz`YBL|ES0j!)89FAU86o4bqNNgyiE^n1g0$N`@ zt{}r1;ikvgYd%uS_ppfh{Ju9otqcB8!={Q-ma9)-lPQKvmQy6j7)Y(7cll23Wcj_` z%CnE`AV{Caj82aYpRuR*u9Eq1MGZ*|g9J~mK-CD4zo&&%ZP|uBI3EeD-(n7W5QO8d>m$vS*ujwMo9e&p6f4hU-oZP@Z1_W>K(DxbSd1L{ zyl82%%TdT_5(n6ZjmIBgjD~f?RfMU6(l5BcPhac!#sjt>0v4jozInF*P2T_r)7}yaavu@YwO2PCN~z#R~N&ryAfk zr|uqsZ~Op6VBqJR&|CY8AK`s%HJd-EoCnP+EYNRbi9#j^()ueRjP>R)eIu+ev~1<= zH3H^^QY?zGvWNO=fm{2L*D|JQHz;ka>{UB(BF)JES)~kP#XY(N-|*JjXZ%^|CwqY# ztNX(=4cA^|fR9!TYRWTJ!$Lf<3_I>_P|n*c0q7F%6jT zG;b}-vE!tKr{A&G+L$CV7WMaSz!nsPpBb+33`7j_fsnlTd@`i4nW+{B(>^%2rR^m) zkbKVU(Mw5stqsg`9h_iy$bNG1&hXiy@GlG%2lIS&h8| z?rxn@;-wJl%~nx6Hv&DUw5N^HDBdCptxbyxr??W_&DBQV0cE)_>&ockTl@>X8oQ*% zv)gY*?0O2o^Cx^B@CWRRof^r^oq%-}3)binQm92*;y`H0BJ)5LDWA! z_v7rs(6esGbvOr;iP5F5DH;yLMa7_@h4N%$#7unLW4LuE0&AdkN*5T5i$;F#=K}lW zb?ejn+il-r>xH5IK{|UM084_Lrv-ty3TesglfvmA^EKQ@e@gP^o50HbJVxh|!S%Xa z#aX;UB4Vd^n09kqzfJqRtp=*$&rMVoC99>N^_a)`TqQ^Hfp@thu>;^Im-k{lmC1t( z$^Obmy*2z!b2@bu1)bb7LW@w$FzfuNLbpFmk96@-h4DV}7%jbHz>Ey3x#G05EjCs$fr<=+ncUBL9=%I(z6dojpNfZu*gAO=Uz;qQ!J8NNzw zL%!=;vM_j0`odnoN-G|}K{LwyZ8RbQ-Kn{>%kUZWGtf?@Ci5m<`jsjEqHjUEM~^jM)wpVi5g zLxK5mN$xlvWqz$60@9OUo=I*LbMrj?R(Gzt>lhL%({t@UCD3SM(O=Uq9 zaz;Z@LC_2@DQ)ib#UihL0J33&KlVD*(=WmkMDe!vZHtJwwyWpO#Y=&A9bfd3`_7;< z9&w-uGdu)Sd7C(NoR%t++T0sPyD6HhH4-XDlx{dh%pY~p$6JV}J&uR#NryTd?Q@s* z%LuBgmYvgIgsSsHzahjnlKH3p;8#&=6Sz!u;Ha;M*!arLY*@onyqYYOs3kDUH&v?+ zgyyq=;l3#XMtEBMuDQUo6}<|qxJ}-x6{TkiKrHK`;*W`Bs(@79({5mHFq>noT?FSgdGR&tRGYZWl?1>eq%I%n!y>E>mV-6@|dGlfkP!cZ3* zT@0oS+$!qn9$hqy{77ds%-b_vH*QR8eT^hqd+1{-qCOtHz>FS7K7Ue9{-pV0*j)MqP78LNF?a%wLK%5G?|@WpI{`1ddByP0%1j)*!~yb=IX0SXia3+4YIW21{RbI_kr+E8 zfoGut6{eUHas9hA`2+2+4`1?o6K&5qdjxLLwNMA&eN0GC^tLHV$Q%r1es>JyT?0Cv zjp`Nh?MBWk&$M|y)m*UVTWH=6jU#3ct#ypsK@x}|<*G-~-nJ2|nJC)_aA?ry_M_mw z&2DH8fo0)iqCA<3ta%HpB&p6i@Gj(jec^ESz$T|I7jx?zwm}S91`+K{ev|MecGGBB zfQZZwqn=%y#q*#ls-?-3vUcn6t;}58dgUVQ%ERDJ!#>U^P#3gQn^?%cW1G9}Y0U|HwNQC?O0()F<6Z%m&?>7`v zS*Y?mikao5m4;;M9cD^mDX`1$;uvA3Mv?FQh)HP}_la%NBzYk+=7xusY;s+N$rAGx zT+?Fsu1;fQfCrzBby9u@H7+a#-S~!@Tm)Y8#lYH0pem`q4Sj6j(8 z)5|I+8<3@|q^^}w4AHXo%&bLd;&877zQQSFMu<^kf7gPM({;%zPV@)tn3zjEk`&S% z;x)@h{2uUGc7yN(Q3#|K8XU)e(H?j`^7mfp*rVs^E9ERu4aU(W0eybdrvBJ*aCT@) z;H!Fmg1mu~hh)VN8w2g@{U!t%^o3bN+OBj$T-@S-1PD@I6}4t!6IsE#v#yo^%;dzF zFq(%pXY@B&$CKYN_~f)2R%Vu`CTJMgJh$&{|Jj>$8$wMu5YS~qQ5{dMh?(s2?U_f}a|}SIST# zK1}T~?~mqG2``7%rsrZ~rLQ^N<1Cw}gn!GXOC)7k--He1!toE=_YgI&cc352WKb6! zsX^R;EL=6 z807LwskylyKckhs4>a;HzqsV{nrtx;x3yQ}zo90b9%-Z_|4 zFgaH+_I>9%KXH}J|8Tm?vsu_!TVb?%pu6y8B(#rI;|U&Oj%b}I8X2fg-gfsqjO-;( zN7?eZT>pm`R|^+6p6RTXY&6|RI z6dQ=Tl`{@^ANPrdG3?Ipd(9Y!Vn4s$j6pqXhu%kgzs*z`Y8m^g?7@`wdTa?C^lBff zpN*V4iUDib7;B|CdcjPA=Z|M6iALuop+RAivmmcY@d38&=V#GN?BoD6SLXnrF~Hcr z5ws}nW^j(T&QOs0{IU)^<#BAKQF)1H1PXqBK2^$`GV<}_D4Z{S7##HF2btE-Ilw5j zav3=9S^H5+DDa-N-!D?9OGNJrqu*Md(gEty(2;eAQN+WwMXly`3TfxD33P4GCk?%- zxj^5&Io$S(V&g(K(1-Bt125PxzgM|&-eXN_(srlsS1>n@^P&m~1|OzL#XsmPWrO7> zMBl9pH>|93RTBrT|FlWlE%-6alqmOe#1H`y??BJHIQG#c%{oN{y*`SARfQVt^a_6f z6}-7|tnxk9EdkWsd@9P&dZhD`RlU$1K>0^^@_L>BTcfDaV%wMaa|iIkPckTRK~owM zgxh2D-C?)_4F+V!KFj`J`pKfeoHLMUQ`|dJKhZaYt{vl%n0YA8_r#5{<9TE`?M^pWY074cGk~}r#U`gaIm61=lR{IWc%==bf&u|NVU)e&Qi=RQ zbr3gWWHze8nLjy*Wj}X2Z2SZmIS~_k+_}~v@;e4goB9Oe_nJ*>bop}bWDYUc&DH%a zz?97|nLf~Id*??^)LfL@XS+H2bU=PUBf#*_F2|U((@T>2?lLpP>VtG|eI&zm8?#$c zz_d=bTeGvxuSfzBS_3D$6xG0Yz~P+XPe{SH@yl<~)IW;F7-Eb~X=8%ue8GSHx?bO7Llb_;Dy>6e;^*GJ@a(S8F(>E zOI{-I%R8AetKP+i7jFN%1s}UzFTN++A0RScK=qXGfrm?C#@;;K#ONF1^ee0SNN#Ey zA^90vbo$|?29|%P=7`jS&;O$4=l`2-cz~DZlmB;a&i=o+`C&VJ0_XxgJnw$Ph8a8y_E4(5{hD{E@Iv|K-@>zZ8!nicBq-geyYch4II7PX zHng#X#V+_uqYtV1UL7fLAT*x@8>l}kkIA|m12TFeg0^4*z=H) z3hII78T+{#-HaxZ!mC-p^=UrwppI%byXWG@FlQY~zd#i7oU|;MaRiliJCA2OEsks5ffD&U=&kh+ zR&XwHM`mAac&_OLs$uI>(hCF!c{j7nTNOyipx}_VyYZK{43`D=3^~HtFNU{(FOfNC z&9Mt1nGOOIQfi&n;Vh_wMM-=A7e<5*!14$fvdxd$uH=UnSQo6sx_r!`Ga+HXBX+TNIlP~@1tz*{GN5EN6ZvhT)zQa03bN$o%uvdG(mvWcici5ir zrROf;Rfh!cjyvFh>-kat$XpcMBkjb2`nk|%;y0>Ma@B|j;BA6Soq8R#KLrDUh6bK_;i)Z1 z`r~-yHM>FPAo@26dnoHy2tsB2Rmg=Q{7{!$GP_BY&wSylcv}(jWXr;^E6w>(SY9lY zp&-^ylU!KF@cvoUU~M)OEI?@sL5Vy-=Y$-`IPFEKZU4 zw{V@1V_oR(kIWML{J7jGX{pHC7k}9L!VgJ{`Ma;LT${^Dt(nttgGt|vVvuo&%k6e< z>eMX}y|-fvm(~FHS=@%nK_n4wuO9t%SHfy4&N}7r0SH@9z>3pT~Ij zHsNWY9z>oMZLCZNSk@(s^vkzoavGV=o*=&2T9u}9L;ZL32_u9vop9ia2{gjet}}5u z{l#j!8BOc3Vfe%lK^-fP22E*99qJc`7LmDVomm!SITtx>PV>cCXlp5b+2DcI2aEn>BYD)A@M|G2O< z4M7zkr!W-td)Ydx%9k+w9rzCQ0~flrk4){spb&J^?>2{)O31E1L397b zeeNAV6#69Sunv=wda&rz`@lx-BcwNiAn%?#s=2fU_+gXkkI!JEy8{TWPEm% z*bP52m9;uQB8GRh$*G@;fmfFfTv8g_VMe7|?V08G2-Ae$X-wc!HoaW7H50LH*CtgK zX4nZGXnye#J2a^D7OCIf@b@e$?e@}v{yO^Suj63D>FN(mhd8>Nb@CaoKO0!P{uRA8 zwM8^I;>v7h(nx+w-AHz6qhVsV0MA!?o4v4Dj}daKRTOD=2@ZPHy_byRK^bBsp=zKb z(6u3<#R!eXnH&1FB~_-SP%c}wFL#=e+em8?$kWUo%_nYQtlYSwtwS zZ;n{8UM2C=E-9?8+2G(81ia;qFh8?kVc!M5A-u&>2LP_gb1J;$!@q!Hudd>;< zy$?OI7yEPckH_xxXVJ+RWOI;=kzc+HY8AnXx-*^6MCiuTbMW5)4!iHp0vbY48J7i_ zeQ@w0%Wt*W1^g6E^iWT=4L<4C)3SwWP{v@AQN}PI)yPcADIik&^QO^D)U<2K)AU zd*1iiR;E3DP&mlk-ZdF|4$}A_fy9?~M;7XyF1_?rTMF8GNm$?D%(A*s?P)4rhY#u! zD%zfx)yPKEyC>GYho#*xZ`Io9gGC&O&-2V|4wFb0Jdcr}%LewWho0U&5Dj2s+olFeO&b zZhw(n!zqSKs#-+|qIsHnwpQiyOH@09b&jHzg_GzC>1Y&Zd8jIx8nC9j8~N46NnwX? z-ia|FPIN4li1Mc%>FOsl9-pB8Rs$uj8T~rOJZq_J%pBgk|L7H(i!&OecdIq*bGg8U z%*%H^VNbJzb4G*~(gq4Fer$_*U{tNYQ-o!q^&=+|ej9Md7x-EHDo4pDmm&?T)uLJa(|BYSmKB_%E=h4H9lv*MdkU`r^z=VS zzJ&b{kez;JoA~Nb*`(E;#a}1~<4u6ys7FP=olT$`hu0~;XAP^u#~c-+PA8s!4|d^3 z-E{`uGB3?5)xEA?)cVeDuCm@0{<>4*0?_RrOa7qxerLCe2k)QUDP#gjwY7-$XMnHj zx$!QK=tJHCF_F}-;YM+Y8{D5lKtk0BI!F0oS^O%vztK|g=hOZCJv}&JPf7%#y8>LE||6Q@lvyF(0`^GQ}N7#pBHk9Ij)(ejj~ZS1c8DqG)`QH$S8aY~zokVm<~g>FP$l&* ziJ$R@GZ(`=qz{iP70GwPA=By`ylL<}JLxE7;AeuG*+L<*@1H8+0?` zdi}^TKMxC8he0TE>@qL3CXW~Xr>%>CI;fGQtc7+ilBg}A@Vpl2Nofl`-FAP#fL>%= zjs0qCEpf6{^h*d~31$6GpnZ(ZS?jOcQF7Q?s4Elwmeph6sM1TRqd=F+JA`W*JJUC zJy`Q6!1&>nrvcqP>z84t4npY~>z|iHqh8!xb+!cZ@<-mSab zw#EGx9XV2L8{o^oB|Rb>WOv#pDI!|r#0}U}Efc8wZO(xTJ}Z3-tC>{uoHoJCwLU&gj>go%`q@y`|ubrqi!sHpQOnbAogxAu;0o z@=VQ#z5DsB;M2`nRAi7V^ya4@)y|0wFi?~~M*;nHzx%#09R;~O`84D~Gk90}BqS4P$T zPL5M$mJL=|i>wFK;itm+g3QaC+X8#uYD{A?$Hfxhy=K)wj%-{@a{WMPT;4qFSI5N@ zd*^FEIf{PMFJjkI7ZCVqIx9%xn9KdDvqLYd`FWTRqJ1S#=j;gTa@3MLRHPmnos=gU z^J33-d#GyO-zv4%$y9Rq7|;9Qv}B)9D?aOv(3=6z1x4!V-aO?ls z_I`fIus#2u;{$d793S}K{IkISc?@is^M8$jadO7KEEn|LjCvkJj_W$}VJ>bz{5S)* z3Q{dQ^OMOMZ}_Kb<9NIiPHllD-m3Tqnr*apdVw+?g;fEP;<%;oF-|KSr`$PpUAm8L*5n4I-bUs^;_V`tsCP5`zMv8BeqVC zOOcc+>UqNSMwYlt#!F#XwoFmTSTj%+tdhszcdlU0# zA26o`D|C47HyE)D@m$V`?4O$C%m{vh4G}9v+i&wdc=RhmI1B6s}ZT>-L}8&$dO^Bx-%eAq2r?7dZ1a_OgX9qHWaW_WS=tR%=r|ysxqEy zf1-jWSQw6pS__}jitGstG|um4_m`Tv&kV}s>_Uv~Sxw|zdkjN(tv-)CjNgC0(=B#oG z3np=0(wwv_5HviE;;6J^BP zH~nWQocTY5!UOa}KVM%@kN@-)wf=|sWEc8>uK&Nn;E?d>%l{2I@?V6(aNoXthKC>V z_1^Dl-|zhI)j0VtN8cZ?=-l=3f7`V8O-Hl;-1L7Tk+?tb@bf{tJoWVdUnGr_|1(JQ z{!iQVNcg|&m*M}TUyhCs{)df~?EL2CB2uOKM|oNPnfLyJiTnE3j$FJSH0@^nkF-+J zuFt53TYUYkt*!TKyz%ny8v=fwxG~aG#@8=Ou?}4OIKMU*I4P=ZB0vXPZZ3?#VSd+H0Dml%29of%qdAayB6fBuBo~z4C3*X%oVk z1$oW414wE}4TC~sX9c><&|V-tA!dIKoMQuKVMZTp2XDWB1L=F7@AKd>`x%GO5QS2a zyCt$PZZGo;x1c^VEUt zq;I>0J2$t$TaWo7e1dWT0iHhHTJE%j;I-JrZ_U0Lkjdo>8CVI7*?aG)Yutqmo1f~c^=Ma z4n_C}d1Vot?3~q0rM<24uK$@55F_Oi+dZTatk**kUB9Urlea^qz13mpYiaDDac2Omzz^D^z=s(NxNQ`P*?wkGk zi|ZzOW8hBc>x;^j4a(Gx)Uw-Km9uI#1NgE}{ruHXPx)Zp;(P$faXfNN{dG}@GE!$O z348yjaC*)qsJpcjBqM^_{kq%SA7$36wQeLabfIJNq@*D{RlO55S@k*fin&g&;;yC% zHG97Isq8>$l>R-NyB%BD+Tif_`T!9-krsunbdn6Ns_b&(k`zrz&nbfti@f@eAWa53P#U^#*=1TTv-qwqlf$n7P(cvj$A^ zcBv~EzfJamNuDQLUoaVXQL9?HEV}Z2iyBs07x7f2ewYxf!9Zb6!m@DdunVNLj-_7oC}@5hD1*t^4IU?7oooB{Q@kB3{x}30khdlnrXOw; zwVcn3>EpmN9F}t(p1dhk;W^4k;Kv*@3k|4m8P{=0OVo1OZ4K~JHM%rD)JbNX`_Msq z{@whgG>~8AF7@*zXf;`FqQ;mvQ^TI5Op(WW@sD_tw>|wkwM|kJnD~kPnvIGdqpWE9 z^l!Q@!<1rORI$zkzUxln0ABU`DUQ~{yFnE51%BC4b?Rdjt0Gf=lM@1IyzlW7XZL7#SMM}Nw~XTCYf^ywgGx1~ObaEdvE1O}Ca z+%cI5$Ry1NZ(Mu!23PWy6+9OFdijo0@Qhg!qxPfXBmJ?-?m-RYIw6ia|3sPOdBb|s zyqNN=E~Muv%MA3W_mE?1Si*I8{v@h`bt1!wOs(H;;lEfFs_s9im+PG%?J)s|6e1;6 zh3Qq75P{WDPZrUc^cXoE(0;JJ!KfAEUppu}?GiXdtXXMf;bSv%y@7(pQ&X`rSw=HF zJm&|8S*Ws38|T!RtkRITTAi-W#rsX_qvZh%2_45WfcsxEFD6%o+o7cHUhe>H^U5NK ze`BSaVfgNSIQ_&YS=?aCmWY5v{p_ZEw(j z_{$m?ZFKvg%7!5<0&dtX%5^F)cnLq)9aeucDbr8S1;32an?4YsvN42yG?tdww$caia8+3h9XvD}tx$W0@SNzVFN_8DgsK zcv(fcsF!i9`$d?4gWKfAp1b5T;O}~Lq@H^C-+d`!46C=qoNDQ}x_FNAd1i{=${Cgtxq>DN+%t~d*SRTT@y^fVuC9XrfXSHgl#n~?NQ6d(`*bsC{Xpsm zo*CT9`4-!4OSl9f_dcq>m(M)|mWo6PP{2$TR;PZ#?hp%LzkeTB9!JsxRan7&`m0u2 zHdB24G(B#LmRrRyuFhVMH|SnOl6XVc(j|972*Ejnw+>gKjt1Jt__3Y!XtFCNTjbct z<^DQxr!kw(^%n_SNAFA%r}z&8POD}in+u7u>y{rHCJ;XD@+GDoUsP~TmX6lY@bq>m zsp#hRBi>?LNJOm>DQ^2x({R?UVaN*I86tttx?cBDjCwl2f%5JO4)c0B+^C%uruiUA zKIFN6wgh)(SYoYqp!R(TY1PJL`IYsTI7u-5?p^vz9rfr5&B|Yw7@QuG{!brmo!U2W zU;UK5dE1o4&99kRrx-g#Cj|Pp!o(`#YH{%5r>p?-O{A-|mRQe-$dSg zMuT#dVY**r6=oY@O*8eRXfOi~RAOI-XDG!r+hYAY!7}f>xcNUCdec56*(4Ui zr$HFa4fqx{(w>z>O$1X|(^9r*JdZS^ znST+NqrgQP!#!RTtAF)+VlfYBQ{}JT6Wu9>5?o3It`d#GSAlDvyOP5(bi4ahVO_>Pf=xN>` ze$4v52sGHsm~?*?N1^Flh&`({~p^7u)s*)$zgv=6xsBjwa7de(NFG9Sbh> z>u*d^0W{vthh*AsRWbsVxQ~5BrhcFHY|JlmEf^xcxHg$k!8bKu6y@Xu=*W@}#cy+^ zb|K4=NEVmvJ{4=%!k1$GM7+_ceDQ46zi{q;VC`h^`#z8e#ZH`a^wCQN%50E$YnpI%DELH5z|<}BX_d8e5IXE z^u%7H!vi0_(P;800rQ$?uMNZ=YiLrsV>Q=wk8D0AGN!njVN_FeSz(&|)qS>RuZmeb zwHviNHc2UqE-_55n{nzsG_!jRI0@d1Pxmsje~tH?R-u}$Ly929gNaS~#oPSeNf(#X z7L4&u#=PUcw#B_KR4K4DDxto1aVP=Io;j{HEe5;4BVleRvPc;#ehyjG)NXyD!ms6E zxkcrq;{36PnNY(1hDx)&Yx&bJC*~ij{K7^r*G?EEha~$s27Pa&DQ%xye|YxKL}Mkz zstJ;^io{mV3x`rd(8Btk9e;ao<39F2OsQ~jU{OM4Ti{xe`n0(1<03afjjfa@a@W=Y z{hCQfIZoc#Q-!LL>m@SdOx*Lq%ba73@G`m{XC&zC`b?C9TwT^U=R*`l_#BCY@)tmc zv8lL13jzptm)y|18a56*#KtQxcq)Fls@PQj?I`-U(! z6@Ld;=r2N)t8Kus>P;0^w}b5Z2aBxzgi4?68GL5+sfQ^UPFbbMif@%aVaNCObk>w> zU+ZA2{`wwnWV71nH(Yo3EwV7t-kMzLb0Dj-Q@}*mrCgmKrY%0cKc=K0Tm<+;JfoX3 z#Q4fORY2a$dLg|N$l3nS$=XQEpMcHmk+p{91U>#X2^ZBVO6Y5?LHz#hu@b9zfY%3a zQ1~DeIQYSv-cVN4>0?c3V%gPgn6M}{_;+>A2?{R}8MERuY@45-M4*v4X(#;+mWC5< zrP-K{vPVe2;|NI#qbID7pAc2K&aGgm|GNl&Cf^Fs!zV8s{2Flmgh%*m5diNNVXtg| z6hy4cq{5VLH+HOTpO>MBCNUXIrqCOtx$-c<7wU*^cBo3qYhSl0Dx^d%^tU(DWWiC-Bq8{Udei!I%8NC;A>3ps_6z=~#g=Ce?TV5VhW`x_i6%V3= zR}?!G-Ev+sM5QnO*ej!Onq^z-b8GF0Sxczyd`e(*LT>EpZEIjF?Dm3WkF*>?%<~{) zAjfkCE~!2jL|Oe6{I}FE3qh@?T$@af=EzOHaOHa*={(+yKQ9ZgfHAb^Z9yQee|H-W zlEwAY>voaAvND#z`tGeEUKw)_XF4T{;&J$l|IhQ2#`@3RAsBX_AItHgMJ z_fSosAmQ5YSLyY*AL+V|p-~TwGSypB$u>Fd8t(Y>tYHUGg3F!{pOKB)oRV2Oi1WzPxKABN->ExxIKtOS=i0gCnJ||+~ zSz1@0aH%!>v!2a|#ABTkpD5sN5X2O5Xt;zdb-df|C3o=W>(cR+oAttu7!gtUzMeK* z(X)vQvCD&BHbA6hD>!PVyn|)@rsUPtA~QvbZlugoR*Ic|B-ILjU=HqpgYq_u&O`bo zb}rivubrD0$#Xu7L^-|2W} z*`9{O(5s^-QRR7OgHGa)y3&w-_EWhm11G$WJUODF$y&!}rsiHa}gG1 z(y3kEf98}!hrcNue;eE}5jZC)DbUa((sDS;(r;64T2}F{X?e;GdJayfeqvYC*Xwp7 z26d0duzFUj>zmchaQ`^=L(j32#l~wM3tCAGH$3@1la1a*;j?%MuBXk!QZFTMuF51?`3ECMZMplVbY=}?klOa_ix~Hn~{$(9g41j;)FP_eRg5Mpv_(gIm_pd zwNj>A#OJMrnAwKwlB!K6KASA4E~6k30#oTzBA~8c;b^C|B!Y=ObOh-t#M%#7n1`pV zU=q3WF}py$;bg`LlJ*Ynx)e@SMn5O%c@`%E{b~M*oAZecdvWzC!VZXW$wrvvi)T|W zf_-Lrn*8Dn5bN`jh%QW;SLb3QqzLt=z-Ks5i&A9A^i)y!Vk*%HHsQF%-_91vlN^9@q{^`HV%qxRZChl{|a(0Nk7wDbrF^x~t6 zUShvo5X73U26sNfjU*XCf1LEZyz3)pB0V#&p#Ct7#gjO;m-QwqOf=pF*wi){j@LFk z`BVsZ`+YoBKxYy*)gV#O&a?rXc#8)xKkw}8x|$bXC$+^bvf)0M{d$ViBEO!&U4404 zgejqOr5UVQyfG&iyocd4EDiI`GUW|YWD0%@`t}H|ZkpcEwWXGeKwmQ#8-wcUR|l$7 z_>ZhESVR-a>ruQ>cLpjbN@eCUc;sX>Kck3tM{MKcyq02&X zsO`l%pOrPwHF8X~!fN7t-dP5zCS&3ESymY&bph78n6hwRswp9jQmZ%wINm(A5oCYo zMiK{dFvybMZtPxTzJI)y$*k?*>S%DXVXJ;t&+r57M$aPGnWsQ42c@Ar55gH&CVD7? z)l{e8-|QfBju9T0%(9jGcDy#@IXApw_EaGAd(t)d6Bm^;6ijj32jb?h14zFng9yN1 zVX>JxZ`vLrDSNEZU|^+ zG=}XxCe|?VZRBRJg%L-T0(QhGw;`o8c^vV8_Xf82#5=*vb0mgiN^@fx^Xgh)YFj=7 zm6J2uz@DQu+r#_z3xBgxPhvFOf6(ZR}2@eiItt4H(7Bwsc7^J`wm*jxwOHV0ai2Q36Y){e)@>`X*9 z&g-IpTTWd67Vl-^e)te^E8^-Dd4p=jPf3kVD4~cZP1a`#Ay5o@>7Ws3`P>=~xh_id z7`XvD_U@D8g$?YkFURFKu%vk*cb1>jJ))xv;^SS=&kkhGqzlxH(!H`xy#!;#YVRk% zd7=P0(3BZ@G^Gk2ky~4cM4;f$0xBh^1Pa9*&)_bub?<5Jk->lWigzh}DKj?YI5nFHirTMJzT$JXt;`Esf1my6r;KaC$j zPwHjX1NEdi{!c`GAI~N~gwf95ibNi~+u~3c5L@iw3iS3?Nx@BUmmz=t(OI*9F*Sj* z?AL~JzjIl%MDDlmEWw)PtO|bA!cdI+9SNfJv51(7heEy9HI5EtBo+Tg;XvXQs7yO2qW;R5$!ovEC9} zQ$f3lgu}C512@bKmS3thXn|iHRDIz&wIUEvxz_#(Zb)lihu_T?er}ssymY6c> zPB(g>vdmG1o|06}c6>=A0}tx`r<8S|Va=h-E2R-GsaqSEEwWAA$s-)PYZmTLhbDBZKQP&%*uP7lwhD^@PKMSy zC>5fpUW90Z`BrGEm!e;?l17uL(v6ec0xhIj-akc3V296X+`_==TyCCMgLY7EKuZbI zW$S|h_vlsb*x8p{qqj?gVx&iOu-k#txsFs3qKE~(sat&Qx!@zv1mohFv=q(IcgQJ$GYU>_$jB^#=OKTm$aXHS7LF=#EQ7+jCE?tm4e4Ks&!2gm4AN*~o$)6NZrJ2&!`!lJl$A`I3W?*2kbq=|!d zbliB;72Bn`QNQp;t!?2raeUyrs?r_}iOMW~u%AJd4-9a-yxZ4p`pV=Tj{wELl#J8MbwiKL?gImxqeL(bA2)oNIH`BTeDnxJRj@zENH6K=x(cL zn-mJXaKCbtJUkr+mlrt%R{hymd#Niya~5x2xIV}0Aa>z}QDr{Dfxn{_Csnr`tiBQ} zFv`2htnnk#ky;mF?9bzy5m3{?c(RHrjA%YtHHgrugVhvvRyU&18m4uQPkH-e$r|R} z;BtNhw!@!4gv{E35Mm3gFBX4yShHj2hu7gx%x)yjyV+lvf?*z#d)GKI`$}V@ z+W#i(R14v#2&lV6&>o%E(hMIWmk<@e!?k(nmg13Ugn6FTtZY?5r^=F_BvseyFVKjv zkd$AoD_yTm&$xyO6NlVf-qk{Pkg! ztLSRstw3lv#fmkSozj)7+^Nm8Wh+s08XvzcVM0fsUL)#i25-UEvsmD*`B6+%wzLc+;FBK3q_cx zliFTRsHUt~{Q{QYK|iI+ZO=2pCC2zN;!YXPp;Y=Kbr*VC7Cyz`3{?ht3^qK{E`+kz zTNlhT((Ii^{a-ZaC5=O+>I=bVnPYlJGD&2J_-C-kk=W-7^Zq35b=A#Bjy<+%x;x?}K{86?5RRbH^bdc~NJJ;ODaTuqgSX!P2+) z?3CAcdWjp$SI2sC#+!kh*YdN#azt*UkGp!j2F@;nYcwCSAwFaq&a-qm&JNWTZHA|& z%KmUk*LepmcwHID#|j32!VG;)genqts>xMZES~M#D;UK87kXnraB z6ymWu=z4TRdtH9SprzsR4Ed)kBRpL!xP-02?Rg9QOobsgG9#CAh(Q&6oORr%(KhYH z2z|D{-p1*z^7KNIv+n#)mi?U4B)c7co=>aW4~}g_>^{c9m1*b(Mwq#>DPQ$FQ}P6Q6l8J+-+asQ3w zxJy;dJwYvDYaWF`rbp$pVMgiKrGKPv(<$VOUxy$G(Fr_^lIZ1Ti=BLNFhCS&p4kIW zId~F$hE{oCcj0GBs)Y70pBf)S5nw~AH6X@*Bj*9>h5ei^f#g&V8H-1@zjoIJ)^uulU~#GuQIde z{3xGsq~cmp%4{J@e?#_!BLY%l_!#~cdlpN1HWh0cYNZ$r_^U0687Ak_I`AVC(OwBo zJgM0lQLCbk7Qf2OBV)N+U+Nc{qJbcD4bbr`-OuCJvE_feZ>ezu5y>^7@S;f}Bde>Z zsp?Qr7zWQjg*22n0BVa`RQ1_UmS@9la2RmZb5Uzrj)WpHBmKa7f!88#E;ak z>czXz-GMCBG^qbewVF{=Fp2}X81XGFjP$Zss}+kjoI8|fK>e}_w@u!w*E^#AhuE`X z0#3K9ETxhO&SOJ+d;OebPEz~Vus3maxu)C`)%I+>R?1pDLMhSC81OKw>-1aK71M9w zemCM4sh`W4fkz#Q$R||&<>#S4hwu3B28?=2dYt2sx?s5OSgRR57A>l{4XmJo2TbpY zux}JfsRVRdmr8(N_%?ynj~^GhKIg`7_l=GYBJsPPU116>(3<++J++&j&o-pb602Rv6e%Uh>59{d@Un88}g ze~ovGlvbCq6X8Bgwu=SbUutN2IhilUO$vKu3jYUfQ72Yh4%Vq0 z1`fSu{`OxMgPg0yow$a5g&Uy?Ga`B4f#^(~rMC^u?~N&lLt^7PSvHawN! z-$0x3cboH1hpvs8J{G6jhdSHkJr!SitGsdyAdtp?QQ+LGu~1Z%edPkeNj(3*#Czy5d z{z2Njv5XwYkzjVC!FNP7Ai=oo3-fE;K0BTL_GznSVJsheG>%z+IpjjM4)>dQpjKtS z5%=zot8(CF=n7~|mS%*qyFn>;D*!{Zm(O?gc$a>^OE8BjjI$fL+O&gbx1CUgI(~gm6L_U%I`JIf5N`< z@Z60rL+V*|0&OH=P(ChP8(%E6n3ux)Ftc8iQ!xasthI9oWtDS?-Xo2nmNo}vmP;d8 z_stHlE&Mq7pNPH+ZL>(-gQ7sW@nsnw*AEl$%0GKnYs*EoKiEjb+{btvBtCI2d~H7% zVmEcwjbl9(E25RSK{lHaWoKTxcP7A^5+^C$7h2PdypZ%IbP$=$Oq~C?u(v3~;0M`J z+?*(8CjtJ0F=P`0UCgP(Zy~UN+&Q(ijGiL_v+}i#cnfsdI0=5TSfvl1d9QPdMcIC` zSazr1YU+$?;GQLzdhuXkDR_ythpsf69M6={6PB@x{6xD|8C4jo-oKb&LzBTe7{EI9 zD`1%hc>1`gJ=mx`fhTDtvXMgtJ!Le-fh!s~?tbj2gY%c6vQcrpH`VVoJ%^4C!Fr0G zPQ=jS%qyKqx)CzOF0ZwSdGTTk3F0g{rpgn8TzW0}=O}mH8N96560pSU0)}7ycapGK z!`ON1?;CVJnWdey+E*r=-sE%k+Se!wYhZ`_|F6cB5u_G1U0{qHIYye`^bt;j?IwVT zYKx9v_v(evc50X-i8q!@#ns3PcnLAAv`0Jdi#g z99pbWDz@e29K_9L-i$Eq(vP0nD0Kh35ngcYp=X2MStv=GSCjDQ^@PsIaAfhu9;`~m zwp1^A<$yTkJn+T{cpf?z5Lg@&)-LdVENP3Vc2aA*#znT7RI3y+c^Ovtv7xn0hV|_< z4|^ybw`(=)9^FZe9vnojpNG3R(bD^}Y*Y8( zHiE3y9vQ7g0^dlZh;i4dEA*O?9kP#-rnxcjSS=gM->ec0P@lzcM~Gtio?prmGz+`5 zo{drD>SEm&f6Oun*%(F3dkrSJ`XjqqArO|o?DWN;NLgG*90hE zRk?1H$LBU(p3}4EDzX-uyftLucNr2??-AQ)=1FCfCQRhp;(ryPYxIodp4^57imbjj zzUj#jECNW#EBw0;LKhw0+*eY~b;^P~8j%_w(G}_e$??1ry(^P|2IWOtQK^6(M+3g? zf>EJ4k{=H&=I*Aac@~?<*bwKGsI7(i7Fz|_?dx{PUfj-Ilozr;C~ojXY4O z0l)X0wKtinmVjJOIwyToqjwiH?s0W&#Z`(&%G0MKKISJa0nu_=6DrCsO&&5Pk;0r5 zLbDZnQFsPe$A5;Q2);Xc>h_<+c{DQ&wCe6T0H3lve^t+>C4BGQRT_6aiRJUqdx|it z)95Fy_q(jJqnmwx?q@;Xo0CNIB>_Ktn9hF4qcjj55te_6Wo9>K?YeKm01L{He^;T7yN2sL$%TMYQky`H+lN`bAm^MJTa@E@P4W^1BEp79A+&+B_&dOFA&Kcv13$*kxYguNM!KClwQ zdzzWSZG-k8Q=wX|$$B?THf=zL-DF#BVlw(M#Y~=agEDs?P~MpKX~HH=!E!FE(sv$~ zVwWK{K7N-}4+px(4uNh>nslqvf;>~2bsxUp!CZiN_oK4k*J!dRv;?DQ+Pj!MzYPZi%Qw~M7=FTw#ji>Zo3Y1&1tORaTmv}X1Ctt=?c(ub=7f# zrm=y!^s|m%W9Y&Rv%Ge5!IV;_Fl{pMoa^#4`%mLhc}49I#|5{gJz2tXpk~0G2xvg3 zK{PnmsojL@<$H=lr3Y^at(!3%!p$b@aVBq9iR6bZD{Nn-t&|j=g z{e|iZ%X&u6wC+UoFh&l%A$5aTTev~d`0PS?V;}TZf1QV5bL;A^)h{1oZ)+Lt0Dp;= zw0|~^W%{TRVf{^et5s6x5#5vNT=hvSE8b_ym8Vz+X84Edof%F9AqNFF#sBM$5mw`t zNZaEt6bsg^)epavE#gqyLkp3D@Oz>9yF9X4f3_1(gXK2YjJY{(-4pnNeWHj&B;hXL z7S^%}*Ot5q@0i6e7^L*2Y$NZz^J3-^!t9qn(~p|H9-hJUc?xKZ)$erxFB}Kdx$p`u z-V)=% zzODDhbtf2tW9zSy=tPXqZ?tT$t1p6v7QxT83&1Zvf(H^$pz~`3kq0scXT@~KHYfY< zu6oYuzaduLf@cN(YrkP8u~@tKd1Y@gnjhs3*qsb$4qPtPR}PWYU;8Rgr3__+lER4Q z{pg-h;3A~{8NZQ2STL5UlRCrnN_o@Mjje=dyz>vOgXyqScBaN^?z4fLbulr`h+@=O zMz$-Dl#D(Fwm;|vmTz411qcpruoWWpx!^ON)zVk@&=9{x_zbib{myTqxRc+rVpDKS z^HNwExNUztXdqpnJx5OQc}(r%zC}W@Q{m0}#t5UC?PD{0!pGbZ>u#@Umm#bAb3EV> zo6jvwN@NOU3#jy=!oE7G2BM%Pl0<+!Ak$zZK(f)+aULMBh8ZJgD2J@RkHVP9$Kdm~vB z^QY8)AIPl#@(1YX(977?y|9m{`fRuM+zvvKvPyEoBF@23?-UhDshareZUzg*k>5kMsG&|y^j31=r%iCOkX=O&-3%wr8gBCjj zC;ou-6Uf-JJIt#k%WealmXp{V;U#)hOU5FCa5gi6QH_4tczON%oBIBm%@n3%2;KyW zUTHQRp84J^m}|0WEUqd#Ogsr+57_TSyCHBO<*8wO~ zqtT3io^Pt>%Tmj?bt+iXp$J^jlS|qI{oB1dXQ&89n8ot>`QEF!&+|O0B(jz~_cT6m zUPiHVU$y>F55vjCxPyyy>PXKSik0Ce1hdRuaS-yXO;?-BBW*dX0-ENgDy78}}- z`F?%e2yYmIY>1r@7|Ar#f9Utg9MUMe=lE=;(dngC^cRgk7hc~29%{S2qFiXj&T>Pw zKK7A&L+-s|lYH>M3sRK3wGPa?B|ya70pN1_t)mTRp4f2b=v(IK2Ymj9=zA9d-&Gvf@exrp7u5yozABB7` z=<8xaRi~f~)k+Cq`tjNp#k5o<{x>knyvtD58U z+*EjWw@aRs0{G(qN**NHShmCiaGneim^-iepoZADZ7|%8n;ZZN1$Jt^FLnDiMB1$0*ZEf_O)A?6boM*)1n+US6iU(j(l8 z?x_vn9zXIiQ9?!Yue%BE$IZmFI$96-P<)Iz18iLCNMgZiX~t7TzP&Tr9$lBU+DN~? z8L)RR8I5NfISfVWUkIhD!YT;U0ERqY|2KvY=*qg9Y4Y1EcipJ`@}OFQyO8htrs;mq z1?7dy$kdw&zd16WQE&CC;Z;nSHgV-*_8RdWBRo*^}q2ulcX@Ji5(;{E5igozh_-SHU zb1d$n-|+sdOR;9KWX=sYI2jNaOA)1{2UUJ)_({{;R5=2aheQc`{yD)$Wul8eA-%~j z3NnNEOQdLXzqr~?+1G#qauy#YZR4LR0#z^-QN;X*8ywXG>i$X9ZF$NLc%Mo8`WL;0 zibYeZEuUqsYlw%i_ly&%l`-Jnq+Y+Y?k&^Il-jXKRtQC`C$a`>vNmCuk6t+XD{13S zHPOH7LP*>A#vpV>Wd{3RHuN4q!+&JP*2MxI`qEhs{j_^A>GL(_1bm=4*Ii`I*rVjK z2_uCuC&5$NhjzvneLZeSd zSidp1{s5!K4L%3w#j>M6HRuQJ*Y(GDz1&;zQY*iW8Xw9|c;idAtH!o845gsF9DXJg z&O~pKufnyrrxkW;4n=L*1;R_F_KOCgb^iBIt$`d}Y-@7A)sK}d8GCyC?myjFO#^(F zv_vn|GTxF!X#Z*n1)h}Uu%BA8uLsPC65T&Z#{e|0AaA{M?}qeybo6!rOMq)t*@YWu zIz)fa+A#6yrF4wK5dN%fBP7J^CFT1Yva4Xc9xXTzm#vXLCT3R>aBlw4iA@A3c>IO^ zpPrpTSr4KiN?HW{gqLm&O$LT%`*@?8#e-e%E=Tt`H)1y)AP$y*=0VvBTkY4OSfwK@ zBFkDU+#MlmHH+-U^#Og66US=*4G;=mk=}TJA)Eo=3AYi%bMM); zS&P-A3M9QRXL@b1#a#}f-S`0xBTV~*!K$IqH`^eOApU>~qL*PkG zYl43YJF~5N$f%RlhbYgEHRpc3`51+4GTrXYWL}IQ2qXU`dJ}G)$hy~}yLhA|et@;9&Wr2Xo&I-&)~higrgF!qnAbtUGriMU)4_Y`<8%LTe?#O!jrUW|4KWSF z^%ihs>|TK)T|T&t{vO_B{J*(iLh|i{Aa+QEjelIxp~8MT5wgxKT8MmS5{_6*=hq8q zea8OqYFtd`BYF6=W=nZKesHBFAo&GJO0ex~+LH>cn`?U1)v)eT5s>AnfHoSDc|y`F=g6{Gb>2-irN3 zr9|S3hVoECC~}X{K?ffjX}BEqBEghfz4Yi!ABT1{MMc5)b>Iz?`b^sjKBfwo9P~$g z>aNX^y-mlG{(im0Az_;v zqA20|q3)Ftdgc8p&OD2AJ=OUnf!`?#nY+!-TY2Muaix+pt$s^q+-&gFpW@!+cwtzB z8yomb$X=HbnR`MU4SzxG*RPyXq>u2V-Rl{bH=&fXx2Q;rhy%s$*{(6nx*Ti0wWC9Y zR44?$sIA8CzZ2Om{x>R~=M-YPZ29N>!s^6b*oTpD=43z&7wcKyfVs zIzqx@vRAV?j#H;dLs4#H#EdeoNNtYNiECifyrk}E&vDj=(xfCd$@TBscf|K7vf%gP4E#eyH6Y}~C2=8UTQN^CfS~%^xojp$+zI*^!Lc9IUQ@`2j zW982exTX(BKz@^Y(`H zw(5n>1mDrZw5(L7Xh*#&`6Gc*Jf5eBj>2}-U*@LQ>MLo=Zpks)`mRlUs_0Lm6DlIs z$(bk6fgV`>`9N;_$#u`*!mF{rAL>x)3&C82-!tONZb zW#HTIIi#mOZGVm!vU32u`9U7J<;j8~)x{C(udTQ#$NqljC(*h{;|@l~4?jO-Z_okW zi`DpH^S3ftQv=#-@Pc1&^;&aoKdnM*vYu@qgkK zIOXEXwen)C4R#*$#xD}K%5cs<4gN0d8dt7MtofO~alk)DxOx1nY3q982UOe;v=>Bl zYso>>6ZyLwHt!jZ2H;+?gmOY21mw=#oTMlu{zM5J`$TJuyg5O98?obqqQ%im25R=N zmFIgDnO75Sd(Reoq}m4vV?Cr<#LpQ`&Y1GS6w|zq24!m2jVn6Nq5{N) ztGa5ZLd`*vYmflfdd_~wD|AV_@F}$yLIlNvt6mw!vKsRu)ql0W>Gx&jLR|bw?jsPr z@Z@y**G)j;?(_MINYinW>+SdYk}yxNhLNJli8#Yk%LGSMW0Q_1ZFF%QuU(WXzc}*# zi=_7EmlhKmWjI679_V}eCphGsEF-*^mPQx!IO1#UJgdE+t?)Un>er1l7%m&U)T7f` zm8j1ztgw?vZYo!YjD>yvl8Zq=*;?~pDdo^R0Jt*m~$vNKZC z(e8WLnoo<&77?<_-SqU^<*A)J&6;nOEmpDq#3c6e0G_Buuawj(gIZV@F?#P2OBOx#qV_5&%N5Y zbAS5id5u7c_bkn8{+nRGT08)#c?oP$8;Kj9tWBB!M%S4}L-~jQ|63}p6rr+AwiHPv z`!bcJh{?X2N)cknzRXOe5<&=Br^uEqB>M~@yUD&A%P?b|F^1Xa{?9r8^E?0Zd+>jB zKf52?%XO~L^?qOPSH$pdG5F@VZJtUOC6hd*iZMr>YIx6mQ%iXQG&Y}ddJ%X`9!0N8 zci^;EIc2F#dr5NhDYpkL?J`+iT5Un8&&P10DvKkBAVi~I3Q}SDuWg^Q-I~+epJm7X z0eH(1sYnT4l;-5_QBE@L91$m!h{X%~d_@gYu}TeZ*LbZ*{|pX}V( zdu4l0z*ZZ$N!x4Vdh5yUIaDBDF|MFo*dJYf-l+3s9a>~6>kyG>?6GEl^F_hohNFnX z5wB52zn!~*FTq8@YN8u=f&l*sE@(p}KwLW|%5ON#himsV^-lUt=PbG~C>CF=vu|DD2hligF28O^0) zL65fs$v|qNCkLE#B1(l)s^s_CQArI^W9}Xb@-b%;C$(@b7*2V&|L5I&*n@S|c95V? zF3$AiIJTzcq#DO-;p0Tw!RT#AgPoJ(f?GyV!tjY`j6kJ8oQF!W|Gla&-18@P7EmtA zG9V%QV@UPt#3W9QkhdIf6t^R|5!E^|J*yCbN8e}V@t1}PMBwW`;Evr8%6>KLbu^S7 zn}`QH3}L1{Y9Zacy|1u57DvZ!tVD8g2nKfhN+ve|He-RKne=zn?Vy$6H$ot-(Z9l^ zrb~hXj5-N~XOMnAz3oNzo4`Efl+fRhiu3UhqU`Rh%_Hp%gQ@NjEv!C?@0@iUk zo%P*1?5)}E9Z$;V&LQ5Eyx+;5oOTTRwYKi0e8^NiCL{1ns8Pt-U>g&9+NBD7@XlS) z4G1};vN~wqhCCLV)~?#jDjG%A;jPOg(Rhdwkt%)pQPOy}odc!Lr*Vjm@g{7yJx=}y zI*2|GvnbVE2Oh-N`F|8HT1ADmVLZYNsVS;5@^isgXs4VOeCqxK9GGgT#;I(sSDE4; zBwpn*ZwoffapMy=TyfhdU)PvjQR#LijNlR1q7?`_<*qMfEcursN3S;4CkpmPy%PLb zk)C!HfB#skd)?B};$7St^tHcQ!?U{>sJ; zwRoURjbQsARF1L@TgjN$}nikXcx2KJ>9@cWM@b5t7^$6J-%j`?C zf7}pBDKgxP*E01VsWEdgmu~~1@Zi^NinLmU<@o%W@$^oKtf+F(#Htd>eZlZA@LiON zD);Jc%L?m9_libK{mxIA5Ny1~Pj8Rz9bHoa`*NEcW#7_WS8s)|OZ2l;Zt$Up_jF#B z%M{44ZFjxq8{ZBR5!HRCn{(?|9!m(?-97?Lxkn>^eV6axYR(2#;hJ$mxFC!f$H+jC zjtQ<^ZCjd6=GeQ7682JkY$K9V#18xQiHq>XQzH)S9nrkyPdV zvIj?H=03ay4Y4G}8jDr(RGO=cw6=}NmNj%Qs{h8+p3KPTNW*<8pH8`u0%_hMCCB+a za4$On`|J&J#54OHfU!(#f^)>k&!7~=WuUaPfSH=38$5jwrPdRzB>$xas2C zADKPEXusSBfu0pWfTOrQKW+nj!K`b%Arex#g- zxvG*vRi%SrN~^$+LVq~{^^65jzvQJNF+_?%KetTTY{uGCoM5^MiJSYKab;K4?U7q| z?fQwv&e7mLd3|ULPCm|EdEmcDJ@(p|KHN=@Y4{5-oR`kT<&g&3o5>ki zuLY#8ChgBf>ojz5I(r^v;v)nU+DGyC;FN4+a~c~Vv2R?@ zTb_T1*%B-tVBaD~=xld|C{n-$GH$sj*f@E7>|5G7;Cmp`xJmRrDp=3jZ@@o%D3ML- z%OE>H_Ky}0JJcKD$anpI)(==SAEdBSzh9ZCnN3#bwM-m|ciiVL$ibTWl0|CAfFt5eV2Qv@mA+!e~jZHau zjSWY`qCDGHhnp_Sa=IxqUtRM3LV5U-#wVD*#u4FlkNDzI97gZVxUIKM)>gGvLpT&h z|9ZmvU!Zr%(Taz7K@#WX^?Y4i_}?QSxxHH?;NLe8B6Sj< z{Djj25;6Ekdlys)z2_^(`1aCzx%uq)pKer+J9r{J2V#?s+&K@|>rbuk0(~wPOwdnY zf_jxebwx7lghrY^=N6@_!EHnPhd8fU%)40v~zJ1HO7GPBAGEf3*C zxV|_whA}$Dg#PkU_IuSh@k)h;eQS1Y?Lfnai`46XmoKWZn=`}C)#^5w>RnaluvZQm zBae8&FAT_*MI<*3?Rrs*eH_!7A0`j3W`djrr6@gc_Q<-MC!wO_?N_e|7yjAx&v)k2 zP<{+A!lk`=X%6ZJZj#EkB@Tky{KiunQ@~pi^(;q*)AE4v()b14XE?nO)49nHCtVCt zRfjno;<<_H1MlW*&;mD6`r2FUcj}RYl2@F%wWI@oxFU1GB&#Yg1}%itb-D2lmA{Y{ zyCTN+z^ux1J3PVo*sp-eeiLs^>#;DuFs7ZjFjp6F~kiAQh%m zz2$QXdA3>S`j$u*c*zW-yz>K;4@3&T6qYKm0?!%LcFd^5EP& z%z>UP==~*~Yugz{&O*KyLcIXr1r^P^QSDzmJT&Vz(B{VgzVi;5X>T{iwG98M!M(3L ztf+8}7BI7YI)h7W?j0!Vs~#RacRUxE6J|bIH>tG%{|-hepLOf?_wKvQuABSD-_*NmPyVT2JxVPsQT+*3 z2~I&g`%92-2OUekkJO+AUEO>3L5#V?Hi*V9^`|z)&QV1JF&EamB<2kP1(d2Wy;HG; zAr$s3P2ZwfMiaR(vgYy<1fc?Me_r=B60Fv8f`$}^H-j8D^6j~jq4ZJf55i9h6jy;= zq(T)}D*T>qzVp5Qz=827+=R9exEj^)q;N@R?XkX1p-X8eh#8rZKR2rw%FjxcX>{H^W4o|g);!|xfXEI~ zECXIe;$eD(&TOTh60_#91fojc_eEsiDeM82&_3;m5a{U4+QxQi+ffE6V}n@%@B+%B&IQxAE60QU{d zPnyIhaR+0_Zz|4gr*kWz$H}F(Hcar17&&zM?s0G;?Bwo1KD;gOuj8 z=NC26FJx<&$qxuEsynhzvpu|SFEmEYedU%vv0x5Kh8(P@QkN$<$%UA5aYy%KUM1?GGG+~R#c z#bjPURAZI{+dlYMV5e5~&dlx=@|;TTGdNgLp!|4dXH&o*(3#y%V@~z%)*%wS^Yq3o z!4nepvO%#tsZ@x6fyUonHhn3rSm$ttsh)2#X`V@ax7`?(W8$=QL$6gg;)lshqT;&^ zSN9A2&OeZ*IGcqyN6Y4!K?ypXRG zCWLt{%EP(MVj$#f(Rc75`lU-jYN<+S^GhPEZ$WmMBc9oi2i8r0&up>iCt^pC`|0!{ z8z$-QYe;reLRV*@PDLs(ZHhVPZ!5Ca)U(x+!xM2x@U zLEWym*7$>Y>Q9UaBeo@&N#E!?86Zw`cF~stO7_ab=u+OJoob2=s$_Y%nn`snco*Ai zFs%f6GSq`qhd65BaA_C((<{8q>+YsJDz)mMc1$}>4n2sK%BwJKu$uq$R&Q|C8<1u` zsNT8Bq}tp&7+*GNxL1+7@;igOZEmsA5&NGO>A`q;611-&Fv$t#DMt2wu1mE|X>9E* zJ6?cBRNi9y-7^YiDr$sQ<#mtnvNQMs4KS2JTP|6A%zt7jkwWU+djc{xGFNDP{=F&K zYw`p&3bfe9hawjUT({O619l6IIf4NgiTQU;{`p%DsLFkk2yPs)#OCq=qZ<{kp=x8V zV>6oD%~(&9x2O3IS@5466W6tD_%Ou~E)h+#6+pMt$Cn)Xq`^R>XjdOmDKd~UfG7P% z%CFb>2?act7kCwABy}q)3w~}LIb*V;*yGvND{Idk41oR5L1@oncoD)HQ~PYj=aIPTmWqR6&;pfb8PpY@|!*b?zTC2{|n48CY|%-G%}^yEuUJ-lu=V z(u(I1Z~PV+^RGMB{aC&r&=a?TvC44ZSYwR+;Ei70+SP6XpW#Ke1HD>CN7DSSU_T5^ zqg7~@VtSprStnLv#^X>J)9w6HI0NDEkSHX-`1Yf$Zi-4OVh-CGtpffd=E~? z^=!5(^akgdl#^a#=$R+C|b`{gL)cQ(t{2P zBShjhPq#%V-*1Wy{DjhN7llw&MaEl&w}wU+6O?SvK-W{+L1kBxaRb^9$l1cU)OBqs zZMy%91Du6q?i-{|#z7XKE)1u-h`LGEo+&Co&XAA61MeJMi!pdP3~a&;L#$ESS)GY5 z6m*|X+EBDM7hoYM)8UC)*QrF1ibQaZ)xv)@OoBG7NU7ZMHGPRyf07Yivf4B*=f`Br zyDsdm3>4sQJz-+M%;Iv#Gepd099|=0-dhJ|4lzkQsi@Z4n;ANy_kNBsA{QW5ujE@E zIFL;rZJPcEKb_uFf76|9FE;jsVx&)mov66U`1+F z93ZWx9m{sksP^N)8eaOC)zoQc$-B%~$eX0BVY21vCgFSg2PD@d|1v%4xBqSy$YIt; z3L%y1fA$j!Juhv)cJVq4hnZDe0MqM^`Q5I*?#Uj9F*7pmFXcsM0O<|AP^A|u28B}J zOm76z!Qr`l*?zp@09@tGMcX_&U%XZ*{c@+D3nssj$XKV5`1`%J;ku=}1ZG|8TkGazK9f->L z=s&-a%R%|!9yBkz%MpHkDKpDWAZDJ4xUQVz0MtXsM+eHA5!bPES%4d${LtWUdZW&6 zEe=*W(6;soG-C)a&1sM(l%tD!^)s9V^u0En<+%{#yeZdXQI5hUWwtaHPM_CJZd8t; zRlV2Ob11&@WIQ_o^$!#uVyt(YDLPScyKHGq1zoZWl47dt!ZZ?&A=HDcWHAke2Ux(( zSG;&cbMfsGA8LTFUyZ>0&+zPjd?|%?>sk=`CW7#3Uv zlBF%6i=WR8u$luU;kP1>`7z14L>#GkdFJC83X)kHYP^j~*D6QBo*xSkETagG+YTHQ zm_%gl0x}<&KR-8WiItecDSCXrlTZ&BA9pSWnYNhe6N>`4@mk>bfdS~t+eR-1DekI- z$AEiTYYsY22kL(bo=UAP3&nKkB%!j=$qj`mncYTdK*>`eE;*}YaU<&pW~N+%JvRuU zV_K;xLlovoq&=b7a&FLJQ4rqhxLqBT>_RRILOE@9KO2^rn9m3oNJzXcADEq2KyKb3&ulf? z5J}v>i%2)nYlY08?in-S-F?(3!_+~Ioj&P+tICT5!$+jb+rf6LMB5^MspO`TN^G+3 z(^V2ZB^=c{Ud?@_^tbROO(NPE{0sHpT$=w+}0x^jEhB{|CmM}c=XZ*Q-td*iPP zqpx=;s6VhcQ{ooUmyZ7=q^zGxm zNIU?`Osk|PyN_Q0nx;^?jj;nwSsz}|apwKYE0Fp)Lx=-~zp2xisbQTdVU96>5ZB5X>E1rwVcc9JHr zv5Zg(zd0+7wwM=uW~>W;(=3%63%$>=1xv^j0w2nH5hrq?&NY9)1G@SLBtOS>KwCT% z0%HoT$;Tu`{J5i#uv~uj_NNcxo~LzxHaM08Q@^OPAgj)Av z|CyP;XwRLjuoto?nsARKLhYlT&9_`K?ZT*zb@zk6U_P>bS-l3beNLhe{f%;M1+n&$ zc%I#T0y=7E;r)Vr$QyCKZ)wWnf7rXy3SI7t3inrW{kSFDvicJSgoXlnx`9U@OK|!Q zW_lGfQ79;Q9p*-OzQD?B%26J>1r&j~_K7-l!XR#$UUAltEV;B(k7SmMV69h-Vz`F_ zryd4a8*XQn$moPr3F1)z=x2J{)9e+`-TMQ1@Sux6twudvcTtYduhd z46K~Mck>CpvMo4JKt?YpJ=l9aQWo4^4Y3XH-i9^C6eA->Ga^=3AM>n!$Y@RX9|E~R z)e{{wGwt?4?p49^j)+3iS_?LAo4{S0J|+1!p>~7=o3ImR({^4xtpxoDSOY~)m7gSO zX(l%98EbR-MfGxqo~N|n!bbeq4p)#S>?%&8{`p2qk5sIq1kOUmsOdf`Q{9)uw3j#9-#+^DKWSq`o zc#&6lY~bMS{lt<8?opSkeu^~gj4Ijs$S%2GQ{))R|5yHL?p3&x$2Q2zfV*_^Rs62^ zMSZbV=WS`P1!Hb)Y-nl0YQ?Hf7t%;yx956P{igkZrD2^DVCsIbN%M(blLzJk@jrpx z!U4;{1Dr^Hrm-dKcl)x6ev9oME`j^lDrSD^gsWo`vO_tM0yfu8Hq3b%@d_EY{j{zF z>aWbj!r#muC(*FEnjI6hB``>_9#x(I;$47`6(35sO}u`a#ZFUuW>jm zs6LX5oVJV#gRbB7b(rlPiBc^%h8Ut!V&{>d zRJxwjQ~*7{lfb|2(vKGV7tT(KGV97aOG{Qk=dVS<=hJIUzAq*?r1C)avQ&& z8eLL)9jxcQ3Tt`>aS0iJl%A$0ne%P0s&^xDeFUQ`xy)3t@gX>|O!MP|)P<#<`nZz4 z>fdATMqVI`r@)nWq~6?V8g&FNh8$|{)u0v+ILAm4Ui``eURYgal+Y@OFb?G(*j*%s z^9(_G&30e&8^i5hV9zuO5EG2OqleF4K+_uh$S|LT?`zPo5HKabO@Bm0bl@hxYOe5Z zvc5HOl`U8Wc6Dxt=P58^u;T@D^K-D;cm~Gh$oyo~QEo_cbO>DTBNO`U@sANMDf2(BX6gq4MwT9Zsm+A~ z5nQ8tUVMmqMam%rPOb}o^j0F`UtH_;}W%+IkNIPq=#p~jvJDENdd1T=pW^!(-b8K%)!9d)03?VZIVY5Jwo zZm%P)fnzdr7x{$-Q9%uV;2{(xKW@L-sd+!lNpe)UB=ZQUpt~Psw|IYUT;6yC*|w)f zju9U|D5VPigPOkT`LnC>7r2D%rF{8z)Ut~J1TDPmXJQ=t0~42+9|PqAyI#Nt3c6=#_3y*`Nv_RC!h7-#?a*qGEo zl3wT`U5h&gE6~aHzToGa)bQDkW2n!pTjacJbZn+>k-?WjFhBCCY0?gcc)Y^nxV->| z_KEr9R&`%w#&}HlX6gyLs$wb|*l{4GOc{|rcGT!Ela5C@Ac9AzOVmg;Xv-);+X_x4* z%UK3ooqmxf(2xn)%z^L>A1-^vk6UFMyYsDqzDPs*<`-pV=8{^MV5~RT^)tUs-8gal zC}E_Tge*{m!fH!Y+(rgZ3?)=Q5oNWj9YT=>oyg_T z*R&)XYe^0XEFAUCwRm+OhQpAh_aj&>DYwqfnABh%ao2IF3~v#szHZ~}BM>e#$BDDM z^l&Ry>RT=%xAeZz!HB8&zd?TSKy-1UwtQH{{m%!2k9j4qk0CG z^v^4^Gf*_-_Ii*#USnmm`roc-pzzMC&o+76(U78oD>RxG1^vd!_g1$PJ51_AC6GCF zzYKHD1B^!K8+A2yMqFMjIA<5nZIS-Sg0&=>c zXJXg-;_5VpPg4sgC5w@#T@--Jpva1@3^1cvx$tnrj|W9>KtUgb*k#+B3S=#` zLjD$bcdSP;ln)nxJZl}%>rwZjK+|+K8E^VtPdohbxSU!jf>uGQLuSPHM999Q! z1TW~_1@;(`P19Z~T=R4ny1o0R(6+7rkwWyBfvo2{Gu`;cxY%xRbDWI6k|8}GK=^}>T5+munfe%oY1F*@I$5xmBMsj6j)n~5HqJbX^=mkdt1Mz z)6j=Y{?DB}RJh)utrT1RMJEd*3cM598p%_SU)Gz{I_4a=r@~czAM?g_BQ~(4gK%RK zk`>~6*?f%y2Ja({UzFrte|ajf4&wC++-FXG*Vm35*6n>ecLxq(tA#p}m&U0bcDwr& zP_Ro;;IJ)spOUcmY_A;`Kh&ynPbl}F#=I=bhCCJfzO6P@qoq(~MT+^I_@1it>*XUo z*|vP%L+H8}k<7&Zv30<<;eJ3*2BNNqvx7AH-WLA2i*%h+4XL7s7s|bMJiUI}cbq6+ z8f76D2z(j6NAF+Tia=Xm*S-B}fqz@?{kRAX6Sg1FOLkUX6B*E^uiJ^OEs5Np0YkXw z?3{J1Y`C1;>TF z-pc!z%qmTB;(C2tJwgiVZ(-%Ae+)IQ*X980$oEhjU8%|VrS8uCLu>T1k)CH<2S34( z@0*v1gDRL*3d#yoHPQ>I2KwPWtKpKG2RSYAG_tI%$zU)w=OCA6au+GWd_Y$7Z0w#% zs~!Y@@wQlA0ZOYD!>6_W0XAMYBD@A}w)$T*NG0pYZlnG+o1`b-s8nHoHi`X!`(4?0 zOhQ*u!c9u97Lc4eRnZUMuJr!(MW3}WFu#@yzisqYYt*R&N;4u8VCkS_mNDKde?h=m> zh4tl!%sl32Zmlrh>k;$&qt=t77&ZI=>Byye;!NK)j&@Hml-uv z1UPGdHz15A(USZzTvN++QrJ`1kkl!$_IkB)!EY6fpSa-UUFnEu|HwP~MUuyau^RP+ zpZbDL6R2^~7GbL^NsR!;?*RBXyoF;PYJpFi`lRb?bBgmmgB3Kl{;hI;T3Khi81(CP z7{0`mc!%`j0_p+$G6C2giw^Ud^&{%T>U=@g`l1BKBaMfoYTMjfuM!m2B{Og>#Ozn}xCf2E}q_7A>h<{7*)V6aLFOla3V)iD|$dN?q`4v_3yu-fq^<9viF zQ%J*>Y{V!`hX(sG!@e}^0UB`JS(-0xpPDDt{g>#TseW1*unCq2p5wc+%3vF`L@~SbjLyO4owf^I0aD}eXiOyVxcr}7EHIm;L*HO^CRUtw z-Y0l&>v6u*3-C;G{}Q0&i((k$T}kFAU^rHrHhP4tj~HKwLVR@1R;g(R zkTdr}fXG_%(wW(GcHa971dNqka@h8)^dkC(+eF?{Na7#bgotv$s;By{;LhC$(U0!O zTEcw>M$R@Hle5wA!`V-ABD1(p4~7^976@8~|Nc+v@ucgZU};vwD=8-8h^8HlFF_x- zA9MBE7flV#IBvr8SV%1f-qgp;{56YLOE8$MWu(iHG)%osk(0rOWX`VJYjC+p3*Q0y zVRn9o#r!ijlIxY>LTFx|9$@hU_zUu3TT3(@=kqPdRz z51K1G&`Q)aPa7U|z5Jq5IB;WYiv-_G zKw@^YNzNpP%Mm_X>HY%)UeIvVJ5vWWpRp_P>bJ!mzZyYsTL#Ch#*SHST36mQZ@yV^ z%OL8+=GySHfB&TP02ZymnV-JL#$i}{tJ-x00HI>n@YK9HpguQj65wDSn!}s8yzBRj zg7kzQ-5=XLlvd&~F)qvF#0JX=q2CioCL@74_njR8;aU6_#~|V2&M}(-M1x;=HiuMb z8BCr8xQ&DOy%GT7fYs^fBFGe6NyM-)0FTavQiW|t=y|PsQ5c0eSUSz-8^!;{d@S!) zycM1#nsLg?>!$I)<%t02M)K!0!WS=}=2SxY^m&p;wvJZw`#(Ez`_iSlc2JOrJseFF zHZYgUu|v++l@eO8X%xK#7hD<^n1eGh$nk91c=nu6i$EwUy^Ykv67`fNJyy$zFkWR8 zf-p%KooN>|&OQ+Sp3Q~RwC!!t^0rTr&>Y|8<{ykMgq`X8oK#e=!pvuEf+v~BLV+PC zA!V~;&5GFIyYMtxV6#3n4V%z~a2XqhRYqXEKcl5tafl@d3kN`3Xwqc{Ui5{_u8+@Q?*i;C7aJ{P z_0~#MRXInH!O*(9H+h`dXoRla`y*Br??zZ=eY~QONIEB**27YBlz$1kQy`?X`M{oT zhc2{Ll4p#UnpIuVfY3$kA^i{WT`DK*8`gk_W6;9yS;>{9Z?YOo+*epIWP=jvnzCw; zRwAYgrS*g;FV6sJ9%MEAJQp_Z_IkpcL(k8q%kvNRP0$XlWvx#$}v(Zyq;^3 zQzBV>0dYUmH);1WqRC*HJzHdBPH9ri3&nj8#Pu-C?le9{?d*mstY_rh-DsW+)Mm|2 zn2eE*dz>dN{7Prq;D6qFm6gmbHT*ur)!<6+K|#%TH|lsh6VDPW!p?CE=jM;)ikXrY z6keJN0|h9D5U0K6=NA~WW;bl{R+)1*^$G2QR!QLIAr~#%W~1_h6wZm{4{V3~=Rk=x zEiqYKg`OdIwhWzH=!Sou$mhKkJSbM%uY^YutrH>sD}4C`FSV6#<9P&E6-$Zaol&=D zVMev!%<0A#tU0`YZH!YIM_(IW))c&$^8_>-!sAyx=LH%!zL=UdCh(-!F|U=NtzO!e zge;~p&OI8X5oC1={;S%RR&$PJD3H}MoVkoamZ*@{gPcw&vqZA2_J*4!gz~EpO1UBC`|Hdf&V9+@oa>I7C?Wz3wQo!xW4z@))zi4~&_ z?8m$nWT7sCN_OWK^~yy;kx=K4>z51n#62!s*$*Epc$+pOs2mW!SdRgnm&=;R*6>FTV zz~e%|BW&m^G%iG%k*JUS`!p04ihYL5_KYNv;qGv&oQmw#kNV<_ZJfJ!7ouSm9nJBN z{dFpQ%dP1ag8b`ayOzz^+#;0vbu4_@pYec7hn*&1g6nuzU`AmYc6x5d5LxEuZkX_q z-&?c`@%MAH;`-&WNZNzzwi}t8pTE1JCoeZ|)Xwg_?z#qVpndd;9PqXZMj#2<G4m#E>s;)c+x1 zsCqvr5qaE`)P^9vK@bh1L8*Uo;(fROIZ1H^0DhluP*{Pf#^`L(n^35DJ{g=hqlK@k z#ITzkeMzAy1f5QwF7#S&QugOvL9?3@L5q2w2JVjv?13q?(I>bc6rQeFDt% zFK)k1TztEcXMJ%Wg7|cB)R+mH05!U7)Ry*6Oc=8pCcO_cjKUZF%09%+C^X!h(1sWfmK<3%OfxiqT((8WzOeqzJ$V<%+BS)NOzqrU}HNHnv{%tu*qEnpvr z0-=oceNGOEY%yBAtPxQ}H*$v@*ftqDZTlGy>yg~94Jx^m1#K6@16`q&Dn2##i_lFg z@jC)9Pzn>@=;K|a2vjsG_|M$7OJ0}3>}E=W(kgV*p$pgx5>nB^hEKVR?vD)Iz!8G5zz9;jveI0pb@KQ6daSYNr#SSQOc;@ei4xM~R?ypXip| zz&0m*0|@eSzCBWZ%>+eyal zkVZ%n@=Hp)l(vcL+7b=S{-d+AtwtwDdd|OIJ6g{nL zWjUX~dkzI`^wXcsf0W&MM0+1_o4cPD0}VziOv)36-6R>L-7UQMbk(Oq&9qUf3RRxz zwD5yH;=UoGH|EpyiQTrVbDmKY$hhd&Md)&*peI!;5>cB~Jv%c(DxJNggv(kAB{-pc zc4ug1B7J*HGrDoJu=m5d(xym+?YjCAUA%pGtHG~*;*|iH_6;Ol@`U!+N9Iajv&q0M z((W_V5F=PinzB(|dT)ltr$e+kCdwk2=}7xE?{Xq_I~@Wc8*!mW!=D9c%kB*_9PHVj zwRR+5{!pH+phW1%opfS#`*(w9x}}q#9%Hw+VO#Ogsw>K0e{En=%ctZSGa0_!m>G-E zR>7PQlPtG`gbQ5VjPnogb15hToH6IFfG{+fbWOlph@ruakU`sR3peU3wn~Q%z+sel zBL%sE!QuSVERQg`)2#gQqU-j{42Q<1dCy6UDvSx@gNxUtA;T_K9jzODA)b$4+2S5` zl&F`*cHLC*?M2wO7H<_SW5%Vtl)90Lh73A z8*qBr{y5YnTkjTyVI}wz>#QJ)ovNQyWWjI^@?kK7^94qfpNa%02c60GAG(28x^dJ= zV_mU3e1=$>1Zs#APfjqyoJSHaQ~!g&PZfU$?vfNKb1NtXI`&9fd-*xZ;oVOp=Sp+@ z;N+I6)9j<8emCC*Sp?Hj3!nY{dfbzlaY0{&c1!s-N7zujD+N`c&FIWa$%UHbPvHf< zm>-bWRuIpe`MgxpXxd{R*m;ZogM6IvDgz3GPk}<?31-M_B|_=7*sjmFfA8Z?T5uS=S>C zQPexIgV5_Rz0C_0XwkXQFtXSNXXx`HsPyNluKs*|dWC-d_xSG>v05dR2vv8)q>8tV z8rwOR~?RA!A+}!HZ;Z5Fl5fN=ZU$MhY0CbHTI^ss5BPIlyXR#l-a0 zpD1jyuRzYQMoAW?x#%z}i&NDO*!)svKL4nHVLLXx@GQeykx7=VMHkf=_=OS1m z{I%ugk6WC)Sq%!!1S%=d+F|8(p;%qAV^DfbvxWwc%Bj_+C2ObotDg$(iQyk1?DWY& zKVH7YcJ{my>R+-r0%j7dlfYhv0*k;2ShNNTcT4JMU)rwyzRnM^h~__Bbh;d?0$YB5 zZ+2AsWN-@HC_>7VOFYnI^8@MO-M#LNl9-CB&s!xrlz9CIy2`Xokb?kcg`i+ z+Vmfg8VXY7A~qa1miovi69KfeE@nk8pP9$?I30+~0~I4@V6u!TuH3^toMz+AMQwk} zNydHKlm@7%62$^dBfjabken`Qk<{q z2VFZ6*L8z>LT~*Sg+FpzLvEN<&93|UhuJd3quaK%gU0m6og8}SkIIvcp-{1A_29DB zinn38$kE0}?r3PfOR~DMpHT>8t)jTsGVRKBA@F4J+}->gL8C3n9Wi!FPG~EM1x;qw z=&T*t{XKo87=TW6h2BXMV+18Vy{Gv27U7Ir>x#IQ_EQ4iA@F*f`4G{Z=UYNRBB zSHXtYeqy)V-E+F3bemn8q7t*~E-oSigfh;N?!b70p*>`EEI)FH|^sxI!8H?H3p0I`5S~cZu-G z?Z-h09{_+t29id239^xU3!u+9cX9 z&Pa0(ApM6ryBKS&wF@2136QL;ivgLX7@FfA0QY2XPA8C0-94U!wXf;C*n#tDfzJ6a zim#oSwn;|H)%@;-D4p^H2G#N1jm5}`Xor|)wM-v*DXAN_?8?!_!|czOkMJ_Qk{85q zVC94CnsY9T{IjbhdEgpGk|JEMd+i{1@NF`EQr~(xA`UCN%m_nEC5aK2N_zAiT+Mjl z>#wvn##7Ej``1|1cCD{x@eYtKhzp?N>6-)hF}uc#u7zR9XvnX+@{vokAlZ(1aSXcE z;Ki(aSrQv#cMMpaQS+@6+3j-Ii8~E=yPt9EZa5eIHO&D^{$MTGibAa9Z)smu*6g9Y zB%eeUWEM~&njM`t`V*g71grb#%U8_)dKdODABI;Qynjb<^F#U*XrGfuE5T%L?GiSw z={%yfT;w9lBS*Q~a+&dWXF9jyZ>Dyaf8KwI!6klQ@v?uzLaqjlNwqI4WIhx`{k%g4 zd&SB6Rp*f&a$073htMQBRwL>S~GaoSVROmyT0(n!e>i+kszi zQQv8&z_2U*ml1!ogCxM5^-md`(9^xa-n56*sY~03!Drw%ebqO8zPH!>W&G&6zq~x+ zajZ@VF-Vd?AMKf}wMNZG+_g(iFveuFs+WvjTN5Q_hYqH}*_>i^?-eI!XyBo$dDR6>#a zWuHDm2t`OPt5k|y7jqd4Nuq?@FAGT$OLAu;_v?~-E*r*N#x~pRzVqGp4>&)a^M0Mz z`}KN0pO0xsjVLRQYv^_uZ9hQElSsE0NMh%MIE%!q3K#K}Fvtxq&5 zamRF}7%6ee83gQ*(aRP+m3YFf2#N=5(q*6@t)G!jx(fhUB)Vj%XZ%!^Ok!&By!fwv?JLC~qo+wKn~cpcEn_5pH%4EyJj@ymLr z#~;Qv)KO8L63UM+EI@{Tn&J;yI`*O0wlvyn=<=PItz1PsqObpu%f)^Xa>(qF_VYu1 z$G;eLJ$sR&SE({Z{$~6b1)k-wxl7O`A9qc=!az*TvYAJGr^T1rmDeD4$P{B zy{?AGe4C_Rmk>0Z%EPzq^lVcoq}>T0CNL{m`1s+s?P-W9H~ZK)jR34bH7p(svf__a z!B3jP7e9Ri9Cr&^;TEjXgYMO4oS}!-Y?M<>OGkdHWb}0G(=#p;Z!e`HHatxdH)j1u z6S)I~y|8aI`N%8haTmh32Cfmj6nDpBo{B6?ugU$k@sN^m|mx+}E4)Zn*2(mO}aTl?%wKa!2;$f=SM1sDs>}re5?^5bzxmK)Yaq%a6=uk$-5i z=X$`g^-t>C><7tj!vswa2_TWkuEjJOel9PEKvqy|gwJOe=CCv$G7U;;CP_WIcgr!75-5h>_m-JWc!y>qO&Tpr} zRcS$1zw}KKF4*&0+9YryWxlal*bYmxOHE60O`3xC;|?bZV?vH8{-!+bw6BQL`_hZ4 zqn+D6Vkk3j|LW>0^Y>k8#7w#^n67oA@b_2(Va*(P4PUctxBRxIiI*xkegFXwlaj4> zh|eFdOBoa^qqJ(w(_uf)p8_+C=h}&$q+O~3E=jDae%o!-2O%D2db8|xzTvoboA7UT z`NmWJBzR%60{xyfu#L0B^t`O2AbYBmhL1Ih=l9oW8}~TB?E+TMXU1AOhuJE~)Fc`& z1_uc(n50Ah3T{17(0?{APdUAp`O;p$Q8Dy9S0a(iFg2&r;sQGCzotbd@z9cjTq87y zfs&B;u#Vd5OzqrYh;^Pv?a>Ib zl>prG{ST)=*Qy#})%^g6`uuTt^ixi!jDP#Ra%lFWbeTz$=F_aQ%*`@9!}+v*AGa1Y z*EbMRMKrM#IIROglC|%{29DS5h7Wn4BFdZP5EALM!eoaJQ^oeev&JWQ7P7=@<@jl<=&#y_o)8f z8hQmHgi8xL+L~5_gi135qesO_)>wP+0rZWERy>XjlEDJondI8~ZW+vHOt0whJR_-7 zr(0@0dTW_RFjA*rx<3rz$JX9qT?`P-GEpJJhdJ0;*%-X$No^Uxe-98`)9xEm_bHWl zr-JhbWb{#;N{MzPRc?*T=Rfg_R2IbO6!2kbvZe2GpB)M_qderyN(-?|Pv}3sAQ-Vg z8M{@QH}q~s#&aw6YG+B8M5;Y{;BzNXt34YBbBov;CDp;a9__bD&ur*^3r4c&-Kw12 ze$fS0XlNRv5v-90&b42#zv3=#m;TG_yg-||Hxcc|OkV_h&c6hX*DG&_Rm$-Xu?KDu z8>cO{4=bHyD684~b3`ISGMG9^Mx9nR-scxmcK%*p#Oa1CgpXgiYMRbh9ktz*`g}X z+JC|yAZO?{V|C_&S~51#&HG>+CQ$8|aRs%<#2SkYJ;E<&l2up@hLY~bZ#=*ZS)&$2 zb*18n;4pb=xQpg?%64lX*wpxwU<6;;8RI{=!La7kZyjs+_4z-%DO1(a`) z0OKcK6Q7*(pMlhdK}f>-+!r|orph~wnPV+KBWi3f5Xqri`{zBrUSUO|4*W2MnXt@`hgZdoZ?om!W(u{#26s*70N zi|K!Yw~9Jr^GsMA&a!)2q0+Du9xJJc1AVrF8s34R=k*_~`I`RkYACu@W$*dgZ&-^d zw1`CawK+o@Owz;vlILY^!K2m?DHv!(Qgn8in1mgPrSb?gn&E7SC|TB9EKt3ghFAsZ z#i?mB4sn;V6A1YQvE%Gn>iU?~XXPU;=7_PIq{7tub)@*jKupieXgg(| zK5am@l)=?Ol&JMa@YNfx5bOz7jyW_j!D}(De$&KSFjBG`de)j$Ca5-k_NkvUv=#Rn zkkTs~Ca$SQDO3q=()%Uz2Dl$M2dbJ|PX&#y-6T=gp?DxdKO&fEyveB^BS}9dR9E@uL>+xC}}|DD(@nCgi5x z;`m{Q!9V}nEZV5S%tjzIU-9XHC|J~RnX3{js@Wn=BtqkjZQ3sYoY+5(BJ#*tnW-*qRYg zNe>^C2TM}ASL;IR;r=#CtToR3lI62Qa9V!|Ry4(7MgPwVI#ONdcn3+O; zP)_JXEqr z(XN*Z2+4kSxT_l%AGmzec*^3U3n&$SZc6qw^WVX>lfM!Y^TY&eHCHJg(otftfeGm- zecEztKdm-{xQYt9F=vZ)-W$EPcKHD?_;{{OK5y_}jKky+_dXN27<}!%#I%%No`s+x zFFLy3D@$B>&d#0_@r>j-J>x6AijoLVG&z=bQ5P2-%TuL)1_gA(+7Uwxkg{Uk&bRoK zjECBSmf0&hJhi5C(NT}ivG4Zkj=*4$i-N+i9F{DU{E$Fcl})Tj{?u^|7~HWUwC0}) zaRnF;@hJvBDmD=UIXr4y{yl<)+tkFl)SY2mLJH~Ejyfx&3iL8C+8xBYQ!97_dH!nB zVr%AEoF;A(n)rv)x)iIY;Cc-?g43XEWZxc!|H-()`>iL8NK4f{)j zeG|IWr~n7=K>IKZ?t=5|k>?g)&@>l1^guT7(Tnx@^>u#o(G9B?=JoJ$QBMUa3lP`x zUa${10s9k^=K!RfTy{Y0ZiMG=35`z=RHGu=95|h? zR5J~0o9`csig;{N%E{XdI%*sqsKvpK!iyBMm+L5#ZyjZOy`^Sayjz1D0By|Ac+dJjI5I;iDl`NHVRzr4is#OVOs5Ix0R{i^3&JIK^~QkGS+-S-;7H7&NQ*FVID zS|5UG496C136eR)l1(4JD)iR~vSTA0P;()KPvjUB!#E9%4pP-3Ul6O2nH}JZ>2}*v zky(k5yU!g1|4|w`vDml}o_;=P+K8rF zSJO$qe~6jqbK&J%2L*zsfA*CUEo;l7kG)Uf+zN~g+tp}!-F>lY=a>?%My@c~H2A3T zhfOx#5`r+BGYnLw(gv1(r0f)*6ISik;m(%NixR!yl`+}*tZ3+qUZm5NJW|Q66%{U+ zm`=jfmS5tR`>qR(_{O|Fp3Udo(OCEQPmTf!>UJzGR{nA zZ2(_7z$`mHpY&wixjEsI)P*ut#^DkfzIdVN%DFWl%dOYOB|tcDV3gkVf<}X~>(39^f@*MN4raZ}~_JyVFE)h+c zD2o^Ca1? z7t;{Q+p1Cl;=>CHO&Tpmm4BmGl0VE@D0mi~gb!a!8e74Rf5Z&iQs1LRfWNGg=Ek$+ zANxx);5XeA+KAnbxa!cye`5r#X}k_ori>uq-@8JML)l%vnXlIIW|Kxe)}Mq+i#*8O zwP791{I(-`{2dPp@mvRCMh^iVTy-iE{ZTrY>#IzY+snVT4qVaW#}RoPw6O~}sQ{WJ zY#|swQYl~8tL_V|dyW@NtqhF(!oc>AF#Vo2pAWgY#Ij!`FXF~lK$Q>tOXf2%T z6mJ1f=)2stNA3moeC=64np}J>Ofq=Omatg4@A}@*nQyF$GKp~xR%mB+31NKf z#f(#x5WwOIzN|bSZ>I27bXXQFsy~ob-T4TcWmWiTvp+Vf|9OGot>qRUR-}HE^4~Aj zy_4~;^1T_Qosjvm1zCjKzn;dv2eE!&5P0qOL(d!Q^s$+;pTF$jg#e+#=*EIcws*s;oB-#Uk*9T~gB$aR<2 zSp#BPK*`$8?S7UiK1vRmj)O>i!usaM<96z%k@UHRQWLFS8SA{I4-)}$d$5I(vfLeI za1e!@IEHznUV{D^crxPTy7G3}a=hNcp5VD!{6%?#)O1yZ1T#+I3Va zIacnG$I9;?`Q-FBW8hG+2e2Pwr_lKV*L5ss`dnB$8TUf|hHoG9XMg2Oz|i%x7t``* zYSZVr@)P>Z6gr<^^4L#?Td`R`Le`_~CskU0L8wFQgcw~_w&k`Lp{vJb(?Mv>GM3rV z+tLjKhi4X95>KwoFvRRb?3g0NW20$2`Y+KD7@uk!xHpA5cK$QE*zPj8@Gie18p44n z9w{MzQPhvEiD6;;=zC_>DH$v$uPN1bw}Slff38VxV|SxWJnh1ALj71gi}-Io+sKcn zgHIkE0A^(bfl(d)i`hg>uk4&1uml8zKUd)4@`9$I1aY zbR*F(aI>?05THf;hwvM|603Gcn^$gRnytbq#gTj97!#$D6g*S9{si*xy#!10?F!5{ z4Xf5O#DA&4-JFp>IP&1T0*tiI9l9Or<}37i}aaQ3fUo9||_6p3>zq?);}Pwtj@s_oav8=n!fqsBc5mcn&6D z)BTv984RO=F9`hv%y00j$G_YE*4$AJbE%hW8-VZ=cqR8_2?Xf*z~UVpD)OY~$0D0En^*M14>!zbRVhMIA7&j>K}uQ1$gheac8((a(SW~V8pJGKk!di=ldU=hW` z0HZGfaSr^RLufb9b{fWM6sECVL@soQu>TqU_I5@DLt!ejdW=GUX@9W>w}fzB(}~kg zmP#-a?(YO=)7S9(;X;O*hrtQp2hAw_#zM@X5pes1Fq_gQs`#dHSbu8!VDp8r_u&~y z^Kl}x^v9CZWmBAkr?Ts1pa-eOn-`Lgffo)*HD3J<_QfUXD&-oDj`bxDxb2sfxa<^q7 z(2W&A@Q?m7u4|T9xcZz_bOq7l`r};#c@4sft9^BEa=S;V%GKF0bgNr*yX0Hv>BmG7 zdbtxzEC7B}CQ*bjzcz(}j#$$mn=|mnIL=urTb27J0$sb1&|A-5Jxi1hlP(p8+v-=2InbD@-mkv=eggj2vN#DNkcXPe{u%qE<6K@NP~ zjbWG_W7Oi%blfJx9FV?}ZhVVOOEXQ&m(O4Ybf;EOx;Hvy6{{znsKDtT!AXSH+(tb3 z7Uk)4WXLM8n_|D|w>uG2nf)yd@x-O+Ca7TUsul39$m%=uup!HBRGvb#@s#syHVW2& zzZ_j#+pvnbO&=Z1N{dDoB=o{At^{P`Ql!N~cr`Z5JjO`;7sMxsaN5e%Fp6jn+Pw`) z5J*Lmt=D~&HEPgR%Gpvs>m(c2ip1$k^+wkOJLuQa0zXJ8WbO^dY4Mm^ROn*vBh0FZ z!H1*a;F&i(J*;}z3pt<-*!Z_Fz=?A)c=0*LBA;GdkjAek-bZa7l~qP)?GKTOEF0(b zxz7&Uu3Ca=GL6GOB;6yDK>TvGrkhd~&+{9aNwTDe<@9eEatA1GxKJiSwWW=Won1hP|eEq?-5}xdlT-|OBO!s1?jNCF0s5N!hsQ`$T8D) z+hnQ|1(W9-jQiDad&~-cLEO_fz^;=wov0D?tA2l{*JKCFJ)`56n%PmH3k zw~!@IoZ4P_mGw{n;F2i;DgGjpOq?~Z_LF?WMx4ZhtZyQ|%F(*eo^9ogXR~ELqG|fj zQpR{W1?*(^2bTU!eJ8|I(ZF&}`|3r_7Y3q_<4$x!PWSbJkCutZMc`f;cIRBu5!n2l zV`XTu@mFo5{)0@0Q$&ouicnpUe+YWwf7*@0R!(z>ndpC!_BHis^*Lst_YnI(JLV$% zKKNS*8pDsYe8$Z}36kfVZ|rzwNml7f75-q5_8BiP60-)#kisH8$NeLSV=Wh65m8P9 z7)iMz025{v_}zk8-eC&u)10Ks82k>smr$wDKDd;-rnLPu#QI`bVpQ!O{a@?P^D&Iy zE^9ncRIw*eq825)fjo>+X^;ShHqO&r_7g=X?_T!Yj_?XS*a+&GzT!A<*-Xu6Zw_5p zN>N=F>S_G18E%)#DrI9REPb{mId%;3^~9KLo$d;nT>&mzNq+|DbbvcAe@sB%&RCxjUdzUWqJooaR`CWdZ<%+ zheW09Fz?rb2Nh}HCd^wB538A2&ciE|sPr|>mCh_6V}Xz!7;c9$Ch zhAxIVtpA=U>iPz@p*daPc(=;$A#cCe40)Xq&})_zgUKo6uZeL|Q`lajZUd%y0nZm_ zq{#~vA(RIIaLInK$-jbu34L?lV_Y`|TzcU2JaV-SdC|~1@Y!6RzU_?uuEL2Q<_~~5 zE+TPe5|#isFQ1}Xwt<9&wDtvLt5Ez5@MJsHFs|k$$9`Q6AC)@0@i3XILCw<9$Yq-m zC4$Ml$v)EHW3ak7RcvH~#Tw7iq*NeCYLvMP%ZfabiB_p1Ws3`(%CUI5pV}Ez7i|>8 zx~LpZeq>9^a&1v1>TL+il)pE7*zhYm2=(W$7oIucFpP2t9-hoHmG#XVhQCbKQAP(c zSz1i~usNwS^ZpdFIwymZ^7g)ZwH(>Hod{^lM^?3ZBWa%>Dn1)Ru`+Haw&%@TXo)pO z!bm}98REWh<-lV2#)n}DjUx&9^bySHDcxw7)7aZ@Z}NgGR_PkQ8fQD1$Vui(x^F!? zlW4R_74!nQHG+&xQv8K!5M~W;F+c13@Ga_Bi&Bjqo6g;}LjHNe+I>38pg~XwDF#i{ z{#UG52e|Try8QBSkXlZ&Q=oJ-|F%O8?Te<5di0<=0?G0J4lW`uV;TB7XjRU92=Nz&G$tAeg zDZ_&uWP8o_R;%+fROV*K{&Hi8TcbQsQ?ws?1*!KLv>oZWSpWMO9eRvZF|k?Gn{m1K z1yHSiI11yHRb)Bom@3wj?6eO4?Q>BCg=~pqzeNwMqTJFQ=x)uC`S6vCLh=v$;8Zh} zgkh`vgYG%I^5Tw|gA(>Q_uPV}|3D>6bFv%NoK>xSZ)Y}L z&&^t_XAEt&^{M3(`16X+6~IXw2?&d1I^4K(nxhUGmVx8^E@kpe+rt(Kk17`0{oUH( z!r4{LaFh4c!jHN4>7hCq>qyQ}Ijgo0z%xjSV&w7%GAnS6F7T5_lP^SeY^{)8`N%P5 z6?&KIi2=B7)SaWG+e18So=h3Xl2Y6xQr^6YR54a4i8!>=5a~A!*_?#$^ccO+2je0a zk*gq) zs`&ZudVIvYl0js{f*Btbs9P$qtlU!I#RnXTsQGz_CKoI;jlT;w^LVPnm*b>@@IXdY z2e|dF!u-`IL5o7+ZyO@u(d{3I(7#ozN-xZ7Bk;)=J;!zLQna}+l@{Q` zdCURo<`3~NNve2jIFY9ef)2`^qasMnjh&E<8kye#H2u)%hHVDlo#a#ou!9V}}S(;|R6tVgEK^j73vMhy7; zV{fxDosDkzN+@_-QZ{Ih*l%ynt+{I@nDglLcwBgWaW3t6b{WN23d&FgsglE%p!{J?OJrGw}xBeMh%(MxnQI5%`HkPo*gM-WB7@p?0j43ZrY@X`})x))vBn z;;Ni@2YBC9_`kXP-TG4Y>c(NFe?x|Vjg0K9BQR+;p#U-#!uw*>RG2{QHGMuPZYP^@ zQbFZ{-ZZYDZ|;kLOFWAtf$m!#{GNQ8iLtVN*LTwc-LIFyfq zE9dC_49=#YD)sg7wv#9ug};|{jQN#M$2pJ_q=)mr9w1gg5JM5EGDt*Xz-GNnj$W(! zj%O;xelQ_)_%*Mw#;~{yEkm*4XZ`XPNdLGkypA)EkF^@}UX!JEc4OZ5iEaHbxD0PG z3DEZ@;|9%}=&ua+#4U6@6<4{eI_xDMG_|1R!$j7-(jy!>xCb_9l-m*+s(;mv@NR73tg_+?W?+T1UE2cm&tOReXUb55G^eq7v$(3E- zK;CsAR)Fs;`n2}Dm4n^#G!p0KU9Dr1qA_g>39pTBNouEKN_d!JJq>-f41yCuTP=)M>K5y?7FR@cD5d(@&JCeH;%p4wI{lS38Xu;+ z8)M@BUYN%S3k!+*5o9N79|vaGzbV-9Imap2v$?AH9)2#U-@J>3k>#0{t;lf7_g3x^ z8#>m;cizk?qhXjOz@q^lQlN}xqSP#>Brz)*+^(5X@LwzCx!>Md9kq-z}?5pM3W>N-tmX~ z3v+3yMHQPDp4`;b5%4?&2|7~zQ}Ak5?jCXGbZAe1 z4J1%z)NZffUV)|HO)dqi;Uo?3%)bF-WPX0rdA}RJB|4UeUE#s%U2?&d$Xq+#Vdi;i zeD!Vm^mSu7tx(T7Od#-RO?sU z&Z>q&`*xEmr`?lQ2ko(Z$M~j6qB{Y!+jCZCyh&N0^jOHYsvYWhB z7g^ZNlUHFNh^lH6 zJS$apUuPvd|3nwB(XP@QH>==+KYxQNf;$G?%@(ZLW2~-=ajtb=)||*`yjd>r-_Yp= zEHhrhK1`%Uf0lObBA@VUGf&n*e2Kd_Ypdw+h6^4P$*+<3_#o)|<2l6?b{%d_b)Cg8%t0_mYS9iOlA=$z9?&;X{b0@ClLZjL!R-*)(;P?z^ceB=@BPmSDjw()DP5$G zpAfPd(3E~g3w}Q}{T4zYM4mfQD*{KF%=#`~F|;z){b4{8t{v|C|5tu^Y+1hUvt<54 z-5;KaU#A6WoSsCn0Q0;g%~$O>D1gj?wNc%1pf|_kE)$rQ# zlFXXkn%gUMGbYGPX0E<7_ONSf4N-N6lRRJ z_$GlNc~*V`yUDRm8*;Q3Mv3URa_pOtwTaJ`JjaC2WUYORTPUfU`xmhumr3~#0xAV) zkF&Z&+)s749Qe33cWgha`z(N+%K$%@%y(P)A6zpRC z)-kCT(Tu!!+W-;er@DjL^j~w)*(P*hjaMnR8&5-vf>ED5oq3Ak z6v=Hwq^nu2V8#;M2SamT1SH$P0}h&W^GavTUI+MJbI9t`+r#y|cT5l^&HN{O*)z5N zx#`;ijZeA=H`H~$dy>l?(z|9~Z7#)E6e?5%sUodzze1O|5*N&VMjy2IanHtIw$s!M zOg=f;o~{LPTmq}}uC{WX$*@c`xk;^h+pcMotILZ^2(dumOXj5$kv!_BDOD)JY(-@g zk`&!?-5mJ}akP{*;1eFlD;f4k1y%HDvOHqAUsOqVcAK_n8|ioCHR63I(;dVlJ_9o? z!Mh{BzvN)po3SSZy7hWtE(44)_EGMes8OlR-6`{b@_9-K%f-b~WFzc*7ib-;wj_@I z!&pW;Y0o`oB_E8aFhSJ3YRzxnXR^_*AjWjN$_d~_?yD-3RfsQCA^!^|^|u;>X`YnV zA`&?^8QNk3W0wzi`LKgbAQvcnfduvUw=50&Hh7NmZ~k3B%IUbkXj6;fW zx?Uop(rx!Dps2$epF3)fMxSe>I2Gioi(2Z=KR(3uI_YtJ?y}n+D)AiW`>bPDgJv{D zJFx7UM4P6i#I$7xktd5 z*5N6qMH^w^r1OEt$@r;o{qy77*hDMVd`rf{{bg4F>;gX5i$ILiC4h{wla}TqdZOU6 z^Tmj=xN7?uymF3{A0@XTFZ04C0#lrZXgKfk8)&YOj~Kg@&qZjU9znDZmQ^`dr?((w zBE;ZEJy2f9>KMh+BC{w(oeL{vV|QSnMIS%SkT|L7h8{gGWJO9!D6fQFDl^{*aT=a8 z2-~B;vsdFdr49E$I1z{JAML+cgGk_BvRA3HGj)5kkG$l1QV`U3n-{!vV-WWQhi>dO zn?2FG+@&4XIzf|v&uEB-owS55rcpBbbHOrRqev$ zvyuu`a))>Y%Y%KFbi)tpWg3bipE}Aa3!0DrgPCCO*c1BvYGe$K6~snYX~jn^N9G=E zLmk!VqqS&_Bm^&lS{RF~rOP34`r+ume37lck@!dQv?Sc*a97#9zK<@=<1SBmcumoa z|I|rwSgCJcSgN{xhtYJ0f?rMl)v$iABVa;)Bqmhc(^SIqk5)&J>r5gkH|AKMgyUI_?v^0>fb1Diecab9*o?+)g`;HHK z%|Ku32VJJIhRn^BfnbXk3k|jBr=kz&-!P%GymWZw|BCY1RL+>1Sms%vcRHP|=@`-O z+aLJ0Vfzte{nJLzNLiX$7XK19?3Y{p4lQa(uVM&t;aBUKzrC`ZyZHxMp0)3i1Wo9L zS>|(?FDWt=w=R>{Rk1>WvL{rv4yWh=eh*G^j-399BO4O-6lY_H)T8u-yydYiLKG4Nq zRf5W2?lZLelpwc=*Pee>eGiGbpmzgj)M(QT)y)qi)Zyqu^S2i61&$YqDFc^4qT2Qv z!&tzAMU|mjhaVSE#nG zVr-t>!wG~K-zSHaf+}4}7n!(cZtDCryP~(%&_gaUqYn|KFM-CB#$VLLjuMQ`@)GB2 z9=u7+-|+g;CQ=?87wPoofC|p;Xe6*)afafxu_Gcz+q8#I(39>0*rzLuY$xx_u%78Y zUi?Dd9z-CHGYX4*BoV@dFJ)`)$n(Z?A}mbFucXcbcWM)u--xw$m)VaWo()?gC1{~~ zpO}gQnCH^WBEUcrTq~uI9N#*@d5US%2u)gye)S4NjSTU<52mHuYzClh?yM8@V%gx| z>Qd~U+;cg|0CkNMZc=k1*!m&Y9VH!h)(ZP|Iw1S z^>@e8Pd^+)|Az(-)BCn@O0Pz7BgUGvL+Jbx&F|y8IAZxvDaD~saB`u+O)Fr|P6W>- zoZkoIuhToNIi;9*(rUTnXY^dj zAy&UUr@3Gxrz;>gsHX$D9kC1au>I^hR5P<3`n55M<29f+HV1}krkRw2c>f|}Tmu!QgtfVqa%%Dj zdO?iDLn||dGnP>_KLeJY%cMg>Q}{`)QG|92=B_Q?B|`Ag|72&>n1!P~iT&Npno}m~ zwCu_FYxSkXV@g6XNK2B&KY{sGW&5D24$4bhEnruq5AvUD*tYpQyLa&!6%OqsGdV8j zfx7&2VF&A9IYI)>7HY=x#etUPW7Pp$?N3*&&|R$M59wW|t9`LvRO;NU#9yV8RO}~~ zHJ|u6tpR^R-Yk1#=CM9a&$#ENx4vN<3y+r|Jx{YGxYQGWVahWyBllYniV;vre#%Z; zu382GVd=G<(i%meZ5>?caVzi%9L`(XC)J^I(YmT3fwQuZs zld7uo>{{U#{dPY%IhImeD?zt4$dG=6ZoE8k-E~rSW$3ONEe^2F?TGw|v1_#m5Y_x! zqQT>LskbQ&-*%3Sjc1T#n?cF!|L!w?1BF(-H0Xy#t{E=Y-k)J+ zPwXC6wfkc&4%8E+7T}d`^n>i%FCjqDr&Sc~j3Sk#!uwY1Bgd#cu&?NgG&|H0hdwWMM{Q7YgJAxjua#P2BFIMxWlIh($ z@_ZXTw{pP}Pw0`qp}ouG2?&ICyX<8YoMT5HVbg7faXvb44I?|n7LtxlZuHtmDugIR zbvUeF)7Jem4wlyY2Z2M{5_+arZ23!f#pq8FPzqfVv$kREew}a)Nj>CV{9icLWo5~A zP_0iO4%95|NM;c8y1b}AP&Mx>UOcA5!h%4Bt!wh|pQVE?!AkpWQ~8a?2jJfYYAn+L z<4=;0)KA8kf(nZWh|1+uO6?C~LPC@vh3;tNy)z1EHJl8esJ_YTuh!|c3Om1UcRBo_ zAbaC@42Z)mX9b9&SIz0c3g3`bgp~`%;w=2x0`VdX9PITxzmIDl? zGB0g)dq+R&+p~(G9Ia&$1Em*t9+q|rX8b)l$M*k}1s?0MUqo43L+YI^L_jt_vJB!Y zliH2mq4y!GZcA>bmYR>P;C_00=F~k-rIVj9Z7wrcc~UC~PsAS0GXyOLIhp)>^ztlu zW31_=AoKhy#6@kSfeGqDIW;9Zpa=PBH{^GJXMBQ#e&ra9zMGD5}#x6Ft0 z-OIlQK_*;Do}VpzxM*0DUb<#c%0_Wqk|IA{_*N_#{y@!GL|u>nXh6-;WdH;!oI^ez zY@OQ)$mK;Xd9xC(V9Q08Iqm$LInZ+q$U5-qH!g$rddg;wW(YObWGo4C$`uD=X6p{+ z*X=yt9(|nms+Tsqi4VD7(mONH{ncSy)QzcLPkF^$4@u;e6x-z^nv}3iwRgN}MbZFk zFima)mT*1VpEViJ%w`DXAh-Xa{aVsxh#&~yU&A;)0h~R59t(-oD3^g z4K4i8Dc+HF8nnEBzu*zP@84O)#(hS!jBkH)LmM~dpxNf?D;$_YEgyK${tdlhn5b95c-G zvDFUw8v{%9thX2YXETH|n?LIs#hyPOXhhvR9WYUzk1^do#Uerjw%ph{$jA&i_+vDV zyN@$y(>)J%qU<719~Cs#z)moqsjSS0Gr6jPxjCnOXquT8H9&&cCGXH5a{5z$UL0SI z*KB#8y+QzKK3+sfm1gPRaQpKQ0;-`NT|Ne0v5aIoS74sKP678hCBezz((5r0u|U+w z$fR3--@yD-FS zHtfmPT$R1X;~FU8Fn-zJAol4pg2&Gz*Uwg*xCNj_ic-@AJww-csikM4$`CTKpvoKO z5Ez5RD%C>eI5NUCITPhzR*A_8MLZO;9k=X}h&w9h(u5fPo3X!Taod_?)3r&L8Qkxw zx)Bz-&-7ssVqM7ucL?M+YOcY^uP>FFFzyuw&ZEi!cXVYpxZ!qwi-zy1X#eSGs$1wj z&clLDvuHxSya`sYvMaccuja2QV-OyZ&1F?xR_)k4{;d-{J{%0xS3fhZCAwWP|m7mD6xM1hee1CjYa?{AT;`nz`!$LV)A?Q6rzWjLxC0)RhS3N_Njlz(kw<(@>!pyf$n}{BHsg7Xy6&Q zB~-T^S>hWxuXrZ7R(`2TnYz&$Z3A1x_;hti9uv!T1Z>ec{PR0bm4G2hgHu31&KJ9? zd<{d&d|G!(tmb#hYZd$qjT38jCFQ-Teq{6&_Dp=oU;xQ9pF0Y!au&X=0~O}(G`1|W z-u>7O`wTNV6piCS?RtVrY^c=!0^WzcJkG3?wB=8{@%Tl8LM zB}}f=yQjmmy(UUK!7D>1H?Biwo2Mcr(=HYP5v~`>-`yXuHgwX1kvFWo^7=Ui1Js2% zbt`jYSk9!7IhJt+ni(N0wO$S{w9f2F}>HvJuKpAwV>0 zE~vVmGv351*xx?Y@y#kHVCvz%aF4fny^x#t`!+(bQd&4{_EZw5!6mdBWbrqIfZ6db z<(X|XC-Z;@o;kFq9wddN0B$>gZ7>gXcfm*jj}eMn%5w-*0%?X=N)K?K={C+D8^nez zWeKnD^;Ic@3b}G3yni;GBe1$a9PJ z0BY42s?_GGFsQeGF(l55h_5V=5;#Hk(!QrLKW@S3hBVzth4(B+T4HO~!X#`<#OS@e zDU9Z5y&X`QeH}h?>2;&;rrU4Gv7KDO!b(9k?5&`^d3~iXn%xs91sOn6cI{NYtiN5m zn_2{$jlZx_zb>l^ocqx5$@u??mDN=(p8&kC=OX@XHS;B5S#Yx6Ta1DpRZ2_{Ncgka|-h1%0qWpj8 zs#@cY{NmSs)_g?OxC|gSa)76~8Nj-o1d0*+87U^2uBab0nLxWx*ZTf3_@*5?!sbb3O{}H{Qs)9}w+^fOhdn zJ3i(LbKYRO`|A*>QSU&w)dyJ&F4f@QyKg1vI$5jNqr7_0Zd2SgzmQYHc0*8joA#66 zE`r+Fq}a>ZEwf4QKVAwl@9w5tT|Wpq#RY#; zhbQaTH`K%3bt(O<(_T)60XRb`Pp2Xge$sKN7!W%m6#?J;Wjq(J*$0mOEF%>uHUcy@ zU5FB@ID<@+_R3(Ex4w)aP`2N$3q~HV9VBq;r`%}sN6W#6kbkBoed788s=NuNUr!@* zuuyzLZ_XU+D2q2TP8la7T$V7prbE#t=f$EU--ORcY?Kl}$2YvN`{iD$>fJA9o#zik z5P(~eiH@~Uw`@J9`#OvSd{etH&f;$O@OXf^;J(S*`+}aQTgcI*5Td(ke4Z_f0$Boj-SF^6&p=@`#``N zxwM|21#6$QkCKTL{=_}SG|Rl6@kup_rz)->ZsQDgyQ_DYlm4ZvP_S1~eiPbG1Zz|$ zU-RzFok%CJ0vq~eAP0?V%<|jAzwf+gk|&JERQ=FcY;Y#AVhNFe$&HYRI`+0WCqOGm zWjiEL1$x5r6XPg9(oI3&^trq^YvOL0cPKj3npy_Eu&Y&v`yO{>NMhdTl*Qsxo0+S; zHKr&44bfy|!fSiMpLdkNoJ+}#hiL0XD00>RID5;WxVmmzID{Yx7Th5?1PC5n6Cg-% zLU4!R1owtu!6CRqaDo#Yx^WMUySsOz-O$i|Q|G+Td+#}QrM_?f*?-5HyK2`MbIvse z=b!wU6+YBTl_?dd@y!#d?O-R1jk7#==m}k9QXd&N^ZAsp!tkT}z6U|n!l|frCc0le z|3jkQyVP^(`cgB!H4)RcgW?m$zso4#Li{!>4Zz*1i4WuLDZLh(U~?)N%Kpt?izeVa zndEQ8n^*Z9pA|l$20Il24Fp9sp2h56ksBhP+=NWtCG#;(SoE*W`^|>``7H(Nit*NDBL^o6;7401EpBJi!}iq&KBdr|(^5m@RqeESFY=bU$vy z74?AHg&Cwcf?|BOHpQFn(D~{g#~CWZATD&&N>cf6;uiI|;m;&cVuqP9AV`wLM$nYp z?Sk*;$ab@?cjMJ`_kztP`JcE^cQ0Jl@meEtIb4$hF1^vV^JA7qT+)L5sim)YH?~JO z?@`AK!3q38<{Je5`14tE8_fp5eSznp>9xi=LeeMl4!uyI4N&LAc@L4WsN>8HiUxVc za9JV$0FyS0?N0dVn|pYnDUtpuQ0bvazlbHkOLv{p>JY^wrr0}xyECsTqsObqNNr05 z29V@38Bpu`{ek-n<%Q*@&Sk=i`|L4&zINz>@Y1_S*F(O0wq%pg1*r?%JLfy&;hU_D zUGdE3?lFNFCID?`2B6i28xHX&U_l)WJ}PghlGE?jb?d<2W~!KhZN7qj@3?_e*KO$T z6#gLl_F$Uh=rd|*&sy3%=yN=j7BH0W^(yHv8|=i~-z)buws>Q>f&YX|F1BI0M2VLU zc7x-|$J9q%KRlG`dq3}-0j(ZX|Ka{=gF@kb18Dx{g6lPsHEhhc`fn5D6yI!l2IYfA z0p$ug?Uk>tlmOr~k%2eK=%O!N&u37WG`l#^$)Y4LklD~Ap%7)o!57B@?pIY{xA@-UZ#9-y|A(Sz!gDPjhH^*kZTGGq zBw&w*zzqllF*f$s|99g}IHo*ER zYv`4_2p70NKOl$`GLmuW8DS4Q87PfTlV~4jCBa2o(v&{;^5*bJ|A?Aik=4-q>t%z7 zAtK=!6pfE;VBYh*O5wy4>1$m7iH$ky&GSFXnd0~LJXeDIY0x%0n`?U8k>t^0F6cps z(6z1Pezce-&Z%PFX%h1us&c4y0A^+*>P{}&Jlj{DefcgBq z-?W(0l0z7esehij+M9|ZN9qt!?Q5Ocfmj$qn}`0aJ3Pp1iJNh`hl5x}uR}f@xiB@o ztCnsRB-J}q(vQA_31j9105NaAUy!olJ}!-aFeFb$9#!i3R8PRo6POO9%;R7B6acU$ z4@%q@tL|2sh@4V<)~d86y>DA|lurFVc}RunJD^cA3}^y&#I6y$Uz9D4g% z@$;;~x%_f%AQ=hzCiqCob1orNHQjpfc{hIsyjC?7HN3*+<8&kcrqe(QX;=xN=~1NM zBq(+@+3qg$i;FCSrh>i10 z=}6PkVfFow9b3|$?qYm(i_XZ9ARa&EHR+Ob?)`nLznNJvH!MLVHD#!~CJMR-A1RTp zj|BJMK#@CO?Uo3HtIKOYkP7`}UZvjH9RbkFG-vOK^%gN9*6-`Tkp;fEBYK?ky)DY3 z?_Ho|NID%jHk5f7M)X7vaUH<)m9!2_{~WzHS(C`<{Bb%WVGJIF=5uCrEM!$Fl-aEA zUy;Y}1>h=~LweBm_vbo!h8MgixYOHFGbc%UWn`h=zP~qV(yXJeidtMI@;D-Epm~N) zQ*ChOvI_+FDXqA7!8y&UiY znOck!SZo7$`Pg9VvVSg71=$f0MXp#h#=@QbW5Bfj&*{t$1mUp?(4$gXa=7S?{lrlt zhn(rJQ<0&di2}qpqDJYjZ+zR>8R~ohDG;b~Ejyu$_n>#lbDExemvV=G_2qsw0}Wo( zN@r#DDVZ03|4DBMq1MX{RVLfCRXl}ub1$H##=f+C=!s6^##Z}a!3!Y z%N&1$yWKVmSIU8|pFbqf31~&5^t3IejGF^7z=yhnzVUBf!i(IrLjaFZK{3MGjY&I< zU7Wyzub0n*i2dazqhRXwmmGOo@Q#u`_e*)0+&&G2FTnwcO{aQ>M7ytYI;GUK&>mN+6L<2nKJP%tPycQe;7*xlogVi9nj886 z!%{!ox0A!c4$JcJ5OO>yMBiy3AGT^Hb!Vd3_F$+VZaP%30TmL6>|?`gFbBS>VnA&u z>$$c|p80}O-78QAp#)hSbFyVE1%!8q<&ZTk*v3o}ay!n`G|G~blg|1kJ)b55$m+}5 zKD`oj-G}Ni9iVs_<$UVD&)f8xGyaHe1k|j+Q}%unR>W-(Q~NM@U=g%lp3z4W^hPAb z>u>Zo%zr#bE<1$Lg_6ljBXZVo0LGE}3*g~$dvmM==dSdkgc<@`2(O0h)y1K>PRt^o z<*1}cH1+x)YQ4M#TR#+Hi6u7K`o_Dsl|b2?03`5t&cYW)sk8ZuY!|1vVw;9c@{-lo zL3j|-&Zl_{jQF51!u8D|uk{>o`r{Ouo>yuXNZZK$u#EMdUw9ra4AqS+ROzoJ&+z7- zkHC>ky4|F@Sa>9WCxl4vD7I}xif$g)ZVH&ReK-U0Vl5VN(p_dDbe2NkcGOXzcc1Fu z0owMjA6+;D7D*C5KCRU)r4NODK6#JI`;5u+^-)h0Wo~;rk#Plu@Jbc55I3u& z5BOb6=w=3y0^z=P| zUrUiws3!B;db_BQH?!J=e!5K=T_4l-wR8F*8_qw~zwnfS_{i4^YLCAv<+!^mxEw#2 zE`my5lR|?X)Gtw(02wJCq68C25cd7=cSyO&pC;UUdCeURLjY!yLfBusz=z>f-?vQe zm0raNo#(aB-yU%iKOSh+#t#v%p-1itkX{pP2=xgE*bz#rpN7d)z>|ZK`W<8pd1X|j zvZ#wKOlU@8{^0>^X5nyUdUNHi|4z&vj3ZTAWkE!*9J>!yI0_|;(friA)?$rRAuTH zd2xZX!(3b&Xp9O$_wDC*aH{`+|EHYlD|0Ez)yCW%A8F&fX{;b#mGi3&f}hTv+uf@^ z#=^HA$Xl=~bm+8sHBt}n0@6tofxNmBX+v8269x%G)}WI2 z&mSACgUEflj&;Wk)djzzM)h9S5)3Bt$k7fHKfd_hXK(CUnI`@BUv9AT%q0<>$Jk2^6<jNUtWm2(pe=nMehjkSr=Bk`0EB3M*!P;+#RrZu;q?#3+K<`E}_<4@s2k`KTHbU{0GQn=P zIWN7H`GT6!>9#FNGCu~U=|>?!O#%U7f$GQFF!958e{w4nYv|BW(Ibmo?#S6Ig6gY? zip?)`#^HJ39~;z}2d>;dLEqSN%TYU0;gL#yc=<%LpX`yQBM~S8 z%^uRrydz!8wD))F=i)x_atp0sB-nDtc<)r*aBPG<9Z`9R+0aGLh&%6G- z#j|7rM;Q}xcUjk+|7QrF-}})@2#i{#gyunx1yCz4ocF)jRF?XtD`FpvbvQ@?DFUdc zdZ@nSyCUE8L*W_X46J}jto*skzTF<%Uz6Eb2`g`arkX^aEho&bVRNVTEsNmvXla89 z!Q=cYb7*>-XTLAM!7M3k;q)y!ec^AOZlOs1z+wDdEtHUN1aff!J%1Yefww96!0iE* z{dP9D(6%2{mL^Gjv3A=2ah7;_tmyE?w9qk%0}Wbu@{mD1oH1~vQn7nAwjazS-%lta0Pdr6TdZ5n`YL!uVV0LGLkgcdggJ*bRdy3keP*><-=Tfi(4;O(ysg zr1>H5fBPIqYWT2~RC0UH|5kt=TQ5}9jzxsd2nW5M$R*mG2%7X{Ii-c{M+3t9u-8q8 zKUaW-CwAH~EAjA@>)z786(Ph5h-)Bd7GDo(7w-1|m`)4JQ4P=v5aCdJ!F40PFiZ&Ylf} zO4_Xp3+a>{>8=G0z^a)`+7a=u_01qLqrX>qyUsOfCau$We<}+X z`g0F?TmtExwJPji2_2YrqXw_h|6aC153F;MlDhWaBD`L;odr01PL;*Q%b?2skX-qW zo|eukhE!h&AkUhO9_t-&14eR{;1cQSyZ|XFjZ<}vG>m%N)nw#56j#Wjk5}j-s^yS+ z+hW1`Z~+$aGT+-Ju51sQ6 z&*G4lYHx2Wz#46j3r8{E%cv2Kq@XwIZ0kYd1kx#~k4KSMUt1)0xsC++X zg7c=E%OsnfFxH17kg9)q{>LjH@E`&kUfmOuF?6aWV@z%+zg8b9O3^eRxy4hQKP0^j z?U$By5Q`P_IW!V|)IGOy4R1~RStEe>>inCuo)Jk^{j_4}+~^%v!=Ky-FZ(A~L+d?^ z;7aN3&~kO}ViV6ch8C2q9hc9armo#w@2H%2GkziYlpkGU;4ZDD0t*zF6E5r0R9$dm zp6f5pI2U-UV^Z|)y%HQKLTv+E*MwfccbM~oC|XY8@Av)mB_#wfXSmh5-jUaRT#NhE zqk8KL^`EDq!VLmde$9kh2sSP?I;eX3dMFBRU2nRdhJNGm$MSl}hWL&xNc^r=yG~@o z;3Kodq}$0lQx_S{ee#tX3=|;k>pkFh*}4)i6?ua0HU*%AvgHTmjQR5{cLO7Jg$`?% zQ=%lQ@Xpmyoqw~jnvw&H;kMd`tk>&$x4nQA3F60^ByWNTyIr}E81{=X(XtNmLOl^O z?tKWCJ6S!-#*`AsP9GV3@Lo0X5->k_vxT%K2@w!f>o>hUJBEn5oMaY#al}y*VxW+G zKSB0Y`q~YU2WwfVNO+*z!P+u>eE|A>%I{Z}7PX4FdE2Y5l8{ZyEu~jcOz%92_Tc?V z@zT=?^FI65Y0}iQE;zqsc|`QX>+~$ZCyB0%j^Fi#@vCU~juoI!huyQ_E#12wt=&GB|Iod`lcWPl=KUrI(7&2Y>z^e-HYw?E&g;%@~QP>_Oax5 z|5@4yncC8&vA~BRg|_1&01eG>touWEw|jvZ+YVpU1%2Z|pt`Zk#R1_-IjAM4*ZU4B zcpqBd-ddJ+fK#!c07yWcUA==^eEd;Sv@e}FO`jFLCJN%NP4rHfn}!5guc54gvPKlv zOvfrt2|RamcYKd7n*MN{Z1Ynz{9n7UEzaWW+KA(KNU+=Hyl7E9@4af(kK>u^pgar`2mkmbJx|+o|H2Atf+aX~PUgxh_OD z&V>AvH-5DkKp1pXgbfE(d0+Phu9Zu_L#AAsw$NPk3A2A;LP(p`gXXm0WC4JyulEUF zU7`yg!Pr3tadeo-$6n$fn;@nNbp7Vf7$cGSNfj{if#mZP^N&ii4IV^r*1 zQsA6yS6EY2ke6nvqm`0Do^P7+;{}no$~cD_Ml`uCGgq3$-at#C-B!v7)I@x&DKd{4Z7)PY*s*Q!jHzJ1bK=XDd5PYxjSU75@v7^8XE) zNwQV>{|nim&HqHE@GThazd^#_n$Z0R64if$!{hyjK{kvv%&K}louBN76tj(=VEzO;*-ONo*U0vL* z|M{fBg#TH!eysm|=cfDXsOysqxkR)3?vnb_42~zTGJ-QaD8aG6mB)&*oH-IGR0oDB zYUV#s`6&hMevMT988oF{Txyi0NXL;tXVMZxsXRgI*N5e~!wyaZ zZ@nQ`D_i?QV}ZcufBRA<#1tg$yzd3#?SP*JKUsnWV?ITMg~My1hLl7URsqs;0N*bf zV~9x>CKHe44zYyR`%IY2%p&9jG9&Kn&8C zTs`E9ZB~6CsRWf+rh`odFSe8rw%tLM&*Uf3wm`iO@l77PnlO5xlUn&!3>AJr&9V04 z*0PI2=YWZJ<4Z6%zVOS0JmO!xrUF%H2qC4_7+4Zvzce*25S|Ns3U21mw}V{xylm*LjhteLN*FK4|!3`+I1WG6y|?qYMtPZpHDx-*nV{kQ?P3$-9hp z8GdSd4!q($VfH1Rb(oG5(^er?-zt(y*OB=Cb#qOo zfBe~VzzS3h7AVA~O{j&k5#D2c`Ib@1g$X*;?<6j)~|6HldE&%HeY;?T{7?6zH zhWMig@KyhLFsUIx7cdcb<)(*R@u1zc4XuA7RylIS_`rzw1Z ztYsaa4cr*=dFj-3^*)Ij|1*7UBPcPFp=0dGKOW1#juDa$>`Y3$Aq|JBqrX z+f>N~DLn=GQp1fxDd$M39kyL!J|{pVIysORQ^lx2w9T=%JTG(xK;>AuAbrMMPz_Z; zVIplxbjlwuEiQR7a%8bCmjT=is0c9!pLu2dVd3x!#D3nXS)dLf*&XFTyJyAR6iqP5AwwBLeZ&2b*gi zuRg+?NPp6>zuu*ynh)+m{(KXeD))`!C9Qknnvar(wb8ZX&QDCo?}CwF1H`L@ly$u+ z>0(J^O;ot{*YcU4mUwf|-@JdiFrGRgy-pU;JRN(yyLx?9dEIiIf5p@O6!>yW-gDLK z6aJo|;kC4lo(zl!saQE!(@1yX+$VC-6+$kNzrTPd`FHrBS@ zFOllrMfbWiUbJ3atQ>XXd}-%)>6mi)m*1L6P?o9XE2FK5;+bBYN_cb>&fZ*CsaQZu zWdYG$K5v zY8Hu@TCfo3gD!Sp1JyMpX=VpX*I#oi|SS^HglJktU*i zF&9&-7SR{&mY+So@IsqS=pDyhO!!4S&-aT!tP0Q&a<4F_aj0`?_tzhGMPjpoN~*&e z-+1irg;vhm6;$H!2i$8;x~z|nuTCi8m)A?`W~e2lSw$A-7jxAP=ZD0jGf$?Ye8XP@ zTOD7(SGxz~jakq?72ad#vWFEV&yE5<`iG95 z$>(KpoS#Th6*x(?0qsIdf44JD z)%HVIQ-iER;+Iz@< z;`C$r*IZr?tfiz;WHw6pzw*20SO2D>D6W4KgTM67*4f(1)W+>EDfoxy{TH6_4@3Be zUj6tNy~-UHC+N|560tRJyaw@>WH!7pqT`lmF`s++Kh;GGRav5EFZRCms*904EsA@JCDKpuU(Z_r zd=mH%5n}%LdH*3o-fnj89{*P+w1N9CCNy^^Ou9_|#8sYOSF1EdKP+7X!eOtX^Mb*u z+~hqoHV*EwBkI1R?lD)#1?!g-cLPTl*oBe|b5BKDiVjxFPmq_A@zFsr_jt#PGa z80VY_x_=_>3w}%0IY)Y?=_Wc?f`WEJYq)PNf-bmqVzsPya3jDd}2bg}< zsePSMnk-)VvP0;Vy+GuAg>J`wUtWP+BhC+b^+DOZUt3k%c&|yW^Q`+f7(=*61O3k3 z#jhJ`u0W}oVKe$=v!kW#Uv^II-3M3n%l*DOxtbM4ULmOM!s3DoL#icfQ(mzW>mQD2 z)RQ(Iw%XHQwohmf zAN;k)mxOwc_f-`i7I|9<=2QE2(fjtd)9E|NrZJ!EPA+K7Ra)K`j4wrJ}vVuxOQlcWCf+SI1#RS~q3cW8!YzVw)wX396^_Ji3n z^OTXX*HPoplabE=^%DBz`NseHgjWP7b^A~|%}LAVxLfRb_n@t)bAWlf%!v3m*G=VQ zGgWC@eAayz3C9Eg-9K}S)J@6Mciqjt!L}X_RiZ?G2l|4NA{UyksS15tsC|BQ`X2ZMso@M2HQlfZ?s^dno2!=@!RDgAqiFB76c z;((I4q74dPerJ~S=NFts9w+oZ9^xgZ>dHqH$~o7C){~qv8b#vDHrBY;d0FCzZJLGg z+ck&RVb4mGSSt2o)?Ve(LMNS?Y0rtd;`8)h6$#}^taoo#OEsC^jsKA0RNP1wRmCsm zE7TTcxmP1W6P1QO9vKLKQw9IZSQFF3E985vSG_az3O}1d)kg_KXz4rp1|(U=!g!?f z(u*KqYntHK%KVEFr|%m`21;6UNtM2H5Se!rMeG9O`lP`o4n9oFY)nfs1?zP3Z(Xw11q|F+f&F(Il0pEjJ^!^+CAc;fvb~pAT)_vmI(UVkRt@pb*XTF9j?P#j;*+XNI2{N?t zgwVsar(71K)0{XquT1I&N`>>Vt%jy>+xDMMa%Jw7=ua@xFVLN^aEle!eC!ltTljjd z>tX|K2iM6Y*Xq^_x6mKCb2d`H7N4r!wO%9CeP(|PXQ>W1|K4>)2O5zN)#waG=|xfo zA7F0J%)PHWoAhkDPkXZ9cM6&(`;lndyWaJb#Y2NV9cf~B8&ZUNyWLYwLHG7U07%##?W zDV-fX@157o)eA0|iPu|7^~3c6EL$944A{p9JtEUiNg%Hv1>lWa zMJW+0pVk#r2mhbV6@=g_Yu!e#`E53SkkY zghMy{nuF8Pp4vw`V=AutC^XrW`yx(1X%fBuUC{-w^jwoPN_`r_}T@-#yeSlE{Rk3Am-N=<#lPe zwCFe3_s`H**W?a-)LEac7Ej#N#s&|z9^w05Rio0$mcQsgWQjhO!IQ7ClGL3U$&B>7 zvu9S_)EIvhfk9<9-wg)7J(FBYBAtF^QJ(g|uoQ=$z8B$L$VCISn#Y|Ty_Jh7-|A`M zR6UH^H;;Q1f0o*(EMa{j=^EJ1`b+#bf!%;3j@`$@cTeq2XGxhpzpOH-7TSSCi`;Fv zR0Cgsw+OKqj;-GKBdg=8xmcSn`(!m8=&gBvmMD#6aXENTuvlfWo%xn)@%$ZGLK`1; zJ!le_s?jf)cbgS-u>Iu40qGAl+O;ft{F-`6Ls%0ltM3kx>i-qO&65AY zsZj=!?Z9%quwUqb1~yqbaK~K3dG*~bwVgv3>6cbnzek@5&C$LF*ua?DcY<05lhD2h z%qP;Cq8+1eUMi8Q(AC}p7L01~g8ClAx{V-C3X4?{85v=@BT=cH~ z5Vva=I3JB6b`hu0%wH>dA1<;ldZDNKoeRbIgLpCWDa2Tu)kGTCw{YL>@tsfNB^wdR zg!j|O@9k+y64d?j`@f5_utu z>!|iSxCpeqX7kED;<>tO1~uk(*N3VmKaEj$+?xE1djzx)|NF0ma$~B&zUPp;(351x z#Oth?TEoE*`{DX9qp~-3xPr!5EziTa*Dv1wE_uNcIIn?P9te{*I*^C>le%3?=lwMd z`!*a*;0MYFbWMkwI8YDm4J7tj!`G`6mh3G`oVkNXoKDLNOBp z#mEd&+?EQ>cXrLt{(|+z-a#Z!Bn18ZK_XBuQvPuK4dk%Unxws=h9aEs{1491FS^pdI9)!}hLocqeQV`i5=jPjCx5 zc+*xDs~q!BiZfSJZ^xX)$LvG-*4Kc`DXZsXTKJNx`6V9R*_$!vS0e($dS4%dj~%5B zDTScNEBrF|sWw|9c`xFn9QG3;TZcSEXr!2IUFKuMa?kftvXjjq%a@D5e*6y>G}TZar^I!+9tm^3ua-(?aLS4O@0XyGCgTH*yMM)Cg~>VGQV zf0UrBou$j)!Hctpn~S5PwVSEwe+*>)cfIkce-z>TonD+1ITrL-lbL~PGN+IdZ~B#Z zG`j!`vs_f-er5`P4l~D8fh-kW^bb~RVQ;zQeZd^}4cJl6Owq0;GoA}X8k*O%-c@5- z^EhT}ys&)IaoZR8$)A8`=iqAlN>A!wGid(fl7_5rOcAgl;#)&eOm<}UW2*KW=K~t# z%7z_aWX-$=a&85fGe58SS@f$Ax=~bF__7=dnCk`9d|%jbIS<(YSWnZ9x%Rx9_hQ^A zCt!^DY>3~YS1>JSAyQL-Whu2P>hm`08Go3KqF=-0meL)PaYy-kg9z#LVz+$ucU|Y5 z%W&6Dq{kvy_!&uV9MNC%n&$ziMuncrx{6Nzc4}6|w~q0%JH4L{pcBXuDUr9O4KO`l zmT7@F)}0RE=9@MUx*O34k%BCy6OKQK31^co-QBn`=l`!Mw*ogK8X_l;?jF?)ETLQdD)SM zaMwhsC5|nA!I%0XW#CofFQ zk2^`7VP+RTbDH;08=6TN&q(^HVHf(Yhw9T5lE!s4m!mt=>>JovUT?5jY_`d+m9294 zeS(6NQ()kWVwD8q7=_GX!ngyMdOxhBkf_Y_ZKKuCy<1;CF}OL*X;%j-y%f3Fw+Wsy z%nRy4H0x}MSM$!BPw3==Lk@J0as0=yKj-cfZ$A{_J1sZ`tb9`yEF2rTfot;~H9`VA zo)EKmrF^P?7sKG8>KLPihb5q({6<$u*OGe)uq2-KETMh0`&%(%UJ%S-BU@U~uux(P zZ-F}pj}STbO(b1uQKMJ$_^P0YJ2~@LM_jk<4EX^kBZgp%Q__VpE(thFpHxr_JK*=- zZ%!#1E>*S5`TW8nrK-=0T4K+8Fiv#Ner{Y`&v8C9pmHB^8Hvb8wtO8w|Kg-iYW(&T z%&Goy7c@C_Gc7;U5b%^1D}_n>nSR}8or3=U7W$oUbIk}*lI}~@1!>Akn$uE_S+)i# zbHkWhwFL>HoH2Zd{d@p;rsdJPGNrwa^b5InhEqCa*vcuO%Y)_fOQApo&B0DO$X;iq z#VJEl+VPdpL?i~Wu0ose4zOV3=jb})Qox7vw#A&>J_Ve(EeqL4ve`K8jK5tPhPH>8 zOSZ-rc|l0krsiejr*fYUl64n0J++^<UDo6{79S&FBwNH zbFUd;Pc`5iCz@G)L5z_nG_CNCK{Ix*+F+oG7`AIu-HYpVadJ};#}#~rnOfy%TuQF~ z2-*GsChAY86X|e$wV^E9c(g|&qP~T}ks(#QZ{i)^R#|J&=l1KVYd=MyJ{rm=Zu_r* z$^H$~*6vvGzDw?OHp!EnFuCnIOFVTz_?XgA)C?_j{Jp@6Y4(%c3*gV4YDah5 z*^V%Y@ifbaE&iEd(l!%EpPI$i3I|!7QT^Am%9xLMoRaMIAF(i#1f8#mkIvq=!P3bo z27f@u@;p@S%J+^8p>f4=^oL;$Ry)k?`$p$qc<8KYcDflDnb#FUdw=!{U${Zov%9>)b_oDQ2FJ|X{J?COt=lUj}o3VOGV*uN|j1fb?dtv&LP zF&IDZ4K9skzMtLkT8{*KmI+F$>A9MPZ8T5${l?$HW%P{H)Be)d!PX$3hW@&z^3Fx| zklj4d!&{OY@0&mwBN+qE*(V5+;h`1lol!Fe$x5PYF1jZA$+7SKN^ive-I!kKBAI18ovO0><_Xf10t_w9Ci-*1}n4hs>Z|48nrfx!t z&wJ%o6F>dnUWxJgt?tKVO{6o6z!OFUZ5}CZRM6!tPoe*Dy4g#R0)$XZaYy*iw3)p& zw|C#spvAORCQAU{;dB2DBNY&NW#t+Kn%-hu{Yed+l;puL-r=$FQK{n{UIqIb+S1dB zR=S~tm1L;$Z89FN71!^mADHbM=g1F<#6af19E2rG&v-~P_vIcfm`3!zd9stdrpRxP zkn_b!*ebNa=Q^CzoVB#tUdsse1|LX0%P&1PT@oV6Yv5=)lM)a1*U7_sJxKiOg37!Dcz(FNgP%hsLr?)nBDNkd7MF$+57B6)GUc7N=XkNJyUz-EO!;PyV`o3X)T z-SmEt&Y=dUD%TOyya;~Jpgl*$+KrG8$E|vi;fpA?ghB6!@w3P~{rm}|D<8CgPk~uY zlyn*<+e0Qc3g(In#MDYbtR`2v!c3#;GSTOR3L77Y)j`%(K8Owi^aA7T4}bK&gmmk! zGdfSadnIhXW;R$kxKZFIWR4f**vJ&Vr`Kx6KuK{_ru}pv{NZS0u9|OBbHFP^B7D@h z8uqS+cM2?;MW)sB?E7SG=jPP-j5;Tdv^Sg%J;GA%N@~LC6P9zAPl|^dwn-ZH^+bBL zf_Laa_0-a{_^(7!)O>XY~B~{wk}X&s|VqmEk9IJvDQWI@b{lyx#N%z7|zP@?3*CDt%C0eB|1&@&g9dS zPrysw%iLx4K1Fb+%J_MKa1a9+@0QPm{GO(=v%jo282%BZG!6^jF*eeG0g_uyn+OGe zMt?SqrL)-V+=$^J_|f|5;b+fY;4`iJZ%+mIRoQ*n+F6e|Tu{uYMnuz3=Gjq`u{jQo zU~I4z-qCllg02IJLm(<=}`VgIE$*8uIZK+L0)sM`w7udOn0op=1n z?}Z3v(&D_ai@`{HDpm?Jn~uP;@J-u1VBU<{U1b1~$>j|)P+l14+0$^(W8Jny$I~3u zWQD3TQqI$yQ^jVv6uV0b@_D)OpPC_FANc2_FXBG*9=n&u5U~^a``^Z!sIl=f97gWB zS#`^$-?(s%`y$wANcM_4**AAsS9BZWZH>uwl++dBlwo%ZCNhF--ZxTxbpWLJZZjU#>^two*b{UnLK&fCw+$ zGOMU?merIe#y?vZILj6-&Qef68`5`PPl&!qo^0wL9HtXg@iX@b-j4%l~Vy|vXK(=dRUumE9vAum*vE`i9E|eKt^Lh!qduyt9 z>mO>18!5n4y)p&s?ccpueeGl#UWx8)A2^~NX={Usnl;!nt z)&&*%^^Eo65Q~8?c;l#`Ww6(Al6phpE0T=X_Q!o*6s=`Q(z?Zk^8{yS@j>2?f*VTW zlKZh@$yTUY&*&Br25XhtD%gnSdY&IJki44V|PfoTMMzZQc0gx@)O&#r<&% zCo?u8Q58GeJ~@3it;u+lw1_uEW z^eSh6YMCW!1Z#SSGwMJFnW0pUF&gBjBXg zbFJB6815gD zZs|DV=z9s{bZU=ERStUhImH~ty!EAdxmP316oY;1>9@iA=8OvCsxVa$pG4R2 z^CRrx4%Ht+e1D9S2-x?~f5?hzUx}F>8FlfZ_5HrFddUf>p^W$@d?lZN-oAO37SRQa zrpZXnl(tbKKQ#?>1p&U!V^J+&>Q`@(4SlHVO))c-$ zpGzmGF^rXbKjg3Z{u9{wD=hH$u54%K5bqbit($HDP4#K`Q! zu-=ejcj@5fVs)}{YkN&FL*_{TOdjlD)H0vfOMm-Wt}<~ z_+5UxB0mlL7@%N&!Z%@O*)0-%KQlwWvU!5x60NxkAn0suiqTwu*^o6O@$wk>ptKSj z&p4wzk)XQ+?T-ly^#ANwo>XfU5NnTt(Ba#7%*NKZ24U%6eha)=6ctJ^dCFxkS?eKH zVouB*s2+@s!&7V7cJ+>~DAD^prYI%Dk>UmY6}`_ZIph^giC#>qoG$}6p(9$aVTOAq zh-uTjQwsu7t~j zEdcmv{d_;FMnB2Df|Bl6IYx`vmDyprO}&>C?b-~9+kV2M+v?c1opfy5wryJ-+jhsc^Tf8EIMY>U&TgHvJG(V+=GFZNTvd0~ z=l9ile?dRr+Y=t{#|B3TMT|T2`ahZ;wj0kg1uE3y z?Avxsjzs}Y9qG9*AOsQH(>Bg@MaD1vI-yHI9)mk;>TG?vfV*Q|%WOU?LwmWN%kes! zasuw5xpI`tHhd`fAFlC5;EBSAQSRx=DxBI9tAYaQEAF21~L{JE_|5T9jXFfJF1A zC$DeDsnSoMKMki~h;Bw^Kv)cE_%L5?YPHB~K+bclo^3dBXra!i<}Z&}d`8TwvV)R! z-lpAt@7p_9hpf|;@J+?(>hICV&+VtR`Yl%VL_j;}$9VpHtZ(GLX8 zs)s{ovS@B?E7W(!jYX=yBFX2If_&#~HRBhq!iBUZON$@2By!fZNx4X8gqzsditUu_ z>qi*Af)%_eUDWVsxaE(7@^t)ym%zApc(tT0(Y@fc1X@S0v?c=YR%g=zeHw`20%wFW z+U?(4lnRTeD4P&(Z;?kUAm>B3{YBK&x04dx>Dy{s@5zzGaZ%05eLr*ULTbS;gJjy4 zJN{_v{L3pFE4>YVw^5PSt?K>x`2wX&DRKhC3Dmv7(&!C}#vRnh8beN~^6@hd2{8Z+ z?k2V;Ju)`?R8M4YvxkhtaLW&{qDE%xVb*T@M1SNIoW}2M6IrP(-QJk~GQeIBw3e3; zDHSf(nqyIHOZL6y77C~rPI!ZufYb0YZECv#fUhy+6?9A4qn^Gu^J#sh83=(?bcEdq zgy53~PuZb=iEVW-@a=+|QJZkp!KC*Xt{8Dn6nZM%Fpm#$| z#32%#itY+D(u6-Nggpus2bZLBt-gDmr zLSD(WFWxWCB|@qfV$jDZ^!@<^#kkGlOc}}{mW8IXbgD5m`d2Xa^(n@t;jd*<+&tv1 zSp1}cV}BUr^e_5NU5_+gtE=$+=mnD&`Ukr0Bh+uPz`bue&Sy@ZuPZD`STLdQ3>n`l zdKc&}Nwcp_0=Lp8MktqRXut$?O`d?G=xjDilfSMWZc$kx8;)g#-hQLxlTU)vuWiO} z{e3lb$cVpil}=tzV8{BphXWG0iKOI1(O5wIe5kUh4(_q?{dmWLd0FMdq^so|3DHNJ z$C$i6E9e;-YiX+~>(jo{@M5DtFW*X#N}F~L(XobGQtNEI$C z%J9%{q(07*!0&a6p)#L&9PG77mswt7Vx;1gEF-uXR!hv)8?>J^uqZF^D}x2$QUTGA z{`eFuBDr%r7ZxZ}k}AWHgnf2rjcQS}(fqkk|9IF64@tnak>@d!9Lee?(jMl(S6QbZ zd(`l5FxN-6*l7cQ{0Rw*4aTbD=AtfJp$0+s&&1rvHw-x%bsg-8T4-U!D#Oh67vxFp zliPF@0F(Fa)K<&NWiQZoVjwqBGTd#K{niXH$@Qq zGR4Z~&VystJ}I4dUK!#8pRCGYEV4Us;d~fQO_jrH^b2ny5cM|+7}IPv#2ZJOrvDwY zk&yQR!HhmQm_)NX)j}(aV|4pPuj4DEs$w^fqUJi1SBcpJF|zTlqc$HH?T+y>@=4PA z-0H1-?b6qn{}a#e{q?nFyvGY2E-}pvN?AOlsh8U<@V5r>s<;Z=CZZ0_@Sb}pFsLqG zG5o_!PUa5HJr_Z+&Q4jFRWA4+>!zKR!`AT1>N3n~2s_155@aQm7YOB(+WB7P!(r(| zmHRoFJ|C6GMRhYrf?{)vB?Dy;@84km6_y@^P|p4nmKgpo!R-HATXJ!-G&eVO`tOpN z>Ho~H{4XT4|E=5#HQ3Xz9th@DanKHdS%?3s9;4Fv)8m!;mAxH{U;E^4(C05M#FgW-SFsJ2 z_ru+t5+pN$<~BL40^RwkzjO{ofS49d`a^*=dLSy|m9apaQemEe}PX zxo{nQ!r3!xEVte5mFwPr{i2PZv%fOCE>i)r5%f_TCjR$wZD{f5V($+;8G1O*{Ph9? zu1ON1pO){ovAwQ%k-*EQ5KlK-I3J6f$E()i<|3JAo^t@#L==DP3D+WU{_2qH-8Xy+ zUs;S{qffKR&g-ml^7&U;aurv4PjlaWvhix2?dWA)>&?9pr^f)ne^UtQDZo#&^B;?+=fI{omL)-Phcee5lT{zRE$g#MO#mAEUlxm zbJNu(-y5NqAwz3)$BMz8TpQsx8^MBaO8jNp)_W~*n|t!wJNtUnJ?ot}i*(~X<7wi0 zmh*%jh|tEdrRM64)QkMbs-VE?w6LzSu;AR0mWpib=(t5&$nN_4cv|NpXnXZxK<^jG z^~L)qw*)KNm#!5KY$EKpdc=H*?uDe(BBOs%N;a1)#PCqfuWqO&DyU6gV?cwv>idRC z_+heUh&p|rS(*USh@Ebay8M>tsQmj9{+cfAUeI0f!m#R^Z`nLj9Wz8EdLVyulxP1h z!b=l_F2kYk81e`YF0w*h76eZz@xy8>8ax|WU8nneG5ai}ztL}QMR%&KKI>K(6;iz_ zD@D^HO9FS}QGnXPiZnP1P==j;W$)yN93q6qo_Cgy>x4ihxBXV*ciu7Xk4~~*t3#_C ziFg|}W0{bME6smMLSey$oW=O2FF1pqIC^uSJ&;1_ZzvL^$LE2Qu_zx#TE+5G|s12rYBzz)Qnns5pWY&6*gdf^{ykVSG0w>%&qnWVLO!y zS36JUk*sSTp3$0i2d+fI%H#3oC;k;gI+pnwAY&ZZ$iI9@%>m^i)kjnes@g3FUSnw! z;zV>BIjkm866xAksXZ~s8jM~=wUca3uDav>b6S)x?9F*3>;GX#=dRI`S2}}VdN|13 z@5uF70uYoti3bKMr)n&_Q^^{v%+j`<*mwQ(%R~2QMyE z-<285))%WzzK1*jT~+#OyR!>K{4)nD|6rjHMqpTHPhwL^X>N-Qg2&$vTlrm{W(Y~u zJ^<5FF#GWyTwJ8MpfJkP^`haI2Jc2xW}&1l5)3~-Y+eYB4Xy=!ByUZGA6W!O(_p@O zMY2@;m5#9cH~F>O2MYS1A3|Dj4dD+zG(^3Z;Nm0J@x3JuR50()4fWolDLV2Xg}sgWt5RY?m*r{RKa44UX15RKZix2wO1hF=JPl!IK-;gl zSN;)9sgqF}@q^rO(7Qgdp&(cmhxiiul9%{==kjL7!3?+y+cQ~w0|igxSS|6h0bgau ze<(-9p<<&QH5H8$tX``M(-o0rya9;njGx@tH>b{@8P4{*C;5VRDuCDq_fxtZVmA+0 z)MTzlNZ377Py<-bBzdPsW|SR}VRv9RGAz&r3qIjucaO|&rxBXtM&=E`tK@({Ldfqx z7vfENxLvLC%)5O`fB%W*thYTpupI^{pjm#gps0(5=G7238oo6ZFfc{}*tQ;&j)*UJ z_(=JhuLo{Do$7%3ZKQ$P-r5})@}uj716rK*h1Q3fZ7CEyy=p5giXM~5M6CRx(3enO zz~S~z=adc%?~8zC?u{R!lZQ+vdDv_YW=Jl(H3~&>I#Bm3`zuGhXe;-iFZI`8)qPl( z0Gv!<+P$IVcr`k&+1K4maRMYHN51$eD&#=NfY!z80>qk%>#CwzOdrGJqVH|MFrDO# z9z4}qM$os->4le?lmy!Z%C(FWc!&ZRqC+|j(aegwhHyw2yBK~Q*BAb6(q)5BBG)5=1x`wVCxRdqEM2SkcZj}(F~ zccnTOZ@Xr00FGs)xsN34(tXFheHJX7OPdKsn+-$wX~D5#xFKB(gzbgd+Fbvn;6gKN z6=5mTJmp0!hM}$F1q?pCKVkY>?h!seR7EG9t@A7OZH~;mohM`L3|>!$?*kTyQoKxe zGD|_>kZoP`tXNb3@5Tbrg-R4eKI~NgQQKgdNBoRIH5#3=xT>Y+$Dr4QfqSq-U(}vKGQIgPpaen|l-lu?{b@6V0Cq@q2fCVr>=WLqWmVmnI-) zR_^mV{cVEG>W?D{8-Y*jXEJ}^x@@)k9F~4J<8FzhNXBYw_OtxLLi73yaK9Y?5@WF= zh=Xyi)~-$5JBr(kz20GU2{6efFq9C)@B;%ZDpOO{@3lFy8M1c+=^s$#J)u@AhxkX~ zxQU*IyMy$QAp9V^HyiN6!{f!y(+6uC1Vu)!r{=xBzB+{RtL3kGf6l(C*NcwVhv!J! z7%I)zucXAZ!GY+~v(d+0WeLL&dljBMt`XT{I>6Fmk!dRSPbFwQ zW>X?wALHA51vE$7+N8gpIis-0!#B`Zaf~VsE!Fw}6TWXW|@r`gb^nlQ=d-eU^ zOM4BO+rTrWG$7ic0 z1igUnOekGBAf@2RXpJs~n@Mxihi~7Y2b7jiDV1fk#lS~28>*(S(3pF&vnH{FoY8P z&zT09AEQ4!jCpLgul;CXScYCsw-~8G-s|>2s(YZi>}5L484OWW%uQ*!+90*%_B-hW zo}@VrYQ^x!XEZP)vCqz6;K{4zW)o$!U;zB#u5+yuC_c7Ini_xzdp)>z7+X}}w0M@I zfykMn4xiYS^{)*3^yDsjJAf|-y`+s5vNf~u1n7k(6cQzKaiWd4_G{K-;^Oe8sZP%n zqP-5VnjDG*sE!$osIgi!+=sSm^7=`YA}A;Z+f5qXLt1Wgr2buvf`|w2__ap#1Oj^O z>H&c4Bo5t6`E>lmJDM~7sMJ6_#!T{{RHi9^0;(HVKwKYvbFlQbh=u zdcsK~7V}W5R)P+~SbR6$hMpV^jS=&4G&rSzxz^kOYngxYV)%bP3rZp#l1Fo9495ky zz9jD9bwkl%x-Lih?F*LFOpdDs3ibB7S>4iGY${*3swY8TNMz4cevY%ML*CGa6?B86erzk7!u3oFL zvHj9;t88j9d42C$r_G!Qw#gXUN#{Icg7?4qd{yqW{gIkZLn%;CNtAk=)*hKIBIz|8 zq~4hh$8^GcH@5`q?9T%CEb%B@4kGecH$kjO&{6idQ1oLQ6=E=>SI6UPfU)|W${$e8 z`&UaR8SLFieQ5uiY~a-B%xL@7?{Us-Ssh^W`RzH>I{z1;D3xjbuxGTRpn{06BO@kM zfRbQMR>dpu&1QmY(fB8#u0HBY=NlwCc7`n=XE@aHeg*J8^8n26?jUQw%>b)Nyh}2g z4L6XBA1p_?5YvuVTaUN;ITzED$g7GBi0WJ?A zJ{^H-y>#82ZOvG#W&Wyncc;SXh7RGe>^}X!xN<7m`RRXR1evl&gA=;w9N%Y&K&?u$ zMhKEfhy;M5D({tkqJP4+HgP9HFEWfU(=o4h32#hsHN``Gd+o2>PEmxMTKe~vQoT%i zSpafzqoH+WbSIKZAD`A8Ea=-SIzKVF*r|3oe&iGs-?L-mTPTDdwV@Lb*mA4#XL?j4 z>Beev^w=FjQdezxfGY9*^MSaK~yJ7np4nAZ5C7r*!6==v#OL((D?%n8A#b~RMEECy_ zeaasI?#3+G`ikab0}#{SYZa|m-$nVI{#h?TnkPaIIn;qdOKSUHfw17VomVoSiJU1C zNN-stQ^CQw*&i|QukYUw|CM(u$CMBMlav_$|9SU6Na_Co@WNb&=12GSwcfmB5TWp2 zrG6$>c&9ma@;ABX_*c6u9!oq=NQKvNp7FKz5oJ-b9IWZSD=;Lj$OyDs_E?1h7_(QjY24D2`Mx%F zZT6Ej_OeJtErZz-xhbg>^XS%DRs2b^w3z zVRggP_t3LY-@_z%T3>?#Px?nm=0)UZTno&b_!ZKnZ5BkE%lW@RjtMuPx$C;=JB-bD zP#n|ari@0q4E7nI(Y))#u#NA#(|7YeUE;BwaAWqx#Y_GwDD}B*M+;U!%G36n92k{$ zcewf7b?moiN9kWMZFq*+cNW6W4=? zII2k{ZAMtacy=O*`{Jz1+d|N7A2*K|c;gvpG76-Daj z13}4NU*{*ETO{}DCVTr3mrpNUN41=j#Z891cb<0R-4tybuNX7dQ?+#Q!l|E(L8|R0Z9G3mrq><_9>V7}(bep~*UjuzE4KpNsg!wo3*_4nt-l^*gc>)TuQHk@g*Va? z9I1YR?I9^vPX-g6qL%nICYVzE=E`4`Zu!jo+9BdvYFn%<_=N>pGIv%>< zQv?VG5ieAwZ<--UWbwKN&~)+f3;&c0N##?=L89j9kHIMAydFSm-ozTwy*%z0uXz=x zbSHdSBll6J8U!&DVo48~m&T<_V`$A_=@>Wyy#lJtlyM-7VC~tP z_(?^!?Bzt-T;Na3=6zqh_z7X!ayyw;c!T~e8Kl20u#+IPxM$0MnJDh|8HEXKi>3Bu zPYwxN+M>w1Qx!BPowqfb$|a6P5N6>MZJ;(`FeFKR09b1z>^T ztp6d;lH(yNc-1#X7-jTwxNLW(x5Gg2)u@-5$_caw(NH%L$`x?XpizKD{84v*A@iI@ z2E9DLG7gUi%8ohG3I#7PcifZOIeABKu@KFX#mtXLC%m5$Kk%1fvr^D$hBc;ST@?O-Vl70iF||3n*Cw(y zZ~S&)9>ghPAG=Q*c?gYP*KV#e0FhxZ1_;P(NKP#`oz*+Q3;un}V}yEpVSqT{+_%d0 zO$RbhbynrGF|T%)+9IeBimd^x%H;~M53i&$YJs%;vsYHir?9-yP3_eOtWf z3q|r*UI@tBWiubz7)d!CWI6`L1 z21!%x=W@S8Uq%WtI#7s{o`KOgX|sxoCobS?r;kjFl77^w^kyY5g*m$Wx6RNl8Fu7* zVrA_lvG?wh)1>8xq~-(LB!*Q5i^%&K_u7aPQ)EItQVdeT`M3XImG!X};_9mqX!G%o zb-T0*b#nRf6$7n~S*A_jm^GZ^^Z}x+INf?rhJNWl;H@>&2?7f_~%HM>hp~nnV?N#Bq83A$cKzNE?G7D zu~uHDt~)p6-y4<4^+9fcAgCBfJ5-AJOG zrL;5=pNO1{{pc|Eu5~%o z;x0fZ?D8Qrpwh-%anHe;K8Gj}7ux8Je?cP(+HJF2cgeLKer&CNT;ELJ|GD?_#nMam zXnn=(en?E0WA|{6dQUAH`$3rGhOS;5^U0O(e)X4lUsZBeuYtdOpHZgEr1eL9NJ?F0 zyQ&$$}Cw{*tpmm|A5&Jo^hx2fb3HrFv-Tom`*;1zz4e1u?aLPcmv^Fy zYWOuGW;a_)kTU2jqx5tSu3Tq9Qk7>RPY&d& zL}8RKugA;7yJ3XtruL&Ppph%x7OC>MlkM~42Xc}_u(tbDLj;dNv5~_N0^eRy3mP+7 zagyi2?U=8E()j*^!gth&p<)WPq0e|AO>fI?hvy(X$cBx*Di57IY0Hz;_bCP)$qSd1 z*LS+U{$CC<3yS`M%3y^B|Iu%%E6gV6n_vm48u2!8>%H+YT+*TH+)mVE){*FGpqv zSSoT5axGsEMfSVrqh5g!3hdNa72PVsOQ|>4ymsob`*FOF+%N3zWIF=*X-ZJ{(5Xl@Izum5J2-T_+6{t0whx~DhJV2Sa#@r8%5i?7z~Z*(e+UAz zg5DJCaW$H_LmRg3U&5{QxU9~9-vijywKxopIzd%r6Q4q=9S$P=Dq9E~<7%&X0I7*s zCe~uv{TBfj67Fh8uS|FQfD+Rm*}bL%uS+X+B%CRk5NP>Z^D^dzTYdk9>S-!0TEi;A zlr^k@#fk~7jVLYHi!N@@zsw5KbiB1QBvAGPv&zAtHvETuuIqZ7{;g2xhyqJ*DSbid zP+FdiJFH@*kX@3d5fa(X-)Xi-HWi>gQSt19H7I+wnk=A)F!)AqVwE+1rZ@_#(MUs# zrP(C?eQeoyen^iW`&yg?Zvp0t^Q(Zs2?A=^)2X*Ox>rpevZVF;WCAi*_0^uoI)}lER0yIT zo4!ne1b4Fc27hIx0A(V7M>tw=F!t+jPZYn$SW92tqA#oo?gZ`C-9y2Y{DjQcBBC*f zVc8A`67k{H{Ol_gD^XKW(w>Yh~zn zg?LAXA#wd=awVnl+{4_>C~>E3tQ4B8VzDG(zM8A1f05a^=ArSNa4?wS!CB^;FNs~I z6qKjX<-XX&UfW`({VrTVyb$#E|#)g6uKC z@n1?=0L8vez9%h8K7}Q$@erH+DXXc2WM@txs1MxdkJdT=D!!7~*wP~!fC!skmRu)p z&sR&jre%Q+_ls!nbWj~SZKMm=8;tvgcd2^o5C=7{=xLs19hv(a>iBeZx8Bo=Zd!5N zkZRt4x))2=B|Ht!qyDTE4N*0x&Tn27Q$5JFL{ZN8D%&2G)d3$A@AJH8hD{o}m4h9TayK#~t7#6Eb-{_zE}- z`$2H6&3VF$7%@FrNFE=M?WmngZ#vw|wC&on}(+ag9N9#tG}~nm2;* zq6{RI5Uu^RRr(tkV}_T@c|ql5iGaoVJ6vQiWK$jZ+EM^TG0^qLX+&@dqoGfULZsg} z{AGKXZOr-b5BSOiNFIVi^{M26pn}kxpP4%CgdQ4A2!owqE+u(ucp*t9B&~tOayu3_RZ4ckr}uo4K}EE z>V3Z__(6_UcsQY-igh-_M!<{C!RaC)X9fcdp=@R$f&Xyo?}jT6l*?19SU^oK|24zV z!`TasWXpMaGl~sl$+;Y)89N=fQ}`m0F(ESigAdF}kr#0m)9I{XDK{EdL2|)L9xPd` z$i#gJ|B{l2E77nC$n6O`)+5Yr~N4Vq~F48yT zA2*x)X(~(zNc5~vBp)o0)tDsQ_4uKFo=cIP-WZa44RjH99eRf^CpG7STkyBftA9IR zgeanV^q6f~G$j*&{Lg{#9{*#*#@!jY!F_m-D+Y{#xo^SZTAd4S{OPd|RZ8oXb9j_g zP7V!Zexz^t_Ax7hS}{ueJ8Hv|^MnVmUxR!pQ6Ku+ed+Qwp-z2`(>-_5jL|PB3nDD# z_vzy^yW8BM5N+h%t1Ah){HknSF?JZiou^lh*!0u8OZXlgqxm7wZrutx^JL)WuI&WA zT9N#d0>2-hs>NA#c<*TYoC;reaE}JJ{7#pWclx6JK&;Ai<+IU9D?dorb|`H^REU&{ zZhq7-Kn5u8N+48Dqamb%%s2|Xan|Vh8FnA$3y%?cw*q`&TSIMdP6zK#~#0Ehw&j)Lb7m)(&`{|SBWiJOuBA9V>>#B^A= z{2((D_~!zE4?*;N)81N?JCwb0?9=PGGx6$0`Y_qL`f{fHDWcZ`j0UMHak*b{L$YsV zGtaQde`gs~Ge3v>jensJjIsm3yn5VjSv8HcKiPBsW-(p{ z2A|GF1kGIU;$V5{Jv@a!qkW{>J-!s7A{ovu-zS?z6kK+$njifJU4AlWqHNsiW@pI4@>mLNpyiTT9fSg|d2A=AB+rq(%o?euX0LA4CX1aw# z#bBOd0?8k~0&x4(O6O%)BgAxQs;YdY{VCKZ%fF(zGDh6|95?Q^2i07`=4It1fjbBA zo%391+=pm4Nvv>JTWOWbtV>U`ifsEc9x6PKKHBt~$ugplo4RhlwloZqxWaVsjpn;l z_rY2oY7AIQiOXJXV106@clZ8H-!N^56j%2(X_bHwtg}t;C|zNO?nE5oO=L+Tow(c={=k@Zk?n_w;LQOa-3IifMM!_t)TteGW?jriULV zPD+T+Ck4o3t?*xVRu!T_x*%!dArS{}nOycG#4#n5a$Om2i+sK=E*#IN=8=>9WU5Sg zur`+TjYZp9S%MQ+sNuKvw+!Ov>O+@L7II*~DLmnkhqTPgh0R}v8mH|XB+QIX@UlRQ zja+6N#FDXXURx!`lHQAa5rI@XYCjg(z*l_@H=#iPS|kf@C`AP3H9Mkdk`_PBa3C;q z>~DI*R}Nse=Q7+r_5((T@$g(173*Er%;Sf6C9%Y$^qVcipO=2g*=`aa?swlTScht+ zpz|ktzOo?3s6&}tb;6b3E1>PVR&lQ(X#@LyLt`ZECYd~6U5tk9w%HCKr%maI`kNR} zI`!grNNQ3-@!>%ANKn4)cqPnDRwkVETt+&Gi#(PFfI#%LKdsa$mO=y@D$#FBAwiJ`)97DQ8*m#)D6V3_Key1rNsb%rOO@i?yeyrlrqOE8%lnxj0Qui{|R) z_NeefI1snl7AInhq}DO+4n+KESOsoRTO42Aq8rKc%pg~{-SrywV2@deYi`bU_`MSq zJ7asS_r{uU+JX66;dgKG3}rKZEkFNaO?kIIB0 z?`L(jzjK5Qs5EiC&m?$g9W;bvkw1$2hqcf#eU1^Ed?xn%fH{qeWT-TuJc` zgfRpLb89;!{g{r3pU(K9OZk0LhkEoLjnFGAiFVHOuKiYku}Z%h&@;Tc{6eyop7u}&vo#f1m0Rhw=*KX3IiyZ1t{ z!H7EabLz+onp%%HQLc7Wg5T zWjGCbHy=9~y}>;*GEFUKcNGKR?F4$v;k;H3>uS>YA?ch1nq}=12J{mXw*VTk;@0ip z^yqwn%Iqx?51@!xSTfVH+}iWLrjg;R4IZ3Cg6S&t31aB^v@HAm%aojBnH-v|5mjLr zz^k7h%bq5?cPnZ7^$Z*M32Mm$+*RF+Z#JO{i8W`Ij&_S$_dJ2I#*N}D{4#$?)+<(0m8&+{;Z6beiL~AE@1tjpDWUf^B=1^1qqKG!e!O z3p37sGQ2{An6UG6EFvHgfrTB-eg2wOw5aje2jHSq`k5-Bc)6k2X*x5s>6VKi%V%ln zE-XhdNgCX8Pk>Ka6SQT2h7mC&9fg!YK?JR=*53P8lF{Uf^7IF#3{0WU!7S-uEZeWa9ewGOd})MLlNV#u#Us`c4l)Y{Q>dEj=_wdh0x znDWML8(zegUlv#+t{^i$L)E%X@TEGvtRNaIdBeOjsF*pc~C_hOiU z8KW|)Xq4CSRa`x?A*8_dAtpjd8tfIW;(bu2zJ1*NL}p+Y3}~K|#^#7W8F&SVs+CPx zvflslWS6Bwr+7TK06IUDd~+8|l-;NlOvzq*o*5vK=v%_iS6KuXuf{5PhZyXE%Do;? zZ5WPq{c3R0>yd*bT^RkD`biqWmu+?p$aXWa;AF@}$%kUt zX~_8;=Z2KNG&Q7{Sxgwwapm^^#$(Kiuc^CREhG^a&pO9+m6Wol%Az+$G$l;d<{jmR z!cMiG&4^RZ7qG^ECy-XY248acncSNm!fM44PdJ?s5b*i>Ip2#MF&MK03+uZo72bm+qx^<4&Kj}Y>xhUmh_;bCuJj#;$?lO94CP}^qh) z%Sj-_`t4JUezzhrcF2Xe2HlE8;Y;Fz#-=L9)7J@Hje#>1@-MZ&_B{9U1@axEdtT^# zyL)t9Gpp<1Z;_dm-B97gQ3Gl9f#d^(I_ZaXp?bGx9!B;8$}xzQqEit#NW@i0_Z^Ep zY!;^Uk!|9Up#Eb5(e8C^N=FR$e+yPEa^QssCfZghCFT+mFN+5_N&*sny)6JeI39Sf zT6XzrxPPrHA5C%h1l!NXpR7wfEbQ`)1#(s)1>CbYcsKAwq2Q-59-_m+vL2B>jmBrE>A4j4uco(p zK#UB89uQv@V8cjJLUG#Vy@F0FH}-|sD*il^xAN&xM|FvJso@~N3ONeXxnz3)s@@Ij z3g>I5B<>Cc94|f{JBq>^$*>;U2#Y@fbzV8M5+BxjY#$n=EPU%yGm%BWttWz@n{+YT zAzv!<@y>%rDvOJFy(0Ss2Hf+X{Roq;S9B5_w10rSJ`c@qR9wWn^x^=^uR%|l87ev{ z{>=rVn0S`E5A`nrN~XFLxfr&?Y~@LL=Xi5QzA30Nsc{+` zBrF@z+eQ9x13|cf>Zy2-AHKon2JIGIW4k^kROE$JhxZeMqD2~1n^=Fk3zT+fe{dR5 zDaF+_@SOV$N&^S_-hkifWD445Hu194su8^>aW3FRiuIVKKMP!5hi2+i?{ut#w>Q6t zJGSO`eorTl;rKpSB4>2;T`7!JhbeDOrX?n!q@ZB{lfIO|WECm}+^^|`I%57#W+B2c z)}gIBqdb9v6$(a&cfj$kfC9zH)rT^`B}!j(khpP&0jQ16_+2@2o>wH@rB-f3w_&~l;u6LwuUxf4Tz^9a-ooP3Z-vdu{PHxvb-z9U*( zkkBohv7V15s>P;S9+G23BI3iHk1>C#H1dqO&Ku|D(7)Rb&vX|8z*1|Im7wDL#xP))>4Imy=n+a|Jbg-t z11K^+6p)10)E|x$Pd)!o$Mi6K;6x*C7moX?Xn*J50O1YF0^at>C9>Q}Zy!F}95=F9 zPrr3UE$L{2ad+ft>9%7H2*1q4UjC9zH=3ZRr`viUeT!l^&!M8XNv!Nfic zpYPV*uy5W04@~#uFY8SH$r}6i3rkLLesYNq7Gc`r_I491-X?^gBX%}xo?N7ox%tU1 zcJM0YLfxN;xw|?pv+qV%B(?9%=9fa>DJa^Oxg6=uxd=qXAVP9S3!`(&r)l zS6_x<`>f0F2`WEG0^QCBzitZ*ey8nvYQ+qNzX50g$5A3-uQ6 zw+;ZiBhi%6-=CwS86i78?S7RxtC-6aZR>oSXW>9H(O6#C(%x@N-j$Mw;xuR)ckO4w zkL6H1eRNFL-x;Es;~+v$mCKS-bQc{H*^XmtiVQJPqyYyn@&D>v!uok6I84w1Kb{2` zc2IOKAtoB)7S={pPA@Ei48So#N-w8B-hiUY!{!39zJ25&;WaBP__}zD5kq{x8J?Hq zzxc47xt+Q&xZ2x_@@Ec+_+CFE0wIwfk<#Bauz;jFuni=+O$2)FXkM||hQzw!QtH+8 za8dTu3uIc!yN!#mZ>X=iUSIk%7a;U6>B3hHHt$AzovZ6D zOyR#(*<9H|_<}&CQ9I*nAAyBA8qPimB0SJm+-|D;86kJd3=*hm#O?Gdoa_Ax0Z`66 zJ4#ziPYm>qm7hYm*tIvk%+17HAqzL#d}gRyVRoYa@Km$(Ax2r7{us&<{R+=2J>!em z78B-YQqfru07qfL+eGe^4s5$)A??_(wAbE`r7RKm-^ng|;IkmQ;cppa_)l-|?}6gl z#4aLQ`eQeoawtaRXU`!Ials)L&#BEC%fVW~mZjXYm2rfhB$J$W?#atg_rW*tlsRs@YXNQ9xf zkL^M#j-VSD{|e$zY(WjPd?zR~O6OCR`z{_NBI++M-fpB6*f=kL0k)!~#2wx7eKT&R z0<9sN>W_iMb8s7>kt*4N1B=OW{?|%%{uTB(Texatj2^z2r_V07ua;)H$ki7fjq(cq5 zGo6DcBLTnvN$>#T^QV8h*6}Gohr|J>8e!igOR`r`Q$15@m%%fQGu6EeURY;@o8N;4 zQY=4jj+{wWzUG_v)3Fot4FOxAnU`9OQ}gM=szvCrzVtS_&YF$;(L&uJ8VLdvdq!E0 ztVQ`~mht(#tbzmrarE|~4FR5{#D$RmEmezA{r#i-OPSt-t*@R=x)KU5kGx^9QPX3( zyv(!J8j+$hf4jY74c3STZzRbvxSYE8Ub6HD;%Cn2wIg1BD6RQW@ZjI_o4#-EmrhqX zD6nkz>)4Jj(!kcI-09@B;D9U6z~t#)qOZ& zR1)xdH6l~2N`KquC{oyuu3H@Z@kq?<)TdQZ_k8>}{;Z2Kpz#{ne~O=i?r_D-u?Dkm z0L8nuHERfaICFo?{L~1TYeG)$N-4ik&>C9j4y1>L$G%&ey>BCR#$BjDekI@}a$d~Q z=Yck~*MA$pDu~!2`|?WC=0KXhldgVKcW@}IT)z6L4u^(spwA5kHslvzP}Vu}$^$L|6s5Nd9)*HQ9q!FR&LB zIT2xAC}q@1Y7$+a(&~HFTMik29%Q3^Q%KTrjW*V0#}|11^)zrIfMhm3M^G#E`HMZ9 zrDkEyBCtP%Cd^DZY;Dbrzu_rFOF?u@4a__Ic&<5G2^69`hR(h+*$d!9WZw5ovj-B6 zr-zwoc7ba8XCV`8Ii&KkZ)y8kHeT)2N$9S5A>_qNH#4WlcO#(k$nXOVQl zNGy*XCB zuLG6dxh;?xk=k=ytPbr9l+I%)%7d$XF^sZyEhy!rWh*Ex!il`EGct_S=l?>3!A9Q> z4}&Ak>efGld306vdy3!(Eb=uL{!P@aM-rD(-w2Y)kT}Vo^LQ97$-j4NVivyD zeBc)FDL@w3p=BAB7Ig4a%c)?xIpk5|{=DWe9ww#F)VKQPp)nfW104Tq(U^ZH%ZsMh zU_9@c6!*OxHcn$)raBhkVeH~t5o{t={&PWQi(1}T$YCnH8eW5k;mvfm-pivXJhUM7 z!;>bUd&EuPXF_Fc|P!mxtt z++)4J{CaW*EUgClm(*qs1~W+#B<>3M6D3@oB^G+x|o zk&2pVb)5~ENN5+2w3DirH=1bIjlIe{1#`2H8mH;0_g}9s98mbdKmta4cJCVRF0@N} zY%<~L1ls&)X46++wd4DVe`Gbs;n+-BRQr7bg#P;NZ;FONmS^0=klY9Zl2WRb?LDw3 zZ-hu0m_pO4=|i4O1R%2O46sEuOnDuTG;e=Krw& z+Syz4M6NIehV5vjHj)QW((K+RCAFnsNzr^s(YCUkrnvt&o$kDh{~2oh5$C z&%y^il|x;ub;z+kcbP%D4E@zSF|tNKhb(iJU(s#NL9c@IkH7WQ{l~6P+y&7RJ)rJG zugda@ggQnw3g`z%;qU6%Z_0)5(VLL`QT;DH;9IQOuCf~o>|55kYf41e&3kakvhh3O zefn4CQ6L2^7{9d=?=3}sD|bbj%Ljq)ZCn!GzK;6&m&<9c#(txa%-Z&5PGJ;Qjo$1P za3dh29`DMpNsTb_ZDs)*)G+?xx0?*USw!M9+pa0K@ zu1+`_M1dnQLgN3f^&?E;N>meHGnCg{FSK8;h4*>1Jpn%}f$RDq^{%Nokiv{;Ntf8`+d6|tL_KrBFntDTM0?xYSj@poZbuB}A9eq+HQ=+#!;66qxrRx) zqh#p+EtGfT@E~kH|9x0Otr%4^CS_t(dy$fF&Kh0Y7@YnbwM;ogLcu}xVON~=po$V7 zb>uG@X?Js1_G0UyljnM^+tFdDYAo||VRfed{J*AQLUpIU4+VB{S_qAxk8Ew1yOix7z3vA!BUPgC-!7QrOLMBf6pua}ZB^u* z8bCv@Z?v5lr$F?_GjC^BsXzZxc1Hc~1r+Fc+%jdt)`irMTF;$h=!L!Pm(vekeu~PN zxtOv|U%{7rTd%m(d6@hf?z!<02Rf;EOQs{ua6MU7>2LEO63n%qZ5W?MrL?KjvcKj) zg+%-0GbeTZc^D9UEM*x7y1^~nC!_I@+j#^3V6`5KIqTa9T#d-Mavf}Jr_qJM#;l}+ zI9QEs$>eCnA}R6a!xDcRKwH@vJoG2g-d!r1Cq}!#K>qqLZ6y(STDv=Au2RoGl{$k{ zI(rEa`!xK_SuHHkN-4dK7##R-9?7KfwjA_up!)A}ANpmf&G=_?r~U}NTh-f~M90?C zo7kmFLHw~yZi4L;!qOK=emc_&qFExAn@R-O_`zgvPNcs7w7T$h6m!cW$P0A-dv>cB zTy(QqQ@HX_g+y=TWKbipPx{Md9?V10>)kgRXBJ?D2|^XwyW!=ZzM>~SUBLLk@sx{E zG3cng4U4p1MU1-?**#!WyuEh>lpZ~{ zo#R$Ok7Pxg=#GrQ3g6(U?}JgGIeSr{vWtK+aAT~iBGm}{S74i@UxLUtwfc5dlfmDd zTffC_6cV)rmZhzz`wzsLC|RwAgPtvehQ~s~NL2K6$hgKV%C(jLeCbvTa@a$EPyf~! zEU6Cj`oAJWw8E8`*5oo|uhda+P(Kv@Hr1Xm*{MrcI%1BUkncc`V>c44zTx3W)%~Rg zN$UHrHAQMlw9;q6rqEWUFER@Fn5I7V`QuTqq34+l`xexdqs3nDP>9ZmO->q(E&?`l zUOBZU8SU3NkllT$0=|v*i0`w+!v?FB5~i~Vt~1 zL!w#&{u;B;X!I}%H=hCbr~3-Na<@QX07nh}{48Rvw`G5#frrL4k);pbjd0@3z#dM~ zI`lmBCV{|J03Pm71>VXvpo9m~&hpNS&`@5Dzj-2=YW~rOFW?SL4TCApn&txcJkoxy z@`m*b7CrPVWmI3SL(a-%`pp(H*w*u3`S5ZSTqRa8T}}B=`^=%^k$V-yUwHoY09yk* zKFP0pVq_9Myda;gp+o{j%BJvSRXSDv*!6RM0r_)qES^!G*?bNT82WBF(G{V~3Y@oW zcl>9=!S|ej0dvU8zCUmybq>y~g)GrxGSD+ZIR9&WExL31vgMz?2te|uWP+GWp;O=- z^U;AtNUS(?;b}-bRsMUks_)FFU?KDwW_?@)53XitL6bjaB+?-zjl&oefk+=HUIdJmQUErFW-;CStJ zVjlMZS`?ridb+m`MJ7$VI%WAl|8PsB!`1*il0G`$HAsP7ox0+p=G5m;2k3sUwm106y{5{65c(tH%>}C9Etr5r&dZsV8j{*v^K?jQ>@)6yrX_l&}!qfV)-aaNAu*4M{ z2^++L%#As_ZLdV6u+6*ow$%W-^F^FpWMv*ETt%ZfBeCe0|DomGOc}@}75CLHg@}so z+Sd=UJx7&sSO2IK?D!AU0<5kub^pu8y1}J?l?43UKDl3&x={OZdM44&fX9oz_G>$s!kHO_Pw*7?_~w(pv|S_+h1pqkhcCiUMD@ z(4Y}$>=;!)bH*3ZGr#zJaH1EAw(P}5UQI$xK8^PuNg_C~Y0sxH=Aax)&pnva6l8GW zdSVH#0=3!g7XPI+4DWag9zIs1K7Xhb`ZvzEF#_stVbwB&BM>;KM02l{fSO#Z?dA70 z!Y+^GQ(|AHk$P^-wrbOk|5ouWkWQ|IW3>BOPsPWh-S0mbk*>}`RaG{rvTg)&BKc^S z)2G29=y-j<81?gyf&54RU6CTgJvk>H)$$G?Do@}k*G7=MQZHFg!yPfHN7f~snLt0d ztgrnl90IM=1{k~v0X-c}7JjSV1#gt^u7#h8M4<&^>i!?eaDvxd?L^BMczMy7>zJic zjlcQB<6m3?iJ(OA^V<@~A|W1Uq@dmjB6%C(0;>7KC1eb;4FpxRj7gv>Qgolv z*9}^KPM#z5mm^%J_PC(SjvszSIn+K_frPDwWzSG3V6T9l{cB@X0+z4iE^u$?-6L~?8ClfW#KfBa$> zU+n-0kww27<&~g1{sOt9u6^kKltR|UoH4M!EB^7@3=wIc|1)#B+zWlaw^V$+p8TKw zjTvm#!Nom-uM*FUfV^Eqe8a3ZRs6$mtPcp?p}_81Y}(HcLue>8uG-756rCY9=Z$1G zqJOtPjN0xS2F!4GNZ%Y0OwPTXT&);{ZO*jpi<@1*kbAivUjIOYF-qK~_l8hS`0pP% z-V~@0{8IN}mHPf~;Ts|;+;$XL!NrBLwsa%+t!Zz%kC-kgi*U2A#md* z@nK-(JZzVy{mgR0!I!Ye>hAqbAn_S<_$%u$I;P6{gfn#-`QHqG_OWpe1S&Xj57?;d zPtK$1eA-1E7&_hkq-TSNJH#+!8^LCH{XV{BAgK{8e@ZoFel?BGHk=VXlz;;}JYAK^ z@+8VIxPqbVw{}9_h}!pEy0i$C zbF0lb@}^KA>9E`tTo3HJdd>9eaRT`Mm6HqoAI`stu~D9F4=ut+TJgfyLiv!$%Xdik zau&LHsTfzh(FoXGmnK~JvXJx#;b8ZDi@=eLRp}Y(0QLTtl)|(w$XPM|At9X)xAufx zZ&T<%btitFFxk0I)b+!X?GftnA0;<-Z8K2-?P7g;ex(A{dk{`(5r(0=V&q`3!YdT) zFnzbzas=Feer-5@X%rTCRV{Zl6420ZHnU-qYBa>#>Za9RfR0~@KHpnP25)hVeTDg> z|Haem?_KJ zL&*?eqEob%T7rt6xaX^@e1^D=Zo8}MIB;sVpHOS=Kw2HmN6I7daMc>iba*0$D*ic| z_SQ$MvtTM(R6HbZh`cUnTRH$9>Hm@$Z+CA&{WR71^&@FWtLL5fBf=uMZpWQ*jZQ^| z0@Wjrq^n@ad7?sD0uP|BU?ZxO1MzK7=0cWcK|k&OcHsZ;|8H5ZisuM#!cg#r4i_P($~t+jYt2+`b-tWv4~rX ztS%i>haz$oedB}4K<9SjiH`LDF?QbnRKIT=S1F^+Y_dY4BxPk>63Hejlon-WmQn~I zdu7wGciA&;duQ)??Bkq+$|#DyzJI~_{C+%c_w|0?*Y$ed?`uo~HublrSxh;c@QzyE zI$Q_c>g_`OZcU)xLX~oz`rusXh*%U~!h^TZNlAnE#PeS=TiOo)mRo|lkrn3Gy-VLKr83FL$VJY4Q3qYi%>?hmaEX#JjB9W^!; zt~@ZLG^s8FF3K~RVh87mfS{=1sFk`DOK&74`@qd>~0)J}7t=j6)`d#lNa z-#?kUeOwhh@K-9{UQW&o6Ufw+)LIBLiIDN9;}uuik(yoAbxX@hsF)c{NC_dpF!!%x z5y}N96+7p)W>E*RA;NLK&nI9x^vV5czD6XBC2e}`dhotHF|d)MA7~QXOfAkBG?D+OJNWr$ zMCC;*S3q_Uk2wkPcSn_hoI}xL>G>Rtk$g9Oxl}}S{r>aUCKzJyV7!*g7{ zn=_n5WuKYw>|d(TWa!5!68A}Hds~AGTERlM#DWpywMmeRunm>@)&@T+OXmcibi;SS z)vwWhbLbLRU*L&VEcgZ7*04VoKy-aymQz<{npPk*zW-lq)+9R8Ie4d)Y7}V}HiT4P zYedoVnmKWk!_Xw#ZL+OKfSPM;x#iFM5#2Vw4*zZoaLQZFo=Bg9JSXl*b<+xf-tObo z0tC={yAs0xAMU@XG77k}HV8oC5}mgz(umSa^B#Fy9Pm%vr5v3QH^f)Tn6vZO3T);1?+_js?Yrk+{D=H2 z_ibKV%YjvpId{aQkbeM$y-ONBr`(Pd*|mq}&eTBhQH|J70mBgIxu%&(y9C#}vah&N zEI>-ILp1Yd18QSiw>`I*i}D{2O!dw$po#jJ&RmKEPMxAQcur3||6V)otRET4Ab9f9 z-@5k^k0iDJxt%Q;1(gID84rFZB%~Zq6iiyVe|hvwSfP82{R&|nCv?Zq;!E|nd$->q zK5I$0I<0AxLHRZ!J8~3!ncd#m8m=G;{j&?swml$pQZ3pwBoFtmUaey5hZqeBy&hUsUgB;kzo-tJ)*GaAplo(2P-b?h>!R zQP%$cO`&-ePO2Fc{t)O!4>i+vx_f(Jn`9uK)1V2)BXb?NA4S88-8d!5FczX~jNFcn z&I6g1(LhUG8<6{?G`6k}qpP-$#KkP<5J&i@y_x6BfWLA?GHjMOe+0Ljtrb!ngugvM z-p*bjfV9CE7OeCz{0rF|aC50bd7Bq*Y_blacdDX_@8TyRsDM7HAOMHXRz5o>-Vupr zXlpp_?-7tM+g4-wzXnLu*5y5tI{}<^9%Qaf#QXo%3FZ1Qx2{42Ynn8;4kGohBm@EyF3 z(nKHWKSD5}-b^hT3#Q3W?>Ja5fNR!666*A3NZK>&o_alwM6=#LPE?vhL7HJhyazhT zRPa&3#iPXi&oj`s$7Ut7CBj^^xBMJqNMU)UGV#;u?9nE(QC~i+q zK7b!(UVuJt_u^lfBikgc!y^R zKAKz-)}UX8Sk9fGVF`a|+;;o%`Bpoezj3P6Y;y@+WGJwDH@gUnYu|UQF4n;@8L#oV zKMjaqw7J2Ct`x2hu_|grS0EYD&K8=&b>N-P;G;E;Ci?!3I%Z|}yqbhw!}a<<%FAe` zk^2PsYYaMXqVG(4x)BA9y*&4Tg#a-M!Zn2gjKyvptYcd}(q|h% zo3T0c!sP>9$d<3-$%lvA(N?&&EaLUQZHNCztK==hMYh?Lc>QHKmQv!k_@n}*e&e)O z@@Pka+-|2B9G8)DT~G_5W)XxQh;e!L`yjr*7tf|gHlUJgWwEzX^MTr|=(5*HG2D5` zVktVb4&^BiMoy>25Z(Vz=}tu{s#(ZT@CYgIT!a9^{f3Uc8T4}q^V|J%Go1HHS_z}W zBb>qP*sxs87VGgg3?VSBaI zmw5j7cYQYv+D~in=g>7Z%7I=~dutAx$C3_RPE4$qXPRLxQFA71pa)#TOv{!P5(#229^ zEEMZGlF&;`qEPm%S2E8h(Nsm&!}X9h0C7hjU35$DEIK76Yzsm!ZHWdOAEaW z;;09hv1Tfj8HX(LhBJ&MO-PRUeuj520p4S3B5@9TJQOUxR4ICriCEHp7e&gCppmnJ9>phC;HTQEfaC$^`W!b~<_Ri5PpY4j!#)=6 z-=+C3qY(t=PL!!*XXc?#yPj$|s+8#Z0#4%|jxBiL9lR}k{%Q|$J8EER&@_&c)@m4e z?pB~hE(O!IFB70r>dZ?vhlSXb3^kLPNx%yaM@~z&gIkF6xNTr3I2273(ge;SrVq+5 z8Mm>pWYs^xbjge8`b`WchL_h@;47aC;iKvpdexsC%sx4c`nmh`qr4lDF9+FG-M#_X zJDmQnQiA~Pg*SB+d-~7=MusEzy;~v3z-K;hX##@ml9~4AD&Q1n;qLF-1W4*=)SQ|n z9{xZ1dA(pY36W{2X zV5&i^`bpmbe+q}6P)o4a@c@o%qQsi}6 z=U^{8mz=bd`1{YR!rM0c|G6&GA4R(a`@x9Q;W|ar2--IkHS>&0LM=~mvf?kMQS;)Z zD82*#g6&@U{B047W{x+SoPE**W3KEmDl0`uk5HcH`VbFy-}m#1V5b2~Iod8zOZ@(; z%H}RpL^KX`g*{WhTVc@YP3??z%?=1^d{y|$m5> zLD7@Ks^@t%Na|9ndgoj}8tz}g@d#9+Pa*A^@2;%@cWkMUc4{-x{r@Qmp#Lbo3Y!vN zbJXv)qUY!K9cxYcfc4I&{=L*DSV)#sB#Vzgi)tg{>aAGNN$g`)lAMD_f4vK(8(YDG z6_@ZKGWXpHH+j=C-WQDEkg_41ikJN;`||L)%Y)Zeh^;a7kuAcKJc3%D*ehj zLkH``Uh~PWMoIoRv&id*QT`}%;$-p;Zw`(l8(j0Zb|3ggug9C%;+^1nHT8$(WaMhUdDr+;E z`ze$D659`(SU4={dcfV|$`J|2CqPv~rL_A%e=6jW@`|ELM8W=&1{*zrelGG}urnb5 zgXMySd^U0a^Fdy5y=sC0_Y-P0KJyHq-t-eM*!>1zZ07RI9}`JHrVuCdDl!}5>(?F< zDzNax)7&EU*E}e9@+%!b*95*>hkK~|#*r0$(aZLrS#-ifdEzm42}Gt@rEwd?{g0*3 z@Y!;jMX)*Ztg8LMzg#3hM!?-}@S5HWnwM%ti!5^v2Dx*H&+~7vj`JeWerhG;!33&) zKG=8`(*PPPl&D-|8qo?d%6$J)58^G~GUYV!u;G?v<*!4${^*KulA%}YGB9$EtQ9~Bt%23R z&@AdK3H}?M+y__4MA+1*S3r&A`uV3i#P1&!{Cn*)de>p%z2F7M(`g`J7W3l-CJ}M{ z;A*($)e3Vlfm_+KiHI}8xZ&!hb!afiyGte825hxewsMg@P@FiXpXZzg@yw@o@;zG7 zWVne;*}?B-uvWcq=!omz$7*)m_UiMA}?pz`~u2$6hQGrUea&^B7_->-ZT+_ z?fbL0xpc*dmeKpiXNM%{cx*0GsI>rNby-ykwcV&q@Lk8C=fU|OsHsVB4T=_(- zO_o6L%ZCj?C_>L#j|3O+E}`U=oWzEw?a1OGRhwULI%s~nIDxTQhhvK*QBrTx5M|dD zCJw%OkT2t-$evjQ4^oB@3%?-1dg@%X?O1~K*oWYBn7I9o3Fd!?4*ovhDp$$-fWKR^ z9Vqfcd=bf^3CV2fcHrfFSaDx?8OfWonUM!C0z2I&E~v_QLHZS)P%_iytT=B4waX^4`J+;0+GLL0Za!2LJ|J^U8% z#w)D>85CNmvaaC(-<`w?U;9sG;3zN5Q-uZFK$0n2K3O z#uv)C*dH#!S2~TbZ$G@@?MrjMc<~0r!>6btzf%NjHNm=}HHBbN-tVhay$;K5H3N0= z#OJS>^_{${ZaNEi%qC;ziACU$6H4yVz@YAB`*`@IN@uOf+%i2%DY9yBD^46?RsQ;r>7K*4du?|8w1UsHH*#cVW=7%^6Pdb#yz z%DJ}m?EMnB)P4!&$B#oG0WRdfB0!{g!oWFs;`blB&0Km|J1k)R57!2$Poc@9V(G>7 zlPFTotE+If6+NR2YuDbNhOuc!={HVzP_sVccj;{!nmr$I_;qJJs7Y_t^HGg~`DXfN zkXQ>+57RTK{6K(hx(jt{Da85XY^Z(y+r1fJYPx(S<=#B(UpUu=x1EFE4YIh1kZeTS z=6vJpwGpJt`i2H0vjX1I;ira;XHY#~td31rAtJqee)IdkWfb9LnRJOh0RmKCE?W1_ zL-kBnkcB`6@$XNm&+}V0@sNL(D$T&P2VMQkdL~bC4C$VKR{i%(8DiD=6ySm%hjvc` zj)8G3Gzbv@v$Un3Li*aiFmzFlTFV>=aObe~G2%r`)bZ`26 zAF^HgXuC+-2K=87*^wRaU(&7ZQ+wu>z!M^@@jaXXwHvxe*2aj(|6qZ-Fd8j982S}v z*L!s#v&+h9S{D5%-!+jH$tNNU9>F7SHWfgvW6>hPO@P3isC%?3gDAF=F1BR%8+hJI zkn>?3g40={1N+@WaP0E2(?QaBIP{I&Y5Otp_)l{;L{@8Q6`o$uRd_bkjf~wV!X0bc z(OXyB*861$mTo3X->~S1*A|nd3a6JLXt|4oqj463l5qrb_AYCIpo(m;m|R&nhQ4x1JIPi-*b7_2}r`s zpNl;m2201x&{NYh&`-9<&U0u5;*U!G9T+b`Ilt}&`DCvkZ~H%|Ebck1-ULFv5P^0l>5I6|)Btf-1Zw#Ct|k%t=Lbj}-gv5q;EMB=yC zQ@8>P3c>QyZe`$d{6=WVUL^9T&#L#;T7tl)qU+p&laS~Ct(tjh779Ex;^TVCiSxf4 zwXSy+9tIxHKWBM80KtaMte;hekynvjmsd#&y5AO6O87X9&L)4TnDie9N`}i%v94GY zyL9#P$N_&)Cdz%LFeyjta}}e5VK|TxJe0b^i2*-!NKy<(eEyw#M5}jD9uD}T`mV7V zW6-0HoI<~6ZBVmNdW$Bk4a7PhqqveO80;?RI*mSkP|!mtr)aa6 z`k@bz)5KU|Tgwr?Lxq&pYz<_)l5=EDh~NJ_^RQwe%_D%sD-PWkm^$<^|K_cQ={`8e znT`orZvv)Ms4DAaE^0KTGP+!egQ*+S(D7~X#>Do(yg*sWE)!0Iy3}VTrnZN>Xx3^bjz&tEl4v~&G zGyo?0c=ZV91ac~9DytaBpt>SCgK@!S$l!7`x&0sJAJDBk*zKQRgqb5Er(L<1z(cFe za#Xz+tmA$U@XEBJKzc8d|Mvr|j=aiv<u zZs*s*SGdlTrM4MD=5pWsyWazrGHu4)FA~5k=VzwTmnNit_QO*fk#(T(cJ6!qAN231 zXG7L$LGFVanS<2ke;zy zJn(xmf)X9|Mj#z@Z~PxmX1n!*jp2Q#m#-@5{Lb8$*L zlo*&i9D68Zp%E69_SE}sHh}ZZoP>X*P4Iz&;?X;G3>u&tl)uM-hbY$a6rDce{x4Ym zCDwgo0WKCy#mtT_Lx`>V#)aJqWc`Hlr@neS>aUK}p{rg-L4psrSq}K1Vt9+e%{K|s zhwOu%PSzvNV->EVn`JPVG{a^3^b6z%OwrhHdug{BngLW&S2q9v8$L?6LJ1{dTThn%V`agQg@VZJncchzn-?_jd+Ku z`OFLm+D%|_KUg(Frw#tpOcK~s@laYbCJ~I8KoU2+3aWDJkVT{W*j~4dy7?AFx$LC5 z_yhwHn4QS$88`^0mPmhJ5sM0%y|?YYHGp!Z;5Lo+2<*H+9`fW-8*(`zSn{rt0M?oO zEPeXK`9nWcgtGhmEco{eZ~6|;{hx#7vjk?rsq5i=+b?;@Db%y}mih>~uBuM*#A^kT z)xxE}UztW?Z0gl)8O4a|2k+~{0ZWL%lV1Av#SGA*{BiF`+X5Ki&aF|O_7t1 zNtytTS0k-?x_VGk3o-+x5edNEL<1)Guxp%4c9s~ zUS(eHfM81bD{{q6u)HE~su?+lsD!1BJddvcE$7KC{twDT?f>SUNxHoe4ixeij6Br) z5D7ME&5LXhz2)EG3S(|UM^3*!M|rs&de{w;u{s3!kpHxr0KF(~+#&I1a~q7kpwIJf z8i9xR&v0e(Re@B>&TPnmpDbfiye!jAJpPB&B@eBg!a-8)#rO5^`%om0-QG3cE>u4$ zLcTkbhW=$9xfiP448=HW2&Kb=dGF%(gA@J8LT*L$`_4Cb^xHBuz`YNQrk#U|I)*@< zKP-9lJ|14OTDhY|;?G|%C5r9)#wrj@lf(<0+Y#%@gwjh49Z2tfo{VB^9bB;D53KL) z2Ckp~jEq*6;TA_)-@gNYMX(@@OT;!H428EYQ>p0zFOZAHygtyc@jRjA&sLz1HqTin zj5vR6CDaN#Ul@nK%-x?b@hiwo$gjfHwHKzF*%Y@hevmOyysEi40(q}Gf@ZE_K;hAR z8Ra!Byr)!nHRDx={3mhtOc~2ao`cXh3SH<-#oNU#S`28+(4D2=CqDnkS@ZBM<{RVC z(ygzjvpoVuJm0@;zQmz8`D@1{9qM7zR!P(!&7oiNiZ|42R$#E5=2U}VF+>?r1P9mq zBju6ppQR>CV6pU9ij-msl>Z*xi%6IS6TYnm@%Ad>`3E*MhB;61@FbPtOvCdbFcbO2 zf@K;+hL1{i=OnU`@94RIFUO}5kC0qC=|8r#=+;r`?@L$7~~sl(?nj=3`w^ev8q{Z zFdJkp;MO?>f0>jizgpm--0_BafoeOTIj>tfTeZmZVlnqKuO3u=(s(CPdKM4idv;{+FXbbg&&T7H$^Agr=Nr6b)(nF*zxLjFSEC-~ z>v48zSU6#EST?_G5;kM%#m-wd16xIgAV`lQ8-Z(h7Br2v2AB%jZ4Y$fj;pHMCh_{C zNhw^8%!6Uzb9w$MnV$gOOEcFU1O|X-^g7x!bE#tMFHb zYxM4XFJe%LFmko~3}a>yjC6k+(8(&FEDpw2Pz!(Js};HeV^RLIYW?ha$ z_?s_-shYod<2D9SMZYVW@k@tOkC_5r2hF1DrC3Re;y$=~C4<~Rb_Mh^^`lm|i1)v| zZ85r`{^39`iaa{9%5M*X*JT$e9Q|P1b0~Z>wH3bF_+pKQ{Ne6LR>CgdI#ir)z2;BX z03GjW-_5Y~0C`CGhE(fQ_(Qlg+ZkAg#_!fre-Ky)t38Pqw+Y1UPrq=-zrC9PTlyj$ zVgFi@vL~fXX8j0|oVPw>xSEdihs-6d9#23?Y^mD4+$qQ{q0BiPgGJ23rB>&e>rs^H zgNF9;k4QdV@A>P?cxbGqpOODQ1I{=aVZOC4qU&edN>Po@Ex?8%=cy6uAw(m)`}}g! zBHG$qlMJkGL*mk0v|UW&@Jnxq=iK2{c(CmB=x9(DGGbfn^AJsehPdCir4DqX(Iu_n z3YQ)f@$=-@8tY|vA+@_3fBQbs^;dPbNM>D@V3%!fJC3Fi@s{h}bqQWT_-o<9T$=5O zKW#BjinSi(X`8Au4cA~dYy6yFejJj~R2z9i-v~{5p~&y7NiXw zaD;9#N}<9@XOMMR$z<@(+Rl?1--_WWgJBO5QS zP`?1yi{y#E4tdZX!)0TQ>e2hG2QOYF6~e7|x4Ibmy+OM#&h!`eI#65F1egdCuYVob zx=h;mViqX=Tv*NanMd{B`&^GJv#A4J<@)@BY0RC3tkcT&+1dpf{%lO-RNj5 z9Ql}3udLn(Uv8ae_vCDXy-vONQ=T5>$lzLzH0_W!uq7qkFLmwJ*CHS>TZ#q2tnaXm`A z`o8*E|5vE}r1m7wCmTi*%}M*+5BQ_6B8NfY0nzjKXIcU7GR%Q>U7}n{9@Z=EBKlWQxDZBk(4Y1cvS}SLDqpwp38uwosTFCuVy;|D{ zoYZe^Bx9PPFjvvmj1mub%9#@ldneJ53wi4%O&z)wb4>c^D+J_^*9=FGO@Xw^%N1cg zJjm!93Nq&s=MVXvTM(bN3=KIN1#43?XmONc=?vcldIZ#O_inVH&r4Kn7XL7?T~#>! z?JN#%Y0A(Z*9k;Hn>@H=>qdBOSIvG2h9UH`=pDw|cGUX)u+ooq0#KbGjTPr7u0Ml{ zWP9D0X5mLQ>qQgqInb&JW$C+%fv9i~368kWXlhFM%3tjfG`<{owl{YL{7TDan1ZK} zwH3ckM@tDhmXoOMowkV7?k;?xX~_kN^zU?StYffMF6UO=jsOg(xIt?xEHP&v5*7z{=9*f|HH_IFLBmLYe?!Mpb1L_%8^a-(_l@E*wk zN_2cNl%?5(wq&zw9&9%PMo!7*$xQGg7yV4F_cV?$ll!k#fvQWk) zz6wTvZRo&>RoD#^Bx7qO9{=$ZRyxt&9Vh;4B&r)|4;lVB*){}q(U@4vmv{&+ zBYpochWPV;%RIX$|92G@vwEfvpKC!Ze42?TRXfmtZ3qvKQ9UFqkUz3H*9rH@TAOGe zV4+i7baqv48d_PJZ+N_JKsw>dLtq;YH|9q1xVmXXa+H~3xNilnTy)X7^o2NoY(IC$ zjyFy~m)dW`QpOcT{X$iKqP7cgKZV_>D8r!WPPX0EmQfHos(s_uQw+S(nU1>HvkVJr zNWSPzIhy`$Hos-Fg!*gVN|B%IK`(wiakco20S7J_iqd`J^N;dIa6Eq%#=%bE&#g;$ zN8n8JB?9P+2FSWkRa2c;jzoX9KZP|Nv}k7`XTupTGBJj7E7(`#wbGDV(9=9Wz0 z=?6;?IAi?O*l-HIS&Fj-+0Ftlj_~?!Jn`=@)shm9tZI0$o@VX2nL7+WedNyY*Y~3< zFSr|?isYjV+SL}J{b`iv%eaB>nFPxBzwvXf%cyXGQ0Z*n11lckr%Hd+A=+ihg-`KV zuur(>rBE^pq!UkKL(~0;+MoGrc_rOE4t(FT=?YxLpzsU-u7)u*!QH99)H&sC@O&$Q z&wgwQw0!hl9CyUSVUq1+vJb8B7?Z|XZHtiYq%Ft#m2W74>))Sg{}QC+vBysSehp?K zWA)87iT6JbqsrobeZVyZT;`6`wr^2scDRfS%K(_Esx*zKG{da%pOQBl^+?$3by;&P z7OEEZHH22iz@G5daV4w?9)A*aG!Gd?oIAsl55%Srcfs!~ZaG+xZ+XLTPMkP@Ncol= zMBZU|9cIjOnVSIpay!ksclv>{mbWA&0HHe39o{o6lZcT~<53ms6tKLby`O8ij8aB| zo?d9mLchO!H@42hqK#F8Vx(#VTy$yOR}Gy71Fe6|ay;=w_a7BTe^lrv0c3ssyYz6~ zC@RqU!DH=mm>Qx~36yL=%i$$CkE`oJB`@zCiS&W46`yvtd_DzT0<%_Yr+dJYqDQcc zt^xgc7SQANYX(jEWEf$Tages>fQ=#$_dndG3(7c70(`49Kd;q4gi^RHLlDOxh)MK+ zUg*sS@5frP7f5PA#Dr~(_T0hxBwFhEK6B8kJ%2B1pcXdXx;?iZnLzb(a`dO4Oe4-x zJ<8VlWuVH5c4GKSTz}cdObU%WTLh0I($Vfa3t)E=i@~q(HIxkssJJG=xh^!6;8hUcO1dbH!_OdkY4%pE$lSPb{SNdMCdA4i)#Atz|}mmoJz z>tzS|Eb??dtIvEQ8CGAUGJJSG3fK*I#Md z9>E?CUI!_$!Rw-_-YDElK#a^L9u`Td0z(Q~!B*qE+_Am{cv4$k(#f?B!q-t%*d0Y3BD-EsYR)?`H^pZ4RQAH7TTaGSRvGdv8BWV8Ja^ zBGKD}xcyy?OTRLoSOnq1+Rk6f%TV*`nT3o~qW%~WijUW$xI2UgvO>%7h*Vt5JZ~0SkGfV=UhRM| zlM0o>xkflXBr!`V(gaZ+-)~hv!l1{F1|gY;4*26J%S27J6;b=&I%b;Z>=P};tUXRxS+jHH}!1yuI{ok*1Ziq6P12Vh0f~%=>(4mZ1^}jKT zs53QabwcaG&)3rO2^Q8RRWVbbtSqrc+4vC#S3&gVx?<8 zc@Z{bDOELWmf-W->@YD2;`5L9ye~B*>a4->n2t<*=Qs3{M1XT6qyV+q$SB|BZ3Nv| zX`1!a2GH{j_>kCw14`*@9tHzbNF>PWuys!@+I2D#&pF%xN^u5vmPn_eTlM4G(ijdl zkMQ6O6^Q%)2ka$t`b&fO0a1Yq&o+G+nmy#K_` zk2A`@^XFi=jv~Y1%pCaX3-Ykh&p`T0@6<270+cH!(6_HYf;h8pJdPV%f!NZYfwDc5 z=qZ!?a@>9?`b09zUYfsv>>e9(#4Qy-(G+I(-;pISHa$*dXGXmKx2((&`#FpNsSc4v zL2SK9%O@mFNqP_o;UWSl!73+AN8Yrc+jW0Bgcte{ zV|hp`vwss($c)(uN%#s}_cLzM=@X!MbjKx}uN&Pm(Y$i4vK<1+(-IZZ2VrE|Oy?7G zHK^<*b9|Oxh3Dlzavve$&;L2|uQv~qu)r4l?>@`y5UMrt-RT^xa)k$YOo!G`CQAOc?cBOScSev;o;#s z!w-21#QEdW-@DRMN7ukmEc_v3aswh~vrfF=-GPeucE@~w)`JBbsk)V1D;SbnJ3L#! z!l3cukuioz`1;|y$&5t6)|+DDu}vT{sr zWW1Py;y?BRn|@fN&;K~$-Q~9bbF8<_>N^N`8$TyqIR@{PY{n;YFfcyPAVPO@8H%d@ z$OtD?pguu{;yji`WP1AdFFK(DU4=>Em(4ohiEk3*EAG1cGd zVOY8-Rk>M-L$q%OVPL5i##Ypx9VwbaMMs0|$2wOa`p^TulDT}KZTxPTxowZwH}2S- zwO)d%9tI^$_7u!8y?irxWfo#IZ?Tt!66f#9NU?4%4m`Z*2n_T6H3GLUH0>PL=|d|O zp?;sM3y|MKDTOk=8ALUMr!}vgf}D2WymNHRC{IAqiNm1>#*SS0sl(cc4o9^WU+G$g z;78wD$W0FP;mw)X679}J?Jp1*A8odSgT$I}t{!d-$~$xABa>PKaGaHTrrg#B`OomD zJ+V_zcSNd7(H#$2{`=0Hz0IJ6xoB9niqN%OeW&{74mA9dcXs!3F?wGA&8@j?4HUEK zpOH}$KmP%8MnM}hIB27piXJje1;?EJt4Wh3ZiNuNI^?-h8R?rmg$y69Db0&d!By^y4aF%-NGiPH zDL>GO zK2(+nH65!1UKcO2>ksP@=5(~l{&G2thRG&PO=2PRw39tLI}MxcYSL+2-JrKk_8=&{ z5jAg1*|5FGAkQd0*|fYBQ1dLO-1_$);*Vz{a|{*_MJy-WoZ^O&Ag_5Z^Nm4p;1_$r z!&L|=Plei5hU$RoapHBc16^INBXRaS>l`@ITi*3%`U+y;HoD9^iEfU(a(c=*g^Jnf zDsGZsA?uv=ha-8!_1CYFuT|3T79mE7^52N(0tin&DSdxv5Q@Wg9kB#6Y(i(Z6&8Ss^MZ0!Vss!seh|!^qGSQnwj&h_dV|9Hn@wdg9B8hueI``7x&(z>I!P-_hTw~#&eIXsVjOi|lv8}`7IXsz3e--ErHma7^ zbpwm9V95Q}XcV{;)teVphCavm{H)|y2O|;vpX$BD?O(Im;LTk|fXyVO^GaVk(fiu_ z6Fz7dg2{ACLwoZO)~xFJTgBnzmq94? z!r#Gwr#M)Vft>4G80bD`!y@^Xxc%L~nr+Q+ErMp$py9690E+CSyv>=nhy)@o7S+9O zL%-T)nSJ@k;JIiEClXzS{p(+5t^_9`>!|W58qsvfpA0DzFj;`e5^py0L%oRC)`o-H z}^KX?h`cq1IIMsy%*g~;tB<9QS!Xe=ah;ef|fP0x@mw!@!_ zEO`arRrp?W<4tRpKZ;9v?EU*~6NJ~#KG$cO1Gd+!t^2kGs6-`k$NeJ~MxQwd1m7ZV z|6{{tIYK=P;CVLk&dmcIIEsgmpRcP>i$iBYWJMe7EAp(W9q8}w7gAX#1sA|Ua!%0m zdL-x=yHlw#*CY7~hF7J*Utk~mVJ0-Y0QQ*r#H|O{U}J?V?p-(W{=>AqDK6xq^YEaC zUUkcN7IieVT(mTpL|;U5O-{ztA>3u1wMB*{$S9(_cIrT>9F3t4cK|Jx44L--|=tI>0mrG@jiZ{;#rL5+S>xEb-Sa)9i zJX49Zt)7S-{@sSEs(D|qUB)687IibRm3bIeiZCSBbtvKGnGmM~zx!Z@ z!$@d989Z*vH$B!~hq|WvVH_Rt`rlnLP&xN$4!E2zuq6GMg@6g{v0ve{$Thv7UM8as zz7+~YcMh+hvZvXn4Mj%bG_(Cau4f!2W<&+hNmd{mmlby7b{E94t+v5;X$iziev$f> zF2bVT2lH3oi1Www_Zy8TCD$N*JN_hPSQpX~q~o%=R*6)Pp3h>x+5o+&8nX7?Ux6&< zX4F{=9Q+g&IMbmrgI?r1ZF=IrBIOL7UCZmuP#=4gTES@suKFLH^b*Da30-H>ZzkgN zha^*+NTzy7+7OHfr( zKja`TKXH#GZ-$sF*Q3>(2jI)@F4+l{Z%9^UW`JUg01@5kUq&*C^GDifZ_`lMJlx&o z^DIuAg#?#wrpH;6!2hFb)}yBob!w-pT)I7ibf#|~v1i8tfnL8e15Kb$UOwOd)s~~) zQoX!(wRzLq|cmD_6d)n4SXFqnCi zs~_1_OJQSmGSO{`V);imM&JvNv{FF@7WmC0sZ~y4pfg?3S;V^&4s$;+wlppWtyqic zbMNO+&}Otp!ArjIU9*zc2Vy|C!T67a!ocN zmfA%Q^YkpR&B4n&F(iQe?1zk#54zA|&g3Z@`woy=e?DcY(+_Xf#T;qARm1n|9|kYK zT?G|FQmJ0ae~AC2k4!z>mSNW1UHTa97-G1k6MAyB5FHNxyc6=g2t5HeF{SE3xO7S< z_DU5NY~y0F_R<|F^5ZKFxdZs+#ICjR`# zrl6mTehq&A{X<_uSB-@E71ebHI}nRRKy+4r!8nl%cu*_mj#cqoc^=j&;7|0jCQ+e)Ci42=V;;6KhulI|(xoxqaRw zyK)&Ne10;*onH^zAA65|zLo&JDK28kOcSs&@Q32+4hFVdpL245SOP|q1+^5RDm2r3 z>~6j2Ji4q}^Nz=U0I6*LD%#bUgH|4Ke@_GA{cm%>dHX7hj6(yx=~Jb?A!z=Yj{Aqj zp-0^Jf;ZQy!KTI-@R@U{c7SWNe0T*;n-=@$#AHHT9?!i-jt3w)RK{5RYzfr#A6V@3 zOhZk5Z;{~!2B<>^^@qO@*WYhe<<1@+$H5KG))*KX1A|VQ6vLO@h(dtX>rrnp>T8j3 z;JZD8WPUAe=`qg0$zWVAyIODb|8g{$;z2r7eMK5&n$hjd>8| z5-U?(B;J3CD)ZlM2Ua{>inlb=robS3mZ|N)CkTdH#Wc=f+Tix5!Y-lxDY&iM&N~>2 zhc#ugV-u2%ARs<+HU2=KhcP-${*-M+S*(YeMKuc11m?DH`@|Y3zvBq;^(FrO=WT+k z&@vYebea!Q8TV9!vZ&V^KHWiBB7N?iZqNcrey5pkl6*tG^Vd!6U9gb*Lb|E+Z9kN# z&1mxLHo(b(Ao^YFF_hyM?oxVc4AnjDUaHkv0Xyn1gZJc!`(IpF+*vl$QJA#bH(jA4 zK;+z^6D8`sP-P|V)XQCuDspA*B}Zn^Tfgb^56q_E_cvOp#gB_aghGNT!_gfKFW{@DAP79c1 z?Szwx9q^B5ugk{i_aH)Y_3NEmSa`{()+Zq}1L21Fuk^*;@bdhN?(MQ>^mhpS1P=6r z?OPc!m0m1F3YM_+v;T+v{|KahmVk%bo`OFgmX4qbnjz*VeuE%;?EWgPRtYq@p5J2- zZ2}F?WvLOj6|fR5edFLc3;a_TS9Js`fHv~WmFHoT=-Z#4nG$CvkdHb8QZm7UOyD%t zN)&PZCD__k_o`+QPV^V^-5Qt&5#0t_rqCfEnWkrMS8hd@Uj1;;I6033Gj;yZ9-K3$ zS?l#2@lLd919hsOTQ^?Bc+Gok{i;#%(qgRreMZFXB z(^DkAAVekcOujOby5`Y(XWHIyERSnR58?2J`%m}-VIgn^<@UO z(onChj6$qyJ_6M#K_kX>=-g&wHmW9W|D0ruZCNS-Tzk&*W&3rb^?>)Gjr&9Jz};0M zezyQQlS!SpOfm_&>h5#g-)CT;=n8pJ)G{(2rY@RzTaQQ-IdO5a!pMU3RIJ$I3W#KV zZqqKBg-ord8e*@A*WW1YR+TtuE`o$(NmR0NKgxI$ZAVhEh-R0Q3)%JBP*!KMxQXK^ zjJY~#`suAgo1VreQQJTytJUr(^&}Hyt}z=8-8tY!zQ+#K;=PEA@$kbq&1H}kz9UjN z6Gqhjtv%mw+9xeRi_pp`Hl|*rv6U?M>ggOJjeY0a&(e;%(#P8rWO@(Y`*pcFECC#( zZVjKAu|!Y$4f}>aG{a7bi|WKQ2ELHsk&>d^B43U_DunMp#ZSGl#W-;J%gMm@yWSWr-CRmCi%mtC$E{Hed8I!>Xk= zzV3gFoe4YC-}}dfglx%H3g1*HktjlLWQ&TVNMwmD*%Bh9M4}{QUrNZn@B6Xu`@WkQ zGh@awR1#YJ{U5>n9>84ZI``+yx!iUPW2n;SSgT!_uyF+16%Yodyx1l2&KoXB_@PYum3UC>kDO^heLGvy~5uypnbE3 zEVPA10h-T3Hw)?@>2gpRye6ZhdB41DmoZR|^QKjQFpaMM>7@IxryNZV+~7N9>W2Ot z_Eo^rEkL3cgP1@89$F-Note|A_n(KavJ-HO0wPYnq`=@VROh!hom+C3tAwuWSq3!# zmn-jR2EG)u_XUe)b1%Y|(9HD z$a%614>}uG0xa@a_;>c+%@+leuyyw`BmdrFRNoTv8I(}mj{JArg4&f$I z=gkO0mv|+LP*;gi7Q-R&xsC|^mI_caOg=1;zW}*(0&br^Q}2IVma=s1(B2hb{(5Mq z*rFdjPCqwEvFS&{x|bbKt0$ui7OtPlY)65wUbO950STV`+2rwc#Xu`XQuoD17X;?h z+K#Xm!s&Afalevqh_bc+UZNBk?p3V#yGu~de{a}Se4fL;tJm+#joF1~Ahob7ZoGeb z5N0xECr79S(TL6-mdkcRdlakcKs0AuC{r= zq6Q+uamURXSHS;s4XsW#b^eH--ib{PBSNaqit>y)K-U=vKc$ewCmtpqiPuHWC} z7D1OXBbDSb3L04xKAXoHkte=o$=az1m<~+~uqV3yPJjJ^^B=7%~qNF&tqkKB9gVmVV6K|Wa{@|W=xsO1svUgGOQ z`JaBZ4%{q5L&hy$CP8!P^Zk0=cRU!ltaQ~C?GR8sR-0~Qmp}drR45fzwxbBXu>@Q( z0lrIW?4dB@VcGR>s_TpJN0-M+@9Iz6jAG5@Im9OtmOp&48kTtahLeA^!^!cf zlri>M2sSO*5KUZyu3HIn8;2Sou`uSf%IA7?@quaoka06w&32r`Kg~ynqs^v%Z&AR% z?x4JM4E6e(xx0416#U5GFZlYy^wk!S*jVF zo*A2X7oq-G)8vyi1hnWaDb7^c05*La0k>Y^Vc|`2gXSFd{`W=F{cJKL04mI{%)7Qo7lk=4ZVyCfUC7 z`$-!TT(swStcpW7^n;3D9U;L<4{7fA=cxOiGEq`Sh4B(FXFQb~OB_cj_9FQjmBVlu ztD`YTEQ5yGeBGSoR*)5+ku6OjL&37s9yvNJ(69yfPOg?fONi9~18EvviMBv{BPNiH zrTk243JDr`3%NO7QP*Fm)p{q_=LpcUdL_SCeIA~YU%&Pr7=<;1*aJpdZAj*Yy4SME zJW6;PY$%;UglXp*w!W?w6!B)c`p#Av{Ndtf$YPpAITYK4M)Mkki?(*0`@0Au(|2;G~3LH0AJYF z1&`=r(aR8vf3M_pkWYmB3;BImbQ;SY!!tAhrJ0XC)I!J*GPd}s5q+d;e}>zZMFncB zV4xPABH);ZHtx~v^q(sM=RZO=1=u#oIOz3qwyp#WBHez5?_Y(NT{)M?7C8`n-pABU zqZf|sd+kAcCKq`sg!X^VO+p8}{EPJ1SK&O~=Yvufb^CklNoy;JScd04EY~U@^dr6O zgU$XH{~t$pIh1;^7)5co3O_$T4IRHOju@C?KrXoc>QDIvw0h%2zDRxpdg*+5el_(q z)ZE>0y6i%RJ$heyUth&RNLYv8`y}f9k8S@so=I{gKzOuJAI4??8C(it(67+lo?Gl|f3pVIiiY!LOgIYxe{#O~@Ev1^eG9Vn3Uc%7d- z2x!?fQ{QeGXbgTvZKpkgy4&BKZoO)S+46!Jnroq6g37AzOWoYtv}~L~DoSC#0IuQ5MTvDvs@t{`85djlqFgZ{J&;TVw#M zsjtcJtI&>W2J>V^J7UKDXFvXdgt9byB8yq(;on%wsCU{=fgePk3KIpGgC70#f$9xay->@7o-KXv{J_g&Ge=Nraic?)nw zc-DD#avrKC)?{8AQ9u8z62sf~*eOutp_G3yxf6ZPbo4Q@X+rg0ih@(PdKhPWf@f37 z2hATD9*I34wTkXu2&mbWWW5D)&9m~kg;Ci=I@jbK2~tFP_K5i%&5tSdHK zQIG%owm#48{f`I+-!3^ATj5ZM*tQL~$pjMJV|Xh@p$Qq*1TfRj&ci7VhCRlm3-ESs zFshI@6@-$kCPQ6+X7!oP{(4J* z_0+S9<`Wngw?QM zAHx>+AX}E|Y(?vMq{{Frb0cvC1kx^dv1XFsMCvQX284kjC3CSAvu;Rb=dG10N&_3O zJKi>_IAko`#2+kA28_u{dIt;j{?`+S*&a{IFM+cDp?IDa7swlMSIYU^g#y?vfl&bs9TATL(!<$$x`Gp$z#D0EY z=hq5sj~28XPNA-U=mSD7G}aJcHLq9NhHe&}tudjDseXc{HY~eL3iyt`64O+W`yM*3D_bSvV!L z*XCr_64-wqh>tX_1A6w0mPr*u6H`Uuo!nrew(cWP3xVV z+eg8nMjZc#Fs}vZ+ZuHe(WK5F`ESlY{2{ai^1{c516?MN`H@o?(_Q`(`gP!;n@T0@ z5y$>3u<3w0Epf_fD;bPVOwN{vVPG@$Ph9jq$89vf8)!c~e(@%@0-Br@lRxcU1-^+ZkA3)(!PL_uGMlRxaPED- zvvrHmTH+!j{|$d6wV4n%$+QZBNxm51U4jnq&wF-QPs7uX@?8Rz7-)X|y808Dh{UbA`C11XQ1FfNkUc{Y5FhG!NP~e4 zc|!Mwua4tj-RO6O*(CM%-*2^S6Z#PZ5cBhis}Jr+w_Yba@$Mub3cajOE^9k-G(9sa za%T*beyF`m2wH*A^r^9I&DWrH*vUMWlm&vld3qo2DaH={ixhPs8Uvb*G~%D zzbo2`r|$oSMef^_5?czm z@8lrl!uIue&f5%-`{KU!>30jXo-0-{R;571gRjh5V$|nPMTI%ApYb5V-7=P2jLuW& zS*?;c5hjqfZTm<;S1l4LTFC7_goEy#=7kl4*1S0c=5!LA?3yEWzXR%^krIZ z@3GJAD0Z{OTBekQ*0YXXA{XI+_VojsxAe`hEOgj`nOuiHBiYjH@*N;_cM~-QHON8RHAOm!>+dk&p^1yba+Fp=9v8 z%x&W?k3~XS1vRW)73l9td;ZM_-SFo2wLXd_7W$NEW?J(|(6i6+(YvMpfj^=J1bD^> z(0|+8acu^NR>!BKx9KJj|F5;t)YL|ldBw$m@(>Ta>5J#TD=ff;0K5P4lrn(@CcdQ| zZG(RS6WRSmeK4S4{_*T$KYA&l9~~&Z0^ZZ++cpf;^`|y#5fmL2hyUyv33%-3%UBOmum4~9b9mI>bOnTYKJ;IS?nh28q*(%c7s6NAa&dn7 zh>Xvby>I(A4DXYzifWTdAYA<`>FypZ^im20Ju17woak3}jW!OhJ#;A3PsgESAF%w# zRLQXT5$`l`D~785zsM)8zcyQfg6~Q@9(5UT?fH0(*{2RPdpbZc;$sVnAzYC)mn%n> zl|K?b-d%=YanZCfZ`;wI<*a1hzg-Yet@m)ywG%iSvtmW>)PnKQuOidO0^o<^<=L-yx)Jp=RUXd$TD@MTeT%4r^+cGqFORmJbP@n&V$ZZF&N>BiE z2ObMt{fGimBkm`>*|k41>7A@>2Ia3Gc_t{S@T~fQ?VXEDFkm9B$SO4mQ36=5=(Pq! zb3KR0P@xKj*{{diUK&8%F>dT+nq}}ir+rMvnL2;;8^_(@NX3Eh6<@ihTLgqzIp{lJ z9uL(Mh2}FXslZ9jn{qxd3q`lZ{SW{HQ4{6~fPJk;NxgH0J?#Cay+*z-2d@%|yWnbXExqPv7L4QmDVyOn}= z{fF1sFdSn3$E)T_A%mwpi*0`1N8r0(r;3^S05`Mlo6Lt0p<4f4qP*xF7-pYhxon7m z_LTmP!A9!wKbP4z#H=fea2m=7&XIQg*g$iOze5WeH1-tGd0T~)YZBW;M&^)a%*)q% zcF(=)>VbtZDFSNJ*Ju}d+y{nf2m9`AbfbVTuCM+I;z7@(MtE6|04xTZY44O`sIK2F z((vK&?)g7CUME1GGl#aTs^Xg@O5mSvPpvjr2YhGoq47L33z3>%UrCfMK}^o+{9F9h z;K<%Pc|f26+0)kUDC|dQ9|mu9Ml}l=VD(SLim$>Yu|X@@0_ycQjgvB?U!IYmWPFR~ z;6y(>Qu}eRV}1nq82nkV3T=cUft2wq>pZZS;O!E?$@ zW4*vhZ#R2U^t*;zIN^lq&lSo?YO>I#4?UO3K01<@iwFb4VGpX*MScJJNy|M(uh0XFm?pCAPx6`tv^n(z2S6Kd>WHsU_ zbB?)9Q;UpNaZeA)F2FP)LzO)j0~NMQAM5_>1-*`RiA38@)UUBqQ}<#XwF^97J-bQ- z(mvJHG$ZQ#;TBho=2sWtPE8rj6X8j8tD@=hE4C46J1Si%rBV%k_?~^+uezX5u8(dC zPX_-)_x}u}FhDGptbczvAM97>SUsQ3pfqK*kLTA$kzq<4XR-hp-f;wHcv@1|zip6n zqV^CGvi7Bfg&E<%+M@Mf>gqUT;RKhyTx~-IbhQ~i+Vg0xU6w%lON1n5_D?O3Dv|rV z?PmI15xnCsk6fA@M=^f>9}5}V(B1WWArlLWU?G`ZGfvw>b$vFm;ugP~1dzY{ScXf4 z2p@uG+`@}G!0gxI>t|ZCK+P>u(Ty zFi7pxt<6Eq09^Gwq}NtRhI%_Yv;IEn^#^)%f6FG1?s7$|!K3WuJu!|yqAH+OXJZA-9cnknhQVf41-j4S$JP`8G6CX)Y}s> z4W3uov^n=-fsxPj>bq1T8pNcH@BP+*DwIFA1>8skjlBj}F6WS7p9AylJ-YLd3{7*Wp8iSej6a5>A7B))NgI5Q9yi!o-_&(pG>Yl{=5Qe zVs!y3>JiXF5+eKQLR!B$@tm+#3cS|8dr) z?X*D`Ykh5{<1`%Vb#HiL)`&Xj)cG`CEJE*~ZF6%Lb^Z{Yf2g2dF%NT?(}6m#7vQy> zoot>%2RfOZ<{2c@4x6-R9GtdEX#8ab>2Ea-uJeC3TDn(+uE##fzR8Xd>n|y6+dvvv zy?e#xbGrjho~>te7odRW8S6XZAE?itB9fn<7ExP(t;G+bJfRavG;RGN=J`0%&QPO+ zUo|MuEa{N3AQpx%9-B+FB0!N{w=(VhVX!Rgt|hp(!F0(ZqnvlmVBHXE*=K<}Y&a$o;0zk2*O{K8R?Vxsa@=;4LWtfBl zh*9zx4{)H#k${>Hw?a!rM?&Y-IuypjJ=?q42{Z-I1@*R1K@Gox9T%1Y-M>zK)D`?f zb^l)@Y63l%=YcY@v2QSN23RIH;sU2}D6U?sy>h1lZ1$?Zk{cqSvYY!CVh2ayCFx+g z^~@ZSNlV(EFfBn2Rc9C;o^(RJZI{|2x=3*DqYBy49S5ob95Q=eQO`fLQek~qxU>S# z^llp2F0>Cz*0GNjL+3~%Vb?%wm4-HUFQ zqo_9vrL2p+u>J3Z$ctetD1Nc{5-Cc8z4KGGMWNLDuk8ALp8)UO@A}-vdc}1foqT5) zNFOtf=7Rl>=PWg#!^5M`h7S=SicWv_Oga&a&KIdsLh?bT?*t}rq771KUGP6ed!R;ON+XS-N=Y`jae!)g0qrfGD-7xZGnH7&)pY9u_zPb?^U)A39rx zl-??7dp#OMfA4fz4DWL7^nj*ZQ{p%(np>gywOE5rN7ThAhOqFv-k`UXgls<0q@ zCBy4>kBDP#)a!5ZG=G$9d{}`7X1BYKO8b#(etv4`P#X$VoOVvT=#S14^`$!nhJoYN zmf4if@Ywk{DK4_BzYhjGOR`&nf#lsg#4H@Tbg!h{QHQ+yU3+m>Ce-79 zxsQZJ+=G`uudZX+8>-+`h_#fJSQ~N4DhFW6wGeVPhmp#?>HkH9As!B?h#m%(tsr2vE@4&GjXq8j(33-{sro59KI# z!3&sIsFHGM^i=5x*ck{H)SO-hy1pOR$VJrquaoJekI2jI^2b>T)fJ&YaM<`~*xTBL z(nduKdaYYPxwqm)toSoH+cqno(y;^{p=x#V%;c=0yoyR%}^0A__ibsZ^f@SX}@$nK03YQu+JY5VdoUKep-{R25_jQ%N z4KgrFl1=h|`+;cnEN-JN0@$Ni1)HOZuz2h`ONRd(T)9}Ut}KLs4Lu(#nQ`jzzmKyS ztX({dK>L`JrrU51{)l)84AL?25NsUH*2x}_)uUK&&B<#a}-(w_#l}1SL@2j7wuAf+Rw^hh<3G%#oB`4p^ zp{(=r+x&6`Q04enBKu?qFzVRQ9aox#JD$E6E_>*<k>pqml`wUJPf(&LiZi+R3f}^fSx>|867>7Nqb^| z2+R8t^{d&jAoFE2`Zc8o)-sj)PjGZ2&OaGhSI^;53`r^^Nu3DZdx?g;PSp9M>UH^( zmf}T7^5{vg_&14+82h$8l}13+ob`}eNi96&j3>#<>Ot0zB)wxEYl|gzX#Zc&3sz@J%^> zUqC7Y(nY0z)9mW19+X?FdKeG&r=4DZe~U$WW=y4OQJ+xvyKJx2TnsvWV}Hwg(f~+F zsB$;8?D9vx;-FlxF@f%=BKSJ7*0q_>jh5Lwm(McZ_HS$5CKGt0LRT*s2Y%QWs@;0^`0HDq%< zo>RBK!nMlhhK|dSTIYF?#&QU8WRP^fv==YtnvO#3U%i7Ds#bvO_=t@tQxg38XZQCV zQy!!bE`*lY;$hsc@l{rDKU#eENWWKf0j^ZmUU#)lp=$qh-KNdaE+QoNemD?hGLE9W z_1dtX=MYV(T5a!WJJL?eQA=H!0Lza`(P#OW!2i_=h32C%Ao`-LR$;Uq=FFrFEJG$C zX`=b<`Qc`y-f*Qu`NtwS9x=^pd`X=@5=Nf#OuEej`_uZ7sjvk&M3^e)z1NKnn0Q5f z;%bMB&sMtkNt4lHRn)KT`#6YcFtvZRSdO%hn{EqSuR{_evnK*dQz5|7M~vdy1Es%K zdp*Ce!0Z_n_lGa2&tJ=(Ws`reOo9_hRX@(DkD;2wOv!?wW2n3D0PphmYUD2_p1L$X z2W@ARPY3=-gt^Dj$J2*K;9dS-uQ`!+AZhAW!>48#UDZk2EWjX^o1p5|y9oER>9I zXHt(phcZn(8pOgF5AwXR>j(c$`NSC+S0jeSmfrzR?MQOyscheG5^9`yR4U7ag9huV zRO`%ka5X=)eDi%RqREcnU*qqA4E3SaskxV^x#%T}T`L6yBz}bU%Ts@U#OfHDbt~e* z-0PG{*3J}k9Z|cHFFub%G^$1p|0@I0!U7Jj2on0sp7A0>c?9k(O!zRp!=P{hO}0Yk zVl=tj)bi({Jqp_B_;k*J3>J&yJz6ivIsmD~m1a}r=_5n5`G;!#*%V$P)_ z0nO4OH5n`cn5-V!fBHiJ`it@1Th_%8EEW)^d1FYwIpy{{k2-{VdghUM_ ziffOAf2_F~!d48j`qV2xlaE67(K2Mv@brz(CudrXff!>vW(;)pI3d`9}7ny z;;-bY)wN|va=sSsFhSk_+U5)fCS0ZfqosySG;IcObXHteW$#9N)qkA(ajF&0(&sE^ zxFjK#->xzoyIe7jsii3s=md}7UPo$*8_+OoL3hni13Yb(?Ygtsidb&Pv;Lzj!^^u3 zIeZP&`9t6eTT^cq9!N`LKOdywkyeT2oW5%=Vpn!CtJTVcP2Str)WtAx?|jEF?gS1d zJ>OSyEzbiV`9C{x?s}Bw|Mab4(-`V3F6*=wo<`x!mrmDi5TJ&pcklL5>iI`ppRGK< z(M>{@ywc&**9KwmcDsvB;u7jRIJ5XCxBxb7B~;G);!v3r6W*F;5nfWbL&k_V5WS?% zzRzlLfUbuRefvTLUO9`Z&y+cEskpan(l`g*6C$p1Jk;ZV2FlAiPo~Kry+nNe*#`rg z_kt5vPSm37ajj-MNeFEoGfOw-!=Uw>?`33<;9zFk1tWA3kIarS1s1yXK~4i*y%zHT z%IUYy5s<@y?9n?Bg_A^3zG(86p(usw`crW2;lqd}xXH`C*XrIJk~#3TKj}_7T=41Z zs!`~G2cMc%Rc_2e5+OJF+~5-2j`H`}A5;Xd)UN)4^4T_o&Sb*&{&HT7qS_$uC}Ntkh9VYiu|?&7g%W5pDVP1P(VS>Pw8gFWz29vQxuPqXh$FCZq0zy z4UuYlghf|!BvNepD-kw<)2BunhbBiQ?yK!@fK$xBUw*)6 zmp^W&hU4#Mq5#G1vC8vfu>31xV_2yi39-J#9G34!FLizYDw_~t@-qxhy~Kj+Mcve{ z;vP^DR#>n6*@J{#8G31V@aQFNw$MdC0(2yx!#M%e`6Dp(U;Mb!BFLYrS>xNDLWgzz zTs_=JVEw?muvnFP@Oql{wLG97uqT;JgQa(My=wdASesc0obxt2!Ium&A|l$YlCy~8 z3r`RZ4WUH^Ltm+4GPu9_T&t`2Kj>fF+^;}0BJ}fbo!%plg}|-xvZp>%kghbv(0`*1 z;X+cDmEGnM-5*gq7wZKu&p2C0k_<*Qein*OW7$Ca$yrOmaSSVyhuOXH z_w%swh`Bs11&de?&j`J9`ig?ajKwnoF(~S?)nof_0}yyZ$SMxlV!p(>NE;yR=-qVsg@VIzDA6?)ioq#eFV+G14t8^MBkK;rTb3Sj1*Nckzo zBf;nUJ0!h(Kq$gNO0}~VDck1y2sN{T2m826Fqh08T)$zwD{oKgx$#!)Lk- zP6gE#0*S+@Z%LOSl79#$x9kIj$Er}=c!){C_B6EikK8^yjD-a?|2tC@0*V!RhL2Qk zM7Js4`+|lu;n55Co>yoA268KB<=^1JkM*Xm)f4LX->LPaqzk*cMr|xr>i%FCdiu>l zDV#t+K}+M_3+Zhr|F+!0M|C4$;VA2ZA76n4che`E-D%KD`H7F-QvihDq9@lM;=y@& zmh|CIKRQA$cDMiN0(3rkRPnBl`ur8v@_Qtj-TSh3L0aMY$Rs*4nPwlie-)qvU zYDf3!8?m>CrlH6`R6!|h5nSNk89t#Th_l#pP`SGUwA(D64cd;w;R6@q*}k@+rue^` za-K`TGCFuRR*yP=;5E3SLqz5wxJvo@<)j6`-$mc%YWq;NW9Wig#sjlNigWsm8$Bax(!I15oSGQJV}hvyR(a*Q8*U5@SooUA#azpw@g z3a8P?edq)F>(g$>jKk53&a~Gf=@ckBd1r94lY0IuvX{!k$KZi&OUZ3faS{r(pU!^_ zoJThUstK10OQ3*L(JAmM3DG%C%-@O~2IdVdc}*oO;u$*-k$SHPvFPB1YEL{sFA?pA z;qgVV9shnMrv(F@#i{~^Wa|8J?hAqK>+bi$Xn)#1GSG_tTb7GAu#K^GCe~cM84;55s#uJhHCDBl1!y&NX`sMNijk8{e)+c$zalxF{l=|IEK2 zWkG=Jxi`*UE-C|~_%H?q_YUCvcW-+$rVZ>XG#x^{hS0q8sgvvWE5M=f*Cg!=_4n_b z6n&q79TMoMztMjhJPXq<>IC*D0}vN;^~T>o;kAoExXy=8?TzGaf^sYQ;2s^g~iK&-O2EC}qpH6SPKfC^C1#aqIp?NiM)m?88bk^kP*xr)h!%mI@aSskIi`S(_^7ew~ z&2zM~_zaYBF}bRy2#0P@WnAnwBg1LhZpj(s6n|1HiV|F~}BM%EtK2@z;fwc1JbK+*PF9kf$46o2V@d;{xF`Y zYtc?8fR*X3QPVwmWTiB179>}Rh8~!R&ktt`tRBsJ9jBWv8b%Z^a{>R285HE7#d@=v2tv*C<;<_2Q;)wo@5~+eJponx1A0$G z2jDBqGp378ONi9=$q@{4V5_CHlh+G}G$a%9k1;JmyEhkY=(7MsD%|iIy!si0Us+#~ z%O=9txV>A^A{dD5iDiDMI|p+6orCD)sK5Vp1TSalrITU!ac{_1B`hf8g3qr#Ekmb9 zCI4xPpzF1l!r@tnWV?3FWEF#6CfB}@ zYpzCSg98W1s#qj{)P{X$x*kdkes~+~A;T%Q_1;H~)ayU3y3c>v)?5ObFgpLF=SIZH8+hiRW@V8(?_6cEz;&x zPy;-+)74v?8vyaM5}^}!7Qw#9PpQXc2K2W5wDkj`;j$#*$No37DAjd1_rtkC)Kv3b z?d5MWY`Z%DsS%^Df4?4VO!f68f;S`UPCy<8LbhyGWNN3u&*+BNErT|6QzK6xVpk7j zayV-YM=yYK+=*8oBNJej_E(GO-gM9@`N5}DJ&IT}OV?ky525>E@tCXii*UE#+|p5w z|H1#6KV=QMhX(cF8O~7&ZQ$a*vG7Kl(;$ND=qT_f~E#e}F+1-IHC0Doiyh5$_>NO)Mtk9e( z>E$3anyQqWl4?+3tI)S|k~2_0GyH@givv%U`DKSF0!ncF>#b|kh>Q$Ag+5lxhoU)V z4b7_y@buV()j2@|^mWN|P(D+i|18Nq9y1|Cgjkap(&En!q+m7JF1SiSNAu%T==|Hz z?E??uCA|6YDELZ}dH%_g4;hDwxx5FBHJGVLOHFgon|CW3iSe2as{-UV-j| z3-Bk-CxUaC`un@>i4Hb0kq8$eG_BQnW{{Zat$ykFY1H75!F{B#9pwh zug&U&AQlHb>mT0S&s~6mo%?%U+76(FFQXUodfUL+)y$tYpNxo-S|F5yg+WHUGf|9< zXu-FkpfRlmS^0?mF5pfA(Xiq#LGnZ3yr1hEPxuPx>su0AR;l-Y-%#j~{A9NXJ$fn& zk}!zEr32GWz8OLKg5lQBD=JZN)JvhQ=t&qL9!Pk;%a@oz>p7R-<8Uv|o7=gh0}>{q zR(`ZLgV5XMpTsTMXFwepUZcKPc~4`f1Tb5+nfIv1Kh!H*pl*g{VSUQ7v^_0 zI$@^bjg@XkAv64>9X&FdkV)e4RK$WmOX#cd%e`<)%a77du0|RA8LaFH{eW*3YvaBj zk0iJ3(l_5xAR+(a`*kMj@#oXc{e}I@csTpMo%3|^IJ{<=Y0#UVN4baO)ly=Lz$1`B zYMYsazB*sbnx+|sXPhoQ30N%BJ1_1rWL=1|3``lk&7O=l}RRk23a!p4Ig&LKk(O>An9l1Pt1wjQI3<7@Iit>Z?5w>S?OZ1e8+OU$oAx4qc z$I#~Y<7b;gTEWfZY>4O160qvNmGESuZvV$|cGr_+C=kP0axd-B0HR?X=N&vzg^alN zD+u{Tf}8&Pyhqs?cTQBb{kII?%d+|Cc?ThoL?qe#tKH>oR`QYTR-}AEKJ%i{ z5E96;eBy9_8NPIv^Dq`Pq9vbtY394Vux4+|yERt|#{Wp~OG*%=DlI1U@a*cZpy_qp zC)D|aaW;lqYgacuc|P@#?ivA!fBP*I#5V{w0Va3jch`A8dp^Tkfe2(apW=uM^RPBr z9G=h|jr5(Ae=6?sM}3iToN#(0k~ACfZ^{~h8OQg3wBIiSpHg7-YenkzKc;^${^A`9 znBTk3d6csj)Kq3F`(nBgXHoJs`7doC^vp9&`E)hv`x~Gpl(_;lOX@9?4hVM61X(k9 zG$8*m8P(djRuDRg$zX^rLuqcw!}gdJ5OwuYVd1Kvx_{dHU0ov;L|8knN(j9^kM!g( z&NEzXM6Cy=-a1C-fkf!~+}t%Rv_sBM$xIwDuumQ=sl!2v6cbmFRRc1v{BYyD`2hNz zTdotcHiz6oKH6Ll-PI}MjIXC?A5mRjE3~)Y?b`&@XB|mqY3_&DJ~xk@TV6tn8o2RK zqUpfj8_0Ie1&5?EDa>)4i;yJL^+@+Z6l!0$D^)O0hIjJjooc1K`uWMlKg7Ejs9ZCj z!wt>?W!qI{`w{j0=LeDur>h;wVC>IZkk5vL&HCQ9lYV)qS*wO`$Ep#*o9&-18W^PC z6^?tLFb@`0vExgM^9cLl3Q5zW4{lwE9*;;KLfW_|XCGX_fTDN0<3BqRMA)_Q(wI}f ze{b#-X8+f@1P?JvgdFxcbk^WToSJ1I6tgI#)ZFiY=%f=O@7!l$UGyOP=hY=}`MC!> zpPvHdBE1z6`i)30+`9JH(N8FpBh<$2NIXi&u<@x*Uxgz_v$KqRspsD&=e(Y3{YwDR zltjh-D|28vLnd6iG7g4L7Fz{z?Z7l!P;*ZngUpLgbMi5hp#7QX&+)-hbo0`GaW9z5 zz(L4Lm{(yM;Tm%1jZ52*!!S>6sMQjDZFv!(T0mWY3@5+XxlA(yBe%6Vp3E;nu$>s~ z!4pkTYY;+%-nF1+ncH%-v_w=wD-`$g(k$@rz3lyi6@!L4Uz${6YmudJMd;2Y48pW^ zHO*wzLx`P9=KFn%z+3fxL`k}c>i(PG`X`#RE`iYIb@iw;UkIPS^~uI-8f3(rgmsmR z5!>MT)B?^C^lIqN^erC(xLI2lelf(sskkhkYid1ky~OBpPg_5t^X>J|@FOB@@i5Z~ zPCRU0P5*nllsbRtbH{%EyF`YZzi&cskIf)^UzeiknGslHceh|&ZiI-N-mwd}hTx1q zQn-=dA{=M^`}LvqG|r0Nw_*z;oG?IXogemt{aVxZZ;Vc3RrPNiwbews%~oU`l>y$isxhixOO zqzFuI&Fg*Z`T}FN9e%dkBdFe`dnZ+66wyTM^{N*w!lY=V_h)D7{?EI}c`AD!9u{SD zI(UUiu$Mo(#`9nUaL{=_%9Z;JDinM!({mhZw9=}&?1uv**FlZ39fTjQ;ZCO+7r|ua3`@w_k5t!>A8*<;LlpS=V|bzcYZKyW`|m?F zQyV|9$36lf3m^gG(U2(4*z6+C3_flgAv91D}JhMCI_jQ+3n!Rc4F`Crv|8{6jTSaM?KYl;hGW#)#N~*&h>&6Gb+w;zR^$CQ| zUY#oCv7Ld`%xp8dR2)Rq=H2{sfq)D~POV%HYeeF{(X0v)MUc~)t>@fF1ZA~`!qFxI zJh)$W?L`^&{L{vf;Gwr#MEKf!|8VKIHnhsadDUx+fEab_z5X+8L$uYxk@=y+5P2kS z|M7zqAU#ese>hkODi_`;e#90+<@$>y0arZidz`FYbaU4aK-`}1j0?~`pWec#L;d}I zCg@iuew_$E0|r(^-^`);hL%$YS*B2x+hyjI#CDWm@!)8+7#6aUeV^WWM~2(~$JlxQ zQ~kexT(V2HN=hgsvnlJ6LP=$mQ9^?xNkm9SR5HuR$R62yub%eadppiK4re$bc`MY{ z=Px+lpWWQ9^SWNI=XE{q*YkN@&n?Z7v9WYWJA`A_OX!68pvX~|+d~j)kr)`Y-G!

QqYN=_OyQ>-%krD##J^Bis$5qct1P=qdbwS2;izUF%tv-$u zragaA|B}(%^$%pY{8g)<^Lj6e{&a=R=C-3F4Zo-lf385c+6z)t=0<^T*jidYViB%h z`gy!0b^@N<)nU@|?toj$1#W*Pn?Sebxnkcq25~j-5!KsSe;%awH{(`m>z|9|-g0dr z80dWNm7=pvf}YeMY2BMOsIB9Y`WL=7M5o)HQNe+ud(b?X_Wtv3g)`ALTJvDDs`l!{{0J8_W&|JM*`OtGI~Q^tc; zv53XW)I0=p#IaBw($-%SwJfZmBpjS!dhy=$-#pT%BNnKl5ww1cdCI`27Lhr*H%xdI zq2aSwS=k{x7$167VGvUb4~r-KwK+S%jyxA3v!?;ROhl$)6o=87MHwfw^E}}WVGKDL zw4Xm#J22T9OM=wDr=zuoroiLrul=`rIzTE^J9|y08f|43Sk-+TMa2gO>T|1ixSq&D zPGlQK>w5F$KdtMLiT9JR9`<2WdNea7NUsfe_et0#eW$?TJ(h2EJ!sn>;UmhNd_sli z$y)Rt7k2nVATr2Sw-{xdJ9@Y_BmtN%7~L3q+Xt=mna0Adi*OBh_G@b)7CteRI43ao zg4{l{oYVG|$il#2_opf>+GSN6FY=NIV*!Wpg@0-9zv`a()1#>-_1(TyrjMVXJP+vsq`Tg-s+w2?#^j|o_mT)0h3*b^4m7?~BK@qVCs&rP>h%P<4${Y-n;0ZgY0<;1;p4r7gK64dvX||3UmS;X z7hCIYG4_F&YYp-NPU&ag1J73l1=Mz4JabV9`o((mwWAy%0bsVw%Da{jYB` zsI_PYoCDprN>37@;Wu}B%fWn__6OxG-R1CPpqNJ2xf5rQg_?I$`Y8u=`k9UOu~+Tz zw-PwTKFq)(&lQvTZ899NXp=Rsz>%iU6vr%q~1bbYvHf{#co)P@$q*i1?eHoMUwyLtQS%pXYGT!y}!h>_LPD!BNh4=l1RJ z$Js3&+w^{P4!_8JR&4?KcWe^)&2i9>eU<#DlQw_wc?8aR=MVuSGQc|XeFi;j|4{Ol za|D8o#7#xdH^Gl9&ZOR=A;>P4JjRhlf@z4!+ju$&UQMe%Cf6UMs>{M1Ju0&(*rzaw ze!d&&*GeQ%LP;QASlTm6|NrPe-w5qaYa_sa*Y@Pi@y-Hk0>_6;<5{4)`#?0#WJiC> zk60Zm#v#jx>_K;S?eM3}*dBv7wJ;_ioYOZJ4JIu|a=kT&(Us>byKNT6&|-H?sB9Vu znEKasE8A%Ehi19;owza_6iU6akx5ttPQhC&l|O3XvRjR9a8oqw+uFx)hX;pDbW-h> zcVR)%g&=-|IESqE2u;PB6{D{SPpi$3Vo=@h4&lda18~4;Fi7Jt3D)u{e}t*gH0>L9 z=vK~(n4jsouQW@A94DRLw}KU@ zrz|JDY_JQQUO8cnC7RLD8BT`pw)Jqn`t^x40u}O$b}5dZqwRkl!Ah*QECtjh%?0E5 z#!#aSx0sM}Kg`5T{MC=ILq*Z|(22NdFfa&bonyhlu4V2-4guczCS9?=M*wH<6y1s`+VeNga79LhJ|lph2D$@?Xm(;O6IX?0H8K*md=c2|D57#2_=<#+!a5 zm@Rp3;4cAg9My8-U^Rn)n*mk9B^(?7=}vq7%WdUnyf3rttXYIN=nz+RTUV;>@VQGe3nbTaXW9}R^}pW?4$A?nk06HMCze0<8uotHR-5?C2r#{F7>=US=?R+5C;gqX@cV|R3d zxDG4OcER&xOK$#FYWnD`vktP{_ ztpt4+kE=mxLm|fvezzk1_{f!g--zh%RDlVrJqGT2JvL>d_Jcr1d=5^t3h5s|wY01> z2xmxcu@>U#$TIe%ae^Kd@Q#-^PLpZxKkvD;{W>Ie9$c5s9-`A6hOK^u{+s|jy24QZ zrSC}&FbQ)d7kV!siC33Sgwzi}i9EG6<2(-KmTs{5RpucbrlUf0a<`Ce`rnqIlN6BH z)sjMRo`OFwR4hH2Xvd!~m!WgRdkN}aOPN4xBMMFYH}s)l80lf1cL_09fT>KYk@XFP zM54}|TP|DxeP&r@LKhxs-aE?N&X|u(oW*)A&W}LqJyO$B8y;jD6$kZ9n?|^_gAotAh!FL@7~E=f9 zn>QW*jzuPqUUxaZAp&YME0)?#yZ*_B6^y;?K>_-VwT}ymI$Jf2!)$e!E?rAKLSFEdrpse&Et|+Dj(pMN_umatPMQLzSe0MweO^k(}3ur-W>4%Ae161%TzreNI zJsnP2?~2b>sz3dYKwDsLXp<_~3lLH%J#2&E8Q5G&a zM?oz8zjo>Qd<7@=9$8%rELynW+}|fkg7B&Pk92s`kk0ezM)}+6VDYW6&A*iZiyi;| zGFD@NvDur??#DFjZ}zZW%%San+3o*K7#N8#A{qVcpC1k^nhpo#t$86#z!Tnx;U*NO z6?!7u0fUa$-)x=ByF{vf5H|L~yU40s0M z1P_mp0pl|yB@nU`PgVBHjrO&mR1UqzoAnE*qNlew<;@H%X=o}PTAV_~-rhdvrt6Ry zdqEU$>lDiIPyA7GvksKYMsHj0@SNr!PoDXH+Vj8OJ`(5bOC~`^_vJ0iD+TcSKan+OPOG3K|&D5%w`-F>OVSe(LI}EjaYxCcATy z{31+gr3hembgjLPRPe{BPY`}S?i~6$greqH#{ODPBCsp}(ilYoW5qcJox`;IAD(_aS;IPqm@7hWw+%l*1-j582p7W>iOvyOZqjlt~^oKdf6J}sp_&bO8 z-TJBUmc0x`uAD#4Mu$PH2E1>@xOeo4{84Z0DuxPw2i}I{i~T?DAH2vZykD3Cvwmf+0w>1NuxWv%Q+gi^ zDG8>@#nvO`vUj)qd#B+lCeSzD8VBc}U`j0g@F=o3X)}1b0rfpHNxQpT4g=-6c26kt z;NbKsQ)!t1NfzyP^!sS@$EtVw*NRUBxMyq6NvG9>Bo1sDT-!@POu@X$w*0N=Pu1F4 zL&rhzKYnpuL7NJGuG%FV_;N_?#Ud z1eY5*r-a1vp@s)T-ZJind3WRY<8FOmdS82Gim@N*I~Qj@c(?>+Eb3lG@wEBlqeYn4 z9yTnDgp2NX8D0Qo*8e6h3XC9mC5eJb>sHXQWD<^hNJ5goj%D8Q$H1MJ6~1ej4&+9q zhFGaqq14->HFrxwA+->H^>X_-aEK<%H8C!Mrt`y*HgVefPbG1?PxJ*Z!PX0h`$N;s zh>G)lqGhlv=`Vg(`|IwKz)!i3P~4@z!ZqvmBC z)FI-#HTDHG;vy|AxjBr&-q_MT$5o+Y8I4+UH;M2^X>Z6o_MP=VsF=Z&T@UYdNG|U! zcj8Y{a!dbo6-ZI9cTMMyAWdG`E{)11h})YwzBNw!{0-(__nUi;6mU4W7&vJ)38|O5 zo(*y|!D#CE?>iT3(L}x$|3KI%qI;e5u3$d}6mvvIctZx!$*plWt>gyevS5+WF5Qn@ z=&}|t#+{%V{a^bNW-7RbF{VfSqaFV{KkAHsY@|YT$Z0)w`+np#+#_;TH6DFBt$k0~ zHUsnp4?10C?tu`Gh%DZxi?CF?7~FOV2m1^~Cb2!eaLcFcgpXhYdUxX-9Y;MD`OPkW zWq3yfO^hk_)3+>|{`Xkf#XOo!flvHz6^huWAR}V9GO8gT<*8dM4n1l`LuXm)*^H*p z1|z*diZumntTq0OM%AKub_<61rCzAxLQ{{FUP6zZE5lfF9n39CTJJAk2Dja*?jvTj z`6I7b{2*Wc~XWkz%cf=`XQK$o%YdC-Zd+qGp)Nv;8GO&Vfg6x9R4GX(XOdp~i?)uuCGz{EA7`@mz3MdO*@6I_yTmSy_?CALJM1{34 za+zM8?V#bQ)uDHz8|9we^ga~Q4t1_KuZZ(^pbZ{Ak3g+u@X~toRyrpH)D?Z5qK?(0 zhG55s!HZpBaU>$k$~qB#-*5}vKC%oqoSo{ty=n6Y`vLKlH9I04<7H)@^qWIE!!?Xd z_xjK;x@w8zT}4oG@YAu)UM%z%UDk0h#KBuvnZFG3b0E0_H#vnGk@8C`&cMZb$&e zHZ8-0|BQI|ksou2Q`-5Mg-b8oew|_m-fG>Sn&(dbV+c?70fu90iEw?d;cDwE5 z+57f^JO1CucEU8tCc=T66ZJ#RzUbx2$us`Hm!WPw(Er0N8`}Eo_gN0Z+jwBBj8$&f zzyqH6_5~3$4lPX`ml}QAp~CRNLyetyZ{u;bF?nVIIPn_0!o+(}3+vv>Ke7d|u{0>S zdUqOGryVYTAXG>yV&%eyPo1T@k^S+MWtzB23d&CdV87RAz_oO!s>{F!#71DWeU3>JDqm<+?hC#d1G@m6r9)U`OgDnyEEx;)1c8SO~3L+P4ic%>g z_yYav%iqW0M`vzEBYiYtW=-9CH$00%amjk&o^41?&H7LxCmFi1{dmZP`KR$Bq!JBkdKlV3&Ia2} zkbDcCJ$fqqTti4LY+U%G?KBFVOu3&MyrX{%{&j8Kr=5SyALzE9K8XWGg#@OrFNvU> znQ&FDs0*)S4*h^bqxQK`rJ8- z8q9h3zBn)d&soE!KV2lj#DO4l`o?6M_M3T+O~-gqAviP5=(t`x()@7k%yr>z7`AB} zZMANLbK1_n13BFwt-Rmj&ma|Y-lPkLkm}HXpax9xxT0o`p`Xn~cL z$2Iy>J3N!;Q515JHh&}&pAH7|QQ)g8_mdu$31n5?-C8Tt2annAyWX~GK%sk+q8&D- zA>)Txo@p5lVvno(d0)b#);U*XliLcnHYm-CT(CpB7|;i74@+AB5)bI^}d0RCw^* zgP41*3jUxG?DCxw=x6efS9jadTTSLoIW7Ij&Z^YidWitM9h(Ez6x#Xs`sgc1ivtT_ z_<;4e%@h_z+|*Cf+CPe}OyyWyux&$P=)}R+4m?!fX1LL`!@nL(m-15>3SmTnT$#M1 zOPt+|#qEgQa9Q5NrHXL?`Ch3QY^`5{K`zTSZ+F`KQGhNON)66|?!5I-;q1=u`1Ahx zq|PX^OHj9)yU_}Q@1JewekP%xUO}A|>KIs$w69JV=|+-4A?adCl_)X6ao6<6VBlT# zVGMSfgh}y&^BX()UvIr?Yte*u|4n~!n6Zi}6}BXUEj>jVkim+2j8tzw^0-~@EAp)r zjfok182#-7>NWmoaxn>fAc@XaRaxwnju!noayj32Jt)99ovj1 z!TMRvc0(W9`G0XhWwd8y2K@G#_b)e*fqi;?kyW%7NffZ1EpKZ@84_#U*%TsLVGB0Q z44egBojr^`YD3_^{iR%tT!EgaDo?aa4Fe^L=Y0RJe1tVtu$2|2f{XI5*qB<{`_G#X zRjM3i2=FAKXmIuQ0Ni)v5`e?=D4eNy^ytwv;KnTMt>#!jcccz6cvkeob?tDY7y~>~ z+xTbr+&CMlVQzm|jZ{QO#pbOp-&}(6Czd?wvEy(cm#f(S9PRicC_9CZQ(c0lg4`c5 zP4%cWLi2FNy)kt2*ye@r+a<7W`yk|Jax;?BlF&JQYyn<4R#;rJo<|#*O@|wweM82R zBmW-+v5CW{ZhHiPd39e~JZ$Ntai1T8+T;W&DWMQWtRk6To@ImB465__HHu z1hLa;wEMI#0i$i$5rs3f`Gcdm_Kex_C5V>aZLiNa4ldLi#Sc2GVNjyw)Ajq`k?Wk; zc*CU;bXGC+SAZ`CDz>QEZ+!;PRUu_8%TxopU4ld+aUCedu<5BmZWq|nAGBw4L3#@Y3-B!b$aG-QQOKR>S z2rI<<9~Qv@>viESt*~AoiM&~fd(@2dCCBG>Kft0zg6Lz}1R_)?v8NQj%%SQ3oYmJ3 z@21H+>$gRh`Oqvh$roNd-j;~C7blKcMz^B*91243awNBDxE6V3 z>I|8!^}^Iek8h_=#iC5dY@eFUTF?|QZF`QE0WVDsvv^2*|CcSf%)Z`d0v6nEq<#h> zQcOLfzSKMgslms;)2p?j7xR%12lUDCSK_6O>IDqA+9*8=jI4xDyCr6P?{x!zsX~WC z${>=@EhHrhjliRv=_U4C6u_AKN(yJu?mu|RR>L@cXoo-eCkFWZy5Y}-PVLusdeNbe zVUPWs+kweGVEyFRUZhsfC~%iRg?XJrZ>dp9=ypPE@{6@PG?Eku$-BBC{AbTok)Cq+ zk2n3w*`HJp$fq2Cu$OlHiL(2A&bX5ZeOA^lD!XTq?^5Ein5jXuH$BP1l&1t#ad-Vy z60opgttzCjqt9hDS>5kCV_@c4X`9~92Gq2vrXq&TL*o|n9*>!DNa1<6Mw|x`=KcJQ zOVw%5AD0m*9K3RO0@5_SkMm@8!iSy?T?(y=RP+6TrSD1x1mTX8c zES`>eVVQ^QY^VII*>WJj`uu+^e+Y1Cg6*42_RjCRpd%ytaT>};vJdKgqP_lFZuI86 zhAsjhA-yW~E*^w%M`FH2<$$V_|H=B#JNy~1BKf5PgFgOtIO_R+9&RvpX79?wpm)zc z;RJPiLEUu!!~Viiq?XnM%XOn*YrA@`Pl60~Y`p98zi8Lr*{u$Ve7R161y|kmwD@VX zf3w7{$t??&miZabMYh9t_t^J`L#Dy&_|4BB?@~a*4Q(LFC`1gg+K1iMh!p)6-wbc& zKyqnZ7Z=APM4_xJcrP!5O|r|)Ho_a){f7rnEV{nL!EPxj-Dy<4j;i#^9238l5^zf-|_rN)DvAUFFrAAwSsd#55?Gq=0 zK$C!bxD5uK&V1Xnz&Qf?#Y;I1Qmt@FBE>Ugo%i2tvKRWl&ZHnDm0L`@nWnU&ILC#c& z_cay+m#sPd(4UzIxxoRA`W)iLYk!caa->rW6`K=q|5L2{tw*fj@UwbX{zX5bW zkPOgj3hXdSvdf_@JrPzwD4FcX;v3m0Nfx@-- zAsS&+uqjP&)VF9v`*)#zhEttTNyw>o``3puDtCJQZ{^mNadMwEgeH zianylMgcl$Lw<*)3ACcBn;$mY4U3Hve~nce(QK0*$aBrWG_~bjG26 zL#6$6dmEAWe|Wl{2i2gkHb_zbw8H_9i+>L(ErMjuo@W(iwEGX{th}*}lLRn4S7xB1 zRflB%J=3~EPe7eIuSKa1Ey&KgM@*h)08~kKc4|&kU|~;P5oi4l1|=AV#_Odp#($UJ z^feyHS4x-2-Ti1okuFQ#1J&`5oh+;45wenE$H7P-3UMIxk>f6A2OXCQYLW0Am zI->?AXCb7weLQeaHxy}2Na%Pq!`D(0A^#T!4M@PSX+I;?| z7^)3yX$JxUk_fxBCcNg+v1fSe@DEAovlY(2w`LTstZo_|U!4bKuQHRD z%y>9yZZ)Q5N8A6@*K7S@0a!>}6ZbqtSwN;$R)IMcLrBW>+7{!QpYzftAI{`kuE5RYL6w|K1 zelO!#`IWT<=H0e`OI1f9lVfU#aIy#vd|f>2qKuF@({g0q>0w0i5IA#gV&}Uy+I5gz z(vJ#H*SROtHzL0Y^#|^In^BlgSeWuxH!iP_sw}FoaTcMsbU9y5gIFz-}C*1fF=ic&`^E zhi(g7EVd%eglEGWyjawrJY7!Q;kAauq_K+wwENFke_8(OQ6j^7T+4;H5)3?2U}qHd z^+oPbx@)$s6-6A{CpnaeK{-rGLoe9Ku=X!iF+==2dNg?AmdejwsBKYB6`IXL+QY~g^zr3{y%Y8DTaPtz8Q%r`2e&2PpkY*fSq~HXZUp=?iT9*2WT1W$ zxgzFAd;Stz=J&r@14|%xAbd$jwhzWeCtuWf_MspLnX8}gw8P4PTh0)*9~lUvfVEFl z_~0IP{&!Xp^3}8dI@D8#F85%@-8Z`cWA@&+@>e}vPvcz<>!5-e3sGk>oA&&Lvp=@P zO4vxC-Qc~_?zO=gH0`VH_P5&IJOQl5ld49>?2&p^jJk5`vL*KK1&jiMkK#tAs+2qASG_oY2wl0*_n8KV7QK&I2DHyVCKzs3mYFPqO-T~peP2A-?m2zn8c#X6 zdRsDWinJmPCiR*FSPasi(`ikS*vYG>voDO?n?)_(Jmq|3dx2@eS&3PE44HpkT@e@> zf}qvYYp!`@AXJm6XESKuKYk);GSBu61+qU>vCg$mA=B71f?SM+C|Nmic`>{lW*Ntx zDdbK;3eWk@wonQ%C2!>Y8Ba#PgM4`W2o1=iGnd}rNiiH?87LYrdkR6tB}RJ*%MkvN zO7}}768_wua1QA`nyK$;ibrxoX4ok(#j-d77 zQw_dW4d@we!0G<-5E2XyAMAWk2cAc7SUy`^f?Srk#0@vv^YMI8q^k5UEMe6XmQpeda3ICMEK5AANMjAgUqWm6yLTDgC5>A zZnmTqo^*^srRfA*>LhT4GLzxwdZL_7=`h$)MvRzR(~-TdTfAiYG`gKv>OXL#4iOYE zI2(W~E`eq-nRI}_azy20Qdw$*8BRGH@aGwf$axrL*^szd+h6t&<`ChTD z($4=|bZYAO12}jlX&juBK!o><-}4L>(qYVC##y!B8BRWOPz)sE(L}n9QDi&@e7P25 zf@0^8+0W*j^q2N=?&fapeN>6#pQ+jKPJU%_4zGXKkRmQx@&|Lx6GD+_^JN@KPHS8j+7R|%Y7O|mk#=iJlWTVhM6oCPw5jN z^GR6mhZF*E{@9h`a<&>=*RLMz9qxexwgIK)lmeGXaMQ9$@h9*qyopyK6cR( z+TWivUC@8yD_Cg$=5HlvPk;>1;hVy@$5FvsTb}Kp7N{$yn2NLz5#u+egSl-Om=mOk z?*815>^%NR9^ooSt62gJJ*uCe@uTgJu>Kh+y;itSfr$dn()g1nkI}9_${YN7B`mfK zeg%ZHUdO(oD(e(w$;M7Z*XqwxWn7H1&vE~w_pOKMX6b2hZZec4KGsk$#sIgXbAG68 zHyChyagrWyh9`cvP75q!(9O`U1Km+1$XKs?blI4;{;lWig6JL)P`{pRGsoQl&^~4SgShi|Qj|G;(w}e0U+T(_|HNXT8i6Bc%o2#k-NuP1 zjse+Z7`;3~TmMp>E@#!wQGmDWcMQ4zJ9=XA^-16J2_!1U9rE0=5LmtEn+soeqJ0Xn z3j4kgz|l>%BqVYkumy@tq+in`Gf<#NCmR(dD{Lr z8kxOhC4>dLko#-}PZrUEFA_ysltFZ79;dxqwHR@}E)TqGNP>_ya__Rv97JC2*PtA0 z0pi&@{eZr1_-b9Y$0{xvByNwr+SS&DIgncS5~_YpoUC zJndo6wmOIA2e7Ap$&f&3X!Tm+-|xt_>9#`n*c8mBBN+hVyP{ z8TdK)jLd3i>tEL9X=}%gAuvB~ebjP{h`!iL%4}=Q0=(>b#Ax4!@_G;8$zRB@5Gco1 zhna?_BR`T@BHF;7->H&Ax(n{zF)cFuFotw3Cx0<9kAjGM8f%X{85DYp_B^N3-hbu$ zcUn~N;S&5#s5HJqHvo?;DOy)5`w?dJbiE^QJ5&`<{yNn*gp5?=i%r*-AdusA!k>JE zMDytL`J?Ml#=Q8&gorMNFW$mB2Y(Pg4DKb!58JPVnF-+rwYe;b4m6^$ZY8GB}L;wPN3}5;evW#``lt8)7y#;dmYS8 z-Ld~;%Sa>e7Xhq<6dnIPn?gmI5*!-aJ#a4nhf!DI7-CcARA)%-1F@VdD#jWV5b!BD zcxRio{*8+NaC57c0wPzRR$llxiIl9;XOu6Mp*RtSvi0D0s4;y?zj1RCDsBpYh{RC9 zpE@aLHIR+kDpXX<3mXt?%KeASd#gZhq*m!-l^@`LDT)6cSO&={vQCOg3{C$VzPNJg z6mbqrBrCPSa1oBvPyJ#i3_;yoQ)4%CI~d(q{$0yGk1Fl!ev4G#!K=xNFlsc0R?`-8 z-)$#BVx)T~2QLOCKJa_DrE7&oH9onFrja4>ea|jOX@8pbcmDqpiyj6J?)7+^;Y9{N zZf;xlvoYZB_qgqdMH}+44=TSeN4U7~bxG7);q&4}l$N?N4;4 z;Of<&QvDtNXtBKLP$)PERuzk*9AfLqMIyBGzmImD_K|}) zsCteQE6mu*8zZ7-I^QCI!O4YB|F8zKz=Sg0F`q}x|GG?8%rM}&@kTyUdk%@z#nJh% z)S_DtE}Jy&tj9_H39S({2&d=kbqyCuU}q}+%~X)~{D;Ylg4aujmf-bxlySOVH`voBx^a8t88;PvOiVU@%Wg$e?|8%G3pyb2kvemOOc&x1 z+hsCwvJZZl8QTy=sj%zSDQ1=c+WyzZDrx@xj|^=uH6F6tO`!z_wVH1n?eOn*m~T~9 z6ViT7nkhOv1An<)?AP1pVJu7BLlD2iU+AZ&hiD@jxYMv&{kj$o3#2hzj>5u{@YAQH zIwAyo@RvTkPJ90A&ib#KmtBB|)XJ?hyyb|e=0M2B$$9kEXyZBKofb4-e@yesjXvLhJ29q?868GgRPdN6Yo%||%q`wtK%<~6m9a;cy#TvKp;(4eh@HyYY z*TGGZx`+UUUPyM-Jo@iL1;pJ}4LyHr0J-YFtCw)2!tO^^)am*E$NbUBmn|o&a1ePX zBJT#wTw)$r_fgW@VkeWDJAShi&*hh+pgfIAayGqYNVuqsFC7VICynTkQ;AJU# zl!>K1BZK!m^+Vf9ZDYxc~A1%XveK}!C-fytTD|{eq zpasQpi+Yr=6{04WN`Jn|T&P)JU+Ur`!#pnWo?br&7{6_d#?5!bJHE_g`8q8?*WJ9( zg2$lof76=}qe&2Ew%aAsm$v@B+u$FyrZ5A!t1l8?ZIa=Ww2!y9eGQ7$xJMe8X+d$X zs`A<25s|*!0ta)*4D8M*`YjPL3hVzdkw2@JqMdla>BBGvzE73AYbQ$)S3s2S(uXBb z>iutN2}MvhfZqDgQ!~cX)UwzSsX+ z9RTU_F($c7^XPFz$mGdesptV0kJBmcZ{W;zOi8zR3HEnDgmCI8xa)R4j<%*9eZFEpnG}}#eeu3#+Z{29QSm%5A}4Tl~XO1U+)oM(vGU|X6HLS zl2qYIeEbfreEv0HJ2ncUF5yQ?qY0qA-(=2M9S0LntHO)6X`ert)Nv@@-9HEEnR;ge z8y3;4HWjy|n}cYj{Oz+Kwn8L!r=^qmGYQ1s%|sNBW8ev&Stq*L3Vm}5)OW{wAjg7b z-0yiPNJ*s3i~5Wp5eF%1^2!o~UNDe!enp!7CSt#$Dk!OQq zFPyOb%kuUo6;2dO`gK*(j(-b6uQ~{ER9IF0@_s0~A5k_kWBwYI!#dI3y5Fl5m>I5_ zl`6FW{v6$Es0$Ie-Q@#51!AGWL2pDor3Z{-EmD0dy3uCbKgBa@JN&V4kK)gHB1n4j zyv8`tuK&HtW!fl=A%eT4>Z_;&IQXzhrc+b<2Ijn3XYu>nQ2zzd!0$s?Bpj^vy3L;m zzVfwBsgnp%ICHz=YI9f(`)kML#c1P=tb7E8&XA*rq5=OiKOm3P!zgdz58IRmaFH1%ctMGXHO!E}liOYF` zx60wCO~B)<+&N$?*mvooG6CA7e>HuznFjKSplEx626X-g^MxYeM))UmoPl8-hj1C` zj)E?W&}EXXVEK(Ue=>v&MD@>10^8K?Hs-k&s0~RQ=vJg4e4O4VAry%wO9jSw$}mXB zsD#<>I2kx@HfU9Emm-u#&B25fLT+?cql41|)NYxnAI8o?@Pk*ge-fwRm088QCo}E( zS7rN$KgGifkl|UZmK~0VN5>?@DOX$Ipjt$!j7l3i;?5Gf``R2@?w0Yh^P{jvFxz0~OfGgd3=0i)MaVPI`q+lVs6Z37x%ew)o zXug#^JpCOQPMEoI8->B8<-EKz^~>NQne7@g4ca9kwdRAh%)%Q zz@<0}Mx}$^J3b);13M{~ec6GgeL`y>=CCIQ(&!p~_F0p`LM?&7?{E)JOHoBX#M`hw&A|XPBc%NzoqiF4(RV(e0rEd z1^pP?=UZ~L@BgYfA>ZJ6ask#tpK~3EX#fYUUtfI!=b?X`-}ii0D2lkqEjQMLLvHK^ z3v3s#5czo`BuH-#T+av?c>L>t9-iMgeXl`uSGa0i21`Vg=I7c>{21uh6Wd2RMZ5p4 z?c$zE`}IX=vXQ-F!!?I;rB)1hmWJTL{NcKfMQxC=k9fblavJ{AKkl8rO@c$8?v>ID z_Cwm>@=xO3LUhzS?D<0D1Zpb08*uwjF6yWX7Yf;;fXY{em++Ey{NK&3u*>tzA_y&? z7;y9*g9_D$Q+&TLa8HT%plL%B@;Ef=q-B6Z%+h;B+Zh(Xk~^q)W@Z=+`L5qyc=Hwg zyF7fGd2b(D5ArtGe1}Dr_d0?c`WE4$ylzf~8twcabYfT_

TEAawX#IuYo2SNX3- z+y}dv{4jnaC$uSb_CQ|YJo-;jgvUVv1L~1YVsS zs~ST<{usSWW=E$Ti$1*^q(yuFgR=Kb&Bx>=sKzoRkhFWyE6eR))RqBwA9~5YzIrDP zEOgh*Ul{~z%a409N0uPCu=&dI`|T*oK>I|ZSO*A`lx$PCx=@$Y_?H%&e&FJ~&FxNJ z0^x$1HFI;?{@0}Jm)x~V2Kmir7k6zHsVK{I(`K=eKdz6l5(axku?Y5$e7 zGFPPj0{FgnRD$&)^z!pqjKokTav1|!yo+-NAy+)`jPfMPy0(m0>sGjuKJt&Ut{OtPxbr$@k)cN5*Z<) ztkM#)u96}b%PICv_4X>niUkKv}AyI0boPwOX7u-sQPppmY`su+=D`sJu%HK^*f6RYV;IW=KL2TC;5WRl>JR;W$ zUO&=IlcH)tanEP88Y19Z`^;jO_Y`QGHcnH%OP@cEm3n<*7aoD1CKaWb8>sL+g!2JE zl;HZv@oM4FTD%$YHuR|ZG*(5QDYiEs0qczntQ6NiIB<(o-ugf;HhF%#jOBeGz5e(o z+4wJb%~^G4qRA{AXliuf^P^w?%+-m)CJ(3Jev9>~k(fppX}Wgv!$%_8?SI799Bv5= zf9;?-nuI=&e01G>I>9&UkK+|D5?;BJfKDcH$fBz;t#~XQQoMUk7nRJyA;CIcy^FnY z>X+Ca)+qY<=js8b!#6^x@J^O3VZ5^tU%!sp|7r6O4jrPU&-SOn<8lYjNyT=w2wwkl zzrZA{L|^m^cW z&iDC+Un>y51QcD&bi`KOn8IBrdyq)7HMLru1-s%Of;sK<`Inj+G;m~;1~+tmkyd)! zAd7kbUg7*KOzdynQpR0@Ha7*Bxcu62OO*Ecx^J^^c;WuN39nXE^Df#fvX+06%_=Gs zOK!ng4h4~%*KJ_^K~nYYFB;sNpOk&c@gM$wlwZbV_lO4BvPQ4spLF1JmU50Lb%eU= zb3@qj1sZko!krDO!L&dIB3h;)ke^vzbgd5SvyYXK*7%FI=~CP`?RHEc>~45hO+YU( z>xrnA5^<11qJfboOogN=~Kdm*W{bqJkowrBH{^aANrjOYB%X}F=JDL$(FANr5P7J9^n zQelAY+K;oTT_79wJNo%#C!V@gMrk%*+h>6*e}t9#QFWVDPU1%@=+Gt`c$*q9QABI2 zymC3_xAj$9A8CT#OWB%2S35zQqS26&Jqt!^)yKBY&_92=Yqm|mb8Wqf7}qJWD0ZT; zA$##a^(a;j+9KsIA*_9Y}1d18~zTNGgQF`KGBr-^Hkt`cBN!T zT?yUsLl2f#&hME8P$JHb$R-*e#khl2RO5j+Meb#Cl2|~|*pE#W~2UqWOX{7*t|IN<}9iOd!weg47y5qwbR+bZo zA74X`9#^a|m4J)ZEJryz)4;E*ZNy?t|HXI?m3C8a(T(3luPw1Bg#cVl)&}ZYGw{=Y z;dH%3BwFSQZ1xzcM}2jH=GZ0*jv4;YNH zp>ku2AE<^yr>Q4iQ(iT zr9L?4)<2V}6ZgM)cN6~Avc@4gL-pnpcq7j;#_2p6gv2ZMYg^H;|C$%9H%d!QfMtZa z%*%*ri00`QuY9@|hfkN^&7Y4^v**PFHTFrwvSH>XP6GVoyS(X7CIQp7zgFqHT8@&8 zHYz1s2XJvj^e*3A7xYV%7Pu8 zu-E>KMw)aj3>S*By|?KCi-{M}!q3*XdqMY8^9aJvCk5_IgGhg$HZv{td$ z_*Y1NZ9botFbneHnX_49^ygnTHbTRSIs^T;O}h`g8OHLlUrZ*v)sWpB9m&yOgB)@@ zs%~nGfTYJi-QUbpVE#)vapN%pa$RCQ<9o0Q`;&J~)~%KStD8-Z)MElX=em0D`K}qb z@_j6rXi1;H8OZzD^zTl=z9;8Zg?m#mZ$zH2Glhf}&rh-_FVx^6=Zhzv@U{T&yK9OW z88isD54Dv0Tmuh#1dXge6o9{WmZIHVBAjuMznIk4f#kwX^XZgHc<}s-Oe!<|`*&0B zf2&-JM5ug}7X4Ic3dJ2NOAWZ2@%D3uc0H>)OnL9v^+1dasnv|W;fIJ&FS6@EZe%U^ z+9y}+&S(RrgbgZ;r=CDNA-?_natEsKN@o|(q(M6Md?K?S{r9(Vz7m5Y;v{&puj(Hu zcmgC}>Fis{8${o*AKqmLYv3xkRMf|xQ)qg6Xk2M_3`B3&g7dQ;?A_R>6_S&UoJ9d& z1Og)A>G0BMK<^kBU9}{&1+0Ci3U`)29Hj3*yxIKkV$|h1m_OzFHI!BbT%W>9DrQTt z`QVR0)(f9e^DIf`#e5brA7V>?`Go@47uX+)Tpa`9b5Tzo2erZ%y8|s!%eCNk-r?O? z2LTJyb{^J`q=2pHymYK0eg0TDd{VuZYXnZKUHS8FGxdLZ$~l{{1V1Z89E(w`#h(!m zVkf1h@!rX?q-!#394t!FJ#)JsMwKsf<@9Hx>`Rs?i^zUxUig_a-&Kf{e;7C!_Rd1h znc+;!)AaN2zrcnO&NaQzoXIccE>I5%+jQK!ZV@pi{}RY*J-~Cqx~5`BNT_z@iqs38 zF0lJxw0a<)gf5>Y{w$7vz_$!te?Q6P07r0o`t>#b7NWlll$rCAFYM( zl>uieY|{wYwUwNYpQe_Dv1$l^TnQJPWK4$6qkK}}-GQHX(ki?OBuKg9TG+J4AB@%g zCDUesF!hG%W^X_*WT_ml6*w>j5qkT=N>au_{Jfjvf-HUh2;!G-k>VYLbXr{c)Qf2} z@}JAdFYCafnReNCvPl>%Qa#?mI0NpqZEYXYMuA&umUR4I1LU<|-`d*K3XO{aKb}7b zM>AuIg*sX{mi@g^UBW_xm{(1YH6`ft$Abs;jYaHp5TnJuyX0LXY*=@|BI!pds;@WG zKObCyZ-ef-6xp_5vgFd^@iR0~@Vm`wF4Tf+`a)5auL`egG`8eJCMXu=D8;3=fsCWY zct4c}EHY`<))w^nqkDcAgR2bI-LQ{#jXMEg1k%ksoS%IW+6c!OmGf`q8hc0K*g-rwDjvy$>c zW?wgoZk7IWhfoJ^3MH4MUJl|?k5h1A#|*Ho-djJ^+lnM(c8+UIkN*w*-??Tg+d?JMlxy`kH3aRSZ$W`xZN zPeHzt3rTREzW=sulyo3^_b})XxK($VRDnsUtg|&I6`2eJ-SoJV(2YGyu0vrI_lGEi z8Whh!Rrg1bdQpTS0g{<-1acuTfBvs-_Z0lx*MDWJ!w7I>N=?`=|380(zS5u`W|;~^h)d4zDk^LTR{tMQZfC0b?iY5ai$M@x&vt6jT z-7);AT`LqSMOWU->&MNXUo2_x&*mU7hC{R1kbeJb4=4HG+Cl_S{L(q%{hR_ae)HDrvRi?e z$!r)QQ4gOOYy6jeNGNH!?z&Oz7%1%5-Di+6irj3$qn2rY!1v{laF*#9YV(LC?|zUE z9&N9)oC+xr68_WVsaX)+_=(cz^SN2L4HpJqyA(vkqqg2df}@2l`--Vp|O=_;J|^5jnJEkqJuwV;P{IWUNvmGTRmgKMex zZyxwY|NOW5b8qG!GZK6#52#g+s)6GSuKZ^XO@WYXY5!|pJs94)drCN!gklU^-}o7> z)d|DWEj~k|a8#yegUh-`2qkQH6)EY&bP4=Qx=cao&TDPscShjd)9}W8y;!>QFXXCx zn>a{@E?*hVU(d$y)0v7z%GXZN@ck}WZPWlR?yOs$-6cS;jqjfBath4faXhKQP!BBO z#|G@(@^M$S{z3@>fG40q%9!W$oQoh0m|Puc#RrM;W~dnehXY@X@qK;+pROTzym(e758x68Wm1 zh!dJ{*DeVj*8N1}n-#Eo)H4Njml-3c{zLy0QpR+qs?r4Hz4@oT@98u=GOGstcOS8O zw|=kq>mV$++_JjEb`qau*`9XzJ_?d?S}a#D5b(U)W{bS76{wfYSWZgnL#A9ZQ$tiY zgoS&UI(f~2R;2XO>@E8K*CtMKSIE9u_`CR4Ttu!N4ZlUs{rK7iLur%oz2P+=ez2CZ z`F{8R&OO)lD9?hh^DY)gxfZ;6i7QXOsva6;&xDmGw&KvW-_a^-`ltj?65m~!1vZO) z1qL+w@oVQ%^+d=s@E|(xwI$C8ikOGz#GI~xxctY|LC0DgZtRq5)*b=vryq>_@~2>G z`#INU*AZ-ztQC(uQiV0N;ESH05oW?gHr!4a0bMBrANJN6P}t{mWT$vq@y! z6bvvwRbnWdyVH5 z?iB*B;Ly`8UPOqj<$oO9*nx+4%}kJ}lQ7V~S?2P8@E^X9&60JpCIbIoI~~ojDa=3Y zw=2`R9ybf*TPf|WL;k5}C-1K1-T3w8zSfo#a7@==`TSr51ls5SbR1{{Hjg}$oW)o) z+v%|3Z%hY9pWgHFb1@Ab)gHKcp@6>r7u7#b`}mgxyBejr{awakSkzJ4LTw03q3=CI zMm4mxKaTN~ox%-FExO&N<6xjq`I>mP58sy7FS+c?!cW$aTQ(O9Y1{^tOz+3RVt}gV zwSfYMn7pOFIn(E#4ehJj{em$BHZws{%`~ya5%YyJTFfJae$iRgL_@d>F%S z9t}2`jR%Rs;NXF*ugEqS*Ib)Kg6@Us!);L{^c-zg@sy5&raIZ6Qi)#J^-IH2%V7#W z8{Eq%zBLY~M%*apV(9PxAbs60(Io_6*~y?4M4QGvG4Zd(`r5HKYq+<-AQlfkF_s&W zp8>C)Lu6v%2)vp(!(pS{1nisqZOR1O;Lna(VJ=LjUZ_bW^U)xw9pJ#w&9vspT--Y1_Tw83ouT@3{Dzjlm7t-2x$U zGfddaS7`EgVl#_J9U6{ePEyq>+ffSiMkP)4M$*@x&AXJuw0=&4T(llX%o<;kgf4ik zVJ)13da+|K>+#uztc2McB&6}K>sHmDg0+1>J$0xO(Z%Yb2%!}MEgD5`PS#CKwqRW7ATS0yf2}G~9yVaF zYhwlf2MXxOyGge18HAH@9ZY#;J)rV6R3%-i0W5Z2{KFqbz!T->7UjqL!1tX4XUbhN z*gd)b-CvZx|1X>Wd1hhQ44k*(NpO+wg_U8CXOyQsNVxRdaQ1K=fSdPi-o9acmi{sD zYcmBLf9tOcZ0kS^b+c5l4~U(t%16~c)x+sW4LimO{XlLBKCKo=h48OS&#s%&_x~jn zezX_cKMmW@HXnPmr5-~kT$5T-$MKcr*{mPsMKBX|PxH6IC`_t+yy$+L4AQ#xveqR7 zVB#X{H=$pS8C|c_pT6t`ww<*`LmwvagN#1=spFH-$)t0&OP&7sImU@ajJ?Caf8@K5 zj#~ws`FuUPc4-Dj4K@DC45p!vnt-Lj_%ISLGL_zDqe4we z6DPNj;nNNwKMt>9pqTw&?L9RD0;&q%xSNLpUi^4i0yN4n;v937h`zkLN)#pi<*zKY=A+5 zSLge@x?y2bHCT%}3t8pkI}4|akujiIqw`4xI^@3B`?$ubtNLtqB>~B>|7EeBgTG zzs>GNCjr{KpPAlcoq?sjA8M>4@{w6F&o&SmFtgZAH&b8+O;zrAhldkjL}RhC`g$Q+ z-ANw$DO$D0%OwJi5986MXz9|dYB`wMnToGZngfR$nUM?DNO%0UCx_qLIuqgh>L=-- zsalBl5Pj@JnF5}>kt+dCQ^9JAM?r_PVZI7_sd-F{ z!a*V9NzU$3EGR9qEe)?g<5oK%*>j7^K*3yk+Dh%99=1AMrhC*D) z`MFDVP?O3z_4HgD#&fpMX%w!_->JJ>;#g;4e6I>`P8$9AaS!vubm-z6|=^6=FREvyP z+-q>Bs`Qhjm3m0wFR_bR)AhOXVwY}fuI0THa?{Rbnsijt97oQ$m#!xM$K;cvCpJZ5) zYCOXpJPvms+2EZuT_5U05o4mYL4cyZ|DaMH3MR0!oZ#)iMQid(eg+MUTXs49>7n2M z$JDV#l!-hEc^hYJG`Pp$=RfyeV(1W>S8vKz<*kO(GP&F_Cnhmu@z%2+z2orsN89zE zM+R{JwsSJS1~ahI9&4>{C4rTW_VL)Yef%K6B=(r&H1I96-eXRt|Nd)jA9EKa&>*8d z?nrQQ2WbCe);SU%kCyA~KX(d$!U3VGs54(1aer^(v$4Wy5HsB;l9)6GK37gX4&K)W zcYuZo(%r`j0z(_z5eQp=)V~-*r7hP zFS{63Qa@djajC&9dtr5rEHcJ z*MVDQ*t(Z*J|>$As{3`x%meiEZymCBncXLYnKyHhi%b>hS2@;7Y$T$4NVtcbRTRqC zA1xVICSs461rz6u9>|frY{<<$i4$hi|MZ7K@YInz5*J>U!XZlHsifDlK$5>ZT(8;- z>WBOTHtEpMf6G75E+xuRA^Iz9S|^=}`Qa+6CufGS`+73hS(X@B+$Q$>cxxwKO66vF z=|+M>?OW7m-;nU7fQE1D(L_jJ+BR=e-vj4s#r+tPr+~V-if~VJ99}P*3rDli=MTSv z3WL&)b=VEAxYZId?*pzG`Y*gpFFaouV)Heu%)uS`9%C)3)oUT;xlNwWzU z{SD^=u9bo7qfoI;ze-{A@$bu~(-i2|uVpnL5ujdemshhwGkA%YbyFR>Fqzma=W}QT zT_RMXg0v{`D~3CO>oooTd(R_MiDAN%;Am_6^P(RdD_wqDo*MrlRq(!5IF?foc`{=dVJ=3g48u zXTaF$_qAgheW3Ws&LX(K7fJ5M7E1oLu!G0{_O+E!3=)xj=+!X|r$=O+wr}i0ksJZz z3x^RSal_+R@^!FQpYPQT4?z#%)6>lP891xq+%f)~{`^a3JLI~>kbxNbw%vSv1hGz4<15n?s{w{J2VJ~ zerCFks!w3TI@3q3MkJ8S_}WT5+_Wlpp%{Arrl76#y9I+X0q~u>r#kYBm!r-Sr3_H#)X z{slV7@$yEy?*phmhg)tC(dbt`Jc7 zFFzt7JB8f8DwF$@383^q{m-8IArN)b-IYtM2gTqgi3!qO$nxVpwJ(u^!-txCs|AO_ zy^yOIH@=`d|D2=Ini@!k-1EK;Roljq`E>i6S+}nczjFAS=$i&u*sq+DwLAtFi+iPI zPf=h=iK#p`t`IJ5{l28bP>jY;hud~ne8rLCjof)}^MH8sOEl4)2D_wKE6*&@*S`h6 zgE^BC(-2X+&o#xi3v7<$31z4d;5)O*cL}Zvw5se8G(0hmpA=YsIB1aI>>lumZ5@FE zheVS}r_U(rWTxK{QHNdu998DwB&;YqT~F$tgl!dd+O|#f$M28`ikxwo0GWa0gkGg- zxZk>CIrilj^po7=@4Gn?YfTlVi#AN5yuQbu-2PF>HuMT8WE@3v^@zYIzDgAPXqb5H zMK|g%sGk4H(+ij7SOyt8XMo>?pY*Ao{`tR-U^mxf0u{vj26^v^cVJy|d_T{cp4j=N z;OI`MhSZIhDd*#QA<+N#fuMI(n9?~Uwf=HDUVhP1L^`_0{Y4d?_0%@>@)(k&u=GND zN5q+dN-FG?y)_}|NI!lDzaFPD(hOV^6)n)~8Nm{P{={Ut{QuRPSyj(E+#(!YNKzev z0jA3)-s`8~fxg>Dxpf2BYp(xk%fTunjh%d9XH^bra^!$BTK!P+cJQ7c_bfOJothYM zrGNipyP5w+-Ru-3f8(8Qu=9cs!MPHTlu4MuwxUOqt-*3DE<*lXEsQ!&@`jet-~sco zkW$7bIQ~P6(FTg)yQt71J9i>PZ1jf9g&o-JQkbOjV-ouNUar3QNMHZDmEU?ODLw&D zef=HtPfla&fSX~ja0R+exQRH1)*_SL)=^XSX<+Rtwmjc528B!3rGobDAaLZ%RjEI1 z5ZA){a<@e}+A$j0IlgYku;K;=zi1k`AKqR&wvIl3*nH)GalCd49wf@#vkDmn>(9Gc zh=W5I_2W*L@$)KZJM+h{;;tj#t7Joy zkb{zKoEO`H8*d!9WapoT-=@7U^mE6cr{RPyyLB7H3SU{ssjGwO>K_>gvk7>X$@Fe_ z0tIIGy{Pp)L0|taer+?=HX8w^n=8}3-)F$TcjIzPa52h{cVzN!t-LyUuo+a^Ddpu@R7}9)j0?%$Cjg^P=g8qcu+fT}q zsOhy_ShWy@^16RV7H(9)i8t!3GtRS6Jl+4<%BL5YedN3sed*W#J%OGJfxD?7!{AvK zb~qUar`)*)%t!Es(nFO9=}`FO`o+xl)(H$*C4p z)(Dw$bbO3Yl0TbHKA(Y$?~fK9{x$?0pSfHgw6=hsrfsWEcpJPH^=vyFk&is$E<0ij zyHMrQu?>wfG*}X~xBBy!e*b6NRZ-Drc{F&hq0E2(bT(X1F}STI)PaUe1)-Mfs!(|K zqtc>ZIX;+DAZs$t0e8)H4Qc&GOnPI)dcdU;%jA7e)El)y{nu?e9=?>;_v1x7zE%DDqUL%Vs4iZ(|J<+~BF|Pm<8>~ARE4yA zZ!XUO*Pkn$n@ydu$Oe>Pc|}{=X9+Ak%^-g z$tD!st#{vk_5Bzeu^r{eb#1_k>M75xXVY*@LA~GxaR5#a&K$K09)#-!8m=x%b>O?W z)TCcNjuQO$LEWqm#+V0xS03j zVGnmcYHSV2S?OEb369~}t9(7@BFR8~t|S$y(1Sh_v6Aec%g`a`MC0@GHE>1lwk~aD z6zcY#A8+121BE+i<8_bd-#=NhU8_*PWXhW}v&A~4-m z74i5)|NHA$PUx~aKMI__{AykT#ZVHpuB1F`22b9}4zCo-#ch|u?q2^rfJ`J`V#F6J zw3AfhUERx3wAknG-(3Ze7jr{;zdaf5jPTVaS`LEBDk$FmGXe>B&2Il0~iZ?D*;|0#d zS>4bUFy;LPk1q~jcbDxzQb8#W_ivO)8mB^Lz)jDvMEd{#l4X;zOdFU50_UYekz$<~ z-L<_$*|7o7UyRbYpws}#mp`+AOYeZ~`8te&&NN8oSQdP$QGrUe8OHM;%JFg{r@WYP z3rKSWU$r}%4N>`y*+jNENdIxO=ln7H>u;q{&N{n141!tz{4Hi?z~W9wtKaJim{o!D zJDIg`d}fK;N`r*k6Sh@i+Yp>f=k?IqI)Q-^m&RSv-eByyeI+T8SWH`YXJ_kBu(|Zq! z(dR$Iuk8#95#wOEn*CPmL<4wi(7HFMG7V1zl#7+vV!&G4{%#m~3a`yZ)p6PqKqZIT zHqA5$>mp17yrCYf`@K@~UUVVHog`-8QVL!UeEg>K(GY}fFc`1zxb~#k@oxahOVMAfvd3XVpO%sVaT>n4bh9v&r$GG%g@7RC zQrzlbbue>hI|dwKp3pytuqnmdFDHivhkg$~8*QMke`|ABBi=Aj;N!ZHU!Pn%ftq=> z_hsEEa3yc(4QoMM-uW^ptA7j)^FMxPYbL^#Qo=uF9|9br3`MS6pZ)*)f?ul!Uy5f% zx@t_K)9OC?0>eqj`d(E&JV$^0eWfQinukt6N}bLr{SDLbQe8c}`g|E4QRJF_FCL4G za3l1O<`hoEX1Py&8wE?^u~SRiN6@pr?w5Z+C9=Ni;t2cFi3jA9J=sq&|d za#WC4mE;+b>p*)OL86UjEvQw#uTNBJ$IUw{|1x{^L7i3cCKd-O@W-5a^6o$M|2p$7 z%^`eh24rQczvpv|;{7D;i>#U%V36KU-t(glhiOY=o<~POsL`F~nKBK|vG2|#Ug^b> zfPxK2#H(<1#7s^mz8solrwl5^d%&1KT|6pp7J3UWSZbf3?|)HayP~**lMFoXF6HEM zM#J24>ia|%5(XS7w0b{VjT2#xQuQyZ;aea#!^aXDT=tl``*d9k%->c?&X6qu^;;s^ zwN6CnpUG%ePVc}&GMYizzbE0>lK9r?t@Ql|>4`3BRL5~J*COsQr%fYA_xs=zw~Em5 zj5x`BomEg=(Xxh-;O_1oBoN$P5|B!EED!^&e04fq>QOo#*RP0?k z$%G$xiNRC%TpQ60;K$Z%6>eV(9+dYIo~%39$Iyk@Nbj^a?^UU%s~KfQv88(~Go*Rp zwyD|(EwLz6f+ITCx4n_Rpem^a{suJncnUwCH(4@V!>`^=oS8ve7@1_$$xM`US`{pR zrFuU^Ame)8RDqwUr7$ANN%EkRD#YD=Rbo3a5ZtzWbmDRXa5d4yzuKZy9#deF220PJ zd7Z~a7N}}~o_DXAR>?soRSUWXd^=gpGrIp!K&_eK3-M~ZNwlFO>9%jLTB}}O`XxJD zn|0fy8o#t*HhhXihc@&2W;9_*wnBa^_e3V%;tb%(;e!~|85S{IJvg4f$1)^EHosQP z-ZOYppJW!RXmblu;nvrtXa1XV+@AoQ^}f@w(%82NnFTQ2x36syp@047Rk}nFN%H-&$UE%4NiN|2^BA;ik2ey@JF@h$ zB)3OXd=I2YqMd{)V9nEYY8eUG(8Li;*4^D|Hee`>*$}JTbI!PLr@kog_v7K7jY9YI z3+-iI5Cc2BIACGCfvDP@Dn7;>h%<-)tP6-Sk>w8#$fGqLg=j7blUFDjFM7Kt1FfCX z-qO1hdOlJ7FQ8+vL(e$8`J2SARgY@yiK$pcca~lWt)F*)9ulT7J-Ux?=8kk$*BD%- zl!8P6>VCEkJOet68~RmPrR(wZO;L&p*<_T~r-ssd)lk511vFp6QFewmdSUS?tac2} z0)D6uFb*kr^%An$f9eI_m0j~b?*LorD~p%K-8Fq^O8377|N8NP)=75S+l!U#;=-mx zEpePlVD)ZRO4-t6*V^YQd|)Hs;4N1%sur@nwIx{UJactGR760VNW4|Xu%Q_@k1tKk z5ULwwEp`{~hE`s<;!2rnNBn`O&qve~h{;w~)g{0pfGVoDziXd<$6KvgB>Sw#3*WeQ zXdr=v`$F$)S>GJh1BsCD+Z0y}L~hZvhv>i15xWVrFn$No?Hc*LW;;oiuvceMOnDeX zdGEbeySp>inZM8*1jMD7mMXPeWwOc)Z!V2y>X_a1K4OUq#S`S^ovOA8LPzpEqTJ}r zivrpY)lETZ?8sh)Pa8mW)}Y;e`g$@at6A^(6Q3V^6bAS$&KVdFMcZ)Ou}|0P-h|BH zI-@3-DamL>Cwu0wyNy9nF2m%4zbv;VEUk3wV=>njC~kAoosG`{y6ZV|*hR_Fj&a*%8=|;)VCb&s)Y5;HQ}` zI2OL9&yv{)vu=^)$qce+f$kR+-xUfaDhR09Z{fiou!qX$KYsL1g=EFO30v7BL>uvW zq~E&Z^vqHb<*ost7S)v10b{M9+4Q$*tg0`cTl$&X z4PYkb+KvCt7G%hl1b->|e%VA6@R2|u+C-Vog*v!&ir|H!x?AV;jQ#A5bf68WeGpYc zY4~9f0HKw$ZZsRbqH7c{Z*K4SKA9)RoTJOujBu?gnPR&wC=kENYYQ@hIDU%LYX}!W zG5^UjwV0|jkxv3x>a+kGz;AP~AW7%j6Zs44^{=KGzIJts~d%#_yeHB82Ph zQTZoWbFC!LOw1xKVD7mVI+y=S@cC?ktF9IUeX2Gta`-5fNS@}aCL%mgO_MIDF6pKK z2nN@cJ3gL^%aa{+)GSYWdF(dwv;Om5AxE5Sc8qj8A%;w*UT?}h6bkn2y=+`AtD3Ja zmM5Q)2*ks-Shlle3G^+`86=!-Lk-N0e)0XLBnC>hbG2XOx+!Ns8kdIeKOfD$m9MZM zY`KnKW_q?PHYB#IvMUcuE6rM~66Ug=KasDV`WF|`8x2o@`Q(GU>Cw0II(tGmsBYHd zQ;Jj$0XB|#QbbqmWMs|g#Dnt&wU#!yQW*xiQ4c9(p~?w+jDi%$J5%Z1f`0Oqv!hc* znl;AQcrsGC@E=scKhf0IRAt_PKn>5iJghYwm3qIM=VtP+bvJ>rk8ZVnxH1b1s>HW^ zsay{lOK!-AqO3p*E84y%UN0XF`$(51p7^PLTdjIIZ;28Q-*45 z5sdpuVzYPW^62K$oBr`n$x?9Prbi!th2(37I2hOXTT!7^l9T%e4AkMxn@K28N6P1~ zcNxmx(qokuO)_j@3(R&O)@k&0Fd-`PyXNk41$;Q?VQ|jpkc7$>v$W%?Ar~6D@Lfug z%bXL@)^RQsJ|*Tz=s$2-!-Z%362J<&ZPdh5`^L~F5YFL}yxym9JEe&6?*_w+&=mV+ zHrmSl;9Czom-8z=7OhWk59H~XUjx5p5UEuN}~$CmMtn8CsQ+i zsiiwv1l)+`&91@=#HpWjy7x^yZ&6lzXDd+0S`DN^b=DuvxG*Ni|TSze#Zz? zgpN$Jh_&4z+!W!Q4(M${1L^asfpyLc+_avr3$}-`?^_@Z zKM0~em#FZc6@FNa8Y^{2KfI!Zf(xNeeQx9~I)JxAwgeaaCehDaQ#{Dz6Pphm ze9er~fN(&q60n00l_XI3i*S}4x(|Yj7Yu5McneZZlvVQr=_kHGe z2|n#t@$7GIFk6uz6feQjefi!9Cf8*?%Uo8zZdDg32}wuwy3LFsNokYc5lGK28lt1d zl4h(YjHmX&agCIOjW1`VeiXC_06O`Ef0-@>K}8<+6Dt%H6ym>!3aUXz`V8{FiyaCV z%E`l>!^p_S(cQw;*~rMj#L>ge$jaWy)56He-onz|$j!ph&B@is%*n&ioz2nN2O0_! zDiQkMtNtz3|7=iM7X)V{nB!wABPxG#lXbK8iycey9aC%yYKro6(~Q)A{K_E6Gy0W` zjO`^q$)p4qO<+ZfUkvj~JVGzim9@K(wTYv-k+YMV#eW3{Rs2WsAkTmHUtO=FxK{)`@eOp;Kg?0W6RqoMNAb6R zs7qiue79hbMwCuN95;+op>DY5H3L4^bD9xxnpvv1u$-RXgJE-h$a}prDfFiUYTTwh zwqjZdY7N=jN5*#gZxqgI{%nwGF>!M+J^FqA;cEKhIa`0rz=?mIuYJ223_SL2z1XsE z74>TDJhblwH$FtAxSD=1I~Z!|&H0stbC2~7_*f4=1nIa{dw%*{IHKouSsonJ2uM`w3=j!>?C^;5SXrQ_5TzB*^)8_%!K9p<}5c$J6b@%RL z(#tIIwm}AH?W|Lwgv&PyH8EM? ztrsU3eL5d2)xH*30gjR)l|na$5vf+x?d!ljSxv>zIj*_XvToRNN*DSrM|6ajUJ+U+ zA*_dI6;`jFldzQzvWEV@-I#nXKWL6eNbjNvnx``|;Jc%HThZpvPWG~jB$EOzaryGA z-9n4%2|y^Dfg*mu1f?YHD@{M1!HngEUf6h8L@n`hGoUnVJ%meZWe+)NzIj-GZIW1B z4R66#a1+);YprJZj;nuS?1$O58CP4n==(B6T+jgI7tHXFPH2)3&M3mfh>9h@YLM%E zfkmh_c!R4IeS^lM_#4$0+(NKy(%D=#CW> zy{z75xEU+5@?1FI5IF%jW0$Kvbe1@2_b)ELUHHw>Lvhst4(Mi)hMiVQYMZb)b$*p_DYB&tYdhrZ#4IA3}AcTMs+kpC3;+cAV3Q{_pH$+~4ZF-3eIRX`*>@OPTp z6;~2SZ2B-I9(hlaCma9A1V=MX9T$!BK|a|VZIRI*RIQ*~XY(=SXdt(_=5pG^JeO6= zgEvxEL7w9^gor3_e=b%LtfM1V4uTDs6G&P?VkC9)vbHZEja}-2ivW^AS;loHm-->j zT6qQL2)e>IxOOXlsGJmKL2P?#%o?^A>JIgW4(z_7n5+r@7zvRLo`d*LkVueKJCfg- z@={UtGA;|Ce;_3qd`#T{*D?KD&{|HcK1)^I?Dx*(xfyfq`~~9WF%`%1%e{;!z|&Aj ztjuLSyfUn{(d=y(@$=1Y8#QybqkDk0jR?~6;MSj=93cUpWpzsCaRBu1bMEz9#m<~q z>kOjGcqhA5`+wyJlLUu%_J3XE0i21!tbT3>=8Ig(8{A#@>O$z+e%fiuKW7t+R*ih7 zPM(E8@#g@}`)Z0K&vOvz6Zxlj>y)t9E@a$3h3-%G%NAr>LQX5bv47Z~gz^1P~o}UQ4->EC86V$njd);s(ZTWWK+W zVAJ2uDZ^(WXoiszDtt+7q>66CE|crPy=sQbsFi?y-4BL0W{`?|k3Qy?GW4e_MFQ=_ z6LErrgu0yh;==03$nW$RZ#(dRsK3uA2SR{qJJ$Q}S;*w@tqFfW9~CTEX?0nAgJt|` zygBPqhyUlQyYh3&I&zJzRn(4Luw6)Q<#AfX?iLApz5uV}Tx)pWMKC#Lo)Du3mq>&N zl09Rx^bys1f1Ql$7x1H(A-3S!2PwuO@0Z9)AMPU3&VPrrXG#Gp;9s&(`blW7u6GOm zo3q-4uQItMru`k;{U#2DY-48ct$sNXd#%#_op)=2UDl^HU-Zwh;O~{nYeN#U=U{lF zEys?R6tK~(@d~arN#26RZZ5PJXIEb(6}pD1Qj~${T!?`66L0Amq8!I5S8FCKbXx@Z z?&afxxZJyigS|aJDC(vQz#fRGtLOz-gnWg1`@1I`N`6mip*D(jgelJp5w?+)(4t04 z)HX@zC28LpjgI6OK{qSl8PBr0vPNmp{;^0~zt>-|d+3`9jRZqmeQgL>L~tz?rZ=f& zPWm3WeVIJ$Qv7RLGE0hPB^o(Q2<{mwIj z5(;~yFH;%B7~B~}uhrY*f5})+g7U6FgMMx&Hh$*+Y!Qvl6&E8D9Q>$v0-W|z;5E2t zc&jyL!&I8yF=XB>iV}8uwk6C5x zrAv>F^_TlNJ8veqJ7RWvbzP$4C0D{rCqym6M5FM}$p!E`U+=nSC>CYo1F8dr$ifSkwDKK)_@inr;UjAW7BGhgpv zQxH7OhjsbafRAv*x>F-w>V6y!B+b9|(CRMj9c}A42;Y0CVaV9T88wHiH3wXXn~-1j z0`(pS?_J05NRE#&M?W@~|Fti1RrFc2uc$(uOZ@I^Z+UmKsd{@SlQ&CbYuX_+OB3gX zrYgm3KL6}9Ra zci0|g5_p=5YW+!YdV_&2(6_(a`vT6g z?~sO7jgjAe{B|vY2@`F|Iu0BQJ47EIRDL#2^8dLNqyJ6lB|STx?l$M< zo>o-0L={7yovql%FiWzH1+C=`mb34$Cdhf_WM6jiIGl9tDeHUXa0>kA?nHn~F63$r z`hmKuw@|W*Nc%}EFd)DcYHrV0>%(=H5^(-r6rVuH$lJP5GFA((6Dcb6t6~AAAU(uj z=q_t_+;`t+&>?SN?M0sg@!>sBZy_tIB$-eyDqiRAH(ilsgpY&+9C|Uvq@Zi}I6^1v zU~~0fZ@K7?p>yjX*ix>QCl!beCGhsI^Bx#o&%7(&mz3xm0S9jHm19V8+h%NzB43+M z9jPtasb62 zrjzb=cH9DG_`EZl+M^0xK7K~Vz7GC`_}xZ%*XRf=OZkKPb`6ZKmj=R-Kl5S)d0S#P zoHM9sxoCfXWo=!HK{&EKCcVV_B*^f_2yJDMRjalBqIK-{)%J28Fn#`6jSsjg@F*B< z#+neuMUC!U{0ub74Sfhz7Rd8kg`Iw-k-wI=x#>~af5(gyfjDtFaGwXz4t$?DiA%=d zGoEW+2wV|D{3`YIF`*y+bAK-d(m?*H;8v1h2sgbInK$beuR1N_Zepn@B z*Yxnie?{RL4I8WTAqPlOX%{htD9Ty*`nTP5nZ9SW+%Bs?;p(oeNd-I-{IL5{%i%?1=YUGH{UA{K4~A% zY&oL2&h9lvHkujj7GPMxIDQ7pTUK!*OyMl-VJA=3PB5;<=G5>}m|v!a zP{Nx2mQQYPD)Dl%(#!v(?%+X#hbyo-0~Gub{@1t=8kqy=0?`uTIRmT_+dSnKBUwYSI0B)5H1I;LQ4#FjNkc(KX9t1j<|= zr*TY6T#M`uGoO8NPE;Lcv+DpG8Ass#O3Afq0cBtMia!DVWcQ;SjE}*?E1-((XhuQ& z=9nAHr9g*oaou9y)dIWO&?=?Vw-Iiua{lFA%oH8TWGR-}x^ZWeYGufW{bIHf;I zpQJ3F2dm#|B4D2I-HYOniNet^u!ze7Fz%9#BTbxSLX}1Rf83XB8PObrpTuu*Un?wDYNE35;mfbh%0RhqbbVw%LBh&r+ z_-$7l^qF4vh?!)3G|bn^;ZMhGKNpHHTl{&!#W{Bcr~9q)#}7YM7>a+GfLchXVHch= zW0VFnbGMvi^aW4$IBQpk%s(fDVx1a}hQyeI<}A+fB>btEsSqWp@tZ0-s?(vswK{W`6b0 z?}gkStP@lk0#g#=5sd^qq+<;GITh9fj=F3)qk(yri5V zFWe#MjcKE-Tjj8krlp%wE?<46{!S@(Z3PLvD$hyu?uv^P4M*0;_dsSv{#n=#rx}MZ z)-(a@#1inio!@)zl9RA!f`=;BE!(~n-z?SD;CbqFc~A@f*gcEX!r)Ry%m46`S>{IK z-th_*Pmzy>ImUOw8j9PdA-J8xj~@JlXgW=Gtcmqd2xaYm=)NpvVgEcOS_VJYH^B8L{nS8tyXy zQyTdB@*Q;4e`qNX^yV$7>`diQjm7>XssGFz3LOQagctl=zWYlPG%uRpy?OV=8={)1 z_H)j1ZBVJ4V!fTthXh57ta)4b$S&;ds^W{=wBndu*GqiMqHnt>B5&C#y=(!()1|`Zm zcy=&LO5IrOG~%#Ct;VV~kCAKoLU;WrC>aT(%+lMH`#=<_>Lf9&cUtRy|E1s8?Pe9Q zkIC?U$D@=NtDZ+_gy%pJG~V!YUm$KuuIAO|ed5$dW$OI(e#LeJVC=^(awu*Lob}{S zi zj^n=BnIgE#feZA8wPBnZ=RIKPbXB~7NY#}A1fMj=PJ|i?`=u<$jXYcMaU~hw?~@wQ zFK4z*GT&}E-!vI6G+J8GDh)S@9kg_y<|*v9o??tn?tnHsZmYc9)aGlBS-(X{_1Ro| zyNf&!={42h4;5pQvftCx4NLR80_r!pM4?D@*=lv;y z4dOWqVftNWy-+dl&MfDkOqfR1+;`9Rr{L6H&7o6u)URkeknTJcR4oFDnam4fDKc9W z#WiVlM)0(Zf0sBApsSoX1jzCj-gZpQ79$y z!Le$I%#kYS+i*NR&;hdRW1_KHiz9y3j<%GM2Ya*B5m&VP$RZSIsMpsm1Y1}sTf#hi zdhRqwQ#ww=y-+9EWhxNNhte)i!I7#c>8ut`Qm_NRGY$G;q!JxgxtxwrUh90b;pCIa z?+3MwQCuDlVUf}OBR|2wsur|go1Gp7i;nbhmX9bn89JBlT{ZEZb+XqgYQbgbnjH#7 zbIV&4xMj`IEFfU$e*}1piMWea!H#=PI(~J02nSfLP?=C)T;dQu_i&)qX2Q|?)E27IHV--RnE z043keW@P?TV@&=uPn5M8CdZWXXRaJ?VGVOq4ejW2 zOhK8x%<%w7G%eCUoNCqSwsL6}gd*Wj?m;dS0_U~Xz-viB-B(^}q9RGy9|yS|f&+xk z7k4!4a&s!J?nofPM5h<=~nSFL<1p`^mMm?4P+ z2aS4tO8NHiUc0sZQv$*7vydF#o0z_%SnHkgOlxmnVc{cBC)r!`PtnKF?!puawQ1rUZ*{I(rmKgZaZm^%MdIQY&i?{6~3wB*PzPyzV0}Cn#3#5m40_X_iBa6&siZ)>8n}9 z%G`M9O&;cYZI>w*dSj^wxA4x?jBiWi{&rd`_VHv-5M>mXQ($$M7N24MdB z3A#fF_)7l56`y<4xmyI*o$dIe{&4O9P9<#BlxxWdS0^7d6K~;WheWps4%8C2p`nkU zy`f3QmUl1}*AA8>z^C}o*G?dE)My}ia^x{+SxK2AQ1)Ai|})X zNz&2CthvY(g9Lg0+t~}S*Waob#AXA6UhLNM>m-O^=e-xEKq~@Kf?qHU}Z ze5yrp%Oi}(LW!KBm(>g<>M`=8lrws~KF6s}22Ccn#6_jRuE=%_9u1~bC*HFBB=Oez zwX}~nFUNTBFYez^Hg+RVEd0pCNx&{4&Eq(>_;7k03f}x~wPhj;{l**f2;RrN&-lxO zZ`f=Uxzerpvd9l2%Rz|~!58TkYR+XiW^0*11lve>>20U!{*VDRoE|WT`|XzVXD?>?1nRk}^>L!0$|0@C|@+k;x}47eNis>K46@2g&*0Fw{Be0|%HL^(zW}PzKUA5u0O3S2{yOs|AVq3xfoUs+R#6dj1Df%J*CWJ@!0fX0kEFg9~Hu}fy zJ8XVs-Dptt7F6dya$Dwp7UrdI0UE&ujPK~Fr~Xtcxj+J9i(>ZQ(ip%`*FUEUoJ9KF z7)whosQLZ;bP>0IR2h$}bA59mSoK>yG>p~pk+z<(*Gc9q7j*!Zo|%}R`T<{!DBV!! z4cTt($Qi@`#GgoJvfyfGcn_Kt3qwC!27a=Vwpf@FJtg$yadkvpe-O3Vev^}-N0J(` zV*(qCn)x1}E29WV+1ISlPY)LURI123qh0kRw4_SnV*jQ;;x=m-@^;(Qt{gITlI>{d z#ZgaU=!}BIbvjSkbxgbR(fIJlAYVY0j=s_IaY{%jXoV3f-7$ydxJFEBU0qe);omE@nYNIb?v!efS zCy{a`8h(dd2NFs&f6*h2qnD~*g(p`M6Z>(geG9SD*1 ziipWsx9uNz()Q5*LWEU5uJ`L3se)1a(+o>KBC?3(vVUh>q?1UippJrbpHW2~PJ?h{ zXYmu8>$Z{Bm21b#6ktvds8@88^-c2c z$qlK5f~*WJ%Z>4by7}v_36b}Oh?Nh^G>(5nSL9cZQWHduv)XR@;QpS-?^xe8R7}VZ zStJYcN4z5~&L5!F$+O^vP>Ej?dg>x@WPMboV5(f>QTs!e z{UEal%%l%>2hh@LAZ$Fj6V1*j7KuBeoZGK)!+w9t4#+5C8Rdt`dqB>SK~F7+ToV?+ z#19=qvHEikQ5wYRF(VElgrVvPT6aB>JP7Xczu16q}WBnA3yq`xNeXx+CUU= za;|@pL!!Vzew^+v9|5S?SQ@CBt>UwO&Du8RgbRa>AV!;j-9y}G0{!3c2zZU>eyE6; z>`T^oadplZv33+Myb|gsxxdc^<>X9R5BG8jyuGg^b1(%q5yZ*mU939fRsGtl`{kQg zoG)9#I>b)-zMJaMy8KoZQy~a#j4izujY#>~p4alY(hnDUe-Qw-#%z4=CGcI?;cuQv zIMx=?#Sn5hVpxb)LZQvR1#lwx+xCvMiOd9HXX$=)*|R;Ey=#_6agL>DnV8v_As6h+ zg9x6LgN!g(*WVezFRvKg(}9P|!42O!{fw@j2WJ>l*V~f=GxSq^rMrR?OUirYK^|c$ zP*DNvrsTR0!0ke^5vppnMc0>H+k<*}jk+)sRB2sF$)QXvZ>An?t5k)MdGRnvD?_~F z2hQ`2G<}T*6u^eV$D@hDeC8Xi##O1f4|ADSlnPm*=Z&km=8w5r%J`(4A#rvkpEYYM zqELm}8C_=?i#|~rH>(vwmWI@eX`0x{qITw{%EeUZ#OMvKz)rbdhzM>qeGf@VP^N0U z%SsKKRDRS3qLRrR2uL7qRA#G!L01&)?S}Y7F6h{@CKo}<8Rw<wsgSS`_o$s#5&qz?@wI8wWxWgPmv^wY{AQ9W$8B^LDSOQ&aO6g zjAwrG*WJ-O@y64ZtL{q>V|B)N3=$96KezcqCOuT{L#Eki`wO3_Vhyv;GMgE%3C@E; zq0l0_Yt*wzPhm6TANQ>+POe3zuWZ?|%64}mx$Zv$Q~15TTp+r~sjBAc0xc3zcH$*4 z=69z@{N_a^-dBU2M0G2^11k9QpL~?B8!>unpdGoH(FPZ2R1(*)`8=A)OtBps;WB^p z_4xOy_B4nZfXJ*c)*_y!g3oOuVS=6DzqKpVX(M_CeQZ-XPOnNqy)q*QZMFH&k z@xKpPgt8w_pRlJKgPUkvNv;}chkjjUW4)9S6&iNX*Xp4bjb`-%!u5+JUR|FHZ(Idz zxssgl9T-F8BGX5&e5RoL0~%Ly@K8kNnq>f0Wql9Yu1i?)%g|qa+p&2MKM19#Eqp+R< zVkK0}-gfp?_zXJuu%FlDjJC~NKx00j7Q+BkiBEMeDqBz4IQZy=jE@12>Nou;hh5M} z&S3P>1*dp_jy5qGSHzUHRo%vg{V8qa6~mBF;)g`2+RC(Xz6{?MyL?z|%jOCAVW5t-xg z;Xs36D=(u@;+RYc?!C-I!5e}$1Evis@V)Op>dh-B3y(X{G!yykg!Tra=*pn~F+45R2$=FpQOuf2e$u>FM<`~14B)*8>}OX>qc z*~bp6r~Sf69(-4J+EM!6!e>RcfiL9I0i?YOO%CGXR9PJ#T7tVV)>dAVG{okcAFVEX zoBk+Gy$~yV$t#^YG*Mu%T~dy};7T;~y$QGQu>AFL*_Blq!Tt1Y z=D*7TyBmA`bN_K{2K)k^-k=!w`=`e0A)x*8rwzI?o`NwlC#K6GcKJu>$ODmxM_8kUqs09-wt#n~ln3?G_xyZFx#r*gm1Il!-j zO*4d-)xY8SNKd7c@F1u_NwOioW&56t_GHS0kmE%g-tp|LKfA1gvB^fIj;j{KCa)co zIkbcYA8|%=+)uWY5V*{CIdW@|K^t=vmY z{pae&w`I6|W2G2`x&T>I*p|&@R}VQlP&v0rvQ(I^H?{*U<=>oF5lm_9=aL8rM;{r(|0%;|!HGu@{97 z5Hg&lqyEdWgVvkm{d>m;hq`D}zkICBR9uUU*T??g)@2Wq8r&0rpX18lZ|Jti!;^R^ z7u0po@ur5V0Rp{Z)Mg|FI!(9L@2f*~%X?vVC0r+6R1kXmt4+@x8wf9V=-MzvPF@b_Eqiw#j3S0D=|MO=3A*mBLTbjqlDmkp^&%0MWYCLW zxh|3j>x^z0inr`|Q5srsihez&tUPR&yquuog7K1Gs!EK{urmx!5E>^!==0suu6Zx)dy7slgYCkJp`urN%UZ8v3Yr+1*;}FZIYl^C!cP ziL&Hh{6+79n7INU&2yC}TViG9V5p5g;HX#CSh4W%?j+0a1YDEEZF^UBIY`%|z!rSj zVAA)*EO~GkLHo2wxleGr9{+E`_i$C#lVHTRL<%-HFUTThm@fIXQRgbMkN`S?bvki@ zs`%6EHy+aHSB)SI%=O%|=NV*%li6cnyuxdMmU=6A5+IJ_b1a}D;nZ;OOAxLmGXRgt zXcD$k9s~;+RL3;a{YHH102}{fxl63Cu(5klz2=Y1PSwzmfmwwF$cr?ZchZJ(nqp)3 z`$@RLTv&8-7f;8_dzI|U+dnRMeN4l9FM^cw&rpL9m!r7hq_VZly_=lD z`mmy>JMj-gxoW8+_aKWwj%@vJmyoy38PC5wcD15ijr+zl7i3&7%;)04XVVPO)oBm! zGn3e@hsF3<$v>7>_g1ZDQ<+cBF-9+eoGNcr6Zu3OA1}k_K7<(8wQEw!mlxKeyg66Pai%DmK(p^&)B~5zTF>7go?%m1CUjk zkQ?XZ$bQw{ENm;LV3zVaD6+H>i7C}VW}i)PpKhKANf_{2rq$ucQ5?=ia@+D1YO&=Y zD_U*++z6Yx`#@zYbaCY%W&71`rW??W0jEUD$2$pp+=Sogn~RD`Zf`@K8~N4;`_`O+ zL2N@-I}hQ(@7cZ#eUD2|QF#}LM=-H4bhTZD62p!65NPbsG=d!7F&@$8AZ(w~u$_4@ zzXtaEdy&%_adLmY_UH*wBmJW)fMcp2Ch}_!@3;zXOek&*9gz`9(GD z?OO!VLeg!61oe!krrjq!q8^mm{=c%o1VnP0cNMn;TBQ9IX$mU=XR`gD%)+^Ed8l-lC2lk?X#}%2kb<_`*n>K2gy2%VT6(Z}wnp7zZs@^peYjnxP@!i6@IdWGR>w zz+CwQgs0Q?#j}`%M<>4S879X2)s}=CE2fybmIL0VbL*Vu30uXvSd$pCsIh0 z^_T%2=EWAxDI;}u7DP^4PTmOO$rwlD-=kHgw$5e9=Zb3L&Hds7y;zZ; zwQTlhoNFRN_O8xQ)?`F8g9`Wwrs12HlE*zo-p}9VaXeEG&!hoNnY&uG4}CXfXQzDB z0T8E6O>dmqI;i5Gg9j7jmt#Hh0y2uU#hLi3e1ejnb#-K3~Y zsCW1hoPu%2Pm*dSFGa+^x<&4ZbF$X3Ip34}zFA)4zmLFZKb+wxwakh_20eMkbU7!* z`)2WZ_PEGDw?=RmJ*Z}hj)C#;ifFrS1A0V64lZl&zDs_ay;Uu zbsLf65SiIrqd-uV3vRibkKdE3CDPUl7KRXuU-KLI#PK~Nm^qn( zD&G%Zn@!2OV`gpz;PnMdYrbZ>FIsGUq>~MXva=U8{=D1yM#H#XHg|blf z+Ngh;bm2xmmTuSESx~Ce0Xb?(JwK#B_;*hUqj}m#s9Tda=IPy$loFn*NnpvZg=c*5 zo0Tv{13kB75GnP7WKyxJRF5v1FFQQOLRml<9mCf-?ou4zMhy+Qy$u`TJ2M#fK+nsV zN9w-xKW*X6KBu!rFVznA1khxjBkDk`EQ#yJ5AqwZFucGTX9i&6VPBL4lXsO*9NKOp zGE;!yEtrdt`cPvQr6J=^-^3ryRrRV`WHVO$A`4)&NINsQ$+6FpI*e4D?IEOj4J)w^ zynLMbf>!hyhm54hY*1xu$lSm^0Tsfu_K({aF*ntldrkz3JS3h?ljp=pB>rS|JRf+e zrM^0&@hj~02gaqV6fkBGSG^5_N}{#MIC)~$CB!9C6vk|WU)E(No``u_;T-Tu+8W&6 zb0H)1&46G`s5U|@v-o;1LlFRWD*qz<*SB5RXfu>QwyJIn;h!zcbHi6t)P_l?0-j$d z%AJ>4X<(sROwEBDTWDLELr$!R`?gBT05epQbf>F>gr zX(CUYUoh?=&+VW-)$)~--jpd_l(R)VG*eu-3)s8dscX4{7~rDI?tKr2R9#C$s=^y@ z+*_&DJ=r`V_|2!`h+-q-p$}P~p|GsDJP)L*06kOsCsLx-i0-nK! zBhT<86kM(#87I>Whr=z`zHRgSd^O7r*LDi{4hW(z7wXa0vI1)bu@nUOpSJHSA^<*+ zt*>op1iqz}Rvs3b0%K>RqZXO;{YO9Zd!yV~JQQ|fTf>~m2>bY1 z2RnN|UbU%Ey7lMcroF>)4fQ91QdbE;1b=!QQn-pRaFQkP6FP@wKQ4gy}z_ z@@#MC~IrxP5=H$ zl9JmDVxEF4fBH5xaD9kRNo_UvIT3w7Qy5}3(Fo0UpAQTBzX3KOO1k>C|Co_ZV2pPe zM2-~_@{echK{oobUakWfqSZzJP0ut#>lj<)4hjw$kN;$CNA%~rUeZ~)t)ejrDp}_W7=`DGJz6_& zj3cM6s;GilB80E(cy1m||NTwk969D)O&^5yA8sE0m;)&>w}U_4q(M#b!6TgwLGY>B zgsZ!riauB@zpJ9QLl0{K;~}qJX!|&S{g!MUjB!T9=9{!2Rc&QvB)otI|HzhUe?$=M zcO*&sD*gBGKjf>!55J;7pneCb#J(SK?SCW8^r#=?&H8b1{qjz_rVPW5e)@=$JOV-h26Ef^9l}b;+{XTng2mI|G^$- z-t00OgBp&>e)${o=)ampX3770;O#w5U}4knWwJ1!8A;a0np&J_Y!9&OJv^=zSk{#3KO^J_8%SQAZ5^-()$C!gU7Xc|IV zt}1ikcN;-huByoOV;}n5d*rYz0}T}Wa-=6V>ygS%TQ4_SHL8!rS>W;gAiDYVlIVIj zEcOJogs@UU)%GEWmfYYHWW)oUMqvB*8TrQ zyvM`bd~3@cUmS3KUp|W6F$+~Lo*Qf`pTU{o?0T6g89n1%VJMww0dMWMZ#uSca9NAi zW2!{I|GOUB3<|Os0&z9nhUFLn(g-;|Q7yc^&b5O_-`}Z$-8(&Y^G&3K)~CXUEn1F><&&fZx1^WP>q(NRH%2Jh4QIr#5k5To^?2iyo@zIE%#o`T+{WDkWlnfU3#dNH+Uz>saG~*+@JOpU}JFUpl zMPGk!_sg{p0W)ydfgo{gjR5C|<@Y{5-vjGS4~2sDo59oSqcS;!h{DvqmANHM!=U0@ z3oq7Y*foFVruld!8v8zJbMN>^RI!l$I%v5c>086*&0{oRP5S4(QA}U|&Tl&RKlrfi zKgzFGJdvG1G~B;CYn?c-tfMm6!QyzT7BU9G8n2p9UID5L6L-_w9{)2Kg0y#UVzJruAzF zsjmlu_es}eTh^ktlyHlK9QBBnWNdz^d>#aud%CqRPoNYA?&PlrYY_R=q+ucZFtQq8 zbQ&uhf?r%n>}MGnOy4aD+x!Zkn}7c&2iF`1F<^Jge_cs=2nNkZjGN9-;UdvHfU4dA zF&wKtE4CEGmm;YxrZ)~kN_al3(ih~I)zhG?9txzL%mhXJC`vNbBqx`W&_fz+{8HC2 z1TD~F`EBU;Urv^OPA)7NerlR|Gy4pqm*P5Q*6#)p%ecWHjtVK8cWx#fruB}`PaN~sAB*5fr}#ZaKF#Yk2jCL|48wA z^p4A806dH2>Jq9t5DQ@U=(*~+0oKmOSuCYy=4NjO7@z%L;Z z^!<8Qjgm=GXSz{rho*@NR)%+>AV98c`F|rRx*P4I2ysiUD#0Q40Tfp7NjC_8;%7{WVO)(&^%FgsQ4*5{aPjI^$B*z%+WqRINc0FM-Qy z`(HtA6MC=k>E%T&Jh0n8ZZm#82RW(|tX;=P!2aGu+(I;`%=FL z?VEPuw_v71ma0noQ}ZJF@BfPL6X#o|fQ9Xj#S!izu;y{%S+63Y=`!P^UPVptbg4p8 zn{@=$)%;2sbfy4x_2-L&S6h)7)Z5CQDhE~mu6&)l1Yo}W)~B*y41xx&lB?_Rkk3+^ zL0+ftKRl$k&2w$1VEuN|!yS1fB=v|1t9!o=tz5a{|4F48X*MxEkbE}_ZiM5}4jNNH z49!b>S2~WS@2Ax446K9ee+$#YUXO#=3%Vt3li*MH1#QuZ9#1ZvyG^06KF+#_rnHuGDwn6HQtEoM??IC zt3T3fAnK5&T-+83y+5?*Yr@!zPE-qy)Lq3vbpOU*JvRFPf2XESaBz(<1&8wwM|ocB zMS;wUv{!;e)E_@4^~tOeT!%tNGn5jLXy>>8kFoRqr~3W>I2u$&*?N;Cs}zZ7=&4c( zNrjA*L}@51gh~jZVT4MOk&#U{mwD{H9pfzLI5Q(N>FfI!oX_v)c6*-d^?F^8=i`1| z&+B<%z9uu_@Z|OtPwF5#r=Z<0UDyD)x=YwM)l^{laZBC#&;h};N0{zQcu17{6en)Q zKL0H9Drsi$5`YyUWY^e50fYOlx>3mk@aDSAu;cpp@0R2SC}Jom?`LCNRTc^QrB#cc zT*aWLKTgG{obQ0=M*a3w<^a0I^_Pz<*nq5b>yqeJOlX&T%~id?KK~x$e!wSDLxiJ^ z%0jM;DJZhH4AxSu0F7tT%isNL!T7D3jgitM!i~=_W8s;5sK7uFh5y3d|B_wZYWZ7wATTPKpAnP+*cToi^bi)D z-eV>2_9hy>-WcCQ>|vr4a}zcaJ?#MZ{1pcRx`FqpE z7jnxHzNy+!36Yq>of)O<{ok!O^YY&7epUGI*6G>tUc{ktQ^5afH;noG-a0FvhknT0 zP0ooA1IH9gLF4u)%ssBX@hP5)$N|@*h#TsV;FB|R4PrH*pm}vMx|0Ug4_#ls9Kk`e z(q%qjKKAE-D1Q11dWS}#iKk?o9z{nJe;dDargZ}I=aG??fOY<`J45O>~tfQW9$527Y(VQ0*l8^06l7Fr5r|Wsb0U5BBR%_ZADDeR$6RO*ch~E~y0; z=~9l)?!(BLDa#p#UH4Zh^KlKwdXeqjT}H2#nD9V<_wzwA23g(E@rZp;g)Z(rV)4?m zA0%fS&MjcO;Q_BU)}o04{H8@8*ZyO#e?D6{inhAc!q%P#m-d9w&~HZzL3DUS&g6 zuzCOcj!Brp=97-gQ{Y_ZCe}W!TsZ6!AI%rUL`D90PfbU*qjz>51=XCrfJ}=*>jKz+ z|Bt-w=^qt;f#S!nB{ZQH)PC|Q63Hn-3i*_VfGf@Dz{P)fozhlld|xKLh2M#(R3OW0~x zz$VP~_OIn+#HHk&m#}Xf+;)|N`v)9s;PZX?{XjC?@!y%ro)gn%!PASovT55(&?b?y zny#L`$hcgtAw7{35vXumXUiYsk z+mqo)%6Y=2H1__Rw~+e*4v|2?NX=Y$-Pd1GHU2)O*#V9{W-|>LO`xZ3F8ul86mn53 z<|Z5ZPKg{~*w&R-O&&`+&E#zH_UI)d35I&0dEQdwdmn%`KkLFBcR$zJyU zFa6Zgg%8KcfEE`S3b8mO+SIu3TK)vI^=+qKRgOWP=D|rvzr>>kH*Ra3vJZ&1G~!Rg=SG{<#_?^Q(hbKDGe~A329h!qK5IChOm~$73kCH{zPMdo|jY zuTGY08AKk@M~;2s8-h(n=N!v+ufKm>;pLitkJ-NeRG|x3DE$qfoN17<#boP z#SD0mK3C;E*#MhZZSNOL=}6kOn)C172{^y-A#@vOHkwkrpH2E$ z{~kA(fSZ!>^_R}j;7QLb+%>-*w7S@T^MhzJIwP&J1;e5s<7*Rp)%Xa|T(B?IQF#Cs z39kMgAM4@N?cq$jgi$zSNso*Bn+n&)%{KEtWx%uRTx$pGez1+dP2nepwk8#dA70>C zenCV_Sz+7mrX>My-Plb5%SN>2zrv?K&G7K+xE1cbDh00W*%nx@fdy)O%KkfdYSEzc z`@{{mdyw0P;5&1>`_KcEt2Zw8GvL+5EG3(Z1?>H=uvP=@BoP$I-7fnjlR-{dgtN|t zif%t&Qg!2MgciP|xtAEj$S6EbB8WzZlb0$uiiW$8%jUCV38UrUw38;Xhl>m=&uk!o zG!DNxsyP&l@o-9nYzHD3!{dIq8dqN^?q)r&lFxXh-MB=B#t|)%7g5cqvI*^)_MSkm9b~=a zxsQ&Fruv{Po5j_qTo(*q+jJ!>cm~HuJHFfCl+$|;qe9)KLvR_`BnVudM_`3e=O2r^zgHu6;lY<%Vj1H{ z0nB$Ntdiac=*RxhwhL`Wd{sg5jsq0*WA}d|^6yA6*|e)ubPa>Bq5Psr3GMKxE?2+l z(l9FQ`sj@zwjh<*?N1H{Fu<~y;bnf7eg9ciahqTJ{}AC_r;DUj-4vW$WeKN|iVw zrG=dJGjyWD$lLTSmssrUf3^*$%3Hnff$LkgqJHx%s5>K(eEuy9x@KjV$5-N^oUG&E z7Q#eAla7WDth#{Lty<#2NEc{jaILfk)<6mIg^Qj?J90Z`?>PU1g>0->#O5gothM4Z zuKZ+Q|5&3UEPz{Oz*Qy{E9=vPOsHnWeG={PzSL0X%}72PaT8?am@FfF}z6MKt2f3!BfKUEYqIV z=%gTx$ZyYRc5Ub_jy@=%O0NufeIL3Q(5E)a_9nKx13xg>L;f3C_jOd&FOpKL&RY;+t+%M zs?h-76M}pByL%9I;>nyYg9*prPg-yR-T0`JSi3qXp) zLot(3HglD~g_QxPoln{ZG&2x0Lj9||U<(TD)%W|i*asH63GZW<*vC)VaGQ$Z{0080 zW=jgOjc8w#?ol&*Inq&Oe0ui23H98%n<#G71`qzd-)F1D0<+tks!abnNMK3PoZV^> zGkv(<@@^p{zU4o7prHZn)^Q2A7s`UQPuaH5B-qyJuBK()`wmB-3487mNn(Xeg_ut2g z$0Y;*k>KLyM0vw*GPv*KFL8R;0=Vz`qco!?h|qN!+Rr(KF5dQ4@fIP$-SL>ON!6ur z#{_Fx99M;sjukMwZu~$|O&1#!b=uI5CC!VTCM@{-xxFjQn>~Lh)ofj}Yny~kRu{&& zPvgKDDfzxlCDR4jw`?mFKIJ}Fr z9Z&vFMi+9&_4q7s2)n!Hv&YVH@E#cZwULkg_;pmD+4<@+q5A;;rLW?BQ1(?|QC+4J zGHSb47EEf@2>_(Bdu6R)0*J_l0Zp0|mYh53&il1CI z8HCwmTvHou>0th;`EGUJRkrbW-%+4#``7}apEv7{)eHlVw}?P&0Uc`jrLW2gVPMjQ zZ-UW6LpfU%-Kh6*pz&VuteZ#yO4D^;3i<4Xln;7t-yS`N@T$_IzbDBkl8@)hRn0Mo z#J)Ue+{d0jPDgdK_^(poddm*|H{#={)GQ_elQ4*qkM^D?oU1|vg2Uv%1Ofhe@%W#4 zNQUW>Lm_|f48dkc?x&ctR(OBf!9&}m5EK|V@sTJTin*OFXR(V8%8SZJia)Z~->}$> z!Wp|>kQ%9y=*nnAfvYkf2jiJwS24FE&m45F^`#)~q0uaI2OeSq1cz*s2SK1av%Tqf0}uk<)NHmM z1)Lbql(CRIXx_uQ6?3oq|EfOil^pixPvbxO3H&-lh3y-kJ!&f@Af56zy}~~)z)DKV zgRk8fd?~YfZ-J>pKBA94&ex@I7 zYL#i&uf~8Fxp4DmnR#sEpUYQo%lb+LY+~yc8HALv+o7AsBsu=M$z!ck%YBrb1U-fd6^hxI6@wEanl zYm4&HvZ8Tl_%(|r(g`qnwE~f%tG>(^rxidYB+KFwM+JA_Vp(V1Q|lnECV(q zUTV`+>_#2?>~V{jM$o-p14- z2RE|txB7a>b^YKQ{G19#KZqKly?AI_Q5O*|V9y_4m1To#{72!~)BC;}k#w|N^q~7~ z%zEC|+cAH4wh1-$GPfyL(P4DEb*&%&INZx+kULXrVSite^WBg%WS`hteCT-_dNjM} z_p7lSK9o9|Jda_)in$n_#Lb>RrhYCN3w>h(?+=~K$%#Jbd!4HuL~8&uwJ+`8t2-6w`d465*(mtL%n~4tTrRqR7Z71_$9(udAg*^dMGoPh>X* zl71`>nEYhVAM&x54ie4`h<*QctLMW;(9pIzm1a1C3a=YSAC0MpwTO&>#s@vRJ;Oxn*8%H3()yOyLHAlXe)6#!_oJWC_?MVF-%o~~dJE|TJ4vv{;S9EEDRA3K zbB!g$Ko_jCI+BYp$ZT^&*8brE=&(8v))K@%|9BnCrA3XhfZRMdw?lK?_m+yO6CJD3 z)(J7+PXmoePZpDwH`)f+<^8Jn9y1|XpU>*zg(i^R9cSkLw+7AFe{9LTUjl!RwMyYp z3p!CW*gx=@2{)8*qt`;%^9Py#_~?!&>%RJ{Pivq(4kBEBOB)`WfGfe?hu(D6pj??p zyOl$WQ1<2g4Y_I*Sn6LDUHm{opGGcxDjX{YZhF4}^DY^!mVP#6bq&J{$M3_f!FafM zLog`(bq4$OmzHaxj~tk=bjbhFA&qzF75C$NCX2o3Kc26fLr>SEF6-nCgw^#tSA5T) zm`sOon?`K||zbRhG zy2ghIrR7}O2-1%-3coOZ4eL4DhUkQZ(_&?s@pi^7XgP0lFx zqCgIEIgN<7B`_$D=giQ|Ru(+b49Sq}WX~V{-WDt4wdR#Xh?MHW7j#!H&55T9~HnE6=b-n%^ z;x51CDckt!jgrY*lsbVN9m!=aFam^`jkvF6G3hE>km6yq7DeS~U z#DQ$d(6u7;J?2W)M0FT)Q;PCF|8)#~H-Gn~=jbgI zY#}o9DM*Q4=MO{8AP-@lE;v!5GkP$K{rYq0Y~}GgnKbZBI>@QkK`z1AM4Gpi28=c z7_z7Le5OO`Z(EF(4g2+}{RfY5k~@>A+Y(W>@bTFxBMd6z5aiwa z5)YwD9~|E&k|FSdn$E)uqrjE8)3>;}1}V#Vq`r}AM;o6$8kWu;L`vD)ZxTMx!G_X% zSzL-e|1`(F^1Zc61mibYem$o*=yKu^u58B?q8`pMCeGIbT|kqkM{WpxiJmEriKoG7 z{&Fjso&9KMH&r3@Ruz0G?(}{fGYPmydyPWx;2_JfeYHH|g}J8_j6nu3br-qBvxIXA|FJNgBAGEP14C)P?@&tD8=>SAzJJ?);)m zDoU388x!K%kAB^-HdvY%ha&%h^C?~I`NN&Fj=^0*0vFQ*3b=&^WcM!M>?IB|(wdtS ze;!{4Zy!C0Sy<1QIUuYUN^ zY1tI?lmJ{-jT&YN?9ZP|G6jrtr6=H;t&BdG6B(NKpQ6n5j6rXprfxq^GZOUUy)d^- zK_)G(8_RBx0G=;jKX-Kfy?h~c_T;rf`oYX$5Bdn=zV>cEW}*vaU@z9Y)zBcAZxb`w zoc;Qr#Of(LX6#S&)`5;GsD7cCk0*AIOgndp%&GDXBn71XoRU# z=54n_r=VU@bop)|0c=DX-}UZe-~WG_vrSG1je^za#dFKybfk}{79yGr;PJ01x+Ay= zeHA@XnEHbb7kEQgWOK)0KuoAETDk$=1^)2~_p3a2PijMjUk9X=YV)8+cj_ha z84KuUsX%zk{`~*D9G$#BMNF7zUmeZK?S*rp_f6t)7AVS3h)=>1;9HkvTkv1&Ze#r*+cY%RYrwGW@L*KjBV+ty6Uw(M*6Z`xB zs1I~SZd)?otx!cF4`bcu>Fju}LK#8$zy2}0S#@xc!({5oKsVA9no&5`$pqJE{lufm zt;o-%wGxw5fo@WzFQ{t|g2|bR{qIA2flvKd*MX+hyaAZemrcxE)#wGrP5j^Bo^pbH*J4vanu zY>>-l9pNUTBcIHqIf@D)^rw=2*nTqNh~H!rk~IL2zSY&3Xc3@_>G6~zox}e8J!8|q zO`Qzz-4lN%L_YXNHR1GRy#ZlO8IxO+Yw(EqBLg^ZX z^79Zv^#d`b@?m|Db#=|_@OdmU?cN+Ie1!(fyM?L~CE4@GHF3NeU7ZOM;i)7;3oMRH9-RFHVd?BlO(TKcH7m2GbX-3XAO|bdivlYj>^*rjNIfe?45+ zMJ@6{g^NU((l(nMFr|S1=`e>cgY5HvcYZ;}o#;u};~y~iQi%+<|0;uD5o>_6PIzSh zlST;g#2EZBprD76EJ`Al2)--4l2yi!;KbFYB%^$Uyo{DL$dHd5oZ3VU1rBy4a_{%dp|RT`#ha_=RhX~CG&*PO=Cgr6go`!x<6cT|lw;MmXq z5fJa>aA!jJxvyn@)L!V-<8p{3H^a@EoJ|7Sbtp8T(k!mG34z4C?Jq+HR98sIv*^R< zZ)13z8dnX9aPg(D-snZVA)--6U;DvEG-SGEl@1*GtS7OT+26m__uelwaHa?LS#>`D z`f>y~8bdVR8Bn1#(frT#7Z}*Rn-z36Y6=<1+MrjG1W^33t-zu>IHOifKE1-`^;eN)cHA;IA#n>Xfz zD9$PN63M>;y&~-#+aOJX=u!httppN0+M+an;O7v`YTxh|xZDPcrE#ew>u*rI?P1!} zhd5+%K)F%tKRU$6v|X|}#=igHmZ+=77p8i^OW-P3-gp7LNtj zQ1?EH^?E*=^U|ZJ*TeSLd(7~v-Ru0l-N}Vf2TQSt+y6*0^7foGvgl>O(S{)L0|K2e z3rEzN$@x^CyRe!}p($e0#-6zPPB=L)IcKa9z zrN5}jHLpRVSRK~om`230rl7r|J%Z+Bd^tRFXh8MHYrRZhum5yQaX$W6B*@rzsOy*V z547rs=h!YpK{(F$D_-7p&>v;{ZeeTy3Eq-y-J3&&-!7y}7xoXK#UgV(TZwAe?s@I0 zhyEnA*1TiXiQ<8l(k$d9f&&`IXXei+_WDz!v)WaOnS|ROou5*}2x#z@ur19JgBr_C z7v!HdqG$U-;sXf>J7%fzF{eqedgrve%{rGw*z=!tDxKHYC{TdUL001=RfWi`DU^qKE%n&)VY$P=>zJ4!5o2;9R$K zX*ibs{@c!9pKdnmO~Qhr&1t=*3dE>iekDdBp$Yraiku_05L5D?T+p`x-S^R4STLZ2 z_)Jk#&T%Z-I5IK2@S+KFVmw|;T_Qq8f!OhO|3S#J_%H6uJOM~;Q9J#2u636|_0^vcRUCY=BoBViXhPezUe$;cnnJk;-1=LOlVD@bcD<$BjVMybEw*?UmVl?o>Qh1Pz@JyHw!-H$d_nGUQMX1ph%0$YB zVasuH{YQ;qRP>=d%JCQt>U@42R+41@{IBMP5y<`BVDinn|G?1#*n6yQpX^5#tS+p0 zU?j5On8U)AI|&T5QSIH2BRu^O$aU4_>D_i97zDkMz*mBe_FF>a$zJsEy~Q-ui-~HP z=Ol04t%GA1MgCMtvF|@h_$!d~X@miL400_`ZD>OS4sy2)FBX9_U&9`G%M#Qy>eYo6 zXoo*f!r$yk!9zuwPIb!@GV<*#!8J5&2x^50>MjUee|NeWTW5qWT=zwc3f0p1r1{JEO zgT5wUfWq{WtlOW9p4;+@9w=)=)eDlQG{aQDm*30Nd&Gji*OS|glG*bY>k%g3w0>Rh z=T-eD7kl7tvsojnw-LrdWnf2SHT>YZFO^l-i)M5+O4c+ez>{|OCht5B9zGT%{=Cx; z!6uFKnGciUh(;Ldx56V&&GuVc$EJXTTWO$Oj(z|2bUCi~q3e0QaH&|T)V>b#lY=X+ zpT(j+H9Tj|t~$`@*yi-ayBp1TJiU;;{y)`P^}VD=+R$ij*pcfh6)3-@xxFWM5R|2| z&a^J~f~55IfG=Hi2;2GV+{O;}{-f+(jZ`zjKo|X+CTA}dg|O5$_YdI#D($05JP6K2 z3vt~f;lbxd@QdI`Jcv(DKJLgPg7rX>zEoHgc-<-JDC?u5Zl2KHQ;%9;{|_hT)$e#P zCae8Q5n=CtIk%+z`A8Ut`H#f8+6g?$a7r&bVoHPtF6PNDuR54ASL?*YRDjR{ebYMb zDG(aFXY}el4tSMD+$HoPfVlgkfq*>?9sE=f+UZk?R>E=?m_}GA&Nc{o=*52hq3T_! z*OdSkq$}GpP2zYG!xV$4t6!o5q%f!}K~Psfr30RYXIM)Y(ZTQ!cVu~cHyqUd z+$2M+Mg%_bn<`7yun`wvqp#PC_J6&vWxejx4_C=4$V9W}kKX~tJD)uxLlCKSCSGg; z9t^zLVs;7#l*_80h44$dKLXlpf6wdzo5)0_e`ZqYzBVFFr+bumHB`OuJEaI1PV z8R>MTmeK0^Kq}kt?xiFGi0(U-*EY|d|3sf(d>Z7;fKTPh-EDpa5NVnGI4PtL?ItVb zO`okp1M)diVw5sijcL6XCq#$UoYV#}?=e8fDn~_4su0$IR7#@ugWB=Um2Ik6bS2&t-0$a;T_8Cj5tL8iiZH zPtrm1W;z*u32grC=SxCkGC9`;>YHG7-ud#CmL8DJepNdmNrVBjZa$-RPOZ#)YiOLv zKL5Y|X^c^ApM<88FOHFnNyyzNBw6QG3B9;)mJ;%fa8_aPsLECfDzr&{^bJFV-92Y* zsJjx7wr#KO+ilgz>1Slf(WwF?Oue!zhbtRB@b^sey3PdGWs5?)5A6A4caC`fPJ0r} z>=7#XeTRtdo^s^Ic#J?A=jjNRS`6&bRNH2`TmyRiqZ5Zpi0~pfS=2w84ArKo-)thD zp`V*MvSWWwBBxeTVECy~WWMLQ!JHr-6kHPeDqY#n{}S{nV zgQE!^;T6oUh1Vf$b8*$o_hyv%dUhekfdPVtd!ET{9!BqD`0mWe)%<_owasEDdr*(m z5$Bs6{qXir#Myu9>w5M_DE!X;2)6M9_{(h1to6av#a}y5H;#Zy$gL|Q52iqCqXB2e zcMPZxES`ITp`aVBuAP5M2@t`-eD-foHF`c0J??6mfUfu)7nJ`whW^~LziW3NkBa#p z2|HiL!+oiFRz*2`{va6qsgXQG0lPgnd01!hDDe5J+SQYT$X;N^ZWpc`{TBQBjUGV) zb?clLipxY09to8i!0phh;=}(n0^@SUsma zd;P!h%`a_Zc@MbMm~OFYZbm z8vWaaj0`la3)lUz@!)9Xf1;&Gy(@gCbDckIvrXu4T{_^cQL&wY4*Tg`frN{8F zH~NZLZORnHDK9lfN?_1`+Vi@XRWXQc|8)M06d8qCp^i_R@Su9JhB=6>&)+Qck}TurFnB8|L-JZ2&5{wzaE45jU^EsLN!R+l=<<&(R$Rz zTs6;W$D*94QWjfeX)ynuP*&fQ#x_24t3#p1(E9t8xyYfPP=G!Zw5wx1)_Gp@?UT`{ zT1dSf)*&xCfb>g}ZXA)Kf(osPzirD1YI$^Zt9)uTgwTChZ~vQwD${#uN`81a7PL^L z88QL4Z$Z({WcK>=RHV*z(1r~CSr6)OZpI^TVWH8_LKw99#ODz0gN(;H>9t6_CeTK$Hwoa!@w_+t`@aO17!sf4xZi3h^MZPOUnm`M&=J*GZv(Q_>-a~ z(}OL@w&L$O>fv(e&_taI_Ee-nM<=YS2hm#lg~+SHV?b)`%N-SDfBuMBet^pPZ4&fj z3UCic3Xr`$mwn-J656hI_4Zw>8VDXw$T=L-gz|Y~sz0oA(bC5mRy7ri&V)}C&=#7& zWU8H%&%%RSrLv4$%@72N<*8_&B0~Lmf}HCv_WrZTM(=XpODsfOG+F(pIthzA`>ZAw zagdx?(W~R!geH_f%N&xOLNf}zyngZ|ND-^|{`;&Eu?i(=X0FZPhrWGsY92)_FWDe2 zY#%bE-6>WqngX25GZI6H{r!8p_sQ^Zj!lAJ+L5)i+hkyD?~Q4c{|LW%Ih=Y8>!H_9 zM7n}OKzkG0a85ON7;%gvKbKqAH&>^-K_`DAfw>}VeBhM>II! z|DbLogFS!DifYH{By_{s8ys)01Q)_G{_U^RaV(H~BUZ2JmkZr)w`%yT8EA}i|8#`S z0CdjJR7C7+gGWgM)V13cpbjphq;XP3&!&R-g#z_`ze-VH*y1IT2Th=_9<=5BT>|jN`90cEKZ$a- zhqjrKYfz#dbGD+f1q`OwrWCGG;MsvdYS}#^%>DN_Oh0|EJI&REd{!GR4o1;odYYs8rPdg5mYCN)*J%Q!&P@;Y*XJR9>LHt- zJ#8rWWWo3CN1`CkTZH9k%>uhEgpqyO)#j~fsXOJHN@wYBgV+X$$|qz@N#0vb;PL;j8*=O9{5CukDZ(E z?3ripKP+Z?0&sbaz{LzRx|%^ni39FE0n2!>pPf|vyNuw__lOrpzwl6KDf8Q-84q_j z^_rcWiEv3jHMVtkI7EMJ{7tK%qWfkQE8Cy7z~TYzZ+aL!?BDltHM)cS{3|hPk8@PR zL02PkH=M&EVFE7^yRIKh>vZ*dlXV~~$@W(_ctMTNStbM_nvJa=cOr6qzyL`;v1lr!tXk{I24@$46~gfEn8tZ1JiLRf?qr zU#o6HXT!F?m%7)0&I+%nxR!RnbNl*TNt|@JnH4;CXICHSRwn&Qdt8k&VkBL2X|*t= z<0(Io-;d6DSjmoh(co4TNiB6lKHKlVW>a@G%a;t58Yi$p_Tyl8_a)gbX(nHn*PQ_z|5!o8RekBpiI%61gxf{^l`Db9&WwD*|4s&GLMxZU6P z6e~)ES<|3=BTx4AZvw{@HiYpqAiwLMiG*k+aAU&$BVzi{@ZAjigz;LW)p&Y=Qc(!G zT~>l;D`~)z*a&-{j|15}a-`U<5+&H=#iZOG1ZmYjd7s3wC?xl?$+uuC*cv}opqaAg z55aRel;L3p9I~Cg_Ox;k;nXJ1)K3?ny!Jrd2e+$GjsCsQ80~g2REX)>yzaX@ecvt) zE0d6S`sFVz2F*|uToRSNvj>ux#!t$o2w)=7>Xz3}fiuRlW>pUC^S}AWvv7ll3}^IM zC3P8-&~a={#4@W0sMdGBZ!9V7Zho>MGxO#pR9rL0#8bgi0|FsEbO`s9YLz{O<5I}GzxqbCKd;PT^ z(GyYsL54?*{EPwWI)5BEaqgeYAfg}K8FNgf9Odj;9QbehBy^n*E-2O|!sY{)ziCeo z!Oht7DN(iSd{cd>Gi-x4`mFkhxO@?ZzDt{EjEd8t?#_S6_YeE}uew=TtaL~Zyq$k8 zqdMP&1hS9&4AGcSqM>zNR5u7tSoWFdTe86EWsTkU*aiq*h&o-1=|U^}X!$J8I`}ny zvsOy79Ayrr2^;sZ;JrrjJNxE#xaVp;YgoX3{SnjDMys|U!2a@Qg9QC4DD}(7+V<2U z+h4gSHQzKK^#T?7m7+=X<+qMbPAd)|Xw0~^dJM4cv@04Djj&I_-Jnnx3qE)LxCYxd zpqH&t@;g;&Adt1?!&z(g`B!C6?6cATs30n%5qOPj0_Dxy^Em&|Hmla%G=Ci(c2^adFJuXJbg@OtkCuP%3!6 zda4)J%D(=728&cLt4%_166Z^rTp2QKDcG;oHHoUkOMDtW*T7+H&}p-i{U|^vZX)Kz z6aZB~s=q`DjSYR{A4TU_1x~u_e5csA@e65+1i43!+bJ#Jfv<8c_4DXB6mZd{$_v@+ z51rMMqQ^~v(I(&KA2s7hC)Ut72Gf8%6tWJQjA791C-1p^2ge{|Gj6HrB?)|^S|2Og zWTIOydl+&o3<$qeNKw5p2yN=i52Vko`>``DoBsPW(9@UM>Tb;b{@W8z`?SQo`hZpH zn6>fM5CqGen+K?dR5r(POtNJh?6v1elZ zh^R?p&*pcJs$s)U|66&?R^-)Wc1dsjyLwG9;I2yfvU^WSq%d=AUb>iXZ9qQbv!%c{I z;faob`V`s{Q`qb;K!T*{4XWaw8qu%7z1cRwO&~VcK=yM7;+A^`^yg z?r|Z2*^lbps-HMG5*a5g_OK9L)3&?p&OZ#zJ$##8+6R&Tdq?}u6dH7ds)+@*v48%1 zZd}cf`2YI~3V#pi-7kU>h1l&i2`q41HZj|OwE%klU3#XzN=LqdSDjlf4S`XonBI_W z3&b6aHlBtuIJj13+2SyOOm=YYpeHj>f~rg6&fW&NzFU^2+rfVQW9O0r>0K=YV(2-% z-^&`1jWo4hm?sF4Qd$U~H7XFVRi{;OWevZ)KfEi~`C_9#k<=Bv_3t$~oTxYq8_F7)apoeSp3G1y1rY zHt{zDQFrgf-p5o_k=pmxONju&u}^p{GpgaFOTaCje|YHRvXkWzBf!1n%v78(5eBHv zMOz*Q!&N(;)XYy*bfj#g)iJyU(#@45wSVIw=DF34|AN!m#y`(l!=t2!hg{}`d(Tf! zAo~<$=gsm&=r|?NU--Np8k|qOR~oMYJ&|zE0xc^1ioa4mCO87PK<9%orCx~T_u0as zcnaC6FMjJ#`GG=w1z)(;EXyYh4fDP6+zhpNISTCvlLday6NFupapo?Tk!r zt4G^|{|JZJ8zxb=(bO^k>t2n{20bFnGcpW6wk3I?SFXGd$MRpF-;zd=duxJ@lxAPPY zHXP`5&YYcqu5Y?@Z{7-|{&XUV;5Q5}nx#}a=SR@HxUzx6vr`c6{N{RK4g2}e*O*{5 z{DA>>sV7fvr4FH0skD$=JJQjIPk7zfs|fM*pFJK;>H@p{3|KbMq*bt+}wYCPvsW^P$cgt?9-TnCx)1fzeU)8{~e=Stvs#CaLeoQLutcx zpJ}$YO132(qW>gMOqgPzlW)5?lAbXLS56FK zuWw2NuhLljnbdaJtC)^&9U;J^bm8Fe>Lf@;UX8ss6N^X^S5@;oCXszlThjbuE#ox+9*1b@=h%Mr1Wo# z_Wkd9g?%K1?MC3{FVT{3&#`cp-{V8gE;9U1d?K&N-w4_N@Tb3~O(M(hosx;>B$)lD zc*&}+9&wtT!tgv#M=l?vnt!*9p|5#whhNEJ(K-2%M|-u1P%5>@ENch*@#|+1Tm5N7*i!fi{?Z(>d7mgMI!RzwyEC4=)jnkDYm;-b8`D8=YiiG%L_?%ZkeM z#CqiXZ^JZBb`rh72#MHv;-GBfgGBG*35b3?P^n$g1fo~&t|ZV#Kv2tT_l@Um$g;*+ z@?9(y2#l`qDSr0rpSwJb+v|m?AVm0*d3$;kowhMcICY~1J=-J0d;t1e%S}|*eFb0ASg$l`S?Da>aR^WHi0tK9< zltxc)8bODqd+zjKYe2pMWtb%g3~CE0IMY-)42)K{ze~9!NE?%+^$2_ew}V`LNnabG zq6$6>8xFwM3H43f@0*c&SRaWWM+F}TyX`qU+4p}xPd;Mv&8H8}@pvn$G!KAux58x+ zUpfHgsA3Yn2_0(=IJB35`#;9M{2j~h`yNq}Bq~x8WsX!rq8*i?D0&gelqi%46`>?) zP$6V0WJ>0FW}D}Eo;|b2mZ;L8|L+jp*wF*vQVB72i-%Z0Qn`MHHE!f%5tZvz>dW5NJ7`f0gYe`jhsHMKRYw zyyM0LfgMErv_G~)*@+Cxr#>ohY$pKI`?GQPRCAF<^GVkEH-j*r(|6LRvLCaO+4EKx zr-3q(AbE8Q~=N^Sq>NMSA zGK$K+GgxO?g#uchXmqIq><8)8WBF7_Q0jm6;{ye>QkkXh1v2IzyT5T+eQ_EC>cM9N zT5o3X)-U_1TiRJrm3}4JLAL?*`B+R%TxX!eN#~HxyHO}Pc zyrm=9!B)4j&2}0bwozL)XfVz{@`<}Ez1cAfz5(l>r_f5kG+(?bJ8w;Yn7bW&`K=PR z`8P%R@OR?#^sylSs5yw`_*H+qsS_oWzO-oBm0*wdvS+i)5bTJH4y^dp2QLCnXR~w8 zz_s`FuQjhQ#=k7WwcG4c&9HgbHU)u`Q&{OxeK%5%1SP93J#~sz&~uSLYIG9`cAt4_ ze*O{(lFxo3nl+K2waWI2#&vJFwxF+5{%{JZu^Hz$;+o;_ef0|^J4w*;VV4!(XcFW6 zyY$%Q5-Ae2Rh?7F;2lGajgz1Cw~&F`_QhoNpIXp!)^X!|R|DNk9bpbFQ@~ufaiA{! z|K?*7qRg}3qOq62##H(wN;CzT>}?D~j`qRx3Ev37UNPa>!>XYZqsQE-v}ZPkB- z25E(HpPzn3ph#MdOwFcBd@5<0BZS>>vn1*C zlWR1voe@^OevyptZJRzQW;DZVl>uf>y-pY{<+>JVNdlVJ@BcWT(7|t?my~@sO?C_U5avY@12G7JbZ6SPy5hH^~OiD>?(|@&N})eqXlap1q<8_ z=>{XQ(F;o4bCA?+dCG~%nEzEbpAK4H8HKJcj@7aL5#Vci`~KWIDx^!_dHVwzz;*k% zy`*>wHfe9M7T-&S>L){mC;rxBio}NZ&E$0anclh8rEd&HM{no-a2&uTF2ikxA{21d z+{dI)z*v8XdLAS_UyJ*6&ux~2p=30@b98Y1U_W+O6obLlV!X!`#KvqygI>=|b^Z=S zxY%hVb@Aj7jBso_>}}cxOP@Jid$uK`+w&BcnEeE_omBBi-aZ2&0`6`c3yk@fVS?31 z7mjY=ERDIpr==c;rXF?4@y!E2cg||<=DWDaqH^z=;XGV1C^cmAXn?1(tbOAOo%l#= zz1U(+6@1?kd)4xAB`)7%NsnIBAAUbFtkbu&LR)O;>NzXM{+CuGhi@E;A%m*P#zPTi zlkj}@x}1n#9>xW{{i(mk|M!XhTu)4;Aj^X3o;&gcpv6TPH6{}vU|nnGS-U1UAS0P4 z`f(UC6!-F<+~0*v8ZImIyQe_yzB1&!W1RmqYz>e6!!-pg^(zGKlOtHU8t}p=x&t4+ zw62anUxV82Y9FQk5Mh@dz>ycHRE0NGA|ZV0=mYaKRQ_O1H~mIH zUYpm(y8kBO=d(}uU)D38zxpRk{FAC64W2qwXAZur!_%X7$29fbyBPj223NFm_8LDd`loz-BceM>ytngaf&WyM=W$#ANaW4i|57^wb= z3lJsz5A$EP(|^;7>7X;Le?eZNA1$Kfryu;S#qp3=1Wt~6W+y4nN_L`4NR#Z)?J4LVnNByj%Gm!sQntJ* z_hIiE59c^7Xwe4_G7{3YRWl%Vd(remO(Qy%FdsR{OT>n!=F?{DrlB$>W}iZ4C2red z5f7$?kR|>8@cln@RF3rAx=CyVwf6et)x8=4rm3ch+Ihz3zu@cv;;!E`pl{bRxnh?I zGwZH9D#j48Wd9dgdG<2!5jQvUxY&({E$U4YGU?#8!7MX7a2%UwXRS%~&9MJj`#I&k zLtvsx>~;zt19#OUM)I~4SbgkdXJgOU|D`E&Q>lqmKg5678PI!~43y0=Dwmll@RWVz zfkjXQ7QVPMBw$HL)=_DD_Z~8Qx_Ix12e|>aZy@FLi`2uzB~6mG{{(8Mu3WiZHjI+e z8{eyEQ{kX>M85KiNgF2Rfng>ap)e-BwLO5FA_AAt823g8>k-qDXfQhA% zGk48elnYGr^ZJ{-s&o zowzIA0@AMBz9e85 zAql#xIfH{fUF)XJ6u$djUeBN13>^P`JCT2!1Yt>EC-|Kh&!0$^-tl9{5(zdC_7t}4 z9zi*siiNUe61-v)3Eu5c2Nx9tEC%=2!NV&|cW>!ULy*R^b?YO0!1micmKPx(FmdY! zBTbn}WIAhQMtkcBwXR!}W~PZ?84`vkmQGko3^kG$8O9&Ik>RK>t3cHDv3Bq{AscAmkt#hH3h5_73<+ep;hi3q=5ZH z?JEJSjQL0JnX>~ABBnvn=+#x5HJ#PCQ#(i_p$~PFKMSr}RblMx%Y=;y4^evA_!E=& z6r>#Uh+y4Cgef*ISK-BCG-2amE$tYECaJ!oIXH~3^Dpaf^OJ~Jiekr0r ztTKB?#Va2a{&_xb>|Gt~bX(+FE~g?*-n0CzDH-;s%smmQYetoK)dTDtRjBKj?D$cm z3`tsCW{+>w!ilb+vKg*fI2rM6lP5Rh{sTGQ1NwuHN$@tW*I!GUhE_lA9}e*MfvR?M z>Vf=hVD+CMugLa-{u7>Gxm(uux9`>>#gPi!U-@0Eo+e=B=QbNbHY&am=DJGM>c`cM zX(GD+Hz&Y}x5n##@W1d>a6DH|ngjnaO~v&-J#g{ohoi@O%fNTXc5k9`9kQ5oF#YUm z!xv-v!Ky!IL0Kpx>$g`gI!`}$xH(*fNw2Bv=sTJ)xFzHI%vcw&2HHQW(_7OYfodBc zxH10zwJLtTO*EQ-;>}6h2gODqgfr~584CpGHTmzV`J*0!h)`o zVheKy+q-CSl z^qrzwN;fqNZ~Q*t(8x=`kn7c{CfjB}ip$|mY!2i4hpp%P{?A_oN#eVQ)26Jns%QU21l2y~{tsG$xJ@%H&Yxvb`skmB{Jm1r2s`1}Wo ziPAl3(9?2C&7Z3YT{_~zj@gp2hCL6za+iU{OP!M!M7!}#058Q>g$CuutotctL~Q2$ z`D4nt2D-c0)1r5e7k%o+ z()zM1p{cc~G;-T?U0xkVJW6GavhIb+nA)K$%M`HX81`_VuLEC;^)qR?jgXjj`A6f& zUeIy5E8C>pgDD>mbE&Ye=@0p-{-Pqr{JWI$`(cRpn*LDN>YU%v3-TwXj_UrMfh6T; z^VgFbvCEZ1ARdTVR{Y?|uhl7tHu`-yuf7zy6%4H+l?&i`KevMMC>^J_eiPj*Hj4R+ z{sjGB!%*?%!tTijjPvg=bIhOIUVC4jBVTg%%ap*Yy?eDRhY9E9m>ZGZ^zWusi8}buXC@pcL%``1Mct|QNAcuK5+$vT0$e+jQV9W!>z@t8$zpRY zlYmU4-mc%t5bJ(VLy;vJTQ!Tloj%n;RCng?r6vMKH#UV`|3iTt(z36V6vn~0)Bi%( z^=#Z2b5)6{VPK7yei2aL(}%1V3R`oWXJC2B`$cEcG)mERU&+^hNmWRCzAEHnerTTrz2Yxx*-@*IAe`D$&S8m9;wdxBw=m`N_Ltw*VyZI7%>XTUGq z;I!!OQFyjTyz6jQ2Q1mj{?6T6jB_LGqAaJ{aKU54?oQES%-QV|rolZA*Ucl}2?;Ug zUvH+JrfRp%gJtep8$H!F$h%>_Y9ZGOdlTlqG##pi1DXp_J=lTA&9{fxzMBS%)GVGh zhkg*u{m?9A+6<-?dB+zXd5C23TcUFVsC}oYLJnqNFJsYloDXSCxzgMa3tPv^ifKlrU5PdDzoyx6?Kxfn0( z|905KZW#JSzrGv|>W2g8w5$KdPJ{D*&c}`suj`TkZPp1v&}}4;IV5 zCBf;|Ik~R=)ll*F??W?T5?JGsf>|XASU$E~YduQ>!W)jo>}Vsn{j$}4`oa{dMY~Cp z%A4W4%ITUw<2C)#t1SEWD&zhOU&q2puOu?`&$(SGzB7cD`3XMiQzXz3*qCI|RtMMh zPk!;ZUk}fN@uhjyG~D&I)MWqL39SMZ7pm>zu}bJm`o1?bj6M1(CjVg+EVnnY)|Id6 zq!^uA={NTop1IgJ;M5LeX1@-Q@jb7j82QH`F~?jSm*}jol+U!FXW4 z@J_=ds9i{xwJ#ipOXv0VMJvki&86t#q}~=VUaF#tT_qs@?`uZ>7in<6b1aqRH)H(~ z$$md4JCFtoWut1k3L~I#ZOnyKNQCvqOsOSn@yAvBRY>P-Gp0`5=yvv>24c#Bs%g<6 zmR&no{IByptnn~zUP&slySm6e^{j^cQ=%13;#6?bxmgi*m9hSQ{oaABePS9&4s`oA z8T<-0-ZuvgPw6#NF&x3i4vCKWhGS%e=-s3-3NOwQRgUf|W(*ZjEk# z4M`>+bADx3;tAG|NBxHTfKQWUpSvmzSPO*eDCs2BW|Gy|Q``bamnI$?&9wnRbRWlRDHU;hfNxnOJmGSrY4E~`y-z3!D-FW5k8V{BG?3<%M8;cyJOf}`&b&&CV zgx2asMb6yQCEK;gP$>!fiX}U6Zoq8u(D5o<$zS;EO)1Czz$?SCElt33(xlm=eFoM$ zoog$+%$Wc0i)r}bxt|2ym+y*B574l^{nt|~@%^o$k)-jGhvOLW# zXMW5fWR>zW?Nw5h^Z8C4kv!{*W5` zQScMldRbb63`eZs&#mBwwYU`9H84*?h3S=jp|@#Zs{ z$uaCtHPFvE-i2G4E?Z8dP{GF5gY91vWBp;aoAkDOE$-{B6pV-uQqcV(Q|ZOne(djl z5dDy?2#<{)JAXiT629GdkypY&0IAG&;aJZh@a6ik+pe<>&icNeZD7mC=la8X9&7|W z>3IAg@Xi1cDjT^I8TWsN`adW*pV9@Is#Asp$vRBt>n;dYnujd^TdP$oLAW)6_#j7r z9*)yKC8*FEA<}Urb3*gSal$)*}I@*i<#Rfm*468BzT$E#z2nia@%*-O6Qb4;n(W34U0mh&9WF=2k zAk(X(-?ArFA?Vb`&ApK%48DIdl(UZpOOZ~WUz7$gT))vM>ZMpa4Y&@(n%gtAqKwE> z-+@lj8vnIY+j^k{sK09;-L&e$gdgNwo(wAdVB%{$nM6WC+G^#&zcsMV(%$(O69pD_ zXzrEVNC9a_ts-*O2v{pS=?yS3_Wu?UKB9Gqc^dLg47t^rcHo_n4lnlWwaEO%&)}PV z9dbpBpR7IJ4IWP(`TXUh!YxmOsMp+WARw2RExfM@oIi${Bro=Wsl(IT|Mm6Z2yLen zUp5_-7h{~3!Wq{eEo)X*AMoh~PM4&u%1k}rTiOvcdT!GX?d5Dh5643-J$2Yk17*d`S7At213i$N22|?UDaRQTEQ$MH{za$kTkdZR#sy z{c&G}t?WVGB+xm9T&kW|LENhI)X^hrd|qABw!*pyp0up4zK`s~haZIrE3YSk$}}%{ zn3;gSaxXRfYSwf%!G#Yrdtj&IQ^i+;1PJ%etLb8=Lf-v8)VE)?rW! z{><$!X-^55^HO(EaA6D+O)4H;=cGVV-Bd-OBV+&R!zQg7FQn<<>tj(j{(ua(1o7Gf z-b_s5BJf?Gt^)R-tXQ3h|l?L zyLz`52X85V4!K@+r2zSTp9~YDH|~czh|u z*k>Mx@o5Ywy(ayKZ5(_qzitKLwYbRZUWVES z&$nw%jlmWUx=fS*40^|!c+-mRVS;mSdiVW$d^G6$fqH%hg8mFo-xwHynT{`S4pnr* zZUsvI$G#GjzZ9P#Zr+AFCY>hCj#Z+TZxVa#-#HMWA0kz)XYBu1+a$_cvVR^Z+OLhm zpR_<;^RCSC&211WT<|SnsuqGG4?ZiBZ%4eW%{i$y12_BRWbTXgLJ94WWpY&$u!9veOyZfokp>~VQd)uI{b7JTg;^pY|EdAHoO;RAgJ9(GMSmo#L-CuwJ9jkz&& zJ{dX@dbk2K2J_e!dfPDd!UNxzZgUXpwz9FPr5l$Lf9<2tiqL96m+j^EVaRa)ofWlx z0CG0u^Hy0;gOvLR56>RP`XfBuc=6ZPHt3gcK>iv!9%u~SyQ7c4WTYJK57;z@x5cX{IV>jPLUwmxN`hXhr2(NPAc>Vfm0@|`<78X-K^aC_ak z8L(E1_I>fT1)@Dg)t7lcBhT?0HXLLxUZ7D#=nPKJuLzmp1(&r z7HJ!U*Yt;tLniMfeSGZvkf%zvkWZID`hbx9sXa zerFhl*@Scsv5;V_Sz$={L_OZEp0$6zy$z=|hGb%x*LcnN6W+Tn{b(w~s+b%T47mxz zX8eCCm}j=kbf&iy9K@>^6F*Vm3+GCu_GZTQ->u+k-v6LXyCQen45XO`&iR{-;$EBON{7@qIP=p--GZ|U&+W>! z-5WUoeZPkVw@T1Jle=qDU!R0U57o}=U1)_jA1rx3+P152&n0<~iewq9kIS-T zxRMrALOj!rCoaU?bi7}M$Hj$ZK20FzNs*#$j&#Bu2VnufM>DW{^Gu6tE@S=Ct`T{W zFNX+UuXfF4`Awo6Np`5JsT;(mtw(Zu3Sdu&$Asd)K@hdR`&r>K5!BZ;(^bAwK;UYe zJ9AYk@)*+$C8H_$keOp&PGJw)e2#1V{F4Gwv;Ce2sutx(WWYZqt z)GgcaD>M&IO?nD-f2~9IE#l&7?>jK{lZUy6+#IxKi``Z9@5bxaY$ePR)tJ?9?^Y{U zi;!2);Z+6@SY|q5jn$`PSVe=pEbB zZd2U=3H^#DlS@S0q9LQzAT5G-y%RyBB_#@%wjaUuh{mM+WW(2UVWGrecK-qB9pIs+4pZ+t6F z7{}kk6sK+Su3gZpw0VvfYEe7U{jue_d0?Hhk*ODrK>exS+~^ByKdWh#Cge21)Ay_b z+je!}3${aZRl1d6tfTx+>-_)ulvz4T46Oa$9?4C^8=67SdO2186=VOw^UOMTW%f|v zZIAQ?6Ac0g=WUT(A`QxYz4Z_1uoKQ6IVYt4L!k$ZchbEzb<*BFK+ByGu+(h4qkA$U?CrPd1 zMbMvi%qz;J6F(fM{g?cY0_PQbO^()*F+=Z*dQ4I+w5e(?(HhBMxl6|I=?e;+99Ifx zU><>(!02xnunh9{()oa$bWDo(`PS)v1j8 z56`&;Z4~zH1%)b_O8%M-Ui7qH*X1w^Uk~p(_}jG+6C_Mp6N8Bu-EKFK_;U($>^#e6 z%r(Otl88YM|-BtjBt^!t~0 zG;rDw%{JCukIS~f#}|U>sC)9EeAg>7C^o63}E#CrHt;E4;?6*whI%ocnKl&ZdiDL?{c3!!$J!w6o{7uE7tBKGlVA=Cj#n25=b3xuDja<1));cj8{p(f17#ob~Fug&tZHPjj{e{IkJB9FM)AT*?X41>g5bB zR9>9>d-o%XxL)jw6RO80!{y1_Far{J9>j&Ux{}gr@Iy#^kDZs z83Nm>Sva{hM@4Fyas0FCd*YDTHv@U~2et~ye};#7FAXo=9>=q@$4z=t%hvSGQ0L2$ zR=mn<{(Xo29B_ZE&E$yf!B{3kCv(jroZq$Mz*5i%?0KP=^eJrslmh=V%NCl3(*Z2J zf^3ZOPpmI*zrdMx@aZsG^bDZmf8@5N ztvgcF*+kIm6ZTFCd4NJ)9Jj9UO(Eygu?@Zx&G7kFTG#yq63lNq;cEOfg5mmKL_Rkw z+@S)_XocBx^CW^FyccjZ?p3Y@U#{Br zgtwWv_wfB+0W%b2Qa04fy;1;r&STnF=oF}pe@=OC{hs0ZyCPj682iucmDA0=eSQj#?iAm0V|oCpL*EBA+4bW^em`qn?n*2>Pjy)mDnLgU z(~0labReFpHj1kuf$_#Y;ZI-dlmQKUi%SfJ{kF3W^=egC6+_o~oKz!i0(hTw7l&jr6NH1HF%zi@Dp zh_duS)+c{jA>~@lzonFB*h)O!AoY+4{c?e`n(3NL_2o*LQSi9`d&^G# zZk+z>mX?&eraz;&_{`ri&ObI3d*xmenTMgR3%<^0dZ6fTzqLplbJC+6j)qiRb5;)TaqBbVx+*31PI${pCau9%l)dm;Awu0GXT8AGj`YDuOKYLK|)AjgKMlQ4To#XG>CG5+33 z7+GcVC&A#8iBAvAXc%vyP`1&mA1%1XgpIBi;DMXrhyCu+K~nR!j#k+y@THuaxL-E} zC&T$%Z<@A)($S9VN^AP_8u_MvDNf)7`}dcI+%s@(w4jiaz_|YT-G{w54=8lOBjN`( z(xDpc6xhQ#YdH`1ehgeoPLD;MzY}b#y7Q1SD)DOdeKVYWsls_GpdFht3Oiq1N9cKP z969l>7Uk{2|241akGQ_83#x~jAo+c~nY6iU~lki5b_Co4O#`R}A*4O+9`b`JwJ9BeEranAP(Hl?m8^YFeQmX{& z8A*IDLO3%x2A?AJYN$YIzHy-HlkD}ldz4343Eh;cY z2tV!0He$GbTtR2tz}oje{xVB6aiR;kl7w!gs1vb#Q(SI+WDp=pz;2wqtDhvbiS5n6jz=DWMR7E zbx%6-M@>{mAD_TLSF7m&sUf%+{lIiy>VKHO{Ow3+`#UC8qqms~E2q}KI5_u-;r{2V51xqd?0|hAN(9aJ5uvqie4ZzH5(qaWQfI z!%Ls(7?GO)Fwv0=T+0f?M`n#ERkTs2SgaaW|9KI(Zxb5500#Ng(pZ$yBVb2+h?BhkYaKLC?47+osTQH1$yyN<1+M zoITTaewRle_xkl9l3hAJ`COtf64wt3>_M^zi@VV(TIYh7*7N=gH`#LQ`K<>@CnMcl4qElQ%srvn1 zpy|q<(>p@~tJBB$sbZ7x_g|zyVd9uqeC-5*}6n(I5`4uZ6eF83c7)7TK4sHZUyGQr!>b$wBhN;LSCy%jVQgR zp{J^M4yv@2?QCNi>(30ztE6nrHQesC&d(@qfQ!W^z9@cghcef60bkF0kh$<<>RWd+ zDys+2XBN-G35&gF-SyfbNzCi`LB~eeZ!~l6)M5>uA1~q;;qStF(gsbhs#%yh`Bf9DhiA@8qfQZ-=;vRX{#E*)l!e=!;!5zD3> zAguoV(_KqCHnSxpf8Rg`S+09GecEdv(&>lkA59W`km&u;^NwJQ(*s@u`J98h*c~*IyYj+f@z1=`Oc<)*j2^P4~5K^HQ$UHbGs?j$yCkQy$2Pr=v#t{3MI#6Z|LKjChq!OhRyWo`wG z=Wm`Q%$sKo(V?5dcZrZO44$RKubeXb(P~jiyyOs~3e92I{bV`niW{ehFw-GkFqvp^ znGDBIKWR+s$Va|w6^HH8i6HxDf8q^;VZ4?uSYWF}g9^PraBwT*_&0K~=jjcTHC<($ zb1CuCI9e0i2D7{Kp-W=hx#9jQ+!t}$eE#+bB-_XENdBh6A7i_f`+h{cQd1P_5Z(s0 zE6e3$+nPXzGk%_^Mg-BEQ{Oi%Oo6J>zqj4ejP*yjeyy?!eG=Fut;hnQWO#Yvy>y3a zCC2Hx?G@Wy3s%3r8w~hR@Yz*Xy&ztL6?=}>Oy$t} zm{pUheH?i18wRfTB0&GPjtYBY3Os(ac|K4z2S?kw(iVg%=(#=YbY*lWn!Y-+IA%cu zS({BN+x!^!e+JdxnCw%Uhxo&pxLvLX^dg>``)ekG_p{%ouiNWU-FV!Ahun$UN1E0b zxXl4=X0`p+p-$XeQYaSlv>J``w3>GYl;KXPmix9%Yy6?F;_gqgdDuJpr|8}p#`*V8 zH{S<2g;3yp)Y&Xk*D){`>*pCvoB$_#R=)ov8$pWg)`vf(6PQwT?vP{y9TK)I-~E=~ ziC>bvIdY&FKPnt7j9EX9MgFF2AIyqyPo3NGj+=D2sW)cwag?$C*d})?+G=DC&u$o2 zEeTBGnWP;H+A94x?{UOqAS54IBVt`oZdlW^P9N2Ica1=w22E_1J_NA>fn|ZQ?ZD~& zW#{wYwf_TkpM_x51iI}!7BkH?1H9S4qJH=>?tf6+PGnB{+X=qqpJszqs&V&`;azWB z=b;__Ol58+ATL?WW$U?lU<>?u;FWU=e0RI$HoT=BuP;Pg{i9O>4{GLa=~maFqv0D7 zi@|v~S-1IFx$dL&pV*icBSydwc zBQxD+?j)Rg<$rO*>=-Ob{98@7qrlRp(I@|sT49^S){QM%L-11~RBT87I675}Tn`(f zfuK|6wVGK>Fkbx38*n}A>Q=WGTXb3t_bo)8ly6s{ z;h~<1JJg-^@aWeKmCfhLP>~e8*c3;F+jAp-x=e>4+&Jpr>*I{$uk87UufFTdLY8u} zGeJHJnO;_@Z@E;1`(|Y~9n-DFlV(3#yMt@sr2qN(QGY6=MW|_KJQ#%len5f0qw%hP zfA=?o=sH%n0D~?_*531*#!Ns*#bqIV(>4AqlNv!{V;p}1ecqn3d)^CY8(EYKJ=@@_ zS~7R=;w%)O%u1V4XvCC@H}u#2CZf$8d*u7sHC|!&T)nt62uXW&I!k=AVMKD z>dQylu}Tuq`Y$1j_xT{~`B=1ByN0p;@Ow--_KS52WO>rXn(uZ&Hoe$^{oDxd{oBs> zZzLO7Zr#0m`OyfDc14SKJ*C391?8l;E)g#(iC;hVq77V|{s#5Eu7b-Ood^aVBrr{64Y0l8ywm&}_)hWl@S^5M&-t*szZb}rTL6#+E%UVO6@O9wQqKJZed9+w8+hV+-M z@uE7q54Ry1`bwYp{q<_ZX-$dh9ehfra*8JP`^^7OhWRDaUb-CsC>k^{^+U%OTQl3~fs`$W3$5;eeq! z`+lQgu;4vsqW>fnH_k0D_8#wt+Ml$ID}*j=qF%oA-EI~tW0Q2k!6%WlvC zf7Y#PPFPpMc}Jb;$Hns?q)sr;zF7su-yF;%Xj7P_zk76_=Ne9)ew{TNTnXXrU)ROa z(?BxDsAJZcfIqAT67SDVp;$#<&93Y=2pT#aq_CTD{_CWO^pbtTj&-c(b_%Uu`{`TH-wg5=YG^;+~KH|2cbgtd&^NP<@0mpbw7r zZ@E3R_I%fh!~T_(Ou}osFO&WWjP=LSmx(!N-N#|}&ViDa=QFtfnbgN`Q3Yt^rFdS! ztq#-PDFUy^4A@5r78e*#~iG_pvQj^Zvs!zm{{Y=1{gh;a`5Gi2DD$jmK|i&hWw5@etVytgR_f6J+uW}VD=S9fd1R2<&6Yvnu@*ZT@_q^yYI11?*BIm9V^Mkcof@5> zcAx2}j|?5d-<@VJK12p%o;%EsY-&NtRHroEkOcjCN?up1*Kl@q<~nHy5f-9CPm`-( zAt?7S4!iKOs6 z_taM;NHor->$Nn1#@J_%8}4mzS~625n{N)7dfu`ZOMC`PahgW-_k1j`)5zF$ii}E! zkA2PBPy4GjMU9F9_6v*NKu&76+z^U+TWfO-YbpF_SJNIojNZhEN{v<)eb)!Sc z+RH>Z9I@->cUH#te?#$K0;E3Dpzn0dW)so?C}zHn+WVUXtIcya%GWoduA182{cDP1 z>ive`|6b0n>F>!?JG$G@^6-nocSBF{+|(A`Z}t=V~ zUB>>GCwAvtK6-@?+dM7~Ic1E2(51FA+HyZW3;WD5CtHEf-CxWGdsbtIbl!p0kV!BS z=1Y$JLk6bzBdMeDd6-CJs#uO7K@H1+u$>CSXj{1&ZJkdA4<)G=UjrE5|BoL!Wi2B# z1LQ?x_BU51@IZv$VSbG=@bR}vy93qOs43JOXg3Cr-17A22~=R=ObN>rBx2Ldj;Pz} z?Z95wWI{G=fC_|&859o|S*!A1(4v&yUqeVB)ouoIm1L^3|N%Z|Rl(T<1qe7102 zJO9iZHayv8!8rf4o%z0nxc)p8UH>z*z~2M5o}A!qgAVDpCmXPLqX-Y1a~Dom z?y1}xJqMp1AT5@=VT#TZTbI!j#Kqx*haV zV-EH@)?vZLn9w^e6L|Og-P>0;&p<*(HUGA)jQyX6ZOk)lD?6dcOnz7A;VMi93yYo? z^FVL9ClTP5j7zNa7lm5$U~aDxICZ%dnwdvEx}LV-g!JP>Uw4&5N@viAy!8$E`k+tj zzcu}_heP&mTg2LX7ikUYA~Np3&i?H?>`tdaEx*mHLrWBp*qnJvyR;An8zi!F58xW_ zd+cMk#y?jcEGsUUjKN7$^TnXkR0!DRr?lR>4Z^xwER2>1q3(fm;yxMy&(=prMHz#BaakbGQ=N= zwyJ_doJSzM*5N_mGK!C7++Z_V$v_S5Z zVS2YsC!7#eP~YE4#MF}i1YF4fkFo3Ur~3c?WRxf>qEe|;GE0&aC(14~q#;Tr6|x#e zM93&1L}X-d%3jBI?Y;NC#vNRVqN0AjzklF<{($%6^?1F{InVQap4aP~*CZs@Dv~It z80Vkg7uUH*dUt}`1x|~QXZ7%fEOPei$r^&Q zReT>48jU)Z4XSIT6OUXZ!FoBho8a;G5h%0h z`4E*(0p)N1^kF%fV%#ax6^BO%ps{ z3*N2bmLG2qVgdDBgB+O*SJjx4WuOlZW-qXc*(TxpCpahD*afM!Zc$}FTaik8T3DAc z4R<8oUE0CSxc;(|vrZwQyBUm|e0Qdcl*8HH`_>{QbO^1BvJdgA0M<=n1ydg=$eovR zMo)zZx_YadJ5vh3O$iAr=1CAMCfdlmV+_MQj7z6HC^$O*j$5d|8CdLCIhLgu$GX;B6- z`Hq?2MSn!Ih!n2Pf!$DcXuVEn`6wjYw1y_1B}1IrtFbxcR%b(7;T|_r{&%ez43JE^SQfghprWZCBLGF?-zS z{<^LvEH9$Z8woHt(xLszx)v!f3=PK*(?ML}q~K5eDj=RLXgImE7Ge!=+>MK+}y#BQ^g%&%e6|=6A!0l-B#T(zN;8vo}oUJht*e`tcyw5xi zOwV=YQyWI1-f<*KX*2+@H}BjaSwY6I_xCJBH#dOp5y#P*tt2>|?-4F=?iFMG-*J(H zOPCDukMzx~CK}Pb?qA`Cr$pdnkJ&w{MgYMqn_VBITENj_>UVe2DozX69Sl&jKyB^~ ziMn(7n8UZkclZerGj*+8vAYH)*4O906C;B_w42Z^VaD?ZRgFhScaBekry})*)s9?n zt>1TNmp~s%!oQ!te;1)=cld*=$J*he)`aW6AQH&_<+KZeNnrh>e#glu51*gu9h}eU zfH&b)_3HzsaOvERyxLt}d|2exNJaBAc3VIe)0?#On!sNCvz4J;vxMyMaX$OT8H2W#1{CR5) z>VMo|xc%@HY?{d0yAUuAul&|Ai@f=YsXnu*=}$?}RJEhKV_QGA<~L3sIynKt$p=df z`5EgEh5TK+r>Cg!!Rk+#!@*H>lmwN8g;lQomI@ee_fJr>?j!LEpIIU4KolCAo zd&x^rZ!fO${n6r09OW}`K4)vq?yLqZ&D99uCsm-EJHO^9W*$zlUhC4_uX}Kp|!**hX|1lk9bt`27gr@}28^`|ANr-`Xcl zHl{*iA-(H2a|gP8miN}GE5WrC-z#c@!+5Knx^8=U2*@RU-LqYX3dgSV^4|AgjK62K zy}pM(8U?e;O{$FvWE`>H_&0m83%9?1Bldy(6_+j@yrd^fh1~bJ9cz~EWFve?mn zVE%KlMP(J2Ohh*Ov+N*XYp>pvh4u(e@?Q@B&PjudRC{=9%J}`i{mH>qs;^r?*|b@7 zM7|7z!so40KGC5tT2agJbSmy!B>Z((rGw)8hV+UfO>kyn*knCh6ILB~e%Rn&5oG_| zCUN~30X@$DyB^d>2i?u0oclU!;N|lIod*Ff4A-xqB|7Y|pMoi&LE|;P8wJd`vU)-BQILj= zJ`r;%v!rMJ6R_Bu{rWtOas3CyU3zRnBq74>YCpJObUTD&HthPw>IE& z1bJizqR4p${|qx=H*PQu4XeP#nY)vEUX^&ue?jB)-wfdA?M^&DFag`UzrIjpBZ2M6 zautDjmERXkK0C6p1x{HRnB8_J;qYNRnQ1)QFw?Sb1;E1#~cVO)PXKXpGbfkuIi#;5h29`(SUjMoi0^*xy0 zn=5s@A{lb@hn#c0Mlkc^x(CvG#^Lj|?|sFGiCCx9HlR}045R6_r`#1n;jrqsQ{47( zu4#ZjALuo{ET4 zoKZ7OdWOV#5zE0@l;uTa86BQ>_lbOpuLR3VtM+5(DOgw-p>v*<1o0-nmek#fz;CR$ zBTOhB7DTTv8Fq}V>drq~efLu^UO3K_YoP_~M~1(Z9Ag~+h1_haOE;%MeVc;Farg|k ze4M2Aau1;4SBXbK;x+i@(5@;9Mrl<4bUOxy|IqxgCy4u{-Xh$*b#KPhwFW#cb;eJpG@+#y>zxO$tMGvBjW3C3=&%rbK1ofB zG5!pwW;O)9qXEymZ28ZL9vIQ=vFyBm6t{Dq%6hym4@5cdoV%o4hffpb9CKu5K%hPA z=Y`B}Y~1U)Md)`9?qPXNmlzm=3f&VAKJ@ni%cu@(h!6$L+F5nYiy5!4yZEuQ;aVG* zjL=RDv`%4J`%dTd7bN)N8!f{9yc&!=+-N}-M34+ToOMEBH9vixc2aj61;a6+B>t3O zlofJku3pXC`=&Q_5ASIJ9*;k&a`Gg2`9fW^(Ab*s{fB+M#qgU9cW;!}-D+ITqdihG z!MBKD@V1z?y_5ikM(zj8@3%thyNIXnWaz+@s3KVApMsLl8@_EL6rp0t@YSNMG4z{O zyrpDY55ceD z8Xnzpli#%+%9p=f{n1E-uPl2nDS1vo4O{->PaQf|1THUL>%{WV z2jTBl^8(?O@u3vCm*1<|leH@~jZW34i_Tk3l6MFk=$0106&#UQJ#`9Nn*1t%#`$~n= zze*@fVWX(N?~mIXrYbn(9~>UDQh~XhY@8M@qmcGUV`w;g0yYvHJcNx#(eVAnmiNzE z;L+`W+Rdk`!20A@=_apHkX}|J-sz`8d);z}K@j8ocmIBC!@dGCv|o17C!`Xgtn%A+ zS7^jPLmRIq(kp`CRL6k5P{h*U2pu>C?>uJrO5IKnvv})?#xq zSlnz|`mD;h|2I#;VehRMbSRJ_B=^(XL8!Sx?oxp-atq(=By$t+Rd4d_&nN9zdWKI$ zj5q_LM-D#-@~%Vgvb8Og4VCzuQ!4RKRy=0TXAD2uPzUDU7x$i#nT4V8HH*5ljL)BE zR{}q`I+B62Pj21Fi(&Y(zod}%rx$!u9$phi0?1Er?r;9shjKG-E4_Bpz^i6V-H5vr zw-#(9*$g4BO}Vz_=z(EevK~=NlgfrkDc2-daT=I3{#=siWUN2@>egr}d5pm0GqxNd zHz}y|=3>4^Zx=3aK0~@E{1vyl^5sgFQ(>*F*tK1Ix}k95HAzyh9|$Kc-Qq1EJ*O+U6!u17&&qR4oy6hVeHZwCs0eNkgk!3Eb#0S~ z;CePfZ~EUD9JYGTLuoEVR?|e$#Ns-*e4fi+@EsX58&B0R#SE0wDNih{t2Wzlmdxz{sy)h7&ue`sZmV)Z# zwsmH*1h~1~$v`@c2pa;~($!8)fkkalwgvZfS5q$;sY#H{AUn;;N!d+_MXzX>RG+&nmUYy$Sa-#L@&-3a8C)OWY; zH^JCjf?Kx01g@}GX(g_mgt?LO4=&b>`PYb~&&fF7PS~YaB9il~3i2AJ!sUu)U_;?& zgTTRB6gF@24}L?$tPKi+Ov4n2qLr(bo=Am&hZ`1kT~k0hzSaTer!dLzx*mV~82Y|) ztfqbFhAQ)hy)OUZ{UP}Y`p6YMD%_HFZL>YF%I_lTxA7hB#?}eh%Ml6jAU-Q{u0CrN zW1fFyYhUFhW&tL%|3ZjZ*wzwVt=$4q(ULkxJi}1dcuP2?cO2Gr-rFClF$II)0Y@8P{1LW4!!hQ*BA)mX>$M8J57j0fZrlqOh6z@;XG zN5=>lZ?fZ!#@8a~HPg@CDMv!HIt6A@-Z(z=T&J@~a}cKZt_SCxW&Hk}g{t^wF@73Y z^J|V1Ka9Zj0&~fxplVEI)=m5SqZaW|WsIVbi!twJkqRS%7@DtsGPHlz243UBzY zjd@G-!(z>?bzgP5;jqA*a51q0yP^i=uCO=b$#QDgg-0D|?BpfN>pcUTD?fWQDKLJ2 z^0+D6Oz>+u{415YvZkX9mS29%<2u#`J7ZYWG7RdVy}$7hpG{_I` z8pk6aaF=d8XkQw|^OjM(9P>G#$2aDt=1;(`&B-D*qBG#b8ez<()`NC~=dX=<=Af@Z zy-d8;Fs!Q>>}pf#ho?_IiTTfxA+x$zH*tjV`aBH|r&?>;AaMM}A-U8k47NX+lNUw; zk%hM{QRCGR-t<)N@pB@Kl-}TNG9L$6-lwFixvD>+@3B~5D7ufwlP?C4aoYW)L!@K_ zG=Bfd#iUOHrt3w$_rrnV`T?_whEj~*6n#Unw1$A9n>L0E6r`M;I2Bj^YH_J zBu^WBTE9_ z61y)m?*H~pxsl-?HVvi{qZ8(L5Y$?&_Puo>csreo)p9iY)_nMChe7$?m^tTd#`UL^{6hx> zQzyY*z-#T5)UH*(J(~ZvnFLEa#{U`n*I{(@I+qFgE|dwcqLd8Hz+tIlfueO~$aURa zfhGAfruk7$M^BSbu5g#KXInA)g^5cOkPHtk2qMm38S4+J`{e`5+ovG2ZClWmI3ny2 zzq|QPVGj-(YpTme6ycK3G0|7*jri6}Q6$iH5_nWx>1RGn0LM3*r@Sdy=%;;!P3`+Q zBw1))KT7Gtlu!3av!>$^oHk#-qQ+Q%C~Kw*lRT;5AfxiHd1(|+N#Au*yI2E5$v2vM z)hki{{iTAy<73depp|7EGXY;?F7P*Q8O4R(c=7hR7Kr{?&-0k65_DK59(P|K1xY6j zbIGkVkp0K_ry2=; zuZUJ#z9)iFjzElt-58!|suqczu0W0TUAc{$YjFG1;je6ZL@>;5UUxN^0uh(aMm`u} ztUqE$iyeykhrpmBRNt|jhP#+6?|f~qhRJJJ(xmrSf$E7p;rDaK!8F{@^;*{uc(i9tNHkec`{tzTSY|R zM4@v+oUR>VxVh9vLbkUS4tZ#M&pw=m6S0js+t)Gfzuc-(;>h7hfuA}N8^gCX0m(PvTz`kk6KfV7je`vnIsxiuT7}!Dk*zq|EI^Gnts44A2!arr^t?pmY z-{FA*{m806^}Ra1ZLkw^>GZfJ%YG=dh*@6}*8v*y#|gaIsKU1U4&}KCX95mNAb3mU_}*m0CX=-h;Um@ z!R2|Kg7h;j@cq>H=(9(A;aSqg&A-~lk-z4BeLDLDJn7rH)7hJ`|JUSi6=EGG1G^;m zU4LpF9=xQnyPSoDWI^udIyJ?p{nyY^wvq?|7GVViW<+?Zk~1?TPXtdUg7JiUAx;mi zoZ@9^0&lkpNB0X9ykTv2(_|+R+<2a}K9^uz|6ZY=DS7^p0>#auiBW(0@o~Dq9a)(H zw2V5d#vL687QY21C9YQE`j7_P6U@{UtX5Q zPJu`0=HsC^xK|k2ZylgTIJSpC#}yX@-b> zY5tQA6)oUdIOrM_l7(_VN8KOTOhDk9XSWZ%p8`3ngWg`VAq@9_S?06lAhiToduP`T z1`fix(;DB1*QbGZa!#iIP&G=tJh1EiS_&>kbkL+`i6AiH`|{Oq0y>I6b?4?P1i|g} zqWyj(R1-a<5N0!hn?f{~!wLQ1@kAi9c^~8XlbN5S2<}g5;67JlZjdkxxfBOy^3_^= z8IoXIBS(PZ597af*!Q8+`QSYb+h|aAx>afDc{l89KH&CBJ{H5v6pR04c0$M3O2sPm zCX6-}e#3No29o!u&d=Q4S0;vHYg#N5Wp;Qym}eNEkZv?1+2%6mki?(ukr!ba;OfcL9M6wuAbU_sIa}v{?vX1ZzXYu=ULR^SoC+za@G#yKXv#6oBlM| zC`glMwYyQ|S+z&gs}h{EE9dW@?*jo4Wqw;f2rrZMu6949KoB))B!-u<{y3Nj@c%$Ac_f@@z>jfp&mO{b9 zoX-6zZ4j}+o^Q>II#7%mZW-b&N1f%k-Ho4Sp*kaUtIxi8cp0M{c%ilmMD3IAzUFPi z4633jmHrjIpBP>EkwOR60Nv<}g8#t(pKeNLxlaRwN3G>w%VO}!q8Cl{`6${yJS?fQ zEgR&|n;Atuu0=QInx8j!%s}sv_h#e$JxJxb9JbVvjTQF}x9%Gs25qj6g3Y%5khf1& z&LEo%@hcRW13&)5{J+D&30~Fh(8(LD9(`pBr;R%6o>h^6!~D9_7VR3)_s|?1wOr*@ zFM5AewvNNkE@^A0&m$nEwO+2XutHOZ%@O6 zSnp>~o>Ty9wLV81#~>PAco#9JHYj{$-RtwV=$Joo_p zl#@x&sA)UL<57oBM_;yFk?F>UVngbk-WmAm=oa&{<|{fnD=4?CC!p8XFCzV7B+UK8 zZqK7!g=SZ3+8=XKAX2sO2QiHC{GHxtrO)IS(7WadeNo3678&sO8lx=?{qE6ce5U4s1se`?$iyfRBv zN*<)4I*Xw95#d$+;b!&M<6t$Qy>nt={RH$!Y8#oa3_-}*(`C_9V-OOzV4u)fgqF$= z+XuOch$4N9UTqav#cN$IF--w6`K`l(eT?)!Yv4^R{=jeUgxO zm#EI;2m;o98}ega-+}M?#!BS*=@7V6OyC8n3e!$7I~0mlqTf#A1Cf%txSQ$HS^nN? zC@-fAi@utLUkCG}E=Mr#zf3n(=YL*G1>(SU?z2&Y@QcH8;bv?H{O~V{T=phFXy=7j z%TZl;XYxj=Wy5OzwLIK?W40ULl_n)b7?fk`z=hLK+}H4X9y zgboo^7~@}P%3pb(*kQQ4uk$&uQ8C!ackhf?7j6||J9PVF7RKln(z-X$z-;FQ5C8s7 zcxrS(vtiQ!q>-;)buMoK8zbvC`SQ(pL9mXEb9flXOV&!{tWY7#{AjJ=dB*eKU4$gQ z*1NUAeWSf;FPriao;kFYeWb$|@ekpXr@!J3nfY^i`7;pM;Pzq7P#c6&Z1>%N-i(b! zdNm8J`4IK_O`ylA78DTv?rr;e^}DOTuU9x$gX{I6shDk{4C8O^sQgg5H3gjITxi>F z65;P({s{B*TBs6u((?9mKBoUL;z^Gf!N9rNf*+cLAi)xFoIW!JFF2K=rQBO!lgu-{ zS+Q=AjH&*s`*Q;C?~ip{ygd$f%#X^G^BDVoW2Z;`p-?g?+iL#$c&!?rPsprX$|m8- zui{+$4;JC+@SJ~uM99DJP8C*lNBn-7fp3n}4 zlp~a^d2?KE6#ks;_V~V+hW_k(6aDq;z==)V2h@mQceLW@WX=>2_FcY259tQ`8L2xw zN{sz)^waNv`fsaz!R2tvNvlREv(OVvu*yf1%l!Tt8Ra;l_pB`b`WIB>ZMbgiJ`Nu^ zTJk1OlcCDE#DYp{*@C|2LuXV^XS&s*vpt)DNIem+Ys4qr&Y-}lX&>=tnFSDk{3drZ zIUaU!MYL~8o5EjTYr3fMMAT$wGIf5|1)+ED^{xqItUt0|>U5c0r9xw~74I{i5r}EY zl{PnSN4-}j5eoKUfQ4&+_4|w=|G2XW*Q$SNhVI#O(wcs$nFH`E?PycmGFexHcZ^l4!EylpW$ zxC(P>6Yo6`r(i}Lohjrhw}+B4N)wy?6HRA&ku_dA?mFPngR+X0po zy)R%!|I2djO(>|2&f7dbKaQ!Q^ST+8lel1FcO-pF2drZXAXQ~CuK)E;{1iL7js}K{ zC9FSk%3${Q1hLU=6xU{Ra?5trqDtEP5{z1 zs~-QFuXGRSR$?F*(>HD+74k*YV)qsH!9LA+i|6NiV8?;p-wwi+IQ8MJxJXbVYJEOz zB~{doS(4cg->#d1fXf-X9Dwos$BxnCGJLP-&|6dUiRVla%y@18{e-O@9!dl@zVxkw z5DCsDC!bnL@co^=erp5{T}Ye8>N(2KFfi_)0${0{4E~Jv>MQViGu5#^${xzGP_svnvXpcmJS)eL~{Z zm!}Ib*)Fn&ch@j@UXkahGa|s@-3ixX#u~xr+Lkt!Q*_`;$%y^A*odDRm}YGv%dm5J zzu*s<0aUtwX4}Th4k#$T@uOUr1{)>(l8mbv-+u~yoBQ{v%ruDc_c{o_uY!^ugALht z2T^Bzd6vi0SLBFq`MBuV0q!5?bbhvs!oIIAA5K1?fG2;=W)_(*IA@mOMdI&)jYca| z8}q67wr@?8r%OMWcK#_an`7+%vxTN1eYdATEzi5&D|NON5urGjKgW_~j)3XB0jkMHX*PMye%W#9x0RMi}rc@zoH}bIQoW>?{Sw zs|BPQ&NHrmf3e(4%gmpE?@?>W!2&v+6i*M9eW5Y+xEA0Rb&twW*;c&wP`jvA zV*;qJHLuv(PD1S_rEA+8(onK!Nrq|NBrNIe9jlA##iHXf2F8gbSn#T-o8OtnaR1pk zL1BW!6!?9a<#xO07@F!WI1&sR{ukd=En+2pQvJPH`HTo3Gky{SEheD#&YcTe28K{2 z(0H4EY74{#3XAkq6hptiVrBWdQ6Qca40vusgYF4_#XqHt@1G98W16Smr+_BEP`~lX zF(^H||FG2WHaz3~NI&sj8B~w_GuHY_ME9l(9;7#8z#XiYdrOdnZ-1S174)b;hdXQ2 z9UoO=FZZSA66WJ@E!mRCfq9irc|PWpw`0t|PA=!0xVaBOZ;J0Tb1Ds6L|OMF=Tw0w zck;)VQ`PXwxrL1{Y!bT5YFW-59ER2#7o{vZM&X{9*SjCf#c0%Se*N~&F=V}BZF#|} z3}2So7b>PvK_<+=@#IIw{Xee?O?J)7j+K6^12k-yY ze>&wr2Uh25@@z&n?$#UFD+ndvRh@JPbX-p+YRfrPh$4q*rpRi z61e&F&VD<``2M;3+Ulsn+hoYJQD=MBT#i;8R6Hd!jwy-DI&a1c&}9SrzrTe<`0ac# zXoi;vtFlt)+eacixqX$(?`AIY$!oUwCA9%r~ z!ztaBl9{?X=+&UKu{xAn&ctUy5FBA_lc5NN@$~n~lU*`PGvDp8Dh_C>v0u zh_<)D&gnDh{Y+#e&DuJM_>#cpoR&!TbH@5(^n2XCx*J{auydlxDz6ac#kNR=EzN*% z{I!yR3$;i%{XXo{01<g z;@bT)^W;CBuspH$P3s@V`ok@C{~H$`DrhO0P&d9Cg#*sh3xkhaar#VBSZ!wjs7GJw zat<29uPN`3+Dwi?;7pZ|UoQ!#wB|UA=Ud>m(6@k(={2}~g>pDHbsYHjt^bvmF$IlV zwz8oMVr?8bW|80&X^^+`91H5B>mYhiRxJ3y;XH@{v`4 zH-CR13Y(p%1#fAEd>QB-aNt}M?DeryET zD%24jcbpE=l`46B$u;2G@o-9a?nfxs_=xx&sDD6gXkGJ2HHXG5L zQ&i(q7e^pgB5;78fQwu3?`?vqQL4*mBr#`XX6X0a|b|0a82n5M$|FoWc##Gh~(w)3y3~Lr` zIZ;s$10OQ3UHL--(_G2l1Imog|HHz*T@(_Xf&Kz9zB0`WjBI${KNjBytNxbESz8OK zZSDJyBoN^INUVZT%M7q2ei>uc?7+vqZX}`m<@j2E>PYEOH`c?2ZB9kq;C=S-p7ZZ$ z!29fsgd6EUoIi+N^p9Jj!6y6uBi3rQpv4cszXlJpeSkua z$F8(z8TiUK$lNG>6`z%RUgwaSk==Ui-1`?4c#&gVZL7%m{(nlwl_-z@6I0l&3ZwabczJEi3VFs0vOL9%P4u#U;Kmu8?Or(^Yx5j==WQqLUPSu zzajI|8~G~KAPFR;93Vkc3}>11g$c0VW%2N+YGbA#b-;8U-G3POw=!je_DzSlpSz9cVYr)3ldb0vTb< zW2cOW$f|TZ!tuu_+Qj942LjP?tg2`ql%}~1#4+m6_TE)@en{i{(`7*}+&#V7= zOU`pTG>I**lzwf8RovB8Q_IEi3TCkRN5D*`(7kl!4s;;&+wD3-hxUlVCxkh(~r}WJfatj3BJP<8w(2BWz4e><(VHEjy zHpgg!3j75wyLN11+<$oc`Q5uN%AHWgH@JDIFu#i#5#r50?(mimKuI1nKg= z>+uZZuVve9!HcJ8V3c+>qHAgx$lqh>U%cyJ>k}`V$!}lr^M-b3mqUYiJbg=v*4`l~ zsTe7=C?kWVM#ht?LoM*VcaPvX?sm}Hudn%eYzq68f4#0!Ai*)Y(oWlc#`@!oQTX>? z{AAEM>g4)Ipb(=9mNH9g$MFXHs~uuO`DjU!*RV+?f;zi(T*lNGwA{S5o2!cmuTA6f z2Rgr^>yJsMon{@d^g`iA?s+PPrkj4SsTl?l9+u@k=R}74H$0$nzh9RMk54o|xpHL) zjaa7R{hYfnOn=E{y2%+V-zKnsrf1`@WUPSsg%OyyYE|W~rlHDY#thr7dUzpW?ZEkO z3_6HkEIC&7$E2gqE;+*<_`_nmg_6mb|CuC+&QXC5;mr3EraU@9fHvH6YrQi{))utu zek#S9nIn!%*)=H3cklE4J7drqWy{Ymw#tX9OxR(4Gn@xT`Mi#^at9`#r8W<38s&)VKchdd4ES}JG6MS6h0 z9)2;gG~u4iVkXae0&L7ok=^yL9nGrrmVD)BfUvR6LL$5ksP}iuh1?3mh3@;F^_d+| zzQ1H^%<)<@9D5v;M4SP3>Nn%z|8V|x@mHA4X|8qcoL9M<-BA;ku*VVjc<<5W#^qWn3^=D=lGX2nO*TQQ z;gY?e`(pS{{l-d+)YVl#+ggv^ua6kl{p!Oihnef}WE%3DLj0p>35@&y_}3e4TFt*) zR?#OO_hf@$*0O^~cRO5N(5xA=tAnXxSr4tFX=wDX-`T%z7UqK3?M3Lh=-q00p!H@s zm@br7xg6|3y=I}0%I~sZ<#tWAgc%(?*M&NcZ(z*-Yv)5_QIH1H4{Y!FU&uyXAJZ#$ zn?~`{SjcD2o9R%)W$!Zas0y!^4&I*lF%4Sm++zdsedx#c61*0^pjeYzLfWxW@D=Cq zIaAyZwhKW6)_cjY<+y=+;%>(4yOX<9_qcU|)k>gT_q|C>slDd$P-GlbC)xwT)N6s@ zRBHT8n+TnujmHlRPJs9K>3>@|hTz@79dFx~VsNK%`t|hLDOA1qrX3^eVQ<-|!`Y(a z;3VQEF=ph?(Ed9%b{!v^n}MBAqiEzSpD}XhR@N7ryJ0TO;(+p*TJX;ELMJ^4z)A*g(y%_U< zU$^;FQ%y8zbT}w0y}u5|cdhJO<{rWpBA=a2ek!&r;~U)G33vZ~6i>J_0x~b&ThB97 zVe1k9Z(?j|7_t1+D#)%E){h(yF*!uTkVK}+Q{=4!jU2U^5~#z_S@B#egI+Y5J!)j-I0IZ`z6V$`Ghw~*^L63(vM`sh zL5R3Kia`@wnYX93q0!aPRUTm!I32U-qA|l*fA}%`hCe(%4t>5`=8U#Xf~@lKvPX*D zXtwyy_N-bSPP5CTZQ*Li2~t#CCfhj3GTRhboSA~cylGuZX97BIKB=M2It8EBGoKSu z=)oV}=TG*{5n-pBsPJ$*WBzl__g~F65ei(?kt(0(A|mhdzg-5qTESM%H@Dla3e7*f z%Kjcf0$-yuVc7~3VD+B64Q>tKe$`I#VBQw!)7iUlcn2$hq)1MOp)igMJ zVY4S3VXQyorgEAlhAEJ?Oyzc+7=hb<_l>nzIxtFN(a7{m5zwrHrFIAt(dA)6vo8z+8Iq{?RIA_a2vYhDo^hji*`c(InIbWab^`V9dXszPbPD zBo0A+<__J5L>dOz^T+MsuYwPc4R_H^YGF;});bv_G6X2xoeQB1gR7C5cnoa-^x}-z z1YaWt$u}jkN)4e%!u7?_$2s`?+|IeQ3)5id)ykE4m~s8BKVrea-<%GrtUK=BPHu-T z{JC}o2g}6H>S$c)768|OeeW{Si z0=~$DZ&|#{VB_aKht1<>VU1ihe^-IqyQJ@YR&U4N)1QNBojvf& z_scAJf$pQ$O-^(u8d0DtoMK}TNa;iTG3DDu>_r$PE%=xIQbJZhelm_u?^ayX>KDeBj z0|$!Q@t5HbD}r+l2#rN@a$z?%whl@8-{_fE5e&7!0!c-T>lmGWP4?8Un- z)_oILU9s(FU{fxh4mk1XK{ye97+(F!TR#R)t)V)-OeC0*KJ@v|NEUuH)*haUU&Uwt zF&=(3i7gR~_uuQ8^6iEFs=j;}5E9chggbp>4l4dyjsN5Yt>xP{ zaiZ^_hwAY(6lN*#%$*&Eii5m~d*^7V{!hH-NPRuf?|R&+S>???;&1o5^ok#qS6LO zB80NON>kCA^Ag?MnFM=YZ;b4lXRN=5_5~f&yVM0k1qp|*@Bac7mdgF%^eOmhqh{UM zSdAvE#jIBsN04Qa$t6UN3b!wFY&gHlx6+c*MM@vQ;-57nST;&)onRRa_~@X|`IoOVbZBQAUNcpA-snCGOIO+>A0?0>XxMURzG4vL z_m9##S3g|JgNkn#{PzD^&EvsKsy{WSAlPz@=gyyUe4QJx@+FXplc@@mEbb!^?mL-p zK2wPr+Zy}T@211R8^5HZe@9U4zzFv;eF8b&Kh{xp=mz`KZlyGP#`ixwr#fS6VG3j| z=gMm69k4D+R^-XAnW37b*AYt80y{QBXE*Y(KflW zxNZbb+GHPXy3-9p5wE0#SsCZQJz1~j4yIAyk3pu1>HQYy;W4v35wXg<25Rcv^jZw( z-#Ades&_BCNSAo>ukzP)$qN%z#Pr?%PvK1-zUckiF*P#`VdOVgb*ejnn{C6We+CtT zU;d$fyUV!#Uc&h0X+J|Ej0AnzE5A%d`IVLSKU1wZE*a#{x48^Mz4bR~7SP~}(BSB# zTrZqAyYl5jP!DJ=X2;qLlw+EEq8JY;0I!ppjWL`V3nW1(EkFV zlEYi9rs3eOU!MD7Ghwd%@HN_rc9?x>Fxsa@fNaiVH~BV1qsf*lr__^Y;HP++mw;^< zTB+|pEX7p{8$A+tB}TR5P36yNk?aUTlxh=i*=a~KK5?%3Kj?qnY=w}WOmx_|@Fmdm zUoJYTigEH%h{zG^$q`qO3a_P3x<;v2;Nj^-g*56UXvxjSG^h4rT5;}hhe{S+TI0{M z;6#L570);VO8ekKwpF0q92vspXfth+jP2`soHgAS)CFo6#wQ=Fn?UKd1W}dqV{oai zRAx(94R{4<8W$cLfiuwxw&uzcpu=J1SiXJ$3e21~MpY+Zx2-mHGFpew&6+v((=!D{e>*V*9FZ-wNf!-A%E+)iCm^G-){( z;kWvkpxUNMU~OU_>$2&?pZiJK>V5F$6!a-cKn=-W5ZV>6QgV)t5}D6~D_Of>cg8V+t`x@nG38D&=v+O2 z37UD1d1@`Nr%*CYB6S3k1bT`;Hq>I!wC9)ji5{fylo}g5JOzpJ-nQla#ZdDw^xvy1 z*;tfmbLPShA})m+CWc?^z~XMpmV>M3@5GqqhlOIs{a51yzMUY3jl$VzGdHEy3Ftbj zT2Myl#OzOhv#kZcVO3+L1JnQCAA1(3Dw>P}lj!FPmv}Nb9UR}s^yMRdJ`A_x?8rdk zVBbyf?80}%F=y>ny)f?;dg-DbLPU!2v&s@wYqLe(?G*hYj)5kc-<{Nv~lFR!HNTZXhNzw&&qRp4oX^4;e*kb&ppr;6~@ad2|`X8>~l zVg6m&`mLXYhalGB=2$d=j(u8CB22D;htB26q_wpm-e9P6Y=#27(bu!O9EU+(p5xh$ z>>fBRt5ZLCr4*UE0{4)w^`Yv*sosL&bX>QXU%HWN3Lc)jQ=`boSpVw=9PS#sISm1q z*A=A2wyhGB+`1z>5Kmmz&#^zV${#vWsuSw%s8pi!WXg0JW;C-L_jiBAmn{7!rzXo$ z_>oU~)6-nA>ipH$Cs_<*rpl!Jgc)Fe6gky#jB)+5g6>Y4u4~f}d0X@fTWuRe8vJxA zw<`cn*N>`wUDZ%GtN4A*m3oZixPR=`X*wu}?kcHu8$z!8Km1>GmZM?&scQ<`8}XF$ z$yNvFemM9krZ01p4sQ$-M*Tbg!~E5-2kWJt6G7dmLSCnqiUuKFB8CZV_}J1(`AA9{ znyLi`oLEZ(f%i6AYgXf=Uy@0CM9d)kJN3}g`%g1io;dvKvwACj@S@t?upUBI1LoLc z1RA{W{cO$E`E7jFbUl`(%CYE9%xW)FRz!ZgV&b#PLWg6(RYaCQv0R{pP^*p2i_qN`Bf_W z_yH9LT7r(st@{7)u=rXBwt9HRU%@nTnTnR#4^`qcMnEYcs3Ja&vHq4k>^c1^i46M+ z+2ShI5>Z$Bgq+i}aTMHh_2i0l4i-#&2s3sYfv%HBSihu_K$m^ELRMiE45_;{&o`&z zxF^P!qFs}cMYK!V4M#KO&$fa!`uMO~xAj;#h_PloR~=QB?g$1t=X?c(~2rz#Hw;y;M( zIn@JOCA1E&dprfE$3|7oTrWp&jiI~U`BaQbdcV8MbOcJ%C$(pvR^Vn0)|#C3WawAi zJr!I%f`Q}>q|ifTbhdB0sKMC{isvVzwbdEV-`bGlC?^m-1zRc$-h1q710}=7X-;A@ zK46NzY{*3bzoyyw8jVKO|C`5ZdTtsH{OMQVZfSs)GO=ta)ga7widacK+74H2;=-zp zD{x1~a5Jy)G=zv5RdXf&hx-=~t7|bz9T5H?RAn!*0qkx|?2`NcJ*R1JY^YQ%)LXSS z3*?Sq%-E6C%ipP>{EyRNX4()aGBeys{RZe$Y4*Bjl#HJ6*xTVW3DwW*H8=P6z&QsA z(bn6H*Z%;@UW{!e1AF!5`^@{=LD2EmYfZjU^nH0w%u$wrUEh28Zm;US55MN-1U65B zMnY5f?!0u2k4*R?BAAQIo_?n^tBLUc^HHDN2Fi!V?!5}5Lgh~8njJ2T`wz9(XG}`J zA;N3TD3Q8IDrSg1)vz>b$9r?JM2nN9`1G}bfLj_3E_}Cmr@pxttecXo!)AM+pAzKx zDWn|Dn)Rn@N@{U#+uU&1ra=_VejMS|K?kNqBiW4s@r?8D;M;E;=F@PJqdzX}XByPU z5B=hfYlkNTE%m3i62NuIvH9WALy$Y0P!6^;V6pY-VGfNNJhN%`^vFq(a=C_XcEph;`X#8JmQ!T+8Z~HMduv^M^^b^>tlgg!;u>3^=}9%78(It zJt=GI#|fAi`MPYu(hrBt%6|2{PC`r1JtqbN$e6Xh@S4N9I{5WdAj%uax+ zN5H)~wx`vm7SqRB(n2ryV%;O2;&IX>m>OFtnOamqd(s-W{)0Jq-Aiz+^Ue_ZiYsk% zAa)@&>+5sXJSx098sjG8!+8GOXO6b4e(DIMy!bcr)s+lwGxG7Fx}CTy=lE#D_pg{c zH?QIw-i{snoIL(kjzB2?@R55fWN`nz>1vzD2c-FqCn*rg5Wsn_)2_V}Yj$kx9Z(+u zr*pRcqmD5Q{U4pLsndB#fnZ%1&LQ^^taB|_i85&eAJ2QP)f=nube~<(iTJVq?`M4t zzHu11G08%&>cNH*`W8FUCTP0)_venB4u)~ zyVwsc8kEj2Hmhh1LQHwjS;N>)+(FzJAF}xyhzQGC*1sp=+Oa~LJvWDe?b}fs%b0PL z2zt95B2Mh*Rx&t@c-Cxa~B!Z9O3q?w^j_cie+MHkV`3?}jyPpNnA~l}2fS ze4y)kjTgntfZbfW1R<00_ZMRguRA=yr(vY2eygcSGYsey^28aWLeGKG3WYP(;M(oJ z*ppI&vl65G0>)_|8ORjRex8Vdr{aUi>=l^D@2(_$y$U_&6~^Sphk)F!r*-ow9d>DF zb?x}hIRD0X*hrhRlYlO@WTF#9#oC2NujSTOlsWc1Uvn}QMLSy`z6hm4@g1|YMvrc| zNPZW)U^oOP58O>N`_~K?ZiwwE&TqwGp+eOImP6RT%Psmy9u3y)61cbYHkP4%!W-e( z3vNB29C0;K-ugZ~D+#4s^`CfRSHo+H))K0iVErN<=Q$?L(p5jVcI&X6CK(O zz-W6mxL!M+VsUitTkU1sf9}`Xr>9P?>aE9OZ{lC5 zc0z#FmYe*dbzrL;<*~&-1uwGA7ur7S!kW=$WJNc;sh10@k%;1K~F$NY^TCYO)%IgNh;IKgv?jT>Y8+XR~hLd!lqBvV?~J z>1pe{LdFfs7&w72jzq*P4C!l@a&_0lnR&vsUND*GdX2= zQ8UA7FNum}`%OCEpBsT=`9Jwnsb%=>x9TCLHStiL+Bux%GlHHv*$rEtkTD{Id*gI{ z7rgna_N=>yF@F$ZTlt)3rax5V0hPpfkO(3wMFr_6j1-^oW8jFBhkc^#77EvPMFKe%ZFGpw~yZeR%!S5Yv z9)<Uw1+-dWd`e4yxspM%96-3ZZAYQy7OU2ab)UXW=9aup# zb$yduf~5oPN54eTKtC*6P(00N>BeOX?$SlKT%MSKlH}xdhMQP&%Boi3VpKaYgs#>V8{C}1K(<4N6TpZ zK7$x&{Y=t1xpfAr5Ay4^9Bss-pSSAr#T0-}`_~<>H+CS4@s04VpADeGoPK$~-73$1 zJzjYGKj?qC9NM9}avJ2l<35vh32`gWd*$fuB;0jlIDFlqcv$Cs)?9X`6c@H@=Nh+9 zLbKSQh5wU2q$Lj%%UUup$h)XGcpVA68e~Rl6Z&BDv>b8)1aTbL&)9xxQh&}$ zXAh(t8sQO~qt-t#!b^&p+w}X$)*QcA85Byl1%nTo$Zitcf%5e8FYgHQ5hv zBO+4ygGDjeZq0QKYp8^QP0ctK9R4xzaW;wqGM&*9gf}*sZZWa3#9|Tu9nG)_q-FPf-y;zMnNHyC*c?$FCQK z7xswwJ)8uMFIfY(B^qG8EYa&IM=rW-I2pobFo56u%?&&pdr|EM?e2j@D!9eIGUha3 ztiQ`jRFzefMquVl>?1)T3KS9A{heDoP~+i)jR(JEqi1n^bg)VX{$2?7z9>EdWv|}u zbl0IkKIOWP+P)|h-^3mILU}cR?1~*+-nq&xcfO_bGL3+T{Ev@edZ7&c{}c3j+m1~X znAt-F$C8S3g!umPQt>5Mmx(`#{5-ybMoMzCk-}l+UHpGyB{u! zoH=WKt_vMw^Mkp^v*6m%jej}}NtnbreaJ0m2zI@A^)7Sc1X6!b**Zj)V&EM#%MmZb z?!SMWH7`+M$@k;ub(hBA;rzW_0#1zM?HIIZ$Wn680-SS!rw?yv3DFGJqb5`mr~9mp$CE|w?ZiC;JL z@72?q29uXXOmSt5=WqNd8oPR3ej0AOXi7f_Yy(qs+KF{{D)G_&T74UP0y?YgPI@oY zj_r*PZS~xyL2HNU$@!8vyuSSD>u6#*O4Iw7Vz!n;PuuOYog6t3d%xxm-ERi?PCh-` zdXjPdLBg(d?TM>1pcfMJaa+{?*Q-X4byN)hD%a||zpaAVQx==XPgkNv@)?6?H)x>J z)iU$$CJBdW!5e3GS75o5XWm!!d>pgc9m={ygy@S>?L#xHhr03SS^=nO&4iD0ItKHG!?-f_ zyhvY)4)#}H3eQQ_!r$iEvG;Vw^N-ZL&hoNzPQy{_qx(cJwSwZb#Bt^v0`zEvSJbZi zh$nlWQ$7oIVBV3#+lvkkL*k`-+tfGEU@XnkOk=1S^e5~|h;w|JG8Qfz2Igal;a)leKGVxtd1S?r~1f<=^ zg!LRraG$Mw}|T1zju0m{KzDCGu-zd zJuY{w3sSU{zHeFOzre$};;eInpyl-@Rr)Yv{nccA;z65G514jc5MF=679AT~qfBC_ z;8om4KCX!>bPqQ@o%VMGFKqb0lIBJM@b9ruebNk)iQ5XAx&j~}?%zX8oWR#(y$jFY zjA50!^MUCLZE*U~_XAGR|A9Z6H@}fgCPP_K;4?$}5xmUW30g%kR97!c5bK6>5|XTy@2B9rRR7M@l~Q~m>1S|^orc5xjcFN@ zBXDnm&>=}!D^eek{Sfad2OY(V^!yD>iP8WfcOkN=&$sfI9UZv zc66&hyI!KmiSEordle2;Mx;`23kP-;RwTcfm)!+wHUY z&5+l9bv~$Z5}Muz&$iKO;g#otp;7!WvMHs%U@4=+wJDMbvL&L~gXkYASKgrT-VZ#t zb*VV}){QXvtRI)-_+D1$^h4@~3(rC~GyeYfF->1ak!b=RHM~eVw0dr#eXDd!>?oc( zlGy#pm4KJebUqqX89-hc$1t1FNyuiNuPFA)1e1HWYd(>)(ap?k9n-@R7;~}QpI6oZ zm(qL=JBd(%so&>)hZ^JfXQ|Wl>%mVV#2X(l-Ca$=A=MJeqr1B>B%b&~mtKUp?pS50 z9}PBn^R0h7)dO{MU)1&m_kwKq-I^z#%dqmzao;q;@1b~s4aIxEy-}f?#$Wc|G*!K=L6%c7J9+A{KneL6=S$- zCR^)B*cb%f{CH2?ycTrwu1};6kzl8d=eBhYWa#H!e)zer2VT$)XPE8&grU(6-Ra_F zEHmxVm?jgzczNC@WY;(-KGXISzW#yX`kU|I{9`*h1Gni8@87*h0l}rU`r_Jg5YD&s zLVlnEoS*--NtFo2*Ha2@g3dIk@Cy5|o=8G#i*$Qqu?o!4Iv>25FCC2=l11bDNI-aa zdd+bw8XP+2(GqfxvHm|Ut&;GUhYnVUpWaw|ss+x?C+#fxJ%~f!^BPYNyWugqyv2p6 z4loE_SZGri1P%RSmRWBaJTc?)<^LImVl#N4c3(dT^)!q7ou^|MSu9ukc{{j22uRG3 zXKbIBc>Q38C=JAPeN$fitb@A(x=X^V`Aoel2AUjeaN}^ZjdNZvlHSOk`0$4g_gnU5 z>{4n4l_$=M6=iw2D4NKeYte^!vVoV!Ci?NBCs)FJ02Oxa-9c*=W?X-?6#Dc)bOZ?; zFY_4e{Yrrs1N-(q)bBu_!<4PppJ(CoAL^c1$3jFCIaJDDC zL-#rh9}J@a^P0s8GusaINauGvP(XqOUgPDfVs9Aw@0K`Q)Sg9#pZX@M?bH#>e{a>y zZ`}clw^tJFBdSo^O)@U(`8d>Sr`x~yJqBQ_So)f~3+o1j2CZ5eK=PQV?}HgT98mr9 zz9z`ZRt9VR8C zAfuMY>GL1*?}8C4MNXaw+Z{!D&PvnKRp~^-5u*zDCuz2k`78k}4Bls6P@+MdJ$S&o+O(=ao)Ws9m`8&G)9HyP(wqah!!PqH@wCEX3F5=`yLYVf)AtM4?VZK2h<+56*@ zjz`)H&&yFG?fJfJ(JIJmziU0tlL^H~6=QUs&Oo1Kw7L3q#`k|`d{aI|C(QuoyX4Zx z=A|%D`25}b!eqSg{YbLocqKeM|47qHv<&%cpOsv0r-G2tWy^2IBgpjEYu8TM3S2%n z`NzWP0|pi;rMei6fB_lA9`2;AZWF6a1%AfyukhSb))Chc=#i^Qt{JA_=`hEorub&$ zWh>n#shxx$9CcpAKBPeW^!vuIQho6Ih3XcE-@~x(`J=ckKbyhioKWm$(>8px^1AC$ z@DMWlI2)P-(7Jz8*deCp{0VRf*Pv-yJ)1|KkLRTnRZ*{Vp1bt{;{4Mp|*lv~`X& z4#Qep`hG*52Hfk^;(JP)LFRq&AmwE?+~(JO@Rzcx)9h7$4zKFKNv-d~5C6ma|1_S_ zt;kD;WyJ-T*CBfJ5sH0M9r zkFM$$`zY4Vqhz>IM?TYiasalG*Is{M%lQ36<^5{+v!gV4mG$N@77fFO!hpOD!K>%{ zh}-qp_6($SI3&G$)QeXZmb}fG+hLphLA@NLL$*P0n&kOr;8{>*I{&;IR7IXN9pt0o zqeigWl{^4PpVb`~%xCPs%s+0C;OZWTWd*$RHUg#XH{IcSHU$RW3ap9!>^4*{c-A8u*%~^5EJiVu#;!3`x0tN1YG?(Kge}Jt zTN%eccjiGcT>&zjdt=hszheRvwsiWt3A{$n5~IMg{E2wjj5OLRO2oM* zOifayUt5vQZL&PllmP5ky{-s;F2n>$!bbOJGvMmHaYvMM8E6L&Q3Q|MVSp#gNMvps zm}+X=Vh+m3%=-NHtCrJ{J~MgX3OD2Uw^Whm{??-h=DWx=N#_>m=w<0FG@gVXOi6B> zM+oq=cZwzHzyQu?ZlvFfn1rimEsQw-W+Lqw?}y1%T~@tQqxIEyDn`8>Fbp`~jpM(@ zcNNJE0>@p~U#0(H{>XIt{_NV7F`$K~*{9X@1M=`n_T-MD%g<)HH9-UnHYp-qnI6FX z3dRdWiAktj-|_oKei?XgOgMJ)LW zX5Uf;duQ5_(C?7xCf*6rRiCdlKAi-!CDRg+V7&f1`;-NLxvc8tP#Ie2wF)1#d~Pw$^Jl z|5hLHY^}O6cA5-}2CA*IGK}pn*UR*?UFZj`mP%F*7(+_QrwuYS#$h{O z`!$^pjO+gs`>qzKcFaKUm`>!0lrPY-;9Fdxl7@y(X`cjB%b`|+FF)-?4p!X{Odfhl zh24=}_rGi##T&n7b zZ==w_aX;@D#Wk&PSuUtjLwX2DPUJp|zy25mxC~N7JUhVXUqG%c41yWUUvq0;8f@79 zQZ(+4KVEb9%T*`$gD|%)`~JOjyb>?-ZHGuZ>^2}w80sH-|^R9Ku7Amrk18qJsWc*_T`YGUg9askPpNvqUJMj^iO!Dvai2Fsn4RMw(^)qixUO>Yt$ZZ*Hq ztzi8Ae&df6&eB;LFwNv7yuRHFFPpA5O__BgldUxEU4Amet?5r!93|ozU88%Nd4mv| zf41Rg*#z!E@xaiD5|q<3V=pT#LIvHrEW^uGU?snPIDU8(%u=)V1XeQ6zX8M3ZJJF) z@Jig0WwxrHhMr2%OP0!^?A5d2r_KcU!xgyv+mHr{O6Ltl?~vd~XsPr`>k0_uBD49( zmSao3#TurhI%EpXR^(tygyuJc@lHxJprjbsbJ0JQq5br5`LS0EQ{d{Fk-y%j4J2Yk zsr-5bY~!ZBei2MS67Mth(&{!GGs{_|zMBS>4UJBA>t6!@d!w;{^W|8(B7Za}uomXN z%0@n6PXT30r*-;`8QApr#|%Y=asKV<+RL3&I0J8I6*L7G)4{1UDyjQiK5}_fP{611ecz@T$qBsF6e5SiJzH=Q#W~({fH9ISiZNSUkhbI9(jxrdFmm3@9Eb3k%(n?m2O4ywEeGa3v0%9W zLFo0UQ^NpA9(;du;XncWA@n|FHkt(TL}P^&XDMEj3zmK8Jq{a11nr*&j>6fg5R%%x zK2*-Qsqn@*9f(a#@$Yg*aPhOFo4X$VW{izwI-v1y$F$hn+reF>1y_{;_cr{@T~cPufR>vLp6KQ(n

hWoJkyp(i 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 literal 0 HcmV?d00001 diff --git a/examples/egocap/tests/recording/fixtures/alignment/06_single_sample_source.npz b/examples/egocap/tests/recording/fixtures/alignment/06_single_sample_source.npz new file mode 100644 index 0000000000000000000000000000000000000000..26d5f5fab926357e7de7ac91aaf72dbc3184346d GIT binary patch literal 32391 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 literal 0 HcmV?d00001 diff --git a/examples/egocap/tests/recording/fixtures/alignment/07_no_common_range.npz b/examples/egocap/tests/recording/fixtures/alignment/07_no_common_range.npz new file mode 100644 index 0000000000000000000000000000000000000000..8eb3d978700623dbd235852aab9b0cf6cdbf8aac GIT binary patch literal 11384 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 1: + # The reference's glove arrays for a stride are the matching rows of its full run (checked when generated). + rows = np.searchsorted(np.flatnonzero(ref1["valid_indices"]), np.flatnonzero(ref["valid_indices"])) + for field_name in GLOVE_FIELDS: + ref[f"interp__manus_glove__{field_name}"] = ref1[f"interp__manus_glove__{field_name}"][rows] + assert set(ours) == set(ref) + for key, expected in ref.items(): + assert ours[key].shape == expected.shape, key + if expected.dtype.kind in "biu": + assert np.array_equal(ours[key], expected), key + else: + assert np.allclose(ours[key], expected, rtol=0, atol=1e-12), key + + +@pytest.mark.parametrize( + ("scenario", "ds"), + [ + ("01_jittered_index_offset_wrist", 1), + ("01_jittered_index_offset_wrist", 2), + ("01_jittered_index_offset_wrist", 3), + ("03_tracking_late_start_early_end", 1), + ("04_duplicate_timestamps", 1), + ("05_irregular_tracking_with_gap", 1), + ], +) +def test_matches_reference_alignment_outputs(scenario, ds): + assert_equals_reference(load(scenario), ds) + + +def test_late_tracking_sets_the_valid_range(): + data = load("03_tracking_late_start_early_end") + result = align(data) + assert result.valid_range[0] == data["times__pico_controller"][0] + assert result.valid_range[1] == data["times__pico_controller"][-1] + assert not result.valid_indices[0] + + +def test_single_sample_source_matches_reference_except_where_the_reference_skips(): + # The reference logs and skips the glove's linear fields (a single sample cannot be interpolated); ours raises. + data = load("06_single_sample_source") + assert "out1__interp__manus_glove__left_hand_pose" not in data + with pytest.raises(InsufficientSamplesError): + align(data) + without_hand_poses = {**RULES, "manus_glove": {"left_sensor_count": "nearest"}} + assert_equals_reference(data, 1, without_hand_poses) + + +def test_backwards_timestamp_is_refused_where_the_reference_drops_the_sample(): + data = load("04b_backwards_timestamp") + assert "out1__valid_indices" in data + with pytest.raises(AlignmentError, match="backwards"): + align(data) + + +def test_no_common_range_is_refused_where_the_reference_writes_empty_output(): + data = load("07_no_common_range") + assert not data["out1__valid_indices"].any() + times, fields = inputs(data) + with pytest.raises(AlignmentError, match="common range"): + align_episode("head_camera", times, ["head_camera"], fields, RULES) + + +def test_nearest_tie_goes_to_the_earlier_sample(): + assert find_nearest_timestamp_indices(np.array([0.0, 2.0]), np.array([1.0])).tolist() == [0] + + +def test_a_sample_can_serve_two_targets(): + out = find_nearest_timestamp_indices(np.array([0.0, 10.0]), np.array([0.1, 0.2, 9.9])) + assert out.tolist() == [0, 0, 1] + + +def test_single_sample_source_is_nearest_to_everything(): + assert find_nearest_timestamp_indices(np.array([5.0]), np.array([1.0, 9.0])).tolist() == [0, 0] + + +def test_clean_drops_duplicates_and_reports_too_few_samples(): + t = np.array([0.0, 0.0, 1.0, 2.0]) + v = np.array([0.0, 99.0, 1.0, 2.0]) + out = interpolate_field("linear", t, v, np.array([0.5])) + assert out.tolist() == [0.5] + with pytest.raises(InsufficientSamplesError, match="1 remain"): + interpolate_field("linear", np.array([1.0, 1.0]), np.array([0.0, 1.0]), np.array([1.0])) + + +def test_interpolate_pose_stack(): + t = np.array([0.0, 1.0]) + values = np.stack([np.eye(4), np.eye(4)]) + values[1, :3, 3] = [2.0, 0.0, 0.0] + out = interpolate_field("pose", t, values, np.array([0.5])) + assert out.shape == (1, 4, 4) + assert np.allclose(out[0, :3, 3], [1.0, 0.0, 0.0]) + assert out[0, 3].tolist() == [0.0, 0.0, 0.0, 1.0] + + +def test_pose_with_other_shape_falls_back_to_elementwise(): + t = np.array([0.0, 1.0]) + values = np.array([[0.0, 0.0], [2.0, 4.0]]) + assert interpolate_field("pose", t, values, np.array([0.5])).tolist() == [[1.0, 2.0]] + + +def test_linear_on_scalars_vectors_and_hand_stacks(): + t = np.array([0.0, 2.0]) + targets = np.array([1.0]) + assert interpolate_field("linear", t, np.array([0.0, 4.0]), targets).tolist() == [2.0] + assert interpolate_field("linear", t, np.array([[0.0, 1.0], [2.0, 3.0]]), targets).tolist() == [[1.0, 2.0]] + hands = np.stack([np.zeros((25, 4, 4)), np.full((25, 4, 4), 2.0)]) + assert np.allclose(interpolate_field("linear", t, hands, targets), np.ones((1, 25, 4, 4))) + + +def test_nearest_rule_takes_the_nearest_sample_value(): + out = interpolate_field("nearest", np.array([0.0, 1.0, 2.0]), np.array([10, 11, 12]), np.array([0.9, 2.0])) + assert out.tolist() == [11, 12] + + +def test_raw_rule_returns_none(): + assert interpolate_field("raw", np.array([0.0, 1.0]), np.array([1, 2]), np.array([0.5])) is None + + +def test_unknown_rule_is_an_error(): + with pytest.raises(AlignmentError, match="unknown field rule"): + interpolate_field("cubic", np.array([0.0, 1.0]), np.array([1.0, 2.0]), np.array([0.5])) + + +def simple(index=None, other=None, downsample=1, rules=None, fields=None, **kwargs): + times = { + "cam": np.arange(10.0) if index is None else index, + "arm": np.arange(-2.0, 12.0, 0.5) if other is None else other, + } + arm_fields = {"x": times["arm"] * 2.0} + return align_episode( + "cam", + times, + ["cam"], + {"arm": arm_fields} if fields is None else fields, + {"arm": {"x": "linear"}} if rules is None else rules, + downsample=downsample, + **kwargs, + ) + + +@pytest.mark.parametrize( + ("kwargs", "message"), + [ + ({"index": None, "downsample": 0}, "at least 1"), + ({"other": np.array([])}, "non-empty"), + ({"other": np.array([0.0, np.nan])}, "finite"), + ({"other": np.array([0.0, np.inf])}, "finite"), + ({"other": np.zeros((2, 2))}, "non-empty"), + ({"other": np.array([2.0, 1.0])}, "backwards"), + ], +) +def test_bad_input_is_refused(kwargs, message): + with pytest.raises(AlignmentError, match=message): + simple(**kwargs) + + +def test_missing_index_source_is_refused(): + with pytest.raises(AlignmentError, match="no times"): + align_episode("cam", {"arm": np.arange(3.0)}, [], {}, {}) + + +def test_empty_valid_range_is_an_error_not_an_empty_success(): + with pytest.raises(AlignmentError, match="common range"): + simple(other=np.arange(20.0, 25.0)) + + +def test_downsample_counts_from_the_first_frame(): + # Frames 0 and 1 are outside the arm's range, so the stride keeps 4, 6, 8 (even positions), not 2, 4, 6. + result = simple(other=np.arange(3.5, 20.0), downsample=2) + assert result.valid_timestamps.tolist() == [4.0, 6.0, 8.0] + + +def test_unrecorded_and_raw_rules_add_nothing(): + result = simple(rules={"arm": {"x": "raw", "missing": "linear"}, "ghost": {"y": "linear"}}) + assert result.sources["arm"].interpolated == {} + + +def test_source_without_recorded_fields_adds_nothing(): + result = simple(fields={}, rules={"arm": {"x": "linear"}}) + assert result.sources["arm"].interpolated == {} + + +def test_index_source_fields_are_only_filtered(): + times = {"cam": np.arange(10.0), "arm": np.arange(2.0, 8.0)} + values = np.arange(10) * 3 + result = align_episode("cam", times, ["cam"], {"cam": {"v": values}}, {"cam": {"v": "linear"}}) + assert result.sources["cam"].interpolated["v"].tolist() == [6, 9, 12, 15, 18, 21] + + +def test_camera_index_source_frames_are_the_valid_positions(): + result = simple() + assert np.array_equal(result.sources["cam"].aligned_frame_indices, np.flatnonzero(result.valid_indices)) + assert result.sources["arm"].aligned_frame_indices is None + + +def test_valid_range_is_first_and_last_common_time(): + assert simple().valid_range == (0.0, 9.0) + + +def test_no_epochs_and_empty_epochs_change_nothing(): + data = load("01_jittered_index_offset_wrist") + base = ours_by_reference_key(align(data)) + for epochs in (None, {}): + again = ours_by_reference_key(align(data, epochs=epochs)) + assert all(np.array_equal(base[k], again[k]) for k in base) + + +def test_uniform_epoch_labels_leave_the_output_identical(): + data = load("01_jittered_index_offset_wrist") + times, _ = inputs(data) + epochs = {name: np.full(len(t), 4) for name, t in times.items()} + base = ours_by_reference_key(align(data)) + labelled = ours_by_reference_key(align(data, epochs=epochs)) + assert set(base) == set(labelled) + assert all(np.array_equal(base[k], labelled[k]) for k in base) + + +def test_changed_epoch_label_is_refused(): + labels = np.array([0] * 14 + [1] * 14) + with pytest.raises(AlignmentError, match="restart or invalid interval"): + simple(epochs={"arm": labels}) + + +def test_epoch_labels_of_the_wrong_length_are_refused(): + with pytest.raises(AlignmentError, match="one per sample"): + simple(epochs={"arm": np.zeros(3)}) + + +def test_epoch_labels_for_an_unknown_source_are_refused(): + with pytest.raises(AlignmentError, match="one per sample"): + simple(epochs={"ghost": np.zeros(3)}) + + +def stream(name, meaning="sensor_capture"): + return {"name": name, "timestamp_basis": "PUBLISHER_MONOTONIC_US", "time_meaning": meaning} + + +def timing(streams, physical="available: measurement time per sample"): + return { + "clock_mapping": {"streams": streams}, + "tracking_semantics": {"physical_alignment": physical}, + } + + +def test_camera_is_qualified_only_for_a_sensor_capture_stream(): + t = timing([stream("cam1"), stream("cam2", "frame_ready")]) + assert qualified_sources(t, ["cam1", "cam2", "cam3"], []) == {"cam1": True, "cam2": False, "cam3": False} + + +@pytest.mark.parametrize( + "entry", + [ + {"name": "cam", "timestamp_basis": "PUBLISHER_MONOTONIC_US"}, + {"name": "cam"}, + {"name": "cam", "time_meaning": None}, + {"name": "other"}, + "cam", + ], +) +def test_camera_with_missing_or_unqualified_evidence_is_false(entry): + assert qualified_sources(timing([entry]), ["cam"], []) == {"cam": False} + + +def test_tracking_is_qualified_only_when_physical_alignment_is_available(): + sources = ["pico_controller", "manus_glove"] + assert qualified_sources(timing([], "available: x"), [], sources) == dict.fromkeys(sources, True) + assert qualified_sources(timing([], "unavailable: no time"), [], sources) == dict.fromkeys(sources, False) + + +@pytest.mark.parametrize( + "t", + [ + None, + {}, + {"tracking_semantics": {}}, + {"tracking_semantics": {"physical_alignment": 3}}, + {"tracking_semantics": "available"}, + {"clock_mapping": {"streams": "cam"}, "tracking_semantics": []}, + {"clock_mapping": {"streams": 7}}, + {"clock_mapping": {"streams": {"name": "cam", "time_meaning": "sensor_capture"}}}, + {"clock_mapping": "cam"}, + {"clock_mapping": {}}, + ], +) +def test_malformed_timing_gives_false_and_never_raises(t): + assert qualified_sources(t, ["cam"], ["pico_controller"]) == {"cam": False, "pico_controller": False} + + +def test_backends_current_tracking_text_does_not_qualify_tracking(): + livekit_recording = pytest.importorskip("egocap_web.livekit_recording") + semantics = {"physical_alignment": livekit_recording._TRACKING_SEMANTICS["physical_alignment"]} + assert qualified_sources({"tracking_semantics": semantics}, [], ["pico_controller"]) == { + "pico_controller": False + } From 0be3dde0915bfee591554729ab01fd02693bb03e Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:41:28 -0500 Subject: [PATCH 02/38] egocap: declare each source's frame type in the session config and resample by it A new session's config.yaml now lists the video and numeric sources with the frame type that says how each field is resampled when the episode is time aligned (the default frame types too), and a latency only for a source the configuration gives one. The tracking sources declare PicoTrackingFrame and ManusFrame. alignment.source_rules reads the declarations; an unknown frame type is an error. The configuration digest is unchanged when no frame type is set. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../backend/egocap_web/recording_adapter.py | 2 + .../recording/egocap/recording/alignment.py | 56 +++- .../egocap/recording/episode_store.py | 7 +- .../recording_service/recording_service.py | 41 ++- .../backend/test_app_livekit_recording.py | 9 + .../tests/backend/test_recording_adapter.py | 10 + .../tests/recording/unit/test_alignment.py | 117 ++++++++- .../recording_service/test_session_config.py | 242 ++++++++++++++++++ .../recording_service/test_station_config.py | 11 +- 9 files changed, 469 insertions(+), 26 deletions(-) create mode 100644 examples/egocap/tests/recording_service/test_session_config.py diff --git a/examples/egocap/backend/egocap_web/recording_adapter.py b/examples/egocap/backend/egocap_web/recording_adapter.py index 8e19c9b769..67b47cdaee 100644 --- a/examples/egocap/backend/egocap_web/recording_adapter.py +++ b/examples/egocap/backend/egocap_web/recording_adapter.py @@ -71,6 +71,7 @@ FieldSpec("x_button", "bool"), FieldSpec("y_button", "bool"), ), + "PicoTrackingFrame", ) MANUS_GLOVE_SPEC = NumericSourceSpec( MANUS_GLOVE_SOURCE, @@ -78,6 +79,7 @@ FieldSpec("left_hand_pose", "float64", (25, 4, 4)), FieldSpec("right_hand_pose", "float64", (25, 4, 4)), ), + "ManusFrame", ) diff --git a/examples/egocap/recording/egocap/recording/alignment.py b/examples/egocap/recording/egocap/recording/alignment.py index 846e785aff..39901b3f10 100644 --- a/examples/egocap/recording/egocap/recording/alignment.py +++ b/examples/egocap/recording/egocap/recording/alignment.py @@ -36,13 +36,14 @@ "AlignedEpisode", "AlignedSource", "AlignmentError", + "FRAME_FIELD_RULES", "FieldRule", "InsufficientSamplesError", - "TRACKING_FIELD_RULES", "align_episode", "find_nearest_timestamp_indices", "interpolate_field", "qualified_sources", + "source_rules", ] #: How one field is resampled onto the kept times. @@ -176,21 +177,62 @@ class AlignedEpisode: sources: dict[str, AlignedSource] -#: How each field of the station's tracking sources is resampled. Head and controller poses are rigid transforms -#: (slerp); the glove's 25 joint transforms per hand are interpolated element-wise; triggers are continuous; the -#: buttons are not resampled, so they stay raw. -TRACKING_FIELD_RULES: dict[str, dict[str, FieldRule]] = { - "pico_controller": { +#: How each field of a frame type is resampled when an episode is time aligned. A session's config.yaml names the +#: frame type of each source. Head and controller poses are rigid transforms (slerp); the glove's joint transforms +#: are interpolated element-wise, so their shape never selects slerp; triggers and sensor values are continuous; +#: a count is the nearest sample's; buttons and flags are not resampled, so they are absent here (raw). +FRAME_FIELD_RULES: dict[str, dict[str, FieldRule]] = { + "RGBCameraFrame": {"pose": "pose"}, + "NumericFrame": {}, + "PicoTrackingFrame": { "head_pose": "pose", "left_pose": "pose", "right_pose": "pose", "left_trigger": "linear", "right_trigger": "linear", }, - "manus_glove": {"left_hand_pose": "linear", "right_hand_pose": "linear"}, + "ManusFrame": { + **{f"{side}_hand_pose": "linear" for side in ("left", "right")}, + **{ + f"{side}_sensor_{kind}": "linear" + for side in ("left", "right") + for kind in ("position", "orientation", "rotation") + }, + **{f"{side}_sensor_count": "nearest" for side in ("left", "right")}, + }, } +def source_rules(config: Mapping[str, object]) -> dict[str, dict[str, FieldRule]]: + """Each declared source's field rules, from the source declarations in a session's ``config.yaml``. + + A source declares its ``frame_type``; one that declares none takes the session's default for its kind. A frame + type with no known rules is an error, since silently resampling nothing would write an aligned episode that + looks complete and is not. + """ + recording = config.get("recording") + defaults = { + "video_sources": (recording or {}).get("video_frame_type", "RGBCameraFrame") + if isinstance(recording, Mapping) + else "RGBCameraFrame", + "numeric_sources": (recording or {}).get("numeric_frame_type", "NumericFrame") + if isinstance(recording, Mapping) + else "NumericFrame", + } + rules: dict[str, dict[str, FieldRule]] = {} + for section, default in defaults.items(): + entries = config.get(section) + # An absent or malformed section declares no sources. + for entry in entries if isinstance(entries, (list, tuple)) else []: + if not isinstance(entry, Mapping) or not isinstance(entry.get("name"), str): + raise AlignmentError(f"{section}: every source needs a name") + frame_type = entry.get("frame_type", default) + if frame_type not in FRAME_FIELD_RULES: + raise AlignmentError(f"{entry['name']}: no alignment rules for frame type {frame_type!r}") + rules[entry["name"]] = dict(FRAME_FIELD_RULES[frame_type]) + return rules + + def _check_inputs(index_source: str, times: Mapping[str, np.ndarray], downsample: int) -> None: """Refuse input that cannot be aligned: a missing index source, a bad stride, or unusable times.""" if index_source not in times: diff --git a/examples/egocap/recording/egocap/recording/episode_store.py b/examples/egocap/recording/egocap/recording/episode_store.py index c768ab7285..4ce27c8a81 100644 --- a/examples/egocap/recording/egocap/recording/episode_store.py +++ b/examples/egocap/recording/egocap/recording/episode_store.py @@ -47,10 +47,15 @@ class FieldSpec: @dataclass(frozen=True) class NumericSourceSpec: - """A numeric source (pose tracker, glove, ...) and the fields recorded per row.""" + """A numeric source (pose tracker, glove, ...) and the fields recorded per row. + + ``frame_type`` names the frame definition that says how each field is resampled when the episode is time + aligned (see ``alignment.FRAME_FIELD_RULES``); None leaves the session's default numeric frame type. + """ name: str fields: tuple[FieldSpec, ...] + frame_type: str | None = None @dataclass(frozen=True) diff --git a/examples/egocap/recording/recording_service/recording_service.py b/examples/egocap/recording/recording_service/recording_service.py index bf02de37d6..fd687c6017 100644 --- a/examples/egocap/recording/recording_service/recording_service.py +++ b/examples/egocap/recording/recording_service/recording_service.py @@ -142,7 +142,11 @@ def _digest(config: ServiceConfig) -> str: qc["capture_algorithm_version"] = ALGORITHM_VERSION # a changed algorithm is a changed configuration canonical = { **({"routing": True} if config.routing is not None else {}), # routed or not; each take freezes its studio - "numeric": [asdict(s) for s in config.numeric_sources], + # A frame type left unset is absent, not null, so a configuration that predates it keeps its digest. + "numeric": [ + {k: v for k, v in asdict(s).items() if k != "frame_type" or v is not None} + for s in config.numeric_sources + ], "video": [asdict(s) for s in config.video_sources], "qc": qc, "latency": config.latency, @@ -651,11 +655,7 @@ def _prepare_session_assets(self, session_path: Path, is_new: bool) -> None: record[asset.name] = None self._issues.append(f"optional calibration asset {asset.name!r} not found at {source}") write_json_atomic(record_path, record) - if self._config.station_label: - write_yaml_atomic( - session_path / SESSION_CONFIG_FILE, - {"meta": {"egocap_station_name": self._config.station_label}}, - ) + write_yaml_atomic(session_path / SESSION_CONFIG_FILE, self._session_config()) return record = json.loads(record_path.read_text()) if record_path.is_file() else {} for asset in assets: @@ -667,6 +667,35 @@ def _prepare_session_assets(self, session_path: Path, is_new: bool) -> None: raise ConfigurationError(problem) self._issues.append("optional " + problem) + def _session_config(self) -> dict[str, Any]: + """The session's ``config.yaml``: the station identity and the source declarations time alignment reads. + + Each source is declared by name with the frame type that says how its fields are resampled. A latency is + written only for a source the configuration gives one, since a latency that was never measured must not + be recorded as zero. + """ + config = self._config + data: dict[str, Any] = {} + # The station identity analytics tools map a recorded session back to its station with. + if config.station_label: + data["meta"] = {"egocap_station_name": config.station_label} + # The default frame types for sources that declare none. + data["recording"] = {"video_frame_type": "RGBCameraFrame", "numeric_frame_type": "NumericFrame"} + latency = config.latency or {} + + def declare(name: str, frame_type: str | None = None) -> dict[str, Any]: + """One source's declaration; a frame type or latency appears only when it is known.""" + entry: dict[str, Any] = {"name": name} + if frame_type is not None: + entry["frame_type"] = frame_type + if name in latency: + entry["latency"] = latency[name] + return entry + + data["video_sources"] = [declare(s.name) for s in config.video_sources] + data["numeric_sources"] = [declare(s.name, s.frame_type) for s in config.numeric_sources] + return data + def _seed_group_assets(self, session_path: Path, group: str) -> None: """Copy the session's frozen config.yaml and preserved calibration assets into a routed group. diff --git a/examples/egocap/tests/backend/test_app_livekit_recording.py b/examples/egocap/tests/backend/test_app_livekit_recording.py index 1f9f9a9646..6580c9010f 100644 --- a/examples/egocap/tests/backend/test_app_livekit_recording.py +++ b/examples/egocap/tests/backend/test_app_livekit_recording.py @@ -237,3 +237,12 @@ def test_readiness_accepts_livekit_recording_with_a_loopback_capture_server(acce _ready_monitor([_stream(16, capture)]), None, "ws://127.0.0.1:8082" ) assert check() == (True, None) + + +def test_config_factory_numeric_sources_carry_their_frame_types(tmp_path): + monitor = SimpleNamespace(camera_descriptors=(), native=SimpleNamespace(started=None)) + config = app_module._recording_config_factory(monitor, None, tmp_path)() + assert {s.name: s.frame_type for s in config.numeric_sources} == { + "pico_controller": "PicoTrackingFrame", + "manus_glove": "ManusFrame", + } diff --git a/examples/egocap/tests/backend/test_recording_adapter.py b/examples/egocap/tests/backend/test_recording_adapter.py index 9c18cf11e6..ea8c5d368f 100644 --- a/examples/egocap/tests/backend/test_recording_adapter.py +++ b/examples/egocap/tests/backend/test_recording_adapter.py @@ -25,6 +25,8 @@ from capture_server import protocol as capture_protocol from capture_server.client import CameraImage, CaptureFrame from egocap_web.recording_adapter import ( + MANUS_GLOVE_SPEC, + PICO_CONTROLLER_SPEC, RecordingAdapterError, RecordingIngress, _convert_raw_item, @@ -826,3 +828,11 @@ def offer(self, item): assert abs(video.capture_time - event_ns / S) <= tolerance_s for sample in tracking: assert abs((sample.capture_time - video.capture_time) - truth_gap_s) <= tolerance_s + + +def test_tracking_specs_name_the_frame_types_that_select_their_alignment_rules(): + from egocap.recording.alignment import FRAME_FIELD_RULES + + assert PICO_CONTROLLER_SPEC.frame_type == "PicoTrackingFrame" + assert MANUS_GLOVE_SPEC.frame_type == "ManusFrame" + assert {PICO_CONTROLLER_SPEC.frame_type, MANUS_GLOVE_SPEC.frame_type} <= set(FRAME_FIELD_RULES) diff --git a/examples/egocap/tests/recording/unit/test_alignment.py b/examples/egocap/tests/recording/unit/test_alignment.py index 52bdbc3276..61e8194779 100644 --- a/examples/egocap/tests/recording/unit/test_alignment.py +++ b/examples/egocap/tests/recording/unit/test_alignment.py @@ -9,24 +9,28 @@ from egocap.recording import alignment from egocap.recording.alignment import ( + FRAME_FIELD_RULES, AlignmentError, InsufficientSamplesError, align_episode, find_nearest_timestamp_indices, interpolate_field, qualified_sources, + source_rules, ) FIXTURES = Path(__file__).resolve().parent.parent / "fixtures" / "alignment" CAMERAS = ["head_camera", "wrist_camera"] -RULES = { - **alignment.TRACKING_FIELD_RULES, - "head_camera": {"pose": "pose"}, - "wrist_camera": {"pose": "pose"}, - # Raw fields are not resampled, and the glove's integer count takes the nearest sample. - "pico_controller": {**alignment.TRACKING_FIELD_RULES["pico_controller"], "a_button": "raw"}, - "manus_glove": {**alignment.TRACKING_FIELD_RULES["manus_glove"], "left_sensor_count": "nearest"}, +# The declarations a session's config.yaml carries for the golden scenarios' sources. +CONFIG = { + "recording": {"video_frame_type": "RGBCameraFrame", "numeric_frame_type": "NumericFrame"}, + "video_sources": [{"name": name} for name in CAMERAS], + "numeric_sources": [ + {"name": "pico_controller", "frame_type": "PicoTrackingFrame"}, + {"name": "manus_glove", "frame_type": "ManusFrame"}, + ], } +RULES = alignment.source_rules(CONFIG) GLOVE_FIELDS = ("left_hand_pose", "right_hand_pose", "left_sensor_count") @@ -358,3 +362,102 @@ def test_backends_current_tracking_text_does_not_qualify_tracking(): assert qualified_sources({"tracking_semantics": semantics}, [], ["pico_controller"]) == { "pico_controller": False } + + +def test_controller_poses_are_slerped_and_buttons_stay_raw(): + rules = FRAME_FIELD_RULES["PicoTrackingFrame"] + assert {rules[f] for f in ("head_pose", "left_pose", "right_pose")} == {"pose"} + assert {rules[f] for f in ("left_trigger", "right_trigger")} == {"linear"} + assert not {"a_button", "b_button", "x_button", "y_button"} & set(rules) + + +def test_glove_poses_are_elementwise_linear_never_slerped(): + rules = FRAME_FIELD_RULES["ManusFrame"] + assert rules["left_hand_pose"] == rules["right_hand_pose"] == "linear" + assert "pose" not in rules.values() + + +@pytest.mark.parametrize("side", ["left", "right"]) +def test_glove_sensors_are_linear_and_their_counts_nearest(side): + rules = FRAME_FIELD_RULES["ManusFrame"] + assert [rules[f"{side}_sensor_{kind}"] for kind in ("position", "orientation", "rotation")] == ["linear"] * 3 + assert rules[f"{side}_sensor_count"] == "nearest" + + +def test_camera_frames_resample_a_pose_and_generic_numeric_frames_nothing(): + assert FRAME_FIELD_RULES["RGBCameraFrame"] == {"pose": "pose"} + assert FRAME_FIELD_RULES["NumericFrame"] == {} + + +def test_source_rules_takes_each_sources_declared_frame_type(): + rules = source_rules(CONFIG) + assert set(rules) == {"head_camera", "wrist_camera", "pico_controller", "manus_glove"} + assert rules["head_camera"] == {"pose": "pose"} + assert rules["pico_controller"] == FRAME_FIELD_RULES["PicoTrackingFrame"] + assert rules["manus_glove"] == FRAME_FIELD_RULES["ManusFrame"] + + +def test_source_rules_returns_copies_so_a_caller_cannot_alter_the_table(): + source_rules(CONFIG)["pico_controller"]["head_pose"] = "raw" + assert FRAME_FIELD_RULES["PicoTrackingFrame"]["head_pose"] == "pose" + + +def test_source_without_a_frame_type_takes_the_sessions_default_for_its_kind(): + config = { + "recording": {"video_frame_type": "NumericFrame", "numeric_frame_type": "ManusFrame"}, + "video_sources": [{"name": "cam"}], + "numeric_sources": [{"name": "glove"}, {"name": "tracker", "frame_type": "NumericFrame"}], + } + assert source_rules(config) == { + "cam": {}, + "glove": FRAME_FIELD_RULES["ManusFrame"], + "tracker": {}, + } + + +@pytest.mark.parametrize("recording", [None, "x", ["RGBCameraFrame"], {}]) +def test_missing_or_malformed_recording_defaults_to_camera_and_numeric_frames(recording): + config = {"video_sources": [{"name": "cam"}], "numeric_sources": [{"name": "arm"}]} + if recording is not None: + config["recording"] = recording + assert source_rules(config) == {"cam": {"pose": "pose"}, "arm": {}} + + +def test_a_recording_section_naming_one_default_leaves_the_other(): + config = { + "recording": {"numeric_frame_type": "ManusFrame"}, + "video_sources": [{"name": "cam"}], + "numeric_sources": [{"name": "glove"}], + } + assert source_rules(config) == {"cam": {"pose": "pose"}, "glove": FRAME_FIELD_RULES["ManusFrame"]} + + +@pytest.mark.parametrize( + "config", [{}, {"video_sources": None, "numeric_sources": "arm"}, {"numeric_sources": {}}] +) +def test_absent_or_malformed_sections_declare_nothing(config): + assert source_rules(config) == {} + + +def test_sections_may_be_tuples_or_lists(): + as_tuples = {"video_sources": ({"name": "cam"},), "numeric_sources": ({"name": "arm"},)} + as_lists = {"video_sources": [{"name": "cam"}], "numeric_sources": [{"name": "arm"}]} + assert source_rules(as_tuples) == source_rules(as_lists) == {"cam": {"pose": "pose"}, "arm": {}} + + +def test_unknown_frame_type_is_refused_naming_the_source(): + config = {"numeric_sources": [{"name": "arm", "frame_type": "Bogus"}]} + with pytest.raises(AlignmentError, match="arm.*Bogus"): + source_rules(config) + + +def test_unknown_default_frame_type_is_refused(): + config = {"recording": {"video_frame_type": "Bogus"}, "video_sources": [{"name": "cam"}]} + with pytest.raises(AlignmentError, match="Bogus"): + source_rules(config) + + +@pytest.mark.parametrize("entry", ["cam", None, {"frame_type": "NumericFrame"}, {"name": 3}, ["name"]]) +def test_an_entry_that_is_not_a_named_mapping_is_refused(entry): + with pytest.raises(AlignmentError, match="video_sources: every source needs a name"): + source_rules({"video_sources": [entry]}) diff --git a/examples/egocap/tests/recording_service/test_session_config.py b/examples/egocap/tests/recording_service/test_session_config.py new file mode 100644 index 0000000000..660dbff726 --- /dev/null +++ b/examples/egocap/tests/recording_service/test_session_config.py @@ -0,0 +1,242 @@ +# SPDX-FileCopyrightText: 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +"""The session config.yaml's source declarations and the digest's treatment of a numeric frame type.""" + +import asyncio +import dataclasses +import hashlib +import json +from pathlib import Path + +import numpy as np +import yaml +import zarr + +import recording_service.recording_service as impl +from egocap.recording.alignment import align_episode, source_rules +from recording_service import ( + CaptureQcConfig, + Disposition, + FieldSpec, + NumericSample, + NumericSourceSpec, + PixelFormat, + QcConfig, + RecordingService, + RoutingConfig, + ServiceConfig, + VideoSample, + VideoSourceSpec, +) + +FIELDS = (FieldSpec("v", "float64"),) +DEFAULTS = {"video_frame_type": "RGBCameraFrame", "numeric_frame_type": "NumericFrame"} + + +def _config(output_root: Path, **overrides) -> ServiceConfig: + base = ServiceConfig( + output_root=output_root, + numeric_sources=( + NumericSourceSpec("tracker", FIELDS, "PicoTrackingFrame"), + NumericSourceSpec("plain", FIELDS), + ), + video_sources=(VideoSourceSpec("cam", 64, 48, 30.0), VideoSourceSpec("wrist", 64, 48, 30.0)), + qc=QcConfig(required_sources=("tracker",)), + ) + return dataclasses.replace(base, **overrides) + + +async def _written(config: ServiceConfig, own) -> dict: + """Open a new session and return its config.yaml as the standard loader reads it.""" + session = await own(RecordingService(config)).open_session() + return yaml.safe_load((session.session_path / "config.yaml").read_text()) + + +async def test_declares_every_source_with_the_defaults_and_only_the_known_frame_types(tmp_path, own): + written = await _written(_config(tmp_path / "out"), own) + assert written == { + "recording": DEFAULTS, + "video_sources": [{"name": "cam"}, {"name": "wrist"}], + "numeric_sources": [{"name": "tracker", "frame_type": "PicoTrackingFrame"}, {"name": "plain"}], + } + + +async def test_station_meta_is_written_only_with_a_label(tmp_path, own): + labelled = await _written(_config(tmp_path / "a", station_label="Station 01"), own) + assert labelled["meta"] == {"egocap_station_name": "Station 01"} and labelled["recording"] == DEFAULTS + assert "meta" not in await _written(_config(tmp_path / "b"), own) + assert "meta" not in await _written(_config(tmp_path / "c", station_label=""), own) + + +async def test_latency_is_written_only_for_sources_that_have_one_and_never_as_zero(tmp_path, own): + config = _config(tmp_path / "out", latency={"tracker": 0.25, "cam": 0.0}) + written = await _written(config, own) + assert written["numeric_sources"] == [ + {"name": "tracker", "frame_type": "PicoTrackingFrame", "latency": 0.25}, + {"name": "plain"}, + ] + assert written["video_sources"] == [{"name": "cam", "latency": 0.0}, {"name": "wrist"}] # explicit 0 is kept + + +async def test_no_latency_configured_writes_none(tmp_path, own): + written = await _written(_config(tmp_path / "out", latency=None), own) + assert not any("latency" in e for e in written["numeric_sources"] + written["video_sources"]) + + +async def test_a_numeric_only_session_declares_an_empty_video_list(tmp_path, own): + config = _config(tmp_path / "out", video_sources=()) + assert (await _written(config, own))["video_sources"] == [] + + +async def test_reopening_a_session_keeps_its_config_yaml_and_still_works(tmp_path, own): + config = _config(tmp_path / "out", latency={"tracker": 0.1}) + service = own(RecordingService(config)) + session = await service.open_session() + path = session.session_path / "config.yaml" + first = path.read_text() + await service.close() + + changed = dataclasses.replace(config, latency={"tracker": 0.9}, station_label="Station 07") + again = own(RecordingService(changed)) + reopened = await again.open_session(session.session_id) + assert reopened.session_path == session.session_path and path.read_text() == first + + +async def test_a_reopened_session_records_its_next_take_under_the_frozen_config_yaml(tmp_path, own): + config = _config(tmp_path / "out", video_sources=()) + service = own(RecordingService(config)) + session = await service.open_session() + first = await service.start_episode("t") + service.submit_sample(first.episode_id, NumericSample("tracker", 0.0, 0.0, {"v": 1.0})) + await service.stop_episode(first.episode_id) + await service.close() + + again = own(RecordingService(config)) + await again.open_session(session.session_id) + assert not again.pending_episodes() + second = await again.start_episode("t") + assert second.episode_index == 1 and (session.session_path / "config.yaml").is_file() + await again.discard_episode(second.episode_id) + + +async def test_a_routed_group_copy_carries_the_declarations(tmp_path, own): + config = _config( + tmp_path / "out", + routing=RoutingConfig(), + video_sources=(), + numeric_sources=(NumericSourceSpec("tracker", FIELDS, "PicoTrackingFrame"),), + latency={"tracker": 0.5}, + station_label=None, + ) + service = own(RecordingService(config)) + session = await service.open_session() + episode = await service.start_episode("t") + for i in range(3): + service.submit_sample(episode.episode_id, NumericSample("tracker", float(i), float(i), {"v": 1.0})) + result = await service.stop_episode(episode.episode_id) + assert result.disposition is Disposition.KEPT + copied = yaml.safe_load((Path(result.final_path).parent / "config.yaml").read_text()) + assert copied == yaml.safe_load((session.session_path / "config.yaml").read_text()) + assert copied["numeric_sources"] == [{"name": "tracker", "frame_type": "PicoTrackingFrame", "latency": 0.5}] + + +def _pre_frame_type_digest(config: ServiceConfig) -> str: + """The digest as it was computed before numeric sources carried a frame type.""" + qc = dataclasses.asdict(config.qc) + if config.qc.capture is None: + del qc["capture"] + else: + qc["capture_algorithm_version"] = impl.ALGORITHM_VERSION + canonical = { + **({"routing": True} if config.routing is not None else {}), + "numeric": [ + {"name": s.name, "fields": [dataclasses.asdict(f) for f in s.fields]} for s in config.numeric_sources + ], + "video": [dataclasses.asdict(s) for s in config.video_sources], + "qc": qc, + "latency": config.latency, + "calibration": [a.name for a in config.calibration_assets], + } + return hashlib.sha256(json.dumps(canonical, sort_keys=True).encode()).hexdigest() + + +def test_an_unset_frame_type_leaves_the_digest_as_it_was_before_the_field_existed(): + for extra in ( + {}, + {"routing": RoutingConfig()}, + {"qc": QcConfig(capture=CaptureQcConfig())}, + {"latency": {"a": 1.0}}, + ): + config = ServiceConfig( + Path("out"), + (NumericSourceSpec("a", FIELDS),), + (VideoSourceSpec("cam", 64, 48, 30.0),), + **extra, + ) + assert impl._digest(config) == _pre_frame_type_digest(config) + assert impl._layout_digest(config) == _pre_frame_type_digest( + dataclasses.replace(config, qc=dataclasses.replace(config.qc, capture=None)) + ) + + +def test_a_set_frame_type_changes_the_digest_and_a_different_one_changes_it_again(): + def digest(frame_type): + return impl._digest(ServiceConfig(Path("out"), (NumericSourceSpec("a", FIELDS, frame_type),))) + + assert len({digest(None), digest("PicoTrackingFrame"), digest("ManusFrame")}) == 3 + + +async def test_a_recorded_episode_aligns_from_its_own_config_yaml_and_arrays(tmp_path, own): + config = ServiceConfig( + output_root=tmp_path / "out", + numeric_sources=( + NumericSourceSpec( + "pico_controller", + (FieldSpec("head_pose", "float64", (4, 4)), FieldSpec("left_trigger", "float64")), + "PicoTrackingFrame", + ), + NumericSourceSpec("manus_glove", (FieldSpec("left_hand_pose", "float64", (25, 4, 4)),), "ManusFrame"), + ), + video_sources=(VideoSourceSpec("cam", 64, 48, 30.0),), + qc=QcConfig(required_sources=("pico_controller", "cam")), + ) + service = own(RecordingService(config)) + session = await service.open_session() + episode = await service.start_episode("t") + frame = np.zeros((48, 64, 3), dtype=np.uint8) + items = [] + for i in range(6): # six camera frames at 30 Hz, bracketed by 60 Hz tracking samples + t = 1.0 + i / 30 + items.append(VideoSample("cam", frame, PixelFormat.RGB8, t, t, np.eye(3))) + for i in range(-2, 16): + t = 1.0 + i / 60 + head = np.eye(4) + head[0, 3] = t + items.append(NumericSample("pico_controller", t, t, {"head_pose": head, "left_trigger": t})) + items.append(NumericSample("manus_glove", t, t, {"left_hand_pose": np.full((25, 4, 4), t)})) + for item in sorted(items, key=lambda x: x.capture_time): + while service.submit_sample(episode.episode_id, item).status.name == "FULL": + await asyncio.sleep(0) + result = await service.stop_episode(episode.episode_id) + assert result.disposition is Disposition.KEPT + + declared = yaml.safe_load((session.session_path / "config.yaml").read_text()) + root = zarr.open_group(str(result.final_path), mode="r") + times = {name: root[name]["capture_time"][:] for name in ("cam", "pico_controller", "manus_glove")} + fields = { + "pico_controller": {k: root["pico_controller"][k][:] for k in ("head_pose", "left_trigger")}, + "manus_glove": {"left_hand_pose": root["manus_glove"]["left_hand_pose"][:]}, + } + rules = source_rules(declared) + aligned = align_episode("cam", times, ["cam"], fields, rules) + + count = int(aligned.valid_indices.sum()) + assert aligned.valid_indices.dtype == bool and aligned.valid_indices.shape == (6,) and count == 6 + assert aligned.sources["cam"].aligned_frame_indices.tolist() == list(range(6)) + pico = aligned.sources["pico_controller"].interpolated + assert pico["head_pose"].shape == (count, 4, 4) and pico["left_trigger"].shape == (count,) + assert np.allclose(pico["head_pose"][:, 0, 3], aligned.valid_timestamps) # poses follow the linear ramp + glove = aligned.sources["manus_glove"].interpolated["left_hand_pose"] + assert glove.shape == (count, 25, 4, 4) and np.allclose(glove[:, 0, 0, 0], aligned.valid_timestamps) diff --git a/examples/egocap/tests/recording_service/test_station_config.py b/examples/egocap/tests/recording_service/test_station_config.py index 498b7fe7b2..7cd468d84e 100644 --- a/examples/egocap/tests/recording_service/test_station_config.py +++ b/examples/egocap/tests/recording_service/test_station_config.py @@ -52,20 +52,21 @@ async def test_station_label_writes_config_yaml_once_and_freezes_on_reopen(tmp_p service = own(RecordingService(base)) session = await service.open_session() cfg_path = session.session_path / "config.yaml" - assert yaml.safe_load(cfg_path.read_text()) == {"meta": {"egocap_station_name": "Station 01"}} + assert yaml.safe_load(cfg_path.read_text())["meta"] == {"egocap_station_name": "Station 01"} await service.close() relabeled = dataclasses.replace(base, station_label="Station 02") service2 = own(RecordingService(relabeled)) await service2.open_session(session.session_id) # reopen the same session - assert yaml.safe_load(cfg_path.read_text()) == {"meta": {"egocap_station_name": "Station 01"}} # unchanged + assert yaml.safe_load(cfg_path.read_text())["meta"] == {"egocap_station_name": "Station 01"} # unchanged -async def test_no_station_label_writes_no_config_yaml(tmp_path, own): - """An unset station_label (the ServiceConfig default) writes no config.yaml at all.""" +async def test_no_station_label_writes_a_config_yaml_without_station_meta(tmp_path, own): + """An unset station_label (the ServiceConfig default) still writes the source declarations, but no meta.""" service = own(RecordingService(_config(tmp_path / "out"))) session = await service.open_session() - assert not (session.session_path / "config.yaml").exists() + written = yaml.safe_load((session.session_path / "config.yaml").read_text()) + assert "meta" not in written and written["numeric_sources"] == [{"name": "s"}] async def test_routed_group_gets_a_copy_of_the_session_config_yaml(tmp_path, own): From cd5ec21b55c328f117580ffb5c2c7db195d2bf65 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:41:28 -0500 Subject: [PATCH 03/38] egocap: write the time-aligned copy of an episode Writes the aligned session beside the raw one: valid_indices and valid_timestamps per episode, aligned_frame_indices per camera, resampled fields as _interp (their raw arrays left out), every other array, the attributes, the session config and sidecars and the videos carried over, and the index source on the root. Refuses a source without a qualified event time and validates what it wrote. Tests follow. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../egocap/recording/aligned_writer.py | 199 ++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 examples/egocap/recording/egocap/recording/aligned_writer.py diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py new file mode 100644 index 0000000000..db123a299c --- /dev/null +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -0,0 +1,199 @@ +# SPDX-FileCopyrightText: 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +"""Writes a time-aligned copy of a recorded episode, in the aligned dataset layout downstream readers expect. + +The aligned session sits beside the raw one and mirrors it: the same ``episode_`` groups, the same per-source +groups, the same videos. What differs is the time alignment (see :mod:`alignment`): each episode gains +``valid_indices`` and ``valid_timestamps``; each camera gains ``aligned_frame_indices``; each resampled field is +written as ``_interp`` and its raw array is left out (readers use the ``_interp`` name); every other raw +array, the attributes, the session's ``config.yaml`` and sidecars, and the videos are carried over unchanged. The +aligned root's ``zarr.json`` records which source was the index. + +This module writes the files; the caller chooses the times, qualification and the staging that makes publication +atomic. +""" + +from __future__ import annotations + +import os +import shutil +from collections.abc import Mapping +from pathlib import Path +from typing import Any + +import numpy as np +import yaml +import zarr + +from .alignment import AlignedEpisode, align_episode, source_rules + +__all__ = ["ALIGNED_SESSION_SIDECARS", "AlignedWriteError", "validate_aligned_episode", "write_aligned_episode"] + +#: Session-level files carried into the aligned session when the raw session has them. +ALIGNED_SESSION_SIDECARS = ( + "config.yaml", + "data_check_config.yaml", + "head_camera_intrinsics.json", + "head_camera_extrinsics.json", + "wrist_calibration_offsets.json", + "left_wrist_camera_intrinsics.json", + "right_wrist_camera_intrinsics.json", + "rectification.json", +) +#: Video container suffixes that are carried into the aligned episode. +_VIDEO_SUFFIXES = (".mp4", ".mkv", ".avi", ".mov") +#: Arrays at most this large are read back by validation to catch stale or empty chunks. +_CHECK_MAX_BYTES = 10 * 1024 * 1024 + + +class AlignedWriteError(RuntimeError): + """The aligned episode could not be written or did not validate.""" + + +def _copy_attrs(source: Any, target: Any) -> None: + """Carry every attribute of a zarr group over to the aligned group.""" + for key, value in source.attrs.items(): + target.attrs[key] = value + + +def _link_or_copy(source: Path, target: Path) -> None: + """Put a video in the aligned episode: a hard link when the filesystem allows it, else a copy.""" + # A video from an earlier alignment is replaced, not merged with. + if os.path.lexists(target): + target.unlink() + try: + os.link(source, target) + except OSError: + shutil.copy2(source, target) + + +def _write_root(raw_session: Path, aligned_session: Path, index_source: str) -> None: + """Create the aligned root: its attributes, the session sidecars, and the index source in ``zarr.json``.""" + aligned_session.mkdir(parents=True, exist_ok=True) + raw_root = zarr.open_group(str(raw_session), mode="a") + aligned_root = zarr.open_group(str(aligned_session), mode="a") + _copy_attrs(raw_root, aligned_root) + # The index source is a root attribute so a reader knows which camera's frames define the timeline. + aligned_root.attrs["index_source"] = index_source + for name in ALIGNED_SESSION_SIDECARS: + source, target = raw_session / name, aligned_session / name + # An existing aligned sidecar is left alone, so re-aligning never overwrites what is already there. + if source.is_file() and not target.exists(): + shutil.copy2(source, target) + + +def _write_source(raw_group: Any, target_group: Any, aligned_source: Any) -> None: + """Write one source: its attributes, the raw arrays that are not resampled, and what the alignment adds.""" + _copy_attrs(raw_group, target_group) + for name in raw_group.array_keys(): + # A resampled field is read as ``_interp``; its raw array is not kept. + if name not in aligned_source.interpolated: + target_group[name] = raw_group[name][:] + for name, values in aligned_source.interpolated.items(): + target_group[f"{name}_interp"] = values + if aligned_source.aligned_frame_indices is not None: + target_group["aligned_frame_indices"] = aligned_source.aligned_frame_indices + + +def validate_aligned_episode(aligned_session: Path, episode_index: int, index_source: str) -> list[str]: + """Problems with a written aligned episode; empty means it is as expected. + + Checks the arrays every aligned episode has, that the index source has ``aligned_frame_indices``, and that the + small arrays can be read back and are not empty (a stale chunk from an earlier, differently shaped alignment + only shows when the data is read). + """ + problems: list[str] = [] + key = f"episode_{episode_index}" + root = zarr.open_group(str(aligned_session), mode="r") + if key not in root: + return [f"{key} group missing from the aligned session"] + episode = root[key] + for required in ("valid_indices", "valid_timestamps"): + if required not in episode: + problems.append(f"{key}/{required} missing") + if index_source not in episode: + problems.append(f"{key}/{index_source} group missing") + elif "aligned_frame_indices" not in episode[index_source]: + problems.append(f"{key}/{index_source}/aligned_frame_indices missing") + + def check(group: Any, prefix: str) -> None: + """Read each small array under ``group`` and report one that fails or is empty.""" + for name in group.array_keys(): + array = group[name] + if array.nbytes > _CHECK_MAX_BYTES: + continue + try: + data = np.asarray(array[:]) + except Exception as exc: # a stale chunk raises something zarr-specific + problems.append(f"{prefix}/{name} unreadable: {exc}") + continue + if data.size == 0: + problems.append(f"{prefix}/{name} is empty") + for name in group.group_keys(): + check(group[name], f"{prefix}/{name}") + + check(episode, key) + return problems + + +def write_aligned_episode( + raw_session: Path, + aligned_session: Path, + episode_index: int, + index_source: str, + *, + downsample: int = 1, + qualified: Mapping[str, bool], +) -> AlignedEpisode: + """Align one recorded episode and write it into ``aligned_session``; returns the alignment. + + ``qualified`` says, per source, whether its recorded capture time is a qualified event time; a source that is + not qualified (or not listed) refuses the alignment, so nothing is written for it. The times aligned on are + the recorded capture times. Raises ``AlignedWriteError`` if the written episode does not validate. + """ + config = yaml.safe_load((raw_session / "config.yaml").read_text(encoding="utf-8")) or {} + rules = source_rules(config) + cameras = [e["name"] for e in config.get("video_sources") or []] + key = f"episode_{episode_index}" + raw_episode = zarr.open_group(str(raw_session), mode="r")[key] + + # Only declared sources the episode actually recorded take part, as the valid range spans what is present. + present = [name for name in rules if name in raw_episode] + unqualified = [name for name in [index_source, *present] if not qualified.get(name, False)] + if unqualified: + raise AlignedWriteError(f"sources without a qualified event time: {sorted(set(unqualified))}") + times = {name: raw_episode[name]["capture_time"][:] for name in present} + fields = {name: {a: raw_episode[name][a][:] for a in raw_episode[name].array_keys()} for name in present} + aligned = align_episode( + index_source, + times, + [c for c in cameras if c in present], + fields, + {name: rules[name] for name in present}, + downsample=downsample, + ) + + _write_root(raw_session, aligned_session, index_source) + root = zarr.open_group(str(aligned_session), mode="a") + # A previous alignment of this episode is removed whole, so no chunk of a different shape survives it. + if key in root: + del root[key] + episode = root.require_group(key) + _copy_attrs(raw_episode, episode) + episode["valid_indices"] = aligned.valid_indices + episode["valid_timestamps"] = aligned.valid_timestamps + for name in present: + _write_source(raw_episode[name], episode.require_group(name), aligned.sources[name]) + + # The videos are the same files: linked, so the aligned episode costs no extra disk. + raw_dir, aligned_dir = raw_session / key, aligned_session / key + for video in sorted(raw_dir.iterdir()) if raw_dir.is_dir() else []: + if video.suffix in _VIDEO_SUFFIXES: + _link_or_copy(video, aligned_dir / video.name) + + problems = validate_aligned_episode(aligned_session, episode_index, index_source) + if problems: + raise AlignedWriteError("; ".join(problems)) + return aligned From d6bd7c8caec6ec8fd69daca74973ad6fa2ad5914 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:43:01 -0500 Subject: [PATCH 04/38] egocap: test the aligned-episode writer against the reference aligner's tree Rebuilds raw sessions from stored inputs, writes the aligned session, and compares it with the tree the reference pipeline produced (paths, attributes, dtypes, shapes, values, copied files and video links), for downsample 1 and 2, a re-alignment and a session with attributes and sidecars. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../fixtures/aligned_writer/config.yaml | 17 + .../aligned_writer/golden_attrs_sidecars.json | 713 +++++++++ .../aligned_writer/golden_attrs_sidecars.npz | Bin 0 -> 69065 bytes .../aligned_writer/golden_basic_ds1.json | 1373 +++++++++++++++++ .../aligned_writer/golden_basic_ds1.npz | Bin 0 -> 138120 bytes .../aligned_writer/golden_basic_ds2.json | 1373 +++++++++++++++++ .../aligned_writer/golden_basic_ds2.npz | Bin 0 -> 78629 bytes .../aligned_writer/golden_realign.json | 1373 +++++++++++++++++ .../aligned_writer/golden_realign.npz | Bin 0 -> 108380 bytes .../head_camera_intrinsics.json | 6 + .../fixtures/aligned_writer/raw_inputs.npz | Bin 0 -> 196030 bytes .../fixtures/aligned_writer/scenarios.json | 84 + .../recording/unit/test_aligned_writer.py | 291 ++++ 13 files changed, 5230 insertions(+) create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/config.yaml create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/golden_attrs_sidecars.json create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/golden_attrs_sidecars.npz create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds1.json create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds1.npz create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds2.json create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds2.npz create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.npz create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/head_camera_intrinsics.json create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/raw_inputs.npz create mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/scenarios.json create mode 100644 examples/egocap/tests/recording/unit/test_aligned_writer.py diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/config.yaml b/examples/egocap/tests/recording/fixtures/aligned_writer/config.yaml new file mode 100644 index 0000000000..7d5cc67634 --- /dev/null +++ b/examples/egocap/tests/recording/fixtures/aligned_writer/config.yaml @@ -0,0 +1,17 @@ +# SPDX-FileCopyrightText: 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +meta: + egocap_station_name: station_a +numeric_sources: +- frame_type: PicoTrackingFrame + name: pico_controller +- frame_type: ManusFrame + name: glove +recording: + numeric_frame_type: NumericFrame + video_frame_type: RGBCameraFrame +video_sources: +- name: head_camera +- name: wrist_camera diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_attrs_sidecars.json b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_attrs_sidecars.json new file mode 100644 index 0000000000..57ad277622 --- /dev/null +++ b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_attrs_sidecars.json @@ -0,0 +1,713 @@ +{ + "entries": [ + { + "path": "config.yaml", + "kind": "file", + "size": 288, + "sha256": "e4142ea4adc900fb4870b4c31a465f0bf885ea925ee762f8aa688db5cfa82fbb" + }, + { + "path": "episode_0/head_camera.mp4", + "kind": "file", + "size": 544, + "sha256": "9f2ff969f02f9dd114ead58b074424d237b6a2109790434998549c09f6eaae36" + }, + { + "path": "episode_0/wrist_camera.mp4", + "kind": "file", + "size": 560, + "sha256": "140f5fa6e646b0bc7ac525867ac191a2b8ea76ccc17b46c702daa36e619be6d6" + }, + { + "path": "head_camera_intrinsics.json", + "kind": "file", + "size": 62, + "sha256": "3b2689f670b93236bafc6d6571e4c38d2c478f6190ba95a4e0d0a60e05b3001a" + }, + { + "path": "zarr.json", + "kind": "root_json", + "zarr_format": 3, + "node_type": "group", + "attributes": { + "task_description": "pick and place", + "operator": { + "id": 7, + "tags": [ + "a", + "b" + ] + }, + "index_source": "head_camera" + } + }, + { + "path": "episode_0", + "kind": "group", + "attributes": { + "task_description": "episode task", + "timing": { + "clock": "monotonic", + "offset_s": 0.25 + } + } + }, + { + "path": "episode_0/glove", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/glove/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a0", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a1", + "info_chunks": [ + 35, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_sensor_count_interp", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a2", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_sensor_rotation_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4 + ], + "attributes": {}, + "npz_key": "a3", + "info_chunks": [ + 35, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a4", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/right_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a5", + "info_chunks": [ + 35, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/head_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a6", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a7", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a8", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a9", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a10", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller", + "kind": "group", + "attributes": { + "handedness": "both" + } + }, + { + "path": "episode_0/pico_controller/a_button", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a11", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/body_joints_valid", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a12", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a13", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/head_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a14", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/left_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a15", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/left_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a16", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a17", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/right_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a18", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/right_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a19", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/wrist_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a20", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a21", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a22", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a23", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a24", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/valid_indices", + "kind": "array", + "dtype": "bool", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a25", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/valid_timestamps", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a26", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + } + ], + "reference_tree_listing": [ + "config.yaml", + "episode_0", + "episode_0/glove", + "episode_0/glove/capture_time", + "episode_0/glove/capture_time/c", + "episode_0/glove/capture_time/c/0", + "episode_0/glove/capture_time/zarr.json", + "episode_0/glove/left_hand_pose_interp", + "episode_0/glove/left_hand_pose_interp/c", + "episode_0/glove/left_hand_pose_interp/c/0", + "episode_0/glove/left_hand_pose_interp/c/0/0", + "episode_0/glove/left_hand_pose_interp/c/0/0/0", + "episode_0/glove/left_hand_pose_interp/c/0/0/0/0", + "episode_0/glove/left_hand_pose_interp/zarr.json", + "episode_0/glove/left_sensor_count_interp", + "episode_0/glove/left_sensor_count_interp/c", + "episode_0/glove/left_sensor_count_interp/c/0", + "episode_0/glove/left_sensor_count_interp/zarr.json", + "episode_0/glove/left_sensor_rotation_interp", + "episode_0/glove/left_sensor_rotation_interp/c", + "episode_0/glove/left_sensor_rotation_interp/c/0", + "episode_0/glove/left_sensor_rotation_interp/c/0/0", + "episode_0/glove/left_sensor_rotation_interp/zarr.json", + "episode_0/glove/receive_time", + "episode_0/glove/receive_time/c", + "episode_0/glove/receive_time/c/0", + "episode_0/glove/receive_time/zarr.json", + "episode_0/glove/right_hand_pose_interp", + "episode_0/glove/right_hand_pose_interp/c", + "episode_0/glove/right_hand_pose_interp/c/0", + "episode_0/glove/right_hand_pose_interp/c/0/0", + "episode_0/glove/right_hand_pose_interp/c/0/0/0", + "episode_0/glove/right_hand_pose_interp/c/0/0/0/0", + "episode_0/glove/right_hand_pose_interp/zarr.json", + "episode_0/glove/zarr.json", + "episode_0/head_camera", + "episode_0/head_camera.mp4", + "episode_0/head_camera/aligned_frame_indices", + "episode_0/head_camera/aligned_frame_indices/c", + "episode_0/head_camera/aligned_frame_indices/c/0", + "episode_0/head_camera/aligned_frame_indices/zarr.json", + "episode_0/head_camera/capture_time", + "episode_0/head_camera/capture_time/c", + "episode_0/head_camera/capture_time/c/0", + "episode_0/head_camera/capture_time/zarr.json", + "episode_0/head_camera/frame_id", + "episode_0/head_camera/frame_id/c", + "episode_0/head_camera/frame_id/c/0", + "episode_0/head_camera/frame_id/zarr.json", + "episode_0/head_camera/pose_interp", + "episode_0/head_camera/pose_interp/c", + "episode_0/head_camera/pose_interp/c/0", + "episode_0/head_camera/pose_interp/c/0/0", + "episode_0/head_camera/pose_interp/c/0/0/0", + "episode_0/head_camera/pose_interp/zarr.json", + "episode_0/head_camera/receive_time", + "episode_0/head_camera/receive_time/c", + "episode_0/head_camera/receive_time/c/0", + "episode_0/head_camera/receive_time/zarr.json", + "episode_0/head_camera/zarr.json", + "episode_0/pico_controller", + "episode_0/pico_controller/a_button", + "episode_0/pico_controller/a_button/c", + "episode_0/pico_controller/a_button/c/0", + "episode_0/pico_controller/a_button/zarr.json", + "episode_0/pico_controller/body_joints_valid", + "episode_0/pico_controller/body_joints_valid/c", + "episode_0/pico_controller/body_joints_valid/c/0", + "episode_0/pico_controller/body_joints_valid/zarr.json", + "episode_0/pico_controller/capture_time", + "episode_0/pico_controller/capture_time/c", + "episode_0/pico_controller/capture_time/c/0", + "episode_0/pico_controller/capture_time/zarr.json", + "episode_0/pico_controller/head_pose_interp", + "episode_0/pico_controller/head_pose_interp/c", + "episode_0/pico_controller/head_pose_interp/c/0", + "episode_0/pico_controller/head_pose_interp/c/0/0", + "episode_0/pico_controller/head_pose_interp/c/0/0/0", + "episode_0/pico_controller/head_pose_interp/zarr.json", + "episode_0/pico_controller/left_pose_interp", + "episode_0/pico_controller/left_pose_interp/c", + "episode_0/pico_controller/left_pose_interp/c/0", + "episode_0/pico_controller/left_pose_interp/c/0/0", + "episode_0/pico_controller/left_pose_interp/c/0/0/0", + "episode_0/pico_controller/left_pose_interp/zarr.json", + "episode_0/pico_controller/left_trigger_interp", + "episode_0/pico_controller/left_trigger_interp/c", + "episode_0/pico_controller/left_trigger_interp/c/0", + "episode_0/pico_controller/left_trigger_interp/zarr.json", + "episode_0/pico_controller/receive_time", + "episode_0/pico_controller/receive_time/c", + "episode_0/pico_controller/receive_time/c/0", + "episode_0/pico_controller/receive_time/zarr.json", + "episode_0/pico_controller/right_pose_interp", + "episode_0/pico_controller/right_pose_interp/c", + "episode_0/pico_controller/right_pose_interp/c/0", + "episode_0/pico_controller/right_pose_interp/c/0/0", + "episode_0/pico_controller/right_pose_interp/c/0/0/0", + "episode_0/pico_controller/right_pose_interp/zarr.json", + "episode_0/pico_controller/right_trigger_interp", + "episode_0/pico_controller/right_trigger_interp/c", + "episode_0/pico_controller/right_trigger_interp/c/0", + "episode_0/pico_controller/right_trigger_interp/zarr.json", + "episode_0/pico_controller/zarr.json", + "episode_0/valid_indices", + "episode_0/valid_indices/c", + "episode_0/valid_indices/c/0", + "episode_0/valid_indices/zarr.json", + "episode_0/valid_timestamps", + "episode_0/valid_timestamps/c", + "episode_0/valid_timestamps/c/0", + "episode_0/valid_timestamps/zarr.json", + "episode_0/wrist_camera", + "episode_0/wrist_camera.mp4", + "episode_0/wrist_camera/aligned_frame_indices", + "episode_0/wrist_camera/aligned_frame_indices/c", + "episode_0/wrist_camera/aligned_frame_indices/c/0", + "episode_0/wrist_camera/aligned_frame_indices/zarr.json", + "episode_0/wrist_camera/capture_time", + "episode_0/wrist_camera/capture_time/c", + "episode_0/wrist_camera/capture_time/c/0", + "episode_0/wrist_camera/capture_time/zarr.json", + "episode_0/wrist_camera/frame_id", + "episode_0/wrist_camera/frame_id/c", + "episode_0/wrist_camera/frame_id/c/0", + "episode_0/wrist_camera/frame_id/zarr.json", + "episode_0/wrist_camera/pose_interp", + "episode_0/wrist_camera/pose_interp/c", + "episode_0/wrist_camera/pose_interp/c/0", + "episode_0/wrist_camera/pose_interp/c/0/0", + "episode_0/wrist_camera/pose_interp/c/0/0/0", + "episode_0/wrist_camera/pose_interp/zarr.json", + "episode_0/wrist_camera/receive_time", + "episode_0/wrist_camera/receive_time/c", + "episode_0/wrist_camera/receive_time/c/0", + "episode_0/wrist_camera/receive_time/zarr.json", + "episode_0/wrist_camera/zarr.json", + "episode_0/zarr.json", + "head_camera_intrinsics.json", + "zarr.json" + ] +} diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_attrs_sidecars.npz b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_attrs_sidecars.npz new file mode 100644 index 0000000000000000000000000000000000000000..21cb1e7d609d3fe70be3523ad2c938475ebff9f3 GIT binary patch literal 69065 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 L??^tpBHsNUL%QhU literal 0 HcmV?d00001 diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds1.json b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds1.json new file mode 100644 index 0000000000..81bbe3ad83 --- /dev/null +++ b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds1.json @@ -0,0 +1,1373 @@ +{ + "entries": [ + { + "path": "config.yaml", + "kind": "file", + "size": 288, + "sha256": "e4142ea4adc900fb4870b4c31a465f0bf885ea925ee762f8aa688db5cfa82fbb" + }, + { + "path": "episode_0/head_camera.mp4", + "kind": "file", + "size": 544, + "sha256": "9f2ff969f02f9dd114ead58b074424d237b6a2109790434998549c09f6eaae36" + }, + { + "path": "episode_0/wrist_camera.mp4", + "kind": "file", + "size": 560, + "sha256": "140f5fa6e646b0bc7ac525867ac191a2b8ea76ccc17b46c702daa36e619be6d6" + }, + { + "path": "episode_1/head_camera.mp4", + "kind": "file", + "size": 544, + "sha256": "520464427520ebe79e6c809f6632ca024236bb44f540a604f1068d5c63ea1fd4" + }, + { + "path": "episode_1/wrist_camera.mp4", + "kind": "file", + "size": 560, + "sha256": "fc228cf71fa912a8e41b9840c11fad07f032a8d671a008b42b6d90b38020745a" + }, + { + "path": "zarr.json", + "kind": "root_json", + "zarr_format": 3, + "node_type": "group", + "attributes": { + "index_source": "head_camera" + } + }, + { + "path": "episode_0", + "kind": "group", + "attributes": { + "task_description": "episode task", + "timing": { + "clock": "monotonic", + "offset_s": 0.25 + } + } + }, + { + "path": "episode_0/glove", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/glove/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a0", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a1", + "info_chunks": [ + 35, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_sensor_count_interp", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a2", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_sensor_rotation_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4 + ], + "attributes": {}, + "npz_key": "a3", + "info_chunks": [ + 35, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a4", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/right_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a5", + "info_chunks": [ + 35, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/head_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a6", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a7", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a8", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a9", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a10", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller", + "kind": "group", + "attributes": { + "handedness": "both" + } + }, + { + "path": "episode_0/pico_controller/a_button", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a11", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/body_joints_valid", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a12", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a13", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/head_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a14", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/left_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a15", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/left_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a16", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a17", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/right_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a18", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/right_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a19", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/wrist_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a20", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a21", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a22", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a23", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a24", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/valid_indices", + "kind": "array", + "dtype": "bool", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a25", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/valid_timestamps", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a26", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1", + "kind": "group", + "attributes": { + "task_description": "episode task", + "timing": { + "clock": "monotonic", + "offset_s": 0.25 + } + } + }, + { + "path": "episode_1/glove", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_1/glove/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a27", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/left_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a28", + "info_chunks": [ + 35, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/left_sensor_count_interp", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a29", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/left_sensor_rotation_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4 + ], + "attributes": {}, + "npz_key": "a30", + "info_chunks": [ + 35, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a31", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/right_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a32", + "info_chunks": [ + 35, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_1/head_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a33", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a34", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a35", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a36", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a37", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller", + "kind": "group", + "attributes": { + "handedness": "both" + } + }, + { + "path": "episode_1/pico_controller/a_button", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a38", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/body_joints_valid", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a39", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a40", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/head_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a41", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/left_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a42", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/left_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a43", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a44", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/right_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a45", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/right_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a46", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_1/wrist_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a47", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a48", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a49", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a50", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a51", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/valid_indices", + "kind": "array", + "dtype": "bool", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a52", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/valid_timestamps", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a53", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + } + ], + "reference_tree_listing": [ + "config.yaml", + "episode_0", + "episode_0/glove", + "episode_0/glove/capture_time", + "episode_0/glove/capture_time/c", + "episode_0/glove/capture_time/c/0", + "episode_0/glove/capture_time/zarr.json", + "episode_0/glove/left_hand_pose_interp", + "episode_0/glove/left_hand_pose_interp/c", + "episode_0/glove/left_hand_pose_interp/c/0", + "episode_0/glove/left_hand_pose_interp/c/0/0", + "episode_0/glove/left_hand_pose_interp/c/0/0/0", + "episode_0/glove/left_hand_pose_interp/c/0/0/0/0", + "episode_0/glove/left_hand_pose_interp/zarr.json", + "episode_0/glove/left_sensor_count_interp", + "episode_0/glove/left_sensor_count_interp/c", + "episode_0/glove/left_sensor_count_interp/c/0", + "episode_0/glove/left_sensor_count_interp/zarr.json", + "episode_0/glove/left_sensor_rotation_interp", + "episode_0/glove/left_sensor_rotation_interp/c", + "episode_0/glove/left_sensor_rotation_interp/c/0", + "episode_0/glove/left_sensor_rotation_interp/c/0/0", + "episode_0/glove/left_sensor_rotation_interp/zarr.json", + "episode_0/glove/receive_time", + "episode_0/glove/receive_time/c", + "episode_0/glove/receive_time/c/0", + "episode_0/glove/receive_time/zarr.json", + "episode_0/glove/right_hand_pose_interp", + "episode_0/glove/right_hand_pose_interp/c", + "episode_0/glove/right_hand_pose_interp/c/0", + "episode_0/glove/right_hand_pose_interp/c/0/0", + "episode_0/glove/right_hand_pose_interp/c/0/0/0", + "episode_0/glove/right_hand_pose_interp/c/0/0/0/0", + "episode_0/glove/right_hand_pose_interp/zarr.json", + "episode_0/glove/zarr.json", + "episode_0/head_camera", + "episode_0/head_camera.mp4", + "episode_0/head_camera/aligned_frame_indices", + "episode_0/head_camera/aligned_frame_indices/c", + "episode_0/head_camera/aligned_frame_indices/c/0", + "episode_0/head_camera/aligned_frame_indices/zarr.json", + "episode_0/head_camera/capture_time", + "episode_0/head_camera/capture_time/c", + "episode_0/head_camera/capture_time/c/0", + "episode_0/head_camera/capture_time/zarr.json", + "episode_0/head_camera/frame_id", + "episode_0/head_camera/frame_id/c", + "episode_0/head_camera/frame_id/c/0", + "episode_0/head_camera/frame_id/zarr.json", + "episode_0/head_camera/pose_interp", + "episode_0/head_camera/pose_interp/c", + "episode_0/head_camera/pose_interp/c/0", + "episode_0/head_camera/pose_interp/c/0/0", + "episode_0/head_camera/pose_interp/c/0/0/0", + "episode_0/head_camera/pose_interp/zarr.json", + "episode_0/head_camera/receive_time", + "episode_0/head_camera/receive_time/c", + "episode_0/head_camera/receive_time/c/0", + "episode_0/head_camera/receive_time/zarr.json", + "episode_0/head_camera/zarr.json", + "episode_0/pico_controller", + "episode_0/pico_controller/a_button", + "episode_0/pico_controller/a_button/c", + "episode_0/pico_controller/a_button/c/0", + "episode_0/pico_controller/a_button/zarr.json", + "episode_0/pico_controller/body_joints_valid", + "episode_0/pico_controller/body_joints_valid/c", + "episode_0/pico_controller/body_joints_valid/c/0", + "episode_0/pico_controller/body_joints_valid/zarr.json", + "episode_0/pico_controller/capture_time", + "episode_0/pico_controller/capture_time/c", + "episode_0/pico_controller/capture_time/c/0", + "episode_0/pico_controller/capture_time/zarr.json", + "episode_0/pico_controller/head_pose_interp", + "episode_0/pico_controller/head_pose_interp/c", + "episode_0/pico_controller/head_pose_interp/c/0", + "episode_0/pico_controller/head_pose_interp/c/0/0", + "episode_0/pico_controller/head_pose_interp/c/0/0/0", + "episode_0/pico_controller/head_pose_interp/zarr.json", + "episode_0/pico_controller/left_pose_interp", + "episode_0/pico_controller/left_pose_interp/c", + "episode_0/pico_controller/left_pose_interp/c/0", + "episode_0/pico_controller/left_pose_interp/c/0/0", + "episode_0/pico_controller/left_pose_interp/c/0/0/0", + "episode_0/pico_controller/left_pose_interp/zarr.json", + "episode_0/pico_controller/left_trigger_interp", + "episode_0/pico_controller/left_trigger_interp/c", + "episode_0/pico_controller/left_trigger_interp/c/0", + "episode_0/pico_controller/left_trigger_interp/zarr.json", + "episode_0/pico_controller/receive_time", + "episode_0/pico_controller/receive_time/c", + "episode_0/pico_controller/receive_time/c/0", + "episode_0/pico_controller/receive_time/zarr.json", + "episode_0/pico_controller/right_pose_interp", + "episode_0/pico_controller/right_pose_interp/c", + "episode_0/pico_controller/right_pose_interp/c/0", + "episode_0/pico_controller/right_pose_interp/c/0/0", + "episode_0/pico_controller/right_pose_interp/c/0/0/0", + "episode_0/pico_controller/right_pose_interp/zarr.json", + "episode_0/pico_controller/right_trigger_interp", + "episode_0/pico_controller/right_trigger_interp/c", + "episode_0/pico_controller/right_trigger_interp/c/0", + "episode_0/pico_controller/right_trigger_interp/zarr.json", + "episode_0/pico_controller/zarr.json", + "episode_0/valid_indices", + "episode_0/valid_indices/c", + "episode_0/valid_indices/c/0", + "episode_0/valid_indices/zarr.json", + "episode_0/valid_timestamps", + "episode_0/valid_timestamps/c", + "episode_0/valid_timestamps/c/0", + "episode_0/valid_timestamps/zarr.json", + "episode_0/wrist_camera", + "episode_0/wrist_camera.mp4", + "episode_0/wrist_camera/aligned_frame_indices", + "episode_0/wrist_camera/aligned_frame_indices/c", + "episode_0/wrist_camera/aligned_frame_indices/c/0", + "episode_0/wrist_camera/aligned_frame_indices/zarr.json", + "episode_0/wrist_camera/capture_time", + "episode_0/wrist_camera/capture_time/c", + "episode_0/wrist_camera/capture_time/c/0", + "episode_0/wrist_camera/capture_time/zarr.json", + "episode_0/wrist_camera/frame_id", + "episode_0/wrist_camera/frame_id/c", + "episode_0/wrist_camera/frame_id/c/0", + "episode_0/wrist_camera/frame_id/zarr.json", + "episode_0/wrist_camera/pose_interp", + "episode_0/wrist_camera/pose_interp/c", + "episode_0/wrist_camera/pose_interp/c/0", + "episode_0/wrist_camera/pose_interp/c/0/0", + "episode_0/wrist_camera/pose_interp/c/0/0/0", + "episode_0/wrist_camera/pose_interp/zarr.json", + "episode_0/wrist_camera/receive_time", + "episode_0/wrist_camera/receive_time/c", + "episode_0/wrist_camera/receive_time/c/0", + "episode_0/wrist_camera/receive_time/zarr.json", + "episode_0/wrist_camera/zarr.json", + "episode_0/zarr.json", + "episode_1", + "episode_1/glove", + "episode_1/glove/capture_time", + "episode_1/glove/capture_time/c", + "episode_1/glove/capture_time/c/0", + "episode_1/glove/capture_time/zarr.json", + "episode_1/glove/left_hand_pose_interp", + "episode_1/glove/left_hand_pose_interp/c", + "episode_1/glove/left_hand_pose_interp/c/0", + "episode_1/glove/left_hand_pose_interp/c/0/0", + "episode_1/glove/left_hand_pose_interp/c/0/0/0", + "episode_1/glove/left_hand_pose_interp/c/0/0/0/0", + "episode_1/glove/left_hand_pose_interp/zarr.json", + "episode_1/glove/left_sensor_count_interp", + "episode_1/glove/left_sensor_count_interp/c", + "episode_1/glove/left_sensor_count_interp/c/0", + "episode_1/glove/left_sensor_count_interp/zarr.json", + "episode_1/glove/left_sensor_rotation_interp", + "episode_1/glove/left_sensor_rotation_interp/c", + "episode_1/glove/left_sensor_rotation_interp/c/0", + "episode_1/glove/left_sensor_rotation_interp/c/0/0", + "episode_1/glove/left_sensor_rotation_interp/zarr.json", + "episode_1/glove/receive_time", + "episode_1/glove/receive_time/c", + "episode_1/glove/receive_time/c/0", + "episode_1/glove/receive_time/zarr.json", + "episode_1/glove/right_hand_pose_interp", + "episode_1/glove/right_hand_pose_interp/c", + "episode_1/glove/right_hand_pose_interp/c/0", + "episode_1/glove/right_hand_pose_interp/c/0/0", + "episode_1/glove/right_hand_pose_interp/c/0/0/0", + "episode_1/glove/right_hand_pose_interp/c/0/0/0/0", + "episode_1/glove/right_hand_pose_interp/zarr.json", + "episode_1/glove/zarr.json", + "episode_1/head_camera", + "episode_1/head_camera.mp4", + "episode_1/head_camera/aligned_frame_indices", + "episode_1/head_camera/aligned_frame_indices/c", + "episode_1/head_camera/aligned_frame_indices/c/0", + "episode_1/head_camera/aligned_frame_indices/zarr.json", + "episode_1/head_camera/capture_time", + "episode_1/head_camera/capture_time/c", + "episode_1/head_camera/capture_time/c/0", + "episode_1/head_camera/capture_time/zarr.json", + "episode_1/head_camera/frame_id", + "episode_1/head_camera/frame_id/c", + "episode_1/head_camera/frame_id/c/0", + "episode_1/head_camera/frame_id/zarr.json", + "episode_1/head_camera/pose_interp", + "episode_1/head_camera/pose_interp/c", + "episode_1/head_camera/pose_interp/c/0", + "episode_1/head_camera/pose_interp/c/0/0", + "episode_1/head_camera/pose_interp/c/0/0/0", + "episode_1/head_camera/pose_interp/zarr.json", + "episode_1/head_camera/receive_time", + "episode_1/head_camera/receive_time/c", + "episode_1/head_camera/receive_time/c/0", + "episode_1/head_camera/receive_time/zarr.json", + "episode_1/head_camera/zarr.json", + "episode_1/pico_controller", + "episode_1/pico_controller/a_button", + "episode_1/pico_controller/a_button/c", + "episode_1/pico_controller/a_button/c/0", + "episode_1/pico_controller/a_button/zarr.json", + "episode_1/pico_controller/body_joints_valid", + "episode_1/pico_controller/body_joints_valid/c", + "episode_1/pico_controller/body_joints_valid/c/0", + "episode_1/pico_controller/body_joints_valid/zarr.json", + "episode_1/pico_controller/capture_time", + "episode_1/pico_controller/capture_time/c", + "episode_1/pico_controller/capture_time/c/0", + "episode_1/pico_controller/capture_time/zarr.json", + "episode_1/pico_controller/head_pose_interp", + "episode_1/pico_controller/head_pose_interp/c", + "episode_1/pico_controller/head_pose_interp/c/0", + "episode_1/pico_controller/head_pose_interp/c/0/0", + "episode_1/pico_controller/head_pose_interp/c/0/0/0", + "episode_1/pico_controller/head_pose_interp/zarr.json", + "episode_1/pico_controller/left_pose_interp", + "episode_1/pico_controller/left_pose_interp/c", + "episode_1/pico_controller/left_pose_interp/c/0", + "episode_1/pico_controller/left_pose_interp/c/0/0", + "episode_1/pico_controller/left_pose_interp/c/0/0/0", + "episode_1/pico_controller/left_pose_interp/zarr.json", + "episode_1/pico_controller/left_trigger_interp", + "episode_1/pico_controller/left_trigger_interp/c", + "episode_1/pico_controller/left_trigger_interp/c/0", + "episode_1/pico_controller/left_trigger_interp/zarr.json", + "episode_1/pico_controller/receive_time", + "episode_1/pico_controller/receive_time/c", + "episode_1/pico_controller/receive_time/c/0", + "episode_1/pico_controller/receive_time/zarr.json", + "episode_1/pico_controller/right_pose_interp", + "episode_1/pico_controller/right_pose_interp/c", + "episode_1/pico_controller/right_pose_interp/c/0", + "episode_1/pico_controller/right_pose_interp/c/0/0", + "episode_1/pico_controller/right_pose_interp/c/0/0/0", + "episode_1/pico_controller/right_pose_interp/zarr.json", + "episode_1/pico_controller/right_trigger_interp", + "episode_1/pico_controller/right_trigger_interp/c", + "episode_1/pico_controller/right_trigger_interp/c/0", + "episode_1/pico_controller/right_trigger_interp/zarr.json", + "episode_1/pico_controller/zarr.json", + "episode_1/valid_indices", + "episode_1/valid_indices/c", + "episode_1/valid_indices/c/0", + "episode_1/valid_indices/zarr.json", + "episode_1/valid_timestamps", + "episode_1/valid_timestamps/c", + "episode_1/valid_timestamps/c/0", + "episode_1/valid_timestamps/zarr.json", + "episode_1/wrist_camera", + "episode_1/wrist_camera.mp4", + "episode_1/wrist_camera/aligned_frame_indices", + "episode_1/wrist_camera/aligned_frame_indices/c", + "episode_1/wrist_camera/aligned_frame_indices/c/0", + "episode_1/wrist_camera/aligned_frame_indices/zarr.json", + "episode_1/wrist_camera/capture_time", + "episode_1/wrist_camera/capture_time/c", + "episode_1/wrist_camera/capture_time/c/0", + "episode_1/wrist_camera/capture_time/zarr.json", + "episode_1/wrist_camera/frame_id", + "episode_1/wrist_camera/frame_id/c", + "episode_1/wrist_camera/frame_id/c/0", + "episode_1/wrist_camera/frame_id/zarr.json", + "episode_1/wrist_camera/pose_interp", + "episode_1/wrist_camera/pose_interp/c", + "episode_1/wrist_camera/pose_interp/c/0", + "episode_1/wrist_camera/pose_interp/c/0/0", + "episode_1/wrist_camera/pose_interp/c/0/0/0", + "episode_1/wrist_camera/pose_interp/zarr.json", + "episode_1/wrist_camera/receive_time", + "episode_1/wrist_camera/receive_time/c", + "episode_1/wrist_camera/receive_time/c/0", + "episode_1/wrist_camera/receive_time/zarr.json", + "episode_1/wrist_camera/zarr.json", + "episode_1/zarr.json", + "zarr.json" + ] +} diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds1.npz b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds1.npz new file mode 100644 index 0000000000000000000000000000000000000000..4670316e1681f5fa385ef170e85c7f424cbc7382 GIT binary patch literal 138120 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 literal 0 HcmV?d00001 diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds2.json b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds2.json new file mode 100644 index 0000000000..c20f6a3f5e --- /dev/null +++ b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds2.json @@ -0,0 +1,1373 @@ +{ + "entries": [ + { + "path": "config.yaml", + "kind": "file", + "size": 288, + "sha256": "e4142ea4adc900fb4870b4c31a465f0bf885ea925ee762f8aa688db5cfa82fbb" + }, + { + "path": "episode_0/head_camera.mp4", + "kind": "file", + "size": 544, + "sha256": "9f2ff969f02f9dd114ead58b074424d237b6a2109790434998549c09f6eaae36" + }, + { + "path": "episode_0/wrist_camera.mp4", + "kind": "file", + "size": 560, + "sha256": "140f5fa6e646b0bc7ac525867ac191a2b8ea76ccc17b46c702daa36e619be6d6" + }, + { + "path": "episode_1/head_camera.mp4", + "kind": "file", + "size": 544, + "sha256": "520464427520ebe79e6c809f6632ca024236bb44f540a604f1068d5c63ea1fd4" + }, + { + "path": "episode_1/wrist_camera.mp4", + "kind": "file", + "size": 560, + "sha256": "fc228cf71fa912a8e41b9840c11fad07f032a8d671a008b42b6d90b38020745a" + }, + { + "path": "zarr.json", + "kind": "root_json", + "zarr_format": 3, + "node_type": "group", + "attributes": { + "index_source": "head_camera" + } + }, + { + "path": "episode_0", + "kind": "group", + "attributes": { + "task_description": "episode task", + "timing": { + "clock": "monotonic", + "offset_s": 0.25 + } + } + }, + { + "path": "episode_0/glove", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/glove/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a0", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a1", + "info_chunks": [ + 18, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_sensor_count_interp", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a2", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_sensor_rotation_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4 + ], + "attributes": {}, + "npz_key": "a3", + "info_chunks": [ + 18, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a4", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/right_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a5", + "info_chunks": [ + 18, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/head_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a6", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a7", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a8", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a9", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a10", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller", + "kind": "group", + "attributes": { + "handedness": "both" + } + }, + { + "path": "episode_0/pico_controller/a_button", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a11", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/body_joints_valid", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a12", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a13", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/head_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a14", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/left_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a15", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/left_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a16", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a17", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/right_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a18", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/right_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a19", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/wrist_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a20", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a21", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a22", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a23", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a24", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/valid_indices", + "kind": "array", + "dtype": "bool", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a25", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/valid_timestamps", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a26", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1", + "kind": "group", + "attributes": { + "task_description": "episode task", + "timing": { + "clock": "monotonic", + "offset_s": 0.25 + } + } + }, + { + "path": "episode_1/glove", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_1/glove/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a27", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/left_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a28", + "info_chunks": [ + 18, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/left_sensor_count_interp", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a29", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/left_sensor_rotation_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4 + ], + "attributes": {}, + "npz_key": "a30", + "info_chunks": [ + 18, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a31", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/right_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a32", + "info_chunks": [ + 18, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_1/head_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a33", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a34", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a35", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a36", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a37", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller", + "kind": "group", + "attributes": { + "handedness": "both" + } + }, + { + "path": "episode_1/pico_controller/a_button", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a38", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/body_joints_valid", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a39", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a40", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/head_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a41", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/left_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a42", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/left_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a43", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a44", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/right_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a45", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/right_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a46", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_1/wrist_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a47", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a48", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a49", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a50", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a51", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/valid_indices", + "kind": "array", + "dtype": "bool", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a52", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/valid_timestamps", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a53", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + } + ], + "reference_tree_listing": [ + "config.yaml", + "episode_0", + "episode_0/glove", + "episode_0/glove/capture_time", + "episode_0/glove/capture_time/c", + "episode_0/glove/capture_time/c/0", + "episode_0/glove/capture_time/zarr.json", + "episode_0/glove/left_hand_pose_interp", + "episode_0/glove/left_hand_pose_interp/c", + "episode_0/glove/left_hand_pose_interp/c/0", + "episode_0/glove/left_hand_pose_interp/c/0/0", + "episode_0/glove/left_hand_pose_interp/c/0/0/0", + "episode_0/glove/left_hand_pose_interp/c/0/0/0/0", + "episode_0/glove/left_hand_pose_interp/zarr.json", + "episode_0/glove/left_sensor_count_interp", + "episode_0/glove/left_sensor_count_interp/c", + "episode_0/glove/left_sensor_count_interp/c/0", + "episode_0/glove/left_sensor_count_interp/zarr.json", + "episode_0/glove/left_sensor_rotation_interp", + "episode_0/glove/left_sensor_rotation_interp/c", + "episode_0/glove/left_sensor_rotation_interp/c/0", + "episode_0/glove/left_sensor_rotation_interp/c/0/0", + "episode_0/glove/left_sensor_rotation_interp/zarr.json", + "episode_0/glove/receive_time", + "episode_0/glove/receive_time/c", + "episode_0/glove/receive_time/c/0", + "episode_0/glove/receive_time/zarr.json", + "episode_0/glove/right_hand_pose_interp", + "episode_0/glove/right_hand_pose_interp/c", + "episode_0/glove/right_hand_pose_interp/c/0", + "episode_0/glove/right_hand_pose_interp/c/0/0", + "episode_0/glove/right_hand_pose_interp/c/0/0/0", + "episode_0/glove/right_hand_pose_interp/c/0/0/0/0", + "episode_0/glove/right_hand_pose_interp/zarr.json", + "episode_0/glove/zarr.json", + "episode_0/head_camera", + "episode_0/head_camera.mp4", + "episode_0/head_camera/aligned_frame_indices", + "episode_0/head_camera/aligned_frame_indices/c", + "episode_0/head_camera/aligned_frame_indices/c/0", + "episode_0/head_camera/aligned_frame_indices/zarr.json", + "episode_0/head_camera/capture_time", + "episode_0/head_camera/capture_time/c", + "episode_0/head_camera/capture_time/c/0", + "episode_0/head_camera/capture_time/zarr.json", + "episode_0/head_camera/frame_id", + "episode_0/head_camera/frame_id/c", + "episode_0/head_camera/frame_id/c/0", + "episode_0/head_camera/frame_id/zarr.json", + "episode_0/head_camera/pose_interp", + "episode_0/head_camera/pose_interp/c", + "episode_0/head_camera/pose_interp/c/0", + "episode_0/head_camera/pose_interp/c/0/0", + "episode_0/head_camera/pose_interp/c/0/0/0", + "episode_0/head_camera/pose_interp/zarr.json", + "episode_0/head_camera/receive_time", + "episode_0/head_camera/receive_time/c", + "episode_0/head_camera/receive_time/c/0", + "episode_0/head_camera/receive_time/zarr.json", + "episode_0/head_camera/zarr.json", + "episode_0/pico_controller", + "episode_0/pico_controller/a_button", + "episode_0/pico_controller/a_button/c", + "episode_0/pico_controller/a_button/c/0", + "episode_0/pico_controller/a_button/zarr.json", + "episode_0/pico_controller/body_joints_valid", + "episode_0/pico_controller/body_joints_valid/c", + "episode_0/pico_controller/body_joints_valid/c/0", + "episode_0/pico_controller/body_joints_valid/zarr.json", + "episode_0/pico_controller/capture_time", + "episode_0/pico_controller/capture_time/c", + "episode_0/pico_controller/capture_time/c/0", + "episode_0/pico_controller/capture_time/zarr.json", + "episode_0/pico_controller/head_pose_interp", + "episode_0/pico_controller/head_pose_interp/c", + "episode_0/pico_controller/head_pose_interp/c/0", + "episode_0/pico_controller/head_pose_interp/c/0/0", + "episode_0/pico_controller/head_pose_interp/c/0/0/0", + "episode_0/pico_controller/head_pose_interp/zarr.json", + "episode_0/pico_controller/left_pose_interp", + "episode_0/pico_controller/left_pose_interp/c", + "episode_0/pico_controller/left_pose_interp/c/0", + "episode_0/pico_controller/left_pose_interp/c/0/0", + "episode_0/pico_controller/left_pose_interp/c/0/0/0", + "episode_0/pico_controller/left_pose_interp/zarr.json", + "episode_0/pico_controller/left_trigger_interp", + "episode_0/pico_controller/left_trigger_interp/c", + "episode_0/pico_controller/left_trigger_interp/c/0", + "episode_0/pico_controller/left_trigger_interp/zarr.json", + "episode_0/pico_controller/receive_time", + "episode_0/pico_controller/receive_time/c", + "episode_0/pico_controller/receive_time/c/0", + "episode_0/pico_controller/receive_time/zarr.json", + "episode_0/pico_controller/right_pose_interp", + "episode_0/pico_controller/right_pose_interp/c", + "episode_0/pico_controller/right_pose_interp/c/0", + "episode_0/pico_controller/right_pose_interp/c/0/0", + "episode_0/pico_controller/right_pose_interp/c/0/0/0", + "episode_0/pico_controller/right_pose_interp/zarr.json", + "episode_0/pico_controller/right_trigger_interp", + "episode_0/pico_controller/right_trigger_interp/c", + "episode_0/pico_controller/right_trigger_interp/c/0", + "episode_0/pico_controller/right_trigger_interp/zarr.json", + "episode_0/pico_controller/zarr.json", + "episode_0/valid_indices", + "episode_0/valid_indices/c", + "episode_0/valid_indices/c/0", + "episode_0/valid_indices/zarr.json", + "episode_0/valid_timestamps", + "episode_0/valid_timestamps/c", + "episode_0/valid_timestamps/c/0", + "episode_0/valid_timestamps/zarr.json", + "episode_0/wrist_camera", + "episode_0/wrist_camera.mp4", + "episode_0/wrist_camera/aligned_frame_indices", + "episode_0/wrist_camera/aligned_frame_indices/c", + "episode_0/wrist_camera/aligned_frame_indices/c/0", + "episode_0/wrist_camera/aligned_frame_indices/zarr.json", + "episode_0/wrist_camera/capture_time", + "episode_0/wrist_camera/capture_time/c", + "episode_0/wrist_camera/capture_time/c/0", + "episode_0/wrist_camera/capture_time/zarr.json", + "episode_0/wrist_camera/frame_id", + "episode_0/wrist_camera/frame_id/c", + "episode_0/wrist_camera/frame_id/c/0", + "episode_0/wrist_camera/frame_id/zarr.json", + "episode_0/wrist_camera/pose_interp", + "episode_0/wrist_camera/pose_interp/c", + "episode_0/wrist_camera/pose_interp/c/0", + "episode_0/wrist_camera/pose_interp/c/0/0", + "episode_0/wrist_camera/pose_interp/c/0/0/0", + "episode_0/wrist_camera/pose_interp/zarr.json", + "episode_0/wrist_camera/receive_time", + "episode_0/wrist_camera/receive_time/c", + "episode_0/wrist_camera/receive_time/c/0", + "episode_0/wrist_camera/receive_time/zarr.json", + "episode_0/wrist_camera/zarr.json", + "episode_0/zarr.json", + "episode_1", + "episode_1/glove", + "episode_1/glove/capture_time", + "episode_1/glove/capture_time/c", + "episode_1/glove/capture_time/c/0", + "episode_1/glove/capture_time/zarr.json", + "episode_1/glove/left_hand_pose_interp", + "episode_1/glove/left_hand_pose_interp/c", + "episode_1/glove/left_hand_pose_interp/c/0", + "episode_1/glove/left_hand_pose_interp/c/0/0", + "episode_1/glove/left_hand_pose_interp/c/0/0/0", + "episode_1/glove/left_hand_pose_interp/c/0/0/0/0", + "episode_1/glove/left_hand_pose_interp/zarr.json", + "episode_1/glove/left_sensor_count_interp", + "episode_1/glove/left_sensor_count_interp/c", + "episode_1/glove/left_sensor_count_interp/c/0", + "episode_1/glove/left_sensor_count_interp/zarr.json", + "episode_1/glove/left_sensor_rotation_interp", + "episode_1/glove/left_sensor_rotation_interp/c", + "episode_1/glove/left_sensor_rotation_interp/c/0", + "episode_1/glove/left_sensor_rotation_interp/c/0/0", + "episode_1/glove/left_sensor_rotation_interp/zarr.json", + "episode_1/glove/receive_time", + "episode_1/glove/receive_time/c", + "episode_1/glove/receive_time/c/0", + "episode_1/glove/receive_time/zarr.json", + "episode_1/glove/right_hand_pose_interp", + "episode_1/glove/right_hand_pose_interp/c", + "episode_1/glove/right_hand_pose_interp/c/0", + "episode_1/glove/right_hand_pose_interp/c/0/0", + "episode_1/glove/right_hand_pose_interp/c/0/0/0", + "episode_1/glove/right_hand_pose_interp/c/0/0/0/0", + "episode_1/glove/right_hand_pose_interp/zarr.json", + "episode_1/glove/zarr.json", + "episode_1/head_camera", + "episode_1/head_camera.mp4", + "episode_1/head_camera/aligned_frame_indices", + "episode_1/head_camera/aligned_frame_indices/c", + "episode_1/head_camera/aligned_frame_indices/c/0", + "episode_1/head_camera/aligned_frame_indices/zarr.json", + "episode_1/head_camera/capture_time", + "episode_1/head_camera/capture_time/c", + "episode_1/head_camera/capture_time/c/0", + "episode_1/head_camera/capture_time/zarr.json", + "episode_1/head_camera/frame_id", + "episode_1/head_camera/frame_id/c", + "episode_1/head_camera/frame_id/c/0", + "episode_1/head_camera/frame_id/zarr.json", + "episode_1/head_camera/pose_interp", + "episode_1/head_camera/pose_interp/c", + "episode_1/head_camera/pose_interp/c/0", + "episode_1/head_camera/pose_interp/c/0/0", + "episode_1/head_camera/pose_interp/c/0/0/0", + "episode_1/head_camera/pose_interp/zarr.json", + "episode_1/head_camera/receive_time", + "episode_1/head_camera/receive_time/c", + "episode_1/head_camera/receive_time/c/0", + "episode_1/head_camera/receive_time/zarr.json", + "episode_1/head_camera/zarr.json", + "episode_1/pico_controller", + "episode_1/pico_controller/a_button", + "episode_1/pico_controller/a_button/c", + "episode_1/pico_controller/a_button/c/0", + "episode_1/pico_controller/a_button/zarr.json", + "episode_1/pico_controller/body_joints_valid", + "episode_1/pico_controller/body_joints_valid/c", + "episode_1/pico_controller/body_joints_valid/c/0", + "episode_1/pico_controller/body_joints_valid/zarr.json", + "episode_1/pico_controller/capture_time", + "episode_1/pico_controller/capture_time/c", + "episode_1/pico_controller/capture_time/c/0", + "episode_1/pico_controller/capture_time/zarr.json", + "episode_1/pico_controller/head_pose_interp", + "episode_1/pico_controller/head_pose_interp/c", + "episode_1/pico_controller/head_pose_interp/c/0", + "episode_1/pico_controller/head_pose_interp/c/0/0", + "episode_1/pico_controller/head_pose_interp/c/0/0/0", + "episode_1/pico_controller/head_pose_interp/zarr.json", + "episode_1/pico_controller/left_pose_interp", + "episode_1/pico_controller/left_pose_interp/c", + "episode_1/pico_controller/left_pose_interp/c/0", + "episode_1/pico_controller/left_pose_interp/c/0/0", + "episode_1/pico_controller/left_pose_interp/c/0/0/0", + "episode_1/pico_controller/left_pose_interp/zarr.json", + "episode_1/pico_controller/left_trigger_interp", + "episode_1/pico_controller/left_trigger_interp/c", + "episode_1/pico_controller/left_trigger_interp/c/0", + "episode_1/pico_controller/left_trigger_interp/zarr.json", + "episode_1/pico_controller/receive_time", + "episode_1/pico_controller/receive_time/c", + "episode_1/pico_controller/receive_time/c/0", + "episode_1/pico_controller/receive_time/zarr.json", + "episode_1/pico_controller/right_pose_interp", + "episode_1/pico_controller/right_pose_interp/c", + "episode_1/pico_controller/right_pose_interp/c/0", + "episode_1/pico_controller/right_pose_interp/c/0/0", + "episode_1/pico_controller/right_pose_interp/c/0/0/0", + "episode_1/pico_controller/right_pose_interp/zarr.json", + "episode_1/pico_controller/right_trigger_interp", + "episode_1/pico_controller/right_trigger_interp/c", + "episode_1/pico_controller/right_trigger_interp/c/0", + "episode_1/pico_controller/right_trigger_interp/zarr.json", + "episode_1/pico_controller/zarr.json", + "episode_1/valid_indices", + "episode_1/valid_indices/c", + "episode_1/valid_indices/c/0", + "episode_1/valid_indices/zarr.json", + "episode_1/valid_timestamps", + "episode_1/valid_timestamps/c", + "episode_1/valid_timestamps/c/0", + "episode_1/valid_timestamps/zarr.json", + "episode_1/wrist_camera", + "episode_1/wrist_camera.mp4", + "episode_1/wrist_camera/aligned_frame_indices", + "episode_1/wrist_camera/aligned_frame_indices/c", + "episode_1/wrist_camera/aligned_frame_indices/c/0", + "episode_1/wrist_camera/aligned_frame_indices/zarr.json", + "episode_1/wrist_camera/capture_time", + "episode_1/wrist_camera/capture_time/c", + "episode_1/wrist_camera/capture_time/c/0", + "episode_1/wrist_camera/capture_time/zarr.json", + "episode_1/wrist_camera/frame_id", + "episode_1/wrist_camera/frame_id/c", + "episode_1/wrist_camera/frame_id/c/0", + "episode_1/wrist_camera/frame_id/zarr.json", + "episode_1/wrist_camera/pose_interp", + "episode_1/wrist_camera/pose_interp/c", + "episode_1/wrist_camera/pose_interp/c/0", + "episode_1/wrist_camera/pose_interp/c/0/0", + "episode_1/wrist_camera/pose_interp/c/0/0/0", + "episode_1/wrist_camera/pose_interp/zarr.json", + "episode_1/wrist_camera/receive_time", + "episode_1/wrist_camera/receive_time/c", + "episode_1/wrist_camera/receive_time/c/0", + "episode_1/wrist_camera/receive_time/zarr.json", + "episode_1/wrist_camera/zarr.json", + "episode_1/zarr.json", + "zarr.json" + ] +} diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds2.npz b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds2.npz new file mode 100644 index 0000000000000000000000000000000000000000..ee91d561301623ba2dd28ea3c8d8e3c24d68a0e8 GIT binary patch literal 78629 zcmcG#Q>-{Zv+cQU+qP|c|F>=1wr$(CZQHhO+xJZFIXC%kGMT4YNvB@=p^{bg(*0ZV zQotaz0000G|8)of`i$~z{{CBF04M+k40N{k9)JJ{01QC?b>Y9%3i!Wk);0PiHp0ZX z{HT0QZlY$kcCl?qzHO3eL2XffZmOQLVsbiqo?dby6q1|NG^H$PB)S<1S~1WERw)@* zCKpr-)G;ufL(-ZPCKns`y$Rl&0odXI{o7U}pvB*eoH0khb5rMvUweSFY4D~AA3@J| zvPcy{eC+mXixP-L7%oRH5nS<3jUj7^|Ff|089$SNreM`|Bu_kDPkgfiq=a6%S#AMT z@f{h2yCuK{vbXBxrhwuU+ zDVxBjfLcj2Z#)}ARp%MRp`MY)IZ*MRo=x5@T=Cz`4#Ntx#2q{8!~^K!heDtuAi>+7 z#yu~D#98|$KLqF^v#PExCSWnY?AcTt*y7f3D)fGyad;{{PQN{FkDr|94GEd*esj{ThRW6{U(O zBoSr8DzAnPDHc&w71|&sDKH?jBQ`D;Axf}L@Y(RXQ&IEDh~RC^$;=WT!6g!)_w4O(j+l5nwDyN@&qSkf$6A(Zt%{^HJBcZ{)v+KDL;=LZ zVQEv`D(gSID*P7{8y|4|%FcS?149E+oNZW4H@34z922Wx7UZnc@ViECb&n6McswDu zZ|mk00}US9A2Uf__^uBkd}F{;P(h&bFJS=j`5d3&Ex)kC@ub79 zjj5PJ(?Lo?`?yp?*)L9O{ zXOM9|2Q>pv3O`JIR;@^U*{lEJYPVr8UvgD2cxK3?zS0R8_S8b>yZw`EUQ$w@*ufr8 zF1qS_oO=z7d`lD?9+w7eB;^5;^VD)a?DqXC;0d7&*Py4%4g+!lTobzel+n0RQbx`I zVfuXzkB5a9WOVs#tL@@5px3X}VYD4>Ix>067*d0vRsQWu%?xYZ*Kig%6fGQ++4oyM+zD-_u z66^I^cf}qrGc**W=-rDQJ)er7%0t%~??WkLCX^IAKLDvqCIo%pv42>R)QxyOcf6Jr zM;mZrGdC@>CNKYZFgs7j6x80GM|=KbKHw?Fk-nOj0*dVJ(*ec-hG1%BuKIDzEM8@g z(BdyhBVXoNcbQc~=#~+ykGPmd+L!u-1sNBFEqs-e)q!ixN-*98ZtcVGr!0 zj@l(ivWH=&oXz3cku^BGR37uA4ud3bc&2PhE&yNY8k;dfW!aLN!sqs%NF?Pd`A~Q3 zdv#Ooe4-@`CY?p_M6WD(pPP--cjT3O)zu^H=};EIX|*ngM-}9{n}_rHH)ZG?Bh(># zUD5)p)DU5m3C{XY$EfQ_qW;i6(~Qan;4-3zvcA?2`~=_MbX|{nf2<2Eb{Tkz{;+%S zN0$QJ_M%PsAC6=wnvUKVdP`9M{k(S3v2Xi#1~`o+_(ptE8$9ZbQK*phcxF7FI5MFLZ^`nE)R1-yX>Tn9ciz&lCiO>&ygpMFLaBAdcA*YlIpX{i82pEj1P^63cVWbMQ`!?1;vLE(vUtPjb=;)w)k=yG?es+JCD1)~l zIpzIUN5mcHD+I-54?y%)|Mu;UW&ao1>E5!E4p%y0vN-(2S!`kf1g+VY)=S%ROM3cj zMGT-sRLS_0VI00KA-Wl8URsM7G2DfWkM^c5hTiKIxl%pI>x8xp|E54k0mC z9jrCBt%RH}w*-_guXvrJ2x?7Zv_vUgyk&*Sfp~82A^BC{mPf|lK2l4+Uc4FDKPIN5AnX!$obAsZ8Syv}YF&*V>Z2g#4_>>L5=T4yKWU_l_` z-Veljd6_}oBHO^}B|s7mTi#gR7?Fl<`2@vN6!|9ff{qd9NXFymn1>k+oU1dp8&aR3 ztw*qhUY;QL4O6|nC|o*>p7Yyoo-H`7n4mS?spS3L?IC{tZG3PIVx5LOzr+PO87-X? z1DH{~D(PkI^kBjPwi;qJ&wb1`wF${gjPLW!-m9w_hxP_;_26$4M6}2d)Wh25gG+&% zt2BJg`oIDiN(whb*9U6%Y*QMMu04{>$-SR*n+p3EQ5l+TF7t*HcTXUVF*ttbpUr3m z^me){MHm5gx#xw{E1&ml;zEjAb1Wn1Y!%R+2z7D- z@>X=U|;a?fRhsw}m%!qbq`t0~@99 zAp`r2uj8bitoPSB;w%o95@daWoTa;T>lF)}{7N|Fdxo%&!)(_C4T|JU46GUfA5QZt`A@ZA%7R+<|^0zHP}?)K;+M@FP5`hWLXXr2(6(LlsKZ@jfNn$z!{W1kBy zNTsbum{^yH-E;Z|*r)0?JhW6 z%adRCwcQP|&zk5@<-;WTG=t5(t}*;m{298Q?~=8<=93h_Tm2P(JuHe=iD_7)R5bD3c|~q4j8>cnOj1 zJ%+Q!FEo0W@;wrz= z$zjhx=O-s#H`3s#`$l!IePB^=obI1pvYXfvfk;D<*5O290SC^PV&&Y!kk`tJD|Jb9oWVj#W?5Y{ z8YhoB7w%v#WyQ5W_k~_98-4GqUy^*>6z48hv+7?UOx)0M#+I<{JD@wmid#wdo6+vw zjZ8c~>fAh<$9Q1_B`)%b<2|kW{?Er542J$+;!~^UfbwfWRIL@d#MNIUC-*Mc)`2PU zADf#0OHifHEdIZV39V|suu02%ZSouQl|_(QZsU(OIof=?vj<#ut{~eB$mGzDn0v?y zvTD9q!=;qoI4vm^^^=atjK-DFr!zC!Tz6Zc?iKe3n?8Q|33~<(ZYv0(^f)R_vzUID zt%b4$@KptJW}fbOL#%8*zm`UO$ies92!6IrV+nU|+mGL0kkHv3cMIx&+Y3%7S0)=J z2D1l-%Vr4P&&R20<27~*l9H9ZAtX#1IwFP%l2!12O$6La#?`qu-=?5V-t2ruRe5lwva zS8^KWw%b66zbj1Wz3hReO5iecC)p7mJm0Bv?jfNVqI5+Ax;pB?1r^;r@OkA(duRH6M~A>&}qs;)@q7t^mA_c zsi`x3>kr)(FYI`rrn67U#P7U8J!9~51D0m?kv+bzGjDP5YOWb=WYYc3rZ5|a2z%_C z7!IK7JdrhRC!lw6V*yPIz8OwVj45`tOdiE*VGNg=I&VMF^tI|QE70OZ*X_HRvAUK4 zn+vqb2TQKx1$&I9axGw@Dc|XIUorttu3Bp9_TcxyM(FK0N5y!)7mkNp5)JfM4LJN< zaT>V4^pgYB&@F|cJrQnDFpv}LZkC7vxPubV7vRI3DJD6VBq5KB&g~a@i z&Y+Nj#gl1;!TJYZ1r}Z%m}o*EQ9=4FgsJRMc~7M*1eBfxD2;2t8c}4mQQ7r29^T@r z)Jenc9lGHjUWz>Kt**nj++1PkJy$j2CfWN}HMgGT@ZC;z1SHP{Kp?ZumC0CkLIsA$ za!<^NF^S!TyB5A%_S{5GZ+^MtJ;i(SE<|ZJmfw!?fn=vw!D-r1K29(YZPq zjxVajQ?8WaGo0m(jmwdTluYC}`-lu54HN9n%i5I-GP5?}-FYZewaRh)2%ZcebR znIh!vTWDXijBq({-N<8I!uBN<0DqYbh;}<9A$H!;VbRFn=&Mnk588xZ@-WRk=O6PO zGu3uTj=S?a?9EECMk2=;9K-mxBR#J_=d=XbJ=;r#90B+!!mNJQsl;9%0>X=yhx9Aw z*Re?$A{LT5hdM-~>VtjeUL)NM?M)3McKRfFsC|9^$vDIH%GdE{OzMq6sT#%nz!gYL zU9}t*_eS;^LhZEQN(+RW45oQ(_&&4HFVGj{r{d80squQ-B972}`04WZK}3+R@RR#e ziIeS-|I4!zF}UuKmu%hJ8J}8t3!*B(KLO<*&HY;qwvFX8bQOlSf2&-6EGQ(Dz;2&8 z*A@@tu1jWB?<$QibfQZbE`}adHp7Bvlnw|vIp{g1M0W4Kxjm3xBMe{uHmde5=15Pf&88$h(3lHpz12DYXWOUzI%(nkZpv;SmTK(Z zi{DgRTb)p~J399c4H}@BZ6hZ#N~T%!xzfR?oT~^Y>`DZ67-?@urNyAKx3SkdBpdx zV!*1oa&8?N3;^JRL*nQ~EBm)!1_j5lu}n_q-EzWJ!WekU>uF8s=GHuUBZMp9l!-sG z4Qx*VTEf?4HYI|8=ayMeC@lr7e#l*9Q#^Qlj;WJ+J%|`n&VSkj(?x8ON}s2_t+;v( zgy^lDF~5tPhh{(G^_I{+TO(5(6^(*KrVs=_Fjm`gHgh-pey>4 zYD8E0eNVEtnv61$P3t2$S#AgGXxYD1a?83|fWQ7TU&82_@})afDyumlZ?Y zthYxc)|jLMUXP^(Sbs?0)W@|-HaH<|I;Vl_tg=ghWF~W`NCoK=UOk*Jw_=)M^xi_C~|{U8&3CdHpc(wO<=tDyswY61;RBG*|;5@&sLt?Jzrc zXDQ~|a{3e7lcTW1!Ww*@mCwzGF}(AQ!jUJgLIDHRVLh*4_YryNHyz0^X_1Atf)f7@ zMIi;bX5tv<>1e;?AJ37(k2yfRTQmi0qn4otK7j2big~}^9x)Iyr`w%iI}2DR#sg;z z;l4k2@yl08gr*AG^PQNP)1N1E)(=DkPKSFny7-aD?=F87X4_HQPWdr4;H&#_*+3^a z1{}O+$ah9QY{BBZeSC}AqWmkCvFW_Rf%`uV`T6HCncm+pnJ`>gfWKaLFqeIe>z8Zo z!=Z7;zHTDJE{QV}Ze7o>4wD7j$uRXX-pde1MDJK;XyFYdHo+Hh&LE^OQdL!;xy;ahZ1$lM3Gw`GXLHSHiCJjV)-s? zo7!EfMQ&Vt98c{kl`bZ9{ecx{tzR z6$2Mpuwy+Oo}^P7IEx@m=~CHI(+8S$GsDnvcRXdsUI1RkLtdwzm-F?@gOI5ix(9oz z=9BmjWSV)QkauDGf}%5EjkwdTUsX zHNRHC&CWn6WY$av7LPbYa-JHv(`SA@e-bh&>-`*7OfW*g-f5*NOM)D4bRj5rG65w> zHZhhiUzqn~$!1mApcG!&B*nq73d!(^XRiw~DRzKHyKE`<$Em$34z`y%d@j{NQNEZ^ z)YrWEiuVA);`TBEO8-dQmHMVU-D22MwkMxM%mKfFm$W~^5S3>A>ijr%K`ZyHR%cSL z30}8B)>s>pF@*IX_&4xDNWxMl?4^U^1|&UwSxgb?s;yG>+JOD6ADhIa6Due_`4(AY zw-onvpT*$kb@p>vZ$!#CLSQX7<<;VU2MysHQL1n^1~d_R^7r}j`?e&VSZU7*ErwG% zD29SWrM=Ze>}-rS3Pjv~5MSim)?~X{HDYq%VDRZoQ;Fwj>@=_Xm=IXlEV-OLvF}ft z^)*miAQG*PRcJ=@?BjZ5-K)2t|AyKz|H|3|H*xD|Il>wz|M_Y*|31?kw?^6cD&z>J z4Nlq4iH!yb2W0&OzH!N-p4@lc+5~Yg#ARj}fiLi_wWv2$!Vlfjx9WCmMW21Qn_0iC z_0MQOtp~y9xDW2jOlMDFt!hG%SFcAC_;JIEYwW`me`0ud>h<`ev%p`cb}m5}t0MpI z-}l*W% z;;gXrtiZ34!|ea8tD(Et;3M#a1;?mEai*OFfs3I z!CH=;CC~g~_hX&)T#M16B%<&7m2Z5tLE71NyFSoo0Xrto9}4)=CL=JVehHr%q-T{$ z*yv+n{nEr>L8IrxW%=>KGb3Wu(DUm-$qkm6JQzOh0M9qRxKx!pcYhysn(aP=a50d(+#_)Zv$FD3GB?2kZY!I+5r2_>EaQ*yUtF&u!_csv^{LzAc+-}(^+fak$-*9}i zQ<*;4Ckh+s8}xObsB5~H@`Zb@RU*0hYym*s&7Aao@iRC@l9~;6g-(2gIV~dFBs^dA zd1%=Li@wywNtl=z;2LyOi%S!(ubaEA${Uc~+ZJcb$Sx^%$d=Wxk}*7@q$HMM0NBd`{hY>uJ@9_%>WT7(kZr(&(sCw8-`d~8iQh(tA^{h! z&{PG$E682D+Du8Yb|!bfb}fblHPFQGbNO)pR&3<=3O{(BG-(E|JX&uhcii0bPB0u> z=U2)`I1;i{6zN34Hvh+?TMNqrd6zW7&2>ZVhY6BPKd?129NO9iY@UwwJpMV37LAdOj3PnO zZ`Q}YtEgPHPr7v`TE`P&Mvc_lCu=1xPWXk~x9oRN{nljWAqM>}^R5FewM`Q10P?wo zEju_8w--ISHg^BAq;2al>+qdDlFZ4k-aNNC9Etb{?IdEygZv7Nh!u?1=O# zX5eo(*3c`|L+bPe6eg*c(SgPUEs&x@kz|!z@TTs~&-z7iAN}USMEM2`3EGW%@GpL# zV~_Av@rQ%~OV^83PXRD2Q)YQXSW2JRK<`b_8nY7D@o+gWqu;8nyf23fC&(kPtAwmb zJYP7%*H0b+kp7LVr}VvRsN@x#Ov~nGd}^9aN{1y4g6TUf?VbyA)s($e8q$hdG!4$ z4%iNyqjTdg|IAJdxhsmjCH?dL^w7&hh zUfsqKB@(FfhIlX5z&C=O{s$8X4P$$k-UuzYOG0TXBu~77laIwj+Y}Yg`wex`5E72csqkT(oe)|{`OzJIPnh*PVRcU907vh#9(t1l@-Jay@vC74~_VR z+U`uR&X9!E1J!I*6u>7B6aGpZtAT;V5c5h;lRg*41jbW7sI3lm!Iac)}3@?^IMUCpSs1bI(Do>B|ZX>Gm_TanNk(=|VwyOpnIm zwfMZ%MOx2N4HVD(p<`FC4}vb#?E&|_8R%kJ0TN|60^f)EG3O6Qy7L~)Bo7}5i%sdm zUaM(5;xryaFQvb6@5_+nYe;_Lt&8Q}B!M@A+Odz-5-4_B;&5L5jNuGl(*iIP2nEx@ z`5g{@e{Sc@0KPR~{6Jpnr8gaDYKa_|qU9N&qya?nMW#UWiJsc`g~GfMXGI^=21tQ1 zb==_t=5(JiwtZI{v}**e-y@|Yp(9)6)kaKHaSZ^Vp3w7VihuI~ZwB*JXXm~ZwF z*`y9DUG9*3L1Wc{_Yg$xv7dg04l`6My>t}p8d^czO|Wv$F2?Fep1HzG#;`_ik=lyT zS3-53&nN;#Z*B(%#9g717(7`tKppJL+d(|&`*6Ce%T~DJ zVu-cZr9VMn0YFMvG7BJa$3HO7xoV;CK);3YBSGhESPj?7JK%zu%PcY^Zm#tzL3t8Z z!F=L6qbNZ(uwTx!Mbeg`9o>_9Jy$9BqX=M%&jf{cQ37ZqdPIy+DJjt*ZUY(S=|=+) z%&287ZND?*_`1&h<)arqk}s)G`>>ni+64)yJ6NV`g*C(AOb7Qc7R4806?a?j^A~L< z#EdvD@UJX*;x}tJqrxqcc0G^Uk^4@3+i<8GnWJ=(MDPNmHFIuzFH;@H4escylQ%_` z9<}_<^1N|NJ!n)h%ek*g&Hk8&tunR;&2+s_np}eQAk<8|8(C^kBgzdmo?|Ec(`#5a z_*JT)H-iOgG|i=Ut&#+pb3xcj`op%owQvp(HuCP%dm0v8Uu{0*6exCDc0E0LJJF~j z{+e3QS|TS?_vn=X&T;K(6yBdUz*gHHluk;~L8ZCff3lGY3nZLpuALu19C#jb=yR%o zomGTUpzNdjIcbzD0lS(oA2|owUshPU#xd|<5 z;c#Swr@2aPFu1CM(>6_hPL-f(DBIeRLE;3fBvXCwM(iA2VM=4L{w^9(MpKNiG%}-Oq{KW*)E$wXffuHUHiYscCwM zI))R~@W}g+QoYZVn#$S)(wL~Qg%7!TC(byrZSvaW!u-0fy>86E6nv)wr8B85nQyh= zbUU(+!)1}hC#9<(A~=RPdb$cJ;s9I0wS*WA6JyLRA=)3Bza7DEC6k}EKz(r27@nQX zv+Dt;T3)KUi7pEH5gYTWLh_NI&K zt=S&l_O|z{EG{)l%KbIS`QyNVH0z^lnGQ(HOXcnSGNVp^n}C1I4+@r5ZN!!8bf0&} zkISuxH38`CSJuBBnFSmT)#XJ=s-#EDb#|*8%=Se=D5Oo>ZE$ux@t6_Z?mY03cnDhk zh`9TtYl@O~8FS6UT2^4B|LNK+Ph}|wOZr|Ndl>ln0$&94qfbON(5%4(4oPp z`6SWl`=EIJPIMW|+SwkZBt_MWT$heQ6Yv*1A!C(I7bLQj|H3==sSh94auigDEAWzY zYk9h);r<*tN5X51NmdhA|FD*3_!5d(7v(_h&efUbe!3FCSLMqTQG_WK87VBj{b|4C zwL_F|3<+M*7j8D9D4ALsUk5z`FSK_ve+06pvfbjRG1k!p#w0{VUG}<&GH%bKAos-* z*E}`5*BKHyKcFTS(&2+6oUUGm33n=2Xo0Hk+0(I& zv<7##DibFWMpK{}+Z-l4Pqvz{46T#h6>p+FnD#o!5jk_MxsG=+Iz)A2-Nm()Z=JmH zH7d+hiyX(nEZPR#5}2;n`2^9p$GIR~Nh!QlN1Lhq?Dz1p`G_7Bsu8_^k^Ja{9h&Rfq$uZcj4NsdB)aPVu^Z_r)CfFJTNranaFV z+_KjD$N}0tIhy>}tp~=)xrt5P0CW$5tQ!e@w7&F5TY=;a2FCX4E)^Yb1S6)OLiHB0 zp7VN_|Aig{iwa5HeHe-GE7DQ!alw&i)Z+Wn4lCrC))TYfIso?vb8v|W=!wJH0PU5_ z2Yd8pMy^{^cO(VvC@UgOe8J+0*P%EcfQiY~LeLo>1c_o<7bB){Y+r4X+N7!f-GP~V zrVHTk*>a-dOl@J2mM(pd5w-8k`|$B}tN(0lL#c(t^x$-gCkElq*Bfl$&u3e>zoy5l z+(svyLAs)Yg<=dU0>NKroPPr2oqT-cnz1{w7K83#1e)LGs$IH2*|` z?~O{Foz7*lL7Mg@@JqFTscjjh_>ot-1`j6`E(B@>^GCEiekF~2EET@3@uvMTZWd6l z;6(Ug#3Y-isM5MrbhKJr_*u;BwEs?Ssmk{QYa4<+q9ZLMJh6<$GZM{P zetqnB7C(R$!U?t-qd+(8_>%?RtP`ibwAJpN@`XcpdhbWduo3#@QH93+WmG}1+osKP zkAR0E`>d&(16CHkW6)TKsUg5MO~&(#B~u#ox>H2~#4Wm158^~FX!nRafw-8>Uh(jy zZ*vns63LN2G_*AT=AYpH%>tk^SNk(B4+qZqtoNOVw;`SjSL(Z)*XxjwwpndFMv1XQ z+Nevz($xCN*Y$N6z6g)?mYGSuQi$zTnYK!ynZgm&OfA$R(e+!7r}Uc{M8^vkkavlg z|KU-KmIL=MTRi&#f0)&gdGc-ZidzG)N*k?C|;6=qVvm*C)CxgnO?G8-s^#))^ zK+yS?>*wCXuq6#ag|WKqa6a5#eg5|wMftn9d;KXlG|mF^LJSEK15=*Y{I5GA37565 z-z)CWr|^)cP+Wxm(%hJt_a{CaHhm0O*$ZI}>_UuN7(3hT%XQNpw1EIqySWT2pb6ja z&Cmv7Dt4;8iV(ST=1q-Of+By3so7I74ezmZ>2338N{IctBtbkrt;Z~?D z$aAq)$7d)@z@2JpRgOz({pCF4QcSOg^S0I5g>O454Ck0m9V$uD%d*%8aVc5&TsRGf zOCKama-pMNPxk1F+uB#^8JItn)2n>57i{(!qp{4CZD?E}zeNpROHk3!UZ5i>5RccP z*Sxwh++o};+(%tra5s2bZSS28fDh+mssFel1yj_xZVBUrjRFuS z6sEG4ovOlIq$}Ce35qu@xwgYELxh;8_?8gHqM*1JwNr3%*xcu*q)K9zxd&e%V{{`{ zZBAv)mx319AMk%7ygm6XApe2zGW`$2i}2r|w%-3Hcme)jfNhKaPhdL~?f(GVXkZZf z!Hd)KnGq6v#BhAjSg=WE0!Pe65&t(?tkCgK<3HMB{-3t`|C=K({_mPIe#49mfYbj# zq85D2lcVgksE9N~Ix%-qn-rG7;V_&^=wT_17mGfTVBF@U9--t$rds(l&svK=RAP`Y z)EE}MVXb&g(qVa_cm8$zRY4{m8Z3HsGrprBAzf^uSA^UHDUwG*U&tJgo-8?6pu}{@ zd=b&?=NpiiDzo)^jq(r8<}0qlgA_?{s7gr31n|m9qDR! z+OTeTma9kt;*86E+cgs9yOJxSPFqXRs;X|D&1xVT)l;bWa=15&ChKehx}7?fP8K>9 z_%BpEr6dSx$@~qD>RnjAggZmruK@~aiQLBZ7AT$is62*hi}9qP%}$LBJ)?wlS}e%c zm;`(zm?9a0E<*ZUQqSLQ&nahd!_%jQJ}dEX`k3HLAS?3?$)KZKXdHFIpxL@1d*fiQtikw*CE;HgbIQ+?J*3(kwX?W>BsG9e|$;3chw$| zraX>JSd@um=IiCIMiGEj^padc2gu2{E&u3+<@(CO?npspUU?5)JTp5)IVvDJ@~5oS)gl6`JRUbx1ba!5Q-TaGNPXP$5tpQ9F^3~^fTZV=$j{eu2POQRi zd_QQ^#hPEARp3#jsQCL^KEn}*+LA?b3G_;R=ws2VT?JNa;@EQoA97k*TK?M)hA38C z=YXTO|6Kj*#3KO12qiXh?~v6Q&r22SpOAf(g|XE4Q@;L_mf zrPkHQ!Yjt{Zrs|TrGNcEE?+Ny&1sbn;L4v_JC&AD{U)20-p<^#%6+eI31U}B8K=} z8YhPajCj`*^)?|S32sPMmMH*>BRmCo4+5XokG5o__|uAouWF!T^%3syIn8g2h(>97Sob_6}6J3l#sAI%+uEckfe7e1pX{&?LT-%@G_3Gq5k3uGwA zKHXw3>An*xpf-_$apl`D?1ACMPA2J1r>s?)jp(J(8cH|jl5;xi|fE# zbQuAz*W0a(8Ue1O=ZH->0v`?wUjz1dxHmc1Yv4sZ>SYr$po^c2&pk3=3+RLu@KV5w zr@qy-IgrIH%(<@_z{US7Bhj^P2Js(mv;L3U|C5o3{XZFr4{qhZuQ3J6lEqr(RFTQd ze+9OL%9pegisdvVGOvX+5%Pt_G1Y_{O`@qHfwx%$nn`3Ws@3~jsj=F0f z2igDiQvUYz@NWOHNs3D>3r8Mnc8Hexdg^)@DRemLCL1XQ6|v`GeWvfW^?7Q<4L$Y8 zz1IFSzw3Ciy?fajb29lv*pZYdG)5W{TeFRnC{!!-_h;oJK+^_-F_+(Be9zlP&s<+y zSmxm83xE3|0jYOhJ9e2!9z;0o>HU;5w&{`xf;=*1ZHG>TljXsdG@k(}6k8UZ?twDS zC(r19qlF7*_Yr5cSqiQ8wGKSg0xqKKD9Ll36~Y|`qt^|H1;+W>p1phxI_qXb>75`Q z?@}$L*v${?RJAw*#;0gdXFfg>8tZVZTLd^4IT((CVv=o}8{wx2~d^Ml}6O)%A$+a8q8b^1^JqBYKcf5JvXp6LKxp&Gg zXe=Z?{?zFfi}H*kNsqH|2Q;PqqE(8B(%!L;HI0(j-yp8&QkJ4wz}#makU2VhlxwNN zJS?JKSAqLuVgz?;uKu^;kUwN)Sks(tN8Ww#rA8-`9R`}iTochZcz-Qi2&<469@%-c z-F4H+c%STMxIIV&cl$@_RumSA2kOv`PxZ5K>t-Ivt%mGQb3@@Vi4PPa)q0le?Cif( zcGbhQDEQ=enq4T@c@AloMKinZ^ZGlnWTmB9n*Jb>b^@LDwx@3r7Q3rWqhdpF@V9BALvOHUP zOtWY*XVa&=8f!~dl`|ZI`7S=&D#%2CHfNApC=pjMP^*fsqTT3b!9gwj1 zRz>3M`(fPmj{x}wp2hWsmpMWgumqdmfPZy0bk_6yPgG|j$#Sn+Ous5KudbB+NdiNxGi) z+jKmQ7wT=#x3RMEMwHH1X_;>+v=|+F4K+Jdfa@zOnzROSNy=kw3qy5q_;)TV&lHZh zt-;YqVF?Eh?zwVJDIGwPutde=Si!l^k8-`P8udJRi^sz5j8Mrr?`4Y)%n`;VS#0a za**fdj*&S*o61oLZx+@nOP*Q#A_YzyoUe~0rEY-{!iJEJ{pV52f7f&6XHpTio^%T& zH$zrH^WhivZ7@^tMA&DSw9MPuLjzMUXDd|l`>)alFOJ|Z_gsnb?6Tiu+3F7r8co)f z5(M!mEP$N+lq$1jFlxk@SJZ?_oj1wj-?st?VCgsGEWcL&zW^c;{pS2f_oLUDB@=VU zpMbz4Z*p52EXfTwpOnd=E!Yn?{>6cL>64NL2^bNkl@W7VUiXyFFky`< zUX%706yH_*p|OU#s#(9Ve+=!I53!&lsIh0TK^7PuGU~%mQ#6mP>TkYIl;D%( zK`<|JAT&@|a#L|81QnK3NnNuG2%ILBh?ULbn|FPnCn+6- zcW5~*_XWbG#hVLFg-ZGLE>rl2SA5F*UCAq|Vj%`bzC&%F%;jmH^AeRFFmu_Q^-_YV zfP^~_C;<_K_WN7}y4|f9dbBoQDQJw)$YjTb*_24@*-qTNYderO;4N}L(L}<}1`Cg8 zDlE&Z%Bz38Dv?_4t+G>9@By}?h-q1jJN0&wL{sGfFt~x_E25QugXIdR238*+JglCH zmX4_a!DV6sBmZ53DX}Is`*XN7%^}v3l>%*E1#X zedqm~KefU3O~A%!Dn!*RyMcaKZ$SvSPYKka+)LqMTpz{Ktu?A9Tz( zlYDbyQO^kvX!WqqM(lhA_66tqkwUQnKYS`3QL}5woA0eX;2ao4|2k$*eHhX6-PlrE z*xHI4<%9s^MEjmA_-Sw$P6fWtSLgh@jG^dy=ywqFq#Ymc1eM!Tj91I@8A){m@WX6h z?(|B07(F!KOZEdUujXpgT1<%MlDI)d{(#Hk<6PY-Y9O#u8>;$T#j!v0tyIez2NE{h zSmBqW3*zfoILuHcXE}R)S6u+x7g>H~wW{HEsFIxFIt$WSZ)VhG5)KGKP0P!ZiTQ>d zspMOc4M?$Q`5+hI3C>ho80n}jX5HZI55t#W-><~;Rbu4GfMdW78~F< zexBQI`g$m%w08X(LUj#<`W!fFG3)6RxUOul&?8k-Al*AFpY~6r* zWt5Wta@U)hkF`xtfc7l&wnJ#=@HzIiXde9O*hw&|;%X?n?AJh>e<=1om6J-c-H+d` z>$B}d$_}anZEmIkTuIO$D%*`t9D2eB^7)ZJ->(c&B0^!&<83yJU4e_XeP~m;fLSk+ zTzZ+u0;-u6nxb#osW(tfqBCTVE3UmvYmJlYKiZ@`WB7nOe#hv+n5=+f=H9B^$h#N_ z`!DKE@2|ptiJZ2CPopK!H(JV5Yzg3fT*_ybVJ<)*u4h&e4di}1%V9384VNqx)kY(S z##-`kLK?Ke(jOG(5*jZdVa@dofxV5v7-Wr(@!?}a?gA?+uJWjNQ+J60ZR;g zrFbaSiQ9_#c}wB2@Tg-?FAG5%cOzkth2h$))wPcPQ5WoF_bZl-stMIPbpp^ z84{gW!v8LeIZa1zj;QHJuSa5o0}LeQw&2>}AoDqrH);>l9D95ALPvHi7T(Zrv?=uA zM)@0$grl&z~~FEX0A$Ozf0Cn)w>e2W%PMY-aE@7XaDlZGNXY(sgSE0M?$DpNo)D4 zW#J!!BJP& zv6h6Qqg<`c#Kf-mVb`;^!~tpT{UXO&gB_$wHLYCF-t+)DrkhjcXwLpHJu56;kwjDG zwh8hrCop5hiJz~|Hehj(8bg64N<^#V?FfA$-*Z<&{q-8=)OknJzK0L$w(AGG9RxF8 ze}2z1Cl}i0*FyN@+Lyw`KD+XuK)~g*v$aW7n!=+=_f$v+c=QtioBdviL2gP}>;oRV zqc}#GmVef$;Iu-3Z_QL0q6Bi7BGzyy&c%h2HRyiUT`Kbsil1&4#`uYBO+Yc^b=a#y zTAkatc@FTCkb=omhYB59iEAx9=K1(=dnaeUtJ z5T~En=u9l)#f72S^Esx#f|5%|6?KK zeMvKhfV!w_wY37u(Ue!J|=66&S@sWjSLVmgzf?NtuF zls}2V&<0<3;?3c_qZ?`bbUZ@AB{LMB&99q7W{oG7 zbubMb5`XvJd2nUJe#h_6v!68oY(&JFTSCpaEjezNUNd$VCMtkFQB zI!rh{-tpLBe#*9bMhW>sat6FsQT4S+rCFAs zC3V~P04EGeH_QDSx?G)KOkw^IA7HC|t#XdDY=1?49XL*=C*I*|APd$E+rfCwm2Sf6 z<{kCO#%}u@xNJ%Z={10v0L?<2{V+#J!>*z2hm?36@fh2r%?FaW?sbK`M`Gv=?m9oB zt7v`(E@v*L&cCuQs*uMmVx4e@(PJ$O3XeIih7Mb7;3)h|<mwyO%W~J~jB~%FO(t4u=5+oD4Pwj*^Nj8%KZbWzYtUY&HYB1^-_(;3@rTpMM zUvAn=M4Da8LWr8MJaIjbyD3lh=%r@JKU@lg#t}QHngo#(lxw`67H`D1QQ==+z?FL+ zZj!eMpQ|2!?LgPST5R~z_hhf9^eZ0jJBV>e6=0`E0A6s(MD|3D^QeyS(4BsENhATj z6zreK9$cXDU+J!`+zXh29;`GO2ucq7DbxT56pAW*2d=*TJe&dbG7rfUV_&tCF2A;l zD=}v_H^}K1+u<}xIm*tY=Y&kYoRe?EP1axgq8qZ?6r6USkIbTAEYm(sx%aqW3J^5> zRG$lO0f(7cEuOUTY61s3k5tbu6mtx4oComHC^0?w(x)UY1Eya!a###)H&=UnAv4o; z5dJFASZDe3$`d35hvLb1L1QQ?)u9)rrBPyTCx#ZowXp+eJ`}(D^ls7&26* zkyBl>`w)TOu>kR1Xp_AYuZk9r3PmB&pWhFd%pk7<6%D@>s)om`hVG(i`OG)T%MbDR z0yc@o1ubrHz$#YkXh`J1vA!m?bk8)H2~NG66dmi)(A;izCRcC+ty~zXyex8pX(4OU zCrp%jS3EDb)Lk%^;k7!Dv3~^O8U5<0@Y+Ug;t94RLu4o2%~eeZGczv2GBU+_sy1vzNt2t9;J!u1$a@ z(ctW6bw*aup2}>|PY#8Vr*%&;rxJqm@#GxShq-2uHfbop{Nsc%qr@Hurwz*MZ5==5 zr!8%xP2&@(4=g$x!oUy9ot+haLMI>+H=BHsr`*6L2gUpS+W||1>gog9X=*xqEdRC6xz{%97c+E}c`gd(W#`6;u) zlbv_&dUg0>OVWYLtEG46h6@{RzefJ$n?T&2_Us_V*IUKecGvqZANLpTw=1emYCykO ze{jBmN-3p{O~+&d7``G!2t6mWf_g@D&j6knWR$esgINh9Jbl0`z&!JimKMVF z%CY1q(xLP<{jp}fnlspJn_~nzk9f7AN>{~25W4yMxE8)qZ&$)R=#jb3^>AIVrifW1 zsNSZ>l5c6szqNnFr5Qt3&uK4&Au5`VZ~pP{V5fyXS5&(eJFBFxA#j);uwr5-ww;pj zlnjU4&)y_PIJN&FZC`VrEZx^AI5Ku^4UU8$;JA=18QAy0*!kWi-K(2rcNcxj_LI^Z zmuj0o#C`2^xL#C@Xebo7`)*Y1dO{cB;&eG+ng6XVAYKg4o5M%4zzI%5mEYja9Qk%$ zNVi+i3ApV-1rbZ&+&|NNEUTmkaevw4nA>Ip^6xO@xz;BD+g1so<4(E>t*A%)?*uxQ z7;ynFWWtSO-tOWaaY7Sn>$b^Uvp5sBWh#Ph4wURJMY?3@*&XoaS4s^WS*x>GFO6alaWUhb;bRknaM!Xim0><-lSHV$SYq~e zO}&364)5}!(j&L6j$q9i-a9z(CmhX@9Gb@6A^Z>FMWJ1VvatuK9-C<(>I-ps!eLIo z!kkg^l#Z{}^Aeeex>VqZC7Qq7`3oj(_XfWrBf&5(L^jZ&JJMy(vExb^w3`V2W5uT z28evn$l1bGsb}-I%jzCj`r#bW1F|r#p0ZDeJx{m`+tXL0;n%^l zfzOnVUy4MXo5-FFEC|qT8RO1m7CqDZqVrzIPy1g_g4Ay%h z(U1Z;@OfB>OW(D&!y#ENng zLXpFs^2P#_qB!hT2bsAbU?}3Di?HI{_u%m{^5cz@*3GV!t_(paH^6s<`YNg0J>|u9 zu@SOUeC#W{C-pT{!IIy$2Hzqm#}iN}6To&J%(~-Pc8aW%>N=7LAO7q649yXFH@Nb6 zAwb*8R)4cbdL=qEC*M2=Uw03^1rT~PpPwW^Ub>Wgle-&8r@Vg54;%sZkOnGB$3~x4 z$^<_-GAU{=4Jv!YgulF3FIS7piB}-e-E!q?F*o*!sdCPoAfM`{T#NZAf#a@mKb6`% z#w1owi$)Qe!9LTx*h^lKlcD*S)zd3^mUB)By}HfcYUAy~4>$R)zMY&7GW28DGoLNE zpKKs(*Aaza`r|VPj2=@tviLwb?aP&$e4x4`#@G0I9y16$WH!$LU|vUrElZwCLt!y& zyAQI#Najh9jYMBEk#1x-yZ%SA}lnmvSXPWcE4OPf47c*VpX zFT1Z<~z&_7$hCGkrSlB7HqzB~pG?=Z72( zC|e~_iaL=}5gpG1qWB`U)2oL=ZX)$;&&v<5{rC(oyD+FIm%!+(_qHIXp97jThPVMy zJ#`H3;`C=C>^M@<-K7MlBboy*3|A``15GD_zm}~}!EP*IhI@LD_W~l*N>H2NqhN8g zN4%hs7&}T@CL; z`SlKhTBng(O5mS)eP5mO9oi_Y?l=*_yXq2tb(7QMC*2@o#+bDT9a?l~mSG4oeYbAi zAkDBaRq%V^OsbEbALmOy-s#W`w2wbVv&A}G-k#X4@tRz1%a_O($| z$U9WGu?qCBxrd0NbxCh0+$4KIZ&w6cbQ4aTP+b(&6ja+4q^N!<%Yolc1D=9ZWBr;@0!GyZI(0rFZ{zgLI^M zr!i%KlPO&!4?A0mg+Q^`RWU5AD5jP_;R?~fieIovmKM7x3C=iQMzm>{ zRp()j@#(T&X@3Ph(&|z&F2IlHdxNqv&VZNdUw1@`u&lwHsx&m=l(b`|u1(pO@=#i0xL3c?f^SXE=f-94h7e-KyAu{+ z6kz3N@F)I?${pM-tTXc_c=tnhAJYxOuIk7_cdJitb$i!<|7a)D&;0E>5>5P%+)K0R zT>!-7Hsi0i;PL*`_p%7e;}hGdtHjob4cxoD)1^Fl+;_#LsWA(8O3-5+_bu0MqaeZt zZXC155-iOxZ9bk_w7~4r8g7f>LCBbioxvYSdmn%WQC)81zWR6j>Muv)(V#Ci_bYWl zEtyS94%a}K&6S+m19dvQ`Oi9ciYCG-ZgBy6s^)>^CS4v;NOPhZ8n=SJrQfmeX^n_W zB?0dz>gS6M%uK3fUd2a}BPLoFZKPoC#07kZ-Y>UAt&|o<+V1Q?z?#aN-gfpF+U7Q9 z7Li{e-%G5b-cc|8#h;inEP#)YC46yI&HMB{dMn|3H(K-qlx%XuMFd~bXae2SDP}I> zPt&RHq;C80h_NyPZ1G_O0#x7v^c`&sjao!TzZ^Yk)c{(rAY>$DaA_WR!a9CK|oFK;YT-bnefd*#5odOPCqDpF@dwXZYjG zZMH6#GLbx8Xehxm5?pfRL?JF&8u^)|kJmMokKU5Nnr9cFpfeka#k0;UZtqBFV}`Oa z>T5z;#<^3NNs^tGN@>O(iBRjv$VtLqlD2oV7pN|6tGk{&N6*5d5SP@*>*FT_{#ju- z56SdPv~6_=;$DQH-S?5v>y*N~?&I5{1uf_y^^G$TEs1`j^Q;ZpQ!;qEE|g1YCD2lw zsXOzQxB)YSFV2^4vc981Yc+jJ!mg7mqf@mVD5o(Lf?;&cx#ePQiWlKKP)O(1s|`@6 zxPfnCOs!q>+k+mUqLw#3BgNwNw+OA8H<;pewFM-A=ZGeA-kiB|5F zI>CQA?6mg}Ga%xyh`K1vZPUn(-z`zZI2TbIF;{pNcvjY1sYAf7_as0lN z4YjsxHmp7gaTgaOfZe3#yW6RZDlW=lNw;by4yYb9bCchrMkq8*r>lDy{G-IP$j%B^ zDR=6(@&}IET&$6^rI-+7YT@VFNz*38ojUK^HZSX~;Zp;6+N617=U^npaT@UTjDt0> z-@B{!Ye!h~3SR4FABwfoq zkZlpBo_AC8F@bpT2fWY47hM&+UORj?-idR7g;eE1N1^BasELXIyFn^lWXUer+?+qe)uIu2+rt$&Hp(d=2|@!`XL_z&D>sR)YMiLyKv{VV@64{9ZBy^Iwld^ zoRS{4X~kYT@-Bw0D%6SBS0*6)4Y#}}bqHG6o1Kp)ob$%97|L(uwahbY%!}GeG@7plCI7&;o z=>^o|ebktrt}+mIz~vOa2ofB*v|nCfZ9r5m<|>UBik zP4v|k(h&CEX^}8`$kV1_D_xF1_a;Rt-zovDL>~uFgpnzC^s8>g_ks4bGu6<;O&s)8 z{pE-sChey+HTpqHO|ekvW5%%F016Qv5?S~|kss*S^I43`elGvnG@^8f8=7@@cNtX? z9()Yl5SZ-10mn+1h9XO${qN;j z>H!EC$~ko40F%`7d|`wStiZm0zt$M?vn-Ci^G(b%KQF9((DnyyBGN@C?`P zs!X-77UV6pEAkKHOrIK^CQtGZ;ru&86AVVXI;zzPoR2(vhBFtUL5Xk@rhu&ujW%p+ zG&BNNtE7l)VHSJA{?%62Y7sv(Cf|g*PUQ*i2Zd7>fZl4fuNlGdgAyK^>F3S$y6B_a zt`@IH097N9wc48jxptcC3a`H*6(`V{I-;b>>VPRO6(yl*mqwBLIa80}6Q3!y+x^2y zRKPm+7wg3pZSNVyjb0ZUMlnSf)S7J(`aG)ACP!9!A4Lc%NKQG$?Eu3`+82$??I)Io z0ZJ@f04yXen-3eYbfxWgIluDhhjMhJ5-8JSF7wK{6n5i!P?S1>{(x)b_v7Z#PuJ>> z_l1U(A=3(qMjs8|XvSdirxwS$T}Pknfi|@ODtyn{H=>%bM#4`qaT}o{K zu0!bxLs%hyem?J@t&qS45;{y+np1ZZ8y+&8sDq+ygBn-$Td#-dla>M;#lym>$(1u| zruN43A|(gf&<`4G&6iAYgX$XVpc-3M#{j%2!5Z9#$Ksuzn^lQAIkkEj(WiD3 zpz4365FTi>gP}<+-WzecsB#G(mnew?A*eT_hx}-_laQ1OXJ*tw`Y6oL3)46jw+#Nu zjAab>KP;xo67t*zsp@P6m!S-n8|>>TlcDJn@*|HjhiqtnKbKMe+D#P;kgbykZsswu zVkFFop}3~Z7VK;Rf7y!xMJU!kyU;jCAb?c#~Mq^^uAuuyHUM2 zERI(#GEe$IaKGY<-AE$B@9v(J`^zT`BJsj$_rl2C*Q(*KIRmKudB0 z%}(lZ{|}CvU}Xfl+OStQ(N6{3WSe4#@ob8{%IUaA7g~>r;|1k|C-R6`3YqE8I4ziO zco#XwjF|x=6Ge1R1fFMc3GQ;986v{Fx{VwY$G=PoI=6=XG#b7DQr>%t*lDT5GxT?V zWABmicyGA=iyWsc1Ki_2+XlyKHgQ4@9`%uT%bE~1o=f}yZ_!!Wr*mmzW@yAs=&sFu zzHs?7z(|M@G|@zOc$TTDh=dcnUG#-$T%PL+CnC@6VpZM{aXbVcCJ$mNG@a;6x`2b! z0G26(RbBZGM<|FC$_zKgxT4LHAE;*f8j?rUZERf!dgs!nvs)UQh~h2e+qFeA5%#*k zzO~Gcpw?3O8=g~Bb!=yS`#f0QiD0}Qz~2JOivgUm4g=mrWtRt68#HzX>5prkXrQa0 zgQk-l9AVubo8uKmSPOz9lGwUs!_$SZQq$37w_OB_m-K>Qixd1a?dit~-{ff-zgFQz zW|AD2p;?){4PUpdTAVwplPZxfR^Z}kCLM&m!5%}6wT=Yk0|m~!*Me3NHf{OtLd^^X zFK=baO}@v5)ROq*GCYcX@jPG!otgBQULHnT;b5%WCC@|ai+0<|%hyl4m>b<&vIO~x z2;MH~(tT!Gm@F}we=B*wskCAyJs^0AUL}LcK9qnl>C`V+JL~-kmEOO)RhE${J?$ZU zZ~#K>0Oz=2`3<&3D&k)e9qkuWvR3TqXD4A(t+SNM5-hoBvZhi-+_){uufNL$M@r(= zkvMnM8CAZ2W41(9nHb>wcM1RAl_7T=k8QrU+ zZ9o0P-5%^m?^;Ef%6o1;a7`?9aM1^uO96)Ouc;$-8Od$uqmXkxoyU|Hi-VhyeEA$Q z!)zqx?UWCxr6=r0D&8K8E*aWDN`!V8s~cdD7Ik@PGvr^Io7R&#dc?d$R~}pu2zV`q z*7BON(B529nK>8+wx=^t8%PaLlQ>gNs?+^Z zAKdF;mDwzRf7|>%U4cu--zWMjc?taPeEk~LX{hzRv?9af1;mP~+{3^jFRDH>y{PSG z^(XT#kLr#FI-;Hsj`av{7i7geL_!k+1E-*A2@c$`k)Q&P9~b_}e60OKX8msWa-say zWlJGz8Ey1PH_|Z4Iz^Lr<4)vq1n#9*gYNxPN4m8G=L*4tbLp#KV73m(uW1QYD13K@ zgEuE;vtaA<#(G*$#Rp8SRz`P z3r82U6I?MS+9|H@MiwONj||Xzo!dO;8**s1Po?XYBNinBJnU$9Mo>Tql6KAhoCuC763y@9v*vdB%MV24~%^yttP z1DJ?kvJ7ZZBFfe+_xKwEwrn)+_>IASx;zff$%MKPMZskd2sofkr@T3rP=$E`j4y!N zm!8@xlL6$g$fWJH)8>v3DR8xZ&(pkMhi3XkQ zSZ8BU15Om|rB!|w4)yiG`B2V;ZFd+U4;UUAB6U1O1MZMz*IL`{$0$3+cKGHnA5KT$ z+OgNCcu%y@dfI%&w;hLG&RC~#4F$fmA+NC-es2D-D4>8hV{Md^QTH%`C*mdZvWtds z)~^DML#8qM&(Gf@{2o}t-@yNz*&e0E!}!M(FUP;8c>hI{aQttiNkCBj@t>ztNQakl z5Hd>@A)uOqECSDML`uZ)o7Y#+0FjawHp8Z(hb%(RZA3|g_>YNWsw>;kf5gi9uUK>c zi_*dOU*G=+O2_|RgMZlgUzCn&12|%WNc;@^a)auNI*_xoBKsaLUq{2a;0`{a_usb} z-o!-oMfbfra1tHTVp_2v^ZT%jyc3{i4$s;U<3c=c`Hw%@iL#j8ilY%?fAPMs$q`C? zbZJ!@ffQz>3yNt1ncalICT{?p6|Iajas!>=qNm7p_`i}cdh+`<+8ovFbPH*OvESJf z#X4VVIdZ~DtaOgXhC|Hb@Sdm*0-p&&@M4ewpQRyl^Dg)~iVV(B{*`Mz>V*Bi_iMaO zsYr?NbCg_Q@Pi?mdT9iBvBz3#e;!$Y#!esVX3c{XQu>sA&jZ_!950->3qSwW@y&oL zObJ_=%z`NVkMn`Y&L01doOAtW&XfP^d}K|w!So9O1?~-gbl=ccU{u7)At77v4h{E9 z`Kv1;k>b`N=k#N8^xwd8O^wJf-#j@tt)&eQxJs$LLDHXyFif+W!MZ&@YV)pim1sY0 zrA!a0^tKt6FYJ8#p=Q4;O|K~R==|d3B6?23- zMXB*@zaIBtHXrT?C0iz|bZFdaE#A}tTWN08Y4(TPvay31=@sc%`yf@-Ml0utgt|-+ zoj#l~lL1peR%O%J!5d_@TUYi2PfzBN#?_sacicn^Fw@6SaR43CFD=AzzagM z(**y@$1t!jA}LqH)}5k;L|gk^p9g1eVq`yyx6nU5wY^QNy@TNrOu7&JV*RT9-$qh4 zN#HCamJ~$yDRr{>C0Divauo~CsD$3lPdqG2OCV-Dg4=XTh6Z0oNnykO(4U>T+JN>z zSn)@eQ(15kIF&;4`A;{bhr^$%uMLum`EDZ|7B2@|KQyL4)dfaBd-av#&TeYCE8MWd88bMQz&A=d07b{tX zgmiiRXVdRUySKvSsj>#855(Kb0$09Fp_Uls=%%eIBE{FnPPyn9@nl5TLsnKlbhcPa z_FGng_*wCE&Tv0$LwlL41>D!U0P$Lm-Gf~u_V*7D&)JpSpJ6Y}ezHdh;|bk%md<8A zIe0pBN%Bq@g6*-tgCU}&n=#FUcSnxi;L%U@2-IYj!OzMK!;npFTpgFrc+ z)lkHDbq^4FxJs7^YO4JkxrSTQ4R66m5ky7xzIKOf<96GANU44vN)P`Cd@;#ukKmo;xs-&MR?jR;k^ZheX64{1;JFAe$p7<-8oXO!7JgWF_Um6jx1Ll5Y#Q3B_+U-2#kpQzXXb z;L1-bzu?Ip$}ee{0f`X29-lqeClbrQ zTddl^r*|TA-77CV{khQaM*-No{ zB+ewgR9=?f_a8{GG7FEBF=Ry<@7bmo8C$OOf(5@}V&FN@@&cr)06NcwP~}FbDf;eaD2@&D$k3}FRSev^jI$x&zwYZq*l1++4&7HsqG^&Ln1on#Rv&%Z zSDoq8l-UI>izy=Ghy?)Vb|F4ij5*xTF12~oNqV`HWHLyYaRbpsvaTu&QnOAzLX^xI z0q91inIEW#r<#CQrNW62c|LLD>gZfK}Y;KH8}CI`q^gK&|iWHJOx+n z*mh5`k~ePBblo*#jHk})RAlOtBs&I&k?z%x)u z+4s#^AN%oUM}=4%yl%Q+du=ZxJ$VP`yZ#rHQOJ2#IMq!&V2@0l;M_8Eja#d|+j%4$yt zk$G5Wby~Fi?6R!1O=n;MO%q6p4|gQyf7>Jd3!3r#H$pR6VZJlVztC)c<>|v7`0V&#h3wV0@ggo#&|k=X zVV?YA(2q@XEt1QO$SRZkR);`>)#qAH33z@y?gs!zX#M-{=wV%m=g=&-g*X;NDOJq^ zq_C>efREnKaeE0}wOMF=lj}Z}G&Z|b?{*Gdf{=UZX&iP?UNiOpvXEZhCLRW2-g7TL zr{A~n`l?iLPKakfYK{e1BEnW&Mjm3GF&*Z)1oUiKm4?&aw{fOCYBEU3{X7I=O^N7h zr|Cu+JXWq%sZbZT&?im(mL24*zs5pr-Ph4n-`;^Tw%Vlu=^C^xpy}v}ES8`5L#71y zOfrqa!x+@;KT?h*JG}kRl>ghKsP(@Pnbv=O|8LQ-PJ&_S|JIS}-)NWt0s`VE5r{ri z0Pv)q7>Yq4G7@kt8z||21hr;c$NA5o{>{4nS5OlFjY0in0sfBwDpP3_{u#i(`PD-I z#j76q|9cRN|DBcUB36MUfYr_=QP0nfz&wM7fW!AK_emk1@}nL6Uqn-a9{@!JBK!^K z)*M`k4Jx0EQOLq9hVL*mu=!yN>$3=;Gq>UHo58=YimOkLc%gPzpCcG-B79~05>)~T z3!gvIiXihID^&;z;PaL-fsbsyjSc>bwDd$x!Z$IF2w99Cse%^>Dkoguf(z|$VAr-KoQs!S_+dT{^# zd0ow=h!Qy_8(GZA60p+TFtWh&E!%?1*$9Onmh3%$xvBrL|MmuKnyPSULE zJH(+$&bHG|tK3M1(`SG;PG^>){$cfj=y{TP+%0dq!Uh(1}t7slJAyEo!x9vgPh0=Y-)0& z&T?mwZ>FpVv`9lzvK9>I{+#J>?*S)-LcgrVeIl`xPDXaIxVsG~Zr-j@4iI|HVFm3} zu}|In9nKNPh91+ep@P9yMNJa5XB5S|ctY5^`)w$?Sh~!_S6{8*))fdV-~5S>gG<&| zhaRjv1c&T81!+!U_S_HPF$+s8f%7?o3dM{>%stYTxu3^pM0>~gB7pvhNH%M#nx>}0 z2R4K7weq=V%wXCw?Sn9LJ(LC@bt2eli0hT?*!~&U2f&q-{eiu;D*2ViPf`Rg*}Of3 zd{EH3w>mQ17->$W>fB*Zqya-t?DnKestofbF%z+7mht1yi!4A4?~Iyd0b`~!UUqi@ zO~Y472l1WvGo+p^5%F-t?_xfFaCi8KMFZ6%Pw*%$eQp!$-W_EpNb9(dWw_wwV&}fj zXPt+${SKTe<=L>zLx$$j3Ukcs8aQD#mb*Ec>`?DQAtC&?PS|#1Swzh0}%^mrfZN?DvBv&%}A}R;$tPpi$LRHH6HTx&|bJ zCX<8nP6xh8fdo;zmEGJK{)LEQN*$5NsP{P39M@4NqpOqokKEln#Hp8Rta%-aC0AJ2 zQb9#im&xR)m2szPLd9gEV9PHfixoS*`ro}y4A@Gi715~E#pib0s2?aUL+94!yKqGHd}@mY*{Rk@-(+w4#?CooE;{0Xk&Tu8-n6hi6>?eeh$M3Zrj zlLV0A3UM{rnXS%EacCYsN0n@yDxe*r420gD4sb+olB_+TQ<`r-WQ;?Eeh5;9%3k>YcHgVp^))k{wm-czaVl6z?#-4gau0gbuDSN0 z({+U?hrI-S7gqk=C03JX@+wWJp)wp9$p=guWsUD$2^A{S@Y=QL?77f%u)H5GnR*Fe zn206;4{$LQ)_R3CRJh8RnTD;)RC?yiH$tmy=cb(0#z8xdX)B%TG@cLg1HQvA+Jv;t zy^H&xkmg1ZXE-u{RoY`D)EprX(n!1T*7xXy!hiWf>aZ&S znn1YW>gZSZSL(XbZ0?xTqakseQu@#d0;Ce1O#R71yCg4*8gJj~2CvV|i zwGbxhTJ#RpQ%QG3V3l$T9K=pbr zxFRDCcZT?<)Edrgqf+@vsm@jakqT+5bb>14637fGT5OAk<)Z6Q(`>) z!$#Kjc1+utCG=cr!gP%z(CwlcyM}u$`f)B`^fd~cWpBl1`@})0;@n?PI1}zZ1vjP# z-f945?qcb2NnSYNeKQ`lA0$17(X3()G*wzh{nCO4vO)Xtb{$ba=&i*b%;Wt=K5rr} zBTla-UC&)Y=W!wyDRDERvo|fE+8cT#d+N^jyy*kzn+@{<^$}6SI}@zMM%FYN;_0*& zNuoSz-?tzkO>{(!rIwSdLSnpKn7viRUXD>WkCD+vpz56+_oVU@>nvl?m8Ct(Rw4*d ztqXs%6<>tt@pZ$~$rvY)PQ+S8nvuo90u!)!2K1GmxJr>J)IXp)m(d{d$L9RGLkC2_ zv%N0PGM&zEpR-%lZ7BSshS;8K_N)sp{U+y)^uYkR_CPHQV5Z4degZdQ#gZLZFlaQ1 zbi#Cq4_`{!U1Xs0CUsQqVz0%bsrtOJE?{V_shwvmGcrRA!J5o!ziZ{Qv-lDjop|Ft zE%~KWI{OXz&(ay-!F=eSH|zh>d-$)~8Nt79)`bsVG$>3+Ta{n>X4>tmsrJ}PQr9aB z&23F69Zh587dSX=N$Aif&>J6! zoez9BZqtk>pZ9LvCvI}tBV`BKCWb~RhVfyjF+y+=(H&TruEaz< z3}lZz9w$Odo~I*Tp00mnPDj>e7u^Z_J`HfMNDGkwHAv6BPjgTxU@I@eDn?g|)n+VYJ~X$~_?3uwKTqrv$c zG~k_ipt^JenD(rwMa;a5lBK-U7T8b_3&~ary(in|w+xr$fBY1e*38C7%-EdPrPe;y zD;m(N7&fl#fF24|ae+jl%T2N7(TM7e49Onn*)cut-tYZ=DPw#k(5Z@TVwy**WFsX0lui z9Z1X6FWEwkz5Mm7-q{O>W*dc~AvUTkZ7-X#c}j2PG$CnwQ|`Az_93^&QyvcWtApC% zK02%t`P7F^2e;07aHnfOK0P6i*xa37QC@2-BLAsu7|3>GdaKMNF+Y zF4Kn2VJ4XiEp4|Q)=`=CslO&DLIPieN>vzy+p~$> zudT#h8-H}n=#<$S*pK)??yk|Gdq@!X`&vJDZObu`}wtfj!Bzc{SyY)Wny7f{n~ zEGZQ!9;S?ot{7(9?z0thf_FKjzJ=H_0weE}kF^(+Q;`%<2V+0*q49^vFM;zGKR=6? z$fo9b6n0-^ z#j`9%jfn5p4|4v)Lj!X(j*KTbokS)fZ>{?Yd!zzGK;)p&eHTLmt;UBRI3!!+s`QZ% zEci)M>b^^l?QOYqZ-$Mz(Lrvlb0t^$$>`Tl62!^kgRz=n95j8Mz9`fVdqOC&Q}2h| zrYSH`L=NT2#qmH1+U<+0_KbjlX7IHPScqG_`KHc%cVH=RY*VJo-TXerh_3i0>fK0I zCj*zRz=MECur8`@m7TPtjAVn&Ae8sGS0{CfS1m!0Nq@@z!76x&YWZS?xthg9Q8zz` z_qDgV2NBod4>m6T3v?(?K6kj=6eY>vV>boT=FJ z1j2%hICtJ#S}imb!@<*Sdv}UoY0zdGE!qJ4SNJcidzmq7icMzieCmwZyB661bOa98 zS8F*v-aC54YV>S6Y<1+m;6he6PE%2#&5EVhB3OJGpQu zLZcU)rs{Zm{okrZH8_eu44PhoQkKw)rC2#3-<#ui6e8QB&dW-xG;Lras$l7|$;`f6 zPr{4|8zHFh&W`LsgFs>_SiG_4Nv)Mr=S-*yf_OXhP8}BAA6zzqbd*r!8TeDi))(P| z12z{)p#X=ya5-Jm`a*z@rcRT&^$uA1G{;PN!+hRLx1MJffGs#^v0M7h1giCyuu&DY zAr>DxhBXEgr0}seK{51Isq)O*c2j(Gx)tJ*^CyijI&O7#ml0w4h)+!%Ca+&MLRou- zOGweN3*?D@1qU)6TS;*$683FMbH0Zx6S@k>N!RJ{+btOd5BX$--#PH~X8h_2Q(3-S zBfSWm%Qa#tQ4S<5$rM-5m&)p%#Zx}>ugK&@dHhYpzjgt2Tc5-k^h+~m#updy$A18g zTOu)Xyw03sF?c*%QN#~06WlQHrOM^HnzTEx!c%R6!K?LqMj{qloD8hD4H`M@%sHT8 z+NjuYr{g!B{ZvBqJ`s3KcgvAHzWCug~rJi+4RspL z!}qU%l-8y0Jr|jWsr+yE_7!w_a)f zItH2V*^%+-hb`o{QK>-%n#U=+;D7=(<6o*m*B8x#`=OQnXGWPc-Gg z?3#`k+kHWTvWHk$bC#(F4>FIkWlxePlPbR5h7~w+2(#^Z1VK0(6F|K#^Xh9g-vRg&Q#?D9MnU_Z^!*l zOeXVe)3jJer1$I(ww3*d3Az(fB+Q#Xgl)R)qAoM8IR^sS>*&m9v|5pF+H zk5=AGR$vl#YuE?cmMC&k%~AJRcocjbbMugU95zop(LtK}sxd)gnHh~)=-LMS)pUCp zYay)MheXklT)a&NA*`!G`|a2Ygot+CN}1w;{@}5|r=x-rdzU2BO->Dz!o$-sS%;30 zC5YQ8qrvyxoUuDlq#YH?BHaY==UCMB_`VjZgfc=@wXV()y46wf+IrLj!rw~Rl2R(Z zliS-)P~&v*bt!xJ{W(p?_i0fNlffPpkvBatSq{1PhbC*c5FL0aB(azC6nP@$gT5d{ zb0Ww`9Q-Z5EMYdoo`4WjUmg3`*aT4_tbYtqsV)HG2w7B>5eOsW{R zXtay70HiU&?>2NV&+z_zj+u-jgW7_eMdI`$Jr>D}qrge7>In4~3%j@w+7FpX1BM4- zlaJnE=NS&Dp26iAzCPcOM)DnA$W;9|CuU=Q|D`FcLMG2mmr(eC!&X}xBZkVaq%xWY zBe)kU)o@wrlYZ~=O0T95tYqGoxW;hkT6cXz8m7a7#>bnr0SZe~HJr=NA_sOq^>$G!3dZMc_9X-xfTXKvr}5bJ^I zJe?_p!s*S{$Aw#9>tJ2e-FsspPsG{b*?vBuN797^&J!r-y?-}W-NFqQB4jiQEIEwH zddhWZc;Uwu5v`P?&%?tpQ+pEE;S!wLVZtMnDLys{09#!B7S zg+6Ovf_qK-Jqe+voL!-bAoHJ#&iip=0r-9Sc8H};RN|OU6M%#v@n~X@xJII)Fo`k~ zJEk^m@=l)EBLkynu*1^aa?_W{ zP7-c2EZgZX3v=q2%Dxs><}KB^0xplJ%Koc@zr@)BvZgMOPHR`ba&_TOAA=`qa~BLk z#_jXVujFS4G*xz$%0y@=U9-&&&JM)$`{U}mFQ+Ki|Kfa)t49e&K!Q5K~MY?U({A?(R^yySr1k zyBF>*g}WCHg-hY?UbwrvyCx2Y6L-zIW3C;s@4a!>!+FZrG5(R6e;>WKuQf*gd*g0W zN;vhZ!Bj^Hb=C1L#K$w=VGZL0x+N_9W8AA8p-!3b&l@Q5Le4`ipKG8tDhf(o+C$kc)(FAFc{KayayqUJS30g_Z%~A z_y;e(GwV zV!pYmZBC=R9nED@wfJrcWS$@eauLokP(TYbY`(g;%D)Dy0v~`Aa&~LCQ~d39ns1WO9RV#2^E!B!mzyP1M6ES3)PcN3yD)@v>+M6}s89%m*h!Zd1zf~Itfcou! zJQe1@XV-r{mH)5=GH6CtF&$gFPS8?~Y8d_5EwH-T%2GtZX26Ifnlnv`0N&tZhTgud-CB+ufL5{m9&Lpe@SW{ZY`P7NB7?V#!7{bhAII&?10#&ud zQ2gtG3=?g~g3nKt2;l%hEe)By&w2Ppv$>WZc-#WZ@?9sYWS#g%MJB|*>k$9@Dg8ZJ z{%hm^_neZMU2E1qPwDR|^j`%m?q3D$|L&DOe)dX*=OXBI_Yy4oC5@$8f)B&yv*t}J zpylYLD!!|)C@qta|4~Efq%WN^8zn(7U!!cocPuqzZpwPW8YNL{==|t*%RcnVo@B_m z9X)+&pL{a$^t;@5QdHfqmnNZRrR67!sSg%(gmEK_hbg!^YEE=WD%m<}o~r%;Hhq)t z4;_ElC8c6AymgC=jxp&yc&f{meGI?yo8L*wIj&Em;~VPod_6%$!Cbk=qg)RrLAyer zLDO!L1RhXUe;3b{!}(nkqXCYvejL?H47tD^T6{e&wnf73@GILZ+%_4L_ojlZxyZO` zSD;d7Y{g`435^0I`9srK@Oz45h#fGHXcWbTvaouQz9`Yx733)(Q#jU=dLgL^owAX& z`#kZb+??=1DCTQZm#5MfC)JZR%n+S&%C=I}*1hfmyy#z-*rH8T+pWD9D!kV5)PO)) zm4i0MS#`<05(A{GFKTs1iYL!`zQxgC6Y%P4NcZUh(+3?EeO6qIBUV-=4{52aZb`m| zlMF|T8G^PIHlbMCW=l_QNU51-wgWg`wZgZwX6txA)l~@1x(= zIyP0bju$~&6LsB;ZL}5HLNA_&fC?7x&0YNSzp-2_UPd^gVW!0r2D-@OsI&YqV}>Tb zz;&BbK0W+Odmy@&eRW?+hKnfTj@?)@Z0^kCd+lH#%&FLG#*TvXA7#LIdaT6MS))Vg z_J&qBt5RE4T8)eV==0f=I69mdQrDcsL)U*yN9C1o)7;PB3`u#)1qy1NV zWZ;m>ygGuOP4#G=SmiP!?9QK*xr>APKm)Jl*{mw7DfRs2wj(yg$Tlje^gU+T5sv0V z3ADgQd))%!;|`@w-p4$0KU||Dw6S%n(;vJ%S_-)4XgFZe?PJ;@L_|Obi{T(V<934V zR6c(HXBNwW#4a=<%aN}nlwx3(aFeE!$j{qhI~%0EMqDSDbE}hkEL%r+=4_YlAxa-oW=Ss8h?()IX%USGCagL93(N(hz?_ zjxJ%8eN)W$6$JI^0T5WdSUCXgF4ttb5O!h_f+Z^SMz+I$UkfQ`8R4C><4oA#2TYiX zAM%{-Td<_5Gtaa7`&w@X1|x2C2mU%c%GnW5dOp$eL4HOhX+P9-ep-^C;HE40!O+CbSZ_ki_4YB%RYCADSeR;8VYPG<7M_*H^|itT(%lIYup$2l{)byi z(<2lzckPjJ{O}u;BkG7=%Gd~z@T^w9(@8h&M`1FPn2-C;%VvS28+J*?Yq|c$GNO}f zGGt{qxb&ue9_3^uB6?t-`>=V};-!NH>+7zZIYxTFH)>u(W@t~tOvc^v6CTHT0z`Jo zj>Jlh(&C{?Cc>HzGkIKeK}yd%f;_l;k)onmTQMTUQvywRB{Lq2L0BTsN%C`UmzEDB z&6ZHVL0zMG1jxvy9O2MDqW{>O+a6aAR54A3WF)%-ajju{^+`C$vFZjtJhzjtZPZ~7 zgG)eggL6nqZ$M~{$R)$-w~$cbsD(u}DaK8=3mILDVx`TxyNJFgWuw>&bbGpMNqR;$WW!>?H%UH>dz)4QAB|M^b+TiNqh0nqy&tbEc2$5#G# zy1)>*?9(_@0ru|YLnOFmNW}--Ucg-dCCdm~z+Dvf=>rakWei>q*QesjboE_AUhr9a zFhxL5aOLnR*G`CtTV+cOEv}KFj!hmgv%??idkAto%A1BzDERDmj~&2G#FsMZr%My} z(`t0*6l#W0T`r3WU-I8GL(%{d1OMFm-=o)pe{EUnf7<&07pdQWfiLvpkiAI%R(2{} zUkLtl1^=x}-S5U+_d;B&YIg!uBpM81NxMxdrTO7ew>%f9C_Bhv! z%Ufkk$-z;6A5)Nms__iYQ7p+1MXePxNJoigk2dnSjobLqK1fL@yl|8TsF?v(e!Q66IE6#t^G7{oFKK+{&n4*j zOuG@v1?Tq_JI{XGNCGNm<6@21vSPF*&Av`S+WK z9M)|5KhOKWy3cg~&zC&-?_i4u0kzndK}$>+F==LLVkz?EIdYWvZ!pQ_agb@`2sA8v z71kssy(eFee)1(vDgUoxFS&<{ zf`Ht8)W}2>UP|(4`Yf~qF3Y=--VxzRmBZxVfbEZq%{ebi%Vv+w8I8#?`&+H8GjhXh zxL#hPjN)I6lTg_oA2oyQ#8l=S4Coc}0ZY#HFwrewo0DU-`Kw>J59_c|8Gm=P*aN>H z>t=g=DV*o%?klyze9;b`a=ICtPUQHh*yL$zQBZ}uKUp0eq%$U{U3w$Nq575H8`X%q z>en{q?rDO2L*J6=9r;$y0JOE!GJ!pj4WzD#>***&?A9Wj_Q9XVM5d%*rg@uE&`ISZ zkyCGK_mWrD{uhb5DL+?%z^WHAELQdlYIhM4m`1`ngv!}&r)TBT@p(L*T3WBHM>7-% zvi%)Cv2;TT*NS&zc@%!t*>*+!7Jp|e<{Nln{t}OK!LpG^Jd7?=VC3V-eXxdc zL78=Y&2Oxb60DSc+({YL^scX_^Xt@{o!(6^Kj(OxC-yBeH~2$qiyW8#O66{Wn{Yb zy7be8b6<%bSa``p>ZBkn*K;E=N;M`eWC;ja$M}X+fdq=E?0mNV<(q>yQzdzEI{}WU z>)2vetpCH8w1sSHQ6$dp`uk-Ol*i-a)wX(t-8ERkUB0w$d*RQ6YB*bvX7o_+I%VVm z^e#J9I)@Mg2ODq?D!6q)-e`yB25h%S%6>21>+rD? zQ$c@~Y4w;53W)q{1xA{!*k4te(wPGfOb)NwEb%b7v3E6i=lc4ypEJqNGTr}>ETs7b zz*5p*Q6RtdJ>WYN zQh_v(aC~^oSh=5lax1bH7zsT*R4ti~We|Lb*Dh&{uOf#hj&{Wfu2;V7r+zJ;OoG0( zg|;8wpWMNa(418_<95UKx5##92qv$Tja6)}xONWOF4B7VBpFA7R5k^$uEk^vjtZ{0 zCt4pVUS~YS2=Pblk?6ctSG&IAtgNf4%5Q@n=@C6V7kbh$IH0yt2)b=k9=sFY$`6z4 z6z#^G&V}CgXel>ZgTTe9>Y-DjraztxXa&O?`*vCV-($@-xn@J`r9ACj$ax4CJ&c5P z5*v}g!ijC}BaDfBf{j;M;^mJxD_gA`?*)D>?%#1;RfBpxQ?V&fO8C>4w&*Y(VtNj< zpt3FxX-E{991f`pB2PA@kih37;gRmSF1O?4BaT+k4g}{uJi-1BEXEOf>NvS*re&Ve z{<;E5*(j75Gtk(U*tNai)-y1F@I^6<)|dXN9nZ~W^??U6iG*A`e(%u*x_;Buw@r?w z8>(0$s{)q#aaNmQZlwwtvP!@6te7t*5pVO&)gdZC)`&byn)yf1EU`4gDW`?iGQoTn zU7%xGwhQ0|OD(Co9QUXq_j^P6apz_r7OlQQ&Uh}Y0j+uR#9S&9oK7ew4P<6ACYsv?ez6^~!`VtWv z9`1}Z;I*UQFuWHlOdYKt$B#8Kpj3d+XB7+Luo9$n!)vs9Kh2MAz7kI1DirG(x!CY= z)_gY7#>N1}C>aS?(^vH zRzWwyv8cz~`PFnvt%r=PFAcJoSTPHZW!t$)2>Q>h}7_l%?T2zKWQ8jyFKdUcUH#&EIy> z&8EeS5}8k6Nn+{(>+fxd!C()2IULx6t(ujgp>dGK8`R!BLtQZi#fR>09JJm0-#^`{ zQi>FV`;=}U2Do*I{v6;j_Z{8bs1~U3BDv9pdV>YvEMV)f12aIDJ1B4$ymYPzv zyj{n^#TGO2fjkFWhRv<8s&-hdAsHB0!s=IXrgr^Kg*HKc6tr%KXN}SxK6{)5al#6U zxNki@bDEGt``7(jEXd?2H1fgTL_6P~b@>94jgRW(_E*ixJxkA!CcR=Qih2$Vi-!z@ zE!!nZ5`0t{!FXPr&mL0dh5YinTvHwt zrqC`BdruxQ1-RjMAB!xoOH!$eXY=1IkfKK|QcjdDJS*l(Mm+8R@Q4qGEs++b+q~j8~dkzN{ zMqnA%ewOq@z>h%*j03}g*pBQi--(#NM$+P7o_u@dPYY5P4Sw^ zxk$n>%|;!lNz@#tqh+WGIM%v`o@dOgMjxT&a-9Iinz+bm2)2yDS5ilVL9>|qKUJPu z3kZ1&P&vEPwNISA>{Fz-9srX^K74^`H^UMS5xo*EP-dv(ci#_MC^x~uRnrN_upNe? z4>jiKsz2grK$gZ|eWo0B>s4h;QO}JME*+?+B&qyw8{)!V?Bs=Be?;7O{Mq#V*kBlN zk&Ol|OyXV#R@c&&gAUyi^@i7!%S-W#z?1nNY;&NzIH!__ru}ccif>AzbroN)X|viXV2(+cp{VVSs*9z)b}I*|jjHlmCIz3Zmd$PmRQ#a+G@H5oa0up*I3llL(pWdgdu6sINQWQS9ks(Gj!gmT zn8-6@0!MnJvw* zp?TIKZy5q;FHr_!FE`h1^ZoRv*v`r|B8#QF`@QGLp^( zg-tVQcJzi$(z`xt_RG%%Hp7z#Po?sHYa!Wpe zc3ls^bP=*XJv{I$-!(FEQ}PTeXX{>2xs>BvCIvs@?0B%U%r33;a|Y|?V>9i&K?hBm zd{Z1Qei#=4t9BZ1 z$$jbJ(6*+n$I2q`1le$pS9@;P-7m*w;&ff(Ao=WKI|( z9lHa==Epr!ZBe~(`m`hPB6A0mv6X}rNAFwhInnbDMOu7mY;G#~*rxU3KgZbxD-%e7 z_v7`^zNm4m%x=QNy*hYVF?5*d>xwv$4mV2sR?HcFvN_y31Tcw=9{2}xKaJWvUQD#5 zy?x|^;*Pa!s)FaO1&2qIb|wI?$3R98oH!sG0l$q)vpk|(yc~S zPWc#Wt4~EO9Vhm`D*G8;C&_{~T;V6DX$NufO^t^1LdzXBaR&~~wu%V3wk17C9w7-| zjyf1Y9&{FiwX@|#@N)hHAMdea9X6?15+zQlCpt6_nW66|OMjpy6oCnee?6LCS5j$8 zOmt>sfI_^tt8CJX-y*X`wx1*j<^8GNt0oSUn*0riTy;9){5*UlaL*z$8^;jdE=?r2 zbeR11!qVPqX!X2|=?9`ldg$|F2xFS+83JG~42rO!SV~ z5OzZWuLCE`?lU!8w|!$kkr^))Z1Z$tK#r_3>&BSRp9bJhX(t< zPW;ev&ntD`rNW6( zSvo6DTBK}guyHVd434pn0UPVw{-)(r05!*dlx4kDm>VrO+atP4A4QgQvpR-ou*dat zF9(@U@!P>fuSYEm|ENj|pTHXI1q1dM{}Cd*jrm!uT22VD^~L2kJN2H#S?3<%s!+!2 z{i6MNZ-Ljg&&-VwMF7MAsX$W9V6OMvN~J`Bc*&dR`oePJkGg1JRU=)Z0U4WX*Ns?^ z?W_~n3%Mm0LgPx>%Yec6QL#p@Wb7?2ukAy7EQGK|4!cZjEZCY`QH%e$&# zn4@&MryE(GZ}H&-t9fAqwz2lU|h~5DP-Gt5x>fYv)#+-hJ~#9W*F0EX`?k zT=Dj6A!r|Wya+nDl%+>6cwV$KTqCQU#L;uQ9JFHkw9@Rhh)tk zFI0SX1)bzDaz@YQwqyESj(7IWULpMW`yUw#NqPGXC z5p5nu$D}!s1C=h7UM_R>BV}>E%me@D3ebrFUlW4wdsEU?wh+?e>vR;Ya`+_XTRR)L zq+snxw7_E-pk-E+9vSC3K;-s>f8jy2#L(ce6qz5o)LhiHkpQdDrZ6@;{RkL1XW=-+ zu+J!)l9Dr~Lm--e3n_7?DrMn1cXT>7%FKCfaF95B`{mIfmBa73-&Gj5;aRKB3QpQM zVx;&6;GXY9!g;sGEa|A9;K?!%ddqOxfA6HW(`*C1Fqcrhp&C|Y=nE>}Y3lM-ZW3(Mr`12SH#Lnty>Uju(0*lAAwKAbd>PN2ZW5t2s-}UsR(e3HeAvkR;R+ zZTI2mTqyw!{oN?HQ)M{BY`cn%#U6-Rf;bM5PWi38XVY;q(R)ect}S^@L4i?zbpyCW zkF}EQH7ab=x~@%&g174t^XpB1a+zr2LdMVQaBR9n`_#K{7pmI?Qw zuNIrXR&cM|k!JQdQ-7sQ;ftrysvLUh(r92m6uQ2^q3l0>mInARq3q@e1^d`SpW@hf zdnxl{w;ioR(=Tqw$5CLDF|s4nFcO9SK7-I~r`;^82-V%A*9B9^tRV-MJ<@Rs zNb)CPWuLF&LYXvCherXbsXP%RWsoL}aIyPvWb!*U6Sx%L=fKD^^_p^K3jH0N4hc_} zXc_m&8}E8OuBMNZ9a>k6HR;&w1@+o{94 z0~*5I{`?oM9(*^c$@-Q9`=v56rv6T3KVL>_O{5d?X=?T|>rvWQom)#Dv;|1*^#Z5~ z2)13VBKhQn4MTelPy4sgX)Vdu3fqfco6)Pli{NB^(&k{}mpw5@@CjD9k+HASTVzfr zPyL=>8R<6;byRZ`cg`CaiyIsAK=f5w!zB>W$X&ecMN2nQX_}d97*ap-v{sLX*Oiq~DM%eK zfiRPMNP(^h-2QbwNLcqM%CjjzWQeiJ+CH9lU1f9_*wwm8*6Lr*)wf?$1tOB62T3+K z1yV&fSfOvx_u(z!MmDb|*s(kb{5>mb;xe-fO|RR1b%4C`zB`NLd__DrOJ`KQpS>7` z5O{TMD6KQ5!exya18fJnBh#hm+5CQEih?a>5zRosF$i_{y;(?S=UjMu4tz1w?=;_b zqbV0@zFbr+6vEOS*AWxc`J0gwiAfK&+Ts$zyW1*2(Ur)X#4eBO<=Rw6TOps zQ=M)WuUFT3@y}Y3S~d9+(-d(YE;YH%SvbJB+Eowu<+2F#Gm__J4Xa>los^uo|76@J zLZJa>E#ecl+~ue#gT^z zRF`}?Lc|Y~QB}A`Yc?>dw@2*RM(UQz%slSy?G8#~q2 zjqe2mt(*35$l&$)a~d~D16}iYeqApDYU&Dhj?OPzClmD|^b4bsJO?EsICaqD3wsIq zMxsb@9Ul+fr}OjxFJiKOz-rrGJNV|#HH5{mvq2}jrp>g4JYu=3TlK(Ou#Gy@ z8=jvWh(!dz&Y&%9#^OU7I^|0dnANc+dIWI$xdFdB>t5IpJGQKj?>tbwi==E7-;K7v zmcIYdJ3z1I%gdr6pM(9fSbk|!pfsH`-EtM$O>*JfnaKR%I*aId;S$GT#^e;6vIDj8 zjdR#nO89l0)*|96;OEy>qL^B$sCSf z91&^fSJ+$JNvI!oDbXGN-7ZUSk?KJFICQmel1TO0DJQ%eM4mwpd44qmyilPLiE!^> z$MiCPeIeuZMbQ@Xa50;FkAL?@$GHPx4w&&i=fwt|38uJPYopkr`$v2Xh`^s` zc&ih3>=Q8q>oc?^opEdF#o}(&{5Qup`rTirPMwYN7AU+=*;n^LUv`kCxq~T-p!FrV zby+7f0n_W20^+~bnKDk@^vie==<6gB@@Xs?HT1HuvDd>KLaGFq>Ci=V3Fe!sn*sFY zjc@QrgadI&Li9I>mTOmGuZqQ+KZNUq!6gb0x09Ftbj3hALkvDlM-Bc7|MepG76G-3 zK`mhlDjj2nRN~wCne?_Fcp1ezf$|`md#3)L6;aL#&&Hgyp~M_j)M4JGVgpQq3Oo{@ zzSn%s?x#1M-~xFuZ(|Fo7>qmMijR9s2kDEXxMXF8BEAb@yWQItY9Hv=vnE*jLSQ%Q z3gMF`4jBlg&EhU`WoWf94V*<1PNfOj>-76FSEvk;lykIu@hSnotWH zssm*8y^%-eXz$q|N!d07ZTro%%{3YV4PCiNS`Iz$hv+pGhc0gAyLR-g?sv9EEsDMedNE5C}xKcf8a9My=(T@wOe@0I1x+c|YU^(!}u(?6#l?gq+054DP z9A9ibDJB@0Z8_(??;|`?h^-K1$uE=m8>&kG@&Jr*TG3}Da)pH#{8k8olE#taP2ez? zwnL8Uf~U~;>DL+vvjba|!1`iXW83dOHt%pwYP6ayo~|H%ua4LY1>(N%LM`aYgeK)L z^La#jGLRML43!#l3Sjv+Vz!p0dSspHk=~V(-6TC#C%%+n1|KwO7qNak>}2a(c*wM3 zttp3awqE>D*C}8J-!j_C&Nv#sXCe}dd3zNDc~I2!(qA$%S>U7}4k+=4eI7gc+srSs zw8GlX-I$HqK{y-PGxe%Yzy`82{C4ZZ>?@=zd8BfpI#-=s%tuxX#bkGfzvrUY`<>>K z;)@4$%xlWi?b;0WpDVU_wW5+w{;{-5mHXkG;eH<-15=`uIbEr=an|*WJ==z<&3F+$ zdQBnCMFuH@%P=yY``OTTT*`9D^qq8wA7Tp!grj_&2}W1UYY>&G`u*cj&6gxzHtTVQ z&CGqz5m{VR$HC!x7<}+mCPnQF2WT$$;pkyMebUhm!cTSWAc)1b0d(9zMmz@J+*2SD z*2v*HUJF|+#I(FkG$&M;(-;z6D=T;_uc6aE7y4BZr|(zON_1nIT`zjv`d!S6gShhy z-^KNDjgP$@q7sMe{q{a$=*K_1on^v88w=p)q1qg`$##=4m^I^C$s}R%^Dzf6A-uvVIxAuY7`f0H3d- zev)SdM5iZoVw_;+ss0{tLs%wQ`s}rha&N*R_M__3M|13sH`7510OkAIi-!8!BaFTXRc;DOCF=X6^A=sksyXz(tc=;lsn7?a31i_OiuPhUP zYt+Hpj4#ViUHjtAR*BhA2OA&CNY8i00k)jVb6>o!-;WuA zaYtfV!sdM4DZEU}x}1QR0wMzfBlTrBx7$XxgJFL8?`_YSyy(A5=*eq9=; z04Q;hX&%czkNWEQRvKC#2fTkGy#`!%jLo-y6euyHJzhB1U`{OW;fSA~s>%>$P1ygT zaDjh8uB*u zP4Duf_B2$EoWkUn?obACc`R$uk2QMfv2yKeu+u#Lz|D*KFikR=`wp370I_4APxQ%z zH+>2jwK|<3WI5r3HBdoS-{#n{l|IR}kDuF+3Vp^1G(& z1Q&|76pj@|Fm>u+0laVruY8el&YyHa-Be;P_kon&=W*x@5x$j7-Wi1mu!wOrM(V&R!r z@Y=1#1RM-<*;uIPWVO20lvlwOWjIs3zSHOaM93K3tj4a^d&zuIvc-V@8a|ScAcv){ z$azQYh;>{)YI2i3();N;09qd0$B9!oZF?ac9NFX)_^jqtZGPlczvxbb6;njXteUZjwqHE8geq3M#dONH3trNgok@=H-xB=q*0HMvt)31-EvihL90aokzMaStv`EZ*DsqZMC8>^J)MrHHCMR6W^qr6`yz40@eZB_ln$!QRfb?~59EMu zuF5f=irV$e-{6W_hlA~U94|xolmal*K8SUrBPV6MQ!biKH7tXiEA-2D;z_tS9ilP* zTipxCp{Sw30A=HM40SuG7xrT{1E@4+PF60M?v`7IxsaA;wAnI1VCFtIXAO7m~S z77in1qNnDVO37oME!cyCT;dmM7so~>jz}HuLqQ?gJU=L9*Et@B?#niYlR#Nrq25|wcw0%irF*K!2&5Wv$cVxy$vtc-ckz~GZx4H+omE^P zt4c6P2Ahgo?!O%yyv9(*qb>f>_wyd*1?a}P4d-VXHA9o|C7D(S zZ+C6{C0?Rn#7RJo{(zKyhl{C=y34)!*w?_!r zI9uz~sXxCI4g)NOF2+C3AF5rYeP?HVo6MZ0m8-qBgU-d(;HJWXW#cNmA#MrCT z25Z3d-=?joXfc4`^QEI;Og~>fXj)=0vCDq0#w9TO+;{tWPL8NuTy9d{JN#-6vjNUq zDZVoS4ku|*W0>eN&yR}qM5fy+s|IaVhCOfG%m#Z|QHcYN0K~Obd-9*`JVufMImk^6 zL(69VBPy5ZZP84Ra!Hf2UA&-BnND(kn}otIF|*Il7+t?a8??=TdqLp=;gnnC<-33B zYThQiP!W;$+tW^$ARWt=#u^E{1wh)w%-r(MS2Ojy&ROX*bQ;MoDXLfxz;;SE`9+|| z6$~{yQW!%J7IK7I+0hF18U1AMn-``kzpg4$w(BbirY-D}1J`h3kqWsVqV?Xwpte@W zg_@r>zdLw=bO_?Gly>rl^uRc%eVYy0o-xnO0cXJ6a&=z{_WnuX?NCc!P-X@lh3TYJ zESH|!eXcjam(P5K{494Ml^L4pKFGti)8CU1DdzgjE&CAEX-n-zp!oj8Q>r@C$x= zki0()j;-3F1v$os&FI=grj0gZJBSek$0TJvz4(Lu;R{zj?tkw4*hy& z^d?_1+=X*kOSZs<^xhstcv`UWG&5{A^l<@op)-_Yj?4y#k?PG8FI-gdr#nWw3PKJp zZO}DO%)dBad=z(yMMjzt;dmr?K7&cE^xjrL#ijwzuvPC5{4e+{5VZmFmz6XQ3iJer zbH0xI*Ld|${S|;mb^oAS@e}06ubkyhTCY}1w3QxOYp?kW(OlkDAujArP9HI=eF}sq zLXjVfZqae_drd8B^~Xs|-$t^lwj0x$ZV4CYeEQ-lw=vwjMPbNJ@L=dVYq@e-Z#;OY z>6-(me}uT))gODBZvzR!$=-n9c;inE&A+yX$-b|( zwhFNfwWA67)>S~-KrG`t;1Pg@mt_t3*n(e4s@yNcT*$=`bH@TUMixWHEG`KuDYvrWjObF#&Mb|ufd2Q*cQPa^ z=3Qy_lF#55cV7?3FEL3MiL1^E6EK$UB|Y9N;b59niq^IkH6eF{8&1ghNp8+l=EIV; zpsE1LvZqbEk4v;0r9`PAF!NoAjp=ebt$qFV0C03b^VtTk<~eBTL#7lY6Y^EVY@g$U z37ljrQU&fsk^$N78`XS01zNj>&Se_okF;FM`9;7@PYXX+#BfNIgw}4~JAf^3y5da< z12}F!Of5oPMf?TjJUC|cQaaGlr*(sJacHTPYS7MBEu<^k+%qNz4a-P~FKmvF z6jfL}Vc!(rno?~kKFIWq)8gg5k(6}a;Bp0vqT_nc#r=jD(&}%QN_`(Z>wejkrS^A& zW90@$hBRyqRlk=(#Fwqa`3;}DGf}FrpDG^v^RX+rou$OUj2G9GgzJ(x_)toEIWnlk z_^1-(oh)wkNblaLWz16zl8N6qX&kC;!H058* zpzXBN0Ra7zx$IzZ=l65+Zbja}E-*r>BW-KSOlQ9q!`oV{N3|J0AeL-je`sj`S=Ez! zY%b>mkpvIyD`y>}npiKqGC`%=ptNCNxTa5h2WTDYGQL39=AM6_m%f&C!q!0XR74kM zqx3xR@;4)#jl}2$?9*ulc{RCGOZAe;7c@K1Dh@25ffid|WNp?*cXNEg6SX0DpLyjBZRa44KCdwi6KNxRoyNwu*^>H%&PS{T@nu|A(!!tu5mh=}`d^g9vy(y>fn4 zWURkz*=$AZDLzrgX5!98>v8mUL*Haw8Dlug>BHMItrc2kow1#M2uqr;<+d-{(zZ^L zv84wk&KcZ|v`;V2e{LPtm|I3=T@L!)b?3v*;(@d)-Y8M55xes=i zi*0dXTT@uHA)y}9@~c35^kLNH%|lfgOJBD@j&rDexF8W_5~CQtTu66p zfp(+ADcQWCC9~QvXj^Ob2(AT6fyt8YwROlmIbM+pl-!%)+yxULgifoY#1&5`(w>H@ z{MH0_P&=ZTE}>44!zQv1s|4Uxz>vK$gJr7DBNAh)0Q|*-A$FG@Ar995F^EHp>ZgX^ z4aa=$SB17)p`S8TZ+fJgM2kNRXd1^}Prew4c-;3i)>Z$cG1+DwG;kn259Ghb)sU-D zlaOy9a<5t}AQsfc_A zj&2e)h;;3bkJBND#!=9G-!Ds3y<yOS)TWb4v zIbWzDLd4B9w@(}B82$Zc|2w?je^5{Z>Q@hoFDbz-^(Jxj;}c<#WnN*H3THi_U?f7Qv76hWk<}$)>y&9{$TLk4hXKeHd_N;gVXGe*M;3# zI)G|A1SDo?tLSVMc7OPtyC)YsXY9IhZCJLHyxi|VuwNMcl2lOMu0DNh_3gvC^4%~$ zi(C5)@b=D4x%k;r=)9Z2njvP9ZFqE}HyKjUItB;(vG3oQLh~_LBmU}M5?4UX2=)3W zVUlCdtXgBZDJ07f1N%FK#|7VGsE+CiHt-d2R2{5?ZzKQ_3iHyy0}&GUGzS<~{$Mjm zc3~Zs{*D!Orz@P7U&N#{Ph5I*!HHIJ1t&wO0QM!rWD+}7-g{iT24c0RGog3t#t*OGn)wIMA@-pozybI`p|FqNlv?Ujhyql|yfj`i+XaQ@ zN?W<0XG>G8QKYj5Gmn^lT!=8w;%E2eEJebIHN`I^!>U_=JWm`h_ zX*=c_g@D|7Adg4nQoM9}cHt=m?6X}KWvI>wmTB@4p9|AL)Ws@!+0NKE={2pV&#;~> zTdy)_D29fFr1ebrB?vm-(9*Gb;v5hj%}`H%0OFkTC1YmC0*@5n2#+Ye1ZJ`&_APnN4DviWS>mTEOYD=LzG$h&` zo7T&jBpM@McRag>z-undU^H3}1*h(VY|9hhE|{{Cju1vw`8mny-AE(GjqSKT*~U-x z5NPv}QcWT0#6MG@$c2EIG74?m3lXN{X|Gal2XC9e07+&g`^&T=eLjEoc1pLyWs!BP zdzUq)3`7^_%B!>V$?Of&uS)G~H03#b<9985)Xu0P{ms4V@-yv#Cu1~?xIB35zP$c* z$Gm&FTEhwaA{D)+P0}Rf9ynB%p=ZbjNLj~~DXUp#i0Qm4YRa5t0aZJuwC`H19-)8i zrVZLIpE3!>rE2c>a4IUlA4#sa=x&DA3{}bH_`4-7cR)E$Z`JV-Y5AR|#^r%!FZrPE zEaEWf(L2%9m`?YQL{)A(Ao|6;NyWBFLa0^7i82v{P%r`^RmyMo9bZ|u< zg>Y?FSJ1O6Da0`!?4B#u#E!Nz%6Kepwz(@a*wFkrxRWI4Es0+@OggsxO^AoHz2~@B zR>CoB1M5tzyuPlB$$TBDTg``(n)=v!d#AB8pc8NCaxv zJSrgqWeQr0@iiaD_FN}`8u|3+qP}nwr!s} zwr$k0ZQHhOyDRB;@5^^P>2%WXKbU*%wX?>WdyM&u#|g<)DWIg1CEmR+K0t1o9{#OO zx_Gt1dD|~C;Z08(n4~_oh>ZjgNaT9Ho=Yp7e=%`W9AwJC?xK9ZiU(+WIlXeyq}>M+ zQXzx-F;Y8t>i7g(LZQ9$u!m9S4LJ{pY3)by!f$+MmJR2|iQoMF+_MMkX)>?sG$)bh zvPpK}l&bv-7bAIzBcXs1Jet(`&>#oSznSSNCs7H`qMO~ETZuPpkJsRQ5n{QRc-m9= z)QT;vWQPcui5k$Qo~X~x8IH{}w>F1EWbehE#9_6H{kN*TB`QE7z4|9!u0g-1NZIFp>r84CSdG|Z%)r> zz!9dYb@WbBe^1j}u!?7F#i33&M8JZ%g;bUyn?eXN<`*Z_FMPu#%YI1&AsWwblf~Ki z%%QyvKN!BK_&ucD&F=d!!7K&JOy(xq0rCQ&{WKmJ8jDEV>6%jdR;6m!9u^otIVG+{ z%Crc@29&RuFSgL5fs9+hoCq;VN8=JhvR%o~FR>3%w7q+R@zOvB#B1->3f6Z|)Joq= zqTuoB{ET%DII02E+3o9t=`v|ym#VQq-4=q^DN8G-6AYM_6h~jpGR;5{C8Ozf=X2Aq zPp_1o%Kmv2vsl$^jl3IDq`--GecCbFn!Qu(KZ`kEhAb)oTBV(r(1sJc^`Tuub?S_& zEfW#sPY4R34>4_{&j!-n?R<4RjR=W~J_B^d)CIE~Bv|7evg9iZ-TjNIF#A_?UF%(fQw((_ju}kp3#`(nMVK;IXnUXb;<&eML4HSG+%>4BA26toTV$ zs5+E*HjfwKb5h2^7Paexdel$_5%&W5Db#U%b4FYk-sU5uY`9 zCk7&UxdZX4gqzFdJ*~e@00-^Ls)n*w`C%|`e@O>E&g5f6LySzY>++8XV`9 zLw_(o4q08=joFBXD>dXWnS9$%-&p$Dz1UgvJ_&TIvZENb+l?X^kKa1)4(m^6DvH

M$@)ZXIyEjGDO;51U!{n;Mm`l+VVf#gMYSJIat#ML28PrG@;eO4xh4xvuGs?CP z5|~^+3tM;+N^VF;*yxl9YLfL#+g&4+U6>?2sFC#_C<5qUF4)QE)~`EGc3>V~`r*A0 zK>PPc)}20qPSkjaq^uKIFLS+mhMK@?ty8H- z>&6JkOiHwvMP1FB*7GR;z`|UM?kvW8@xl^FymyQgYSJH}^i|&-fs5)oFiy(TiP4!% zjRk!p-P*VfLj_$5aOVx3xkVGfmBb9+@tzU)UISH7*3*&45j2W#q+y9x$X9ql6`Y+K zy7uwUH)3k<45Xr|_4lU5C>SD=mmN)X++CZYF?NQZ3;hoIN^>--$qlqcT3qL*8MPrS zczbC3^oilqcM~|RUW}DOw|Tq)gEIkeF5IDWvZoHrdB>$#9+G`cbI`rnF6Pj`nihwi zC=ARC2Hab|Gd*pV`XH@ihS0RWvJ-)}QJ_4&{_gR0X#IGJPeALC$owhUi}3`3K@l|N z!#kJ}dhX9*+xtFqw;r~29Em27p2_pDa;80~(=DF=JC>5%ubwOB<^|ifa!8t&odHm; z1I1>#O@$ybCb7z&0-`xi<8Y@t_g76+_@WY7eH@3!Grz*>uS41>)KDD~fC}v263L=? zwS4JZk1Kg7!41nvMKjL*PChPl6~7S4J4ARTDg0ujoYSXry7c1nZm%+`x4=g$J~U6g zrvYw?0>J7RY0xw1WXNtEVOfxZuUlYg3gN!wdPmQJIix1ta zy&YJ%YYsHKV1V+9*0-PEFcFO1xqQ=BSbK9zu_fv7S^@->l)Cqq9Y0<6>NpovFgde# zTEF#dxulcMO?==<@?4dNY0~{f?8PY#=RmQt9bM6VZV$KM*$Jh5c)X)Re>%M_vbZyS ze##Kb94mky>LsnoajVc*%8dz0>49oOO;=qf7ATOslc81QScGcMl=YW0Da@N&eR=qT z!Xmd;x@)_%gJ~`D;d8PKxSzcitADJ~$aC=?;@rx6pMZ==4P_4GO%dRU)#U{87k#$W z3jWZSrq7!0>PG+Q)W9D2>VihbThE+fhw>}PZ@PN1U;w41U?$tD^-(0|vPA`I?!|RZ zZW;Nl#4iaS4LD3YO!Bc^xLekOG?l884b{{XXp}_JFSWu24Ml^R<3#4sK)^w(nh|W) z)_(yzpjT%Ep~cc7EOkQ+y>@2>ob!@Qf6Pa(esV5YADp2ti@N64w8q1fW59yxCeNY7 z2Ww;zmMjS1o9@Xk1Q;W)BE5yuIl)_XxIj;DW%9$_hqtI%Wy*J+6=5Y_5#QrhY|Y89 z`8%lfERnXH1nvP)Ivqac_F6kXG_Q%mieg?*J1mnAL3!yrwg(7!kQWH723i3-{dkcr z8;T7IvPK6*V@>@c48ov^FlIh{BPxynn=Q`fx zPy^=#e{~;mM#}`UWM`h}=?m8{2eyK~qe!tMDsA4{e?H6s`Z2|wOR|MI&;Udf?Wh+9 zZ^Ztdo9&EwyAuXun2Qnc@FsH-bZU0{r&h8vQhJ?1 z*}O)cf-Zt6$n@Hz!l@BcIXphAh%|IVEx<)2fdq{n303<>JIL(TR=fSlR#cikztf~`Rn5ZJNKonZ0*P@e4 z(j^`+l#YzgIC}!Yp?N)WgH!AmX1 zPmibj)5FZpeiq$*=h880RuAN3z%{m=yiR^h6IyO^=rpSlm>yS7zKaPs-b18=)t>lh=8xm^>V8D$)MQ#k9*H6R6wHU-%o6dQn@oOLv za@!I`W+<;RU)xEH?(f!RK0yyYsXNKN52UdHu9bPUUsE9jjd-W9)u9vJD8((sZE@`r zE4JV<0R=>^dZ$%;?DAia`dgVZaNdT($cm5~=yx_>v$D-{v$p0Ueu5Ax!*g3%QARbX=cAKi;@2X}abJ?U<- zUqnU>3%YHV$`~Fm)h(S+FCv+1ZPt!!UU$_Q6OJ73sq4e6W-t55Qi@s+kr=B(DTNtH zY|(3dZ|5W-F0-y-azI|>^twKKOYu%PdHt=3qMNM1YkeN)3^`P@j`AWCT`hRAbZ{oB z?$CxahEYd{f*|+y?DI0~^Zo=*?+MLrK(rK!t^2{4@wCGB*f&fD8^=&XZ}b)l2LA3C9~lbyca_}nDfs( z8I#y)qQ^ObSHbrRttFYujmjNsEto5A%^rp38rgiZ_;Ll=Vs2k?W9+w_P>to7aE4-i zk79EX4td0r8gpuD1FAbdE;V{lfi-?-Z&or7t6DUEB#DJ^X_u>Aa@e@SzxgSrv?`z$ zJuy7HhY;_YZ3o-$joI0ms_}R$*nsPdv~tm5V+DLwvAhnpEsGYbhVMEr2CTjMLT1?p zRu!x}Xe|Gr*m*&7c!=2DKk9#QpH0wP!*QE;G4T2G!qE&>+eP(#ph%8vM-K3JPm*kk zorn4ufL1QF8NUkP`QGbpF)x=PRBmRAF|0f!b=ghpZA!5xkzk_0)r7Mdclf#OKKoFc z7?1{u-$9xxnojU@3Yy5wNaB`on{*gnHu&!^EQ!b zK= zZ5>Nv9=4*VM+ItVZY-jdrRuH|NzY(Ip|SUw{expO9mI1N58)3*8_ZAA8@2o~s6!8} zTIkszu_w1a!q|>LskIfngO+zr)VWp!@T%H+-|3~c-l`U1SrxS2Omo`s>Xn$Vy0xl* z)2CPT<2*I@hI{!aQ)e)Q+Voa}&syjs#Iai!amsCz2_07CGvw%wos;)%NQ4oOEAZXI z4*eudBE~gzU}TSyMS?yOYA&}|9eb+(pi5AF-KDVfhRoid5ex4(?iPmah)_HaL>I7X z=sbVI^0LcLpk^NxG$d_P>h|lqx}VQ$S!7)CSJ}m)-8!2UiT9GFQ`47#oBe5lB$UG! zn&xp)#qG0Mtitd#m!#W~S2?2Q>S}w}w-)`Dr;vuZZ<|psdjr9@EAs0!De`1@xxRiV zw#WTM(D*<0)5@=ZiG9tEi5AdA=zRpoJC0_>WZXdx=_Dgw=P~%A3x?? zJf#kL?jXDedzG5$6{5#bkVHOzvwf*orr+Fo(X^tYAvCjiz#?ww{wQrNQdGC>7g=QC zx<|?1ZP{9aBgr;JcEyd*0uzRS_ zFV@CHdAVtHzdG5$M@jah337|uf3PmF&R89kp;ps%v(5uS0o^1&e_8SuPP9cQ7Y2>0 zNFp+?Jwb(;xmZ$2+1Lx|UP#E;@PXc49hn-C2Ixp`K2W!Lv){ElALdG-zH+|Df^Fgk zmC5zwlwVuf1%B zI*Yu}H8!jv)9ej(%Ob>&$mrAXk?DJ~VrikYl!Nf$h&9wu&|Q>*&9PA`*?%J;Opuz| zX28doecTl8?>k0Wpb-d_!K@6kJ@=iUN&ba709Pu z4$5JsDUi)>l~IEg1vZ06m?kr?Zxd)iu9g7~NH-`AhisM|QZ`$qRP)MHd#d4v~T zcNK#Vqz&jIic#lC-1}>Z=B^jtG_&ma66RtAgePR|GXZ)OTf0Q&oz?EXDb%Xx7edU6 zMCkcVselaRie943R%hP)z|}=dFm!B@E43YRz(w=hmow6QEdiSkbBJ%`{X;le{WrFg zd@)9=-=rb9(sqowj$z>*k|+^Ie9xBs=`w%mL>)?J&&Ht-s}>FJd^5ZEN&@JInvErA zWLc~6aV9UJ3NYdOmnjC}13Z%x)pe#EjV?`mSj9d*fEZ5ZU9&D>%vKmBcilR$b6-?0 zj$BgUM8fHg(F)hz^@sBK;yUm+{CrP(l-r(=$8|qjl%GMVn#lS68N=&nY(NQY(5m^? z?Zc@e!Yy{#4X@wWNb1xbKFAlifefv7DaGQ$sNRK56Z*{0td7Y z&{gwMW)^&p!@kB*x#i*9`WSQPa-bd;3|xd_cwW=der&eVnfO|c_U2n5&hJ1$-Auhq zFrEN3E2EMh{^}dP+}%zI?%9#U!EO#RV8E5o=8(_OyAb~iu?x_;qEp3{6`7pvFt+n5 zC<1_*_W2*i;C#P|A%t|`RVg;#_xUY{(azCgN)eo1DlbS(aoK~>&yVEBgDca=1}oU} zzs zk8qOVMhEIKmmU{JiF%Lo*8JFcf~#d@f^h4s-|mo448d6|Q=dJ8o}TxwUjCi5#=R9( zNgev&IK{+1mUbb}{)1Niy@z_xa4C8mO#jz4Oet;yVYk66-4CT`yVaxy5iO#hAzPruXd za}wX;^?jP&QDm;DsYgS_?1h38O*^A|%#&T@_*p*lu=g34qWIef)PB#Mw9m2)K%I+< z#KT?>pw&BwciV?7f*pkUM&DVSdCt+BmQ*Wf<4}1WD|dBoB7HcPJ>YgfB#u2#kh;68 z_VL_d{hBMxJhXo)SJ`BcKVwbi`uiym`#`#}7Koj*O{5GI?;>=nbM4Is5sL0Fh|WK_ zyRDo_slh%Cqzb)xD2=rD*4@Y3nDRq*;}3y$nwtX*y9C+0IwC=5x0ph4i}$Ayzy?Xa zs5E*n&CER+Kz@iMHrGYW>U*b^RbwuIK6ga`&Sd;H&>@Ro`??_pJ#?h^rp_L!kVzy4 zc;~%6V6KI!BQrW!@ZE=v&ZXDm?)P-a2CRnW={bT*5RhRt{8}$`Ts>~fK+0c=eYuPh zQp;fVSo_l?kCqHVSQ=(DJOt6|W*OXMe1d+@#q8}fArq1lMKNSTLFtHFm%m*w)rYM^ z($a89c+d6R{?S7uFnd=FN3t=I*FTf-!8UtaklSJFyaT?Csy>ROaXP5y6@6;EMW!zp zyFn2s1XiR-A~#y9YVe18eqE4Jo}-sraEk-w`eCpx#g3%UUb=ay>)k*dJ>e-9rMNdg zddmle1%%hV7=daUc5<(!;u@5dX;r9FBT6} zDX}vzt6WWfoI=|8?JY8|X`U0@Elxlnrq{va9R_(@qWpD#N{kznT6%JVm;dJg!)}`@ z#A|Rmnp3+gepmZEsLm>41leg0uU2YoGOGX>xC#}2)mfwJy=2^ zH2+n5>^+bJ;`x0nXpWg>Kk|=GyvDrI>i|igY^(`p4Xr4y$`=cyZ0r$FL#kQrQ!<+w z;1_#!?p#IB&mX8rUtL*fshg1q{8%R_JPPzHyd?LlDR|Bw8AcR#_M5>=jze>V5j^7s;&cQswZDlTBHZ@RmO5asinFd91Yf?RF-~ zX8*JDn#b=(hRUP}uZK`OAgW+N+TynugQ_Q+csOt6PfePo13g~oaNC=y&SVR8<>EUl z6g7Fr7MVS;!wf?K(Xbnim$XC;%1wv12EWk)Q!hG8veK`k)MbF+fnW1 zm`g{wAjxx<`{@wGH0thT9OMqrcQ{eU`!3HqiG=LlG!B19(5%oAq|gA`Y#mN1d?>9? zN5XsNRQivtpyxXsp*ZJ$^LJxvgy}`x4i6@CWEnMC)i7+r0fiYWsW`5fcIK7Shy~+C z2HPFiH!%wIt%VF)GWgrrMC&o364lM(WbBIsR+ws4HdgOZKTW@UUUk_Q zMTCZGwvvlV1U3^qG-RFyu*^j?=A>IA@8TWPSD}@tf?MA{LT5e$>9ouyDYMA`jzRz2 zjIYHw&2A_RS(CrL6WiJQ8|kuVw49G6(?>^wmY~r*I#S=EdyIZ|1yC$`p(^ou=3no^ zs{WG|_Ci#v z@<+v3hH_b!KjsnRx!jhL8rIs#v(*Zs>q)I-<8b`e#~(0=^WYa{50^R`bs}K%?+RHL z8EK;o?8M@OXca)F3;~JpzTp zZJ=sc_WYh6)zKobR$(~lCnnflsT`YUApYR*z@Pw{qleK#^teukT|eHymRr$fd{UkZ znvQPzU-8M3cS2~O`0dhx=jJm0vD#H1XYF7HK^GF+vInBC?>7eKC5AZP;-iwVuC`(~ zghE?v#Xa_{Nl$ild%s>g?9#swnSj$nR=RsORzNMLX>vYiCiwM7);jvw1oam^_OxpT zDWiB8^n6XXg5RGN^>~M+1H@CGrnH>q@~9Ig$_QrU8&lwQ%yO3Cw6;FCEX9M+jXZC+ z!!LBwUIU|Pua&64rEBOmh7Wgl%lrB}i7^$2c|Z4@NrBYV)gQW%kZL;~DqZBoIYe_m znlLkXpf#_4bESGL%$66oPe+AA3V%x#H^~r#vwFBPcn1ec?xZZr-c9-6e;FbC$%WeO zS+8h1j(RJD_imD9&xg`9il(;x%m8aA@}fD_JKi%OeV$8MH)({NTT@?++#O%F*H|gS z((y<#+Or)c^;74QJD%~+%*`izSte=iynE`t*Mr1#eP*;hA{NA3YxOlM$0_bVc{!V# z5{$xX%Uv>ul)Jnw@yN9Xx>?TufGI+CcFT26I420GSBOomkbqvl#D}-Nx(O081D5H* zeB86Kkv%TgNmlovSWa{$#)|eHD3OguF!-c!XfkyLz|_JLtQkhp&ni{{qBtZgyF!3v ziNyW;hrUDkUSEl99KDWqT$;aG$MtiD258rkmew>EzXlGcQLfT<=Vfj&#V2k`k^ zy#gUl3}}YOcOZINC`t#w^;G6g_wc2){82AgUYQ=^)I27di}b(kMw)$ocG<&jIHp6z zu{C>Bx!zhfglM=?>-oMPb+FctVsWr0Ne@D6o^*M7K#~-Up7v2Nf5{C!sAzqR%~E?^ zo7VjNdbd@;>HMg{oYF3s)H8)AxL6xYra5E6k1J%kkpBchwYm@6W*Y-MC=$#D*QjqvFn90QM4gp>sl(1@!B9gOWO-6}K9b17L zksdv~cwNh{AaCGk!K%V*U10lo+ai1#LEXWX%ZbkpRcNiV@XeNWH}&&!?2#K1U0L)q z?Kurp;cFvsB&J4RPyE-_#JBcNFbN8}sRQqBu-S46aw)GK% zke#o*nUW1{uxvtLc2(F*J|Ms|oi3&PqX;Oq0d4pd)XW91-ad_T(iiT_mFv3(OXF)##^V~|OwA1?TN5uV}&DIdWK5Xu# zHFSnu3QD&}k2E5vHOgGmo~{8$-^fJIVXoF#MlEje)FWk-s1dVOh=*PM7tRVSxG$q3 z@j!C3C_`UtUSUmsxEbn>FfC0o{h?xam`d*@F<8DyMfWZ+tfGdLFXGhsFh;s$Y|D9G zDc@u^DFo(+r#h`}Re)H;N9v%$tZ&~8Dsm>~xKS)Ru1ix2bq|I)(#$vb)SNWs+h1^V z+DW=Uy}iuc<+KbKbLC>)a`zilm*L_!-?9;G@!*g?o3AoGXvN6OP~&XF3IgigyQWXT zyloP-*7=ixfy7-V5dz$+*%wJrCx!ZkA?55V8jxXAJs*m862nRYC`}e-;iJ@wsyQ7_ zsA}%!ZqB~Y{eSW{ObUY*YQ?YNwQdXhnE+^~?IrmrDImTmi?DjxHiR=bb5aI0CC03t z^^Bt)r0k%PjTEc9Z3rdT#R6S!v;zO|eectttle;cD$ROC4HU_~vkB||cnrNhVV+|x zx~C2e7o3-#2!(q|tPb3bs@t9{7Z7n-wnsc42Q0kCu+a1a*Wah6U9UF-{wL9WlnNX5 zp9bE4Q;PmYRQMl8Dh19{%V)qyI`Lbi3F4AZffa+~HNq#M2Fx4EYXVA230Po|(|{GD zjsN^19JM!|$>>@H3E$ zbFW#}(8JfE*k)yd7x(-5(IkZy-(jO!iUAzMOMm1*6^|^RvX%gxhszLVEde@9N`$bh z4`?iwUS09Vry;a>DM1&%Vd(lS1{7Z@qi9$HJTuN+4F-*S-}F9G#pf}SqZLAndsgqx z{yPx=BkY|v1H9;`c>G=lX#PJEE7&Y73IAO4e{(1PwdN`Rm8Hp^Y=i9Q{}sG9_|bhs zRe@R&Cku~Y#WghCFBzzz08fNfhmhNk#@c@a#XdD6&2aPN+O(EFJm4;=_6A0CB1k*U zWC7*z_^89R(p9SSw3RwNq}F$xo0SRqZqC>=((E4olgJnrP5^BLT!=ovPD&r%Gr(+0 zAIULk1Q4m-&!}1(!BS}il)2i^>RKDg(=RC_%!}Ng59(PL>@d zi9I!dyLUBZ_J}$*2u){*NJu<~1(zF%wDn)yqR7PvqT zN5ym_PdOAMR_M=?Xcksnty_Iv4H6TI8JZXT>Dck6XQX}n;HCZ4cRqbd|70`MDmZv) zZYIeg_|{{&@y>ciJHtVcwQ=rf=Hri`0^iIW3^AxM~s z<}H))wJ^$^2x(EF%h3Bn8P~}p$0peW$S3~6lUh#F3*OAR(ySgc{e7zIt{J8I)36M&m6&{>C+^0pdH0XHiDz3o`%*Nz;hY(@j*sIJd>Rq)WNR1`1gNu02Q8f&B)qnq`^ zfxFJy{6$@Q6bQuf=QW}U8cg;?Pg3!*kI(JU3mL*B4c<$MT#FAHuPaL>5v}8{!t5@{ zi-X$R)BEZ3oNtg`$rhVv0y{)M_0e&rP;qwfr!Gyl^-~BA_?A#IDutr9h`j}>lz{v`#N@VRU|Fn1dBlO!-Mg3?e?yY%a<`T~E@5dERPqS$l17eaf zEfzu%z7Y{IaH{bD4Ws6lad0q1%Jb+qC}MWIqr)#hYHWaYSEyzYe@&uXUZ1bFuM=JD z1SLXf98vw7D_)$yA$oLScdTax4)Ln(p)wv;NC06`R0%V1!I^I?FR~7Kmc4BkL8*vi z2Z|G>CXrPYbkluA-d~wAKr+@)hvLycpRM*zJ)*vSa};xQZI(rL^DO0QBf-|yQ>0sa zWcsBu;YA-2w-x%H8#5wL;^7{MDeA?dLPO={h%1h9!jfQYE>O2kA!5VfmntPS-_Fj5nb#XDh=(VrX=B~yR<;kC&YtX7kZ?lCH!V6u3 z(^VW>m^U|dMWgRm`3#RAXQeP)J|g^iwDB!?`h~&1gbt005iLSYnGw;!W%y!|Af(#b zH$G5~QR23kj>*3TkkuN$=^3xFlwcx<9Us zdcgCWC&!wcb&yE0d9plRw%HXmzCNJ3KwcY3oN}IMLPUS`ed~NID6t^CaBVmJ46tt~ zw8Tnb9qXE9Zxi&V`)VdE29$dlV)@u|Y(5Zh)a2D<{L!4|}-)R#H zgYWWc84elRZOWrrGvoZvzR^$e@QyIQBK5B6u|0n;P(uk9Oq1)5l(SWy}n!?jE*&bWe^vCuQV2ZSyp#7uFo0d=+%`NPSndl=vCZt#(L?bGijOIZvCOReIQNto1BcTU zrlZtp$0vb(pHm3ApE^kgt`6WIxzlN*7!vaeKW=pSxDN{*OXmqT9nrxh<@V1G98V>y zP*Eu~^y%1B;VsJEeh_KN-BcOi58F%$VAd_MtvXy^cH?EEvSP-V)YpC+?U%getccRj zbT#Sg%TNfrPiF5Mi_dKx?mH*;VE-9TscGIO4pI9;R^&|u$rpRnX4{N6xc_}xOah%O z`tA20A|c6X@9UqZ>c8>v;r8oX%+5;1CS4=jYS~K2CP3 zaRULg2oH?5E(UbIbi<`1gr|8y^RsW=sdXNaf*GSTcZF z=$Wlr62GgUORE)D+)Q~>)dFz-`$70ZOW^#ag3ATq43(GV%@^P1o=MMuF|JwMjE5aY zyl354#f| zjEa&cp|=PF|Bqd;_7`jY&yxNfyZ%>6;{TH+F#`NY0aKEmZ~rKO`QPbk{{Ko<5B>jc z!~b5B>eFOQ0Y5TZ*EG#ToI!evh5?adNib7?!ipqe|*^{u`}7(#r< zi+)5IMf~SPK5^;SJWOgQp9R3#Ne{K&-&AU?%?c{|uQPb916-rOg8q$*jtPHi`25rW zqG(E&Hoh5P{wr|jXBFTqkAylBC!le;{7{BJv z!*3P~e$T#fF^zQojFX$iM{Il>gt3BLxFVmQatCC9vynt~+T>prp(qr=TI3aw0Bxai*FZ zXxs?mVmyZkxqwAzsCRX;VDrD1A8@lF{*&2dK4yvZ&$s{Y^zpx>J@&t({o-HXF8E*I zuCoAbQ~h$WT2O?xt4)3iJIWYIh>TQKvREb8M1tZd2@Qg15Fv?#a2PH02n{n4Q(KY1 zWQc+Jri$anw%=~{iN}nSFULvh%!5zP1NOcH7?u{9LB4#x{gcympRK@oDDV>y?#EIS z#5pd2fFD@fdj~LZw$sne_U01X>emME>H^E`*GA>tgRf2CcFT5^Osn*3k0sI;?Gkj#MEwyTi;hm7mgo-BLY@(Dm`A$pW_R2%ok`t19{h!dp zM1>dxKiDg;#Q9hVoJ?~l4{q_)6*WVXM}y4DXu-!bROI(u78sFcxlGy`=mDzgh0U8- z_F3_*1)D~XUta^n7i=Xjg$|fO7DW;RN;pYF215$ythdBho*dB3YZ>iKM~U<;3l=z5 z{!pk;SDudxTkLupJ6{{nVCG^t$YQWfLHIwRr#5D;#7HQ}!C8VaGX4(US%!-0Bt@8O zqD(std(jL-GvwCT=3YrIZkM>hj&Hv|Q54ab>r02CJ2=WJj2HwaEy0$|G#ji$uI&Hb zu=E{G5g+bVk3+9=ASQG58|3ZAFEnf)J12 za-Dy64U3%|b_C&Jlw5P!6I1#C_a6r1(5K+c4SVzDJnRXEzI2D=1q1kZ1Z9^5tK*`b z!-2~WteBlUF*(HuVg**Mz2^OV5K#T6&OhHYL>|5g6h9=6}*J!wm>M)6_+;^b33Av>ennB`l% z{@SLKr)T#w-DrG5g^s1>mE%;5CY8(lfw`!blKd?6?>74)vKu)1`RY|C`goA+jZQdm!=&_YPpmJHR*Uu(=;+ zLPY&W8;5Fv6(q-5vQFEV#hUzUTdVq&Xc#uEiAMQ8@2KWg!syHS5ysHXRl;81_q;C~ z6O5FVlq-Uht}fu?;GRF-kH#5{c2QXDp5EXyX+X`T??>!86Qvgt+{^#M~EW#x-*^}~5{n3V>D_n5*h#|X1;bu+37QoYbrczrRV zN#XKKy)DDn+HldMBk;R@dx7XyYA! z_wwL*;kiOQnw3TUK%Lodn8??X&A#~CbYO~rB$t$d<08Do4G?8s_K^I|>7wq|QFF8^ zf-&H`sq&9e)eF14Pl#r%<)qNaXqrhW%?m*Z+ogXG9@N=3gr^|InLVr2xAmWQoyV<9 zF@_J$kaDSJW2Ft#BJi3Bsx49oyn#)3>YjM;^l;C>?YvyP zb@QfQk8H)flT&Idw@O2o$Ola$*+2+)z*`Z9^FwoZ@xFWWAC@jv71YGV|sPQc*>0jiW}#-Sn<(VDvE3O)jlP# zJp>EOWPy(IZ6?#lDh}D)HRIp%)+m-bK0+WOH2~>``ZXt=4m7C}-$~chrcEd#L+`-SZ98 z9OJH=!*D?87JXqKf`xYRiMBavS!K?&cGP}I6MC!v2W~72?*8*qmBo=IJ(4S?$ZDh{ zCMdaOX6VzU>y+|6gn4uLSG%cV>Px#rYl@{+HP#fc=5I(EW>aJi(iGF21%=x+`KQFy z0z9N^hYc()ck$YqxZ_)3@rF9h1Z;~`ub$Q-;^!QD==c=h4)2g4gg}wxdJoq12fClS zPYSFTc-$Pz7Vg<1<5vxn$G()@SWoXovg__lHG)BXo`>>hMZT40S+hm6PTxW+C9V-z9QDWnZW*)32X8 zes#F&DT~O};>#dDZO`k433X$UK|8g%^IjRb>^{g|mQJN(v-$x}(N<+Q0^*)SU8Sr- z5w2DqI$w3rLKqK%v9Dhz?~6;eSf$jWsc1y@8K~aS_qli_n@i%a=uP;EIK5fGUzTG^ zslIcUEvc=(u}l0Skp+po04J38+&2DGLJ?dUFg13*Ee+o4`q@RF8O!4f2eUA*u}gk* zgT+2DBw%P}GOb2vo`k)PX1pF9HQToX5vt?pgM!%CK2{2dxX7!trTXxGsJd3ad&I8j z)So>K9xNYcywb?i47&XX4V&B?Z)90AB!ow*u*{0Uyo@d9mq_0f|4fPm^$J3;g4X?Q zjD@|Vss#`%+HlG-a?|LPpUnC%h6m(8L1o*4#S01jY6+Hyh6#SY`9d8&-#*cR<)E~J zF<5GHFCQ^gMQDs;HpNCWlf1Od?Ap}L==E#8bxh{bUCGYgVB0nSYaqMNC7U#P>tltq zdH%vj4K7)~hw~a#3pixIunD=>5(ElX z23OMv#?IN78X{pY)+AXh?&((-;02xHl4}^l)l#?n-eZ4RV9c@Ksc5y>9=|M-qis8-la4{RZ;5wVQd)(5m2SXHM zKe6F3-ce1IS(MofaKlchx^a^(v_yF~7FuK?+S zo~}ZtZqi2KaWR9g)1~yN@htrw6Xn7Z1j2}$yu>~)m6*MbxnAwOqDTJ7Eo*J^R;sR1 z=y1sLu|Z@b&vmcyEJx(UNkgsF*@+?wR&7W_v&QCH&Dvhv49sK(Db{U=-Xvzq^iU)P z!g(n8RT$F0A=B4qj|JB@CMpe0PdmN-2>5>NN4(V`9Bb|b5 zKtMVL=}@Gk5fEvYfHYFlB`qu(kq+rzg!El6XX`n@+GpH5#{O_WF!;i6J@se4^PRCC zUyG=(X_=tO^4oQ)@uxNqg^un#tV+Wk53Nf)WzOT5ei4*w`hvG~ zQaYInTPfg(Q3;J_G*kl*{?K7ncua^f`Kf(Xp>bCW7uKu3erej#i)%@!!1z0&S0Ac3 zlCD$#El~1*yh)wesP|2;{&t6W;Z{svdlh(tbbij_4?8bQdsBzK;jgVl8(8>mbq>j= zL-oB2Q*9TWDjPT{TZd*?4JN*_hNdF{@w^8owVd8cBO+$ghVDY!Tg^cSLYN7WUhY5J ze1<=Sbz;;{RqD8!p?zc8pYTa~{%Xr7=LQx?xj1S1 zmx)H5dv1+bKZtVgra#DmvqY%e?Oc^Sj#GOYOcdpF=NVX^SZ*n&7?lierCU7hTeyE2 zzU+mM2K7eYg~uDDD7&L7wm~vEU-Xl=<|v>y`KARF{w~jUJuHc-Z4Yh1Qi9a%2lsyl z-<9(-fdq=xUe;>AWeKTM zvBHx)|3Nq)k37KYntB_W-3>aNH0?kf7${^_u|QZ!oh}uI`0e3HG*n1a7ku)Fv`34o z!2DdKjST`zj6pK+#pdbz zut0(rN)2NepfK&~)HFEsN_XT^MuZi&i;2)IcuT?g_gTFDE?d#2UC{3>6K*q&T!Oc} zcKFptC<0dx|977GSM=t0Vs-$Um|dnqaVV3w3^Pz?i*;gldw@#yi8Xs7_L)3G6`P5Z zUYJ)6OIdV&J-&D8M_rmK9XhH*tdE_1=9s4DJc5||njkap3;(TT$XW7I!jf|@q_+12 zBI>>=J0W`Z;e$`S!mtP-85Lf(#r?igtkMBq`sKjZHij=q?G%yWB811&_0A41Udsv+ z;p1a{3#n6B1rpEtlQP}rUHsHBo-7J7rp%;SUZS>dy| zM{w_3Dz$_z=>5<|KF+pAjkn`-ggfm=X8eTOXR6@0OgZ9A$ayMvc2J&mb91}w2k~ln zsba-|LrU?R@mHE>DI%R5qTJ5!*-pLG2eH>9k-INTI8>+BCZP!5?u-lYAX+sFBO9!A z$A~#K{h0Y_^6}Oz!v+g0T``%M!C>XeT7)SrIFG5p4j1IKP{7}U^rv3@vu^?5z*NvG zzaVXp)C;pt;Sal%4_)O&FzQ}49`~xKt$cB;<*p$i^a#ZMUY}%Ec4UDES+jrkyDQieI!3g$B=BP>&ePLEuBj*w*@U%B`M4;E{Pe!kf z)>>~0&Jt*ivTF(b;$7ifA#f!DjXX!osrES^*Xy%Pyw}1}&z0z?HL2ltourhs`nW($ zTaHl~*mM@XeQTxrNprdSCdLk`E9seUz-OQcw)^ljIXJ zPHy37jEEIJarH8urEIkgLO%>M9?2PMFUx(L>B~M@JYyq@PgPKDSZbF>5^tHcXq>Dw zW5_^$M^g~F?cD}pk-=L(_D>5%k3b*OGtv#7v&W*bdp^Z+LLepacIU0r3PaZcjk4oP zFH5Q&^`w~5w0ZaJ=E4`mTr{u_hyVPU1y`Uf6F>Cbqe;biri>>9hjNa$b1Z1eRHczD zri6xEQOEFb1a($A&cgLRQ$i$rtGY1lu+i*{@#X_k~<^e z3)-K3%sV*e*s!WAMtQrLVsjSdAU-BK7yO#9pqu} zokgbnTbxdUwuJGEJP4f64Zw1pM9fIZcUzo?849!#5V7r_UTHpmF=CN{7Hq)iLV^dmfSa;;bxN-v1?KU3=h1}C#-^BnG7}x@ z8gLr+2GSWSteuBaGGtRqZKDwURq8$XF6QUwp|dOoXLMMlPsS5NVoYC$cf;)u9F}BZaA{p?j)7p?- zJ@ys%Ht2FuI4OQ0$XF$E1y$jWS@2fJHMLcQ*@cnDi;)aUah32Dz*B)^lfO&D`wY`n zj+>#Xb}#0V=#1<<2+_>DMH#1X+^OA@K#T~a?HY)W6Nclwa6^;b2%QnO(Z zdW>6diTOMYi*fPj8B^>rH`{C`Tzkxxt?KE!05Wm9z=sq(9?H)PdpJ{WIWu@hmNyFo zv#BK0#0JiM8Nw_ClLro@?^gVF$g)AxEj9MJa506lH>bb?)0m?Z}K1X zG#hFlMiy(6WyEP^HV>>?cu&?bQnh>C-8KwC$2!)m24xZjdZNSqI~jEcEsQ;fvUcA^ zyfz2JC-yqd*VE8y&K>K^d_~)9ESvHV55$|D-P~%cEx`4@PBKSr_YWx7r^W5WokkyX z2B;{VPqUxg`yo+XWs9>eaqm=bQe%H;YVTy&tA@O2eKg3+tN92La0YfMZyegu$2E!KME2Y6Tvw=e5lzjM7i=<-L2M1*g{<% zJL0>#aL$6`v$)-yHdeJbJhf)20VXtjnM^f;;oI{iVp+jE<}aJL%)h=i4%Uo!ne?6M z)psk};+(DvZ@k%5n1$wUhu zCFDG)Ag-)t>=~CSE{+(j)m2?S{_(b=ZQ-fp;g2Oi{9>4#0Xr};xQ@NY#Kyer_| zn`@>EDtc9|+_F91!K4?`@?f>BKGJQHsaT@u8DmX+^Sb)NDzDo7cI{kZ=$4V_Osz)2 zzIuNAs$xaISb6f#jy|UzZ$ULoZ$d@+&`Gbdr=8oQ<8*CRvKB1kct4@(h}x;fOfuUf z$Qw*~FBe1aXC7ZIDa^Dh40SjQnhH52>*d~)8}kRaUD~=_b-{H^Jt`?!Zt{KW z{yaxU-jTM%{y|pSA{ySPVZ^9|!`NOFaF04^eZckS zFt!op2IdH_MRO?_g?O#&WHty@StTNxkU&aemC$kVx+pNPG?GPzeZN~WMql1&~jp!Bvk}10s4JaL>jF#w8wq!ElR<; zUrzd|iViacM9iq(Qr{Ac$!;EJ5*TnUdvxe=*z_dijD*e!ZxS_PHO*w2ZX-5tKhLcZ4 zIsV1kH*d>&OM~Ezs;=t(>6cl|4I{^-IMSYb>1@`{5?=f=NJ8!W96sbr?{^#Q>05_(Bq8Zc)(xlRBno4@`R-AX zA*Jv2!p@;Rkeb^=>Oqq8r3wfyBcx3HJ}QSY5N8tKiqt;qXD`2?3B+o#${S!29;WRKJtZ%oqb_qUVplHB+gi1`JxaC>X|wNHNy=KP}Hhhv*TU0U22z{jdqnbv`bw}gZ7N#{d#;B$ z4#t|h?}W&334CRt-#!5y7g`^_(PVi&r@DZjt;P8=$6B0b&Xr>{Z{oXaVHlDKx=7LE zkqtP=SrA6q8bnH$*P}f~2#L}rJko9J=iZOo`u=GBDpSxYC!CFy?8FKjof(`hYja(4y=9xwI4d?1}KYggluY zN6ME&!c`W#4AC;eEnAPiR)j!`fcy6Pcgtd|>nO8OLG{xU8w(OgtHm27rS{r{P5^TjJEFX4i^5xT4VOsR(_(A4eUy7Ym zM5V*3!GOD0dX87HbUP9H#WH5?!}9y!yhm>RydK-b`&;I;oNs2iojSJ!(&8`1+s9if ztA-Iy7PIrY#JCF+Y=6!uZpdU_=#+BcVG!NNv_m#!<=cFi@8g_-0{O^Vdbq3v|03}q zd^rwV@35LvL-eQmSr2oUicyk$@yz%E|FpK2>DRERyH;pe+Zjx}v_Iwy;~WVNghr1t z9#0H%e&xBXACE)uiASb5?LJ+(%y0%#rxVMQOwxeleAkN#Q$*8>W333*ko51BPkK{+ zYUUO>kA#uUPX~$23%0TpY$1h$RIUU=S6sI7w5w)p)gD?>ZuUYUDjlP21 z(lyN|LOf|&*81Kd?aFDRipMBY`j-fC-TRwCX>DC8hP_xVlHEieV`ZwV=VvHaJy@4n z_WG-j)!$V;zkGmy()|&bJv*|2-YJ0kkyEGx2Sn#)=*58zsyyz!$AAOc=;dVVha0fw zK-4FPTd@`s(qQ*@3CV0Ekfj!bJYCRIp|0yaG*iNjsy8Z8VTVTawjPx;BFV|}ebwxQ zA7E5Re)B={*niP#R+!pQ%ULA%j$BbEFM9N z<^Jle@tzq&>XOvY;N7SahjsRR* zfC~Mgfom{Lx2=GNn}M4vkpEgF@XPNq1Z{lj++AnxE~hhwLGL>N?moE6Y(gpHOXXf? z>e9;*ji8?ksQD^W0{s-@%Ok(es8uQGfuQpO?u@z0$ZkK`=-VOODMw)QwSu=ZBqu&KLYAruR_sQ00dJBK>aLGAbS&Hv<4uUQpitajctcc z4aksO9Vz<~f~f^34rFzjzxLr8WDAT0Qw--2t5)C*2H3o-5d1R$f~kfN+?{SfE(=h@ zRY=zhfMCjjC}X?@$n@M?lf5?p!PJA}bet{~%<0+q0uW3=xXkao2Ld2Br}yO*0KrrQ z@LKvy;aAu6JqQZ%z*Gd6B?hDs=14)o00dJJe?O962mrxUgt>in3OUS;U=IZ#n2Jbh z{CwUFb9(;K00dJJzynGi3IR`}s~h1J13)kpp|Z0n*#dK<^GgV(BBXTvP%5E{0F3d~ zk&a`5kzgu9nPf02@Gt9i6H>gZDgtOl0D28>ny_>L`d4GZbwvOb>_9c$&5cNfhlfHi6#-P} z!G<8H00dJJKm`J9vn&TSg~og^6#?YuVVh;6+W-Vp5kOuS_Td`f0}xC_0AXv`X898t z0Krtm-y6#gasYy<2q3x&{TGGt0C+|LKrj{Y_aiyn0U(%)0OEtNAD?$9q0qmgh1V4U zy#2tQo(ls2!BoWGn`L`O0D`Fqz}1HuI2aqTa|!*W2&7B5NdQg&jvfOJZtX5q;&A^1 Deym&I literal 0 HcmV?d00001 diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json new file mode 100644 index 0000000000..2f14965ca9 --- /dev/null +++ b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json @@ -0,0 +1,1373 @@ +{ + "entries": [ + { + "path": "config.yaml", + "kind": "file", + "size": 288, + "sha256": "e4142ea4adc900fb4870b4c31a465f0bf885ea925ee762f8aa688db5cfa82fbb" + }, + { + "path": "episode_0/head_camera.mp4", + "kind": "file", + "size": 544, + "sha256": "9f2ff969f02f9dd114ead58b074424d237b6a2109790434998549c09f6eaae36" + }, + { + "path": "episode_0/wrist_camera.mp4", + "kind": "file", + "size": 560, + "sha256": "140f5fa6e646b0bc7ac525867ac191a2b8ea76ccc17b46c702daa36e619be6d6" + }, + { + "path": "episode_1/head_camera.mp4", + "kind": "file", + "size": 544, + "sha256": "520464427520ebe79e6c809f6632ca024236bb44f540a604f1068d5c63ea1fd4" + }, + { + "path": "episode_1/wrist_camera.mp4", + "kind": "file", + "size": 560, + "sha256": "fc228cf71fa912a8e41b9840c11fad07f032a8d671a008b42b6d90b38020745a" + }, + { + "path": "zarr.json", + "kind": "root_json", + "zarr_format": 3, + "node_type": "group", + "attributes": { + "index_source": "head_camera" + } + }, + { + "path": "episode_0", + "kind": "group", + "attributes": { + "task_description": "episode task", + "timing": { + "clock": "monotonic", + "offset_s": 0.25 + } + } + }, + { + "path": "episode_0/glove", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/glove/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a0", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a1", + "info_chunks": [ + 18, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_sensor_count_interp", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a2", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/left_sensor_rotation_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4 + ], + "attributes": {}, + "npz_key": "a3", + "info_chunks": [ + 18, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a4", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/glove/right_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a5", + "info_chunks": [ + 18, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/head_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a6", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a7", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a8", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a9", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/head_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a10", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller", + "kind": "group", + "attributes": { + "handedness": "both" + } + }, + { + "path": "episode_0/pico_controller/a_button", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a11", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/body_joints_valid", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a12", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a13", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/head_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a14", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/left_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a15", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/left_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a16", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a17", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/right_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a18", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/pico_controller/right_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a19", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_0/wrist_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a20", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a21", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a22", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 18, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a23", + "info_chunks": [ + 18, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/wrist_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a24", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/valid_indices", + "kind": "array", + "dtype": "bool", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a25", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_0/valid_timestamps", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a26", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1", + "kind": "group", + "attributes": { + "task_description": "episode task", + "timing": { + "clock": "monotonic", + "offset_s": 0.25 + } + } + }, + { + "path": "episode_1/glove", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_1/glove/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a27", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/left_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a28", + "info_chunks": [ + 35, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/left_sensor_count_interp", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a29", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/left_sensor_rotation_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4 + ], + "attributes": {}, + "npz_key": "a30", + "info_chunks": [ + 35, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 54 + ], + "attributes": {}, + "npz_key": "a31", + "info_chunks": [ + 54 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/glove/right_hand_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 5, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a32", + "info_chunks": [ + 35, + 5, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_1/head_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a33", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a34", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a35", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a36", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/head_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a37", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller", + "kind": "group", + "attributes": { + "handedness": "both" + } + }, + { + "path": "episode_1/pico_controller/a_button", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a38", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/body_joints_valid", + "kind": "array", + "dtype": "bool", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a39", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a40", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/head_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a41", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/left_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a42", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/left_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a43", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 56 + ], + "attributes": {}, + "npz_key": "a44", + "info_chunks": [ + 56 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/right_pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a45", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/pico_controller/right_trigger_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a46", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera", + "kind": "group", + "attributes": {} + }, + { + "path": "episode_1/wrist_camera/aligned_frame_indices", + "kind": "array", + "dtype": "int64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a47", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/capture_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a48", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/frame_id", + "kind": "array", + "dtype": "int64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a49", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/pose_interp", + "kind": "array", + "dtype": "float64", + "shape": [ + 35, + 4, + 4 + ], + "attributes": {}, + "npz_key": "a50", + "info_chunks": [ + 35, + 4, + 4 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/wrist_camera/receive_time", + "kind": "array", + "dtype": "float64", + "shape": [ + 18 + ], + "attributes": {}, + "npz_key": "a51", + "info_chunks": [ + 18 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/valid_indices", + "kind": "array", + "dtype": "bool", + "shape": [ + 36 + ], + "attributes": {}, + "npz_key": "a52", + "info_chunks": [ + 36 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + }, + { + "path": "episode_1/valid_timestamps", + "kind": "array", + "dtype": "float64", + "shape": [ + 35 + ], + "attributes": {}, + "npz_key": "a53", + "info_chunks": [ + 35 + ], + "info_codecs": [ + "BytesCodec", + "ZstdCodec" + ] + } + ], + "reference_tree_listing": [ + "config.yaml", + "episode_0", + "episode_0/glove", + "episode_0/glove/capture_time", + "episode_0/glove/capture_time/c", + "episode_0/glove/capture_time/c/0", + "episode_0/glove/capture_time/zarr.json", + "episode_0/glove/left_hand_pose_interp", + "episode_0/glove/left_hand_pose_interp/c", + "episode_0/glove/left_hand_pose_interp/c/0", + "episode_0/glove/left_hand_pose_interp/c/0/0", + "episode_0/glove/left_hand_pose_interp/c/0/0/0", + "episode_0/glove/left_hand_pose_interp/c/0/0/0/0", + "episode_0/glove/left_hand_pose_interp/zarr.json", + "episode_0/glove/left_sensor_count_interp", + "episode_0/glove/left_sensor_count_interp/c", + "episode_0/glove/left_sensor_count_interp/c/0", + "episode_0/glove/left_sensor_count_interp/zarr.json", + "episode_0/glove/left_sensor_rotation_interp", + "episode_0/glove/left_sensor_rotation_interp/c", + "episode_0/glove/left_sensor_rotation_interp/c/0", + "episode_0/glove/left_sensor_rotation_interp/c/0/0", + "episode_0/glove/left_sensor_rotation_interp/zarr.json", + "episode_0/glove/receive_time", + "episode_0/glove/receive_time/c", + "episode_0/glove/receive_time/c/0", + "episode_0/glove/receive_time/zarr.json", + "episode_0/glove/right_hand_pose_interp", + "episode_0/glove/right_hand_pose_interp/c", + "episode_0/glove/right_hand_pose_interp/c/0", + "episode_0/glove/right_hand_pose_interp/c/0/0", + "episode_0/glove/right_hand_pose_interp/c/0/0/0", + "episode_0/glove/right_hand_pose_interp/c/0/0/0/0", + "episode_0/glove/right_hand_pose_interp/zarr.json", + "episode_0/glove/zarr.json", + "episode_0/head_camera", + "episode_0/head_camera.mp4", + "episode_0/head_camera/aligned_frame_indices", + "episode_0/head_camera/aligned_frame_indices/c", + "episode_0/head_camera/aligned_frame_indices/c/0", + "episode_0/head_camera/aligned_frame_indices/zarr.json", + "episode_0/head_camera/capture_time", + "episode_0/head_camera/capture_time/c", + "episode_0/head_camera/capture_time/c/0", + "episode_0/head_camera/capture_time/zarr.json", + "episode_0/head_camera/frame_id", + "episode_0/head_camera/frame_id/c", + "episode_0/head_camera/frame_id/c/0", + "episode_0/head_camera/frame_id/zarr.json", + "episode_0/head_camera/pose_interp", + "episode_0/head_camera/pose_interp/c", + "episode_0/head_camera/pose_interp/c/0", + "episode_0/head_camera/pose_interp/c/0/0", + "episode_0/head_camera/pose_interp/c/0/0/0", + "episode_0/head_camera/pose_interp/zarr.json", + "episode_0/head_camera/receive_time", + "episode_0/head_camera/receive_time/c", + "episode_0/head_camera/receive_time/c/0", + "episode_0/head_camera/receive_time/zarr.json", + "episode_0/head_camera/zarr.json", + "episode_0/pico_controller", + "episode_0/pico_controller/a_button", + "episode_0/pico_controller/a_button/c", + "episode_0/pico_controller/a_button/c/0", + "episode_0/pico_controller/a_button/zarr.json", + "episode_0/pico_controller/body_joints_valid", + "episode_0/pico_controller/body_joints_valid/c", + "episode_0/pico_controller/body_joints_valid/c/0", + "episode_0/pico_controller/body_joints_valid/zarr.json", + "episode_0/pico_controller/capture_time", + "episode_0/pico_controller/capture_time/c", + "episode_0/pico_controller/capture_time/c/0", + "episode_0/pico_controller/capture_time/zarr.json", + "episode_0/pico_controller/head_pose_interp", + "episode_0/pico_controller/head_pose_interp/c", + "episode_0/pico_controller/head_pose_interp/c/0", + "episode_0/pico_controller/head_pose_interp/c/0/0", + "episode_0/pico_controller/head_pose_interp/c/0/0/0", + "episode_0/pico_controller/head_pose_interp/zarr.json", + "episode_0/pico_controller/left_pose_interp", + "episode_0/pico_controller/left_pose_interp/c", + "episode_0/pico_controller/left_pose_interp/c/0", + "episode_0/pico_controller/left_pose_interp/c/0/0", + "episode_0/pico_controller/left_pose_interp/c/0/0/0", + "episode_0/pico_controller/left_pose_interp/zarr.json", + "episode_0/pico_controller/left_trigger_interp", + "episode_0/pico_controller/left_trigger_interp/c", + "episode_0/pico_controller/left_trigger_interp/c/0", + "episode_0/pico_controller/left_trigger_interp/zarr.json", + "episode_0/pico_controller/receive_time", + "episode_0/pico_controller/receive_time/c", + "episode_0/pico_controller/receive_time/c/0", + "episode_0/pico_controller/receive_time/zarr.json", + "episode_0/pico_controller/right_pose_interp", + "episode_0/pico_controller/right_pose_interp/c", + "episode_0/pico_controller/right_pose_interp/c/0", + "episode_0/pico_controller/right_pose_interp/c/0/0", + "episode_0/pico_controller/right_pose_interp/c/0/0/0", + "episode_0/pico_controller/right_pose_interp/zarr.json", + "episode_0/pico_controller/right_trigger_interp", + "episode_0/pico_controller/right_trigger_interp/c", + "episode_0/pico_controller/right_trigger_interp/c/0", + "episode_0/pico_controller/right_trigger_interp/zarr.json", + "episode_0/pico_controller/zarr.json", + "episode_0/valid_indices", + "episode_0/valid_indices/c", + "episode_0/valid_indices/c/0", + "episode_0/valid_indices/zarr.json", + "episode_0/valid_timestamps", + "episode_0/valid_timestamps/c", + "episode_0/valid_timestamps/c/0", + "episode_0/valid_timestamps/zarr.json", + "episode_0/wrist_camera", + "episode_0/wrist_camera.mp4", + "episode_0/wrist_camera/aligned_frame_indices", + "episode_0/wrist_camera/aligned_frame_indices/c", + "episode_0/wrist_camera/aligned_frame_indices/c/0", + "episode_0/wrist_camera/aligned_frame_indices/zarr.json", + "episode_0/wrist_camera/capture_time", + "episode_0/wrist_camera/capture_time/c", + "episode_0/wrist_camera/capture_time/c/0", + "episode_0/wrist_camera/capture_time/zarr.json", + "episode_0/wrist_camera/frame_id", + "episode_0/wrist_camera/frame_id/c", + "episode_0/wrist_camera/frame_id/c/0", + "episode_0/wrist_camera/frame_id/zarr.json", + "episode_0/wrist_camera/pose_interp", + "episode_0/wrist_camera/pose_interp/c", + "episode_0/wrist_camera/pose_interp/c/0", + "episode_0/wrist_camera/pose_interp/c/0/0", + "episode_0/wrist_camera/pose_interp/c/0/0/0", + "episode_0/wrist_camera/pose_interp/zarr.json", + "episode_0/wrist_camera/receive_time", + "episode_0/wrist_camera/receive_time/c", + "episode_0/wrist_camera/receive_time/c/0", + "episode_0/wrist_camera/receive_time/zarr.json", + "episode_0/wrist_camera/zarr.json", + "episode_0/zarr.json", + "episode_1", + "episode_1/glove", + "episode_1/glove/capture_time", + "episode_1/glove/capture_time/c", + "episode_1/glove/capture_time/c/0", + "episode_1/glove/capture_time/zarr.json", + "episode_1/glove/left_hand_pose_interp", + "episode_1/glove/left_hand_pose_interp/c", + "episode_1/glove/left_hand_pose_interp/c/0", + "episode_1/glove/left_hand_pose_interp/c/0/0", + "episode_1/glove/left_hand_pose_interp/c/0/0/0", + "episode_1/glove/left_hand_pose_interp/c/0/0/0/0", + "episode_1/glove/left_hand_pose_interp/zarr.json", + "episode_1/glove/left_sensor_count_interp", + "episode_1/glove/left_sensor_count_interp/c", + "episode_1/glove/left_sensor_count_interp/c/0", + "episode_1/glove/left_sensor_count_interp/zarr.json", + "episode_1/glove/left_sensor_rotation_interp", + "episode_1/glove/left_sensor_rotation_interp/c", + "episode_1/glove/left_sensor_rotation_interp/c/0", + "episode_1/glove/left_sensor_rotation_interp/c/0/0", + "episode_1/glove/left_sensor_rotation_interp/zarr.json", + "episode_1/glove/receive_time", + "episode_1/glove/receive_time/c", + "episode_1/glove/receive_time/c/0", + "episode_1/glove/receive_time/zarr.json", + "episode_1/glove/right_hand_pose_interp", + "episode_1/glove/right_hand_pose_interp/c", + "episode_1/glove/right_hand_pose_interp/c/0", + "episode_1/glove/right_hand_pose_interp/c/0/0", + "episode_1/glove/right_hand_pose_interp/c/0/0/0", + "episode_1/glove/right_hand_pose_interp/c/0/0/0/0", + "episode_1/glove/right_hand_pose_interp/zarr.json", + "episode_1/glove/zarr.json", + "episode_1/head_camera", + "episode_1/head_camera.mp4", + "episode_1/head_camera/aligned_frame_indices", + "episode_1/head_camera/aligned_frame_indices/c", + "episode_1/head_camera/aligned_frame_indices/c/0", + "episode_1/head_camera/aligned_frame_indices/zarr.json", + "episode_1/head_camera/capture_time", + "episode_1/head_camera/capture_time/c", + "episode_1/head_camera/capture_time/c/0", + "episode_1/head_camera/capture_time/zarr.json", + "episode_1/head_camera/frame_id", + "episode_1/head_camera/frame_id/c", + "episode_1/head_camera/frame_id/c/0", + "episode_1/head_camera/frame_id/zarr.json", + "episode_1/head_camera/pose_interp", + "episode_1/head_camera/pose_interp/c", + "episode_1/head_camera/pose_interp/c/0", + "episode_1/head_camera/pose_interp/c/0/0", + "episode_1/head_camera/pose_interp/c/0/0/0", + "episode_1/head_camera/pose_interp/zarr.json", + "episode_1/head_camera/receive_time", + "episode_1/head_camera/receive_time/c", + "episode_1/head_camera/receive_time/c/0", + "episode_1/head_camera/receive_time/zarr.json", + "episode_1/head_camera/zarr.json", + "episode_1/pico_controller", + "episode_1/pico_controller/a_button", + "episode_1/pico_controller/a_button/c", + "episode_1/pico_controller/a_button/c/0", + "episode_1/pico_controller/a_button/zarr.json", + "episode_1/pico_controller/body_joints_valid", + "episode_1/pico_controller/body_joints_valid/c", + "episode_1/pico_controller/body_joints_valid/c/0", + "episode_1/pico_controller/body_joints_valid/zarr.json", + "episode_1/pico_controller/capture_time", + "episode_1/pico_controller/capture_time/c", + "episode_1/pico_controller/capture_time/c/0", + "episode_1/pico_controller/capture_time/zarr.json", + "episode_1/pico_controller/head_pose_interp", + "episode_1/pico_controller/head_pose_interp/c", + "episode_1/pico_controller/head_pose_interp/c/0", + "episode_1/pico_controller/head_pose_interp/c/0/0", + "episode_1/pico_controller/head_pose_interp/c/0/0/0", + "episode_1/pico_controller/head_pose_interp/zarr.json", + "episode_1/pico_controller/left_pose_interp", + "episode_1/pico_controller/left_pose_interp/c", + "episode_1/pico_controller/left_pose_interp/c/0", + "episode_1/pico_controller/left_pose_interp/c/0/0", + "episode_1/pico_controller/left_pose_interp/c/0/0/0", + "episode_1/pico_controller/left_pose_interp/zarr.json", + "episode_1/pico_controller/left_trigger_interp", + "episode_1/pico_controller/left_trigger_interp/c", + "episode_1/pico_controller/left_trigger_interp/c/0", + "episode_1/pico_controller/left_trigger_interp/zarr.json", + "episode_1/pico_controller/receive_time", + "episode_1/pico_controller/receive_time/c", + "episode_1/pico_controller/receive_time/c/0", + "episode_1/pico_controller/receive_time/zarr.json", + "episode_1/pico_controller/right_pose_interp", + "episode_1/pico_controller/right_pose_interp/c", + "episode_1/pico_controller/right_pose_interp/c/0", + "episode_1/pico_controller/right_pose_interp/c/0/0", + "episode_1/pico_controller/right_pose_interp/c/0/0/0", + "episode_1/pico_controller/right_pose_interp/zarr.json", + "episode_1/pico_controller/right_trigger_interp", + "episode_1/pico_controller/right_trigger_interp/c", + "episode_1/pico_controller/right_trigger_interp/c/0", + "episode_1/pico_controller/right_trigger_interp/zarr.json", + "episode_1/pico_controller/zarr.json", + "episode_1/valid_indices", + "episode_1/valid_indices/c", + "episode_1/valid_indices/c/0", + "episode_1/valid_indices/zarr.json", + "episode_1/valid_timestamps", + "episode_1/valid_timestamps/c", + "episode_1/valid_timestamps/c/0", + "episode_1/valid_timestamps/zarr.json", + "episode_1/wrist_camera", + "episode_1/wrist_camera.mp4", + "episode_1/wrist_camera/aligned_frame_indices", + "episode_1/wrist_camera/aligned_frame_indices/c", + "episode_1/wrist_camera/aligned_frame_indices/c/0", + "episode_1/wrist_camera/aligned_frame_indices/zarr.json", + "episode_1/wrist_camera/capture_time", + "episode_1/wrist_camera/capture_time/c", + "episode_1/wrist_camera/capture_time/c/0", + "episode_1/wrist_camera/capture_time/zarr.json", + "episode_1/wrist_camera/frame_id", + "episode_1/wrist_camera/frame_id/c", + "episode_1/wrist_camera/frame_id/c/0", + "episode_1/wrist_camera/frame_id/zarr.json", + "episode_1/wrist_camera/pose_interp", + "episode_1/wrist_camera/pose_interp/c", + "episode_1/wrist_camera/pose_interp/c/0", + "episode_1/wrist_camera/pose_interp/c/0/0", + "episode_1/wrist_camera/pose_interp/c/0/0/0", + "episode_1/wrist_camera/pose_interp/zarr.json", + "episode_1/wrist_camera/receive_time", + "episode_1/wrist_camera/receive_time/c", + "episode_1/wrist_camera/receive_time/c/0", + "episode_1/wrist_camera/receive_time/zarr.json", + "episode_1/wrist_camera/zarr.json", + "episode_1/zarr.json", + "zarr.json" + ] +} diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.npz b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.npz new file mode 100644 index 0000000000000000000000000000000000000000..5e9afbfe1590b54434275d608061142847bf19c4 GIT binary patch literal 108380 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

!%5;eX?~b<u}%3JMH`5Wvl}I~Yv7}CnTuF9 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 ni!N|qXkw|X3DK>r=yhfI99c1=2}yZIsh`GK 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

N}*ri(r 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 Date: Mon, 9 Nov 2026 13:43:14 -0500 Subject: [PATCH 05/38] egocap: keep the aligned copy apart from the raw recording and read the raw session read-only The writer refuses an output that is, contains or sits inside the raw session (links resolved) before touching any file, opens the raw root read-only, and refreshes the aligned config.yaml from the raw one on every run. The raw-preservation rule is recorded in the egocap AGENTS.md. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/AGENTS.md | 5 ++++ .../egocap/recording/aligned_writer.py | 26 ++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/examples/egocap/AGENTS.md b/examples/egocap/AGENTS.md index 9555ed4913..44352fea93 100644 --- a/examples/egocap/AGENTS.md +++ b/examples/egocap/AGENTS.md @@ -72,3 +72,8 @@ Run all three test suites per "Run the tests yourself" above — check each pack - Bound mutation request streams before JSON parsing, even when Content-Length is absent or false; return only deliberate public error messages. - Dialogs must move, contain and restore focus as well as suppress recording shortcuts. - Concurrent coverage runs must use separate `COVERAGE_FILE` paths so one suite cannot overwrite another suite’s measurements. +## Derived output never touches the raw recording + +An aligned or otherwise derived copy of a recording must live in its own tree and read the raw session +read-only. Check that the output path is not the raw session, inside it or containing it (resolving links) +before any file is written; replacing a derived episode deletes it first. diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index db123a299c..2a0d32f015 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -69,18 +69,35 @@ def _link_or_copy(source: Path, target: Path) -> None: shutil.copy2(source, target) +def _check_separate(raw_session: Path, aligned_session: Path) -> None: + """Refuse an output that is the raw session or shares a tree with it, before any file is touched. + + Re-aligning an episode deletes the aligned copy first; if that copy were the raw episode, the recording + would be destroyed. Paths are resolved, so a symlink to the raw session is refused too. + """ + raw, aligned = raw_session.resolve(), aligned_session.resolve() + if aligned == raw or raw in aligned.parents or aligned in raw.parents: + raise AlignedWriteError("the aligned session must be separate from the raw session") + + def _write_root(raw_session: Path, aligned_session: Path, index_source: str) -> None: """Create the aligned root: its attributes, the session sidecars, and the index source in ``zarr.json``.""" aligned_session.mkdir(parents=True, exist_ok=True) - raw_root = zarr.open_group(str(raw_session), mode="a") aligned_root = zarr.open_group(str(aligned_session), mode="a") - _copy_attrs(raw_root, aligned_root) + # The raw session is only read: a raw root with no metadata of its own has no attributes to carry over. + try: + raw_attrs = dict(zarr.open_group(str(raw_session), mode="r").attrs) + except (FileNotFoundError, zarr.errors.GroupNotFoundError): + raw_attrs = {} + for key, value in raw_attrs.items(): + aligned_root.attrs[key] = value # The index source is a root attribute so a reader knows which camera's frames define the timeline. aligned_root.attrs["index_source"] = index_source for name in ALIGNED_SESSION_SIDECARS: source, target = raw_session / name, aligned_session / name - # An existing aligned sidecar is left alone, so re-aligning never overwrites what is already there. - if source.is_file() and not target.exists(): + # The session config is always refreshed from the raw session, as the aligned dataset format does; any + # other existing sidecar is left alone, so re-aligning never overwrites what is already there. + if source.is_file() and (name == "config.yaml" or not target.exists()): shutil.copy2(source, target) @@ -153,6 +170,7 @@ def write_aligned_episode( not qualified (or not listed) refuses the alignment, so nothing is written for it. The times aligned on are the recorded capture times. Raises ``AlignedWriteError`` if the written episode does not validate. """ + _check_separate(raw_session, aligned_session) config = yaml.safe_load((raw_session / "config.yaml").read_text(encoding="utf-8")) or {} rules = source_rules(config) cameras = [e["name"] for e in config.get("video_sources") or []] From 7276616ed67a456bfdab6d7bdffd74143d74be3e Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:44:35 -0500 Subject: [PATCH 06/38] egocap: record per-source continuity evidence and refuse to align across a break Each accepted sample can carry (scope, identity) saying which unbroken stretch of its source it belongs to; the recording service notes a break at the accepted row where the identity changes (never for a retried FULL offer) and stores per-source {scope, identity, breaks, known} in the episode manifest at the SEALED checkpoint (manifest schema 4; older manifests read as no evidence). LiveKit frames carry the clock-mapping epoch that placed them; tracking and CaptureServer cameras carry only the transport session, which does not vouch for the device. The aligned writer refuses an episode whose evidence is missing, unknown, of a scope that does not cover the source, or that records a break, before writing anything. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../backend/egocap_web/livekit_recording.py | 2 + .../backend/egocap_web/recording_adapter.py | 9 ++++- .../egocap/recording/aligned_writer.py | 10 ++++- .../recording/egocap/recording/alignment.py | 32 ++++++++++++++++ .../egocap/recording/episode_layout.py | 8 +++- .../recording/recording_service/models.py | 7 ++++ .../recording_service/recording_service.py | 37 +++++++++++++++++++ 7 files changed, 99 insertions(+), 6 deletions(-) diff --git a/examples/egocap/backend/egocap_web/livekit_recording.py b/examples/egocap/backend/egocap_web/livekit_recording.py index f44b43d8de..bf3dbe464c 100644 --- a/examples/egocap/backend/egocap_web/livekit_recording.py +++ b/examples/egocap/backend/egocap_web/livekit_recording.py @@ -283,6 +283,8 @@ async def _run(self, stream_id: int) -> None: pixel_format=PixelFormat.RGB8, capture_time=capture_time, receive_time=receive_time, + # The mapping that placed this frame, read once here: a later refresh must not relabel it. + continuity=("clock_mapping", mapping.epoch), ) if not self._ingress.offer(sample): # The ingress refuses once it has failed or stopped; it reports its own reason. diff --git a/examples/egocap/backend/egocap_web/recording_adapter.py b/examples/egocap/backend/egocap_web/recording_adapter.py index 67b47cdaee..67aae9120b 100644 --- a/examples/egocap/backend/egocap_web/recording_adapter.py +++ b/examples/egocap/backend/egocap_web/recording_adapter.py @@ -325,6 +325,8 @@ def convert_camera_image( capture_time=image.capture_time_ns / 1e9, receive_time=image.receive_time_ns / 1e9, intrinsics=intrinsics, + # The transport session says the connection was unbroken; it says nothing about the camera behind it. + continuity=("capture_session", image.session_id), ) @@ -338,13 +340,16 @@ def convert_capture_frame(frame: CaptureFrame) -> list[NumericSample]: tracking = capture_protocol.decode_tracking_frame(frame.payload) capture_time = frame.capture_time_ns / 1e9 receive_time = frame.receive_time_ns / 1e9 + # Only the transport session is known here: it does not establish that the controller or glove itself ran + # without a restart, so this is recorded as transport continuity and not as a device epoch. + continuity = ("capture_session", frame.session_id) samples: list[NumericSample] = [] pico_fields = build_pico_controller_fields(tracking) if pico_fields is not None: - samples.append(NumericSample(PICO_CONTROLLER_SOURCE, capture_time, receive_time, pico_fields)) + samples.append(NumericSample(PICO_CONTROLLER_SOURCE, capture_time, receive_time, pico_fields, continuity)) manus_fields = build_manus_glove_fields(tracking) if manus_fields is not None: - samples.append(NumericSample(MANUS_GLOVE_SOURCE, capture_time, receive_time, manus_fields)) + samples.append(NumericSample(MANUS_GLOVE_SOURCE, capture_time, receive_time, manus_fields, continuity)) return samples diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index 2a0d32f015..d9441a5256 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -27,7 +27,7 @@ import yaml import zarr -from .alignment import AlignedEpisode, align_episode, source_rules +from .alignment import AlignedEpisode, align_episode, check_continuity, source_rules __all__ = ["ALIGNED_SESSION_SIDECARS", "AlignedWriteError", "validate_aligned_episode", "write_aligned_episode"] @@ -163,12 +163,15 @@ def write_aligned_episode( *, downsample: int = 1, qualified: Mapping[str, bool], + continuity: Mapping[str, Mapping[str, object]] | None, ) -> AlignedEpisode: """Align one recorded episode and write it into ``aligned_session``; returns the alignment. ``qualified`` says, per source, whether its recorded capture time is a qualified event time; a source that is not qualified (or not listed) refuses the alignment, so nothing is written for it. The times aligned on are - the recorded capture times. Raises ``AlignedWriteError`` if the written episode does not validate. + the recorded capture times. ``continuity`` is the episode's stored per-source continuity evidence (None if it + recorded none): a source whose evidence is missing, unknown or records a break refuses the alignment too. + Raises ``AlignedWriteError`` if the written episode does not validate. """ _check_separate(raw_session, aligned_session) config = yaml.safe_load((raw_session / "config.yaml").read_text(encoding="utf-8")) or {} @@ -182,6 +185,9 @@ def write_aligned_episode( unqualified = [name for name in [index_source, *present] if not qualified.get(name, False)] if unqualified: raise AlignedWriteError(f"sources without a qualified event time: {sorted(set(unqualified))}") + broken = check_continuity(continuity, [index_source, *present]) + if broken: + raise AlignedWriteError("; ".join(broken)) times = {name: raw_episode[name]["capture_time"][:] for name in present} fields = {name: {a: raw_episode[name][a][:] for a in raw_episode[name].array_keys()} for name in present} aligned = align_episode( diff --git a/examples/egocap/recording/egocap/recording/alignment.py b/examples/egocap/recording/egocap/recording/alignment.py index 39901b3f10..3f6a973b17 100644 --- a/examples/egocap/recording/egocap/recording/alignment.py +++ b/examples/egocap/recording/egocap/recording/alignment.py @@ -42,6 +42,7 @@ "align_episode", "find_nearest_timestamp_indices", "interpolate_field", + "check_continuity", "qualified_sources", "source_rules", ] @@ -86,6 +87,37 @@ def qualified_sources( return {**{name: name in mapped for name in cameras}, **{name: tracking_ok for name in tracking}} +#: Continuity scopes that vouch for a source being one unbroken stretch. A clock mapping's epoch covers the +#: publisher's times; a transport session does not cover the device behind it, so it is not accepted. +ACCEPTED_CONTINUITY_SCOPES = ("clock_mapping",) + + +def check_continuity(continuity: Mapping[str, Mapping[str, object]] | None, sources: Sequence[str]) -> list[str]: + """Why the recorded continuity evidence does not allow aligning ``sources``; empty means it does. + + ``continuity`` is the per-source evidence stored with the episode (None when the episode recorded none). A + source is refused when there is no evidence for it, the evidence is incomplete, its scope is not one that + vouches for the source, or it records a break: interpolating across a restart would produce values the + sensor never reported. Nothing here defaults to clean. + """ + if continuity is None: + return ["no continuity evidence was recorded for this episode"] + problems: list[str] = [] + for name in sources: + entry = continuity.get(name) + if not isinstance(entry, Mapping): + problems.append(f"{name}: no continuity evidence") + elif entry.get("known") is not True: + problems.append(f"{name}: continuity is unknown") + elif entry.get("scope") not in ACCEPTED_CONTINUITY_SCOPES: + problems.append( + f"{name}: its continuity evidence ({entry.get('scope')!r}) does not cover the source itself" + ) + elif entry.get("breaks"): + problems.append(f"{name}: has a restart inside the episode (rows {list(entry['breaks'])})") + return problems + + def find_nearest_timestamp_indices(source_times: np.ndarray, target_times: np.ndarray) -> np.ndarray: """Position in ``source_times`` of the sample nearest each target, by one forward walk. diff --git a/examples/egocap/recording/egocap/recording/episode_layout.py b/examples/egocap/recording/egocap/recording/episode_layout.py index 5128cfb473..48d5fabe53 100644 --- a/examples/egocap/recording/egocap/recording/episode_layout.py +++ b/examples/egocap/recording/egocap/recording/episode_layout.py @@ -36,10 +36,10 @@ from .constants import PENDING_SUFFIX MANIFEST_DIR = ".recording" -MANIFEST_SCHEMA_VERSION = 3 +MANIFEST_SCHEMA_VERSION = 4 #: Older records are decoded onto the current fields when read and rewritten at the current version only when #: next saved; nothing is migrated at startup. -READABLE_SCHEMA_VERSIONS = (1, 2, 3) +READABLE_SCHEMA_VERSIONS = (1, 2, 3, 4) _EPISODE_NAME = re.compile(r"^episode_(\d+)(\.pending)?$") #: What finalization does with a checked take, recorded durably so recovery never re-derives it from policy: @@ -80,6 +80,10 @@ class EpisodeManifest: # Digest of the configuration without the capture-QC policy: what a CHECKED take (its decision is already # stored with its own policy) must still match to be finished. None on manifests written before it existed. layout_digest: str | None = None + # Per source, whether its samples were one unbroken stretch: {"scope", "identity", "breaks", "known"} (see + # recording_service.models.NumericSample.continuity). None on manifests written before it existed, which says + # nothing about continuity; it never means "no breaks". + continuity: dict[str, dict[str, Any]] | None = None issues: list[str] = field(default_factory=list) duration_seconds: float = 0.0 # Optional free-text context the operator attached to the task; "" on manifests written before it existed. diff --git a/examples/egocap/recording/recording_service/models.py b/examples/egocap/recording/recording_service/models.py index 2fd4aa17dd..50300c1b5c 100644 --- a/examples/egocap/recording/recording_service/models.py +++ b/examples/egocap/recording/recording_service/models.py @@ -166,6 +166,11 @@ class NumericSample: capture_time: float receive_time: float fields: Mapping[str, Any] + #: What stretch of the source this sample belongs to, as (scope, identity): the scope says what the identity + #: covers (``"clock_mapping"``: the mapping epoch that placed the time; ``"capture_session"``: the transport + #: session, which says nothing about the device behind it). A change of identity within a take is a break. None + #: means the producer gave no evidence, which is not a claim of continuity. + continuity: tuple[str, str | int] | None = None @dataclass(frozen=True) @@ -178,6 +183,8 @@ class VideoSample: capture_time: float receive_time: float intrinsics: np.ndarray | None = None + #: As on ``NumericSample``: (scope, identity) of the stretch this frame belongs to, or None for no evidence. + continuity: tuple[str, str | int] | None = None @dataclass(frozen=True) diff --git a/examples/egocap/recording/recording_service/recording_service.py b/examples/egocap/recording/recording_service/recording_service.py index fd687c6017..c79e1799e6 100644 --- a/examples/egocap/recording/recording_service/recording_service.py +++ b/examples/egocap/recording/recording_service/recording_service.py @@ -168,6 +168,8 @@ def __init__(self, manifest: EpisodeManifest, sources: list[str], store: Episode self.admission_closed = False self.accepted = dict.fromkeys(sources, 0) self.written = dict.fromkeys(sources, 0) + # Per source: whether its accepted rows were one unbroken stretch (see note_continuity). + self.continuity: dict[str, dict[str, Any]] = {} self.span: dict[str, list[float]] = {} self.worker: asyncio.Task[Any] | None = None self.operation_task: asyncio.Task[Any] | None = None @@ -189,6 +191,38 @@ def episode_id(self) -> str: """The stable episode identity.""" return self.manifest.episode_id + def note_continuity(self, source: str, row: int, continuity: tuple[str, str | int] | None) -> None: + """Record the continuity evidence of one accepted row of ``source``. + + The first row fixes the scope and identity; a later row with a different identity is a break at that row + (rows are positions among the source's accepted rows, which equal its written rows once sealed). A row + with no evidence, or one whose scope changes, makes the source's continuity unknown: a take cannot vouch + for stretches it was never told about. + """ + entry = self.continuity.setdefault(source, {"scope": None, "identity": None, "breaks": [], "known": True}) + if continuity is None: + entry["known"] = False + return + scope, identity = continuity + if entry["scope"] is None: + entry["scope"], entry["identity"], entry["last"] = scope, identity, identity + return + if scope != entry["scope"]: + entry["known"] = False + elif identity != entry["last"]: + entry["breaks"].append(row) + entry["last"] = identity + + def continuity_record(self) -> dict[str, dict[str, Any]]: + """The evidence for every source of the take, as stored in the manifest. + + A source that accepted no rows has no evidence and is recorded as unknown, never as an empty clean list. + """ + unknown = {"scope": None, "identity": None, "breaks": [], "known": False} + return { + s: {k: v for k, v in self.continuity.get(s, unknown).items() if k != "last"} for s in self.accepted + } + def duration(self) -> float: """Maximum per-source capture-time span; never subtracts timestamps from different sources.""" return max((last - first for first, last in self.span.values()), default=0.0) @@ -255,6 +289,8 @@ def submit_sample(self, episode_id: str, sample: NumericSample | VideoSample) -> copied = self._copy(sample) # the only fallible step: finish it before any bookkeeping changes index = take.accepted[sample.source] take.accepted[sample.source] = index + 1 + # Evidence is noted for the accepted row only, never for an offer that came back FULL and will be retried. + take.note_continuity(sample.source, index, sample.continuity) take.queue.append(copied) take.wake.set() return SubmissionResult(SubmissionStatus.ACCEPTED, sample.source, index) @@ -922,6 +958,7 @@ async def _finish_impl(self, take: _Take) -> EpisodeResult: counts={ s: {"accepted": take.accepted[s], "written": take.written[s]} for s in take.accepted }, + continuity=take.continuity_record(), duration_seconds=take.duration(), storage_phase="SEALED", ) From dfe315abad7be41ec72fc5de9b2bbeb55f769014 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:47:07 -0500 Subject: [PATCH 07/38] egocap: align a raw session whose root has no metadata of its own The writer opened the episode through the raw root, which fails when the recorder left no root zarr.json; it now opens the episode group directly. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/recording/egocap/recording/aligned_writer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index d9441a5256..77bb51142f 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -178,7 +178,8 @@ def write_aligned_episode( rules = source_rules(config) cameras = [e["name"] for e in config.get("video_sources") or []] key = f"episode_{episode_index}" - raw_episode = zarr.open_group(str(raw_session), mode="r")[key] + # The episode group is opened on its own: the raw session's root need not have metadata of its own. + raw_episode = zarr.open_group(str(raw_session / key), mode="r") # Only declared sources the episode actually recorded take part, as the valid range spans what is present. present = [name for name in rules if name in raw_episode] From 22e7b896ff777de8ea502541bd7494c7f93bd53e Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:48:27 -0500 Subject: [PATCH 08/38] egocap: test the writer's path guard, config refresh and continuity refusals Covers an aligned session that is, sits inside or contains the raw session (including through symlinks) leaving the raw recording byte-identical, a raw session with no root metadata, the config.yaml refresh, and the refusals for missing, unknown, wrong-scope or broken continuity. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../recording/unit/test_aligned_writer.py | 132 +++++++++++++++++- 1 file changed, 125 insertions(+), 7 deletions(-) diff --git a/examples/egocap/tests/recording/unit/test_aligned_writer.py b/examples/egocap/tests/recording/unit/test_aligned_writer.py index 475842ae55..6b95879161 100644 --- a/examples/egocap/tests/recording/unit/test_aligned_writer.py +++ b/examples/egocap/tests/recording/unit/test_aligned_writer.py @@ -23,6 +23,11 @@ CAMERAS = ("head_camera", "wrist_camera") +def clean_continuity(sources=tuple(QUALIFIED)): + """Continuity evidence that vouches for every source: the clock mapping, no restart, known.""" + return {name: {"scope": "clock_mapping", "identity": 0, "breaks": [], "known": True} for name in sources} + + def video_bytes(source, episode): return (f"dummy video {source} episode {episode} ".encode()) * 16 @@ -56,7 +61,9 @@ def build_raw(root, scenario, drop_sources=()): def write_steps(raw, aligned, steps): for episode, downsample in steps: - write_aligned_episode(raw, aligned, episode, INDEX, downsample=downsample, qualified=QUALIFIED) + write_aligned_episode( + raw, aligned, episode, INDEX, downsample=downsample, qualified=QUALIFIED, continuity=clean_continuity() + ) def snapshot(root): @@ -177,7 +184,9 @@ def no_link(source, target, *args, **kwargs): def test_an_unqualified_or_unlisted_source_refuses_and_writes_nothing(tmp_path, qualified): build_raw(tmp_path / "raw", META["scenarios"]["basic_ds1"]) with pytest.raises(AlignedWriteError, match="qualified"): - write_aligned_episode(tmp_path / "raw", tmp_path / "aligned", 0, INDEX, qualified=qualified) + write_aligned_episode( + tmp_path / "raw", tmp_path / "aligned", 0, INDEX, qualified=qualified, continuity=clean_continuity() + ) assert not (tmp_path / "aligned").exists() @@ -185,7 +194,9 @@ def test_a_declared_source_absent_from_the_episode_is_skipped(tmp_path): build_raw(tmp_path / "raw", META["scenarios"]["basic_ds1"], drop_sources=("glove",)) # Not recorded, so its qualification is not asked for either. qualified = {name: ok for name, ok in QUALIFIED.items() if name != "glove"} - write_aligned_episode(tmp_path / "raw", tmp_path / "aligned", 0, INDEX, qualified=qualified) + write_aligned_episode( + tmp_path / "raw", tmp_path / "aligned", 0, INDEX, qualified=qualified, continuity=clean_continuity() + ) episode = zarr.open_group(str(tmp_path / "aligned"), mode="r")["episode_0"] assert sorted(episode.group_keys()) == ["head_camera", "pico_controller", "wrist_camera"] @@ -216,10 +227,86 @@ def test_an_existing_target_video_is_replaced_by_the_link(tmp_path): def test_an_existing_aligned_sidecar_is_not_overwritten(tmp_path): build_raw(tmp_path / "raw", META["scenarios"]["attrs_sidecars"]) (tmp_path / "aligned").mkdir() - (tmp_path / "aligned" / "config.yaml").write_text("kept: true\n") + (tmp_path / "aligned" / "head_camera_intrinsics.json").write_text("kept: true\n") write_steps(tmp_path / "raw", tmp_path / "aligned", [(0, 1)]) - assert (tmp_path / "aligned" / "config.yaml").read_text() == "kept: true\n" - assert (tmp_path / "aligned" / "head_camera_intrinsics.json").is_file() + assert (tmp_path / "aligned" / "head_camera_intrinsics.json").read_text() == "kept: true\n" + assert any((tmp_path / "aligned" / name).is_file() for name in aligned_writer.ALIGNED_SESSION_SIDECARS) + + +def test_an_edited_aligned_config_is_replaced_by_the_raw_one(tmp_path): + build_raw(tmp_path / "raw", META["scenarios"]["basic_ds1"]) + write_steps(tmp_path / "raw", tmp_path / "aligned", [(0, 1)]) + (tmp_path / "aligned" / "config.yaml").write_text("edited: true\n") + write_steps(tmp_path / "raw", tmp_path / "aligned", [(0, 1)]) + assert (tmp_path / "aligned" / "config.yaml").read_bytes() == (tmp_path / "raw" / "config.yaml").read_bytes() + + +def raw_listing(root): + """Every path under the raw session with its size and content hash, to compare before and after.""" + return { + path.relative_to(root).as_posix(): (path.stat().st_size, hashlib.sha256(path.read_bytes()).hexdigest()) + if path.is_file() + else None + for path in sorted(root.rglob("*")) + } + + +def test_the_aligned_root_is_written_from_a_raw_root_without_zarr_json_and_the_raw_session_gains_no_files( + tmp_path, +): + raw = tmp_path / "raw" + build_raw(raw, META["scenarios"]["basic_ds1"]) + (raw / "zarr.json").unlink() + before = raw_listing(raw) + aligned_writer._write_root(raw, tmp_path / "aligned", INDEX) + assert raw_listing(raw) == before + assert not (raw / "zarr.json").exists() + assert dict(zarr.open_group(str(tmp_path / "aligned"), mode="r").attrs) == {"index_source": INDEX} + + +def test_a_raw_session_without_a_root_zarr_json_aligns_and_is_left_untouched(tmp_path): + raw = tmp_path / "raw" + build_raw(raw, META["scenarios"]["basic_ds1"]) + (raw / "zarr.json").unlink() + before = raw_listing(raw) + write_steps(raw, tmp_path / "aligned", [(0, 1)]) + assert raw_listing(raw) == before + assert not (raw / "zarr.json").exists() + assert zarr.open_group(str(tmp_path / "aligned"), mode="r").attrs["index_source"] == INDEX + + +@pytest.fixture +def raw_session(tmp_path): + build_raw(tmp_path / "raw", META["scenarios"]["basic_ds1"]) + return tmp_path / "raw" + + +def test_the_aligned_session_must_be_separate_from_the_raw_session(tmp_path, raw_session): + (tmp_path / "alias").symlink_to(raw_session, target_is_directory=True) + (tmp_path / "outer").mkdir() + (tmp_path / "outer" / "inner_alias").symlink_to(raw_session, target_is_directory=True) + outside = tmp_path / "elsewhere" + outside.mkdir() + (outside / "up").symlink_to(tmp_path, target_is_directory=True) + targets = { + "same_path": raw_session, + "inside_raw": raw_session / "aligned", + "inside_episode": raw_session / "episode_0" / "aligned", + "containing_raw": tmp_path, + "symlink_alias": tmp_path / "alias", + "inside_through_symlink": tmp_path / "alias" / "aligned", + "containing_through_symlink": outside / "up", + } + before = raw_listing(raw_session) + for label, target in targets.items(): + with pytest.raises(AlignedWriteError, match="must be separate"): + write_aligned_episode( + raw_session, target, 0, INDEX, qualified=QUALIFIED, continuity=clean_continuity() + ) + # Nothing is created in, or removed from, the raw session, and its content is byte for byte the same. + assert raw_listing(raw_session) == before, label + assert not (raw_session / "aligned").exists() + assert (raw_session / "episode_0" / "head_camera.mp4").read_bytes() == video_bytes("head_camera", 0) @pytest.fixture @@ -288,4 +375,35 @@ def empty_timestamps(*args, **kwargs): monkeypatch.setattr(aligned_writer, "align_episode", empty_timestamps) with pytest.raises(AlignedWriteError, match="valid_timestamps is empty"): - write_aligned_episode(tmp_path / "raw", tmp_path / "aligned", 0, INDEX, qualified=QUALIFIED) + write_aligned_episode( + tmp_path / "raw", tmp_path / "aligned", 0, INDEX, qualified=QUALIFIED, continuity=clean_continuity() + ) + + +def with_entry(name, **changes): + """Clean evidence with one source's entry changed.""" + evidence = clean_continuity() + evidence[name] = {**evidence[name], **changes} + return evidence + + +@pytest.mark.parametrize( + "continuity", + [ + None, + {k: v for k, v in clean_continuity().items() if k != "glove"}, + with_entry("glove", known=False), + with_entry("glove", scope="capture_session"), + with_entry("glove", breaks=[12]), + with_entry(INDEX, breaks=[3]), + ], + ids=["none", "source_missing", "unknown", "capture_session_scope", "breaks", "index_breaks"], +) +def test_missing_or_broken_continuity_refuses_and_writes_nothing(tmp_path, continuity): + raw = tmp_path / "raw" + build_raw(raw, META["scenarios"]["basic_ds1"]) + before = raw_listing(raw) + with pytest.raises(AlignedWriteError): + write_aligned_episode(raw, tmp_path / "aligned", 0, INDEX, qualified=QUALIFIED, continuity=continuity) + assert not (tmp_path / "aligned").exists() + assert raw_listing(raw) == before From 49c3f56b501d3964f3b363cee45f625e12c5fbc9 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:48:34 -0500 Subject: [PATCH 09/38] egocap: test the continuity evidence end to end Covers the continuity check, manifest schema 3 and 4, the service's evidence (breaks at accepted rows, unknown evidence, a retried FULL offer noted once, survival to the SEALED manifest and recovery), the evidence the adapters and the LiveKit recorder attach (each frame keeping the epoch of the mapping that placed it), and a tiny episode through the real service into the aligned writer, including a refusal on a recorded break. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../tests/backend/test_livekit_recording.py | 28 +- .../tests/backend/test_recording_adapter.py | 27 +- .../tests/recording/unit/test_alignment.py | 63 +++++ .../recording/unit/test_episode_store.py | 44 ++++ .../recording_service/test_continuity.py | 247 ++++++++++++++++++ 5 files changed, 407 insertions(+), 2 deletions(-) create mode 100644 examples/egocap/tests/recording_service/test_continuity.py diff --git a/examples/egocap/tests/backend/test_livekit_recording.py b/examples/egocap/tests/backend/test_livekit_recording.py index 31ce77d2f6..dd8b05b30b 100644 --- a/examples/egocap/tests/backend/test_livekit_recording.py +++ b/examples/egocap/tests/backend/test_livekit_recording.py @@ -112,12 +112,17 @@ def __init__(self, offset_ns: int = -10_000_000_000, uncertainty_ns: int = 1_000 self.uncertainty_ns = uncertainty_ns self.discontinuity = False self.available = True + self.epoch = 1 def mapping(self) -> ClockMapping | None: if not self.available: return None return ClockMapping( - epoch=1, offset_ns=self.offset_ns, rtt_ns=2_000, uncertainty_ns=self.uncertainty_ns, accepted_at_ns=0 + epoch=self.epoch, + offset_ns=self.offset_ns, + rtt_ns=2_000, + uncertainty_ns=self.uncertainty_ns, + accepted_at_ns=0, ) @@ -195,6 +200,27 @@ async def test_mapping_offset_places_capture_time_on_the_local_clock(): assert [m.capture_time for m in ingress.offered] == [11.0] +async def test_each_frame_carries_the_epoch_of_the_mapping_that_placed_it(): + clock = FakeClockSync() + frames = [_received(16, 1_000_000), _received(16, 2_000_000), _received(16, 3_000_000)] + ingress = FakeIngress() + + def new_epoch(c): + c.epoch = 5 + + # The mapping is replaced (new epoch, same offset) while the second frame is being served. + receiver = _FlipAfterFirst({16: frames}, clock, new_epoch) + feed = _feed(receiver, [_stream(16, "Head left")], ingress, {16: "head_left"}) + feed.start() + await _settle() + await feed.stop() + assert [m.continuity for m in ingress.offered] == [ + ("clock_mapping", 1), + ("clock_mapping", 5), + ("clock_mapping", 5), + ] + + @pytest.mark.parametrize( ("value", "expected_ns"), [ diff --git a/examples/egocap/tests/backend/test_recording_adapter.py b/examples/egocap/tests/backend/test_recording_adapter.py index ea8c5d368f..49a9509bad 100644 --- a/examples/egocap/tests/backend/test_recording_adapter.py +++ b/examples/egocap/tests/backend/test_recording_adapter.py @@ -17,6 +17,7 @@ from __future__ import annotations import asyncio +import dataclasses import threading import numpy as np @@ -321,7 +322,10 @@ def test_validate_tracking_descriptor_rejects_mismatched_fields(): class _FakeCameraImage: - def __init__(self, rgb: np.ndarray, capture_time_ns: int, receive_time_ns: int, name: str = "cam"): + def __init__( + self, rgb: np.ndarray, capture_time_ns: int, receive_time_ns: int, name: str = "cam", session_id: str = "s" + ): + self.session_id = session_id self._rgb = rgb self.capture_time_ns = capture_time_ns self.receive_time_ns = receive_time_ns @@ -342,6 +346,12 @@ def test_convert_camera_image_is_rgb8_with_seconds_timestamps(): assert sample.image is rgb +def test_convert_camera_image_records_the_transport_session_as_its_continuity(): + image = _FakeCameraImage(np.zeros((4, 4, 3), dtype=np.uint8), 1, 2, session_id="sess-a") + sample = convert_camera_image(image, "head_human_camera") # type: ignore[arg-type] + assert sample.continuity == ("capture_session", "sess-a") + + # --- bounded ingress ----------------------------------------------------------- @@ -836,3 +846,18 @@ def test_tracking_specs_name_the_frame_types_that_select_their_alignment_rules() assert PICO_CONTROLLER_SPEC.frame_type == "PicoTrackingFrame" assert MANUS_GLOVE_SPEC.frame_type == "ManusFrame" assert {PICO_CONTROLLER_SPEC.frame_type, MANUS_GLOVE_SPEC.frame_type} <= set(FRAME_FIELD_RULES) + + +def test_every_tracking_sample_of_a_frame_carries_the_transport_session_as_its_continuity(): + # The transport session does not vouch for the devices behind it, so the scope says exactly that. + frame = _tracking_frame(capture_time_ns=5_000_000_000, receive_time_ns=5_000_100_000) + samples = _convert_raw_item(frame) + assert sorted(s.source for s in samples) == ["manus_glove", "pico_controller"] + assert [s.continuity for s in samples] == [("capture_session", "s")] * 2 + + +def test_a_new_transport_session_changes_the_continuity_identity(): + first = _convert_raw_item(_tracking_frame(1_000_000_000, 1_000_100_000)) + other = dataclasses.replace(_tracking_frame(2_000_000_000, 2_000_100_000), session_id="t") + assert {s.continuity for s in _convert_raw_item(other)} == {("capture_session", "t")} + assert {s.continuity for s in first} == {("capture_session", "s")} diff --git a/examples/egocap/tests/recording/unit/test_alignment.py b/examples/egocap/tests/recording/unit/test_alignment.py index 61e8194779..242dbf79f0 100644 --- a/examples/egocap/tests/recording/unit/test_alignment.py +++ b/examples/egocap/tests/recording/unit/test_alignment.py @@ -13,6 +13,7 @@ AlignmentError, InsufficientSamplesError, align_episode, + check_continuity, find_nearest_timestamp_indices, interpolate_field, qualified_sources, @@ -461,3 +462,65 @@ def test_unknown_default_frame_type_is_refused(): def test_an_entry_that_is_not_a_named_mapping_is_refused(entry): with pytest.raises(AlignmentError, match="video_sources: every source needs a name"): source_rules({"video_sources": [entry]}) + + +def clean(scope="clock_mapping", **changes): + return {"scope": scope, "identity": 1, "breaks": [], "known": True, **changes} + + +def test_only_a_clock_mapping_scope_is_accepted_as_continuity_evidence(): + assert alignment.ACCEPTED_CONTINUITY_SCOPES == ("clock_mapping",) + + +def test_clean_clock_mapping_evidence_for_every_source_is_accepted(): + assert check_continuity({"cam": clean(), "arm": clean()}, ["cam", "arm"]) == [] + + +def test_evidence_for_sources_that_are_not_asked_about_is_ignored(): + assert check_continuity({"cam": clean(), "other": clean(known=False)}, ["cam"]) == [] + + +def test_no_evidence_at_all_is_one_problem_not_a_clean_pass(): + assert check_continuity(None, ["cam", "arm"]) == ["no continuity evidence was recorded for this episode"] + + +def test_a_source_without_an_entry_is_refused(): + assert check_continuity({"cam": clean()}, ["cam", "arm"]) == ["arm: no continuity evidence"] + + +def test_an_entry_that_is_not_a_mapping_is_refused(): + assert check_continuity({"cam": [1, 2]}, ["cam"]) == ["cam: no continuity evidence"] + + +@pytest.mark.parametrize("known", [False, None, "yes", 1]) +def test_continuity_that_is_not_exactly_known_true_is_unknown(known): + assert check_continuity({"cam": clean(known=known)}, ["cam"]) == ["cam: continuity is unknown"] + + +def test_a_missing_known_flag_is_unknown(): + entry = clean() + del entry["known"] + assert check_continuity({"cam": entry}, ["cam"]) == ["cam: continuity is unknown"] + + +@pytest.mark.parametrize("scope", ["capture_session", None, "other"]) +def test_a_scope_that_does_not_cover_the_source_is_refused(scope): + # Transport continuity says the connection stayed up, not that the device behind it did not restart. + (problem,) = check_continuity({"cam": clean(scope)}, ["cam"]) + assert problem.startswith("cam: its continuity evidence (") and f"{scope!r}" in problem + + +def test_a_break_is_reported_with_its_rows(): + problems = check_continuity({"cam": clean(breaks=[4, 9])}, ["cam"]) + assert problems == ["cam: has a restart inside the episode (rows [4, 9])"] + + +def test_every_refused_source_is_reported_at_once(): + evidence = { + "a": clean(breaks=[2]), + "b": clean("capture_session"), + "c": clean(known=False), + "ok": clean(), + } + problems = check_continuity(evidence, ["a", "b", "c", "ok", "missing"]) + assert [p.split(":")[0] for p in problems] == ["a", "b", "c", "missing"] diff --git a/examples/egocap/tests/recording/unit/test_episode_store.py b/examples/egocap/tests/recording/unit/test_episode_store.py index ede3345fe2..853cff462a 100644 --- a/examples/egocap/tests/recording/unit/test_episode_store.py +++ b/examples/egocap/tests/recording/unit/test_episode_store.py @@ -26,6 +26,7 @@ FINALIZATION_RETAIN, IDENTITY_ATTR, MANIFEST_SCHEMA_VERSION, + READABLE_SCHEMA_VERSIONS, EpisodeManifest, episode_dir_names, finalize_episode_dir, @@ -464,3 +465,46 @@ def test_an_interrupted_older_camera_rejection_cleanup_is_still_recoverable(tmp_ def test_current_records_are_validated_strictly(tmp_path: Path, changes) -> None: with pytest.raises((ValueError, TypeError)): read_manifest(_checked_record(tmp_path, **changes)) + + +def test_schema_version_four_is_written_and_readable_versions_include_it(tmp_path: Path) -> None: + write_manifest(tmp_path, _manifest(0)) + assert json.loads(manifest_path(tmp_path, 0).read_text())["schema_version"] == 4 == MANIFEST_SCHEMA_VERSION + assert set(READABLE_SCHEMA_VERSIONS) == {1, 2, 3, 4} + + +def test_a_version_three_manifest_without_continuity_reads_as_no_evidence(tmp_path: Path) -> None: + """Absence is not a claim of continuity: the field decodes to None, never to an empty or clean record.""" + write_manifest(tmp_path, _manifest(0)) + file = manifest_path(tmp_path, 0) + data = json.loads(file.read_text()) + del data["continuity"] + data["schema_version"] = 3 + file.write_text(json.dumps(data)) + decoded = read_manifest(file) + assert decoded.continuity is None and decoded.schema_version == MANIFEST_SCHEMA_VERSION + + +def test_a_manifest_with_no_evidence_round_trips_as_none(tmp_path: Path) -> None: + write_manifest(tmp_path, _manifest(0)) + assert read_manifest(manifest_path(tmp_path, 0)).continuity is None + + +def test_continuity_evidence_round_trips_through_json_with_int_and_str_identities(tmp_path: Path) -> None: + manifest = _manifest(0) + manifest.continuity = { + "cam": {"scope": "clock_mapping", "identity": 7, "breaks": [3, 8], "known": True}, + "arm": {"scope": "capture_session", "identity": "session-a", "breaks": [], "known": True}, + "idle": {"scope": None, "identity": None, "breaks": [], "known": False}, + } + write_manifest(tmp_path, manifest) + assert read_manifest(manifest_path(tmp_path, 0)).continuity == manifest.continuity + + +def test_a_version_newer_than_this_reader_is_still_refused(tmp_path: Path) -> None: + write_manifest(tmp_path, _manifest(0)) + data = json.loads(manifest_path(tmp_path, 0).read_text()) + data["schema_version"] = MANIFEST_SCHEMA_VERSION + 1 + manifest_path(tmp_path, 1).write_text(json.dumps(data)) + found, problems = scan_manifests(tmp_path) + assert [m.episode_index for m in found] == [0] and "schema_version" in problems[0] diff --git a/examples/egocap/tests/recording_service/test_continuity.py b/examples/egocap/tests/recording_service/test_continuity.py new file mode 100644 index 0000000000..000eabaff2 --- /dev/null +++ b/examples/egocap/tests/recording_service/test_continuity.py @@ -0,0 +1,247 @@ +# SPDX-FileCopyrightText: 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +"""Per-source continuity evidence of a take: noted per accepted row, stored in the manifest, read by alignment.""" + +import asyncio +import json +from pathlib import Path + +import numpy as np +import pytest +import zarr + +import recording_service.recording_service as impl +from egocap.recording.aligned_writer import AlignedWriteError, write_aligned_episode +from egocap.recording.episode_layout import manifest_path, read_manifest +from recording_service import ( + Disposition, + FieldSpec, + NumericSample, + NumericSourceSpec, + PixelFormat, + QcConfig, + RecordingService, + ServiceConfig, + SubmissionStatus, + VideoSample, + VideoSourceSpec, +) + +MAPPING = "clock_mapping" + + +def _config(tmp_path: Path, **overrides) -> ServiceConfig: + return ServiceConfig( + output_root=tmp_path / "out", + numeric_sources=( + NumericSourceSpec("pose", (FieldSpec("v", "float64"),)), + NumericSourceSpec("idle", (FieldSpec("v", "float64"),)), + ), + qc=QcConfig(required_sources=("pose",)), + **overrides, + ) + + +def _pose(i: int, continuity): + return NumericSample("pose", float(i), float(i), {"v": float(i)}, continuity) + + +async def _record(tmp_path: Path, own, continuities, **overrides): + """Record one take of ``pose`` rows carrying the given continuity values; returns (session, result).""" + service = own(RecordingService(_config(tmp_path, **overrides))) + session = await service.open_session() + episode = await service.start_episode("t") + for i, continuity in enumerate(continuities): + assert service.submit_sample(episode.episode_id, _pose(i, continuity)).status is SubmissionStatus.ACCEPTED + result = await service.stop_episode(episode.episode_id) + return session, result + + +def _stored(session, index: int = 0): + return read_manifest(manifest_path(session.session_path, index)) + + +async def _evidence(tmp_path: Path, own, continuities): + session, _ = await _record(tmp_path, own, continuities) + return _stored(session).continuity["pose"] + + +async def test_a_constant_identity_is_known_with_no_breaks(tmp_path, own): + entry = await _evidence(tmp_path, own, [(MAPPING, 1)] * 4) + assert entry == {"scope": MAPPING, "identity": 1, "breaks": [], "known": True} + + +async def test_a_change_of_identity_is_a_break_at_the_accepted_row(tmp_path, own): + entry = await _evidence(tmp_path, own, [(MAPPING, 1)] * 3 + [(MAPPING, 2)] * 2) + assert entry["breaks"] == [3] and entry["known"] is True and entry["identity"] == 1 + + +async def test_two_changes_are_two_breaks_and_a_return_to_an_old_identity_is_one_too(tmp_path, own): + ids = [1, 1, 2, 2, 1, 1] + entry = await _evidence(tmp_path, own, [(MAPPING, i) for i in ids]) + assert entry["breaks"] == [2, 4] and entry["known"] is True + + +async def test_str_and_int_identities_are_stored_as_given(tmp_path, own): + entry = await _evidence(tmp_path, own, [("capture_session", "a"), ("capture_session", "b")]) + assert entry == {"scope": "capture_session", "identity": "a", "breaks": [1], "known": True} + + +async def test_a_row_without_evidence_makes_the_source_unknown(tmp_path, own): + entry = await _evidence(tmp_path, own, [(MAPPING, 1), None, (MAPPING, 1)]) + assert entry["known"] is False and entry["breaks"] == [] + + +async def test_a_first_row_without_evidence_makes_the_source_unknown(tmp_path, own): + entry = await _evidence(tmp_path, own, [None, (MAPPING, 1)]) + assert entry["known"] is False + + +async def test_a_change_of_scope_makes_the_source_unknown_not_a_break(tmp_path, own): + entry = await _evidence(tmp_path, own, [(MAPPING, 1), ("capture_session", 2)]) + assert entry["known"] is False and entry["breaks"] == [] and entry["scope"] == MAPPING + + +async def test_a_source_that_accepted_nothing_is_recorded_unknown(tmp_path, own): + session, _ = await _record(tmp_path, own, [(MAPPING, 1)] * 2) + assert _stored(session).continuity["idle"] == {"scope": None, "identity": None, "breaks": [], "known": False} + + +async def test_the_private_last_identity_never_reaches_the_manifest(tmp_path, own): + session, _ = await _record(tmp_path, own, [(MAPPING, 1), (MAPPING, 2)]) + raw = json.loads(manifest_path(session.session_path, 0).read_text()) + assert all("last" not in entry for entry in raw["continuity"].values()) + + +async def test_a_full_result_notes_nothing_and_the_retried_sample_is_noted_once(tmp_path, own): + service = own(RecordingService(_config(tmp_path, queue_capacity=2))) + await service.open_session() + episode = await service.start_episode("t") + eid = episode.episode_id + for i in range(2): + assert service.submit_sample(eid, _pose(i, (MAPPING, 1))).status is SubmissionStatus.ACCEPTED + changed = _pose(2, (MAPPING, 2)) + for _ in range(3): # a refused offer, repeated, leaves no trace + assert service.submit_sample(eid, changed).status is SubmissionStatus.FULL + assert service._take.continuity_record()["pose"]["breaks"] == [] + + while (result := service.submit_sample(eid, changed)).status is SubmissionStatus.FULL: + await asyncio.sleep(0) + assert result.admission_index == 2 + assert service._take.continuity_record()["pose"]["breaks"] == [2] + stopped = await service.stop_episode(eid) + assert {c.source_name: c.accepted for c in stopped.counts}["pose"] == 3 + + +async def test_stored_breaks_are_indices_of_accepted_rows(tmp_path, own): + session, result = await _record(tmp_path, own, [(MAPPING, i // 2) for i in range(8)]) + entry = _stored(session).continuity["pose"] + accepted = {c.source_name: c.accepted for c in result.counts}["pose"] + assert entry["breaks"] == [2, 4, 6] and all(b < accepted for b in entry["breaks"]) + + +async def test_evidence_survives_a_retained_take_and_its_recovery(tmp_path, own, monkeypatch): + """A take stopped before the final rename keeps its sealed evidence; recovery finishes without changing it.""" + real_finalize = impl.finalize_episode_dir + + def refuse(*_a, **_k): + raise OSError("interrupted") + + monkeypatch.setattr(impl, "finalize_episode_dir", refuse) + first = own(RecordingService(_config(tmp_path)), may_stay_open=True) + session = await first.open_session() + episode = await first.start_episode("t") + for i, identity in enumerate([1, 1, 2]): + first.submit_sample(episode.episode_id, _pose(i, (MAPPING, identity))) + result = await first.stop_episode(episode.episode_id) + assert result.disposition is Disposition.RECOVERY_REQUIRED + await first.close() # releases the session lock, as a restart would + before = _stored(session).continuity + assert before["pose"]["breaks"] == [2] + + monkeypatch.setattr(impl, "finalize_episode_dir", real_finalize) + service = own(RecordingService(_config(tmp_path))) + await service.open_session(session.session_id) + (pending,) = service.pending_episodes() + recovered = await service.recover_episode(pending.episode_id) + assert recovered.disposition is Disposition.KEPT + assert _stored(session).continuity == before + + +async def test_a_manifest_that_recorded_no_evidence_stays_none(tmp_path, own): + session, _ = await _record(tmp_path, own, [(MAPPING, 1)]) + file = manifest_path(session.session_path, 0) + data = json.loads(file.read_text()) + del data["continuity"] + data["schema_version"] = 3 + file.write_text(json.dumps(data)) + assert read_manifest(file).continuity is None + + +# --- a recorded episode, aligned only when its stored evidence allows it ------------------------ + + +def _alignable_config(tmp_path: Path) -> ServiceConfig: + return ServiceConfig( + output_root=tmp_path / "out", + numeric_sources=( + NumericSourceSpec("pico_controller", (FieldSpec("left_trigger", "float64"),), "PicoTrackingFrame"), + ), + video_sources=(VideoSourceSpec("cam", 64, 48, 30.0),), + qc=QcConfig(required_sources=("pico_controller", "cam")), + ) + + +async def _record_alignable(tmp_path: Path, own, camera_identities): + """A tiny episode: camera frames (one identity per frame) bracketed by tracking rows, all clock_mapping.""" + service = own(RecordingService(_alignable_config(tmp_path))) + session = await service.open_session() + episode = await service.start_episode("t") + frame = np.zeros((48, 64, 3), dtype=np.uint8) + items = [] + for i, identity in enumerate(camera_identities): + t = 1.0 + i / 30 + items.append(VideoSample("cam", frame, PixelFormat.RGB8, t, t, np.eye(3), (MAPPING, identity))) + for i in range(-2, 4 * len(camera_identities)): + t = 1.0 + i / 60 + items.append(NumericSample("pico_controller", t, t, {"left_trigger": t}, (MAPPING, 1))) + for item in sorted(items, key=lambda x: x.capture_time): + while service.submit_sample(episode.episode_id, item).status is SubmissionStatus.FULL: + await asyncio.sleep(0) + result = await service.stop_episode(episode.episode_id) + assert result.disposition is Disposition.KEPT + return session + + +def _align(session, tmp_path: Path): + manifest = _stored(session) + # The service writes each episode as its own store; the aligner reads episodes as groups of one session root. + zarr.open_group(str(session.session_path), mode="a") + qualified = dict.fromkeys(("cam", "pico_controller"), True) + return write_aligned_episode( + session.session_path, + tmp_path / "aligned", + 0, + "cam", + qualified=qualified, + continuity=manifest.continuity, + ) + + +async def test_an_episode_with_constant_evidence_aligns_from_its_stored_manifest(tmp_path, own): + session = await _record_alignable(tmp_path, own, [1] * 5) + manifest = _stored(session) + assert all(e["known"] and not e["breaks"] for e in manifest.continuity.values()) + aligned = _align(session, tmp_path) + assert aligned.valid_indices.any() + assert zarr.open_group(str(tmp_path / "aligned"), mode="r")["episode_0"]["cam"] is not None + + +async def test_an_episode_with_a_recorded_break_is_refused_and_writes_nothing(tmp_path, own): + session = await _record_alignable(tmp_path, own, [1, 1, 1, 2, 2]) + assert _stored(session).continuity["cam"]["breaks"] == [3] + with pytest.raises(AlignedWriteError, match=r"cam: has a restart inside the episode \(rows \[3\]\)"): + _align(session, tmp_path) + assert not (tmp_path / "aligned").exists() From cf1936d83df7172e8b9e6e6ba67556e632fc4ba2 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:54:05 -0500 Subject: [PATCH 10/38] egocap: validate continuity evidence before it is counted and require it complete submit_sample now rejects a malformed continuity value before any counter, queue or evidence changes, and queued copies keep it. The continuity check requires the initial identity and an explicit list of non-negative break rows that are rows of the source (checked against the written counts); anything missing or malformed is refused, never read as no break. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../egocap/recording/aligned_writer.py | 5 ++-- .../recording/egocap/recording/alignment.py | 25 ++++++++++++++++--- .../recording_service/recording_service.py | 17 +++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index 77bb51142f..56a4e82445 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -186,10 +186,11 @@ def write_aligned_episode( unqualified = [name for name in [index_source, *present] if not qualified.get(name, False)] if unqualified: raise AlignedWriteError(f"sources without a qualified event time: {sorted(set(unqualified))}") - broken = check_continuity(continuity, [index_source, *present]) + times = {name: raw_episode[name]["capture_time"][:] for name in present} + # The evidence is checked against the rows actually written: a break at a row the source lacks is refused. + broken = check_continuity(continuity, [index_source, *present], {name: len(t) for name, t in times.items()}) if broken: raise AlignedWriteError("; ".join(broken)) - times = {name: raw_episode[name]["capture_time"][:] for name in present} fields = {name: {a: raw_episode[name][a][:] for a in raw_episode[name].array_keys()} for name in present} aligned = align_episode( index_source, diff --git a/examples/egocap/recording/egocap/recording/alignment.py b/examples/egocap/recording/egocap/recording/alignment.py index 3f6a973b17..5b4a9fc2a4 100644 --- a/examples/egocap/recording/egocap/recording/alignment.py +++ b/examples/egocap/recording/egocap/recording/alignment.py @@ -87,18 +87,35 @@ def qualified_sources( return {**{name: name in mapped for name in cameras}, **{name: tracking_ok for name in tracking}} +def _complete(entry: Mapping[str, object], rows: int | None) -> bool: + """Whether a source's evidence has its initial identity and a well-formed list of break rows.""" + identity, breaks = entry.get("identity"), entry.get("breaks") + if not isinstance(identity, (str, int)) or isinstance(identity, bool) or not isinstance(breaks, list): + return False + # A break is a row index: a non-negative integer, and a row the source actually has. + return all( + isinstance(b, int) and not isinstance(b, bool) and b >= 0 and (rows is None or b < rows) for b in breaks + ) + + #: Continuity scopes that vouch for a source being one unbroken stretch. A clock mapping's epoch covers the #: publisher's times; a transport session does not cover the device behind it, so it is not accepted. ACCEPTED_CONTINUITY_SCOPES = ("clock_mapping",) -def check_continuity(continuity: Mapping[str, Mapping[str, object]] | None, sources: Sequence[str]) -> list[str]: +def check_continuity( + continuity: Mapping[str, Mapping[str, object]] | None, + sources: Sequence[str], + rows: Mapping[str, int] | None = None, +) -> list[str]: """Why the recorded continuity evidence does not allow aligning ``sources``; empty means it does. ``continuity`` is the per-source evidence stored with the episode (None when the episode recorded none). A source is refused when there is no evidence for it, the evidence is incomplete, its scope is not one that vouches for the source, or it records a break: interpolating across a restart would produce values the - sensor never reported. Nothing here defaults to clean. + sensor never reported. Nothing here defaults to clean: the initial identity and an explicit list of break rows + must both be present and well formed, and with ``rows`` (the written row count per source) every break must be + a row of the source. """ if continuity is None: return ["no continuity evidence was recorded for this episode"] @@ -113,7 +130,9 @@ def check_continuity(continuity: Mapping[str, Mapping[str, object]] | None, sour problems.append( f"{name}: its continuity evidence ({entry.get('scope')!r}) does not cover the source itself" ) - elif entry.get("breaks"): + elif not _complete(entry, None if rows is None else rows.get(name)): + problems.append(f"{name}: continuity evidence is incomplete or malformed") + elif entry["breaks"]: problems.append(f"{name}: has a restart inside the episode (rows {list(entry['breaks'])})") return problems diff --git a/examples/egocap/recording/recording_service/recording_service.py b/examples/egocap/recording/recording_service/recording_service.py index c79e1799e6..27fae9b846 100644 --- a/examples/egocap/recording/recording_service/recording_service.py +++ b/examples/egocap/recording/recording_service/recording_service.py @@ -398,6 +398,21 @@ def _validate(self, sample: NumericSample | VideoSample) -> None: for stamp in (sample.capture_time, sample.receive_time): if not isinstance(stamp, int | float) or not np.isfinite(stamp): raise ValidationError(f"{sample.source}: timestamps must be finite numbers") + # Continuity evidence is stored in the manifest as JSON, so its shape is checked before any bookkeeping + # changes: a malformed value must leave the counters, the queue and the evidence untouched. + evidence = sample.continuity + if evidence is not None: + valid = ( + isinstance(evidence, tuple) + and len(evidence) == 2 + and isinstance(evidence[0], str) + and isinstance(evidence[1], str | int) + and not isinstance(evidence[1], bool) + ) + if not valid: + raise ValidationError( + f"{sample.source}: continuity must be a (scope, identity) pair of str and str|int" + ) if isinstance(sample, NumericSample): if kind != "numeric": raise ValidationError(f"{sample.source} is a video source") @@ -443,6 +458,7 @@ def _copy(sample: NumericSample | VideoSample) -> NumericSample | VideoSample: float(sample.capture_time), float(sample.receive_time), {k: np.array(v, copy=True) for k, v in sample.fields.items()}, + sample.continuity, ) intrinsics = ( None if sample.intrinsics is None else np.array(sample.intrinsics, dtype=np.float64, copy=True) @@ -454,6 +470,7 @@ def _copy(sample: NumericSample | VideoSample) -> NumericSample | VideoSample: float(sample.capture_time), float(sample.receive_time), intrinsics, + sample.continuity, ) # -- task and call ownership -------------------------------------------------- From 2f31231ac8e872a21b171d0257cb2b47a8f8e6d9 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:54:56 -0500 Subject: [PATCH 11/38] egocap: publish an aligned episode by staging and renames The aligned episode is written and validated in a staging session beside the aligned one and moved into place with renames, so a reader never sees a half-written episode. An interrupted run leaves only the staging tree (discarded next run) or the previous episode under a .replaced name (restored next run); a refused or failed write leaves the aligned session untouched. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../egocap/recording/aligned_writer.py | 67 ++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index 56a4e82445..56e7932503 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -29,7 +29,13 @@ from .alignment import AlignedEpisode, align_episode, check_continuity, source_rules -__all__ = ["ALIGNED_SESSION_SIDECARS", "AlignedWriteError", "validate_aligned_episode", "write_aligned_episode"] +__all__ = [ + "ALIGNED_SESSION_SIDECARS", + "AlignedWriteError", + "publish_aligned_episode", + "validate_aligned_episode", + "write_aligned_episode", +] #: Session-level files carried into the aligned session when the raw session has them. ALIGNED_SESSION_SIDECARS = ( @@ -223,3 +229,62 @@ def write_aligned_episode( if problems: raise AlignedWriteError("; ".join(problems)) return aligned + + +def publish_aligned_episode( + raw_session: Path, + aligned_session: Path, + episode_index: int, + index_source: str, + *, + downsample: int = 1, + qualified: Mapping[str, bool], + continuity: Mapping[str, Mapping[str, object]] | None, +) -> AlignedEpisode: + """Write the aligned episode privately, then move it into ``aligned_session`` by renames. + + A reader never sees a half-written episode: it is written and validated in a staging session beside the + aligned one (same filesystem, so the videos stay linked and the moves are renames). An interrupted run + leaves either the staging tree, which the next run discards, or, if it stopped between the two renames, + the previous episode under a ``.replaced`` name, which the next run puts back before anything else. + Arguments and refusals are those of :func:`write_aligned_episode`. + """ + _check_separate(raw_session, aligned_session) + key = f"episode_{episode_index}" + staging = aligned_session.with_name(f".{aligned_session.name}.staging") + _check_separate(raw_session, staging) + final, replaced = aligned_session / key, aligned_session / f".{key}.replaced" + + # Leftovers of an interrupted run: a half-built staging tree is discarded, and an episode set aside by an + # interrupted move is restored (or dropped if its replacement did arrive). + shutil.rmtree(staging, ignore_errors=True) + if replaced.exists(): + if final.exists(): + shutil.rmtree(replaced) + else: + os.replace(replaced, final) + + try: + aligned = write_aligned_episode( + raw_session, + staging, + episode_index, + index_source, + downsample=downsample, + qualified=qualified, + continuity=continuity, + ) + except BaseException: + # Nothing of a failed or refused write reaches the aligned session. + shutil.rmtree(staging, ignore_errors=True) + raise + + # The aligned root and sidecars are idempotent; the episode moves in with two renames, keeping the old copy + # until the new one is in place. + _write_root(raw_session, aligned_session, index_source) + if final.exists(): + os.replace(final, replaced) + os.replace(staging / key, final) + shutil.rmtree(replaced, ignore_errors=True) + shutil.rmtree(staging, ignore_errors=True) + return aligned From 0233859454f2b40614897b6c8ae472c28f68f0ba Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:56:58 -0500 Subject: [PATCH 12/38] egocap: qualify each source's event time from per-source evidence and align a kept episode from it The timing attribute now records, per recorded source, what its saved time means and whether it is a qualified event time (a camera only when it is the sensor's capture event; the tracking sources are host times and are not). qualified_sources reads that and fails closed: only a literal True counts, and a clock mapping alone never qualifies a source. align_kept_episode takes the manifest's continuity evidence, derives qualification from the episode's own timing attribute, and publishes the aligned episode by staging and renames. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../backend/egocap_web/livekit_recording.py | 23 ++++++++++++- .../egocap/recording/aligned_writer.py | 32 +++++++++++++++++- .../recording/egocap/recording/alignment.py | 33 +++++++------------ 3 files changed, 64 insertions(+), 24 deletions(-) diff --git a/examples/egocap/backend/egocap_web/livekit_recording.py b/examples/egocap/backend/egocap_web/livekit_recording.py index bf3dbe464c..b264ef6f4f 100644 --- a/examples/egocap/backend/egocap_web/livekit_recording.py +++ b/examples/egocap/backend/egocap_web/livekit_recording.py @@ -33,7 +33,7 @@ from recording_service import PixelFormat, VideoSample from .livekit_receiver import LIVEKIT_MISSING, LiveKitFrameReceiver, livekit_available -from .recording_adapter import RecordingIngress +from .recording_adapter import MANUS_GLOVE_SOURCE, PICO_CONTROLLER_SOURCE, RecordingIngress logger = logging.getLogger("isaaccapture.egocap.livekit_recording") @@ -71,6 +71,15 @@ } +# What each tracking source's saved time is, and whether it is a qualified event time. Neither is: both are host +# times, not a measurement of the device. A source becomes qualified only when its producer carries a measurement +# time from acquisition, and its entry here changes with that evidence, not before. +_TRACKING_EVENT_TIME: dict[str, dict[str, Any]] = { + PICO_CONTROLLER_SOURCE: {"meaning": "pose_evaluation_time", "qualified": False}, + MANUS_GLOVE_SOURCE: {"meaning": "host_push_time", "qualified": False}, +} + + def uncertainty_budget_ns() -> int: """The largest clock-mapping uncertainty a take may be recorded with, from the environment or the default.""" raw = os.environ.get(BUDGET_ENV) @@ -509,6 +518,18 @@ def timing_evidence(self) -> dict[str, Any] | None: "exchanges_rejected": clock_sync.rejected, "mapping_current_at_stop": clock_sync.mapping() is not None, }, + # Per recorded source: what its saved time means and whether it is a qualified event time. A camera is + # qualified only when its time is the sensor's capture event; a frame-ready time is not. + "event_time": { + **{ + self._source_names[stream_id]: { + "meaning": _RECORDABLE_BASES[s.timestamp_basis], + "qualified": _RECORDABLE_BASES[s.timestamp_basis] == "sensor_capture", + } + for stream_id, s in self._streams.items() + }, + **_TRACKING_EVENT_TIME, + }, # Tracking samples carry the host's poll time for every source; device measurement times are unmapped. "tracking_time": "host_poll", "tracking_semantics": _TRACKING_SEMANTICS, diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index 56e7932503..6f1514ca19 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -27,11 +27,12 @@ import yaml import zarr -from .alignment import AlignedEpisode, align_episode, check_continuity, source_rules +from .alignment import AlignedEpisode, align_episode, check_continuity, qualified_sources, source_rules __all__ = [ "ALIGNED_SESSION_SIDECARS", "AlignedWriteError", + "align_kept_episode", "publish_aligned_episode", "validate_aligned_episode", "write_aligned_episode", @@ -288,3 +289,32 @@ def publish_aligned_episode( shutil.rmtree(replaced, ignore_errors=True) shutil.rmtree(staging, ignore_errors=True) return aligned + + +def align_kept_episode( + raw_session: Path, + episode_index: int, + index_source: str, + continuity: Mapping[str, Mapping[str, object]] | None, + *, + aligned_session: Path | None = None, + downsample: int = 1, +) -> AlignedEpisode: + """Align one kept episode from what the recorder stored about it, and publish the result. + + ``continuity`` is the episode manifest's evidence. Which sources have a qualified event time is read from the + episode's own ``timing`` attribute, so an episode recorded without that evidence is refused, never assumed + qualified. The aligned session defaults to ``_aligned`` beside the raw one. + """ + config = yaml.safe_load((raw_session / "config.yaml").read_text(encoding="utf-8")) or {} + declared = [e["name"] for section in ("video_sources", "numeric_sources") for e in config.get(section) or []] + timing = dict(zarr.open_group(str(raw_session / f"episode_{episode_index}"), mode="r").attrs).get("timing") + return publish_aligned_episode( + raw_session, + aligned_session or raw_session.with_name(f"{raw_session.name}_aligned"), + episode_index, + index_source, + downsample=downsample, + qualified=qualified_sources(timing, declared), + continuity=continuity, + ) diff --git a/examples/egocap/recording/egocap/recording/alignment.py b/examples/egocap/recording/egocap/recording/alignment.py index 5b4a9fc2a4..00bef58641 100644 --- a/examples/egocap/recording/egocap/recording/alignment.py +++ b/examples/egocap/recording/egocap/recording/alignment.py @@ -59,32 +59,21 @@ class InsufficientSamplesError(AlignmentError): """Fewer than two samples with strictly increasing times remain, so nothing can be interpolated.""" -def qualified_sources( - timing: Mapping[str, object] | None, cameras: Sequence[str], tracking: Sequence[str] -) -> dict[str, bool]: +def qualified_sources(timing: Mapping[str, object] | None, sources: Sequence[str]) -> dict[str, bool]: """Which sources' recorded times are qualified event times, from an episode's ``timing`` attribute. - A camera is qualified only when its entry in ``clock_mapping.streams`` says its time is the sensor's capture - event (``time_meaning == "sensor_capture"``); a clock mapping alone says which clock a time is on, not what it - measures, and a ``frame_ready`` time is not a capture event. A tracking source is qualified only when - ``tracking_semantics.physical_alignment`` says a measurement time is available; it says ``unavailable: ...`` - while tracking carries the host's poll time. Anything the attribute does not vouch for is False. A caller that + ``timing["event_time"][source]["qualified"]`` is the recorded statement, per source, of whether its saved time + is a qualified event time (a sensor's capture event, or a device measurement time). Only a literal True counts; + a source the attribute does not list, an entry without it, or no attribute at all is False. A clock mapping + says which clock a time is on, not what it measures, so it is never taken as qualification. A caller that aligns on ``receive_time - latency`` instead states that choice itself; this says nothing about it. """ - timing = timing or {} - # Cameras: a stream whose time means the sensor's capture event (a non-list vouches for nothing). - mapping = timing.get("clock_mapping") - streams = mapping.get("streams") if isinstance(mapping, Mapping) else None - mapped = ( - {s.get("name") for s in streams if isinstance(s, Mapping) and s.get("time_meaning") == "sensor_capture"} - if isinstance(streams, (list, tuple)) - else set() - ) - # Tracking: qualified only if the recording says a measurement time exists. - semantics = timing.get("tracking_semantics") - alignment = semantics.get("physical_alignment") if isinstance(semantics, Mapping) else None - tracking_ok = isinstance(alignment, str) and alignment.startswith("available") - return {**{name: name in mapped for name in cameras}, **{name: tracking_ok for name in tracking}} + event_time = (timing or {}).get("event_time") + entries = event_time if isinstance(event_time, Mapping) else {} + # Fail closed: anything but an explicit True is not qualified. + return { + name: isinstance(entries.get(name), Mapping) and entries[name].get("qualified") is True for name in sources + } def _complete(entry: Mapping[str, object], rows: int | None) -> bool: From 386d084dc294ab4c04eef90ee2acda36d769ae2b Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:57:57 -0500 Subject: [PATCH 13/38] egocap: a command to time-align one kept episode Reads the episode's manifest for its continuity evidence, derives qualification from the episode's own timing attribute, and publishes the aligned copy beside its session; an episode that lacks either is refused with the reason. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../egocap/recording/tools/align_episode.py | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100755 examples/egocap/recording/tools/align_episode.py diff --git a/examples/egocap/recording/tools/align_episode.py b/examples/egocap/recording/tools/align_episode.py new file mode 100755 index 0000000000..7a14f3a52a --- /dev/null +++ b/examples/egocap/recording/tools/align_episode.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +# SPDX-FileCopyrightText: 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +"""Time-align one kept episode and publish the aligned copy beside its session. + +The raw session is only read. The episode's stored continuity evidence comes from its manifest, and which +sources have a qualified event time from the episode's own ``timing`` attribute; an episode that lacks either is +refused with the reason, never assumed good. + +Usage (from any directory outside ``egocap`` itself):: + + /.venv/bin/python recording/tools/align_episode.py SESSION_DIR --episode N --index-source NAME \ + [--manifest-session DIR] [--aligned-session DIR] [--downsample K] + +``--manifest-session`` is where the episode's manifest lives when that is not ``SESSION_DIR`` (a routed +episode's manifest stays in the session it was recorded in). Exit status 0 means the aligned episode was +published; 1 means it was refused or failed, with the reason on stderr. +""" + +import argparse +import sys +from pathlib import Path + +from egocap.recording.aligned_writer import AlignedWriteError, align_kept_episode +from egocap.recording.alignment import AlignmentError +from egocap.recording.episode_layout import manifest_path, read_manifest + + +def main(argv: list[str] | None = None) -> int: + """Align the named episode and report the result; returns the process exit status.""" + parser = argparse.ArgumentParser(description=__doc__.split("\n")[0]) + parser.add_argument("session", type=Path, help="the raw session directory holding episode_N") + parser.add_argument("--episode", type=int, required=True, help="the episode's index in that directory") + parser.add_argument("--index-source", required=True, help="the camera whose frames define the timeline") + parser.add_argument("--manifest-session", type=Path, help="the session whose manifest describes the episode") + parser.add_argument("--aligned-session", type=Path, help="where to publish (default: _aligned)") + parser.add_argument("--downsample", type=int, default=1, help="keep every K-th index frame (default 1)") + args = parser.parse_args(argv) + + # The manifest carries the continuity evidence; without a readable one the episode cannot be vouched for. + try: + manifest = read_manifest(manifest_path(args.manifest_session or args.session, args.episode)) + except (OSError, ValueError) as exc: + print(f"cannot read the episode's manifest: {exc}", file=sys.stderr) + return 1 + try: + aligned = align_kept_episode( + args.session, + args.episode, + args.index_source, + manifest.continuity, + aligned_session=args.aligned_session, + downsample=args.downsample, + ) + except (AlignedWriteError, AlignmentError) as exc: + print(f"not aligned: {exc}", file=sys.stderr) + return 1 + print( + f"aligned episode_{args.episode}: {int(aligned.valid_indices.sum())} of {len(aligned.valid_indices)} frames" + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) From 4aa8232170b494bebda9a30a36163a2169369a83 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:58:09 -0500 Subject: [PATCH 14/38] egocap: keep the align command within the line limit Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/recording/tools/align_episode.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/egocap/recording/tools/align_episode.py b/examples/egocap/recording/tools/align_episode.py index 7a14f3a52a..2e164d032b 100755 --- a/examples/egocap/recording/tools/align_episode.py +++ b/examples/egocap/recording/tools/align_episode.py @@ -58,9 +58,8 @@ def main(argv: list[str] | None = None) -> int: except (AlignedWriteError, AlignmentError) as exc: print(f"not aligned: {exc}", file=sys.stderr) return 1 - print( - f"aligned episode_{args.episode}: {int(aligned.valid_indices.sum())} of {len(aligned.valid_indices)} frames" - ) + kept, total = int(aligned.valid_indices.sum()), len(aligned.valid_indices) + print(f"aligned episode_{args.episode}: {kept} of {total} frames") return 0 From eadf8f3b1d5234b757c46bd0cd21132a8888a6fe Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 13:58:37 -0500 Subject: [PATCH 15/38] egocap: test staged publication of an aligned episode Covers success equal to the in-place writer, re-publication replacing the whole episode, refusals leaving the aligned session untouched, crashes at each of the two renames and their recovery, leftover staging and replaced trees, and failures after staging started. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../unit/test_publish_aligned_episode.py | 430 ++++++++++++++++++ 1 file changed, 430 insertions(+) create mode 100644 examples/egocap/tests/recording/unit/test_publish_aligned_episode.py diff --git a/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py new file mode 100644 index 0000000000..7ef929db68 --- /dev/null +++ b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py @@ -0,0 +1,430 @@ +# SPDX-FileCopyrightText: 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +import hashlib +import json +import os +import shutil +from pathlib import Path + +import numpy as np +import pytest +import zarr + +from egocap.recording import aligned_writer +from egocap.recording.aligned_writer import ( + AlignedWriteError, + publish_aligned_episode, + validate_aligned_episode, + write_aligned_episode, +) + +FIXTURES = Path(__file__).resolve().parent.parent / "fixtures" / "aligned_writer" +META = json.loads((FIXTURES / "scenarios.json").read_text()) +INDEX = META["index_source"] +QUALIFIED = dict.fromkeys(("head_camera", "wrist_camera", "pico_controller", "glove"), True) +CAMERAS = ("head_camera", "wrist_camera") + + +def clean_continuity(sources=tuple(QUALIFIED)): + """Continuity evidence that vouches for every source: the clock mapping, no restart, known.""" + return {name: {"scope": "clock_mapping", "identity": 0, "breaks": [], "known": True} for name in sources} + + +def video_bytes(source, episode): + return (f"dummy video {source} episode {episode} ".encode()) * 16 + + +def build_raw(root, scenario, drop_sources=()): + """The raw session a scenario starts from, in the layout the recording service writes.""" + root.mkdir(parents=True) + group = zarr.open_group(str(root), mode="w") + for key, value in scenario["raw_attrs"].items(): + group.attrs[key] = value + with np.load(FIXTURES / "raw_inputs.npz") as inputs: + arrays = {k: inputs[k] for k in inputs.files} + for episode in (0, 1): + episode_group = group.require_group(f"episode_{episode}") + for key, value in META["episode_attrs"].items(): + episode_group.attrs[key] = value + for key, array in arrays.items(): + tag, source, name = key.split("__") + if tag != f"e{episode}" or source in drop_sources: + continue + source_group = episode_group.require_group(source) + for attr, value in META["source_attrs"].get(source, {}).items(): + source_group.attrs[attr] = value + source_group[name] = array + for camera in CAMERAS: + (root / f"episode_{episode}" / f"{camera}.mp4").write_bytes(video_bytes(camera, episode)) + shutil.copy2(FIXTURES / "config.yaml", root / "config.yaml") + for name in scenario["sidecars"]: + shutil.copy2(FIXTURES / name, root / name) + + +def snapshot(root): + """Everything a reader of an aligned session sees: files, zarr nodes and their contents.""" + entries = {} + for path in sorted(root.rglob("*")): + rel = path.relative_to(root) + # Chunk files and node metadata belong to the zarr nodes, which are compared through zarr below. + if path.is_file() and path.name != "zarr.json" and "c" not in rel.parts[:-1]: + entries[rel.as_posix()] = ("file", path.stat().st_size, hashlib.sha256(path.read_bytes()).hexdigest()) + root_json = json.loads((root / "zarr.json").read_text()) + entries["zarr.json"] = ("root_json", root_json["attributes"]) + + def walk(group, prefix): + for name in sorted(group.group_keys()): + entries[f"{prefix}{name}"] = ("group", dict(group[name].attrs)) + walk(group[name], f"{prefix}{name}/") + for name in sorted(group.array_keys()): + array = group[name] + entries[f"{prefix}{name}"] = ( + "array", + str(array.dtype), + tuple(array.shape), + dict(array.attrs), + array[:], + ) + + walk(zarr.open_group(str(root), mode="r"), "") + return entries + + +def publish(raw, aligned, episode=0, downsample=1, qualified=QUALIFIED, continuity="clean"): + return publish_aligned_episode( + raw, + aligned, + episode, + INDEX, + downsample=downsample, + qualified=qualified, + continuity=clean_continuity() if continuity == "clean" else continuity, + ) + + +def reference(raw, target, episode=0, downsample=1): + write_aligned_episode( + raw, target, episode, INDEX, downsample=downsample, qualified=QUALIFIED, continuity=clean_continuity() + ) + + +def listing(root): + """Every path under ``root`` (hidden ones included) with its size, to compare a tree before and after.""" + if not root.exists(): + return None + return {p.relative_to(root).as_posix(): (p.stat().st_size if p.is_file() else None) for p in root.rglob("*")} + + +def raw_state(root): + """Recursive listing plus a content hash of every file, for proving the raw session was not touched.""" + state = {} + for p in sorted(root.rglob("*")): + digest = hashlib.sha256(p.read_bytes()).hexdigest() if p.is_file() else None + state[p.relative_to(root).as_posix()] = digest + return state + + +def assert_no_leftovers(aligned): + assert not (aligned.parent / f".{aligned.name}.staging").exists() + assert not list(aligned.glob(".*.replaced")) + + +def assert_snapshots_equal(got, want): + assert set(got) == set(want) + for path, expected in want.items(): + actual = got[path] + assert actual[0] == expected[0], path + if expected[0] != "array": + assert actual[1:] == expected[1:], path + else: + assert actual[1:4] == expected[1:4], path + assert np.array_equal(actual[4], expected[4]), path + + +@pytest.fixture +def raw(tmp_path): + build_raw(tmp_path / "raw", META["scenarios"]["basic_ds1"]) + return tmp_path / "raw" + + +@pytest.mark.parametrize("episode", [0, 1]) +def test_published_tree_equals_what_write_aligned_episode_produces(tmp_path, raw, episode): + reference(raw, tmp_path / "ref", episode, downsample=2) + before = raw_state(raw) + publish(raw, tmp_path / "aligned", episode, downsample=2) + + assert_snapshots_equal(snapshot(tmp_path / "aligned"), snapshot(tmp_path / "ref")) + assert_no_leftovers(tmp_path / "aligned") + assert validate_aligned_episode(tmp_path / "aligned", episode, INDEX) == [] + assert raw_state(raw) == before + + +def test_publish_returns_the_alignment(tmp_path, raw): + aligned = publish(raw, tmp_path / "aligned") + again = write_aligned_episode( + raw, tmp_path / "ref", 0, INDEX, qualified=QUALIFIED, continuity=clean_continuity() + ) + assert np.array_equal(aligned.valid_indices, again.valid_indices) + assert np.array_equal(aligned.valid_timestamps, again.valid_timestamps) + + +def test_published_videos_are_hard_links_to_the_raw_ones(tmp_path, raw): + publish(raw, tmp_path / "aligned") + for camera in CAMERAS: + raw_video = raw / "episode_0" / f"{camera}.mp4" + aligned_video = tmp_path / "aligned" / "episode_0" / f"{camera}.mp4" + assert os.stat(raw_video).st_ino == os.stat(aligned_video).st_ino + assert aligned_video.read_bytes() == video_bytes(camera, 0) + + +def test_published_videos_are_copies_when_linking_is_not_possible(tmp_path, raw, monkeypatch): + real_link = os.link + + def no_link(source, target, *args, **kwargs): + if str(source).endswith(".mp4"): + raise OSError("cross-device link") + return real_link(source, target, *args, **kwargs) + + monkeypatch.setattr(aligned_writer.os, "link", no_link) + publish(raw, tmp_path / "aligned") + for camera in CAMERAS: + raw_video = raw / "episode_0" / f"{camera}.mp4" + aligned_video = tmp_path / "aligned" / "episode_0" / f"{camera}.mp4" + assert os.stat(raw_video).st_ino != os.stat(aligned_video).st_ino + assert aligned_video.read_bytes() == video_bytes(camera, 0) + + +def test_republishing_replaces_the_whole_episode_and_leaves_others_alone(tmp_path, raw): + aligned = tmp_path / "aligned" + publish(raw, aligned, 0) + publish(raw, aligned, 1) + # A stale array and a stray file that only the first publication could have left behind. + stale = zarr.open_group(str(aligned), mode="a")["episode_0"] + stale["stale_array"] = np.arange(5) + (aligned / "episode_0" / "stale.txt").write_text("old") + other_before = {k: v for k, v in snapshot(aligned).items() if k.startswith("episode_1")} + + publish(raw, aligned, 0, downsample=2) + + reference(raw, tmp_path / "ref", 0, downsample=2) + now = snapshot(aligned) + assert "episode_0/stale_array" not in now + assert "episode_0/stale.txt" not in now + assert_snapshots_equal( + {k: v for k, v in now.items() if k.startswith("episode_0")}, + {k: v for k, v in snapshot(tmp_path / "ref").items() if k.startswith("episode_0")}, + ) + assert_snapshots_equal({k: v for k, v in now.items() if k.startswith("episode_1")}, other_before) + assert_no_leftovers(aligned) + assert validate_aligned_episode(aligned, 0, INDEX) == [] + + +def with_entry(source, **changes): + evidence = clean_continuity() + evidence[source] = {**evidence[source], **changes} + return evidence + + +REFUSALS = { + "unqualified": {"qualified": {**QUALIFIED, "glove": False}}, + "unqualified_index": {"qualified": {**QUALIFIED, INDEX: False}}, + "continuity_none": {"continuity": None}, + "break_in_evidence": {"continuity": with_entry("glove", breaks=[3])}, +} + + +@pytest.mark.parametrize("case", sorted(REFUSALS)) +@pytest.mark.parametrize("existing", [False, True]) +def test_a_refused_publication_leaves_the_aligned_session_unchanged(tmp_path, raw, case, existing): + aligned = tmp_path / "aligned" + if existing: + publish(raw, aligned, 1) + before, raw_before = listing(aligned), raw_state(raw) + snap = snapshot(aligned) if existing else None + + with pytest.raises(AlignedWriteError): + publish(raw, aligned, 0, **REFUSALS[case]) + + assert listing(aligned) == before + if existing: + assert_snapshots_equal(snapshot(aligned), snap) + else: + assert not aligned.exists() + assert not (tmp_path / ".aligned.staging").exists() + assert raw_state(raw) == raw_before + + +def test_an_aligned_path_aliasing_the_raw_session_is_refused(tmp_path, raw): + (tmp_path / "alias").symlink_to(raw, target_is_directory=True) + before = raw_state(raw) + for target in (raw, tmp_path / "alias", raw / "inside"): + with pytest.raises(AlignedWriteError, match="separate"): + publish(raw, target) + assert raw_state(raw) == before + + +def test_a_staging_path_that_is_the_raw_session_is_refused_and_not_deleted(tmp_path): + raw_named_like_staging = tmp_path / ".aligned.staging" + build_raw(raw_named_like_staging, META["scenarios"]["basic_ds1"]) + before = raw_state(raw_named_like_staging) + with pytest.raises(AlignedWriteError, match="separate"): + publish(raw_named_like_staging, tmp_path / "aligned") + assert raw_state(raw_named_like_staging) == before + assert not (tmp_path / "aligned").exists() + + +class FailingOs: + """The ``os`` module as the writer sees it, with ``replace`` failing on one chosen call.""" + + def __init__(self, fail_on): + self.calls = 0 + self.fail_on = fail_on + + def __getattr__(self, name): + return getattr(os, name) + + def replace(self, source, target): + self.calls += 1 + if self.calls == self.fail_on: + raise OSError("simulated crash") + return os.replace(source, target) + + +@pytest.mark.parametrize("fail_on", [1, 2]) +def test_a_crash_while_replacing_an_existing_episode_never_leaves_a_partial_one( + tmp_path, raw, monkeypatch, fail_on +): + aligned = tmp_path / "aligned" + publish(raw, aligned, 0, downsample=1) + old = snapshot(aligned) + reference(raw, tmp_path / "ref", 0, downsample=2) + + monkeypatch.setattr(aligned_writer, "os", FailingOs(fail_on)) + with pytest.raises(OSError, match="simulated crash"): + publish(raw, aligned, 0, downsample=2) + monkeypatch.undo() + + if (aligned / "episode_0").exists(): + # The first rename failed: the previous episode is still there, whole. + assert fail_on == 1 + assert_snapshots_equal(snapshot(aligned), old) + else: + # Between the two renames: the previous episode is held under its .replaced name, whole. + assert fail_on == 2 + assert (aligned / ".episode_0.replaced").is_dir() + assert validate_aligned_episode(aligned, 0, INDEX) != [] + + publish(raw, aligned, 0, downsample=2) + + assert_no_leftovers(aligned) + assert validate_aligned_episode(aligned, 0, INDEX) == [] + assert_snapshots_equal(snapshot(aligned), snapshot(tmp_path / "ref")) + + +def test_a_crash_between_the_renames_is_undone_by_a_run_that_refuses(tmp_path, raw, monkeypatch): + aligned = tmp_path / "aligned" + publish(raw, aligned, 0) + old = snapshot(aligned) + monkeypatch.setattr(aligned_writer, "os", FailingOs(2)) + with pytest.raises(OSError): + publish(raw, aligned, 0, downsample=2) + monkeypatch.undo() + + with pytest.raises(AlignedWriteError): + publish(raw, aligned, 0, continuity=None) + + # The refused run still put the previous episode back. + assert_snapshots_equal(snapshot(aligned), old) + assert_no_leftovers(aligned) + + +def test_a_crash_publishing_a_new_episode_leaves_none_and_a_retry_succeeds(tmp_path, raw, monkeypatch): + aligned = tmp_path / "aligned" + monkeypatch.setattr(aligned_writer, "os", FailingOs(1)) + with pytest.raises(OSError, match="simulated crash"): + publish(raw, aligned, 0) + monkeypatch.undo() + assert not (aligned / "episode_0").exists() + + publish(raw, aligned, 0) + + assert_no_leftovers(aligned) + assert validate_aligned_episode(aligned, 0, INDEX) == [] + + +def test_a_leftover_staging_tree_is_discarded(tmp_path, raw): + aligned = tmp_path / "aligned" + staging = tmp_path / ".aligned.staging" + (staging / "episode_0").mkdir(parents=True) + (staging / "episode_0" / "junk.bin").write_bytes(b"half written") + + publish(raw, aligned, 0) + + assert not staging.exists() + assert not (aligned / "episode_0" / "junk.bin").exists() + assert validate_aligned_episode(aligned, 0, INDEX) == [] + + +def test_a_leftover_replaced_episode_without_a_replacement_is_restored_first(tmp_path, raw): + aligned = tmp_path / "aligned" + publish(raw, aligned, 0) + old = snapshot(aligned) + os.rename(aligned / "episode_0", aligned / ".episode_0.replaced") + + # A refused run shows the restore happened before anything else. + with pytest.raises(AlignedWriteError): + publish(raw, aligned, 0, continuity=None) + assert_snapshots_equal(snapshot(aligned), old) + assert_no_leftovers(aligned) + + +def test_a_leftover_replaced_episode_without_a_replacement_is_then_overwritten_by_a_publish(tmp_path, raw): + aligned = tmp_path / "aligned" + publish(raw, aligned, 0) + os.rename(aligned / "episode_0", aligned / ".episode_0.replaced") + + publish(raw, aligned, 0, downsample=2) + + reference(raw, tmp_path / "ref", 0, downsample=2) + assert_snapshots_equal(snapshot(aligned), snapshot(tmp_path / "ref")) + assert_no_leftovers(aligned) + + +def test_a_leftover_replaced_episode_beside_its_replacement_is_dropped(tmp_path, raw): + aligned = tmp_path / "aligned" + publish(raw, aligned, 0) + current = snapshot(aligned) + shutil.copytree(aligned / "episode_0", aligned / ".episode_0.replaced") + (aligned / ".episode_0.replaced" / "older.txt").write_text("previous generation") + + with pytest.raises(AlignedWriteError): + publish(raw, aligned, 0, continuity=None) + + # The replacement that did arrive is kept as it was; the set-aside copy is gone. + assert_snapshots_equal(snapshot(aligned), current) + assert_no_leftovers(aligned) + + +@pytest.mark.parametrize("error", [RuntimeError, KeyboardInterrupt]) +def test_a_failure_after_staging_started_removes_the_staging_tree_and_propagates( + tmp_path, raw, monkeypatch, error +): + aligned = tmp_path / "aligned" + publish(raw, aligned, 1) + before = listing(aligned) + seen = {} + + def fail_in_validation(session, episode, index_source): + seen["staged"] = session.exists() + raise error("boom") + + monkeypatch.setattr(aligned_writer, "validate_aligned_episode", fail_in_validation) + with pytest.raises(error, match="boom"): + publish(raw, aligned, 0) + + # Staging existed when the failure hit, and nothing of it is left or reached the aligned session. + assert seen["staged"] + assert not (tmp_path / ".aligned.staging").exists() + assert listing(aligned) == before From 00e224d98a31bf6de77538e16e4e1409c40336e6 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:00:10 -0500 Subject: [PATCH 16/38] egocap: record camera timing evidence under the right names and serialize publication timing_evidence now keys each camera's event-time entry by the stream's own name and iterates the source's streams (it indexed attributes that belong to the feed). publish_aligned_episode holds an exclusive lock beside the aligned session for the whole publication, so concurrent runs queue instead of discarding each other's staging tree, and its docstring states the contract: a reader sees the previous episode, the new one or, between the two renames of a re-publication, none; never a partial one. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../backend/egocap_web/livekit_recording.py | 5 +-- .../egocap/recording/aligned_writer.py | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/examples/egocap/backend/egocap_web/livekit_recording.py b/examples/egocap/backend/egocap_web/livekit_recording.py index b264ef6f4f..14490f177d 100644 --- a/examples/egocap/backend/egocap_web/livekit_recording.py +++ b/examples/egocap/backend/egocap_web/livekit_recording.py @@ -521,12 +521,13 @@ def timing_evidence(self) -> dict[str, Any] | None: # Per recorded source: what its saved time means and whether it is a qualified event time. A camera is # qualified only when its time is the sensor's capture event; a frame-ready time is not. "event_time": { + # A stream is recorded under its own name (see start()), which is the key readers look it up by. **{ - self._source_names[stream_id]: { + s.name: { "meaning": _RECORDABLE_BASES[s.timestamp_basis], "qualified": _RECORDABLE_BASES[s.timestamp_basis] == "sensor_capture", } - for stream_id, s in self._streams.items() + for s in self._streams }, **_TRACKING_EVENT_TIME, }, diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index 6f1514ca19..4357287d88 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -17,6 +17,7 @@ from __future__ import annotations +import fcntl import os import shutil from collections.abc import Mapping @@ -249,11 +250,45 @@ def publish_aligned_episode( leaves either the staging tree, which the next run discards, or, if it stopped between the two renames, the previous episode under a ``.replaced`` name, which the next run puts back before anything else. Arguments and refusals are those of :func:`write_aligned_episode`. + + Publication contract: one publisher at a time per aligned session (an exclusive lock on a file beside it is held + throughout, so concurrent runs queue instead of discarding each other's staging); a reader sees the previous + episode, the new one, or, in the instant between the two renames of a re-publication, no episode, and never a + partial one. The rename pair is crash-recoverable, not a single atomic replacement. """ _check_separate(raw_session, aligned_session) key = f"episode_{episode_index}" staging = aligned_session.with_name(f".{aligned_session.name}.staging") _check_separate(raw_session, staging) + lock_path = aligned_session.with_name(f".{aligned_session.name}.lock") + # The lock file sits beside the aligned session, not in it, so a refused run still creates nothing inside. + with open(lock_path, "a") as lock: + fcntl.flock(lock, fcntl.LOCK_EX) + return _publish_locked( + raw_session, + aligned_session, + staging, + key, + episode_index, + index_source, + downsample, + qualified, + continuity, + ) + + +def _publish_locked( + raw_session: Path, + aligned_session: Path, + staging: Path, + key: str, + episode_index: int, + index_source: str, + downsample: int, + qualified: Mapping[str, bool], + continuity: Mapping[str, Mapping[str, object]] | None, +) -> AlignedEpisode: + """The body of :func:`publish_aligned_episode`, run while its lock is held.""" final, replaced = aligned_session / key, aligned_session / f".{key}.replaced" # Leftovers of an interrupted run: a half-built staging tree is discarded, and an episode set aside by an From f1421c7e4d96f0ba73b66e39bb3285bc9dd7ef76 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:00:25 -0500 Subject: [PATCH 17/38] egocap: keep the publication contract docstring within the line limit Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/recording/egocap/recording/aligned_writer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index 4357287d88..7e89dc0395 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -251,8 +251,8 @@ def publish_aligned_episode( the previous episode under a ``.replaced`` name, which the next run puts back before anything else. Arguments and refusals are those of :func:`write_aligned_episode`. - Publication contract: one publisher at a time per aligned session (an exclusive lock on a file beside it is held - throughout, so concurrent runs queue instead of discarding each other's staging); a reader sees the previous + Publication contract: one publisher at a time per aligned session (an exclusive lock on a file beside it is + held throughout, so concurrent runs queue instead of discarding each other's staging); a reader sees the previous episode, the new one, or, in the instant between the two renames of a re-publication, no episode, and never a partial one. The rename pair is crash-recoverable, not a single atomic replacement. """ From 4a67ec97d0069b3a616e0f83248dff4082b446d8 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:00:35 -0500 Subject: [PATCH 18/38] egocap: rewrap the publication contract docstring Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../egocap/recording/egocap/recording/aligned_writer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index 7e89dc0395..eb6442dfa7 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -252,9 +252,9 @@ def publish_aligned_episode( Arguments and refusals are those of :func:`write_aligned_episode`. Publication contract: one publisher at a time per aligned session (an exclusive lock on a file beside it is - held throughout, so concurrent runs queue instead of discarding each other's staging); a reader sees the previous - episode, the new one, or, in the instant between the two renames of a re-publication, no episode, and never a - partial one. The rename pair is crash-recoverable, not a single atomic replacement. + held throughout, so concurrent runs queue instead of discarding each other's staging). A reader sees the + previous episode, the new one, or, in the instant between the two renames of a re-publication, no episode; + never a partial one. The rename pair is crash-recoverable, not a single atomic replacement. """ _check_separate(raw_session, aligned_session) key = f"episode_{episode_index}" From 6961e124928a0404f66b0ce439e78a40b9abcd4d Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:01:05 -0500 Subject: [PATCH 19/38] egocap: test the continuity validation and the per-source qualification evidence Covers malformed continuity refused before anything is counted (counts, queue and evidence unchanged), queued copies keeping it, the completeness check with every missing or malformed identity or break list and break rows beyond the written count, and qualified_sources reading only a literal True from the per-source event-time evidence (a clock mapping never qualifies a source), plus the camera and tracking event-time entries the LiveKit recorder writes. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../backend/test_livekit_recording_source.py | 22 +++ .../recording/unit/test_aligned_writer.py | 22 +++ .../tests/recording/unit/test_alignment.py | 141 ++++++++++++------ .../recording_service/test_continuity.py | 73 +++++++++ 4 files changed, 211 insertions(+), 47 deletions(-) diff --git a/examples/egocap/tests/backend/test_livekit_recording_source.py b/examples/egocap/tests/backend/test_livekit_recording_source.py index 5234d1e988..084396b129 100644 --- a/examples/egocap/tests/backend/test_livekit_recording_source.py +++ b/examples/egocap/tests/backend/test_livekit_recording_source.py @@ -479,12 +479,34 @@ async def test_timing_evidence_describes_the_mappings_the_take_was_placed_under( "exchanges_rejected": 4, "mapping_current_at_stop": False, }, + "event_time": { + "cam16": {"meaning": "sensor_capture", "qualified": True}, + "cam17": {"meaning": "frame_ready", "qualified": False}, + "pico_controller": {"meaning": "pose_evaluation_time", "qualified": False}, + "manus_glove": {"meaning": "host_push_time", "qualified": False}, + }, "tracking_time": "host_poll", "tracking_semantics": lrec._TRACKING_SEMANTICS, } assert json.loads(json.dumps(evidence)) == evidence +async def test_event_time_is_keyed_by_recorded_source_and_qualifies_only_sensor_capture(monkeypatch): + streams = [livekit_stream(16), livekit_stream(17, basis=MONO)] + source, receiver = await prepared_source(streams) + receiver.clock_sync = clock_sync_with(history_of(1)) + event_time = source.timing_evidence()["event_time"] + # Recorded sources are named after their streams; the key is that source name, never a stream id. + assert {k: v["qualified"] for k, v in event_time.items()} == { + "cam16": True, + "cam17": False, + "pico_controller": False, + "manus_glove": False, + } + assert event_time["cam16"]["meaning"] == "sensor_capture" and event_time["cam17"]["meaning"] == "frame_ready" + assert 16 not in event_time and 17 not in event_time + + async def test_timing_evidence_records_the_configured_uncertainty_budget(monkeypatch): monkeypatch.setenv(lrec.BUDGET_ENV, "2.5") source, receiver = await prepared_source([livekit_stream(16)]) diff --git a/examples/egocap/tests/recording/unit/test_aligned_writer.py b/examples/egocap/tests/recording/unit/test_aligned_writer.py index 6b95879161..50dc6eeb08 100644 --- a/examples/egocap/tests/recording/unit/test_aligned_writer.py +++ b/examples/egocap/tests/recording/unit/test_aligned_writer.py @@ -407,3 +407,25 @@ def test_missing_or_broken_continuity_refuses_and_writes_nothing(tmp_path, conti write_aligned_episode(raw, tmp_path / "aligned", 0, INDEX, qualified=QUALIFIED, continuity=continuity) assert not (tmp_path / "aligned").exists() assert raw_listing(raw) == before + + +@pytest.mark.parametrize("source", ["glove", INDEX]) +def test_a_break_beyond_the_episodes_rows_is_refused_and_writes_nothing(tmp_path, source): + raw = tmp_path / "raw" + build_raw(raw, META["scenarios"]["basic_ds1"]) + before = raw_listing(raw) + with pytest.raises(AlignedWriteError, match=rf"{source}: continuity evidence is incomplete or malformed"): + write_aligned_episode( + raw, tmp_path / "aligned", 0, INDEX, qualified=QUALIFIED, continuity=with_entry(source, breaks=[10**6]) + ) + assert not (tmp_path / "aligned").exists() + assert raw_listing(raw) == before + + +def test_partial_evidence_without_identity_or_breaks_is_refused(tmp_path): + raw = tmp_path / "raw" + build_raw(raw, META["scenarios"]["basic_ds1"]) + partial = {name: {"scope": "clock_mapping", "known": True} for name in QUALIFIED} + with pytest.raises(AlignedWriteError, match="incomplete or malformed"): + write_aligned_episode(raw, tmp_path / "aligned", 0, INDEX, qualified=QUALIFIED, continuity=partial) + assert not (tmp_path / "aligned").exists() diff --git a/examples/egocap/tests/recording/unit/test_alignment.py b/examples/egocap/tests/recording/unit/test_alignment.py index 242dbf79f0..e1c8073d7f 100644 --- a/examples/egocap/tests/recording/unit/test_alignment.py +++ b/examples/egocap/tests/recording/unit/test_alignment.py @@ -302,67 +302,67 @@ def test_epoch_labels_for_an_unknown_source_are_refused(): simple(epochs={"ghost": np.zeros(3)}) -def stream(name, meaning="sensor_capture"): - return {"name": name, "timestamp_basis": "PUBLISHER_MONOTONIC_US", "time_meaning": meaning} +def event_time(**entries): + """A timing attribute shaped like the backend's, with per-source event-time entries.""" + return {"event_time": entries} + + +# What the backend records today: a sensor-capture camera qualified, a frame-ready camera and both tracking +# sources not. +REALISTIC = event_time( + cam_capture={"meaning": "sensor_capture", "qualified": True}, + cam_ready={"meaning": "frame_ready", "qualified": False}, + pico_controller={"meaning": "pose_evaluation_time", "qualified": False}, + manus_glove={"meaning": "host_push_time", "qualified": False}, +) -def timing(streams, physical="available: measurement time per sample"): - return { - "clock_mapping": {"streams": streams}, - "tracking_semantics": {"physical_alignment": physical}, +def test_only_sources_recorded_as_qualified_are_qualified(): + sources = ["cam_capture", "cam_ready", "pico_controller", "manus_glove", "unlisted"] + assert qualified_sources(REALISTIC, sources) == { + "cam_capture": True, + "cam_ready": False, + "pico_controller": False, + "manus_glove": False, + "unlisted": False, } -def test_camera_is_qualified_only_for_a_sensor_capture_stream(): - t = timing([stream("cam1"), stream("cam2", "frame_ready")]) - assert qualified_sources(t, ["cam1", "cam2", "cam3"], []) == {"cam1": True, "cam2": False, "cam3": False} +def test_the_result_has_exactly_the_requested_sources(): + assert qualified_sources(REALISTIC, []) == {} + assert list(qualified_sources(REALISTIC, ["manus_glove", "cam_capture"])) == ["manus_glove", "cam_capture"] -@pytest.mark.parametrize( - "entry", - [ - {"name": "cam", "timestamp_basis": "PUBLISHER_MONOTONIC_US"}, - {"name": "cam"}, - {"name": "cam", "time_meaning": None}, - {"name": "other"}, - "cam", - ], -) -def test_camera_with_missing_or_unqualified_evidence_is_false(entry): - assert qualified_sources(timing([entry]), ["cam"], []) == {"cam": False} +@pytest.mark.parametrize("qualified", [False, None, "true", "True", 1, 1.0, [True], {}]) +def test_a_qualified_value_that_is_not_literally_true_is_false(qualified): + assert qualified_sources(event_time(cam={"qualified": qualified}), ["cam"]) == {"cam": False} -def test_tracking_is_qualified_only_when_physical_alignment_is_available(): - sources = ["pico_controller", "manus_glove"] - assert qualified_sources(timing([], "available: x"), [], sources) == dict.fromkeys(sources, True) - assert qualified_sources(timing([], "unavailable: no time"), [], sources) == dict.fromkeys(sources, False) +def test_an_entry_without_a_qualified_key_is_false(): + assert qualified_sources(event_time(cam={"meaning": "sensor_capture"}), ["cam"]) == {"cam": False} -@pytest.mark.parametrize( - "t", - [ - None, - {}, - {"tracking_semantics": {}}, - {"tracking_semantics": {"physical_alignment": 3}}, - {"tracking_semantics": "available"}, - {"clock_mapping": {"streams": "cam"}, "tracking_semantics": []}, - {"clock_mapping": {"streams": 7}}, - {"clock_mapping": {"streams": {"name": "cam", "time_meaning": "sensor_capture"}}}, - {"clock_mapping": "cam"}, - {"clock_mapping": {}}, - ], -) -def test_malformed_timing_gives_false_and_never_raises(t): - assert qualified_sources(t, ["cam"], ["pico_controller"]) == {"cam": False, "pico_controller": False} +@pytest.mark.parametrize("entry", [None, True, "cam", 1, [("qualified", True)]]) +def test_an_entry_that_is_not_a_mapping_is_false(entry): + assert qualified_sources(event_time(cam=entry), ["cam"]) == {"cam": False} + + +@pytest.mark.parametrize("value", [None, [], "cam", 7, [{"qualified": True}], True]) +def test_an_event_time_that_is_not_a_mapping_gives_false(value): + assert qualified_sources({"event_time": value}, ["cam"]) == {"cam": False} -def test_backends_current_tracking_text_does_not_qualify_tracking(): - livekit_recording = pytest.importorskip("egocap_web.livekit_recording") - semantics = {"physical_alignment": livekit_recording._TRACKING_SEMANTICS["physical_alignment"]} - assert qualified_sources({"tracking_semantics": semantics}, [], ["pico_controller"]) == { - "pico_controller": False +@pytest.mark.parametrize("t", [None, {}, {"clock_mapping": {"streams": [{"name": "cam"}]}}]) +def test_timing_without_event_time_gives_false(t): + assert qualified_sources(t, ["cam"]) == {"cam": False} + + +def test_a_clock_mapping_or_physical_alignment_text_is_never_qualification(): + t = { + "clock_mapping": {"streams": [{"name": "cam", "time_meaning": "sensor_capture"}]}, + "tracking_semantics": {"physical_alignment": "available: measurement time per sample"}, } + assert qualified_sources(t, ["cam", "pico_controller"]) == {"cam": False, "pico_controller": False} def test_controller_poses_are_slerped_and_buttons_stay_raw(): @@ -524,3 +524,50 @@ def test_every_refused_source_is_reported_at_once(): } problems = check_continuity(evidence, ["a", "b", "c", "ok", "missing"]) assert [p.split(":")[0] for p in problems] == ["a", "b", "c", "missing"] + + +def test_missing_identity_is_incomplete(): + entry = clean() + del entry["identity"] + assert check_continuity({"cam": entry}, ["cam"]) == ["cam: continuity evidence is incomplete or malformed"] + + +@pytest.mark.parametrize("identity", [None, True, False, 1.5, [1]]) +def test_an_identity_that_is_not_a_str_or_int_is_incomplete(identity): + assert check_continuity({"cam": clean(identity=identity)}, ["cam"]) == [ + "cam: continuity evidence is incomplete or malformed" + ] + + +@pytest.mark.parametrize("identity", ["epoch-a", 0, 7]) +def test_str_and_int_identities_are_complete(identity): + assert check_continuity({"cam": clean(identity=identity)}, ["cam"]) == [] + + +def test_missing_breaks_is_incomplete(): + entry = clean() + del entry["breaks"] + assert check_continuity({"cam": entry}, ["cam"]) == ["cam: continuity evidence is incomplete or malformed"] + + +@pytest.mark.parametrize("breaks", [None, 0, (), (3,), "3", [True], [-1], [1.0], [2, "3"], [3, False]]) +def test_breaks_that_are_not_a_list_of_non_negative_ints_are_incomplete(breaks): + assert check_continuity({"cam": clean(breaks=breaks)}, ["cam"]) == [ + "cam: continuity evidence is incomplete or malformed" + ] + + +def test_a_break_beyond_the_written_rows_is_malformed(): + problems = check_continuity({"cam": clean(breaks=[10])}, ["cam"], rows={"cam": 10}) + assert problems == ["cam: continuity evidence is incomplete or malformed"] + + +def test_a_break_at_the_last_row_is_a_restart_not_malformed(): + problems = check_continuity({"cam": clean(breaks=[9])}, ["cam"], rows={"cam": 10}) + assert problems == ["cam: has a restart inside the episode (rows [9])"] + + +def test_rows_for_other_sources_do_not_bound_this_one(): + assert check_continuity({"cam": clean(breaks=[])}, ["cam"], rows={"other": 1}) == [] + problems = check_continuity({"cam": clean(breaks=[50])}, ["cam"], rows={"other": 1}) + assert problems == ["cam: has a restart inside the episode (rows [50])"] diff --git a/examples/egocap/tests/recording_service/test_continuity.py b/examples/egocap/tests/recording_service/test_continuity.py index 000eabaff2..34dd5122e4 100644 --- a/examples/egocap/tests/recording_service/test_continuity.py +++ b/examples/egocap/tests/recording_service/test_continuity.py @@ -245,3 +245,76 @@ async def test_an_episode_with_a_recorded_break_is_refused_and_writes_nothing(tm with pytest.raises(AlignedWriteError, match=r"cam: has a restart inside the episode \(rows \[3\]\)"): _align(session, tmp_path) assert not (tmp_path / "aligned").exists() + + +# --- malformed evidence is refused before any bookkeeping -------------------------------------------------- + + +def _video(i: int, continuity): + frame = np.zeros((48, 64, 3), dtype=np.uint8) + return VideoSample("cam", frame, PixelFormat.RGB8, float(i), float(i), np.eye(3), continuity) + + +MALFORMED = [ + [MAPPING, 1], + (MAPPING, 1, 2), + (MAPPING,), + (3, 1), + (MAPPING, True), + (MAPPING, 1.5), + (MAPPING, None), + "clock_mapping", +] + + +@pytest.mark.parametrize("bad", MALFORMED, ids=repr) +async def test_malformed_continuity_is_refused_and_changes_nothing(tmp_path, own, bad): + service = own(RecordingService(_config(tmp_path))) + session = await service.open_session() + episode = await service.start_episode("t") + eid = episode.episode_id + assert service.submit_sample(eid, _pose(0, (MAPPING, 1))).admission_index == 0 + take = service._take + accepted, queued = dict(take.accepted), list(take.queue) + evidence = json.dumps(take.continuity_record(), sort_keys=True) + + with pytest.raises(impl.ValidationError, match="continuity"): + service.submit_sample(eid, _pose(1, bad)) + + assert take.accepted == accepted and list(take.queue) == queued + assert json.dumps(take.continuity_record(), sort_keys=True) == evidence + # The next valid sample takes the index the rejected one would have taken. + assert service.submit_sample(eid, _pose(1, (MAPPING, 1))).admission_index == 1 + await service.stop_episode(eid) + assert _stored(session).continuity["pose"] == {"scope": MAPPING, "identity": 1, "breaks": [], "known": True} + + +async def test_malformed_continuity_on_the_first_row_leaves_the_source_unaccepted(tmp_path, own): + service = own(RecordingService(_config(tmp_path))) + await service.open_session() + episode = await service.start_episode("t") + with pytest.raises(impl.ValidationError, match="continuity"): + service.submit_sample(episode.episode_id, _pose(0, (MAPPING, 2.0))) + assert service._take.accepted["pose"] == 0 and not service._take.queue + assert service._take.continuity_record()["pose"]["known"] is False + assert service.submit_sample(episode.episode_id, _pose(0, (MAPPING, 2))).admission_index == 0 + + +def test_copy_keeps_the_continuity_of_a_numeric_sample(): + copied = RecordingService._copy(_pose(0, (MAPPING, "epoch-1"))) + assert isinstance(copied, NumericSample) and copied.continuity == (MAPPING, "epoch-1") + + +def test_copy_keeps_the_continuity_of_a_video_sample(): + copied = RecordingService._copy(_video(0, (MAPPING, 5))) + assert isinstance(copied, VideoSample) and copied.continuity == (MAPPING, 5) + + +async def test_the_queued_copy_carries_the_submitted_continuity(tmp_path, own): + service = own(RecordingService(_config(tmp_path))) + await service.open_session() + episode = await service.start_episode("t") + service.submit_sample(episode.episode_id, _pose(0, (MAPPING, 9))) + # No await since the submission, so the worker has not drained the queue yet. + (queued,) = service._take.queue + assert queued.continuity == (MAPPING, 9) From 304b0139445b8190a1567660b3e34179f33b4815 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:02:53 -0500 Subject: [PATCH 20/38] egocap: test the publication lock and the reader gap Covers concurrent publications of different episodes both landing complete, a second publisher waiting for the lock holder, a refused run creating nothing inside the aligned session, and the episode being absent but never partial between the two renames. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../unit/test_publish_aligned_episode.py | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py index 7ef929db68..70db4454ce 100644 --- a/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py +++ b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py @@ -2,10 +2,12 @@ # # SPDX-License-Identifier: Apache-2.0 +import fcntl import hashlib import json import os import shutil +import threading from pathlib import Path import numpy as np @@ -428,3 +430,96 @@ def fail_in_validation(session, episode, index_source): assert seen["staged"] assert not (tmp_path / ".aligned.staging").exists() assert listing(aligned) == before + + +def test_concurrent_publications_of_different_episodes_both_land_complete(tmp_path, raw): + aligned = tmp_path / "aligned" + errors = [] + + def run(episode): + try: + publish(raw, aligned, episode, downsample=2) + except BaseException as exc: # reported below, on the main thread + errors.append(exc) + + threads = [threading.Thread(target=run, args=(episode,)) for episode in (0, 1)] + for t in threads: + t.start() + for t in threads: + t.join(timeout=120) + assert errors == [] + + reference(raw, tmp_path / "ref", 0, downsample=2) + reference(raw, tmp_path / "ref", 1, downsample=2) + assert_snapshots_equal(snapshot(aligned), snapshot(tmp_path / "ref")) + for episode in (0, 1): + assert validate_aligned_episode(aligned, episode, INDEX) == [] + assert_no_leftovers(aligned) + # The lock file is beside the aligned session, not inside it. + assert (tmp_path / ".aligned.lock").is_file() + assert not list(aligned.glob("*.lock")) + + +def test_a_second_publisher_waits_for_the_lock_holder(tmp_path, raw): + aligned = tmp_path / "aligned" + done = threading.Event() + + def run(): + publish(raw, aligned, 0) + done.set() + + with open(tmp_path / ".aligned.lock", "a") as lock: + fcntl.flock(lock, fcntl.LOCK_EX) + thread = threading.Thread(target=run) + thread.start() + # Blocked on the lock: nothing finishes and nothing is written. + assert not done.wait(1.0) + assert not aligned.exists() + fcntl.flock(lock, fcntl.LOCK_UN) + assert done.wait(60) + thread.join() + assert validate_aligned_episode(aligned, 0, INDEX) == [] + assert_no_leftovers(aligned) + + +def test_a_refused_run_creates_nothing_inside_the_aligned_session(tmp_path, raw): + aligned = tmp_path / "aligned" + publish(raw, aligned, 1) + before = listing(aligned) + with pytest.raises(AlignedWriteError): + publish(raw, aligned, 0, continuity=None) + assert listing(aligned) == before + # Only the lock file may be added beside it, and a never-created session stays absent. + with pytest.raises(AlignedWriteError): + publish(raw, tmp_path / "fresh", 0, continuity=None) + assert not (tmp_path / "fresh").exists() + assert not (tmp_path / ".fresh.staging").exists() + + +def test_between_the_renames_the_episode_is_absent_never_partial(tmp_path, raw, monkeypatch): + aligned = tmp_path / "aligned" + publish(raw, aligned, 0) + old_files = listing(aligned / "episode_0") + seen = [] + + class Inspecting(FailingOs): + def replace(self, source, target): + self.calls += 1 + if self.calls == 2: + # Old episode already moved aside whole; the new one is complete in staging, not yet visible. + seen.append( + ( + (aligned / "episode_0").exists(), + listing(aligned / ".episode_0.replaced") == old_files, + validate_aligned_episode(tmp_path / ".aligned.staging", 0, INDEX), + ) + ) + return os.replace(source, target) + + monkeypatch.setattr(aligned_writer, "os", Inspecting(0)) + publish(raw, aligned, 0, downsample=2) + monkeypatch.undo() + + assert seen == [(False, True, [])] + assert validate_aligned_episode(aligned, 0, INDEX) == [] + assert_no_leftovers(aligned) From 4002e2b7577cd168453bd846dcf4624a0ce84862 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:03:40 -0500 Subject: [PATCH 21/38] egocap: test aligning a kept episode and the align command Covers align_kept_episode publishing beside the raw session or to an explicit session, the downsample passed through, refusals for missing or non-literal qualification evidence and for missing or broken continuity (nothing created, raw untouched), and the command's exit status and messages, its manifest-session, aligned-session and downsample options and its argument errors. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../recording/unit/test_align_kept_episode.py | 245 ++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 examples/egocap/tests/recording/unit/test_align_kept_episode.py diff --git a/examples/egocap/tests/recording/unit/test_align_kept_episode.py b/examples/egocap/tests/recording/unit/test_align_kept_episode.py new file mode 100644 index 0000000000..18484897cd --- /dev/null +++ b/examples/egocap/tests/recording/unit/test_align_kept_episode.py @@ -0,0 +1,245 @@ +# SPDX-FileCopyrightText: 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +import hashlib +import json +import shutil +import sys +from pathlib import Path + +import numpy as np +import pytest +import zarr + +from egocap.recording.aligned_writer import AlignedWriteError, align_kept_episode, publish_aligned_episode +from egocap.recording.episode_layout import EpisodeManifest, episode_dir_names, manifest_path, write_manifest + +FIXTURES = Path(__file__).resolve().parent.parent / "fixtures" / "aligned_writer" +META = json.loads((FIXTURES / "scenarios.json").read_text()) +INDEX = META["index_source"] +SOURCES = ("head_camera", "wrist_camera", "pico_controller", "glove") +CAMERAS = ("head_camera", "wrist_camera") +TOOLS = Path(__file__).resolve().parents[3] / "recording" / "tools" + + +def clean_continuity(): + return {name: {"scope": "clock_mapping", "identity": 0, "breaks": [], "known": True} for name in SOURCES} + + +def good_timing(): + return {"event_time": {name: {"meaning": "capture", "qualified": True} for name in SOURCES}} + + +def build_raw(root, timing="default"): + """A raw session in the recording service's layout, with the episode's ``timing`` attribute set.""" + scenario = META["scenarios"]["basic_ds1"] + root.mkdir(parents=True) + group = zarr.open_group(str(root), mode="w") + for key, value in scenario["raw_attrs"].items(): + group.attrs[key] = value + with np.load(FIXTURES / "raw_inputs.npz") as inputs: + arrays = {k: inputs[k] for k in inputs.files} + for episode in (0, 1): + episode_group = group.require_group(f"episode_{episode}") + for key, value in META["episode_attrs"].items(): + episode_group.attrs[key] = value + if timing == "default": + episode_group.attrs["timing"] = good_timing() + elif timing is not None: + episode_group.attrs["timing"] = timing + for key, array in arrays.items(): + tag, source, name = key.split("__") + if tag != f"e{episode}": + continue + source_group = episode_group.require_group(source) + for attr, value in META["source_attrs"].get(source, {}).items(): + source_group.attrs[attr] = value + source_group[name] = array + for camera in CAMERAS: + (root / f"episode_{episode}" / f"{camera}.mp4").write_bytes(f"video {camera} {episode} ".encode() * 16) + shutil.copy2(FIXTURES / "config.yaml", root / "config.yaml") + for name in scenario["sidecars"]: + shutil.copy2(FIXTURES / name, root / name) + + +def store_manifest(session, index=0): + pending, final = episode_dir_names(index) + write_manifest( + session, + EpisodeManifest( + session_id="s", + episode_id=f"e{index}", + episode_index=index, + config_digest="d", + task="t", + operator="o", + sources=[], + pending_path=pending, + final_path=final, + continuity=clean_continuity(), + ), + ) + + +def snapshot(root): + """Files by hash plus every zarr array's contents.""" + entries = {} + for path in sorted(root.rglob("*")): + if path.is_file(): + entries[path.relative_to(root).as_posix()] = hashlib.sha256(path.read_bytes()).hexdigest() + group = zarr.open_group(str(root), mode="r") + for episode in sorted(group.group_keys()): + for source in sorted(group[episode].group_keys()): + for name in sorted(group[episode][source].array_keys()): + entries[f"{episode}/{source}/{name}"] = group[episode][source][name][:].tobytes() + return entries + + +def tree_files(root): + return sorted(p.relative_to(root).as_posix() for p in root.rglob("*")) + + +@pytest.fixture +def raw(tmp_path): + build_raw(tmp_path / "raw") + return tmp_path / "raw" + + +def test_success_publishes_beside_the_raw_session_and_equals_publish(tmp_path, raw): + got = align_kept_episode(raw, 0, INDEX, clean_continuity()) + publish_aligned_episode( + raw, + tmp_path / "ref", + 0, + INDEX, + qualified=dict.fromkeys(SOURCES, True), + continuity=clean_continuity(), + ) + aligned = tmp_path / "raw_aligned" + assert aligned.is_dir() + assert snapshot(aligned) == snapshot(tmp_path / "ref") + assert got.valid_indices.any() + + +def test_explicit_aligned_session_is_used(tmp_path, raw): + target = tmp_path / "elsewhere" + align_kept_episode(raw, 0, INDEX, clean_continuity(), aligned_session=target) + assert (target / "episode_0").is_dir() + assert not (tmp_path / "raw_aligned").exists() + + +def test_downsample_is_passed_through(tmp_path, raw): + full = align_kept_episode(raw, 0, INDEX, clean_continuity(), aligned_session=tmp_path / "a") + half = align_kept_episode(raw, 0, INDEX, clean_continuity(), aligned_session=tmp_path / "b", downsample=2) + assert 0 < int(half.valid_indices.sum()) < int(full.valid_indices.sum()) + + +def bad_timings(): + event = good_timing()["event_time"] + return { + "missing": (None, SOURCES), + "no_event_time": ({}, SOURCES), + "source_absent": ({"event_time": {k: v for k, v in event.items() if k != "glove"}}, ("glove",)), + "false": ({"event_time": {**event, "glove": {"qualified": False}}}, ("glove",)), + "string_true": ({"event_time": {**event, "glove": {"qualified": "true"}}}, ("glove",)), + } + + +@pytest.mark.parametrize("case", sorted(bad_timings())) +def test_unqualified_timing_is_refused_and_nothing_is_written(tmp_path, case): + timing, unqualified = bad_timings()[case] + build_raw(tmp_path / "raw", timing=timing) + before = snapshot(tmp_path / "raw") + with pytest.raises(AlignedWriteError, match="qualified") as info: + align_kept_episode(tmp_path / "raw", 0, INDEX, clean_continuity()) + for name in unqualified: + assert name in str(info.value) + assert not (tmp_path / "raw_aligned").exists() + assert snapshot(tmp_path / "raw") == before + + +def test_missing_continuity_is_refused(tmp_path, raw): + with pytest.raises(AlignedWriteError): + align_kept_episode(raw, 0, INDEX, None) + assert not (tmp_path / "raw_aligned").exists() + + +def test_a_continuity_break_is_refused(tmp_path, raw): + continuity = clean_continuity() + continuity["glove"]["breaks"] = [1] + with pytest.raises(AlignedWriteError): + align_kept_episode(raw, 0, INDEX, continuity) + assert not (tmp_path / "raw_aligned").exists() + + +# The CLI lives in tools/, which is not a package. +sys.path.insert(0, str(TOOLS)) +import align_episode # noqa: E402 + + +def run_cli(*args): + return align_episode.main([str(a) for a in args]) + + +def test_cli_success_prints_the_kept_count(tmp_path, raw, capsys): + store_manifest(raw) + assert run_cli(raw, "--episode", 0, "--index-source", INDEX) == 0 + out = capsys.readouterr().out + assert out.startswith("aligned episode_0: ") and " of " in out + assert (tmp_path / "raw_aligned" / "episode_0").is_dir() + + +def test_cli_missing_manifest_exits_1(raw, capsys): + assert run_cli(raw, "--episode", 0, "--index-source", INDEX) == 1 + assert "cannot read the episode's manifest" in capsys.readouterr().err + + +def test_cli_garbage_manifest_exits_1(raw, capsys): + path = manifest_path(raw, 0) + path.parent.mkdir() + path.write_text("{not json") + assert run_cli(raw, "--episode", 0, "--index-source", INDEX) == 1 + assert "cannot read the episode's manifest" in capsys.readouterr().err + + +def test_cli_refused_episode_exits_1(tmp_path, capsys): + build_raw(tmp_path / "raw", timing=None) + store_manifest(tmp_path / "raw") + assert run_cli(tmp_path / "raw", "--episode", 0, "--index-source", INDEX) == 1 + assert "not aligned:" in capsys.readouterr().err + assert not (tmp_path / "raw_aligned").exists() + + +def test_cli_manifest_session_option(tmp_path, raw, capsys): + other = tmp_path / "other" + other.mkdir() + store_manifest(other) + assert run_cli(raw, "--episode", 0, "--index-source", INDEX, "--manifest-session", other) == 0 + assert "aligned episode_0" in capsys.readouterr().out + + +def test_cli_aligned_session_and_downsample_are_honoured(tmp_path, raw, capsys): + store_manifest(raw) + run_cli(raw, "--episode", 0, "--index-source", INDEX, "--aligned-session", tmp_path / "x") + full = capsys.readouterr().out + assert ( + run_cli( + raw, "--episode", 0, "--index-source", INDEX, "--aligned-session", tmp_path / "y", "--downsample", 2 + ) + == 0 + ) + half = capsys.readouterr().out + + def kept(line): + return int(line.split(": ")[1].split(" of ")[0]) + + assert (tmp_path / "x" / "episode_0").is_dir() and (tmp_path / "y" / "episode_0").is_dir() + assert not (tmp_path / "raw_aligned").exists() + assert kept(half) < kept(full) + + +def test_cli_missing_episode_is_an_argument_error(raw): + with pytest.raises(SystemExit) as info: + run_cli(raw, "--index-source", INDEX) + assert info.value.code == 2 From 40de8bc31897d8a0a1a2ea8a55f405443dde78e6 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:11:51 -0500 Subject: [PATCH 22/38] egocap: bind the stored evidence to the exact kept episode before aligning align_kept_episode now takes the episode's manifest and refuses unless the episode directory carries that manifest's episode id, the take is finalized and kept, the written rows match the sealed counts, and the location is the manifest's: its routed slot and group stamp when routed, its own index otherwise. The align command can name the manifest's episode index separately for a routed episode. A matching integer in a file name is never taken as identity. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../egocap/recording/aligned_writer.py | 64 ++++++++++++++++++- .../egocap/recording/tools/align_episode.py | 14 +++- 2 files changed, 72 insertions(+), 6 deletions(-) diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index eb6442dfa7..d7d52000fd 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -18,6 +18,7 @@ from __future__ import annotations import fcntl +import json import os import shutil from collections.abc import Mapping @@ -29,11 +30,19 @@ import zarr from .alignment import AlignedEpisode, align_episode, check_continuity, qualified_sources, source_rules +from .episode_layout import ( + FINALIZATION_KEEP, + ROUTE_ATTR, + EpisodeManifest, + read_identity, + route_id, +) __all__ = [ "ALIGNED_SESSION_SIDECARS", "AlignedWriteError", "align_kept_episode", + "check_kept_episode", "publish_aligned_episode", "validate_aligned_episode", "write_aligned_episode", @@ -326,21 +335,70 @@ def _publish_locked( return aligned +def check_kept_episode(raw_session: Path, episode_index: int, manifest: EpisodeManifest) -> list[str]: + """Why ``manifest`` is not the record of the finalized, kept episode at ``raw_session/episode_``. + + The stored evidence is trusted only for the exact episode it describes, so this binds them: the episode's + own stamp must name the manifest's episode, the take must be finalized and kept, the written row counts must + match the manifest's, and the location must be the manifest's: its routed slot and group when it was routed, + its own index otherwise. A matching integer in a file name is never taken as identity. Empty means it is. + """ + problems: list[str] = [] + episode_dir = raw_session / f"episode_{episode_index}" + # The episode directory carries the id of the episode that owns it. + if read_identity(episode_dir) != manifest.episode_id: + problems.append("the episode directory is not the one this manifest describes (episode id differs)") + # Only a finalized take whose disposition was to keep its data is a kept episode. + if manifest.storage_phase != "FINALIZED" or manifest.finalization != FINALIZATION_KEEP: + problems.append( + f"the manifest is not a finalized kept episode ({manifest.storage_phase}, {manifest.finalization})" + ) + if manifest.assignment is not None: + # A routed episode sits in its group under its slot, which need not equal its recording index. + group = manifest.assignment["group"] + stamp = _attribute(raw_session / "zarr.json", ROUTE_ATTR) + if episode_index != manifest.assignment["slot"] or stamp != route_id(manifest.session_id, group): + problems.append("the episode is not at the routed location the manifest records") + elif episode_index != manifest.episode_index: + problems.append("the episode index is not the manifest's") + # The written rows must be exactly the rows the manifest sealed. + try: + episode = zarr.open_group(str(episode_dir), mode="r") + for name, count in manifest.counts.items(): + if name in episode and len(episode[name]["capture_time"]) != count.get("written"): + problems.append(f"{name}: the rows on disk differ from the sealed count") + except (OSError, zarr.errors.GroupNotFoundError) as exc: + problems.append(f"the episode cannot be read: {exc}") + return problems + + +def _attribute(metadata_file: Path, name: str) -> Any: + """One attribute of a zarr group's metadata file, or None when the file or the attribute is absent.""" + try: + return json.loads(metadata_file.read_text(encoding="utf-8")).get("attributes", {}).get(name) + except (OSError, json.JSONDecodeError): + return None + + def align_kept_episode( raw_session: Path, episode_index: int, index_source: str, - continuity: Mapping[str, Mapping[str, object]] | None, + manifest: EpisodeManifest, *, aligned_session: Path | None = None, downsample: int = 1, ) -> AlignedEpisode: """Align one kept episode from what the recorder stored about it, and publish the result. - ``continuity`` is the episode manifest's evidence. Which sources have a qualified event time is read from the + ``manifest`` must be the record of exactly this finalized, kept episode (see :func:`check_kept_episode`); + its continuity evidence is used only then. Which sources have a qualified event time is read from the episode's own ``timing`` attribute, so an episode recorded without that evidence is refused, never assumed qualified. The aligned session defaults to ``_aligned`` beside the raw one. """ + problems = check_kept_episode(raw_session, episode_index, manifest) + if problems: + raise AlignedWriteError("; ".join(problems)) config = yaml.safe_load((raw_session / "config.yaml").read_text(encoding="utf-8")) or {} declared = [e["name"] for section in ("video_sources", "numeric_sources") for e in config.get(section) or []] timing = dict(zarr.open_group(str(raw_session / f"episode_{episode_index}"), mode="r").attrs).get("timing") @@ -351,5 +409,5 @@ def align_kept_episode( index_source, downsample=downsample, qualified=qualified_sources(timing, declared), - continuity=continuity, + continuity=manifest.continuity, ) diff --git a/examples/egocap/recording/tools/align_episode.py b/examples/egocap/recording/tools/align_episode.py index 2e164d032b..8e9048fb62 100755 --- a/examples/egocap/recording/tools/align_episode.py +++ b/examples/egocap/recording/tools/align_episode.py @@ -16,7 +16,9 @@ [--manifest-session DIR] [--aligned-session DIR] [--downsample K] ``--manifest-session`` is where the episode's manifest lives when that is not ``SESSION_DIR`` (a routed -episode's manifest stays in the session it was recorded in). Exit status 0 means the aligned episode was +episode's manifest stays in the session it was recorded in), and ``--manifest-episode`` its index there when that +differs from ``--episode`` (a routed episode sits under its slot). The manifest is used only if it describes +exactly this finalized, kept episode. Exit status 0 means the aligned episode was published; 1 means it was refused or failed, with the reason on stderr. """ @@ -36,13 +38,19 @@ def main(argv: list[str] | None = None) -> int: parser.add_argument("--episode", type=int, required=True, help="the episode's index in that directory") parser.add_argument("--index-source", required=True, help="the camera whose frames define the timeline") parser.add_argument("--manifest-session", type=Path, help="the session whose manifest describes the episode") + parser.add_argument( + "--manifest-episode", + type=int, + help="the episode's index in that session's manifests, when it differs from --episode (a routed episode)", + ) parser.add_argument("--aligned-session", type=Path, help="where to publish (default: _aligned)") parser.add_argument("--downsample", type=int, default=1, help="keep every K-th index frame (default 1)") args = parser.parse_args(argv) # The manifest carries the continuity evidence; without a readable one the episode cannot be vouched for. try: - manifest = read_manifest(manifest_path(args.manifest_session or args.session, args.episode)) + manifest_episode = args.episode if args.manifest_episode is None else args.manifest_episode + manifest = read_manifest(manifest_path(args.manifest_session or args.session, manifest_episode)) except (OSError, ValueError) as exc: print(f"cannot read the episode's manifest: {exc}", file=sys.stderr) return 1 @@ -51,7 +59,7 @@ def main(argv: list[str] | None = None) -> int: args.session, args.episode, args.index_source, - manifest.continuity, + manifest, aligned_session=args.aligned_session, downsample=args.downsample, ) From 32b19782f7bc844d70321dcaae5741502fd934bf Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:12:41 -0500 Subject: [PATCH 23/38] egocap: test the aligned tree against the reading pattern its consumers use Builds a raw session with real videos and non-empty root attributes, writes the aligned tree, and checks what a reader of aligned data relies on: the root index source and carried-over attributes, a boolean valid_indices, strictly increasing valid_timestamps, one row per timestamp in every resampled field with no raw twin kept, and per-camera frame indices within the video's frame count. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../unit/test_aligned_reader_contract.py | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 examples/egocap/tests/recording/unit/test_aligned_reader_contract.py diff --git a/examples/egocap/tests/recording/unit/test_aligned_reader_contract.py b/examples/egocap/tests/recording/unit/test_aligned_reader_contract.py new file mode 100644 index 0000000000..096698ae2c --- /dev/null +++ b/examples/egocap/tests/recording/unit/test_aligned_reader_contract.py @@ -0,0 +1,108 @@ +# SPDX-FileCopyrightText: 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +# The read pattern of a downstream consumer of an aligned session, re-implemented here from its description: +# open the aligned root; per episode read the boolean ``valid_indices`` and ``valid_timestamps``; per source +# read every ``_interp`` array (one row per aligned timestamp) and, for each camera, the integer +# ``aligned_frame_indices`` (also one per aligned timestamp) that select frames of the ``.mp4`` stored +# beside the arrays; the root attribute ``index_source`` names the camera whose frames define the timeline. + +import json +import shutil +from pathlib import Path + +import cv2 +import numpy as np +import pytest +import zarr + +from egocap.recording.aligned_writer import write_aligned_episode + +FIXTURES = Path(__file__).resolve().parent.parent / "fixtures" / "aligned_writer" +META = json.loads((FIXTURES / "scenarios.json").read_text()) +INDEX = META["index_source"] +CAMERAS = ("head_camera", "wrist_camera") +QUALIFIED = dict.fromkeys((*CAMERAS, "pico_controller", "glove"), True) +CONTINUITY = {name: {"scope": "clock_mapping", "identity": 0, "breaks": [], "known": True} for name in QUALIFIED} +RAW_ATTRS = {"task_description": "pick and place", "operator": {"id": 7, "tags": ["a", "b"]}} + + +def build_raw(root): + """A raw session with non-empty root attributes and real videos, one frame per recorded camera sample.""" + group = zarr.open_group(str(root), mode="w") + for key, value in RAW_ATTRS.items(): + group.attrs[key] = value + with np.load(FIXTURES / "raw_inputs.npz") as inputs: + arrays = {k: inputs[k] for k in inputs.files} + for episode in (0, 1): + episode_group = group.require_group(f"episode_{episode}") + for key, value in META["episode_attrs"].items(): + episode_group.attrs[key] = value + for key, array in arrays.items(): + tag, source, name = key.split("__") + if tag == f"e{episode}": + episode_group.require_group(source)[name] = array + for camera in CAMERAS: + frames = len(episode_group[camera]["capture_time"][:]) + writer = cv2.VideoWriter( + str(root / f"episode_{episode}" / f"{camera}.mp4"), cv2.VideoWriter_fourcc(*"mp4v"), 30, (64, 48) + ) + for _ in range(frames): + writer.write(np.zeros((48, 64, 3), np.uint8)) + writer.release() + shutil.copy2(FIXTURES / "config.yaml", root / "config.yaml") + + +def video_frame_count(path): + capture = cv2.VideoCapture(str(path)) + try: + return int(capture.get(cv2.CAP_PROP_FRAME_COUNT)) + finally: + capture.release() + + +@pytest.fixture(scope="module") +def aligned(tmp_path_factory): + base = tmp_path_factory.mktemp("session") + build_raw(base / "raw") + for episode in (0, 1): + write_aligned_episode( + base / "raw", base / "aligned", episode, INDEX, qualified=QUALIFIED, continuity=CONTINUITY + ) + return base / "aligned" + + +@pytest.mark.parametrize("episode", [0, 1]) +def test_a_consumer_reads_the_aligned_episode_by_array_name(aligned, episode): + root = zarr.open_group(str(aligned), mode="r") + assert root.attrs["index_source"] == INDEX + # The raw root's own attributes are carried over beside the index source. + assert {k: root.attrs[k] for k in RAW_ATTRS} == RAW_ATTRS + + group = root[f"episode_{episode}"] + valid_indices = np.asarray(group["valid_indices"]) + timestamps = np.asarray(group["valid_timestamps"]) + assert valid_indices.dtype == np.bool_ + assert timestamps.ndim == 1 and np.all(np.diff(timestamps) > 0) + rows = timestamps.shape[0] + + interp_seen = 0 + for source in group.group_keys(): + for name in group[source].array_keys(): + if name.endswith("_interp"): + interp_seen += 1 + assert np.asarray(group[source][name]).shape[0] == rows, (source, name) + # A resampled field is read under its ``_interp`` name only. + assert name[: -len("_interp")] not in group[source], (source, name) + assert interp_seen + + for camera in CAMERAS: + indices = np.asarray(group[camera]["aligned_frame_indices"]) + assert np.issubdtype(indices.dtype, np.integer) and indices.shape == (rows,) + video = aligned / f"episode_{episode}" / f"{camera}.mp4" + assert video.is_file() + assert indices.min() >= 0 and indices.max() < video_frame_count(video) + # The index camera plays every frame of the valid range once, in order. + index_frames = np.asarray(group[INDEX]["aligned_frame_indices"]) + assert np.array_equal(np.diff(index_frames), np.ones(rows - 1, dtype=index_frames.dtype)) From 18e4858bb8afaf4158afd175bfa0cd0f21cb905c Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:16:47 -0500 Subject: [PATCH 24/38] egocap: read a source's written row count from the array shape check_kept_episode took len() of a zarr array, which zarr 3 does not define, so every kept-episode alignment with a counted source raised TypeError. Use the shape, as the dataset reader does. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/recording/egocap/recording/aligned_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index d7d52000fd..99056a6542 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -365,7 +365,7 @@ def check_kept_episode(raw_session: Path, episode_index: int, manifest: EpisodeM try: episode = zarr.open_group(str(episode_dir), mode="r") for name, count in manifest.counts.items(): - if name in episode and len(episode[name]["capture_time"]) != count.get("written"): + if name in episode and int(episode[name]["capture_time"].shape[0]) != count.get("written"): problems.append(f"{name}: the rows on disk differ from the sealed count") except (OSError, zarr.errors.GroupNotFoundError) as exc: problems.append(f"the episode cannot be read: {exc}") From b892e07c964f0a8ec626938daf8d7a730bfa46c7 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:16:47 -0500 Subject: [PATCH 25/38] egocap: test that the stored evidence is bound to the exact kept episode Covers a manifest of another episode with the same index (and an unstamped episode) refused before any output, non-finalized and non-kept manifests, written counts that differ from the sealed counts, an unrouted index mismatch, an unreadable episode, routed success with a slot that differs from the recording index, routed refusals (wrong slot, missing or foreign route stamp, indexing by the recording index) and the command's --manifest-episode option. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../recording/unit/test_align_kept_episode.py | 231 ++++++++++++++++-- 1 file changed, 205 insertions(+), 26 deletions(-) diff --git a/examples/egocap/tests/recording/unit/test_align_kept_episode.py b/examples/egocap/tests/recording/unit/test_align_kept_episode.py index 18484897cd..e53c176020 100644 --- a/examples/egocap/tests/recording/unit/test_align_kept_episode.py +++ b/examples/egocap/tests/recording/unit/test_align_kept_episode.py @@ -12,8 +12,22 @@ import pytest import zarr -from egocap.recording.aligned_writer import AlignedWriteError, align_kept_episode, publish_aligned_episode -from egocap.recording.episode_layout import EpisodeManifest, episode_dir_names, manifest_path, write_manifest +from egocap.recording.aligned_writer import ( + AlignedWriteError, + align_kept_episode, + check_kept_episode, + publish_aligned_episode, +) +from egocap.recording.episode_layout import ( + FINALIZATION_KEEP, + IDENTITY_ATTR, + ROUTE_ATTR, + EpisodeManifest, + episode_dir_names, + manifest_path, + route_id, + write_manifest, +) FIXTURES = Path(__file__).resolve().parent.parent / "fixtures" / "aligned_writer" META = json.loads((FIXTURES / "scenarios.json").read_text()) @@ -42,6 +56,7 @@ def build_raw(root, timing="default"): arrays = {k: inputs[k] for k in inputs.files} for episode in (0, 1): episode_group = group.require_group(f"episode_{episode}") + episode_group.attrs[IDENTITY_ATTR] = f"e{episode}" for key, value in META["episode_attrs"].items(): episode_group.attrs[key] = value if timing == "default": @@ -63,23 +78,37 @@ def build_raw(root, timing="default"): shutil.copy2(FIXTURES / name, root / name) -def store_manifest(session, index=0): +def written_counts(root, index=0): + """The row counts the recorder would have sealed: what is really on disk for the episode.""" + episode = zarr.open_group(str(root / f"episode_{index}"), mode="r") + rows = {name: int(episode[name]["capture_time"].shape[0]) for name in episode.group_keys()} + return {name: {"accepted": n, "written": n} for name, n in rows.items()} + + +def make_manifest(root, index=0, **overrides): + """A finalized, kept manifest of the unrouted episode ``index`` whose counts match the rows on disk.""" pending, final = episode_dir_names(index) - write_manifest( - session, - EpisodeManifest( - session_id="s", - episode_id=f"e{index}", - episode_index=index, - config_digest="d", - task="t", - operator="o", - sources=[], - pending_path=pending, - final_path=final, - continuity=clean_continuity(), - ), - ) + fields = { + "session_id": "s", + "episode_id": f"e{index}", + "episode_index": index, + "config_digest": "d", + "task": "t", + "operator": "o", + "sources": [], + "pending_path": pending, + "final_path": final, + "continuity": clean_continuity(), + "storage_phase": "FINALIZED", + "finalization": FINALIZATION_KEEP, + "counts": written_counts(root, index), + } + fields.update(overrides) + return EpisodeManifest(**fields) + + +def store_manifest(session, index=0, root=None): + write_manifest(session, make_manifest(root or session, index)) def snapshot(root): @@ -107,7 +136,7 @@ def raw(tmp_path): def test_success_publishes_beside_the_raw_session_and_equals_publish(tmp_path, raw): - got = align_kept_episode(raw, 0, INDEX, clean_continuity()) + got = align_kept_episode(raw, 0, INDEX, make_manifest(raw)) publish_aligned_episode( raw, tmp_path / "ref", @@ -124,14 +153,14 @@ def test_success_publishes_beside_the_raw_session_and_equals_publish(tmp_path, r def test_explicit_aligned_session_is_used(tmp_path, raw): target = tmp_path / "elsewhere" - align_kept_episode(raw, 0, INDEX, clean_continuity(), aligned_session=target) + align_kept_episode(raw, 0, INDEX, make_manifest(raw), aligned_session=target) assert (target / "episode_0").is_dir() assert not (tmp_path / "raw_aligned").exists() def test_downsample_is_passed_through(tmp_path, raw): - full = align_kept_episode(raw, 0, INDEX, clean_continuity(), aligned_session=tmp_path / "a") - half = align_kept_episode(raw, 0, INDEX, clean_continuity(), aligned_session=tmp_path / "b", downsample=2) + full = align_kept_episode(raw, 0, INDEX, make_manifest(raw), aligned_session=tmp_path / "a") + half = align_kept_episode(raw, 0, INDEX, make_manifest(raw), aligned_session=tmp_path / "b", downsample=2) assert 0 < int(half.valid_indices.sum()) < int(full.valid_indices.sum()) @@ -152,7 +181,7 @@ def test_unqualified_timing_is_refused_and_nothing_is_written(tmp_path, case): build_raw(tmp_path / "raw", timing=timing) before = snapshot(tmp_path / "raw") with pytest.raises(AlignedWriteError, match="qualified") as info: - align_kept_episode(tmp_path / "raw", 0, INDEX, clean_continuity()) + align_kept_episode(tmp_path / "raw", 0, INDEX, make_manifest(tmp_path / "raw")) for name in unqualified: assert name in str(info.value) assert not (tmp_path / "raw_aligned").exists() @@ -161,7 +190,7 @@ def test_unqualified_timing_is_refused_and_nothing_is_written(tmp_path, case): def test_missing_continuity_is_refused(tmp_path, raw): with pytest.raises(AlignedWriteError): - align_kept_episode(raw, 0, INDEX, None) + align_kept_episode(raw, 0, INDEX, make_manifest(raw, continuity=None)) assert not (tmp_path / "raw_aligned").exists() @@ -169,10 +198,132 @@ def test_a_continuity_break_is_refused(tmp_path, raw): continuity = clean_continuity() continuity["glove"]["breaks"] = [1] with pytest.raises(AlignedWriteError): - align_kept_episode(raw, 0, INDEX, continuity) + align_kept_episode(raw, 0, INDEX, make_manifest(raw, continuity=continuity)) assert not (tmp_path / "raw_aligned").exists() +def refused(tmp_path, raw, manifest, index=0, match=None): + """Align is refused before any output and leaves the raw session untouched.""" + before = snapshot(raw) + with pytest.raises(AlignedWriteError, match=match): + align_kept_episode(raw, index, INDEX, manifest) + assert not (tmp_path / "raw_aligned").exists() + assert snapshot(raw) == before + + +def test_another_episodes_manifest_with_the_same_index_is_refused(tmp_path, raw): + other = make_manifest(raw, episode_id="someone-else") + refused(tmp_path, raw, other, match="episode id differs") + + +def test_an_episode_without_an_identity_stamp_is_refused(tmp_path, raw): + zarr.open_group(str(raw / "episode_0"), mode="r+").attrs.pop(IDENTITY_ATTR) + refused(tmp_path, raw, make_manifest(raw), match="episode id differs") + + +@pytest.mark.parametrize( + ("phase", "finalization"), + [ + ("WRITING", FINALIZATION_KEEP), + ("SEALED", FINALIZATION_KEEP), + ("CHECKED", FINALIZATION_KEEP), + ("FINALIZED", "REMOVE"), + ("FINALIZED", "RETAIN"), + ("FINALIZED", None), + ], +) +def test_a_manifest_that_is_not_a_finalized_kept_episode_is_refused(tmp_path, raw, phase, finalization): + manifest = make_manifest(raw, storage_phase=phase, finalization=finalization) + refused(tmp_path, raw, manifest, match="not a finalized kept episode") + + +@pytest.mark.parametrize("delta", [1, -1]) +def test_a_written_count_that_differs_from_the_disk_is_refused(tmp_path, raw, delta): + manifest = make_manifest(raw) + manifest.counts["glove"]["written"] += delta + refused(tmp_path, raw, manifest, match="glove: the rows on disk differ") + + +def test_a_counted_source_absent_from_the_episode_is_not_a_problem(raw): + manifest = make_manifest(raw) + manifest.counts["not_recorded"] = {"accepted": 3, "written": 3} + assert check_kept_episode(raw, 0, manifest) == [] + + +def test_an_unrouted_index_mismatch_is_refused(tmp_path, raw): + manifest = make_manifest(raw, episode_index=1) + refused(tmp_path, raw, manifest, match="episode index is not the manifest's") + + +def test_an_unreadable_episode_is_a_problem_not_an_exception(raw): + problems = check_kept_episode(raw, 7, make_manifest(raw)) + assert any("cannot be read" in p for p in problems) + assert any("episode id differs" in p for p in problems) + + +def test_a_missing_manifest_attribute_file_reads_as_no_stamp(tmp_path): + # Malformed route metadata (not JSON) is the same as no stamp. + build_raw(tmp_path / "raw") + manifest = make_manifest(tmp_path / "raw", assignment={"group": "Studio/20260101", "slot": 0}, session_id="s") + (tmp_path / "raw" / "zarr.json").write_text("{not json") + problems = check_kept_episode(tmp_path / "raw", 0, manifest) + assert "the episode is not at the routed location the manifest records" in problems + + +GROUP = "Studio/20260101-000000" + + +def build_routed(tmp_path, slot=3, stamp="own"): + """A routed layout: the group directory is the raw session, its episode sits under ``slot``. + + The manifest is indexed by the recording index (5), which differs from the slot. + """ + build_raw(tmp_path / "raw") + group_dir = tmp_path / "raw" + if slot != 0: + (group_dir / "episode_0").rename(group_dir / f"episode_{slot}") + attrs = zarr.open_group(str(group_dir), mode="r+").attrs + if stamp == "own": + attrs[ROUTE_ATTR] = route_id("s", GROUP) + elif stamp == "other": + attrs[ROUTE_ATTR] = route_id("another-session", GROUP) + manifest = make_manifest( + group_dir, + slot, + episode_index=5, + pending_path="episode_5.pending", + final_path="episode_5", + assignment={"group": GROUP, "slot": slot}, + ) + manifest.episode_id = "e0" + return group_dir, manifest + + +def test_a_routed_episode_aligns_at_its_slot(tmp_path): + group_dir, manifest = build_routed(tmp_path) + got = align_kept_episode(group_dir, 3, INDEX, manifest) + assert (tmp_path / "raw_aligned" / "episode_3").is_dir() + assert got.valid_indices.any() + + +def test_a_routed_episode_at_another_slot_is_refused(tmp_path): + group_dir, manifest = build_routed(tmp_path) + manifest.assignment["slot"] = 4 + refused(tmp_path, group_dir, manifest, index=3, match="not at the routed location") + + +@pytest.mark.parametrize("stamp", ["missing", "other"]) +def test_a_routed_episode_without_this_sessions_route_stamp_is_refused(tmp_path, stamp): + group_dir, manifest = build_routed(tmp_path, stamp=stamp) + refused(tmp_path, group_dir, manifest, index=3, match="not at the routed location") + + +def test_a_routed_episode_named_by_its_recording_index_is_refused(tmp_path): + group_dir, manifest = build_routed(tmp_path) + problems = check_kept_episode(group_dir, 5, manifest) + assert "the episode is not at the routed location the manifest records" in problems + + # The CLI lives in tools/, which is not a package. sys.path.insert(0, str(TOOLS)) import align_episode # noqa: E402 @@ -214,7 +365,7 @@ def test_cli_refused_episode_exits_1(tmp_path, capsys): def test_cli_manifest_session_option(tmp_path, raw, capsys): other = tmp_path / "other" other.mkdir() - store_manifest(other) + store_manifest(other, root=raw) assert run_cli(raw, "--episode", 0, "--index-source", INDEX, "--manifest-session", other) == 0 assert "aligned episode_0" in capsys.readouterr().out @@ -243,3 +394,31 @@ def test_cli_missing_episode_is_an_argument_error(raw): with pytest.raises(SystemExit) as info: run_cli(raw, "--index-source", INDEX) assert info.value.code == 2 + + +def test_cli_routed_episode_with_a_separate_manifest_index(tmp_path, capsys): + group_dir, manifest = build_routed(tmp_path) + sessions = tmp_path / "recorded" + sessions.mkdir() + write_manifest(sessions, manifest) + args = (group_dir, "--episode", 3, "--index-source", INDEX, "--manifest-session", sessions) + assert run_cli(*args, "--manifest-episode", 5) == 0 + assert "aligned episode_3" in capsys.readouterr().out + assert (tmp_path / "raw_aligned" / "episode_3").is_dir() + + +def test_cli_routed_episode_without_the_manifest_episode_cannot_find_it(tmp_path, capsys): + group_dir, manifest = build_routed(tmp_path) + sessions = tmp_path / "recorded" + sessions.mkdir() + write_manifest(sessions, manifest) + args = (group_dir, "--episode", 3, "--index-source", INDEX, "--manifest-session", sessions) + assert run_cli(*args) == 1 + assert "cannot read the episode's manifest" in capsys.readouterr().err + + +def test_cli_refuses_a_manifest_that_does_not_bind(tmp_path, raw, capsys): + write_manifest(raw, make_manifest(raw, episode_id="someone-else")) + assert run_cli(raw, "--episode", 0, "--index-source", INDEX) == 1 + assert "episode id differs" in capsys.readouterr().err + assert not (tmp_path / "raw_aligned").exists() From c22bf3a4e8accff2ffb4a802b0c2798d28c7c178 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:20:59 -0500 Subject: [PATCH 26/38] egocap: describe alignment expectations as the contract, not by comparison Rename test helpers, test names and a fixture key to state the expected output directly, and reword two alignment.py comments to match. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../recording/egocap/recording/alignment.py | 4 +-- .../aligned_writer/golden_attrs_sidecars.json | 2 +- .../aligned_writer/golden_basic_ds1.json | 2 +- .../aligned_writer/golden_basic_ds2.json | 2 +- .../aligned_writer/golden_realign.json | 2 +- .../recording/unit/test_aligned_writer.py | 2 +- .../tests/recording/unit/test_alignment.py | 30 +++++++++---------- .../unit/test_publish_aligned_episode.py | 14 ++++----- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/examples/egocap/recording/egocap/recording/alignment.py b/examples/egocap/recording/egocap/recording/alignment.py index 00bef58641..a37f504e46 100644 --- a/examples/egocap/recording/egocap/recording/alignment.py +++ b/examples/egocap/recording/egocap/recording/alignment.py @@ -5,7 +5,7 @@ """Time alignment of a recorded episode, producing the aligned-dataset arrays downstream consumers read. The recorded sources are resampled onto one camera's frame times (the index source). The rules are fixed by the -aligned dataset format and are reproduced here exactly, because consumers read the result by array name and +aligned dataset format and are implemented exactly as stated, because consumers read the result by array name and expect these values: * the valid range runs from the latest first time to the earliest last time over all sources; an index frame is @@ -310,7 +310,7 @@ def align_episode( """ _check_inputs(index_source, times, downsample) for name, labels in (epochs or {}).items(): - # The aligned numbers stay those of the reference rules; a break is refused, not handled differently. + # The aligned numbers follow the rules above unchanged; a break is refused, not handled differently. if name not in times or len(labels) != len(times[name]): raise AlignmentError(f"{name}: epoch labels must be one per sample of a source being aligned") if len(np.unique(labels)) > 1: diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_attrs_sidecars.json b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_attrs_sidecars.json index 57ad277622..65113a9075 100644 --- a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_attrs_sidecars.json +++ b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_attrs_sidecars.json @@ -568,7 +568,7 @@ ] } ], - "reference_tree_listing": [ + "expected_tree_listing": [ "config.yaml", "episode_0", "episode_0/glove", diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds1.json b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds1.json index 81bbe3ad83..bf6cd1c4bd 100644 --- a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds1.json +++ b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds1.json @@ -1092,7 +1092,7 @@ ] } ], - "reference_tree_listing": [ + "expected_tree_listing": [ "config.yaml", "episode_0", "episode_0/glove", diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds2.json b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds2.json index c20f6a3f5e..c1d0b82031 100644 --- a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds2.json +++ b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_basic_ds2.json @@ -1092,7 +1092,7 @@ ] } ], - "reference_tree_listing": [ + "expected_tree_listing": [ "config.yaml", "episode_0", "episode_0/glove", diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json index 2f14965ca9..cabbd5cf52 100644 --- a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json +++ b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json @@ -1092,7 +1092,7 @@ ] } ], - "reference_tree_listing": [ + "expected_tree_listing": [ "config.yaml", "episode_0", "episode_0/glove", diff --git a/examples/egocap/tests/recording/unit/test_aligned_writer.py b/examples/egocap/tests/recording/unit/test_aligned_writer.py index 50dc6eeb08..f67b5d7482 100644 --- a/examples/egocap/tests/recording/unit/test_aligned_writer.py +++ b/examples/egocap/tests/recording/unit/test_aligned_writer.py @@ -119,7 +119,7 @@ def golden(name): @pytest.mark.parametrize("name", sorted(META["scenarios"])) -def test_written_tree_equals_the_reference_aligned_tree(tmp_path, name): +def test_written_tree_equals_the_expected_tree(tmp_path, name): scenario = META["scenarios"][name] build_raw(tmp_path / "raw", scenario) write_steps(tmp_path / "raw", tmp_path / "aligned", scenario["steps"]) diff --git a/examples/egocap/tests/recording/unit/test_alignment.py b/examples/egocap/tests/recording/unit/test_alignment.py index e1c8073d7f..6d7b7f620d 100644 --- a/examples/egocap/tests/recording/unit/test_alignment.py +++ b/examples/egocap/tests/recording/unit/test_alignment.py @@ -55,7 +55,7 @@ def align(data, ds=1, rules=RULES, **kwargs): return align_episode("head_camera", times, CAMERAS, fields, rules, downsample=ds, **kwargs) -def ours_by_reference_key(result): +def by_output_key(result): out = {"valid_indices": result.valid_indices, "valid_timestamps": result.valid_timestamps} for name, source in result.sources.items(): if source.aligned_frame_indices is not None: @@ -65,12 +65,12 @@ def ours_by_reference_key(result): return out -def assert_equals_reference(data, ds, rules=RULES): - ours = ours_by_reference_key(align(data, ds, rules)) +def assert_matches_expected(data, ds, rules=RULES): + ours = by_output_key(align(data, ds, rules)) ref = {k.split("__", 1)[1]: v for k, v in data.items() if k.startswith(f"out{ds}__")} ref1 = {k.split("__", 1)[1]: v for k, v in data.items() if k.startswith("out1__")} if ds > 1: - # The reference's glove arrays for a stride are the matching rows of its full run (checked when generated). + # The expected glove arrays for a stride are the matching rows of the full-rate run. rows = np.searchsorted(np.flatnonzero(ref1["valid_indices"]), np.flatnonzero(ref["valid_indices"])) for field_name in GLOVE_FIELDS: ref[f"interp__manus_glove__{field_name}"] = ref1[f"interp__manus_glove__{field_name}"][rows] @@ -94,8 +94,8 @@ def assert_equals_reference(data, ds, rules=RULES): ("05_irregular_tracking_with_gap", 1), ], ) -def test_matches_reference_alignment_outputs(scenario, ds): - assert_equals_reference(load(scenario), ds) +def test_matches_expected_alignment_outputs(scenario, ds): + assert_matches_expected(load(scenario), ds) def test_late_tracking_sets_the_valid_range(): @@ -106,24 +106,24 @@ def test_late_tracking_sets_the_valid_range(): assert not result.valid_indices[0] -def test_single_sample_source_matches_reference_except_where_the_reference_skips(): - # The reference logs and skips the glove's linear fields (a single sample cannot be interpolated); ours raises. +def test_single_sample_source_is_refused_for_its_linear_fields(): + # A single sample cannot be interpolated, so the glove's linear fields are refused rather than skipped. data = load("06_single_sample_source") assert "out1__interp__manus_glove__left_hand_pose" not in data with pytest.raises(InsufficientSamplesError): align(data) without_hand_poses = {**RULES, "manus_glove": {"left_sensor_count": "nearest"}} - assert_equals_reference(data, 1, without_hand_poses) + assert_matches_expected(data, 1, without_hand_poses) -def test_backwards_timestamp_is_refused_where_the_reference_drops_the_sample(): +def test_backwards_timestamp_is_refused(): data = load("04b_backwards_timestamp") assert "out1__valid_indices" in data with pytest.raises(AlignmentError, match="backwards"): align(data) -def test_no_common_range_is_refused_where_the_reference_writes_empty_output(): +def test_no_common_range_is_refused(): data = load("07_no_common_range") assert not data["out1__valid_indices"].any() times, fields = inputs(data) @@ -270,9 +270,9 @@ def test_valid_range_is_first_and_last_common_time(): def test_no_epochs_and_empty_epochs_change_nothing(): data = load("01_jittered_index_offset_wrist") - base = ours_by_reference_key(align(data)) + base = by_output_key(align(data)) for epochs in (None, {}): - again = ours_by_reference_key(align(data, epochs=epochs)) + again = by_output_key(align(data, epochs=epochs)) assert all(np.array_equal(base[k], again[k]) for k in base) @@ -280,8 +280,8 @@ def test_uniform_epoch_labels_leave_the_output_identical(): data = load("01_jittered_index_offset_wrist") times, _ = inputs(data) epochs = {name: np.full(len(t), 4) for name, t in times.items()} - base = ours_by_reference_key(align(data)) - labelled = ours_by_reference_key(align(data, epochs=epochs)) + base = by_output_key(align(data)) + labelled = by_output_key(align(data, epochs=epochs)) assert set(base) == set(labelled) assert all(np.array_equal(base[k], labelled[k]) for k in base) diff --git a/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py index 70db4454ce..6804c196a4 100644 --- a/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py +++ b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py @@ -106,7 +106,7 @@ def publish(raw, aligned, episode=0, downsample=1, qualified=QUALIFIED, continui ) -def reference(raw, target, episode=0, downsample=1): +def write_control(raw, target, episode=0, downsample=1): write_aligned_episode( raw, target, episode, INDEX, downsample=downsample, qualified=QUALIFIED, continuity=clean_continuity() ) @@ -153,7 +153,7 @@ def raw(tmp_path): @pytest.mark.parametrize("episode", [0, 1]) def test_published_tree_equals_what_write_aligned_episode_produces(tmp_path, raw, episode): - reference(raw, tmp_path / "ref", episode, downsample=2) + write_control(raw, tmp_path / "ref", episode, downsample=2) before = raw_state(raw) publish(raw, tmp_path / "aligned", episode, downsample=2) @@ -210,7 +210,7 @@ def test_republishing_replaces_the_whole_episode_and_leaves_others_alone(tmp_pat publish(raw, aligned, 0, downsample=2) - reference(raw, tmp_path / "ref", 0, downsample=2) + write_control(raw, tmp_path / "ref", 0, downsample=2) now = snapshot(aligned) assert "episode_0/stale_array" not in now assert "episode_0/stale.txt" not in now @@ -301,7 +301,7 @@ def test_a_crash_while_replacing_an_existing_episode_never_leaves_a_partial_one( aligned = tmp_path / "aligned" publish(raw, aligned, 0, downsample=1) old = snapshot(aligned) - reference(raw, tmp_path / "ref", 0, downsample=2) + write_control(raw, tmp_path / "ref", 0, downsample=2) monkeypatch.setattr(aligned_writer, "os", FailingOs(fail_on)) with pytest.raises(OSError, match="simulated crash"): @@ -389,7 +389,7 @@ def test_a_leftover_replaced_episode_without_a_replacement_is_then_overwritten_b publish(raw, aligned, 0, downsample=2) - reference(raw, tmp_path / "ref", 0, downsample=2) + write_control(raw, tmp_path / "ref", 0, downsample=2) assert_snapshots_equal(snapshot(aligned), snapshot(tmp_path / "ref")) assert_no_leftovers(aligned) @@ -449,8 +449,8 @@ def run(episode): t.join(timeout=120) assert errors == [] - reference(raw, tmp_path / "ref", 0, downsample=2) - reference(raw, tmp_path / "ref", 1, downsample=2) + write_control(raw, tmp_path / "ref", 0, downsample=2) + write_control(raw, tmp_path / "ref", 1, downsample=2) assert_snapshots_equal(snapshot(aligned), snapshot(tmp_path / "ref")) for episode in (0, 1): assert validate_aligned_episode(aligned, episode, INDEX) == [] From 69aeff8abca5a138ff9407eb60312c84842efb0a Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:45:12 -0500 Subject: [PATCH 27/38] egocap: publish an aligned episode with one rename and never replace one Drop the lock and the set-aside/recovery pair; an existing aligned episode is refused and a crashed run leaves only a staging tree that is discarded. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/AGENTS.md | 2 +- .../egocap/recording/aligned_writer.py | 79 ++---- .../unit/test_publish_aligned_episode.py | 234 ++---------------- 3 files changed, 43 insertions(+), 272 deletions(-) diff --git a/examples/egocap/AGENTS.md b/examples/egocap/AGENTS.md index 44352fea93..12bd65d9ae 100644 --- a/examples/egocap/AGENTS.md +++ b/examples/egocap/AGENTS.md @@ -76,4 +76,4 @@ Run all three test suites per "Run the tests yourself" above — check each pack An aligned or otherwise derived copy of a recording must live in its own tree and read the raw session read-only. Check that the output path is not the raw session, inside it or containing it (resolving links) -before any file is written; replacing a derived episode deletes it first. +before any file is written. An existing derived episode is refused, never replaced. diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index 99056a6542..d27721dee9 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -12,12 +12,11 @@ aligned root's ``zarr.json`` records which source was the index. This module writes the files; the caller chooses the times, qualification and the staging that makes publication -atomic. +all-or-nothing. """ from __future__ import annotations -import fcntl import json import os import shutil @@ -252,63 +251,24 @@ def publish_aligned_episode( qualified: Mapping[str, bool], continuity: Mapping[str, Mapping[str, object]] | None, ) -> AlignedEpisode: - """Write the aligned episode privately, then move it into ``aligned_session`` by renames. - - A reader never sees a half-written episode: it is written and validated in a staging session beside the - aligned one (same filesystem, so the videos stay linked and the moves are renames). An interrupted run - leaves either the staging tree, which the next run discards, or, if it stopped between the two renames, - the previous episode under a ``.replaced`` name, which the next run puts back before anything else. - Arguments and refusals are those of :func:`write_aligned_episode`. - - Publication contract: one publisher at a time per aligned session (an exclusive lock on a file beside it is - held throughout, so concurrent runs queue instead of discarding each other's staging). A reader sees the - previous episode, the new one, or, in the instant between the two renames of a re-publication, no episode; - never a partial one. The rename pair is crash-recoverable, not a single atomic replacement. + """Write the aligned episode privately, then move it into ``aligned_session`` with one rename. + + The episode is built and validated in a staging session beside the aligned one (same filesystem, so the + videos stay linked), so a reader sees the finished episode or none. An existing aligned episode is never + replaced: it is refused. A crashed run leaves only the staging tree, which the next run discards. One + publisher at a time per aligned session. Arguments and refusals are those of :func:`write_aligned_episode`. """ _check_separate(raw_session, aligned_session) key = f"episode_{episode_index}" + final = aligned_session / key + # Refuse before doing any work; the rename below fails too if one appears meanwhile. + if final.exists(): + raise AlignedWriteError(f"{final} already exists; it is not replaced") staging = aligned_session.with_name(f".{aligned_session.name}.staging") _check_separate(raw_session, staging) - lock_path = aligned_session.with_name(f".{aligned_session.name}.lock") - # The lock file sits beside the aligned session, not in it, so a refused run still creates nothing inside. - with open(lock_path, "a") as lock: - fcntl.flock(lock, fcntl.LOCK_EX) - return _publish_locked( - raw_session, - aligned_session, - staging, - key, - episode_index, - index_source, - downsample, - qualified, - continuity, - ) - -def _publish_locked( - raw_session: Path, - aligned_session: Path, - staging: Path, - key: str, - episode_index: int, - index_source: str, - downsample: int, - qualified: Mapping[str, bool], - continuity: Mapping[str, Mapping[str, object]] | None, -) -> AlignedEpisode: - """The body of :func:`publish_aligned_episode`, run while its lock is held.""" - final, replaced = aligned_session / key, aligned_session / f".{key}.replaced" - - # Leftovers of an interrupted run: a half-built staging tree is discarded, and an episode set aside by an - # interrupted move is restored (or dropped if its replacement did arrive). + # A staging tree left by a crashed run is stale by definition. shutil.rmtree(staging, ignore_errors=True) - if replaced.exists(): - if final.exists(): - shutil.rmtree(replaced) - else: - os.replace(replaced, final) - try: aligned = write_aligned_episode( raw_session, @@ -319,19 +279,12 @@ def _publish_locked( qualified=qualified, continuity=continuity, ) - except BaseException: + # The aligned root and sidecars are idempotent; the episode itself moves in by one rename. + _write_root(raw_session, aligned_session, index_source) + os.rename(staging / key, final) + finally: # Nothing of a failed or refused write reaches the aligned session. shutil.rmtree(staging, ignore_errors=True) - raise - - # The aligned root and sidecars are idempotent; the episode moves in with two renames, keeping the old copy - # until the new one is in place. - _write_root(raw_session, aligned_session, index_source) - if final.exists(): - os.replace(final, replaced) - os.replace(staging / key, final) - shutil.rmtree(replaced, ignore_errors=True) - shutil.rmtree(staging, ignore_errors=True) return aligned diff --git a/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py index 6804c196a4..574192e6e6 100644 --- a/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py +++ b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py @@ -2,12 +2,10 @@ # # SPDX-License-Identifier: Apache-2.0 -import fcntl import hashlib import json import os import shutil -import threading from pathlib import Path import numpy as np @@ -130,7 +128,6 @@ def raw_state(root): def assert_no_leftovers(aligned): assert not (aligned.parent / f".{aligned.name}.staging").exists() - assert not list(aligned.glob(".*.replaced")) def assert_snapshots_equal(got, want): @@ -198,29 +195,29 @@ def no_link(source, target, *args, **kwargs): assert aligned_video.read_bytes() == video_bytes(camera, 0) -def test_republishing_replaces_the_whole_episode_and_leaves_others_alone(tmp_path, raw): +def test_an_existing_episode_is_refused_and_left_untouched(tmp_path, raw): aligned = tmp_path / "aligned" publish(raw, aligned, 0) - publish(raw, aligned, 1) - # A stale array and a stray file that only the first publication could have left behind. - stale = zarr.open_group(str(aligned), mode="a")["episode_0"] - stale["stale_array"] = np.arange(5) - (aligned / "episode_0" / "stale.txt").write_text("old") - other_before = {k: v for k, v in snapshot(aligned).items() if k.startswith("episode_1")} + before = snapshot(aligned) + files = listing(aligned) + + with pytest.raises(AlignedWriteError, match="already exists"): + publish(raw, aligned, 0, downsample=2) + assert listing(aligned) == files + assert_snapshots_equal(snapshot(aligned), before) + assert_no_leftovers(aligned) + + +def test_a_different_episode_publishes_beside_the_first(tmp_path, raw): + aligned = tmp_path / "aligned" publish(raw, aligned, 0, downsample=2) + publish(raw, aligned, 1, downsample=2) write_control(raw, tmp_path / "ref", 0, downsample=2) - now = snapshot(aligned) - assert "episode_0/stale_array" not in now - assert "episode_0/stale.txt" not in now - assert_snapshots_equal( - {k: v for k, v in now.items() if k.startswith("episode_0")}, - {k: v for k, v in snapshot(tmp_path / "ref").items() if k.startswith("episode_0")}, - ) - assert_snapshots_equal({k: v for k, v in now.items() if k.startswith("episode_1")}, other_before) + write_control(raw, tmp_path / "ref", 1, downsample=2) + assert_snapshots_equal(snapshot(aligned), snapshot(tmp_path / "ref")) assert_no_leftovers(aligned) - assert validate_aligned_episode(aligned, 0, INDEX) == [] def with_entry(source, **changes): @@ -277,82 +274,22 @@ def test_a_staging_path_that_is_the_raw_session_is_refused_and_not_deleted(tmp_p assert not (tmp_path / "aligned").exists() -class FailingOs: - """The ``os`` module as the writer sees it, with ``replace`` failing on one chosen call.""" - - def __init__(self, fail_on): - self.calls = 0 - self.fail_on = fail_on - - def __getattr__(self, name): - return getattr(os, name) - - def replace(self, source, target): - self.calls += 1 - if self.calls == self.fail_on: - raise OSError("simulated crash") - return os.replace(source, target) - - -@pytest.mark.parametrize("fail_on", [1, 2]) -def test_a_crash_while_replacing_an_existing_episode_never_leaves_a_partial_one( - tmp_path, raw, monkeypatch, fail_on -): +def test_a_failed_rename_removes_the_staging_tree(tmp_path, raw, monkeypatch): aligned = tmp_path / "aligned" - publish(raw, aligned, 0, downsample=1) - old = snapshot(aligned) - write_control(raw, tmp_path / "ref", 0, downsample=2) - - monkeypatch.setattr(aligned_writer, "os", FailingOs(fail_on)) - with pytest.raises(OSError, match="simulated crash"): - publish(raw, aligned, 0, downsample=2) - monkeypatch.undo() - - if (aligned / "episode_0").exists(): - # The first rename failed: the previous episode is still there, whole. - assert fail_on == 1 - assert_snapshots_equal(snapshot(aligned), old) - else: - # Between the two renames: the previous episode is held under its .replaced name, whole. - assert fail_on == 2 - assert (aligned / ".episode_0.replaced").is_dir() - assert validate_aligned_episode(aligned, 0, INDEX) != [] - - publish(raw, aligned, 0, downsample=2) - - assert_no_leftovers(aligned) - assert validate_aligned_episode(aligned, 0, INDEX) == [] - assert_snapshots_equal(snapshot(aligned), snapshot(tmp_path / "ref")) - - -def test_a_crash_between_the_renames_is_undone_by_a_run_that_refuses(tmp_path, raw, monkeypatch): - aligned = tmp_path / "aligned" - publish(raw, aligned, 0) - old = snapshot(aligned) - monkeypatch.setattr(aligned_writer, "os", FailingOs(2)) - with pytest.raises(OSError): - publish(raw, aligned, 0, downsample=2) - monkeypatch.undo() - - with pytest.raises(AlignedWriteError): - publish(raw, aligned, 0, continuity=None) - - # The refused run still put the previous episode back. - assert_snapshots_equal(snapshot(aligned), old) - assert_no_leftovers(aligned) + publish(raw, aligned, 1) + before = listing(aligned) + def failing_rename(source, target): + raise OSError("simulated failure") -def test_a_crash_publishing_a_new_episode_leaves_none_and_a_retry_succeeds(tmp_path, raw, monkeypatch): - aligned = tmp_path / "aligned" - monkeypatch.setattr(aligned_writer, "os", FailingOs(1)) - with pytest.raises(OSError, match="simulated crash"): + monkeypatch.setattr(aligned_writer.os, "rename", failing_rename) + with pytest.raises(OSError, match="simulated failure"): publish(raw, aligned, 0) monkeypatch.undo() - assert not (aligned / "episode_0").exists() - - publish(raw, aligned, 0) + assert listing(aligned) == before assert_no_leftovers(aligned) + publish(raw, aligned, 0) assert validate_aligned_episode(aligned, 0, INDEX) == [] @@ -369,46 +306,6 @@ def test_a_leftover_staging_tree_is_discarded(tmp_path, raw): assert validate_aligned_episode(aligned, 0, INDEX) == [] -def test_a_leftover_replaced_episode_without_a_replacement_is_restored_first(tmp_path, raw): - aligned = tmp_path / "aligned" - publish(raw, aligned, 0) - old = snapshot(aligned) - os.rename(aligned / "episode_0", aligned / ".episode_0.replaced") - - # A refused run shows the restore happened before anything else. - with pytest.raises(AlignedWriteError): - publish(raw, aligned, 0, continuity=None) - assert_snapshots_equal(snapshot(aligned), old) - assert_no_leftovers(aligned) - - -def test_a_leftover_replaced_episode_without_a_replacement_is_then_overwritten_by_a_publish(tmp_path, raw): - aligned = tmp_path / "aligned" - publish(raw, aligned, 0) - os.rename(aligned / "episode_0", aligned / ".episode_0.replaced") - - publish(raw, aligned, 0, downsample=2) - - write_control(raw, tmp_path / "ref", 0, downsample=2) - assert_snapshots_equal(snapshot(aligned), snapshot(tmp_path / "ref")) - assert_no_leftovers(aligned) - - -def test_a_leftover_replaced_episode_beside_its_replacement_is_dropped(tmp_path, raw): - aligned = tmp_path / "aligned" - publish(raw, aligned, 0) - current = snapshot(aligned) - shutil.copytree(aligned / "episode_0", aligned / ".episode_0.replaced") - (aligned / ".episode_0.replaced" / "older.txt").write_text("previous generation") - - with pytest.raises(AlignedWriteError): - publish(raw, aligned, 0, continuity=None) - - # The replacement that did arrive is kept as it was; the set-aside copy is gone. - assert_snapshots_equal(snapshot(aligned), current) - assert_no_leftovers(aligned) - - @pytest.mark.parametrize("error", [RuntimeError, KeyboardInterrupt]) def test_a_failure_after_staging_started_removes_the_staging_tree_and_propagates( tmp_path, raw, monkeypatch, error @@ -432,56 +329,6 @@ def fail_in_validation(session, episode, index_source): assert listing(aligned) == before -def test_concurrent_publications_of_different_episodes_both_land_complete(tmp_path, raw): - aligned = tmp_path / "aligned" - errors = [] - - def run(episode): - try: - publish(raw, aligned, episode, downsample=2) - except BaseException as exc: # reported below, on the main thread - errors.append(exc) - - threads = [threading.Thread(target=run, args=(episode,)) for episode in (0, 1)] - for t in threads: - t.start() - for t in threads: - t.join(timeout=120) - assert errors == [] - - write_control(raw, tmp_path / "ref", 0, downsample=2) - write_control(raw, tmp_path / "ref", 1, downsample=2) - assert_snapshots_equal(snapshot(aligned), snapshot(tmp_path / "ref")) - for episode in (0, 1): - assert validate_aligned_episode(aligned, episode, INDEX) == [] - assert_no_leftovers(aligned) - # The lock file is beside the aligned session, not inside it. - assert (tmp_path / ".aligned.lock").is_file() - assert not list(aligned.glob("*.lock")) - - -def test_a_second_publisher_waits_for_the_lock_holder(tmp_path, raw): - aligned = tmp_path / "aligned" - done = threading.Event() - - def run(): - publish(raw, aligned, 0) - done.set() - - with open(tmp_path / ".aligned.lock", "a") as lock: - fcntl.flock(lock, fcntl.LOCK_EX) - thread = threading.Thread(target=run) - thread.start() - # Blocked on the lock: nothing finishes and nothing is written. - assert not done.wait(1.0) - assert not aligned.exists() - fcntl.flock(lock, fcntl.LOCK_UN) - assert done.wait(60) - thread.join() - assert validate_aligned_episode(aligned, 0, INDEX) == [] - assert_no_leftovers(aligned) - - def test_a_refused_run_creates_nothing_inside_the_aligned_session(tmp_path, raw): aligned = tmp_path / "aligned" publish(raw, aligned, 1) @@ -489,37 +336,8 @@ def test_a_refused_run_creates_nothing_inside_the_aligned_session(tmp_path, raw) with pytest.raises(AlignedWriteError): publish(raw, aligned, 0, continuity=None) assert listing(aligned) == before - # Only the lock file may be added beside it, and a never-created session stays absent. + # A never-created session stays absent. with pytest.raises(AlignedWriteError): publish(raw, tmp_path / "fresh", 0, continuity=None) assert not (tmp_path / "fresh").exists() assert not (tmp_path / ".fresh.staging").exists() - - -def test_between_the_renames_the_episode_is_absent_never_partial(tmp_path, raw, monkeypatch): - aligned = tmp_path / "aligned" - publish(raw, aligned, 0) - old_files = listing(aligned / "episode_0") - seen = [] - - class Inspecting(FailingOs): - def replace(self, source, target): - self.calls += 1 - if self.calls == 2: - # Old episode already moved aside whole; the new one is complete in staging, not yet visible. - seen.append( - ( - (aligned / "episode_0").exists(), - listing(aligned / ".episode_0.replaced") == old_files, - validate_aligned_episode(tmp_path / ".aligned.staging", 0, INDEX), - ) - ) - return os.replace(source, target) - - monkeypatch.setattr(aligned_writer, "os", Inspecting(0)) - publish(raw, aligned, 0, downsample=2) - monkeypatch.undo() - - assert seen == [(False, True, [])] - assert validate_aligned_episode(aligned, 0, INDEX) == [] - assert_no_leftovers(aligned) From 71109049541b442698343ea0d33ab501fa53e84a Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 14:50:58 -0500 Subject: [PATCH 28/38] egocap: align a tracking source on receive time minus its configured latency A station's numeric_sources latency now reaches the recording config, and a source without a qualified event time but with a latency is aligned on receive time minus it; one with neither is refused. Tracking samples are stamped on the host clock, so their continuity is scoped to the capture connection and the aligner accepts that scope. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/backend/egocap_web/app.py | 15 ++++- .../backend/egocap_web/recording_adapter.py | 5 +- .../backend/egocap_web/station_config.py | 25 +++++++- .../egocap/recording/aligned_writer.py | 30 ++++++--- .../recording/egocap/recording/alignment.py | 5 +- .../egocap/stations/ego_stations.example.yaml | 5 +- .../recording/recording_service/models.py | 5 +- .../backend/test_app_livekit_recording.py | 7 +++ .../tests/backend/test_recording_adapter.py | 11 ++-- .../tests/backend/test_station_config.py | 28 +++++++++ .../recording/unit/test_aligned_writer.py | 63 ++++++++++++++++++- .../tests/recording/unit/test_alignment.py | 8 ++- 12 files changed, 177 insertions(+), 30 deletions(-) diff --git a/examples/egocap/backend/egocap_web/app.py b/examples/egocap/backend/egocap_web/app.py index e8072fb891..0b9c54a107 100644 --- a/examples/egocap/backend/egocap_web/app.py +++ b/examples/egocap/backend/egocap_web/app.py @@ -159,7 +159,12 @@ def _recorder_livekit_token(room: str) -> str: return subscriber_token(api_key=api_key, signing_key=signing_key, room=room, now=int(time.time())) -def _recording_config_factory(monitor: CaptureStatusMonitor, station_label: str | None, output_root: Path): +def _recording_config_factory( + monitor: CaptureStatusMonitor, + station_label: str | None, + output_root: Path, + latency: dict[str, float] | None = None, +): """Builds the real ``ServiceConfig`` lazily, read fresh each time the coordinator actually opens/reopens a session (not once at import time) -- so it reflects whichever cameras CaptureServer has ACTUALLY accepted @@ -195,6 +200,7 @@ def factory() -> ServiceConfig: qc=QcConfig(required_sources=required), calibration_assets=_station_calibration_assets(), station_label=station_label, + latency=latency or None, ) largest_decoded_frame_bytes = max((cam.width * cam.height * 3 for cam in video_sources), default=0) if largest_decoded_frame_bytes > 0: @@ -396,7 +402,12 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: lambda: recordable_livekit_streams(monitor.native.started), _recorder_livekit_token ) coordinator = RecordingSessionCoordinator( - _recording_config_factory(monitor, config.station_label, recording_output_root), + _recording_config_factory( + monitor, + config.station_label, + recording_output_root, + resolved_station.latency if resolved_station is not None else None, + ), queue_capacity=_INGRESS_QUEUE_CAPACITY, queue_bytes=lambda: _ingress_queue_bytes(monitor.native.started), readiness_check=_recording_readiness_check(monitor, station_config_error, config.capture_server_url), diff --git a/examples/egocap/backend/egocap_web/recording_adapter.py b/examples/egocap/backend/egocap_web/recording_adapter.py index 67aae9120b..5efd247156 100644 --- a/examples/egocap/backend/egocap_web/recording_adapter.py +++ b/examples/egocap/backend/egocap_web/recording_adapter.py @@ -340,9 +340,8 @@ def convert_capture_frame(frame: CaptureFrame) -> list[NumericSample]: tracking = capture_protocol.decode_tracking_frame(frame.payload) capture_time = frame.capture_time_ns / 1e9 receive_time = frame.receive_time_ns / 1e9 - # Only the transport session is known here: it does not establish that the controller or glove itself ran - # without a restart, so this is recorded as transport continuity and not as a device epoch. - continuity = ("capture_session", frame.session_id) + # Stamped on this host's clock, so only the capture connection can break; a new connection is a break. + continuity = ("host_clock", frame.session_id) samples: list[NumericSample] = [] pico_fields = build_pico_controller_fields(tracking) if pico_fields is not None: diff --git a/examples/egocap/backend/egocap_web/station_config.py b/examples/egocap/backend/egocap_web/station_config.py index 53f873185b..57b324dffe 100644 --- a/examples/egocap/backend/egocap_web/station_config.py +++ b/examples/egocap/backend/egocap_web/station_config.py @@ -17,8 +17,8 @@ Only the fields in :class:`ResolvedStation` are consumed; everything else in the YAML (hardware, visualization, or any other section) is read by nobody here and never passed downstream. The ``cameras`` field is itself a small ``name``/``type`` projection of ``video_sources`` -- the -fuller per-source declaration (``frame_type``, ``latency``, ``params``) is reference data for -other tooling, not consumed here. +fuller per-source declaration (``frame_type``, ``params``) is reference data for other tooling, not consumed +here; the one exception is a tracking source's ``latency`` under ``numeric_sources``. """ from __future__ import annotations @@ -37,6 +37,8 @@ #: Matches capture_server.protocol's own BeginRequest.cameras limit -- checked here too so an #: over-limit YAML is a configuration error, not a later capture-startup failure. _MAX_CAMERAS = 3 +#: The tracking sources the recorder takes a latency for. +_TRACKING_SOURCES = ("pico_controller", "manus_glove") class StationConfigError(ValueError): @@ -57,6 +59,9 @@ class ResolvedStation: task_description: str | None data_dir: Path | None cameras: tuple[p.CameraSelection, ...] + #: Seconds of device-to-host delay per tracking source, from ``numeric_sources[].latency``; a source without + #: one is recorded without a latency and cannot be time-aligned. + latency: dict[str, float] class _DuplicateKeyLoader(yaml.SafeLoader): @@ -130,6 +135,21 @@ def _resolve_cameras(station_id: str, entry: dict) -> tuple[p.CameraSelection, . return tuple(cameras) +def _resolve_latency(station_id: str, entry: dict) -> dict[str, float]: + """The finite, non-negative ``latency`` each recorded tracking source declares in ``numeric_sources``.""" + latency: dict[str, float] = {} + for source in entry.get("numeric_sources") or []: + if not isinstance(source, dict) or source.get("name") not in _TRACKING_SOURCES or "latency" not in source: + continue + seconds = source["latency"] + if isinstance(seconds, bool) or not isinstance(seconds, (int, float)) or not 0 <= seconds < float("inf"): + raise StationConfigError( + f"station {station_id!r}: {source['name']} latency must be a finite number of seconds >= 0" + ) + latency[source["name"]] = float(seconds) + return latency + + def _resolve_one_station(station_id: str, entry: Any, config_dir: Path) -> ResolvedStation: """Build a :class:`ResolvedStation` from one station's parsed mapping.""" if not isinstance(entry, dict): @@ -162,6 +182,7 @@ def _resolve_one_station(station_id: str, entry: Any, config_dir: Path) -> Resol task_description=_str_field(meta, "task_description"), data_dir=data_dir, cameras=_resolve_cameras(station_id, entry), + latency=_resolve_latency(station_id, entry), ) diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index d27721dee9..7a3e5310d9 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -171,6 +171,12 @@ def check(group: Any, prefix: str) -> None: return problems +def _latencies(config: Mapping[str, Any]) -> dict[str, float]: + """The per-source latency (seconds) that the session's ``config.yaml`` declares.""" + entries = [e for section in ("video_sources", "numeric_sources") for e in config.get(section) or []] + return {e["name"]: float(e["latency"]) for e in entries if "latency" in e} + + def write_aligned_episode( raw_session: Path, aligned_session: Path, @@ -183,10 +189,10 @@ def write_aligned_episode( ) -> AlignedEpisode: """Align one recorded episode and write it into ``aligned_session``; returns the alignment. - ``qualified`` says, per source, whether its recorded capture time is a qualified event time; a source that is - not qualified (or not listed) refuses the alignment, so nothing is written for it. The times aligned on are - the recorded capture times. ``continuity`` is the episode's stored per-source continuity evidence (None if it - recorded none): a source whose evidence is missing, unknown or records a break refuses the alignment too. + ``qualified`` says, per source, whether its recorded capture time is a qualified event time; one that is not + (or not listed) is aligned on receive time minus its configured latency, or refuses the alignment when it has + none, so nothing is written for it. ``continuity`` is the episode's stored per-source continuity evidence + (None if it recorded none): a source whose evidence is missing, unknown or records a break refuses it too. Raises ``AlignedWriteError`` if the written episode does not validate. """ _check_separate(raw_session, aligned_session) @@ -199,10 +205,18 @@ def write_aligned_episode( # Only declared sources the episode actually recorded take part, as the valid range spans what is present. present = [name for name in rules if name in raw_episode] - unqualified = [name for name in [index_source, *present] if not qualified.get(name, False)] - if unqualified: - raise AlignedWriteError(f"sources without a qualified event time: {sorted(set(unqualified))}") - times = {name: raw_episode[name]["capture_time"][:] for name in present} + # A source with a configured latency but no qualified event time is aligned on receive time minus that + # latency, an estimate of when the device measured it. + latency = _latencies(config) + unusable = [n for n in [index_source, *present] if not (qualified.get(n, False) or n in latency)] + if unusable: + raise AlignedWriteError(f"sources without a qualified event time or a latency: {sorted(set(unusable))}") + times = { + name: raw_episode[name]["capture_time"][:] + if qualified.get(name, False) + else raw_episode[name]["receive_time"][:] - latency[name] + for name in present + } # The evidence is checked against the rows actually written: a break at a row the source lacks is refused. broken = check_continuity(continuity, [index_source, *present], {name: len(t) for name, t in times.items()}) if broken: diff --git a/examples/egocap/recording/egocap/recording/alignment.py b/examples/egocap/recording/egocap/recording/alignment.py index a37f504e46..1846c3f5d8 100644 --- a/examples/egocap/recording/egocap/recording/alignment.py +++ b/examples/egocap/recording/egocap/recording/alignment.py @@ -88,8 +88,9 @@ def _complete(entry: Mapping[str, object], rows: int | None) -> bool: #: Continuity scopes that vouch for a source being one unbroken stretch. A clock mapping's epoch covers the -#: publisher's times; a transport session does not cover the device behind it, so it is not accepted. -ACCEPTED_CONTINUITY_SCOPES = ("clock_mapping",) +#: publisher's times; ``host_clock`` is a source stamped on the recording host's own clock, so only its +#: connection can break. A transport session does not cover the device behind it, so it is not accepted. +ACCEPTED_CONTINUITY_SCOPES = ("clock_mapping", "host_clock") def check_continuity( diff --git a/examples/egocap/recording/egocap/stations/ego_stations.example.yaml b/examples/egocap/recording/egocap/stations/ego_stations.example.yaml index 8cb4017bf0..4e5ce89002 100644 --- a/examples/egocap/recording/egocap/stations/ego_stations.example.yaml +++ b/examples/egocap/recording/egocap/stations/ego_stations.example.yaml @@ -6,8 +6,9 @@ # backend/egocap_web/station_config.py) reads the FIRST station entry under "stations" and # consumes meta.egocap_station_name, meta.operator_name, meta.auto_fill_operator_name, # meta.task_description, recording.data_dir, and each video_sources entry's name/type (as the -# cameras requested from CaptureServer). numeric_sources and the rest of each video_sources entry -# (frame_type, latency, params) are reference data for other tooling, not consumed here -- +# cameras requested from CaptureServer) and each numeric_sources entry's latency (the recorder aligns a +# tracking source on receive time minus it). The rest of each video_sources entry (frame_type, latency, +# params) is reference data for other tooling, not consumed here -- # CaptureServer owns actually opening the selected cameras/devices. Each video_sources name MUST # match one of the names the running CaptureServer instance actually knows about (its own # --camera list, mock or real) -- an unknown name rejects the whole capture session, not just diff --git a/examples/egocap/recording/recording_service/models.py b/examples/egocap/recording/recording_service/models.py index 50300c1b5c..c7a244210b 100644 --- a/examples/egocap/recording/recording_service/models.py +++ b/examples/egocap/recording/recording_service/models.py @@ -167,8 +167,9 @@ class NumericSample: receive_time: float fields: Mapping[str, Any] #: What stretch of the source this sample belongs to, as (scope, identity): the scope says what the identity - #: covers (``"clock_mapping"``: the mapping epoch that placed the time; ``"capture_session"``: the transport - #: session, which says nothing about the device behind it). A change of identity within a take is a break. None + #: covers (``"clock_mapping"``: the mapping epoch that placed the time; ``"host_clock"``: the capture + #: connection of a source stamped on this host's clock; ``"capture_session"``: the transport session, which + #: says nothing about the device behind it). A change of identity within a take is a break. None #: means the producer gave no evidence, which is not a claim of continuity. continuity: tuple[str, str | int] | None = None diff --git a/examples/egocap/tests/backend/test_app_livekit_recording.py b/examples/egocap/tests/backend/test_app_livekit_recording.py index 6580c9010f..c16e2c5839 100644 --- a/examples/egocap/tests/backend/test_app_livekit_recording.py +++ b/examples/egocap/tests/backend/test_app_livekit_recording.py @@ -59,6 +59,13 @@ def test_config_factory_without_a_started_session_has_no_livekit_sources(tmp_pat assert app_module._recording_config_factory(monitor, None, tmp_path)().video_sources == () +def test_config_factory_passes_the_stations_latency_to_the_config(tmp_path): + monitor = SimpleNamespace(camera_descriptors=(), native=SimpleNamespace(started=None)) + latency = {"pico_controller": 0.05} + assert app_module._recording_config_factory(monitor, None, tmp_path, latency)().latency == latency + assert app_module._recording_config_factory(monitor, None, tmp_path, {})().latency is None + + def test_recorder_token_is_signed_when_the_key_pair_is_set(monkeypatch): monkeypatch.setenv("LIVEKIT_API_KEY", "key") monkeypatch.setenv("LIVEKIT_API_SECRET", "secret") diff --git a/examples/egocap/tests/backend/test_recording_adapter.py b/examples/egocap/tests/backend/test_recording_adapter.py index 49a9509bad..f42473429b 100644 --- a/examples/egocap/tests/backend/test_recording_adapter.py +++ b/examples/egocap/tests/backend/test_recording_adapter.py @@ -848,16 +848,15 @@ def test_tracking_specs_name_the_frame_types_that_select_their_alignment_rules() assert {PICO_CONTROLLER_SPEC.frame_type, MANUS_GLOVE_SPEC.frame_type} <= set(FRAME_FIELD_RULES) -def test_every_tracking_sample_of_a_frame_carries_the_transport_session_as_its_continuity(): - # The transport session does not vouch for the devices behind it, so the scope says exactly that. +def test_every_tracking_sample_of_a_frame_carries_the_host_clock_connection_as_its_continuity(): frame = _tracking_frame(capture_time_ns=5_000_000_000, receive_time_ns=5_000_100_000) samples = _convert_raw_item(frame) assert sorted(s.source for s in samples) == ["manus_glove", "pico_controller"] - assert [s.continuity for s in samples] == [("capture_session", "s")] * 2 + assert [s.continuity for s in samples] == [("host_clock", "s")] * 2 -def test_a_new_transport_session_changes_the_continuity_identity(): +def test_a_new_capture_connection_changes_the_tracking_continuity_identity(): first = _convert_raw_item(_tracking_frame(1_000_000_000, 1_000_100_000)) other = dataclasses.replace(_tracking_frame(2_000_000_000, 2_000_100_000), session_id="t") - assert {s.continuity for s in _convert_raw_item(other)} == {("capture_session", "t")} - assert {s.continuity for s in first} == {("capture_session", "s")} + assert {s.continuity for s in _convert_raw_item(other)} == {("host_clock", "t")} + assert {s.continuity for s in first} == {("host_clock", "s")} diff --git a/examples/egocap/tests/backend/test_station_config.py b/examples/egocap/tests/backend/test_station_config.py index d5df52a5d0..cc72fdf2b1 100644 --- a/examples/egocap/tests/backend/test_station_config.py +++ b/examples/egocap/tests/backend/test_station_config.py @@ -48,6 +48,7 @@ def test_flat_file_with_station_name_uses_it_as_id(tmp_path): task_description=None, data_dir=tmp_path / "recordings", cameras=(), + latency={}, ) @@ -256,3 +257,30 @@ def test_the_shipped_template_resolves_a_real_station_label(): assert resolved.station_id == "station_01" assert resolved.station_label == "Station 01" assert resolved.auto_fill_operator_name is False + + +def _latency_yaml(*sources): + lines = ["numeric_sources:"] + for name, latency in sources: + lines += [f" - name: {name}", f" latency: {latency}"] + return "\n".join(lines) + "\n" + + +def test_tracking_source_latencies_are_resolved_in_seconds(tmp_path): + path = _write(tmp_path, _latency_yaml(("pico_controller", 0.05), ("manus_glove", 1))) + assert load_station_config(path).latency == {"pico_controller": 0.05, "manus_glove": 1.0} + + +def test_non_tracking_and_latency_free_numeric_sources_are_not_in_latency(tmp_path): + path = _write( + tmp_path, + "numeric_sources:\n - name: other\n latency: 0.1\n - name: manus_glove\n - just_a_string\n", + ) + assert load_station_config(path).latency == {} + + +@pytest.mark.parametrize("value", ["true", "'0.1'", "-0.1", ".inf", ".nan", "[1]"]) +def test_an_invalid_tracking_latency_is_a_station_config_error(tmp_path, value): + path = _write(tmp_path, _latency_yaml(("pico_controller", value))) + with pytest.raises(StationConfigError, match="pico_controller latency must be"): + load_station_config(path) diff --git a/examples/egocap/tests/recording/unit/test_aligned_writer.py b/examples/egocap/tests/recording/unit/test_aligned_writer.py index f67b5d7482..87259ba911 100644 --- a/examples/egocap/tests/recording/unit/test_aligned_writer.py +++ b/examples/egocap/tests/recording/unit/test_aligned_writer.py @@ -11,6 +11,7 @@ import numpy as np import pytest +import yaml import zarr from egocap.recording import aligned_writer @@ -183,13 +184,73 @@ def no_link(source, target, *args, **kwargs): ) def test_an_unqualified_or_unlisted_source_refuses_and_writes_nothing(tmp_path, qualified): build_raw(tmp_path / "raw", META["scenarios"]["basic_ds1"]) - with pytest.raises(AlignedWriteError, match="qualified"): + with pytest.raises(AlignedWriteError, match="without a qualified event time or a latency"): write_aligned_episode( tmp_path / "raw", tmp_path / "aligned", 0, INDEX, qualified=qualified, continuity=clean_continuity() ) assert not (tmp_path / "aligned").exists() +def set_latency(raw, **seconds): + config = yaml.safe_load((raw / "config.yaml").read_text()) + for entry in config["video_sources"] + config["numeric_sources"]: + if entry["name"] in seconds: + entry["latency"] = seconds[entry["name"]] + (raw / "config.yaml").write_text(yaml.safe_dump(config)) + + +def aligned_glove(tmp_path, qualified, **latency): + raw = tmp_path / "raw" + build_raw(raw, META["scenarios"]["basic_ds1"]) + set_latency(raw, **latency) + write_aligned_episode(raw, tmp_path / "aligned", 0, INDEX, qualified=qualified, continuity=clean_continuity()) + episode = zarr.open_group(str(tmp_path / "aligned"), mode="r")["episode_0"] + return episode["valid_timestamps"][:], episode["glove"] + + +def test_an_unqualified_source_with_a_latency_is_aligned_on_receive_time_minus_it(tmp_path): + baseline = aligned_glove(tmp_path / "baseline", QUALIFIED) + # Receive time is capture time plus 20 ms for every source, so that latency recovers the capture times. + estimated = aligned_glove(tmp_path / "latency", {**QUALIFIED, "glove": False}, glove=0.02) + np.testing.assert_array_equal(estimated[0], baseline[0]) + for name in baseline[1].array_keys(): + np.testing.assert_array_equal(estimated[1][name][:], baseline[1][name][:]) + + +def test_the_configured_latency_value_moves_the_aligned_source(tmp_path): + baseline = aligned_glove(tmp_path / "baseline", QUALIFIED) + shifted = aligned_glove(tmp_path / "shifted", {**QUALIFIED, "glove": False}, glove=0.05) + differs = [n for n in baseline[1].array_keys() if not np.array_equal(shifted[1][n][:], baseline[1][n][:])] + assert differs + + +def test_a_qualified_source_uses_its_capture_time_even_with_a_latency(tmp_path): + baseline = aligned_glove(tmp_path / "baseline", QUALIFIED) + ignored = aligned_glove(tmp_path / "latency", QUALIFIED, glove=5.0) + np.testing.assert_array_equal(ignored[0], baseline[0]) + for name in baseline[1].array_keys(): + np.testing.assert_array_equal(ignored[1][name][:], baseline[1][name][:]) + + +def test_an_unqualified_index_source_with_a_latency_is_accepted(tmp_path): + raw = tmp_path / "raw" + build_raw(raw, META["scenarios"]["basic_ds1"]) + set_latency(raw, **{INDEX: 0.02}) + write_aligned_episode( + raw, tmp_path / "aligned", 0, INDEX, qualified={**QUALIFIED, INDEX: False}, continuity=clean_continuity() + ) + assert (tmp_path / "aligned" / "episode_0").is_dir() + + +def test_only_sources_with_a_latency_are_listed_by_latencies(): + config = { + "video_sources": [{"name": "cam", "latency": 1}, {"name": "other"}], + "numeric_sources": [{"name": "arm", "latency": 0.5}], + } + assert aligned_writer._latencies(config) == {"cam": 1.0, "arm": 0.5} + assert aligned_writer._latencies({}) == {} + + def test_a_declared_source_absent_from_the_episode_is_skipped(tmp_path): build_raw(tmp_path / "raw", META["scenarios"]["basic_ds1"], drop_sources=("glove",)) # Not recorded, so its qualification is not asked for either. diff --git a/examples/egocap/tests/recording/unit/test_alignment.py b/examples/egocap/tests/recording/unit/test_alignment.py index 6d7b7f620d..478d79bbb0 100644 --- a/examples/egocap/tests/recording/unit/test_alignment.py +++ b/examples/egocap/tests/recording/unit/test_alignment.py @@ -468,8 +468,12 @@ def clean(scope="clock_mapping", **changes): return {"scope": scope, "identity": 1, "breaks": [], "known": True, **changes} -def test_only_a_clock_mapping_scope_is_accepted_as_continuity_evidence(): - assert alignment.ACCEPTED_CONTINUITY_SCOPES == ("clock_mapping",) +def test_only_clock_mapping_and_host_clock_scopes_are_accepted_as_continuity_evidence(): + assert alignment.ACCEPTED_CONTINUITY_SCOPES == ("clock_mapping", "host_clock") + + +def test_clean_host_clock_evidence_is_accepted(): + assert check_continuity({"arm": clean("host_clock")}, ["arm"]) == [] def test_clean_clock_mapping_evidence_for_every_source_is_accepted(): From 768eebaf4c53aa8c72b310350eff2d5f62cd6320 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 15:05:32 -0500 Subject: [PATCH 29/38] egocap: estimate tracking time at recording, refuse a missing source, isolate staging, align kept episodes - Take a configured latency off the host poll time once, when a tracking sample is converted, and record the source's time as an estimate with the latency used; the aligner uses saved times unchanged. - Refuse a kept episode whose source with sealed rows is missing. - Build each aligned episode in its own staging directory. - Align each kept episode in the background when the station enables it. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/backend/egocap_web/app.py | 23 +++- .../egocap/backend/egocap_web/auto_align.py | 58 ++++++++++ .../backend/egocap_web/livekit_recording.py | 31 ++++-- .../backend/egocap_web/recording_adapter.py | 18 ++- .../backend/egocap_web/recording_session.py | 8 +- .../backend/egocap_web/station_config.py | 17 +++ .../egocap/recording/aligned_writer.py | 55 ++++----- .../recording/egocap/recording/alignment.py | 4 +- .../egocap/stations/ego_stations.example.yaml | 9 +- .../recording/recording_service/models.py | 8 +- .../egocap/tests/backend/test_auto_align.py | 104 ++++++++++++++++++ .../backend/test_livekit_recording_source.py | 21 +++- .../tests/backend/test_recording_adapter.py | 41 +++++++ .../tests/backend/test_recording_session.py | 33 ++++++ .../tests/backend/test_station_config.py | 28 +++++ .../egocap/tests/backend/test_viser_scene.py | 82 ++++++++++++++ .../recording/unit/test_align_kept_episode.py | 16 ++- .../recording/unit/test_aligned_writer.py | 73 +++--------- .../unit/test_publish_aligned_episode.py | 59 ++++++---- 19 files changed, 547 insertions(+), 141 deletions(-) create mode 100644 examples/egocap/backend/egocap_web/auto_align.py create mode 100644 examples/egocap/tests/backend/test_auto_align.py diff --git a/examples/egocap/backend/egocap_web/app.py b/examples/egocap/backend/egocap_web/app.py index 0b9c54a107..adc7c7a679 100644 --- a/examples/egocap/backend/egocap_web/app.py +++ b/examples/egocap/backend/egocap_web/app.py @@ -8,6 +8,7 @@ from __future__ import annotations +import asyncio import logging import os import secrets @@ -27,11 +28,13 @@ from recording_service import ( CalibrationAsset, ConfigurationError, + EpisodeResult, QcConfig, ServiceConfig, VideoSourceSpec, ) +from .auto_align import AutoAligner from .capture_preview import MAX_CAMERA_JPEG_BYTES from .capture_status import CaptureStatusMonitor from .config import VisualizationConfig, config_from_env, visualization_from_env @@ -399,7 +402,9 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: app.state.imported_task_file_root = operator_settings_file.parent / "taskfiles" monitor = CaptureStatusMonitor(config, backend_instance_id=str(uuid.uuid4())) livekit_source = LiveKitRecordingSource( - lambda: recordable_livekit_streams(monitor.native.started), _recorder_livekit_token + lambda: recordable_livekit_streams(monitor.native.started), + _recorder_livekit_token, + tracking_latency=resolved_station.latency if resolved_station is not None else None, ) coordinator = RecordingSessionCoordinator( _recording_config_factory( @@ -446,6 +451,20 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: visualization_error=visualization_error, task_file_root=task_file_root, ) + # Kept episodes are time-aligned in the background when the station configures an index camera. + aligner_task: asyncio.Task[None] | None = None + if resolved_station is not None and resolved_station.alignment_index is not None: + aligner = AutoAligner(recording_output_root, resolved_station.alignment_index) + recorded = coordinator.on_episode_result + + def on_result(result: EpisodeResult) -> None: + """Keep the recording status update, then queue a kept episode for alignment.""" + if recorded is not None: + recorded(result) + aligner.submit(result) + + coordinator.on_episode_result = on_result + aligner_task = asyncio.create_task(aligner.run()) visualization: VisualizationScene | None = None try: visualization = _optional_visualization(monitor, visualization_config, visualization_error) @@ -461,6 +480,8 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: # owner stops -- it still needs the live capture connection to # retire any in-flight take cleanly. An unreleased close is # surfaced, not silently discarded. + if aligner_task is not None: + aligner_task.cancel() close_result = await coordinator.close(final=True) if not close_result.released: logger.error("recording coordinator did not fully release on shutdown: %s", close_result.issues) diff --git a/examples/egocap/backend/egocap_web/auto_align.py b/examples/egocap/backend/egocap_web/auto_align.py new file mode 100644 index 0000000000..a71e137302 --- /dev/null +++ b/examples/egocap/backend/egocap_web/auto_align.py @@ -0,0 +1,58 @@ +# SPDX-FileCopyrightText: 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +"""Time-aligns each kept episode in the background, right after its take is finalized. + +One worker handles episodes in the order they were kept, so aligning never competes with itself or with the +recording in progress for more than one episode's worth of CPU. An episode that cannot be aligned (for example a +source with no qualified time or latency) is logged with the reason and left as recorded; the raw episode is never +modified, and ``recording/tools/align_episode.py`` aligns it later by hand. +""" + +from __future__ import annotations + +import asyncio +import logging +from pathlib import Path + +from egocap.recording.aligned_writer import align_kept_episode +from egocap.recording.episode_layout import manifest_path, read_manifest +from recording_service import Disposition, EpisodeResult + +logger = logging.getLogger(__name__) + + +class AutoAligner: + """Aligns kept episodes one at a time on its own worker task.""" + + def __init__(self, output_root: Path, index_source: str) -> None: + """``output_root`` holds the recording sessions; ``index_source`` is the camera that sets the timeline.""" + self._output_root = output_root + self._index_source = index_source + self._queue: asyncio.Queue[EpisodeResult] = asyncio.Queue() + + def submit(self, result: EpisodeResult) -> None: + """Queue a finished take for alignment; anything other than a kept episode is ignored.""" + if result.disposition is Disposition.KEPT and result.final_path is not None: + self._queue.put_nowait(result) + + async def run(self) -> None: + """Align queued episodes until cancelled; a failed alignment is logged and never stops the worker.""" + while True: + result = await self._queue.get() + try: + # Blocking file and numeric work, kept off the event loop that serves recording and preview. + await asyncio.to_thread(self._align, result) + except Exception as exc: # noqa: BLE001 - one episode's failure must not end the worker + logger.warning("episode %s was not time-aligned: %s", result.episode_id, exc) + + def _align(self, result: EpisodeResult) -> None: + """Align one kept episode from its stored manifest; raises with the reason when it is refused.""" + final = result.final_path + assert final is not None + # The manifest stays in the recording session; a routed episode sits elsewhere, under its slot. + manifest = read_manifest(manifest_path(self._output_root / result.session_id, result.episode_index)) + slot = int(final.name.removeprefix("episode_")) + align_kept_episode(final.parent, slot, self._index_source, manifest) + logger.info("episode %s was time-aligned", result.episode_id) diff --git a/examples/egocap/backend/egocap_web/livekit_recording.py b/examples/egocap/backend/egocap_web/livekit_recording.py index 14490f177d..bc258e480a 100644 --- a/examples/egocap/backend/egocap_web/livekit_recording.py +++ b/examples/egocap/backend/egocap_web/livekit_recording.py @@ -64,20 +64,31 @@ # What each tracking source's saved time means today; none is a physical acquisition time. _TRACKING_SEMANTICS: dict[str, str] = { - "recorded_time": "the host's poll time for every tracking source", + "recorded_time": "the host's poll time for every tracking source, less a configured latency where one is set", "controllers": "device value is the pose-evaluation time (a predicted XrTime), not an acquisition time", "manus_gloves": "device value is host monotonic time at push; the SDK publishTime is not used", "physical_alignment": "unavailable: no tracking source carries a mapped device measurement time", } -# What each tracking source's saved time is, and whether it is a qualified event time. Neither is: both are host -# times, not a measurement of the device. A source becomes qualified only when its producer carries a measurement -# time from acquisition, and its entry here changes with that evidence, not before. -_TRACKING_EVENT_TIME: dict[str, dict[str, Any]] = { - PICO_CONTROLLER_SOURCE: {"meaning": "pose_evaluation_time", "qualified": False}, - MANUS_GLOVE_SOURCE: {"meaning": "host_push_time", "qualified": False}, -} +def _tracking_event_time(latency: Mapping[str, float]) -> dict[str, dict[str, Any]]: + """What each tracking source's saved time is, and whether it is a qualified event time. + + A source with a configured latency is saved as its host poll time minus that latency: an estimate, marked as + one with the latency used, never a measurement of the device. One without a latency is only the host poll + time and stays unqualified. + """ + return { + name: { + "meaning": "host_poll_minus_latency", + "estimated": True, + "latency_s": latency[name], + "qualified": True, + } + if name in latency + else {"meaning": "host_poll_time", "qualified": False} + for name in (PICO_CONTROLLER_SOURCE, MANUS_GLOVE_SOURCE) + } def uncertainty_budget_ns() -> int: @@ -335,7 +346,9 @@ def __init__( first_frame_timeout_s: float = 10.0, join_timeout_s: float = _JOIN_TIMEOUT_S, leave_timeout_s: float = _LEAVE_TIMEOUT_S, + tracking_latency: Mapping[str, float] | None = None, ) -> None: + self._tracking_latency = tracking_latency or {} self._recordable_streams = recordable_streams self._make_token = make_token self._first_frame_timeout_s = first_frame_timeout_s @@ -529,7 +542,7 @@ def timing_evidence(self) -> dict[str, Any] | None: } for s in self._streams }, - **_TRACKING_EVENT_TIME, + **_tracking_event_time(self._tracking_latency), }, # Tracking samples carry the host's poll time for every source; device measurement times are unmapped. "tracking_time": "host_poll", diff --git a/examples/egocap/backend/egocap_web/recording_adapter.py b/examples/egocap/backend/egocap_web/recording_adapter.py index 5efd247156..9c3f2f41d2 100644 --- a/examples/egocap/backend/egocap_web/recording_adapter.py +++ b/examples/egocap/backend/egocap_web/recording_adapter.py @@ -32,7 +32,7 @@ import asyncio import contextlib -from collections.abc import Callable +from collections.abc import Callable, Mapping from typing import Literal import numpy as np @@ -330,7 +330,7 @@ def convert_camera_image( ) -def convert_capture_frame(frame: CaptureFrame) -> list[NumericSample]: +def convert_capture_frame(frame: CaptureFrame, latency: Mapping[str, float] | None = None) -> list[NumericSample]: """Decodes one raw tracking payload and converts it into zero, one or two ``NumericSample``s (``pico_controller``/``manus_glove``), each omitted entirely (not fabricated) when its own whole-row validity @@ -338,16 +338,20 @@ def convert_capture_frame(frame: CaptureFrame) -> list[NumericSample]: the descriptor once per attempt (``validate_tracking_descriptor``) -- this does not re-validate it per frame.""" tracking = capture_protocol.decode_tracking_frame(frame.payload) - capture_time = frame.capture_time_ns / 1e9 + poll_time = frame.capture_time_ns / 1e9 receive_time = frame.receive_time_ns / 1e9 - # Stamped on this host's clock, so only the capture connection can break; a new connection is a break. + latency = latency or {} + # Host poll and connection continuity only: a device restart behind a live connection is not visible here. continuity = ("host_clock", frame.session_id) samples: list[NumericSample] = [] pico_fields = build_pico_controller_fields(tracking) if pico_fields is not None: + # A configured latency is taken off the poll time once, here: the saved time is the estimated event time. + capture_time = poll_time - latency.get(PICO_CONTROLLER_SOURCE, 0.0) samples.append(NumericSample(PICO_CONTROLLER_SOURCE, capture_time, receive_time, pico_fields, continuity)) manus_fields = build_manus_glove_fields(tracking) if manus_fields is not None: + capture_time = poll_time - latency.get(MANUS_GLOVE_SOURCE, 0.0) samples.append(NumericSample(MANUS_GLOVE_SOURCE, capture_time, receive_time, manus_fields, continuity)) return samples @@ -366,13 +370,15 @@ def _raw_item_bytes(raw_item: RawItem) -> int: return len(raw_item.jpeg) if isinstance(raw_item, CameraImage) else len(raw_item.payload) -def _convert_raw_item(raw_item: RawItem) -> list[NumericSample | VideoSample]: +def _convert_raw_item( + raw_item: RawItem, latency: Mapping[str, float] | None = None +) -> list[NumericSample | VideoSample]: """The default, real conversion dispatch -- CPU-bound (JPEG decode, pose math), so ``RecordingIngress`` always runs this inside its bounded consumer (off the synchronous capture-callback path that calls ``offer()``), via a worker executor, never before the queue.""" if isinstance(raw_item, CaptureFrame): - return list(convert_capture_frame(raw_item)) + return list(convert_capture_frame(raw_item, latency)) if isinstance(raw_item, CameraImage): return [convert_camera_image(raw_item, raw_item.name)] if isinstance(raw_item, VideoSample): diff --git a/examples/egocap/backend/egocap_web/recording_session.py b/examples/egocap/backend/egocap_web/recording_session.py index 2b331e75da..309fa2fba9 100644 --- a/examples/egocap/backend/egocap_web/recording_session.py +++ b/examples/egocap/backend/egocap_web/recording_session.py @@ -59,7 +59,7 @@ from typing import TYPE_CHECKING, Any, TypeVar from capture_server.client import CameraImage, CaptureFrame -from egocap_web.recording_adapter import RecordingIngress, validate_tracking_descriptor +from egocap_web.recording_adapter import RecordingIngress, _convert_raw_item, validate_tracking_descriptor from recording_service import ( CloseResult, EpisodeInfo, @@ -192,6 +192,7 @@ def __init__( # Optional LiveKit video for each take: joined before storage opens, fed after the ingress starts, left # before the ingress is retired. self._livekit_source = livekit_source + self._tracking_latency: dict[str, float] = {} #: The clock-mapping evidence of the take in progress, gathered when its video source stops. self._timing_evidence: dict[str, Any] | None = None self._queue_capacity = queue_capacity @@ -335,7 +336,9 @@ async def _open_storage_if_needed(self) -> _RecordingService: ) return self._service self._status = SessionStatus.OPENING - service = _RecordingService(self._config_factory()) + config = self._config_factory() + self._tracking_latency = config.latency or {} + service = _RecordingService(config) # Assigned BEFORE the await below: a failure or cancellation here # must not orphan a service instance that may have already # acquired real resources -- self._service is the one place close() @@ -472,6 +475,7 @@ async def _start_episode_with_storage(self, frozen_context: TaskContext) -> Epis queue_bytes=self._queue_bytes() if callable(self._queue_bytes) else self._queue_bytes, submit=partial(service.submit_sample, episode_id), on_failure=lambda message: self._schedule_failure_settlement(service, episode_id, message), + convert=partial(_convert_raw_item, latency=self._tracking_latency), ) await ingress.start() self._current_ingress = ingress diff --git a/examples/egocap/backend/egocap_web/station_config.py b/examples/egocap/backend/egocap_web/station_config.py index 57b324dffe..627818e7c6 100644 --- a/examples/egocap/backend/egocap_web/station_config.py +++ b/examples/egocap/backend/egocap_web/station_config.py @@ -62,6 +62,8 @@ class ResolvedStation: #: Seconds of device-to-host delay per tracking source, from ``numeric_sources[].latency``; a source without #: one is recorded without a latency and cannot be time-aligned. latency: dict[str, float] + #: The camera that sets the timeline for automatic time alignment of kept episodes; None turns it off. + alignment_index: str | None class _DuplicateKeyLoader(yaml.SafeLoader): @@ -150,6 +152,20 @@ def _resolve_latency(station_id: str, entry: dict) -> dict[str, float]: return latency +def _resolve_alignment_index(station_id: str, entry: dict) -> str | None: + """The index camera for automatic alignment: ``alignment.index_source``, else the first camera. + + On unless ``alignment.enabled`` is false; None also when there is no camera to index on. + """ + section = entry.get("alignment", {}) + if not isinstance(section, dict): + raise StationConfigError(f"station {station_id!r}: 'alignment' must be a mapping") + if not _bool_field(section, "enabled", default=True): + return None + cameras = [s.get("name") for s in entry.get("video_sources") or [] if isinstance(s, dict)] + return _str_field(section, "index_source") or (cameras[0] if cameras else None) + + def _resolve_one_station(station_id: str, entry: Any, config_dir: Path) -> ResolvedStation: """Build a :class:`ResolvedStation` from one station's parsed mapping.""" if not isinstance(entry, dict): @@ -183,6 +199,7 @@ def _resolve_one_station(station_id: str, entry: Any, config_dir: Path) -> Resol data_dir=data_dir, cameras=_resolve_cameras(station_id, entry), latency=_resolve_latency(station_id, entry), + alignment_index=_resolve_alignment_index(station_id, entry), ) diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index 7a3e5310d9..19b9008c56 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -20,6 +20,7 @@ import json import os import shutil +import tempfile from collections.abc import Mapping from pathlib import Path from typing import Any @@ -171,12 +172,6 @@ def check(group: Any, prefix: str) -> None: return problems -def _latencies(config: Mapping[str, Any]) -> dict[str, float]: - """The per-source latency (seconds) that the session's ``config.yaml`` declares.""" - entries = [e for section in ("video_sources", "numeric_sources") for e in config.get(section) or []] - return {e["name"]: float(e["latency"]) for e in entries if "latency" in e} - - def write_aligned_episode( raw_session: Path, aligned_session: Path, @@ -189,10 +184,11 @@ def write_aligned_episode( ) -> AlignedEpisode: """Align one recorded episode and write it into ``aligned_session``; returns the alignment. - ``qualified`` says, per source, whether its recorded capture time is a qualified event time; one that is not - (or not listed) is aligned on receive time minus its configured latency, or refuses the alignment when it has - none, so nothing is written for it. ``continuity`` is the episode's stored per-source continuity evidence - (None if it recorded none): a source whose evidence is missing, unknown or records a break refuses it too. + ``qualified`` says, per source, whether its recorded capture time is a qualified event time (a measured one, + or a configured estimate the recorder already applied). A source that is not, or is not listed, refuses the + alignment, so nothing is written for it. The times aligned on are the recorded capture times, used unchanged. + ``continuity`` is the episode's stored per-source continuity evidence (None if it recorded none): a source + whose evidence is missing, unknown or records a break refuses it too. Raises ``AlignedWriteError`` if the written episode does not validate. """ _check_separate(raw_session, aligned_session) @@ -205,18 +201,10 @@ def write_aligned_episode( # Only declared sources the episode actually recorded take part, as the valid range spans what is present. present = [name for name in rules if name in raw_episode] - # A source with a configured latency but no qualified event time is aligned on receive time minus that - # latency, an estimate of when the device measured it. - latency = _latencies(config) - unusable = [n for n in [index_source, *present] if not (qualified.get(n, False) or n in latency)] - if unusable: - raise AlignedWriteError(f"sources without a qualified event time or a latency: {sorted(set(unusable))}") - times = { - name: raw_episode[name]["capture_time"][:] - if qualified.get(name, False) - else raw_episode[name]["receive_time"][:] - latency[name] - for name in present - } + unqualified = [name for name in [index_source, *present] if not qualified.get(name, False)] + if unqualified: + raise AlignedWriteError(f"sources without a qualified event time: {sorted(set(unqualified))}") + times = {name: raw_episode[name]["capture_time"][:] for name in present} # The evidence is checked against the rows actually written: a break at a row the source lacks is refused. broken = check_continuity(continuity, [index_source, *present], {name: len(t) for name, t in times.items()}) if broken: @@ -267,10 +255,11 @@ def publish_aligned_episode( ) -> AlignedEpisode: """Write the aligned episode privately, then move it into ``aligned_session`` with one rename. - The episode is built and validated in a staging session beside the aligned one (same filesystem, so the - videos stay linked), so a reader sees the finished episode or none. An existing aligned episode is never - replaced: it is refused. A crashed run leaves only the staging tree, which the next run discards. One - publisher at a time per aligned session. Arguments and refusals are those of :func:`write_aligned_episode`. + The episode is built and validated in a private staging directory beside the aligned session (same + filesystem, so the videos stay linked), so a reader sees the finished episode or none. Each attempt owns its + staging directory, so concurrent runs never touch each other's work. An existing aligned episode is never + replaced: it is refused. A crashed run leaves its staging directory behind. Arguments and refusals are those + of :func:`write_aligned_episode`. """ _check_separate(raw_session, aligned_session) key = f"episode_{episode_index}" @@ -278,12 +267,10 @@ def publish_aligned_episode( # Refuse before doing any work; the rename below fails too if one appears meanwhile. if final.exists(): raise AlignedWriteError(f"{final} already exists; it is not replaced") - staging = aligned_session.with_name(f".{aligned_session.name}.staging") - _check_separate(raw_session, staging) - - # A staging tree left by a crashed run is stale by definition. - shutil.rmtree(staging, ignore_errors=True) + aligned_session.parent.mkdir(parents=True, exist_ok=True) + staging = Path(tempfile.mkdtemp(prefix=f".{aligned_session.name}.staging-", dir=aligned_session.parent)) try: + _check_separate(raw_session, staging) aligned = write_aligned_episode( raw_session, staging, @@ -332,7 +319,11 @@ def check_kept_episode(raw_session: Path, episode_index: int, manifest: EpisodeM try: episode = zarr.open_group(str(episode_dir), mode="r") for name, count in manifest.counts.items(): - if name in episode and int(episode[name]["capture_time"].shape[0]) != count.get("written"): + # A source with sealed rows must still be there; one that wrote none may be absent. + if name not in episode: + if count.get("written"): + problems.append(f"{name}: recorded rows are missing from the episode") + elif int(episode[name]["capture_time"].shape[0]) != count.get("written"): problems.append(f"{name}: the rows on disk differ from the sealed count") except (OSError, zarr.errors.GroupNotFoundError) as exc: problems.append(f"the episode cannot be read: {exc}") diff --git a/examples/egocap/recording/egocap/recording/alignment.py b/examples/egocap/recording/egocap/recording/alignment.py index 1846c3f5d8..e0cad9eda4 100644 --- a/examples/egocap/recording/egocap/recording/alignment.py +++ b/examples/egocap/recording/egocap/recording/alignment.py @@ -88,8 +88,8 @@ def _complete(entry: Mapping[str, object], rows: int | None) -> bool: #: Continuity scopes that vouch for a source being one unbroken stretch. A clock mapping's epoch covers the -#: publisher's times; ``host_clock`` is a source stamped on the recording host's own clock, so only its -#: connection can break. A transport session does not cover the device behind it, so it is not accepted. +#: publisher's times; ``host_clock`` is a source stamped on the recording host's own clock, covering its host +#: poll and connection but not the device behind it. A transport session alone is not accepted. ACCEPTED_CONTINUITY_SCOPES = ("clock_mapping", "host_clock") diff --git a/examples/egocap/recording/egocap/stations/ego_stations.example.yaml b/examples/egocap/recording/egocap/stations/ego_stations.example.yaml index 4e5ce89002..7776d34248 100644 --- a/examples/egocap/recording/egocap/stations/ego_stations.example.yaml +++ b/examples/egocap/recording/egocap/stations/ego_stations.example.yaml @@ -6,8 +6,8 @@ # backend/egocap_web/station_config.py) reads the FIRST station entry under "stations" and # consumes meta.egocap_station_name, meta.operator_name, meta.auto_fill_operator_name, # meta.task_description, recording.data_dir, and each video_sources entry's name/type (as the -# cameras requested from CaptureServer) and each numeric_sources entry's latency (the recorder aligns a -# tracking source on receive time minus it). The rest of each video_sources entry (frame_type, latency, +# cameras requested from CaptureServer), the alignment section, and each numeric_sources entry's latency +# (a tracking source is aligned on receive time minus it). The rest of each video_sources entry (frame_type, latency, # params) is reference data for other tooling, not consumed here -- # CaptureServer owns actually opening the selected cameras/devices. Each video_sources name MUST # match one of the names the running CaptureServer instance actually knows about (its own @@ -39,6 +39,11 @@ stations: # then this only prefills the field's draft text; the operator still has to press "Set # operator" before any recording command is accepted. auto_fill_operator_name: false + # Each kept episode is time-aligned in the background on this camera's frames. Defaults: enabled, and the + # first video source as the index. Set enabled: false to leave episodes as recorded. + alignment: + enabled: true + index_source: head_human_camera video_sources: - type: oak_camera name: head_human_camera diff --git a/examples/egocap/recording/recording_service/models.py b/examples/egocap/recording/recording_service/models.py index c7a244210b..6f21d12829 100644 --- a/examples/egocap/recording/recording_service/models.py +++ b/examples/egocap/recording/recording_service/models.py @@ -167,10 +167,10 @@ class NumericSample: receive_time: float fields: Mapping[str, Any] #: What stretch of the source this sample belongs to, as (scope, identity): the scope says what the identity - #: covers (``"clock_mapping"``: the mapping epoch that placed the time; ``"host_clock"``: the capture - #: connection of a source stamped on this host's clock; ``"capture_session"``: the transport session, which - #: says nothing about the device behind it). A change of identity within a take is a break. None - #: means the producer gave no evidence, which is not a claim of continuity. + #: covers. ``"clock_mapping"``: the mapping epoch that placed the time. ``"host_clock"``: the capture + #: connection of a source polled on this host's clock, not the device behind it. ``"capture_session"``: the + #: transport session, which says nothing about the device. A change of identity within a take is a break. + #: None means the producer gave no evidence, which is not a claim of continuity. continuity: tuple[str, str | int] | None = None diff --git a/examples/egocap/tests/backend/test_auto_align.py b/examples/egocap/tests/backend/test_auto_align.py new file mode 100644 index 0000000000..0764410e4c --- /dev/null +++ b/examples/egocap/tests/backend/test_auto_align.py @@ -0,0 +1,104 @@ +# SPDX-FileCopyrightText: 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +"""Background alignment of kept episodes: which results are queued, what is aligned, and worker resilience.""" + +import asyncio +import logging +from pathlib import Path + +import pytest + +from egocap_web import auto_align +from egocap_web.auto_align import AutoAligner +from recording_service import Disposition, EpisodeResult + + +def _result(index=3, disposition=Disposition.KEPT, final_path="default", session_id="session_a"): + if final_path == "default": + final_path = Path("/routed/group") / "episode_000007" + return EpisodeResult( + session_id=session_id, + episode_id=f"ep{index}", + episode_index=index, + disposition=disposition, + final_path=final_path, + pending_path=None, + counts=(), + duration_seconds=1.0, + quality=None, + ) + + +@pytest.fixture +def calls(monkeypatch): + recorded = [] + monkeypatch.setattr(auto_align, "manifest_path", lambda root, index: Path(root) / f"manifest_{index}.json") + monkeypatch.setattr(auto_align, "read_manifest", lambda path: f"manifest:{path}") + monkeypatch.setattr(auto_align, "align_kept_episode", lambda *args: recorded.append(args)) + return recorded + + +async def _drain(aligner): + task = asyncio.create_task(aligner.run()) + for _ in range(200): + if aligner._queue.empty(): + break + await asyncio.sleep(0.01) + await asyncio.sleep(0.05) + task.cancel() + with pytest.raises(asyncio.CancelledError): + await task + + +@pytest.mark.parametrize( + "result", + [ + _result(disposition=Disposition.DISCARDED), + _result(final_path=None), + ], +) +def test_results_that_are_not_a_kept_episode_with_a_path_are_ignored(result): + aligner = AutoAligner(Path("/out"), "head") + aligner.submit(result) + assert aligner._queue.empty() + + +async def test_a_kept_episode_is_aligned_from_its_manifest_and_slot(calls): + aligner = AutoAligner(Path("/out"), "head") + aligner.submit(_result()) + await _drain(aligner) + assert calls == [(Path("/routed/group"), 7, "head", "manifest:/out/session_a/manifest_3.json")] + + +async def test_a_failed_alignment_is_logged_and_the_next_episode_is_still_aligned(calls, monkeypatch, caplog): + def refuse_first(*args): + if not calls: + calls.append(args) + raise ValueError("no qualified latency") + calls.append(args) + + monkeypatch.setattr(auto_align, "align_kept_episode", refuse_first) + aligner = AutoAligner(Path("/out"), "head") + aligner.submit(_result(index=1)) + aligner.submit(_result(index=2)) + with caplog.at_level(logging.INFO, logger=auto_align.logger.name): + await _drain(aligner) + assert len(calls) == 2 + warnings = [r for r in caplog.records if r.levelno == logging.WARNING] + assert ( + len(warnings) == 1 + and "ep1" in warnings[0].getMessage() + and "no qualified latency" in warnings[0].getMessage() + ) + assert any("ep2 was time-aligned" in r.getMessage() for r in caplog.records) + + +async def test_cancelling_an_idle_worker_ends_it_cleanly(): + task = asyncio.create_task(AutoAligner(Path("/out"), "head").run()) + await asyncio.sleep(0) + task.cancel() + with pytest.raises(asyncio.CancelledError): + await task + assert task.cancelled() diff --git a/examples/egocap/tests/backend/test_livekit_recording_source.py b/examples/egocap/tests/backend/test_livekit_recording_source.py index 084396b129..7fccea2baa 100644 --- a/examples/egocap/tests/backend/test_livekit_recording_source.py +++ b/examples/egocap/tests/backend/test_livekit_recording_source.py @@ -424,8 +424,8 @@ def clock_sync_with(history, *, discontinuity=False, rejected=0, current=True): ) -async def prepared_source(streams): - source = make_source(streams) +async def prepared_source(streams, **kwargs): + source = make_source(streams, **kwargs) await prepare_with_frames(source, streams) return source, FakeReceiver.instances[0] @@ -482,8 +482,8 @@ async def test_timing_evidence_describes_the_mappings_the_take_was_placed_under( "event_time": { "cam16": {"meaning": "sensor_capture", "qualified": True}, "cam17": {"meaning": "frame_ready", "qualified": False}, - "pico_controller": {"meaning": "pose_evaluation_time", "qualified": False}, - "manus_glove": {"meaning": "host_push_time", "qualified": False}, + "pico_controller": {"meaning": "host_poll_time", "qualified": False}, + "manus_glove": {"meaning": "host_poll_time", "qualified": False}, }, "tracking_time": "host_poll", "tracking_semantics": lrec._TRACKING_SEMANTICS, @@ -507,6 +507,19 @@ async def test_event_time_is_keyed_by_recorded_source_and_qualifies_only_sensor_ assert 16 not in event_time and 17 not in event_time +async def test_a_tracking_latency_makes_that_source_a_marked_estimate_and_others_stay_unqualified(): + source, receiver = await prepared_source([livekit_stream(16)], tracking_latency={"pico_controller": 0.02}) + receiver.clock_sync = clock_sync_with(history_of(1)) + event_time = source.timing_evidence()["event_time"] + assert event_time["pico_controller"] == { + "meaning": "host_poll_minus_latency", + "estimated": True, + "latency_s": 0.02, + "qualified": True, + } + assert event_time["manus_glove"] == {"meaning": "host_poll_time", "qualified": False} + + async def test_timing_evidence_records_the_configured_uncertainty_budget(monkeypatch): monkeypatch.setenv(lrec.BUDGET_ENV, "2.5") source, receiver = await prepared_source([livekit_stream(16)]) diff --git a/examples/egocap/tests/backend/test_recording_adapter.py b/examples/egocap/tests/backend/test_recording_adapter.py index f42473429b..6ff50456e4 100644 --- a/examples/egocap/tests/backend/test_recording_adapter.py +++ b/examples/egocap/tests/backend/test_recording_adapter.py @@ -36,6 +36,7 @@ build_pico_controller_fields, button_pressed, convert_camera_image, + convert_capture_frame, convert_controller_aim_pose, convert_hand_pose, convert_head_pose, @@ -855,6 +856,46 @@ def test_every_tracking_sample_of_a_frame_carries_the_host_clock_connection_as_i assert [s.continuity for s in samples] == [("host_clock", "s")] * 2 +def _capture_times(samples): + return {s.source: s.capture_time for s in samples} + + +def test_no_latency_leaves_the_poll_time_as_the_capture_time(): + frame = _tracking_frame(capture_time_ns=5_000_000_000, receive_time_ns=5_040_000_000) + for samples in (_convert_raw_item(frame), _convert_raw_item(frame, {}), convert_capture_frame(frame, None)): + assert set(_capture_times(samples).values()) == {5.0} + + +def test_a_latency_is_taken_off_the_poll_time_per_source_and_receive_time_is_unchanged(): + frame = _tracking_frame(capture_time_ns=5_000_000_000, receive_time_ns=5_040_000_000) + samples = _convert_raw_item(frame, {"pico_controller": 0.02, "manus_glove": 0.0}) + assert _capture_times(samples) == pytest.approx({"pico_controller": 4.98, "manus_glove": 5.0}) + assert {s.receive_time for s in samples} == {5.04} + + +def test_a_later_receive_time_does_not_move_the_adjusted_capture_times(): + latency = {"pico_controller": 0.02, "manus_glove": 0.03} + prompt = _tracking_frame(capture_time_ns=5_000_000_000, receive_time_ns=5_001_000_000) + delayed = _tracking_frame(capture_time_ns=5_000_000_000, receive_time_ns=5_250_000_000) + assert _capture_times(_convert_raw_item(prompt, latency)) == _capture_times( + _convert_raw_item(delayed, latency) + ) + + +def test_the_latency_is_applied_once_to_each_frame(): + latency = {"pico_controller": 0.02, "manus_glove": 0.02} + times = [ + _capture_times(_convert_raw_item(_tracking_frame(t, t + 1_000_000), latency))["pico_controller"] + for t in (1_000_000_000, 2_000_000_000) + ] + assert times == pytest.approx([0.98, 1.98]) + + +def test_a_latency_does_not_change_the_tracking_continuity(): + samples = _convert_raw_item(_tracking_frame(5_000_000_000, 5_000_100_000), {"pico_controller": 0.02}) + assert {s.continuity for s in samples} == {("host_clock", "s")} + + def test_a_new_capture_connection_changes_the_tracking_continuity_identity(): first = _convert_raw_item(_tracking_frame(1_000_000_000, 1_000_100_000)) other = dataclasses.replace(_tracking_frame(2_000_000_000, 2_000_100_000), session_id="t") diff --git a/examples/egocap/tests/backend/test_recording_session.py b/examples/egocap/tests/backend/test_recording_session.py index e31174e73c..a61b43f17f 100644 --- a/examples/egocap/tests/backend/test_recording_session.py +++ b/examples/egocap/tests/backend/test_recording_session.py @@ -737,3 +737,36 @@ async def test_a_final_close_keeps_admission_blocked_but_an_ordinary_close_reope coordinator.set_task("too late") with pytest.raises(CoordinatorBusyError): await coordinator.start_episode() + + +async def test_the_configured_latency_reaches_the_converted_tracking_sample_times(tmp_path: Path, monkeypatch): + from tests.backend.test_recording_adapter import default_tracking_values + + converters = [] + real = coordinator_module.RecordingIngress + + def capture_convert(*args, **kwargs): + converters.append(kwargs["convert"]) + return real(*args, **kwargs) + + monkeypatch.setattr(coordinator_module, "RecordingIngress", capture_convert) + coordinator = make_coordinator( + tmp_path, + numeric_sources=(PICO_CONTROLLER_SPEC, MANUS_GLOVE_SPEC), + latency={"pico_controller": 0.02}, + ) + await coordinator.open() + coordinator.set_task("t") + await coordinator.start_episode() + frame = CaptureFrame( + session_id="s", + description=None, # type: ignore[arg-type] + stream_id=1, + sequence=0, + capture_time_ns=5_000_000_000, + receive_time_ns=5_040_000_000, + payload=capture_protocol.encode_tracking_frame(default_tracking_values()), + ) + times = {s.source: s.capture_time for s in converters[-1](frame)} + assert times["pico_controller"] == pytest.approx(4.98) and times["manus_glove"] == 5.0 + await coordinator.close() diff --git a/examples/egocap/tests/backend/test_station_config.py b/examples/egocap/tests/backend/test_station_config.py index cc72fdf2b1..b8bf81c97d 100644 --- a/examples/egocap/tests/backend/test_station_config.py +++ b/examples/egocap/tests/backend/test_station_config.py @@ -49,6 +49,7 @@ def test_flat_file_with_station_name_uses_it_as_id(tmp_path): data_dir=tmp_path / "recordings", cameras=(), latency={}, + alignment_index=None, ) @@ -284,3 +285,30 @@ def test_an_invalid_tracking_latency_is_a_station_config_error(tmp_path, value): path = _write(tmp_path, _latency_yaml(("pico_controller", value))) with pytest.raises(StationConfigError, match="pico_controller latency must be"): load_station_config(path) + + +_CAMERAS = "video_sources:\n - type: oak_camera\n name: head\n - type: oak_camera\n name: wrist\n" + + +def test_alignment_defaults_to_the_first_camera(tmp_path): + assert load_station_config(_write(tmp_path, _CAMERAS)).alignment_index == "head" + + +def test_alignment_index_source_can_be_named(tmp_path): + path = _write(tmp_path, _CAMERAS + "alignment:\n index_source: wrist\n") + assert load_station_config(path).alignment_index == "wrist" + + +def test_alignment_can_be_disabled(tmp_path): + path = _write(tmp_path, _CAMERAS + "alignment:\n enabled: false\n") + assert load_station_config(path).alignment_index is None + + +def test_alignment_is_off_without_cameras(tmp_path): + assert load_station_config(_write(tmp_path, "meta: {}\n")).alignment_index is None + + +@pytest.mark.parametrize("section", ["[a, b]", "yes", "3"]) +def test_a_non_mapping_alignment_section_is_a_station_config_error(tmp_path, section): + with pytest.raises(StationConfigError, match="alignment"): + load_station_config(_write(tmp_path, _CAMERAS + f"alignment: {section}\n")) diff --git a/examples/egocap/tests/backend/test_viser_scene.py b/examples/egocap/tests/backend/test_viser_scene.py index ae30fd255d..113ce99a3e 100644 --- a/examples/egocap/tests/backend/test_viser_scene.py +++ b/examples/egocap/tests/backend/test_viser_scene.py @@ -738,6 +738,88 @@ async def stop(self): assert events == ["scene stop"] and created[0].stopped # capture is still stopped +class _FakeAligner: + instances = [] + + def __init__(self, output_root, index_source): + self.output_root, self.index_source = output_root, index_source + self.submitted = [] + self.cancelled = False + _FakeAligner.instances.append(self) + + def submit(self, result): + self.submitted.append(result) + + async def run(self): + import asyncio + + try: + await asyncio.Event().wait() + except asyncio.CancelledError: + self.cancelled = True + raise + + +async def _lifespan_with_station(monkeypatch, tmp_path, station_yaml): + import egocap_web.app as app_module + + config = tmp_path / "station.yaml" + config.write_text(station_yaml, encoding="utf-8") + monkeypatch.setenv("EGOCAP_STATION_CONFIG", str(config)) + monkeypatch.setattr(app_module, "CaptureStatusMonitor", _FakeMonitor) + monkeypatch.setattr(app_module, "AutoAligner", _FakeAligner) + _FakeAligner.instances.clear() + return app_module + + +async def test_the_lifespan_runs_the_aligner_for_the_index_camera_and_cancels_it_at_shutdown( + monkeypatch, tmp_path +): + import asyncio + + app_module = await _lifespan_with_station( + monkeypatch, + tmp_path, + f"recording:\n data_dir: {tmp_path}/rec\nvideo_sources:\n - type: oak_camera\n name: head\n", + ) + async with app_module.lifespan(app_module.FastAPI()): + (aligner,) = _FakeAligner.instances + await asyncio.sleep(0) # let the worker start so its cancellation is observable + assert aligner.index_source == "head" and aligner.output_root == tmp_path / "rec" + await asyncio.sleep(0) + assert aligner.cancelled + + +async def test_the_chained_callback_runs_the_previous_one_then_queues_for_alignment(monkeypatch, tmp_path): + app_module = await _lifespan_with_station( + monkeypatch, tmp_path, "video_sources:\n - type: oak_camera\n name: head\n" + ) + previous_calls = [] + real_context = app_module.RecordingContext + + def context_with_previous(**kwargs): + context = real_context(**kwargs) + context.coordinator.on_episode_result = previous_calls.append + return context + + monkeypatch.setattr(app_module, "RecordingContext", context_with_previous) + app = app_module.FastAPI() + async with app_module.lifespan(app): + (aligner,) = _FakeAligner.instances + app.state.recording_context.coordinator.on_episode_result("result") + assert previous_calls == ["result"] and aligner.submitted == ["result"] + + +async def test_the_lifespan_starts_no_aligner_when_alignment_is_off(monkeypatch, tmp_path): + app_module = await _lifespan_with_station( + monkeypatch, + tmp_path, + "video_sources:\n - type: oak_camera\n name: head\nalignment:\n enabled: false\n", + ) + async with app_module.lifespan(app_module.FastAPI()): + assert _FakeAligner.instances == [] + + async def test_invalid_3d_view_settings_leave_it_unavailable_and_capture_running(monkeypatch): monkeypatch.setenv("EGOCAP_VISER_ENABLED", "1") monkeypatch.setenv("EGOCAP_VISER_PORT", "not-a-number") diff --git a/examples/egocap/tests/recording/unit/test_align_kept_episode.py b/examples/egocap/tests/recording/unit/test_align_kept_episode.py index e53c176020..e7701110bc 100644 --- a/examples/egocap/tests/recording/unit/test_align_kept_episode.py +++ b/examples/egocap/tests/recording/unit/test_align_kept_episode.py @@ -188,6 +188,18 @@ def test_unqualified_timing_is_refused_and_nothing_is_written(tmp_path, case): assert snapshot(tmp_path / "raw") == before +def test_a_source_with_recorded_rows_missing_from_the_episode_is_refused_and_nothing_is_written(tmp_path, raw): + manifest = make_manifest(raw) + assert manifest.counts["glove"]["written"] > 0 + shutil.rmtree(raw / "episode_0" / "glove") + before = snapshot(raw) + files = tree_files(raw) + with pytest.raises(AlignedWriteError, match="recorded rows are missing"): + align_kept_episode(raw, 0, INDEX, manifest) + assert not (tmp_path / "raw_aligned").exists() + assert tree_files(raw) == files and snapshot(raw) == before + + def test_missing_continuity_is_refused(tmp_path, raw): with pytest.raises(AlignedWriteError): align_kept_episode(raw, 0, INDEX, make_manifest(raw, continuity=None)) @@ -244,9 +256,9 @@ def test_a_written_count_that_differs_from_the_disk_is_refused(tmp_path, raw, de refused(tmp_path, raw, manifest, match="glove: the rows on disk differ") -def test_a_counted_source_absent_from_the_episode_is_not_a_problem(raw): +def test_a_source_that_wrote_no_rows_may_be_absent_from_the_episode(raw): manifest = make_manifest(raw) - manifest.counts["not_recorded"] = {"accepted": 3, "written": 3} + manifest.counts["not_recorded"] = {"accepted": 3, "written": 0} assert check_kept_episode(raw, 0, manifest) == [] diff --git a/examples/egocap/tests/recording/unit/test_aligned_writer.py b/examples/egocap/tests/recording/unit/test_aligned_writer.py index 87259ba911..f0aa165b26 100644 --- a/examples/egocap/tests/recording/unit/test_aligned_writer.py +++ b/examples/egocap/tests/recording/unit/test_aligned_writer.py @@ -184,71 +184,30 @@ def no_link(source, target, *args, **kwargs): ) def test_an_unqualified_or_unlisted_source_refuses_and_writes_nothing(tmp_path, qualified): build_raw(tmp_path / "raw", META["scenarios"]["basic_ds1"]) - with pytest.raises(AlignedWriteError, match="without a qualified event time or a latency"): + with pytest.raises(AlignedWriteError, match="without a qualified event time"): write_aligned_episode( tmp_path / "raw", tmp_path / "aligned", 0, INDEX, qualified=qualified, continuity=clean_continuity() ) assert not (tmp_path / "aligned").exists() -def set_latency(raw, **seconds): - config = yaml.safe_load((raw / "config.yaml").read_text()) - for entry in config["video_sources"] + config["numeric_sources"]: - if entry["name"] in seconds: - entry["latency"] = seconds[entry["name"]] - (raw / "config.yaml").write_text(yaml.safe_dump(config)) - - -def aligned_glove(tmp_path, qualified, **latency): +def test_an_unqualified_source_is_refused_even_when_its_config_declares_a_latency(tmp_path): raw = tmp_path / "raw" build_raw(raw, META["scenarios"]["basic_ds1"]) - set_latency(raw, **latency) - write_aligned_episode(raw, tmp_path / "aligned", 0, INDEX, qualified=qualified, continuity=clean_continuity()) - episode = zarr.open_group(str(tmp_path / "aligned"), mode="r")["episode_0"] - return episode["valid_timestamps"][:], episode["glove"] - - -def test_an_unqualified_source_with_a_latency_is_aligned_on_receive_time_minus_it(tmp_path): - baseline = aligned_glove(tmp_path / "baseline", QUALIFIED) - # Receive time is capture time plus 20 ms for every source, so that latency recovers the capture times. - estimated = aligned_glove(tmp_path / "latency", {**QUALIFIED, "glove": False}, glove=0.02) - np.testing.assert_array_equal(estimated[0], baseline[0]) - for name in baseline[1].array_keys(): - np.testing.assert_array_equal(estimated[1][name][:], baseline[1][name][:]) - - -def test_the_configured_latency_value_moves_the_aligned_source(tmp_path): - baseline = aligned_glove(tmp_path / "baseline", QUALIFIED) - shifted = aligned_glove(tmp_path / "shifted", {**QUALIFIED, "glove": False}, glove=0.05) - differs = [n for n in baseline[1].array_keys() if not np.array_equal(shifted[1][n][:], baseline[1][n][:])] - assert differs - - -def test_a_qualified_source_uses_its_capture_time_even_with_a_latency(tmp_path): - baseline = aligned_glove(tmp_path / "baseline", QUALIFIED) - ignored = aligned_glove(tmp_path / "latency", QUALIFIED, glove=5.0) - np.testing.assert_array_equal(ignored[0], baseline[0]) - for name in baseline[1].array_keys(): - np.testing.assert_array_equal(ignored[1][name][:], baseline[1][name][:]) - - -def test_an_unqualified_index_source_with_a_latency_is_accepted(tmp_path): - raw = tmp_path / "raw" - build_raw(raw, META["scenarios"]["basic_ds1"]) - set_latency(raw, **{INDEX: 0.02}) - write_aligned_episode( - raw, tmp_path / "aligned", 0, INDEX, qualified={**QUALIFIED, INDEX: False}, continuity=clean_continuity() - ) - assert (tmp_path / "aligned" / "episode_0").is_dir() - - -def test_only_sources_with_a_latency_are_listed_by_latencies(): - config = { - "video_sources": [{"name": "cam", "latency": 1}, {"name": "other"}], - "numeric_sources": [{"name": "arm", "latency": 0.5}], - } - assert aligned_writer._latencies(config) == {"cam": 1.0, "arm": 0.5} - assert aligned_writer._latencies({}) == {} + config = yaml.safe_load((raw / "config.yaml").read_text()) + for entry in config["numeric_sources"]: + entry["latency"] = 0.02 + (raw / "config.yaml").write_text(yaml.safe_dump(config)) + with pytest.raises(AlignedWriteError, match="without a qualified event time"): + write_aligned_episode( + raw, + tmp_path / "aligned", + 0, + INDEX, + qualified={**QUALIFIED, "glove": False}, + continuity=clean_continuity(), + ) + assert not (tmp_path / "aligned").exists() def test_a_declared_source_absent_from_the_episode_is_skipped(tmp_path): diff --git a/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py index 574192e6e6..f6eac6663c 100644 --- a/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py +++ b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py @@ -126,8 +126,12 @@ def raw_state(root): return state +def staging_dirs(aligned): + return sorted(aligned.parent.glob(f".{aligned.name}.staging-*")) + + def assert_no_leftovers(aligned): - assert not (aligned.parent / f".{aligned.name}.staging").exists() + assert staging_dirs(aligned) == [] def assert_snapshots_equal(got, want): @@ -251,7 +255,7 @@ def test_a_refused_publication_leaves_the_aligned_session_unchanged(tmp_path, ra assert_snapshots_equal(snapshot(aligned), snap) else: assert not aligned.exists() - assert not (tmp_path / ".aligned.staging").exists() + assert_no_leftovers(aligned) assert raw_state(raw) == raw_before @@ -264,16 +268,6 @@ def test_an_aligned_path_aliasing_the_raw_session_is_refused(tmp_path, raw): assert raw_state(raw) == before -def test_a_staging_path_that_is_the_raw_session_is_refused_and_not_deleted(tmp_path): - raw_named_like_staging = tmp_path / ".aligned.staging" - build_raw(raw_named_like_staging, META["scenarios"]["basic_ds1"]) - before = raw_state(raw_named_like_staging) - with pytest.raises(AlignedWriteError, match="separate"): - publish(raw_named_like_staging, tmp_path / "aligned") - assert raw_state(raw_named_like_staging) == before - assert not (tmp_path / "aligned").exists() - - def test_a_failed_rename_removes_the_staging_tree(tmp_path, raw, monkeypatch): aligned = tmp_path / "aligned" publish(raw, aligned, 1) @@ -293,17 +287,42 @@ def failing_rename(source, target): assert validate_aligned_episode(aligned, 0, INDEX) == [] -def test_a_leftover_staging_tree_is_discarded(tmp_path, raw): +def test_an_unrelated_staging_directory_is_left_alone(tmp_path, raw): + aligned = tmp_path / "aligned" + other = tmp_path / ".aligned.staging-x" + (other / "episode_0").mkdir(parents=True) + (other / "episode_0" / "partial.bin").write_bytes(b"another run's work") + + publish(raw, aligned, 0) + + assert (other / "episode_0" / "partial.bin").read_bytes() == b"another run's work" + assert staging_dirs(aligned) == [other] + assert validate_aligned_episode(aligned, 0, INDEX) == [] + + +def test_each_attempt_stages_in_its_own_directory(tmp_path, raw, monkeypatch): aligned = tmp_path / "aligned" - staging = tmp_path / ".aligned.staging" - (staging / "episode_0").mkdir(parents=True) - (staging / "episode_0" / "junk.bin").write_bytes(b"half written") + seen = [] + real_validate = aligned_writer.validate_aligned_episode + + def record(session, episode, index_source): + seen.append(session) + return real_validate(session, episode, index_source) + monkeypatch.setattr(aligned_writer, "validate_aligned_episode", record) publish(raw, aligned, 0) + publish(raw, aligned, 1) + + assert seen[0] != seen[1] + assert all(path.parent == tmp_path and path.name.startswith(".aligned.staging-") for path in seen) + assert_no_leftovers(aligned) + - assert not staging.exists() - assert not (aligned / "episode_0" / "junk.bin").exists() +def test_a_missing_parent_of_the_aligned_session_is_created(tmp_path, raw): + aligned = tmp_path / "deeper" / "aligned" + publish(raw, aligned, 0) assert validate_aligned_episode(aligned, 0, INDEX) == [] + assert_no_leftovers(aligned) @pytest.mark.parametrize("error", [RuntimeError, KeyboardInterrupt]) @@ -325,7 +344,7 @@ def fail_in_validation(session, episode, index_source): # Staging existed when the failure hit, and nothing of it is left or reached the aligned session. assert seen["staged"] - assert not (tmp_path / ".aligned.staging").exists() + assert_no_leftovers(aligned) assert listing(aligned) == before @@ -340,4 +359,4 @@ def test_a_refused_run_creates_nothing_inside_the_aligned_session(tmp_path, raw) with pytest.raises(AlignedWriteError): publish(raw, tmp_path / "fresh", 0, continuity=None) assert not (tmp_path / "fresh").exists() - assert not (tmp_path / ".fresh.staging").exists() + assert_no_leftovers(tmp_path / "fresh") From 16a8f1e979ea66d357efce4f90ac73d90296a739 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 15:13:49 -0500 Subject: [PATCH 30/38] egocap: re-queue the latest session's unaligned kept episodes at startup Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/backend/egocap_web/app.py | 1 + .../egocap/backend/egocap_web/auto_align.py | 64 ++++++++++--- .../egocap/tests/backend/test_auto_align.py | 92 ++++++++++++++++++- .../egocap/tests/backend/test_viser_scene.py | 5 + 4 files changed, 147 insertions(+), 15 deletions(-) diff --git a/examples/egocap/backend/egocap_web/app.py b/examples/egocap/backend/egocap_web/app.py index adc7c7a679..2ec7ebead2 100644 --- a/examples/egocap/backend/egocap_web/app.py +++ b/examples/egocap/backend/egocap_web/app.py @@ -464,6 +464,7 @@ def on_result(result: EpisodeResult) -> None: aligner.submit(result) coordinator.on_episode_result = on_result + aligner.recover() aligner_task = asyncio.create_task(aligner.run()) visualization: VisualizationScene | None = None try: diff --git a/examples/egocap/backend/egocap_web/auto_align.py b/examples/egocap/backend/egocap_web/auto_align.py index a71e137302..4f19ff58de 100644 --- a/examples/egocap/backend/egocap_web/auto_align.py +++ b/examples/egocap/backend/egocap_web/auto_align.py @@ -14,15 +14,31 @@ import asyncio import logging +from dataclasses import dataclass from pathlib import Path from egocap.recording.aligned_writer import align_kept_episode -from egocap.recording.episode_layout import manifest_path, read_manifest +from egocap.recording.episode_layout import ( + FINALIZATION_KEEP, + MANIFEST_DIR, + destination_path, + manifest_path, + read_manifest, +) from recording_service import Disposition, EpisodeResult logger = logging.getLogger(__name__) +@dataclass(frozen=True) +class _Job: + """One kept episode to align: its recording session, its index there, and where it was kept.""" + + session_id: str + episode_index: int + final: Path + + class AutoAligner: """Aligns kept episodes one at a time on its own worker task.""" @@ -30,29 +46,51 @@ def __init__(self, output_root: Path, index_source: str) -> None: """``output_root`` holds the recording sessions; ``index_source`` is the camera that sets the timeline.""" self._output_root = output_root self._index_source = index_source - self._queue: asyncio.Queue[EpisodeResult] = asyncio.Queue() + self._queue: asyncio.Queue[_Job] = asyncio.Queue() def submit(self, result: EpisodeResult) -> None: """Queue a finished take for alignment; anything other than a kept episode is ignored.""" if result.disposition is Disposition.KEPT and result.final_path is not None: - self._queue.put_nowait(result) + self._queue.put_nowait(_Job(result.session_id, result.episode_index, result.final_path)) + + def recover(self) -> None: + """Queue the latest recording session's kept episodes that have no aligned copy yet. + + An alignment cut short by a restart is picked up here. Only the latest session is looked at, so a + station with a long history does not re-attempt every old episode (many of which cannot be aligned). + """ + sessions = sorted(p for p in self._output_root.glob("*") if (p / MANIFEST_DIR).is_dir()) + for path in sorted((sessions[-1] / MANIFEST_DIR).glob("episode_*.json")) if sessions else []: + try: + manifest = read_manifest(path) + except (OSError, ValueError): + continue + if manifest.storage_phase != "FINALIZED" or manifest.finalization != FINALIZATION_KEEP: + continue + session = path.parent.parent + final = ( + self._output_root / destination_path(manifest.assignment) + if manifest.assignment + else session / manifest.final_path + ) + aligned = final.parent.with_name(f"{final.parent.name}_aligned") / final.name + if not aligned.exists(): + self._queue.put_nowait(_Job(manifest.session_id, manifest.episode_index, final)) async def run(self) -> None: """Align queued episodes until cancelled; a failed alignment is logged and never stops the worker.""" while True: - result = await self._queue.get() + job = await self._queue.get() try: # Blocking file and numeric work, kept off the event loop that serves recording and preview. - await asyncio.to_thread(self._align, result) + await asyncio.to_thread(self._align, job) except Exception as exc: # noqa: BLE001 - one episode's failure must not end the worker - logger.warning("episode %s was not time-aligned: %s", result.episode_id, exc) + logger.warning("%s episode %d was not time-aligned: %s", job.session_id, job.episode_index, exc) - def _align(self, result: EpisodeResult) -> None: + def _align(self, job: _Job) -> None: """Align one kept episode from its stored manifest; raises with the reason when it is refused.""" - final = result.final_path - assert final is not None # The manifest stays in the recording session; a routed episode sits elsewhere, under its slot. - manifest = read_manifest(manifest_path(self._output_root / result.session_id, result.episode_index)) - slot = int(final.name.removeprefix("episode_")) - align_kept_episode(final.parent, slot, self._index_source, manifest) - logger.info("episode %s was time-aligned", result.episode_id) + manifest = read_manifest(manifest_path(self._output_root / job.session_id, job.episode_index)) + slot = int(job.final.name.removeprefix("episode_")) + align_kept_episode(job.final.parent, slot, self._index_source, manifest) + logger.info("%s episode %d was time-aligned", job.session_id, job.episode_index) diff --git a/examples/egocap/tests/backend/test_auto_align.py b/examples/egocap/tests/backend/test_auto_align.py index 0764410e4c..7ac6eacf2f 100644 --- a/examples/egocap/tests/backend/test_auto_align.py +++ b/examples/egocap/tests/backend/test_auto_align.py @@ -10,6 +10,13 @@ import pytest +from egocap.recording.episode_layout import ( + FINALIZATION_KEEP, + FINALIZATION_RETAIN, + EpisodeManifest, + episode_dir_names, + write_manifest, +) from egocap_web import auto_align from egocap_web.auto_align import AutoAligner from recording_service import Disposition, EpisodeResult @@ -89,10 +96,10 @@ def refuse_first(*args): warnings = [r for r in caplog.records if r.levelno == logging.WARNING] assert ( len(warnings) == 1 - and "ep1" in warnings[0].getMessage() + and "session_a episode 1" in warnings[0].getMessage() and "no qualified latency" in warnings[0].getMessage() ) - assert any("ep2 was time-aligned" in r.getMessage() for r in caplog.records) + assert any("session_a episode 2 was time-aligned" in r.getMessage() for r in caplog.records) async def test_cancelling_an_idle_worker_ends_it_cleanly(): @@ -102,3 +109,84 @@ async def test_cancelling_an_idle_worker_ends_it_cleanly(): with pytest.raises(asyncio.CancelledError): await task assert task.cancelled() + + +def _write_session_manifest(output_root, session, index, *, aligned=False, **overrides): + pending, final = episode_dir_names(index) + fields = { + "session_id": session, + "episode_id": f"e{index}", + "episode_index": index, + "config_digest": "d", + "task": "t", + "operator": "o", + "sources": [], + "pending_path": pending, + "final_path": final, + "storage_phase": "FINALIZED", + "finalization": FINALIZATION_KEEP, + } + fields.update(overrides) + (output_root / session).mkdir(parents=True, exist_ok=True) + write_manifest(output_root / session, EpisodeManifest(**fields)) + if aligned: + (output_root / f"{session}_aligned" / final).mkdir(parents=True) + return final + + +def _queued(aligner): + jobs = [] + while not aligner._queue.empty(): + jobs.append(aligner._queue.get_nowait()) + return jobs + + +def test_recover_queues_only_kept_episodes_without_an_aligned_copy(tmp_path): + _write_session_manifest(tmp_path, "s1", 0) + _write_session_manifest(tmp_path, "s1", 1, aligned=True) + _write_session_manifest(tmp_path, "s1", 2, finalization=FINALIZATION_RETAIN) + _write_session_manifest(tmp_path, "s1", 3, storage_phase="WRITING") + aligner = AutoAligner(tmp_path, "head") + aligner.recover() + assert _queued(aligner) == [auto_align._Job("s1", 0, tmp_path / "s1" / episode_dir_names(0)[1])] + + +def test_recover_looks_only_at_the_latest_session(tmp_path): + _write_session_manifest(tmp_path, "s1", 0) + _write_session_manifest(tmp_path, "s2", 0) + aligner = AutoAligner(tmp_path, "head") + aligner.recover() + assert [job.session_id for job in _queued(aligner)] == ["s2"] + + +def test_recover_skips_an_unreadable_manifest_and_keeps_the_rest(tmp_path): + _write_session_manifest(tmp_path, "s1", 1) + (tmp_path / "s1" / auto_align.MANIFEST_DIR / "episode_0.json").write_text("{not json") + aligner = AutoAligner(tmp_path, "head") + aligner.recover() + assert [job.episode_index for job in _queued(aligner)] == [1] + + +def test_recover_uses_the_routed_destination_for_a_routed_episode(tmp_path): + _write_session_manifest(tmp_path, "s1", 0, studio="Lab", assignment={"group": "Lab/20260101", "slot": 4}) + aligner = AutoAligner(tmp_path, "head") + aligner.recover() + assert _queued(aligner) == [auto_align._Job("s1", 0, tmp_path / "Lab/20260101/episode_4")] + + +def test_recover_skips_a_routed_episode_that_is_already_aligned(tmp_path): + _write_session_manifest(tmp_path, "s1", 0, studio="Lab", assignment={"group": "Lab/20260101", "slot": 4}) + (tmp_path / "Lab" / "20260101_aligned" / "episode_4").mkdir(parents=True) + aligner = AutoAligner(tmp_path, "head") + aligner.recover() + assert _queued(aligner) == [] + + +@pytest.mark.parametrize("create_root", [False, True]) +def test_recover_with_no_sessions_queues_nothing(tmp_path, create_root): + root = tmp_path / "out" + if create_root: + root.mkdir() + aligner = AutoAligner(root, "head") + aligner.recover() + assert aligner._queue.empty() diff --git a/examples/egocap/tests/backend/test_viser_scene.py b/examples/egocap/tests/backend/test_viser_scene.py index 113ce99a3e..d02b080483 100644 --- a/examples/egocap/tests/backend/test_viser_scene.py +++ b/examples/egocap/tests/backend/test_viser_scene.py @@ -744,12 +744,16 @@ class _FakeAligner: def __init__(self, output_root, index_source): self.output_root, self.index_source = output_root, index_source self.submitted = [] + self.recovered = False self.cancelled = False _FakeAligner.instances.append(self) def submit(self, result): self.submitted.append(result) + def recover(self): + self.recovered = True + async def run(self): import asyncio @@ -786,6 +790,7 @@ async def test_the_lifespan_runs_the_aligner_for_the_index_camera_and_cancels_it (aligner,) = _FakeAligner.instances await asyncio.sleep(0) # let the worker start so its cancellation is observable assert aligner.index_source == "head" and aligner.output_root == tmp_path / "rec" + assert aligner.recovered await asyncio.sleep(0) assert aligner.cancelled From 99e62f1492facd99f99aeae171576e21e6c8ec05 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 15:24:21 -0500 Subject: [PATCH 31/38] egocap: align reliably at shutdown and recovery; record tracking timing evidence with any media - Close the background aligner after the recorder, so the last kept episode is queued, and bound the wait. - Bound the queue, recover unaligned kept episodes from every session whose evidence allows alignment, skip an already-aligned episode, and log under the isaaccapture hierarchy. - Record the tracking sources' timing evidence from the recording coordinator, whether or not the take has LiveKit video. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/backend/egocap_web/app.py | 9 +- .../egocap/backend/egocap_web/auto_align.py | 88 +++++++++++---- .../backend/egocap_web/livekit_recording.py | 5 +- .../backend/egocap_web/recording_session.py | 13 ++- .../egocap/recording/aligned_writer.py | 13 ++- .../egocap/tests/backend/test_auto_align.py | 106 +++++++++++++++++- .../backend/test_livekit_recording_source.py | 21 ++-- .../tests/backend/test_recording_session.py | 83 ++++++++++++++ .../backend/test_recording_session_livekit.py | 12 +- .../egocap/tests/backend/test_viser_scene.py | 52 ++++++++- .../recording/unit/test_align_kept_episode.py | 21 ++++ 11 files changed, 366 insertions(+), 57 deletions(-) diff --git a/examples/egocap/backend/egocap_web/app.py b/examples/egocap/backend/egocap_web/app.py index 2ec7ebead2..13234c9b4c 100644 --- a/examples/egocap/backend/egocap_web/app.py +++ b/examples/egocap/backend/egocap_web/app.py @@ -94,6 +94,8 @@ # LiveKit stream's decoded frame when that is larger. _INGRESS_QUEUE_BYTES = 64 * 1024 * 1024 _INGRESS_QUEUE_CAPACITY = 4096 +#: How long shutdown waits for queued time alignments before leaving them for the next start. +_ALIGNER_SHUTDOWN_SECONDS = 30.0 # LiveKit frames are decoded RGB (megabytes each, ~15 MB at 2560x1984), so # the JPEG allowance above holds only a few and a short consumer stall would # fail the take. Each recordable stream therefore adds this many of its own @@ -404,7 +406,6 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: livekit_source = LiveKitRecordingSource( lambda: recordable_livekit_streams(monitor.native.started), _recorder_livekit_token, - tracking_latency=resolved_station.latency if resolved_station is not None else None, ) coordinator = RecordingSessionCoordinator( _recording_config_factory( @@ -452,6 +453,7 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: task_file_root=task_file_root, ) # Kept episodes are time-aligned in the background when the station configures an index camera. + aligner: AutoAligner | None = None aligner_task: asyncio.Task[None] | None = None if resolved_station is not None and resolved_station.alignment_index is not None: aligner = AutoAligner(recording_output_root, resolved_station.alignment_index) @@ -481,9 +483,10 @@ def on_result(result: EpisodeResult) -> None: # owner stops -- it still needs the live capture connection to # retire any in-flight take cleanly. An unreleased close is # surfaced, not silently discarded. - if aligner_task is not None: - aligner_task.cancel() close_result = await coordinator.close(final=True) + if aligner is not None and aligner_task is not None: + # After the recorder closed, so its last kept episode is queued; bounded so shutdown is too. + await aligner.close(aligner_task, _ALIGNER_SHUTDOWN_SECONDS) if not close_result.released: logger.error("recording coordinator did not fully release on shutdown: %s", close_result.issues) await monitor.stop() diff --git a/examples/egocap/backend/egocap_web/auto_align.py b/examples/egocap/backend/egocap_web/auto_align.py index 4f19ff58de..ebd04f0e25 100644 --- a/examples/egocap/backend/egocap_web/auto_align.py +++ b/examples/egocap/backend/egocap_web/auto_align.py @@ -6,18 +6,21 @@ One worker handles episodes in the order they were kept, so aligning never competes with itself or with the recording in progress for more than one episode's worth of CPU. An episode that cannot be aligned (for example a -source with no qualified time or latency) is logged with the reason and left as recorded; the raw episode is never -modified, and ``recording/tools/align_episode.py`` aligns it later by hand. +source with no qualified time) is logged with the reason and left as recorded; the raw episode is never modified, +and ``recording/tools/align_episode.py`` aligns it later by hand. Output is published by one rename, so an +alignment cut short by a shutdown or crash leaves no partial result, and :meth:`AutoAligner.recover` picks the +unfinished episodes up again at the next start. """ from __future__ import annotations import asyncio +import contextlib import logging from dataclasses import dataclass from pathlib import Path -from egocap.recording.aligned_writer import align_kept_episode +from egocap.recording.aligned_writer import align_kept_episode, episode_qualification from egocap.recording.episode_layout import ( FINALIZATION_KEEP, MANIFEST_DIR, @@ -27,7 +30,10 @@ ) from recording_service import Disposition, EpisodeResult -logger = logging.getLogger(__name__) +logger = logging.getLogger("isaaccapture.egocap_web.auto_align") + +#: Kept episodes waiting to be aligned. A full queue drops the newest; ``recover`` finds it again at next start. +_QUEUE_LIMIT = 64 @dataclass(frozen=True) @@ -38,6 +44,11 @@ class _Job: episode_index: int final: Path + @property + def aligned(self) -> Path: + """Where this episode's aligned copy goes, beside its group.""" + return self.final.parent.with_name(f"{self.final.parent.name}_aligned") / self.final.name + class AutoAligner: """Aligns kept episodes one at a time on its own worker task.""" @@ -46,36 +57,48 @@ def __init__(self, output_root: Path, index_source: str) -> None: """``output_root`` holds the recording sessions; ``index_source`` is the camera that sets the timeline.""" self._output_root = output_root self._index_source = index_source - self._queue: asyncio.Queue[_Job] = asyncio.Queue() + self._queue: asyncio.Queue[_Job] = asyncio.Queue(_QUEUE_LIMIT) + + def _enqueue(self, job: _Job) -> None: + """Queue a job unless the queue is full, in which case ``recover`` picks it up later.""" + try: + self._queue.put_nowait(job) + except asyncio.QueueFull: + logger.warning( + "%s episode %d was not queued for time alignment: queue full", job.session_id, job.episode_index + ) def submit(self, result: EpisodeResult) -> None: """Queue a finished take for alignment; anything other than a kept episode is ignored.""" if result.disposition is Disposition.KEPT and result.final_path is not None: - self._queue.put_nowait(_Job(result.session_id, result.episode_index, result.final_path)) + self._enqueue(_Job(result.session_id, result.episode_index, result.final_path)) def recover(self) -> None: - """Queue the latest recording session's kept episodes that have no aligned copy yet. + """Queue every kept episode, in any session, that has no aligned copy and whose evidence allows one. - An alignment cut short by a restart is picked up here. Only the latest session is looked at, so a - station with a long history does not re-attempt every old episode (many of which cannot be aligned). + Picks up alignments a restart cut short. An episode recorded without qualified timing evidence (an older + recording, or a station with no latency set) is skipped, so history is not retried at every start. """ - sessions = sorted(p for p in self._output_root.glob("*") if (p / MANIFEST_DIR).is_dir()) - for path in sorted((sessions[-1] / MANIFEST_DIR).glob("episode_*.json")) if sessions else []: + for path in sorted(self._output_root.glob(f"*/{MANIFEST_DIR}/episode_*.json")): try: manifest = read_manifest(path) - except (OSError, ValueError): - continue - if manifest.storage_phase != "FINALIZED" or manifest.finalization != FINALIZATION_KEEP: + session = path.parent.parent + final = ( + self._output_root / destination_path(manifest.assignment) + if manifest.assignment + else session / manifest.final_path + ) + job = _Job(manifest.session_id, manifest.episode_index, final) + eligible = ( + manifest.storage_phase == "FINALIZED" + and manifest.finalization == FINALIZATION_KEEP + and not job.aligned.exists() + and all(episode_qualification(final.parent, int(final.name.removeprefix("episode_"))).values()) + ) + except Exception: # noqa: BLE001, S112 - an unreadable record is simply not eligible continue - session = path.parent.parent - final = ( - self._output_root / destination_path(manifest.assignment) - if manifest.assignment - else session / manifest.final_path - ) - aligned = final.parent.with_name(f"{final.parent.name}_aligned") / final.name - if not aligned.exists(): - self._queue.put_nowait(_Job(manifest.session_id, manifest.episode_index, final)) + if eligible: + self._enqueue(job) async def run(self) -> None: """Align queued episodes until cancelled; a failed alignment is logged and never stops the worker.""" @@ -86,9 +109,28 @@ async def run(self) -> None: await asyncio.to_thread(self._align, job) except Exception as exc: # noqa: BLE001 - one episode's failure must not end the worker logger.warning("%s episode %d was not time-aligned: %s", job.session_id, job.episode_index, exc) + finally: + self._queue.task_done() + + async def close(self, task: asyncio.Task[None], timeout: float) -> None: + """Let the queued episodes finish for up to ``timeout`` seconds, then stop the worker ``task``. + + Call after the recorder has closed, so the last kept episode is already queued. A thread still writing + when the deadline passes cannot be interrupted; it only ever publishes by one rename, and the episode is + recovered at the next start if it did not finish. + """ + try: + await asyncio.wait_for(self._queue.join(), timeout) + except asyncio.TimeoutError: + logger.warning("time alignment still has queued episodes at shutdown; they are retried at next start") + task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await task def _align(self, job: _Job) -> None: """Align one kept episode from its stored manifest; raises with the reason when it is refused.""" + if job.aligned.exists(): + return # The manifest stays in the recording session; a routed episode sits elsewhere, under its slot. manifest = read_manifest(manifest_path(self._output_root / job.session_id, job.episode_index)) slot = int(job.final.name.removeprefix("episode_")) diff --git a/examples/egocap/backend/egocap_web/livekit_recording.py b/examples/egocap/backend/egocap_web/livekit_recording.py index bc258e480a..9516c1f2ee 100644 --- a/examples/egocap/backend/egocap_web/livekit_recording.py +++ b/examples/egocap/backend/egocap_web/livekit_recording.py @@ -71,7 +71,7 @@ } -def _tracking_event_time(latency: Mapping[str, float]) -> dict[str, dict[str, Any]]: +def tracking_event_time(latency: Mapping[str, float]) -> dict[str, dict[str, Any]]: """What each tracking source's saved time is, and whether it is a qualified event time. A source with a configured latency is saved as its host poll time minus that latency: an estimate, marked as @@ -346,9 +346,7 @@ def __init__( first_frame_timeout_s: float = 10.0, join_timeout_s: float = _JOIN_TIMEOUT_S, leave_timeout_s: float = _LEAVE_TIMEOUT_S, - tracking_latency: Mapping[str, float] | None = None, ) -> None: - self._tracking_latency = tracking_latency or {} self._recordable_streams = recordable_streams self._make_token = make_token self._first_frame_timeout_s = first_frame_timeout_s @@ -542,7 +540,6 @@ def timing_evidence(self) -> dict[str, Any] | None: } for s in self._streams }, - **_tracking_event_time(self._tracking_latency), }, # Tracking samples carry the host's poll time for every source; device measurement times are unmapped. "tracking_time": "host_poll", diff --git a/examples/egocap/backend/egocap_web/recording_session.py b/examples/egocap/backend/egocap_web/recording_session.py index 309fa2fba9..28c98fc410 100644 --- a/examples/egocap/backend/egocap_web/recording_session.py +++ b/examples/egocap/backend/egocap_web/recording_session.py @@ -59,6 +59,7 @@ from typing import TYPE_CHECKING, Any, TypeVar from capture_server.client import CameraImage, CaptureFrame +from egocap_web.livekit_recording import tracking_event_time from egocap_web.recording_adapter import RecordingIngress, _convert_raw_item, validate_tracking_descriptor from recording_service import ( CloseResult, @@ -650,11 +651,15 @@ async def _retire_current_ingress(self) -> _IngressRetirement: ingress = self._current_ingress if ingress is None: return _IngressRetirement(settled=True, failure=None) + # What the tracking times are, whatever media the take has: the same latency its conversion applied. + evidence: dict[str, Any] = {"event_time": tracking_event_time(self._tracking_latency)} + if self._livekit_source is not None: + # Read before the room is left: the clock mappings the take was recorded under, merged with the above. + media = self._livekit_source.timing_evidence() + if media is not None: + evidence = {**media, "event_time": {**media.get("event_time", {}), **evidence["event_time"]}} + self._timing_evidence = evidence if self._livekit_source is not None: - # Read before the room is left: the clock mappings the take was recorded under. - evidence = self._livekit_source.timing_evidence() - if evidence is not None: - self._timing_evidence = evidence # The producer stops first, so nothing is offered to an ingress that is draining. await self._livekit_source.stop() settled = await ingress.stop() diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index 19b9008c56..d20c23fc58 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -338,6 +338,14 @@ def _attribute(metadata_file: Path, name: str) -> Any: return None +def episode_qualification(raw_session: Path, episode_index: int) -> dict[str, bool]: + """Which of the session's declared sources the episode's own timing evidence says have a qualified time.""" + config = yaml.safe_load((raw_session / "config.yaml").read_text(encoding="utf-8")) or {} + declared = [e["name"] for section in ("video_sources", "numeric_sources") for e in config.get(section) or []] + timing = dict(zarr.open_group(str(raw_session / f"episode_{episode_index}"), mode="r").attrs).get("timing") + return qualified_sources(timing, declared) + + def align_kept_episode( raw_session: Path, episode_index: int, @@ -357,15 +365,12 @@ def align_kept_episode( problems = check_kept_episode(raw_session, episode_index, manifest) if problems: raise AlignedWriteError("; ".join(problems)) - config = yaml.safe_load((raw_session / "config.yaml").read_text(encoding="utf-8")) or {} - declared = [e["name"] for section in ("video_sources", "numeric_sources") for e in config.get(section) or []] - timing = dict(zarr.open_group(str(raw_session / f"episode_{episode_index}"), mode="r").attrs).get("timing") return publish_aligned_episode( raw_session, aligned_session or raw_session.with_name(f"{raw_session.name}_aligned"), episode_index, index_source, downsample=downsample, - qualified=qualified_sources(timing, declared), + qualified=episode_qualification(raw_session, episode_index), continuity=manifest.continuity, ) diff --git a/examples/egocap/tests/backend/test_auto_align.py b/examples/egocap/tests/backend/test_auto_align.py index 7ac6eacf2f..7a92319b54 100644 --- a/examples/egocap/tests/backend/test_auto_align.py +++ b/examples/egocap/tests/backend/test_auto_align.py @@ -6,9 +6,12 @@ import asyncio import logging +import threading from pathlib import Path import pytest +import yaml +import zarr from egocap.recording.episode_layout import ( FINALIZATION_KEEP, @@ -20,6 +23,7 @@ from egocap_web import auto_align from egocap_web.auto_align import AutoAligner from recording_service import Disposition, EpisodeResult +from tests.recording.unit.test_align_kept_episode import INDEX, build_raw, make_manifest def _result(index=3, disposition=Disposition.KEPT, final_path="default", session_id="session_a"): @@ -111,7 +115,14 @@ async def test_cancelling_an_idle_worker_ends_it_cleanly(): assert task.cancelled() -def _write_session_manifest(output_root, session, index, *, aligned=False, **overrides): +def _write_evidence(group_dir, slot, *, qualified): + group_dir.mkdir(parents=True, exist_ok=True) + (group_dir / "config.yaml").write_text(yaml.safe_dump({"video_sources": [{"name": "head"}]}), encoding="utf-8") + episode = zarr.open_group(str(group_dir / f"episode_{slot}"), mode="w") + episode.attrs["timing"] = {"event_time": {"head": {"qualified": qualified}}} + + +def _write_session_manifest(output_root, session, index, *, aligned=False, qualified=True, **overrides): pending, final = episode_dir_names(index) fields = { "session_id": session, @@ -129,8 +140,13 @@ def _write_session_manifest(output_root, session, index, *, aligned=False, **ove fields.update(overrides) (output_root / session).mkdir(parents=True, exist_ok=True) write_manifest(output_root / session, EpisodeManifest(**fields)) + assignment = fields.get("assignment") + group = output_root / assignment["group"] if assignment else output_root / session + slot = assignment["slot"] if assignment else index + if qualified is not None: + _write_evidence(group, slot, qualified=qualified) if aligned: - (output_root / f"{session}_aligned" / final).mkdir(parents=True) + (group.with_name(f"{group.name}_aligned") / f"episode_{slot}").mkdir(parents=True) return final @@ -151,12 +167,28 @@ def test_recover_queues_only_kept_episodes_without_an_aligned_copy(tmp_path): assert _queued(aligner) == [auto_align._Job("s1", 0, tmp_path / "s1" / episode_dir_names(0)[1])] -def test_recover_looks_only_at_the_latest_session(tmp_path): +def test_recover_queues_older_sessions_work_even_when_the_newest_session_is_empty(tmp_path): _write_session_manifest(tmp_path, "s1", 0) _write_session_manifest(tmp_path, "s2", 0) + (tmp_path / "s3" / auto_align.MANIFEST_DIR).mkdir(parents=True) + aligner = AutoAligner(tmp_path, "head") + aligner.recover() + assert [job.session_id for job in _queued(aligner)] == ["s1", "s2"] + + +def test_recover_skips_an_episode_whose_timing_is_not_qualified(tmp_path): + _write_session_manifest(tmp_path, "s1", 0, qualified=False) + _write_session_manifest(tmp_path, "s1", 1) + aligner = AutoAligner(tmp_path, "head") + aligner.recover() + assert [job.episode_index for job in _queued(aligner)] == [1] + + +def test_recover_skips_an_episode_with_no_readable_evidence(tmp_path): + _write_session_manifest(tmp_path, "s1", 0, qualified=None) aligner = AutoAligner(tmp_path, "head") aligner.recover() - assert [job.session_id for job in _queued(aligner)] == ["s2"] + assert aligner._queue.empty() def test_recover_skips_an_unreadable_manifest_and_keeps_the_rest(tmp_path): @@ -175,8 +207,9 @@ def test_recover_uses_the_routed_destination_for_a_routed_episode(tmp_path): def test_recover_skips_a_routed_episode_that_is_already_aligned(tmp_path): - _write_session_manifest(tmp_path, "s1", 0, studio="Lab", assignment={"group": "Lab/20260101", "slot": 4}) - (tmp_path / "Lab" / "20260101_aligned" / "episode_4").mkdir(parents=True) + _write_session_manifest( + tmp_path, "s1", 0, aligned=True, studio="Lab", assignment={"group": "Lab/20260101", "slot": 4} + ) aligner = AutoAligner(tmp_path, "head") aligner.recover() assert _queued(aligner) == [] @@ -190,3 +223,64 @@ def test_recover_with_no_sessions_queues_nothing(tmp_path, create_root): aligner = AutoAligner(root, "head") aligner.recover() assert aligner._queue.empty() + + +def test_a_full_queue_drops_the_newest_with_a_warning_instead_of_raising(monkeypatch, caplog): + monkeypatch.setattr(auto_align, "_QUEUE_LIMIT", 1) + aligner = AutoAligner(Path("/out"), "head") + aligner.submit(_result(index=1)) + with caplog.at_level(logging.WARNING, logger="isaaccapture.egocap_web.auto_align"): + aligner.submit(_result(index=2)) + assert [job.episode_index for job in _queued(aligner)] == [1] + assert "episode 2 was not queued" in caplog.text and "queue full" in caplog.text + + +def test_the_logger_is_in_the_isaaccapture_tree(): + assert auto_align.logger.name == "isaaccapture.egocap_web.auto_align" + + +async def test_an_episode_that_already_has_an_aligned_copy_is_not_aligned_again(calls, tmp_path): + aligned = tmp_path / "group_aligned" / "episode_7" + aligned.mkdir(parents=True) + aligner = AutoAligner(tmp_path, "head") + aligner.submit(_result(final_path=tmp_path / "group" / "episode_7")) + await _drain(aligner) + assert calls == [] + + +async def test_a_recovered_episode_is_aligned_for_real_and_its_aligned_copy_appears(tmp_path): + session = tmp_path / "out" / "s1" + build_raw(session) + write_manifest(session, make_manifest(session, session_id="s1")) + aligner = AutoAligner(tmp_path / "out", INDEX) + aligner.recover() + assert aligner._queue.qsize() == 1 + task = asyncio.create_task(aligner.run()) + await aligner.close(task, 60) + assert (tmp_path / "out" / "s1_aligned" / "episode_0").is_dir() + assert task.cancelled() + + +async def test_close_waits_for_queued_episodes_before_stopping_the_worker(calls): + aligner = AutoAligner(Path("/out"), "head") + aligner.submit(_result(index=1)) + aligner.submit(_result(index=2)) + task = asyncio.create_task(aligner.run()) + await aligner.close(task, 5) + assert len(calls) == 2 and task.cancelled() + + +async def test_close_with_a_blocked_job_warns_after_the_timeout_and_cancels_the_worker(calls, monkeypatch, caplog): + release = threading.Event() + monkeypatch.setattr(auto_align, "align_kept_episode", lambda *args: release.wait(5)) + aligner = AutoAligner(Path("/out"), "head") + aligner.submit(_result()) + task = asyncio.create_task(aligner.run()) + await asyncio.sleep(0.05) + try: + with caplog.at_level(logging.WARNING, logger=auto_align.logger.name): + await aligner.close(task, 0.1) + finally: + release.set() + assert task.cancelled() + assert "still has queued episodes" in caplog.text diff --git a/examples/egocap/tests/backend/test_livekit_recording_source.py b/examples/egocap/tests/backend/test_livekit_recording_source.py index 7fccea2baa..32036d6b23 100644 --- a/examples/egocap/tests/backend/test_livekit_recording_source.py +++ b/examples/egocap/tests/backend/test_livekit_recording_source.py @@ -482,8 +482,6 @@ async def test_timing_evidence_describes_the_mappings_the_take_was_placed_under( "event_time": { "cam16": {"meaning": "sensor_capture", "qualified": True}, "cam17": {"meaning": "frame_ready", "qualified": False}, - "pico_controller": {"meaning": "host_poll_time", "qualified": False}, - "manus_glove": {"meaning": "host_poll_time", "qualified": False}, }, "tracking_time": "host_poll", "tracking_semantics": lrec._TRACKING_SEMANTICS, @@ -500,17 +498,13 @@ async def test_event_time_is_keyed_by_recorded_source_and_qualifies_only_sensor_ assert {k: v["qualified"] for k, v in event_time.items()} == { "cam16": True, "cam17": False, - "pico_controller": False, - "manus_glove": False, } assert event_time["cam16"]["meaning"] == "sensor_capture" and event_time["cam17"]["meaning"] == "frame_ready" assert 16 not in event_time and 17 not in event_time -async def test_a_tracking_latency_makes_that_source_a_marked_estimate_and_others_stay_unqualified(): - source, receiver = await prepared_source([livekit_stream(16)], tracking_latency={"pico_controller": 0.02}) - receiver.clock_sync = clock_sync_with(history_of(1)) - event_time = source.timing_evidence()["event_time"] +def test_a_tracking_latency_makes_that_source_a_marked_estimate_and_others_stay_unqualified(): + event_time = lrec.tracking_event_time({"pico_controller": 0.02}) assert event_time["pico_controller"] == { "meaning": "host_poll_minus_latency", "estimated": True, @@ -520,6 +514,17 @@ async def test_a_tracking_latency_makes_that_source_a_marked_estimate_and_others assert event_time["manus_glove"] == {"meaning": "host_poll_time", "qualified": False} +def test_a_zero_latency_is_still_a_qualified_estimate(): + assert lrec.tracking_event_time({"manus_glove": 0.0})["manus_glove"]["latency_s"] == 0.0 + assert lrec.tracking_event_time({"manus_glove": 0.0})["manus_glove"]["qualified"] is True + + +async def test_the_sources_timing_evidence_lists_only_its_cameras_not_tracking(): + source, receiver = await prepared_source([livekit_stream(16)]) + receiver.clock_sync = clock_sync_with(history_of(1)) + assert set(source.timing_evidence()["event_time"]) == {"cam16"} + + async def test_timing_evidence_records_the_configured_uncertainty_budget(monkeypatch): monkeypatch.setenv(lrec.BUDGET_ENV, "2.5") source, receiver = await prepared_source([livekit_stream(16)]) diff --git a/examples/egocap/tests/backend/test_recording_session.py b/examples/egocap/tests/backend/test_recording_session.py index a61b43f17f..68dc2c6377 100644 --- a/examples/egocap/tests/backend/test_recording_session.py +++ b/examples/egocap/tests/backend/test_recording_session.py @@ -770,3 +770,86 @@ def capture_convert(*args, **kwargs): times = {s.source: s.capture_time for s in converters[-1](frame)} assert times["pico_controller"] == pytest.approx(4.98) and times["manus_glove"] == 5.0 await coordinator.close() + + +class _MediaSource: + def __init__(self, evidence): + self.evidence = evidence + + async def prepare(self): + pass + + def start(self, ingress, on_failure): + pass + + async def stop(self): + pass + + def timing_evidence(self): + return self.evidence + + +async def _kept_timing(tmp_path: Path, *, latency=None, livekit_source=None): + coordinator = RecordingSessionCoordinator( + make_config_factory(tmp_path, numeric_sources=(PICO_CONTROLLER_SPEC, MANUS_GLOVE_SPEC), latency=latency), + queue_capacity=8, + readiness_check=ALWAYS_READY, + livekit_source=livekit_source, + ) + await coordinator.open() + coordinator.set_task("t") + episode = await coordinator.start_episode() + coordinator.on_capture_frame(_fake_tracking_frame(capture_time_ns=5_000_000_000)) + result = await coordinator.stop_episode(episode.episode_id) + await coordinator.close() + group = zarr.open_group(str(result.final_path), mode="r") + return dict(group.attrs).get("timing"), group + + +async def test_a_configured_latency_is_recorded_as_a_qualified_estimate_matching_the_stored_times(tmp_path: Path): + timing, group = await _kept_timing(tmp_path, latency={"pico_controller": 0.02, "manus_glove": 0.0}) + assert timing["event_time"] == { + "pico_controller": { + "meaning": "host_poll_minus_latency", + "estimated": True, + "latency_s": 0.02, + "qualified": True, + }, + "manus_glove": { + "meaning": "host_poll_minus_latency", + "estimated": True, + "latency_s": 0.0, + "qualified": True, + }, + } + assert group["pico_controller"]["capture_time"][0] == pytest.approx(4.98) + assert group["manus_glove"]["capture_time"][0] == pytest.approx(5.0) + + +async def test_a_missing_latency_is_recorded_as_an_unqualified_host_poll_time(tmp_path: Path): + timing, _ = await _kept_timing(tmp_path) + assert timing["event_time"] == { + "pico_controller": {"meaning": "host_poll_time", "qualified": False}, + "manus_glove": {"meaning": "host_poll_time", "qualified": False}, + } + + +async def test_tracking_timing_is_recorded_when_the_media_source_has_no_evidence(tmp_path: Path): + timing, _ = await _kept_timing(tmp_path, latency={"pico_controller": 0.02}, livekit_source=_MediaSource(None)) + assert timing["event_time"]["pico_controller"]["qualified"] is True + assert timing["event_time"]["manus_glove"]["qualified"] is False + + +async def test_tracking_timing_is_merged_with_the_media_evidence_and_keeps_its_cameras(tmp_path: Path): + media = { + "clock_mapping": {"mappings": []}, + "event_time": { + "cam16": {"meaning": "sensor_capture", "qualified": True}, + "pico_controller": {"meaning": "stale", "qualified": False}, + }, + } + timing, _ = await _kept_timing(tmp_path, latency={"pico_controller": 0.02}, livekit_source=_MediaSource(media)) + assert timing["clock_mapping"] == {"mappings": []} + assert timing["event_time"]["cam16"] == {"meaning": "sensor_capture", "qualified": True} + assert timing["event_time"]["pico_controller"]["meaning"] == "host_poll_minus_latency" + assert timing["event_time"]["manus_glove"] == {"meaning": "host_poll_time", "qualified": False} diff --git a/examples/egocap/tests/backend/test_recording_session_livekit.py b/examples/egocap/tests/backend/test_recording_session_livekit.py index 314a4581e6..97b2b61117 100644 --- a/examples/egocap/tests/backend/test_recording_session_livekit.py +++ b/examples/egocap/tests/backend/test_recording_session_livekit.py @@ -186,7 +186,11 @@ async def test_the_sources_timing_evidence_is_given_to_the_service_once_before_s tmp_path, monkeypatch ): events: list[str] = [] - first = {"clock_mapping": {"mappings": [1]}} + first = {"clock_mapping": {"mappings": [1]}, "event_time": {"cam16": {"qualified": True}}} + tracking = { + "pico_controller": {"meaning": "host_poll_time", "qualified": False}, + "manus_glove": {"meaning": "host_poll_time", "qualified": False}, + } calls = spy_on_service(monkeypatch, events) coordinator = make_coordinator(tmp_path, EvidenceSource(events, [first, None])) await coordinator.open() @@ -194,12 +198,14 @@ async def test_the_sources_timing_evidence_is_given_to_the_service_once_before_s one = await coordinator.start_episode() await coordinator.stop_episode(one.episode_id) - assert calls == [(one.episode_id, first)] + merged = {**first, "event_time": {**first["event_time"], **tracking}} + assert calls == [(one.episode_id, merged)] assert events.index("timing_evidence") < events.index("set_timing") < events.index("stop_episode") two = await coordinator.start_episode() await coordinator.stop_episode(two.episode_id) - assert calls == [(one.episode_id, first)] # the second take's source had none; nothing carried over + # the second take's source had none: only its tracking times are recorded, nothing carried over + assert calls[1:] == [(two.episode_id, {"event_time": tracking})] await coordinator.close() diff --git a/examples/egocap/tests/backend/test_viser_scene.py b/examples/egocap/tests/backend/test_viser_scene.py index d02b080483..5ac6fae795 100644 --- a/examples/egocap/tests/backend/test_viser_scene.py +++ b/examples/egocap/tests/backend/test_viser_scene.py @@ -746,6 +746,7 @@ def __init__(self, output_root, index_source): self.submitted = [] self.recovered = False self.cancelled = False + self.closed_with = None _FakeAligner.instances.append(self) def submit(self, result): @@ -763,6 +764,14 @@ async def run(self): self.cancelled = True raise + async def close(self, task, timeout): + import asyncio + + self.closed_with = timeout + task.cancel() + with pytest.raises(asyncio.CancelledError): + await task + async def _lifespan_with_station(monkeypatch, tmp_path, station_yaml): import egocap_web.app as app_module @@ -791,8 +800,7 @@ async def test_the_lifespan_runs_the_aligner_for_the_index_camera_and_cancels_it await asyncio.sleep(0) # let the worker start so its cancellation is observable assert aligner.index_source == "head" and aligner.output_root == tmp_path / "rec" assert aligner.recovered - await asyncio.sleep(0) - assert aligner.cancelled + assert aligner.cancelled and aligner.closed_with == app_module._ALIGNER_SHUTDOWN_SECONDS async def test_the_chained_callback_runs_the_previous_one_then_queues_for_alignment(monkeypatch, tmp_path): @@ -815,6 +823,46 @@ def context_with_previous(**kwargs): assert previous_calls == ["result"] and aligner.submitted == ["result"] +async def test_a_kept_result_emitted_while_the_recorder_closes_is_aligned_before_the_aligner_closes( + monkeypatch, tmp_path +): + app_module = await _lifespan_with_station( + monkeypatch, tmp_path, "video_sources:\n - type: oak_camera\n name: head\n" + ) + from recording_service import Disposition, EpisodeResult + + last = EpisodeResult( + session_id="s", + episode_id="e", + episode_index=0, + disposition=Disposition.KEPT, + final_path=tmp_path / "episode_0", + pending_path=None, + counts=(), + duration_seconds=1.0, + quality=None, + ) + events = [] + real_close = app_module.RecordingSessionCoordinator.close + + async def close_after_a_last_result(self, *args, **kwargs): + self.on_episode_result(last) + events.append("coordinator closed") + return await real_close(self, *args, **kwargs) + + monkeypatch.setattr(app_module.RecordingSessionCoordinator, "close", close_after_a_last_result) + async with app_module.lifespan(app_module.FastAPI()): + (aligner,) = _FakeAligner.instances + original_close = aligner.close + + async def recording_close(task, timeout): + events.append(f"aligner closed with {len(aligner.submitted)} result") + await original_close(task, timeout) + + aligner.close = recording_close + assert events == ["coordinator closed", "aligner closed with 1 result"] + + async def test_the_lifespan_starts_no_aligner_when_alignment_is_off(monkeypatch, tmp_path): app_module = await _lifespan_with_station( monkeypatch, diff --git a/examples/egocap/tests/recording/unit/test_align_kept_episode.py b/examples/egocap/tests/recording/unit/test_align_kept_episode.py index e7701110bc..c519a06a23 100644 --- a/examples/egocap/tests/recording/unit/test_align_kept_episode.py +++ b/examples/egocap/tests/recording/unit/test_align_kept_episode.py @@ -16,6 +16,7 @@ AlignedWriteError, align_kept_episode, check_kept_episode, + episode_qualification, publish_aligned_episode, ) from egocap.recording.episode_layout import ( @@ -434,3 +435,23 @@ def test_cli_refuses_a_manifest_that_does_not_bind(tmp_path, raw, capsys): assert run_cli(raw, "--episode", 0, "--index-source", INDEX) == 1 assert "episode id differs" in capsys.readouterr().err assert not (tmp_path / "raw_aligned").exists() + + +def test_qualification_reports_each_declared_source_from_the_episodes_own_timing(tmp_path): + timing = {"event_time": {"head_camera": {"qualified": True}, "pico_controller": {"qualified": False}}} + build_raw(tmp_path / "raw", timing=timing) + assert episode_qualification(tmp_path / "raw", 1) == { + "head_camera": True, + "wrist_camera": False, + "pico_controller": False, + "glove": False, + } + + +def test_qualification_is_false_for_every_source_when_the_episode_has_no_timing(tmp_path): + build_raw(tmp_path / "raw", timing=None) + assert set(episode_qualification(tmp_path / "raw", 0).values()) == {False} + + +def test_qualification_covers_every_declared_source_when_all_are_qualified(raw): + assert episode_qualification(raw, 0) == dict.fromkeys(SOURCES, True) From 5bcc7e1d6e9b3f664041cc44858592284fa374e9 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 15:24:21 -0500 Subject: [PATCH 32/38] capture-server: add synthetic controller and glove delay to the mock --controller-delay-ms, --glove-delay-ms and --delay-jitter-ms make a source's content that old at the poll (seeded bounded jitter), so a configured latency can be checked against a known truth. Mock-only; default is no delay. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../capture_server/capture_server/launch.py | 10 ++- .../capture_server/mock/mock_isaac_capture.py | 24 +++++- .../capture_server/capture_server/server.py | 25 +++++- .../egocap/tests/capture_server/test_cli.py | 17 ++++ .../tests/capture_server/test_mock_sdks.py | 81 +++++++++++++++++++ .../capture_server/test_setup_selection.py | 21 +++++ 6 files changed, 171 insertions(+), 7 deletions(-) diff --git a/examples/egocap/capture_server/capture_server/launch.py b/examples/egocap/capture_server/capture_server/launch.py index 234ba35311..0a6a403685 100644 --- a/examples/egocap/capture_server/capture_server/launch.py +++ b/examples/egocap/capture_server/capture_server/launch.py @@ -125,6 +125,7 @@ def build_mock_source_factory( seed: int, ic_faults: set[str] | frozenset[str] = frozenset(), camera_faults: set[str] | frozenset[str] = frozenset(), + delays: dict[str, float] | None = None, ) -> SourceFactory: """The default ``CaptureServer`` source factory, wired to the two mock SDK files. ``ic_faults``/``camera_faults`` are captured here, once, @@ -141,7 +142,11 @@ def source_factory(begin: p.BeginRequest, cameras: tuple[p.CameraStreamConfig, . begin, sdk=mock_isaac_capture, session_factory=partial( - mock_isaac_capture.TeleopSession, scenario=scenario, seed=seed, faults=set(ic_faults) + mock_isaac_capture.TeleopSession, + scenario=scenario, + seed=seed, + faults=set(ic_faults), + **(delays or {}), ), ) @@ -409,6 +414,7 @@ def build_source_factory( scenario: str = "demo", seed: int = 0, faults: frozenset[str] = frozenset(), + delays: dict[str, float] | None = None, ) -> SourceFactory: """Select the acquisition implementation once, from ``config.mock``. @@ -422,5 +428,5 @@ def build_source_factory( if scenario not in SCENARIOS: raise ValueError(f"unknown mock scenario {scenario!r}; choose one of {', '.join(SCENARIOS)}") return build_mock_source_factory( - scenario=scenario, seed=seed, ic_faults=set(faults), camera_faults=set(faults) + scenario=scenario, seed=seed, ic_faults=set(faults), camera_faults=set(faults), delays=delays ) diff --git a/examples/egocap/capture_server/capture_server/mock/mock_isaac_capture.py b/examples/egocap/capture_server/capture_server/mock/mock_isaac_capture.py index 4eb74dfdbf..940ab0f26d 100644 --- a/examples/egocap/capture_server/capture_server/mock/mock_isaac_capture.py +++ b/examples/egocap/capture_server/capture_server/mock/mock_isaac_capture.py @@ -60,6 +60,7 @@ from __future__ import annotations import math +import random from dataclasses import dataclass, field from enum import Enum, IntEnum from functools import lru_cache @@ -682,9 +683,17 @@ def __init__( seed: int = 0, faults: set[str] | frozenset[str] | None = None, clock: Clock | None = None, + controller_delay_s: float = 0.0, + glove_delay_s: float = 0.0, + delay_jitter_s: float = 0.0, ) -> None: self.config = config self.frame_count = 0 + # Synthetic device-to-host delay: a source's content is what the operator was doing this long before the + # poll, plus seeded bounded jitter, so a configured latency can be checked against a known truth. + self._delays = {"controller": controller_delay_s, "glove": glove_delay_s} + self._jitter_s = delay_jitter_s + self._delay_rng = random.Random(seed) self._operator = _Operator(scenario=scenario, seed=seed) self._faults: set[str] = set(faults) if faults else set() self._clock = clock or MonotonicClock() @@ -749,6 +758,11 @@ def _elapsed(self) -> float: self._frozen_t = None return now - self._enter_t0 + def _delayed(self, t: float, source: str) -> float: + """The instant ``source``'s content is from: ``t`` less its synthetic delay and jitter, never before 0.""" + jitter = self._delay_rng.uniform(-self._jitter_s, self._jitter_s) if self._jitter_s else 0.0 + return max(0.0, t - max(0.0, self._delays[source] + jitter)) + def step( self, *, @@ -771,8 +785,12 @@ def step( raise RuntimeError("mock fatal_acquisition_error fault: acquisition worker exited") t = self._elapsed() - head_pose, left_hand, right_hand = self._operator.core(t) - inputs = self._operator.inputs(t) + head_pose, _, _ = self._operator.core(t) + # Each source reads the operator at its own delayed instant (the head is not delayed). + t_controller, t_glove = self._delayed(t, "controller"), self._delayed(t, "glove") + _, left_ctrl, right_ctrl = self._operator.core(t_controller) + _, left_hand, right_hand = self._operator.core(t_glove) + inputs = self._operator.inputs(t_controller) result: dict[str, OptionalTensorGroup] = {} for leaf_key, (source_node, selector) in self.config.pipeline.outputs.items(): @@ -786,7 +804,7 @@ def step( # all (which would simply not appear in this dict). result[leaf_key] = OptionalTensorGroup(len(ControllerInputIndex)) continue - hand = left_hand if side == "left" else right_hand + hand = left_ctrl if side == "left" else right_ctrl valid = "controller_pose_invalid" not in self._faults result[leaf_key] = self._controller_group(hand, inputs, side, valid=valid) elif isinstance(source_node, HandsSource): diff --git a/examples/egocap/capture_server/capture_server/server.py b/examples/egocap/capture_server/capture_server/server.py index 2c1ede6191..b710767a9e 100644 --- a/examples/egocap/capture_server/capture_server/server.py +++ b/examples/egocap/capture_server/capture_server/server.py @@ -2036,6 +2036,12 @@ def _build_arg_parser() -> argparse.ArgumentParser: parser.add_argument("--seed", type=int, default=_MOCK_DEFAULTS["seed"], help="mock only") parser.add_argument("--scenario", default=_MOCK_DEFAULTS["scenario"], help="mock only") parser.add_argument("--connect-delay", type=float, default=_MOCK_DEFAULTS["connect_delay"], help="mock only") + for flag, help_text in ( + ("controller-delay-ms", "controller content is this old at the poll"), + ("glove-delay-ms", "glove content is this old at the poll"), + ("delay-jitter-ms", "seeded +/- jitter on both delays"), + ): + parser.add_argument(f"--{flag}", type=float, default=0.0, help=f"mock only: synthetic delay, {help_text}") parser.add_argument( "--fault", action="append", @@ -2124,7 +2130,14 @@ def _station_cameras(args: argparse.Namespace) -> dict[str, StationCamera] | Non # Defaults of the mock-only CLI options; any other value with real acquisition is an error. -_MOCK_DEFAULTS = {"seed": 0, "scenario": "demo", "connect_delay": 0.0} +_MOCK_DEFAULTS = { + "seed": 0, + "scenario": "demo", + "connect_delay": 0.0, + "controller_delay_ms": 0.0, + "glove_delay_ms": 0.0, + "delay_jitter_ms": 0.0, +} def _mock_only_options_used(args: argparse.Namespace) -> list[str]: @@ -2245,7 +2258,15 @@ async def _run_cli(args: argparse.Namespace) -> int: ) # The one place the implementation is chosen, before any session is accepted. source_factory = build_source_factory( - config, scenario=args.scenario, seed=args.seed, faults=frozenset(args.fault) + config, + scenario=args.scenario, + seed=args.seed, + faults=frozenset(args.fault), + delays={ + "controller_delay_s": args.controller_delay_ms / 1000, + "glove_delay_s": args.glove_delay_ms / 1000, + "delay_jitter_s": args.delay_jitter_ms / 1000, + }, ) if args.livekit_streams is not None: from .livekit_streams import load_livekit_streams diff --git a/examples/egocap/tests/capture_server/test_cli.py b/examples/egocap/tests/capture_server/test_cli.py index 3ff524c6f3..2dfec3cd9c 100644 --- a/examples/egocap/tests/capture_server/test_cli.py +++ b/examples/egocap/tests/capture_server/test_cli.py @@ -28,6 +28,23 @@ def test_mock_only_options_are_rejected_with_real_acquisition(capsys): assert "only apply with --mock" in capsys.readouterr().err +def test_delay_options_are_rejected_without_mock(capsys): + for flags in (["--controller-delay-ms", "5"], ["--glove-delay-ms", "5"], ["--delay-jitter-ms", "5"]): + with pytest.raises(SystemExit) as excinfo: + main(flags) + assert excinfo.value.code == 2 + assert "only apply with --mock" in capsys.readouterr().err + + +def test_delay_options_are_parsed_in_milliseconds_and_default_to_zero(): + defaults = _build_arg_parser().parse_args(["--mock"]) + assert (defaults.controller_delay_ms, defaults.glove_delay_ms, defaults.delay_jitter_ms) == (0.0, 0.0, 0.0) + args = _build_arg_parser().parse_args( + ["--mock", "--controller-delay-ms", "120", "--glove-delay-ms", "45.5", "--delay-jitter-ms", "8"] + ) + assert (args.controller_delay_ms, args.glove_delay_ms, args.delay_jitter_ms) == (120.0, 45.5, 8.0) + + def test_arg_parser_defaults(): args = _build_arg_parser().parse_args(["--mock"]) assert args.host == "127.0.0.1" diff --git a/examples/egocap/tests/capture_server/test_mock_sdks.py b/examples/egocap/tests/capture_server/test_mock_sdks.py index f2b8c76e26..ba8d6ce0ba 100644 --- a/examples/egocap/tests/capture_server/test_mock_sdks.py +++ b/examples/egocap/tests/capture_server/test_mock_sdks.py @@ -216,6 +216,87 @@ def monotonic(self) -> float: np.testing.assert_array_equal(a["head"][HeadInputIndex.POSITION], b["head"][HeadInputIndex.POSITION]) +class _SettableClock: + def __init__(self) -> None: + self.now = 0.0 + + def monotonic(self) -> float: + return self.now + + +def _step_at(elapsed: float, **delays): + clock = _SettableClock() + with mic.TeleopSession(_full_config(), scenario="demo", seed=2, clock=clock, **delays) as session: + clock.now = elapsed + return session.step() + + +def _controller_position(result): + return result["controller_left"][ControllerInputIndex.GRIP_POSITION] + + +def _hand_positions(result): + return result["hand_left"][HandInputIndex.JOINT_POSITIONS] + + +def _head_position(result): + return result["head"][HeadInputIndex.POSITION] + + +def _equal(a, b): + np.testing.assert_allclose(a, b, atol=1e-12) + + +def test_zero_delay_output_matches_the_session_built_without_delay_options(): + plain, zero = _step_at(5.0), _step_at(5.0, controller_delay_s=0.0, glove_delay_s=0.0, delay_jitter_s=0.0) + for read in (_head_position, _controller_position, _hand_positions): + _equal(read(plain), read(zero)) + for index in ControllerInputIndex: + _equal(plain["controller_right"][index], zero["controller_right"][index]) + + +def test_a_delayed_controller_shows_the_pose_from_the_delay_earlier_and_the_head_is_unchanged(): + delayed, earlier, now = _step_at(5.0, controller_delay_s=0.3), _step_at(4.7), _step_at(5.0) + _equal(_controller_position(delayed), _controller_position(earlier)) + assert not np.allclose(_controller_position(delayed), _controller_position(now)) + _equal(_head_position(delayed), _head_position(now)) + + +def test_the_glove_and_controller_delays_are_independent(): + glove_only = _step_at(5.0, glove_delay_s=0.3) + controller_only = _step_at(5.0, controller_delay_s=0.3) + now, earlier = _step_at(5.0), _step_at(4.7) + _equal(_hand_positions(glove_only), _hand_positions(earlier)) + _equal(_controller_position(glove_only), _controller_position(now)) + _equal(_controller_position(controller_only), _controller_position(earlier)) + _equal(_hand_positions(controller_only), _hand_positions(now)) + + +def _entered_session(**delays): + session = mic.TeleopSession(_full_config(), scenario="demo", seed=7, clock=_SettableClock(), **delays) + return session.__enter__() + + +def test_jitter_is_deterministic_for_a_seed_and_bounded_by_the_jitter(): + kwargs = {"controller_delay_s": 0.2, "delay_jitter_s": 0.05} + session_a, session_b = _entered_session(**kwargs), _entered_session(**kwargs) + a = [session_a._delayed(10.0, "controller") for _ in range(50)] + b = [session_b._delayed(10.0, "controller") for _ in range(50)] + assert a == b + assert len(set(a)) > 1 + assert all(10.0 - 0.25 - 1e-9 <= value <= 10.0 - 0.15 + 1e-9 for value in a) + + +def test_a_delay_never_reaches_before_the_start_of_the_session(): + session = _entered_session(controller_delay_s=0.01, glove_delay_s=5.0, delay_jitter_s=0.5) + assert all(session._delayed(0.1, "controller") >= 0.0 for _ in range(50)) + assert session._delayed(1.0, "glove") == 0.0 + + +def test_a_source_without_a_delay_reads_the_current_instant_exactly(): + assert _entered_session(controller_delay_s=0.2)._delayed(3.0, "glove") == 3.0 + + def test_startup_error_fault_raises_on_enter(): session = mic.TeleopSession(_full_config(), scenario="demo", seed=0, faults={"startup_error"}) with pytest.raises(RuntimeError, match="startup_error"): diff --git a/examples/egocap/tests/capture_server/test_setup_selection.py b/examples/egocap/tests/capture_server/test_setup_selection.py index 87c4e6f590..71ce640513 100644 --- a/examples/egocap/tests/capture_server/test_setup_selection.py +++ b/examples/egocap/tests/capture_server/test_setup_selection.py @@ -126,3 +126,24 @@ def test_real_setup_never_loads_the_mock_sdk_files(): "print('OK')\n" ) assert result.returncode == 0 and "OK" in result.stdout, result.stderr + + +async def test_configured_delays_reach_the_mock_session(monkeypatch): + from capture_server.mock import mock_isaac_capture + + seen = {} + + class RecordingSession(mock_isaac_capture.TeleopSession): + def __init__(self, *args, **kwargs): + seen.update(kwargs) + super().__init__(*args, **kwargs) + + monkeypatch.setattr(mock_isaac_capture, "TeleopSession", RecordingSession) + delays = {"controller_delay_s": 0.12, "glove_delay_s": 0.05, "delay_jitter_s": 0.01} + begin = p.BeginRequest(tracking=p.TrackingConfig(sources=(p.SourceType.HEAD,))) + acq = build_source_factory(ServerConfig(mock=True), delays=delays)(begin, ()) + try: + await acq.enter() + finally: + await acq.close() + assert {k: seen[k] for k in delays} == delays From 149308d34e7044fbc4a741ad1287d0318293b0b4 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 16:02:18 -0500 Subject: [PATCH 33/38] egocap: keep recovered alignments in a backlog; align on the sources an episode recorded - Hold alignment work beyond the queue's room in a backlog the worker drains, so none is dropped. - A source takes part in alignment only if the episode recorded rows for it; an absent or empty optional source no longer vetoes the alignment or its recovery. - Correct the station example's latency comment and state the mock quickstart's limits. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/README.md | 6 ++- .../egocap/backend/egocap_web/auto_align.py | 20 +++++--- .../egocap/recording/aligned_writer.py | 19 +++++--- .../egocap/stations/ego_stations.example.yaml | 2 +- .../egocap/tests/backend/test_auto_align.py | 48 ++++++++++++++++--- .../recording/unit/test_align_kept_episode.py | 39 +++++++++++++-- 6 files changed, 110 insertions(+), 24 deletions(-) diff --git a/examples/egocap/README.md b/examples/egocap/README.md index 37d07401f0..c89d3ffde5 100644 --- a/examples/egocap/README.md +++ b/examples/egocap/README.md @@ -56,7 +56,11 @@ pytest fixture; the rest of `tests/backend` needs no Node/npm. Three processes, each in its own terminal, from `egocap/`: ```bash -# 1. A standalone mock CaptureServer -- synthetic tracking and camera frames, no hardware +# 1. A standalone mock CaptureServer -- synthetic tracking and camera frames, no hardware. +# This starts with no synthetic delay (--controller-delay-ms/--glove-delay-ms/--delay-jitter-ms add +# one), and its cameras are plain CaptureServer JPEG streams, which carry no camera clock evidence: +# a recorded take is kept but automatic time alignment refuses it. Aligned output needs the cameras +# published through LiveKit (see LIVEKIT_PREVIEW.md). uv run capture-server --mock # 2. The backend, connecting to CaptureServer and serving both frontends -- note the diff --git a/examples/egocap/backend/egocap_web/auto_align.py b/examples/egocap/backend/egocap_web/auto_align.py index ebd04f0e25..36f03b3060 100644 --- a/examples/egocap/backend/egocap_web/auto_align.py +++ b/examples/egocap/backend/egocap_web/auto_align.py @@ -17,6 +17,7 @@ import asyncio import contextlib import logging +from collections import deque from dataclasses import dataclass from pathlib import Path @@ -32,7 +33,7 @@ logger = logging.getLogger("isaaccapture.egocap_web.auto_align") -#: Kept episodes waiting to be aligned. A full queue drops the newest; ``recover`` finds it again at next start. +#: Kept episodes held in the queue at once; any more wait in the backlog, so none is dropped. _QUEUE_LIMIT = 64 @@ -58,15 +59,15 @@ def __init__(self, output_root: Path, index_source: str) -> None: self._output_root = output_root self._index_source = index_source self._queue: asyncio.Queue[_Job] = asyncio.Queue(_QUEUE_LIMIT) + # Work beyond the queue's room; the worker tops the queue up from it as episodes finish. + self._backlog: deque[_Job] = deque() def _enqueue(self, job: _Job) -> None: - """Queue a job unless the queue is full, in which case ``recover`` picks it up later.""" + """Queue a job, or hold it in the backlog while the queue is full.""" try: self._queue.put_nowait(job) except asyncio.QueueFull: - logger.warning( - "%s episode %d was not queued for time alignment: queue full", job.session_id, job.episode_index - ) + self._backlog.append(job) def submit(self, result: EpisodeResult) -> None: """Queue a finished take for alignment; anything other than a kept episode is ignored.""" @@ -93,7 +94,11 @@ def recover(self) -> None: manifest.storage_phase == "FINALIZED" and manifest.finalization == FINALIZATION_KEEP and not job.aligned.exists() - and all(episode_qualification(final.parent, int(final.name.removeprefix("episode_"))).values()) + and all( + episode_qualification( + final.parent, int(final.name.removeprefix("episode_")), self._index_source + ).values() + ) ) except Exception: # noqa: BLE001, S112 - an unreadable record is simply not eligible continue @@ -110,6 +115,9 @@ async def run(self) -> None: except Exception as exc: # noqa: BLE001 - one episode's failure must not end the worker logger.warning("%s episode %d was not time-aligned: %s", job.session_id, job.episode_index, exc) finally: + # Refill from the backlog before marking this job done, so a drain waits for it too. + while self._backlog and not self._queue.full(): + self._queue.put_nowait(self._backlog.popleft()) self._queue.task_done() async def close(self, task: asyncio.Task[None], timeout: float) -> None: diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index d20c23fc58..06476f4886 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -200,7 +200,7 @@ def write_aligned_episode( raw_episode = zarr.open_group(str(raw_session / key), mode="r") # Only declared sources the episode actually recorded take part, as the valid range spans what is present. - present = [name for name in rules if name in raw_episode] + present = _participating(raw_episode, rules) unqualified = [name for name in [index_source, *present] if not qualified.get(name, False)] if unqualified: raise AlignedWriteError(f"sources without a qualified event time: {sorted(set(unqualified))}") @@ -338,12 +338,17 @@ def _attribute(metadata_file: Path, name: str) -> Any: return None -def episode_qualification(raw_session: Path, episode_index: int) -> dict[str, bool]: - """Which of the session's declared sources the episode's own timing evidence says have a qualified time.""" +def _participating(episode: Any, rules: Mapping[str, Any]) -> list[str]: + """The declared sources an episode recorded with at least one row; an absent or empty one takes no part.""" + return [name for name in rules if name in episode and episode[name]["capture_time"].shape[0] > 0] + + +def episode_qualification(raw_session: Path, episode_index: int, index_source: str) -> dict[str, bool]: + """Whether the episode's own timing evidence qualifies the index source and each source that took part.""" config = yaml.safe_load((raw_session / "config.yaml").read_text(encoding="utf-8")) or {} - declared = [e["name"] for section in ("video_sources", "numeric_sources") for e in config.get(section) or []] - timing = dict(zarr.open_group(str(raw_session / f"episode_{episode_index}"), mode="r").attrs).get("timing") - return qualified_sources(timing, declared) + episode = zarr.open_group(str(raw_session / f"episode_{episode_index}"), mode="r") + names = sorted({index_source, *_participating(episode, source_rules(config))}) + return qualified_sources(dict(episode.attrs).get("timing"), names) def align_kept_episode( @@ -371,6 +376,6 @@ def align_kept_episode( episode_index, index_source, downsample=downsample, - qualified=episode_qualification(raw_session, episode_index), + qualified=episode_qualification(raw_session, episode_index, index_source), continuity=manifest.continuity, ) diff --git a/examples/egocap/recording/egocap/stations/ego_stations.example.yaml b/examples/egocap/recording/egocap/stations/ego_stations.example.yaml index 7776d34248..772a5d3246 100644 --- a/examples/egocap/recording/egocap/stations/ego_stations.example.yaml +++ b/examples/egocap/recording/egocap/stations/ego_stations.example.yaml @@ -7,7 +7,7 @@ # consumes meta.egocap_station_name, meta.operator_name, meta.auto_fill_operator_name, # meta.task_description, recording.data_dir, and each video_sources entry's name/type (as the # cameras requested from CaptureServer), the alignment section, and each numeric_sources entry's latency -# (a tracking source is aligned on receive time minus it). The rest of each video_sources entry (frame_type, latency, +# (a tracking source's saved time is its host poll time minus it). The rest of each video_sources entry (frame_type, latency, # params) is reference data for other tooling, not consumed here -- # CaptureServer owns actually opening the selected cameras/devices. Each video_sources name MUST # match one of the names the running CaptureServer instance actually knows about (its own diff --git a/examples/egocap/tests/backend/test_auto_align.py b/examples/egocap/tests/backend/test_auto_align.py index 7a92319b54..bf014697f5 100644 --- a/examples/egocap/tests/backend/test_auto_align.py +++ b/examples/egocap/tests/backend/test_auto_align.py @@ -225,14 +225,50 @@ def test_recover_with_no_sessions_queues_nothing(tmp_path, create_root): assert aligner._queue.empty() -def test_a_full_queue_drops_the_newest_with_a_warning_instead_of_raising(monkeypatch, caplog): +def test_recover_is_not_vetoed_by_a_declared_source_the_episode_did_not_record(tmp_path): + _write_session_manifest(tmp_path, "s1", 0) + (tmp_path / "s1" / "config.yaml").write_text( + yaml.safe_dump({"video_sources": [{"name": "head"}, {"name": "optional_camera"}]}), encoding="utf-8" + ) + aligner = AutoAligner(tmp_path, "head") + aligner.recover() + assert [job.episode_index for job in _queued(aligner)] == [0] + + +async def test_more_recovered_episodes_than_the_queue_holds_are_all_aligned_in_order(monkeypatch, tmp_path): + calls = [] + monkeypatch.setattr(auto_align, "align_kept_episode", lambda *args: calls.append(args)) + monkeypatch.setattr(auto_align, "_QUEUE_LIMIT", 2) + for index in range(5): + _write_session_manifest(tmp_path, "s1", index) + aligner = AutoAligner(tmp_path, "head") + aligner.recover() + assert aligner._queue.qsize() == 2 and len(aligner._backlog) == 3 + task = asyncio.create_task(aligner.run()) + await aligner.close(task, 5) + assert [args[1] for args in calls] == [0, 1, 2, 3, 4] + assert not aligner._backlog + + +async def test_a_live_submit_while_the_queue_is_full_is_kept_and_aligned_last(calls, monkeypatch): monkeypatch.setattr(auto_align, "_QUEUE_LIMIT", 1) aligner = AutoAligner(Path("/out"), "head") - aligner.submit(_result(index=1)) - with caplog.at_level(logging.WARNING, logger="isaaccapture.egocap_web.auto_align"): - aligner.submit(_result(index=2)) - assert [job.episode_index for job in _queued(aligner)] == [1] - assert "episode 2 was not queued" in caplog.text and "queue full" in caplog.text + for index in (1, 2, 3): + aligner.submit(_result(index=index, final_path=Path("/g") / f"episode_{index}")) + task = asyncio.create_task(aligner.run()) + await aligner.close(task, 5) + assert [args[1] for args in calls] == [1, 2, 3] + + +async def test_close_waits_for_the_backlog_too(calls, monkeypatch): + monkeypatch.setattr(auto_align, "_QUEUE_LIMIT", 1) + aligner = AutoAligner(Path("/out"), "head") + for index in range(4): + aligner.submit(_result(index=index)) + assert len(aligner._backlog) == 3 + task = asyncio.create_task(aligner.run()) + await aligner.close(task, 5) + assert len(calls) == 4 and not aligner._backlog and task.cancelled() def test_the_logger_is_in_the_isaaccapture_tree(): diff --git a/examples/egocap/tests/recording/unit/test_align_kept_episode.py b/examples/egocap/tests/recording/unit/test_align_kept_episode.py index c519a06a23..f6227a9d57 100644 --- a/examples/egocap/tests/recording/unit/test_align_kept_episode.py +++ b/examples/egocap/tests/recording/unit/test_align_kept_episode.py @@ -440,7 +440,7 @@ def test_cli_refuses_a_manifest_that_does_not_bind(tmp_path, raw, capsys): def test_qualification_reports_each_declared_source_from_the_episodes_own_timing(tmp_path): timing = {"event_time": {"head_camera": {"qualified": True}, "pico_controller": {"qualified": False}}} build_raw(tmp_path / "raw", timing=timing) - assert episode_qualification(tmp_path / "raw", 1) == { + assert episode_qualification(tmp_path / "raw", 1, INDEX) == { "head_camera": True, "wrist_camera": False, "pico_controller": False, @@ -450,8 +450,41 @@ def test_qualification_reports_each_declared_source_from_the_episodes_own_timing def test_qualification_is_false_for_every_source_when_the_episode_has_no_timing(tmp_path): build_raw(tmp_path / "raw", timing=None) - assert set(episode_qualification(tmp_path / "raw", 0).values()) == {False} + assert set(episode_qualification(tmp_path / "raw", 0, INDEX).values()) == {False} def test_qualification_covers_every_declared_source_when_all_are_qualified(raw): - assert episode_qualification(raw, 0) == dict.fromkeys(SOURCES, True) + assert episode_qualification(raw, 0, INDEX) == dict.fromkeys(SOURCES, True) + + +def drop_rows(raw, source): + """Leave the source's group in the episode with its arrays emptied.""" + group = zarr.open_group(str(raw / "episode_0"), mode="r+")[source] + for name in list(group.array_keys()): + array = group[name] + del group[name] + group[name] = array[:0] + + +def test_an_absent_optional_source_is_left_out_of_the_qualification_and_alignment_proceeds(tmp_path, raw): + shutil.rmtree(raw / "episode_0" / "glove") + assert "glove" not in episode_qualification(raw, 0, INDEX) + align_kept_episode(raw, 0, INDEX, make_manifest(raw)) + aligned = zarr.open_group(str(tmp_path / "raw_aligned" / "episode_0"), mode="r") + assert "glove" not in aligned and "pico_controller" in aligned + + +def test_a_source_with_no_rows_is_excluded_from_the_output_and_the_qualification_and_does_not_veto(tmp_path, raw): + drop_rows(raw, "glove") + timing = good_timing() + timing["event_time"]["glove"] = {"qualified": False} + zarr.open_group(str(raw / "episode_0"), mode="r+").attrs["timing"] = timing + assert "glove" not in episode_qualification(raw, 0, INDEX) + align_kept_episode(raw, 0, INDEX, make_manifest(raw)) + aligned = zarr.open_group(str(tmp_path / "raw_aligned" / "episode_0"), mode="r") + assert "glove" not in aligned and "pico_controller" in aligned + + +def test_the_index_source_is_always_in_the_qualification(raw): + shutil.rmtree(raw / "episode_0" / INDEX) + assert INDEX in episode_qualification(raw, 0, INDEX) From 1cd395b2fc31cc129fede08c18a1514467a50d85 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 16:39:13 -0500 Subject: [PATCH 34/38] egocap: take the tracking estimate from an explicit alignment setting - Read the estimated tracking delay from alignment.tracking_latency_s only; a station file's numeric_sources latency is unused, and the estimate is no longer written under the dataset's latency key. The template ships no value. - Drop the stale tracking_time entry from the LiveKit timing evidence. - Hold aligner jobs in one unbounded queue; skip hidden staging folders in the daily analytics. - Do not jitter a mock source that has no delay. - Correct stale alignment, config and CLI documentation. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/backend/egocap_web/app.py | 10 +---- .../egocap/backend/egocap_web/auto_align.py | 23 ++--------- .../backend/egocap_web/livekit_recording.py | 2 - .../backend/egocap_web/recording_session.py | 8 ++-- .../backend/egocap_web/station_config.py | 27 +++++++----- .../capture_server/mock/mock_isaac_capture.py | 6 ++- examples/egocap/recording/README.md | 6 +-- .../analytics/count_daily_trajectories.py | 8 ++-- .../recording/egocap/recording/alignment.py | 8 ++-- .../egocap/recording/episode_layout.py | 3 +- .../egocap/stations/ego_stations.example.yaml | 9 ++-- .../recording_service/recording_service.py | 3 +- .../egocap/recording/tools/align_episode.py | 2 +- .../backend/test_app_livekit_recording.py | 6 +-- .../egocap/tests/backend/test_auto_align.py | 33 +++++---------- .../backend/test_livekit_recording_source.py | 1 - .../tests/backend/test_recording_session.py | 22 ++++++++-- .../tests/backend/test_station_config.py | 41 ++++++++++++++----- .../tests/capture_server/test_mock_sdks.py | 5 +++ .../unit/test_count_daily_trajectories.py | 12 ++++-- .../recording_service/test_episode_timing.py | 1 - 21 files changed, 126 insertions(+), 110 deletions(-) diff --git a/examples/egocap/backend/egocap_web/app.py b/examples/egocap/backend/egocap_web/app.py index 13234c9b4c..a1d61299cb 100644 --- a/examples/egocap/backend/egocap_web/app.py +++ b/examples/egocap/backend/egocap_web/app.py @@ -168,7 +168,6 @@ def _recording_config_factory( monitor: CaptureStatusMonitor, station_label: str | None, output_root: Path, - latency: dict[str, float] | None = None, ): """Builds the real ``ServiceConfig`` lazily, read fresh each time the coordinator actually opens/reopens a session (not once at import time) @@ -205,7 +204,6 @@ def factory() -> ServiceConfig: qc=QcConfig(required_sources=required), calibration_assets=_station_calibration_assets(), station_label=station_label, - latency=latency or None, ) largest_decoded_frame_bytes = max((cam.width * cam.height * 3 for cam in video_sources), default=0) if largest_decoded_frame_bytes > 0: @@ -408,17 +406,13 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: _recorder_livekit_token, ) coordinator = RecordingSessionCoordinator( - _recording_config_factory( - monitor, - config.station_label, - recording_output_root, - resolved_station.latency if resolved_station is not None else None, - ), + _recording_config_factory(monitor, config.station_label, recording_output_root), queue_capacity=_INGRESS_QUEUE_CAPACITY, queue_bytes=lambda: _ingress_queue_bytes(monitor.native.started), readiness_check=_recording_readiness_check(monitor, station_config_error, config.capture_server_url), initial_context=initial_context, livekit_source=livekit_source, + tracking_latency=resolved_station.latency if resolved_station is not None else None, ) monitor.set_recording(coordinator) await monitor.start() diff --git a/examples/egocap/backend/egocap_web/auto_align.py b/examples/egocap/backend/egocap_web/auto_align.py index 36f03b3060..902eb2efd8 100644 --- a/examples/egocap/backend/egocap_web/auto_align.py +++ b/examples/egocap/backend/egocap_web/auto_align.py @@ -17,7 +17,6 @@ import asyncio import contextlib import logging -from collections import deque from dataclasses import dataclass from pathlib import Path @@ -33,9 +32,6 @@ logger = logging.getLogger("isaaccapture.egocap_web.auto_align") -#: Kept episodes held in the queue at once; any more wait in the backlog, so none is dropped. -_QUEUE_LIMIT = 64 - @dataclass(frozen=True) class _Job: @@ -58,21 +54,13 @@ def __init__(self, output_root: Path, index_source: str) -> None: """``output_root`` holds the recording sessions; ``index_source`` is the camera that sets the timeline.""" self._output_root = output_root self._index_source = index_source - self._queue: asyncio.Queue[_Job] = asyncio.Queue(_QUEUE_LIMIT) - # Work beyond the queue's room; the worker tops the queue up from it as episodes finish. - self._backlog: deque[_Job] = deque() - - def _enqueue(self, job: _Job) -> None: - """Queue a job, or hold it in the backlog while the queue is full.""" - try: - self._queue.put_nowait(job) - except asyncio.QueueFull: - self._backlog.append(job) + # Unbounded: a job is three small fields, and the number waiting is the number of kept episodes. + self._queue: asyncio.Queue[_Job] = asyncio.Queue() def submit(self, result: EpisodeResult) -> None: """Queue a finished take for alignment; anything other than a kept episode is ignored.""" if result.disposition is Disposition.KEPT and result.final_path is not None: - self._enqueue(_Job(result.session_id, result.episode_index, result.final_path)) + self._queue.put_nowait(_Job(result.session_id, result.episode_index, result.final_path)) def recover(self) -> None: """Queue every kept episode, in any session, that has no aligned copy and whose evidence allows one. @@ -103,7 +91,7 @@ def recover(self) -> None: except Exception: # noqa: BLE001, S112 - an unreadable record is simply not eligible continue if eligible: - self._enqueue(job) + self._queue.put_nowait(job) async def run(self) -> None: """Align queued episodes until cancelled; a failed alignment is logged and never stops the worker.""" @@ -115,9 +103,6 @@ async def run(self) -> None: except Exception as exc: # noqa: BLE001 - one episode's failure must not end the worker logger.warning("%s episode %d was not time-aligned: %s", job.session_id, job.episode_index, exc) finally: - # Refill from the backlog before marking this job done, so a drain waits for it too. - while self._backlog and not self._queue.full(): - self._queue.put_nowait(self._backlog.popleft()) self._queue.task_done() async def close(self, task: asyncio.Task[None], timeout: float) -> None: diff --git a/examples/egocap/backend/egocap_web/livekit_recording.py b/examples/egocap/backend/egocap_web/livekit_recording.py index 9516c1f2ee..5bfcbbca87 100644 --- a/examples/egocap/backend/egocap_web/livekit_recording.py +++ b/examples/egocap/backend/egocap_web/livekit_recording.py @@ -541,8 +541,6 @@ def timing_evidence(self) -> dict[str, Any] | None: for s in self._streams }, }, - # Tracking samples carry the host's poll time for every source; device measurement times are unmapped. - "tracking_time": "host_poll", "tracking_semantics": _TRACKING_SEMANTICS, } diff --git a/examples/egocap/backend/egocap_web/recording_session.py b/examples/egocap/backend/egocap_web/recording_session.py index 28c98fc410..351d01a227 100644 --- a/examples/egocap/backend/egocap_web/recording_session.py +++ b/examples/egocap/backend/egocap_web/recording_session.py @@ -188,12 +188,14 @@ def __init__( readiness_check: ReadinessCheck, initial_context: TaskContext | None = None, livekit_source: LiveKitRecordingSource | None = None, + tracking_latency: dict[str, float] | None = None, ) -> None: self._config_factory = config_factory # Optional LiveKit video for each take: joined before storage opens, fed after the ingress starts, left # before the ingress is retired. self._livekit_source = livekit_source - self._tracking_latency: dict[str, float] = {} + # The station's estimated delay per tracking source, applied to every take's tracking times. + self._tracking_latency = dict(tracking_latency or {}) #: The clock-mapping evidence of the take in progress, gathered when its video source stops. self._timing_evidence: dict[str, Any] | None = None self._queue_capacity = queue_capacity @@ -337,9 +339,7 @@ async def _open_storage_if_needed(self) -> _RecordingService: ) return self._service self._status = SessionStatus.OPENING - config = self._config_factory() - self._tracking_latency = config.latency or {} - service = _RecordingService(config) + service = _RecordingService(self._config_factory()) # Assigned BEFORE the await below: a failure or cancellation here # must not orphan a service instance that may have already # acquired real resources -- self._service is the one place close() diff --git a/examples/egocap/backend/egocap_web/station_config.py b/examples/egocap/backend/egocap_web/station_config.py index 627818e7c6..7f64674ccc 100644 --- a/examples/egocap/backend/egocap_web/station_config.py +++ b/examples/egocap/backend/egocap_web/station_config.py @@ -18,7 +18,7 @@ visualization, or any other section) is read by nobody here and never passed downstream. The ``cameras`` field is itself a small ``name``/``type`` projection of ``video_sources`` -- the fuller per-source declaration (``frame_type``, ``params``) is reference data for other tooling, not consumed -here; the one exception is a tracking source's ``latency`` under ``numeric_sources``. +here; the one exception is the ``alignment`` section. """ from __future__ import annotations @@ -59,8 +59,8 @@ class ResolvedStation: task_description: str | None data_dir: Path | None cameras: tuple[p.CameraSelection, ...] - #: Seconds of device-to-host delay per tracking source, from ``numeric_sources[].latency``; a source without - #: one is recorded without a latency and cannot be time-aligned. + #: Estimated seconds of device-to-host delay per tracking source, from ``alignment.tracking_latency_s``. Only + #: a source named there is recorded as a qualified estimate; the others cannot be time-aligned. latency: dict[str, float] #: The camera that sets the timeline for automatic time alignment of kept episodes; None turns it off. alignment_index: str | None @@ -138,17 +138,22 @@ def _resolve_cameras(station_id: str, entry: dict) -> tuple[p.CameraSelection, . def _resolve_latency(station_id: str, entry: dict) -> dict[str, float]: - """The finite, non-negative ``latency`` each recorded tracking source declares in ``numeric_sources``.""" + """The finite, non-negative seconds in ``alignment.tracking_latency_s``, keyed by tracking source.""" + section = entry.get("alignment") or {} + if not isinstance(section, dict): + raise StationConfigError(f"station {station_id!r}: 'alignment' must be a mapping") + configured = section.get("tracking_latency_s") or {} + if not isinstance(configured, dict): + raise StationConfigError(f"station {station_id!r}: alignment.tracking_latency_s must be a mapping") latency: dict[str, float] = {} - for source in entry.get("numeric_sources") or []: - if not isinstance(source, dict) or source.get("name") not in _TRACKING_SOURCES or "latency" not in source: - continue - seconds = source["latency"] + for name, seconds in configured.items(): + if name not in _TRACKING_SOURCES: + raise StationConfigError(f"station {station_id!r}: tracking_latency_s names unknown source {name!r}") if isinstance(seconds, bool) or not isinstance(seconds, (int, float)) or not 0 <= seconds < float("inf"): raise StationConfigError( - f"station {station_id!r}: {source['name']} latency must be a finite number of seconds >= 0" + f"station {station_id!r}: tracking_latency_s.{name} must be a finite number of seconds >= 0" ) - latency[source["name"]] = float(seconds) + latency[name] = float(seconds) return latency @@ -157,7 +162,7 @@ def _resolve_alignment_index(station_id: str, entry: dict) -> str | None: On unless ``alignment.enabled`` is false; None also when there is no camera to index on. """ - section = entry.get("alignment", {}) + section = entry.get("alignment") or {} if not isinstance(section, dict): raise StationConfigError(f"station {station_id!r}: 'alignment' must be a mapping") if not _bool_field(section, "enabled", default=True): diff --git a/examples/egocap/capture_server/capture_server/mock/mock_isaac_capture.py b/examples/egocap/capture_server/capture_server/mock/mock_isaac_capture.py index 940ab0f26d..8029b29dd4 100644 --- a/examples/egocap/capture_server/capture_server/mock/mock_isaac_capture.py +++ b/examples/egocap/capture_server/capture_server/mock/mock_isaac_capture.py @@ -760,8 +760,10 @@ def _elapsed(self) -> float: def _delayed(self, t: float, source: str) -> float: """The instant ``source``'s content is from: ``t`` less its synthetic delay and jitter, never before 0.""" - jitter = self._delay_rng.uniform(-self._jitter_s, self._jitter_s) if self._jitter_s else 0.0 - return max(0.0, t - max(0.0, self._delays[source] + jitter)) + delay = self._delays[source] + # A source with no delay is read at the poll instant; jitter on it would only skew it late. + jitter = self._delay_rng.uniform(-self._jitter_s, self._jitter_s) if self._jitter_s and delay else 0.0 + return max(0.0, t - max(0.0, delay + jitter)) def step( self, diff --git a/examples/egocap/recording/README.md b/examples/egocap/recording/README.md index 780e7707ff..d3405b1983 100644 --- a/examples/egocap/recording/README.md +++ b/examples/egocap/recording/README.md @@ -127,9 +127,9 @@ What the recording service writes into each routed group: ├── / │ └── / │ ├── zarr.json # dataset-level attrs -│ ├── config.yaml # {"meta": {"egocap_station_name": ...}} -- station identity -│ │ # only, NOT the fuller video_sources/numeric_sources/recording -│ │ # schema `core/config_io.py`'s default config illustrates +│ ├── config.yaml # meta.egocap_station_name plus the source declarations time +│ │ # alignment reads (video_sources/numeric_sources names and frame +│ │ # types, recording defaults) │ ├── head_camera_intrinsics.json, head_camera_extrinsics.json │ ├── left_wrist_camera_intrinsics.json, right_wrist_camera_intrinsics.json │ ├── wrist_calibration_offsets.json diff --git a/examples/egocap/recording/egocap/analytics/count_daily_trajectories.py b/examples/egocap/recording/egocap/analytics/count_daily_trajectories.py index 3ee6432a8e..298708d679 100644 --- a/examples/egocap/recording/egocap/analytics/count_daily_trajectories.py +++ b/examples/egocap/recording/egocap/analytics/count_daily_trajectories.py @@ -161,10 +161,10 @@ def compute_station_data_breakdown( for session_dir in sorted(studio_dir.iterdir()): if not session_dir.is_dir(): continue - # Skip sibling ``_aligned`` folders the background aligner + # Skip sibling ``_aligned`` folders the background aligner (and its hidden staging folders) # writes — they are processed copies of the raw session, not # separately collected data (else each aligned episode double-counts). - if session_dir.name.endswith("_aligned"): + if session_dir.name.endswith("_aligned") or session_dir.name.startswith("."): continue if _read_session_station_name(session_dir) != station: continue @@ -223,10 +223,10 @@ def count_trajectories( for session_dir in sorted(studio_dir.iterdir()): if not session_dir.is_dir(): continue - # Skip sibling ``_aligned`` folders the background aligner + # Skip sibling ``_aligned`` folders the background aligner (and its hidden staging folders) # writes — they are processed copies of the raw session, not new # trajectories (else each aligned episode double-counts the raw one). - if session_dir.name.endswith("_aligned"): + if session_dir.name.endswith("_aligned") or session_dir.name.startswith("."): continue session_attrs = _read_zarr_json(session_dir / "zarr.json") diff --git a/examples/egocap/recording/egocap/recording/alignment.py b/examples/egocap/recording/egocap/recording/alignment.py index e0cad9eda4..18e60f1bf9 100644 --- a/examples/egocap/recording/egocap/recording/alignment.py +++ b/examples/egocap/recording/egocap/recording/alignment.py @@ -18,8 +18,8 @@ transforms: linear position, slerp rotation), ``linear`` (element-wise, also used for a 4x4 field with extra leading dimensions) or ``nearest`` (the value at the nearest sample); ``raw`` fields are not resampled. -There is no file access here. The times passed in are the ones to align on: a source's recorded capture time, or -its receive time minus a configured latency, chosen by the caller and never adjusted here. +There is no file access here. The times passed in are the ones to align on: each source's recorded capture time, +used exactly as given and never adjusted here. """ from __future__ import annotations @@ -65,8 +65,8 @@ def qualified_sources(timing: Mapping[str, object] | None, sources: Sequence[str ``timing["event_time"][source]["qualified"]`` is the recorded statement, per source, of whether its saved time is a qualified event time (a sensor's capture event, or a device measurement time). Only a literal True counts; a source the attribute does not list, an entry without it, or no attribute at all is False. A clock mapping - says which clock a time is on, not what it measures, so it is never taken as qualification. A caller that - aligns on ``receive_time - latency`` instead states that choice itself; this says nothing about it. + says which clock a time is on, not what it measures, so it is never taken as qualification. A configured + latency estimate is applied when the sample is recorded and marked in this attribute; it is not applied here. """ event_time = (timing or {}).get("event_time") entries = event_time if isinstance(event_time, Mapping) else {} diff --git a/examples/egocap/recording/egocap/recording/episode_layout.py b/examples/egocap/recording/egocap/recording/episode_layout.py index 48d5fabe53..693f4a53e4 100644 --- a/examples/egocap/recording/egocap/recording/episode_layout.py +++ b/examples/egocap/recording/egocap/recording/episode_layout.py @@ -182,7 +182,8 @@ def write_manifest(session_path: Path, manifest: EpisodeManifest) -> None: #: Sidecar record of the calibration assets preserved in a session: name -> sha256 (null if absent at creation). CALIBRATION_RECORD = "calibration_assets.json" -#: Session-root (and, once routed, group-root) metadata snapshot: {"meta": {"egocap_station_name": ...}}. +#: Session-root (and, once routed, group-root) config snapshot: the station identity under ``meta`` plus the +#: source declarations (names, frame types, recording defaults) that time alignment reads. #: Written once at session creation and never rewritten on reopen/recovery (see #: RecordingService._prepare_session_assets); downstream tooling such as #: analytics/count_daily_trajectories.py reads it to map a session back to its station. diff --git a/examples/egocap/recording/egocap/stations/ego_stations.example.yaml b/examples/egocap/recording/egocap/stations/ego_stations.example.yaml index 772a5d3246..bd3b02e252 100644 --- a/examples/egocap/recording/egocap/stations/ego_stations.example.yaml +++ b/examples/egocap/recording/egocap/stations/ego_stations.example.yaml @@ -6,9 +6,8 @@ # backend/egocap_web/station_config.py) reads the FIRST station entry under "stations" and # consumes meta.egocap_station_name, meta.operator_name, meta.auto_fill_operator_name, # meta.task_description, recording.data_dir, and each video_sources entry's name/type (as the -# cameras requested from CaptureServer), the alignment section, and each numeric_sources entry's latency -# (a tracking source's saved time is its host poll time minus it). The rest of each video_sources entry (frame_type, latency, -# params) is reference data for other tooling, not consumed here -- +# cameras requested from CaptureServer) and the alignment section. numeric_sources and the rest of each +# video_sources entry (frame_type, latency, params) are reference data for other tooling, not consumed here -- # CaptureServer owns actually opening the selected cameras/devices. Each video_sources name MUST # match one of the names the running CaptureServer instance actually knows about (its own # --camera list, mock or real) -- an unknown name rejects the whole capture session, not just @@ -44,6 +43,10 @@ stations: alignment: enabled: true index_source: head_human_camera + # Estimated device-to-host delay in seconds for each tracking source; it is taken off that source's host + # poll time when recorded, and a source not listed is not time-aligned. Measure it on the station and + # uncomment; no value is assumed. + # tracking_latency_s: {pico_controller: , manus_glove: } video_sources: - type: oak_camera name: head_human_camera diff --git a/examples/egocap/recording/recording_service/recording_service.py b/examples/egocap/recording/recording_service/recording_service.py index 27fae9b846..fd1e5ce4e6 100644 --- a/examples/egocap/recording/recording_service/recording_service.py +++ b/examples/egocap/recording/recording_service/recording_service.py @@ -142,7 +142,8 @@ def _digest(config: ServiceConfig) -> str: qc["capture_algorithm_version"] = ALGORITHM_VERSION # a changed algorithm is a changed configuration canonical = { **({"routing": True} if config.routing is not None else {}), # routed or not; each take freezes its studio - # A frame type left unset is absent, not null, so a configuration that predates it keeps its digest. + # A frame type left unset is absent, not null, so a configuration that predates it keeps its digest. A + # take left SEALED or CHECKED across a change that sets frame types is judged as a changed configuration. "numeric": [ {k: v for k, v in asdict(s).items() if k != "frame_type" or v is not None} for s in config.numeric_sources diff --git a/examples/egocap/recording/tools/align_episode.py b/examples/egocap/recording/tools/align_episode.py index 8e9048fb62..1b7c9fabab 100755 --- a/examples/egocap/recording/tools/align_episode.py +++ b/examples/egocap/recording/tools/align_episode.py @@ -13,7 +13,7 @@ Usage (from any directory outside ``egocap`` itself):: /.venv/bin/python recording/tools/align_episode.py SESSION_DIR --episode N --index-source NAME \ - [--manifest-session DIR] [--aligned-session DIR] [--downsample K] + [--manifest-session DIR] [--manifest-episode N] [--aligned-session DIR] [--downsample K] ``--manifest-session`` is where the episode's manifest lives when that is not ``SESSION_DIR`` (a routed episode's manifest stays in the session it was recorded in), and ``--manifest-episode`` its index there when that diff --git a/examples/egocap/tests/backend/test_app_livekit_recording.py b/examples/egocap/tests/backend/test_app_livekit_recording.py index c16e2c5839..c520bdf096 100644 --- a/examples/egocap/tests/backend/test_app_livekit_recording.py +++ b/examples/egocap/tests/backend/test_app_livekit_recording.py @@ -59,11 +59,9 @@ def test_config_factory_without_a_started_session_has_no_livekit_sources(tmp_pat assert app_module._recording_config_factory(monitor, None, tmp_path)().video_sources == () -def test_config_factory_passes_the_stations_latency_to_the_config(tmp_path): +def test_config_factory_does_not_carry_a_latency(tmp_path): monitor = SimpleNamespace(camera_descriptors=(), native=SimpleNamespace(started=None)) - latency = {"pico_controller": 0.05} - assert app_module._recording_config_factory(monitor, None, tmp_path, latency)().latency == latency - assert app_module._recording_config_factory(monitor, None, tmp_path, {})().latency is None + assert app_module._recording_config_factory(monitor, None, tmp_path)().latency is None def test_recorder_token_is_signed_when_the_key_pair_is_set(monkeypatch): diff --git a/examples/egocap/tests/backend/test_auto_align.py b/examples/egocap/tests/backend/test_auto_align.py index bf014697f5..8c7361e74f 100644 --- a/examples/egocap/tests/backend/test_auto_align.py +++ b/examples/egocap/tests/backend/test_auto_align.py @@ -235,40 +235,27 @@ def test_recover_is_not_vetoed_by_a_declared_source_the_episode_did_not_record(t assert [job.episode_index for job in _queued(aligner)] == [0] -async def test_more_recovered_episodes_than_the_queue_holds_are_all_aligned_in_order(monkeypatch, tmp_path): +async def test_many_recovered_episodes_are_all_aligned_in_order(monkeypatch, tmp_path): calls = [] monkeypatch.setattr(auto_align, "align_kept_episode", lambda *args: calls.append(args)) - monkeypatch.setattr(auto_align, "_QUEUE_LIMIT", 2) - for index in range(5): + for index in range(9): _write_session_manifest(tmp_path, "s1", index) aligner = AutoAligner(tmp_path, "head") aligner.recover() - assert aligner._queue.qsize() == 2 and len(aligner._backlog) == 3 + assert aligner._queue.qsize() == 9 task = asyncio.create_task(aligner.run()) - await aligner.close(task, 5) - assert [args[1] for args in calls] == [0, 1, 2, 3, 4] - assert not aligner._backlog + await aligner.close(task, 30) + assert [args[1] for args in calls] == list(range(9)) -async def test_a_live_submit_while_the_queue_is_full_is_kept_and_aligned_last(calls, monkeypatch): - monkeypatch.setattr(auto_align, "_QUEUE_LIMIT", 1) +async def test_many_live_submits_are_all_aligned_in_order_and_close_drains_them(calls): aligner = AutoAligner(Path("/out"), "head") - for index in (1, 2, 3): + for index in range(100): aligner.submit(_result(index=index, final_path=Path("/g") / f"episode_{index}")) task = asyncio.create_task(aligner.run()) - await aligner.close(task, 5) - assert [args[1] for args in calls] == [1, 2, 3] - - -async def test_close_waits_for_the_backlog_too(calls, monkeypatch): - monkeypatch.setattr(auto_align, "_QUEUE_LIMIT", 1) - aligner = AutoAligner(Path("/out"), "head") - for index in range(4): - aligner.submit(_result(index=index)) - assert len(aligner._backlog) == 3 - task = asyncio.create_task(aligner.run()) - await aligner.close(task, 5) - assert len(calls) == 4 and not aligner._backlog and task.cancelled() + await aligner.close(task, 30) + assert [args[1] for args in calls] == list(range(100)) + assert aligner._queue.empty() and task.cancelled() def test_the_logger_is_in_the_isaaccapture_tree(): diff --git a/examples/egocap/tests/backend/test_livekit_recording_source.py b/examples/egocap/tests/backend/test_livekit_recording_source.py index 32036d6b23..35989cc8f4 100644 --- a/examples/egocap/tests/backend/test_livekit_recording_source.py +++ b/examples/egocap/tests/backend/test_livekit_recording_source.py @@ -483,7 +483,6 @@ async def test_timing_evidence_describes_the_mappings_the_take_was_placed_under( "cam16": {"meaning": "sensor_capture", "qualified": True}, "cam17": {"meaning": "frame_ready", "qualified": False}, }, - "tracking_time": "host_poll", "tracking_semantics": lrec._TRACKING_SEMANTICS, } assert json.loads(json.dumps(evidence)) == evidence diff --git a/examples/egocap/tests/backend/test_recording_session.py b/examples/egocap/tests/backend/test_recording_session.py index 68dc2c6377..b200ff1f26 100644 --- a/examples/egocap/tests/backend/test_recording_session.py +++ b/examples/egocap/tests/backend/test_recording_session.py @@ -57,9 +57,14 @@ def factory() -> ServiceConfig: return factory -def make_coordinator(tmp_path: Path, *, readiness_check=ALWAYS_READY, **overrides) -> RecordingSessionCoordinator: +def make_coordinator( + tmp_path: Path, *, readiness_check=ALWAYS_READY, tracking_latency=None, **overrides +) -> RecordingSessionCoordinator: return RecordingSessionCoordinator( - make_config_factory(tmp_path, **overrides), queue_capacity=8, readiness_check=readiness_check + make_config_factory(tmp_path, **overrides), + queue_capacity=8, + readiness_check=readiness_check, + tracking_latency=tracking_latency, ) @@ -753,7 +758,7 @@ def capture_convert(*args, **kwargs): coordinator = make_coordinator( tmp_path, numeric_sources=(PICO_CONTROLLER_SPEC, MANUS_GLOVE_SPEC), - latency={"pico_controller": 0.02}, + tracking_latency={"pico_controller": 0.02}, ) await coordinator.open() coordinator.set_task("t") @@ -791,10 +796,11 @@ def timing_evidence(self): async def _kept_timing(tmp_path: Path, *, latency=None, livekit_source=None): coordinator = RecordingSessionCoordinator( - make_config_factory(tmp_path, numeric_sources=(PICO_CONTROLLER_SPEC, MANUS_GLOVE_SPEC), latency=latency), + make_config_factory(tmp_path, numeric_sources=(PICO_CONTROLLER_SPEC, MANUS_GLOVE_SPEC)), queue_capacity=8, readiness_check=ALWAYS_READY, livekit_source=livekit_source, + tracking_latency=latency, ) await coordinator.open() coordinator.set_task("t") @@ -826,6 +832,14 @@ async def test_a_configured_latency_is_recorded_as_a_qualified_estimate_matching assert group["manus_glove"]["capture_time"][0] == pytest.approx(5.0) +async def test_the_coordinator_keeps_its_own_copy_of_the_tracking_latency(tmp_path: Path): + latency = {"pico_controller": 0.02} + coordinator = make_coordinator(tmp_path, tracking_latency=latency) + latency["pico_controller"] = 9.0 + assert coordinator._tracking_latency == {"pico_controller": 0.02} + assert make_coordinator(tmp_path)._tracking_latency == {} + + async def test_a_missing_latency_is_recorded_as_an_unqualified_host_poll_time(tmp_path: Path): timing, _ = await _kept_timing(tmp_path) assert timing["event_time"] == { diff --git a/examples/egocap/tests/backend/test_station_config.py b/examples/egocap/tests/backend/test_station_config.py index b8bf81c97d..c5074758f4 100644 --- a/examples/egocap/tests/backend/test_station_config.py +++ b/examples/egocap/tests/backend/test_station_config.py @@ -260,33 +260,54 @@ def test_the_shipped_template_resolves_a_real_station_label(): assert resolved.auto_fill_operator_name is False -def _latency_yaml(*sources): - lines = ["numeric_sources:"] - for name, latency in sources: - lines += [f" - name: {name}", f" latency: {latency}"] - return "\n".join(lines) + "\n" +def _latency_yaml(**seconds): + return "alignment:\n tracking_latency_s:\n" + "".join( + f" {name}: {value}\n" for name, value in seconds.items() + ) def test_tracking_source_latencies_are_resolved_in_seconds(tmp_path): - path = _write(tmp_path, _latency_yaml(("pico_controller", 0.05), ("manus_glove", 1))) + path = _write(tmp_path, _latency_yaml(pico_controller=0.05, manus_glove=1)) assert load_station_config(path).latency == {"pico_controller": 0.05, "manus_glove": 1.0} -def test_non_tracking_and_latency_free_numeric_sources_are_not_in_latency(tmp_path): +def test_numeric_sources_latency_is_ignored(tmp_path): path = _write( tmp_path, - "numeric_sources:\n - name: other\n latency: 0.1\n - name: manus_glove\n - just_a_string\n", + "numeric_sources:\n - name: pico_controller\n latency: 0.1\n - name: manus_glove\n - just_a_string\n", # noqa: E501 ) assert load_station_config(path).latency == {} +def test_absent_or_empty_tracking_latency_resolves_to_no_latency(tmp_path): + assert load_station_config(_write(tmp_path, "alignment:\n tracking_latency_s:\n")).latency == {} + assert load_station_config(_write(tmp_path, "alignment: {}\n")).latency == {} + + @pytest.mark.parametrize("value", ["true", "'0.1'", "-0.1", ".inf", ".nan", "[1]"]) def test_an_invalid_tracking_latency_is_a_station_config_error(tmp_path, value): - path = _write(tmp_path, _latency_yaml(("pico_controller", value))) - with pytest.raises(StationConfigError, match="pico_controller latency must be"): + path = _write(tmp_path, _latency_yaml(pico_controller=value)) + with pytest.raises(StationConfigError, match="tracking_latency_s.pico_controller must be"): load_station_config(path) +def test_a_tracking_latency_for_an_unknown_source_is_a_station_config_error(tmp_path): + with pytest.raises(StationConfigError, match="unknown source 'head'"): + load_station_config(_write(tmp_path, _latency_yaml(head=0.1))) + + +@pytest.mark.parametrize( + ("text", "match"), + [ + ("alignment: [1]\n", "'alignment' must be a mapping"), + ("alignment:\n tracking_latency_s: [0.1]\n", "tracking_latency_s must be a mapping"), + ], +) +def test_a_non_mapping_alignment_or_tracking_latency_is_a_station_config_error(tmp_path, text, match): + with pytest.raises(StationConfigError, match=match): + load_station_config(_write(tmp_path, text)) + + _CAMERAS = "video_sources:\n - type: oak_camera\n name: head\n - type: oak_camera\n name: wrist\n" diff --git a/examples/egocap/tests/capture_server/test_mock_sdks.py b/examples/egocap/tests/capture_server/test_mock_sdks.py index ba8d6ce0ba..5a5745adca 100644 --- a/examples/egocap/tests/capture_server/test_mock_sdks.py +++ b/examples/egocap/tests/capture_server/test_mock_sdks.py @@ -297,6 +297,11 @@ def test_a_source_without_a_delay_reads_the_current_instant_exactly(): assert _entered_session(controller_delay_s=0.2)._delayed(3.0, "glove") == 3.0 +def test_jitter_never_moves_a_source_that_has_no_delay(): + session = _entered_session(controller_delay_s=0.2, delay_jitter_s=0.5) + assert all(session._delayed(3.0, "glove") == 3.0 for _ in range(50)) + + def test_startup_error_fault_raises_on_enter(): session = mic.TeleopSession(_full_config(), scenario="demo", seed=0, faults={"startup_error"}) with pytest.raises(RuntimeError, match="startup_error"): diff --git a/examples/egocap/tests/recording/unit/test_count_daily_trajectories.py b/examples/egocap/tests/recording/unit/test_count_daily_trajectories.py index 0bed1e0bf4..0bf0b4634b 100644 --- a/examples/egocap/tests/recording/unit/test_count_daily_trajectories.py +++ b/examples/egocap/tests/recording/unit/test_count_daily_trajectories.py @@ -6,6 +6,8 @@ import time from pathlib import Path +import pytest + from egocap.analytics.count_daily_trajectories import ( _episode_index, _episode_recorded_date, @@ -260,11 +262,12 @@ def test_compute_station_data_breakdown_skips_non_matching_station(tmp_path): assert breakdown["total_seconds"] == 0.0 -def test_compute_station_data_breakdown_skips_aligned_and_non_dirs(tmp_path): +@pytest.mark.parametrize("session_name", ["2026-01-01-10-00-00_aligned", ".2026-01-01-10-00-00"]) +def test_compute_station_data_breakdown_skips_aligned_hidden_and_non_dirs(tmp_path, session_name): _build_session( tmp_path, "Kitchen", - "2026-01-01-10-00-00_aligned", + session_name, "station_01", episodes={0: {"episode_duration": 5.0, "recorded_at": "2026-01-01; 10-00-00"}}, ) @@ -363,11 +366,12 @@ def test_count_trajectories_date_mismatch_produces_no_session(tmp_path): assert count_trajectories(tmp_path, "2026-01-01") == {} -def test_count_trajectories_skips_aligned_and_non_dir_entries(tmp_path): +@pytest.mark.parametrize("session_name", ["2026-01-01-10-00-00_aligned", ".2026-01-01-10-00-00"]) +def test_count_trajectories_skips_aligned_hidden_and_non_dir_entries(tmp_path, session_name): _build_session( tmp_path, "Kitchen", - "2026-01-01-10-00-00_aligned", + session_name, "station_01", episodes={0: {"episode_duration": 5.0, "recorded_at": "2026-01-01; 10-00-00"}}, ) diff --git a/examples/egocap/tests/recording_service/test_episode_timing.py b/examples/egocap/tests/recording_service/test_episode_timing.py index 378afe0f50..cc6c38ee99 100644 --- a/examples/egocap/tests/recording_service/test_episode_timing.py +++ b/examples/egocap/tests/recording_service/test_episode_timing.py @@ -30,7 +30,6 @@ ROWS = 5 TIMING = { "clock_mapping": {"method": "m", "mappings": [{"epoch": 1, "offset_ns": -7}]}, - "tracking_time": "host_poll", } From 8dbf06941b087894b8de1dbd3024643ffad81e89 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 16:49:43 -0500 Subject: [PATCH 35/38] egocap: run alignment in a child process; recover, clean up and keep aligned copies in step - Run each alignment as a low-priority child process of the command-line aligner, so it neither shares the recorder's interpreter nor outlives a shutdown; exit 1 is a refusal, 2 a retryable failure. - Scan for unfinished work on a thread at worker start, remember refusals in a hidden marker beside the aligned copy, and remove staging directories left by a run that was killed long ago. - Queue alignment for every kept episode, including one kept by recovering an interrupted take. - Refuse to publish an episode on a different index camera into an existing aligned session. - Move an aligned copy with its session and apply task metadata updates to it. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/backend/egocap_web/app.py | 12 +- .../egocap/backend/egocap_web/auto_align.py | 110 ++++-- .../backend/egocap_web/recording_session.py | 13 +- .../update_episode_task_description.py | 23 ++ .../egocap/eod/eod_studio_session_move.py | 6 + .../egocap/recording/aligned_writer.py | 6 +- .../egocap/recording/tools/align_episode.py | 5 +- .../egocap/tests/backend/test_auto_align.py | 369 +++++++++++------- .../tests/backend/test_recording_session.py | 84 ++++ .../egocap/tests/backend/test_viser_scene.py | 19 +- .../recording/unit/test_align_kept_episode.py | 10 +- .../unit/test_eod_studio_session_move.py | 20 + .../unit/test_publish_aligned_episode.py | 15 + .../test_update_episode_task_description.py | 34 ++ 14 files changed, 541 insertions(+), 185 deletions(-) diff --git a/examples/egocap/backend/egocap_web/app.py b/examples/egocap/backend/egocap_web/app.py index a1d61299cb..999cb7d7f2 100644 --- a/examples/egocap/backend/egocap_web/app.py +++ b/examples/egocap/backend/egocap_web/app.py @@ -28,7 +28,6 @@ from recording_service import ( CalibrationAsset, ConfigurationError, - EpisodeResult, QcConfig, ServiceConfig, VideoSourceSpec, @@ -451,16 +450,7 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: aligner_task: asyncio.Task[None] | None = None if resolved_station is not None and resolved_station.alignment_index is not None: aligner = AutoAligner(recording_output_root, resolved_station.alignment_index) - recorded = coordinator.on_episode_result - - def on_result(result: EpisodeResult) -> None: - """Keep the recording status update, then queue a kept episode for alignment.""" - if recorded is not None: - recorded(result) - aligner.submit(result) - - coordinator.on_episode_result = on_result - aligner.recover() + coordinator.on_episode_kept = aligner.submit aligner_task = asyncio.create_task(aligner.run()) visualization: VisualizationScene | None = None try: diff --git a/examples/egocap/backend/egocap_web/auto_align.py b/examples/egocap/backend/egocap_web/auto_align.py index 902eb2efd8..1180d0b6d9 100644 --- a/examples/egocap/backend/egocap_web/auto_align.py +++ b/examples/egocap/backend/egocap_web/auto_align.py @@ -4,12 +4,12 @@ """Time-aligns each kept episode in the background, right after its take is finalized. -One worker handles episodes in the order they were kept, so aligning never competes with itself or with the -recording in progress for more than one episode's worth of CPU. An episode that cannot be aligned (for example a -source with no qualified time) is logged with the reason and left as recorded; the raw episode is never modified, -and ``recording/tools/align_episode.py`` aligns it later by hand. Output is published by one rename, so an -alignment cut short by a shutdown or crash leaves no partial result, and :meth:`AutoAligner.recover` picks the -unfinished episodes up again at the next start. +One worker handles episodes in the order they were kept. Each alignment runs as a low-priority child process (the +same ``recording/tools/align_episode.py`` an operator can run by hand), so its CPU and memory never compete with a +live take inside the recorder's own process, and a shutdown can stop it. An episode that cannot be aligned is +logged with the reason and left as recorded; the raw episode is never modified. Output is published by one rename, +so an alignment that is killed leaves no partial result. At startup the worker re-queues the kept episodes that +still have no aligned copy. """ from __future__ import annotations @@ -17,21 +17,28 @@ import asyncio import contextlib import logging +import shutil +import sys +import time from dataclasses import dataclass from pathlib import Path -from egocap.recording.aligned_writer import align_kept_episode, episode_qualification +from egocap.recording.aligned_writer import episode_qualification from egocap.recording.episode_layout import ( FINALIZATION_KEEP, MANIFEST_DIR, destination_path, - manifest_path, read_manifest, ) from recording_service import Disposition, EpisodeResult logger = logging.getLogger("isaaccapture.egocap_web.auto_align") +#: The command-line aligner, run once per episode. +_ALIGN_TOOL = Path(__file__).resolve().parents[2] / "recording" / "tools" / "align_episode.py" +#: A staging directory untouched this long belongs to a run that is no longer going. +_STALE_STAGING_SECONDS = 24 * 3600 + @dataclass(frozen=True) class _Job: @@ -46,6 +53,11 @@ def aligned(self) -> Path: """Where this episode's aligned copy goes, beside its group.""" return self.final.parent.with_name(f"{self.final.parent.name}_aligned") / self.final.name + @property + def refused_marker(self) -> Path: + """A hidden file in the aligned session recording that this episode was refused; deleting it retries.""" + return self.aligned.parent / f".{self.final.name}.refused" + class AutoAligner: """Aligns kept episodes one at a time on its own worker task.""" @@ -56,18 +68,22 @@ def __init__(self, output_root: Path, index_source: str) -> None: self._index_source = index_source # Unbounded: a job is three small fields, and the number waiting is the number of kept episodes. self._queue: asyncio.Queue[_Job] = asyncio.Queue() + self._process: asyncio.subprocess.Process | None = None def submit(self, result: EpisodeResult) -> None: """Queue a finished take for alignment; anything other than a kept episode is ignored.""" if result.disposition is Disposition.KEPT and result.final_path is not None: self._queue.put_nowait(_Job(result.session_id, result.episode_index, result.final_path)) - def recover(self) -> None: - """Queue every kept episode, in any session, that has no aligned copy and whose evidence allows one. + def scan(self) -> list[_Job]: + """Every kept episode, in any session, that has no aligned copy and whose evidence allows one. - Picks up alignments a restart cut short. An episode recorded without qualified timing evidence (an older - recording, or a station with no latency set) is skipped, so history is not retried at every start. + Skips episodes already refused (see ``_Job.refused_marker``), and an episode recorded without qualified + timing evidence (an older recording, or a station with no tracking delay set), so history is not retried at + every start. Also removes staging directories left by a run that was killed long ago. Blocking file work. """ + jobs: list[_Job] = [] + groups: set[Path] = set() for path in sorted(self._output_root.glob(f"*/{MANIFEST_DIR}/episode_*.json")): try: manifest = read_manifest(path) @@ -78,10 +94,12 @@ def recover(self) -> None: else session / manifest.final_path ) job = _Job(manifest.session_id, manifest.episode_index, final) + groups.add(final.parent) eligible = ( manifest.storage_phase == "FINALIZED" and manifest.finalization == FINALIZATION_KEEP and not job.aligned.exists() + and not job.refused_marker.exists() and all( episode_qualification( final.parent, int(final.name.removeprefix("episode_")), self._index_source @@ -91,15 +109,25 @@ def recover(self) -> None: except Exception: # noqa: BLE001, S112 - an unreadable record is simply not eligible continue if eligible: - self._queue.put_nowait(job) + jobs.append(job) + for group in groups: + for stale in group.parent.glob(f".{group.name}_aligned.staging-*"): + with contextlib.suppress(OSError): + if time.time() - stale.stat().st_mtime > _STALE_STAGING_SECONDS: + shutil.rmtree(stale, ignore_errors=True) + return jobs async def run(self) -> None: - """Align queued episodes until cancelled; a failed alignment is logged and never stops the worker.""" + """Re-queue unfinished work, then align queued episodes until cancelled; failures never stop the worker.""" + try: + for job in await asyncio.to_thread(self.scan): + self._queue.put_nowait(job) + except Exception as exc: # noqa: BLE001 - recovery is best effort; live episodes are still aligned + logger.warning("time-alignment recovery failed: %s", exc) while True: job = await self._queue.get() try: - # Blocking file and numeric work, kept off the event loop that serves recording and preview. - await asyncio.to_thread(self._align, job) + await self._align(job) except Exception as exc: # noqa: BLE001 - one episode's failure must not end the worker logger.warning("%s episode %d was not time-aligned: %s", job.session_id, job.episode_index, exc) finally: @@ -108,9 +136,9 @@ async def run(self) -> None: async def close(self, task: asyncio.Task[None], timeout: float) -> None: """Let the queued episodes finish for up to ``timeout`` seconds, then stop the worker ``task``. - Call after the recorder has closed, so the last kept episode is already queued. A thread still writing - when the deadline passes cannot be interrupted; it only ever publishes by one rename, and the episode is - recovered at the next start if it did not finish. + Call after the recorder has closed, so the last kept episode is already queued. An alignment still running + at the deadline is killed; it publishes only by one rename, so nothing partial appears, and the episode is + picked up again at the next start. """ try: await asyncio.wait_for(self._queue.join(), timeout) @@ -120,12 +148,46 @@ async def close(self, task: asyncio.Task[None], timeout: float) -> None: with contextlib.suppress(asyncio.CancelledError): await task - def _align(self, job: _Job) -> None: - """Align one kept episode from its stored manifest; raises with the reason when it is refused.""" + async def _align(self, job: _Job) -> None: + """Align one kept episode in a child process; raises with the reason when it is refused or fails.""" if job.aligned.exists(): return # The manifest stays in the recording session; a routed episode sits elsewhere, under its slot. - manifest = read_manifest(manifest_path(self._output_root / job.session_id, job.episode_index)) - slot = int(job.final.name.removeprefix("episode_")) - align_kept_episode(job.final.parent, slot, self._index_source, manifest) + command = [ + "nice", + "-n", + "10", + sys.executable, + str(_ALIGN_TOOL), + str(job.final.parent), + "--episode", + str(int(job.final.name.removeprefix("episode_"))), + "--index-source", + self._index_source, + "--manifest-session", + str(self._output_root / job.session_id), + "--manifest-episode", + str(job.episode_index), + ] + process = await asyncio.create_subprocess_exec( + *command, stdout=asyncio.subprocess.DEVNULL, stderr=asyncio.subprocess.PIPE + ) + self._process = process + try: + _, stderr = await process.communicate() + except asyncio.CancelledError: + # Cancelled at shutdown: stop the child rather than leave it running past the recorder. + process.kill() + await process.wait() + raise + finally: + self._process = None + reason = stderr.decode(errors="replace").strip() + if process.returncode == 1: + # Exit 1 is a refusal, which is the same every time, so remember it instead of retrying at every start; + # any other failure (an unreadable manifest, a killed child) stays retryable. + job.refused_marker.parent.mkdir(parents=True, exist_ok=True) + job.refused_marker.write_text(reason + "\n", encoding="utf-8") + if process.returncode != 0: + raise RuntimeError(reason or f"aligner exited with status {process.returncode}") logger.info("%s episode %d was time-aligned", job.session_id, job.episode_index) diff --git a/examples/egocap/backend/egocap_web/recording_session.py b/examples/egocap/backend/egocap_web/recording_session.py index 351d01a227..e27a4a9c39 100644 --- a/examples/egocap/backend/egocap_web/recording_session.py +++ b/examples/egocap/backend/egocap_web/recording_session.py @@ -63,6 +63,7 @@ from egocap_web.recording_adapter import RecordingIngress, _convert_raw_item, validate_tracking_descriptor from recording_service import ( CloseResult, + Disposition, EpisodeInfo, EpisodeResult, PendingEpisode, @@ -244,6 +245,8 @@ def __init__( # methods. None (the default) means no one is listening yet. self.on_episode_started: Callable[[], None] | None = None self.on_episode_result: Callable[[EpisodeResult], None] | None = None + #: Called with each episode finalized as kept, including one recovered after an interruption. + self.on_episode_kept: Callable[[EpisodeResult], None] | None = None self.on_batch_rotated: Callable[[], None] | None = None @property @@ -560,6 +563,12 @@ def _emit_result(self, result: EpisodeResult) -> None: coordinator's own retained operation task.""" if self.on_episode_result is not None: self.on_episode_result(result) + self._emit_kept(result) + + def _emit_kept(self, result: EpisodeResult) -> None: + """Tell ``on_episode_kept`` about an episode that was kept.""" + if result.disposition is Disposition.KEPT and self.on_episode_kept is not None: + self.on_episode_kept(result) async def stop_episode(self, episode_id: str) -> EpisodeResult: service = self._require_open() @@ -683,7 +692,9 @@ def _require_matching_active_episode(self, service: _RecordingService, episode_i async def recover_episode(self, episode_id: str) -> EpisodeResult: service = self._require_open() - return await self._run_operation(OperationKind.RECOVERING, partial(service.recover_episode, episode_id)) + result = await self._run_operation(OperationKind.RECOVERING, partial(service.recover_episode, episode_id)) + self._emit_kept(result) + return result async def discard_pending(self, episode_id: str) -> EpisodeResult: service = self._require_open() diff --git a/examples/egocap/recording/egocap/data_processing/update_episode_task_description.py b/examples/egocap/recording/egocap/data_processing/update_episode_task_description.py index cc12591410..a7db6dfa12 100644 --- a/examples/egocap/recording/egocap/data_processing/update_episode_task_description.py +++ b/examples/egocap/recording/egocap/data_processing/update_episode_task_description.py @@ -108,6 +108,25 @@ class EpisodeTaskUpdateResult: config_yaml_updated: bool = False +def _update_aligned_copy( + aligned_root: Path, indices: list[int], task_description: str, task_name: str, studio: str +) -> None: + """Apply the same task, name and studio metadata to an aligned copy's root, episodes and ``config.yaml``.""" + fields = {"task_description": task_description} + if task_name: + fields["task_name"] = task_name + if studio: + fields["studio"] = studio + store = zarr.open(str(aligned_root), mode="a") + store.attrs.update(fields) + for n in indices: + if f"episode_{n}" in store: + store[f"episode_{n}"].attrs.update(fields) + _update_session_config_yaml( + aligned_root, task_description=task_description, task_name=task_name, studio=studio + ) + + def update_episode_task_description( zarr_root: Path, episodes: str, @@ -169,6 +188,10 @@ def update_episode_task_description( task_name=task_name, studio=studio_stored, ) + # The time-aligned copy beside the session carries the same metadata, so it is updated with it. + aligned_root = zarr_root.with_name(f"{zarr_root.name}_aligned") + if aligned_root.is_dir(): + _update_aligned_copy(aligned_root, indices, task_description, task_name, studio_stored) try: refresh_session_egocap_zarr_aggregates(zarr_root) diff --git a/examples/egocap/recording/egocap/eod/eod_studio_session_move.py b/examples/egocap/recording/egocap/eod/eod_studio_session_move.py index cb11c80b46..721ddb430d 100644 --- a/examples/egocap/recording/egocap/eod/eod_studio_session_move.py +++ b/examples/egocap/recording/egocap/eod/eod_studio_session_move.py @@ -82,7 +82,13 @@ def relocate_session_to_canonical_studio( if dest.exists(): raise OSError(f"EOD session relocate: destination already exists (refuse overwrite): {dest}") dest.parent.mkdir(parents=True, exist_ok=True) + aligned, aligned_dest = session.with_name(f"{session.name}_aligned"), dest.with_name(f"{dest.name}_aligned") + # The aligned copy follows its session; refuse before moving anything if it would collide. + if aligned.is_dir() and aligned_dest.exists(): + raise OSError(f"EOD session relocate: destination already exists (refuse overwrite): {aligned_dest}") shutil.move(str(session), str(dest)) + if aligned.is_dir(): + shutil.move(str(aligned), str(aligned_dest)) return dest diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index 06476f4886..b9684a7af7 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -108,7 +108,11 @@ def _write_root(raw_session: Path, aligned_session: Path, index_source: str) -> raw_attrs = {} for key, value in raw_attrs.items(): aligned_root.attrs[key] = value - # The index source is a root attribute so a reader knows which camera's frames define the timeline. + # The index source is a root attribute so a reader knows which camera's frames define the timeline. One root + # has one, so an episode on a different index is refused rather than relabelling the ones already there. + existing = aligned_root.attrs.get("index_source") + if existing not in (None, index_source): + raise AlignedWriteError(f"the aligned session uses index source {existing!r}, not {index_source!r}") aligned_root.attrs["index_source"] = index_source for name in ALIGNED_SESSION_SIDECARS: source, target = raw_session / name, aligned_session / name diff --git a/examples/egocap/recording/tools/align_episode.py b/examples/egocap/recording/tools/align_episode.py index 1b7c9fabab..a657869704 100755 --- a/examples/egocap/recording/tools/align_episode.py +++ b/examples/egocap/recording/tools/align_episode.py @@ -19,7 +19,8 @@ episode's manifest stays in the session it was recorded in), and ``--manifest-episode`` its index there when that differs from ``--episode`` (a routed episode sits under its slot). The manifest is used only if it describes exactly this finalized, kept episode. Exit status 0 means the aligned episode was -published; 1 means it was refused or failed, with the reason on stderr. +published; 1 means it was refused (the same input is refused every time); 2 means the manifest could not be read +(retry later). The reason is on stderr. """ import argparse @@ -53,7 +54,7 @@ def main(argv: list[str] | None = None) -> int: manifest = read_manifest(manifest_path(args.manifest_session or args.session, manifest_episode)) except (OSError, ValueError) as exc: print(f"cannot read the episode's manifest: {exc}", file=sys.stderr) - return 1 + return 2 try: aligned = align_kept_episode( args.session, diff --git a/examples/egocap/tests/backend/test_auto_align.py b/examples/egocap/tests/backend/test_auto_align.py index 8c7361e74f..9d53d345a7 100644 --- a/examples/egocap/tests/backend/test_auto_align.py +++ b/examples/egocap/tests/backend/test_auto_align.py @@ -2,11 +2,13 @@ # # SPDX-License-Identifier: Apache-2.0 -"""Background alignment of kept episodes: which results are queued, what is aligned, and worker resilience.""" +"""Background alignment of kept episodes: what is queued, scanned, aligned in a child process, and refused.""" import asyncio +import json import logging -import threading +import os +import time from pathlib import Path import pytest @@ -25,6 +27,26 @@ from recording_service import Disposition, EpisodeResult from tests.recording.unit.test_align_kept_episode import INDEX, build_raw, make_manifest +STUB = """ +import json, os, sys, time +from pathlib import Path + +argv = sys.argv[1:] +with open(os.environ["STUB_LOG"], "a") as log: + log.write(json.dumps(argv) + "\\n") +group = Path(argv[0]) +slot = argv[argv.index("--episode") + 1] +if "hang" in group.name: + Path(os.environ["STUB_LOG"] + ".pid").write_text(str(os.getpid())) + time.sleep(60) +if "bad" in group.name: + print("no qualified latency", file=sys.stderr) + sys.exit(1) +if "crash" in group.name: + sys.exit(3) +(group.with_name(group.name + "_aligned") / f"episode_{slot}").mkdir(parents=True) +""" + def _result(index=3, disposition=Disposition.KEPT, final_path="default", session_id="session_a"): if final_path == "default": @@ -43,24 +65,18 @@ def _result(index=3, disposition=Disposition.KEPT, final_path="default", session @pytest.fixture -def calls(monkeypatch): - recorded = [] - monkeypatch.setattr(auto_align, "manifest_path", lambda root, index: Path(root) / f"manifest_{index}.json") - monkeypatch.setattr(auto_align, "read_manifest", lambda path: f"manifest:{path}") - monkeypatch.setattr(auto_align, "align_kept_episode", lambda *args: recorded.append(args)) - return recorded +def stub_tool(tmp_path, monkeypatch): + tool = tmp_path / "stub_tool" / "align_stub.py" + tool.parent.mkdir() + tool.write_text(STUB, encoding="utf-8") + log = tmp_path / "stub_tool" / "calls.log" + monkeypatch.setattr(auto_align, "_ALIGN_TOOL", tool) + monkeypatch.setenv("STUB_LOG", str(log)) + return log -async def _drain(aligner): - task = asyncio.create_task(aligner.run()) - for _ in range(200): - if aligner._queue.empty(): - break - await asyncio.sleep(0.01) - await asyncio.sleep(0.05) - task.cancel() - with pytest.raises(asyncio.CancelledError): - await task +def _stub_calls(log): + return [json.loads(line) for line in log.read_text().splitlines()] if log.exists() else [] @pytest.mark.parametrize( @@ -76,39 +92,9 @@ def test_results_that_are_not_a_kept_episode_with_a_path_are_ignored(result): assert aligner._queue.empty() -async def test_a_kept_episode_is_aligned_from_its_manifest_and_slot(calls): - aligner = AutoAligner(Path("/out"), "head") - aligner.submit(_result()) - await _drain(aligner) - assert calls == [(Path("/routed/group"), 7, "head", "manifest:/out/session_a/manifest_3.json")] - - -async def test_a_failed_alignment_is_logged_and_the_next_episode_is_still_aligned(calls, monkeypatch, caplog): - def refuse_first(*args): - if not calls: - calls.append(args) - raise ValueError("no qualified latency") - calls.append(args) - - monkeypatch.setattr(auto_align, "align_kept_episode", refuse_first) - aligner = AutoAligner(Path("/out"), "head") - aligner.submit(_result(index=1)) - aligner.submit(_result(index=2)) - with caplog.at_level(logging.INFO, logger=auto_align.logger.name): - await _drain(aligner) - assert len(calls) == 2 - warnings = [r for r in caplog.records if r.levelno == logging.WARNING] - assert ( - len(warnings) == 1 - and "session_a episode 1" in warnings[0].getMessage() - and "no qualified latency" in warnings[0].getMessage() - ) - assert any("session_a episode 2 was time-aligned" in r.getMessage() for r in caplog.records) - - -async def test_cancelling_an_idle_worker_ends_it_cleanly(): - task = asyncio.create_task(AutoAligner(Path("/out"), "head").run()) - await asyncio.sleep(0) +async def test_cancelling_an_idle_worker_ends_it_cleanly(tmp_path): + task = asyncio.create_task(AutoAligner(tmp_path / "out", "head").run()) + await asyncio.sleep(0.05) task.cancel() with pytest.raises(asyncio.CancelledError): await task @@ -150,160 +136,281 @@ def _write_session_manifest(output_root, session, index, *, aligned=False, quali return final -def _queued(aligner): - jobs = [] - while not aligner._queue.empty(): - jobs.append(aligner._queue.get_nowait()) - return jobs - - -def test_recover_queues_only_kept_episodes_without_an_aligned_copy(tmp_path): +def test_scan_finds_only_kept_episodes_without_an_aligned_copy(tmp_path): _write_session_manifest(tmp_path, "s1", 0) _write_session_manifest(tmp_path, "s1", 1, aligned=True) _write_session_manifest(tmp_path, "s1", 2, finalization=FINALIZATION_RETAIN) _write_session_manifest(tmp_path, "s1", 3, storage_phase="WRITING") aligner = AutoAligner(tmp_path, "head") - aligner.recover() - assert _queued(aligner) == [auto_align._Job("s1", 0, tmp_path / "s1" / episode_dir_names(0)[1])] + jobs = aligner.scan() + assert jobs == [auto_align._Job("s1", 0, tmp_path / "s1" / episode_dir_names(0)[1])] -def test_recover_queues_older_sessions_work_even_when_the_newest_session_is_empty(tmp_path): +def test_scan_finds_older_sessions_work_even_when_the_newest_session_is_empty(tmp_path): _write_session_manifest(tmp_path, "s1", 0) _write_session_manifest(tmp_path, "s2", 0) (tmp_path / "s3" / auto_align.MANIFEST_DIR).mkdir(parents=True) aligner = AutoAligner(tmp_path, "head") - aligner.recover() - assert [job.session_id for job in _queued(aligner)] == ["s1", "s2"] + jobs = aligner.scan() + assert [job.session_id for job in jobs] == ["s1", "s2"] -def test_recover_skips_an_episode_whose_timing_is_not_qualified(tmp_path): +def test_scan_skips_an_episode_whose_timing_is_not_qualified(tmp_path): _write_session_manifest(tmp_path, "s1", 0, qualified=False) _write_session_manifest(tmp_path, "s1", 1) aligner = AutoAligner(tmp_path, "head") - aligner.recover() - assert [job.episode_index for job in _queued(aligner)] == [1] + jobs = aligner.scan() + assert [job.episode_index for job in jobs] == [1] -def test_recover_skips_an_episode_with_no_readable_evidence(tmp_path): +def test_scan_skips_an_episode_with_no_readable_evidence(tmp_path): _write_session_manifest(tmp_path, "s1", 0, qualified=None) aligner = AutoAligner(tmp_path, "head") - aligner.recover() - assert aligner._queue.empty() + assert aligner.scan() == [] -def test_recover_skips_an_unreadable_manifest_and_keeps_the_rest(tmp_path): +def test_scan_skips_an_unreadable_manifest_and_keeps_the_rest(tmp_path): _write_session_manifest(tmp_path, "s1", 1) (tmp_path / "s1" / auto_align.MANIFEST_DIR / "episode_0.json").write_text("{not json") aligner = AutoAligner(tmp_path, "head") - aligner.recover() - assert [job.episode_index for job in _queued(aligner)] == [1] + jobs = aligner.scan() + assert [job.episode_index for job in jobs] == [1] -def test_recover_uses_the_routed_destination_for_a_routed_episode(tmp_path): +def test_scan_uses_the_routed_destination_for_a_routed_episode(tmp_path): _write_session_manifest(tmp_path, "s1", 0, studio="Lab", assignment={"group": "Lab/20260101", "slot": 4}) aligner = AutoAligner(tmp_path, "head") - aligner.recover() - assert _queued(aligner) == [auto_align._Job("s1", 0, tmp_path / "Lab/20260101/episode_4")] + jobs = aligner.scan() + assert jobs == [auto_align._Job("s1", 0, tmp_path / "Lab/20260101/episode_4")] -def test_recover_skips_a_routed_episode_that_is_already_aligned(tmp_path): +def test_scan_skips_a_routed_episode_that_is_already_aligned(tmp_path): _write_session_manifest( tmp_path, "s1", 0, aligned=True, studio="Lab", assignment={"group": "Lab/20260101", "slot": 4} ) aligner = AutoAligner(tmp_path, "head") - aligner.recover() - assert _queued(aligner) == [] + jobs = aligner.scan() + assert jobs == [] @pytest.mark.parametrize("create_root", [False, True]) -def test_recover_with_no_sessions_queues_nothing(tmp_path, create_root): +def test_scan_with_no_sessions_finds_nothing(tmp_path, create_root): root = tmp_path / "out" if create_root: root.mkdir() aligner = AutoAligner(root, "head") - aligner.recover() - assert aligner._queue.empty() + assert aligner.scan() == [] -def test_recover_is_not_vetoed_by_a_declared_source_the_episode_did_not_record(tmp_path): +def test_scan_is_not_vetoed_by_a_declared_source_the_episode_did_not_record(tmp_path): _write_session_manifest(tmp_path, "s1", 0) (tmp_path / "s1" / "config.yaml").write_text( yaml.safe_dump({"video_sources": [{"name": "head"}, {"name": "optional_camera"}]}), encoding="utf-8" ) aligner = AutoAligner(tmp_path, "head") - aligner.recover() - assert [job.episode_index for job in _queued(aligner)] == [0] + jobs = aligner.scan() + assert [job.episode_index for job in jobs] == [0] -async def test_many_recovered_episodes_are_all_aligned_in_order(monkeypatch, tmp_path): - calls = [] - monkeypatch.setattr(auto_align, "align_kept_episode", lambda *args: calls.append(args)) - for index in range(9): - _write_session_manifest(tmp_path, "s1", index) +def test_the_logger_is_in_the_isaaccapture_tree(): + assert auto_align.logger.name == "isaaccapture.egocap_web.auto_align" + + +async def test_a_kept_episode_is_aligned_by_a_child_process_with_its_slot_and_manifest(tmp_path, stub_tool): + aligner = AutoAligner(tmp_path / "out", "head") + aligner.submit(_result(index=3, final_path=tmp_path / "out" / "Lab" / "g" / "episode_000007")) + task = asyncio.create_task(aligner.run()) + await aligner.close(task, 30) + (argv,) = _stub_calls(stub_tool) + assert argv == [ + str(tmp_path / "out" / "Lab" / "g"), + "--episode", + "7", + "--index-source", + "head", + "--manifest-session", + str(tmp_path / "out" / "session_a"), + "--manifest-episode", + "3", + ] + assert (tmp_path / "out" / "Lab" / "g_aligned" / "episode_7").is_dir() + + +async def test_an_episode_that_already_has_an_aligned_copy_is_not_aligned_again(tmp_path, stub_tool): + (tmp_path / "group_aligned" / "episode_7").mkdir(parents=True) aligner = AutoAligner(tmp_path, "head") - aligner.recover() - assert aligner._queue.qsize() == 9 + aligner.submit(_result(final_path=tmp_path / "group" / "episode_7")) task = asyncio.create_task(aligner.run()) await aligner.close(task, 30) - assert [args[1] for args in calls] == list(range(9)) + assert _stub_calls(stub_tool) == [] -async def test_many_live_submits_are_all_aligned_in_order_and_close_drains_them(calls): - aligner = AutoAligner(Path("/out"), "head") - for index in range(100): - aligner.submit(_result(index=index, final_path=Path("/g") / f"episode_{index}")) +async def test_many_submits_are_all_aligned_in_order_and_close_drains_them(tmp_path, stub_tool): + aligner = AutoAligner(tmp_path, "head") + for index in range(6): + aligner.submit(_result(index=index, final_path=tmp_path / f"g{index}" / f"episode_{index}")) task = asyncio.create_task(aligner.run()) - await aligner.close(task, 30) - assert [args[1] for args in calls] == list(range(100)) + await aligner.close(task, 60) + assert [call[0] for call in _stub_calls(stub_tool)] == [str(tmp_path / f"g{i}") for i in range(6)] assert aligner._queue.empty() and task.cancelled() -def test_the_logger_is_in_the_isaaccapture_tree(): - assert auto_align.logger.name == "isaaccapture.egocap_web.auto_align" +async def test_a_refusal_writes_a_marker_and_the_next_episode_is_still_aligned(tmp_path, stub_tool, caplog): + aligner = AutoAligner(tmp_path, "head") + aligner.submit(_result(index=1, final_path=tmp_path / "bad" / "episode_1")) + aligner.submit(_result(index=2, final_path=tmp_path / "good" / "episode_2")) + task = asyncio.create_task(aligner.run()) + with caplog.at_level(logging.INFO, logger=auto_align.logger.name): + await aligner.close(task, 30) + assert (tmp_path / "bad_aligned" / ".episode_1.refused").read_text() == "no qualified latency\n" + assert (tmp_path / "good_aligned" / "episode_2").is_dir() + warnings = [r.getMessage() for r in caplog.records if r.levelno == logging.WARNING] + assert len(warnings) == 1 and "session_a episode 1" in warnings[0] and "no qualified latency" in warnings[0] + assert any("session_a episode 2 was time-aligned" in r.getMessage() for r in caplog.records) -async def test_an_episode_that_already_has_an_aligned_copy_is_not_aligned_again(calls, tmp_path): - aligned = tmp_path / "group_aligned" / "episode_7" - aligned.mkdir(parents=True) +async def test_a_crash_is_logged_without_a_marker_and_the_next_episode_is_still_aligned( + tmp_path, stub_tool, caplog +): aligner = AutoAligner(tmp_path, "head") - aligner.submit(_result(final_path=tmp_path / "group" / "episode_7")) - await _drain(aligner) - assert calls == [] + aligner.submit(_result(index=1, final_path=tmp_path / "crash" / "episode_1")) + aligner.submit(_result(index=2, final_path=tmp_path / "good" / "episode_2")) + task = asyncio.create_task(aligner.run()) + with caplog.at_level(logging.WARNING, logger=auto_align.logger.name): + await aligner.close(task, 30) + assert not (tmp_path / "crash_aligned").exists() + assert "exited with status 3" in caplog.text + assert (tmp_path / "good_aligned" / "episode_2").is_dir() + +async def test_a_refused_episode_is_not_queued_again_until_its_marker_is_deleted(tmp_path, stub_tool): + _write_session_manifest(tmp_path, "bad", 0) + aligner = AutoAligner(tmp_path, "head") + (job,) = aligner.scan() + aligner.submit(_result(index=0, session_id="bad", final_path=job.final)) + task = asyncio.create_task(aligner.run()) + await aligner.close(task, 30) + assert job.refused_marker.is_file() and aligner.scan() == [] + job.refused_marker.unlink() + assert aligner.scan() == [job] -async def test_a_recovered_episode_is_aligned_for_real_and_its_aligned_copy_appears(tmp_path): + +async def test_the_worker_aligns_what_the_startup_scan_finds_without_a_submit(tmp_path, stub_tool): + _write_session_manifest(tmp_path, "s1", 0) + _write_session_manifest(tmp_path, "s1", 1, aligned=True) + aligner = AutoAligner(tmp_path, "head") + task = asyncio.create_task(aligner.run()) + for _ in range(300): + if (tmp_path / "s1_aligned" / "episode_0").is_dir(): + break + await asyncio.sleep(0.05) + await aligner.close(task, 30) + assert len(_stub_calls(stub_tool)) == 1 + + +async def test_a_failing_scan_is_logged_and_the_worker_still_aligns_submitted_episodes( + tmp_path, stub_tool, monkeypatch, caplog +): + def broken_scan(): + raise OSError("disk unavailable") + + aligner = AutoAligner(tmp_path, "head") + monkeypatch.setattr(aligner, "scan", broken_scan) + aligner.submit(_result(index=2, final_path=tmp_path / "good" / "episode_2")) + task = asyncio.create_task(aligner.run()) + with caplog.at_level(logging.WARNING, logger=auto_align.logger.name): + await aligner.close(task, 30) + assert "recovery failed: disk unavailable" in caplog.text + assert (tmp_path / "good_aligned" / "episode_2").is_dir() + + +async def test_close_kills_an_alignment_still_running_at_the_deadline_and_returns(tmp_path, stub_tool, caplog): + aligner = AutoAligner(tmp_path, "head") + aligner.submit(_result(index=1, final_path=tmp_path / "hang" / "episode_1")) + task = asyncio.create_task(aligner.run()) + pid_file = Path(str(stub_tool) + ".pid") + for _ in range(300): + if pid_file.exists() and pid_file.read_text(): + break + await asyncio.sleep(0.05) + pid = int(pid_file.read_text()) + with caplog.at_level(logging.WARNING, logger=auto_align.logger.name): + await asyncio.wait_for(aligner.close(task, 0.2), 10) + assert "still has queued episodes" in caplog.text + assert task.cancelled() and aligner._process is None + with pytest.raises(ProcessLookupError): + os.kill(pid, 0) + assert not (tmp_path / "hang_aligned").exists() + + +async def test_a_kept_episode_is_aligned_for_real_through_the_command_line_tool(tmp_path): session = tmp_path / "out" / "s1" build_raw(session) write_manifest(session, make_manifest(session, session_id="s1")) aligner = AutoAligner(tmp_path / "out", INDEX) - aligner.recover() - assert aligner._queue.qsize() == 1 + assert [job.episode_index for job in aligner.scan()] == [0] task = asyncio.create_task(aligner.run()) - await aligner.close(task, 60) + for _ in range(1200): + if (tmp_path / "out" / "s1_aligned" / "episode_0").is_dir(): + break + await asyncio.sleep(0.1) + await aligner.close(task, 120) assert (tmp_path / "out" / "s1_aligned" / "episode_0").is_dir() - assert task.cancelled() + assert aligner.scan() == [] -async def test_close_waits_for_queued_episodes_before_stopping_the_worker(calls): - aligner = AutoAligner(Path("/out"), "head") - aligner.submit(_result(index=1)) - aligner.submit(_result(index=2)) +async def test_an_episode_the_tool_refuses_is_marked_with_its_reason_and_left_unaligned(tmp_path): + session = tmp_path / "out" / "s1" + build_raw(session) + write_manifest(session, make_manifest(session, session_id="s1")) + aligner = AutoAligner(tmp_path / "out", "not_a_camera") + aligner.submit(_result(index=0, session_id="s1", final_path=session / "episode_0")) task = asyncio.create_task(aligner.run()) - await aligner.close(task, 5) - assert len(calls) == 2 and task.cancelled() + await aligner.close(task, 120) + marker = tmp_path / "out" / "s1_aligned" / ".episode_0.refused" + assert marker.read_text().strip() and not (tmp_path / "out" / "s1_aligned" / "episode_0").exists() -async def test_close_with_a_blocked_job_warns_after_the_timeout_and_cancels_the_worker(calls, monkeypatch, caplog): - release = threading.Event() - monkeypatch.setattr(auto_align, "align_kept_episode", lambda *args: release.wait(5)) - aligner = AutoAligner(Path("/out"), "head") - aligner.submit(_result()) +async def test_an_unreadable_manifest_leaves_no_marker_and_a_later_scan_queues_the_episode_again(tmp_path): + session = tmp_path / "out" / "s1" + build_raw(session) + write_manifest(session, make_manifest(session, session_id="s1")) + aligner = AutoAligner(tmp_path / "out", INDEX) + (job,) = aligner.scan() + manifest = session / auto_align.MANIFEST_DIR / "episode_0.json" + original = manifest.read_text() + aligner.submit(_result(index=0, session_id="s1", final_path=job.final)) + manifest.write_text("{not json") task = asyncio.create_task(aligner.run()) - await asyncio.sleep(0.05) - try: - with caplog.at_level(logging.WARNING, logger=auto_align.logger.name): - await aligner.close(task, 0.1) - finally: - release.set() - assert task.cancelled() - assert "still has queued episodes" in caplog.text + await aligner.close(task, 120) + assert not job.refused_marker.exists() and not job.aligned.exists() + manifest.write_text(original) + assert aligner.scan() == [job] + + +async def test_a_missing_manifest_exits_2_without_a_marker(tmp_path): + session = tmp_path / "out" / "s1" + build_raw(session) + aligner = AutoAligner(tmp_path / "out", INDEX) + aligner.submit(_result(index=0, session_id="s1", final_path=session / "episode_0")) + task = asyncio.create_task(aligner.run()) + await aligner.close(task, 120) + assert not (tmp_path / "out" / "s1_aligned").exists() + + +def _old(path, days=2): + stamp = time.time() - days * 86400 + os.utime(path, (stamp, stamp)) + + +def test_scan_removes_old_staging_directories_beside_a_group_and_keeps_fresh_ones(tmp_path): + _write_session_manifest(tmp_path, "s1", 0) + stale = tmp_path / ".s1_aligned.staging-abc" + fresh = tmp_path / ".s1_aligned.staging-def" + unrelated = tmp_path / ".other_aligned.staging-xyz" + for directory in (stale, fresh, unrelated): + (directory / "episode_0").mkdir(parents=True) + _old(stale) + _old(unrelated) + AutoAligner(tmp_path, "head").scan() + assert not stale.exists() and fresh.is_dir() and unrelated.is_dir() diff --git a/examples/egocap/tests/backend/test_recording_session.py b/examples/egocap/tests/backend/test_recording_session.py index b200ff1f26..c64c62cfbc 100644 --- a/examples/egocap/tests/backend/test_recording_session.py +++ b/examples/egocap/tests/backend/test_recording_session.py @@ -32,6 +32,7 @@ from egocap_web.recording_session import CoordinatorBusyError, RecordingSessionCoordinator, SessionStatus from recording_service import ( Disposition, + EpisodeResult, FieldSpec, NumericSourceSpec, RecordingPhase, @@ -867,3 +868,86 @@ async def test_tracking_timing_is_merged_with_the_media_evidence_and_keeps_its_c assert timing["event_time"]["cam16"] == {"meaning": "sensor_capture", "qualified": True} assert timing["event_time"]["pico_controller"]["meaning"] == "host_poll_minus_latency" assert timing["event_time"]["manus_glove"] == {"meaning": "host_poll_time", "qualified": False} + + +async def test_a_kept_stop_calls_the_kept_hook_once_and_leaves_the_result_hook_alone(tmp_path: Path): + coordinator = make_coordinator(tmp_path) + kept, results = [], [] + coordinator.on_episode_kept = kept.append + coordinator.on_episode_result = results.append + await coordinator.open() + coordinator.set_task("t") + episode = await coordinator.start_episode() + result = await coordinator.stop_episode(episode.episode_id) + assert kept == [result] and results == [result] + await coordinator.close() + + +async def test_a_discarded_episode_does_not_call_the_kept_hook_but_still_reports_its_result(tmp_path: Path): + coordinator = make_coordinator(tmp_path) + kept, results = [], [] + coordinator.on_episode_kept = kept.append + coordinator.on_episode_result = results.append + await coordinator.open() + coordinator.set_task("t") + episode = await coordinator.start_episode() + result = await coordinator.discard_episode(episode.episode_id) + assert kept == [] and results == [result] + await coordinator.close() + + +async def test_a_kept_stop_without_hooks_set_succeeds(tmp_path: Path): + coordinator = make_coordinator(tmp_path) + await coordinator.open() + coordinator.set_task("t") + episode = await coordinator.start_episode() + assert (await coordinator.stop_episode(episode.episode_id)).disposition is Disposition.KEPT + await coordinator.close() + + +def _recovered_result(disposition): + return EpisodeResult( + session_id="s", + episode_id="s/episode_0", + episode_index=0, + disposition=disposition, + final_path=Path("/out/s/episode_0"), + pending_path=None, + counts=(), + duration_seconds=1.0, + quality=None, + ) + + +@pytest.mark.parametrize( + ("disposition", "expected_calls"), + [(Disposition.KEPT, 1), (Disposition.RECOVERY_REQUIRED, 0), (Disposition.DISCARDED, 0)], +) +async def test_a_recovered_episode_calls_the_kept_hook_only_when_it_was_kept( + tmp_path: Path, monkeypatch, disposition, expected_calls +): + coordinator = make_coordinator(tmp_path) + result = _recovered_result(disposition) + + class RecoveringService: + async def recover_episode(self, episode_id): + return result + + kept, results = [], [] + coordinator.on_episode_kept = kept.append + coordinator.on_episode_result = results.append + monkeypatch.setattr(coordinator, "_require_open", lambda: RecoveringService()) + assert await coordinator.recover_episode("s/episode_0") is result + assert kept == [result] * expected_calls and results == [] + + +async def test_a_recovered_episode_without_a_kept_hook_succeeds(tmp_path: Path, monkeypatch): + coordinator = make_coordinator(tmp_path) + result = _recovered_result(Disposition.KEPT) + + class RecoveringService: + async def recover_episode(self, episode_id): + return result + + monkeypatch.setattr(coordinator, "_require_open", lambda: RecoveringService()) + assert await coordinator.recover_episode("s/episode_0") is result diff --git a/examples/egocap/tests/backend/test_viser_scene.py b/examples/egocap/tests/backend/test_viser_scene.py index 5ac6fae795..4f3718061d 100644 --- a/examples/egocap/tests/backend/test_viser_scene.py +++ b/examples/egocap/tests/backend/test_viser_scene.py @@ -744,7 +744,6 @@ class _FakeAligner: def __init__(self, output_root, index_source): self.output_root, self.index_source = output_root, index_source self.submitted = [] - self.recovered = False self.cancelled = False self.closed_with = None _FakeAligner.instances.append(self) @@ -752,9 +751,6 @@ def __init__(self, output_root, index_source): def submit(self, result): self.submitted.append(result) - def recover(self): - self.recovered = True - async def run(self): import asyncio @@ -795,15 +791,16 @@ async def test_the_lifespan_runs_the_aligner_for_the_index_camera_and_cancels_it tmp_path, f"recording:\n data_dir: {tmp_path}/rec\nvideo_sources:\n - type: oak_camera\n name: head\n", ) - async with app_module.lifespan(app_module.FastAPI()): + app = app_module.FastAPI() + async with app_module.lifespan(app): (aligner,) = _FakeAligner.instances await asyncio.sleep(0) # let the worker start so its cancellation is observable assert aligner.index_source == "head" and aligner.output_root == tmp_path / "rec" - assert aligner.recovered + assert app.state.recording_context.coordinator.on_episode_kept == aligner.submit assert aligner.cancelled and aligner.closed_with == app_module._ALIGNER_SHUTDOWN_SECONDS -async def test_the_chained_callback_runs_the_previous_one_then_queues_for_alignment(monkeypatch, tmp_path): +async def test_the_kept_hook_is_the_aligner_and_the_result_hook_is_left_alone(monkeypatch, tmp_path): app_module = await _lifespan_with_station( monkeypatch, tmp_path, "video_sources:\n - type: oak_camera\n name: head\n" ) @@ -819,8 +816,10 @@ def context_with_previous(**kwargs): app = app_module.FastAPI() async with app_module.lifespan(app): (aligner,) = _FakeAligner.instances - app.state.recording_context.coordinator.on_episode_result("result") - assert previous_calls == ["result"] and aligner.submitted == ["result"] + coordinator = app.state.recording_context.coordinator + assert coordinator.on_episode_kept == aligner.submit + coordinator.on_episode_result("result") + assert previous_calls == ["result"] and aligner.submitted == [] async def test_a_kept_result_emitted_while_the_recorder_closes_is_aligned_before_the_aligner_closes( @@ -846,7 +845,7 @@ async def test_a_kept_result_emitted_while_the_recorder_closes_is_aligned_before real_close = app_module.RecordingSessionCoordinator.close async def close_after_a_last_result(self, *args, **kwargs): - self.on_episode_result(last) + self.on_episode_kept(last) events.append("coordinator closed") return await real_close(self, *args, **kwargs) diff --git a/examples/egocap/tests/recording/unit/test_align_kept_episode.py b/examples/egocap/tests/recording/unit/test_align_kept_episode.py index f6227a9d57..5836a561ae 100644 --- a/examples/egocap/tests/recording/unit/test_align_kept_episode.py +++ b/examples/egocap/tests/recording/unit/test_align_kept_episode.py @@ -354,16 +354,16 @@ def test_cli_success_prints_the_kept_count(tmp_path, raw, capsys): assert (tmp_path / "raw_aligned" / "episode_0").is_dir() -def test_cli_missing_manifest_exits_1(raw, capsys): - assert run_cli(raw, "--episode", 0, "--index-source", INDEX) == 1 +def test_cli_missing_manifest_exits_2(raw, capsys): + assert run_cli(raw, "--episode", 0, "--index-source", INDEX) == 2 assert "cannot read the episode's manifest" in capsys.readouterr().err -def test_cli_garbage_manifest_exits_1(raw, capsys): +def test_cli_garbage_manifest_exits_2(raw, capsys): path = manifest_path(raw, 0) path.parent.mkdir() path.write_text("{not json") - assert run_cli(raw, "--episode", 0, "--index-source", INDEX) == 1 + assert run_cli(raw, "--episode", 0, "--index-source", INDEX) == 2 assert "cannot read the episode's manifest" in capsys.readouterr().err @@ -426,7 +426,7 @@ def test_cli_routed_episode_without_the_manifest_episode_cannot_find_it(tmp_path sessions.mkdir() write_manifest(sessions, manifest) args = (group_dir, "--episode", 3, "--index-source", INDEX, "--manifest-session", sessions) - assert run_cli(*args) == 1 + assert run_cli(*args) == 2 assert "cannot read the episode's manifest" in capsys.readouterr().err diff --git a/examples/egocap/tests/recording/unit/test_eod_studio_session_move.py b/examples/egocap/tests/recording/unit/test_eod_studio_session_move.py index c4ef78b8e3..a5e28ad163 100644 --- a/examples/egocap/tests/recording/unit/test_eod_studio_session_move.py +++ b/examples/egocap/tests/recording/unit/test_eod_studio_session_move.py @@ -87,6 +87,26 @@ def test_relocate_destination_collision_raises(tmp_path): relocate_session_to_canonical_studio(session, "Kitchen", KNOWN) +def test_relocate_moves_the_aligned_sibling_with_its_session(tmp_path): + session = _session_dir(tmp_path, "_unmatched") + aligned = session.with_name(f"{session.name}_aligned") + (aligned / "episode_0").mkdir(parents=True) + result = relocate_session_to_canonical_studio(session, "Kitchen", KNOWN) + moved = result.with_name(f"{result.name}_aligned") + assert (moved / "episode_0").is_dir() and not aligned.exists() and not session.exists() + + +def test_relocate_refuses_before_moving_anything_when_the_aligned_destination_exists(tmp_path): + session = _session_dir(tmp_path, "_unmatched") + aligned = session.with_name(f"{session.name}_aligned") + aligned.mkdir() + taken = tmp_path / "Kitchen" / f"{session.name}_aligned" + taken.mkdir(parents=True) + with pytest.raises(OSError, match="refuse overwrite"): + relocate_session_to_canonical_studio(session, "Kitchen", KNOWN) + assert session.is_dir() and aligned.is_dir() and not (tmp_path / "Kitchen" / session.name).exists() + + def test_relocate_have_equals_want_but_different_case_is_noop(tmp_path): # session folder is "kitchen" (lowercase); canonicalizing both "have" and # "want" against KNOWN resolves them to the same "Kitchen" spelling, even diff --git a/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py index f6eac6663c..4f1a6d92a5 100644 --- a/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py +++ b/examples/egocap/tests/recording/unit/test_publish_aligned_episode.py @@ -224,6 +224,21 @@ def test_a_different_episode_publishes_beside_the_first(tmp_path, raw): assert_no_leftovers(aligned) +def test_an_episode_on_a_different_index_source_is_refused_and_leaves_the_aligned_session_unchanged(tmp_path, raw): + aligned = tmp_path / "aligned" + publish(raw, aligned, 0) + before, snap = listing(aligned), snapshot(aligned) + other = next(name for name in CAMERAS if name != INDEX) + + with pytest.raises(AlignedWriteError, match="the aligned session uses index source"): + publish_aligned_episode(raw, aligned, 1, other, qualified=QUALIFIED, continuity=clean_continuity()) + + assert listing(aligned) == before + assert_snapshots_equal(snapshot(aligned), snap) + assert zarr.open_group(str(aligned), mode="r").attrs["index_source"] == INDEX + assert_no_leftovers(aligned) + + def with_entry(source, **changes): evidence = clean_continuity() evidence[source] = {**evidence[source], **changes} diff --git a/examples/egocap/tests/recording/unit/test_update_episode_task_description.py b/examples/egocap/tests/recording/unit/test_update_episode_task_description.py index 45defd3624..824729f6fe 100644 --- a/examples/egocap/tests/recording/unit/test_update_episode_task_description.py +++ b/examples/egocap/tests/recording/unit/test_update_episode_task_description.py @@ -170,6 +170,40 @@ def test_update_episode_task_description_updates_config_yaml_sidecar(tmp_path): assert data["meta"]["task_description"] == "pour cereal" +def _make_aligned_copy(session: Path) -> Path: + aligned = session.with_name(f"{session.name}_aligned") + store = zarr.open(str(aligned), mode="a") + store.attrs["index_source"] = "head" + store.create_group("episode_0").attrs["episode_length"] = 5 + (aligned / "config.yaml").write_text("meta: {}\n", encoding="utf-8") + return aligned + + +def test_update_episode_task_description_updates_the_aligned_copy_beside_the_session(tmp_path): + session = tmp_path / "session" + _make_session(session, 2) + aligned = _make_aligned_copy(session) + update_episode_task_description( + session, "0-1", task_description="pour cereal", task_name="pour", studio="Kitchen" + ) + store = zarr.open(str(aligned), mode="r") + for attrs in (store.attrs, store["episode_0"].attrs): + assert attrs["task_description"] == "pour cereal" + assert attrs["task_name"] == "pour" and attrs["studio"] == "Kitchen" + assert "episode_1" not in store and store.attrs["index_source"] == "head" + meta = yaml.safe_load((aligned / "config.yaml").read_text(encoding="utf-8"))["meta"] + assert meta["task_description"] == "pour cereal" + + +def test_update_episode_task_description_leaves_the_aligned_name_and_studio_when_not_given(tmp_path): + session = tmp_path / "session" + _make_session(session, 1) + aligned = _make_aligned_copy(session) + update_episode_task_description(session, "0", task_description="x") + attrs = zarr.open(str(aligned), mode="r").attrs + assert attrs["task_description"] == "x" and "task_name" not in attrs and "studio" not in attrs + + def test_update_episode_task_description_bad_range_with_relocate_raises_without_moving(tmp_path): # Regression: episodes must be parsed before relocating, so a malformed # range raises and leaves the session at its original location rather From 8a2ab21df49e7c5ce9b0b26d75d1fe045cbdc3f3 Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 17:05:39 -0500 Subject: [PATCH 36/38] egocap: align only when the index camera is recorded; leave frame types out of the digest - Tell the aligner which cameras each session records when it opens, and queue no episodes (with one warning) while the configured index camera is not among them. - A source's frame type no longer enters the configuration digest, so setting one does not make a take left SEALED or CHECKED look like a different configuration. - Document that automatic alignment needs the capture-time stream basis. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/LIVEKIT_PREVIEW.md | 3 ++ examples/egocap/backend/egocap_web/app.py | 21 ++++++++-- .../egocap/backend/egocap_web/auto_align.py | 14 ++++++- .../recording_service/recording_service.py | 9 ++--- .../backend/test_app_livekit_recording.py | 17 ++++++++ .../egocap/tests/backend/test_auto_align.py | 39 +++++++++++++++++++ .../egocap/tests/backend/test_viser_scene.py | 35 +++++++++++++++++ .../recording_service/test_session_config.py | 24 ++++++++++-- 8 files changed, 148 insertions(+), 14 deletions(-) diff --git a/examples/egocap/LIVEKIT_PREVIEW.md b/examples/egocap/LIVEKIT_PREVIEW.md index d4f829df6a..26d2a795da 100644 --- a/examples/egocap/LIVEKIT_PREVIEW.md +++ b/examples/egocap/LIVEKIT_PREVIEW.md @@ -37,6 +37,9 @@ livekit: [streams file reference](capture_server/README.md#the---livekit-streams-file). Preview works with any of them. Recording needs a monotonic basis, `monotonic_us` or `capture_monotonic_us`, and `width`, `height` and `fps`; recording is refused while any offered stream lacks them. +- Automatic time alignment of a kept episode needs the stream's time to be the sensor's capture event, so use + `capture_monotonic_us`. With `monotonic_us`, which is when the frame was ready, the take is recorded but not + aligned. Start CaptureServer with the file (add `--mock` for synthetic tracking): diff --git a/examples/egocap/backend/egocap_web/app.py b/examples/egocap/backend/egocap_web/app.py index 999cb7d7f2..50a2a376ed 100644 --- a/examples/egocap/backend/egocap_web/app.py +++ b/examples/egocap/backend/egocap_web/app.py @@ -15,6 +15,7 @@ import sys import time import uuid +from collections.abc import Callable from contextlib import asynccontextmanager from dataclasses import replace from pathlib import Path @@ -167,6 +168,7 @@ def _recording_config_factory( monitor: CaptureStatusMonitor, station_label: str | None, output_root: Path, + on_video_sources: Callable[[frozenset[str]], None] | None = None, ): """Builds the real ``ServiceConfig`` lazily, read fresh each time the coordinator actually opens/reopens a session (not once at import time) @@ -189,6 +191,9 @@ def factory() -> ServiceConfig: VideoSourceSpec(s.name, s.width, s.height, s.fps, intrinsics=False) for s in recordable_livekit_streams(monitor.native.started) ) + if on_video_sources is not None: + # Tells the aligner, once per session open, which cameras this session records. + on_video_sources(frozenset(v.name for v in video_sources)) # A supported profile must record actual tracking AND the # selected cameras -- pico_controller and every configured camera # are required for a KEPT result. manus_glove is NOT required: @@ -404,8 +409,19 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: lambda: recordable_livekit_streams(monitor.native.started), _recorder_livekit_token, ) + # Kept episodes are time-aligned in the background when the station configures an index camera. + aligner = ( + AutoAligner(recording_output_root, resolved_station.alignment_index) + if resolved_station is not None and resolved_station.alignment_index is not None + else None + ) coordinator = RecordingSessionCoordinator( - _recording_config_factory(monitor, config.station_label, recording_output_root), + _recording_config_factory( + monitor, + config.station_label, + recording_output_root, + aligner.note_video_sources if aligner is not None else None, + ), queue_capacity=_INGRESS_QUEUE_CAPACITY, queue_bytes=lambda: _ingress_queue_bytes(monitor.native.started), readiness_check=_recording_readiness_check(monitor, station_config_error, config.capture_server_url), @@ -448,8 +464,7 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: # Kept episodes are time-aligned in the background when the station configures an index camera. aligner: AutoAligner | None = None aligner_task: asyncio.Task[None] | None = None - if resolved_station is not None and resolved_station.alignment_index is not None: - aligner = AutoAligner(recording_output_root, resolved_station.alignment_index) + if aligner is not None: coordinator.on_episode_kept = aligner.submit aligner_task = asyncio.create_task(aligner.run()) visualization: VisualizationScene | None = None diff --git a/examples/egocap/backend/egocap_web/auto_align.py b/examples/egocap/backend/egocap_web/auto_align.py index 1180d0b6d9..e6577b4c17 100644 --- a/examples/egocap/backend/egocap_web/auto_align.py +++ b/examples/egocap/backend/egocap_web/auto_align.py @@ -69,10 +69,22 @@ def __init__(self, output_root: Path, index_source: str) -> None: # Unbounded: a job is three small fields, and the number waiting is the number of kept episodes. self._queue: asyncio.Queue[_Job] = asyncio.Queue() self._process: asyncio.subprocess.Process | None = None + # False while the open session does not record the index camera; set once per session open. + self._index_recorded = True + + def note_video_sources(self, names: frozenset[str]) -> None: + """Note whether the session being opened records the index camera; if not, its episodes are not queued.""" + recorded = self._index_source in names + if not recorded and self._index_recorded: + logger.warning( + "automatic time alignment is off: index source %r is not a camera this session records", + self._index_source, + ) + self._index_recorded = recorded def submit(self, result: EpisodeResult) -> None: """Queue a finished take for alignment; anything other than a kept episode is ignored.""" - if result.disposition is Disposition.KEPT and result.final_path is not None: + if result.disposition is Disposition.KEPT and result.final_path is not None and self._index_recorded: self._queue.put_nowait(_Job(result.session_id, result.episode_index, result.final_path)) def scan(self) -> list[_Job]: diff --git a/examples/egocap/recording/recording_service/recording_service.py b/examples/egocap/recording/recording_service/recording_service.py index fd1e5ce4e6..123bc71220 100644 --- a/examples/egocap/recording/recording_service/recording_service.py +++ b/examples/egocap/recording/recording_service/recording_service.py @@ -142,12 +142,9 @@ def _digest(config: ServiceConfig) -> str: qc["capture_algorithm_version"] = ALGORITHM_VERSION # a changed algorithm is a changed configuration canonical = { **({"routing": True} if config.routing is not None else {}), # routed or not; each take freezes its studio - # A frame type left unset is absent, not null, so a configuration that predates it keeps its digest. A - # take left SEALED or CHECKED across a change that sets frame types is judged as a changed configuration. - "numeric": [ - {k: v for k, v in asdict(s).items() if k != "frame_type" or v is not None} - for s in config.numeric_sources - ], + # A frame type says how a source's fields are resampled, not how its data is laid out, so it is left out: + # setting or changing one never makes a take recorded earlier look like a different configuration. + "numeric": [{k: v for k, v in asdict(s).items() if k != "frame_type"} for s in config.numeric_sources], "video": [asdict(s) for s in config.video_sources], "qc": qc, "latency": config.latency, diff --git a/examples/egocap/tests/backend/test_app_livekit_recording.py b/examples/egocap/tests/backend/test_app_livekit_recording.py index c520bdf096..0e47c2ea26 100644 --- a/examples/egocap/tests/backend/test_app_livekit_recording.py +++ b/examples/egocap/tests/backend/test_app_livekit_recording.py @@ -54,6 +54,23 @@ def test_config_factory_declares_and_requires_each_recordable_livekit_stream(tmp assert "cam16" in config.qc.required_sources +def test_config_factory_reports_the_recorded_video_source_names_each_time_it_builds(tmp_path): + capture = p.LiveKitTimestampBasis.SENSOR_CAPTURE_MONOTONIC_US + monitor = _monitor([_stream(16, capture), _stream(17, capture)]) + reported = [] + factory = app_module._recording_config_factory(monitor, None, tmp_path, reported.append) + factory() + factory() + assert reported == [frozenset({"cam16", "cam17"})] * 2 + + +def test_config_factory_reports_no_names_when_nothing_is_recordable(tmp_path): + monitor = SimpleNamespace(camera_descriptors=(), native=SimpleNamespace(started=None)) + reported = [] + app_module._recording_config_factory(monitor, None, tmp_path, reported.append)() + assert reported == [frozenset()] + + def test_config_factory_without_a_started_session_has_no_livekit_sources(tmp_path): monitor = SimpleNamespace(camera_descriptors=(), native=SimpleNamespace(started=None)) assert app_module._recording_config_factory(monitor, None, tmp_path)().video_sources == () diff --git a/examples/egocap/tests/backend/test_auto_align.py b/examples/egocap/tests/backend/test_auto_align.py index 9d53d345a7..dd6a48c3b6 100644 --- a/examples/egocap/tests/backend/test_auto_align.py +++ b/examples/egocap/tests/backend/test_auto_align.py @@ -92,6 +92,45 @@ def test_results_that_are_not_a_kept_episode_with_a_path_are_ignored(result): assert aligner._queue.empty() +def test_kept_results_are_queued_before_any_session_has_reported_its_sources(): + aligner = AutoAligner(Path("/out"), "head") + aligner.submit(_result()) + assert aligner._queue.qsize() == 1 + + +def test_kept_results_are_queued_while_the_session_records_the_index_source(): + aligner = AutoAligner(Path("/out"), "head") + aligner.note_video_sources(frozenset({"head", "wrist"})) + aligner.submit(_result()) + assert aligner._queue.qsize() == 1 + + +def test_kept_results_are_not_queued_while_the_session_does_not_record_the_index_source(): + aligner = AutoAligner(Path("/out"), "head") + aligner.note_video_sources(frozenset({"wrist"})) + aligner.submit(_result()) + assert aligner._queue.empty() + + +def test_the_not_recorded_warning_is_logged_once_per_transition(caplog): + aligner = AutoAligner(Path("/out"), "head") + with caplog.at_level(logging.WARNING, logger="isaaccapture"): + aligner.note_video_sources(frozenset({"wrist"})) + aligner.note_video_sources(frozenset()) + assert len(caplog.records) == 1 and "'head'" in caplog.text + aligner.note_video_sources(frozenset({"head"})) + aligner.note_video_sources(frozenset({"wrist"})) + assert len(caplog.records) == 2 + + +def test_queueing_resumes_when_a_later_session_records_the_index_source(): + aligner = AutoAligner(Path("/out"), "head") + aligner.note_video_sources(frozenset()) + aligner.note_video_sources(frozenset({"head"})) + aligner.submit(_result()) + assert aligner._queue.qsize() == 1 + + async def test_cancelling_an_idle_worker_ends_it_cleanly(tmp_path): task = asyncio.create_task(AutoAligner(tmp_path / "out", "head").run()) await asyncio.sleep(0.05) diff --git a/examples/egocap/tests/backend/test_viser_scene.py b/examples/egocap/tests/backend/test_viser_scene.py index 4f3718061d..b5cda375c8 100644 --- a/examples/egocap/tests/backend/test_viser_scene.py +++ b/examples/egocap/tests/backend/test_viser_scene.py @@ -751,6 +751,9 @@ def __init__(self, output_root, index_source): def submit(self, result): self.submitted.append(result) + def note_video_sources(self, names): + self.noted = names + async def run(self): import asyncio @@ -800,6 +803,38 @@ async def test_the_lifespan_runs_the_aligner_for_the_index_camera_and_cancels_it assert aligner.cancelled and aligner.closed_with == app_module._ALIGNER_SHUTDOWN_SECONDS +async def test_the_aligner_is_created_once_and_is_the_factorys_video_source_callback(monkeypatch, tmp_path): + app_module = await _lifespan_with_station( + monkeypatch, tmp_path, "video_sources:\n - type: oak_camera\n name: head\n" + ) + factory_args = [] + real_factory = app_module._recording_config_factory + + def spy(*args, **kwargs): + factory_args.append(args) + return real_factory(*args, **kwargs) + + monkeypatch.setattr(app_module, "_recording_config_factory", spy) + async with app_module.lifespan(app_module.FastAPI()): + (aligner,) = _FakeAligner.instances + (args,) = factory_args + assert args[3] == aligner.note_video_sources + + +async def test_no_video_source_callback_is_passed_without_an_index_camera(monkeypatch, tmp_path): + app_module = await _lifespan_with_station(monkeypatch, tmp_path, "meta: {}\n") + factory_args = [] + real_factory = app_module._recording_config_factory + + def spy(*args, **kwargs): + factory_args.append(args) + return real_factory(*args, **kwargs) + + monkeypatch.setattr(app_module, "_recording_config_factory", spy) + async with app_module.lifespan(app_module.FastAPI()): + assert _FakeAligner.instances == [] and factory_args[0][3] is None + + async def test_the_kept_hook_is_the_aligner_and_the_result_hook_is_left_alone(monkeypatch, tmp_path): app_module = await _lifespan_with_station( monkeypatch, tmp_path, "video_sources:\n - type: oak_camera\n name: head\n" diff --git a/examples/egocap/tests/recording_service/test_session_config.py b/examples/egocap/tests/recording_service/test_session_config.py index 660dbff726..f1f71b67c5 100644 --- a/examples/egocap/tests/recording_service/test_session_config.py +++ b/examples/egocap/tests/recording_service/test_session_config.py @@ -143,7 +143,6 @@ async def test_a_routed_group_copy_carries_the_declarations(tmp_path, own): def _pre_frame_type_digest(config: ServiceConfig) -> str: - """The digest as it was computed before numeric sources carried a frame type.""" qc = dataclasses.asdict(config.qc) if config.qc.capture is None: del qc["capture"] @@ -162,7 +161,7 @@ def _pre_frame_type_digest(config: ServiceConfig) -> str: return hashlib.sha256(json.dumps(canonical, sort_keys=True).encode()).hexdigest() -def test_an_unset_frame_type_leaves_the_digest_as_it_was_before_the_field_existed(): +def test_a_take_recorded_before_frame_types_existed_keeps_its_digest(): for extra in ( {}, {"routing": RoutingConfig()}, @@ -181,11 +180,28 @@ def test_an_unset_frame_type_leaves_the_digest_as_it_was_before_the_field_existe ) -def test_a_set_frame_type_changes_the_digest_and_a_different_one_changes_it_again(): +def test_the_digest_is_the_same_with_a_frame_type_unset_set_or_changed(): def digest(frame_type): return impl._digest(ServiceConfig(Path("out"), (NumericSourceSpec("a", FIELDS, frame_type),))) - assert len({digest(None), digest("PicoTrackingFrame"), digest("ManusFrame")}) == 3 + assert digest(None) == digest("PicoTrackingFrame") == digest("ManusFrame") + + +def test_a_frame_type_does_not_change_the_layout_digest_but_a_field_does(): + def layout(fields, frame_type): + return impl._layout_digest(ServiceConfig(Path("out"), (NumericSourceSpec("a", fields, frame_type),))) + + other = (FieldSpec("extra", "float64"),) + assert layout(FIELDS, None) == layout(FIELDS, "ManusFrame") + assert layout(FIELDS, None) != layout(other, None) + + +def test_other_source_fields_still_change_the_digest(): + def digest(name, fields): + return impl._digest(ServiceConfig(Path("out"), (NumericSourceSpec(name, fields, "ManusFrame"),))) + + assert digest("a", FIELDS) != digest("b", FIELDS) + assert digest("a", FIELDS) != digest("a", (FieldSpec("extra", "float64"),)) async def test_a_recorded_episode_aligns_from_its_own_config_yaml_and_arrays(tmp_path, own): From 0dad9f3b4248b51c3871eeb642e82343d5446eaa Mon Sep 17 00:00:00 2001 From: Gareth Morgan Date: Mon, 9 Nov 2026 17:14:16 -0500 Subject: [PATCH 37/38] egocap: align only a station that sets an index camera with sensor capture times; never replace an aligned episode - Alignment is on only when alignment.index_source is set (no default camera), and is skipped with one warning for a session whose index camera, or any recorded camera, lacks a sensor capture time. - write_aligned_episode refuses an existing episode like the staged publish; drop the unused epochs argument of align_episode; expose convert_raw_item instead of a private name. - Correct the recording README on what config.yaml carries. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- examples/egocap/backend/egocap_web/app.py | 17 +- .../egocap/backend/egocap_web/auto_align.py | 25 +- .../backend/egocap_web/livekit_recording.py | 5 + .../backend/egocap_web/recording_adapter.py | 4 +- .../backend/egocap_web/recording_session.py | 4 +- .../backend/egocap_web/station_config.py | 8 +- examples/egocap/recording/README.md | 8 +- .../egocap/recording/aligned_writer.py | 4 +- .../recording/egocap/recording/alignment.py | 12 +- .../egocap/stations/ego_stations.example.yaml | 6 +- .../backend/test_app_livekit_recording.py | 13 +- .../egocap/tests/backend/test_auto_align.py | 41 +- .../tests/backend/test_livekit_recording.py | 14 + .../tests/backend/test_recording_adapter.py | 28 +- .../tests/backend/test_station_config.py | 8 +- .../egocap/tests/backend/test_viser_scene.py | 24 +- .../aligned_writer/golden_realign.json | 1373 ----------------- .../aligned_writer/golden_realign.npz | Bin 108380 -> 0 bytes .../recording/unit/test_aligned_writer.py | 24 +- .../tests/recording/unit/test_alignment.py | 34 - 20 files changed, 147 insertions(+), 1505 deletions(-) delete mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json delete mode 100644 examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.npz diff --git a/examples/egocap/backend/egocap_web/app.py b/examples/egocap/backend/egocap_web/app.py index 50a2a376ed..66bf679dbb 100644 --- a/examples/egocap/backend/egocap_web/app.py +++ b/examples/egocap/backend/egocap_web/app.py @@ -41,7 +41,12 @@ from .livekit_preview import API_KEY_ENV, API_SECRET_ENV, subscriber_token from .livekit_preview import router as livekit_preview_router from .livekit_receiver import RECEIVER_FRAMES_PER_STREAM -from .livekit_recording import LiveKitRecordingSource, recordable_livekit_streams, unrecordable_reason +from .livekit_recording import ( + LiveKitRecordingSource, + recordable_livekit_streams, + sensor_capture_names, + unrecordable_reason, +) from .operator_settings import OperatorSettingsStore, operator_settings_path from .operator_settings import router as operator_settings_router from .preview_routes import router as preview_router @@ -168,7 +173,7 @@ def _recording_config_factory( monitor: CaptureStatusMonitor, station_label: str | None, output_root: Path, - on_video_sources: Callable[[frozenset[str]], None] | None = None, + on_video_sources: Callable[[frozenset[str], frozenset[str]], None] | None = None, ): """Builds the real ``ServiceConfig`` lazily, read fresh each time the coordinator actually opens/reopens a session (not once at import time) @@ -192,8 +197,12 @@ def factory() -> ServiceConfig: for s in recordable_livekit_streams(monitor.native.started) ) if on_video_sources is not None: - # Tells the aligner, once per session open, which cameras this session records. - on_video_sources(frozenset(v.name for v in video_sources)) + # Tells the aligner, once per session open, which cameras this session records and which of them + # have a sensor capture time (only LiveKit streams stamped that way do). + on_video_sources( + frozenset(v.name for v in video_sources), + sensor_capture_names(recordable_livekit_streams(monitor.native.started)), + ) # A supported profile must record actual tracking AND the # selected cameras -- pico_controller and every configured camera # are required for a KEPT result. manus_glove is NOT required: diff --git a/examples/egocap/backend/egocap_web/auto_align.py b/examples/egocap/backend/egocap_web/auto_align.py index e6577b4c17..28e967dc89 100644 --- a/examples/egocap/backend/egocap_web/auto_align.py +++ b/examples/egocap/backend/egocap_web/auto_align.py @@ -69,22 +69,29 @@ def __init__(self, output_root: Path, index_source: str) -> None: # Unbounded: a job is three small fields, and the number waiting is the number of kept episodes. self._queue: asyncio.Queue[_Job] = asyncio.Queue() self._process: asyncio.subprocess.Process | None = None - # False while the open session does not record the index camera; set once per session open. - self._index_recorded = True + # False while the open session cannot be aligned; set once per session open. + self._session_alignable = True - def note_video_sources(self, names: frozenset[str]) -> None: - """Note whether the session being opened records the index camera; if not, its episodes are not queued.""" - recorded = self._index_source in names - if not recorded and self._index_recorded: + def note_video_sources(self, recorded: frozenset[str], qualified: frozenset[str]) -> None: + """Note whether the session being opened can be aligned; if not, its episodes are not queued. + + It can when the index camera is among the cameras recorded with a sensor capture time and every recorded + camera has one, since an episode with any other camera is refused whole. + """ + alignable = self._index_source in qualified and recorded <= qualified + if not alignable and self._session_alignable: logger.warning( - "automatic time alignment is off: index source %r is not a camera this session records", + "automatic time alignment is off: index source %r and every recorded camera need a sensor " + "capture time (recorded: %s; with one: %s)", self._index_source, + sorted(recorded), + sorted(qualified), ) - self._index_recorded = recorded + self._session_alignable = alignable def submit(self, result: EpisodeResult) -> None: """Queue a finished take for alignment; anything other than a kept episode is ignored.""" - if result.disposition is Disposition.KEPT and result.final_path is not None and self._index_recorded: + if result.disposition is Disposition.KEPT and result.final_path is not None and self._session_alignable: self._queue.put_nowait(_Job(result.session_id, result.episode_index, result.final_path)) def scan(self) -> list[_Job]: diff --git a/examples/egocap/backend/egocap_web/livekit_recording.py b/examples/egocap/backend/egocap_web/livekit_recording.py index 5bfcbbca87..6638ddfb1c 100644 --- a/examples/egocap/backend/egocap_web/livekit_recording.py +++ b/examples/egocap/backend/egocap_web/livekit_recording.py @@ -71,6 +71,11 @@ } +def sensor_capture_names(streams: Sequence[p.LiveKitCameraStream]) -> frozenset[str]: + """The names of the recordable streams whose time is the sensor's capture event, which alignment requires.""" + return frozenset(s.name for s in streams if _RECORDABLE_BASES.get(s.timestamp_basis) == "sensor_capture") + + def tracking_event_time(latency: Mapping[str, float]) -> dict[str, dict[str, Any]]: """What each tracking source's saved time is, and whether it is a qualified event time. diff --git a/examples/egocap/backend/egocap_web/recording_adapter.py b/examples/egocap/backend/egocap_web/recording_adapter.py index 9c3f2f41d2..f06e20dca4 100644 --- a/examples/egocap/backend/egocap_web/recording_adapter.py +++ b/examples/egocap/backend/egocap_web/recording_adapter.py @@ -370,7 +370,7 @@ def _raw_item_bytes(raw_item: RawItem) -> int: return len(raw_item.jpeg) if isinstance(raw_item, CameraImage) else len(raw_item.payload) -def _convert_raw_item( +def convert_raw_item( raw_item: RawItem, latency: Mapping[str, float] | None = None ) -> list[NumericSample | VideoSample]: """The default, real conversion dispatch -- CPU-bound (JPEG decode, @@ -415,7 +415,7 @@ def __init__( submit: Callable[[NumericSample | VideoSample], object], queue_capacity: int, queue_bytes: int | None = None, - convert: Callable[[RawItem], list[NumericSample | VideoSample]] = _convert_raw_item, + convert: Callable[[RawItem], list[NumericSample | VideoSample]] = convert_raw_item, full_retry_deadline_seconds: float = 2.0, full_retry_backoff_seconds: float = 0.01, in_flight_timeout_seconds: float = 30.0, diff --git a/examples/egocap/backend/egocap_web/recording_session.py b/examples/egocap/backend/egocap_web/recording_session.py index e27a4a9c39..2e051c9959 100644 --- a/examples/egocap/backend/egocap_web/recording_session.py +++ b/examples/egocap/backend/egocap_web/recording_session.py @@ -60,7 +60,7 @@ from capture_server.client import CameraImage, CaptureFrame from egocap_web.livekit_recording import tracking_event_time -from egocap_web.recording_adapter import RecordingIngress, _convert_raw_item, validate_tracking_descriptor +from egocap_web.recording_adapter import RecordingIngress, convert_raw_item, validate_tracking_descriptor from recording_service import ( CloseResult, Disposition, @@ -479,7 +479,7 @@ async def _start_episode_with_storage(self, frozen_context: TaskContext) -> Epis queue_bytes=self._queue_bytes() if callable(self._queue_bytes) else self._queue_bytes, submit=partial(service.submit_sample, episode_id), on_failure=lambda message: self._schedule_failure_settlement(service, episode_id, message), - convert=partial(_convert_raw_item, latency=self._tracking_latency), + convert=partial(convert_raw_item, latency=self._tracking_latency), ) await ingress.start() self._current_ingress = ingress diff --git a/examples/egocap/backend/egocap_web/station_config.py b/examples/egocap/backend/egocap_web/station_config.py index 7f64674ccc..71daeab774 100644 --- a/examples/egocap/backend/egocap_web/station_config.py +++ b/examples/egocap/backend/egocap_web/station_config.py @@ -158,17 +158,17 @@ def _resolve_latency(station_id: str, entry: dict) -> dict[str, float]: def _resolve_alignment_index(station_id: str, entry: dict) -> str | None: - """The index camera for automatic alignment: ``alignment.index_source``, else the first camera. + """The index camera for automatic alignment: ``alignment.index_source``, which has no default. - On unless ``alignment.enabled`` is false; None also when there is no camera to index on. + None (alignment off) when it is not set or ``alignment.enabled`` is false. It must name a camera the + station records with a sensor capture time, which is checked each time a session opens. """ section = entry.get("alignment") or {} if not isinstance(section, dict): raise StationConfigError(f"station {station_id!r}: 'alignment' must be a mapping") if not _bool_field(section, "enabled", default=True): return None - cameras = [s.get("name") for s in entry.get("video_sources") or [] if isinstance(s, dict)] - return _str_field(section, "index_source") or (cameras[0] if cameras else None) + return _str_field(section, "index_source") or None def _resolve_one_station(station_id: str, entry: Any, config_dir: Path) -> ResolvedStation: diff --git a/examples/egocap/recording/README.md b/examples/egocap/recording/README.md index d3405b1983..29f4e9f26e 100644 --- a/examples/egocap/recording/README.md +++ b/examples/egocap/recording/README.md @@ -143,10 +143,10 @@ Calibration files appear only when present at `EGOCAP_CALIBRATION_DIR` (which al resolved value, see above -- absence there is a skip, not a configuration requirement); the service does not write a separate `data_check_config.yaml`. -A data-loading pipeline's source-config reader requires `video_sources`/`numeric_sources`, -source names, frame types/defaults, and latency to run its alignment step; the per-group -`config.yaml` above does not carry those fields, so this reader needs that configuration -supplied separately, not read from the recorded output. A Zarr-to-LeRobot converter reads fixed, +The per-group `config.yaml` carries the source declarations time alignment reads (the +`video_sources`/`numeric_sources` names, frame types and recording defaults); a data-loading +pipeline's source-config reader that also needs per-source latency or other settings must have +them supplied separately, not read from the recorded output. A Zarr-to-LeRobot converter reads fixed, hardcoded group paths instead: `pico_controller/{left,right,head}_pose_interp` and `manus_glove/{left,right}_hand_pose_interp`. Renaming a wire stream is harmless as long as the backend still maps it to the established recorded source name; renaming the recorded group diff --git a/examples/egocap/recording/egocap/recording/aligned_writer.py b/examples/egocap/recording/egocap/recording/aligned_writer.py index b9684a7af7..d3184821af 100644 --- a/examples/egocap/recording/egocap/recording/aligned_writer.py +++ b/examples/egocap/recording/egocap/recording/aligned_writer.py @@ -225,9 +225,9 @@ def write_aligned_episode( _write_root(raw_session, aligned_session, index_source) root = zarr.open_group(str(aligned_session), mode="a") - # A previous alignment of this episode is removed whole, so no chunk of a different shape survives it. + # An existing aligned episode is never replaced. if key in root: - del root[key] + raise AlignedWriteError(f"{key} already exists in the aligned session") episode = root.require_group(key) _copy_attrs(raw_episode, episode) episode["valid_indices"] = aligned.valid_indices diff --git a/examples/egocap/recording/egocap/recording/alignment.py b/examples/egocap/recording/egocap/recording/alignment.py index 18e60f1bf9..0c8569ece2 100644 --- a/examples/egocap/recording/egocap/recording/alignment.py +++ b/examples/egocap/recording/egocap/recording/alignment.py @@ -297,25 +297,15 @@ def align_episode( rules: Mapping[str, Mapping[str, FieldRule]], *, downsample: int = 1, - epochs: Mapping[str, np.ndarray] | None = None, ) -> AlignedEpisode: """Align every source in ``times`` onto ``index_source``. ``times`` maps each source to the times to align on (sorted, finite); ``cameras`` names the sources that are cameras; ``fields[source][name]`` are a source's arrays and ``rules[source][name]`` how each is resampled (a field with no rule is not resampled). Raises ``AlignmentError`` if the index source has no frame in the valid - range, so an alignment is never an empty success. ``epochs`` optionally labels each sample of a source with the - unbroken stretch it belongs to (the label changes at a restart, a reconnect or an invalid interval); a source - with more than one label is refused, since interpolating across the break would produce values the sensor - never reported. + range, so an alignment is never an empty success. """ _check_inputs(index_source, times, downsample) - for name, labels in (epochs or {}).items(): - # The aligned numbers follow the rules above unchanged; a break is refused, not handled differently. - if name not in times or len(labels) != len(times[name]): - raise AlignmentError(f"{name}: epoch labels must be one per sample of a source being aligned") - if len(np.unique(labels)) > 1: - raise AlignmentError(f"{name}: has a restart or invalid interval inside the episode") index_times = np.asarray(times[index_source], dtype=np.float64) # The valid range: every source has data on both sides of a kept time. diff --git a/examples/egocap/recording/egocap/stations/ego_stations.example.yaml b/examples/egocap/recording/egocap/stations/ego_stations.example.yaml index bd3b02e252..8195eff79b 100644 --- a/examples/egocap/recording/egocap/stations/ego_stations.example.yaml +++ b/examples/egocap/recording/egocap/stations/ego_stations.example.yaml @@ -38,8 +38,10 @@ stations: # then this only prefills the field's draft text; the operator still has to press "Set # operator" before any recording command is accepted. auto_fill_operator_name: false - # Each kept episode is time-aligned in the background on this camera's frames. Defaults: enabled, and the - # first video source as the index. Set enabled: false to leave episodes as recorded. + # Each kept episode is time-aligned in the background on index_source's frames; with no index_source nothing + # is aligned, and enabled: false also turns it off. Alignment needs every recorded camera, the index + # included, to have a sensor capture time (a LiveKit stream with timestamp_basis capture_monotonic_us); the + # plain CaptureServer cameras of the mock do not, so episodes recorded with them are not aligned. alignment: enabled: true index_source: head_human_camera diff --git a/examples/egocap/tests/backend/test_app_livekit_recording.py b/examples/egocap/tests/backend/test_app_livekit_recording.py index 0e47c2ea26..6096cd2e90 100644 --- a/examples/egocap/tests/backend/test_app_livekit_recording.py +++ b/examples/egocap/tests/backend/test_app_livekit_recording.py @@ -54,21 +54,22 @@ def test_config_factory_declares_and_requires_each_recordable_livekit_stream(tmp assert "cam16" in config.qc.required_sources -def test_config_factory_reports_the_recorded_video_source_names_each_time_it_builds(tmp_path): +def test_config_factory_reports_recorded_and_sensor_captured_names_each_time_it_builds(tmp_path): capture = p.LiveKitTimestampBasis.SENSOR_CAPTURE_MONOTONIC_US - monitor = _monitor([_stream(16, capture), _stream(17, capture)]) + ready = p.LiveKitTimestampBasis.PUBLISHER_MONOTONIC_US + monitor = _monitor([_stream(16, capture), _stream(17, ready)]) reported = [] - factory = app_module._recording_config_factory(monitor, None, tmp_path, reported.append) + factory = app_module._recording_config_factory(monitor, None, tmp_path, lambda *names: reported.append(names)) factory() factory() - assert reported == [frozenset({"cam16", "cam17"})] * 2 + assert reported == [(frozenset({"cam16", "cam17"}), frozenset({"cam16"}))] * 2 def test_config_factory_reports_no_names_when_nothing_is_recordable(tmp_path): monitor = SimpleNamespace(camera_descriptors=(), native=SimpleNamespace(started=None)) reported = [] - app_module._recording_config_factory(monitor, None, tmp_path, reported.append)() - assert reported == [frozenset()] + app_module._recording_config_factory(monitor, None, tmp_path, lambda *names: reported.append(names))() + assert reported == [(frozenset(), frozenset())] def test_config_factory_without_a_started_session_has_no_livekit_sources(tmp_path): diff --git a/examples/egocap/tests/backend/test_auto_align.py b/examples/egocap/tests/backend/test_auto_align.py index dd6a48c3b6..113ca0d7d1 100644 --- a/examples/egocap/tests/backend/test_auto_align.py +++ b/examples/egocap/tests/backend/test_auto_align.py @@ -98,35 +98,50 @@ def test_kept_results_are_queued_before_any_session_has_reported_its_sources(): assert aligner._queue.qsize() == 1 -def test_kept_results_are_queued_while_the_session_records_the_index_source(): +def test_kept_results_are_queued_when_the_index_source_and_every_recorded_camera_are_qualified(): aligner = AutoAligner(Path("/out"), "head") - aligner.note_video_sources(frozenset({"head", "wrist"})) + aligner.note_video_sources(frozenset({"head", "wrist"}), frozenset({"head", "wrist", "other"})) aligner.submit(_result()) assert aligner._queue.qsize() == 1 -def test_kept_results_are_not_queued_while_the_session_does_not_record_the_index_source(): +def test_kept_results_are_not_queued_when_the_index_source_is_recorded_without_a_sensor_capture_time(): aligner = AutoAligner(Path("/out"), "head") - aligner.note_video_sources(frozenset({"wrist"})) + aligner.note_video_sources(frozenset({"head"}), frozenset()) aligner.submit(_result()) assert aligner._queue.empty() -def test_the_not_recorded_warning_is_logged_once_per_transition(caplog): +def test_kept_results_are_not_queued_when_the_index_source_is_not_recorded(): + aligner = AutoAligner(Path("/out"), "head") + aligner.note_video_sources(frozenset({"wrist"}), frozenset({"wrist"})) + aligner.submit(_result()) + assert aligner._queue.empty() + + +def test_kept_results_are_not_queued_when_another_recorded_camera_is_not_qualified(): + aligner = AutoAligner(Path("/out"), "head") + aligner.note_video_sources(frozenset({"head", "wrist"}), frozenset({"head"})) + aligner.submit(_result()) + assert aligner._queue.empty() + + +def test_the_not_alignable_warning_is_logged_once_per_transition(caplog): aligner = AutoAligner(Path("/out"), "head") with caplog.at_level(logging.WARNING, logger="isaaccapture"): - aligner.note_video_sources(frozenset({"wrist"})) - aligner.note_video_sources(frozenset()) - assert len(caplog.records) == 1 and "'head'" in caplog.text - aligner.note_video_sources(frozenset({"head"})) - aligner.note_video_sources(frozenset({"wrist"})) + aligner.note_video_sources(frozenset({"wrist"}), frozenset({"wrist"})) + aligner.note_video_sources(frozenset(), frozenset()) + assert len(caplog.records) == 1 + assert "'head'" in caplog.text and "sensor capture time" in caplog.text + aligner.note_video_sources(frozenset({"head"}), frozenset({"head"})) + aligner.note_video_sources(frozenset({"wrist"}), frozenset()) assert len(caplog.records) == 2 -def test_queueing_resumes_when_a_later_session_records_the_index_source(): +def test_queueing_resumes_when_a_later_session_is_alignable(): aligner = AutoAligner(Path("/out"), "head") - aligner.note_video_sources(frozenset()) - aligner.note_video_sources(frozenset({"head"})) + aligner.note_video_sources(frozenset({"head"}), frozenset()) + aligner.note_video_sources(frozenset({"head"}), frozenset({"head"})) aligner.submit(_result()) assert aligner._queue.qsize() == 1 diff --git a/examples/egocap/tests/backend/test_livekit_recording.py b/examples/egocap/tests/backend/test_livekit_recording.py index dd8b05b30b..8e8421b696 100644 --- a/examples/egocap/tests/backend/test_livekit_recording.py +++ b/examples/egocap/tests/backend/test_livekit_recording.py @@ -19,6 +19,7 @@ from egocap_web.livekit_recording import ( BUDGET_ENV, LiveKitRecordingFeed, + sensor_capture_names, uncertainty_budget_ns, unrecordable_reason, ) @@ -886,3 +887,16 @@ def test_unrecordable_reason_refuses_a_capture_server_on_another_host(url): def test_a_remote_capture_server_does_not_affect_a_session_without_livekit_streams(): assert unrecordable_reason(_started(object()), "ws://192.168.1.20:8082") is None + + +def test_sensor_capture_names_keeps_only_streams_stamped_at_sensor_capture(): + streams = [ + _stream(1, "sensor", CAPTURE), + _stream(2, "frame_ready", p.LiveKitTimestampBasis.PUBLISHER_MONOTONIC_US), + _stream(3, "unix", p.LiveKitTimestampBasis.PUBLISHER_PROCESSING_UNIX_US), + ] + assert sensor_capture_names(streams) == frozenset({"sensor"}) + + +def test_sensor_capture_names_is_empty_without_streams(): + assert sensor_capture_names([]) == frozenset() diff --git a/examples/egocap/tests/backend/test_recording_adapter.py b/examples/egocap/tests/backend/test_recording_adapter.py index 6ff50456e4..9d5c385fea 100644 --- a/examples/egocap/tests/backend/test_recording_adapter.py +++ b/examples/egocap/tests/backend/test_recording_adapter.py @@ -30,7 +30,6 @@ PICO_CONTROLLER_SPEC, RecordingAdapterError, RecordingIngress, - _convert_raw_item, _raw_item_bytes, build_manus_glove_fields, build_pico_controller_fields, @@ -40,6 +39,7 @@ convert_controller_aim_pose, convert_hand_pose, convert_head_pose, + convert_raw_item, oxr_fingertips_to_manus_skeleton, pose7d_to_matrix, validate_tracking_descriptor, @@ -676,9 +676,9 @@ def _video_sample(shape=(10, 10, 3), source="head_left") -> VideoSample: ) -def test_convert_raw_item_passes_a_video_sample_through_unchanged(): +def testconvert_raw_item_passes_a_video_sample_through_unchanged(): sample = _video_sample() - converted = _convert_raw_item(sample) + converted = convert_raw_item(sample) assert len(converted) == 1 assert converted[0] is sample @@ -743,7 +743,7 @@ def test_pico_and_manus_samples_are_both_stamped_with_the_one_host_poll_frame_ti # The recorded tracking time is when the host polled the devices (HOST_POLL), not a device measurement time: # every sample from one frame carries that frame's single timestamp, whichever source it is. frame = _tracking_frame(capture_time_ns=5_000_123_456_789, receive_time_ns=5_000_130_000_000) - samples = _convert_raw_item(frame) + samples = convert_raw_item(frame) assert sorted(s.source for s in samples) == ["manus_glove", "pico_controller"] for sample in samples: @@ -829,7 +829,7 @@ def offer(self, item): (video,) = ingress.offered assert isinstance(video, VideoSample) - tracking = _convert_raw_item(_tracking_frame(capture_time_ns=event_ns + 1_500_000, receive_time_ns=now_ns)) + tracking = convert_raw_item(_tracking_frame(capture_time_ns=event_ns + 1_500_000, receive_time_ns=now_ns)) assert tracking # Both are seconds on the PC's monotonic clock; their gap is the synthetic 1.5 ms (the host poll lags the @@ -851,7 +851,7 @@ def test_tracking_specs_name_the_frame_types_that_select_their_alignment_rules() def test_every_tracking_sample_of_a_frame_carries_the_host_clock_connection_as_its_continuity(): frame = _tracking_frame(capture_time_ns=5_000_000_000, receive_time_ns=5_000_100_000) - samples = _convert_raw_item(frame) + samples = convert_raw_item(frame) assert sorted(s.source for s in samples) == ["manus_glove", "pico_controller"] assert [s.continuity for s in samples] == [("host_clock", "s")] * 2 @@ -862,13 +862,13 @@ def _capture_times(samples): def test_no_latency_leaves_the_poll_time_as_the_capture_time(): frame = _tracking_frame(capture_time_ns=5_000_000_000, receive_time_ns=5_040_000_000) - for samples in (_convert_raw_item(frame), _convert_raw_item(frame, {}), convert_capture_frame(frame, None)): + for samples in (convert_raw_item(frame), convert_raw_item(frame, {}), convert_capture_frame(frame, None)): assert set(_capture_times(samples).values()) == {5.0} def test_a_latency_is_taken_off_the_poll_time_per_source_and_receive_time_is_unchanged(): frame = _tracking_frame(capture_time_ns=5_000_000_000, receive_time_ns=5_040_000_000) - samples = _convert_raw_item(frame, {"pico_controller": 0.02, "manus_glove": 0.0}) + samples = convert_raw_item(frame, {"pico_controller": 0.02, "manus_glove": 0.0}) assert _capture_times(samples) == pytest.approx({"pico_controller": 4.98, "manus_glove": 5.0}) assert {s.receive_time for s in samples} == {5.04} @@ -877,27 +877,25 @@ def test_a_later_receive_time_does_not_move_the_adjusted_capture_times(): latency = {"pico_controller": 0.02, "manus_glove": 0.03} prompt = _tracking_frame(capture_time_ns=5_000_000_000, receive_time_ns=5_001_000_000) delayed = _tracking_frame(capture_time_ns=5_000_000_000, receive_time_ns=5_250_000_000) - assert _capture_times(_convert_raw_item(prompt, latency)) == _capture_times( - _convert_raw_item(delayed, latency) - ) + assert _capture_times(convert_raw_item(prompt, latency)) == _capture_times(convert_raw_item(delayed, latency)) def test_the_latency_is_applied_once_to_each_frame(): latency = {"pico_controller": 0.02, "manus_glove": 0.02} times = [ - _capture_times(_convert_raw_item(_tracking_frame(t, t + 1_000_000), latency))["pico_controller"] + _capture_times(convert_raw_item(_tracking_frame(t, t + 1_000_000), latency))["pico_controller"] for t in (1_000_000_000, 2_000_000_000) ] assert times == pytest.approx([0.98, 1.98]) def test_a_latency_does_not_change_the_tracking_continuity(): - samples = _convert_raw_item(_tracking_frame(5_000_000_000, 5_000_100_000), {"pico_controller": 0.02}) + samples = convert_raw_item(_tracking_frame(5_000_000_000, 5_000_100_000), {"pico_controller": 0.02}) assert {s.continuity for s in samples} == {("host_clock", "s")} def test_a_new_capture_connection_changes_the_tracking_continuity_identity(): - first = _convert_raw_item(_tracking_frame(1_000_000_000, 1_000_100_000)) + first = convert_raw_item(_tracking_frame(1_000_000_000, 1_000_100_000)) other = dataclasses.replace(_tracking_frame(2_000_000_000, 2_000_100_000), session_id="t") - assert {s.continuity for s in _convert_raw_item(other)} == {("host_clock", "t")} + assert {s.continuity for s in convert_raw_item(other)} == {("host_clock", "t")} assert {s.continuity for s in first} == {("host_clock", "s")} diff --git a/examples/egocap/tests/backend/test_station_config.py b/examples/egocap/tests/backend/test_station_config.py index c5074758f4..494987edca 100644 --- a/examples/egocap/tests/backend/test_station_config.py +++ b/examples/egocap/tests/backend/test_station_config.py @@ -311,8 +311,8 @@ def test_a_non_mapping_alignment_or_tracking_latency_is_a_station_config_error(t _CAMERAS = "video_sources:\n - type: oak_camera\n name: head\n - type: oak_camera\n name: wrist\n" -def test_alignment_defaults_to_the_first_camera(tmp_path): - assert load_station_config(_write(tmp_path, _CAMERAS)).alignment_index == "head" +def test_alignment_is_off_without_an_index_source_even_with_cameras(tmp_path): + assert load_station_config(_write(tmp_path, _CAMERAS)).alignment_index is None def test_alignment_index_source_can_be_named(tmp_path): @@ -321,11 +321,11 @@ def test_alignment_index_source_can_be_named(tmp_path): def test_alignment_can_be_disabled(tmp_path): - path = _write(tmp_path, _CAMERAS + "alignment:\n enabled: false\n") + path = _write(tmp_path, _CAMERAS + "alignment:\n enabled: false\n index_source: head\n") assert load_station_config(path).alignment_index is None -def test_alignment_is_off_without_cameras(tmp_path): +def test_alignment_is_off_without_an_alignment_section(tmp_path): assert load_station_config(_write(tmp_path, "meta: {}\n")).alignment_index is None diff --git a/examples/egocap/tests/backend/test_viser_scene.py b/examples/egocap/tests/backend/test_viser_scene.py index b5cda375c8..60b5e46ea1 100644 --- a/examples/egocap/tests/backend/test_viser_scene.py +++ b/examples/egocap/tests/backend/test_viser_scene.py @@ -738,6 +738,10 @@ async def stop(self): assert events == ["scene stop"] and created[0].stopped # capture is still stopped +_HEAD_VIDEO = "video_sources:\n - type: oak_camera\n name: head\n" +_HEAD_ALIGNED = _HEAD_VIDEO + "alignment:\n index_source: head\n" + + class _FakeAligner: instances = [] @@ -751,8 +755,8 @@ def __init__(self, output_root, index_source): def submit(self, result): self.submitted.append(result) - def note_video_sources(self, names): - self.noted = names + def note_video_sources(self, recorded, qualified): + self.noted = (recorded, qualified) async def run(self): import asyncio @@ -792,7 +796,7 @@ async def test_the_lifespan_runs_the_aligner_for_the_index_camera_and_cancels_it app_module = await _lifespan_with_station( monkeypatch, tmp_path, - f"recording:\n data_dir: {tmp_path}/rec\nvideo_sources:\n - type: oak_camera\n name: head\n", + f"recording:\n data_dir: {tmp_path}/rec\n" + _HEAD_ALIGNED, ) app = app_module.FastAPI() async with app_module.lifespan(app): @@ -805,7 +809,9 @@ async def test_the_lifespan_runs_the_aligner_for_the_index_camera_and_cancels_it async def test_the_aligner_is_created_once_and_is_the_factorys_video_source_callback(monkeypatch, tmp_path): app_module = await _lifespan_with_station( - monkeypatch, tmp_path, "video_sources:\n - type: oak_camera\n name: head\n" + monkeypatch, + tmp_path, + _HEAD_ALIGNED, ) factory_args = [] real_factory = app_module._recording_config_factory @@ -837,7 +843,9 @@ def spy(*args, **kwargs): async def test_the_kept_hook_is_the_aligner_and_the_result_hook_is_left_alone(monkeypatch, tmp_path): app_module = await _lifespan_with_station( - monkeypatch, tmp_path, "video_sources:\n - type: oak_camera\n name: head\n" + monkeypatch, + tmp_path, + _HEAD_ALIGNED, ) previous_calls = [] real_context = app_module.RecordingContext @@ -861,7 +869,9 @@ async def test_a_kept_result_emitted_while_the_recorder_closes_is_aligned_before monkeypatch, tmp_path ): app_module = await _lifespan_with_station( - monkeypatch, tmp_path, "video_sources:\n - type: oak_camera\n name: head\n" + monkeypatch, + tmp_path, + _HEAD_ALIGNED, ) from recording_service import Disposition, EpisodeResult @@ -901,7 +911,7 @@ async def test_the_lifespan_starts_no_aligner_when_alignment_is_off(monkeypatch, app_module = await _lifespan_with_station( monkeypatch, tmp_path, - "video_sources:\n - type: oak_camera\n name: head\nalignment:\n enabled: false\n", + _HEAD_VIDEO + "alignment:\n index_source: head\n enabled: false\n", ) async with app_module.lifespan(app_module.FastAPI()): assert _FakeAligner.instances == [] diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json deleted file mode 100644 index cabbd5cf52..0000000000 --- a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.json +++ /dev/null @@ -1,1373 +0,0 @@ -{ - "entries": [ - { - "path": "config.yaml", - "kind": "file", - "size": 288, - "sha256": "e4142ea4adc900fb4870b4c31a465f0bf885ea925ee762f8aa688db5cfa82fbb" - }, - { - "path": "episode_0/head_camera.mp4", - "kind": "file", - "size": 544, - "sha256": "9f2ff969f02f9dd114ead58b074424d237b6a2109790434998549c09f6eaae36" - }, - { - "path": "episode_0/wrist_camera.mp4", - "kind": "file", - "size": 560, - "sha256": "140f5fa6e646b0bc7ac525867ac191a2b8ea76ccc17b46c702daa36e619be6d6" - }, - { - "path": "episode_1/head_camera.mp4", - "kind": "file", - "size": 544, - "sha256": "520464427520ebe79e6c809f6632ca024236bb44f540a604f1068d5c63ea1fd4" - }, - { - "path": "episode_1/wrist_camera.mp4", - "kind": "file", - "size": 560, - "sha256": "fc228cf71fa912a8e41b9840c11fad07f032a8d671a008b42b6d90b38020745a" - }, - { - "path": "zarr.json", - "kind": "root_json", - "zarr_format": 3, - "node_type": "group", - "attributes": { - "index_source": "head_camera" - } - }, - { - "path": "episode_0", - "kind": "group", - "attributes": { - "task_description": "episode task", - "timing": { - "clock": "monotonic", - "offset_s": 0.25 - } - } - }, - { - "path": "episode_0/glove", - "kind": "group", - "attributes": {} - }, - { - "path": "episode_0/glove/capture_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 54 - ], - "attributes": {}, - "npz_key": "a0", - "info_chunks": [ - 54 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/glove/left_hand_pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 18, - 5, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a1", - "info_chunks": [ - 18, - 5, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/glove/left_sensor_count_interp", - "kind": "array", - "dtype": "int64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a2", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/glove/left_sensor_rotation_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 18, - 4 - ], - "attributes": {}, - "npz_key": "a3", - "info_chunks": [ - 18, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/glove/receive_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 54 - ], - "attributes": {}, - "npz_key": "a4", - "info_chunks": [ - 54 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/glove/right_hand_pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 18, - 5, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a5", - "info_chunks": [ - 18, - 5, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/head_camera", - "kind": "group", - "attributes": {} - }, - { - "path": "episode_0/head_camera/aligned_frame_indices", - "kind": "array", - "dtype": "int64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a6", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/head_camera/capture_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 36 - ], - "attributes": {}, - "npz_key": "a7", - "info_chunks": [ - 36 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/head_camera/frame_id", - "kind": "array", - "dtype": "int64", - "shape": [ - 36 - ], - "attributes": {}, - "npz_key": "a8", - "info_chunks": [ - 36 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/head_camera/pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 18, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a9", - "info_chunks": [ - 18, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/head_camera/receive_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 36 - ], - "attributes": {}, - "npz_key": "a10", - "info_chunks": [ - 36 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/pico_controller", - "kind": "group", - "attributes": { - "handedness": "both" - } - }, - { - "path": "episode_0/pico_controller/a_button", - "kind": "array", - "dtype": "bool", - "shape": [ - 56 - ], - "attributes": {}, - "npz_key": "a11", - "info_chunks": [ - 56 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/pico_controller/body_joints_valid", - "kind": "array", - "dtype": "bool", - "shape": [ - 56 - ], - "attributes": {}, - "npz_key": "a12", - "info_chunks": [ - 56 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/pico_controller/capture_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 56 - ], - "attributes": {}, - "npz_key": "a13", - "info_chunks": [ - 56 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/pico_controller/head_pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 18, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a14", - "info_chunks": [ - 18, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/pico_controller/left_pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 18, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a15", - "info_chunks": [ - 18, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/pico_controller/left_trigger_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a16", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/pico_controller/receive_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 56 - ], - "attributes": {}, - "npz_key": "a17", - "info_chunks": [ - 56 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/pico_controller/right_pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 18, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a18", - "info_chunks": [ - 18, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/pico_controller/right_trigger_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a19", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/wrist_camera", - "kind": "group", - "attributes": {} - }, - { - "path": "episode_0/wrist_camera/aligned_frame_indices", - "kind": "array", - "dtype": "int64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a20", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/wrist_camera/capture_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a21", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/wrist_camera/frame_id", - "kind": "array", - "dtype": "int64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a22", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/wrist_camera/pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 18, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a23", - "info_chunks": [ - 18, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/wrist_camera/receive_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a24", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/valid_indices", - "kind": "array", - "dtype": "bool", - "shape": [ - 36 - ], - "attributes": {}, - "npz_key": "a25", - "info_chunks": [ - 36 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_0/valid_timestamps", - "kind": "array", - "dtype": "float64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a26", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1", - "kind": "group", - "attributes": { - "task_description": "episode task", - "timing": { - "clock": "monotonic", - "offset_s": 0.25 - } - } - }, - { - "path": "episode_1/glove", - "kind": "group", - "attributes": {} - }, - { - "path": "episode_1/glove/capture_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 54 - ], - "attributes": {}, - "npz_key": "a27", - "info_chunks": [ - 54 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/glove/left_hand_pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 35, - 5, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a28", - "info_chunks": [ - 35, - 5, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/glove/left_sensor_count_interp", - "kind": "array", - "dtype": "int64", - "shape": [ - 35 - ], - "attributes": {}, - "npz_key": "a29", - "info_chunks": [ - 35 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/glove/left_sensor_rotation_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 35, - 4 - ], - "attributes": {}, - "npz_key": "a30", - "info_chunks": [ - 35, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/glove/receive_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 54 - ], - "attributes": {}, - "npz_key": "a31", - "info_chunks": [ - 54 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/glove/right_hand_pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 35, - 5, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a32", - "info_chunks": [ - 35, - 5, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/head_camera", - "kind": "group", - "attributes": {} - }, - { - "path": "episode_1/head_camera/aligned_frame_indices", - "kind": "array", - "dtype": "int64", - "shape": [ - 35 - ], - "attributes": {}, - "npz_key": "a33", - "info_chunks": [ - 35 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/head_camera/capture_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 36 - ], - "attributes": {}, - "npz_key": "a34", - "info_chunks": [ - 36 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/head_camera/frame_id", - "kind": "array", - "dtype": "int64", - "shape": [ - 36 - ], - "attributes": {}, - "npz_key": "a35", - "info_chunks": [ - 36 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/head_camera/pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 35, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a36", - "info_chunks": [ - 35, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/head_camera/receive_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 36 - ], - "attributes": {}, - "npz_key": "a37", - "info_chunks": [ - 36 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/pico_controller", - "kind": "group", - "attributes": { - "handedness": "both" - } - }, - { - "path": "episode_1/pico_controller/a_button", - "kind": "array", - "dtype": "bool", - "shape": [ - 56 - ], - "attributes": {}, - "npz_key": "a38", - "info_chunks": [ - 56 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/pico_controller/body_joints_valid", - "kind": "array", - "dtype": "bool", - "shape": [ - 56 - ], - "attributes": {}, - "npz_key": "a39", - "info_chunks": [ - 56 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/pico_controller/capture_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 56 - ], - "attributes": {}, - "npz_key": "a40", - "info_chunks": [ - 56 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/pico_controller/head_pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 35, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a41", - "info_chunks": [ - 35, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/pico_controller/left_pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 35, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a42", - "info_chunks": [ - 35, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/pico_controller/left_trigger_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 35 - ], - "attributes": {}, - "npz_key": "a43", - "info_chunks": [ - 35 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/pico_controller/receive_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 56 - ], - "attributes": {}, - "npz_key": "a44", - "info_chunks": [ - 56 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/pico_controller/right_pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 35, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a45", - "info_chunks": [ - 35, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/pico_controller/right_trigger_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 35 - ], - "attributes": {}, - "npz_key": "a46", - "info_chunks": [ - 35 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/wrist_camera", - "kind": "group", - "attributes": {} - }, - { - "path": "episode_1/wrist_camera/aligned_frame_indices", - "kind": "array", - "dtype": "int64", - "shape": [ - 35 - ], - "attributes": {}, - "npz_key": "a47", - "info_chunks": [ - 35 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/wrist_camera/capture_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a48", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/wrist_camera/frame_id", - "kind": "array", - "dtype": "int64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a49", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/wrist_camera/pose_interp", - "kind": "array", - "dtype": "float64", - "shape": [ - 35, - 4, - 4 - ], - "attributes": {}, - "npz_key": "a50", - "info_chunks": [ - 35, - 4, - 4 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/wrist_camera/receive_time", - "kind": "array", - "dtype": "float64", - "shape": [ - 18 - ], - "attributes": {}, - "npz_key": "a51", - "info_chunks": [ - 18 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/valid_indices", - "kind": "array", - "dtype": "bool", - "shape": [ - 36 - ], - "attributes": {}, - "npz_key": "a52", - "info_chunks": [ - 36 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - }, - { - "path": "episode_1/valid_timestamps", - "kind": "array", - "dtype": "float64", - "shape": [ - 35 - ], - "attributes": {}, - "npz_key": "a53", - "info_chunks": [ - 35 - ], - "info_codecs": [ - "BytesCodec", - "ZstdCodec" - ] - } - ], - "expected_tree_listing": [ - "config.yaml", - "episode_0", - "episode_0/glove", - "episode_0/glove/capture_time", - "episode_0/glove/capture_time/c", - "episode_0/glove/capture_time/c/0", - "episode_0/glove/capture_time/zarr.json", - "episode_0/glove/left_hand_pose_interp", - "episode_0/glove/left_hand_pose_interp/c", - "episode_0/glove/left_hand_pose_interp/c/0", - "episode_0/glove/left_hand_pose_interp/c/0/0", - "episode_0/glove/left_hand_pose_interp/c/0/0/0", - "episode_0/glove/left_hand_pose_interp/c/0/0/0/0", - "episode_0/glove/left_hand_pose_interp/zarr.json", - "episode_0/glove/left_sensor_count_interp", - "episode_0/glove/left_sensor_count_interp/c", - "episode_0/glove/left_sensor_count_interp/c/0", - "episode_0/glove/left_sensor_count_interp/zarr.json", - "episode_0/glove/left_sensor_rotation_interp", - "episode_0/glove/left_sensor_rotation_interp/c", - "episode_0/glove/left_sensor_rotation_interp/c/0", - "episode_0/glove/left_sensor_rotation_interp/c/0/0", - "episode_0/glove/left_sensor_rotation_interp/zarr.json", - "episode_0/glove/receive_time", - "episode_0/glove/receive_time/c", - "episode_0/glove/receive_time/c/0", - "episode_0/glove/receive_time/zarr.json", - "episode_0/glove/right_hand_pose_interp", - "episode_0/glove/right_hand_pose_interp/c", - "episode_0/glove/right_hand_pose_interp/c/0", - "episode_0/glove/right_hand_pose_interp/c/0/0", - "episode_0/glove/right_hand_pose_interp/c/0/0/0", - "episode_0/glove/right_hand_pose_interp/c/0/0/0/0", - "episode_0/glove/right_hand_pose_interp/zarr.json", - "episode_0/glove/zarr.json", - "episode_0/head_camera", - "episode_0/head_camera.mp4", - "episode_0/head_camera/aligned_frame_indices", - "episode_0/head_camera/aligned_frame_indices/c", - "episode_0/head_camera/aligned_frame_indices/c/0", - "episode_0/head_camera/aligned_frame_indices/zarr.json", - "episode_0/head_camera/capture_time", - "episode_0/head_camera/capture_time/c", - "episode_0/head_camera/capture_time/c/0", - "episode_0/head_camera/capture_time/zarr.json", - "episode_0/head_camera/frame_id", - "episode_0/head_camera/frame_id/c", - "episode_0/head_camera/frame_id/c/0", - "episode_0/head_camera/frame_id/zarr.json", - "episode_0/head_camera/pose_interp", - "episode_0/head_camera/pose_interp/c", - "episode_0/head_camera/pose_interp/c/0", - "episode_0/head_camera/pose_interp/c/0/0", - "episode_0/head_camera/pose_interp/c/0/0/0", - "episode_0/head_camera/pose_interp/zarr.json", - "episode_0/head_camera/receive_time", - "episode_0/head_camera/receive_time/c", - "episode_0/head_camera/receive_time/c/0", - "episode_0/head_camera/receive_time/zarr.json", - "episode_0/head_camera/zarr.json", - "episode_0/pico_controller", - "episode_0/pico_controller/a_button", - "episode_0/pico_controller/a_button/c", - "episode_0/pico_controller/a_button/c/0", - "episode_0/pico_controller/a_button/zarr.json", - "episode_0/pico_controller/body_joints_valid", - "episode_0/pico_controller/body_joints_valid/c", - "episode_0/pico_controller/body_joints_valid/c/0", - "episode_0/pico_controller/body_joints_valid/zarr.json", - "episode_0/pico_controller/capture_time", - "episode_0/pico_controller/capture_time/c", - "episode_0/pico_controller/capture_time/c/0", - "episode_0/pico_controller/capture_time/zarr.json", - "episode_0/pico_controller/head_pose_interp", - "episode_0/pico_controller/head_pose_interp/c", - "episode_0/pico_controller/head_pose_interp/c/0", - "episode_0/pico_controller/head_pose_interp/c/0/0", - "episode_0/pico_controller/head_pose_interp/c/0/0/0", - "episode_0/pico_controller/head_pose_interp/zarr.json", - "episode_0/pico_controller/left_pose_interp", - "episode_0/pico_controller/left_pose_interp/c", - "episode_0/pico_controller/left_pose_interp/c/0", - "episode_0/pico_controller/left_pose_interp/c/0/0", - "episode_0/pico_controller/left_pose_interp/c/0/0/0", - "episode_0/pico_controller/left_pose_interp/zarr.json", - "episode_0/pico_controller/left_trigger_interp", - "episode_0/pico_controller/left_trigger_interp/c", - "episode_0/pico_controller/left_trigger_interp/c/0", - "episode_0/pico_controller/left_trigger_interp/zarr.json", - "episode_0/pico_controller/receive_time", - "episode_0/pico_controller/receive_time/c", - "episode_0/pico_controller/receive_time/c/0", - "episode_0/pico_controller/receive_time/zarr.json", - "episode_0/pico_controller/right_pose_interp", - "episode_0/pico_controller/right_pose_interp/c", - "episode_0/pico_controller/right_pose_interp/c/0", - "episode_0/pico_controller/right_pose_interp/c/0/0", - "episode_0/pico_controller/right_pose_interp/c/0/0/0", - "episode_0/pico_controller/right_pose_interp/zarr.json", - "episode_0/pico_controller/right_trigger_interp", - "episode_0/pico_controller/right_trigger_interp/c", - "episode_0/pico_controller/right_trigger_interp/c/0", - "episode_0/pico_controller/right_trigger_interp/zarr.json", - "episode_0/pico_controller/zarr.json", - "episode_0/valid_indices", - "episode_0/valid_indices/c", - "episode_0/valid_indices/c/0", - "episode_0/valid_indices/zarr.json", - "episode_0/valid_timestamps", - "episode_0/valid_timestamps/c", - "episode_0/valid_timestamps/c/0", - "episode_0/valid_timestamps/zarr.json", - "episode_0/wrist_camera", - "episode_0/wrist_camera.mp4", - "episode_0/wrist_camera/aligned_frame_indices", - "episode_0/wrist_camera/aligned_frame_indices/c", - "episode_0/wrist_camera/aligned_frame_indices/c/0", - "episode_0/wrist_camera/aligned_frame_indices/zarr.json", - "episode_0/wrist_camera/capture_time", - "episode_0/wrist_camera/capture_time/c", - "episode_0/wrist_camera/capture_time/c/0", - "episode_0/wrist_camera/capture_time/zarr.json", - "episode_0/wrist_camera/frame_id", - "episode_0/wrist_camera/frame_id/c", - "episode_0/wrist_camera/frame_id/c/0", - "episode_0/wrist_camera/frame_id/zarr.json", - "episode_0/wrist_camera/pose_interp", - "episode_0/wrist_camera/pose_interp/c", - "episode_0/wrist_camera/pose_interp/c/0", - "episode_0/wrist_camera/pose_interp/c/0/0", - "episode_0/wrist_camera/pose_interp/c/0/0/0", - "episode_0/wrist_camera/pose_interp/zarr.json", - "episode_0/wrist_camera/receive_time", - "episode_0/wrist_camera/receive_time/c", - "episode_0/wrist_camera/receive_time/c/0", - "episode_0/wrist_camera/receive_time/zarr.json", - "episode_0/wrist_camera/zarr.json", - "episode_0/zarr.json", - "episode_1", - "episode_1/glove", - "episode_1/glove/capture_time", - "episode_1/glove/capture_time/c", - "episode_1/glove/capture_time/c/0", - "episode_1/glove/capture_time/zarr.json", - "episode_1/glove/left_hand_pose_interp", - "episode_1/glove/left_hand_pose_interp/c", - "episode_1/glove/left_hand_pose_interp/c/0", - "episode_1/glove/left_hand_pose_interp/c/0/0", - "episode_1/glove/left_hand_pose_interp/c/0/0/0", - "episode_1/glove/left_hand_pose_interp/c/0/0/0/0", - "episode_1/glove/left_hand_pose_interp/zarr.json", - "episode_1/glove/left_sensor_count_interp", - "episode_1/glove/left_sensor_count_interp/c", - "episode_1/glove/left_sensor_count_interp/c/0", - "episode_1/glove/left_sensor_count_interp/zarr.json", - "episode_1/glove/left_sensor_rotation_interp", - "episode_1/glove/left_sensor_rotation_interp/c", - "episode_1/glove/left_sensor_rotation_interp/c/0", - "episode_1/glove/left_sensor_rotation_interp/c/0/0", - "episode_1/glove/left_sensor_rotation_interp/zarr.json", - "episode_1/glove/receive_time", - "episode_1/glove/receive_time/c", - "episode_1/glove/receive_time/c/0", - "episode_1/glove/receive_time/zarr.json", - "episode_1/glove/right_hand_pose_interp", - "episode_1/glove/right_hand_pose_interp/c", - "episode_1/glove/right_hand_pose_interp/c/0", - "episode_1/glove/right_hand_pose_interp/c/0/0", - "episode_1/glove/right_hand_pose_interp/c/0/0/0", - "episode_1/glove/right_hand_pose_interp/c/0/0/0/0", - "episode_1/glove/right_hand_pose_interp/zarr.json", - "episode_1/glove/zarr.json", - "episode_1/head_camera", - "episode_1/head_camera.mp4", - "episode_1/head_camera/aligned_frame_indices", - "episode_1/head_camera/aligned_frame_indices/c", - "episode_1/head_camera/aligned_frame_indices/c/0", - "episode_1/head_camera/aligned_frame_indices/zarr.json", - "episode_1/head_camera/capture_time", - "episode_1/head_camera/capture_time/c", - "episode_1/head_camera/capture_time/c/0", - "episode_1/head_camera/capture_time/zarr.json", - "episode_1/head_camera/frame_id", - "episode_1/head_camera/frame_id/c", - "episode_1/head_camera/frame_id/c/0", - "episode_1/head_camera/frame_id/zarr.json", - "episode_1/head_camera/pose_interp", - "episode_1/head_camera/pose_interp/c", - "episode_1/head_camera/pose_interp/c/0", - "episode_1/head_camera/pose_interp/c/0/0", - "episode_1/head_camera/pose_interp/c/0/0/0", - "episode_1/head_camera/pose_interp/zarr.json", - "episode_1/head_camera/receive_time", - "episode_1/head_camera/receive_time/c", - "episode_1/head_camera/receive_time/c/0", - "episode_1/head_camera/receive_time/zarr.json", - "episode_1/head_camera/zarr.json", - "episode_1/pico_controller", - "episode_1/pico_controller/a_button", - "episode_1/pico_controller/a_button/c", - "episode_1/pico_controller/a_button/c/0", - "episode_1/pico_controller/a_button/zarr.json", - "episode_1/pico_controller/body_joints_valid", - "episode_1/pico_controller/body_joints_valid/c", - "episode_1/pico_controller/body_joints_valid/c/0", - "episode_1/pico_controller/body_joints_valid/zarr.json", - "episode_1/pico_controller/capture_time", - "episode_1/pico_controller/capture_time/c", - "episode_1/pico_controller/capture_time/c/0", - "episode_1/pico_controller/capture_time/zarr.json", - "episode_1/pico_controller/head_pose_interp", - "episode_1/pico_controller/head_pose_interp/c", - "episode_1/pico_controller/head_pose_interp/c/0", - "episode_1/pico_controller/head_pose_interp/c/0/0", - "episode_1/pico_controller/head_pose_interp/c/0/0/0", - "episode_1/pico_controller/head_pose_interp/zarr.json", - "episode_1/pico_controller/left_pose_interp", - "episode_1/pico_controller/left_pose_interp/c", - "episode_1/pico_controller/left_pose_interp/c/0", - "episode_1/pico_controller/left_pose_interp/c/0/0", - "episode_1/pico_controller/left_pose_interp/c/0/0/0", - "episode_1/pico_controller/left_pose_interp/zarr.json", - "episode_1/pico_controller/left_trigger_interp", - "episode_1/pico_controller/left_trigger_interp/c", - "episode_1/pico_controller/left_trigger_interp/c/0", - "episode_1/pico_controller/left_trigger_interp/zarr.json", - "episode_1/pico_controller/receive_time", - "episode_1/pico_controller/receive_time/c", - "episode_1/pico_controller/receive_time/c/0", - "episode_1/pico_controller/receive_time/zarr.json", - "episode_1/pico_controller/right_pose_interp", - "episode_1/pico_controller/right_pose_interp/c", - "episode_1/pico_controller/right_pose_interp/c/0", - "episode_1/pico_controller/right_pose_interp/c/0/0", - "episode_1/pico_controller/right_pose_interp/c/0/0/0", - "episode_1/pico_controller/right_pose_interp/zarr.json", - "episode_1/pico_controller/right_trigger_interp", - "episode_1/pico_controller/right_trigger_interp/c", - "episode_1/pico_controller/right_trigger_interp/c/0", - "episode_1/pico_controller/right_trigger_interp/zarr.json", - "episode_1/pico_controller/zarr.json", - "episode_1/valid_indices", - "episode_1/valid_indices/c", - "episode_1/valid_indices/c/0", - "episode_1/valid_indices/zarr.json", - "episode_1/valid_timestamps", - "episode_1/valid_timestamps/c", - "episode_1/valid_timestamps/c/0", - "episode_1/valid_timestamps/zarr.json", - "episode_1/wrist_camera", - "episode_1/wrist_camera.mp4", - "episode_1/wrist_camera/aligned_frame_indices", - "episode_1/wrist_camera/aligned_frame_indices/c", - "episode_1/wrist_camera/aligned_frame_indices/c/0", - "episode_1/wrist_camera/aligned_frame_indices/zarr.json", - "episode_1/wrist_camera/capture_time", - "episode_1/wrist_camera/capture_time/c", - "episode_1/wrist_camera/capture_time/c/0", - "episode_1/wrist_camera/capture_time/zarr.json", - "episode_1/wrist_camera/frame_id", - "episode_1/wrist_camera/frame_id/c", - "episode_1/wrist_camera/frame_id/c/0", - "episode_1/wrist_camera/frame_id/zarr.json", - "episode_1/wrist_camera/pose_interp", - "episode_1/wrist_camera/pose_interp/c", - "episode_1/wrist_camera/pose_interp/c/0", - "episode_1/wrist_camera/pose_interp/c/0/0", - "episode_1/wrist_camera/pose_interp/c/0/0/0", - "episode_1/wrist_camera/pose_interp/zarr.json", - "episode_1/wrist_camera/receive_time", - "episode_1/wrist_camera/receive_time/c", - "episode_1/wrist_camera/receive_time/c/0", - "episode_1/wrist_camera/receive_time/zarr.json", - "episode_1/wrist_camera/zarr.json", - "episode_1/zarr.json", - "zarr.json" - ] -} diff --git a/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.npz b/examples/egocap/tests/recording/fixtures/aligned_writer/golden_realign.npz deleted file mode 100644 index 5e9afbfe1590b54434275d608061142847bf19c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108380 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
!%5;eX?~b<u}%3JMH`5Wvl}I~Yv7}CnTuF9 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 Zg?<>pO8xgtjY*A3l9P!^JPRS1{sT7< Date: Tue, 10 Nov 2026 12:01:13 -0500 Subject: [PATCH 38/38] egocap: a discarded or interrupted take's follow-up records its tracking times Every take records the tracking sources' timing evidence, with or without media, so the next take after a discarded or interrupted one has that evidence call; it still inherits nothing from the earlier take. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Gareth Morgan --- .../tests/backend/test_recording_session_livekit.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/egocap/tests/backend/test_recording_session_livekit.py b/examples/egocap/tests/backend/test_recording_session_livekit.py index 97b2b61117..8ea2d5ce32 100644 --- a/examples/egocap/tests/backend/test_recording_session_livekit.py +++ b/examples/egocap/tests/backend/test_recording_session_livekit.py @@ -212,6 +212,10 @@ async def test_the_sources_timing_evidence_is_given_to_the_service_once_before_s async def test_a_discarded_takes_evidence_does_not_describe_the_next_take(tmp_path, monkeypatch): events: list[str] = [] calls = spy_on_service(monkeypatch, events) + tracking = { + "pico_controller": {"meaning": "host_poll_time", "qualified": False}, + "manus_glove": {"meaning": "host_poll_time", "qualified": False}, + } discarded = {"clock_mapping": {"mappings": ["discarded take"]}} coordinator = make_coordinator(tmp_path, EvidenceSource(events, [discarded, None])) await coordinator.open() @@ -222,13 +226,18 @@ async def test_a_discarded_takes_evidence_does_not_describe_the_next_take(tmp_pa two = await coordinator.start_episode() await coordinator.stop_episode(two.episode_id) - assert calls == [] # the second take's source had none, and nothing was inherited from the discarded one + # the second take's source had none: only its tracking times are recorded, nothing inherited + assert calls == [(two.episode_id, {"event_time": tracking})] await coordinator.close() async def test_an_interrupted_takes_evidence_does_not_describe_the_next_take(tmp_path, monkeypatch): events: list[str] = [] calls = spy_on_service(monkeypatch, events) + tracking = { + "pico_controller": {"meaning": "host_poll_time", "qualified": False}, + "manus_glove": {"meaning": "host_poll_time", "qualified": False}, + } interrupted = {"clock_mapping": {"mappings": ["interrupted take"]}} coordinator = make_coordinator(tmp_path, EvidenceSource(events, [interrupted, None])) await coordinator.open() @@ -243,5 +252,5 @@ async def test_an_interrupted_takes_evidence_does_not_describe_the_next_take(tmp two = await coordinator.start_episode() await coordinator.stop_episode(two.episode_id) - assert calls == [] + assert calls == [(two.episode_id, {"event_time": tracking})] await coordinator.close()