U
    $Pfz                     @   s8  d dl mZ d dlZd dlZd dlZddlmZmZ ddlm	Z	 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dd Zdd ZeZdd Zdd Zdd Zdd Zdd ZeddZedd Zedd!Zedd"d#d$iZejeejeejeejeiZG d%d& d&eZe Z G d'd( d(eZ!dS ))    )unicode_literalsN   )
compat_strcompat_struct_unpack)ExtractorErrorc                 c   sP  | dd dkr$t d| d d  | d d dkrHt| dd  }ntd| d d  td|d d d	 d? }d
d|  d d }|d d }|t|k rLtd|||d  d	 }|d7 }|d? }|d@ }|dkrtd|||d  d	 }|d7 }|| t|ks,td|||t|f |||||  fV  ||7 }qd S )Nr      s   WSzNot an SWF file; header is %r   C   z!Unsupported compression format %rz!Br               z<H   ?   z<Iz7Tag %d ends at %d+%d - that's longer than the file (%d))r   zlib
decompressNotImplementedErrorr   lenAssertionError)file_contentscontentZframesize_nbitsZframesize_lenposZheader16tag_codeZtag_len r   8/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/swfinterp.py_extract_tags   s:    

r   c                   @   s   e Zd Zdd Zdd ZdS )_AVMClass_Objectc                 C   s
   || _ d S N)	avm_classselfr   r   r   r   __init__0   s    z_AVMClass_Object.__init__c                 C   s   d| j jt| f S )Nz%s#%x)r   nameidr    r   r   r   __repr__3   s    z_AVMClass_Object.__repr__N__name__
__module____qualname__r!   r%   r   r   r   r   r   /   s   r   c                       s(   e Zd Z fddZ fddZ  ZS )
_ScopeDictc                    s   t t|   || _d S r   )superr*   r!   r   r   	__class__r   r   r!   8   s    z_ScopeDict.__init__c                    s   d| j jtt|  f S )Nz%s__Scope(%s))r   r"   r+   r*   r%   r$   r,   r   r   r%   <   s    z_ScopeDict.__repr__)r'   r(   r)   r!   r%   __classcell__r   r   r,   r   r*   7   s   r*   c                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )	_AVMClassNc                 C   sF   || _ || _i | _i | _i | _i | _|r,|ni | _t| | _i | _	d S r   )
name_idxr"   method_namesmethod_idxsmethodsmethod_pyfunctionsstatic_propertiesr*   	variables	constants)r    r0   r"   r5   r   r   r   r!   C   s    
z_AVMClass.__init__c                 C   s   t | S r   )r   r$   r   r   r   make_objectO   s    z_AVMClass.make_objectc                 C   s
   d| j  S )Nz_AVMClass(%s)r"   r$   r   r   r   r%   R   s    z_AVMClass.__repr__c                 C   s2   | j |  | jtdd | D  d S )Nc                 s   s   | ]\}}||fV  qd S r   r   ).0r"   idxr   r   r   	<genexpr>W   s   z-_AVMClass.register_methods.<locals>.<genexpr>)r1   updateitemsr2   dict)r    r3   r   r   r   register_methodsU   s    z_AVMClass.register_methods)N)r'   r(   r)   r!   r8   r%   r@   r   r   r   r   r/   B   s   
r/   c                   @   s   e Zd Zdd Zdd ZdS )
_Multinamec                 C   s
   || _ d S r   kind)r    rC   r   r   r   r!   ]   s    z_Multiname.__init__c                 C   s
   d| j  S )Nz[MULTINAME kind: 0x%x]rB   r$   r   r   r   r%   `   s    z_Multiname.__repr__Nr&   r   r   r   r   rA   \   s   rA   c                 C   sj   d}d}t dD ]T}| d}t|dks.ttd|d }||d@ |> B }|d@ dkr\ qf|d7 }q|S )Nr   r
   r   <B      r   )rangereadr   r   r   )readerresshift_bufbr   r   r   	_read_intd   s    

rO   c                 C   s   t | }|d@ dkst|S )Nl      ` r   )rO   r   )rI   rJ   r   r   r   _u30r   s    rP   c                 C   s&   t | }|d@ dkr"|dA d  }|S )Nl        r   l    r   )rO   )rI   vr   r   r   _s32{   s    rR   c                 C   sH   |  d}t|dkstt|dd dkr2dnd}td|| d S )Nr   r   rF          z<ir   )rH   r   r   ordr   )rI   bsZ	last_byter   r   r   _s24   s    
rW   c                 C   s,   t | }| |}t||ks"t|dS )Nzutf-8)rP   rH   r   r   decode)rI   slenresbr   r   r   _read_string   s    
r[   c                 C   s*   | dkst || }t|| ks&t |S Nr   )r   rH   r   )countrI   rZ   r   r   r   _read_bytes   s    
r^   c                 C   s   t d| d}td|d }|S )Nr   )rI   rD   r   )r^   r   )rI   rZ   rJ   r   r   r   
_read_byte   s    r_   z(no name idx)StringZ	ByteArrayTimerZ
TimerEventZTIMERZtimerc                   @   s,   e Zd Zdd ZeZdd Zdd ZeZdS )
_Undefinedc                 C   s   dS )NFr   r$   r   r   r   __bool__   s    z_Undefined.__bool__c                 C   s   dS r\   r   r$   r   r   r   __hash__   s    z_Undefined.__hash__c                 C   s   dS )N	undefinedr   r$   r   r   r   __str__   s    z_Undefined.__str__N)r'   r(   r)   rc   __nonzero__rd   rf   r%   r   r   r   r   rb      s
   rb   c                   @   s.   e Zd Zdd Zdd ZdddZdd	 Zd
S )SWFInterpreterc           4         s  t dfdd i_tdd t|D }|ddd }t||d    fd	d fd
d} fdd} fdd} fdd|d  }dg_td|D ]}j	|  qdg_
 }	td|	D ]}j
	|  q҈ }
|td|
d d   }dg_td|D ]}t }j	| q }td|D ]}|d   qF }td|D ]"} }t|D ]}  q~ql }ddddddddddd
}dg_td|D ]} }||kstd| |dkr   }j	j|  nT|dkr6 }  j	j|  n*j	t| t|| D ]}  qRq }tdddg}g }t|D ]} }  t|D ]}  q   }|d@ dkr }t|D ]}  |d q|d@ dkrt|D ]}  q ||d@ dk|d@ dk}|	| q }t|D ].}   } t| D ]}    q\qDfdd}! }"g }#t|"D ]}$ }j| }%t||%}&|#	|&    }|d@ dkrވ   }'t|'D ]}  q   }(t|(D ],}|! \})}*|&|) |*r|&j|* qqt|#|"ksRttdd |#D _|#D ]J}& |&_ }(t|(D ],}|! \})}*|&|) |*r|&j|* qqj }+t|+D ](}   }(t|(D ]}|!  qܐqĈ },tdddg}-g _t|,D ]} }.   }/     }0||0}1|-|1|/}2j	|2 |#D ]"}&|.|&jkr\|2|&j|&j|. < q\ }3t|3D ]$}          q }(t|(D ]}|!  qq|   t|kstd S ) NZaddEventListenerc                 S   s   t S r   )re   )paramsr   r   r   <lambda>       z)SWFInterpreter.__init__.<locals>.<lambda>c                 s   s   | ]\}}|d kr|V  qdS )R   Nr   )r:   r   tagr   r   r   r<      s   z*SWFInterpreter.__init__.<locals>.<genexpr>rT   r   r   c                     s   t | d iS NrI   rP   argscode_readerr   r   rj      rk   c                     s   t | d iS rn   )rR   rp   rr   r   r   rj      rk   c                     s   t | d iS rn   )_u32rp   rr   r   r   rj      rk   c                     s   t | d iS rn   )r^   rp   rr   r   r   rj      rk   c                     s   t | d iS rn   )r_   rp   rr   r   r   rj      rk   r   r	    r   )
r                  	            zInvalid multiname kind %rr   r{   
MethodInfoZNEED_ARGUMENTSZ	NEED_RESTrF   c                     sX   }   }|d@ }|d? }i }d }|dkrN     }|dkrL   n|dkr     }d}|dkrz  }|dkrj | }n|dkrj| }ni d fS j|  |i}nl|dkrވ   }	|	|j|  < nH|dkr    n2|dkr   }
j|  ||
< ntd	| |d@ dkrP }t|D ]}  qB||fS )
Nrw   r   r   r   anyr   )r   r   r   r
   zUnsupported trait kind %d)constant_intsconstant_uints
multinamesr   rG   )Ztrait_name_idxZ	kind_fullrC   attrsr3   r7   ZvindexZvkindvalue
method_idxZfunction_idxmetadata_countZ_c3)	read_byter    u30r   r   parse_traits_info*  sT    

z2SWFInterpreter.__init__.<locals>.parse_traits_infoc                 s   s   | ]}|j |fV  qd S r   r9   )r:   cr   r   r   r<   t  s     Methodcodelocal_count)
TimerClass_patched_functionsnextr   indexioBytesIOr   rG   appendr   maxconstant_stringsr[   r   r   rA   collections
namedtupler/   r@   r7   r=   r   r?   _classes_by_name	cinit_idx_all_methodsr2   r3   tell)4r    r   Zcode_tagpZs32u32
read_bytesZ	int_countZ_cZ
uint_countZdouble_countZstring_countsZnamespace_countZns_set_countr]   Z_c2Zmultiname_countZMULTINAME_SIZESrC   r0   Zmethod_countr   Zmethod_infosZ	method_idZparam_countrL   flagsZoption_countr   mir   Z
item_countr   Zclass_countclassesZclass_idcnamer   Zintrf_countZtrait_countZtrait_methodsZtrait_constantsZscript_countZmethod_body_countr   r   r   Zcode_lengthr   mZexception_countr   )rs   r   r    r   r   r!      s@    




1









zSWFInterpreter.__init__c                 C   s   || j ||f< d S r   )r   )r    r   	func_namefr   r   r   patch_function  s    zSWFInterpreter.patch_functionTc                 C   sx   z| j | }W n  tk
r.   td| Y nX |rtt|drt|d|ji | j|j |jd< | |d}|g  |S )NzClass %r not foundr   z$cinit)	r   KeyErrorr   hasattrr@   r   r   r3   extract_function)r    
class_nameZ
call_cinitrJ   Zcinitr   r   r   extract_class  s    zSWFInterpreter.extract_classc                    s   j  |f}|r|S | jkr, j| S |jkrDj|  S | jkr`td j|f  j|  fdd}| j|< |S )NzCannot find function %s.%sc                    sR  t j  fdd} fdd}jgt|  d gj  }g tjj	jg}t
 }|dkrlqZ|dkr| }   |  qZ|dkr| } }|r   |  qZ|dkr| } }|s   |  qZ|dkr(| } } }	||	krL   |  qZ|d	krf| } } }	||	krL   |  qZ|d
kr| } } }	|	|k rL   |  qZ|dkrd  qZ|dkrЈt qZ|dkrt
 }
|
 qZ|dkr
| }
|
 qZ|dkr d qZ|dkr6d qZ|dkrPtd qZ|dkrnd }| qZ|dkr| }j|  qZ|dkr }|| qZ|dkr| }ttfddt|D }  }|j }| qZ|dkr| }j| }| }ttfddt|D }  }|tkr|dkrt| dksftt| d  tttfst| d  tkrd!}nt| d  }| qZntd"| n t|tr |j|}|| }| qZnt|t!r  ||}|| }| qZnt|t"rj||jj#krR |j|}|| }n|| }| qZntt|tr:|d#krt| dkstt| d  tst| d  d$krt|}n|$| d  }| qZn^|d%krt| dkstt| d krd n| d  }t|ts tt%|| }| qZnt|tr|d&krt| dksbtt| d  tsvt|| d  d  }| qZnJ|d'krt| dkstt| d  tst| d  &|}| qZtd(||f qZ|d)krt}|S |d*kr }|S |d+krP| }ttfd,dt|D }  }qZ|d-kr| }| }ttfd.dt|D }  }j| }t|t!st|  qZ|d/kr| }j| }| }ttfd0dt|D }  }t|tr, |j|}|| }|tksZtqZt|t"rn||jj#ksJt |j|}|| }|tksZtqZ|d1krt|tst|'  ntd2||f qZ|d3kr| }g }t|D ]}|  q|d d d }| qZ|d4krj| }j| }t|D ]}||kr|} q6q|d  }||krZ|t(krZt(|  n||  qZ|d5kr| }j| }t|D ]}||kr|} qqj}| qZ|d6k	r6| }j| }t|D ]}||kr|} qq܈j}||k	r|| }n|t(k	r&t(| }nt}| qZ|d7k	r~| } }j| }t|t)	rl } }|||< qZ|d8k	r| }||  qZ|d9k	r| } }|||< qZ|d:k
r| }j| }|d;k
r }t|ttf
s tt| nt|t
r~ }t|t!
rF|j*| }| qZt|t+t"f
sftd<||f |,|t}| n> }t|t
st }t|t
st||  qZ|d=kr| } }j| }t|t)
r } }|||< qZ|d>kr, }t|}| qZ|d?kr>|  qZ|d@kr\ }| qZ|dAkrtd t-d tfsLtqZ|dBkr }t|tst|d  qZ|dCkr }td!tdtdDtdDit-| S |dEkr } }	|	| }| qZ|dFkr@ } }	|	| }| qZ|dGkrn } }	|	| }| qZ|dHkr } }	|	| }| qZ|dIkr } }	t|	tstt|tst|	|@ }| qZ|dJkr } }	|	|k}| qZ|dKkrF } }	|	|k}| qZ|dLkrx }t|tsht|d  qZ|dMkr|d   qZ|dNkr|d  qZ|dOkrƈ|dP  qZ|dQkr|dR  qZ|dSkr |d < qZ|dTkr |d< qZ|dUkr( |dP< qZ|dVkr@ |dR< qZtdW| qZd S )XNc                      s   t  S r   )rW   r   coderr   r   rj     rk   zBSWFInterpreter.extract_function.<locals>.resfunc.<locals>.<lambda>c                      s   t  S r   ro   r   r   r   r   rj     rk   r{   rx   ry   rz                !   $   %   &   T'   F(   NaN*   ,   0   B   c                    s   g | ]}   qS r   popr:   rL   stackr   r   
<listcomp>  s     zDSWFInterpreter.extract_function.<locals>.resfunc.<locals>.<listcomp>F   c                    s   g | ]}   qS r   r   r   r   r   r   r     s     r`   r   r   re   z)Function String.%s is not yet implementedsplitru   Z
charCodeAtslicejoinzUnsupported property %r on %rG   H   I   c                    s   g | ]}   qS r   r   r   r   r   r   r   d  s     J   c                    s   g | ]}   qS r   r   r   r   r   r   r   j  s     O   c                    s   g | ]}   qS r   r   r   r   r   r   r   x  s     reversez$Unsupported (void) property %r on %rV   ]   ^   `   a   b   c   f   lengthzAccessing member %r on %rh   s   rF               Number                                 r      r               zUnsupported opcode %d).r   r   r   r6   listr   r   dequer   r7   r_   seekr   r   r   re   floatr   reversedrG   r   r8   r   StringClassr   r   
isinstanceintr   rb   r   r   r   r/   r*   r1   r   rU   r   r   _builtin_classesrA   r5   r?   gettype)rq   Zs24r   Z	registersZscopesopcodeoffsetr   Zvalue2Zvalue1rQ   r;   Z	new_scope	arg_countobjrJ   r   ZmnamefuncZarrir   ZscopeZpnameZintvalueresultr   r   r    )r   r   r   resfunc  s     





















  





























































    















z0SWFInterpreter.extract_function.<locals>.resfunc)r   r   r4   r   r8   r3   r   r"   )r    r   r   r   r  r   r  r   r     s&    



 
   
zSWFInterpreter.extract_functionN)T)r'   r(   r)   r!   r   r   r   r   r   r   r   rh      s
    l
rh   )"
__future__r   r   r   r   compatr   r   utilsr   r   objectr   r?   r*   r/   rA   rO   rP   rt   rR   rW   r[   r^   r_   r   ZByteArrayClassr   ZTimerEventClassr"   r   rb   re   rh   r   r   r   r   <module>   sD   


    