+
    Z4iÂ…  ã                   ó|  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIt^ RIHt ^ RIHtHt ^ RIHt ^ RIt^ RIHt ^ RIHt ^ R	IHtHtHtHtHtHtHt ^ R
IHt Rt ! R R]P@                  4      t! ! R R]P@                  4      t" ! R R]P@                  4      t# ! R R]P@                  4      t$ ! R R]P@                  4      t% ! R R]P@                  4      t& ! R R]P@                  4      t' ! R R]'4      t( ! R R]'4      t) ! R R]P@                  4      t* ! R  R!]P@                  4      t+R# )"zTests for the Launchpad class.)ÚcontextmanagerN)Úpatch)ÚServiceRoot)ÚAccessTokenÚCredentials)Úuris)Ú	Launchpad)ÚUnencryptedFileCredentialStore)Úassert_keyring_not_importedÚBadSaveKeyringÚfake_keyringÚFauxSocketModuleÚInMemoryKeyringÚNoNetworkAuthorizationEngineÚNoNetworkLaunchpad)ÚKeyringCredentialStoreúhttp://api.example.com/c                   ó*   a € ] tR t^9t o RtR tRtV tR# )ÚTestResourceTypeClassesz<launchpadlib must know about restfulclient's resource types.c                ó¢   € \         P                  P                  4        F,  w  rV P                  \        P                  V,          V4       K.  	  R # ©N)r   ÚRESOURCE_TYPE_CLASSESÚitemsÚassertEqualr   )ÚselfÚnameÚclss   &  ÚC/usr/lib/python3/dist-packages/launchpadlib/tests/test_launchpad.pyÚtest_resource_typesÚ+TestResourceTypeClasses.test_resource_types<   s;   € ô %×:Ñ:×@Ñ@ÖB‰IˆDØ×ÑœY×<Ñ<¸TÕBÀCÖHó Có    © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r   r   9   s   ø‡ € ÙF÷Ið Ir    r   c                   óp   a € ] tR t^Ct o RtR t]R 4       tR tR t	R t
R tR tR	 tR
 tR tR tRtV tR# )ÚTestNameLookupsz0Test the utility functions in the 'uris' module.c                ó*   € \        . RO4      V n        R# )Ú
productionN)r.   Ú	qastagingÚstagingÚdogfoodÚdevÚtest_devÚedge)ÚsortedÚaliases©r   s   &r   ÚsetUpÚTestNameLookups.setUpF   s   € Üòó

ˆŽr    c              #  ó€  "  € \         P                  ! R R7      ;_uu_ 4       p\         P                  ! R4       Rx € V P                  \	        V4      ^4       Vw  pV P                  \        VP                  \        4      4       V P                  R\        V4      4       RRR4       R#   + '       g   i     R# ; i5i)T©ÚrecordÚalwaysNzno longer exists)ÚwarningsÚcatch_warningsÚsimplefilterr   ÚlenÚ
assertTrueÚ
issubclassÚcategoryÚDeprecationWarningÚassertInÚstr)r   ÚcaughtÚwarnings   &  r   Úedge_deprecation_errorÚ&TestNameLookups.edge_deprecation_errorS   s�   é € ô ×$Ò$¨D×1Õ1°VÜ×!Ò! (Ô+Ûà×ÑœS ›[¨!Ô,Ø‰JˆWØ�O‰OœJ w×'7Ñ'7Ô9KÓLÔMØ�M‰MÐ,¬c°'«lÔ;÷ 2×1×1Ò1üs   ‚ B>¢A>B*Â 
B>Â*B;	Â5	B>c                ó
  € V P                  \        \        P                  P	                  4       4      V P
                  4       V P                  \        \        P                  P	                  4       4      V P
                  4       R # r   )r   r5   r   Úservice_rootsÚkeysr6   Ú	web_rootsr7   s   &r   Útest_short_namesÚ TestNameLookups.test_short_names`   sP   € à×Ñœ¤× 2Ñ 2× 7Ñ 7Ó 9Ó:¸D¿L¹LÔIØ×Ñœ¤§¡× 3Ñ 3Ó 5Ó6¸¿¹ÖEr    c                óä   € V P                  4       ;_uu_ 4        V P                  \        P                  ! R 4      \        P                  ! R4      4       RRR4       R#   + '       g   i     R# ; i©r4   r.   N©rJ   r   r   Úlookup_service_rootr7   s   &r   Ú$test_edge_service_root_is_productionÚ4TestNameLookups.test_edge_service_root_is_productione   sL   € ð ×(Ñ(×*Õ*Ø×ÑÜ×(Ò(¨Ó0Ü×(Ò(¨Ó6ô÷ +×*×*Ò*úó   ™;AÁA/	c                óä   € V P                  4       ;_uu_ 4        V P                  \        P                  ! R 4      \        P                  ! R4      4       RRR4       R#   + '       g   i     R# ; irS   ©rJ   r   r   Úlookup_web_rootr7   s   &r   Ú test_edge_web_root_is_productionÚ0TestNameLookups.test_edge_web_root_is_productionn   sL   € ð ×(Ñ(×*Õ*Ø×ÑÜ×$Ò$ VÓ,Ü×$Ò$ \Ó2ô÷ +×*×*Ò*úrX   c                ó   € V P                  4       ;_uu_ 4        V P                  \        P                  ! \        P                  4      \        P                  ! R 4      4       RRR4       R#   + '       g   i     R# ; i©r.   N©rJ   r   r   rU   ÚEDGE_SERVICE_ROOTr7   s   &r   Ú-test_edge_service_root_url_becomes_productionÚ=TestNameLookups.test_edge_service_root_url_becomes_productionw   óP   € Ø×(Ñ(×*Õ*Ø×ÑÜ×(Ò(¬×)?Ñ)?Ó@Ü×(Ò(¨Ó6ô÷ +×*×*Ò*úó   ™A	A,Á,A=	c                ó   € V P                  4       ;_uu_ 4        V P                  \        P                  ! \        P                  4      \        P                  ! R 4      4       RRR4       R#   + '       g   i     R# ; ir_   )rJ   r   r   r[   ÚEDGE_WEB_ROOTr7   s   &r   Ú)test_edge_web_root_url_becomes_productionÚ9TestNameLookups.test_edge_web_root_url_becomes_production~   sP   € Ø×(Ñ(×*Õ*Ø×ÑÜ×$Ò$¤T×%7Ñ%7Ó8Ü×$Ò$ \Ó2ô÷ +×*×*Ò*úre   c                ó   € V P                  4       ;_uu_ 4        V P                  \        P                  ! \        P                  4      \        P                  ! R 4      4       RRR4       R#   + '       g   i     R# ; ir_   r`   r7   s   &r   Ú/test_top_level_edge_constant_becomes_productionÚ?TestNameLookups.test_top_level_edge_constant_becomes_production…   rd   re   c                óä   € V P                  4       ;_uu_ 4        V P                  \        P                  ! R 4      \        P                  ! R4      4       RRR4       R#   + '       g   i     R# ; i)zhttps://api.edge.launchpad.net/r.   NrT   r7   s   &r   Ú5test_edge_server_equivalent_string_becomes_productionÚETestNameLookups.test_edge_server_equivalent_string_becomes_productionŒ   sK   € Ø×(Ñ(×*Õ*Ø×ÑÜ×(Ò(Ð)JÓKÜ×(Ò(¨Ó6ô÷ +×*×*Ò*úrX   c                óä   € V P                  4       ;_uu_ 4        V P                  \        P                  ! R 4      \        P                  ! R4      4       RRR4       R#   + '       g   i     R# ; i)zhttps://edge.launchpad.net/r.   NrZ   r7   s   &r   Ú9test_edge_web_server_equivalent_string_becomes_productionÚITestNameLookups.test_edge_web_server_equivalent_string_becomes_production“   sK   € Ø×(Ñ(×*Õ*Ø×ÑÜ×$Ò$Ð%BÓCÜ×$Ò$ \Ó2ô÷ +×*×*Ò*úrX   c                óD  € V P                  4       ;_uu_ 4        V P                   F>  pV P                  \        P                  ! V4      \        P
                  V,          4       K@  	  RRR4       V P                  4       ;_uu_ 4        V P                   F>  pV P                  \        P                  ! V4      \        P                  V,          4       K@  	  RRR4       RpV P                  \        P                  ! V4      V4       V P                  \        P                  ! V4      V4       RpV P                  \        \        P                  V4       V P                  \        \        P                  V4       R#   + '       g   i     EL; i  + '       g   i     LÀ; i)z=Ensure that short service names turn into long service names.Nzhttp://some-other-server.comz	not-a-url)
rJ   r6   r   r   rU   rM   r[   rO   ÚassertRaisesÚ
ValueError)r   ÚaliasÚ
other_rootÚ	not_a_urls   &   r   Útest_lookupsÚTestNameLookups.test_lookupsš   s#  € ð
 ×(Ñ(×*Õ*ØŸœ�Ø× Ñ Ü×,Ò,¨UÓ3´T×5GÑ5GÈÕ5Nöñ &÷ +ð ×(Ñ(×*Õ*ØŸœ�Ø× Ñ Ü×(Ò(¨Ó/´·±ÀÕ1Föñ &÷ +ð 4ˆ
Ø×Ñœ×1Ò1°*Ó=¸zÔJØ×Ñœ×-Ò-¨jÓ9¸:ÔFð  ˆ	Ø×Ñœ*¤d×&>Ñ&>À	ÔJØ×Ñœ*¤d×&:Ñ&:¸IÖF÷+ +×*Ð*ú÷ +×*ús   ™AE;ÂAFÅ;F	ÆF	)r6   N)r"   r#   r$   r%   r&   r8   r   rJ   rP   rV   r\   rb   rh   rk   rn   rq   ry   r'   r(   r)   s   @r   r,   r,   C   sV   ø‡ € Ù:ò
ð ñ
<ó ð
<òFò
òòòòòò÷Gð Gr    r,   c                   ó*   a € ] tR t^·t o RtR tRtV tR# )Ú"TestServiceNameWithEmbeddedVersiona  Reject service roots that include the version at the end of the URL.

If the service root is "http://api.launchpad.net/beta/" and the
version is "beta", the launchpadlib constructor will raise an
exception.

This happens with scripts that were written against old versions
of launchpadlib. The alternative is to try to silently fix it (the
fix will eventually break as new versions of the web service are
released) or to go ahead and make a request to
http://api.launchpad.net/beta/beta/, and cause an unhelpful 404
error.
c           
     óø  € R p\         P                  R,          V,           p \        RRRW!R7       \        R4      h  \         d4   pT P                  \        T4      P                  R4      4        Rp?MRp?ii ; iTR,          pT P                  \        \        RRRTTR7       \        P                  p\         P                  R,          T,           R,           pT P                  \        \        RRRTR7       R# )zversion-foor0   N)Úservice_rootÚversionz*Expected a ValueError that was not thrown!zoIt looks like you're using a service root that incorporates the name of the web service version ("version-foo")Ú/©r~   )r   rM   r   ÚAssertionErrorru   rB   rG   Ú
startswithrt   r   ÚDEFAULT_VERSION)r   r   ÚrootÚeÚdefault_versions   &    r   Ú'test_service_name_with_embedded_versionÚJTestServiceNameWithEmbeddedVersion.test_service_name_with_embedded_versionÆ   sô   € ð  ˆÜ×!Ñ! )Õ,¨wÕ6ˆð	OÜ�d˜D $°TÕKô !Ð!MÓNÐNøô ô 	Ø�O‰OÜ�A“×!Ñ!ð&ó÷ñ ûð	úð 	��ˆØ×ÑÜÜØØØØØð 	ô 	
ô -×<Ñ<ˆÜ×!Ñ! )Õ,¨Õ>ÀÕDˆØ×ÑÜœ	 4¨¨tÀ$ð 	ö 	
s   ¢< ¼A:Á)A5Á5A:r!   N)r"   r#   r$   r%   r&   rˆ   r'   r(   r)   s   @r   r|   r|   ·   s   ø‡ € ñ÷&
ð &
r    r|   c                   ó<   a € ] tR t^ït o RtR tR tR tR tRt	V t
R# )Ú#TestRequestTokenAuthorizationEnginez4Tests for the RequestTokenAuthorizationEngine class.c                óD   € V P                  \        \        \        4       R # r   ©rt   ru   r   ÚSERVICE_ROOTr7   s   &r   Útest_app_must_be_identifiedÚ?TestRequestTokenAuthorizationEngine.test_app_must_be_identifiedò   s   € Ø×ÑÜÔ4´lö	
r    c                ó(   € \        \        R R7       R# ©r   ©Úapplication_nameN©r   rŽ   r7   s   &r   Ú$test_application_name_identifies_appÚHTestRequestTokenAuthorizationEngine.test_application_name_identifies_app÷   s   € Ü$¤\ÀF×Kr    c                ó(   € \        \        R R7       R# ©r   ©Úconsumer_nameNr•   r7   s   &r   Ú!test_consumer_name_identifies_appÚETestRequestTokenAuthorizationEngine.test_consumer_name_identifies_appú   s   € Ü$¤\À×Hr    c                óŽ   € V P                  \        \        \        R RR7       V P                  \        \        \        RRR7       R# )Úname1Úname2)r”   r›   r   Nr�   r7   s   &r   Ú#test_conflicting_app_identificationÚGTestRequestTokenAuthorizationEngine.test_conflicting_app_identificationý   sH   € à×ÑÜÜ(ÜØ$Ø!ð 	ô 	
ð 	×ÑÜÜ(ÜØ#Ø ð 	ö 	
r    r!   N)r"   r#   r$   r%   r&   r�   r–   rœ   r¡   r'   r(   r)   s   @r   r‹   r‹   ï   s#   ø‡ € Ù>ò
ò
LòI÷
ð 
r    r‹   c                   ó0   a € ] tR tRt o RtR tR tRtV tR# )Ú%TestLaunchpadLoginWithCredentialsFilei  z9Tests for Launchpad.login_with() with a credentials file.c                óD  € \         P                  ! 4       w  r\        P                  ! R VR7      p\        P
                  ! V4      pV P                  VP                  P                  VP                  P                  P                  4       \        P                  ! V4       R# )únot important)r”   Úcredentials_fileN)ÚtempfileÚmkstempr   Ú
login_withr   Úload_from_pathr   ÚconsumerÚkeyÚcredentialsÚosÚremove)r   ÚignoreÚfilenameÚ	launchpadr®   s   &    r   Útest_filenameÚ3TestLaunchpadLoginWithCredentialsFile.test_filename  sy   € Ü#×+Ò+Ó-ÑˆÜ&×1Ò1Ø,¸xô
ˆ	ô "×0Ò0°Ó:ˆØ×ÑØ× Ñ ×$Ñ$ i×&;Ñ&;×&DÑ&D×&HÑ&Hô	
ô 	�	Š	�(Ör    c                óÄ   € \         P                  ! 4       w  r\        4       pV P                  \        \
        P                  R VVR7       \        P                  ! V4       R# )r¦   )r”   r§   Úcredential_storeN)	r¨   r©   r   rt   ru   r   rª   r¯   r°   )r   r±   r²   Ústores   &   r   Ú+test_cannot_specify_both_filename_and_storeÚQTestLaunchpadLoginWithCredentialsFile.test_cannot_specify_both_filename_and_store#  sQ   € Ü#×+Ò+Ó-ÑˆÜ&Ó(ˆØ×ÑÜÜ×)Ñ)Ø,Ø%Ø"ð 	ô 	
ô 	�	Š	�(Ör    r!   N)	r"   r#   r$   r%   r&   r´   r¹   r'   r(   r)   s   @r   r¤   r¤     s   ø‡ € ÙCò÷
ð 
r    r¤   c                   ó&   a € ] tR tRt o R tRtV tR# )Ú4TestLaunchpadLoginWithCredentialsFileFromEnvVariablei0  c                óê  € \         P                  ! 4       w  rV\        P                  R &   \        P
                  ! RR7      pV P                  VP                  \        4       V P                  VP                  P                  V4       \        P                  ! R 4       \        P                  R  V P                  \        P                  P                  R 4      4       \        P                  ! V4       R# )ÚLP_CREDENTIALS_FILEr¦   r“   N)r¨   r©   r¯   Úenvironr   rª   ÚassertIsInstancer·   r	   r   r²   ÚunsetenvÚassertIsNoneÚgetr°   )r   r±   r²   r³   s   &   r   r´   ÚBTestLaunchpadLoginWithCredentialsFileFromEnvVariable.test_filename4  s±   € Ü#×+Ò+Ó-ÑˆØ,4Œ�
‰
Ð(Ñ)ä&×1Ò1Ø,ô
ˆ	ð 	×ÑØ×&Ñ&Ô(Fô	
ð 	×Ñ˜×3Ñ3×<Ñ<¸hÔGä
�ŠÐ)Ô*Ü�J‰JÐ,Ð-Ø×Ñœ"Ÿ*™*Ÿ.™.Ð)>Ó?Ô@ä
�	Š	�(Ör    r!   N)r"   r#   r$   r%   r´   r'   r(   r)   s   @r   r¼   r¼   0  s   ø‡ € ÷ð r    r¼   c                   ó0   a € ] tR tRt o RtR tR tRtV tR# )ÚKeyringTestiI  z*Base class for tests that use the keyring.c                óT   € \        4        \        4       \        P                  n        R # r   )r
   r   Úlaunchpadlibr®   Úkeyringr7   s   &r   r8   ÚKeyringTest.setUpL  s   € ä#Ô%ô ,;Ó+<Œ× Ñ Ö(r    c                ó&   € \         P                  =R # r   )rÈ   r®   rÉ   r7   s   &r   ÚtearDownÚKeyringTest.tearDownS  s   € ä×$Ñ$Ò,r    r!   N)	r"   r#   r$   r%   r&   r8   rÌ   r'   r(   r)   s   @r   rÆ   rÆ   I  s   ø‡ € Ù4ò=÷-ð -r    rÆ   c                   óÀ   a a€ ] tR tRt oRtV 3R ltV 3R ltR tR tR t	R t
R	 tR
 tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tRtVtV ;t# )ÚTestLaunchpadLoginWithiX  z!Tests for Launchpad.login_with().c                óX   <€ \         SV `  4        \        P                  ! 4       V n        R # r   )Úsuperr8   r¨   ÚmkdtempÚtemp_dir©r   Ú	__class__s   &€r   r8   ÚTestLaunchpadLoginWith.setUp[  s   ø€ Ü‰‰ŒÜ ×(Ò(Ó*ˆŽr    c                ód   <€ \         SV `  4        \        P                  ! V P                  4       R # r   )rÑ   rÌ   ÚshutilÚrmtreerÓ   rÔ   s   &€r   rÌ   ÚTestLaunchpadLoginWith.tearDown_  s   ø€ Ü‰ÑÔÜ�Š�d—m‘mÖ$r    c                óÀ  € \         P                  P                  V P                  R 4      p\        P
                  ! R\        VR7       V P                  \         P                  P                  V4      4       \         P                  P                  VR4      pV P                  \         P                  P                  V4      4       V P                  \         P                  P                  \         P                  P                  VR4      4      4       \         P                  P                  VR4      pV P                  \         P                  P                  V4      4       R# )rÈ   r¦   ©r~   Úlaunchpadlib_dirúapi.example.comÚcacher®   N)
r¯   ÚpathÚjoinrÓ   r   rª   rŽ   rB   ÚisdirÚassertFalse)r   rÝ   Úservice_pathÚcredentials_paths   &   r   Útest_dirs_createdÚ(TestLaunchpadLoginWith.test_dirs_createdc  sÜ   € ô Ÿ7™7Ÿ<™<¨¯©°~ÓFÐÜ×%Ò%ØÜ%Ø-õ	
ð 	�‰œŸ™Ÿ™Ð&6Ó7Ô8ä—w‘w—|‘|Ð$4Ð6GÓHˆØ�‰œŸ™Ÿ™ lÓ3Ô4ð 	�‰œŸ™Ÿ™¤b§g¡g§l¡l°<ÀÓ&IÓJÔKô Ÿ7™7Ÿ<™<¨°mÓDÐØ×ÑœŸ™Ÿ™Ð'7Ó8Ö9r    c                óJ  € \         P                  P                  V P                  R 4      p\         P                  ! V4       \         P
                  ! VR4       V P                  \         P                  P                  V4      4       \         P                  ! V4      p\        P                  ! VP                  4      pV P                  V\        P                  \        P                  ,          \        P                  ,          4       \        P                   ! R\"        VR7       \         P                  ! V4      p\        P                  ! VP                  4      pV P%                  V\        P                  \        P                  ,          \        P                  ,          4       R# )rÈ   ií  r¦   rÜ   N)r¯   rà   rá   rÓ   ÚmkdirÚchmodrB   râ   ÚstatÚS_IMODEÚst_modeÚassertNotEqualÚS_IWRITEÚS_IREADÚS_IEXECr   rª   rŽ   r   ©r   rÝ   ÚstatinfoÚmodes   &   r   Ú'test_dirs_created_are_changed_to_secureÚ>TestLaunchpadLoginWith.test_dirs_created_are_changed_to_securez  sü   € ÜŸ7™7Ÿ<™<¨¯©°~ÓFÐä
�ŠÐ!Ô"Ü
�ŠÐ! 5Ô)Ø�‰œŸ™Ÿ™Ð&6Ó7Ô8Ü—7’7Ð+Ó,ˆÜ�|Š|˜H×,Ñ,Ó-ˆØ×Ñ˜D¤$§-¡-´$·,±,Õ">ÄÇÁÕ"MÔNÜ×%Ò%ØÜ%Ø-õ	
ô —7’7Ð+Ó,ˆÜ�|Š|˜H×,Ñ,Ó-ˆØ×Ñ˜œtŸ}™}¬t¯|©|Õ;¼d¿l¹lÕJÖKr    c                óð  € \         P                  P                  V P                  R 4      p\        P
                  ! R\        VR7       V P                  \         P                  P                  V4      4       \         P                  ! V4      p\        P                  ! VP                  4      pV P                  V\        P                  \        P                  ,          \        P                  ,          4       R# )rÈ   r¦   rÜ   N)r¯   rà   rá   rÓ   r   rª   rŽ   rB   râ   rë   rì   rí   r   rï   rð   rñ   rò   s   &   r   Útest_dirs_created_are_secureÚ3TestLaunchpadLoginWith.test_dirs_created_are_secure�  s—   € ÜŸ7™7Ÿ<™<¨¯©°~ÓFÐÜ×%Ò%ØÜ%Ø-õ	
ð
 	�‰œŸ™Ÿ™Ð&6Ó7Ô8ä—7’7Ð+Ó,ˆÜ�|Š|˜H×,Ñ,Ó-ˆØ×Ñ˜œtŸ}™}¬t¯|©|Õ;¼d¿l¹lÕJÖKr    c                ó^  € \         P                  P                  V P                  R 4      p\        P
                  ! R\        VRR7      pV P                  VP                  R,          R4       \        P
                  ! R\        VRR7      pV P                  VP                  R,          R4       R# )rÈ   r¦   Úfoo)r~   rÝ   r   r   ÚbarN)	r¯   rà   rá   rÓ   r   rª   rŽ   r   Úpassed_in_args©r   rÝ   r³   s   &  r   Útest_version_is_propagatedÚ1TestLaunchpadLoginWith.test_version_is_propagatedš  s‘   € ô Ÿ7™7Ÿ<™<¨¯©°~ÓFÐÜ&×1Ò1ØÜ%Ø-Øô	
ˆ	ð 	×Ñ˜×1Ñ1°)Õ<¸eÔDô '×1Ò1ØÜ%Ø-Øô	
ˆ	ð 	×Ñ˜×1Ñ1°)Õ<¸eÖDr    c                óŽ  € \         P                  P                  V P                  R 4      p\        P
                  ! R\        VR7      pV P                  VP                  P                  P                  R4       \        P
                  ! R\        VR7      pV P                  VP                  P                  P                  R4       R# )rÈ   zvery importantrÜ   N)r¯   rà   rá   rÓ   r   rª   rŽ   r   r®   r¬   r”   rþ   s   &  r   Ú#test_application_name_is_propagatedÚ:TestLaunchpadLoginWith.test_application_name_is_propagated³  s¡   € ô
 Ÿ7™7Ÿ<™<¨¯©°~ÓFÐÜ&×1Ò1ØÜ%Ø-ô
ˆ	ð
 	×ÑØ×!Ñ!×*Ñ*×;Ñ;Ð=Mô	
ô '×1Ò1ØÜ%Ø-ô
ˆ	ð
 	×ÑØ×!Ñ!×*Ñ*×;Ñ;Ð=Mö	
r    c                óÄ   € \        \        R 4      p\        P                  ! VR7       V P	                  VP
                  ^4       V P	                  VP                  ^4       R# )úapplication name©Úauthorization_engineN)r   rŽ   r   rª   r   Úrequest_tokens_obtainedÚaccess_tokens_obtained©r   Úengines   & r   Ú'test_authorization_engine_is_propagatedÚ>TestLaunchpadLoginWith.test_authorization_engine_is_propagatedÐ  sK   € ô .¬lÐ<NÓOˆÜ×%Ò%¸6ÕBØ×Ñ˜×7Ñ7¸Ô;Ø×Ñ˜×6Ñ6¸Ö:r    c                óN   € V P                  \        \        P                  4       R # r   )rt   ru   r   rª   r7   s   &r   Ú)test_login_with_must_identify_applicationÚ@TestLaunchpadLoginWith.test_login_with_must_identify_applicationÙ  s   € ð 	×Ñœ*Ô&8×&CÑ&CÖDr    c                ó4   € \         P                  ! R R7       R# r’   ©r   rª   r7   s   &r   r–   Ú;TestLaunchpadLoginWith.test_application_name_identifies_appÞ  s   € ô 	×%Ò%°v×>r    c                ó4   € \         P                  ! R R7       R# r™   r  r7   s   &r   rœ   Ú8TestLaunchpadLoginWith.test_consumer_name_identifies_appã  s   € ô 	×%Ò%°F×;r    c                ót   € \        \        R4      pV P                  \        \        P
                  RVR7       R# )ú;Catch an attempt to specify inconsistent application_names.zapplication name1zapplication name2r  N©r   rŽ   rt   ru   r   rª   r
  s   & r   Ú+test_inconsistent_application_name_rejectedÚBTestLaunchpadLoginWith.test_inconsistent_application_name_rejectedè  s9   € ä-ÜÐ-ó
ˆð 	×ÑÜÜ×)Ñ)ØØ!'ð	 	ö 	
r    c                óx   € \        \        RRR7      pV P                  \        \        P
                  RVR7       R# )r  NÚconsumer_name1rš   Úconsumer_name2r  r  r
  s   & r   Ú(test_inconsistent_consumer_name_rejectedÚ?TestLaunchpadLoginWith.test_inconsistent_consumer_name_rejectedô  s;   € ä-Ü˜$Ð.>ô
ˆð 	×ÑÜÜ×)Ñ)ØØ!'ð	 	ö 	
r    c           	     ó€   € \        \        RR.R7      pV P                  \        \        P
                  RRR.VR7       R# )z=Catch an attempt to specify inconsistent allow_access_levels.r¬   ÚFOO©r›   Úallow_access_levelsNÚBAR)r›   r#  r  r  r
  s   & r   Ú.test_inconsistent_allow_access_levels_rejectedÚETestLaunchpadLoginWith.test_inconsistent_allow_access_levels_rejected  sD   € ä-Ü¨
ÈÈô
ˆð 	×ÑÜÜ×)Ñ)ØØ$Ø!& Ø!'ð 	ö 	
r    c                óz   € R  p\        VR7      pR pV P                  \        \        P                  RVVR7       R# )c                  ó   € R # r   r!   r!   r    r   Ú	callback1ÚRTestLaunchpadLoginWith.test_inconsistent_credential_save_failed.<locals>.callback1  ó   € Ùr    )Úcredential_save_failedc                  ó   € R # r   r!   r!   r    r   Ú	callback2ÚRTestLaunchpadLoginWith.test_inconsistent_credential_save_failed.<locals>.callback2  r+  r    úapp name)r·   r,  N)r   rt   ru   r   rª   )r   r)  r¸   r.  s   &   r   Ú(test_inconsistent_credential_save_failedÚ?TestLaunchpadLoginWith.test_inconsistent_credential_save_failed  sB   € ò	ô '¸iÔHˆò	ð 	×ÑÜÜ×)Ñ)ØØ"Ø#,ð 	ö 	
r    c                óF  € \         P                  ! R R.R7      pV P                  VP                  P                  P
                  R 4       V P                  VP                  P                  P                  R4       V P                  VP                  P                  R.4       R# )r¬   r!  r"  N)	r   rª   r   r®   r¬   r­   r”   r  r#  ©r   r³   s   & r   Útest_non_desktop_integrationÚ3TestLaunchpadLoginWith.test_non_desktop_integration#  s‚   € ô '×1Ò1Ø$¸5¸'ô
ˆ	ð 	×Ñ˜×.Ñ.×7Ñ7×;Ñ;¸ZÔHØ×Ñ˜×.Ñ.×7Ñ7×HÑHÈ$ÔOØ×ÑØ×*Ñ*×>Ñ>ÀÀö	
r    c                ó†   € \         P                  ! R R.R7      pV P                  VP                  P                  R.4       R# )r  r!  )r#  ÚDESKTOP_INTEGRATIONN)r   rª   r   r  r#  r4  s   & r   Ú<test_desktop_integration_doesnt_happen_without_consumer_nameÚSTestLaunchpadLoginWith.test_desktop_integration_doesnt_happen_without_consumer_name0  s@   € ô
 '×1Ò1Ø°U°Gô
ˆ	ð 	×ÑØ×*Ñ*×>Ñ>Ø"Ð#ö	
r    c                óx  € \        4       p\        4       p\        P                  ! R V P                  \        VVR7      pV P                  VP                  P                  P                  \        P                  4       V P                  VP                  P                  P                  R 4       V P                  VP                  P                  R.4       \        \        \         P"                  P%                  V P                  RR4      VV\        P&                  R7      pV P                  VP(                  V4       R# )r0  )rÝ   r~   ÚtimeoutÚ
proxy_infor8  rÞ   rß   )r~   rß   r<  r=  r   N)Úobjectr   rª   rÓ   rŽ   r   r®   Úaccess_tokenr­   r   ÚACCESS_TOKEN_KEYr¬   r”   r  r#  Údictr¯   rà   rá   r„   rý   )r   r<  r=  r³   Úexpected_argumentss   &    r   Ú*test_no_credentials_creates_new_credentialÚATestLaunchpadLoginWith.test_no_credentials_creates_new_credential=  sþ   € ä“(ˆÜ“Xˆ
Ü&×1Ò1ØØ!Ÿ]™]Ü%ØØ!ô
ˆ	ð 	×ÑØ×!Ñ!×.Ñ.×2Ñ2Ü(×9Ñ9ô	
ð 	×ÑØ×!Ñ!×*Ñ*×;Ñ;¸Zô	
ð 	×ÑØ×*Ñ*×>Ñ>Ø"Ð#ô	
ô "Ü%Ü—'‘'—,‘,˜tŸ}™}Ð.?ÀÓIØØ!Ü&×6Ñ6ô
Ðð 	×Ñ˜×1Ñ1Ð3EÖFr    c                óÈ  € \         P                  ! RV P                  \        R7      pV P	                  VP
                  P                  P                  R4       V P	                  VP
                  P                  P                  R4       \        P                  P                  V P                  RRR4      pV P                  \        P                  P                  V4      4       R# )z)Test the anonymous login helper function.zanonymous access)rÝ   r~   Ú rÞ   r®   N)r   Úlogin_anonymouslyrÓ   rŽ   r   r®   r?  r­   Úsecretr¯   rà   rá   rã   Úexists)r   r³   rå   s   &  r   Útest_anonymous_loginÚ+TestLaunchpadLoginWith.test_anonymous_login_  s§   € ä&×8Ò8ØØ!Ÿ]™]Ü%ô
ˆ	ð
 	×Ñ˜×.Ñ.×;Ñ;×?Ñ?ÀÔDØ×Ñ˜×.Ñ.×;Ñ;×BÑBÀBÔGô Ÿ7™7Ÿ<™<Ø�M‰MÐ,¨mÐ=Oó
Ðð 	×ÑœŸ™Ÿ™Ð(8Ó9Ö:r    c                ó¢  € \         P                  ! \         P                  P                  V P                  R R4      4       \         P                  P                  V P                  R RR4      p\        RR\        RR4      R7      pVP                  V4       \        4       p\        4       pRp\        P                  ! RV P                  \        VVVR7      p\        \        VVV\         P                  P                  V P                  R R	4      R
7      pVP                  4        F)  w  r‰VP                  V,          p
V P                  W©4       K+  	  R# )rÞ   r®   r0  zconsumer_secret:42zaccess_key:84zaccess_secret:168)Úconsumer_secretr?  rû   )rÝ   r~   r<  r=  r   rß   )r~   r<  r=  r   rß   N)r¯   Úmakedirsrà   rá   rÓ   r   r   Úsave_to_pathr>  r   rª   rŽ   rA  r   rý   r   )r   Úcredentials_file_pathr®   r<  r=  r   r³   rB  r­   ÚexpectedÚactuals   &          r   Ú-test_existing_credentials_arguments_passed_onÚDTestLaunchpadLoginWith.test_existing_credentials_arguments_passed_ono  s  € ô 	�ŠÜ�G‰G�L‰L˜Ÿ™Ð(9¸=ÓIô	
ô !#§¡§¡Ø�M‰MÐ,¨m¸Zó!
Ðô "ØØ0Ü$ _Ð6IÓJô
ˆð
 	× Ñ Ð!6Ô7ä“(ˆÜ“Xˆ
ØˆÜ&×1Ò1ØØ!Ÿ]™]Ü%ØØ!Øô
ˆ	ô "Ü%ØØ!ØÜ—'‘'—,‘,˜tŸ}™}Ð.?ÀÓIô
Ðð 0×5Ñ5Ö7‰MˆCØ×-Ñ-¨cÕ2ˆFØ×Ñ˜VÖ.ó 8r    c           	     ó¸  € \         P                  P                  R 4      pV P                  \         P                  R &   \        P
                  ! R\        R7      pVe   V\         P                  R &   M\         P                  R  VP                  R,          p\         P                  P                  \         P                  P                  VRR4      4      pV P                  V\         P                  P                  V P                  R4      4       V P                  \         P                  P                  \         P                  P                  VRR4      4      4       R# )ÚHOMEr0  r�   Nrß   z..z.launchpadlibrÞ   )r¯   r¿   rÃ   rÓ   r   rª   rŽ   rý   rà   Úabspathrá   r   rB   rI  )r   Úold_homer³   Ú	cache_dirrÝ   s   &    r   Útest_None_launchpadlib_dirÚ1TestLaunchpadLoginWith.test_None_launchpadlib_dir•  sí   € ô —:‘:—>‘> &Ó)ˆØ!Ÿ]™]Œ�
‰
�6ÑÜ&×1Ò1Ø¤\ô
ˆ	ð ÒØ!)ŒB�J‰J�vÒä—
‘
˜6Ð"à×,Ñ,¨WÕ5ˆ	ÜŸ7™7Ÿ?™?¬2¯7©7¯<©<¸	À4ÈÓ+NÓOÐØ×ÑØœbŸg™gŸl™l¨4¯=©=¸/ÓJô	
ð 	�‰Ü�G‰G�N‰NÜ—‘—‘Ð-Ð/@À'ÓJóö	
r    c                ó’  € \         P                  ! R R4      pV P                  VP                  R,          R4       \         P                  ! R \        P
                  R,          4      pV P                  VP                  R,          \        P
                  R,          4       RpV P                  \        \         P                  R R4       R# )r0  r0   r~   z"https://api.staging.launchpad.net/rû   N)r0  zhttps://)r   rª   r   rý   r   rM   rt   ru   r4  s   & r   Útest_short_service_nameÚ.TestLaunchpadLoginWith.test_short_service_name®  s¦   € ä&×1Ò1°*¸iÓHˆ	Ø×ÑØ×$Ñ$ ^Õ4Ø0ô	
ô '×1Ò1Øœ×*Ñ*¨9Õ5ó
ˆ	ð 	×ÑØ×$Ñ$ ^Õ4Ü×Ñ˜yÕ)ô	
ð -ˆ	Ø×ÑÜÔ*×5Ñ5°zÀ5ö	
r    c                ó6   € \         P                  ! R ^R7       R# )r¦   )Úmax_failed_attemptsNr  r7   s   &r   Ú!test_max_failed_attempts_acceptedÚ8TestLaunchpadLoginWith.test_max_failed_attempts_acceptedÇ  s   € ô 	×%Ò% oÈ1×Mr    ©rÓ   )r"   r#   r$   r%   r&   r8   rÌ   ræ   rõ   rø   rÿ   r  r  r  r–   rœ   r  r  r%  r1  r5  r9  rC  rJ  rS  rZ  r]  ra  r'   r(   Ú__classcell__)rÕ   r*   s   @@r   rÏ   rÏ   X  s‰   ù‡ € Ù+õ+õ%ò:ò.Lò&LòEò2
ò:;òEò
?ò
<ò


ò
ò
ò
ò&
ò
ò GòD;ò $/òL
ò2
÷2Nò Nr    rÏ   c                   ó0   a € ] tR tRt o RtR tR tRtV tR# )ÚTestDeprecatedLoginMethodsiÍ  z2Make sure the deprecated login methods still work.c                ó”  € \         P                  ! R R7      ;_uu_ 4       p\         P                  ! R4       \         P                  ! R\        4       \        P
                  ! RRR4       V P                  \        V4      ^4       V P                  V^ ,          P                  \        4       RRR4       R#   + '       g   i     R# ; i)Tr;   r=   r±   r¬   ÚtokenrH  N)
r>   r?   r@   ÚPendingDeprecationWarningr   Úloginr   rA   rD   rE   ©r   rH   s   & r   Útest_login_is_deprecatedÚ3TestDeprecatedLoginMethods.test_login_is_deprecatedÐ  s„   € ä×$Ò$¨D×1Õ1°VÜ×!Ò! (Ô+Ü×!Ò! (Ô,EÔFÜ×$Ò$ Z°¸(ÔCØ×ÑœS ›[¨!Ô,Ø×Ñ˜V A�Y×/Ñ/Ô1CÔD÷ 2×1×1Ò1ús    BB6Â6C	c                óà  € \         P                  ! R R7      ;_uu_ 4       p\         P                  ! R4       \         P                  ! R\        4       \         P                  ! RR4       \
        P                  ! R4       V P                  \        V^ ,          P                  4      R4       V P                  V^ ,          P                  \        4       RRR4       R#   + '       g   i     R# ; i)Tr;   r=   r±   z.*next release of cryptographyr¬   z¬The Launchpad.get_token_and_login() method is deprecated. You should use Launchpad.login_anonymous() for anonymous access and Launchpad.login_with() for all other purposes.N)r>   r?   r@   ri  Úfilterwarningsr   Úget_token_and_loginr   rG   ÚmessagerD   rE   rk  s   & r   Ú&test_get_token_and_login_is_deprecatedÚATestDeprecatedLoginMethods.test_get_token_and_login_is_deprecatedÙ  sª   € ä×$Ò$¨D×1Õ1°VÜ×!Ò! (Ô+Ü×!Ò! (Ô,EÔFÜ×#Ò#ØÐ;ôô ×2Ò2°:Ô>Ø×ÑÜ�F˜1•I×%Ñ%Ó&ðLôð ×Ñ˜V A�Y×/Ñ/Ô1CÔD÷ 2×1×1Ò1ús    B2CÃC-	r!   N)	r"   r#   r$   r%   r&   rl  rr  r'   r(   r)   s   @r   rf  rf  Í  s   ø‡ € Ù<òE÷Eð Er    rf  c                   óò   a € ] tR tRt o R tR t]P                  ! ]R]	! R 4      4      R 4       t
]P                  ! ]R]	! R 4      4      R 4       t]P                  ! ]R]	! R	 4      4      R
 4       tRtV tR# )Ú!TestCredenitialSaveFailedCallbackië  c                ót   € \        4       \        P                  n        \        P
                  ! 4       V n        R # r   ©r   rÈ   r³   Úsocketr¨   rÒ   rÓ   r7   s   &r   r8   Ú'TestCredenitialSaveFailedCallback.setUpï  ó%   € ô )9Ó(:Œ×ÑÔ%Ü ×(Ò(Ó*ˆŽr    c                óx   € \         \        P                  n         \        P                  ! V P
                  4       R # r   ©rx  rÈ   r³   rØ   rÙ   rÓ   r7   s   &r   rÌ   Ú*TestCredenitialSaveFailedCallback.tearDownö  ó    € Ü(.Œ×ÑÔ%Ü�Š�d—m‘mÖ$r    Ú_is_sudoc                 ó   € R # ©Fr!   r!   r    r   Ú<lambda>Ú*TestCredenitialSaveFailedCallback.<lambda>ú  ó   € Áur    c           	     óJ  a€ . oV3R  lp\         P                  P                  V P                  R4      pRp\	        \        4       4      ;_uu_ 4        \        P                  ! RVVVR7       V P                  \        S4      ^4       RRR4       R#   + '       g   i     R# ; i)c                  ó*   <€ S P                  R 4       R # r   )Úappend)Úcallback_calleds   €r   ÚcallbackÚPTestCredenitialSaveFailedCallback.test_credentials_save_failed.<locals>.callback  s   ø€ ð ×"Ñ" 4Ö(r    rÈ   r   r¦   )r~   rÝ   r,  N)
r¯   rà   rá   rÓ   r   r   r   rª   r   rA   )r   r‰  rÝ   r~   rˆ  s   &   @r   Útest_credentials_save_failedÚ>TestCredenitialSaveFailedCallback.test_credentials_save_failedú  s}   ø€ ð
 ˆõ	)ô
 Ÿ7™7Ÿ<™<¨¯©°~ÓFÐØ0ˆÜœ.Ó*×+Õ+Ü×)Ò)ØØ)Ø!1Ø'/õ	ð ×ÑœS Ó1°1Ô5÷ ,×+×+Ò+ús   Á6BÂB"	c                 ó   € R # r�  r!   r!   r    r   r‚  rƒ    r„  r    c           
     ó  € \         P                  P                  V P                  R 4      pRp\	        \        4       4      ;_uu_ 4        V P                  \        \        P                  RVVR7       RRR4       R#   + '       g   i     R# ; i©rÈ   r   r¦   rÜ   N)
r¯   rà   rá   rÓ   r   r   rt   ÚRuntimeErrorr   rª   ©r   rÝ   r~   s   &  r   Ú:test_default_credentials_save_failed_is_to_raise_exceptionÚ\TestCredenitialSaveFailedCallback.test_default_credentials_save_failed_is_to_raise_exception  sg   € ô Ÿ7™7Ÿ<™<¨¯©°~ÓFÐØ0ˆÜœ.Ó*×+Õ+Ø×ÑÜÜ"×-Ñ-ØØ)Ø!1ð ô ÷ ,×+×+Ò+ús   Á)A;Á;B	c                 ó   € R # )Tr!   r!   r    r   r‚  rƒ     s   € Átr    c                ó   € \         P                  P                  V P                  R 4      pRp\	        \        4       4      ;_uu_ 4        \        P                  ! RVVR7       RRR4       R#   + '       g   i     R# ; ir�  )r¯   rà   rá   rÓ   r   r   r   rª   r‘  s   &  r   Ú>test_credentials_save_fail_under_sudo_does_not_raise_exceptionÚ`TestCredenitialSaveFailedCallback.test_credentials_save_fail_under_sudo_does_not_raise_exception   sV   € ô Ÿ7™7Ÿ<™<¨¯©°~ÓFÐØ0ˆÜœ.Ó*×+Õ+Ü×)Ò)ØØ)Ø!1õ÷ ,×+×+Ò+ús   ÁA,Á,A=	rc  N)r"   r#   r$   r%   r8   rÌ   r   r>  r   Ústaticmethodr‹  r’  r–  r'   r(   r)   s   @r   ru  ru  ë  s‡   ø‡ € ò+ò%ð ‡\‚\Ð$ j±,¹}Ó2MÓNñ6ó Oð6ð, ‡\‚\Ð$ j±,¹}Ó2MÓNñó Oðð ‡\‚\Ð$ j±,¹|Ó2LÓMñ
ó Nö
r    ru  c                   ó°   a € ] tR tRt o R tR t]P                  ! ]R]	! R 4      4      R 4       t
]P                  ! ]R]	! R 4      4      R 4       tR	tV tR
# )ÚTestMultipleSitesi.  c                ót   € \        4       \        P                  n        \        P
                  ! 4       V n        R # r   rw  r7   s   &r   r8   ÚTestMultipleSites.setUp3  rz  r    c                óx   € \         \        P                  n         \        P                  ! V P
                  4       R # r   r|  r7   s   &r   rÌ   ÚTestMultipleSites.tearDown:  r~  r    r  c                 ó   € R # r�  r!   r!   r    r   r‚  ÚTestMultipleSites.<lambda>>  r„  r    c                ó,  € \         P                  P                  V P                  R 4      p\	        4       pRpRp\        V4      ;_uu_ 4        \        P                  ! VVVR7      pVP                  P                  P                  pRRR4       \        VP                  P                  4       4      ^ ,          ^,          pV P                  W74       V P                  XV4       V P                  WvR,           V,           4       R#   + '       g   i     L…; i)rÈ   r   zSuper App 3000rÜ   NÚ@)r¯   rà   rá   rÓ   r   r   r   rª   r®   r¬   r­   ÚlistÚdatarN   rF   r   )r   rÝ   rÉ   r~   r”   r³   r›   Úapplication_keys   &       r   Ú"test_components_of_application_keyÚ4TestMultipleSites.test_components_of_application_key>  sÒ   € äŸ7™7Ÿ<™<¨¯©°~ÓFÐÜ!Ó#ˆØ0ˆØ+ÐÜ˜'×"Õ"Ü*×5Ò5Ø Ø)Ø!1ôˆIð
 &×1Ñ1×:Ñ:×>Ñ>ˆM÷ #ô ˜wŸ|™|×0Ñ0Ó2Ó3°AÕ6°qÕ9ˆð
 	�‰�lÔ4Ø�‰�m _Ô5ð
 	×Ñ˜¸#Õ*=ÀÕ*LÖM÷' #×"ús   Á:DÄD	c                 ó   € R # r�  r!   r!   r    r   r‚  r   Y  r„  r    c                óœ  € \         P                  P                  V P                  R 4      p\	        4       pVP
                  '       d   Q R4       h\        V4      ;_uu_ 4        \        P                  ! RRVR7       \        P                  ! RRVR7       RRR4       \        VP
                  P                  4       4      ^8X  g   Q h\        VP
                  P                  4       4      ^ ,          ^,          p\        VP
                  P                  4       4      ^,          ^,          pV P                  W44       R#   + '       g   i     L¯; i)rÈ   z$oops, a fresh keyring has data in itr  zhttp://alpha.example.com/rÜ   zhttp://beta.example.com/N)r¯   rà   rá   rÓ   r   r¤  r   r   rª   rA   rN   r£  rî   )r   rÝ   rÉ   Úapplication_key_1Úapplication_key_2s   &    r   Útest_same_app_different_serversÚ1TestMultipleSites.test_same_app_different_serversY  sø   € äŸ7™7Ÿ<™<¨¯©°~ÓFÐÜ!Ó#ˆà—<—<�<ÐGÐ!GÓGÐÜ˜'×"Õ"ô ×)Ò)Ø"Ø8Ø!1õô
 ×)Ò)Ø"Ø7Ø!1õ÷ #ô  �7—<‘<×$Ñ$Ó&Ó'¨1Ô,Ð,Ð,ä  §¡×!2Ñ!2Ó!4Ó5°aÕ8¸Õ;ÐÜ  §¡×!2Ñ!2Ó!4Ó5°aÕ8¸Õ;ÐØ×ÑÐ-ÖA÷) #×"ús   Á!3D;Ä;E	rc  N)r"   r#   r$   r%   r8   rÌ   r   r>  r   r˜  r¦  r¬  r'   r(   r)   s   @r   rš  rš  .  sc   ø‡ € ò
+ò%ð ‡\‚\Ð$ j±,¹}Ó2MÓNñNó OðNð4 ‡\‚\Ð$ j±,¹}Ó2MÓNñBó OöBr    rš  ),r&   Ú
contextlibr   r¯   rØ   rx  rë   r¨   ÚunittestÚunittest.mockr   r>   Úlazr.restfulclient.resourcer   Úlaunchpadlib.credentialsr   r   rÈ   r   Úlaunchpadlib.launchpadr   r	   Úlaunchpadlib.testing.helpersr
   r   r   r   r   r   r   r   rŽ   ÚTestCaser   r,   r|   r‹   r¤   r¼   rÆ   rÏ   rf  ru  rš  r!   r    r   Ú<module>r¶     s'  ðñ" %å %Û 	Û Û Û Û Û Ý Û å 3÷õ
 Û Ý ,Ý C÷÷ ñ õð
 )€ôI˜h×/Ñ/ô IôqG�h×'Ñ'ô qGôh5
¨×):Ñ):ô 5
ôp 
¨(×*;Ñ*;ô  
ôF¨H×,=Ñ,=ô ô<¸8×;LÑ;Lô ô2-�(×#Ñ#ô -ôrN˜[ô rNôjE ô Eô<@¨×(9Ñ(9ô @ôFEB˜×)Ñ)ö EBr    