a
    VŸ$c¢m  ã                   @   sä  d dl mZmZmZ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mZ 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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¡ d	d
„ Z#ej$r`d dl%Z$ej& 'dd¡Z(e(dur0e)de(ƒ e$j*j+e(dde$j*j+e(ddgZ,e,d  gZ-n.e)dƒ e$j*j+dde$j*j+ddgZ,e,d  gZ-ng Z,g Z-g a.da/i Z0g Z1G dd„ de2ƒZ3e1 4e3¡ G dd„ de2ƒZ5e1 4e5¡ G dd„ de2ƒZ6e1 4e6¡ dd„ Z7dd„ Z8g a9g a:i Z;i Z<dd„ Z=g Z>dd„ Z?d d!„ Z@ej$re> 4e@¡ d"d#„ ZAejBs4ej& 'd$d%¡r>e> 4eA¡ d&d'„ ZCe> 4eC¡ d(d)„ ZDe> 4eD¡ dad+d,„ZEG d-d.„ d.e2ƒZFeZGd/ej&v r”d0d1„ ZGg ZHd2d3„ ZId4d5„ ZJeH 4eJ¡ d6d7„ ZKeH 4eK¡ d8d9„ ZLej$rÞeH 4eL¡ d:d;„ ZMeH 4eM¡ d<d=„ ZNejBsej& 'd$d%¡reH 4eN¡ d>d?„ ZOdbd@dA„ZPdcdBdC„ZQdDdE„ ZRdFdG„ ZSdHdI„ ZTeUƒ ZVdJdK„ ZWG dLdM„ dMe2ƒZXg ZYdNdO„ ZZdPdQ„ Z[dRdS„ Z\e]ƒ a^i Z_da`d*aae b¡ Zcej2 ddT¡ZedUdV„ ZfdddWdX„ZgdYdZ„ Zhd[d\„ Zid]d^„ Zjd_d`„ ZkdS )eé    )ÚdivisionÚabsolute_importÚwith_statementÚprint_functionÚunicode_literals)ÚPY2Ú
basestringÚbchrÚbordÚchrÚopenÚpystrÚrangeÚroundÚstrÚtobytesÚunicode)ÚOptionalN)Úloads)ÚDownloadNeededÚ úutf-8c                 C   sP   t j tjj| ¡} t j | ¡}zt j |¡s6t  |¡ W n t	yJ   Y n0 | S )z×
    Returns the path to `fn` relative to the gamedir. If any of the directories
    leading to `fn` do not exist, tries to create them.

    This always returns a path, but the path may or may not be writable.
    )
ÚosÚpathÚjoinÚrenpyÚconfigÚgamedirÚdirnameÚexistsÚmakedirsÚ	Exception)ÚfnÚdn© r$   úrenpy/loader.pyÚget_path/   s    r&   ZANDROID_EXPANSIONzUsing expansion filezassets/x-game/)ÚapkÚprefixzassets/x-renpy/x-common/zNot using expansion file.©r(   c                   @   s8   e Zd ZdZdZedd„ ƒZedd„ ƒZedd„ ƒZd	S )
ÚRPAv3ArchiveHandlerz2
    Archive handler handling RPAv3 archives.
    ú.rpac                   C   s   dgS ©Nr+   r$   r$   r$   r$   r%   Úget_supported_extensionsw   s    z,RPAv3ArchiveHandler.get_supported_extensionsc                   C   s   dgS )Ns   RPA-3.0 r$   r$   r$   r$   r%   Úget_supported_headers{   s    z)RPAv3ArchiveHandler.get_supported_headersc                    s°   |   d¡}t|dd… dƒ}t|dd… dƒ‰ |  |¡ tt |   ¡ ¡ƒ}dd„ ‰| ¡ D ]P}t|| d	 ƒd
krŽ‡ fdd„|| D ƒ||< qZ‡ ‡fdd„|| D ƒ||< qZ|S )Né(   é   é   é   é   é!   c                 S   s    | sdS t | tƒs|  d¡} | S )Nó    úlatin-1)Ú
isinstanceÚbytesÚencode)Úsr$   r$   r%   Ústart_to_bytes‡   s
    

z6RPAv3ArchiveHandler.read_index.<locals>.start_to_bytesr   é   c                    s    g | ]\}}|ˆ A |ˆ A f‘qS r$   r$   )Ú.0ÚoffsetÚdlen)Úkeyr$   r%   Ú
<listcomp>•   r5   z2RPAv3ArchiveHandler.read_index.<locals>.<listcomp>c                    s(   g | ] \}}}|ˆ A |ˆ A ˆ|ƒf‘qS r$   r$   )r=   r>   r?   Ústart©r@   r;   r$   r%   rA   —   r5   )ÚreadÚintÚseekr   ÚzlibÚ
decompressÚkeysÚlen)ÚinfileÚlr>   ÚindexÚkr$   rC   r%   Ú
read_index   s    

zRPAv3ArchiveHandler.read_indexN©	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úarchive_extensionÚstaticmethodr-   r.   rO   r$   r$   r$   r%   r*   p   s   

r*   c                   @   s8   e Zd ZdZdZedd„ ƒZedd„ ƒZedd„ ƒZd	S )
ÚRPAv2ArchiveHandlerz2
    Archive handler handling RPAv2 archives.
    r+   c                   C   s   dgS r,   r$   r$   r$   r$   r%   r-   ¦   s    z,RPAv2ArchiveHandler.get_supported_extensionsc                   C   s   dgS )Ns   RPA-2.0 r$   r$   r$   r$   r%   r.   ª   s    z)RPAv2ArchiveHandler.get_supported_headersc                 C   s<   |   d¡}t|dd … dƒ}|  |¡ tt |   ¡ ¡ƒ}|S )Nr1   r0   r2   )rD   rE   rF   r   rG   rH   )rK   rL   r>   rM   r$   r$   r%   rO   ®   s
    

zRPAv2ArchiveHandler.read_indexNrP   r$   r$   r$   r%   rW   Ÿ   s   

rW   c                   @   s8   e Zd ZdZdZedd„ ƒZedd„ ƒZedd„ ƒZd	S )
ÚRPAv1ArchiveHandlerz2
    Archive handler handling RPAv1 archives.
    r+   c                   C   s   dgS )Nz.rpir$   r$   r$   r$   r%   r-   Â   s    z,RPAv1ArchiveHandler.get_supported_extensionsc                   C   s   dgS )Ns   xœr$   r$   r$   r$   r%   r.   Æ   s    z)RPAv1ArchiveHandler.get_supported_headersc                 C   s   t t |  ¡ ¡ƒS ©N)r   rG   rH   rD   )rK   r$   r$   r%   rO   Ê   s    zRPAv1ArchiveHandler.read_indexNrP   r$   r$   r$   r%   rX   »   s   

rX   c               
   C   sÈ  t tjjkrdS tjjdd… a t ¡  tƒ  g ad} tD ]&}| ¡ D ]}t	|ƒ}|| krF|} qFq:g }tD ]$}| 
¡ D ]}||vrv| |¡ qvqjtjjD ]ä}|D ]Ú}d}d}zt|| ƒ}t|dƒ}W n tyÜ   Y q Y n0 |† | | ¡}	tD ]f}d}
| ¡ D ]F}|	 |¡r| dd¡ | |¡}t ||j |f¡ d}
 qJq|
dkrò qZqòW d  ƒ q 1 sp0    Y  q q˜tƒ D ]\}}|tt d| ¡ ¡< q„tD ]}|tt d| ¡ ¡< q¨dS )zQ
    Loads in the indexes for the archive files. Also updates the lower_map.
    Nr   ÚrbFTÚNFC)Úold_config_archivesr   r   ÚarchivesÚ	lower_mapÚclearÚcleardirfilesÚarchive_handlersr.   rJ   r-   ÚappendÚtransfnr   r!   rD   Ú
startswithrF   rO   rU   ÚlistdirfilesÚunicodedataÚ	normalizeÚlowerÚremote_files)Úmax_header_lengthÚhandlerÚheaderÚ
header_lenÚarchive_extensionsÚextr(   r"   ÚfÚfile_headerÚarchive_handledrM   Údirr$   r$   r%   Úindex_archivesÒ   sV    	



,rt   c              	   C   s®   g }t j | ¡stjjs|S t  | ¡D ]‚}|d dkr8q&ztj |¡}W n t	y^   Y q&Y n0 t j 
| d | ¡ržt| d | ƒD ]}| |d | ¡ q„q&| |¡ q&|S )Nr   Ú.ú/)r   r   r   r   r   Ú	developerÚlistdirÚexportsÚfsdecoder!   ÚisdirÚwalkdirrb   )rs   ÚrvÚir"   r$   r$   r%   r|     s    
r|   c                   C   s   g a g adS )z;
    Clears the lists above when the game has changed.
    N)Ú
game_filesÚcommon_filesr$   r$   r$   r%   r`   8  s    r`   c                  C   s&   t ƒ } dd„ }tD ]}||| ƒ qdS )z^
    Scans directories, archives, and apks and fills out game_files and
    common_files.
    c                 S   s`   t |ƒ}||v rd S | d¡r"d S | d¡r0d S | | |f¡ | |¡ dtt d| ¡ ¡< d S )Nzcache/zsaves/Tr[   )r   rd   rb   ÚaddÚloadable_cacherf   rg   rh   )r#   r"   ÚfilesÚseenr$   r$   r%   r   P  s    


zscandirfiles.<locals>.addN)ÚsetÚscandirfiles_callbacks)r„   r   r~   r$   r$   r%   ÚscandirfilesH  s    r‡   c                 C   sV   t D ]L}|tvrt}nt}| ¡ D ],}d dd„ | d¡D ƒ¡}| d|||ƒ q"qdS )z?
    Scans apks and fills out game_files and common_files.
    rv   c                 s   s   | ]}|d d… V  qdS )r<   Nr$   ©r=   r~   r$   r$   r%   Ú	<genexpr>u  r5   z(scandirfiles_from_apk.<locals>.<genexpr>N)ÚapksÚ	game_apksr€   r   Úlistr   Úsplit)r   r„   r'   rƒ   rp   r$   r$   r%   Úscandirfiles_from_apke  s    rŽ   c           	      C   sÎ   t j tjjd¡}t j |¡rÊt}t|dƒŽ}| 	¡ }| 	¡ }|dks¬|dkrPq¬| 
d¡}| 
d¡}| d¡\}}|dkrŽdd„ | d	¡D ƒ}| d
|||ƒ ||dœt|< q.W d  ƒ n1 sÀ0    Y  dS )z>
    Fills out game_files from renpyweb_remote_files.txt.
    zrenpyweb_remote_files.txtÚrr   z
ú Úimagec                 S   s   g | ]}t |ƒ‘qS r$   )rE   rˆ   r$   r$   r%   rA   ’  r5   z1scandirfiles_from_remote_file.<locals>.<listcomp>ú,z/game)ÚtypeÚsizeN)r   r   r   r   r   r   r   r   r   ÚreadlineÚrstripr   ri   )	r   r„   Úindex_filenamerƒ   Úremote_indexrp   ÚmetadataÚ
entry_typeÚ
entry_sizer$   r$   r%   Úscandirfiles_from_remote_file~  s    

rœ   ÚRENPY_SIMULATE_DOWNLOADFc                 C   s^   t jjD ]P}t jjr&|t jjkr&t}nt}tj t jj	|¡}t
|ƒD ]}| ||||ƒ qDqdS )zF
    Scans directories and fills out game_files and common_files.
    N)r   r   Ú
searchpathÚ	commondirr€   r   r   r   r   Úbasedirr|   )r   r„   r~   rƒ   Újr$   r$   r%   Úscandirfiles_from_filesystemœ  s    r¢   c                 C   s.   t }tD ] \}}|D ]}| d|||ƒ qqdS )z2
    Scans archives and fills out game_files.
    N)r   r]   )r   r„   rƒ   Ú_prefixrM   r¡   r$   r$   r%   Úscandirfiles_from_archives°  s    r¤   Tc                 C   s&   t ststƒ  | rt t S tt ƒS dS )z€
    Returns a list of directory, file tuples known to the system. If
    the file is in an archive, the directory is None.
    N)r   r€   r‡   rŒ   )Úcommonr$   r$   r%   re   ¿  s
    re   c                   @   s¬   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd(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dd„ ZeZdd„ Zd+d d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd
S ),ÚSubFileFc                 C   s<   || _ d | _|| _d| _|| _|| _| js2|| _nd | _d S ©Nr   )r"   rp   Úbaser>   ÚlengthrB   Úname)Úselfr"   r¨   r©   rB   r$   r$   r%   Ú__init__Ñ  s    zSubFile.__init__c                 C   s    t | jdƒ| _| j | j¡ d S )NrZ   )r   r"   rp   rF   r¨   ©r«   r$   r$   r%   r   à  s    zSubFile.openc                 C   s   | S rY   r$   r­   r$   r$   r%   Ú	__enter__ä  s    zSubFile.__enter__c                 C   s   |   ¡  dS ©NF)Úclose)r«   Ú_typeÚvalueÚtbr$   r$   r%   Ú__exit__ç  s    zSubFile.__exit__Nc                 C   sš   | j d u r|  ¡  | j| j }|d ur2t||ƒ}n|}| j| j| j| … }|t|ƒ8 }|  jt|ƒ7  _|rŽ| j  |¡}|  jt|ƒ7  _nd}|| S )Nr5   )rp   r   r©   r>   ÚminrB   rJ   rD   )r«   r©   Ú	maxlengthÚrv1Úrv2r$   r$   r%   rD   ë  s    
zSubFile.readc                 C   s   dS ©NTr$   r­   r$   r$   r%   Úreadable  s    zSubFile.readablec                 C   sš   | j d u r|  ¡  | j| j }|d ur2t||ƒ}n|}| jt| jƒk rxd}|rt|  d¡}||7 }|dkrjqt|d8 }qJ|S | j  |¡}|  jt|ƒ7  _|S )Nr5   é   ó   
)	rp   r   r©   r>   rµ   rJ   rB   rD   r•   )r«   r©   r¶   r}   Úcr$   r$   r%   r•     s$    


zSubFile.readlinec                 C   sB   g }|   |¡}|sq>|d ur2|t|ƒ8 }|dk r2q>| |¡ q|S r§   )r•   rJ   rb   )r«   r©   r}   rL   r$   r$   r%   Ú	readlines%  s    
zSubFile.readlinesc                 C   s   dS r¹   r$   r­   r$   r$   r%   Úseekable7  s    zSubFile.seekablec                 C   s   dS r¯   r$   r­   r$   r$   r%   Úwritable:  s    zSubFile.writablec                 C   s   | S rY   r$   r­   r$   r$   r%   Ú
xreadlines=  s    zSubFile.xreadlinesc                 C   s   | S rY   r$   r­   r$   r$   r%   Ú__iter__@  s    zSubFile.__iter__c                 C   s   |   ¡ }|stƒ ‚|S rY   )r•   ÚStopIteration)r«   r}   r$   r$   r%   Ú__next__C  s    zSubFile.__next__c                 C   s   d S rY   r$   r­   r$   r$   r%   ÚflushM  s    zSubFile.flushr   c                 C   s~   | j d u r|  ¡  |dkr&| j| }n|dkr8| j| }|| jkrH| j}|| _|t| jƒ }|dk rhd}| j  || j ¡ d S )Nr»   r<   r   )rp   r   r>   r©   rJ   rB   rF   r¨   )r«   r>   Úwhencer$   r$   r%   rF   P  s    


zSubFile.seekc                 C   s   | j S rY   )r>   r­   r$   r$   r%   Útelle  s    zSubFile.tellc                 C   s   | j d ur| j  ¡  d | _ d S rY   )rp   r°   r­   r$   r$   r%   r°   h  s    

zSubFile.closec                 C   s   t dƒ‚d S )NzWrite not supported by SubFile)r!   )r«   r:   r$   r$   r%   Úwritem  s    zSubFile.write)N)N)N)r   )rQ   rR   rS   Úclosedr¬   r   r®   r´   rD   rº   r•   r¾   r¿   rÀ   rÁ   rÂ   rÄ   ÚnextrÅ   rF   rÇ   r°   rÈ   r$   r$   r$   r%   r¦   Î  s(   



r¦   ZRENPY_FORCE_SUBFILEc                 C   s8   t | |ƒ}| dd¡ | ¡ }| dd¡ t|d|dƒS )Nr   r<   r5   )r   rF   rÇ   r¦   )rª   Úmoderp   r©   r$   r$   r%   Ú	open_fileu  s
    
rÌ   c                 C   s>   t  t d|  ¡ ¡| ¡} tD ]}|| ƒ}|dur|  S qdS )z?
    Returns an open python file object of the given type.
    r[   N)r^   Úgetrf   rg   rh   Úfile_open_callbacks)rª   r~   r}   r$   r$   r%   Ú	load_core‚  s    
rÏ   c                 C   s   t jjrt j | ¡S dS )z[
    Returns an open python file object of the given type from the file open callback.
    N)r   r   Úfile_open_callback©rª   r$   r$   r%   Úload_from_file_open_callback‘  s    rÒ   c                 C   s4   t jjs0zt| ƒ}t|dƒW S  ty.   Y n0 dS )zS
    Returns an open python file object of the given type from the filesystem.
    rZ   N)r   r   Úforce_archivesrc   rÌ   r!   )rª   r"   r$   r$   r%   Úload_from_filesystemŸ  s    rÔ   c              	   C   sL   t D ]B}d dd„ |  d¡D ƒ¡}z| |¡W   S  tyD   Y q0 qdS )zL
    Returns an open python file object of the given type from the apk.
    rv   c                 s   s   | ]}d | V  qdS ©zx-Nr$   rˆ   r$   r$   r%   r‰   ·  r5   z load_from_apk.<locals>.<genexpr>N)rŠ   r   r   r   ÚIOError)rª   r'   Úprefixed_namer$   r$   r%   Úload_from_apk±  s    rØ   c              	   C   sä   t D ]Ú\}}| |vrqt|ƒ}g }t||  ƒdkrr||  d }t|ƒdkrX|\}}d}n
|\}}}t||||ƒ}	nft|dƒL}
||  D ]"\}}|
 |¡ | |
 |¡¡ q†t 	d 
|¡¡}	W d  ƒ n1 sÎ0    Y  |	  S dS )zT
    Returns an open python file object of the given type from an archive file.
    r»   r   r<   r5   rZ   N)r]   rc   rJ   r¦   r   rF   rb   rD   ÚioÚBytesIOr   )rª   r(   rM   ÚafnÚdataÚtr>   r?   rB   r}   rp   r$   r$   r%   Úload_from_archiveÅ  s&    

.rÞ   c                 C   s*   | t v r&t| t |  d t |  d d‚dS )za
    Defer loading a file if it has not been downloaded yet but exists on the remote server.
    r“   r”   )ÚrelpathÚrtyper”   N)ri   r   rÑ   r$   r$   r%   Úload_from_remote_fileî  s    rá   c                 C   sN   t jjrd| v rtd|  ƒ‚t jjrJ|  d¡}d|v s>d|v rJtd|  ƒ‚dS )zF
    Checks the name to see if it violates any of Ren'Py's rules.
    ú\ú*Backslash in filename, use '/' instead: %rrv   ru   z..zDFilenames may not contain relative directories like '.' and '..': %rN)r   r   Úreject_backslashr!   Úreject_relativer   )rª   r   r$   r$   r%   Ú
check_nameý  s    
ræ   c                 C   sZ   g }| rt jjj}nd}t jjD ]4}|durJ| t jjd | d | ¡ | |¡ q |S )z9
    Returns a list of prefixes to search for files.
    Nrv   )r   ÚgameÚpreferencesÚlanguager   Úsearch_prefixesrb   Útl_directory)Útlr}   ré   r(   r$   r$   r%   Úget_prefixes  s    rí   c                 C   s¤   t jjjr:t ¡ jdkr:t js:tj	 
dd¡s:td | ¡ƒ‚t jjrVd| v rVtd|  ƒ‚t dd| ¡ d¡} t|ƒD ] }t||  ƒ}|d urr|  S qrtd	|  ƒ‚d S )
NÚ
MainThreadr   Fz%Refusing to open {} while predicting.râ   rã   z/+rv   úCouldn't find file '%s'.)r   ÚdisplayÚpredictÚ
predictingÚ	threadingÚcurrent_threadrª   Ú
emscriptenr   ÚenvironrÍ   r!   Úformatr   rä   ÚreÚsubÚlstriprí   rÏ   rÖ   )rª   rì   Úpr}   r$   r$   r%   Úload#  s    

rü   c                 C   sÒ   t  t d|  ¡ ¡| ¡} | tv r(t|  S zt| ƒ dt| < W dS  tyP   Y n0 tD ]6}d 	dd„ |  
d¡D ƒ¡}||jv rVdt| <  dS qVtD ]\}}| |v r’dt| <  dS q’| tv rÆdt| < | S dt| < dS )zM
    Returns True if the name is loadable with load, False if it is not.
    r[   Trv   c                 s   s   | ]}d | V  qdS rÕ   r$   rˆ   r$   r$   r%   r‰   I  r5   z loadable_core.<locals>.<genexpr>F)r^   rÍ   rf   rg   rh   r‚   rc   r!   rŠ   r   r   Úinfor]   ri   )rª   r'   r×   r£   rM   r$   r$   r%   Úloadable_core7  s.    
rþ   c                 C   sH   |   d¡} tjjd ur&tj | ¡r&dS tƒ D ]}t||  ƒr, dS q,dS )Nrv   TF)rú   r   r   Úloadable_callbackrí   rþ   )rª   rû   r$   r$   r%   Úloadable[  s    

r   c                 C   s    |   d¡} tjjr&d| v r&td|  ƒ‚t t d|  	¡ ¡| ¡} t
| tƒrR|  d¡} tjjD ]4}tj tjj|| ¡}t|ƒ tj |¡rZ|  S qZtd|  ƒ‚dS )zc
    Tries to translate the name to a file that exists in one of the
    searched directories.
    rv   râ   rã   r[   r   rï   N)rú   r   r   rä   r!   r^   rÍ   rf   rg   rh   r7   r8   Údecoderž   r   r   r   r    Úadd_autoÚisfile)rª   Údr"   r$   r$   r%   rc   i  s    



rc   c                 C   sf   t  | d¡}|dur|S d}z*t| ƒ}| d¡}|s6qDt ||¡}q&W n tyX   Y n0 |t | < |S )ze
    Returns the time the file m was last modified, or 0 if it
    doesn't exist or is archived.
    Nr   i   )Ú
hash_cacherÍ   rü   rD   rG   Úadler32r!   )rª   r}   rp   rÜ   r$   r$   r%   Úget_hash‡  s    
r  c                   @   s>   e Zd ZdZddd„Zddd„Zddd	„Zd
d„ Zdd„ ZdS )ÚRenpyImporterzk
    An importer, that tries to load modules from the places where Ren'Py
    searches for data files.
    r   c                 C   s
   || _ d S rY   r)   )r«   r(   r$   r$   r%   r¬   ®  s    zRenpyImporter.__init__Nc                 C   sx   |d u r| j }z(t|tƒs$| d¡}|| dd¡ }W n tyJ   Y d S 0 t|d ƒr`|d S t|d ƒrt|d S d S )Nr   ru   rv   z.pyz/__init__.py)r(   r7   r   r  Úreplacer!   r   )r«   Úfullnamer(   r"   r$   r$   r%   Ú	translate±  s    

zRenpyImporter.translatec                 C   s<   |d ur*|D ]}|   ||¡rt|ƒ  S q|   |¡r8| S d S rY   )r  r  )r«   r
  r   r~   r$   r$   r%   Úfind_moduleÈ  s    
zRenpyImporter.find_modulec              	   C   sü   |   || j¡}t|ƒ}tj |t |¡¡}||_||_	| |_
| d¡r\|d tdƒ … g|_dD ]„}zbt|ƒ ¡  |¡}|r”|d dkr”|dd … }| d¡}| dd¡}t||d	tjjdƒ}W  qæW q` tyâ   |d
krÞ‚ Y q`0 q`t||jƒ tj| S )Nz__init__.py)r   r6   r   u   ï»¿r»   Úraw_unicode_escapeó   r5   Úexecr6   )r  r(   r   ÚsysÚmodulesÚ
setdefaultÚtypesÚ
ModuleTyperQ   Ú__file__Ú
__loader__ÚendswithrJ   Ú__path__rü   rD   r  r9   r	  Úcompiler   ÚpythonÚold_compile_flagsr!   r  Ú__dict__)r«   r
  ÚfilenameÚpynameÚmodÚencodingÚsourceÚcoder$   r$   r%   Úload_moduleÑ  s,    



zRenpyImporter.load_modulec                 C   s   t |ƒ ¡ S rY   )rü   rD   )r«   r  r$   r$   r%   Úget_dataó  s    zRenpyImporter.get_data)r   )N)N)	rQ   rR   rS   rT   r¬   r  r  r#  r$  r$   r$   r$   r%   r  ¨  s   


	"r  c                 C   s,   | r|   d¡s| d } tj dt| ƒ¡ dS )zÙ
    :doc: other

    Adds `path` to the list of paths searched for Python modules and packages.
    The path should be a string relative to the game directory. This must be
    called before an import statement.
    rv   r   N)r  r  Ú	meta_pathÚinsertr  )r   r$   r$   r%   Úadd_python_directoryú  s    	r'  c                   C   s"   t jtd d …< tdƒ tdƒ d S )Nzpython-packages/r   )r  r%  Úmeta_backupr'  r$   r$   r$   r%   Úinit_importer  s    r)  c                   C   s   t tjd d …< d S rY   )r(  r  r%  r$   r$   r$   r%   Úquit_importer  s    r*  Úauto_blacklistedc                 C   s(   zt j | ¡W S  ty"   Y dS 0 dS )zC
    Gets the mtime of fn, or None if the file does not exist.
    N)r   r   Úgetmtimer!   )r"   r$   r$   r%   Ú
auto_mtime,  s    r-  c              	   C   s¨   |   dd¡} tjsdS | tv r&|s&dS tjjD ]@}|  |¡r.t tt| < W d  ƒ n1 s^0    Y   dS q.t	| ƒ}t |t| < W d  ƒ n1 sš0    Y  dS )zƒ
    Adds fn as a file we watch for changes. If it's mtime changes or the file
    starts/stops existing, we trigger a reload.
    râ   rv   N)
r	  r   Ú
autoreloadÚauto_mtimesr   Úautoreload_blacklistr  Ú	auto_lockr+  r-  )r"   ÚforceÚeÚmtimer$   r$   r%   r  7  s    
&r  c               	   C   s¶   t : t  d¡ tr$W d  ƒ dS tt ¡ ƒ} W d  ƒ n1 sD0    Y  | D ]\\}}|tu rdqRt|ƒ|krRt * t|ƒt| krt 	|¡ W d  ƒ qR1 s¤0    Y  qRq dS )z:
    This thread sets need_autoreload when necessary.
    g      ø?N)
r1  ÚwaitÚauto_quit_flagrŒ   r/  Úitemsr+  r-  Úneeds_autoreloadr   )r7  r"   r4  r$   r$   r%   Úauto_thread_functionQ  s    	
*r9  c                  C   s°   t r¬ttt ƒƒ} t| ƒ}t" t  | ¡ |t| < W d  ƒ n1 sD0    Y  tjsXdS tj	j
D ]>\}}t || tj¡r`tj | tj	j¡ dd¡} || ƒ  q q`tj ¡  q dS )z2
    Checks to see if autoreload is required.
    Nrâ   rv   )r8  rÊ   Úiterr-  r1  Údiscardr/  r   r.  r   Úautoreload_functionsrø   ÚsearchÚIr   r   rß   r   r	  ry   Úreload_script)r"   r4  ÚregexÚfuncr$   r$   r%   Úcheck_autoreloado  s    
&rB  c                   C   s2   t ƒ atjsdS datjtdadt_	t 
¡  dS )z'
    Starts the autoreload thread.
    NF)ÚtargetT)r…   r8  r   r.  r6  ró   ÚThreadr9  Úauto_threadÚdaemonrB   r$   r$   r$   r%   Ú	auto_initˆ  s    	rG  c                   C   sH   t du rdS dat t ¡  W d  ƒ n1 s20    Y  t  ¡  dS )z+
    Terminates the autoreload thread.
    NT)rE  r6  r1  Ú
notify_allr   r$   r$   r$   r%   Ú	auto_quit  s    &rI  )T)T)T)F)lÚ
__future__r   r   r   r   r   Úrenpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   Útypingr   r   r   r  r  ró   rG   rø   rÙ   rf   Úrenpy.compat.pickler   Úrenpy.webloaderr   r9   r&   ÚandroidZandroid.apkrö   rÍ   Ú	expansionÚprintr'   ZAPKrŠ   r‹   r]   r\   r^   ra   Úobjectr*   rb   rW   rX   rt   r|   r   r€   r‚   ri   r`   r†   r‡   rŽ   rœ   rõ   r¢   r¤   re   r¦   rÌ   rÎ   rÏ   rÒ   rÔ   rØ   rÞ   rá   ræ   rí   rü   rþ   r   rc   Údictr  r  r  r(  r'  r)  r*  r…   r8  r/  rE  r6  Ú	Conditionr1  ÚSentinelr+  r-  r  r9  rB  rG  rI  r$   r$   r$   r%   Ú<module>   sÒ   8


þþ,


A




 $



&



$!O
