a ì)gzäã@sÚddlmZmZmZeZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZmZmZmZmZmZddlmZddlmZddlmZddlm Z dd l!m"Z"m#Z#dd l$m%Z%dd l&m'Z'dd l(m)Z)dd l*m+Z+ddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2ddl3m4Z4ddl5m6Z6m7Z7ddl8m9Z9ddl:m;Z;mZ>m?Z?ddl@mAZAddlBmCZCmDZDeAƒZEdd„ejF G¡DƒZHdgZIGdd„deJƒZKdd„ZLdd„ZMGdd„dƒZNd d!„ZOdS)"é)Úabsolute_importÚdivisionÚprint_functionN)Ú constants)Ú AnsibleErrorÚAnsibleParserErrorÚAnsibleUndefinedVariableÚAnsibleConnectionFailureÚAnsibleActionFailÚAnsibleActionSkip)Ú TaskResult)Úget_action_args_with_defaults)Úboolean)Ú binary_type)Úto_textÚ to_native)Úwrite_to_file_descriptor)Ú Conditional)ÚTask)Úget_plugin_class)Ú become_loaderÚcliconf_loaderÚconnection_loaderÚhttpapi_loaderÚnetconf_loaderÚterminal_loader)ÚTemplar)ÚAnsibleCollectionConfigÚAnsibleCollectionRef)Úlistify_lookup_plugin_terms)Úto_unsafe_textÚwrap_var)Únamespace_factsÚ clean_facts)ÚDisplay)Ú combine_varsÚ isidentifiercCs g|]}d|vrd|vr|‘qS)ÚbecomeZ_pass©)Ú.0Úxr(r(úB/usr/lib/python3.9/site-packages/ansible/executor/task_executor.pyÚ (ór,Ú TaskExecutorc@s eZdZdS)ÚTaskTimeoutErrorN)Ú__name__Ú __module__Ú __qualname__r(r(r(r+r/-sr/cCst‚dS©N)r/)ZsignumÚframer(r(r+Ú task_timeout1sr5cs˜t|tƒs|Si}| ¡D]x}|dˆkr.qqt|dtƒrTt|dˆƒ||d<qt|dtƒr‚‡fdd„|dDƒ||d<q|d||d<q|S)z‡ Remove args with a value equal to the ``omit_token`` recursively to align with now having suboptions in the argument_spec ércsg|]}t|ˆƒ‘qSr()Ú remove_omit)r)Úv©Ú omit_tokenr(r+r,Er-zremove_omit..)Ú isinstanceÚdictÚitemsr7Úlist)Z task_argsr:Únew_argsÚir(r9r+r75s    r7c@s|eZdZdZdd„Zdd„Zdd„Zdd „Zdd d „Zdd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zd S)r.zÞ This is the main worker class for the executor pipeline, which handles loading an action plugin to actually dispatch the task to a given host. This class roughly corresponds to the old Runner() class. c CsJ||_||_||_||_||_||_||_d|_||_d|_ |j  ¡dSr3) Ú_hostÚ_taskÚ _job_varsÚ _play_contextÚ _new_stdinÚ_loaderÚ_shared_loader_objÚ _connectionÚ_final_qÚ_loop_eval_errorZsquash) ÚselfÚhostÚtaskZjob_varsÚ play_contextZ new_stdinÚloaderÚshared_loader_objZfinal_qr(r(r+Ú__init__UszTaskExecutor.__init__cs¨t d|jj¡�z2�z‚z | ¡}Wn.tyT}zd}||_WYd}~n d}~00|du�rât|ƒdk�rÐ| |¡}t |d�}d|d<|D�]}d|vr¶|dr¶|  d¡s¶d|d<|drÞd|vsÖd|vrÞ|dsÞd|d<d |v�r:|d �r:|  d ¡}|  d ¡�s"d|d <d |d <||j_ n|jj �r:|�s:||j_ d D]d}||v�r>||�r>||v�rhg||<t ||tƒ�s†||g||<||||||<||=�q>qŽ|  d d¡�s¼d|d <|d�ràd|d <nt dddgd�}nt d¡| ¡}t d¡d|v�rd|d<d ‡fdd„ ‰t d¡ˆ|ƒ}t d¡|WWz|j ¡WSt�ybYSt�y˜}zt dt|ƒ¡WYd}~Sd}~00St�y:}z†t dtt|dd�ƒ|jjd�WYd}~Wz|j ¡WSt�yøYSt�y.}zt dt|ƒ¡WYd}~Sd}~00Sd}~0t�yè}z–t dtdt|dd�ƒtt ¡ƒd|jjd�WYd}~Wz|j ¡WSt�y¦YSt�yÜ}zt dt|ƒ¡WYd}~Sd}~00Sd}~00Wz|j ¡WnJt�yYn8t�yD}zt dt|ƒ¡WYd}~n d}~00n\z|j ¡WnJt�yjYn8t�y }zt dt|ƒ¡WYd}~n d}~000dS)!a The main executor entrypoint, where we determine if the specified task requires looping and either runs the task with self._run_loop() or self._execute(). After that, the returned results are parsed and returned as a dict. zin run() - task %sNr)ÚresultsTÚskippedÚchangedFÚfailedÚ_ansible_ignore_errorszOne or more items failedÚmsg)ÚwarningsZ deprecationszAll items completedzAll items skippedzNo items in the list)rTrSZskipped_reasonrRzcalling self._execute()z_execute() doneÚsurrogate_or_strictc s²t|tƒrt||d�St|tƒr‚|D]Z}zˆ|||d�||<Wq$ty||dkrvt d¡ˆ||dd�||<n‚Yq$0q$n,t|tƒr®t|ƒD]\}}ˆ||d�||<q”|S)N©ÚerrorsÚdiffz{We were unable to decode all characters in the module return data. Replaced some in an effort to return as much as possibleÚsurrogate_then_replace) r;rr r<Ú UnicodeErrorÚdisplayÚwarningr>Ú enumerate)Úresr[ÚkÚidxÚitem©Ú _clean_resr(r+rg¥s       z$TaskExecutor.run.._clean_reszdumping result to jsonzdone dumping result, returningzerror closing connection: %sZ simplerepr)Z nonstring)rUrWÚ_ansible_no_logz.Unexpected failure during module execution: %sÚ)rUrWÚ exceptionÚstdoutrh)rY)r_ÚdebugrBÚ_uuidÚ_get_loop_itemsrrJÚlenÚ _run_loopr<ÚgetÚpopÚ ignore_errorsr;r>Ú_executerHÚcloseÚAttributeErrorÚ Exceptionrrr!rDÚno_logrÚ tracebackÚ format_exc)rKr=ÚeZ item_resultsrbreZ item_ignoreZarrayr(rfr+Úruncs®                  (ô*(ö ÿ(ø*ûzTaskExecutor.runcsh|j ¡|jd<|j ¡|jdvr:|jd |j ¡¡t|j|jd�‰d}|j d¡}|durh|}nü|jj�r0|jj|j j v�rd}|jjdkr˜d}t |jj ˆ|dd�}|s‡fd d „|Dƒ}|j j j|jj|jˆd �}d D]}||jj vràqöqàt|d |dƒt|j||jdd�ƒ}ntd|jjƒ‚n4|jj du�rdˆ |jj ¡}t|tƒ�sdtd|ƒ‚|S)z„ Loads a lookup plugin to handle the with_* portion of a task (if specified), and returns the items result. Zansible_search_path©rOÚ variablesNZ_ansible_loop_cacheTZ first_foundF)ÚtermsÚtemplarZfail_on_undefinedZ convert_barecsg|]}ˆ |¡s|‘qSr()Z is_template)r)Út©r€r(r+r,èr-z0TaskExecutor._get_loop_items..)rOr€)ÚtemplateÚvarÚfileZ_subdirÚs)rr~ZwantlistzSUnexpected failure in finding the lookup named '%s' in the available lookup pluginszÒInvalid data passed to 'loop', it requires a list, got this instead: %s. Hint: If you passed a list/dict of just one element, try adding wantlist=True to your lookup invocation or use q/query instead of lookup.)rBZget_search_pathrCrFZ get_basedirÚappendrrqZ loop_withrGZ lookup_loaderrZloopÚactionÚsetattrr!r|rrƒr;r>)rKr=Z loop_cacheZfailZ loop_termsZmylookupZsubdirr(r‚r+rnËs@     þÿzTaskExecutor._get_loop_itemsc Cs$|j}t|j|d�}|jjj|d�|jjj}|jjj}|jjj}|jjj }|jjj }|jjj pjd|d} ||vrˆt   d|j|f¡d} d} t|ƒ} g} t|ƒD�]p\}}||d<|||<|rÒ||d<|||<|�rn|d ||d k|d | k| | || |d d œ|d <|�r||d d <z||d |d d<Wnt�yJYn0|d d k�rn||d |d d<||_|�rŒ| �rŒt |¡nd} z(|jjddd�}|jj|_|j ¡}WnHt�y}z.|  tdt|ƒd�¡WYd}~q¤WYd}~n d}~00||j|_}||j|_}|j|d�}|j ¡}||j|_}||j|_}| �pZ|j} |||<||d<|�r‚|||<||d<|�r”|d |d <d|d<| d¡|d<z| | ¡|d<Wn>t �yú}z$| !ddt|ƒdœ¡WYd}~n d}~00t"|j#j$|jj%||d�}| &¡�s(| '¡�r8|j( )d|¡nV| *¡�rR|j( )d|¡n}|du�r¢|j?}nˆjj@}tA|ˆjjˆjjBˆˆjjCjDjEd!�ˆj_| (d"¡}|du�rötFˆjj|ƒˆj_ˆjjG�r2ˆjjH}|du�rd#}n|d$k�r(d%}n|d%7}nd%}ˆjjI}|d$k�rLd%}t d&¡d}tJd%|d%ƒD�]n}t d'¡�zªz:ˆjj4�r¤tK KtKjLtM¡}tK Nˆjj4¡ˆj>jOˆd(�}W�n>tPtQf�y}zD|jRWYd}~Wˆjj4�rtK Nd$¡tK KtKjL|¡}ˆj> S¡Sd}~0tT�y~}zNtdt|ƒd)�WYd}~Wˆjj4�rftK Nd$¡tK KtKjL|¡}ˆj> S¡Sd}~0tU�yô}z^d*ˆjjˆjj4f}td|d �WYd}~Wˆjj4�rÜtK Nd$¡tK KtKjL|¡}ˆj> S¡Sd}~00Wˆjj4�rtK Nd$¡tK KtKjL|¡}ˆj> S¡n.ˆjj4�rHtK Nd$¡tK KtKjL|¡}ˆj> S¡0t d+¡tV|�pp| (d,d¡ƒ|d,<ˆjjtjWv�r�tX|ƒ}ˆjjY�rÄtZˆjjYƒ�s¸t d-ˆjjYƒ‚|ˆˆjjY<ˆjj[d$k�rnˆjj\d$k�rf| (d.¡�sf| (d/¡�sfˆj]|ˆˆd0�}| (d/¡�r>ˆj^ _d1t`ˆj jaˆjj9|ˆj b¡d2�¡n(ˆj^ _d3t`ˆj jaˆjj9|ˆj b¡d2�¡||d,<‡‡‡fd4d5„}‡‡‡fd6d7„}d8|v� rDˆjjtjcv� rDˆjjtjWv� rˆjj�røˆjjd�rød9ˆv�rêˆd9 '|d8¡n |d8ˆd9<nˆ '|d8¡nt � y.}z$d|d/<t|ƒ|d>|<WYd}~n d}~00|d%k�rhthˆjd?�}ˆjjG|_i| ˆˆ¡� rf� qønp||k�rhd|d@<||dA<t dB||f¡ˆj^ _dCt`ˆj jaˆjj9|ˆj b¡d2�¡tj k|¡ˆjlˆj*ˆd �ˆ_>�qh|d%k� rø|d%|d<<d|d/<ˆjjtjWv� rtX|ƒ}ˆjjY� r&||ˆjjY<d8|v� rœˆjjtjcv� rœˆjjtjWv� r`| '|d8¡nˆjjdur:ˆjjr:tˆjd�}ˆjj|_| ˆˆ¡|d<dS)N©rOrT)rBZ changed_whenrrFÚwhenÚevaluate_conditional)r³Úcond©rKr€Z vars_copyr(r+Ú_evaluate_changed_when_result¬s  z._evaluate_changed_when_resultcsDˆjjr._evaluate_failed_when_resultZ ansible_factsZ_ansible_delegated_varsÚrc)rÚ0ZattemptsrTz%s_when_resultr´Z_ansible_retryÚretrieszRetrying task, attempt %d of %dZv2_runner_retryZ_ansible_notifyZansible_delegated_host)Z ansible_hostZ ansible_portZ ansible_userr¯z'attempt loop complete, returning result)nrCrrFržrDZset_task_and_variable_overriderBr“Ú remote_addrrAÚaddressZ update_varsrrxr¶r_rlr<rJr8rZ delegate_tor;rrr¤r›rˆr¥Z_ACTION_ALL_INCLUDE_TASKSÚargsrrrƒZ_ACTION_INCLUDE_ROLErwryrzZINJECT_FACTS_AS_VARSr`r¡rqr‘rHZ matches_nameÚ_get_connectionÚ_set_become_pluginÚ_set_connection_optionsÚanyZsupports_persistenceZUSE_PERSISTENT_CONNECTIONSZforce_persistenceÚ get_optionÚtimeoutÚvvvvZ transportZ get_optionsÚstart_connectionrmr‰ÚsysÚ executableÚ'_get_action_handler_with_module_contextZ_handlerZ resolved_fqcnZresolved_actionr Zmodule_defaultsrŸZ_playÚ_action_groupsr7Zuntilr¾ÚdelayÚrangeÚsignalÚSIGALRMr5Úalarmr|r r r³Úcleanupr r/ÚboolZ_ACTION_WITH_CLEAN_FACTSr!Úregisterr&Ú async_valÚpollÚ_poll_async_resultrIr£r r¢r Z _ACTION_DEBUGZdelegate_factsr%r"r#rrµrœr�Ú_get_action_handlerÚnotify) rKr~Zcontext_validation_errorZtempvarsr{rxZraiseitr¬r­Z include_fileZvariable_paramsÚcvarsÚcurrent_connectionZ plugin_varsÚoptionsÚ socket_pathZmodule_contextZmodule_defaults_fqcnr:r¾rÎr³ZattemptZold_sigrWr¹r»ÚafÚcondnamer·rcZ requireshedr(r¸r+rt’s                      ÿ þû       þ              ö   ø   û   ý      & ýþýþ           &    üþ         zTaskExecutor._executec CsB|dur|j}| d¡}|dur,tddd�St tdd|i|jjd�¡}|jjjd ||j |j |j ||jd �}|jj }|d k�r�t  |jj¡zF|j|d �}t| d d ¡ƒdksÊd|vrÂ| dd¡sÊd|vrÐW�q�WnŠt�y\} zpt dt| ƒ¡t dtt ¡ƒ¡z|j  ¡Wnt�y.Yn0||jj8}|d k�rH‚WYd} ~ qtd} ~ 00||jj8}|j dt|jj|j || !¡d�¡qtt| d d ¡ƒdk�rØ| d¡�rÈtdd|jj |d�Stdd|d�Snft |ddœ|jjdœ¡} |jjjd | |j |j |j ||jd �} | j|d �| j"dd�|j"dd�|SdS)z< Polls for the specified JID to be complete NZansible_job_idTz(No job id was returned by the async taskrŽÚ async_statusÚjid)rˆrÁÚ environmentzansible.legacy.async_status)rMr‘rNrOr€rPrr²Úfinishedr6rUZ_ansible_parsedFrSz-Exception during async poll, retrying... (%s)zAsync poll exception was: %sZv2_runner_on_async_pollr�z;async task did not complete within the requested time - %ss)rUrWÚ async_resultz'async task produced unparseable resultsrÓ)râÚmode)rárã)Úforce)#rCrqr<rÚloadrBrãrGÚ action_loaderrHrDrFrÖrœr�r×r|Úintrwr_rÈrrlryrzÚresetrvrIr£r rAr¢rmr rÓ) rKr³r€r©Z async_jidZ async_taskZ async_handlerZ time_leftrår{Z cleanup_taskZcleanup_handlerr(r(r+rØ8s�  ù   ÿ ÿþ    üþ  þûÿ ù   zTaskExecutor._poll_async_resultcCst |¡}|std|ƒ‚|S)Nz€Invalid become method specified, could not find matching plugin: '%s'. Use `ansible-doc -t become -l` to list available plugins.)rrqr)rKr¢r'r(r(r+Ú _get_become¡s  ÿzTaskExecutor._get_becomecCsj||j_|jj}|jjj||j|j|jjtt   ¡ƒd�\}}|sLt d|ƒ‚|  |||¡|j  |¡|S)z“ Reads the connection property for the host, and returns the correct connection object from the list of connection plugins )Ú task_uuidZansible_playbook_pidz(the connection plugin '%s' was not found)rDr‘rGrZget_with_contextrErBrmrÚosÚgetppidrrÃZset_attributes_from_plugin)rKrÛr€rÜZ conn_typer‘Zplugin_load_contextr(r(r+r¨s û   zTaskExecutor._get_connectioncCsÈ| d¡dur"t| |d¡ƒ}n|jj}|r^| d¡rN| | |d¡¡}qb| |jj¡}nd}z| |¡Wnty‚Yn0|rÄt |jddƒr¶t |ddƒs¶t d|j |j fƒ‚|j  |j ¡dS)NZansible_becomeZansible_become_methodZ require_ttyFZhas_ttyz`The '%s' connection does not provide a TTY which is required for the selected become plugin: %s.)rqrrƒrBr'rìZ become_methodZset_become_pluginrvr¤rr¦r¢rD)rKrÛr€r‘r'Z become_pluginr(r(r+rÃÇs(   ÿÿzTaskExecutor._set_become_pluginc CsŠzt|jd|ƒ}Wnty2t|j|ƒ}Yn0|dkr@d}tj ||j¡}i}|D]}||vrX| ||¡||<qX|j||d�|S)Nz_%sÚ ssh_type_connr‘©Ú task_keysZ var_options) r¤rHrvr¥r§r¨r¦rƒÚ set_options) rKr«r~r€ròZpluginÚ option_varsrÝrcr(r(r+Ú_set_plugin_optionsës z TaskExecutor._set_plugin_optionsc Csîg}tj d|jj¡}| |¡dii}|D]}||vr,| ||¡||<q,t|jddƒr”|D]4}| d|jj¡r^||vr^| ||¡|d|<q^|j   ¡}|j j |d<|j j r¾|j j |d<|d=|jj||d �| | d |||¡¡|jjdu�rp|j j�r|j j|d <| | d |||¡¡d D]8}zt|j ||jj |¡ƒWnt�y\Yn0�q(|jjj|j _t|jddƒ} | du�r¼|  d¡dk�r¼t|  d¡ƒ} | | | |||¡¡t|jddƒ} | du�rê| | d|||¡¡|S)Nr‘Z_extrasZ allow_extrasFz ansible_%s_rÇÚpasswordr¾rñr’Ú become_passr')Z become_userZ become_flagsZ become_exer÷Z _sub_pluginÚtypeZexternalÚobjrð)r¥r§r¨rHr¦Úextendrƒr¤Ú startswithrBr rDrÇrörórõr'r÷r‰rÆÚKeyErrorÚpromptrqr) rKr~r€ZvarnamesrôrÝrcròÚoptionÚsubr«Zsub_connr(r(r+rÄsH        z$TaskExecutor._set_connection_optionscCs| ||¡dS)zX Returns the correct action plugin to handle the requestion task action r)rÌ)rKr‘r€r(r(r+rÙFsz TaskExecutor._get_action_handlerc Cs$|jj d¡\}}}| d¡d}|r4d ||¡}n|}|jj}|jjj|jj|d�} | j rb| j sfd} | durv| j } nn|jj j |jj|d�r–|jj} nNt |tjv|jj j ||d�fƒrÜ|} tjdj| |jjd�|jjd �nd } d}|jj j| |j||j|j||j|d �} | �std | ƒ‚| | fS) zo Returns the correct action plugin to handle the requestion task action and the module context Ú.Ú_rz{0}.{1})Úcollection_listNz1Using network group action {handler} for {action})Úhandlerrˆr°zansible.legacy.normal)rMr‘rNrOr€rPrzthe handler '%s' was not found)rBrˆÚ rpartitionÚsplitÚformatÚ collectionsrGZ module_loaderZfind_plugin_with_contextZresolvedZ action_pluginréZ has_pluginÚallr¥ZNETWORK_GROUP_MODULESr_rÈrDr¿rqrFr) rKr‘r€Zmodule_collectionÚ separatorZ module_nameZ module_prefixZnetwork_actionrÚmoduleZ handler_namerr(r(r+rÌLsJÿ    ÿþø  z4TaskExecutor._get_action_handler_with_module_context)N)N)r0r1r2Ú__doc__rQr|rnrprtrØrìrÂrÃrõrÄrÙrÌr(r(r(r+r.Ls$h8 ) i$Fc Csøtjptj tjd¡g}| tj  dd¡  tj ¡¡|D]2}tj  |d¡}tj  |¡r:t d |¡¡qvq:tdƒ‚tj ¡}| t ¡t ¡ttj   tj¡ƒt ¡t ¡t ¡t ¡dœ¡g}tjrÞ| dd tj¡tj }t! "¡\} } t#j$||g|¢t%t &¡ƒ‘t%|ƒ‘| t#j't#j'|d �} t (| ¡t) *| ¡} t) *| ¡} | d t)j+@| d <zHt) ,| t)j-| ¡t.| |ƒt.| | /¡ƒ|  0¡\}}Wt) ,| t)j-| ¡nt) ,| t)j-| ¡0t (| ¡| j1dk�rÜt2 3t%|d d �¡}nFzt2 3t%|d d �¡}Wn.t4t2j5dt6ƒ�y dt%|d d �i}Yn0d|v�r¦|dD]p\}}|dk�rVtj|dd�nL|dv�rvt4t|ƒ||j7d�n,t8t|ƒ�r’t4t|ƒ|ƒntj||j7d��q4d|v�rðtjdk�rä|  d¡�räd|d}tj|tj9d�t|dƒ‚|dS)z* Starts the persistent connection rÚPATHrizansible-connectionz$Found ansible-connection at path {0}ziUnable to find location of 'ansible-connection'. Please set or check the value of ANSIBLE_CONNECTION_PATH)ZANSIBLE_BECOME_PLUGINSZANSIBLE_CLICONF_PLUGINSZANSIBLE_COLLECTIONS_PATHZANSIBLE_CONNECTION_PLUGINSZANSIBLE_HTTPAPI_PLUGINSZANSIBLE_NETCONF_PLUGINSZANSIBLE_TERMINAL_PLUGINSz-%sr8)ÚstdinrkÚstderrÚenvr±r]rZZJSONDecodeErrorÚerrorÚmessagesÚlogT)Zlog_only)rlr8ZvvZvvvrÈZvvvvvZvvvvvvr°érjzThe full traceback is: )ZcolorrÞ):r¥ZANSIBLE_CONNECTION_PATHrîÚpathÚdirnamerÊÚargvrúÚenvironrqrÚpathsepÚjoinÚisfiler_rÈrrržr¡rZ print_pathsrrrZcollection_pathsrrrrÚ verbosityr‡rËÚptyÚopenptyÚ subprocessÚPopenrrïÚPIPEruÚtermiosZ tcgetattrZICANONZ tcsetattrZTCSANOWrZ serializeZ communicateÚ returncodeÚjsonÚloadsr¤ÚdecoderÚ ValueErrorr¿ÚhasattrZ COLOR_ERROR)rNrÝríZcandidate_pathsrr¯rrZpythonZmasterZslaveÚpÚoldÚnewrkrr³ÚlevelÚmessagerWr(r(r+rÉ‚sx  õ   þ    $           rÉ)PZ __future__rrrrøZ __metaclass__rîrrœr#rÐrrÊr!ryZansiblerr¥Zansible.errorsrrrr r r Zansible.executor.task_resultr Zansible.executor.module_commonr Z)ansible.module_utils.parsing.convert_boolrZansible.module_utils.sixrZansible.module_utils._textrrZansible.module_utils.connectionrZansible.playbook.conditionalrZansible.playbook.taskrZansible.pluginsrZansible.plugins.loaderrrrrrrZansible.templaterZansible.utils.collection_loaderrrZansible.utils.listifyrZansible.utils.unsafe_proxyr r!Zansible.vars.cleanr"r#Zansible.utils.displayr$Zansible.utils.varsr%r&r_ZMAGIC_VARIABLE_MAPPINGr=Z RETURN_VARSÚ__all__Ú BaseExceptionr/r5r7r.rÉr(r(r(r+ÚsZ              >