§
    ZQdsk  ã                   ó@  — d Z dZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZmZmZ ddlmZ ddlmZmZ dd	lmZ dd„Z G d„ de¦  «        Zd„ Zd„ Zd„ Zd„ Zd„ Z G d„ de¦  «        Z G d„ de¦  «        Z  G d„ de¦  «        Z! G d„ de ¦  «        Z"dS )zÛRefactoring framework.

Used as a main program, this can refactor any number of files and/or
recursively descend down directories.  Imported as a module, this
provides infrastructure to write your own refactoring tool.
z#Guido van Rossum <guido@python.org>é    N)Úchainé   )ÚdriverÚtokenizeÚtoken)Ú	find_root)ÚpytreeÚpygram)Úbtm_matcherTc                 óÜ   — t          | g g dg¦  «        }g }t          j        |j        ¦  «        D ]<\  }}}|                     d¦  «        r!|r
|dd…         }|                     |¦  «         Œ=|S )zEReturn a sorted list of all available fix names in the given package.Ú*Úfix_é   N)Ú
__import__ÚpkgutilÚiter_modulesÚ__path__Ú
startswithÚappend)Ú	fixer_pkgÚremove_prefixÚpkgÚ	fix_namesÚfinderÚnameÚispkgs          ú'/usr/lib/python3.11/lib2to3/refactor.pyÚget_all_fix_namesr      sƒ   € å
�Y  B¨¨Ñ
.Ô
.€CØ€IÝ&Ô3°C´LÑAÔAð #ð #Ñˆ��eØ�?Š?˜6Ñ"Ô"ð 	#Øð  Ø˜A˜B˜B”x�Ø×Ò˜TÑ"Ô"Ð"øØÐó    c                   ó   — e Zd ZdS )Ú
_EveryNodeN©Ú__name__Ú
__module__Ú__qualname__© r   r   r!   r!   +   ó   € € € € € Ø€Dr   r!   c                 óÌ  — t          | t          j        t          j        f¦  «        r| j        €t
          ‚| j        hS t          | t          j        ¦  «        r"| j        rt          | j        ¦  «        S t
          ‚t          | t          j	        ¦  «        rAt          ¦   «         }| j        D ])}|D ]$}|                     t          |¦  «        ¦  «         Œ%Œ*|S t          d| z  ¦  «        ‚)zf Accepts a pytree Pattern Node and returns a set
        of the pattern types which will match first. Nz$Oh no! I don't understand pattern %s)Ú
isinstancer	   ÚNodePatternÚLeafPatternÚtyper!   ÚNegatedPatternÚcontentÚ_get_head_typesÚWildcardPatternÚsetÚupdateÚ	Exception)ÚpatÚrÚpÚxs       r   r/   r/   /   sé   € õ �#�Ô*­FÔ,>Ð?Ñ@Ô@ð ð Œ8ÐÝÐØ”ˆzÐå�#•vÔ,Ñ-Ô-ð ØŒ;ð 	0Ý" 3¤;Ñ/Ô/Ð/ÝÐå�#•vÔ-Ñ.Ô.ð å‰EŒEˆØ”ð 	-ð 	-ˆAØð -ð -�Ø—’�¨Ñ+Ô+Ñ,Ô,Ð,Ð,ð-àˆå
Ð:¸SÑAÑ
BÔ
BÐBr   c                 óZ  — t          j        t          ¦  «        }g }| D ]¡}|j        r[	 t	          |j        ¦  «        }|D ]}||                              |¦  «         ŒŒ?# t          $ r |                     |¦  «         Y Œ`w xY w|j        �!||j                                      |¦  «         ŒŒ|                     |¦  «         Œ¢t          t          j
        j                             ¦   «         t          j
        j        ¦  «        D ]}||                              |¦  «         Œt          |¦  «        S )z^ Accepts a list of fixers and returns a dictionary
        of head node type --> fixer list.  )ÚcollectionsÚdefaultdictÚlistÚpatternr/   r   r!   Ú_accept_typer   r
   Úpython_grammarÚsymbol2numberÚvaluesÚtokensÚextendÚdict)Ú
fixer_listÚ
head_nodesÚeveryÚfixerÚheadsÚ	node_types         r   Ú_get_headnode_dictrJ   K   sL  € õ Ô(­Ñ.Ô.€JØ€EØð $ð $ˆØŒ=ð 	$ð8Ý'¨¬Ñ6Ô6�ð "'ð 8ð 8�IØ˜yÔ)×0Ò0°Ñ7Ô7Ð7Ð7ð8øõ ð $ð $ð $Ø—’˜UÑ#Ô#Ð#Ð#Ð#ð$øøøð Ô!Ð-Ø˜5Ô-Ô.×5Ò5°eÑ<Ô<Ð<Ð<à—’˜UÑ#Ô#Ð#Ð#Ý�6Ô0Ô>×EÒEÑGÔGÝ!Ô0Ô7ñ9ô 9ð ,ð ,ˆ	à�9Ô×$Ò$ UÑ+Ô+Ð+Ð+Ý�
ÑÔÐs   ¨AÁA?Á>A?c                 ó<   ‡ — ˆ fd„t          ‰ d¦  «        D ¦   «         S )zN
    Return the fully qualified names for fixers in the package pkg_name.
    c                 ó    •— g | ]
}‰d z   |z   ‘ŒS ©ú.r&   )Ú.0Úfix_nameÚpkg_names     €r   ú
<listcomp>z+get_fixers_from_package.<locals>.<listcomp>h   s8   ø€ ð @ð @ð @Øð �s‰N˜XÑ%ð @ð @ð @r   F)r   )rQ   s   `r   Úget_fixers_from_packagerS   d   s@   ø€ ð@ð @ð @ð @Ý-¨h¸Ñ>Ô>ð@ñ @ô @ð @r   c                 ó   — | S ©Nr&   )Úobjs    r   Ú	_identityrW   k   s   € Ø€Jr   c                 óh  ‡— d}t          j        t          j        | ¦  «        j        ¦  «        Šˆfd„}t          t          j        t           j        t          j	        h¦  «        }t          ¦   «         }	 	  |¦   «         \  }}||v rŒ|t          j        k    r|rnûd}nö|t          j        k    rå|dk    rß |¦   «         \  }}|t          j        k    s|dk    rn¾ |¦   «         \  }}|t          j        k    s|dk    rnš |¦   «         \  }}|t          j        k    r|dk    r |¦   «         \  }}|t          j        k    rV|                     |¦  «          |¦   «         \  }}|t          j        k    s|dk    rn |¦   «         \  }}|t          j        k    °Vnn�Œ n# t          $ r Y nw xY wt          |¦  «        S )	NFc                  óB   •— t          ‰¦  «        } | d         | d         fS )Nr   r   )Únext)ÚtokÚgens    €r   Úadvancez(_detect_future_features.<locals>.advancer   s    ø€ Ý�3‰iŒiˆØ�1Œv�s˜1”vˆ~Ðr   TÚfromÚ
__future__Úimportú(ú,)r   Úgenerate_tokensÚioÚStringIOÚreadlineÚ	frozensetr   ÚNEWLINEÚNLÚCOMMENTr1   ÚSTRINGÚNAMEÚOPÚaddÚStopIteration)ÚsourceÚhave_docstringr]   ÚignoreÚfeaturesÚtpÚvaluer\   s          @r   Ú_detect_future_featuresrv   o   sÝ  ø€ Ø€NÝ
Ô
"¥2¤;¨vÑ#6Ô#6Ô#?Ñ
@Ô
@€Cðð ð ð ð õ �œ¥x¤{µE´MÐBÑCÔC€FÝ‰uŒu€Hðð	Ø˜™	œ	‰IˆB�Ø�Vˆ|ˆ|ØØ•u”|Ò#Ð#Ø!ð ØØ!%��Ø•u”zÒ!Ð! e¨v¢o oØ#˜G™IœI‘	��EØ�œÒ#Ð# u°Ò'<Ð'<ØØ#˜G™IœI‘	��EØ�œÒ#Ð# u°Ò'8Ð'8ØØ#˜G™IœI‘	��EØ�œ’>�> e¨s¢l lØ ' ¡	¤	‘I�B˜Ø�EœJÒ&Ð&Ø—L’L Ñ'Ô'Ð'Ø ' ¡	¤	‘I�B˜Ø�UœX’~�~¨°#ª¨ØØ ' ¡	¤	‘I�B˜ð �EœJÒ&Ð&øð ñ3	øøõ4 ð ð ð Øˆðøøøå�XÑÔÐs   Á3D!F Æ
F"Æ!F"c                   ó   — e Zd ZdZdS )Ú
FixerErrorzA fixer could not be loaded.N)r#   r$   r%   Ú__doc__r&   r   r   rx   rx   —   s   € € € € € Ø&Ð&Ð&Ð&r   rx   c                   óÀ   — e Zd ZddddœZdZdZdd„Zd„ Zd„ Zd	„ Z	d
„ Z
d„ Zdd„Zdd„Zd„ Zdd„Zd„ Zd d„Zd„ Zd„ Z	 	 d!d„Zd"d„ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )#ÚRefactoringToolF)Úprint_functionÚexec_functionÚwrite_unchanged_filesÚFixr   Nc                 óP  — || _         |pg | _        | j                             ¦   «         | _        |�| j                             |¦  «         t          j                             ¦   «         | _        | j        d         r| j        j	        d= n| j        d         r| j        j	        d= | j         
                    d¦  «        | _        g | _        t          j        d¦  «        | _        g | _        d| _        t%          j        | j        t(          j        | j        ¬	¦  «        | _        |                      ¦   «         \  | _        | _        g | _        t5          j        ¦   «         | _        g | _        g | _        t?          | j        | j        ¦  «        D ]k}|j         r| j         !                    |¦  «         Œ$|| j        v r| j         "                    |¦  «         ŒH|| j        v r| j         "                    |¦  «         ŒltG          | j        ¦  «        | _$        tG          | j        ¦  «        | _%        dS )
zÑInitializer.

        Args:
            fixer_names: a list of fixers to import
            options: a dict with configuration.
            explicit: a list of fixers to run even if they are explicit.
        Nr|   Úprintr}   Úexecr~   r{   F)ÚconvertÚlogger)&ÚfixersÚexplicitÚ_default_optionsÚcopyÚoptionsr2   r
   r>   ÚgrammarÚkeywordsÚgetr~   ÚerrorsÚloggingÚ	getLoggerr„   Ú	fixer_logÚwroter   ÚDriverr	   rƒ   Ú
get_fixersÚ	pre_orderÚ
post_orderÚfilesÚbmÚBottomMatcherÚBMÚbmi_pre_orderÚbmi_post_orderr   ÚBM_compatibleÚ	add_fixerr   rJ   Úbmi_pre_order_headsÚbmi_post_order_heads)ÚselfÚfixer_namesr‰   r†   rG   s        r   Ú__init__zRefactoringTool.__init__¤   s  € ð "ˆŒØ ˜ BˆŒØÔ,×1Ò1Ñ3Ô3ˆŒØÐØŒL×Ò Ñ(Ô(Ð(ÝÔ,×1Ò1Ñ3Ô3ˆŒàŒ<Ð(Ô)ð 	.Ø”Ô% gÐ.Ð.ØŒ\˜/Ô*ð 	.Ø”Ô% fÐ-ð
 &*¤\×%5Ò%5Ð6MÑ%NÔ%NˆÔ"ØˆŒÝÔ'Ð(9Ñ:Ô:ˆŒØˆŒØˆŒ
Ý”m D¤LÝ,2¬NØ+/¬;ð8ñ 8ô 8ˆŒð +/¯/ª/Ñ*;Ô*;Ñ'ˆŒ˜œð ˆŒ
åÔ"Ñ$Ô$ˆŒØˆÔØ ˆÔå˜4œ?¨D¬NÑ;Ô;ð 	2ð 	2ˆEØÔ"ð 2Ø”×!Ò! %Ñ(Ô(Ð(Ð(ð ˜$œ.Ð(Ð(ØÔ"×)Ò)¨%Ñ0Ô0Ð0Ð0Ø˜$œ/Ð)Ð)ØÔ#×*Ò*¨5Ñ1Ô1Ð1øå#5°dÔ6HÑ#IÔ#IˆÔ Ý$6°tÔ7JÑ$KÔ$KˆÔ!Ð!Ð!r   c                 óÄ  — g }g }| j         D �]�}t          |i i dg¦  «        }|                     dd¦  «        d         }|                     | j        ¦  «        r|t          | j        ¦  «        d…         }|                     d¦  «        }| j        d                     d„ |D ¦   «         ¦  «        z   }	 t          ||¦  «        }n$# t          $ r t          d	|›d|›�¦  «        d‚w xY w || j        | j        ¦  «        }	|	j        r*| j        d
ur!|| j        vr|                      d|¦  «         �Œ!|                      d|¦  «         |	j        dk    r|                     |	¦  «         �ŒY|	j        dk    r|                     |	¦  «         �Œ{t          d|	j        z  ¦  «        ‚t'          j        d¦  «        }
|                     |
¬¦  «         |                     |
¬¦  «         ||fS )a  Inspects the options to load the requested patterns and handlers.

        Returns:
          (pre_order, post_order), where pre_order is the list of fixers that
          want a pre-order AST traversal, and post_order is the list that want
          post-order traversal.
        r   rN   r   éÿÿÿÿNÚ_Ú c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r&   )Útitle)rO   r6   s     r   rR   z.RefactoringTool.get_fixers.<locals>.<listcomp>ë   s    € Ð5OÐ5OÐ5OÀA°a·g²g±i´iÐ5OÐ5OÐ5Or   zCan't find TzSkipping optional fixer: %szAdding transformation: %sÚpreÚpostzIllegal fixer order: %rÚ	run_order©Úkey)r…   r   Úrsplitr   ÚFILE_PREFIXÚlenÚsplitÚCLASS_PREFIXÚjoinÚgetattrÚAttributeErrorrx   r‰   r�   r†   Úlog_messageÚ	log_debugÚorderr   ÚoperatorÚ
attrgetterÚsort)r    Úpre_order_fixersÚpost_order_fixersÚfix_mod_pathÚmodrP   ÚpartsÚ
class_nameÚ	fix_classrG   Úkey_funcs              r   r“   zRefactoringTool.get_fixersÛ   s"  € ð ÐØÐØ œKð 	Jñ 	JˆLÝ˜\¨2¨r°C°5Ñ9Ô9ˆCØ#×*Ò*¨3°Ñ2Ô2°2Ô6ˆHØ×"Ò" 4Ô#3Ñ4Ô4ð <Ø#¥C¨Ô(8Ñ$9Ô$9Ð$:Ð$:Ô;�Ø—N’N 3Ñ'Ô'ˆEØÔ*¨R¯WªWÐ5OÐ5OÈÐ5OÑ5OÔ5OÑ-PÔ-PÑPˆJðXÝ# C¨Ñ4Ô4�	�	øÝ!ð Xð Xð XÝ �j°x°x°xÀÀÐ!LÑMÔMÐSWÐWðXøøøà�I˜dœl¨D¬NÑ;Ô;ˆEØŒ~ð  $¤-°tÐ";Ð";Ø ¨¬Ð5Ð5Ø× Ò Ð!>ÀÑIÔIÐIÙà�NŠNÐ6¸ÑAÔAÐAØŒ{˜eÒ#Ð#Ø ×'Ò'¨Ñ.Ô.Ð.Ñ.Ø” Ò&Ð&Ø!×(Ò(¨Ñ/Ô/Ð/Ñ/å Ð!:¸U¼[Ñ!HÑIÔIÐIåÔ& {Ñ3Ô3ˆØ×Ò (ÐÑ+Ô+Ð+Ø×Ò 8ÐÑ,Ô,Ð,Ø Ð"3Ð4Ð4s   Â1CÃ!C#c                  ó   — ‚ )zCalled when an error occurs.r&   )r    ÚmsgÚargsÚkwdss       r   Ú	log_errorzRefactoringTool.log_error  s   € àr   c                 óH   — |r||z  }| j                              |¦  «         dS )zHook to log a message.N)r„   Úinfo©r    rÅ   rÆ   s      r   r¶   zRefactoringTool.log_message  s/   € àð 	Ø˜‘*ˆCØŒ×Ò˜ÑÔÐÐÐr   c                 óH   — |r||z  }| j                              |¦  «         d S rU   )r„   ÚdebugrË   s      r   r·   zRefactoringTool.log_debug  s/   € Øð 	Ø˜‘*ˆCØŒ×Ò˜#ÑÔÐÐÐr   c                 ó   — dS )zTCalled with the old version, new version, and filename of a
        refactored file.Nr&   )r    Úold_textÚnew_textÚfilenameÚequals        r   Úprint_outputzRefactoringTool.print_output  s	   € ð 	ˆr   c                 ó¬   — |D ]P}t           j                             |¦  «        r|                      |||¦  «         Œ9|                      |||¦  «         ŒQdS )z)Refactor a list of files and directories.N)ÚosÚpathÚisdirÚrefactor_dirÚrefactor_file)r    ÚitemsÚwriteÚdoctests_onlyÚdir_or_files        r   ÚrefactorzRefactoringTool.refactor  sn   € ð !ð 	Fð 	FˆKÝŒw�}Š}˜[Ñ)Ô)ð FØ×!Ò! +¨u°mÑDÔDÐDÐDà×"Ò" ;°°}ÑEÔEÐEÐEð		Fð 	Fr   c                 óì  — t           j        dz   }t          j        |¦  «        D ]Ï\  }}}|                      d|¦  «         |                     ¦   «          |                     ¦   «          |D ]w}|                     d¦  «        s`t           j                             |¦  «        d         |k    r7t           j                             ||¦  «        }	|  	                    |	||¦  «         Œxd„ |D ¦   «         |dd…<   ŒÐdS )zÄDescends down a directory and refactor every Python file found.

        Python files are assumed to have a .py extension.

        Files and subdirectories starting with '.' are skipped.
        ÚpyzDescending into %srN   r   c                 ó<   — g | ]}|                      d ¦  «        °|‘ŒS rM   )r   )rO   Údns     r   rR   z0RefactoringTool.refactor_dir.<locals>.<listcomp>2  s)   € ÐKÐKÐK "¸¿ºÀcÑ8JÔ8JÐK˜2ÐKÐKÐKr   N)
rÕ   ÚextsepÚwalkr·   r»   r   rÖ   Úsplitextr³   rÙ   )
r    Údir_namerÛ   rÜ   Úpy_extÚdirpathÚdirnamesÚ	filenamesr   Úfullnames
             r   rØ   zRefactoringTool.refactor_dir   s  € õ ”˜TÑ!ˆÝ,.¬G°HÑ,=Ô,=ð 
	Lð 
	LÑ(ˆG�X˜yØ�NŠNÐ/°Ñ9Ô9Ð9Ø�MŠM‰OŒOˆOØ�NŠNÑÔÐØ!ð Gð G�ØŸš¨Ñ,Ô,ð GÝ”G×$Ò$ TÑ*Ô*¨1Ô-°Ò7Ð7Ý!œwŸ|š|¨G°TÑ:Ô:�HØ×&Ò& x°¸ÑFÔFÐFøàKÐK¨ÐKÑKÔKˆH�Q�Q�Q‰KˆKð
	Lð 
	Lr   c                 ó°  — 	 t          |d¦  «        }n/# t          $ r"}|                      d||¦  «         Y d}~dS d}~ww xY w	 t          j        |j        ¦  «        d         }|                     ¦   «          n# |                     ¦   «          w xY wt          j         |d|d¬¦  «        5 }|                     ¦   «         |fcddd¦  «         S # 1 swxY w Y   dS )	zG
        Do our best to decode a Python source file correctly.
        ÚrbzCan't open %s: %sN©NNr   r5   r¦   ©ÚencodingÚnewline)	ÚopenÚOSErrorrÈ   r   Údetect_encodingrf   Úcloserd   Úread)r    rÑ   ÚfÚerrrð   s        r   Ú_read_python_sourcez#RefactoringTool._read_python_source4  s"  € ð	Ý�X˜tÑ$Ô$ˆAˆAøÝð 	ð 	ð 	Ø�NŠNÐ.°¸#Ñ>Ô>Ð>Ø�:�:�:�:�:øøøøð	øøøð	ÝÔ/°´
Ñ;Ô;¸AÔ>ˆHà�GŠG‰IŒIˆIˆIøˆA�GŠG‰IŒIˆIˆIøøøÝŒW�X˜s¨X¸rÐBÑBÔBð 	&ÀaØ—6’6‘8”8˜XÐ%ð	&ð 	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð 	&ð 	&s.   ‚ “
?�:º?ÁA7 Á7BÂ(CÃCÃCc                 óü  — |                       |¦  «        \  }}|€dS |dz  }|rl|                      d|¦  «         |                      ||¦  «        }| j        s||k    r|                      |||||¦  «         dS |                      d|¦  «         dS |                      ||¦  «        }| j        s	|r7|j        r0|                      t          |¦  «        dd…         |||¬¦  «         dS |                      d|¦  «         dS )zRefactors a file.Nú
zRefactoring doctests in %szNo doctest changes in %sr¤   )rÛ   rð   zNo changes in %s)rù   r·   Úrefactor_docstringr~   Úprocessed_fileÚrefactor_stringÚwas_changedÚstr)r    rÑ   rÛ   rÜ   Úinputrð   ÚoutputÚtrees           r   rÙ   zRefactoringTool.refactor_fileD  s@  € à×2Ò2°8Ñ<Ô<‰ˆˆxØˆ=àˆFØ�‰ˆØð 	=Ø�NŠNÐ7¸ÑBÔBÐBØ×,Ò,¨U°HÑ=Ô=ˆFØÔ)ð E¨V°uª_¨_Ø×#Ò# F¨H°e¸UÀHÑMÔMÐMÐMÐMà—’Ð9¸8ÑDÔDÐDÐDÐDà×'Ò'¨¨xÑ8Ô8ˆDØÔ)ð =¨dð =°tÔ7Gð =à×#Ò#¥C¨¡I¤I¨c¨r¨c¤N°HØ*/¸(ð $ñ Dô Dð Dð Dð Dð —’Ð1°8Ñ<Ô<Ð<Ð<Ð<r   c                 óÞ  — t          |¦  «        }d|v rt          j        | j        _        	 | j                             |¦  «        }nK# t          $ r>}|                      d||j        j	        |¦  «         Y d}~| j        | j        _        dS d}~ww xY w	 | j        | j        _        n# | j        | j        _        w xY w||_
        |                      d|¦  «         |                      ||¦  «         |S )aF  Refactor a given input string.

        Args:
            data: a string holding the code to be refactored.
            name: a human-readable name for use in error/log messages.

        Returns:
            An AST corresponding to the refactored input stream; None if
            there were errors during the parse.
        r|   zCan't parse %s: %s: %sNzRefactoring %s)rv   r
   Ú!python_grammar_no_print_statementr   rŠ   Úparse_stringr3   rÈ   Ú	__class__r#   Úfuture_featuresr·   Úrefactor_tree)r    Údatar   rs   r  rø   s         r   rþ   zRefactoringTool.refactor_string[  s
  € õ +¨4Ñ0Ô0ˆØ˜xÐ'Ð'Ý"(Ô"JˆDŒKÔð	/Ø”;×+Ò+¨DÑ1Ô1ˆDˆDøÝð 	ð 	ð 	Ø�NŠNÐ3Ø ¤Ô!7¸ñ>ô >ð >àˆFˆFˆFà"&¤,ˆDŒKÔÐÐøøøøð	øøøð ð #'¤,ˆDŒKÔÐø $¤,ˆDŒKÔÐ.Ð.Ð.Ð.Ø'ˆÔØ�ŠÐ'¨Ñ.Ô.Ð.Ø×Ò˜4 Ñ&Ô&Ð&Øˆs/   «A ÁB$ Á
BÁ"B	Á2B$ Â	BÂB$ Â$B7c                 óØ  — t           j                             ¦   «         }|rh|                      d¦  «         |                      |d¦  «        }| j        s||k    r|                      |d|¦  «         d S |                      d¦  «         d S |                      |d¦  «        }| j        s	|r-|j        r&|                      t          |¦  «        d|¦  «         d S |                      d¦  «         d S )NzRefactoring doctests in stdinz<stdin>zNo doctest changes in stdinzNo changes in stdin)
ÚsysÚstdinrö   r·   rü   r~   rý   rþ   rÿ   r   )r    rÜ   r  r  r  s        r   Úrefactor_stdinzRefactoringTool.refactor_stdinv  sû   € Ý”	—’Ñ Ô ˆØð 	6Ø�NŠNÐ:Ñ;Ô;Ð;Ø×,Ò,¨U°IÑ>Ô>ˆFØÔ)ð >¨V°uª_¨_Ø×#Ò# F¨I°uÑ=Ô=Ð=Ð=Ð=à—’Ð<Ñ=Ô=Ð=Ð=Ð=à×'Ò'¨¨yÑ9Ô9ˆDØÔ)ð 6¨dð 6°tÔ7Gð 6Ø×#Ò#¥C¨¡I¤I¨y¸%Ñ@Ô@Ð@Ð@Ð@à—’Ð4Ñ5Ô5Ð5Ð5Ð5r   c                 ó  — t          | j        | j        ¦  «        D ]}|                     ||¦  «         Œ|                      | j        |                     ¦   «         ¦  «         |                      | j        |                     ¦   «         ¦  «         | j                             | 	                    ¦   «         ¦  «        }t          |                     ¦   «         ¦  «        �rî| j        j        D �]¾}||v �r¶||         �r­||                              t          j        j        d¬¦  «         |j        r+||                              t          j        j        ¬¦  «         t'          ||         ¦  «        D �]8}|||         v r||                              |¦  «         	 t+          |¦  «         n# t,          $ r Y ŒEw xY w|j        r
||j        v rŒZ|                     |¦  «        }|rÇ|                     ||¦  «        }|�¯|                     |¦  «         |                     ¦   «         D ]*}|j        sg |_        |j                             |¦  «         Œ+| j                             | 	                    ¦   «         ¦  «        }|D ],}	|	|vrg ||	<   ||	                              ||	         ¦  «         Œ-�Œ:�ŒÀt          |                     ¦   «         ¦  «        �°ît          | j        | j        ¦  «        D ]}|                     ||¦  «         Œ|j        S )aÏ  Refactors a parse tree (modifying the tree in place).

        For compatible patterns the bottom matcher module is
        used. Otherwise the tree is traversed node-to-node for
        matches.

        Args:
            tree: a pytree.Node instance representing the root of the tree
                  to be refactored.
            name: a human-readable name for this tree.

        Returns:
            True if the tree was modified, False otherwise.
        T)r­   Úreverser¬   )r   r”   r•   Ú
start_treeÚtraverse_byrž   rŸ   r™   ÚrunÚleavesÚanyr@   r…   r»   r	   ÚBaseÚdepthÚkeep_line_orderÚ
get_linenor;   Úremover   Ú
ValueErrorÚfixers_appliedÚmatchÚ	transformÚreplacer   rB   Úfinish_treerÿ   )
r    r  r   rG   Ú	match_setÚnodeÚresultsÚnewÚnew_matchesÚfxrs
             r   r	  zRefactoringTool.refactor_tree†  s%  € õ  ˜4œ>¨4¬?Ñ;Ô;ð 	)ð 	)ˆEØ×Ò˜T 4Ñ(Ô(Ð(Ð(ð 	×Ò˜Ô1°4·>²>Ñ3CÔ3CÑDÔDÐDØ×Ò˜Ô2°D·O²OÑ4EÔ4EÑFÔFÐFð ”G—K’K §¢¡¤Ñ.Ô.ˆ	å�)×"Ò"Ñ$Ô$Ñ%Ô%ñ /	LØœœð .Lñ .L�Ø˜IÐ%Ñ%¨)°EÔ*:Ñ%à˜eÔ$×)Ò)­f¬kÔ.?ÈÐ)ÑNÔNÐNàÔ,ð Jð " %Ô(×-Ò-µ&´+Ô2HÐ-ÑIÔIÐIå $ Y¨uÔ%5Ñ 6Ô 6ð $Lñ $L˜Ø 9¨UÔ#3Ð3Ð3Ø% eÔ,×3Ò3°DÑ9Ô9Ð9ð%Ý% d™OœO˜O˜OøÝ)ð %ð %ð %ð %˜Hð%øøøð
  Ô.ð %°5¸DÔ<OÐ3OÐ3Oà$à"'§+¢+¨dÑ"3Ô"3˜à"ð LØ"'§/¢/°$¸Ñ"@Ô"@˜CØ"˜Ø $§¢¨SÑ 1Ô 1Ð 1à,/¯NªNÑ,<Ô,<ð !Fð !F Dð ,0Ô+>ð %AØ>@¨Ô(;Ø$(Ô$7×$>Ò$>¸uÑ$EÔ$EÐ$EÐ$Eð /3¬g¯kªk¸#¿*º*¹,¼,Ñ.GÔ.G Ø+6ð !Lð !L CØ+.°)Ð+;Ð+;Ø79¨	°#©à$-¨c¤N×$9Ò$9¸+ÀcÔ:JÑ$KÔ$KÐ$KÐ$Kùùõ_ �)×"Ò"Ñ$Ô$Ñ%Ô%ñ /	Lõb ˜4œ>¨4¬?Ñ;Ô;ð 	*ð 	*ˆEØ×Ò˜d DÑ)Ô)Ð)Ð)ØÔÐs   ÆF%Æ%
F2Æ1F2c                 óÄ   — |sdS |D ]X}||j                  D ]H}|                     |¦  «        }|r/|                     ||¦  «        }|�|                     |¦  «         |}ŒIŒYdS )a  Traverse an AST, applying a set of fixers to each node.

        This is a helper method for refactor_tree().

        Args:
            fixers: a list of fixer instances.
            traversal: a generator that yields AST nodes.

        Returns:
            None
        N)r,   r  r  r  )r    r…   Ú	traversalr"  rG   r#  r$  s          r   r  zRefactoringTool.traverse_byÕ  sŽ   € ð ð 	ØˆFØð 	#ð 	#ˆDØ ¤	Ô*ð #ð #�ØŸ+š+ dÑ+Ô+�Øð #ØŸ/š/¨$°Ñ8Ô8�CØ�ØŸš SÑ)Ô)Ð)Ø"˜øð#ð	#ð 	#r   c                 ó^  — | j                              |¦  «         |€|                      |¦  «        d         }|€dS ||k    }|                      ||||¦  «         |r|                      d|¦  «         | j        sdS |r|                      ||||¦  «         dS |                      d|¦  «         dS )zR
        Called when a file has been refactored and there may be changes.
        Nr   zNo changes to %szNot writing changes to %s)r–   r   rù   rÓ   r·   r~   Ú
write_file)r    rÐ   rÑ   rÏ   rÛ   rð   rÒ   s          r   rý   zRefactoringTool.processed_fileì  sÖ   € ð
 	Œ
×Ò˜(Ñ#Ô#Ð#ØÐØ×/Ò/°Ñ9Ô9¸!Ô<ˆHØÐØ�Ø˜HÒ$ˆØ×Ò˜( H¨h¸Ñ>Ô>Ð>Øð 	Ø�NŠNÐ-¨xÑ8Ô8Ð8ØÔ-ð Ø�Øð 	BØ�OŠO˜H h°¸(ÑCÔCÐCÐCÐCà�NŠNÐ6¸ÑAÔAÐAÐAÐAr   c                 ó�  — 	 t          j        |d|d¬¦  «        }n/# t          $ r"}|                      d||¦  «         Y d}~dS d}~ww xY w|5  	 |                     |¦  «         n.# t          $ r!}|                      d||¦  «         Y d}~nd}~ww xY wddd¦  «         n# 1 swxY w Y   |                      d|¦  «         d| _        dS )	zÑWrites a string to a file.

        It first shows a unified diff between the old text and the new text, and
        then rewrites the file; the latter is only done if the write option is
        set.
        Úwr¦   rï   zCan't create %s: %sNzCan't write %s: %szWrote changes to %sT)rd   rò   ró   rÈ   rÛ   r·   r‘   )r    rÐ   rÑ   rÏ   rð   Úfprø   s          r   r*  zRefactoringTool.write_file  sX  € ð	Ý”˜ 3°À2ÐFÑFÔFˆBˆBøÝð 	ð 	ð 	Ø�NŠNÐ0°(¸CÑ@Ô@Ð@ØˆFˆFˆFˆFˆFøøøøð	øøøð ð 	Dð 	DðDØ—’˜Ñ"Ô"Ð"Ð"øÝð Dð Dð DØ—’Ð3°X¸sÑCÔCÐCÐCÐCÐCÐCÐCøøøøðDøøøð	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	Dð
 	�ŠÐ,¨hÑ7Ô7Ð7ØˆŒ
ˆ
ˆ
sP   ‚ ›
A¥AÁAÁBÁA$Á#BÁ$
BÁ.B
ÂBÂ
BÂBÂB"Â%B"z>>> z... c           	      ó  — g }d}d}d}d}|                      d¬¦  «        D �])}|dz  }|                     ¦   «                              | j        ¦  «        rW|�+|                     |                      ||||¦  «        ¦  «         |}|g}|                     | j        ¦  «        }	|d|	…         }Œ‹|�V|                     || j        z   ¦  «        s#||| j                             ¦   «         z   dz   k    r| 	                    |¦  «         Œã|�+|                     |                      ||||¦  «        ¦  «         d}d}| 	                    |¦  «         �Œ+|�+|                     |                      ||||¦  «        ¦  «         d 
                    |¦  «        S )aË  Refactors a docstring, looking for doctests.

        This returns a modified version of the input string.  It looks
        for doctests, which start with a ">>>" prompt, and may be
        continued with "..." prompts, as long as the "..." is indented
        the same as the ">>>".

        (Unfortunately we can't use the doctest module's parser,
        since, like most parsers, it is not geared towards preserving
        the original source.)
        Nr   T©Úkeependsr   rû   r¦   )Ú
splitlinesÚlstripr   ÚPS1rB   Úrefactor_doctestÚfindÚPS2Úrstripr   r³   )
r    r  rÑ   ÚresultÚblockÚblock_linenoÚindentÚlinenoÚlineÚis
             r   rü   z"RefactoringTool.refactor_docstring  sÎ  € ð ˆØˆØˆØˆØˆØ×$Ò$¨dÐ$Ñ3Ô3ð 	$ñ 	$ˆDØ�a‰KˆFØ�{Š{‰}Œ}×'Ò'¨¬Ñ1Ô1ð $ØÐ$Ø—M’M $×"7Ò"7¸¸|Ø8>Àñ#Jô #Jñ Kô Kð Kà%�Ø˜�Ø—I’I˜dœhÑ'Ô'�Ø˜b˜q˜bœ��ØÐ$Ø—?’? 6¨D¬HÑ#4Ñ5Ô5ð %à˜6 D¤H§O¢OÑ$5Ô$5Ñ5¸Ñ<Ò<Ð<Ø—’˜TÑ"Ô"Ð"Ð"àÐ$Ø—M’M $×"7Ò"7¸¸|Ø8>Àñ#Jô #Jñ Kô Kð Kà�Ø�Ø—’˜dÑ#Ô#Ð#Ñ#ØÐØ�MŠM˜$×/Ò/°°|Ø06¸ñBô Bñ Cô Cð Cà�wŠw�v‰ŒÐr   c                 óì  ‡ ‡— 	 ‰                       ||‰¦  «        }nŽ# t          $ r�}‰ j                             t          j        ¦  «        r.|D ]+}‰                      d|                     d¦  «        ¦  «         Œ,‰                      d|||j	        j
        |¦  «         |cY d}~S d}~ww xY w‰                      ||¦  «        r´t          |¦  «                             d¬¦  «        }|d|dz
  …         ||dz
  d…         }}	|	dg|dz
  z  k    s
J |	¦   «         ‚|d                              d¦  «        s|dxx         dz  cc<   ‰‰ j        z   |                     d	¦  «        z   g}|r|ˆˆ fd
„|D ¦   «         z  }|S )zÞRefactors one doctest.

        A doctest is given as a block of lines, the first of which starts
        with ">>>" (possibly indented), while the remaining lines start
        with "..." (identically indented).

        z
Source: %srû   z+Can't parse docstring in %s line %s: %s: %sNTr/  r   r¤   r   c                 ó*   •— g | ]}‰‰j         z   |z   ‘ŒS r&   )r6  )rO   r=  r;  r    s     €€r   rR   z4RefactoringTool.refactor_doctest.<locals>.<listcomp>^  s%   ø€ ÐCÐCÐC°t˜& 4¤8Ñ+¨dÑ2ÐCÐCÐCr   )Úparse_blockr3   r„   ÚisEnabledForrŽ   ÚDEBUGr·   r7  rÈ   r  r#   r	  r   r1  Úendswithr3  Úpop)
r    r9  r<  r;  rÑ   r  rø   r=  r$  Úclippeds
   `  `      r   r4  z RefactoringTool.refactor_doctestD  sÂ  øø€ ð	Ø×#Ò# E¨6°6Ñ:Ô:ˆDˆDøÝð 	ð 	ð 	ØŒ{×'Ò'­¬Ñ6Ô6ð DØ!ð Dð D�DØ—N’N <°·²¸TÑ1BÔ1BÑCÔCÐCÐCØ�NŠNÐHØ# V¨S¬]Ô-CÀSñJô Jð JàˆLˆLˆLˆLˆLˆLøøøøð	øøøð ×Ò˜d HÑ-Ô-ð 		DÝ�d‘)”)×&Ò&°Ð&Ñ5Ô5ˆCà˜y  q¡˜yœ>¨3¨v°a©x¨y¨y¬>�SˆGØ˜t˜f¨¨q©Ñ1Ò1Ð1Ð1°7Ñ1Ô1Ð1Ø�r”7×#Ò# DÑ)Ô)ð  Ø�B��”˜4‘��‘Ø˜dœhÑ&¨¯ª°©¬Ñ3Ð4ˆEØð DØÐCÐCÐCÐCÐC¸sÐCÑCÔCÑC�Øˆs   „ œ
B'¦A6B"ÂB'Â"B'c                 ó6  — | j         rd}nd}| j        s|                      d|¦  «         n5|                      d|¦  «         | j        D ]}|                      |¦  «         Œ| j        r4|                      d¦  «         | j        D ]}|                      |¦  «         Œ| j        rut          | j        ¦  «        dk    r|                      d¦  «         n(|                      dt          | j        ¦  «        ¦  «         | j        D ]\  }}} | j        |g|¢R i |¤Ž Œd S d S )	NÚwerez
need to bezNo files %s modified.zFiles that %s modified:z$Warnings/messages while refactoring:r   zThere was 1 error:zThere were %d errors:)r‘   r–   r¶   r�   r�   r°   )r    rH  ÚfileÚmessagerÅ   rÆ   rÇ   s          r   Ú	summarizezRefactoringTool.summarizea  sk  € ØŒ:ð 	 ØˆDˆDàˆDØŒzð 	'Ø×ÒÐ4°dÑ;Ô;Ð;Ð;à×ÒÐ6¸Ñ=Ô=Ð=Øœ
ð 'ð '�Ø× Ò  Ñ&Ô&Ð&Ð&ØŒ>ð 	*Ø×ÒÐCÑDÔDÐDØœ>ð *ð *�Ø× Ò  Ñ)Ô)Ð)Ð)ØŒ;ð 	5Ý�4”;ÑÔ 1Ò$Ð$Ø× Ò Ð!5Ñ6Ô6Ð6Ð6à× Ò Ð!8½#¸d¼kÑ:JÔ:JÑKÔKÐKØ#'¤;ð 5ð 5‘��T˜4Ø �Ô  Ð4 tÐ4Ð4Ð4¨tÐ4Ð4Ð4Ð4ð	5ð 	5ð
5ð 5r   c                 óŠ   — | j                              |                      |||¦  «        ¦  «        }t          ¦   «         |_        |S )z³Parses a block into a tree.

        This is necessary to get correct line number / offset information
        in the parser diagnostics and embedded into the parse tree.
        )r   Úparse_tokensÚ	wrap_toksrg   r  )r    r9  r<  r;  r  s        r   rA  zRefactoringTool.parse_blockx  s:   € ð Œ{×'Ò'¨¯ª°u¸fÀfÑ(MÔ(MÑNÔNˆÝ(™{œ{ˆÔØˆr   c              #   óÀ   K  — t          j        |                      ||¦  «        j        ¦  «        }|D ]+\  }}\  }}\  }	}
}||dz
  z  }|	|dz
  z  }	||||f|	|
f|fV — Œ,dS )z;Wraps a tokenize stream to systematically modify start/end.r   N)r   rc   Ú	gen_linesÚ__next__)r    r9  r<  r;  rA   r,   ru   Úline0Úcol0Úline1Úcol1Ú	line_texts               r   rN  zRefactoringTool.wrap_toks‚  s—   è è € åÔ)¨$¯.ª.¸ÀÑ*GÔ*GÔ*PÑQÔQˆØDJð 	Gð 	GÑ@ˆD�%™˜% ©¨°°yØ�V˜a‘ZÑˆEØ�V˜a‘ZÑˆEð ˜  t˜}¨u°d¨m¸YÐFÐFÐFÐFÐFð	Gð 	Gr   c              #   ó  K  — || j         z   }|| j        z   }|}|D ]h}|                     |¦  «        r|t          |¦  «        d…         V — n5||                     ¦   «         dz   k    rdV — nt          d|›d|›�¦  «        ‚|}Œi	 dV — Œ)z–Generates lines as expected by tokenize from a list of lines.

        This strips the first len(indent + self.PS1) characters off each line.
        Nrû   zline=z	, prefix=Tr¦   )r3  r6  r   r°   r7  ÚAssertionError)r    r9  r;  Úprefix1Úprefix2Úprefixr=  s          r   rP  zRefactoringTool.gen_lines�  s¿   è è € ð
 ˜4œ8Ñ#ˆØ˜4œ8Ñ#ˆØˆØð 	ð 	ˆDØ�Š˜vÑ&Ô&ð LØ�3˜v™;œ;˜<˜<Ô(Ð(Ð(Ð(Ð(Ø˜Ÿš™œ¨4Ñ/Ò/Ð/Ø�
�
�
�
å$�n¸T¸T¸TÀ6À6Ð%JÑKÔKÐKØˆFˆFð	ØˆHˆHˆHð	r   rî   )FF)F)NFNrU   )r#   r$   r%   r‡   r²   r¯   r¢   r“   rÈ   r¶   r·   rÓ   rÞ   rØ   rù   rÙ   rþ   r  r	  r  rý   r*  r3  r6  rü   r4  rK  rA  rN  rP  r&   r   r   r{   r{   ›   sÓ  € € € € € à+0Ø).Ø27ð9ð 9Ðð €LØ€Kð3Lð 3Lð 3Lð 3Lðn&5ð &5ð &5ðPð ð ðð ð ðð ð ð
ð ð ð
Fð Fð Fð FðLð Lð Lð Lð(&ð &ð &ð =ð =ð =ð =ð.ð ð ð66ð 6ð 6ð 6ð M ð M ð M ð^#ð #ð #ð. GLØ $ðBð Bð Bð Bð*ð ð ð ð* €CØ
€Cð)ð )ð )ðVð ð ð:5ð 5ð 5ð.ð ð ðGð Gð Gðð ð ð ð r   r{   c                   ó   — e Zd ZdS )ÚMultiprocessingUnsupportedNr"   r&   r   r   r]  r]  ¤  r'   r   r]  c                   óB   ‡ — e Zd Zˆ fd„Z	 	 dˆ fd„	Zˆ fd„Zˆ fd„Zˆ xZS )ÚMultiprocessRefactoringToolc                 ód   •—  t          t          | ¦  «        j        |i |¤Ž d | _        d | _        d S rU   )Úsuperr_  r¢   ÚqueueÚoutput_lock©r    rÆ   Úkwargsr  s      €r   r¢   z$MultiprocessRefactoringTool.__init__ª  s;   ø€ Ø9�Õ)¨4Ñ0Ô0Ô9¸4ÐJÀ6ÐJÐJÐJØˆŒ
ØˆÔÐÐr   Fr   c                 óà  •‡ ‡— |dk    r*t          t          ‰ ¦  «                             |||¦  «        S 	 dd lŠn# t          $ r t
          ‚w xY w‰ j        �t          d¦  «        ‚‰                     ¦   «         ‰ _        ‰ 	                    ¦   «         ‰ _
        ˆˆ fd„t          |¦  «        D ¦   «         }	 |D ]}|                     ¦   «          Œt          t          ‰ ¦  «                             |||¦  «         ‰ j                             ¦   «          t          |¦  «        D ]}‰ j                             d ¦  «         Œ|D ]*}|                     ¦   «         r|                     ¦   «          Œ+d ‰ _        d S # ‰ j                             ¦   «          t          |¦  «        D ]}‰ j                             d ¦  «         Œ|D ]*}|                     ¦   «         r|                     ¦   «          Œ+d ‰ _        w xY w)Nr   r   z already doing multiple processesc                 óF   •— g | ]}‰                      ‰j        ¬ ¦  «        ‘ŒS ))Útarget)ÚProcessÚ_child)rO   r>  Úmultiprocessingr    s     €€r   rR   z8MultiprocessRefactoringTool.refactor.<locals>.<listcomp>¼  s<   ø€ ð 4ð 4ð 4Øð %×,Ò,°D´KÐ,Ñ@Ô@ð 4ð 4ð 4r   )ra  r_  rÞ   rk  ÚImportErrorr]  rb  ÚRuntimeErrorÚJoinableQueueÚLockrc  ÚrangeÚstartr³   ÚputÚis_alive)
r    rÚ   rÛ   rÜ   Únum_processesÚ	processesr6   r>  rk  r  s
   `       @€r   rÞ   z$MultiprocessRefactoringTool.refactor¯  s/  øøø€ à˜AÒÐÝÕ4°dÑ;Ô;×DÒDØ�u˜mñ-ô -ð -ð	-Ø"Ð"Ð"Ð"Ð"øÝð 	-ð 	-ð 	-Ý,Ð,ð	-øøøàŒ:Ð!ÝÐAÑBÔBÐBØ$×2Ò2Ñ4Ô4ˆŒ
Ø*×/Ò/Ñ1Ô1ˆÔð4ð 4ð 4ð 4ð 4Ý# MÑ2Ô2ð4ñ 4ô 4ˆ	ð	Øð ð �Ø—’‘	”	�	�	ÝÕ-¨tÑ4Ô4×=Ò=¸eÀUØ>KñMô Mð Mð ŒJ�OŠOÑÔÐÝ˜=Ñ)Ô)ð %ð %�Ø”
—’˜tÑ$Ô$Ð$Ð$Øð ð �Ø—:’:‘<”<ð Ø—F’F‘H”H�HøØˆDŒJˆJˆJøð ŒJ�OŠOÑÔÐÝ˜=Ñ)Ô)ð %ð %�Ø”
—’˜tÑ$Ô$Ð$Ð$Øð ð �Ø—:’:‘<”<ð Ø—F’F‘H”H�HøØˆDŒJÐÐÐÐs   µ: ºAÂ4AE2 Å2A;G-c                 ó4  •— | j                              ¦   «         }|�{|\  }}	  t          t          | ¦  «        j        |i |¤Ž | j                              ¦   «          n# | j                              ¦   «          w xY w| j                              ¦   «         }|­yd S d S rU   )rb  rŒ   ra  r_  rÙ   Ú	task_done)r    ÚtaskrÆ   re  r  s       €r   rj  z"MultiprocessRefactoringTool._childÌ  s­   ø€ ØŒz�~Š~ÑÔˆØÐØ‰LˆD�&ð'ØF•Õ1°4Ñ8Ô8ÔFØð%Ø#ð%ð %ð %ð ”
×$Ò$Ñ&Ô&Ð&Ð&ø�”
×$Ò$Ñ&Ô&Ð&Ð&øøøØ”:—>’>Ñ#Ô#ˆDð ÐÐÐÐÐs   £ A ÁA8c                 óŽ   •— | j         �| j                              ||f¦  «         d S  t          t          | ¦  «        j        |i |¤ŽS rU   )rb  rr  ra  r_  rÙ   rd  s      €r   rÙ   z)MultiprocessRefactoringTool.refactor_file×  sV   ø€ ØŒ:Ð!ØŒJ�NŠN˜D &˜>Ñ*Ô*Ð*Ð*Ð*àI•5Õ4°dÑ;Ô;ÔIØð!Øð!ð !ð !r   )FFr   )r#   r$   r%   r¢   rÞ   rj  rÙ   Ú__classcell__)r  s   @r   r_  r_  ¨  s�   ø€ € € € € ð ð  ð  ð  ð  ð
 :?Ø ðð ð ð ð ð ð:	$ð 	$ð 	$ð 	$ð 	$ð!ð !ð !ð !ð !ð !ð !ð !ð !r   r_  )T)#ry   Ú
__author__rd   rÕ   r   r  rŽ   r¹   r9   Ú	itertoolsr   Úpgen2r   r   r   Ú
fixer_utilr   r¦   r	   r
   r   r—   r   r3   r!   r/   rJ   rS   rW   rv   rx   Úobjectr{   r]  r_  r&   r   r   ú<module>r€     s  ððð ð 3€
ð 
€	€	€	Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð ð +Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	�ñ 	ô 	ð 	ðCð Cð Cð8ð ð ð2@ð @ð @ðð ð ð%ð %ð %ðP'ð 'ð 'ð 'ð '�ñ 'ô 'ð 'ðFð Fð Fð Fð F�fñ Fô Fð FðR	ð 	ð 	ð 	ð 	 ñ 	ô 	ð 	ð4!ð 4!ð 4!ð 4!ð 4! /ñ 4!ô 4!ð 4!ð 4!ð 4!r   