From 7aa7d2eee809ab797b0733aa6952f491bd84cd41 Mon Sep 17 00:00:00 2001 From: Mohammad Samiul Islam Date: Wed, 27 Mar 2019 12:23:47 +0000 Subject: [PATCH] Improve PackageInfo parsing for apex files "meta-data" in AndroidManifest was not getting parsed by the existing logic. Bug: 129091257 Test: atest android.content.pm.PackageParserTest Change-Id: I3d1c38ba3b2a0ccef6a0d7d0ee5ab857b62a7b82 --- .../android/content/pm/PackageParser.java | 81 +++++------------- .../coretests/res/raw/com_android_tzdata.apex | Bin 979219 -> 967811 bytes .../android/content/pm/PackageParserTest.java | 26 ++---- .../com/android/server/pm/ApexManager.java | 4 +- 4 files changed, 34 insertions(+), 77 deletions(-) diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 35d1eac5c0ad0..969dfefb5d4d8 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -4796,7 +4796,7 @@ public class PackageParser { // except for watches which always supported 1:1. minAspectRatio = owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.Q ? 0 - : mCallback.hasFeature(FEATURE_WATCH) + : (mCallback != null && mCallback.hasFeature(FEATURE_WATCH)) ? DEFAULT_PRE_Q_MIN_ASPECT_RATIO_WATCH : DEFAULT_PRE_Q_MIN_ASPECT_RATIO; } @@ -8373,71 +8373,36 @@ public class PackageParser { } // TODO(b/129261524): Clean up API - public static PackageInfo generatePackageInfoFromApex(File apexFile, boolean collectCerts) + /** + * PackageInfo parser specifically for apex files. + * NOTE: It will collect certificates + * + * @param apexFile + * @return PackageInfo + * @throws PackageParserException + */ + public static PackageInfo generatePackageInfoFromApex(File apexFile, int flags) throws PackageParserException { - PackageInfo pi = new PackageInfo(); - int parseFlags = 0; - if (collectCerts) { - parseFlags |= PARSE_COLLECT_CERTIFICATES; - try { - if (apexFile.getCanonicalPath().startsWith("/system")) { - // Don't need verify the APK integrity of APEXes on /system, just like - // we don't do that for APKs. - // TODO(b/126514108): we may be able to do this for APEXes on /data as well. - parseFlags |= PARSE_IS_SYSTEM_DIR; - } - } catch (IOException e) { - throw new PackageParserException(INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION, - "Failed to get path for " + apexFile.getPath(), e); - } - } + PackageParser pp = new PackageParser(); + final Package p = pp.parsePackage(apexFile, flags, false); + PackageUserState state = new PackageUserState(); + PackageInfo pi = generatePackageInfo(p, EmptyArray.INT, flags, 0, 0, + Collections.emptySet(), state); - PackageParser.ApkLite apk = PackageParser.parseApkLite(apexFile, parseFlags); + pi.applicationInfo.sourceDir = apexFile.getPath(); + pi.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + pi.isApex = true; - // Properly fill in the ApplicationInfo with data from AndroidManifest - // Add ApplicationInfo to the PackageInfo. - // TODO(b/129267599) - ApplicationInfo ai = new ApplicationInfo(); - ai.packageName = apk.packageName; - ai.sourceDir = apexFile.getPath(); - ai.flags = ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; - ai.enabled = true; - ai.minSdkVersion = apk.minSdkVersion; - ai.targetSdkVersion = apk.targetSdkVersion; - ai.targetSandboxVersion = PARSE_DEFAULT_TARGET_SANDBOX; - ai.setVersionCode(apk.getLongVersionCode()); - - pi.packageName = apk.packageName; - pi.splitNames = new String[]{apk.splitName}; - pi.setLongVersionCode(apk.getLongVersionCode()); - pi.applicationInfo = ai; - pi.coreApp = apk.coreApp; - - - if (collectCerts) { - if (apk.signingDetails.hasPastSigningCertificates()) { - // Package has included signing certificate rotation information. Return - // the oldest cert so that programmatic checks keep working even if unaware - // of key rotation. - pi.signatures = new Signature[1]; - pi.signatures[0] = apk.signingDetails.pastSigningCertificates[0]; - } else if (apk.signingDetails.hasSignatures()) { - // otherwise keep old behavior - int numberOfSigs = apk.signingDetails.signatures.length; - pi.signatures = new Signature[numberOfSigs]; - System.arraycopy(apk.signingDetails.signatures, 0, pi.signatures, 0, - numberOfSigs); - } - - if (apk.signingDetails != SigningDetails.UNKNOWN) { + // Collect certificates + if ((flags & PackageManager.GET_SIGNING_CERTIFICATES) != 0) { + collectCertificates(p, apexFile, false); + if (p.mSigningDetails != SigningDetails.UNKNOWN) { // only return a valid SigningInfo if there is signing information to report - pi.signingInfo = new SigningInfo(apk.signingDetails); + pi.signingInfo = new SigningInfo(p.mSigningDetails); } else { pi.signingInfo = null; } } - - pi.isApex = true; return pi; } } diff --git a/core/tests/coretests/res/raw/com_android_tzdata.apex b/core/tests/coretests/res/raw/com_android_tzdata.apex index 06ea8fad6393b399e7c96344c2525939e495c082..ca89bf66c8ff9fe52e05d6729ca6491c3cdf8fe7 100644 GIT binary patch delta 18244 zcmeIaWmFtZ+wVJQ&_RQ{yL)hl1ef5!5`q&57Gww(++Bh@!6m^xxVyU(2m}wX$t}5? z=Y8Jwu6_2|U(R`It(vLs-&OysyQaG9>aL!SUVY*d_ynT-6b2S_pAde1faZkWze9%x zfn4A~AgudkF&k5RTXRzdBOCKqFCE^pxL8}o#>3F?esNYzx?9^}hlR_~ZuT`q zW}Erw-C*hnOE&819cdcxRAW%NmX6a0(fXpb(atj=$yGfx!O<@p^BxgCYGtpV)WWV_ zNlp?{AAczCX|P^Wc+vEzAxyW}*;U|nPOYB1nbhIalgjV~>mr#>Vwd{qLNkY|m2>C) zk1yWneyrC&nK(^ND&0IAw=b~YyPDUFfFu`HsZahixV{-JJ-pF*|KhSa^ZUD(Lf#GP zyvL43ma*RW&rtR9x?l`%o#s77`#U0zuK-GwY1Y;Cw_f>A-}zii{3O~4rC%5PDl(Afm}+1c(B zFB_5v(nCf4k}zbDG8ptLql4nn{!p|ta<#HGGG#HhHshX&u2mTZr=XQ9U%*6B!9p!Z z!%^wNi{JNTH__-8N({TLdxRQqZvw`tWV7qOU!eGJ7XHE-Q7v@v^Jvh}Z{OWJ97T&7CW6|oBp#mo z<-&WpW*N%eE>amb-b)!;5DF$zj1g+ETnraFP7Rs}3L#QVB;L#A5p1+NHCef`7gU@E zv|zll6Cy&SELHrrGBoxdHSbqKA>P-Ff35MynmEmSs|F2d(Ld<@0zUHn#y`5xX!rTo zv5#|~sqZsoq!?EGYt7%apk#l^Z2!3;-s}0jj^Oh@bmFw`oyh+|pa13d*P5iV4r5si3Cr5!7_KSUkMHA+*0COpPI|s4`SXtymds?XP|JZ-Mo1f%9*H z_iuUR-*Uf*=--0m--2Azf`YCbul*5>UQ33KdW800i){a_{eM`DKt)GK_`6HivZbT; zqQOJ&LfyAWyvj!~UM*P}>N12g$?ae!ZlAEKv%OL@aC)-p-sE>8LxhH~@RjQO zF>&=CyJ_Uhv8&dydw~bgAZQLcw@VhV)sos_?nD0Rn_XuFXTPi67xqRO*zxf536A1s zG_(q+7uBT02Y@_7wJoFK1goIiqOIgS{kU$|N9ET~_&a%+%O^%_$fFqOjgZiw;tM_2 z$<+D{K_CbS!2o0#{1WVDvaN^SHy=_RFccLAFaX`!9eYeahR*Rw(Up6Na^2v^pq<8ap{={s0bUAd% z4Lcbqa5;wsMuM;TO6}}VdWz3d21d{f1@haGS+a^zSzfCupCh>0ZA2dBJp~|dxlkp% z5`wPd)mx23v@V4+j}_9>d*yyG(q9o~!?0Q0qQV_b2jotNX(oPA{G&AsA1vbhdQdMD zVMG4pfBFXvlS=+r z>_~bOgbESKFm8kwVR_QqlkD{w$ZJ?4ur=I4i5`H-&jW+hR5h(e&q7C8!cWIF}T5{`o;hD4-%+49!>F+{gNM(x#xTtlk`2+ zst726Oa~IWv!c?Kqu~~O~W(j2tL!dugyde^Y7tr{~({P2pQS+Dj3^c_OtvNxx*-aQ>Ndw?+dj<9Y-uZ zEr)qund=SrqJHLnz#9Sby~g;@QV5@(x{t%69e#q+n72)i1oBI9@+aNp%^7!&9Y~l0C%rP}8FWUtc_yl~! zIG_Xf8^IdrY*e*CwS@uKj9Q-BiWOg<8({xIpwVuo zcQlEtV?XLxv;*R{5=J&3w!qfxP#C#CiNx+;enR3Ht)HM(Y%tJ4Z=1LmySlf4ZQTa< zK{5+Q6XIC`kXukKvc+UbBUN02RNAA#;0eQKc)O+4nIKHEPxu9WGq!YHt7$YE$;_|sc zdIamwfIWn-%S8FPi0uTT2Q-L7?mWI@F!U10QN?s##Yv$G<68pqRdj7q4OT^*q6^$~ zHvYTGNJ)}BAg>h$bH)`q)QF~NLCef9e&fWu+XQl+aCPF*pAOwc7)weMnbYLt)DRm1 zpurmzPrm7VBs$fXDr3EMLpxo=pK^h`W(1-aiPo~+frmI-ua>m0)dC&{as&SJ6r^#1 z3h$Lj>5@k^l>rj04-UiSR`GVt^aeZ(ny&NFo5$;C5C$>>pupETIZX|dx~u8+^+O|6 zJ^HiSg$W=pmH$?nbbebjONS@Y;GgpJ%IFZ&wy<>M#dvzTPA`y;_mjy5t$KdncHjRoDq#Q- za2!R70vb5ZUagKviS8}cq)&j9X_-Zkx~_qo*`o+bZ77yxuT(9Ay;{&;pT?mC$lq4R zn=HyJl-T)XkB&{}y=W_-{t4t4g~`;gulJ_bp=IZ)cOcn~*MZ7EfCi!$=G3os6fur& z3HWnoZ;6}-1sQ-mW;TDltt(oCO~MZS8ji8LbdE{{$g3|l-!$8qTr6v4i^&;M$o|-x zS^)C3zR$&)rBoVdAvpz25N%zb$7ik&&Q!)rU&pqu#9gu_ksZ^}q}*KcdkujC*-I68 zgE7-d@HiON#FagYP05Z_29w0Y3Up2wxvE{Tj%5aP=J&?=Zk=UmNrx z8%1~3W3ZqOpaIKuhMogEcDr?%wd>l9a3vc9UWFY>RF3nx7YgCX2QEM!b2WPQQdDDt}Y`d^27!h6YZ*0c9M=K%RdMSjYM zAq<;C8z9H?JLR|3={$c!Sp`m@@5QIEc>CZy5f|N$@+MBv65>7v5|N>W7`bxn>jMSw zwME|#z_|9Wse8Jse77=6?Xb23a+Akil5d3TtlSUC?S`Vejau_wO9D9pa$kl53{v;^ z^jU4u+`KvGkP|;3PkS+IU8_g}iGk+Qz2=;J&R2s{_h(4-mz9+mRo>c>@bh#%ErS z5;I3e!e0Ty@8qC>8L{iQ9d9c4Immi;$ZFMa(EB&MFDNr24m>FfvL7!f5Udd}HgdFA zd=R!5{Fu2~XMq&v!r!4Mw+RxNTTO(#2MVBNDZ#RcmDE&0UG~}_;T*VinP~#Kk;wHU zDcc+P^Qw%E>Eq{^N>2qvfn5BXYjk88tv)?jb_KU>56uFR?$?tnWoKp_615gSDl;yPdCTA8NoGQmPNx3CLaTL?ACG_&&3|@(`LT7J^)3UbFUSgs z%A@q}`F0X_iBxJpqmo?d_24imy!L0psuA;D7GbXzNPowcR2qH>6nM-2J_Dx`UTK_x z0`Wi;zu(T_>cOdeN_zK4UV;h1s!GL=!?h43OgfoKV0~K%tsDUh%Uuy$PxPnhfHmRf zu2@;10rx>lf9{*D%elHQ7wq2dIX1}?Nip}j$?qh> zBGdo5F-uVadQr7%jTVhk-RnWX0{P+6yc1)vEg)b@?CeG^e=$xjhWfkqeL<7PrI=?8 zS#Y@#jaD{A5e)mn-U`SOHOg4u!oa6VI~d&c1*U{QiZw_Day=ohRkr>+X5&KGsbZO1M*sC7HC|dy;UL0#@+kaq-|T8mj5@u_YWHG4377QHnk-r)V@=m5ijZP z=y-7bADDVBD6RjQ=F!;pQ|n8Zc3;}j2g9u-NQDkPu%bmv9#XbpdAum`(&E8zJ>qC6 zlf?BYj)YQ1+tI)x0kkFYyM=%G2Pwx0VtzYfl%_;RZ>o9LQ)F?xclUb>?+X+$!;bHD zXc)#jFblmvuRJx5&a8pFOz(>ftz5tD#!Bz4_sdu248y0QK%O|{F8OpS;I-xi-+R(U z^p><3Ri3~2AO1nZE^~v3=J`x4q4caOO4C^-iK;Jw0tUwDxV^YCuzcNqIfZcI*mV;b zj6nX8YqQ=savD!~f5zE|h>inCGwH!kw3)|R=Wy4wkXV3v;EAA4pxlMM_hFf%@zW?@ z=i*_b!c%5%z4yZOL+=M}K&t4IONi^`hg{kmRs2=aUAp0B2_P?(|MU`$?dE(~wj}W= zXZB_x|I4rIhTr}{jcbH7>ZD>OxC&uN;IzIKvEA@Opa8VX;E$l*?vn`biA6Mrkj)t5 zjW=J~7<=~w|jIs^0%(rY2D zY%?xJ_9_gS8qig#R;L;a1Pb^CS)dOt_2MM-6&j^B9D#MYGLW-Fs5UFFId6cRaP+7V&61i<=30z7)r ziKfP5^VgU(1!(`@G54`113uG1@P)>l9-`l=;v zfLwEOKn3}-SfXOL$0ZVF68HXjZqG;BzDQtoptSu5?d z1hGB#sd`C30ePlxdNWT-!&9P`@jA{Heo!CszOoxm(-c3s(fPg2Cx1M1>4hO+ea5FSgf%W2DV@BRLJhii zHjw9RksCk*SJlQ<4@;O2q2UzC-hGSHT$_T=fZUYfq#PSh3)Q+JWA+P_{c;qH;)B74 zcKJD+mEEktEUphhz5yh8v$gese!~ivetAI4&h5rQ0$0y-$jW{sRyWWAtFi?#oO1(? zs-KlD(nja4HoadckefF)z$2mQ^p?RBqW=o-sVQ0WpxJP8ncag*9tN)mw$kCK^XQF9h6xn*^FXK^J!P^|=xnF#hY? z=cSf4Kn_Q%O;V4_H@3^wVZ^mq&1ScA_u%5ym_vq(jt5+cdh3+}8FiwCS4{6-1_}TT z{vBVc@RJ?+%2>Z*Q`fy)k#seQ|LPW4|9^u+{!az|59>qz{T}G9FG;r~4DPb9?zIh? z!tTI-6KVqP;s4Y^|I?h(Zw~oyCY^p8{9oow|J|(DzuSOvF%;NbLogI1Z70IcRjwS2 zfvQZr1oM_VEvK}S)>LXzXL`w8lEwT)oytZcW(Z`Gg#AL}r$j}?FrG<*w?heu&~}nh z^l(a@Vrd3vtmU&%rUc~l9v*v&34%9r44p;;N{O0Rb!AI~)oy7l7WAnWLt}3V3vdl5 zsS}-DqqnnsaSarECdMfs6=dBudwR6(8ZjCozK$-OTQVSEfRoS^hidf0NZCxU7{Igm_K80&ikyt)X9}zq5xKx7Nif*pVRKFdBV#7_R~MGNn>8{O zZ&EW8P<`Kc5K8)#q(_=FJ@mzUX(~GCcW*enlN2eiRR*EtPbs|{p~!yd@}F0-8uw^( z9^k$+BCjHq<$A>z-3~FL&AO2T-_b#JcK20oys<>{9Ce=mItlJY6(!GEk6mv|rx3qp z))R`%nB}H*d#6OlyNVK^MB17pxnG#eOc9(kX{z?VG5OgELH^Av3C?hvLhKw7qbhE@ zjSyMR^}wIHpYlUjqKN$JnO%v^FVc6(>k%SM6Rla<)x1{c#)GNmcPIxx`m~evw8$8H z=Ng0xRDDcSfYLnZRA+JdR#!BNJ4S#SDMlM@NR1G$WCBJ;{Oi~OgW^q0z>!=M3(eEy zN$#wfoBRXo`U;i-4fr~hd1xGmY38&6#2d`1PTOy`9yy8-9guGK5Uz z*_)!RNB~=f?KPd`1}Dt5`PvgUs4O5vrX7+PvuF0^QSDP|T$NDiymK_H( zOc@ZdV~@DI2C1H|8+AY()JrU+INf1t#=5%p{=O0FWPHRP1z)UX|*** z8_5n^9^GgS_ZqUa1Vq-l@*0=rFvv3NaPiRNa(oWvP@2`9krEZNqeTSUq?@|E(`S};$x+85>rPNR^EVFkCKB|TGOhh!g44y2>-A)x-41Vz4j8(_BE^l%a=HjDhR%EZBJdy zIg{>FooG5;h1jQk`w-T#!l}}goG6)1U2!}I7Yp9oR-6U(>6nezFJP%@9SBFDu+<)= z>#>Fm69iR(KC)=A9G0gXDU@U+zr zD0Umk9Vle>1)ALw;Z3v4?rumg&Nip#jiQWSDhJ$U!u#%)#{r_;-P0Oz8uZe$r$J4G zUIfyvHpu7c&-^sJ`!Ku;e3~C!!YmXgydI}Qz-mqq`63^&JOm+se4hxQm5q|M_BQXdkRo4SiW+sVP+A0RkpT;a#4A$ zw+W&0e2G7$oKAL{A?@_JFvE{duH*xXo&2>XkzXP6ao)K>I+}{i`GxjD@=R>>MPhZW zgkA{mWWY;z7ut*pt_-&un6Dh@i(cIvOeR?EUcgzav<2H$mdblba_K(QojSiqT=kbxaE!S?317b>-}v^P zI|sUDD>_Aecap;p`$Yak`$n{0I?sU0JoU`CnFGnpI%?f5Q5G1;f>o8IfYCyBz7TWZ ziaSL4VE*ZMX-68~bKGA~$o$9-cz{-<>zfaX6>$sOch_*ptqhMd!QbZ_8RC{xcKaKETUZ-3J5wRd&i%Kb`-&E|sOh#GI zEFGw;gpvqfAh>%68?Zl~E=rM(POuUpX|g=1hz=h!``8=L2>CFW>TVgGqlYjG=A}~x zNV=beFXY*Gnn(>jS@0ry@71H|7;)q$m~{SE-^S=D*_UtKiv~fxJ>Z zuuxhg7k4PQ`HJE|e<~roU5B(o;2Zv5q?W7+yTqZA|(CD3f-%j86g@ym{c+C`H3*%wF|zA2OFUyxC@ zF()9lC|}E!uu{=~?)Gn#G`x@Cm?#*2vv!(zRx5^s%jJfLT$=Y}Vm1q!8!2IuXUX%M zWrTAv*VB!z=Lox)x#6Dq#)TKKJo?Bfx8KSe8DE)15S7t97aeLkFEfrVmnQLp)YvA4 zJ(WkZ6|Tuqf}7B{ar3C2OPM$sf8Or6IKV^!ca4fQvn}AdJg?9sXhT)>(yj2iL-hF2 zW4kamBQ%pTme^UMjbUMGq3OH2aGSC?UU6De>apFK)PbL2+lIXbM-NgH~`Y&3Xjk&K32Vw9XS@Z=(o#+H!>oL_1gzOc0T% zoAO&ThZr_l>;RCLwX*s1K+25>4*hn!Fin+yv>?eP4aQa4lb~8?2QnvKNCO%@TCd8T zbK6ogm9g`LVf5I(4WS4T`?AVva3RfNJt02M*N~Xg7am9pin03}fojG=p`8K4mjn$H z8`kG+#vi{kbyChX5g|L?dOwX@#G~A<_z@Eb*^jIiObC3$;*e8Er}{LsNEdzYG>xG}alNq>*8Q z#~$m&4z)6_7sc(>AC@d-tb5dT*5k|>LzZxvzU0;DV{zQ!nI+*15JA*w1Px9G#{!S8 zUoRyOnR(^5PblRK23c6m;8yl?M2idZ;-E$&ik-Si4aU}0P43LTyq%#IcoW~5MS^E& z*RQx}&%Qy!%jy=tX_f}Ovul}aPLQ8l&wEg<5iFtj~n3S;6K1?9$ zZ5LCV%;QJKVUPVwllhI+^m;Z8L71gP!^?z1NBw#LS9#>a8)r0np*uxWWu;sKQ7axkgVLBAf5UgB5KrDj8>a)PT zqLpGcgsPvJz9LPY^^_1)$sdZ=H;cJ!duSKRwSNHHsIW$c}N3 zBT?ItT#M#V9lNQ96blu`S2?bU)?2m0jWaE5Kh_Aj(T z;go4adRm_qPo24VU1?6o=&fUF+_^|R&d+`p<&R9;@b_KRxC_d01*1%85VQW^P)Uz> zT3@q!c8Z%^mj{WZePEKVRp_3knl-g_dQCrcG(0^JoO))XIodL$lYlgm;bna8&O&MFD@mAI;UF;>lCN1dx~g zeTqJ!Akh&a#JiS{N9asan7AR#aHkf9bUPuDzFX#7EkkD>QA$v&FEJY=z@sdM;}{j#8GsAZhr zJjaeuZ$7!pMPjGlk~>90XqKRD78X)Y61vm6O?`&lU(qn5ef_fsrtR!9Tv33_W4zgp zziL1=jK%LZKyk{3^v7hV27w!GqNxk53>Dr6ZFxm3YDWc5?;hmK)6GH!vhY3QoeGA% z4ZPWmJ!B64pc&>=_xNmW9n9^HUCS-Tty+UeTkW;iaDRl3e}9xKmcYfOgApL_k^Wpo z@B#6S>wVerKJ&tZK)>#n%HC(#`xsO7{=0w^YXnhVi^1VX65SWucD@hg^ced0~1$wkbp$a7p*jL1~2A|guhxV+Ponr_fJ9)shW*HCN`|rEYY~FBR*}P#& z(_x^YprIerfR4Oi*Wh0!D?aYz(z@{2)y{_E(q%)1M`ZAq^*=|2f`Hg*nfHg+y<4o)3hR4(A+UllR_OU3x33@|w)l7XJo zfo%uH1iOjUECUKn-D$s~;utgn#_$cFFvB<_O2MIfHg~6`HvQ93(A#(Yh~*3k4j;7-CH%^1 zeQ%+%ifumns|JeQRbI$r3`ZbB;56eY;8V;``tbLSuVNU%jka1ZTNiJ@ct$HwdRQZ% z+a?S(DrJwN-YTlPNfeg_$y*uje5Gz8;b8L_Ba;7 z>~>zS2q2{@Q*`hFw%s~!M$%^N3n?}oR(Y>>1{bX*Ea=994+ge|sR!L4mb4imvT{;q zQ*C%EWunpLA3h;4iERlTRfLckTXuR_Zb^Sue2#TJYh!kali{C|Tm9)K_|j&H{Vtq; z6&-W_=Ci#2rgg)c{(*O+;-O=WrnJxZwM1PaNeM$>+n=v98-}mokuN0o-ffOPn~4~o zg0DEAyUr3U8%nfyEYrTyf)MJH2nG|wa9*j$MOL4Dog}B8J}^GDs&di0IuY;mcl_B* z89ZiOiS$e_Wb}^3KP^7mVm*0-`pnDqUy1m)Z9Nley8oIm&UvMRu__@SWL=3 zTtXg!dA%&g6v{%Pw}Jauk~@h5>PSLRuv_m^vcB?^uB_Lg%y12x~nmI|8J;WWsmBo z3~smBWfC6?8Sq#05b|@W?`rJ#Ka=w(Im}xZBCXbJ>#K>4FHKFH=|FWpscghBK%u== z%n21u3bWV0KIDoJvu+|lHZ0KWYhY4H`Z0pCmKfUX#XJ*SDykHv$zL7;={hwkWIWD% z)xm;BIguruuqaGR@zE!`tst$d-Id{;=dJ-c9LLso_Mv<_|5*EGeJ5S?!&L_j;=&X( zsto_+o!PZafAd&qhQVhSj_K^9+&WXL#RT#F9QK4JNWPFBKRu4-KAqmV5)k}EQrm?qTlcqxQ__Th; zD>k`um=2Y9n8eEy%zDyUQ_+gX1}bb1&j78GzT*!_rj-n?n|94_eBmGOo(raeFyB8a z(JrvDi#;0i{oF_O+#k`rfwtI$iJwc|sn(Sys!C0jh*;!SbX)kaI)Xbnw^&lZkhO-u z(17dnz`SZjKV7$M>-8HicWgR?6TX{@+pTm7u^Q&4hVWK3ev2Q_^_A669%03Ypyx{Y zs)}>-v5w}_tjQ*bK%S8&&*ekZ;f7_2`8fnn1Rh-mlfzzZW#%mL-CSEZ zm|kI+)<+u3MAARGyL@Wh@ij;}3XgRo!VPXw`pB!zxAl_BGzFvK#&+&PM@jta;A51| z>`drq&uWx-R;Z=P({M|BS_gf87(0x3&X{h|bdrp9YueNnI(uSSqziAi4??^fA($q{ znp533;7YPlqXK^i`Hwt%0?ud9ZKC<%AK*z#PToYQoaOb(eAvozn~ z`-SEUg;09^&zm;mk^D6?X)k%OhP)rYRQe27-rVteLGiPo{uCOP6V)fMhNrzB;?wiN z)c+Y~{{KD9Kz(Yjmdk};#x zp;#JzfL$>rD$r0uW9zO*tw`tx9)h!&>n~=Cuc%1!+V)OYIe3rzxdN`?EJ@7EuJ1W= z`vH35lvYTyE`fVQ%Avaxs*deXz4}KM$QdTp{E*(-n4AfoTC&%=d5JA({``-zB2l5M zNH|81`-T&y%fs5&5lGBx6TV8V+~Uc19Vi%~#p*890}Mvn7FbsABC1GCTiEf3Y0o7x9Zo!qnHiPrgED&@+iLg7Qf zNMgv!!Qmj*QvE3EEaf?4QbUmgU+B9<$)9xIMX#ob_5CQIL-k$4aAF#9ebG8jdAe}& zxB01X(=0B~u68<7GsbCyUuQwltwZ98@>j5HT|X}I`uwc98}ge?Gh9!7`lKQ?sYW$2 zr)w7O_S5{~iNaJ}Blkv=dGyCi*SDIVu`4(sk3!gelRo6!`QSI;gIRC=Jq2UZhU;n~ zHdw-Iv0H?<%QuO|eNTC7MGH2$k*53=Q{yg3qBrSoJG^N#k1Z5*Ro|4!RxELJNUIG; z!+&dmXGSh=SJvRd<&0Xc;(1LfUoV^VpObcQ5LIeg+f&#srL8uFMS+k3I~B6$0x0>x()5 z(R+gam)?JUO-BscA42zY!~e`*{_E`UKSCfc@V}ia{kWMKn1wp!7K$HgQ7DO7(#^=#z z^M2<&=R4=R&R^%9z2}-)^SkGF&ssBU=AO9L(`b>DWf4L32k;1J000UA>ZpXzFRlG~ zps`zz0~p0LceVC4buxFhx3Tu{WPj}8;(Xl?0Pub7#e}$Nfe30OtKMQJV{!7KJwdxm z^u^1*6<`Je+Y{K>HDc-?Fp2H~0Q0!Q$Rp@bhI;@wAUiaKmI$y>gKf5s3A%-amJHINDS#iCzZjup zG{4fPdYA_Oo9P(0Jiq0EziC*Ls~C|+F@Zo&e`r!aCdw~u-wmphTS?(&Ysgw>{z@XL z(Ps-CtsjL8bOo;RLV_fL;t)>ARWX`4u}VoqlMme5HR@NuYmf^uV7jCSD-}? zxt0c!L)^7M_n~EHhP0leAf#y1kpfi?ehCoVKC&R-)bg*uCK+-q3lxV#gkG^gHg4HT z8zDh*P@SUkKuKV-IOH070f+t5b0+dSm7nPkN6#v8sxxP($@E7}SQf4G1ND-RUbDIP=b<2ga zwhsX0hit$@;BXP~ATJbvv~XX3!C!A-;N*5q2rv{WLLC^P4qva1AgK=b{+(1d!n?no zr?w73cSIFJL=|F06;ebMazqtML=|d8665s>=1^`0ptE*{JT{QOc>+`oE*j6y^Bu@PaW&vEZTa z(63g21KfhPaloy=b@3!&Z13>0F?PVbNFrG!&G^!E9Z4xXHAs|6LkOT>t?e&C06@fX z^wN&UfEx=FT|DH6{fC(&l_DtRAST#$mZ_+6gO4Md5U1W1o6E# zYh{b`ko5r!4hCQbO87j^okYzK8q?R`1%+AqSaZM#0G#SEl3r03<&Q@Aj^0y8S@rpZ zT>*<*7qa7`SXclG8ijEi7Ke&WT2T%E`#2Z?_}>v&J{x(D*IaBuNm;jVJJMl6wXpPFbPv#g8kdh`kKXitUIiNoT_o${^C!i`kJ zqIH?C!NW@m1)t_&@py2=XCY)VCA1fkhd8N2++rkKZolzc{QzbEo*|U)xPC>>pfKF{ zF!tnf(XQVDx1oV+u#u0|QThC#%EfqjG4lH`Pzx+B^S(dfkephL)FU94(kJA#m0F@K zEFS4zt?V|sr+sC$-Fok^df|IkdHLV?Fa3b-lie%*;iGDaPr=2Dr6O>ri~5zY1RT7D zT4-oFU#^0+sE0c>7XthAq+s!I{j3DBps`65CIa1bu6vl^?gkcE{6n+er&2a?bqZ&4 zTulHVOJ)pD3+JoYeKLDi(_6&DBNOhg8t0LEPA^M ziPSFWu()wcQq^{iPST)RWn7T}QlRW2XBI4;llpV->GjB$A>zPX((@mD6V+Q^e&K)X z2dtpu?i(cX-Jnun7|^^7{HZ0xng&aNDBFTayUyiZ&`X8arme&z%PURH8BV((Yuf%vv7;MZl5z$#|vugi& z{!kj@BbkIuw;$qe+}XtjF+CiDei(Lt*r5@TT|ZT{GZzAaA`6^*2&j8%5{mC(@uwq5 z{gXDR!Eg(6o4ZIiSob3mQ(YxYL z8glR@yQ%USdXznP@H)*)p+=mK4n)taRm=U&2<*D<-;UgW+@Rpu<_y*FlP&)b8|TF( z?FCvacRI37i=~t8=31J;DQZ;5)W;XII@{pYKe=xs`B^6dyTV544832YHs2y4x@T{~ z;zr3X z_Z{j#dNI;)Pg3x~y?07TcDf&frAOTpIs6Fo(!wk;?|DrLECJ63V}y0 zD}5HPDR(Niu!^WL5JSf65Fcf?#6gu7xRe=i*bAP}Jd`@9;{)}Ue9yz7a zkC|#TEcdbWPEY6+7Nak$WZhh1K-(53%fjv8x}Xi4pM2+dS+8Lu14aH~l$Xv9WgC~z z4;H5@q&px}!ykN~aCs3U8VEimqRP4Rnk}e@49VHff4=kxQb!G+On6o#ehf7qCh2MM>9rZv~6@mQ5FGj3Z`Ilfmz7 zB7zGrzFRs$JA!|lLXkC#@Vdr5AH3cQHEwRu=LUK2e^3A*sj#yRi^M6l$N-a9Fg9P( zT*E&O7N_YN)^e(H=5J$H_r4l^*zmBYZ2%U(59qztvuiBR7c-#`1g9&`J5ed$v1mHW zh#+kY!u|ce?;+V*2R0E@v7E33p(@QRuSIM};~uL@$(km*9-t}QdBh?i(iH-m>5sGy z20TmRjg&Xxr0#Upj2%7_OLL=NUAv`m!6EoB+Ew3^n87OOpfV(_n7K)wKW=7ZZN&JD zy+HA67WiA{@*-4v#pX4b8K3QE@nY&IdK~lP-`H&kN@|EV+f#7RtR3~|s;cn%)w4Mm96k3E+IU}5!zvha_w4X~ z8oRwrag(d7JN`*EdR`e8CwpH{bnuz&+_Daf5!=PHQ=8x7&S==L;ZrJdA>k$G2*!R6 z)_v3ANYXO`OAu;Gdub^?Gh%8;`fwN&@gU8K&=eMr!}BVZ&#hyZd{Vj=dq!OO%_g@Q z7WY^f!|f9MFpcwhR-&Vz;PfV99Xgf%#|iL1F&A`3w$lSEyVxlvy*CEGTD?<3D{OMO z+&M&BO(CwRD-DBItDx>X7LWAs>Ue=-eQ<5XV6!9&v*e4{zIO^(XpxcT8Ldx{H>WrR z48Y)fp3-+a1^(ked+nDhW~kKQkG4ypS6cON`NYPa|3RS<`eu*Od$b}piKt2NX^uk1 z<*d_p2Adj2t4p;Uktt`v)s2ee51Af;^~|vO`TTIlYCT>d7MY|n_L7`a=Is?Dz~Ztm zV$X{E>fASRJw8Sy&?!*$RIujw>`>MB@&MI?)e#f&%{6_x-8fz3lFW(foC z{nMC=c4G!5lFdC>Jk)0IEztyb%O3U5v&|k7M*|!FC0JYxB`u2u1-wqTYjNGdL!b9$ zm>Tnr!J#dvx|m9)WL1X}>(}DKY#)*Kl@XSJi8N5Pl88x$H6RE-<4SO!-Ll;T7MG!8 z5#^aFALb(M=erK7W2%4DEDno@`08=tftN(8Na&WLu*E@jnxjn)umU3jwdqrf45Gbc zf*XhaWGwj?~FKo*g z`zvhzSI8kbk5{SK;KJ$<3+c$CJbUi+|nsVzr^&fJ~w&Oeua^Ww#g5N-#;iFCO<$!q%eq^>z$>! zbF)L-C!v|J*~fPb4*SguqwvtR7-n-Jt=Sf)>f}K>SgRQf!1(E^Un3>vFlDZ9LBZuU zk@{?J9#(<>jmQ?u@@cSpNs`vc^$j|%ySMwnV zS8dKuKK;pm+uEE{Nm>D$#DDXTpJ&J``x~CBn_1Ub`Vnp>_7BEC1En zorJv2$qeS34&wB-g8MNj&V+nD|Kx^7FdK~2BQ7r@QUX3Pd=G*b5es3uW3Y^%vQCm! z>QuQ=qK-44+f7PzfbSTkPi^Vz$mQ=v@3Y`q{}6QqRJRl>|IPo`+h!_O8NL2shFFz} zO@2!VzH+Yjd;+!r*QSVO5nsnZS&K}}1Kq0_BWH$p?0%MO86CpqQx7kKDo@LM(qjC% zIc>1{eaM@m%$+WMG!lKbTk8Ud734$zZp44-2Q);WOmO!g>0kvCN{BwWFiBgNxHBA= zUZ2|=OVPfcPHOXQ&2~lONA)9yRiJk737MG8Bsbyn)W*h|eNpp;I00BZqqfCAfD=-T zi{V)QjH$~!qOREB7yh??Ks(pWxqMROeaG^=6yQgfjBv%`C$I!AA?W423p=6{19rXG zoi9fa*WvH<^{p=5s7oC2$Yk6}TXw}E%x%;DzOea?(^hKUsLePeJsccH!68VxM}n+( zi~rUSNQ!2^oXCFk)|q_`TT*qy9Y^`~E-b<0ZHFP(UixprG-Vt({cVF!(@djbaU~g9 zC;#E{D7!cK&ezzfPaWs29>L;|aq%6nn83!faPaqdN3xX+mD@C6^#i_F_2`P=k;`Is z47{zK`S7-3ZHNJuz;ll}_25wCi7c6J=zc*5*pQKE3>JSMV{p$!;Tr+3*+5U%nPZuS z#z{9U&hnvISQq<-xC>d$d9f}(K$M^WIvD)9f9Nt?K+8&De}i!N@EZ$a+7@HdtrH+D zL02th#BpiZEYtlLZ$%sZu!V4y#+I(zJU@rqQ*9+wYj);L9bl{+4m;y+#xgk%8($pJK8nIq?uj9 zDfz6U_3hTiAD1b+axOkII54LCl{J$`e8#h1J>d@sjnuOdbl{d-XWQ?6HcMkYs8k14 zP{Q0l0DwMQK+9YE@qCh?Bm^rb`b8Uj_ z@_OAIo~yiPq~lXyEfz~V>~KwU0f_EvWmON*UQ)9)f4 z5I9(TJC`4U74nm_TiQlBoJi$aW+)i{&N5rNK>pP;_r)EC(MEs296HEeOgB3$!Jrhp z!^IYn+K1lda*8k)oh5A4cv$=(MnyUV z_xE7&ODs`^WxCP?Z5>kHaXKX_1{#%)Zi3B^r412h)v{ojF6gQe$^p7C0>`IKubgPS>OT#HvjwM%B1{SME{%@S4+|0t@6%& zm32p0f#cl8RRdCMdkq;Q0PADLy*f?DJ2qiyd*LeOoUNcuHr&m52X)@ShVPy6{#Xn= z_+r-{PF4(j-p9+%N>XE80n3kovcOj4VTDm=#Xbjq#za7x!ViweQ;??6)9WjF*~sNU)ycoKSD7#o=od2I+{H? z&v}eD4U2#7>@`|Tp0&tuhyWMy6KQQ->`MO{jeZMd(R8JVV+nVYx8lD7(Iciel`HG=SOvvkoyG@sSvV}*0zBdh?_l`Z#7}e{Y9z>lL+S+AY zO^O)FTrRi_tKc3oB9|ZXaTUn8vMR#kOKnMEZ5b^7XV(n;Z??_;2>d_BRsP++-TzGi zp!=vh@P+CiIB@PGgc7?n`R(>_g?J@p;}2D78NtcoOWYZxnMwz6nt9a03aP?B)AUfh zH@Mw)RK#fL{a-D67;Q35o*f#q=&O-W7;9XT#Hfm96*pVG1iIe+IukU16dMxI^);}YYu>0vI|TRA|j zQ!brmO);`)!RXZv6;HYw1rKH1?3Yrnr5xDtUs(_ipw#u&ykI^ug}}>qI=1I=@!0 z$oPTqOBe6cJ5MeJ_oj~zmbGdGTcMh0Onorso8$*)eZ%}2J=}n_8cqr^%{}VesY=?7 zd0O%V;$fMHlV-fXy%>5nW?7XJj%wSc*~&cWwx8Q4za-k|Mk`_5r=0eNY__j1PH83+ zi|-K@BF=@uPuzvLUCMwbZ_%^3rV>8RPh7EB`y$Y-v@T;Li4BLAKA{oZark+^h$oj< zBzUTtmK!sGP&QXmk#u!{s!+$VGt4gxjq~_p=9g3o`4aD_OmajSJm}^-1N0OJ3Peo{ zgpT_6tQ3R=vD5-3@lqFf-zagneTGOyBSarfrP7Dw@GUgwVM}g!TIY$YNgH-YewvQq zMi)Uw5KtbqxM4-Z5QH#lgJi*0cq?t`NArM1TBId|GFxQx&u2nxq7|Bc4q+V?X6Z^m zmJ~fY$(T3{z*m{Prkr5O>Br;-D6UR6mAS)4&HLzKYCR<1%pKKfxYr-^m9TFHkR@LT z3pLilS7JP|#zh$6mo-oFt&&(RoEG%-KMZx;=VN&tzdKr+Gxxd8%M=UD3{Gz0 z{Fn=k=Co)ta%ugGhnR%wi=W3CQ^RnN8jgAoKkR6ZAzQsJ8ln4gOrD#lgr;n%9#^?c z6k&ErzhMJ{|SxslHE3DL8-#ChZfecH{PpI;AnRzV40aMkWkXd*|Br)%BYmcf!D%HFJV= z9puq3bgOfUauyav$Z|T5QB?^$qE_q9*wGWX zV-0e=xUAFw5do`UPFrxNL~Gvew04VxIALDpXQtytIKZSd>)z&U(Z=p`)nU&f@_sfQ ze1tMfpTc3pX;TH7pqE~T!P=Xc{@fvUWd|JIf{}vkl6FOTC}fL38G^}xMS@Y4<6vYL zt(L4gsW1FPnpqC|Vbz2^Sgb2Pm$4#O!J;}C6&R{4qR&Su?1I4C>9Tr!6L#+&J-xp0 z;fmU%8LxKj##{ZQYp{5BfAKtQaNEaWScvNfcyxX=E+vh*bL50Gy*wv{CQh5)^z2QZW`dxnQ!lI>3F_Cs}FC zrc}jBNYniMH?wXzitJgf2b#g z{$Lz5@y|7o5>6j_eLK&x1h@d40PFyBfHS}f;10dAhlcC`Pk=u(G>3)|sviiH&|_C0 z!IZbeP$&9#cpLvOdZ1~)_52qMrVO{|@9+R9D7W`XC49^D+ucqdrJSwYUF@w?e;?)Z zb#i>J1r~YOA&Hmq4A(*$2+9pkOh$_iL!(mOV8lX+CT5|hKxF6!p=fBRyCZ-krR0W) z1d;Leg1OnI~MtWAdQ*mA#u?U!@omyh z(Gj?|%e>Y25w*Ogs$_*+CW|q$ZUIi_gIE2DFP|7a$ZCoMT`73{7*~CTowV{+ZsU5} zt%&BoAVL9!1G>=w~%W#^K`>;;oYK} zCBsmkxUA;~T0C3THm+xQ0u2JYE(QJ)n{WGl85YzZAfq_L9f;RKYd;LSPW+x_mHU>DA0O@wimX2w4z;@1uWa@tTuw>Qqt;|f`*~8Ux<&p%tts;EptYiFXl+-| z(?>faI@U`c{J{Xv1grO{=Xl)J7bx-G*4+u1Z>)9Ca>zJ(nwQS~u$>FXC0BL;-ZtJY z;PU2mMZBfey3+h}f$|SW(bs*JD|T1tLz?(H=~6LdyC1&uj5*m|gBQl;OTSX}r<}XJ zpw}y=pU0UU5TKZlpM`vPHau!T;QJPQux(0w|Gi(X#DPQK*OFO!?6=>LS_v#|XS=S_ zr5HBnCCbL>rM@j?Tb@&97%5xK+^hoYg}{-;5A3|R_?zp#Rz#Th6jrbGMGc42C>**z zN~odqEs>uY6ewR2G)xB@g*-5cW@G=Lo;ss7$(9$rt(CS;^-8NsNt$EkDK*)<2$78_ zp?Q7mLp!sORmeH$wu(CWdxtEbRRj1U9Q*#Dt zH@~F30PD36Qhu#-(rYz!;36jqBAQGvQxF0|l^49DG^6lXZaQ|^sXqO)U|=FiK2X}4 zf`uzh)v_DBMQ#>B!9W?}MAAep-S@1^LN;=H?->RUjU$}4fIeMV`)hrF(O4yh7l2a? zq}(_R%Pw^y@Z*x&oBJg@c*4(Ac`z)m>`BQn?ecU`J_ADR;II_$%MJi)(Ka1UU7EO& z%TA6vDo&8v;ap7i5%sYL;hwIPHanX%iQ{dfvU84sT`oTb*Yk4mPg71R}|s=`g@4;10p(vG`Gc=OrLVeWnO$Yad-p6C6TY${cL=qC6l zZ>>UP*V77-lK{#wqX)X@G6p+`D#1fKlaEguZrVQV)A=<-R3!KZ`5b7G6}fL5_iPMa z^Y~g%fH~)#JZjDO9uIbM6e?~%k~wwX@H)Y#(mEacQQy_f!F(JAog5fMnt#IdU= zIhn#_tP^!8MVY0gC1bHTMYbi*JX5gMkyGVG2mX`u4hHx4i;BjFWUsFx+eLZ_-E{nB z5JrZ3>>^6I2^z>MAkPAC5VzDm=oKa#)C&}6YJl_R!6v4*S~}zby8$ojo4=gO>x8CspcG);QG!TH#)$Ou)cA~^0C zbj zfCJy`Sx{k9fKHoMFM}j)^WwrS024l7j?-=12*Jpz3JLGq1 zRfnz3Rb}QZHX~26OE^CqFfxf_kz`Vc7YZoJWbm&%Znn&4LC|}0pMu#nv}-z%zjVn&ny9WY!WEH zL#wx+i%h;)XAAOu>=1j}=HRe=*}#1Xt|&{TmZSN2f;jsy)6#QUzxA^~w^r%MOI=cy zp?pL!vHHpfps(Q4-KI5WKh(!ZQp8(VybV?+_T<(@)|93N&)wbq7hifroW!)07YKnr zm3@K733j+S&W^`8S{jV?Hx9e0hp#2eEA~(?DYN7w_%;?;z;j&EjfYEhboFc=4cx4B zz4&Z{fsA3zCd8(CE{-|@$*;LJEcF3D<~v2V_TjU24|cSdsCr6QBVLbA93)jf4rWdd z3!IRk#t3t(`qlfC+I+ED$(es!|5_N|KDqWJjk&QaSL)#n+PC-VDB(G2m$^|i`zp1m z;cve4;QTy(`9xvpyw~59T-N=4rdkj9_=)7n7_-`{C07J_kFO4*>U1T-XzUdB{uAgn z(hsZF@+YbaSrPd}7e+7mDuv%XNNI?!ZjUUI8 z=IQH~(1j8G3T~$G42h+ax74h5*OG-B$BBH_)l)aio1Q(A$p3vV7%xQ zf!;+V)1Ei>^Jq>h33-uXHKk58kT8+h!K6vJ)S5~SRt%S!Vr|@?38_8++=g|gy1;hKEHwxkqk;|kh;oRvFb|9gWYdKb+oaG2XTjU z31Jcpb3_P+gt81R#JIcieLo(oNseBci)*-W;h2CM1mb0bJs7a7OW88U!$Yj`$!Iq{ zYAoOvreetCY?WKeRVn7!JQUx^D@Zz5u)Wv_s(176Axp2v>s-E?q?sptwGKu_iqb_z zO>=QKCL8h%;q`HB+Ps*N$=-W8nx{I`4*G(qCu6$VA~=xH!#_<{aHhI_Hk)hg_+B(| zB?;HgbF0*|7-{nA%*Ka4pf0@A^qC-4qTPhB_)DGGuk%p}WgL~UST8#Dp2NNJ+KbgC z^t70^svQsrus_mu?QeBFOcMh;U8bK#oef8R^6*L8U>O(Nab(atde{FE$MVVz@#rzp zL+l&Y1dSLWXbEjD9qo|&-4^gw`!!!2xZ%+=n$I@Y)JV>})>n;h!U~BEaM<}kiHnsi z%q~@r=W~sGYXbP=&;x6c0RSTCnU?>Fm4^7sLWc-PgNVUSg9FZ?k^spuvFMw{c@#W! z;uLn@QvgC&Y49r>E2I^^jzK(@tMiwIs;{PZhlaibhP66PBau6OA0E`+Q1*-EFq~$~ zkAIA(q7nM>k^Q@&p4gIK2`0V{iJ_mj!#gD*B-_>MtyBz*InMcnnIw`CC$G?){*6w; zU1ald=lkB^%O5gNk&I2ZT;4AtEDZ3AF(w;%yI{#m84VwL;_A?I_OdH;w9X)H*90QW zn=#CQSCKsN;nWAWcjleU?7n63;AD zsPPmC2VHKgfJ;jRp@18qv$$JF9Es{y4UJboy(lNl>G!H`z)EuW*UnIFeTz4R*T1M(;C+ZD(J)zoW z-J4p60_8-2dd^TJsE6Okh6lm{fq3-1rV|yY5!R-e47SCKuOfjoHSjB(7)Yqh5sDEf z7;tdthyc!zL`Zoe$Won^lNkwK2Lb*bjirl|sjZ8Pt)sQ6`CpSTQ%`>@b5CUwzD}l`!Jc|LA9^KoJd+U!-uVsEX-#C&lz@Ap#*v zx1BAbb|1HF#JSTQ&*)Q?f)<*G`STQ2q{`e}aNaf~YUo$@n&pP_Y2ra-H6JJ2m%`=~ z;_2l(hYuvQK-*x`P^)TJEBnc(%=hjuFe_j>=3hH(uxdHIBx9sUy|5@$yezdZU1O`` zYswWh6=<-b!fv&d7*_E_>z~hjHg4YR(XfYpdGKi`l$iI;)CP@ADCZAjq|&&EH=9@L zb_>ZSZ++{d#a5r!<2f~#<+klai>fmn*<&2r;iFQ=;4SZi5wy*laxfxul#IG;D~Kmk zXem(25YUVfZn^Sk zVte7H!m<)3;ORHc5i(BNwroFa$sWiqycerPwyQ&lk@4v%eFn`gwm=zgEy-q_i@jBH$s<`r7OpI-K2q!il!9z26x;U%B=TD@= z>ud0a7ZDe=!XF;KeF>_5*Sp!OEbbd`g5cI?O8E1E?L!1kW?}}2`D+k07!(s;eRScz zHbX4OH{WbvxP_IX$w>iirDQY+gq-(-@&2a*ciT67C=d=Hx;rptct$ut#*lFn1%8<4 z@~!c~{5e5%k;st_v)U}ttDXjMvgCK<vc75QI=t_+)|oyuygNr*sJZQz zE7M3u7P0<=5dyYkSu_Moz$n@v(yU_Mo}KR0^r!C;6_uku4TX)3!Tj@DZLROX;)-io zp-lKJk#FNo3w0?~>f24om#HKJUTp*<#GcFI&zy*4iRlg;86CKD`R;XWWK>ExO4$Zw zXbOm5$_6bHd>9m|{XCGBoWq;v`2DG9Y$0Qp6k%g5bhO^u?y>N(`#giIwjFv(qM^eF zr}g|Bw!aylvX|^|8<@`8&E~cDbwgaqV_}iih-Ug;w2J?6Sy$)=7&~Z zk+bC7?T%3)mmE|g8K(T0AwyZ>*&MV;T0hDePMz%`rle;P!ggO1P)esF`oBt$U`J{5 z$|UD|bB*~3vP_!iN=n+|p7ak9I_f_}$DaQ3^x~PcLfa2s-ZF%VKH><-K`w~yKf}!b z-@^>}c9;Re!vWxa8)>a}S_i+4G`s)jMjFQ-EA2l<+JB6+{}^fiG1C5Hq(P0e!EC6J zcJI?k;o36%INeO#6h}1;n`=PmM<5Zir~U~>{SIL%{}|2+4p~jcvH3G;?h1oaK1>mN zk?BWNy^k4%MVO7|=7g>BE}t%lA))eZA@wqij~t@8`;wpu7@&MWh3&+Rh2;NzR+; ztBb}%f8y94V~m!@{9wzW(9w~!WU2D4aB&u_mmbP^Z{l$s&OaJi^JIq|SH3tC7?O&i zYP`1|z%KkSo?;{B`OkKDcH~lO=58@PW0oSUhQLL%%S(OlFUTUYn zp$N{*quC|UO`2)#O~Q3761G6?+r4O?$FfmXr4^aI@KdcDl@D42kR8q6xOR4Y2O1il z;m=M7$heG&zB=(R);|2X{nLT(6U8=o;CU%7*Ogf06X!itbW7n^0XDmS?LrFpM?e4ED-p?Zp5 zaQ=lRYvI}0i>8j3ua2S+_Y6OC$uFX`Wqlkc%w#k@=~(TWOf*j&Z<_gzWoW9SfnXeL zne-nc?LTV)57GV@Y1;2d3P6w0ZdcVH2bCZ^Su_B2E$#0U694)QAn1x3jQj6=5lCA7 z0UQvP@?XCO^ba2obc^~I<-hqhP#C7 0); - assertEquals(1, pi.getLongVersionCode()); - assertNull(pi.signingInfo); - assertNull(pi.signatures); - assertTrue(pi.isApex); - - pi = PackageParser.generatePackageInfoFromApex(apexFile, true); - assertEquals("com.google.android.tzdata", pi.applicationInfo.packageName); - assertTrue(pi.applicationInfo.enabled); - assertEquals(28, pi.applicationInfo.targetSdkVersion); - assertEquals(1, pi.applicationInfo.longVersionCode); - - assertEquals("com.google.android.tzdata", pi.packageName); - assertTrue(pi.splitNames.length > 0); - assertEquals(1, pi.getLongVersionCode()); + assertEquals(191000070, pi.getLongVersionCode()); assertNotNull(pi.signingInfo); - assertNotNull(pi.signatures); assertTrue(pi.signingInfo.getApkContentsSigners().length > 0); assertTrue(pi.isApex); } diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 5fdd872409c02..944aef5ab2235 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -27,6 +27,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.content.pm.PackageParser; import android.content.pm.PackageParser.PackageParserException; import android.os.RemoteException; @@ -95,7 +96,8 @@ class ApexManager { } try { list.add(PackageParser.generatePackageInfoFromApex( - new File(ai.packagePath), true /* collect certs */)); + new File(ai.packagePath), PackageManager.GET_META_DATA + | PackageManager.GET_SIGNING_CERTIFICATES)); } catch (PackageParserException pe) { throw new IllegalStateException("Unable to parse: " + ai, pe); }