B
    u9at                @   sH  d dl Z e jdk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 G dd deZG dd deZG dd	 d	eZerd dlZd dlZd dlZG d
d dZnDd dlZd dlZd dlZd dlZeeddZeedrejZnejZddddddddddddd	dgZerd dlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ e0dddddd d!d"dd#d$d%d&d'd(d)d*d+d,g G d-d. d.e1Z2g Z3d/d0 Z4d1Z5d2Z6d3Z7d4d5 Z8d6d7 Z9dd8d9dZ:d:d Z;dd8d;dZ<G d<d de=Z>dd=dd=d>d?dZ?d@dA Z@dBd ZAdCd ZBG dDd de=ZCdS )E    Nwin32)	monotonicc               @   s   e Zd ZdS )SubprocessErrorN)__name__
__module____qualname__ r   r    /usr/lib/python3.7/subprocess.pyr   9   s    r   c               @   s8   e Zd Zd	ddZdd Zedd Zejdd ZdS )
CalledProcessErrorNc             C   s   || _ || _|| _|| _d S )N)
returncodecmdoutputstderr)selfr   r   r   r   r   r   r	   __init__C   s    zCalledProcessError.__init__c             C   sb   | j rN| j dk rNyd| jt| j  f S  tk
rJ   d| j| j  f S X nd| j| j f S d S )Nr   zCommand '%s' died with %r.z)Command '%s' died with unknown signal %d.z.Command '%s' returned non-zero exit status %d.)r   r   signalZSignals
ValueError)r   r   r   r	   __str__I   s    zCalledProcessError.__str__c             C   s   | j S )N)r   )r   r   r   r	   stdoutU   s    zCalledProcessError.stdoutc             C   s
   || _ d S )N)r   )r   valuer   r   r	   r   Z   s    )NN)r   r   r   r   r   propertyr   setterr   r   r   r	   r
   <   s   
r
   c               @   s8   e Zd Zd	ddZdd Zedd Zejdd ZdS )
TimeoutExpiredNc             C   s   || _ || _|| _|| _d S )N)r   timeoutr   r   )r   r   r   r   r   r   r   r	   r   h   s    zTimeoutExpired.__init__c             C   s   d| j | jf S )Nz'Command '%s' timed out after %s seconds)r   r   )r   r   r   r	   r   n   s    zTimeoutExpired.__str__c             C   s   | j S )N)r   )r   r   r   r	   r   r   s    zTimeoutExpired.stdoutc             C   s
   || _ d S )N)r   )r   r   r   r   r	   r   v   s    )NN)r   r   r   r   r   r   r   r   r   r   r   r	   r   a   s   
r   c               @   s,   e Zd ZdddddddddZdd ZdS )STARTUPINFOr   N)dwFlags	hStdInput
hStdOutput	hStdErrorwShowWindowlpAttributeListc            C   s0   || _ || _|| _|| _|| _|p(dg i| _d S )Nhandle_list)r   r   r   r   r   r    )r   r   r   r   r   r   r    r   r   r	   r      s    zSTARTUPINFO.__init__c             C   s@   | j  }d|kr"t|d |d< t| j| j| j| j| j|dS )Nr!   )r   r   r   r   r   r    )	r    copylistr   r   r   r   r   r   )r   Z	attr_listr   r   r	   _copy   s    
zSTARTUPINFO._copy)r   r   r   r   r$   r   r   r   r	   r      s   r   ZPIPE_BUFi   PollSelectorPopenPIPESTDOUTcall
check_callgetstatusoutput	getoutputcheck_outputrunDEVNULLCompletedProcess)CREATE_NEW_CONSOLECREATE_NEW_PROCESS_GROUPSTD_INPUT_HANDLESTD_OUTPUT_HANDLESTD_ERROR_HANDLESW_HIDESTARTF_USESTDHANDLESSTARTF_USESHOWWINDOWABOVE_NORMAL_PRIORITY_CLASSBELOW_NORMAL_PRIORITY_CLASSHIGH_PRIORITY_CLASSIDLE_PRIORITY_CLASSNORMAL_PRIORITY_CLASSREALTIME_PRIORITY_CLASSCREATE_NO_WINDOWDETACHED_PROCESSCREATE_DEFAULT_ERROR_MODECREATE_BREAKAWAY_FROM_JOBr1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   c               @   s6   e Zd ZdZejfddZdd Zdd ZeZ	eZ
dS )	HandleFc             C   s   | j sd| _ ||  d S )NT)closed)r   CloseHandler   r   r	   Close   s    zHandle.Closec             C   s    | j sd| _ t| S tdd S )NTzalready closed)rD   intr   )r   r   r   r	   Detach   s    zHandle.Detachc             C   s   d| j jt| f S )Nz%s(%d))	__class__r   rG   )r   r   r   r	   __repr__   s    zHandle.__repr__N)r   r   r   rD   _winapirE   rF   rH   rJ   __del__r   r   r   r   r	   rC      s   rC   c           	   C   sT   xNt d d  D ]>} | jtjd}|d k	ryt |  W q tk
rJ   Y qX qW d S )N)
_deadstate)_active_internal_pollsysmaxsizeremover   )instZresr   r   r	   _cleanup   s    rT   c              C   s*   g } t jj}|dkr&| dd|   | S )Nr   -O)rP   flagsoptimizeappend)argsr   r   r   r	   "_optim_args_from_interpreter_flags   s
    r^   c              C   sb  ddddddd} t  }x:|  D ].\}}ttj|}|dkr"|d	||   q"W tjjrh|d
 n$tjjrz|d tjjr|d tj	d d  }tjj
}ttdi }d|k}|dkr|d n|r|d |r|d x|D ]}|d|  qW |r|d xJdD ]B}||kr|| }	|	dkr>|}
nd||	f }
|d|
f qW |S )NdBSvbq)debugdont_write_bytecodeno_siteverbosebytes_warningquietr   rX   z-Iz-Ez-s	_xoptionsdev   zerror::BytesWarningzdefault::BytesWarningdefaultz-W)z-Xrl   )ZfaulthandlertracemallocZ
importtimeZshowalloccountZshowrefcountutf8Tz%s=%sz-X)r^   itemsgetattrrP   rZ   r\   isolatedignore_environmentno_user_sitewarnoptionsri   rR   extend)Zflag_opt_mapr]   flagoptrb   Zwarnoptsri   Zxoptionsdev_moder   argr   r   r	   _args_from_interpreter_flags   sN    








r|   )r   c          	   O   s>   t ||*}y|j| dS    |   Y nX W d Q R X d S )N)r   )r&   waitkill)r   	popenargskwargspr   r   r	   r)   ;  s    c              O   s6   t | |}|r2|d}|d kr(| d }t||dS )Nr]   r   )r)   getr
   )r   r   retcoder   r   r   r	   r*   L  s    



c             O   sT   d|krt dd|kr<|d d kr<|ddr4dnd|d< t|t| dd	|jS )
Nr   z3stdout argument not allowed, it will be overridden.inputuniversal_newlinesF     T)r   r   check)r   r   r.   r'   r   )r   r   r   r   r   r	   r-   _  s    #c               @   s&   e Zd ZdddZdd Zdd ZdS )	r0   Nc             C   s   || _ || _|| _|| _d S )N)r]   r   r   r   )r   r]   r   r   r   r   r   r	   r     s    zCompletedProcess.__init__c             C   sh   d | jd | jg}| jd k	r4|d | j | jd k	rP|d | j d t| jd|S )Nz	args={!r}zreturncode={!r}zstdout={!r}zstderr={!r}z{}({})z, )	formatr]   r   r   r\   r   typer   join)r   r]   r   r   r	   rJ     s    


zCompletedProcess.__repr__c             C   s    | j rt| j | j| j| jd S )N)r   r
   r]   r   r   )r   r   r   r	   check_returncode  s    z!CompletedProcess.check_returncode)NN)r   r   r   r   rJ   r   r   r   r   r	   r0     s   
	F)r   capture_outputr   r   c       
   
   O   s  | d k	r&| dd k	rtdt|d< |r^| dd k	sF| dd k	rNtdt|d< t|d< t||}y|j| |d\}}W nN tk
r   |  | \}}t|j|||dY n   |   Y nX | }	|r|	rt	|	|j||dW d Q R X t
|j|	||S )Nstdinz/stdin and input arguments may not both be used.r   r   z@stdout and stderr arguments may not be used with capture_output.)r   )r   r   )r   r   r'   r&   communicater   r~   r]   pollr
   r0   )
r   r   r   r   r   r   Zprocessr   r   r   r   r   r	   r.     s2    
c             C   s   g }d}x| D ]}g }|r$| d d|kp8d|kp8| }|rH| d xj|D ]b}|dkrf| | qN|dkr| dt| d  g }| d qN|r|| g }| | qNW |r|| |r|| | d qW d|S )	NF 	"\   z\"r   )r\   lenrw   r   )seqresultZ	needquoter{   Zbs_bufcr   r   r	   list2cmdline  s4    






r   c          
   C   sl   yt | ddtd}d}W n. tk
rF } z|j}|j}W d d }~X Y nX |dd  dkrd|d d }||fS )NT)shelltextr   r   rU   
)r-   r(   r
   r   r   )r   dataZexitcodeZexr   r   r	   r+   4  s    c             C   s   t | d S )Nrm   )r+   )r   r   r   r	   r,   S  s    
c               @   s  e Zd ZdZdFdddddd	Zed
d Zejdd Zdd Zdd Z	dd Z
ejejfddZdd Zdd ZdGddZdd Zdd Zdd  ZdHd!d"Zerd#d$ Zd%d& Zd'd( Zd)d* Zdejejejfd+d,Z d-d. Z!d/d0 Z"d1d2 Z#d3d4 Z$d5d6 Z%e%Z&nd7d$ Zd8d* Ze'j(e'j)e'j*e'j+e'j,e'j-fd9d:Z.de'j/e'j0e1j2fd;d,Z d<d= Z3d>d. Z!d?d2 Z#d@dA Z4dBd4 Z$dCd6 Z%dDdE Z&dS )Ir&   FrU   NTr   r   )encodingerrorsr   c            C   sZ  t   t | _d | _d| _|d kr(d}t|ts:tdt	rP|d k	rt
dn8|rh|shtdt d}|d k	rxt
d|dkrt
d	|| _d | _d | _d | _d | _d | _|| _|| _|d k	r|d k	rt|t|krtd
| |||\}}}}}}t	rN|dkrt| d}|dkr4t| d}|dkrNt| d}|pb|pb|pb|| _d| _d| _y|dkrt |d|| _| jrtj!| jd|dk||d| _|dkrt |d|| _| jrtj!| j||d| _|dkrt |d|| _| jrtj!| j||d| _| "||||||
||||	|||||||| W n   xDt#d | j| j| jfD ]*}y|$  W n t%k
r   Y nX qnW | jsNg }|t&kr|'| |t&kr|'| |t&kr|'| t(| dr|'| j) xP|D ]H}y*t	r$t|t*r$|+  n
t,$| W n t%k
rF   Y nX qW  Y nX d S )NFrU   zbufsize must be an integerz0preexec_fn is not supported on Windows platformszpass_fds overriding close_fds.Tz2startupinfo is only supported on Windows platformsr   z4creationflags is only supported on Windows platformszlCannot disambiguate when both text and universal_newlines are supplied but different. Pass one or the other.g      ?wbrm   )write_throughline_bufferingr   r   rb)r   r   _devnull)-rT   	threadingZLock_waitpid_lock_input_communication_started
isinstancerG   	TypeError
_mswindowsr   warningswarnRuntimeWarningr]   r   r   r   pidr   r   r   boolr   _get_handlesmsvcrtZopen_osfhandlerH   	text_mode_sigint_wait_secs_closed_child_pipe_fdsioopenTextIOWrapper_execute_childfiltercloseOSErrorr'   r\   hasattrr   rC   rF   os)r   r]   bufsize
executabler   r   r   
preexec_fn	close_fdsr   cwdenvr   startupinfocreationflagsrestore_signalsstart_new_sessionpass_fdsr   r   r   p2creadp2cwritec2preadc2pwriteerrreaderrwritefZto_closefdr   r   r	   r     s    

















zPopen.__init__c             C   s   | j S )N)r   )r   r   r   r	   r   %  s    zPopen.universal_newlinesc             C   s   t || _d S )N)r   r   )r   r   r   r   r	   r   +  s    c             C   s    | ||}|ddddS )Nz
r   )decodereplace)r   r   r   r   r   r   r	   _translate_newlines/  s    zPopen._translate_newlinesc             C   s   | S )Nr   )r   r   r   r	   	__enter__3  s    zPopen.__enter__c             C   s   | j r| j   | jr | j  z| jr2| j  W d |tkrz| jdkrpy| j| jd W n tk
rn   Y nX d| _d S |   X d S )Nr   )r   )	r   r   r   r   KeyboardInterruptr   _waitr   r}   )r   exc_typer   	tracebackr   r   r	   __exit__6  s     


zPopen.__exit__c             C   sT   | j s
d S | jd kr(|d| j t| d | j|d | jd krPtd k	rPt|  d S )Nzsubprocess %s is still running)source)rM   )_child_createdr   r   ResourceWarningrO   rN   r\   )r   Z_maxsizeZ_warnr   r   r	   rL   R  s    


zPopen.__del__c             C   s"   t | dsttjtj| _| jS )Nr   )r   r   r   devnullO_RDWRr   )r   r   r   r	   _get_devnulla  s    
zPopen._get_devnullc          
   C   s   |rZy| j | W nD tk
r(   Y n2 tk
rX } z|jtjkrFn W d d }~X Y nX y| j   W nD tk
r|   Y n2 tk
r } z|jtjkrn W d d }~X Y nX d S )N)r   writeBrokenPipeErrorr   errnoZEINVALr   )r   r   excr   r   r	   _stdin_writef  s"    zPopen._stdin_writec             C   sT  | j r|rtd|d kr| j s| j| j| jgd dkrd }d }| jrT| | n6| jrp| j }| j  n| jr| j }| j  | 	  n|d k	rt
 | }nd }zy| |||\}}W nh tk
r,   |d k	rt| j| |}n| j}d| _y| j|d W n tk
r$   Y nX  Y nX W d d| _ X | j	| |d}||fS )Nz.Cannot send input after starting communicationr   r   )r   T)r   r   r   r   r   countr   readr   r}   _time_communicater   minr   _remaining_timer   r   )r   r   r   r   r   endtimesigint_timeoutstsr   r   r	   r     sD    




zPopen.communicatec             C   s   |   S )N)rO   )r   r   r   r	   r     s    z
Popen.pollc             C   s   |d krd S |t   S d S )N)r   )r   r   r   r   r	   r     s    zPopen._remaining_timec             C   s&   |d krd S t  |kr"t| j|d S )N)r   r   r]   )r   r   orig_timeoutr   r   r	   _check_timeout  s    
zPopen._check_timeoutc             C   s   |d k	rt  | }y| j|dS  tk
r   |d k	rJt| j| |}n| j}d| _y| j|d W n tk
rz   Y nX  Y nX d S )N)r   r   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r	   r}     s    
z
Popen.waitc             C   s~  |d kr|d kr|d krdS d\}}d\}}d\}}	|d krtt t j}|d krt d d\}}
t|}t |
 nh|tkrt d d\}}t|t| }}n<|tkrt	| 
 }n$t|trt	|}nt	| }| |}|d kr*t t j}|d krt d d\}
}t|}t |
 nn|tkrXt d d\}}t|t| }}n@|tkrrt	| 
 }n&t|trt	|}nt	| }| |}|d krt t j}	|	d krdt d d\}
}	t|	}	t |
 n~|tkrt d d\}}	t|t|	 }}	nP|tkr$|}	n@|tkr>t	| 
 }	n&t|trVt	|}	nt	| }	| |	}	||||||	fS )N)rU   rU   rU   rU   rU   rU   )rU   rU   r   )rK   ZGetStdHandler3   Z
CreatePiperC   rE   r'   r/   r   Zget_osfhandler   r   rG   fileno_make_inheritabler4   r5   r(   )r   r   r   r   r   r   r   r   r   r   _r   r   r	   r     sn    












zPopen._get_handlesc             C   s&   t t  |t  ddt j}t|S )Nr   rm   )rK   ZDuplicateHandleZGetCurrentProcessZDUPLICATE_SAME_ACCESSrC   )r   handlehr   r   r	   r   =  s
    
zPopen._make_inheritablec             C   s   t dd |D S )Nc             S   s,   h | ]$}|d @ d ks$t |t jkr|qS )   )rK   ZGetFileTypeZFILE_TYPE_CHAR).0r   r   r   r	   	<setcomp>M  s    z,Popen._filter_handle_list.<locals>.<setcomp>)r#   )r   r!   r   r   r	   _filter_handle_listF  s    zPopen._filter_handle_listc             C   s  t |tst|}|d kr"t }n| }d|||fk}|r^| jtjO  _||_||_	||_
|j}t|oxd|kox|d }|s|r|r|d kri  }|_t|dg  }|d< |r|t|t|t|g7 }| ||d d < |r|stdt d}|
r2| jtjO  _tj|_tjdd}d||}z@t||d d t| |	||d k	r`t|nd |	\}}}}W d |dkr|  |dkr|  |dkr|  t| drt| j d	| _ X d	| _!t"|| _#|| _$t%| d S )
NrU   r!   z?startupinfo.lpAttributeList['handle_list'] overriding close_fdsFZCOMSPECzcmd.exez
{} /c "{}"r   T)&r   strr   r   r$   r   rK   r7   r   r   r   r    r   r#   r   rG   r   r   r   r   r8   r6   r   r   environr   ZCreateProcessfspathrF   r   r   r   r   r   rC   _handler   rE   )r   r]   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zunused_restore_signalsZunused_start_new_sessionZuse_std_handlesZattribute_listZhave_handle_listr!   ZcomspecZhpZhtr   tidr   r   r	   r   S  sj    






zPopen._execute_childc             C   s,   | j d kr&|| jd|kr&|| j| _ | j S )Nr   )r   r   )r   rM   Z_WaitForSingleObjectZ_WAIT_OBJECT_0Z_GetExitCodeProcessr   r   r	   rO     s    
zPopen._internal_pollc             C   s^   |d krt j}nt|d }| jd krXt | j|}|t jkrJt| j|t 	| j| _| jS )Ni  )
rK   ZINFINITErG   r   WaitForSingleObjectr   ZWAIT_TIMEOUTr   r]   GetExitCodeProcess)r   r   Ztimeout_millisr   r   r   r	   r     s    

zPopen._waitc             C   s   | |  |  d S )N)r\   r   r   )r   Zfhbufferr   r   r	   _readerthread  s    zPopen._readerthreadc             C   s\  | j rBt| dsBg | _tj| j| j | jfd| _d| j_| j  | j	rt| dsg | _
tj| j| j	| j
fd| _d| j_| j  | jr| | | j d k	r| j| | | j rt| j|| j	d k	r| j| | | j rt| j|d }d }| j r| j}| j   | j	r0| j
}| j	  |d k	rB|d }|d k	rT|d }||fS )N_stdout_buff)targetr]   T_stderr_buffr   )r   r   r  r   ZThreadr  Zstdout_threadZdaemonstartr   r  Zstderr_threadr   r   r   r   Zis_aliver   r]   r   )r   r   r   r   r   r   r   r   r	   r     sF    










zPopen._communicatec             C   sl   | j d k	rd S |tjkr"|   nF|tjkr>t| jtj n*|tjkrZt| jtj nt	d
|d S )NzUnsupported signal: {})r   r   SIGTERM	terminateZCTRL_C_EVENTr   r~   r   ZCTRL_BREAK_EVENTr   r   )r   sigr   r   r	   send_signal  s    




zPopen.send_signalc             C   sX   | j d k	rd S yt| jd W n2 tk
rR   t| j}|tjkrH || _ Y nX d S )Nrm   )r   rK   ZTerminateProcessr   PermissionErrorr  ZSTILL_ACTIVE)r   Zrcr   r   r	   r
    s    

zPopen.terminatec       
      C   s,  d\}}d\}}d\}}	|d kr"n@|t kr8t \}}n*|tkrJ|  }nt|trZ|}n| }|d krln@|t krt \}}n*|tkr|  }nt|tr|}n| }|d krnf|t krt \}}	nP|tkr|dkr|}	n
t	j
 }	n.|tkr|  }	nt|tr|}	n| }	||||||	fS )N)rU   rU   rU   )r'   r   piper/   r   r   rG   r   r(   rP   
__stdout__)
r   r   r   r   r   r   r   r   r   r   r   r   r	   r   1  sJ    





c       *         s  t |ttfr|g}nt|}|
rLttdr0dnd}|dg| } rL |d<  d kr\|d   }t \}}g }x |dk r|| t	|}qrW x|D ]}t
| qW zz|d k	rg }xL| D ]:\}}t|}d|krtd||d t|  qW nd }t  tj r, f}nt fd	d
t|D }t|}|| t|||tttt||||||||||||||| _d| _W d t
| X t| dd }|dkr|dkr||krt
| |dkr|dkr||krt
| |dkr.|dkr.||kr.t
| |d k	rBt
| d| _t }x0t|d} || 7 }| rxt|dkrPP qPW W d t
| X |ry6t | jd\}!}"|!| jkr| !|" ntj"| _#W n t$k
r   Y nX y|%dd\}#}$}%|%& }%W n, tk
r.   d}#d}$d't|}%Y nX tt(|#&dt)}&t*|&t+r|$rt|$d}'|%dk}(|(rvd}%|})n|})|'dkrt,|'}%|'t-j.kr|%dt/|) 7 }%|&|'|%|)|&|%d S )NZgetandroidapilevelz/system/bin/shz/bin/shz-cr   r      =z!illegal environment variable namec             3   s"   | ]}t jt | V  qd S )N)r   pathr   fsencode)r   dir)r   r   r	   	<genexpr>  s   z'Popen._execute_child.<locals>.<genexpr>Tr   rU   iP     :r   s   SubprocessError   0z#Bad exception data from child: {!r}ascii   Znoexecr   z: )0r   r   bytesr#   r   rP   r   r  r\   dupr   rq   r  r   r  dirnametupleget_exec_pathsetadd_posixsubprocessZ	fork_execsortedmaprG   r   r   rr   r   	bytearrayr   r   waitpid_handle_exitstatusrQ   r   ChildProcessErrorsplitr   r   builtinsr   
issubclassr   strerrorr   ENOENTrepr)*r   r]   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z
unix_shellZorig_executableZerrpipe_readZerrpipe_writeZlow_fds_to_closeZlow_fdZenv_listkrb   Zexecutable_listZfds_to_keepZ
devnull_fdZerrpipe_datapartr   r   Zexception_nameZ	hex_errnoZerr_msgZchild_exception_typeZ	errno_numZchild_exec_never_calledZerr_filenamer   )r   r	   r   g  s    	

















c             C   sL   ||r|| | _ n2||r*||| _ n||r@|| | _ ntdd S )NzUnknown child exit status!)r   r   )r   r   Z_WIFSIGNALEDZ	_WTERMSIGZ
_WIFEXITEDZ_WEXITSTATUSZ_WIFSTOPPEDZ	_WSTOPSIGr   r   r	   r%    s    zPopen._handle_exitstatusc          
   C   s   | j d kr| jdsd S zy8| j d k	r.| j S || j|\}}|| jkrR| | W nB tk
r } z$|d k	rv|| _ n|j|krd| _ W d d }~X Y nX W d | j  X | j S )NFr   )r   r   acquirer   r%  r   r   release)r   rM   Z_waitpidZ_WNOHANGZ_ECHILDr   r   er   r   r	   rO     s     	



c             C   s>   yt | j|\}}W n tk
r4   | j}d}Y nX ||fS )Nr   )r   r$  r   r&  )r   Z
wait_flagsr   r   r   r   r	   	_try_wait+  s    
zPopen._try_waitc          	   C   s  | j d k	r| j S |d k	rt | }d}x| jdrxz6| j d k	rBP | tj\}}|| jkrh| | P W d | j	  X | 
|}|dkrt| j|t|d |d}t| q(W nRxP| j d kr| j4 | j d k	rP | d\}}|| jkr| | W d Q R X qW | j S )NgMb@?Fr   r   g?)r   r   r   r/  r2  r   WNOHANGr   r%  r0  r   r   r]   r   timeZsleep)r   r   r   Zdelayr   r   Z	remainingr   r   r	   r   8  s8    







c          
   C   s  | j rX| jsXy| j   W n tk
r.   Y nX |sXy| j   W n tk
rV   Y nX d }d }| jsi | _| jr~g | j| j< | jrg | j| j< | jr| j| j }| jr| j| j }| | | j	rt
| j	}t }| j r|r|| j tj | jr
|| jtj | jr"|| jtj xJ| rn| |}|d k	rZ|dk rZt| j|||}	| || x|	D ]\}
}|
j| j kr|| j| jt  }y|  jt|
j|7  _W n, tk
r   ||
j |
j  Y n*X | jt| j	krd||
j |
j  nP|
j| j| jfkrvt|
jd}|sR||
j |
j  | j|
j | qvW q&W W d Q R X | j | |d |d k	rd!|}|d k	rd!|}| j"r|d k	r| #|| jj$| jj%}|d k	r| #|| jj$| jj%}||fS )Nr   i   )r   r   )&r   r   flushr   r   Z_fileobj2outputr   r   _save_inputr   
memoryview_PopenSelectorregister	selectorsZEVENT_WRITEZ
EVENT_READZget_mapr   r   r]   selectr   Zfileobj_input_offset	_PIPE_BUFr   r   r   Z
unregisterr   r   r\   r}   r   r   r   r   r   )r   r   r   r   r   r   Z
input_viewZselectorr   ZreadykeyZeventschunkr   r   r   r	   r   a  s    






(







c             C   sF   | j rB| jd krBd| _|| _|d k	rB| jrB| j| j j| j j| _d S )Nr   )r   r   r<  r   encoder   r   )r   r   r   r   r	   r6    s    zPopen._save_inputc             C   s   | j d krt| j| d S )N)r   r   r~   r   )r   r  r   r   r	   r    s    
c             C   s   |  tj d S )N)r  r   r	  )r   r   r   r	   r
    s    c             C   s   |  tj d S )N)r  r   SIGKILL)r   r   r   r	   r~     s    z
Popen.kill)rU   NNNNNTFNNNNr   TFr   )NN)N)5r   r   r   r   r   r   r   r   r   r   r   rP   rQ   r   r   rL   r   r   r   r   r   r   r}   r   r   r   r   r   rK   r  ZWAIT_OBJECT_0r  rO   r   r  r   r  r
  r~   r   WIFSIGNALEDWTERMSIG	WIFEXITEDWEXITSTATUS
WIFSTOPPEDWSTOPSIGr%  r$  r3  r   ZECHILDr2  r6  r   r   r   r	   r&   `  sj   .       
D
H	a46 ")a)DrP   platformr   r   r   r4  r   r(  r   r   r   r   	Exceptionr   r
   r   r   r   rK   r   r   r;  r:  rr   r=  r   r%   r8  ZSelectSelector__all__r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rw   rG   rC   rN   rT   r'   r(   r/   r^   r|   r)   r*   r-   objectr0   r.   r   r+   r,   r&   r   r   r   r	   <module>,   sr   
%


P


;/";I