python3-azurectl-3.0.4-bp154.1.21 >  A bxS!M@eeeb~Kz^gWbm"aT5b^%la1UC@ g_k#KS )c; j;R-<]q f|./%yٱ,ThzK‹zjia w' ];2-jH|oy.~MtwGKDlre;,[~AN*Wu3U椖0M 81668c8e0fab9315c037f3a104aec5fdbb639d5928907ce541b64e7671569ae94de8b892f6204dd2159a658f0d412ef41f5af823 tbxS!M@eeerFπ)"d%A,2&>況a^pHifݣFJ#Nz Ab n!󤨌5jX:﯀kXس˞*U$U8QCi`9*&>~!;:,".gCz콒mpmѵSҙ?zgX(bet)xKrE7Tb_Wrp3סn <|opAp?`d $ ^1:E _|   0 '; '),/b/11283(383c9=dc:ZcBhFhGiHk,ImXXmYmZn[n\n$]pP^zb~cdefluv<wx@ylez\Cpython3-azurectl3.0.4bp154.1.21Command Line Interface to manage Microsoft Azure servicesManagement tool for the Microsoft Azure public cloud service. It allows uploading, registering and maintaining OS images for multiple Azure Account Subscriptions.bxLsheep88T SUSE Linux Enterprise 15 SP4openSUSEApache-2.0https://bugs.opensuse.orgDevelopment/Languages/Pythonhttps://github.com/SUSE/azurectllinuxnoarchq 5e _ : I[3$A$  '80! l$U,{ (>) S e  2$K."&(DN#F %/Y9,4 %3   8Z. ,oW GTx A]+AA큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤A큤bxJbxJbxIbxJbxIbxIbxIbxIYbxIbxIU\0bxJbxIbxIbxIbxIbxIbxIbxIbxJbxJbxIWt1bxIbxIbxIbxIYyYyYy[Yy[bxIWt1bxIbxIbxIbxIbxIbxIbxIbxIbxIbxIbxIbxIbxIbxIbxIXӞYyYyYyYyYyYyYyYyYyYyYyYybxIWt1bxIbxIbxIbxIWt1YyYyYybxIWt1bxJbxIbxIbxIbxIbxJbxJbxJYyYyYyYyYyYyUbxJWt1bxJbxJbxJXv^bxJWt1bxJbxJbxJbxJbxJbxJbxJYyYyXv^Xv^YybxJWt1bxJbxJbxJbxJbxJbxJbxJWt1YyYyXӞYy[bxJbxJbxJbxJbxJbxJbxJbxJbxJbxJbxJbxJbxJ7e3c9fcb09eef05800bc6f582ccefbd1d2e4897d25026b34ccb3285167bfba14b50200525c20b4724888ab258315519e374a04d79b085c0eba27771d651f09bc8bbfe229600f7197a323b7e8d551e11228be9e70aad75611475bcb2b999d78a6db3ec3df816b6dfa0d307fea66f8f9bc99d31b9c484ee55bec862aa88e442c2401ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546bd7753aa583ce20a428e035afb675c1c7815d9f40fdb0c7bb3477a756f03df17601ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546bda33aa04167688a1290ad5bac131189f9fe37193a6c6c85f6885bf5b68b82a20904df762dbd4c2d42d8e6b4134c8a640e384d7dc332005d1583b7ef9583a6fffe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855ab29055d0c165325d57ab9ad7d5a7e3e222934ceb59dc11e89d4b03e2b8011fb361366644bf15359f226720a59193422839dd2cba5b34e22b8b97a61b5f76e8eac47a0e74be86014b51b5c131720a52f48a8607c9a52d4953f6ef5b3e8b8e006bba9fdebdb61d4310435cc11416e1def7d074ea0c6150e85b4ee162b27a8561bbed4a692d69fdeddb3e42f9c0dcb4d98b613567588e572921ec7e662d8100be800688253e83bbebb91157b6aa909f42ee9ed59099414c0a22d069532d32199b3e98ffbd28f64911f2d15e4c2e11b680b65f5c2e19be7842dc6d5671666296b57f801a209058fb2fbbb9a1a544717e87e513235c9fc900a99908939eb82e0c0e0416d0603ccc2ea4ed4e57d0ac543f8598766ff1995e559c16aca21766b92695ae3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85511df5b1003bf759f29985170bed74b8d58b193ace959118809a88898d1480566b36909426ecc42a8d568c18bf788a96d235ab23f9899ef8b6fb8f1a28dfac2297760ac67645877b9f73103272b3e9f70fee31ee87b98e97a71ffedf0b785224f754ebf99198b8c85c21750a2da34807bf58e94ae2aa76e971a6d60c2dbb2f84cf4c18308523a10fe08580656584eb16c79575bdd597f6881e90210402944cbf2dfeb370534f6844740375f9bcb964275a5b1ee1c9a7a7e6aea6b5c97174538c2b1d5acc83da9076462f7c792cf6bc29595c3d670d6783c0bd36c13be613f0d353ccec8daa7e8ca00c79bc1070b7a4de706862f97b278a56ebdd3fef23b85a778c6ca6f52d4e60d46c2ff85904d2cd1acf0b234161e2ed47ee98de6b67320a865e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855350e7071e4b005b2376f8d9e6d90a1bd83eb894f3f8791e57c64214cb824f7f88f4876bc04a9e4c312ed09087953013c83aac5a7d7cecbb5685be6ddf470239ac359a2ff35470ef502e1196b5a46ab57d22f735ce0ca8518fd927dd32ecad9935ed0096ec55e6bad28f6c41183735fddb3ae32a970a6b306fc760ee900a71186fdb32bcf2e6306e387259b28a8c993d5221df4d97cbaa270662359cdc6bcfa9c33c34861e86daf91c1ae35d9435ee802d075776556d40c7a3e8d51b7ec726d83be8b92a963b457608dad67130ad05cfd63b2cb782f77fc432dc51ae94d29f1fd1cf16357f4053d2799ed81d45bf2a7288c46e3271e42c4eaf89c99ee863e0f388b0755cf2838403e25a1829061e60e691cd5a78b6e5516bada50332e968667acaef5e223616388be178d2196b7dfde677020d2d05b49e48a39eed80d75a54fb41ee454540e57bd09a7dc66d52ac70ee4f56887e936e45a130f809361a5751bd55fe5f566ca525b2a51b438a92971cbd98824b86acd5ce5fbaf868cd82217f2ddfd553f85822359be0b5466ccf93a7aed7fc751ccc07882848498d23017de53eb5293d95db2b923bf5db6c83f11f91723711eddd9ccb025fe14393ef1f0506b7ffcc687b125962dab2e3ca9d403c4c4d51ac6a1b838424e09155039b3a08b354cdafc85326fec4271d553aa81fa9a1d4b020d5a9d576000336d549d71833674dc60037f120821910c3f9849cc7e64608f5c6a59d754e38fe88bc98b3734ec4050f2896461fe01ec9156ae5b56cc49d1001648150cd60e1276d14017ab3a6f9dad5449952fe0395e0ad05fce361b642219c607e7f1dbc647a5383efb341adc0df879faa5259613334d66cdb73c00896e89b921091f437ab951d2b65392d8881ab007346ccda8b3fc97f4b91212897a550c63598388324ca069c8fc4d65aafcfe41ac67d0c53fb58f9cbdc966e332901dbd8223a44e7ab9944e1c8b8a8b039d5e760d665bb6389ac6d053273d6e1119aac4fe0bc7b006fe5ba2ad5d8aab05a390562edc971852a77c4bf8148de2fffed0725e59ba3e3abcd7b4899bf98d71406dde0fcd00b3e594db72e7e390e88aa61bb3b13eea9e6bcd656040d2717e62f77950dd37db91e52a0f9974970827e6d9bb7fc6aad7c9d59adace934aa9a0dfcce18e7ef8f34783c8a438f2e0e5fd9051b02baa5f41a7227d46be490f30d0e6e416b3e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855689fe734ee7e75284c7318187e0df7a133ef55234e5b503898568b624f1c7004b95447868fe53c771caccc278e8270d347601f5154531a911fded817b962c9583c23528a3779737753acaa9eeffa69afc88a7ee54d1dae47bba5de59f7868a0521c0478ce32a01398aa2f1e8ee8624676f3fe6b987c1d0c87a40f322244d148189bab228c47f833399ca03d4c68d4cddbfccce00ada9f5d91a265e06992aa1a8678edb5ca46e802649714e3dbe679c6fee606beacfb51050a8b8c6336fa1bfe15a303e9d28dcb6f52f080fe1938bd3576af0cbe7be156e70f53015d1777e5b7ce3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85575d48bb5b55e4a3a71e935450587e566553707799efeb523ad288990fea86dfcaf9380ad2045d4c0233cb7c22fe0339461ae34f0ba45da81d34cc2ba2f91d75a68f4462e60f095754998ec4260aa0d5eac0b3b4ad9dc12ffad5279b9d54e7a4974a32f20f27497ee4e823c6de7d123596b57109b181c21b77e24eb92bbae55830a8cfec58d477e6aef3e3a63a955706f9404d49fa1cdc19cd47b43247ca0eaae2ac3a899144c3994dac1f42562c7bb3e917679a9ce40b7f9967f64a0d32b33f52627f446067bf63c54e8f80db3d0a9f72c5ecf7db4fc99d741dedd7418b4d8f605ae02d2f09fa059dbe68d22838c116267acd9495e14478dd18e96d59facce3dae824735c2ace62cf33b36b0f8816c77ce0a39ccb01fe499a8f9bae05205ef75e4c0805795168f62d80d234339ccdebd0fc97f9b37c290c9b470b4e2f40e71d89c2cf1dc76cbaa9d8e876bbc9cfce30a5d1714c754f245a804ea847cd3d19171410624a56db9508f6bfe5a849e179472437fb1e213fe30b0d0620b69210a58cec0461c87a241e03ddc75356951ad40895488e6e5bbe59274f79de07f7ee2d49c39048f4dd557d6a531c768bea390cdd91353eb7a4d369da73a8e10bf9bbfb7cfe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85521b23f374855c00418ca48fe18e1a894454a0a38e9225f72ffd942357dd5c06faa90a9cd039af19a05af1fa98821a13086baf83bb69a93826852d1dfa1ca996b1cf096ab828fc7975c0b83a45816038233674f6209d0c1f3606c931802422b29e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8557584321a31c1e998dee6502a2334280c9c557775bbe010f65859a2bcee9724d9803eb028954ff77d0046ac971dd845f762b9894181d9a9ad4b3466857cddf7f3216f80dfc33ae8ecb9fc2b54e4719c5d719d6752f363168b6cc613c27402214835a75f8e8cd628015d22d87c45d7ccbee179a3056f35876da608214f7c3b2198f71686041cd9b5f40b8d9cb69a8239679358a206469f3b2a442154e8bd138ad6478602775bbc68dced759d170bd6da550860902220997f3fbe8cf8f1cc360d138594cccd0def9196a2991b7aeed6292e0cc5409e89c0ee45341a8eadb0f6e8fb6fb2717d203f426db97953de843e8666f806bdee38d2ab3bd95c0a8132dc4bb8a8ec1796a8dda32c66b540a5dbe9b6804d5e1828011b01a9b7a32e4f4be40e316281cd26124d354cfbb999efa381d45ce31d56aea2d93992338e3b01098ea780561354d8ce785b4b8a5e171708e472039e4c0fd77a045c7b15f054215eeede92e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85510818ef562d73a4d4793e36459ca944e5fcfd9fcd81155af4f223a9887d8ff7992f56efdc446dcdf6f0481e349d72a9ab12b5c91423448837b6c43d784ec5c24fe11c7b908e18d676c1aca9d3420bde1804320ea10bfeb7bdaa9d10beb62e023d60de6207a094d61a66b85d90fca9420b5edc108e61c7264cef346d9e96034a0cf6284dce5522a7de0b68cd5a30b1a11e15cfce6bc8aeaa35574f36e82b00a9a9e6b506aa5d4151d729ae1f0b58dca2b8fc3fe11f5e721945689839a176d98239c0453dfca6f523830dc89e30309e7d1edba47f37f7e143ec39e38a7ce87cfae5f13ea1deb388ac4a5075fdf5ae25b6b3995c58466adb4d6b85e220d47a9809dab9fa9077ae5a98c5cd1fa36529fb396d259b3e746e26bc14243dbd715f397f02b0d4090514298dc4d0fa500d42a8d08fce12ef78ab544c287c83d2e2653ec4f85eedc64095660cdf15478bade93480cf229f8b94422a8c9e4cd8aa3b6ce3ba9842233b6c2838c82e215f9b55cc827c25dc57c685f3953b029a0ae2f4a6197dd32402e53440de862a8849f03d4420536b8feb3a56310ad8605bf4aada94e0094b1d2c3f680529612d1c2edcee5b7b831815db8e1d1c60ae9de70de6c8f5bf157595a79fa0f3d1734b44476852300a0e3b43a0b7ba27f9ba0b747427bc41c068129168e632801a7537a3c4538af771f2329be784e60047310e742807cfd7722c4076dcde88030e85c8cf3970c9221208efed7b24876822e5b0ee9903f31c4df4eeb274932e2e01f805341f4556a94d8d085af6d71ac09f3993087346fed38e0eab682285e4ee19abf5b8f77158d0061d51b45bead3234df977a1dff73b1808f9e73658e6336daae20f9b0ed258acfbd35709d37ef6386bce6b432828aa62b50d33e62e6dc29348299dfa19ef8b4d514175b97e222a367d9f5d558364718636e34ae4866a55d0a1665ed83a36b4a2b7d6d683d4f16a4c0ba9099e01d9e299dc0b433317f5216d7ab1e423a2bffa5fa8d6fe2b3e231bae33475d6ab7ad6a938fee152a6a59390389886d75182da3f67e9af0676bce3a51de2420d446315f0279faf8fb192cad6c32bb36f516c799ecf51d0a006af19f94d351672ee061341312906rootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootpython3-azurectl-3.0.4-bp154.1.21.src.rpmconfig(python3-azurectl)python-azurectlpython3-azurectl@@     /usr/bin/python3config(python3-azurectl)manopensslpython(abi)python3-APSchedulerpython3-azure-servicemanagement-legacypython3-azure-storagepython3-cryptographypython3-docoptpython3-pyOpenSSLpython3-python-dateutilpython3-setuptoolsrpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)3.0.4-bp154.1.213.60.30.03.0.4-14.6.0-14.0-15.2-14.14.3[@[@[@[@[:@[:@[:@[Y@Y@YY@YYg`Yf@YdYdY_wYRHY@Y.X@X9@XDXXXX,X,XƉX•@XZXZXZXZXXX@X@X@X@X@X@X@X*X*X@XXXXXv@XRXQ4@XQ4@XN@XN@X2@X2@X2@X2@XXXX @X @XWw@W$W$WWWWWڍ@W;W;W;W;W@W@W@W@WίWίWίWίWίW/@W/@W@W@W@W@W@WQWQW@W@W@W@W@WWW@W@W@W@W@W W@WgWgWgW@W@W@W~W~W~W~Wc@W_W_W_W^@WDB@WDB@WDB@WDB@WDB@WBWBW@V>@VIVIVɦVU@VU@VU@VU@VVVVŲ@VŲ@VŲ@VŲ@VŲ@V`V`V`V@V=@V=@V=@V=@V@V@V@VVVV@V@VV@Vy;@VjVjVjV]VTQ@VTQ@VRVC-VA@V9@V9@V'~@V'~@V'~@V'~@V&,V&,V&,V&,V$@V$@V$@V$@V$@V V V V V V @VVf@Vf@Vf@VqV @V @V +V +V +V7@V7@VVVVV@V@V@V@V@VBVBVBUUUUUUUU@U@U@U@U@U@U@U@U@U@UUUUUUUUUݪ@Uݪ@Uݪ@UXU@UnUnUU(U(U(U(U(U(U(U(U(U(U(U@U@U4@U@U@U@UUUK@UK@UK@UU@U@U@U@UmUmU@Uy@Uy@U'U@U3@U>UUUx&Ux&Ux&Uv@UuUuUuUuUq@Up=Up=Up=Un@UmUmUmUmUlI@UlI@UlI@UjUi@U_@U\w@U\w@U[%U[%U[%UY@UUUUUUUUUQ@UJ@UJ@UJ@UJ@UJ@UJ@UJ@UJ@UHUHUHUHUHUHUHUG_@UG_@UG_@UG_@UG_@UCjU@U@U?v@U?v@U?v@U?v@U?v@U?v@U?v@U?v@U>$U>$U!#U!#U!#U@U@U@UUUUUUUUUU/@U/@UUU@U:U@U@U@U@U@UUUUUF@UU@U@U@U@U@U@U@U@U@UQUQU@U@U@U ]@U U U @U@UUUUUUUTTTTT9T9T9T9T9T9T9T9T9T9T@T@T@TTE@TE@TE@T@T@T@T@T T T T T T-@T-@T-@T-@TD@TD@TT@TC@T@T@T@TZ@TZ@TTT@TeTms@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.desean.marlow@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.desean.marlow@suse.dems@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.desean.marlow@suse.desean.marlow@suse.desean.marlow@suse.dems@suse.dejmason@suse.desean.marlow@suse.desean.marlow@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.desean.marlow@suse.dejmason@suse.dejmason@suse.dejmason@suse.desean.marlow@suse.dejmason@suse.desean.marlow@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.desean.marlow@suse.desean.marlow@suse.dems@suse.dems@suse.dejmason@suse.dems@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.decole.mickens@suse.decole.mickens@suse.decole.mickens@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.derjschwei@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.derjschwei@suse.derjschwei@suse.dejmason@suse.dems@suse.dejmason@suse.dejmason@suse.dems@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dejmason@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dems@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.detoms@suse.detoms@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.detoms@suse.detoms@suse.detoms@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dems@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.detom_schr@suse.detom_schr@suse.detom_schr@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.detom_schr@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.derjschwei@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.derjschwei@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.derjschwei@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dejmason@suse.dems@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dejmason@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.derjschwei@suse.dems@suse.derjschwei@suse.derjschwei@suse.derjschwei@suse.derjschwei@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.deaosthof@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.dems@suse.de- Bump version: 3.0.3 → 3.0.4- Run tox for unit tests in Makefile- added tox check target to run flake8 tests- Bump version: 3.0.2 → 3.0.3- Added tox python 3.4 target- Exit code for --version | --help should be zero- Add tox setup for easier development- Update path to publishsettings downloader ... and add an additional note about preselecting the proper subscription.- Bump version: 3.0.1 → 3.0.2- Ran osc service localrun format_spec_file Make obs happy with regards to missing Copyright information- Add azurectl to pypi- Bump version: 3.0.0 → 3.0.1- Make all imports absolute. Update all explicit relative imports to absolute imports.- Refactor handling of request IDs Added unify_id method for request id validation The request id value from the Azure rest api is not consistently of the same type which makes it hard to handle the id if it could be a string or a number. This commit introduce a static method called unify_id which allows us to properly format the id into a common value so that azurectl can consume the information in the same way all over the place. So far unify_id just python formats the information into a string. For the handling of the cloud service request id an explicit conversion into a number is performed in addition to the refactoring code- Refactor XZ reading of size bytes Implement a read buffer for XZ decompression. It's required that we can read an exact number of uncompressed bytes from the XZ stream. As the max_length parameter was added to the lzma.decompress() method with python 3.5 for the first time and we have to stay compatible with 3.4 a self written solution to this problem was required- Bump version: 2.3.2 → 3.0.0- Refactor XZ uncompressed_size method Use lzma seek in stream instead of calling xz to lookup the uncompressed size.- Move azurectl code base and package to python3- Add requirement for pyOpenSSL. Remove requests and dnspython from requirements. - Requests is indrectly required by azure sdk. - dnspython is not required, build and tests all pass without.- Fixed typo is vs. it- Fixup some github-flavored-markdown style issues- Bump version: 2.3.1 → 2.3.2- Be more clear on the reboot type Update code comment explaining why we can't really wait for a soft reboot through the API to complete- Follow up fix for vm wait states On reboot no state change can be determined from the API. Thus we define the safe default and wait for the ReadyRole even though the vm might already be in that state before reboot- Fix mutable default values. Default values should not contain mutable objects such as lists.- Remove result not used in tests.- Add azurectl compute vm start.- Added azurectl compute vm status Allows to retrieve the current status of the virtual machine. In addition the wait behavior was refactored to actually wait for the vm command to complete. This means waiting for a specific virtual machine status or status change- Add --storage-container arg to global storager cmd The argument '--storage-container' was not defined for the top-level storage command, causing an error when using it. Resolves https://github.com/SUSE/azurectl/issues/215- Update docs and docstrings to match correct order. Order should be by CRUD and alpha. In delete, show and update compare endpoint names case insensitive.- Add update method to instance endpoint. Add method and cli option to update an existing endpoint on an instance. All args can be changed except the endpoint name.- Updating completion script; generated during build.- Bump version: 2.3.0 → 2.3.1- Remove redundant/conflicting README instructions- Use absolute imports Relative imports fail when imported from a different scope.- Bump version: 2.2.6 → 2.3.0- Raise AzureEndpointDelete error instead of Exception. And re-raise error. Use more verbose index name for enumeration.- Add --blob-name argument to `compute data-disk attach`- Create data-disks during attach, as necessary.- Add an error for DataDisk Attach- Use block if statement. Add test to cover list method with no endpoints.- Refactor vhd extension stripping into a function- Fix methods if no endpoints. Azure is returning a None type instead of an empty list if no endpoints exist. Check for None in show and list method. In create method create a new instance of endpoints list if it is None for appending the new endpoint. In delete return an error if the endpoint is not foud in the list or if there are no endpoints. In show endpoint method return from for loop. If endpoint is found return from for loop. Otherwise if loop finishes raise exception, endpoint not found.- Delete single instance with delete_role Each cloud-service created through azurectl has a single deployment which defines the public network configuration for the cloud-service, including a reserved-ip if desired. Each instance (VM) is created with a role, which includes endpoint mapping for the specific instance from the cloud-service. A cloud-service with one instance has one deployment, and one role. A cloud-service with N instances has one deployment, and N roles. Therefore; deleting the deployment is an incorrect action when a single instance is targeted for deletion; the instance's role should be deleted instead. See https://github.com/Azure/azure-sdk-for-python/blob/master/azure-servicemanagement-legacy/azure/servicemanagement/servicemanagementservice.py#L1599- Update help message for resource deallocation Be more clear on what happens with the static ip address on shutdown and the request to deallocate the used resources- Added compute vm shutdown command Allows to shut down a virtual machine instance. Also taking into account if the used resources should be deallocated or not. This Fixes #200- Bump version: 2.2.5 → 2.2.6- Combine request status tests. Test for Failure and confirm both failure message and result exist in resulting dict.- Return disctionary status from request_status. The get_operation_status command from azure SDK is returning an Operation object not a string. Return a dictionary with the result status plus the error message if the request has failed.- retry operation status result on failure If the operation status can't be retrieved, try again for several times before raising an error. Fixes #199- Bump version: 2.2.4 → 2.2.5- Adjust data-disk size for vhd footer Fixes #197- Bump version: 2.2.3 → 2.2.4- Remove unused arguments.- Only upload vhd metadata on data-disk create The only content in an empty Azure data-disk is the fixed VHD footer, so instead of creating and reading an arbitary-sized empty file, just upload the footer data.- Bump version: 2.2.2 → 2.2.3- Tracker commit for bnc#1007751 Fixup non conforming data disk setup- Bump version: 2.2.1 → 2.2.2- Append VHD footer to the end of the disk- Fixup data disk creation The data disk file must be of the specified size in sparse containing the vhd metadata at the end of the disk. Azure only supports fixed size VHD's- Bump version: 2.2.0 → 2.2.1- Add man information about default data disk size- Update data-disk manual page The man page for this command was not in line with the current state of the command and its subcommands. This Fixes #193- Add missing data-disk attach subcomand help- Update bash completion On make build the bash completion is automatically updated to the latest version. Thus it's not required to keep an up to date version of the file in the git repo. However, it also does not hurt and allows to make use of the latest completion from within a development environment- Bump version: 2.1.1 -> 2.2.0- add --show-in-gui and --recommended-vm-size to compute image update + tests- Document: storage disk upload skips zero'd blocks- Bump version: 2.1.0 → 2.1.1- Tracker commit for package update (bnc#999200)- Rebuild bash completion- Bump version: 2.0.7 → 2.1.0- Remove line breaks from manpage source.- Fixup command order following CRUD- Update reserved_ip manual page Added information about reserved_ip associate and disassociate commands- Added compute reserved-ip associate/disassociate- Added reserved_ip associate/disassociate methods- Fixup unit tests Some unit tests open a network connection and are not correctly patched- Fixed setup.cfg WC1 None [pytest] section in setup.cfg files is deprecated, use [tool:pytest] instead.- Update install-azure-sdk-from-git Use dev branch by default- Fixup version for future module in setup.py The version of the future(s) module was accidentally used- Add to docs- Generate SAS URLs for disk images- Fix missing returns in validation shortcuts- Move date validation out to validation helper- Move SAS permission validation out to validations helper- Provide disk name example in help and man page- Move from --identifier to --disk-basename option The new option name better describes the expected value- Kudos to Steven Edouard https://gist.github.com/sedouard, great gist for creating blank vhd's- Add future to travis requirements- Refactor compute data-disk create command Really only create a data-disk and do not require an instance Use the attach command to make the created disk available in an instance- Refactor data-disk create method The command required an existing instance to create a data disk It should be possible to create and register data disks without immediately attaching them to a running instance. The workflow should be data-disk create followed by data-disk attach- Add python future requirement future provides builtins.bytes support needed for creating empty VHD disks of a custom size- Extend scope of documentation to explain how and where customdata ends up- Update compute data-disk command * add data-disk attach subcommand attach an existing data disk to the selected virtual machine- Added attach method to DataDisk class Allows to attach an existing data disk to an instance- Accept string or file as customdata- MOAR UNDERSCORES- Fix a grammar error in docs- Simplify descriptions WRT base64-encoding of customdata- Fixup flake8 issue- Handle custom data via file or string on vm creation re: https://github.com/SUSE/azurectl/issues/177 Also resolves an issue with double-encoding of customdata - the custom data supplied _should not_ be base64-encoded; this is handled by the API.- Update manual page for data-disk command- Update compute data-disk command * add data-disk detach subcommand detach a data disk from the selected virtual machine and retain the data disk vhd file * modify data-disk (delete | list | show) subcommands Allow them to work without an instance specification * add data-disk (list | show) attached subcommands Former list and show commands connected to an instance specification- Refactor DataDisk class * do not require explicit set_instance method. It should be possible to construct an object of DataDisk without being force to manually run a second initialization method * change behaviour of show and list methods. Those actually list or show information for attached disks. Thus those are renamed to show_attached and list_attached. In addition the former show and list methods now provides information for all registered disks. * change behaviour of delete to allow deletion of the specified disk no matter if that disk is attached to an instance or not * introduce a detach method which allows to detach a data disk from an instance to set it free, for e.g deletion * move default LUN numbers to the Defaults namespace- Show error details from docopt if present- Clarify the format of the password argument for VM creation in the help message- Fixed OS image lookup in VirtualMachine Before we start an instance a check is made if the provided image is reachable by the cloud service. However if the image itself does not (or not yet) exist azurectl runs into an unhandled exception- Update manual page for compute vm show- Added compute vm show command show detailed information about all virtual machines running in the specified cloud service- Added get_properties for cloud_service Retrieves cloud service attributes and all details about instances running in this cloud service- Added --wait option for compute vm reboot- Added documentation about compute vm reboot- Added compute vm reboot command- Added VirtualMachine reboot_instance method- Update manual pages Added --wait options, fixup various markup issues- Added --wait option for async commands Commands which comes back with a request id can be started with the --wait option. This causes the command to block the caller until the request status changes to a success state. There are commands like replication which implements the wait differently because the condition of success for the request is not enough. What exactly the command is waiting for needs to end up in the documentation- Async commands are expected to return a request id The storage account update command should return a request id to allow for waiting like it is done with all other async methods returning a request id- Refactor use of RequestResult in CliTask's Provide request_wait/request_status methods to be available for any command class inheriting from CliTask and adapt existing command implementations to make use of the methods- Update README Fix zypper command for package pre conditions- Bump version: 2.0.6 → 2.0.7- Fixed license setup in spec file- Bump version: 2.0.5 → 2.0.6- Better message for default config file conflict If a default account configuration file from a former azurectl version was found, an error message explaining the possible options should be displayed- Bump version: 2.0.4 → 2.0.5- Use API lookup instead of DNS entry for cloud service check- Remove unnecessary blob service mapping blob service name is always the management url, without the 'management.' prefix.- Bump version: 2.0.3 → 2.0.4- Add domain references for new UK regions- Bump version: 2.0.2 → 2.0.3- Fixed ReservedIp constructor We don't need storage account information here, Fixes #166- Bump version: 2.0.1 → 2.0.2- Automated update of completion script- Always parse region name the same way (with the same method) Config#__get_region_option() had its own implementation of choosing a region, which conflicted with Config#get_region_name(), so we dump it and use get_region_name() in both cases. Resolves https://github.com/SUSE/azurectl/issues/160'storage disk delete' uses blob-name argument resolves #163- Better error message for storage/container config The information for the storage account and container is connected to a region section in the configuration file. This means if azurectl needs to read for example the name of the default storage container name configured for the default- or commandline provided region, it has to first read the region section. If the region section does not exist azurectl provides an error message to the user about the missing region, however the user requested information about the storage container and that could confuse users who do not know how the configuration file is structured. This patch puts together the complete set of information and forms a more clear error message for all data read from a region section in the configuration file- Fixup VirtualMachine and CloudService instances The constructor requested information which is not always needed depending on the called instance methods. Therefore the class requests operational information like container names, region name, etc only when needed but not directly at instance creation time. Fixes #158- Add the --region global option to the account setup command sequence for clarity + We should assume a user is starting from scratch and has no default region in the configuration at this point- Add a tar target + The option will create a tarball that is suitable for local package builds and does not require a complete functioning development environment for azurectl. For releases the existing build target should be used.- Allow a region argument to bypass the config file There are specific cases where the region argument is valuable in a function, but not essential to the configuration file. An example is `storage account create`; it's necessary to define the region where the storage account will be placed, but a _specific storage account_ or a _specific container_ is not required (which is what the config provides); only the name of the region. In the event the region name is invalid, it will be reflected in an error raised by the upstream API.- Added missing setup account test processing the account setup if no default configuration exists was not tested- Bump version: 2.0.0 → 2.0.1- Deployment slot is global to the cloud service ... therefore added roles are in the same deployment slot, so add_role doesn't accept this argument. Since we don't offer an option to choose a role (yet), I moved it out of the command code.- Fixup role name on instance creation role_name = instance_name- Properly reference deployments and roles in data-disk functions.- Added check for reserved_ip on instance creation Reserved IP name can only be assigned on initial deployment- Delete create_reserved_ip_address handling azurectl has an explicit reserved_ip command for this purpose- Check error code from get_deployment_by_name In case of an exception, check if the exception type is a ResourceNotFound error. In any other case raise- Add missing argument to 'compute endpoint delete'- Properly reference deployments and roles in endpoint functions.- Remove deprecated 'compute storage' section from manpage Commands have moved to 'storage disk' and 'storage container' commands, which are already documented. Resolves https://github.com/SUSE/azurectl/issues/149- Wait for request to complete on reserved_ip setup- Refactor check for deployment- Make name argument mandatory for container create If the container name is optional on create, it is taken from the region section of the config file. However if the config file does not contain a region section it is not possible to create a container. This commit solves the chicken & egg problem. Related to #124- Update README More detailed information about the account setup Fixes #124- Fixed deployment label setup on instance creation A deployment label can be specified on initial deployment only- Fixed reserved ip setup on instance creation A reserved IP address name can be specified on initial deployment and requires a create_reserved_ip_address call before. Additional instances in the same deployment cannot be instanciated with a reserved IP address name according to the current add_role implementation. Related to #144- Fixed instance creation if deployment exists check if the virtual machine deployment already exists. If so any new instance must be created as additional role to the deployment. Only the initial virtual machine instance must be created as a new deployment for the selected cloud service Fixes #144- Update README Information how to build rpm package- Configuration file compatibility prior to this release azurectl allowed multiple account sections in one config file. In order to prevent the configuration of duplicate and potentially inconsistent account configurations this patch checks the account sections of an existing default config file for conflicts Fixes #138- Not all operations requires a region setup Follow up fix for 'azurectl --region compute image list' This operation doesn't require storage information from the region. If the region name is given this is enough. Fixes #140- Provide subcommand help as usage information Fixes #139- Update usage information for global options Depending on the selected service different global options are available. This patch categorizes the global option information to be specific for the selected service. Fixes #137- Not all operations requires a region setup azurectl operations like 'storage account list' or 'compute vm types' as well as 'compute vm regions' do not require a region setup in the configuration file. In addition we allow to setup the account with the region setup to be optional but the code always reads in a default region setup. Therefore this commit changes the behaviour to read the region setup only when required and allows for operations without a region setup. This is related to Issue #124- Fixed typo loction -> location- Bump version: 1.8.1 → 2.0.0- Prevent double render on usage- Add some scope to the docopts Use the brief descriptions of function scope, WRT Azure, with the docopts as well. Inspired by Robert's request for an explanation of the endpoint commands.- Fix up manpages * Reorder commands and options in manpages to agree with docopts. * Add missing commands/options in manpages and docopts. * Add brief descriptions to manpages explaining the scope of functionality within the Azure framework- Add missing sections to the root manpage- Fixed completion generator- Sort subcommands based on the sorting rules.- Add subcommand sorting rules to README.- Fixed docopt setup for compute image update Options for the image update command were not part of the usage help- Fixed docopt setup for compute image --name Be more consistent what --name is used for in the compute image command- Fixed docopt setup for compute image --label Be more clear and consistent in the docopt specification for the --label option in the compute image command- Add an example date format, consistent with other date fields- Add a description for 'compute endpoint'- change --blob arg of 'compute image create' to --blob-name- change --name arg of 'storage disk upload' to --blob-name- Add details on 'container sas' subcommand- Provide custom usage message Instead of the docopt way to show the usage information we provide an azurectl specific usage information. The usage data now always consists of * the generic call azurectl [global options] service [] * the command specific usage defined by the docopt string short form by default, long form with -h | --help * the global options- Sort commands and options in docopts alphabetically- Add a date format example- request commands were using a deprecated internal interface.- Use azurectl with a management cert instead of publishsettings A management cert allows the user to define the certificate used for API authentication, instead of one generated by Azure (which is included in the publishsettings file). Since no publishsettings file is available, the other data normally supplied must be explicitly set in the config as well.- Update README Update developer documentation for changed API- Update README azurectl caller semantic has changed- Remove references to publishsettings in Classes + Consolidate cert file construction and service instantiation in account + ServiceManager is no longer of value + ServiceManager-dependent classes are moved appropriately- Move compute storage commands to storage service The subcommands from the compute storage task has been moved to the storage service. The following new commands exists * storage container list, show, create, delete, sas containers * storage share list, create, delete file shares * storage disk upload, delete, blob data, preferably vhd disks References: https://trello.com/c/vQ8nMkW3/138-azurectl-move-compute-storage- Update documentation for storage commands The compute storage commands has been moved into the storage namespace. Thus the manual pages needs to follow the change- Add management_url account config attribute ... which precedes publishsettings options- mv StorageAccount to storage.account module- Better user experience on command invocation If a command plugin can not be found show a list of possible actions for the selected service- Use one source tarball Don't manage completion and man pages in extra source tarballs. The information has been placed into the MANIFEST.in configuration- Adapt completion generator Only read source files with docopt information- Added MANIFEST.in to describe package sources- Refactor management into sub package management/service_manager.py management/endpoint.py management/reserved_ip.py management/request_result.py management/data_disk.py- Refactor storage into sub package storage/page_blob.py storage/container.py storage/storage.py- Refactor instance into sub package instance/image.py instance/cloud_service.py instance/virtual_machine.py- Refactor config into sub package config/parser.py config/file_path.py- Refactor accounts into sub package account/setup.py account/service.py account/storage.py- Refactor commands into sub package commands/base.py commands/compute_data_disk.py commands/compute_endpoint.py commands/compute_image.py commands/compute_request.py commands/compute_reserved_ip.py commands/compute_shell.py commands/compute_storage.py commands/compute_vm.py commands/setup_account.py commands/storage_account.py- Refactor utils into sub package utils/collector.py utils/output.py utils/filetype.py utils/validations.py utils/xz.py- Complete deletion of account configuration If an account configuration was deleted which was also setup as the default configuration, the call left with a broken symlink. This is not a problem for azurectl but should be avoided- Don't fail account configuration if storage exists- Update compute storage man page Added missing/changed information about upload options- Refactor ServiceManager base class Any class using ServiceManager as base class requires the presence of a storage account because the constructor of the base class always reads the storage key and name. However the assumption that every azure service management pointer provides access to a storage account is not necessarily true- Make blobname arg optional on `compute storage upload` It's common to use the source filename as the blob filename, and Storage#upload already handled that behavior, but it didn't account for how compressed files are handled automatically. + Make the argument optional in the command line + Properly adjust the filename of compressed files- Add domain suffixes for new Canadian regions- Update manual page Information about --create option for account configuration- Allow storage/container creation for account setup When configuring a new account setup an optional --create parameter exists which will create the provided storage account and the container as part of the azurectl account configuration References: https://trello.com/c/q09teezP/122-azurectl-better-initial-experience- Fixed azure module names Use the module names a pip search returns results for- Flake8 fixes- When waiting for replication to complete, show a progress bar... ... or be --quiet.- Allow setup of custom Azure SDK in virtualenv If the pip version of the Azure SDK and the Azure Storage SDK is not suitable for the development tasks we have to manually install the code from git into the virtualenv in order to allow azurectl to make use of this SDK version. This commit adds the helper script .virtualenv.install-azure-sdk which pulls the SUSE SDK fork to the local development tree.- Add argument to wait for replication to complete re: https://github.com/SUSE/azurectl/issues/89- Add a command to show image replication status re: https://github.com/SUSE/azurectl/issues/89- Update README According to the changed setup account behaviour the documentation needs to be adapted too- Man page update Style fixes- Update man page for setup account default- Refactor account setup default command Instead of making an account section the default a symlink to the specified account configuration file is created References: https://trello.com/c/q09teezP/122-azurectl-better-initial-experience- Delete setup account add command Combine this command with the configure command- Refactor account setup list command Instead of listing only the information for the default account the command now lists all configuration files and their setup. In addition an information which config file is used by default is part of the output References: https://trello.com/c/q09teezP/122-azurectl-better-initial-experience- Update documentation Man page update for changed setup account command- Refactor account setup command Instead of managing several accounts in one config file, each account is represented by its own config file. Support for account config files were already in place but the account setup command did not manage accounts as single files. This commit changes the behaviour as follows: setup account add/configure creates a new account configuration file and does not add sections to the existing configuration file setup account remove removes the account configuration file and not the section reference in an existing configuration file References: https://trello.com/c/q09teezP/122-azurectl-better-initial-experience- Refactor loading of config file Instead of loading the config file any time a class inherits from CliTask just provide the load_config capability and let any task explicitly load the config file when required. In addition the load_config method creates a new default config file if no config file existed and the user requested the automatic configuration file setup on the commandline References: https://trello.com/c/q09teezP/122-azurectl-better-initial-experience- Add command to list storage account regions- Add a command for listing regions for starting a VM- Make `compute shell` command a bit more convenient- Add commands for managing VM endpoints- Update pre-commit hook for flake8- Add additional development dependencies to README- Update and document virtualenv setup Along with the virtualenv setup the bin/azurectl entry point is no longer required. We get that for free- Update documentation Refer to flake8 which covers the whole stack of conventions- Cleanup storage account commands listing storage accounts is part of the azurectl storage command. The compute storage subcommand and its help has been deleted In addition the missing 'compute storage share help' command was added. The manual page existed but there was no way to call the help from azurectl itself- Prepare Python virtual environment * Use two requirement files for development and normal * Add comment in setup.py's install_requires key- Ignore .env/ directory- Fixed exclude syntax for flake8- No flake8 on travis for the azure storage sdk- No flake8 on travis for the azure sdk- Cleanup code according to flake8 checks- Switch to flake8 checks flake8 is more accurate and precise in checking the code for e.g unused imports, unused variables and more- Move data_disk unit tests to pytest- Set x-Bit and add she-bang line- Improve setup.cfg with pytest and other settings - Remove obsolete section nosetest (migrated to pytest) - Add section bdist_wheel for wheels support - Add section sdist to create tar.gz archive by default- Restore .bumpversion.cfg and setup.cfg Seems setup.cfg was overwritten by .bumpversion.cfg accidently. Restored setup.cfg from commit e0d09e7e019- Privatize some methods re: https://github.com/SUSE/azurectl/pull/105#discussion_r55975836- Use upstream method for constructing blob URLs re: https://github.com/SUSE/azurectl/pull/105#discussion_r55976239- Update travis setup for pytest- Move from nose to pytest nose is no longer maintained, thus we have to move to another testing system in the long run. This commit updates the make setup to use pytest instead of nose. However all tests needs to be migrated to pytest now and no longer use nose/tools Fixes #102- patch version bump- Fixed upload performance issues Revert back to our page uploader and adapt the code to use the pageblobservice code from the latest azure storage sdk- Delete custom coverage check Use --cover-min-percentage=100 from testing framework- Add command to list data disks on a VM- Add command for deleting a data disk from a VM.- Add command for showing a data disk- Bump version: 1.8.0 → 1.8.1- Add bumpversion config- Prevent real HTTP connection in unit test storage_account_test::test_update_error did not mock get_storage_account_properties which causes a real network connection in the test- Create a uniq disk identifier on vm create When instantiating a new VM, we create a disk file with the name '_instance', in the selected storage container. Since storage files have unique names an additional information is required to allow creation of multiple vm's from the same image in a selected region and container. The naming schema is as follows _instance__image_ This fixes #99- Add test coverage of alternative Container init scenarios- proposed solution to calling Container from StorageAccount- Break an overly long line re: https://github.com/SUSE/azurectl/pull/97#discussion_r55652223- Alphabetize azurectl exceptions- Inline a large string with dedent instead of breaking indent re: https://github.com/SUSE/azurectl/pull/98#discussion_r55486058- Add command for creating a data disk re: https://github.com/SUSE/azurectl/issues/103- Rename AsmObject to ServiceManager re: https://github.com/SUSE/azurectl/pull/97#discussion_r55359763- Add `compute shell` command -> drops to interactive python- Update man page due to updated container options- Update option handling for container operations * container show should have the option to specify a container name. * container create should have the container name as option and not as a mandatory information. If not provided the configured container name is used. * container delete should have the container name as mandatory option to let people think before they delete a container and its contents- minor version bump- Update spec template azurectl has to require the latest version of the azure-storage SDK to support the advanced blob operations- Update storage code to match azure storage 0.30.0- Added compute storage container create|delete Allows creation and deletion of containers for the configured storage account- Cleanup stdout printing in tests- Add commands for CRUD of storage accounts TODO: add tests- Add some general docopt validations- Refactor 'reserved_ip' command to 'reserved-ip' ... for consistency with other arguments; rework dynamic loaders to better handle multi-word commands.- Instead of importing , add local camelize method.- semantic version bump- Add reserved_ip support to creation of VMs.- Add manpage for 'reserved_ip' command space.- add 'reserved_ip delete' command- add 'reserved_ip create' command- Add 'reserved_ip show' command- Use an inflection to find task class instead of title()- Foundations: list reserved ips- semantic version bump- Bug in errormsg for VM domains- Add VM domains for disconnected regions- Fixed doc/man Makefile Fail if one of the used tools to build the docs is not installed or throws an error- Indentation changes per review comments.- semantic version update- Blob storage in disconnected regions Define the 'host_base' for different azure disconnected regions; derive it from the management url, and pass it along. This enables working with blob storage in disconnect regions.- Use management URL from publishsettings Instead of defaulting to the standard management URL, explicitly send the management URL defined in publishsettings. This enables access to additional endpoints for detached regions.- Added python-azure-sdk-storage package requirement Our Azure SDK package has been split into service and storage management. Therefore azurectl has to require both packages- Added tests for PageBlob class- Update Storage class tests Due to storage upload refactoring the tests needs to follow- Complete tests for XZ class- Refactor storage upload method Instead of a set of nested while loops a new iterator class called PageBlob has been introduced. This allows to encapsulate the details of a page update in a blob storage and also separates them from the actual upload code- Semantic minor version bump- Update spec template to require azure sdk >= 1.0.3- Allow image upload to retry a block upload multiple times Instead of dying when we have a failure on a single block upload, try more than once. Number of times to try can be passed into the upload function as an argument, so we could, in theory, extend docopt to make this configurable.- Make decorator methods real private- Allow custom date formats Instead of forcing the user to a specific date format, it is now possible to pass in any format supported by python's date parser.- Update os image test data to more realistic values- Added date and time format check Make sure any data/time attributes in an os update call uses the Azure API date and time format. Fixes #87- Fixed check for URI based OS image attributes After an update of e.g privacy_uri the API might have changed the value to be still correct but different from the original value provided on the commandline by e.g a slash (/). Fixes #86- Updated unit tests to make travis happy again Travis has changed their pep8 default setup to be more strict. The tests failed if a comparison for a bool value is not done via 'if cond is True:' or 'if cond:'. In azurectl we have used the '==' operator to do the compare. - Updated unit tests to make travis happy again Travis has changed their pep8 default setup to be more strict. The tests failed if a comparison for a bool value is not done via 'if cond is True:' or 'if cond:'. In azurectl we have used the '==' operator to do the compare.- Add command for listing a single image, by name.- Update travis SDK branch to master update_os_image_from_image_reference was merged by Microsoft into the SDK master branch. Therefore the travis checks are back on master- Update spec file make sure to reference the correct SDK version- minor version bump Support for updating OS image data has been added- Add missing setuptools dependency to setup.py- Update manual page man page data for azurectl compute image update- Add missing dependency- Added support for replicating to all regions The option --regions supports the value 'all', this Fixes #77- Added azurectl compute image update Allow to update OS image metadata, also check if updated data was really set. This Fixes #76- minor version bump Azure SDK has our replication/publishing patches in a a different namespace. Thus this version and the dependency to the python-azure-sdk version were adapted- update version requirement for legacy service- Update module dependencies strictness Instead of requiring an exact version we opened this to match the major version and its releases. This fixes Issue #73- Adaptions to replication/publishing SDK patches My patches to the Azure SDK were accepted, however I had to rename the methods and the class where they live after review by $MS. Thus these changes have an effect on azurectl too- minor version bump- Editorial review of message texts- Editorial review of message texts- Use the host DNS resolution setup Instead of directly asking a public DNS server we use the host DNS configuration and assume it's properly configured- Editorial review of message texts- Editorial review of message texts- Added check for region consistency When running an instance of an image the following region constraints must be fulfilled * storage account region and cloud service region matches * image exists in cloud service region This patch adds those checks prior to running an instance and provides useful error messages to the user. This fixes Issue #69 and Issue #68- Added check for cloudservice URL A requested cloud service will be registered as public address in Azure If this address is already in use the service comes back with a message that is not clear to the user how to fix the situation. This patch adds a DNS check prior to creating a new cloud service and provides a better error message to the user. This fixes Issue #67- Update manual page Add information about minimal and mandatory sections in the configuration file- Prevent misleading use of template name- Update usage message for --account option- show all image attributes azurectl compute image list did not show all information- Cascade up the location attribute removal.- Update manual pages manual page update due to code refactoring from Issues #60 and #61- Delete config file options storage_accounts and storage_containers are gone from the config file. They were only used for pre validation of specified storage account and container names. This validation is meaningless if the data provided in the config file is not valid compared to the service. In addition the combination of storage account and container was not validated at all. Thus these data was removed from the config file. If an invalid storage account or container or a combination of both is used azurectl will raise an exception with the data we get back from the service. This fixes Issue #61- Refactor account handling Instead of managing multiple account sections in one configuration file we allow to select a configuration file by a template name The former --account parameter specified a section name in a configuration file. With this patch --account specifies a template name for a configuration file with the name ~/.config/azurectl/.config Along with this change the options --config and --account are mutually exclusive. --config still allows to specify any filename. The basic structure of the configuration has not changed. Thus it is still possible to maintain multiple account sections in the configuration file, however only one can be actively selected by the default_account attribute from the DEFAULT section. Switching between accounts can be achieved by selecting a new default account via 'azurectl setup account default --name ...' but no longer via the --account option. This fixes Issue #60- Don't pass the 'media_location' attribute to python API Signed-off-by: James Mason - Fixed completion generator mutual exclusive options were not parsed correctly- Prefix accounts and regions in config file- Fixed completion generator global options without a value contained the closing bracket- major version bump- Update manual pages and documentation- Change configuration file structure Instead of one account section containing information about the Azure account as well as information about the storage/container account it is required to handle these information in separate sections. The reason for this change is that storage accounts can exist in different regions. Therefore the storage accounts should be placed in a region section This refactoring also impacts commands with --region and/or --container options because they are now handled as global options. The new configuration format is as follows: [DEFAULT] default_account = account:name default_region = region:name [account:some-account] publishsettings = filename [region:some-region] default_storage_account = name default_storage_container = name storage_accounts = comma-list storage_containers = comma-list The account setup command allows to perform the following actions * add account and region sections * remove sections * set default account * set default region There is still room for improvement on the account setup command However that should be part of an additional implementation. This fixes Issue #57- Revert "Add a script that enables running azurectl commands from the git project dir."- Add a script that enables runnign azurectl commands from the git project.- When creating a VM using an ssh key, wait for service to create the key dependency before continuing on.- Some alpha order fixes- Update manual page for setup account default- Fixed config parser default section handling The DEFAULT section in an INI file is handled special by python's config parser implementation. Therefore this patch refactors the way we use the config file sections. Any section of the config file belongs to an account, the DEFAULT section allows to select one of those accounts as the default account with the default_account keyword. In addition the subcommand to handle the default account was added. This fixes Issue #51- Remove unnecessary imports and params re: https://github.com/SUSE/azurectl/pull/52#discussion_r40405561 re: https://github.com/SUSE/azurectl/pull/52#discussion_r40405594 re: https://github.com/SUSE/azurectl/pull/52#discussion_r40405682- Fixup app initialization of CliTask re: https://github.com/SUSE/azurectl/pull/52#discussion_r40405511- Override a smaller scoped method instead of __init__. re: https://github.com/SUSE/azurectl/pull/52#discussion_r40293520- Simplify code around re-raising an error. "By using raise with no arguments, you will re-raise the last exception." - https://wiki.python.org/moin/HandlingExceptions re: https://github.com/SUSE/azurectl/pull/52#discussion_r40293596- Update coverage reference- Fixed code smells- Major version bump Added request command- Update coverage- Allow `setup account add` to function without an existing config file Addresses Issue #48- Cleanup misleading use of get_service member- Separate commands and options in usage message- Added request management Added support for obtaining request status and also waiting for request completion for service management tasks- Minor coverage checker fix Don't fail on missing hash key- Fixed wait_for_request_completion in vm create The RequestResult class expects a service management instance not a cloud service instance in order to get the request status.- Minor version bump Follow XDG Base Directory Specification for config file- Update README file and manual page Added information about config files to the README Added information about debug option in the man page- Better error message for config file not found- Make config file message a debug message Along with the change introduce a --debug global switch- Display a log message which config file is used- Make sure config file is read only once I realized any instance of AzureAccount reads in the config file. This is unwanted and should be done only once. In order to fix this in a clean way the AzureAccount needs to receive a Config instance instead of the data to create its own one- Better error message for missing default config- Moved primary default config file location With respect to the XDG Base Directory Specification the default config file location for azurectl has changed. The default config file is now searched in the following order and paths 1. ~/.config/azurectl/config 2. ~/.azurectl/config This fixes issue #41- Move travis script to refer community project Instead of my personal (schaefi) fork we should have the forked repos for azure-storage and azure-sdk in the SUSE namespace to allow all team members to contribute- Bugfix: image deletion There are two types of images in Azure: OS Images, which are like 'templates', and VM Images, which are extracted from a running VM. Images are created with `create_os_image`; but the delete method attempted to use `delete_vm_image`.- Sub version bump for bugfix on subscription selection- Consistent naming of fixtures- Recomplete test coverage- Bugfix: Load certificates from the selected subscription- Rename a function for improved clarity- Minor style fix to make the completion happy- Minor version bump + publishing with subscription-id config support- An Azure account may contain many subscriptions: + Add a config option to select a subscription id from a set + Default to the first subscription in an account if no id is supplied- Test for default behavior when publishsettings includes more than one subscription- Add XML prefix to existing publishsettings fixtures- Fixed build for older distributions <= 1110- Fixed requires in setup.py due to Azure renaming the module distribution the azurectl required names has to follow the change too- Update coverage- Version bump due to new features- Update python-dateutil to match the package we ship in Cloud:Tools- Support for VM publishing- Set travis target to development branch replication support has been added to the Azure SDK in the compute_management_service development branch. As long as this is not merged to Azure master testing needs to be done from there- Support for VM image replication/unreplication- Catch exceptions from get_storage_account_keys- Update travis tests due to Azure SDK restructuring The Azure Storage part of the SDK has been moved into its own git repository. This testing and also packaging of the SDK has changed- Fixed cloud service creation Instead of looking for a specific exception type on creation of a cloud service check before if the cloud service in question already exists by calling get_hosted_service_properties- Avoid unspecified except blocks- Update SDK version requirement- Specify log string format arguments as parameters- Specify log string format arguments as parameters- Fixed Health indicator- Added code health status to README- Don't use old style class declarations- Fixed unused imports and variables- Fixed unused imports from OpenSSL.crypto- Fixed unused imports- Specify the scope of the travis requirements file- Moved comment from travis.yml to requirements.txt The comment about azure usage from pip and the fact that we currently use the dev branch has been moved to the requirements.txt file- Renamed requirements.txt -> .requirements.txt As suggested by Marcus :)- Support pip requirements.txt for Travis too- Inserted requirements.txt for pip Useful as you don't need to change .travis.yml and only the file requirements.txt. For more information, see https://pip.readthedocs.org/en/1.1/requirements.html- Update code base to use SDK's dev branch Microsoft will release the dev branch to be the new SDK. The version will be at 0.20.x and is incompatible to 0.11.x This commit updates azurectl to work with the dev branch- Revert "Integrate with https://codecov.io" Sorry my fault, wanted to integrate with landscape.io and not with codecov. This reverts commit 956b81b- Integrate with https://codecov.io- Fixed completion generator Add special handling for --version which will also support a short option form -v added by James in the next commit- Short switch `-v` for version.- Added Travis batch image- Increment azure-sdk dependency to match version in OBS.- Remove logging noise during uploads. The scheduler was still triggering events during upload, causing lots of log noise around the progress bar. Proposed solution is to add another class of event for logging to ignore. TODO: subversion bump on merge.- Minor version bump. In accordance with semantic versioning, both the `azure files` functions and the `compute vm` functions should have been accompanied by a version bump. Time to catch up.- Added support for compute vm types List available instance types and their attributes- Don't require test env to provide a config file- Use of has_key is deprecated- Test code coverage now at 100%- Editorial review compute::vm manual page- Don't require tests to have pjson installed- Test code coverage now at 99%- Added RequestResult class Encapsulate operations based on a request ID returned from the Azure API. This makes the code more explicit as well as allows to think of commands like azurectl compute request status --id azurectl compute request wait --id in the future- Update spec file requirements- Fixed completion generator Option values of the form [opt1= | opt2=] were not processed correctly- Update manual page for azurectl compute vm- Fixed shell quotation for bin/azurectl helper- Added compute image delete command Along with virtual machine creation the deletion of the image created per instance should be possible. This also completes the image command- Added support for virtual machine management- Update travis setup to allow custom azure versions- Added support for the Azure File Share service azurectl compute storage share list, create and delete will be added with this commit. Once created a file share can be mounted using a CIFS mount- Update README signing git patches belongs to issue tracking and solving- Update README Improve the flow of reading the doc in the sequence of the tasks in order to get started- Update README Added information how to install azurectl via zypper- Catch ConfigParser exceptions and handle them When adding a section we might run into error conditions like DuplicateSectionError. These were not handled and caused an Unexpected error plus trace- Switch back to argument lists For details read Pull #27- Update README, editorial changes- Update README Make the section about signing git commits more readable due to style and format- Added information about azurectl setup account use- Prevent hard class dependency Don't create a hard dependency between commandline arguments and the implementation classes uses them- Apply Sandy Metz, practical OO design pattern Use an argument hash for methods with more than one or two arguments- Validate if given publish settings files exists On 'azurectl setup account add' check if the given publish settings file exists- Fixed typo in exception message print information about filename not class name- Add information about signing of code commits- Make sure warning messages are logged on stdout- Update coverage reference- Added azurectl setup service The command allows to manage the azurectl configuration by adding, deleting and listing configuration sections. This Fixes #10- Fixed coverage checker Dealing with new source files not part of the reference data caused an exception in the checker. This is fixed treating new source files as 100% covered which are then compared with their real coverage value. If the new source can't be 100% covered an update of the reference data is needed via 'make coverage'- Fixed build latest change to make build target breaks the build because the spec file template was not adapted accordingly- Update spec file requirements Due to incompatible changes in the SDK version from Microsoft we explicitly bind azurectl to an SDK version >= 0.11.0- Fixed setup.py azure module version dependency- Fixed azurectl for use with latest SDK version The way how shared access signatures are created has changed incompatible- Provide version number in the tarballs generated by the 'make build' + It is easier for packagers to manage packaging if the version number is encoded in the name of the tarball. This is also common accepted practice. This fixes Issue #24- get_operation_status called on the wrong object The status can be queried with a request ID from the ServiceManagementService and not from AsynchronousOperationResult This Fixes #22- Fixed Makefile target: build Delete version information from setup.py on make build The rpm package and the packagemanager should handle this exclusively and we don't want the egg info to play a role here- Version 0.8.4 Final touches before first public release- Pin required python modules to version in setup.py- Suggested changes to the existing manpage content- s/azure?cli/azurectl/g Tests pass, make makes- Added test code coverage check Based on a reference file test/unit/coverage.reference.xml a check runs which compares the coverage ratio from a current nosetests coverage information with the reference data. If the code coverage decreases this is an error and coverage-check invoked by 'make test' with fail- Log error messages to stderr and info to stdout- Update travis setup Use an azure SDK version from pip compatible with the rpm packaged version we ship- Filter out message from BackgroundSscheduler Appscheduler is auto connected to the python logging system and spawns info messages about each iteration. We don't want to see this information especially when we show a progress information from a long running process- Add information agreed upon during final code review- Fixed setup the name of the dateutil module is python-dateutil In order to fix the requirement list the name must match- Fixed man page typos- Fixed missing logging.setLevel By default logging.INFO is used but other loglevels are possible if specified the call to make the level effective was missing- Update README- Added azure_command_help.txt reference data The README points to this information but it is not present in the repo. It was only present on the trello card- Update README- Update README- Beautify error message output prevent unneeded class path information and use format instead of str to format output strings provided by the SDK- Version 0.8.3 Added support for Shared Access Signature URLs- Added DataOutput class In order to support different output styles e.g json, XML or machine readable a new class to encapsulate this has been introduced. By default we will use json as output format. Along with this change also colored output is added which Fixes #11- Fixed log.info call One overlooked old style info call, now clean with the python logging info implementation- Fixed storage::container man page layout markdown to man conversion requires this style change- Use python logging class The python logging class offers most of the functionality we need to log our messages. However it does not provide a progress indicator. Thus the logging class as it is used here is also extended by a progress indicator- Add manpage content & fix a typo in docopts.- Added file type identification for upload source The azurectl compute storage upload command will now detect the filetype and apply the decompression only for detected types. If no supported decompressor type is found the file is uploaded as it is- Add additional dependency: dateutil The other additional includes are all part of the std. libraries (datetime, re, urlparse).- Change travis config to allow use of container service- Redefine test to be not bound to my specific signature.- Generate SAS URLS for storage containers- Change unknown exception to closest existing match.- Validate new arguments- Add task & interface for generating container SAS urls- Fixed exception handling in AzureAccount exceptions from the service management service were not caught which caused an unexpected error- Fixed install_requires in setup.py- Use SDK make_blob_url to construct the media_link- Added note that we need a get_media_link in the SDK- Added azure sdk via pip to travis tests- Only run pep8 tests in travis Because the azure-cloud-sdk is not available in pip the support for running unit tests is currently disabled- Added pep8 to travis install section- Added travis CI configuration The project will be added to the Travis Continous Integration Test framework- Added tests for exceptions AzureBlobServicePropertyError, AzureOsImageCreateError- Added azurectl compute image create command This command implements the creation of an Os image from a VHD disk image file stored in a Microsoft Azure storage container- Fixed Makefile default target processing- Better error message for unknown service command- Update README style fix for list elements- Update README- Update README Add information about manual pages- Integrate man pages to package- Added manual page system Each command and subcommand understands 'help' and opens the appropriate man page for detailed information- Added manual page templates for azurectl commands- Fixed rpmlint warnings- Fixed spec file template due to name change- Fixed package build target completion source tarball does not contain the azurectl.sh completion script at the right path- Fixed package build target completion source file has changed its name- Fixed spec file due to name change- Fixed azurectl completion Continue to complete possible option values for the used command even if one of the set is already used in the command line- Fixed typo in AzureXZError exception message- Update completion generator The previous version was based on completing positional parameters. But we don't want to use them thus the completion file generator has to adapt- Don't use positional arguments in help command- Don't use positional parameters- Added unit tests for publish settings exceptions- Added --quiet option for upload In addition document the available option values- Handle error conditions for publishsettings import Exceptions for invalid XML and/or missing Subscription section are captured as well es decoding errors from pkcs12/base64 decryption- Fully automated creation of bash completion file completion_generator now based on python to parse the docopt string and turn that information into a bash completion file- Support a default location on non Unix based system- Fixed task unit tests The tests should not read the default config file, they should read the unit test provided config file- Handle parse error + Provide the user with a reasonable message if there is an error parsing the config file.- Copyright needs a year to be valid- Add pre-commit hook + Run basic testing locally before commiting changes to the branch. This should help to catch the most obvious errors first.- rename the config class read() method to get_option() + The new name is less ganeric and reflects more closely the purpose of the method. - rjschwei@suse.de - Editorial changes and additions for README.md + Add dependency list + Add more information about how to contribute- Fixed completion for current caller syntax This one is just a start. The completion script is a static version and not yet autogenerated from the source code- Update location of global options in help message- Update README due to to rename of the tool- Adapt command usage help to new caller layout- Adapt unit tests to new caller layout- Restructure command call syntax due to review- Clarify parameter names in __query_account_for()- Perform align check prior to setting upload status- Added doc string for all classes- Fixed e-mail address in setup.py- Rename exceptions to azurectl_exceptions Avoid confusion about generic python exception class- Rename azure-cli command to azurectl- Added Apache license and pre-able to source files- Automatically know about new commands- First series of patches according to style guide Also added a pep8 test target for the source and the tests- Correct program name in version output- Delete unused code- Update bash completion- Added missing test for storage_container method- Update README- Added default container name in config file- Make sure the upload progress is shown At the end of an upload update the upload status to ensure a final result information- Added percentage progress bar on upload- Added python-azure-sdk requirement to spec file- Fixed build- Added completion data to build source- Added automatic creation of completion script- Switch back to default completion if no cmd result- Added version.py export __version__ for the entire tool and use it at runtime and for building the package- Added rpm package build infrastructure- Proofread and correct README.md for azure-cli- Update README Provide more detailed information how to download the publishsettings file for a specific azure account- Read new zero_page only if required- Explicitly set UTC timezone for upload- APScheduler api has changed adapt code for use with non blocking scheduler- Update README- Added bash completion to install target- Make --max-chunk-size a disk command option Remove the option from the global space- Added bash completion- Add a Config class and test Move the former account super class to be a config class because that's what it knows about. The single responsibility of the Config class is to be able to read the config file parameters- No need to have an Account super class Since there is now only one AzureAccount class there is no need to have an account super class- Switch to JSON output- More precise help messages for container and disk- Use named tuples instead of hash keys This is to keep the dot notation and the message based object design- On XZ error raise useful exception- Refactor account usage Use only one AzureAccount class to handle storage and service account credentials. They are tied together anyway- Cleanup storage account unit test class stub names have to correspond with the implementation- Make use of mock.patch Instead of global Fake class definitions use patch feature for unit tests- Added 512 byte align check for PageBlobs- Accept XZ compressed input for upload In addition an the option --name for disk upload has been added to specify the target name of the image file in the container- Added XZ decompression class- Update README- Move container content to disk command It feels more natural to allow listing the disk in a container by a disk list command which also allows upload and deletion- Fixed too many spaces in variable assignment- Upload only non zero pages This implements a smarter handling of sparse file uploading- Use put_page to allow offset based page updates- Implement our own chunking in upload This is done to be more flexible in uploading big files as list of blocks. Better handling of sparse file uploads will be a follow up on this change- Update README- Update README- Add used storage account name in container info When calling e.g 'container list' you get all container names but you don't know from which storage account name was used One would need to look at the config file to check which storage account name was configured which could be avoided by just adding this information to the output- Added azure-cli storage command Allows to list names of storage accounts- Added method to get storage names Added method StorageAccount::list() which returns the names of the available storage accounts within the subscription.- Added list_tests and single test targets- Fixed unit tests mocked classes are not reset which prevented the tests from being able to run separately- Fixed typo, uppload -> upload- Makefile target for test should be a phony target- Don't require explicit import of task classes- Move command docopt usage to task classes Cleanup and simplify task classes unit tests- Delete unused get_command() call- Add missing assertions to task tests- Restructure command processing What should be done for a command and its options should be encapsulated in a task class which knows that- Update README- Retrieve account key from ServiceManagementService- Update publish settings reader to schema v2.0- Added unit tests for ServiceAccount- Make use of publish settings file- Added image command implemented service account handling and the list command which prints the available os images for the configured subscription- Added info message if detailed help is missing- Added disk command Implemented disk image upload and removal- Document basic azure-cli behavior- Initial azure commandline tool interface Start with a proposal for the azure-cli project including tests based on nose, commandline parsing based on docopt and an initial structure for implementing commandspython-azurectlsheep88 1652087884  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~3.0.4-bp154.1.213.0.43.0.4-bp154.1.213.0.4   azurectl.shazurectlazurectlazurectl-3.0.4-py3.6.egg-infoPKG-INFOSOURCES.txtdependency_links.txtentry_points.txtnot-zip-saferequires.txttop_level.txt__init__.py__pycache____init__.cpython-36.pycapp.cpython-36.pycazurectl.cpython-36.pycazurectl_exceptions.cpython-36.pyccli.cpython-36.pycdefaults.cpython-36.pychelp.cpython-36.pyclogger.cpython-36.pycversion.cpython-36.pycaccount__init__.py__pycache____init__.cpython-36.pycservice.cpython-36.pycsetup.cpython-36.pycservice.pysetup.pyapp.pyazurectl.pyazurectl_exceptions.pycli.pycommands__init__.py__pycache____init__.cpython-36.pycbase.cpython-36.pyccompute_data-disk.cpython-36.pyccompute_endpoint.cpython-36.pyccompute_image.cpython-36.pyccompute_request.cpython-36.pyccompute_reserved-ip.cpython-36.pyccompute_shell.cpython-36.pyccompute_vm.cpython-36.pycsetup_account.cpython-36.pycstorage_account.cpython-36.pycstorage_container.cpython-36.pycstorage_disk.cpython-36.pycstorage_share.cpython-36.pycbase.pycompute_data-disk.pycompute_endpoint.pycompute_image.pycompute_request.pycompute_reserved-ip.pycompute_shell.pycompute_vm.pysetup_account.pystorage_account.pystorage_container.pystorage_disk.pystorage_share.pyconfig__init__.py__pycache____init__.cpython-36.pycfile_path.cpython-36.pycparser.cpython-36.pycfile_path.pyparser.pydefaults.pyhelp.pyinstance__init__.py__pycache____init__.cpython-36.pyccloud_service.cpython-36.pycdata_disk.cpython-36.pycendpoint.cpython-36.pycimage.cpython-36.pycreserved_ip.cpython-36.pycvirtual_machine.cpython-36.pyccloud_service.pydata_disk.pyendpoint.pyimage.pyreserved_ip.pyvirtual_machine.pylogger.pymanagement__init__.py__pycache____init__.cpython-36.pycrequest_result.cpython-36.pycrequest_result.pystorage__init__.py__pycache____init__.cpython-36.pycaccount.cpython-36.pyccontainer.cpython-36.pycfileshare.cpython-36.pycpage_blob.cpython-36.pycstorage.cpython-36.pycaccount.pycontainer.pyfileshare.pypage_blob.pystorage.pyutils__init__.py__pycache____init__.cpython-36.pyccollector.cpython-36.pycfiletype.cpython-36.pycoutput.cpython-36.pycvalidations.cpython-36.pycxz.cpython-36.pyccollector.pyfiletype.pyoutput.pyvalidations.pyxz.pyversion.pyazurectl.1.gzazurectl::compute::data_disk.1.gzazurectl::compute::endpoint.1.gzazurectl::compute::image.1.gzazurectl::compute::request.1.gzazurectl::compute::reserved_ip.1.gzazurectl::compute::vm.1.gzazurectl::setup::account.1.gzazurectl::setup::account::region.1.gzazurectl::storage::account.1.gzazurectl::storage::container.1.gzazurectl::storage::disk.1.gzazurectl::storage::share.1.gz/etc/bash_completion.d//usr/bin//usr/lib/python3.6/site-packages//usr/lib/python3.6/site-packages/azurectl-3.0.4-py3.6.egg-info//usr/lib/python3.6/site-packages/azurectl//usr/lib/python3.6/site-packages/azurectl/__pycache__//usr/lib/python3.6/site-packages/azurectl/account//usr/lib/python3.6/site-packages/azurectl/account/__pycache__//usr/lib/python3.6/site-packages/azurectl/commands//usr/lib/python3.6/site-packages/azurectl/commands/__pycache__//usr/lib/python3.6/site-packages/azurectl/config//usr/lib/python3.6/site-packages/azurectl/config/__pycache__//usr/lib/python3.6/site-packages/azurectl/instance//usr/lib/python3.6/site-packages/azurectl/instance/__pycache__//usr/lib/python3.6/site-packages/azurectl/management//usr/lib/python3.6/site-packages/azurectl/management/__pycache__//usr/lib/python3.6/site-packages/azurectl/storage//usr/lib/python3.6/site-packages/azurectl/storage/__pycache__//usr/lib/python3.6/site-packages/azurectl/utils//usr/lib/python3.6/site-packages/azurectl/utils/__pycache__//usr/share/man/man1/-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -gobs://build.opensuse.org/openSUSE:Backports:SLE-15-SP4/standard/767b36cd4696a264832ba2b0a99d6cca-python3-azurectlcpioxz5noarch-suse-linuxASCII text, with very long linesPython script, ASCII text executabledirectoryASCII textemptypython 3.6 byte-compiledtroff or preprocessor input, ASCII text (gzip compressed data, max compression, from Unix)  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR%?8E'xۼutf-81cabd4c16917391f4a8f0e2717ec7bec5ceab85f3c3f437c92816d2c4eef3971?7zXZ !t/u] crv(vX0*hϼ]2@M8 t$p*HMKK'l7ŧwcG(5xzaTjӛ=/Qp٘I#gvĂl{@ê{3` Ey0w P߉4=F8kLTMzc69dcViR?Beb%=}[ [iiތmc;N(¨:O"9TiT7I%ž}<=Aje]BHJr$b- ,&~?wGL+Bh oy釃/`qCrr͓^ABRǤkOҍl'n ^9 0 ~1oҾa;ޤO kF߿zGʝ r7Zng\,0wݶNK x^1鐀;sE 6vv"219ysbNA6Q^٭\=%$1E[E&k]حcQ Vy1K jϨVGhfdtthpͳ|Nc;%-}4Ro`Ǚ Uy0pkIG#X ѳIZ~訾P y:a7D+d{=HpcX{!Jt: ~-p#AU߷iNeYD[7e*j@6oq4g4uDǾF"w vQr3eo2VuWq"m[ QO ~tSNAy\شuf O7i9g%r0)ϮdJ Չ1G n `=^RPwh̸w #6TB҅f^.HS!EVʿ$/WC=),S:}HVŋi{e힜XULL QA4%0 a+W@kYx04Z;KwԶtq*5i\wۻIY`GVFO$ pMOwU*DeN,1560۪2@W^!F ﷵY-g)aggvJ8p7#H_#A%tΦv0KS!F]ǥ4@Jo_޷{}IT8E$]lD`z1jG.6#gǕ,Yve}UH"h_2 f<}TгtՃ8n+$ DWل5]シ'Ygﳺ">JSv @Pݣb_d7gF)tZ! 9fpɂ&[8hjSe$+7|4&LJ$@ +ߒ_ h|9A:uaӼN9x$=9?濿q*hmkvjWF~mai v21]1 0e:pG-4J+灳ߙiNB'7. c"+ 7v+ eہ^T)Q!D;@&T7vYۑ9K. bJ \b= PyUY&UM?|aN(K@qrO[ejBƽ 6G3|)08)҃ctgjž `hQ):Mu 0#ږȚqO=TU`Z6mWKS@Kp>r{^,>Ni J륒)vT9# / R•q@H6e!2/b`zʇګƊB۝Ckz&R갆EYP~YH&wJIu#9GP j~g#m!t27|lEΙj7dz [ϔj$B5Bm~7&9z5[jPѢ6A,%6nJ٥ZnVai#f3صWe2\%h5M+nrr.W^.py"o$[/#Xp8ɷmj+cf2BٟhRZ̡;|f9)0N:g:]\kzPyb!XT^(w[.aI-C<9rl%YH.qoPf>We%XV"^p*jz@8|sMe94"K9Dga~jKukWHز{e33F.)CqUH+E{U /sͽu>**;Z3/ɭQe!YC*9.aG&|ҤȞϮtG-Ѻ`:0 qkppW.Gk.z4x7I\6@;gu}d5̶vAdy6+u }+ 5#~l Bםy#e1t}8 η5yIGݖ ԛޘ:n|4@hqL[BG2K@ɞ]zs]!,@㝛:\O?&=2@*|RӲ@D\`nb" dq_@0ZZZ8(ImGȳcvv r[NhZϊꃉD'?7_țbJcBaKb حL#LwYWnw*6,ft!EV1䑽τFM$+A7*D_:uR,}4e!qy v4GWlLl`$z(FrVKqȤNB4s[$OWP ͩ'q&Ċ7,sS~z C>5-Utx%!zLS=>yP[r_^T7Sb&š-\6b|_38㛉FVM#G;]Q&"  pj:crthZX1Wd1] +)ؼ @V%EɐZ%j 3.Elz ~+Nm~a,个Crrѕ]6 {e#Rg.ifwa5(NP^^$*+1/7nh;YuUV`}zG+no%#;)ɠ= Vﲗg᳌q-f&N}۝N&;6koZ/^_v}O<\Nj@ ^ E:h6VV4Wl&8VhUwR6̚=p\' N(ٕ+yT =#a pr Vwpjv1W $+<cy k]83V&mGlC0GlFz# p6*xˆWI" ܪR%ì) :|'CVr(cGfY7{fgVJ画nͤo0f]9dF: T@v#_op?ʜHI{P1@qsrI`:{w?ls +IsifxԡdԁH!touc.936X}R@ZȨ-ӹHtL@vGD9yB~r3%}=V_&;<"@eFܼs.L=K!ƺ`|RH-Ie*6>`Q+e7 h:N4OgN-$ o (hZK+FF8Kֆ\1mk1:yvIWGYIh)B Pjj%$*Wg0۔E9aiyDK^ \u^wsFI0L"4q:@0EMmPsyk^ ٖw/}\z᝶iG;Vo{jWVLnqx2{iE#[gՆ 6 ջˋV)f~hh>wxm]#wRAT4|m-8I)s[xV `u[]=_qbnS5t+ r#~@O8:Gv{c_@!<| 4 Hxf-$(24?5Ի |cC*2!;Eb%͓KthCn߮d㾊O9z:q㙬$;5hNqpVƒt3 bLEM%7ϿDilOJVBJ>" &EX=k5I_{>o]}):SG\\J={kID|֨xW20ޡd bHs}`Ө;/҆_靕 X^ "(5Wf%{")6C)/ꐁ@q7 ~ YÄ܅{~$BϔK L~*#CCw|\ ^  NiSXP>XhV3\(|8sA P1ݦYS;`4G ,lmeAGS3S&|#dR3`= F`N܀)=6=qT6炞 =IWj :Z$ I1uwf0R 1>_S:&0xxF{<7 cؙhpEt꤇{l>-L\hwy$wC1bQF_}5 ,|̩x֠\NdGyw^kQhepONdXtf;cgC|$P}X8Uo]9Vb#6]}B9%/ۜvu%y Cd+=A*߳FXH|ecUmJzE 6X*Q9ʏo9{'orO/˅e1P4Ӧb{PR=q+uG~v  &h.a-C9S_SN'aVx`~O,ɥʻ~ R{+4XHE:Ii;3CP2 in@lW$ֲ5g =z XDLQ#nBp&) 0g 嵻@.w00)9CKIt#$IfGF`'N]Xbp? Si><ΣѴ!&yS~kq^Py^#znp;W| 〤5ˢR3ܦ622X;׾>]ht̢hKW_?_Qx@'kSdQmJo Rs"Vy?0>2KV"`@iKy8 |ÙeסD R0e赣бBa)"sid"p_ `q/G)ҥA ?s!a.4>nll'EMg,a x~zw6݉JIw9U_DZ"bkU24P'53km 8)[MaF;7Gj-P%oKq "vČE:ԚF1a4^-{~f!zI@3$"o0 ^7ZVhSX84_{݂tvK!<#oWCPs%#jj#N:J\ Ρ>ܘWV -Ol90j ]>ugBon"F.U _ UF}CONqPN3)X_tұwۇlsbh+}FzNPI˒a9 JKQĊ˩Out棱[ }gcQm *}MR=-H.Ǩ#.eKC`'[ Ba4M&>5 tz޽ 44)qpbEa¼C1^'Yk_3蛈 wJIި㉎ `*Nt}P^ZRƍrrht7>Nq93$b(`NfЕ(Ȥgg0z$-`H]N:6W Pը>{AJwmTR==#)/ Uhʎ(wHvQIgSd,L>G+]w\.DE=P閧n5""1AU88Q65Rt<`s y,d^J%V} a\rMuBGy𲄛@-cX'3[7/_:c~^w Q9C.魼!tTDg1hn|j{韡Q\A,bKW1f%K6֏ڃn| M=C!] rBL?+Bٷۺ\145o(LGɏJjk"F5V2Ơm.DEXBiship+UcaLeE@f}n"n-dF4EatUȤ&UF} qEm'rƁL a0 r#_($Dߖ<N81%wi_oX>&^w) cy\Yﻬכ7nHL5%OSt<,N :G2ЖnPOO#pZ5V 1l5&tȒERS -\J|;-i+rUu /)[@љV+׏f&"-Zy&+ПJp|Kv;X#)L[aĽSzz$.Cɍ߾K %>o[H_~+Lje#~=k{%]d: {k~zt1fSnM9xP_!nE /N4ETL+{5zr#tr|Dbj6R|ڝ '~o%avVLdͣ ozSyԀV.(i,bE蠷 Pm5RƜ,.A{Z#H7aW8BC^:чS601nR }H Rs$ ޚ1({Q??Hd(X/" -qbge:QWЂM}Cɐ:A7f/%|S(:qRΌ7\rc.\0+'QbVN<5%%Hpw,94 e馲=vF7fKL ,g c@zxɩ$cw+d&ԹةtHTuG }RH*4b܁%n.nI% Žwk|y[՞%HY?X6ZV͖ UA!u4<}+N"]H=eX֭O^&$"7%i1io%Q6EQmI KnUxUg/Y.^=%܊R [5(x]7P72᭰\ Ѩk.W;`L)YH h9=8Iݍ%f4ښDDNaJq@A5OA 46z/%=D Jy;=Q>OHZ %t8A؃BvJC&꒪\fNXho' e%݀'.lѷ_גr+ɟt/mK}P_Oh7wnq~F> 32mM+VQd MŲ +}8oؤo-RS!jP.ϣޘ4S"p-yIvDUEr)b> ffq7oz>JY 9Kf8jH6e7w^yV[y+zЉW};ˬ7ImF`ӪX]i+\\lƕa]l>hQTE_jP?0c ƹWv?*[}  հ2-H)[ף@R3˼+K Pײg-0)`G=d[ M#y]T/BQt7M^bҜa瑗/7n[4vr I^Spǿ0,j%nQIDEKY; r/ÃO^߽grYKk~:,X_8Yn5fH0wG 5:qq;SB0S#J< {D1Kn}Y*>V2%+¾}~v>ߗClcGj'NȱG:YGԘKMTNA1?ɽdʒ V!2")QWH/5'cY`ZXI+ЀeÿI7>j*[飿ȰfC(r%C2O}w)}95_HX~[ܥJ< 7 #TQH5Mw ;TIG&Mz;6"{JKLs}-NyT6l$>O"Em$cFbpIpܽw\Ъo'].]~2nӑ}<׆a85j=bj$?wlz2lAB@(*̍vr& VUײ|YbDOzNɋK+1 &* HnmK\,h>\|îت\8[YU)v}HWC~Gtִ(5!`y!y=UA/1W&iNs&4q﹘[JiWVr)6: +]JYK@}CEê2%s96 lmuxt0-F 1Kt=D4Xԙc\o[>@WR S,< S6]chK-[׃['U:lbP8b>Ę//OhyfQW؂ uV;mŰF` [eV`(e}x%[|AP>gvhE +\(iQ3&hGH ݧ.ehajèBLvKǃz(DT~0b} J=&Re97ItjUrZ3 Y 7Am%P)@~@0µ5Oa. 6=i? |U!IV$ k>σ ZmT8nHu+ Ϻ9cm~{/:H.g*0cH$pgáˉZ0L-:*d.[&Υ[,AIz翫b]7CSZc$tg#0mYX52<{]>Q7n QBR4Qe@+-ʾjdri?8$ $5hʟYuOGUmGu*\ wFmuXnT P 57P M^>*p@=!Sjiȧ3)?\0;/E>Hb2Ň)et d%L2BKR2 0OM~DO-kٞ vx *L9 mȰ'YU ,:"}vIm'Wv|-m;/OH/,.vXMQ}FcPv@Χ8^mmi7yq=)dÀ8k0wyvINeġz]$P1`'s. 3#fns'WTD."-9xO1%DQ3]+&SgԖ35 v2z&Wi"\?l2 M*妝=_"jzdoWtӓW&[6EP쏡s(/E^GE)!tȐ%f5 ^,b~*S~ZvN}h䡷2|q N{. }.rjLKb蜒'FJTΔl@4"W@mySowq7uPlK)je|3CY/$Fq/NV!jt)@=0y%lxJua(bݓh!׭v wץe9ځ "w9oͧFW 9 6+vjԂ2.@!BsJYiޚNǦ#23QN_;2'"$*F= wcl5Iz(Umq&aX%l^7IG+ŗ%w2h$,2۽Cmo31}(ܙսEq1T6qͶ+CY { gKq_yV/qt>qd~d: 'qU 'ۚrq؃ j^}c;6+!Su:=xE9 C"pn)sε'h"XR4CvҮv9V9%~a )(K=QؑےxWv{XZ{Υ[Wuх¡J|Pb?M-/輶@d< ўUgR<:7zeՕ+.SdO!Od?U"5"@pLp VUS:i|si\zh}2U]AC9D".|`wAE#G"iqF]/(\; ћ5d0}{rJW4O"a=P]6x@v7B 4;7POt[ļ"RM|0JiX|meTU$Q6I(]/iյ͇LdNy~Q;Dio!5$jqEã3rΏs0EYYr,P)G1l#[. M r*\3QPbuuX30Jz"OK6ݳ!w]̥rʽĊN\¿|Iw%WH_%bbo´85gQI9Qif3`XSp&F($MQ_78'B=~VEt%jֿ|OCf}Y`tg P=2p7rkF?v"s;2VP0&~>RTH]A]Q4^8MwT*wqԆL(_!Y_uV6N:g}w.U.cV7XG5 5hH+U˯~^YPXeN_bA-@K[}E "+L?g2_]0~d0t_8sy-;;)DpP˚|^^v ]J_bl*Y&}nF}>PKm3"?9S!Cݡտε99BygN%> Y}4ʟu5JNgފsLMgJP!>Ze$z|۵"G&WL9pin<Z0#5D v/Dލs*h:.K .WqLVDm77w|)v s-v$ 0uu9!7P_[PчGYdU Tn\s)fZ l@3/9iupd\<'t^˳VW`=w_H$ι:[D_"SCpa)/k+C:/dުimI\74Ov v ߚ1H>UtftE=@-~Hplf}~=Йqveb]ӫz-bʑ_0' kOi,Y4qxVR\|zS,L4܁@HzC!6 J,޹<>< vì=)U/.H2)cKȋ e 4făBE?!xiV%`i)b{KfCwb5iXYph?I{RdD夃k%;H;Йו{#1i|U5@$|Y1[] w*鲖6;AM g}tGИ0[nv6 *v@uCwǫ0?_zX}vh,Ĩ]0PA i* ]/RtP5ˀc 2=:p 9ټ m,i['i=XH?ĩ)2 (K>k;T#,KWә怟Wwt%o$Gw>uz f8S19iocZ>/! $pQه\?E#~k33 cqq!'4_Sg"i \Rէ7mFdQ"MOM]S3Q .{~kνZ]'`L?{ez݃HiD-\$I5Jb@S7y#]״K ǻGˤL3{Q}Ľ* ;pg6M}GVTUoQx(dSOxZB4>J J5M}gBUq(|L,δo2_8/ F\|"ږ|]6P>Veb'O"b#H`\ ߗVMv4&2s lSS8K=<ȼԏ@Ǟ/Otxr-!h rDhWL{j:(`I2Vyu4d,nc(8w;I+]΃$cy< 6YGe&]se{]0ecFE4mUŶTD!j6w&G* kׁ.,.NwK(ZGS9 jU`?#VQl3ך3% 聿㗾35,$x (S^\ED{Yy~xXGo,m;pr",⤯'JY#C^q^6 h>Ug7?<Ա\c?3B]W~("n{HcBi3@Y#Noj;쁩g. t'b.\>gڣK3#;zlO%9%~O#AI) ٝZe<<ty~FVHvOsqrvwo^Mr4|}@'wlyuj`-7>N2YNcW1%(Yg<.Qn5 Nvqe3<~"'+kQh{e=t0kG(,K tHw`Tk\źdk=>Y[īQ\vұd?`6 >Ń[iKaLPQ;UsR+W +Z8~]\l)9or(l(\~s3I 546 siibN$ ]6C#FCXR^cd'=DI|qrȂ+َDU YHDSR=K u}m"Fpv*w*FaQ\I3T _/Z5:jkUy&hL?Vel3y,tj& hBjld4 5 š0[LjfdJ9 1ѥDBumsL֊LY$Dsf!&VuS-V+Zi aoUi$xXd(amPDquNk2[mFVlњ@HaKC?S"\! .\D\ ę /Y>l?#6 z;=KdqZ(2(ݓ0ޣ1O&Z]gaSw:35o Gk:.fenpe6I |ٶb (z{ƦIeNY"#Ьs[Qk6zaOՎ?ўHzA-ÑdlY j+6miN4JHMOaF{zryq,=7?gk:E,wˎ>Z6mp/5_IʧܘO\3Px7J7gڟ4|YJÌ<}Y@xBoz uG&5_4b[&)g{z;Fl\BA%<^lm5dGL|ήe{Z|e~M~ :j؋(~Zi馓c4b}\~Fmƕ~[ AO c*C"[|#7 Qӿ/>Fo6 I|www+A:פ-M[0M8oUhˌփhk@X\bLeАXbo7޴UNN)hQNz2j]N"z߭r!/)2N₥wFbqN,#CsEӠ .s&p Bb)Q4 K^ٹpm 47d3k4mHh<{OQ :3|ܹ\N)OE_jR^i ww$w@:1>2`@юM^,~aAM R͎Z/h$\Ԅ$o-b[+hr[Z`4$^yiXxY !A3vv텡osk)3 髾 c+w{ghc\*?j񯫪1϶FvDKQ$Q,8LċܨdҨ3~<jsdX)OXN')C~Nj?ijR<򤰊4Z`9M(=Ngv~[YhҔ<~Fʵ1#at% %]{m? W%~RɶA"ЄewzFvW21(z Z5a5} JǔiU/W9d|mnbgt`Z\A(P8ic>'_LRbT#%￑cUPN{)U4'4Ri3# @̜}.fpƚb'"kQ6}dAFXMt4 9#r'7 8Y,R~fY?x+U1éQ:& *pk]nT+514UE>I޵G^~B\$FCT@wEP8VD$P˅Yr$:`dUi q%;e6Kݾ0"izty;40گ,B9+".pBМ6;P5] 2^7(催Z'DBbW #R=b@?Idhf^y4>þ:r&ZC,;5ʏ&)M?40q?ȏYS#0Dؽ B"Wa)1̝5z%Ty ;Rt0NY(սEiTűh Ƭ^H6P2DCoxp!֐?O 5lDFa-37IuUʙL^&<t;T~iE돏en `„fɔ_}p jj:}fIU`;* dr^r`[Pt͗Im`?^`xm>Pr*.K xk:$yKyr?-p~IG=`&'tϠ(T=VCTX:S1=[7kʠ]+oGB}Px3R Q)bJ0~"kkCfLvz2eC`4p D8f!_U[{6.ZFL93=+emsX~]!M=iQ_&pOCo5kkoLˢDRV[< ;^ fJ60x?2.? .JnqaTÜ$i_dPRTsid7VQ p: 3#'DU9!m~$v}Jδ0*>.q&&"9T,=O1m&dowE۳,ahѕD*рu8$nZ,5k)2Kd\5s4CVq]}8Py0CXTƁb󋻆u ~gxP=R qrms(a@.go;Jr-"W6u<%]Y@*=\Jwh2gE`gg}Ce=f>i}.uta?~%;j{jB7?rZWߕV׺QK3+XUgĦkS+0J^D×}"Ѫ]?"o|5[[yE>IuwwH$i*mH Cҋ!W\P:Ãڱ=f3'kAp_2>?uVobEUp\ FX^`]SUP=ʦ?櫀rJCFɍ>4E]Wh[&@i:XughŐ ^. &c-B1GVȢ 0!f>S`lrU,7/ O]_]ن¥F},"U/ Mgږ]JDM`$ڣ\'0igrX)2D[жVفkZI:dA/y1FzնpCzE3S,a= ySS[DB]Ѭ4裟a۫u+ŃM6_CH1ojFi!kJap] LT-lQKyaB(oB LZߖ\ǂ sCRQ1i_!^Z;p$B`́,>zW9{_$0 J8nUWyŢE/BflJ0kgm8F@>xGe0/V$C}ғXiqgW)@LeˢF~2ϣm;o5"ju, ) my9!w5YY8|2ay -ESZ-/_QMiwyGw&ҷ1ҷvk;"`"Z&U\7D:TH{nZ+Lp=JB`R|5J\R>?~< ]:v e~ B[(՘fNtCKQz 4q_){k2x!p1nb :AוF2emD 9k)C"<֧}3t1'x Aac1F&@N,"R#>ʁJ'5:7nd|E F#v2lUg;#2[c_awTM)VpáԎ_:>44#eJ'y@Eqj1SWb\% XY2U{0q/>X o9^gtA{/(᮵fz}:*]DWx['c51(Bnie)HSlw @/뾄rU6E*drM5Hv<}f$9|@oBdz>iR%(xpG{m񪺥@ B Ta4h`.`ȦvF_ ƍ'{u+mb%qўEt~SbJX('O֬/̪H$Fv+@.r۴Yg0 "pMMȚFTi84>[8Mچ83e\[I?Aǔ?8MNnp{jϻh^;vGkYW~C5 Gl{ŖculeUG)1 2|LJ{mFN9NU[}tЁc<%;ءh2pV a1HA!@a]9>Ps oT\ f@"< @oRg JS`|joiUXNtsQ^1lI^?wD$biABlnIHS9Z\~o,ӗ4Ua~g۱mܳK<}CM@CtUH^ Q ڟpMݝ * ,ki40 Xcs ƨ^d _zejAy Xm_y@||-Tg2"fAB8a@ ӌgUt%I z/U_b[(G زso:K̲+ o\vhVy#LYtp=p JA=,w-l|%f1פ Dڹ\-ِp}(3 oHan3lq2#}cm3\_:1BCu)Jxuf,FVQXr:,Pw™:-l1* E[~{2#'L4KC,hyaꚥPMn6{04P @ZE-r' _26[ld3kKP8,b6cP/?۸,`__$4 Pd(N.#Մ vY#糌.˳> S<ګ[,oVyrM5Jq,i΋]\&XY>Gy3X|A82L rMRXWսBrq@]&W:9gDRƒ 7}|߁5`\w8MUSڅ?:Q 1u~%qvG͹ƛ!O1E@ہG.r|r zWI`p+XA 0<\U"EDRDQ)#j罔x-:l V-)'!Fr7KhQ=vJ8]KE<</))E@f^S-z饻ckNO4b[Ka ͝^o}G^Kp2\B3Y^jq.`yij ,PVTČ9i:ex'9MUf#.#sy ^)'`P^ Uo $?E444Z +4Kw>Ӟ냭!'i>r[MϙjD4 e,U~|%Mt\=%btLՠ@"0̥1lRnZ[sFꑐ1i8b!՚mE}Eb*I~R lRjrV#':l15I4$ܯȍտcDw96cd >*7 .9!7,t8u[ [Fa ' "ǁ)i:Tx^ƞJ=fokoG8 wqzB)<˷pUT`P,21cFJp'X_"t՟`fHzU' I{ZlJ1ʏ7 Mg0#uaTFT}d]Y|*pj?;(Zś>kA3G\%b,B哶z\ol悍\aU;j_qk'88~>(X hC{QZ9`ަ{ʐб fLW:ڎ\ɛU&y9A5U^evzHH䠳BF#Ŝ#zk-hٳ'$"lr_E{%dK %0b#5#sOfG2`-U=x(W}x+Y:>EI=t07#*Gd)R%d>GhFJ{guV@I0cQ~̦DӪ"5Ѳ׏UUn8`GoˋbN(S[O ÑGf|qtKEkhY3Ԛϭ2R~6Z9yRITI7ֹF1(Cߧwִ 4 x]obi;<{ Czti9ʶ FYm/|Gkx-5F> Oڿ6|>[H<,OP[0ɊuZfSXQz,ץ#[}cے G+cOvpg62KA N~ `T2)wdƢXydXp (Y|L= [({COs$ R%N$[>~6%Lܴ8VR\fHDĤݲ4W myҟ} =P.ȝ7d6+AB MDHffhb8.n9gvˈ}^Ym)*(9ۼc!Vϩ$; ]#N߂Z ^}Y=5 #&ό:c\xdf]䦂IUp5흄 p2\aŧZxBùj._iw7nH[wWU5%iZ3SQoNPB4t>쯡W(cK0K Dr9WA,iނMTFf 6)3qϹE 2c-p ?pڝ\τ0,]3Cf B*@JIk L1Od4;&!T ܦYz%/%'ijw5coeDlqJ3)h`4đHّ}$H+Hx1;M,MTiېtv%=puE+X5ЬΜDgzI!(Dب{͙A'L"zƩ޲ %1 hѵd`oҊNjv ‹E~3{ot=kI%fxPY{m춉kr*)sx rtϋ~$ن RXAjK<|Lzxj` gpER=9~QgA})?ŌWoE'xU#3sMY/lmmLYGȎ1uGgf{VRUQʊ\T_L$ )}c) (t)"뻊ueͭa%W6 NKȞ?ڮ]veT=y)|)&ĩ&#'Xs5F>Uy=XZXЈ􄁀[Ƞll`ufWˬo>#86ESܗKzu} %5 ޸?oI C&oi?{uj#5km| R1ȏ!9_lK}jCAfq 53r)Q=ykSlĬni=?hǷ?3-/ڟK3(ե|P27_$G_owp B<ֺ<-Ġ2X_dZޢ4ɭL _+_}·T *(=O|eKM{7jaLS뭝3 fAKLDLsDJ)\{-}}`b3`ʻxMe5 $@c>[Yn !EW_UaUxvB4n(TWyށ؛i*l \a{-GA2#d!ǐrvG?}LVE-f嶍Rz^ׁPxzʅ&Y w)v巇U}"-"^vhd{QS芒b-MGl yd 8B1FI mΊG3O*@sX8'3(`apےBi;ǿ,U94JܗY(me11;,jE)n!Kݕ(orƎXnҭnJ;qx1HEr[ Sذ ڛ!zV3 ﭮ `qW#$8I%.PUڟutSR&g:7Z۽GgP?4BGkhA&X솯lXxbmQpG^2-+:wGΖxס Yoq #N&ѾK}* O6% m "PaϤ_ FP R7tbݲ4 u%FBpY bL 1Џ_m,9شۑ+*رƍMH:V7 NZG\ySPpM0)oQS m9Y ;Kd"xœm5]m9< Hvp_P 88vwv;4J.' M=d71 Uۧg' >[/,އ#[`~< ز`"}Ow(ƿ#߀#' 5Xm", /ZuV7˰C2|j36 ("$Ŧ3ifW*)-G$jur5wu[}O|BVj.@}V~R^4wXr͹eCn?C΃VDfd'YNyc1`;׈nap Ŏ!GB`N[b3x̚7[*g`~; l^b5鸬c`uW19{<GNQ>XCE֏qN"]+n75j=0 >\^q0ڋL$7oT(N⚋غe,ZpZfW,/Xڗ aҌ|t8<zHn/6%+ކchAuG_5u@c[_D(}-\A_"]"WxzzvRwȈ 7bL*n9N~5>c/^$!Jx -"P~Ϋ 4xiX )v*Thu\E ]gM}0! >˓y6%JvW <=tӴxf05U_u77mW=.&yk_ 6|첍oߣ.]3qpZavt +(dC%D6swA [fݘn\ Eɣev }ܳ͢1EvQv-0aG= ))͊们b`#A6JNEYg@$Bb$9:/oQjo-A]]=.%+:U0) 1:-8iJxdLc芬"/o2٦"BpADCue u?` kUPdv}sj룪ջh&C2I`"50PJj-G>hPPƠV~Oap3Bp~<Z]1j {!ϣT&ۃzNl Dw(í:o`~)T"*~Md=*~(ǘ1h8@47iք U ] ɚқО*!Q#ڐ]*~']Zk ~ќI>w,DUu&\3ǃ2ѫ(~rL#0m)fgl$t}pn_N#֕;%PHÁ~i.: ZJ:k #Œl i e;?~ʳ- r@Kfiio1n"q$ $ ꙝE gfVoMnM-hۿBl˗w|KOfgե)1AQ)<O (؀jBiO^1LLXT'Vk60YM;Wu<9Suʃ&)ч1OQUAN{)g0TˮH۵KK;j2xs9MY.jfD'F!ɟd4c<5nkܪGK#Eu]w3.Gy@nU nh֖8;}D43m[ZH@ ?)a uB0+%=UxdžǦFee`0ϕ)PHMc}5;\T|8,ժư:FP1=M="wTc` Í^4言'-/Tn7C!UXPc+/aĕ@|KҘu;  AlյeR4w]3pEAFAgIk7!^8%fiȸSm&f\`=7L@pHxaMMfM\g'^XMSa$U8y; CGt:.2-C Z[wxHlq HMzyPYٲ0۷ xkFg1)<g>z;dC}h>sт^[b;J9}TN_,ck&O2PmU_S +T[cڋKwѨmfMǖAT@ 緀ݐ"%1r8sjwNڨvMPSZwC~)WCpxvt[P}A]CwAFP^&m_r\)"K h.l:"B؋9[PP 1IH`Tb ݧʋ:c$gӜE3{&`hߪ}E~;]abo-t,lBZD5T'⮔8l ZũkgXxD2YhQd~t%|K6:` ~D8"U7wk) i"}rARa*G ARo@O!7?O1Tt$Y%1s61X3$]`kOOA^Md95]ٝ*VlwՄ S/Nf qY2}(X,^⯆`eEQU!e|{>Yt2H2 SZtwh8&08)s(mKMWL3tװ9(yF;|LUIU%|jPҜ6?.F qwIa] I0úCdl8Eyn=wDh7%z6Gp,=j|7I'&`ԃ PՍPǁs0`}dM-MƨBwH5M^powE]ؗN{I= -`cGExUPʍ\Afp1DoʐcQ&R"fL?{C=N6Bco]GJ9:w{qAsSB.EE)bVhi#eЛIUR(@t/6lN*Ǚ"?̈ZF!zG=l36f%I?{i^8ĕ  !0_ U}WqLJky"L%ASLzd;r=%za 6+By.EУYI)&vj53zSpP|[ o/y|MAP˚:1׬˹2\n@a 5R>rh|!a r3aKcz*e\Rh$`r73"aZFЫߦ߭` SҪ8|q7^6\Ҵdp֓Z.*Ce-6BUV?e]Ѽ%#g7@CгɆBG4{/I4l?J . o;xXg${oTvuqmAEsBnc÷|WxFXO/K$ErމJ;ajs0>J 2?ԭTd)vSZ]D6R'Cfߪ%^J ݉8VN>th=*0V^֗ГXFeFM曌GQո'-Mi״6r{jC#\!pd:(5"JONbX53͆L!ܿoy6 pJ̠cp/׊e` 75-C x?'{e%~JD@c)ǵ6*;!`a\Q8!5aT' wkP4'9&y_6,b$ }%.$Atulم%B["n”UGm~PM),Y2;'噟*j[HG\^S.Ooh( [ '/Nr;͜sZd s+G3E5&q~Xz(L

4h< vkwxuQ 𛘧߬g_C4rz* F<'%1/.fnxw?=3\zJ0. d,ЫqϲfHޢbkد^K#TQZ1s|OiĜf,v2$Aa&u'`Ϳ@ Z3HF1Z?EӽBP_5{Z )Ǣkh抈D>08k ΃(/[KJ e"znP5 ke<=@r@ir9qVLd_m8S*92Ǡw=훉NY"lU~{)JlsVp%@il)bw^K!p-F)^NshB?."m+Ss{ {q&s`bc=uMZ(mY(S)&@QL =z}!IT$TL~֓88Õd'XI H"rMiq:u&I/][F%SA{S} 9HD[4:$%ɋb=ɒG4:/$ M z#h&P598]a^Vlĭ@Sv:фԮs0u3SFKv6K#o覗AeZ1k2,J0;k(%ڗ p@W j #?fS{VBG `p䰔Ő7נDO}Hc %T=~wkB<1H:^W'k[% u˞=Marn8`*2xLճu)%gY_N3dDO6sB#SQ.2͵ N6eGd}:@YΝ7pRfM@_:G{U0lYƸJi/ 恟30u~LT_eQU2aGcͅ5guBj<#@Fq>r?¾+ɭV O #-얟;Rq(AɀZn}j>4nUF*v,Oq‰ma'߫BT3Sg~b9PI٬H`z|am񤔍_0GስdڵL8ɲ#zEQUvk[(_ӽ5se t "憉vIM)M~9A܄Wjq3z2\Cwx]`~HM%W1*`⌏>WD:]jFbR?tF>W)?zQ`*k#],l92Q~Ngj9S+KombXΫ1b_lOiۊ+eW_{_} ̨qa!ppʩ'≃.& `kҀVx~ H{Opd CQ{%.Kp²+O_ߐꆔ957Iɽh^:Ĺq˖}dDzd%@`3%.l_z\zƲq6=)e n ț(:2&Ӧ'L=?aS ' (SmrfO^@HS "])r{* 2_~ܭ?z&E&B7xHkK l8[Uyҗ8"Q9$eZxgFA!yn]V-s&xլ?& Wx?s/vf."ؘ;rN c!΂RVN{-s?LVV4m]utqQL[..l CDC 3mUiI٬>¢+-mF곣Ԯ|9i&?z-k5?}pN~Rfhڙ*+Ttb]|S.H 5u.a b5T4DTxd-&SqXJ~)ub3 gl!Á}};xU||bY0ޞB7+Via.g712KyHS)O9 n&N"_{nH.a;Cp]]SkU$;ՍD 'T>6IiA 查?f6]2~Չ=TTQC,| UpyL j^ i~Ku&tZM턢c2"C{Vq9/C$h>UlZHk!b e}sqO(ԣEVOd2¿OYR;p׎CL;5j vf3C1N-8H㏎|ӒF`O8t,sxѭ[V >lkM`s:-meR72㉕/Ts}#T˪hO{.]vqU. NJWF&{3C6hY勯ZbTiw>+łTְH(?lt0Z.iyä= .]f{Ō-=S_J n&!!%}"n[aG"sFΩ,$1WE1l@?GO&ٯ k=%%Fb$< E+A/3{ ȯIcTϯdM;F2oЀqx/t$*GGG߯vHc<5S:n_e' P@o50vz\caTc,"KdG*4!DF,!L5a LIHp]ȃWQG焂f};d/J{d÷ՕXPPto$נސ"#P; lgtVtp~ZU' g"Nq1lƨu)/fRSI"qFVY\OHEԃ꣘[_1FDb\c/CMɳƖh 9k&t9BtALE2XPbg7[ hG%X|#!߽ª!+prfܞG~TcIs.#/E>3 &Σ% o#n-44clj ʍmTVO)˗A>X3DK-ˠ'DP<`xFs JK X*ҡS脬H%bwYUh:RQ9ˡ $2p.w\)5N@ϠK'K\ chD&$cXu_P $( W0L,t2 iҊciO//XIc1/`BmP\≣ɇF] k!;T(EqW s2!=τ}G{S8 {Px)HvRKeߎvqs2*Ԙ iR{sU?uPEF'3ԅFqpRKq;p&i"I'f*N0xB$lb+t~Uʤ`bMfo_Z(L2?J( _r*hEi6])b%AJq, tH#p-M'AD`"4$~7zuS4)l1f_TB@}'^{6`U8#gFIO j YEmn1RNfAYtgoi<-cIp۟U0/$:3cB17{'{{A!jﰣXU66ڦ9Y=qӠsx.nCWW1r1'Tf츚BiXU]>}Kq+Jd]8/9SXA7LgS! *- '7sJ9u9l P7 h@N[B`JIٚ[Y{4_=r_R=Z1(fP4N(NzLQCZci{T>bzFcҽ0N Z0LtwrN8kcbn \_Πf9X8ÏI,g7j} [oJ "KHHsUޖygY&23wAYW Adi&0k @%pԠAcJfEsߪԌ9Nj[hUn'po)q{f:i5?shQ3;5ŎY7U1؎sh;F +q0!'hx"؃Sʻ*KSm9nz+ y$$ږ_ u*߸C})W3 3rrޑDR`ACJjAݿTyݰc}vXO0+vwF!Vv'3~ s"Z7,e?T$A:5؉hPO'_wBK :Q G]|'j}mLt -GuT<ņC]Cs4۹$7]8@秾yXc hFaoniMBY`>\geڥTRtC "Zޅb)I1:Tz4BO}D'X 1Ǭwf=C=lo>Q <:% < R;x(cM Tjj ^l Qgg{vH(K '>a*̵n3$P@yRi=bĬEΐ)e2Vꃉ"-WQ'b:J!١)yi1xvp*[.Lti̮&V5SJ}$TĻ$軣 L[IS(φpv$|N*+)nF8uL/uӠ9<&OJw)ɯ`+lnl*=7bL3.~?O:Ka+ZO_NۦY~`V&X હj8W'&L=È=Y]Z+UH?.{D{TM1HTXe:jOִ0UtڝZ>5yUOrKNGE&[~47, \_x,۠f¤n< KFdT%R*toZ1!6E|S>qY?E09nVUkEqԢrI]X<[Iynn]}ۉR\{j֣ywuƦ][rn7ݲOޱgؗk]5NeP-BĆEE ,fLrz%F09SJAK(D&h_F"b!&DifBNYjsvU?Eȏqz/PI>+Rp0FL1< $ȳ@cfX˿7L: pKc,\}: S*]#L,nvk(uo. k BYN֍^z9](WWfi<|A430ʥ.`s}aBM(+!19%@` ϝ]ЍwjP_NHEΰTUcfk,ԁC1Xme')Xٙ'v8>,os/>6]*b3(.r50uD#yc&ů߾?a_F\g Vt(Cy0\K[ayWJUv@vŢBK|mRGNcU3+q!8o(+n(WtURXxOը尢Im5||ߨdlNcR|gӢѱ :5@|h@٭ ++E {F&j*#<ßllq9ڕg=ZvU4z]-]|^PNbm#$s ġҲwl{d}e;kчן 1:Yih-=V(⯑vx@R=(yx|셞\+9EtbN0w0A5t_~ ;6e,7uEkN ώVkpZ`+M$;5\%yDSfE ZG2YctaϤqhLakq;nw1,c%aWAE53\rhzn-i` V m:6v\m>du8EJis3;ak9N7P4 x7yʆr5h8+3>;Еn{G u1k="iCG0eOma(E[ >9-QTCsSȏ dhѯ)1S!HxAUX~gJKj"mىC/IZ] -2 9GM"|϶zI*<ˬOqa I4L9F`|-qrˌWĤkML&Hgiu-(ep̠DWcHRI)"ix?R{(XJ?ԯiBpѷ!.[ n+ ~MJmKv+VKsnƞg$ \ D?}`.{FC:L4d@Xe aCJp`Pf0 7e i|H\M~BZ59 FWt|FD(+ W)*e J32/c 2+.Tu>&c:4!?1s+:*=A-6kDzJ'?98Aг>E_xHۋHi'c5Kۊ폆?3%֪ T6aZg SNKI؇"`Oƫ@~)L_ˆ\s:{rQ`WBz#^Ko;MO N~`ʭMY| @WX;h-!Cs8m?2YaC'Æx38ަwWEWsEQ?&'YKE*td\TY0G"}}k\yF La*P_U3H2Y?8LEMS-=nEl,}q-nVfaX`ԔxUt/$ ]Sًl#R'ޚa}e%b[[b)Ki+beJ@2*{ ]Vi%yqVEev?w ;TOVB! aY [orBO WڡܤO/#)= g#3,0VHt{}cGcm'wt3=ȼq9]D1T3Rόp\@Vl$-,&s;jRi Ln$6dsO&k½}litݑFdEtgVwKdYInIMBiHT[UT"H7T9]x̣6^җXS6%~/`(435936 d/ؓX)W 024AkK"A+y~ nw| L;$+d_˔,"]Vex@dk@gwZ\ $6ׇM$w6:vAA2ڥ~]`CwHVix!6,(ot쁲*e J]%e:8Ro˟Ԕ'NtrU%e\]h* Tzk6ژ # aG1.b 8yNhfC}NqNy2Ju_-v(§S3໭35;'j$v7ZF8^ 5b2߬C/E<*pG\ /ƓED||m 0)`{#DA V./ry߬i^&ګv_#fuQRt7ȏ 8*IFt {`d˔ JÀ)2RRVS"_4@`LMbAX0:+Ɲ>HoZ*Vx-9{F|8;&}WeU3(s,)3^`i?\廻EJVqBl6&QS~$7 {Q,*'fRJ}&eH^&St51dqDU.Idӵ}ʇ\Ɗ#d=^u&AM:V,k/,>hP"GMaJ."…3)JAehfE0Tv%RiLHz3 t)w3~Zsqpq_1IqXl_pdeb+5=@h6P9 Vjm1&MI;Yȸ;(z%goU|ZzxUs` Um[2O@aRo񕖛8o ݻS# <1[V9ܮ.r&:sb%hJeX )tyUh, !Axz`90"]ǐrF,mσ`5͊G8oX aBU9) «ۖM0̜@ekf&+aa=GHץf(kJzkM4T%!V7غˡ8O(ۆwv%v*EJjnlgoլu v>w"a7k#mDs&3Ѓ`ȾcP~\ P^ W[ ׳R":j gDF=[NlN%C4ANɝ|"e_"i(>H uP$2 j7⢫qw"%^:HQF|o|T#GI_IGUɮOTTyfMKСk Yַ̾E`boAzRuɻ]WBR_dgJwaWm0p7t;#I x/~IJr~(abSpsvg\X~Af( v?Rtqڧ'#aPWF7)Og*LFg^ԕE`3'F-a!Vm zߙ5wg!CCe3A MMźyr[Ȥjɓ6$'G@F4U7ؐ@^M٬V޲ ͘Q+t:Cx9_H97LTIW $x9=<\^{`W^ƯZ)?.J8B0_J"ar=xU`t㯇zx~+x^Rn8aB/I'8ǽm^ʻR=84y@a:PV G0&Xzi?[g՗&IdDxTTQ{z( <=+,_d/2[ɽpjyPT;WQ?@a.HЌȜ+!Tp JdUlNNl"NUCm1Isφ ojjrf#}]K)>JëCĺ_lk@]VN{! Va߫|CJҘ̺\ L$hjN.O V u P.AG1&/U̥rtQNlߨleo B"-D_! CE)L8t9 دLg#treQ+9EZZueE볟W: ~U9/VQ9b9#-Y `Nqű[dmUZN*;n/GȴYCM NUROrt8/7o -d#ygl=wlcݴgt)C,@Hj`ʳ%t )zMR&nK@0eZz\Xxw6.2J|\Gp2MI7l>] 9O7'k\avyksMU8D3R,8-]MP7 5~|tJFTt< !@7/_\n :G3]xl4!BV&+ny<eۍա ]EŋCSgb! ͸(BX L-#Y]MWK!˞-GF8PJ8Ќ2C[VQZɉw|}+M8W]ZUEy% W4Z [j/&V }ûhSv&Hzâxς[1+̪VΉzDS/&Ay!R{a^}7(;ީiw&{IxMgKwf.2K|3!~!r@~C0 .j/Nǜa}^r mJik9 }j)$:`eNp,śK).K6%pH$AbJ<~WlT~X}x\G/*@T-=,<aNs. +yČ?,,[E,%NYAj[)?@7:L=!]WSο< GaN>T2A`QѸײ& cofDw9h<;KW";j=f5Qq/~Y+nr p3,4ys=J8xFTGFc}O'֙rPk@*bEϦ›.D'ibFV]N<͙er1/v((9to#. $ƀ.+z:I\h&v,Nr}y1ª͞2ԭ m-A)f-i ܓܲl/+-A, "!}&DQᐁZ|#Pj5az/}:!A5#PҾkBNY~F"zwz-_rH'קGN3{l5<&{@{tTdA ߍY۾'_=M|6G[ᅣw[?E*㯔^wCyʏ}ͅ5i]3W-bFg2M5U-nm1>j#т*LO 4ϤKq!OoH~cTD)0_AB8^@7*G~Zrs{ rGs}W =Ɣ%&> R%;}h`OfG3qnq=B ԫ%Z*M(9RI΂uC>ةO$s!rQȫVzH6F]!usvtWXb]oݠXp6G j&],(S RV#,Nidl*/|ߙލ6ar+"!Rb BiZ&Z {H39y.K*CY1!ш=%OZy붂hqsqV-4VX4j [l c +Er9n"~ѳlsj{c( ;LLw} $iM3@* 2wFduژ}&u}@[&ԴwyEq^)$R]ldmO3q4ͯ0[Q*>H RSSud7S^{!4og%ͭ\~+dEfY*sS:(',[4/&~E{kh+-HEèfpnZ2g ~$ӆ;]%ޭ1'7+llSŔ7}UZ, S¼xvM.TQf0*iD,aB :-yMߗQN)WAj a=@t UN?x /IǨ7JkDSV.r>/Xl|h,}?XWtg, f*D÷v(›;hs` ם@ L2 !SZvZ`^W#IR'Sg %۞4bWԣ NnJ t>j!> #R[azcG0i[> e9PYDNjnU4>"N&ґ~7;R@_^wԞ˝|s[h%_eCU6K׆=uƺءƏKs3%h$eĀE`;᜹;>s%q/d \_T/»d 5 ~'Ƿ kqP'ڢWLQ< ծ.h( $V=伭-+cFƽRYj2RH($8<hF5RLmkC$OydlQRa{rs'RM]dbϝ5%$S˗{ʆc5jrLCVrMhc)ӧ|q.!zٹb-XoC֨r t%phg$W%"WKJb/\M.׊z$a]bQQWJwO=sVˇE5q~qD_XRө{ySnWKÓrMqNnX#3Y'Rȗ$4$H6 :lwHFLnG'R(xv3~ >ǹ7q g;nAL$…? -98Ng/P+h~H -E;=ڵ_& oLh=4B韎]F4 Xk骣&ѽ3@[4JS]H:z%~{ ZB%6{,vc%uk NTT>?xpq zd(7#_~S`2`XcF /B|k[uxv ).Z ՀjsLJm1En"rjB%]! b,Cظ(=ѹjF#},NL 43PCWr#;kVgӍz[Yי1{Z%97@:k;K6S"f2z#8 m&F['!}: {S -? Xtb-|aPAс9+(YaW]!=2"wl>x̑pL=ԕ .g醙0`5YBeĜIuw{/+>wtAG43IrI]7>zt)T":S$\̢(w"Fz]&h%JDvPv$U@mW=CrL]s-@I C8wzoG{8άQ(@w/l_$a 179{JsȢ>䂰6KNk>NWAEj͍ w4ryC o _zIyLf ʞطX ) שF* Z4H,1B๮#TjH#Fh=;[CI_-{׬'[|~5o՛p89$ ¶s٣3l,[nښI>NMd }G0ĭ[ \"~y:,3+N~2+7XJVj)LAb_ӍF@=z %l `DS_|6+M[|ō}ЪgMC{dXH{m$pM UjWJ vcs7qeBY,yY_(QS_WzLRʚTv"U5=yj0lU3=F 7Vy !(v'pV%^4 a͈GR΁ECg!.AttB6:؈x*?)%ޑFJ <(Ḑ:Ea| H%u:fMmC9y %4烖u{%$DZb;,:Z08P_r5+޾H=moGƤt>, S H}:NJw:߲v&)ZffVY\9HА *Exp:w:sxyd;2] 43BfSJG'-uXd|6u.6FiԬ=?I$lq@ǔo܃YWsgoV|Se*C$D`X 2Ɉe%rOY!f4 ? BiW3R#_c )xϮev=5:xӾv|u|8xf-!!tf BӺ ;zlKC:[ZցUrXO%VgX Ư^?r4(_xԀf;7= oۊD/! sҷ9^D+v6os`. ]_n}hoܱYCV;Agb_F⨇؜#LGWdJ>S1w/QZbcq'An*qT2jӏ^Q$XVA(oeHxcCUڞEμ:K^^{IW!ԯ밒ÓuZl>WrUYR;Q֣㈭ěˠ8@:=w/tF mS`&oɰZVE!Km6fԕ35H؄!<}OMZæfT C?~ßu(&4.#W+Cȧ/Pq'2nQmx !lՍ%&A^+oK}_s$VossO@& ZoM:P8P.Dg4BdqO0-Pr CGSa }*E}ݽRb&Al#ڑ7N+TcXR3dRP!Vy( 'C\A K&*ܻZM$",{W׺*϶O@{_ kU/K^,2GqUkL7GDȔ|UpyB:TNrp* 2&B&X"bV">050&@S8LJ.R664I(0.~$?sHj)iҚZY.bZG¢,nIl^[WS'|}|^N 6򪱽f7 |z9"Caו>[2T6ʌ&3F -װȐ9|/T#U<9FSݝ=AԻ5 f '5:Ö3BU#{Ugvζ] 9:1D Xd04-[ƀ0b*`xqqw0 όF&N}(y2LTEIόOpmhLd18t/ئ 3+,Uuшs(0zrw9*oR%Xy2EY*dy8VT?s@RHX*4;ƀMP%ٽL/.'뙳ϑl˔fH  >twKo^Mbp6}m;yV&xXTQdOp.CT# \j]''fɆeri;1|'iaiI8c?7vLGc^׿w/}SoKBfmm(W-5>.~4_ב$MR\_8q5=lr͊uC3! ҃y`@.Jmd3^WawH7OATospB.*LeΑ+@ѯnYujc{Uxbd7?CKNI;`XM+B&!,-éH(Y?96-P7ڄ./V_0zDo>Eg*)a7Z nM[s'v@A6T5uQD.H;`T(@7}R2wo[u% :iv 9 TlaIn4CD3RFOĉCλB&߈[))ąYC DAXe'ophwHA*{8;5RuZ/odbu-U-ؙ雸jMs)οҏkO'1)u[SueZ0wA&B7b\@-&dN&PY~ 묶CCqŨ;SqmQY;ŧkh#Y@W?gn,l7uy0NwsN4s$yUDc쾁 aQ^@FZ☥:xTR: oXݒ'ü1 _0~.ª2.縠'e,Y]c6۵Z1\LsHv1=LBُ &nrzKu x[O7j\>,O h0:xT1g{{8G~.ng>$r_ie_lHFT1_xRȪ:Pu|_ԜW Fg&*ȄbV]C~}!Ytv mBgF2t}_3^SWSAǚΫdOKg}dN/m]Kgĭ;փtOthUS12#v%yCě_*T9؈偹Z)[PqX 5_ddqM_J?| (ds!#ĿO57x-^I :=B{)i8+P_ pD涵LC/*]R:h2GV96#^ ꝰ =XVSv!fcyM<Kh InLیc;S7X|rd  ΖFĆ bmj,uݻ(ʀᴐ(caq'X;&IF Pn",5X}9{`#r!:=1 I&ٯ~/x dH Wn+ӽ(W4Q׀`GEL|"zF8;g&'k+bESY y&ϲu|;0AI;aҩ>yh\:k]TL.sM{ņFU~ ֣WO솷\Z 2tӦG 5b37Z$$8"Q?"r#6b"]홡UN=^կ:C`Rl$9JO)"䢑oJ=~lC,(Ų>j{Mx-!{.: g l>x](|yN>O֭D΢`>+Ƹ]E%<|bR1ghxf6UTM< Wܬkrq Y}&lJk nyߕ7M̳zj `}ךiOƛC*Da(܆=:zJfJ]s rj91I /;XQU`OP`eqD{a𤃇SӖ4>*)ݟ +_Gj_qXÏM#xs]אauIӓX:VYtBsSJU 8'Q %:K+pϒWgmP@flq;Y">bJbeǧo\raI-/7FL~0k(t=eZUo0U(/g\6BChJe]754ST՞W4P.z5ezIOIa\MА5' ǝM1KR [/-@K\^a_jY-󮷭a/K$c,?Sq/2WHYyʽuqj :h&ec7a)৉Q-ZaeH@5+H!Jqw.6ٜUttDe}DA9zn2y1T Jlx<%h?Ѐ_B2OK:o}}T<:x.+xwaJ6v@.fT&[0K^!3˺Di XuǒÀ=7k "9frQM~=:3!&4WQr-t9"YI7V,4һ }BM\t3O4lπC5~̦}tmKwlߝH+Uƞvc*,Lr]@;~Fl6#zf|̘E̝c"CE)̱7C$dWw'ބFR I&9-RCUz-aU?glkX㵩7iTzswzK^Y )ZD:o}v!gW֒e hOe "uH: ՄǢXyd:@7pc4Zn nf #(!z=',%n~ȈTm5y[QdV=Ŀ゙i[Z39gnl,GX+sk<xZ Kn@m䉫uHBʪ(0?zBaY!e<ގwf0eQda3Muߑ$+Qg){iO!InYnf,Bo l}^w e5(T_e70$%#dEAZ~8j4- Dsh7 SDl9(:fg fN~PҺ0}> 7U'~7NPT~BU )]0ȊpxwYQ͜sd dy8|PX Qhy 9r{Wy_mCwH' s[Km1ͲyNrJ`D k97 -GEhV:R$>Ot}bJ'I҈5 }<5%0d&wRO1=?nGY_5g  K=JWўccTdMgbP, +AZ?hS3aBКsq1hu0lAC94)꭬Lc(vfOϼ&pfc;oǒ~>}b7-nV:C.\>Tdp"i[;wnӻxx'[[X Q'j4`i PH-$ 7*h >"Mz/xhPQCXBՄqD2b+W62%vgZ)ppᤈf0y3$G~NX&-9w@ 4l\ȫ 1bc qP$e~abۢ2P٩o҆ XypMyYySPȴ5- L>gy_9kX+d)#bAU),42rX amo&Z2 (D  )iA(88m?ΗE5ɺg 4 1"E8%vk]@09S}xJUГH_ߑdWRa"Mp`/h~w&WКdN@5U-x:7M.]Y< -U A?;V4ط&|Cq[aE%a1MZǼjHdCK>;ߛ_CˋpxQ?5 /84F*C43^Y%AQ4L ,+ rGby|h~}uVFZh=O[cGG# x E[*eW69Fdvy= wz|%iNuxp0ȃRR(K)FUsWs~!(Iq-X J|ੀ6KGzI| r )_O~Gi²eus^rHQQ|Yڻg&BQ;^$"m_N"DtHmWcّHEH% Ed(ף MnK\r"q:<2`lFxͫ2+Y\%+PyEDNG](@"'`U,`NQLfAY%N<Jڟ٥,w' +{;ў15ѨpnJ*l2Tqy T7XJ;HkxNc3<:xaZ_F58 ~ i{:ܕ?m:6!QW#F*8/)-DE{p %#6nnpR_{=lj9\۾7Aal7gQ71$Đ_#OdU/JcGZ-/ŔFcnηDGΕ՗yG۸,`~bRև(g;ma뛈Bam/"Qqi蓿z*$M;/Vٗ4{{ t&P/(l\RɓX1[?. c ȫWs5lNl Ofg_V)z4e~~)OSCKoIYxWN{ʟwc 6 GJ|*Ah8ІHĸ"7uئa G),z?\s4դ&Gmds Hos,zȇAâZLw< QNwld 9&d-u7@|]J 6)VUi6?1B>2jJt (+fEV%[[Ǘ7lfD,<I:X1u(R (O9?a780< tlCJnC`_?BXvx5[ާm(#v`^9(^*LnĞk I˭+FX1zڇd,Vy;LYRͪd⒉p>!_"VK?AE,WZrN7or[*dDjT [F,^Y&kfD&S`&H*2*]K\˞y3O7EV}'ka@A.+m@wU|,m=ΙcTKBlE`R dnF-H] CsG<& zǽi!<2@R`kL_uݒci3>.-$N,{@8l*ƲcF%APwW'с V φnE,t?[̋@{-VNRрꃽrvM/z uLe>~.y'pblTDa.AI{V+#>A[ c u4L.Wjc4bd~kay-GH`qŮkaڕFZ2#^(.HrI+^]P5\(@;7mHqBeOz5hW! aܤyxA5&H.'{:#/ox */2|],eq4qx}ħj|aG &g L&ReXRdY/*.}۝H$G،#6lU fpvS` 2; q7 TRy7)NșVhU$BoU V(NM'-:7EoӸb6uKK(4m|hAfb4EM[Dڱ_ ʽ&lM9)-0|bLe867zl4cѺdߦN1Z̏V%7V|+QOCq U ^s4X'i~9ĜkG<6{9 :'X'3 u۹\TF(1"O}l]']/)]D&{K4b<^Uҗ&'+qkN ؘѣշ% R̩׳WWױc.|NzX<{cu]1ggfk!,ŘXOkHJKt@ ggee0pifPgta(oM~[h.Fܘ7,Cg=-,{:8Ͽ;u6$dרۏAxi↭{9@I3 4*WKf"k9ƿ/+se¨ulJ^ޯ Db)x|{҅*\jn2'X , ΁VA;‹e`WCjS>߭hxP.XQjmM8|3<.fmfRxVV]vʛ3C"ȳJ 5 S9ܗ"J:"P;$>cnzk_e4 }ʝ}hѾۓ&q_ RUZon?7 :qWٮ^ovI UO*:k!:EkZ]=46DCj7_/*Yrb7ց+:d~Q-3"e&7!hȕŰۃB¸7ZJGBbՓ0W$0 D(%$5ܷPыuܴ۳ݥȝCl4nEؽyVͪ Lq+Ҹ[.^#iɇ\9Bf."_-&9E&m:yT})H,ݝnDw]7f@,D= fK@RGzt:ےuz; )^-E`(/kwz"gpjVuzmCS?ƹއ7)~yza}Rӊqr㊻޸ :BSAʝ瑼m 'fV8)ovi(EU1gl-Ef>el^L1bEu=(~Z hУUXAz*xCCCX!-51(kvI7 Ls0ˑ* $k`Xڍ2&j8|Yt;gOrN&a]rqrp eӹm.Ecn K)ǫRg\Y-yNSxZ<1q\j\tID8Vc-t)zTJ1Ut-7cUF,lfK') ]80\tEqV:MvD'^ftBx.C!;JwBۇ'RXǸ=jY)y%NŪ ٞ6zҭ/œ,| {WrTtC<4F_%CԢ^|$n/74L99њ޺1 i~kRS\Z_A~Դe-Q+6T@F ^ 0WE{p|LLcT`stS9M´BN\dλ zdvo9.D6ֺ@A ReC[jO6T*ˏMs0|J8AMϖL2×%ZDk9$B#)D}>-1dFZc"d2Q.39 õA,s|+ˁ8"t6Y6ႿOH75=Zx6ֈ-˼3u;{Rz;@Ǣ,,E늾d܆[=9B2uk]8 % 8F`֧Vi`W%+Zi*k W5Yf;%R_5v4ܯޠ6A>=ukRcgÕNS!MK; s*g+u턌;[9&B·fyzLU4 kJX# @zwjQb{h40Gj=I/'O-1@ADk]>,ɆP:sX\mP8p 8~8X/JGIWD5`<J 6z-~ze# lc[{`Eg?u+=ޥΙOj~OVn]_]=_\6VYxm: G)`faz0t 1U: 0%蕰cYwRŹ6s#5r;83m%6T8 'ۀXu9$[ݹs}0oQg8]=?`ul5pVk  C.9r@oIU1 Ra龮S2"595iC#<1N5>Kݔ0W)[ GP}x`Cx- ~5f (i h Nރ={.ëlG'αJ[oڰtݵI;b<SCh=A=V}XUea=!=陟?X*d{)c}qoAȇ$8\^nUn"t9uۍ@ܕ&` WCgǓWN#M9`m)dVS*O/}xt>9qZ u+ZjR*ZnxEyEu̾U-'R$~擜s[cW!?,58$,c80.^N(n0fǹj%h!,v i c] d,N ꊦy{FA|9; Iq#{flF'n:ЫL~Jќ6O a|0u?'Jc:\KIm^+pb;nX $I[w|87[ E Z8.W:߹4d*v4z~ڷB},~*ڮL,"K(qDݗ7KwQ-CT^.$%pk 4Ǩb<3`@Z;;V|K.z]htB4ႁtI"@:f5c }Mju0|& E8l9]A[#ƴxCd|M#44Aժ)D]_` 1KV5K3#sc>DŤP .q \@knˮ 2P̮ᇗ 5NJW"/1 Jɏ6sb0NLz?DZ{gTP8t/y۴,`2R=l*=_8'k)+vHfH2Zѳ,T#%/ڡOT^L MY뤠wn WTN9I0-i> vQ:{8䮔] O0p ZxoryXӧ40X6)C/?K1HqJHM2k >c*º'ɾ=̬l[&.FluaJ+ ;%Z▷CO46T^~o_ހ62E@E niػtrĭ'K8j'=>J:C7:Ω垗T[$jnv})PD(Eo$yWt5aY<^|.HQCQ8P1$oWk:!PM}d_@r8 @ˌdFG`ouxfxb1&ۦ,X7嶶A_:n,D//0Գ8db@vs'z/`$m,*=zOAǪǾ@ꈻ&7b*ְfIj'•j ߕǯ֤- v:`Ȍ) ;* '$C3P6ŌL)}"֔U x<^գ4l \!hmș,@z3GJ/yo%Yɧ'oq`!z,@Tn-Ni!ڌՀ7k1RqƂGN$_pYX@B<7;; ÞDsNWb\6`:lv̔?pi?t#XW~4ӯd/-lxFkE;s<2< %jk$z:D+/KBLݕP$U`HxVﱊ7Os$ Dw,opf͘b~+˪5T-GE] j>ah :oQ8#C e\1b Y=Eh,88|0v8i,Je*pC@ 3";Ǹ6*6hWoeϨ\ ![+<n[gKrr&\簩HEC||50ERvw5.Y]GZn1,6=w%RjE@SLP$O3ߔ%KU 51!KeBJ`~-Xpl]GSQ'v@,xg4A0'#3VI%\_N~1iݰmi$8ycl;/%Q2/ ~(pS`)#_c+EX|O#>MI 4ДL`(8ƙcA?JNwd$޳=@dy֔eOj}fpƿ.azL9pTHsNJ[ $Y'o巎[8h4<ᰤ=|$@>A U_P=&!3/zb{cڼ$si+ֳ5T`ǵMUm\`0QqtɩeNȹ٪'XX?YDYW*>{ +zsJJ}Gr%yQ;mIdoxrlZEUxMPhfiQǧ|%lzA!E6_yPhЕT{K$yEeaTʏq$eNPP:9ӉJ6RU% t2k{iS6p\@HTe^s4|@|$ï ?PU3wߏgxx<SEDH"}qw\t_\bU fwGGkW8&+U_*lϦ j8h T>!ɼC>$=wt۔l*Rؾ=ZJ4N{BDcq+2FzmAԘ/FD% ^#" 4ЭMlQYfqMjQ$Woq c9|}jؤ(P@.Sܺ{nxB: z˼`(؅s~G Wfxt5 E>ˆqT <T501stH'eà+cl[6{ ̓@֊%g5;Y '~KL2vPk _ 1KJ69ޕZOdOBB) H^$=&4}~r펛WGwk (F~3Ϊ;+Y6H|P.qpUmuQ PRCLdoaXvD7~'kej*};e ʔ /Rc..GWJ5Ch@CC1[LJ*Tt@ƣL-^u|.5*gU}՚ͳ?Ls31X|4D% |2f*kf Tom̢No A+/f_٘螾V w$U )RP p^Nۈ_Xlfd*h#@VlvJ.M[Pa78/\(\kPy.# *q\>Sɥ|m }t=;_t *H,;\% -tSM e&VZXZYQϑGeH+\x]BBh}4LLZqk}d?_em䗛]u5DҞª}k&nl'1 hrc7@_J4tmebr~sy}65"o`9n!vCIx07L[{iFdM)2~/z4> #ÐFmguS8#:u.z9sdŻ/lA!h=-ƪT:QBtڴc!-Q j?6ӽA\Y; e"{߳QCҒDt6ul10&b0Y$j-'}LQ[d"U}Iٻ2 ~mkbI ]n @k:Ci'^Ok\ML*}cq+`ﲄ>7dDQTѝ)ƄQ:ZVW-+) Ч[8qDM(aK1#[k GV͸7LP19#UtJC@ cSU54ec%660A` daF*ˡҫj]WcrS פq6z?%>4ַّR/vCfk_ YiʏN/yLZ](VV8o={Mq EkZ_m(ږM'@J@3Q9O 821;F}CkEl": Io$"(U%S \E k:_ ;E<$էm?4)om.LRKjT(]# 4[2ފ 8$'U`c-OG@Oo#FL[GvϫC hL蕽O9po[\ | O:m935 7m|mMhjToM}O\w]er0fXpT nQmeJ(S7w$NZ ͩr"\&Kv\HxLl.Tx?h ~|qJ\OJ8MŽX]hZ&n}q%]\A(#\cf$#Gza fh(P4_Spb>BS2a@V]x6\|[dک!1wc<Wȕ@wԋSǜ^u g#?V[InqEt(/Zo@}m&F"7&\6n~]'}frS Hș;=8uDSRVd/ Mҹ,kw[jYk`EXjn kRJoTq4< .*1 01c5Jp̑sŐAAPkn4Sϔ́16!~jJ<tY6w7>-pQg>w8.l[(Cɑ`nڦ;@`'ѽ][$ۊ(XT"g{K *%!/,xo*7^sL> w3׷7M *'x$? ~}hb^P r ĦC3oj2}B}'O5q~._0>Dd:yD{F7q&go/eNS8 .*|~ua%i2/KA×)X,1@!i9s~Q|8.M* 2`@Ƴ$%؆?R{vU=8:N-(w| h)ʼbl* G} t-h*|} 0H8Yx 2;t[]:UdL@,蔸,RC˟MkGݚ)֝\M+s+O0\cd]9AL8-ѢU{2Ah䡸~470&(| +>؋k?]OgAkAD_|Rsw567V6%E@+G9I@U/IaJms1sW >LrUOO8qdǰڡ+x9.GJ)cمr.CS@P+䛌p[.<5Kԡ{͞7+6bS˦$HcM& S2e8@b2yåQ H<"Ch&]!J w1wQFSS9rVg:9&诫#!]T7/'6x?fRcެrJ^z;/D?6tdrnT m:(Bf5fE.suD]2N&H4T,`Lf}CW&hQ_!ц [%2χsB jc #R UśphI7I;Wڳf\j xiO:Zj=g{Bctpј"IXտ>=̼Rbeh] ^RFwCi;QZ/"j^o!;K2><\4eN&u¹Zef/sDtξX؟(TIou s\Nf!Ql ]©]Co7``꿔o3!ħ}kC S,iKs$:1P'nՍ0=|h%@n8upD~~;i!'-oqMw4rFAiXX}H:6_GU|3,7pBY^G+(ܖ+(i+֛&{ 'xVД;'鞸`{TDe *nE4;ćutv͙}[oXA|*dxu9S ٯ@7[g 4k̋am1EvZ\&tz>Rc̛_/s}~PD׸YdA@1M]4wAFXgx³`yÂ7,nҲ.ɾ‚A<,'ɆdkxFi7h?ܸgŠ87՛WM(~,,+{>9Ӟ턌_9;Iɿ}9Yڃj6RwѬ,!* nJؐZx.AfN=ټfiÚY˻GUwPݙOdՇ9|E@jQčjjVR9#@#|-6|p6 reϜhT୽B(4c]06tj>F]c ӟ^Ϗ[^@$vt]!!;*daoá,P9aۊz-V U@ /{У%$03·ƵFCR2ȴ̧L!_Mݺ {ض8@]k!LSڻPMW ь^|,9Eف%N'Ƈ)t֫ 1!e3cyMaH/HxTYf$iKE|`1''OmYʻY׫["u*f:ӵރ.0~u#0SdϮv8Oa\.;šk#H~8bGG}~>vbI#uO"88}a[(&~Oa7QHڈ_]bֱSUM~ W]o%#<\$PiF EJs3%JSgsm.R Pk@/("x{C;%gtuZ@w,.we$NJ5Gd\6K].u2 K|q8(t,I <2׈ z9AZϸ3j/D$If9fֱpPW7ϏUwH[v|39X. {SԶ%XЁUWw=7-: _rC 3R5F_Γ֪G gq.Gzx[1Aĥa Hp$R !ybƿζ6K:;Bxg%Z,0շ?@ a孰.B>  *v'B5bTI9`3k~|=u+Ǵm'PY:\*΅h5O4`tzU(*L{At  ?`9i\i  ~˜;)F3äj8MIGI(-^oX&㦩ZK^ٔ.T0,`F ^UGr-dX)|[ݧMeTNJioQ0' gr ^2rj\e$[^X{L[g7G8"σ %Q@G<[ v<5:mW"ҋΦm9v1c7er WH~,/[N U5p)Dׄ.p7Ԇ^ɤ>"[O)Me="9F$ݎG6@sܤ~VMIf}?> ̦}Ԟ|Punw[ju}0 gQB'qZ)'rE?jڥ`?Y]k{鐪ӊMYVؐ1P@iV н:_J;#6ab`aay뤁›c>k?"qGn5bXB rjf4M)8BW09gs>s4 x;y` mzTq$\D ,J\9t2֓mX| c1 <\F 3;M-0WS(r+*y46p9sZf"#˿XPNw5p;&,fq^ rTdblśECb:Cqk=;WBލr AT|gSTOs-Ew҃n?DkڤxٮތD{j(5=@|2U9u[<ѷPhAxv]lOFh9+X\c>rp [u“Fӻr`(t2K]a\8JR52}- aoI:0juA6%Yfr@Aak ~ԀWjθ*pl[;n A0٦cVȋP&Bފ?)5磕mn}3~!öP?#hYECi%cS= D5%!Z`.]/IxSCezJ2G$-zb6 ىYZc<:v\6.&b hqU-0#~ sà{hUOAț4=v8j$r9~y]F9 P{5$oZ q;2fMnUo31Cu.m9RR19mOr gT"rJ,n\cI sAMU=U<@g#$g 1$z S GGaЫ(]I-X,)>E4;fgK~}de "Ὧ'M^ga>O'?c-5aiBXqu7OXO6gmkpHnr+&9̩'CѥPPD- v54YxR'C[z 0lqSA:yʫigy,|Ԁ\_j:< KXvh3~i XB7FℕSz/*r1dľPcf{n*ZӚ^): b;@>6!\(qG9}AkTsb3"05\01ə[6|R'CIDnEc' zoF`m9 J]4;JѰLJR6-6MlĿ'̹ȍN7zU ֎~~;Spra.v74]edfv\oc=VԶUz gHJL(%Jң3 њкJ 5¿8EY^CB)Ēr] Iw{m}lNj*W"Re;#1]>h9wW&E:! l ]<soEcd<=^ 7"3< G42(L-VPs>s{Eq\w {bO&jgy|JSF:(5Xߒ9[hؗm%va:'4 SSWJ*fJs؂avE;ុb*^l Ш7 &X6 [*S~u6^jwHMR;ѻlIMږX$`c $aV G_-%:K&{/#+g7VXHm#g>,O)CEYM2 d|q JWBh]cm+b(қzV-G f8{BDϨ@=|OCN E_6uydZp{{aYYx`I/Yⓩ]4<αF;iZ'E?_&i#E1:( 'X&00v;\9sèN#oK c- o+aPsQ޶5fdGirAw"a#a52 kVYtyhN%hKhC$o5BT4!r~ҕ/yP- !Lyyk&1fs5yS:R ty/,Q:IXtL5@&G NbCUI`x G Z%#,3t'}|GB{@NY ZgβyaÇ V\88O[xD-A[{}}u|-YP|#>K~V P.V`bȇ'dGKנr둸c)[6˳ li"@U{G 15XjO E 3FTK@_n9tG8w;jJ&&c] x`s3WŎa IR7fDP !u*qu&JB=ۥvqd 2o@#IVeSf ưϬ]NIx ja4rުU<'SEB,zؖ僂O[mTD͌!7,&9t]QXG\Lz"nkW}^/|3 6~q:#+7 W"'iaVQAyx}Mɭ2EM}G9x Mޥ&e/2şc0t_}R.O `wǙ_Hrn2O]f W4ٔCy[Tv MnLa|^ bn2DQ$z)Ҋq,4x>$.{\`SoEIz'g^{ZNn l-!džFPZhI&j" rpy% 9 O;߈Ď`r%и.,HSh@L2PC84Cҕ\A T=xK:-ޏ'O9\|IfH IJDi0(En(è?q8"Z陟h}1%1xj䠂QEA7wC%Qq<Ӧq衠b7*O O3,U)EA"2= l6}p=ey4T{;,gV܎ũ*0hJ<D'ڈ%VNa{eI 5 G֕ʗ@۳譔aHW!˕iWHEuXj&@PDDp!vKqB;on-U{3pX|yHS-C1{ u\ !WWM"r0KӢg" lSc2=4`BL#Fz>ЎgihPXxϒKs2Q`EK{S1XK ͩ4mN/Z1ͼNblZB+qbǍL2lǔZNʫ"uYx>HW#U:`%~і)ENݾf ðp^CH˃$dV+%Bi0{=Or%V0ނ][ bj&ex~y둜b[^KTs]s{&7k!}y,wSotBXEv(jt'i`ukh\[fFvSrA&t 1uSX4A{|U% %pi ,N|&> :Hۅ+VY/Zy@K6(.ƒ+{l,M^dHu]_a,m/._ !E]#mB|+ʇl9D(.UU)ο PK:.z1P"ɀol$V]VvĪ"_+'_N{]B(TE+w޽z{6eLbKo[SA>M/`s8v1'A#dW 3ڽ|JC=V;-x} 0vt~)CuCplH}VQ_X<(7Z<)">p9ۈƱOg!53|0B$ٺB6".}lrx8& Q?;S߾#U CVΛ(軺p| 2෣qJO0)R_%%^N@rPƼ_{뗑9ll}gT.7 jAq(EB 6rՖك9$ΠorolՋ^gM6w4S1\d+Oa!l&`>-wqCf!},1b VY1 ~5cz4S;6*}6,1@X\<%h+A4C|;ka/?ϩ(rjE'u+'PRؽ+dBK?ޟnº$c(i߇џ_Uh D“~4zzHήzS8@0iw?&fK^\}Y?2bVዲY)lzo̟V۱Xe~*4i&M(WP7ߎ9rA栆B|C]^]= YZ