snapd-devel-2.56.2-1.el8$>|{ҽˡb>:?d  7 #/QW` 1  I  b  t  _  k  s  E`iij7(jS8j\9n:G H .4 I ^ X jY m\ v ] x ^ ^=b d e f l t $ u vhlCsnapd-devel2.56.21.el8Development files for snapdThis package contains library source intended for building other packages which use import path with github.com/snapcore/snapd prefix.bWbuildvm-a64-16.iad2.fedoraproject.org4iFedora ProjectFedora ProjectGPLv3Fedora ProjectUnspecifiedhttps://github.com/snapcore/snapdlinuxnoarch En |7f$ ]#zoL%"71[%X^$!# J'h h n*,P$ !'1!44G ct̗nJ/3T  X vjo+B|!1!:!.FXUo=I(b1%6!%If&M w51qv+0\Tq@mGjkH# y@nm? K B")H@:.^MMq#FW& 9 BD@]\h7 4R<FE  .YF)q#VN65A!T6 4} v"Z v24Nc8 B &~"V~ pkp O96![f %PgB5}=!=. E ,6N}  zo zpb3 Yj% Vnd7j-p 4= ! *`1,: 1V_3w cA"n : q'kC$/?! #_&  \  F{I2'{'%7- "Zb_ ` MGs  -AnA)H%3N Tgp$) +X ~AlX i _ G 6<::="Fs ? . P G#u[9Y$t#  jw$B.:-  8 B4 G  I!8@l_%<Hb i X!Jva 0^D18~-Z E ~;Z7N )$ U=p7F *jP82dDH0=z%L(y#/L ( ]t5(F 1 h{?_  X^!6 Q    >XE<h !3F R$(1b U \G!v-+07_ p+ 8zt@1'ts2 B 'Z5y ! !4: %-(f$Dwp 5N*5t2z dQaw- L, $ Y[<_IU e ~ (#6X(U ce!(." 9- 1  5 Jp $' * -  !"0; 3] 0 7  U0+* q: `%NF( 2   e > ,(# g  \ Y ; `Xe#. m 9< A H .O(S- 3 Hlu )X f 7[6 Z$ $q#  $ x  %%y`&5+( K ,E { i+  `/dwQ.z&vs i $ ] 9  *)%SU q  +  pOl7(#^nf  e$  = 5 *< R d U7 -j b!'<+/67 @ ~ 6 3"v  * c   } a v '  s  QB*@ \UAYx !kP$oe h#)#/, 7!Hk Q ,Z Drq F9#\!%>6% (I o% A W uC m)9/D @O{U   1 Nk T06L #@+ OJ% 3 n ~X-Z&}G  h 4a>5I(Je z ' n)'>9#& %(&>i%$ !1;<3 ;% +4m  ## !pSt5 8$$>Z fG +G*cyΪ$z $b1(5]v_<(*$Gb 5  / o PMB B#kEM  '8 u Jt;)'  |`#+1L)v2n,*h%sQ6\  Ryzq'ۃ %.0(FW/b  %xF^2W 8 2i} y V l!$0!X!x. v* @ ,T9" + 3m>#>R g uZ5A< 2I 8 pK g 4 ! "D( Q1 ,Vc$H *-S[  u.0P/3x R,N m3uJRPM=oE 7 ] !- 2D&`-En  F}:'ja~ 7:7%C [!,o|м+$ J$[U+:  e>D f !#%65 ddǫ \MBW1 InJ.EYI::3|5h G-)7" zL4   5:4'^q7@&u$ $eK  )  0C\Ok.gse  7H j  B:I T  rvJ0d x  ),NK q'g(z )Rwj+*b$%=e . PR,; 7 O(i_*L6% j9]9 ,|b,S' X-># >8pi' b ' 4 &: a No78h( z)5s'>`>]&2B\"&\iV{ LYJ)\9`)E )e=d&  5"l" &%.(&. t x{&L  M ` en  LWg\H *   - 0G# S #Dsr m2, W `b*;`(i^A!5#3 #&7s&3 (e/5  3 O /J1 -)8k'#x B!  *q   sB +p&!.J"p;LEO' %Kq+1*r@u P91a`*M;"\`nw!W(*|@HEHE,Ejni+Gī "ѽ00///X~f&#!{!{ "n'30uy{'5o'oem;wNwz8/JH>'LI6I<LLQP$P*<27NI0q5q9>wz/-./-/:/GuG$nD1?*DT2G2KDXCW7+7/)24`ffffGxG|GxG'H  %%++**e_0-b.-<-5--n-r-.. ../9-wv5v%%%%!%#jD(0I8ZK$! 0wQ^k1k1m^Jo"/| T7VT#UZ)>K 0" l mH0i4;R2D266RN)&T2|/ Q4-fAaU\ד97 !BW *Ntqv !d _PX*'WD kvr  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큤A큤A큤A큤A큤AA큤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큤A큤A큤AA큤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큤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큤b;bbb&bbbbbbbbbbbbbb#bbbbbbb"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"bb#bbbbbbbbbbbbbbbbbb"bbbbbbb"bbbbbbbb"bbbbbbbbb"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb!bbb!bbbbb!bbbbb!bbbbbbbbbbb!bbb!bbbbbb!bbbbb!bbbbbbbbbb!bbbbbb$bbbbbbbbbbbb$bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb b bbbbbbbbbbbbbb bbbbb bbbbbbbbbb bbbb bbbbbbbbb!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbb bbb bbb%bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb#bbbb"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb#bbbbbb#bb!bbbbb&bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"bbbbbbb!bbbb!bb!bbbbbb!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&bbbbbbbbbbbbbbbbbbbb%bbbbbbbbbbbbb%bb#b#bb#bbbbbbb#bbb#bbb#b#bbbbb#bbb#bb#bb#bb#bb#bb#bb#bb#bb#bb#bb#bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%bbbbbbbb!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbb bb bbbbbb bbbbbbbbbb bbbbbbbbb bb bbbbb bbbbbbbbbbbbbbbbbbbbbbbbb bb bb bbbbbbb bbbbbbbbbbbbbb bbbbbbbbbbbb bbbbb bbbbbbbbbb bbbb bbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbb bbb bbbbb bbbb bb bbb bbb bbbbbbbbbbbbbbbbbbbbbbbbb bbb bbbbbb bb bbbbbb bb bbbbbb bb bbbbbb bb bb bbbbbbb bbbbbbbbbbbbbbbbbbbbbbb bb bbb bb bbb bb bb bbbbbbbbbbbbbbbbbbb bb bbbbbbbbbbbb bbbbbbb bbbbbbbbbbbbbbbb bbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb#bbbbbbbbbbbbbbb%bbb;b21583549dd260c6d969e1603f4cbb9be6ea1efa8b17bd6a0fbc7a45ed7c95825786bf0b05ee9f95d50b1373ad8bada003cb2c7edc04260badb3134a829886bf9e0e0ca544d91dec35b073e31b48ef786ed552d866c467c51db69ad3ea28ec6f69f54e72ffd47d112645313d6a89eb73c21ada1ef6054ffcd6e5e571954daa095f364ee020d414691a297f5820a44d85930b43921f5e7d05d68c3e3dcded5f9c49fd5a490873c57aaedb21e56a7bab48253e70939d3110abaed37336c848182d36b24d7dfc697c2c239663346cc4014f1eae4b173b3397f99c385cd4fec9a9cce59d2bb2f8c9875933627f11478ced16af4c2dfef02366318bf51d197cd5e5de313017fc78ee6c9fdb486203661ef21e64dfcb1482a9e161c584bbc780dd890bb6aa8663d242970b59c161b8f779a71d9e89b685939e8951933c3928a4b52390e97442e3498280905630373b2013b2a6d96311b3d11adffaecaa86c006a0c8d70bac83f2712c2d63089757ceeb3405ee3161f7e7c1c65779ca349f70e9ad8aee2544554e224a63c213f02294094239c40b67925d6e9124e0cfc1dd74471299c54e3964cf8b7bbae31457776b0d80c86b91b91b2fe4d23ecc4a2d9c14945bca7b61cbab3f2ba3c822c80b30940dcdaaa53205c4d69b7a7e5b91696eeab483bb28e0a256f683fb9a3c5950727aee50b949694ffaf607c9fb2e27a5a61068823c0208116b6ee7125b6ba80408d60dc6f195f7a68d25ead6f901275fc2a8ffea0c9af326381d1090adbed4ad70ba35589b4eed13cb69b68d84b08f242d8878c9f9ab419c7c14af100d0733a413eae9f9516cf2e38538ec1ffcad5a72c5f793479db57cc6f4a19bd035120f65ab47faee1b629d1da75cdcba1d23f696eb1f73aa27117ac55d67a5a36633404d5abbb75837f61555505c85da717b6ea0bdd1971146c9dc8e5c6ffb8ea9187022c059ed2ef0a8f1e26275187c6e54333a3c4cbd00e974457678e4597def7f615c0ac71ce507eba58168c014ba31339dab4752c2ebdd3122a94085e13217bc40f40c0845ba74e47d57f5334c5e0a4c7dd072fa62382d9b5e93946d24c9961e6002eecdc6e777a5a2fab19ebab4a8318a9d9f6de4ec9fed0b9a7dbf39438cd0c1fd9e46326138f95e48cd52ef2cf7cd196959f8683a1e52e29e335031c8ce79c73dfed1497a2807100f60aae7128a5b16f48e46090c709e9b471f084730484f886254ba65e79efa6b907a945a6855f15a91226ba3851463a1f3a18fdc52ecf139db17c077f0cb8503c3eab7c9a923c763239915a076cb096da39829e782c3ee89177f62248ee42c51c5cda2c406c2006ec6cc255b3c13d438550b7ad4ee26dde6fcfd83ae728ca2a68039ecbb5a0fa97057e834db53db28f768d10a245f3cedf7786cce9d73e8d44e1925160b86f1b43a8e59f1a7922e2e7144c090dad3bed4d8f6ffcfa2785d4abb4ffba104426451016cc886d68fc8f6e94fe0268ed21747abd9f29aaebb66827eb4bab14259d60c0aa7b40bef5828e0dbb2daab5b3ee81050da4342f4281f3032df639f28e0469722d6be097cf8961a6f3116fb656b21c670a81363ee2ea99f22a3252415a44ce2afc9d6e46c3c7e3ea5941320c3ab35c3fd6194381a76da6d98850d44b536897cc200eef739b648aced2aa7ad2f9ea2fa10ff5b67f5b3a538795cba65c44fae9434dc358c9ae32cc693bafb86bc33c05d61944aaf8913ec6c866daecd6b71abe6b745c1fa2d13231e87819a5038ec7af7a8a999ce458f38534488c23ac39422df97aa9d94025a84ed6c9eada14ece164348503a45433c4a312588c06005ddb94ba5b010289a3ce55d92bd7ea1492c1fcaf3c3fa3dde55aa4482e6759df72ab0155974424e39d42fc305ba52c2adfaf90b2496e27267c9841920cb5c4fa4e6bc58fedf3482badbac81e7f51a2b94847cfe5ce59607d1e9d9fa7dd9962cd747decb45d7235636371d66a2db005b0645a29a17792089868c76634eabba145115f63f1390b4ebac13845885aa2c7cd33d11329825d14080c3420c6564257fbbc195c78b2017ba104ec5005e367930d974ecf201c9d026f5c688a79929b71c62e165fa712d952ed45f0a6640278d9808ccfc0ff62254c81dbd6b81df11de6f4da9fe4833b6930c646d67373db68ea88e1c76935d4df1762e5ad8ae64d5bdbf3319a5064624d73c9697eba5c3e158bbdb40efc5ec08fe24ff1126e8edb59e6f83a7fb87d9a7cc96ff45e08da05e03ad01ba557905103a208f071d9a4bf9e4433b3b5efce73ad7219eeb0f4fb713c457c8ebcc035af65a3aeb43bbca0766044af025130c90c8c8479741b26ff4ff4f77d74a806710a00158c794cd12991e8951ade78c55686c344cc53672583d19494aa450ca68464f33cc3002f1084933032a304136289c01cfbf6191ebeefab235fc6a3a3baddb5aa4a6a587ba7138f1ffe0eed3f12f68888c531858ef660f39ced275bac9dae1881bcb73111c5b0309f05c7331d712ac601cba819aa0e7b4f5586d7ecce400e968064671decbfb78a8b3c4afc91156714e4789a750970ac439e9fe6c14cc96afe1258e4806b3e466c2e7356495dff9f352f0d0460912ad0e4cd505487628cc60c3b138f316242af47c97ed2a247e68f6b514143dec0ed72a1963c5d8845c2c1210fac53ec3d80e790a09b51555b768d53f98e91351bf1197dc5ad0b25f02d3d7d265c8db1ae963e108eda4ae3c69c15d657145aa7ff94f309b5b999f15d33ba32adf113b48741eeb485cede25e8877cfb34ce0b345006955c4fe82b2fac181530c31db8bbb0fa726a986544035167532331d55e97c5ea70fdee27db8c5931cd006cefdeec3cb968c51f8f96715dfbb5197a1dfcc50b88e810e6959ccee2357a5911b02a3989140d85538403b43eb91d2d5e3eb6e0ca4836176aeec207ab4b5f916f7eace722ada627483e32a93390e9d2314b96de609a3d435cbeaded714c6ccbe6321693b6f1c81221946d2445c0b08971556dd3c8ade18db4ed4946a4c4ac35983bedde94bc4f453280c0eb11a510c4215e47329b2ea17820d2825d9db5a86e6e87c1fc5125af7488495fe7bbbe1d154532fb27dfa908cdae91dc22f5eed0db3adf9a0c25b6e13f04fba04426ab99f5973c5af9949c583e5cba3f916853ce76dade7a056fb064266d467f2820922a4a2d84b22be7c791498d78ec880aa7ae6d34b78766fb1f115650e56a13ea38c077c841c0a6fec0b0e9c2ea7874aff705c91dfb5357b4f6fd5bb7fab04da93e21d62f55ef4fb60633e8147d0c5be2d33c82660761c0feecb4366618ba62190efba37264cf5f87220901e973345210af8d50352f49cb264b0dcf3f5c9c6ab411a09e9cff4134ec49d6fcfa240ffeff9611ba753fd9a9fe603511bfef1c0a3358d84b61f718793b9dcaec0b287cbfec84ed614f7e82492c23aeb0e0c718a2d4b64557cfb5fc4c3b83863fa13198fcccce67e2098bb0ee6520a0dc3f77412ef355f81742510b0cd1094dfba7627b8a0a27100d3338c29f135a13cde45f5c4f50c218dc28d13242f7f802bcff6af21d1425b94880f0de24a15f48fe065f876484a7e471bf1cd8c5bccc5f8a01f2d887cdf3243fb0f2a83af850e45df3d6f9564155c2ddad10f2bf5c052111891dcd7cba61a5dd84cf19dc9ce593445f25372a946a6c4c2e9eab1d4aebd7740d1848ab57df8b7ef5d8b49ef5d54b41421ab7b5eeec5d7cdcb8a46a8ca13e0665aa9fc7b8ec882c4c4a90fc73308b4ef0cc5dff2395b3c77d164cec4dc18a2ee274dfd524c4238434ef0c41fcb71762ca4e8c03f8b4e7d03c6bf852a7026892cabf1af8b7dafbed5a57850f7361baf898e154b67364d7272344f0a0a7f6f9cd7619044c078a905bd7bd35658576b0dd0692cb43b6b7bf5dca143fda1b5de36acb01d88551a5cbd5705a39711b9112f314d515117a1a0cb12290d3f1afaa9d3bd54f7899241e51954882f67330764ea93112aff6963cf3a89143fa5a3fa59f007fe6b5fc656a09c3fbf70bd71ba97eb512f66320a0ebb60b646aac72368a991852a569b8fb2e808539665cd5f5c044cb128ed2c6069d265ec33586b60eca0a8e45d5ec6c0bdcedb881aaf4c3ab1ab033732ed76cf39e32c43a2a97c21756d2e76bbed3fc28a2d63f1e2750dff0826c8bb587655ae31f8b6b2c22d3c441e1ebb96451e4086c495087de10c95f8c9e6bcfae49c635cf737b18febd160e593e0fde04c65abbb5ed577fd9c10a48d5c27014acfd4bffe9ed278b2058487d070093e474677880a3c877ac204f3840b59c82ea965de261f20156f91de61d28151a350dda25c9c14eeb9415248d395ac6cc8fe54a4a30fda9bfcf8ea92702885f573a2c57155c3db7e9a2d89ded627b27d120335b7a612fbe193e842d7f93ecb66b9b6b93fd56e2e74dd69fb2cf8a0730f79460f62b7eb620d727eaae07730674ecde33b9870b6a5e30d8073d283645f9b195301691641c3ab31c65c5af74d71963f5766caa39859998695d9266e8fda366dbc2bc38e252140f137579f6420c7b3d911589238f50e2205ff4045dd0465f9b80b32dcfa6563e8f5326f3834b5bc44481eb2d9b83ed22b990389eb603ee203e6c36fe29931614d209ac1bbdfa0db6bdd8bda287b41c44eab458acdd620d7e9696414468e1889afce88942abdb06f6d34bbaa8f1aac4aaadce879b077b324d30237ed65ee8a21b2715dce7c11175f2d386f6dd5fbd9912f4c6480e38c47aac40ae59b0b8564ed53c8d15ec9a2094aa47ecce42450b0201aac48caeee4fb439d5b8d0deab1e4adc006014b57f7e95fae0b31a900c625f9edde8e6365e2e58d81348b197d6898923fef8ea0e444d065c9e978a6759bb509d4ff2975998464f53139c7fcf0b84902562734c71fb3ca86a1a9da1db61fb7cbcd39e1e10b709ec6723a7609cbe992e0dbc711bf82c8371e4c15dd2c83eb41cda98fbf445aac57fb9898b619af7a639907c80bbe25920400b13c7d59ae69f7d56bccb3b1e4489a7d059ea8ffa0385d85fd97e6e27d695bc0e6c3e8a5bdd6e4d5e715a05eb1b10cb07b2f14ea7638cc554553965ba0ae9c2a9d3ea38b7bcc3f667b9aeb0514d8dd7bf0127a269363a33f739e778ac332adfa1e3e2d1b72c57f480694a62108a5eba2e6ca8b47fd01e87c60518898611c3ffe3064957de1418ba04ed6d0908af48f274370e150321f4efe7c7cf08c900a3b4d07f9b474b0b474f0b240bc56ff1e064aebe6388250a87118f1e249f61f33e69e42549902d105866cf5c9a0b4b4882dc9ed1791f19367c4b4228a2b9cc0dc1b6dc105cc3d080154f2a560c3bf093cd80292218a3f7f7343860400577a26bb9d4d98d0f686a8733f2232ed16a7738b8b832a56c3b08b157bd53614d81b761f24f0fff8a8196dc72daf12fb3b0dfbd1e4a26389769c5943432699dfa6041fb64047921f767030f526439ace806aee8c9f5996c26d37da941396a7a0309f35d3ba97bfbb4ddc0cdf4e2ddfa63fdf294e7f71b56de70cf2e8e412e2ba4e9c2c7c49c0b3fa1e71ff2fee4ea92abc67d87edcf6ca7354dc5e05c36b6737210cfe1e58fe5214df729fcf9d963aabcb01e7a9284b7e4b482ee465bc3ebb6659ae685e3e21f542a43022846d5b4de16aebada6d4af9d1b6c229284b35ceab4cdfcaf79ad5a1e612d56fe28389ba297e0df80dd0786bd55940ce4092c535b5c4ab6c41d2c43b83d4e44a1539e329c835a7647bd6930bd53e8f1ce6d156f229f552a8c1a194fe29b5feb26417e20eb8ebaf0f75ad3ee7c29462083b5e7e3aca0de50f27f8b835ec1365c85ffc5fc9045f293813dc07a2c3739c748ca8b7fa8bbbae9aa3694e59ad44cbde9331535ccf46ed41f01bc331515c23ba52b3bb473f81fe18cee253804d9cae8f25927292c3fad12f4e78970cddd799f49ec366ef93650b01c83e70c9b3a72751b18c683242494caa1f6c84cb5496798781b8655f5eb9fc5b30dc401988d8375126eb298dd44d8503822851376038fa3aa7764a3662709dcb68f1485f5297aec85e851e56e9074887a48c5b565a6b68f53665a876d9fbcff3e9d50f6a104d2e8cce3fd65eee379b5ebeb4c8c4d5c86a25eff1fc1d401e632f35b9d6f51c2685fe215f922d1d8356f6a68ffe86732a521c0d4f0ec2ca481d2b4ab7bfd7862d21fa2b0c038a69d6e6dd9dd2bcdf0075d0dfe7c853e22253f28685fe91eef4d345596484085a5725f48a74de474315ab2f9889f00a38601c7f4414d001371d7726140a3faa5fcdde9843d3d174afb676a86ef0bfb3ce05cf26a493e3f198f48e3343dc74f431c50a9347b941afeea6df2012223175999280520b4d56778b823ae5cdf7d4b61d9a814a6b6aee02e317a29cdf6241a925a0d6d74a859128d4a42041139e220a461641cbc6db2d303c9d5c7c107c0f625996c3e5b8fa78cc9cf92202085b69550998fc99871d5fbc39f801ceb31ccb2a3482624e87bfefbbc78cfb32728db4497ca5a0b3e9e84df7e27d416d422004f802acedd61d8fa885cdd29ae9562f1d532f348cbe48cc108d63a846f6ad58a7a801980102ebd58ae37e35f285eb16b4376bad5158cbca9bcd528448d663c8ee3a618d88a3ee353e1182b3e9a7b923bea92851c90130a7854f79d2f9dd4786f854b2f224417cb6f09da65a30cdbfcef336eab23c3f6744439009d8cfc5f759261e4d948fdc3422fbba4e76cb6a4583aba29f031b2c20469e3a4a519a1c01f906cdadc74c28de43084ad70be7463ca58cda5a5ea872ab6e73d3e1aa5c34eed38c9d15c6fa0617eba8de3c557824977bb35cd39370e885527cc98d534b3af6b1bc0e0d0c65a490242df728888ff824fdbd47b18958ef03638d50b6efdf74ab49460d4396c0c15609fd8f2c55df7c3f78a58dfa0b2666dad076fa7d46e551466966f89a7544a7eacaa4726b34ac7fab1ac62a4bc0cd56e883aed4d8b09be68c8d6248dc70b925b6faeeebcddd2851caef204e3fc0d6d5ab0c3d8d432f992bf0219d6833654850e96546714ca15d1d92e5bccf82402a31dd9102068860774849916513ebe9839bcc2d70d7f5df03a3baceee212d0a28e1921696dd999e2ba93a7eda31742e65db9030ad2f384daa76a7e632294dd77728c840a8c2bb1969c83faa073aecb676acfdf66f7adfcdde448aaa62eb39e47de878ba34c27d660f87e5c8ee4110e4805021db5d2eaca9822882dccc56addcdf90d8ab4bd7f171e2c8907ebba89c62500ec979cebd5802fd934b20ecd285b9bc5a0425bc40ffee523d11554a75de45781aa8c754aa586db9af2436ca8075dcc08001d414f7fc0fe67c492d402a250024766afe5c8e600a82eef14c1d28e61431c31c163fbc667cff3e5dedf4d921bcf54d86fc31e2c33d7d5efadab207dce596e191fe45414c5f53f48982fc20c9014fc8a06e5be488d6d83234a6412a68d5fe9c48f3d9853f025bca00dd9f48a7da3b4dea7e500d9cb8aca8d9446d109b5f07dbd4fed35c3d6f26076e249a8ebdef574f1bcbf968c287e3904f72dd215588b1ea57e919719a963739dcb807bb25bcf9a463cdf7828919e27fecbffc79e778440d567d87ec68353182cdb48b6caf3327346fe3c96c642204671432baff2f866e68692f17ace7f938f30fd2c1a2d02d3403134527c320c91b664579e28f7a4725963bd8868b6cf11c69dba04d053f2484e2ea8e54acff0d19c13a5b6b815dcf2930bd577ca001a3309bf3b588352fe0fbde1169cc4d5e83f3411563d428ee896d8a3198eb5959f35ce98e444e11510b312a7fe078c3dcb2ff6007112155353bd78854a29d7296e8c05a5642c0f13ab717cf4def98c1daf957fb107880925c9fe02fe6baa7f195e078395d7a0ee22e585b294922e2eeb14a9eaaa18ac5bfa8802730dd5a734d408d0ccff0e9bf161297f3d182fef4f33caeea2e12173f9024469a7e16501112d609288e71ea1cc5a879e64c0fb55addc821c47af8961e8f85730e3d54e9f5a44a52c27f938f8092b3cb7b6a064323526ab383d95749618a0b034374bd6a993f546e290027496a6413c36cfe669cad810c177661c312b141df448b388dab24e7db2b98f458b66c284dac6fa589def08257d119109a2ce1794956a61d4e0d06b0665c13b54dd3b48f98cba53dd1a51a17fb4a229b0502063504528d85867a5bcb26a486acd6bf2cbd8fb924aa8c223786c16feb0ccb571f013ae85d136eed7758a00c37b3d35108e767ccdfeba8d0fca8eb91c2042391897c6f1efd310fbc6af3d99913e84be7acad589f8510acc74134fd0fd002f3e2aa80a5baec2edd048362d0b4eb85556da59998df67d72ef45abf1ad47dfb510bf16223740b4e04d8df7ebd386e422c9ff677f5c522e11dfbea041e6407c55789f80f51175bdb9a4e51ac830d2e25b2e0dcef62e4e71f288b3462e8b194c7991671a84187578a8209c39377012512aee6be127495b7e9887abdf7ace93b8468f3e6ef8384eacbe324b7c25b1abe25cf03b32366b371cd28aa8ba57bf4d4ca2b021210e354bd3c77d886641c17bd4f08ebf6713c5d624bdbb7406f15edfaf06d708f86e3201d4afd8b9f1f2ff6b8fef94b29cd51fac9e40ae7c3994b8ea024419a1ccc9a995e936d58574adc0955a146ca3d55225cc7312054314ec2b19570849ac9684351efa37a8ebf59026e40fc553d903e13caf4cf845d0e8e35b07d283af2dc125dec1569c8d845a42bea68bb7120779441422300ddfb68ac6412693521971b6d01e2dd39ec0acd146fe59b021029e8534cbcf0428d63014614142f6149c9fa0ba33d007f83617806fe5f48b1c4ec8e711bef01c91f53ea2cdf9aa552672cd63fb0aef79c53bee97ada6b19f7046194966ab42cb9de63fd1dbd28f6f309e7831bc81ddb3874c2af81bb3b076e55decb5291b5caeb0d548519cc3cdd86d922ccaa852709851c69896acea3e31d7bd1735fb396a1cc5557d88975a956b817722fdbf15a4cc655cc6f9778751939354c870087a3fc393d4c483ea882aed8c2ac1766ddeede949d924d3f4486276a6fe9f81070686c1115a50504dea9024fb830bbd30ba71762288484910a37196b84768d784b8ecc7e63785b17d8f396b23a84727f9bad59a28ba209a708832551929bdfc3d4dbbb3e2e693b2224a83c52a4198124945378a07d0bdb73520199cae05180563a1eec46d2ba0ca18276a4aa491759966d0fbe47513eedec4d220327542744f620078a126f585fdf6de1dc00f752b4e1717b2e1aca0bc840f6df878cf78bb17563ed8018c67adb98ec290a615a20aac8ca4aaafcf5a6fb6e962dab6de4325d042481286b3fe6dd1db367b799d852d780cad93401c48f4af57cdebe3f3d92b89d7f89c26131da0895a06347dd4a152decef4c899e94cd0030296dcc63267b28bbd5b010abd8caacb7f49930a555061a62293a4e7afe84d64e732c5883a4c6db0c623a4ab976544591028a52d10db865549264ff69735b0558cabf1f40f6c2357fdec5661255bb69e2e7ec96efa6f5fcf7f86c77bb7214edd2698c164f939b0dcaf6c15be380478a8e505aa1a0146b4f970cba192089d6e80202a80eddfed2aa0129235f33a8eee25c2a3405fe509a6c494219e4b089fd2ad5e20ce52819899e8ed8f4dfc21852f81819910ab543d5dff47227e216b3f567d0e56d6b5a4baa17dd42d3dd2aa5a62be0d297278d53b98106d80ffa2f7c98c8dbf579b06ae8ce83e16c6805ade4bbc5d4ab27b357bf1110b6ac369dd934171d51af85519b3667c634b70bb074cb27617a453fc246ec0c8eb9d0d3f3d0998cdf07b9688e240d9aff197ec7b8f316cc2afc8a5752497080ac1aa827c3e69ef129acba2eb2390a19a32d83bda5e81f0141f59531b5b065f0375624a343983bd0160896bab060d5e0c864eefb5b1b93d7b83ec1fb13e0348030d630eefaf6741db3d67a3e327b0deb94db780e4f95af01d4ba03ece63861accf94be1bedec1aef0483601e1636d6c6384f953fef7f1ceb336e87a673db54b81d408b5c4ee93db0f521c680e163d9494e57fa65856b62de6d5c02cea1a09847b00ceb36363974b775956c66a3f87db803fbfd1c6eda9a43c9568938f1c45126903f113282b69c0fcc0d5bbda0e2356e87bca4876fe61decaa26c3eaf4d2d86e9ee8bee30763c324e3d2e2512f3ac1535217f1df16b1f2545219e41157923b67d8ffb75430d9d02502fd305b0f085cef2db820dbe41e5441c6fd3c7e2e3bfc7aaa152d5405f1a5ff5b548bd0bc1daa823b8c3e8661f9de6be50241d1d988ad7b98f22566fbb39c6155689e5bf95964658a7669e76ecc3523eb288c7d67ee7266398e9477f5a74dd3192dd98a3308dddbc473bf76182b95611286efd538997de679ab9e13cdb7ecb537b6697ab14f47c7be53dcb719b87295b4be91609277863b2531b7b5fe337ec434fca459fa08ff385b240a1400868c3cae62db30c3532f17009ea192648e6e8c4ea951cdefc3b0520255b3ff820d2badca358c5348c7c35123e2287be9a09178031dd336b83b2eb96b592a5371e0f543fdab182579916c0d59f149e663581c6d9cb74b31e767e3c6639a52bbfa11d7d5a7987815430f765531c8113aa1f838ae27fdd9c1b43d9e0b19a4f6dbb571d133ed2a19918a73228a2add4f60d711770d51db9268a3368bde4963b68a8ca79713ea16d7d5d200f3a516276c1383d49916b4c94eaaf212d776ff1cd880132816d6a20113a1bca85c7895d58f6c9f4c7c869e0477bc00c25b14d2a3ef3308c0130c89fedb2acb92abf26f1872d60642a7cfc82e6bc8e937beead6670f7bf064ad8d7988579d85f59e9e87c0743f62e9825eef52cec84812ebdf23a1bc9d26134348115534040ee241ba4804ea04377f5afa69b56f5bccf7508a86b6d5bb15a48ee055845544e55ebda1ded531dea57369750f83983ca1d6069a336692a35ba57313a451094b0f56f13a5f3167aa88e51378010a6117f145371faa2f71b74a5014343c8d1217326233d92f7fc5f3529ccedd2b1f538476206c12ae76b58bd5d0871414b1968cffa716d0226c94c7d0577e68bbe1f4b8ed5ad0edfed03af0913a09964c4d817e77ac670430caba84ff69d2bee2ec26c85102c83e2e690bc22306d3811e86b2ba361baa0a0a6d8b7d4e98c24b8251f74995a789a87edc3f1ac86c571752228a72ba9538d7b30ebabd01da9e9853ebea86a79215c8f7ace4ca55b935a36058ec656fa783b79482cad41fbbdec877c4b178ab20fd0ffc6788367583c756843e3d62eee325f4c2ab79dbbb77f4510a3fe807badd831ad8e902c6f4edc3d3e86cc78502caf53bbf2a5ae334286b04c3684b9c903e55cfeb0e794981ad1ed1ba1ecd931927c8c34382abaf7eda5998742700d55278523066007690d46f10ccadb250a3a80f28f8f0a3277ad16b5792cf2b419ebfaf1063a72c84b16104e29cf711630b35dad2f9931341607f8be5a83b0cd7d8bee65da111036c28a772bbb821c5dad2747ff35e5100030603b717a351332dc3d5390b0352a7ae2a71d818e1f5c40ae5bceab1c2f2d33b5579eea076f53053984311e28fbaddac459970065a301d7c59da2c7f4c25ffdc33064f7bcb52503d3fac0d2126c5697691f1b153ef5b1f4df48293ceea87719bc843784da7752099b59cedeb5388813474ea0e104d9544d88448e18b639dd0eeadeed4c943d68965886a6435416835af395c40c647d4eda32cbdc2f9d33fc86aba67699431cfff9c74706f774712fa1d625ce0260653b703d14b2f96bb32705436d15a60268b1ec5efa72c30db0aa854932f6eb7b61ca1a793f238fa056c906f4d78df8d7bda33a85160e359d86be8ae190623412b1ef1a191d323964c191f463d02b1d968a8bc6ce74245584fe6615c89f16975d4e37f6dc652e414647eb10d6fd5d9dc818086f460f7cdf8b0ad27744c15cb1eca58d227867f53d4537114506be2adcafbd6d21e1df1d061c3a2b64162fe71ccf1d8099a504f02d09db01854af8edc4082bbdb86f387040371732d6613e587f640f89be26685f88b0a666f14a282757b1dc77e4f7ead08097f262e8dc5e934234a1af6a5e3a3e419631ff2c493a3a0d987c8350518f0bcc363e4bb5b161b4066744ce308a3a2a35f9bfc92caa965da382d945471647b29a868e39648ee27348b261ba76ed15ce03405b6bba0fb1bbad4858c0811ff84cd2231aabe94e02dec4a904e52abf1988af3deafeae74cc1762ee702ccb289fde76eb6023e009a1392b98b3c43d11d018cf972e2e2a394789e95935232051a65b625a4eb7d388d2a90adcbb2b5144b54d035b43ee8c907fcb1d32d9f490cc5e320c155450632118259be85b05359574cf685a23cc3dda6119b73a41702e2a6c595ad8052dae28c6fad2843f9411a49dba8e7e14e5de0921432e935fe47f0f17444e9a5e462eef6b8b47ce70d165ee3bc2fafa80b7cdb33e8a550183cb4eb1cd310fd397ead5739e616f113c3802f26062127b725a425e5b751bf26a7739e5bc52da51a8080f30234ebaf3c6988a13bffa12404d0e9715d966b0836ac5806ba49b22e0292a8be948801fb60200a856c140532457ae63fc50515561078cf0e826f4e30808442a251a2ed4da78b51ef99735a9f71bb9ef1522b3b10d04fe24d430a08bc3d56989dd5cfbc2477ce6fa49a3f462c9d0f6e8e4cb925bf27d106ee0554091b3ae38fd43887503fe5edb60298f8dd6489f0963b548780f82fa324c005196d595bce893191a1df3d26d843563e5775a0b5ee7088f62fc727970f5559cfd9a15f90622e2b112d707cd97d2c88821f8390e4fb32cc5fcd5be4fef49c8ff22a54cfa5f7474bca9ed8622bdb07240849056423e3823cec7f05362752cd21caa971ab02a8dd415441d3cca2565a603c99d0f6d50af56cd0763fb52c72abec78a55dc1e59d4d15bcef57dfb2fe07253edb9c36b6d038f909cbd2ef0c2d9acbb89eef91130ed9e34c8c08e2876ea74f5829d8e2cb8f3bac3688d7c865203fd5299bbd0be6cc738dcee68fbd795ef823eefb95b50e1e667b96e2b7828780955f2d3db2fcdc6cefe326c87dddd1803b0b2c6f66e1defaafb566fb95890edfd0b2b40e0f13f020a1330a0b70a80dcc5c46b5dd75a0b5ee7088f62fc727970f5559cfd9a15f90622e2b112d707cd97d2c88821fa21b34e3c7c2dc8900ef8bca379226c7e089b81574d688324e3c76357564e2a1f58cae971c58b5dbbfa7bbaee7a90cd02823217ab9fbe9e49a89627ce9d9d109101c21cf6a17b66dae14aef550ef6f4a8bdde44087f2f7b2dd81ca62a3527b9676a38faa29451ed102b2044020483a224bc0f87b3fa603329ca9ef916c4bd37ea38d4a72ca9e1ee7bf47de04034491443c63af7f62f78990d9e8a1cffc93661ebeea50de0b062cbe10208152f0b1cbef009f087b8d899c9272212a46011b888fec52bcd9854126944ce9f4abb4493ca2dd320614852c585ff4661009327dcc735c5e808d4081a9680f8c71fea74b42eef8f2d1df50c3f2ac649d18db87660bae9da71e6072e4a4c4b5e959a0df16de4f51cbc2e3204c5349b6f8e9194504fa24c3a8705dc8326871eb365f595dabd9cc098fbd51f5d592fcaf959e53557153e965329b00095c52518a23fca3e02952a0ce9045b0e52116a36fb582d5dad2395b52ca4ba9c60a8069c9f0cf35d871bf528c6ace3b1f825111f5e0ab405d4101ef526936914c43ae2883398f77c4655940ab3a3d7fb6afe4c3ac921232054515269b44f2050b51540f6573df8a7b26928ef74a8a0cb38965f599fec15923c30bdb35ba70600b0287090950a65b844adeae5804f76af84f141dedc3bc466e31d91f899a2fc87db958b76f6b0e70976b38b2ed6191cd3dcf3485ed7469047408d93fa64ddc88ecad1564403841ffa56931d6d8124c43f69f92efb79a838e3e4438bc22812743bc0f17c14b0956c07e7bc76186dec9cc83f9457352b5bbc5a709983684ed2ed7d893c370aa255c29556d8980c0fe46abe1e070e53f24682759e78df27eb325be2329c96af768fc5b7ce16bb267e57ed5c076e4b84007b9b23251df4b161de92a434d3feec70442052eaa6165bd15854afef09e0ce4c73f7a97356c84dc162ea97a5332b892bde7c79ec47c019971cad09925ede1b29a3fce9c701bc6d38dbba4022ce78ef6992f469bbff5fd2e16b4fa9aecef1f59c845a6fa97445a9429cb5f3334894ba2e2b642d2dbbd67bc62b0b68dbba8322179d5de6bc24d336fc40d5e2c96165e11fe781e501e06cf5439cba99378302cb298a50d1eb3deee42baec006d5917405f7539f89a30dfe742a925f40ef6f25ab75ccc48c904be6c1c3e2b4724cd3c33dfdc881f0e4b0fe34cc188364718b4e4588b32471a84e861b6cace0caf1b72f04cc1d7730b28842e5566f90fe12fa029eb77916ce48afddf1b12d0e01d019c605b8891bd68dce1c73e8978dc769e11a973758a7d1358ca15ab25c2c0d78e86e0840873df5990c23df371c0943cdc33fece8ac93a0f55cf60b1927a352da966f4ea60384c046478cfb3d1212984fe9e80d2c1faf13b5720afa2c61230042fcdd1bc7ab113458fdeed0e365c8c1faaa78d7436091a12ac298bf39b98db13db22562ddeef733e45809427cbd871599a113935a5d78dcaff5a40be53ebfc8ef47df2e079a0c7b28ce0294e46a731fbf3e53cd863e7058e8a661c07ec0faf477b2185289071e543839214423bc49608fe84a83a8c88f49824b6676de32a4c292f906e3c8547191bc6a926972f77ff4cb8553d1e2295b0a518f0d2643e5761b6c20a422a1314d190188d7e62a6e4675d20a2e80384defee29c6cecabcd26845bfdb60aa0a1ce01344035fd52ff5bc11d4547ce568b0d9d56de9997355896a5cfc726261bd59d4dd4c9c5c643033b32b8d4d0eb10e9bfdf7fd0bb7f3e582ef94a1c7a6eea281c4bb25a7ef0036890b35dfdb4f82a330e5197a4fcc64743c9d77619e9187b138611929d3366be15e21488541c37d0e11d5b00abe19a67c05afd733024f6f825d44f5cd1436fdc5ee0150fc9756f631a57caf80af853224c360a83b147db97007ce8aaa1199f6c9943813cc9d57af4982d3a7dfd269a74f28dd1da2e18a9b7290626133aade491601a5bde5173c6af6f21cdb5895d0be68d4a748fdf94cb4d83f77b59c525c353d1c34a17e19a755adba43c0392aa634094889d313012877bc37ef08511b69b1f0a099ec145f7857b1413afb715e8a9ddbf65e9ed34c0bc3e121660b9ec3789c56a9f88b33ab922c7d7d38729fa429cb35a131288819777f4507e742d8ac9fcd76502275c39fbf9d8ca1adae35741cd00580b4274330b0429042fddb3b3b372e19e7a7974da5e0d0bc0fda39376d54d1a8dc9f5a4cecc24d6d8b00337a8ce78848a342251dfd99dee994fd06fd8f39423e10a2f4ffe963e10189f66221bb5dbead69b764b8b3616fbfa96b7b5123a5ed276aba2a8eb31a08650b4b5389b73afc7c034b8b972f72f3661fe8c2384398efbe4c2d2fed2753f406deccec210a3d0b52ec07289d49bb64e3a7c2aa4e44f9ea972121d14ddda6ed39bc58da6f52b4726da4d7c2599366448dfc9d524fb5f7e7068ab95e2f155465e29477e39a93cb436d3ce313f3ae63d4928c98da13e8c028fb01607f567c836f24ae97b8e5a461860f3278fe8d099e8b7fc8354dac2239f5983e803ce277c3c723f1dc22e63ba04dfd50e64325512bf310aa7d651a84ec251a05501c646d9fa7e9b009d2a79845dd380c147b45be9888b77ea73f17e4ff8aee167035f5c18a7cd63ad4720d3a6fb688e475f18b70117ee777eb705b212953a9df699476465bf57d86f04c8dfeb53b31dcc91b0d13d5ab9f2325b5c92e1fca42fbfc789c62662921557f5743edd93df2f606080d0e555765e584cadc267b4d116b47b23b88cb655c6d838d50cfba666d2076d934193008a180d12940efb23fca6255e2c8752556b871d727109a66daec0436a9c6f8f421e4a28bfd08a4c4e464f68a93d7abc2e606f679ffb7c69c81f6e52aa14b8ff1bb46248e5d8b63e6ca0b1509a4a657d93a69f58af2f2cd3c98e855eb64732bde879eb230f90abedc277524444d4be4aba763dad8626ecde1beecf78dce0d589b1445de6dc441c2d21a6969526fb69a0a15eb4b6c81e3b332a904e61374db97546ab594d82585b49e0b2f4b2225912faa7730bb2fe9dd7370bedba6bc01bc91fc542604ba0848392da3c3b7ee1ccab47d56591d6d5ed7c75de489a08da09f321a002b0ff9aafa5578fe043834970a86bd72fdedfca57aabee75c3d126e3ac80a3eed3f65776b2f26fe775274d474168df7e5cd52fd64dfaf4a6f36090d1f15011932a7fcf4a044145035c9877e9abf391cc8425742933a385b102e870ce6a251f27f0781a677ed7d4894c886e8e64cc14d3610f78a3d26dc512418448f7542ba8ad2f433bbe0a307315c7aba9e80c7a531c59e0fe233f71211a6bfa92aafa05927bb506875d13ce2eeafe49e3cadc488e23e8d23e859750667c4bb4688f94aeec62ce6fd954d5665768d2cadcce760d590eccd566b4589c5c57261ac2797b9fa171ccc7ffc69ec94a3203241e2893a6aae74cd648368c6d9b0c8fe2e0d0537b361479c8065d8a3f4ec09be1007841068ba3d909c434a6a885619bf3a69e92b80222693edbd01c5a3076384ff24fad106753a98fd04ef0d47779c412eafeed17847757dd6c25505c0a78748e3c7f23e22137117fc35df45a921504b2e15c071fa5da5f79f2f59440ae1d339a1dfa20cdbf46947cba1e6dfaf917c6d20db586ff1af39f301d01d7e8b1570f941bb7e691628949f36e6656d5dbdc12d57457ac0630c72417d909814990ef9002e2d3498831c0eb3b33e3f4218a1872fb0c20216540008252fa35d566fc7e21798e283370f603d71b05704cf37fc85cf5d978f1e7c37ce7955ef65f321aa2e948ab9ac231e03f56a1943c7d86811d1701258c236c0f74a48221790246272205c47371332f2c9ec87d6289e2e5615f81bb346be34ddf36f8522f59c0ed2eac2701e16c839075387079cc6f9cb4393e641f0f618849f6aaba41c50e0aae8485ebadffddd380918c76b4a205a323e1532fa9514c32d0e5fed6ec791d3c9d8921d1e0bb8294eeec10685753e32d0805bd254b25220cdf79048553602d541b64752d777a53d3f80672e07c7072cbd99fe1316b8eecdba6692549e898f7c9b489dbb014d6da751468cc74415d2f2a31fa028603a5d957564b755098677751ff61b0cd722e00e992506d9b04e3ec6cbee7e0135107426c53d0a3d09087dbaf4e0c74994371871abb88b07933d9efe8320f0029ee4c5d422adbee071e0b1eb0d17b87462930bac145f8e5767fe78cd0327428e2f37f7df1757dacc1f614a7aadf86f19aa8b42d7d1a457ffb1b86b2e5e67cc164198030936145a97cd91470a373d9e4f59679748c9b8c9c726eac07c873b7c026373b9cf341104041bf12738897dd4565ece704d57393c32c3b6c05c01d039d3bb484f29fec67c242d3d8a282a33450bf49e9e7eb669ddcc140045fbf5a2f5dc1d4a1c495a6d1fe0871e920f0547a910e42abb54131c63a62aa08a2a19f457e8b576708132f2255de8e6183d99903588ef02cf1bf6803ed4142034b19399ce1db92d4bec0830cd4d8297a0a2f4a6a88b423f042d4a507db34a3f00e111714ed9071dc5866da784f9972a26239cfd31426d362840d6af5843d4e4b0b90cfb8857a411336b7aa3385c95e755ea091347b05a48f792c45baf88fb3144a9a8ee8349b6ac1996823ccdfd64759f37812426e7b208cac4cc0a18451c0f94424ddbfb0ccb5a4fed1ae497eb2c363979bf9d14e08fd758ef29cc84b3c3e00c3c35186d72daadce02e25ca0567f446c578dcd5b41264c14ada7708385df95932b0cbfebd2a7408c16f72f089dbe81f0a39ad9f6df7f114f75a8f544de5b332d5ec5227d976890ae1de48b29821db4f726c73467b6104f8c4539574cc397b1215f51ba7d608df9440e75a4f1e5643f7533c1bcd92ffdbc22c656f14b3f5bb50f35791a38875de50a41e5d8ef3503887112d225a2b240d59a6d5e2a75b16a912c3d5a24dc2e91b018baf6b25ddd82a57eeeb89a87a68716fa1cd78aac8278462d54c8e56b3146ee0fb34bde173bced01563886e4dc6ebc627763086f3b0c1c93f4f0ded40377f799fbc550f2a7f0c7da66e0d192b1cce68bf8870155cba2e0a277a5ed883ebc9bddda851cf89d210d0bc75031b77987117691c2a73bce16f7a71ef45bfd659ae31b663a98e257bb739fb7148d2605b6fbc57eebdca56a08813efe93d5c2e64a4060dbd489a1f13a3c7ff7029cbb8adac35ec1c517950ef7ca115f75c95f6c6ff057b2f75f89d82081b457a6566ff619b0dd7b769dcf96fa7eb8de011ff67e328ec6e4b58f3714c3128e3f6b17c9687aee8eec8b449b93d0a4e56cf7537031f4aa80b994489c8e7d2d5b42f3b0217701db2da62229a27f356ce9e77490cb1f2ac803a5f6e32663fef4817ad5a1517ca82a9b028e024ae4b6b21b4e22a2ba403c3de99db1f4c9a05cba27f55a2ffd5af6b01cd1889f6b213b0b8fe020237c9a8a5bcdca9c6c8e5aa54dc3a7c406c7febcabdbe56868c06c49511478261277ebd403c560c7a68540ff186019b0e78891b36fa4eb96ee9b33dc823f8bc10d708f58d4eecff24cae782fb0eca160c9740b6fdaf628832679962ea24da32d099dad771314ebc01d7fd046b988cd0e5506cc1a3ecfc610e13719042948703517a308a0021f77696de6c0852d837d518cd55566720359fa2aa8ff1304e4cdd5dab6cd54f46a338328974639143acd1b4780af2bbda55ce9d7cfd0895bcbc84b8e18481444c3ce2d1e58255e59ac96d7c72096b44d72c601cccd277bed1f2118d84e540dd12d354dddfce24146ff1c20b5212abfe59b4e190587db587004e35fc7b36427cfa6cc09757fae9032046cb729bbf750c5192802d31f99c9c38cbf2dcd0446dc53e0425037f7e06c6a7b7a930784288d8a002b2be4e0220ff24e862e38cc9aed1d6c7d0b38859d0da68947e71626e5c5ecc23f9beb7281f259f71c91d9a897c8268eea6124b77e69c1ec69665de5af024db1b8c6f5dba6ff7aa7a52c7e9183a7f4e88c02f94a4bfb7ed64e243cb95d6f03f0ad87198d4583dd28c17626432e6e20e8ca67d1afd9a3af394f1ee1368029bcdaebc901b8e0b7d4ce2582952ee9566b98dda18343b7a8f7396b75c09238b43eb32079da03d65b2f3951d7b2c38818aa09d51f7e6258d79d6baf1f193e4f970058c8dedacf1aa3bdf49edffb52532ad753cbd6e2cf5b63ef34ab4974f8634e74b04c049244dc1cecd764dd3697b580d363421d64c6823f5cd38399511dccfa390896882f22afab5f4c9007e25f66be0ac4905cf74aba10f8aa9c23ec35afeed4f4bc60b819d6f5a8eb4ed9694be10fbd95d6dcb5ac2d2f17242c128d1e166678d6cfae7c2da6f6cd46b12351f858933775f46b04d3466e8cfb425cc25ee37c2142c815ad76f56d127d02edeaec6f0e33a3f265e868458eb7c52ae3dcdac2c7dd30e980e17d76e170e4d3c1ab437f57e07d98a47ab9cd5e6b822c41fe0bf3210dcfce19b27a15ea540235ea2ca32f506ca2524c760994841a60929909e5a6df005e9d38f54539d7f9acdb609f6c00d0c4848cfde454581af86496b4c0da560a1ec742234c2d8f689bb9b4324297fa3b9d151c8f78072887e0e30aed957c71c7047f78f6189569392a9e27c547f94966d0e93f53079b41465aa5f524bb3b0308a6c55de2ea233e9b9340b3266eff3d13a3eb9bba4145e080e348fef1f425f1b72ea31fc567c20c74084b2422b0f75b3314ce36b285edb84db985e16a5e6deee695b90a5bdff5c465a88d4c43eac6ff1a27f639500def68f5f2dd1720d3744f4ae85e2632fb5a620d8157d1226470db442c175d427cebdf3c09b2740465753ccb0b900be8b7afa84f7f0c21ccd9bcd2be29fab26eafd250019f4f04413c118116cf375a524346f81c2e18ea391a8bb9c2fa7875634f0d6664a7de334bf51354eaee3800faab276a7a377612d100c5126e4fc7da764f33fff409fb8acc2deb111451d2261d68b62d03722b02b8523556b7aa03be558cc5cdd7dc9c54357ad4db4e95c41b1a1b1dd4fd8a69bf7612ef0da231b80720a60792eb876be549940b268c180717021616f1bfff470d3e33ab232f3087e18010ff8a8b038ca3bdcdef7445eae65ebe3d48a5914ffeaa30dec62425f8817e34f35846bf4184ec54c8c1e318a9ee716485008ff78140692edd7c8d26cf4659345615708e172b8aed1640d2ff22353f17ca871893df0a72a13871dbcad6a1a71abe332690866db5c73034e4e7c6e05067c4e1dee3f436883de93c425ed87cf655d37f5a6c2e0b32b7099ca3aa92506d3290cb7523a5d3f85396518fe418be4898908f3a8741cf5f9071bf81b44f45d7d94eca90e0e8a21803290170b29f49dc98ff14a1b658b061ea47c7d0bf2504f3cce7aa4f31c9f15c1e31eb0adcf5184fbe89d6338b607fbbcce67e6c0e9fcde47abdd9ef36e364385be359c1c3662955a86d7fb6bd132b45351241c9ff03887062954d33ba76e42288974f07f546c8cf6cce29b5e4a4fa2caa14eeb4a021a7ee778cab3372ea521b76bb982911a987bfab6833c900fb67e02797408529bcf94624076a868638c45e738611c4b9ed04cc95b7e985c50c48088bf226527805d00fd17abc1ca9d5e4210d698db4dfda858a24599aff29646e3f6582fffcdff85a69ea6bba061d3c29e78d540718f9e633d1c0b64506d3eb1151854e0eee8aa209a41584a72b14ed17e1fbffbeb22fc5a481de25d10e31a8682fc10d42bdcb4b28e995ab09412b711f9426458a9eee5462c00b1805f0ee85139f3ce60cf9f57e01e1a14714ee28e3a1df96a3fe0eacb1a07b006d82c66747a751374970622f87f1a3ce7f68d1edaef710032769c41f1c6c02d15a5df252fe5debe39064fdbbecc9f3c029b2a7cbd5239752ebcef33230b8d6c2cf2861cf6a2cdf9b00a9810531c77a8ab316f8b7ea93743cc3c6d72ef5f44ab20b769e67a0a2020d82554b7cd352d5fb0c60184062117acee619b2fc7d168cafcb26965a66d2dd3035f0e55f4b465933f0b305f553c39f8f990109289ba4220b086b6d265910dde63189ad5f6a3052d5ccd037cb580556fcb13021bc3c5507a209521d2469e3ac48acdfd731f341b1df39d7682225e44a9cb2091cec6cecc8cbe4b6bd418f4cab4e4f17735b58a8423620445e8148bae31e74e24c3da09fe2f78533299df11154dd18777d0dbe00aa8d560494438b1b300ce313f6a42fc3b2ad97a4d36d314d62a47ce49ac8c8d4040a806b9679be80da9d1412a33d7861a40d8640da700d2b75e5697bfdc0ba25de78f4019461d5cfa8de2efae751a543f2bf5fcfb9662f2ab050cdf82376b49d71b3287ceb6acbc8e045847cad9ca739052e35e89691fb47e4bddfad97177818a3ed657e7edb32d81011b74c98c9bda34643b0cca8c9b0ac0a5531b4fdec8292c59abb5f9900d596be0ec3a73571b93d27ed073d8ea14e2578404d5beca8db2ca8543e5d3fd958d8b756f020b4942fdcb7aac0f552ac3146727ab401e5e63eed5e424d51dc31442c8a863eb339e5950f8ee2ff9a45a1e7ac9828e9dd9b799e21654d18f6ac055879b0915cfa786d2ada04ab6efd4df9a6fdaded3414d6bd7cc2d4a0bb4ccbcba405feced12299ed90441f43bb238439e6b8a0b88925e3682aa088dd3329194de16f35b820ffb7f76b68087ab8f6b5862d517c7a80a768157ee2e9faf8c58f8ca75aa3a8cfd115e7c21c31f5235b34600d3c6898d270382b48abfe02aef58df4cad6867852236e87413f9a18b87f76e1ab2e4f5e7da07b280b8df96385678c0541f39425faf90ea2aa67f10892eace36917b081f02a58ff1c6f976421667e0c878c10be9a40142b25e3f81ee99354403a687190bf602d6b0d9d2f60434fcb6670ce7d682f32f97678f8204120de0c4ce44bb108b0b180930560b6f874a6143e3d1deb2dc46fac7cc9a4a911c227c50c83672e556c7a06de80de4dd8ab5ed11b7e2743508339e106d796753d65e1c7d27dafdb391b2559fc6cea1b38dea8279b1ae01d513ed62dbaada3bcf2369d64d68b172bdfd575bf15c0b535ddc71a9de2aeb61372d856649e911b979b1702094614f7fb4a2ffa3a1dcd8ff736934b49a20d323dcd2e917b0c66dd4a0a4a9195f13d61759d838673bfc30b4ec8ea1b0d07412f39ba710d5ce29d6e72885c57f740e48b2e529c84ffaefbcc3c6605ce5712837c8eef2dbc2403f1c85b8d4f39d7fb1ec7c8a4b6b6a0ee225889eb5d948261622ffdb1d0a13e5d098ea495f5692cc9cb9eecf9f417c24f7f86ff1963c692ccaac3b7ebbf776d4db4ec53b3e4b655aecfc6af58136e575bf844a8daba2f58cea989717ba2a7638209f835a6a526537b35a02d8deb9182898fba25c56d4c76f1a2e16fbc4b956eb464f2c2458fb742318624f138b9017b222e6c31ac72a352b852b023bf20468369cd473c934e5543ca9927827878e443faa11f222d387fa6b31e0c28936e1d78fec30e26cae0f8eaaff71514a72a56cce9b270cb90ece42ab62a8582c889c7aa4b07876e2d48962909bfb929b2592310b4032337d97a95499a1ec53bd42eca7c4ed81adfa1f2d7a010b671a9b79c632c002dd81239d39d28f38665fbf1d451261c5a08a4e88e818d33a09326731b83f7dfdffb84a4fb4aee653b571bc2b11b73015492ffc4c1a6b36518b636b2d60f405abbe789f0ec9f19fc0c1a6071840faa7fd25087e2f0f2efd76ff9ac06fbe668d66c0c8581f2d1280fef8f599f6c3bc9eb7ccf12cd631cb6ad511f989f82221c23c2d90da4bf24315abd211f1a4339f78599892bc5cd83624e5fe39e3bcc5488429f7e1b835e95694f1a6806e5142b1fa0fc63936db31dd76a1586ed0d6e402ec3133a9daf7bb86077b10075118e623267ed75885bae65c178431eb226a80bfa41aca10ebdbb60187a4190a3092c44b04caa0168b48cf467af2d3adc37db9e292e55677610ba4b36a3c511f7118d7e20f51126068d2f3b8a8a686bb9533f21e32c82907ac82c76b6076312fefc78afa09d348a8e51599357b862886c70bda69015653a4e0344d3ac97972ee3a5d3bc06a194ebda9b4f2c8daeb2ca69c46c5eb07a7848e0f93e647e58974433ffdd77781a6eda600e2ae411fe1a7815a4f9518af9afe96fbaf87cb77dea6e8aaec87ace05edd90735da1111cb45091f8721705502949b7651ecffa03240da73fb0bdc16256a21e846e468a5185b8abb4e32fe34eae8893832229a7c30d262d73556ac8bad1bd9e62bf343ca98b71cc568996d077801a671340250daf5818c6cac64f3224a4f321de12f99e7ceeb8d458c688010bd9e713d77eda8e46e06269fd527617e22c786cc93339fd6fcdf872b84d6191b7430f332487d22bc4375b01fc4c5cd150589fe166e56169c0d505e1b14351303aab1a3c0a87603e8586154cf0eaac1ebf83b809df67bfd74e49cc8b86a15d7c7c9138afe5451989da1617969d43037639e95a73aef86f01a4d232b7ffab374f8c25d39f90e412158d28859ca3b2d1cf7ed8c8e76fc8bfb0597518f08ce6f2cbb2106be638cce41d4575414300138b58b254d6000d0eed9451b1effe04f154544cf7f8f1017c86df25f8851d1e18fe13bc08801d8012870436850f26262a8370a92d17bf9a1be22bfcbbba7b27a87aa2793895aec6c8dcd9f600cb5268ae84f155a56cd19a09b63d30b9c97c5fc125dd7ffbeae5e50c5f9378846bf6db22c4e36f88388622a56157d98e0559ea6a88f3620f7d6710c2ec0c65107e940c5693d0607e286ef4e3cb91771fe0cbbce8aa573b5bd4a0c643e5c0d7963dc47acd4fcc906ad15412cfa01d0ce832878d2ad0bab8b3918113347f43c58303b6350f5c3371ec4fc5d2b44f295e9636f01be49c8f4b9f7a8d40604b908a7b0569e4ecace96124047d1747cd5e33b8911efc5ffdf065d32b0507dc7248a5af58a53fc0ba576406c5a613484c9259d8307c6a20a4a97cf860b105d8eee911cc184726bfeecf8dbfd61197240d05c61feeefc5954b85930a3c43a3efad40c18c72ac0630ea01e66e3e9bf7c415385b4156dc28a17bcd87149e6decd6b9dc30ce26203b1be1cd75eab8b89a1b0ab52c42c1c4217f0da414e52620f3787c117ce5baf85d7a96c2401afca1e3af8934d26ae4fe75a24c7e82dd6e8b5123a8b16806a6c5d2b2fff1e877d62e00dc21e92b58d19e6bfdce0fe1750de9d73baa8b0c120f2a493bad3898a64b3b0b9771a82f9d63d6f752bea8972a547fc8f5fc29a98941520592218e6dd13153ac6309d68a66619577766cccb52b8ac7c4422eddcbf105dcbfb1c4d250d95db1aaaba7b8c9cd05d898d248a183b1baf149173ff9e7b86968e545e078e4d4e47aa7c90da137c1314bafe3ae41839f49ea1888672f73c4214cd8b834464350562c57b07c54c5bcdec1b757cced9ac6c605b0f0534a8bf0002fbe8a69619a5a0a227b19f970edb1bee110522b3213ab713b5d692ec0977c4a3a68330fe0de406ab7cf17fec6bd892ae9c2906083d957b3a897b0e2c113f48f2f569069bd0372f3893dd1bd04816c8c4215e11d8ef757288c95e0525c27d48b258c3dec44687f9d843d543a690def6e624c5cb287859c9268949cec7eb1fb33bce4bc8b502d2f4bd24fac02c190bb67bbd2323cde322d4f0e2daf3703dc262d4f17d28fcf767bf7437fd2de5972658ceb08279e5c637fa4659527adfbf86c443314cceaeb67e905983a2aac5fe8b6a6d602d36b91303ca23a01e9346ce634f8efe80b4b72ed4272d9ae1585a931ebdbc40ed0bece6877313940d3d55b635a38ceb4ecb4e86f148b97c58725758c8934bede641eaf4bad111c9b6fc56b2bde3d224ca872284902e3ede3c7b0f5e738d188f44d73175a34f6b48f1d315a7ca799262ee49ecd40fffde1dce8e7fd9b0fa0f196b2d593f584aaf1314157846fd8956e7a8847cdffbbd0398adbae98d34ce616a5b9a9d207e7a92c3e6f968c8a221053de8b9cc73de6d2a11e2788fe2d60ba16cf87d38c6b8e329073f10e72ce111498aa36112459580d2d9462cd239b66d4f6f757ecfcf5ce3a90ea9e4ce038386ab4c3012b443ea1f804f4677072a297b7ae72a8adc60e2a9fc37e837cd617d6e7098c300a2a49e71bacda7477fa8f4bc10d2b6f105d207388bee61cc391f0d1f4e904d51c609ae056ea336f85c19540784a962095264bde445ef8620b275f7d2337656c526afcf042d5e5e035845e4cb50b116ddb8e65ad789991749169061ba4e9e91b7e8e8235d35ad537c25e9d993df1b5077a5e077d0decb15b0c2fe9255146cf2d27332bd6a0360f7527e7cecc556604425a3cd543b7a38d5cb708052f2bcabf4632ab2ddec7f1b8943e8837b02cd4e8134ca73f0191914a6e3d6b5b599f0ff839b0280e6ae78f14b7902dd50c17a01e4ebb16be7f98940f3ca30684d2a752247b94225327ca6ce831694f4cbfc2b7890a70962316553e880868ad691a0a7c7957be3254c4d35592a467230b01531fe47b5e093b09b31a4b84364d6108a6833a678b5f41df12531eb4b607a038270505caea6e6d29da087782c783cae840fe0df9a6c793cca6b0c94914c62184218345cf69b8177e90e083008292273704c963ddb1f40b47be93decd900d880848cfdd58212362d82104154b3fa409275822040c4b42e857ccf435747a82585af93d1566b6875e02bce576c84c80ed440f6f0101a0df7d6b2e491bfcae021a522aa52af579b68f611555b1057d76dcf56418cd80baad13654b95053a236cdb5d594b54c370aeb9658641cd695d85d6c5edca95cb5bc1f02b6c6b70c5ac094f2846125b23aa9e921cf41df66122c1553001934489c524c21147e1ee263eaba541795372695be42c7b33607214c9c667d2fa301b84d238576c3ebab1964358d8efc2d8478f915035f58255736baa8d522126b7035726969214cd8bd514539fa4c1d2de5cc7dcfd2c6b6b2e44500112460862a5359b788bb6a459794a5d0522cbde55a269ed419702b88d4c1a9a8a595fe129555cb0560917dd4281e64b8532efcf7b03c6ef9786414d2eb05896dabc774aad0b66610efebd9a0f4cecf4de5828f99ae369405171253767858b08b7bb76b276cd15b1d28793557ac1952789348dab013447c0e988ef5bc08b9955118eac6699c58e9f2d5dd6e8a83e9151e81ca52e2d6ac778d335ac692cb85f97da5c96fc19d8978fe11441c0e067b16139bdd8c5e50470c7dce772464f35b1192f4ca18c52264378796b6bcc5147a3a250b6e32de69baaad1c9b5eb7f301d4b461b6917444766a289ef7f72ccb97f9af0508c1c09d643eba1f08572814afc5a2003cddd589aa11d1f56636aa48f0937ddb2f9626b8847734e8b4e9e990a1a751332bbb416bfb96bcc60bc6113928b0952166a0954c9b6e1ee6fab0806e3077cc4d836d9be08dd62cf497ff131bb126b377e40d32f64e0318a3a1acbdd180d997d9d6809689e3b76010fe8c96a53062ae9d999ebde4616406f97f4e45dab3624a1c9a667c986635944e1f3a6be81b246ce056664d692fd4bea237afcbf464fed33c2bf935624f19656fde531d5b139f7c6fb4ee467995a79e1ac2e9caee74124c07573029167d86b55f115aa7f462fa318deea089ebca47e999a3906ab861ed71dab177b751e31197ad5bbd5ee6e76464c19480386ee1a40472c2761ac70231a23c2b03e4d721a2fe097f92e77d0ee827f32511d109c66db9cee9cea79ba3ac2aabd9824d19084f38bf01a014942763b16510184cb2ca250519060565543766e4ecb30d2b9bb422f7bced7cbb5682e245eefb45f1353db6cd4ccdc2031231279b7b72e4248b36294e78251a931639f8ace4f6ce48a640b3a469b315bfa85f29ef7d45f0ea7b31679f90f68f6b98a3058c48cd2aeaa9b70d875bcfa84bd8f0c324b6a9846baefa1981ca412d77f5c6ba9234e16b4cdf3180c42eabac4f59fce156684ebe0cfa6c64d744144a25d805e2a4f6c2ac051d47849c3e534edc29aa5e89c6210b096939244fbcb2be6c43b9f7c8619b8f511a1fec6d631eab2b8f0e20dd2a8141900c0d1f89bb2ee95ffb1f132c4a70dde2cbf8f510e3bbc0f18a31dcbc589464b52f0e1381ac0c51dd2f42bfa78027d73c0d9ffa539341e4161b49cdd96905bd26798a0d1fc905c6fac16f2447b1ee48f4e8bb88efb381d8746a4650b952717ff44175132ad8da36feb96bab854ebaf54ab7e5276a753afcdd5dba42dbf423930d197940766b0eee355b5e987517415cb7095ce0c862b4cbe24712c20d67edd47c43a65eb9daed37b3e05677ca15915d7c80f544e500bb46e8d500a6c8bbf6228be0272f6e008be19d8fb4e2d0fe3ce682db538cc3bcb739203bea77323ba647b275f91411904311b4ec891115f89128b5ec7b32b03f43a908365ad573c0e6f8e9f00b80e68882cf57bb40ceaf23018d0bb1e97d9f14a8a49d7c896bbf65b7738da105da63a30597e66b8cda9afc33790f1ba015c3f7610be4e77a5b5e241098abc02a1bf6a75bec80d177cd079812deed2e81b9936ab01ad83cf3720c54b01ca2b5bc37df1907c5d305ca62a6c4d17267e18e0fee77cdb74548402d9a6be7542e337915d77356db47a2c50ff356bbbf9c57738037a12a50d4852a47361349e39267e7c5b8b9580d0d70d9556897e007213e8db8e3976ac80d9e872955d32831517e1cddb6f76e17155ce17ae6ca95c37c461176ef4898052bf8873924db5a98ad45293ef20485d822aec64295fb1aeca322e20ef6d125fdbed744c537c5863170e2407740792dfa980d6e393a82f47e6b9a5e243f67092877230dd4e3be3f955fb96518f9671dfa9efea07054e13a35e31380d0e48da25aa54ab0bd5aceb9cc544a6ecd9427fd42256443b7eeb2475e20ada67fff4005492786ea0faeef7cec371886a0c512bc52d1455d7e0770307bfea5c61b06919c4f3d04ed4f1dfe2f6303fe21b47123b3c0b2ecd0275ffb4a960ab0943c84b2dbf3103c614bf4dfd0f10fb57aeb268d8cca55bc67bfe9ad5fcf3757ba969cb06e6f3eae6ec260e8554c96e535eb11c6d9209ecba9bbf24aee43efc4a40fdc59fd99f78fa2f20b867006f61d11b0d96bdc33a03b2ec37f0b7dc4c5480c418fa45882f65fb7098a2dd230c959538cdfce6ae0314dfe322e4dd6abb195b263ad8d1ea9db3986d3358661178ae7c59c18f571fce0f116405ac6951b3106cf1bf23098289d38e153d9a497fe7f6ae9814d26c2b48274b9df4685aed04bf8e67729a8305ef3c9c583cf72edc20e5685f7404364a37296e3937a78cb2dfac414eaed1cd4e02a4b3f9245e7ccd007de2f7a11e8cd3ec1141f66432364d8cff2208ca05f7e426645e6d23c0c7e701f34c028147425b210df2e79dbd3ddbb768f9a5c2470eaede708a82fb0d7b2bcd5fb26506268f5b85f779b159a42a91cdbbf5c953083eb1a957e33004b82a2eb47417df284ef034d8693ef72a981f12d5d4d47b1b54fe45dfec0c247f6dda69c05e7a0d19b2ed28b129ecde552a2cf2e422307a97d52d5ecdf3da997303d9045afd6ebebc1125be595eb3ed0ccae601c45bd518052e262af1c99dc40bfe7de98054bdbd375c1c3f096857d1a562b860c0b8200b453a8c37e14d99c666e3674d874b355be864442b098f82bfe86b3562a5190c9771c4b761ae829a59a62769fc374b37e483f2cd750143017a0a39b46e14f6b7f5dd736c84a6ae79e6f5d68164ee25abb24e216d18d3fc35177413f577cce091ce78c8d27d0d0fc9a2c89a99f9a5287998079deb712e7119933cfb7f9e3c5156aa0d53b48cb399e9381145fe24a3cada9aed88d9a0a7c0f9719c6ff4a2214031e7c23054ecf3e78112e60de76fa48ac2a75f94b6da946d3848965026318fb51c183708c9ba692434460de17856dee8caea0386fbec6bc78edc20fe738378040ef5d2c51dacc6da01b72d2ee2a66328f587613d5e88313df409429f510603fbe2be0373a9eef99a71ef264998e3301342f9776deb9e74545062c9d010f46bd12b80e068a86146128ab3e5bddc362a7ef4503535f97bc6014a65eda5f174b2d39dd4e33a406a7bbf03674495af7c7f0a886728c8493b34009e5176e4cb846d84f79eb7a51124bf90716964db5c80c6b6169ec81396c5253efdba8ead0e88f029c15f70fdc095b6ba9ffca927fba73c1310b2d5bb1254761c56756e931b49ecb1a175bd7b9cc16ea88072ff3b458d22c03dc366a800b5c49154c36c7e5609356efb0591a8ce2eed2ff64df9cbd6665d2198cddafbfcfcbb25072eeaa0fc3920c71ccef8896aac7e258fbafc612d18d0fb09863b99e40ad45fde72ba796301f6bca992b2b258d5cd608f80b1fc99c0e241371fa017f86055da3dc676a47838c8128dab61dd159c695d3aec9496bff9db8e18fb9c013c498d183168829c8ec5e8499f667d59b43f873065fd2499d055d243e047854858eb5047399ef835d21cc9f716d8e06d03fcb715a4c876735fce03c72b867a8b8ada3fca801224786a820dbd2852cdce87480d08bcbe085902d9711a763832e10eba280e1dfc2942f23c840e14aec81fd26dbe92e2022082e425a18eea0fdbaa7298129a310eebc9715bc1376c335a106810e0f3cf564c30abbf105e1236df8a860ea1ea84308dc227a4239c8cdf2bb7a9f463d230a17d2bf9ddca4b501f034eff8ed61150854194298596a8e8ffe2314b0790a4feb72ee122dc8c163a66544dbe3cd61c094449500422657349103ef39a852404ae3bafae152dc19e4ca146ff9b7b9b089088515986b05dd90f64f0fbfd3b5eaefccdd7b65e1fe103aece1d759ee81fc3d902bf347a13735ce77eea232bf7d1f2fbdd8362dd6a41825319073c6683c5b97c6ac4869a808aa2aeef44a4abd758116fda235ae3183291e2325b636e81033c282fa85e24c4ff40331f36807f0932a6201c66c1e19812781775d1e38229be400f670bb3619ab3200c6fdea274d562dbea92d327c4661d324570cfec4c685cda1276869be5d905b4814995b80345a1d5e6b2dac0f93786d560f2290b522f33b2549a704c05686a2a2371a808fd5aef7f621188602d54c9fe73f2955779d3be6bb32a6a0e4be99ea539575905a2f5e09ca27528da5890846b21c8228e730f48fc6b3a3b197ea43c845afe6fdda776b8a25e081884be6a2dace6f404ff02a141f7454efb8135111e73b5c0ba6c57ae654da8e8d45740d11a7e28af5fe3f94989ee1de7b65a3fc8da83fe154a92920d25d966ecdf3e536133e328c2dcdc4d7d64529fd75a12d4dab7c6bea10d96701688dfd86f726a2a1d58ee0a67a5310b1d91699c21696593358768091f9e9777f1fc9da7ab0a048bcdae345ec671043ce1a6506c236aea72c0ee7be53d388d81ce615c4f3c66a4438da9e5a757c333181cb31adcf1e9a0b5c2eee723f05cf90511a7bbe3070f6aad80f572cad54ca5fd9bbd9852c66a8fd1b4065399221f7282119a9f9f8234d3895dcbc54d99378f8c887cf542e8733902de08f67592dca7815b9ed5a421c513876fb2c87b40233b5a0e872b09aa13e1db23c0645f247515f8b4e4c99bbddf06f8d55012a4fa78938b0bb27eab303d0c4b7c37808bc436253d1791adf5858289b13c4951d2897e49cf73fe16ddcc7695cf0334a0e508a2775369fae8426461281904487e2e1edd619d06c6ab04a3571f57f5e05cf310eff855b4d937561a6280486c6d11116c3485c33eeefccf8d3d2488752283c86a084cdc03d7d59049ffd51fbea0f029834d129f7e98277c44de1438e4283a3439bfde489d6b80f94e69b79cbdaf270415a833f77e7904bdfb13e0c185c2cb8d3b549df5f36c6a6a139b50902648ad5fe4eebdaa313f967612a59f2de1c0444e7190c85bc0344d128a3febf66189fceab14fa052e068cb77f1f9fa07151e4827d686e32c6a0361205c4048cbfb5673dca74077374f89d6b09999ac39fe391863d3ee8c45f6a34724e65174cf25e3db08bc25c1305d140ee0078c5cbc22daf7c8e7b0ae086e8374d23feef8c165db510f6db72fae1c220a34d74df70e00fb7bed90e16490617550328124c925e2f61212dff12aa13d60c2fe8a09a9c5fb796ffae8ae40cdc3f04f20e9068be9f2cc8f11a3be6878ba3956fdf3af2b384143414cbb0ead0919e10bf28330738bca75b0a4deaf53ef92493927ff7d094c64e6e764afecc6f2c8be73e2a89462fe9d05a744f2750bdc51af77ca1e581d0ac873376c2b1c61fe2601b30bda1fd102f1484aae8b8af7188e081d53f49fcd907c0053aaf70db3a6d91f8c7bb8669800f8c8ee33c844cec8aa87439661c92fb5803d51647bdb6a09033b8c24d5cc11f2f8cfdf5b228ac58c3b63752562bec9fdb81e5e071e5e70a54009e2f104ea39278ee61546f27f6e33aff95f93bddaaafa3bc46a2bf42eda6b149f21ae617e9fe914417d82b71bc83bee3f12adbecd61565186d9d2b7297f1e8ba2ecb880b814a339a54c6c070e7754af069615430e06784a5a171bb8ce1ee5ce5c71330b6c8f1a44687db02b8326150a89990c6407a1fe15ec3984be367ecaf48520f3b5beb30061db9e7401aef5dab9354941532907084efca7ef6b75053d5b7403abc456ca3b5e7935dca82958041c39bba0ae1f5f7ebaf9ad95eee4e8b95ad9caaf6cb74c368f77f55671a8557da777d6461eda7c41f6d8078c6d30a84d51ebb8b046b1f33c525aaa1687839b3dd18758fd512e846fdb63517b7372cb6c2fdab323b6ea2bff06077e6291c8cfb273cd3a4f8cd734193db54e588a7902c34a216bc696220e762400d44a8d5b7bd2fffda4482595895991b946a5af12836e0e14bf9e82674578680d0cb1d41b17c4f961d942304128161f003852d2d128c1366baab87cabe29b147d7a1a2af6d8b4efdafae6a4489f5f68cd68f9318620abfeaebafe9b75a17ed01ff92e08fc12380ddd67f2d0afca0d123ffa6b4e89b0eb7ee3b2abd081a0fb3322e670e2cd0861904158dea861ac23d4d230db05d31418a2d6e06e144febe65ab6daa2c8b0f87563eba183c66e059a5d814be73098ef330fc9cb424379a90ad0de30d7918cf71c27b1eb7383ded1407fcf71dd02c8f2582e0b2a7a1eb81b758646192bdd70ea925a6547c517d3a3604062d0615f8714637a3116ca5e65dde6f65c04d010c00b30105c97c4aa034b2be4dd99449a5b1b7bbeb9002c81e4c498c6222e3b887708e3ffb752e126693f58c23ab3feac8648cb285e8f08c8e66a136f86bfd2150aa0432d70d118ba4094ad2820aa7c35f03f662abed5fbc8d06152e17407920d50db061cdb3e4e4c6eae152beb01bcbca2bbff74a9defcaec39b46f8e1a3b4a158aa24c4b3f61a15418088365fc0407978e80e19c8cc24d845446a2249c5be2a5dd1bd5632275352cbb7995613aec10345789a4d37380a34ecfd24c47b6493ffc3c37931f5e4b6f9076231d578dc9775a1742b478330fccb64a3005225bee45855c9211564e55c0a6c33fce96a8fee7e0c2762670a30a9f19fd6c415e222cea010bed644730bd49a1375011c299568b1c81781951a28a5c86800b655abdc8735cebbaaeba2c27798a7576f9e1c60bfac979d279805610bcc14130329442c12b928c28f4ddbaa76b0321af3e6f01ed1f78af42baf59d29c72bea8a52e4a6856fe11d85d16eb586baaa36f27c5f328420c45a5415779c15e3c76b710df8f5ee38185da60125a5f3f95b6da01754c6f4a5c6a726e9b3213032649e23496f7d2e0d09d0fd31c3a449228e12956200a3e7b97bed58101c24a2b6fd1ba7c9e043ade50c533d1ace1bc8952fffe26202584f085ba22eb23339b719fedb80edfc5f5ae740619cebf7c4eddd1a900fadab0e93ea6c83cd9731b838ae30e9648e7c9a23d2f66e9bb86fcb2978ce7d6153e7c61e1469545a8e0277f04096e49f2005f8a3e276b7fade2c138f4e9f6840fc268ec24ad2ddb63e087f49a407286e259ab07480120820795cb44253883ec60e7e7e77c676b55e1736ca2a05af3984ae395c8a7ce03b281aa62a0fa6fa321422b7898840c45532c3941e2c815ea977e9547147facec48147416ae745d6895e3d4fd638c7e5456f9a40abcb1a53320081d9b95d912a7a1ca08a657d8873d2cd6db3a628de8a2679432a63b0a7b8e99b97878dbadea22695fc45ec393b727a312d1516c73c209a55db7cd89e8b9426e9966a0fde699d43a70935cf7a5f77ce532e116e7434441111ddf38ad7931743995f3ba901bbc99c07cb09c0a52edc9cae86bf54f0972ecede4caad5a13223dc46ec05120d43754b7c84abcd477bf9a85bb1b8526cf97d20ada375a061626c2453e8f56d077ed6875229b52c363f8b0df8a055c1523bc974a03e6401fd59d5f8958dddd218bd3a81c6017614dfd70093141332ee1eeca3bcfc5a60ecd87ccd4ac605961ec8b1679080c15625ed2a7b646e5c933efc6d34435baf67c5f1f1b76f6d7a236cc7de5b6595271c0165a9485582bc4065826f830e04cc72921f07e7d425a7d8e4bd421089f7ecbc04482a1e7f31daea8838dd37b2d78a4d8c371663070674a654e50930b8d5cb004c4c1a9f4f1357b51d4274055463b2bc3efabac6a76c98e6467c2974bbeb6702e98a555d94f6c7de45bc0f71e882a6ed6da6e55f306d520fc6d428789331acba401b2a37994210bc98efd23851137d5d3c717e7df52a8f41a8ebb799a294918203a633fd953b2e31929448912859c96c47eb1286ac4c1fc82ec2ccbe26232043acd546ec44ab360efd7f122fe8b99d1c3c18da7a9ae8bca6c658e274089040c10db75c914b5a3f5fe414236d4320087bb690b4c11de67b3a926a14bf7213400ab345cd55d556585313d7c0fe4e6f48313d022424c25fbbc32ae21a9d15e1c04db15159ba42525ea331eea6247bc7a3bbac38780a14456fcb48e65d8489b3891a7d39cf2c5d3418aae482966d33382dc3e044fcf2e954a3ed00d2f99eb2d60a2b5835407391b4adbad0bf723e59fa8998ac393e12bd25969fdbfd5ae50f5e895435768051f5a107b7dc1a22775565274523be73a8f4031ff60e2a5a76f5a385b03445dde9c6e1ca134d0163fe64ca93dd5e46f7104449b733c8e7504c601e889b5465b53a4c473c2dce83d9a1471115cebb08ab966ca65a71c7109df25f762c7a7c9d77983f1b865c212280fa43fb03aaf73bdf5a61b31fa6393439d118148045e80067b352063a216cb7c1d7c294f7a51199f1e2a05a988c9480d227940b75bfeb6d682b72854e1d56b7af4fcbe73b33437a3a6e190f11daa147abd63abe6b444977144101b771f52a3f8a57ce0cade6056aaf6b526dc2130869c59b98443f60644e268c884504f19122c35a676c273b7260e627b913a70ea907e0062934c29e44ebc33666eb600afd91f37bfd91f2be44e77fb9503db3031a3610e6d620f541c421ed576933e1d8d30487a01a0ed99b6b21be6930798e8cf5b1e62c9abb7c6255bd502706142ca40ea614d7c395680567fdf740b517be27bb1c925793ce783d31b7f78536db078a4a9f62fec66f201a97f8c54296091417233918673bb813f6ba71951443785fa504062143b3262e273a23b28c3ac9043c9b87dd21bd64afff13afa969c7aecfeb7565a5a8a74615b28f2209c54892782ab46135a872a24e9feb2d298fff2be29ba0370eb89a821076ace7aca0bfcee2844aa1d7b3bc28e9cc97f15ec9bc7bbb08b312d8f82a6d32c6fc83c08931c960702252b86b07957d3f39806a426ce313d51569a3236d04ae24c588b91231c050c832f22f3af704fd4030d176deddbe081cbe92893d804185b8f589f37d72d50413e55e0c264956a39ff4d6dd4f79678de023a1127513bb51a13c8758c4c5e8c21b7c4fd3d00f23de4ba2a117e7575524b384687a5bd66953cff4098625c05f63b6d04e642e6bebe78c0ad8853da6481b83f937a02008fa8ac50400d28164bd1eab5707069d70e6d59753ca42f66b9fc8353243527b95ead48dd6076f16a9b9dc4688cafe0bb5d0889abc7df9a026500ef99880d52e9110ad503ec91397cacd0ea27bf15be1613e9725b58df3bda8bccb84814a5b4832359009db9d664f4f50d281ec8491be175f9ce63e50a88a6f3dacf31a30440976e9c69ef51f778c91a80ffe3a281521a7fcdcb1a32a6edfaea0f80c3622d1cc6f2cd5fd64c6aacfcac0862c63155742bcd8181ad8148f793574d138a001b78d2968ab9e1f01c84cd664df93d2d2bd4c8b63a64a0703c61a4ec0f55e930ae78e478226cd8d572a63fab92ab68171c2b065266defe9f5896ea20b47a41aa064d7bdd3d9bf34a1dbc4825e9ad011a21360c1c8e2a2b9905892f873011d1e77d2c95ac4e348814ef6d83d8f4d2db046df5a080ac09c7a456f1f94a1c7ad7864f4a0bdb6cae76c3ba1b47320fef96a7bdfb5ab3954a9986c33623f899b1728b5346ad081847e57e1d1c075a6a4dccdcf394bd36c37cd8bb6a0735e54ea44d234c36103a004e0e068ea4a87d7e0a1eb3ce96c7016ec1553b20be368c108a2174883f7e6a0d0dbb0cee21a8b151ea83e865881149db17aad01f55fc9c6b550be85318bc665dfdafb5c9919fb7c61b0fdd9400217a8a2cc99aed6791b61abc34e1f8cb00344f2bd83980bc9eeb4302117339d714d83909f13eb658bf815488444a759fe487eeaf99de615c8b4d3a2dd0ba3b5bd7a6d6b31d2a080fdda5e840f985b26e7fe4728bee7964845cfe58213d9319d44f8d10630a4cd2d1d993a6309820917732a9f207c38fcb92051ccc09c6fb9b34f1cc8eebd39edb8bb968c9211d4a3854f6a18d2c005cb82d06f3b8cbc4f03eefaf70a7d4f18d5633d6bd00fa38e2113abaefb8be19dbc48b41a49f07423afbc2831f5a105d5fb32743808beee9b78c3f330cfbab2a21170b3975bff68a4bc7b927ce6d274bfd24626611d667ff38ac4a51efe63a3e6621e1f0380cd57a0716d063aa9dd5f262201875b21945fd35d50b7512ca5ad8f6afe2c30dafcc5c4522e2b153ce846d9d31d09fb47ab6bc5546ab854f9e6472619ed7de8d71498ab722b88d61c07b7d8ad8c0d3debebbda9f5e2041db0cd20c34c8acddb1fa89a4ad7e1e0f4a77494b22279ff2b67abf9ddc882305a48c45cbf9be9f636f968c6b3ca8b3baa72eac849b654d244e987148695a591e541fd6e00722e49e53a18214e5a8e395151751a7067105e3c9e19be58f5c465b64260c8272c943b1c7d1738a7519a9c213236d520459799a0ff7f3d3181f06ea505ce7a3830b37e619efdbd7058a3089a08dac461a88fc24b2f03ba63cfddfb7915c2dba8bfdf5579ec2a383143f500070b38a9df5435c7eda74739a71cb0bc6eb983921b3d4f65608faf4f4ba0b72dc41ca82b8b138090684bd7623571a9422e3b0589fc287e817ca988418b1cda571852ba2816b47cddfd831be678a195d027fb5cfc164ce991f8833832d5117af2b321e7d1af9631c4e665417ef82c202813bc4ea10bbe1d277bfc637b9e7ac27ef29aa4894a36c4c0f20f1e0fd7d797823d41485a4e893cfd00a8c899f8f78b832b3232ad24f156ba76e2bf87f10915abb706d00060b50fad52a951c11b483bd2a4d12c0650cf7188935fc46918df07292f01cf5f85c29680d7b4bbbf350e8d6699e7d91d2efdc9f95567b48d192379c23dca5f16d9ebef122299cdfd9c2a47c6a64a7e00800ccf1ebe179ec9bdfb04f6444fb53440498076f42303fe94eb98c1a3c4885dc58aa0133ed5fc62d10cf9c592b4f479737b6355cc3806985a4ea82643c202017b8b654fc39be24637bef5e06b0366c1e62d32405b92e5b24138d56ae920e40f4817ba65e38551832daa2f7a4d625d8a8e9505bd597ef6f8a7cd05d6b9bfa3073b731eb414b5a78845e5f8baabedca8228b2b3b7af1acac2713dc64316dfb2b3136d1fc969c0d2fd9f10ff68fc51e93bbff9436b7cb71b962231b05c3486ddd6c641cc973cd82ac242fb4f3927f681860e689793db41cebd247fe8a2fdc4400544a37543f32174815e7db037919e1d8fccdde5c1c753b536eff6666b0714c775b4c8a4ce69c41516dcb8ceafa55ca6467f28ac5f4049e0701dbfb0116b297280017f71165ec9e201a9a1ad26b8381a2731599081c4f6d3f5f0d8dc715de461ec3662aaa744b3cfcedc69324523b8c82cddefb7964a41ebf9e9cd4094203045a4d8fd2120b96124b9985e40ea20f15bd591c876a9b74e0ee03e7e717d8490ecbcdfa6323d238771a14c5be4fceef09fadf15a23e7b9874bd19f822edd4ab22cd13e54906873860a41d63ec6e262e29f70a284be5d4652b1690e5c9cbdc175b8dbb1510c9a776cd3bafa6f4e965e01ff083309af8b7080d2f67920c87f6748dbd1c468d96243c74ca38e28ced116348926f9235a911694d1fb960b5c4642e3326b5742bdfb8e3da29a897df6953cf6f214e9758662eddd7e7904530e087e57fa01e2e1f906101db1740dd7c7e7b935974fecbdd46e3dfad688e48b3f16daa9d45aac293d2779a5a1ca5040c92d674f7a6b339c28e51f5e47ea5c05237a1dd2efa96f805983dd3a1c67a79d0adac68eb9e4bb61a77358c783d9d03b1ab66cfcbd9fec72330ece19156e381815407ea43eee2c992de60446a4d00f08cc1d4b0dcb8f5dc6e47f17b7d8f1868f6f3d9aaad4a4428c36ddc6b96d13d7a8139f98ca84549af6df4fd3534e93e3f20354e002108cfbaa381faf21f18e04d2789bedb956832172b92808d3b6666722780d70389a7693e46930a481711fe4859fd2518def9e60819099941254198a61b69df9b5f7150e048bc118242b96812fdd5f025dbc5acdc694777a7b800cb12e48f3ad3c1f0e9f3d3c8553894ec8aff03f4c54779a8c1d1cf9287860bd5a45a18a36ee7c22f63444062ea8e4e8c1737295e8cb92b3965caa9c7f9ce5af54d3fb182a54e2d39f374f3f5c6c70bf8228bada8ac7e0b5ffb35dc6beee023ab7efac3de2fd68d8259af707069ca8da3527df3eff7bcb8b5bceb5b8444423514d873ff9f034fd7067875e360ac5cc61db4ef07887f7c2ac71eafa41f980d48e18ac7f066d8679403a1ee8aaf0446dde8dffc67e7616f4813c6ec2e9afb52a177c99e75beb1a877ca53b691108c58fee9404e78ef9344f41c1e42da6333bdc39507948588521c1319f8efc95352d042302de32206015bcc151f69951697d7d910756f6acf33dc2ba1215f4d1001fadd05f7534efa11cb6ac38ab673048bd3bea60ffe89b2f36c98b61a0dd22e26018c35f4c1749c1ba7e1cc2ad43367be63856a6b763ecda11fe56a1bd2a0cd5b4727a0a9e4da141810f104762daeb33056f4a574c629e6be09e269b7d300f2e20837b7193f6130a199f7f2e4ebe3d764fc849629fe308873db60d7d328613208dc4f3f8c22344257e29721b251eeb35c3e851c935536bd75f78670db534a7010c2d06bd481a7b4b2aae3c7c53f0ce32ffc7c118f2091b3caf5a3bc3c192d36cfd91a7b76924a01a7dd90beb6836043e8349d0f21d582582d05d1a68320f88ef347980bead2bdee903f00125c2f5d8dc972f75ac0d135f6d1abb9960eb8f7dc9935b88a1bf81941bcf92bf7ce5d7647127f71ec5ca6f7beafe8b1782d0c4d4efdaa0fe185b045197934963a11bbd120b4ea3f51cbd9892f4a2c1d44921f91f1fab2a18432dd954dfeaa19eed03de6bca498dced128810978a6a8e25e52e001bd3ad4567e16fa7fee40fccd86f5db60d4487dd8c8621cf9140b428872cd47910f664131a231e5dc99c5f0b1d87c6bcbcc533e3e16531e24dd1bdb9965ba47c6b6244cc4a87ac5786daf896c2df2ef1404f434629f099ac39fec7d67310af7eb50cdaca4a3f4316ebe51ad7dfe9f376415e572646aefa66f933433bca31f53a0f3afdda28d8570599d34e706848d4bc914914c2c09e6a77dda1af491ae3e571044ed6e027b36c6f2e472fdfd4aa6a32cab66bcd49e8941eb2ec73e0b7cba8719a26b45d514f9dd19d10c97a80f901c684964c375d854d09649690927a3663d2b09383a26b3e9a793557e9c0aee266d271606b78e7b3e290c064afcca25187ddc8e8fde460ba79d45547c96d45104bd56fdd33095d33ecf16d2737a57b223fd3079ae3da3d89c377a20c919903c1affd0d64d920b4b47ff70cab2bc2fab7b6ef9e06a3cfa0a95b5c552f7756d5c14de8e2d2318cd80ad3f9f64dc42af1996f9b55e9232d3325dfeb8b4a50aa6143a41b2b8e290c7c28920df9156fe3ebab6e847ea451316175349bfa6f38ee302ac8e92a3f7a1ee987af386a837b7e716c2d34e3558eb89d22792099879e1b9c2dc60478c6731ed23a96a8e8052b0541a59528900d779f9454d5cd55ebb5b49fcfb7bad55b25a0aa31201145e0b6754c949144ebc8f4b21cbb14d906d2a5d22912710b819b73cdc1d7e6ed0df73962ef4d264e3db8511c5d1f30ae334473f00b71115715beee2bffa0ce5181d7d1996d9de3258dcc8ed33ce84fc1b51b758eecba61ec607023e8396cee5669fd6badc1737ac4cab2c3af90c8436794a8c275f502b21fc49a68b9ecd7071933d4353e465c7540094fe6ec7bdec45da37deba7edee2c73e58f5f19cbae57d2c5a10d1fe8e1b7afb9fc3b15b023aa7a3f035af1ad7d2c2e62951e917e4c86268d14b53530f8d5945d7e91074065eb60d932b67bd98f6063e803aed8973aef536efdcce79ea9c360e58a87ef6827c8f4a3a128b34005ad01d2c8e3e4e11280ce28923a12e08e55a423bb5c00a3c2d11756384bdb61530ae52f270d54b1fb76a3cc5fd37caf025a420422ef0a0b74c0e2ae241aa9303f90c561b3c5ef631197185d03df09e56b448d71eaa30682074963343ae5a8e320051f5fcacb2ad4faa90c2fe3f498f9fb9145cca5bc950882d233a16dd55dd50dc45c5f8e09ad87204726cc9d16be1c23088165567fe811eafcde0b8a175bed200bc3685e25daf37ded02b6ed604ae1bf4a12d8261b8b3f2d31e3ff4e69843af7081e21e40b2eb336b1d4e83da2fa799c54884eb38a94426232978616f3c978c1acb87bc70b945a507becd68637ca19064f46693ead41f54e32046a00ce9b78d4db3efd132e3eacedd0752a6557692a797d5ce6a5dbb346717500cd82ed2ced95f437b8e322b4d9fc1c2f19b5e43b3d3fffcf06d6b67be2925ac162a994b86b8438693bc64cd2c6e5c13ed29cf00faa955d26b41c476e91f0996a34f422265a54787551e1c0eb392f73820843ca21d00aec12e8b380e351802f2692590aed6f19ebe175d3de0ffae2d964d182666b0d97dcd179f994d091741bb86d392aa723c8710f14dedc4330a148b0ffeec5553a925374a391e783d80ea956e533438f6d2a2c65de4f0477932fa2dad23647cd908df242dcf9bbdea0fe9374024be135dc773500073e88d8d57c9a40e67d428fb7cd3e2771cd64da80f336684daf6e1f6cbad4bf829294fec373611db9f9ef06ed588d85009e9b1b02300fd6aca3c4a8c3f1c6f2ceaba66c28f1e070e8de112ad7e026646034089b86dcd195b7421dd276e96ae93af32fe3e95831fbe1d65f8bafa5c93399c7a3c9919995e57883211250512f8794149d9b177c3558545ab9e872b26673dcc5202d0c717df535361ccd3bd4438824af4b810176675a5266f96058bcb1944a7f25d03f3fb65c47b411c3a3ef31c596a081e20bd74db8cf58b9e8eab28205d1bdeb139f87b88aeb00c76e8e1f07f44abb1206bd7bf3cd4eb85e287b3489b7d368698782d3185eb9fff5ca2de6a617a98088cea0f202b74cc85e05958e0b2b0426838cda03f9c1a68aa0546adc71d6199db3f28679a9f14c851e8abc2d94dce103079c7871e4ab5c39bbc3dc8802b927c0d44cb664476a8ef87cfc7c3751b6e562f6e7a158525eabebf925df9ea12babb7de8c86ad721629755bf4747da6339759d9ee6d5a6e87ae8c2fc7490b3be210acb6a2ddf5cc6914a70af7570d0b90912c60dac3c0f9f3316e49d638406e5725d61711646a3ec3e020f3bfe34665be714f85a54b753beef5ccaa0fd4f56bc6c3bc0486ef151a9b45063e7d8f56893189b79aed9c8b9a41176ed6c8c7a7d1798aa8747dce407731a7636dbbabc7a14d65fb662be6c83d6e5a77b285d01a5abf728b1db776d77919e424cb13970e987d0020e91616185b3173d58cfc3ab8d9fc06ece30f01b7cf3365e212381bf546dd6002bec1eac35a6780c76149a0ae99ca79226d3dd5a8f2d5134698b786fd022fe7d35f48ce5ee610ce8af931debbf1560e6c412d2cc4e82848cac207b48aa07463a30cd8b36948b713074105529dd282887a061e1a6eaca762f353386a874d8ed5f14134b0d7d4c927471879ddd6723e119b6fa2e0e4a35d415252aa7f42228584739c8b6e5ae1418f45ba2eaac00e153b7511ba092bae514879b62f5a51958bfbcc470c4d8253141efd9246981e5e87f3914af84e23c6bdb2ec137f1843cf918ab5e983991711f32ad825be3e2362623e26fa57d61d7ef726e362823a7363c1340aa839cf1b1c6928cc2927aa303446d7df6c72bd30187360bf744099cc637af680a047d6ae74f095d69835f177694d43c692cd5da2cebe4b1728062fe67b666985a1e33b7775df96fcda7751e39c2dee2c7482186f8b6a276c748054fa555be1d266ef6241adc762aa7526a69adc2c7998a13d54a97384755c9e0f1f29a82fe756f1959e77a94ea3afbccb3b71d0ee983288a11bebcc0b0cf2eb46cff30df4e0068fee64d52694c35c714cd00425296d5e186246d7bbe4a4aed25373dbb9ac0d25aacde597061ea5e4458d74ebce2343d974053fcf8ee5a450dec29ee0a3dbfb1eadee133cd36b2ef458f745bafb3dc231dbe36afce1abe9162beba0f15f30e5f0b64a9af523c99eebe188af207eacf5fa445e8fdad4e8161fe132db89373e900581722c9d418b274526a9c8176a0deb28498abb5d31d4dd8c9b91f32f541749563491ae697d00bf97b1b87ab7ab6e4c2a5f47323605cdf64214dc072b53d2f65053982ec484a0bbbdf967a54f4f0a0c44d3dddeb0c1e0de98a7e7c1e7e636aa11a9ef680a03b5a978dfa88a11773d3a416cd728df2e05f8099a6bfa9dc32cdb59efc130192619c693f8dfcca5ee9f9b7931ed65d933ff357ae88a03c0f6f033469f620a637eec2ed3ab47a6b008ded155d0c4b394934cf416577014ba2104d2860052bd3d909ea3f25bbbd67e8770d5bd0f9f2caabb43dd65891882233f86096b5c232f089018a4dbecc490c602efda3dfbaab42d82a08a463e823c09754ed710ea4ae64f2fe84cf384779a69e392249ec38f1f53967a5c5e4d45426865e143170a9d7e6270fb2fd370387df768319cb4a290f71b7e76a1d7fbac87ee690dd3d2fbf2b4edd92a4d91017006d5d6eec332771428a3ed4ba4600b89a84f0a830efd22c8ce01bbdf6dbdeb801c284f502ffa10ad2f42a9291faea04e45e4b147808c4891cbad6f9955b1298b35523eb5953d376edb2e01614f25843210caa9b94c5c21f33cf45ce8fc4cea016cb8e809ae66b0fc1f35d1c4d1882d3f3c4832c11566928f2baf47d4ba8a7251ad6bea8e76e2ca47f2d34d916e23ca6c4ad0416084290ec688f81040e3415ece9b871f5c2c3da80f7f32b0968bd2ea094fc23bb7f087e0afdf92bad20c51b281056e076b095581e5b0f960dccb6471e5372207b72237b10712e078af204bfb97e0b854ee2890b26ffb20ff6850178160a8eab55ee9f623076bd0cfa804268164e5065d553a19731259343e3dd3638fe95a51f64fa9526eca489e9a534c57a56db919c893adefe4469e7143062a3aba5e981b23f5bd94b164160814ae3a5f07b1f82e34f0ad4bd5eb2cffe1df034c8e3bf476532983e84314953906703065220a3213374343023f22e36ea574663b61297abd6367f7e9a35c959b2ae569f51af783f8744e720f72db5df12f6356bfa0ebe343d72595a0bdcfee4d85601ec4c2d9eeafe72c00a27d40918b2fed6e8dd7fd6934690646607f06cfbb35eb45ee7ae993746bd0afaf49c05fdd099c632fa35aec8166d51a121289c9c4f24fb12c6c892b207f325a3a8b4ccb2b68005a3800d76eeeb470c3e6f90a186a98d01cd245d184a5a06cfa1b28be844230dc21614d86fba0f1904621c8ac969495f67e69a5005198875b307d6f4b7597bb306cba2197c93600f0171c325a71ec93cfe2a5962f6e552eb4bd1a8e52df0845594039f572f3b996de6e69ad73282fcd9930e727ba5ae0ed970fb1ae13c3fc7bb504c790b2fe02ade67bbf2e9affb0f5acb1456e2f582221f071979e45fcb5104df73fd397fd42dc89fd3c0bc0fee63c7196ba149a59b51f1a1e7735b86d9086e368068208476b95d8c9ddc1d0eeb0fa212616b666db42a8033397ff30c8622172f075a04cd937dda8ab880b10fd3fd603788c24772c4c1ead7314a341deb1ba8a5cace2ad1755909e4d63c2bde4c944d5b2157e62f30282c579a10f907e7bd9fdc5d5c3601675ef2f516153b20501fd57b3d29f038b1a3c66652b4ce2f2d7df4b076a96b481cf452a1fe729fe347b9891df594eb6b760afb11104d5bae64584ac0ddaa3917da7515c22a9104c362f0536492e6b0b00cbae9aeafe7babf43e9f177a9a5a0e0031ee97a5e00ba4abf1caab24aa6a9ed4e743174ab0e953cebe056d33761e3e4f127193da16839615c3aa465d787bcd31b773e7cef43d6fdef07d7eb12065940dfb52a8a20a068c3e6749e087b2042ac70dbf508a5c27aad60ff8b24f3d262aedbdfbb26521a729fd687ffe5bf67e49239fefb4d3e889446057e60b9238a0d3db3ea06bbb41912140a1bbda78ce4d66f3fb127a04699b87bc5db1d7bc58444166e025ff061b7f6a721feff76161ef5acfc930162a9dea281218b50cdbec6e3733e550a0544423b89c6a0f998db9fb0d14db6bb569ab83c570128b9cd3c1f36739d6e9d4750a896be69d8f62957c2e9d582b2cd2deffc3562b92138d9253b6247663842b2663d8082e87b682bbfb523b0511ae93ebe7d74798ad04a49b4cb9c258340b0dd7c68cecfb8bd6dff3d5c5f0d9505267fbea89f53920964d377ffc5bca50a609233e04f2cf8e7289ea69bc3c2e0706861e981908d46e343c28d2a02d3fcdbe7621a653b1fc8ca79facbb8574d118a567e3be69083f08753985799a6ad22beb02ad5a687994a5e411f2d3fb03b4d4525953a950fe9187e9cc29be95b60adef77cff31de5c74c74e8561e32e60ff2709583d97347ed52475f0fd69dd934c61e35e1b37be226ab54d35d42bb18165dbc936ac79f492821963e3067815c36f2c549a1eda6eed6b2d5104c44b25b8e7568f583123689b9e16c1fe4c021cac815e9befd77847416fc4383887000b6cde92be40cae73c2a2cfd1974960bb7d0d46ed135c97472c32873ecad6eb80a5e843f35fd45614d646e4e038b8976ddafdec3aa57570e9a95e1d25f3110fd5012dea710b9187b2a271d6623f4a1252daf605cc2296914262cc8d41b8544f2a0a713fa56bd041cf94190b21566c112cd585bda14b611c568659dad79186c4873acf1ba944696c799be3b29223be1b4415f1aed63d70650ae7b87abce5ee3e86f3726c3ebad1020f6695b7170e2600c529a1c105c0ffcce06592137484108069aa13f338beee536d84ec64a7adcc0cdc1935a1210276fdf589281771ac8dce5f430b205b4089fa09024b6a7c55f498757a53bbb4b39673bae22f39442b10b64b18d2d5fac9a20470d73db48163ad21be8e343e422fc7139db8e992731fb45ad55960f71bbf91b4f298bff5df253ec40b25d56cb06d477f7a43cc12772e53c2eba98290de24b5590ef7738685bdccbe55f6b63c017e6a9658f8e5ce4e76a8e4afbfdbbed7b2d52cd63081edad2456aa702aeb7a4db8126a8d6df2e99dcf559ae8b0f51fb5e82003242716c936c19476a224452e5fc7a317208f6d2692c6d0c3d8b4585ba76df6a0dec24aba1eacac7f4d05bc6df6e62e65c226d99ea4eb83470e305e2223e0963bc4fc43ae6bb0c89fa36e62d484ef083a4601e0aaf7283bc20f17be3825ea9b828701b493648fe401409615fd885b3f838069045850b81c21cc0a35b045a3829970044202fbbe64371ed77cfa28a238553ee24a2886cdad1b483a6ee0baec00631f8f20f19b0fab8eee2704efe9e8679c511ccfb1ca1a91a50bb39c6387a7f539f371f6bef5f875e8abb5370bb078789811744330f13aac1af52eb8a351857abc8fb6404d9ce66815d23bf8e91d9a55a428598318cf2b1f533d40b646122211bcefd1c9a897e5ddcc47bba5e6a1f9886cb217e8fffe424ff0ec6b55eea866b5b4bff9e8a70b53e32af3ed25bc69ba1436a9f5389ae010f70e353a2cdd2da2c4aee3ae84b6113052232964c8a947260c5dde123b4ce9b4ab97415f01639e852d07ae9d0729ea1f6f9eb6e7338b309dc052cd24cf376e14b5797406229caad19f5a549c71c8c36ac73d620035d7f95777bf6310e7d940ff38c2af43f7966181025aceeef94b91272f1ea6c0cf89fc7a723c013cf42d59e022787d11a8155729a4e8ce1db4d62f8172c4fb6243aa00d2e6ebd176fe1c96fb6132961c978179c91f725916b8f5afd371b13eb4f0108e5063b8b353efe1b3544da9ecd0b2817ee1ec60c50884cd66c8f1e0ca4fe82b86e7ca95c260e93a14f770055ade98429b2df72521f4dd616fe32fcb8bfc319718fa3e4c1bab445fb8508b7ba23ecfbbfd704f7b89284d46997867a843c5905c4df36de31b11bb64efbdc3ed24322c7ae2b34d9011c3530c7486588449fd72cb85a7f177c277d2ed982e0a989e190a0ac92ba612de4c1269ea82518cba0bd8d93c8fa074fc9442ec1636c889777ccb2ce64ef7455c05a1e2874b9320bc3ec3ebb1b412f365924373e79e9dcbf46b0e81b66e247a6e71214a1e03c6f3a3910f5b6d63e3349869c8d4c070e713ed82bed90f9a272f526e74983aaceef7d83e9e68fde8d70d75400bd177f0ecffea4bd5653cb77ffc822a96d20d615f74cbd62cb8d960acdd2314b296f355f4ced0f0f86a33da34a6a1986ac53f60225c8e9debd191eaff3924a8f02e1875f155de3c4096b3b2413275ca4e216969b0d97eb4bcdebe5e3386a05af9cfa8dbfd3ad8c182b0e2e6a215b7e45ec56291830d4c83184d3b449fe83b26da39e8f9675f3e832fd1d19023be4cc891f55bb0226b45018071158819324f8cc63ca7b89d3570f6f37494c07956c7e64bdecf2235cac435d200dd1f0d49f8f5c56c5b5b78c7aef645f1eb1731a4c64635411346a6260f08b4620998104c9c8ae4b8fccadd496e696de7bd80c0a170b5e159a0849366cb05f8c630d51cf243e3fb5b7720d8e0c16bb74e54613a8be232b0cc497d7e28674e17aecaeefbdfd87e9f47cf7ebeba1f7820afe3a4ac9d9e720a7671f5e101984797c0e05902234b1b2b894e452fad882089dc230117aa57c3f43a160cfb707373ff95809deb5606c422b1d662538bbf0cbb3094f0eca21e7b7cd43f1d92329a8bfd6bceedc1daa2539f716c6b4c97649f67d9afa2995c9455654c35db0363b1d5670f72d2369b5d92a72610b98d1fd21031f22faa8b0208f23ad3014082bccd814b51d4b46398fec757042fce0dc9244af495f542eaac31452175de6dacc771230ec419959b7d4ebccd2da93374f82ca2afe1a0b3093844fad0e73308ebdc6ff3d12e9c2acf9d3d709f912593648c217fc537c51ccf522b998136705f5078d12fd799d140caac8423b67c29ce6ead697d09cb59888434332f2e682088ffa3490a5a4e24af6c843f221e198597aa93ed6f277af4d03137358392e2867d88b12337b566b1e9368f1a1055293c1d32ed259469b85e01cec6fdaeb47cfd370da9b72a63638c28ad635160c9eafa567ff0cf6431d549bd5e0f7feb52d93d6d88d448b75e9fad76cd5144c756aa8c1723963fe9614488140c992d8b3e94317145eed92f97cb7c4530787ee07113b0adcf75c3e0e8f5d0450bbbd13bd742d093559c30793e1cbd46e9d7580f97e2c1855c37e158194595dd783a2c57c4ab38e86b668a327114b5494738650a694abfa3ee484ac235ec671f2d8b7f4d169342d980f9ff22a8af52bffc72997818b5489df276c7e05be08e32cade52633a1e88044d96b49ece9cb2344c97842049f7c47cc02763549babb7594e693579726be048d7290c7f7ae7302029f27c5e4a9397c2276a13ee778f5f0540588403e8a1af49843bd5d108866a546e313d80bcd4c8eb3c59051877a7f6424711ab26a78ccd7469fde425858dd7a365af936785cc95ea797a0a83a78d01d90504a896fa7803cbb6704680bcd9dc576a112d8722cb93d97a0d64728a486e461297cde0f47941d33ce8789abde7c5cba664c6e1a9118f56eb0fa859ba9812bc2b81de2722d93d5a50cdbfb20e126f6e6669e37977008d9b0e213a1dbb209ef5a98c6bc9803095ae8e08acb5d0d93d468d721371fadbf0eee15cef9d5dd17c2f775a87bfec0b853f6f5d2ece4ec9d3044c9249157857e3b3a1f49b428450d8d23eddb71fd78ffbbcbe002a9992ae46e1ba4b991c87577240b5462218e0be519cffe3e379af68935cbdcc56bad6dcdde165891c5f46dae9cc83e74394cf287c0a20e329c8e03892fc16fb36e5096d655d507cf52bbdbf24a606c3d8aaddb89f997c90313f77fdbe8e783425479210e855da9f022507f64467e09587989b98cc27416b80c9b9630ea94b6d0a33a6e21d0cb099b2084885f1e0cf197aad9a47030623a6350e8b990d4cbee3d33541c8ec4570b1e94ff1afcd5ca2562bc91753c4107083e06e9a2da2205eeb7816fe7b9166e4dfc4811f4438faa7c3ebf92fa7277028b59038d80ab03839259ab70893425485720ef78ec94178818320cd19da21b726868de01ecf1b070cfc68b3ba5e1d66df74f09d4c0e05bb8ee0c3f55fb6254f2742a5777ef014a9ac999da017366e70d4df25820c844e4304d8c80a6c75e0cf5f946c37d6683271cb9ef871084eebe076aaba055632fc133490e8ab1fd4b24909098fa5828b0c06a6dde3462f2279c7af81057991c0fa79a5d3ce2fff05825d7b4480d73f3c7b7e8aab0ee257e9ef8f72f815bea92309346649fc8ced5b0836dfc69ed466e34c6abc8401eb5a80b3114d7b43c37c5f4f26e9c3877d133bae5c44c155daf06bdfb96405276cc14d9d5843f11d564338c39e1a86182a6fbffdb0e032d611204fce63c56e3b3168d9b9c781dc85c3bc56fa9e9fc571de1375c4a0ae08e658ab23acb32f12ae3e48bb04972b80155269f24bae3302172ec8663c40683ccb720236b969233cc9c634228df9d17acb38853e404da86904a06cf50d212678bfe406847ca371c9118b1c4f693d79825b5d15cd1e7f8b5b199c37b032422bc4b97b6beed4fbc71a6ee53d72a158849457e91523057e58cd83b2ad3799a62aa3cf9ecbcf03960c7e0195693695fac076861fd3a4fdfcc5d35c9cd4787cea6b99addb8f11fefc89163ffad742593d11d45e4b9e51c0bcc757461c024ed0c5b025d83db28eac2c2bfdbd3d0c50da22f5f9b10ff858966b58f15f584655a300381e67d273bfad0b69b21e3db45b0d5470a273e19ded863709f0bab4936e59bb03e8bd7ff173df5c2f8a517b82444a2811a82ddcc7f33276220d4ada7adc148e31d98eb81c5fefed5d5b0201beb80366c0a8321dbe4de6db9a3fcc77de422df40a682769a72a35f22a49356bcaaad7a760c4e636b7283371a77eee292f8e8688b8100e3ca49c38cf3ba012286ef8fe55b2e008080595b7236ded3babc4d5fe4d1a20ff6f70837ebd9e512198c3e35105ceb3e05743c34af40acdfd07f7c0b36383188b0618d9964afcabbcd6b30cf25ab5c6a54dd6e33df6a52a330c8d782f75090c491c8672fc152064b1ab2d7bb8e2822819c722e808359488e6395472ff1ce6f53dd358d6dbf2d4324f763b263d4f190cee598bb22bcc7332f1cf20e6393d78765a561f145ec931755adabec433bca47b685a14842807b9cba7ab9f0a89f46bb9e0f188b05d4bad961fcc967636676a7b66e9c0825e1b55711cd90f66c659abcfd3ffefb9461c915911ae3a7797197b670baf9a42f65c11075e7e4dea79a300f52744724de49c84e5cf39cd01466f79dd225dff4c5b314a1219f086a284df9eb6a0573d724771e68fce6e8f8d66e10357eff3f5a7c6ae08fe11ae8d2f7bcd957077f7dd91988808a0af34067b35cb3f31c3b31ac48fb8c6fce678ce8c70434b82838f9097413522f81c1bc51c6d90f43e8a0eade7e778475a859dcc4dc5d8ec63b0248e6da406241d14f1ae85171d229097d29bbd02500249997e1681225684f2c0501c377e6ef1bce4e9e30324ea4aea100ee442096d7ec2d35eef377e14569e6cd8a7094fd30260c527485250e5d177b4c0499b8e2e78d18601694ddb6c57e0e9f5158564a99522459abd22547161bbfdef72949afa89bbfec629e5ff0695a4a856c94f69d7cc130152144d5132fad7f524c8896165e965038f3f86ad01b2faf2778ce0fddbb4f08c56c454c35fb9a67809dd84e5ca93ba7b3850e4dd0a30c75eacc2d4fea356028b20df7a883bf02b4b56333d508b8ea4b68f288d01fbd47e458d80b1fcbc0d237a94ddd3a25420fcafb358db20ac135a337cc4e7eacba51c23e6a484f40e4f5cd96ef57c23f5f796e8841d7e3cf97aa6bf5a788612f160815deb2c220b26a4ed4e19489c477128dddc6ddc92a6b7cb66bcab52297348972d70d7d5d2c2c7268fc9a9185b3322d4a21dc954128a529e6074ba4eba66ce350c8c821d96e7807b2ab20faef32d5c38214233f9115f9c797c5cd72e85038d1f5b9e8bf7ecbc4d9bd5352247a68d53cc114d3dad1914fdf54bf5e45ed0adc37d20142ed3a0206ca43c6a99225079cdcf5f4344e2a119ae530f42b50d9adcea4f3540aa649ad3a546de10ef87bc1291c6772c3ab13ba4783bcca6c365c9670baa5655a45bc820e2dce238b148168f07738ebabba1757eb93f624153e86e3c8fb3cf4d37696e4fc2d97404dfc8b66437f9d73e9d7c407e5d51830649162f4d0fffece8af7947c03a5690bb67eb67d1bc4175f8523e80583ff5d5d29c88f8b2a56a1296360b37eb616bbfa6ab8069480f6e160677902a4b42cdde09bd9fa4c8242fa677a57dc27771cd077fbb2db69ff01899e698702f8b7841eef46748704335012f84f695425a06de879d28425e19ff5f1c37a3240ee3c051ec35b152812ae3999639d9b7f924e3c048ee77da85c355f5a7c558467b5ebefa23ba1d63dd93d0a98e215f86a1b13b580fbc5224e57ccbb3da80d2d1182ef200a1a404db7b1b57b15ef66284635dbfbf16e9bd7bb868d2d13b4712228ce39fe24ea35b74bfdc01b64d3cdf4b5e3170ef81240d1f522d49c98ffe73b281816842d19a93dcaf833baafbf34fe306520aefec497fac7f0968574a7376c8b5a610fed2d94504912de43c6ffcfa4e5ce70cd0f1ee7f1c472f120e1db586709a330026dc3e6929b3d3de1b4c81115a087251c563ef8e1099c02400fa87862634b5188b3e2ae04f84282b363b68339ea2c8dd5c615e55df5b121824eae90bd13391eec8f02f8785df2addf901d850e6acfd0df3f5857411d719d892fa8d42a9329eda8f98c0c0375ca5a769cec4bb4afd46a349ba1b64ea6e996c1743c0a9549f3dd5f253a70a1f57d7337ca81d21dfd1150b57e94350d28e3705ab7c40ea3e894b3f56f0b70334c7f20f867ac1b45bdcc81c9d6fea5c186a0a210a02194f7b93ba60444e1176a482270d11aa89b4a33d1ab7980987fa3005f8b871a621d5539f5dfefc8e6846e85175655c98fb676f0ff3a78ad2b768f8efd3e4438a5685d8bcf6fc214ba9a4686f7e9cf207a51c981e1517f181b54975ee5957682f86a555178d3db9b0ba6c8449b70823827cd26bf07f857b07b5d0d12eb09c1fe7be67af447e1f34c1179645abfd95af2a4c1f9692f6f24ba14c1b268bb9642416ad2a11d3dba00caf0e0b523c088837430caadc1350d1ece755a367de48b263a6374483dca6bde179aba0cdd86548388fa89ceec95a8047614d9314ee8522ce52c8d953a90de790bcd89cc69c9da293967ead34f760e8b2c994f1a9fe9ea6b147620a0ab157b05d718f91fc5bddb95dad6a504e7cfcbb770952ebfda2fe68a8b66f302b0bceae7ff6d9db3c98715099a58fc715beb588f26cb48678965d8228018bf136c7641e19278a1ab5c3c8c9e8d8f4616929466f8486bb41175197c52cd7849ed0957983633417370c16903f752845a8a81267cf9baa17e45853ee8fe073aa904174574525e03d1f1c241f183fa8105a6b7bce6d63c890691cf7ff62ac7e26cd4f7df0c0c1456943f952abd915d8215914691bec52d4d65378bca6150b7e4017cebf07c91c3f133cd162ed82ea4e972d5588829cc382260437ff1303f65d261e36e9a018715899bae331775726082318b12d933f75fb62f5eaf65129be30846308022199834cb653483b152501d1c6e6deb654bc90dfbf345aa18c071cc5845344c435eee1498073c1be91a440d87d74fd1a71ef4c5a05087627dee6c0b12e28263fa2de534041af1fcb579148d7706e6f8324f09e98a0161164ded7867988bfc295b1ac237ff636a189fe4b9d36fac032fb65040fa7e8600100ffe2336e4eb319fa9ab533f81027272116b1e069d9d42d3c2160b4992dffa8e04b0c54574e096054829c27fdc13ec429e55e28566a621964bc36686b007b8ef4e593f626b0039f28dd23ad15cabb8bf1fb3594c372181fcb6183d6d6c92c562495fdf0818fa0768179f23dc3b76937e6f56176b68afae28b23605bd643f3673fe10ce8c8eed20aa113a8289931b6b81b43cfccdff77a1b09b571cc1974c6640b357d3e9433a3cfa1ab92b9f4dc2629eab15418c585542dde8ae84b2eec6e9295f3cfb9a4558199eb0fac3894eb6d06d0111ac893d408509d250aa52c62e2f2f80e3e53bb9bfc1c151e56bfac6cc22f055a7cf84055af789ba0e52a4288fd8b97b9a0b863f444228ea7608618816253b4751b0c04453999653e28fc8195c6909f60fa44318d7279951bed88bafd67c4ffe7562f4a5369351d4fde22db8f78f9f28ae658ccbc04d6c5b8f23a3ff557f778ecb92907f566e01e7267b6cc99c3363264cf310bf5b9e6c031195ac148e5a9cadf281f36856ec15eb370054b27a3e1d906b8ef99b0138d3d3b7bf4389d244a48b3e0028f771c4192a7b489995072f9c21774a27f7d4d7c9acf561d6e8cf9dc80b78000f394661453e2a5b80981e4d8eab55c931d280af99109df67f290ddfc76575417d96befb9c98f2400eb1970c615ff50952504f7c3c0513c6e68942cdf0d7cf1e3332200113d8d85fa2ceb190e5b8c766e8d20fdd4504f9c482aed976243cf3606ca6e39060a0403c62a5a817cb63f7b8e727800d45c8c35a7be35fa57eb506e6fb825b0a860e5bea90d78d1d1d6000a7d91271087b5623117241be8563526bb7066ab0c081706cbc9db0da5d18e798f0a41b16f208b5d3266d60b47f7553380e636f545f351354f70906a86302851c1314214af515bd77f254e4b63c73d1ab513ef1c4d2a2cf141a0d4797c051df61cd6e834f64722b819149efa9efd45ce25ff7d7808cd9a1e233586d059ac1d8bde49528836b9a339e80b5f8ff7f22aa4c232bab782d812f03bb0600b2c9a9abe9dcb2123f9ac2fcec3bdaef4b52ad34234cf7038f84e28c38f7d13a4e8236c0273aac6c543043a31647b1d08ac6a32ba43946823417cd1b60a481c690468b793b35e8f2c8f27af0fd633676d6d9a256b2d8157b4bb2edff81f6989d48094593f55d534f254ba58cbd92a4f261bf7faa63eb3107cccc32a1ceed5c2ed20e9298694a11a4c2b644423836c04559880f9098647dd9f6d4e9864e7ee6761445b8a2d7829b79c19490962e381ad64b0d7a7e8f994f12eb847f1a408a062902ac9faeadc0ea8465dd50b79912236f628dde03ca4f96257e3f1451b5789955fa21d22ba96fd0edd0ff41e6f82fc5acebb6f2f796bf047dd821770fe7de18dfd981a97df0e67111d99da090755701f673c98fec3bf57bc899c6834acc3e3e756c163a52d08f84436fed857e05fb0fc9173310b821320b4c7da3611caeaecc3bd79dd378e7f393bbbcb0439ba61bd2d14fd73c75f847fcf3610f2423d243bef7ca6dab4fc8d28e25f985cec340662a5674e846200d30eadb8e0bcf1f345ce0c869e997957397fcde8c40aa4780cc32985a3d7727bf550fcc0c129196e4d0a0274e12935eb0200b0f21cadc58a7cb09571f369acf73a6ee97b2ab7b5f5949c364456371b3d63ea0f874633022eb952e1de329062f1033a1be0ef550cb706e5ad57400061955a8157569264e628f3144fbfa94ad950c3073afca0833db8b4a784eb26321d5c0ec757528af9a7205836317999e439925e95c399c649eb835e258c6f2ea9882b6422d060e4f4b3643061d3e7883b0d96697c1bc8304f968c70360978c009df010b510c750b9a361dc50fb6478c4fa7e2e995a3fed49082c16d1ffad7f0dfc7bc13d44e5940f9b525591108d581a4a26dd242cc1a159d84910d8f7f38e675a679f71e69c71f7c30cf7783b886667c11812c2fc6f8903fcbb435750487c4aed21a4ab27cee847a795e49f57f6a0cb7dfa6dca89c71ba6387a7780f7dad16426967f0b6dc5d55bce84ef901f8f6dff6ce58511d2e3317a6b920f081976be97ff2c0d6923fe1943f98e9cfd0101818aa9b3055aca338618b188d569547ad7f350904fe7300e28f2e65994e9218a5798eea2f0d0b1d944d2bf09812465b38ef6c394e8f02d0b8fab2096e1a14c4adbc820ed7b4e04fa8bf92f4df8d8b782c24b3d85214073e1a742ceb6e69a4cd2bd5cd224d91bd0e606f2b2aa2c7f0c8e0fae4b0a157a383353dd73ab11b1ef867047250643449aefae77a6cc0452cc08fc5745cade921298020b5778060949e8858515b0b8732761d808ff672b6ed6b061bcccdb5168683e0fb5a82b4ede13b8f7ec259cbef699ce17e129c420450218d2b975e87ef916ba5b4adf6475c64e0e115dee87e4b4c86db44e2e241c8ff0c950201e12838ce8e57b7f1d4c72ccdaeaaa6dc1feab1bb5765d4e480ed686640afbbcb959aa6502ecd0bbaddd11adc294f5f38a3da58db6675c3599e05b1ba3d4023960522aa60d2a16ae16d61a525a601ae9201684ae863e106a281c4b93af85efd4ac26d11dc0dc82964be9c4872c2ea9175b9befcdd8003ee7b54daf9267cf9c66655e89bcb1d2b05f72eda045416b136f93e386ece65d5bcbe57eccab7af83b0d0775d3a8bd668be3bcee4c958d4d28c7696ac0b291c10f9fef7bc75a0b7ec7c1c1c933fb0b5c49e241cf821f0764bc5c81f76edf8a70bde8d4e41e6559f481c152c0ed61a2c094b196c98c9f787dd888b0534cb77a3c273b409411c063ccd8313dc5fe1ad3d09f99578dec2d6e2990726970b1e6ece17200ccc76dadd7df8c9b6a4fcb713216ab2e74430032a650d8b96bf0fe204286b12e9cf12321d9fb668b7bccb757079d6310bd0159a6dbdb726e46cc1798dc27e21b1d120d4d5aa08addc670e50636429cae47cbce47d4bdee9c0c88a45f18cee92db20304bb1b5a3a799813afeb5041a02f9b900940f05906aeb162613ca26a32dbac6fb06a2b093ac68197c9a523563698a9ba968acd7045d4888fb8d26ae2e969e972cfd472bdc129e9ca415d39ee41a1e5842b17625578f605ca49e1aa4b8db0a844e57bb9c4ae0add880db990faa208bc9c1441e92496147aa241f2b6376735a6fdc89af5372ae3bd4dfb35e382a8fba3016bd4a0bd9542e5aed2d4cf370d28961d7663ef6ad050c31abf0972961ef4fe51035a4936d8d6d2e89eacb6af2c5c1512e27b356c00b499b3e1f1ab44a2f27dcd4827cddbfd534852b77597633ce0aba9201c34fdd64680e2038c4616c7eba0fc8b588b3fc49f554753a2f73588d7749bfc0c7d7db50993ca2856956a2c53184672a488989e6caf97f59dadb9b88bc2bc02ea2ff2c263665d39a8820178335561c937eb495f749a04323501efbd9ff7a2071a9c75483a2970084bb04a2b467ae3a2c41f3e6405dcc4b59ab51ed80a9a56e8c5c500b6057971cbeb66f90d41afb82144943571579d6a208fa791617e45df6e9d71dd290f3e1129fe056c72bdf8dea35f087e8fa94c33a843ec356bdadbc8cc705ff914192f351549abfea24f745a358452bee2f8921bd1788627715c17afa1135944ceddc357fe492ba7d9c3912545c94db538fd1f7d9966e03aced45a6a231c9f1d89708253b10cd62e2ac6d4338a0e42e69cdd5d6f7892920493cafaa1ec4e6bb13d2ff499dc4af9944f46ef989fb20f70b1785727641749c0fc6059763bcef8620c1c2ad2410dc8fee1744f887c768cf2c584e94e3f126edb09f24181372c89884a50afe9079f09cc9d54c8c428572b98931cd40a015439245894e70f65b3f5671ddded76d1c88bf6da25369419f39312a3625f3eb04a81b651205191fa63d0cf6a231297e1e880735cdc96b11a837d065c40c3854ec05dcea695cde28c98443e698a1b648e305afad504d8c33b37d7c4efdfc061fa44e8c34911eaba8fb2248ba1f159c160c0aaab964fe3d04528ae54e257e4f505768105caf2172ccd0ff4bc29b2eefd9d870495c2715ef2d885db1cf2f6fdacefe5ce6b6a8ab37fb0f469ae8b554dbfe6a35854f6dba059641aefa044973cba9932d1582cbe747c7b8eb7edf8933c48ed26ec263d95a48ad1cd06edf21616927ef8b2fb5ccaa1a40ccea358f6af4f71829052f6ba4d7055cd67e53d991b0b6853ec84757b77af1e862de7bd610b151d21b790c81696a4d1246ce7cbeb95f55c256f3f34eaecf382e5e6ab264747989b30a3be357e1281429471b1a5bd37ddea7695db38427135eac33d7f122df0297a5200ce4d531c2c82d7dc74b91a3805119a7c0751a3aa1bb23c3aecb97cb1215f495735589289e18eb9fa136f8f7cb58313253f4347a09716e2ac4f97ee31c3d7719c21ce9beeee7cec047d0c9e9bfece06df5e52b19852a96104a4ee383fb96418dacd26e6c0799b2ee3b1c0fe7ce2db8cf7b11cd269b59c8d85d593ea7c99351053e300e51001434b432e11da552154a6db3b7566e35184fb22716ee78c3ca10351c2f20aa901b21bb3ff6948f1e25ebc914c07cc7d657d42f54bf47af66bb6269a2b045e6e0ff12a8bc55fa2688458afa667b0f8119c5f1d8b545bba82c035a2f5100c865771e4ad8f04649c9ef4a0394caedfae79295d1db8b63f5c2214c16d6147bcc91ac94becc66befd534ca16115681aa2e1990ad0c1f8f4a850b432767064b6049f32aa3f8c2250a03b8ef9e74ca1c3c1faa0ab37e12dbda369d66ecb6bc59047c0936327f35ad6f3fdab4932034743886c32b4180ae0c9b82e5eaa0390c932fab5ad56ef6c264c51d6db504a7196ebdd8b85313ed3e9165d83be5bd92e150ac8ce9f8edcf56bfeab675a75e7bf1324ce7121e486271ac41554a5202832ad4dab195b820ef66fe8c471c83a9c53a3d1836b98f45bcce145eeffb15bccdde7ebcdfdf6c016916f6a1a931e6a2caa29b49659dfed238305edf7063ead84d3ca82c57836117762128e6dcd2790e68b34bc06e069189f329c0ef75e4ff8f6fcf4dfdbb7b0d44243af518ec7f25f5f6ad3d0bfc9c01ac8918c9d3866d94de30990e946937942f8e0ae5df03825f26f4213fd847d78e7a9c42869fa450d4beab8e48f53fd69c9bb2e6bf034553fcb66795cb84681eca07b373a4de577172272e5119f26b362cf040c19442366ec4247143574f327e281d81f0087c24dba9a2883a3abad4c5dceaccd953fcf16ef563631eab22f84f58b17dc08c662fb7f2de6761cc106030452838bc9b8cfad363141e7c7c063d6b4a54e4461af233cb9105973a75ea685b0cb495962e1a468bb483aae3fd0be7624d5b6aa4cad9b4f989a2bc1ebb64d3a5539652b1aff393cca3f166ab69e6830057f6b39562f5abf041b26838cc186c131080ddaf52984cf507387886964a1f77157e454893366cd2e3e82e57a9d97701d02cd28dcbf84f3dc6d03c21b45084f46d6b790d7867a4013fd71b224b48512de3df7f6ffcf69f188fe6e4bef96d1ab3109e64ac335e32876e097473ed4d2c4e1d657c11273f7ebd63dcaf2a0576497345810f1598986eb131cad591aaec8c5bb48b743914d4f2207deff171b72d604b13f35d6314610b139602f917728be04da5dccc765005d22b8f993696a090b77a71cc3eb0313f2045d662983fd138a42d90fbcf5eccd4e918c9e478e2306e12814917e5e3190ff0c1f68d555a987283bf54c8316a9a21df1f2ebafdea3fbca1b878ec8778bf01c85bcc63f0db955f2441e72a6b5f9eb93e2cce174caf3d062ef0d2a6fed9fc24d6fe0a03853e46ebd334b7254e1927f47d255f251bf55b725b9152ad8d5a8ba8e66bce6133c0807c725f9171f903c6ef54f2c3f218eeb9b8f051d38834a3af1734d09352ebeb261affae5f49fe5bf9b23e79165c61176fb4bc7375bab07773be8fec14fc24ab8c7c6e923f97c0ec7e53e6d5bb73cb90c68fa7bd362e82b0a296a7e0250815bc553c3e991fb179ab2f8a5b6c3e11a560de14cb441c161c98727bb56d67e7400df9279cd6ac5e1cc334a0969daff08794cb5b7d5307c1615a3a23a982ea3148c9c539631f548ad59dc92dbeee4b1550f07103a507537e0c9663fd75903887944b5e601e30819d3d0c783a128feb2a620b19199471f5dd812959ceceeb44a5d480581afd21af1b67536470e9d535bcd4b38adfddfc8f2303197b1ce4fe7728d0848a447bc0805a58f3c8d7d1d5b9b3499cc950f6874c5e2528be09d143af0f905ef9767e5fc29d35157926c65c8d37d946d06245d468d1b8f93a021fd98cb6c41e840cacd433c5c34296843047e92482dee33ca1a035c5b07c5c4f3ac0b304feae2f38776ecc2838c21ef96c41a7939fde19214b6feac8bb702eecc64597118d9143107a34013593d88f64b880addb984aa0f5e4f5eb7ac86c7eac9c8db0b871a578923c9c7702dacee90834c6aebd9fed9881e43dc44298b8639d8ce97949ad8ba43fec4770706f67909c148891778c500284fce29b49c227c2b45e260b333c50c1c7f51a7f36e2a13b9f9828b37b2aec7b10e78c8d9fb267d568861150ba4a6e7da4188d9fdaf36e226d5069a0fac223d2e2f211101de8fb9d217f25eb68fd576c2daf8964792c9331357c4cab8372287b002a8546c56c36aa546a97baae48c814d03b1aa8636e9626aa4be20fd5ce8d0ab5b1aeb6e8de03d88e92b04092c6b63be2e658b95295f7f9e823150b93a507705238c6d54d8dc7b01324f39cf563f5769f7aebcd0fd7bc5984339cc4186a6d26779e4800b9125a37ad6a2cabe98b38078b47f781185d20a351d3b537adde668363ade8e9feab70f25ae0cd65c1a06b2e096d4b9312ff3e00e5c161df6d067cd4c8bf936765567665e0d11ef4e1ddd693dee2276ea8969fe35231577f41494121bd42d0701d2507d83e715acf82e32a019c83fae051b4360a9efb39b4dc6a5afa6dcd060482ce529a0bfcc2168f8134cbbc289982e6df9d235f4cdb11a0fec5900cbdd67998215e97b5ba48e361d316f4628c0bb6b7d163f43bbee069861b9964dc259b91330400514a9b2873c4e84bfeac76ef4759b4840dc36e2d47893a570acf93704e9974ce13e2687f3b8b2172e59fa13df6cb4cab08cd650f1c04f51b5611a7a3a80f8f82207b89562868d60bc3b3c7a02c7fc26bcefa9e42d125561f5c8638a48dca03d0578e12482d5b00e7ff454e9488da04960cb2e76e63dde104fa6fd13c584ea2456de0f82650c94a2d42ef3ca876dccaf584a6ab3941cec484d0b7b92988ffb30d5d12ff1b70ea60a849ff9be7bd81e5f75f89362d4eca46f0d45baa2cdf5d4c5a4158ae1d478cda4b74f03388e9529d192839d436d1ecc5b5c36ad573dae2a3bbcfccbac16837add749ba957d4fde43a901d58ead8ffe1e8aee1971d494d17595ec86efd2ae15198d4b4a1c25005116ead4f57b0d9033facc19ce8ce2d2d7a243af2c3b6656d397a35f75fceb3dbf8a77bbe942612f9c5e30d37fca51d1454a1fcd7da9ba356f545573621c6f8a666eaceffff414b8cfa5be21823de488e6c3b683b5a5034489937538b5c04dc388d9376e7f107a797e5be5d8373f26a005223cfe2c4d435ba01e7fae674f69d2267862f8e7f3581099cd828a099fad7c1790e2028c6c10d996c94274b9c6da77c048676ea27672886bbaf3671008f8777e7618030a018d06aaeea9a4f2c1545d74c0b3323814edd82dc34105cf39a1e80421bfae89932d97216544f9019f2e51b26e02d6163d42f2510df9767fcb88d5878f202ea04d0d36b7fc01e8e2a715886d65d4970ab29cd2b8f50b4a7078e38eb2fac8d1a7212126e4ca24f1cd673a1de936a76714eb9c855e9857e7aad20d85c6f5fc5144eb81ad25b588b783374f19df2aa53e86869a609c16b56c7205af65318c6bad7a3574f9e5611fc95105e17cc0069d062bd4e3c552ef331188a07ee4ead7ed054faaa5e2a4b4f170d1c30cba1fba0b85c9698864b15b0ad3db3bd5f69501fe713da58e027694982b5dd68eeb61f76b2c320fdb2d8171a42040634a0723e4b2aa9afb41126d34cf0347469f6f5dd4ddecee9f438dc613a50ac67bfbdf5f1c5f8419961806cecd72138df29ed04ff0cc239d5d1046eb62d64a697458c59725ef2041efe357ef76d64f89e9f18bbb678bfa220164c4573d4c9df010d955f36405c886555216fd8211093cead0f81f026cc0567fb692f40263e31a577de1141432c37f975c2eea4c9c540324a1e1ff48c24729cee639a895bb31089a785ffd42a050325f81c35f0ecc4d29e019d8a60d7c7b28d14f823ded9ca73d234e464d2d969ee0ded5678a0435c1b04dcefafd85b4278b278899105b3b6537aec4104bdd887d8d1a549697d43df5dba5e9f84b25a6354021bb08666bbc52a699adcb37a189af481801655d689592cbbe3265bc4923df8659ee44f7aa18b5acd1f0b43445214ccf5a182e017680f7abc68483c3259c6f9087f02a675d7e6a8d7cef7617cd5fd0716022806a92beedd61886fd49dcd6c3138c13f41abb8ddbb72ba30536d33ace0bd1044142a4388e6ddf80c5388cbd2050df36c4a8a2ab9c6f051bee83e72fab4fe87eacde9b71f7816d299612b452b888b4361fea99b1ac1cd4513c749bd54f02dfa653f789b30e85e3786c318227fcb91171556fc12e16c1bc9256a98db1d9bd75937007110059b43c46dc90faba326d15ca124ef6e55c2e507df00b5881add2017c06f153fa86dba278d72c763583c02a5c554465ec010342f743d038a41245105fd1bd2a2c864b02585770f19ea133e184959e3b212a0f9f8e0c740a3fd1eb863aa8c86cc4b6a1f150350a7f607907640747c0a241e17739a14c2d575e6fa309d78f34838d4634a3aa93a3f62025d8c5d204fdaf0ced078394a3d3eb8387b37530b51553f37a63b7e93e214f49b48a14ca71ed3618de0e85a94b64bd07b7b3e55558516a8f3cbba1dc649af95306cbb33f2a53bba83bfefd1cd702b4a2ba08bedad4349d02d411c6ea437fcbed2b98d2677a03ddbaa318ac2b93278af516f71c7b7f06b0fe47044578dc8eeaade7fa962f488125cb27d10418732c0eb99a0bc7535c95e241fb66b7e05dcb5094e92202e34b91c2faf201f2e2b2696f267b1dccdb94f24d1a985604d15ad921527c05c43d44ab66d7265f4214bd84323792bd13bbf5f5e9d02968282c4c171d3ee9af48a5ddaa07db6fd56f95a2f0e7dc0a921938a727f816e0fac418a6e93dfd98f228259ad634116d9c339ef5bf689b00636f9d4a92536d480f8da5100277ae23dcacea365f7976c1ac4f8378882f87d9beb8bd804b54f41cad8421fe81776bd23765c7e3955dacf35ba1827b7bddb3238e0ee3d72b52d1903de4fd0eb2e837db439356280690b1e4e9c7f5b6cf7699dbeb358e763c5576d29eb46cb7f9891975dfae50e8480c5fcc709f696420e68705954c3e091c6ca852a08969f2de1204fbaf248660fc5e3a97e014fb762647e13c06c7b4c42641dd0ffa6877665a1dc510dae8329613e7208a088bc1f3cd4b790514f196e0832a589a2779f69750abdec0e0b1366115152b41d717a71a695a8421c6e4afbae7e27fb176e451579f83f5608c0fc73783f2f1dc8a37b222b91c186567570316929efd799dc91cf1d6d61af1e249f9061a2fc8d21887b51e046fd70bbbf4138751ef87d85af509791e8d46381c23228b255b5d32dd7a9aaa4b1c9211681e350c2b9a53297d41eb01a163649d8a643543684bb43c640a94b5b091adddfd9ce71710b14a2fc5ecde1251118fc6664cb322f1470775cec5530e26a80aeef2c8ce8e93b95d52874dc592a0c067dc7236156bc37a139b8b20ee331c3592a35b6e5c0d9076588a2c7ca01d54dcbd2048b3fde36c23c004506042b9c564e70f13a94d7b08a1e055df58cc0d44a885d4532bd2e661d0b9be61d056fc461cdd7d204aef1c81a13be8d977f87691116adc0edb7e67409c6bb73b6a722ebf4a6aef8a7b982f701ba070a66756e36d75a2d9b573b908b8018e9e30e55ede8ad6524143a3d2e3b77fc166802618e0bc709082a5d3bba1c57977bbad68d2427c51cc470ec8c6c6b93cabd34e975e3aaf3dca4b712d185911a369402236f3a805a869fb68c5955f8f62a284caf023653c1681df561ffe980a544e088650ef5144cde345b6fe1153ea5375ec0f9464625e15b505eed8c0c74203014fcfb430fbc69f91437453bd9b9a1aae68dea79f8d1afe15f90d0c83b8f6f51fcf19af22b896d65160340c0bd1fe102d5c8646755dbb73e313ef11759ef059ff9a48998667bfe0dfeea00bb6be425f5e8cbe003b5a1e985ae23790555c0d3fc8d7f7b7b4cd7cc8b221e0e6bb31847d8ae1d6e5ab545926621304ab6654daf9ded6422a739a378551c9ce5e90e8b7f71ccdac17ab5ff46da83f1310c9c973464d6cb96cc215e09efdddb25eaee802e3daa01beb93a62acdb770f68052371f7f5a15d46d79b19c31b56b9862d336090ca35ec6626b1693f3e80935e1125b0fbbf79d947a2ee11a3b05934cb619ccbc993499c427a8732367b69347ed5ceb914d03a76b07969065b3a51adab7799b08e48c580bf139af9dfd3db0e352a81406735a3af7d797aeba86b0f6aebd6c7837c5a26856df83d72d53a984f39fd6b83ce278101078f45f719ec8379ef87badf265d2effa817850322822322af3ea2ebf987281a69eb60efd0152760e218168b4ff98b003b9f7b225fa4d1cf6f88fdcdd924a6ab95acbdf1cebc2469536c28eab11cc1611d174235a8c8f5149a9f18f71ea789ca4d2e04915212ccb4f673c4b6300cd5fbf8a7ccc18bdf2986db00cb2de1ff33f790a11b0f1dfab37a1b26b633289f30499eac143847f5c972350a7aec2836af7578aa79f13ca5ff855d5106d619f52afdbf26534f0863d204311c1ce1ec48d7e9095a7244922828cc576181340855adad2dc593e8a9ac627380ebbb00531dce7483c9af9484823e0750b76a9b3d51214a2b5159e42b83ff8ffc20c2924ea4b681f9428b6993abb4868afa20b7d88c998e55a81150bdcd63d2b2305018763fb42af89ad62c214b53a228b04ad03782a813329c6e397583db161525954b0a73cc78648ef40e7b386ed3b5335556451717dca7a301441dfc04a6361cb5c44fc4c069136e39ab55f47e33d7608e8520cd10828e6268b52720aa57c5dc360a64602a669f58690a8da20d0ffe5bfd7dd637122f864b3989d839501532bf2b77f3bfd1f65428d7f5dc7ec5228098fd3426057f0b0f7ec8d05d60f9d62d2aba543546d99710166caea936c51819fb0fee2f6f84ff69d197dd3002c0e6599ad1af4ee4985b0d8717a05d1e90607d642619cb63ae73662d978a4bbed07c73995a1fd91b6c985e0ef072314de552aa01ea1586b61405f90b227788d8b2327b4514f5f63bdf7dba5bf75245de12785731f02712bcf944b1c3b1002278fe92855d5f3035965cd7396cf9dfff99308196d1c5f76fdc572328017b70d076647989ad219fe81e88cc968fb7ef06d72129912320a50b9f5a4c8ff5240224d22df5907055005373c0045187a7deed8689d0f53d0b8aa6573762578fd4b19394b0f37f34d779f5083a80d2c78a9dc7cf1eea394b67bc541b9b9bff41d8b53088d32895f5e8f0693731da5ea028d24f01c20ab5d6c63a802eb588a949e30144e709f7f92463024d6f53f7211451731ece309005838b7cfb8aca942814c0820853eae1a97a75aadd6d63cbcb68bf2f3a1c7fd668f9187b832d9315fa8ae506643d01d9108e3055dfa3a329983f94862c2c38260a9283d883ca6553c9d03213f120f70041f10e8cd16bb5b33b7d91f3c982e6b36ad26ad0cc5edfe6c4c26923ac2d44350a57d0cafd685e79d74ab154b4d91b3578023460ddcc19261df69e3801561da6528817398537f04cf42d67f2f530e1645936ab9d87f27ea6479eceacf53c6a174541eab5e8117e5bb15a22c14dd5e256f863b269dfcf4176cf3e1251280c1ce8c5d7673916f680d4b1481606fb8dd1acf10a3b787503c3ca9889bbc4d2c0d8c8a599f58f3beef928b9feb8f2ddbaf95a54524f5b0ecc36417bfdce9ba2e249bdca758b64f32e7f5b878f34a21af6d074b62ceb5f3645e885772794fcba086b9bfee12cb09d3b49c3331c0f8ba283acd20799476e8065523b0fe0614604e799ec1559802594077709d8da2634d96b51d429878f799d727710cb77c59846ac4e669ed23e573cdafe2b4807b5437e9087cc8d23e3957d091876d881e799a4b48671c4e5f949e0e30c92d7f23b26ea9538b046a881503e94ded79a21382c93d2eca0f6173b6f2627fe241d3a58966c3cb2a7240996b89f5b903b6f5f2d13a7d98fb9ece7d762d7322975f281944ecc990b50560064504e5a45c64b58f6cab7cb7cc548a4acf960280d3354a0f34bf12d96841625cfe90c4cd114b0d221e4edaadde30855c9e8e24da43cdda0cc6ccf1bd3727da41b38e8cbf250bf93156251d6c6b589c46f0c122d5a1a5125f0ace05f54750cc94a07d4194d3299c270047e95567c9fe9050388139f616af5eef6bfbf81f41b7616d0ba232e6dd2cf8c669c5fc6e3d91b74448288c3ff9903ba639739269816eb46d081d5e1f226a64f38fa3efbbe376c45cc7e987178e3495ddf226617f54b81cc02d30724540c89dd284b69f2761971a438744a5cc281cf86d8219b03dc54fb080158b349af17939d9f54a790f5f29ea02d87260fdd6e1beafa1cae908dfb5777b04d9fe7ecbba542878cf02059701b80f721dedd6fae45122282c354c9b6cb1a35ede2fe34a0df48b61d8ae594ed4c403450270a23caa9acd012f3a12a61c29ba7629adfbd3ffe2b1cb9fff9f6c2f9f74675e40297d3caac471a20cde85f7115196338860237c2bf86bed7cbc89455387c09d37074f9c2c78b3613258a71a1650cd32c3240c60b9ae0396bd2190684166be8ebcbb96b653d9865b2e7b8077b748b07d9d0476b029f14723663d8c35395f066695af52fe530cd94803b86fd29cb937adbe81555ddf44b0dabfccdfb61783e77a0673a547b736f27fb034a0100dba9d897f3f07dd3f24e318df6b67153f6e1eea0b92f33c2558822056c59376b0392d5ce26de30f3e86247a926ac7a28b935d4845bc515109947c5b036c342f08226d4eff6ecba0ae7a37b74d709fd9d2a1f5f7e1a7b0f8080de2f32e3d6629c388bd94f68887c10145b45fc26b68b9c8a6c1a2323bcbc94d53acb4521857730284ef33ce4c3746a22c07ef9fad272a962373430e45f60ac164e141f605fdafd5538b005ee4e153a248f47192b712e6b4f1bbaa8f45a840bbc9b0b8f2c7bf238d72222c7d70a842049ebd2530596a477f64ded3b7439f0991b013e337647379adfbb1dbe76811800b67f3cd3cf0aaa9d7e6c3c6ccd93bef8cebe6aae89218ca2af400434518016bd4c470787118d2f53836903554d83d4cf22fa1783cfb4f3a217d4f8c08725bb9525a189b1b93804f1ab704362c94217654a2f1b629313ff3fd18e62c8878eb6445cf1e778ac4926f404730f3d431027e63ff487311d8c05acad12e4b76eb81494e11d79f4adb5c151f2fca6b054e57ae8658fad02c38ffa3c1a049aa892745ff2ac49c77adfaf3e077fa2a9df26679fe243fcfdfd5fa2becdac0b2b1c1f35b93f69edf6cc08697a961e2eaf933c3c2db170d3e79228ac4bf0ec8ccbac190a02b6354710e3860601c064923611ce56cd76c1338bd65a5c0983a4704e988907197717f503df32fc9a45930769430eae52508be0a6431b32739ae4202b53cd05694231d0b54d1f850b3350c2252c94808b20a96b705d6ce30a8fc9653f7beabf1a930eb4bda57322a894368d27bae5f76658b2b157bad047f6f6e4afd39cea3ff8fafb4470053881dad63cdac1e48220cf38cadb50e512955345f8e84d54a2511bd7a486e42485ddeeafb2009fda070ad2cd2fe834194c392651a5e0da1228b5bfdb63c5c7fd76c15859de761d38ae634aed373188bc484e451b01ae613865e07fb1f129083af347def678d6dea6b2b03328b75a88c7d61ba664814f4babc6028ee14e93112837194e3d6625cc5dac9378fc9fc1887f2438da28e8a345c53063c18583ecf99cf5876262c5856f5d9d2cb5645144507c43866890f965c4b639fc7daaa2393d3b37f8712ee39e0024a5da8d7195a34ddf532a93eeb6213f2c8cfcd3a87ea4beddc156b2fb115c1411982e997eed214eb854b14b60a6aa85b88180ae1b8ed4bd39a73887c61e2d0cd1174ac83ab631f2c02724c781162113f459f000c4413ff23f745a0b90f2a533f1b9b4f34585fa7350011a63b72cf832ffd4dfc51a6fd74de89ac165181a06b99e1f4c408c63cbca897b4fc70249cc84f5dc60f196ed9205a735634f32b128e62d11a6e4b3218ec84ac8e99a394bba6eb3d73239431a64bce3e6d9bbfe6d6f8881d22d6f2b3faf02aaad7c2b5607535112ddbf1fdb26ccf35fa6fa5cfbd22767e7a18f100f8c229be6a1d5af1dedca42c032ea8b0ca905cd21d6eb569205d804019ca37dbd939f39e4a0cc0eb32a49e8fb09bebf40976bf41a274e09045b8893e183f3cb00c626a5c62a639a4b78257f4ae01d7f3977fccdd694419b98956894ecc899eb66b45489c806b971205ab30c932850b4012884de463a78bd13ca336362b5e57c783be97d7ebfacc5f89d9d8329ee8b95670162443d6bfe9942322afa2c45b1c35dfe534eae7dab869cba2fd6fa42d37307a70ecf8691eec1f79ad664861ea6e9cea222e5cbe53af1a0786ead633716b3d0729014858a4b56e2fbaad9bcd157e76d95b613ddf1ad21b3b18a37c3870fd769a8bfd22a0a02a187d1f7625b50163d8b068f205eaa15d7808389325bd8904f1f25bce2c50e7fef124478593327f6f0305838569a5fbe43f9bd05e3155c67b9766e799d8c66434ca1734c2b6c09255b414ff2d9168bafb91aa8be4e97884f6083fb6b2483eddcd8814c111c606377b223c086c465007c8c2093e66d2c32887d639e8fcb26d1a2e8f63234dd9cc2ad226e254e0ea8b98cff6d3c4fe7e66502a665a2cbc56bda62e07f4c126e01f41403dc8f6ca6265b18c2cdfdf246bd93f29a57b3776e981f7443f12daa86dcf62b3f92f8a8cf1ece48ba9de48522773018fd8d96809d9295baf3c080de093d280307df13de85d1acce25e4f6b5cba7bba4745522526e74734de8546592cd3b2ee1ee189db9f96d6c4bf9ed0b29bbb0767e2a6db3798cac730a1e40245e74a5c2a28f49d70aedb49cef9706ebe43a5d4fdcde95f49f0a3365a96bc1bb51de75d0c216d6e29d7da3133b47c09778d8977d6c4a95b5609eb8eeea8e6b9f968e6cbdbd9fdddee6929507c9f05e2cfe9170a6b005c56022bbf8b91ca08c8ce52897ea25b7603a15c92a94e16904455654194cf5beaf8f556b273fa9b4af668037d8f12eb11f2e24913c8107908cbf8d3346d465e7235dcea6351aafc410f3381f20ae017f954be768b757c5b9a7f72fa205c259c6d9ff50f3e088c43031b68364898b9cade6411cd2af583277eb48131868fb9a3a7a40711098720149f67e00d654cd22a3aa8e84831a3dbabfff7a02116d0f64c8d0d2dd7a61ac7a56a712735935be01348bab515e30d93f1b32bc73fecd35ce641faf30c5444109c8bb7d311f9b45115d4e4a955c929a084a4ded8bcc9c4dcbda80d2aa801ae5215baf9c820ba2d7486bd25aa230c7ead82f33f1762d731e6e68355e49e9c9f12354f5cee4e91855d64809956e0d79e82777e5075ddc1cb7a2c8443d8a0a1b463c91f0892a1f23a87ae6ceab7a3eb17eaad9ed335f92283446bf0ef260cc762dbbb82a50640c14870de02a8940f1c0608d200c97ee9d961f5cddb01141628aa9a9854c2da7acccf849501af0046ac4f567e8db2267e2f1ded6b4c74316e926ba7f8a58630826b8a5357558174e496214df0235875e83c7eadc61dc9bf44bb7664901e10188de0209223f0de31f15f5a2ac5fa6fc55071fa7f1b9397b7ea697615683b792ea70c2e7bf8435fac5664e9ebb3dba97f87cf5929ddfb68cce49a201623ef2371de3e312a2b7c9dbfb29e44c0b490f5469b3e0298ad2fe8cdf1933f75ebae3d93e62c34693a1170056510c24a0079763da0c1ace05f0ce3109259a9445eca3412c81c9adccdb7a1dc2877c1285b670530a880b397cddfcafb2948101d5aeed690c9ee1f9b945bc2c27fba0171b34706eab81151a024dea83bc046eae09a3f00441f2a6c7d55a7de8dce3490b7e99125c34afb30ade89864112e7ad37851b20801202100d45f7bd65166c039180a6c75f94e4fbd0048086ab2c04f3a55f3b61d09e0d411fc72f7a4beddfb89b37c71928f3abaee48a171dec9392eb10703357e436c3a1892da68d8129efb5de82d1203f634927ddfee0f491f3c896e1ad07fc6c66a41e2a71b138b89654a4305984881526af6ef191b07ba1e20f1ce4a100701d40389cd1fb6c26bb2d99ae5b009991a7bcfafb80a21d8095f1c80ddd660e2cef2a48b37fddac530a5894a6cfb2c9b0fd4f11459507d87c7eaa5ee9df730d3ce20683eeca7e083b36d995f41e5f40d723916e9dc5b178dc4920d25fec8a7a67365bd32a1f463707e315202b744d7661a35c331e5c4f485bebc42d604e7059936cad791fa6416a9ea708c902b350f3f568212bbd17dea8255d689dfa44a026a6ac17e08c38747a8091c6c584b36307f44e9817d07155d8cde46fb1d394a4d5c304bf9a4d78158172adb5fce7152d6f106c74bba0bee35209d667fd71278401e3339d2eb40d3273f3158f3bc8e136ea7c3d1905145f6ffd7cd57e7a3156a724e1172990360f9d6f957a0043da3e62c3e818d417c7c6ae819122c51cdc14729a155f445e76b54ec1771fecfae3a0a8eb6d28574bc729b8b87c06c9849cd45d56eec0f3c9506a0902c0e55e0d5e3980a976b5adaaa1c9cb5da1f4b8ad2bb6f6d4f22000418293ba143dec5569142ea49e76e1164d598a4283ce25ac798892475b1ea591d083dad4dac097332c6fc1fe9ba2245a385bc9c85fbefdfafb8f3d0ed3dfda57e750a3ea76d80744fee1c1074c5640014162b453b65c92ba7636a0d3e51f8a070fa5d4d6433c716b38319e1b20b2c3f60463411c7bbc80df6d6625e564a7fa8d90fc40c910ae49915bd838aa34bb4f7869a2a43e1ed45c2e560cd01918483e30770e617f0860a4542a5d0659e01477fbe33e92f92e0b98004484dc8e79a0167bc7866e0700ae309ad137a0d3a0282f5afb0427ca346464d98f4416e60a6a23b03d7ccb04c98bb12bd00a475fd0d9cc3a9f5641249aea934ba7d82dc6c08f1f64acc774d1eae5541fd8eda7cfc5efcd1dcc2fe99494afeb6d43ac9eee0288a9b4f6eab40f3d407bbe260d00ad1c032bafd801602ba450453d5bd4105c3f2046db3f155c96aab306440feecafd04e5d9cb1c3e66419af81afe616938e0c6741d5c332b8134ed152a286dc901fef0935ed5e065eaa43fe647279653e21ca88f5ae9a3ac864a24c2d68dd3f70d6556158b756c3d280ad034f36c4856ba1fd24fb8aaca7bc979968c57df89adffcc232b7f928ff1185a6daaa258f18e1153019c463a20edf24eff7dcd648552fd1e889605318fd933c3a31e2e68ff07e172b424bb84d9cbc82c1d101525b378b58cff4217d951f44a190e953f760746484dc029fb3b9b6be40e1eb41505740c4b052bf1fe4117067f50a246722a0bdae87649c35e93b93631391dd170e0d62a57af8e0f892af3f3fdc2bcdad682790a15ec5aad93514c3f3dbfcba8aa26aa46fbd8c53848ea6cd68cbc9814ddd8a07e134173ae0ae371f70ce2499839cf06246fc44c9578099501a19df2e2c8a66ee35c5aa9e7950f50ae3ada31c1203356e266b72d531dd4c3bb2dc475c03c7943f8ffb0929ce89c67d5c08d0fe5b5c4fbd17fb0a13b2b00f84f1536c789c5d86e38f0f0bffc1ad5a409ee09c0746b0ce71325a496d2146b50fdacdb91c6d8cbaf3dd19c657b61982f6e7b448d3a8f4be5017f0c89255c3367b46975966b495d82b2cfebc02c7539ada3fda2a812abe045e170cee41c892fd5dcdacf4979ed58e0bfb026fca71db57a5103757f74d2488882df1710a6b4b619f82533a4893afedffc879a6622b556ea318fdfef32a4ea73765f2b1232f6cefbb43131efb713b2ce6d496a8ebdb8be450abf0bfd2b105450dd7717ba415719ebe761177da19751324362f5dbd11dbaf57a326b2c200b83c0ae4f481fcc9223e1950d652fc6ed47331aba3659f3dcf00270fe5e9777e35080da38a0abd683cfcce8840b332b49c9c4d9e85bb97e814e73f93d2d544a8cb2dd2d3f332107d069cbf75872469859f89d09438757dae14eb21fc3734d671547c5b626af8ba9cd8fb9609d342f240d315219c7ed1893445fb060f430e74c82b095463e75c0831b84212a741ea1dd22114e6c53140c49ebeb5e1658854db21f95769b9f4a0aa5812f400753c1397ef0299757089194beef0e727e43c494262006d81e9be516ae88dcbf45bed3a995f12b62490cca577c89647dec257929c9e65c1273f3489be06cf31b85d63cdf13043684259aad3390579efb50e6cad1fc2477576afebf1f2152b708020878232eb4ef2702443b9459dbc16e055aa292a6f86516dafc5117ed98c1ea5f2ae5bb05a27ba8cb5ca9d8dccc6db381d6e76e4883f3a13794f737feabacfd4ea74ba70a83356543ac0b9a1548369bf6a7f3b9224131cae86582bbb8de5cc3daae1d2910cb00f8ec1eb3ffeed8e1b21ccfef87e554582c454e6e8d9ad8e0410bad854ee5d165de97def7ac5c8dee86f77ff5cf5d0d17496164e340c49b9e8ac0b53781c75a905a1f34b5d12db4129ed1414fabbb1cd1264b5b16ac19ba134c2a595788b18b2efb223526c4ad1b9b13a4a43bd5d6390141d443cebf9a11ed665b4e2dc3664513fd51f74a4372f1b13efb19bb8150f0e8dad20f108be726f1ac84148c08aafaf68581fb9c697fca00fd5509dc4136f3e2750cd9c6fcdd250b423ce704b3a31bdfa8ad0f2dc9817fb80fc4ffb62c3179785f64264c2b8441c2f5fe3401345a254c6a4110122558a44daf4e14bee40620364e4cfc97f3c4b607e9edc4931dab88b6d80565bffee8fe959951db25103d404dbf5a0bd9c9d5150d1ec2edcbbecd7ee17ab668747343a80296b299ae0a375fc012b0c14c6aa1465e57d3cead334b771db6369056e2d621e844839b5dc5c1f5983dcf9753b500160979990c75ea5c163f3f64fc7014efc54a247bfbe1b09c8a9e52a427c7e8f33590415f2011cd6f341a305678663100bf4bd07158371abd0b61a5fa3c991b11b5df5353eb75f48a5c17265d986a58cfa632df615211ccaab7d71876a19d1e50a7144a7299368c83f88e2e2457dc412a0f7ff7b733aa8fc15f38661f40c99508a187624964627a6c06dc40c51384b747793659a1083550c4edf9d88a7da7c67d56766737e13dd8ec911928982729c06a5d5449cb35063a7cb92c4ff4fe1d6576893faf6168d50ad54ab4b178e295c12d8d1b48fef9edaf4aba7b3a2d08aafc725410e3a45852a589ba6a83ca12edeb36c1864ca8e0a9b10cf0152399711e82e1addfc5def94b06b6b176322bafd9940926c1ff59ad695612eec8c6140ff5b5547f1bf5a1242826a14966a2811efd2ac04854f6608fab00374a6ba64af8b3360c134fbf52512d973cfac9f35585b319931c8fed2ec56e924b08574f0155ea1a2f84746c224e9104b6117e838316a67a7eb3918f30ad117641f66dfd6fb6c9a76f41f2c9eed77b7d3999c84605f989345eefefffa5c52bdb5e700cbc8f2164e328b0640d0e0650ede63e45d969d11aa26e5ec7161f0ba6f1e915d359d7796d20f22fc10baa26417275db70610e6caf7c567751e3499e4e0ec338c23db5121947cfaafc13a1c4ff45fd1760c65dc2d653d4135ee18ef1aa75a90e0eba3e12cafc6c0e564df84f5c6126e2f6484cc145824323005018b19af08f6b62bdf4454a2b1efdf066d5ed68925f652fa3b38c9944fa7d8412647c21a30a9e46ea565f5fa0f4b0b2fbbaa553fa9a109493148d03f5b5b0b1d088c5630027bf9d65ec1dcbe030fa6af97633c46218576257ed248012330b6287ed3b8826a8abd66374d4fed5dc9ea354a63b3588e63f16b00e355e9e41bb033b39515751ec9a707bd3c906c6e4c1c606d0cca07211e7a3989e13a8c10d594ca4102e5dfdde3f1d480fa8718f637a75db426f6674557faa9f4de1a0da43066af2528cc2a90c510ff52a7016d9750e4011fc6397b368faccec4da6046d47d22a15fc11387314badebbf55174a5ec1963686baec6084770ab51165c01b9ddc90d851628f71cb9867158719a68444016c7ce3049b3dd4ab4089ef0f5805db145896036eca52d879a060d929563260c0f988d611a3cb500f232255ef8598df7574a442146d71804e91048dd8bf42d8e9a2e324050ff7008aaf05bcc33f69b40c0d0690ced9f65e522ace60d8d6c59fe270359887fe5a22f0ea85028adb40f16f209541c21aecfa1d31889e73406bdd939426946d185d78f77630c7ee4583032867facbbca410a821a6af774e521e7b27daf692289ccdc071eada7567694b11daeabd08407f519b45218914019a8daa215750a16eb2d46bd75d4f1cfb0e1279f400ca12f4d745cd55945e2e8768562d8d9626abf2f1a47469283dcf4a00bdf16db16cb362f6d3e11575dc93d00063430a126936f9878088ab364b19d871321211992feba59d34041c76dc964c0e1bb3fdbb0d5a8c7bc93480271ed977843f837144fa1f6e563c57cdc6b421db91ebf37ec595b4070577b9a33dd190669b2ba88f935f2efad22ecde158b1cb99b84f8b98087779895deeafdf1f7172d7ae86338bedf049be47b5a2beaaeeb51a57baf62404ed6b1e0098f7487b7195267341884ab89fe988e0edc5419689f114972bc5639cf3f38357e0166dbebe231a61f37137a3a6e3d408b239ffe0172ca1b44816fa89d829c184c54c70d8e4eadf828115ddd3bec145c7900e7062856286f3465369d951294e28a79f000033d9a35fc3e1e1894604ffa491adbd55f6bd5ac8e6fce346e92522337421406a8a81925de5abadb2aa3d299f66061f76038378212aece82dd341d7a3bc4ab60f3fed21da83de1cd66b286a03bff66838e4c0e3d994d72c58186897b8d3770bcef06cce342d091190cbd82dbf16e062df903c9a2228df4cca0110528e06083f34eed88f40fad5ed8119e1b413d54c8de7bc7be4ffde26c58999ce242f004b69dee5d190bf248c10dd9ed2dc776ab6764e97548e1c12ee3693dc3b4cb76c3e55f032b4081022219feefa684889e228f406e8dbb00e33856284b8b25463efeacb079d2e0f5622888e8fb6b86c90d5d9fa39e5bd0c27e70fcdd0055cae52cbe5051ce64e2e8ae76b249a60d32c2bb249b264e8f9a2feafcbe98e2efc5e4317085c384b8e84be2010cc0a41cf038f27ce8146cecccaef7f342bc03da623104075ec93cb6e3311b28e7f4e7a72f7429db5b71ab305c0c8d8c547237eb0b088169c03415c465382bf6380517c4634c4f72ef4a2f3cd66ea3dffa3abc54c83cf8e334eecfd6d7259ca62e7760587414d2e5ae55108b50b7e175b8cb6b64bcb31858a6a362b45f45469aa7b044a09226f9a48234dc9927df38a11549fdbea2fd50ecb4d0e7511351ddf5789cb4ed4bbbf488fa0b38bde81654c0be1ec87218e11f6c7c7a73f1776f87ca074625ebfe357f8f1e629addc9053b1adc8b7baab2b5c25cb480e66442d89eadc05c1cc582d3a4cc43e8c1cda7528f75022f632b2e99f7602165bd050ae5fa190f194de227568db8cb502e0ca88709bf724daac99b1a1426b490972a2c4235d6c0fbc2ecfdb6ecd3951c9e94a371d30b2c191e9c3448dfcab59b92bba61bfdef6eb703102a3d037aa8bf58492ec480e7087b15ff87ca89c38792788259182703974516cfbf5a28525354f2322c59203e0375a35ec5d3136628b2eb2061a6773bd9cdd94f43f38232e360c25820790d549966d5e111a3b2c0ae306f01b2b5e8eb2d16a4903382fd531f54fbfb796100aa8b7fe8b78cd22d4d629fc8e89b0de8b554ff7065ffff7425765ff0eafd9ec3e84b0f910d495c930667c35bfa0d64f5de5c6af5c591c4d1837a840ad3621c5696cca6a7e13888b7f1f25bba91d5235769ffcc701e49d6e3c1c1429cc858d22cbd8c965b6ebbc7f2ee1e93c69f7d17d5897e454aca0223ee188eac12c776490ef74f82004ede48338a015aaeb7dd348f68590174f31e59459899430b64a129467897b6fee00eee6008e4fb96ecbe02aacc1d6076a7bb65d556ef6288410ee9c52e8fb02ecac8da1beeb8aaf6ca68104fd721bad981a17f27912b5aeb3e9073b10e29795a0ee47443ebdc82cea156f551f2d7448346270a22e3a587b5dcf1340a69d489dfb3794da716b75361998feb5637b51dea229e127afb1f90a3c82d7bb73ebd9490094cc8355b5377f436f88ae3605095a50a1daf120a02e7c91b4b2beadc522ed06819b0ad7ab26c834cbc37bb8f65c9cc32fe75c90be47caf3d9193f2bd893883b43e18ccc7a9138fd2a4d2b8437b305a42d99f5bc6f03421f871f80ea8c145cf81a795245eeb8293d64b07f0e529c18ef901e87fb63bf51582c532cfc3f19e1936f20472953e6e4454632f84b28be9cd227f36f90d6732431193b360cc42b30212fd2874e7dda52cbbf8aa3bdfc7c52a3b5a6ec1b6f711cf0e9afde408840d34ce17c144ba035a6d4b7a55a1be40cb62d858bd05896089ab94c1bbbb7a4d4a9f4c79ec4b8f4691138139e3572e8ca5d59dd7f1633802a86ab3d24670a79d2207f35b5cbe4665e3e66b39d137adfcc7d437e37ba02014fa6b06488af2a5c84cd803b9839ae89cacc4450c1e675313a7c22e54ae1042596b3f14db22e1ee623fd1c12e7de219b295dc6447353555fd8c2ed804d64364fc14b48f860d88f70c5effd8e8c1ae859f893ea3a40e55aab6950215ca05b6942ddfc0ec8a76790c12c719af44869fe695dbe4669dd98bc6b9f9ae2bcd4ce07d16c7f3d6cb6a39a5a4e01f061296d7e5dfa17b87a3c089999f84b7412cb8d40020b96abd6ba78406043c03b83f0947614fc92f409e17a920440e792df5d9e1f32dbeae59af7edfc742f1cc93c7289a75cb29eaab5cda84c00971fbbf4c524f1e948eb3d0a3207eaad45b5cfc9e2acb27f785953d77924e8dd514a8244da2e925219abbfefc8b32d38e9fff1d5d050c5182bf35ca02cc3bff81701fffc577aff10a8bd6ea08d6284bce97ca46b3c85c352d24cb71956c977172d83e25776b52884e81ed16c91fb1f674f152264ca2b5d68303441216a3cac22fa94a8c9a9f3525072bc84f39b29257512e599d200925cbfff382f5bbe0eb266acc71e6f2a01864ae1773db11c70a9fc18f3b2987a7f04d1e5568981ab6f38c5a8290379f42f12251b0413fcaaf6921ee619dd71c4d341e61a419db349c49b53449edece39e1ecd8e94801a74f3a5b3046389eccf1603c171415601d2638dd4a8c9d57a818225e670a636c59b3ae7a241eeb00dbc42d0b56134eaaa4c53b5b6709e686d96f5083d9e56f89a14d3f765bd15f4215c62f207e0aa8949332999995db655b29649cab5c156cd694c6f7244dc0656c54a59cdbaf4e7af7cfe93c14534728c3dd916f4f4cebc513a4c45ef3b2270f84d637e187bf088baf74a0a88b93a86aa42544e006e5f5bff087ed06ea2dd430deb7df358dbe84e203357f0ab423aacfbefc4001b6b25c0c83c8d20f781108e9d45d87166efd650c3b958f5e0f6de78d7d8dcb95a6528f9a7862bec0a5b36e5fb2983b4dac5f625ed8b753c740a853affe44c2e2b1145dc1aa4162aed997d4fb7f20615fa819c6af620de07d269d56f8a3ff657eb9bf1724afa0b1f8cb6f50c7112257e7bc97e70fdca784844449872f9045424d3e07bfe62a31b3002f2324748a0b241482a1849cfef0041bc6176a71ec92417ab328c1132033b17dabdd372d6edfc69e09fc8d8217b784c8e9d2650087f773616ee615dbc01a1d06c38822e2280c83db607a02d8b8cc6a61981c1f7b16e574d767bfeaf19a8512d709a64d1f0c7693e4597838d563821297e2373d5d15647c6f0abff1a7266a811aa8354de5eea02c36cbcb275bbaea0a4ea5e8f5ba3daf770d465e5e8f79537b34d06c19116e3e52a5cf7e642c00488e6337f335e21fd909972e906298cef34246edbd626326f202ec1c83ba46bd345a8c740923d490677b22709cdb5cd442de333501e53716f22c6a10b183b8d7b3c6e9baa8558360efa5953646222e02051535bd68accc12084ee6ab12d5d2bf727316e85893ba1fcf518194f1ca593ddce19d5a179d9a32e4eccdcbd3a36793a885fa458bdcff72b7ef21882658cde707b86a156becc6335ac0455b58cfbfeddb9c9790364c86c74daad34967ea37bc11785ebf848759a7e0b97d4bb403aa6a1f1fc93e4cd1204048d0d6b78134477ad872ff490f8e9c51864298c867b793d8311e428ca4865c3fc866a93b5bb17123be71652696c15a3ac4e8882dd736d598c83317ee1036757491c8dd10afecc07ab486739e02334d6557f39b511c781a3468eed01239238d4384856ed8bffdd899035c614ae1df5885b26d619293c3d7a673db7c20d8a3606522816d60bc2b4e59d09d3f2a12de9074967a4b247c0a9cd0e67d49843658896655aa1ccc4a3343317beba560f292202742f3e25097b87eacc615acae3cd5c8c2ee1e251cda01ba7413d3f68280a824e489bdead6de8896d8213a72414288a6c49a58e8cfe2c774ede651af465741e4acf91fa478fc9c235d1cdadf66707497cc6fbb1b17fe944f37219bd5e4b5ad050871415e3a3a4454dc1ad3162a3a747b50e4b5d28ae44f90ed0eb9ecdf0cc0e4adfa3c1717b3c4eb33ebabca62f2c89540307b59bd8c573dd50f17a35d4ccb7ba406080a96e6f039f9d2fa81a9a832537cc6f57ab019023d8f3ebb3448560bfe3a5345b7cd5f49f95fe66ff1de6203966a8126b7c56b2748345d85c46638fcc6fac8f23aa90b54baa65b6e2d4b21766ae6a4d476d5c81b70d6a1cc1cec0db271c10872f0f490a5233529751830786c5fcd55c39a16d9b1659e40f928e4ca12a6ef9b6ff3b1fcb1321d0b07842a24436e0860f215aac3dca13362f143dab877c999501eea7586de82291fadca28ec45a322efa59155fe3dc00e74c9b90b4519ef112eafc348fb6eb599c556303d12bc4e5b550b896f40e6658408e4655441deb7de8138d9e564c27cfbb61e68b05d98b7049fb323f197358e1cb9a72f1b991f1ca8bb568553d3711c82405b846e5e35034473926d0bb03d4a6740c2081aa1d47cce64a6aed6ea420a5557495b5243de14e038c5c6c1a1c21a3e6910c5b481b5efbe3b0ac2aa0e0e4ca4876482ae106ce331547ef7169116245954b93ebf3a909a1f62f2e9d31f6c57ccbae1cfd16899f41d5c9c4f31ad3b15980f17d7d81a30553d49c380ff5f29c15eee443d036d638eb91d72f45615737a9320e8ef3a1a9f4b0ebc06f5effbffcd5cc415ed55ecbab8a434e65cd5f9c1d599051382579a4dee692dc70aa328db7af9f922357e1c526fc821534ac78c17cb3b8559f499c002fb561556b5154105cddbe19167a6315065679302fbb4a02c5fc73837364e9c9d894b6166ee85da04c0263d55f073a7c24ae2f20954bca4b35d3ee4bf2ee64a1bc99dd84819621778976819a753a1d448e663542bcdd523d0d3f4f8a4afab916b117ff654f58ab74614cb0177522dce9032be06ce7b053ad33d97e735604fc0eb8774db529ebe8184c7a973cff2c4bd33d97c9c084e6500df46df42e269cc42ea92fc639ca8f9a2fd542320fd70128f6475e67937fb2ffdd32eb8bf3ab53e7d7843001f26f501513a4e77739df6ac004b2ff057f5e1af679f3dd46bc2bba083b309903fdc8466b1c5ca3eddf17a87c2befcad8f17d4b6ae68cb26de2f2f33a169d6a73a02444896123efb346f05438bb4a1fb785416e016090cd1efa875a0ad7f259157545a52be4e1918ba64992fd827d641e0762d0c2e8c03c76a7cb4b6e129a74af57b5054252398dc7a545be361a2c7f4830b10888a538a479fd9c306617f817233f5a1da75ece9cc75028c6f3a8cca829aab8398c0c9d465c1aa7c3b432c7bd580b5101232b209c7c23b20fe8cdb925e42f7ee4590f0cdb72f81ee75f406c426434354402326a6e16e25d6ec1e993800383fb3b4fd1d9d67e00378545b25266fb72f70d26cb3164f0c3f12e79f989b535e6452930c85ee74b3f9dc7fb5a241f2b39459ef63872aa194bcbdab0969f27677a2b7211794184b82b25aee361552bcf556344b3c0a56e5c3ecbe7d64386e302fede598868ce1c331c7bfe6bb0458797fa827e84ae0979ec8bd89ca122ace5158be28ec8ca0f306e148ade69b8408ccad3bf408d4f09dcb531e8f31f597966d0eee7bb9d5ae79781078433637dc697530e809c3f582bfa8458dd393139a1c813bce0af6aaff21de5097f0e55a9111230e5677b2528c499cf42b40c396ad69605e340b59639d2e24142a750fc40f20edd4becb87d0c104e816d79315dfa38b8d616c8e7fed52417049588b0d6d7afc296872524f13a67cfbe4487e2eb895db558c5639a5c4342755f45d6ad4b6feda9263d20811644bf01dd764a346e786db9c4aad42fe5ddc2142add7bea2f7a14f8ad4a227f87995553df7f0679a4528450a0a813a64779ff90c3b35467fbe20daad10908c5388bbab574aa55b334bf5671351d3beb7e4f2f12f95d89cae95c5589e5825d5a331c245407a51f51e13a313c8605be6b1d2ec9926a7435e460a0b50d02cfb51642d7d4f5b7317552e9b12abe7c708b1557bfc3e1d1556e20b1e1e9203a0176ba64441eb15592976088f5d1d630491144c067f83d099631e8c6e92d8d3b4b3ed0d6a383c0664559951dd07363871d827ac7d584a5919f042d8b6cfe4856d300d3928b54bebc61d9ea38a25ce9b0ddf19dffa93b93e682456b3123d3cc99c7e8bfa9c22fdb7649aa33690079c25111421409290f212d2ec8a85be7171bdfcd1b6c8e25d95e1673042dfef523690901e84c8587a39768c8a883044c97c5d2ed60d49b366b3f59469b4fc29cf973b766690cb4bb22a5f7de8dce0b99faad4b29ae58fb7c26b11c54ae064f6b072dc618b8814008042bc00b40722360c0cecdee3437f82f798109b3618ecdad099fdaf56308d7e1c9717339719a45871a3b0d7e1eb3ca9f180c1ebf8cd5f09e91114e1fcfe43b1b6807366a4d9a3efc28113bd7887a1210be4c48fd46a7ce5e21f06a4e89c627470e648552db9bde4db3d590968013aa656b3211d1386f912ce40241f022d86b47bad800f355946b348295f7f721776eb02b1ce6a637404d4f6e1c71fbc722f2381a88da9e00a2128da6668f8a65bc06083e146ca6764c7b82d3ee17f37f271b4195e9bbdd48438375b7bfb95c91ebc8f319f3ec00a6ca288ff6e3f848466d918f9611e10609f8e96ddfb77e49d0281cadb57364cad806d47f3d0ef5201fecd2f50801770a66becad8431e394dbda1423958e8f26eb34b1a285be85b6e388df56c6a089294cd4dacb097e8e6f80a6c30b6e4e42927ac475aa6475d78afb590cefa3161c86b749c8cfab9373f883b85f089f025f3856577258ffb0362db78e61f339ba4d26ada679cb571df9e43f7ee52feddb2df89718d72afef79f2568fa311c1d65d3b9c8a048063e2c4681bfd4184cff8b1df591a033a6c48e48e91d6f89115637d8cafee422f1b57bc95ba2fbae9492da215a08984c2c231c7b47491e8708757677903b3787deef4626ee7fd9f1f3f76f2f825a34663553771dacf5e02609d0731c34e3d8cd196916b0d543d09153f7397048b7d9405c6ccbc01d4892295372db9124e993c61371f654be8317e44f66590e8e9522c74fb9c0230ab5c7c5e08d714f0d8604b63e658c22d655adc15025a3983a17d7eb9b892415737553a11bf47cf540d82c4215e61dfcaa9eaed19b5ca81cde397cc4a843af7bef710e1095c3ec681e5b3d4a2d3a87313f8ad1b25678d836aff05f37c6e0d74fdcff34bce2433fe07879fdb99a45f4ee62bd85b11952cc3b0ab9eadd6e55aba07dd2631c1f1ecdc65ddcec7d1dd8171b67fb996547c455945c24c798e719ec8c90b108316448089c3a1bc7093fa412bf4350001e9aa2604c59e4a50dd77d1829593e9d117a8295121a527ec7412640d01a861ac963113c10d44dc6203fd8e9cc67f7de6098089e32a5a93f88675758ee021b4f2584861e88e1895ca08a232ea39a6f241c50f3788f69b01edd8d595218f70456989ecb011208f437070c5b351420c88d7de2bd9aef291c5083bffdbba89727484fc5d5533f86742788ece0cc43992477bcfdb0c32b6090134ceef586cbb01c0606920f6673b0cc52ac2d7e5cc3331528ab314e38860b6e9ad316f1fb4a2392e2f537392b7e2b7eb7ea35e1038d9ae94531745512f3b7ad291f1d9dacecaa555e8b459d8a72678c58d36e921c6c81a4a7d14a1aa5d1b3f7dd5a0b09bf90a970314db8a892095c253e274ff51fa29a637c7030c2addc6ffe7141746700d6a4e409aa87364211a08536719b2511f29e4d1429574b0c3f74bd4cf6d2aa55f9a6f943e6a95e3f3a2155c8a4aa396b91c92381b30eae2727ec86613f8b6130853637c0f1f58fb75ed90857c9dd0a1aa62b82bfcc233ec763ac6e5b9cba312f076b80c37c368b89a39a419c763faef82fb45ec0632766a78d653e083efd4a9be41dab1b9d0b1f3476387b39f2d905c1280a610dcbc4e2a9bd6d1a9f81f59abfbfeb05cd06bc493a5969f96dd862eb56b056d141ab74d7c6a40c04f5ba829262fad44bbc806ccd8b78203970884a438c731dde0e458d34f48535735b0f55e5957a8e6e2c17fbf34fab580b31e11d120ce49ac15703c7899a3c0d53afd8d3e008aace4b966f603a3680ff775ce6d7b967d26818746799156ef10726e56da1c43b04b4b6c9c7ec996c707b646e67bc1936b7332a0e86115b75f0f92d2a73f3d77b68144c1cfbf0c140286bc132a49a7aee04a8f5eb2b16d566da6460306a681d373d36c2c4d740209de66264d9d5e9f114edb5d25dcbca37e2e6529f1972d5072fe9fb6b1951bec518bfd9b28c5e8d62d0d267c888b9f305c801240e2409d1fe4ab13c0c6b9335a5f1b4aeaaa312f393543bd898dc216efeb4db5fb89e6b3a5b598783a26b847b30cda25f914f2902bc73b362c2430f8292fab4eae15e648d54932816056fc31093e45da6d251bd6b33a27db43805c78f1f7e4e63a54c9b00935c0b045d9a34bbc2c1810b420905e6e7c6893e53b7eb7467bc1095e130c4e9d074b8a6e3f044b2dc98df639802ab8fb389c03dd66733f0b026b8134f0e703c3338c0e77e1c6d20cf5d5661224fd46a0d31b02658b892ea98ab50f0065e1f22843b3ab9faa77ce643e51925c64b078e92457924ee187f85b7dd18ab9658bbbec3026b036cf90349297f645e9e5d0be3a67e13ba3c2865040920d23de2001304a76535d8a6484d6dadbd7192bccf0ffc6f21b29c675bd91ddfd2141c69b34f6bdef80128c3ae35726624ee96cb977303489c41a4c3600cd3b81359ae71ab619300184f8f72e45b1194593ec90a69506d5f7703da6dcfaee721bbad4d09c0fe49ac0ffd513c615ce18d04a32b594c6ed4a218fee16b6f174c899b30fc443a89e978352ed68cf712fb9c8d064616693f6a566338e8ade6a3835f8fc7837657e0f471a3305642c38f5dc8ada3424e9e660533af7fbb828f53bb468bb5b83fd66852ccb123df7188ed71df2475d77f7f003342f5381d3e38fd456c35ff6ddc175c3b341a5aa5694607b37a06287d89fe6fab0972645d026186b2c0a0ed7abaef81b6059d5a64c27b7551262b1ed9b50e3e11d33e2ecaf95afc9c24d1af0f76c7fd0bc28e9362bf282d306d5ade0ea8bff375cd45f761978ba7f50cc2feb026d0eca3a0d69fecc1aeed91ae89c2a2df5297ab309c60158c0ed1ddd752faa2832c18051d0e69af2a538205f594007f8a1bb9a1a6d8067c07a20f0202fb6acad44851c23078b8eb3159cde5dc76655eee8dba85a25a814193cda6cb3064e025fef661feb70e5cb89ed16430407ff24c22aaa7b6246b22ff228f927d17a7a35a7da1cb1c7a241e7268fe5028f88b9373c572d26f04128045756305e018bce68b9d1133564738c333f1209d6a2eadcf6c91285d15cf03791007fa6ac0de8d7b54bd05ee6baaf63d238c350e7f63f3197f2af70722a5e540b4b2bc545d49a86d3381f8b8985ff53efb5ab8fd077383a5ac9b1606d17a39a79875cadac81639615e38ea69dc81ce3876e38cf4aa90e899dacdf6c6f64bbeb14d7b79f65de9b4763c12c1968d8d5bdbde7e852a43993588e47a7f5473174a62c89fc5432b69e4fac84c7bd91213b70014af0bc92329447e817655b1b51c689377a680c92f56cc9307272d3acf2e8f10300da4d1985f9989c7464b138bc97dfedb33282f722b7946e4f54bc98e516b364b9ba1d36290c0e6942d1c8aed6ec0ef459c989c753d0997f66cb56acff0c9a773ac90eb5bf658c479e6e826b779d68c70950bd1b2ef686aac0eb9e72709e95fa9cfc2c164b11a4bc6da5693948334f360c5c9ac7f93021ac766aab93bbbe74293290ab2bfc900fa47182235e82490f6c5b9212e97f9a57be3ba111ebed29b4fb074fa1ee68e724b2e57d06b959bb53ed6cd374671f41f3d36b5dd0f554be2d16a5641f8eeb87b39fa6d7d60c33ccc65256de8afc5b4bb9b6b1ee41e45e32ad7497ef36a62345ee65cbc809259c514ba664465c7051e970f8c485d06995939a9f3ab523b80042d7f9032cedc0af72fb18121561a3b023f7641745941c68c9a335f1011b961e48009c065aad951304f3ab0726bef18cee60fe0c1a5d7bc240e8adc5a80d2cdda3cfc180ec9008b9da824457625f071050f8d41607d006e636fd525c2bce08bb2c79e163f86368db96f2e4782bc4c751b617c4b966c9569df6cbef999ae5a748d01ded8cc7700e99ee3887c53c2b8a36c46e7af780d7a18b1e22ce8b45fbd135ba8fb7765e11406c4e344924e905d08fabf7f40d0d6e218f9069172718c6a3e92e8622fa040b9afc14e7743985ad88c74a11589fe278401ef131a17f76a7df1aa43c1f506f50ec1ed12419cfa00389dae9635305f14c137aa38299b37c35254d744ec6f55fc8c5c3084ee5e8342e3b946ae2708babcd4891b5872a6fb03b2cb3b61b9005a10c2313fd944c1d7ad60112190a4340ceb2f918592130ae36d4387ae5f058c6adfcca49b9d47f04beb8d1541149e65e7b5619635343d54921c879788c4fe49d34389dca05f50cec8cae0b9567f2889f4d63628d4469de1849eede5f11c0375004ba02da1ac587cfb2ed74d7600472a99a7d0a95e8e69963c04821295331fe49cd16a681958ee54059a2e173f814bc4e9c0ade75951f020a76ee9e25504ad4f63df49de865e1843ba15e027bd334027b283526e0a57026c05a0d629576c0257c0bea77f75800da82ce1f99cc7afea2a5d397beb20384a3e52746353faae7337c035472175bd2619020fdfbc9f19eef60f1e6a01fda4169c0ed7b667ea2e83631e46607c53fc3b6dfea1641b2708fe59ee43a879a564e4c7e9c18f6f3bf7333723191ca826f6dc98e680898567347d21cbae2ff83587ec9cccb4d82c4a445f7b9782e887dc28ca994ec666c37f0bb27859a28404cd85766bcf00b05d471e5206fe22f6e72f2816b185e845d3daeae0c4083290c34423bc977cacbe8c2f9eb0580fd410cd2a2262aed152f681758054a51c70930a25a0be184c6975af0e2d0e00a154732e3b8027aff2b972dc38000871bb523b40c8868ad7884665f30c894264f2a25f3df746869cf646cbb97bec08fc6a674f800afce5e0ed169fdb53736979caa69d9c1fab63449ee59a64501cd1d073aa18bd248aded80c89aa8b5649cd01c7d12b968e80c9e106dfc263add9e2724200a59b5158cbd20832f4c18829b8c13c9910f4d35c41e09f810614799a533e7fb38fc097386b115efa07aa419a6f6f145eb036291aed195ea4d7590bed9bce7d517071c7adfabbb93e8a0091f79b84de97bc7b618a06f9752278a486fa4e80a47a33a02767542eb3fc7b64ae397a2b621d9120a389f284f58df17765547272b6c68d698d5a4aaff17cf081d65c5022cdf63ec4d9b4d4f859526cb136d839431719bc49ea0d1890d8c21ea9040d44671b8790889e4f5ae0f34d779f81ff7ae9485dead69ee926ddfca70deac934ed4ec357ede6b333172a0564e0db188e77551867a9dc533e042591629429b0ad0840ac75b7b4cf566f25f50f5d7239b45ad35817723c86b4e14c18f39683fd8310f2bc9b2ea9461198ac32832f1925a81df15e0965af0a51452f60c255fe4849a9a7724a7d0cbea0068cb96ff4eacc21b5d222993c786d18fa5f5b5ede195bdbf2c7953f82c5b7cefe5f8b0f5b0aa0b686323619afb706079bf6f7889e0d0f3fdfb00a97ae7dc46a68007724805a56d25f551cac711d18be1e59a1d4801918a46345ea5d09c4544cdd67e5967d387e33f30a7a46e9f03dc8313a5ef50cc36a34ecd8019eebefc4d14cc0a0ed19738b0ce427b3832cdc88f34cefd227c8c7f854cd845e2257a2e304e354e5a869971503859fcfffe7f3bf32211c4a7fd89ad7ec75109c5a7771e6658a5b8972ea889a308516913e4b3f2ecdda48f0148b14cf5b3b2683deb96dbcb8447aa41b98de0719c91c214041104a0270b31373ef2230aef6440e5164e1c6ea5b431df199896cd1e255ecd4d619dde0d65914223c413d05589bde5df207f4ab3c933d4ac950d1e8ea02fe7fbee6fed7483a886bbaf02befb286e500806bdfb431c274c78cd2ecf37d349220d76b0a4b3d7661f7be1c81d7b9a454afce1de303417ad3acf4ecd714b69e68da964ce3b39d950073c74d17d1b21ab0121b0f7b2b92b410296d3b31fcbd43291824e73258e436b6e5ad06363137d2024c1d5227d821faeeee1599e8a618627fdca7e2274bcafec36950b23029e8ce3829934e6aa1fdaa519e69b364e432bbe2d983e9e077a284270d472b3c45a55ed58e29c518e01ba95f3ebc6843adf8c6a1859ca3da5ef0a52588b01133db20ede8b6bf9037f1d985410e859fd5507553c2da8e27fa4089432117255536e453e6bb2b376ed84a76b34e5300eeadeab54dbe05dee39e1594f802f918d3dedbc32969e33b5a01d592051a2e5ec43e24b6733abe8c4f31862cbe380fcc396bf3645c5c8e82593fdd3649d0fa3a0775c2408e520ae22f56ed5143c0199944f0ef46200d11ee0b1b590bb318587eea5eaf599850a7ffa992e68a8ea8a1b4a15679662390528c803e6c8a2bf7a66e60b38b436c9a41745c285796e70c0c1aed1c25b7753d4e2d792d077e6b435b1e3812e9f2bc377eaeaff448128891d512577f7c3e9751d205be54f787819e19e78959302d6aa313c4d500238c5df8aad9c3e73080e1512dc45cc688d32d4d486dd516823f682aca9e4fd4a33456e5fc59f8cb94c2c1c8dc11e88f8c20018d40705ee029701471a261ec85761c9fe2c34cc126a300b1c86b0e0fc5d2ef96f20cff209fa34635f8f67e1dfb6f97eea1a5e96e7ab0d8dbbd5c887fcb69c61b90cda70048152c6abc9091c1ec7d93cab0763e31e387799d77da8ad005a53b2f9879592a0bb53904f9f2959e0e112249c42e420a734420d5e0579068814e47e3edfe47391321475a1e496818419faae6cc07553df5334c54614e64fce93884a469511bd1294d609d095ca255bfb348ed5eafa8eda9aca12317f90eb42d4ee82a2a2e49f002d7da84ad5df1c5da7e8e6ac3325f93faa9da170403335c8c7e8a81bc5f4ba9da67ecee4da7e52f0ae5caa238a9c47646e93851249315bc9b09e3a31a9244260b5fac3fc8375bc57e5e7597bc1b69e4821044f80574aeb39d64b2ca371e6672625e5d870953f1f02103dcd95ea8c61632caac068dcaef4b987454f01589fe130168d13764a788994e2d1e8d21babb5fefcaa771714f337be3b21a7024f9ff3d35881fb6971034146ab53d0554df678472e6db664e6a4cd643a47190912eba20872496da7f4d312e2c9ac48557094ae9312471938188df3897c9df254b77eb0cbff8bd489edbc27a4e39690c18c058c0c5ab210ee211ebd2fcb34824b1d549c5f2aad851b4d5c1ec06cd0077541df226b1e130ea2bbdbbc63fe88c89b24f70966ab1dfce39bb87da026a67ff49a906dd409f6337df8fc462147e6fba9574b75b5e8de48722304541881536c5aadad8337e39249edf90bb8e416913e523499183d2f7a4b0c1ef04b603731d8c90512c2213db07ec4f84e82812ff046c7329a335aecc78982f6e58bcc71bc32bfd8766154b10e2c3d17a7f20dd79179c8490d8837351d026ef36feb0da7d478e0ac42f1b4ca9547b5f212536903c70a62249d9a9ed296d8088d23da3ed8a990868b924c1c6a48c89c15bdae2592fbba75e1bf222243a58896d9f67e3e89590a27cae9e28b4c54ae2d9b6bcce1d85acdecfb89d785ca8f4a635e5c159ef5a5166f95b4c6c08c17531f5fcbf3f0d616f1dd75dfe36a44ae625e0c25008fdc3bc7166f9707234fc9233de2c592f062cb734f80e5b52f318ed56bd9d5f347a502d24b73ba40b175c56c8d993d4966bcc1ac38ce47145e7c8050b8275923773ccef650487f00ce08fb92b5aacf1020535f39c5d4a8f2dcd0bea8a5d455fbce8a2fdfcb1bd82e53d8992d56efa2b7ad8a7dc1caad28940583108af805c7ffa18544739d2b1183b01a71ca9d0fe3af02759c48f96b610facb5d76ecf74fe13b377eaf191ca3c1ecc12fa1c0199483e3345e496889472a6b79558227ca117cac980dcc575ea7c197a394713b36f3c31f7eba3631b8b1dc881cca6949f23f9cdbcddb3a6d99224ebdc9fa8ab20e75f8de8fd9c257ce6f65c6926e80719fab1274922da6e9a629ecb3cc1ea1fadb07a0c715af8033b63ae40344bd1ec638aa538b161ad5258a5698f2e766c0c87ecd77b6e1b0e0130083284812caaf9ad9034e85269f3fa2bd2f1042cfcc480749bb5c0e4ad81d7e333db0220aff6188c6914db5542622a2ed014a3a2f3c216bb05058cf013d30fc55f402b5de122dd46854d2bfbeb39e4df71291d81ec830844f865c11e77604cd0671642f503ae50726ec5ea45f1416bfa439b3b748032e8a2a341bd2fc177daf3f01a3a5fc2cebff94706906fc64d10902407a4ffff5d12594e4ecd07228369c0400f0c7a90e6efc2e79371da57b16f28ca10a56eaab1f137a7758607c627ff596212d1ee8612fe631ce1981ce51d5e5e2fc809f5c26070f0217d51301da7fa7abac55cc52ba00e76fc38e5ab2c521d4e3818b51f2166055243f540b9459595f6c9cb51ac18dd847e58e4aa7837b71ba187edd6b7fd9eab2b66c7a3182df276169e1010c80d9c21b900d623c3e2e106ad9319d505404d1efff32ca27938796df25988f6d117f5ff828e543267f2a3786109e1750050581408d00131b57dac715328fa6a6c2c350028a2ee6c4c6bdbbb76fe2221bcf568968d179ed7bd23f2952746264c2892d25a613bad2ad725461bec71aa0c6d52381624ff8c9a007b2737074b7bf6fdea37a8083d10b1ae583e14393183394d934b51104ca73ee5a4dab7a3b62a8932e3f7525701792d3b07df103c3a6b4edf0a76123cf1fdb5f4817a22a5c1999933a5ee89d0adb2352c881315fec3b9d233160bacc021a192319f17998c2e0cc09ad017306de85cdd25c4fbf7860826a853d4b25c70e7bf4862b2ecf03b3f1e26ab7644b54ace721963dfdd2394d660bfe330b1c80d95cbba0f13693f029f22d40c8e549067383ad1213dad18ed1957759f9e5abf7c2f07636737c7ec89ca1175f2d68b699168948d0302497b7f2d0891e0cb89256859dd4cc1404c3cd5b91fb3d6e5f103f73d8dd27d05dc092417dc8b6ad761f6d8ca88b5a906e1af5ea4712b223e9f93bba86f1713b40cddf02cd488237c10ac99b6fc1a768b4f74901d71d00d19f7f07b357a6892e92e89e3091f6145e3c24ac44e556ef0b8a7ea8dd8e418b3b4c51f08e7f49899aa9750018807977fb7c1eb19aff269f01a379a9c55f91186f56acfa6caa66c5587a91c7a69c3ffaefb2a367d4559cd57d6b4ab0d96d5ed33cf3852b67f793e1eedb97fb5d114bcd25a2fa395777c7798a4d351dee92bfbff9f3a70defd1d89f002e344ade180a1cb9936bb230485e9eac0f8398d4af2b90aa8a62f7f43593acee66b491a290a0f670077c264e371b1ffbbf12959283b6cf4acf74cfe86ddeb02934a1d06bc81a8c5b85b65ba68397182a0dd265b143837c57e1a218b358e872a7098462268e78787f3cee55442106abad2272b798a42028ac30bd70487da761a44f9b59dc8e7a5d09df7a4d9e4bb8cb736f9aa62743481d4ac227dab4cc7e666eac1c636c86f226401d65f91c6ba01e07b3d87d9dc03b9bf6203f8c2634a77d3247c3ae42340596956a05e7e6a5d2f7c93981e72f6ba6d1adc5dcf69211ca46d4df211e47bb163486b8ace453c8a23e52d9aae5f7bad776ed16c9cc76b684795a55af0d280e0f315243d727b226f3b22174f8dcaa5f69c92bd9c2e31ef7a084252e3fdd2132d75f1989313615a581bc675e08caa062f6c05086eb46558fca7cd0a6833895f7cea4b6810b884de38e1937d7f6d498495ed283a46087afdba10509741b179d39d8bd0022b22b3ebce426ac00a4f378aa13b99028e342a815b03e2a9cc6ddf6757c152317f62cbb9a60e0a29ba408f0bd4e7e3941c6ff220b0a27a15dde3d99be7279e94e6628a12e2235cec5643f3cdf7d04e200dfea65707076847d5d763fc38d75861e8595de0fb9db056e3d40649210a88c78f64857ab963feb44766ec941959b96e381636498d4853604e8f3144720cdb248ee3e5da7acafd9aa6f77bcc3c2e1a405a9a3f442bf2e0c1b09730011590d48f36af295466a645e8f20ccb9169bcde6b22b2e63f32ff8520d6803300290fe47f9b287fbf81f532ab7a0e14c3f764cdfc02704a98b036bbdf926933db4b1994340f0e885978e31efe67ce9069bd0a5b01bcbdfde63bdf6f7d5259d43c8aad994259c0ef4434eb39207603ec953476e230d8f677a4a8bfc1c1a6c145a9ba9ea6cb0ec394052cb784272c48332fe951cc2c26554abbaa4fe5b5092393e02f5671622124f267696df7b56441a3b01cbe75f2681212b11667095e654f06bcfe87141d0d4ef7323c234603ecfbed8360a917c31d4e03239ccb487049a91df72212a0c3d5a25026863008d1362eca9960c04a831509558af5a3a0d6b1de9478b824ee92d0bd3478b68c0239d17d9c7f2d60d9c03c31c204900a0c99775118b0ad9376a8f11338d358ca9c2c9c3f5d60e02d9eb52d0ba1504bc3a6ab51087e0119f698b9dce7cbf46cff4e866669e7e4dcf4373680b119146da1d3b831de4fcbcaac95c4487d71ce9cd9a019e65d9450bdaa75da33cfb7211743a4eca25bc9e092050e626b494a4fe6770bf439071dc058bd335a54f176f5b843fcf5d077bd09b6469500dadabb913b5a4d5307d6038fbebda4ac83ee3472fba3af89d3b724bf68f7d1d38d51f1baebdc0786410397743c41d5653ea7267dcd0c77532dc851df028e93a23bdd1dde42e30c4c71ebd52b5eb905d45eb34a22ee977c2f6d2052ac4bbc60e5e9a1a72c7eac4a2994c688714be697b919a9dd54a889a5cf213d8f5a513094b176ecd675605b55912b8e2636c287af7b04b1721e81dcfb635ab947b9a1b5739a08e55811b33d2354a9a649015935fb4f803cea64f2a17ed8c93010622bdc0f115b16a86d781e250e82d24956c1f223e6711a0f492660a00d9936abd61b2cdfa81eedab023e774ff7a901c443f3a3613b24436470053407a9fcca4981f969a8447b6f69e28b7fd17311401c061acecc48efe9805b49f1446419a81b0a1cb11a52c592a4accec3e71835561baf3f748b049036506252225bb07322afe5030370e7e4aece6479b9e2d35b22ac2e74fb8b310e44e6bffde04cf5034cb131f791930304c665a9e8e78e562dea33ed76a92a26f555f7c0b9a47de5e6ab0e4b1c98b3a02b677a4b3d8e710f0d4bab77e6c5f69fefda98f8dd528115665c9a2f1065e07efca8fc8b63a0f75b6a85291f6a72c6bb3dcd86b583d21ab4345cbf99fce091b51a29b27e648e4891350b298d55bc1702a215f254238e088c6a403c4e23f841c9bb89c4c0da1d11b6cc86b05c555319a9f7a07aa8effb720cf9bdd4600d00a6df16181368556d8b8ee73493f247da592249c7930e4d571879378588466da8d6933d66a06f03447c8d32afa8ae634800b980c8c35797491d0fe97100f66179e20df30cf3688555ece9a845598c5946a35faacfc2c711c1b1b2b7ddc55e7f1b6d5c8c14f3329ad628c830b645da09c64da9aee05123c08e544e926e586d6a0fdb1db640fe55cffb533493ad7a6db0a7fabcb600fd2e8ccefe8f0a74fd36bcd79a941ce5761b525b9131aa9de92cec02dbbf6b287a6fffe2dd706777ca548cca02869d2fd4a1878c3e8b02c0d0726d622720d061d4c644abbd7b4e12f000093d728f9bc89435071f932f4ed6cfd6be4c04ffab2abf04d591f4d50ba04b148f2ee027cae26e5d525cd60001e910aca4672258ae0040bbe3553e6061188073393d69e9550f4bc3419fac64f0329dd75d6c723f66569383f90c493fc5197892130b932befd6ce93efa05cd54d89725daf953f8149c14638ca2c722d20ad2b9bb4edc353ace960bdda8a946f1527b84a4ceef50eb6368291a0fd2e096ae527b9c1d1553f964cd15d419a1ae347f1e3dd584253079213eba2aa831acab377ecee5b9b375f1fc0b0e5f5a654aa328da6c9011d343c290a9426902bca6e0383d82d383af5560d325ea3004629a54ec995463834cffc3b5126907eb6716102191fb2dc8d35598183fd2ed552c531fe159a8ee3632406cc4655ca571c84322932b386c221db04ebb00e08e7c4a73343eee65eedb4f00a761ab471c18d2a2ac59d61c1b4769b7e89cd1be60a613047ebf6609570e146f64809f0248bf15c71fbf6aa30ff43b61b86cbeea8bc1f19aa430c921a7210df401f16471fcd65bcc8550a5b95a15e00bd56e379306f87fcb37040b0a0e93b4de862b1062a3ddb6898fece168cecd83acde629cae07b6e9278c219140bf61ede9d929f6d3207ea995f4c4cc1f224085433f5fff82c9fc1a0ef196a24122fe07bac058955550e299625b63f5d2a5e5da183ba22de6a07c11f88d648894829008d8fb764da68c84a8e25d349d92ece49fe1dc41593461c788b240f9cfb5abcf6d5294a8b049c03574f95efdda2047e5821149bed7514fcf72435a38b303694eac5199e6af4610a8b8ed38a9404e4cb3adec6f10721e92ca4d15b1ba24f97ae14ed1c7e1370f571518477edc17ff07dd062e64c97efd4f4346b308babed23bebba2ea1c5ec66b4f8fb119878f1379239262be0fe777e6b34c587b9ad902d39422591b325b944fdf4359199f6efbda808b2ceeccf74273ecacfc45867245baaef66eb34a25c89c6876bf70590a0104e88b501affa0a2aa455e8b9a7b3f9fcec36a9483fbfee62585f13937ed0dd2a527492657ce3c4e7eb156511fd5a3e12e187dd6ffc0d0966c04dc2c75404db1391429a98e6578dce1eb802d7f43a147092cf898f6b895f89d58e62ac77743d7ad2a165b47be73b918ea9da2e9cf5b4b523634e5e5a779d57d8c0ca6be966d10eeb745ad7f364417cdcd3650b0431bb341721765350f52b921656c92a8dd64bf24e042902fcda575e6bd0ebcf5b134e675d603ae9d31338688c15ec2f44b14bc12392499a9f2bc4c8343c833a2dca581509cef8bd522d1b21ef02c62e0489833cf559c42b8ec1307d2a15d0fa645d82955d452038e823f6320a0214365189d35253653f1f00fd1b5955648ad6190b8f2532b1a5aabab2a427ef4fa86f87d06b3eb59d6f048ff1a7d8784adabc7d4ca54b0aefb5f04785d2a4e9f249b8f005b6720327f8e099ce722824d6c79ac8d6a464a36072a235942146d38fcb0e8b0c5dfca31c2ec4370b166fa27d8b04ef0fc8adfccd6bb0931bdfb49727b9211b4ebe4964cc3db23dd1279ff702509edf8d0d9189c7ee77381b426d4aa3fe5d93304d1c65d917f24f0abb4865bba761be3dceadc709303495168e05e355f2befab32e7d0832797815586c4d6e037741f937b678cb743500e45e99b6b677c4b1c0f9f8086ea73ebbaeb6fea3fe3b470bebcb46a17fda7650ad3e3c3e4959d1fb6e779452b092caf27eb167617d4fde319190a0fd7c26cf93ec02885acb215eb52aa933278f18bafb0344a2b3027f95dc3f70cd598fba80531a16162fbfbdceae93f8bb94f4bf9feed5599a962b9342118a076bf9815bebeade6af8486f8b3681e1b09c97121d281bf86b7918982a319b0202b6591ead634eca1d2b18b3c6ef8cd2d35ac5bc83311dac46eb5d0c7dcd87e186a6064f8cc0ec9146cb8a4fc310cd0a97ff08cac9f0c1f2960da8fa0ae077b3f245fda478d492674b9cc759064f5b24186618f545630c97aef7fc94d8c334f222723cc24a2dbbc1ca15686c222ea8ac66171bc4b0dff860874f8e722915cfadc14bbb44979e38425f91928b80f234bfa9afecff149f1939b677be40106790db262c907afea5e3da1f8b1d35b6302115d15d015399b26871a4720e3a22aa18b65a71e7d3b6e20a31754203e88f9ebb752d1a98bb985b7f624fd79f803776d182e0333d474990ea400f94587d04f79477c883aeca6f48d63169e1a088e9546a2ba00c6974bde13787594a0e87736b7548f30e649064cc57c4eb2a1a12cdbc5b365f5eb518968651b60572bbf31ea42e77c2fa77426908d23d5f6f9d3949ad5059fdd305952298c1d89cde3da24d945b1971288afdbbb761237dcac379f93373995fba7145a6796ff918484b85b5c2eeb658791e2a294877f65d6a145b6244cfbdaa52df406e77bb93a883307409a7a411c0b5e08aa282f0204d7ead0f2b697436ee4beb481b41be17da3d504639511a8c3f7399e6e9c0552f18546bed07a6fe0b427ec9eb2d9f670174b2b2850637692b4b731c50fac33209e38e314f4be2ad7acb27a68aeb671492fbd9365e6bdb85f431a719bde5110e4f1c22ac82a96757a75c201b74c4459795ab2d85a750fbc30bd7fafde5b17039a811389a66208d7e249ea779fdb6f267f7d4352d4b3634dd416791ec978698853200f020f0227865b031b04e004047600169fe68c06bea2b399b4dd3107dd902eba05255a274c041da5a8b45fa7ed678898705168207d35a0d7e71081cbc97c63707146a91da799c9d4039ecc5deaae228e2aa8db515f821d2c0a330b6b0e7a3fa2508b9a3f050164ffdc17b239e24028bd7b18430a558da59ec02ad986793e22852ac9fd80d2210bd2e60e75533da0ef40df99bb82abc0ad13e548bcec04bca23d5062a73166bb2a0c0889aba4bf78e7371d0567af7e9be1da0a73a9cb63fe7070ae130b33f97e75765c47e0e5b10ec697a1901e62ceb8b34c7367c54e973e0dde6e368c193ec04bb8c04190e580b276f3bb31bf15a20fedfb1d298bb829ac5b04465b5eb7cc37d671abb8601174ec975ed2dc045f54281055b7c6ff644b1235ec60515e8da74975efccbdf6910632c99d96529bf30d919d7fb1f8339b536fb86c0fde7300b4809c6daa817d02a37224cdf4c03286599de475ce84774f0d40d8cc2b336486c0b539f040df1f312aab6eff84b7587ba63e14d0282fa6970a1c46946b41b059f099101539e877eef3278759e5d4527949c4c84ce1d4f936b8f0a0ea6b6c6c494f1ef97554433f3ef229cebea7be5ed1b66f2e0e8f3a6b942c671be6b6e38757c694fc4a05ecdff90c2fbfbdfa404d7aa35662c50a1512427a0e697e2e72e962d072f373e513637baadc8145bee9506fe7dd055879c9ed1c00f1b350caf2eb12900243c04b332592a17ad668d0617d9aeff47248f9a5c7121bb602916a1a4d4c4fe3c51ae2c1369a1ff93f43fc9108eca0efde1e58d29e87e2a70e637672035b40fc34cf05548403e2ae80d2ff524c9cb3c2c03635cafdd24379c297b7658cfe8dd131504446e190f83f3f9ee1d94b25bda0a7d19e23a44493d98d4d332b7b6dd040c2d7afeb0f19b9542eda44a8a05f1d092c29201a559cdc3fcd3781568b81713f7ce3cfb7400e45fa3a1c52e8885e9e70ecf40450c4d2503bf076fcdebc4c74ccd55b2c7f92679fbc202ac3cf082858c3834d0b4a8ae9bf1b4d164112dc473a3d9c393346428cb886a9c347149dd8d38b4585015be7b81922d675b073713533b926bf1c85507cb9d9ff555fabf653265c300200076252b8a049e028f5d828ff8f59981f7bb5b1fa2520ac37b215acc614af8e92d9388d79d4e296e34e5a2e3567f62f37d9d0b4032e08a9822cb8b1819f14de44002eac90970dc21935c250a24904b0328192d88d98a868d3d030e2ec35891629beeeab2ea04dffc9d32684c691b072e72e3e5476949f0c59792547173475c86cdcfb7c80a80bb8a5d15a63d411589cd7b27c1e5377da55fd4ea034a29e8e2c9491b32943e207488968f12a33af4a3df133e44f1d861065e5568c4187fc907ebbf4546fa5a0dec8978f867da9482e7f29916017df10e3848554abd2a8d8a1ad18bd96d73fdae0f9ba68baa85fbcbbabcf6bad1c24bee79b0e98940c2916372840cd8fcd5b5ab82f29b93ca2290fe7456d94f1b97c28c96cf7cf1ec73d4dab8105c5583e4878a8b61841d5b5593966893a5c438384eda825797770bd7892a2f50f637ea7d089f003c45c58e410fd19df67124e3ce31a848421fe93e8dd6ea4200e5dc320911ecfe3d385c9bf89b87adc669d54b936ed361c1ae7b911cdfbc5d55985948eddd24a61f6896423aa8955e9ea4fe3de482b64a9620b54f1df33bf7ea2d311c0f57454a2579303b5d69b030294244993f0ecf29165c8328290e9d81dfacb1effacbbcc0e4728070f6ac34ccb95901594059dbbaa193e5378de664b8122f91a0e87e8199cb830cd3fadf6c39ab31868958a913f797675e4c5c447b89c65a874538d9e5f0f4147c0d80a00d0d248a017d5f5e97cf5d4beb2dd386f6eb77864885baa038d77badd4f5864e53eb27b0ce40f98c6fac0dee1c47fddb5506cb5bd570b43744352e84afbc20688a989d47b8076be875c3233f11fa766f5088c55a1bcd3b5904c7b9e435f30ec3e965dcc61a21602910530c11d1c64aba9bc3bf9b13830a03c64f048f582f1d9874101f0fde0a4190938607119bc281987d49e1c05cdec3684b6ce37626e454914c2ec7982cbacfef7338fddd2e6f2a00f184f8cdbe9322e95b5cf937a96cacc439a8ea6eeb6686982fbdf2ea911ab8a1b3a0ed0f31f0e4956b3f4e57cb9c14a016fcf036078fa01aa844467f2ec07f26ae5b0981751a9aeb4247bcd9048f0f2c25f6de62fd9626df0e3927606cc06280f1d3553488036995a6195e8f226a220669053ad822aa4e558cf27dfddb0288c8ef6ece8beb6e0840cb5959fc34cb4b410f05b6c05cc0e1800e4fbb487648b91a1bbba88bb1602869e1b08b1a4d3595d0723df858cb93f271a56c1577d9bef7429098629276b6027a6bc81ffd944e2797635f05b410512c8ec01072b2858b9eebe3612b2cd47b4a9fb192ea2ab94f4feeb1a1a3e1a3d182488d3f246ef45930a4648208ec8d68f35027032be94c7993d38f799a0ec5405749ee0f21d6e205ce71b3c4e5938e6a2a4bb112ee97df8967c32e1771e50776627bd2fe23f78679eaec9d86cce14663c8a0f6e0d028f7adfce5837e4a412c70836b585800ec192f93d68913eaa94b5ab2a3c33f43af38c05dc29fd35df8d1b86298c8671218578cc86c87f1af4707acb9bcb0271894718b326e7739e7001886519c0d83ad2b59644a9e20ad6de5cc711f8037e8763b208820f7bd072596a11d663301cf9e6864f1ad6069fda1934a8d0e55d5a56e9789342941cac3372603689ccd0e74f2687b76cfc1e5c8eeb254fe36411354544dd934dd2df7d1dd9f1483e7a5072e31fd7491b39a7618369db72f746a948549f33b717692398318e8b3ce2520e0a32a009eb697836c90b06e547cbe422eb572b46e45e1eb7f880d6873808af108f0ff6449cea9e9938ad280d8090c5f53bc2d3bc885613f79a90f59dcf9ff0543d2f0e7990e45e3f742dc9ad327fafcfde7a441688bcbbc2fbfd68ddf0f7070e14f9b07dc610c2c65934b4ff420dc0ed53e050d9021c4fca70d1f11e84eedaf0b9b1932c4f283e2607a9a1a29431c8a73c4edfee37e9cfd86acde4fbb9069dee56cad117763e8d8d344a4e8d483dc860a6a140ac14d179b8cbb397e6d04f2906adf368eb8ad4bc9ed71cf39b722149701ec9f781ae2ea43d2748eb9197f42fd916103a4904536f9b093fee8f44b853b29badd7e5c87707f84537ad981db0f92f7bee9342fc5bfe1c0075bbad17a4a7920c416e07b57a0d164a3e2a53f4a97d4c99ad13fa4082b579d0e4af027879e1aede041c6ff4e555acf6fcfb4981e2f49265feaec3ce0e29face8bf138429d166b72bad00d61508b8cf67aa06694dd6e407dd84482b2d13872da24a08b98cb88a5dd509135ba34c822c67a153fad631de55696b37cd83fac681821c4346ffa42ea34e702149f83747e551814e597df5465675f7b851a88d3e9c2e2d1a98bb985b7f624fd79f803776d182e0333d474990ea400f94587d04f79477d10a4e784707f613f3eb155e406dbd78095d7f439a296e90274d560dcc458b70e83ca657f84e23bb8cdb3857341fd82b0f73960020e1562fcdaa1e6af7fb51e4167a94196201edf962b4b7be13b8b175271cffe42808b8e16b405bd3c2d27852b20fd4733798d8f6a2a4b9a041c632cda0510addb07c201166b5db2c2aef74751dd95d6b4795aea397fd6f9f2453d3b81b9dab1be3896e158f0ef245f2af09ba77cd756ce2238913a07c4add3b8131ccdeb4d0199e7120945d06f6895d91fc49dc02e4e7106e00fafd5641e91ccc13d7ee425bae617cd34d36583623a846fde6e6a53b14f8564d04730273185d6d4b2495c97f8ddb01a3aad66f97d83d2acaeabb1c2d3083bf420745c5fffe8f3a36c1dad8290c1c9a811c37710c55f727eb5ad75d6109df99c28335458ce4677a83a058e534db7eb6770bc3f76744c56ea3baebdfd6871753b073a5d55bc6c1d22e180ed33fafdc24c19d3b3ead5f35535994c7038d75783c0bb2a9c17fb01b45f820521a65b81f6773b6a7c6f6791f15cfb13e950a69a6dcd638dc6dcdff21279bc4fe7522e76291f347a7b012128f31bfb98998f9b4f916025eeb6f65cb696438d8ed1f6ca552588d53c88e24e8477174e3d566c158174530934213396ec6b78d165c7e53637b316df54dace1b376a756d9d0fe0e8109f055e0494eb0c36678297ee769fdc44487a64c0a6781fb78e827fbf1a971785eac6c1f02b13a2924042ec9cdb13863cb50df9f4d2b8302b441cc0b37a225ca5745ec5a9d759029dce92c5c21f61a986af96a94cf58b85209d8de907357aece79022f31858e7d57240f6051bd505de0a0dc38639ba67bf4cc572abb4f33589b691485e83c06f40b1bd5d142d554ab1b66a1d7832de424f480c63491709158a378b43d9b7acfb038e48f9b3816f5ed2821c8ff9db4fbd7909a7673626281ba75a48da216c05cc688c850190107cc18dd1db541fca01f00f33d4aaa8c6eef17bf7afee39257332fa156c7096be1ec9c1785f6c8912bd80c4d4b26e38a3bb87d8c1c6e85ca0a29a956a458e343da4985234685f1c3b35093dfd3ce9ddf45b1fff83e4dcd5cbbf92ed8dab8a23ced23804fb11c5c9c4153194c58cdd3ce78098b0d5d6226bbbc172d5959266c68077535c6538bb28156e0d567ce5e49925ac642d1d09b435f027793fb08df5d25e40c3328d07b02b451f77f31b67fa6aba59659d87e5ae99afdddda863fd077eb473a279b96a5d067d31077fc3d76033d265bb5466ca358a8eb62e63b8ff94de2e5b1a67f7445c8fa1b899bf58a615145a4c0d37ca8649782a6d47ddb7faa37c49ecfc1a8fe2dc47ef011bd98a581ccf40157539c2b597d3d0f0f42114ffbc3c40381766c7115a61849f70ef0e8d6891a1dca14f245fe633349919b1d17972a7f64e83ceec05da6ed68d2b85c14cd9fa2e1780993cdf1bf35b01e7c112c5da043685602118df760ae9e4ef67c0d3df9531f339c7c2baa4bab09dab3e5f2dabeb08e92cd8bf62b80018d955f809d8da2136ce3bd3e171d7a64e70898c4d6d64447f6625a83758b59fcf6d1719be1c9c4d9ebb4c41bd57f071e9b771fbbbeb43ca0bd622918eca0f4d24b164a08fd7d816ac1d91487c56fe173362236607c241c292160b68c6fcc01dac2191d45f7902a131f45dc1d525d98e5ef61d579fcc07844a69558db577db0c818b78c071bf5ef27a158072912bd841f56200a9fb1325dc7d3ae6a11e60aed21d927edabe7c81f0a9950f926ad9fa741333656361a34cc08097528ebca58439480f86507ba6ad447a7e3edb1637427818d9b351979e7c60c38285b6cecafc1d4946f5fa93aa273a407fbb65cbb990c0fca3ae610e1518cb633c8daa8386ed0ba511e5c09ea1bc4cf4b8d002251657621b6db23373248b9c8759944ef82979213066156e2f2336b1a5b62488e14f0bf6973783df65a23093aa5e245352860386581c38c3da6a188bbce56f688990a4ebef40c54a908410ca3e682208c158e27c456932a73edb99587e3ff4c38fbc92b45e0587f2637006205755c11dd8423c94f75c363f3708ee31ff3cf9246b7cd25e35aaaf9a5a320dd909f8c6478b9e837e9d3ed9095cd407b163828a300285d623462480805d5ebffbb0ec984e45d754f35253f61b7e90106ef0bd5813e9105b96660fee6834284ff5d39a009388be98b88d45fad2b9e2f96866614256389dfb950711983f5189cfd89d9c3283f69ce922462cd975ff5790be4ad53f10eb245bc37719dad1abf1241c50cb5963683e8dac29e7b128922aeab88e8aaa27cc33f9832711f0ed07172c39e166946e96542ace6f759dad13f8889c69700c1d53b0b494826cb5e4ececb2572a0291ba59d5ad86aad7723860e6c773ef3aec545a88a8bddce25bef65c2a4749e2500f772cf68b7c898c73e640cbbc9ced3149b41e7110ae40e739fbbf991e1a6bb6ffe1852d9636fdc2cd61e9bd2b3c1a3f46942ae1b7167a61f55595436be8ce1e1301c12c453f793aa6605ea41b8220fb441efdab553afedbf479181a4787b5f516a6b21f6bbc8adc3d419ab679969bca2dffa2a6aca5a9f14b481da72a8870bd3b59acf8e0281e08a771e6732e2d61acbde5d9d0df612bfc01878c4c2cb926252d5ab467e8d024f5f51a2188855006335975339b56b887e87df5cfc3e5f08cd6e4d2aeb11be4a0b844d8fb079688236d3271208259231c1fca5ce8a43a77da4a6549a0f2383a0bf198a2409309088f57396ac5ede76937ae3bbf15397b05bdd44c143f97601cfd5fa2e700a257c0ee6415eb7c994f485619ba82313ca63b09a6567f67f56965348fe039807f8e2caf9f29f336a407eace61c52ab406141dfaafb577587eaf86aba34df6d98be6ac0a7b54124210c437bece52a62d633eb4eaef4125ae1b6a4eba98eabf7d306070d5a1cc5b706fba28950763f0f3f7a36f0cabbbea64c6abce292cb3c6702b62b8ed15302669535f363b07572d4295f9d3502b6cf73ff765126225b60398f477f64c11d6fb93e192761999ea9fd794853720448309019605df6f26ef097d00f0825bec1851d8376cd10ead00f9dfab124a0f3ca6cfaa48e10df715a3040df45c0ff31d54e7705e57cde66d32e3f8c712cb9c46c83a89a6900dc487b068c95e070bcc41465ef49f4716d4a1755cb3ea7b3540551f226d8bd4b85ba1230afb09b86f5d9cb22f3c45d6f4807f64e24e65a5b20be2da15c9f0117b9a30b5b9caab56f2728d54701567fa42cfe1ddc79275935fa703489944a6784e57f4e8b3b468698907c466a0e9d9643884c9a4738456e781b95e52d2994f6018cb8c7b14cb6105ff9e3497895583adf716819d182711e6df7d870592e1bc74ab684b2d474c6ab85615dd89d55dffb3ebe39790576ccd3d79485c0156fdc6086182befa347300ae0d4a2cd81a17d7566eb7edb3c43d3931b820b052a9f74428e46ca5fb702776497b0fe79200516d16a294a44c8448f549373be55c2e8b8e66ba85aac91c7d07f0ef1cdc18d3610e9b89f6ab61a1a16d31e165ed73644910ca888e93682cc60b215e41fc6f946f85285a043f17951f671851fd229bfbcbda48ea64f451b0aee72c8b021c0dcdf4c9a8640b4c229083e12d472630f6a41a1614c8856483702e344b6381e352ff93258efa965d83a1dcbb04aa27f9fbcfed4fb96020cf99b0540ad71b023ec18843289546eb9614a8eb20b1e08479a79e3b2c827e8ed47ef8cb31fb72b0e6b1d8019274ad6c18c0d877dcce30785f964998ccca0e1e9c6a10fba72ce744fb8f4762e39db2ae53d1a25a18c120fa2990e9e7bea823d04ff9d0af0a863e9799d84e4de94c582072dc277870463d7c8a9062d637c0ce3a377271f062957b00458954cf6ce228c6ee6326c5662e2cd4489de382d88d819dd107a4f19961aabf275b1b25d257c9030ffe299eaa932e50d7cf25957ddec3980bd3bd6c57ed4e9e192a0a9f9158e11d8bec75baecb48a5e77c15adb52d01254fca6698af7aaa0ef6df1a402dfcf088a2b1b0b0c297fc718f60442e0e9e818fd0a91eb760270e1167c29f5826089dbd2da31300a4430a91fdc2a59b7fc2afc3ecd723bb2905b4ce0e03bff9f335dc09e45b7dcc4a2fa4cda2728007140facfb1fb9ccf7934d4bda8130a139bac59170bfbe2f27f55ef634d56a6f88586c234e66db3a5cfc857d149120ca9b10c8a57bdc03de4bc4c03a8e8b1f92d8bf555a55413e40618b453ea8e9cb7e6e52d84fe614878746c72311099f8df6ed275f14dd792a919612779d30516040371e7cad7af732bb178bf1706de172ecba15d90fbdee1f07b31905afee5d2e3cae03d459e975379e721a8ba1eb9057dc15a861a9fa7dab33a4da445f303a524b81729f190064420ff9e79309ba6bda1bc0443df93f88495a39ddeaa0e09ce39ab438987bffb98d4f4eae72d1bb5324bd70cfc5efe9f80f30ea3ab950b9baf96e508af9521a082829746d806dcef1517d8950d8d065e6b7007058695104a3b480e831b86755d36b525c84477c16720f4b84edebd20472c0e31f9ed3735d3d3bea67c55fa327c3a500ba043bc4db62e0f2a606fff87ce88b4c3fb1dfb0c3872f5c81b246cb92baaf5b0abbc0728553c675688d4331c60006cd933d7f879a7db427e05f005ff55d8ebc448c43fab66bedf3bc7779c3042a3bfc28f6ab1bd7587a0cba0d136d78158565df25c07194f8e7051197aaa75ddcac37bd7150858424afd552a51a06acd3a5f0c88344a358bf3043caf0f93ce8a08e86f4689e5a94862cfa4aa97439c9570526005c6d991788304d2f5e313e6a3391c8cfd494f3cf046f710c271fc0a0c2f0a2d14a3569e00877465ba344d30a8cf17d5b2edd9ebaf81fd002960be79e209d5b727dfa0e23e4e82eb17259c16a72c84af2d876a1c47363bedd895658b3b7e710e4f2f91597c5159028b30c4ba7b44008ba3fbee3781d378dfeda1c70089e81648b07fd143104105dc247cda808856b0cd3b4d8ceec20190d8f5ea43ab7f0be55e62e05686f805c81401ce1aca0c7af9af28ba5175f7af3edbbb7dd78257528c3c4925474b647d37d128f4c63cf31c80659895cec5636aa6791ea1bc733e21ae08c23d689f8523d365c9019e0c12943ce120b91295712d57e33d793fc71acaaea339d815945f5681a059edc852fc60042f0094b534d61ca2c431796b04fd1a29f5e67699dbaa54a36f6f456dc304d60553266b5ebcacfcf7fb2692489b6727cc031946ce83c88c512ff1539f6414a87d1e8f0b07aca2439f6958f15728c6a403a37300a30add4cf0e87e1916bf83252f13ad54f74a256233c70e28260f60e3caa3651ec9ce128cb31ef03f8734733581bcda1d78a4d06af2853246712352483cd5e2b8cfcc2ddaeaa5d0faa239e66dc2adc5f2d6830802f6561d964b01a28b9193dad06b512911ead139339dfd42056c67410ceaa1defca4fd3b15bd86d2d2a03252f3c764265d6ec9c83180c4aba8cce74db623dc3ab65c65b9df0b7a82670fb4bbc2edde84f7d6bf21ae52a1bb12e79dcffc1456bb3d514b0059c1fe4bb26c115639b52d5524567056c3bc72704450775e1b0fe7e1720b85ba48fb97bf3e5e683fb5e92498e14f380fb4c425aff48206c7675da7060fe215a92d53c333228d6cab56e35fe1da3244987a77823536db2ff80c51fee03021f7ecc8eac5fbf45fefaae624b3815c96b97a96d8658086657be72652eb5d4bc3260532b17732fd8e6f3f9cd82af9bdfe3da6b45467f059a2be9e8154a2833acc865b220487a3fcecf81056d1586c2391582760f49af69d54c7b18ec797d92869b880897f2820c9cf1de6709eea2a353009728acc5c915d1eea2a39411c06a25b0f2b93948cbada46edb2ec79363b56067ab20218392243c0bb4c2fbae92d7a6a137316d0f69011fad953147858e569b692119d041b0d83e699ca942533d76f92efb0f23a98b354fe5574f21c0372ffe01ed2e8d1233392608b80689f047551c3cb490a942afc35761478a5f487c1f2db22668f063fcffed6be66340582c5066c8c1995446d14a98f42f7a89fc0b2db448e0d70b911699dfb9121953fc7eae63eabe9f45e991c9e26116a01c138e78b028dff9f3c0f5c716adabd2703be1ce0b7c543b0dd5b47b173f286a728ff5d575cfc064c11de18c87c8ab4bee67d2ea905508a8fc1c76ef1358b9f41c9cc0ce156a7b39acc39c802f8ce4d8a11f359836d0323e63da1001dd15186f7c31d903a4d69b74a22514ef143f1a432fbe8cd7c8660bf824078c3844e20923b71d7616e12d0dd0eaa0e84a98c7da9f5b8e11ac71b9793fc9357a9dbb2e3a6407ec51b311e1f7060766d3355eb9eb9f3059cbd8f1187bc4d61bedbeea9071fb157a1963e485ca0f37f96b21be8da846b6b991cf4baa6dd698dc4b4d2d07bbe44dfcc9d0489001d912d44afba0b29ca6288dbc883aeca6f48d63169e1a088e9546a2ba00c6974bde13787594a0e87736b7548f30e649064cc57c4eb2a1a12cdbc5b365f5eb518968651b60572bbf31ea42e77c2fa77426908d23d5f6f9d3949ad5059fdd305952298c1d89cde3da24d945b1971288afdbbb761237dcac379f93373995fba7145a6796ff918484b85b5c2eeb658791e2a294877f65d6a145b6244cfbdaa52df406e77bb93a883307409a7a411b7b66172841ecf9621838b0e2915d205143be2490bc078754f47dbc020940da6f338529c527438d7fd2fae44ca91a55b79e8e7df5f17ed754beecd2b66a0277ae2c76dc72c0f941cc578a617bf91d2d7edb456fcb7f5024052b232d8a6fc0e0b7c5e0765860679b7e057891643b332d8827a0bff6ddd1ad7896d72cf5b82dbada3664bc8f12858c8e753ed30b062fd384ff4eae6d9e6d45487f53e84cf0a49dfb6f4ed87d57d5dd2ce1283f8a2b96b215daba79a188ac2da10efcc43b67f091f9fb7a01bfabdb254a8e417f8d3e7dc79ff0de6e7051d4d724eecf09ea474370f8c7b6183d902bc1fe0472dc59b88488962998af1e224a2f459c1a66c39ccd2a49155ab8a9e78623fdfbcbedbbb8441bd28956a060400604a490ddad645d5cb4b3291a02730d7e209b16bc0551c6188d1d3af8a75f6d4452a431ec565f0dc018f150348d7df78d16db14d2a64225b241b822825ffb6144d5ea6e129588315cbd5c9a8f44b9ba87ede9ffeb07d5aa3aad363234c4c0dddc2e711f42a245d4f21a81f2db240cf77d4b4cdd659b8ffe0640661873c9bc91460e849857e344fdf4b06e4cf344c111566f9f9f99afa09dcaf4f9411be4b5aae12b8c4b9771f929baefdf42087156f4e76d9eddeff8e4cf31b76b61bd07f6fa079aab08c19d1a3521665ed5714b5a82b8745140654b7bb02de77859f4ddeba588756c7d5b95cf3847ffe54c7fd316e1fd24403186590000e83ad39b2157d918a951a8c82000d87813b388ef636f71e43108ff87606c867194edbfaa50b0efdb22c20c3cfeafcd17b09db12be66aef326915bdb7cd66238b587a71307a0e6673ce8019db91a1f805f3233938fe596bea7c8bb8165723e7202a13ae85f5681df44f3773c9c33ab8f2c187b75a24d84dc13f3905ccc2a455c66d27a8286992815bd0cc55d0a0d48c95cca3e4fe03e10df646dfae26f3b34451e25f080fa41e3c36bf393efd06ec5dc296629ce7821f66b62a3582bb73a6a01a7837d101b553a71c820983cd7e91637694dea7107213988d88889cbd0bfb382673f1515f96489ef4dcfb63d5db2ed6bcf519103a2e45e4daf5c42c9f1c4afffdbfa25fe27700fdf07b1908d3a776c27b66cdb43b7b5c46abcd40bd407857cd1f60f0aa096ca7093ab302f6aa4f7fc38bb34e8fb7c6c0467df1a2c9a383c110ae97be14c0a7984facd436b9f178e5967ca6b8c4b86b4f636d9bd7f5a606de79503de10c4d570d5461d4b85419feb15786fe6d8aef2cde1fce5df73ea97dae057efce191814b3f27af1373611bed57b9cd1012e312586863f68f63c149768b01f66152f1504b0aeca910be621ff88e4f8d5967b3417d21c5fdd8193510233ec062e40a2cdb30bc50296313ac4d72c4d00d675c17795ac254dcf9128ee1030558907c4507df05597a5a3ab32ec987e08940d9c08cdfe9638276aeaa95f9f69d8c31e2aa078da2aa3985eac2b00f0d15b7f427eb3800c6c937ee7b83711a9ebe90d037da9a8b959f58aaec74851cc435c461b64416f7bb3548e1ddb3d54f33e943f76dc0fb66512d2552690e73855ab02f7b6a211b662e2579287836440d3f532319da5a964c9a0bb978fda52d79f4a0afd1a69c8e933622a292a5cbaa33abf7d06e18bd41bc2eb1b122fa71f2b246853a3ae34f16b12cf1b46ca789a6e673a83524d41bd25bd270d7e5abdc6447f039f3ae4851ff28901e97565f83eb11c59e11ebdc4eef614e280a84330a2339e85643f3e92643dd5f997da0652e8ab5716eb46cf88efcddc8784afa1adb7f346f9df8e37edc90f761a9a1e5c4925951c73e2862464bab54611032733bd1d30825cddcbcefd0c97f83c5a3d76122baf10694abd6800ad5de280b484bd4e9b1766061ad72269cb7c5d8c831c1800ea0c617bfb1fd7333e1178ca89796ad091e0d69afd524f400ee12656d74de94b5aabc100d07f010528009ff3079c62b98ebca49c4bfa4cff074a027f57d30dc67de306269615a210576079a28143602de2ec99704ac8e8bbbcc7d59b49fa74005a8bfab0468fde898d5b6708fe032e4667b6d34de2553a05f3a7c919b8247fb7764acc332f1216f42e581296c85fbddcda4945c6b2d58cb328b545509c88e300281ceb5b0184a3fa7c511b2b8467803c51467de3b4f12e9f70e9213e087e18d62a7662f26264800b8c810a07a4da659add0ee39a2b29ed4e17cdb85a4a756fb11dce00be3b7aa190b6a91ca243d3e602f3789a9e1e9ac32705920edfef739614e07aca0a86de0d242387347fde08701edaae8a44dd76ad3ff80c70f19586b963c517c9d2b65a9606fa2228769108253bff64c7c37c2b097f933910f8faf31d923e0c72ca07f5ff6d8d1dfd09da3333221d885d7bc9b4aa7e6747d0b2012f95fd9a5fa6e0ab79cd5c79b20e1af38b33c5ab5dbc6ced06d32a73f50b3b5760f300933970059244f9fd7df2ee5367bb1be554a3119883d3a4f0dc4943ca0edf20ba1fbf4ff00edbe396a2bc52ab9825811b855293ec22717b70f83c62cc27a070700ef4d6458fc05ee595a6619c4fb055f735762bfdfcdca93be65f05a4b2b6f37c22794c906c39d8c04da9de0e7b5fb6e2784ea3202e1816fd53134923e0837bccac8b92aae6cde75f634a2260b9ed568e5e1a7898246436fe8eb3e7bd8fa3ab2afcfea83c29660f1cc637ee661b31072d04fae5ee31521e5943e952a80fbe4361c08bc250b8e4dc33717af6b1946f00c4a4c98f5e2e2d3882e792de956b781dc7b47dcd1eb7a2fde6a340ad7cdde7e8fa1ac735d289bcfb37106341e97c0d4fd9d06ffe8d6dd3f90a877aaaf58a5c75db22ccc9d6a8dd869b39b2c19d2da4ae42a170694ddc5bd85b3340e7446e15ebd127649b6d3bba41b78fdc2794b3955397898e5bf14faa7644ac33144454b02f38f0b711854f8542308d51f1cac33fd7f4fd6543470849229c9a81d80f8879b753da38d05f3d60f87bcb423109b9d8a4be636ecd49ff5c3abd1fa7c8a383d1b90badd6501b1e2e785666f8cffa3cc6a911bb0ddcb7f049d809cc261faae54867be7d8e6e64427dc6a70ea59ddd01915d7260b1e26fd652ce29879a39cfaa87afde06e65754d7ec1717b666a49e9d4a6340458f3d57f6d6f725ffca8798a7a7caef6faf3526aa8514d66490ea1a8ff724a32a20dc5882a82b480c4fc7c9246c7da1e2ad085ba55b7b4d0a1d2d257b30b8466374ef35cf85413e1e428867780f54ca08a654b6f607136905c3448e28b3ce7d372286270d8bbf1a8cb9e7c39dfb9f43b033d26fae5d08b839089a5b7e06b6b8e8e8d002c97359f504d0b6ce8bce2a39fc44491a1fcb291a10a584e638d721c63812030f211912494cda9cea1d560dadab46ec590b98e839794eb52d58a7b59adcd6ee6f50644774a6076afaab397bf9abc552dc52298814327b6e8563e5158943f5d78e3309950df7c30686e0f9aba1d0c6d796b57eddce2257ce003fa9e28d852dc7a9a93f85c69458441c776a3f0fb95022e6577cd78143db40139b827614cd8bb240ae503e1797c5bcbec2a1d1ca6bb46bf15b0a3a51cc81f8283212bebbb5076965b6c33408ceab50581f47315c9a4c434d2d0f39f1304ca07909fa8b3c1e0ee394b88a6d5d6510f6aa2a21cd5172042ec1da4cf698563ede379c09d4dccbd5e2cf1f72fa82f6e5d1ec9594b76dad2d24e3a6c3c6220628282d6961e4e4709c20e382a1db0558d5fa10d94bb59c93f41c83507ce1bb8cab5195764d4ecff1be60afd4614447d16c5e161e1b60b9d6ff90460b5cb1bee8da76a88755120cc5002b627e09c1b134a34dca8eaecdc03c304a85139feee6d427a93e18ad955a08d7663c22eab8aa259138ffa83b6ef3267280c208fbb32fb3b9e82b01b3eae374b7cf4fb9752890deeb151801897d37e1d5fb0e0bb4173380f4209001e3fab6766563a5be3f687c6efef6214ebc98e7f132be124cd314eb2e47b90c9643ab6d6c817af559225365eee3770769aec23d4ae0a0648754278b32094cb1b8d27e65b81fa061543dbbfbe0e3edfda037909d3d59cf0ebc91407276605e3ae31bd0506b94b8df9669def27e30d6124e95a1c53b95ba68ab81a87627294851ccb15e794141fe98ac60c6b5be849c58be2a55de0fd9e453291202a1a8a0fd237264e2aa3a4709fc6216b7747c47eb2f4e6847671785044fa75e4ab5f486da7d8bf2b6df049e7c50ee3812f289b37b517ab6b6880675d55e46df721b6ee92599b08c462aebf7336c7e2828bc8c6aae23240fb7714d3040b4d46a5fe0014f8a2cbf4d9ba60cd2396910a3fd8f6bf9d08a455b0692ad8e7011355d9e1cec43e3d5240f339bb14ca931bf241dc7d6e1a8ddb3b7a313eb8252d32c806179cfc07776bcc13bc4857cb78b556927f0156d689a3c9ae19ffc73a2ace8e2c9e4168b7730d16146f5d43c1a1afb32819f536cf040ae51611d72060b499f390d0ce0a42f09b740b24ca9c98325329b6274513e5e4ce748e93ee1535dd43cba5647fc381470753d01ad2382cc15c19e7c70d97c0037fedbb0ef68f9e3eb90200a2300d765631c7522b12dd03ca56979b4ec98808bd6716de0f14990be0426d05803ed1f9d65ad6242dd55a0404ca2425e90afb19d754975c12b96fc0ec34d7775de68ad9b01ce114711f7b25fe0b2f663a1389ee35a206f649fd755609673cda5d046dab0d6a14959589ef404086741e9bc0028c2ff0772858fe68edfd7f66cf20a0c23e6d65d2ba6bf988f6413643cb336b49b438b2b15659c0b22c2d0c63a25e3c0a1dfd37bf4de2590a6036e710b3a882ad071461ae29b7eb4f3b7a61b56e3f5cdba4e745e6b5832b76262087c28bdd21171d29bcd607d0472356513d96ab59f8df2614b9ffe20c1020f347d68966f6e164b868f639ae244b218afe33b74055ac92eddc0ee062a58b26ff7238b75cbdff177d96011cfdb11145fa92d8b597ec435edc7fb18ff8b9195d445ff4e8e636179983ca2ca6c9097564837bd5640cb413ebcb9fcf6901156c3260290284e735e339491f9059c542b66b206782b37bb8860bbcb4ec3818888437a1ff96d7dfdcaaba22871dcaa0bf126b42d8c3698266fb3dcfbc7549ef3c2b25b197937aa42799c6f45ecfb60938d87e37a83f13b04b1ab4c42d0ae48b0790ae2e0e8d8dd18d62adb64b19a1d2c5d5c34074188b2c0da205c2f68fd8e53218eb96b8d67375564242a6bf825021a4ecbc8347af6f47898c010489a511b2f6ebd7ca1e7a53d18cb20079f6c8c000ac9b45e3119578056eb5e4e1868c7b8c559216d83270606387e3a1e37077df234ab83b557e94c217876795285925217b9db7847bde382ac17cee2b54efc16d46961b7992b92b05f2bb066526eda23317c491e2a2470f56d9e2bda1ba8a53be32d5f3979c41f4da8e5de77290f658b0d8e7e9dd93d3b908cd202f13b3a4f228071d4211f4e1947050dbbcc973bf14ab28765908fb6c0afc1b07e73cd5c8a8039510aa6b9a63c1b5fa9bf26bc56aa206b6534a17146c2c07c222dc7c30f5059385466e3f42ba80bcf6efc26b250e2406e45f0c972605266c3d67dd7a6ad614cb0fba5467d87facf62464436dad507086250d7e6207e23503be0c765361b1c29e819ae29e184873e8c1d5bb646f5346e6f07fb6b82f38c91f4ffd2081c07a38908ebf5138e0ef562ba355bbfa467a8859327138ad319b475b2b630dae76e54edb0e09d5b900a40873167dac743a55584a635e93a33c9310817a3a3d5e4d6b5b6bd11a676252344647f500ec78b1506ed16bb80fa395fdd729e5413aab60fd9bd600dd5139f70d5b7c2d4894a0abc36c54a82044ad48a406a2828e522f24b70247c922a79330cf8f616debbefe83dc174b24b86a8c52882d74425b1ee5d2cd7b335ba38d4613c6f554c2c9781c86bfe9bf3de2b5aa475043957361441843ab00c8cd801ab160aca63c89accd37e6304eef627734a137f463f28d0252e0d67af863af5ae6694728decb07142808fba46b498a72959c6b2a04d8c1b7074d7aa1eff5947af2a9056d677ac92b969ff82e534d4d81726e13f34919386becdcb65cb9fc24c0f5835314e00fe13070d53b684a51586ff413570961780bea6526a6eab2568dce27c15efdf0d8e421d05d5dcac74c0407b4c33efc38a97dd3206c2e3cb74220c41d5612293c05147d224bd4253116cbcdca40e7993ffc32c9ae96d9c6a7caa4b42f1aa5fdb5b96baa99ec5bd145560141c4532a79f5e4025108abdd4994d92bb410e22bb679ba1f33a0f8ab6b296b610d187578596c01c09ff0613d78d07a0d891d5e17aa5da375b6948fec0be0ae3217f48c812af387e8763f915ed129745f9d12711a95eeba505e1be2cba3ba7d91ee43319f9c1f0e42ac0ec063292bf473c71028d1e24fea8defe59d765631c7522b12dd03ca56979b4ec98808bd6716de0f14990be0426d05803ed7800c53edb3de249857dd74c7c8ccbaac379588ff2c793961a572bf77368765c638457dc4bea82cfb31c8c3d7de8a6290186af1f392c42b7ab164a46a99ccae9336dc71b26ec3e727afc3817a460294485d2c12eb54021a0d4205779d71dd5f94dc3c9706ac1d28e8c8d3f0127f958689fb4bb1d64cade2a49e5dcadbbf26128861df72794af51978d2313e6f3e041309475bb73992cdb78187c5dee523eb790e373920306c89d58bf5f8fdf68636f27f9dc860fdd4a29fbef89f9e76924c8befaeefd19085a34725e4714312fc75acb64c3baa28ca292ada1b52b683da0a094ab20a065dc4d7d97dac092f54a4f8a15272eb82cb7fe8173518318c1b4e5a15a2a29e801f44ad8ed4ecc485838300d35f313d67d78ed75ff39f026846df4a00578903dae4862da276a120330ff1213cfc5ec7cb3c1b034d7611dd6382e450a3f3bf9805b911a8292b961426f7b6e3e944a51add01c89d420aae004ff38c8a59db64cd867a8db8ad3dad9e0705846020d92e9d4571cbdd62d62766ad89a2d1adc578c2a81896ec6263fbcd053162bd26c2230e9a65c6abb12b9f837b225a6fc3a6c84c3bdaebdebbe3a06f62df7b149584ff837ce0306a2adb365afe86f2ecb26612a02ba8b71ea490a85e497b772bcc099ff1dadf5a3c8dbcacd323256d59a250122e22502e56abb794e3b27b1855f283f9c79141c6c78d20a14d79ddda5380972ce84a68d3647cd34f04e9040861333ac9e9f9ac5b00008d41514c79da664d81b834ce6c33127025096b7bc3fb877fbb70a30366f81810ca4e159277d0fe904769305c052ba3d6f5b592b7d7bbd8454722e76eb8737834430eb71004126377bc3ce5c378fa60f5ad1f6bd18d14aee6d1d26acec4785e44caa69845bc2165ddb1704bd586c7e3aec0914b95c7c3e92e1687edfa3a4d33b8b3a3e6c484bbd6d079a0bc8af77b4325bb10b651e00b8f7974cc972d0e5456a370f2c46a56181ada7125802ffd01c98daddf86bd57960f51f7dadccb15b530c48e6a24f4f1c697fbac246eb43233fd2e714c85e84407a084da2823d5a64e61313fd393d34589ef0f3eec381cf025f58965728544dae5df9394d6bebc7e68572e429814c87ee6dd284f712a720bab3f9598c897c45e389c6666998899b963c05892fc2e12179cf1ca4bc0456ed97d8bb58bed6b4b70959e04215d3393596d92b33a7aa515238349dd19fa71fbc9634487b4431629bc9fc179df6089cd81f56a97ff03fc4a0ef40d0ad2561863be2fcd1830558f1c3d1b4fb41765459d30a47e14acaaed6b0c53b3863d526b2ab252371fcf0792b539f048269c0a2723afc96de3c802d367e6bfe7c99bd6cf7d6a44797e4f1025049642cecd8364b058cd82322cae9148a316a35f4a11ad704ebffa3244837b399a27dbeb2a21e55bf5dbcd4f5cd01155f04a7bd41087e10dfae9cb1a56d2689f7533b70bb73fb41d1346cab38dd08010ff9f6334bf69b3c5ee7d1b4da62d0c18cfa39539fbf4e9e46ce454e1fa69c2e5ae901ec3b526ae8df82b37d768c3ce9370e460a6d85491c9843479b1ebff22387b6ab00d45a06b313cc0ecad484868d8d940a6a2b50ae5bc122f2907fa5cd9bba44e27382fb69089e460230321aba299ef9447728f82d91e46328628b3a0280e6f9f2745adad5c0e4bcc57b7b0c59be43a663fdfafcf6a88684dd6cf01cd271882d44bd1a70fb6aa54ed72a392548bcd7c79a10ce16e9ed70da90492ef13346e2419fa52d3f72c5e3cd751ba7372252b1489cfddbe6aff5127e0acb0bf7f1be5345eae2812c64380ba84484884e55e1e57c09d7d9449ae1c28790c445953daf36d0a3cf4e419dbcff1168b603745c8b2ff27625834980dcb1951227ca6b1ce6d0c40392c680fa9e7345281c3d107e9c14344d63691be8073c013c903a0e0f29c4d3bbf598e4ddf16a3e0aef0fc3a78b9c03e85516ee5aed951ded56b59f938327feeb84a510de3e2ad831afb82514d8c7559389390c92a21467e8263722ef7a0d25e25295da0e8207eebd6ea0ffc4b3bf9d157cf84ad816a19b7e6e2baa41716430431a6335260801a138e31c2ed15b54a02ca55a16fd6c00b3b0ce900249201d58f917d26d7daaa67e43c7d014afc2291aeac42ea8d036d7fc7e5dc2e9d7bbb3bb134b12e7f32bd511ddd126cd4b97729058528566740aac7ceb547e8f84bf883f57e7bffb24a7d5dda838995f3423b131dc6d23c35e6377f6351141437e0e52655623734c7414c0907a61ca04c0bec6627a4ab5fa7a7dc7d5c9e2cba9765847821f6d5b5b9c879da91809cb4dedbb7f2ca06806293fac373e92d377190233f807f55e0ec1dbec7173551dea6af38442009036db715edfaeebe0654d40e36ef44c5eb9beadbc68f328dcb08c126f580c9262c68691e23837056768fde71f15204055aa64258942fcad7ecc2d21a336743f754358406fed752d7b1023ae98fbc6b82e35fe0b5d01bbd5ab3a2f87814f1cb9518cb600c70395620e70be7e4b7a52558cc13ae1ca6c99e3061644a02a28d20b6b8e6eb4aa50490511528a6b34cf7070f0f44e2c861f08abbe14e70dbd6c87e4fe88e1fddbfb856f7ae1347dea13bc1db4a729d313f37dd5dc201f2332240ae3e013fd3ba652416093da7275fd110869a02bc1605232c7bd58e0f5a65c75c496502af7348849e0c397046015f6e7f50cee7624cc6c64a57c8e3fe2114551b8ea0d69e4e9373bc117979c2253f72abb3c9d1e694756909df601a2cb51a84ca0609ebd5e65ed59d10cb91b539ae9cae5bdc5fc2ed83527790d72e28b25543db5bd246e61f7fe07c9868cf98644f5c26a7a5e0cfe2860e6ae8723891590f2d7488528e6b947f242761ac8bcad7c8426c01b1aadb141a2c5a7e7e8d4f65a80643cb6c0b156a4438d79cab3f387a4365426668a39ae755476a40d0238f34f0d3032beccadca2c779818c6808a7dd1eeb55e94f6aa21d3c12a739620d45013c859737c9bd94136b5bb489bfdc2d97b99e8f2bd9c99d199e08414cd6f8e92ceae4d77af7030774a5bc6fa850c63c820928ba84534437d45a62fa47501726baaf8cfd0547f74a09ca1b68c140372e64d2ba9947e14160c71dfab877e41585ab832d62227e439af52724c61d741e343c4311f6bfc7de535e270314026de2237fcd9d1fbc69a95b2296c2d99e61790cbbf4af05553305aea11d69cf3a974e1c4763ca12844bcbd5391b99997b206c31937611b432266b0b70c63a80d67b0e436b6e93b9bbc552b1748e3b9507ce35a74908f0ac8fff673d589d5d3886cf515a0e0087bd8fa2324b2444da45f206644a68e0acf3c37b808ee36fd3c0db758b3599422cc5f1d12371a2994a5a714e7e532adfca3b1af5cffb0fb47c6bd8cdc40861070ba750f8355eadb32b94d83d781d31d40a29d93edf41f4ae7473f1b9287c27acadb3e659ab23beefb6401af705bddbe1cc800cc63610afea88eb530a18b4a7e760ee4d1bd43e23af5b1a115a74f38f56130798ad0ff857f409acc2c8b117776231ed99932d2aee3f42e112dcaaa9788030de16ef4a74b28040fd4990f36b46c758782f67b00941a13f240e989d8c6ca37f7190040a3f0fc7358fb5485d220d78fe80c3f2a518ccca831e49441c7ec87d2efbe2e39149013d678390c3efc99382db857e7d2f5f347ac91d665dc69283f09fca2a79f645381d378567c6ac3b2f58d71a1afd737a279f2f05d79eb0f4bfd641ded1bd423c275c86d97a32055b5a60e29113e6e240a1df83b9a1635be29cd84b73d800965b1e40bd07e8208d125a94991fe435df1853359aeaef8b46e97605979c479119eb5c5e70e6c9c06c94fbaf4ece50d149e3d6f9eb83c3a1c796d4615f870f0d87ff2270edfff35a2903e4f37be27bd6161c5b240a18d9a9a9ba61cacacb21d35d344b03d9e6c109b77aa2e9d5543e8203fd394fb8c561a8e91cb856d52e41ba70e4fa86238e0ccee7b7566e2232460f39952002781222f2350cdc8215f59364baddbb94cd30bd4cd36680342bd5edd3f633f2328cf1334c412f2ae9dfe5881ddcb94f4bdd3a106dec02d47da0e5dab4e7380cf0bb16bf13938618a8faf2c6a3d150110b85c2b41e86cb988dc5e5fe277239ddd6da61e2e21178004eef9b88584ca53f4afae47d3353bb58fdfd16dee3607ae3161d9479f39b7ab11944fe0ed75c4a0c95ba2b5e8242bb66227608494bbab4b21c53afc20d44bc45c2c08138a3479dcb9ee71adf6a583ca271500f8647e9077bc945e33f13419621e634cfab8c8f188d400bcb527246b3ee57819de8067583c64f53b6dfd4ca4bf5ad12dfed6e8b3ae3ab14f6ede64c3be374c813396f20918819d929711f935322a3b3a79a85a2dee2b0ef13550565abb68cd35ff7d489ae0a1956ab956bf25fdbf28e76670c159eaab0fbf87725a1686d2a7f18077a1c7b45173567741c4419603ef0652794f53e9a6b94d5aa55e4e31d7d29e6facbcc3355d5581bf778dffe31892ad4081fe7fbca4ce1eb59297848d22c948438142e98ab6e110e77092e42a4b79f18a6d875e1bec63199cee3e49b6db5a5114a3963734bf8b070017138b6e0c581b4252059247898028707917d60bb0406416ea7c0be7283044accd5b024eb7a33022660b7cd4da19e20760da5e028e990585cdc227815865615a9740da5d4bb9d66c3b37a71acf8b31b2a2fd64724845b51d9fb652e7840449009a69eb8307a094f8d2b543f1e88c21b02c334633bafda61dd2ae4b27e31e8c8580a382462834b370e96395f33edc137157370ff00de07658386c97b529fe08219f6ff61879a79f73d903dda257bfbdf580e90e3c8b261c07e6749300f3f49834758dfd373eedefbe6d9735755b3c60d607fa618e7dbee11c16b264c588c0350333959426cc5e83a495eb46021a70bd336a7e688d50eb60dc143ab1fcb06fd2602a1638dcc65569e9a775449bb9e262ed01917e4faae6b6afc78d9d9b46dc3b93ca2fa9d44dfc42bb708927b7fb4e3f24fea160c24023d3e423ce06499f2a0b18393fcea9a1e51a992f49d22f020493c9bc40e78537983ced56bce608987e69cedef66addec374bf738d5ae136b565b8c7540de339a386245e5c80f93f03fa67b6a4797a9039f5bb12da6b5a617ea37b780cc86375414e35dc9fe65ceb66f5852d187d12339a00ae145ec80f7e5134090392ba8d85febf69fa7e8b9b571d36f2f9997ea8a4cbb1d482cd120a6dae3c34fddb424af5d9e25558671914cfa3b592b42fef42f94ee8f1ec1cd586770ed21ca79abc728784482d0a8ff5aff7b74439929f99218d4c64803e0473ae4946b89b3bf3a8414dd20de234744e7e8e318635d383861b4088011f7c2b0d1577e299246ad349c2d649a3a29b8e3158e120e9a92ec9df4ba1f26be864bd1aaab08b8da8b4d1e2beeb1aed6ace94604cd7dce2f6908aa1c474455f99c2fc36c9bd345498904614a2ee2342414499242f17d034e20a41e566339acf61d6db6796856afffaeaf40976cd8ec2c91dba534733bcfd5c1bf384e3c7ee216b1c1e9e060fe37bf958e727aa7f98926272f79080ba8edaef703d1b51db5ef3da20cd6ce9fdde7d088ea3503ed5a4f1b9aae848f36c3be8ec21de5652cc005c9444b37c404e5de47dc8e84e0a7aea106a3df4894e51daef93119397ba48b820fa3353dfbf585282ae0d9549f417ac87a82cb79c583ec4a0acc7b6e985817b1aa24f84d8ba4a9ccde48254c6533707620ff850c1596864d8703c5a183c61892bf92beb6f21f4f37a6ac0b0fa1f909a149c6839fc665bd4680ae1b93ae48f5ff67eb76fa30deac9209fb78ab7da8e7ca24c2e43723f79ab0f029320e6340a3c8497a6ce52916ff73537c6652906b6e62f1f3971a789f7c61a0d026c16256d20b7ba88a09c89ff7dd144b08032ceda6c834a59d01c45e5b44bafa11014b4f06986a2c21bd41887358a2fad44ca1e0d2644fa7da613ef8fcab709659c436535830b21d2d7f0604ea813c8ad7d8ba37a311430d958f2af5687c5a0cdca1cc6a156241b7f3b818669d3dd34100867ef989157d2fafb7ae50d168658f62a0bbd1cce14e374eaae1df719fa4ae0a4b2af860c7e6e1d743748cb13bfb73285e8fb6bc63ed64567fba99ab2d25b8b5a9dbb2db05bde4f98fc049919725260cf12aadc6f00746d4df28ac9d0db13474c35e9f0ba7374a97978b8a96072babec27a3ec1cc155fe3ffb13a94d68365135a4971c410fe74318cca39ef534e30b427b3822f608cabb93c037b2311573ff78ddaed8087857b5ac037cf1920e7d70ad38777993cd394fc9208634dc337318c0d9c12858f6ce475f36948a63f727f8caa77a71d0e92c0178c45ee0b16fc9226376d2979e48e0a3f09c12acf16d5453d013b1210c2beeaefc6444d9bae294efe1f44fe6c4db9a6dce8a1ba4acbb13f6d27bf0efea9bf0af309f21e2597b01663b0135c2dbf463fb55edaa306adb35aaf4ff2701c40bad2c36f2d868b20342887f7645dbc19951ff944352dd24d396da59fe60c0b13064fc955b1d6f32e8a364a01bd9b84c9ea0214a75e171fc6d5865af7fd0c715582ef111f3a0a40f6625545dd5e5d81046b5ff480c96afacdc1b23e0b81ac31298cd0496a7fffaf83b9a75216dc3a3a08f1681fc0dcfdb3a1c45dd1457cad0ba1c8dfb2315207dfc6d9792df43b6f46f446ff198d637bf3b8a4d91ad1e3e813bc1eaa1e38430f75e02e9b207d4ae747c3dc17c5595dd06302a791604bc6545d60b70ecd9741cf21d425a1d50bb05a7a51644cebfa336d8377425a79ff6d6974411fe21bf3520f7e34e8faac8712d2163aeea4d3bb820fc58409429edb3170e74adc4a31bed1b7272f14922121a4e66c37769e94204f09902b2ff615ce66ebe0f238378f3cc62c04c144c6536093dc3225ea7bf486a834cb51c687f5448c1e2108bf991999c4352e5731e8904fff8c05b1b90219bdf8e463411bb8de8cb2a94228332ea60974f2c9521b1c80a47cb3cd5c973eb03f27a5ecf2b769728315703fd5dc8b59859cd1637961eb6fb754024cff0516df2f6964715490d55bb96e489b889007a24389dceaf53acbc913599ae003600efc8895059397a44c254229ddf2d4d88fd4f07f9c77c49522c33a87824cb2050efb7043c321f8b48ce603a7ad3cdb94583ddb71ffe7841d9e4e9c195c0daa0075a8839da574ad7272cddfdef54ce5897b6d070c8c3fece4d611fd298f1ae1ef036add02beef138bfa6aaaf2632eff15e4034ec451bf42e46b6ebaf70685d81168e8723e8928dfdf36742dcb77480600400ea4df65bceb36c8d93c2f772829e8d1b75e7c511a877109f5d3f4ba640b34ee13fd3177c64fed2466dd6e72bef79c9e55f44f9d73c816742dd5d69e2697c6fc2b4829ca00a2e2664b002cf333b23a6b65b77bf9caa7f94154271bb4c15b3a9dd2de986318063dca305c08dcef020dd8b5f21816fc921f8b5e6d66b1792ea1a99682099df7cf9f47be186602168c48387e71c30690ec8ec4ed7823090b15a7b426afe95850e5ffd2d7098a48f638d642905ab58525daf820a709dc51b350ae1954a49491654e24d4e6a3e8db3e9426bfcb48892629dab3add7cb24cce01416593b20c5096c3275f70fb2fa48b484942d8d6434ef2b98117427afc98800caa27a2ccd9cc90b13460124230422d5c11ab94d454f4bed4ef3e1b916a29427bc88ffe01e903bbfe9213b4bcf59b6009364f2468b214d805e78e00e9f7b280c6e7804219a5a6bcaab93a83848efe8e30859b49666b6c12ceffc2080773b11b07103d7b8b611bfc59127b04f4276675473a41c7fc66a5e01b96e6f8a3aa2106033ff1223d0ef88d697dedd95a50ee4d90c41b3d214eecc29e6ccb918f6d371552d650adbe1f85459849757bce6bb75237c264294dccc1b971106cbc32fafd38fcdf7199d339d0563b0e18c7873cb81b05451ebfa48a71737f48a26df2001403375649eeaeddd92f83858f5bd22fdd4f88bbb854c50a3ab3ab9c0707a2f3da608961ca52299053328ab97351d662badaf6795c8cf28ae0970e2cdb66e392f3cb365a0a9290dc9d9c5d51c2e4fe25cf2f62fcffd526a0b236798ce9996d6cc0337169ddcfa4e886325f19aa4c1f08b29056514ac88166e113baa8becd628e97e5d848f6ea9dcfff983a04adbf3425ff551f6d85fa62cfb1ccee3d24bbcd83a4260ddf70ffe6bc9f13f5be88c104dbca616abed3fe39661a2cbee1fbb5584e1e81c5ae5013ef6553e8777c0bdba6185fca7859b2f049bf1319d16623125000ffe826f3a05c21a8f953809c145b4454919ea16a7e4692ef6e199e5a1d3b9943a7a6152b60fdc507e733e56f4a42da66332e4dd9a930859986a3fa4e6838c5185eccee06e91977369dce18715f7aea31041eacb3fba7380a6753bbf68669f80c53e1ea647a623f67fceb07663be25bc9084f6173f8c8be08195ba896f923cb782b51994803f721ff9dbf9420a35ff1cb5f9486a4ae46405f5d6497151166cf9aef8c7786934468ba804de29cc97bb4bf061913683d874b3c54085200f1bdce72c03001e3dc42725c92f89dfbcc10fa3c4ed6dae517a7624aeb7f49f8eabd93eabcfc6444c69249beadd9fb69623cfc37fcdd188c3704431c163278e2bb905a6b6e73924426a641cd5d1bcf2597c19d0620dc5e35b7be514672ca94f3bc79d4b024768e7e5fbfc7dc12fe0806fa60312d76377cd72258004e38cf5aa166fad64b1502254f9ab8691dc46f314fff9bd5750c2a4d09d5c09ead0f6a47d433e6eba6195ca1d0c1c995e5a0358fd0c921a581561849f82c314c0f8279e9de66e535c4e9d3d2672eb179e8d332eb0a7ad8ca0eeb0b13c2c6921200365603bf6087f9911fdbd56dcc879bf6ed00e69d17790cc5297193e8d62fdfd90a184bdbebd29fe7f6a5768bd4a459bc3b85770d6445ee6aa475c590fb2653479d8eea93126a02da8681261616dc789c447762cb23cb7c84f7c9cb88c3a7b69666956cba871d9dd9c286183166357c0ddd8b6af2757454adcc845007c0feb63d67877719296b92ded75b84939a114688b304e96b5012e822d3af8638ca58664c64e2403c5b1d7604e8fa326e6d0d6b0e5ad5f7da7ac5dc1faebc7d8434b9f98f8edebd551a5637c982a750879a70874c1b9019a41d47fad56d50adbc4cf17fec5d072d8471941c755cb4a14ac4acd75fc949f60d9bdf39691660d0e2f52b354e6e0bfa0a66215fe942c52b1a1de370161b8c9dc3ef9fac77304b565784f6af950017a30a903f83923ef8beb4da2d27edf17668d4bcfd8cb8363785a6a9ebeab1723530534ff5d79307e53fa401be53cf79fa887e67e9c172b1b3b1dd9487f260f2b6d63268bc97af9a6c9b2a62ad6cb9c59bfddfe13637b6737fa7d6f36a18a1b15164c124f952d79466f50552f1bdc53e073fb415aefb5a04a558c8450928e8998acf154bd1fc18557a3724f07e144fb9b15384c089eb2752d95baf292478b22631a8e519bd20feb454d26d54acb6a75fdb6dc8696d2e6288af559b27c6b9b23b02cf4dee5e1eb5e3d08e5d21833e7bafdaa63969c31df9c1bb5fdb20c210f669714844b8f6a754241c8307267172a6c9f5c6fa2c19a0b589f2deacaaf3c15a5a7b81db452fdb9ad6675094108859c066585789919fb365fb0f80676754f7a511bb0d75753125dd4a64bed28bd297e7ae3b88b3125f69fb1b6e4f309897d5bc8006dde220972a31919d6b1b809d9450c29ecc50719252415e6a50380e4efd2c35a75d1914fe7ff47bfd7aa2511b87fe231564c2134eb9f4127bbe36902b0ed38eaf40a809d81ff795b9a70c2df6bce37ea1170019207561f21be7c0b29f28a55a2b64b4005aafd76b8a29f953c0ea286560d556a439f128459bb1ab3e4e738492709cfb3452c999266f065dca6ca7b17c74ea8400e802ef754c6ea533aa14c751f6dc6dcb9ad86c754a3be27b0f21ab2401d73697aa121ab4c29ef9bce3645346d5e43a66ee55d1123d0dba7418b8698d4aba9799fb956266585543766851173b747760ab70ca26dc9a223ae7c844f82cb70a7c1b2d4b7161432697688f5d0c84cfb3e50c98f238ea66a453cc629ba62d901e298071dcd1a3dd0094e9771c188cecae8f453527e5e555bc981956d2b8e63dd65ccf1058cf6d4b02fe6c39a71b74aacca23f916e0df706aa4eee71ed57ef374b18f92d776338a3febec4e1bc1f000297a5a4075b4bde9d635368402d78cead21ce05c08cb2f06672ace5e2a78244c0d4e8ab9039de18a9ceb4b4517a2157bce2a3cc8e4396b4268f14b0a6235223c9eea52322f53ad7b8cdb04bb0dac5cbd37ab2436bf68b44ca5cd2cdc7a7fe13a0afe6bfe89071fbbcb03dcb21250b80daaf767c42117622ef62506efb7c6efe18c8c7307916eac1a5f138c2d4da05a267c93d5d84f15e0dcd0405e3b33a822f0496f5d031f45d50da6268f35370daec2a68323b08c1c7bd06a7ba0ced3fc295724b45b7e6bcbdeb20153921b588dde5f144546a1729128a4d001443b74fd63edf10f8711ea2e884aed9379a80a6b275e4f9f916d67f31b0dc1a636654ab0377e2b498b397891b0d0d80666c7c1345fa78b1639fe8b54bb14b2dfbfb7b6ab768ebf3a6fe78de554c6417d785a48b597d68ec5de4333de87d8fd945e69ba9bc6e6f05f3ffb14d052e06786654dd86ef4f3a2e4cb0db820cf40ef524edc7ed0986347ebff5741c3ae1b4f1ff2791edb57f30d5429b5e32ef822ac8ce236f152b469c1ab48be81ec9001afe4ad6f6e88d54dc6e90618f8e20d2b4f2ccb8fdf55cc4c9a757056b31948f5ae27b134ca8138c2fbfa5de6d9bffa15db7284298ee5297228cac71f590a1158b1aee6513a0227a56b9966deb51784dbaffec66d8383b2de61b2ca97f5ce8b1feaf80cf6da2493ca423031420996c99f8bca43c7c0cb0156e2fdc4e66cfdf9a13fe93fefd943fcdbd6379047a3a3dd5ed5c234614b706ed52edcbb9b50185af459148ab78eec158ecf0ac7da31e125a7ea855bf72cefa3729959007ade7d1facb199e373c498eaa5d5ed59ef668caef860b223cfa2fdea954bd105178e401229abaf7e14211b4060f42c5b80c76d32fc73d6f16a771799af4baa8f3fdb78b48793cba7f63e5517bb1d618619a6e5325f7883fed61d42c922b1a2dbf68061127f05127645a154c42049ae34ad7e53543fef3840f0d2ad48e96a210e19eafebcf94c53cefa17d08ecf69b487646b5ecdef2540e7c9b810ab50d7ebcfcd9022b2bcdd6165d2e000ac27d25cab712deb616f40b290ccd8d0ea1ceef9bbf684aefbdf685ca81c9f0bad8bafe915eeac91800b86f49867e06b3955373f0bc275bc429a9a9687ed4b2b5cdd9828b16735fd91fb7c93cea3423d140ec0316f3b6439ab37a3f55aa7dbce31523036113341a2a5aa1a03c15d4c4028b8015731487bab84861f3a29c0d11d4a59afc4ee6afa1ca12799efa40e602da429483fc4413803aee89fbe0717a24e3587fda93c35e6de5fb0c2f413ae3c33e71f6f7486b3f1d2f2eac0830bd787cc7fedfa536ccf3296212d1fa950f1897a245d6f0580ad83ba4d78c8fa0362b691d7db4950868342735c3e6dd614c8f653e4080c39ed64afd123fa46f5f542f1d71d41d4692e625dc7c5e5f7c87ba7dbd509ec0908f4b41e8dc81ceaf338f7601d1aad660dbf8c59e4f17453edd14a3ce5bd6ea4a27c9ee13c9d1d3694996a1464677589c6d9c964739b3f63b1c22327489677ed1e09a5e918560881ad788ce6b860c447b56008c20287bc46ac2b19a5efe70e95e24ae397f568c2c90df239cf4c258a930f75292dbb1b44dfcf664dadfed60c3abe322d192ec8a6156b41de0a6475b2a3ffd124d8a5d1acff660ba97120c710e8e267e848f27bf3e24baa47bc740bd340201a3e072718169e045e25d3f63209f6c95ad488d3422e141a87246bb64fe974f6ab2a7108261a3143344cf00122def1a899f64d2021afe112c172d57764df0b85264c783c2a1947aff407b38adfcf0a9cb63fa501fad6076a1b983a5dc4f1884af9e500d241c12a29beabc80714281843b3d1486f3b6eb0b0964150660703229abc7337fe69d608045d3030272abbcd6ca2b4558abf3031e01d04be9428b75e26856538c0f5598ce6d67dccd1708e1f12af19231406251532086ace1548db65da5d5253c7e129725d5400b328cd87d14f2795e9de796ae382e44eb282bacd0533ecaaa6e75c36496ac2aab5e45050fefa55be368dc69bf0fcc48430611a1a890e7a76af4f678cea778d8c4283774a3c08273a07ebd7c1e20b8f4e9f127f80a7bed7452e62b2ebc692bea1210dc7f4d29fd5601dded04b053c5f6988ab456c8001ed908469d018fc34605124b47418422091f4aae525cd91561a9d94787934050c537db32b5a32d6951d0a0c5dbcda2882e75e5b712745a4e7d32fc37ce032d0216de3415cb58442cb18fd0b48514dc80e2cd2752ac1dbe909766cf458177fd3769a9e0a6f465c88b24699ea8b6f587c679895ff2d34ff5a6a85c4635192f0a8936e6102d274d20dbb5f740376453bb6ab13e02c86e2be706857a07a236b5682e8a35082f1ccc8ccf5b050c66236f2a8370277aa182f20dfb05a49351c883ba8282907ddb3340e172e94dabf6ef67c7ebad86a6ab64b6e7f120316342306125e375e3e06901fe36bbfbbf63c7ae085cc90e2db6a0181042e852e4f31c3147157442c5afa9e5a630f46ed19d1f86ed902e0d6502413b42cf641d7ef703c0c2db6af483ad20eef4aedcabc598060fa414eab96f19e3391d1d65d9aec420d64ffd9d1426cbaf67dff171b094de081d91c155c6a09bae1f00e95cdd867ba2b653272a074e76c507a2ee4f2f5d59e5d4b8138bf51c4762770d7150f936014de511b0a8725a91556b9733aced0d776a95a00ed0d91d7ef6c2c2c137235fa1b62225cabfa979ea38da92c56dc17baa7fce72bb82ac4353867d47c5240cee4404bf356875870a4e27224aa6f110058b4b7756ef315ec0dc96060892f9d2a6fb49c3d72d82b8face416bae56f653abc750df53a45e3c139b41d50070e2aa316e953041ec0d58be1e014d6f2b2efaa3a676e3e0cbbceb5ca45881a99027985a4a6dc6676bbf02d259fd40882f68a35913b0c1d3320054804d92a4a7a4e6b86b1816c1b90258c375406875cabc6447a9a8ca917eccab2227ea33a17ac3ed02a3a8fca0af8ce1e4dade4b688c7dea2a0d89a819d6917f3ab7be2514e462d7eb2fc2052cdc625cc375406875cabc6447a9a8ca917eccab2227ea33a17ac3ed02a3a8fca0af8ce1fdf634bbd093494501a9aec0660aa53b434fdc2c2bb989e8d0925323e511358d3815bbaa8adf5400041954decc56e8889eb56eb20bfc30053e7799703af0fc95d74a5b09ae6f77a66267fe6f0a3fc4aa312f4054cb2c1cd7528340e8c9d7975e30abafd25cdd7a04ed6fa99a7c6cd5315612a6a6888fd8ff7d4596885f43f3b4bfbaae8f930c809f72bd9b7e57cfc36fb800f801789fb6974d4d6dc98627ff15c586895ab8940ddc232e93fd1d882d04f58bc0d04d56c5a53fa09285cfb3b56b8e0c67f3b7f219efaa23bc114422f5a25fa8d3e75655e51302b0b0ea44c90a4fa13a0ec293b4591e1bbf212f005c952923055a24ab5174da0b69438f4d07213fc54035b2bee1ecd22d5d0afbd7c3765a6feaa4177e7bb08a60fe0073c53b06f28812dac4db4b1fe949ad574a7f59dfe8a806b4342a3dd26d0adc92a4dea634cff7a1999cc7e08a739e319d69a6dde99c4797dd3bbc59bc444e6a89e75983e7bb447eded8497747dda2be986be1b8f8b8cb6ea36a738cd86d2d066085e60fdc74996c6be40c7402953013eff32741d3eb4f6345fd0d1b16a1bbf19d80cf31c5ca32f3bbae594a7bab8365c64f5be456b09ddb100090df865ab586b9fa0d923cfd1944a3a0550b43da55d18afc3955576d3f248a9483c2172c1847b420d48eaf891ef93b9dc3d0641bbd442378602428314535692187774443ad621ef3d752404a1acb9b8e190fa60f2bfd81a680641cf065135b455fdccfabe8fefbb3d271110568fd0f9dee52b16af92058ebbc3e0ebd1b5fbadb97f95ca79e12d232280348dae34d9003a1de2860ed6abcb921ec9287568e723aecb5be646db1d7485795b218524b4af2e4ccbd7d6071a672a1993a755a2cd79a46414d970f5ed48545ae67f57c0819bb4b318dafbc448d3dd49c86276dd04521330f56c7f2b6108d4720bf3a4928b5d1d2b0e15d13b57635b7f664ef039b1af917e773a5f86ed46e539943101846d38991ff233a85f2a8da940ec108dfd3a3decf1acdbd2ff2339e3eef9611854fbcc60d2baa61a05a487f72371a1e1d640cfc0d212880cd160812c1c996a75ca6a1e1e7291bf1de92c06fa3da4b281f3f58d73d3fc387752610f6ee7fd573caddf6ed47f89290af24340175b3dc02fc8de356faa5bb6dd2221ed3335692de4522a55cf79d0d74a39a98db997f9160b9941e1d26226175db8c9f0a7f99dfce885b975dfda1ce58645b32d1868065752ef2ad2edeae0461a01bea913251919948f05fd31ac7ad7beabae4e6788e50a704bb03e44bbea92dd95f8dbc504b060655eda9a0d069afe9ab6c5add5c85f3a349cced0942de4701f13225c5b19ee512a0ac6eada13972e2b80f960e34f746e7eae6fb79f53d87bacc6407848a9fdd4489fc72f72418513a80728418276b95800a80917e6c40a0702df69abd7f8e16de7c874a1622e2206a54a9e8919ff644b2e59435a85674ce6d7b4b751242b91eaba7d5e3d2f1194de5e242d4d3b9730dcea5b688a7d0a3cecddf7570cbe367faee2fa51c15e906895f21a9055bab4571573a68091b795335a814f0d4ba87403658b5c5dcc4daa4fd28c8eb94181dcd60854c0c33a5dc24636addbacb1b48080afd4475fd94762c2af67d19bedb484ba16c0425cafcbdc472e2b4be512f3541b6e89985de87faf374cc69ffa3614a890261f3b3e8011490fea44fa39f0b2fb4dd84c3ff63f4941907ebb7997ce09aaa219e898fc257b241c1b0e0ef424fafa3a37739acf62cd504a40ad5849e223b51e2b54c3bdefb55155e621c830f3ac386149558234ed7920c6934f05a9a5975ece6a5348de0b16cf97b6a4e54e810bf0d51086d4351e47b0889285fd31cfa76fe375f2d04a906de95ca032fcbeed3428b1f65943af178c8420baf054600a8e1832dbc3426817f717596e5502b141e438ca2cef7c98550fecc929b875428406da255ee96857ce5b0c96be91daa7482f71364caa1e9b9a1dfac4a7e35228feb13334f1757e9360c2ab2505cc53c8ed2fdd45184fcab0d75ccc598cc1198b07405d8b0ad9f055b30ffcd1685aa4068f5d7a6a6819e2b31c1a048f05628b4b47b30ad064a314e7f742825ac46281d84a2079609eefe4b710b8ca0eb485bceb3d35b2bb09f8617732cae60fa730b19356ca188a911a45c75cf3849ae4b314c994915d2c16dfd27ad6946b63f12024a3631b06c2295c0eb5cc60c4bc108e0ad3f89992f09a05b42b7920e28223a6edcccff6cee1d4c6311bafb0626f9d174ff1071f537e1a240d23c24c42a74f8d04230a9bfbedbb56f842189d0530a22bd146824cf266e9c4fda56b9ba5186238c0bf539537f3a56db4e41cfe88f747f8da7bcee943ab1e96cc33fc7d6a4b64cc2ac9902a0b3429568ca782bd29c03d67a91c69439d04238390829f9f27520fd1fa2f0f208049e592b102c842cd923bbf9b2424a314558391b9afc73bd5bf7a0ce51cd27b90873269963b0d9edfb8cef2eaa5ea57ac40216cfca4fadf8c8cbb84c2e4b961aeea09b69dd002fd057894a61545c8d1144f1baa1d9607870269208fcebd10d7a5de44afbdc6dffbce4d3bddd5a872b8396b0a31eaded2cdd394f8728dec515d2620f7a25fd965607f693818d4963d9702e7c1835e1253cc895088a2d4cbcf66a319620ffcc127f978e2ceca9941f6c6ed1f10982950db45f7a18253614b7b3707093d5c46816f21e39a76697c4caccc8534cdbbdba930896786cdb7762d29867f38a5c53051cabd9cd9e98d49dea201a11475a11e6cc436b32a54e7d46bebdce88cdc35ca56db20fdfc470dd956525ae07954a2b90ed9df771005a9aaebd3f2dd6a6425ce8fbd8a664831adb58c1c82280fd3568d14fab38868142a765d1eb1e05d3a3be13ba7293fb7a39157b58e304de89d81c46c0332b97bbc4152273515b61ee86e67ab619ad020e9701173def06cda9b4c4f932fb041e3178f338e9f7819e83267693311b8e90eebf81d8468cb5a312725491002c5c6061c49a5488435069c7a369b6069012fef0a518e379222007f6ea7622cb1c235a35b1355bb5641ab16d26730400aff4d8033ea29e472fe29f63aa9d78068dc3a2f719385dc2a612ccf884111f911a8095798fda2a7c708e20a931d2c228e637ff82de3ff44794d2d0ae92ebf6b56361527f081803c4067263ea97f44637ce2cc329168fb17e4e193fc40d447f1c34c1851298028e561e8aaefde8c9c3ebcc2f965ff81f9a603f2d9e4fc5013b8e96cde431fcacb828c6ea5de97d02f659ac02f42bb2310b7ad173897ff55e29848cb6ddbfe90bea82fd2c26e507de666833a1ff45dfd545a4bf5bb6254d118d93863940b076a247af19a993950ea1b736e2281209ea23f71c7b3df75bb9a84b7bf1b5ea18d92145a2fc6c696d04029a994db1e2bdb440e3be7852d8b19d39d8d4fff27902b81865123e21420a9fac6fbd4733ff4d9d4a503a7d9cdd10d70215e14012ad0802b2e60ac09a5909202b5bb744d208f89a093fd784df03e6b5ee3c79917730c5cce72374c7cc27addf735019a2a62c9e24186fcb4ed53c3f0441ec1eb2ef8474f532a76cbda23fbae50f964c124f067e16b9fcfcb4aabfe7adf1eae963932c33017e3b35c4ccc2a1f8bb0f4e0bbc5bc0852ccaf79c7660e693d7d67b87f44bb8928715688c2e5c48ab4dd14771d018ed48668c1ec28ad224ecd1a2a99313e3d0695b581b901d3bc63681ba059d07c0bb02dd55631c5e6b15918ad074ead9aa983d9f6174c03046827ba14cf597f38187fbd80255ea391271c60759a4f534325c41515484da0c34dbd68c3e2d65bbce0c4c9c0994e9200097b4b39551a91e980ef62c48825d5f69908c49c576358df7483f8129ea318e38cf5d012431aa2b37dea3ba5fd4890f52e744222444cbc0ae5a5d3d012334ce64ec1e99d138628d4661b16f3f063a325725774bf390f955caaace65b6ab7ba0d2d25017511a9f2620332f9e5613639fd35ca15f19ca30da2730af30c442d377428ae8dd7a34dbb702861f3fde2921cfe340934ce3443ad1cc3497a596f7f76f3493a956cd003ebccb4b0698a90e1d2a0fe00e9d281a7dc29dd4edca9b38a1dd75daf37d02eac215e9cb6862f95dd21552d913d3ffaf773fa49a81455fa745ae5606e88ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903rootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootsnapd-2.56.2-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.3bb@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 - 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.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/