a
    kÄ#dùÄ  ã                   @   s  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Zddl	Z	ddl
Z
ddlZddlmZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlm   m!Z! d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/m0Z0m1Z1m2Z2m3Z3 dd„ Z4e0dƒZ5e! 6e2¡G dd„ de(e5 ƒƒZ7G dd„ dƒZ8G dd„ dƒZ9G dd„ dƒZ:G dd„ dƒZ;G dd„ dƒZ<G dd„ dƒZ=G dd„ dƒZ>G d d!„ d!eƒZ?G d"d#„ d#ƒZ@G d$d%„ d%eAƒZBe! 6eB¡G d&d'„ d'ƒƒZCdS )(zn
Automata with states, transitions and actions.

TODO:
    - add documentation for ioevent, as_supersocket...
é    N)Údeque)Úconf)Údo_graph)Úlog_runtimeÚwarning)Ú
PacketList)ÚMTU)ÚSuperSocket)ÚPacket)ÚWINDOWS)ÚAnyÚCallableÚDecoratorCallableÚDequeÚDictÚGenericÚIterableÚIteratorÚListÚOptionalÚSetÚTupleÚTypeÚTypeVarÚUnionÚ_Generic_metaclassÚcastc           	   	   C   s|  t st | g g |¡d S g }g }tƒ }t| ƒD ]>}t|ddƒrJ| |¡ q.| ¡ dk rb| |¡ q.| |¡ q.|r�| tt |g g |¡d ƒ¡}|�rtt	|dur¨|d ndƒ}t
|ƒdkrÚtjj t |d  ¡ ¡|¡}n0tjj t
|ƒtjt
|ƒ dd	„ |D ƒŽ d|¡}|dk�rt|d
k�rt| || ¡ t
|ƒdk�rt|D ]4}tjj t | ¡ ¡d¡}|dk�r>| |¡ �q>t|ƒS )a¤  
    Select objects. Same than:
    ``select.select(inputs, [], [], remain)``

    But also works on Windows, only on objects whose fileno() returns
    a Windows event. For simplicity, just use `ObjectPipe()` as a queue
    that you can select on whatever the platform is.

    If you want an object to be always included in the output of
    select_objects (i.e. it's not selectable), just make fileno()
    return a strictly negative value.

    Example:

        >>> a, b = ObjectPipe("a"), ObjectPipe("b")
        >>> b.send("test")
        >>> select_objects([a, b], 1)
        [b]

    :param inputs: objects to process
    :param remain: timeout. If 0, return [].
    r   Z__selectable_force_select__FNiè  l   ÿÿ é   c                 S   s   g | ]}|  ¡ ‘qS © )Úfileno)Ú.0Úxr   r   úF/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/automaton.pyÚ
<listcomp>t   ó    z"select_objects.<locals>.<listcomp>i  )r   ÚselectÚsetÚlistÚgetattrÚappendr   ÚaddÚunionÚintÚlenÚctypesÚwindllÚkernel32ZWaitForSingleObjectÚc_void_pZWaitForMultipleObjects)	ÚinputsÚremainZnativesÚeventsÚresultsÚiZremainmsÚresZevtr   r   r"   Úselect_objects;   sN    þÿúþ
r8   Ú_Tc                   @   s¨   e Zd Zd%dd„Zer6dd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd&dd„Zd'dd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zeejfd#d$„ƒZdS )(Ú
ObjectPipeNc                 C   s8   |pd| _ d| _t ¡ \| _| _tƒ | _tr4|  	¡  d S )Nr:   F)
ÚnameÚclosedÚosÚpipeÚ_ObjectPipe__rdÚ_ObjectPipe__wrr   Ú_ObjectPipe__queuer   Ú
_wincreate)Úselfr;   r   r   r"   Ú__init__Œ   s    
zObjectPipe.__init__c                 C   s.   t ttjj d ddt dt ¡  ¡¡ƒ| _d S )NTFs   ObjectPipe %f)	r   r,   r.   r/   r0   ZCreateEventAZcreate_string_bufferÚrandomÚ_fd©rC   r   r   r"   rB   –   s    þzObjectPipe._wincreatec                 C   s0   t jj t  | j¡¡dkr,tt  t  ¡ ¡ƒ d S ©Nr   )	r.   r/   r0   ZSetEventr1   rF   r   ÚFormatErrorÚGetLastErrorrG   r   r   r"   Ú_winset�   s    zObjectPipe._winsetc                 C   s0   t jj t  | j¡¡dkr,tt  t  ¡ ¡ƒ d S rH   )	r.   r/   r0   Z
ResetEventr1   rF   r   rI   rJ   rG   r   r   r"   Ú	_winreset¢   s    zObjectPipe._winresetc                 C   s0   t jj t  | j¡¡dkr,tt  t  ¡ ¡ƒ d S rH   )	r.   r/   r0   ZCloseHandler1   rF   r   rI   rJ   rG   r   r   r"   Ú	_winclose§   s    zObjectPipe._winclosec                 C   s   t r
| jS | jS ©N)r   rF   r?   rG   r   r   r"   r   ¬   s    zObjectPipe.filenoc                 C   s*   | j  |¡ tr|  ¡  t | jd¡ dS )Nó   Xr   )rA   r)   r   rK   r=   Úwriter@   ©rC   Úobjr   r   r"   Úsend²   s
    zObjectPipe.sendc                 C   s   |   |¡ d S rN   ©rS   rQ   r   r   r"   rP   º   s    zObjectPipe.writec                 C   s   t | jƒ S rN   )ÚboolrA   rG   r   r   r"   Úempty¾   s    zObjectPipe.emptyc                 C   s   d S rN   r   rG   r   r   r"   ÚflushÂ   s    zObjectPipe.flushr   c                 C   sH   | j r| jr| j ¡ S d S t | jd¡ | j ¡ }trD| jsD|  ¡  |S )Nr   )r<   rA   Úpopleftr=   Úreadr?   r   rL   )rC   ÚnÚeltr   r   r"   ÚrecvÆ   s    


zObjectPipe.recvc                 C   s
   |   |¡S rN   ©r\   ©rC   rZ   r   r   r"   rY   Ò   s    zObjectPipe.readc                 C   s   | j s|  ¡ s|  ¡  qd S rN   )r<   rV   r\   rG   r   r   r"   ÚclearÖ   s    zObjectPipe.clearc                 C   s4   | j s0t | j¡ t | j¡ tr*|  ¡  d| _ d S ©NT)r<   r=   Úcloser?   r@   r   rM   rG   r   r   r"   ra   Ü   s    zObjectPipe.closec                 C   s   d| j t| ƒf S )Nz
<%s at %s>)r;   ÚidrG   r   r   r"   Ú__repr__å   s    zObjectPipe.__repr__c                 C   s   |   ¡  d S rN   )ra   rG   r   r   r"   Ú__del__é   s    zObjectPipe.__del__c                 C   s0   g }| D ]}|j r| |¡ q|r&|S t| |ƒS rN   )r<   r)   r8   )Úsocketsr3   r5   Úsr   r   r"   r%   í   s    zObjectPipe.select)N)r   )r   )Ú__name__Ú
__module__Ú__qualname__rD   r   rB   rK   rL   rM   r   rS   rP   rV   rW   r\   rY   r_   ra   rc   rd   Ústaticmethodr   Úrecv_poll_rater%   r   r   r   r"   r:   Š   s&   
	

	r:   c                   @   s0   e Zd ZdZdZdZdZdZdd„ Zdd„ Z	dS )ÚMessageNc                 K   s   | j  |¡ d S rN   )Ú__dict__Úupdate)rC   Úargsr   r   r"   rD     s    zMessage.__init__c                 C   s    dd  dd„ t | j¡D ƒ¡ S )Nz<Message %s>ú c                 s   s(   | ] \}}|  d ¡sd||f V  qdS )Ú_z%s=%rN)Ú
startswith©r    ÚkÚvr   r   r"   Ú	<genexpr>  s   
þz#Message.__repr__.<locals>.<genexpr>)ÚjoinÚsixÚ	iteritemsrm   rG   r   r   r"   rc     s    
ÿzMessage.__repr__)
rg   rh   ri   ÚtypeÚpktÚresultÚstateÚexc_inforD   rc   r   r   r   r"   rl   ú   s   rl   c                   @   sn   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTimerr   Fc                 C   s4   t |ƒ| _d| _d| _d| _|| _tƒ | _|| _d S ©Nr   T)	ÚfloatÚ_timeoutÚ_timeÚ_just_expiredÚ_expiredÚ_prioÚ_StateWrapperÚ_funcÚ_autoreload)rC   ÚtimeÚprioÚ
autoreloadr   r   r"   rD     s    
zTimer.__init__c                 C   s   | j S rN   ©r‚   rG   r   r   r"   Úget  s    z	Timer.getc                 C   s
   || _ d S rN   r�   )rC   Úvalr   r   r"   r&     s    z	Timer.setc                 C   s   | j | _d| _d| _d S ©NF)r‚   rƒ   r…   r„   rG   r   r   r"   Ú_reset  s    zTimer._resetc                 C   s
   d| _ d S r�   ©r„   rG   r   r   r"   Ú_reset_just_expired%  s    zTimer._reset_just_expiredc                 C   s
   | j dkS rH   )rƒ   rG   r   r   r"   Ú_running)  s    zTimer._runningc                 C   s   t | jdƒS rH   )Úmaxrƒ   rG   r   r   r"   Ú
_remaining-  s    zTimer._remainingc                 C   sJ   |  j |8  _ | j dkrF| jsFd| _| jr:| j| j  | _ nd| _d| _ d S r€   )rƒ   r…   r„   r‰   r‚   )rC   rŠ   r   r   r"   Ú
_decrement1  s    
zTimer._decrementc                 C   s$   | j |j kr| j |j k S | j|jk S rN   ©rƒ   r†   rQ   r   r   r"   Ú__lt__>  s    
ÿzTimer.__lt__c                 C   s$   | j |j kr| j |j kS | j|jkS rN   r˜   rQ   r   r   r"   Ú__gt__C  s    
ÿzTimer.__gt__c                 C   s(   t |tƒstƒ ‚| j|jko&| j|jkS rN   )Ú
isinstancer   ÚNotImplementedErrorrƒ   r†   rQ   r   r   r"   Ú__eq__H  s    
zTimer.__eq__c                 C   s   d| j | jf S )Nz<Timer %f(%f)>)rƒ   r‚   rG   r   r   r"   rc   N  s    zTimer.__repr__N)r   F)rg   rh   ri   rD   rŽ   r&   r‘   r“   r”   r–   r—   r™   rš   r�   rc   r   r   r   r"   r     s   

r   c                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )Ú
_TimerListc                 C   s
   g | _ d S rN   )ÚtimersrG   r   r   r"   rD   T  s    z_TimerList.__init__c                 C   s   | j  |¡ d S rN   )rŸ   r)   )rC   Útimerr   r   r"   Ú	add_timerX  s    z_TimerList.add_timerc                 C   s   | j D ]}| ¡  qd S rN   )rŸ   r‘   )rC   Útr   r   r"   Úreset\  s    
z_TimerList.resetc                 C   s   | j D ]}| |¡ qd S rN   )rŸ   r—   )rC   rŠ   r¢   r   r   r"   Ú	decrementa  s    
z_TimerList.decrementc                 C   s8   dd„ | j D ƒ}|jdd„ dd� |D ]}| ¡  q&|S )Nc                 S   s   g | ]}|j r|‘qS r   r’   ©r    r¢   r   r   r"   r#   h  r$   z&_TimerList.expired.<locals>.<listcomp>c                 S   s   | j S rN   )r†   ©r!   r   r   r"   Ú<lambda>i  r$   z$_TimerList.expired.<locals>.<lambda>T)ÚkeyÚreverse)rŸ   Úsortr“   )rC   Úlstr¢   r   r   r"   Úexpiredf  s
    
z_TimerList.expiredc                 C   s0   zt dd„ | jD ƒƒW S  ty*   Y dS 0 d S )Nc                 S   s   g | ]}|  ¡ r| ¡ ‘qS r   )r”   r–   r¥   r   r   r"   r#   q  r$   z)_TimerList.until_next.<locals>.<listcomp>r   )ÚminrŸ   Ú
ValueErrorrG   r   r   r"   Ú
until_nextn  s    z_TimerList.until_nextc                 C   s
   t | jƒS rN   )r-   rŸ   rG   r   r   r"   Úcountu  s    z_TimerList.countc                 C   s
   | j  ¡ S rN   )rŸ   Ú__iter__rG   r   r   r"   r±   y  s    z_TimerList.__iter__c                 C   s
   | j  ¡ S rN   )rŸ   rc   rG   r   r   r"   rc   }  s    z_TimerList.__repr__N)rg   rh   ri   rD   r¡   r£   r¤   r¬   r¯   r°   r±   rc   r   r   r   r"   rž   S  s   rž   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )Ú_instance_statec                 C   s    |j | _ |j| _|j j| j _d S rN   )Ú__self__Ú__func__Ú	__class__)rC   Úinstancer   r   r"   rD   ƒ  s    z_instance_state.__init__c                 C   s   t | j|ƒS rN   )r(   r´   )rC   Úattrr   r   r"   Ú__getattr__‰  s    z_instance_state.__getattr__c                 O   s   | j | jg|¢R i |¤ŽS rN   )r´   r³   ©rC   ro   Úkargsr   r   r"   Ú__call__�  s    z_instance_state.__call__c                 C   s   | j  | j¡S rN   )r³   Úadd_breakpointsr´   rG   r   r   r"   Úbreaks‘  s    z_instance_state.breaksc                 C   s   | j  | j¡S rN   )r³   Úadd_interception_pointsr´   rG   r   r   r"   Ú
intercepts•  s    z_instance_state.interceptsc                 C   s   | j  | j¡S rN   )r³   Úremove_breakpointsr´   rG   r   r   r"   Úunbreaks™  s    z_instance_state.unbreaksc                 C   s   | j  | j¡S rN   )r³   Úremove_interception_pointsr´   rG   r   r   r"   Úunintercepts�  s    z_instance_state.uninterceptsN)
rg   rh   ri   rD   r¸   r»   r½   r¿   rÁ   rÃ   r   r   r   r"   r²   ‚  s   r²   c                   @   sL   e Zd ZdZ dZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdS )r‡   N)rg   rh   ri   Ú	atmt_typeÚ
atmt_stateÚatmt_initialÚ
atmt_finalÚ	atmt_stopÚ
atmt_errorÚatmt_origfuncÚ	atmt_prioÚatmt_as_supersocketÚatmt_condnameÚatmt_ionameÚatmt_timeoutÚ	atmt_condÚ__code__r»   r   r   r   r"   r‡   ¦  s    r‡   c                   @   s”   e Zd ZdZdZdZdZdZdZG dd„ de	ƒZ
edd
d„ƒZeddd„ƒZeddd„ƒZeddd„ƒZeddd„ƒZedd„ ƒZeddd„ƒZdS )ÚATMTÚStateÚActionÚ	ConditionzReceive conditionzTimeout conditionz	I/O eventc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
zATMT.NewStateRequestedc                 O   s^   || _ |j| _|j| _|j| _|j| _|j	| _
t | d| j ¡ || _|| _|| _|  ¡  d S )NzRequest state [%s])ÚfuncrÅ   r}   rÆ   ÚinitialrÉ   ÚerrorrÈ   ÚstoprÇ   ÚfinalÚ	ExceptionrD   Ú	automatonro   rº   Úaction_parameters)rC   Z
state_funcrÜ   ro   rº   r   r   r"   rD   Â  s    zATMT.NewStateRequested.__init__c                 O   s   || _ || _| S rN   )Úaction_argsÚaction_kargsr¹   r   r   r"   rÝ   Ð  s    z(ATMT.NewStateRequested.action_parametersc                 C   s   | j | jg| j¢R i | j¤ŽS rN   )rÖ   rÜ   ro   rº   rG   r   r   r"   ÚrunÖ  s    zATMT.NewStateRequested.runc                 C   s
   d| j  S )NzNewStateRequested(%s)©r}   rG   r   r   r"   rc   Ú  s    zATMT.NewStateRequested.__repr__N)rg   rh   ri   rD   rÝ   rà   rc   r   r   r   r"   ÚNewStateRequestedÁ  s   râ   r   c                    s   | |f‡ ‡fdd„	}|S )Nc                    s|   t jˆ _ˆ jˆ _|ˆ _|ˆ _ˆˆ _ˆˆ _‡ fdd„}t	t
|ƒ}dˆ j |_t j|_ˆ j|_||_||_ˆ|_ˆ|_ˆ |_|S )Nc                    s   t jˆ | g|¢R i |¤ŽS rN   )rÒ   râ   r¹   ©Úfr   r"   Ú_state_wrapperî  s    z0ATMT.state.<locals>.deco.<locals>._state_wrapperz
%s_wrapper)rÒ   ÚSTATErÄ   rg   rÅ   rÆ   rÇ   rÈ   rÉ   r   r‡   rÊ   )rä   r×   rÚ   rå   Zstate_wrapper©rØ   rÙ   rã   r"   Údecoå  s"    
zATMT.state.<locals>.decor   )r×   rÚ   rÙ   rØ   rè   r   rç   r"   r}   Þ  s    z
ATMT.statec                    s   | f‡ fdd„	}|S )Nc                    s(   t | dƒsi | _tj| _ˆ | j|j< | S )NrÄ   )ÚhasattrrÐ   rÒ   ÚACTIONrÄ   rÍ   )rä   Úcond©r‹   r   r"   rè     s
    
zATMT.action.<locals>.decor   )rë   r‹   rè   r   rì   r"   Úactionþ  s    zATMT.actionc                    s   | f‡ fdd„	}|S )Nc                    s"   t j| _|j| _| j| _ˆ | _| S rN   )rÒ   Ú	CONDITIONrÄ   rÅ   rg   rÍ   rË   ©rä   r}   rì   r   r"   rè     s
    zATMT.condition.<locals>.decor   ©r}   r‹   rè   r   rì   r"   Ú	condition
  s    zATMT.conditionc                    s   | f‡ fdd„	}|S )Nc                    s"   t j| _|j| _| j| _ˆ | _| S rN   )rÒ   ÚRECVrÄ   rÅ   rg   rÍ   rË   rï   rì   r   r"   rè     s
    z$ATMT.receive_condition.<locals>.decor   rð   r   rì   r"   Úreceive_condition  s    zATMT.receive_conditionNc                    s   | f‡ ‡‡fdd„	}|S )Nc                    s.   t j| _|j| _| j| _ˆ| _ˆ| _ˆ | _| S rN   )	rÒ   ÚIOEVENTrÄ   rÅ   rg   rÍ   rÎ   rË   rÌ   rï   ©Úas_supersocketr;   r‹   r   r"   rè   )  s    zATMT.ioevent.<locals>.decor   )r}   r;   r‹   rö   rè   r   rõ   r"   Úioevent"  s    	zATMT.ioeventc                 C   s   | t |ƒfdd„}|S )Nc                 S   s*   t j| _|j| _|| _| | j_| j| _| S rN   ©rÒ   ÚTIMEOUTrÄ   rÅ   rÏ   rˆ   rg   rÍ   ©rä   r}   Útimeoutr   r   r"   rè   7  s    zATMT.timeout.<locals>.deco©r   )r}   rû   rè   r   r   r"   rû   4  s    zATMT.timeoutc                 C   s   | t ||dd�fdd„}|S )NT)r‹   rŒ   c                 S   s*   t j| _|j| _|| _| | j_| j| _| S rN   rø   rú   r   r   r"   rè   D  s    zATMT.timer.<locals>.decorü   )r}   rû   r‹   rè   r   r   r"   r    A  s    z
ATMT.timer)r   r   r   r   )r   )r   )r   )r   N)r   )rg   rh   ri   ræ   rê   rî   rò   rù   rô   rÛ   râ   rj   r}   rí   rñ   ró   r÷   rû   r    r   r   r   r"   rÒ   ¹  s6       ý  ý
rÒ   c                   @   s@   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdS )Ú_ATMT_CommandÚRUNÚNEXTÚFREEZEÚSTOPÚ	FORCESTOPÚENDÚ	EXCEPTIONÚ
SINGLESTEPÚ
BREAKPOINTÚ	INTERCEPTÚACCEPTÚREPLACEÚREJECTN)rg   rh   ri   rþ   rÿ   r   r  r  r  r  r  r  r  r  r	  r
  r   r   r   r"   rý   O  s   rý   c                   @   sJ   e Zd Zdd„ Zdd„ Zdd„ Zefdd„Zd	d
„ Ze	e
jfdd„ƒZdS )Ú_ATMT_supersocketc                 O   sj   || _ || _|| _tt dƒtt dƒ | _| _|| j| jfi|d< d|d< ||i |¤Ž| _| j ¡  d S )NÚspaÚspbÚexternal_fdTÚis_atmt_socket)	r;   r÷   Úprotor:   Úbytesr  r  ÚatmtÚrunbg)rC   r;   r÷   rÜ   r  ro   rº   r   r   r"   rD   `  s    	

ÿ
z_ATMT_supersocket.__init__c                 C   s   t |tƒst|ƒ}| j |¡S rN   )r›   r  r  rS   )rC   rf   r   r   r"   rS   t  s    
z_ATMT_supersocket.sendc                 C   s
   | j  ¡ S rN   )r  r   rG   r   r   r"   r   z  s    z_ATMT_supersocket.filenoc                 C   s,   | j  |¡}| jd ur(|d ur(|  |¡}|S rN   )r  r\   r  )rC   rZ   Úrr   r   r"   r\   ~  s    
z_ATMT_supersocket.recvc                 C   s8   | j s4| j ¡  | j ¡  | j ¡  | j ¡  d| _ d S r`   )r<   r  rÙ   Údestroyr  ra   r  rG   r   r   r"   ra   …  s    



z_ATMT_supersocket.closec                 C   s
   t | |ƒS rN   )r8   )re   r3   r   r   r"   r%   Ž  s    z_ATMT_supersocket.selectN)rg   rh   ri   rD   rS   r   r   r\   ra   rj   r   rk   r%   r   r   r   r"   r  _  s   	r  c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_ATMT_to_supersocketc                 C   s   || _ || _|| _d S rN   )r;   r÷   rÜ   )rC   r;   r÷   rÜ   r   r   r"   rD   •  s    z_ATMT_to_supersocket.__init__c                 O   s"   t | j| j| j|g|¢R i |¤ŽS rN   )r  r;   r÷   rÜ   )rC   r  ro   rº   r   r   r"   r»   ›  s    þþþz_ATMT_to_supersocket.__call__N)rg   rh   ri   rD   r»   r   r   r   r"   r  ”  s   r  c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚAutomaton_metaclassc              
      s  t t| ƒ | |||¡} i | _i | _i | _i | _i | _i | _g | _	g | _
g | _g | _i }| g}|r | d¡}|t|jƒ7 }t |j¡D ]\}}||vr„|||< q„q\dd„ t |¡D ƒ}	|	D ]œ}
|
jtjk�r.|
j}|
| j|< g | j|< g | j|< g | j|< tƒ | j|< |
j�r| j	 |
¡ |
j�rT| j
 |
¡ q¸|
jtjtjtjtjfv r¸g | j|
j < q¸|	D ]â}
|
jtjk�r€| j|
j  |
¡ nº|
jtjk�r¢| j|
j  |
¡ n˜|
jtjk�rê| j|
j  |
¡ | j |
j!¡ |
j"d u�r:| j |
¡ nP|
jtjk�r| j|
j  #|
j$¡ n,|
jtj%k�rZ|
j&D ]}| j|  |
¡ �q"�qZt' (t | j¡t | j¡t | j¡¡D ]}|j)dd„ d� �qdt | j¡D ]\‰ }|j)‡ fdd„d� �qˆ| jD ]*}t*| |j"t+|j"|j!t,t-d | ƒƒƒ �q®zdd l.}| /| j0¡| _1W n t2t3f�y   Y n0 t,t-d | ƒS )	Nr   c                 S   s   g | ]}t |d ƒr|‘qS )rÄ   )ré   )r    ru   r   r   r"   r#   ½  s   
ÿz/Automaton_metaclass.__new__.<locals>.<listcomp>c                 S   s   | j S rN   )rË   r¦   r   r   r"   r§   â  r$   z-Automaton_metaclass.__new__.<locals>.<lambda>)r¨   c                    s
   | j ˆ  S rN   )rÐ   r¦   ©Úcondnamer   r"   r§   ä  r$   Ú	Automaton)4Úsuperr  Ú__new__ÚstatesÚrecv_conditionsÚ
conditionsÚioeventsrû   ÚactionsÚinitial_statesÚstop_statesÚionamesÚiosupersocketsÚpopr'   Ú	__bases__rx   ry   rm   Ú
itervaluesrÄ   rÒ   ræ   rÅ   rž   rÆ   r)   rÈ   rî   rò   rù   rô   rÍ   rÎ   rÌ   r¡   rÏ   rê   rÐ   Ú	itertoolsÚchainrª   Úsetattrr  r   r   ÚinspectÚ	signatureÚ
parse_argsÚ__signature__ÚImportErrorÚAttributeError)Úclsr;   ÚbasesÚdctÚmembersÚclassesÚcrt   ru   Z	decoratedÚmrf   ÚcoZactlstÚioevr,  ©rµ   r  r"   r  ¤  s�    
ÿ







þ
ýÿzAutomaton_metaclass.__new__c              	   C   s   d| j j }d}t | j¡D ]Z}|jr6d|j | }q|jrL|d|j 7 }q|jrb|d|j 7 }q|j	r|d|j 7 }q||7 }t | j¡D ]:}|j
jj|j
jj D ] }|| jv r¤|d|j|f 7 }q¤qŒdd	„ | j ¡ D ƒd
d	„ | j ¡ D ƒ dd	„ | j ¡ D ƒ D ]x\}}}|D ]f}|jj|jj D ]N}|| jv �r&|j}	| j|j D ]}
|	d|
j 7 }	�qH|d|||	|f 7 }�q&�q�qt | j¡D ]ˆ\}}|D ]x}|jjj|jjj D ]\}|| jv �r®d|jj| ¡ f }	| j|jj D ]}
|	d|
j 7 }	�qà|d|||	f 7 }�q®�q–�qŠ|d7 }|S )Nzdigraph "%s" {
Ú z=	"%s" [ style=filled, fillcolor=blue, shape=box, root=true];
z8	"%s" [ style=filled, fillcolor=green, shape=octagon ];
z6	"%s" [ style=filled, fillcolor=red, shape=octagon ];
z@	"%s" [ style=filled, fillcolor=orange, shape=box, root=true ];
z	"%s" -> "%s" [ color=green ];
c                 S   s   g | ]\}}d ||f‘qS )Úpurpler   rs   r   r   r"   r#     r$   z3Automaton_metaclass.build_graph.<locals>.<listcomp>c                 S   s   g | ]\}}d ||f‘qS )Úredr   rs   r   r   r"   r#     r$   c                 S   s   g | ]\}}d ||f‘qS )Zoranger   rs   r   r   r"   r#     r$   z\l>[%s]z&	"%s" -> "%s" [label="%s", color=%s];
z%s/%.1fsz'	"%s" -> "%s" [label="%s",color=blue];
z}
)rµ   rg   rx   r(  r  rÆ   rÅ   rÇ   rÉ   rÈ   rÊ   rÑ   Úco_namesÚ	co_constsr  Úitemsr  r   rÍ   r!  ry   rû   rˆ   rŽ   )rC   rf   ÚseÚstrZ   r7  rt   ru   rä   Úliner!   rŸ   r    r   r   r"   Úbuild_graphö  sT    
ÿþ ÿÿzAutomaton_metaclass.build_graphc                 K   s   |   ¡ }t|fi |¤ŽS rN   )rE  r   )rC   rº   rf   r   r   r"   Úgraph"  s    zAutomaton_metaclass.graph)rg   rh   ri   r  rE  rF  Ú__classcell__r   r   r;  r"   r  £  s   R,r  c                   @   sÞ  e Zd Zi ZdZi Zi Zi Zi Zi Z	g Z
g Zg Zg Zdd„ ZdVdd„Zdd	„ Zd
d„ Zdd„ ZG dd„ dƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG d d!„ d!eƒZG d"d#„ d#eƒZd$d%„ Zd&d'„ Z d(d)„ Z!d*d+„ Z"d,d-„ Z#d.d/„ Z$d0d1„ Z%d2d3„ Z&d4d5„ Z'd6d7„ Z(d8d9„ Z)d:d;„ Z*d<d=„ Z+d>d?„ Z,dWdAdB„Z-dXdDdE„Z.dFdG„ Z/e/Z0dHdI„ Z1dJdK„ Z2dYdLdM„Z3dZdNdO„Z4dPdQ„ Z5d[dRdS„Z6d\dTdU„Z7dS )]r  Nc           	      O   sº  |  di ¡}|  dtj¡| _|  dtj¡| _|  dd¡| _t ¡ | _	d | _
d | _tƒ | _tƒ | _d | _d| _|| _|| _t tddi ¡| _t tddi ¡| _tt d	ƒ| _tt d
ƒ| _i | _i | _tƒ | _| jj D ]´}| !|¡}t"|t#ƒsô||f}|\}}|d u �rtdƒ}n|  $|d ¡}|d u �r0tdƒ}n|  $d |¡}|| j|< || j|< ||_%||_%t&| j||  '||¡ƒ t&| j||  '||¡ƒ qÔ| j(D ]}t&| |t)t*| |ƒƒƒ �q�|  +¡  d S )Nr  ÚllZrecvsockr  Fr   ZIOnamespacer   ÚcmdinÚcmdoutÚioinÚioout),r&  r   ZL3socketÚsend_sock_classZL2listenÚrecv_sock_classr  Ú	threadingÚLockÚstartedÚthreadidÚbreakpointedr&   ÚbreakpointsÚinterception_pointsÚintercepted_packetÚdebug_levelÚ	init_argsÚ
init_kargsrz   r  ÚioZoir:   rl   rI  rJ  rK  rL  r   Úpacketsrµ   r$  rŽ   r›   ÚtupleÚ_IO_fdwrapperÚionamer+  Ú	_IO_mixerr  r²   r(   Ústart)	rC   ro   rº   r  rZ   ZextfdrK  rL  Zstnamer   r   r"   rD   7  sT    









ÿzAutomaton.__init__r   r   c                 K   s"   || _ |rtjt_|| _|| _d S rN   )rW  ÚloggingÚDEBUGr   ZlogLevelÚsocket_kargsÚstore_packets)rC   ÚdebugÚstorerº   r   r   r"   r.  h  s
    zAutomaton.parse_argsc                 C   s   dS r`   r   ©rC   r{   r   r   r"   Úmaster_filterp  s    zAutomaton.master_filterc                 C   s   | j  |¡ d S rN   )Ú	send_sockrS   rg  r   r   r"   Úmy_sendt  s    zAutomaton.my_sendc                 C   s<   t  | j¡D ]*\}}|D ]}|jj|kr|    S qqd S rN   )rx   ry   rû   rˆ   rÍ   )rC   r;   rq   rŸ   r    r   r   r"   Útimer_by_namex  s
    zAutomaton.timer_by_namec                   @   s@   e Zd Zdd„ Zdd„ Zddd„Zdd	„ Zdd
d„Zdd„ ZdS )zAutomaton._IO_fdwrapperc                 C   sL   |d urt |ttfƒs| ¡ }|d ur<t |ttfƒs<| ¡ }|| _|| _d S rN   )r›   r,   r:   r   ÚrdÚwr©rC   rl  rm  r   r   r"   rD   ‚  s    z Automaton._IO_fdwrapper.__init__c                 C   s,   t | jtƒr| j ¡ S t | jtƒr(| jS dS rH   )r›   rl  r:   r   r,   rG   r   r   r"   r   Ž  s
    
zAutomaton._IO_fdwrapper.filenoéÿÿ  c                 C   s6   t | jtƒr| j |¡S t | jtƒr2t | j|¡S d S rN   )r›   rl  r:   r\   r,   r=   rY   r^   r   r   r"   rY   –  s
    zAutomaton._IO_fdwrapper.readc                 C   s6   t | jtƒr| j |¡S t | jtƒr2t | j|¡S dS rH   )r›   rm  r:   rS   r,   r=   rP   ©rC   Úmsgr   r   r"   rP   ž  s
    zAutomaton._IO_fdwrapper.writec                 C   s
   |   |¡S rN   )rY   r^   r   r   r"   r\   ¦  s    zAutomaton._IO_fdwrapper.recvc                 C   s
   |   |¡S rN   )rP   rp  r   r   r"   rS   ª  s    zAutomaton._IO_fdwrapper.sendN)ro  )ro  )	rg   rh   ri   rD   r   rY   rP   r\   rS   r   r   r   r"   r]  �  s   

r]  c                   @   s@   e Zd Zdd„ Zdd„ Zddd„Zddd	„Zd
d„ Zdd„ ZdS )zAutomaton._IO_mixerc                 C   s   || _ || _d S rN   )rl  rm  rn  r   r   r"   rD   ¯  s    zAutomaton._IO_mixer.__init__c                 C   s   t | jtƒr| j ¡ S | jS rN   )r›   rl  r:   r   rG   r   r   r"   r   ·  s    
zAutomaton._IO_mixer.filenoNc                 C   s   | j  |¡S rN   )rl  r\   r^   r   r   r"   r\   ½  s    zAutomaton._IO_mixer.recvc                 C   s
   |   |¡S rN   r]   r^   r   r   r"   rY   Á  s    zAutomaton._IO_mixer.readc                 C   s   | j  |¡S rN   )rm  rS   rp  r   r   r"   rS   Å  s    zAutomaton._IO_mixer.sendc                 C   s
   |   |¡S rN   rT   rp  r   r   r"   rP   É  s    zAutomaton._IO_mixer.write)N)N)	rg   rh   ri   rD   r   r\   rY   rS   rP   r   r   r   r"   r_  ®  s   

r_  c                   @   s   e Zd Zddd„ZdS )zAutomaton.AutomatonExceptionNc                 C   s   t  | |¡ || _|| _d S rN   )rÛ   rD   r}   r|   )rC   rq  r}   r|   r   r   r"   rD   Î  s    z%Automaton.AutomatonException.__init__)NN©rg   rh   ri   rD   r   r   r   r"   ÚAutomatonExceptionÍ  s   rs  c                   @   s   e Zd ZdS )zAutomaton.AutomatonErrorN©rg   rh   ri   r   r   r   r"   ÚAutomatonErrorÔ  s   ru  c                   @   s   e Zd ZdS )zAutomaton.ErrorStateNrt  r   r   r   r"   Ú
ErrorState×  s   rv  c                   @   s   e Zd ZdS )zAutomaton.StuckNrt  r   r   r   r"   ÚStuckÚ  s   rw  c                   @   s   e Zd ZdS )zAutomaton.AutomatonStoppedNrt  r   r   r   r"   ÚAutomatonStoppedÝ  s   rx  c                   @   s   e Zd ZdS )zAutomaton.BreakpointNrt  r   r   r   r"   Ú
Breakpointà  s   ry  c                   @   s   e Zd ZdS )zAutomaton.SinglestepNrt  r   r   r   r"   Ú
Singlestepã  s   rz  c                   @   s   e Zd Zddd„ZdS )zAutomaton.InterceptionPointNc                 C   s   t jj| |||d� || _d S )N©r}   r|   )r  rx  rD   Úpacket)rC   rq  r}   r|   r|  r   r   r"   rD   ç  s    z$Automaton.InterceptionPoint.__init__)NNNrr  r   r   r   r"   ÚInterceptionPointæ  s   r}  c                   @   s   e Zd ZdS )zAutomaton.CommandMessageNrt  r   r   r   r"   ÚCommandMessageì  s   r~  c                 C   s   | j |krt |¡ d S rN   )rW  r   re  )rC   Zlvlrq  r   r   r"   re  ð  s    
zAutomaton.debugc                 C   s  | j j | jv rÔ|  dd| ¡  ¡ || _| j ttj	| j |d�¡ | j
 ¡ }|s`|  dd¡ d S d | _|jtjkr‚|  dd¡ d S |jtjkrª|j}|  dd| ¡  ¡ n*|jtjkrÄ|  dd¡ n|  d|j ¡‚|  |¡ |  dd	| ¡  ¡ | j�r
| j | ¡ ¡ d S )
Né   z!INTERCEPT: packet intercepted: %s)rz   r}   r{   Ú	CANCELLEDzINTERCEPT: packet rejectedz!INTERCEPT: packet replaced by: %szINTERCEPT: packet acceptedzINTERCEPT: unknown verdict: %rz	SENT : %s)r}   rU  re  ÚsummaryrV  rJ  rS   rl   rý   r  rI  r\   rz   r
  r	  r{   r  ru  rj  rd  r[  r)   Úcopy)rC   r{   Úcmdr   r   r"   rS   õ  s4    ÿÿ

zAutomaton.sendc                 C   s   | S rN   r   rG   r   r   r"   r±     s    zAutomaton.__iter__c                 C   s   |   ¡  |  ¡  d S rN   )rÙ   r  rG   r   r   r"   rd     s    zAutomaton.__del__c              
   O   s4  z2|   dd|j|jf ¡ || g|¢R i |¤Ž W nä tjyÖ } zŠ|   dd|j|j|jf ¡ |jtjkr‚| jr‚| j 	|d ¡ | j
|j D ]0}|   dd|j ¡ || g|j¢R i |j¤Ž qŽ‚ W Y d }~nbd }~0  t�y } z(|   dd|j|j|f ¡ ‚ W Y d }~n"d }~0 0 |   dd|j|jf ¡ d S )	Né   zTrying %s [%s]é   z%s [%s] taken to state [%s]r   z   + Running action [%s]z%s [%s] raised exception [%s]z%s [%s] not taken)re  rÄ   rÍ   rÒ   râ   r}   rò   rd  r[  r)   r!  rg   rÞ   rß   rÛ   )rC   rë   ro   rº   Ú	state_reqrí   Úer   r   r"   Ú_run_condition  s     zAutomaton._run_conditionc                 O   s<   t  ¡ }t j| j|f| |dd�}d|_| ¡  | ¡  d S )Nzscapy.automaton _do_start)Útargetro   Úkwargsr;   T)rO  ÚEventÚThreadÚ_do_controlÚdaemonr`  Úwait)rC   ro   rº   ÚreadyZ_tr   r   r"   Ú	_do_start0  s    üzAutomaton._do_startc                 O   s  | j ��ú t ¡ j| _| jd u r&d| _|| jt|ƒd …  }| j ¡ }| 	|¡ | j
|i |¤Ž | jd | ƒ| _| jf i | j¤Ž| _| jr | jf i | j¤Ž| _nd | _td| jj d�| _d}|  ¡ }|  dd| j ¡ | ¡  �z*| j ¡ }|d u �r
W W d   ƒ d S |  dd|j ¡ |jtjk�r0d	}nn|jtjk�rDd}nZ|jtj k�rVqänH|jtj!k�rŒ| j"�r
| j"d | ƒ| _|  ¡ }n�q
n|jtj#k�rž�q
t$|ƒ}	t%|	| j&ƒ�r¸qän*t%|	| j'ƒ�rât(tj)|	d
�}| j* +|¡ qä|�ržt(tj,|	d
�}| j* +|¡ qä�qžqäW nž t-t.f�y@   t(tj/| j0d�}| j* +|¡ Y nl t1�yª }
 zRt2 3¡ }|  dd| jd 4t5j6|Ž ¡f ¡ t(tj7|
|d�}| j* +|¡ W Y d }
~
n
d }
~
0 0 |  dd| j ¡ d | _t8| dd ƒ�rÜ| j 9¡  t8| dd ƒ�rô| j 9¡  W d   ƒ n1 �s
0    Y  d S )Nr   zsession[%s])r;   Tr  z Starting control thread [tid=%i]r„  zReceived command %sF)rz   r}   )rz   r|   z&Transferring exception from tid=%i:
%sr<  )rz   Ú	exceptionr~   z Stopping control thread (tid=%i)Úlisten_sockri  ):rQ  rO  Úcurrent_threadÚidentrR  rX  r-   rY  r‚  rn   r.  r"  r}   rM  rc  ri  r  rN  r“  r   rµ   rg   r[  Ú_do_iterre  r&   rI  r\   rz   rý   rþ   rÿ   r   r  r#  r  Únextr›   r~  ry  rl   r  rJ  rS   r  ÚStopIterationÚRuntimeErrorr  Úfinal_state_outputrÛ   Úsysr~   rw   Ú	tracebackÚformat_exceptionr  r(   ra   )rC   r�  ro   rº   Úart   Z
singlestepÚiteratorr7  r}   r‡  r~   r8  r   r   r"   r�  =  s~    






ÿ""
zAutomaton._do_controlc              
   c   s–  �z>|   dd| jj ¡ | jj| jv rZ| jj| jkrZ| jj| _| jd| jj | jjd�V  d | _| j ¡ }| jjr’| jd| jj|f || jjd�‚| jjr¦|| _	W d S |d u r´d}nt
|tƒsÄ|f}| j| jj }t| jgdƒ�sb| j| jj D ]}| j|g|¢R Ž  qðt| j| jj ƒdk�rbt| j| jj ƒdk�rb| ¡ dk�rb| jd	| jj | jj|d
�‚| ¡  t ¡ }| jg}| j�rž| j| jj �rž| | j¡ | j| jj D ]}| | j|j ¡ �q¬t ¡ }| || ¡ |}| ¡ D ]}| j|jg|¢R Ž  �qè| ¡ }	|   dd| ¡ t||	ƒ}
|   dd|
 ¡ |
D ]þ}|   dd| ¡ || jk�rh|   d¡V  nÎ|| jk�rì| j !t"¡}|d u�r6|  #|¡�rÖ|   dd| $¡  ¡ | j| jj D ]}| j||g|¢R Ž  �q¸n|   dd| $¡  ¡ nJ|   dd|j% ¡ | j| jj D ](}|j|j%k�r| j||g|¢R Ž  �q�q:�qÆW q  t&j'�yŽ } z2|   dd| jj|jf ¡ || _|V  W Y d }~q d }~0 0 q d S )Nr   z## state=[%s]z breakpoint triggered on state %srá   zReached %s: [%r])r|   r}   r   r   zstuck in [%s]r{  r„  zSelect on %rzSelected %rzLooking at %rzReceived command messager  z	RECVD: %sé   z	FILTR: %szIOEVENT on %sr…  zswitching from [%s] to [%s])(re  r}   rT  rS  ry  rà   rØ   rv  rÚ   rš  r›   r'   rû   r8   rI  r  rˆ  r-   r  r   r°   rw  r£   rŠ   r“  r)   rK  rÎ   r¤   r¬   rˆ   r¯   r~  r\   r   rh  r�  r^  rÒ   râ   )rC   Zstate_outputrŸ   rë   Ztime_previousÚfdsr:  Ztime_currentr    r3   r  Úfdr{   ZrcvcondZioevtr†  r   r   r"   r–  ‹  sŠ    
ÿ
ÿ
ÿ
þþ

$zAutomaton._do_iterc                 C   s   d| j jddg| j ¡  f S )Nz<Automaton %s [%s]>ZHALTEDÚRUNNING)rµ   rg   rQ  ÚlockedrG   r   r   r"   rc   à  s    þzAutomaton.__repr__c                 G   s*   |D ] }t |dƒr|j}| j |¡ qd S ©NrÅ   )ré   rÅ   rU  r*   ©rC   ZiptsZiptr   r   r"   r¾   è  s    
z!Automaton.add_interception_pointsc                 G   s*   |D ] }t |dƒr|j}| j |¡ qd S r¥  )ré   rÅ   rU  Údiscardr¦  r   r   r"   rÂ   ï  s    
z$Automaton.remove_interception_pointsc                 G   s*   |D ] }t |dƒr|j}| j |¡ qd S r¥  )ré   rÅ   rT  r*   ©rC   ZbpsÚbpr   r   r"   r¼   ö  s    
zAutomaton.add_breakpointsc                 G   s*   |D ] }t |dƒr|j}| j |¡ qd S r¥  )ré   rÅ   rT  r§  r¨  r   r   r"   rÀ   ý  s    
zAutomaton.remove_breakpointsc                 O   s&   | j  ¡ rtdƒ‚| j|i |¤Ž d S )NzAlready started)rQ  r¤  r®   r‘  r¹   r   r   r"   r`    s    
zAutomaton.startTc                 C   s$  |d u rt tjd�}| j |¡ |�r z| j ¡ }|d u r@W d S W n( tyj   | j t tjd�¡ Y d S 0 |j	tj
kr~|jS |j	tjkr¢| jd|jj|jd�‚n~|j	tjkrÊ| jd|jj |jjd�‚nV|j	tjkrò| jd|jj |jjd�‚n.|j	tjk�r t |jd |jd |jd	 ¡ d S )
N©rz   zpacket intercepted)r}   r|  zsinglestep state=[%s]rá   z"breakpoint triggered on state [%s]r   r   r…  )rl   rý   rþ   rI  rS   rJ  r\   ÚKeyboardInterruptr   rz   r  r|   r  r}  r}   r{   r  rz  r  ry  r  rx   Úreraiser~   )rC   Úresumer�  r7  r   r   r"   rà     s,    

 zAutomaton.runFc                 C   s   |   ||¡ d S rN   )rà   )rC   r­  r�  r   r   r"   r  '  s    zAutomaton.runbgc                 C   s   | j ttjd�d�S )Nrª  )r­  )rà   rl   rý   rÿ   rG   r   r   r"   r—  +  s    zAutomaton.nextc                 C   s   | j | jfD ]}| ¡  qd S rN   )rI  rJ  r_   )rC   rƒ  r   r   r"   Ú_flush_inout0  s    zAutomaton._flush_inoutc                 C   sb   | j  ¡ rtdƒ‚|  ¡  | j ¡  | j ¡  t | j	 
¡ | j 
¡ ¡D ]}t|tƒrF| ¡  qFdS )z±
        Destroys a stopped Automaton: this cleanups all opened file descriptors.
        Required on PyPy for instance where the garbage collector behaves differently.
        z6Can't close running Automaton ! Call stop() beforehandN)rQ  r¤  r®   r®  rI  ra   rJ  r)  r*  rK  ÚvaluesrL  r›   r:   )rC   r6   r   r   r"   r  6  s    



zAutomaton.destroyc                 C   sb   z| j  ttjd�¡ W n ty*   Y n0 |r^| j� |  ¡  W d   ƒ n1 sT0    Y  d S ©Nrª  )rI  rS   rl   rý   r  ÚOSErrorrQ  r®  ©rC   r�  r   r   r"   rÙ   G  s    zAutomaton.stopc                 C   sb   z| j  ttjd�¡ W n ty*   Y n0 |r^| j� |  ¡  W d   ƒ n1 sT0    Y  d S r°  )rI  rS   rl   rý   r  r±  rQ  r®  r²  r   r   r"   Ú	forcestopQ  s    zAutomaton.forcestopc                 O   s   |   ¡  | j|i |¤Ž d S rN   )rÙ   r`  r¹   r   r   r"   Úrestart[  s    zAutomaton.restartc                 C   s4   t ƒ }|d u rtj|_ntj|_||_| j||d�S )N©r­  r�  )rl   rý   r  rz   r	  r{   rà   )rC   r{   r�  Úrsmr   r   r"   Úaccept_packet`  s    
zAutomaton.accept_packetc                 C   s   t tjd�}| j||d�S )Nrª  rµ  )rl   rý   r
  rà   )rC   r�  r¶  r   r   r"   Úreject_packetm  s    zAutomaton.reject_packet)r   r   )NT)NF)T)T)NF)F)8rg   rh   ri   r  r}   r  r  r   rû   r!  r"  r#  r$  r%  rD   r.  rh  rj  rk  r]  r_  rÛ   rs  ru  rv  rw  rx  ry  rz  r}  r~  re  rS   r±   rd   rˆ  r‘  r�  r–  rc   r¾   rÂ   r¼   rÀ   r`  rà   r  r—  Ú__next__r®  r  rÙ   r³  r´  r·  r¸  r   r   r   r"   r  (  sr   1
	-NU  þ





  þ
 ÿr  )DÚ__doc__r.   r)  ra  r=   rE   r›  rO  rŠ   rœ  Útypesr%   Úcollectionsr   Zscapy.configr   Zscapy.utilsr   Zscapy.errorr   r   Zscapy.plistr   Z
scapy.datar   Zscapy.supersocketr	   Zscapy.packetr
   Zscapy.constsr   Zscapy.libs.sixZlibsrx   Zscapy.compatr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r9   Úadd_metaclassr:   rl   r   rž   r²   r‡   rÒ   rý   r  r  rz   r  r  r   r   r   r"   Ú<module>   sP   LLoG/$ 5 