Ë
    O/æj~9  ã                   óŠ  — U 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mZ ddlmZ dZi Zej$                  edf   ed<    G d	„ d
e
j*                  e   «      Z G d„ dej.                  «      Z G d„ de
j2                  «      Z	 	 	 	 	 	 dde	dededededededej<                  e   ddfd„Z G d„ d«      Z y)é    N)ÚPathé   )ÚcoreÚjob_environmentÚloggerÚutils)ÚRé�   úsubprocess.Popen['bytes']Ú
_PROCESSESc                   óJ  ‡ — e Zd Z	 	 ddej                  eef   dedej                  e   dej                  d   ddf
ˆ fd„Z
dd	edefd
„Zedefd„«       Zddedej                  eef   fd„Zddeddfd„Zdd„Zdd„Zdej(                  fd„Zdej(                  ddfd„Zˆ xZS )ÚLocalJobNÚfolderÚjob_idÚtasksÚprocessr   Úreturnc                 ó–   •— t         ‰| �  |||«       d| _        | j                  | _        || _        | j                  D ]	  }||_        Œ y )NF)ÚsuperÚ__init__Ú_cancel_at_deletionÚ	_sub_jobsÚ_process)Úselfr   r   r   r   ÚsjobÚ	__class__s         €úW/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/submitit/local/local.pyr   zLocalJob.__init__   sJ   ø€ ô 	‰Ñ˜ ¨Ô/Ø#(ˆÔ à59·^±^ˆŒàˆŒØ—N‘Nò 	$ˆDØ#ˆD�Mñ	$ó    Úforce_checkc                 ó2   — | j                  «       d   }|dk7  S )z#Override to avoid using the watcherÚjobStateÚRUNNING)Úget_info)r   r   Ústates      r   ÚdonezLocalJob.done.   s   € à—‘“ 
Ñ+ˆØ˜	Ñ!Ð!r   c                 ób   — 	 | j                  «       j                  dd«      S # t        $ r Y yw xY w)zState of the jobr!   ÚunknownÚUNKNOWN)r#   ÚgetÚ	Exception©r   s    r   r$   zLocalJob.state3   s2   € ð	Ø—=‘=“?×&Ñ& z°9Ó=Ð=øäò 	Ùð	ús   ‚" ¢	.­.Úmodec                 óØ   — | j                   €,d}| j                  j                  j                  «       rd}d|iS | j                   j	                  «       }|€d}d|iS |dk  rd}d|iS d}d|iS )z,Returns information about the job as a dict.zNO PROCESS AND NO RESULTÚFINISHEDr!   r"   r   ÚINTERRUPTED)r   ÚpathsÚresult_pickleÚexistsÚpoll)r   r,   r$   r3   s       r   r#   zLocalJob.get_info<   s�   € à�=‰=Ð Ø.ˆEØ�z‰z×'Ñ'×.Ñ.Ô0Ø"�Ø Ð&Ð&Ø�}‰}×!Ñ!Ó#ˆØˆ<ØˆEð
 ˜EÐ"Ð"ð	 �AŠXØ!ˆEð ˜EÐ"Ð"ð ˆEØ˜EÐ"Ð"r   Úcheckc                 óp   — | j                   �*| j                   j                  t        j                  «       y y ©N)r   Úsend_signalÚsignalÚSIGINT)r   r4   s     r   ÚcancelzLocalJob.cancelL   s'   € Ø�=‰=Ð$Ø�M‰M×%Ñ%¤f§m¡mÕ4ð %r   c                 óx   — | j                   �.| j                   j                  t        j                  «       «       yy)zBSends preemption / timeout signal to the job (for testing purpose)N)r   r7   ÚLocalJobEnvironmentÚ_usr_sigr+   s    r   Ú
_interruptzLocalJob._interruptP   s-   € à�=‰=Ð$Ø�M‰M×%Ñ%Ô&9×&BÑ&BÓ&DÕEð %r   c                 ó  — | j                   r4| j                  «       j                  d«      dk(  s| j                  d¬«       | j                  j
                  j                  «       r!t        j                  | j                  d «       y y )Nr!   r.   F)r4   )
r   r#   r)   r:   r0   r1   r2   r   Úpopr   r+   s    r   Ú__del__zLocalJob.__del__U   s_   € Ø×#Ò#Ø—=‘=“?×&Ñ& zÓ2°jÒ@Ø—‘ %�Ô(à�:‰:×#Ñ#×*Ñ*Ô,Ü�N‰N˜4Ÿ;™;¨Õ-ð -r   c                 óŒ   — t        | j                  «      }d |d<   | j                  �| j                  t        | j                  <   |S )Nr   )ÚdictÚ__dict__r   r   r   )r   Úouts     r   Ú__getstate__zLocalJob.__getstate___   s:   € Ü�4—=‘=Ó!ˆØˆˆJ‰Ø�=‰=Ð$Ø&*§m¡mŒJ�t—{‘{Ñ#Øˆ
r   r$   c                 ó„   — | j                   j                  |«       t        j                  | j                  d «      | _        y r6   )rD   Úupdater   r)   r   r   )r   r$   s     r   Ú__setstate__zLocalJob.__setstate__f   s*   € à�‰×Ñ˜UÔ#ä"Ÿ™ t§{¡{°DÓ9ˆ�r   ))r   N)F)Úforce)T©r   N)Ú__name__Ú
__module__Ú__qualname__ÚtpÚUnionr   ÚstrÚSequenceÚintÚOptionalr   Úboolr%   Úpropertyr$   ÚDictr#   r:   r>   rA   ÚAnyrF   rI   Ú__classcell__©r   s   @r   r   r      só   ø„ ð
 #'Ø<@ñ$à—‘˜˜s˜Ñ#ð$ð ð$ð �{‰{˜3Ñð	$ð
 —‘Ð8Ñ9ð$ð 
õ$ñ " ð "°ó "ð
 ð�sò ó ðñ#˜Sð #¨r¯w©w°s¸C°xÑ/@ó #ñ 5˜Dð 5¨Dó 5óFó
.ð˜bŸf™fó ð: "§&¡&ð :¨T÷ :r   r   c                   ó.   — e Zd ZdddddddœZded	d
fd„Zy
)r<   ÚSUBMITIT_LOCAL_JOB_IDÚSUBMITIT_LOCAL_NTASKSÚSUBMITIT_LOCAL_JOB_NUM_NODESÚSUBMITIT_LOCAL_NODEIDÚSUBMITIT_LOCAL_GLOBALIDÚSUBMITIT_LOCAL_LOCALID)r   Ú	num_tasksÚ	num_nodesÚnodeÚglobal_rankÚ
local_rankÚ	countdownr   Nc                 ó¢   — | j                   }t        j                  «       j                  d|› d|› d�«       t	        j
                  t        «       y )NzRequeued job z (z remaining timeouts))r   r   Ú
get_loggerÚinfoÚsysÚexitÚLOCAL_REQUEUE_RETURN_CODE)r   rg   Újids      r   Ú_requeuezLocalJobEnvironment._requeuew   s?   € Ø�k‰kˆÜ×ÑÓ× Ñ  =°°°R¸	°{ÐBVÐ!WÔXÜ�‰Ô*Õ+r   )rL   rM   rN   Ú_envrS   ro   © r   r   r<   r<   m   s.   „ à)Ø,Ø3Ø'Ø0Ø.ñ€Dð, #ð ,¨$ô ,r   r<   c                   ó‚  ‡ — e Zd ZdZeZ	 	 	 ddej                  ee	f   de
dedej                  e   ddf
ˆ fd„Zedej                  e   fd	„«       Zd
ej"                  ddfˆ fd„Zdedee   fd„Zedefd„«       Zde
fd„Zdededefd„Zedej                  eef   defd„«       Zde	dej8                  e   fd„Zˆ xZS )ÚLocalExecutoraÝ  Local job executor
    This class is used to hold the parameters to run a job locally.
    In practice, it will create a bash file in the specified directory for each job,
    and pickle the task function and parameters. At completion, the job will also pickle
    the output. Logs are also dumped in the same directory.

    The submission file spawn several processes (one per task), with a timeout.


    Parameters
    ----------
    folder: Path/str
        folder for storing job submission/output and logs.

    Note
    ----
    - be aware that the log/output folder will be full of logs and pickled objects very fast,
      it may need cleaning.
    - use update_parameters to specify custom parameters (n_gpus etc...).
    Nr   Úmax_num_timeoutÚmax_pickle_size_gbÚpythonr   c                 óú   •— t         ‰| �  |||¬«       |€#t        j                  t        j
                  «      n|| _        t        j                  j                  | j                  «      }|j                  dd¬«       y )N)ru   rt   T)ÚparentsÚexist_ok)r   r   ÚshlexÚquoterk   Ú
executablerv   r   ÚJobPathsÚget_first_id_independent_folderr   Úmkdir)r   r   rt   ru   rv   Úindep_folderr   s         €r   r   zLocalExecutor.__init__•   sg   ø€ ô 	‰ÑØØ1Ø+ð 	ô 	
ð
 6<°^”e—k‘k¤#§.¡.Ô1ÈˆŒä—~‘~×EÑEÀdÇkÁkÓRˆØ×Ñ 4°$ÐÕ7r   c                 ó   — dhS )z4Parameters that can be set through update_parametersÚsetuprq   )Úclss    r   Ú_valid_parameterszLocalExecutor._valid_parameters¦   s   € ð ˆyÐr   Úkwargsc                 óš  •— |j                  dd«      dkD  rt        d«      ‚|j                  dd«      }|j                  dd«      }t        |t        j                  «      st        d|› d	�«      ‚t        d
„ |D «       «      st        d|› d�«      ‚t        |«      dkD  r|t        |«      kD  rt        |› d|› d�«      ‚t        ‰| �   di |¤Ž y)ao  Update the parameters of the Executor.

        Valid parameters are:
        - timeout_min (float)
        - gpus_per_node (int)
        - visible_gpus (Sequence[int])
        - tasks_per_node (int)
        - nodes (int). Must be 1 if specified
        - signal_delay_s (int): signal (lately: USR2) delay before timeout

        Other parameters are ignored
        Únodesr   é   z0LocalExecutor can use only one node. Use nodes=1Úgpus_per_nodeÚvisible_gpusrq   zProvided visible_gpus=z  is not an instance of Sequence.c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr6   )Ú
isinstancerS   )Ú.0Úxs     r   ú	<genexpr>z<LocalExecutor._internal_update_parameters.<locals>.<genexpr>¾   s   è ø€ Ò<¨!”:˜a¤×%Ñ<ùs   ‚z( contains an element that is not an int.z gpus requested, but only z were specified visible.N)	r)   Ú
ValueErrorrŒ   rO   rR   ÚallÚlenr   Ú_internal_update_parameters)r   r…   Úgpus_requestedrŠ   r   s       €r   r“   z)LocalExecutor._internal_update_parameters«   s×   ø€ ð �:‰:�g˜qÓ! AÒ%ÜÐOÓPÐPØŸ™ O°QÓ7ˆØ—z‘z .°"Ó5ˆÜ˜,¬¯©Ô4ÜÐ5°l°^ÐCcÐdÓeÐeÜÑ<¨|Ô<Ô<ÜÐ5°l°^ÐCkÐlÓmÐmÜˆ|Ó˜qÒ  ^´c¸,Ó6GÒ%GÜØ!Ð"Ð"<¸\¸NÐJbÐcóð ô 	‰Ñ+Ñ5¨fÓ5r   Úcommandc                 óŠ  — | j                   j                  dd«      }| j                   j                  dd«      }| j                   j                  dd«      }|dk(  rt        |«      n|d | }t        | j                  ||dj                  d„ |D «       «      | j                   j                  d	d
«      | j                   j                  dd«      | j                   j                  dd«      | j                   j                  dd«      ¬«      }t        | j                  t        |j                  «      |t        t        |«      «      ¬«      }|S )NÚtasks_per_noderˆ   r‰   r   rŠ   rq   ú,c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr6   )rQ   )r�   Úks     r   r�   z0LocalExecutor._submit_command.<locals>.<genexpr>Ñ   s   è ø€ Ò!7¨Q¤# a§&Ñ!7ùs   ‚Útimeout_ming       @Úsignal_delay_sé   Ústderr_to_stdoutFr‚   )r   r•   r—   Úcuda_devicesr›   rœ   rž   r‚   )r   r   r   r   )
Ú
parametersr)   ÚrangeÚstart_controllerr   Újoinr   rQ   ÚpidÚlist)r   r•   ÚntasksÚn_gpusrŠ   Úgpusr   Újobs           r   Ú_submit_commandzLocalExecutor._submit_commandÆ   s  € ð —‘×$Ñ$Ð%5°qÓ9ˆØ—‘×$Ñ$ _°aÓ8ˆØ—‘×*Ñ*¨>¸2Ó>ˆØ ,°Ò 2Œu�VŒ}¸ÀWÀfÐ8MˆÜ"Ø—;‘;ØØ!ØŸ™Ñ!7°$Ô!7Ó7ØŸ™×+Ñ+¨M¸3Ó?ØŸ?™?×.Ñ.Ð/?ÀÓDØ!Ÿ_™_×0Ñ0Ð1CÀUÓKØ—/‘/×%Ñ% g¨rÓ2ô	
ˆô $Ø—;‘;¤s¨7¯;©;Ó'7ÀÔPTÔUZÐ[aÓUbÓPcô
ˆð ˆ
r   c           	      óŠ   — dj                  | j                  dt        j                  t	        | j
                  «      «      g«      S )Nú z-u -m submitit.core._submit)r£   rv   rz   r{   rQ   r   r+   s    r   Ú_submitit_command_strz#LocalExecutor._submitit_command_strÜ   s3   € à�x‰x˜Ÿ™Ð&CÄUÇ[Á[ÔQTÐUY×U`ÑU`ÓQaÓEbÐcÓdÐdr   c                 óH   — d}| j                   j                  dd«      }||z  S )Nrˆ   r—   )r    r)   )r   r‡   r—   s      r   Ú
_num_taskszLocalExecutor._num_tasksà   s)   € ØˆØ"Ÿo™o×1Ñ1Ð2BÀAÓFˆØ�~Ñ%Ð%r   Úuidc                  ó   — y)NÚ rq   )r   r•   r°   s      r   Ú_make_submission_file_textz(LocalExecutor._make_submission_file_textå   s   € Ør   Ústringc                  ó   — y)NÚ0rq   )r´   s    r   Ú#_get_job_id_from_submission_commandz1LocalExecutor._get_job_id_from_submission_commandè   s   € ð r   Úsubmission_file_pathc                 ó   — g S r6   rq   )r   r¸   s     r   Ú_make_submission_commandz&LocalExecutor._make_submission_commandí   s   € àˆ	r   )é   ç      ð?N)rL   rM   rN   Ú__doc__r   Ú	job_classrO   rP   rQ   r   rS   ÚfloatrT   r   ÚclassmethodÚSetr„   rX   r“   r	   rª   rV   r­   r¯   r³   ÚstaticmethodÚbytesr·   ÚListrº   rY   rZ   s   @r   rs   rs   }   sD  ø„ ñð* €Ið
  !Ø$'Ø#'ñ8à—‘˜˜d˜Ñ#ð8ð ð8ð "ð	8ð
 —‘˜CÑ ð8ð 
õ8ð" ð "§&¡&¨¡+ò ó ðð6°B·F±Fð 6¸tõ 6ð6 sð ¨x¸©{ó ð, ðe sò eó ðeð&˜Có &ð
°#ð ¸Cð ÀCó ð ð°B·H±H¸UÀC¸ZÑ4Hð ÈSò ó ðð¸Tð ÀbÇgÁgÈcÁl÷ r   rs   r   r•   r—   rŸ   r›   rœ   rž   r‚   r   c                 óÄ  — t        t        j                  «      }|j                  t	        |«      |t	        t        d|z  «      «      t	        t        |«      «      dd|rdndd||rdnd¬«
       t        j                  ddt	        | «      g}	t        |«      }
|
r1d	j                  t        |«      t        j                  |	«      gz   «      }	t        j                  |	|
|¬
«      }|S )zTStarts a job controller, which is expected to survive the end of the python session.é<   r¶   Ú1r²   Úlocal)
r]   ÚSUBMITIT_LOCAL_COMMANDÚSUBMITIT_LOCAL_TIMEOUT_SÚSUBMITIT_LOCAL_SIGNAL_DELAY_Sr_   r^   ÚSUBMITIT_STDERR_TO_STDOUTÚSUBMITIT_EXECUTORÚCUDA_VISIBLE_DEVICESÚSUBMITIT_LOCAL_WITH_SHELLz-mzsubmitit.local._localz && )ÚshellÚenv)rC   ÚosÚenvironrH   rQ   rS   rk   r|   rU   r£   r¥   rz   Ú
subprocessÚPopen)r   r•   r—   rŸ   r›   rœ   rž   r‚   rÑ   Úproc_cmdÚ
need_shellr   s               r   r¢   r¢   ò   sÈ   € ô Œr�z‰zÓ
€CØ‡J�JÜ! .Ó1Ø&Ü!$¤S¨¨kÑ)9Ó%:Ó!;Ü&)¬#¨nÓ*=Ó&>Ø!Ø%(Ù)9¡#¸rØ!Ø)Ù).¡#°Bð ô ô Ÿ™¨Ð.EÄsÈ6Ã{ÐS€HÜ�e“€JÙØ—;‘;œt E›{¬e¯j©j¸Ó.BÐ-CÑCÓDˆÜ×Ñ˜x¨z¸sÔC€GØ€Nr   c                   óÀ   — e Zd ZdZdefd„Zdej                  dej                  ddfd„Z
dd	„Zdd
„Zddedej                  ej                  e      fd„Zddeddfd„Zy)Ú
Controllerz¾This controls a job:
    - instantiate each of the tasks
    - sends timeout signal
    - stops all tasks if one of them finishes
    - cleans up the tasks/closes log files when deleted
    r   c                 ó°  — t        t        j                  d   «      | _        t	        j
                  t        j                  d   «      | _        t        t        j                  d   «      | _        t        t        j                  d   «      | _        t        t        j                  d   «      | _
        g | _        g | _        g | _        t        t        j                  d   «      }t        |rt        j                  «       nt        j                   «       «      | _        t%        |«      | _        t)        j(                  t(        j*                  | j,                  «       y )Nr]   rÉ   rÊ   rË   rÌ   rÏ   )rS   rÒ   rÓ   r¦   rz   Úsplitr•   Ú	timeout_srœ   rU   rž   r   ÚstdoutsÚstderrsrQ   ÚgetppidÚgetpidr¤   r   r   r8   ÚSIGTERMÚ_forward_signal)r   r   Ú
with_shells      r   r   zController.__init__  sÞ   € Üœ"Ÿ*™*Ð%<Ñ=Ó>ˆŒÜ—{‘{¤2§:¡:Ð.FÑ#GÓHˆŒÜœRŸZ™ZÐ(BÑCÓDˆŒÜ!¤"§*¡*Ð-LÑ"MÓNˆÔÜ $¤R§Z¡ZÐ0KÑ%LÓ MˆÔØ02ˆŒ
Ø/1ˆŒØ/1ˆŒÜœ"Ÿ*™*Ð%@ÑAÓBˆ
Ü¡z”r—z‘z”|´r·y±y³{ÓCˆŒÜ˜6“lˆŒÜ�‰”f—n‘n d×&:Ñ&:Õ;r   ÚsignumÚargsr   Nc                 óh   — | j                   D ]  }	 |j                  |«       Œ y # t        $ r Y Œ#w xY wr6   )r   r7   r*   )r   rä   rå   Útasks       r   râ   zController._forward_signal-  s<   € Ø—J‘Jò 	ˆDðØ× Ñ  Õ(ñ	øô ò Ùðús   ‘%¥	1°1c                 óN  — | j                   j                  d¬«       t        | j                  «      D �cg c]-  }t	        j
                  | j                   | j                  |«      ‘Œ/ }}|D �cg c]  }|j                  j                  d«      ‘Œ c}| _	        | j                  r| j                  n(|D �cg c]  }|j                  j                  d«      ‘Œ c}| _        t        | j                  «      D ]£  }t        t        j                  «      }|j!                  t#        |«      t#        |«      | j                  ¬«       | j$                  j'                  t)        j*                  | j,                  d|| j                  |   | j                  |   d¬«      «       Œ¥ y c c}w c c}w c c}w )NT)ry   Úa)ra   r`   r\   Fzutf-8)rÐ   rÑ   ÚstderrÚstdoutÚencoding)r   r   r¡   r¦   r   r}   r¤   rë   ÚopenrÝ   rž   rê   rÞ   rC   rÒ   rÓ   rH   rQ   r   ÚappendrÔ   rÕ   r•   )r   rš   r0   ÚprÑ   s        r   Ústart_taskszController.start_tasks4  s8  € Ø�‰×Ñ 4ÐÔ(ÜCHÈÏÉÓCUÖV¸a”—‘ §¡¨T¯X©X°qÕ9ÐVˆÐVØ49Ö:¨q˜Ÿ™Ÿ™ cÕ*Ò:ˆŒØ'+×'<Ò'<�t—|’|Ð_dÖBeÐZ[À1Ç8Á8Ç=Á=ÐQTÕCUÒBeˆŒÜ�t—{‘{Ó#ò 	ˆAÜ”r—z‘zÓ"ˆCØ�J‰JÜ'*¨1£vÄsÈ1ÃvÐei×emÑemð ô ð �J‰J×ÑÜ× Ñ Ø—L‘LØØØŸ<™<¨™?ØŸ<™<¨™?Ø$ôõ	ñ	ùò WùÚ:ùÚBes   ´2FÁ,"FÂ2"F"c                 óì  — t         j                  t         j                  fD ]‹  }| j                  |«       |t         j                  k(  sŒ(t	        d„ | j
                  D «       «      sŒEt        j                  d«       t	        d„ | j
                  D «       «      sŒwt        j                  d«       Œ� g | _        | j                  | j                  z   }g g c| _        | _	        |D ]  }|j                  «        Œ y )Nc              3   ó@   K  — | ]  }|j                  «       d u –— Œ y ­wr6   ©r3   ©r�   Úts     r   r�   z(Controller.kill_tasks.<locals>.<genexpr>N  s   è ø€ Ò+QÀ¨A¯F©F«H¸Ô,<Ñ+Qùó   ‚gü©ñÒMbP?c              3   ó@   K  — | ]  }|j                  «       d u –— Œ y ­wr6   ró   rô   s     r   r�   z(Controller.kill_tasks.<locals>.<genexpr>P  s   è ø€ Ò<¨A�q—v‘v“x 4Ô'Ñ<ùrö   r¼   )r8   r9   ÚSIGKILLrâ   Úanyr   ÚtimeÚsleeprÝ   rÞ   Úclose)r   ÚsigÚfilesÚfs       r   Ú
kill_taskszController.kill_tasksI  sµ   € ä—M‘M¤6§>¡>Ð2ò 	$ˆCØ× Ñ  Ô%à”f—m‘mÓ#¬Ñ+QÀdÇjÁjÔ+QÕ(QÜ—
‘
˜5Ô!ÜÑ<°·±Ô<Õ<Ü—J‘J˜s•Oð	$ð ˆŒ
Ø—‘˜tŸ|™|Ñ+ˆØ%'¨Ð"ˆŒ�d”lØò 	ˆAØ�G‰G�Iñ	r   Úfreqc                 óü  — | j                   sJ d«       ‚|| j                  z  }|| j                  | j                  z
  z  }t        |«      D ]  }| j                   D �cg c]  }|j	                  «       ‘Œ }}t        d„ |D «       «      r|c S ||k(  r#| j                  t        j                  «       «       t        j                  d|z  «       Œ� | j                   D �cg c]  }|j	                  «       ‘Œ c}S c c}w c c}w )a  Waits for all tasks to finish or to time-out.

        Returns
        -------
        Sequence[Optional[int]]:
            Exit codes of each task.
            Some tasks might still have not exited, but they will have received the "timed-out" signal.
        zNothing to do!c              3   ó$   K  — | ]  }|d u–— Œ
 y ­wr6   rq   ©r�   Úes     r   r�   z"Controller.wait.<locals>.<genexpr>h  s   è ø€ Ò5 Q�1˜D”=Ñ5ùs   ‚r¼   )r   rÜ   rœ   r¡   r3   r‘   râ   r<   r=   rú   rû   )r   r  ÚtimeoutÚalmost_timeoutÚsteprõ   Ú
exit_codess          r   ÚwaitzController.waitX  sÚ   € ð �zŠzÐ+Ð+Ó+ˆzØ˜Ÿ™Ñ'ˆØ §¡°$×2EÑ2EÑ!EÑFˆô ˜'“Nò 	#ˆDØ,0¯J©JÖ7 q˜!Ÿ&™&�(Ð7ˆJÐ7ÜÑ5¨*Ô5Ô5Ø!Ò!à�~Ò%Ø×$Ñ$Ô%8×%AÑ%AÓ%CÔDä�J‰J�s˜T‘zÕ"ð	#ð #'§*¡*Ö-˜Q�—‘•Ò-Ð-ùò 8ùò .s   ÁC4ÃC9Ú	max_retryc                 ó   — t        |«      D ][  }	 | j                  «        | j                  «       }t        d„ |D «       «      }|s	 | j	                  «         y 	 | j	                  «        Œ] y # | j	                  «        w xY w)Nc              3   ó.   K  — | ]  }|t         k(  –— Œ y ­wr6   )rm   r  s     r   r�   z!Controller.run.<locals>.<genexpr>x  s   è ø€ ÒQÀ˜aÔ#<Õ<ÑQùs   ‚)r¡   rð   r
  rù   r   )r   r  Ú_r	  Úrequeues        r   ÚrunzController.runq  ss   € ô �yÓ!ò 	"ˆAð"Ø× Ñ Ô"Ø!ŸY™Y›[�
ÜÑQÀjÔQÓQ�ÙØà—‘Ö!ð ð —‘Õ!ñ	"øð —‘Õ!ús   �4A+Á+A=rK   )é   )é   )rL   rM   rN   r½   r   r   r8   ÚSignalsrO   rX   râ   rð   r   rS   rR   rT   r
  r  rq   r   r   rÙ   rÙ     sw   „ ñð<˜tó <ð f§n¡nð ¸R¿V¹Vð Èó óó*ñ.˜ð . b§k¡k°"·+±+¸cÑ2BÑ&Có .ñ2"˜Sð "¨ô "r   rÙ   )rˆ   r²   g      @r�   Frq   )!rÒ   rz   r8   rÔ   rk   rú   ÚtypingrO   Úpathlibr   r   r   r   r   Ú	core.corer	   rm   r   rW   rQ   Ú__annotations__ÚJobr   ÚJobEnvironmentr<   ÚPicklingExecutorrs   rS   r¿   rU   rR   r¢   rÙ   rq   r   r   ú<module>r     s  ðô 
Û Û Û Û 
Û Û Ý ç 7Ó 7Ý ð
  Ð ð 9;€
ˆB�G‰G�CÐ4Ð4Ñ5Ó :ôM:ˆt�x‰x˜‰{ô M:ô`,˜/×8Ñ8ô ,ô r�D×)Ñ)ô rðp ØØØØ"Ø ñØðàðð ðð ð	ð
 ðð ðð ðð �;‰;�sÑðð !ó÷Dh"ò h"r   