1
0
mirror of git://f0xx.org/android_cast synced 2026-07-29 04:57:40 +03:00

be sync - preparing for sfu integration, login hopefully fixed

This commit is contained in:
Anton Afanasyeu
2026-06-08 22:09:02 +02:00
parent 1ddb51312c
commit 1e08efb9a4
41 changed files with 1360 additions and 401 deletions

View File

@@ -0,0 +1,18 @@
package com.foxx.androidcast.sfu;
import com.foxx.androidcast.CastConfig;
/**
* Hidden gate for SFU / WebRTC relay experiments (post-alpha).
* Not exposed in release settings while {@link CastConfig#ALPHA_FEATURE_FREEZE} is on.
*/
public final class SfuRelayGate {
/** Compile-time preview; must stay false until owner spec + BE SFU is ready. */
public static final boolean PREVIEW_ENABLED = false;
private SfuRelayGate() {}
public static boolean isAvailable() {
return PREVIEW_ENABLED && !CastConfig.ALPHA_FEATURE_FREEZE;
}
}

View File

@@ -0,0 +1,13 @@
package com.foxx.androidcast.sfu;
import static org.junit.Assert.assertFalse;
import org.junit.Test;
public class SfuRelayGateTest {
@Test
public void previewDisabledByDefault() {
assertFalse(SfuRelayGate.PREVIEW_ENABLED);
assertFalse(SfuRelayGate.isAvailable());
}
}

View File

@@ -453,7 +453,7 @@ endobj
endobj
78 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122520+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122520+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 On-Demand Remote Access \(Reverse Tunnel\) Proposals) /Trapped /False
>>
endobj
@@ -995,7 +995,7 @@ xref
trailer
<<
/ID
[<0bc2f0c306f87efd0a3d63157383ae9d><0bc2f0c306f87efd0a3d63157383ae9d>]
[<451f0f66dc9c89646f9eafccc7317ec7><451f0f66dc9c89646f9eafccc7317ec7>]
% ReportLab generated PDF document -- digest (opensource)
/Info 78 0 R

View File

@@ -215,7 +215,7 @@ endobj
endobj
37 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 Email agent config & 2FA / mobile auth flow) /Trapped /False
>>
endobj
@@ -450,7 +450,7 @@ xref
trailer
<<
/ID
[<f1800686020f8e59d4708315a4e73c6f><f1800686020f8e59d4708315a4e73c6f>]
[<826cf08fa662639dd4eda2d9d3d0062d><826cf08fa662639dd4eda2d9d3d0062d>]
% ReportLab generated PDF document -- digest (opensource)
/Info 37 0 R

View File

@@ -168,7 +168,7 @@ endobj
endobj
29 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 alpha priorities \(2026-06-08 renumber\)) /Trapped /False
>>
endobj
@@ -267,31 +267,31 @@ Gatm:gMWKG&:Ml+bZ!V&$JA]e/q%dnDB_*CC\)3g>/S?V"%sGdS%nCl[M-8jMBddc,Oa`aR5o>^5k(Jl
endobj
48 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3569
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3679
>>
stream
Gatm>>Ar7U(4P_U+M&E*R3o:/h4'0gg8%FJ8aArQlkV9_ck:22W`sU;l<WcUp-#3&=`SWW[R$BTLHHj.rB$7&,l!M@^UB3M]/c=/OHE5`I#VYOX(Zs;DW\-O]TW"6<=S8k-E5'?9roe0$M/e,2+b5u)'/a;2m7b0>V;dZ%F'<'";lqP,lZd59ti^p/A@dHQn\iB2#30KfO=;1E`g6]LBY-0P&j"n#J#<E0qSUu:#.Kg;9U5C*j^[A$$04#ggD/B54qa6q(!5m_$45>ci\G>%]SL;#c4^&SYZWV6hA(>r-*V05N/O1S/O:2e_oV,)*kE?892`N#tp/Q[LZ3ZEkmaI]O[FgM\%M9km&E(f7GK'Csh<LR&6R<4?$Y]0qfPJ$ApX#-&])17oMYnjgkWEq?BKa0H$99KtUt=AL8,NA4"AeMmi7K4)\>IU%:(`)U_<eZ3`(M7*u^%'hal%'4F6QQ7D5Li6tX5[VoRu'-1B"$A';"Ig;SCV\l2mPqaDmHjgc!<HS/NQmJg3S0dt6cA'k+WQ&$r:>i0d]c./V>tYQD-[S?/03hc`;4=&aO^#hsK-eb$!K=3^k<pIqQh6IY?eO5+N`]A\Etdq#$IQkrGTGM[J>:23X5@*kg[=fYnCfD=6V544*ikB)@erC6#>H1?Fh3(3T/]+E66H8R1eCpkc+gn].0DN(.D&!SlOW4$V8Yn7N"S3qUGSCA1=pS"W97H*eeaIT`lY[^>]:fW)6Fk:q0nX*(L-_m7/qnjODBUDpim/i:;oF6B93A(F:1l,3k^*?,2TFM`,l8T:XjHV4?"f<)Q2]f9,L#tGI-$SloQ6N\"p:Ls8$I+oq22<2W`>@o"_Pa+ZlRC()!)W#"e$`@uI$XK^C$FZC,d@buQ5aG95)"2kQuY?]ck.5q\'<6ihWep,mo5l#$Qelk2"R%b^'@h=f.%=cfigNhfgQ`Ubqg4ZCJmMD:]Kqk^36kcZ*p3d@.jhQ^k0H0I?\gJ8@3bLtF`r7gf1e,,W\O#N,RbuA:=DcqUhj7(je\Z980L8!4J:^*ip=R"(5Oq&%o@Z2+/i2.&SJ3AKHNhQr&K,8E1q[t3XTCLP8(6Uk:nb4L,4?+mN\03g#Q8o6g:rR[N5gkuqGJ"2nGe/a2j0<7h(:<XuYBS5lfnQ]Uch9[CBQcI)qoI;28^^nN1e@0XO+R=n,Y^]EW<cB`(?FG1&=o6(nsDDqn]BuUL%7$MYk5l2+2nY!DeZH?E"/CD7OKe]"A'o^dK*u$D)C^o&4.pIi".2t6J"hPq$#1<qU+p/BGJ-q%;q?)%66*7UZj`4F+8[f^"b@r>/oo!#56I&FeuiJ+S1031#I\P:K,2!J%14]%nZ=\Ttl`h#Q4Pd'fLoBC4K-@IQr2_&;-Rt1=JIP:AiL,O+JWW#u^/u<#JdUd_^g,WDsQnQ6`CtX!Dp@8Pk">8aoiDN7sk__b*a2<XA1o&>4WV&E'N15cIj/^f*uN`6'Ze+0']:%eXHRbg6>4&`%+j:mtg$<DhH^PboA\J<9hG(;"#AVE5JUZ1uF(jLeMYU+02TYs(Dsotpu,DAprY)U)O%H6WFRiN&)I^.KWilJYD.!PkdX81tmd7b=JXQc6*'Q=U/fT^`]jI_$S^PfL*F4V.StT%b="(%)ElV4PIdYL6JrL<"d.)+g6klf4CdS2)I8WaZP.>%3Vu4J;6dc1XbO;KskT&eYS+XI^OTCJu8>rMgaMgukoBkVbm<]Nlk\W!@=ED,SA<qaEZ>XUoWi:rbB['P^FqX%B7c?`8Ueei$+(%"M#!=9Tdl3p6IM2h5NQm?G`o1lYi2hYkPWi,9e,`bo=p&15H:iAYog6$Yt`j7J/)gQ$_.UkR3-mS)kH`ZVEAfr.7hHp$.GQn0S&GVe(^G8r%s+l"B,64I[.bqiZ8]Qqr)!AYSGcd[CQ%,tG(Pr;#4-a8l5RY8E!YGPYKmLkNu!/G[.=K-oBUA<B"ksdTUB3N'K#B?lf6m!W<nSJ5@=hjK'eh>\G]^N!ekI1k*Q98?^ec8&Y]2K)(\46YX)]B.'`s*7*Ir_*?If$s9InB&J!MH8MJsFi:!4j0&!h_'&X;V_[.R;Xf!F`;[kV^#R+7QF6_n-gI+QOH<<XtLceA+/F@!AH-lLtFsn@9k8j-1(0j0V);P-1`uY";AA*t!<EoMu\/bBh4ZUIq2ReXMbNIe-WGpi3Jll`'#Y]k00@B]XHG`<G>^ltr/AbWGtnPn)<"`mjUI[l?JANp;sg[J!IgKHN:M2ge\*7Jos!$EosVTV'"/MV1q*EPE9<[fY`AFrdN!i(2huOIKdG.+hLpp-+:AalS&8D%6mGFlTeFjDXL-ZipLA_K:8X]179:DM8h]B\S6O2[QhCL;dNLpE?:B&,@6`@i@/g,:E(-OI=92Shs$N,3!#ARYmBm4nP4TdIMQkKt$J^Mca7W\?LQJS&tPumC>-$G!WM>g8j^F9G6X^P=0NS!`7c[nki4[XB>s:!@Dh!n<Q,[*&iNrYX)4K\_npPR,=6/D[4hMibX.a.&t^mMLI:-%&rtf"TK$ZaL;A#Hu^5C$FM!85u]i83=7![Gm8H*K6,`(gRpa!U,BE$P]#M8"$*5_#0>F,*B$W:lZFo_IP@;^#.MK0!W8ISr^%O^H7_<Y.*g_!qP"KjFL?/aSj&[ls':/(b%CaTg,/&\?F#X,;gZ_hm3R[fA''h6'A2/ob1]Jpahk>5)^k-gAffSmbaU".2k@>'75MG^7r,%;dicZ<dKm]nAuAeeKq\r`WP.0n]XU`emm1i0n*_>?Qi'$WRCaXAQQ+J[S[\p0_]Ydn^onoBmT"Y#;Z'V%^C@0uZR$eTGMs6IFG#^6]VA%rLjTcoqV=Aa7R&Z[rn]<u`XBHI>HLC:ctR<7GpVLu?'qITLTHS1/;$LV7fXJAjts#em6>lRGD0F%(jNZ"HF(YggX5[BUcXBP9tKpMoX_@!6+3[td-pGa5W1Gn+<>?/)K#;j0,oqhdh#t8/\PkKq'Pg$q+VuN3'q>m/aL>&7ecjfKoKC@#l4QEW&8+]WdU4OZDQ]?(!*(n-s':l4]dXD#/u5BF!\jGNgd,X<h_u,=OOh[[.l>:*7`,32,Ah8?kl!;+MtDY>#7VD![DfQ5D2SH/q0;/9RPBYVTbG/NbI14<btFhrHc141[hYB"<`t?/nH6+KJ\E`@=3BL?4[6N:ot=+h)`U$/U&EhZ"4t4E"$/Mr:q;8bqPtPp^.M+/3sl`/&'sAZ^*$5>1VCo[0;K9+CIDe<\KaP3bm*)Cgb0/3XeS80\I!#X'f;1_INTnPp6,f9C;*h.oO=rnh/cq1ZEl7Ce+LX5<hEsFWQ=(:u(R0pA-A(cYMT(ln)KJ8?\(*n9&S]*.!PSih\JiO(cC&QTgXHHjFD'H,qr;Tb(UA38'Il9,<6TG3LA.7B2@+.s-g`L&u:oB8+sOl\c2Xnru>k[C'Fn^r'Ca`0?9Q>6`_1"e%`;8a@5an'V]P+;Jso(B`Gt2Q_^]]T6=8I#>sr9tFUsia24lO(H5+mDP-Q>P=6k?P#eETZ]3=L&@R3fRtoeMbT;2I\bC"O/DpH3WLZTO"Fk_QS;TCjbb%2EMHV8!t$U]Ac~>endstream
Gatm>D/\/g')p`p61hC3ZV>+iHEktI32B9sFHNre`5Q$`!sU@)[^LL_,U`+&mXG$B.8(Fnlcm$Ng6<Lj31Ll3bVPK@'_kPE^J9=+LC"mUW^nFLZ9YFMFYpX!2j60bhl,:t\q*T!:inP"/8T".%dsE9)iAC".baon/DgG'[9Q2=#+>\!#VZg*./^nE)LQr>=`Qfp$"GU1B_hg"M9D''jKb/,/di\\V<<Yh0(OVHB)rArRX%bdie58f4fr4[Us*C!o"mh["Oos#3gd7l$^^>g76[qC8OVBb`[LGK+"U(T)4LJ[-GT+7rXM._pM&QJU6#(5CF0U/N>/d/Jq=`^d-E(C<]T-:X=mT8l6:oIBR!1gGTj!mkS=Uk6s19/aS/#UV?=C4Xe94lZZLNE@;?dKUKk99.LSKKK;lqT%/,7'QC0F_],"#9I_;D%ep1UQKus(j)TXU(70ots6o-ZQ2;;)"(;_;KfXgRIOM<^5inKj!`'bEAL-U@0YJ?A%'QX\`1'^dFcbY4,NqRr=DeWfFB;1s6=](6n-#k!Z-SRGJXV0sr$%-/fPIr)/OR;Qa#6@.YWi7h$<:3Od%^p>R7r[-b:E^XmVIH.8pr_Q%\Au2W3d9qFXlSZZc\g>:PBPT9B%<Jr4$W(9\TVWab4eaO1P\I[,aK;()Yp1[$`acHcaGJ:d$,(Qhkt2R3GA!V,K^iC:7AF\1qp[mcQ4Y@h(_Nm`/CsD3+%$HHU3)[K!W1Ih$$PT[JPOb&YlgP7(`fVBm-bUcX#npBan'_XJ_sX#`LfnSXr.@=D'-$nX0"[;NZ2^ViV3-Lcn\oF7Y>G*>k<4lRufX?/:S1Y&N;Wm2u8(kPi5E*e*ufLKuE6Dc_3pl]`P?U$2msU(`5pjKj9,TlH$^1u7blF0o,s;4;?LSo8P]$m35-:US&E)e"Cdp/2/ZJ9:*/6^2IdE30?3fY%g`^#uURAK?eoV=ms9[hpZE9HQW\n^-/G4`mE+%Z/`TX"<c7&(eG2ZST/hr-1@D?Th/ucgF#I]_V,?o2Ks/jis,,$P@MeShke5Sdr(To'8676)s:P]a7?<%]V>Ori-@>%,qPs8!*aJ]S>e27n_1=7&_!(H#s&ta^1_&a,loVfIY7V+ZJnT\LBL7`He%@e!En7*/$+1>UItnfaE*:<dE$C]4U[-P-<1*G$k_8^)NhaltXnCDYDWA#9F-)2-DUsjL8-bZ*27)(*PlJ@.#hU_u6.R70[==#_D6.%6o\.OL(\?ZJfJ18CMm_/bTTe-!k6OHR8?=C7Wt(n0<ap:qB#]8./pCeb,iY0]g"2cd=lFfE0>iRN4tH=V)+Y_k2^>lg*5]q=-"E5M+g97ugl#?jDek_!>+\6.i(QimBto5bNlpGu-$40ttWJA:NL/i35TS;MXVHMjdEi&9pN9A#RC''[R9lrZD1I>VBM\k&6\VfdZ3lQpZb@#RCM>Ln*.I\j-8-d"9XR!^Wen*Z5eh2uBX-6(!<gZfL$EMraHno43#ks7HmV*^%e>3`_<?kr8D7k8S6"O_t0Gh#%'F$*Yh(.FCJdX(D+R7o+`4<!eHS=K+uq9W;I=d70B(_ib.aU.U#G8HL/7-,Hf2.C.=CDCn*['afm,![*%$!Cd4nlMh1l7Kih8q?d6m3Iq`'G<WauE_u,spGsF2QjP2&W#d0&`X(n!<f`@P@[%OP6JukC7>[@^GCsBgHb8R=(38^*W3TMEjAbbPQt7@.V(FB:A@:tcN>)(*Um8,qT>6e8!6A@(PZHjYpJ+p+O!V4-<l*&s=Sr<9T<C>@:]8t(/f-ohhlBNQRL\2Rf_Pp@o)p``aYrtXaf*hV?*0/&jHe=hUFA7oQ7;mrBGT5*!PR/mM-_(g<aA#q5b\0LObo'kM9U4moO%#Ze5087]t4^5HC^;#m_i*<;T5j,Wp\26W4H96r>@OD[AC'P9W=gnWL^Ok65$@dF^l&c_\m_`k8i)s)Lb,^;(F_eepG4<n!,c;.LL;?m5Ht)ZesG%of!nISk;\_<C=eEdXp3-(g=O+3cUF,UNc7trbV161*+$ff+ibAiKt)d99VsT1[)M<`DJG\7TZ>g8FInB=DtZ6-a&W4N%Pl*JZU[a'_HNg2>m/mT5o/]J?ep+PpY^uRdZ7">OC5R*?4CGm_i,RM:k>JrRq1r[X[80XBi+0H/DtWamY@\4LqqEm1,03=&Ku(\5,KK`TrKEqZ[b^.J2DM]9/Wps"1df#I[ZT)5c[>Z#r(3#$Y.Gfb+q+.mR4RgnPnN#/F1]^o0ZB'&GK:8^J_VXmIf"Oha&X@!<L"(W]l^p"Yc+G07X=4#PBrUhdQ5>E[IY5s_].hR[H0eSMa#eeK3pk4)uShsD1\]):&[EiQZQ/===ZO83X?EQ(%'HXCA-/'gIWV#rTP$2&`/:X=2Y55Eo7lLW+C"N_Opj&-=DnNR+k]Q,cXIKDGVAl!]3T5/H7k&@h;4;Y":fM_@ij]_ak;6crHomICr[*&b=gDgRAFVCt^o^?U:ZipdIUMP;G^.!HUmeo$<?]>cNeg7Ca%%BJCj\X@lA)=G:aq@/GjK=+PFQW,E1ek<RLq&WL6DJ^/L3C$W>!<0tGipY[Lrii;]7+?Ulf6"T4U8ZF@+k\L<Hq1B.1Q&I@QO5`W,F<a/1;n^/-2mR'=eHpMj(;L07kIR6pp$^E)M3@s!!'k)lWb5B,s*(,ANbug=>[AUAf]NrXa7o70=F"4dSUS/BCHr'o2T)75;R@"M`g/^)T,e?p:$Q"o!)&Xcd?,HH]CuOKfJ0Cmac7q/cW7?om=L&ME)H39RsH(YXZ\$h5*,Z2a[V(O\9;PKN#lqJ`4)4Y+'K<p`_+rS$6*-P@'L^\U5as80F+ot8"L0he[-'`/$A%q)^>;F7XnWiMm.pg,`uHm7NDP`qS37dm&hNaY:jW)Q\C`_pLR@;YE$$]P?)>q#%&`Lh6HF)^_P?<H%>4Zkhic1o9,/3emahd.jD4)pnP6t&QuOC&jnh5CH-U\N/WHYk(bLo)@Us1Pmp>icDhP!\9$(sCfNckl=qm5[Db21EF8itDse1iZR/P4@c`>%\)L>\f.;5n'tPAaU-DYjFqtaehlcMF)gAiO5t_FrS"6Km#O4QF&`1,/5QWmrWpAV\In/;pYuu;FlSdKZ5PAU!f+an190Y8^#T4_0o6p`I_SBYWG1N]e+$<-fr#$n>*q@PQ6;LSp]e")Hq#\JK0P5\WWhW\T%a+-jEmr/M8/,e.&9U>DWte_2?on:5_n4a^0sS-(Q<[$g&&N!$WD@mm0C,-nmttq4lYE+iQ+pKSf/@Z])G)^_(]e)22/sn(2WsXLulZ&:d`;2,f@+'65q2$Kj5,pVJU8K;q=)Z?Q"h\!0?]@^A1/hupoeq"##&Rpeo03%HtGf;Z8Mk6q9S[7%9$Zdt#$3\3b<OM+uE&!dke3bff?O)1TJO]9N>A36KeJiuYYqraSNMXV]=F&njE8@Q,4Go*Zb)l^cYnY?,KT.qJ\2NL3]-uO9SHi"k`k7TccHS`tOdb?nqHn.oc,+nBs]Td$M*_gnD/:d;M:BAY`G54V!$3<&9S]th+@r^S2AjHd-.+0*L6LtWE..FUT=*P^0JIk).L\08^eqOJ4%s'<69A(Pl(gsNUBHsfY=sT2ZB25fD1\%Vg0YtqT;sVO%Eo\"uYP9YRAucdpmKLB!QlQdm8R5o9@]t1UPUON`\gl)XjStfEmYBZs+#$`&:]~>endstream
endobj
49 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3765
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3615
>>
stream
Gb!#_>BAQ-&q9SYf^[1RE>k;n6&LniQ_W2RlCL%V-)KjYAi(2.=fb2H+Xg]DVZ6TG8F[m]=/G;SA<N;_YR>h\mXA8S'Thjo')ufo!$C?BH)#mV@(lh6P;J[,%$UM/[hE?);]A:(E$/q(BW<>Y,7V\ar9HPBCDM5.'N+ba%*]GGmN+Q^TL:))U5brLbWXH1!+#N4L7ut5#5IN6g6fTM?%2V[aS?dBrsnWBG"q;Lo]X_4><g!UTe)Pb*LC6Q.?TH>lgf"/DJb.\Gna0*P="m:ZofJ&XVg%qrup)I"'gEK6LCU`>,R(gIhi9\=sf;rS48Y$5O]unc%'`"&G'6gNC)+W!=ND:><=f-LXRAV&[`g<q;UM6c^uP^n7O(%q[!l6V&EiH1(;,5(ftoXAVob7I&d:=UmMer2K#QH?6JI@?Jn_BqN33R#TLc)3@rGeM.#l9h;6qEb4QqG]7M!#Ns`HEGt?G9$BdHuARc"/0d%]8&[V"IQnB_Fr=u'EKq^n)@Jp:c'YeitZscrN.2JgIq;:!NF\ioC8<mEoeYG5aGlgGD%6:Y:'aA\'\gb(mJ5HaAg^G<5NZZe\W!mc>2WW6t_JdfNCZVSe85_;"PQ#SeTr%=Ci8SG/([=:aRnYTaV\JgKW,L,rSfF4TLqiDap'S<-22BUiTu+"O.ai%()CqW5^V]G_7`-Uo9!HM$EX%l7Ha=Z;QLsk;qlL[A"5Q!_V*(OC3l6$+PVRaJ>Kiu<NBj3pa)b>hpIaDfofYEmB#D!+BLcr.lnLS?"Fg@[C(quenc_0dTcdKL3-5!fl,n,(Q"`BRg#=g6R%r"6rXk'*P`%nTb*u:e3_p%=if"&XNLDI&)j=2CM`:#WP.p(KlK_s,1%<dO#/12:I3H,n<u@:ke4/h-;2(U6nB^PNdZ>="5_8L@duPjnQCcQ5iT36BT3Rc&%<D!P]_>UTq\=EVMnqq_BY^OQ!M`5[!M@dE$lam)HqG<AJXYr#d$-\(RT*Ec0GVjc_lig%dKX5:?.TNW7V5X>oQ@O4_6-/YG*5t"LA3=^k6?$&TA[PEke#&TL5FSk"*IasVO[4He;i#kDci*P^-=Yo8r)c_$?KdP%1*OI48#NU[J8RZf<BQi]31V-2d3k>%i3/\mef@(m;3\]PP=;6S;>$?p/E@0(>OsX-7Y<J"huT;O_V!^a&LMDd!K7`$`JdNO%dSWJ2Li4Zh\\u^0=on\[u3T:Hj1%.!^!&H)Zt$O48Jc:mA'![jj%)831PV>b&5H]td-s-6!F1o/UUE'e/;bW(''W$g0>,<mEWXNo5;Rf#mgXD,ZdEc8Y#]T5LhoOM0LKk9b]F5k]NIrVZ"(`.IDf:Xf4+;qf(P,]k^/ltk93q.@T>F>F:k$jb(=2DFS.[/TpA%ul0,<I;V-FT<a73>LFp/]DgoKcmKb0:mOOe6BZRpg&G+/C"H_!is\Q*l/=,f=eEAZ[[uj_KC>,`@&uROh("'TTLNX&=f73GJU'kb..$!.$N\Yf[1i!9Ih8U*R*>c4pU24>\`H+hBLIqNZDslO<6g0mK.2P(ch]PSX14@KZ]CgnZo6'2(pJ9_.ZYY^o*-qBmYM-b8Sa8(E2eBM3heBWd3:#\X&Qk<)":QMI%6Z#=Oc_?&.!A9URnH;di<=Qk(8c81"D)]qWnn[RNk7!M7TQFR`lB/!jD"2!i"l#"4RX\mA/X[G`P"d$$O&j:2h6#u=;/P:jt=,"EpU/MOf+htJ3]DT;V[9g=T?=uhS"GiU9[E#M/\-T)5cWn9fLX&7sO<7\9/Q.7(g0+I5.iI<!CVNAQWLFIs7`%=2CCa0N:.ZohR+#Vq*-<>X^1XMtWZstA2?U@P&nRE:@8J@T8Ya;C'B$HJ3qU=dOh#.Fq@<R-QIp`6=p(#qk+nPPJ4M?>(4#e+H6,9>)r:2&:n=dbfoj;`_B^W*W7kFQg?,;k3N!\q<H_<$h8D&!&r:30!0=W9Jr%^`PGN@OU2cth,gQqE/l*RG,W(S>:[+Pna.c'IMT_FVIoYKK16&PR8/4dHggEGZ@2s%Bb=_[\l^LmL0aI/?R_=ek`[9(FO<:6!kS\k6tOs#JQn52Tm"pUE^>CXkD=PL&YIWfYl="`7]CDW%-]?!0I>EK-lQK]&a7Nm,iqlR]!N%PFTOt!BtVUS1RAR7,LUaI'ACWD;G9's7>Ii1CmVuL3oOrhuB7j,7;!WN)/!$Z.En95MWIl`X-B^N>)0lskCfH7W,(FCeGb.E$IrR]M.+7s!0)]t:!5Yg2H@-'OKZRbsdN=lVZ)=on"*ZbdU]qE\\L_!crdI<j1GNo]+bJ??\4;HZM_JJr2XdT1rG;s^`^+[*7Mtq/O5mfO-I4_n:**%=L^h/T9E(O@T\P0XrYP?$51N%5.C-8rAeV`Sj(-Lbgf>"\7=WY$?AH/KMgrXGXJ0d-Ddu:eVJOd9Z.dZ[L=mSScG]Og@0%MY%DItJK?$(K#hckR$Yqb#1hELkWnK#>pR#$QX2<0VQ^jJCBa!5ZUOFPS8o5E@+rek3YLU3'2>Qi&jAX12r\p1c_Fj)At*NKiH77#p(?>Lg2DFpA1MbS5@lSmV2oc'o66Z"$K2M9QWAl6qg.uQ2cksN016:QetM"^0YDc\eJg"8:'Ps2#2[5fj>;^F1;OkQ%^MM>g23jd_,.HPo^X,ZB=n&eB6O,YH??$4UU-oI\ZEniAAn-[U@:Q%021qf-Ao3:WDo5tHO-(EocgO8<qTm2gH2'$\AROUt*;aK(K6A;3#O@W?u^.,\7TD9`W,O<]4ObaBr0tM^Np8cSaco"Xb>l.?_1qeUIeE't)(>jtI`tO&)+.S3C#o5ob:kV\Q-'us'+9cS]AuCaekq*UeJ9uC*l*7b6(reedYC7I8R"8"9n7eKq8b`Vb6\^-)"d_A[&@49l/*\MJ"'7[CJb%VNW%a6AVoXDKfb?!(RK='u\l9d3ngS7pGN5@4=1T%<l5(t"illct;cVrJ7UZ:,h[Z&a_pt&CBX;c$Kc:\ZYMG4>q.,:d^nYPe_]7!sr1Md&rl9@&hqnM0fHUQ;Kh`3LpTX=]-pG?83)(2tUCS:Waj=U.=$)le#qJ+iG&U"U=dY53Wn&IF_a2kIVb>Ib,u*n@)0-(jfoO8C[SKIL'M5:TfFI'YO)Cg`iN!X?O4uY_`HN+^2K_I-=2kc/nO6]-J,LeJj(e^uMmfiLRniB8cR6p+e^\1g>Me5ms,9]gnYRAZoI`NN`_.H1mQsHcH9^hma@BJe%#:rd$bCe?gjbu;6rA8/oIcsb7u6P54*$#4mjfFsohO^a?)f/>Epo4eLWKQ57JF?7r2%GMq@5j;2[@HhQ-!NbZK3pe8g=[GAdf,"FT.s,nr^X-;umugAmS0S?,Zac!3`BA2r2&?8G9'c0Y15'QhI:DD+0V"lb,5@;N-qt?qHnr))Uu5_GfL/BUUEn<`1,C\.`"?-biERZcNi,/q]5hN12G,nu_)CiG2r#+[s$W5)4q=77f-(S+="IacpQ()q*m1WiA7*/IB$Kpbo#!@hB_c(?PH(57hOd5jiPY$oFk7[Gl;J3V][,jk%:$eh&i4[<9=HD_BGcR^1u8'!34CYRG*/AU2[R/_:U.Z8cor'm^r'QW[&l]*Bk&GCTI2Rfr`dLMK"F^4dLO!*pcHJ#LE9Re#R:HE80D:'g]Tk7&Kp>WaM/]<l&K&lOaE>tD8E*Z:DDiJNR=M01Ia2oo`2eh15*D=q/DrP);P!ILX"aF4>NW9$-Gp801_<Z4htYS/Rl3't`VL3p?'_n6a,$!sl_?iQ%B_=C`1=+d@:8ZE1orWi9RpS.~>endstream
Gb!#_>Ar99&q9SY(`55_e(QYI'U+lYfLhU,:0^A)q]J.+P:MPKa^quH0.m%XcR^MO7#<k54m*qYCiX`4G%ZOchonh0OR\Bprp'[en)nZc5ljE.q$IgAdUE+g9]d_[:6b->h2ojC+mWMb[NoXsNpBI>FW8dEMZ]+fe@d._3K_eTnbibl<!jt<-5eKJOG<k6piQ`b_;Pg\P\aTcS\BeBhn]/6R"$Jiip4Af.)*r\07ueC(HtEBe+;C0S-4sMQSD(MCgC+Q\Mh?.P;&dra'lA6[#.F?QO_c'$'(&>QEE>7h1I2XVJODMA\+9U:LZot.4.j`h.3f&97.Z7-gP>so'r<N]-P<TXj$aE]("2m4BZ]n,[P`AQTQN*?Sb"1:H2'X'(Ujt.FjCsSY!`5'XNHRM8qsQo(/3oP>h7W+B\PrqYU)m##34F'ME-/n-%F/eEqp-%4YA!NN,=1BJd#>JL^UD'GAbH+_$).B'b)diX@+F/`+.rfis`P3C9cEcoc7`-#Z?rWLBN3UtMV]NBjcXe^bJ?Rh1pS@ahc].]NdkM?YeheTXP^r7Oim7u*s4.6/F65IZP-UU!Ej&(*gDD621s8d-^[NOnjABjf#ad`l?m'!P<Nc:J-No>7;#L5KD3Z6e6q&H@9XhFL_3D+W,P-c>1t7SDi#_U[2RlSJu@CH'(gT2Oc0US1=jGk>7`+T9%?g^f2kB<tAs,q?Q.as,^IZ>j>G_^kY&B/G)0S4n+F?I%IA[VrTIca(*THb0TYDF&L78?)&k]Lq\K25VppKFW(&qa!cI[`<I!'@*)afBZXcMFl""5h1op7-ZLR.g!Kc(,h&5a,gY#Z!`Za17idMK60P0s,K&L;K;KK1R:pP(&ef#D5E.`#1Au=LO,"0^;UtJKGu4$6u0XgW/EUj@T8,OF3\][6)T=LVQ&L#aE4?d5)"1tQegFdh3?:f5!S&ahbU&1C?^HSoq0]o-Q&/@nmE&o4r^,AR&'n*otA$0=t\u<AfN.MOesma:\au[PKEkhjT?>X.KfI1%4HssktuCL*XYX\7d!aJ@^p[8%f]d45S;I>*U+\aCCL':L*:t,Tl)qpXNs7]&bAWt\u(O-Nu75#@5an)CiFq$/4*:\nP*mk=q*DA<5[Ks>n#gf[VUZ.ZIjj>LOkqAe-]FXDH89tHU58HOc>tahRipqj!XU#TU5'n:9ho&oQjh1@?Z#;RX#;-a"K4a9>Q3eesK!f<aX!K<=>K2QK]rp%dlP)T"cZ(!g1dje&hAsH2[EuG'Q5rs7N-$\39P>(g\q6XjIuEO]>*MG/t&lC;+KR>huh44i9dK->O)$$TW"='fkD4'Wo6S"7oZ9-g!4d,;>amG@Ea`gGYlIo@ZLie#2LQ?uIaL3T1K3^trJ1?_5-J=O8/Vl/kfk9"/bc&`!aU>MF9,?f*SiDJ#TB(.9FF/]bO8g2MN$qc:S,BnOAKoaje,EXmKON=aQ/'S<P!]m/e(F)Ule`HN'<YW+Ea"n#jGGlTesI/h&p:Z4=^Lf\0eMbaBD&\7FQTSXo$!1XZCpQ<Q?.HAMT93FCfM&e2/&(?.T7NTe2"<e$3;SCT+@C8Bu5C%.P/qeToHYsqAp(B_G_=ko\ede@YjF4V?R!0C6<QJQ)W!qT_!SI#b^nqnMkh7Nhpsb&A$;Q@rfljk;QPkSZCfrK^6a818qK>2<0rBu$Y,SWO%P3;-'*Ju2cX+t33*ROOOoVh0+?jBQE9B%?J]9i,NG_s`@@GG+;E'SE_EdI\,'K=V#^At'Qqb\g<&(,Y3s)aXq<dZOlA+p!7FV"kX%l?`a]_+?*LK;N%T]QP$Vl#U.&G,c:lQZCQa0'c93E9gLVg9Ip&DbuVW`HN9"f53@S%eDq(ZDaJXD<$)1qd]p3R(%<CEKakYc6q(s9$4kUB]-g<'mm[11@pZBl(;bj;c/Hi86`(2eSRmpUD:!ELb+eFTJTY82CB]LZMW849*EP"#3B=^poL4Zn(lHs&Ir6kPb((N?n\4MI3tg_ON4#t*[K>o,HS'#R@`)(sqn9CH:ElL5]t&k&'T`k&$r[#F7Y%HRb23,?]@26`,qRMKk.)pQG@N6\<mhW(?WMWXITOonZV9K=aj$.N)%34s4Lrk2B[X\C!Wi.[`.@`FT-Ub[C!cG*:OWP""I_T)ITd;YKa0VVDt)qs!@Q-VAVb/Z>TM\)b%,O.k9$@_"".;"W"^U9GleY`s]1F90XP^8HT=Pq=3l&j!Bb&c"J<4@%*+(KhEL*&l!qZ5_DP.K!UnIMfPW06!hra',ZZi&=-<h>?o1P\WA&<[!56$T6chWHC,I\$Rd0Lp8EI8#b+F+\?2*kZE+GD0B^8S5dfnm99d^_EQs$\g2In\0p^)F!fd:;b&t;#n[KSeLOAnMY_#<\/WL)r*K6hpl#@_nq[_01G2.?a&i:8!BNkTV>ou>ZMq:A<\S,"b2qi5p_"fW&J+.GZsn=$&8TNIQP;fFBKZ-CNB3tHYTkD?"2'<dCcc&?!qDl6%qI.A;@iH&`>!=?`\YKe;d^e]'/8f^2s5GoWupC?m#Ba$U)4Y'Sm%6P4V($,57<(:WQg7*PYS95GZK]LLG1Q]2(,q!p`k:.?U'#0BnEm^\UninSj&Z8k>cOeKMVH74@U7alUl_kOrkj'a'F![Dkhki#>9Wc`A\"K]Na+O]9lV$pomh&*:<ul^;52;Ha!\O#PY41g,r?gK#7d:T?!>eojC3I@F-LDnB0d076uJ@[MVq&GDe:9;=Cum*t']C&:u"/q%!;af1]9$=DG*B3LnEfV_E]kI:E<`Bc4)/iaql6(9[RUJlm"&O_>JlVWaC8![\TH?06i22l"]^k*gQ"NKZn_;"?lgPW-;Wg):]7FKEj^sZ2s't43M63Ee[XQJG?NCg?NFULcCc/!R)mPMHuRmXedeE6-M'[))4FI7>W>X8eYTB93>N-jnVPrn'U]`U.0-T$c"$LE-/ff]NoB2*d$LY3ZWb"]tNX2UaJ3/sK'P)d(%3'JWT,,,7@3Q;e<:i-$ZEmWcHH7/&:XEG)M(&gCoWf0ENQ@].td#FIV_UXAgBX;c#LPe[_Q[Yo6\J]0^OiP8oM)j^mI'7>Fp4lihhgPVJYQkNjM7k=rmpHfT8Xd?`ZjN2Y?jLP"@-BAPX0#*Saq\NH4^=.ZiGTR4)I8N#CW1sX/kJR"1rU^qjqMF6+#<6WfFgY^jY4_mEDA62,7]E7]pO9(Uie?)]f:&3007,\Hru@]U6>B=7tD^g1=>r3$]D@UjQ=X5Z5d4W9kL`nVjlG5ctP)g1s<;j'9U`gW;ZQ\m*5tGdlcWAikNhfOsU*WGFurqWr;c^L=:QVT8:m`fH&tLpM#Fs_$<]Vo)$NM>XT+3oYP1T>l#4FcI[F9N]Y*V#dN>F0"N/TKjaQ0/GB(9mdbqCls9DT[:*B8lVk`O(4`'[S[[hPkp+<"\628heOD:+=[hO$6klkL=-L&aeV/b'8N9YuMlpii6RBcVl,5FG=-qCX09bX:ZG`0S-tX(O`90e-#m(aSZk`aMfslV^,.kJe><>sZ[`\:o3`r]_^\;G9Btt?BFr\[#%=TDI']lj*LK)QhqUA(E%d+D/3gF'HYhGfKs4>M)mj-e6]kt`+Dd0KYWXBZMWpRjhhqcOd[s,12Pme[.rWCQ]<Kd~>endstream
endobj
50 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2534
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2696
>>
stream
Gau0F>BAQ-&q9SYf^VXIjMn#f!5)n*4NMO%[c8^;XYYB]c3$I#(1W5"8]d<crq<\V9r%hsTHmQI$/4JnYQ/j]&$Q3a^9$[FYQD>)^r8eO/-;"==Nk/,\Ub9TPCH?/6IYH5P?KlSSqA,4L6#nDq+;]'@];bHftKa'ikVbM8-CJm3AE;lW)ED01Df*k#8B^HZi5JTob/ELiU\=EhNs:aR.:)n#*Z5Eq*j$6$X\7-QAlo-9n/7-X)@Y"0G2nuT$1UT^5*KSEV'Us![9g\=gEJjEN<#QqM)s?=5W9;6,[!c.E"Qs`E_B\&,cJ#`:/T+C^Ua1n#fFp)kOBm0O^5B7g/S]75ZObql3MMc0"b4oegK_oIZQpJX)9rNCll=-P(bB=,fQEf0R':D)e,(10dl0E*ZG]Yc/@BC61d@T7_+B^bMLJ.Go'L^j7c?Aaj,M,rQs=bF*__QQKTf2UV@9VBai?R@Y:8)6JP3'XF+L-'g]R6<\b8fGb^1o3Ua[Be\6q%-j,KK2Ga:*!@G\&4kBTNrf+bj(Pd[0]N2:_)XXJ.%KmG\8GZ7jfW`n]6A%X*hbIqKDLVmH=46@nQE8Z4]f%N)`uke.MX0aa5HI#Gf[.)&)fJ_G,]tE?.A9-Y<"I>.Tp@-*LY#lFApZW=8dtIhs,lmO8ZUZhsT[j=<ruGU2YHeIX(R0W304VYkiuORf1g+?Z(%r\PYOd`Xj\H*/b*Z!`-8`Jd5Mjq9'drkDtSsAs4,@oB!qn-gcV`MX-oI2NkXg^;4@O";`1FELGh@h4TdW"A+(GEG)alS$imB:O'Ihi5ngpp[0Ad*KD?Q7-SSG*?>8=(#*RB5GZ<NZq*`QiR)odKi2E,efX3DZ1s>]'2LjDF9'l/@^a\O]DMK_A5*u(bkL&4e(kZt\sSM8b/_sf9Xcc^dkd@(ipLSh5%4&W?o$c=,D]H(["HHrK/gqg,D^`V?2dG3]G<pUlnuVQ3S2Q<oqq2!gpb/m@q5NA0RJ"(I]p5jIT.GEj&JJe25#f.*akGsgIb8$DeiqrY1*U,.Kp)LC'&4:!X'])!ObT$[V>mAG8+/^qPFJ?Kt%jK48?p<I+jH5*C^H0RFA<h@(B7``1]q[6a;$Uc1k3jpgh*CF4Pt-/Q7K,)fX)(,/,+ck]LCNCn6qCK\Bq&H+eC#I>$GF`N6dsL$QUWQ>:_)R7CBH`2nV)__I]lHCJ?op2hVfO6Ntq$mSnKO%-sWG"Hee:iI<G6"V'=q=A3b?JKIPG_$Cd6iR;QHalDHoem%YnAhHaqkp010c[X?=L4U;+`')^8(i$ml`S\?U<<i[A@<'kb`%Xdq'1hO/hc)U:Op.aS:LU3l^O/aY`#@Qq>p"Lc=MO<!InF?%Y4l9T.!s#i&-;nik9Sr<%eY8S<KOG9I18O0$u<&;9cqMZ0BSciuJnE$KY]T:)H'sEuDt`At&d?^!-TL>M(4Bn\d3dP5b,E9Ae?oBPEsLpdgn?fA7V)e\28nLEP2@(j*T;VEZ^S\@nE!DLS9chRe'CL58(T$uNFW/4>Ym_ic6#>Ok:h?fDS&h^f:rQ=@i<%8MDmoODJO(+_oH9qhM<!p(7os$RihAS8U[8@OH6/)W.C?BI;[#kcN#Zu/S:"/Z]<$n#[#OOon[kmsP%Hc;<JLRKC$_5dDrX7@11b1g9+\.)[1hDrICRK-P,V6_,*cL,7](<]cQ`n\_V^=S&5q+OG,e_&%oA,2X+e?3VPnlBYKI+p=qa)@elb[ZB5.($.1r'mKn\L=XNEj#DE\C\<B?':njO*APhf6$Ygok&M.i1>RHQJk`i:-fch.g8Y%kp+*Y_'Bi:R/0;"qH9WKNp=<%8Ss)Z/i=kp-fWrs-5&%g7C$79@\'Sg!g;q?7:3J0%j'X$dTu.,[;PW`?,uAEO#B"MmAb)&)Ks[*-9mo`g=iBtK9bkES$l<#.ihCUaqOI,mem&=$o6OI(ra'kmUi]^acAXTp,e)p^<C:5GlNN3%<sX(EGt$MjW(O"(sPKi%X6s9_qH=FSG`q<<t.LrnFntIcNGRk_3=7!;*h_7=iZSV1O]RG3Z_o2\XnMrQ@^D03RKrB^\Rf:1A\nnK%$['N]de"<-i;P:c!a'YU70:%mR6t=7r9qX[S^?0':99o2b//L.2%6W_P"F'K"!Erl5Hl%UL=5:BLs#TD?X\cC<QVaBHWn>;<nS$#a$@/hK_oNE+AlIIONW[D3+i/9)oMjK`5?J3W:9Q?<INbqH!(-Hmd!55ehU8,h;5esB=W#RZYVhlSdAC,j#7XY<Pt499^6PZ+EhGZ)&^,3XcSS#]?Z8hlH;+tN[LjsQu4Pq!K>6kV+Y+cL("?$rU(doV"Fg$A]5iG;2(l-+nZ5:<oi3VJ.N3[#Tc$E:]3q/Rs7C\80ShGTGZOt)sfb:,f>M88YZ!l!4M2NEjUZKeVp\@b1*Ge(2$RW,aWb@dZ=8286SV3Q'NjnU%Ar$IYc9Id>q.U!Ou#D<b4CR<Wq>t],&i0YKEVThldl*3UOS7DkZ8i`/W\j,U\.P[oU:ou_);<le3#<Q340!l-Kb9(]oJ&T.FHN~>endstream
Gau0F>BAQ-&q9SYf^VXIjMn#eJ61(h6&mU8a%[7PBDN24!?r\F0hj-njNC2GqcT")7EQ05.'Ah;L3C+0Hja>s"_<.D0-gMa56@?N@!H756!uGQ_phAIgq`%4kf8gjdBm1RVhPA88am8:`5cntGbt.)0e-<9R$OW^K@oZD+cp`3s)Oo\[dLXPm(RBZU6b/>L0]G_<3T5ukdb3%ZLQbm>pjP1a+s'!g%l@O"TUaVL^$CY^_>$)&:bF]I##fs_U_e9D=&4,Xm(l6!Hm,?)Fe/eW7r?36(3JC)'nOu/6U!ogtho=IMD?t"k,aOcE_7P?s%S95kX5tZP<E:r!,n%6!NLgdhDK^=4`Q(oI9G.?;IQgBng=]r;^LlHB0-72[mW(LXbUD'^(f4UmL05%%\9oMFV*`K"R0''s4N1M.LThD`eBKP/iAfQA%o3r+*rN8Ql9I>OX$ZhH`jqJ@9&@>G9=0aRm@>D.G@"?Untl;30#oI<Tr4Qu+h[GF7se2+n%=LG(bWBVJQ6k7Fm9bgPR'pOVN^KNJF5k5c)=4oC0:^E7/BED4Q+h=o[i,L(i'I-]2=Z.R\Q\AJiWD+K%\2(Glfr*6Eh7LcmlmX@"o[RpR<F#=!,$@uX5+r$cHW_jY0\m9h5`)U:lrjm`dBkb"kkpAC>di?EL[kkPr5sI775B[*Y:gjV<?+f(UTl<FKb&G2TK&\<g7-r7Xr"9(FN078tln%O8HD86$PkYbl\b\ke1^[s)mYXfI]ecMIVQH8.s"J98/EK*,3t!4N&4kZ\NraZ_;7'R^>hM<dg&R^H'F(X]Od?s7f'0VI9m6oO-tkG5K:k4?n]WK5\W/5k26rocb#CF-XDN&k=m@#8(Nm@fQ"TPX--tGD-$q_rg&$hgm]B1=l@`^Zh7Jr`h(R)/:E`q3iGQO"cZ!^#g8h%fh&qtphcfWo`U5Q!b*U3Uqur!g*at(<kpi2ZIjGk[\\bK.OTAZ=1Ms;0]P'mJ5P8!cp)7?a%9WH3gh`Qi#i[Mg6"hfT*C8,5+Kk'Z]?NMF5G]o8+F!t1s4uPmf\nf)6uOb"m!tMoeLHOH1[TOtfoR]$K@:fo;Ib%$NHHm*IKF<EWaebMY`h7_)fFO?p5M)3a(E&^,Hg=#./:l*YfV8$kp@$CKF<'Q:?eh7<s1),,YV-`B`YK0.a(-E;:P4ngAmA<=,UG-SCLHS_-RcpRXK&IR;_A=G*XN@f^u+;PaUb&q<4$rjE`I%qD2Bc5u$01.U+T9\"+,_bTL2j$*[D:OHS)rfW$p9fAOSR-,<PUJH$*'bAKCEG!!dNXW*^;HZUpaZohEbZm`KH$FX4h..U3Hih;`'iF__mPC/fYltpAUm*j=X*3_`l4=T=VTS[PJ#L)@fI_ap)l#tdGT.b?>rE7G2.;-.Kc>#>-MnqNkC+EpCP\@LC+6%._=nciIVPBQjB-(FtMoG$j(@3NK7(\E^Qa$3>gXqe+/D&SEDTV\^>a!:u!3#X2JRn(V6+"SX@!=$A0)F%_(j"7Ahkf]YCIu-uEo+4Y89>`"?=k/Gi6DU2_B*)A4<K%;%Y/j9(k?MNe]eFbfN+hnl2\:Ik7Z]r_Cn-q`r$L(F7-g>&P'PO-WoYfIa3#?e#H;;\W9[rXm2ioctdI_0sKKi6qf[;mc?.2E9@kR?=oZ00j,6Eq'.FhXRZ'ApnI]P7SCFu?>(dWI=#A94h.O7R,^:30ip^A?#LJE2Vqc[ja^Qhd5hOHLtI,QU!;0[3DZt[=>6i#(@6TjVtb\_QAaRp-&J#c;1Gd*WFMf@"tY#k-IMfl!G-%iG9@CJAS:=UaAsa&O2,3?]jgBa"7#mjBiRiU"'s&&qA3drOOl!%h<S.6D&)1*=l#1kW2dLI<TQ-=.[P$G\qVeLgH!^PRK-Os?ZR&r0k9dsX__ge-H%DY/`]oA/#T7I`%3S/b!mi;>MC>!RVpm:hU9Y*Fj8Vgm%"I%NC\25;-o4r[JJS=->WtR1hU`.\!q0<l/5q/_t9bF4blTLc(SZt$#8a+V4^q!H<=V4i$K8[pYnM#H03e[-$r^!;U<]\eYOHF[ldt]c?RJ6R&A%Nb`h[]V]`"qB]I8cAcBSMB=UZl?#ud9gpO90lHpd\<4h^jP_NK>]ubb/Q!2>0U89?qnht'[P,bm=O]S-Qp[?Dn*^_TUbmIr:0,Npl/6Vi+#Mrc[@Cf0Sap6e<UUNE[K+-@T_-9ZsgOrG>do3as[2mg>E8^)j'R/(Me.7&4UL_Aa"6D(>/W^^#O%%UhSohtf.@UgF)1Ns=&?@+,JX[WtSsS>^q-/`*J$*0<Eia-N@g\KmS1)n2i)Wt[%Kh"Vo3-E?hmfmLC#a)lqddlq.j]p^&9!&!-a$N".&P2Ib7-T-?QicP4d*:>pQa'q&*&n4>fTkq*fO7Ep<=mUbLC67<j[MjDEaiXR%aH^/d.Q3<tu&":UZkV%`)9IG!+>!&5;rqT8&C$\^QOVa.ad1OR-BR\D0s!!L@SZH%P/bLeFD8<!rDaUmhaDh%8r8iq&^?9SAdhbl<Y!P>m5C'ad`!%Hjo+`q^G7e9kghcK5@FP0QP8&tN0EpX`q,PG9cFfa52-8YkA"kM*9:XlLMV*)dDmOtrNh[pp(u9KA+tj7$*Mh)IS^2QLc"0QDjjl/g^;0]<-LQd8Pa&Rpp\92"AGaGW?Kq\tkORR5CQ6Es%cI6\XBYuP+_Zq\5rNFT95R$R',e+j?)U]1Ge-ulp~>endstream
endobj
51 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1967
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2026
>>
stream
Gb!;dD3*C?&H9tY(e&2YV.Hp`DfAT)R/hG&8P1\gW!\f$n8^MY>ATM8qtD*M)iV&<^*K_)gmqTom**cCbVP=)",@s^q7gqM#'9!gH/L-qf>*;4K_Ya?o@B6DT5'5rOa@]gJkQ?b$%3EK[=4PKD!_Cd&Ojp6)M-;q'(t1sKbjKt'41)?$0D^YO[+rAY+ZZDBES6egZ<ikp`#Uo5JENY_)>QIEpmB5Es;/20RpX^MLQtOcmOkX$$4@-]YC@>VRPj2(ZW-L6r1N=k3R4INe\,/r!o_X*?!'-`04=kMF*O:.8@"_dH"!(;JC=iP07[7^.Q*J,k4DiPp_JPEAeKZ3@.:S_Ed*2-1m.)<A'E2'&b,2<$5cSiPaTK^QZWFAjX_6pZ3:2&OkZD3.o?gG_PdDC:ViX1AR8'U@E5hiQ5JFFiQ<VY9?P2BMY]EF$g_[cOd?8$=U>NX3\3h7RrB^H^/rFm^rZ8m2qi2Y"&XX'I*0\:?_dV:b;0Wik%/X[pG<qK^r)s%PL)_@/U]i`h-4!ka/91`1.+PCH;cE0A4=Vk>[U2Vk>;X:/@l0-hFqUb6sa+ME!K?:J1E"L:L]ZEQKg]-WP%0'e#2)q)L(qI+*mR_/b!N$sqI=d9[9;I,:Q6/]2NpTaPJjq+G<&pf2Z]et2aAD[jm%_<!X4\#8*Z]DRn:/e@3WnslQ<16ZMua%dW@f@Bj8dMqGPpAFXWCoC.[g&,c:o(po#SMnoP@ofa*!6jGWqk-@Y1E8*XNXq&Vl[d5#^gqm"ef+H<-J'3sX0K1G]G\tB0.9iG"@J[4Rq^S.$q:f2!m?YA)X#`%!ueX)J2+`;M2+%bpSgT-<"T_PMq?WV$[^o$"sM9cP&Y#bQ3b"uII?;WGL4NIPaau:aU)pN$#l+Bi,9r-0ZaW?ZkH9S`FQSi:]!HCl$ZuY%hMJN,0PD.M")A:MDF#20>ahB?%g1;7(rZ1jVWDV[iCM`f_nj0QGfX#WaZiQ:AEspkL`0';9L]L,4O*;k?@iBW6eK[@G*DElWVhu]32n2o(GWk$)qV`em06/IiVIA+^8jQn'GD]ni9feghRO-;Q$^J6phijg??#U.g,%5\CV/uSPc8fCl<t96Ba]sB9*W;C-Yr5n]K-bqf>#.h+!l[_.L.A#Fbl6+."$"NKnDVAMO1IFKn.k9dUaf\r'(;p3\PV],?U_7BX2PDFTo'_&%;?cIIU/(*hYG*MV-rJJG"L-5Yo-0HB.o\4q[6%Z:bd.J2ETN"B.!;hcsugDrV*Y.<Jh<kI,PQ++AqREB^LKDT&fKZZJ,arD!R?ES\,&LE-%fEnSnW3fW>pbXg<?^^<W/:\29@tM1s^"$b-K'1"7[lorB#OacN\8q%[pW1[%nTD<khQd*CK1rj<I&EZR8pDV/f_*5&eb),BHFj=7@!`2A\>oMf)E_+-,QV+pJI1\jE."./f/;.&EE0VnZ<k8LhX4Luh8rWXU.Y"H>5+bmGg`8>OlLX77klI&SfVgZ*j@;%/C09\kJCN3Vo/&t#sqWqnBH*l7%L(dqHWIP.UXcRD,Uj]C,7)FEU1Z)Nu75E:Om$S8r/%<ceJenCFo!d^^iPK]8A.%_lkVqf%.u7#&shmV_9X)8<#M$'S;Ek65pFBP-e;(=:L_.%9<lT]_`SuIdqgd<J6m?$Odd=>[ilX,k_;'r#`[eOHl\RF'/90<ToXkc-AK0.N5Hc?>FQCUUIq@@;S1IWGhIgh:nnm*"D=Rc98j",O%].3PpC`f;XB;\LY;=B@VA)*(HM(V0(p'mBF+#4-$eWCt=G'<G-/q&%/-YL1g&_>nG*;G9u@#:.OdF\Z5V%kr1D@H<Y1Tc/$Sqm'fj4NZ0\u0>YCRgJ1OulEelFUR=$gOjND"`P*-,G,U1#HuKIbC;ncZ\Tn*E)F$7#DlW+D6Xq<Xh7F\G]nUP$k*oI(_L.@^ii!WNh<U?4fUS@%QMb+;gN7:toTgsHFqug/\'XsfdC\RJ~>endstream
Gb!;dD0)19&H8h>Z/_6qjKq6m]Euok1NFbq8X38;jCUGMLI#mbLj9B$f`(X$6\#aM$(PNe[;;UJp\*_:p=TZRi:/$;s%O<fEWQ+h!<`I^2$agB_.!K+7H[<682V]];[,!1JZR!605;-FlhiRKl.QYR,EA`\2+"(U-gKYr#;$:n'-aBF$k!lBaIoc@CD\`A>tBI"$Mee@E!.BB\3KlR*#>/TnZ!uRR9Tm8?;pI;FD.M6`0;MQrRcpChlG7hR>q]qf!9^CN4Y5corMu"hi"qD]?ggA0\&@X9f8I&=ghD'aaPS8TQ-#%C^qiAS)L9OX4t`a:VK'>a`ZaY!'RLZ4,\F2?pPnUbSh'-U234gH560$BC[4.G?6N0bV"[SP:r9.[&9P=P9:C+c(oGVKi4Xa.1<NrEl9Z'LmiU6((QL'"]?ZY&+!#tSW'D5$1W[uW'96p;cQ+pB=qD6d5Xi_+rAd'raihY"G,)(mL5]drY8#ECWOX&\eEho?:6%5).FN'&XXMPhE,lpmfd"hWXQ*S"W=+enEcD"#=QL)iC$E!eH'Wh9Jf=KV<Qqi>^Aum3$Jn;H@cDGL%Qt'a?HS\W)]g9M)bmbf5qYjT!F8uO/XC$6pOJ.L`G=a:)8!jej.IiAl8_7!\tiVe-!Tt-+bG8>e?(c,b2_%06(tN=@PtWQAa30][l76"q;OZ7>Ho:MP:Q25$4L#XJc`jfD1WBp:VhuB@m\':Zn.V4nPW=cDS<rq0Y;!hd+nV[CArt3f/JOY3rKThFM:%(H68E,CMVC/cO<KDdJL^cc:+P[;+_7!Dd^YFdU2m2-dAoD?.k_kCZ8H^nO*tp)8N7*j2ul=(?N)H84.N?4rtR8VXU[2k/-3i,T6g);7@r2;#[P*mhE\!K?-0'cu5khrbJ.+KC+1?,"Ue44lS91'hll.iChebS("a][-'&k+D;R)V&F2IgQ5sAHEhd"SeGm&53E4*:3l^BY3A8T(524ksK0%EsS+3<)b]ZN:Ap^,#-5@-fJ*g:VpQu,+jD?C5h#U>E-]Om!^HSb>MOE*F]nY54It,0!L06U6]S>A`.84c].e;?D.fkKOrniX_66EmWSOu0&#Lb84Y<;Z0oI7JdY$_7Wc&O]1%3#j^YOE]%84;1n;;U&ImiB3$81?\h\7''_hHtTi4:#e$6Gs;ee&no(4Y+64N_J!A(N$f_uL[+)^+5ZXblHc'-BbAD<r9/&TkrTIRuhOtKf#VTC(cUT9filn0n\7i.qC]-oMf`m(H*22(O8Yd9d[giB8R[j1PA0sou*a:pC8LPC^l%[X.OdA=+aI?&]Y4<m0.m8i1=o6,m#?>(rNC=MZl^$9cB0N6_$IrHK'6`BI+!oYD2:hlVF,[TMAm"DbRU8m>_/Y@beoIG(^J;1;%%O63Ka#EId"hk4;rq=EIJ+g%$*+/*(ls<9i4M1"_)!q,A]?$fFU\AhO9fN.[T7X,K4MSrJfO/p=2V;?1*_)DZY/,aM5S?uD%kXH8L)W*/\nDYY9^5[E+C:`UDuWGbh8rWXU<:W-XLT`0Si#\LliqmT'0I!,5\J9BL\/b*b;5p[Kli[;l0.El!24-Z"P1.pU=%O`Up+u!Ya)n(.]54JW"DnXqJkJ($MjCPY[T8f-l@0XMh-2o$?l]+d'pG1HYWakBkX\e1O4ZWli\TG0/(Y^"u2$<Fs8r>NR%sERObbHL:P&.9o9A9]>rQ"^(2>S/pKFn;";g[-<X&P:GBojnV[T?D+ccWQ&en@52"fZ_@Q"=iTB4/&SKs9qfrXs(UNZ$SNaW52q:FYbM2>m:[d[AqOU'G'>S4&l=*3Mat=$7rE?pgOf(dM4`WFH;-)41f3d2@m4hAd><DgOU[2=FR<sTNLtq$7-09VOa7&]?E;mm_^Rbn42iWE-mq-!<^Q!RMCW)=I"TPW@45CXGcc1HoBCiBgKO..s%fFCe,!FZ>K3S-#.(AoqV;ke.qT4<%WG]-RXbjQ9kOncG)Qrqgho&t9jpTZM7u^VeY#ikW$YF-Vnpa)He(AF"/Kk6YMj2XokkkfGE=Fc~>endstream
endobj
xref
0 52
@@ -344,13 +344,13 @@ xref
0000006519 00000 n
0000006608 00000 n
0000007648 00000 n
0000011309 00000 n
0000015166 00000 n
0000017792 00000 n
0000011419 00000 n
0000015126 00000 n
0000017914 00000 n
trailer
<<
/ID
[<932c07bb3580b032147403333a208980><932c07bb3580b032147403333a208980>]
[<4e8503afa0e5976fd874bce2eee583d9><4e8503afa0e5976fd874bce2eee583d9>]
% ReportLab generated PDF document -- digest (opensource)
/Info 29 0 R
@@ -358,5 +358,5 @@ trailer
/Size 52
>>
startxref
19851
20032
%%EOF

View File

@@ -0,0 +1,238 @@
# BE services & infrastructure — validation map
_Last validated: 2026-06-08. Companion to [INFRA.md](INFRA.md), [REMOTE_ACCESS_IMPL.md](REMOTE_ACCESS_IMPL.md)._
**Documentation index:** [README.md](README.md)
---
## Table of contents
<!-- toc -->
- [Topology](#topology)
- [Service inventory (mobile + console)](#service-inventory-mobile--console)
- [Data paths](#data-paths)
- [Validation status](#validation-status)
- [DNAT chain (WireGuard lab)](#dnat-chain-wireguard-lab)
- [RSSH / RBAC](#rssh--rbac)
- [Planned: SFU relay (Janus-class)](#planned-sfu-relay-janus-class)
- [Agent scripts](#agent-scripts)
- [Open findings → tickets](#open-findings--tickets)
<!-- /toc -->
---
## Topology
```mermaid
flowchart LR
subgraph Internet
MOB["📱 Android app"]
OPS["🖥 Operator browser"]
end
subgraph Router["f0xx.org router"]
RDNAT["UDP 45340 DNAT"]
end
subgraph FE["FE f0xx-monstro · apps.f0xx.org"]
TLS["TLS :443"]
FEDNAT["UDP 45340 DNAT"]
NGXFE["nginx reverse proxy"]
end
subgraph BE["BE Alpine artc0 · :80"]
NGXBE["nginx apps.conf"]
FPM["PHP-FPM"]
DB["MariaDB / SQLite"]
WG["wg0 :45340"]
SSH["sshd bastion :443"]
end
MOB -->|"HTTPS crashes/graphs/heartbeat"| TLS
OPS --> TLS
TLS --> NGXFE --> NGXBE --> FPM --> DB
MOB -->|"UDP WG lab"| RDNAT --> FEDNAT --> WG
MOB -->|"RSSH outbound"| SSH
FPM --> WG
```
| Hop | Host | Role |
|-----|------|------|
| Public DNS | `apps.f0xx.org`, `ra.apps.f0xx.org` | CNAME → FE |
| Router | `f0xx.org` (`134.17.26.161` WAN) | UDP `45340` → FE `10.7.0.10` |
| FE | Gentoo HVM | TLS, HTTP proxy → BE `:80`, UDP DNAT → BE `10.7.16.128` |
| BE | Alpine `10.7.16.128` | PHP consoles, device APIs, `wg0`, RSSH bastion |
---
## Service inventory (mobile + console)
| Service | Public URL / port | Mobile uses | Console uses | Status |
|---------|-------------------|-------------|--------------|--------|
| **Hub** | `https://apps.f0xx.org/app/androidcast_project/` | Indirect (links) | Landing | ✅ OK |
| **Crashes console** | `…/crashes/` | — | Reports, home | ✅ OK |
| **Crash upload** | `…/crashes/api/upload.php` | ✅ gzip JSON | — | ✅ OK |
| **Heartbeat / RA** | `…/crashes/api/heartbeat.php` | ✅ RA poll | — | ✅ OK |
| **Session stats / graphs ingest** | `…/graphs/api/graph_upload.php` | ✅ (when enabled) | — | ✅ OK |
| **Graphs dashboard** | `…/graphs/` | — | Analytics UI | ✅ OK |
| **Tickets** | `…/crashes/?view=tickets` | — | Issue tracking | ✅ OK |
| **Remote access** | `…/crashes/?view=remote_access` | — | WG/RSSH ops | ✅ OK |
| **RBAC admin** | `…/crashes/?view=rbac` | — | Roles / lockouts | ✅ OK |
| **APK builder** | `…/build/` | — | Internal builds | ✅ OK |
| **OTA channel** | `…/v0/ota/channel/stable.json` | ✅ `settings.json` | — | <span style="color:#dc2626">**PENDING**</span> HTTP 400 — not on apps vhost |
| **OTA manifest/APK** | TBD host/path | ✅ | — | <span style="color:#dc2626">**PENDING**</span> align with device `ota.base_url` |
| **Diag API** | `…/crashes/api/diag.php` | Optional | — | ⚠️ 403 at edge (use upload/heartbeat) |
| **WireGuard data** | `ra.apps.f0xx.org:45340/udp` | ✅ lab mode | — | ✅ DNAT chain + BE listen |
| **RSSH bastion** | `ra.apps.f0xx.org:443/tcp` | ✅ alpha mode | Operator SSH | ✅ API connect payload |
---
## Data paths
### Cast session (LAN — alpha scope)
```text
Sender UDP/TCP :41235 ←→ Receiver :41235
Discovery UDP :41234 (+ NSD)
```
No BE required for LAN alpha.
### Telemetry path
```text
Phone → HTTPS → FE → BE PHP
upload.php crash JSON
heartbeat.php session + RA
graph_upload.php session metrics
```
### Remote access control plane
```text
Phone poll → heartbeat.php (type:ra)
Operator → remote_access.php (whitelist, open_session, dashboard)
BE → wg set / rssh session row → connect JSON on next poll
```
---
## Validation status
Run: `examples/crash_reporter/backend/scripts/validate_be_services.sh`
| Check | 2026-06-08 result |
|-------|-------------------|
| Hub / crashes / graphs / build HTTP | ✅ |
| JS syntax (app, graphs, tickets, i18n) | ✅ |
| RBAC API smoke (on BE localhost) | ✅ |
| RA API smoke | ✅ (BE) |
| RSSH API smoke | ✅ `test_rssh_api.sh` |
| OTA public URL | <span style="color:#dc2626">FAIL 400</span> |
| Browser SyntaxError (historical) | ✅ cleared — deployed JS passes `node --check` |
---
## DNAT chain (WireGuard lab)
```mermaid
sequenceDiagram
participant M as Mobile / laptop
participant R as Router f0xx.org
participant F as FE monstro
participant B as BE wg0
M->>R: UDP 45340 (public)
R->>F: DNAT → 10.7.0.10:45340
F->>B: DNAT → 10.7.16.128:45340
B->>B: wg0 decrypt
```
| Script | Host | Persist hook |
|--------|------|--------------|
| `wireguard_router_dnat.sh` | `f0xx.org` `/home/scripts/` | `iodine_warmup_helper.sh apply_rules` |
| `wireguard_fe_dnat.sh` | `f0xx-monstro` | `xen_firewall.sh start/stop` |
| `install_be_remote_access.sh` | `alpine-be` | `wg0` + sudoers |
---
## RSSH / RBAC
| Component | Path | Tune on BE |
|-----------|------|------------|
| RSSH sessions | `sql/migrations/009_rssh_sessions.sql` | MariaDB migrate |
| Provisioner | `src/RsshSessionProvisioner.php` | `config.php``remote_access.rssh` |
| Bastion | `sshd` / stream on `:443` | host keys, port range `1800018999` |
| RBAC API | `api/rbac.php` | `privilege_sets`, lockout clear |
| Cron purge | `scripts/purge_remote_access.php` | hourly crontab |
**Smoke:** `test_rssh_api.sh`, `test_rbac_api.sh`, `ra_e2e_cli.sh`
---
## Planned: SFU relay (Janus-class)
> **Not in alpha.** Gray = future design surface; implementation on branch `feature/sfu-relay`, hidden from users until spec lands.
```mermaid
flowchart TB
classDef future fill:#e5e7eb,stroke:#9ca3af,color:#374151
subgraph Future["SFU path (planned)"]
SFU["Janus / mediasoup SFU<br/>BE :8089 or dedicated"]
SIG["Signaling API<br/>PHP or sidecar"]
TURN["TURN optional"]
end
subgraph Today["Alpha today"]
LAN["LAN UDP/TCP cast"]
RA["RSSH debug"]
end
MOB2["📱 Android"] --> LAN
MOB2 -.->|"post-alpha"| SIG
SIG -.-> SFU
SFU -.-> TURN
OPS2["Operator"] -.-> SIG
class SFU,SIG,TURN future
```
| Piece | Status | Branch / flag |
|-------|--------|---------------|
| `CastConfig.SFU_RELAY_PREVIEW` | Stub `false` | `feature/sfu-relay` |
| `config.php``sfu.enabled` | Stub `false` | BE |
| `api/sfu_health.php` | Returns `disabled` | BE |
| Android `SfuRelayGate` | Hidden dev compile gate | App |
| FE nginx `location /janus/` | Exists for other stack — **do not mix** with androidcast vhost | INFRA §8089 |
| Nginx + UDP ports for WebRTC | <span style="color:#6b7280">Design TBD with owner spec</span> | — |
| Mobile `TRANSPORT_WEBRTC` UI | Frozen (`ALPHA_FEATURE_FREEZE`) | — |
When the owner spec arrives: wire signaling auth to existing session/RBAC, add SFU room lifecycle beside (not replacing) LAN cast, and extend this doc § with concrete ports and URLs.
---
## Agent scripts
| Script | Purpose |
|--------|---------|
| `validate_be_services.sh` | Public reachability + JS syntax |
| `verify_remote_access_prod.sh` | BE WG/RSSH preflight |
| `test_rssh_api.sh` | RSSH connect payload |
| `test_rbac_api.sh` | RBAC panel API |
| `ra_e2e_cli.sh` | Full RA operator+device flow |
| `test_graphs_api.sh` | Graph ingest + dashboard |
---
## Open findings → tickets
| ID | Severity | Topic | Track in |
|----|----------|-------|----------|
| **SVC-OTA** | High | OTA `v0/ota` returns 400 on `apps.f0xx.org` — wire nginx + staging path | **Tickets** dashboard |
| **SVC-DIAG** | Low | `diag.php` 403 at public edge | **Issues** (documented workaround) |
| **SVC-URL** | Medium | Legacy `f0xx.org` crash URL 404 — devices should use `apps.f0xx.org` | **Tickets** + device `settings.json` |
| **SFU-SPEC** | Planning | Owner SFU spec integration | **Issues** (gray / post-alpha) |
File via crashes console → **Tickets** for service/URL/nginx work; **Issues** for infra validation notes and SFU planning.

View File

@@ -0,0 +1,307 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 15 0 R /F4 17 0 R /F5 19 0 R /F6 20 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 45.68504 716.2874 78.58904 727.2874 ] /Subtype /Link /Type /Annot
>>
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 21 0 R /Fit ] /Rect [ 45.68504 705.2874 174.837 716.2874 ] /Subtype /Link /Type /Annot
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 45.68504 694.2874 84.37304 705.2874 ] /Subtype /Link /Type /Annot
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 59.68504 683.8499 176.3925 693.8499 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 59.68504 673.8499 109.7025 683.8499 ] /Subtype /Link /Type /Annot
>>
endobj
9 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 59.68504 663.8499 156.39 673.8499 ] /Subtype /Link /Type /Annot
>>
endobj
10 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 45.68504 653.2874 104.381 664.2874 ] /Subtype /Link /Type /Annot
>>
endobj
11 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 45.68504 642.2874 147.925 653.2874 ] /Subtype /Link /Type /Annot
>>
endobj
12 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 45.68504 631.2874 96.80504 642.2874 ] /Subtype /Link /Type /Annot
>>
endobj
13 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 22 0 R /Fit ] /Rect [ 45.68504 620.2874 164.829 631.2874 ] /Subtype /Link /Type /Annot
>>
endobj
14 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 23 0 R /Fit ] /Rect [ 45.68504 609.2874 91.92504 620.2874 ] /Subtype /Link /Type /Annot
>>
endobj
15 0 obj
<<
/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
16 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 23 0 R /Fit ] /Rect [ 45.68504 598.2874 130.061 609.2874 ] /Subtype /Link /Type /Annot
>>
endobj
17 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
18 0 obj
<<
/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R
14 0 R 16 0 R ] /Contents 40 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 39 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
>> /Type /Page
>>
endobj
19 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
20 0 obj
<<
/BaseFont /ZapfDingbats /Name /F6 /Subtype /Type1 /Type /Font
>>
endobj
21 0 obj
<<
/Contents 41 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 39 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
22 0 obj
<<
/Contents 42 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 39 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
23 0 obj
<<
/Contents 43 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 39 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
24 0 obj
<<
/Outlines 26 0 R /PageMode /UseNone /Pages 39 0 R /Type /Catalog
>>
endobj
25 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (BE services & infrastructure \204 validation map) /Trapped /False
>>
endobj
26 0 obj
<<
/Count 13 /First 27 0 R /Last 38 0 R /Type /Outlines
>>
endobj
27 0 obj
<<
/Dest [ 21 0 R /Fit ] /Next 28 0 R /Parent 26 0 R /Title (Topology)
>>
endobj
28 0 obj
<<
/Dest [ 21 0 R /Fit ] /Next 29 0 R /Parent 26 0 R /Prev 27 0 R /Title (Service inventory \(mobile + console\))
>>
endobj
29 0 obj
<<
/Count 3 /Dest [ 22 0 R /Fit ] /First 30 0 R /Last 32 0 R /Next 33 0 R /Parent 26 0 R
/Prev 28 0 R /Title (Data paths)
>>
endobj
30 0 obj
<<
/Dest [ 22 0 R /Fit ] /Next 31 0 R /Parent 29 0 R /Title (Cast session \(LAN \204 alpha scope\))
>>
endobj
31 0 obj
<<
/Dest [ 22 0 R /Fit ] /Next 32 0 R /Parent 29 0 R /Prev 30 0 R /Title (Telemetry path)
>>
endobj
32 0 obj
<<
/Dest [ 22 0 R /Fit ] /Parent 29 0 R /Prev 31 0 R /Title (Remote access control plane)
>>
endobj
33 0 obj
<<
/Dest [ 22 0 R /Fit ] /Next 34 0 R /Parent 26 0 R /Prev 29 0 R /Title (Validation status)
>>
endobj
34 0 obj
<<
/Dest [ 22 0 R /Fit ] /Next 35 0 R /Parent 26 0 R /Prev 33 0 R /Title (DNAT chain \(WireGuard lab\))
>>
endobj
35 0 obj
<<
/Dest [ 22 0 R /Fit ] /Next 36 0 R /Parent 26 0 R /Prev 34 0 R /Title (RSSH / RBAC)
>>
endobj
36 0 obj
<<
/Dest [ 22 0 R /Fit ] /Next 37 0 R /Parent 26 0 R /Prev 35 0 R /Title (Planned: SFU relay \(Janus-class\))
>>
endobj
37 0 obj
<<
/Dest [ 23 0 R /Fit ] /Next 38 0 R /Parent 26 0 R /Prev 36 0 R /Title (Agent scripts)
>>
endobj
38 0 obj
<<
/Dest [ 23 0 R /Fit ] /Parent 26 0 R /Prev 37 0 R /Title (\376\377\000O\000p\000e\000n\000 \000f\000i\000n\000d\000i\000n\000g\000s\000 !\222\000 \000t\000i\000c\000k\000e\000t\000s)
>>
endobj
39 0 obj
<<
/Count 4 /Kids [ 18 0 R 21 0 R 22 0 R 23 0 R ] /Type /Pages
>>
endobj
40 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 822
>>
stream
Gatm9>u03/'Rf.Ggo%,f_R5qQhHJLu6\quo@kX)sPIPI!@V<,J`4qq.'Xf2&!C`+`[D)>p553iZ$"3Xlp77KLdfd[3!e`nG#3$gCP&m!:8&(,+519+c+*uRn+:&O%,1l7hbB>+U3%KNTK[<4$`mhK4P7/jV:)_G-&?e)5iK-*l"3?=H*/&hDO%(`&[=Q_I#+DSuSoP;/+;\h4Zr(s\C;jUQB`L4qj;Bba'Mu+#(m86f]SD\<85&ilI@d2$'BD;Q7ij">:Z1bED%:LG+Kr=WUJK7ZK:>*N@5M&k"DVq]O2KLi[Ye^UX"S+lGf<(ZCAFV[]4^p]>$c_m(ppZA%WKKVJE?a2KSR2HmV('t>.[am&p@Q"OD@C`0O,INK:mA*lg^Nme\Y?Ed\4iV(34KJ!u*gaJ]=7]XJL+6_G]4+E`C3Ih!4C&O[70B099J;j@=;?8fsI0:bf<D+ho,5*gX<$s7%]33p3s(B==mXV.nc8d;j=m\`g&O("JV$:1_sONF5jl#qpPFNQk4n9+QE"=Sr=UV;]3fgOF<L*D.)D'hn*<AA#C9k`aT-qV1)<@A`JQ&/Pjhb_o$ol'CFj21F\FJ#\pZTO?Bb4@,a9Lb.Q\1Q5`sSXfAg-/h\1QT!fSB;Z<eIt6M^CV%Jd->Isl(/4%#1>lOg3g5P?=gf_Y?M/$_?K;WNr2nr[f"&kBZ-gobO6=eSaHClKIc56!Qor(@r<QnDZU^T-IU7gBfa#/uBY0=[Ft@Eoo$`rgG1RBb:YSJmEcIl5<iR*#7H!as*-O?Wj[t0Y17OoIWh_Cnc#=t2!DK:nWAJoH!$(q<A"bWK~>endstream
endobj
41 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3191
>>
stream
Gb!#^HZ.Xu')t1g@c53,hVCX:olb>e#<QqRm,m9\mcK&\&BL.MX-"^3,U_tf5Pts:lXe6PWM[0ug=YJJ1ZZbU1IGm_M"jX&^P`iBE!F!3!^qXn,7m:?@!2jOg!O.sA33[d"jKk4"a%Wn<4T3j4<t<78GX6Uh9Y$D#^MS,N%Cn]>G2U=&BbW!a!Gg\bqO_cdrd2tZE<jDM3<$5i]fe\'7[DJ4id:>o&8U)CbcQ&eiT7XY&7jHLV_*SBKCRO\/J^`\*t'T5/Z`"]'>@O>IecScp^C$.mG^Q&e&%kLBjbe2W1e0"pq"#P9d`=hO,(e+(M=,b(/p(?i.#+oX/t4Wi0JqIN/UdUE?S]#aI2("7mr&=I(S]R=\Gckgr<Y@f8L%rp+$-"qb*8;V>?kT5ZT9$I&/U0"f784?G#il-Io)n?*H!p<L$#=)Zj,,7FdJ(&3dmk'GkZpE%5AnW]C!c.WZOa:DZ"pogA3lu9?q.rF`nCuTAPB6Tn:n]M`b7jA.V8&`=lVq6RS?0B]$(sO0R,1&6/W3alWkA19#ddbKS_C4p4?IEqqLepVY:a(+-M(6>+n6SuQ$MrG3@;5AsqYX]B&`/`3I=]1_Z%LDXFl7cFb-R-PZ5AU0i3"*H#"6^&9_S#5&?CKp1SO>>(V]WG[>j_,?"a(DI#MD^aJT<N.l2.gdin?kqXN!jm##5\kBEKK-P:Ji2,Q)93rO$L$,`SCF*&q^EE&mE8c]3?3'R?/n'6^ACcmD?@"q<9m);R'HV5;80t5E+o/AO/M&TomcJ7``2PpAW?.*Z/j;TQlr]D3eVIYUX`kFS@f:8VO(n8XS;>0\V]R&]C2#rI'\\IYcS;b_@^f5><5P@I0?:YYb;,VRcTk4S)9N4h6P0kumLk[1U1'ho-'6OB[?'Y7Y*!SNqB#r''01\LZi0_TA:O)dT=jl3p&7)@U,/ig^f_sT#;Y<MnMGb:Cm[8nbNiSP3nVs<?ZjgQo?Ds)SQP-\GE7Tl@hD4<8Np_P74r>/nWX5CPp04d2UP!r*YqHZBkUlR)I+R66>F\B.M8S%Eq[DIT;;?CPGF\oK^1jp:;XXEUqakU)'@(l:0)=^J*86;=^4Rsj,oqOcm#S@#0)p)jXp8%'<3TW'ge4YJ?=D9C^>\QJ5gagXOG(nkAZ)'OQ$kpDE8TJK1m&N(k^oT:6mK==D[4ng5;fLUEHu)=H.;NT/0k]`]*mORc7VmdIs"$kLfe.E=m!+q%1"_InT-k&]u]s,_k1#T$;]\J7;@3@its3%!=cY4[_erqiLXX9;;$;LWDV^&ahaH9b^Joah$?>F128@1#d98D%$i,<a,X=WDpu3SHcQW<D,8CH!40HP,=M;:/GmChfJ".LKR9j9;n5%i9o9h32MnJ:jmW!Eo9!EO\t\2XF6@UbNos;b9iI*Q*mCnN_DETq`I>)A/`u(#,HBG\-%_^E_VCqP^fF(CN2/_S<_C.qUHlUq66N:u!.[\a)VGa64>+XNU?&D\-%A%!aAb];OQFDF*Z.-Q@Y^nfTd3U_;t/9H@QZX,$hZ!c=7lA?J*sg)r0!eO`j)G`V^eRl)\PqLY"U?=)59f^=en_.;a`ugj=KP9S)dKo[Fo0oQ$s[t@WT7WqJ?jWU=X&%nJJZ.MGIc;2+tnGiu+8AZV`aIIt)^)#tr-;9#nE%e\UFGY6]k,WDX\lgYD\T"J9@0qn_7_">Mau*ngn18pnE$[)7O_-/B,38_;\c5=o*Q]`;1O"dr]0[BVu-7[m]7lpi8lgY><2c+M`dP$ul2("57^!omi+Xi'nH?LaDHL#aW8h(t71^'2O>LNQAa5MM*pf8L6;c'Ipq$dWhpA<,WcFhHnA-:[&Mi>6Ql)frZ\1L5_HDVk$*ZQRAj9P8;CW6$M8?0-fhEfZJT<X-2ja\^1VZ`*TG$aW=WZO%ac!Ku;Um1tX.2K`Z"QS/6e@GPHPkEkZB2V5IBAn%7IB'oGl`F*Ymp,n`'F*/6Wf1rM#X=LB=24%Gp&=@X\Xj*dD3,A;;H?7>])"&-g6SShgpXr_5:_]$RJ>B[.(tU,;#,oVNa'(C",Zj4J<)>Up>*ub=XjY;k1E+kV^^@Pu<ig\@NR_N-XA*V26geKP@7]:RKUCqU#aj\t87k@#RWcqMF,hD%dJFd7^58NpMSD>k1>/r(@7(X+c\>UQqnDs=ZotWVF7.`t95;>Y&6:c=T,lM"M=e?"fCRX`@%gqpqe!VTVq?YB`(_I5f_Dqs93O"jGc(?qEY]gG\nEu^^OS6s\\W<E>Vc-!=ZkHdiPS`7BjLPC0_<U,a+!t%p%Ou3R2WmZ!gr]2"p+X\0>_[<6PPoGB;X\p^PFhaJAuWQ?%-R&YPcHGF0WMo_LMcs2NM<96@_ri,Xh>nKD5ic9`&UX#Ca\%kIos$rgMg>JtN&^J3i>30prFT-X^+.Vs8_\(C<e%)hB\%(X6Q)'%P"gr/BlEG+*6Xro2VgeG-9'p=r!k_"JCbr#^mtJGI3)XdXIX\ac*_mi+J,^_$=0fXERp5NAORcZBi^Yh5FL`Z*R"E!QE4f`2d\e+;qDB<BtG@`no47I9i4g"Ql!iDCnNPN^`;kHOMWiXQmTbqZtEAQ%a;S'THA+q3gHrL.aP0kn;>EP\TTO6G3/hYfsg[2Z8CH5QSFg:qeH^?Z$mJ$9]O-H4J:j]YRHg&5d"pFRN!j3dPa`V'&PS)5gP*p$Ur7leQ-!K'Du&LAG[56<s'dbF#&`65Hpc3a,DLg?F?o8(H@*kJCafJ:Psfk<9+"hO3[g5M>WaQ2L0!6eWrnSa3mFO`f?s!OHAdrh7f8$`$W7*BEV6e[kk`TV,k\Ja*3S)CMTA$"]>Ja_)CT4l=L_gTZdSsAMfMM9K3m.-sqE0%kC6ZfZ3KcDGW9cH<8er)F%:";BkeXg%YAM>@5XX>(U]:1Ll8N40pc\mSE$J*j%L.WT!FTVGf@g3]NAfg2OTYc\Qh,6aHG+J"q&UPIt)(OF<:e]it2<V47Xhuf/$DI(g_!1a_.kX`;r5J3a(L#SU3alQK>Q#5;J14G4d:Tr=.IX7=FkWB`;):WkBSnT:?L1)'A;WfMfZZm4WAKMk1D4T"8A\tF,h4PL8bI.f=BYoGVBf?q;BXA!7aaq@=1"BXeC'(c1F(!f=gXTZUp;O#QXuC0L=3X[XA?9#2-jV@aA#)33I^ncP-OEKS1<c<noR]Kf#[*]VC*dQ9?P[P8l'3Ei97prO9oV~>endstream
endobj
42 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3190
>>
stream
Gb!SnD0+Gi')q<+Z.#2fW/XL`i4JHH)*<kBAeJ11Phm5&BHRYffMEh&OKncQDaB6p-&Wu3,WBdGa0d$@GHig:5._p<*IgWZIt%oH3JHEL!CC5+"Cc*m9L$DKl,il1fhgD*VAmGTa)UU$BB!FsXSNNQ-P6tg$Dup!PY`=EE$.+kIm)2##"Z%^iT)3H1B@[k;D>4;6)oXu'5M,D$O32KIP@?ehSYl*1l.o6@/;fUIoT2B`1JVkcdZ3`=qit:@?89Hr`5T)?lDZNW@de`7kGL#kGDsXEX'G2:E"p"f@FcilD>5oaW+XAobA0Um?.m.Kuo4g3aV<q"]37i/F(md="sCoiI[o2!46VgJ&BYkr$=Qu_i)q2i5\^5r=fn<'ZOs/?n!2ep[8d?V2f7%f`+$^GG870ON44.lQSY_R,Ac\S>u%Y5rGe5I]lg[,K1gPO).-V4]W#lC#U%V0W<[qF#?N0X)O;lXTm=_@6916eT<\$9`MZd'[osmFVAtuWAtH.P\V0CLuoRFjpeMa^H])&-nS[qoC3Gcn&+(@V$pXqY%2&/Co%]D5mdh"&jtGPN2OCgbB\`p*[I'bpHI@B5$m$[/Z$a)Db*)fq!Ba%9<^Rk>f+f3_3_E/ZS^d%&JM5hVS-GUlE%4J<TU8$9R*r&!^9tNL=8(+3&_.$/:^HB)nX%te2$RGhTYDm!Z6!N#@EU!_5989Xo_Q3^OK.%MFeK3Ig%cpX$(kAC27Rmm2:n4[p;oW)hQ'm?0Y58C@O"0eJGa\Ri!d8ij"!*"bJB-D$e?:\OX":Y-@Sfm%3/ijWS"&'^_W(YCeND<Pl=.*ZmE/q9^[PGdF07SG[gs*DQApG5\lL1[(1Qqb\(s!*Q&A<%V6!YkcT]9Wm<kjH#cKfnqSJc8eNJb&Y\=K(29hn4p2u261dM$'eQn?ab\9V4+:q].l,oc`IJ!LW>dcj-0Z;I9`&[/?+Fm84"(LVpMPVF]`N,GE!?s*0$4/%`A9Ph"A\S+FQlW\R=0?^WkTJH&LHEZbf$JrXZ%Pj^B:\;o%EMRVc;U$4@9-H-F4$-Mm9:@JOkt@?SJ=KZ)Ln,=]T^rE5D!5m8qbPDDH#\XD1Rca#^Y2@QcLn8)<M4HDB6(hQ4`1L'jt_I11oIKc.F2!^5[/ZNUYYdDZs>TUu:$!l9j=`b.="`qU>i/_]FKNo#Y'4</3&rW!4iLK^N0Vo5T07kI7_lq$_q/">2'#`B%,=Rg@B5Ld,R)H-Z=OUR"B*N%(BBtQcRU]4@XGR:8)K)S]@Vi'#SO14=LIeeBT*bCE2\2U\2SQWm!koFejbpCoT.eX$n\oF-OlQZ^4]67,V"k)rf:*NL^GOO^#1[PGIL0Ma;u98/IkGIZZS:2Kd_1N[otL+EqeV9?:`fO>ihno(W=SSO#T%cPDHFBXfFDK>_7C"jVlt[o-6SqTPWe#gNqMc'7`/.q"5MiaIL(`K*C7l6QG$kE=A-j(X6'-Ii_<`<b'!W9UT/R9@SR8?T7s=JVHri[/bR*ZRD$f7n\nP@G"m;Smo5V1@[95f7g#^E>:nCCl(M3.iAkDOb^%K/cKh:Y?:mo%9P4]rbZGJtbAd_oK'V/uR9i.Ac,7>Pcf:)R)OD'tCHVAnc?(0BVI7AAaFF*/O2G(is't"dS(^(Ao<4':f,)2O"B3p1dH9,UHFQ`$i:"D&?R!!In,S[M5^Fp`@b'5L$8H.O<<<Q?m*^O5k?B1H%hW&VeXAE/(*!^M-QM*mR4sK5F?`*dGerA*b\p%.h)eOBnC2bVC=psf.XG6%_SaX"3[4c$[2BsL'*sJ1'0%Hh&.6r7E)]S73up"jgG)'W;k(R"eMFOUH=h=XJV^/:?DD=m;6Oq[h@M1BV)jSf09_b,gh]=A-6X;tlt2c+3*o&#\*8$V0a3'G!nE2)G9H[m%#Z>9ft9rgML&;L\8-NW(_-/7jS'OQI!uea9_7RRM%1BF!`OPu4$/-l^a+;bk<[0$l@^][j.qf^XGFo:L1LCMc1"3^CINXL(=mINZ-7*]]2Wm>Tc`^pP,=uNFS>S(pcS"bR93e[B\)1aX;.7_DN&\hkE+H5GKGY`P,%7[dEckO4,gA*n`;\a`i=ejpAjO&Ji0QfkDV'cP$P;=0L2T!;31(!DHUCF;m5=f/$/d0Ju'-Zfr6JKH0s=59k2kFmc`L8357sSfpin%4A&<,]R]I,$]3OJ<cPdE=Lo;7SRC*q<S%<o>'K8YRYcE]cP@*cO!1.<FKL);g4q%;-V1)T1CuHL`G8e&+51Sf?g/\>";.7h0X8odfntOk(T9,tOVC"(6l,@UIS<8mf3mYcmr%(_Eg2.$p5\$B]Ck@eaJ7E$Fa7A'W9bg/4P#:nQ9eg_'mI?DlULuUh6bq,lkG_5V6M_j=?)d/QQY$JlPo>)L9&;i/!/F.`kD@Gi3<lR*JKO)nS?Jn!U>JP'Rn0m5g)G>ajBFl[.u:d3Nu\)3N:tP[S=t87#,IfX_,2i"M.GBoRqU;h)Y\hF_L/m&jgAC>4T#c[,t5`hBT/Z[.sZ<<'#3k7V05-ieU)F;La2YULQ6AeLAn<mkfq^jB\f&-[r[#kOj-#ATRIkSF%eA*Uf(1I#CJNLVn7b`JD+fO@*=JMUkBK<0R%k4q??7g0_fp9Ea_I&rK*t3T+8kPoGSTCS928i]EjX?/#[83(@CP$<u&VW@PRJpp5=Mo&FC$gf<.%__\(%^02+j[%Xpt^m4f3CD66DjW1RD!3<WZ`P*XQLj0&8CUI=>'Wo+oedb]l\+EW))ntehGm`h_%Kq^XpqC_,lFMF;WD-XDo=f"hZL"ao#e8$??mt0]mhX?RmEfJu9LSA-#l1%&[S5eS1JcO1_&'1uM@SS=lug#S(`u<rm[B3,QfHW%0$="9T&&7I7^:e"=iHd7T>3t!;E"P%gklrHL(\LU$+ErWLN.*hNO.)4Fj0kpqslGhXk%Y4l#*@;OY0L4qUY6Bd$?rK2;Rg5T(`%7"jm47![d3pjh0:`m_NZ9i0DBLr:D[+mcoi)K$?::1I"!Jhbkoi3?"`kfk_8Tg(O%2p7m^<&RV'GjSCZAeW;r1mGJ))13r#;9ZetN>t`e>#4_)!BtQ'XZZ4OR-;G_?l>P,$*;*(b!e5i6Q=^E((L./g&QY6-aaF(`#h6I,CIH%Y>:0,`Nk*&7mG!-4R<j<1Qe>NEo.u0(K#N=3YS?UG15VhXA5O7u+;=/FRVX/A?h/i5rr>s.VQ0~>endstream
endobj
43 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3117
>>
stream
Gau0FHZ.Xu')t1gJk0lH\ntuk+5OU3:1C+Md`-&a>O3X@K9g1TXXn3U3KM..p_uhk/1GmWpKBC&9lchqiGXI:O9g?4pnteok\Q7`@gP^^R]hgK$7_KOUXB#'O!AAR;Ukp+e3k&9MBn"8V8BsAIn`88U>ZkX&TK-W`(+:L4Brs/74D^jl&q^5q%f?28E^"Y+d95l=aBYehV^(So<Yo>rZ075673'<fH+YkJum=6([XP@<j(V6GXF;sOQCg)L%GWGnA_c=JlhDXlI#+=)oYW"9hMBqPh9la%WS^=j-\9NnSET2!ZZ((rCPpUh^?_JgZ/;L\FVqhm-aX)p3-oSd$?XDAonjYO+1;eK9'XioYD59$dfMG0Pb1&5o#fg947"eII+ND)@\&qnb1)&$/`j0LY+SffJgR9I_@i*57n>KQbraM.cNP_b0Hu=TC7eq?Eh6oie%RZf0`pH5LAf:A2$6?+<.Yc@bl-NG<DG@5(THOh7A4U?Z+0M]Ar\H_,rA%gu!Td3XKK`4!Aa_K]r(#,8[JtKi:C;_Wf+UNW[Fu;p5t<rem8TYR\\C1@D(""F*)$i$L&"ge;<&lqK`3*79l>O7s_%(CqgioH%W%a1b-*B=\^Bk1@bKO\NYG,_H=rIXuB'/4gc.6p7%>j%'_U=j[p/.$cJ(-5$_][T&*=Q-Zq]1/PC^=d!oL.Og1/a%nsas%V+$<n/*3-E*[0n,4k3D^B3LYFoZeX`QEF[fdE36s%d92AHZu.;uX?:4+fPik-YRaEe2V,Um_*F_6i$XL>$7`@#rj'"`B4nh-7c>n@HacRUEi+rouP/SRY\"A+;GoEs#Z+nk:4A@e%]f-LoP.f>a6\!CTKi2bu8SjULXVuFhE$P6Btl0*HgqdM<$rH:'peo&Bihb,j^oh=";*cAjN&nMq/Sig.aO4?<CZYG!O<Wr$\0OUs;Bh1Aa>gEP@>)Ok6=VX"Q>HeG-qWsJ18bH$QZJ<Wl?<ihE?8`#/.M*[T4lWj'^K'KIdf(]%7f+!D3u^$oglVEE'*g.6j^LT](MtqF2d.WkdbR5g!b]McAKs2fCN`<^VbW+l\!(FseR3ljQSk/4G#KFbQ[k=S%@=BfY/Md?EJP,BjT4%V)n6qTlR#Z#_>:JV#5,-S$V0Z$Z1/+qCY+%cS'7W-.foO@_06AW#OQ,%N!eE\*AfGl4h3+Q#_5%3d=qWLNNi?`h93*das3g>O<U;dB^7jI;pM-WD),(EP68VJ,^S)C>\j("C:!=l\GA7X%RE_;i%Vg[*O=Cco[h_3ml2jf!=eeCq*p\!q0@aR]dbHh]AT$Cl3Rj&&(Z7(aM3f17?,#<A5c0poZ>/7f*,SZ:I)m@;)C@_oXX\t@OLL8<!Sq0Sj9%qqHJk"PU?"r%>HNXa^_do$M3NOlYLStSM.^:c;Hmf%cH_S]4ZGJ1(NQ@OAbLB9#;"?-_H-OnRr1c^h>HoN^j$dPm"[JgVMJ@OJtI^^[F[E.3#96U%7[:jUi21O'1kS4Wn2to[#.\'(ZcGiF=UO0Xmj4&?e7f;_UnCTYSXn^aPb(Z6D4.UNF@$YV?W.6,AYPJ5J?.76tem7[[Kb*`C-JdZig7E),*ETTB5_=mR_(T+06E?VA,X8j<"tBVJt$9>54nC+@ng\ha=QmLOjd@r@E1b]"'+D;\A[Y""2.7lUq5#JrYi:4OODAK;#gM`)uXM"!7I5@B.!\5NU\Zf1_,KH2GCNC-=IaE(G$I^UErQ@u^oi8jKW+-OFW2XJ,,b7!pO9`R6cL&VI)MMU_O81m7>[H"V6-RZE]I6/\dfdB\MKPm^>9W3r2S:O'of.EiUJuY4jW(a\+SA_fTNscM1:&G8O4*6+R^7\*AF"#%LN*=AF956&%@8m1M>1_JdkfUn1>7k/o.4EQ./,KB"FT67?D2Q$Mj4Kp1hNSaXcpdmjPUF'sTJ(&EmWGdPoW9tl+F"nlYDX]00G6RZ2IQ[AZn'abPuL_#l+&_I#MU1+=0EQ+"8;OQ6gWKen5E8"cikp6eKU^!H<u8890kLQK2ue#K[f7^>:4lrap*:+*5oP6+=&J`?#LXs-rR\L9aV4rKLLf\Z-<?M_bNgGi_`Mr(*E+G:[A>jpt;FPTaX>0mlj17`"LgqQ0?/]W!(m6+M:K4h?.[-?g:PO(W6jSK#hJ2Hei6$`1S7MGis>XM@I/c&\ir:'*8g:f8Fh5gX?[Qs.4B-6sjLXj7`Sab^gYM\V&RI8T@jTU:TAW\Ff@-:?mQ`ZZXfk1.MOdbWH:jZO+<qp@JI@dgA?A42=dkJ52@330am0<7]fSUF]W+$b4R:?nZUR/lXZ!:dmsZ75YFF)@b%_r;oR:(A*8C2Z_jVQ0UNiIWfB<-HhQhq*q&_S3`9Qru`?OOt90b$/;%-`-/q,joLYiFTWb?-\Z<HWqm(6Ii$a>^#@#^7=B#')1i/aIg+@?iO<f+hiuE,9Rkc;)Rss=C/bXu!D@hMiK3f2>lW>NbijY>MK\j`r:FSbCj//md\W8k\dRl(m(eKQN=1iWgd$,r#;j<Z[Rn!t2QNR.BP,f4/fY!f=G]gL!Y*cCc#JXq/iT!^jh%T8A.`/>>*H_-[iY^IWbIl>bfFAok.+0M'<(.Nb:m7h:?.67E,dbJCd.t!]9q1Z#iYh%gD\3fhM*!d=2#*BU4P(La9;&IBALoU:VG6"rIoHu(u(/hcFH/ZW4gqPiCt<a8AcN/Uc[IJC6Tl1H&].JVq:=Ml9r5AX"VD2GMDNcZU_Z7P;Te@?Ta:t`17pc3Tk5nn>D_o>TA_011c8Ykg"7rmSL8K`H7mTQ)Y$]CnFX'&7sD?d/:.eUqYSVqVq=57(c+1K^\8hN^V1NPlSF@36&G*ZcT/>M4^B"hQV=C^IeWlruVgL:#+gi9tIj^k<]/7Ohfk.g7?jHo'RL0_!r9Od,E/,Q#YQR'.lhq/oeq#iNTP`':g@Y(9.SfCi:?s+O!QqW3(=rWQBFBS&adO+@C:2E0s^+2=XW#>YYOgHu0H=M]dgeagF!XA=8%S?VpHFnl<?0Q^fq"%nC$OT3iXESE(PY-8tN74Zph7V/CD6Ws-JA_ZQX$]],0]61Saf]XI9L%3Vb^&id_rLnDj)9'8!#_"CbP7f11CIl-gI'\%-C3W@1Y5![;^B6<c1oj;E1~>endstream
endobj
xref
0 44
0000000000 65535 f
0000000061 00000 n
0000000146 00000 n
0000000253 00000 n
0000000365 00000 n
0000000513 00000 n
0000000660 00000 n
0000000808 00000 n
0000000956 00000 n
0000001104 00000 n
0000001250 00000 n
0000001398 00000 n
0000001546 00000 n
0000001695 00000 n
0000001843 00000 n
0000001992 00000 n
0000002070 00000 n
0000002218 00000 n
0000002334 00000 n
0000002633 00000 n
0000002739 00000 n
0000002823 00000 n
0000003029 00000 n
0000003235 00000 n
0000003441 00000 n
0000003528 00000 n
0000003851 00000 n
0000003926 00000 n
0000004016 00000 n
0000004149 00000 n
0000004293 00000 n
0000004412 00000 n
0000004521 00000 n
0000004630 00000 n
0000004742 00000 n
0000004865 00000 n
0000004971 00000 n
0000005100 00000 n
0000005208 00000 n
0000005413 00000 n
0000005495 00000 n
0000006408 00000 n
0000009691 00000 n
0000012973 00000 n
trailer
<<
/ID
[<0a21ec630059622c51746ded189e0805><0a21ec630059622c51746ded189e0805>]
% ReportLab generated PDF document -- digest (opensource)
/Info 25 0 R
/Root 24 0 R
/Size 44
>>
startxref
16182
%%EOF

View File

@@ -107,7 +107,7 @@ endobj
endobj
19 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Stream dump \204 developer debug recording \(FR 0.1\)) /Trapped /False
>>
endobj
@@ -220,7 +220,7 @@ xref
trailer
<<
/ID
[<0d244f03f80a81b6b033b4d323b34444><0d244f03f80a81b6b033b4d323b34444>]
[<4e4af14b1218eb9decff8ad3a09189c5><4e4af14b1218eb9decff8ad3a09189c5>]
% ReportLab generated PDF document -- digest (opensource)
/Info 19 0 R

View File

@@ -153,7 +153,7 @@ endobj
endobj
27 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 alpha release & QA) /Trapped /False
>>
endobj
@@ -320,7 +320,7 @@ xref
trailer
<<
/ID
[<f56de612b28393ad9c1197e5e2601682><f56de612b28393ad9c1197e5e2601682>]
[<95139d8fc1ed2da3b56d4980d1b780a5><95139d8fc1ed2da3b56d4980d1b780a5>]
% ReportLab generated PDF document -- digest (opensource)
/Info 27 0 R

View File

@@ -92,7 +92,7 @@ endobj
endobj
17 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212303+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212303+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Alpha soak checklist \(LAN demo\)) /Trapped /False
>>
endobj
@@ -183,7 +183,7 @@ xref
trailer
<<
/ID
[<bbd8ab8f4762cf64769bb7aaada579ad><bbd8ab8f4762cf64769bb7aaada579ad>]
[<3cd389deb41e9e9df8a6a0feadd5b9c6><3cd389deb41e9e9df8a6a0feadd5b9c6>]
% ReportLab generated PDF document -- digest (opensource)
/Info 17 0 R

View File

@@ -214,7 +214,7 @@ endobj
endobj
37 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (AV quality enhancement \204 Q&A session notes) /Trapped /False
>>
endobj
@@ -455,7 +455,7 @@ xref
trailer
<<
/ID
[<bd17772f8f9b3b80a960f225dbde379d><bd17772f8f9b3b80a960f225dbde379d>]
[<d34a90689b8672eb532ad65f537143a4><d34a90689b8672eb532ad65f537143a4>]
% ReportLab generated PDF document -- digest (opensource)
/Info 37 0 R

View File

@@ -92,7 +92,7 @@ endobj
endobj
17 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast build ecosystem) /Trapped /False
>>
endobj
@@ -190,7 +190,7 @@ xref
trailer
<<
/ID
[<a6c94f5fe79a0c13e711e1e90825077b><a6c94f5fe79a0c13e711e1e90825077b>]
[<bb40ad3055cc51e60beb0353d30dc55a><bb40ad3055cc51e60beb0353d30dc55a>]
% ReportLab generated PDF document -- digest (opensource)
/Info 17 0 R

View File

@@ -67,7 +67,7 @@ endobj
endobj
12 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Commercial features \(developer-gated\)) /Trapped /False
>>
endobj
@@ -135,7 +135,7 @@ xref
trailer
<<
/ID
[<0c23c7846cb813e7f6634f931914a505><0c23c7846cb813e7f6634f931914a505>]
[<f5fd48869916cfe6aba8cc565f2d3925><f5fd48869916cfe6aba8cc565f2d3925>]
% ReportLab generated PDF document -- digest (opensource)
/Info 12 0 R

View File

@@ -72,7 +72,7 @@ endobj
endobj
13 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Anonymous crash reporter) /Trapped /False
>>
endobj
@@ -141,7 +141,7 @@ xref
trailer
<<
/ID
[<a454a236c417c49668dff25f892582be><a454a236c417c49668dff25f892582be>]
[<1a0c37f5f70803a73095c49ce8a7e42e><1a0c37f5f70803a73095c49ce8a7e42e>]
% ReportLab generated PDF document -- digest (opensource)
/Info 13 0 R

View File

@@ -2,7 +2,7 @@
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 9 0 R /F5 12 0 R /F6 29 0 R
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 10 0 R /F5 13 0 R /F6 30 0 R
>>
endobj
2 0 obj
@@ -22,159 +22,139 @@ endobj
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 31 0 R /Fit ] /Rect [ 45.68504 716.2874 75.47704 727.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 32 0 R /Fit ] /Rect [ 45.68504 716.2874 75.47704 727.2874 ] /Subtype /Link /Type /Annot
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 31 0 R /Fit ] /Rect [ 45.68504 705.2874 88.37304 716.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 32 0 R /Fit ] /Rect [ 45.68504 705.2874 88.37304 716.2874 ] /Subtype /Link /Type /Annot
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 31 0 R /Fit ] /Rect [ 45.68504 694.2874 161.733 705.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 32 0 R /Fit ] /Rect [ 45.68504 694.2874 161.733 705.2874 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 31 0 R /Fit ] /Rect [ 45.68504 683.2874 120.381 694.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 32 0 R /Fit ] /Rect [ 45.68504 683.2874 120.381 694.2874 ] /Subtype /Link /Type /Annot
>>
endobj
9 0 obj
<<
/BaseFont /Symbol /Name /F4 /Subtype /Type1 /Type /Font
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 59.68504 672.8499 177.6525 682.8499 ] /Subtype /Link /Type /Annot
>>
endobj
10 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 45.68504 672.2874 140.285 683.2874 ] /Subtype /Link /Type /Annot
/BaseFont /Symbol /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
11 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 45.68504 661.2874 152.397 672.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 45.68504 662.2874 140.285 673.2874 ] /Subtype /Link /Type /Annot
>>
endobj
12 0 obj
<<
/BaseFont /ZapfDingbats /Name /F5 /Subtype /Type1 /Type /Font
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 45.68504 651.2874 152.397 662.2874 ] /Subtype /Link /Type /Annot
>>
endobj
13 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 59.68504 650.8499 189.1425 660.8499 ] /Subtype /Link /Type /Annot
/BaseFont /ZapfDingbats /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
14 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 59.68504 640.8499 180.5775 650.8499 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 59.68504 640.8499 189.1425 650.8499 ] /Subtype /Link /Type /Annot
>>
endobj
15 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 45.68504 630.2874 155.277 641.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 59.68504 630.8499 180.5775 640.8499 ] /Subtype /Link /Type /Annot
>>
endobj
16 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 59.68504 619.8499 231.015 629.8499 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 45.68504 620.2874 155.277 631.2874 ] /Subtype /Link /Type /Annot
>>
endobj
17 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 34 0 R /Fit ] /Rect [ 45.68504 609.2874 115.949 620.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 59.68504 609.8499 231.015 619.8499 ] /Subtype /Link /Type /Annot
>>
endobj
18 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 34 0 R /Fit ] /Rect [ 45.68504 598.2874 139.053 609.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 45.68504 599.2874 115.949 610.2874 ] /Subtype /Link /Type /Annot
>>
endobj
19 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 34 0 R /Fit ] /Rect [ 45.68504 587.2874 168.829 598.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 45.68504 588.2874 139.053 599.2874 ] /Subtype /Link /Type /Annot
>>
endobj
20 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 45.68504 576.2874 159.045 587.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 45.68504 577.2874 168.829 588.2874 ] /Subtype /Link /Type /Annot
>>
endobj
21 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 45.68504 565.2874 224.189 576.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 45.68504 566.2874 159.045 577.2874 ] /Subtype /Link /Type /Annot
>>
endobj
22 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 59.68504 554.8499 193.9125 564.8499 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 45.68504 555.2874 224.189 566.2874 ] /Subtype /Link /Type /Annot
>>
endobj
23 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 59.68504 544.8499 143.0625 554.8499 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 59.68504 544.8499 193.9125 554.8499 ] /Subtype /Link /Type /Annot
>>
endobj
24 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 59.68504 534.8499 111.375 544.8499 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 59.68504 534.8499 143.0625 544.8499 ] /Subtype /Link /Type /Annot
>>
endobj
25 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 59.68504 524.8499 175.5675 534.8499 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 36 0 R /Fit ] /Rect [ 59.68504 524.8499 111.375 534.8499 ] /Subtype /Link /Type /Annot
>>
endobj
26 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 59.68504 514.8499 200.565 524.8499 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 59.68504 514.8499 175.5675 524.8499 ] /Subtype /Link /Type /Annot
>>
endobj
27 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 59.68504 504.8499 228.9375 514.8499 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 59.68504 504.8499 200.565 514.8499 ] /Subtype /Link /Type /Annot
>>
endobj
28 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 45.68504 494.2874 73.25304 505.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 59.68504 494.8499 228.9375 504.8499 ] /Subtype /Link /Type /Annot
>>
endobj
29 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F6 /Subtype /Type1 /Type /Font
/Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 45.68504 484.2874 73.25304 495.2874 ] /Subtype /Link /Type /Annot
>>
endobj
30 0 obj
<<
/Annots [ 5 0 R 6 0 R 7 0 R 8 0 R 10 0 R 11 0 R 13 0 R 14 0 R 15 0 R 16 0 R
17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R
27 0 R 28 0 R ] /Contents 63 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 62 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
>> /Type /Page
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F6 /Subtype /Type1 /Type /Font
>>
endobj
31 0 obj
<<
/Contents 64 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 62 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
32 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 33 0 R /Fit ] /Rect [ 62.14104 108.3646 173.725 117.9646 ] /Subtype /Link /Type /Annot
>>
endobj
33 0 obj
<<
/Annots [ 32 0 R ] /Contents 65 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 62 0 R /Resources <<
/Annots [ 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 11 0 R 12 0 R 14 0 R 15 0 R 16 0 R
17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R
27 0 R 28 0 R 29 0 R ] /Contents 65 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
@@ -182,9 +162,9 @@ endobj
>> /Type /Page
>>
endobj
34 0 obj
32 0 obj
<<
/Contents 66 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 62 0 R /Resources <<
/Contents 66 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
@@ -192,19 +172,34 @@ endobj
/Type /Page
>>
endobj
33 0 obj
<<
/Contents 67 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
34 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 35 0 R /Fit ] /Rect [ 62.14104 586.0693 173.725 595.6693 ] /Subtype /Link /Type /Annot
>>
endobj
35 0 obj
<<
/Contents 67 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 62 0 R /Resources <<
/Annots [ 34 0 R ] /Contents 68 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>> /Rotate 0
/Trans <<
>>
/Type /Page
>> /Type /Page
>>
endobj
36 0 obj
<<
/Contents 68 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 62 0 R /Resources <<
/Contents 69 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
@@ -214,261 +209,279 @@ endobj
endobj
37 0 obj
<<
/Outlines 39 0 R /PageMode /UseNone /Pages 62 0 R /Type /Catalog
/Contents 70 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 64 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
38 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 Git flow \(green `master`\)) /Trapped /False
/Outlines 40 0 R /PageMode /UseNone /Pages 64 0 R /Type /Catalog
>>
endobj
39 0 obj
<<
/Count 25 /First 40 0 R /Last 61 0 R /Type /Outlines
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 Git flow \(green `master`\)) /Trapped /False
>>
endobj
40 0 obj
<<
/Dest [ 31 0 R /Fit ] /Next 41 0 R /Parent 39 0 R /Title (1. Goals)
/Count 27 /First 41 0 R /Last 63 0 R /Type /Outlines
>>
endobj
41 0 obj
<<
/Dest [ 31 0 R /Fit ] /Next 42 0 R /Parent 39 0 R /Prev 40 0 R /Title (2. Branches)
/Dest [ 32 0 R /Fit ] /Next 42 0 R /Parent 40 0 R /Title (1. Goals)
>>
endobj
42 0 obj
<<
/Dest [ 31 0 R /Fit ] /Next 43 0 R /Parent 39 0 R /Prev 41 0 R /Title (3. Branch diagram \(steady state\))
/Dest [ 32 0 R /Fit ] /Next 43 0 R /Parent 40 0 R /Prev 41 0 R /Title (2. Branches)
>>
endobj
43 0 obj
<<
/Dest [ 31 0 R /Fit ] /Next 44 0 R /Parent 39 0 R /Prev 42 0 R /Title (4. Daily development)
/Dest [ 32 0 R /Fit ] /Next 44 0 R /Parent 40 0 R /Prev 42 0 R /Title (3. Branch diagram \(steady state\))
>>
endobj
44 0 obj
<<
/Dest [ 33 0 R /Fit ] /Next 45 0 R /Parent 39 0 R /Prev 43 0 R /Title (\376\377\0005\000.\000 \000R\000e\000l\000e\000a\000s\000e\000:\000 \000n\000e\000x\000t\000 !\222\000 \000m\000a\000s\000t\000e\000r)
/Count 1 /Dest [ 32 0 R /Fit ] /First 45 0 R /Last 45 0 R /Next 46 0 R /Parent 40 0 R
/Prev 43 0 R /Title (4. Daily development)
>>
endobj
45 0 obj
<<
/Count 2 /Dest [ 33 0 R /Fit ] /First 46 0 R /Last 47 0 R /Next 48 0 R /Parent 39 0 R
/Prev 44 0 R /Title (6. Hotfixes \204 chosen strategy)
/Dest [ 33 0 R /Fit ] /Parent 44 0 R /Title (4.1 Fast track on next \(alpha sprint\))
>>
endobj
46 0 obj
<<
/Dest [ 33 0 R /Fit ] /Next 47 0 R /Parent 45 0 R /Title (\376\377\000D\000e\000f\000a\000u\000l\000t\000:\000 \000h\000o\000t\000f\000i\000x\000 \000f\000r\000o\000m\000 \000m\000a\000s\000t\000e\000r\000 \000\(\000o\000p\000t\000i\000o\000n\000 \0001\000\)\000 '\023)
/Dest [ 33 0 R /Fit ] /Next 47 0 R /Parent 40 0 R /Prev 44 0 R /Title (\376\377\0005\000.\000 \000R\000e\000l\000e\000a\000s\000e\000:\000 \000n\000e\000x\000t\000 !\222\000 \000m\000a\000s\000t\000e\000r)
>>
endobj
47 0 obj
<<
/Dest [ 33 0 R /Fit ] /Parent 45 0 R /Prev 46 0 R /Title (Exception: fix only on next \(option 2\))
/Count 2 /Dest [ 33 0 R /Fit ] /First 48 0 R /Last 49 0 R /Next 50 0 R /Parent 40 0 R
/Prev 46 0 R /Title (6. Hotfixes \204 chosen strategy)
>>
endobj
48 0 obj
<<
/Count 1 /Dest [ 33 0 R /Fit ] /First 49 0 R /Last 49 0 R /Next 50 0 R /Parent 39 0 R
/Prev 45 0 R /Title (7. Protection rules \(CI + policy\))
/Dest [ 33 0 R /Fit ] /Next 49 0 R /Parent 47 0 R /Title (\376\377\000D\000e\000f\000a\000u\000l\000t\000:\000 \000h\000o\000t\000f\000i\000x\000 \000f\000r\000o\000m\000 \000m\000a\000s\000t\000e\000r\000 \000\(\000o\000p\000t\000i\000o\000n\000 \0001\000\)\000 '\023)
>>
endobj
49 0 obj
<<
/Dest [ 33 0 R /Fit ] /Parent 48 0 R /Title (7.1 How to protect branches \(not local hooks alone\))
/Dest [ 33 0 R /Fit ] /Parent 47 0 R /Prev 48 0 R /Title (Exception: fix only on next \(option 2\))
>>
endobj
50 0 obj
<<
/Dest [ 34 0 R /Fit ] /Next 51 0 R /Parent 39 0 R /Prev 48 0 R /Title (8. Sync cheat sheet)
/Count 1 /Dest [ 35 0 R /Fit ] /First 51 0 R /Last 51 0 R /Next 52 0 R /Parent 40 0 R
/Prev 47 0 R /Title (7. Protection rules \(CI + policy\))
>>
endobj
51 0 obj
<<
/Dest [ 34 0 R /Fit ] /Next 52 0 R /Parent 39 0 R /Prev 50 0 R /Title (9. Agent / Cursor checklist)
/Dest [ 35 0 R /Fit ] /Parent 50 0 R /Title (7.1 How to protect branches \(not local hooks alone\))
>>
endobj
52 0 obj
<<
/Dest [ 34 0 R /Fit ] /Next 53 0 R /Parent 39 0 R /Prev 51 0 R /Title (10. Comparison to classic Git Flow)
/Dest [ 35 0 R /Fit ] /Next 53 0 R /Parent 40 0 R /Prev 50 0 R /Title (8. Sync cheat sheet)
>>
endobj
53 0 obj
<<
/Dest [ 35 0 R /Fit ] /Next 54 0 R /Parent 39 0 R /Prev 52 0 R /Title (11. First-time setup \(maintainer\))
/Dest [ 36 0 R /Fit ] /Next 54 0 R /Parent 40 0 R /Prev 52 0 R /Title (9. Agent / Cursor checklist)
>>
endobj
54 0 obj
<<
/Count 6 /Dest [ 35 0 R /Fit ] /First 55 0 R /Last 60 0 R /Next 61 0 R /Parent 39 0 R
/Prev 53 0 R /Title (12. Private primary + GitHub publish \(dual remote\))
/Dest [ 36 0 R /Fit ] /Next 55 0 R /Parent 40 0 R /Prev 53 0 R /Title (10. Comparison to classic Git Flow)
>>
endobj
55 0 obj
<<
/Dest [ 35 0 R /Fit ] /Next 56 0 R /Parent 54 0 R /Title (12.1 Add GitHub without replacing origin)
/Dest [ 36 0 R /Fit ] /Next 56 0 R /Parent 40 0 R /Prev 54 0 R /Title (11. First-time setup \(maintainer\))
>>
endobj
56 0 obj
<<
/Dest [ 35 0 R /Fit ] /Next 57 0 R /Parent 54 0 R /Prev 55 0 R /Title (12.2 What to push where)
/Count 6 /Dest [ 36 0 R /Fit ] /First 57 0 R /Last 62 0 R /Next 63 0 R /Parent 40 0 R
/Prev 55 0 R /Title (12. Private primary + GitHub publish \(dual remote\))
>>
endobj
57 0 obj
<<
/Dest [ 35 0 R /Fit ] /Next 58 0 R /Parent 54 0 R /Prev 56 0 R /Title (12.3 Daily habit)
/Dest [ 36 0 R /Fit ] /Next 58 0 R /Parent 56 0 R /Title (12.1 Add GitHub without replacing origin)
>>
endobj
58 0 obj
<<
/Dest [ 35 0 R /Fit ] /Next 59 0 R /Parent 54 0 R /Prev 57 0 R /Title (12.4 Where branch protection lives)
/Dest [ 36 0 R /Fit ] /Next 59 0 R /Parent 56 0 R /Prev 57 0 R /Title (12.2 What to push where)
>>
endobj
59 0 obj
<<
/Dest [ 35 0 R /Fit ] /Next 60 0 R /Parent 54 0 R /Prev 58 0 R /Title (12.5 One-way mirror \(optional automation\))
/Dest [ 36 0 R /Fit ] /Next 60 0 R /Parent 56 0 R /Prev 58 0 R /Title (12.3 Daily habit)
>>
endobj
60 0 obj
<<
/Dest [ 35 0 R /Fit ] /Parent 54 0 R /Prev 59 0 R /Title (12.6 Suggested order of operations \(your situation\))
/Dest [ 37 0 R /Fit ] /Next 61 0 R /Parent 56 0 R /Prev 59 0 R /Title (12.4 Where branch protection lives)
>>
endobj
61 0 obj
<<
/Dest [ 35 0 R /Fit ] /Parent 39 0 R /Prev 54 0 R /Title (Related)
/Dest [ 37 0 R /Fit ] /Next 62 0 R /Parent 56 0 R /Prev 60 0 R /Title (12.5 One-way mirror \(optional automation\))
>>
endobj
62 0 obj
<<
/Count 6 /Kids [ 30 0 R 31 0 R 33 0 R 34 0 R 35 0 R 36 0 R ] /Type /Pages
/Dest [ 37 0 R /Fit ] /Parent 56 0 R /Prev 61 0 R /Title (12.6 Suggested order of operations \(your situation\))
>>
endobj
63 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1217
/Dest [ 37 0 R /Fit ] /Parent 40 0 R /Prev 56 0 R /Title (Related)
>>
stream
Gatn&;/`3h&BE]*.HW@ugU\4UOM5kl9m<F+]6?]tQUiJ/*:O[sB:Gdop,A(ph,N43>G8!T!lji$RK&3N$6FZ[n3<rS5,N;0TKmorf0D\96@'07d^/u!k^I*a8<be]KK,!K(X,6o%WCB[oWVC*BoRHBKR%Qh^XF0M^Ye9ri<*ZihS`(bJ-A2iH.4Jk1%XQO"^Sq1]#h@C3S\R`@HmYDgdqn>8o7rr/$oisS4!-+mM>GlehF.EV9o*tUP[[pI(5@=!>id1kg3]3H-N=E&pA4$+//:^_TQk'*;bY@pE''k)gJ=5?atmE8'RO)']oKSin8b\/LnSrfK$@jWeQu.a'<JMOn8bpMi"(E"5<&K!d[t!m(Wtu0g#&Okl*d1]0snA^8_=72.W_lU9V]=&G>U;qnX,[A;D3GXA]1EMH;E"]jN=b5(PFq^UG0,rMf,fUKtqe0/Tk0jX=c5Do#On`=EiY^e*CHqc@c(!k2E8>KFdIW)Qu2p)O-BD^k`Vi9ssB>Rb7#(41;5C?`'<J)g<Dpo,.$7V;7kO<Xh!Q!MRG@<T&LQ-*L(10.ldMld(Tpi[JmK)\d4+`,bW#,5>,k$;Q%TH(J]B%'6SjeZ-2<<I>g4pI@eGWn+*p?;?e++e3Tq"1)5!V?_F(K?$]7-[&O#9S>ko'hjB;B6GGVNhnL?sRtVTCU[[(\eYI<QT(C`'`G-F"1'BTd[\c=9\(%%T`I-L2`-X:oTCT-jK?XJ6/ajlRH4'<S.oc&)/GK_@YLS.>;_S.Vp/#AUdJ5]"h&FQZ1DfUNB:p4]^"@E$T8*PKb=kU[".\Bi%$]YcQj(aD@5`(-(>6i5F(b[!:"OUc.q`b$'<-[VJ_p24'<A5G;@n_P5/t@-[LJ-(hDWU66ft7p@Mq%*dsQ"`:`cI$Md>G:7&TC?9V"1A5n,;rrau'X%%T"PZIOWm2ec>ObBF"Xkr1kqLVlE,m]U^6_r2I4OM8=IW3%i;aKa%MJ-kLm"s;99K%6'8.20oR>[*a4Ao;m7KRQ9R2RlcG\XV,;(m%$anJfrA]d6dCcfck5>f<<PN&9r=*!7%p`$<S.]k,E/q7+^&b05kQ.\J9=CkL@&31[0uN6&AK2)_1#rg&PDJ-797Qc?'ZL`YqZZG5c\l,Bk<33P1)sBa^81c[m_=2uFhX=Ibs?7W*kWGg+$hgSm</M+;J_"E@/FCj?/$iGnK,tgK+_"a8fR?<<B0jtV-g<5~>endstream
endobj
64 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3156
/Count 6 /Kids [ 31 0 R 32 0 R 33 0 R 35 0 R 36 0 R 37 0 R ] /Type /Pages
>>
stream
Gau`Vqet4K')k%D`F+7$\Ck&OW0`bL4g`J2boofnX`k;2jq,lPD6)(%'r@]1p5e+)?Im#W-/T^Q7dSJA%YljXq*%\W5fT.R^=tieRg%$='i5/e<hO,h#)c^\F`I-R9Z\S<>r(QRXFWC(9=ekP3"EQ?TMk&!Oq%jA'Noh?VAeVaTq&ik2,"c)Q\,t*M9gbj*4Bki`aKNE__]3m'D'*.95oNNXWnajQOkm4;3(\'^d5MUjo1A""Y@B]G*6R3]M0Rk7R5S(P@oK(:BM*-d.:(V]OAUTcQGhB`hdeLi`n&'2gk"ZBZqc*<HS/?Y#(;E7+G;!<6LBJ3Cp#B/5<tBS-<Ah/>I,7M($;mWM6-+YW>:Fig%^2bsN[QW_\90B0ODdNp8Kd'D-&2UO#r="MKIf#%=:#2pF#XAt!,'Q!PraXj#ZkZ8>HP,Z^n['&t@k0(YUYBG-S$L2<BSp^cX9XJ*-b=sS:c6;1n)HqJ6>(3)8AN\=tVC.2#^eZ+-L8*]u9/3T><fDr[I=&*:89P&WEqJ=aEZ"dVnnKs4_-iEt_EN;l3+2hRfY?*QRPj_`&A%QK9<W7P=O&#Hi!"Y:7DC4HGqZfih<i<`Rb\-B^((]$++9*ech2t]gBVY1\lMA$8K@KVI]QI7<7OuV`UT[p[nDi[qk5uK=!"<jNe8/\]QlEdF_K5ehB_]J#EBRsCG2n>mK%5L;c2DT6q0=A\j!J_0M-/]?#bG:)=B-iCUm`>s9rM=NmM[PbDLm;qhmYCU:/"A`T_\EZh&55JF,>)>^<VY6#@Go^>"AO,\KY,fktm%H=m<b'd=I*Ul+g?IJN-cr^fJj6=BFb&<mcI(=6[M$d=K)5l+g?N6&:dp>$,&g$EJYlj@.1UN4C)D;b=H/LO^jgC1"`7;e>jdY^gF[-GK-YBTf3l9"0=?8qDUD9LtJe,]-VH=HVNI8A4F#;D9TV<%E#0@8t64p/*%_3]VbaW7FhZ,"Y8i7CbUq7u<9jV#&X:M/`:k,TEl[IJA1Fld61g&?1mZdO]sQ]k=q:^c1\)9:$\MBRNb'I*,q7*FG^&]"WY&]H-bu>3"9\hU!+JP]Q!&gRD?iGg%faVX$*gOe4fsCdU=K^kP;6#`L/c+7&DLFN)DOc6*<nbgGZeV<R+m\sp^ue=esK%\lP`n:8FX),%m'!W*HfnRglP4RRi&IIrD&IuC!9a$8j?+$+4'-4cQB(?*5R#[S@LVk3d=EEksiYW!E>?SL<Q.*fSf_l[^@SUHV@]?JUF%\HjfVKI&s*C1o>YcB0o&mJlVUf6>iJQ3E\n16=ViHVd2C<$YR0^5@n:lZ"*J"qafL-?%E9=_su?W!TMi)_:Q^p\!.D=%AYVua>(G$lW!&e)/aa`A+VJQt,KaY<@)*7b_ek,R3r_n'TI![D->8FYbDNYY0dBi\f6,=job8$8(t<Gsh=;uN(6LA"W_rs`\edJGopH`,I1h2l/G[SG3I3V7X%7(+@06f'e/n!+hH3sIe=I5g;<58hf?+h&f+1YEAQ/q$`iYe*\(/I\]03R8/ejo,H<"0-L^=O95_V$A3Gq'i8?+FjFNZ7p6\K=epFNku5bI$,dE,"#+$NK=m8)bu(S_NsG>Ql/1UT_<R/l&A"]9I8!Y#-"6<AC5.BdES9'^oX2(?mFKH*?&G7k`U_KZE.Ju'r,a]+_i;hm!:q?0eO[$FrMTVp0:'$r`0PpeGkrO$S!p%J"<2j1+Q`*m(AJ!0:Rn/+oSoIb$doI@R^*g]ceH3PV3d>,e2n]X9><b,*KWJ)pddJ`PaYD_T570kcgu!c$8_IAmC]Yg3/Wl7o0,2,bA9I%OXBmXD[jBB\`mGaI\GSHF,EjkKA6/`"_+hSqG^HZbg[%3Nk0G\N5[SQ?%c&AOVS]lS.G\f0j,jV4t"n#)J\i7VRH()d,j&GM1'L41V8dR?F.IVB>5-9h?rig\[V`Oll8F46jGoqP&p[p->`[M"6F7A)O7eYX:&U<IVNus&mPbUCYp14/.*Y9t"A!SZ+6ba2[2P01B;\\oiX>WhD/KqcVe442`P[2u77Mc)UN"S3+n#YqQ>i%.&bmA(]ap5m.l4*@'^%0tTD_UhXUtOam6BZ'D8-EQjqK1nn7j;U<Q'[Me)^Q*:M:jP!&r[peu?R)DhaA80pZn\!QlV=8R5e_6Qeo*nA,#U=Q\#10C;#8]`Q@d2\TX3N:g_dccWJ8UYS,L8tsEE7\h+rqg/>sOr$n/,;!%qq3VPKNMb_gtHA*"Hs'Df9;'_sQX8ZN**jU353bH;!f$Vq^dFihq9-U]<T+bsHZ)+7(Z'I`_&VlCrK07<DA1EhQHt@"D6j?%4GO#S'FgXt'AKCOpus\&CV":1*tqkqd@m$mb$Dm=Vl,J&5J[_-JNk0Y4.BL[%j<A=peq<.aQ?3u9<p,$&;f<p&gB9;:a8@M,Xsl\J:]<M+Ku/Ko-`0JY4;$*L5mm>Bd\M#4@VM(%]<r:#B[MjMlgS]$jsUg\R.e6UW4iFA5tMSk=j\C#b#HR:sEXdBBZor`&gl!C]*l!7%J^1PgmD+K=_c>#:d6WR6iM8_[KG>m;<_7H+Wm2%M/:(NlK?:9+,Djl[IQm3@>Y_9)`)`b1:8V0H=J5:=0")q-m[F>)W[7l#oWb0!6>7Q^W!:Y7-/\S(oSef9DFl5Z]lWc9a+jI6W3?EO%$To,0LpR!o>:/[n"#jO?hJu7;l3FQ^M>K\(gh)nWV"Q#K^PfI84AdBXl%Qps_a8YK@Yeq2p%34g/`1rs\93&=/k!ji_?-*)bNtB^XI+K5O<).Q]+F=Vf[-H6?T'9T6GZTh.Pk?:@R-%SZ6MNd%Io<F]"EWJ\DJ`)b:/?A\q5q'4\3#`eV@?0C/h"AS_e"gY&2,>c':tnEpH>\e51j=LQC+Xi@K:adEBD79qPk>?ieAlind;`<S*PReG\I!MnYhBq^l*2O8$cerWVdF)rbtElLX-fB71QsV%enEJgh2imADr^?YbWmiXi)JRlYHnGrA'DM>:Le66,_F$Z)./\tXfF>Jqi>G.1pr?EklN>^QgI`-BM3+80i5?OPi(-egt36E!@jlhsp=:]TBc=^kt8Ttu*&U?S^[f,(i-/.JGP9Rcrol?[euOXdPV]Y-UOo*W)_@"4/=*HQFeDp`s#7B!W*Hgcf/PY"^;l*Ra^gW0)QL.;qNf(FtC_:`0=_\%%~>endstream
endobj
65 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3270
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1256
>>
stream
Gau`VlZ:f='*%C7@],d_aK@sqi)@@XFRlZrFCN:qeRgjC5JSHgZ).e\Uhjg!pV5U;02[*'P2"c&@[k:;fGA^\]:]?XrmR%&j#OoE+e5'<TFi#95Vj)VL*,AjGjtAkb:!fuYoH\"^`HSb;%4K-*IM`MY`+1llN+/i'q8nU%-Km3=T.<N,gVZb</#8u4]?nNjtdp\;`KHh?V$uF/SKG2H]GF6q7L$/@q77@KmP%R=r#J%Uq5c[7PP:7Qbt$kn)kIKN.GFsMaS7XaJ>fpG:Jla.Fa\%$Vn$f[</Xm84gCE`/A$?BY4aVJ'@'`T>_3c4G7t!i/r_Ua+IlX3.3d^r#4cUAB[2k[i[m5'ds\]l%:lUeV)AN6>6ds"VL;P.EQT20aF&>$oDps0Mb;,I32o6`=XY7'NM$RLdE(qqp\"W8sPr?(/DIE,8D^Il#XSZV?:]GFa.:c@AD[A@0,aZpL4Drpk&`&F&NSTl'TkFchHGLkYO`5R^9c.FTjr4SUBVsW-S3W$`FT`S3J\e6/Ro8<OMQ[V,9&1OA;iMnSVcU\lo6*U*X80Kg(2\<RDK^rAje;`N/@U&(SqoYh$5r$S@[l%!^u1]`?LJU#3o@pMbRs@./#=Z_k"^<A9a/r?j7iaa%sGiLV:!mfb7oBLX^kL`dIFWlr%[`!%'\^rJn?F"^Y8CQaPKbbA#B?.aIsMgo#f$r>':`\DP<Bh/bTYq&Df::2@cYf*.I_72J*!5_^q)&kg0AIO8.OG/'94f=\O!If]Yi#]@UU7mJLL@RX5:+eUoH1=;:7d3l`TXSQ?b>K'Bhp2lc"lAem7^Y&5jU%N'pi$T7+UuFI3'+&V3_N-o8$s!Po!q.\3'+p876R%qANGNAZ5,kVBXVTm^+NPBB(%k+QZQQ>a+B&N2te"DLuA\S<&JiEr)/Jl6AGoe:f)sMO[OodS1:;Hioo&8;`J$Q(('jT0T5OXdXkR!=0F5P1C"QZXOGFK:o.u,Fl41%Qg'sKkt)eZ.q?Iq4G!Tp0i,DJJBIB3l))AebYTM'W#&m$)'*U9GLL^Lbo5fJrbboJ@V#[(_m8/u#iu6=>1sU/=>ikrS\ILR.^Y8'YCHLmUKi8X_OoG`LMngqo.Y+#S)o"u$e42gRj1!3-%\XAB93?1XS<F,b85/Lq<292F'K9)41\k..nqAp_2e")A&JP3P?85<6L[[oG_GlE69l0ikt6OheS3dnaXlT8]+7fc=`=>#:$C#d:LTPCd26XK\0P9G+=^>:.MfD=@6V`ULXSD5H?EEf^/H.a?n-K/5hff:Dj]4L"@*O\]jFNc:*se9.(GFUT4Tnq+I`-MU[BVXMJaFmNk*?/4nf(XX[(^Zhka_Vi>?F_PH#H<E);[%Z\\0N6IYf\bE'@j_3Jm(DZ\A3<W>7([Z_E_ouA58Apk`mUR3\[GdI%*`gX4KachujW>,thT;.nUS<cVWS!j-PMEpBqQ9DW\T.-G!lF.Qo<Ipt$o&sam`Ce3fZpqBM^i)TNYb3]p+R,VO.FX_Y-,--I#_SgrDZa2!St'?JNRLnQjL%N&UAK@paY==7?@_]1ra6#%P!D(nKe26_UB%d>`:l[Tng6-Z!7uQ3>ItUQd&[kSm;H?9JSP:kALr$V_>/)&%/p\g9:@S@kG2<19p<#,6T\ucLsU1S,k.SsSP9i'OTW_hn<`NIl3"GR924;S1>?rrA<Y^B,fWf=c4VAkO'ijdBe41D77k-*5)8qFCID,X?&=0\>:d(hfkD.s@d$5k&\'!T:;pVH>QS-Y=t<3.FqJb=3DQ@cRC9o;!aZ3(]Kh["gOCX.8`X15ZJ$k7*AsBNO',rc;ip[=3bfioB2plt&;t=+W8bKC8'i^_SiqE+=_'84W/#8Pp],V0Vq;r=?4%2,`XBZV(-$u_6Ne&k;0JtD]D9ua&5,TT&+ECe.T(dB+s.)[qN=oBWNqjm1\lmf"JS!9=+)G(1fYUs5:=3E+iL_qKueF!bdRN$`90qV)%C'm^+0rhTE"NF\+fCN$?"-QT"Vj$HT)iH)>ZN/lMTbYARalt?[_g(7Gm%_0$eL9&#OFI/.l4p@^s)*;!b@@MXl@cab%Dl@H7KFe]EOPg$RV=HP:n[7).a%.<Z=Fr=.'@8fFYR3)B=Zg/n95jk?.I`&&4ZZ3IH(4i&O?FOK#'+[dmfG&.-a5S`jWV$T"aqP"SK6aZhK/3#u3<C`L^*(AC8'=<bd("FJ=WIpoU/Ceo/YtZu-1u[Kr:)d<VpHTl?Z(R/V"&Znq#aZ8*1(m)1OW`s=M39E&5kT=ZajRW#CH-[B9=FGml('*A9e8lRL.5q0YW=aUB/,fDJo$!(i`J-QVcL-;R]SP_(qFe^o"&%W)B)b`<(iD7NKlTsR;UZ7Tam#E1k@Nr2pRlGXBJJfQOshCh#s&#[;gMKMA7lcYcg\Q6k"[&A^n>!HG5jbp7k!b(P.%kMbW3OG)P$A6N/_VU?,D78M?7YqIQQJ^Xn3oL&Zu="XZq9%G*NdM5iY3Q4Be',7cq*,qdntS6k\mLu]6Eo&4o,6$M2NV$?m))\rY6?(%E#d:"'T[&1)oNZ0LVkpK=/c*7HfFXRWm$jXd7haSNm'o'p#gqK9:G2=o'jCim)[BS'HCN$J?AiAWF/e\[+n$Nk0Z6mt0P/H0kP+=PeU:/hsJ+pOYCJ=,do5MqM,*m(I]?K7R.61ds1)OK`Fk6j\nYBY#C"T"U$Z5@6*9q%!Q1btSd=p6==8`*MJ`76q0K#g.^3P3YjhOfTHfo13Leg4i-3J#Y]t3`;?.5&eR[6=e>T1DUHiS_;B`Odr!JJ@e!IW#pa9J\U]na&$LR.D&Bh%A;K"'a5i/NgaC2kt54;>]E@AJVj_o4u$r4/r2(@F2e3\EiY(%#r,fnd.LXO;*%YA2#?1i-CDi.=0Zg7T/Qe>CtWCk<K9*DN7Yjlf#DZfs!%mENKX`Xk%bp7'CKe;"q)&)od9#@68%II0+0jf-s+Y4]DFB06kM#=VE>XPMAZUT3U+&IU=foHV\a213i([@U;DlLV@!_qNYeW5h7:Q`hT&U!1p\C,V]QI_A[J..6dZ>^];q-<beRlK[alET&!k:DXj:5^X`?-Z#/)Ij&2lqOp2([eJc!>Cjt][]$]s9Kj@[Q6SS+BGk3lpiK,M.R`bA?1N@-_TYC$E0Uo0S3%BiE&pGif'Zmjq/0;G;f4&A?Wud`*;)PEPmfY)H/1-qKnT48EuD@B`9s8"DUEc-@\'l:BYU.l.8t*MnXf@5o?e@#VO!mHB;"6QEsAYkf+M5-DCB*SkD!HU3B(KdBl8HRrrEt41tM~>endstream
Gatn&;/`3h&BE]*.HW@ugU\4U,^o!eRs(W#]6?]tQUiJ/*:O+cB:Gdop,<Q2DQ7U*WDM)6!TX"#b^[V7"V3i)s.<<lT+e`);kQ<"/"e$l+aJSkak;/VFBBD9&l"c166+%a$YCPGLUZe>qQa028VMKoKR*)%IjZ-/I^defg]u!5]nn]@!u:kCAl6$n`6=j-'QahKlT3KeAoPYIKn]!9E$m6=9!s5h,hGB4E":")\6I=J>/@#OPsPutpEh5FoDVAQ#@&7cTL44fk<5^e9%]&#p^!EZ']+<)r6Sg+]CWOj>gGdNm_T'"5&4K&KeT-l(=2[fBMf+S`6P?I<Y\S=Y;<ScpS:=+=A8X,gnVQt+J:@qOStLH5%LSJ%c&4i^.Zs$iQG,L>!]0'.r&i>!)YDIgCO"?S+_u>]lcs*:@ZcOW#(D(e0hKHfC/)r1Ogsf_;6eTP3898W,e+YcaI44\)LE-7rY=Iao/h2+b<iMb:R8a8X-6S0`)=[n`^$1"TPCB+`(4A!sOC(=8u=mF:G8<.gRB;bGO3*)D,aj'Ud#].l*(!hn&s(g<g<<-TkM=n6%U'3.)]pl;GZb_qA/5&V5:?=7TL]?.2@QA[$Y&%'(-=ec@*W*TgI5DoIUCV7hJTkLt-r/i&f"eQ@[=VMk%oE7p`DK9t43>X.Y/5HYN(Sl=$h?:!b+Wj,`6'fu-J4/nE=a%CJJi4E#jUqLp,Q<hW\2dbN>BN-G0XV6b>3mY'%`E:.SG]$^hbmk5L6]X[G>$37Rb"EG$=rZCrWh%iaS&JlkD+``+>GkR?Jm0p_&.[NV9r"u[cNme=fOEePDH^nAmRYcK.?+^*bXO[74T[RBC:KQ6on*QD95]\^qr)=N_j:I#1u8@c,J[Q!@kXpb";kS%"r1'VD#<uT[$+29BYslD]CM+\fJQOJ'$%F4()DYe^0O(S/hp]:nmsD1=c5n_*SW,-*Um1A+XMj./DGeoUb,P]Of0^S.dJ(=QFV+)2H_^pR1DLh/?u>mZl#l=+gc1gnOEfjL&n419Bf>bFEE*G6\4))]l;jI]=qRn-^X@eI:2F?%24A4[CFlY/Q>V`om.OOU3UNS`Od3EWX`[:_aX(Ik./8V+[ZQK3%NpfM/%_3Tt7R@X',s%g=@9c3nak#@j*abbe[m2&No[L043_U-mEb8n:;D&kfjM!,=WuuEV8a8o$@6mgCI1n]/e6NkcMjWGGFdKA.@F7kO9b97VDn4.ot+WNRAU2iI'3,!VNJ"+`CV>Zi:&i!mmb~>endstream
endobj
66 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4234
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3230
>>
stream
Gb"/*D/\/u')q<+1!'#k]<s'$lGZ54E,nO@6eZTu(I\A`JebhZ(fO[n93N+X++LW/,Xq5l=t(n>+0In=PMEX8H$8><frYE)ritP!rY"/^,P9kr@+k$/"3WQ,Gl.P[+4!-C=aA3,a=nXXK:ul804Pg1afj]"1-^]%d:`Zc2`>Kq*^J&[+e^Uerlc2ibi-WsqTlh'@*mJ=B3a%O@9dX#d`Ia%@$=jRTp4/H8F+'1W$JJ<YY)$+O!P9DWr^57s7n8,Bc,1T\+e7)BgQ9Y!NUmMe5&FI?bk\LGl1lAo.0gn:1[Qq@t^jN%I]e6ZIG+>Fip>n'KAgYB`\t<E19QT!IoP@l6dmE`Ot@Ig[lg/S]e5XgDH<1;[!,Qo$1YaGA+K5_F87m*T;H:I0,;1jO]K5$L&bq&C,egP;"30LiuQ$mQf%JU-^kb.7(3Y3.FbNS>/[mN'/VPasEURK(CorraqGB?:'&Y51A>r;Vcc"2:#;(8S]p(pDB^EL$'JW\^pu3T$S2S(?bHPCj3!qNjnmo93=n]7'k_OX\XS\'%&aArI3QZI<^"HKlrb8=I,8'-a9IHgl6Yg@_5.Jj9,!Fe:nOBam(!'E5d7Y\hEQYb4ss!#WU,7&GUlh$/E3[!(<<o[P,X=%bmh7?W_B!:r5/Q1>kseC6)=?1^`UliUH8K_HDg%8E_gf"+7\5),$8@mAH2H,p(C1'OOcep"aM8SE!/Nhn3mM4jChl&6hlQf"\iKZ"Pku^.$qlLEqdfSZR;;i:#\K6sl6p)!uR;-0uM_[kJ>o#j4%S`h-Z`2f'd&fhOjuB=Nm#quubcn;Y'3Jc,uVIQB8Sp<`I`W;jO1l-/X)/]iML9>s[NGeb+A0bEfsL[qd^qq`l2@uL'S87F%jn>Z25e>;^:T8F0#81G_N8U[h)HV&U@'pK6j9X[)b()EOcL[qe3]#mS'F8:oIrj??8f/!UUcc!n@Nf;rDP4?)j_-fA\m(>W4YFpd#ig)$B.VCs!h(X>rs5<VT8VLfMZ&%/OW&6NE,j=WZEbgZaefo)Y!6"N+)l24'O+sK%8$CQ#p9)]d=*Fg&'nh-+&R,VjjO`16/d0%9.!T-]8KJ/Y@T&M.@$r1OM-10a&ZaMTR&2\u1h?1^S^q`i$>2;N.lCKFD(?+#faO_s#j@4X;;*L*C"?rBHGYhuEJf7n4i;S3A(\!on.gq:##J_In0:P7q/2dc*PG.lq<*^0,>IBd+RN[F674qF0ZV)9NDm#8]LN8S_5=];aW+U+RO(an$Nof03^]sl_AC&-Ma<hgRo,>\$134LQRIn7@TY>dU:+9774/1TAuWQI,_C=_mSHdM-,P&I@Og1WNo3Fe6)#TtS>KAApneULLC1kVVO1nu,fHOr\$Fug\!"VNY0cJd8.stmqJ?Vl^`38rnm6?/\/!Zm-]Me3Mu3kJ,4/H5&&(gU[*3@iaDsB.R^']D&J<8g6-./_70s#B@EWs5V71cCS7eRqQ6ab;MZcWtoFWSoI6-6LhUHE+o+qT\F@3,#3G0kMk?s0?k%V]lq;gNB,:n]7PcHtE*"o+)<\8EnR,qM`]C5cIY9UUFSrP)"+o/f\$\60/Sl".F;e71P<!6fn_@8(&P*$^JMKrR*auD^p-HjAToHP:&@!"TcNe8*]co<2;EP5c<PIT/5k_t0'PB.<R;=8t;,.<%M\e0d=9PH`o]u?J$[OI_-#OZc+E`43_GY0l:!OFa=L<uSV7#GA.6UO<^%0=,H;pg%!d8c?o',;]?:@_`N+T[^=+t>Pdq4]@8+<(*%.7O2URn`VgqsD6ip?<_"J;L"ZTJbQ=DQP7nH+Tfk?(pT4.(([/)PRZ-G(a).L+F!R3/!bD^oShK85uBGSb*p;\@dAmYs]O![W42Z,+&=1&t:CN4ArjPh20j2Z@]TG,5Ha.\DhES(Y^:H*R]nIXG6&Bgp9`\2[0CN!!K]%E#fq@X@dB:8m"gO-\Mb\0T,'6,D;/:C9>f>:WI]ko;Upu4n;SA-F%HIr+'$\ggC%0_>j"DX0jl,o5p=I_k2U#<h)BVL2eWgbM+OH1\9_I@*-'BBMMYHI.S$:/`&UK&K?Oug?qu3pNRP%>,`t>)Cg28lS^?[IQS=G[n-cl\e2s)mn'+-<'Wffk.&kN=H8C\W9Iu"&$+;X\'1SS9<EqP%3OA$_Nj&mE^3qBba9q1quA8TOT)EAiV)EFXu6'-Yd7MlU\9HkC`.9rV@iElWa#q$'Y<&%'=/5+?XR?[qsEf'MpWJa;:&&\jEUmCc:8[IW2*bEgnT#9raC#M71.i?kk&`jp4Y&!QisQo'`&c"1<df@IKcaUo;U4X&f"B/OBj@V1ni9^:5PW@W&+aibf_6dUoKH><#61R\2V=iHDp2<aH.+?pt+"TcDmZ2d21;5<%V9"N,jP9K\.*XG?:Km1fqe%MbP@Zkd+:A,\o0/BBXcjpSk.BraWeiD*#[Oln1nr'fr+bW8[521d=D'.[Bm'S<ij.1)T7D&U,ok4Z`V_kq%`\P`nje8c2!odn:!N:Al^MduB)TG-*>`pq%r"a;R%d]fVC=N]"B-@SmUD`31u%[L_@?/*Dd3'0<$E5CW@!8_&kr0)dTI\&"[<k`^pC^+7C8lU;YIQpUq2KRQ.C]rcbD$R3ac34=4&s,(`u+XfM:3=(C*I8"rnIC!eh$N:`2h$SJ#hr9FF$=@'HXMpGZ+<TUNE2,8".NC:DFj&3g_PoLdbS-?f7f6*FLn%@JRu`Ebqo=cd55b;%@u:$2X5/W@iBk5HL#k[PgL8-ID5P3aC7<GXZeXi=)trh,8%XG0Vf8I^8PNNcPg\m:XG?-dS2CV):_8KFjq]l:AbA26nIf>g`boqGXdQ!oVsII.DMphSDPfQEH/!Vl9:W)qq^g$R.8Xouo/9KVf?ubM1i2_>`#ReH4sK^+J=ZmD(1Tj7TJ3%$a!(.;%R*FLZDEFMU3J9tALp)90Cr0aP3r`a@k\`]h)KKCZ9ddgW,3?+@,e_sWK@2lS(JP#`O0.*5eDsF`PiF9kZ"E8b`V:;%N(5=[K4CpZc?s/j^[4KDJpZ<Cq1;?fkjFng^6>X*#dEMS1lS(gGc:JD.;tED;sqG$>hkPIk)/[_af9u%t)iL?)?8's1K<Ed#i)'\6kNHbFMZ&kQq,_rOPBQ,MZ^6H)(;jX\(IU]tnSJp&4sIb=DI2;DQk74EF?q7PRX4A\%,\VitP(ViIsNLg&?sQNKb4p?8R0@DUAppeo_a6(2'/gL73)^X`W`l`TMg<P$nn0O#27p-+<!4b@dk3r6G5]:=o*6qq*P1[b2Hr8+[cgX/`hL(js.s)iE\1&B`W-dM]!"E!FL84b!4R;6ec!Rnn9lpoR1qT06ePt"l7!09P;9m$T1SGN_9h(Zhinq*;kRDcUka\^@L2Y=1*?mMg[/as8+;,C=7b'*/R*@esO3u8Jk]DR2QZLS$gb,Yn3QQ>G[AI"0@Pn3Ysn'XP:K[*d.R,&U^Bam,fMiGZl6UK2V^_r@GNoW-/")d7qi7j#G=i)mZPV--='+P[/gU7QtI9qm_UR7@jdqj%#/F.[,=-r_tjAR$1+(*O,0lu^.atZsBb2Z"ggoT3(Cq17VgdG]nWb*#`FK6p\24qOE-L.80oKutd;<WdE,/Tu%M1am7deEEU7\P0&CR`o><jWflb*db6q.dtCJ0IYJZ:#oe<g?<'(m?CeZD"Fb\P&L2E31%P2)\6c:\-J0R;t0#eYiLgDF3GbOX*gPS=!G*=Zj5C%X/LeLc$(U@^E!MVfuQ:6dh*B3WPW3o_/]Ar2Kd@E<[%P;88]?YFT?7Ul='9K<$KNh>O.!!/IpU/qZ\i.(>Phi`VX"3W+2uUV4M=FIY26qJRYhQ1l"9hoM09@m\sIkHoT2[>K=!_e)O=-X?t".J.[1CJYJ<XMI3G1RtWQ<K+I96a_1SiIRjkd*Ffj'sbE2QS]uh8VsGNB3ZWL*jl,2K?C;M&[b&1EC]X`X6X,=DT3]f%\I2$dLh+t,';qB7E=]F5b;*qm+dS9<8*BA<;F'ZDnQITD?WoiFa;!RZ+Fd7QK=>?NoWO*BR%F\/!>R[*f-3V,JlGZ=o@/)mio2(=Sd#C0mSoCrP/!rKr(DoHN/T^cXXdL^UO9NG>>%sVmnAU=-Qb>CD)hP=cAV0I,:!WeVbjPZ387(,IZ%(H0>e;2<kZ5"7EJ6Y?Z&)(_&*/[LPMC=[CH7&F9[c1BJR_N\1a)pF#cg-,j$*F`AE?AWp,G"+d*nRu)+;`DS4"rC^l/`tS\<C((%T[/r>b0*VN(`;~>endstream
Gb!#^D/\/g')nJ00j*?LDRPiWl9,/oBU__c6^i1&mi;n_+eU.8<\$hC-m]>,5Q6C`ZX,1cnpNO.[6o!p*6nuUGt;'=).-#0md'r1/7EP#J3mYS#"=_4=Pgp`bHi:'8g11uP%!U\#,Ys'\nZ"?%_H_R;X#Bg%a,k@ZM;)W1g35>SA!nkba)IoK,Zl9NWfa!D!_Cb__umo-\fl9k(h>Wn:H=1@[aNf&2TqUNdoEk7CcsrrKQ4D/AIm%P&$]'9k,6a5W>X*kCVrY"ru3fn"]/YbCJ%^K/iNAQa5#^F0WABn?lVt@7dc)kkJ:fTd3i1eQ%]1gQ5,;,Z?)!VVlL?!\mB7d5SL%'Onj_;:/iTT;,0O.V(+%OGK.ce"HYB$o55cH4As=]pa(CYH"4fQ]ToDCp`hH)+MEc&r^q\9*NMarEUaC/%%cS<=3OsIWk*5hsHCM;2Ji)`[QfF8c=m]'\>j5`9pugBoJETC!=V,mY/LIV+asm86W3#'i=![I@nrQn*qtKiV2TZM+il=N;os[Rrs"Vg=L&E%HI='^OL7Yl4_YP8Jo8/2%:tqcR^*@>rAN0s$5W5DYOnG&(B0F-fkC+7no].Vnd>s([l7-&(e94s!@(/,HCmn-KiS&ol6HkW?&3'En:C_/':hdY<7^3ZR^FK7kEQu(uhp$g!5/Q0RaOcf`E5An:t$/q<h_P,nFboWs:SUqr(f6'qqRbS&,%SAqA-7Gk>Z`<Mb)/BmQ^7TlMT.DQ,V*"oa)Q^R[q30f<6fp?1U_B8G_H(#&'KF^?nQpl]bW3gsF!28P_PO!7!8=qA'a%Re6=#I_bb`5,U^[`T)u\lo?IapphL=pMLY%Krq<#Ia156L6h__Wn-u>5^rA0.O,8=GB4;-/4SG!ii&q6iAc8Q1'dO!i@E7pbj7f8[bWKr;mn:":h:_+aFQ]XBeV27=o_,p%p[=af';[Xj(j=;&KVl7t[Juj91(/g.1gn,ak_MjbECK,sM0mlIXrA_W`;,CpMpliR>oM7lur#UfIOg]*,kATBJ'9^@e4VY'a9uqQcXY-r3rmI%B!PqYi5=T4,e"%A#_G/PR@^S21u<hCK;Z'7L5oh/)S=iq1&1$Lpdk>8HrX0VX(Te_sm!RT68V;%0\!UY!a_gW`glH(K\1QTi;c(k2c4%nI\%Z*`:,Yb+K+Dq87=P9FVi-a21W72TcZr1cIB6C3\QjAFA_,.r:1_%21Ch"MjENiSNOc5,I8)l?gV-cO\/(jSm,3>C/GbP]SSn<([m>3Dg7#rH)m]8As7F[Y@W2FXkd=NBA1Sj[1g*7#BcSKt$q-@MC*b-CL3D_uF^d)Vi0-$L4(CMNJGr9@f'fQIA$m6+hr%DXm%%]mTkJtWYuH!s#mOR&bf)2@"/_`C,TV98`rXK+f:0G.oR"E0=^BSj*b-J,+TK!b5;(i:Ci=U34:<.>#_p%j(AUAk0#dTU.BU9Tc#^\<%[d1&Z*AbuVTT0n).94V7)1usYFoj2nuEtWH/h9J[ghbV75@gn_^c=BH7](2,(+$2&s0W\=<HnSloq]!<jW&?A?62.UJ*Jgr^B:tiIr;DPsd_JudmK2]7$Fes_;3hoQN&a&/6=q3)kRJ39$Tk4!@cddsJ_GSp5UL?lNDLin(![<oC%rSiO&cXIDY?0s(+"))#O.!+dKG1l=$2FC<=PG"),8Nr;(E(gcNdX5nIVt"-q4=[\;Vj7I@(Vgs-(>T*S=/C7:Ihb5lG@hJO_FM[E<a'Z-Ntt=TCO@')8*<MsN2;f[%Y5*&$!#E)mG[>V_rFSnN@<;hf=n@R/sfht_OJTaPclc<GYYAX`rLP;k1Z;5[$foOBW??tN,?b*O#X',:-Qeq2!:n^kTnR8,(.bsZ[[_K^iheRaeoEB81R1bDB]><L$6P:-AdcE\/I'-;!,eRCI\/tj71m3B($<+F;$Qc0_6.)%&2kJ7a#Pjt9pDK&@?N8q:1ggNr^;e%_aX1>.2HK1_m2c&SCMQZ(Z+AA^PPmOI,j=q8&<MSdGV7`738U>i@J%2*njXflqLE?V]p1(m"](:Nu72=#D3F8Tp'c"p.^s<T?69c1gGokr%/E*_Y#O@`j;neg#OWRJFY06C@0u`S(^gEL"?80\^["e6<6JQoX0h^t0IRndk*^#o.c>l9'9L1'l`o@@fj+]kX(!epN[L3alESO+8dRthbp*jTh;<*gm\Y!P/q^SD5RkJS6`1LgR&!k=sLL@W'cM'"eTLf<n^*r[Q`YXp0Hj02s>tFQ=bYndWDrV#JWU0p,UIrJUq\*#<A4a\f?GD#&<<<hpBPMf\KAukO+Tl"8h.PXPP+Md%W2:rMl,SOrZ?sG3ScC`S)CKM$\ah9O:KM48[*:3n^A`.W?'5'UT:-J0LTbt/n*bo-rS2>1[9-B"m]2-R$J+XMl4PXeCTZp+'bA,():I&hhg[6JYPP[I#kRkm^HR'8C70\W?))i;p?"$<X!tR%`(D6,QMaRO.[(j8plJ):kJ/ML9!sJ?\XBk9qpLX@=Dr%cpLYGn<(YWBrk'P7;@-#j921!gl62cOITdnth2WkW@N1JQGf&L[9Bl@:j%CTE0Y<M505IER0h`.t@EfG?BYS.BZX9D'9SCQ#=2")3XP#B*S:#_/V#-@?(pf_i/f;X1XBlR`IBn3kj$jM:rL@Z<#ZErNE,'S/fhnS_2O7j5<7o5(ZLJpq`6L7M^@Mtbl:W1LPDZ'+mWYdCnf(F`MgaK&GantgVoir2\P7<P&Gt(1)i(#3d11r=^fomslj5<6/:&JB&?aY8h>A.8acc1S>=)1OJGi$P8*]+m]7^oA^16]FaNDLI7A?@/6S*U9PkQiNpdWk1&#\:Sc%hfnLSsK*Ug.[dJ9eQHO0E*4r'uY2#U8V%YhR![Y.Wi$4g>q5T$gZ-lUh`kK'W^gg!O\r=&cTR.nGJOSRQ]2ZE0lQ3*>$i2!V/+bUrsq89lSp7do+JM9T6QRCh##PpE?*$KDU<o8UUir5dlaV/+gL_jnOE;Wu'4Q+<rp/VC&"ffK^m^VKSJ\e6+Re(+C)i*egfm:4]0m8Ycn/cmLO)Wq6%*6,T$O`J1e)3ZBj;Ah-/hAGgRPqc`C@R<Zt'B6ML=l?OD7iaI7Nt@X?a,@me]OHpe\bH^qM=F^/^F/@[^D=[\:NhH[KM[<T2Z'acTE)\Zo#/]:6]:]37IsTaXtL]SG$7KgRGr7de+NFs,#_h6G^G)(jqW&H_#F&753D:-fV6>?b>;tKpYHS>W03h$dq.ocp0V<Y.>.~>endstream
endobj
67 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3294
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3540
>>
stream
Gb!#^CQFrU(B*+)idTRCPDM".%mrk!g.XDmc-C(QPO9i&ajQ!"ZHWMN*[nU0Bn$!8H@R^\)`el(b3@PTQ[52!W-`DjJVbIArZCM-I^k$L>72t`GAFE&_h#FL_je9=hl\L^l1p'J>:qIT%t=]l4sjLQ-f80?6HBAO%1H\X&*A,!;cl9!11^\=U;pBY+\65G)i3dcq1)Jk'-Glco<rs/&<G/GN3AEuMs&FEmT6oF0)GG_5K>sE9aoA?lE7`^b)Yb$<C=Z?S[0?XId8_$]<L3Mf/N@9ZPTj@q1\r`,K5R.(A142oF(+ja1q-4f.4`d9?4H5rVb]q/&R'2M7s9XV1TJ"nOBVeEPK5dS'BFZApkUEqW%qh'U%I\qEd.@gk+@%%F95m#E?\\Q:l!Bd-hcQg'5q+D=ui0:dLBr^6O`V;]U:\OCXkn4CMB[V?[AK=;!t,H^aE?$le\BS3.)UA@r@r9HRrjp9f?[k;.?Vpm.0bHeIJEB!BTa>Xi0.\Bi&Dg0UE%1TC4B$4,,$n5,bsUbjX>qii"OL=uXG1`ZB$@('FM\+$[S!>cmd/0_9eBN^W%Dj.ilF.V_H'U4r2=Q/TY6i<_TlIh!X=nVFdEg+s06_HH;nP,C+"-..KPp-B>T(oi3&>Ai9&e<<T7\9k>$:O[W3tSmqAXZY`3L-)kKCBQtIp8QI(E!Rsn%Zbs9[f8=Wk2^Jo+G/sCm#2fY1C'Ydl/g2Y_Ns%\qY&`hOoCSVHjL%<>@7H-;P[L:=9'(?'l_lHh]>Ss"*VY1&#C6lWMKl1/-*,G)Xm)](91anG=T_nMSbg[F\j,Z6YS8mb)a;CC[GidA1gT2-:Hr_uLU/LUO*/r7fQ_CI_Z3F-s(cl^`pa:$mC,a4H6ggALN\@/4CHAoWi^i0O^dW\rE7&+gik88ji'qF?o\b^!apk70m@)K_l0c*K"8kSM`ddHl%/c<GCb><gVQiW!CAYa8-E'kO;6obTGo=Y*6LR4Mb8J;9pkmZTKdLDLd^Mini/!7ckEc1WWgYF\aKs%5c>6J5G[3:JMS0f6P!!a>cQ9>6*895.6/H\@bU8W6@lQ9Q_8R-<j=p<^C!]l(SgFeE3sM:Yr#.ZUS*<]^UK9H$Al[Xj02c;)7dS9c)`_ea9=b%e^ZS/YdPEGkREGP0F@f^AUNmlu9rjl>`t&!cV-L$oj,E=tca5P'Y'dF/QO9KXsF%$%Jd$r[O-hY2MoF?e(-s!km`%&5:1)=X70pHE"F15n]QP.Jqnd'S-eUWhJU3Z>Iqd:`mlLb,DHE<-6`=NKnP&lobmXO+pO4TNbU.jXUu)fh'Nb)Pj%m@OlK>35EP?oA3H9V9t?%>GmJk0aKEl&ri]1O[U:bOeTOJ4o`,%,%0Rm;Mrb*F.qI>Gh/LcV3VQ,r6]WR#1-fTI-I+9g6qs+QSiH'P_=dFgm"1KX>GbPna^3J)>db)&SZl=n_IgFY"L*O5kKFM&mS`q.\J%3^uJCk#>9m-Ct#*mcH:OeUV<*B/T=jGj@8qBqGm9DX&8@1?t&nY;\ZXEcr:E`E!j"MnglL#Hfih+0o1%.[(o]T.LmMp%tZ'3-k.abY"W^9-S[f"an-'2gHeX*MWC5lm6tA3.iU`aGC\ebPj5SkM^#tXYnPWGlJ_Ys.%IeihH3%<CtnSLs0+9Ja#2m-eE9SBp;PVfjlURV$oACJY[`jF.UaQ'2MLa7R(BT<S".%$#5.SP9qIq*F\>2)W@_H8@Y]Z8j@QCTi@g;::4>V`Mq5oV?Dk_]W)lhgM\q,<RlV$N<]<)Th8n,[aL5(6@D^,_)=F[Y%XskFRrlPbOLq=1'ks/1@$KX#13L9g!\\b05:+VgY7"i%k6lW-^hmZjW=1tY_[2aYW)B+W?,SQg>V"mfMjRsjB\l;<ZS7[@bp#?ZfNt&8Lf-N`,mN-@=/X4U>og;[EhE4h=7Qbp2@d1'O7Y+UruX,Gr&\IV)4+qPoAXM_HLNJ4_R:pB(pKK:32O2h2#cNL/hnPVf^?@O;h`N38E=6Y=GP--M=a\[2SllGoHW9AN\!k%H?(?0^'>W.Y4L:/K7[2B,f\T_\lE:SF*o\E+?_)X>=Ol.?Cp>_SWBQ%;jZrcXV='P#a%+R^'"t:ENs4+gt%&+RlHuA_@PJ*%`kt6Z+?.EaNdE6p!5SoE5T8\u(P1a>'br_65et^6"U-[CQsq@G=O?j3\&%9?tr8dI&]L[UHV<(El7\-,^lXCYP^n$TuBM*;Cf%%2r;fHGZXB4\:hB3h0>QAI.:@NU\Zd+oYil"f%I-8\*b[QD[3B@nuIf7VUf&>l>l<l')UV3]rSWF*WXlDK^cVf$"%^oW,k6:3K0&d:@N*+(]7+qcjDq(reXZ[u]us:"=e'c-Vk'\t^--:WB#/Ep96@P%IESn'VV6EnAjCOWg;`0Nm!r$ABg]?B1FhEBNN#)!K(%:QmI2cjh4+7;`;i``[=\bOq'gYFmBD#O8n<5q[c"K8<OFViCmOO.uk*DircEnhS/n;<EYmHB$S#D2/lIG#7:`mG&`M[e'PSPC'.WT/n/Y/]TeGCVj%Obd2Gt_&[A,_\p9&"L%uIN7uQ^Gb<CZ@sEN0P33YfNX&JoQCR>QQ9==%Puqq+\]K_ST;aW);tO+s-s'EM4Y-:iV\-m2<X,\VZPTQ%Oa;^XPYm)^YKKnA%jUo1M!Tk`bBcn?0"[P?o.m(@#5LE*>:d3R+,bi19@o^r>"I_AMs&]Ohj;b7@cFSA%%gI$JSS@k@(Oq9^^I/j"9Tg0B:$'8,]SiN,b3s$]]h\egTqmOU)d$/I$6,?#o]7IHAN(M-40bD%AKZ6c:duebJ96\L#<;>ff9<RY;a.D-Yu;?b6UnLQHg$S(t6b4nOgN^F((O/\H8X48!#Gla!U=[%BK_mM9A&"0u=s`\fI3-"l2XLgS>C*X%c0),btE>]Vgr7H%=Q-@[^1iMs>8cC9)'13aELV1!"rUH5M:-CCVLI.Md;K>Ac@+&>QNn7^L-hM`PIKcc&nt)f;Sp*L/21WuYTRI9QnFa#<Qip=Ca'77b)&-Wb^RM@o=6<Ffq';tamGdn(J_ma4gSGVTR:RYc7*WaO[k9'bn"F+;03o9)WdR[CO?jE:-3bj$eSl/l@mnG5Pn'`u'?JrG14qgq0/D2"Pe2J+]+=2\uH^FWHW>'/Wtl`YF&ePsLge?6'9R"!sa<BRD9i>V2TR9-RE](EWuERlSep+LAB]>k3P)'g#e$U@0!R]eW5V_-1]6XpuhMNV!T&6PjsZ"MM`YD%cQp18XnFY&C#ePQ'6YK.m,i\4udQ=7Br9SQ3&_,4V"$\KO7MLHAN-371t!3*Y-N;~>endstream
Gau`VgN)%.&q0LUFNr<1aW?B&SYEET/LQSAC/62(cFi?E-6\4#D]pO`qYOuW+@T/'"=pmfEQ+6b-ICu"l-fVAd.,-f^Ol[Ih$gH(%5:JC/\nSJ)eQk&LY:A41IFdgNoj(Vh$21a1u7_>I.$?.*t,[$MM.3?%6p#-SEWAQ=J"K-7Pfmp3A=*F$4C,<E<-_:_$JtR5)nI6]q%J\@p2cT-qG8Xc=-DMAf"^)5C7O?9Jk'O4K_&dJ87(F?[$X\<4Wo5K<&2ir(<_fEu<T!!Om`I:_k=$KId;#&(f[uP,"8UPk%`Dp^$",''CbH/2*a)S=f7$U0gPt+4ATAKT\A<r-.+haf^dcCRerB3"o"hoL,CAr&H8K0;2WJ-n._1+WC]m,`,-,'G^e1_Pj+n)/g!<:JO!gGo.#.6FHm&b)13Zj.'QPaTX!P\tE+@h8_%T;?h3koUsDNa\_(&)OV@+dLaJu(59087[5s+9X2H;2$Ho^\n:Z*dZb5[Ch\'03@dWka4XoVh-Y=sQN\f_[*gF5AQC2uN5:Ac+YF:,>Mp^^F?P.LM3_W7.?H;XU>QXfEQR<e;+*5Mj4\]nfDt=BPL4?b[HuK@218q;NWkm5]=Kp%c#ZS92L&Q*pmCNEiI&m,9Gb\cBa)*-!f,i$;Ij80M.g?X)nLO\6_<.\a>Ee6[3pAH8&dEIlYH.XgP?,_1FmZhOR%Fd"V[f>>X*\*'mdt&I">RqehJ1eMeSTJX1P9gqtFjS)7KJpO0ISCGiidSq]eNs<EY4[Q5(7m']NpH"XF9f7ff0Q6]P#K7H3h@f.-.5lrVjfP@g;49*D.Bmc!&4r6^D+WW\:;2JH0&)@CNG@&PDa8%BgTV<":U(-$U^]G`A]bcXDo)5LCA8bCH%I[q62-<TVb?qrMr#@T:mZ1ARXQ5Y/Ir:t"#&J-nl'n[SI<+BLU0f`Jdq17hX=OQ^SS8#@$H-JX>8Rq>VYfsCLPQZ5;d7VsCfh'+'k_c#b&(o1u?5l]/.n_.P0s[U:')X#tOdu1@ZH^KGIi2OA$*/8(3M]GLBNZ=HMhi1=q<7MckaEYXd.4:e:$C(98*iZt74HqXqW0U=7[PJ,9P6=TnmF-9AsASI.a.quaJi@Zc1U!AA8'21*k$/,mUZ]]j5U>%<$5m&Y(!-&YJU\aN>LUt91ono1d#/s@mI82!)=lg6ZO5Sr.0S)CF)[t7pNARaCPi0ZOO(d_5XKT&K4JOH37T0,r*A<6UlU7Wurr]:PQsEJg+^+Y4Fdap_EgY3R]=PB0-<>s*jh/$sChr?.G-U&]ATBHkn[5p2tfHZG)T>8b<OGPb<.$^XY9USL;);$s;k#2t1%"_q\,>gs0?pb[K"BR&46dO3c='Oh1KO`!K`A\rNo8@$ff?fU,3\=-LXr34?+T(:[_S$<lU>44Z,coP]1B4\fc5heP&JDRR3/DG*6(8kW"m6lMBt3>Ls6U)/&urVj8:pG]l:pXL0`Q9IWAA.RE-;%4+,A=7&2Muq,a([F$b&rN^,BL:/\+`!3+J-:,?l0/lkPV/],7UJ]La&msbKI!<t57#%\Dm/-kh<a1,k0NQ<c*U_sd&kRrRm/>U#]mD5UcW<]O5=</K1)Xel=t5-gh+QEm>5Br(Zj,JO"T0F^T?d&g%#b-^#WL15nW3`&F7A6$[UIa]+m3j(N:t%i((<CO9Ij?r8*SG'ar`%1S^rRr;d:Hbf8WNj"]hL;,"7Dd%U:0I9#'J7GT8t4%tl[d'p7Nms@a"kF1_=dkKerCJ.'J'gYn@[69!0FF>o\Hdcj8?FqY*]u8]9dn2'g.$>I%G#]5VDNZm;*BAIW)Z21jD(qn@0h(+^HPSA:[gE:^5Rb^9<\k2&k^omGDEj**P]`JO1<]1og".m7/5]7OK:p2ld(%`"+?t\7j$p7VKm`t,+b&F^`h9m0M;JU2P"sK-$NU4`[^LffT425ALhqk9^3XZrbLlAP2=P9s3c7GehWYN=M!^AcCUQArZhg#1]W?+Nmqm]Um<?Wf7rl\u]qgh2;S\6#;3kMibK/_oT@Z>o=>%KaGlJ0@:T8pjD:]j"e)$hmo"rc36cqAm<*RI*k@kT=UF.st3jFVp)`T<'a9c@Ia&SGbfZO3H>DfD&e[_Hoo$G7tNYh'm?LJ$Tm]?R'fJ;*,PR&!Li"VE*TP93%=%#;>!_OLXA4i?e\VbfOlZ?34)Z6j1^NT7PmBIJh=;L\/8!6#5\AHlt;:VsIGGW"9ar+?*Q.kDa]h[3I+C<5`Jjkd:'=PNA$0)0&PB\B,IFk$kjG;\L:qgNlK\gC!SS0lD(0;LSPi+LFe",gk=mY`,%9-g:3@\*FdEF@jaAA6;#6o!5&2cG'(".1Zb/L6#\q(\')(/:m0"3#qVC>Fd4dJ<HD"5d:*XN0t<Nr46A%""`Yl_,#nn+/bdY!,XEU@c"B4U;?[^Hj[qf"V&g4Knj*QptOr/!R=HEE%)ku-HiU#9\T5"eO*4;G5^o7:UM0J4t=Xr]]m:o#9O(Ke#*f-gd3V/KG3l;Z(JE%7Vif/*s#%FY9.,V>AD"IlM9apBt1pINrJrbgW.j7dcN6UtV*,rf-8@!JZIUuZrY_(G@jm\`e(^'$"Jfjeg5qsiFMG>fAH>b,`Nfi_:Ti,iIR:W^4`9UtaT6KZS,fbCbHbt>5g>EWR\pAK(lk$P6P=N5a,&8!tM[_8ia_I_uLa-*<\j['<eR[O+SYpaELp*pl6@b"(J2$`_M8+u38qU[qqBm7>Ij6r&\ZhH\.T#8tcn+]@%57RB]PJ>&05l--S#AV4cPHBCh=^F"nO6!i<^6lX;g&;#,DE<tNi0=]k6/q(/'Q@=E<!97\nXWS=,UH`>%pJfV\*Tg1NuoXjSnJH]TgUQdFJqds1`9$0Nua5UH2W\#hlc)]=l%,ul\?9elC-VFT];^B?S$(hVtdK&!a.'f;!rIQcb(>h*_g*mo!t_-A%9i)`?qNujB_jOHXVNY-o"<Bd"f93e26eoTr,Or7/<N;W;8fGa9*CNNE1f&TC)dPYZBch)/N@h`>]$c@B4C6NZ#:`$G'Y-]X?CSSKFWU/g0o&`A%=slAcQ*o-U@S!nhYFq<SiCBn3m#J%YgG/k@EB0.s\mXMUF^5r:ZWs7UOC3@Xd9'<6IJhr0uZ*D9fqNd&&:h8>@+.dp,U[4D%oP&PMm&?j#CY`2OsiS3g>bXVhJ=o:\,enH+Dgkljs3s&j_`2=)FhWZb2mr\SU)LUTs>K(ZM$CY</B(2[H\a!"_*+"lk.f6bh7qj3.^nb<?rD5Nug"&E0If:Dm/Ic>`bO3[?hDnr8gTs>*V+r(SZKgd`Pd,P4M[@&V0o,E5gI*kSg$kRfb&_i.Ag?a[q7\/-YTV+8^U\cXTKY7H&XsS>\.6HWH)5BQ/>lQS]^F/]_Y/J4G7&KE2n1)SpE\>^i?b.BoidSp]^2sO;sF6B!QD`eT"p%@d2Q[g3dKN0Q\^pL*+qIP0G#shOeMKK)7P\?*HJhZ[sTtP6K5ht7+8ME[Fe!0e\8jaB$Ck9%R@N9<Hb(N_1G4=mPE7%YH__t7GsthG9H=nNWbfRNrP`qh\lXCrW/G^!s&~>endstream
endobj
68 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 369
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4171
>>
stream
GatVX5u3+e(^An[^Z%C3'+8BUic/Ss1ugDUOq;F;6%R;_;?+=`Z,N(NQ7PaVkh!OsqN\q,K2/adJ4C)f90i[L!]2/Gp^RUS4rl]Q$mW'8,<l<h@hL@86@7"DrMaU*a!R=bg6@+Ui6@K(:QbXdY_/EC`pfFu2bs`o,gmfCOBN'PCAYZIFGm/al5Q^lf/:^EP,_.k$h/B0]2A30a!DIYM1;;cfrEX#1[AGU*(5kEjPlrHK!8^n2MR%(FP:tOW)`#G<I\B*qTFc7Od)3@9i,]#NDO-.Y#%RR:Lc"d:51RiA=llN-/NeO2ATTq?(I<&A<FP7<@tmuc7CjmZ"&>)Ic`G-TR5bg2d=oN.$ODZr1h1*"]H_@Qi~>endstream
GauHOHZRq"'*$j]@OKcCjj`9oUh%eWa%>[N2brXAmUS@U0*@&m`0__`P)??OgipL:_"U2?Q!TYG,SK$E?eF2lJl4nN^FK85[K:^H#kGA1WWnN*:^tNsa#geW4SaB!`\WU*A.Aj%!L>p2'RaNMF!lIP&*VdZ<[<R$I89obU@@E`iWL^1kop4&)SkA?f?h?E?fs+R/+hu,^RZrJ&AdDQVssHf*a_5Ei7J"AqX"aI^4V3A];s-Fe^'G9[j#6K"-=ZMMkC!<T+(\t5JR1m_ln%N@Hg:'k?36?o>"^aGik(Bj;TuphL8SS?pT>SaO`nDWJNMej,jtd2$DfWJr_"8.p/!K[KPKgRJ+_"NT5.k=ZS5)dHB_SMWjO,1HpC@]=Y7cr?8(ine9WFO*AXe?Qb.'nS>gnBTcr+(A!Xa$/.ogl-88Na@aH:(EH(IR2]iYj$pc6q"5U>Vh:Qe_0t63F;?lML1'&i&15*B\*tWDIFjnS-Dq%8o?3UjoP8RLKDb"t1=YrI%['"2'l+)<2:+gIaunIsVa`"R4d%X%1SM#;&5\b/7#L>L4CtJSVBG&2MT!US;#ZCq1=_#!NStIk[DVpBqVEY`;J9J.5bV2pKFYnNcs1uEcpS_,$&lAq4eS2]XeMh]1dns_UT<SBMI"e(=[P,*'sf4,"j1X#1t'n`9/71iOPMc+q.jUIdsu\L,n3KtjN4W6h/!.WC!XY*&#BtL)plnM-_NBU?CCG_)oo@+cU9UK_T=6#=d2^!eDnC*Yf//qL&?3KjQf+'-Tqr+q'gY"q,]/8>58-&@#sQElPo76A?P2\5tcuadZK=A4!/:Godk^f-:C'#Ih(pcmggAEo2=I\d(a>3e=bW_3RK[!O*.g<@hst?Ni?SMlkdn*=<TY1K`>]sK#lK)T.H01UI,VG2-c<hr\DB6?EiUr=ir)ZiNV%,p&Q,3K,P\Cqb6X<`?$P<=KRoj9&318[RgsYVF`g%GX-,&3W<j+co%]oY5M`tq^e$R<dPeFKp:rO05YH[c?-B%c9:D#!YR?Qe5Y1nPs\f0=I@^f;tj</Cor3G^J?6*:pZ+3$K]Th2^aCb[Ro;eb0!,bEad/sPl,s+E*LHHj_!#+_4iqKJ60hm(<3lc]LiC4*6o#O<AL3^=Oj]7eA<,=ZA+8+Qb*Ub/\O]#dh'-1MmMC7+s#5D6Pt[iV\emmY9g6HJ7gRQDrsT/6pu[d5Z6VKjZk,b[ApH,&Zpf,BJlY9daQ-:1TFlqe$(ApKc>N"*Wp0YVi#@jZO#-<k\*kh#A9cuC6L'`=Hm4qmm[A+k4)_%@otX7IKZf<,;(Nqs!\*1qVJsG.H="/RWq06-tl\_BQr\G&J-VNdbqd:SK;UaZKcc[%5=OK6cZ(cf`J?XF37a5I[9n>;4^#:q#P;u,[rJ8A]A2mr2:\s$cab\3'!8H>hsD-/Y#A1Y.PD<[.?3W\7CRr">Ee@P-A@dh)-]]GXBWpp0P,%40X-@FpZiC8-=t8csKYW$r@bj_qPkVGWXa`VSn4cK6)[9(a/V?&qsPP),?jLrfs.#6T9(`4948=jY4t$*eUdnZgOM2IQ*;'n(M*Z#Jp579mp6e;g2d(VOZmGpcY(2!]jSjn`l97.D^17@#Q-CEfUhekGQ5N[JM.dI,>,2CI_lWX%bHU=Rl[j3SQ(!h1?V:^EaZUL-09%F4e#bn-7,_iYKNR]XZWgcN$2uM"me,/D]q39c<;S\J\N</GS\A78"M]G=DgU;4i@_XMP>dY9OH@i66b"+c]3mH[8UO)!2udVj4O)=Qm".C98b[QU:I.TRB5oeG2FhF1JmDEl?k:D+k3]Wd>/;U&3,hr%"'<!kS).ILuKuf^>l-l#-75QDgId0m2Z-Q8Pp0/h%C7F"YXIe&X3ahn[g"QMr5us7HY6knJ@%5"K1*G*BP>NiB:0`CV?9=QZr$jtA/#lK/0EhSrup$iJ;MK)=.^q&d&Y?<b55;o:]3\j%SLGH:iST:GSgel[ftN6VIm*X`lmg]V`\GW&m!JN2kVGu$7SIb^pW$U/^A7Rt!rhcAhS?!5rtCc2%fToDL)Q.oO8oe"A.?CS(PSbT<73fi/(FR*cZpg9t5=i6\]+giumdg>f(c(ud^&!CN`ieH,"hD+^.YkG;geWY8PWMo37EAk'C)<V;8$UAp'!F<#3FNk6X@\oKJ`^U/l[/r29p*/FRLO'5rNRq[uA@rKW)nIY]'\."&_1ng3.CCeT*sTQ2_a!W3YnDs7e73cPJ+kRNIY_&s&:73'16,?d'ra"0WjJ,)"M('*Dc$ORoWTGq.u"!+/0ZiZFeZP]LSG1">&CMA@0g_mEqqV4U54+IE4eA6)m,eU'Mb\7QYJ?1=saaSo/TJV:=;/U\5BAMWEBghiff'CqK>FjL'>4Y4TSi.g<?D3j7a;i.Hk?k$U8P8#24T&$'p;E4OH`-Od(tcdW"G&CTmu,fXj?9dbD#!K-uDWfp`ReQ+?M1CA!6n%CW/[g&tB(=dCJ]/;u-TJ6q!3YiHr60'DT?!lDR+/KVt^p^Gu+a&"c(QUkQ)RO>s6!ZKMN4:tq/@M_W_QrF"D"7J+_pO$H=HX>_&8"ngIP/*)*aE<HNn2F!#IP9rNL<%WiV%HGk'74@:4k)%V4ea5sYn(o]fZn?Y=K0XBb8KDE[M+hsRZ]pX4k_`4Oua:O[3FH3CDC'0KJ?rl7\?PuHo*]1qCE[;eo[pTG0tELRR)Mn/LICYR":+'TQ0SeMaQLAXu\-kWn<B?G5i]"I:sk90fn0T"r58?UN:U!^'H-hfI=:l.4PC],n!(5K#PkY&&k4nTJTQ.3LES0@iT2+NBTD[Nb48-BH.9%\6\qb,@7K40c2V_-9[Y4;/Vl+?%3)TFN8p<8#]5MG0Fa>eu$g;20*d%9No;A7!<,B2dY8jTltjAABAGDL3.WV"Ajk6m5G`raieVm6A\7--Fo\*eg^crkS56dGZ(nPcl;&UeKV`_Co2&Qg:C`6n)SZu,^BSGl0_Pg\#D"6,u<;D\o'Jmka`e272oD&*j060A=9B^"dcY<GLpn6*FJG]8mL)sbZU[c75?m'5/Q!fie>W;.NV5G0.LN"(sJZ1\h:b5%@i?cPLF=TDMMm=$If`tiS62LGA^([X8lY)<IfIMOJ4AAc#RMUTV'S"6?$1r/hfYKG&82tbe`g5T%eW:qs]D(AT\[H)`'_#HCk#g6`K[<a#@l/VD]82+0mQ;-Pi1?c#9d*cXG[73VX1;-7;;=H?8"+p;\'IH;-5?4S0*TTB<J[qK!fMe46@UVFb,KFBI't/I!'IE8i+=R5h!X'*iWS0b0G/l0?/O8OlpuXP@1-.Z<"N8j1aQq?U_bZY">5-Q"06VFOZ$IK\Q9Z2EFppu_.AX>Tj5DPu&&8*gc;plZC*9O3/APcqK0h[DjD&^!`L-D=ZdhDQEE_iQag")u+:K3uRHR4I?k<u$)3dZb8tb>q&_VWl->l`4[(=sF:eYPU(.6UYOAk9([-T2Me"Tn5mGZF<F2<EH,O;_2W..ZL!hj)PqpWTZ,AGt'pRld'R]4t:p&&<_"6nB]TDY1cA.l8S?97'Bbo7WJ"eU@0nsS%I0mR`f-jA5b0.cMY(K/_2nSkD-r`]X6=@54E(FH<QTi7EI#\cEpH5U)h>;LC1b#B0V`\H%.hK7W#Ge3ms&7cG,'T^2_VCrV1X99H;U3fd:[4?&OfGl</hfp;\;qW8Yc>BjL]mTF:VoO!"?aaiC[.ktdLf)gl4W4urT0LU=1q>rjU]3Q)\OJ:(mS>C6gFKXL?42SU,Z`OcpoVie:j/0N:WJt<e9A[>aZ<sIs@d/SKI"!nFa>VKOVE\nmcnVW#tC7cjS3r[)'Dg_mUALEHlJ4Xe"O"!O,.7N**#RkVn5@37Gnm5KCSpF7=-qbB9f%`hMCtoL(j40UDOAl@DNU9a]_lt"Skl/lTPHu$qUhX0ZPg]#IINPTuB3m/$R"CJ[5L?99g7=:_Gj]'-MqtCB=Ar-9NnLOjDNdO_Co0?CIG)1K-'$R4_o@Uq0i2agkO#e!/pMID,H"_CU!NOCV&j&lRCOA_Wf;cEM?\b;'c`"Cf5NE12Nb`e3JfW>=ej3MZ(`&<)mqB9BI$`UOet&:g;h>_FSr\q:kJ5_Rk])K2ae+^\LF0M]LU'sGN]4(Du;=`kLW&((qr(Zo%'5sA^egG*=fRDhj7$_Yk7la=Si#lY_GLk4a1K@-iX91J'Uj~>endstream
endobj
69 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3416
>>
stream
Gb!;fCQI4.(B$G3JmYtUUgoCUQ9<h9Rm*_*#MLFZ7Bh;nJsL(SM(H4`2')kunU!i)ZE/gU4-Nr$-HSY"7IhMVk91jV_iLSlNRnGapP<_U*TX`oEIf+eo$QL4d#X5hIp>"Fk9R?LcO!G3L[^q8&"fh%q88M"3HPU5j9JW,Fkd9A4!%i6/RD^cdto)75&1,K+*l>LNt00`QLi.NIQ\e+8fHof"V-g1DF[n*fI8,"N_U$!FBkT?ls5*GNJL&B(4n5^N?1;NX'<#m(s*'G7).:0N6lC:hg"ul:7andPCE5KB/T'ijp%$eIcYq+)K1TqXJS/?f1=i]lrq)OHmM41#=!R??-fo*p;B4BY:]].'e!CNp_,4^P1$#,e23r(ODJ)6[NqeVeR?Xui2aZtH,ttOA04iO/CN]>*eKu7gM,0_?g@f#PIpNl9<=.*bV`?3pR$if.b>1nfX_]mBeh9>=upn(YUH<<V0U3b,WQ<922=2"#M<!0#eEUfQbfE$kqp_0`t\,MGTI!"Jg>$QBYHn+at"I`W,qK;6k5/J6td&;Smapp0G/OfMCE+.R_opi>p,XlJs.57/'LQ4lSe_CIm77BOW4.JKA+)ts)_fUBWM'9NRhZsaNt%%W-u""?U*&bp>LA1ILSI:qa2?;1r*&?!)JRYpes%8:hV]$;q^*?dh7#<K).dZoWGT!IUGmE^]pA$I4G_s;!uq##KN9Z8)!?Ee_]"ua,q>/]&esalFFIe;[^9AP$FYaoR4P8AYgKo;EepRosBos@/7Lb]!-<2Y@Gc5V636=7k866BM7$V'JqkqO]\G",41-Q/Mnrj=2FXr<kc.$=Bsnt?ugR5Nn%IR0BB+kfunRfVX$)B+TP6V+dAd]`$3s,NXYc2b)TYkmT&<ci>gc!W8J5WaR^`Oj&Ad,q'V1<0T9+B*@>]IdXY`BNF`)gk[1uXD?m'-(s_.V=tmNG&PXm+;*'/dE1W_mk2QoG8J-lFjq%rmTqR\=kYH)'[DogmcO&KQ3mFg%:mlPE/!&:Jja@0`%=XPNje%M4!%t(jN+(<TCalm>S-m2lI!1M3":ubb'N3CNSk)L'K323oHLNd(2"3-SI_RCHWI+QGUZi=";*oNOdQ(/K85TdPUlNX`\Q[3c-@=BUApRA.+>$O8^aeMG[M@8=Og6i7n(sF^kIVOG8^IM,B9d%[^4YE\,>MW4$0e*C+1AI]BlCB,b]3R&e2c>UG]'>/aZKLS+N;h\:%K0"<6/f,<RaSFlN\UF"s<G)1mi-9f0nO"$]MM,J:]:75riK2M9_1S-Hns;Y<IQqQb)bk0b+&HR>Z'UMj5[V#kS4aDPP7e`al0&PKBE27ehh;8b4a,IqFLGjGuX=5,em"aft@%&Es@0Z>n&c5toY2m@as/3rrC3!UCe[7tO<J3%A:c^LMdd.;ES?1k>&T^DU^k&^E9bN;/,.2RD]g3Egd/=O8oRS"??1K^4@H)l\E;g=4;3]OQ2l?tM0TWDgFV?cuo)Kln7rqR2UJi#F&%DF"*^32n:ZVICj0F[:q1-&mNY*)+B;RHm44i>C650T@X(G5]7q2OI2'%VKC^TFpC7]&$h\EnCrm6ZIi@#;CW/*:>Vo*F)r?=8@qEmUs#qaRoTF=e6gqO;.ufe?=]UG]Sb#RKOFG;>nGc_79G#fSOVFM6V\Qqe<:GMk\&C,;e$u1amDU9'_[F;\uq+O8W22(TkNuBt_;@R+#ir\]/?4>*bgW^Q0">rCk[VZt+jN.Wd<KMXEAkBeE$[Xs9\\F8jL5kS%c17?*]GGZZ-%0^m")$b0%R%/T*Zn6uWckY0>kP4Ju7\rkqgB8E`>'0;t8%>jo_(RY9f'`2qqS5j[0N/9p@8OHi<-c?L6.61P+%6bRCK=j6-aK#c<i#BUYH$l]8]9FCif[F6'i9:@V<q9sI^OAAK0an2f7KYdOY8K42[R!C-NuT\@r5i>UiJ3HTkmh@(h]IZsB(OGq,S-ZuAh;E729qm]<kD150L`+OG.[!/RlR=jW%_+E*&VDkdOsts9.l6D[`(>2Mb#tV9G2.`P+H%u/oP4lH'a^dQt)ieP]8Dnl'`_i7'V:s-,ZI-^P!Va;>\IP]sPPeAWdU-@j+D6(,J)20:]9%64&o^2_6CU:?19&WB*hT:6Moa:5]YZNT]DcPl'i"Cu&q<*RUL/U<]1W_:P]3)Ae48FID9iA)Y+1:+U?fhXDlE*orpOYYogGWHEu;2p/PT>F%HE.LPI'22:D_CRHXO>g,L$H'WJRlQuc<$V&]H&<i[VJr(680;rAlDVN=Ja#VDn=A?<!SJl<7$O-sW^rje\8C.M.g,;jgs736(m.&p!mD==$[O>A:iZ)^/2#0;S*NIi/p:q1JmFu?BI_[CW)p+k!+OY_3V[TZQ9cLcaq`AQ!BF_WWe*W_6og?ESeo-.k(L4*mV4Mkkk9QpMJecZU<EAY7:FT*&BpOY4%JWP%&:UD,^fd3;c)rS9J"uop0D.udZEiWUTQi1WFFaQF`2Y"G5T_.hMUR6C[I?*9-@XPK(HEU^UudUdWMcRG40Vln]h+B%]i>IAK?8)6b4>M.**n:\FmEV+]%Q<[0<5,oYVp`2_:mi!hobt&0jW]8qq'`^s8LcjO7+UR),&_hTZ;U*e`2U\:3fWZC0M?q3ZW=&DIct3mVm?fs!Js/1O]9m\khEW9Aa9R?_CY#MPJs?>`$rf2Lq\!J=tFkHfNDVL1GZWpB,Y\H)Rr7FT.NQJfAAH35-PTN3pr#+63_BUp_cBD*e2W&#_")`JL>/UaPAkIdZ:sm0\t9G@JKJ*:Op9a^Pg%#PQaZmHJ>b_/37@<E:fTrOir:4gc9e#qqZBqm'Z-\:hFRs%ZJdOKkhF55bBHBqUGVOQI:=g\[YSS)3,2qW:?ed8-Ndp?[,U!*kP[O(G8SB9J@OCWCR^:-,#A3QdT90H,rJ`F(fTp6!KiitY9uE`Y:!k/dk$qFS[>*@)&lU<b+heb-7W=_jhZ^9[F+8:R&\X27;hBP!@8`DDc!/20/?s4Od,",Rm-]Q4B&UJSj1:sNtb'.Ml\J!*ZmrAjbt=>#Y\jM`%#b'_](gFo#SZ\YYJ@d,:\<VPf,Y5YL"PS8<'rl?D8&+pPt.-_PWZFPG2c%GYR'1"?0ES\HAed2H%diH`:Q6(5h<EB.rn1a!6QZXquW$G,UmS9^u]e3mLS,BuiqTLqbeD\<S0O"BSmAq5^]$pCdb=+&39\DC+[q=_"6hhE*cf@@B+AI#eq^^<+U.Qoo.OcQ97ubP`GJ3IAX/Ol]6T'u>KU+doLM8olLF)0pB@fOiH`e+USTD[Yk`egkL,qE"rGX\`)I2ZN4M+qn95d0^PGceeU%'*]Z93=D%>/QqFb`V)/J",2cO.usK1hZkP$k^P49mFp3J,h6Lj7Go(A_q<ms3IDf^;nj.cju5g?mHI`ogPsi)k.V[5Fe<Y5SMgiD_*~>endstream
endobj
70 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1927
>>
stream
Gatm<gN)%<%"7kOi2&5M)H#SdmQBT?Vs1])-W[,uRdmK#-,kPuWk5'DrI(r`8YRViFuloTOc'Bo"5j/0"*Ao.eU*AYI$hh<`W1Y,49EFK/=>>3p&*h,$_rikCsDKdh#c4"1u%XSgkX(_dHGZac%^KJL9<^Y.ug,uW)kVa_rRC(:p+@Q(sRTo;"/T?^f&NA=>>Z!E!c+X\<GE(-X7p:OuG<=Fd':ro)dpI=I%(1C2Nr>=o/Y8K,3dD`P:48(3,JaU0uq#(%e4XDVl2(G%Gi,Jtp%LlI!'p_2#n=PUi,e:tl0dUI?Wa/DEjN(!U6sB@2f(Y,;l`E0WT(!k-VcoH<iGLqO^7!e,"B(1Mo(o_quJ_&?Qe/U5*`,!iljjH7QZLcM'(Rt_A)lI\:-dlh0o->9:FkcP/ZCD5S\'P'4A1OV+8f8)^4Ql7=0F/([m;S<t\>T"+#.WlO!5FY@qG=le=Ylri3@ECgHRR"O>r8IF63kC:P^P_DA'9>g,7>I6uF*-S&Rd]MIoMk;I=35mG(Q?I$[AaE,D'$4a=V0iDcPjiBMb-i0AhC;q;9chsipsb:B8nVB7V#I6%A98A=M-eLEqWc1A7.]Z$aPWpX>p5/Z.OS])4'%7?dP^Y82;YQ^iD!gJ7U8b::PftHRXE9PN%XDH&,d$3j1g;S-@rg6\B%nN^5@UOJeCY&hGYN1m**B,`cNKg"K0I"gOVH%J>/Ed&2s+:]JB5*uCA9>g#$us7uWb"]EiKb8&^=WpqQmqeAFS]s$n\f!fZ]'#SJRC1dSIg'-PuSHZ[+(C9QskU;/@7AKA,d=-ZV:=iA.(k4V2Z>q2ZiYL3XSg[NRLceHl5beUiYM'JMr<A*1Zej*qOW)GFC]biaH=[aSf^Mes7IitWf%*ojj--9B!h)^k!RIMd`fAVGZb]tLSaX=RCEJ1=<'.GFCX/eQF9>Yi";8O[_Ug7RBaV3u3&Yij3)P?59,uAKm_sbQMW;j:p!Hu;!eH=GX]fdK9Ebe@p=P80(7/qoG$)[J6'afe-q@iPNt9u:k9RV`VAfbqL"<1%Dn;@>7@CJo`e*)FXdlL1%HX\RV5o51NDMoN3I>hToDRH(jOf4LRLV>a:6qT97c<B*_ZZ=-W=^CB+r),e9dU1$;+h6K2L*]&,[5>@^,1P!:dU<m7=p@s0>58WQm7TBguJJ]&s\e?7G5RB;'Xa:\0/B=M_.>KBCPGLarQa"@k*?!a,iP]3t9.*8"L]BNkUq1Bambne:o1dDF1f]?n/&cQ>::kWZ695B;VP&qPmSQ<-["h#p18I&HHMS6/8%6<0%DiapS&!=GGV]XgK9G'OTBG+f%4s5o>0Gm5r?"*5t>Vgm<$)Uj=L,+f7C`cIY`h*/(j[W@/O'WZ98U[R[n1G]A0O)R<ipqKD_Il@U2:_5fO<p:^912`Z5*]of*RN)^0@aC[-!Gta<)o(mqc0*6ggFI@;_^2m1M[6MZZR#OBFa#5ff/hY1hmhi6(#?-89HSKCM(`X/<rd-Rl$;K'u0Kd0ZA"9fRJ\*KCDA"+NHBOPoX)mnj*$N9JWYJMYc4eGAIDHcl/cG@IYViqndq^WQLWB##iB/3KJr@_`)=T"QB;):+A6bjs8%Zlgk8[/PT&Y[%AF2#m&>f;=_!&VVVWtDSg;lT>`kp2^j]/*3-=WiaLp8puELF>*V&R_-=i9gt:8$KQ%0[%]D0o+2]81iI.FqdLh?_<R28=LXd"H"m2?KFnD($_=_far8p%qO7?#*SF\'^9BV)e][/I+e3O?G,:_3Q"+8]]t[/nDNhNp!UPl76'2riS$b1HR/Xe56Jir&jtbe(+XaT`$&g>#5RJ`N2*ac&`^<.Oic>TJhYH#h/4f"s^4Tr8Emm)KVWJ.][mKMrBi*LNOFs/B]:JB@Zk])Z-1d<=@N,F&:r?r4>``J0(Y/KD0kpJrBX/^>X-,~>endstream
endobj
xref
0 69
0 71
0000000000 65535 f
0000000061 00000 n
0000000144 00000 n
0000000251 00000 n
0000000363 00000 n
0000000468 00000 n
0000000616 00000 n
0000000764 00000 n
0000000911 00000 n
0000001058 00000 n
0000001135 00000 n
0000001283 00000 n
0000001431 00000 n
0000001515 00000 n
0000001664 00000 n
0000001813 00000 n
0000001961 00000 n
0000002109 00000 n
0000002257 00000 n
0000002405 00000 n
0000002553 00000 n
0000002701 00000 n
0000002849 00000 n
0000002998 00000 n
0000003147 00000 n
0000003295 00000 n
0000003444 00000 n
0000003592 00000 n
0000003741 00000 n
0000003890 00000 n
0000004006 00000 n
0000004380 00000 n
0000004586 00000 n
0000004734 00000 n
0000004959 00000 n
0000005165 00000 n
0000005371 00000 n
0000005577 00000 n
0000005664 00000 n
0000005984 00000 n
0000006059 00000 n
0000006149 00000 n
0000006255 00000 n
0000006384 00000 n
0000006499 00000 n
0000006727 00000 n
0000006893 00000 n
0000007185 00000 n
0000007307 00000 n
0000007476 00000 n
0000007598 00000 n
0000007712 00000 n
0000007834 00000 n
0000007963 00000 n
0000008093 00000 n
0000008279 00000 n
0000008401 00000 n
0000008519 00000 n
0000008630 00000 n
0000008759 00000 n
0000008897 00000 n
0000009032 00000 n
0000009121 00000 n
0000009217 00000 n
0000010526 00000 n
0000013774 00000 n
0000017136 00000 n
0000021462 00000 n
0000024848 00000 n
0000000145 00000 n
0000000252 00000 n
0000000364 00000 n
0000000469 00000 n
0000000617 00000 n
0000000765 00000 n
0000000912 00000 n
0000001059 00000 n
0000001207 00000 n
0000001285 00000 n
0000001433 00000 n
0000001581 00000 n
0000001665 00000 n
0000001814 00000 n
0000001963 00000 n
0000002111 00000 n
0000002259 00000 n
0000002407 00000 n
0000002555 00000 n
0000002703 00000 n
0000002851 00000 n
0000002999 00000 n
0000003148 00000 n
0000003297 00000 n
0000003445 00000 n
0000003594 00000 n
0000003742 00000 n
0000003891 00000 n
0000004040 00000 n
0000004156 00000 n
0000004536 00000 n
0000004742 00000 n
0000004948 00000 n
0000005096 00000 n
0000005321 00000 n
0000005527 00000 n
0000005733 00000 n
0000005820 00000 n
0000006140 00000 n
0000006215 00000 n
0000006305 00000 n
0000006411 00000 n
0000006540 00000 n
0000006694 00000 n
0000006802 00000 n
0000007030 00000 n
0000007196 00000 n
0000007488 00000 n
0000007610 00000 n
0000007779 00000 n
0000007901 00000 n
0000008015 00000 n
0000008137 00000 n
0000008266 00000 n
0000008396 00000 n
0000008582 00000 n
0000008704 00000 n
0000008822 00000 n
0000008933 00000 n
0000009062 00000 n
0000009200 00000 n
0000009335 00000 n
0000009424 00000 n
0000009520 00000 n
0000010868 00000 n
0000014190 00000 n
0000017822 00000 n
0000022085 00000 n
0000025593 00000 n
trailer
<<
/ID
[<b859d7af6a4738a9ecce4f8413b8de77><b859d7af6a4738a9ecce4f8413b8de77>]
[<36847aa6eb42a713708da2ef65affec9><36847aa6eb42a713708da2ef65affec9>]
% ReportLab generated PDF document -- digest (opensource)
/Info 38 0 R
/Root 37 0 R
/Size 69
/Info 39 0 R
/Root 38 0 R
/Size 71
>>
startxref
25308
27612
%%EOF

View File

@@ -123,7 +123,7 @@ endobj
endobj
22 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 Graph Visualization Pivot) /Trapped /False
>>
endobj
@@ -258,7 +258,7 @@ xref
trailer
<<
/ID
[<ceaa9bb32a6eaf264a3a717043768037><ceaa9bb32a6eaf264a3a717043768037>]
[<02ecb336d8253da2310f8b926dc86743><02ecb336d8253da2310f8b926dc86743>]
% ReportLab generated PDF document -- digest (opensource)
/Info 22 0 R

View File

@@ -153,7 +153,7 @@ endobj
endobj
27 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 production infrastructure) /Trapped /False
>>
endobj
@@ -319,7 +319,7 @@ xref
trailer
<<
/ID
[<87a8fa5b1e63c3bbf3a0dcf885fa3e7d><87a8fa5b1e63c3bbf3a0dcf885fa3e7d>]
[<0498f6a9043ddb9a43e67d247203d44f><0498f6a9043ddb9a43e67d247203d44f>]
% ReportLab generated PDF document -- digest (opensource)
/Info 27 0 R

View File

@@ -112,7 +112,7 @@ endobj
endobj
20 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Crash console \204 open ingest API \(design\)) /Trapped /False
>>
endobj
@@ -232,7 +232,7 @@ xref
trailer
<<
/ID
[<a715c7d986b017c524e6219400d53a60><a715c7d986b017c524e6219400d53a60>]
[<1172dfbddb551aec654c3f5c4c4daf51><1172dfbddb551aec654c3f5c4c4daf51>]
% ReportLab generated PDF document -- digest (opensource)
/Info 20 0 R

View File

@@ -1,8 +1,8 @@
# Open tasks — dependency graph
_Last synced: 2026-06-04. **2.12.3 postponed** (developer DNS path deferred). Renumbered per [20260608_ALPHA_PRIORITIES.md](20260608_ALPHA_PRIORITIES.md)._
_Last synced: 2026-06-08 (post infra/browser/graphs/RSSH fixes). **DNS 2.x off graph** (postponed)._
**Documentation index:** [README.md](README.md)
**Documentation index:** [README.md](README.md) · **Service map:** [20260608_BE_SERVICES_and_infra.md](20260608_BE_SERVICES_and_infra.md)
---
@@ -10,7 +10,7 @@ _Last synced: 2026-06-04. **2.12.3 postponed** (developer DNS path deferred).
<!-- toc -->
- [Removed from graph (done)](#removed-from-graph-done)
- [Postponed (off graph)](#postponed-off-graph)
- [Postponed / off graph (DNS + mail)](#postponed--off-graph-dns--mail)
- [Priority tiers (open only)](#priority-tiers-open-only)
- [Dependency graph](#dependency-graph)
- [Task index (open)](#task-index-open)
@@ -23,26 +23,25 @@ _Last synced: 2026-06-04. **2.12.3 postponed** (developer DNS path deferred).
| ID | Note |
|----|------|
| **0.1** | Stream dump `StreamDumpWriter` + dev setting |
| **3.x** | Register + verify + TOTP + migration `008` (BE + views) |
| **4.x** | RSSH alpha — BE bastion, Android mode, JSch tunnel |
| **4.wg** | WG lab — BE `wg0`, FE DNAT via `xen_firewall.sh`, prod API smoke OK |
| **RBAC** (core) | Admin panel + lockout clear; **5.5 validate** still open |
| **0.1** | Stream dump |
| **3.x** | Auth register + verify + TOTP + migration `008` |
| **4.x** | RSSH alpha — BE + Android + JSch |
| **4.wg** | WG lab — BE `wg0`, FE + **router** DNAT persist |
| **RBAC** (core) | Admin panel + lockout clear |
| **Browser** | JS syntax validated; `validate_be_services.sh` |
| **1.1 / 1.2** | Graphs drill-down, columns, full-width (`shell--graphs-full`) |
| **5.3** | RSSH API validate — `test_rssh_api.sh` OK on BE |
| **Infra doc** | `20260608_BE_SERVICES_and_infra.md` + PDF |
---
## Postponed (off graph)
## Postponed / off graph (DNS + mail)
| ID | Owner | Note |
|----|-------|------|
| **2.1** | Developer | DNS MX/SPF — deferred |
| **2.2** | Developer | Forward addresses — deferred |
| **2.3** | Developer | Inbound verify — deferred |
| **2.4** | Developer | Gmail filters — optional; with 2.x |
| **2.5** | Agent | SMTP outbound — frozen until 2.1 resumes |
| **5.4** (mail) | Agent | G2G6 **email** legs — frozen until 2.5; UI/TOTP can be tested without mail |
Checklist when resumed: [tmp/20260608_help_request.md](../tmp/20260608_help_request.md)
| **2.12.4** | Developer | DNS / forwards — **postponed** |
| **2.5** | Agent | SMTP — frozen |
| **5.4** (mail) | Agent | Auth mail E2E — frozen |
---
@@ -50,12 +49,10 @@ Checklist when resumed: [tmp/20260608_help_request.md](../tmp/20260608_help_requ
| Tier | IDs | Alpha blocker |
|------|-----|---------------|
| **WIP / QA** | Browser JS, reachability | **Yes** (blocks BE sign-off) |
| **P1** | **1.1 / 1.2** graphs | No |
| **P4** | **5.15.3, 5.5** validation + OTA/URLs | **Yes** (auth mail path **deferred**) |
| **P4** | **5.1 OTA**, **5.2 URLs**, **5.5** RBAC UI soak | **Yes** |
| **P5** | **6.16.6** app LAN | LAN alpha |
| **P9** | **9.x** landing | No |
| **Infra** | Router WG DNAT persist | No (lab only) |
| **P9** | **9.x** landing (excl. globe FR) | No |
| **Post-alpha** | **SFU** relay (`feature/sfu-relay`) | No |
---
@@ -63,58 +60,45 @@ Checklist when resumed: [tmp/20260608_help_request.md](../tmp/20260608_help_requ
```mermaid
flowchart TB
subgraph WIP["WIP — QA / deploy"]
BR["Browser checks<br/>JS SyntaxError · views"]
REACH["Services reachability<br/>OTA/crash URLs"]
subgraph P4["P4 — backend alpha"]
OTA["5.1 OTA channel<br/>SVC-OTA · HTTP 400"]
URL["5.2 device URLs<br/>SVC-URL · legacy host"]
RBACV["5.5 RBAC UI soak<br/>API ✓"]
end
subgraph P1["P1 graphs"]
G11["1.1 pending fixes"]
G12["1.2 pending FRs"]
end
subgraph P4["P4 backend alpha"]
B51["5.1 OTA channel<br/>50/50"]
B52["5.2 device URLs<br/>50/50"]
B53["5.3 RSSH validate"]
B55["5.5 RBAC validate"]
end
subgraph P5["P5 app LAN — dev"]
subgraph P5["P5 — app LAN · dev"]
A61["6.1 Opus/Speex"]
A62["6.2 LAN soak"]
A63["6.3 lifecycle"]
A64["6.4 rotation"]
A65["6.5 audio lag"]
A66["6.6 stream analysis<br/>uses 0.1 dumps"]
A66["6.6 stream analysis"]
end
subgraph P9["P9 landing"]
L9["9.x hub / globe"]
subgraph P9["P9 landing"]
L9["9.x hub cards<br/>no globe FR"]
end
subgraph INFRA["Infra — non-alpha"]
RDNAT["Router WG DNAT<br/>f0xx.org persist"]
subgraph POST["Post-alpha · hidden"]
SFU["SFU / Janus relay<br/>feature/sfu-relay"]
end
FULL["FULL_ALPHA<br/>mail path deferred"]
FULL["FULL_ALPHA<br/>no DNS/mail"]
BR --> G11 & G12
BR --> B55
REACH --> B51 & B52
B53 --> FULL
B55 --> FULL
B51 --> FULL
B52 --> FULL
OTA --> FULL
URL --> FULL
RBACV --> FULL
A62 --> FULL
A63 <--> A64
A65 --> A66
G11 -.-> L9
SFU -.-> FULL
style FULL fill:#1e3a5f,color:#fff
style BR fill:#991b1b,color:#fff
style OTA fill:#991b1b,color:#fff
style URL fill:#b45309,color:#fff
style SFU fill:#e5e7eb,color:#374151
```
---
@@ -123,30 +107,23 @@ flowchart TB
| ID | Owner | Depends on | Status |
|----|-------|------------|--------|
| **Browser** | Agent | BE deploy | WIP — `SyntaxError` on crashes/graphs/tickets |
| **Reachability** | 50/50 | deploy | WIP — OTA path, crash URL host |
| **1.1** | Agent | browser OK | Open |
| **1.2** | Agent | 1.1 soft | Open |
| **5.1** | 50/50 | reachability | Open |
| **5.2** | 50/50 | reachability | Open |
| **5.3** | Agent | 4.x ✓ | Validate E2E RSSH |
| **5.5** | Agent | RBAC ✓, browser | Validate admin flows |
| **6.16.6** | Developer (~99%) | 0.1 ✓ for 6.6 | Open |
| **9.x** | Agent (low) | bandwidth | Open |
| **Router DNAT** | Agent | — | Open — `router_wireguard_dnat.sh` |
| **5.1** | 50/50 | nginx OTA path | **Open**`SVC-OTA` ticket |
| **5.2** | 50/50 | — | **Open**`SVC-URL` / `settings.json` base |
| **5.5** | Agent | RBAC API ✓ | Light UI soak (optional) |
| **6.16.6** | Developer (~99%) | 0.1 | Open |
| **9.x** | Agent (low) | — | Open (globe out of scope) |
| **SFU** | Agent | owner spec | Hidden preview on `feature/sfu-relay` |
---
## Critical path
```text
BLOCKER: Browser JS fix + deploy ──► 1.x, 5.5 UI validation
BLOCKER: 5.1 OTA nginx (/v0/ota/ on apps.f0xx.org) ──┐
SHARED: 5.2 production URLs (apps not f0xx.org) ─────┼──► FULL_ALPHA
OPTIONAL: 5.5 RBAC UI click-through ──────────────────┤
DEV: 6.2 LAN soak ───────────────────────────────┘
AGENT: 5.3 RSSH validate (4.x done) ──┐
SHARED: 5.1 OTA, 5.2 URLs ─────────────┼──► FULL_ALPHA (LAN + RSSH + RBAC)
DEV: 6.2 LAN soak ─────────────────┘
Deferred (not on graph): 2.1 → 2.2 → 2.3 → 2.5 → 5.4 mail E2E
Parallel: 6.1/6.36.6, 9.x, router WG DNAT, Android APK rebuild (WG route fix)
Off graph: 2.x DNS/mail (postponed)
Parallel: 6.1/6.36.6, 9.x (no globe), SFU post-alpha
```

View File

@@ -2,7 +2,8 @@
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 8 0 R /F4 10 0 R /F5 12 0 R /F6 13 0 R
/F1 2 0 R /F2 3 0 R /F3 10 0 R /F4 12 0 R /F5 13 0 R /F6 15 0 R
/F7 16 0 R
>>
endobj
2 0 obj
@@ -17,32 +18,42 @@ endobj
endobj
4 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 716.2874 87.90904 727.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 14 0 R /Fit ] /Rect [ 45.68504 716.2874 146.165 727.2874 ] /Subtype /Link /Type /Annot
>>
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 705.2874 113.277 716.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 14 0 R /Fit ] /Rect [ 45.68504 705.2874 123.061 716.2874 ] /Subtype /Link /Type /Annot
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 694.2874 84.36504 705.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 14 0 R /Fit ] /Rect [ 45.68504 694.2874 130.149 705.2874 ] /Subtype /Link /Type /Annot
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 14 0 R /Fit ] /Rect [ 45.68504 683.2874 87.91704 694.2874 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 14 0 R /Fit ] /Rect [ 45.68504 683.2874 113.277 694.2874 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 672.2874 109.709 683.2874 ] /Subtype /Link /Type /Annot
>>
endobj
9 0 obj
<<
/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R ] /Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 22 0 R /Resources <<
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 661.2874 87.91704 672.2874 ] /Subtype /Link /Type /Annot
>>
endobj
10 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
11 0 obj
<<
/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R ] /Contents 28 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 27 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
@@ -50,34 +61,19 @@ endobj
>> /Type /Page
>>
endobj
10 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
11 0 obj
<<
/Contents 24 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
12 0 obj
<<
/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font
/BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
13 0 obj
<<
/BaseFont /ZapfDingbats /Name /F6 /Subtype /Type1 /Type /Font
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
14 0 obj
<<
/Contents 25 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 22 0 R /Resources <<
/Contents 29 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 27 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
@@ -87,104 +83,139 @@ endobj
endobj
15 0 obj
<<
/Outlines 17 0 R /PageMode /UseNone /Pages 22 0 R /Type /Catalog
/BaseFont /ZapfDingbats /Name /F6 /Subtype /Type1 /Type /Font
>>
endobj
16 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Open tasks \204 dependency graph) /Trapped /False
/BaseFont /Symbol /Name /F7 /Subtype /Type1 /Type /Font
>>
endobj
17 0 obj
<<
/Count 4 /First 18 0 R /Last 21 0 R /Type /Outlines
/Contents 30 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 27 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
18 0 obj
<<
/Dest [ 11 0 R /Fit ] /Next 19 0 R /Parent 17 0 R /Title (Priority tiers)
/Outlines 20 0 R /PageMode /UseNone /Pages 27 0 R /Type /Catalog
>>
endobj
19 0 obj
<<
/Dest [ 11 0 R /Fit ] /Next 20 0 R /Parent 17 0 R /Prev 18 0 R /Title (Dependency graph)
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Open tasks \204 dependency graph) /Trapped /False
>>
endobj
20 0 obj
<<
/Dest [ 11 0 R /Fit ] /Next 21 0 R /Parent 17 0 R /Prev 19 0 R /Title (Task index)
/Count 6 /First 21 0 R /Last 26 0 R /Type /Outlines
>>
endobj
21 0 obj
<<
/Dest [ 14 0 R /Fit ] /Parent 17 0 R /Prev 20 0 R /Title (Critical path)
/Dest [ 14 0 R /Fit ] /Next 22 0 R /Parent 20 0 R /Title (Removed from graph \(done\))
>>
endobj
22 0 obj
<<
/Count 3 /Kids [ 9 0 R 11 0 R 14 0 R ] /Type /Pages
/Dest [ 14 0 R /Fit ] /Next 23 0 R /Parent 20 0 R /Prev 21 0 R /Title (Postponed \(off graph\))
>>
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 520
/Dest [ 14 0 R /Fit ] /Next 24 0 R /Parent 20 0 R /Prev 22 0 R /Title (Priority tiers \(open only\))
>>
stream
Gatn"?VfE1'ZJu,.F'/*RceJ,EO%OCT1p4BL&)AfAZ;BVg*Ca`(uLpSQ5(">W$#V"M<o#MT23`Y805-cQ4)W/_l".L.Ca.i+qhCa*4sUj&Ns/A7\lH7$*:O$l9+$R]I[Tj[*]FG:Sl;YXAO70#WEtlPL_K)DSZqmA9nQYH3)Gt:s-Bqg_>*JXfi=pmWXFZV(AL8-`4U1mr9"uG4kt)(Yh2<52XDJk<(YrVBjA!Wf`ODK].96WeFTl;GYP\aF<.@);c!B"^K:+=b/>-YptYlg*3\f?[st6W6?k;2]$.2([Q$!agL0oamhMqr1&*jf-m+LqDrd]!-0,eYHRtQQn:IsV></N%D-\B=S]1Z[++OjIC(:ogVqWH]pH7hd%FkDIlk_`Du&3.AIi.7`74>oA[F=OBkdc6(;-?5oUqg'c#"m-B:OsBIpBO:anNp-f8G:O2mJaQqPj'tXI:(!WofnbCI2q``^_EO>PU?U&E9dIk\f.`$'Ei6%lI_'W68<W3\e-"7Ls"^."2~>endstream
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2075
/Dest [ 14 0 R /Fit ] /Next 25 0 R /Parent 20 0 R /Prev 23 0 R /Title (Dependency graph)
>>
stream
Gb!SlCN%rc'`FV1EKO]tg*I.LU1>"X!,"mW$sqrImY2l&$JCRU\$kD@:=K.<?0Yka/MYA]/9WR@p[F>.]Hf-@",\09r_=4/-R1T7B>?KcVSEUL^o.KNUV1Sm/4LP@QlSa-YW<dKKl(3\1_WHKD)00sKA/Q]agTG",%7jo7Kch%)cXN7_*QCMDd`ORS9XI+i09^$'YbXi")iJ"(jghs_TE6Q'/aLeF19d$d/D`A>[.^j7Mf])Z>dp$(k$t_)qEu0paPU<,Si6gea!PB-QS,NC4N*a^pi[g(fOr)>RfolS;63?BVe6&*;"lO+3ZX(YaKdQ]!AYSLJYf4Qj-?o6th>`.=_]YUfI_V-+RlG$nkU<m$])7_AP;kL^=>LR(bkYl4[ZD<X'_@56LK&\.U^MjO]Vln1/dZ?XZ1804LFKinHLb\-R=!T=hB0"P=oeP%812;8Aq,Nuck]FH:CX/*EBnP>I1k:[i^N=rg(ag4U?fH@jo>I!+VfGj\AA(AaTqU@sIZRQ@fE].DcUT7ZBgmr+\p8phF\g<&WdZAXbV(:r<[Gl[/)i&M0amh`$:(A11=l,1c^eFVHQQp`!b`4UA$h%#g<2I3DPW5NIuU'`a5#0uM:7@`TQi6ngf6Q4[+n7FisYO2/DK\^TbEan*dEP:gr&AO1)+^4#:^Z7,$r5`B<>Aq&4KY^7S[q;B-a7-RIcF8%>i7r8=C*V/7g+sk?B>>oW3bs(\'_rXULEDtAC,LOccBf)B:'g<%'4Nd3P'Ch>Lb'/oG&XWk]("ODcWk*=o9[_oZl4r/4d`S>dNb7G8\DL0a"1A#Wtk9<Qd)&aNre'gUCPMZ^sOLKD@nh=]\#YZk0DDG/ZTE;?*(][hYoV9J(Z%eDAa'?$+]6W4l.FA@@PRqG%mBpc=%QYB\G^-YA"?2JlF_HHoP]R;I[G32eBd&@_bYrA\_2Q^hbo?^f"XW*&_BD;I[F>b(/BfJ-fr$^EPQi.ACNX_q>fK_\(CWAkLacKuEtql9]#"PaI[SQ1l:t=Mutsl5PpYjVFM7+Zf9s\7^*1a^^QG1uI1M`adHL:]8(uqSC&%Cco2q"AVC-$G>uL[n];%@]Bs00Lhs]s']s2"</2K,]+V'rXC<ghT(R0SKbce#KOT6k;:t5b]Wc(s.;u]pK335+*#"oJ?p8D>NM)Z*DA0FoPtdL3'I-pkOk'\"lXu!I;f7s&ge;d^hc%)n*qOQGjA'-[`bMa8f7O^lL4S;8"i;o<.LTb.krM\\_^E&AWRqV\DG7n4?U"Z]SM^X-PC]eaNN*^C0]1sRHOH8EWtIlC!^)9TS,XgYjpe!oEl^.JIG@8;)LloO:4Wb!noAA@dd%AqpkX+c`5*PNN:M6f"Ua`?l-tGX*uu"-BF@9^)()(:]S/sqO?uE0A*,,9,rgNo5TDt/a6]i^>?oZ+PH`]np4AePp"C;om56el8MUG8g(WGi.rBOWg\[7<<mT-M.X,(+NI8TC<*93Sg&QX;rK\W_tQ,jiDXlu&;r80Q:,+s''5B5i3;Ma;<;D[[46fZG@@\!UJ>Y3&MH:/;l=7uYL=`O)V:J!\JM[Ve(K-Jp(d1P,H$;1J*mP[?VRHIN3<Mi.#cM_6fO6aK]ZHOTn,\),Hs&a0&uW_Y%Rll#=7T/?kHOe,&q?/e!/Bq)RK2STQt(-SFot=@pSOnUOFSYC.--dqOP4#2!J'&)IJ+><j):1*1(Gg%=ZK#^Pq&jNN^0:\a#OO>H[KRpjK=1a/GsjcaC:>ke"NS=OtQM];pn)k9qKX6fIak?M2cK)\ZfNq:]NE!n((/`XAc@)94\+>;^W<<^L5L!!^KZ8G(Y'_U;L0>>h0`puDigD`.820pS0X[*VPeb`J!Oh-,Z*3e@:dS,96Eb=H!k`+0oQ?%=`!Gj@E(Um8fb,Gg*%U+`%FN":?W]Oklee/'q$:R'=/!oo3"?f,kZI'o1P1ZP[hLC8^nM\DcP(anY]ZTVr[l.ubcIF"2i1NXIN_EhPVCWV=Fj6_$c9W9^5JrDT[g#hMF<q4$Gom`VE<mmY7&7W7cTaZi>.<,0]641re.+&`E<65)lGdo&m69L4oOa%.YrrSFBBX[~>endstream
endobj
25 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 896
/Dest [ 17 0 R /Fit ] /Next 26 0 R /Parent 20 0 R /Prev 24 0 R /Title (Task index \(open\))
>>
endobj
26 0 obj
<<
/Dest [ 17 0 R /Fit ] /Parent 20 0 R /Prev 25 0 R /Title (Critical path)
>>
endobj
27 0 obj
<<
/Count 3 /Kids [ 11 0 R 14 0 R 17 0 R ] /Type /Pages
>>
endobj
28 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 586
>>
stream
Gat=)gN'#R&:N^lqB],gjc4BeHm=J>C<Oa<6h\X%P\Vs3]EHn^T(^pJ#7uG$'h*hEe)q.qe(qolil.)\aUI+_LX$V:`ke8KP=1#[LRrF4==gf.%\\J'Ybd<iY!cHFRO`]mk%LPM8ECK0\;"oq5SV$+bTa3e[NhJlcUbq/7OmXHdTdUU[ZG1^%@Uf;gPN]C5Au\.;@eZoQ:DB%1DJcHJ8=p37DpYMDr@6*XZO0RH;&$>D<`/hbDNU^F"iYjK`uT*PKZ3W=H]k6=l<%rs5f&XXbb[QL4e!:#t&cB6,)&,4SLIO"9\80@5'NH-5`38rP:Ha^%BU:_4MiT/;"3tXhV#c1-455RHCPH_B@7n>cH`\Lb"V4QgA.I\!U#eA*E>OcqPi-Pt2b$E:J3EfGa)9[bG"s^Z4e-+qD)Y@Sj`KY:ZL,1[/-YAna%1i>sB;/nX8;5n;B74O'eO@_4dHg]E#$21VG'JDW57mBZfN-j>tNkoQ3Na9VN5K'G1G#0mGkHrl06<(&g*8j$H+Z#)>9Yh'^Gieea9mTbKrP]r$?ZX#]Xp*S>6GREc-L"8]b)S]%e+Y:\(95S;%$Yc"^F>AZ(kouRUj#D9%N2(Ae^*#e>.>)a63!CZ]khaW<!&#*m$-/4X),aleM'#+-c`3:Th7N?l32N)0@.S20_Ll;ldUd)UT5Wg*?;hoSU8VF=o;Q/*4nSW4?@QqSjY=B^nV4a#/daE0iHoEhi:&GeYA0E'odejENVpM7$`h8AIG_*V8L8C(qnb#m]7B:\%Et>[=F(u^7!]uT2H1X]f&X8reukr'1G*F[14r2inMJ?*2>=K-S8tHCcECU6@e(R&_;lo0]SE\k\=9*A$)[ssCt[d3CT=B*p_&8'a!g`X*NW^*H`@c/=T8Bo8m)8~>endstream
Gatn#;,>q#&BE]*.IOH7Rch$;38#5iYXq3WUOGTt=lReEBq.0feo/m2/O`&2"]SVs,l?s.n,Bm["AT?Vhg>b"`PAB-";G69^kbEecJd8Hr_7>N)(?=KMFX>IAmD2Fh4nK"'-WVD-I\@J"IN46N=c$4K\jY<N!?U6#m$uN#pFTqP`fHK[lB`VVAH@O+Cs<c%^(K3:fuF"Cm2'\`b4\u#g=AE+5l2NH\D3QeiqS#R<h2"*7Ga5p`H5&VDb[2;j/67h`-,*2alC#B6Ci-+SSm7nuRR($TmKP+I-O_d;-i%!>9SWiseMmF'Lgf4uM$^g4CguG>5;9kXGPM4hP'-5'iTt4iFc)V-UYo><qH/o$Os]i>R&c1kLA'6ZL=T(KutR8D]Wn#%\31S;MqRprZI1X<:KnG<JK(?EU8/UHk":'ZFC?P8Ds>'lhJ/-#TZPTHa43>6dVDYL5f&IskP-`_*NR'7@&fj+p1R2W,T#7h/#6gthh^IYNd6l-F-d4T@.NrcWQLqp(MHB&n%l&!^q'Xr83OpWiMN_X-=lmOES@(KOXK!P7$oF["/TYeHfQZR0$=hm#Ji0R3XE+`8P~>endstream
endobj
29 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2816
>>
stream
GauHNqet4K')k%D`?;qsmV]%\Pc2XrE.HD"l<ZAgD&9lQE[YIVNjY,uY9_01rq/A&bEAWuGB$>]=68obkMqZq%;>l!rfHpD`>[ZD#3XS@#_gqELaoAX]7m<=amUT&[8`Qi),+'s2[kNlVMb>V)*=!$99C(8ej*d9H&IIckQ4Ri1,1ZWjth76_6"GA&AEGuDZ9c;VV6A7J#a3pK@t/KTdC<Q.Zm4n2(C&Zn\]&#He_@jd^KYCEFABNmeRkD^uaAd2HI0dRkK$uE;T0r";C3?f5lsJ+Df!^A5+tr%r]L\L>U%8dJ[T4)dQ17[4TAUZ_%@.?gstV#q"oBWXC.g%&d_#19!3?Ec,j3,p@k48eWC_r4Itmjd<L`?i/15a"m/9n.\uoQ#IgJH$i[TEm9\VKeUl@=a7%o)cU5Q8;aCg\cIu>W2Y[-3Us>CU#UAlM%Zi)H_Nd@@JLR'MP&Bd=0##j(f#e&ca8m*>&dR&#[E&u3[&tf\-UXWl?G&1,cCusZP"tI["Pu+2TdgG`Pgj<VW^5]?.MaX<N(RJGRWl.+7THg@V;s?l^bgMp3`D^O`iB5fXGO+'$BI+p5qIs!cG-VhQAef93feD5"h5bdXI%thZ>1b6/##<<W=j-nRi,Q'KP#Km/Rl/EaOS:l)!4p%(<dc'E7'GkQm4HR0V%.(&p##T8iANmGLm&*8`h'6'dKt^E3[s<s$7t]<G_k/"l*S*ETj4h?fJ^@40Og-a;CNb"=!!a$7W3+5K)4Tk=VEA&I$0q&+RO/liO#4cd2aN`!4!A%VRKaZ[NnZ>N%4S'u:7i*,a-Xb5<]4imr8G6ZZ#R%oBlS3Q>dr.TLTQVP>?QKq0%l:ol)i7fq*O!%^)5Ooh&E<#ARY$.Qa^5:9riQ&DN\+#$I%$OWBp:<0c%dg[a@E-;)a.RVS`=IG;_8>;7n0-g>*TM[D^3I(ka0sFpY:r?Q-eANd!+*Ve5NABn:*bJW.RP(on2\$>6/Z%7p"'!cJPRmlis*'hs)RA=jh4s9U)F57At]6tZ3F!\Ka)qI)DE$E)Xo1k^k>d&^o+771L$ORT99CNc")jQf^af>CgZJGNlH/t9NGDXJL]oQ?E])?8ooWV@V;2[5)_aV\P2Wj#GK%k;0ZZ1clo^MW^s//:l?NsQ:E7VC,+4i>:kn.\0WlZ'c6&,8O9c,,K'EujUkpi,jVa]"R>s29@ZAjQ7/48;2K`)n6aULrFI$ecs8XpSR>+DpbJn8g*o&a*6YNms)U@E?RIigX25c1<.@2+-/)*f-eMpckmr71#<OH?_6WHYLER0io@%']@^4_6:FFe)q<8DRo&fr&ZSQ1JQ(7glQV)!S3W1gQ%s%N!hlJEMKr*g=ooKB<^Cg=qE^.@bM,lk\Pl!1eR7aQOV,"6@7tsgpMqT'6%m9e*lR5_m8J&iL/Hc"`m_RIAAVg7l%ccMkc,0aW8C`PjUKV8D1mQ"bR&pRXP4P$RmdK>BG9(`l`@9Q$Fsso3nE&"aQTp1h*4$1FF`]6Ng:TCJ=<>[H6l[^a4-!=7mrQugFh/-$7?K+Dh3@cmYZe%CJSJtOs+cD#rDdOHVkekt-&EWslMP'TC.6^:&.n7)6e5SEneoh#<ib/HgoLU@j'NB@7P'&;F5XmT'jplXSM5ZO$DSkLJ+bN,XZ,G=)=36mS*pCXI>\[]Xm>`X_IsX?@+A+9>ZE/^6/R8=E;[M.?6O@KSTZ+_9(5"<[6rK<kZZrY/QISZILN4uEt#'K.fU,6UIX5lAh1$?m,#7%oh<s#Xc@!g6^$;m*PHG_QOTo?004Es%c_W:\MtIP1[a\]LXoZWI2e1)*52hC..,l;js';=+V3N&oF*,&>-+g9j5RB1+M=b8&K3ItJ('?`b0Vl6TfB:bSL<m>^K`[gUpAkRC##D(X5'BeIDL=@kCfYm:Vih$@&-0bF`O97<Hilo05;:(;s'p/pf<GP@IYWePE[k2WH'SpPF`YLj7T&'IPs=g3k=WC<r[/=`gX;(I3&dkpg3MV@$PJsID<d@Udf:V];U"MYIdt)]-_6I?<`m.g^`d6.+KrQPQDJ+PIlJp*RB$FA9O(#<S%>4"IWt(<n,E\B/e[KA^#8eU&.`a^!iCY%-fk07nrHq+OpG$omaSFY!K:$%T+BmY%daZJW!</cIC"GmcB1+')![:<c$i?e[7jI7PE9sqS#/?9(dbDY7Fa75%&J>;4+2;_VA3,>,e7Cg?o?K99">GeWiVX>[(ki\fr#(EirMS5U8?M?E7sFbcJLU[_Ln%j_aE;?B]Ka?>6?!^5ABL3Uo>R!FP]>g5<+p*F"(p(Pr@<arpt`W5:8+EBGjZItpWDLgYCgQcFWk_X0J]+pU`CLJsnYinF7P&9GP02m31,qS,o5n`sZTE14nIKrD>pJ'N]<Ismp*o[Sl$Q`D7u!sCs,']0U+5YS>8+$VoY:3l?q/9k8p@PO6@Q&EEb=!/.<!<R;04hpZ#9HHsL,aBYjYJ)/n+Ol@;'&3t*l+HM#6RiLYDKn>/2\6]/U;G\Pp$C@'ii$=MiHS0f#^(Z>>2fTEVLZeO9Wm_I70b<VK7N%%"LW>J6jEnTbOFj6ZdOpA6O)No[a),1B*9'X/-ffXWQu=J)J\KE-J[Ho_t3,Io9W'".]d<B(AcUC8fL4Oi83EDq;QPU<k1-<<+1HfT-)$mXO;h0)]\k.G'luM:R+D<0[_(;^-c@TQMZPR,bBRh3*_ft.IkZGI_fJ;EFtN2/)GW2#+3kJ[@Q@3Huf12YDF.Q>u-1cVf?<CVT&/?pN82N&c(tU[%&dZ&!uk1Mr`oiQ6sofA%;MaHi%b3r_C3"(?=aMBr45k8F`hg-[u2t.gpV~>endstream
endobj
30 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1850
>>
stream
Gau0E?#Q3)&:O;V(ocece!k1+?'^Q8l:O$UPI=MUg2?dsW?M?U=op-":&8m[qjdn[&'#O<;A7$pEb<WKF,"+*-trBKo?WnQJC,?shbp*UjoJ;LkV/XEGWtm_TIWZ@&Ao-L%YdQ3`bcaZ%:3D<IZUB"DO1+TQ(,>e/N6ID#KTG/-^7IP@"+/3";p^e!%dAD#l$3E_U6cGE)%k[KqI]3k20VHV?)^1BH3V(S^WK3,,^Dg3N\`"G]*'Fo46;1'VZ&0D#i<#36"Ua#'0K/U5kpcbUOCd(e3Pq%)ENA?t-kn>@tVp5PG7G(e#gUW6\`]*8Vr<P+K;nJtPD0Qt,aqA)!m4oQlEMMYq1hb_AP[PF>D3('?j=^'!PGNW7eT"tEQ&0pr$^Dco76@%B;3S@crd&B:=A%#\Qbi5^b.`bOi-E0V?>!o8aV)pp4V;1-5t6Sg;:VI6i-AQm)oQDpXm9c.FG*)R3F&&B3\PeUuQK@XjXXb@5+$$Fnu?I.VS2`!d)Cq?"]Y`i5=p0b>Q:?([2lJQL^E'(7@mD6t7-SNWM7D$tn06RcJ][j>(Q&_X7]L\jceVk6.CrKfFFmRpeCPl#)&dsnF+54o9fM>_>)/$n7N4g!Sk2V0W/KosTl+([E?,K:L#Q62pZcD/3Fa^j6h<[s'BW<+DC%AXd&ZeTZ?JMp5mG.PXejBXak0Y#.ruk!`pJ:l@=BdMfMd!]dY"Is1G?;"Vb_2KmhL0HtiTtcY\^0:m:!sc^RQ@Mr`:,*rQZrH"pbm7:mZtmrGk8i!2FVK(`[k-CVS7Cuk?`p@R'ju-d]Sph7YHJ=/@6JPWAF8a:7\uGm;hX1K:C[;67rIiSke2r=gf\&SdF6`'h+dKp5",MhS$'2Flr#LC59tC4lWY?Iu2-a=,8`2*b*\F`4^Ei$F)WJ-3Yra?q75^!ELT:#d@m@``Me(iEing<"F-2ZqoL.,HT2J&Ra'a%rdR4mR=``JCTM,!j'])&Rb9t8J'`!i*Nef'F8hjSNO+1$DW'?2`lopi6KuU]DgeZU$$#ON7f&FZe<;-+k/SF5t&0nJ#nK+-_??ge)!\*&)k*p;_Ec$?V2c+leR=N";,t6U!<Fb]tZH0U"C/!"u3\8lG_U^rgEf0O-0b7.i-&&D#<mcNJCCbFY=Zi=F83p6'B*fdk0*J?V!ZnA%J[$2L4_VV&/OB.gIB:D!IdO\q=cWp7=T(]BbK_3dFd[8X1BcP/du0o^&>/n'e]EZ)1fl=?b+(#dEkeXpd#6afFU[1_8-GV_Id^+5PHDk/D4-QJ6M1O+6$l`+#Sr-u=?.cNckR;n7C&?gTPh@0EnVdcuA633:X=CF1W$ErWBSiNS!Fh10HH69),8pfBeH2]s*+OOdZk<\<)^lNiO%5ViPNKf@Uh>IJG"!?A3B0'WFsec93&!(R2XWEuC/>]i'*K#a6aA>mGi6%sAc0/?8]j^='tg;qHX5?eqo(l$:>2nX:,&W>sE])f<3"2uk^dko:c)`Pq6!a;e$dM(58l)F,5)FLmEU)?ZX:Hsf9-NL2!2L%H=+FJpY='JbVc)`WQNoP03WVOhpP352omQSC<?U`!H<ngCFert/=r]!-)0/Ba`c<IrhV2mP:fm7s9ln8h_I7rkYKejaAS`J:"DQq3i0Y+NqChIP_[%*J13V1L`>[9>!`ej:!,F#AO^T^/-DI(/dnX'1/!!sK5b@T]4kj,qTe-^(XnC,n]E!^NI5nZQ!ICD1$O0%V/bbgR-'1U/J0jN]ZPP@>*K_cr[YS=WV,bG5Y.3rstMYuZ@-dZ@Un5\Ln#e%slimn*:cgr+?+ZQ`n-D:[ieH\YDlc1]B+[e:KPR5+PHYgC`1a9.p'I<_`rr[$'CVK~>endstream
endobj
xref
0 26
0 31
0000000000 65535 f
0000000061 00000 n
0000000145 00000 n
0000000252 00000 n
0000000364 00000 n
0000000512 00000 n
0000000659 00000 n
0000000807 00000 n
0000000955 00000 n
0000001070 00000 n
0000001311 00000 n
0000001417 00000 n
0000001623 00000 n
0000001701 00000 n
0000001785 00000 n
0000001991 00000 n
0000002078 00000 n
0000002385 00000 n
0000002459 00000 n
0000002555 00000 n
0000002666 00000 n
0000002771 00000 n
0000002866 00000 n
0000002940 00000 n
0000003551 00000 n
0000005718 00000 n
0000000160 00000 n
0000000267 00000 n
0000000379 00000 n
0000000526 00000 n
0000000673 00000 n
0000000820 00000 n
0000000967 00000 n
0000001114 00000 n
0000001262 00000 n
0000001378 00000 n
0000001632 00000 n
0000001752 00000 n
0000001858 00000 n
0000002064 00000 n
0000002148 00000 n
0000002226 00000 n
0000002432 00000 n
0000002519 00000 n
0000002826 00000 n
0000002900 00000 n
0000003009 00000 n
0000003127 00000 n
0000003250 00000 n
0000003361 00000 n
0000003475 00000 n
0000003570 00000 n
0000003645 00000 n
0000004322 00000 n
0000007230 00000 n
trailer
<<
/ID
[<c8bcc4e5aa667718b0d822771282595d><c8bcc4e5aa667718b0d822771282595d>]
[<5097cc94053c3b6e8997e7857bc38449><5097cc94053c3b6e8997e7857bc38449>]
% ReportLab generated PDF document -- digest (opensource)
/Info 16 0 R
/Root 15 0 R
/Size 26
/Info 19 0 R
/Root 18 0 R
/Size 31
>>
startxref
6705
9172
%%EOF

View File

@@ -133,7 +133,7 @@ endobj
endobj
24 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Opus / Speex / stream protection \204 validation checklist \(task 3\)) /Trapped /False
>>
endobj
@@ -276,7 +276,7 @@ xref
trailer
<<
/ID
[<800b999f5cc49285439507fa35707bf5><800b999f5cc49285439507fa35707bf5>]
[<2caacf63b125206582f1e01401b081db><2caacf63b125206582f1e01401b081db>]
% ReportLab generated PDF document -- digest (opensource)
/Info 24 0 R

View File

@@ -112,7 +112,7 @@ endobj
endobj
20 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Over-the-air \(OTA\) updates \204 deployment schema **v0**) /Trapped /False
>>
endobj
@@ -233,7 +233,7 @@ xref
trailer
<<
/ID
[<8ce728cd48920bf00138be4ae62e19b8><8ce728cd48920bf00138be4ae62e19b8>]
[<fa2a03850cc474009a90bf2128a92603><fa2a03850cc474009a90bf2128a92603>]
% ReportLab generated PDF document -- digest (opensource)
/Info 20 0 R

View File

@@ -97,7 +97,7 @@ endobj
endobj
17 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Pro / OSS split \(cast-core + cast-pro AAR\)) /Trapped /False
>>
endobj
@@ -202,7 +202,7 @@ xref
trailer
<<
/ID
[<cca35018774facb6253a5fa1087adfbd><cca35018774facb6253a5fa1087adfbd>]
[<ec02fdbc59e01cc2c3308654d7a797b8><ec02fdbc59e01cc2c3308654d7a797b8>]
% ReportLab generated PDF document -- digest (opensource)
/Info 17 0 R

View File

@@ -46,6 +46,7 @@ Click a link to open a guide. Section links jump within the document (GitHub, Cu
| [20260608_ALPHA_PRIORITIES.md](20260608_ALPHA_PRIORITIES.md) | **Master priority plan** (0.19.x renumber, owners, alpha path). |
| [20260608_STREAM_DUMP_DEBUG.md](20260608_STREAM_DUMP_DEBUG.md) | FR 0.1 stream dump spec. |
| [OPEN_TASKS_GRAPH.md](OPEN_TASKS_GRAPH.md) | Open tasks dependency graph (Mermaid). |
| [20260608_BE_SERVICES_and_infra.md](20260608_BE_SERVICES_and_infra.md) | BE service map, validation status, SFU preview (gray). |
| [USB_HDMI_CAST.md](USB_HDMI_CAST.md) | Roadmap D/E: HDMI awareness, USB-tether transport. |
---

View File

@@ -112,7 +112,7 @@ endobj
endobj
20 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 documentation index) /Trapped /False
>>
endobj
@@ -181,10 +181,10 @@ Gatn$;/_pX&BE]".IJp[1m^!8_qmqJ8<[5Zm<IEECRg'3fZ]_+rUr%C9suJ+BS@u<_D]1/rU2]j"Faa.
endobj
33 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3156
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3236
>>
stream
GatU6=``<>&q9SYkbhY13@rmN]ZF9!3!"X4-hgTN8gV@TMR>k\[dUE74VA$W(`8*M-2+9-e([RBfA5G;_]M)>J*m?mbb0='"#%H+$,"cM?oA"+G4k`ihp.JINhXXc"KJ>AA5S]_4X>(d3Ef_I$@K+Wd#hc!AP6dkMB%$uJErfmb[80jfC<2k#p9M1O2Fu_/4^#CA=bc3T2B+nQ$OUd3Q^"F+^#I\"S:+fIKIjIpJ192I;(u#NT)'qJaG,+$fV;DG4`?OhL#SRZ>mrir;<D_"_PMWp(p`l&UuuE8a`OIUf*J<9Fs7Rb43M"aBUIYGL[Hk:JDu<<<)BWOH#U2ZQ!-gY$7h?+-fjR3h4:7+Gj!Q;2<U';&5iMl3aG(cr"@?Q[%d++(#]/T9?:""C=otc&3,F=T4"id\#nH6.\>je&`Aii:-L//PS7?Z77b8=lIZ0N36p"Z7)8N=l>dNb\:]kk&n5Nb.MoSK=oXNK=lTgK=o^PK=lHcK08&0K04A7K6e19Wos>Y1i].8hKr_,j2^)i:L.$qaTB0VC)3@o5GGgsi\&4jM=>e<hl`Vb_>SNr`Jt-W5nl?eV_hS)RX1PGI2o=oI\5ITa7U$$NI`B_Agq[9N"f$k-KYh[1,Z2uoU?Rb5o@PK)d@;7;9)n2=1A;*Ol'IVO5=[bnUcFE4eIot`nTtFI2=3o/fg:/1%%8UJO6<qQQ=5Aapfqq[Y6f<NP[YmgC%>LDqe$NFaN?WDf"^jB5LOaYRI6b4'FWC$N<LVXIM8,Cl/h9-kVobG/L]s?5b3Y[Cm`]DL7U7&aDts%*%052AI/^SdE.WG*:;&)%lF(dXjsk@V=f3KB9BB$aR-<2`^8,8T1Dj2'!RlflX:@@CcrC"9ujJ`.@joo/2rN]')<B;:N_r?t6go,4jnfj[>rRE^-YG-Y(MqrG+QjP3-l?+$Hjm\RY=\%m>\d>=Kq2p&g,c[f&5.T]ot+jSD+:0B4S$`*\T32DOXV3H6tPGNa\_&M?*2<'dUdpWZWdE,49uj2'qd2Ke?W^_$O'.eNQhL_G,(cfJhP[,<6Q>cQsLnDaMddXm-in8V>lSu^&I2]<1N8[!%@f[QtJiKe;9M`FAY?J,WfJA$c4$[lND\]S[KSou!TX0jgR(jMlNbjf@%1FGk"2;hs=JcF[4BajUSNn9AeDsRXeSmdF`ou0CmqMWh-PLiPWI%RXVn'A)I_<<89>.aI\O5<Taa)4W8NL6j*]p&"9f:F!1,hbH;^3>Qs4IG8ppZ,`1o9U46<0u5l7cJQP/=gtn_Pup?0B&*A;HZ7ZeO1)2c?M%E9l(!#i^U2\MX5;qEFLG?2F52l])$f$G[UdtAB\L$SF.VKC&9f[gUS!H'\l&u:F[mH"uQ:6]*[4tg0jGj'J.\FHB96bEeDo_=1H;4*!C4nmQ<.h?[3DtV<\'X3T.T0i>HOW(5-pj`@^R6dc!ZOj7Vtb#`rf]SC,u:YRndY)5dE0^$NgMTI+pZ+s1n]Kbl=3,0+"%^aP3MY"9PjmHi%mX!cK<32?#me=)Clo=rie]T[8n)=(khKNX\^h.]F$4,1/@gG.P^&[=J+O-=EpaV;r^(ceQG?Q8Up9us27USUh(g\6O4Y5Js.$#I*e@!^`^dBVoOiT"a/q_`df`R^+oo2F@_[:.U119q=@nWKoer#B3iHQF:@mR$V+3Xq/m`1cKB=bUdQR_t-F,'[:^;GOD)CF81_1c$_Yf0coYonR$8KMeAh:F@@\.:tE@iPG%N(H6)hPtpP<e]'=DI;0h9qWnEHT>![2d"aT'0N7ohngkA>4*$K_W[Y?lb[b8>%ZN3,-M:I/UJ!?fT-Yfq+\qUpYQ]<DM:n9V4-Yn>AgE6F,JF?/l`&\gf*5!VIdam/Rp'r6D8=+VfU'N<aPMMqFIeDk-AalmB@UZ8XCtZ+4!j,_kTeVI+PY%jB'$#UGg[[.qQmmrA^XWUXO(8XMo$W>*+k9DDZV;Z>7s9Sp(%2`o/5.YT*7O.47A""r7$':;%%t7+-G5o%to,35#Z',>%l?cl"jfI6gOG[36"ASk38JB\5\gRh#pR)h=\:NNKuOLo@&5n&[IfBe*g3CEUNT@,P8$dknD!_G5N9-84q?JJ,YQt>P.-@7%We98T&8FNMl$#p$HqT[sH&9`oa&ME@qbbE8*7b!p'UZRuNo#`4-PEIlef1@mClDq_<f(T.0OGrqgigd0*I4GrY^b\\IFNn5coR]R@bd%UGH6,d'i!.Z_-g`6skp$di!RM+!+&8Q.)a*#9f"XH7C'OH^)*3\3gb=s;k/+Gj!MKYrBen.cQG$PK@;83#CeBPXM6U;MSY<Qn'j"\G[qK+89P>d4JR(*okg%6?%2@`97-=HN<82<_7eE><99iJs^8N1o]WTiOj\mOb,3%&*%T+BQc0n#[^5N$+F07!1k]/5S4>:4GRVo92Y':^hO%n*sNG=3;#O+<Bk99":+cW5j8&U957FC:8S05%q7ebg1L379)Ii7*BrE]XHjpdg'GBI=I)F?kQms9FK)Z8tWqiHbKj=&IQ7E75$Led;Jt?O)OI7I__FQ`E^'&@hpM>O]c=B2MUO14K)qh/c#2MK7oCoZ:lJL%go5FTVY9DY.0mX<tLap'D5#cQY2So:c&X:E4ZN4Qfi'<fKN[ULmLa9e_E^Mnn;(g`q54uUDPt2r9%:.YPCrP_?,(MR0cKN`7tj#l[9[E]hdBk5&*FcG/Zib)[\WUWDiQ<5$,hCCai*\TBm&=EKG,naebr\I@E$gZ/O)<?mU_tT"83C/N5rOrQ=p(\mH1F`:G)s9Lb,^9:]#GNof78NN?B^DfutHCf:?=Oa+RM?Z,H"4<R.K_^9?nV1/68-]qW+gc@DJ#@a?aj5.L(RS-JW@;[;shT*]@i!^fDd\Wi:1GR3%9=Chlhg#^F'sEjhAD%6POK*E%h&(GF\^]C!J+esi1?AcC@1VDBhc&V,*Id]ID)ri0%OPusD,r",aqr)%[]^ipiA36,M#9%4._6,C-OibT$5Wi(D'pS:V=S(\jpY[Nk:[>bjlUAsK;*_8+96V*]\(i6F7/(/rV4#.H6+)%jQU;'333JJEb)_-\!41jQUT)MJ8i>-48'7S0%9'g()T6&'e_JrZ,Y/a[\4WVO3aBMlTQ0!n$$ni])^/P,3OB$TP,i'J&$*%<3E!S,.GhWi9L@>Q%:(~>endstream
GatTKBlg#kp3V8-q=H.XY7!EOhhWG4G;L3q1[eA@MB^\&'=M=(antc"1^J[h,%.6ZP3+T6m63$O0_iO4s-jM6bnBks/?g*Ff>%_V!L@6BQ<1i(f_nQ2lq*)U#TtWi:ZM`^^5$)C!=,)E`5(M+\Xj("-UF^W(`E0X%+dl$1>fkIgN)0oo"ajRMp"h2X[is<`/H7n9qW[-N#a"sX_;L\&8_`T4>V/:)o9_j]bN]KY8nJ"60JIm0\dC&?5UMs#i8V=]*j'QFr#?6?bZ0H_"&j(s.\L8iQiT7&plAYaAerK)n;I`1[O?8,*Qs?<Rq>s;H7ZUQ+qgh-0mF!H@p"`[WBj5PIsL[O5X4R"HG&Fl7iXdM`gY,J],V:oOO('#V<B=Mm)Xj^*!o3*6Uq#AU+OeXT(VWoI&CG2ZL[d?@l"(j59aC\A@)SAknKB@$^W[QmJU=Ai0![be2:,1WQ*-bU>%sZ\.ibA<f%gA>Sl5AApGBA;0UjAGJ,!AD-PiA=5=k*1Ss\gr=fkH1Ql0XN/r&I][EfD7UudE$-MlSbk!.nE<THj$FY!p)"!*8@[LQ^6>^\j11c"8?It,@`L3TcQh5apM#SdO=0Y,PpG$,8WH+2,VbfQf=l%lKr-L=&%Wj-^)%]2W.ufl4_Ib^i9&OeDKeMh)@lr0GS'to1eANnbkuJ<7o&nrb9in-7PA*kBBjSpjO&l9/N"Yp\N@3WbZK&?nQq>qf8-2=GAV]q[DZuL>,0STm02rJYd3$nr/H$T=CDm\1pcBj8#Qd4p9t5cE>Wi-`f=$[#fq]N2W[7GcQ:S^,.9b.0Y\r('[teS&Fr'6JL;1!CZBTOost5UZ8Q/RWj\tH[1Z,>9\"(SA8=qKZ1W\S`p+e%T(*$IQC)SK>)ui$V/e]N)7HqFCfr3W0PE#mGQ$c/*KQNdl;&h([TJKcO7hSXM#C(YO=#C&6A:ru3tQUO\0ac[g8BVFombCsl;n7J]-7:B69Mq.Z$,oODtsP-@T%&B?>:tac1>UrX5@Zunat^bi\m]c0)c;K(lgWg7`L2>bNVpl^h[c><)1n`6P&#$MYOXS=XbK62^LYX:+"\B3)[fi`+r-,QL'EePt]Q\(_Ko%YmR08,B\_Uc=URY0cA.kQ>!F18==8"l$TJTlUfWsMX#NUVrP`>R"5ie+\(3'/*]9G+5Q4_JMqXPe\74faA'e5O-]XuGl"2$=?6BW=77KOCUYTH+t!*^G=&n&g+gI#"T*uOpTDo*8)%;>&KP_7q9m*;C(hg[:V?@p[Io)G3&^,O&?\up;CAFmX(\ZmWK4'n$Zusfiuli1J`1Nk<iGoHcAUteXuY;]##*?oKNLd9dsYW*%G/CBCK_l5g`7*<;HUJL68Nr#S(ERp/We9[D\]05LBqrEgY7+)KmRp`Sd0ICApLZVapTRhAb2hG!TPrHB=Q>Mi+!H/45cj2_h/MTgNB>#@)^-2c?,pHlBoQ@;bV91_rSt8UF$h*OUdhIVAC8/!mB4-5VJ-!DFkgUFLKD.nV"nBc?/cmckeK4qlfu>A+Hb5X;d,Q&G+qd^[MR*5e$H742VmM&At4+EO9XTBq0?;7Oi!2)s9=#$0t16$8o,+\1Y&&2Enf6JfW;@/.\g>)AXnaH!2ij]Z.-'fG9Xo]Lk5nEEY5h:N][>(Sk6-2pl8^9b.or4sYWQd/`DskhB.&oEAkU3S[^p-;U+'iL%W1c!6`3Q^Y&eLR9^ZUWKTDMU@%(%kAds1"J1cA&325)ina&/QG=uBUm2/"_r;TRZe[pDYsOQnHd"a_HQVN8F&\5NPLFO6rP#%1\7Sl4&KXu,\`9eKI092q4oiu!&GqAn2l_4RTPVRY!jL*D+9*WZc%&@GcNld;WH8@3?!@qQ4(B_W%FrMR.s*YQF(ko*_g:?W)7)mgSBaeM[ce(I`3S89Raq"3QSqDT]g)E3h)2-o?hTS/S[kHd6!aKEl[G(,Y8=t(0DV@P2P)LH^l:o>VeP:L#\spmfP@02g/M!ciNUk`S<"+"25@aX-7+gD6$7U(X'@d:A!<(aUChQS*0ZPg1X7ND@S(0(*H\#5SO"4XR71<b&*I0inHf?9R$2,ZWGX=lk@V>N:8EpSs1#GY5+J4[qO.q#opiD=5GdZ20+W2B_k&bIikAZeM0\\QFdWcRb:s+&mp9Q"?XdPO>s((%u$>0;2f.0EVGu_bYWO`_WR>a=Ap94(H;3.m:<"'e]"hc72pUKeEOhe?i(1p()ZKE?:PX&J4REo&R$bp$>[-p:!rtdi'7#*k>b=:A3jbbq"O^cW[GZ15$W.=h/^*6@?H)-,(M+*AdTIb>>?<8_mprsQPkTSi!LU<bX%+c!oYm>aa=DJb8_dmfV$D-,fh8C/oqRWPX)b&5oa)1iA(Wm8dU0o$q)IL"V=u%+JkkC]$*H<8K2c>K>`p2kV<AL-#M"?%cU.8TZ\=nQF&rE3J]+uK.\t,TVRO_5o4Q5(%OX(;FqJK5n@Er%H9Y]Hq=WliC&n@6pUod"_@1Fg`X:`<!i@E4./mBk3)k>GB1RB0tG(l4^!qD&)):ta>YrGUYgII)W!6qO8F3Z3CQ>-5?qT]N66Z7.$>HF7u[O'2O",%XYA$GiWm&HguEFdIr]@M^JB;>n\X:T=Z6I;h2pSjl_ACE3Z!(Z+_a06)h5\^MFuTT?bY%JOI$<CBuT%.5<3;^ciD@;^+"ChTGDaAFK,8f@QS.Y<l[9K.u[DUT',/4K3A[<>_/T'#AN'Q:'L]#[F-M[H&A,dr;#Ot,gQV=2/j\+W1_LF:%_?=#$'rq6'Wu5VE3c\l`o$g+X\e,)YHqqU]NPY6ACWcP3`g[7o`YC^-n[.D,Z&92a"&s8.!M:[k=.0V@#kLJdMBl-s4ncBR2kAV$*C#e2X:u@EMn?hb/6@0RWnA?Q[g+M36NHjX)!O!)fn<g"6=LWEjrleYF*3:/kutTl:hF]gKOoje0uSh0ZkX]T[^\:kL'^]i6l(G:QS:U4%OMn$K@(B<P.6,pc_H-7/@`^"!t-Ug3AD,0@_@S;AUKOSWk-p1G^$J&boK:n>nRY(sF?dIau8Aqc0A6G8FJ;W\WH*f0IS%EeMIOtSt5n]G1r0_PUC`0HeJMO8PA#'7?0.*enm*TTTLo*c%*G>V4&T4Qs-[SNmKMJ`%X*%7e1\:fLpL-`sP;V(RMeU3@;HeG,O>2?SbhhIph<I`54T##h4Ef%(sc-,h.L)sU45'P_bs/6FB_:g+,$618tXH3=6U(a^%6(L(`b.Ri%1]'3CY5SrA&^Y@~>endstream
endobj
34 0 obj
<<
@@ -229,11 +229,11 @@ xref
0000004122 00000 n
0000004197 00000 n
0000004919 00000 n
0000008167 00000 n
0000008247 00000 n
trailer
<<
/ID
[<ef3c83d8c0a3227f9e77021a833ebd39><ef3c83d8c0a3227f9e77021a833ebd39>]
[<22cd500a0b10b610bf3c3a20eda45db4><22cd500a0b10b610bf3c3a20eda45db4>]
% ReportLab generated PDF document -- digest (opensource)
/Info 20 0 R
@@ -241,5 +241,5 @@ trailer
/Size 35
>>
startxref
8980
9060
%%EOF

View File

@@ -128,7 +128,7 @@ endobj
endobj
23 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Remote access \204 implementation notes \(v1 WireGuard\)) /Trapped /False
>>
endobj
@@ -213,10 +213,10 @@ Gatn$Df=>`&B<W!.IJLQ<\JXU,j\h:ctu[mYr:q)<3"a7J;dm6G(B8?mm:41&FImqM?FQ)o).pIo,S's
endobj
39 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4044
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4027
>>
stream
Gb"/*lZ:gj&c\H;@_];5gt<A`+t5Nn]lD=mdMjQ2r4'+TmV!^MQB4og"&P.<D?'>_^k_[r77p<>[H#1H'#4R\=R?$1Yr"_d+%-##('(Q,T_HG+_h>Wl0`"rpm]PO6m_uXO7bY1eCX0`HqqqqgRV`N23"DF#e]_YZOFiT.2)Q?@(5h0<;:O]cCH/l$']M-,a//5l`5<u;`'4K*2]^`%c10'/moMHW=6&&iGN5c-N5]hB+FKq9VV4\QqZ:t+b-cZ7T:P;S2-97YEdbP]fN-kf>C#%Z+d[&7Eim#6VL!]EN(5k<La%('RF2iC_h`=E1lb]m'+Z`XXNMMsk,rDqkc)3M1$*H1cMV([/mP,=VVsQq#;r&WU$?fAaTS%,FIKp=8"[T3WZ=;[:>[Z1YP!9&n]BkNAUVK+DFM5pnY8*qR.(uQiP@?V'ST>r=KV_VEuG$_6p=o'+K!U_dP2!=2l4-.7[uZZ=1ZMMK2gBIEPKM`0#F!9M<@_Z`f"e.lV(<5iFY`GPg]U;<P!D6aV[-a`uFaJ]Xmk\N7fGN!a]6a)%eT[Qf<C]%'D=*$8Ei3JCH.FIIuJ46l\[j.`E>Q_$_R)>KU$kUE)aq]?f<a-4R-"i%a;7`ku@A7:fHaHNdbY*9.5u+UZWT<(In*\;gq)(0!l%cZ[9R4d`ZVm[?(7V):c*`Y1sR/Xf10nnT#eWrq?U7*gFJG*tBYpUP&3/mB@Ohd"'`Eje:P4n<Om*[bD,bK(49<41<,l+tm:*f4!;+-0^QLGNn@WuSUIN%>BVeT?\WL7u'V1sCOXZobM12h"cRoI3*A&n;PUQM_(he#%@0iaiZt+8jJ1^;&pJP3Y5SDa$WFE^]iD7kRZ(7796FTARMCOdb"J)5!Kh\.P4e)YoiDUN&bT.1b)A,@;=:T(#h9]2oQ<Qf`'1kWUflHP@/G6"-Y&q[`1P,+B/4CBpilk&.0_0M$mUaB\:4^*rg<KNDlu^^C6qC4M9*AtkJ5RLOuis'%(%Q;7X^L=o`[L1[\)<Fq@5>8;"]3$1luX`_D&@*!2B68#p<X]W73rmknt1+hK"[>d@\-bQB9)ViT*!%+]I5kbClKp(-JJ>CuIiGA0TqJ2TmS2Y>U1XL6eYebLa_S0a\^pInc1i)==mJo)q2MZ]JK$s^T3Atb7686<!i!d)[,7=A]8]m[4Mf%nIU+(,2W;]Kr=i4:OfQ&rWm'i%Y6L8<i5DE<nlPA.M&UK&T;Z]=olh>mEPdk-`RdTIY,H,JjaMZ-B3!G!l)^hr`Tk<p+2kR$DJ!cW*[sSf7;U%m?$;f,>-!ha?=dunAL"+1UBqcZVo5,3;rYX"gQn9_B%6C6f9Q:s/XBi\uch)G"I0tVe0C-LL_mM=U^Yi&*?-\4$pE<ME((JTA.IZ"R$(-?4WS]20H8ZpO@X2A<*r<Fk%\H55CcuDJXe[Ru)7@ZQn7b(>H\@"elp,T0&/(KZjq/0h8upi%S:d_"dkuPefuW[=)G[(YB,JYY7u9RZ'1G*Cea+\N(.b(paC[2@@#.m?e;`iUdj9i_JK?EE<5*,U$F$?mmg_O`bBTaJ#6f^SGo/A.2d<\*0i:Ej7,;41+:_tE<Wus@0ei81)L*Z;n*]U5[n65`'8.6edSf'c-:GeacgPfIs2tde@(Ld@JEl$][kA:@X>@>sfK(L0o&3V,kf*:Bl*\7m=6QoY%/T$O"$U9*k][CDplmYo;kX6lAI[ik$Oulq1`3ZdCo:N)rfAeLd[`f"Z8mD*Rm/br9&%b$U",Zd6>3+dX^-b3Zs)LC42g8\_Q4j_Z&GE=b@jCLs#HQX*2Lk&>(6j\JhT1E+l][>S"9]g2@?'dbXCHP90/Y?d#pUKUd@IiL4MaTeh%b=&%kckkS(sD"oGYs'0-+s/i$)tn5?D[-4)2d-SBg>I100P/g*_tS0A3%NQ`r&TjA-E_BJ$Z3MpDP"UkD4g9+A9fNCcG"l[_RRcVApA8.$b73rFg/EJ8rPb+4?'u2%%V3hALLm%5T5\<)rkXn3poI3'KInouJi$M.Vk2XGBqhpTFOF)a22@6K.a\d3%FJ@%$FKDK0XX\EGkY<:6gQpn$Yg7&*eq4bb:fP/ZXs'1;i2LJ;AAF_)QGUED2LH5p<<H,@R[MAB^?#j64LQA[UB;2hNl0j.?sNBPockjqgfD:0rs62rd7Ul4.!.2gDKL)\Y:PKB"ti@mQrT"u7Z?cW7[fXB3P'8OAJ3=M%N:;Dn]cD=j.sL?=1RQ`]jIQf^A5H22M:5X\m%pgCY3&;@+>e-+#c"`"[aNhS35O]e;8R@+n##\)6*"FGtrB=.tcfSS:#dD+V/m_G!7\8NOZ3"`J'J74AHsV/0c4=R#J-q0-s]UL.'mE-L[[:4k%q*60;i2KD#K)i&ZXNj"bVP(SeaR$RDM(>p.O8i\PLKQFTQuV)3Kgk&H([14M#a@-#dnpJ/Y"3aL[WHoUk9[&kFm`I3O'B2lK]h(L9Jf0>U&?Ji/@X:PQ\QP8l^k@cHgSGrUJkOlftm@7b%@)iFi'5Q]&7*0(qZdUB6.Z[+#-`mm$f%Ms>9X?7Ln!-D)&ctK;\gTj&_8/_t+^T$S-$5[QiIq!A6XQ^n:1S_rmifA`&]s6)]g"q"cW88f1Fd6GZe[bggAdF^ENj<=IGKj/S40^H78#h>j5#L"F:9jZi'-^)On/_cV@@b2h4ntb*#0EHY]t(K^?rEl+>4?_aoSqJN3FfUFrk-@n@7,HDjPtk\Boh'=T]l*63BD_%>\n[f`EC:5YPBq^o(\+![bqM8dXRYo7p!JNFBT`\shXfXi@m.Ea6j[41&&7R$DG)F_pk/3A`S..*BF52=X(]ChOk_l"4Als'M*To=AJ^ScIZZd=\FUHKZs[]@RcDeC!4/p2Y<Nh8(r^ELM^r4cs"+M]Q0O+BHTp,&],2V\;kAk[(=I-(*H)A'l5;NYM3LGs=bTJ<[`Ki;'&p,[(iH+0L6r5KMpU>Z\[qkP\5O]>Lglr-?Rsl5+WQJSfMt%;[D9#mpZ[:KRQSJJnjIl%+L+chI>pp+LfCX0]"Z/3p*AQ+@*@FqempOOF/H)Lf09D9K8T_kB!<%B%V4RdM<eE+j+/W!#BO_.NLZa\n[%^9]+,fUg)l'nsji=,*R7@_A@l$0>XA+p=.@q[qjAU7Q+jE>"oW5/j#lnPm@qhYC,!-PWUkH+;/%cq.Et8^l*ARI<UVL7>6%bP,(Pjr/eBLP3'l8>MmH`IZt1%=3a=;qQ!:G./j<%1UamL:jAp46uP<WA4mPS>P!=EuN-3#Rk$16mg,j0j9,!5Or!ZJ"3D1)QN#n4FdD"MTi\gYO<7FG9Ch$-EeGV&LqL"X6hI=AST%sj`-g19-2ReY6h722lXs3m)l/*&%'Wp7D357?B!q]1R2DD*iDg4`=_[ISE"b0dbk3K-GX3=R&k=/2d$S68^?'N*gM8%2<"H91n)kso'"8s^-_5H/%J/t\O4@d^K2_W$EYgAUF^IG<nYWfA%o$NP][S'ko?mAI69tjX`8BN:86r6e=c32@QoO\_C)lTM,TM6?q!MIk3X?<__10%J`c=uk$!'Fgofm>BhOdZ78p[>Dp&1=&>0K)KX-'<<jE^cOZ;h&E4^esW'<FZ+eQlS?<U+h&J:)QX4:O&5M0aDp[.([)"r0G`$7mACOE)WjD9+R1W]G02s<J-aE`6EI<"(A]\<VDB%,^Tqg`7BWuDu?a:C3b(L+PmQ++%1Oa,aIRhin^]:XW=!PEZ9jX2mS^m"N;UN`KiDmp@QaBN@8K/#m;YmdKY3n_7XZb'kOAaPY,p)PWS^)P7^4o.S-(G-ia]J6=al@Sb@Kej18]o#*j/md?d>.9q9h-Tb*TaHXuKSV6f@1;6cp/1M-q1WA0)=+k<0*NL_Ve!B$-Jt0?,WJJ$3*@f".9qDg/l\sW[,V5/1(MW0/IId!Da.MP2NZ;E'tboaOiu?!k2Fa\Wfh(q*;L$j4N[`>0L1R_[WkdV?X9ZZlpd\UMr3%L&7(U<("0bjW&3\^l*ht&T;$_0RgpdNhqp'T:\$TCO=s.`J8%D2BfKisG1?BH,]bIG:4=T/R31AM^VCqf'u5b-!)=rG_>~>endstream
Gb"/*lZ:gj&c\H;@_];5gt<A`+t;3/hDf-ql&ClTIO+<N3uUYA,U=)G!0h"gg]+qp^;Qp?b3>gISCg11=C;r'h;9iN)Q<G+KtjN9JCjPBH_Z.h_u1R^^=%f6)n<V3nbn.Wp["B,2)*QEfRn`a)T+b!_e(cBk)1$H5td("M@'$XOQ7O[W6,o8E,nGt"A9*n[Gue`4l6pk3<rj?/_*blna6#4leB&;n_N$5ERHDX@_GqW^/J&gjX&]3L&7M(g-4Ikjn_Zi<r9=1?ZcV&83;4FY?TK:Z?9HU[J*-$TBD=*#UbtQ&!&(o\tP/I;\"B`!HT(:nR[W$)+-irRMLSub:=0'._#B#O.'q''hW$!D;B7=VirV>]:E1]5pd)4`NS=L-h+<Ka"ND#[qiiR4WdH>13n7M*c[*B;=7*tInAQqf5:$._8KQi1Z0Ys/h#Y.;fFnp4SmDs0)D5e45.kh`9A8Ud9S4<U`-BMGA>@dap[F#9W(jGn]I?K1-:1u\BU0^jj_78L$l'fdK\%Rl^AhX0.u,S!]F[j_!C;A,9e8H>+Ep5_'MQG+eXJrO?+\slP)bFq4]:VgJEKgT`FO0hlnPH+Tg2Cm^C^2DFk%RO4+7CPu'm7]7@(9#]KlYi-T-P$D]N.>g%j:F,QjRB<u!T*d,rSG>4QadTWA9K*`iTi\16Sq(2u?`<!g#VrtieZV7KprEQaVQ`LZ<DJroP3SU3ck1j1WPS:<T[I8?N(:KOYkttO,*q<D%&<C\RLGc<-WuQ>^N6H?_eT=::J>&S81s(?+!#\u#)lG)tqW+CYM(o;D9>5q\BpUsm_:j%2"-,;dNjEN;P&3@+Da+!uE^ZG=40DGGKhnQ[^:]./,:0a#1-RekE?fY?/b6<28)oQ<1[_LTo3N8^*q<=c]*n,T5P$Ho6[lfZI.lBt--4;Ps6p'O.'a/IIVU)a;m2LU$A2GoK>\W<jboWfNd-hT$`9LG:^rN6e4d5I7(pT:j+!h4cdIXMeM(-!_9f:7U8VmK@uI(`(['h8TV_'X#lqMon]0`J?lKmJI_7PmY>"IH7;\f\aU-:nN<8iI-@grI!73k0fq;k**0?C(3h3mT8:QUTM=]G\ZNc;%BI9+4OkDZ^*U&5lJ78p=eK06MS,0@m8Qb9;0[%BD8+<A>(7a?lEl=S7,>%\EG;8cj/kS[;&&l<R+Cj%p(L+K"`I<U+L0.`Bp.*S)5huG30K+uRGt_T_meXiYC*g$NQD3*un-H&k"7g]Bd7tiQR'dSFl;5n)R[m2QVE[aJJXo#^&u-d#/r$6:UEZlQ]e%Etj[*]m]eiTIRebO?I"-8&=hn&P`"&?c$>-dVDp^,pmPFe^EF0!gnX"7[38R[S_dDr5h^msYdsVKf]l^S2(4+m78O+A>V1'54e[#S@'$CBH*h].JXSXhPB%nVQB]A%'I^?,e:\2Ca+<7ar*Qbu\88o?47mNk#Xa[Tq3_sgo.dGA7Ol?0hS4H`,>XZt\M*fQ&q$meLfhmFHPs0E;(,BQ2Lf[,2i):qYH@^7+!%Qlc!?'NfUN`8)CD+C:+P:%IDLHW5=1\YMV%l_S_po"o:BkN%+D,?j?#?9d?28ejIm:N&U7Yfd6+XFf\;gk-61t'P*WLV;TaZ%TDe`,HHi*L?!ekLN<`aW<Khi36Kahej]pa;Mme^RA<0KV?S8#d:U]LF3V?*<P#(4QMi4l&gSS4l$T:uP71nsB%91U/Q,oEWsa^-m'%rq3=3_3sgW\QErdn^6DPeL"K3-CuN::Nf1:*n,)4V2DdpUH0*V"J*#)9+u$)+<dDTp=rSBA>lP'k>^6+RUl#k86";^uLU'e0/MIk7"=$&Y3>Q^9=n:"-it,e2@)U0j)FZ*RM_MAJC^#a-Ug81-Ja,4EB[Bl<pj=X+2HuE/GW/Fu#ujPthFs&.U-Zc7q5Hb[h%ccutt3`6P%Z:_;)%>-g'\Q7QkbZ@n&:*_8<6"i]Zd1^r<)Kj;iQF@=Du.3S5P[reC<62D9=O?Z6b/o_P:E;T1rlM]g8=in?E'H;a,&ETioj>bP!,W\uUTgfcC&@>?VagOW`!:7$pHKF'2'IYH'9=Nh3R/9jiB/3ji9hT*V"<5&]RAp:e&+rUC&Ds^IHQF+;^=E@CCWBlR"u%+l;:Qm>&*ud&G5hiZQI\U95KIroolbGX`KqCZ1BSGq(!Oh>(aDK\A0Z4a="Ml_N\Up,7gBK,GC9"R/NB_Lb!g2O;=A.sMsjDZQ-:@sWbU]1isKrh"Ba4"pu@\:SmZ5Bl]Yt.L0B_c1W63)Cdr/(?(-tYAn<[_b/p!Z)"O=YC$$Y6?&K*f79h7o8E8bCc8+D9L<8)*nm$4cY"@\k(\/=K[L4rt,fgsB@F1^@)f2RU33FHLH9(h;ZTo/gm02LQ-OuUea>2?R,*tc;aZQ`1,P.8.'h1BhG]-#5VpcO?o7uqA7[n-o/fn1I5G?e[l[IYD\p]iJH$S"HZ9]27>YeaR3(IaLiqtmjSCa+B205)YJr6Vd3nEkgLm$'cB;\0<PTLJ<:0JX%XL2p_R3bp65:V^:,m5AoBVP^P"J(fc6DgTmQdBa2GSB':pDfU43g&rh]SE#'.pkaniVQPAnSH)_\tIK[e_An)UA`to)[G+3hNuL^PVYN84b(]mFBj6=F2n95#jrhM'KKMt(ZULtUX21CfCDeDQ3iH[`oHrVeH'r]OHpE][;:M%#dMhq4+bN+-?['+`5%cVHqG:gq.:Q7.;;%hS';^^B`hhu9ERI!RhX4(4qEoDXu^u%`)%EH)n)kNf$L@Tq[L_L[(&J5h2G[MQ3iU(?Uom+\emk10g^j^d/b2T`_rh.RJ[$9--s4V))WeWpMR>oot)Z!MuW3f71OIippPf[Fh^#J@3UL`0qp%ibBqX3)sRW917?5<$e4F^'/4aZlF.)^%e,kY`ncco_*%0VT=PT?G6(X_':D6]AGs3D>P&/W4J(m(&+Fr`9!ig;-'#_k=[8P%maeV%m_+ABkUn"]!'eo^^Q"mU"Eo)6TuQ[eIu4+sa4]eF75t\%)+17G6(Nl7NWN,ThbD!iHebJ\]072a6WLI-*Nj8jdLKPu4%;41=q3I^B1nQU'_7e(n\G,\Aud=j[^e(C4r<5o>tl^`9BIIl9\kaHIhh'El[fcdQ1-6\"NWDnprGOh!p,5IE@gjmW>.H#&\G,/M+YZr^)N=TDQb^shI"<kCBPt9'%T)fOaakX*Pp&@oF*=K0^ZI=DGH()$H-WfGtfG3lh(/oAf*KfNO/THe<P4i(q^EP9UN^!ZiK9=UpX>)30!Aa_P5NNo_lN412eDO^7>jC8)A>V?9><<<77F=gR2-dfRfI4j#@M!garul&lu/Q$7kS./!j-sco1D0j^MeH0p5ke'SbRnS3HW_8''#\Nn4_-JId!m!11B,\Dbh0<fKYEo6--a`MM%HE..iQ0BighFC\BYVKVJrmL`f-a>hE4'a\`DZt(Za,]bpTZ^%]q^+N`V[1S[A*Ns4+4@W2MEHI[FI/aH$TH1+C5)+NB:Ju<JV]\dOL5ID(gI=`&RF.pmk3V(#7X>d(Y1YkcQ8XGS\nY8a98B\Ud"Y=Y=[-1A=UkL?SG.?>>sas[:JZkg(\4OAQ]k1$#fcDbC+m:Cm+%s0%e?;&qpd(aL_Ah_+(9S<ZFoH2o&7OsqTfmsRNHER>l,6(IY"A&G;u'U>oBL(L;qnj]Ud9cB('a$XXs5m=LS'p75O<(-_P\a0B[oaG\6,6jaHaah5L)FSO=ms<Z94j^_(Ugh-#\3%^/6<mhnc$];V=76H.u/A,3E#T?,/F$m0?CR+&;)K(if01Nd?DJjHCi?JR8<2<kt5>kKYA$44e,Lc/UK%-9n>;>&2uKk/RKX/]GX"X+ARA@@[KhiZG73)!L8=Y,pgS;ZYb_HLA^`s%QIi15S0-rbB)qfIJC5XL56GY^:D=0Fn@]sTX(9;\P+Uc4YpQN_c.M\q*5nZ!#3g/Lk8[6eRC^TNeE\h&KWUj:EdER('&mqX777JTDs/PK]i^L,iijEF-9?]b<hdths@F4@SXW:duajpjC2q'freIY(XNJNn0*J/A4dJip,:~>endstream
endobj
40 0 obj
<<
@@ -267,11 +267,11 @@ xref
0000005069 00000 n
0000005144 00000 n
0000006050 00000 n
0000010186 00000 n
0000010169 00000 n
trailer
<<
/ID
[<0ea4a9599ca2b4815b3cdd11dc5a5773><0ea4a9599ca2b4815b3cdd11dc5a5773>]
[<115c8383c89ec480b2b9deeb38eac471><115c8383c89ec480b2b9deeb38eac471>]
% ReportLab generated PDF document -- digest (opensource)
/Info 23 0 R
@@ -279,5 +279,5 @@ trailer
/Size 41
>>
startxref
12418
12401
%%EOF

View File

@@ -107,7 +107,7 @@ endobj
endobj
19 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122521+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122521+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Remote access \204 validation \(Linux CLI + mobile parity\)) /Trapped /False
>>
endobj
@@ -220,7 +220,7 @@ xref
trailer
<<
/ID
[<4aefba77718541cc2646cdb6a66281c0><4aefba77718541cc2646cdb6a66281c0>]
[<673f7a357c9c05e8a1d6a5eab503b7d5><673f7a357c9c05e8a1d6a5eab503b7d5>]
% ReportLab generated PDF document -- digest (opensource)
/Info 19 0 R

View File

@@ -168,7 +168,7 @@ endobj
endobj
29 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122522+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122522+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 implementation roadmap) /Trapped /False
>>
endobj
@@ -350,7 +350,7 @@ xref
trailer
<<
/ID
[<b10a0e61bbf4903077fd80a61c513273><b10a0e61bbf4903077fd80a61c513273>]
[<5bee862ffc07cb85575bd1d024be9265><5bee862ffc07cb85575bd1d024be9265>]
% ReportLab generated PDF document -- digest (opensource)
/Info 29 0 R

View File

@@ -102,7 +102,7 @@ endobj
endobj
18 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122522+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122522+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Tickets, Gitea, and alpha smoke delegation) /Trapped /False
>>
endobj
@@ -209,7 +209,7 @@ xref
trailer
<<
/ID
[<8fe3abb3b6ae298d8e49cb9ed97a806a><8fe3abb3b6ae298d8e49cb9ed97a806a>]
[<c340f50121c1bf4f85053bdbced616fd><c340f50121c1bf4f85053bdbced616fd>]
% ReportLab generated PDF document -- digest (opensource)
/Info 18 0 R

View File

@@ -82,7 +82,7 @@ endobj
endobj
15 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260608122522+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608122522+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260608212304+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260608212304+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (USB-C / HDMI and USB-tether cast \(roadmap D & E\)) /Trapped /False
>>
endobj
@@ -159,7 +159,7 @@ xref
trailer
<<
/ID
[<2f3e1c2548fcb7ec850b1fea338ffefa><2f3e1c2548fcb7ec850b1fea338ffefa>]
[<fc54216b56d3fd4191de95c6de8c167f><fc54216b56d3fd4191de95c6de8c167f>]
% ReportLab generated PDF document -- digest (opensource)
/Info 15 0 R

View File

@@ -80,6 +80,12 @@ return [
'max_attempts' => 8,
'lockout_window_minutes' => 15,
],
// SFU / WebRTC relay (post-alpha) — hidden until owner spec; see examples/sfu/README.md
'sfu' => [
'enabled' => false,
'signaling_url' => '', // e.g. wss://apps.f0xx.org/sfu/signal
'janus_url' => '', // lab only — port 8089 is a separate stack (INFRA.md)
],
'mail' => [
'transport' => 'smtp', // smtp | sendmail
// Alpha: use apex if apps.f0xx.org has CNAME (no MX on subdomain) — see tmp/20260608_help_request.md

View File

@@ -0,0 +1,18 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../src/bootstrap.php';
header('Content-Type: application/json; charset=utf-8');
$sfu = cfg('sfu', []);
$enabled = (bool) ($sfu['enabled'] ?? false);
echo json_encode([
'ok' => true,
'sfu' => [
'enabled' => $enabled,
'status' => $enabled ? 'preview' : 'disabled',
'signaling_url' => $enabled ? (string) ($sfu['signaling_url'] ?? '') : '',
'janus_url' => $enabled ? (string) ($sfu['janus_url'] ?? '') : '',
],
], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

View File

@@ -40,6 +40,17 @@ a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; }
.shell { display: flex; min-height: calc(100vh - 40px); flex: 1 0 auto; }
.shell.single .main-pane { max-width: 1100px; margin: 0 auto; padding: 24px; }
.shell.shell--graphs-full .main-pane {
max-width: none;
width: 100%;
padding: 20px 24px 32px;
}
.shell.shell--graphs-full .graph-detail-body {
max-width: none;
}
.shell.shell--graphs-full .graph-detail-table {
max-width: none;
}
.nav-pane {
width: 56px;
background: var(--surface);

View File

@@ -0,0 +1,117 @@
#!/usr/bin/env php
<?php
/**
* File infra validation findings as tickets (tag 20260608-validation).
*
* Usage:
* php scripts/ingest_validation_findings_20260608.php [--url=BASE] [--dry-run]
*/
declare(strict_types=1);
$opts = getopt('', ['url::', 'dry-run']);
$base = rtrim($opts['url'] ?? 'https://apps.f0xx.org/app/androidcast_project/crashes', '/');
$dryRun = isset($opts['dry-run']);
$uploadUrl = $base . '/api/ticket_upload.php';
function val_tags(string $kind): array {
$base = [
['id' => 'ticket', 'label' => 'ticket', 'bg' => '#6366f1'],
['id' => '20260608-validation', 'label' => '20260608-validation', 'bg' => '#f59e0b'],
['id' => 'infra', 'label' => 'infra', 'bg' => '#0ea5e9'],
];
if ($kind === 'issue') {
$base[] = ['id' => 'issue', 'label' => 'issue', 'bg' => '#94a3b8'];
}
return $base;
}
$tasks = [
[
'key' => 'SVC-OTA',
'kind' => 'ticket',
'text' => 'ISSUE SVC-OTA: OTA channel HTTP 400 on apps.f0xx.org — wire /v0/ota/ on apps vhost or align device ota.base_url. See docs/20260608_BE_SERVICES_and_infra.md',
],
[
'key' => 'SVC-URL',
'kind' => 'ticket',
'text' => 'ISSUE SVC-URL: Legacy f0xx.org crash upload URL 404 — production base should be apps.f0xx.org. Update settings.json / dev defaults.',
],
[
'key' => 'SVC-DIAG',
'kind' => 'issue',
'text' => 'ISSUE SVC-DIAG: diag.php returns 403 at public edge — acceptable; devices use upload.php + heartbeat.php. Documented in BE services map.',
],
[
'key' => 'SFU-SPEC',
'kind' => 'issue',
'text' => 'PLANNING SFU-SPEC: Janus/mediasoup relay post-alpha — branch feature/sfu-relay (hidden). Await owner spec. Gray section in docs/20260608_BE_SERVICES_and_infra.md',
],
[
'key' => 'graphs-5.1',
'kind' => 'ticket',
'status' => 'closed',
'text' => 'CLOSED 5.1: Graph brick drill-down — full overlay, axes, legend, hover implemented in graphs.js (2026-06-08).',
],
[
'key' => 'graphs-5.2',
'kind' => 'ticket',
'status' => 'closed',
'text' => 'CLOSED 5.2: Graph columns 1/2/4, clickable bricks, full-width shell--graphs-full CSS (2026-06-08).',
],
[
'key' => 'browser-js',
'kind' => 'ticket',
'status' => 'closed',
'text' => 'CLOSED: Browser SyntaxError on console JS — deployed assets pass node --check; validate_be_services.sh added.',
],
];
$device = ['manufacturer' => 'validation', 'model' => 'infra', 'sdk_int' => 34, 'release' => '14'];
$app = ['package' => 'com.foxx.androidcast', 'version_name' => 'validation', 'version_code' => 1];
$now = (int) round(microtime(true) * 1000);
foreach ($tasks as $task) {
$text = trim($task['text']);
$key = $task['key'];
$status = $task['status'] ?? 'open';
$tags = val_tags($task['kind']);
if ($status === 'closed') {
$tags[] = ['id' => 'closed', 'label' => 'closed', 'bg' => '#6b7280'];
} else {
$tags[] = ['id' => 'open', 'label' => 'open', 'bg' => '#22c55e'];
}
$payload = [
'schema_version' => 1,
'ingest_kind' => 'ticket',
'ticket_id' => 'validation-20260608-' . preg_replace('/[^a-z0-9.-]+/i', '-', $key),
'title' => mb_substr($text, 0, 256),
'brief' => mb_substr($text, 0, 512),
'body' => $text,
'opened_at_epoch_ms' => $now,
'rating' => $status === 'closed' ? 1 : 3,
'owner' => 'admin',
'tags' => $tags,
'device' => $device,
'app' => $app,
];
if ($dryRun) {
echo "DRY {$key}\n";
continue;
}
$ch = curl_init($uploadUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
CURLOPT_TIMEOUT => 30,
]);
$resp = curl_exec($ch);
$code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code >= 200 && $code < 300) {
echo "OK {$key} HTTP {$code}\n";
} else {
echo "FAIL {$key} HTTP {$code} {$resp}\n";
}
}

View File

@@ -34,10 +34,16 @@ ra_ra_post() {
local device_id="$2"
local random="${3:-}"
local app_version="${4:-cli-sim}"
local caps='["wireguard","files_app_home"]'
local mode="${RA_TUNNEL_MODE:-wireguard}"
local caps
if [[ "$mode" == "rssh" ]]; then
caps='["rssh","shell"]'
else
caps='["wireguard","files_app_home"]'
fi
local body
body=$(printf '{"heartbeat":{"type":"ra","status":"%s","device_id":"%s","random":"%s","app_version":"%s","tunnel_mode":"wireguard","capabilities":%s}}' \
"$status" "$device_id" "$random" "$app_version" "$caps")
body=$(printf '{"heartbeat":{"type":"ra","status":"%s","device_id":"%s","random":"%s","app_version":"%s","tunnel_mode":"%s","capabilities":%s}}' \
"$status" "$device_id" "$random" "$app_version" "$mode" "$caps")
local url body_tmp code
url="$(ra_heartbeat_url)"
body_tmp="$(mktemp)"

View File

@@ -0,0 +1,30 @@
#!/usr/bin/env bash
# RSSH control-plane smoke: whitelist → open session → connect payload with bastion fields.
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
# shellcheck source=ra_lib.sh
source "$ROOT/scripts/ra_lib.sh"
BASE="$(ra_base)"
DEVICE_ID="${RA_DEVICE_ID:-rssh-smoke-$(date +%s)}"
COOKIE_JAR="$(mktemp)"
trap 'rm -f "$COOKIE_JAR"' EXIT
ra_admin_login "$COOKIE_JAR"
body=$(printf '{"heartbeat":{"type":"ra","status":"enable","device_id":"%s","random":"r0","tunnel_mode":"rssh","capabilities":["rssh","shell"]}}' "$DEVICE_ID")
code=$(curl -sS -o /tmp/rssh-hb.json -w '%{http_code}' -X POST -H 'Content-Type: application/json' -d "$body" "$(ra_heartbeat_url)")
[[ "$code" == "200" ]] || { echo "FAIL heartbeat enable HTTP $code"; cat /tmp/rssh-hb.json; exit 1; }
grep -q '"action":"wait"' /tmp/rssh-hb.json && echo OK wait
ra_admin_post "$COOKIE_JAR" whitelist "$(printf '{"device_id":"%s","whitelisted":true}' "$DEVICE_ID")" >/dev/null
ra_admin_post "$COOKIE_JAR" open_session "$(printf '{"device_id":"%s"}' "$DEVICE_ID")" >/dev/null
body=$(printf '{"heartbeat":{"type":"ra","status":"enable","device_id":"%s","random":"r1","tunnel_mode":"rssh","capabilities":["rssh","shell"]}}' "$DEVICE_ID")
curl -sf -X POST -H 'Content-Type: application/json' -d "$body" "$(ra_heartbeat_url)" > /tmp/rssh-connect.json
grep -q '"action":"connect"' /tmp/rssh-connect.json && echo OK connect
grep -q 'bastion_host' /tmp/rssh-connect.json && echo OK bastion fields
grep -q 'remote_port' /tmp/rssh-connect.json && echo OK remote_port
echo "All RSSH API checks passed."

View File

@@ -0,0 +1,116 @@
#!/usr/bin/env bash
# Reachability smoke for mobile-app + console services (public or CRASHES_BASE).
# Exit 0 when all required checks pass; prints FAIL lines for ticket triage.
set -uo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
PUBLIC="${PUBLIC_BASE:-https://apps.f0xx.org}"
CRASHES="${CRASHES_BASE:-${PUBLIC}/app/androidcast_project/crashes}"
GRAPH="${GRAPH_BASE:-${PUBLIC}/app/androidcast_project/graphs}"
HUB="${HUB_BASE:-${PUBLIC}/app/androidcast_project/}"
BUILD="${BUILD_BASE:-${PUBLIC}/app/androidcast_project/build/}"
OTA="${OTA_CHANNEL:-${PUBLIC}/v0/ota/channel/stable.json}"
fail=0
ok() { echo "OK $*"; }
bad() { echo "FAIL $*"; fail=1; }
note() { echo "WARN $*"; }
http_code() {
curl -sS -o /dev/null -w '%{http_code}' --max-time "${CURL_TIMEOUT:-15}" "$1" 2>/dev/null || echo "000"
}
js_syntax() {
local url="$1"
local tmp
tmp="$(mktemp --suffix=.js)"
if ! curl -sSLf --max-time "${CURL_TIMEOUT:-15}" "$url" -o "$tmp" 2>/dev/null; then
rm -f "$tmp"
echo "fetch"
return 1
fi
if node --check "$tmp" 2>/dev/null; then
rm -f "$tmp"
echo "ok"
return 0
fi
rm -f "$tmp"
echo "syntax"
return 1
}
echo "== Android Cast service reachability =="
echo "PUBLIC=$PUBLIC"
echo
# Hub
code="$(http_code "$HUB")"
[[ "$code" =~ ^(200|301|302)$ ]] && ok "hub $HUB HTTP $code" || bad "hub $HUB HTTP $code"
# Crashes console (login redirect OK)
code="$(http_code "$CRASHES/")"
[[ "$code" =~ ^(200|302)$ ]] && ok "crashes $CRASHES/ HTTP $code" || bad "crashes $CRASHES/ HTTP $code"
# Graphs
code="$(http_code "$GRAPH/")"
[[ "$code" =~ ^(200|302)$ ]] && ok "graphs $GRAPH/ HTTP $code" || bad "graphs $GRAPH/ HTTP $code"
# Builder
code="$(http_code "$BUILD")"
[[ "$code" =~ ^(200|302)$ ]] && ok "build $BUILD HTTP $code" || bad "build $BUILD HTTP $code"
# OTA channel (may 404 until wired — warn only)
code="$(http_code "$OTA")"
if [[ "$code" == "200" ]]; then
ok "ota $OTA HTTP $code"
elif [[ "$code" == "404" ]]; then
note "ota $OTA HTTP 404 — not wired on apps vhost yet"
else
bad "ota $OTA HTTP $code"
fi
# Device APIs (no session) — 403 on public edge is OK if upload/heartbeat work
code="$(http_code "$CRASHES/api/diag.php")"
if [[ "$code" == "200" ]]; then
ok "diag API HTTP $code"
elif [[ "$code" == "403" ]]; then
note "diag API HTTP 403 (edge block; use upload/heartbeat for device path)"
else
bad "diag API HTTP $code"
fi
code="$(http_code "$CRASHES/api/heartbeat.php")"
[[ "$code" =~ ^(200|400|405)$ ]] && ok "heartbeat API reachable HTTP $code" || bad "heartbeat API HTTP $code"
# JS assets
for pair in \
"crashes-app:${CRASHES}/assets/js/app.js" \
"graphs-js:${GRAPH}/assets/js/graphs.js" \
"tickets-js:${CRASHES}/assets/js/tickets.js" \
"i18n-js:${CRASHES}/assets/js/i18n.js"; do
name="${pair%%:*}"
url="${pair#*:}"
st="$(js_syntax "$url" || true)"
[[ "$st" == "ok" ]] && ok "js $name syntax" || bad "js $name ($st) $url"
done
# Authenticated API smoke (optional)
if [[ "${RUN_API_SMOKE:-1}" == "1" ]] && command -v bash >/dev/null 2>&1; then
if CRASHES_BASE="$CRASHES" bash "$ROOT/scripts/test_remote_access_api.sh" >/dev/null 2>&1; then
ok "remote_access API smoke"
else
bad "remote_access API smoke"
fi
if CRASHES_BASE="$CRASHES" bash "$ROOT/scripts/test_rbac_api.sh" >/dev/null 2>&1; then
ok "rbac API smoke"
else
bad "rbac API smoke"
fi
fi
echo
if [[ "$fail" -eq 0 ]]; then
echo "All required service checks passed."
else
echo "Some checks failed — file tickets via ingest or Issues dashboard."
fi
exit "$fail"

View File

@@ -3,20 +3,28 @@ declare(strict_types=1);
/** Migration 008 — email registration + 2FA tables (SQLite dev + MariaDB ALTER). */
final class AuthEmailSchema {
private static bool $ensured = false;
private function __construct() {
}
public static function ensure(PDO $pdo): void {
if (self::$ensured) {
return;
}
if (!Database::tableExists($pdo, 'users')) {
self::$ensured = true;
return;
}
self::ensureUserColumns($pdo);
self::ensureAuthTokens($pdo);
self::ensureAuthFactors($pdo);
self::ensureAuthAttempts($pdo);
self::$ensured = true;
}
private static function ensureUserColumns(PDO $pdo): void {
$existing = Database::columnNames($pdo, 'users');
$cols = [
'email_normalized' => Database::isMysql() ? 'VARCHAR(254) NULL' : 'TEXT NULL',
'email_verified_at' => Database::isMysql() ? 'TIMESTAMP NULL' : 'TEXT NULL',
@@ -26,14 +34,11 @@ final class AuthEmailSchema {
'recovery_email_normalized' => Database::isMysql() ? 'VARCHAR(254) NULL' : 'TEXT NULL',
];
foreach ($cols as $name => $ddl) {
try {
if (in_array($name, $existing, true)) {
continue;
}
$pdo->exec('ALTER TABLE users ADD COLUMN ' . $name . ' ' . $ddl);
} catch (PDOException $e) {
$msg = strtolower($e->getMessage());
if (!str_contains($msg, 'duplicate') && !str_contains($msg, 'already exists')) {
throw $e;
}
}
$existing[] = $name;
}
}

View File

@@ -51,7 +51,7 @@
<?= Rbac::can('remote_access_admin') ? ' data-can-ra-admin="1"' : '' ?>
<?= Rbac::isRoot() ? ' data-can-rbac-root="1"' : '' ?>>
<header class="top-menu" hidden aria-hidden="true"></header>
<div class="shell">
<div class="shell<?= ($view ?? '') === 'graphs' ? ' shell--graphs-full' : '' ?>">
<nav class="nav-pane" id="nav-pane" aria-label="Console navigation">
<button type="button" class="nav-handle" id="nav-handle" data-i18n-aria="nav.toggle" data-i18n-title="nav.toggle" aria-label="Toggle navigation" title="Navigation">
<span class="nav-icon nav-icon--menu" aria-hidden="true"></span>

21
examples/sfu/README.md Normal file
View File

@@ -0,0 +1,21 @@
# SFU relay (Janus-class) — hidden preview
**Not in alpha.** Implementation branch: `feature/sfu-relay`. User-visible UI remains off until owner spec is merged.
## Layout
| Path | Role |
|------|------|
| `examples/sfu/README.md` | This file |
| `backend/public/api/sfu_health.php` | Health stub (`enabled: false`) |
| `config.example.php``sfu` | BE feature gate |
| `app/.../sfu/SfuRelayGate.java` | Compile-time preview gate |
## Next steps (when spec lands)
1. Signaling API + room lifecycle tied to cast session IDs / RBAC.
2. Janus or mediasoup on dedicated port (see INFRA — **not** androidcast `:80` vhost).
3. Android: enable `TRANSPORT_WEBRTC` behind `SfuRelayGate` + dev setting only.
4. FE nginx: UDP/TCP ports + TLS for WebRTC (separate from hub/crashes).
See [20260608_BE_SERVICES_and_infra.md](../../docs/20260608_BE_SERVICES_and_infra.md) § Planned SFU.

View File

@@ -1,13 +1,44 @@
#!/bin/bash
# Raspberry Pi router (f0xx.org): WAN UDP 45340 → FE (10.7.0.10). Persist via your firewall save.
# Raspberry Pi router (f0xx.org): WAN UDP 45340 → FE (10.7.0.10).
# Invoked at boot or from iodine_warmup_helper; also: router_wireguard_dnat.sh [start|stop]
set -euo pipefail
FE_IP="${FE_IP:-10.7.0.10}"
WG_PORT="${WG_PORT:-45340}"
WAN_IF="${WAN_IF:-eth0}"
function start() {
if iptables -t nat -C PREROUTING -i "$WAN_IF" -p udp --dport "$WG_PORT" -j DNAT --to-destination "${FE_IP}:${WG_PORT}" 2>/dev/null; then
echo "Router DNAT already present"
echo "Router DNAT already present for udp/${WG_PORT}"
else
iptables -t nat -A PREROUTING -i "$WAN_IF" -p udp --dport "$WG_PORT" -j DNAT --to-destination "${FE_IP}:${WG_PORT}"
echo "Added router PREROUTING udp/${WG_PORT} -> ${FE_IP}:${WG_PORT}"
fi
if iptables -C FORWARD -p udp -d "${FE_IP}" --dport "$WG_PORT" -j ACCEPT 2>/dev/null; then
echo "Router FORWARD rule already present"
else
iptables -A FORWARD -p udp -d "${FE_IP}" --dport "$WG_PORT" -j ACCEPT
echo "Added router FORWARD udp -> ${FE_IP}:${WG_PORT}"
fi
}
function stop() {
if iptables -t nat -C PREROUTING -i "$WAN_IF" -p udp --dport "$WG_PORT" -j DNAT --to-destination "${FE_IP}:${WG_PORT}" 2>/dev/null; then
iptables -t nat -D PREROUTING -i "$WAN_IF" -p udp --dport "$WG_PORT" -j DNAT --to-destination "${FE_IP}:${WG_PORT}"
echo "Removed router PREROUTING DNAT udp/${WG_PORT}"
else
echo "Router DNAT rule not present for udp/${WG_PORT}"
fi
if iptables -C FORWARD -p udp -d "${FE_IP}" --dport "$WG_PORT" -j ACCEPT 2>/dev/null; then
iptables -D FORWARD -p udp -d "${FE_IP}" --dport "$WG_PORT" -j ACCEPT
echo "Removed router FORWARD udp -> ${FE_IP}:${WG_PORT}"
else
echo "Router FORWARD rule not present"
fi
}
cmd=$1
cmd=${cmd:-start}
[ "$cmd" = "start" ] && start || stop