3
©b`sc  ã               @   sZ  d dl m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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 ddd	d
d
ddddddœ
Zddddd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 G d'd(„ d(eƒZ!G d)d*„ d*eƒZ"dS )+é    )Úunicode_literalsNé   )ÚAudioConversionErrorÚPostProcessoré   )ÚencodeArgumentÚencodeFilenameÚget_exe_versionÚis_outdated_versionÚPostProcessingErrorÚprepend_extensionÚshell_quoteÚsubtitles_filenameÚdfxp2srtÚISO639UtilsÚreplace_extensionÚadtsÚflacZipodZmatroskaZmpegÚoggÚmpegtsÚasf)
Úaacr   Úm4aÚmkaÚmkvZmpgÚogvÚtsÚwmaÚwmvÚ
libmp3lamer   ZlibopusZ	libvorbis)Úmp3r   r   r   ÚopusÚvorbisÚwavc               @   s   e Zd ZdS )ÚFFmpegPostProcessorErrorN)Ú__name__Ú
__module__Ú__qualname__© r(   r(   úKC:\Users\Broad\Desktop\All-Down\binaries\youtube_dl\postprocessor\ffmpeg.pyr$   2   s   r$   c               @   s„   e Zd Zddd„Zdd„ Zeddd„ƒZdd	„ Zed
d„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚFFmpegPostProcessorNc             C   s   t j| |ƒ | jƒ  d S )N)r   Ú__init__Ú_determine_executables)ÚselfÚ
downloaderr(   r(   r)   r+   7   s    zFFmpegPostProcessor.__init__c             C   sZ   | j stdƒ‚| jdkrdnd}t| j| j |ƒrVd| j| j|f }| jrV| jj|ƒ d S )Nz/ffmpeg or avconv not found. Please install one.Úavconvz10-0z1.0zZYour copy of %s is outdated, update %s to version %s or newer if you encounter any errors.)Ú	availabler$   Úbasenamer
   Ú	_versionsÚ_downloaderÚreport_warning)r-   Úrequired_versionÚwarningr(   r(   r)   Úcheck_version;   s    z!FFmpegPostProcessor.check_versionc             C   s
   t | ƒjS )N)r*   r2   )r.   r(   r(   r)   Úget_versionsG   s    z FFmpegPostProcessor.get_versionsc                sØ  ddddg}d}dd„ ‰ d ˆ_ d ˆ_d ˆ_d ˆ_ˆj�r,ˆjjjddƒ}ˆjjjd	ƒ‰ˆd k	�r,tjj	ˆƒs†ˆjj
d
ˆ ƒ i ˆ_d S tjjˆƒ� sútjjtjj ˆƒƒd }||krØˆjj
dˆdj|ƒf ƒ i ˆ_d S tjjtjjˆƒƒ‰|dk� rúd}t‡fdd„|D ƒƒˆ_t‡ ‡fdd„|D ƒƒˆ_ˆjd k�rdt‡ fdd„|D ƒƒˆ_tdd„ |D ƒƒˆ_|dk�rtd}nd}x"|D ]}ˆj| �r~|ˆ_ P �q~W |dk�r¬d}nd}x"|D ]}ˆj| �r¶|ˆ_P �q¶W d S )NÚavprober/   ÚffmpegÚffprobeTc             S   sF   t | dgd�}|rBddg}x&|D ]}tj||ƒ}|r |jdƒ}q W |S )Nz-version)Úargsz'(?:\d+:)?([0-9.]+)-[0-9]+ubuntu[0-9.]+$zn([0-9.]+)$r   )r	   ÚreÚmatchÚgroup)ÚpathÚverÚregexsÚregexÚmobjr(   r(   r)   Úget_ffmpeg_versionO   s    
zFFFmpegPostProcessor._determine_executables.<locals>.get_ffmpeg_versionÚprefer_ffmpegÚffmpeg_locationzDffmpeg-location %s does not exist! Continuing without avconv/ffmpeg.r   zbCannot identify executable %s, its basename should be one of %s. Continuing without avconv/ffmpeg.z, c             3   s    | ]}|t jjˆ |ƒfV  qd S )N)Úosr@   Újoin)Ú.0Úp)Úlocationr(   r)   ú	<genexpr>z   s    z=FFmpegPostProcessor._determine_executables.<locals>.<genexpr>c             3   s    | ]}|ˆ ˆj | ƒfV  qd S )N)Ú_paths)rJ   rK   )rE   r-   r(   r)   rM   |   s    c             3   s   | ]}|ˆ |ƒfV  qd S )Nr(   )rJ   rK   )rE   r(   r)   rM      s    c             s   s   | ]}||fV  qd S )Nr(   )rJ   rK   r(   r(   r)   rM   €   s    F)r:   r;   )r/   r:   )r:   r/   )r9   r;   )r;   r9   )r1   Úprobe_basenamerN   r2   r3   ÚparamsÚgetrH   r@   Úexistsr4   ÚisdirÚsplitextrI   ÚdirnameÚabspathÚdict)r-   ZprogramsrF   r1   ZprefsrK   r(   )rE   rL   r-   r)   r,   K   sd    





z*FFmpegPostProcessor._determine_executablesc             C   s
   | j d k	S )N)r1   )r-   r(   r(   r)   r0   ”   s    zFFmpegPostProcessor.availablec             C   s   | j | j S )N)rN   r1   )r-   r(   r(   r)   Ú
executable˜   s    zFFmpegPostProcessor.executablec             C   s
   | j d k	S )N)rO   )r-   r(   r(   r)   Úprobe_availableœ   s    z#FFmpegPostProcessor.probe_availablec             C   s   | j | j S )N)rN   rO   )r-   r(   r(   r)   Úprobe_executable    s    z$FFmpegPostProcessor.probe_executablec             C   s~  | j  r| j rtdƒ‚y¶| j r6t| jdƒtdƒg}nt| jdƒtdƒg}|jt| j|ƒdƒƒ | j	j
jddƒrŠ| j	jd| jt|ƒf ƒ tj|tjtjtjd�}|jƒ \}}| j r¸d	nd
}|jƒ |krÌd S W n ttfk
ræ   d S X | j rò|n|jddƒ}| j �r^d }xn|jdƒD ]B}	|	jdƒ�r:|	jdƒd
 jƒ }n|	jƒ dk�r|d k	�r|S �qW ntjd|ƒ}
|
�rz|
jd
ƒS d S )Nz@ffprobe/avprobe and ffmpeg/avconv not found. Please install one.Tz-show_streamsz-iÚverboseFz[debug] %s command line: %s)ÚstderrÚstdoutÚstdinr   r   ÚasciiÚignoreÚ
zcodec_name=ú=zcodec_type=audiozNStream\s*#\d+:\d+(?:\[0x[0-9a-f]+\])?(?:\([a-z]{3}\))?:\s*Audio:\s*([0-9a-z]+))rY   r0   r   r   rZ   r   rX   ÚappendÚ_ffmpeg_filename_argumentr3   rP   rQ   Ú	to_screenr1   r   Ú
subprocessÚPopenÚPIPEÚcommunicateÚwaitÚIOErrorÚOSErrorÚdecodeÚsplitÚ
startswithÚstripr=   Úsearchr?   )r-   r@   ÚcmdÚhandleZstdout_dataZstderr_dataZexpected_retÚoutputZaudio_codecÚlinerD   r(   r(   r)   Úget_audio_codec¤   sF    



z#FFmpegPostProcessor.get_audio_codecc             C   s<  | j ƒ  tdd„ |D ƒƒ}|| jƒ 7 }g }x*|D ]"}|jtdƒt| j|ƒdƒgƒ q0W t| jdƒtdƒg}| jdkrˆ|tdƒtdƒg7 }||d	d
„ |D ƒ t| j|ƒdƒg 7 }| j	j
jddƒrÔ| j	jdt|ƒ ƒ tj|tjtjtjd�}|jƒ \}	}
|jdk�r*|
jddƒ}
|
jƒ jdƒd }t|ƒ‚| j|||ƒ d S )Nc             s   s   | ]}t jt|ƒƒjV  qd S )N)rH   Ústatr   Úst_mtime)rJ   r@   r(   r(   r)   rM   Ò   s    z@FFmpegPostProcessor.run_ffmpeg_multiple_files.<locals>.<genexpr>z-iTz-yr:   z	-loglevelzrepeat+infoc             S   s   g | ]}t |ƒ‘qS r(   )r   )rJ   Úor(   r(   r)   ú
<listcomp>á   s    zAFFmpegPostProcessor.run_ffmpeg_multiple_files.<locals>.<listcomp>r[   Fz[debug] ffmpeg command line: %s)r]   r\   r^   r   zutf-8Úreplacera   r   éÿÿÿÿ)r7   ÚminÚ_configuration_argsÚextendr   r   rd   rX   r1   r3   rP   rQ   re   r   rf   rg   rh   ri   Ú
returncoderm   rp   rn   r$   Ú	try_utime)r-   Zinput_pathsÚout_pathÚoptsZoldest_mtimeZ	files_cmdr@   rr   rK   r]   r\   Úmsgr(   r(   r)   Úrun_ffmpeg_multiple_filesÎ   s.    

&z-FFmpegPostProcessor.run_ffmpeg_multiple_filesc             C   s   | j |g||ƒ d S )N)r…   )r-   r@   r‚   rƒ   r(   r(   r)   Ú
run_ffmpegî   s    zFFmpegPostProcessor.run_ffmpegc             C   s   |dkrd| S |S )Nú-zfile:r(   )r-   Úfnr(   r(   r)   rd   ñ   s    z-FFmpegPostProcessor._ffmpeg_filename_argument)N)N)r%   r&   r'   r+   r7   Ústaticmethodr8   r,   Úpropertyr0   rX   rY   rZ   rv   r…   r†   rd   r(   r(   r(   r)   r*   6   s   
I* r*   c               @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
ÚFFmpegExtractAudioPPNFc             C   s.   t j| |ƒ |d krd}|| _|| _|| _d S )NÚbest)r*   r+   Ú_preferredcodecÚ_preferredqualityÚ_nopostoverwrites)r-   r.   ÚpreferredcodecÚpreferredqualityÚnopostoverwritesr(   r(   r)   r+   ú   s    zFFmpegExtractAudioPP.__init__c             C   sj   |d krg }nd|g}dg| | }yt j| |||ƒ W n, tk
rd } zt|jƒ‚W Y d d }~X nX d S )Nz-acodecz-vn)r*   r†   r$   r   r„   )r-   r@   r‚   ÚcodecÚ	more_optsZacodec_optsrƒ   Úerrr(   r(   r)   r†     s    zFFmpegExtractAudioPP.run_ffmpegc             C   s´  |d }| j |ƒ}|d kr"tdƒ‚g }| jdksL| j|ksL| jdkræ|dkræ|dkrp| jdkrpd}d}ddg}nt|d kržd}|}|dkr�ddg}|dkräd}nFd}d
}g }| jd k	rät| jƒdk rÒ|d| jg7 }n|d| jd g7 }n¸t| j }| j}g }| jd k	�rBt| jƒdk �r0|dk�r0|d| jg7 }n|d| jd g7 }| jdk�rZ|ddg7 }| jdk�rr|ddg7 }| jdk�r‚d}| jdk�ržd}|ddg7 }|jdƒ\}}}	|| | }
|
|d< ||d< |
|k�sî| j�rtj	j
t|
ƒƒ�r| jjd|
 ƒ g |fS y$| jjd|
 ƒ | j||
||ƒ W nT tk
�r\ } ztd|j ƒ‚W Y d d }~X n$ tk
�r~   td| j ƒ‚Y nX |jdƒd k	�rª| j|
tjƒ |d dd� |g|fS )!NÚfilepathz7WARNING: unable to obtain file audio codec with ffproberŒ   r   r   Úcopyz-bsf:aÚaac_adtstoascr   r    r"   r!   z-fr   r   r   é
   z-q:az-b:aÚkr#   Ú.Úextz.[ffmpeg] Post-process file %s exists, skippingz[ffmpeg] Destination: zaudio conversion failed: zerror running Úfiletimez!Cannot update utime of audio file)Zerrnote)r   rŒ   )r   r   r    r"   r!   )rv   r   r�   rŽ   ÚintÚACODECSÚ
rpartitionr�   rH   r@   rR   r   r3   re   r†   r   r„   Ú	Exceptionr1   rQ   r�   Útime)r-   Úinformationr@   Z	filecodecr”   ÚacodecÚ	extensionÚprefixÚseprœ   Únew_pathÚer(   r(   r)   Úrun  sz    
&



zFFmpegExtractAudioPP.run)NNNF)r%   r&   r'   r+   r†   rª   r(   r(   r(   r)   r‹   ù   s   
r‹   c                   s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚFFmpegVideoConvertorPPNc                s   t t| ƒj|ƒ || _d S )N)Úsuperr«   r+   Ú_preferedformat)r-   r.   Úpreferedformat)Ú	__class__r(   r)   r+   a  s    zFFmpegVideoConvertorPP.__init__c             C   sÈ   |d }|d | j kr4| jjd|| j f ƒ g |fS g }| j dkrT|jddddgƒ |jd	ƒ\}}}|| | j  }| jjdd|d | j f  | ƒ | j|||ƒ ||d< | j |d< | j |d< |g|fS )Nr–   rœ   zF[ffmpeg] Not converting video file %s - already is in target format %sÚaviz-c:vZlibxvidz-vtagZXVIDr›   ú[r:   z/] Converting video from %s to %s, Destination: Úformatz[ffmpeg)r­   r3   re   r   r    r†   )r-   r£   r@   Úoptionsr¦   r§   rœ   Zoutpathr(   r(   r)   rª   e  s    
"

zFFmpegVideoConvertorPP.run)NN)r%   r&   r'   r+   rª   Ú__classcell__r(   r(   )r¯   r)   r«   `  s   r«   c               @   s   e Zd Zdd„ ZdS )ÚFFmpegEmbedSubtitlePPc             C   sÄ  |d dkr | j jdƒ g |fS |jdƒ}|sB| j jdƒ g |fS |d }|d }g }g }d	}xz|jƒ D ]n\}}	|	d }
|dks�|dkr°|
d
kr°|j|ƒ |jt|||
|ƒƒ qh| rh|dkrh|
d
krhd}| j jdƒ qhW |sæg |fS |g| }ddddddddg}|d dk�r|ddg7 }xRt|ƒD ]F\}}|jdd|d  gƒ tj	|ƒ�pT|}|jd| d| gƒ �q(W t
|dƒ}| j jd| ƒ | j|||ƒ tjt|ƒƒ tjt|ƒt|ƒƒ ||fS )Nrœ   Úmp4Úwebmr   zA[ffmpeg] Subtitles can only be embedded in mp4, webm or mkv filesÚrequested_subtitlesz,[ffmpeg] There aren't any subtitles to embedr–   FÚvttTz<[ffmpeg] Only WebVTT subtitles can be embedded in webm filesz-mapÚ0z-cr—   z-0:sz-0:dz-c:sZmov_textz%d:0r   z-metadata:s:s:%dzlanguage=%sÚtempz$[ffmpeg] Embedding subtitles in '%s')r¶   r·   r   )r3   re   rQ   Úitemsrc   r   Ú	enumerater   r   Ú
short2longr   r…   rH   Úremover   Úrename)r-   r£   Ú	subtitlesÚfilenamerœ   Z	sub_langsÚsub_filenamesZwebm_vtt_warnÚlangZsub_infoZsub_extZinput_filesrƒ   ÚiZ	lang_codeÚtemp_filenamer(   r(   r)   rª   x  sN    



zFFmpegEmbedSubtitlePP.runN)r%   r&   r'   rª   r(   r(   r(   r)   rµ   w  s   rµ   c               @   s   e Zd Zdd„ ZdS )ÚFFmpegMetadataPPc                s  i ‰d2‡ ‡fdd„	}|dd3ƒ |ddƒ |d4dƒ |d	d
ƒ |ddƒ |dd5ƒ |dƒ |dƒ |dƒ |ddƒ ˆsŠ| j jdƒ g ˆ fS ˆ d }t|dƒ}|g}g }ˆ d dkrÄ|jdddgƒ n|jddgƒ x*ˆjƒ D ]\}}|jdd||f gƒ qÜW ˆ jd g ƒ}	|	�rÄt|d!ƒ}
tj|
d"d#d$��”}d%d&„ }d'}x^|	D ]V}|d(7 }|d)|d* d+  7 }|d,|d- d+  7 }|jdƒ}|�r>|d.||ƒ 7 }�q>W |j	|ƒ |j
|
ƒ |jd/d0gƒ W d Q R X | j jd1| ƒ | j|||ƒ |	�ròtj|
ƒ tjt|ƒƒ tjt|ƒt|ƒƒ g ˆ fS )6Nc                sl   |s| }t | ttfƒs| f} t |ttfƒs0|f}x6|D ].}ˆ j|ƒd k	r6x| D ]}ˆ | ˆ|< qNW P q6W d S )N)Ú
isinstanceÚlistÚtuplerQ   )Z	meta_listZ	info_listZinfo_fZmeta_f)ÚinfoÚmetadatar(   r)   Úaddµ  s    

z!FFmpegMetadataPP.run.<locals>.addÚtitleÚtrackÚdateÚupload_dateÚdescriptionÚcommentZpurlZwebpage_urlZtrack_numberÚartistÚcreatorÚuploaderÚuploader_idZgenreZalbumZalbum_artistZdiscZdisc_numberz([ffmpeg] There isn't any metadata to addr–   r»   rœ   r   z-vnz-acodecr—   z-cz	-metadataz%s=%sÚchaptersÚmetaÚwtzutf-8)Úencodingc             S   s   t jdd| ƒS )Nz(=|;|#|\\|\n)z\\\1)r=   Úsub)Útextr(   r(   r)   Úffmpeg_escapeâ  s    z+FFmpegMetadataPP.run.<locals>.ffmpeg_escapez;FFMETADATA1
z[CHAPTER]
TIMEBASE=1/1000
z	START=%d
Ú
start_timeiè  zEND=%d
Úend_timez	title=%s
z-map_metadataÚ1z [ffmpeg] Adding metadata to '%s')N)rÏ   rÎ   )rÒ   rÓ   )rÔ   rÕ   rÖ   r×   )r3   re   r   r   r¼   rQ   r   ÚioÚopenÚwriterc   r…   rH   r¿   r   rÀ   )r-   rË   rÍ   rÂ   rÆ   Zin_filenamesr³   ÚnameÚvaluerØ   Zmetadata_filenameÚfrÞ   Zmetadata_file_contentZchapterZchapter_titler(   )rË   rÌ   r)   rª   ²  s^    













zFFmpegMetadataPP.runN)r%   r&   r'   rª   r(   r(   r(   r)   rÇ   ±  s   rÇ   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚFFmpegMergerPPc             C   sd   |d }t |dƒ}ddddddg}| jjd| ƒ | j|d	 ||ƒ tjt|ƒt|ƒƒ |d	 |fS )
Nr–   r»   z-cr—   z-mapz0:v:0z1:a:0z"[ffmpeg] Merging formats into "%s"Z__files_to_merge)r   r3   re   r…   rH   rÀ   r   )r-   rË   rÂ   rÆ   r<   r(   r(   r)   rª   û  s    
zFFmpegMergerPP.runc             C   sP   | j dkrdS d}t| j| j  |ƒrLd| j | j |f }| jrH| jj|ƒ dS dS )Nr/   Tz10-0z°Your copy of %s is outdated and unable to properly mux separate video and audio files, youtube-dl will download single file media. Update %s to version %s or newer to fix this.F)r1   r
   r2   r3   r4   )r-   r5   r6   r(   r(   r)   Ú	can_merge  s    
zFFmpegMergerPP.can_mergeN)r%   r&   r'   rª   ré   r(   r(   r(   r)   rè   ú  s   	rè   c               @   s   e Zd Zdd„ ZdS )ÚFFmpegFixupStretchedPPc             C   sŒ   |j dƒ}|d ks|dkr"g |fS |d }t|dƒ}dddd| g}| jjd	| ƒ | j|||ƒ tjt|ƒƒ tjt|ƒt|ƒƒ g |fS )
NÚstretched_ratior   r–   r»   z-cr—   z-aspectz%fz$[ffmpeg] Fixing aspect ratio in "%s")	rQ   r   r3   re   r†   rH   r¿   r   rÀ   )r-   rË   rë   rÂ   rÆ   r³   r(   r(   r)   rª     s    

zFFmpegFixupStretchedPP.runN)r%   r&   r'   rª   r(   r(   r(   r)   rê     s   rê   c               @   s   e Zd Zdd„ ZdS )ÚFFmpegFixupM4aPPc             C   s|   |j dƒdkrg |fS |d }t|dƒ}ddddg}| jjd	| ƒ | j|||ƒ tjt|ƒƒ tjt|ƒt|ƒƒ g |fS )
NÚ	containerZm4a_dashr–   r»   z-cr—   z-fr¶   z%[ffmpeg] Correcting container in "%s")	rQ   r   r3   re   r†   rH   r¿   r   rÀ   )r-   rË   rÂ   rÆ   r³   r(   r(   r)   rª   *  s    
zFFmpegFixupM4aPP.runN)r%   r&   r'   rª   r(   r(   r(   r)   rì   )  s   rì   c               @   s   e Zd Zdd„ ZdS )ÚFFmpegFixupM3u8PPc             C   sx   |d }| j |ƒdkrpt|dƒ}dddddd	g}| jjd
| ƒ | j|||ƒ tjt|ƒƒ tjt|ƒt|ƒƒ g |fS )Nr–   r   r»   z-cr—   z-fr¶   z-bsf:ar˜   z/[ffmpeg] Fixing malformed AAC bitstream in "%s")	rv   r   r3   re   r†   rH   r¿   r   rÀ   )r-   rË   rÂ   rÆ   r³   r(   r(   r)   rª   <  s    
zFFmpegFixupM3u8PP.runN)r%   r&   r'   rª   r(   r(   r(   r)   rî   ;  s   rî   c                   s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚFFmpegSubtitlesConvertorPPNc                s   t t| ƒj|ƒ || _d S )N)r¬   rï   r+   r²   )r-   r.   r²   )r¯   r(   r)   r+   K  s    z#FFmpegSubtitlesConvertorPP.__init__c             C   sª  |j dƒ}|d }| j}|}|dkr(d}|d krD| jjdƒ g |fS | jjdƒ g }�xJ|jƒ D �]<\}}|d }	|	|krŒ| jjd| ƒ q`t|||	|j dƒƒ}
|j|
ƒ t||||j dƒƒ}|	dk�r^| jjdƒ |
}t||d|j dƒƒ}t|dƒ�}t	|j
ƒ ƒ}W d Q R X tj|ddd��}|j|ƒ W d Q R X |}
d|dœ||< |dk�rTq`n
|j|ƒ | j|
|d|gƒ tj|ddd��}||j
ƒ dœ||< W d Q R X q`W ||fS )Nr¸   r–   r¹   Zwebvttz.[ffmpeg] There aren't any subtitles to convertz[ffmpeg] Converting subtitlesrœ   z@[ffmpeg] Subtitle file for %s is already in the requested formatÚdfxpÚttmlÚttzpYou have requested to convert dfxp (TTML) subtitles into another format, which results in style information lossÚsrtÚrbrÚ   zutf-8)rÛ   )rœ   Údataz-fZrt)rð   rñ   rò   )rQ   r²   r3   re   r¼   r   rc   r4   rã   r   Úreadrâ   rä   r†   )r-   rË   ZsubsrÂ   Znew_extZ
new_formatrÃ   rÄ   rÜ   rœ   Zold_fileZnew_fileZ	dfxp_fileZsrt_filerç   Zsrt_datar(   r(   r)   rª   O  sP    





zFFmpegSubtitlesConvertorPP.run)NN)r%   r&   r'   r+   rª   r´   r(   r(   )r¯   r)   rï   J  s   rï   )#Ú
__future__r   râ   rH   rf   r¢   r=   Úcommonr   r   Úutilsr   r   r	   r
   r   r   r   r   r   r   r   ÚEXT_TO_OUT_FORMATSrŸ   r$   r*   r‹   r«   rµ   rÇ   rè   rê   rì   rî   rï   r(   r(   r(   r)   Ú<module>   sH   4 Dg:I