python3-azurectl-3.0.4-bp155.2.10 >  A dkNI%z Ÿ9.u {@ !u=]F_z$VhZ#藻ĤyNnØ+<+M ܗ^7qNɾ7~0뙟MJNb~wa՘m=mz$:5r \d 4h$u5bl$ӬAOʫߥkv;*ţAꉡ"6{KCSJFPODݯJ q*>MJ 0miŸWW&l`C\DUڰV7ᠽR=oc]W \њEA L3ta > mkiո8O7ay4i3TDNQ geB0\!8 '4R)OYNNJ񹇑!ޕ6%pAx?hd $ ^5>I c   4 '? '),/f/112<3(383c9=hc:ZcBhFhGiHk4Im`XmYmZn [n$\n,]pX^zb~cdefluvDwxHytez"dCpython3-azurectl3.0.4bp155.2.10Command 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.dkNold-cirrus1T SUSE Linux Enterprise 15 SP5openSUSEApache-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큤dkNdkNdkNdkNdkNdkNdkNdkNYdkNdkNU\0dkNdkNdkNdkNdkNdkNdkNdkNdkNdkNdkNWt1dkNdkNdkNdkNYyYyYy[Yy[dkNWt1dkNdkNdkNdkNdkNdkNdkNdkNdkNdkNdkNdkNdkNdkNdkNXӞYyYyYyYyYyYyYyYyYyYyYyYydkNWt1dkNdkNdkNdkNWt1YyYyYydkNWt1dkNdkNdkNdkNdkNdkNdkNdkNYyYyYyYyYyYyUdkNWt1dkNdkNdkNXv^dkNWt1dkNdkNdkNdkNdkNdkNdkNYyYyXv^Xv^YydkNWt1dkNdkNdkNdkNdkNdkNdkNWt1YyYyXӞYy[dkNdkNdkNdkNdkNdkNdkNdkNdkNdkNdkNdkNdkN7e3c9fcb09eef05800bc6f582ccefbd1d2e4897d25026b34ccb3285167bfba14b50200525c20b4724888ab258315519e374a04d79b085c0eba27771d651f09bc8bbfe229600f7197a323b7e8d551e11228be9e70aad75611475bcb2b999d78a6db3ec3df816b6dfa0d307fea66f8f9bc99d31b9c484ee55bec862aa88e442c2401ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546bd7753aa583ce20a428e035afb675c1c7815d9f40fdb0c7bb3477a756f03df17601ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546bda33aa04167688a1290ad5bac131189f9fe37193a6c6c85f6885bf5b68b82a20904df762dbd4c2d42d8e6b4134c8a640e384d7dc332005d1583b7ef9583a6fffe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855ab29055d0c165325d57ab9ad7d5a7e3e222934ceb59dc11e89d4b03e2b8011fb361366644bf15359f226720a59193422839dd2cba5b34e22b8b97a61b5f76e8eac47a0e74be86014b51b5c131720a52f48a8607c9a52d4953f6ef5b3e8b8e006bba9fdebdb61d4310435cc11416e1def7d074ea0c6150e85b4ee162b27a8561bbed4a692d69fdeddb3e42f9c0dcb4d98b613567588e572921ec7e662d8100be800688253e83bbebb91157b6aa909f42ee9ed59099414c0a22d069532d32199b3e98ffbd28f64911f2d15e4c2e11b680b65f5c2e19be7842dc6d5671666296b57f801a209058fb2fbbb9a1a544717e87e513235c9fc900a99908939eb82e0c0e0416d0603ccc2ea4ed4e57d0ac543f8598766ff1995e559c16aca21766b92695ae3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85511df5b1003bf759f29985170bed74b8d58b193ace959118809a88898d1480566b36909426ecc42a8d568c18bf788a96d235ab23f9899ef8b6fb8f1a28dfac2297760ac67645877b9f73103272b3e9f70fee31ee87b98e97a71ffedf0b785224f754ebf99198b8c85c21750a2da34807bf58e94ae2aa76e971a6d60c2dbb2f84cf4c18308523a10fe08580656584eb16c79575bdd597f6881e90210402944cbf2dfeb370534f6844740375f9bcb964275a5b1ee1c9a7a7e6aea6b5c97174538c2b1d5acc83da9076462f7c792cf6bc29595c3d670d6783c0bd36c13be613f0d353ccec8daa7e8ca00c79bc1070b7a4de706862f97b278a56ebdd3fef23b85a778c6ca6f52d4e60d46c2ff85904d2cd1acf0b234161e2ed47ee98de6b67320a865e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855350e7071e4b005b2376f8d9e6d90a1bd83eb894f3f8791e57c64214cb824f7f88f4876bc04a9e4c312ed09087953013c83aac5a7d7cecbb5685be6ddf470239ac359a2ff35470ef502e1196b5a46ab57d22f735ce0ca8518fd927dd32ecad9935ed0096ec55e6bad28f6c41183735fddb3ae32a970a6b306fc760ee900a71186fdb32bcf2e6306e387259b28a8c993d5221df4d97cbaa270662359cdc6bcfa9c33c34861e86daf91c1ae35d9435ee802d075776556d40c7a3e8d51b7ec726d83be8b92a963b457608dad67130ad05cfd63b2cb782f77fc432dc51ae94d29f1fd1cf16357f4053d2799ed81d45bf2a7288c46e3271e42c4eaf89c99ee863e0f388b0755cf2838403e25a1829061e60e691cd5a78b6e5516bada50332e968667acaef5e223616388be178d2196b7dfde677020d2d05b49e48a39eed80d75a54fb41ee454540e57bd09a7dc66d52ac70ee4f56887e936e45a130f809361a5751bd55fe5f566ca525b2a51b438a92971cbd98824b86acd5ce5fbaf868cd82217f2ddfd553f85822359be0b5466ccf93a7aed7fc751ccc07882848498d23017de53eb5293d95db2b923bf5db6c83f11f91723711eddd9ccb025fe14393ef1f0506b7ffcc687b125962dab2e3ca9d403c4c4d51ac6a1b838424e09155039b3a08b354cdafc85326fec4271d553aa81fa9a1d4b020d5a9d576000336d549d71833674dc60037f120821910c3f9849cc7e64608f5c6a59d754e38fe88bc98b3734ec4050f2896461fe01ec9156ae5b56cc49d1001648150cd60e1276d14017ab3a6f9dad5449952fe0395e0ad05fce361b642219c607e7f1dbc647a5383efb341adc0df879faa5259613334d66cdb73c00896e89b921091f437ab951d2b65392d8881ab007346ccda8b3fc97f4b91212897a550c63598388324ca069c8fc4d65aafcfe41ac67d0c53fb58f9cbdc966e332901dbd8223a44e7ab9944e1c8b8a8b039d5e760d665bb6389ac6d053273d6e1119aac4fe0bc7b006fe5ba2ad5d8aab05a390562edc971852a77c4bf8148de2fffed0725e59ba3e3abcd7b4899bf98d71406dde0fcd00b3e594db72e7e390e88aa61bb3b13eea9e6bcd656040d2717e62f77950dd37db91e52a0f9974970827e6d9bb7fc6aad7c9d59adace934aa9a0dfcce18e7ef8f34783c8a438f2e0e5fd9051b02baa5f41a7227d46be490f30d0e6e416b3e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855689fe734ee7e75284c7318187e0df7a133ef55234e5b503898568b624f1c7004b95447868fe53c771caccc278e8270d347601f5154531a911fded817b962c9583c23528a3779737753acaa9eeffa69afc88a7ee54d1dae47bba5de59f7868a0521c0478ce32a01398aa2f1e8ee8624676f3fe6b987c1d0c87a40f322244d148189bab228c47f833399ca03d4c68d4cddbfccce00ada9f5d91a265e06992aa1a8678edb5ca46e802649714e3dbe679c6fee606beacfb51050a8b8c6336fa1bfe15a303e9d28dcb6f52f080fe1938bd3576af0cbe7be156e70f53015d1777e5b7ce3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85575d48bb5b55e4a3a71e935450587e566553707799efeb523ad288990fea86dfcaf9380ad2045d4c0233cb7c22fe0339461ae34f0ba45da81d34cc2ba2f91d75a68f4462e60f095754998ec4260aa0d5eac0b3b4ad9dc12ffad5279b9d54e7a4974a32f20f27497ee4e823c6de7d123596b57109b181c21b77e24eb92bbae55830a8cfec58d477e6aef3e3a63a955706f9404d49fa1cdc19cd47b43247ca0eaae2ac3a899144c3994dac1f42562c7bb3e917679a9ce40b7f9967f64a0d32b33f52627f446067bf63c54e8f80db3d0a9f72c5ecf7db4fc99d741dedd7418b4d8f605ae02d2f09fa059dbe68d22838c116267acd9495e14478dd18e96d59facce3dae824735c2ace62cf33b36b0f8816c77ce0a39ccb01fe499a8f9bae05205ef75e4c0805795168f62d80d234339ccdebd0fc97f9b37c290c9b470b4e2f40e71d89c2cf1dc76cbaa9d8e876bbc9cfce30a5d1714c754f245a804ea847cd3d19171410624a56db9508f6bfe5a849e179472437fb1e213fe30b0d0620b69210a58cec0461c87a241e03ddc75356951ad40895488e6e5bbe59274f79de07f7ee2d49c39048f4dd557d6a531c768bea390cdd91353eb7a4d369da73a8e10bf9bbfb7cfe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85521b23f374855c00418ca48fe18e1a894454a0a38e9225f72ffd942357dd5c06faa90a9cd039af19a05af1fa98821a13086baf83bb69a93826852d1dfa1ca996b1cf096ab828fc7975c0b83a45816038233674f6209d0c1f3606c931802422b29e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8557584321a31c1e998dee6502a2334280c9c557775bbe010f65859a2bcee9724d9803eb028954ff77d0046ac971dd845f762b9894181d9a9ad4b3466857cddf7f3216f80dfc33ae8ecb9fc2b54e4719c5d719d6752f363168b6cc613c27402214835a75f8e8cd628015d22d87c45d7ccbee179a3056f35876da608214f7c3b2198f71686041cd9b5f40b8d9cb69a8239679358a206469f3b2a442154e8bd138ad6478602775bbc68dced759d170bd6da550860902220997f3fbe8cf8f1cc360d138594cccd0def9196a2991b7aeed6292e0cc5409e89c0ee45341a8eadb0f6e8fb6fb2717d203f426db97953de843e8666f806bdee38d2ab3bd95c0a8132dc4bb8a8ec1796a8dda32c66b540a5dbe9b6804d5e1828011b01a9b7a32e4f4be40e316281cd26124d354cfbb999efa381d45ce31d56aea2d93992338e3b01098ea780561354d8ce785b4b8a5e171708e472039e4c0fd77a045c7b15f054215eeede92e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85510818ef562d73a4d4793e36459ca944e5fcfd9fcd81155af4f223a9887d8ff7992f56efdc446dcdf6f0481e349d72a9ab12b5c91423448837b6c43d784ec5c24fe11c7b908e18d676c1aca9d3420bde1804320ea10bfeb7bdaa9d10beb62e023d60de6207a094d61a66b85d90fca9420b5edc108e61c7264cef346d9e96034a0cf6284dce5522a7de0b68cd5a30b1a11e15cfce6bc8aeaa35574f36e82b00a9a9e6b506aa5d4151d729ae1f0b58dca2b8fc3fe11f5e721945689839a176d98239c0453dfca6f523830dc89e30309e7d1edba47f37f7e143ec39e38a7ce87cfae5f13ea1deb388ac4a5075fdf5ae25b6b3995c58466adb4d6b85e220d47a9809dab9fa9077ae5a98c5cd1fa36529fb396d259b3e746e26bc14243dbd715f397f02b0d4090514298dc4d0fa500d42a8d08fce12ef78ab544c287c83d2e2653ec4f85eedc64095660cdf15478bade93480cf229f8b94422a8c9e4cd8aa3b6ce3ba9842233b6c2838c82e215f9b55cc827c25dc57c685f3953b029a0ae2f4a6197dd32402e53440de862a8849f03d4420536b8feb3a56310ad8605bf4aada94e0094b1d2c3f680529612d1c2edcee5b7b831815db8e1d1c60ae9de70de6c8f5bf157595a79fa0f3d1734b44476852300a0e3b43a0b7ba27f9ba0b747427bc41c068129168e632801a7537a3c4538af771f2329be784e60047310e742807cfd7722c4076dcde88030e85c8cf3970c9221208efed7b24876822e5b0ee9903f31c4df4eeb274932e2e01f805341f4556a94d8d085af6d71ac09f3993087346fed38e0eab682285e4ee19abf5b8f77158d0061d51b45bead3234df977a1dff73b1808f9e73658e6336daae20f9b0ed258acfbd35709d37ef6386bce6b432828aa62b50d33e62e6dc29348299dfa19ef8b4d514175b97e222a367d9f5d558364718636e34ae4866a55d0a1665ed83a36b4a2b7d6d683d4f16a4c0ba9099e01d9e299dc0b433317f5216d7ab1e423a2bffa5fa8d6fe2b3e231bae33475d6ab7ad6a938fee152a6a59390389886d75182da3f67e9af0676bce3a51de2420d446315f0279faf8fb192cad6c32bb36f516c799ecf51d0a006af19f94d351672ee061341312906rootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootpython3-azurectl-3.0.4-bp155.2.10.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-bp155.2.103.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-azurectlold-cirrus1 1684754095  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~3.0.4-bp155.2.103.0.43.0.4-bp155.2.103.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-SP5/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[\]^_`abcdRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRY3A{BǑutf-826324403d62db16cae57ace4fe0ec3bd34795832abd2daf32d880988fb4909f1?7zXZ !t/v] crv(vX0ٱ^V-ЧGm 2A922\:E"i w,r%! \ }?\\R_i <*96UugPmatʉz"K&疦^T4qTE֕J*r!!.ݶOسU3h@-)U:B.L'$o3)*hIMG}KqyǗ}X<]|/~}gfLqzP 'C7# Gu;(ng7Yӆ0l~ LuSco BVᓟS ӳ[8F縘Ww`ׁ(NjPFZDrɠ)D fHRT?T^*`36Ʃ_!QQbƏ$3+x(=}2-WL(1"%!ge QtHK@2UcxHPjkbiY^^s7xqk)f^iU {%i#Q]|wXǼoFx^;Q<v]jj͏ o \y /umiRȔ = AKP|Dz 3*Jur$;l$?Y~&ߏDw'5V׶p;qʘ ;)C:bJ^$/QpW/An;8dO7l qejv"p?޾̅x!NlZF/mø{{<eji'+-/GrE'R+|0Jq bz|I6a'}A4CBB>]7,RxBsv\82ukdՕtK;{22k`Ahvsi;sg '!`d,zαڿw2,-Cavk8CeY}߻}ֲ{~WHtv߁'⮡ҹ2%Ѥ>^m 6%p|iiճ k h>hl;'R9F@SO8jlT(ϑ/yPgmC/ @ QZ'Gcx.07nxi߃Ѹ7&77.FuZ75ku?dknMɔBM8 P-D %~`~~0I톬IkI#++XFv((4H1:,ZiF2i -("YB1!T=)B-+5TP]$}J^ix( x_^Y+f_\|?R__) >Qvg[dbܧ57K#:?A\9>5dھBoz:4Ё..fi/#h=:sJ$myt>]ՠay_ĂdGzZQޞł9]`GٺUre)\W]$oma)mKqqEb: 835V]܁R*ȑi,:;xiCeuRхൾ:jcG;{]+I[oX"(U_xu([;8*U[|; :џǛ)Ќ%Lu9h!yN0{'SYB/2o4&L.\B4Ђ) .Ґv&4!%|@.P{c䵫t72A];&b!_-Fpf빭q߆m7"PDRU\#‚L\UW4W@qNҁY&߈y磻bO5EM }+#ZO#)ĺ\ 4T#{YXKԌh;mL B%% FۚzCw-ɹd'N)мTEݬ!^jpp[~ q[^7ύKh`34tMV!4^g],俳ܻqAlpx\GVf(_n-gdJd۱uK=395;a@ t(Ի~T,4r(-'ͪ g:cr '#rWMT> UWb ?k}agQ__mf#*<^![e8r6p Z;M$5g,QF1MlGfpi2{|E1 M`usY;Jj.ƫ`PmypkFt]M9#bOg1LEHM2ζZm kźi ![T(ԣa^,UA5C Ц~ Q(˥']60;(#ԉdhjW>L: {r25Պ] e*{9h[=8$џJZSqIL *wJB]0|u)nZw]{T<K3rYIPԜ&4F93Aqh,aGgR؊6O\k,5{[I.%^e.\ŦHQi%Hxck1' &jCL+L8C౨%v'{ `޴= enN^&rӵD{$+oMtU@7܅FL bP ^tbNI;(AiIssc Y Y_D]6̿Q OnPGXhOb6d`n[+!oJ9``1;?JJ\)X(C/s/, z8t κ6̶ʘ*(b?l$)#7YZ{,2a-<ס^kƄ%r'N\'RQC%[NxU4ȉ$Gido 9aOײ3c3 㨍<#~t.8܉SO]c?J`~ͩ2}{X&.3Mt ra7ZAh#8Y?WSp`@lQ ul_+K \TBhbZ6VޡZ8 kG.>&M?4?V}\F}T `s[ZxN$6&q*'ߓYt,phvλ'#@0hY:xC<R#$F]'K>vh˄j14 ͉6" ,EMk~/(U*y rۦd 2?L͢-]mP\4#1_f:!adk&/dC Km$EKæzb KG`ee,ۍpiqhvB5ljNYB|xQ˙5tZU<&22.;(؍0jCx<3· `E,ec8Q} +F%s|2gʊ qrr y9P8A #6s%:Z P X-#G|.qϐv<:xnZcfV !f. 3Uq9Kno(=wğ9b85%4MCErho)e)]%`"$@i1uɬmͻGh c&rf:8ȇF^]9-f+( wOvPfm ^i͞\{hy>9Mcm6@|KF2sRA׈ŐrCu8/U%|9j[PfH߱jD|g=`_"IVapU]L!<f8c&Utɒլ֫16aLY(i).de&U;y&>VX3{1Ss~#Ή{[ |?Lh>7q/'T?G5"%RFIlt_yZҿ˕20ڠW!5>')4m O8 tQ(Oq"\5t\R]g%z"HmԻXNr+HD9@ԞV% +kegA@=YPkɐYte UgVWnMxg^Y#|MA?<)pz,y7(24D3RqkܺLTc)*XClV˒n%kHiUQ`,Y~WV-B1 v;P:. /B4X rk-G!KW Sy^\ĥU~nab劕V*Vk4麏4Q_ יb>sx^F0Lӑ"théF$(Ϧ'h^#`h33 Ьkf8f U4&w#$3&PyяRr!8dz ?o|я]㍎%3.[jQ pJ̇~Auma=R2 VYMV|&x.yq.9hv"'!ZgļU,ƥ*)8֞eӏ(pMJ0R.D| Vy=,/>+wyyݡoD,:ۯlEI'Z]2 u]S*ɀMOKT~$Q 5JZpb2UYu׼\(%r4rkkaGPm2$V$ LhQG w/=ЃC;a1J''Be^dz:PSip;iҠ e4q%!Z1. "ZP8D^{KO<} CqP-w/ʌ58o>IUҶWC*q0UWxo>ѥX֥F=w-D$[> /H q>F8 {LLU';X2]zqRShKU+7hoVVswn O:msp_bruA؄-nWkc}q]<*Tc^TNTN0}f5Μj0Kh\C%pPY12)ɱ~/9<ó`\f?`Y| nztݞػ$ 8>T€Ԝ"o i hо _N{n"}_i0g!K` Р{Tzt/`ZzH,6Ҵw> ^p[QF~$ GGKs2}(u%UC٣kd\Y'hLZuʍotn) [f'/u\O@|x0 ;G| !pZ$+K#Jw@)NoȨ&_Q ?(`z&?6ّrcQԬ3Tzd}P@zyOxrFHNm>MYofbwP\urYz@I[ՠVdQ,8?=j35( Z8/?OazGÔc\{ISgk>[<#F-n* N~y)c"~D_f8#D"~ojYukGj Rf;1C7n* f>% |LlB7w`U q/q2h+/ 4+7#>L_g>n/( B0sAk;2+Oo{H۸bӫ@קٞ$Xv(5;3rxj~z327({ܘMgxT/m ~S7|XAi382{|%w:\t'3:J쎊 j݊B\,(g%}i(*?YkDzͪ{Euu(g@(DߟĨCgR%3[WOuX)Mo~j OVSBjf[t@ 0'ǃNk5ۤ(_ydQzC7YyIܔzx杸US9z {5+=}3_q;7$^[|J _r CdW]QkƔ{J'rK["tY I]B$x+*KEkԽ63͑gV\Zp Fpy.EoGb нB H2X>-J6r*tqRW.m>"Sx$TfSrj%D$GɗL13e{ > t^drJ뉄ݛL)Ke^(XC@,U3a[$N_վb :!2.,b*㰶Dcg%SwFL I͡.h= ){\O!yzJJ˕G79"l5+/* Й,"J-2'GY90m զ٨tD3f~r`Aԓ@EIiMG*,46ideY+!G`jrnB}j#3+Ulf1o27)tϓy)w67$Vf^-X n܋]ؖb/.ɐ/bi@$C\qjkkcufv/#<-kSwU=o-?y<>k_  3#gLE 7?4}<` ?h./0c[ ]g9pc09,y˨C֚i=Ha%w;"JnyQײpW3NHeQ1WUҷtCM sGA 3z4K{Rr* B1LtK䢹iVWw$WW=v Ax}ˎ2 |-4UWJAk(lUK\>M3@a͢KW>3q(z)j#.Z"+Cݪ i <ܘThB`uӅ)EŌh0ڬ#zOfxn;sC`njV+HSbГa7uSrhN<zkx>W;gn>7Ft ץ&m*P08)ׇXQ&=ˎU`qsw+T3\)ƿ,ΪOf{ !>&yфcx? \5k"E[Ttz)ƇȔqVV=ڹLHloZ: t*Bo"<35?/Dtf\Ҥr8>f/4QX+x:acB&fUq␇)[/; p jΑOή:YIm F!h"fލK#I^$:zcV$!g3|;&>bD$"dtnzGݑʊUs,4bL;4pWE [Wװ_p:J'`ý4eu0[#ׄ[s r"Adҗ;ueB<蜑 v/Y$}jZzEp>[+nz*No$4RwAk:dX-״ʗo2,`S:8ޞy:]20ͬd* 1"a) (JDA?Aِ\|)i~X 4?ϯnx N656B Lߪ/#=j6G8d|O舻7#oeX׉"w|~}6@g[0"%^S7 ꮅgIJ #f4qsD"mAŠT˂Q3^( shevEq@muە&H!8Xeq Z)*i)zYb&&ou,prp@> lH"$Ñk: 9& Rŀ32YSHz[nH+UЊW,  LǵZoPYA֢%(%gd.W;45^oZTB"}ͥٙK=gH?$7w{Yu|MR`۠ uC:{hqy얼fHaɫ$꺰ًL( OqSBjɸ[,¸VoٻOcl=Fn7E) $9~;l`Zȏ&=C8ټ1Lf:qX/@I|mQHÖ ]]{=*OpE YM#Bg^XٺgHhz1/<_js{a+@Q́csJD_W^jrC!PEƝoc(DS}?*^0;Z]Oatּv1do#+Ze{fؐ8$q$}lk㾰еf-/y=)}:滢qcJ)l4v6m@w0JjW2A7*KJ*nTj$o V ғ˔[3?s6>?hu[ fi) +*{c+Hj0K& Hb3~n{"@w}ÍGoTԂp Qʭ/ue{=,[_U D5@@D%/7soanS;^4ol-mϗb's+U5)ElD_Ū+ҡ-F&"wBo|#p g|jJ&Ӭ.xiPN6sY? c$*9OMOyMjj (ƱW]-/KwYWz˟3!UBJVǢ^) i+?hfnwҪ ~ד"]8>Wxoe y#O Ձ&h>hCG{-8Â>SiZLΒ0$DBI;jg0☬HN N1:J՚ Ŕad M8 0B[yc`BWwz X2l($FCX5߰Y =!^}9R% ddHu`Mf;KWs w9mQTnc|i}~잷^ؤrn=^'J]E @4@wHOUU]%l,dPg6gZ|B,7MG%6좚:4է5KPh3 O0s7@?ؿPXitXrxQ=a7!)u&b@hPFBV~V^|*48K,+E6 ,|C:X*m}2(Ղ0dr0"A{evdNq':lNJr5%VǓ(i 6eon??ϡ֧g;H"*Y}$9,# W=Gl&赯[UW[5epkC_̣pI0 hyr>RTJ )S,QBeV?C'о.xm |3Eh\3lMMT]iQl$Νp{[8Ο_d|v#y\+_2) $2Hv4Zuf `['|, H?3#oS\xjDG$<& Y]݊ihZcS0In[g}b7%E4wh3sBg`]1{;Qr 'cLR c/Su 6Wvz &s򣹞!$e ÕZa(ːK?hte\1&(f"G{$8dUaLkGG ؓY:RϻMd*b~ԎQKiv%c.T|{53o|J`m-$l L­oƻ'd?6Ixl,};58iBe,Ҷ&VYw}e]^$= [)KZjM"|"h誉TKNZ,pe lr+AO_}BLa. Me(Buhȃ)]tlcCbVo8- #scq Ҏsv"jYhR2> C3Hr"PQTre@yGQ4' s|*=ߋ[γ;N";*һw]@/-ALKjFLm1_E.[]/_ a4wb$g/R(f?qfgqN6kQڋLu/݃as:mȳu*$ j;Fn$b)u*g+`z`5>~L~ԻFS L[D" 5ә*~EI!O$4W(!`D&MAy7l:=IG'K8#*=wOڸRZC<\FNyM|qVH|M+/~'P0_= o5%mxEcwq@gCJP=ϩ(t3!#IwB{{,]6u.  ۨԉazG?P).Z\j3eGOAu1@N؏)9],.[xd2 9@ͩUPv;fmZB2A*Q蒚 efƒJT1U0 W&&m4Rӎhl\NQ5;S)|.o[,{{16Lҏ=-?VgqM5 ]f:,J~#cbK[!oUe(lO63Қ䩅IbQew&co%?F^UT.wL5</xt^[HܞJ$U zNΰJưnb T=XjrBp$bbY.ek]E*dzZ[]BG]kʐqU BGVf"ftRpXd ZhTdqZ{9Ry9ymE=# 'Z-uzjyX \l5}?6 ŁWF,2 CA35A"!ik`\=¶7 )h 6T@̂`h+rӏ.%ʰ΄ʹjQ>LCixDDrAb9OEaGVהt)lML^~Pe1Ջ^J;1_ GƠ*?_"q z4!H_H`<#=q93۹7Mōsq͔y]I,!08> Ip7?h}x[=x O %B+R2p;Zا?-+to˺DZ~[b6?X~4z͋V@[]LQ , #ft>!*{ܾz y#\8EBb_GItO,DK-$0voBxcМMT x4p.FhS_gk޴d^[d AayB:b4Ü}D Hڥ^)tAlѣ9HgUwAi2hE͐ZjnW%n`&ev`aA$~ B>4{2IalqUlz%> )XO ;m5+G=ʖ%SPrκƄaaa'EFO>)A| RHmQl" F^{__%j_ q # :1ۿG\L7ݠ9d;ź󿊡 Q|3N48CL#\N[!exy+{EuW(FleR;[9.4Sd'P{WHK$vqq(G7c䤎wKulؿl&8lEzeb,j h yD\WO@cz, y'>^7_h^dC޴tGv2$gmz/|]LOJ O<5 &$98č$PIfݍ0@byv; Ū݆J˾ ߿s[6vP&,X Z4$n;Zll$', W[+`*?UUʆ[ЀsO#a{<?k0|7@9nþ /1I )|+$Dy ޵B9|)Anzz%Ϥ  2rAChyE%1ԝܾ+4B O)R5N ki]X_@`H%RkMQa+3vBJ 87&Fk:bf9&-e.!?^Nr*-jcѢiԑ0S)7h(U2D \ y(?)tzO0Y##5naNIҪ7ɴAl>k.N,6clcc*ۼhE=d)MR>%˾wN0]>1i=&v;L{٫GRUr؂K"gWB\L( ^o trO0ЌJ],BԯUcbܭ$[ =#;7z**lckt>zŇ1#M+2 Ui$YBkkćpPW0$#pd-K 4 Cq.ebLFW$`oA^uCeӋ3kp/gՆDl)OI Rf',"||S'+K5Pmc0>FCP Æ6 ;]Tmp۩J Sgn^&Yo1 g5kv&rnJ>R='Y#zY'b8.9FVi2fz5x}5W*:~^ߧx^^h'Át$_xHܺRs܎ 5ɽOpMyx( Cg^>E;.drz@V\M#֭!.p5~8DۻhW{s#Tl`S` ls{60+Xv0&z^oHaEaD`՜E$hW7?okFӲը>1̽e"v玱 9z/AmF]i͡:vdDg,B̵oj 9o/ Jٸu:w[eԗXh>_Nӯ?:Maa5\`绻65tX߱?pJVN̿oa6مq[<#8ܐ_{֗l|g;Nl>',(0;#1" 8إO }(:$߯+o!1$is5>y vfE/lOR՜nوR+L9_#c#ym;G~kOzIuti̚*,9ȶv(d _4SA#6e9h 8rddhZI~w};XllekCKH>"캻gAmQh> &~y୙)3W5|?[uȩ;vu9WyӦTgI銏14O^R^/)|A\pO- ׄ%G{8 M׀ݲV>\G^.6bI*)^zUC&~5N ʫͧ&VDRCYř̬gOZ Bo֒C;Lce P|.Z+rj^<"Kt Lj(D mOjk%g"{pH /*qәRoP CIYJ/]gf-E5Qf)3XNCJ@Z6TMcI{OzH!)DOfvL%g7ķnp\H^*<+ dJ~P?(Et3dd[_[0bK?%2{Z+ђj @`_j'ܤ%/?EwH^&~`{.Qߒ8DCIw0uΊAyYkԅ tPˀ۳:j} _)hqN)vggŜY5lb5Jj%A:×:,9CHp!ܑ6`[,3N/-%>m؇2قNT ޭm >'O!YlM9]ߔȳVTHp]dvr9ר_;&2~^%vf9h73vb7`kY\5R -^ϴޛ_rޏ6ԕ+ʕq|Phc?MPXf{yK'9oB6 $e..(ޅ,U/89|3EblƘAz( 9hɆ&4UBoXY)ʊɕZXĒNҁpX |d *U~8&p QdMD5Ù(O}gdw [#Yݠmӓ!0{<6s4~'+RU7JD|ldX/ ث3qCBk:u'3{Ǽ`QFJ{Tʡk娐$[fS6he&J71 Vn2.}> US@GNҹƦӉ^[A rû~ZkךSN(UAp=d7A뤞E3u{-?4?wև'D+`BA,ki% o|:$ pB*S3U~GфbrqTTg;ѷ[Cy &x0rށ6C1b` ϦV PiNBŒ"}RA1_C uj$"ps^IHlmޥs#uP9bcdڄeުf1#3MsFӸ/p#C,ÖS1S#z]ub 1XJ>5,Yɀ&(3(?YOQh=b=xTt?m-DxwYTeީw4f(V\_O'|+zP*Ӓ2fnm D} e`?E+ g.87<^WDIp:VFUGǸJEC]D`k <%V&OWq)|G 47j >9<˒ߢFɃ_!\v:zrI oC^}xfBՃ E6ד\ӏJab!@8TůBv ,]S}(SH%jySn?O!NoLtK.Z`9 C_ l~2uY#⻞(p5W'~Dºzrm`%~8X~nk=3 K1>8ofwVQ?>+8ۢϲL^ő[[Zg*V}-7jbhh+6EEMOU-`֚JW&aH&}q6.r[aifLڑ쒟ލIUӘg\@`YzʊLOn^2}I2b_ό6,乯@`s'dr=-,2)f(VujQ˙(/70JK_F/\Sk-qa.#l%|dj&ҹXJmDJ\ǃ:t {<ͯ&6clGxMX,Hx[YMyS ZTaWY HHGWawL3>[<|1Xz%,^ch*!ngtoH=Tey{S`of&f(EIMtOD8u)%v>7 J^Dڔ&`jqHII䛔 ]i|] %wi(u_CQft4sϑ% 2iW|Ggn^T(D'TISiMs4xZ3uVr]+%G?J@wlTٺ[S&QL 56OrLrfc!$OV! `>! k̓B)ʁ,#"$fsR4pwN̼A{3杏܇@Qúyv\8-Qfe_Rg3CI36XDYB&N&n1*z$ޝ E܂]}hg3&|Y~$%,+qa# (@}wx8BE[LR0hNJxO5l;Q0d(|V u2Z[;eRK8OjmeNKgM =WڷR hwm="nΣ<`k׮Kё W ksK44%m߁}es _1Po`xfB Y ι%*y!OT'E+\q,-1'nHD~(%Fj_2nFS Syȇ¬ѣR7~!G@5 mtW 9k6.[ס=h3i@^bf'X~!FLUm2 X]L3;q]Ss|dWНțdM52NZDReNlW@@0QաŹ:fQLf쉬#o1ƝFG6p{gҠe8☕ o5-뉬ZtH?-`-z%Aɇode|0LG m<p"fd4oQ5)&(Vq?Ps^'x k1$8g[GEzз}\2Zt &j4*i$F{%,VuJ8DVrxe+<کٶby;9&s؂a\tBJm M?m`w.[.je t4BQf 5qN,nMP.Ы0~[,B/'ߜnLݛfH0gJ+T$$F \8u?FoQIe0d*M>Q&aJj>z߫:Dd04{#O`ݸ#Vt1;"×rZ' Q2GC[ģ޷@EߕTz<΍N5M0yvܲ9mσÂe#f$OYlow(v0i5 tl>nMIY[\u-eU_Aj?)i,&uU,/R |[KwQK:Ix9&v8.H ,@$MSbkY7 |D}KU ~jKwNlvЭ7'"+wպy*\$(^p>!%#[3.Rm!D;ҎdX%ryJDkkVf^O'R k}-'VNyՍCCr o9f>_[6{q#CgTWk9ttTN=P+i;˝)a^o+wh \%'}%E Xp=HTwU"Մ:`@a<1,t_11IPǡ(>|7cpuikRn"|3@G퀽"%ǽnK|,o|d#eNc+jIairjgN\YEldѨǸr$* vX a{f0*}5-u@N6}74mîaU җo&1g:쏒f*{Hn ;] ٩~sj&Jt::wF B;+ʒr)8ʍ8grN{)D^gtt7|81.' K  Ow|X ZS1west(y|Wu߬p7ё.}E-P\qDӭ=oyOЃC3nZ0}?ӅT#Uj%Y*3dLc}0!R9D 樭?OI=4!oTF! iMM^ gқ].˽𥉉N i9ٯ&tMxV&YT)p)?Zr_#=מ Vݥ\!<@2gzvWF)7?(oj5䛛G0xsLR4yp ҹX?I/ig%TCd&_BDj֬RtwfGzg tZaDwq XM2~[=#83nh* 8 0 GmW{VKV,~`CУo5K49be%1C87ìEUՁeSyT4,*VZSQ11Yt$D?OѠlZˍL8qזШh$[\“s [[0[ *_XۯG&-?R+"+ӿ]cE9n4d(7F1n7&oZ#lIGZ؇餟a i`9fD~O9q +!: 0\an{jw!*nDZj$S?@Ll0tBac,i\z/F5x !Yjk~"LƜ"zrUu@e~ɟ.ab~ӈ{f[)ƣ9ZNK(Q5~*di?Nd.!(XuV^iPZXzǶ̩p4>Oe g0>z" I~( j|̫ [!&5/D8k]+؜3T+OIA|b҂^ Ƶ:3@?Ƹ;6.ab CdnwE1W6V2FsH)b. &wQI)HF+}Y9aĶ})*ćtG+H; %R5Q %ڠ/ۂJxHRΤMB4jsB@%Ɇx#$M$W_mJc݌Q]cHR;"b$,dwa,c+8\ο36)ځ%{dq`eq&Y^g He9\-kW@KIcE[Ntu, ԉ\B~)N: JeGt&{fq yDs[+ڥ/Iٮ23$o}=dfD{u}~AoweEaT~#T]Ѩ'L36]tA"n@DBSP6lF6h:zg>My6t?\4VmK?K3I '贓b3Ub3H%%Bptgma;"S% <ݾu>)я#Cp0jF0{ ʐe_y{wtJD'B9SbqnZAX( Z+ e|AUϡU$6 ǺXϦwĽzY%gtm~UNObc!(0 F| iYkY<Ԏ`Q7]֓A \l솵n#B+0Ɉ2H⋷3}GCiӜz!aE]_A]Kpuj'3R~zL~RLnKXHd[Ó0(& /8HbpM?N4|piKpU7ࢾb &qII;D ׽f@X o;u|; C^+I6X1hg5U da!KLjI3F"꧘4!۴T`xDLh24RWlƜ3P"ϫfї:и5Ԋ |FxfsuXjx2҈oEB:wY1rȂm.CSy ՒЬ vȱQ^r.P R3@4Lzww-$ERs${n|`  3VAqnJ=@_" qZ_ hė+)au5Z{_cJ! v7b -7残)v#1,0Q[5AxS5KٗD[{hY"LiLjwe[ejϳ:?Fk ;Uy0O,?1oZC,ab\xu:C)P|1_t"2q<m}|ˣO*66YFEޱfʥg,Ҧ s:6;D=諽y玮~plQOvpu?$N<歌k!]CQ101hYMgHPҿ^#s~HŊO6O2 pzk_m؉&e'U]ϾlfjOf옊LŠy-]IU~vԾ)R i 3൯DWN}h 2⊗YL%gc]/XUc7MƙdgQR/w9 N_I+*sn(:莼^R}Ł;hcZ) >͘% |tÛ _jd?Q]Fϑ:lPۧp6tAD>h5 e6QIj*Y(MaP{Ibr34ރ`hMUgnaeUmSxSTNec p|aP\JW!X}VZ ԉ[BcV#WfA^YFKZݛ-kSyw\Ίv?ouy 0x"}0{)xWK꧱Lp.UR_HO.%(a[\2J&+A;&%91U4,(`۽Eu"4E WR5v0.7k+iNMyPEUP: `W{l%b5s~/DH=uKSw|Tâ-STe 9L͵;*.CvLٝ hUc<)K nB][kszO[s (*@&~m`#bi#Z\Ō˃1Sb/I|tYXT 11 #r1''187Te+7£a-ؐxP8! qf\?tNW'%HI`03жz>QWfUWejXw X K?_ORLw@znj-pۤXG3w9辑Z#ze93AÑÔ&1(u|zTUiBV0 wJdQ2Eu-VUpQbTI}+'p\Z&9q$ti#*0с'^hʾ!? :ڀbEdwɍy $(t&#~8̻`QH[e&/ \Yt=k CD0k\ #aj"/h=xW6zqҴ5EMf*,BI!uaAHJ'ZW97IhF/3 M.2*3NXkj9ܥG?yG]"+ba<|&n&6s=C-1,YDvW禫NHy>J>ב6.P ` 0[RS$e skojP(.muCm,mjé>sJux(z0cu3>Nڥ}?aF%GRD?r}-{.y].Ŕt4H%MNh5΃sob3[Cxh"Vо\cɊvO}@~[s=Nm@ׇz U0܍ҁ&ԦvPM{Y_2]0nٙu7Vɂ%s<·ooXE` }m3;؎nZyU޼یd8c ,+ń ʄȶDNiBT[䧜SSHWC-r;ۚaf`i!tfElt_O srLx+hxc󡢶s9§oНd,c\EbAi@W7"h]= b㣨E׆p6p֗j)C:,"U9b dUx6CNb)(b?]Nw>4a57aT7bF=5?6l,OT8}͗kڅÇ)bB)P M ܅ҡ}e76Aۺ;ed\c! Qy:)F$樢G".Jh1C)9+'BNT)| U/樜A/B_GUl}jV~ҧjL>%~/ F07R8 ,U^(mm=~0%UI@UC ^\@wO;YTч"ׇ S`;>r{|' tKRF4Yә/Svč)Gs4=eX0PBdyִgB.fPYe';9?pǂw랫=B :K9w:K;s f糒W(uuֵU3!*q##6!j^֤ΤʣYeåuwNc_3QA-ܘ4!#ӕJ^|pOwQѠbf ]Og#!^j ;mVk 'N03B3~z۵6|TO:ZEyҳ$PjbsHIv0/n F,9`Om䭗0ؘDY qO؜+p|H6 QV@:g"O|h[kS* (:yЄe97t!kZI* U1?bSY[WM0w-zl4<VIDVkčnW\ ͒+*XN(ƭʽ֋{V#WDpVo^Cozc ~-j !^6k_t W Kk^VQONgu;2sy :Tv>;`eI(Qm̾x  0$yhK `߶Fɪ|Ai#bY[jvR`39:SFI.xQG ƟlvuMÈ`-c~ &;g᱒p)QaL>ceOC6^ J7!G,L']GPO2BgfraTu 3}'D.fCX<,˔bPFK/ѡ.]DMQy dׄO^*DȲW{L|C5HFy9~N/\Y6K&0ǵV2e<}=ɛnܝe1(m$)2|Co52,NqϯY2 aQ ʮm+g8R_wjcȷS;Hts={Ͼ  0@Px]OQCө8>͉k|w; ?EOwQ}pe"Z%.@ $x߼E ٴ!EiܕX1H(_vA5Uݸl1cV66l&՞(8Ck;ϔ{'@THĺt$ 7C{Sda.S S㞧cެ'EI_ArK~Tc7\O-lgmKG lE@}}gp` H&5Z8`Yd1#}%/>KzTIIke~{AA<_/#b{T5 wt"ZZum {{bTq{餜ZYrKa:C 2T}T# Ck^\Era 8lON@Uf5169Eڳ1F=X](V}gCY Xꖠ2橗hc8t3L9"; DV aA@Զ]C=:WzJ-'ds\{]7̖p#% [k7۾ӼI_!pZ w?6y=$5I+U*'6AJJ,=*'GȖowr.~)rvo2VavZU[Lj}7b#̼+!7؁y>6NIί#l*~Ӝ 9*rOs™`M7 oӒ"۔K S)(0̝fe4 WI(Nj%UK9Ck4Rm"s34'bkKMåQ8KC9Key1û8`#g/1'QRuW2 Xk:ԓ G0XU"#1jDBxN1hV71[XmU PZen ;ϖNdI qsqv X4(({'|#7R\*\*;ʎ0# 㔍٨H]1 RΞ! PGɾ\GWe D׋?⾍)IJځUP7ec:a2U"(_;%xB&>KHp0VЗi‚y =>A 8ru|ſz2Ǘ}3 C9]]WzFw Ǘ ]%vfN'x;;=+VN1t}}܋1:vx]>R\gw_JC$lh R3+,^ YqܹM4⪰XN҄(bjִZ#Wg%>3:.dn4UIb,z_< ႊWX8{<'XV-K43&21!re?Hl ~1{75[ՁY4ku> N3JxR c HI=GnA ²|=>Z׷+E$f|\+kْ 4ڊ`1dx=W c3S?U (:.V \K F)}Sq ί?-ٿ:D^'TY#eG};_Px;%-HPUm MަՔ"v"ƈ'{,暬r gv 2NN=35MJra0Ey.y-&wj"}n`}opyaSk$D}*a~;T8 #Ɗ"T/[P]R~wt=}/o5y U-W{-̕vv_񡊡i[O%Dt{*=W2|dM g̔r\~vpp$TA 7P~޹x@m˃oa&oŻN]Ypq~Ghu;<JoF|N<=K {`m,JCe_V}|w%$,2۹1t{n`h^f5?,MKmtSq%eZgû9\ʊn"E`7ɂ_x\85B𹑘}rw 5xZbVȟF`WyٜijUjdۙBZ xK1Ȯ_w`EmruS*yv߀99ñ Yoyy6+%!hḭFb槠 n~:Nlzăf~ )* 5ASmlL.߹6|6&?ka>j-[I/QmhB. ݵRȡ :ز s]c#7]j{-#hJE?^N#SxoodƌvAPc.z': g`s֛lF[%Y`fY6 BWYI؛(znX3G{gȮYVl|XGxU穤WCpw4YGJαDSwOJ+^^d.Aװ;Z$WSoI'~'7kKo%p{/L#єqY_? 9C=6IXZ 'v!`F~Of_&dj f lR&@*<t=ܴ |x]7Դ6|@֑YsY-IkZ˙w쬐;HNiwpO<Ř)a1&qHuksQah V1vr^|Az?Ky /f?fLX_߽Z$n( Vu|u+F"*r楺֢74+9}R7Af,}f ;"O)R_/bTy >3pz=Ӫ}.wS $[jP؄^=ֺFaY# }n!crp"NH*t Ec[f Kqɶ)w:BkK8p.e9+b.\ji6Vn'9pDPQ٫U5A&t٦WYA\&eًȁX#H+o6ziwܘFcj4b34dC ittaD}+TQh(r!ɥUDx]:oZ;Sqq֦u4{F DzA;z5h@nP^JbvG\s6]q YCPȄvTrLk5!yhӓS{^WRj`U/uP`RO]AcZIrzd@ШHzQ?Z_ɓCouUiׂȣؑWxo<<ӍbuogJP5ϧ5/q'a˃e0$sV1 2bޏļgʌT_~ ǻ9P`{ӘPy]t2ZPCnþRQؖFWk"А:ȕ_H$;.}e*F*~7;߯󂲸9?M V!B̛}YYPTr,dݕuYfel'tHG+O[EccC#6*a|DM6"'=ub6,D0ӳx,Dff@L&G+B `\*P Rz$XvIA9{}Y~O8pܽWj=QW*@JFB+68XG䈐5}mISFs9>8Jsq(V˯Hn$޿}%m GaނO3KDA$fSU KGaw0@B>kȣAZj7tiv*}f;B~+ 4/Y@J`*DV@ȏ J}7!/L[%PĐ!hZ DOV9+KhXWj8P!E>+[mŶ!ѷ,~P\k8(؇tX.#?kpmPZTxd|Yi_W=g;;v:HÅ|p u9=Z}/4j1 gwD=`@kB֞3ll|FqUq2&Cm jPXBBdw#Wu1 4"M& :U(!(F/vjkwIx6t4R-xci {ө߳,ݷ\ GfӨABҖ61Kʌe4}l&ƛV7uIfJt"˕)b-X\P™ Plg_t ffB%]\WL*ͣ*xE ]zcSl "rBBZ,|tX3$QvpMn2U׽x8h7p|˕/A䁔NضD~|:]O&7"Wڅet0H"Ttl6_Zz Ԝ?#/}A6Dۄ Kɭ tdF&UlD88.Ms1D8Kqߥ2z/A =zhg5Q)8_'i_0o;R™pl+ȋ  "!ů$Fa]WD p5뾑4zO'L:#$>>]t*PG)Ba=za/{t³OP\1m: ˝+qe5+3(!?#aϠGE765́4Y=N\1/X}pDPiemT tC m%nmc${ }-[Óeq4l^^~l;:sa~pJ .xï@S]$[oe7bfɔ쭚 _ iRk!nNո.l@sHCX΅ϔ"Za:S&1_.(DK-47C;-$0=wwkUqr.{}?PxO\ b`M[Ij@`4xSuU2Nx%]$ť@!v-47aQ M+P*z% 0)LCf0bu>oth?[f03l&I kd7 FYTȻUXs§*|m#}M ! d2c*kz2\L$oG40F"E8/+e9tX]"(ly,7ibLXZSδjmS܂< d Xejo' j {l[8\`~29~[//>u +:hJpTZ0o>Da4ak W~Sx aNFpXb}|!`j( PW|eTٍ=1`H?QpTK٭9*T@tĢ-$9A|4fA @#q=e'^iY=|8_lN}[Blޝ֘bYN)OD;" l޷$d:@.NXc#52 >ٲ%X9HR-1pPoA*NE;br~`1!ydcI*sRTRcnJ.oޑ'6go{)Q+%`b2<i2PAiW[# D.w ;9R)RzWM yC1NW9YQ TJ<3vZ^PL}\;Y){'CCԪ;b%YB:|3 IOf51Ww8'BAF)@n(w2`U : M81~yN9,k̗&B.|pM(U9uF7>YH-C@96(2"qqP欲x+z gՌ6*,w^# X9)b=̉g*@N=M6𒢽-L$i!|K-^ԕ'jOEO`^kDxNoq?xIv{Hؤ*!Z2|][T}T;3k>wR/Uu4/[JlđA Em1kZ HiW!ƻgA&P_']8!Y⡖7PJ'7,up5S^u~.3 NW\)rF]͐wG~{w+t߃:LpY|q)+h߂R+Emv"/CFp V;_+[\|ߔ0|^tƖQ@Nl^z}2CLZt5*G71@3VR ްrB2!xVRvgA[L"(es'뼦N˿~m#CnH:`6՗6+k,m&j&[X̛__LYx0L3TjeTxt*Lg]_ 'ϕ_9^WLa sq,ڨBԘ5. #`t*<w)F x5'('Fw4*'؊DʼnˁL Qk+s/@1ڻ.a9K5#RPJ eYa~>6dzQH?q e-w!EbUB6i%: CM{"R``mze*oCUTsKy dz=Eպi~uH^ |v(>wgkkԠh9_uɤ>g /u'l NO[Oz=M(#ߗcUR䨉+0*0o ZG;Gߙ}~D5hXʜmƏ bئŬ8mb?M@eu@;z5!{ ybCw婮A4zKR[ٹfF2 9N9.cفy4x$T4^`$prEEбֱ:0fup,vzs  wE/ WHVcT@EcntÙ5攮P JZ}1a\ ;&$uGp5sa##QrtB_H(7>&\.shSo DeL+ 8/0n2Cn^Utg._F΀qkTc]nܢi|Eyy>Whhw*d8}|Gt֡'wwS%&+=j~_^cO6*e1ȗ1T8rS3uZ6:@j[:D_z,=+(,|TF_Ӹ,$lY+Ă76:|V- ſb}.&1DC9eRu&X)7$5fwfd򻱤kS'!7$ᄃ r\oBI ax5䧐C]Y(Ԓc̀9V$JJ]Pw"T:u]w:g0u`-R0䃰t~WN:7jS)7H>H R)OL:vQ_19ׅذٙ[R2IQm"Tgj_{ th"ph+Mxk$łU+dd #p@ۑYǔ}7Cfbk1[e`\ƖM}5 :LF)i Y[&mQQjp;Ѭ(᳣6Jys22Ϭ Vۍa|ӀI4]lz(!G9*CJ pY63TeyZA1QCn//ȿj%q- p.27cj4qIEWwe]lq{gFSg.Ve+p ˁ&m*39tiZpSת/̘H=+1k}Ƣ=;o ߮est [n@iK%\+-?U߫ ,sٽ][UkA`5. YK%*+ ‘;p,W:+\@0qjLX\}w@e*M!7.~g %>+,*%=@KIܵ셛<3d܍2 ÑNduh*}-{;;%`J"Pfxç~Z꽿sBG'G6te2oO\@[ OLEb%j7ۿ q|%]Dc)9D3mjlXxRn,8!Koz ǣ*YҤ7_tB76 PDy~Abq Wc$ OvFzxjVLTx( /cέ'y!,Tv@.^I*r0Px K}OW#:61Gn )C}XdXiMoG ┙h9Ao:lkyXN.btFаr=f +$S}ycn*uVlXL6}bU7[c*1 # HYUޅ=qy {tH>}a]*XWLR&DjF9ƅ!TyӁ~ZŶ8loV$wJF8ۮ&F>/ނ -!`!n^;b zϋ C+Z^Lql=jL~aH'd(2lF2w&𳢣ߵ)X:b, KRpitУ}yQ=w!ծЉ] St C39/413djHg^;r/IA?2XoN͘j=VwURUdBU h. _XB7 =P)I`]Nh|ˉ N(j`-: KWX0}bݳ.-9]n%쁱nŬ翹KOܴnu؅9J9y ƯDa_m[V\iKꋶo#c6N-b\<}]x*K3s gJ_3 +['ۅ<&HנNILC7h9~ (S21(D1 ec} "UZAʚ,S$=e+fRLnv{D:o8\#je"AFѮD< 'p5>A A#+h콞C改.eH-0⻰8x7(,ɒ8d,$m;){nOE3&G0̆rE5w/ӣĨv td' ?w Ņd_ӤLLV|#g+T\x74ye7zΥJp?12%um&n@ܲ#{JbP-anpd ?T]^Bcw\BŠA#q rl?+H=zD-M -r BwORvT\#]^)vAC O~FHfVF-qSҹ[(Q2hGb+MSʷ9S]VA6r\fʫzGa#wLد-K_.ՌqurڕlCKAFwAuhauDDX["^m .X/{p{#Q0 eU5fA$SS3&8IxgZ q"ہD%+ @ N5TWBڅeq*dh!5%~q2~,tMI:Γ D'/>ܢ6-`Ѥn܈^z Sy6zߙ4GZ~vS86/F2j։llDb\c!:9$%IOJG5#'Eom8~6y\+(I7"&K@0cJAJ95~ #5 3Za jct^Ʒ\{ BcpLzGLj6)˳u3C;idحkt|o^TSpY 7e<*Nw1t\Cke %8E"1 ~ rdbOEvҡ=1v/m FU]nyD!؈Jk.F-g3HNxcUD:e,"o8bօI.LDIyvyoc`nO== +^'LZ N&u E:n@lcX|cy!`J6v gAFsTV_-\{;rƘJ_Ϯj] EXV.35^w&? r`0~e٧x @bM{wh}q^65hӔ'Px}pc/#7>A`Bu zGJ|_ܝ:m|N6U3FW~q'a:?Cb1+䁱E dR(%ݾZ| p/8!p0): Y4|R^1O{xɸɠyEO5cn[b*BxY&(5^9,j|T#'=7+OUַW\vjB\?U`iSMA+NwPb] -o!j%ѣqƖ}Vm9%m]JUm\ aV r}ug:Fb2oQׄ#2z+nKluRe9%5 ,;qẁs^JGqwN]W} ²qc!=/cp y`}՚&w:#P2\%_(iqc^ Fu#^_`eaH *S*}/7U \̰@9SWekě2I !d"c$3rpvvʂWH/|CskWЮkkrjVs^ҧO&HB_]OR0c̙a[h13ƶ2tHPdI4ݛ혔V+;l"8Us Lyr9G'QyȾTL)5c㕴fOe!pxi /-WY02D M.<.JlH >ᬳKKRdV|Lל=n״ނCn6-Lj17z [iaEe!,pjYY晛T-3wF|&&v@~xe3 wIB"CO2Ƭk9I2!Ba#LjLǔSAj7oTqtћIP<wM IDyp:) 4k'e2@6(, nNx:AK9{Yr$ )^Q8XL:+wx7 RvGE FSU @w¼R\Iai:LTFP gmqD,E3G{}P uyߓTj_\9xwԟCTߟ0Ͼ4ԇ fvh2x+}BXLh5w>k$g|G M@R"P ^*@7a:Ҟ, 1d0-5b'9A3dCllس̲mZdVMUyݫctrQUjUώP]k(_pOrt3h_ߕKp%PĴ d3bh=Ü ![p^iPv[ {Sn:#\=]ixM cF/nA"o3}9r;5aW:' Jm;5· p>b jɯQ2P12وԃtrJB_zlh\)%FVV 60A2% $fw"&&>gGx Nfp@RS3%xd2v~#"YY }QaVA+Troڨ7BtLN7}TG؆F;ZG2]u|`hɼ"mIT-Ȯ)87|n{0Ҿ# rA}\Ss *ռ~b+%Mun'rVr30`eFaćvkwPiدߨr{+,w&f,$7s@$9ՑֺŘ졾D#ϲA!=ZyͧB*} 7&NuBʹޕ <ʻkK) ףtxJ jQ>TeDQ*=`VMة'2<5'>/)btLMg$|>ȩ`ָ2N!UZ;4n9,\/V2boq4v& {¥Al皱ux'g2k7s:e XNC>nRZ.Xzw^rdcɌZ1-&hK|'ė_>}tlKq }g?k/Qt?qnMکKZbr&^2*Wp\R=ci_Wl WݴwL,؅]x]Sa'Wt}(F4!M\qp:A!X;m–Q/R@F=--&)c'AlH1~q"`/UW㦘+^!r "||@,9ܞ>wv{) QQ1X˘ۜ@쇶W{M2g !tbFYCzB O93V=7v'gPe?~C2hPf KV  XjNY^-ˌ٨fsD޴"=~!+Pg~en޳ ,lg¤{~xj 7# ؉у4;~C&xbM&-Y> q=g}P՜-iG%p =ûq\ƋCjE[)!}Q]ƅP թĿ!A\$뤨,={]?=ga z_喨tY@O5ӂj^#[ UV`oٽȣzŒBR % }c,]%I*@-(9; ?`>Q6@JCd[ڡ`V, s)Wu,d8 V"8n&`DATͶ"wS3քTjmg53}ρ|0ێvF>ۈCgY,"5h YZRT$\p D6`y}WSѨ1>? 1%HpnJh>0 M G>݇ȒE]XKdd w5AW/H]6ε Jl՗ tzjfw@qp骾vL (!vfCAM }ZY8?ac[KfdMc_Gm| \lْtP ͹/}dbnnΖ׋5qYP?YbU4n3wzqR 2?aǚ-h%2-->oڗpĊFsDP36&pv—cGu1$DYkY/J ByC!$HYıIC]ׁ޾[LE ^A7}v?n*L}k'ޡM40Ƴ7~4 U Cs'MYh'|m-syN&Zp尋ǃB{pXu޾s"˾IhO#.S?#_$i3j&o2ӆIX}M2!%֑^Q[]Sw im;ҥ +*jgcn0l_i{ҏ:A/rwQ$ӽ!Ph,U`Yd4>njRc٘A\넣rGD-"+ eȥ; 7u(4Hy" #n*qc'Q0-6orʼGP pcɂX=/l†{Xt2P *!j܆l~C047>zq6A^/+0K4ɴҥy@bV{)! WaY="y49DG6򇉅:^CiQ*gRBB "rv@\u<}ZC i;P#mA}mc涢'8q@tajvTL>3?膜fa$ENGM*n ҅%> 7D}XTX8ۏ U;~*xX @6+iY*1&op‰ȣw 7ء[liέUsvsb93V"\2X6M =kg_+/3)htWBdTƥ+>jLA,OSKMd-1u<wtNFT`Qgv P3?@tD 9Ji#I#kN9ǹcfX Tߑ^Th~w*\Aɔ"~^R\eyP|zhQ2CSO-iT>MNW3QƎH n_ '(=Fʦ |A ʚT6l,RQִi 9Ĩ92b9o_":fCˠNGg8G,%͡GCDY$/6B*!4 @L[ L7˓_n|>|vg;ֳx  $oDpV"e,ζJ=p9iZ$flzC 9Wi(Cb{-Й#xQ]E1`j JӲ!Or9BF[ۻ!#L6X\ xAkD ArZqpt+"Z?t5d8~wFv}P*dAxa0F%uhxM;˄JſJd>t[ cwg{G8WyCEj"v<4%0H W/NDj_CjU:G_'X<}[kd.f:?A/IlE*Z_?sT* K2,4 XK7\~W@uw L+/C^f:U;u(:v[$եT5 6<%?]{,-Ispp=kOQa4Qd}g -Tr J)k7[<цKP oَ)93[oڲ̥ehh<2HicMD=n]\/>:y:0*HLqrYV="#zT!L W󊛊B:vAPNs}Vqo=\߯ԗwRY"WiJk'p%5?e XNUe9~~bYŤ2Yt*_ x8ϛMfE^@'7HeǾ+$ɘs]!ls؍$*/LN!饏]͚nu^a4 Ip/-X|l1|VO8W4FaP#.5="Gh soB]Q;0`!y[hkV.xgZYg;$Jar&krm$g"ЪZ(H:x=,>5rMpPHGlg8ӟ`;v*  RZn`y{rE+o]TB**[OBsh~<ᲄ'?\ NG?a0O/tUM.Vg4Pt ㋲mj{Qft8b`pm䂵eWGymWADZ>: 0ᜇmufG@/n**@>r3J9wITjW9pϥva451Gֵ螑NĂtyиr,rWZ9T!VfRw z|vnޔڢbոRu`Ϊ+"fEUDQS"=6%\plXu?F׈^g H|ijWN 1Q.®3T.ψkxeqVEXI:-h BCDhMlbgړJEp!x?|(0:oH.N) yMBx6iiq PE~Ȣo8ћ!q,ߩY~"r GBޓ$bjl;7]lF4ODx\2ZȻfE{;|~H">qprOb2'_K^mr =ϫo>ߕ-!/VWg6'/cD+@zv&1`؞1O^i(Vޘ6U'LqW(V8MW]׈Z]!^Gc9?q/M9gQi1¥@܀gaoYUTԫw:ѱB踜F9b6/2cs-oӹ$^WdWb [bJ=k=h Bp\85iR*%ϘVh\ɳ _=caγf ڠ{ $Y01+Ln5qA .KuG Q6Xi oi Ӟ:{9ܒ9d{ǂ) ? C J,axb4vSjJ%Ap\praoy1Y"ckQ h+C".=߮ B~Zه,1J4ưQ@RR.;rYLGRh2\G U\O.,%K XRzz}3!6tu!e-Ke8}aD0zyC$K-O'r!@a'$6$IK {,ɵKLЍ[͓QkJ\bs|FFż [(1ڑE:_ ɩ-߈Q<(<9.'S G-VlCVi37-`,Țjh" ~-"tҒ!%.B,nwi@:5p;͆Xw!׽H"u!9Avy֭гFҤCP2l]HbXӝGXv+|,b$M^sPN-f7olX0Hµ.Lw!GPLŅ"k6D"=a˞pzjݳ=.3y\nOx4Վ]~`ʱErn>u{T`B1?GjA`A:pu3MhߢGP)G(?q%#h-5gfUf ^r|@M#J xka! ˟, |H*ʎlk[u℺k>)]khA_ 8W?ӄM *UwIjPOΆ2>CԾJ \Bgм1sfV6K(r%swI x(*tIFT >eY\0PV3|6j2@|eO6hd^x(JZwq;PkSaυqMQU\CT0Q0"Ay GJ{x$vqtlN3Dsڠ W 5R=_Rܢ[WzA/+kEVEMW\\ؗ*F+gk&mwWy#.RX>h.xI-C 8_unX߬w;` җG  aGf7Mu$dl&EEK+eY7/ QkIC^f>bEkɾWd*[JT,`Lbq@odWn-7ÍuqoSZ*_$)q]8XXZ-F̒o χBo@b M"(驺/( Z'X.GԬΧ)uWqS{cݡz 1r_ G pGIthdPHt<Bh+]? ∾\5FclW}x*jltlњ%8vڽ8,|[/OӠ8:h!=q9͉Tmh޵]韧Pi{N5**F?4;S4c+oKϹ1-H ]u7)C\NN__1e'E&q(5GF:6}\ J\;߅ \نߜKUF09ԭZjB /Zy/2=ј!abUG-E7閖S9>*7xJV–N3XVimцGt;Jz:A#x B]_`JDJޙxx?P<{,}C5< [~ Yp ge5.C hUc3f@-o8i'BTt Yyva-LnUC󤫵H]j̸L~Ș,=j^%l|SFgk  Oy' "=u]:52O'yUڨ]7{)x5}?˽$riS=|In-Iu@}eJ{Yjݨ."Hmȷ?5Ш|~P$1a8[P7, W XL`W EpE9V45NH$T-oZ⾯}-*Ʊg=wbx*YvQ][%i'K)}d]^7ʕ=]jȴږENS(>t36H  YQϴR y"ӛ@ i@D٬gm`+6 0ۊw&- W**緐/!ڋ6_=Y;XUӾ>1aw2SZ T!C<\Åw7mea*PCye GV 6;]g̰`>`AcS: E#xj +x~%*HOzJs-D6d]}$,X\.rڐN3ŀHcaҶA<ygߞQ+JPXH֘SóN.=!X$c\V~x'A`tDKǶ`fEr۪9%eFN+=(Fz֕dEǾyb'zD⫢ctk ~('GklK:F5%^KAQY$j2&&exT9RqubM),d}rJ|BH\|*D]{7cbX7> 2iq':i`~!H\V+Cj(ݾ(\?P`[z%lI%*S=1xK| HY`c[Z.4PflohRr(N9pfD-B/9cc$_bҪ>ȡ+ OG|=R?L?|O7D5kPBd%=Rrӗ:u%L56ΚPu6NYo_F2nf"_/{Lx$- b"RWl7Q ݒ ,w&Ӣ? ͸|UZN%6]k¥XcI xc3׌R1.bQ^C-iMVoE)+:==! Z5xsvt Gf"_Yz>{8,.ݙ<}|ݫv1C;۽aGm,z,qAEp\)'WX& 5;`u}Bõ&=Z"‚ܕ}YOٱshf^;ĸh<?y;ܽ2lIuLHredRLj 0"=:o\p`ц&h3I`eFaסF _Z1y3I[O]J4iJi;qlOTf L~LcbxfEtRp4s˓>4LSStyԳ)05ΟxT)gV ,4tR5g6i I6Y-,LuyɃ!`_Y [Rf:^d`nDɛNzI{5u>5`AIHТatNw_9k"XC'9&%>@eΓq0PX M:n? uw˼" Em%2́Q~sJDcRXuK bPY޸$w1_7ڰpRUiwuPgzoErQudpFJ%Ea=}c d7/#;ol![A7װ&C-9󐇨>gV06>=7~L  [8Yg ^~tID+wcyn}ٓ/OkH4Hn.xJ3#1^[U~7@"sDlB\9_c $ơ0UU~DWԄ=4oKuvZG:Y<å0W#NJ +O3|.9*C(9No+W|8j"t^q"h v$oimEun%Yg4xaς sl$֫.?#Yf7r(woqt 17yع̐ur}ÓDmr>Nu΀Ď>V6@iM $I]oH3y`@vbh'շWwS~+6GGCgp"bB*WՈSoNnӫnR0֒QJu7«K6񾌾3րQ|h̡- ;[Z y Wʹܙ\3J%#߆2؏g`چkMH)v|Еؑ^>K:mMJ-hQN)>P`TFP};7J K%ޙ?wO Pc|Gټp :46r?/PZa.xE4TFoS3{cf=gm7dnK5l4~j\nm/vKJƴn7&{a˖ E"r&RJ8LJ~1_4X eb+B.Kqټ$Ë`2uyR'IhLO\C8ĎtϾx : :8h¯ ca,\xI@ a0gβ۠UE?R]&R i ~!xai9'l275LY6*H߭A+4BT{lE\ۂBd~Op1Qa/(dw3??.46GƩ8_1M;ax)ݖ" .X,xP ?vkPDo\_.h"TmggِwR.`pe[HRԞۍ| RH~fr9X3[ @T!\^UH7_|TP V~z+j%hglykD]/3ݖk moɉSWcͲ0f1jd[{n(p0ŷD{gC'Ion&TI{Y?t/ :tN4=NZtA=OPd8]sdDi&=Tf'KQ67 E}eZ<\F 9cy2`X4qV(rloh]mّqBuux涒jk@Ӡ±L'P0&+ fNeZ8RӖl*E]bzv-AÅgl("3/4VVe^^%Eчƒϼ!]n{p`!GZB(LΖ4 ^#TNA%-gJS3y20K衘3{ख़t$i(b:_x e' Ztݰ.Ʒ(QhǏl;Fg&mcB*!sm߅oWV}ωi^ pC(`f%@< &K,eo ɼXY%cǰ_ HʼQ DEun-J vvij02(n _ 6[5/`UEN{DZ4A9\0{qNHvf+wMJ0;6|ƿ3{VKG4^OG}v!A;YŨS;PּHn/ZdC(%JPZTaauNto/mSk?EUKjy.D~P$ dӛplO]]UNޠbŧ3\^!X-3V \X<{dox{U|c Ǝ"{ \ aȺ|Uog5sўW=44>Yufz0vM>7L7&۠Y7Q;6~\%-(t!{b$B֐n} l`iS8u/b/20Ue3Tv):F& ܿbFKDrj)hTŐ92=ʛkW`0;eO4l g-ӆ^*ӽ)eߚͥg8VBO#|Pg*$)fPN2,潝ؒQL %|$3g7)>]dỎm5s3ATGRX{~a]b!-?mІBwYmw4=@u%-NhmaafBCʢќ*?z`E%i_D!+*Y*Ue!QJK[@u! 17m(*]ƀm\d>E?R VYݳnah kM7)(`JCfo/MEٷ\ 7Zc?hlFN#[ {.5 ȯEq4=ΒP]rjdmR 8.vc%U6 Yph:>}=&2rwM檂 .O3-hU,J a5S מP%-vM2(|0~EO@#Ϩџ %+n?=01_,OkL $m_K];oVso: .?D\Qܢ .0แ3 rle^"_G#m#ٿC&#T0h>6DVr9_LZL?eI.&LZ;(6,Kh*hX9hWԲdp{i|ʋ9Y 2Jrϯb4$E "1 cqn|;@^qijZ>j:".452oߝpuY/d[3y\PJ5Kռ* Îܬ=nj5ɒyz& {{#=рC=hA %e~uYYӄ]=bیvz{*}#X>c"D)w/6HJo6Eʺ!Y>\C߼0wnRBw$Q cy[>1'<Gt(,*#~dpߚQu9FmzFh1Q,>' iSE" +0nv\ A-Y`b+Z.6jJEo\Vwq;B/)+Ü`b!sGl;7Eۂb#Zxz`AQf#f'_2sBs sEZXcx[-7Wӹk#(iL9׉ "eWX^d]LɆ]CR:v?G91?T1ʗN1֙£+s.>G'")ҫ1M V?a#amXHH3NU֭Na]Cl fUOo ,V#BlBd!LڭSiTF=gLc F {d\B!;1oSd\Ip BsVIJؐ9G3Z 9 RgjRq[AD<1᷶ R%fuɳnzBg"2ma{ Y=LY182ٯ# ]Ť4Gd[ ;tâ=g1Gjmc 5~nl3UEt 7@\<UA8EM 1EGx .r:@p{Uw`0\4Q&0j rnṂImb޳Vs53cڂ;rC)XӪuуOv#fCQ] EIRds*Gŧ﨨78O[٬tԧ~{!-97E"k0[B9Gz4qw޼$Q%0e֣ׄARI+[o2xl\ ̪:_svHSPsɭ<{$Zx*p^;Rdޓ|q%4^Յh(+w* MuPt$xGIU&O^ayGLJ>NKsPF[FQψ%IJR >}}FX^ZQ^S#3Sۮ5GhD>0mvzdΤݹo)v!٩qe_{4Ϧ'^sW:cӛK3zv T~xDBbKN3 y/_[O88wW#~.7PnEMW |b[^_홼KCzZeI`ߥ<^41YwZm JTĺQY~ qR} ,rcvvO!Z0 g*duBy\ gU)Pu:8ނcjPag QwܩBK){5`1ȡEy;La.xb~ɶ˿a',gjJȤ :j5!MV -9ͰrD7ҏܷILhc]%XiցCurX5]]߲O9,`Xf|Doҗt6b6b3R֠^0D])˔LAqLH%QB!f}zZL`^#7ZDx;x=(CRZסy_Vaw}Z@d{5;L ?~y3ҁkm'(-ڡ@0Gv_,`%*yfgṳF{<4 gre[oX ĩyyk?W$^ c/}U7*9t][e0xlʐ=H Ƅu6 l%MI0n~hcKc;e44U|>) 3X>2a #fJkܙUp(T 3 huSW]5]v%9#0k4L%iwzW4~ ]xa\ɘl`Cd"}mC:9'b@kg:=\9PbP]Sx1WU2F&t'#= `7i ~# jN*X0v,, HŚݣߛ"VI"MqCl)(Z\5`eZ凈g .Xa])'B++5/1.ǶV9%"kIDG"bn]I'EWU6dqvFW타.XMiq3si¹̄Wk"5nY^SŴmqGuhXˬ6ۥILq <4`f-L={&fmϧ~%Mchjt3;|wV!xP&HzP1O^RI6}NBi^hrɭ$GJ+ʕB'"|!91+=A$;JcS>i *s]4eW|ՅI=nyiԜl,ydՑveʄ;Y0uwJ)]LeZm3uIjU+8 uulЯXf5Mo9U0^TB|:Ļ)kmi 56bN[ը&^#64M80b*M^Lk| )%KE фQN$~w '>B=BT6,J,]J͎Whqlic+N#Բ)NCyksHس%q{3O@m[Ƹݏkc?px.Lt A .}|71%Y< ]ܥ&9 y ;#U}A'ʦ!&!, ~2<CCl9>vVAeײI!m̾ǃvq: ٟ ţٍ"gi 0Q]#; 9&sb,;Uif9ڠ[s.|8b~OYA{CU0꠴3ٻ2S YDVtpa, Cs4{[e \B~汄3rY$5q8Q~b(*ᧅ7^(JvȤ8z k lM2 #Te7"J=t-P8|, M|dhmp.H]i < MB*nI^Rb`ۑ6nX+ gl`x1'lzEJ` nFgZD͐|Fn8A9I t)d$ -鴺|POGR8z]'FBJoR&hri4>FP?M[_C zDeb;w8 a倒@11.]^wƼ(D>Sj"E\' Z^wL}U$R]ަ~)X(Lqn~K  HAN߂'GO$g":NKʿ{I3k\qdoW9KN`$T_+1"=G\$"=̗Fx\\߽.&ШkJ-#$ly;g12v2is@^eNyϫ(lC21M4}9MUT>X0ECqZu9!Ν<5"$AZ݉]HZO(~ |o#ZU9Nk!i/P؁h'3WObk,8)@m3Vt)P7tp48Oz۔qL.^> V xѠ\l݆nEeDq`sHA_bt?;\k$c;GX[V!&]F6yTR_*+B&2Ȩ!"8㪣?G3}C.r;6Ab,uD)HW(X٧5gc_((V"m%+kKe> יFYTX,b~qթ+l>$<P%pv =$N'XL B^?^:iB%~V;^Cl?XnX 2OI`py)( 8Ll$" S=:{-S}~O:On (o;36(E05;#ȗ'u-=> nԝwrD6AɦϢ.տP}R3&AD8Zqg¨'%J}Mu+9b(5DhF:q@J~OI2s*+sא="k³J@#Tśqk(iHWl7/*kDϭ6LuO/-!_#{<|*Q0>LιsOϮ]j&Zʰxe@M;Gzmd۫7uq.pA,yqJ,mAlfVt]nw 9j&_'T4/s1/w>k4yRv1I|+ &)Q~ҏ)/%O4 ? aǝYIfikz pju8Wk<$-v+`?2nR"44\'-p*%e:Qde_ՈHS%%'* 7?$SKksU|gz:/>쀘K:05KԚrC{}BşCpTt7ݮb!*MyDKO5f3^2b %,1Pzs)6|<Ya2v(R.(X.D?}8ra=bN1:qy|~M`9nToӸyX'2 {ݨuIB͞/f!@3TLDԇċV31T:Ԋ68 UmDyb9!;W )5sFo Sth/N"^e*,eƑ~/# fU[hC}8"cmY\@It9:uix:R5Du(lb2݇H\֙q`8PjɌ>e֨IzqdHN YEAydmZT ѦPj=ש{H8>rX|ȵiRA)̩~ף)˳<%1rMÖb2F[L_f TԭQǯ(D?\ϵ<:HRp NJVCRtNt̡C7E458Zk{J `QsXoCuia_gk <&^؎D󧷭9q!oWq"@@m!i0 -kI-M5DG-S%n2s@H^n&hARA(NP9Y@̻>GIQV\4fdZE~&< iz_N)d)4V~>0rOT~y9JT:W{3'h!i11*96>~?Shz\ pC#gQ]{ˆIM\ J8 kf6A>MZ$wsuwNhQ쟯8WFY]Nț뵴6z9t2/bDŵ7rlXs8ɾKv{l8O^scerBJ?c3n e֚jDv ]3gy2]-袼ڼl͍n˞ ՝>k$&9^aš -L ]0rYt7@LVF,ܽ8nuPסgmv`S0D5 W6Rx i;+qFNΌ0"\{18Z:%h@τo8os, 59Zl>穘GI5Q>>?A0ߜ ?½.(?E[UӒ3l'tz>ho5VگKr}1U|?.qTbUy0r/O*!)1.nYҩe!yEȡxÅm3S 2aEu*zyi@C3sW&Jۗv8޸ĺWMh4Bz &Z- jŽQ&FkS^=mރ DZOJfޭjڭheքxq*2/#]BpR'v∋j?'|Y$8!\?lޱ9-Y-Z咔00Wr)[l-aG>R:vWtVe&ȱL =WMq71¾yVC o܋bjr^M̀B]40 yH?7&t%N9q[3Ι7A="`?zb?v_'MQ.{GFM/̴nAy~"STƽ"c%G.Q#e,チ0di M\ >IKzJ Xp!x2Yldޤ- 3{ ұo2x3'cHgż lB`G"SFCo#8!-98k +:8tLPbpoi`d݇@e!4;esG.]J';LݿPM9ze3bqü:}||NB>"Ҵd##/.4~ nɌjK5XN]ϭ X37ۮުܞz.^n14E_-AqQ.7GC>ò۽~&+=~UP&Z +#Gfq¾sYuc9̍ !RpV2$fF:#?ɋU\=ڻP 嗐8f+7;.1Qb?(ܠK@)_G Qlx>t'?:6u_PClfcv !䃲GI4Uw$4 [j,o"~M^vb91_91UqՎ#>0o)Ʌd%T#"1jrS<4aY5&@Ky$(~z|u8"\+aJanzWA iy-?!"j7"r< wRil~IE|S$]5BjCe$1n7HoR]hB5! |*`2dzV߁B }v:tID dHoۨVTV=&?2x+/aLAm(>EkDJVNOW#"IưNtP!C9\\x E߳e׏rm}Wl#)7^F ա n/2/1{2W+%c;O@M87E8W?M6uo%TPnꑒҲf,}E^{Q|72< ,[D>rBaM_}`eH  ew;d<6*O(!:R.#(vw ?3~>'spMGmZz}6?* ,eigO RsT6=")}%hZS;TDKR<5Ia$IrapQLg;?b}\ePglnH FXhwT1Sp#4)떷s :~'l|mvgqwqZy&#)Q QLAօ@޺A]4ն=Ǜ9*OS)(v0WUՙFTvȻ_9P*BhBi]A{.F\:!05 ~H.TD~auJ5if3zW!7֬H oxtiŭTu bBDžG{q37 55yDPW/^HTfk0 M]0_!(v L?3FAw1)nsb#fH^Յc0kCuY:1 +nI?G/Ne Pz^H Rzn5]tk@ `FX*p질wD1R} wOG]kj-o-;t3-˝VRŒ:NP,Ne< tKUi k]CK+ߡ{D7&]޽ϳe!KYh iioΞNu^j=ZYcjp69#t͝X¤E7L%< OHLvbSÒ` 'w-pSp.SԽX} {Y0zaU`}ۗwNz+kO/tO15o00aޔvg軎 7:n #vӹЕnS[L1D@s>^T8=[k*8,pIIuO$t Z:b~6LۏzĜ+H͡95TZ+f(7"NIQmϝ_.0J88Bww*P)+rO%e?w@ts`Bhô@ hۃ@؃Wsz%K6 tJڨy G٭W8Cѷ1Г $]jϠ,ėQ ?00ER%6zfbs̘3F䀘C eP}o~4e#Ț^M*qԶseڴg5Q^{QB 8-Y8=W+Lm1 B&⎟1@![ngugÔx4¬h=_7I5>|*ZW.YKqw4U暷 f Y›i^A3+ps)9 ?jӧ%uYS/ ?c~f)O=p揠nY1Ǒ`\?M/^ee-`NPPk4Vv1on{K+pIcop/?;e)`#k)Dp+A{dYXUeUJ_ IةtR%sR䌁/E8FT6;BEWML6.ZnzB4?oXxuBFeQ<$#tisE,è!0]Vpԝ N{R3!t/XbEEIr}5>ux)"s1 ՜F0{9PQw-mxLc dg6cϊQYw@T%KyN:m DG(R9 F)\-\*yr.4q3239}ߌ D{!b_.ݤbG@\E 7֪D[LIR]ZUS !6$lp)S\2|vDfט(c,jZ3S#q1V'퓇hhYxU行 d IKf&<*6\@K.s ,[e)jݺn}(Zcxu^xT1/]f_QofovL?,gkzW-x+-[ $Ka&,^eXRgmjT4xViݿECѲRn%X3Gk*NA -jměo1µyXoxᙽhP $BC+ׇtb(,?t0vl{:PLxQ7x]j0I )wb4_fԀ߷gZ*UF굢*_Ʈ7m ޏ)ƱɤJ{y6 ca#}P1W*0pPgSWy)T٠eC&iv=!1W^!U?߰$u$\Km֎۔ljٿNq6(c֔]6.y;Ԉ,Dy8dCR_甤cjTJwq^-9_T?^Lٺhb}cjZ_+6cttּrOU`or2BY|H/Mrć3 ;]aOQηi{g:12:'kp6ma h [Dh٭1HLW_η_;lACĢ`aHĽXe:爪],jaԿQ>R$b ,71&&nų͸#`[w^׈uTv>qvmv^Ф0ɱ=`pi[RĢ`&S>`O[?6LeQ{lXhg UPnB، D9,C~Ye=wPqqq!-ir2[˽SV_"&gv%U'C3s&IeL8&i0)h ʸ.t/G7բ' =vT5v>}Mk=M8*%9̰^]eQ-BWCm };ϙ"ؾSǁ"@GFo<]P3O+ֳ y쨷9^P}ԑEJϏ FYG .f,[euUlWM~p #4*lA aiAF74,~!H;Ж'C_\5ӭc,Bi xn^` 71M|?'I@bYa2D1힍@+,T.Wᆘ_Rolx'.$/xμ5e*շyY}H[sĈv҅zh'rw\^gl`0D='~{RF9_,_LlHkkҰDjDP>=.?Vj8cI J8TɖS\u pD\g3c}3GbZ;>X_|Ekgn9膰*4[Um^*H~DWh(juf ~֫U}_oo;6X `j4V+|2::8w 9y~DcI6I)E9)b޳ 1m}CS nejJdz)'ذZ-@-Fν!f ڦ_ BEg;[(6<x1\Mp`L 3mn?)-T:~qe?6qZ `a~=C%hOE'f)tE)2Q\}~^\$Lrv`|UpbeR.# dEH}t%~7ρɺu{ %Rtֲ&')Et|+=|xV>+7[odspXCC9, }32 >{VFTf兕s7BZI7q|1pRr6;yY#vbvog=~Sc7l-f[9[fUzf-X8pJ-4Ҕu4|, e:Df<ۙ5z*Naz&GEfS ~+ȇ'GkOO-o\~y &+`ҩW&{$ CN~Q/ޡub@gTu-jWsi,ޠ .~G2/vKJs BU 6~B^م?NG Fa+w5B675ѓ+jLC2Og[:\ [nn9(sWp['=SN1;䬾Q(ET-A{d 4!*Jȍ @}:^.6u}CT#gU~ -M ޖ!Z~dד+ ^vl>&Zĕ768[c<UvޗuEvtBM'yv/DAgtt7N.4 \춨:|axLRʇ =ت ̟Uo(ys @"miҽSɚG6.I۪J{aEݯyU*,ZTTiYF1^*tMQjsOZ3cZxӦ<=i-ab+7O؀)_ HH7T]*(>Ħ;+/d9^βRoH~~'@ty^šLK_M N.2Kj]Y0cwѐr`qFoc61/II /'W|ɱKK:V'nqɕČbt. D?āo¡sE@l'wAs!ÑO;)#/Pb+-wSy/N}>Dc6 |0)Ty0np,W8eB1'Ҕ`Ƭ,`S\4?sdA1Fh\`EauaXoBv̰9҉U<5Tc1-X;sxO >[aM.eu7YE5"82?= Yx}FU7wމin{C;l^XS9aʹzs^ݻv[Hv)IK\A}6ث*?V1GZ[¬_ 'q d#O }oB?@q>3ʖcMo 5sL@E)G9WbF蒔KbySn؟'g)hQ{gTڤ =ЌBOJ".^ܢ$dk-N`RW&dA ̗h :7-hNn:xJdSC6}1oa(^JF ߹C3[FN/ /tܰs:cۚo8;w}S-8Vݪ8>Z>|,.YTѱζ#3 ;L"@#A& %$u'4|,$NJ}S$ng1=[ Gy Cxt?egRÜ؜ }zV t9|)<" zD$_si)qOb3O^٭E%sѐZGs㎫ j$I{leDѷѝ爿kј⢤$sn +@jK1PJa;"/Dž~sD׀Ra潛P!'b[_Zmjc/B3vbob!*2ҚZ>rFX !lrI+k]oV6Gi(,z?nQay.6YV={"#'RU& ou4Nk0B8(&Z0tp 'G•:3q-sb#Wખ_wyd k.FCQwcsL -8[$Ce7jJxS[o"qr#KS`'" -F/8 <[Ѻ 0dPBjD`gSWd/fg)äIl6>1N]!3[@T|C8][|_^ι5oҲPNl\/ ۓyY#ǏP,1ski A.rt)x;klg;A^~)o2b6~mm((^p{o'6(zcW; .J'*hi詒H~[w8הyU,dّ }Q^\sȥJS*Ck랗<){."X_(804K̀Z,2ˋ$dLNCH 0Mb?cq: {@uan P !3\":ǥ{'DD/-ɵQnyf M{{(cAsŧ 3=ELPD +Pܐ+Z=*3&P(XrY -q`u F>٨[TjQ^S;pZ&0$^ ȈϣH[Dw>~דzw T;vGܦ p5+RikH+JD"zQ|f륖U[ka{7p}W ^E Z|窔ɚkvSҕQWTģ2=!?TP1-4% &W Out${JO c pWfX `s[몪P{$Q+inl9$HJ Rʼn`ak[5yHf lj)K!G^*TgJ6ޟ\1V}ۯ rMTsCeb7OH@Ed{!37r ە9Nm"yO zf٠TV \:썂Bu4@LXa٬4p2|Ԡ>":J^2n{ڽ': 60A=䕲4"hSKaq=NGunL$ɇldV(?407@qC{+ KFGk-ɶ׭6Nx/@=^Hј'%g#[7EǺBi|;MK ɳ ̊ _kbuy܁2@G) ݁^5ӭoHqb?zP Rc{$m2ҙB IY\IZG{g-l5Vv1+?se9;zh)Ka 0? ί)>knNԱ#»NI- I.)S;y2o{8Dymg/B-{G /+} $fq1SDqWӗi%eԊ(M(!Dw޶} ticYc~|~͍.8WYq4Q1=Z̀戅5!ѹf\> FI0^B .wRĦ4Jϧ ՃY*-,A򠀃pu5t[4RD@OUNN6y Hs${˶^㋋m.ͳͭ#g*pw!xܴOQΎ Ey߳ǂ HBӪ0A Q16\BlP1[b#AH#AIE)ʐ!sĤdyr8pV׹0>k_;`q"+>Sdl|KJ&0 Rgg.5/P3,J1E—Cc- }2O *d',)8Њ|@r1kZ>w^ň\% 5gf#>h'݋e̯f:|[sv[\QemXƏkT`c7!=\ 9V-$߱1)}<Gb~i:+V̽"wCM :B*_|A4vU&|ߴ[»qygG <弑,4ڷẔ7%i35?j~]@GS/ ^gNYĢ^:'W(yW)S^x]G[uS;ݲ rzH|~7DAmf1=sIo\2Kޚ4Oql L <~O& :iVpWwVCV;j ;Z&3HO#g@Q6^IGgX˵1,⺘d* 5$!QB"=cm~ %`ymE;>v M pA廥 &w'՗tDjeƛ7~ofa{;Wm#yzitKC&eZȏWJxqS.Q-O]=@/xcm#֌ʲe`2&3@of, C%-iCK̨nՄ+r$lߞ,yw4(e(dR@̓eqvUNEԔI y$w Ygn£--V xawxU*bY.$ tҤ;Z'+ r)kFrP Z :<ߎl9">s#btEcu'gILBjn|֠#SR]~WNBט'#BKp5WZ&A2-o^p 0eHuQb_FM1.JoY8t@f))x{D5- YZ