snapd-devel-2.57.6-1.el8 > 6 6_6 3!y덏%!E/֡cs !E/֡j1Y7%at3]ޅ)['1U(Sebkm]>UdM^f ZzTGNy(Bl|>g^,@u'a*2ugXU} BeʁuZm~ZACʐRi{iI`4Yc +(UT4\mV~TB~gTF5C r{R!,i_Iv^{ sdyx# 6,fHyݝhAt{jE3m|>knm(@tqH!:f4Wi)ؿ U0 ;$+chOU6 26-NC|xv)>7؈k@t2`4l`˅d&R߈`_z[_tb-!KxMO3%.?1ܩnoN 7Ea\To5!Y`O `HnthMg`SoBp۔"~3ucPRzݩ>66fu/H@רiQ:Dg.#__z^ ݵXg@*GZ/S{AartilUo4l4ZF QEbӮ"HN&܎^x+ʝSJ zfݸ'#ٵJ+i'X|w~ ޱ'M2<ƋVߪklYnWKy<>p:<?,d  7 #/QW` _2 _ K _ dX _  _ s3 _  _ _ _,, _^`7(S8\9<:YG Vh _H _I ` _X Y ȸ\ 4 _]  _^ Hbdeflt4 _uM _v,(Csnapd-devel2.57.61.el8Development files for snapdThis package contains library source intended for building other packages which use import path with github.com/snapcore/snapd prefix.cmbuildvm-a64-25.iad2.fedoraproject.org&5Fedora ProjectFedora ProjectGPLv3Fedora ProjectUnspecifiedhttps://github.com/snapcore/snapdlinuxnoarch En |7f$ ]#zL%"71[%N=^%!# J'h h n*,P$ !'1!44G g t̗nJ/3T  X vjyH) _(Gqj!1!:!.FXUpBr(%n%IIq)M w51v/C7<fv _*DJzH# y@];? K .B"1H:.^MMq#FW& 9 BD@]\h7 4R<FE  .YF)q#WlP65A!T6 4} v"Z v24Nc8 B &~"V~ kc O9w/)#f PgB5} P!8Y. E ,6N}  zo z7pb3 Yj% Vnd7np 4= ! *,> 1V_3w cA"n : q'kC$/?! #_&  \  F`{I28D%7- "Z}_ ` MGs  -AnA)H%3N Tgp$) +X Ma i _ G 6<::="F"s ? . P G#_9Y$t#  jw$B.;.o 8 BD4 G KE#1 I!8@lf<Hb i X!]vi 1)4^%cN08~-Z E ~;k8}a )$ [&dp7F *jP82dD\0z%L,(y#/L ( ]t5x(F  h{?_  X^!6 Q    >XF\<h !3F R$gb U \G!v &0= v 8zt@1'ts2 B 'Z_5y ! !4: %-(z$D{ L6bPN*9t dQa- L, $ Y[<_IU e ~ (#6X(U ce!(." 9 1  5 Jp $' * Y-  !"0; 3] 0 6 U0* q `%NF( 2   e > ,(# g  \ Y ; `Xe#.  9< A H .O(S- 3 Hlu )X f 7[6 Z$ $q#  $ x  % %y`'^6(, l ,E { i+  `/dwQ.z&vs i $ ] 9  *)%U q  +  pOl7('pf  b e$  = 5 *< R d U7 -j b!'A#+/67 @ ~ 6 3"v  - c e } a v '  s  QB*@ \TCAYx !kP$oe h#6)#/, 78T!Hk Q ,Z Drq F? #\-+q6% (I o% A W uC m)9/ @O{U   1 N T06L #$r OJ% 3 n ~X-Z&}Y  h 4a>5I(Je z ' n)'>%P9#& %(&>i%$ !1;<3 ;% +4m  ## !pSt5 8$$>Z fG +G*h$z % =(5]_<(|$Gb 5  / o PB B#kEM  '8 u Jt)h'  |`#+$1L)2x,*hMsQ6\ :X RzaD' %3i02FWF %#^2W  8I2i y jk!$04X!}'" Trx. v*@ ,T9" + 3m>#>R j[H5A= 2LX pK { 4q H "L) Q1 ,Vv$7 >-m)' u.-.4;x R,N m5uL$RDPM=oI 7 $7 6`.o  F}:'Ca. 7:%D: [!,oӭ+$ J([i+  e>D f !%2'6M<p \ BZ1 In^0[u::3|5h G-P7" zL4  l5:4'^q7@'& $eK  ) )#EC\Ok.gse  7H j 9%eQ:I T  Dv ]$0d x  ),Pie q+0(zF )Rwj+*b5%=e . PrS; 7 O<*\_*LL6 =8]9 ,|K/zS' X-># ?+sw' b p 4 6 : a No78h( z)5s&H")>`>]'2B\"5]Zh{ LWgx~A- 9 )e=d&  5"l" &%.(&. t x{d&L  M v en !LWk\H *  f - Y0G# S #Dsr m2, W `bd*Oi'^<!5#3 #&7s&3 (e/5  3 O /J1 -)8k'#x B!  *q   sB +p&!.J"p;LEO' %Kq+1K=<<OY p$i!-#!{!{ "n'30uz;E{'s\'smt5kFCl=6bHFEHHML L&;5gFFK}ffݖff$wz/-./-/:/GuG$nvzvz~ED2 ?*)D22DC77*f34ffffGGGGdH  00%&"%l$%E|1100c0z1001&11*1212W0v5v%%r%%%jD:0IK}}f'  C5#k1k1m^J*} d[Z"/| T7VT#UZ)>K 0" l mH0i4;R2D266S!N)&T2|/ Q6=fAaU\ד97 !BW *Ntqv !d%FOYg*'WD kr  SKA큤AAA큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤AA큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤AA큤A큤A큤A큤A큤A큤AA큤A큤A큤A큤A큤A큤A큤A큤A큤AA큤A큤A큤A큤A큤A큤A큤A큤A큤A큤AA큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤AA큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤AA큤A큤A큤A큤AA큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤AA큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤AA큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤AA큤A큤A큤A큤A큤A큤A큤AA큤A큤A큤A큤AA큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤cmcscmcmcmcscscscscscscscmcscscmcscmcscscscscscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscmcscscscscscscscscscscscscscscscscscmcscscscscscscmcscscscscscscscmcscscscscscscscscmcscscscmcscscscscscscscscscscscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscscmcscscscscmcscscscscmcscscscscscscscscscscmcscscmcscscscscscmcscscscscmcscscscscscscscscscmcscscscscscmcscscscscscscscscscscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcmcscscscscscscscscscscscscscmcscscscscmcscscscmcscscscscscmcscscscmcscscscscmcscscscmcscscscscscscscscscscscscscscscscscscmcmcmcmcmcmcmcmcmcscmcmcmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscscmcmcscmcscmcscscscscscscmcscscmcscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcmcscscscscscmcscmcscscscscscscscscscscmcscscscscmcscscscscscmcscscscmcscmcscscscmcscscscmcmcscscscscscscmcscscscscscmcscscmcscscscscscscscscscscscscscscscscscscscscmcscscscscscscscscscscmcscscscscscscscscmcscscmcscscmcscscscscscscscmcscscscscscscscscmcmcscscscscscscscscscscmcscscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscscscscscscscscscscscmcscscscscscscmcscscscscscscscmcscscscscscscscmcscscscscscscscscmcscscscscscscscmcscscscscscscmcscscscscscscscscscscscmcscscscscscscscmcscscscscscscscmcscscscscscmcscscmcscscmcmcscscscscscscscscscscscmcscscscmcscscscscscmcscscmcscscscscscscscscscscscscscscscscscscscscscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscscscscscscscmcscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscscscmcscscscscscscscscscmcscscscscscscscscscmcscmcscscscscscscscscscscscscscscscscscscscscscmcmcscscscmcscscscscscscmcscscscmcscscscscmcmcscscscscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscscmcscscmcscscscscscscscscscscscscscmcscscscscscscscscscscscscscscscscscmcscscscscscscscmcscscscmcscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscscscscmcscscscscscscscscscmcscscscscscscmcscmcscscscscscmcscscscscscscscscscscscscscscscscscscscscmcscscmcscscmcscscscscscscscscscscscscscscmcscmcmcscscscscscscscscscscscmcscscscscscscscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscscscscmcscscscmcscscscscscscscscscscscscscscscscscmcscscscmcscscscmcscscmcscscscscscmcscmcscscscscmcscscscmcmcscscscscscscscmcscscscscscscscscscscscscscscscscscmcscscscscscmcscscscscscscscscscscmcscscscscscscmcscscscmcscmcscscscscscmcscscscscscscscscscmcscscscmcscscscscscscscscscscscscmcscscmcscscscscscscscscmcscscmcscscscscscscscscscscscscscscscscscscscmcscmcscscscscscscscscscmcscscscmcscscscscscscscscscscmcscscmcscscmcscscscscscmcscscmcscscscscscscscscscscmcscscscscscscmcscscscscscscscscscscmScmcscscscscscscmcscscscscscscscscscscscscscscscscscscscscscscmcscscmcscscscscscscscscmcmcscscscscscscscscscscscscscscscmcscscscscmcscscscscscscscmcscscscscscscscscscscscscscmcscscscscscmcscscscscscscscscscscmScscmcscmcmcscmcscscscscscscmcscscmcscscmcmcscscscscmcscscmcscmcscmcscmcscmcscmcscmcscmcscmcscmcscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscscmcscscscscscscscmcscscscscscmcscscscscscscmcscscscmcscscmcscscscscscscscscscmcscscscscscscmcscscscscscscmcscscscscscscmcscmcscscscscscmcscscscscscscscscscmcscscscscscscscscmcscmcscscscscmcscscscscscscscscscscscscscscscscscscscscscscscscmcscmcscmcscscscscscscmcscscscscscscscscscscscscscmcscscscscscscscscscscscmcscscscscmcscscscscscscscscscmcscscscmcscscscscscscscscscscscscscscscscscscscmcscscscscscscscscscscscscscscscscscscscscmcscscscscscscscmcscscscscscscmcscscscscscscscscscscscscscscscscscscscscscscmcscscmcscscscscmcscscscmcscmcscscmcscscmcscscscscscscscscscscscscscscscscscscscscscscscscmcscscmcscscscscscmcscmcscscscscscmcscmcscscscscscmcscmcscscscscscmcscmcscmcscscscscscscmcscscscscscscscscscscscscscscscmcscscscscscscmcscmcscscmcscscscscscscscscscscscmcscmcscscmcscmcscmcscscscscscscscscscscscscscscscscscscmcscmcscscscscscscmcscscscscscscscscscscscscscscscmcscmcscscscscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscmcscscscscscscscscscscscscscscscscscscscmcscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscscmcscscscscscscscscscscscscscscscscscscscscscscscscmcscscscscscscscscmcscscscscscscmcscscmcscscscscscscscmcscscscscmcscscscscscmcscscscscscscscscmcscscscscscmcscscscmcscscscscscmcscscscscscscscscscscscscscmcscscscscscscscscscscscscscmcscscmcscscscscscscscscscscscscscscmcscscmcs21583549dd260c6d969e1603f4cbb9be6ea1efa8b17bd6a0fbc7a45ed7c95825786bf0b05ee9f95d50b1373ad8bada003cb2c7edc04260badb3134a829886bf9e0e0ca544d91dec35b073e31b48ef786ed552d866c467c51db69ad3ea28ec6f69f54e72ffd47d112645313d6a89eb73c21ada1ef6054ffcd6e5e571954daa095f364ee020d414691a297f5820a44d85930b43921f5e7d05d68c3e3dcded5f9c49fd5a490873c57aaedb21e56a7bab48253e70939d3110abaed37336c848182d36b24d7dfc697c2c239663346cc4014f1eae4b173b3397f99c385cd4fec9a9cce59d2bb2f8c9875933627f11478ced16af4c2dfef02366318bf51d197cd5e5de313017fc78ee6c9fdb486203661ef21e64dfcb1482a9e161c584bbc780dd890bb6aa8663d242970b59c161b8f779a71d9e89b685939e8951933c3928a4b52390e97442e3498280905630373b2013b2a6d96311b3d11adffaecaa86c006a0c8d70bac83f2712c2d63089757ceeb3405ee3161f7e7c1c65779ca349f70e9ad8aee2544554e224a63c213f02294094239c40b67925d6e9124e0cfc1dd74471299c54e3964cf8b7bbae31457776b0d80c86b91b91b2fe4d23ecc4a2d9c14945bca7b61cbab3f2ba3c822c80b30940dcdaaa53205c4d69b7a7e5b91696eeab483bb28ea2471183e5b7a25394d68cb847edc9196283bdfc74e62fa421db1a962d43b8fa8116b6ee7125b6ba80408d60dc6f195f7a68d25ead6f901275fc2a8ffea0c9af326381d1090adbed4ad70ba35589b4eed13cb69b68d84b08f242d8878c9f9ab419c7c14af100d0733a413eae9f9516cf2e38538ec1ffcad5a72c5f793479db57cc6f4a19bd035120f65ab47faee1b629d1da75cdcba1d23f696eb1f73aa27117ac55d67a5a36633404d5abbb75837f61555505c85da717b6ea0bdd1971146c9dc8e5c6ffb8ea9187022c059ed2ef0a8f1e26275187c6e54333a3c4cbd00e974457678e4597def7f615c0ac71ce507eba58168c014ba31339dab4752c2ebdd3122a94085e13217bc40f40c0845ba74e47d57f5334c5e0a4c7dd072fa62382d9b5e93946d24c9961e6002eecdc6e777a5a2fab19ebab4a8318a9d9f6de4ec9fed0b9a7dbf39438cd0c1fd9e46326138f95e48cd52ef2cf7cd196959f8683a1e52e2f1ce348bdbf5e819e1aecfd28c00a5cf63d5774e69cdd3d35f1087aa82cff549f08a7be81fe2893032262299a48aadd962321862badc3f7f7e38418fadaa0e81f3a18fdc52ecf139db17c077f0cb8503c3eab7c9a923c763239915a076cb096da39829e782c3ee89177f62248ee42c51c5cda2c406c2006ec6cc255b3c13d4378b9ea3c198f7feba07ef8ccee89d4444da8570dc628badb1a5f57a7fa49aa8d768d10a245f3cedf7786cce9d73e8d44e1925160b86f1b43a8e59f1a7922e2e7144c090dad3bed4d8f6ffcfa2785d4abb4ffba104426451016cc886d68fc8f6e94fe0268ed21747abd9f29aaebb66827eb4bab14259d60c0aa7b40bef5828e0dbb2daab5b3ee81050da4342f4281f3032df639f28e0469722d6be097cf8961a6f3116fb656b21c670a81363ee2ea99f22a3252415a44ce2afc9d6e46c3c7e3ea5941320c3ab35c3fd6194381a76da6d98850d44b536897cc200eef739b648aced2aa7ad2f9ea2fa10ff5b67f5b3a538795cba65c44fae9434dc358c9ae32cc693bafb86bc33c05d61944aaf8913ec6c866daecd6b71abe6b745c1fa2d13231e87819a5038ec7af7a8a999ce458f38534488c23ac39422df97aa9d94025a84ed6c9eada14ece164348503a45433c4a312588c06005ddb94ba5b010289a3ce55d92bd7ea1492c1fcaf3c3fa3dde55aa4482e6759df72ab0155974424e39d42fc305ba52c2adfaf90b2496e27267c9841920cb5c4fa4e6bc58fedf3482badbac81e7f51a2b94847cfe5ce59607d1e9d9fa7dd9962cd747decb45d7235636371d66a2db005b0645a29a17792089868c76634eabba145115f63f1390b4ebac13845885aa2c7cd33d11329825d14080c3420c6564257fbbc195c78b2017ba104ec5005e367930d974ecf201c9d026f5c688a79929b71c62e165fa712d952ed45f0a6640278d9808ccfc0ff62254c81dbd6b81df11de6f4da9fe4833b6930c646d67373db68ea88e1c76935d4df1762e5ad8ae64d5bdbf3319a5064624d73c9697eba5c3e158bbdb40efc5ec08fe24ff1126e8edb59e6f83a7fb87d9a7cc96ff45e08da05e03ad01ba557905103a208f071d9a4bf9e4433b3b5efce73ad7219eeb0f4fb713c457c8ebcc035af65a3aeb43bbca0766044af025130c90c8c8479741b26ff4ff4f77d74a806710a00158c794cd12991e8951ade78c55686c344cc53672583d19494aa450ca68464f33cc3002f1084933032a304136289c01cfbf6191ebeefab235fc6a3a3baddb5aa4a6a587ba7138f1ffe0eed3f12f68888c531858ef660f39ced275bac9dae1881bcb73111c5b0309f05c7331d712ac601cba819aa0e7b60c14fe3818f056c0b78065562a0cfc830ab206c515a585c7c0933910faa09f43457a69becaecfd29f53371f7a0164a0f9ab8f1b59a80dbebfc9f7f259f68e47e4cd505487628cc60c3b138f316242af47c97ed2a247e68f6b514143dec0ed72a1963c5d8845c2c1210fac53ec3d80e790a09b51555b768d53f98e91351bf1197dc5ad0b25f02d3d7d265c8db1ae963e108eda4ae3c69c15d657145aa7ff94f309b5b999f15d33ba32adf113b48741eeb485cede25e8877cfb34ce0b345006955c4fe82b2fac181530c31db8bbb0fa726a986544035167532331d55e97c5ea70fdee27db8c5931cd006cefdeec3cb968c51f8f96715dfbb5197a1dfcc50b88e810e6959ccee2357a5911b02a3989140d85538403b43eb91d2d5e3eb6e0ca4836176aeec207ab4b5f916f7eace722ada627483e32a93390e9d2314b96de609a3d435cbeaded714c6ccbe6321693b6f1c81221946d2445c0b08971556dd3c8ade18db4ed4946a4c4ac35983bedde94bc4f453280c0eb11a510c4215e47329b2ea17820d2825d9db5a86e6e87c1fc5125af7488495fe7bbbe1d154532fb27dfa908cdae91dc22f5eed0db3adf9a0c25b6e13f04fba04426ab99f5973c5af9949c583e5cba3f916853ce76dade7a056fb064266d467f2820922a4a2d84b22be7c791658b8b8c17d8cb495149cba02ba4f3b02f9fd2d65cede43144f1d4735b06b611a6dae3a5b875b94974bbf1df9a6514fb91485edf4242c965835db97b40110b5de8147d0c5be2d33c82660761c0feecb4366618ba62190efba37264cf5f8722093ecc9d49f7537e15ea847b1df047fda42e797362a333ea9ab56eac5ac46d19b7ba423cc80faa562223ab9c0a9a60388e079bbd3b1a8afc5a66bd6ca8bc49c5915c9b6056070111f1fadab9336a7a1624c8b3746ca433a6919781251f7a2437cab45d84b651edc527deb14b4e2b04ffd523ebd6736093c31d5198bb271c9c2749fba7627b8a0a27100d3338c29f135a13cde45f5c4f50c218dc28d13242f7f802bcff6af21d1425b94880f0de24a15f48fe065f876484a7e471bf1cd8c5bccc5f8a01f2d887cdf3243fb0f2a83af850e45df3d6f9564155c2ddad10f2bf5c052111891dcd7cba61a5dd84cf19dc9ce593445f25372a946a6c4c2e9eab1d4aebd7740d1848ab57df8b7ef5d8b49ef5d54b41421ab7b5eeec5d7cdcb8a46a8ca13e0665aa9fc7b8ec882c4c4a90fc73308b4ef0cc5dff2395b3c77d164cec4dc18a2ee274dfd524c4238434ef0c41fcb71762ca4e8c03f8b4e7d03c6bf852a7026892cabf1af8b7dafbed5a57850f7361baf898e154b67364d7272344f0a0a7f6f9cd7619044c078a905bd7bd35658576b0dd0692cb43b6b7bf5dca143fda1b5de36acb01d88551a5cbd5705a39711b9112f314d515117a1a0cb12290d3f1afaa9d3bd54f7899241e51954882f67330764ea93112aff6963cf3a89143fa5a3fa59f007fe6b5fc656a09c3fbf70bd71ba97eb512f66320a0ebb60b646aac72368a991852a569b8fb2e808539665cd5f5c044cb128ed2c6069d265ec33586b60eca0a9d08cb70d4d6d99ea8dc3217a4541a6d5637f633cd21c859e7f3780d7f60f86be76bbed3fc28a2d63f1e2750dff0826c8bb587655ae31f8b6b2c22d3c441e1eb56a09fcb292d76e2ae1a90ff42016a9847de1b39bd5364c08e20a7c2d3c089eb50fe1f28626282b1b51029541f7aa13f2cec250f34d689f48dc325e3b7e37f39f4154432962b796c0a7d16b29e58e06fe481712eddf03f148e025a4cdd32aba3512c8f771c1bcdbed6141ae1b75407c9749bd243e057efdd4d6929183b5cb1a14835acd6778e06fc27495e6dec2d080b690f143c646287b7111addcb15dcd6f36b93fd56e2e74dd69fb2cf8a0730f79460f62b7eb620d727eaae07730674ecde33b9870b6a5e30d8073d283645f9b195301691641c3ab31c65c5af74d71963f5397271767c1710d968102f3d2adb60953107259b5f1658196dd5817104ffd99b5e6ce4b5e8e00f71cebc67864068e2d53c0dd1a490157f7ba3d27885adbe299a256e4c9df3061722973062f580ab95ec4223fb6345c86c2f1b4d468664c6ade4bda287b41c44eab458acdd620d7e9696414468e1889afce88942abdb06f6d34ba8f9cc600217d77ca31f9d6392a666b7f479417db7eac727c12188cc7b5871cb9ed0c0028440e18eb305900129b551be73db86028f10ba874306c1b320ff8f1cce42450b0201aac48caeee4fb439d5b8d0deab1e4adc006014b57f7e95fae0b3aa5273d71f1e50b92b2689980a190d4ea916b573e595c4b13c1cccd43062ddfece672e8934d44f172ef4a9e794d00509b8f3c08a3a5397feb92268d8942a8476a1db61fb7cbcd39e1e10b709ec6723a7609cbe992e0dbc711bf82c8371e4c15dd2c83eb41cda98fbf445aac57fb9898b619af7a639907c80bbe25920400b13c718788611f73d896d4c42662e308af17cb42d3754cf0b6c4c291b4fc4c642e1a7c4e36bfd2d05858bfc06e9d7d01fa5342b2e69b040b611aa40658daf97dc44f7621520b9d1177e0a29403f823ca567b24ab3fc1797f10f97b89e1ea322bc108c78fa66e4d1ad0330099aad55495eb4a3d80cc8b5f73e5a3a08da1bd20ea0062257de1418ba04ed6d0908af48f274370e150321f4efe7c7cf08c900a3b4d07f9b901c367e971eb0214b2f7ec1c1ecd894a0157ae61aeaeac3d5a1c9b9cb900da84c757f7a7550ca51503623ffc738e4d26778ed5edff45f5b73673970dfadf9bca896e960b21c8e9d1d4c3c4fbaf00122428db2b5662bc598ecd16c50a1bb9dac918328c24d7e8b815e5255badfc4a1b9dc62e45100cf623a64bda876357a5e70f6750ba69dcc64a11ed3818bf39349847f6ced35565bc378e9153d406f145f22fe5eb719ada8f105e764d705c4d72d4dae4e7896d51f5f415106997a7d70ea9598fce4a137a59ca3fab661017f5ed13f401807a41c7354639477eda2c386715de71ff2fee4ea92abc67d87edcf6ca7354dc5e05c36b6737210cfe1e58fe5214df729fcf9d963aabcb01e7a9284b7e4b482ee465bc3ebb6659ae685e3e21f542a43022846d5b4de16aebada6d4af9d1b6c229284b35ceab4cdfcaf79ad5a1e612d56fe28389ba297e0df80dd0786bd55940ce4092c535b5c4ab6c41d2c43b83d407efd390d6668c085d207a8793a154ffe7673eec3b20bb0a89f0b4737ebe531ff78de0e763af602727449e6ccd705eeb2823865b5e4b680f247aa170b656f04965c85ffc5fc9045f293813dc07a2c3739c748ca8b7fa8bbbae9aa3694e59ad44cbde9331535ccf46ed41f01bc331515c23ba52b3bb473f81fe18cee253804d9cae8f25927292c3fad12f4e78970cddd799f49ec366ef93650b01c83e70c9b3a72751b18c683242494caa1f6c84cb5496798781b8655f5eb9fc5b30dc401988d8375126eb298dd44d8503822851376038fa3aa7764a3662709dcb68f1485f5297aec85e851e56e9074887a48c5b565a6b68f53665a876d9fbcff3e9d50f6a104d2e8cce3fd65eee379b5ebeb4c8c4d5c86a25eff1fc1d401e632f35b9d6f51c26daf72a2b887d44ccc4d9d49fd9a369fa8c1474e7ad26b375592a202fc2249df921fa2b0c038a69d6e6dd9dd2bcdf0075d0dfe7c853e22253f28685fe91eef4d345596484085a5725f48a74de474315ab2f9889f00a38601c7f4414d001371d7726140a3faa5fcdde9843d3d174afb676a86ef0bfb3ce05cf26a493e3f198f48e3343dc74f431c50a9347b941afeea6df2012223175999280520b4d56778b823ae5cdf7d4b61d9a814a6b6aee02e317a29cdf6241a925a0d6d74a859128d4a42041139e220a461641cbc6db2d303c9d5c7c107c0f625996c3e5b8fa78cc9cf92202085b69550998fc99871d5fbc39f801ceb31ccb2a3482624e87bfefbbc78cfb32728db4497ca5a0b3e9e84df7e27d416d422004f802acedd61d8fa885cdd29ad076d42ba58848ebeff5fb2c9676e2f32141e27b883368a1b27338b2d35603b207f8a9d903cc78116fddf1ca21ec1b210f348e8cb164f9ed989f5a1991746d67a7b923bea92851c90130a7854f79d2f9dd4786f854b2f224417cb6f09da65a303b60ea98da543d62c78873d3e23b809ca390580fd2bacaa8a25ee2cee21017096a4583aba29f031b2c20469e3a4a519a1c01f906cdadc74c28de43084ad70be7463ca58cda5a5ea872ab6e73d3e1aa5c34eed38c9d15c6fa0617eba8de3c557824977bb35cd39370e885527cc98d534b3af6b1bc0e0d0c65a490242df728888ff824fdbd47b18958ef03638d50b6efdf74ab49460d4396c0c15609fd8f2c55df7c3f78a58dfa0b2666dad076fa7d46e551466966f89a7544a7eacaa4726b34ac7fab1ac62a4bc0cd56e883aed4d8b09be68c8d6248dc70b925b6faeeebcddd2851caef204e3fc0d6d5ab0c3d8d432f992bf0219d6833654850e96546714ca15d1d92e5bccf82402a31dd9102068860774849916513ebe9839bcc2d70d7f5df03a3baceee212d0a28e1921696dd999e2ba93a7eda31742e65db9030ad2f384daa76a7e632294dd77728c840a8c2bb1969c83faa073aecb676acfdf66f7adfcdde448aaa62eb39e47de878ba34c27d660f87e5c8ee4110e4805021db5d2eaca9822882dccc56addcdf90d8ab4bd7f171e2c8907ebba89c62500ec979cebd5802fd934b20ecd285b9bc5a0425bc40ffee523d11554a75de45781aa8c754aa586db9af2436ca8075dcc08001d414f7fc0fe67c492d402a250024766afe5c8e600a82eef14c1d28e61431c31c163fbc667cff3e5dedf4d921bcf54d86fc31e2c33d7d5efadab207dce596e191fe45414c5f53f48982fc20c9014fc8a06e5be488d6d83234a6412a68d5fe9c48f3d9853f025bca00dd9f48a7da3b4dea7e500d9cb8aca8d9446d109b5f07dbd4fed35c3d6f26076e249a8ebdef574f1bcbf968c287e3904f72dd215588b1ea57e919719a963739dcb807bb25bcf9a463cdf7828919e27fecbffc79e778440d567d87ec68353182cdb48b6caf3327346fe3c96c642204671432baff2f866e68692f17ace7f938f30fd2c1a2d02d3403134527c320c91b664579e28f7a4725963bd8868b6cf11c69dba04d053f2484e2ea8e54acff0d19c13a5b6b815dcf2930bd577ca001a3309bf3b588352fe0fbde1169cc4d5e83f3411563d428ee896d8a3198eb5959f35ce98e444e11510b312a7fe078c3dcb2ff6007112155353bd78854a29d7296e8c05a5642c0f13ab717cf4def98c1daf957fb107880925c9fe02fe6baa7f195e078395d7a0ee22e585b294922e2eeb14a9eaaa18ac5bfa8802730dd5a734d408d0ccff0e9bf161297f3d182fef4f33caeea2e12173f9024469a7e16501112d609288e71ea1cc5a879e64c0fb55addc821c47af8961e8f85730e3d54e9f5a44a52c27f938f8092b3cb7b6a064323526ab383d95749618a0b034374bd6a993f546e290027496a6413c36cfe669cad810c177661c312b141df448b388dab24e7db2b98f458b66c284dac6fa589def08257d119109a2ce1794956a61d4e0d06b0665c13b54dd3b48f98cba53dd1a51a17fb4a229b0502063504528d85867a5bcb26a486acd6bf2cbd8fb924aa8c223786c16feb0ccb571f013ae85d136eed7758a00c37b3d35108e767ccdfeba8d0fca8eb91c2042391897c6f1efd310fbc6af3d99913e84be7acad589f8510acc74134fd0fd002f3e2aa80a5baec2edd048362d0b4eb85556da59998df67d72ef45abf1ad47dc2675e7ef90fdb244326f0f014ddaf2b8f14fbb57e9a8b3afd3784c4fe59564901f6cfbb97518f3aa4848b93bce73107d7fa645f571df1610383eaaba13fea94c7991671a84187578a8209c39377012512aee6be127495b7e9887abdf7ace93b8468f3e6ef8384eacbe324b7c25b1abe25cf03b32366b371cd28aa8ba57bf4d4ca2b021210e354bd3c77d886641c17bd4f08ebf6713c5d624bdbb7406f15edfaf06d708f86e3201d4afd8b9f1f2ff6b8fef94b29cd51fac9e40ae7c3994b8ea024419a1ccc9a995e936d58574adc0955a146ca3d55225cc7312054314ec2b19570849ac9684351efa37a8ebf59026e40fc553d903e13caf4cf845d0e8e35b07d283af2dc125dec1569c8d845a42bea68bb7120779441422300ddfb68ac6412693521971b6d01e2dd39ec0acd146fe59b021029e8534cbcf0428d63014614142f6149c9fa0ba33d007f83617806fe5f48b1c4ec8e711bef01c91f53ea2cdf9aa552672cd63fb0aef79c53bee97ada6b19f7046194966ab42cb9de63fd1dbd28f6f309e7831bc81ddb3874c2af81bb3b076e55decb5291b5caeb0d548519cc3cdd86d922ccaa852709851c69896acea3e31d7bd1735fb396a1cc5557d88975a956b817722fdbf15a4cc655cc6f9778751939354c870087a3fc393d4c483ea882aed8c2ac1766ddeede949d924d3f4486276a6fe9f81070686c1115a50504dea9024fb830bbd30ba71762288484910a37196b84768d784b8ecc7e63785b17d8f396b23a84727f9bad59a28ba209a708832551929bdfc3d4dbbb3e2e693b2224a83c52a4198124945378a07d0bdb73520199cae05180563a1eec46d2ba0ca18276a4aa491759966d0fbe47513eedec4d220327542744f620078a126f585fdf6de1dc00f752b4e1717b2e1aca0bc840f6df878cf78bb17563ed8018c67adb98ec290a615a20aac8ca4aaafcf5a6fb6e962dab6de4325d042481286b3fe6dd1db367b799d852d780cad93401c48f4af57cdebe3f3d92b89d7f89c26131da0895a06347dd4a152decef4c899e94cd0030296dcc63267b28bbd5b010abd8caacb7f49930a555061a62293a4e7afe84d64e732c5883a4c6db0c623a4ab976544591028a52d10db865549264ff69735b0558cabf1f40f6c2357fdec5661255bb69e2e7ec964702ec21c78ddd1286c7f90a61d63a243c25d4f1ac807aeaed6f4d90ff465a6382e18694e3adb658a64bd8ef8ba54a4af700190f889bb946942f7ea118266d3cfe509a6c494219e4b089fd2ad5e20ce52819899e8ed8f4dfc21852f81819910ab543d5dff47227e216b3f567d0e56d6b5a4baa17dd42d3dd2aa5a62be0d297278d53b98106d80ffa2f7c98c8dbf579b06ae8ce83e16c6805ade4bbc5d4ab27b357bf1110b6ac369dd934171d51af85519b3667c634b70bb074cb27617a453fc246ec0c8eb9d0d3f3d0998cdf07b9688e240d9aff197ec7b8f316cc2afc8a5752497080ac1aa827c3e69ef129acba2eb2390a19a32d83bda5e81f0141f59531b5b065f0375624a343983bd0160896bab060d5e0c864eefb5b1b93d7b83ec1fb13e0348030d630eefaf6741db3d67a3e327b0deb94db780e4f95af01d4ba03ece63861accf94be1bedec1aef0483601e1636d6c6384f953fef7f1ceb336e87a673db54b81d408b5c4ee93db0f521c680e163d9494e57fa65856b62de6d5c02cea1a09847b00ceb36363974b775956c66a3f87db803fbfd1c6eda9a43c9568938f1c45126903f113282b69c0fcc0d5bbda0e2356e87bca4876fe61decaa26c3eaf4d2d86e9ee8bee30763c324e3d2e2512f3ac1535217f1df16b1f2545219e41157923b67d8ffb75430d9d02502fd305b0f085cef2db820dbe41e5441c6fd3c7e2e3c524b6a41b6aa138f756995f8ecddededa9b0185ffa83a1f1e8b030370568efd5d83e5b9cace4b77fb2a03141851c30d1985810945a74c4430ec24f4a5cca98ee7266398e9477f5a74dd3192dd98a3308dddbc473bf76182b95611286efd538c7ee83819d53a842a16f01b659ca351770fe0cf36b81f3fc20a7a0003d3c5b4028711b7db6100151db21eaf756ba39bd4431beefe570484a358cb621862f9d26532f17009ea192648e6e8c4ea951cdefc3b0520255b3ff820d2badca358c5348c7c35123e2287be9a09178031dd336b83b2eb96b592a5371e0f543fdab182579dd83a85b538c35473f9175a94ece984530ccc6bceaeeaa34e0aa797c90522de63efbb9c9e43c3361b3342ed947f1ba0794473e02e047b9801cde1b7aeb1493adf5b14a82fa096533c8e5acb51db53deedc00e33f9a6471348469ea686f04f13d67bc798cdd39b9472040c4553255341419303bdd29b9c0f4faabccf18e65c13787a69e0e97be0eb00f7e5e2e6be2958cd94757f7d7bc53c101fe2a7afb81501d92abf26f1872d60642a7cfc82e6bc8e937beead6670f7bf064ad8d7988579d85f59e9e87c0743f62e9825eef52cec84812ebdf23a1bc9d26134348115534040ee241ba4804ea04377f5afa69b56f5bccf7508a86b6d5bb15a48ee055845544e55ebda1ded531dea57369750f83983ca1d6069a336692a35ba57313a451094b0f56f13a5f3167aa88e51378010a6117f145371faa2f71b74a5014343c8d1217326233d92f7fc5f3529ccedd2b1f538476206c12ae76b58bd5d0871414b1968cff09ae22dad3abcd93bda3967d5fc450dce768eebd820a877d9e88a459924bf5dbac670430caba84ff69d2bee2ec26c85102c83e2e690bc22306d3811e86b2ba361baa0a0a6d8b7d4e98c24b8251f74995a789a87edc3f1ac86c571752228a72ba9538d7b30ebabd01da9e9853ebea86a79215c8f7ace4ca55b935a36058ec656fa783b79482cad41fbbdec877c4b178ab20fd0ffc6788367583c756843e3d62eee325f4c2ab79dbbb77f4510a3fe807badd831ad8e902c6f4edc3d3e86cc78502caf53bbf2a5ae334286b04c3684b9c903e55cfeb0e794981ad1ed1ba1ecd9319021d9d89cd88d05d3f2aac53d1c25bee53f9ebeed81924a4233c14d973c91b321e807dd93a520dceb4458649340097b4efca5ff8b242846c6baeb41b362d30a33300fef09e69c5240fa9a55e1b9d273c345773f5ac36a9ac80c51290ab129ddf7ff35e5100030603b717a351332dc3d5390b0352a7ae2a71d818e1f5c40ae5bceab1c2f2d33b5579eea076f53053984311e28fbaddac459970065a301d7c59da2c7f4c25ffdc33064f7bcb52503d3fac0d2126c5697691f1b153ef5b1f4df48293ceea87719bc843784da7752099b59cedeb5388813474ea0e104d9544d88448e18b639dd0eeadeed4c943d68965886a6435416835af395c40c647d4eda32cbdc2f9d33fc86aba67699431cfff9c74706f774712fa1d625ce0260653b703d14b2f96bb32705436d15a60268b1ec5efa72c30db0aa854932f6eb7b61ca1a793f238fa056c906f4d78df8d7bda33a85160e359d86be8ae190623412b1ef1a191d323964c191f463d02b1d968a8bc6ce74245584fe6615c89f16975d4e37f6dc652e414647eb10d6fd5d9dc818086f460f7cdf8b0ad27744c15cb1eca58d227867f53d4537114506be2adcafbd6d21e1df1d061c3a2b64162fe71ccf1d8099a504f02d09db01854af8edc4082bbdb86f387040371732d6613e587f640f89be26685f88b0a666f14a282757b1dc77e4f7ead08097f262e8dc5e934234a1af6a5e3a3e419631ff2c493a3a0d987c8350518f0bcc363e4bb5b161b4066744ce308a3a2a35f9bfc92caa965da382d945471647b29a868e39648ee27348b261ba76ed15ce03405b6bba0fb1bbad4858c0811ff84cd2231aabe94e02dec4a904e52abf1988af3deafeae74cc1762ee702ccb289fde76eb6023e009a1392b98b3c43d11d018cf972e2e2a394789e95935232051a65b625a4eb7d388d2a90adcbb2b5144b54d035b43ee8c907fcb1d32d9f490cc5e320c155450632118259be85b05359574c2a3160c13b709153295b14701db67ec1a8e30ff70c93e2f78dcc8a0640a3a7bca8e7e14e5de0921432e935fe47f0f17444e9a5e462eef6b8b47ce70d165ee3bc2fafa80b7cdb33e8a550183cb4eb1cd310fd397ead5739e616f113c3802f26062127b725a425e5b751bf26a7739e5bc52da51a8080f30234ebaf3c6988a13bffa12404d0e9715d966b0836ac5806ba49b22e0292a8be948801fb60200a856c140532457ae63fc50515561078cf0e826f4e30808442a251a2ed4da78b51ef99735a9f71bb9ef1522b3b10d04fe24d430a08bc3d56989dd5cfbc2477ce6fa49a3f462c9d0f6e8e4cb925bf27d106ee0554091b3ae38fd43887503fe5edb60298f8dd6489f0963b548780f82fa324c005196d595bce893191a1df3d26d843563e5775a0b5ee7088f62fc727970f5559cfd9a15f90622e2b112d707cd97d2c88821f8390e4fb32cc5fcd5be4fef49c8ff22a54cfa5f7474bca9ed8622bdb07240849056423e3823cec7f05362752cd21caa971ab02a8dd415441d3cca2565a603c99d0f6d50af56cd0763fb52c72abec78a55dc1e59d4d15bcef57dfb2fe07253edb9c36b6d038f909cbd2ef0c2d9acbb89eef91130ed9e34c8c08e2876ea74f5829d8e2cb8f3bac3688d7c865203fd5299bbd0be6cc738dcee68fbd795ef823eefb95b50e1e667b96e2b7828780955f2d3db2fcdc6cefe326c87dddd1803b0b2c6f66e1defaafb566fb95890edfd0b2b40e0f13f020a1330a0b70a80dcc5c46b5dd75a0b5ee7088f62fc727970f5559cfd9a15f90622e2b112d707cd97d2c88821fa21b34e3c7c2dc8900ef8bca379226c7e089b81574d688324e3c76357564e2a199fee3e5e5b30aa8f121256255ff1fb71cee77fd5bedb0b38c674e927c7a01ea594f49e78ffbf3fe6ceba1ffb920502a58306c1fffadd4cd1a37a9a0569e0b1c76a38faa29451ed102b2044020483a224bc0f87b3fa603329ca9ef916c4bd37ea38d4a72ca9e1ee7bf47de04034491443c63af7f62f78990d9e8a1cffc93661ebeea50de0b062cbe10208152f0b1cbef009f087b8d899c9272212a46011b888fec52bcd9854126944ce9f4abb4493ca2dd320614852c585ff4661009327dcc735c5e808d4081a9680f8c71fea74b42eef8f2d1df50c3f2ac649d18db87660bae9da71e6072e4a4c4b5e959a0df16de4f51cbc2e3204c5349b6f8e9194504fa24c3a8705dc8326871eb365f595dabd9cc098fbd51f5d592fcaf959e53557153e965329b00095c52518a23fca3e02952a0ce9045b0e52116a36fb582d5dad2395b52ca4ba9c60a8069c9f0cf35d871bf528c6ace3b1f825111f5e0ab405d4101ef9c38cd157ad3c39608720c92bd560efdfa8690dad7aeaacf3e14db5b5c13fd4f1224d0a4117b8e942e08028a543da6fa165ebc007620dddcd723347c37714f1835ba70600b0287090950a65b844adeae5804f76af84f141dedc3bc466e31d91fa6eeca130954be7d26a9e84d6f501b22588462e9b55f7ac425ae18d3209ec3ada64ddc88ecad1564403841ffa56931d6d8124c43f69f92efb79a838e3e4438bc22812743bc0f17c14b0956c07e7bc76186dec9cc83f9457352b5bbc5a709983684ed2ed7d893c370aa255c29556d8980c0fe46abe1e070e53f24682759e78df27eb325be2329c96af768fc5b7ce16bb267e57ed5c076e4b84007b9b23251df4b161de92a434d3feec70442052eaa6165bd15854afef09e0ce4c73f7a97356c84dc162ea97a5332b892bde7c79ec47c019971cad09925ede1b29a3fce9c701bc6d38dbba4022ce78ef6992f469bbff5fd2e16b4fa9aecef1f59c845a6fa97445a9429cb5f3334894ba2e2b642d2dbbd67bc62b0b68dbba8322179d5de6bc24d336fc40d5e2c96165e11fe781e501e06cf5439cba99378302cb298a50d1eb3deee42baec006d5917405f7539f89a30dfe742a925f40ef6f25ab75ccc48c904be6c1c3e2b4724cd3c33dfdc881f0e4b0fe34cc188364718b4e4588b32471a84e861b6cace0caf1b72f04cc1d7730b28842e5566f90fe12fa029eb77916ce48afddf1b12d0e01d019c605b8891bd68dce1c73e8978dc769e11a973758a7d1358ca15ab25c2c0d78e86e0840873df5990c23df371c0943cdc33fece8ac93a0f55cf60b1927a352da966f4ea60384c046478cfb3d1212984fe9e80d2c1faf13b5720afa2c61230042fcdd1bc7ab113458fdeed0e365c8c1faaa78d7436091a12ac298bf39b98db13db22562ddeef733e45809427cbd871599a113935a5d78dcaff5a40be53ebfc8ef47df2e079a0c7b28ce0294e46a731fbf3e53cd863e7058e8a661c07ec0faf477b2185289071e543839214423bc49608fe84a83a8c88f49824b6676de32a4c292f906e3c8547191bc6a926972f77ff4cb8553d1e2295b0a518f0d2643e5761b6c20a422a1314d190188d7e62a6e4675d20a2e80384defee29c6cecabcd26845bfdb60aa0a1ce01344035fd52ff5bc11d4547ce568b0d9d56de9997355896a5cfc726261bd59d4dd4c9c5c643033b32b8d4d0eb10e9bfdf7fd0bb7f8a5b22b2d50d1d5c6669000948224249e49904f90cada2597cf61c638f5fd6494743c9d77619e9187b138611929d3366be15e21488541c37d0e11d5b00abe19a67c05afd733024f6f825d44f5cd1436fdc5ee0150fc9756f631a57caf80af853224c360a83b147db97007ce8aaa1199f6c9943813cc9d57af4982d3a7dfd269a74f28dd1da2e18a9b7290626133aade491601a5bde5173c6af6f21cdb5895d0be68d4a748fdf94cb4d83f77b59c525c353d1c34a17e19a755adba43c0392aa634094889d313012877bc37ef08511b69b1f0a099ec145f7857b1413afb715e8a9ddbf65e9ed34c0bc3e121660b9ec3789c56a9f88b33ab922c7d7d38729fa429cb35a131288819777f4507e742d8ac9fcd76502275c39fbf9d8ca1adae35741cd00580b4274330b0429042fddb3b3b372e19e7a7974da5e0d0bc0fda39376d54d1a8dc9f5a4cecc24d6d8b00337a8ce78848a342251dfd99dee994fd06fd8f39423e10a2f4ffe963e10189f66221bb5dbead69b764b8b3616fbfa96b7b5123a5ed276aba2a8eb31a08650b4b5389b73afc7c034b8b972f72f3661fe8c2384398efbe4c2d2fed2753f406deccec210a3d0b52ec07289d49bb64e3a7c2aa4e44f9ea972121d14ddda6ed39bc58da6f52b4726da4d7c2599366448dfc9d524fb5f7e7068ab95e2f155465e29477e39a93cb436d3ce313f3ae63d4928c98da13e8c028fb01607f567c836f24ae97b8e5a461860f3278fe8d099e8b7fc8354dac2239f5983e803ce277c3c723f1dc22e63ba04dfd50e64325512bf310aa7d651a84ec251a05501c646d9fa7e9b009d2a79845dd380c147b45be9888b77ea73f17e4ff8aee167035f5c18a7cd63ad4720d3a6fb688e475f18b70117ee777eb705b212953a9df699476465bf57d86f04c8dfeb53b31dcc91b0d13d5ab9f2325b5c92e1fcbc85ed80769e160a610b2e3a46d3e87d0a6b13ec328b4ac8b1e8187ffa11097d9f845d21e4d67011b735b4218c7b0c5437354a10d6474e0adb76b22952baa121a42fbfc789c62662921557f5743edd93df2f606080d0e555765e584cadc267b4d116b47b23b88cb655c6d838d50cfba666d2076d934193008a180d12940efb23fca6255e2c8752556b871d727109a66daec0436a9c6f8f421e4a28bfd08a4c4e464f68a93d7abc2e606f679ffb7c69c81f6e52aa14b8ff1bb46248e5d8b63e6ca0b1509a4a657d93a69f58af2f2cd3c98e855eb64732bde879eb230f90abedc296345c81b9337d3c48fd276d1bf3547bb999bdaf6d3079b6fc422b5fab7e2fbca0a148db9535274bb7f8f7a5ea64b221f8be353b17cfd2d4a8c32202d1476f3db2f4b2225912faa7730bb2fe9dd7370bedba6bc01bc91fc542604ba0848392da3c3b7ee1ccab47d56591d6d5ed7c75de489a08da09f321a002b0ff9aafa5578fe043834970a86bd72fdedfca57aabee75c3d126e3ac80a3eed3f65776b2f26fe775274d474168df7e5cd52fd64dfaf4a6f36090d1f15011932a7fcf4a044145035c9877e9abf391cc8425742933a385b102e870ce6a251f27f0781a677ed7d4894c886e8e64cc14d3610f78a3d26dc512418448f7542ba8ad2f433bbe0a307315c7aba9e80c7a531c59e0fe233f71211a6bfa92aafa05927bb506875d13ce2eeafe49e3cadc488e23e8d23e859750667c4bb4688f94aeec62ce6fd954d5665769631406becd5f7e4cc18ec49a2c29227111bb71d3df346b28fd16ca3463f2494203241e2893a6aae74cd648368c6d9b0c8fe2e0d0537b361479c8065d8a3f4ec09be1007841068ba3d909c434a6a885619bf3a69e92b80222693edbd01c5a3076384ff24fad106753a98fd04ef0d47779c412eafeed17847757dd6c25505c0a78748e3c7f23e22137117fc35df45a921504b2e15c071fa5da5f79f2f59440ae1d339a1dfa20cdbf46947cba1e6dfaf917c6d20db586ff1af39f301d01d7e8b1570f941bb7e691628949f36e6656d5dbdc12d57457ac0630c72417d909814990ef9002e2d3498831c0eb3b33e3f4218a1872fb0c20216540008252fa35d566fc7e21798e283370f603d71b05704cf37fc85cf5d978f1e7c37ce7955ef65f321aa2e948ab9ac231e03f56a1943c7d86811d1701258c236c0f74a48221790246272205c47371332f2c9ec87d6289e2e5615f81bb346be34ddf36f8522f59c0ed2eac2701e16c839075387079cc6f9cb4393e641f0f618849f6aaba41c50e0aae8485ebadffddd380918c76b4a205a323e1532fa9514c32d0e5fed6ec791d3c9d8921d1e0bb8294eeec10685753e32d0805bd254b25220cdf79048553602d541b64752d777a53d3f80672e07c7072cbd99fe1316b8eecdba6692549e898f7c9b489dbb014d6da751468cc74415d2f2a31fa028603a5d957564b755098677751ff61b0cd722e00e992506d9b04e3ec6cbee7e0135107426c53d0a3d09087dbaf4e0c74994371871abb88b07933d9efe8320f0029ee4c5d422adbee071e0b1eb0d17b87462930bac145f8e5767fe78cd0327428e2f37f7df1757dacc1f614a7aadf86f19aa8b42d7d1a457ffb1b86b2e5e67cc164198030936145a97cd91470a373d9e4f59679748c9b8c9c726eac07c873b7c026373b9cf341104041bf12738897dd4565ece704d57393c32c3b6c05c01d039d3bb484f29fec67c242d3d8a282a33450bf49e9e7eb669ddcc140045fbf5a2f5dc1d4a1c495a6d1fe0871e920f0547a910e42abb54131c63a62aa08a2a19f457e8b576708132f2255de8e6183d99903588ef02cf1bf6803ed4142034b19399ce1db92d4bec0830cd4d8297a0a2f4a6a88b423f042d4a507db34a3f00e111714ed9071dc5866da784f9972a26239cfd31426d362840d6af5843d4e4b0b90cfb8857a411336b7aa3385c95e755ea091347b05a48f792c45baf88fb3144a9a8ee8349b6ac1996823ccdfd64759f37812426e7b208cac4cc0a18451c0f94424ddbfb0ccb5a4fed1ae497eb2c363979bf9d14e08fd758ef29cc84b3c3e00c3c35186d72daadce02e25ca0567f446c578dcd5b41264c14ada7708385df95932b0cbfebd2a7408c16f72f089dbe81f0a39ad9f6df7f114f75a8f544de5b332d5ec5227d976890ae1de48b29821db4f726c73467b6104f8c4539574cc397b1215f51ba7d608df9440e75a4f1e5643f7533c1bcd92ffdbc22c656f14b3f5bb50f35791a38875de50a41e5d8ef3503887112d225a2b240d59a6d5e2a75b16a912c3d5a24dc2e91b018baf6b25ddd82a57eeeb89a87a68716fa1cd78aac8278462d54c8e56b3146ee0fb34bde173bced01563886e4dc6ebc627763086f3b0c1c93f4f0ded40377f799fbc550f2a7f0c7da66e0d192b1cce68bf8870155cba2e0a277a5ed883ebc9bddda851cf89d210d0bc75031b77987117691c2a73bce16f7a71ef45bfd659ae31b663a98e257bb739fb7148d2605b6fbc57eebdca56a08813efe93d5c2e64a4060dbd489a1f13a3c7ff7029cbb8adac35ec1c517950ef7ca115f75c95f6c6ff057b2f75f89d82081b457a6566ff619b0dd7b769dcf96fa7eb8de011ff67e328ec6e4b58f3714c3128e3f6b17c96ba0232315bd6818d81d300933457ec2faf99c8b5129e85e4b91e8ae921e5296f8e78d1859792b54515b931b35395fbded99a6e25e15abec59f97c0dabd9e72982f9763e83e3560f005642d9c796ca2f597568b7f22f6cb2fb501cc62f3948d3eaf6b01cd1889f6b213b0b8fe020237c9a8a5bcdca9c6c8e5aa54dc3a7c406c7febcabdbe56868c06c49511478261277ebd403c560c7a68540ff186019b0e78891b36fa4eb96ee9b33dc823f8bc10d708f58d4eecff24cae782fb0eca160c9740b6fdaf628832679962ea24da32d099dad771314ebc01d7fd046b988cd0e5506cc1a3ecfc610e13719042948703517a308a0021f77696de6c0852d837d518cd55566720359fa2aa8ff1304e4cdd5dab6cd54f46a338328974639143acd1b4780af2bbda55ce9d7cfd0895bcbc84b8e18481444c3ce2d1e58255e59ac96d7c72096b44d72c601cccd277bed1f2118d84e540dd12d354dddfce24146ff1c20b5212abfe59b4e190587db587004e35fc7b36427cfa6cc09757fae9032046cb729bbf750c5192802d31f99c9c38cbf2dcd0446dc53e0425037f7e06c6a7b7a930784288d8a002b2be4e0220ff24e862e38cc9aed1d6c7d0b38859d0da68947e71626e5c5ecc23f9beb7281f259f71c91d9a897c8268eea6124b77e69c1ec69665de5af024db1b8c6f5dba6ff7aa7a52c7e9183a7f4e88c02f94a4bfb7ed64e243cb95d6f03f0ad87198d4583dd28c17626432e6e20e8ca67d1afd9a3af394f1ee1368029bcdaebc901b8e0b7d4ce2582952ee9566b98dda18343b7a8f7396b75c09238b43eb32079da03d65b2f3951d7b2c38818aa09d51f7e6258d79d6baf1f193e4564c40f1779d9d1eb4be917a88745d564d2bf32a978ca75512523544f82766ba34e74b04c049244dc1cecd764dd3697b580d363421d64c6823f5cd38399511dccfa390896882f22afab5f4c9007e25f66be0ac4905cf74aba10f8aa9c23ec35afeed4f4bc60b819d6f5a8eb4ed9694be10fbd95d6dcb5ac2d2f17242c128d1e166678d6cfae7c2da6f6cd46b12351f858933775f46b04d3466e8cfb425cc25ee37c2142c815ad76f56d127d02edeaec6f0e33a3f265e868458eb7c52ae3dcdac2c7dd30e980e17d76e170e4d3c1ab437f57e07d98a47ab9cd5e6b822c41fe0bf3210dcfce19b27a15ea540235ea2ca32f506ca2524c760994841a60929909e5a6df005e9d38f54539d7f9acdb609f6c00d0c4848cfde454581af86496b4c0da560a1ec742234c2d8f689bb9b4324297fa3b9d151c8f78072887e0e30aed957c71c7047f78f6189569392a9e27c547f94966d0e93f53079b41465aa5f524bb3b0308a6c55de2ea233e9b9340b3266eff3d13a3eb9bba4145e080e348fef1f425fc84995296ea76b5dfc651d86ba10fe629e0a03aa721675de00a24da3367baae8226aa0d51228c7354e1f9bf50ba76b63c29dad4d6a36f283df993e205db0877cf4ae85e2632fb5a620d8157d1226470db442c175d427cebdf3c09b2740465753ccb0b900be8b7afa84f7f0c21ccd9bcd2be29fab26eafd250019f4f04413c118116cf375a524346f81c2e18ea391a8bb9c2fa7875634f0d6664a7de334bf51354eaee3800faab276a7a377612d100c5126e4fc7da764f33fff409fb8acc2deb111451d2261d68b62d03722b02b8523556b7aa03be558cc5cdd7dc9c54357ad4db4e95c41b1a1b1dd4fd8a69bf7612ef0da231b80720a60792eb876be549940b268c180717021616f1bfff470d3e33ab232f3087e18010ff8a8b038ca3bdcdef7445eae65ebe3d48a5914ffeaa30dec62425f8817e34f35846bf4184ec54c8c1e318a9ee716485008ff78140692edd7c8d26cf4659345615708e172b8aed1640d2ff22353f17ca871893df0a72a13871dbcad6a1a71abe332690866db5c73034e4e7c6e05067c4e1dee3f436883de93c425ed87cf655d37f5a6c2e0b32b7099ca3aa92506d3290cb7523a5d3f85396518fe418be4898908f3a8741cf5f9071bf81b44f45d7d94eca90e0e8a21803290170b29f49dc98ff14a1b658b061ea47c7d0bf2504f3cce7aa4f31c9f15c1e31eb0adcf5184fbe89d6338b607fbbcce67e6c0e9fcde47abdd9ef36e364385be359c1c3662955a86d7fb6bd132b45351241c9ff03887062954d33ba76e42288974f07f546c8cf6cce29b5e4a4fa2caa14eeb4a021a7ee778cab3372ea521b76bb982911a987bfab6833c900fb67e02797408529bcf94624076a868638c45e738611c4b9ed04cc95b7e985c50c48088bf226527805d00fd17abc1ca9d5e4210d698db4dfda858a24599aff29646e3f6582fffcdff85a69ea6bba061d3c29e78d540718f9e633d1c0b64506d3eb1151854e0eee8aa209a41584a72b14ed17e1fbffbeb22fc5a481de25d10e31a8682fc10d42bdcb4b28e995ab09412b711f9426458a9eee5462c00b1805f0ee85139f3ce60cf9f57e01e1a14714ee28e3a1df96a3fe0eacb1a07b006d82c66747a751374970622f87f1a3ce7f68d1edaef710032769c41f1c6c02d15a5df252fe5debe39064fdbbecc9f3c029b2a7cbd5239752ebcef33230b8d6c2cf2861cf6a2cdf9b00a98ff3af7f8342a2262d2b1d77e5fa604dcf9ebbc9350d6aa7adfabceffb0ba99e5a5249be3473d8020558cb5e9a403ea11902758f96405692f7add1fd3c951ab6e55f4b465933f0b305f553c39f8f990109289ba4220b086b6d265910dde63189ad5f6a3052d5ccd037cb580556fcb13021bc3c5507a209521d2469e3ac48acdfd731f341b1df39d7682225e44a9cb2091cec6cecc8cbe4b6bd418f4cab4e4f1777d32d84b5cbfff1e9b2bae3222463b1b5608388d4d18eae92907ee00605e2928d0dbe00aa8d560494438b1b300ce313f6a42fc3b2ad97a4d36d314d62a47ce49ac8c8d4040a806b9679be80da9d1412a33d7861a40d8640da700d2b75e5697bfdc0ba25de78f4019461d5cfa8de2efae751a543f2bf5fcfb9662f2ab050cdf8287ed80ecd071babbe34a7ddde26f5e0547016b06a215019d4a9650ed1e58ffd77177818a3ed657e7edb32d81011b74c98c9bda34643b0cca8c9b0ac0a5531b4fdec8292c59abb5f9900d596be0ec3a73571b93d27ed073d8ea14e2578404d5beca8db2ca8543e5d3fd958d8b756f020b4942fdcb7aac0f552ac3146727ab401e5e63eed5e424d51dc31442c8a863eb339e5950f8ee2ff9a45a1e7ac9828e9dd94869affdafd1e5cd62efe3e58f4a59050293fc3ebc383747416059d4e479cdf76bd7cc2d4a0bb4ccbcba405feced12299ed90441f43bb238439e6b8a0b88925e3682aa088dd3329194de16f35b820ffb7f76b68087ab8f6b5862d517c7a80a768eeb9c9797c14276a05b239932bb427d86f0328cb51fc484faf3e3203e0c06d3ed395f24bc0e91b3b6ddd14fb8c30c6d8ce75ba750f4732ed97e5521e0b2139c69d0e5d8d2b9a9cea3f1304d2bcba711db531f119c59e3e381ddfdaa95e7355f9f1f8ac648e606c75aff6d572622a148675d76abef671c8a83595ab29ca6e7b04204f02b5fb987cc0d50aef70e72e46fdd18bd96b7388487c712db2d119566158157ee2e9faf8c58f8ca75aa3a8cfd115e7c21c31f5235b34600d3c6898d270382b48abfe02aef58df4cad6867852236e87413f9a18b87f76e1ab2e4f5e7da07b280b8df96385678c0541f39425faf90ea2aa67f10892eace36917b081f02a58ff1c6f976421667e0c878c10be9a40142b25e3f81ee99354403a687190bf602d6b0d9d2f60434fcb6670ce7d682f32f97678f8204120de0c4ce44bb108b0b180930560b6f874a6143e3d1deb2dc46fac7cc9a4a911c227c50c83672e556c7a06de80de4dd8ab5ed11b7e2743508339e106d796753d65e1c7d27dafdb391b2559fc6cea1b38dea8279b1ae01d513ed62dbaada3bcf2369d64d68b172bdfd575bf15c0b535ddc71a9de2aeb61372d856649e911b979b1702094614f7fb4a2ffa3af9718cffa3b733b19765bb4ac8ce1f4ca7e0eb0e9e68607beae4a1175a745637bfc30b4ec8ea1b0d07412f39ba710d5ce29d6e72885c57f740e48b2e529c84ffaefbcc3c6605ce5712837c8eef2dbc2403f1c85b8d4f39d7fb1ec7c8a4b6b6a0888a0e5128ac4c566d049b1b3494fc9d8912af7386a490983089ad6779172e7f4f7f86ff1963c692ccaac3b7ebbf776d4db4ec53b3e4b655aecfc6af58136e571417f02f6ddfe5b15fabfc39fffd8de32c05ea1bd6b009d287f6d3611775c0b55c14b144636dff510bf65f1d3a5011ca48644cbda794ebdc69a489f302910e09222e6c31ac72a352b852b023bf20468369cd473c934e5543ca9927827878e443faa11f222d387fa6b31e0c28936e1d78fec30e26cae0f8eaaff71514a72a56cce9b270cb90ece42ab62a8582c889c7aa4b07876e2d48962909bfb929b2592310b4032337d97a95499a1ec53bd42eca7c4ed81adfa1f2d7a010b671a9b79c632c002dd81239d39d28f38665fbf1d451261c5a08a4e88e818d33a09326731b83f7dfdffb84a4fb4aee653b571bc2b11b73015492ffc4c1a6b36518b636b2d60f405abbe789f0ec9f19fc0c1a6071840faa7fd25087e2f0f2efd76ff9ac06fbe66864c263e8b31f9fd7c7d66dede50a69a215d6d1766d1255673dd120ddf3b04e168437244e36a349294c40b9f6916b34e6b0138ba6de9a2c42db4e7ceacf32f826429f7e1b835e95694f1a6806e5142b1fa0fc63936db31dd76a1586ed0d6e402ec3133a9daf7bb86077b10075118e623267ed75885bae65c178431eb226a80bfa0f2ef53fded128436c06c4f202981779bf743e045192948fa9352a5bdca5298abba7318f66a14ac72cbd260b84e8e2dcf1eb32b121e673cba7f53373652a6bac2e55677610ba4b36a3c511f7118d7e20f51126068d2f3b8a8a686bb9533f21e32c82907ac82c76b6076312fefc78afa09d348a8e51599357b862886c70bda69032e19d9e59ce01f331d83e4357aadc21d6e9d95067746e99d498946066e8b0e27a7848e0f93e647e58974433ffdd77781a6eda600e2ae411fe1a7815a4f9518af9afe96fbaf87cb77dea6e8aaec87ace05edd90735da1111cb45091f87217055c762a60c40729b6a7070cd3927e0fb4a49fceaaff48468eb423c43bddfa2798a25d16564167b257a39efa5e55de7fbf2365729880810695b3b8b519ca4f462fdbdc51c2b654fe6920da0a4b84d83eee39ce6d62a35088adfd5b029abfeaffe06bd9e713d77eda8e46e06269fd527617e22c786cc93339fd6fcdf872b84d6191b7430f332487d22bc4375b01fc4c5cd150589fe166e56169c0d505e1b1435130385d05b12b7f6e440530f464377d24f9fa4393fde01b3e658226ae7e69da0fcc0c9138afe5451989da1617969d43037639e95a73aef86f01a4d232b7ffab374f8fa4193f18ac045e130e018450a32de8dc77a9b5a58c7f3bea0e2737ba2a3001a2106be638cce41d4575414300138b58b254d6000d0eed9451b1effe04f154544135d958284cd9f17f9593b42ecf699081a1f8ce29ed0c2c9f34ed6c5d5bb9b6f92d17bf9a1be22bfcbbba7b27a87aa2793895aec6c8dcd9f600cb5268ae84f155a56cd19a09b63d30b9c97c5fc125dd7ffbeae5e50c5f9378846bf6db22c4e365aeed88616ceae393942c606a4e8507080994a7791ecbb65597e87ec7472979007e286ef4e3cb91771fe0cbbce8aa573b5bd4a0c643e5c0d7963dc47acd4fcc9c3214956552117b639cae677017edb27c94840d075253a19f338ee594af4b2fe196692279d06e0715527878d32484b9bcf66d76f3ee4fcf55750af36e0888f1e124047d1747cd5e33b8911efc5ffdf065d32b0507dc7248a5af58a53fc0ba576527cfeabf6c4ba5059d558013a4a8bf033fe090150caece07de85b5f4df99c3dcdfea710d5f71ff022f5d9d1a8d5bf5570f73d237411acf716ec89176ab32eff66e3e9bf7c415385b4156dc28a17bcd87149e6decd6b9dc30ce26203b1be1cd75eab8b89a1b0ab52c42c1c4217f0da414e52620f3787c117ce5baf85d7a96c2429f100aa5fea4d4b2cda8684c09e8a8bb667a75b9c31ec5bf2a2822f3a4a8603877d62e00dc21e92b58d19e6bfdce0fe1750de9d73baa8b0c120f2a493bad3898a64b3b0b9771a82f9d63d6f752bea8972a547fc8f5fc29a98941520592218e6dd13153ac6309d68a66619577766cccb52b8ac7c4422eddcbf105dcbfb1c4d254c6ebde1efb5d90bb8b53240f5b7598e6ab8a21198288eba7f09e3446ad43252714020b85f3724ce19f99ac06f0808383ada380c9dcab32522c078a80591d584350562c57b07c54c5bcdec1b757cced9ac6c605b0f0534a8bf0002fbe8a69619a5a0a227b19f970edb1bee110522b3213ab713b5d692ec0977c4a3a68330fe0de406ab7cf17fec6bd892ae9c2906083d957b3a897b0e2c113f48f2f569069bd0372f3893dd1bd04816c8c4215e11d8ef757288c95e0525c27d48b258c3dec44687f9d843d543a690def6e624c5cb287859c9268949cec7eb1fb33bce4bc8b502d2f4bd24fac02c190bb67bbd2323cde322d4f0e2daf3703dc262d4f17d28fcf767bf7437fd2de5972658ceb08279e5c637fa4659527adfbf86c443314cceaeb67e905983a2aac5fe8b6a6d602d36b91303ca23a01e9346ce634f8efe80b4b72ed4272d9ae1585a931ebdbc40ed0bece6877313940d3d55b635a38ceb4ecb4e86cb99e2c1069d667d11ec9eeb159f69cb4e6690e6682bc8f009ee72bd8abe72a4902e3ede3c7b0f5e738d188f44d73175a34f6b48f1d315a7ca799262ee49ecd46d09357741e6dd1322e48dc127e707b6bc8b245d92e5a2d4253882098850d2f29710bd5d5fdcdd841cec4f59e61b722620fc8a0d26f423961cc2f853943bafcdde6d2a11e2788fe2d60ba16cf87d38c6b8e329073f10e72ce111498aa36112452c544c936058173223bcfd92a49175e96a83a081e1ee229d31468d6c757db866594d327e0ecd43e645ff8703b3ff94971c56d24c391ac61a79af9d59eaf012ae9e71bacda7477fa8f4bc10d2b6f105d207388bee61cc391f0d1f4e904d51c609ae056ea336f85c19540784a962095264bde445ef8620b275f7d2337656c526afcf042d5e5e035845e4cb50b116ddb8e65ad789991749169061ba4e9e91b7e8e8235d35ad537c25e9d993df1b5077a5e077d0decb15b0c2fe9255146cf2d27332bd6a0360f7527e7cecc556604425a3cd543b7a38d5cb708052f2bcabf4632ab2ddec7f1b8943e8837b02cd4e8134ca73f0191914a6e3d6b5b599f0ff839b0280e6ae78f14b7902dd50c17a01e4ebb16be7f98940f3ca30684d2a752247b94225327ca6ce831694f4cbfc2b7890a70962316553e880868ad691a0a7c7957be3254c4d35592a467230b01531fe47b5e093b09b31a4b84364d6108a6833a678b5f41df12531eb4b607a038270505caea6e6d29da087782c783cae840fe0df9a6c793cca6b0c94914c62184218345cf69b8177e90e083008292273704c963ddb1f40b47be93decd900d880848cfdd58212362d82104154b3fa409275822040c4b42e857ccf435747a82585af93d1566b6875e02bce576c84c80ed440f6f0101a0df7d6b2e491bfcae021a522aa52af579b68f611555b1057d76dcf56418cd80baad13654b95053a236cdb5d594b54c370aeb9658641cd695d85d6c5edca95cb5bc1f02b6c6b70c5ac094f2846125b23aa9e921cf41df66122c1553001934489c524c21147e1ee263eaba541795372695be42c7b33607214c9c667d2fa301b84d238576c3ebab1964358d8efc2d8478f915035f58255736baa8d522126b7035726969214cd8bd514539fa4c1d2de5cc7dcfd2c6b6b2e44500112460862a5359b788bb6a459794a5d0522cbde55a269ed419702b88d4c1a9a8a595fe129555cb0560917dd4281e64b8532efcf7b03c6ef9786414d2eb05896dabc774aad0b66610efebd9a0f4cecf4de5828f99ae369405171253767858b08b7bb76b276cd15b1d2879d3ecb3a458b1b0a63afcf96b02aa830be869d92ea1f59a1479e863cabcc7b5666e8a83e9151e81ca52e2d6ac778d335ac692cb85f97da5c96fc19d8978fe11441c0e067b16139bdd8c5e50470c7dce772464f35b1192f4ca18c52264378796b65651c2d8aeaa34abb4c1e4890de819f7a1e266016751d3404d9c2f0861d57ade72ccb97f9af0508c1c09d643eba1f08572814afc5a2003cddd589aa11d1f56636aa48f0937ddb2f9626b8847734e8b4e9e990a1a751332bbb416bfb96bcc60bc6113928b0952166a0954c9b6e1ee6fab0806e3077cc4d836d9be08dd62cf497ff131bb126b377e40d32f64e0318a3a1acbdd180d997d9d6809689e3b76010fe8c96a53062ae9d999ebde4616406f97f4e45dab3624a1c9a667c986635944e1f3a6be81b246ce056664d692fd4bea237afcbf464fed33c2bf935624f19656fde531d5b139f7c6fb4ee467995a79e1ac2e9caee74124c07573029167d86b55f115aa7f462fa318deea089ebca47e999a3906ab861ed71dab177b751e31197ad5bbd5ee6e76464c19480386ee1a40472c2761ac70231a23c2b03e4d721a2fe097f92e77d0ee827f32511d109c66db9cee9cea79ba3ac2aabd9824d19084f38bf01a014942763b16510184cb2ca250519060565543766e4ecb30d2b9bb422f7bced7cbb5682e245eefb45f1353db6cd4ccdc2031231279b7b72e4248b36294e78251a931639f8ace4f6ce48a640b3a469b315bfa85f29ef7d45f0ea7b31679f90f68f6b98a3058c48cd2aeaa9b70d875bcfa84bd8f0c324b6a9846baefa1981ca412d77f5c6ba9234e16b4cdf3180c42eabac4f59fce156684ebe0cfa6c64d744144a25d805e2a4f6c2ac051d47849c3e534edc29aa5e89c6210b096939244fbcb2be6c43b9f7c8619b8f511a1fec6d631eab2b8f0e20dd2a8141900c0d1f89bb2ee95ffb1f132c4a70dde2cbf8f510e3bbc0f18a31dcbc589464b52f0e1381ac0c51dd2f42bfa78027d73c0d9ffa539341e4161b49cdd96905bd26798a0d1fc905c6fac16f2447b1ee48f4e8bb88efb381d8746a4650b952717ff44175132ad8da36feb96bab854ebaf54ab7e5276a753afcdd5dba42dbf423930d197940766b0eee355b5e987517415cb7095ce0c862b4cbe24712c20d67edd47c43a65eb9daed37b3e05677ca15915d7c80f544e500bb46e8d500a6c8bbf6228be0272f6e008be19d8fb4e2d0fe3ce682db538cc3bcb739203bea77323ba647b275f91411904311b4ec891115f89128b5ec7b32b03f43a908365ad573c0e6f8e9f00b80e68882cf57bb40ceaf23018d0bb1e97d9f14a8a49d7c896bbf65b7738da105da63a30597e66b8cda9afc33790f1ba015c3f7610be4e77a5b5e241098abc02a1bf6a75be0e175ca27667da8ecddd6b2d55bdd7e88eb31a4435170d8263e6f74b0d920b305d305ca62a6c4d17267e18e0fee77cdb74548402d9a6be7542e337915d77356db47a2c50ff356bbbf9c57738037a12a50d4852a47361349e39267e7c5b8b9580d0d70d9556897e007213e8db8e3976ac80d9e872955d32831517e1cddb6f76e17155ce17ae6ca95c37c461176ef4898052bf8873924db5a98ad45293ef20485d822aec64295fb1aeca322e20ef6d125fdbed744c537c5863170e2407740792dfa980d6e393a82f47e6b9a5e243f67092877230dd4e3be3f955fb96518f9671dfa9efea07054e13a35e31380d0e48da25aa54ab0bd5aceb9cc544a6ecd9427fd421555c2f43654f8640f214d673818d9f68e8774839a9666b7ba5f43c927be6f287ceb8286a09af896dd84e60daa94d712d9fce6809d2770580caf577302570300b2ecd0275ffb4a960ab0943c84b2dbf3103c614bf4dfd0f10fb57aeb268d8cc4533610135bc489054e5877658d7e4392f594abb9f45ee28babebce22655adf1b3a92ca04ce06991b6fbb5085e71e707a4ff9003d71fe60c43edb632e8658d8ca55bc67bfe9ad5fcf3757ba969cb06e6f3eae6ec260e8554c96e535eb11c6d9209ecba9bbf24aee43efc4a40fdc59fd99f78fa2f20b867006f61d11b0d96bdc33a03b2ec37f0b7dc4c5480c418fa45882f65fb7098a2dd230c959538cdfce6ae0314dfe322e4dd6abb195b263ad8d1ea9db3986d3358661178ae7c59c18f571fce0f116405ac6951b3106cf1bf23098289d38e153d9a497fe7f6ae9814d26c2b48274b9df4685aed04bf8e67729a8305ef3c9c583cf72edc20e5685f7404364a37296e3937a78cb2dfac414eaed1cd4e02a4b3f9245e7ccd007de2f7a11e8cd3ec1141f66432364d8cff2208ca05f7e426645e6d23c0c7e701f34c028147425b210df2e79dbd3ddbb768f9a5c2470eaede708a82fb0d7b2bcd5fb26506268f5b85f779b159a42a91cdbbf5c953083eb1a957e33004b82a2eb47417df284ef034bb72ca483571b1bb8511c1238da851c3973a8b04c504c268026aba0c7089e8446974da0b10910e8eedeb7a172a20ac8217bc99f92451ef49daad9fe077282386595eb3ed0ccae601c45bd518052e262af1c99dc40bfe7de98054bdbd375c1c3f096857d1a562b860c0b8200b453a8c37e14d99c666e3674d874b355be864442b098f82bfe86b3562a5190c9771c4b761ae829a59a62769fc374b37e483f2cd758beee59896a03797d04f159fd7da40a6c2acb431cf8e2bd2941d1e205fb11753da5bc77902794c14484a6c78e07b35fdf83adef1ea627929bbe029aed7e21c712e7119933cfb7f9e3c5156aa0d53b48cb399e9381145fe24a3cada9aed88d9a0f270692e968f45b7f8f4a7e60f18700122575a47f97e8d7dbbcc332c3befe7f9946d3848965026318fb51c183708c9ba692434460de17856dee8caea0386fbec6bc78edc20fe738378040ef5d2c51dacc6da01b72d2ee2a66328f587613d5e88962a9fc9ab20d3a39bf4a80c9d0ece8003bf7bdf7b871d2ba709f6651d8329eb74545062c9d010f46bd12b80e068a86146128ab3e5bddc362a7ef4503535f97bc6014a65eda5f174b2d39dd4e33a406a7bbf03674495af7c7f0a886728c8493b34009e5176e4cb846d84f79eb7a51124bf90716964db5c80c6b6169ec81396c5253efdba8ead0e88f029c15f70fdc095b6ba9ffca927fba73c1310b2d5bb1254761c56756e931b49ecb1a175bd7b9cc16ea88072ff3b458d22c03dc366a800b5c49154c36c7e5609356efb0591a8ce2eed2ff64df9cbd6665d2198cddafbfcfcbb25072eeaa0fc3920c71ccef8896aac7e258fbafc612d18d0fb09863b99e40ad45fde72ba796301f6bca992b2b258d5cd608f80b1fc99c0e241371fa017f86055da3dc676a47838c8128dab61dd159c695d3aec9496bff9db8e18fb9c013c498d183168829c8ec5e8499f667d59b43f873065fd2499d055d243e047854858eb5047399ef835d21cc9f716d8e06d03fcb715a4c876735fce03c72b867a8b8ada3fca801224786a820dbd2852cdce87480d08bcbe085902d9711a763832e10eba280e1dfc2942f23c840e14aec81fd26dbe92e2022082e425a18eea0fdbaa7298129a310eebc9715bc1376c335a106810e0f3cf564c30abbf105e1236df8a860e7eb8a275c677ca8b9d6b115de8ef45c674875ab6063273a1fd0c9272fd5b3283d61150854194298596a8e8ffe2314b0790a4feb72ee122dc8c163a66544dbe3cd61c094449500422657349103ef39a852404ae3bafae152dc19e4ca146ff9b7b9b089088515986b05dd90f64f0fbfd3b5eaefccdd7b65e1fe103aece1d759ee81fc3d902bf347a13735ce77eea232bf7d1f2fbdd8362dd6a41825319073c6683c5b97c6ac4869a808aa2aeef44a4abd758116fda235ae3183291e2325b636e81033c282fa85e24c4ff40331f36807f0932a6201c66c1e19812781775d1e38229be400f670bb3619ab3200c6fdea274d562dbea92d327c4661d324570cfec4c685cda1276869be5d905b4814995b80345a1d5e6b2dac0f93786d560f2290b522f33b2549a704c05686a2a2371a808fd5aef7f621188602d54c9fe73f2955779d3be6bb32a6a0e4be99ea539575905a2f5e09ca27528da5890846b21c8228e730f48fc6b3a3b197ea43c845afe6fdda776b8a25e081884be6a2dace6f404ff02a141f7454efb8135111e73b5c0ba6c57ae654da8e8d45740d11a7e28af5fe3f94989ee1de7b65a3fc8da83fe154a92920d25d966ecdf3e536133e328c2dcdc4d7d64529fd75a12d4dab7c6bea10d96701688dfd86f726a2a1d58ee0a67a5310b1d91699c21696593358768091f9e9777f1fc9da7ab0a048bcdae345ec671043ce1a6506c236aea72c0ee7be53d388d81ce615c4f3c66a4438da9e5a757c333181c571b6932f92ee453fe924588181bb7fb25c8e81330316f9ad37e5b061dd1819fbd9852c66a8fd1b4065399221f7282119a9f9f8234d3895dcbc54d99378f8c887cf542e8733902de08f67592dca7815b9ed5a421c513876fb2c87b40233b5a0e73d4c2147353970e5aec5c5f51e6a7740f54b12a5a0da32009ddb859210db947c17e63aad600b235f386097645f5a7a63b7f9a6d8b361906bc65d625f27f9326fe16ddcc7695cf0334a0e508a2775369fae8426461281904487e2e1edd619d062e8037f8cdf30d520412d91f26f1252baeb81a704fcf6682c27eade36d56760ce106a40668522532a614fe4537ca0557bf08c26c9f2834f0f0e0b2303317386aacd322f71f34447710a2fc495b91020c847d06ebdebe075a71f40edfbe2c3f6c70ab669a12526f588bcb9ee6b5c6d19394b770b9dd2d079ac05b3889d0a314473f967612a59f2de1c0444e7190c85bc0344d128a3febf66189fceab14fa052e068cb77f1f9fa07151e4827d686e32c6a0361205c4048cbfb5673dca74077374fee38334140cc318e59b606d307ef123fa1d913d7a96c6acddda6a07b9a0029178fd663c9a3605ba8a1c2c1130f74fd7eba08bb2d63f1577b50235107e3bc285c220a34d74df70e00fb7bed90e16490617550328124c925e2f61212dff12aa13d60c2fe8a09a9c5fb796ffae8ae40cdc3f04f20e9068be9f2cc8f11a3be6878baa04ac0546d38d99b6346c44ce689722171c21d65790a17cb148060948450b0b99bfc075c35147270cee4c7fafcefc9dc7e4e86979b83f8209a892a8cfcbf17deaf77ca1e581d0ac873376c2b1c61fe2601b30bda1fd102f1484aae8b8af7188e081d53f49fcd907c0053aaf70db3a6d91f8c7bb8669800f8c8ee33c844cec8aa87439661c92fb5803d51647bdb6a09033b8c24d5cc11f2f8cfdf5b228ac58c3b08a1c0bc47751a728c10761760f80b74bdf34dc32d65de93c17fce1be5842391f95f93bddaaafa3bc46a2bf42eda6b149f21ae617e9fe914417d82b71bc83bee3f12adbecd61565186d9d2b7297f1e8ba2ecb880b814a339a54c6c070e7754af069615430e06784a5a171bb8ce1ee5ce5c71330b6c8f1a44687db02b8326150a89990c6407a1fe15ec3984be367ecaf48520f3b5beb30061db9e7401aef5dab9354941532907084efca7ef6b75053d5b7403abc456ca3b5e7935dca82958041c39bba0ae1f5f7ebaf9ad95eee4e8b95ad9caaf6cb74c368f77f55671a8557da777d6461eda7c41f6d8078c6d30a84d51ebb8b046b1f33c525aaa1687839b3dd17eecbe9d440cfb76e54b39c6efa1f35a39fa7ae76f6cc6fb1a557d490ec20f5ccd3a4f8cd734193db54e588a7902c34a216bc696220e762400d44a8d5b7bd2fffda4482595895991b946a5af12836e0e14bf9e82674578680d0cb1d41b17c4f961d942304128161f003852d2d128c1366baab87cabe29b147d7a1a2af6d8b4efdafae6a4489f5f68cd68f9318620abfeaebafe9b75a17ed01ff92e08fc12380ddd67f2d0afca0d123ffa6b4e89b0eb7ee3b2abd081a0fb3322e670e2cd0861904158dea861ac23d4d230db05d31418a2d6e06e144febe65ab6daa2c8b0f87563eba183c66e059a5d814be73098ef330fc9cb424379a90ad0de30d7918cf71c27b1eb7383ded1407fcf71dd02c8f2582e0b2a7a1eb81b758646192bdd70ea925a6547c517d3a3604062d0615f8714637a3116ca5e65dde6f65c04d010c00b30105c97c4aa034b2be4dd99449a5b1b7bbeb9002c81e4c498c6222e3b887708e3ffb752e126693f58c23ab3feac8648cb285e8f08c8e66a136f86bfd2150aa0432d70d118ba4094ad2820aa7c35f03f662abed5fbc8d06152e17407920d50db061cdb3e4e4c6eae152beb01bcbca2bbff74a9defcaec39b46f8e1a3b4a158aa24c4b3f61a15418088365fc0407978e80e19c8cc24d845446a2249c5be2a5dd1bd5632275352cbb7995613aec10345789a4d37380a34ecfd24c47b6493ffc3c37931f5e4b6f9076231d578dc9775a1742b478330fccb64a3005225bee45855c9211564e55c0a6c33fce96a8fee7e0c2762670a30a9f19fd6c415e222cea010bed644730bd49a1375011c299568b1c81781951a28a5c86800b655abdc8735cebbaaeba2c27798a7576f9e1c60bfac979d279805610bcc14130329442c12b928c28f4ddbaa76b0321af3e6f01ed1f78af42baf59d29c72bea8a52e4a6856fe11d85d16eb586baaa36f27c5f328420c45a5415779c15e3c76b710df8f5ee38185da60125a5f3f95b6da01754c6f4a5c6a726e9b3213032649e23496f7d2e0d09d0fd31c3a449228e12956200a3e7b97bed58101c24a2b6fd1ba7c9e043ade50c533d1ace1bc8952fffe26202584f085ba22eb23339b719fedb80edfc5f5ae740619cebf7c4eddd1a900fadab0e93ea6c83cd9731b838ae30e9648e7c9a23d2f66e9bb86fcb2978ce7d6153e7c61e1469545a8e0277f04096e49f2005f8a3e276b7fade2c138f4e9f6840fc268ec24ad2ddb63e087f49a407286e259ab07480120820795cb44253883ec60e7e7e77c676b55e1736ca2a05af3984ae395c8a7ce03b281aa62a0fa6fa321422b7898840c45532c3941e2c815ea977e9547147facec48147416ae745d6895e3d4fd638c7e5456f9a40abcb1a53320081d9b95d912a7a1ca08a657d8873d2cd6db3a628de8a2679432a63b0a7b8e99b97878dbadea22695fc45ec393b727a312d1516c73c209a55db7cd89e8b9426e9966a0fde699d43a70935cf7a5f77ce532e116e7434441111ddf38ad7931743995f3ba901bbc99c07cb0dc27a4a620f549dd6e2866d3ecf5064032b8021801113d6e10d453ca89e77349bcd477bf9a85bb1b8526cf97d20ada375a061626c2453e8f56d077ed6875229b52c363f8b0df8a055c1523bc974a03e6401fd59d5f8958dddd218bd3a81c6017614dfd70093141332ee1eeca3bcfc5a60ecd87ccd4ac605961ec8b1679080c15625ed2a7b646e5c933efc6d34435baf67c5f1f1b76f6d7a236cc7de5b6595271c0165a9485582bc4065826f830e04cc72921f07e7d425a7d8e4bd421089f7ecbc04482a1e7f31daea8838dd37b2d78a4d8c371663070674a654e50930b8d5cb004c4c1a9f4f1357b51d4274055463b2bc3efabac6a76c98e6467c2974bbeb6702e98a555d94f6c7de45bc0f71e882a6ed6da6e55f306d520fc6d428789331acba401b2a37994210bc98efd23851137d5d3c717e7df52a8f41a8ebb799a294918203a633fd953b2e31929448912859c96c47eb1286ac4c1fc82ec2ccbe26232043acd546ec44ab360efd7f122fe8b99d1c3c18da7a9ae8bca6c658e274089040c10db75c914b5a3f5fe414236d4320087bb690b4c11de67b3a926a14bf7213400ab345cd55d556585313d7c0fe4e6f48313d022424c25fbbc32ae21a9d15e1c04db15159ba42525ea331eea6247bc7a3bbac38780a14456fcb48e65d8489b3891a7d39cf2c5d3418aae482966d33382dc3e044fcf2e954a3ed00d2f99eb2d60a2b5835407391b4adbad0bf723e59fa8998ac393e12bd25969fdbfd5ae50f5e895435768051f5a107b7dc1a22775565274523be73a8f4031ff60e2a5a76f5a385bbb22835a294741cded787489b2df8e849e3cb9f39bbc4a7684e55bd071d23aedb5465b53a4c473c2dce83d9a1471115cebb08ab966ca65a71c7109df25f762c7a7c9d77983f1b865c212280fa43fb03aaf73bdf5a61b31fa6393439d118148045e80067b352063a216cb7c1d7c294f7a51199f1e2a05a988c9480d227940b75bfeb6d682b72854e1d56b7af4fcbe73b33437a3a6e190f11daa147abd63abe6b444977144101b771f52a3f8a57ce0cade6056aaf6b526dc2130869c59b98443f60644e268c884504f19122c35a676c273b7260e627b913a70ea907e0062934c29e44ebc33666eb600afd91f37bfd91f2be44e77fb9503db3031a3610e6d620f541c421ed576933e1d8d30487a01a0ed99b6b21be6930798e8cf5b1e62c9abb7c6255bd502706142ca40ea614d7c395680567fdf740b517be27bb1c925793ce783d31b7f78536db078a4a9f62fec66f201a97f8c54296091417233918673bb813f6ba71951443785fa504062143b3262e273a23b28c3ac9043c9b87dd21bd64afff13afa969c7aecfeb7565a5a8a74615b28f2209c54892782ab46135a872a24e9feb2d298fff2be29ba0370eb89a821076ace7aca0bfcee2844aa1d7b3bc28e9cc97f15ec9bc7bbb08b312d8f82a6d32c6fc83c08931c960702252b86b07957d3f39806a426ce313d51569a3236d04ae24c588b91231c050c832f22f3af704fd4030d176deddbe081cbe92893d804185b8f589f37d72d50413e55e0c264956a39c3b366a9f5686badc7b11b82b2ce6abca076c11e4ead161f01ad367149e1d54aba2a117e7575524b384687a5bd66953cff4098625c05f63b6d04e642e6bebe78c0ad8853da6481b83f937a02008fa8ac50400d28164bd1eab5707069d70e6d59c2cf4e39d64ae7a53ef67cea421f87c23d1acc156c1402104f7cf715c3628807abc7df9a026500ef99880d52e9110ad503ec91397cacd0ea27bf15be1613e9725b58df3bda8bccb84814a5b4832359009db9d664f4f50d281ec8491be175f9ce63e50a88a6f3dacf31a30440976e9c69ef51f778c91a80ffe3a281521a7fcdcb1a32a6edfaea0f80c3622d1cc6f2cd5fd64c6aacfcac0862c63155742bcd8181947dfb8dc9f502637a47508da5b59438492d78a6239c803a8e3b019a5029e164a0703c61a4ec0f55e930ae78e478226cd8d572a63fab92ab68171c2b065266defe9f5896ea20b47a41aa064d7bdd3d9bf34a1dbc4825e9ad011a21360c1c8e2a2b9905892f873011d1e77d2c95ac4e348814ef6d83d8f4d2db046df5a080ac09c7a456f1f94a1c7ad7864f4a0bdb6cae76c3ba1b47320fef96a7bdfb5ab3954a9986c33623f899b1728b5346ad081847e57e1d1c075a6a4dccdcf394bd36c37cd8bb6a0735e54ea44d234c36103a004e0e068ea4a87d7e0a1eb3ce96c7016ec1553b20be368c108a2174883f7e6a0d0dbb0cee21a8b151ea83e865881149db17aad01f55fc9c6b550be85318bc665dfdafb5c9919fb7c61b0fdd9400217a8a2cc99aed6791b61abc34e1f8cb00344f2bd83980bc9eeb4302117339d714d83909f13eb658bf815488444a759fe487eeaf99de615c8b4d3a2dd0ba3b5bd7a6d6b31d2a080fdda5e840f985b26e7fe4728bee7964845cfe58213d9319d44f8d10630a4cd2d1d993a6309820917732a9f207c38fcb92051ccc09c6fb9b34f1cc8eebd39edb8bb968c9211d4a3854f6a18d2c005cb82d06f3b8cbc4f03eefaf70a7d4f18d5633d6bd00fa38e2113abaefb8be19dbc48b41a49f07423afbc2831f5a105d5fb32743808beee9b78c3f330cfbab2a21170b3975bff68a4bc7b927ce6d274bfd24626611d667ff38ac4a51efe63a3e6621e1f0380cd57a0716d063aa9dd5f262201875b21945fd35d50b7512ca5ad8f6afe2c30dafcc5c4522e2b153ce846d9d31d09fb47ab6bc5546ab854f9e6472619ed7de8d71498ab722b88d61c07b7d8ad8c0d3debebbda9f5e2041db0cd20c34c8acddb1fa89a4ad7e1e0f4a77494b22279ff2b67abf9ddc882305a48c45cbf9be9f636f968c6b3ca8b3baa72eac849b654d244e987148695a591e541fd6e00722e49e53a18214e5a8e395151751a7067105e3c9e19be58f5c465b64260c8272c943b1c7d1738a7519a9c213236d520459799a0ff7f3d3181f06ea505ce7a3830b37e619efdbd7058a3089a08dac461a88fc24b2f03ba63cfddfb7915c2dba8bfdf5579ec2a383143f500070b38a9df5435c7eda74739a71cb0bc6eb983921b3d4f65608faf4f4ba0b72dc41ca82b8b138090684bd7623571a9422e3b0589fc287e817ca988418b1cda571852ba2816b47cddfd831be678a195d027fb5cfc164ce991f8833832d5117af2b321e7d1af9631c4e665417ef82c202813bc4ea10bbe1d277bfc637b9e7ac27ef29aa4894a36c4c0f20f1e0fd7d797823d41485a4e893cfd00a8c899f8f78b832b3232ad24f156ba76e2bf87f10915abb706d00060b50fad52a951c11b483bd2a4d12c0650cf7188935fc46918df07292f01cf5f85c29680d7b4bbbf350e8d6699e7d91d2efdc9f95567b48d192379c23dca5f16d9ebef122299cdfd9c2a47c6a64a7e00800ccf1ebe179ec9bdfb04f6444fb53440498076f42303fe94eb98c1a3c4885dc58aa0133ed5fc62d10cf9c592b4f479737b6355cc3806985a4ea82643c202017b8b654fc39be24637bef5e06b0366c1e62d32405b92e5b24138d56ae920e40f4817ba65e38551832daa2f7a4d625d8a8e9505bd597ef6f8a7cd05d6b9bfa3073b731eb414b5a78845e5f8baabedca8228b2b3b7af1acac2713dc64316dfb2b3136d1fc969c0d2fd9f10ff68fc51e93bbff9436b7cb71b962231b05c3486ddd6c641cc973cd82ac242fb4f3927f681860e689793db41cebd247fe8a2fdc4400bfe665dff8de2232c1ab66a3683354e961d1fb0a7a0dc7790793f2a73e2382d65b4c8a4ce69c41516dcb8ceafa55ca6467f28ac5f4049e0701dbfb0116b297280017f71165ec9e201a9a1ad26b8381a2731599081c4f6d3f5f0d8dc715de461ec3662aaa744b3cfcedc69324523b8c82cddefb7964a41ebf9e9cd4094203045a4d8fd2120b96124b9985e40ea20f15bd591c876a9b74e0ee03e7e717d8490ecbcdfa6323d238771a14c5be4fceef09fadf15a23e7b9874bd19f822edd4ab22cd13e54906873860a41d63ec6e262e29f70a284be5d4652b1690e5c9cbdc175b8dbb1510c9a776cd3bafa6f4e965e01ff083309af8b7080d2f67920c87f6748dbd1c468d96243c74ca38e28ced116348926f9235a911694d1fb960b5c4642e3326b5742bdfb8e3da29a897df6953cf6f214e9758662eddd7e7904530e087e57fa01e2e1f906101db1740dd7c7e7b935974fecbdd46e3dfad688e48b3f16daa9d45aac293d2779a5a1ca5040c92d674f7a6b339c28e51f5e47ea5c05237a1dd2efa96f805983dd3a1c67a79d0adac68eb9e4bb61a77358c783d9d03b1ab66cfcbd9fec72330ece19156e381815407ea43eee2c992de60446a4d00f08cc1d4b0dcb8f5dc6e47f17b7d8f1868f6f3d9aaad4a4428c36ddc6b96d13d7a8139f98ca84549af6df4fd3534e93e3f20354e002108cfbaa381faf21f18e04d2789bedb956832172b92808d3b6666722780d70389a7693e46930a481711fe4859fd2518def9e60819099941254198a61b69df9b5f7150e048bc118242b96812fdd5f025dbc5acdc694777a7b800cb12e48f3ad3c1f0e9f3d3c8553894ec8aff03f4c54779a8c1d1cf9287860bd5a45a18a36ee7c22f63444062ea8e4e8c1737295e8cb92b3965caa9c7f9ce5af54d3fb182a54e2d39f374f3f5c6c70bf8228bada8ac7e0b5ffb35dc6beee023ab7efac3de2fd68d8259af707069ca8da3527df3eff7bcb8b5bceb5b8444423514d873ff9f034fd7067875e360ac5cc61db4ef07887f7c2ac71eafa41f980d48e18ac7f066d8679403a1ee8aaf0446dde8dffc67e7616f4813c6ec2e9afb52a177c99e75beb1a877ca53b691108c58fee9404e78ef9344f41c1e42da6333bdc39507948588521c1319f8efc95352d042302de32206015bcc151f69951697d7d910756f6acf33dc2ba1215f4d1001fadd05f7534efa11cb6ac38ab673048bd3bea60ffe89b2f36c98b61a0dd22e26018c35f4c1749c1ba7e1cc2ad43367be63856a6b763ecda11fe56a1bd2a0cd5b4727a0a9e4da141810f104762daeb33056f4a574c629e6be09e269b7d300f2e20837b7193f6130a199f7f2e4ebe3d764fc849629fe308873db60d7d328613208dc4f3f8c22344257e29721b251eeb35c3e851c935536bd75f78670db534a7010c2d06bd481a7b4b2aae3c7c53f0ce32ffc7c118f2091b3caf5a3bc3c192d36cfd91a7b76924a01a7dd90beb6836043e8349d0f21d582582d05d1a68320f88ef347980bead2bdee903f0012e40fb302df5310c4283ead027e4d904f50d9eb0aac6a3f26418a6c343e2e21452ccf6fd28c1cbe6009e6c88f839affe47379ae81984463c00de0bf31a58aca0511bbd120b4ea3f51cbd9892f4a2c1d44921f91f1fab2a18432dd954dfeaa19eed03de6bca498dced128810978a6a8e25e52e001bd3ad4567e16fa7fee40fccd86f5db60d4487dd8c8621cf9140b428872cd47910f664131a231e5dc99c5f0b1d87c6bcbcc533e3e16531e24dd1bdb9965ba47c6b6244cc4a87ac5786daf896c2df2ef1404f434629f099ac39fec7d67310af7eb50cdaca4a3f4316ebe51ad7dfe9f376415e572646aefa66f933433bca31f53a0f3afdda28d8570599d34e706848d4bc914914c2c09e6a77dda1af491ae3e571044ed6e027b36c6f2e472fdfd4aa6a32cab66bcd49e8941eb2ec73e0b7cba8719a26b45d514f9dd19d10c97a80f901c684964c375d854d09649690927a3663d2b09383a26b3e9a793557e9c0aee266d271606b78e7b3e290c064afcca25187ddc8e8fde460ba79d45547c96d45104bd56fdd33095d33ecf16d2737a57b223fd3079ae3da3d89c377a20c919903c1affd0d64d920b4b47ff70cab2bc2fab7b6ef9e06a3cfa0a95b5c552f7756d5c14de8e2d2318cd80ad3f9f64dc42af1996f9b55e9232d3325dfeb8b4a50aa6143a41b2b8e290c7c28920df9156fe3ebab6e847ea451316175349bfa6f38ee302ac8e92a3f7a1ee987af386a837b7e716c2d34e3558eb89d22792099879e1b9c2dc60478c6731ed23a96a8e8052b0541a59528900d779f9454d5cd55ebb5b49fcfb7bad55b25a0aa31201145e0b6754c949144ebc8f4b21cbb14d906d2a5d22912710b819b73cdc1d7e6ed0df73962ef4d264e3db8511c5d1f30ae334473f00b71115715beee2bffa0ce5181d7d1996d9de3258dcc8ed33ce84fc1b51b758eecba61ec607023e8396cee5669fd6badc1737ac4cab2c3af90c8436794a8c275f502b21fc49a68b9ecd7071933d4353e465c7540094fe6ec7bdec45da37deba7edee2c73e58f5f19cbae57d2c5a10d1fe8e1b7afb9fc3b15b023aa7a3f035af1ad7d2c2e62951e917e4c86268d14b53530f8d5945d7e91074065eb60d932b67bd98f6063e803aed8973aef536efdcce79ea9c360e58a87ef6827c8f4a3a128b34005ad01d2c8e3e4e11280ce28923a12e08e55a423bb5c00a3c2d11756384bdb61530ae52f270d54b1fb76a3cc5fd37caf025a420422ef0a0b74c0e2ae241aa9303f90c561b3c5ef631197185d03df09e56b448d71eaa30682074963343ae5a8e320051f5fcacb2ad4faa90c2fe3f498f9fb9145cca5bc950882d233a16dd55dd50dc45c5f8e09ad87204726cc9d16be1c23088165567fe811eafcde0b8a175bed200bc3685e25daf37ded02b6ed604ae1bf4a12d8261b8b3f2d31e3ff4e69843a5928cb291afd8b727268dc8f904b7fc265c042a7d31916a90c9beee668d6e08fb77454e98d251d5ea11eed618d6262e2a8c267b51c15b96dfdba8770a226f38af7081e21e40b2eb336b1d4e83da2fa799c54884eb38a94426232978616f3c978c1acb87bc70b945a507becd68637ca19064f46693ead41f54e32046a00ce9b78d4db3efd132e3eacedd0752a6557692a797d5ce6a5dbb346717500cd82ed2ced95f437b8e322b4d9fc1c2f19b5e43b3d3fffcf06d6b67be2925ac162a994b86b2936aef437d6946c5b149aad292b1599eb5252ceac9fe96372c84149f13921f088cffbab6de58680231b3451ee3f151b03eb46be390d4373f88be59be20cf356cc6105805af737f27cdcebb8921b443fe7b665393c9a3004e86cd44e96167a94bbc0924799c5733b81a7a43018f1c30e0b7c8a52263a484305c118b7be49c2ed3c3fe875b5e1c3c8c5508cdb214228340af75d4892c46af7557420734f178723773500073e88d8d57c9a40e67d428fb7cd3e2771cd64da80f336684daf6e1f6cbad4bf829294fec373611db9f9ef06ed588d85009e9b1b02300fd6aca3c4a8c3f1c6f2ceaba66c28f1e070e8de112ad7e026646034089b86dcd195b7421dd276e96ae93af32fe3e95831fbe1d65f8bafa5c93399c7a3c9919995e57883211250512f8794149d9b177c3558545ab9e872b26673dcc5202d0c717df535361ccd3bd4438824af4b810176675a5266f96058bcb1944a7f25d03f3fb65c47b411c3a3ef31c596a081e20bd74db8cf58b9e8eab28205d1bdeb139f87b88aeb00c76e8e1f07f44abb1206bd7bf3cd4eb85e287b3489b7d368698782d3185eb9fff5ca2de6a617a98088cea0f202b74cc85e05958e0b2b0426838cda03f9c1a68aa0546adc71d6199db3f28679a9f14c851e8abc2d94dce103079c7871e4ab5c39bbc3dc8802b927c0d44cb664476a8ef87cfc7c3751b6e562f6e7a158525eabebf925df9ea12babb7de8c86ad721629755bf4747da6339759d9ee6d5a6e87ae8c2fc7490b3be210acb6a2ddf5cc6914a70af7570d0b90912c60dac3c0f9f3316e49d638406e5725d61711646a3ec3e020f3bfe34665be714f85a54b753beef5ccaa0fd4f56bc6c3bc0486ef151a9b45063e7d8f56893189b79aed9c8b9a41176ed6c8c7a7d1798aa8747dce407731a7636dbbabc7a14d65fb662be6c83d6e5a77b285d01a5abf728b1db776d77919e424cb13970e987d0020e91616185b3173d58cfc3ab8d9fc06ece30f01b7cf3365e212381bf546dd6002bec1eac35a6780c76149a0ae99ca79226d3dd5a8f2d5134698b786fd022fe7d35f48ce5ee610ce8af931debbf1560e6c412d2cc4e82848cac207b48aa07463a30cd8b36948b713074105529dd282887a061e1a6eaca762f353386a874d8ed5f14134b0d7d4c927471879ddd6723e119b6fa2e0e4a35d415252aa7f42228584739c8b6e5ae1418f45ba2eaac00e153b7511ba092bae514879b62f5a51958bfbcc470c4d8253141efd9246981e5e87f3914af84e23c6bdb2ec137f1843cf918ab5e983991711f32ad825be3e2362623e26fa57d61d7ef726e362823a7363c1340aa839cf1b1c6928cc2927aa303446d7df6c72bd30187360bf744099cc637af680a047d6ae74f095d69835f177694d43c692cd5da2cebe4b1728062fe67b666985a1e33b7775df96fcda7751e39c2dee2c7482186f8b6a276c748054fa555be1d266ef6241adc762aa7526a69adc2c7998a13d54a97384755c9e0f1f29a82fe756f1959e77a94ea3afbccb3b71d0ee983288a11bebcc0b0cf2eb46cff30df4e0068fee64d52694c35c714cd00425296d5e186246d7bbe4a4aed25373dbb9ac0d25aacde597061ea5e4458d74ebce2343d974053fcf8ee5a450dec29ee0a3dbfb1eadee133cd36b2ef458f745bafb3dc231dbe36afce1abe9162beba0f15f30e5f0b64a9af523c99eebe188af756cbde97c4f0709e1f71e796d846cf2bdf3c67a2b02a0d74dcdddd62e942f01176a0deb28498abb5d31d4dd8c9b91f32f541749563491ae697d00bf97b1b87ab7ab6e4c2a5f47323605cdf64214dc072b53d2f65053982ec484a0bbbdf967a54f4f0a0c44d3dddeb0c1e0de98a7e7c1e7e636aa11a9ef680a03b5a978dfa88a11773d3a416cd728df2e05f8099a6bfa9dc32cdb59efc130192619c693f8dfcca5ee9f9b7931ed65d933ff357ae88a03c0f6f033469f620a637eec2ed3ab47a6b008ded155d0c4b394934cf416577014ba2104d2860052bd3d909ea3f25bbbd67e8770d5bd0f9f2caabb43dd65891882233f86096b5c232f089018a4dbecc490c602efda3dfbaab42d82a08a463e823c09754ed710ea4ae64f2fe84cf384779a69e392249ec38f1f53967a5c5e4d45426865e143170a9d7e6270fb2fd370387df768319cb4a290f71b7e76a1d7fbac87ee690dd3d2fbf2b4edd92a4d91017006d5d6eec332771428a3ed4ba4600b89a84f0a830efd22c8ce01bbdf6dbdeb801c284f502ffa10ad2f42a9291faea04e45e4b147808c4891cbad6f9955b1298b35523eb5953d376edb2e01614f25843210caa9b94c5c21f33cf45ce8fc4cea016cb8e809ae66b0fc1f35d1c4d1882d3f3c4832c11566928f2baf47d4ba8a7251ad6bea8e76e2ca47f2d34d916e23ca6c4ad0416084290ec688f81040e3415ece9b871f5c2c3da80f7f32b0968bd2ea094fc23bb7f087e0afdf92bad20c51b281056e076b095581e5b0f960dccb6471e5372207b72237b10712e078af204bfb97e0b854ee2890b26ffb20ff6850178160a8eab55ee9f623076bd0cfa804268164e5065d553a19731259343e3dd3638fe95a51f64fa9526eca489e9a534c57a56db919c893adefe4469e7143062a3aba5e981b23f5bd94b164160814ae3a5f07b1f82e34f0ad4bd5eb2cffe1df034c8e3bf476532983e84314953906703065220a32092176ea9ae3ba9983bd3ee4b151f89740ba50a3b248d5de9e4eda938826bdcf4557d838695f757907af420e03f493a8be6d364a3e8ddc526631b1da01c14e80afe72c00a27d40918b2fed6e8dd7fd6934690646607f06cfbb35eb45ee7ae993746bd0afaf49c05fdd099c632fa35aec8166d51a121289c9c4f24fb12c6c892b207f325a3a8b4ccb2b68005a3800d76eeeb470c3e6f90a186a98d01cd245d184a5a06cfa1b28be844230dc21614d86fba0f1904621c8ac969495f67e69a50051abb27a11a585d6e6a8c59b6d09e4a32a8cabb977845882d8edc1c3bb9ec87034552eb4bd1a8e52df0845594039f572f3b996de6e69ad73282fcd9930e727ba5ae0ed970fb1ae13c3fc7bb504c790b2fe02ade67bbf2e9affb0f5acb1456e2f582221f071979e45fcb5104df73fd397fd42dc89fd3c0bc0fee63c7196ba149a59b51f1a1e7735b86d9086e368068208476b95d8c9ddc1d0eeb0fa212616b666db42a8033397ff30c8622172f075a04cd937dda8ab880b10fd3fd603788c24772c9d14d465ac92b43de52ff490fe45b6f5c8b3317d38dc2c6c6e76771f93d751570282c579a10f907e7bd9fdc5d5c3601675ef2f516153b20501fd57b3d29f038b1a3c66652b4ce2f2d7df4b076a96b481cf452a1fe729fe347b9891df594eb6b760afb11104d5bae64584ac0ddaa3917da7515c22a9104c362f0536492e6b0b00cbae9aeafe7babf43e9f177a9a5a0e0031ee97a5e00ba4abf1caab24aa6a9ed4e743174ab0e953cebe056d33761e3e4f127193da16839615c3aa465d787bcd31b773e7cef43d6fdef07d7eb12065940dfb52a8a20a068c3e6749e087b2042ac70dbf508a5c27aad60ff8b24f3d262aedbdfbb26521a729fd687ffe5bf67e49239fefb4d3e889446057e60b9238a0d3db3ea06bbb41912140a1bbda78ce4d66f3fb127a04699b87bc5db1d7bc58444166e025ff061b7f6a721feff76161ef5acfc930162a9dea281218b50cdbec6e3733e550a0544423b89c6a0f998db9fb0d14db6bb569ab83c570128b9cd3c1f36739d6e9d4750a896be69d8f62957c2e9d582b2cd2deffc3562b92138d9253b6247663842b2663d8082e87b682bbfb523b0511ae93ebe7d74798ad04a49b4cb9c258340b0dd7c68cecfb8bd6dff3d5c5f0d9505267fbea89f53920964d377ffc5bca50a609233e04f2cf8e7289ea69bc3c2e0706861e981908d46e343c28d2a02d3fcdbe7621a653b1fc8ca79facbb8574d118a567e3be69083f08753985799a6ad22beb02ad5a687994a5e411f2d3fb03b4d4525953a950fe9187e9cc29be95b60adef77cff31de5c74c74e8561e32e60ff2709583d97347ed52475f0fd69dd934c61e35e1b37be226ab54d35d42bb18165dbc936ac79f492821963e3067815c36f2c549a1eda6eed6b2d5104c44b25b8e70c055c1ebf0f9648f7bb5afb192328fd6d0218a45da354eeaa8e2de342c717637482fd54567568191038ad00071719b34d0da373f07b934fbc26be8e2deb133f3f35fd45614d646e4e038b8976ddafdec3aa57570e9a95e1d25f3110fd5012dea710b9187b2a271d6623f4a1252daf605cc2296914262cc8d41b8544f2a0a713fa56bd041cf94190b21566c112cd585bda14b611c568659dad79186c4873acf1ba944696c799be3b29223be1b4415f1aed63d70650ae7b87abce5ee3e86f3726c3ebad1020f6695b7170e2600c529a1c105c0ffcce06592137484108069aa13f338beee536d84ec64a7adcc0cdc1935a1210276fdf589281771ac8dce5f430b205b4089fa09024b6a7c55f498757a53bbb4b39673bae22f39442b10b64b18d2d5fac9a20470d73db48163ad21be8e343e422fc7139db8e992731fb45ad55960f71bbf91b4f298bff5df253ec40b25d56cb06d477f7a43cc12772e53c2eba98290de24b5590ef7738685bdccbe55f6b63c017e6a9658f8e5ce4e76a8e4afbfdbbed7b2d52cd63081edad2456aa702aeb7a4db8126a8d6df2e99dcf559ae8b0f51fb5e82003242716c936c19476a224452e5fc7a317208f6d2692c6d0c3d8b4585ba76df6a0dec24aba1eacac7f4d05bc6df6e62e65c226d99ea4eb83470e305e2223e0963bc4fc43ae6bb0c89fa36e62d484ef083a4601e0aaf7283bc20f17be3825ea9b828701b493648fe401409615fd885b3f838069045850b81c21cc0a35b045a3829970044202fbbe64371ed77cfa28a238553ee24a2886cdad1b483a6eeaf171ccea73c32f25910739884504cef60e7700cde81bf7245b5a2fdfbc60af4387a7f539f371f6bef5f875e8abb5370bb078789811744330f13aac1af52eb8a351857abc8fb6404d9ce66815d23bf8e91d9a55a428598318cf2b1f533d40b646122211bcefd1c9a897e5ddcc47bba5e6a1f9886cb217e8fffe424ff0ec6b55eea866b5b4bff9e8a70b53e32af3ed25bc69ba1436a9f5389ae010f70e353a2cdd2da2c4aee3ae84b6113052232964c8a947260c5dde123b4ce9b4ab97415f01639e852d07ae9d0729ea1f6f9eb6e7338b309dc052cd24cf376e14b5797406229caad19f5a549c71c8c36ac73d620035d7f95777bf6310e7d940ff38c2af43f79e99d4d568f875d9acf5c6c3f2db739199454d3dff2f85a59d190dc617323463d088effc14694784745a9e741b8196723cc519bc4cf84facf24e947fb2c8815835c63fbc19e873000f73889cf143b278560ff80ac26ce82b620115bb4229145e912004668c947a08582e4b8edb3e6a91f97770e040e04930cda65dda9a26d249a29b2df72521f4dd616fe32fcb8bfc319718fa3e4c1bab445fb8508b7ba23ecfbbfd704f7b89284d46997867a843c5905c4df36de31b11bb64efbdc3ed24322c7ae2b34d9011c3530c7486588449fd72cb85a7f177c277d2ed982e0a989e190a0ac92ba612de4c1269ea82518cba0bd8d93c8fa074fc9442ec1636c889777ccb2ce64ef7455c05a1e2874b9320bc3ec3ebb1b412f365924373e79e9dcbf46b0e81b66e247a6e71214a1e03c6f3a3910f5b6d63e3349869c8d4c070e713ed82bed90f9a272f526e74983aaceef7d83e9e68fde8d70d75400bd177f0ecffea4bd5653cb77ffc822a96d20d615f74cbd62cb8d960acdd2314b296f355f4ced0f0f86a33da34a6a1986ac53f60225c8e9debd191eaff3924a8f02e1875f155de3c4096b3b2413275ca4e216969b0d97eb4bcdebe5e3386a05af9cfa8dbfd3ad8c182b0e2e6a215b7e45ec56291830d4c83184d3b449fe83b26da39e8f9675f3e832fd1d19023be4cc891f55bb0226b45018071158819324f8cc63ca7b89d3570f6f37494c07956c7e64bdecf2235cac435d200dd1f0d49f8f5c56c5b5b78c7aef645f1eb1731a4c64635411346a6260f08b4620998104c9c8ae4b8fccadd496e696de7bd80c0a170b5e159a0849366cb05f8c630d51cf243e3fb5b7720d8e0c16bb74e54613a8be232b0cc497d7e28674e17aecaeefbdfd87e9f47cf7ebeba1f7820afe3a4ac9d9e720a7671f5e101984797c0e05902234b1b2b894e452fad882089dc230117aa57c3f43a160cfb707373ff95809deb5606c422b1d662538bbf0cbb3094f0eca21e7b7cd43f1d92329a8bfd6bceedc1daa2539f716c6b4c97649f67d9afa2995c9455654c35db0363b1d5670f72d2369b5d92a72610b98d1fd21031f22faa8b0208f23ad3014082bccd814b51d4b46398fec757042fce0dc9244af495f542eaac31452175de6dacc771230ec419959b7d4ebccd2da93374f82ca2afe1a0b3093844fad0e73308ebdc6ff3d12e9c2acf9d3d709f912593648c217fc537c51ccf522b998136705f5078d12fd799d140caac8423b67c29ce6ead697d09cb59888434332f2e682088ffa3490a5a4e24af6c843f221e198597aa93ed6f277af4d03137358392e2867d88b12337b566b1e9368f1a1055293c1d32ed259469b85e01cec6fdaeb47cfd370da9b72a63638c28ad635160c9eafa567ff0cf6431d549bd5e0f7feb52d93d6d88d448b75e9fad76cd5144c756aa8c1723963fe96140a8e51ce0089f40c07a6c11f5d89ff483b65c2745a38043438d32ec47a2605b25d0450bbbd13bd742d093559c30793e1cbd46e9d7580f97e2c1855c37e158194595dd783a2c57c4ab38e86b668a327114b5494738650a694abfa3ee484ac235ec671f2d8b7f4d169342d980f9ff22a8af52bffc72997818b5489df276c7e05be08e32cade52633a1e88044d96b49ece9cb2344c97842049f7c47cc02763549babb7594e693579726be048d7290c7f7ae7302029f27c5e4a9397c2276a13ee778f5f0540588403e8a1af49843bd5d108866a546e313d80bcd4c8eb3c59051877a7f6424711ab26a78ccd7469fde425858dd7a365af936785cc95ea797a0a83a78d01d90504a896fa7803cbb6704680bcd9dc576a112d8722cb93d97a0d64728a486e461297cde0f47941d33ce8789abde7c5cba664c6e1a9118f56eb0fa859ba9812bc2b81de2722d93d5a50cdbfb20e126f6e6669e37977008d9b0e213a1dbb209ef5a98c6bc9803095ae8e08acb5d0d93d468d721371fadbf0eee15cef9d5dd17c2f775a87bfec0b853f6f5d2ece4ec9d3044c9249157857e3b3a1f49b428450d8d23eddb71fd78ffbbcbe002a9992ae46e1ba4b991c87577240b5462218e0be519cffe3e379af68935cbdcc56bad6dcdde165891c5f46dae9cc83e74394cf287c0a20e329c8e03892fc16fb36e5096d655d507cf52bbdbf24a606c3d8aaddb89f997c90313f77fdbe8e783425479210e855da9f022507f64467e09587989b96a5b92752f54ae27f70f5bcd2e19ec7f521ec51bade59254f76d1539fd0383e1e0844c904bccdf548381a74e100f6fcdffeb2060e605ecc71e190beff86ce1fb3c4107083e06e9a2da2205eeb7816fe7b9166e4dfc4811f4438faa7c3ebf92fa7277028b59038d80ab03839259ab70893425485720ef78ec94178818320cd19da21b726868de01ecf1b070cfc68b3ba5e1d66df74f09d4c0e05bb8ee0c3f55fb6254f2742a5777ef014a9ac999da017366e70d4df25820c844e4304d8c80a6c75e0cf5f946c37d6683271cb9ef871084eebe076aaba055632fc133490e8ab1fd4b24909098fa5828b0c06a6dde3462f2279c7af81057991c0fa79a5d3ce2fff0e60efb4b16e21a89b283e4cde9dc7e471ee5ffced6612f5d685e970cfcbf6ef77b7e4911f54ebee5d446cd21e847c539fac274c22786bdb59d9d55e1fa43518fbae5c44c155daf06bdfb96405276cc14d9d5843f11d564338c39e1a86182a6fbffdb0e032d611204fce63c56e3b3168d9b9c781dc85c3bc56fa9e9fc571de1375c4a0ae08e658ab23acb32f12ae3e48bb04972b80155269f24bae3302172ec8663c40683ccb720236b969233cc9c634228df9d17acb38853e404da86904a06cf50d212678bfe406847ca371c9118b1c4f693d79825b5d15cd1e7f8b5b199c37b032422bc4b97b6beed4fbc71a6ee53d72a158849457e91523057e58cd83b2ad3799a62aa3cf9ecbcf03960c7e0195693695fac076861fd3a4fdfcc5d35c9cd4787cea6b99addb8f11fefc89163ffad742593d11d45e4b9e51c0bcc757461c024ed0c5b025d83db28eac2c2bfdbd3d0c50da22f5f9b10ff858966b58f15f584655a300381e67d273bfad0b69b21e3db45b0d5470a273e19ded863709f0bab4936e59bb03e8bd7ff173df5c2f8a517b82444a2811a82ddcc7f33276220d4ada7adc148e31d98eb81c5fefed5d5b0201beb80366c0a8321dbe4de6db9a3fcc77de422df40a682769a72a35f22a49356bcaaad7a760c4e636b7283371a77eee292f8e8688b8100e3ca49c38cf3ba012286ef8fe55b2e008080595b7236ded3babc4d5fe4d1a20ff6f70837ebd9e512198c3e35105ceb3e05743c34af40acdfd07f7c0b36383188b0618d9964afcabbcd6b30cf25ab5c6a54dd6e33df6a52a330c8d782f75090c491c8672fc152064b1ab2d7bb8e2822819c722e808359488e6395472ff1ce6f53dd358d6dbf2d4324f763b263d4f190cee598bb22bcc7332f1cf20e6393d78765a561f145ec931755adabec433bca47b685a14842807b9cba7ab9f0a89f46bb9e0f188b05d4bad961fcc967636676a7b66e9c0825e1b55711cd90f66c659abcfd3ffefb9461c915911ae3a7797197b670baf9a42f65c11075e7e4dea79a300f52744724de49c84e5cf39cd01466f79dd225dff4c5b314a1219f086a284df9eb6a0573d724771e68fce6e8f8d66e10357eff3f5a7c6ae08fe11ae8d2f7bcd957077f7dd91988808a0af34067b35cb3f31c3b31ac48fb8c6fce678ce8c7a17e0b96dcb8c8d1b9f7fbb0e7c422d3fe9cc173e78b054e14137e578f1f25be73dcdfa07ba18aec723fbca38ce378c7d7a62cc9fae8a983a7481f40d6897b6e012416f2f69f5fbfb26112d89f6556f3ed1889d7dc4845231802bd1ba81dd777e14569e6cd8a7094fd30260c527485250e5d177b4c0499b8e2e78d18601694ddb6c57e0e9f5158564a99522459abd22547161bbfdef72949afa89bbfec629e5ff0695a4a856c94f69d7cc130152144d5132fad7f524c8896165e965038f3f86ad01b2faf2778ce0fddbb4f08c56c454c35fb9a67809dd84e5ca93ba7b3850e4dd0a30c75eacc2d4fea356028b20df7a883bf02b4b56333d508b8ea4b68f288d01fbd47e458d80b1fcbc0d237a94ddd3a25420fcafb358db20ac135a337cc4e22527438e65e117ca8f10862f82c2ccad960fac64771038450e33b84a43d7e22260f52bda70d0cf4f2255748f8fc7aa8fe7d84496cf1c42abeb05137fb66f3dd97348972d70d7d5d2c2c7268fc9a9185b3322d4a21dc954128a529e6074ba4eba66ce350c8c821d96e7807b2ab20faef32d5c38214233f9115f9c797c5cd72e85038d1f5b9e8bf7ecbc4d9bd5352247a68d53cc114d3dad1914fdf54bf5e45ed6cd121d1334fa2443d83b4224861e289225ad8aac20b8b9e9cb4681ee51640b8adcea4f3540aa649ad3a546de10ef87bc1291c6772c3ab13ba4783bcca6c365c9670baa5655a45bc820e2dce238b148168f07738ebabba1757eb93f624153e86e3c8fb3cf4d37696e4fc2d97404dfc8b66437f9d73e9d7c407e5d51830649162f4d0fffece8af7947c03a5690bb67eb67d1bc4175f8523e80583ff5d5d29c88f8b2a56a1296360b37eb616bbfa6ab8069480f6e160677902a4b42cdde09bd9fa4c8242fa677a57dc27771cd077fbb2db69ff01899e698702f8b7841eef46748704335012f84f695425a06de879d28425e19ff5f1c37a3240ee3c051ec35b152812ae3999639d9b7f924e3c048ee77da85c355f5a7c558467b5ebefa23ba1d63dd93d0a98e215f86a1b13b580fbc5224e57ccbb3da80d2d1182ef200a1a404db7b1b57b15ef66284635dbfbf16e9bd7bb868d2d13b4712228ce39fe24ea35b74bfdc01b64d3cdf4b5e3170ef81240d1f522d49c98ffe73b281816842d19a93dcaf833baafbf34fe306520aefec497fac7f0968574a7376c8b5a610fed2d94504912de43c6ffcfa4e5ce70cd0f1ee7f1c472f120e1db586709a330026dc3e6929b3d3de1b4c81115a087251c563ef8e1099c02400fa87862634b5188b3e2ae04f84282b363b68339ea2c8dd5c615e55df5b121824eae90bd13391eec8f02f8785df2addf901d850e6acfd0df3f5857411d719d892fa8d42a9329eda8f98c0c0375ca5a769cec4bb4afd46a349ba1b64ea6e996c1743c0a9549f3dd5f253a70a1f57d7337ca81d21dfd1150b57e94350d28e3705ab7c40ea3e894b3f56f0b70334c7f20f867ac1b45bdcc81c9d6fea5c186a0a210a02194f7b93ba60444e1176a482270d11aa89b4a33d1ab7980987fa3005f8b871a621d5539f5dfefc8e6846e85175655c98fb676f0ff3a78ad2b768f8efd3e4438a5685d8bcf6fc214ba9a4686f7e9cf207a51c981e1517f181b54975ee5957682f86a555178d3db9b0ba6c84455381833586408c5f803e528200f9c25bfbd46b10b2e9c02906b5305d6bafde5bfd95af2a4c1f9692f6f24ba14c1b268bb9642416ad2a11d3dba00caf0e0b523c088837430caadc1350d1ece755a367de48b263a6374483dca6bde179aba0cdd86548388fa89ceec95a8047614d9314ee8522ce52c8d953a90de790bcd89cc69c9da293967ead34f760e8b2c994f1a9fe9ea6b147620a0ab157b05d718f91fc5bddb95dad6a504e7cfcbb770952ebfda2fe68a8b66f302b0bceae7ff6d9db3c98715099a58fc715beb588f26cb48678965d8228018bf136c7641e19278a1ab5c3c8c9e8d8f4616929466f8486bb41175197c52cd7849ed0957983633417370c16903f752845a8a81267cf9baa17e45853ee8fe073aa904174574525e03d1f1c241f183fa8105a6b7bce6d63c890691cf7ff62ac7e26cd4f7df0c0c1456943f952abd915d8215914691bec52d4d65378bca6150b7e4017cebf07c91c3f133cd162ed82ea4e972d5588829cc382260437ff1303f65d261e36e9a018715899bae334386d50eb4b0e3e4de6309a71bbb139b4864ea3aa26ac30b2bd4bb84838c9a70f37c9279930f14849b9dfdcdbac7b1d7f627a8ecbbe2749f0772bbde7af28401e91a440d87d74fd1a71ef4c5a05087627dee6c0b12e28263fa2de534041af1fcb579148d7706e6f8324f09e98a0161164ded7867988bfc295b1ac237ff636a189fe4b9d36fac032fb65040fa7e8600100ffe2336e4eb319fa9ab533f81027272116b1e069d9d42d3c2160b4992dffa8e04b0c54574e096054829c27fdc13ec429e55e28566a621964bc36686b007b8ef4e593f626b0039f28dd23ad15cabb8bf1fb3594c372181fcb6183d6d6c92c562495fdf0818fa0768179f23dc3b76937e6f56176b68afae28b23605bd643f3673fe10ce8c8eed20aa113a8289931b6b81b43cfccdff77a1b09b571cc1974c6640b357d3e9433a3cfa1ab92b9f4dc2629eab15418c585542dde8ae84b2eec6e9295f3cfb9a4558199eb0fac3894eb6d06d8e02c53ddbee77c4c9ee741681f1ae286e98f4777d9182115a2f5b921f13f4b955a7cf84055af789ba0e52a4288fd8b97b9a0b863f444228ea7608618816253b4751b0c04453999653e28fc8195c6909f60fa44318d7279951bed88bafd67c4ffe7562f4a5369351d4fde22db8f78f9f28ae658ccbc04d6c5b8f23a3ff557f77df8772a32b668170eed2368468caeeb2ba9ffaccc039907a71af104da1c02f11adf281f36856ec15eb370054b27a3e1d906b8ef99b0138d3d3b7bf4389d244a48b3e0028f771c4192a7b489995072f9c21774a27f7d4d7c9acf561d6e8cf9dc80b78000f394661453e2a5b80981e4d8eab55c931d280af99109df67f290ddfc76575417d96befb9c98f2400eb1970c615ff50952504f7c3c0513c6e68942cdf0d7cf1e3332200113d8d85fa2ceb190e5b8c766e8d20fdd4504f9c482aed976243cf3606ca6e39060a0403c62a5a817cb63f7b8e727800d45c8c35a7be35fa57e173957d63b8c0842ecafe5ab563291f911429deaed9cc20376a9f30e651b33c4a2dcfd1ff9e24d96edcd660bda615f5a8c876ab6a9245494c69ebcecb5c96b91520536ed3dc6c40fc5ec3fa0156a3b43f415be446263115a387a62a36c40497ed1ab513ef1c4d2a2cf141a0d4797c051df61cd6e834f64722b819149efa9efd45ce25ff7d7808cd9a1e233586d059ac1d8bde49528836b9a339e80b5f8ff7f22aa4c232bab782d812f03bb0600b2c9a9abe9dcb2123f9ac2fcec3bdaef4b52ad34234cf7038f84e28c38f7d13a4e8236c0273aac6c543043a31647b1d08ac6a32ba43946823417cd1b60a481c690468b793b35e8f2c8f27af0fd633676d6d9a256b2d8157b4bb2edff81f6989d48094593f55d534f254ba58cbd92a4f261bf7faa63eb3107cccc32a1ceed5c2ed20e9298694a11a4c2b644423836c04559880f9098647dd9f6d4e9864e7ee6761445b8a2d7829b79c19490962e381ad64b0d7a7e8f994f12eb847f1a408a062902ac9faeadc0ea8465dd50b79912236f628dde03ca4f96257e3f1451b5789955fa21d22ba96fd0edd0ff41e6f82fc5acebb6f2f796bf047dd821770fe7de18dfd981a97df0e67111d99da090755701f673c98fec3bf57bc899c6834acc3e3e756c163a52d08f84436fed857e05fb0fc9173310b821320b4c7da3611caeaecc3bd79dd378e7f393bbbcb0439ba61bd2d14fd73c75f847fcf3610f2423d243bef7ca6dab4fc8d28e25f985cec340662a5674e846200d30eadb8e0bcf1f345ce0c869e997957397fcde8c40aa4780cc32985a3d7727bf550fcc0c129196e4d0a0274e12935eb0200b0f21cadc58a7cb09571f369acf73a6ee97b2ab7b5f5949c364456371b3d63ea0f874633022eb952e1de329062f1033a1be0ef550cb706e5ad57400061955a8157569264e628f3144fbfa94ad950c3073afca0833db8b4a784eb26321d5c0ec757528af9a7205836317999e439925e95c399c649eb835e258c6f2ea9882b6422d060e4f4b3643061d3e7883b0d96697c1bc8304f968c70360978c009df010b510c750b9a361dc50fb6478c4fa7e2e995a3fed49082c16d1ffad7f0dfc7bc13d44e5940f9b525591108d581a4a26dd242cc1a159d84910d8f7f38e675a679f71e69c71f7c30cf7783b886667c11812c2fc6f8903fcbb435750487c4aed21a4ab27cee847a795e49f57f6a0cb7dfa6dca89c71ba6387a7780f7dad16426967f0b6dc5d55bce84ef901f8f6dff6ce58511d2e3317a6b920f081976be97ff2c0d6923fe1943f98e9cfd0101818aa9b3055aca338618b188d569547ad7f350904fe7300e28f2e65994e9218a5798eea2f0d0b1d944d2bf09812465b38ef6c394e8f02d0b8fab2096e1a14c4adbc820ed7b4e04fa8bf92f4df8d8b782c24b3d85214073e1a742ceb6e69a4cd2bd5cd22fc8c81f3c56c22c875180f614ed8a055c5c183a14eb5a84e2ab665c1a7c2aa10643449aefae77a6cc0452cc08fc5745cade921298020b5778060949e8858515b0b8732761d808ff672b6ed6b061bcccdb5168683e0fb5a82b4ede13b8f7ec253473edbdcdfc4e27758145c7e5d6b175e1b2beea55e22a455ee7689b7d8c7fa902169dd1d974ebe258d0fec9eeab33d8dd307548c653f8cb89a487da0827a90dfeab1bb5765d4e480ed686640afbbcb959aa6502ecd0bbaddd11adc294f5f38a6774ed26a8ae0a4d8a6d8a95a3550fafc6fbca7dc796385f7b3c522f4ea11551ff6007d75857b3a5ac4cf6c867dde1e8252feb778673529389b2bf3785f6d6499befcdd8003ee7b54daf9267cf9c66655e89bcb1d2b05f72eda045416b136f93e386ece65d5bcbe57eccab7af83b0d0775d3a8bd668be3bcee4c958d4d28c7696ac0b291c10f9fef7bc75a0b7ec7c1c1c933fb0b5c49e241cf821f0764bc5c81f76edf8a70bde8d4e41e6559f481c152c0ed61a2c094b196c98c9f787dd888b0534cb77a3c273b409411c063ccd8313dc5fe1ad3d09f99578dec2d6e2990726970b1e6ece17200ccc76dadd7df8c9b6a4fcb713216ab2e74430032a650d8b96babe7555a57591f29312980240be496e1a14b43b4d3019498cfd14af01379a87fcc1798dc27e21b1d120d4d5aa08addc670e50636429cae47cbce47d4bdee9c0c8fb8d26ae2e969e972cfd472bdc129e9ca415d39ee41a1e5842b17625578f605ca49e1aa4b8db0a844e57bb9c4ae0add880db990faa208bc9c1441e92496147aa241f2b6376735a6fdc89af5372ae3bd4dfb35e382a8fba3016bd4a0bd9542e5aed2d4cf370d28961d7663ef6ad050c31abf0972961ef4fe51035a4936d8d6d2e89eacb6af2c5c1512e27b356c00b499b3e1f1ab44a2f27dcd4827cddbfd534852b77597633ce0aba9201c34fdd64680e2038c4616c7eba0fc8b588b3fc49f554753a2f73588d7749bfc0c7d7db50993ca2856956a2c53184672a488989e6caf97f59dadb9b88bc2bc02ea2ff2c263665d39a8820178335561c937eb495f749a04323501efbd9ff7a2071a9c75483a2970084bb04a2b467ae3a2c41f3e6405dcc4b59ab51ed80a9a56e8c5c500b6057971cbeb66f90d41afb82144943571579d6a208fa791617e45df6e9d71dd290f3e1129fe056c72bdf8dea35f087e8fa94c33a843ec356bdadbc8cc705ff914192f351549abfea24f745a358452bee2f8921bd1788627715c17afa1135944ceddc357fe492ba7d9c3912545c94db538fd1f7d9966e03aced45a6a231c9f1d89708253b10cd62e2ac6d4338a0e42e69cdd5d6f7892920493cafaa1ec4e6bb13d2ff499dc4af9944f46ef989fb20f70b1785727641749c0fc6059763bcef8620c1c2ad2410dc8fee1744f887c768cf2c584e94e3f126edb09f24181372c89884a50afe9079f09cc9d54c8c428572b98931cd40a015439245894e70f65b3f5671ddded76d1c88bf6da25369419f39312a3625f3eb04a81b651205191fa63d0cf6a231297e1e880735cdc96b11a837d065c40c3854ec05dcea695cde28c98443e698a1b648e305afad504d8c33b37d7c4efdfc061fa44e8c34911eaba8fb2248ba1f159c160c0aaab964fe3d04528ae54e257e4f505768105caf2172ccd0ff4bc29b2eefd9d870495c2715ef2d885db1cf2f6fdacefe5ce6b6a8ab37fb0f469ae8b554dbfe6a35854f6dba059641aefa044973cba9932d1582cbe747c7b8eb7edf8933c48ed26ec263d95a48ad1cd06edf21616927ef8b2fb5ccaa1a40ccea358f6af4f71829052f6ba4d7055cd67e53d991b0b7fc4bfbbcaac0d0eaba60def8a9cc12ceb91a567e74e55a25fe766369e4db8d2131ef6427aa19ad861fe4e0ff2de3ee38ac2eca301ca5be2d07acef0e9cc11c997db58ec711e26524217d4ffe2523e7ddcf25b534e63407efc7681baca9d48bb6853ec84757b77af1e862de7bd610b151d21b790c81696a4d1246ce7cbeb95f55c256f3f34eaecf382e5e6ab264747989b30a3be357e1281429471b1a5bd37ddea7695db38427135eac33d7f122df0297a5200ce4d531c2c82d7dc74b91a3805119a7c0751a3aa1bb23c3aecb97cb1215f495735589289e18eb9fa136f8f7cb58313253f4347a09716e2ac4f97ee31c3d7719c21ce9beeee7cec047d0c9e9bfece06df5e52b19852a96104a4ee383fb96418dacd26e6c0799b2ee3b1c0fe7ce2db8cf7b11cd269b59c8d85d593ea7c99351053e300e51001434b432e11da552154a6db3b7566e35184fb22716ee78c3ca10351c2f20aa901b21bb3ff6948f1e25ebc914c07cc7d657d42f54bf47af66bb6269a2b045e6e0ff12a8bc55fa2688458afa667b0f8119c5f1d8b545bba82c035a2f5100c865771e4ad8f04649c9ef4a0394caedfae79295d1db8b63f5c2214c16d6147bcc91ac94becc66befd534ca16115681aa2e1990ad0c1f8f4a850b432767064b6049f32aa3f8c2250a03b8ef9e74ca1c3c1faa0ab37e12dbda369d66ecb6bc59047c0936327f35ad6f3fdab4932034743886c32b4180ae0c9b82e5eaa0390c932fab5ad56ef6c264c51d6db504a7196ebdd8b85313ed3e9165d83be5bd92e150ac8ce9f8edcf56bfeab675a75e7bf1324ce7121e486271ac41554a5202832ad4dab195b820ef66fe8c471c83a9c53a3d1836b98f45bcce145eeffb15bccdde7ebcdfdf6c016916f6a1a931e6a2caa29b49659dfed238305edf7063ead84d3ca82c57836117762128e6dcd2790e68b34bc06e069189f329c0ef75e4ff8f6fcf4dfdbb7b0d44243af518ec7f25f5f6ad3d0bfc9c01ac8918c9d3866d94de30990e946937942f8e0ae5df03825f26f4213fd847d78e7a9c42869fa450d4beab8e48f53fd69c9bb2e6bf034553fcb66795cb84681eca07b373a4de577172272e5119f26b362cf040c19442366ec4247143574f327e281d81f0087c24dba9a2883a3abad4c5dceaccd953fcf16ef563631eab22f84f58b17dc08c662fb7f2de6761cc106030452838bc9b8cfad363141e7c7c063d6b4a54e4461af233cb9105973a75ea685b0cb495962e1a468bb483aae3fd0be7624d5b6aa4cad9b4f989a2bc1ebb64d3a5539652b1aff393cca3f166ab69e6830057f6b39562f5abf041b26838cc186c131080ddaf52984cf507387886964a1f77157e454893366cd2e3e82e57a9d97701d02cd28dcbf84f3dc6d03c21b45084f46d6b790d7867a4013fd71b224b48512de3df7f6ffcf69f188fe6e4bef96d1ab3109e64ac335e32876e097473ed4d2c4e1d657c11273f7ebd63dcaf2a0576497345810f1598986eb131cad591aaec8c5bb48b743914d4f2207deff171b72d604b13f35d6314610b139602f917728be04da5dccc765005d22b8f993696a090b77a71cc3eb0313f2045d662983fd138a42d90fbcf5eccd4e918c9e478e2306e12814917e5e3190ff0c1f68d555a987283bf54c8316a9a21df1f2ebafdea3fbca1b878ec8778bf01c85bcc63f0db955f2441e72a6b5f9eb93e2cce174caf3d062ef0d2a6fed9fc24d6fe0a03853e46ebd334b7254e1927f47d255f251bf55b725b9152ad8d5a8ba8e66bce6133c0807c725f9171f903c6ef54f2c3f218eeb9b8f051d38834a3af1734d09352ebeb261affae5f49fe5bf9b23e79165c61176fb4bc7375bab07773be8fec14fc24ab8c7c6e923f97c0ec7e53e6d5bb73cb90c68fa7bd362e82b0a296a7e0250815bc553c3e991fb179ab2f8a5b6c3e11a560de14cb441c161c98727bb56d67e7400df9279cd6ac5e1cc334a0969daff08794cb5b7d5307c1615a3a23a982ea3148c9c539631f548ad59dc92dbeee4b1550f07103a507537e0c9663fd75903887944b5e601e30819d3d0c783a128feb2a620b19199471f5dd812959ceceeb44a5d480581afd21af1b67536470e9d535bcd4b38adfddfc8f2303197b1ce4fe7728d0848a447bc0805a58f3c8d7d1d5b9b3499cc950f6874c5e2528be09d143af0f905ef9767e5fc29d35157926c65c8d37d946d06245d468d1b8f93a021fd98cb6c41e840cacd433c5c34296843047e92482dee33ca1a035c5b07c5c4f3ac0b304feae2f38776ecc2838c21ef96c41a7939fde19214b6feac8bb702eecc64597118d9143107a34013593d88f64b880addb984aa0f5e4f5eb7ac86c7eac9c8db0b871a578923c9c7702dacee90834c6aebd9fed9881e43dc44298b8639d8ce97949ad8ba43fec4770706f67909c148891778c500284fce29b49c227c2b45e260b333c50c1c7f51a7f36e2a13b9f9828b37b2aec7b10e78c8d9fb267d568861150ba4a6e7da4188d9fdaf36e226d5069a0fac223d2e2f211101de8fb9d217f25eb68fd576c2daf8964792c9331357c4cab8372287b002a8546c56c36aa546a97baae48c814d03b1aa8636e9626aa4be20fd5ce8d0ab5b1aeb6e8de03d88e92b04092c6b63be2e658b95295f7f9e823150b93a507705238c6d54d8dc7b01324f39cf563f5769f7aebcd0fd7bc5984339cc4186a6d26779e4800b9125a37ad6a2cabe98b38078b47f781185d20a351d3b537adde668363ade8e9feab70f25ae0cd65c1a06b2e096d4b9312ff3e00e5c161df6d067cd4c8bf936765567665e0d11ef4e1ddd693dee2276ea8969fe35231577f41494121bd42d0701d2507d83e715acf82e32a019c83fae051b4360a9efb39b4dc6a5afa6dcd060482ce529a0bfcc2168f8134cbbc289982e6df9d235f4cdb11a0fec5900cbdd67998215e97b5ba48e361d316f4628c0bb6b7d163f43bbee069861b9964dc259b91330400514a9b2873c4e84bfeac76ef4759b4840dc36e2d47893a570acf93704e9974ce13e2687f3b8b2172e59fa13df6cb4cab08cd650f1c04f51b5611a7a3a80f8f82207b89562868d60bc3b3c7a02c7fc26bcefa9e42d125561f5c8638a48dca03d0578e12482d5b00e7ff454e9488da04960cb2e76e63dde104fa6fd13c584ea2456de0f82650c94a2d42ef3ca876dccaf584a6ab3941cec484d0b7b92988ffb30d5d12ff1b70ea60a849ff9be7bd81e5f75f89362d4eca46f0d45baa2cdf5d4c5a4158ae1d478cda4b74f03388e9529d192839d436d1ecc5b5c36ad573dae2a3bbcfccbac16837add749ba957d4fde43a901d58ead8ffe1e8aee1971d494d17595ec86efd2ae15198d4b4a1c25005116ead4f57b0d9033facc19ce8ce2d2d7a243af2c3b6656d397a35f75fceb3dbf8a77bbe942612f9c5e30d37fca51d1454a1fcd7da9ba356f545573621c6f8a666eaceffff414b8cfa5be21823de488e6c3b683b5a5034489937538b5c04dc388d9376e7f107a797e5be5d8373f26a005223cfe2c4d435ba01e7fae674f69d2267862f8e7f3581099cd828a099fad7c1790e2028c6c10d996c94274b9c6da77c048676ea27672886bbaf3671008f8777e7618030a018d06aaeea9a4f2c1545d74c0b3323814edd82dc34105cf39a1e80421bfae89932d97216544f9019f2e51b26e02d6163d42f2da85a6739708ba2ad6ac55bebf1a8b4c969d1939300c4d4c757019a34c92ccdae8024f5ff946ddc4527632d89ccf4df7869199cd0d280ccac2db29010e14b438e2f97ede74d02f757e809a58e828d5e28fe9c8bfbceeb951b542f9356bdef5709c16b56c7205af65318c6bad7a3574f9e5611fc95105e17cc0069d062bd4e3c552ef331188a07ee4ead7ed054faaa5e2a4b4f170d1c30cba1fba0b85c9698864b15b0ad3db3bd5f69501fe713da58e027694982b5dd68eeb61f76b2c320fdb2d8171a42040634a0723e4b2aa9afb41126d34cf0347469f6f5dd4ddecee9f438df61e1c3b78c5d590b6e02913b13a443901c4ed90bdfaadf7f2704ee8300f08354adf03ab03656b1f62bc4623fce6a78f6d105d28d2336531299cc286442845a71090104051c8cf1cc2d671595b2d3cdb2c8f0d66bef7201d2b9e16d76933345bf40263e31a577de1141432c37f975c2eea4c9c540324a1e1ff48c24729cee639a895bb31089a785ffd42a050325f81c35f0ecc4d29e019d8a60d7c7b28d14f82ae287b4a52b8b82e08a2f69e3ba62dd667882dbc2b73a17298ba98c0e76d4e55105b3b6537aec4104bdd887d8d1a549697d43df5dba5e9f84b25a6354021bb08666bbc52a699adcb37a189af481801655d689592cbbe3265bc4923df8659ee44f7aa18b5acd1f0b43445214ccf5a182e017680f7abc68483c3259c6f9087f02a675d7e6a8d7cef7617cd5fd0716022806a92beedd61886fd49dcd6c3138c13f469bed225a26f00268c9a93d2c8efc45dccd60ded63686130c7dc1c0ad3ac8c28a8a2ab9c6f051bee83e72fab4fe87eacde9b71f7816d299612b452b888b4361fb967e3b830f18f9eb388758449d92c7154ad386a216a5e85e5d1f17c3c34c4d96fc12e16c1bc9256a98db1d9bd75937007110059b43c46dc90faba326d15ca124ef6e55c2e507df00b5881add2017c06f153fa86dba278d72c763583c02a5c554465ec010342f743d038a41245105fd1bd2a2c864b02585770f19ea133e184959e3b212a0f9f8e0c740a3fd1eb863aa8c86cc4b6a1f150350a7f607907640747c0a241e17739a14c2d575e6fa309d78f34838d4634a3aa93a3f62025d8c5d204ddbf902d8a14f95170a7b6097d140a157ab717de17b32c0ccd77c1c7975d87eeed3618de0e85a94b64bd07b7b3e55558516a8f3cbba1dc649af95306cbb33f2a53bba83bfefd1cd702b4a2ba08bedad4349d02d411c6ea437fcbed2b98d2677a03ddbaa318ac2b93278af516f71c7b7f06b0fe47044578dc8eeaade7fa962f48c6d41a9343387663b8fdb530bd6089aebbcb324461646bf5b8d6cf1607be81c1279d92fed57d5870a2b8e9c3443b51818311d6d7347c8dfc1d472a674ad661768125cb27d10418732c0eb99a0bc7535c95e241fb66b7e05dcb5094e92202e34b91c2faf201f2e2b2696f267b1dccdb94f24d1a985604d15ad921527c05c43d44ab66d7265f4214bd84323792bd13bbf5f5e9d02968282c4c171d3ee9af48a5ddaa07db6fd56f95a2f0e7dc0a921938a727f816e0fac418a6e93dfd98f228259ad39f65570a083e87f1f98173f1faee6fdf94bd996268415fb59760f7937754fa5f7976c1ac4f8378882f87d9beb8bd804b54f41cad8421fe81776bd23765c7e3955dacf35ba1827b7bddb3238e0ee3d72b52d1903de4fd0eb2e837db439356280690b1e4e9c7f5b6cf7699dbeb358e763c5576d29eb46cb7f9891975dfae50e8480c5fcc709f696420e68705954c3e091c6ca852a08969f2de1204fbaf248660fc5e3a97e014fb762647e13c06c7b4c42641dd0ffa6877665a1dc510dae8329613e7208a088bc1f3cd4b790514f196e0832a589a2779f69750abdec0e0b1366115152b41d717a71a695a8421c6e4afbae7e27fb176e451579f83f5608c0fc73783f2f1dc8a37b222b91c186567570316929efd799dc91cf1d6d61af1e249f9061a2fc8d21887b51e046fd70bbbf4138751ef87d85af509791e8d46381c23228b255b5d32dd7a9aaa4b1c9211681e350c2b9a53297d41eb01a163649d8a643543684bb43c640a94b5b091adddfd9ce71710b14a2fc5ecde1251118fc6664cb322f1470775cec5530e26a80aeef2c8ce8e93b95d52874dc592a0c067dc7236156bc37a139b8b20ee331c3592a35b6e5c0d9076588a2c7ca01d54dcbd2048b3fde36c23c004506042b9c564e70f13a94d7b08a1e055df58cc0d44a885d4532bd2e661d0b9be61d056fc461cdd7d204aef1c81a13be8d977f87691116adc0edb7e67409c6bb73b6a722ebf4a6aef8a7b982f701ba070a66756e36d75a2d9b573b908b8018e9e30e55ede8ad6524143a3d2e3b77fc166802618e0bc709082a5d3bba104f5c044c7a21f69748e0cebff835f1e5be0551232718ca05dd059e6fda4907c11a369402236f3a805a869fb68c5955f8f62a284caf023653c1681df561ffe980a544e088650ef5144cde345b6fe1153ea5375ec0f9464625e15b505eed8c0c74203014fcfb430fbc69f91437453bd9b9a1aae68dea79f8d1afe15f90d0c83b873c3468857dabf1a00871f7cdbc1634c1a5615eec8cb2a6187e68ea1294196a8f059ff9a48998667bfe0dfeea00bb6be425f5e8cbe003b5a1e985ae23790555c0d3fc8d7f7b7b4cd7cc8b221e0e6bb31847d8ae1d6e5ab545926621304ab6654daf9ded6422a739a378551c9ce5e90e8b7f71ccdac17ab5ff46da83f1310c9c973464d6cb96cc215e09efdddb25eaee802e3daa01beb93a62acdb770f68052371f7f5a15d46d79b19c31b56b9862d336090ca35ec6626b1693f3e80935e1125b0fbbf79d947a2ee11a3b05934cb619ccbc993499c427a8732367b69347ed5ceb914d03a76b07969065b3a51adab7799b08e48c580bf139af9dfd3db0e352a81406735a3af7d797aeba86b0f6aebd6c7837c5a26856df83d72d53a984f39fd6b83ce278101078f45f719ec8379ef87badf265d2effa817850322822322af3ea2ebf987281a69eb60efd0152760e218168b4ff98b003b9f7b225fa4d1cf6f88fdcdd924a6ab95acbdf1cebc2469536c28eab11cc1611d174235a8c8f5149a9f18fdecd6119c11c8e723c2b57c91b7dadb07f568fc1aed8e93b842451bc6a727ee6de1ff33f790a11b0f1dfab37a1b26b633289f30499eac143847f5c972350a7aec2836af7578aa79f13ca5ff855d5106d619f52afdbf26534f0863d204311c1ce1ec48d7e9095a7244922828cc576181340855adad2dc593e8a9ac627380ebbb00531dce7483c9af9484823e0750b76a9b3d51214a2b5159e42b83ff8ffc20c2971acdc34d32481b0a4a7af16337d36ef73782415df459e0c96d528ca1d4f6d8fd00994a8f650770c4bc276f7ef594091909d1d96d88e7f7e2ed9094f7b7b90a1b0a73cc78648ef40e7b386ed3b5335556451717dca7a301441dfc04a6361cb5c44fc4c069136e39ab55f47e33d7608e8520cd10828e6268b52720aa57c5dc36013bc6e0fd20e116d652c3065bbf66acdc4c9cc5197d24fa0b0cfa1e92949ce4f7f3bfd1f65428d7f5dc7ec5228098fd3426057f0b0f7ec8d05d60f9d62d2aba543546d99710166caea936c51819fb0fee2f6f84ff69d197dd3002c0e6599ad1af4ee4985b0d8717a05d1e90607d642619cb63ae73662d978a4bbed07c73995a1fd91b6c985e0ef072314de552aa01ea1586b61405f90b227788d8b2327b4514f5f63bdf7dba5bf75245de12785731f02712bcf944b1c3b1002278fe92855d5f38e879df6b71e15d7dc1b857a0b241fb9f9162482742de71166ae3ebe3add1695f2ab7b3a287b83f53d58f80d8c655e7773386b453a4984cf3fbab14663df22b59720e514dbbc6cd3e7e6aa46aa252bb400ab4e1cb1dd19c4abe7aed99d427da39f5083a80d2c78a9dc7cf1eea394b67bc541b9b9bff41d8b53088d32895f5e8f0693731da5ea028d24f01c20ab5d6c63a802eb588a949e30144e709f7f92463024d6f53f7211451731ece309005838b7cfb8aca942814c0820853eae1a97a75afd66fb1a834004508059ce76ed7801a61e462ee2894e221100d1f662f03fdc047d69a8d4f4a3edb53f5703b2ee03e65ec7f4839f415c1fffefd68a88878f51e3958e2b1bf9702b523049ae97c2362a596abc4b78344d39bcf35bcb40be89a2576c3fb264beb6bccbf51281c169a8f60fecf097f011573be873134f9454bc13662630611374734e28ab5256db3f0bd2237e049a06582887af2056a8d4e1863ba1cddf7fda642d0f743d813329aa95bd6a3f89210bc268203ad2a728cd29445a7d916f680d4b1481606fb8dd1acf10a3b787503c3ca9889bbc4d2c0d8c8a599f58f3beef928b9feb8f2ddbaf95a54524f5b0ecc36417bfdce9ba2e249bdca758b64f32e7f5b878f34a21af6d074b62ceb5f3645e885772794fcba086b9bfee12cb8391e8e8f303a12b9de1626662235972e660e42467c6103858b97fd2645732c7f35efc2c99c6a7dfbc8e52eacda1735fa6fd854218521e4c638ee08749f81ce473cdafe2b4807b5437e9087cc8d23e3957d091876d881e799a4b48671c4e5f94c437b63e303e2290e5dad4e9bd8d019d8f8a6cc15a0f8da410eb81ca877010d8cc81dce86879ea64948e733f0ed35da718d70e60724f70b366c2b5b3a9bbc60495576b46ed6f62fa733a0e8a1fac9c1ccb6e0e0acee712ad5f8c80c77094be52445b528d44058553cabf2492d3bac95e2c6434ce0a4e3a9a47f7d602bcf00cbae11c2fe926615fa669cffcd4075e6ee632d9c365b8a362d231d7ffeeb31cabb70827b039340d145b1f2ae053ed60ca4b07f7e745cd37a90a95070e421af167c048a2f9aa9793e98dc396aac5dcbd84874e36a689d3092cbd4cce100cc0e32c3ac3733929194fc4aa13e0024a236fcad2e4e55c9f84602edf445668226d15f3a3770c2d5f85a33421a2249a1d76c30838bc8742bdbae5cfb4ab99f5eac372409411eb6be2726f2a105b0268a50965fa34eeb12ead163586235a9c50dba923e3c7d87260fdd6e1beafa1cae908dfb5777b04d9fe7ecbba542878cf02059701b80fffe611d324454034b477ae2c7b268a57aafb000abc7b865e081221cdbef4204b450270a23caa9acd012f3a12a61c29ba7629adfbd3ffe2b1cb9fff9f6c2f9f74675e40297d3caac471a20cde85f7115196338860237c2bf86bed7cbc8945538748bef0bbe3403b636cb7d73829f1adfd91a7f26fa6d5b86e12665b8d52607943fec8111e6628e998ce1d181990b0eeb323da1dc338cf360f473e9e5cf9c2a7385ec36a65680f316fef7a026197c2e44622e68c4dcfe31d1e9077922930304dfee77a0673a547b736f27fb034a0100dba9d897f3f07dd3f24e318df6b67153f6e1eea0b92f33c2558822056c59376b0392d5ce26de30f3e86247a926ac7a28b936cd8fe9919b5e7f38f8d77f2f2bdf6ddbb46622abac61fb5c5b344d3a93e3dc6443f7da52e75c577247e477bf1fbeb8b183cd9f78dd2fdc9ae404c14e0690db167bb0c22532d09ed1e31091edc7f78a918d61a4d9cb03d8ff248f71b80eae56973430e45f60ac164e141f605fdafd5538b005ee4e153a248f47192b712e6b4f1ceb23d7a1b7f5f3167a1ca4860caa2749b3709b5f2f5cf2de863303d6ba82fc8ded3b7439f0991b013e337647379adfbb1dbe76811800b67f3cd3cf0aaa9d7e6442c3f425c0abe942984e76982683d1972e29507acbddf103721806141ad366e903554d83d4cf22fa1783cfb4f3a217d4f8c08725bb9525a189b1b93804f1ab704362c94217654a2f1b629313ff3fd18e62c8878eb6445cf1e778ac4926f404730f3d431027e63ff487311d8c05acad12e4b76eb81494e11d79f4adb5c151f2fca6b054e57ae8658fad02c38ffa3c1a049aa892745ff2ac49c77adfaf3e077fabe31a6d136cc924e3360db5d95b962cd13e18e978bdb763aa3fc1bb0ab25ad1eeaf933c3c2db170d3e79228ac4bf0ec8ccbac190a02b6354710e3860601c064923611ce56cd76c1338bd65a5c0983a4704e988907197717f503df32fc9a45930769430eae52508be0a6431b32739ae4202b53cd05694231d0b54d1f850b3350c2252c94808b20a96b705d6ce30a8fc9653f7beabf1a930eb4bda57322a8943686c222bb08ee79411704ebb24cb945039e80c82d34610b8f818b4a0d11bb435dcb986123c4282282671add6944f96e4f2216c2bbe1131ba4187584c3cf76277e1119a47e9b83fb2aa3d179d99f25ad68e7339e765e6d50116f1162c399cf8c94b9efbb939f5884a32209c30a98d5a5319c6b4b2a3bb71650da8e5f6705e65e33fd27bae5f76658b2b157bad047f6f6e4afd39cea3ff8fafb4470053881dad63cdac1e48220cf38cadb50e512955345f8e84d54a2511bd7a486e42485ddeeafb2009fda070ad2cd2fe834194c392651a5e0da1228b5bfdb63c5c7fd76c15859de761d38ae634aed373188bc484e451b01ae613865e07fb1f129083af347def678d0a8cb197e67ce67b058c6f61edfe5178dd955cad913e30ec75c2d208fa79c38a5cc5dac9378fc9fc1887f2438da28e8a345c53063c18583ecf99cf5876262c5856f5d9d2cb5645144507c43866890f965c4b639fc7daaa2393d3b37f8712ee39e0024a5da8d7195a34ddf532a93eeb6213f2c8cfcd3a87ea4beddc156b2fb115d19ae8f30362827c65d4b41406edc4ceb231bf6c6b8a50a42400c79866380afed0cd1174ac83ab631f2c02724c781162113f459f000c4413ff23f745a0b90f2a533f1b9b4f34585fa7350011a63b72cf832ffd4dfc51a6fd74de89ac165181a06b99e1f4c408c63cbca897b4fc70249cc84f5dc60f196ed9205a735634f32b128e62d11a6e4b3218ec84ac8e99a394bba6eb3d73239431a64bce3e6d9bbfe6d6f8881d22d6f2b3faf02aaad7c2b5607535112ddbf1fdb26ccf35fa6fa5cfbd22767e7a18f100f8c229be6a1d5af1dedca42c032ea8b0ca905cd21d6eb569205d804019ca37dbd939f39e4a0cc0eb32a49e8fb09bebf40976bf41a274e09045b8893e183f3cb00c626a5c62a639a4b78257f4ae01d7f3977fccdd694419b98956894ecc899eb66b45489c806b971205ab30c932850b4012884de463a78bd13ca336362b5e57c783be97d7ebfacc5f89d9d8329ee8b95670162443d6bfe9942322afa2c45b1c35dfe534eae7dab869cba2fd6fa42d37307a70ecf8691eec1f79ad96b04fa56816e2a136152d6d6dcf38876f0fcec7a98a961488560bd333526b8bad9bcd157e76d95b613ddf1ad21b3b18a37c3870fd769a8bfd22a0a02a187d1f7625b50163d8b068f205eaa15d7808389325bd8904f1f25bce2c50e7fef124478593327f6f0305838569a5fbe43f9bd05e3155c67b9766e799d8c66434ca1734c2b6c09255b414ff2d9168bafb91aa8be4e97884f6083fb6b2483eddcd8814c111c606377b223c086c465007c8c2093e66d2c32887d639e8fcb26d1a2e8f63234dd9cc2ad226e254e0ea8b98cff6d3c4fe7e66502a665a2cbc56bda62e07f4c126e01f41403dc8f6ca6265b18c2cdfdf246bd93f29a57b3776e981f7443f12daa86dcf62b3f92f8a8cf1ece48ba9de48522773018fd8d96809d9295baf3c080d0423ed48ffc11aa93df0e150d4916b700a7e1a0689b7ac8e06a62219f675d7ca1cecfc9df0cffb0a04cfe2d2493936758e59413eeb2790005e58b68413699c83d4674061765714ed80174377f249b3fff1df3c6c3f0c49d8fcb0f37f88951517e23582d02b209d467e619340f1ec087c6ece6d25d9eb3d6030f676a4ca67e220916cddd8526004c8ef1a22f4a4c923d4c87fb4e024b90f2201be94b13bb56b1352897ea25b7603a15c92a94e16904455654194cf5beaf8f556b273fa9b4af668b1659cc49d3014030a877ef538a6ecf4fede19326e28edd1fad39aee09da57ba81f20ae017f954be768b757c5b9a7f72fa205c259c6d9ff50f3e088c43031b689b58c4df2f9f7c7d7848250221b89179a6a3737cc30d8794714944d2e00cc8940d654cd22a3aa8e84831a3dbabfff7a02116d0f64c8d0d2dd7a61ac7a56a712735935be01348bab515e30d93f1b32bc73fecd35ce641faf30c5444109c8bb7d3472e2f5cca800aba523f9e8c536523bda7463f35cfb859217073ce57581fad84e3f46bd5ef01110ba8d72c7cc664f91d9ed6889440a67ddd6303e87110b8e2d74e91855d64809956e0d79e82777e5075ddc1cb7a2c8443d8a0a1b463c91f0892a1f23a87ae6ceab7a3eb17eaad9ed335f92283446bf0ef260cc762dbbb82a506f64a2a4b44dcbef6d23c63b78e16bf478d1a0ea6b60cc7c3e2a608caa5a8cd8340c14870de02a8940f1c0608d200c97ee9d961f5cddb01141628aa9a9854c2da7acccf849501af0046ac4f567e8db2267e2f1ded6b4c74316e926ba7f8a586306020f8d926afd9b2506a2706427b64646e661921fd97d4d7ed06d9f4b7d7f0138de0209223f0de31f15f5a2ac5fa6fc55071fa7f1b9397b7ea697615683b792e4e7de10f27d388c9a16e279f03aecaa47d3b99844ea66087f890e9ed90cca3c2de3e312a2b7c9dbfb29e44c0b490f5469b3e0298ad2fe8cdf1933f75ebae3d93dd248e600b0a8dda58af473a0ddb123b598036d3dc7dd4d329ceadce733d5b6dcd77b1a5a43f3807c145db7919d787b55b97783c0957fd7a1195cbb0ca15990ac9ee1f9b945bc2c27fba0171b34706eab81151a024dea83bc046eae09a3f0044c0dd74c15151a5e3e363efe706b2245bf17a221b2d68b65160313a9555975751202100d45f7bd65166c039180a6c75f94e4fbd0048086ab2c04f3a55f3b61d09e0d411fc72f7a4beddfb89b37c71928f3abaee48a171dec9392eb10703357e436c3a1892da68d8129efb5de82d1203f634927ddfee0f491f3c896e1ad07fc6c6764fc726757b2568682937d4537490db798c6e14d73d24d03c7a83a23fefe0e157ebfb43dcbd07b70d361d6c13dbd07632ec41ef63b33c444c2f407247009c0da48b37fddac530a5894a6cfb2c9b0fd4f11459507d87c7eaa5ee9df730d3ce20b2f4ed060d378c7b9f40006adf02b88266ff543d4dc9974187d6fed89332a0efd8c9621fe4c23a4314ccde5a2bfc6e29c22e88c73c14642cd3f4172d9ebf5bbed791fa6416a9ea708c902b350f3f568212bbd17dea8255d689dfa44a026a6ac1e356b9214a6c4fa9409aed49d3a8aca3054274627eb362911e137743925dc30df9a4d78158172adb5fce7152d6f106c74bba0bee35209d667fd71278401e33391c47b017300941fb71105fc4b7bb39cb2789ed653573a86655f134ba46ad47a6990360f9d6f957a0043da3e62c3e818d417c7c6ae819122c51cdc14729a155f4cbfd7c00fb3a6d4186c4664706e0f0e5f28ce1e97eab0fae7a0c6c989c76ee6821cce26984518a3146401485fb42c2146daa039a43941ae29e0b0dca453e704a9eade6bc92ab1346658faa11abf013b8095c9c1fa7c7f23a742e693d5ac2d0c0184f2fa552c052e3d53736ba438e2a73a18fc32bf33a6bbc58f8f11d0b1cf57674bc5deda0f0158bcc2ac16cffba7c6b9e59abc24c28c35755b32fd0146892e270fa5d4d6433c716b38319e1b20b2c3f60463411c7bbc80df6d6625e564a7fa812040df4d43781c05b53677d218d71b56d481959403beeeceebba618b9dc81550770e617f0860a4542a5d0659e01477fbe33e92f92e0b98004484dc8e79a0167bc7866e0700ae309ad137a0d3a0282f5afb0427ca346464d98f4416e60a6a23bdb1075dd60576a0f83b417a41b9dba92c43c87c01512b9b50377f1200ff17fc837876ead9a48e57fb9333159ade21c5f8851c1bcc1022bb593d87c4b91b24ee44500b4be59e417b8763f20aef38103bd958bc89175dd26a5828bdf99543ff06bb3f155c96aab306440feecafd04e5d9cb1c3e66419af81afe616938e0c6741d5c332b8134ed152a286dc901fef0935ed5e065eaa43fe647279653e21ca88f5ae9a3ac864a24c2d68dd3f70d6556158b756c3d280ad034f36c4856ba1fd24fb8aaca7bc979968c57df89adffcc232b7f928ff1185a6daaa258f18e1153019c463271a5261bea389ff358210240f4ca2b825e1f31a7965cdfd8f957c8d5bdd9dcb3292b7630f0aa0fd7e88682e798ca94cf504f848a59a8b10e66d5f06aa3e77ff961b777c33c011eb6d76e7f627e04f2918127c6faaa750099f46f495d7f109c004e2c1e4296e62b0728299320c07b30fdd7a52bccc4257af2dde38e49bc1d89914c3f3dbfcba8aa26aa46fbd8c53848ea6cd68cbc9814ddd8a07e134173ae0ae371f70ce2499839cf06246fc44c9578099501a19df2e2c8a66ee35c5aa9e7950f50ae3ada31c1203356e266b72d531dd4c3bb2dc475c03c7943f8ffb0929ce89c67d5c08d0fe5b5c4fbd17fb0a13b2b00f84f1536c789c5d86e38f0f0bffc1ad5a409ee09c0746b0ce71325a496d2146b50fdacdb91c6d8cbaf3dd19c657b61982f6e7b448d3a8f4be5017f0c89255c3367b46975966b495d82b2cfebc02c7539ada3fda2a812abe045e170cee41c892fd5dcdacf4979ed58e0bfb026fca71db57a5103757f74d2488882df1710a6b4b619f82533a4893afedffc879a6622b554a62def4b3bdc4f57d530d78e57f47c150b4e7956bccd1f6f369dae030cfeb866cf12334c2ca807db638df6655f67d149b9b2001a009e04231788fde00eb05219f9d6d4d990408fe150094b72272d36a37e06bf1f0eef81b2a78f83974216efaba625f6ae9d86ca0a66f839959b9957ab047bd564f7ad0dabbc536b02130b1dbd2c2a2394779026cead7b2b540714129589681fcf249b1b287ee525f17ab65df2dc2f6276138f9b27730008ee23d1b306bca2b8bf02a7eb0d3eb39fc94bd7129c1644923306bab5cc5a7a16d610c4b0ae280c2c83c04f9ed41ed2e7c2cb6611b78c4cd87615ca68b032f315dca473798bb6b497e8eb3a4925c572bbf47b895de60995680f76732e4e8a1b89802f1fcfcffc74a60396b87d35846113f48e7f7cb57f436a963a0758860cc53fddbbb50f71768e03585da27be1d991c313ecb4e4befb50e6cad1fc2477576afebf1f2152b708020878232eb4ef2702443b9459dbc16e055aa292a6f86516dafc5117ed98c1ea5f2ae5bb05a27ba8cb5ca9d8dccc6ad8d58b8c3f849f81f299224322f24bb681cd7e2e0a7ec64eb444531ed3bb0745362a3f06af2028170f004b876d1abed28e823171f85d2cbbddfb32415fc58c0232b0121dbe98a992321a971447d706beebe90a81c7683cdc3e1fb2b64c7537fe86f77ff5cf5d0d17496164e340c49b9e8ac0b53781c75a905a1f34b5d12db4129ed1414fabbb1cd1264b5b16ac19ba134c2a595788b18b2efb223526c4ad1b949f38a3398a36ccf4fa1c15e7a4229e38c2be03f2634a2eb85f43d2bab5630091883116422924913be98086a5ccf347f5843824d3d2300945cde8caf52b7b97e0fd5509dc4136f3e2750cd9c6fcdd250b423ce704b3a31bdfa8ad0f2dc9817fb80fc4ffb62c3179785f64264c2b8441c2f5fe3401345a254c6a4110122558a44d920b5850b919c50aefeb99880083057dfcac23ce1e20bb80df98af90588ac6ec16c29acc8d929c8d29f8490534276da8f78a9d9ee8bb1e873dfdf26e7f044dc296b299ae0a375fc012b0c14c6aa1465e57d3cead334b771db6369056e2d621e844839b5dc5c1f5983dcf9753b500160979990c75ea5c163f3f64fc7014efc54a247bfbe1b09c8a9e52a427c7e8f33590415f2011cd6f341a305678663100bf4bd07158371abd0b61a5fa3c991b11b5df5353eb75f48a5c17265d986a58cfa632df615211ccaab7d71876a19d1e50a7144a7299368c83f88e2e2457dc412a0f7ff7b733aa8fc15f38661f40c99508a187624964627a6c06dc40c51384b747793659a1083550c4edf9d88a7da7c67d56766737e13dd8ec911928982729c06a5d534ccfeb2b8b693eb0adf35434353ff0d2eb0f888148fd456aad769be5621f6840aa0ba7d6f692b13d4dce70c0416980aeb861ee8f56cc53efebe64e1aa49c4a264ca8e0a9b10cf0152399711e82e1addfc5def94b06b6b176322bafd9940926c4d063edbe6dccd49bc3d9f2ae816c03b0fd272cbe6d0658b11fcd0c7850108124f6608fab00374a6ba64af8b3360c134fbf52512d973cfac9f35585b319931c815264a09e0a44b436bdcee312c3760e029fe50190c5d339e2c77c100caca650c04b6490ba56638f72843fdaac6265e1f56ed21a53b287e14175bb7f86c611ac8fffa5c52bdb5e700cbc8f2164e328b0640d0e0650ede63e45d969d11aa26e5ec274551dfea9ceef908b65fa0bbd721ee4cb3c527d038466d8d224157c35708f8f03882500544d7b98873d61f73eadde04a56379c826c4338fb9e5fe40073dab34dec7c2ef67a228d92b8ca30ea81b77dbdef93df8c32bb0108169615dbe8fb74315193f9328423874bceeb6281feb8208ff3a52362ec4e10386068cb221cdd0a412647c21a30a9e46ea565f5fa0f4b0b2fbbaa553fa9a109493148d03f5b5b0b1d088c5630027bf9d65ec1dcbe030fa6af97633c46218576257ed248012330b6287ed3b8826a8abd66374d4fed5dc9ea354a63b3588e63f16b00e355e9e41bb06863c473ece542ea4a63c16795fccd66932f34b9b8e279d4ed4f80cb8c4a122eca4102e5dfdde3f1d480fa8718f637a75db426f6674557faa9f4de1a0da43066af2528cc2a90c510ff52a7016d9750e4011fc6397b368faccec4da6046d47d22a15fc11387314badebbf55174a5ec1963686baec6084770ab51165c01b9ddc90ac10fb9fcd5ff5c55b3ddf153dc06a38b475e8d79dd4f8142d8d126aa2cfb94d96036eca52d879a060d929563260c0f988d611a3cb500f232255ef8598df7574a442146d71804e91048dd8bf42d8e9a2e324050ff7008aaf05bcc33f69b40c0d27862c19b8cd4fa485e3de4d8fb9368ccefef13e2c2fabcc362bd7d82e555e0ef4bf4a758688e4b20af20c32cc9cfb9c9d2952fd00776a73c57fcd470ed5ad138efb20aa12c0045cd79aa0d0fb40f6f968623ed1d6678edba364957b3c007c0cbd08407f519b45218914019a8daa215750a16eb2d46bd75d4f1cfb0e1279f400ca12f4d745cd55945e2e8768562d8d9626abf2f1a47469283dcf4a00bdf16db16dae76ce5c97368b9a25664d0d39050332d7fedb1984e5c3b7cabeaa2cc1f251ff3d26460abfef8b3419d584399fcffa1a9ff7f9a580f78fd58d5ba20a344f76ce02da63ac87b4e7a8703fe451e9348bafe577a809c5f089b2e97ffb47fc92305f2efad22ecde158b1cb99b84f8b98087779895deeafdf1f7172d7ae86338bedf049be47b5a2beaaeeb51a57baf62404ed6b1e0098f7487b7195267341884ab89fe988e0edc5419689f114972bc5639cf3f38357e0166dbebe231a61f37137a3a6e3d408b239ffe0172ca1b44816fa89d829c184c54c70d8e4eadf828115ddd3bec145c7900e7062856286f3465369d951294e28a79f000033d9a35fc3e1e1894604ffa491adbd55f6bd5ac8e6fce346e92522337421406a8a81925de5abadb2aa3d299f66061f76038378212aece82dd341d7a3bc4ab60f3fed21da83de1cd66b286a03bff66838e4c0e3d994d72c58186897b8d3770bcef06cce342d091190cbd82dbf16e062df903c9a2228df4cca0110528e06083f34eed88f40fad5ed8119e1b413d54c8de7bc7be4ffde26c58999ce242f004b69dee5d190bf248c10dd9ed2dc776ab6764e97548e1c12ee3693dc3b4cb76c3e55f032b4081022219feefa684889e228f406e8dbb00e33856284b8b25463efeacb079d2e0f5622888e8fb6b86c90d5d9fa39e5bd0c27e70fcdd0055cae52cbe5051ce64e2e8ae76b249a60d32c2bb249b264e8f9a2feafcbe98e2efc5e4317085c384b8e84be2010cc0a41cf038f27ce8146cecccaef7f342bc03da623104075ec93cb6e3311b28e7f4e7a72f7429db5b71ab305c0c8d8c547237eb0b088169c03415c465382bf638051add130496d56fa90cdced7fa7c370b91306fa355eb1cabb180bbbe2573ce95a7876a8c36c1d1d91fa5f39769f3f07f70724d0933d040c5876b53447dfce2db28f71d97b8c164ae5a45d34a20b28797369969c2d5bc2b8874555dd550104a33e76d440709ef19198a7450beab0dc25c1b7da3e7bb81b5d3a73c3d88844b60e4451a937e65ff3507658441440f8f755b148f3d4ad9f3e2dd46f6d54e5eae754110d0dcdb5fff7e5cf37694d9c31bfdbb3a44218127aca872139bcc67dc7322a28ed8b41cf509f1dd15bf3f0717ae30f51098eb648ed28f85ff92423675fe7139174c53801422d2c4718050328910b542d76e1ff01d24bc4b09c2e8a1ec87b16e16c49e37e3b3bee405145d9e87c21f8a38b82359f492bd7a1c8e59315407a840acdcd765990f5fd5ae77deaf5eb595c384f29166b047e96bf1558eaeb01dd990bc94f43f38232e360c25820790d549966d5e111a3b2c0ae306f01b2b5e8eb2d16ab26aa326fc146dea7a853c204cef37db3d39c333d3528342178401a3f73d9157fab93cb318131868f9ee05eb4ff12ed98cb8f88fde44c0060a752b48f5d827115c591c4d1837a840ad3621c5696cca6a7e13888b7f1f25bba91d5235769ffcc7999d3bd999ebe1a07e6227a284504215c49ee34873a25eee1281d07f44102322aca0223ee188eac12c776490ef74f82004ede48338a015aaeb7dd348f68590174f31e59459899430b64a129467897b6fee00eee6008e4fb96ecbe02aacc1d6076a7bb65d556ef6288410ee9c52e8fb02ecac8da1beeb8aaf6ca68104fd721bad981a17f27912b5aeb3e9073b10e29795a0ee47443ebdc82cea156f551f2d7448346270a22e3a587b5dcf1340a69d489dfb3794da716b75361998feb5637b51dea229e127afb1f90a3c82d7bb73ebd9490094cc8355b5377f436f88ae3605095a92f796b484bbd0b9b808cefcf23a5db7469352ca0b1ca12c74fa7abb32c03674c32fe75c90be47caf3d9193f2bd893883b43e18ccc7a9138fd2a4d2b8437b305a42d99f5bc6f03421f871f80ea8c145cf81a795245eeb8293d64b07f0e529c186b77843932681e697ed2f50b0ba26bc2d56fda04bf7eeaa394b6904800ac8820537abf1881346534eb7ab13c1c4d5291fd087c03201f1067da8309ff947dd6d4a3b5a6ec1b6f711cf0e9afde408840d34ce17c144ba035a6d4b7a55a1be40cb6a5919a13c8d43cfbed4261290440647984571467576dddb812161e27a14d9d9b59dd7f1633802a86ab3d24670a79d2207f35b5cbe4665e3e66b39d137adfcc7d437e37ba02014fa6b06488af2a5c84cd803b9839ae89cacc4450c1e675313a7c22e54ae1042596b3f14db22e1ee623fd1c12e7de219b295dc6447353555fd8c2ed804d64364fc14b48f860d88f70c5effd8e8c1ae859f893ea3a40e55aab6950215ca05b6942ddfc0ec8a76790c12c719af44869fe695dbe4669dd98bc6b9f9ae2bcd4ce07d16c7f3d6cb6a39a5a4e01f061296d7e5dfa17b87a3c089999f84b7412cb8d40020b96abd6ba78406043c03b83f0947614fc92f409e17a920440e792df5d9e1f32dbeae59af7edfc742f1cc93c7289a75cb29eaab5cda84c00971fe5609ad9b87a592d94af7339dc6fea43782e80f70a566ed0c20e15ff64a82c858244da2e925219abbfefc8b32d38e9fff1d5d050c5182bf35ca02cc3bff81701fffc577aff10a8bd6ea08d6284bce97ca46b3c85c352d24cb71956c977172d83e25776b52884e81ed16c91fb1f674f152264ca2b5d68303441216a3cac22fa94a8c9a9f3525072bc84f39b29257512e599d200925cbfff382f5bbe0eb266acc71e6f2a01864ae1773db11c70a9fc18f3b2987a7f04d1e5568981ab6f38c5a8290379f42f12251b0413fcaaf6921ee619dd71c4d341e61a419db349c49b53449edece39e1ecd8e94801a74f3a5b3046389eccf1603c171415601d2638dd4a8c9d57a818225e670a636c59b3ae7a241eeb00dbc42d0b56134eaaa4c53b5b6709e686d96f5083d9e56f89a14d3f765bd15f4215c62f207e0aa8949332999995db65af8c79f11f6d76a991ad18ee7d924fa7aca8a5caa583eca42acd6f4a869a52a698fbf6c404fec62b3e34ff3ef7a8bac170c57dc6b0d47272be8e0a56516589f86626fcf1629521ff6e40a0163728ae5ae0ec1026c330b32e590301e97329b1f3befc4001b6b25c0c83c8d20f781108e9d45d87166efd650c3b958f5e0f6de78d7d8dcb95a6528f9a7862bec0a5b36e5fb2983b4dac5f625ed8b753c740a853affe44c2e2b1145dc1aa4162aed997d4fb7f20615fa819c6af620de07d269d56f8a3ff657eb9bf1724afa0b1f8cb6f50c7112257e7bc97e70fdca784844449872f9045424d3e07bfe62a31b3002f2324748a0b241482a1849cfef0041bc6176a713bdbfee73ef24e3bacccdcdd86a76a1b437f52be165f6d1b7bb53a2339d4f0cc6bd2c44610a0625c186bcb7a1d40955a82c00811d82f275982123b3f8d3308fab076a7d98c7ff461641ec14e9967406fa3ac18ab698d59d803be8374d7c85f9d15647c6f0abff1a7266a811aa8354de5eea02c36cbcb275bbaea0a4ea5e8f5ba3daf770d465e5e8f79537b34d06c19116e3e52a5cf7e642c00488e6337f335e21fd909972e906298cef34246edbd626326f202ec1c83ba46bd345a8c740923d490677b22709cdb5cd442de333501e53716f22c6a10b183b8d7b3c6e9baa8558360efa5953646222e02051535bd68accc12084ee6ab12d5d2bf727316e85893ba1fcf518194f1ca593ddce19d5a179d9a32e4eccdcbd3a36793a885fa458bdcff72b7ef21882658cde707b86a156becc6335ac0455b58cfbfeddb9c9790364c8687400a581da9b78bce6ea20f6dec3f59663cc2e460ab0cecf4850abddb526fd40c3eb4077a0431b1bfa8d4c34f827a86c794162da009082217d585339c3ac1083fc866a93b5bb17123be71652696c15a3ac4e8882dd736d598c83317ee1036757491c8dd10afecc07ab486739e02334d6557f39b511c781a3468eed01239238d4384856ed8bffdd899035c614ae1df5885b26d619293c3d7a673db7c20d8a3606522816d60bc2b4e59d09d3f2a12de9074967a4b247c0a9cd0e67d49843658896655aa1ccc4a3343317beba560f292202742f3e25097b87eacc615acae3cd5c8c2ee1e251cda01ba7413d3f68280a824e489bdead6de8896d8213a72414288a6c49a58e8cfe2c774ede651af465741e4acf91fa478fc9c235d1cdadf66707497cc6fbb1b17fe944f37219bd5e4b5ad050871415e3a3a4454dc1ad3162a3a747b7d02f75899ee87eff995e512474a3fed67ea82494e16d5f177e488dfa6c7a373c4d0f30f7bee6b507442f0816a998906f5a8fb041259ab5824210341fa3bb6a3c14f9e2e0fbedba11c552645c1c768edfd6ca5fbb84c89c29d8406436b7c1b3f6a8126b7c56b2748345d85c46638fcc6fac8f23aa90b54baa65b6e2d4b21766ae6a4d476d5c81b70d6a1cc1cec0db271c10872f0f490a5233529751830786c5fcd55c39a16d9b1659e40f928e4ca12a6ef9b6ff3b1fcb1321d0b07842a24436e0860f215aac3dca13362f143dab877c999501eea7586de82291fadca28ec45a322efa59155fe3dc00e74c9b90b4519ef112eafc348fb6eb599c556303d12bc4e5b550b896f40e6658408e4655441deb7de8138d9e564c27cfbb61e68b05d98b7049fb323f197358e1cb9a72f1b991f1ca8bb568553d3711c82405b846e5e35034473926d0bb03d4a6740c2081aa1d47cce64a6aed6ea420a5557495b5243de14e038c5c6c1a1c21a3e6910c5b481b5efbe3b0ac2aa0e0e4ca4876482ae106ce331547ef7169116245954b93ebf3a909a1f62f2e9d31f6c57ccbae1cfd16899f41d5c9c4f31ad3b15980f17d7d81a30553d49c380ff5f29c15eee443d036d638eb91d72f45615737a9320e8ef3a1a9f4b0ebc06f5effbffcd5cc415ed55ecbab8a434e65cd5f9c1d599051382579a4dee692dc70aa328db7af9f922357e1c526fc821534ac78c17cb3b8559f499c002fb561556b5154105cddbe19167a6315065679302fbb4a02c5fc73837364e9c9d894b6166ee85da04c0263d55f073a7c24ae2f20954bca4b35d3ee4bf2ee64a1bc99dd84819621778976819a753a1d448e663542bcdd523d0d3f4f8a4afab916b117ff654f58ab74614cb0177522dce9032be06ce7b053ad33d97e735604fc0eb8774db529ebe8184c7a973cff2c4bd33d97c9c084e6500df46df42e269cc42ea92fc639ca8f9a2fd542320fd70128f6475206da65c72e4e4d9bc722eb41977b850b78558d3168fb39d839e530e745b6d57b5d92515b3ec830f2c60a8edbc095c5e355656c399be06585e920195305ffd7d7b52180436d180605f0a90f743c198705ab94ffafffa63613c0cc28f202dd26b7ea523867726f52accfd0b99e47a7258439445456276b7076dae9520ab86aa3341e0762d0c2e8c03c76a7cb4b6e129a74af57b5054252398dc7a545be361a2c7a0f5c9738beb24224194616a71a9db3283d738f26378cd31244b6dc7f9d666b0b5240b76b564b3e6cc8db24e93547bbecde481a70fd1ef7a34113d28f10d8523202c08d843fab38af7f35042399ea670dc81a130ac9a67feddf088791e02b8078938ddcf46435fbf2558c4111381e84da1784e901daa8a1fe74d8f9618c062de535e6452930c85ee74b3f9dc7fb5a241f2b39459ef63872aa194bcbdab0969f27677a2b7211794184b82b25aee361552bcf556344b3c0a56e5c3ecbe7d64386e302fede598868ce1c331c7bfe6bb0458797fa827e84ae0979ec8bd89ca122ace5158be28ec8ca0f306e148ade69b8408ccad3bf408d4f09dcb531e8f31f597966d0eee7bb9d5ae79781078433637dc697530e809c3f582bfa8458dd393139a1c813bce0af6aaff21de5097f0e55a9111230e5677b2528c499cf42b40c396ad69605e340b59639d2e24142a750fc40f20edd4becb87d0c104e816d79315dfa38b8d616c8e7fed52417049588b0d6d7afc296872524f13a67cfbe4487e2eb895db558c5639a5c4342755f45d6ad4b6feda9263d20811644bf01dd764a346e786db21649aed61ac589d5c3ad311321eed00d4a77b4933459c9b60138680a6f90a11be9460f3c8022b2a3242389ae4a29eea48da30d7446e222fc11ac143d749ebba1351d3beb7e4f2f12f95d89cae95c5589e5825d5a331c245407a51f51e13a313c8605be6b1d2ec9926a7435e460a0b50d02cfb51642d7d4f5b7317552e9b12ab17293fbf3561f69071866e3aec3db76f2aebe27678d7fea154e23c6ae50cd85594c6a291aa4a0f4ae08687bb35451551a9380434d53375f6502a134788b540553871d827ac7d584a5919f042d8b6cfe4856d300d3928b54bebc61d9ea38a25ce9b0ddf19dffa93b93e682456b3123d3cc99c7e8bfa9c22fdb7649aa33690079c25111421409290f212d2ec8a85be7171bdfcd1b6c8e25d95e1673042dfef523690901e84c8587a39768c8a883044c97c5d2ed60d49b366b3f59469b4fc29cf973b766690cb4bb22a5f7de8dce0b99faad4b29ae58fb7c26b11c54ae064f6b072dc618b8814008042bc00b40722360c0cecdee3437f82f798109b3618ecdad099fdaf56308d7e1c9717339719a45871a3b0d7e1eb3ca9f180c1ebf8cd5f09e91114e1fcfe43b1b6807366a4d9a3efc28113bd7887a1210be4c48fd46a7ce5e21f06a4e89c627470e648552db9bde4db3d590968013aa656b3211d1386f912ce40241f022d86b47bad800f355946b348295f7f721776eb02b1ce6a637404d4f6e1c71fbc722f2381a88da9e00a2128da6668f8a65bc06083e146ca6764c7b82d3e241baeeb2dcdbedba7726dc4d3e581d4d197df88f268baa05e42a30381ad56d63f848466d918f9611e10609f8e96ddfb77e49d0281cadb57364cad806d47f3d0e16ceead5990cf579bc208ed8409fe20089ee01c9ed625bb9aa92f6f621567784a02a5cac86be58d752079fcdee5c02b8f686637bf8612ef5d0d252caeb0d38bd78afb590cefa3161c86b749c8cfab9373f883b85f089f025f3856577258ffb088ffdf6cdecea54cda7c2adb2daeb4a75200cfd3232045c2ab1d74d6b287419a9f2568fa311c1d65d3b9c8a048063e2c4681bfd4184cff8b1df591a033a6c48eb0494e800bb843b90c65dfa013cf47a946a28ba050a02515556756e54397375329f911565b5621d092b6b853ab1444b0657c37329fc755a443a68ac0e7682f911dacf5e02609d0731c34e3d8cd196916b0d543d09153f7397048b7d9405c6ccbc01d4892295372db9124e993c61371f654be8317e44f66590e8e9522c74fb9c06f9729d760e93989529ac2cb6a49620097f1ca13bf3d82726b95e428d087ef3a15737553a11bf47cf540d82c4215e61dfcaa9eaed19b5ca81cde397cc4a843af7bef710e1095c3ec681e5b3d4a2d3a87313f8ad1b25678d836aff05f37c6e0d74fdcff34bce2433fe07879fdb99a45f4ee62bd85b11952cc3b0ab9eadd6e55aba07dd2631c1f1ecdc65ddcec7d1dd8171b67fb996547c455945c24c798e719ec8c90b108316448089c3a1bc7093fa412bf4350001e9aa2604c59e4a50dd77d1829593e9d117a8295121a527ec7412640d01a861ac963113c10d44dc6203fd8e9cc67f7de6098089e32a5a93f88675758ee021b4f2584861e88e1895ca08a232ea39a6f241c50f3788f69b01edd8d595218f70456989ecb011208f437070c5b357385f9bafe8aac2a4b7545ab4b4a470f4573e66c65408133277cc008eaf0c94d43992477bcfdb0c32b6090134ceef586cbb01c0606920f6673b0cc52ac2d7e5cc3331528ab314e38860b6e9ad316f1fb4a2392e2f537392b7e2b7eb7ea35e1038d9ae94531745512f3b7ad291f1d9dacecaa555e8b459d8a72678c58d36e921c6c81a4a7d14a1aa5d1b3f7dd5a0b09bf90a970314db8a892095c253e274ff51fa29a637c7030c2addc6ffe7141746700d6a4e409aa87364211a08536719b2511f29e4d1429574b0c3f74bd4cf6d2aa55f9a6f943e6a95e3f3a2155c8a4aa396b91c92381b30eae2727ec86613f8b6130853637c0f1f58fb75ed90857c9dd0a1aa62b82bfcc233ec763ac6e5b9cba312f076b80c37c368b89a39a419c763faef82fb45ec0632766a78d653e083efd4a9be41dab1b9d0b1f3476387b39f2d905c1280a610dcbc4e2a9bd6d1a9f81f59abfbfeb05cd06bc493a5969f96dd862eb5667b3136a00c2319c67776db427ed034edfaf4a2b564c03bb569c6094d3e40f52d88a20778264718472b7ff583ded5970998b68d5a6f2b7e88fcd693b0d0602dfd193d50a950cd4a94d9426554c6ba6d3af9ffcad937a4faa2c332d7fd75f034a4636d240ff08250d1e4f761fde497437591e047fb7510f617e9b7f34c80367a3b7332a0e86115b75f0f92d2a73f3d77b68144c1cfbf0c140286bc132a49a7aee04a8f5eb2b16d566da6460306a681d373d36c2c4d740209de66264d9d5e9f114edb5d25dcbca37e2e6529f1972d5072fe9fb6b1951bec518bfd9b28c5e8d62d0d267c888b9f305c801240e2409d1fe4ab13c0c6b9335a5f1b4aeaaa312f393543bd898dc216efeb4db5fb89e6b3a5b598783a26b847b30cda25f914f2902bc73b362c2430f8292fab4eae15e648d54932816056fc31093e45da6d251bd6b33a2ef3b8a97883cafcd896f94ece3a19e38bf2d8551c464249bb473896bfcc22409b5e3f7f31876ce8ec353abb9eb5d6f149bc49f97b0642597e3ab52a4603c17bdc03dd66733f0b026b8134f0e703c3338c0e77e1c6d20cf5d5661224fd46a0d31b02658b892ea98ab50f0065e1f22843b3ab9faa77ce643e51925c64b078e92457924ee187f85b7dd18ab9658bbbec3026b036cf90349297f645e9e5d0be3a67e13ba3c2865040920d23de2001304a76535d8a6484d6dadbd7192bccf0ffc6f21b29c675bd91ddfd2141c69b34f6bdef80128c3ae35726624ee96cb977303489c41a4c3600cd3b81359ae71ab619300184f8f72e45b1194593ec90a69506d5f774f3721125b8acc71d8946d7d31a06ea86306160a1f275507390c594a89c4ddc1263065cc4f08efcbcefbc64da59ef5de6d7c7c4c77724f18488b8a34765ea679102cfd84d8945a94a29108ad8f826219e8fbbfc5c45d029c7066ab779f68959b664a9f273a819a2acc2089227a7411bd3f8a365a212170ce5b216eb413669c2722f8246e3441e127920e60fcb2ef620d4c6cf265134b346865a7a19a71ff1aa2645d026186b2c0a0ed7abaef81b6059d5a64c27b7551262b1ed9b50e3e11d33e2ecaf95afc9c24d1af0f76c7fd0bc28e9362bf282d306d5ade0ea8bff375cd45f761978ba7f50cc2feb026d0eca3a0d69fecc1aeed91ae89c2a2df5297ab309c60158c0ed1ddd752faa2832c18051d0e69af2a538205f594007f8a1bb9a1a6d8067c07a20f0202fb6acad44851c23078b8eb3159cde5dc76655eee8dba85a25a814193cda6cb3064e025fef661feb70e5cb89ed16430407ff24c22aaa7b6246bf621b227350eae50e75f70d7e1a059b52ff9b68affd6628fbd02f167d77ff6c32e25d44a3aa66d10fdfe66d0d1809f7643f1897c935bba1129bde5964a1921c4791007fa6ac0de8d7b54bd05ee6baaf63d238c350e7f63f3197f2af70722a5e540b4b2bc545d49a86d3381f8b8985ff53efb5ab8fd077383a5ac9b1606d17a39a79875cadac81639615e38ea69dc81ce3876e38cf4aa90e899dacdf6c6f64bbeb14d7b79f65de9b4763c12c1968d8d5bdbde7e852a43993588e47a7f5473174a62c89fc5432b69e4fac84c7bd91213b70014af0bc92329447e817655b1b51c689377a680c92f56cc9307272d3acf2e8f10300da4d1985f9989c7464b138bc97dfedb33282f722b7946e4f54bc98e516b364b9ba1d36290c0e6942d1c8aed6ec0ef459c989c753d0997f66cb56acff0c9a773ac90eb5bf658c479e6e826b779d69b57653088a48c3d06c852c927ae6bfe779b62ff862cc5b2e2edbfbba7a51f2d96552ad999548dd8145957e01916cec110723dc4c8398c2130874915e100a180f6c5b9212e97f9a57be3ba111ebed29b4fb074fa1ee68e724b2e57d06b959bb53ed6cd374671f41f3d36b5dd0f554be2d16a5641f8eeb87b39fa6d7d60c33ccc65256de8afc5b4bb9b6b1ee41e45e32ad7497ef36a62345ee65cbc809259c514ba664465c7051e970f8c485d06995939a9f3ab523b80042d7f9032cedc0af72fb18121561a3b023f7641745941c68c9a335f1011b961e48009c065aad951304f217d3c538e1cc0fec4189622a8cd80e08c70dfe4b89f6f99b1de7a8e8db3067a8dd866055a1c34f3a7756616f32a42e8742cdd3341b907ecad69e0527e079b332e4782bc4c751b617c4b966c9569df6cbef999ae5a748d01ded8cc7700e99ee3887c53c2b8a36c46e7af780d7a18b1e22ce8b45fbd135ba8fb7765e11406c4e344924e905d08fabf7f40d0d6e218f9069172718c6a3e92e8622fa040b9afc14e67ac12f642c2379083186d7aabd95db25972dd28b6fd4d396337f3e47c68fd8925e75be7599f58701fffba74caf63d654b547f95852b9c29f4a1a525f82c1301ee5e8342e3b946ae2708babcd4891b5872a6fb03b2cb3b61b9005a10c2313fd944c1d7ad60112190a4340ceb2f918592130ae36d4387ae5f058c6adfcca49b9d47f04beb8d1541149e65e7b5619635343d54921c879788c4fe49d34389dca05f50cec8cae0b9567f2889f4d63628d4469de1849eede5f11c0375004ba02da1ac587cfb2ed74d7600472a99a7d0a95e8e69963c04821295331fe49cd16a681958ee54059a2e173f814bc4e9c0ade75951f020a76ee9e25504ad4f63df49de865e1843ba15e027bd334027b283526e0a57026c05a0d629576c0257c0bea77f75800da82ce1f99cc7afea2a5d397beb20384a3e52746353faae7337c035472175bd2619020fdfbc9f19eef60f1e6a01fda4169c0ed7b667ea2e83631e46607c53fc3b6dfea1641b2708fe59ee43a879a564e4c7e9c18f6f3bf7333723191ca826f6dc98e680898567347d21cbae2ff83587ec9cccb4d82c4a445f7b9782e887dc2854f5d2cf3472239ae69b287687cc5199fbadd0c0afe24ff44e9dbe35f20f72c116b185e845d3daeae0c4083290c34423bc977cacbe8c2f9eb0580fd410cd2a2262aed152f681758054a51c70930a25a0be184c6975af0e2d0e00a154732e3b8027aff2b972dc38000871bb523b40c8868ad7884665f30c894264f2a25f3df746869cf646cbb97bec08fc6a674f800afce5e0ed169fdb53736979caa69d9c1fab63449ee59a64501cd1d073aa18bd248aded80c89aa8b5649cd01c7d12b968e80c9e106dfc263add9e2724200a59b5158cbd20832f4c18829b8c13c9910f4d35ca6a2701f2bd3e490bbcb6f1142be44da972010f560b058107cb8a38d358a5fcd717bf17e09952c82dc639c273f938ada0f1a9296eb895c2b43b1a7cd299294a3ed195ea4d7590bed9bce7d517071c7adfabbb93e8a0091f79b84de97bc7b618a06f9752278a486fa4e80a47a33a02767542eb3fc7b64ae397a2b621d9120a389f284f58df17765547272b6c68d698d5a4aaff17cf081d65c5022cdf63ec4d9b4c44c4354bdcb1f4afc28e70c06167c8e10b86ebe69563992d97f0bb2f40a6bb08300cd68e986bc401d55bcbc55a7ca2e78587df05b18463fc38216990baf844b3495f8a83169d71649dfdaed0b797a6f830fd19f3f1be95a6eb5b3c6afaeb8e76f25f50f5d7239b45ad35817723c86b4e14c18f39683fd8310f2bc9b2ea94611a8d7c1fd8c82130fe1ea3f328be9ebf8ad356e0d2cfc04b6414c80def848073d068cb96ff4eacc21b5d222993c786d18fa5f5b5ede195bdbf2c7953f82c5b7ce1d0a1f5f7a68638fceab8b0a9fe619b9b7a8067e98318f923853e9b0522497dd68007724805a56d25f551cac711d18be1e59a1d4801918a46345ea5d09c4544c4b01c9ba6b738c44febbbd8028e5211852cc85c61957a6424ee9555a803adb5a1e768523f19ef5e2122f753190ce7dc983c03b24d2442c2bec6ef59326b3cb145ab2b0a5386301b9c185ee127e32c4ce41ebac9153bc06b6dbea8260e2d664168a5b8972ea889a308516913e4b3f2ecdda48f0148b14cf5b3b2683deb96dbcb8447aa41b98de0719c91c214041104a0270b31373ef2230aef6440e5164e1c6eaac09610b42c11cc43196b2d6b686307874439c47492d32bd7adf10582812491c7a860fa02b21379f1d55a1da3292d879ebef73cfc017b1b47c8dc29aaf20f771a68780c0206ccab73398a374edd6afeddb389795bb783ef4580b96fc1c0218dd4fd8a2228d300e42c36c2c3fc718e52fd5cd7e96fe200dddcf700c926f83a8e68b4f2131ae85fa14dbf9f52c84187a63406d417b625bdc5b6b081fc0e66eb3a621faeeee1599e8a618627fdca7e2274bcafec36950b23029e8ce3829934e6aa167f71e093ae7f85c2a978786726824f701a749af20f8016105c5e0f88358d89744543a47a8895a413bf093d3ec3ab8c36609d6ab5631a8953bb686ec6e7b0f95447a5b702de855b91eba6c3967c30d84eccebd640095f872f175731bcf52b5221cf4b7bb0b15a09ee29874c3859d595e75da867095019beca43f968592c8aaac76b34e5300eeadeab54dbe05dee39e1594f802f918d3dedbc32969e33b5a01d592051a2e5ec43e24b6733abe8c4f31862cbe380fcc396bf3645c5c8e82593fdd3649d0fa3a0775c2408e520ae22f56ed5143c0199944f0ef46200d11ee0b1b590bb318587eea5eaf599850a7ffa992e68a8ea8a1b4a15679662390528c803e6c8a2bf7a66e60b38b436c9a41745c285796e70c0c1aed1c25b7753d4e2d792d077e6b435b1e3812e9f2bc377eaeaff448128891d512577f7c3e9751d205be54f787819e19e78959302d6aa313c4d500238c5df8aad9c3e73080e1512dc45cc688d32d4d486dd516823f682aca9e4fd4a33456e5fc59f8cb94c2c1c8dc11e88f8c20018d40705ee029701471a261ec85761c9fe2c34cc126a300b1c86b0e0fc5d2ef96f20cff209fa34635f8f67e1dfb6f97eea1a5e96e7ab0d8dbbd5c887fcb69c61b90cda70048152c6abc9091c1ec7d93cab0763e31e387799d77da8ad005a53b2f9879592a0bb53904f9f2959e0e112249c42e420a734420d5e0579068814e47e3edfe47391321475a1e496818419faae6cc07553df5334c54614e64fce93884a469511bd1294d609d095ca255bfb348ed5eafa8eda9aca12317f90eb42d4ee82a2a2e49f002d7da84ad5df1c5da7e8e6ac3325f93faa9da170403335c8c7e8a81bc5f4ba9da67ecee4da7e52f0ae5caa238a9c47646e93851249315bc9b09e3a31a9244260b5fac3fc8375bc57e5e7597bc1b69e4821044f80574aeb39d64b2ca371e6672625e5d870953f1f02103dcd95ea8c61632caac068dcaef4b987454f01589fe130168d13764a788994e2d1e8d21babb5fefcaa771714f337be3b21a7024f9ff3d35881fb6971034146ab53d0554df678472e6db664e6a4cd643a47190912eba20872496da7f4d312e2c9ac48557094ae9312471938188df3897c9df254b77eb0cbff8bd489edbc27a4e39690c18c058c0c5ab210ee211ebd2fcb34824b1d549c5f2aad851b4d5c1ec06cd0077541df226b1e130ea2bbdbbc63fe88c89b24f70966ab1dfce39bb87da026a67ff49a906dd409f6337df8fc462147e6fba9574b75b5e8de48722304541881536c5aadad8337e39249edf90bb8e416913e523499183d2f7a4b0c1ef04b603731d8c90512c2213db07ec4f84e82812ff046c7329a335aecc78982f6e58bcc71bc32bfd8766154b10e2c3d17a7f20dd79179c8490d8837351d026ef36feb0da7d478e0ac42f1b4ca9547b5f212536903c70a62249d9a9ed296d8088d23da3ed8a990868b924c1c6a48c89c15bdae2592fbba75e1bf222243a58896d9f67e3e89590a27cae9e28b4c54ae2d9b6bcce1d85acdecfb89d785ca8f4a635e5c159ef5a5166f95b4c6c08c17531f5fcbf3f0d616f1dd75dfe36a44ae625e0c25008fdc3bc7166f9707234fc9233de2c592f062cb734f80e5b52f318ed56bd9d5f347a502d24b73ba40b175c56c8d993d4966bcc1ac38ce47145e7c8050b8275923773ccef650487f00ce08fb92b5aacf1020535f39c5d4a8f2dcd0bea8a5d455fbce8a2fdfcb1bd82e53d8992d56efa2b7ad8a7dc1caad28940583108af805c7ffa18544739d2b1183b01a71ca9d0fe3af02759c48f96b610facb5d76ecf74fe13b377eaf191ca3c1ecc12fa1c0199483e3345e496889472a6b79558227ca117cac980dcc575ea7c197a394713b36f3c31f7eba3631b8b1dc881cca6949f23f9cdbcddb3a6d99224ebdc9fa8ab20e75f8de8fd9c257ce6f65c6926e80719fab1274922da6e9a629ecb3cc1ea1fadb07a0c715af8033b63ae40344bd1ec638aa538b161ad5258a5698f2e766c0c87ecd77b6e1b068870c644030e0ab3611c362a0520c82a2f1cfcc4e7fc20b1816f4d65357cc56347d030095e9506caa3baf985d913743d7f6f07f29ccf6f819b5fb39e92f73cb30fc55f402b5de122dd46854d2bfbeb39e4df71291d81ec830844f865c11e77604cd0671642f503ae50726ec5ea45f1416bfa439b3b748032e8a2a341bd2fc177daf3f01a3a5fc2cebff94706906fc64d10902407a4ffff5d12594e4ecd07228369c0400f0c7a90e6efc2e79371da57b16f28ca10a56eaab1f137a7758607c627ff596212d1ee8612fe631ce1981ce51d5e5e2fc809f5c26070f0217d51301da13fd5f2a4a79b239f5d8d8c8f5139108f351e68c5af6d76f3fb4dd2dacfbd45f595f6c9cb51ac18dd847e58e4aa7837b71ba187edd6b7fd9eab2b66c7a3182df276169e1010c80d9c21b900d623c3e2e106ad9319d505404d1efff32ca27938796df25988f6d117f5ff828e543267f2a3786109e1750050581408d00131b57dac715328fa6a6c2c350028a2ee6c4c6bdbbb76fe2221bcf568968d179ed7bd23f2952746264c2892d25a613bad2ad725461bec71aa0c6d52381624ff8c9a007b2737074b7bf6fdea37a8083d10b1ae583e14393183394d934b51104ca73ee5a4dab7a3b62a8932e3f7525701792d3b07df103c3a6b4edf0a76123cf1fdb5f481765b6e69865990ec0ca0a61d3856e701b70de195a33fd0560068ffdcbe30caf901f8c34622e77030f1360b9da68cdd716607b4b63367c67b8b11f3f4a91c04077b6013a9fe338eaa70d7efdbd1e079f9b2734d01994a0c5a0e2d59c1ee37730bc8359cf62d5eaa7991b67fd8ed8dcce3fc21463aee6cb2f4fe87ea94ff5cf15637ec89ca1175f2d68b699168948d0302497b7f2d0891e0cb89256859dd4cc1404c3cd5b91fb3d6e5f103f73d8dd27d05dc092417dc8b6ad761f6d8ca88b5a906e1af5ea4712b223e9f93bba86f1713b40cddf02cd488237c10ac99b6fc1a768b4f74901d71d00d19f7f07b357a6892e92e89e3091f6145e3c24ac44e556ef0b8a7ea8dd8e418b3b4c51f08e7f49899aa9750018807977fb7c1eb19aff269f01a379a9c55f91186f56acfa6caa66c5587a91c7a69c3ffaefb2a367d4559cd57d6b4ab0d96d5ed33cf3852b67f793e1eedb97fb5d114bcd25a2fa395777c7798a4d351dee92bfbff9f3a70defd1d89f002e344ade180a1cb9936bb230485e9eac0fd42cfe1a8eec7601e7826d9ab805f00040655ec8b228611fb948c4054a9c681c12959283b6cf4acf74cfe86ddeb02934a1d06bc81a8c5b85b65ba68397182a0d74f9c596c6b9d0d43e2c379553c7b156ecf30023c2a3fc68e4a303b360ed741972b798a42028ac30bd70487da761a44f9b59dc8e7a5d09df7a4d9e4bb8cb736f9aa62743481d4ac227dab4cc7e666eac1c636c86f226401d65f91c6ba01e07b3d87d9dc03b9bf6203f8c2634a77d3247c3ae42340596956a05e7e6a5d2f7c93981e72f6ba6d1adc5dcf69211ca46d4df211e47bb163486b8ace453c8a23e52d9aae5f7bad776ed16c9cc76b684795a55af0d280e0f315243d727b226f3b22174f8dcaa5f69c92bd9c2e31ef7a084252e3fdd2132d75f1989313615a581bc675e08caa062f6c05086eb46558fca7cd0a6833895f7cea4b6810b884de38e1937d7f6d498495ed283a46087afdba10509741b179d39d8bd0022b22b3ebce426ac00a4f378aa13b99028e342a815b03e2a9cc6ddf6757c152317f62cbb9a60e0a29ba408f0bd4e7e3941c6ff220b0a27a15dde3d99be7279e94e6628a12e2235cec5643f3cdf7d04e200dfea65707076847d5d763fc38d75861e8595de0fb9db056e3d40649210a88c78f64857ab963feb44766ec941959b96e381636498d4853604e8f3144720cdb248ee3e5da7acafd9aa6f77bcc3c2e1a405a9a3f442bf2e0c1b6803300290fe47f9b287fbf81f532ab7a0e14c3f764cdfc02704a98b036bbdf926933db4b1994340f0e885978e31efe67ce9069bd0a5b01bcbdfde63bdf6f7d5259d43c8aad994259c0ef4434eb39207603ec953476e230d8f677a4a8bfc1c1a5b173c57ad6b7f4b4e348a5a4f35ddd8b3c71e9bc3e2aaf096a773f36b76e8346c145a9ba9ea6cb0ec394052cb784272c48332fe951cc2c26554abbaa4fe5b5092393e02f5671622124f267696df7b56441a3b01cbe75f2681212b11667095e654f06bcfe87141d0d4ef7323c234603ecfbed8360a917c31d4e03239ccb487049a91df72212a0c3d5a25026863008d1362eca9960c04a831509558af5a3a0d6b1de9478b824ee92d0bd3478b68c0239d17d9c7f2d60d9c03c31c204900a0c997521c572c6e4c081b43979aa4ecbcd8d7e05e106eb1129935a4bfad74ebe6073e861ad0f728f124ba135f4ab5e66f9bcde7b7f6ce60b0899e37591bdfa3f0e6cf75118b0ad9376a8f11338d358ca9c2c9c3f5d60e02d9eb52d0ba1504bc3a6ab51087e0119f698b9dce7cbf46cff4e866669e7e4dcf4373680b119146da1d3b831de4fcbcaac95c4487d71ce9cd9a019e65d9450bdaa75da33cfb7211743a4eca25bc9e092050e626b494a4fe6770bf439071dc058bd335a54f176f5b843fcf5d077bd09b6469500dadabb913b5a4d5307d6038fbebda4ac83ee3472fba3af89d3b724bf68f7d1d38d51f1baebdc0786410397743c41d5653ea7267dcd0c77532dc851df028e93a23bdd1dde42e30c4c71ebd52b5eb905d45eb34a22ee977c2f6d2052ac4bbc60e5e9a1a72c7eac4a2994c688714be697b919a9dd54a889a5cf213d8f5a513094b176ecd675605b55912b8e2636c287af7b04b1721e81dcfb635ab947b9a1b5739a08e55811b33d2354a9a649015935fb4f803cea64f2a17ed8c93010622bdc0f115b16a86d781e250e82d24956c1f223e6711a0f492660a00d9936abd61b2cdfa81eedab023e774ff7a901c443f3a3613b24436470053407a9fcca4981f969a8447b6f69e28b7fd17311401c061acecc48efe9805b49f1446419a81b0a1cb11a52c592a4accec3e71835561baf3f748b049036506252225bb07322afe5030370e7e4aece6479b9e2d35b22ac2e74fb8b310e44e6bffde04cf5034cb131f791930304c665a9e8e78e562dea33ed76a92a26f555f7c0b9a47de5e6ab0e4b1c98b3a02b677a4b3d8e710f0d4bab77e6c5f69fefda98f8dd528115665c9a2f1065e07efca8fc8b63a0f75b6a85291f6a72c6bb3dcd86b583d21ab4345cbf99fce091b51a29b27e648e4891350b298d55bc1702a215f254238e088c6a403c4e23f841c9bb89c4c0da1d11b6cc86b05c555319a9f7a07aa8effb720cf9bdd4600d00a6df16181368556d8b8ee73493f247da592249c7930e4d571879378588466da8d6933d66a06f03447c8d32afa8ae634800b980c8c35797491d0fe97100f66179e20df30cf3688555ece9a845598c5946a35faacfc2c711c1b1b2b7ddc55e7f1b6d5c8c14f3329ad628c830b645da09c64da9aee05123c08e544e926e586d6a0fdb1db640fe55cffb533493ad7a6db0a7fabcb600fd2e8ccefe8f0a74fd36bcd79a941ce5761b525b9131aa9de92cec02dbbf6b287a6fffe2dd706777ca548cca02869d2fd4a1878c3e8b02c0d0726d622720d061d4c644abbd7b4e12f000093d728f9bc89435071f932f4ed6cfd6be4c04ffab2abf04d591f4d50ba04b148f2ee027cae26e5d525cd60001e910aca4672258ae0040bbe3553e6061188073393d69e9550f4bc3419fac64f0329dd75d6c723f66569383f90c493fc5197892130b932befd6ce93efa05cd54d89725daf953f8149c14638ca2c722d20ad2b9bb4edc353ace960bdda8a946f1527b84a4ceef50eb6368291a0fd2e096ae527b9c1d1553f964cd15d419a1ae347f1e3dd584253079213eba2aa831acab377ecee5b9b375f1fc0b0e5f5a654aa328da6c9011d343c290a9426902bca6e0383d82d383af5560d325ea3004629a54ec995463834cffc3b5126907eb6716104f0a207e959ce5b48dff406dd8895862b70e5fbbba944a26ba64cae4077116128c219906f6931c0d69544c7cca1b9d351a98725fc262c66cb23bbd3d429ebdd51e4e3a40db3ac16e5f4728f7bedf782ee72f6a583d75f9157bfff0624778c7fcbf6aa30ff43b61b86cbeea8bc1f19aa430c921a7210df401f16471fcd65bcc85f290902e48ed80dbd7ca56f4dc4b557047ed7f631480e8559fcbcca55cd2da4ad751e340c55fa50a48b6eec5acf452b32ad2b12b9928f918c6c12298943ff343c4cc1f224085433f5fff82c9fc1a0ef196a24122fe07bac058955550e299625b63f5d2a5e5da183ba22de6a07c11f88d648894829008d8fb764da68c84a8e25d349d92ece49fe1dc41593461c788b240f9cfb5abcf6d5294a8b049c03574f95efdda2047e5821149bed7514fcf72435a38b303694eac5199e6af4610a8b8ed38a9404e4cb3adec6f10721e92ca4d15b1ba24f97ae14ed1c7e1370f571518477edc17ff07dd062e64c97efd4f4346b308babed23bebba2ea1c5ec66b4f8fb119878f1379239262be0fe777e6b34c587b9ad902d39422591b325b944fdf4359199f6efbda808b2ceeccf74273ecacfc45867245baaef66eb34a25c89c6876bf70590a0104e88b501affa0a2aa455e8b9a7b3f9fcec36a9483fbfee62585f13937ed0dd2a527492657ce3c4e7eb156511fd5a3e12e187dd6ffc0d0966c04dc2c75404db1391429a98e6578dce1eb802d7f43a147092cf898f6b895f89d58e62ac77743d7ad2a165b47be73b918ea9da2e9cf5b4b523634e5e5a779d57d8c0ca6be966d10eeb745ad7f364417cdcd3650b0431bb341721765350f52b921656c92a8dd64bf24e042902fcda575e6bd0ebcf5b134e675d603ae9d31338688c15ec2f44b14bc12392499a9f2bc4c8343c833a2dca581509cef8bd522d1b21ef02c62e0489833cf559c42b8ec1307d2a15d0fa645d82955d452038e823f6320a0214365189d35253653f1f00fd1b5955648ad6190b8f2532b1a5aabab2a427ef4fa86f87d06b3eb59d6f048ff1a7d8784adabc7d4ca54b0aefb5f04785d2a4e9f249b8f005b6720327f8e099ce722824d6c79ac8d6a464a36072a235942146d38fcb0e8b0c5dfca31c2ec4370b166fa27d8b04ef0fc8adfccd6bb0931bdfb49727b9211b4ebe4964cc3db23dd1279ff702509edf8d0d9189c7ee77381b426d4aa3fe5d93304d1c65d917f24f0abb4865bba761be3dceadc709303495168e05e355f2befab32e7d0832797815586c4d6e037741f937b678cb743500e45e99b6b677c4b1c0f9f8086ea73ebbaeb6fea3fe3b470bebcb46a17fda7650ad3e3c3e4959d1fb6e779452b092caf27eb167617d4fde319190a0fd7c26cf93ec02885acb215eb52aa933278f18bafb0344a2b3027f95dc3f70cd598fba80531a16162fbfbdceae93f8bb94f4bf9feed5599a962b9342118a076bf9815bebeade6af8486f8b3681e1b09c97121d281bf86b7918982a319b0202b6591ead634eca1d2b18b3c6ef8cd2d35ac5bc83311dac46eb5d0c7dcd87e186a6064f8cc0ec9146cb8a4fc310cd0a97ff08cac9f0c1f2960da8fa0ae077b3f245fda478d492674b9cc759064f5b24186618f545630c97aef7fc94d8c334f222723cc24a2dbbc1ca15686c222ea8ac66171bc4b0dff860874f8e722915cfadc14bbb44979e38425f91928b80f234bfa9afecff149f1939b677be40106790db262c907afea5e3da1f8b1d35b6302115d15d015399b26871a4720e3a22aa18b65a71e7d3b6e20a31754203e88f9ebb752d1a98bb985b7f624fd79f803776d182e0333d474990ea400f94587d04f79477c883aeca6f48d63169e1a088e9546a2ba00c6974bde13787594a0e87736b7548f30e649064cc57c4eb2a1a12cdbc5b365f5eb518968651b60572bbf31ea42e77c2fa77426908d23d5f6f9d3949ad5059fdd305952298c1d89cde3da24d945b1971288afdbbb761237dcac379f93373995fba7145a6796ff918484b85b5c2eeb658791e2a294877f65d6a145b6244cfbdaa52df406e77bb93a883307409a7a411c0b5e08aa282f0204d7ead0f2b697436ee4beb481b41be17da3d504639511a8c3f7399e6e9c0552f18546bed07a6fe0b427ec9eb2d9f670174b2b2850637692b4b731c50fac33209e38e314f4be2ad7acb27a68aeb671492fbd9365e6bdb85f431a719bde5110e4f1c22ac82a96757a75c201b74c4459795ab2d85a750fbc30bd7fafde5b17039a811389a66208d7e249ea779fdb6f267f7d4352d4b3634dd416791ec978698853200f020f0227865b031b04e004047600169fe68c06bea2b399b4dd3107dd902eba05255a274c041da5a8b45fa7ed678898705168207d35a0d7e71081cbc97c63707146a91da799c9d4039ecc5deaae228e2aa8db515f821d2c0a330b6b0e7a3fa2508b9a3f050164ffdc17b239e24028bd7b18430a558da59ec02ad986793e22852ac9fd80d2210bd2e60e75533da0ef40df99bb82abc0ad13e548bcec04bca23d5062a73166bb2a0c0889aba4bf78e7371d0567af7e9be1da0a73a9cb63fe7070ae130b33f97e75765c47e0e5b10ec697a1901e62ceb8b34c7367c54e973e0dde6e368c193ec04bb8c04190e580b276f3bb31bf15a20fedfb1d298bb829ac5b04465b5eb7cc37d671abb8601174ec975ed2dc045f54281055b7c6ff644b1235ec60515e8da74975efccbdf6910632c99d96529bf30d919d7fb1f8339b536fb86c0fde7300b4809c6daa817d02a37224cdf4c03286599de475ce84774f0d40d8cc2b336486c0b539f040df1f312aab6eff84b7587ba63e14d0282fa6970a1c46946b41b059f099101539e877eef3278759e5d4527949c4c84ce1d4f936b8f0a0ea6b6c6c494f1ef97554433f3ef229cebea7be5ed1b66f2e0e8f3a6b942c671be6b6e38757c694fc4a05ecdff90c2fbfbdfa404d7aa35662c50a1512427a0e697e2e72e962d072f373e513637baadc8145bee9506fe7dd055879c9ed1c00f1b350caf2eb12900243c04b332592a17ad668d0617d9aeff47248f9a5c7121bb602916a1a4d4c4fe3c51ae2c1369a1ff93f43fc9108eca0efde1e58d29e87e2a70e637672035b40fc34cf05548403e2ae80d2ff524c9cb3c2c03635cafdd24379c297b7658cfe8dd131504446e190f83f3f9ee1d94b25bda0a7d19e23a44493d98d4d332b7b6dd040c2d7afeb0f19b9542eda44a8a05f1d092c29201a559cdc3fcd3781568b81713f7ce3cfb7400e45fa3a1c52e8885e9e70ecf40450c4d2503bf076fcdebc4c74ccd55b2c7f92679fbc202ac3cf082858c3834d0b4a8ae9bf1b4d164112dc473a3d9c393346428cb886a9c347149dd8d38b4585015be7b81922d675b073713533b926bf1c85507cb9d9ff555fabf653265c300200076252b8a049e028f5d828ff8f59981f7bb5b1fa2520ac37b215acc614af8e92d9388d79d4e296e34e5a2e3567f62f37d9d0b4032e08a9822cb8b1819f14de44002eac90970dc21935c250a24904b0328192d88d98a868d3d030e2ec35891629beeeab2ea04dffc9d32684c691b072e72e3e5476949f0c59792547173475c86cdcfb7c80a80bb8a5d15a63d411589cd7b27c1e5377da55fd4ea034a29e8e2c9491b32943e207488968f12a33af4a3df133e44f1d861065e5568c4187fc907ebbf4546fa5a0dec8978f867da9482e7f29916017df10e3848554abd2a8d8a1ad18bd96d73fdae0f9ba68baa85fbcbbabcf6bad1c24bee79b0e98940c2916372840cd8fcd5b5ab82f29b93ca2290fe7456d94f1b97c28c96cf7cf1ec73d4dab8105c5583e4878a8b61841d5b5593966893a5c438384eda825797770bd7892a2f50f637ea7d089f003c45c58e410fd19df67124e3ce31a848421fe93e8dd6ea4200e5dc320911ecfe3d385c9bf89b87adc669d54b936ed361c1ae7b911cdfbc5d55985948eddd24a61f6896423aa8955e9ea4fe3de482b64a9620b54f1df33bf7ea2d311c0f57454a2579303b5d69b030294244993f0ecf29165c8328290e9d81dfacb1effacbbcc0e4728070f6ac34ccb95901594059dbbaa193e5378de664b8122f91a0e87e8199cb830cd3fadf6c39ab31868958a913f797675e4c5c447b89c65a874538d9e5f0f4147c0d80a00d0d248a017d5f5e97cf5d4beb2dd386f6eb77864885baa038d77badd4f5864e53eb27b0ce40f98c6fac0dee1c47fddb5506cb5bd570b43744352e84afbc20688a989d47b8076be875c3233f11fa766f5088c55a1bcd3b5904c7b9e435f30ec3e965dcc61a21602910530c11d1c64aba9bc3bf9b13830a03c64f048f582f1d9874101f0fde0a4190938607119bc281987d49e1c05cdec3684b6ce37626e454914c2ec7982cbacfef7338fddd2e6f2a00f184f8cdbe9322e95b5cf937a96cacc439a8ea6eeb6686982fbdf2ea911ab8a1b3a0ed0f31f0e4956b3f4e57cb9c14a016fcf036078fa01aa844467f2ec07f26ae5b0981751a9aeb4247bcd9048f0f2c25f6de62fd9626df0e3927606cc06280f1d3553488036995a6195e8f226a220669053ad822aa4e558cf27dfddb0288c8ef6ece8beb6e0840cb5959fc34cb4b410f05b6c05cc0e1800e4fbb487648b91a1bbba88bb1602869e1b08b1a4d3595d0723df858cb93f271a56c1577d9bef7429098629276b6027a6bc81ffd944e2797635f05b410512c8ec01072b2858b9eebe3612b2cd47b4a9fb192ea2ab94f4feeb1a1a3e1a3d182488d3f246ef45930a4648208ec8d68f35027032be94c7993d38f799a0ec5405749ee0f21d6e205ce71b3c4e5938e6a2a4bb112ee97df8967c32e1771e50776627bd2fe23f78679eaec9d86cce14663c8a0f6e0d028f7adfce5837e4a412c70836b585800ec192f93d68913eaa94b5ab2a3c33f43af38c05dc29fd35df8d1b86298c8671218578cc86c87f1af4707acb9bcb0271894718b326e7739e7001886519c0d83ad2b59644a9e20ad6de5cc711f8037e8763b208820f7bd072596a11d663301cf9e6864f1ad6069fda1934a8d0e55d5a56e9789342941cac3372603689ccd0e74f2687b76cfc1e5c8eeb254fe36411354544dd934dd2df7d1dd9f1483e7a5072e31fd7491b39a7618369db72f746a948549f33b717692398318e8b3ce2520e0a32a009eb697836c90b06e547cbe422eb572b46e45e1eb7f880d6873808af108f0ff6449cea9e9938ad280d8090c5f53bc2d3bc885613f79a90f59dcf9ff0543d2f0e7990e45e3f742dc9ad327fafcfde7a441688bcbbc2fbfd68ddf0f7070e14f9b07dc610c2c65934b4ff420dc0ed53e050d9021c4fca70d1f11e84eedaf0b9b1932c4f283e2607a9a1a29431c8a73c4edfee37e9cfd86acde4fbb9069dee56cad117763e8d8d344a4e8d483dc860a6a140ac14d179b8cbb397e6d04f2906adf368eb8ad4bc9ed71cf39b722149701ec9f781ae2ea43d2748eb9197f42fd916103a4904536f9b093fee8f44b853b29badd7e5c87707f84537ad981db0f92f7bee9342fc5bfe1c0075bbad17a4a7920c416e07b57a0d164a3e2a53f4a97d4c99ad13fa4082b579d0e4af027879e1aede041c6ff4e555acf6fcfb4981e2f49265feaec3ce0e29face8bf138429d166b72bad00d61508b8cf67aa06694dd6e407dd84482b2d13872da24a08b98cb88a5dd509135ba34c822c67a153fad631de55696b37cd83fac681821c4346ffa42ea34e702149f83747e551814e597df5465675f7b851a88d3e9c2e2d1a98bb985b7f624fd79f803776d182e0333d474990ea400f94587d04f79477d10a4e784707f613f3eb155e406dbd78095d7f439a296e90274d560dcc458b70e83ca657f84e23bb8cdb3857341fd82b0f73960020e1562fcdaa1e6af7fb51e4167a94196201edf962b4b7be13b8b175271cffe42808b8e16b405bd3c2d27852b20fd4733798d8f6a2a4b9a041c632cda0510addb07c201166b5db2c2aef74751dd95d6b4795aea397fd6f9f2453d3b81b9dab1be3896e158f0ef245f2af09ba77cd756ce2238913a07c4add3b8131ccdeb4d0199e7120945d06f6895d91fc49dc02e4e7106e00fafd5641e91ccc13d7ee425bae617cd34d36583623a846fde6e6a53b14f8564d04730273185d6d4b2495c97f8ddb01a3aad66f97d83d2acaeabb1c2d3083bf420745c5fffe8f3a36c1dad8290c1c9a811c37710c55f727eb5ad75d6109df99c28335458ce4677a83a058e534db7eb6770bc3f76744c56ea3baebdfd6871753b073a5d55bc6c1d22e180ed33fafdc24c19d3b3ead5f35535994c7038d75783c0bb2a9c17fb01b45f820521a65b81f6773b6a7c6f6791f15cfb13e950a69a6dcd638dc6dcdff21279bc4fe7522e76291f347a7b012128f31bfb98998f9b4f916025eeb6f65cb696438d8ed1f6ca552588d53c88e24e8477174e3d566c158174530934213396ec6b78d165c7e53637b316df54dace1b376a756d9d0fe0e8109f055e0494eb0c36678297ee769fdc44487a64c0a6781fb78e827fbf1a971785eac6c1f02b13a2924042ec9cdb13863cb50df9f4d2b8302b441cc0b37a225ca5745ec5a9d759029dce92c5c21f61a986af96a94cf58b85209d8de907357aece79022f31858e7d57240f6051bd505de0a0dc38639ba67bf4cc572abb4f33589b691485e83c06f40b1bd5d142d554ab1b66a1d7832de424f480c63491709158a378b43d9b7acfb038e48f9b3816f5ed2821c8ff9db4fbd7909a7673626281ba75a48da216c05cc688c850190107cc18dd1db541fca01f00f33d4aaa8c6eef17bf7afee39257332fa156c7096be1ec9c1785f6c8912bd80c4d4b26e38a3bb87d8c1c6e85ca0a29a956a458e343da4985234685f1c3b35093dfd3ce9ddf45b1fff83e4dcd5cbbf92ed8dab8a23ced23804fb11c5c9c4153194c58cdd3ce78098b0d5d6226bbbc172d5959266c68077535c6538bb28156e0d567ce5e49925ac642d1d09b435f027793fb08df5d25e40c3328d07b02b451f77f31b67fa6aba59659d87e5ae99afdddda863fd077eb473a279b96a5d067d31077fc3d76033d265bb5466ca358a8eb62e63b8ff94de2e5b1a67f7445c8fa1b899bf58a615145a4c0d37ca8649782a6d47ddb7faa37c49ecfc1a8fe2dc47ef011bd98a581ccf40157539c2b597d3d0f0f42114ffbc3c40381766c7115a61849f70ef0e8d6891a1dca14f245fe633349919b1d17972a7f64e83ceec05da6ed68d2b85c14cd9fa2e1780993cdf1bf35b01e7c112c5da043685602118df760ae9e4ef67c0d3df9531f339c7c2baa4bab09dab3e5f2dabeb08e92cd8bf62b80018d955f809d8da2136ce3bd3e171d7a64e70898c4d6d64447f6625a83758b59fcf6d1719be1c9c4d9ebb4c41bd57f071e9b771fbbbeb43ca0bd622918eca0f4d24b164a08fd7d816ac1d91487c56fe173362236607c241c292160b68c6fcc01dac2191d45f7902a131f45dc1d525d98e5ef61d579fcc07844a69558db577db0c818b78c071bf5ef27a158072912bd841f56200a9fb1325dc7d3ae6a11e60aed21d927edabe7c81f0a9950f926ad9fa741333656361a34cc08097528ebca58439480f86507ba6ad447a7e3edb1637427818d9b351979e7c60c38285b6cecafc1d4946f5fa93aa273a407fbb65cbb990c0fca3ae610e1518cb633c8daa8386ed0ba511e5c09ea1bc4cf4b8d002251657621b6db23373248b9c8759944ef82979213066156e2f2336b1a5b62488e14f0bf6973783df65a23093aa5e245352860386581c38c3da6a188bbce56f688990a4ebef40c54a908410ca3e682208c158e27c456932a73edb99587e3ff4c38fbc92b45e0587f2637006205755c11dd8423c94f75c363f3708ee31ff3cf9246b7cd25e35aaaf9a5a320dd909f8c6478b9e837e9d3ed9095cd407b163828a300285d623462480805d5ebffbb0ec984e45d754f35253f61b7e90106ef0bd5813e9105b96660fee6834284ff5d39a009388be98b88d45fad2b9e2f96866614256389dfb950711983f5189cfd89d9c3283f69ce922462cd975ff5790be4ad53f10eb245bc37719dad1abf1241c50cb5963683e8dac29e7b128922aeab88e8aaa27cc33f9832711f0ed07172c39e166946e96542ace6f759dad13f8889c69700c1d53b0b494826cb5e4ececb2572a0291ba59d5ad86aad7723860e6c773ef3aec545a88a8bddce25bef65c2a4749e2500f772cf68b7c898c73e640cbbc9ced3149b41e7110ae40e739fbbf991e1a6bb6ffe1852d9636fdc2cd61e9bd2b3c1a3f46942ae1b7167a61f55595436be8ce1e1301c12c453f793aa6605ea41b8220fb441efdab553afedbf479181a4787b5f516a6b21f6bbc8adc3d419ab679969bca2dffa2a6aca5a9f14b481da72a8870bd3b59acf8e0281e08a771e6732e2d61acbde5d9d0df612bfc01878c4c2cb926252d5ab467e8d024f5f51a2188855006335975339b56b887e87df5cfc3e5f08cd6e4d2aeb11be4a0b844d8fb079688236d3271208259231c1fca5ce8a43a77da4a6549a0f2383a0bf198a2409309088f57396ac5ede76937ae3bbf15397b05bdd44c143f97601cfd5fa2e700a257c0ee6415eb7c994f485619ba82313ca63b09a6567f67f56965348fe039807f8e2caf9f29f336a407eace61c52ab406141dfaafb577587eaf86aba34df6d98be6ac0a7b54124210c437bece52a62d633eb4eaef4125ae1b6a4eba98eabf7d306070d5a1cc5b706fba28950763f0f3f7a36f0cabbbea64c6abce292cb3c6702b62b8ed15302669535f363b07572d4295f9d3502b6cf73ff765126225b60398f477f64c11d6fb93e192761999ea9fd794853720448309019605df6f26ef097d00f0825bec1851d8376cd10ead00f9dfab124a0f3ca6cfaa48e10df715a3040df45c0ff31d54e7705e57cde66d32e3f8c712cb9c46c83a89a6900dc487b068c95e070bcc41465ef49f4716d4a1755cb3ea7b3540551f226d8bd4b85ba1230afb09b86f5d9cb22f3c45d6f4807f64e24e65a5b20be2da15c9f0117b9a30b5b9caab56f2728d54701567fa42cfe1ddc79275935fa703489944a6784e57f4e8b3b468698907c466a0e9d9643884c9a4738456e781b95e52d2994f6018cb8c7b14cb6105ff9e3497895583adf716819d182711e6df7d870592e1bc74ab684b2d474c6ab85615dd89d55dffb3ebe39790576ccd3d79485c0156fdc6086182befa347300ae0d4a2cd81a17d7566eb7edb3c43d3931b820b052a9f74428e46ca5fb702776497b0fe79200516d16a294a44c8448f549373be55c2e8b8e66ba85aac91c7d07f0ef1cdc18d3610e9b89f6ab61a1a16d31e165ed73644910ca888e93682cc60b215e41fc6f946f85285a043f17951f671851fd229bfbcbda48ea64f451b0aee72c8b021c0dcdf4c9a8640b4c229083e12d472630f6a41a1614c8856483702e344b6381e352ff93258efa965d83a1dcbb04aa27f9fbcfed4fb96020cf99b0540ad71b023ec18843289546eb9614a8eb20b1e08479a79e3b2c827e8ed47ef8cb31fb72b0e6b1d8019274ad6c18c0d877dcce30785f964998ccca0e1e9c6a10fba72ce744fb8f4762e39db2ae53d1a25a18c120fa2990e9e7bea823d04ff9d0af0a863e9799d84e4de94c582072dc277870463d7c8a9062d637c0ce3a377271f062957b00458954cf6ce228c6ee6326c5662e2cd4489de382d88d819dd107a4f19961aabf275b1b25d257c9030ffe299eaa932e50d7cf25957ddec3980bd3bd6c57ed4e9e192a0a9f9158e11d8bec75baecb48a5e77c15adb52d01254fca6698af7aaa0ef6df1a402dfcf088a2b1b0b0c297fc718f60442e0e9e818fd0a91eb760270e1167c29f5826089dbd2da31300a4430a91fdc2a59b7fc2afc3ecd723bb2905b4ce0e03bff9f335dc09e45b7dcc4a2fa4cda2728007140facfb1fb9ccf7934d4bda8130a139bac59170bfbe2f27f55ef634d56a6f88586c234e66db3a5cfc857d149120ca9b10c8a57bdc03de4bc4c03a8e8b1f92d8bf555a55413e40618b453ea8e9cb7e6e52d84fe614878746c72311099f8df6ed275f14dd792a919612779d30516040371e7cad7af732bb178bf1706de172ecba15d90fbdee1f07b31905afee5d2e3cae03d459e975379e721a8ba1eb9057dc15a861a9fa7dab33a4da445f303a524b81729f190064420ff9e79309ba6bda1bc0443df93f88495a39ddeaa0e09ce39ab438987bffb98d4f4eae72d1bb5324bd70cfc5efe9f80f30ea3ab950b9baf96e508af9521a082829746d806dcef1517d8950d8d065e6b7007058695104a3b480e831b86755d36b525c84477c16720f4b84edebd20472c0e31f9ed3735d3d3bea67c55fa327c3a500ba043bc4db62e0f2a606fff87ce88b4c3fb1dfb0c3872f5c81b246cb92baaf5b0abbc0728553c675688d4331c60006cd933d7f879a7db427e05f005ff55d8ebc448c43fab66bedf3bc7779c3042a3bfc28f6ab1bd7587a0cba0d136d78158565df25c07194f8e7051197aaa75ddcac37bd7150858424afd552a51a06acd3a5f0c88344a358bf3043caf0f93ce8a08e86f4689e5a94862cfa4aa97439c9570526005c6d991788304d2f5e313e6a3391c8cfd494f3cf046f710c271fc0a0c2f0a2d14a3569e00877465ba344d30a8cf17d5b2edd9ebaf81fd002960be79e209d5b727dfa0e23e4e82eb17259c16a72c84af2d876a1c47363bedd895658b3b7e710e4f2f91597c5159028b30c4ba7b44008ba3fbee3781d378dfeda1c70089e81648b07fd143104105dc247cda808856b0cd3b4d8ceec20190d8f5ea43ab7f0be55e62e05686f805c81401ce1aca0c7af9af28ba5175f7af3edbbb7dd78257528c3c4925474b647d37d128f4c63cf31c80659895cec5636aa6791ea1bc733e21ae08c23d689f8523d365c9019e0c12943ce120b91295712d57e33d793fc71acaaea339d815945f5681a059edc852fc60042f0094b534d61ca2c431796b04fd1a29f5e67699dbaa54a36f6f456dc304d60553266b5ebcacfcf7fb2692489b6727cc031946ce83c88c512ff1539f6414a87d1e8f0b07aca2439f6958f15728c6a403a37300a30add4cf0e87e1916bf83252f13ad54f74a256233c70e28260f60e3caa3651ec9ce128cb31ef03f8734733581bcda1d78a4d06af2853246712352483cd5e2b8cfcc2ddaeaa5d0faa239e66dc2adc5f2d6830802f6561d964b01a28b9193dad06b512911ead139339dfd42056c67410ceaa1defca4fd3b15bd86d2d2a03252f3c764265d6ec9c83180c4aba8cce74db623dc3ab65c65b9df0b7a82670fb4bbc2edde84f7d6bf21ae52a1bb12e79dcffc1456bb3d514b0059c1fe4bb26c115639b52d5524567056c3bc72704450775e1b0fe7e1720b85ba48fb97bf3e5e683fb5e92498e14f380fb4c425aff48206c7675da7060fe215a92d53c333228d6cab56e35fe1da3244987a77823536db2ff80c51fee03021f7ecc8eac5fbf45fefaae624b3815c96b97a96d8658086657be72652eb5d4bc3260532b17732fd8e6f3f9cd82af9bdfe3da6b45467f059a2be9e8154a2833acc865b220487a3fcecf81056d1586c2391582760f49af69d54c7b18ec797d92869b880897f2820c9cf1de6709eea2a353009728acc5c915d1eea2a39411c06a25b0f2b93948cbada46edb2ec79363b56067ab20218392243c0bb4c2fbae92d7a6a137316d0f69011fad953147858e569b692119d041b0d83e699ca942533d76f92efb0f23a98b354fe5574f21c0372ffe01ed2e8d1233392608b80689f047551c3cb490a942afc35761478a5f487c1f2db22668f063fcffed6be66340582c5066c8c1995446d14a98f42f7a89fc0b2db448e0d70b911699dfb9121953fc7eae63eabe9f45e991c9e26116a01c138e78b028dff9f3c0f5c716adabd2703be1ce0b7c543b0dd5b47b173f286a728ff5d575cfc064c11de18c87c8ab4bee67d2ea905508a8fc1c76ef1358b9f41c9cc0ce156a7b39acc39c802f8ce4d8a11f359836d0323e63da1001dd15186f7c31d903a4d69b74a22514ef143f1a432fbe8cd7c8660bf824078c3844e20923b71d7616e12d0dd0eaa0e84a98c7da9f5b8e11ac71b9793fc9357a9dbb2e3a6407ec51b311e1f7060766d3355eb9eb9f3059cbd8f1187bc4d61bedbeea9071fb157a1963e485ca0f37f96b21be8da846b6b991cf4baa6dd698dc4b4d2d07bbe44dfcc9d0489001d912d44afba0b29ca6288dbc883aeca6f48d63169e1a088e9546a2ba00c6974bde13787594a0e87736b7548f30e649064cc57c4eb2a1a12cdbc5b365f5eb518968651b60572bbf31ea42e77c2fa77426908d23d5f6f9d3949ad5059fdd305952298c1d89cde3da24d945b1971288afdbbb761237dcac379f93373995fba7145a6796ff918484b85b5c2eeb658791e2a294877f65d6a145b6244cfbdaa52df406e77bb93a883307409a7a411b7b66172841ecf9621838b0e2915d205143be2490bc078754f47dbc020940da6f338529c527438d7fd2fae44ca91a55b79e8e7df5f17ed754beecd2b66a0277ae2c76dc72c0f941cc578a617bf91d2d7edb456fcb7f5024052b232d8a6fc0e0b7c5e0765860679b7e057891643b332d8827a0bff6ddd1ad7896d72cf5b82dbada3664bc8f12858c8e753ed30b062fd384ff4eae6d9e6d45487f53e84cf0a49dfb6f4ed87d57d5dd2ce1283f8a2b96b215daba79a188ac2da10efcc43b67f091f9fb7a01bfabdb254a8e417f8d3e7dc79ff0de6e7051d4d724eecf09ea474370f71182d707875718feb9f95f17aed8d7c2936d9bf14ef4963348f690997d23d939155ab8a9e78623fdfbcbedbbb8441bd28956a060400604a490ddad645d5cb4b3291a02730d7e209b16bc0551c6188d1d3af8a75f6d4452a431ec565f0dc018f150348d7df78d16db14d2a64225b241b822825ffb6144d5ea6e129588315cbd5c9a8f44b9ba87ede9ffeb07d5aa3aad363234c4c0dddc2e711f42a245d4f21a81f2db240cf77d4b4cdd659b8ffe0640661873c9bc91460e849857e344fdf4b06e4cf344c111566f9f9f99afa09dcaf4f9411be4b5aae12b8c4b9771f929baefdf42087156f4e76d9eddeff8e4cf31b76b61bd07f6fa079aab08c19d1a3521665ed5714b5a82b8745140654b7bb02de77859f4ddeba588756c7d5b95cf3847ffe54c7fd316e1fd24403186590000e83ad39b2157d918a951a8c82000d87813b388ef636f71e43108ff87606c867194edbfaa50b0efdb22c20c3cfeafcd17b09db12be66aef326915bdb7cd66238b587a71307a0e6673ce8019db91a1f805f3233a06a77c7585fae75dc784bf02d24f05db94a91355bbbdf5bc55362699059b06375a24d84dc13f3905ccc2a455c66d27a8286992815bd0cc55d0a0d48c95cca3e4fe03e10df646dfae26f3b34451e25f080fa41e3c36bf393efd06ec5dc296629ce7821f66b62a3582bb73a6a01a7837d101b553a71c820983cd7e91637694dea7107213988d88889cbd0bfb382673f1515f96489ef4dcfb63d5db2ed6bcf519103a2e45e4daf5c42c9f1c4afffdbfa25fe27700fdf07b1908d3a776c27b66cdb43b7b5c46abcd40bd407857cd1f60f0aa096ca7093ab302f6aa4f7fc38bb34e8fb7c6c0467df1a2c9a383c110ae97be14c0a7984facd436b9f178e5967ca6b8c4b86b4f636d9bd7f5a606de79503de10c4d570d5461d4b85419feb15786fe6d8aef2cde1fce5df73ea97dae057efce191814b3f27af1373611bed57b9cd1012e312586863f68f63c149768b01f66152f1504b0aeca910be621ff88e4f8d5967b0fd58ce70173116674dc0b5a919083574f6a59c7de32ec38eef023909700da34d2908ab4acf50f6a26303bd34b7a6a5a2fec17fb10c3b9a1faeb2e70e9b262c7175473b9a947d5687be9ecf3abdfda29ddb884ed9892a00c86d528bcb6edf4eeed497d4c0b180005a44d8320b225b30b1b2158b1e23b68c0220a3e4665f40caa6c02c117b0ffd8cbd7bdc1e337bd5988d0b4c55cc7b60f42941f3ed2ad23e81bc4b20ab7330e47ee155a775f69ae3b0e432c75d74ad005cf764228a69ddf6da6fdb7e4c38de1650e7d8409fd0948cfaa360f07c3a9ef330f9a062961cb4926ceed5602d9ce59352d4a6aa2ff8fff2d6539f5db7e0f51de564aed8d8cfc01a0fcf7028496be6f1f36723f2ac32351039fe6c2eff1440551379d705e150a181f50c8f4acea87345c1a98e8f49d15586280b8bfc080b7d759a0b96841e7b76bef4343dbb795605bbbcffd22ef171213e55fcee590b51d691349435ad5a56bab209608d0b6d83daad57bdaea86f24fe1490173b09867e7b71116f6e558584333ca1d0f2d29d0afe051635a469c6195a158177712f12ceb46878dcbeedc769261523d52ad9976e7eb5266674a84e72f461e0aab4da6c05cf32d35e6cf0171d53ffd7f1652827910c73a7c8e72e6bc16c6c2c47d0f52f7243e7b7d0183a7109ce2f7d0e5bb8c97a57538cb60c83cd7d251313f016bdb0d8cdfe1ed72edc805547c2fdab1704a2dd4689d562693f185e4d704f5c080c407634cc299727344e3c314e8c6073031c3d69fcf89c1304894f165df9f3375c94568a8d285de451d1220617bb56b12cf1b46ca789a6e673a83524d41bd25bd270d7e5abdc6447f039f3ae4851ff28901e97565f83eb11c59e11ebdc4eef614e280a84330a2339e85643f3e92643dd5f997da0652e8ab5716eb46cf88efcddc8784afa1adb7f346f9df8e37edc90f761a9a1e5c4925951c73e2862464bab54611032733bd1d30825cddcbcefd0c97f83c5a3d76122baf10694abd6800ad5de280b484bd4e9b1766061ad72269cb7c5d8c831c1800ea0c617bfb1fd7333e1178ca89796ad091e0d69afd524f400ee12656d74de94b5aabc100d07f010528009ff3079c62b98ebca49c4bfa4cff07cb45b2cd2ba476eebc8a25a9ba1d2eb74ab6a3844941c5710c3c86d004b7b941c7d59b49fa74005a8bfab0468fde898d5b6708fe032e4667b6d34de2553a05f3a7c919b8247fb7764acc332f1216f42e581296c85fbddcda4945c6b2d58cb328b545509c88e300281ceb5b0184a3fa7c511b2b8467803c51467de3b4f12e9f70e9213e087e18d62a7662f26264800b8c810a07a4da659add0ee39a2b29ed4e17cdb85a4a756fb11dce00be3b7aa190b6a91ca243d3e602f3789a9e1e9ac32705920edfef739614e07aca0a86de0d242387347fde08701edaae8a44dd76ad3ff80c70f19586b963c517c9d2b65a9606fa2228769108253bff64c7c37c2b097f933910f8faf31d923e0c72ca07f5ff6d8d1dfd09da3333221d885d7bc9b4aa7e6747d0b2012f95fd9a5fa6e0ab79cd5c79b20e1af38b33c5ab5dbc6ced06d32a73f50b3b5760f300933970059244f9fd7df2ee5367bb1be554a3119883d3a4f0dcf5d5190d53df8c6eedb2e384025053347068d2eec802b1e490f723f2c478d87bf8cffa3cc6a911bb0ddcb7f049d809cc261faae54867be7d8e6e64427dc6a70ea59ddd01915d7260b1e26fd652ce29879a39cfaa87afde06e65754d7ec1717b6b6e2b14dae48e9053630b16009d8158a9db53d9cf15c62493e6b00fe7bdf440771aa1887d5da95075ef540d9389787eee566b983fdd914ad076e9186eddc5a591a28abacedf2543d55d826ce457e11782da0e497f7849ea6877a07b1484d3e6fc3448e28b3ce7d372286270d8bbf1a8cb9e7c39dfb9f43b033d26fae5d08b8398af73fcc800bbfcd55d76d246d9e9176fd328e3986e12c84a1f135031a10ed30a584e638d721c63812030f211912494cda9cea1d560dadab46ec590b98e83979d72855ce7844f01ff391666898f7532be00b69d8d23cef01b35863d24f42a1c585112c1eae45195909c594101a4a330fc7a43c31bbf68699050d2155dfd5b28d22c2c43ddffcadabf70d45530ac66ba4adb12610b16f789a78cd1e1561a3d90fb940551f0d445d4ebaf6dc9e9251ee4121c2ddef7d58cb5c194b42470116bedda571c604f4b472b5f803e33bf775fec005a80caa00aab80658c08e71acb55552b33ff17c30b62298853145b5b4a333675a31db3184e0764045bf98ecfa1d863a462f3971b4609caa10fbef5ac95891093d5661e99919413a1733926447a26f227d323a2d56cac899dc647686ff5756e60fbbb2fafc748b1da249998cf6317407ab5195764d4ecff1be60afd4614447d16c5e161e1b60b9d6ff90460b5cb1bee88848ec626bbd3c7bd9595aaf698b81ca437601f9290745cdd2b43060fb1d71bb7c066ca48d4c769b218e9369fbb489a99d30d1617041f4f803eceaabe9a085fa69e878bc23bd8fc79aa00f13e7c72c203a3522a2616df3a801fbbb45375b5b1c6dffb157e714b331eaa58bb2d28b080348965c275a938e624d07b50f0503ba1d146fecb94e71b464d4e68ce0e9a6a96253d9732fc1522f0b644309cbe1f57efd239dbc1d8d31de1db4fe8bad965117aaff2267416cc20078ddc8e118d82211f2c91a5f92dc85635bd6d0983647054715155d3a40441e2e2b934c80b668a3681b9826bcea7f576b7956b47380ea8d7245094ed434d7cdd0edbb84b56bb3d5d6b623c6e3945cff399f408e5cf74cf5362206f0891b1a0c4323e159aac96ad715dcd59b770d10bda77f73eb41b63d0aa41ae359d2359abac0238c5ec5f421c33e05d765631c7522b12dd03ca56979b4ec98808bd6716de0f14990be0426d05803ed825146fd4557b1cbd8161fa28bb4be8820089848d695316edeecb7fd5a551f8a1d85c7e2fb3773cc5b87518554bd310470749822c8095ea84d6e626c236d7234dab0d6a14959589ef404086741e9bc0028c2ff0772858fe68edfd7f66cf20a0c23e6d65d2ba6bf988f6413643cb336b49b438b2b15659c0b22c2d0c63a25e3c07af15eb3d3f406ce6ac3cfe027295dc8485e7630c8214d7172969f8426649827ba4e745e6b5832b76262087c28bdd21171d29bcd607d0472356513d96ab59f8df2614b9ffe20c1020f347d68966f6e164b868f639ae244b218afe33b74055ac92eddc0ee062a58b26ff7238b75cbdff177d96011cfdb11145fa92d8b597ec435e31e8b88a6ae49d17193c13a0d2a744b97853a4a4272cd605f5362a021720cdabcb9fcf6901156c3260290284e735e339491f9059c542b66b206782b37bb8860bbcb4ec3818888437a1ff96d7dfdcaaba22871dcaa0bf126b42d8c3698266fb3dcfbc7549ef3c2b25b197937aa42799c6f45ecfb60938d87e37a83f13b04b1ab4c42d0ae48b0790ae2e0e8d8dd18d62adb64b19a1d2c5d5c34074188b2c0da205c2f68fd8e53218eb96b8d67375564242a6bf825021a4ecbc8347af6f47898c010489a511b2f6ebd7ca1e7a53d18cb20079f6c8c000ac9b45e3119578056eb5e4e1868c7b8c559216d83270606387e3a1e37077df234ab83b557e94c217876795285925217b9db7847bde382ac17cee2b54efc16d46961b7992b92b05f2bb066526eda23317c491e2a2470f56d9e2bda1ba8a53be32d5f3979c41f4da8e5de77290f658b0d8e7e9dd93d3b908cd202f13b3a4f228071d4211f4e1947050dbbcc25456e4f67521df6f0778eebd82061d04a0e4c7246f00c7a39fad30539388746973bf14ab28765908fb6c0afc1b07e73cd5c8a8039510aa6b9a63c1b5fa9bf26bc56aa206b6534a17146c2c07c222dc7c30f5059385466e3f42ba80bcf6efc26b250e2406e45f0c972605266c3d67dd7a6ad614cb0fba5467d87facf62464436681c260436ffe0d3d591bc99e9e08a3218e0017589552a7f6a374fcd4a54aad85ab9396eff64294fd703389dfae36d4d794f6261c79b6cbfc347699b38f361ccdad507086250d7e6207e23503be0c765361b1c29e819ae29e184873e8c1d5bb64c835da4801a5533277f4bde53808cfca59e4b770c783ba1070f97aced915083a467a8859327138ad319b475b2b630dae76e54edb0e09d5b900a40873167dac75ee15224ca9880d31fafc96050d3b0080c7400aab2046b6b5acb260674f772c343a55584a635e93a33c9310817a3a3d5e4d6b5b6bd11a676252344647f500ec78b1506ed16bb80fa395fdd729e5413aab60fd9bd600dd5139f70d5b7c2d4894a0abc36c54a82044ad48a406a2828e522f24b70247c922a79330cf8f616debbefe83dc174b24b86a8c52882d74425b1ee5d2cd7b335ba38d4613c6f554c2c9781c86bfe9bf3de2b5aa475043957361441843ab00c8cd801ab160aca63c89accd314b6adf13b7a269daae65810935cdae8fe88f0dd91df6b491a99eb49951f23bee8566f2c8378c65a68a69d44e0962388fbe3ed0397a4c9c5d88475339a895d11ff82e534d4d81726e13f34919386becdcb65cb9fc24c0f5835314e00fe13070d53b684a51586ff413570961780bea6526a6eab2568dce27c15efdf0d8e421d05d5dcac74c0407b4c33efc38a97dd3206c2e3cb74220c41d5612293c05147d224d358725d92b5afc3e599980e459fed4a025da96337f879ba06cd6dac16d4b551c5bd145560141c4532a79f5e4025108abdd4994d92bb410e22bb679ba1f33a0f8ab6b296b610d187578596c01c09ff0613d78d07a0d891d5e17aa5da375b69481a3a3cf8d418ac9c4093d175f6c5b12997d0bd6902a5467d3f79e3abe7e60d7824a9c10414fc834ec763576fba475148243e4253f2a94f8001ee370148628db5ffcd45494479e8704e6c76c0cb14163e4a1945d74f227689050942bd539b776c134d070fb08d17dcf9d99ddf49d0292b1aa068fe3458112070e0e7374d28bca2622cb24770d3e8e007f200782210eafb4e711caf49fae8c3a7d9f8bbee312e4d8a085a885566456c46be6b63945569f3ade74c8043052010e63b50bfca22e42873d0fcf4f3d1a36028d3448e105961749f3e2e672288ce295aac942d851c3546f7cf2a2692a72eb8df570f98351fbd478306686cb3f3efce1e6921fdeda3f5d8599856dea4842e16607812f26a7edf14a73f4aaa61989e20b788d965bbf15724ec9989319c2405f5ee52d347b60d791781f7f9f84a1b72ec14a2bbfbff35b77191739253b40e7e128de1b0414f2916541ba943218743cddca34a3b0d069e5c435a111608ba1feb12037a4acf2666ca5b3a178926b3b196c3f378acf708f73191ef4dc052d582e13abce78f9762d8395d4c46a29103f4a8d1b1d362028b631f541b29e310eedb0befe09d3ad0a27837cf6e492bced0b3432ec1513d2462dc0c9230d1bfb43b86ab62190c4590b08418c7e139cb392dfa666e66b34cfde03c49b5c82d1f4ba7a0336e0daf5c995b326dc40065711631cb6a02ff4ae5773aad9b08fb055ae4e3fe04132ab778770a6d530a58682b528fd80737249c05c4cd2764292bfa56e2ccb573442410762b5dd5c9ea07bee6b44353e8d24fe191020d11a7a36b9027a1b9a0e5029f819bbed060b8771742c5f946b4163ef1080531ee4366c6fec0be0ae3217f48c812af387e8763f915ed129745f9d12711a95eeba505e1be2cba3ba7d91ee43319f9c1f0e42ac0ec063292bf473c71028d1e24fea8defe59d765631c7522b12dd03ca56979b4ec98808bd6716de0f14990be0426d05803ed7800c53edb3de249857dd74c7c8ccbaac379588ff2c793961a572bf77368765c638457dc4bea82cfb31c8c3d7de8a6290186af1f392c42b7ab164a46a99ccae9336dc71b26ec3e727afc3817a460294485d2c12eb54021a0d4205779d71dd5f94dc3c9706ac1d28e8c8d3f0127f958689fb4bb1d64cade2a49e5dcadbbf26128cbfa04fa8ca04072fcfa120f459c67be3927a67fce39fad5839e9ef823b2ffec861df72794af51978d2313e6f3e041309475bb73992cdb78187c5dee523eb790e373920306c89d58bf5f8fdf68636f27f9dc860fdd4a29fbef89f9e76924c8befaeefd19085a34725e4714312fc75acb64c3baa28ca292ada1b52b683da0a094ab20a065dc4d7d97dac092f54a4f8a15272eb82cb7fe8173518318c1b4e5a15a903f5e98e3f6ceaae8354ca5fa071e68bdb26cb18ad30b2c3a4b29c8c4e4910f2a29e801f44ad8ed4ecc485838300d35f313d67d78ed75ff39f026846df4a00578903dae4862da276a120330ff1213cfc5ec7cb3c1b034d7611dd6382e450a3f3bf9805b911a8292b961426f7b6e3e944a51add01c89d420aae004ff38c8a59db64cd867a8db8ad3dad9e0705846020d92e9d4571cbdd62d62766ad89a2d1adc578c2a81896ec6263fbcd053162bd26c2230e9a65c6abb12b9f837b225a6fc3a6c84c3bdaebdebbe3a06f62df7b149584ff837ce0306a2adb365afe86f2ecb26612a02ba8b71ea490a85e497b772bcc099ff1dadf5a3c8dbcacd323256d59a250122e22502e56abb794e3b27b1855f283f9c79141c6c78d20a14d79ddda5380972ce84a68d3647cd34f04e9040861333ac9e9f9ac5b00008d41514c79da664d81b834ce6c33127025096b7bc3fb877fbb70a30366f81810ca4e159277d0fe904769305c052ba3d6f5b592b7d7bbd8454722e76eb8737834430eb71004126377bc3ce5c378fa60f5ad1f6bd18d14aee6d1d26acec4785e44caa69845bc2165ddb1704bd586c7e3aec0914b95c7c3e92e1687edfa3a4d33b8b3a3e6c484bbd6d079a0bc8af77b4325bb10b651e00b8f7974cc972d0e5456a370f2c46a56181ada7125802ffd01c98daddf86bd57960f51f7dadccb15b530c48e6a24f4f1c697fbac246eb43233fd2e714c85e84407a084da2823d5a64e61313fd393d34589ef0f3eec381cf025f58965728544dae5df9394d6bebc7e68572e429814c87ee6dd284f712a720bab3f9598c897c45e389c6666998899b963c05892fc2e12179cf1ca4bc0456ed97d8bb58bed6b4b70959e04215d3393596d92b33a7aa515238349dd19fa71fbc9634487b4431629bc9fc179df6089cd81f56a97ff03fc4a0ef40d0ad2561863be2fcd1830558f1c3d1b4fb41765459d30a47e14acaaed6b0c53b3863d526b2ab252371fcf0792b539f048269c0a2723afc96de3c802d367e6bfe7c992cda847ea9628f910363917106e247af5d72a204e5b3a98287d3d1993e993e791ad704ebffa3244837b399a27dbeb2a21e55bf5dbcd4f5cd01155f04a7bd41087e10dfae9cb1a56d2689f7533b70bb73fb41d1346cab38dd08010ff9f6334bf6d5c0e4bcc57b7b0c59be43a663fdfafcf6a88684dd6cf01cd271882d44bd1a70fb6aa54ed72a392548bcd7c79a10ce16e9ed70da90492ef13346e2419fa52d3f72c5e3cd751ba7372252b1489cfddbe6aff5127e0acb0bf7f1be5345eae2812c64380ba84484884e55e1e57c09d7d9449ae1c28790c445953daf36d0a3cf4e419dbcff1168b603745c8b2ff27625834980dcb1951227ca6b1ce6d0c40392c680fa9e7345281c3d107e9c14344d63691be8073c013c903a0e0f29c4d3bbf598e4ddf16a3e0aef0fc3a78b9c03e85516ee5aed951ded56b59f938327feeb84a510fd9a4d3b750261ca64d7634b52cfa570e7069969e8c374258756b54b957fa0290e8207eebd6ea0ffc4b3bf9d157cf84ad816a19b7e6e2baa41716430431a6335b23b867d94ee99f44949c095228a719f1c1c273e72381d8f36568426361beaba7daaa67e43c7d014afc2291aeac42ea8d036d7fc7e5dc2e9d7bbb3bb134b12e7f32bd511ddd126cd4b97729058528566740aac7ceb547e8f84bf883f57e7bffb24a7d5dda838995f3423b131dc6d23c35e6377f6351141437e0e52655623734c7414c0907a61ca04c0bec6627a4ab5fa7a7dc7d5c9e2cba9765847821f6d5b5b9c879da91809cb4dedbb7f2ca06806293fac373e92d377190233f807f55e0ec1dbec7173551dea6af38442009036db715edfaeebe0654d40e36ef44c5eb9beadbc68f328dcb08c126f580c9262c68691e23837056768fde71f15204055aa64258942fcad7ecc2d21a336743f754358406fed752d7b1023ae98fbc6b82e35fe0b5d01bbd5ab3a2f87814f1cb9518cb600c70395620e70be7e4b7a52558cc13ae1ca6c99e3061644a02a28d20b6b8e6eb4aa50490511528a6b34cf7070f0f44e2c51d948aa226aa043c2760288aa883f9dbd53b9d65cf8bc20215146fc016dde6f13f37dd5dc201f2332240ae3e013fd3ba652416093da7275fd110869a02bc1605232c7bd58e0f5a65c75c496502af7348849e0c397046015f6e7f50cee7624cc56909df601a2cb51a84ca0609ebd5e65ed59d10cb91b539ae9cae5bdc5fc2ed82d42e9fed6c41017070be7cd81b6ac6b3a6104ed17340daf633d37ed5e140e5b60e6ae8723891590f2d7488528e6b947f242761ac8bcad7c8426c01b1aadb141a2c5a7e7e8d4f65a80643cb6c0b156a4438d79cab3f387a4365426668a39ae7572e451277f63bb407c11366b5448c9538d9f001448dabaee0af759e258abbecac12a739620d45013c859737c9bd94136b5bb489bfdc2d97b99e8f2bd9c99d199e08414cd6f8e92ceae4d77af7030774a5bc6fa850c63c820928ba84534437d454bd7f812e5917d64a64e33297fdda467013cebc56c1d06b1774c7054747d149fdfab877e41585ab832d62227e439af52724c61d741e343c4311f6bfc7de535e270314026de2237fcd9d1fbc69a95b2296c2d99e61790cbbf4af05553305aea11d69cf3a974e1c4763ca12844bcbd5391b99997b206c31937611b432266b0b70ca7aba067fbdf0a4ed995bb4009d3993d7740254d5cdad822b588fa6eb79fb5a7d5d3886cf515a0e0087bd8fa2324b2444da45f206644a68e0acf3c37b808ee36bc170ccf89afbbd6741f4674fdfb5d9b996ac38d9210f26ada7a34281d9bc8d4466968f747eea2101413e2f1e05e520c707706d4afebb19bbd1dd13d48b3f932ff110bf94487639bc9db203854013231d9aa544388bb13181d9a6f03bbb7adca0a7d734fb3599fb9900c8da8ffe405dc691f1586030a42b9bb3e916a19b7c69e82180290176d47a6c452b452aa79b758e2c80e6dcdc158dc4f1d7d3e5fd841e4efa13f81ab0f4d82a8de749b1b7e0e44dafdf486b38182ac3ec79211e0cb0b3da3a0496984e6d98220d3f57d364d5ae279d523ae0f43976eacf04a1ef4eadba71a620d93a4b6a9dd4d6c858582078c7e9399713d626bebcae0dc850720ff5323fad7f8a992efaf808a18a1bc5e169b331a09862fae3fe8eac146921c7e90669e63e536f35cd4b41269f6044a409e45c4cf8e6c0fa43fffafbb0e5168aae89db036f54b7e0733a36b417e93995ed778ac6efc529a456118809f9f8f8926eadd09c86d97a32055b5a60e29113e6e240a1df83b9a1635be29cd84b73d800965b1e46c5159cc5780ff21ae3cb3bf4f7962c9a5e440b90cc33df647840b691d8ab7e49949810a78d91a82ea6931941479368ac639c0a46611c7215e253f9044d740ae0edfff35a2903e4f37be27bd6161c5b240a18d9a9a9ba61cacacb21d35d344b03d9e6c109b77aa2e9d5543e8203fd394fb8c561a8e91cb856d52e41ba70e4fa86238e0ccee7b7566e2232460f39952002781222f2350cdc8215f59364baddbb94cd30bd4cd36680342bd5edd3f633f2328cf1334c412f2ae9dfe5881ddcb94f4bdd3a106dec02d47da0e5dab4e7380cf0bb16bf13938618a8faf2c6a3d150110cb893547051ee9d688d20144512e7b9935dc8c5f8ce22b091a71a8c599c0891e4d07158bf216fc950cde87d4c5224a0a4dad318215983c1a2d76735cbfb3ca7ba5451c1f62f5e71018fad2b8577b9c8ef325e5f1e79005aa0bf6605edd0cf77f1888e84f43902417ec75f17e803c526fdfae0378c437ab7b5d95089f5aeff389600ec1d20ee731f2d7b4f77b35315802d80aa90124946c711674b4574f60a1b999bb9754e41b38ce0b6d86180e7e034ddcae855a301c4a7b08bee483edafbbe9469e204574456a015c638cd55ff925ba0e70af38d14c7bbc048a3cbc05f7d1e0cd8ca61e2f44fe063e360b55633309b3c891ce76849747a0cf067d83fb5ee3d5aead2108cc888d6cb5e0618887312c4a67edadf7bcffa85edbd60eed809eb976b94d5aa55e4e31d7d29e6facbcc3355d5581bf778dffe31892ad4081fe7fbca4ce1eb59297848d22c948438142e98ab6e110e77092e42a4b79f18a6d875e1bec63199cee3e49b6db5a5114a3963734bf8b070017138b6e0c581b4252059247898028707917d60bb0406416ea7c0be7283044accd5b024eb7a33022660b7cd4da8bb466fcaeffda21daee104ef634532890ecb9b13757599ecb031af691440e5e8b31b2a2fd64724845b51d9fb652e7840449009a69eb8307a094f8d2b543f1e88c21b02c334633bafda61dd2ae4b27e31e8c8580a382462834b370e96395f33edc137157370ff00de07658386c97b529fe08219f6ff61879a79f73d903dda257bfbdf580e90e3c8b261c07e6749300f3f49834758dfd373eedefbe6d9735755b59d4c8c66b3ddb980ec8d45d1c3d34ac1a86dc7fec007f6d645632225d9b51e8bc6f44bc01d924993cca7bacf74486598b71c2aa3a6b82357c51ecb36b2a569d555f0e4d5518d3b864449226e804d0b8c3a3b16f0445f16bffa93f15841c22ffe262ed01917e4faae6b6afc78d9d9b46dc3b93ca2fa9d44dfc42bb708927b7fb722c6431e6ed762219e753b809ba0e88d15f026e28e23e19fe57c1398e6b53f40493c9bc40e78537983ced56bce608987e69cedef66addec374bf738d5ae136b565b8c7540de339a386245e5c80f93f03fa67b6a4797a9039f5bb12da6b5a617b655a8a802d3f3c4cd8f38839a4998713debea862ad624055c5bea3ff8c0d56c457e84301903969d1b3ec0fa37e0e2d01e00817b00dac73e534b9f506cfcd1caddb20264e506813a31824c89cd5d22d1c763da2346317080928b3aafa80bab940b2261ca51cfe30fd987f00359ef8063996de8f2cc4942768afb04ab96d6c2fe134090392ba8d85febf69fa7e8b9b571d36f2f9997ea8a4cbb1d482cd120a6dae3c34fddb424af5d9e25558671914cfa3b592b42fef42f94ee8f1ec1cd586770ed21ca79abc728784482d0a8ff5aff7b74439929f99218d4c64803e0473ae4946b89b3bf3a8414dd20de234744e7e8e318635d383861b4088011f7c2b0d1577e299246ad349c2d649a3a29b8e3158e120e9a92ec9df4ba1f26be864bd1aaab08ddfc10247d1f1276f23348852c227c6f22eb1f948c367b92950d69cf7ea1974e8279874141a1c2fa4c4bf108ce15011bf9d1bc4bda91f8ff3e2fcc9dd0dc2745afffaeaf40976cd8ec2c91dba534733bcfd5c1bf384e3c7ee216b1c1e9e060fe607c52942eb0cc3c83900b580c546dc0d76695a271a3d6cbc53085f7fd4946d7a3acf16738145989000d5e65867cead14801ca7a9bbe4d7bbf25ffdcb66a22588d3c5c792f681045673f0a2059b05cb2d6070dd42cb3dd29d104436984621f6e455989dccddb6ea1de71cff168a735b069a7a801b26b4ea8e5cb04dfe2dced62ecd02f320f5164e515db4c962ad24df1def7d15aa01d64e3bf00bffcd10a310b021159ed24b405fbaa75f19c3510ec88b88ffd3e14787c6bc5f902c9e97aff922d83084a0f7c1d0eaeee98d219081e53d2e8583366d14b91d40d010bd8f10ead8038205d43660176cdf418e7fe7f120fed53f9bf164e7748e6436c793e958580babfa72971f430fb1aab8b1940c07302e9d0601cf2b5cc1cf3b38b463e2b34f02e1c330b8a90d7f3016a802c990de13ceb72c71b45c88c60e0b77e916bd0edf9f4ea5db87fe0d716cc4a8a60349ce123e37f48575ea6fc6c7ec1178614e0db5df981b4eb6fdbda220e3ad2165609952768790eb6743687837fff4917e7b4a8266d0841ee11614da07077d716ec9c8d67d5c952634b9aa7d6299398550ea05415f6690575bdcd934aab005f4cc345b76b11b4635a48f7ccfd18cbf2c268ce2d502621194827bfa5ec7d81b54a8bf00aa5bb1f1fbc1dbf743f45ab9de6ee85868ab4595262f1faead913c96e0247df3760d8951c3379712c10ba3d509ffbb04184ebd1c71a60f9eab39a1c73ab371d9bce112728eeff4d1e2f7983f0ac0af26425e324c39cfa07a41f4235ce0aad79854f4f889b3944c5830a5839e4a9fcaa0a3436300da644b5e896fa62f56ec2e1ce6ff5d1c494b482d8865867f7de3a8c6a68836d646aee62eebb8454d042f470428dcbe20eac1d12ea045f8dff5b9ac307c428a439ad72f8e982ed826a8e4c2e0d9c43edf628dad5b7a321301529aba04506e294efe1f44fe6c4db9a6dce8a1ba4acbb13f6d27bf0efea9bf0af309f21e2597b01663b0135c2dbf463fb55edaa306adb35aaf4ff2701c40bad2c36f2d868b20342887f7645dbc19951ff944352dd24d396da59fe60c0b13064fc955b1d6f32e8a364a01bd9b84c9ea0214a75e171fc6d5865af7fd0c715582ef111f3a0a40f6625545dd5e5d81046b5ff480c96afacdc1b23e0b81ac31298cd0496a7fffaf83b9a75216dc3a3a08f1681fc0dcfdb3a1c45dd1457cad0ba1c8dfb2315207dfc6d9792df43b6f46f446ff198d637bf3b8a4d91ad1e3e813bc1eaa1e38430f75e02e9b207d4ae747c3dc17c5595dd06302a791604bc6545d60b70ecd9741cf21d425a1d50bb05a7a51644cebfa336d8377425a79ff6d6974411fe21bf3520f7e34e8faac8712d2163aeea4d3bb820fc58409429edb3170e74adc4a31bed1b7272f14922121a4e66c37769e94204f09902b2ff615ce66ebe0f238378f3cc62c04c144c6536093dc3225ea7bf486a834cb51c687f5448c1e2108bf991999c4352e5731e8904fff8c05b1b90219bdf8e463411bb8de8cb2a94228332ea60974f2c9521b1c80a47cb3cd5c973eb03f27a5ecf2b769728315703fd5dc8b59859cd1637961eb6fb754024cff0516df2f6964715490d55bb96e489b889007a24389dceaf53acbc913599ae003600efc8895059397a44c254229ddf2d4d88fd4f07f9c77c3196b359aacba546de9f69f238269d18b126f39e470e92f2fe79f81608444cb051fe0b4a0586e69ac7c881de81302e0ff3e970e819d6b13a8e97bb729b7b4d4ed1dc0b771e98350dfcc4e6cb663b3a812bd36231e8984808c8479de49a62de376d89926db73ada38961d28d44f59b94d1ed0fbdd5fc1bd828571e3fbc76e48b6b36c8d93c2f772829e8d1b75e7c511a877109f5d3f4ba640b34ee13fd3177c64704d225e0bcbcbd812cf7927cecacc7a9065d28f87d9c4b4e564962384d8d0530d943454dc1410aa9752cd9eac46ee928e5c5235c328a3deeb0369ee3d29731d8d23b2b7fc8e438d42906c537f0352cbf69d62a9d83460c1555114e1ca11bbc1f9f47be186602168c48387e71c30690ec8ec4ed7823090b15a7b426afe95850e75fc9fca0bf696e6344df20ed2a9343621727faa80463a75665b1693a73678d6d372da085b55adad7038eaac8ee5a7f9b5b35c2b3985e2aad515bd9869e90c157e48845ce496e07ce3e2526193d329cde58cf47ae431ac264d2ea5d7e14f8f8a3460124230422d5c11ab94d454f4bed4ef3e1b916a29427bc88ffe01e903bbfe4c0f93c37424e731d467141e3a3d125acabc54e772c326234d139b32fef12d96decd6e8bd4e519c0e9f1272b7eef7238969372870ee45002423a66017bf34ece146c6e84e3a9fb09f3052172ee0fe45525eac74a300fdaf8dcde465af2a349d4a6b4211af77e574bc0d40f749373f11a04a8e26e0fa653d6eb2214436559b636d1d5e0679a0b1414e5048b1d23ee6d8ebb3867f613fc167b66ff3ccd807d63ea49757bce6bb75237c264294dccc1b971106cbc32fafd38fcdf7199d339d0563b2162369c310d292548f74e5e18afae64a0db6cd040c89c42ddcf83359f6bcb46ea77f449fba439b9ac7786f2c9ff5fbd6cfcd717119837ec3e2e63d8efe9ce082b2db99b62c2a0459a58f7e68b71db1bef5d0cbbd9c4c09f2a23b6037c07fda2c78b21c3aea79e81b805b2f9c67ccad95d66f3b1b95a31389571ceb2de1a77fc3dff76924e9503fbd9fb4bef5b1b098837295923627b8015d011bf9a106347cb5da2a56b97e8dac49e631380c67562800078890f4c614c5eb06b1e4cf15c23bda7b1f60edad3f1c50332b383959fad4bb946a730412f51920cdbcc87ffaf08599ee92aecf53f538ae4b38dbd215a1acea4f1ee52bac5458b94d34e02c21530338e40c1b5348d5e936e243b1504a40d726687645277c7db055caa6482bda5eae48c9d6b28151c4c7b4c263e1dfafb0a54f6fc6f63b7c3fa46a8a9c4f797c04e275915a2b874a9cd9d3bd8a301f489b68e7032fec6c3e00f800fb3d11e12ba6da76cb1479bc85ae9126602a62c876aaae2f31bd4fef9802747ea34d4e3628dcd226441f49cade11c94d6faa1c144e0873abf6afbcc82fca94c2178578b25dd27302492835a773c431d3444d4090ab7c83491c57c52a6694951f55c1b0cde35256d18e9b9242913bed09c7a402b20061441d8eb89cf29b01b5617636004c7ef2356bd6cc5667bbabe7992d7ee21bd71529cc07d454ffdb4ddb843d48df9dba466524670dc58ebe65a6389aebcc4043b7a6067e7f7302e8b2363d2b829467d00f7394db047ae639144623ab05d7caf32f1e5d7ffa8e2c3a373aa1a61948629bddcad565d65aa0f6e5a9deda6eb15a04b8f440c0d79352726a66648fe1a95c60c2eec417d84c85c1b1d8d198c3864d174ad9ae55a469d0352b05d6fb4c25ee885a716388e2ae5360ce6b5d40d0d46c9c6f53d80c537f874ddca92cd986b3137d84b3c3261ec4b05efae104ae9003f56a7f0efaabd779d047f7cacbda3ebb7230698152e034008ec62ea9d4cd77b791996685326dbed61eebecc55f1811172563c4e8d966a87e9e565c00fece3946fba73353d1b13578551455ac50c7cb857d9dea4ff1d644e35cb5827e0a498c8658b3282f443c2ecf4e91ff4cfd0a491c4b3bd60618c162bcc75f98abf98e92c5c8d887b6f489924a65fbb527dc46a74d2a766fe4fa50409033020d0126fd1dde457d3ba29193ad32d72aee5cab3e88995d4193475523c5e0b1df90ed7bde18a6fb7ca8907e61c18e9856e2a0fd45de00b67b0f95d0b0cbf313f732c69079cbf8ed6314280d0b8ffee2a0d5ebfb5b9f40685484b7d1078133e58269acb88a46ddb4358c3576ae0e5c9165c2f6434675ced6842644f6b5012e822d3af8638ca58664c64e2403c5b1d7604e8fa326e6d0d6b0e5ad5f7da7ac5dc1faebc7d8434b9f98f8edebd551a5637c982a750879a70874c1b9019a41d47fad56d50adbc4cf17fec5d072d8471941c755cb4a14ac4acd75fc949f60d9bdf39691660d0e2f52b354e6e0bfa0a66215fe942c52b1a1de370161b8c9dc3ef9fac77304b565784f6af950017a30a903f83923ef8beb4da2d27edf17668d4bcfd8cb8363785a6a9ebeab1723530534ff5d79307e53fa401be53cf79fa887e67e9c172b1b3b1dd9487f260f2b6d63268bc97af9a6c9b2a62ad6cb9c59bfddfe13637b6737fa7d6f36a18a1b15164c124f952d79466f50552f1bdc53e073fb415aefb5a04a558c8450928e8998acf154bd1fc18557a3724f07e144fb9b153f9a50cdad358bf8382a87a1eb70f8df97d0cc41db322440d38ffccb42da5e6901cb77fcae199559663a99ff63ea883d11a0d73e46c2bb63f4871421eaabc9888917d8aae3fb3629f88575764d072de48dc77b6a2f1addab4443e81fc2fe6bb6ecf7c90b8dcd9277d18440a77b3ee9ab03b63900a8f2d3b807c18bd94f30b401628a40acdbc2a300c65576149437d70505e8c98eddfa2a986cafd5fadfe9d4113914e76295022fe902d237354b290cd5608642f1f57acf6dbb87273afb049370cebdf03f2b75cda14cecf40248c058499a629f96778bc860e592dec77fdbe1b44ff83da20310fd9597666441f64d6e1901ced167f27c5b920ca2d856c54a4e56deeea6160f92776d9a3e207c1e0940000c02c852d1c0c322e5f53bbc1d452006d58cd72a67f6dfdfa3a9371483cd86403a31fd6dedfe6f11aecddc8d3aa33dc040419a0ee5bea2d2329348ed24d30dde8217d2cdf7404e51a408a48d9e4b5a3cef44bc687f1b8e52118ba7aa517dcc2295478549e4c9f70b6ba044f8e05de40dea05275b92cf162673968d17a88e9a2875d7dd30e4ac0aee48522971d947522c1891bb1fb22f51fc10a5a9ac5ba46fda8fc14203da99028b59769ae69c4605d178445e4ddfcae4dd8cfecad8ac00c3735951d07c9990874ef0e64d8b93511d74a1a6323330462f76a71a69a2df31de599e1f964bc21857f6a9d8c511a21127be96cef70291708cafc2cbf6b880b02e6d50770aed902cfb05c79540c4e4f6a8887aed2fae98e5d887a32de0b5a6245a04005428004e98dc6e2149966bb02fd328c09aec5a7d62d0e0338ded75096bca8ac31225b817f734ca40dafddcedf03201b9fe5bc15fd83476bc15c99ffb9d2831cc4d96df1e9af97da742f05bf10cfb764a3cc8e4396b4268f14b0a6235223c9eea52322f53ad7b8cdb04bb0dac5cbd37ab2436bf68b44ca5cd2cdc7a7fe13a0afe6bfe89071fbbcb03dcb21250b80daaf767c42117622ef62506efb7c6efe18c8c7307916eac1a5f138c2d4da05a267c93d5d84f15e0dcd0405e3b33a822f0496f5d031f45d50da6268f35370daec2a68e13961c14491febe4c5ce8c18d5ab41e713f174cc70ce36ba55f7706f1840081247cab60219aabd9c8bec1cd8c6b2cc3a2db17c977b192b6ddc71f0af4c8ff75d2401c0daa142a9e3060627384c417cbf2161fdaf4c5adc6124d8ac149603d366197a0425ce7566f73db5b94af38cf9457d4f41641295f509db009f55a82f8945de4333de87d8fd945e69ba9bc6e6f05f3ffb14d052e06786654dd86ef4f3a2e4cb0db820cf40ef524edc7ed0986347ebff5741c3ae1b4f1ff2791edb57f30d5429b5e32ef822ac8ce236f152b469c1ab48be81ec9001afe4ad6f6e88d54dc6e90618f8e20d2b4f2ccb8fdf55cc4c9a757056b31948f5ae27b134ca8138c2fbf6d8cd74a2b662eb9cc4fa4ba5b6990996c1ca2cd755f05ab38a9a54d84d4fb59469f420a7443ce5958d0f250059fd63d379a3ce047c3419906b4dc3644cfb1dd031420996c99f8bca43c7c0cb0156e2fdc4e66cfdf9a13fe93fefd943fcdbd63c605d0cbf43615729f7d99e0eb4d10d184c50ae2bbef16f9725d666863f3fb0dbdd5e929a135d987bc4b9afa3040c4ac61c41e8692e7675f97bcb14c4643852673ae5a478212b81c67de55b54ab621c4237fd6735f1713bbfee8f77875e63e2034f3a8c610076ada58ce198c0cf80fde45dccc772c2a07b72f407ec159f30bdae2cb241e6d4bec202aa4f944589ffb5e0a5ed86db94024bdda149c915312002238824049178d5d276615f623b936fbc61a83ecf6b8a77dd5962198bf7c76861566859563ee29676d89fb9e5b5b6326f6201691c6d226f2bead66247232b488f7860842887dd4b5cce6bbdd3efed16f71063be90c11c848367d6cb90047745440c16bbf4249a2b8f0e7d1b1683b4358ac4c5cdec45b7d486eb1740f5018bac4a3a836ccb0306462daee28fb83b8d8fee5d4095441fbd61cb83b2d29429d53241ae2fa8375cce6eb32a312e8fc8e69060528ca270ff6e8d9c1bb854e91caca911a29673b7865a30efb3d0727bc6798b285470e959094ec07c0a2ba7c45621d5d564ec8859eacf6fc9d8c53ba002e9a3c321d28cbf1ca9df7209a3d741e5b118ff5730ae34e754799e472ad1945e58616846461770cac12fc661cbeabfa1a2408104dd7134bed3ef85061361accbf5ddf842aa9ba74deeb93d7bc0bca0d5c60ec9d877512f9fb41bae01e775aada1a59628d0e6c7d6914fc92d2e9a736815d8ba002793ec897dada705de84b1148aad159731c8e46f7623e1e3bf4797acf283151c2c6916a0581b55b5b9f51ba7cd69f91126d6f55b935d4c6388d64e12cf202a626422418d02246035ec8adb8926a54e7b36a67c3f1c1a04486493dddc1f7e4c3e4c6488f72e91553a2430fb6f4e6ac12dc925e2355c87a81461b239b72f4a8c4e0e4b00ba0962931a875d80d6533f3de8dcd6ed6efedc534e18332eb1d89cae2b87b0e012cb60ee72363cae092468f361407f10a109c1f7a1daa4f9c15a496050fd124d8a5d1acff660ba97120c710e8e267e848f27bf3e24baa47bc740bd340201a3e072718169e045e25d3f63209f6c95ad488d3422e141a87246bb64fe974f6ab2a7108261a3143344cf00122def1a899f64d2021afe112c172d57764df0b85264c783c2a1947aff407b38adfcf0a9cb63fa501fad6076a1b983a5dc4f188411233462554a21111a9b03b9f4825a64104efd57c4605cccffe44d59215db4bfbfc02b40e7794d0acacc6f27c18ee56b19171789127b8ed0784e7a27397b68e976f5cb743f7475fa006abc9466809b7b0fb3a12bf5a698a3d6a6e3d88efaed22d9f69432a4ae6e69a004dac885e8fe165aea93ed15a4b7df9e2edb147f9489a52fe5f81e04cd304d0fa29535c24b435d0a6c3a015044718350f291dd04146cfce718e549589ca9596b219e5523d33b59af31069b4ff835142426fddfd9a569c0ed7452e62b2ebc692bea1210dc7f4d29fd5601dded04b053c5f6988ab456c8000e06481ce34a57e5c63ac824dc0515f6fb70e5b4f9b0afdaeac753f7ac63dd0bc537db32b5a32d6951d0a0c5dbcda2882e75e5b712745a4e7d32fc37ce032d0216de3415cb58442cb18fd0b48514dc80e2cd2752ac1dbe909766cf458177fd3769a9e0a6f465c88b24699ea8b6f587c679895ff2d34ff5a6a85c4635192f0a89820cee0265a2711ccf908e5d3613674671c0b7d2204641d5d3b36ae5f972cada489f6e496c990333e5a42b2990ade8ea37ac92208a30eb737cfe9bd953bc07d8070342979027b739e224a8d35c5dabd9ac6ea662b9a58954446f27103c2443c464a9edffa145c72a75a85f16e23dcc9b4c40d6a25c6a4eee123275f1b7fd9fc854f788b4477d53a91520b86eed01ded43d5ca03fe4109657c8c4499fc350a78d9a75e6afcfe4442a6a68ec6a86f224a21a0bcd8919ac0b1d4ed3176f00559c601426cbaf67dff171b094de081d91c155c6a09bae1f00e95cdd867ba2b653272a39ef2595efd8279ff6403a94e78706bc79dbf775f21f5e31eabf41cf0d5a35c772097fc028210a5700ede92673d155af6de97210292770bfb31363691dad07c4b28e3498046fc5e7db590560ab235d16fb871d046b961c88c8040203be713a77789e8ba5b41d0f05fd861d1d3bee20dff80b35a8a309072779610339397390470f104f29c156f6024891833611689f67678978a76739c1aac0214551e3268f22a3bebb53bf0fa0c00dbdcc7c6d8c4ac28f2d2ff80f0eb908c40b38c84d70a54902d259fd40882f68a35913b0c1d3320054804d92a4a7a4e6b86b1816c1b90258c375406875cabc6447a9a8ca917eccab2227ea33a17ac3ed02a3a8fca0af8ce1e4dade4b688c7dea2a0d89a819d6917f3ab7be2514e462d7eb2fc2052cdc625cc375406875cabc6447a9a8ca917eccab2227ea33a17ac3ed02a3a8fca0af8ce1fdf634bbd093494501a9aec0660aa53b434fdc2c2bb989e8d0925323e511358d3815bbaa8adf5400041954decc56e8889eb56eb20bfc30053e7799703af0fc95ed8e3dbcda1d69962d09b6a40d347a8c45f70be11b83819661505599960ce1de4a7dfce2430278f9e9c6006ff40c1729c8117ea9b66e7dcd02fed98c7a8f89a5d2317483f1077eaab2f6a33c1b31704cb072fbdad75b5bca67aac8f0a8dd175e5238ca18333804a892ddb14fcb18bb3a7a6339aff5e1f19797d8904b926446e743e1e96a57e2d4dd1a7243692aa1b173b380b72a8be25ab859b884d0b7047386029834a2521a20e10869c3a9f483a7bcfcc95639214b815b1f7a3f3383cea9371ba7346cc4656b43a5ab1240236def67662175b45a1a81b798e1052ff932933be1d8fbef7e3e5c93700cd15cacd44bed66aaea51b72e70da3eb50655e7018f2083876d06e519d375e298b9b9b72fa5996402925b521ab6f5e364d00d4978635230abafd25cdd7a04ed6fa99a7c6cd5315612a6a6888fd8ff7d4596885f43f3b4019ee1ead8720a4880980c4f632fe4c18286141c3a08faaced4160246349159fc586895ab8940ddc232e93fd1d882d04f58bc0d04d56c5a53fa09285cfb3b56b6cb6c405e5bbbf0ee57e83692e7d6a3191d2c5b48aa110c2e662e6bc42115c8ba13a0ec293b4591e1bbf212f005c952923055a24ab5174da0b69438f4d07213fc54035b2bee1ecd22d5d0afbd7c3765a6feaa4177e7bb08a60fe0073c53b06f28812dac4db4b1fe949ad574a7f59dfe8a806b4342a3dd26d0adc92a4dea634cf995f2ad1491b749c73904991b8812a7b392051375380b516df1e263a16f426f5447eded8497747dda2be986be1b8f8b8cb6ea36a738cd86d2d066085e60fdc74996c6be40c7402953013eff32741d3eb4f6345fd0d1b16a1bbf19d80cf31c5ca32f3bbae594a7bab8365c64f5be456b09ddb100090df865ab586b9fa0d923cfd1944a3a0550b43da55d18afc3955576d3f248a9483c2172c1847b420d48eaf891ef93b9dc3d0641bbd442378602428314535692187774443ad621ef3d752404a1acb9b8e190fa60f2bfd81a680641cf065135b455fdccfabe8fefbb3d271110568fd0f9dee52b16af92058ebbc3e0ebd1b5fbadb97f95ca79e12d232280348dae34d9003a1de2860ed6abcb921ec9287568e723aecb5be646db1d7485795b218524b4af2e4ccbd7d6071a672a1993a755a2cd79a46414d970f5ed48545ae67f57c0819bb4b318dafbc448d3dd49c86276dd04521330f56c7f2b6108d4720bf3a4928b5d1d2b0e15d13b57635b7f664ef039b1af917e773a5f86ed46e539943101846d38991ff233a85f2a8da940ec108dfd3a3decf1acdbd2ff2339e3eef9611854fbcc60d2baa61a05a487f72371a1e1d640cfc0d212880cd160812c1c996a75ca6a1e1e7291bf1de92c06fa3da4b281f3f58d73d3fc387752610f6ee7fd573caddf6ed47f89290af24340175b3dc02fc8de356faa5bb6dd2221ed3335692de4522a55cf79d0d74a39a98db997f9160b9941e1d26226175db8c9f0a7f99dfce885b975dfda1ce58645b32d1868065752ef2ad2edeae0461a01bea913251919948f05fd31ac7ad7beabae4e6788e50a704bb03e44bbea92dd95f8dbc504b060655eda9a0d069afe9ab6c5add5c85f3a349cced0942de4701f13225c5b19ee512a0ac6eada13972e2b80f960e34f746e7eae6fb79f53d87bacc6407848a9fdd4489fc72f72418513a80728418276b95800a80917e6c40a0702df69abd7f8e16de7c874a1622e2206a54a9e8919ff644b2e59435a85674ce6d7b4b751242b91eaba7d5e3d2f1194de5e242d4d3b9730dcea5b688a7d0a3cecddf7570cbe367faee2fa51c15e906895f21a9055bab4571573a68091b795335a814f0d4ba87403658b5c5dcc4daa4fd28c8eb94181dcd60854c0c33a5dc24636addbacb1b48080afd4475fd94762c2af67d19bedb484ba16c0425cafcbdc472e2b4be512f3541b6e89985de87faf374cc69ffa3614a890261f3b3e8011490fea44fa39f0b2fb4dd84c3ff63f4941907ebb7997ce09aaa219e898fc257b241c1b0e0ef424fafa3a37739acf62cd504a40ad5849e223b51e2b54c3bdefb55155e621c830f3ac386149558234ed7920c6934f05a9a5975ece6a5348de0b16cf97b6a4e54e810bf0d51086d4351e47b0889285fd31cfa76fe375f2d04a906de95ca032fcbeed3428b1f65943af178c8420baf054600a8e1832dbc3426817f717596e5502b141e438ca2cef7c98550fecc929b875428406da255ee96857ce5b0c96be91daa7482f71364caa1e9b9a1dfac4a7e35228feb13334f1757e9360c2ab2505cc53c8ed2fdd45184fcab0d75ccc598cc1198b07405d8b0ad9f055b30ffcd1685aa4068f5d7a6a6819e2b31c1a048f05628b4b47b30ad064a314e7f742825ac46281d84a2079609eefe4b710b8ca0eb485bceb3d35b2bb09f8617732cae60fa730b19356ca188a911a3917d33b1dce8254f04bef0907189428b0182364e4815b737d60b98249d198ac0eb5cc60c4bc108e0ad3f89992f09a05b42b7920e28223a6edcccff6cee1d4c6311bafb0626f9d174ff1071f537e1a240d23c24c42a74f8d04230a9bfbedbb56f842189d0530a22bd146824cf266e9c4fda56b9ba5186238c0bf539537f3a56db4e41cfe88f747f8da7bcee943ab1e96cc33fc7d6a4b64cc2ac9902a0b3429568ca782bd29c03d67a91c69439d04238390829f9f27520fd1fa2f0f208049e592b102c842cd923bbf9b2424a314558391b9afc73bd5bf7a0ce51cd27b90873269963b0d9edfb8cef2eaa5ea57ac40216cfca4fadf8c8cbb84c2e4b961aeea09b69dd002fd057894a61545c8d1144f1baa1d9607870269208fcebd10d7a5de44afbdc6dffbce4d3bddd5a872b8396b0a31eaded2cdd394f8728dec515d2620f7ab905eb379b8a9a4d3d744b74846f407829bb60de3a42e89945f56b7840227ecaffcc127f978e2ceca9941f6c6ed1f10982950db45f7a18253614b7b3707093d5c46816f21e39a76697c4caccc8534cdbbdba930896786cdb7762d29867f38a5c53051cabd9cd9e98d49dea201a11475a11e6cc436b32a54e7d46bebdce88cdc35ca56db20fdfc470dd956525ae07954a2b90ed9df771005a9aaebd3f2dd6a6425ce8fbd8a664831adb58c1c82280fd3568d14fab38868142a765d1eb1e05d3a3be13ba7293fb7a39157b58e304de89d81c46c0332b97bbc4152273515b61ee86e67ab619ad020e9701173def06cda9b4c4f932fb041e3178f338e9f7819e83267693311b8e90eebf81d8468cb5a312725491002c5c6061c49a5488435069c7a369b6069012fef0a518e379222007f6ea7622cb1c235a35b1355bb5641ab16d26730400aff4d8033ea29e472fe29f63aa9d78068dc3a2f719385dc2a612ccf884111f911a8095798fda2a7c708e20a931d2c228e637ff82de3ff44794d2d0ae92ebf6b56361527f081803c4067263ea97f44637ce2cc329168fb17e4e193fc40d447f1c34c1851298028e561e8aaefde8c9c3ebcc2f965ff81f9a603f2d9e4fc5013b8e96cde431fcacb828c6ea5de97d02f659ac02f42bb2310b7ad173897ff55e29848cb6ddbfe90bea82fd2c26e507de666833a1ff45dfd545a4bf5bb6254d118d93863940b076a247af19a993950ea1b736e2281209ea23f71c7b3df75bb9a84b7bf1b5ea18d92145a2fc6c696d04029a994db1e2bdb440e3be7852d8b19dece4884a43ff92165799d801017de37f236f6b17df21bef7f011c30129adf456d2d1f1beaa145fc5bfad7735d4b0c74433f0f9a90d2eab004a3e4732ddf882b86f5bdba96150ad07ceb9d437d947168c383d87ce90583a586b76f95c22c07a159666084dde4a5621db3d599df8790791be1a195a07bf2d7324c3b8239d2cd23bf1eae963932c33017e3b35c4ccc2a1f8bb0f4e0bbc5bc0852ccaf79c7660e693d7d67b87f44bb8928715688c2e5c48ab4dd14771d018ed48668c1ec28ad224ecd1a2a99313e3d0695b581b901d3bc63681ba059d07c0bb02dd55631c5e6b15918ad074ead9aa983d9f6174c03046827ba14cf597f38187fbd80255ea391271c60759a4f534325c41515484da0c34dbd68c3e2d65bbce0c4c9c0994e9200097b4b39551a91e980ef62c48825d5f69908c49c576358df7483f8129ea318e38cf5d012431aa2b37dea3ba5fd4890f52e744222444cbc0ae5a5d3d012334ce64ec1e16c831fe041675b8f23a0b7520cfe9a193922ac12b23de3bf7eb8ff6e69d5c0717511a9f2620332f9e5613639fd35ca15f19ca30da2730af30c442d377428ae8123426156133bcfa37d7a99f1ee53f1366070e78a29cb7234ab31720f2ca90c956cd003ebccb4b0698a90e1d2a0fe00e9d281a7dc29dd4edca9b38a1dd75daf37d02eac215e9cb6862f95dd21552d913d3ffaf773fa49a81455fa745ae5606e88ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903rootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootsnapd-2.57.6-1.el8.src.rpmbundled(golang(github.com/coreos/go-systemd/activation))bundled(golang(github.com/godbus/dbus))bundled(golang(github.com/godbus/dbus/introspect))bundled(golang(github.com/gorilla/mux))bundled(golang(github.com/jessevdk/go-flags))bundled(golang(github.com/juju/ratelimit))bundled(golang(github.com/kr/pretty))bundled(golang(github.com/kr/text))bundled(golang(github.com/mvo5/goconfigparser))bundled(golang(github.com/seccomp/libseccomp-golang))bundled(golang(github.com/snapcore/bolt))bundled(golang(github.com/snapcore/go-gettext))bundled(golang(golang.org/x/crypto/openpgp/armor))bundled(golang(golang.org/x/crypto/openpgp/packet))bundled(golang(golang.org/x/crypto/sha3))bundled(golang(golang.org/x/crypto/ssh/terminal))bundled(golang(golang.org/x/xerrors))bundled(golang(golang.org/x/xerrors/internal))bundled(golang(gopkg.in/check.v1))bundled(golang(gopkg.in/macaroon.v1))bundled(golang(gopkg.in/mgo.v2/bson))bundled(golang(gopkg.in/retry.v1))bundled(golang(gopkg.in/tomb.v2))bundled(golang(gopkg.in/yaml.v2))bundled(golang(gopkg.in/yaml.v3))golang(github.com/snapcore/snapd/advisor)golang(github.com/snapcore/snapd/arch)golang(github.com/snapcore/snapd/asserts)golang(github.com/snapcore/snapd/asserts/assertstest)golang(github.com/snapcore/snapd/asserts/internal)golang(github.com/snapcore/snapd/asserts/signtool)golang(github.com/snapcore/snapd/asserts/snapasserts)golang(github.com/snapcore/snapd/asserts/sysdb)golang(github.com/snapcore/snapd/asserts/systestkeys)golang(github.com/snapcore/snapd/boot)golang(github.com/snapcore/snapd/boot/boottest)golang(github.com/snapcore/snapd/bootloader)golang(github.com/snapcore/snapd/bootloader/androidbootenv)golang(github.com/snapcore/snapd/bootloader/assets)golang(github.com/snapcore/snapd/bootloader/assets/genasset)golang(github.com/snapcore/snapd/bootloader/bootloadertest)golang(github.com/snapcore/snapd/bootloader/efi)golang(github.com/snapcore/snapd/bootloader/grubenv)golang(github.com/snapcore/snapd/bootloader/lkenv)golang(github.com/snapcore/snapd/bootloader/ubootenv)golang(github.com/snapcore/snapd/client)golang(github.com/snapcore/snapd/client/clientutil)golang(github.com/snapcore/snapd/cmd/snap)golang(github.com/snapcore/snapd/cmd/snap-bootstrap)golang(github.com/snapcore/snapd/cmd/snap-bootstrap/triggerwatch)golang(github.com/snapcore/snapd/cmd/snap-exec)golang(github.com/snapcore/snapd/cmd/snap-failure)golang(github.com/snapcore/snapd/cmd/snap-preseed)golang(github.com/snapcore/snapd/cmd/snap-recovery-chooser)golang(github.com/snapcore/snapd/cmd/snap-repair)golang(github.com/snapcore/snapd/cmd/snap-seccomp)golang(github.com/snapcore/snapd/cmd/snap-seccomp/syscalls)golang(github.com/snapcore/snapd/cmd/snap-update-ns)golang(github.com/snapcore/snapd/cmd/snapctl)golang(github.com/snapcore/snapd/cmd/snapd)golang(github.com/snapcore/snapd/cmd/snaplock)golang(github.com/snapcore/snapd/cmd/snaplock/runinhibit)golang(github.com/snapcore/snapd/daemon)golang(github.com/snapcore/snapd/dbusutil)golang(github.com/snapcore/snapd/dbusutil/dbustest)golang(github.com/snapcore/snapd/desktop/notification)golang(github.com/snapcore/snapd/desktop/notification/notificationtest)golang(github.com/snapcore/snapd/dirs)golang(github.com/snapcore/snapd/docs)golang(github.com/snapcore/snapd/errtracker)golang(github.com/snapcore/snapd/features)golang(github.com/snapcore/snapd/gadget)golang(github.com/snapcore/snapd/gadget/edition)golang(github.com/snapcore/snapd/gadget/install)golang(github.com/snapcore/snapd/gadget/internal)golang(github.com/snapcore/snapd/gadget/quantity)golang(github.com/snapcore/snapd/httputil)golang(github.com/snapcore/snapd/i18n)golang(github.com/snapcore/snapd/i18n/xgettext-go)golang(github.com/snapcore/snapd/image)golang(github.com/snapcore/snapd/interfaces)golang(github.com/snapcore/snapd/interfaces/apparmor)golang(github.com/snapcore/snapd/interfaces/backends)golang(github.com/snapcore/snapd/interfaces/builtin)golang(github.com/snapcore/snapd/interfaces/dbus)golang(github.com/snapcore/snapd/interfaces/hotplug)golang(github.com/snapcore/snapd/interfaces/ifacetest)golang(github.com/snapcore/snapd/interfaces/kmod)golang(github.com/snapcore/snapd/interfaces/mount)golang(github.com/snapcore/snapd/interfaces/policy)golang(github.com/snapcore/snapd/interfaces/seccomp)golang(github.com/snapcore/snapd/interfaces/systemd)golang(github.com/snapcore/snapd/interfaces/udev)golang(github.com/snapcore/snapd/interfaces/utils)golang(github.com/snapcore/snapd/jsonutil)golang(github.com/snapcore/snapd/jsonutil/safejson)golang(github.com/snapcore/snapd/kernel)golang(github.com/snapcore/snapd/logger)golang(github.com/snapcore/snapd/metautil)golang(github.com/snapcore/snapd/netutil)golang(github.com/snapcore/snapd/osutil)golang(github.com/snapcore/snapd/osutil/disks)golang(github.com/snapcore/snapd/osutil/mount)golang(github.com/snapcore/snapd/osutil/squashfs)golang(github.com/snapcore/snapd/osutil/strace)golang(github.com/snapcore/snapd/osutil/sys)golang(github.com/snapcore/snapd/osutil/udev/crawler)golang(github.com/snapcore/snapd/osutil/udev/netlink)golang(github.com/snapcore/snapd/overlord)golang(github.com/snapcore/snapd/overlord/assertstate)golang(github.com/snapcore/snapd/overlord/assertstate/assertstatetest)golang(github.com/snapcore/snapd/overlord/auth)golang(github.com/snapcore/snapd/overlord/cmdstate)golang(github.com/snapcore/snapd/overlord/configstate)golang(github.com/snapcore/snapd/overlord/configstate/config)golang(github.com/snapcore/snapd/overlord/configstate/configcore)golang(github.com/snapcore/snapd/overlord/configstate/proxyconf)golang(github.com/snapcore/snapd/overlord/configstate/settings)golang(github.com/snapcore/snapd/overlord/devicestate)golang(github.com/snapcore/snapd/overlord/devicestate/devicestatetest)golang(github.com/snapcore/snapd/overlord/devicestate/fde)golang(github.com/snapcore/snapd/overlord/devicestate/internal)golang(github.com/snapcore/snapd/overlord/healthstate)golang(github.com/snapcore/snapd/overlord/hookstate)golang(github.com/snapcore/snapd/overlord/hookstate/ctlcmd)golang(github.com/snapcore/snapd/overlord/hookstate/hooktest)golang(github.com/snapcore/snapd/overlord/ifacestate)golang(github.com/snapcore/snapd/overlord/ifacestate/ifacerepo)golang(github.com/snapcore/snapd/overlord/ifacestate/udevmonitor)golang(github.com/snapcore/snapd/overlord/patch)golang(github.com/snapcore/snapd/overlord/servicestate)golang(github.com/snapcore/snapd/overlord/snapshotstate)golang(github.com/snapcore/snapd/overlord/snapshotstate/backend)golang(github.com/snapcore/snapd/overlord/snapstate)golang(github.com/snapcore/snapd/overlord/snapstate/backend)golang(github.com/snapcore/snapd/overlord/snapstate/policy)golang(github.com/snapcore/snapd/overlord/snapstate/snapstatetest)golang(github.com/snapcore/snapd/overlord/standby)golang(github.com/snapcore/snapd/overlord/state)golang(github.com/snapcore/snapd/overlord/storecontext)golang(github.com/snapcore/snapd/polkit)golang(github.com/snapcore/snapd/progress)golang(github.com/snapcore/snapd/progress/progresstest)golang(github.com/snapcore/snapd/randutil)golang(github.com/snapcore/snapd/release)golang(github.com/snapcore/snapd/sandbox)golang(github.com/snapcore/snapd/sandbox/apparmor)golang(github.com/snapcore/snapd/sandbox/cgroup)golang(github.com/snapcore/snapd/sandbox/seccomp)golang(github.com/snapcore/snapd/sandbox/selinux)golang(github.com/snapcore/snapd/sanity)golang(github.com/snapcore/snapd/secboot)golang(github.com/snapcore/snapd/seed)golang(github.com/snapcore/snapd/seed/internal)golang(github.com/snapcore/snapd/seed/seedtest)golang(github.com/snapcore/snapd/seed/seedwriter)golang(github.com/snapcore/snapd/snap)golang(github.com/snapcore/snapd/snap/channel)golang(github.com/snapcore/snapd/snap/internal)golang(github.com/snapcore/snapd/snap/naming)golang(github.com/snapcore/snapd/snap/pack)golang(github.com/snapcore/snapd/snap/snapdir)golang(github.com/snapcore/snapd/snap/snapenv)golang(github.com/snapcore/snapd/snap/snapfile)golang(github.com/snapcore/snapd/snap/snaptest)golang(github.com/snapcore/snapd/snap/squashfs)golang(github.com/snapcore/snapd/snapdenv)golang(github.com/snapcore/snapd/snapdtool)golang(github.com/snapcore/snapd/spdx)golang(github.com/snapcore/snapd/store)golang(github.com/snapcore/snapd/store/storetest)golang(github.com/snapcore/snapd/strutil)golang(github.com/snapcore/snapd/strutil/chrorder)golang(github.com/snapcore/snapd/strutil/quantity)golang(github.com/snapcore/snapd/strutil/shlex)golang(github.com/snapcore/snapd/sysconfig)golang(github.com/snapcore/snapd/systemd)golang(github.com/snapcore/snapd/testutil)golang(github.com/snapcore/snapd/timeout)golang(github.com/snapcore/snapd/timeutil)golang(github.com/snapcore/snapd/timings)golang(github.com/snapcore/snapd/usersession/agent)golang(github.com/snapcore/snapd/usersession/autostart)golang(github.com/snapcore/snapd/usersession/client)golang(github.com/snapcore/snapd/usersession/userd)golang(github.com/snapcore/snapd/usersession/userd/ui)golang(github.com/snapcore/snapd/usersession/xdgopenproxy)golang(github.com/snapcore/snapd/wrappers)golang(github.com/snapcore/snapd/x11)snapd-devel    rpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)3.0.4-14.6.0-14.0-15.2-14.14.3cEcs@cMCc5c#c@bbz@bb֜bγbʿ@bmbb@bbb1@b{@bm$bY^@bT@bP#bMb8hb8hb8hb+9b b8b a@aaaɪap@a{a@a@a@aaaKa(@a(@aqV@a\>@a\>@aTU@a2@a/k@a(aGaS@aa`@`@``@`Ȗ@`````@`]`F`>(`+`%@`#`>`U_I@_إ@_@_^@_E@_~@_s!_R,@_D@_)M_%Y@_!d_ @___X@^(@^3^^^_^^v^p^E:@^C^2@^0"@^@^]B]߶]e@]@]*]µ]{@])]4@]?]nU]i]:@](v@] ]@\\\]@\t@\!\-@\@\C@\|\|\w@\w@\v{\k\j@\Z@\Z@\V\P@@\?\@\@[[H[H[@[v[@[^[ā@[R@[R@[["@[D[z@[[ @[P}@[M@[I[?Y[,[+@[oZ@ZZZZԐ@ZJ@ZZZZZx@ZZ=Zw@Z1@ZZ Z}@ZyZiZ7Z6\@Zr@Zr@Z@ZC@YZ@YZ@Y@Y@Y@YYY@YYYܶ@Y@Y˒YY)@Y4Y@@YYYY3Y3Y3YYYJYJY@YyY&@Y!@Y;@Y#@X@X@Xߖ@XDX@XۡXƉXX`@XWu@W:W@W@W@W@W@W@W@W@W@W@Wm Wc@W_WZMaciek Borzecki Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Alberto Mardegan Michael Vogt Fedora Release Engineering - 2.56.2-5Maxwell G - 2.56.2-4Michael Vogt Maxwell G - 2.56.2-2Maxwell G - 2.56.2-2Maciek Borzecki - 2.56.2-1Robert-André Mauchin - 2.55.3-2Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt David King - 2.55.3-2Maciek Borzecki - 2.55.3-1Michael Vogt Maciek Borzecki - 2.55.2-1Ian Johnson Ian Johnson Ian Johnson Maciek Borzecki - 2.54.4-1Michael Vogt Maciek Borzecki - 2.54.3-1Michael Vogt Maciek Borzecki - 2.54.2-1Fedora Release Engineering - 2.54.1-2Ian Johnson Maciek Borzecki - 2.54.1-1Michael Vogt Michael Vogt Maciek Borzecki - 2.53.4-1Ian Johnson Ian Johnson Maciek Borzecki - 2.53.2-2Maciek Borzecki - 2.53.2-1Ian Johnson Maciek Borzecki - 2.53.1-2Maciek Borzecki - 2.53.1-1Ian Johnson Michael Vogt Michael Vogt Maciek Borzecki - 2.52-1Ian Johnson Maciek Borzecki - 2.51.7-1Ian Johnson Ian Johnson Ian Johnson Ian Johnson Maciek Borzecki - 2.51-4Maciek Borzecki - 2.51-3Fedora Release Engineering - 2.51-2Ian Johnson Michael Vogt Michael Vogt Maciek Borzecki - 2.51-1Ian Johnson Ian Johnson Maciek Borzecki - 2.50-1Michael Vogt Michael Vogt Michael Vogt Zbigniew Jędrzejewski-Szmek - 2.49-3Maciek Borzecki - 2.49-2Maciek Borzecki - 2.49-1Michael Vogt Maciek Borzecki - 2.48.2-3Fedora Release Engineering - 2.48.2-2Maciek Borzecki - 2.48.2-1Michael Vogt Michael Vogt Michael Vogt Maciek Borzecki - 2.47.1-1Michael Vogt Michael Vogt Michael Vogt Michael Vogt Maciek Borzecki - 2.45.3.1-1Fedora Release Engineering - 2.45.2-3Fedora Release Engineering - 2.45.2-2Samuele Pedroni Zygmunt Krynicki Maciek Borzecki - 2.45.2-1Michael Vogt Maciek Borzecki - 2.45.1-1Michael Vogt Maciek Borzecki - 2.45-1Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Maciek Borzecki - 2.43.3-1Michael Vogt Fedora Release Engineering - 2.42.2-2Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Maciek Borzecki - 2.42.2-1Michael Vogt Maciek Borzecki - 2.42.1-1Michael Vogt Maciek Borzecki - 2.42-2Maciek Borzecki - 2.42-1Michael Vogt Neal Gompa - 2.41-1Michael Vogt Fedora Release Engineering - 2.39.2-2Michael Vogt Michael Vogt Neal Gompa - 2.39.2-1Maciej Borzecki - 2.39.1-2Michael Vogt Neal Gompa - 2.39.1-1Michael Vogt Neal Gompa - 2.39-1Michael Vogt Robert-André Mauchin - 2.38-3Neal Gompa - 2.38-2Neal Gompa - 2.38-1Michael Vogt Neal Gompa - 2.37.4-2Zygmunt Bazyli Krynicki - 2.37.4-1Michael Vogt Zygmunt Bazyli Krynicki - 2.37.3-1Michael Vogt Neal Gompa - 2.37.2-1Michael Vogt Fedora Release Engineering - 2.36.3-2Michael Vogt Michael Vogt Neal Gompa - 2.36.3-1Michael Vogt Michael Vogt Neal Gompa - 2.36-4Neal Gompa - 2.36-3Neal Gompa - 2.36-2Michael Vogt Neal Gompa - 2.36-1Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Neal Gompa - 2.35-1Michael Vogt Michael Vogt Michael Vogt Michael Vogt Fedora Release Engineering - 2.33.1-2Michael Vogt Neal Gompa - 2.33.1-1Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Neal Gompa - 2.32.4-1Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Neal Gompa - 2.31.1-2Neal Gompa - 2.31.1-1Michael Vogt Fedora Release Engineering - 2.30-2Michael Vogt Neal Gompa - 2.30-1Michael Vogt Neal Gompa - 2.29.4-3Neal Gompa - 2.29.4-2Neal Gompa - 2.29.4-1Michael Vogt Michael Vogt Michael Vogt Michael Vogt Michael Vogt Neal Gompa - 2.28.5-2Neal Gompa - 2.28.5-1Michael Vogt Neal Gompa - 2.28.4-1Michael Vogt Michael Vogt Michael Vogt Neal Gompa - 2.28.1-1Michael Vogt Michael Vogt Neal Gompa - 2.27.6-1Michael Vogt Neal Gompa - 2.27.5-1Michael Vogt Michael Vogt Michael Vogt Neal Gompa - 2.27.2-2Neal Gompa - 2.27.2-1Michael Vogt Neal Gompa - 2.27.1-1Michael Vogt Neal Gompa - 2.27-1Michael Vogt Fedora Release Engineering - 2.26.3-5Fedora Release Engineering - 2.26.3-4Neal Gompa - 2.26.3-3Neal Gompa - 2.26.3-2Neal Gompa - 2.26.3-1Neal Gompa - 2.25-1Neal Gompa - 2.24-1Neal Gompa - 2.23.6-4Neal Gompa - 2.23.6-3Neal Gompa - 2.23.6-2Neal Gompa - 2.23.6-1Neal Gompa - 2.23.5-1Neal Gompa - 2.23.1-1Fedora Release Engineering - 2.16-2Zygmunt Krynicki - 2.16-1Neal Gompa - 2.14-2Zygmunt Krynicki - 2.14-1Zygmunt Krynicki - 2.13-1Zygmunt Krynicki - 2.12-2Zygmunt Krynicki - 2.12-1Zygmunt Krynicki - 2.11-8Zygmunt Krynicki - 2.11-7Zygmunt Krynicki - 2.11-6Zygmunt Krynicki - 2.11-5Zygmunt Krynicki - 2.11-4Zygmunt Krynicki - 2.11-3Zygmunt Krynicki - 2.11-2Zygmunt Krynicki - 2.11-1Zygmunt Krynicki - 2.0.9-2Zygmunt Krynicki - 2.0.9Zygmunt Krynicki - 2.0.8.1Zygmunt Krynicki - 2.0.8- Release 2.57.6 to Fedora- New upstream release 2.57.6 - bugfixes- New upstream release 2.57.5 - image: clean snapd mount after preseeding - wrappers,snap/quota: clear LogsDirectory= in the service unit for journal namespaces - cmd/snap,daemon: allow zero values from client to daemon for journal rate-limit - interfaces: steam-support allow pivot /run/media and /etc/nvidia mount - o/ifacestate: introduce DebugAutoConnectCheck hook - release, snapd-apparmor, syscheck: distinguish WSL1 and WSL2 - autopkgtests: fix running autopkgtest on kinetic - interfaces: add microceph interface - interfaces: steam-support allow additional mounts - many: add stub services - interfaces: add kconfig paths to system-observe - i/b/system_observe: honour root dir when checking for /boot/config-* - interfaces: grant access to speech-dispatcher socket - interfaces: rework logic of unclashMountEntries- New upstream release 2.57.4 - release, snapd-apparmor: fixed outdated WSL detection - overlord/ifacestate: fix conflict detection of auto-connection - overlord: run install-device hook during factory reset - image/preseed/preseed_linux: add missing new line - boot: add factory-reset cases for boot-flags. - interfaces: added read/write access to /proc/self/coredump_filter for process-control - interfaces: add read access to /proc/cgroups and /proc/sys/vm/swappiness to system-observe - fde: run fde-reveal-key with `DefaultDependencies=no` - snapdenv: added wsl to userAgent - tests: fix restore section for persistent-journal-namespace - i/b/mount-control: add optional `/` to umount rules - cmd/snap-bootstrap: changes to be able to boot classic rootfs - cmd/snap-bootstrap: add CVM mode- New upstream release 2.57.3 - wrappers: journal namespaces did not honor journal.persistent - snap/quota,wrappers: allow using 0 values for the journal rate to override the system default values - multiple: clear up naming convention for cpu-set quota - i/b/mount-control: allow custom filesystem types - i/b/system-observe: allow reading processes security label - sandbox/cgroup: don't check V1 cgroup if V2 is active - asserts,boot,secboot: switch to a secboot version measuring classic- New upstream release 2.57.2 - store/tooling,tests: support UBUNTU_STORE_URL override env var - packaging/*/tests/integrationtests: reload ssh.service, not sshd.service - tests: check snap download with snapcraft v7+ export-login auth data - store/tooling: support using snapcraft v7+ base64-encoded auth data - many: progress bars should use the overridable stdouts - many: refactor store code to be able to use simpler form of auth creds - snap,store: drop support/consideration for anonymous download urls - data: include snapd/mounts in preseeded blob - many: Set SNAPD_APPARMOR_REEXEC=1 - overlord: track security profiles for non-active snaps- New upstream release 2.57.1 - cmd/snap-update-ns: handle mountpoint removal failures with EBUSY - cmd/snap-update-ns: print current mount entries - cmd/snap-update-ns: check the unused mounts with a cleaned path - snap-confine: disable -Werror=array-bounds in __overflow tests to fix build error on Ubuntu 22.10 - systemd: add `WantedBy=default.target` to snap mount units (LP: #1983528)- New upstream release 2.57 - tests: Fix calls to systemctl is-system-running - osutil/disks: handle GPT for 4k disk and too small tables - packaging: import change from the 2.54.3-1.1 upload - many: revert "features: disable refresh-app-awarness by default again" - tests: improve robustness of preparation for regression/lp-1803542 - tests: get the ubuntu-image binary built with test keys - tests: remove commented code from lxd test - interfaces/builtin: add more permissions for steam-support - tests: skip interfaces-network-control on i386 - tests: tweak the "tests/nested/manual/connections" test - interfaces: posix-mq: allow specifying message queue paths as an array - bootloader/assets: add ttyS0,115200n8 to grub.cfg - i/b/desktop,unity7: remove name= specification on D-Bus signals - tests: ensure that microk8s does not produce DENIED messages - many: support non-default provenance snap-revisions in DeriveSideInfo - tests: fix `core20-new-snapd-does-not-break-old-initrd` test - many: device and provenance revision authority cross checks - tests: fix nested save-data test on 22.04 - sandbox/cgroup: ignore container slices when tracking snaps - tests: improve 'ignore-running' spread test - tests: add `debug:` section to `tests/nested/manual/connections` - tests: remove leaking `pc-kernel.snap` in `repack_kernel_snap` - many: preparations for revision authority cross checks including device scope - daemon,overlord/servicestate: followup changes from PR #11960 to snap logs - cmd/snap: fix visual representation of 'AxB%' cpu quota modifier. - many: expose and support provenance from snap.yaml metadata - overlord,snap: add support for per-snap storage on ubuntu-save - nested: fix core-early-config nested test - tests: revert lxd change to support nested lxd launch - tests: add invariant check for leftover cgroup scopes - daemon,systemd: introduce support for namespaces in 'snap logs' - cmd/snap: do not track apps that wish to stay outside of the life- cycle system - asserts: allow classic + snaps models and add distribution to model - cmd/snap: add snap debug connections/connection commands - data: start snapd after time-set.target - tests: remove ubuntu 21.10 from spread tests due to end of life - tests: Update the whitebox word to avoid inclusive naming issues - many: mount gadget in run folder - interfaces/hardware-observe: clean up reading access to sysfs - tests: use overlayfs for interfaces-opengl-nvidia test - tests: update fake-netplan-apply test for 22.04 - tests: add executions for ubuntu 22.04 - tests: enable centos-9 - tests: make more robust the files check in preseed-core20 test - bootloader/assets: add fallback entry to grub.cfg - interfaces/apparmor: add permissions for per-snap directory on ubuntu-save partition - devicestate: add more path to `fixupWritableDefaultDirs()` - boot,secboot: reset DA lockout counter after successful boot - many: Revert "overlord,snap: add support for per-snap storage on ubuntu-save" - overlord,snap: add support for per-snap storage on ubuntu-save - tests: exclude centos-7 from kernel-module-load test - dirs: remove unused SnapAppArmorAdditionalDir - boot,device: extract SealedKey helpers from boot to device - boot,gadget: add new `device.TpmLockoutAuthUnder()` and use it - interfaces/display-control: allow changing brightness value - asserts: add more context to key expiry error - many: introduce IsUndo flag in LinkContext - i/apparmor: allow calling which.debianutils - tests: new profile id for apparmor in test preseed-core20 - tests: detect 403 in apt-hooks and skip test in this case - overlord/servicestate: restart the relevant journald service when a journal quota group is modified - client,cmd/snap: add journal quota frontend (5/n) - gadget/device: introduce package which provides helpers for locations of things - features: disable refresh-app-awarness by default again - many: install bash completion files in writable directory - image: fix handling of var/lib/extrausers when preseeding uc20 - tests: force version 2.48.3 on xenial ESM - tests: fix snap-network-erros on uc16 - cmd/snap-confine: be compatible with a snap rootfs built as a tmpfs - o/snapstate: allow install of unasserted gadget/kernel on dangerous models - interfaces: dynamic loading of kernel modules - many: add optional primary key provenance to snap-revision, allow delegating via snap-declaration revision-authority - tests: fix boringcripto errors in centos7 - tests: fix snap-validate-enforce in opensuse-tumbleweed - test: print User-Agent on failed checks - interfaces: add memory stats to system_observe - interfaces/pwm: Remove implicitOnCore/implicitOnClassic - spread: add openSUSE Leap 15.4 - tests: disable core20-to-core22 nested test - tests: fix nested/manual/connections test - tests: add spread test for migrate-home command - overlord/servicestate: refresh security profiles when services are affected by quotas - interfaces/apparmor: add missing apparmor rules for journal namespaces - tests: add nested test variant that adds 4k sector size - cmd/snap: fix test failing due to timezone differences - build-aux/snap: build against the snappy-dev/image PPA - daemon: implement api handler for refresh with enforced validation sets - preseed: suggest to install "qemu-user-static" - many: add migrate-home debug command - o/snapstate: support passing validation sets to storehelpers via RevisionOptions - cmd/snapd-apparmor: fix unit tests on distros which do not support reexec - o/devicestate: post factory reset ensure, spread test update - tests/core/basic20: Enable on uc22 - packaging/arch: install snapd-apparmor - o/snapstate: support migrating snap home as change - tests: enable snapd.apparmor service in all the opensuse systems - snapd-apparmor: add more integration-ish tests - asserts: store required revisions for missing snaps in CheckInstalledSnaps - overlord/ifacestate: fix path for journal redirect - o/devicestate: factory reset with encryption - cmd/snapd-apparmor: reimplement snapd-apparmor in Go - squashfs: improve error reporting when `unsquashfs` fails - o/assertstate: support multiple extra validation sets in EnforcedValidationSets - tests: enable mount-order-regression test for arm devices - tests: fix interfaces network control - interfaces: update AppArmor template to allow read the memory … - cmd/snap-update-ns: add /run/systemd to unrestricted paths - wrappers: fix LogNamespace being written to the wrong file - boot: release the new PCR handles when sealing for factory reset - tests: add support fof uc22 in test uboot-unpacked-assets - boot: post factory reset cleanup - tests: add support for uc22 in listing test - spread.yaml: add ubuntu-22.04-06 to qemu-nested - gadget: check also mbr type when testing for implicit data partition - interfaces/system-packages-doc: allow read-only access to /usr/share/cups/doc-root/ and /usr/share/gimp/2.0/help/ - tests/nested/manual/core20-early-config: revert changes that disable netplan checks - o/ifacestate: warn if the snapd.apparmor service is disabled - tests: add spread execution for fedora 36 - overlord/hookstate/ctlcmd: fix timestamp coming out of sync in unit tests - gadget/install: do not assume dm device has same block size as disk - interfaces: update network-control interface with permissions required by resolvectl - secboot: stage and transition encryption keys - secboot, boot: support and use alternative PCR handles during factory reset - overlord/ifacestate: add journal bind-mount snap layout when snap is in a journal quota group (4/n) - secboot/keymgr, cmd/snap-fde-keymgr: two step encryption key change - cmd/snap: cleanup and make the code a bit easier to read/maintain for quota options - overlord/hookstate/ctlcmd: add 'snapctl model' command (3/3) - cmd/snap-repair: fix snap-repair tests silently failing - spread: drop openSUSE Leap 15.2 - interfaces/builtin: remove the name=org.freedesktop.DBus restriction in cups-control AppArmor rules - wrappers: write journald config files for quota groups with journal quotas (3/n) - o/assertstate: auto aliases for apps that exist - o/state: use more detailed NoStateError in state - tests/main/interfaces-browser-support: verify jupyter notebooks access - o/snapstate: exclude services from refresh app awareness hard running check - tests/main/nfs-support: be robust against umount failures - tests: update centos images and add new centos 9 image - many: print valid/invalid status on snap validate --monitor - secboot, boot: TPM provisioning mode enum, introduce reprovisioning - tests: allow to re-execute aborted tests - cmd/snapd-apparmor: add explicit WSL detection to is_container_with_internal_policy - tests: avoid launching lxd inside lxd on cloud images - interfaces: extra htop apparmor rules - gadget/install: encrypted system factory reset support - secboot: helpers for dealing with PCR handles and TPM resources - systemd: improve error handling for systemd-sysctl command - boot, secboot: separate the TPM provisioning and key sealing - o/snapstate: fix validation sets restoring and snap revert on failed refresh - interfaces/builtin/system-observe: extend access for htop - cmd/snap: support custom apparmor features dir with snap prepare- image - interfaces/mount-observe: Allow read access to /run/mount/utab - cmd/snap: add help strings for set-quota options - interfaces/builtin: add README file - cmd/snap-confine: mount support cleanups - overlord: execute snapshot cleanup in task - i/b/accounts_service: fix path of introspectable objects - interfaces/opengl: update allowed PCI accesses for RPi - configcore: add core.system.ctrl-alt-del-action config option - many: structured startup timings - spread: switch back to building ubuntu-image from source - many: optional recovery keys - tests/lib/nested: fix unbound variable - run-checks: fail on equality checks w/ ErrNoState - snap-bootstrap: Mount as private - tests: Test for gadget connections - tests: set `br54.dhcp4=false` in the netplan-cfg test - tests: core20 preseed/nested spread test - systemd: remove the systemctl stop timeout handling - interfaces/shared-memory: Update AppArmor permissions for mmap+link - many: replace ErrNoState equality checks w/ errors.Is() - cmd/snap: exit w/ non-zero code on missing snap - systemd: fix snapd systemd-unit stop progress notifications - .github: Trigger daily riscv64 snapd edge builds - interfaces/serial-port: add ttyGS to serial port allow list - interfaces/modem-manager: Don't generate DBus plug policy - tests: add spread test to test upgrade from release snapd to current - wrappers: refactor EnsureSnapServices - testutil: add ErrorIs test checker - tests: import spread shellcheck changes - cmd/snap-fde-keymgr: best effort idempotency of add-recovery-key - interfaces/udev: refactor handling of udevadm triggers for input - secboot: support for changing encryption keys via keymgr- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild- Rebuild for CVE-2022-{1705,32148,30631,30633,28131,30635,30632,30630,1962} in golang- New upstream release 2.56.3 - devicestate: add more path to `fixupWritableDefaultDirs()` - many: introduce IsUndo flag in LinkContext - i/apparmor: allow calling which.debianutils - interfaces: update AppArmor template to allow reading snap's memory statistics - interfaces: add memory stats to system_observe - i/b/{mount,system}-observe: extend access for htop - features: disable refresh-app-awarness by default again - image: fix handling of var/lib/extrausers when preseeding uc20 - interfaces/modem-manager: Don't generate DBus policy for plugs - interfaces/modem-manager: Only generate DBus plug policy on Core - interfaces/serial_port_test: fix static-checks errors - interfaces/serial-port: add USB gadget serial devices (ttyGSX) to allowed list - interface/serial_port_test: adjust variable IDs- Only build on %golang_arches (i.e. where golang is available). - Rebuild to fix update ordering issues.- Rebuild for CVE-2022-{24675,28327,29526 in golang}- Release 2.56.2 to Fedora and EPEL- Rebuilt for CVE-2022-1996, CVE-2022-24675, CVE-2022-28327, CVE-2022-27191, CVE-2022-29526, CVE-2022-30629- New upstream release 2.56.2 - o/snapstate: exclude services from refresh app awareness hard running check - cmd/snap: support custom apparmor features dir with snap prepare-image- New upstream release 2.56.1 - gadget/install: do not assume dm device has same block size as disk - gadget: check also mbr type when testing for implicit data partition - interfaces: update network-control interface with permissions required by resolvectl - interfaces/builtin: remove the name=org.freedesktop.DBus restriction in cups-control AppArmor rules - many: print valid/invalid status on snap validate --monitor ... - o/snapstate: fix validation sets restoring and snap revert on failed refresh - interfaces/opengl: update allowed PCI accesses for RPi - interfaces/shared-memory: Update AppArmor permissions for mmap+linkpaths- New upstream release 2.56 - portal-info: Add CommonID Field - asserts/info,mkversion.sh: capture max assertion formats in snapd/info - tests: improve the unit testing workflow to run in parallel - interfaces: allow map and execute permissions for files on removable media - tests: add spread test to verify that connections are preserved if snap refresh fails - tests: Apparmor sandbox profile mocking - cmd/snap-fde-keymgr: support for multiple devices and authorizations for add/remove recovery key - cmd/snap-bootstrap: Listen to keyboard added after start and handle switch root - interfaces,overlord: add support for adding extra mount layouts - cmd/snap: replace existing code for 'snap model' to use shared code in clientutil (2/3) - interfaces: fix opengl interface on RISC-V - interfaces: allow access to the file locking for cryptosetup in the dm-crypt interface - interfaces: network-manager: add AppArmor rule for configuring bridges - i/b/hardware-observe.go: add access to the thermal sysfs - interfaces: opengl: add rules for NXP i.MX GPU drivers - i/b/mount_control: add an optional "/" to the mount target rule - snap/quota: add values for journal quotas (journal quota 2/n) - tests: spread test for uc20 preseeding covering snap prepare-image - o/snapstate: remove deadcode breaking static checks - secboot/keymgr: extend unit tests, add helper for identify keyslot used error - tests: use new snaps.name and snaps.cleanup tools - interfaces: tweak getPath() slightly and add some more tests - tests: update snapd testing tools - client/clientutil: add shared code for printing model assertions as yaml or json (1/3) - debug-tools: list all snaps - cmd/snap: join search terms passed in the command line - osutil/disks: partition UUID lookup - o/snapshotstate: refactor snapshot read/write logic - interfaces: Allow locking in block-devices - daemon: /v2/system-recovery-keys remove API - snapstate: do not auto-migrate to ~/Snap for core22 just yet - tests: run failed tests by default - o/snapshotstate: check installed snaps before running 'save' tasks - secboot/keymgr: remove recovery key, authorize with existing key - deps: bump libseccomp to include build fixes, run unit tests using CC=clang - cmd/snap-seccomp: only compare the bottom 32-bits of the flags arg of copy_file_range - osutil/disks: helper for obtaining the UUID of a partition which is a mount point source - image/preseed: umount the base snap last after writable paths - tests: new set of nested tests for uc22 - tests: run failed tests on nested suite - interfaces: posix-mq: add new interface - tests/main/user-session-env: remove openSUSE-specific tweaks - tests: skip external backend in mem-cgroup-disabled test - snap/quota: change the journal quota period to be a time.Duration - interfaces/apparmor: allow executing /usr/bin/numfmt in the base template - tests: add lz4 dependency for jammy to avoid issues repacking kernel - snap-bootstrap, o/devicestate: use seed parallelism - cmd/snap-update-ns: correctly set sticky bit on created directories where applicable - tests: install snapd while restoring in snap-mgmt - .github: skip misspell and ineffassign on go 1.13 - many: use UC20+/pre-UC20 in user messages as needed - o/devicestate: use snap handler for copying and checksuming preseeded snaps - image, cmd/snap-preseed: allow passing custom apparmor features path - o/assertstate: fix handling of validation set tracking update in enforcing mode - packaging: restart our units only after the upgrade - interfaces: add a steam-support interface - gadget/install, o/devicestate: do not create recovery and reinstall keys during installation - many: move recovery key responsibility to devicestate/secboot, prepare for a future with just optional recovery key - tests: do not run mem-cgroup-disabled on external backends - snap: implement "star" developers - o/devicestate: fix install tests on systems with /var/lib/snapd/snap - cmd/snap-fde-keymgr, secboot: followup cleanups - seed: let SnapHandler provided a different final path for snaps - o/devicestate: implement maybeApplyPreseededData function to apply preseed artifact - tests/lib/tools: add piboot to boot_path() - interfaces/builtin: shared-memory drop plugs allow-installation: true - tests/main/user-session-env: for for opensuse - cmd/snap-fde-keymgr, secboot: add a tiny FDE key manager - tests: re-execute the failed tests when "Run failed" label is set in the PR - interfaces/builtin/custom-device: fix unit tests on hosts with different libexecdir - sandbox: move profile load/unload to sandbox/apparmor - cmd/snap: handler call verifications for cmd_quota_tests - secboot/keys: introduce a package for secboot key types, use the package throughout the code base - snap/quota: add journal quotas to resources.go - many: let provide a SnapHandler to Seed.Load*Meta* - osutil: allow setting desired mtime on the AtomicFile, preserve mtime on copy - systemd: add systemd.Run() wrapper for systemd-run - tests: test fresh install of core22-based snap (#11696) - tests: initial set of tests to uc22 nested execution - o/snapstate: migration overwrites existing snap dir - tests: fix interfaces-location-control tests leaking provider.py process - tests/nested: fix custom-device test - tests: test migration w/ revert, refresh and XDG dir creation - asserts,store: complete support for optional primary key headers for assertions - seed: support parallelism when loading/verifying snap metadata - image/preseed, cmd/snap-preseed: create and sign preseed assertion - tests: Initial changes to run nested tests on uc22 - o/snapstate: fix TestSnapdRefreshTasks test after two r-a-a PRs - interfaces: add ACRN hypervisor support - o/snapstate: exclude TypeSnapd and TypeOS snaps from refresh-app- awareness - features: enable refresh-app-awareness by default - libsnap-confine-private: show proper error when aa_change_onexec() fails - i/apparmor: remove leftover comment - gadget: drop unused code in unit tests - image, store: move ToolingStore to store/tooling package - HACKING: update info for snapcraft remote build - seed: return all essential snaps found if no types are given to LoadEssentialMeta - i/b/custom_device: fix generation of udev rules - tests/nested/manual/core20-early-config: disable netplan checks - bootloader/assets, tests: add factory-reset mode, test non- encrypted factory-reset - interfaces/modem-manager: add support for Cinterion modules - gadget: fully support multi-volume gadget asset updates in Update() on UC20+ - i/b/content: use slot.Lookup() as suggested by TODO comment - tests: install linux-tools-gcp on jammy to avoid bpftool dependency error - tests/main: add spread tests for new cpu and thread quotas - snap-debug-info: print validation sets and validation set assertions - many: renaming related to inclusive language part 2 - c/snap-seccomp: update syscalls to match libseccomp 2657109 - github: cancel workflows when pushing to pull request branches - .github: use reviewdog action from woke tool - interfaces/system-packages-doc: allow read-only access to /usr/share/gtk-doc - interfaces: add max_map_count to system-observe - o/snapstate: print pids of running processes on BusySnapError - .github: run woke tool on PR's - snapshots: follow-up on exclusions PR - cmd/snap: add check switch for snap debug state - tests: do not run mount-order-regression test on i386 - interfaces/system-packages-doc: allow read-only access to /usr/share/xubuntu-docs - interfaces/hardware_observe: add read access for various devices - packaging: use latest go to build spread - tests: Enable more tests for UC22 - interfaces/builtin/network-control: also allow for mstp and bchat devices too - interfaces/builtin: update apparmor profile to allow creating mimic over /usr/share* - data/selinux: allow snap-update-ns to mount on top of /var/snap inside the mount ns - interfaces/cpu-control: fix apparmor rules of paths with CPU ID - tests: remove the file that configures nm as default - tests: fix the change done for netplan-cfg test - tests: disable netplan-cfg test - cmd/snap-update-ns: apply content mounts before layouts - overlord/state: add a helper to detect cyclic dependencies between tasks in change - packaging/ubuntu-16.04/control: recommend `fuse3 | fuse` - many: change "transactional" flag to a "transaction" option - b/piboot.go: check EEPROM version for RPi4 - snap/quota,spread: raise lower memory quota limit to 640kb - boot,bootloader: add missing grub.cfg assets mocks in some tests - many: support --ignore-running with refresh many - tests: skip the test interfaces-many-snap-provided in trusty - o/snapstate: rename XDG dirs during HOME migration - cmd/snap,wrappers: fix wrong implementation of zero count cpu quota - i/b/kernel_module_load: expand $SNAP_COMMON in module options - interfaces/u2f-devices: add Solo V2 - overlord: add missing grub.cfg assets mocks in manager_tests.go - asserts: extend optional primary keys support to the in-memory backend - tests: update the lxd-no-fuse test - many: fix failing golangci checks - seed,many: allow to limit LoadMeta to snaps of a precise mode - tests: allow ubuntu-image to be built with a compatible snapd tree - o/snapstate: account for repeat migration in ~/Snap undo - asserts: start supporting optional primary keys in fs backend, assemble and signing - b/a: do not set console in kernel command line for arm64 - tests/main/snap-quota-groups: fix spread test - sandbox,quota: ensure cgroup is available when creating mem quotas - tests: add debug output what keeps `/home` busy - sanity: rename "sanity.Check" to "syscheck.CheckSystem" - interfaces: add pkcs11 interface - o/snapstate: undo migration on 'snap revert' - overlord: snapshot exclusions - interfaces: add private /dev/shm support to shared-memory interface - gadget/install: implement factory reset for unencrypted system - packaging: install Go snap from 1.17 channel in the integration tests - snap-exec: fix detection if `cups` interface is connected - tests: extend gadget-config-defaults test with refresh.retain - cmd/snap,strutil: move lineWrap to WordWrapPadded - bootloader/piboot: add support for armhf - snap,wrappers: add `sigint{,-all}` to supported stop-modes - packaging/ubuntu-16.04/control: depend on fuse3 | fuse - interfaces/system-packages-doc: allow read-only access to /usr/share/libreoffice/help - daemon: add a /v2/accessories/changes/{ID} endpoint - interfaces/appstream-metadata: Re-create app-info links to swcatalog - debug-tools: add script to help debugging GCE instances which fail to boot - gadget/install, kernel: more ICE helpers/support - asserts: exclude empty snap id from duplicates lookup with preseed assert - cmd/snap, signtool: move key-manager related helpers to signtool package - tests/main/snap-quota-groups: add 219 as possible exit code - store: set validation-sets on actions when refreshing - github/workflows: update golangci-lint version - run-check: use go install instead of go get - tests: set as manual the interfaces-cups-control test - interfaces/appstream-metadata: Support new swcatalog directory names - image/preseed: migrate tests from cmd/snap-preseed - tests/main/uc20-create-partitions: update the test for new Go versions - strutil: move wrapGeneric function to strutil as WordWrap - many: small inconsequential tweaks - quota: detect/error if cpu-set is used with cgroup v1 - tests: moving ubuntu-image to candidate to fix uc16 tests - image: integrate UC20 preseeding with image.Prepare - cmd/snap,client: frontend for cpu/thread quotas - quota: add test for `Resource.clone()` - many: replace use of "sanity" with more inclusive naming (part 2) - tests: switch to "test-snapd-swtpm" - i/b/network-manager: split rule with more than one peers - tests: fix restore of the BUILD_DIR in failover test on uc18 - cmd/snap/debug: sort changes by their spawn times - asserts,interfaces/policy: slot-snap-id allow-installation constraints - o/devicestate: factory reset mode, no encryption - debug-tools/snap-debug-info.sh: print message if no gadget snap found - overlord/devicestate: install system cleanups - cmd/snap-bootstrap: support booting into factory-reset mode - o/snapstate, ifacestate: pass preseeding flag to AddSnapdSnapServices - o/devicestate: restore device key and serial when assertion is found - data: add static preseed.json file - sandbox: improve error message from `ProbeCgroupVersion()` - tests: fix the nested remodel tests - quota: add some more unit tests around Resource.Change() - debug-tools/snap-debug-info.sh: add debug script - tests: workaround lxd issue lp:10079 (function not implemented) on prep-snapd-in-lxd - osutil/disks: blockdev need not be available in the PATH - cmd/snap-preseed: address deadcode linter - tests/lib/fakestore/store: return snap base in details - tests/lib/nested.sh: rm core18 snap after download - systemd: do not reload system when enabling/disabling services - i/b/kubernetes_support: add access to Java certificates- New upstream release 2.55.5 - snapstate: do not auto-migrate to ~/Snap for core22 just yet - cmd/snap-seccomp: add copy_file_range to syscallsWithNegArgsMaskHi32 - cmd/snap-update-ns: correctly set sticky bit on created directories where applicable - .github: Skip misspell and ineffassign on go 1.13 - tests: add lz4 dependency for jammy to avoid issues repacking kernel - interfaces: posix-mq: add new interface- New upstream release 2.55.4 - tests: do not run mount-order-regression test on i386 - c/snap-seccomp: update syscalls - o/snapstate: overwrite ~/.snap subdir when migrating - o/assertstate: fix handling of validation set tracking update in enforcing mode - packaging: restart our units only after the upgrade - interfaces: add a steam-support interface - features: enable refresh-app-awareness by default - i/b/custom_device: fix generation of udev rules - interfaces/system-packages-doc: allow read-only access to /usr/share/gtk-doc - interfaces/system-packages-doc: allow read-only access to /usr/share/xubuntu-docs - interfaces/builtin/network-control: also allow for mstp and bchat devices too - interfaces/builtin: update apparmor profile to allow creating mimic over /usr/share - data/selinux: allow snap-update-ns to mount on top of /var/snap inside the mount ns - interfaces/cpu-control: fix apparmor rules of paths with CPU ID- Rebuild against selinux-policy (#2070729)- Release 2.55.3 to Fedora- New upstream release 2.55.3 - cmd/snap-update-ns: apply content mounts before layouts - many: change "transactional" flag to a "transaction" option - b/piboot.go: check EEPROM version for RPi4 - snap/quota,spread: raise lower memory quota limit to 640kb - boot,bootloader: add missing grub.cfg assets mocks in some tests - many: support --ignore-running with refresh many - cmd/snap,wrappers: fix wrong implementation of zero count cpu quota - quota: add some more unit tests around Resource.Change() - quota: detect/error if cpu-set is used with cgroup v1 - quota: add test for `Resource.clone() - cmd/snap,client: frontend for cpu/thread quotas - tests: update spread test to check right XDG dirs - snap: set XDG env vars to new dirs - o/snapstate: initialize XDG dirs in HOME migration - i/b/kernel_module_load: expand $SNAP_COMMON in module options - overlord: add missing grub.cfg assets mocks in manager_tests.go - o/snapstate: account for repeat migration in ~/Snap undo - b/a: do not set console in kernel command line for arm64 - sandbox: improve error message from `ProbeCgroupVersion()` - tests/main/snap-quota-groups: fix spread test - interfaces: add pkcs11 interface - o/snapstate: undo migration on 'snap revert' - overlord: snapshot exclusions - interfaces: add private /dev/shm support to shared-memory interface - packaging: install Go snap from 1.17 channel in the integration tests - snap-exec: fix detection if `cups` interface is connected - bootloader/piboot: add support for armhf - interfaces/system-packages-doc: allow read-only access to /usr/share/libreoffice/help - daemon: add a /v2/accessories/changes/{ID} endpoint - interfaces/appstream-metadata: Re-create app-info links to swcatalog - tests/main/snap-quota-groups: add 219 as possible exit code - store: set validation-sets on actions when refreshing - interfaces/appstream-metadata: Support new swcatalog directory names - asserts,interfaces/policy: slot-snap-id allow-installation constraints - i/b/network-manager: change rule for ResolveAddress to check only label - cmd/snap-bootstrap: support booting into factory-reset mode - systemd: do not reload system when enabling/disabling services- Release 2.55.2 to Fedora- New upstream release 2.55.2 - cmd/snap-update-ns: actually use entirely non-existent dirs- New upstream release 2.55.1 - cmd/snap-update-ns/change_test.go: use non-exist name foo-runtime instead- New upstream release 2.55 - kernel/fde: add PartitionName to various structs - osutil/disks: calculate the last usable LBA instead of reading it - snap/quota: additional validation in resources.go - o/snapstate: avoid setting up single reboot when update includes base, kernel and gadget - overlord/state: add helper for aborting unready lanes - snap-bootstrap: Partially revert simplifications of mount dependencies - cmd/snap-update-ns/change.go: sort needed, desired and not reused mount entries - cmd/snap-preseed, image: move preseeding code to image/preseed - interfaces/docker-support: make generic rules not conflict with snap-confine - i/b/modem-manager: provide access to ObjectManager - i/b/network_{control,manager}.go: add more access to resolved - overlord/state: drop unused lanes field - cmd/snap: make 1.18 vet happy - o/snapstate: allow installing the snapd-desktop-integration snap even if the user-daemons feature is otherwise disabled - snap/quota: fix bug in quota group tree validation code - o/snapstate: make sure that snapd is a prerequisite for updating base snaps - bootloader: add support for piboot - i/seccomp/template.go: add close_range to the allowed syscalls - snap: add new cpu quotas - boot: support factory-reset when sealing and resealing - tests: fix test to avoid editing the test-snapd-tools snap.yaml file - dirs: remove unused SnapMetaDir variable - overlord: extend single reboot test to include a non-base, non- kernel snap - github: replace "sanity check" with "quick check" in workflow - fde: add new DeviceUnlock() call - many: replace use of "sanity" with more inclusive naming in comments - asserts: minimal changes to disable authority-delegation before full revert - tests: updating the test-snapd-cups-control-consumer snap to core20 based - many: replace use of "sanity" for interface implementation checks - cmd/snap-preseed: support for core20 preseeding - cmd: set core22 migration related env vars and update spread test - interface/opengl: allow read on /proc/sys/dev/i915/perf_stream_paranoid - tests/lib/tools/report-mongodb: fix typo in help text - tests: Include the source github url as part of the mongo db issues - o/devicestate: split mocks to separate calls for creating a model and a gadget - snap: Add missing zlib - cmd/snap: add support for rebooting to factory-reset - interfaces/apparmor: Update base template for systemd-machined - i/a/template.go: add ld path for jammy - o/devicestate, daemon: introduce factory-reset mode, allow switching - o/state: fix undo with independent tasks in same change and lane - tests: validate tests tools just on google and qemu backends - tests/lib/external/snapd-testing-tools: update from upstream - tests: skip interfaces-cups-control from debian-sid - Increase the times in snapd-sigterm for arm devices - interfaces/browser-support: allow RealtimeKit's MakeThreadRealtimeWithPID - cmd: misc analyzer fixes - interfaces/builtin/account-control: allow to execute pam_tally2 - tests/main/user-session-env: special case bash profile on Tumbleweed - o/snapstate: implement transactional lanes for prereqs - o/snapstate: add core22 migration logic - tests/main/mount-ns: unmount /run/qemu - release: 2.54.4 changelog to master - gadget: add buildVolumeStructureToLocation, volumeStructureToLocationMap - interfaces/apparmor: add missing unit tests for special devmode rules/behavior - cmd/snap-confine: coverity fixes - interfaces/systemd: use batch systemd operations - tests: small adjustments to fix vuln spread tests - osutil/disks: trigger udev on the partition device node - interfaces/network-control: add D-Bus rules for resolved too - interfaces/cpu-control: add extra idleruntime data/reset files to cpu-control - packaging/ubuntu-16.04/rules: don't run unit tests on riscv64 - data/selinux: allow the snap command to run systemctl - boot: mock amd64 arch for mabootable 20 suite - testutil: add Backup helper to save/restore values, usually for mocking - tests/nested/core/core20-reinstall-partitions: update test summary - asserts: return an explicit error when key cannot be found - interfaces: custom-device - Fix snap-run-gdbserver test by retrying the check - overlord, boot: fix unit tests on arches other than amd64 - Get lxd snap from candidate channel - bootloader: allow different names for the grub binary in different archs - cmd/snap-mgmt, packaging: trigger daemon reload after purging unit files - tests: add test to ensure consecutive refreshes do garbage collection of old revs - o/snapstate: deal with potentially invalid type of refresh.retain value due to lax validation - seed,image: changes necessary for ubuntu-image to support preseeding extra snaps in classic images - tests: add debugging to snap-confine-tmp-mount - o/snapstate: add ~/Snap init related to backend - data/env: cosmetic tweak for fish - tests: include new testing tools and utils - wrappers: do not reload the deamon or restart snapd services when preseeding on core - Fix smoke/install test for other architectures than pc - tests: skip boot loader check during testing preparation on s390x - t/m/interfaces-network-manager: use different channel depending on system - o/devicestate: pick system from seed systems/ for preseeding (1/N) - asserts: add preseed assertion type - data/env: more workarounds for even older fish shells, provide reasonable defaults - tests/main/snap-run-devmode-classic: reinstall snapcraft to clean up - gadget/update.go: add buildNewVolumeToDeviceMapping for existing devices - tests: allow run spread tests using a private ppaTo validate it - interfaces/{cpu,power}-control: add more accesses for commercial device tuning - gadget: add searchForVolumeWithTraits + tests - gadget/install: measure and save disk volume traits during install.Run() - tests: fix "undo purging" step in snap-run-devmode-classic - many: move call to shutdown to the boot package - spread.yaml: add core22 version of rsync to skip - overlord, o/snapstate: fix mocking on systems without /snap - many: move boot.Device to snap.Device - tests: smoke test support for core22 - tests/nested/snapd-removes-vulnerable-snap-confine-revs: use newer snaps - snapstate: make "remove vulnerable version" message more friendly - o/devicestate/firstboot_preseed_test.go: remove deadcode - o/devicestate: preseeding test cleanup - gadget: refactor StructureEncryption to have a concrete type instead of map - tests: add created_at timestamp to mongo issues - tests: fix security-udev-input-subsystem test - o/devicestate/handlers_install.go: use --all to get binary data too for logs - o/snapstate: rename "corecore" -> "core" - o/snapstate: implement transactional flag - tests: skip ~/.snap migration test on openSUSE - asserts,interfaces/policy: move and prepare DeviceScopeConstraint for reuse - asserts: fetching code should fetch authority-delegation assertions with signing keys as needed - tests: prepare and restore nested tests - asserts: first-class support for formatting/encoding signatory-id - asserts: remove unused function, fix for linter - gadget: identify/match encryption parts, include in traits info - asserts,cmd/snap-repair: support delegation when validating signatures - many: fix leftover empty snap dirs - libsnap-confine-private: string functions simplification - tests/nested/manual/core20-cloud-init-maas-signed-seed-data: add gadget variant - interfaces/u2f-devices: add U2F-TOKEN - tests/core/mem-cgroup-disabled: minor fixups - data/env: fix fish env for all versions of fish, unexport local vars, export XDG_DATA_DIRS - tests: reboot test running remodel - Add extra disk space to nested images to "avoid No space left on device" error - tests: add regression tests for disabled memory cgroup operation - many: fix issues flagged by golangci and configure it to fail build - docs: fix incorrect link - cmd/snap: rename the verbose logging flag in snap run - docs: cosmetic cleanups - cmd/snap-confine: build const data structures at compile- time - o/snapstate: reduce maxInhibition for raa by 1s to avoid confusing notification - snap-bootstrap: Cleanup dependencies in systemd mounts - interfaces/seccomp: Add rseq to base seccomp template - cmd/snap-confine: remove mention of "legacy mode" from comment - gadget/gadget_test.go: fix variable type - gadget/gadget.go: add AllDiskVolumeDeviceTraits - spread: non-functional cleanup of go1.6 legacy - cmd/snap-confine: update ambiguous comment - o/snapstate: revert migration on refresh if flag is disabled - packaging/fedora: sync with downstream, packaging improvements - tests: updated the documentation to run spread tests using external backend - osutil/mkfs: Expose more fakeroot flags - interfaces/cups: add cups-socket-directory attr, use to specify mount rules in backend - tests/main/snap-system-key: reset-failed snapd and snapd.socket - gadget/install: add unit tests for install.Run() - tests/nested/manual/remodel-cross-store,remodel-simple: wait for serial - vscode: added integrated support for MS VSCODE - cmd/snap/auto-import: use osutil.LoadMountInfo impl instead - gadget/install: add unit tests for makeFilesystem, allow mocking mkfs.Make() - systemd: batched operations - gadget/install/partition.go: include DiskIndex in synthesized OnDiskStructure - gadget/install: rm unused support for writing non-filesystem structures - cmd/snap: close refresh notifications after trying to run a snap while inhibited - o/servicestate: revert #11003 checking for memory cgroup being disabled - tests/core/failover: verify failover handling with the kernel snap - snap-confine: allow numbers in hook security tag - cmd/snap-confine: mount bpffs under /sys/fs/bpf if needed - spread: switch to CentOS 8 Stream image - overlord/servicestate: disallow mixing snaps and subgroups. - cmd/snap: add --debug to snap run - gadget: mv modelCharateristics to gadgettest.ModelCharacteristics - cmd/snap: remove use of zenity, use notifications for snap run inhibition - o/devicestate: verify that the new model is self contained before remodeling - usersession/userd: query xdg-mime to check for fallback handlers of a given scheme - gadget, gadgettest: reimplement tests to use new gadgettest examples.go file - asserts: start implementing authority-delegationTODO in later PRs: - overlord: skip manager tests on riscv for now - o/servicestate: quota group error should be more explanative when memory cgroup is disabled - i/builtin: allow modem-manager interface to access some files in sysfs - tests: ensure that interface hook works with hotplug plug - tests: fix repair test failure when run in a loop - o/snapstate: re-write state after undo migration - interfaces/opengl: add support for ARM Mali - tests: enable snap-userd-reexec on ubuntu and debian - tests: skip bind mount in snapd-snap test when the core snap in not repacked - many: add transactional flag to snapd API - tests: new Jammy image for testing - asserts: start generalizing attrMatcherGeneralization is along - tests: ensure the ca-certificates package is installed - devicestate: ensure permissions of /var/lib/snapd/void are correct - many: add altlinux support - cmd/snap-update-ns: convert some unexpected decimal file mode constants to octal. - tests: use system ubuntu-21.10-64 in nested tests - tests: skip version check on lp-1871652 for sru validation - snap/quota: add positive tests for the quota.Resources logic - asserts: start splitting out attrMatcher for reuse to constraint.go - systemd: actually test the function passed as a parameter - tests: fix snaps-state test for sru validation - many: add Transactional to snapstate.Flags - gadget: rename DiskVolume...Opts to DiskVolume...Options - tests: Handle PPAs being served from ppa.launchpadcontent.net - tests/main/cgroup-tracking-failure: Make it pass when run alone - tests: skip migration test on centOS - tests: add back systemd-timesyncd to newer debian distros - many: add conversion for interface attribute values - many: unit test fix when SNAPD_DEBUG=1 is set - gadget/install/partition.go: use device rescan trick only when gadget says to - osutil: refactoring the code exporting mocking APIs to other packages - mkversion: check that snapd is a git source tree before guessing the version - overlord: small refactoring of group quota implementation in preparation of multiple quota values - tests: drop 21.04 tests (it's EOL) - osutil/mkfs: Expose option for --lib flag in fakeroot call - cmd/snapd-apparmor: fix bad variable initialization - packaging, systemd: fix socket (re-)start race - tests: fix running tests.invariant on testflinger systems - tests: spread test snap dir migration - interfaces/shared-memory: support single wild-cards in the read/write paths - tests: cross store remodel - packaging,tests: fix running autopkgtest - spread-shellcheck: add a caching layer - tests: add jammy to spread executions - osutils: deal with ENOENT in UserMaybeSudoUser() - packaging/ubuntu-16.04/control: adjust libfuse3 dependency as suggested - gadget/update.go: add DiskTraitsFromDeviceAndValidate - tests/lib/prepare.sh: add debug kernel command line params via gadget on UC20 - check-commit-email: do not fail when current dir is not under git - configcore: implement netplan write support via dbus - run-checks, check-commit-email.py: check commit email addresses for validity - tests: setup snapd remodel testing bits - cmd/snap: adjust /cmd to migration changes - systemd: enable batched calls for systemd calls operation on units - o/ifacestate: add convenience Active() method to ConnectionState struct - o/snapstate: migrate to hidden dir on refresh/install - store: fix flaky test - i/builtin/xilinx-dma: add interface for Xilinx DMA driver - go.mod: tidy up - overlord/h/c/umount: remove handling of required parameter - systemd: add NeedDaemonReload to the unit state - mount-control: step 3 - tests/nested/manual/minimal-smoke: bump mem to 512 for unencrypted case too - gadget: fix typo with filesystem message - gadget: misc helper fixes for implicit system-data role handling - tests: fix uses of fakestore new-snap-declaration - spread-shellcheck: use safe_load rather than load with a loder - interfaces: allow access to new at-spi socket location in desktop- legacy - cmd/snap: setup tracking cgroup when invoking a service directly as a user - tests/main/snap-info: use yaml.safe_load rather than yaml.load - cmd/snap: rm unnecessary validation - tests: fix `tests/core/create-user` on testflinger pi3 - tests: fix parallel-install-basic on external UC16 devices - tests: ubuntu-image 2.0 compatibility fixes - tests/lib/prepare-restore: use go install rather than go get - cmd/snap, daemon: add debug command for getting OnDiskVolume dump - gadget: resolve index ambiguity between OnDiskStructure and LaidOutStructuretype: bare structures). - tests: workaround missing bluez snap - HACKING.md: add dbus-x11 to packages needed to run unit tests - spread.yaml: add debian-{10,11}, drop debian-9 - cmd/snap/quota: fix typo in the help message - gadget: allow gadget struct with unspecified filesystem to match part with fs - tests: re-enable kernel-module-load tests on arm - tests/lib/uc20-create-partitions/main.go: setup a logger for messages - cmd: support installing multiple local snaps - usersession: implement method to close notifications via usersession REST API - data/env: treat XDG_DATA_DIRS like PATH for fish - cmd/snap, cmd/snap-confine: extend manpage, update links - tests: fix fwupd interface test in debian sid - tests: do not run k8s smoke test on 32 bit systems - tests: fix testing in trusty qemu - packaging: merge 2.54.2 changelog back to master - overlord: fix issue with concurrent execution of two snapd processes - interfaces: add a polkit interface - gadget/install/partition.go: wait for udev settle when creating partitions too - tests: exclude interfaces-kernel-module load on arm - tests: ensure that test-snapd-kernel-module-load is removed - tests: do not test microk8s-smoke on arm - packaging, bloader, github: restore cleanliness of snapd info file; check in GA workflow - tests/lib/tools/tests.invariant: simplify check - tests/nested/manual/core20-to-core22: wait for device to be initialized before starting a remodel - build-aux/snap/snapcraft.yaml: use build-packages, don't fail dirty builds - tests/lib/tools/tests.invariant: add invariant for detecting broken snaps - tests/core/failover: replace boot-state with snap debug boot-vars - tests: fix remodel-kernel test when running on external devices - data/selinux: allow poking /proc/xen - gadget: do not crash if gadget.yaml has an empty Volumes section - i/b/mount-control: support creating tmpfs mounts - packaging: Update openSUSE spec file with apparmor-parser and datadir for fish - cmd/snap-device-helper: fix variable name typo in the unit tests - tests: fixed an issue with retrieval of the squashfuse repo - release: 2.54.1 - tests: tidy up the top-level of ubuntu-seed during tests - build-aux: detect/fix dirty git revisions while snapcraft building - release: 2.54- Release 2.54.4 to Fedora - Includes a fix for RHBZ#2062678 - Cherry pick a fix for RHBZ#2057103- New upstream release 2.54.4 - t/m/interfaces-network-manager: use different channel depending on system - many: backport attrer interface changes to 2.54 - tests: skip version check on lp-1871652 for sru validation - i/builtin: allow modem-manager interface to access some files in sysfs - snapstate: make "remove vulnerable version" message more friendly - tests: fix "undo purging" step in snap-run-devmode-classic - o/snapstate: deal with potentially invalid type of refresh.retain value due to lax validation - interfaces: custom-device - packaging/ubuntu-16.04/control: adjust libfuse3 dependency - data/env: fix fish env for all versions of fish - packaging/ubuntu-16.04/snapd.postinst: start socket and service first - interfaces/u2f-devices: add U2F-TOKEN - interfaces/seccomp: Add rseq to base seccomp template - tests: remove disabled snaps before calling save_snapd_state - overlord: skip manager tests on riscv for now - interfaces/opengl: add support for ARM Mali - devicestate: ensure permissions of /var/lib/snapd/void are correct - cmd/snap-update-ns: convert some unexpected decimal file mode constants to octal. - interfaces/shared-memory: support single wild-cards in the read/write paths - packaging: fix running autopkgtest - i/builtin/xilinx-dma-host: add interface for Xilinx DMA driver - tests: fix `tests/core/create-user` on testflinger pi3 - tests: fix parallel-install-basic on external UC16 devices - tests: re-enable kernel-module-load tests on arm - tests: do not run k8s smoke test on 32 bit systems- Release 2.54.3 to Fedora - Cherry pick SELinux policy fixes for RHBZ#1944390, RHBZ#2043160, RHBZ#2043161, RHBZ#2046358, RHBZ#2046363, RHBZ#2046361, RHBZ#2046364, RHBZ#2046365, RHBZ#2051594, RHBZ#2043902, RHBZ#1944390- New upstream release 2.54.3 - bugfixes- Release 2.54.2 to Fedora- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild- New upstream release 2.54.2 - tests: exclude interfaces-kernel-module load on arm - tests: ensure that test-snapd-kernel-module-load is removed - tests: do not test microk8s-smoke on arm - tests/core/failover: replace boot-state with snap debug boot-vars - tests: use snap info|awk to extract tracking channel - tests: fix remodel-kernel test when running on external devices - .github/workflows/test.yaml: also check internal snapd version for cleanliness - packaging/ubuntu-16.04/rules: eliminate seccomp modification - bootloader/assets/grub_*cfg_asset.go: update Copyright - build-aux/snap/snapcraft.yaml: adjust comment about get-version - .github/workflows/test.yaml: add check in github actions for dirty snapd snaps - build-aux/snap/snapcraft.yaml: use build-packages, don't fail dirty builds - data/selinux: allow poking /proc/xen- Release 2.54.1 to Fedora and EPEL - Fixes for RHBZ#2035664- New upstream release 2.54.1 - buid-aux: set version before calling ./generate-packaging-dir This fixes the "dirty" suffix in the auto-generated version- New upstream release 2.54 - interfaces/builtin/opengl.go: add boot_vga sys/devices file - o/configstate/configcore: add tmpfs.size option - tests: moving to manual opensuse 15.2 - cmd/snap-device-helper: bring back the device type identification behavior, but for remove action fallback only - cmd/snap-failure: use snapd from the snapd snap if core is not present - tests/core/failover: enable the test on core18 - o/devicestate: ensure proper order when remodel does a simple switch-snap-channel - builtin/interfaces: add shared memory interface - overlord: extend kernel/base success and failover with bootenv checks - o/snapstate: check disk space w/o store if possible - snap-bootstrap: Mount snaps read only - gadget/install: do not re-create partitions using OnDiskVolume after deletion - many: fix formatting w/ latest go version - devicestate,timeutil: improve logging of NTP sync - tests/main/security-device-cgroups-helper: more debugs - cmd/snap: print a placeholder for version of broken snaps - o/snapstate: mock system with classic confinement support - cmd: Fixup .clangd to use correct syntax - tests: run spread tests in fedora-35 - data/selinux: allow snapd to access /etc/modprobe.d - mount-control: step 2 - daemon: add multiple snap sideload to API - tests/lib/pkgdb: install dbus-user-session during prepare, drop dbus-x11 - systemd: provide more detailed errors for unimplemented method in emulation mode - tests: avoid checking TRUST_TEST_KEYS on restore on remodel-base test - tests: retry umounting /var/lib/snapd/seed on uc20 on fsck-on-boot test - o/snapstate: add hide/expose snap data to backend - interfaces: kernel-module-load - snap: add support for `snap watch --last={revert,enable,disable,switch}` - tests/main/security-udev-input-subsystem: drop info from udev - tests/core/kernel-and-base-single-reboot-failover, tests/lib/fakestore: verify failover scenario - tests/main/security-device-cgroups-helper: collect some debug info when the test fails - tests/nested/manual/core20-remodel: wait for device to have a serial before starting a remodel - tests/main/generic-unregister: test re-registration if not blocked - o/snapstate, assertsate: validation sets/undo on partial failure - tests: ensure snapd can be downloaded as a module - snapdtool, many: support additional key/value flags in info file - data/env: improve fish shell env setup - usersession/client: provide a way for client to send messages to a subset of users - tests: verify that simultaneous refresh of kernel and base triggers a single reboot only - devicestate: Unregister deletes the device key pair as well - daemon,tests: support forgetting device serial via API - asserts: change behavior of alternative attribute matcher - configcore: relax validation rules for hostname - cmd/snap-confine: do not include libglvnd libraries from the host system - overlord, tests: add managers and a spread test for UC20 to UC22 remodel - HACKING.md: adjust again for building the snapd snap - systemd: add support for systemd unit alias names - o/snapstate: add InstallPathMany - gadget: allow EnsureLayoutCompatibility to ensure disk has all laid out structsnow reject/fail: - packaging/ubuntu, packaging/debian: depend on dbus-session-bus provider (#11111) - interfaces/interfaces/scsi_generic: add interface for scsi generic de… (#10936) - osutil/disks/mockdisk.go: add MockDevicePathToDiskMapping - interfaces/microstack-support: set controlsDeviceCgroup to true - network-setup-control: add netplan generate D-Bus rules - interface/builtin/log_observe: allow to access /dev/kmsg - .github/workflows/test.yaml: restore failing of spread tests on errors (nested) - gadget: tweaks to DiskStructureDeviceTraits + expand test cases - tests/lib/nested.sh: allow tests to use their own core18 in extra- snaps-path - interfaces/browser-support: Update rules for Edge - o/devicestate: during remodel first check pending download tasks for snaps - polkit: add a package to validate polkit policy files - HACKING.md: document building the snapd snap and splicing it into the core snap - interfaces/udev: fix installing snaps inside lxd in 21.10 - o/snapstate: refactor disk space checks - tests: add (strict) microk8s smoke test - osutil/strace: try to enable strace on more arches - cmd/libsnap-confine-private: fix snap-device-helper device allow list modification on cgroup v2 - tests/main/snapd-reexec-snapd-snap: improve debugging - daemon: write formdata file parts to snaps dir - systemd: add support for .target units - tests: run snap-disconnect on uc16 - many: add experimental setting to allow using ~/.snap/data instead of ~/snap - overlord/snapstate: perform a single reboot when updating boot base and kernel - kernel/fde: add DeviceUnlockKernelHookDeviceMapperBackResolver, use w/ disks pkg - o/devicestate: introduce DeviceManager.Unregister - interfaces: allow receiving PropertiesChanged on the mpris plug - tests: new tool used to retrieve data from mongo db - daemon: amend ssh keys coming from the store - tests: Include the tools from snapd-testing-tools project in "$TESTSTOOLS" - tests: new workflow step used to report spread error to mongodb - interfaces/builtin/dsp: update proc files for ambarella flavor - gadget: replace ondisk implementation with disks package, refactor part calcs - tests: Revert "tests: disable flaky uc18 tests until systemd is fixed" - Revert: "many: Vendor apparmor-3.0.3 into the snapd snap" - asserts: rename "white box" to "clear box" (woke checker) - many: Vendor apparmor-3.0.3 into the snapd snap - tests: reorganize the debug-each on the spread.yaml - packaging: sync with downstream packaging in Fedora and openSUSE - tests: disable flaky uc18 tests until systemd is fixed - data/env: provide profile setup for fish shell - tests: use ubuntu-image 1.11 from stable channel - gadget/gadget.go: include disk schema in the disk device volume traits too - tests/main/security-device-cgroups-strict-enforced: extend the comments - README.md: point at bugs.launchpad.net/snapd instead of snappy project - osutil/disks: introduce RegisterDeviceMapperBackResolver + use for crypt-luks2 - packaging: make postrm script robust against `rm` failures - tests: print extra debug on auto-refresh-gating test failure - o/assertstate, api: move enforcing/monitoring from api to assertstate, save history - tests: skip the test-snapd-timedate-control-consumer.date to avoid NTP sync error - gadget/install: use disks functions to implement deviceFromRole, also rename - tests: the `lxd` test is failing right now on 21.10 - o/snapstate: account for deleted revs when undoing install - interfaces/builtin/block_devices: allow blkid to print block device attributes - gadget: include size + sector-size in DiskVolumeDeviceTraits - cmd/libsnap-confine-private: do not deny all devices when reusing the device cgroup - interfaces/builtin/time-control: allow pps access - o/snapstate/handlers: propagate read errors on "copy-snap-data" - osutil/disks: add more fields to Partition, populate them during discovery - interfaces/u2f-devices: add Trezor and Trezor v2 keys - interfaces: timezone-control, add permission for ListTimezones DBus call - o/snapstate: remove repeated test assertions - tests: skip `snap advise-command` test if the store is overloaded - cmd: create ~/snap dir with 0700 perms - interfaces/apparmor/template.go: allow udevadm from merged usr systems - github: leave a comment documenting reasons for pipefail - github: enable pipefail when running spread - osutil/disks: add DiskFromPartitionDeviceNode - gadget, many: add model param to Update() - cmd/snap-seccomp: add riscv64 support - o/snapstate: maintain a RevertStatus map in SnapState - tests: enable lxd tests on impish system - tests: (partially) revert the memory limits PR#r10241 - o/assertstate: functions for handling validation sets tracking history - tests: some improvements for the spread log parser - interfaces/network-manager-observe: Update for libnm / dart clients - tests: add ntp related debug around "auto-refresh" test - boot: expand on the fact that reseal taking modeenv is very intentional - cmd/snap-seccomp/syscalls: update syscalls to match libseccomp abad8a8f4 - data/selinux: update the policy to allow snapd to talk to org.freedesktop.timedate1 - o/snapstate: keep old revision if install doesn't add new one - overlord/state: add a unit test for a kernel+base refresh like sequence - desktop, usersession: observe notifications - osutil/disks: add AllPhysicalDisks() - timeutil,deviceutil: fix unit tests on systems without dbus or without ntp-sync - cmd/snap-bootstrap/README: explain all the things (well most of them anyways) - docs: add run-checks dependency install instruction - o/snapstate: do not prune refresh-candidates if gate-auto-refresh- hook feature is not enabled - o/snapstate: test relink remodel helpers do a proper subset of doInstall and rework the verify*Tasks helpers - tests/main/mount-ns: make the test run early - tests: add `--debug` to netplan apply - many: wait for up to 10min for NTP synchronization before autorefresh - tests: initialize CHANGE_ID in _wait_autorefresh - sandbox/cgroup: freeze and thaw cgroups related to services and scopes only - tests: add more debug around qemu-nbd - o/hookstate: print cohort with snapctl refresh --pending (#10985) - tests: misc robustness changes - o/snapstate: improve install/update tests (#10850) - tests: clean up test tools - spread.yaml: show `journalctl -e` for all suites on debug - tests: give interfaces-udisks2 more time for the loop device to appear - tests: set memory limit for snapd - tests: increase timeout/add debug around nbd0 mounting (up, see LP:#1949513) - snapstate: add debug message where a snap is mounted - tests: give nbd0 more time to show up in preseed-lxd - interfaces/dsp: add more ambarella things - cmd/snap: improve snap disconnect arg parsing and err msg - tests: disable nested lxd snapd testing - tests: disable flaky "interfaces-udisks2" on ubuntu-18.04-32 - o/snapstate: avoid validationSetsSuite repeating snapmgrTestSuite - sandbox/cgroup: wait for start transient unit job to finish - o/snapstate: fix task order, tweak errors, add unit tests for remodel helpers - osutil/disks: re-org methods for end of usable region, size information - build-aux: ensure that debian packaging matches build-base - docs: update HACKING.md instructions for snapd 2.52 and later - spread: run lxd tests with version from latest/edge - interfaces: suppress denial of sys_module capability - osutil/disks: add methods to replace gadget/ondisk functions - tests: split test tools - part 1 - tests: fix nested tests on uc20 - data/selinux: allow snap-confine to read udev's database - i/b/common_test: refactor AppArmor features test - tests: run spread tests on debian 11 - o/devicestate: copy timesyncd clock timestamp during install - interfaces/builtin: do not probe parser features when apparmor isn't available - interface/modem-manager: allow connecting to the mbim/qmi proxy - tests: fix error message in run-checks - tests: spread test for validation sets enforcing - cmd/snap-confine: lazy set up of device cgroup, only when devices were assigned - o/snapstate: deduplicate snap names in remove/install/update - tests/main/selinux-data-context: use session when performing actions as test user - packaging/opensuse: sync with openSUSE packaging, enable AppArmor on 15.3+ - interfaces: skip connection of netlink interface on older systems - asserts, o/snapstate: honor IgnoreValidation flag when checking installed snaps - tests/main/apparmor-batch-reload: fix fake apparmor_parser to handle --preprocess - sandbox/apparmor, interfaces/apparmor: detect bpf capability, generate snippet for s-c - release-tools/repack-debian-tarball.sh: fix c-vendor dir - tests: test for enforcing with prerequisites - tests/main/snapd-sigterm: fix race conditions - spread: run lxd tests with version from latest/stable - run-checks: remove --spread from help message - secboot: use latest secboot with tpm legacy platform and v2 fully optional - tests/lib/pkgdb: install strace on Debian 11 and Sid - tests: ensure systemd-timesyncd is installed on debian - interfaces/u2f-devices: add Nitrokey 3 - tests: update the ubuntu-image channel to candidate - osutil/disks/labels: simplify decoding algorithm - tests: not testing lxd snap anymore on i386 architecture - o/snapstate, hookstate: print remaining hold time on snapctl --hold - cmd/snap: support --ignore-validation with snap install client command - tests/snapd-sigterm: be more robust against service restart - tests: simplify mock script for apparmor_parser - o/devicestate, o/servicestate: update gadget assets and cmdline when remodeling - tests/nested/manual/refresh-revert-fundamentals: re-enable encryption - osutil/disks: fix bug in BlkIDEncodeLabel, add BlkIDDecodeLabel - gadget, osutil/disks: fix some bugs from prior PR'sin the dir. - secboot: revert move to new version (revert #10715) - cmd/snap-confine: die when snap process is outside of snap specific cgroup - many: mv MockDeviceNameDisksToPartitionMapping -> MockDeviceNameToDiskMapping - interfaces/builtin: Add '/com/canonical/dbusmenu' path access to 'unity7' interface - interfaces/builtin/hardware-observer: add /proc/bus/input/devices too - osutil/disks, many: switch to defining Partitions directly for MockDiskMapping - tests: remove extra-snaps-assertions test - interface/modem-manager: add accept for MBIM/QMI proxy clients - tests/nested/core/core20-create-recovery: fix passing of data to curl - daemon: allow enabling enforce mode - daemon: use the syscall connection to get the socket credentials - i/builtin/kubernetes_support: add access to Calico lock file - osutil: ensure parent dir is opened and sync'd - tests: using test-snapd-curl snap instead of http snap - overlord: add managers unit test demonstrating cyclic dependency between gadget and kernel updates - gadget/ondisk.go: include the filesystem UUID in the returned OnDiskVolume - packaging: fixes for building on openSUSE - o/configcore: allow hostnames up to 253 characters, with dot- delimited elements - gadget/ondisk.go: add listBlockDevices() to get all block devices on a system - gadget: add mapping trait types + functions to save/load - interfaces: add polkit security backend - cmd/snap-confine/snap-confine.apparmor.in: update ld rule for s390x impish - tests: merge coverage results - tests: remove "features" from fde-setup.go example - fde: add new device-setup support to fde-setup - gadget: add `encryptedDevice` and add encryptedDeviceLUKS - spread: use `bios: uefi` for uc20 - client: fail fast on non-retryable errors - tests: support running all spread tests with experimental features - tests: check that a snap that doesn't have gate-auto-refresh hook can call --proceed - o/snapstate: support ignore-validation flag when updating to a specific snap revision - o/snapstate: test prereq update if started by old version - tests/main: disable cgroup-devices-v1 and freezer tests on 21.10 - tests/main/interfaces-many: run both variants on all possible Ubuntu systems - gadget: mv ensureLayoutCompatibility to gadget proper, add gadgettest pkg - many: replace state.State restart support with overlord/restart - overlord: fix generated snap-revision assertions in remodel unit tests- Release 2.53.4 to Fedora - Cherry pick for nvidia glvnd incompatibility- New upstream release 2.53.4 - devicestate: mock devicestate.MockTimeutilIsNTPSynchronized to avoid host env leaking into tests - timeutil: return NoTimedate1Error if it can't connect to the system bus- New upstream release 2.53.3 - devicestate: Unregister deletes the device key pair as well - daemon,tests: support forgetting device serial via API - configcore: relax validation rules for hostname - o/devicestate: introduce DeviceManager.Unregister - packaging/ubuntu, packaging/debian: depend on dbus-session-bus provider - many: wait for up to 10min for NTP synchronization before autorefresh - interfaces/interfaces/scsi_generic: add interface for scsi generic devices - interfaces/microstack-support: set controlsDeviceCgroup to true - interface/builtin/log_observe: allow to access /dev/kmsg - daemon: write formdata file parts to snaps dir - spread: run lxd tests with version from latest/edge - cmd/libsnap-confine-private: fix snap-device-helper device allow list modification on cgroup v2 - interfaces/builtin/dsp: add proc files for monitoring Ambarella DSP firmware - interfaces/builtin/dsp: update proc file accordingly- Cherry-pick a fix for snap-device-helper (RHBZ#2025264)- Release 2.53.2 to Fedora- New upstream release 2.53.2 - interfaces/builtin/block_devices: allow blkid to print block device attributes/run/udev/data/b{major}:{minor} - cmd/libsnap-confine-private: do not deny all devices when reusing the device cgroup - interfaces/builtin/time-control: allow pps access - interfaces/u2f-devices: add Trezor and Trezor v2 keys - interfaces: timezone-control, add permission for ListTimezones DBus call - interfaces/apparmor/template.go: allow udevadm from merged usr systems - interface/modem-manager: allow connecting to the mbim/qmi proxy - interfaces/network-manager-observe: Update for libnm client library - cmd/snap-seccomp/syscalls: update syscalls to match libseccomp abad8a8f4 - sandbox/cgroup: freeze and thaw cgroups related to services and scopes only - o/hookstate: print cohort with snapctl refresh --pending - cmd/snap-confine: lazy set up of device cgroup, only when devices were assigned - tests: ensure systemd-timesyncd is installed on debian - tests/lib/pkgdb: install strace on Debian 11 and Sid - tests/main/snapd-sigterm: flush, use retry - tests/main/snapd-sigterm: fix race conditions - release-tools/repack-debian-tarball.sh: fix c-vendor dir - data/selinux: allow snap-confine to read udev's database - interfaces/dsp: add more ambarella things* interfaces/dsp: add more ambarella things- Disable BPF support on systems that are too old- Release 2.53.1 to Fedora- New upstream release 2.53.1 - spread: run lxd tests with version from latest/stable - secboot: use latest secboot with tpm legacy platform and v2 fully optional (#10946) - cmd/snap-confine: die when snap process is outside of snap specific cgroup (2.53) - interfaces/u2f-devices: add Nitrokey 3 - Update the ubuntu-image channel to candidate - Allow hostnames up to 253 characters, with dot-delimited elements (as suggested by man 7 hostname). - Disable i386 until it is possible to build snapd using lxd - o/snapstate, hookstate: print remaining hold time on snapctl --hold - tests/snapd-sigterm: be more robust against service restart - tests: add a regression test for snapd hanging on SIGTERM - daemon: use the syscall connection to get the socket credentials - interfaces/builtin/hardware-observer: add /proc/bus/input/devices too - cmd/snap-confine/snap-confine.apparmor.in: update ld rule for s390x impish - interface/modem-manager: add accept for MBIM/QMI proxy clients - secboot: revert move to new version- New upstream release 2.53 - overlord: fix generated snap-revision assertions in remodel unit tests - snap-bootstrap: wait in `mountNonDataPartitionMatchingKernelDisk` - interfaces/modem-manager: add access to PCIe modems - overlord/devicestate: record recovery capable system on a successful remodel - o/snapstate: use device ctx in prerequisite install/update - osutil/disks: support filtering by mount opts in MountPointsForPartitionRoot - many: support an API flag system-restart-immediate to make snap ops proceed immediately with system restarts - osutil/disks: add RootMountPointsForPartition - overlord/devicestate, tests: enable UC20 remodel, add spread tests - cmd/snap: improve snap run help message - o/snapstate: support ignore validation flag on install/update - osutil/disks: add Disk.FindMatchingPartitionWith{Fs,Part}Label - desktop: implement gtk notification backend and provide minimal notification api - tests: use the latest cpu family for nested tests execution - osutil/disks: add Partition struct and Disks.Partitions() - o/snapstate: prevent install hang if prereq install fails - osutil/disks: add Disk.KernelDevice{Node,Path} methods - disks: add `Size(path)` helper - tests: reset some mount units failing on ubuntu impish - osutil/disks: add DiskFromDevicePath, other misc changes - interfaces/apparmor: do not fail during initialization when there is no AppArmor profile for snap-confine - daemon: implement access checkers for themes API - interfaces/seccomp: add clone3 to default template - interfaces/u2f-devices: add GoTrust Idem Key - o/snapstate: validation sets enforcing on update - o/ifacestate: don't fail remove if disconnect hook fails - tests: fix error trying to create the extra-snaps dir which already exists - devicestate: use EncryptionType - cmd/libsnap-confine-private: workaround BPF memory accounting, update apparmor profile - tests: skip system-usernames-microk8s when TRUST_TEST_KEYS is false - interfaces/dsp: add a usb rule to the ambarella flavor - interfaces/apparmor/template.go: allow inspection of dbus mediation level - tests/main/security-device-cgroups: fix when both variants run on the same host - cmd/snap-confine: update s-c apparmor profile to allow versioned ld.so - many: rename systemd.Kind to Backend for a bit more clarity - cmd/libsnap-confine-private: fix set but unused variable in the unit tests - tests: fix netplan test on i386 architecture - tests: fix lxd-mount-units test which is based on core20 in ubuntu focal system - osutil/disks: add new `CreateLinearMapperDevice` helper - cmd/snap: wait while inhibition file is present - tests: cleanup the job workspace as first step of the actions workflow - tests: use our own image for ubuntu impish - o/snapstate: update default provider if missing required content - o/assertstate, api: update validation set assertions only when updating all snaps - fde: add HasDeviceUnlock() helper - secboot: move to new version - o/ifacestate: don't lose connections if snaps are broken - spread: display information about current device cgroup in debug dump - sysconfig: set TMPDIR in tests to avoid cluttering the real /tmp - tests, interfaces/builtin: introduce 21.10 cgroupv2 variant, tweak tests for cgroupv2, update builtin interfaces - sysconfig/cloud-init: filter MAAS c-i config from ubuntu-seed on grade signed - usersession/client: refactor doMany() method - interfaces/builtin/opengl.go: add libOpenGL.so* too - o/assertstate: check installed snaps when refreshing validation set assertions - osutil: helper for injecting run time faults in snapd - tests: update test nested tool part 2 - libsnap-confine: use the pid parameter - gadget/gadget.go: LaidOutSystemVolumeFromGadget -> LaidOutVolumesFromGadget - tests: update the time tolerance to fix the snapd-state test - .github/workflows/test.yaml: revert #10809 - tests: rename interfaces-hooks-misbehaving spread test to install- hook-misbehaving - data/selinux: update the policy to allow s-c to manipulate BPF map and programs - overlord/devicestate: make settle wait longer in remodel tests - kernel/fde: mock systemd-run in unit test - o/ifacestate: do not create stray task in batchConnectTasks if there are no connections - gadget: add VolumeName to Volume and VolumeStructure - cmd/libsnap-confine-private: use root when necessary for BPF related operations - .github/workflows/test.yaml: bump action-build to 1.0.9 - o/snapstate: enforce validation sets/enforce on InstallMany - asserts, snapstate: return full validation set keys from CheckPresenceRequired and CheckPresenceInvalid - cmd/snap: only log translation warnings in debug/testing - tests/main/preseed: update for new base snap of the lxd snap - tests/nested/manual: use loop for checking for initialize-system task done - tests: add a local snap variant to testing prepare-image gating support - tests/main/security-device-cgroups-strict-enforced: demonstrate device cgroup being enforced - store: one more tweak for the test action timeout - github: do not fail when codecov upload fails - o/devicestate: fix flaky test remodel clash - o/snapstate: add ChangeID to conflict error - tests: fix regex of TestSnapActionTimeout test - tests: fix tests for 21.10 - tests: add test for store.SnapAction() request timeout - tests: print user sessions info on debug-each - packaging: backports of golang-go 1.13 are good enough - sysconfig/cloudinit: add cloudDatasourcesInUseForDir - cmd: build gdb shims as static binaries - packaging/ubuntu: pass GO111MODULE to dh_auto_test - cmd/libsnap-confine-private, tests, sandbox: remove warnings about cgroup v2, drop forced devmode - tests: increase memory quota in quota-groups-systemd-accounting - tests: be more robust against a new day stepping in - usersession/xdgopenproxy: move PortalLauncher class to own package - interfaces/builtin: fix microstack unit tests on distros using /usr/libexec - cmd/snap-confine: handle CURRENT_TAGS on systems that support it - cmd/libsnap-confine-private: device cgroup v2 support - o/servicestate: Update task summary for restart action - packaging, tests/lib/prepare-restore: build packages without network access, fix building debs with go modules - systemd: add AtLeast() method, add mocking in systemdtest - systemd: use text.template to generate mount unit - o/hookstate/ctlcmd: Implement snapctl refresh --show-lock command - o/snapstate: optimize conflicts around snaps stored on conditional-auto-refresh task - tests/lib/prepare.sh: download core20 for UC20 runs via BASE_CHANNEL - mount-control: step 1 - go: update go.mod dependencies - o/snapstate: enforce validation sets on snap install - tests: revert revert manual lxd removal - tests: pre-cache snaps in classic and core systems - tests/lib/nested.sh: split out additional helper for adding files to VM imgs - tests: update nested tool - part1 - image/image_linux.go: add newline - interfaces/block-devices: support to access the state of block devices - o/hookstate: require snap-refresh-control interface for snapctl refresh --proceed - build-aux: stage libgcc1 library into snapd snap - configcore: add read-only netplan support - tests: fix fakedevicesvc service already exists - tests: fix interfaces-libvirt test - tests: remove travis leftovers - spread: bump delta ref to 2.52 - packaging: ship the `snapd.apparmor.service` unit in debian - packaging: remove duplicated `golang-go` build-dependency - boot: record recovery capable systems in recovery bootenv - tests: skip overlord tests on riscv64 due to timeouts. - overlord/ifacestate: fix arguments in unit tests - ifacestate: undo repository connection if doConnect fails - many: remove unused parameters - tests: failure of prereqs on content interface doesn't prevent install - tests/nested/manual/refresh-revert-fundamentals: fix variable use - strutil: add Intersection() - o/ifacestate: special-case system-files and force refreshing its static attributes - interface/builtin: add qualcomm-ipc-router interface for AF_QIPCRTR socket protocol - tests: new snapd-state tool - codecov: fix files pathnames - systemd: add mock systemd helper - tests/nested/core/extra-snaps-assertions: fix the match pattern - image,c/snap,tests: support enforcing validations in prepare-image via --customize JSON validation enforce(|ignore) - o/snapstate: enforce validation sets assertions when removing snaps - many: update deps - interfaces/network-control: additional ethernet rule - tests: use host-scaled settle timeout for hookstate tests - many: move to go modules - interfaces: no need for snapRefreshControlInterface struct - interfaces: introduce snap-refresh-control interface - tests: move interfaces-libvirt test back to 16.04 - tests: bump the number of retries when waiting for /dev/nbd0p1 - tests: add more space on ubuntu xenial - spread: add 21.10 to qemu, remove 20.10 (EOL) - packaging: add libfuse3-dev build dependency - interfaces: add microstack-support interface - wrappers: fix a bunch of duplicated service definitions in tests - tests: use host-scaled timeout to avoid riscv64 test failure - many: fix run-checks gofmt check - tests: spread test for snapctl refresh --pending/--proceed from the snap - o/assertstate,daemon: refresh validation sets assertions with snap declarations - tests: migrate tests that are only executed on xenial to bionic - tests: remove opensuse-15.1 and add opensuse-15.3 from spread runs - packaging: update master changelog for 2.51.7 - sysconfig/cloudinit: fix bug around error state of cloud-init - interfaces, o/snapstate: introduce AffectsPlugOnRefresh flag - interfaces/interfaces/ion-memory-control: add: add interface for ion buf - interfaces/dsp: add /dev/ambad into dsp interface - tests: new spread log parser - tests: check files and dirs are cleaned for each test - o/hookstate/ctlcmd: unify the error message when context is missing - o/hookstate: support snapctl refresh --pending from snap - many: remove unused/dead code - cmd/libsnap-confine-private: add BPF support helpers - interfaces/hardware-observe: add some dmi properties - snapstate: abort kernel refresh if no gadget update can be found - many: shellcheck fixes - cmd/snap: add Size column to refresh --list - packaging: build without dwarf debugging data - snapstate: fix misleading `assumes` error message - tests: fix restore in snapfuse spread tests - o/assertstate: fix missing 'scheduled' header when auto refreshing assertions - o/snapstate: fail remove with invalid snap names - o/hookstate/ctlcmd: correct err message if missing root - .github/workflows/test.yaml: fix logic - o/snapstate: don't hold some snaps if not all snaps can be held by the given gating snap - c-vendor.c: new c-vendor subdir - store: make sure expectedZeroFields in tests gets updated - overlord: add manager test for "assumes" checking - store: deal correctly with "assumes" from the store raw yaml - sysconfig/cloudinit.go: add functions for filtering cloud-init config - cgroup-support: allow to hide cgroupv2 warning via ENV - gadget: Export mkfs functions for use in ubuntu-image - tests: set to 10 minutes the kill timeout for tests failing on slow boards - .github/workflows/test.yaml: test github.events key - i18n/xgettext-go: preserve already escaped quotes - cmd/snap-seccomp/syscalls: update syscalls list to libseccomp v2.2.0-428-g5c22d4b - github: do not try to upload coverage when working with cached run - tests/main/services-install-hook-can-run-svcs: shellcheck issue fix - interfaces/u2f-devices: add Nitrokey FIDO2 - testutil: add DeepUnsortedMatches Checker - cmd, packaging: import BPF headers from kernel, detect whether host headers are usable - tests: fix services-refresh-mode test - tests: clean snaps.sh helper - tests: fix timing issue on security-dev-input-event-denied test - tests: update systems for sru validation - .github/workflows: add codedov again - secboot: remove duplicate import - tests: stop the service when is active in test interfaces- firewall-control test - packaging: remove TEST_GITHUB_AUTOPKGTEST support - packaging: merge 2.51.6 changelog back to master - secboot: use half the mem for KDF in AddRecoveryKey - secboot: switch main key KDF memory cost to 32KB - tests: remove the test user just when it was installed on create- user-2 test - spread: temporarily fix the ownership of /home/ubuntu/.ssh on 21.10 - daemon, o/snapstate: handle IgnoreValidation flag on install (2/3) - usersession/agent: refactor common JSON validation into own function - o/hookstate: allow snapctl refresh --proceed from snaps - cmd/libsnap-confine-private: fix issues identified by coverity - cmd/snap: print logs in local timezone - packaging: changelog for 2.51.5 to master - build-aux: build with go-1.13 in the snapcraft build too - config: rename "virtual" config to "external" config - devicestate: add `snap debug timings --ensure=install-system` - interfaces/builtin/raw_usb: fix platform typo, fix access to usb devices accessible through platform - o/snapstate: remove commented out code - cmd/snap-device-helper: reimplement snap-device-helper - cmd/libsnap-confine-private: fix coverity issues in tests, tweak uses of g_assert() - o/devicestate/handlers_install.go: add workaround to create dirs for install - o/assertstate: implement ValidationSetAssertionForEnforce helper - clang-format: stop breaking my includes - o/snapstate: allow auto-refresh limited to snaps affected by a specific gating snap - tests: fix core-early-config test to use tests.nested tool - sysconfig/cloudinit.go: measure (but don't use) gadget cloud-init datasource - c/snap,o/hookstate/ctlcmd: add JSON/string strict processing flags to snap/snapctl - corecfg: add "system.hostname" setting to the system settings - wrappers: measure time to enable services in StartServices() - configcore: fix early config timezone handling - tests/nested/manual: enable serial assertions on testkeys nested VM's - configcore: fix a bunch of incorrect error returns - .github/workflows/test.yaml: use snapcraft 4.x to build the snapd snap - packaging: merge 2.51.4 changelog back to master - {device,snap}state: skip kernel extraction in seeding - vendor: move to snapshot-4c814e1 branch and set fixed KDF options - tests: use bigger storage on ubuntu 21.10 - snap: support links map in snap.yaml (and later from the store API) - o/snapstate: add AffectedByRefreshCandidates helper - configcore: register virtual config for timezone reading - cmd/libsnap-confine-private: move device cgroup files, add helper to deny a device - tests: fix cached-results condition in github actions workflow - interfaces/tee: add support for Qualcomm qseecom device node - packaging: fix build failure on bionic and simplify rules - o/snapstate: affectedByRefresh tweaks - tests: update nested wait for snapd command - interfaces/builtin: allow access to per-user GTK CSS overrides - tests/main/snapd-snap: install 4.x snapcraft to build the snapd snap - snap/squashfs: handle squashfs-tools 4.5+ - asserts/snapasserts: CheckPresenceInvalid and CheckPresenceRequired methods - cmd/snap-confine: refactor device cgroup handling to enable easier v2 integration - tests: skip udp protocol on latest ubuntus - cmd/libsnap-confine-private: g_spawn_check_exit_status is deprecated since glib 2.69 - interfaces: s/specifc/specific/ - github: enable gofmt for Go 1.13 jobs - overlord/devicestate: UC20 specific set-model, managers tests - o/devicestate, sysconfig: refactor cloud-init config permission handling - config: add "virtual" config via config.RegisterVirtualConfig - packaging: switch ubuntu to use golang-1.13 - snap: change `snap login --help` to not mention "buy" - tests: removing Ubuntu 20.10, adding 21.04 nested in spread - tests/many: remove lxd systemd unit to prevent unexpected leftovers - tests/main/services-install-hook-can-run-svcs: make variants more obvious - tests: force snapd-session-agent.socket to be re-generated- New upstream release 2.52.1 - snap-bootstrap: wait in `mountNonDataPartitionMatchingKernelDisk` for the disk (if not present already) - many: support an API flag system-restart-immediate to make snap ops proceed immediately with system restarts - cmd/libsnap-confine-private: g_spawn_check_exit_status is deprecated since glib 2.69 - interfaces/seccomp: add clone3 to default template - interfaces/apparmor/template.go: allow inspection of dbus mediation level - interfaces/dsp: add a usb rule to the ambarella flavor - cmd/snap-confine: update s-c apparmor profile to allow versioned ld.so - o/ifacestate: don't lose connections if snaps are broken - interfaces/builtin/opengl.go: add libOpenGL.so* too - interfaces/hardware-observe: add some dmi properties - build-aux: stage libgcc1 library into snapd snap - interfaces/block-devices: support to access the state of block devices - packaging: ship the `snapd.apparmor.service` unit in debian- Update to 2.52 - Drop squashfs 4.5+ patch as it's part of 2.52 release - Cherry pick clone3 seccom patch (RHBZ#2008737)- New upstream release 2.52 - interface/builtin: add qualcomm-ipc-router interface for AF_QIPCRTR socket protocol - o/ifacestate: special-case system-files and force refreshing its static attributes - interfaces/network-control: additional ethernet rule - packaging: update 2.52 changelog with 2.51.7 - interfaces/interfaces/ion-memory-control: add: add interface for ion buf - packaging: merge 2.51.6 changelog back to 2.52 - secboot: use half the mem for KDF in AddRecoveryKey - secboot: switch main key KDF memory cost to 32KB - many: merge release/2.51 change to release/2.52 - .github/workflows/test.yaml: use snapcraft 4.x to build the snapd snap - o/servicestate: use snap app names for ExplicitServices of ServiceAction - tests/main/services-install-hook-can-run-svcs: add variant w/o --enable - o/servicestate: revert only start enabled services - tests: adding Ubuntu 21.10 to spread test suite - interface/modem-manager: add support for MBIM/QMI proxy clients - cmd/snap/model: support storage-safety and snaps headers too - o/assertstate: Implement EnforcedValidationSets helper - tests: using retry tool for nested tests - gadget: check for system-save with multi volumes if encrypting correctly - interfaces: make the service naming entirely internal to systemd BE - tests/lib/reset.sh: fix removing disabled snaps - store/store_download.go: use system snap provided xdelta3 priority + fallback - packaging: merge changelog from 2.51.3 back to master - overlord: only start enabled services - interfaces/builtin: add sd-control interface - tests/nested/cloud-init-{never-used,nocloud}-not-vuln: fix tests, use 2.45 - tests/lib/reset.sh: add workaround from refresh-vs-services tests for all tests - o/assertstate: check for conflicts when refreshing and committing validation set asserts - devicestate: add support to save timings from install mode - tests: new tests.nested commands copy and wait-for - install: add a bunch of nested timings - tests: drop any-python wrapper - store: set ResponseHeaderTimeout on the default transport - tests: fix test-snapd-user-service-sockets test removing snap - tests: moving nested_exec to nested.tests exec - tests: add tests about services vs snapd refreshes - client, cmd/snap, daemon: refactor REST API for quotas to match CLI org - c/snap,asserts: create/delete-key external keypair manager interaction - tests: revert disable of the delta download tests - tests/main/system-usernames-microk8s: disable on centos 7 too - boot: support device change - o/snapstate: remove unused refreshSchedule argument for isRefreshHeld helper - daemon/api_quotas.go: handle conflicts, returning conflict response - tests: test for gate-auto-refresh hook error resulting in hold - release: 2.51.2 - snapstate/check_snap: add snap_microk8s to shared system- usernames - snapstate: remove temporary snap file for local revisions early - interface: allows reading sd cards internal info from block- devices interface - tests: Renaming tool nested-state to tests.nested - testutil: fix typo in json checker unit tests - tests: ack assertions by default, add --noack option - overlord/devicestate: try to pick alternative recovery labels during remodel - bootloader/assets: update recovery grub to allow system labels generated by snapd - tests: print serial log just once for nested tests - tests: remove xenial 32 bits - sandbox/cgroup: do not be so eager to fail when paths do not exist - tests: run spread tests in ubuntu bionic 32bits - c/snap,asserts: start supporting ExternalKeypairManager in the snap key-related commands - tests: refresh control spread test - cmd/libsnap-confine-private: do not fail on ENOENT, better getline error handling - tests: disable delta download tests for now until the store is fixed - tests/nested/manual/preseed: fix for cloud images that ship without core18 - boot: properly handle tried system model - tests/lib/store.sh: revert #10470 - boot, seed/seedtest: tweak test helpers - o/servicestate: TODO and fix preexisting typo - o/servicestate: detect conflicts for quota group operations - cmd/snap/quotas: adjust help texts for quota commands - many/quotas: little adjustments - tests: add spread test for classic snaps content slots - o/snapstate: fix check-rerefresh task summary when refresh control is used - many: use changes + tasks for quota group operations - tests: fix test snap-quota-groups when checking file cgroupProcsFile - asserts: introduce ExternalKeypairManager - o/ifacestate: do not visit same halt tasks in waitChainSearch to avoid cycles - tests/lib/store.sh: fix make_snap_installable_with_id() - overlord/devicestate, overlord/assertstate: use a temporary DB when creating recovery systems - corecfg: allow using `# snapd-edit: no` header to disable pi- config# snapd-edit: no - tests/main/interfaces-ssh-keys: tweak checks for openSUSE Tumbleweed - cmd/snap: prevent cycles in waitChainSearch with snap debug state - o/snapstate: fix populating of affectedSnapInfo.AffectingSnaps for marking self as affecting - tests: new parameter used by retry tool to set env vars - tests: support parameters for match-log on journal-state tool - configcore: ignore system.pi-config.* setting on measured kernels - sandbox/cgroup: support freezing groups with unified hierarchy - tests: fix preseed test to used core20 snap on latest systems - testutil: introduce a checker which compares the type after having passed them through a JSON marshaller - store: tweak error message when store.Sections() download fails - o/servicestate: stop setting DoneStatus prematurely for quota- control - cmd/libsnap-confine-private: bump max depth of groups hierarchy to 32 - many: turn Contact into an accessor - store: make the log with download size a debug one - cmd/snap-update-ns: Revert "cmd/snap-update-ns: add SRCDIR to include search path" - o/devicestate: move SystemMode method before first usage - tests: skip tests when the sections cannot be retrieved - boot: support resealing with a try model - o/hookstate: dedicated handler for gate-auto-refresh hook - tests: make sure the /root/snap dir is backed up on test snap- user-dir-perms-fixed - cmd/snap-confine: make mount ns use check cgroup v2 compatible - snap: fix TestInstallNoPATH unit test failure when SUDO_UID is set - cmd/libsnap-confine-private/cgroup-support.c: Fix typo - cmd/snap-confine, cmd/snapd-generator: fix issues identified by sparse - o/snapstate: make conditional-auto-refresh conflict with other tasks via affected snaps - many: pass device/model info to configcore via sysconfig.Device interface - o/hookstate: return bool flag from Error function of hook handler to ignore hook errors - cmd/snap-update-ns: add SRCDIR to include search path - tests: fix for tests/main/lxd-mount-units test and enable ubuntu-21.04 - overlord, o/devicestate: use a single test helper for resetting to a post boot state - HACKING.md: update instructions for go1.16+ - tests: fix restore for security-dev-input-event-denied test - o/servicestate: move SetStatus to doQuotaControl - tests: fix classic-prepare-image test - o/snapstate: prune gating information and refresh-candidates on snap removal - o/svcstate/svcstatetest, daemon/api_quotas: fix some tests, add mock helper - cmd: a bunch of tweaks and updates - o/servicestate: refactor meter handling, eliminate some common parameters - o/hookstate/ctlcmd: allow snapctl refresh --pending --proceed syntax. - o/snapstate: prune refresh candidates in check-rerefresh - osutil: pass --extrausers option to groupdel - o/snapstate: remove refreshed snap from snaps-hold in snapstate.doInstall - tests/nested: add spread test for uc20 cloud.conf from gadgets - boot: drop model from resealing and boostate - o/servicestate, snap/quota: eliminate workaround for buggy systemds, add spread test - o/servicestate: introduce internal and servicestatetest - o/servicestate/quota_control.go: enforce minimum of 4K for quota groups - overlord/servicestate: avoid unnecessary computation of disabled services - o/hookstate/ctlcmd: do not call ProceedWithRefresh immediately from snapctl - o/snapstate: prune hold state during autoRefreshPhase1 - wrappers/services.go: do not restart disabled or inactive services - sysconfig/cloudinit.go: allow installing both gadget + ubuntu-seed config - spread: switch LXD back to latest/candidate channel - interfaces/opengl: add support for Imagination PowerVR - boot: decouple model from seal/reseal handling via an auxiliary type - spread, tests/main/lxd: no longer manual, switch to latest/stable - github: try out golangci-lint - tests: set lxd test to manual until failures are fixed - tests: connect 30% of the interfaces on test interfaces-many-core- provided - packaging/debian-sid: update snap-seccomp patches for latest master - many: fix imports order (according to gci) - o/snapstate: consider held snaps in autoRefreshPhase2 - o/snapstate: unlock the state before calling backend in undoStartSnapServices - tests: replace "not MATCH" by NOMATCH in tests - README.md: refer to new IRC server - cmd/snap-preseed: provide more error info if snap-preseed fails early on mount - daemon: add a Daemon argument to AccessChecker.CheckAccess - c/snap-bootstrap: add bind option with tests - interfaces/builtin/netlink_driver_test.go: add test snippet - overlord/devicestate: set up recovery system tasks when attempting a remodel - osutil,strutil,testutil: fix imports order (according to gci) - release: merge 2.51.1 changelog - cmd: fix imports order (according to gci) - tests/lib/snaps/test-snapd-policy-app-consumer: remove dsp-control interface - o/servicestate: move handlers tests to quota_handlers_test.go file instead - interfaces: add netlink-driver interface - interfaces: remove leftover debug print - systemd: refactor property parsers for int values in CurrentTasksCount, etc. - tests: fix debug section for postrm-purge test - tests/many: change all cloud-init passwords for ubuntu to use plain_test_passwd - asserts,interfaces,snap: fix imports order (according to gci) - o/servicestate/quota_control_test.go: test the handlers directly - tests: fix issue when checking the udev tag on test security- device-cgroups - many: introduce Store.SnapExists and use it in /v2/accessories/themes - o/snapstate: update LastRefreshTime in doLinkSnap handler - o/hookstate: handle snapctl refresh --proceed and --hold - boot: fix model inconsistency check in modeenv, extend unit tests - overlord/servicestate: improve test robustness with locking - tests: first part of the cleanup - tests: new note in HACKING file to clarify about yamlordereddictloader dependency - daemon: make CheckAccess return an apiError - overlord: fix imports ordering (according to gci) - o/servicestate: add quotastate handlers - boot: track model's sign key ID, prepare infra for tracking candidate model - daemon: have apiBaseSuite.errorReq return *apiError directly - o/servicestate/service_control.go: add comment about ExplicitServices - interfaces: builtin: add dm-crypt interface to support external storage encryption - daemon: split out error response code from response*.go to errors*.go - interfaces/dsp: fix typo in udev rule - daemon,o/devicestate: have DeviceManager.SystemMode take an expectation on the system - o/snapstate: add helpers for setting and querying holding time for snaps - many: fix quota groups for centos 7, amazon linux 2 w/ workaround for buggy systemd - overlord/servicestate: mv ensureSnapServicesForGroup to new file - overlord/snapstate: lock the mutex before returning from stop snap services undo - daemon: drop resp completely in favor of using respJSON consistently - overlord/devicestate: support for snap downloads in recovery system handlers - daemon: introduce a separate findResponse, simplify SyncRespone and drop Meta - overlord/snapstate, overlord/devicestate: exclusive change conflict check - wrappers, packaging, snap-mgmt: handle removing slices on purge too - services: remember if acting on the entire snap - store: extend context and action objects of SnapAction with validation-sets - o/snapstate: refresh control - autorefresh phase2 - cmd/snap/quota: refactor quota CLI as per new design - interfaces: opengl: change path for Xilinx zocl driver - tests: update spread images for ubuntu-core-20 and ubuntu-21.04 - o/servicestate/quota_control_test.go: change helper escaping - o/configstate/configcore: support snap set system swap.size=... - o/devicestate: require serial assertion before remodeling can be started - systemd: improve systemctl error reporting - tests/core/remodel: use model assertions signed with valid keys - daemon: use apiError for more of the code - store: fix typo in snapActionResult struct json tag - userd: mock `systemd --version` in privilegedDesktopLauncherSuite - packaging/fedora: sync with downstream packaging - daemon/api_quotas.go: include current memory usage information in results - daemon: introduce StructuredResponse and apiError - o/patch: check if we have snapd snap with correct snap type already in snapstate - tests/main/snapd-snap: build the snapd snap on all platforms with lxd - tests: new commands for snaps-state tool - tests/main/snap-quota-groups: add functional spread test for quota groups - interfaces/dsp: add /dev/cavalry into dsp interface - cmd/snap/cmd_info_test.go: make test robust against TZ changes - tests: moving to tests directories snaps built locally - part 2 - usersession/userd: fix unit tests on systems using /var/lib/snapd - sandbox/cgroup: wait for pid to be moved to the desired cgroup - tests: fix snap-user-dir-perms-fixed vs format checks - interfaces/desktop-launch: support confined snaps launching other snaps - features: enable dbus-activation by default - usersession/autostart: change ~/snap perms to 0700 on startup - cmd/snap-bootstrap/initramfs-mounts: mount ubuntu-data nosuid - tests: new test static checker - release-tool/changelog.py: misc fixes from real world usage - release-tools/changelog.py: add function to generate github release template - spread, tests: Fedora 32 is EOL, drop it - o/snapstate: bump max postponement from 60 to 95 days - interfaces/apparmor: limit the number of jobs when running with a single CPU - packaging/fedora/snapd.spec: correct date format in changelog - packaging: merge 2.51 changelog back to master - packaging/ubuntu-16.04/changelog: add 2.50 and 2.50.1 changelogs, placeholder for 2.51 - interfaces: allow read access to /proc/tty/drivers to modem- manager and ppp/dev/tty- New upstream release 2.51.7 (RHBZ#1972558) - Include an upstream fix for squashfs 4.5+ compatibility (RHBZ#1999998)- New upstream release 2.51.7 - cmd/snap-seccomp/syscalls: update syscalls list to libseccomp v2.2.0-428-g5c22d4b1 - tests: cherry-pick shellcheck fix `bd730fd4` - interfaces/dsp: add /dev/ambad into dsp interface - many: shellcheck fixes - snapstate: abort kernel refresh if no gadget update can be found - overlord: add manager test for "assumes" checking - store: deal correctly with "assumes" from the store raw yaml- New upstream release 2.51.6 - secboot: use half the mem for KDF in AddRecoveryKey - secboot: switch main key KDF memory cost to 32KB- New upstream release 2.51.5 - snap/squashfs: handle squashfs-tools 4.5+ - tests/core20-install-device-file-install-via-hook-hack: adjust test for 2.51 - o/devicestate/handlers_install.go: add workaround to create dirs for install - tests: fix linter warning - tests: update other spread tests for new behaviour - tests: ack assertions by default, add --noack option - release-tools/changelog.py: also fix opensuse changelog date format - release-tools/changelog.py: fix typo in function name - release-tools/changelog.py: fix fedora date format - release-tools/changelog.py: handle case where we don't have a TZ - release-tools/changelog.py: fix line length check - release-tools/changelog.py: specify the LP bug for the release as an arg too - interface/modem-manager: add support for MBIM/QMI proxy clients - .github/workflows/test.yaml: use snapcraft 4.x to build the snapd snap- New upstream release 2.51.4 - {device,snap}state: skip kernel extraction in seeding - vendor: move to snapshot-4c814e1 branch and set fixed KDF options - tests/interfaces/tee: fix HasLen check for udev snippets - interfaces/tee: add support for Qualcomm qseecom device node - gadget: check for system-save with multi volumes if encrypting correctly - gadget: drive-by: drop unnecessary/supported passthrough in test gadget.yaml- Cherry pick a compatibility fix for squashfs 4.5+- Fix FTBFS with glib 2.69- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild- New upstream release 2.51.3 - interfaces/builtin: add sd-control interface - store: set ResponseHeaderTimeout on the default transport- New upstream release 2.51.2 - snapstate: remove temporary snap file for local revisions early - interface: allows reading sd cards internal info from block- devices interface - o/ifacestate: do not visit same halt tasks in waitChainSearch to avoid slow convergence (or unlikely cycles) - corecfg: allow using `# snapd-edit: no` header to disable pi- config - configcore: ignore system.pi-config.* setting on measured kernels - many: pass device/model info to configcore via sysconfig.Device interface - o/configstate/configcore: support snap set system swap.size=... - store: make the log with download size a debug one - interfaces/opengl: add support for Imagination PowerVR- New upstream release 2.51.1 - interfaces: add netlink-driver interface - interfaces: builtin: add dm-crypt interface to support external storage encryption - interfaces/dsp: fix typo in udev rule - overlord/snapstate: lock the mutex before returning from stop snap services undo - interfaces: opengl: change path for Xilinx zocl driver - interfaces/dsp: add /dev/cavalry into dsp interface - packaging/fedora/snapd.spec: correct date format in changelog- Relase 2.51 to Fedora (RHBZ#1962474)- New upstream release 2.51 - cmd/snap: stacktraces debug endpoint - secboot: deactivate volume again when model checker fails - store: extra log message, a few minor cleanups - packaging/debian-sid: update systemd patch - snapstate: adjust update-gadget-assets user visible message - tests/nested/core/core20-create-recovery: verify that recovery system can be created at runtime - gadget: support creating vfat partitions during bootstrap - daemon/api_quotas.go: support updating quotas with ensure action - daemon: tighten access to a couple of POST endpoints that should be really be root-only - seed/seedtest, overlord/devicestate: move seed validation helper to seedtest - overlord/hookstate/ctlcmd: remove unneeded parameter - snap/quota: add CurrentMemoryUsage for current memory usage of a quota group - systemd: add CurrentMemoryUsage to get current memory usage for a unit - o/snapstate: introduce minimalInstallInfo interface - o/hookstate: print pending info (ready, inhibited or none) - osutil: a helper to find out the total amount of memory in the system - overlord, overlord/devicestate: allow for reloading modeenv in devicemgr when testing - daemon: refine access testing - spread: disable unattended-upgrades on debian - tests/lib/reset: make nc exit after a while when connection is idle - daemon: replace access control flags on commands with access checkers - release-tools/changelog.py: refactor regexp + file reading/writing - packaging/debian-sid: update locale patch for the latest master - overlord/devicestate: tasks for creating recovery systems at runtime - release-tools/changelog.py: implement script to update all the changelog files - tests: change machine type used for nested testsPrices: - cmd/snap: include locale when linting description being lower case - o/servicestate: add RemoveSnapFromQuota - interfaces/serial-port: add Qualcomm serial port devices to allowed list - packaging: merge 2.50.1 changelog back - interfaces/builtin: introduce raw-input interface - tests: remove tests.cleanup prepare from nested test - cmd/snap-update-ns: fix linter errors - asserts: fix errors reported by linter - o/hookstate/ctlcmd: allow system-mode for non-root - overlord/devicestate: comment why explicit system mode check is needed in ensuring tried recovery systems (#10275) - overlord/devicesate: observe snap writes when creating recovery systems - packaging/ubuntu-16.04/changelog: add placeholder for 2.50.1 - tests: moving to tests directories snaps built locally - part 1 - seed/seedwriter: fail early when system seed directory exists - o/snapstate: autorefresh phase1 for refresh-control - c/snap: more precise message for ErrorKindSystemRestart op != reboot - tests: simplify the tests.cleanup tool - boot: helpers for manipulating current and good recovery systems list - o/hookstate, o/snapstate: print revision, version, channel with snapctl --pending - overlord: unit test tweaks, use well known snap IDs, setup snap declarations for most common snaps - tests/nested/manual: add test for install-device + snapctl reboot - o/servicestate: restart slices + services on modifications - tests: update mount-ns test to support changes in the distro - interfaces: fix linter issues - overlord: mock logger in managers unit tests - tests: adding support for fedora-34 - tests: adding support for debian 10 on gce - boot: reseal given keys when the respective boot chain has changed - secboot: switch encryption key size to 32 byte (thanks to Chris) - interfaces/dbus: allow claiming 'well-known' D-Bus names with a wildcard suffix - spread: bump delta reference version - interfaces: builtin: update permitted paths to be compatible with UC20 - overlord: fix errors reported by linter - tests: remove old fedora systems from tests - tests: update spread url - interfaces/camera: allow devices in /sys/devices/platform/**/usb* - interfaces/udisks2: Allow access to the login manager via dbus - cmd/snap: exit normally if "snap changes" has no changes (LP #1823974) - tests: more fixes for spread suite on openSUSE - tests: fix tests expecting cgroup v1/hybrid on openSUSE Tumbleweed - daemon: fix linter errors - spread: add Fedora 34, leave a TODO about dropping Fedora 32 - interfaces: fix linter errors - tests: use op.paths tools instead of dirs.sh helper - part 2 - client: Fix linter errors - cmd/snap: Fix errors reported by linter - cmd/snap-repair: fix linter issues - cmd/snap-bootstrap: Fix linter errors - tests: update permission denied message for test-snapd-event on ubuntu 2104 - cmd/snap: small tweaks based on previous reviews - snap/snaptest: helper that mocks both the squashfs file and a snap directory - overlord/devicestate: tweak comment about creating recovery systems, formatting tweaks - overlord/devicestate: move devicemgr base suite helpers closer to test suite struct - overlord/devicestate: keep track of tried recovery system - seed/seedwriter: clarify in the diagram when SetInfo is called - overlord/devicestate: add helper for creating recovery systems at runtime - snap-seccomp: update syscalls.go list - boot,image: support image.Customizations.BootFlags - overlord: support snapctl --halt|--poweroff in gadget install- device - features,servicestate: add experimental.quota-groups flag - o/servicestate: address comments from previous PR - tests: basic spread test for snap quota commands - tests: moving the snaps which are not locally built to the store directory - image,c/snap: implement prepare-image --customize - daemon: implement REST API for quota groups (create / list / get) - cmd/snap, client: snap quotas command - o/devicestate,o/hookstate/ctlcmd: introduce SystemModeInfo methods and snapctl system-mode - o/servicestate/quota_control.go: introduce (very) basic group manipulation methods - cmd/snap, client: snap remove-quota command - wrappers, quota: implement quota groups slice generation - snap/quotas: followups from previous PR - cmd/snap: introduce 'snap quota' command - o/configstate/configcore/picfg.go: use ubuntu-seed config.txt in uc20 run mode - o/servicestate: test has internal ordering issues, consider both cases - o/servicestate/quotas: add functions for getting and setting quotas in state - tests: new buckets for snapd-spread project on gce - spread.yaml: update the gce project to start using snapd-spread - quota: new package for managing resource groups - many: bind and check keys against models when using FDE hooks v2 - many: move responsibilities down seboot -> kernel/fde and boot -> secboot - packaging: add placeholder changelog - o/configstate/configcore/vitality: fix RequireMountedSnapdSnap bug - overlord: properly mock usr-lib-snapd tests to mimic an Ubuntu Core system - many: hide EncryptionKey size and refactors for fde hook v2 next steps - tests: adding debug info for create user tests - o/hookstate: add "refresh" command to snapctl (hidden, not complete yet) - systemd: wait for zfs mounts (LP #1922293) - testutil: support referencing files in FileEquals checker - many: refactor to kernel/fde and allow `fde-setup initial-setup` to return json - o/snapstate: store refresh-candidates in the state - o/snapstate: helper for creating gate-auto-refresh hooks - bootloader/bootloadertest: provide interface implementation as mixins, provide a mock for recovery-aware-trusted-asses bootloader - tests/lib/nested: do not compress images, return early when restored from pristine image - boot: split out a helper for making recovery system bootable - tests: update os.query check to match new bullseye codename used on sid images - o/snapstate: helper for getting snaps affected by refresh, define new hook - wrappers: support in EnsureSnapServices a callback to observe changes (#10176) - gadget: multi line support in gadget's cmdline file - daemon: test that requesting restart from (early) Ensure works - tests: use op.paths tools instead of dirs.sh helper - part 1 - tests: add new command to snaps-state to get current core, kernel and gadget - boot, gadget: move opening the snap container into the gadget helper - tests, overlord: extend unit tests, extend spread tests to cover full command line support - interfaces/builtin: introduce dsp interface - boot, bootloader, bootloader/assets: support for full command line override from gadget - overlord/devicestate, overlord/snapstate: add task for updating kernel command lines from gadget - o/snapstate: remove unused DeviceCtx argument of ensureInstallPreconditions - tests/lib/nested: proper status return for tpm/secure boot checks - cmd/snap, boot: add snapd_full_cmdline_args to dumped boot vars - wrappers/services.go: refactor helper lambda function to separate function - boot/flags.go: add HostUbuntuDataForMode - boot: handle updating of components that contribute to kernel command line - tests: add 20.04 to systems for nested/core - daemon: add new accessChecker implementations - boot, overlord/devicestate: consider gadget command lines when updating boot config - tests: fix prepare-image-grub-core18 for arm devices - tests: fix gadget-kernel-refs-update-pc test on arm and when $TRUST_TEST_KEY is false - tests: enable help test for all the systems - boot: set extra command line arguments when preparing run mode - boot: load bits of kernel command line from gadget snaps - tests: update layout for tests - part 2 - tests: update layout for tests - part 1 - tests: remove the snap profiler from the test suite - boot: drop gadget snap yaml which is already defined elsewhere in the tests - boot: set extra kernel command line arguments when making a recovery system bootable - boot: pass gadget path to command line helpers, load gadget from seed - tests: new os.paths tool - daemon: make ucrednetGet() return a *ucrednet structure - boot: derive boot variables for kernel command lines - cmd/snap-bootstrap/initramfs-mounts: fix boot-flags location from initramfs- New upstream release 2.50.1 - interfaces: update permitted /lib/.. paths to be compatible with UC20 - interfaces: builtin: update permitted paths to be compatible with UC20 - interfaces/greengrass-support: delete white spaces at the end of lines - snap-seccomp: update syscalls.go list - many: backport kernel command line for 2.50 - interfaces/dbus: allow claiming 'well-known' D-Bus names with a wildcard suffix - interfaces/camera: allow devices in /sys/devices/platform/**/usb* - interfaces/builtin: introduce dsp interface- Release 2.50 to Fedora (RHBZ#1936784)- New upstream release 2.50 - overlord: properly mock usr-lib-snapd tests to mimic an Ubuntu Core system - o/configstate/configcore/vitality: fix RequireMountedSnapdSnap bug - o/servicestate/servicemgr.go: add ensure loop for snap service units - wrappers/services.go: introduce EnsureSnapServices() - snapstate: add "kernel-assets" to featureSet - systemd: wait for zfs mounts - overlord: make servicestate responsible to compute SnapServiceOptions - boot,tests: move where we write boot-flags one level up - o/configstate: don't pass --root=/ when masking/unmasking/enabling/disabling services - cmd/snap-bootstrap/initramfs-mounts: write active boot-flags to /run - gadget: be more flexible with kernel content resolving - boot, cmd/snap: include extra cmdline args in debug boot-vars output - boot: support read/writing boot-flags from userspace/initramfs - interfaces/pwm: add PWM interface - tests/lib/prepare-restore.sh: clean out snapd changes and snaps before purging - systemd: enrich UnitStatus returned by systemd.Status() with Installed flag - tests: updated restore phase of spread tests - part 1 - gadget: add support for kernel command line provided by the gadget - tests: Using GO111MODULE: "off" in spread.yaml - features: add gate-auto-refresh-hook feature flag - spread: ignore linux kernel upgrade in early stages for arch preparation - tests: use snaps-state commands and remove them from the snaps helper - o/configstate: fix panic with a sequence of config unset ops over same path - api: provide meaningful error message on connect/disconnect for non-installed snap - interfaces/u2f-devices: add HyperFIDO Pro - tests: add simple sanity check for systemctl show --property=UnitFileState for unknown service - tests: use tests.session tool on interfaces-desktop-document- portal test - wrappers: install D-Bus service activation files for snapd session tools on core - many: add x-gvfs-hide option to mount units - interfaces/builtin/gpio_test.go: actually test the generated gpio apparmor - spread: tentative workaround for arch failure caused by libc upgrade and cgroups v2 - tests: add spread test for snap validate against store assertions - tests: remove snaps which are not used in any test - ci: set the accept-existing-contributors parameter for the cla- check action - daemon: introduce apiBaseSuite.(json|sync|async|error)Req (and some apiBaseSuite cosmetics) - o/devicestate/devicemgr: register install-device hook, run if present in install - o/configstate/configcore: simple refactors in preparation for new function - tests: unifying the core20 nested suite with the core nested suite - tests: uboot-unpacked-assets updated to reflect the real path used to find the kernel - daemon: switch api_test.go to daemon_test and various other cleanups - o/configstate/configcore/picfg.go: add hdmi_cvt support - interfaces/apparmor: followup cleanups, comments and tweaks - boot: cmd/snap-bootstrap: handle a candidate recovery system v2 - overlord/snapstate: skip catalog refresh when snappy testing is enabled - overlord/snapstate, overlord/ifacestate: move late security profile removal to ifacestate - snap-seccomp: fix seccomp test on ppc64el - interfaces, interfaces/apparmor, overlord/snapstate: late removal of snap-confine apparmor profiles - cmd/snap-bootstrap/initramfs-mounts: move time forward using assertion times - tests: reset the system while preparing the test suite - tests: fix snap-advise-command check for 429 - gadget: policy for gadget/kernel refreshes - o/configstate: deal with no longer valid refresh.timer=managed - interfaces/udisks2: allow locking /run/mount/utab for udisks 2.8.4 - cla-check: Use has-signed-canonical-cla GitHub Action - tests: validation sets spread test - tests: simplify the reset.sh logic by removing not needed command - overlord/snapstate: make sure that snapd current symlink is not removed during refresh - tests/core/fsck-on-boot: unmount /run/mnt/snapd directly on uc20 - tests/lib/fde-setup-hook: also verify that fde-reveal-key key data is base64 - o/devicestate: split off ensuring next boot goes to run mode into new task - tests: fix cgroup-tracking test - boot: export helper for clearing tried system state, add tests - cmd/snap: use less aggressive client timeouts in unit tests - daemon: fix signing key validity timestamp in unit tests - o/{device,hook}state: encode fde-setup-request key as base64 string - packaging: drop dh-systemd from build-depends on ubuntu-16.04+ - cmd/snap/pack: unhide the compression option - boot: extend set try recovery system unit tests - cmd/snap-bootstrap: refactor handling of ubuntu-save, do not use secboot's implicit fallback - o/configstate/configcore: add hdmi_timings to pi-config - snapstate: reduce reRefreshRetryTimeout to 1/2 second - interfaces/tee: add TEE/OPTEE interface - o/snapstate: update validation sets assertions with auto-refresh - vendor: update go-tpm2/secboot to latest version - seed: ReadSystemEssentialAndBetterEarliestTime - tests: replace while commands with the retry tool - interfaces/builtin: update unit tests to use proper distro's libexecdir - tests: run the reset.sh helper and check test invariants while the test is restored - daemon: switch preexisting daemon_test tests to apiBaseSuite and .req - boot, o/devicestate: split makeBootable20 into two parts - interfaces/docker-support: add autobind unix rules to docker- support - interfaces/apparmor: allow reading /proc/sys/kernel/random/entropy_avail - tests: use retry tool instead a loops - tests/main/uc20-create-partitions: fix tests cleanup - asserts: mode where Database only assumes cur time >= earliest time - daemon: validation sets/api tests cleanup - tests: improve tests self documentation for nested test suite - api: local assertion fallback when it's not in the store - api: validation sets monitor mode - tests: use fs-state tool in interfaces tests - daemon: move out /v2/login|logout and errToResponse tests from api_test.go - boot: helper for inspecting the outcome of a recovery system try - o/configstate, o/snapshotstate: fix handling of nil snap config on snapshot restore - tests: update documentation and checks for interfaces tests - snap-seccomp: add new `close_range` syscall - boot: revert #10009 - gadget: remove `device-tree{,-origin}` from gadget tests - boot: simplify systems test setup - image: write resolved-content from snap prepare-image - boot: reseal the run key for all recovery systems, but recovery keys only for the good ones - interfaces/builtin/network-setup-{control,observe}: allow using netplan directly - tests: improve sections prepare and restore - part 1 - tests: update details on task.yaml files - tests: revert os.query usage in spread.yaml - boot: export bootAssetsMap as AssetsMap - tests/lib/prepare: fix repacking of the UC20 kernel snap for with ubuntu-core-initramfs 40 - client: protect against reading too much data from stdin - tests: improve tests documentation - part 2 - boot: helper for setting up a try recover system - tests: improve tests documentation - part 1 - tests/unit/go: use tests.session wrapper for running tests as a user - tests: improvements for snap-seccomp-syscalls - gadget: simplify filterUpdate (thanks to Maciej) - tests/lib/prepare.sh: use /etc/group and friends from the core20 snap - tests: fix tumbleweed spread tests part 2 - tests: use new commands of os.query tool on tests - o/snapshotstate: create snapshots directory on import - tests/main/lxd/prep-snapd-in-lxd.sh: dump contents of sources.list - packaging: drop 99-snapd.conf via dpkg-maintscript-helper - osutil: add SetTime() w/ 32-bit and 64-bit implementations - interfaces/wayland: rm Xwayland Xauth file access from wayland slot - packaging/ubuntu-16.04/rules: turn modules off explicitly - gadget,devicestate: perform kernel asset update for $kernel: style refs - cmd/recovery: small fix for `snap recovery` tab output - bootloader/lkenv: add recovery systems related variables - tests: fix new tumbleweed image - boot: fix typo, should be systems - o/devicestate: test that users.create.automatic is configured early - asserts: use Fetcher in AddSequenceToUpdate - daemon,o/c/configcore: introduce users.create.automatic - client, o/servicestate: expose enabled state of user daemons - boot: helper for checking and marking tried recovery system status from initramfs - asserts: pool changes for validation-sets (#9930) - daemon: move the last api_foo_test.go to daemon_test - asserts: include the assertion timestamp in error message when outside of signing key validity range - ovelord/snapshotstate: keep a few of the last line tar prints before failing - gadget/many: rm, delay sector size + structure size checks to runtime - cmd/snap-bootstrap/triggerwatch: fix returning wrong errors - interfaces: add allegro-vcu and media-control interfaces - interfaces: opengl: add Xilinx zocl bits - mkversion: check that version from changelog is set before overriding the output version - many: fix new ineffassign warnings - .github/workflows/labeler.yaml: try work-around to not sync labels - cmd/snap, boot: add debug set-boot-vars - interfaces: allow reading the Xauthority file KDE Plasma writes for Wayland sessions - tests/main/snap-repair: test running repair assertion w/ fakestore - tests: disable lxd tests for 21.04 until the lxd images are published for the system - tests/regression/lp-1910456: cleanup the /snap symlink when done - daemon: move single snap querying and ops to api_snaps.go - tests: fix for preseed and dbus tests on 21.04 - overlord/snapshotstate: include the last message printed by tar in the error - interfaces/system-observe: Allow reading /proc/zoneinfo - interfaces: remove apparmor downgrade feature - snap: fix unit tests on Go 1.16 - spread: disable Go modules support in environment - tests: use new path to find kernel.img in uc20 for arm devices - tests: find files before using cat command when checking broadcom- asic-control interface - boot: introduce good recovery systems, provide compatibility handling - overlord: add manager gadget refresh test - tests/lib/fakestore: support repair assertions too - github: temporarily disable action labeler due to issues with labels being removed - o/devicestate,many: introduce DeviceManager.preloadGadget for EarlyConfig - tests: enable ubuntu 21.04 for spread tests - snap: provide a useful error message if gdbserver is not installed - data/selinux: allow system dbus to watch /var/lib/snapd/dbus-1 - tests/lib/prepare.sh: split reflash.sh into two parts - packaging/opensuse: sync with openSUSE packaging - packaging: disable Go modules in snapd.mk - snap: add deprecation noticed to "snap run --gdb" - daemon: add API for checking and installing available theme snaps - tests: using labeler action to add automatically a label to run nested tests - gadget: improve error handling around resolving content sources - asserts: repeat the authority cross-check in CheckSignature as well - interfaces/seccomp/template.go: allow copy_file_range - o/snapstate/check_snap.go: add support for many subversions in assumes snapdX.. - daemon: move postSnap and inst.dispatch tests to api_snaps_test.go - wrappers: use proper paths for mocked mount units in tests - snap: rename gdbserver option to `snap run --gdbserver` - store: support validation sets with fetch-assertions action - snap-confine.apparmor.in: support tmp and log dirs on Yocto/Poky - packaging/fedora: sync with downstream packaging in Fedora - many: add Delegate=true to generated systemd units for special interfaces (master) - boot: use a common helper for mocking boot assets in cache - api: validate snaps against validation set assert from the store - wrappers: don't generate an [Install] section for timer or dbus activated services - tests/nested/core20/boot-config-update: skip when snapd was not built with test features - o/configstate,o/devicestate: introduce devicestate.EarlyConfig implemented by configstate.EarlyConfig - cmd/snap-bootstrap/initramfs-mounts: fix typo in func name - interfaces/builtin: mock distribution in fontconfig cache unit tests - tests/lib/prepare.sh: add another console= to the reflash magic grub entry - overlord/servicestate: expose dbus activators of a service - desktop/notification: test against a real session bus and notification server implementation - cmd/snap-bootstrap/initramfs-mounts: write realistic modeenv for recover+install - HACKING.md: explain how to run UC20 spread tests with QEMU - asserts: introduce AtSequence - overlord/devicestate: task for updating boot configs, spread test - gadget: fix documentation/typos - gadget: cleanup MountedFilesystem{Writer,Updater} - gadget: use ResolvedSource in MountedFilesystemWriter - snap/info.go: add doc-comment for SortServices - interfaces: add an optional mount-host-font-cache plug attribute to the desktop interface - osutil: skip TestReadBuildGo inside sbuild - o/hookstate/ctlcmd: add optional --pid and --apparmor-label arguments to "snapctl is-connected" - data/env/snapd: use quoting in case PATH contains spaces - boot: do not observe successful boot assets if not in run mode - tests: fix umount for snapd snap on fsck-on-boot testumount: /run/mnt/ubuntu-seed/systems/*/snaps/snapd_*.snap: no mount - misc: little tweaks - snap/info.go: ignore unknown daemons in SortSnapServices - devicestate: keep log from install-mode on installed system - seed: add LoadEssentialMeta to seed16 and allow all of its implementations to be called multiple times - cmd/snap-preseed: initialize snap.SanitizePlugsSlots for gadget in seeds - tests/core/uc20-recovery: move recover mode helpers to generic testslib script - interfaces/fwupd: allow any distros to access fw files via fwupd - store: method for fetching validation set assertion - store: switch to v2/assertions api - gadget: add new ResolvedContent and populate from LayoutVolume() - spread: use full format when listing processes - osutil/many: make all test pkgs osutil_test instead of "osutil" - tests/unit/go: drop unused environment variables, skip coverage - OpenGL interface: Support more Tegra libs - gadget,overlord: pass kernelRoot to install.Run() - tests: run unit tests in Focal instead of Xenial - interfaces/browser-support: allow sched_setaffinity with browser- sandbox: true - daemon: move query /snaps/ tests to api_snaps_test.go - cmd/snap-repair/runner.go: add SNAP_SYSTEM_MODE to env of repair runner - systemd/systemd.go: support journald JSON messages with arrays for values - cmd: make string/error code more robust against errno leaking - github, run-checks: do not collect coverage data on subsequent test runs - boot: boot config update & reseal - o/snapshotstate: handle conflicts between snapshot forget, export and import - osutil/stat.go: add RegularFileExists - cmd/snapd-generator: don't create mount overrides for snap-try snaps inside lxc - gadget/gadget.go: rename ubuntu-* to system-* in doc-comment - tests: use 6 spread workers for centos8 - bootloader/assets: support injecting bootloader assets in testing builds of snapd - gadget: enable multi-volume uc20 gadgets in LaidOutSystemVolumeFromGadget; rename too - overlord/devicestate, sysconfig: do nothing when cloud-init is not present - cmd/snap-repair: filter repair assertions based on bases + modes - snap-confine: make host /etc/ssl available for snaps on classic- New upstream release 2.49.2 - interfaces/tee: add TEE/OPTEE interface - o/configstate/configcore: add hdmi_timings to pi-config - interfaces/udisks2: allow locking /run/mount/utab for udisks 2.8.4 - snap-seccomp: fix seccomp test on ppc64el - interfaces{,/apparmor}, overlord/snapstate: late removal of snap-confine apparmor profiles - overlord/snapstate, wrappers: add dependency on usr-lib- snapd.mount for services on core with snapd snap - o/configstate: deal with no longer valid refresh.timer=managed - overlord/snapstate: make sure that snapd current symlink is not removed during refresh - packaging: drop dh-systemd from build-depends on ubuntu-16.04+ - o/{device,hook}state: encode fde-setup-request key as base64 - snapstate: reduce reRefreshRetryTimeout to 1/2 second - tests/main/uc20-create-partitions: fix tests cleanup - o/configstate, o/snapshotstate: fix handling of nil snap config on snapshot restore - snap-seccomp: add new `close_range` syscall- New upstream release 2.49.1 - tests: turn modules off explicitly in spread go unti test - o/snapshotstate: create snapshots directory on import - cmd/snap-bootstrap/triggerwatch: fix returning wrong errors - interfaces: add allegro-vcu and media-control interfaces - interfaces: opengl: add Xilinx zocl bits - many: fix new ineffassign warnings - interfaces/seccomp/template.go: allow copy_file_range - interfaces: allow reading the Xauthority file KDE Plasma writes for Wayland sessions - data/selinux: allow system dbus to watch /var/lib/snapd/dbus-1 - Remove apparmor downgrade feature - Support tmp and log dirs on Yocto/Poky- Rebuilt for updated systemd-rpm-macros See https://pagure.io/fesco/issue/2583.- Fix SELinux policy to allow dbus-daemon watch access on /var/lib/snapd/dbus-1 (LP#1915642)- Release snapd 2.49 to Fedora (RHBZ#1927314) - Include fix for CVE-2020-27352 (RHBZ#1927428, RHBZ#1927432)- New upstream release 2.49 - many: add Delegate=true to generated systemd units for special interfaces - cmd/snap-bootstrap: rename ModeenvFromModel to EphemeralModeenvForModel - cmd/snap-bootstrap/initramfs-mounts: write realistic modeenv for recover+install - osutil: skip TestReadBuildGo inside sbuild - tests: fix umount for snapd snap on fsck-on-boot test - snap/info_test.go: add unit test cases for bug - tests/main/services-after-before: add regression spread test - snap/info.go: ignore unknown daemons in SortSnapServices - cmd/snap-preseed: initialize snap.SanitizePlugsSlots for gadget in seeds - OpenGL interface: Support more Tegra libs - interfaces/browser-support: allow sched_setaffinity with browser- sandbox: true - cmd: make string/error code more robust against errno leaking - o/snapshotstate: handle conflicts between snapshot forget, export and import - cmd/snapd-generator: don't create mount overrides for snap-try snaps inside lxc - tests: update test pkg for fedora and centos - gadget: pass sector size in to mkfs family of functions, use to select block sz - o/snapshotstate: fix returning of snap names when duplicated snapshot is detected - tests/main/snap-network-errors: skip flushing dns cache on centos-7 - interfaces/builtin: Allow DBus property access on org.freedesktop.Notifications - cgroup-support.c: fix link to CGROUP DELEGATION - osutil: update go-udev package - packaging: fix arch-indep build on debian-sid - {,sec}boot: pass "key-name" to the FDE hooks - asserts: sort by revision with Sort interface - gadget: add gadget.ResolveContentPaths() - cmd/snap-repair: save base snap and mode in device info; other misc cleanups - tests: cleanup the run-checks script - asserts: snapasserts method to validate installed snaps against validation sets - tests: normalize test tools - part 1 - snapshotstate: detect duplicated snapshot imports - interfaces/builtin: fix unit test expecting snap-device-helper at /usr/lib/snapd - tests: apply workaround done for snap-advise-command to apt-hooks test - tests: skip main part of snap-advise test if 429 error is encountered - many: clarify gadget role-usage consistency checks for UC16/18 vs UC20 - sandbox/cgroup, tess/main: fix unit tests on v2 system, disable broken tests on sid - interfaces/builtin: more drive by fixes, import ordering, removing dead code - tests: skip interfaces-openvswitch spread test on debian sid - interfaces/apparmor: drive by comment fix - cmd/libsnap-confine-private/cleanup-funcs-test.c: rm g_autofree usage - cmd/libsnap-confine-private: make unit tests execute happily in a container - interfaces, wrappers: misc comment fixes, etc. - asserts/repair.go: add "bases" and "modes" support to the repair assertion - interfaces/opengl: allow RPi MMAL video decoding - snap: skip help output tests for go-flags v1.4.0 - gadget: add validation for "$kernel:ref" style content - packaging/deb, tests/main/lxd-postrm-purge: fix purge inside containers - spdx: update to SPDX license list version: 3.11 2020-11-25 - tests: improve hotplug test setup on classic - tests: update check to verify is the current system is arm - tests: use os-query tool to check debian, trusty and tumbleweed - daemon: start moving implementation to api_snaps.go - tests/main/snap-validate-basic: disable test on Fedora due to go- flags panics - tests: fix library path used for tests.pkgs - tests/main/cohorts: replace yq with a Python snippet - run-checks: update to match new argument syntax of ineffassign - tests: use apiBaseSuite for snapshots tests, fix import endpoint path - many: separate consistency/content validation into gadget.Validate|Content - o/{device,snap}state: enable devmode snaps with dangerous model assertions secboot: add test for when systemd-run does not honor RuntimeMaxSec - secboot: add workaround for snapcore/core-initrd issue #13 - devicestate: log checkEncryption errors via logger.Noticef - o/daemon: validation sets api and basic spread test - gadget: move BuildPartitionList to install and make it unexported - tests: add nested spread end-to-end test for fde-hooks - devicestate: implement checkFDEFeatures() - boot: tweak resealing with fde-setup hooks - tests: add os query commands for subsystems and architectures - o/snapshotstate: don't set auto flag in the snapshot file - tests: use os.query tool instead of comparing the system var - testutil: use the original environment when calling shellcheck - sysconfig/cloudinit.go: add "manual_cache_clean: true" to cloud- init restrict file - gadget,o/devicestate,tests: drop EffectiveFilesystemLabel and instead set the implicit labels when loading the yaml - secboot: add new LockSealedKeys() that uses either TPM/fde-reveal- key - gadget/quantity: introduce Offset, start using it for offset related fields in the gadget - gadget: use "sealed-keys" to determine what method to use for reseal - tests/main/fake-netplan-apply: disable test on xenial for now - daemon: start splitting snaps op tests out of api_test.go - testutil: make DBusTest use a custom bus configuration file - tests: replace pkgdb.sh (library) with tests.pkgs (program) - gadget: prepare gadget kernel refs (0/N) - interfaces/builtin/docker-support: allow /run/containerd/s/... - cmd/snap-preseed: reset run inhibit locks on --reset. - boot: add sealKeyToModeenvUsingFdeSetupHook() - daemon: reorg snap.go and split out sections and icons support from api.go - sandbox/seccomp: use snap-seccomp's stdout for getting version info - daemon: split find support to its own api_*.go files and move some helpers - tests: move snapstate config defaults tests to a separate file. - bootloader/{lk,lkenv}: followups from #9695 - daemon: actually move APIBaseSuite to daemon_test.apiBaseSuite - gadget,o/devicestate: set implicit values for schema and role directly instead of relying on Effective* accessors - daemon: split aliases support to its own api_*.go files - gadget: start separating rule/convention validation from basic soundness - cmd/snap-update-ns: add better unit test for overname sorting - secboot: use `fde-reveal-key` if available to unseal key - tests: fix lp-1899664 test when snapd_x1 is not installed in the system - tests: fix the scenario when the "$SRC".orig file does not exist - cmd/snap-update-ns: fix sorting of overname mount entries wrt other entries - devicestate: add runFDESetupHook() helper - bootloader/lk: add support for UC20 lk bootloader with V2 lkenv structs - daemon: split unsupported buy implementation to its own api_*.go files - tests: download timeout spread test - gadget,o/devicestate: hybrid 18->20 ready volume setups should be valid - o/devicestate: save model with serial in the device save db - bootloader: add check for prepare-image time and more tests validating options - interfaces/builtin/log_observe.go: allow controlling apparmor audit levels - hookstate: refactor around EphemeralRunHook - cmd/snap: implement 'snap validate' command - secboot,devicestate: add scaffoling for "fde-reveal-key" support - boot: observe successful command line update, provide a default - tests: New queries for the os tools - bootloader/lkenv: specify backup file as arg to NewEnv(), use "" as path+"bak" - osutil/disks: add FindMatchingPartitionUUIDWithPartLabel to Disk iface - daemon: split out snapctl support and snap configuration support to their own api_*.go files - snapshotstate: improve handling of multiple errors - tests: sign new nested-18|20* models to allow for generic serials - bootloader: remove installableBootloader interface and methods - seed: cleanup/drop some no longer valid TODOS, clarify some other points - boot: set kernel command line in modeenv during install - many: rename disks.FindMatching... to FindMatching...WithFsLabel and err type - cmd/snap: suppress a case of spurious stdout logging from tests - hookstate: add new HookManager.EphemeralRunHook() - daemon: move some more api tests from daemon to daemon_test - daemon: split apps and logs endpoints to api_apps.go and tests - interfaces/utf: Add Ledger to U2F devices - seed/seedwriter: consider modes when checking for deps availability - o/devicestate,daemon: fix reboot system action to not require a system label - cmd/snap-repair,store: increase initial retry time intervals, stalling TODOs - daemon: split interfacesCmd to api_interfaces.go - github: run nested suite when commit is pushed to release branch - client: reduce again the /v2/system-info timeout - tests: reset fakestore unit status - update-pot: fix typo in plural keyword spec - tests: remove workarounds that add "ubuntu-save" if missing - tests: add unit test for auto-refresh with validate-snap failure - osutil: add helper for getting the kernel command line - tests/main/uc20-create-partitions: verify ubuntu-save encryption keys, tweak not MATCH - boot: add kernel command lines to the modeenv file - spread: bump delta ref, tweak repacking to make smaller delta archives - bootloader/lkenv: add v2 struct + support using it - snapshotstate: add cleanup of abandonded snapshot imports - tests: fix uc20-create-parition-* tests for updated gadget - daemon: split out /v2/interfaces tests to api_interfaces_test.go - hookstate: implement snapctl fde-setup-{request,result} - wrappers, o/devicestate: remove EnableSnapServices - tests: enable nested on 20.10 - daemon: simplify test helpers Get|PostReq into Req - daemon: move general api to api_general*.go - devicestate: make checkEncryption fde-setup hook aware - client/snapctl, store: fix typos - tests/main/lxd/prep-snapd-in-lxd.sh: wait for valid apt files before doing apt ops - cmd/snap-bootstrap: update model cross-check considerations - client,snapctl: add naive support for "stdin" - many: add new "install-mode: disable" option - osutil/disks: allow building on mac os - data/selinux: update the policy to allow operations on non-tmpfs /tmp - boot: add helper for generating candidate kernel lines for recovery system - wrappers: generate D-Bus service activation files - bootloader/many: rm ConfigFile, add Present for indicating presence of bloader - osutil/disks: allow mocking DiskFromDeviceName - daemon: start cleaning up api tests - packaging/arch: sync with AUR packaging - bootloader: indicate when boot config was updated - tests: Fix snap-debug-bootvars test to make it work on arm devices and core18 - tests/nested/manual/core20-save: verify handling of ubuntu-save with different system variants - snap: use the boot-base for kernel hooks - devicestate: support "storage-safety" defaults during install - bootloader/lkenv: mv v1 to separate file, include/lk/snappy_boot_v1.h: little fixups - interfaces/fpga: add fpga interface - store: download timeout - vendor: update secboot repo to avoid including secboot.test binary - osutil: add KernelCommandLineKeyValue - gadget/gadget.go: allow system-recovery-{image,select} as roles in gadget.yaml - devicestate: implement boot.HasFDESetupHook - osutil/disks: add DiskFromName to get a disk using a udev name - usersession/agent: have session agent connect to the D-Bus session bus - o/servicestate: preserve order of services on snap restart - o/servicestate: unlock state before calling wrappers in doServiceControl - spread: disable unattended-upgrades on ubuntu - tests: testing new fedora 33 image - tests: fix fsck on boot on arm devices - tests: skip boot state test on arm devices - tests: updated the systems to run prepare-image-grub test - interfaces/raw_usb: allow read access to /proc/tty/drivers - tests: unmount /boot/efi in fsck-on-boot test - strutil/shlex,osutil/udev/netlink: minimally import go-check - tests: fix basic20 test on arm devices - seed: make a shared seed system label validation helper - tests/many: enable some uc20 tests, delete old unneeded tests or TODOs - boot/makebootable.go: set snapd_recovery_mode=install at image- build time - tests: migrate test from boot.sh helper to boot-state tool - asserts: implement "storage-safety" in uc20 model assertion - bootloader: use ForGadget when installing boot config - spread: UC20 no longer needs 2GB of mem - cmd/snap-confine: implement snap-device-helper internally - bootloader/grub: replace old reference to Managed...Blr... with Trusted...Blr... - cmd/snap-bootstrap: add readme for snap-bootstrap + real state diagram - interfaces: fix greengrass attr namingThe flavor attribute names are now as follows: - tests/lib/nested: poke the API to get the snap revisions - tests: compare options of mount units created by snapd and snapd- generator - o/snapstate,servicestate: use service-control task for service actions - sandbox: track applications unconditionally - interfaces/greengrass-support: add additional "process" flavor for 1.11 update - cmd/snap-bootstrap, secboot, tests: misc cleanups, add spread test- Explicitly disable go module support during build (RHBZ#1923716)- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild- Release 2.48.2 to Fedora (RHBZ#1899700)- New upstream release 2.48.2 - tests: sign new nested-18|20* models to allow for generic serials - secboot: add extra paranoia when waiting for that fde-reveal-key - tests: backport netplan workarounds from #9785 - secboot: add workaround for snapcore/core-initrd issue #13 - devicestate: log checkEncryption errors via logger.Noticef - tests: add nested spread end-to-end test for fde-hooks - devicestate: implement checkFDEFeatures() - boot: tweak resealing with fde-setup hooks - sysconfig/cloudinit.go: add "manual_cache_clean: true" to cloud- init restrict file - secboot: add new LockSealedKeys() that uses either TPM or fde-reveal-key - gadget: use "sealed-keys" to determine what method to use for reseal - boot: add sealKeyToModeenvUsingFdeSetupHook() - secboot: use `fde-reveal-key` if available to unseal key - cmd/snap-update-ns: fix sorting of overname mount entries wrt other entries - o/devicestate: save model with serial in the device save db - devicestate: add runFDESetupHook() helper - secboot,devicestate: add scaffoling for "fde-reveal-key" support - hookstate: add new HookManager.EphemeralRunHook() - update-pot: fix typo in plural keyword spec - store,cmd/snap-repair: increase initial expontential time intervals - o/devicestate,daemon: fix reboot system action to not require a system label - github: run nested suite when commit is pushed to release branch - tests: reset fakestore unit status - tests: fix uc20-create-parition-* tests for updated gadget - hookstate: implement snapctl fde-setup-{request,result} - devicestate: make checkEncryption fde-setup hook aware - client,snapctl: add naive support for "stdin" - devicestate: support "storage-safety" defaults during install - snap: use the boot-base for kernel hooks - vendor: update secboot repo to avoid including secboot.test binary- New upstream release 2.48.1 - gadget: disable ubuntu-boot role validation check- New upstream release 2.48 - osutil: add KernelCommandLineKeyValue - devicestate: implement boot.HasFDESetupHook - boot/makebootable.go: set snapd_recovery_mode=install at image- build time - bootloader: use ForGadget when installing boot config - interfaces/raw_usb: allow read access to /proc/tty/drivers - boot: add scaffolding for "fde-setup" hook support for sealing - tests: fix basic20 test on arm devices - seed: make a shared seed system label validation helper - snap: add new "fde-setup" hooktype - cmd/snap-bootstrap, secboot, tests: misc cleanups, add spread test - secboot,cmd/snap-bootstrap: fix degraded mode cases with better device handling - boot,dirs,c/snap-bootstrap: avoid InstallHost* at the cost of some messiness - tests/nested/manual/refresh-revert-fundamentals: temporarily disable secure boot - snap-bootstrap,secboot: call BlockPCRProtectionPolicies in all boot modes - many: address degraded recover mode feedback, cleanups - tests: Use systemd-run on tests part2 - tests: set the opensuse tumbleweed system as manual in spread.yaml - secboot: call BlockPCRProtectionPolicies even if the TPM is disabled - vendor: update to current secboot - cmd/snap-bootstrap,o/devicestate: use a secret to pair data and save - spread.yaml: increase number of workers on 20.10 - snap: add new `snap recovery --show-keys` option - tests: minor test tweaks suggested in the review of 9607 - snapd-generator: set standard snapfuse options when generating units for containers - tests: enable lxd test on ubuntu-core-20 and 16.04-32 - interfaces: share /tmp/.X11-unix/ from host or provider - tests: enable main lxd test on 20.10 - cmd/s-b/initramfs-mounts: refactor recover mode to implement degraded mode - gadget/install: add progress logging - packaging: keep secboot/encrypt_dummy.go in debian - interfaces/udev: use distro specific path to snap-device-helper - o/devistate: fix chaining of tasks related to regular snaps when preseeding - gadget, overlord/devicestate: validate that system supports encrypted data before install - interfaces/fwupd: enforce the confined fwupd to align Ubuntu Core ESP layout - many: add /v2/system-recovery-keys API and client - secboot, many: return UnlockMethod from Unlock* methods for future usage - many: mv keys to ubuntu-boot, move model file, rename keyring prefix for secboot - tests: using systemd-run instead of manually create a systemd unit - part 1 - secboot, cmd/snap-bootstrap: enable or disable activation with recovery key - secboot: refactor Unlock...IfEncrypted to take keyfile + check disks first - secboot: add LockTPMSealedKeys() to lock access to keys independently - gadget: correct sfdisk arguments - bootloader/assets/grub: adjust fwsetup menuentry label - tests: new boot state tool - spread: use the official image for Ubuntu 20.10, no longer an unstable system - tests/lib/nested: enable snapd logging to console for core18 - osutil/disks: re-implement partition searching for disk w/ non- adjacent parts - tests: using the nested-state tool in nested tests - many: seal a fallback object to the recovery boot chain - gadget, gadget/install: move helpers to install package, refactor unit tests - dirs: add "gentoo" to altDirDistros - update-pot: include file locations in translation template, and extract strings from desktop files - gadget/many: drop usage of gpt attr 59 for indicating creation of partitions - gadget/quantity: tweak test name - snap: fix failing unittest for quantity.FormatDuration() - gadget/quantity: introduce a new package that captures quantities - o/devicestate,a/sysdb: make a backup of the device serial to save - tests: fix rare interaction of tests.session and specific tests - features: enable classic-preserves-xdg-runtime-dir - tests/nested/core20/save: check the bind mount and size bump - o/devicetate,dirs: keep device keys in ubuntu-save/save for UC20 - tests: rename hasHooks to hasInterfaceHooks in the ifacestate tests - o/devicestate: unit test tweaks - boot: store the TPM{PolicyAuthKey,LockoutAuth}File in ubuntu-save - testutil, cmd/snap/version: fix misc little errors - overlord/devicestate: bind mount ubuntu-save under /var/lib/snapd/save on startup - gadget/internal: tune ext4 setting for smaller filesystems - tests/nested/core20/save: a test that verifies ubuntu-save is present and set up - tests: update google sru backend to support groovy - o/ifacestate: handle interface hooks when preseeding - tests: re-enable the apt hooks test - interfaces,snap: use correct type: {os,snapd} for test data - secboot: set metadata and keyslots sizes when formatting LUKS2 volumes - tests: improve uc20-create-partitions-reinstall test - client, daemon, cmd/snap: cleanups from #9489 + more unit tests - cmd/snap-bootstrap: mount ubuntu-save during boot if present - secboot: fix doc comment on helper for unlocking volume with key - tests: add spread test for refreshing from an old snapd and core18 - o/snapstate: generate snapd snap wrappers again after restart on refresh - secboot: version bump, unlock volume with key - tests/snap-advise-command: re-enable test - cmd/snap, snapmgr, tests: cleanups after #9418 - interfaces: deny connected x11 plugs access to ICE - daemon,client: write and read a maintenance.json file for when snapd is shut down - many: update to secboot v1 (part 1) - osutil/disks/mockdisk: panic if same mountpoint shows up again with diff opts - tests/nested/core20/gadget,kernel-reseal: add sanity checks to the reseal tests - many: implement snap routine console-conf-start for synchronizing auto-refreshes - dirs, boot: add ubuntu-save directories and related locations - usersession: fix typo in test name - overlord/snapstate: refactor ihibitRefresh - overlord/snapstate: stop warning about inhibited refreshes - cmd/snap: do not hardcode snapshot age value - overlord,usersession: initial notifications of pending refreshes - tests: add a unit test for UpdateMany where a single snap fails - o/snapstate/catalogrefresh.go: don't refresh catalog in install mode uc20 - tests: also check snapst.Current in undo-unlink tests - tests: new nested tool - o/snapstate: implement undo handler for unlink-snap - tests: clean systems.sh helper and migrate last set of tests - tests: moving the lib section from systems.sh helper to os.query tool - tests/uc20-create-partitions: don't check for grub.cfg - packaging: make sure that static binaries are indeed static, fix openSUSE - many: have install return encryption keys for data and save, improve tests - overlord: add link participant for linkage transitions - tests: lxd smoke test - tests: add tests for fsck; cmd/s-b/initramfs-mounts: fsck ubuntu- seed too - tests: moving main suite from systems.sh to os.query tool - tests: moving the core test suite from systems.sh to os.query tool - cmd/snap-confine: mask host's apparmor config - o/snapstate: move setting updated SnapState after error paths - tests: add value to INSTANCE_KEY/regular - spread, tests: tweaks for openSUSE - cmd/snap-confine: update path to snap-device-helper in AppArmor profile - tests: new os.query tool - overlord/snapshotstate/backend: specify tar format for snapshots - tests/nested/manual/minimal-smoke: use 384MB of RAM for nested UC20 - client,daemon,snap: auto-import does not error on managed devices - interfaces: PTP hardware clock interface - tests: use tests.backup tool - many: verify that unit tests work with nosecboot tag and without secboot package - wrappers: do not error out on read-only /etc/dbus-1/session.d filesystem on core18 - snapshots: import of a snapshot set - tests: more output for sbuild test - o/snapstate: re-order remove tasks for individual snap revisions to remove current last - boot: skip some unit tests when running as root - o/assertstate: introduce ValidationTrackingKey/ValidationSetTracking and basic methods - many: allow ignoring running apps for specific request - tests: allow the searching test to fail under load - overlord/snapstate: inhibit startup while unlinked - seed/seedwriter/writer.go: check DevModeConfinement for dangerous features - tests/main/sudo-env: snap bin is available on Fedora - boot, overlord/devicestate: list trusted and managed assets upfront - gadget, gadget/install: support for ubuntu-save, create one during install if needed - spread-shellcheck: temporary workaround for deadlock, drop unnecessary test - snap: support different exit-code in the snap command - logger: use strutil.KernelCommandLineSplit in debugEnabledOnKernelCmdline - logger: fix snapd.debug=1 parsing - overlord: increase refresh postpone limit to 14 days - spread-shellcheck: use single thread pool executor - gadget/install,secboot: add debug messages - spread-shellcheck: speed up spread-shellcheck even more - spread-shellcheck: process paths from arguments in parallel - tests: tweak error from tests.cleanup - spread: remove workaround for openSUSE go issue - o/configstate: create /etc/sysctl.d when applying early config defaults - tests: new tests.backup tool - tests: add tests.cleanup pop sub-command - tests: migration of the main suite to snaps-state tool part 6 - tests: fix journal-state test - cmd/snap-bootstrap/initramfs-mounts: split off new helper for misc recover files - cmd/snap-bootstrap/initramfs-mounts: also copy /etc/machine-id for same IP addr - packaging/{ubuntu,debian}: add liblzo2-dev as a dependency for building snapd - boot, gadget, bootloader: observer preserves managed bootloader configs - tests/nested/manual: add uc20 grade signed cloud-init test - o/snapstate/autorefresh.go: eliminate race when launching autorefresh - daemon,snapshotstate: do not return "size" from Import() - daemon: limit reading from snapshot import to Content-Length - many: set/expect Content-Length header when importing snapshots - github: switch from ::set-env command to environment file - tests: migration of the main suite to snaps-state tool part 5 - client: cleanup the Client.raw* and Client.do* method families - tests: moving main suite to snaps-state tool part 4 - client,daemon,snap: use constant for snapshot content-type - many: fix typos and repeated "the" - secboot: fix tpm connection leak when it's not enabled - many: scaffolding for snapshots import API - run-checks: run spread-shellcheck too - interfaces: update network-manager interface to allow ObjectManager access from unconfined clients - tests: move core and regression suites to snaps-state tool - tests: moving interfaces tests to snaps-state tool - gadget: preserve files when indicated by content change observer - tests: moving smoke test suite and some tests from main suite to snaps-state tool - o/snapshotstate: pass set id to backend.Open, update tests - asserts/snapasserts: introduce ValidationSets - o/snapshotstate: improve allocation of new set IDs - boot: look at the gadget for run mode bootloader when making the system bootable - cmd/snap: allow snap help vs --all to diverge purposefully - usersession/userd: separate bus name ownership from defining interfaces - o/snapshotstate: set snapshot set id from its filename - o/snapstate: move remove-related tests to snapstate_remove_test.go - desktop/notification: switch ExpireTimeout to time.Duration - desktop/notification: add unit tests - snap: snap help output refresh - tests/nested/manual/preseed: include a system-usernames snap when preseeding - tests: fix sudo-env test - tests: fix nested core20 shellcheck bug - tests/lib: move to new directory when restoring PWD, cleanup unpacked unpacked snap directories - desktop/notification: add bindings for FDO notifications - dbustest: fix stale comment references - many: move ManagedAssetsBootloader into TrustedAssetsBootloader, drop former - snap-repair: add uc20 support - tests: print all the serial logs for the nested test - o/snapstate/check_snap_test.go: mock osutil.Find{U,G}id to avoid bug in test - cmd/snap/auto-import: stop importing system user assertions from initramfs mnts - osutil/group.go: treat all non-nil errs from user.Lookup{Group,} as Unknown* - asserts: deserialize grouping only once in Pool.AddBatch if needed - gadget: allow content observer to have opinions about a change - tests: new snaps-state command - part1 - o/assertstate: support refreshing any number of snap-declarations - boot: use test helpers - tests/core/snap-debug-bootvars: also check snap_mode - many/apparmor: adjust rules for reading profile/ execing new profiles for new kernel - tests/core/snap-debug-bootvars: spread test for snap debug boot- vars - tests/lib/nested.sh: more little tweaks - tests/nested/manual/grade-signed-above-testkeys-boot: enable kvm - cmd/s-b/initramfs-mounts: use ConfigureTargetSystem for install, recover modes - overlord: explicitly set refresh-app-awareness in tests - kernel: remove "edition" from kernel.yaml and add "update" - spread: drop vendor from the packed project archive - boot: fix debug bootloader variables dump on UC20 systems - wrappers, systemd: allow empty root dir and conditionally do not pass --root to systemctl - tests/nested/manual: add test for grades above signed booting with testkeys - tests/nested: misc robustness fixes - o/assertstate,asserts: use bulk refresh to refresh snap- declarations - tests/lib/prepare.sh: stop patching the uc20 initrd since it has been updated now - tests/nested/manual/refresh-revert-fundamentals: re-enable test - update-pot: ignore .go files inside .git when running xgettext-go - tests: disable part of the lxd test completely on 16.04. - o/snapshotstate: tweak comment regarding snapshot filename - o/snapstate: improve snapshot iteration - bootloader: lk cleanups - tests: update to support nested kvm without reboots on UC20 - tests/nested/manual/preseed: disable system-key check for 20.04 image - spread.yaml: add ubuntu-20.10-64 to qemu - store: handle v2 error when fetching assertions - gadget: resolve device mapper devices for fallback device lookup - tests/nested/cloud-init-many: simplify tests and unify helpers/seed inputs - tests: copy /usr/lib/snapd/info to correct directory - check-pr-title.py * : allow "*" in the first part of the title - many: typos and small test tweak - tests/main/lxd: disable cgroup combination for 16.04 that is failing a lot - tests: make nested signing helpers less confusing - tests: misc nested changes - tests/nested/manual/refresh-revert-fundamentals: disable temporarily - tests/lib/cla_check: default to Python 3, tweaks, formatting - tests/lib/cl_check.py: use python3 compatible code- Release 2.47.1 to Fedora (RHBZ#1872528)- New upstream release 2.47.1 - o/configstate: create /etc/sysctl.d when applying early config defaults - cmd/snap-bootstrap/initramfs-mounts: also copy /etc/machine-id for same IP addr - packaging/{ubuntu,debian}: add liblzo2-dev as a dependency for building snapd - cmd/snap: allow snap help vs --all to diverge purposefully - snap: snap help output refresh- New upstream release 2.47 - tests: fix nested core20 shellcheck bug - many/apparmor: adjust rule for reading apparmor profile for new kernel - snap-repair: add uc20 support - cmd/snap/auto-import: stop importing system user assertions from initramfs mnts - cmd/s-b/initramfs-mounts: use ConfigureTargetSystem for install, recover modes - gadget: resolve device mapper devices for fallback device lookup - secboot: add boot manager profile to pcr protection profile - sysconfig,o/devicestate: mv DisableNoCloud to DisableAfterLocalDatasourcesRun - tests: make gadget-reseal more robust - tests: skip nested images pre-configuration by default - tests: fix for basic20 test running on external backend and rpi - tests: improve kernel reseal test - boot: adjust comments, naming, log success around reseal - tests/nested, fakestore: changes necessary to run nested uc20 signed/secured tests - tests: add nested core20 gadget reseal test - boot/modeenv: track unknown keys in Read and put back into modeenv during Write - interfaces/process-control: add sched_setattr to seccomp - boot: with unasserted kernels reseal if there's a hint modeenv changed - client: bump the default request timeout to 120s - configcore: do not error in console-conf.disable for install mode - boot: streamline bootstate20.go reseal and tests changes - boot: reseal when changing kernel - cmd/snap/model: specify grade in the model command output - tests: simplify repack_snapd_snap_with_deb_content_and_run_mode_first_boot_tweaks - test: improve logging in nested tests - nested: add support to telnet to serial port in nested VM - secboot: use the snapcore/secboot native recovery key type - tests/lib/nested.sh: use more focused cloud-init config for uc20 - tests/lib/nested.sh: wait for the tpm socket to exist - spread.yaml, tests/nested: misc changes - tests: add more checks to disk space awareness spread test - tests: disk space awareness spread test - boot: make MockUC20Device use a model and MockDevice more realistic - boot,many: reseal only when meaningful and necessary - tests/nested/core20/kernel-failover: add test for failed refresh of uc20 kernel - tests: fix nested to work with qemu and kvm - boot: reseal when updating boot assets - tests: fix snap-routime-portal-info test - boot: verify boot chain file in seal and reseal tests - tests: use full path to test-snapd-refresh.version binary - boot: store boot chains during install, helper for checking whether reseal is needed - boot: add call to reseal an existing key - boot: consider boot chains with unrevisioned kernels incomparable - overlord: assorted typos and miscellaneous changes - boot: group SealKeyModelParams by model, improve testing - secboot: adjust parameters to buildPCRProtectionProfile - strutil: add SortedListsUniqueMergefrom the doc comment: - snap/naming: upgrade TODO to TODO:UC20 - secboot: add call to reseal an existing key - boot: in seal.go adjust error message and function names - o/snapstate: check available disk space in RemoveMany - boot: build bootchains data for sealing - tests: remove "set -e" from function only shell libs - o/snapstate: disk space check on UpdateMany - o/snapstate: disk space check with snap update - snap: implement new `snap reboot` command - boot: do not reorder boot assets when generating predictable boot chains and other small tweaks - tests: some fixes and improvements for nested execution - tests/core/uc20-recovery: fix check for at least specific calls to mock-shutdown - boot: be consistent using bootloader.Role* consts instead of strings - boot: helper for generating secboot load chains from a given boot asset sequence - boot: tweak boot chains to support a list of kernel command lines, keep track of model and kernel boot file - boot,secboot: switch to expose and use snapcore/secboot load event trees - tests: use `nested_exec` in core{20,}-early-config test - devicestate: enable cloud-init on uc20 for grade signed and secured - boot: add "rootdir" to baseBootenvSuite and use in tests - tests/lib/cla_check.py: don't allow users.noreply.github.com commits to pass CLA - boot: represent boot chains, helpers for marshalling and equivalence checks - boot: mark successful with boot assets - client, api: handle insufficient space error - o/snapstate: disk space check with single snap install - configcore: "service.console-conf.disable" is gadget defaults only - packaging/opensuse: fix for /usr/libexec on TW, do not hardcode AppArmor profile path - tests: skip udp protocol in nfs-support test on ubuntu-20.10 - packaging/debian-sid: tweak code preparing _build tree - many: move seal code from gadget/install to boot - tests: remove workaround for cups on ubuntu-20.10 - client: implement RebootToSystem - many: seed.Model panics now if called before LoadAssertions - daemon: add /v2/systems "reboot" action API - github: run tests also on push to release branches - interfaces/bluez: let slot access audio streams - seed,c/snap-bootstrap: simplify snap-bootstrap seed reading with new seed.ReadSystemEssential - interfaces: allow snap-update-ns to read /proc/cmdline - tests: new organization for nested tests - o/snapstate, features: add feature flags for disk space awareness - tests: workaround for cups issue on 20.10 where default printer is not configured. - interfaces: update cups-control and add cups for providing snaps - boot: keep track of the original asset when observing updates - tests: simplify and fix tests for disk space checks on snap remove - sysconfig/cloudinit.go: add AllowCloudInit and use GadgetDir for cloud.conf - tests/main: mv core specific tests to core suite - tests/lib/nested.sh: reset the TPM when we create the uc20 vm - devicestate: rename "mockLogger" to "logbuf" - many: introduce ContentChange for tracking gadget content in observers - many: fix partion vs partition typo - bootloader: retrieve boot chains from bootloader - devicestate: add tests around logging in RequestSystemAction - boot: handle canceled update - bootloader: tweak doc comments (thanks Samuele) - seed/seedwriter: test local asserted snaps with UC20 grade signed - sysconfig/cloudinit.go: add DisableNoCloud to CloudInitRestrictOptions - many: use BootFile type in load sequences - boot,bootloader: clarifications after the changes to introduce bootloader.Options.Role - boot,bootloader,gadget: apply new bootloader.Options.Role - o/snapstate, features: add feature flag for disk space check on remove - testutil: add checkers for symbolic link target - many: refactor tpm seal parameter setting - boot/bootstate20: reboot to rollback to previous kernel - boot: add unit test helpers - boot: observe update & rollback of trusted assets - interfaces/utf: Add MIRKey to u2f devices - o/devicestate/devicestate_cloudinit_test.go: test cleanup for uc20 cloud-init tests - many: check that users of BaseTest don't forget to consume cleanups - tests/nested/core20/tpm: verify trusted boot assets tracking - github: run macOS job with Go 1.14 - many: misc doc-comment changes and typo fixes - o/snapstate: disk space check with InstallMany - many: cloud-init cleanups from previous PR's - tests: running tests on opensuse leap 15.2 - run-checks: check for dirty build tree too - vendor: run ./get-deps.sh to update the secboot hash - tests: update listing test for "-dirty" versions - overlord/devicestate: do not release the state lock when updating gadget assets - secboot: read kernel efi image from snap file - snap: add size to the random access file return interface - daemon: correctly parse Content-Type HTTP header. - tests: account for apt-get on core18 - cmd/snap-bootstrap/initramfs-mounts: compute string outside of loop - mkversion.sh: simple hack to include dirty in version if the tree is dirty - cgroup,snap: track hooks on system bus only - interfaces/systemd: compare dereferenced Service - run-checks: only check files in git for misspelling - osutil: add a package doc comment (via doc.go) - boot: complain about reused asset name during initial install - snapstate: installSize helper that calculates total size of snaps and their prerequisites - snapshots: export of snapshots - boot/initramfs_test.go: reset boot vars on the bootloader for each iteration- New upstream release 2.46.1 - interfaces: allow snap-update-ns to read /proc/cmdline - github: run macOS job with Go 1.14 - o/snapstate, features: add feature flag for disk space check on remove - tests: account for apt-get on core18 - mkversion.sh: include dirty in version if the tree is dirty - interfaces/systemd: compare dereferenced Service - vendor.json: update mysterious secboot SHA again- New upstream release 2.46 - logger: add support for setting snapd.debug=1 on kernel cmdline - o/snapstate: check disk space before creating automatic snapshot on remove - boot, o/devicestate: observe existing recovery bootloader trusted boot assets - many: use transient scope for tracking apps and hooks - features: add HiddenSnapFolder feature flag - tests/lib/nested.sh: fix partition typo, unmount the image on uc20 too - runinhibit: open the lock file in read-only mode in IsLocked - cmd/s-b/initramfs-mounts: make recover -> run mode transition automatic - tests: update spread test for unknown plug/slot with snapctl is- connected - osutil: add OpenExistingLockForReading - kernel: add kernel.Validate() - interfaces: add vcio interface - interfaces/{docker,kubernetes}-support: load overlay and support systemd cgroup driver - tests/lib/nested.sh: use more robust code for finding what loop dev we mounted - cmd/snap-update-ns: detach all bind-mounted file - snap/snapenv: set SNAP_REAL_HOME - packaging: umount /snap on purge in containers - interfaces: misc policy updates xlvi - secboot,cmd/snap-bootstrap: cross-check partitions before unlocking, mounting - boot: copy boot assets cache to new root - gadget,kernel: add new kernel.{Info,Asset} struct and helpers - o/hookstate/ctlcmd: make is-connected check whether the plug or slot exists - tests: find -ignore_readdir_race when scanning cgroups - interfaces/many: deny arbitrary desktop files and misc from /usr/share - tests: use "set -ex" in prep-snapd-in-lxd.sh - tests: re-enable udisks test on debian-sid - cmd/snapd-generator: use PATH fallback if PATH is not set - tests: disable udisks2 test on arch linux - github: use latest/stable go, not latest/edge - tests: remove support for ubuntu 19.10 from spread tests - tests: fix lxd test wrongly tracking 'latest' - secboot: document exported functions - cmd: compile snap gdbserver shim correctly - many: correctly calculate the desktop file prefix everywhere - interfaces: add kernel-crypto-api interface - corecfg: add "system.timezone" setting to the system settings - cmd/snapd-generator: generate drop-in to use fuse in container - cmd/snap-bootstrap/initramfs-mounts: tweak names, add comments from previous PR - interfaces/many: miscellaneous updates for strict microk8s - secboot,cmd/snap-bootstrap: don't import boot package from secboot - cmd/snap-bootstrap/initramfs-mounts: call systemd-mount instead of the-tool - tests: work around broken update of systemd-networkd - tests/main/install-fontconfig-cache-gen: enhance test by verifying, add fonts to test - o/devicestate: wrap asset update observer error - boot: refactor such that bootStateUpdate20 mainly carries Modeenv - mkversion.sh: disallow changelog versions that have git in it, if we also have git version - interfaces/many: miscellaneous updates for strict microk8s - snap: fix repeated "cannot list recovery system" and add test - boot: track trusted assets during initial install, assets cache - vendor: update secboot to fix key data validation - tests: unmount FUSE file-systems from XDG runtime dir - overlord/devicestate: workaround non-nil interface with nil struct - sandbox/cgroup: remove temporary workaround for multiple cgroup writers - sandbox/cgroup: detect dangling v2 cgroup - bootloader: add helper for creating a bootloader based on gadget - tests: support different images on nested execution - many: reorg cmd/snapinfo.go into snap and new client/clientutil - packaging/arch: use external linker when building statically - tests: cope with ghost cgroupv2 - tests: fix issues related to restarting systemd-logind.service - boot, o/devicestate: TrustedAssetUpdateObserver stubs, hook up to gadget updates - vendor: update github.com/kr/pretty to fix diffs of values with pointer cycles - boot: move bootloaderKernelState20 impls to separate file - .github/workflows: move snap building to test.yaml as separate cached job - tests/nested/manual/minimal-smoke: run core smoke tests in a VM meeting minimal requirements - osutil: add CommitAs to atomic file - gadget: introduce content update observer - bootloader: introduce TrustedAssetsBootloader, implement for grub - o/snapshotstate: helpers for calculating disk space needed for an automatic snapshot - gadget/install: retrieve command lines from bootloader - boot/bootstate20: unify commit method impls, rm bootState20MarkSuccessful - tests: add system information and image information when debug info is displayed - tests/main/cgroup-tracking: try to collect some information about cgroups - boot: introduce current_boot_assets and current_recovery_boot_assets to modeenv - tests: fix for timing issues on journal-state test - many: remove usage and creation of hijacked pid cgroup - tests: port regression-home-snap-root-owned to tests.session - tests: run as hightest via tests.session - github: run CLA checks on self-hosted workers - github: remove Ubuntu 19.10 from actions workflow - tests: remove End-Of-Life opensuse/fedora releases - tests: remove End-Of-Life releases from spread.yaml - tests: fix debug section of appstream-id test - interfaces: check !b.preseed earlier - tests: work around bug in systemd/debian - boot: add deepEqual, Copy helpers for Modeenv to simplify bootstate20 refactor - cmd: add new "snap recovery" command - interfaces/systemd: use emulation mode when preseeding - interfaces/kmod: don't load kernel modules in kmod backend when preseeding - interfaces/udev: do not reload udevadm rules when preseeding - cmd/snap-preseed: use snapd from the deb if newer than from seeds - boot: fancy marshaller for modeenv values - gadget, osutil: use atomic file copy, adjust tests - overlord: use new tracking cgroup for refresh app awareness - github: do not skip gofmt with Go 1.9/1.10 - many: introduce content write observer, install mode glue, initial seal stubs - daemon,many: switch to use client.ErrorKind and drop the local errorKind... - tests: new parameters for nested execution - client: move all error kinds into errors.go and add doc strings - cmd/snap: display the error in snap debug seeding if seeding is in error - cmd/snap/debug/seeding: use unicode for proper yaml - tests/cmd/snap-bootstrap/initramfs-mounts: add test case for empty recovery_mode - osutil/disks: add mock disk and tests for happy path of mock disks - tests: refresh/revert snapd in uc20 - osutil/disks: use a dedicated error to indicate a fs label wasn't found - interfaces/system-key: in WriteSystemKey during tests, don't call ParserFeatures - boot: add current recovery systems to modeenv - bootloader: extend managed assets bootloader interface to compose a candidate command line - interfaces: make the unmarshal test match more the comment - daemon/api: use pointers to time.Time for debug seeding aspect - o/ifacestate: update security profiles in connect undo handler - interfaces: add uinput interface - cmd/snap-bootstrap/initramfs-mounts: add doSystemdMount + unit tests - o/devicestate: save seeding/preseeding times for use with debug seeding api - cmd/snap/debug: add "snap debug seeding" command for preseeding debugging - tests/main/selinux-clean: workaround SELinux denials triggered by linger setup on Centos8 - bootloader: compose command line with mode and extra arguments - cmd/snap, daemon: detect and bail purge on multi-snap - o/ifacestate: fix bug in snapsWithSecurityProfiles - interfaces/builtin/multipass: replace U+00A0 no-break space with simple space - bootloader/assets: generate bootloader assets from files - many/tests/preseed: reset the preseeded images before preseeding them - tests: drop accidental accents from e - secboot: improve key sealing tests - tests: replace _wait_for_file_change with retry - tests: new fs-state which replaces the files.sh helper - sysconfig/cloudinit_test.go: add test for initramfs case, rm "/" from path - cmd/snap: track started apps and hooks - tests/main/interfaces-pulseaudio: disable start limit checking for pulseaudio service - api: seeding debug api - .github/workflows/snap-build.yaml: build the snapd snap via GH Actions too - tests: moving journalctl.sh to a new journal-state tool - tests/nested/manual: add spread tests for cloud-init vuln - bootloader/assets: helpers for registering per-edition snippets, register snippets for grub - data,packaging,wrappers: extend D-Bus service activation search path - spread: add opensuse 15.2 and tumbleweed for qemu - overlord,o/devicestate: restrict cloud-init on Ubuntu Core - sysconfig/cloudinit: add RestrictCloudInit - cmd/snap-preseed: check that target path exists and is a directory on --reset - tests: check for pids correctly - gadget,gadget/install: refactor partition table update - sysconfig/cloudinit: add CloudInitStatus func + CloudInitState type - interface/fwupd: add more policies for making fwupd upstream strict - tests: new to-one-line tool which replaces the strings.sh helper - interfaces: new helpers to get and compare system key, for use with seeding debug api - osutil, many: add helper for checking whether the process is a go test binary - cmd/snap-seccomp/syscalls: add faccessat2 - tests: adjust xdg-open after launcher changes - tests: new core config helper - usersession/userd: do not modify XDG_DATA_DIRS when calling xdg- open - cmd/snap-preseed: handle relative chroot path - snapshotstate: move sizer to osutil.Sizer() - tests/cmd/snap-bootstrap/initramfs-mounts: rm duplicated env ref kernel tests - gadget/install,secboot: use snapcore/secboot luks2 api - boot/initramfs_test.go: add Commentf to more Assert()'s - tests/lib: account for changes in arch package file name extension - bootloader/bootloadertest: fix comment typo - bootloader: add helper for getting recovery system environment variables - tests: preinstall shellcheck and run tests on focal - strutil: add a helper for parsing kernel command line - osutil: add CheckFreeSpace helper - secboot: update tpm connection error handling - packaging, cmd/snap-mgmt, tests: remove modules files on purge - tests: add tests.cleanup helper - packaging: add "ca-certificates" to build-depends - tests: more checks in core20 early config spread test - tests: fix some snapstate tests to use pointers for snapmgrTestSuite - boot: better naming of helpers for obtaining kernel command line - many: use more specific check for unit test mocking - systemd/escape: fix issues with "" and "\t" handling - asserts: small improvements and corrections for sequence-forming assertions' support - boot, bootloader: query kernel command line of run mod and recovery mode systems - snap/validate.go: disallow snap layouts with new top-level directories - tests: allow to add a new label to run nested tests as part of PR validation - tests/core/gadget-update-pc: port to UC20 - tests: improve nested tests flexibility - asserts: integer headers: disallow prefix zeros and make parsing more uniform - asserts: implement Database.FindSequence - asserts: introduce SequenceMemberAfter in the asserts backstores - spread.yaml: remove tests/lib/tools from PATH - overlord: refuse to install snaps whose activatable D-Bus services conflict with installed snaps - tests: shorten lxd-state undo-mount-changes - snap-confine: don't die if a device from sysfs path cannot be found by udev - tests: fix argument handling of apt-state - tests: rename lxd-tool to lxd-state - tests: rename user-tool to user-state, fix --help - interfaces: add gconf interface - sandbox/cgroup: avoid parsing security tags twice - tests: rename version-tool to version-compare - cmd/snap-update-ns: handle anomalies better - tests: fix call to apt.Package.mark_install(auto_inst=True) - tests: rename mountinfo-tool to mountinfo.query - tests: rename memory-tool to memory-observe-do - tests: rename invariant-tool to tests.invariant - tests: rename apt-tool to apt-state - many: managed boot config during run mode setup - asserts: introduce the concept of sequence-forming assertion types - tests: tweak comments/output in uc20-recovery test - tests/lib/pkgdb: do not use quiet when purging debs - interfaces/apparmor: allow snap-specific /run/lock - interfaces: add system-source-code for access to /usr/src - sandbox/cgroup: extend SnapNameFromPid with tracking cgroup data - gadget/install: move udev trigger to gadget/install - many: make nested spread tests more reliable - tests/core/uc20-recovery: apply hack to get gopath in recover mode w/ external backend - tests: enable tests on uc20 which now work with the real model assertion - tests: enable system-snap-refresh test on uc20 - gadget, bootloader: preserve managed boot assets during gadget updates - tests: fix leaked dbus-daemon in selinux-clean - tests: add servicestate.Control tests - tests: fix "restart.service" - wrappers: helper for enabling services - extract and move enabling of services into a helper - tests: new test to validate refresh and revert of kernel and gadget on uc20 - tests/lib/prepare-restore: collect debug info when prepare purge fails - bootloader: allow managed bootloader to update its boot config - tests: Remove unity test from nightly test suite - o/devicestate: set mark-seeded to done in the task itself - tests: add spread test for disconnect undo caused by failing disconnect hook - sandbox/cgroup: allow discovering PIDs of given snap - osutil/disks: support IsDecryptedDevice for mountpoints which are dm devices - osutil: detect autofs mounted in /home - spread.yaml: allow amazon-linux-2-64 qemu with ec2-user/ec2-user - usersession: support additional zoom URL schemes - overlord: mock timings.DurationThreshold in TestNewWithGoodState - sandbox/cgroup: add tracking helpers - tests: detect stray dbus-daemon - overlord: refuse to install snaps providing user daemons on Ubuntu 14.04 - many: move encryption and installer from snap-boostrap to gadget - o/ifacestate: fix connect undo handler - interfaces: optimize rules of multiple connected iio/i2c/spi plugs - bootloader: introduce managed bootloader, implement for grub - tests: fix incorrect check in smoke/remove test - asserts,seed: split handling of essential/not essential model snaps - gadget: fix typo in mounted filesystem updater - gadget: do only one mount point lookup in mounted fs updater - tests/core/snap-auto-mount: try to make the test more robust - tests: adding ubuntu-20.04 to google-sru backend - o/servicestate: add updateSnapstateServices helper - bootloader: pull recovery grub config from internal assets - tests/lib/tools: apply linger workaround when needed - overlord/snapstate: graceful handling of denied "managed" refresh schedule - snapstate: fix autorefresh from classic->strict - overlord/configstate: add system.kernel.printk.console-loglevel option - tests: fix assertion disk handling for nested UC systems - snapstate: use testutil.HostScaledTimeout() in snapstate tests - tests: extra worker for google-nested backend to avoid timeout error on uc20 - snapdtool: helper to check whether the current binary is reexeced from a snap - tests: mock servicestate in api tests to avoid systemctl checks - many: rename back snap.Info.GetType to Type - tests/lib/cla_check: expect explicit commit range - osutil/disks: refactor diskFromMountPointImpl a bit - o/snapstate: service-control task handler - osutil: add disks pkg for associating mountpoints with disks/partitions - gadget,cmd/snap-bootstrap: move partitioning to gadget - seed: fix LoadEssentialMeta when gadget is not loaded - cmd/snap: Debian does not allow $SNAP_MOUNT_DIR/bin in sudo secure_path - asserts: introduce new assertion validation-set - asserts,daemon: add support for "serials" field in system-user assertion - data/sudo: drop a failed sudo secure_path workaround - gadget: mv encodeLabel to osutil/disks.EncodeHexBlkIDFormat - boot, snap-bootstrap: move initramfs-mounts logic to boot pkg - spread.yaml: update secure boot attribute name - interfaces/block_devices: add NVMe subsystem devices, support multipath paths - tests: use the "jq" snap from the edge channel - tests: simplify the tpm test by removing the test-snapd-mokutil snap - boot/bootstate16.go: clean snap_try_* vars when not in Trying status too - tests/main/sudo-env: check snap path under sudo - tests/main/lxd: add test for snaps inside nested lxd containers not working - asserts/internal: expand errors about invalid serialized grouping labels - usersession/userd: add msteams url support - tests/lib/prepare.sh: adjust comment about sgdisk - tests: fix how gadget pc is detected when the snap does not exist and ls fails - tests: move a few more tests to snapstate_update_test.go - tests/main: add spread test for running svc from install hook - tests/lib/prepare: increase the size of the uc16/uc18 partitions - tests/special-home-can-run-classic-snaps: re-enable - workflow: test PR title as part of the static checks again - tests/main/xdg-open-compat: backup and restore original xdg-open - tests: move update-related tests to snapstate_update_test.go - cmd,many: move Version and bits related to snapd tools to snapdtool, merge cmdutil - tests/prepare-restore.sh: reset-failed systemd-journald before restarting - interfaces: misc small interface updates - spread: use find rather than recursive ls, skip mounted snaps - tests/lib/prepare-restore.sh: if we failed to purge snapd deb, ls /var/lib/snapd - tests: enable snap-auto-mount test on core20 - cmd/snap: do not show $PATH warning when executing under sudo on a known distro - asserts/internal: add some iteration benchmarks - sandbox/cgroup: improve pid parsing code - snap: add new `snap run --experimental-gdbserver` option - asserts/internal: limit Grouping size switching to a bitset representationWe don't always use the bit-set representation because: - snap: add an activates-on property to apps for D-Bus activation - dirs: delete unused Cloud var, fix typo - sysconfig/cloudinit: make callers of DisableCloudInit use WritableDefaultsDir - tests: fix classic ubuntu core transition auth - tests: fail in setup_reflash_magic() if there is snapd state left - tests: port interfaces-many-core-provided to tests.session - tests: wait after creating partitions with sfdisk - bootloader: introduce bootloarder assets, import grub.cfg with an edition marker - riscv64: bump timeouts - gadget: drop dead code, hide exports that are not used externally - tests: port 2 uc20 part1 - tests: fix bug waiting for snap command to be ready - tests: move try-related tests to snapstate_try_test.go - tests: add debug for 20.04 prepare failure - travis.yml: removed, all our checks run in GH actions now - tests: clean up up the use of configcoreSuite in the configcore tests - sandbox/cgroup: remove redundant pathOfProcPidCgroup - sandbox/cgroup: add tests for ParsePids - tests: fix the basic20 test for uc20 on external backend - tests: use configcoreSuite in journalSuite and remove some duplicated code - tests: move a few more tests to snapstate_install_test - tests: assorted small patches - dbusutil/dbustest: separate license from package - interfaces/builtin/time-control: allow POSIX clock API - usersession/userd: add "slack" to the white list of URL schemes handled by xdg-open - tests: check that host settings like hostname are settable on core - tests: port xdg-settings test to tests.session - tests: port snap-handle-link test to tests.session - arch: add riscv64 - tests: core20 early defaults spread test - tests: move install tests from snapstate_test.go to snapstate_install_test.go - github: port macOS sanity checks from travis - data/selinux: allow checking /var/cache/app-info - o/devicestate: core20 early config from gadget defaults - tests: autoremove after removing lxd in preseed-lxd test - secboot,cmd/snap-bootstrap: add tpm sealing support to secboot - sandbox/cgroup: move FreezerCgroupDir from dirs.go - tests: update the file used to detect the boot path on uc20 - spread.yaml: show /var/lib/snapd in debug - cmd/snap-bootstrap/initramfs-mounts: also copy systemd clock + netplan files - snap/naming: add helpers to parse app and hook security tags - tests: modernize retry tool - tests: fix and trim debug section in xdg-open-portal - tests: modernize and use snapd.tool - vendor: update to latest github.com/snapcore/bolt for riscv64 - cmd/snap-confine: add support for libc6-lse - interfaces: miscellaneous policy updates xlv - interfaces/system-packages-doc: fix typo in variable names - tests: port interfaces-calendar-service to tests.session - tests: install/run the lzo test snap too - snap: (small) refactor of `snap download` code for testing/extending - data: fix shellcheck warnings in snapd.sh.in - packaging: disable buildmode=pie for riscv64 - tests: install test-snapd-rsync snap from edge channel - tests: modernize tests.session and port everything using it - tests: add ubuntu 20.10 to spread tests - cmd/snap/remove: mention snap restore/automatic snapshots - dbusutil: move all D-Bus helpers and D-Bus test helpers - wrappers: pass 'disable' flag to StopServices wrapper - osutil: enable riscv64 build - snap/naming: add ParseSecurityTag and friends - tests: port document-portal-activation to session-tool - bootloader: rename test helpers to reflect we are mocking EFI boot locations - tests: disable test of nfs v3 with udp proto on debian-sid - tests: plan to improve the naming and uniformity of utilities - tests: move *-tool tests to their own suite - snap-bootstrap: remove sealed key file on reinstall - bootloader/ubootenv: don't panic with an empty uboot env - systemd: rename actualFsTypeAndMountOptions to hostFsTypeAndMountOptions - daemon: fix filtering of service-control changes for snap.app - tests: spread test for preseeding in lxd container - tests: fix broken snapd.session agent.socket - wrappers: add RestartServices function and ReloadOrRestart to systemd - o/cmdstate: handle ignore flag on exec-command tasks - gadget: make ext4 filesystems with or without metadata checksum - tests: update statx test to run on all LTS releases - configcore: show better error when disabling services - interfaces: add hugepages-control - interfaces-ssh-keys: Support reading /etc/ssh/ssh_config.d/ - tests: run ubuntu-20.04-* tests on all ubuntu-2* releases - tests: skip interfaces-openvswitch for centos 8 in nightly suite - tests: reload systemd --user for root, if present - tests: reload systemd after editing /etc/fstab - tests: add missing dependencies needed for sbuild test on debian - tests: reload systemd after removing pulseaudio - image, tests: core18 early config. - interfaces: add system-packages-doc interface - cmd/snap-preseed, systemd: fix handling of fuse.squashfuse when preseeding - interfaces/fwupd: allow bind mount to /boot on core - tests: improve oom-vitality tests - tests: add fedora 32 to spread.yaml - config: apply vitality-hint immediately when the config changes - tests: port snap-routine-portal-info to session-tool - configcore: add "service.console-conf.disable" config option - tests: port xdg-open to session-tool - tests: port xdg-open-compat to session-tool - tests: port interfaces-desktop-* to session-tool - spread.yaml: apply yaml formatter/linter - tests: port interfaces-wayland to session-tool - o/devicestate: refactor current system handling - snap-mgmt: perform cleanup of user services - snap/snapfile,squashfs: followups from 8729 - boot, many: require mode in modeenv - data/selinux: update policy to allow forked processes to call getpw*() - tests: log stderr from dbus-monitor - packaging: build cmd/snap and cmd/snap-bootstrap with nomanagers tag - snap/squashfs: also symlink snap Install with uc20 seed snap dir layout - interfaces/builtin/desktop: do not mount fonts cache on distros with quirks - data/selinux: allow snapd to remove/create the its socket - testutil/exec.go: set PATH after running shellcheck - tests: silence stderr from dbus-monitor - snap,many: mv Open to snapfile pkg to support add'l options to Container methods - devicestate, sysconfig: revert support for cloud.cfg.d/ in the gadget - github: remove workaround for bug 133 in actions/cache - tests: remove dbus.sh - cmd/snap-preseed: improve mountpoint checks of the preseeded chroot - spread.yaml: add ps aux to debug section - github: run all spread systems in a single go with cached results - test: session-tool cli tweaks - asserts: rest of the Pool API - tests: port interfaces-network-status-classic to session-tool - packaging: remove obsolete 16.10,17.04 symlinks - tests: setup portals before starting user session - o/devicestate: typo fix - interfaces/serial-port: add NXP SC16IS7xx (ttySCX) to allowed devices - cmd/snap/model: support store, system-user-authority keys in --verbose - o/devicestate: raise conflict when requesting system action while seeding - tests: detect signs of crashed snap-confine - tests: sign kernel and gadget to run nested tests using current snapd code - tests: remove gnome-online-accounts we install - tests: fix the issue where all the tests were executed on secboot system - tests: port interfaces-accounts-service to session-tool - interfaces/network-control: bring /var/lib/dhcp from host - image,cmd/snap,tests: add support for store-wide cohort keys - configcore: add nomanagers buildtag for conditional build - tests: port interfaces-password-manager-service to session-tool - o/devicestate: cleanup system actions supported by recover mode - snap-bootstrap: remove create-partitions and update tests - tests: fix nested tests - packaging/arch: update PKGBUILD to match one in AUR - tests: port interfaces-location-control to session-tool - tests: port interfaces-contacts-service to session-tool - state: log task errors in the journal too - o/devicestate: change how current system is reported for different modes - devicestate: do not report "ErrNoState" for seeded up - tests: add a note about broken test sequence - tests: port interfaces-autopilot-introspection to session-tool - tests: port interfaces-dbus to session-tool - packaging: update sid packaging to match 16.04+ - tests: enable degraded test on uc20 - c/snaplock/runinhibit: add run inhibition operations - tests: detect and report root-owned files in /home - tests: reload root's systemd --user after snapd tests - tests: test registration with serial-authority: [generic] - cmd/snap-bootstrap/initramfs-mounts: copy auth.json and macaroon- key in recover - tests/mount-ns: stop binfmt_misc mount unit - cmd/snap-bootstrap/initramfs-mounts: use booted kernel partition uuid if available - daemon, tests: indicate system mode, test switching to recovery and back to run - interfaces/desktop: silence more /var/lib/snapd/desktop/icons denials - tests/mount-ns: update to reflect new UEFI boot mode - usersession,tests: clean ups for userd/settings.go and move xdgopenproxy under usersession - tests: disable mount-ns test - tests: test user belongs to systemd-journald, on core20 - tests: run core/snap-set-core-config on uc20 too - tests: remove generated session-agent units - sysconfig: use new _writable_defaults dir to create cloud config - cmd/snap-bootstrap/initramfs-mounts: cosmetic changes in prep for future work - asserts: make clearer that with label we mean a serialized label - cmd/snap-bootstrap: tweak recovery trigger log messages - asserts: introduce PoolTo - userd: allow setting default-url-scheme-handler - secboot: append uuid to ubuntu-data when decrypting - o/configcore: pass extra options to FileSystemOnlyApply - tests: add dbus-user-session to bionic and reorder package names - boot, bootloader: adjust comments, expand tests - tests: improve debugging of user session agent tests - packaging: add the inhibit directory - many: add core.resiliance.vitality-hint config setting - tests: test adjustments and fixes for recently published images - cmd/snap: coldplug auto-import assertions from all removable devices - secboot,cmd/snap-bootstrap: move initramfs-mounts tpm access to secboot - tests: not fail when boot dir cannot be determined - tests: new directory used to store the cloud images on gce - tests: inject snapd from edge into seeds of the image in manual preseed test - usersession/agent,wrappers: fix races between Shutdown and Serve - tests: add dependency needed for next upgrade of bionic - tests: new test user is used for external backend - cmd/snap: fix the order of positional parameters in help output - tests: don't create root-owned things in ~test - tests/lib/prepare.sh: delete patching of the initrd - cmd/snap-bootstrap/initramfs-mounts: add sudoers to dirs to copy as well - progress: tweak multibyte label unit test data - o/devicestate,cmd/snap-bootstrap: seal to recover mode cmdline - gadget: fix fallback device lookup for 'mbr' type structures - configcore: only reload journald if systemd is new enough - cmd/snap-boostrap, boot: use /run/mnt/data instead of ubuntu-data - wrappers: allow user mode systemd daemons - progress: fix progress bar with multibyte duration units - tests: fix raciness in pulseaudio test - asserts/internal: introduce Grouping and Groupings - tests: remove user.sh - tests: pair of follow-ups from earlier reviews - overlord/snapstate: warn of refresh/postpone events - configcore,tests: use daemon-reexec to apply watchdog config - c/snap-bootstrap: check mount states via initramfsMountStates - store: implement DownloadAssertions - tests: run smoke test with different bases - tests: port user-mounts test to session-tool - store: handle error-list in fetch-assertions results - tests: port interfaces-audio-playback-record to session-tool - data/completion: add `snap` command completion for zsh - tests/degraded: ignore failure in systemd-vconsole-setup.service - image: stub implementation of image.Prepare for darwin - tests: session-tool --restore -u stops user-$UID.slice - o/ifacestate/handlers.go: fix typo - tests: port pulseaudio test to session-tool - tests: port user-session-env to session-tool - tests: work around journald bug in core16 - tests: add debug to core-persistent-journal test - tests: port selinux-clean to session-tool - tests: port portals test to session-tool, fix portal tests on sid - tests: adding option --no-install-recommends option also when install all the deps - tests: add session-tool --has-systemd-and-dbus - packaging/debian-sid: add gcc-multilib to build deps - osutil: expand FileLock to support shared locks and more - packaging: stop depending on python-docutils - store,asserts,many: support the new action fetch-assertions - tests: port snap-session-agent-* to session-tool - packaging/fedora: disable FIPS compliant crypto for static binaries - tests: fix for preseeding failures- Release 2.45.3.1 to Fedora (RHBZ#1861024) - Fix FTBFS in Rawhide (RHBZ#1865496)- Second attempt - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild- New upstream release, LP: #1875071 - o/ifacestate: fix bug in snapsWithSecurityProfiles - tests/main/selinux-clean: workaround SELinux denials triggered by linger setup on Centos8- New upstream release, LP: #1875071 - many: backport _writable_defaults dir changes - tests: fix incorrect check in smoke/remove test - cmd/snap-bootstrap,seed: backport of uc20 PRs - tests: avoid exit when nested type var is not defined - cmd/snap-preseed: backport fixes - interfaces: optimize rules of multiple connected iio/i2c/spi plugs - many: cherry-picks for 2.45, gh-action, test fixes - tests/lib: account for changes in arch package file name extension - postrm, snap-mgmt: cleanup modules and other cherry-picks - snap-confine: don't die if a device from sysfs path cannot be found by udev - data/selinux: update policy to allow forked processes to call getpw*() - tests/main/interfaces-time-control: exercise setting time via date - interfaces/builtin/time-control: allow POSIX clock API - usersession/userd: add "slack" to the white list of URL schemes handled by xdg-open- release 2.45.2 to Fedora- New upstream release 2.45.2 - SECURITY UPDATE: sandbox escape vulnerability on snapctl xdg-open implementation - usersession/userd/launcher.go: remove XDG_DATA_DIRS environment variable modification when calling the system xdg-open. Patch thanks to James Henstridge - packaging/ubuntu-16.04/snapd.postinst: ensure "snap userd" is restarted. Patch thanks to Michael Vogt - CVE-2020-11934 - SECURITY UPDATE: arbitrary code execution vulnerability on core devices with access to physical removable media - devicestate: Disable/restrict cloud-init after seeding. - CVE-2020-11933- Release 2.45.1 to Fedora (RHBZ#1844628) - Drop cherry-picked patches that are part of the release- New upstream release 2.45.1 - data/selinux: allow checking /var/cache/app-info - cmd/snap-confine: add support for libc6-lse - interfaces: miscellanious policy updates xlv - snap-bootstrap: remove sealed key file on reinstall - interfaces-ssh-keys: Support reading /etc/ssh/ssh_config.d/ - gadget: make ext4 filesystems with or without metadata checksum - interfaces/fwupd: allow bind mount to /boot on core - tests: cherry-pick test fixes from master - snap/squashfs: also symlink snap Install with uc20 seed snap dir layout - interfaces/serial-port: add NXP SC16IS7xx (ttySCX) to allowed devices - snap,many: mv Open to snapfile pkg to support add'l options to Container methods - interfaces/builtin/desktop: do not mount fonts cache on distros with quirks - devicestate, sysconfig: revert support for cloud.cfg.d/ in the gadget - data/completion, packaging: cherry-pick zsh completion - state: log task errors in the journal too - devicestate: do not report "ErrNoState" for seeded up - interfaces/desktop: silence more /var/lib/snapd/desktop/icons denials - packaging/fedora: disable FIPS compliant crypto for static binaries - packaging: stop depending on python-docutils- Release 2.45 to Fedora (RHBZ#1814552) - Cherry pick zsh completion patch - Cherry pick patch disabling fontconfig system cache sharing due to known incompatibilities - Drop sudoers config (RHBZ#1691996)- New upstream release 2.45 - o/devicestate: support doing system action reboots from recover mode - vendor: update to latest secboot - tests: not fail when boot dir cannot be determined - configcore: only reload journald if systemd is new enough - cmd/snap-bootstrap/initramfs-mounts: append uuid to ubuntu-data when decrypting - tests/lib/prepare.sh: delete patching of the initrd - cmd/snap: coldplug auto-import assertions from all removable devices - cmd/snap: fix the order of positional parameters in help output - c/snap-bootstrap: port mount state mocking to the new style on master - cmd/snap-bootstrap/initramfs-mounts: add sudoers to dirs to copy as well - o/devicestate,cmd/snap-bootstrap: seal to recover mode cmdline, unlock in recover mode initramfs - progress: tweak multibyte label unit test data - gadget: fix fallback device lookup for 'mbr' type structures - progress: fix progress bar with multibyte duration units - many: use /run/mnt/data over /run/mnt/ubuntu-data for uc20 - many: put the sealed keys in a directory on seed for tidiness - cmd/snap-bootstrap: measure epoch and model before unlocking encrypted data - o/configstate: core config handler for persistent journal - bootloader/uboot: use secondary ubootenv file boot.sel for uc20 - packaging: add "$TAGS" to dh_auto_test for debian packaging - tests: ensure $cache_dir is actually available - secboot,cmd/snap-bootstrap: add model to pcr protection profile - devicestate: do not use snap-boostrap in devicestate to install - tests: fix a typo in nested.sh helper - devicestate: add support for cloud.cfg.d config from the gadget - cmd/snap-bootstrap: cleanups, naming tweaks - testutil: add NewDBusTestConn - snap-bootstrap: lock access to sealed keys - overlord/devicestate: preserve the current model inside ubuntu- boot - interfaces/apparmor: use differently templated policy for non-core bases - seccomp: add get_tls, io_pg* and *time64/*64 variants for existing syscalls - cmd/snap-bootstrap/initramfs-mounts: mount ubuntu-seed first, other misc changes - o/snapstate: tweak "waiting for restart" message - boot: store model model and grade information in modeenv - interfaces/firewall-control: allow -legacy and -nft for core20 - boot: enable makeBootable20RunMode for EnvRefExtractedKernel bootloaders - boot/bootstate20: add EnvRefExtractedKernelBootloader bootstate20 implementation - daemon: fix error message from `snap remove-user foo` on classic - overlord: have a variant of Mock that can take a state.State - tests: 16.04 and 18.04 now have mediating pulseaudio (again) - seed: clearer errors for missing essential snapd or core snap - cmd/snap-bootstrap/initramfs-mounts: support EnvRefExtractedKernelBootloader's - gadget, cmd/snap-bootstrap: MBR schema support - image: improve/adjust DownloadSnap doc comment - asserts: introduce ModelGrade.Code - tests: ignore user-12345 slice and service - image,seed/seedwriter: support redirect channel aka default tracks - bootloader: use binary.Read/Write - tests: uc20 nested suite part II - tests/boot: refactor to make it easier for new bootloaderKernelState20 impl - interfaces/openvswitch: support use of ovs-appctl - snap-bootstrap: copy auth data from real ubuntu-data in recovery mode - snap-bootstrap: seal and unseal encryption key using tpm - tests: disable special-home-can-run-classic-snaps due to jenkins repo issue - packaging: fix build on Centos8 to support BUILDTAGS - boot/bootstate20: small changes to bootloaderKernelState20 - cmd/snap: Implement a "snap routine file-access" command - spread.yaml: switch back to latest/candidate for lxd snap - boot/bootstate20: re-factor kernel methods to use new interface for state - spread.yaml,tests/many: use global env var for lxd channel - boot/bootstate20: fix bug in try-kernel cleanup - config: add system.store-certs.[a-zA-Z0-9] support - secboot: key sealing also depends on secure boot enabled - httputil: fix client timeout retry tests - cmd/snap-update-ns: handle EBUSY when unlinking files - cmd/snap/debug/boot-vars: add opts for setting dir and/or uc20 vars - secboot: add tpm support helpers - tests/lib/assertions/developer1-pi-uc20.model: use 20/edge for kernel and gadget - cmd/snap-bootstrap: switch to a 64-byte key for unlocking - tests: preserve size for centos images on spread.yaml - github: partition the github action workflows - run-checks: use consistent "Checking ..." style messages - bootloader: add efi pkg for reading efi variables - data/systemd: do not run snapd.system-shutdown if finalrd is available - overlord: update tests to work with latest go - cmd/snap: do not hide debug boot-vars on core - cmd/snap-bootstrap: no error when not input devices are found - snap-bootstrap: fix partition numbering in create-partitions - httputil/client_test.go: add two TLS version tests - tests: ignore user@12345.service hierarchy - bootloader, gadget, cmd/snap-bootstrap: misc cosmetic things - tests: rewrite timeserver-control test - tests: fix racy pulseaudio tests - many: fix loading apparmor profiles on Ubuntu 20.04 with ZFS - tests: update snap-preseed --reset logic to accommodate for 2.44 change - cmd/snap: don't wait for system key when stopping - sandbox/cgroup: avoid making arrays we don't use - osutil: mock proc/self/mountinfo properly everywhere - selinux: export MockIsEnforcing; systemd: use in tests - tests: add 32 bit machine to GH actions - tests/session-tool: kill cron session, if any - asserts: it should be possible to omit many snap-ids if allowed, fix - boot: cleanup more things, simplify code - github: skip spread jobs when corresponding label is set - dirs: don't depend on osutil anymore, mv apparmor vars to apparmor pkg - tests/session-tool: add session-tool --dump - github: allow cached debian downloads to restore - tests/session-tool: session ordering is non-deterministic - tests: enable unit tests on debian-sid again - github: move spread to self-hosted workers - secboot: import secboot on ubuntu, provide dummy on !ubuntu - overlord/devicestate: support for recover and run modes - snap/naming: add validator for snap security tag - interfaces: add case for rootWritableOverlay + NFS - tests/main/uc20-create-partitions: tweaks, renames, switch to 20.04 - github: port CLA check to Github Actions - interfaces/many: miscellaneous policy updates xliv - configcore,tests: fix setting watchdog options on UC18/20 - tests/session-tool: collect information about services on startup - tests/main/uc20-snap-recovery: unbreak, rename to uc20-create- partitions - state: add state.CopyState() helper - tests/session-tool: stop anacron.service in prepare - interfaces: don't use the owner modifier for files shared via document portal - systemd: move the doc comments to the interface so they are visible - cmd/snap-recovery-chooser: tweaks - interfaces/docker-support: add overlayfs file access - packaging: use debian/not-installed to ignore snap-preseed - travis.yml: disable unit tests on travis - store: start splitting store.go and store_test.go into subtopic files - tests/session-tool: stop cron/anacron from meddling - github: disable fail-fast as spread cannot be interrupted - github: move static checks and spread over - tests: skip "/etc/machine-id" in "writablepaths" test - snap-bootstrap: store encrypted partition recovery key - httputil: increase testRetryStrategy max timelimit to 5s - tests/session-tool: kill leaking closing session - interfaces: allow raw access to USB printers - tests/session-tool: reset failed session-tool units - httputil: increase httpclient timeout in TestRetryRequestTimeoutHandling - usersession: extend timerange in TestExitOnIdle - client: increase timeout in client tests to 100ms - many: disentagle release and snapdenv from sandbox/* - boot: simplify modeenv mocking to always write a modeenv - snap-bootstrap: expand data partition on install - o/configstate: add backlight option for core config - cmd/snap-recovery-chooser: add recovery chooser - features: enable robust mount ns updates - snap: improve TestWaitRecovers test - sandbox/cgroup: add ProcessPathInTrackingCgroup - interfaces/policy: fix comment in recent new test - tests: make session tool way more robust - interfaces/seccomp: allow passing an address to setgroups - o/configcore: introduce core config handlers (3/N) - interfaces: updates to login-session-observe, network-manager and modem-manager interfaces - interfaces/policy/policy_test.go: add more tests'allow- installation: false' and we grant based on interface attributes - packaging: detect/disable broken seed in the postinst - cmd/snap-confine/mount-support-nvidia.c: add libnvoptix as nvidia library - tests: remove google-tpm backend from spread.yaml - tests: install dependencies with apt using --no-install-recommends - usersession/userd: add zoommtg url support - snap-bootstrap: fix disk layout sanity check - snap: add `snap debug state --is-seeded` helper - devicestate: generate warning if seeding fails - config, features: move and rename config.GetFeatureFlag helper to features.Flag - boot, overlord/devicestate, daemon: implement requesting boot into a given recovery system - xdgopenproxy: forward requests to the desktop portal - many: support immediate reboot - store: search v2 tweaks - tests: fix cross build tests when installing dependencies - daemon: make POST /v2/systems/