Files
MiPi_TEST/__pycache__/csv_preprocessor.cpython-312.pyc

156 lines
27 KiB
Plaintext
Raw Normal View History

2026-04-08 12:55:34 +01:00
<EFBFBD>
P<<3C>i<EFBFBD>]<00><00><00>dZddlZddlZddlZddlmZmZddlm Z ddl
m Z dZ dZ dZd Zd
Zd Zd Zd Zd ZdZeGd<0F>d<10><00>Zde deej0ej0ffd<13>Zdej0dej0dej0fd<16>Z d/dej0dej0dedededeeeff d<1A>Zde defd<1B>Zde de ee!efe e!e fffd<1D>Z"eGd<1E>d<1F><00>Z#d ej0d!edej0fd"<22>Z$d0d#ej0d$efd%<25>Z%de ddfd&<26>Z&e'd'k(r<>ddl(Z(e e)<29>jTd(z Z+e,e(jZ<00>d)kDr$e(jZd)dD<00>cgc]
}e |<00><00><02> c}Z.ne/e+jad*<2A><00>dd+Z.e.D]?Z1 d,e1jdvr e&e1<65>Z3nee1<65>Z3e4e3jk<00><00>e4<65><00>Ayycc}w#e6$r"Z7e4d-e1jd<00>d.e7<65><00><04>YdZ7[7<>kdZ7[7wwxYw)1uF
csv_preprocessor.py
Extracts MIPI HS-TX / LP state metrics from oscilloscope CSV files.
File naming convention: YYYYMMDD_HHMMSS_{sig|proto|lp}_{NNNN}_{clk|dat}.csv
sig — high-res short window (320 GSa/s, ~20 ns) — rise/fall times
Two columns: time_s, vdiff_v (F1/F2 differential, ±250 mV HS swing)
proto — lower-res long window (20 GSa/s, ~10 µs) — jitter, frequency, amplitude
Two columns: time_s, vdiff_v (F1/F2 differential)
lp — LP state capture (~40 GSa/s, ~5 µs) — LP-11/LP-00/HS burst structure
Two columns: time_s, voltage_v (Ch1 or Ch3 single-ended CLK+/DAT0+)
Vertical range: 0.2 V to 1.4 V so LP-11 (~1.2 V) and LP-00 (~0 V) are visible.
Trigger: falling edge at 0.6 V on CLK+ catches LP-11 → LP-01 SoT transition.
<EFBFBD>N)<02> dataclass<73>field)<01>Path)<01>Optionalg<00>a@g<00>p@g@@gI@皙<><E79A99><EFBFBD><EFBFBD><EFBFBD>?g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><00>?g333333<33>?g
ףp=
<EFBFBD>?c<00>$<00>eZdZUeed<eed<eed<eed<eed<eed<eed<eed<eed <eed
<eed <d Zeeed <d Z eeed<d Z
eeed<d Z eeed<d Z eeed<dZ eed<dZeed<ee<10><15>Zeed<defd<18>Zy )<19>ChannelMetrics<63> timestamp<6D> capture_num<75> file_type<70>channel<65>sample_rate_gsps<70> duration_ns<6E> n_samples<65> vdiff_pos_mv<6D> vdiff_neg_mv<6D>vdiff_amplitude_mv<6D>vcm_mvN<76>clock_freq_mhz<68> jitter_pp_ps<70> jitter_rms_ps<70> rise_time_ps<70> fall_time_psr<00> n_transitions<6E>spec_violations<6E><01>default_factory<72>warnings<67>returnc <00><00>d<01>}d|jd<03>d|j<00>d|j<00>d|j<00>d<07> d|jd <09>d
|t
|jcxkxr t knc<00><00><00>d |jd <0C>d |jd <0C>d<0E>d|jd<10>d<0E>g}|j<00>-|jd|jd<12>d|j<00>d<14><05>|j<00>.|jd|jd <0C>d|jd <0C>d<17><05>|j<00>9|jd|jd <0C>d||jt k<00><00><00><04>|j"<00>9|jd|j"d <0C>d||j"t k<00><00><00><04>|j$r'|jd|j$<00>dt
d<1D>d<1E><05>|j&D]}|jd|<03><00><02><00>d j)|<02>S)!Nc<00><00>|rdSdS<00>Nu✓u<>)<01>conds <20>5/home/david-rice/Python/MiPi_Test/csv_preprocessor.py<70><lambda>z(ChannelMetrics.summary.<locals>.<lambda>Is <00><00>4<EFBFBD>%<25><00>U<EFBFBD><00><00>Capture <20>04d<34> z [<5B>/<2F>]z Vdiff amplitude : z6.1fu mV (spec 140270 mV) z Vdiff pos/neg : +<2B>.1fz / <20> mVz Common mode : z+.1fz Clock freq : <20>.2fz MHz DDR (z transitions)z Jitter p-p/RMS : z ps / <20> psz Rise time 20-80%: z ps z Fall time 20-80%: z Spec violations : z samples below <20>.0fu mV ✗<> WARNING: <20>
)r r r rr<00>HS_VDIFF_MIN_MV<4D>HS_VDIFF_MAX_MVrrrr<00>appendrrrr<00>RISE_FALL_MAX_PSrrr<00>join)<04>self<6C>ok<6F>lines<65>ws r&<00>summaryzChannelMetrics.summaryHs6<00><00> 2<><02><16>t<EFBFBD>'<27>'<27><03>,<2C>B<EFBFBD>t<EFBFBD>~<7E>~<7E>.><3E>c<EFBFBD>$<24>.<2E>.<2E>AQ<41>QR<51>SW<53>S_<53>S_<53>R`<60>`a<> b<>"<22>4<EFBFBD>#:<3A>#:<3A>4<EFBFBD>"@<40>A$<24>$&<26><EFBFBD>$<24>:Q<>:Q<>'d<>Ud<55>'d<>$e<>#f<> h<01>#<23>D<EFBFBD>$5<>$5<>c<EFBFBD>#:<3A>#<23>d<EFBFBD>>O<>>O<>PS<50>=T<>TW<54> X<>"<22>4<EFBFBD>;<3B>;<3B>t<EFBFBD>"4<>C<EFBFBD> 8<> 
<EFBFBD><05> <10> <1E> <1E> *<2A> <11>L<EFBFBD>L<EFBFBD>&<26>t<EFBFBD>':<3A>':<3A>3<EFBFBD>&?<3F>@<14><18>&<26>&<26>'<27>}<7D>6<> <0E> <10> <1C> <1C> (<28> <11>L<EFBFBD>L<EFBFBD>&<26>t<EFBFBD>'8<>'8<><13>&=<3D>V<EFBFBD>D<EFBFBD>DV<44>DV<44>WZ<57>C[<5B>[^<5E>_<> <0E> <10> <1C> <1C> (<28> <11>L<EFBFBD>L<EFBFBD>&<26>t<EFBFBD>'8<>'8<><13>&=<3D>U<EFBFBD><15>d<EFBFBD>'<27>'<27>+;<3B>;<3B><<3C>=<3D>?<3F> <0E> <10> <1C> <1C> (<28> <11>L<EFBFBD>L<EFBFBD>&<26>t<EFBFBD>'8<>'8<><13>&=<3D>U<EFBFBD><15>d<EFBFBD>'<27>'<27>+;<3B>;<3B><<3C>=<3D>?<3F> <0E> <10> <1F> <1F> <11>L<EFBFBD>L<EFBFBD>/<2F><04>0D<30>0D<30>/E<>_<EFBFBD>Ud<55>eh<65>Ti<54>iq<69>r<> s<><15><1D><1D> ,<2C>A<EFBFBD> <11>L<EFBFBD>L<EFBFBD>;<3B>q<EFBFBD>c<EFBFBD>*<2A> +<2B> ,<2C><13>y<EFBFBD>y<EFBFBD><15><1F>r()<13>__name__<5F>
__module__<EFBFBD> __qualname__<5F>str<74>__annotations__<5F>int<6E>floatrrrrrrrrr<00>listrr>r$r(r&r
r
*s<><00><00><14><14><14><14><14><14><14><14><1B><1B><1B><1B><19><19><1E><1D><1D><1D><1D><1D><1D><1D>'+<2B>N<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>*<2A>&*<2A>L<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>*<2A>&*<2A>M<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>*<2A>&*<2A>L<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>*<2A>&*<2A>L<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>*<2A><1B>M<EFBFBD>C<EFBFBD><1B><1D>O<EFBFBD>S<EFBFBD><1C><1A>4<EFBFBD>0<>H<EFBFBD>d<EFBFBD>0<>  <20><13>  r(r
<00>pathr c<00><><00>gg}}t|<00>5}tj|<03>D]L}t|<04>dk\s<01> |j t |d<00><00>|j t |d<00><00><00>N ddd<00>tj|tj<00><04>tj|tj<00><04>fS#t $rY<00><>wxYw#1swY<00>bxYw)N<>r<00><00><01>dtype)
<EFBFBD>open<65>csv<73>reader<65>lenr7rE<00>
ValueError<EFBFBD>np<6E>array<61>float64)rG<00>times<65>volts<74>f<>rows r&<00> _read_csvrYos<><00><00><15>r<EFBFBD>5<EFBFBD>E<EFBFBD> <0A>d<EFBFBD><1A><19>q<EFBFBD><16>:<3A>:<3A>a<EFBFBD>=<3D> <19>C<EFBFBD><12>3<EFBFBD>x<EFBFBD>1<EFBFBD>}<7D><19><19>L<EFBFBD>L<EFBFBD><15>s<EFBFBD>1<EFBFBD>v<EFBFBD><1D>/<2F><19>L<EFBFBD>L<EFBFBD><15>s<EFBFBD>1<EFBFBD>v<EFBFBD><1D>/<2F>  <19><19> <0E>8<EFBFBD>8<EFBFBD>E<EFBFBD><12><1A><1A> ,<2C>b<EFBFBD>h<EFBFBD>h<EFBFBD>u<EFBFBD>B<EFBFBD>J<EFBFBD>J<EFBFBD>.O<> O<>O<><4F>"<22><19><18><19><> <19><19>s.<00>'C<03>:C<04>3C<03> C<07>C<03>C<07>C<03>C rUrVc<00>h<00>tj|<01>}tj|<02>}tj|dk7<00>d}g}|D]R}||dk7s<01> ||dzdk7s<01>|| ||dz||z
z }|j |||||dz||z
zz<00><00>Ttj
|<05>S)zDReturn array of linearly-interpolated zero-crossing times (seconds).rrJ)rR<00>sign<67>diff<66>wherer7rS)rUrV<00>signs<6E>change<67>idx<64>ct<63>i<>fracs r&<00>_zero_crossingsrd|s<><00><00> <0E>G<EFBFBD>G<EFBFBD>E<EFBFBD>N<EFBFBD>E<EFBFBD> <0F>W<EFBFBD>W<EFBFBD>U<EFBFBD>^<5E>F<EFBFBD>
<0C>(<28>(<28>6<EFBFBD>Q<EFBFBD>;<3B>
<1F><01>
"<22>C<EFBFBD> <0B>B<EFBFBD> <10>C<01><01> <10><11>8<EFBFBD>q<EFBFBD>=<3D>U<EFBFBD>1<EFBFBD>q<EFBFBD>5<EFBFBD>\<5C>Q<EFBFBD>.<2E><19>!<21>H<EFBFBD>9<EFBFBD><05>a<EFBFBD>!<21>e<EFBFBD> <0C>u<EFBFBD>Q<EFBFBD>x<EFBFBD> 7<>8<>D<EFBFBD> <0E>I<EFBFBD>I<EFBFBD>e<EFBFBD>A<EFBFBD>h<EFBFBD><14><15>q<EFBFBD>1<EFBFBD>u<EFBFBD><1C><05>a<EFBFBD><08>)@<40>!A<>A<> B<>C<01> <0E>8<EFBFBD>8<EFBFBD>B<EFBFBD><<3C>r(<00>v_high<67>v_low<6F>window_samplesc <00><00>|d||z
zz}|d||z
zz}tj|<01>}tjtj|<07>dk7<00>d}gg}
} |D<00>]&} t d| |dzz
<00>} t t |<00>| |dzz<00>} || | }|| | }t |<0F>dkr<01>J|t | dzt |<01>dz
<00>|| kDr<>tj||<05>}tj||<06>}d|cxkrt |<0E>dz
ks<01><>n<00><>d|cxkrt |<0E>dz
ks<01><>n<00><>||kDs<01><>tj|||dz
|dz||dz
|dz<00>}tj|||dz
|dz||dz
|dz<00>}| j||z
dz<00><00><01>A|ddd <09>}|ddd <09>}tj||<06>}tj||<05>}d|cxkrt |<15>dz
ks<02><01><>n<00><01><>d|cxkrt |<15>dz
ks<02><01><>n<00><01><>||kDs<02><01><>tj|||dz
|dz||dz
|dz<00>}tj|||dz
|dz||dz
|dz<00>}|
j||z
dz<00><00><02>)| |
fS)
uv
Measure 20%80% rise and fall times around each zero crossing.
Returns (rise_times_ps, fall_times_ps).
g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?rrrI<00>rJ<00><00><>mBN<42><4E><EFBFBD><EFBFBD><EFBFBD>)
rRr[r]r\<00>max<61>minrP<00> searchsorted<65>interpr7)rUrVrerfrg<00>v20<32>v80r^<00> trans_idx<64>rise_ps<70>fall_psr`<00>s<>e<>tw<74>vw<76>i20<32>i80<38>t20<32>t80<38>vw_r<5F>tw_rs r&<00>_rise_fall_timesr<00>s<><00><00> <10>$<24>&<26>5<EFBFBD>.<2E>)<29>
)<29>C<EFBFBD>
<0F>$<24>&<26>5<EFBFBD>.<2E>)<29>
)<29>C<EFBFBD> <0E>G<EFBFBD>G<EFBFBD>E<EFBFBD>N<EFBFBD>E<EFBFBD><12><08><08><12><17><17><15><1E>1<EFBFBD>,<2C>-<2D>a<EFBFBD>0<>I<EFBFBD><19>2<EFBFBD>W<EFBFBD>G<EFBFBD><18>3<><03> <0F><01>3<EFBFBD><1E>1<EFBFBD>,<2C>,<2C> -<2D><01> <0F><03>E<EFBFBD>
<EFBFBD>C<EFBFBD>.<2E>A<EFBFBD>"5<>5<> 6<><01> <12>1<EFBFBD>Q<EFBFBD>Z<EFBFBD><02> <12>1<EFBFBD>Q<EFBFBD>Z<EFBFBD><02> <0E>r<EFBFBD>7<EFBFBD>Q<EFBFBD>;<3B> <14> <10><13>S<EFBFBD>1<EFBFBD>W<EFBFBD>c<EFBFBD>%<25>j<EFBFBD>1<EFBFBD>n<EFBFBD>-<2D> .<2E><15>s<EFBFBD><1A> ;<3B><14>/<2F>/<2F>"<22>c<EFBFBD>*<2A>C<EFBFBD><14>/<2F>/<2F>"<22>c<EFBFBD>*<2A>C<EFBFBD><10>3<EFBFBD>$<24><13>R<EFBFBD><17>1<EFBFBD><1B>$<24><11>S<EFBFBD>)><3E>3<EFBFBD>r<EFBFBD>7<EFBFBD>Q<EFBFBD>;<3B>)><3E>3<EFBFBD><13>9<EFBFBD><18>i<EFBFBD>i<EFBFBD><03>R<EFBFBD><03>a<EFBFBD><07><03>a<EFBFBD><07>%8<>"<22>S<EFBFBD>1<EFBFBD>W<EFBFBD>S<EFBFBD>1<EFBFBD>W<EFBFBD>:M<>N<><03><18>i<EFBFBD>i<EFBFBD><03>R<EFBFBD><03>a<EFBFBD><07><03>a<EFBFBD><07>%8<>"<22>S<EFBFBD>1<EFBFBD>W<EFBFBD>S<EFBFBD>1<EFBFBD>W<EFBFBD>:M<>N<><03><17><0E><0E><03>c<EFBFBD> <09>T<EFBFBD>1<>2<><16>d<EFBFBD><02>d<EFBFBD>8<EFBFBD>D<EFBFBD><15>d<EFBFBD><02>d<EFBFBD>8<EFBFBD>D<EFBFBD><14>/<2F>/<2F>$<24><03>,<2C>C<EFBFBD><14>/<2F>/<2F>$<24><03>,<2C>C<EFBFBD><10>3<EFBFBD>&<26><13>T<EFBFBD><19>Q<EFBFBD><1D>&<26>&<26>1<EFBFBD>s<EFBFBD>+B<>S<EFBFBD><14>Y<EFBFBD><11>]<5D>+B<>+B<>s<EFBFBD>S<EFBFBD>y<EFBFBD><18>i<EFBFBD>i<EFBFBD><03>T<EFBFBD>#<23><01>'<27>#<23><01>'<27>%:<3A>D<EFBFBD><13>q<EFBFBD><17><13>q<EFBFBD><17><Q<>R<><03><18>i<EFBFBD>i<EFBFBD><03>T<EFBFBD>#<23><01>'<27>#<23><01>'<27>%:<3A>D<EFBFBD><13>q<EFBFBD><17><13>q<EFBFBD><17><Q<>R<><03><17><0E><0E><03>c<EFBFBD> <09>T<EFBFBD>1<>2<>53<>8 <13>G<EFBFBD> <1B>r(c <00><> <00>tjd|jtj<00>}|st d|j<00><00><02><00>|j <00>\}}}}|dk(r t d<04><00>t |<04>}t|<00>\}}ttj|<07>j<00><00>} d| z }
t|d<00>t|d<00>z
dz} td z } || kD} || k}| j<00>rt|| j<00><00>d znd
}|j<00>rt||j<00><00>d znd
}| j<00> xr|j<00> }| xr$| j<00> xs|j<00> }|rd
}n;|rtt|<0F>t|<10><00>}nt|<0F>t|<10>zd z }||zd z }t!||<08>}t#|<15>}d x}x}}|d k(<00>r|dk\<00>r tj|<15>dz}ttj$|<1A><00>}t|j'<00><00>}|dkDr!|tj||z
<00>d|zkn|}t#|<1D>dk\r<>t)dttj$|<1D><00>dzz dz d<13>}t)t|j<00>|j+<00>z
<00>d<14>}t)t|j'<00><00>d<14>}|d z }|d z }t-||||<1F>\} }!| r(t)ttj$| <20><00>d<14>nd }"|!r(t)ttj$|!<21><00>d<14>nd }#|dk\r4ttj$tj|<15><00><00>dzn| dz}$tj.t#|<07>t0<00><18>}%|D]9}&tj2||&|$z
<00>}'tj2||&|$z<00>}(d|%|'|(<00>;|%tj|<08>| kDz})|r)|r'dt+t|d z <00>t|d z <00><00>znt4d z }*t tj6|)tj|<08>|*kz<00><00>}+g},|r|,j9d<1B>n+|r)| j<00>rdnd}-|,j9d|-<2D>d<1F><03>|s'|t4kr|,j9d |d!<21>d"t4d!<21>d#<23><05>|t:kDr|,j9d |d!<21>d$t:d!<21>d#<23><05>|"<22>'|"t<kDr|,j9d%|"d!<21>d&t<d!<21>d'<27><05>|#<23>'|#t<kDr|,j9d(|#d!<21>d&t<d!<21>d'<27><05>|+dkDr|,j9|+<2B>d)t4d!<21>d#<23><04>t?d=id*|<02>d+|<06>d,|<03>d-|<05>d.t)|
dz d<14><00>d/t)| d<13><00>d0t#|<07><00>d1t)|d<14><00>d2t)|d<14><00>d3t)|d<14><00>d4t)|d<14><00>d5|<17>d6|<18>d7|<19>d8|"<22>d9|#<23>d:|<16>d;|+<2B>d<|,<2C><01>S)>zQ
Analyse one oscilloscope CSV file and return a ChannelMetrics instance.
<20>1(\d{8}_\d{6})_(sig|proto|lp)_(\d+)_(clk|dat)\.csvz*Filename does not match expected pattern: <20>lpz6Use analyze_lp_file() for lp-type files (single-ended)rrkr<00>e<><65>Ag@<40>@gg@N<>clk<6C>rjg@g<11>-<2D><><EFBFBD><EFBFBD>=<3D><00><>.ArIrJrigffffff<66>?<3F>
rKTg333333<33>?u9No HS signal detected — line may be in LP state or idle<6C>positive<76>negativezOnly u= swings in capture window — amplitude may be underestimatedzVdiff r2z mV below spec min r/z mV above spec max z
Rise time z ps exceeds r1z
Fall time z settled samples below r r r rrrrrrrrrrrrrrrrr$) <20>re<72>match<63>name<6D>
IGNORECASErQ<00>groupsrDrYrErRr\<00>mean<61>TRANSITION_BAND_MV<4D>anyrl<00>absrdrP<00>median<61>std<74>roundrmr<00>zeros<6F>boolrnr5<00>sumr7r6r8r
).rG<00>mr r <00>cap_strrr rUrV<00>dt<64> sample_rater<00>v_thresh<73>pos_mask<73>neg_mask<73> vdiff_pos<6F> vdiff_neg<65> no_signal<61> one_sided<65> amplitude<64>vcmrarrrr<00> half_periods<64>med<65>sd<73>hprerf<00> rise_list<73> fall_listrr<00>guard_s<5F>in_guard<72>t_cross<73>lo<6C>hi<68>settled<65>floor_vrr<00>polaritys. r&<00> analyze_filer<65><00>s@<00><00> <0B><08><08>E<><15><19><19>B<EFBFBD>M<EFBFBD>M<EFBFBD> +<2B>A<EFBFBD> <0C><18>E<>d<EFBFBD>i<EFBFBD>i<EFBFBD>[<5B>Q<>R<>R<>-.<2E>X<EFBFBD>X<EFBFBD>Z<EFBFBD>*<2A>I<EFBFBD>y<EFBFBD>'<27>7<EFBFBD><10>D<EFBFBD><18><18>Q<>R<>R<><15>g<EFBFBD>,<2C>K<EFBFBD><1C>T<EFBFBD>?<3F>L<EFBFBD>E<EFBFBD>5<EFBFBD><1A>2<EFBFBD>7<EFBFBD>7<EFBFBD>5<EFBFBD>><3E>.<2E>.<2E>0<>1<>B<EFBFBD><18>2<EFBFBD>X<EFBFBD>K<EFBFBD><1B>E<EFBFBD>"<22>I<EFBFBD>&<26><15>u<EFBFBD>Q<EFBFBD>x<EFBFBD><1F>8<>C<EFBFBD>?<3F>K<EFBFBD>"<22>F<EFBFBD>*<2A>H<EFBFBD><14><08> <20>H<EFBFBD><14><08>y<EFBFBD> <20>H<EFBFBD>:B<>,<2C>,<2C>.<2E><05>e<EFBFBD>H<EFBFBD>o<EFBFBD>*<2A>*<2A>,<2C>-<2D><06>6<>c<EFBFBD>I<EFBFBD>:B<>,<2C>,<2C>.<2E><05>e<EFBFBD>H<EFBFBD>o<EFBFBD>*<2A>*<2A>,<2C>-<2D><06>6<>c<EFBFBD>I<EFBFBD>
<1E>\<5C>\<5C>^<5E>#<23>=<3D>h<EFBFBD>l<EFBFBD>l<EFBFBD>n<EFBFBD>*<<3C>I<EFBFBD><1E><1D>R<>(<28>,<2C>,<2C>.<2E>&8<>%Q<>(<28>,<2C>,<2C>.<2E>>P<>I<EFBFBD><10><17> <09> <12><17><03>I<EFBFBD><0E><03>I<EFBFBD><0E>7<> <09><18><19>^<5E>c<EFBFBD>)<29>n<EFBFBD>4<><03>;<3B> <09> <14>y<EFBFBD> <20>C<EFBFBD>
'<27>C<EFBFBD>
<19><15><05> &<26>B<EFBFBD><17><02>G<EFBFBD>M<EFBFBD>48<34>8<>N<EFBFBD>8<>\<5C>M<EFBFBD> <0F>%<25><17>M<EFBFBD>R<EFBFBD>/<2F><19>w<EFBFBD>w<EFBFBD>r<EFBFBD>{<7B>T<EFBFBD>)<29> <0C><13>B<EFBFBD>I<EFBFBD>I<EFBFBD>l<EFBFBD>+<2B>,<2C><03><13>L<EFBFBD>$<24>$<24>&<26>'<27><02>DF<44><11>F<EFBFBD>\<5C>"<22>&<26>&<26><1C><03>!3<>4<>s<EFBFBD>R<EFBFBD>x<EFBFBD>?<3F> @<40>P\<5C><02> <0E>r<EFBFBD>7<EFBFBD>b<EFBFBD>=<3D>"<22>3<EFBFBD>%<25><02> <09> <09>"<22> <0A>*><3E><15>*F<>#G<>#<23>#M<>q<EFBFBD>Q<>N<EFBFBD>"<22>5<EFBFBD><12><16><16><18>B<EFBFBD>F<EFBFBD>F<EFBFBD>H<EFBFBD>)<<3C>#=<3D>q<EFBFBD>A<>L<EFBFBD>"<22>5<EFBFBD><12><16><16><18>?<3F>A<EFBFBD>6<>M<EFBFBD><17><16> <1F>F<EFBFBD> <16><16> <1F>E<EFBFBD>+<2B>E<EFBFBD>5<EFBFBD>&<26>%<25>H<><18>I<EFBFBD>y<EFBFBD><E<>5<EFBFBD><15>r<EFBFBD>y<EFBFBD>y<EFBFBD><19>3<>4<>a<EFBFBD>8<>4<EFBFBD>L<EFBFBD><E<>5<EFBFBD><15>r<EFBFBD>y<EFBFBD>y<EFBFBD><19>3<>4<>a<EFBFBD>8<>4<EFBFBD>L<EFBFBD> 7D<01>q<EFBFBD>6H<36>e<EFBFBD>B<EFBFBD>I<EFBFBD>I<EFBFBD>b<EFBFBD>g<EFBFBD>g<EFBFBD>b<EFBFBD>k<EFBFBD>*<2A>+<2B>d<EFBFBD>2<>b<EFBFBD>SU<53>g<EFBFBD>G<EFBFBD><11>x<EFBFBD>x<EFBFBD><03>E<EFBFBD>
<EFBFBD>$<24>/<2F>H<EFBFBD><15><1F><07> <0F>_<EFBFBD>_<EFBFBD>U<EFBFBD>G<EFBFBD>g<EFBFBD>$5<> 6<><02> <0F>_<EFBFBD>_<EFBFBD>U<EFBFBD>G<EFBFBD>g<EFBFBD>$5<> 6<><02><1E><08><12>B<EFBFBD><0F><1F>
<19>y<EFBFBD>R<EFBFBD>V<EFBFBD>V<EFBFBD>E<EFBFBD>]<5D>X<EFBFBD>5<>6<>G<EFBFBD> <12>i<EFBFBD><13>S<EFBFBD><13>Y<EFBFBD><16>/<2F>0<>#<23>i<EFBFBD>&<26>6H<36>2I<32>J<>J<>&5<><06>&><3E> <0C><19>"<22>&<26>&<26><17>B<EFBFBD>F<EFBFBD>F<EFBFBD>5<EFBFBD>M<EFBFBD>G<EFBFBD>,C<>!D<>E<>F<>O<EFBFBD><12>H<EFBFBD><10><10><0F><0F>S<>T<> <12>!)<29><1C><1C><1E>:<3A>Z<EFBFBD><08><10><0F><0F><13>H<EFBFBD>:<3A>Z<> [<5B>
<EFBFBD> <15><19>_<EFBFBD>4<><10><0F><0F>&<26><19>3<EFBFBD><0F>/B<>?<3F>SV<53>BW<42>WZ<57>[<5B>\<5C><10>?<3F>"<22><10><0F><0F>&<26><19>3<EFBFBD><0F>/B<>?<3F>SV<53>BW<42>WZ<57>[<5B>\<5C><13><1F>L<EFBFBD>3C<33>$C<><10><0F><0F>*<2A>\<5C>#<23>$6<>l<EFBFBD>CS<43>TW<54>BX<42>X[<5B>\<5C>]<5D><13><1F>L<EFBFBD>3C<33>$C<><10><0F><0F>*<2A>\<5C>#<23>$6<>l<EFBFBD>CS<43>TW<54>BX<42>X[<5B>\<5C>]<5D><16><11><1A><10><0F><0F>?<3F>+<2B>+B<>?<3F>SV<53>BW<42>WZ<57>[<5B>\<5C> <19> <06>$<24> <06>&<26> <06>%<25> <06>#<23>  <06>
!<21><1B>s<EFBFBD>!2<>A<EFBFBD>6<>  <06> !<21><1B>a<EFBFBD>0<>  <06><1F>u<EFBFBD>:<3A> <06>!<21><19>A<EFBFBD>.<2E> <06>!<21><19>A<EFBFBD>.<2E> <06>#<23>9<EFBFBD>a<EFBFBD>0<> <06>!<21><13>a<EFBFBD>=<3D> <06>*<2A> <06>(<28> <06>)<29> <06>(<28> <06> (<28>! <06>")<29># <06>$+<2B>% <06>&$<24>' <06>r(<00>data_dirc<00>D<00>tjdtj<00>}i}t|j d<02><00>D]\}|j |j <00>}|s<01>!|j<00>\}}}}|t|<07>f} ||j| i<00>|<06>d|<08><00><<00>^|S)u
Scan data_dir and group CSV files by (timestamp, capture_number).
Returns dict mapping (timestamp, num) → {file_type_channel: Path}.
Example key: ("20260408_111448", 1)
Example value: {"sig_clk": Path(...), "sig_dat": ..., "proto_clk": ..., "proto_dat": ...}
r<><00>*.csv<73>_)
r<EFBFBD><00>compiler<65><00>sorted<65>globr<62>r<>r<>rD<00>
setdefault)
r<EFBFBD><00>patternr<6E>rWr<><00>ts<74>ftyper<65><00>ch<63>keys
r&<00>group_capturesr<73>?s<><00><00><11>j<EFBFBD>j<EFBFBD>M<>r<EFBFBD>}<7D>}<7D>]<5D>G<EFBFBD>57<35>F<EFBFBD> <13>H<EFBFBD>M<EFBFBD>M<EFBFBD>'<27>*<2A> +<2B>8<><01> <13>M<EFBFBD>M<EFBFBD>!<21>&<26>&<26> !<21><01><10> <14>!"<22><18><18><1A><1E><02>E<EFBFBD>7<EFBFBD>B<EFBFBD><11>3<EFBFBD>w<EFBFBD><<3C> <20><03>67<36><06><19><19>#<23>r<EFBFBD>"<22>e<EFBFBD>W<EFBFBD>A<EFBFBD>b<EFBFBD>T<EFBFBD>?<3F>3<> 8<> <12>Mr(c<00><><00>eZdZUeed<eed<eed<eed<eed<eed<eeed<eeed<eeed <eed
<eeed <eeed <eed <e e
<EFBFBD><0E>Z e
ed<defd<11>Z y)<13> LPMetricsr r rr<00> duration_usr<00>lp11_voltage_v<5F>lp11_duration_us<75>lp_low_duration_ns<6E> n_hs_bursts<74>hs_burst_dur_ns<6E>hs_amplitude_mv<6D>lp_transition_validrrr c <00><><00>d<01>}d|jd<03>d|j<00>d|j<00>d<06>g}|j<00>Zt|jcxkxr t
knc}|j d|jd<08>d td
<EFBFBD>d t
d <0C>d ||<03><00><00><08>|j<00> |j d|jd <0C>d<0F><03>|j<00>C|jtk\}|j d|jd<11>dtd<11>d||<04><00><00><06>|j d|jrdnd<16><00><02>|jr>|j d|j<00><00>|jrd|jd<11>d<19>ndz<00>|j<00> |j d|jd<11>d<1C><03>|jD]}|j d|<05><00><02><00>dj|<02>S)Nc<00><00>|rdSdSr#r$)<01>cs r&r'z#LPMetrics.summary.<locals>.<lambda>qs <00><00><01>u<EFBFBD><00>u<EFBFBD>r(r)r*r+z [lp/r-z LP-11 voltage : <20>.3fz
V (spec r.ur0z V) z LP-11 duration : u µsz LP-low duration : r2u ns (spec ≥z ns) u LP→HS sequence : u valid ✓uNOT DETECTED ✗z HS bursts : z avg <20> ns<6E>z HS amplitude : z mV (single-ended p-p/2)r3r4)r r rr<><00>LP11_SPEC_MIN_V<5F>LP11_SPEC_MAX_Vr7r<>r<><00>LP_LOW_DUR_MIN_NSr<53>r<>r<>r<>rr9)r:r;r<<00>in_spec<65>ok_lpr=s r&r>zLPMetrics.summaryps<><00><00> ,<2C><02><16>t<EFBFBD>'<27>'<27><03>,<2C>B<EFBFBD>t<EFBFBD>~<7E>~<7E>.><3E>f<EFBFBD>T<EFBFBD>\<5C>\<5C>N<EFBFBD>RS<52> T<>
<EFBFBD><05> <10> <1E> <1E> *<2A>%<25><14>)<<3C>)<<3C>O<><0F>O<>G<EFBFBD> <11>L<EFBFBD>L<EFBFBD>&<26>t<EFBFBD>':<3A>':<3A>3<EFBFBD>&?<3F>@<19>(<28><13>-<2D>S<EFBFBD><1F><13>0E<30>U<EFBFBD>2<EFBFBD>g<EFBFBD>;<3B>-<2D>Y<01> <0E> <10> <20> <20> ,<2C> <11>L<EFBFBD>L<EFBFBD>/<2F><04>0E<30>0E<30>c<EFBFBD>/J<>$<24>O<> P<> <0F> "<22> "<22> .<2E><18>+<2B>+<2B>/@<40>@<40>E<EFBFBD> <11>L<EFBFBD>L<EFBFBD>&<26>t<EFBFBD>'><3E>'><3E>s<EFBFBD>&C<>D<1C>-<2D>c<EFBFBD>2<>&<26><12>E<EFBFBD><19> <0B>E<01> <0E> <0E> <0C> <0C>$<24>D<EFBFBD>4L<34>4L<34>[<5B>Rd<52>$e<> f<>
<EFBFBD> <10> <1B> <1B> <11>L<EFBFBD>L<EFBFBD>/<2F><04>0@<40>0@<40>/A<>B<>FJ<46>FZ<46>FZ<46>f<EFBFBD>T<EFBFBD>%9<>%9<>#<23>$><3E>c<EFBFBD>B<>`b<>d<01> e<01> <0F> <1F> <1F> +<2B> <11>L<EFBFBD>L<EFBFBD>/<2F><04>0D<30>0D<30>S<EFBFBD>/I<>Ia<49>b<> c<><15><1D><1D> ,<2C>A<EFBFBD> <11>L<EFBFBD>L<EFBFBD>;<3B>q<EFBFBD>c<EFBFBD>*<2A> +<2B> ,<2C><13>y<EFBFBD>y<EFBFBD><15><1F>r(N) r?r@rArBrCrDrErr<>rrFrr>r$r(r&r<>r<>Vs<><00><00><14><14><14><14><14><14><1B><1B><1B><1B><19><19> <20><05><EFBFBD>&<26><1F><05><EFBFBD>&<26>!<21><15><0F>'<27><1C><1B> <20><15><0F>'<27> <20><15><0F>'<27><1D><1D><1A>4<EFBFBD>0<>H<EFBFBD>d<EFBFBD>0<> <20><13> r(r<><00>arr<72>windowc <00>d<00>ddlm}t|<00>}||kr$tj||j <00><00>S|||<01>}|j d<03><04>}|dz}|t|<05>z
|z
}tj tj||d<00>|tj||d<00>g<03>S)zKCompute rolling standard deviation using stride_tricks (O(n) memory, fast).r)<01>sliding_window_viewrJ)<01>axisrIrk)<07>numpy.lib.stride_tricksr<73>rPrR<00>fullr<6C><00> concatenate)r<>r<>r<><00>n<>windowed<65>stds<64>pad_l<5F>pad_rs r&<00> _rolling_stdr<64><00>s<><00><00>;<3B> <0B>C<EFBFBD><08>A<EFBFBD><08>F<EFBFBD>{<7B><11>w<EFBFBD>w<EFBFBD>q<EFBFBD>#<23>'<27>'<27>)<29>$<24>$<24>"<22>3<EFBFBD><06>/<2F>H<EFBFBD> <13><<3C><<3C>Q<EFBFBD><<3C> <1F>D<EFBFBD> <12>a<EFBFBD>K<EFBFBD>E<EFBFBD> <0A><03>D<EFBFBD> <09>M<EFBFBD>E<EFBFBD> !<21>E<EFBFBD> <0A>><3E>><3E>2<EFBFBD>7<EFBFBD>7<EFBFBD>5<EFBFBD>$<24>q<EFBFBD>'<27>2<>D<EFBFBD>"<22>'<27>'<27>%<25><14>b<EFBFBD><18>:R<>S<> T<>Tr(<00>mask<73> min_samplesc<00>f<00>tjdg|dgg<03>}tj|jtj<00><00>}tj
|dk(<00>d}tj
|dk(<00>d}t ||<05>D<00><06>cgc]\}}||z
|k\s<01>||f<02><02>c}}Scc}}w)uGReturn list of (start_idx, end_idx) for True runs ≥ min_samples long.FrJrrk)rRr<>r\<00>astype<70>int8r]<00>zip)r<>r<><00>paddedr\<00>starts<74>endsrurvs r&<00>_find_contiguous_regionsr<73><00>s<><00><00> <0F>^<5E>^<5E>e<EFBFBD>W<EFBFBD>d<EFBFBD>U<EFBFBD>G<EFBFBD>4<> 5<>F<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>6<EFBFBD>=<3D>=<3D><12><17><17>)<29> *<2A>D<EFBFBD> <0F>X<EFBFBD>X<EFBFBD>d<EFBFBD>a<EFBFBD>i<EFBFBD> <20><11> #<23>F<EFBFBD> <0F>X<EFBFBD>X<EFBFBD>d<EFBFBD>b<EFBFBD>j<EFBFBD> !<21>!<21> $<24>D<EFBFBD>"<22>6<EFBFBD>4<EFBFBD>0<> K<>t<EFBFBD>q<EFBFBD>!<21>Q<EFBFBD><11>U<EFBFBD>{<7B>4J<34>Q<EFBFBD><01>F<EFBFBD> K<>K<><4B> Ks <00>B-<06>#B-c<00><00>#<23>tjd|jtj<00>}|st d|j<00><00><02><00>|j <00>\}}}t |<03>}t|<00>\<00>#}ttj<00>#<23>j<00><00>}d|z }t<00>#d<00>t<00>#d<00>z
dz} tdt d|z <00><00>}
t||
<EFBFBD>} |tkD} |tk| t kz} | | z| t k\z}t#| d<07> <09>}d
}d
}|rmt%ttj&|D<00><12>cgc]
\}}|||<00><02> c}}<12>j<00><00>d <0B>}t%t)<00>#fd <0C>|D<00><00>dzd <0B>}d
}d }t#| d<0E> <09>}t#|d<0F> <09>}|ro|rm|rk|dd}|dd}|D<00><12>cgc]"\}}||k\r||t d|z <00>zkr||f<02><02>$}}}|r*|dd|dd}}t%<00>#|<00>#|z
dzd<10>}d}t+|<17>}d
}d
}|r<>|D<00><12>cgc]\}}<13>#|<00>#|z
dz<00><02>} }}t%ttj| <20><00>d<10>}tj&|D<00><12>cgc]
\}}|||<00><02> c}}<12>}!t%ttj,|!d<14><00>ttj,|!d<0E><00>z
dz dzd<10>}g}"|s|"j/d<17>nN|<10>L|t0kr|"j/d|d<19>dt0<00>d<1B><05>|t2kDr|"j/d|d<19>dt2<00>d<1B><05>|<14>'|t4kr|"j/d|d<1E>dt4d<1E>d <20><05>|s|"j/d!<21>|dk(r|"j/d"<22>t7|||t%|dz d<10>t%| d<15>t+<00>#<23>||||||||"<22>#<23>Scc}}wcc}}wcc}}wcc}}w)$u<>
Analyse a single-ended LP capture CSV (Ch1 or Ch3) and return LPMetrics.
State classification per sample:
LP-11 : voltage > LP11_HIGH_V (~1.2 V, both pins high)
LP-low : voltage < LP_LOW_V (~0 V, pin driven low — LP-01 or LP-00)
HS : voltage in mid-range with high oscillation (rolling std > HS_OSC_STD_V)
trans : everything else (transitions between states)
z%(\d{8}_\d{6})_lp_(\d+)_(clk|dat)\.csvz$Filename does not match lp pattern: rrkrr<>r<>g<><67>&<26> .>)r<>N<>c3<00>:<00>K<00>|]\}}<02>|<00>|z
<00><01><00>y<00>w)Nr$)<04>.0rurvrUs <20>r&<00> <genexpr>z"analyze_lp_file.<locals>.<genexpr><3E>s"<00><><00><><00>?<3F>$<24>!<21>Q<EFBFBD><15>q<EFBFBD><18>E<EFBFBD>!<21>H<EFBFBD>$<24>?<3F>s<00>F<>r<>rJgH<67><48><EFBFBD><EFBFBD><EFBFBD>z>r<>T<>_rIi<>z)No LP-11 state detected in capture windowzLP-11 voltage r<>z V below spec min z Vz V above spec max zLP-low duration r2z ns below spec min r<>u8LP-11 → LP-low → HS transition sequence not detectedz)No HS bursts detected after LP transition)r r rrr<>rr<>r<>r<>r<>r<>r<>r<>r)r<>r<>r<>r<>rQr<>rDrYrErRr\r<>rlr<><00> LP11_HIGH_V<5F>LP_LOW_V<5F> HS_OSC_STD_Vr<56>r<>r<>r<>rP<00>
percentiler7r<>r<>r<>r<>)$rGr<>r r<>rr rVr<>r<>r<>r<><00>rstd<74> lp11_mask<73> lp_low_mask<73>hs_mask<73> lp11_regionsr<73>r<>rurvr<>r<><00>lp_low_regions<6E>
hs_regions<EFBFBD> last_lp11_end<6E>first_hs_start<72>bridging<6E>s0<73>e0r<30>r<>r<><00> durations<6E>hs_voltsrrUs$ @r&<00>analyze_lp_filer <00>sA<00><><00> <0B><08><08>9<>4<EFBFBD>9<EFBFBD>9<EFBFBD>b<EFBFBD>m<EFBFBD>m<EFBFBD>T<>A<EFBFBD> <0C><18>?<3F><04> <09> <09>{<7B>K<>L<>L<>"#<23>(<28>(<28>*<2A><1F>I<EFBFBD>w<EFBFBD><07><15>g<EFBFBD>,<2C>K<EFBFBD><1C>T<EFBFBD>?<3F>L<EFBFBD>E<EFBFBD>5<EFBFBD><18><12><17><17><15><1E>,<2C>,<2C>.<2E>/<2F>B<EFBFBD><16><12>8<EFBFBD>K<EFBFBD><19>%<25><02>)<29>$<24>u<EFBFBD>U<EFBFBD>1<EFBFBD>X<EFBFBD><EFBFBD>6<>#<23>=<3D>K<EFBFBD><11><12>S<EFBFBD><14><02><19>^<5E> $<24>F<EFBFBD> <17><05>v<EFBFBD> &<26>D<EFBFBD><16><1B>$<24>I<EFBFBD><18>8<EFBFBD>#<23><04>|<7C>(;<3B><<3C>K<EFBFBD><1C>*<2A>+<2B><1C>.<2E>$<24>,<2C>2F<32>G<>G<EFBFBD>,<2C>I<EFBFBD>2<EFBFBD>F<>L<EFBFBD><1B>N<EFBFBD><1B><14><13> <20><15>r<EFBFBD>~<7E>~<7E>$0<> 1<>D<EFBFBD>A<EFBFBD>q<EFBFBD>U<EFBFBD>1<EFBFBD>Q<EFBFBD>Z<EFBFBD> 1<>(3<>37<33>4<EFBFBD>6<EFBFBD>";<3B><=<3D>?<3F><0E> <20> <0F>?<3F>,<2C>?<3F> ?<3F>#<23> E<>q<EFBFBD>J<01><18><1E><16><1F><17>-<2D>k<EFBFBD>q<EFBFBD>I<>N<EFBFBD>-<2D>g<EFBFBD>2<EFBFBD>F<>J<EFBFBD><13><0E>:<3A>%<25>b<EFBFBD>)<29>!<21>,<2C> <0A>#<23>A<EFBFBD><1D>q<EFBFBD>)<29><0E>'5<>V<01>t<EFBFBD>q<EFBFBD>!<21><18>M<EFBFBD>)<29>a<EFBFBD>><3E>C<EFBFBD><06>QS<51> <0B>DT<44>3T<33>.T<><17><01>F<EFBFBD>V<01><08>V<01> <13><1D>a<EFBFBD>[<5B><11>^<5E>X<EFBFBD>b<EFBFBD>\<5C>!<21>_<EFBFBD><02>B<EFBFBD>!&<26><05>b<EFBFBD> <09>E<EFBFBD>"<22>I<EFBFBD>(=<3D><13>'D<>a<EFBFBD>!H<> <1E>"&<26> <1F><1B>:<3A><EFBFBD>K<EFBFBD><1B>O<EFBFBD><1B>O<EFBFBD><11>=G<>H<>T<EFBFBD>Q<EFBFBD><01>e<EFBFBD>A<EFBFBD>h<EFBFBD><15>q<EFBFBD><18>)<29>S<EFBFBD>0<>H<> <09>H<><1F><05>b<EFBFBD>g<EFBFBD>g<EFBFBD>i<EFBFBD>&8<> 9<>1<EFBFBD>=<3D><0F><16>><3E>><3E>*<2A>"E<>$<24>!<21>Q<EFBFBD>5<EFBFBD><11>1<EFBFBD>:<3A>"E<>F<><08><1F> <12>2<EFBFBD>=<3D>=<3D><18>2<EFBFBD>.<2E> /<2F>%<25><02> <0A> <0A>h<EFBFBD>PQ<50>8R<38>2S<32> S<>WX<57> X<>[_<> _<>ab<61>
<EFBFBD><0F>
<12>H<EFBFBD> <17><10><0F><0F>C<>D<> <17> #<23> <19>O<EFBFBD> +<2B> <14>O<EFBFBD>O<EFBFBD>n<EFBFBD>^<5E>C<EFBFBD>,@<40>@R<>Sb<53>Rc<52>ce<63>f<> g<> <19>O<EFBFBD> +<2B> <14>O<EFBFBD>O<EFBFBD>n<EFBFBD>^<5E>C<EFBFBD>,@<40>@R<>Sb<53>Rc<52>ce<63>f<> g<><19>%<25>*<<3C>?P<>*P<><10><0F><0F><1E>1<>#<23>6<>6I<36>J[<5B>\_<>I`<60>`c<> d<>
<EFBFBD> <1F><10><0F><0F>R<>S<><12>a<EFBFBD><17><10><0F><0F>C<>D<> <14>'<27>)<29>%<25>#<23>K<EFBFBD>#<23>$5<>q<EFBFBD>9<>#<23>K<EFBFBD><11>3<>!<21>%<25>j<EFBFBD>,<2C>.<2E>0<>)<29>-<2D>-<2D>1<>&<26> <06><06><>u 2<><32>V<01><>I<01><>#Fs<00> O+<12>'O1<06>?O7<06>O=
<EFBFBD>__main__<5F>datarJr<><00><00>_lp_zERROR z: )<01><)r<>)8<>__doc__rNr<><00>numpyrR<00> dataclassesrr<00>pathlibr<00>typingrr5r6r8r<>r<>r<>r<>r<>r<>r<>r
<00>tuple<6C>ndarrayrYrdrErDrFrr<><00>dictrBr<>r<>r<>r<>r r?<00>sys<79>__file__<5F>parentr<74>rP<00>argv<67>filesr<73>r<>rWr<><00>result<6C>printr><00> Exceptionrv)<01>as0r&<00><module>r s<><00><01><04>" <0B> <09><12>(<28><18><1B><19><0F><18><0F><18><10><1A><12><17> <0B><17><08><16><0F><17><0F><18><11><18> <0C> <0B>= <20>= <20> <0B>= <20>H
P<01>D<EFBFBD>
P<01>U<EFBFBD>2<EFBFBD>:<3A>:<3A>r<EFBFBD>z<EFBFBD>z<EFBFBD>#9<>:<3A>
P<01>
<18>2<EFBFBD>:<3A>:<3A>
<18>b<EFBFBD>j<EFBFBD>j<EFBFBD>
<18>R<EFBFBD>Z<EFBFBD>Z<EFBFBD>
<18>,.<2E>+<1C>B<EFBFBD>J<EFBFBD>J<EFBFBD>+<1C>r<EFBFBD>z<EFBFBD>z<EFBFBD>+<1C>"<22>+<1C>+0<>+<1C>%(<28>+<1C>27<32><04>d<EFBFBD>
<EFBFBD>2C<EFBFBD>+<1C>dA<06>t<EFBFBD>A<06><0E>A<06>H<12>T<EFBFBD><12>d<EFBFBD>5<EFBFBD><13>c<EFBFBD><18>?<3F>D<EFBFBD><13>d<EFBFBD><19>O<EFBFBD>+K<>&L<><12>. <0B>6 <20>6 <20> <0B>6 <20>r U<01>b<EFBFBD>j<EFBFBD>j<EFBFBD> U<01>#<23> U<01>"<22>*<2A>*<2A> U<01>L<01>2<EFBFBD>:<3A>:<3A>L<01>C<EFBFBD>L<01>n<06>$<24>n<06>;<3B>n<06>b <0C>z<EFBFBD><19><0E><13>H<EFBFBD>~<7E>$<24>$<24>v<EFBFBD>-<2D>H<EFBFBD>
<EFBFBD>3<EFBFBD>8<EFBFBD>8<EFBFBD>}<7D>q<EFBFBD><18>"%<25>(<28>(<28>1<EFBFBD>2<EFBFBD>,<2C>/<2F>Q<EFBFBD><14>a<EFBFBD><17>/<2F><05><16>x<EFBFBD>}<7D>}<7D>W<EFBFBD>-<2D>.<2E>r<EFBFBD><01>2<><05> <12> *<2A><01> *<2A><15><11><16><16><1F>(<28><11>+<2B><06>%<25>a<EFBFBD><1F><06> <11>&<26>.<2E>.<2E>"<22> #<23> <11>G<EFBFBD> *<2A><1A><>
0<><30><19> *<2A> <11>F<EFBFBD>1<EFBFBD>6<EFBFBD>6<EFBFBD>(<28>"<22>Q<EFBFBD>C<EFBFBD>(<28> )<29> )<29><> *<2A>s<00>%G<04><G<02>H<05>"G?<05>?H