a
    B^im-                    @   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mZ d dlZd dlZd dlZd dlZdd Zdd ZG d	d
 d
eZdtddZG dd dejjZ eg g ddddZ!e g ddZ"dd Z#G dd deZ$dd Z%G dd deZ&dd Z'G dd deZ(G dd deZ)dd Z*dud d!Z+G d"d# d#e)Z,e-e,d$e,j. G d%d& d&e)Z/G d'd( d(e)Z0G d)d* d*e)Z1G d+d, d,e)Z2G d-d. d.e)Z3G d/d0 d0e)Z4dvd1d2Z5dwd3d4Z6G d5d6 d6e)Z7G d7d8 d8e)Z8G d9d: d:e)Z9G d;d< d<e)Z:G d=d> d>e)Z;G d?d@ d@e)Z<G dAdB dBe)Z=G dCdD dDe)Z>G dEdF dFe)Z?e-e?d$e?j. G dGdH dHe)Z@G dIdJ dJe)ZAG dKdL dLe)ZBG dMdN dNe)ZCG dOdP dPe)ZDG dQdR dRe)ZEdSdT ZFG dUdV dVeZGdWdX ZHh dYZIg ZJG dZd[ d[e)ZKd\d] ZLg ZMG d^d_ d_e)ZNG d`da dae)ZOG dbdc dce)ZPG ddde dee)ZQG dfdg dge)ZRG dhdi die)ZSG djdk dke)ZTG dldm dmeTZUG dndo doe)ZVG dpdq dqe)ZWG drds dse)ZXdS )x    )divisionabsolute_importwith_statementprint_functionunicode_literals)PY2
basestringbchrbordchropenpystrrangeroundstrtobytesunicode)OptionalAnyNc                 C   s   t jjD ]}||  qdS )zI
    Reports the name of this statement to systems like window auto.
    N)renpyconfigstatement_callbacks)namei r   /C:\Users\PahaGest\Downloads\Selene\renpy\ast.pystatement_name)   s    r   c                 C   s   | t j _dS )z
    Indicates the next node that should be executed. When a statement
    can crash, this should be set as early as possible, so that ignore
    can bring us there.
    N)r   gamecontext	next_node)nr   r   r   r   2   s    r   c                   @   s,   e Zd ZdZg Zg ZdddZd	ddZdS )
ParameterInfozR
    This class is used to store information about parameters to a
    label.
    Nc           	      C   s   || _ || _|| _|| _|d u r(g | _n.g }|D ]}|| |d |kr0 qPq0|| _|d u rfg | _n:g }t|D ]}|| |d |krr qqr|  || _d S Nr   )	
parameters
positionalextraposextrakwpositional_onlyappendkeyword_onlyreversedreverse)	selfr#   r$   r%   r&   Zlast_posonlyZfirst_kwonlyrvparamr   r   r   __init__E   s*    

zParameterInfo.__init__Fc              	   C   sN  i }|du rg }|du r$t j }n| }| j}|s| jrH||| j< n0|rx|sx|ddsxtdddd |D  | j	rt
||| j	< n|r|stdt| |S t| j}t|}g }g }	|D ]`}
zt|\}}W n. ty
   t|
gt| }Y  q|Y n0 ||v r |	| |
||< q|D ]D\}}||v rJ|	| |durft j|||< n
|| q.tg }|	r| jdu r|std	dd
d |	D  n|	D ]}|| q|t| jt| j pd }t|}g }g }|D ]h}
zt|\}}W n* ty:   |
gt| }Y  qY n0 |
||< ||v r|| || q|D ]J\}}||v r||||< n&|durt j|||< n
|| qj|r|stdddd |D  | j	rt
||| j	< nd|rZ|sZ| j| }tdd |D }t|}||kr:t|}nd||f }td|t|f |r|stdddd |D  g }| jD ]J\}}||v r||||< n&|durt j|||< n
|| q|r |s tdddd |D  | jr||| j< n6|rJ|sJ|ddsJtdddd |D  |S )a  
        Applies `args` and `kwargs` to these parameters. Returns
        a dictionary that can be used to update an enclosing
        scope.

        `ignore_errors`
            If true, errors will be ignored, and this function will do the
            best job it can.
        NZ_ignore_extra_kwargsFz Unexpected keyword arguments: %s, c                 s   s   | ]}d | V  qdS z'%s'Nr   .0r   r   r   r   	<genexpr>       z&ParameterInfo.apply.<locals>.<genexpr>z0Too many arguments in call (expected 0, got %d).z>Some positional-only arguments passed as keyword arguments: %sc                 s   s   | ]}d | V  qdS r1   r   r2   r   r   r   r4      r5   z)Missing required positional arguments: %sc                 s   s   | ]}d | V  qdS r1   r   r2   r   r   r   r4      r5   c                 S   s   g | ]}|d  du r|qS )   Nr   r2   r   r   r   
<listcomp>   r5   z'ParameterInfo.apply.<locals>.<listcomp>zfrom %d to %dz1Too many arguments in call (expected %s, got %d).z%Got multiple values for arguments: %sc                 s   s   | ]}d | V  qdS r1   r   r2   r   r   r   r4      r5   z+Missing required keyword-only arguments: %sc                 s   s   | ]}d | V  qdS r1   r   r2   r   r   r   r4     r5   c                 s   s   | ]}d | V  qdS r1   r   r2   r   r   r   r4     r5   )r   pythonRevertableDictcopyr#   r&   pop	TypeErrorjoinr%   tupleleniterr'   nextStopIterationlistr(   py_evalr)   r   )r,   argskwargsignore_errorsr-   r#   slotsZargsiZ
missed_posZposonly_keywordvaluer   _defaultZposkw_slotsZ	extraargsZduplicated_namesr$   requiredtotalZexpectedZ	missed_kwr   r   r   applyu   s    






 









zParameterInfo.apply)NN)F)__name__
__module____qualname____doc__r'   r)   r/   rN   r   r   r   r   r!   <   s
   
0r!   Fc                 C   s0   | d u r"|s|r|st dni S | |||S )Nz2Arguments supplied, but parameter list not present)	ExceptionrN   )r#   rE   rF   rG   r   r   r   apply_arguments  s
    
rT   c                   @   s@   e Zd ZdZe Ze Zdd ZdddZdddZ	d	d
 Z
dS )ArgumentInfor6   c                 C   s   |dk r| j }| j}| j}t|t| t| }|rP|d h| _|d |f |rn|d h| _|d |f |r|r|d h| _d S )Nr6      )	argumentsr%   r&   r?   boolstarred_indexesr(   doublestarred_indexes)r,   versionrW   r%   r&   lengthr   r   r   after_upgrade/  s    zArgumentInfo.after_upgradeNc                 C   s"   || _ |pt | _|pt | _d S N)rW   setrY   rZ   )r,   rW   rY   rZ   r   r   r   r/   @  s    zArgumentInfo.__init__c                 C   s   g }t j }t| jD ]d\}\}}t jj||d}|| jv rJ|| q|| j	v r`|
| q|durr|||< q|| qt||fS )zx
        Evaluates the arguments, returning a tuple of arguments and a
        dictionary of keyword arguments.
        )localsN)r   
revertabler9   	enumeraterW   r8   rD   rY   extendrZ   updater(   r>   )r,   scoperE   rF   r   kvrI   r   r   r   evaluateL  s    



zArgumentInfo.evaluatec                 C   s   g }t | jD ]f\}\}}|| jv r4|d|  q|| jv rN|d|  q|d urj|d|| q|| qdd| d S )N*z**z{}={}(r0   ))rb   rW   rY   r(   rZ   formatr=   )r,   lr   keyword
expressionr   r   r   get_codee  s    

zArgumentInfo.get_code)NN)N)rO   rP   rQ   __version__r_   rY   rZ   r]   r/   rh   rp   r   r   r   r   rU   )  s   

rU   c                 G   s   | j | g|R  S r^   )__new__)clsrE   r   r   r   
__newobj__}  s    rt   c                   @   sB   e Zd ZdZg dZdddZdd Zedd	 Zed
d Z	dS )PyExprz5
    Represents a string containing python code.
    )filename
linenumberpy   c                 C   sD   t | |}||_||_||_|r@tjjjd ur@tjjj	| |S r^   )
r   rr   rv   rw   rx   r   r   script
all_pyexprr(   )rs   srv   rw   rx   r,   r   r   r   rr     s    zPyExpr.__new__c                 C   s   t | | j| j| jfS r^   )r   rv   rw   rx   r,   r   r   r   __getnewargs__  s    zPyExpr.__getnewargs__c                   C   s    t jjjdu rdS tt jjjS )zt
        Checkpoints the pyexpr list. Returns an opaque object that can be used
        to revert the list.
        N)r   r   rz   r{   r?   r   r   r   r   
checkpoint  s    zPyExpr.checkpointc                 C   s4   t jjjd u rd S | d u rd S g t jjj| d < d S r^   )r   r   rz   r{   )Zopaquer   r   r   revert  s
    zPyExpr.revertN)ry   )
rO   rP   rQ   rR   	__slots__rr   r~   staticmethodr   r   r   r   r   r   ru     s   

ru   c                 C   s   d| vS )z
    Returns true if an expr probably does not have side effects, and should
    be predicted. Basically, this just whitelists a set of characters that
    doesn't allow for a function call.
    rj   r   )exprr   r   r   probably_side_effect_free  s    r   c                   @   s6   e Zd Zg dZdd Zdd Zddd	Zd
d ZdS )PyCode)sourcelocationmodebytecodehashrx   c                 C   s   d| j | j| j| jfS )Nr6   )r   r   r   rx   r}   r   r   r   __getstate__  s    zPyCode.__getstate__c                 C   s`   t |dkr&|\}| _| _| _d| _n|\}| _| _| _| _d | _tjjj	r\tjjj
|  d S )N   rV   )r?   r   r   r   rx   r   r   r   rz   record_pycode
all_pycoder(   )r,   staterJ   r   r   r   __setstate__  s    
zPyCode.__setstate__z<none>r6   execc                 C   sx   t |tr|j|j|f}tr$d| _nd| _|| _|tt f | _	|| _
d | _tjjjrjtjjj|  |  | _d S )NrV   ry   )
isinstanceru   rv   rw   r   rx   r   inttimer   r   r   r   r   rz   r   r   r(   get_hashr   )r,   r   locr   r   r   r   r/     s    

zPyCode.__init__c                 C   s~   z| j d ur| j W S W n ty(   Y n0 | j}t|tjjjrNtjj|}t	tj
tt| j| d  | _ | j S )Nutf-8)r   rS   r   r   r   r8   astASTdumpr	   bytecode_versionhashlibZmd5reprr   encodedigest)r,   coder   r   r   r     s    
*zPyCode.get_hashN)r   r   )rO   rP   rQ   r   r   r   r/   r   r   r   r   r   r     s
   	
r   c                 C   s@   | sdS t | | dd D ]\}}|| q| d | dS )z
    This is called to chain together all of the nodes in a block. Node
    n is chained with node n+1, while the last node is chained with
    next.
    Nr6   )zipchain)blockrA   abr   r   r   chain_block  s
    r   c                   @   s4   e Zd ZdZdZdZdZdZdZdd Z	dd Z
dS )Scryz
    This is used to store information about the future, if we know it. Unlike
    predict, this tries to only get things we _know_ will happen.
    NFc                 C   s   d S r^   r   r,   r   r   r   r   __getattr__  s    zScry.__getattr__c                 C   s4   | j d u rd S z| j  W S  ty.   Y d S 0 d S r^   )_nextscryrS   r}   r   r   r   rA   "  s    
z	Scry.next)rO   rP   rQ   rR   r   	interactssaymenu_with_captionwhor   rA   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZg dZdZdZdZdd Zdd Z	d	d
 Z
dZdd Zdd Zdd ZdZdd Zdd Zdd ZdddZdd ZdZdd ZdS )Nodea  
    A node in the abstract syntax tree of the program.

    @ivar name: The name of this node.
    @ivar filename: The filename where this node comes from.
    @ivar linenumber: The line number of the line on which this node is defined.
    @ivar next: The statement that will execute after this one.
    @ivar statement_start: If present, the first node that makes up the statement that includes this node.
    )r   rv   rw   rA   Zstatement_startFnormalc                 C   s   |\| _ | _d| _d| _dS )z
        Initializes this Node object.

        @param loc: A (filename, physical line number) tuple giving the
        logical line on which this Node node starts.
        N)rv   rw   r   rA   )r,   r   r   r   r   r/   N  s    zNode.__init__c                 C   s
   t | fS )z
        Returns a tuple of diff info about ourself. This is used to
        compare Nodes to see if they should be considered the same node. The
        tuple returned must be hashable.
        )idr}   r   r   r   	diff_infoZ  s    zNode.diff_infoc                 C   s   ||  dS )z<
        Calls `f` with this node and its children.
        Nr   )r,   fr   r   r   get_childrenc  s    zNode.get_childrenNc                 C   s
   || _ dS )a&  
        This is called with the Node node that should be followed after
        executing this node, and all nodes that this node
        executes. (For example, if this node is a block label, the
        next is the node that should be executed after all nodes in
        the block.)
        NrA   r,   rA   r   r   r   r   x  s    	z
Node.chainc                 C   s   | j |u r|| _ dS )zc
        Replaces instances of the `old` node with `new` when it is the next
        node.
        Nr   r,   oldnewr   r   r   replace_next  s    
zNode.replace_nextc                 C   s   t ddS )z
        Causes this node to execute, and any action it entails to be
        performed. The node should call next_node with the node to
        be executed after this one.
        z'Node subclass forgot to define execute.NrS   r}   r   r   r   execute  s    zNode.executec                 C   s   | j r| j gS g S dS )z
        This is called to predictively load images from this node. It
        should cause renpy.display.predict.displayable and
        renpy.display.predict.screen to be called as necessary.
        Nr   r}   r   r   r   predict  s    zNode.predictc                 C   s   t  }| j|_|S )zt
        Called to return an object with some general, user-definable information
        about the future.
        )r   rA   r   r,   r-   r   r   r   r     s    z	Node.scryc                 C   s   dS )z
        Called to restructure the AST.

        When this method is called, callback is called once for each child
        block of the node. The block, a list, can be updated by the callback
        using slice assignment to the list.
        Nr   r,   callbackr   r   r   restructure  s    
zNode.restructurec                 C   s   t ddS )a   
        Returns the canonical form of the code corresponding to this statement.
        This only needs to be defined if the statement is translatable.

        `filter`
            If present, a filter that should be applied to human-readable
            text in the statement.
        zNot ImplementedNr   r,   dialogue_filterr   r   r   rp     s    
zNode.get_codec                 C   s   dS )zI
        Called on all code after the init phase, to analyze it.
        Nr   r}   r   r   r   analyze  s    zNode.analyzec                 C   s   | j S )zT
        Returns true if this should be run while warping, False otherwise.
        )warpr}   r   r   r   can_warp  s    zNode.can_warp)N)rO   rP   rQ   rR   r   translatabletranslation_relevantrollbackr/   r   r   get_initr   r   r   early_executer   r   r   rp   r   r   r   r   r   r   r   r   ,  s(   

		

r   c                 C   sX   | durt j| }n$t jjr6t jjjdkr6t jj}ndS |sBdS t jjjrT|| dS )zB
    This handles the with clause of a say or menu statement.
    NrV   )r   r8   rD   storeZdefault_transitionr   preferencestransitions)ro   r   whatr   r   r   say_menu_with  s    

r   c                 C   s   | du rdS dt jjv r.t jjd | d}nd}|du rNt jjd | d}|durZ|S zt j| W S  ty   td|  Y n0 dS )z;
    Evaluates the `who` parameter to a say statement.
    Nzstore.characterr   zSayer '%s' is not defined.)r   r8   store_dictsgetrD   rS   )r   fastr-   r   r   r   eval_who  s    r   c                       sX   e Zd Zg dZdd Zdd Zd fdd		Zdd
dZdd Zdd Z	dd Z
  ZS )Say)
r   who_fastr   with_interact
attributesrW   temporary_attributesr   
identifierc                 C   s   t | j| jfS r^   )r   r   r   r}   r   r   r   r     s    zSay.diff_infoc                 O   s,   t | }d |_d|_d |_d |_d|_|S )NTr   )r   rr   r   r   rW   r   r   rs   rE   rF   r,   r   r   r   rr     s    
zSay.__new__TNc
           
         s   t t| | |d urH| | _ttjj	d | jr@d| _
qTd| _
nd | _d| _
|| _|| _|| _|| _|| _|| _|	d ur|	| _d S )N$TF)superr   r/   stripr   rematchr   parserZword_regexpr   r   r   r   rW   r   r   r   )
r,   r   r   r   r   r   r   rW   r   r   	__class__r   r   r/   $  s     
zSay.__init__c                 C   s   g }| j r|| j  | jd ur,|| j | jrH|d || j | j}|d ur^||}|tj| | j	s|d t
| dd r|d |t
| dd  | jr|| j  | jr|d || j d|S )N@Z
nointeractr   r   with )r   r(   r   rc   r   r   r   translationZencode_say_stringr   getattrrW   rp   r   r=   )r,   r   r-   r   r   r   r   rp   D  s.    




zSay.get_codec              	   C   s  t | j z`| jtj _| jtj _t| j	| j
}|d urdt|dd}t|rZ| }t| ntd |d u st|st|tstd| j	d | j}tjjrtj|}|tj_| jd ur| j \}}nd}i }|d| j t|ddr| j	tj_|tj_|tj_|tj_t| j tjj!j" tj#j$||g|R i | W d tj _d tj _d	tj_n"d tj _d tj _d	tj_0 d S )
Nr   r   z%Sayer %s is not a function or string.r   r   r   Z
record_sayT )%r   rA   r   r   r   r   say_attributesr   r   r   r   r   callabler   r   r   rS   r   r   r   say_menu_text_filterr   Z_last_raw_whatrW   rh   
setdefaultr   Z_last_say_whoZ_last_say_whatZ_last_say_argsZ_last_say_kwargsr   r   	interfaceset_transitionexportsr   )r,   r   Z	stmt_namer   rE   rF   r   r   r   r   h  sP    




zSay.executec              	   C   s   t j j}t j j}z| jt j _| jt j _t| j| j}dd }t	| j
| | j}t jjrrt j|}t j|| W |t j _|t j _n|t j _|t j _0 | jgS )Nc                 S   s   t jj| d d d d S N)Z
old_widgetZ
new_widgetr   displayr   displayabletransr   r   r   predict_with  s    z!Say.predict.<locals>.predict_with)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zpredict_sayrA   )r,   Zold_attributesZold_temporary_attributesr   r   r   r   r   r   r     s"    zSay.predictc                 C   sD   t | }t| j| j}||_d|_| jr:tj	|| nd|_
|S )NTF)r   r   r   r   r   r   r   r   r   Zscry_sayr   )r,   r-   r   r   r   r   r     s    
zSay.scry)TNNNN)N)rO   rP   rQ   r   r   rr   r/   rp   r   r   r   __classcell__r   r   r   r   r   	  s   	 
$8r   r   c                       sL   e Zd ZddgZ fddZdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )Initr   priorityc                    s    t t| | || _|| _d S r^   )r   r   r/   r   r   )r,   r   r   r   r   r   r   r/     s    zInit.__init__c                 C   s"   ||  | j D ]}|| qd S r^   r   r   r,   r   r   r   r   r   r     s    
zInit.get_childrenc                 C   s   | j | jd fS r"   )r   r   r}   r   r   r   r     s    zInit.get_initc                 C   s   || _ t| jd  d S r^   rA   r   r   r   r   r   r   r     s    z
Init.chainc                 C   s"   t | j tjd td d S )N<   initr   rA   r   	executionZnot_infinite_loopr   r}   r   r   r   r     s    
zInit.executec                 C   s   || j  d S r^   r   r   r   r   r   r     s    zInit.restructure)rO   rP   rQ   r   r/   r   r   r   r   r   r   r   r   r   r   r     s   r   c                       s^   e Zd ZdZdZg dZdd Zd fdd	Zd	d
 Zdd Z	dd Z
dd Zdd Z  ZS )LabelforceT)r   r#   r   hidec                 O   s   t | }d |_d|_|S )NF)r   rr   r#   r	  r   r   r   r   rr     s    
zLabel.__new__Fc                    s,   t t| | || _|| _|| _|| _dS )z
        Constructs a new Label node.

        @param name: The name of this label.
        @param block: A (potentially empty) list of nodes making up the
        block associated with this label.
        N)r   r  r/   r   r   r#   r	  )r,   r   r   r   r#   r	  r   r   r   r/   	  s
    	zLabel.__init__c                 C   s
   t | jfS r^   )r  r   r}   r   r   r   r     s    zLabel.diff_infoc                 C   s"   ||  | j D ]}|| qd S r^   r   r   r   r   r   r     s    
zLabel.get_childrenc                 C   s*   | j r | j d | _t| j | n|| _d S r"   )r   rA   r   r   r   r   r   r   "  s    zLabel.chainc                 C   s   t | j td tj   t| jtj	j
tj	j}| D ]"\}}tj| ttj	|| q>d tj	_
d tj	_tjjrtj| jtj j d S )Nlabel)r   rA   r   r   r   r   Z	mark_seenrT   r#   r   _args_kwargsitemsr   Zdynamicsetattrr   label_callbackr   Zlast_abnormal)r,   valuesrf   rg   r   r   r   r   *  s    
zLabel.executec                 C   s   || j  d S r^   r  r   r   r   r   r   <  s    zLabel.restructure)F)rO   rP   rQ   r   r   r   rr   r/   r   r   r   r   r   r   r   r   r   r   r    s   r  c                       sN   e Zd Zg dZdd Zd fdd	Zdd	 Zd
d Zdd Zdd Z	  Z
S )Pythonr	  r   r   c                 O   s   t | }d|_|S Nr   r   rr   r   r   r   r   r   rr   H  s    
zPython.__new__Fr   c                    sF   t t| | || _|r,t||dd| _nt||dd| _|| _dS 
        @param code: A PyCode object.

        @param hide: If True, the code will be executed with its
        own local dictionary.
        r	  r   r   r   N)r   r  r/   r	  r   r   r   r,   r   python_coder	  r   r   r   r   r/   M  s    zPython.__init__c                 C   s   t | jjfS r^   )r  r   r   r}   r   r   r   r   `  s    zPython.diff_infoc                 C   s   t j| j d S r^   )r   r8   create_storer   r}   r   r   r   r   c  s    zPython.early_executec                 C   sx   t | j td z>tjj| jj| j| j	d W tj
 jsttjjD ]
}|  qDn"tj
 jsrtjjD ]
}|  qf0 d S )Nr8   r   )r   rA   r   r   r8   py_exec_bytecoder   r   r	  r   r   r   
init_phaser   python_callbacks)r,   r   r   r   r   r   f  s    

zPython.executec                 C   s   t | }d|_|S NT)r   r   r   r   r   r   r   r   r  s    
zPython.scry)Fr   )rO   rP   rQ   r   rr   r/   r   r   r   r   r   r   r   r   r   r  @  s   r  c                       sF   e Zd Zg dZdd Zd fdd	Zdd	 Zd
d Zdd Z  Z	S )EarlyPythonr  c                 O   s   t | }d|_|S r  r  r   r   r   r   rr     s    
zEarlyPython.__new__Fr   c                    sF   t t| | || _|r,t||dd| _nt||dd| _|| _dS r  )r   r   r/   r	  r   r   r   r  r   r   r   r/     s    zEarlyPython.__init__c                 C   s   t | jjfS r^   )r   r   r   r}   r   r   r   r     s    zEarlyPython.diff_infoc                 C   s"   t | j tjd td d S )Nr  zpython earlyr  r}   r   r   r   r     s    
zEarlyPython.executec                 C   s4   t j| j | jjr0t jj| jj| j| jd d S )Nr  )r   r8   r  r   r   r   r  r	  r}   r   r   r   r     s    zEarlyPython.early_execute)Fr   )
rO   rP   rQ   r   rr   r/   r   r   r   r   r   r   r   r   r   x  s   r   c                       s>   e Zd Zg dZd fdd	Zdd Zdd Zd	d
 Z  ZS )Image)imgnamer   atlNc                    sB   t t| | || _|r2t||dd| _d| _nd| _|| _dS )z
        @param name: The name of the image being defined.

        @param expr: An expression yielding a Displayable that is
        assigned to the image.
        evalr  N)r   r!  r/   r"  r   r   r#  )r,   r   r   r   r#  r   r   r   r/     s    zImage.__init__c                 C   s   t t| jfS r^   )r!  r>   r"  r}   r   r   r   r     s    zImage.diff_infoc                 C   sR   t | j td | jd ur.tj| jj}ntjj	
| j}tj| j| d S )Nimage)r   rA   r   r   r   r8   py_eval_bytecoder   r   motionATLTransformr#  r   r%  r"  )r,   imgr   r   r   r     s    

zImage.executec                 C   s    t | dd d ur| jt d S Nr#  r   r#  r   EMPTY_PARAMETERSr}   r   r   r   r     s    zImage.analyze)NN)	rO   rP   rQ   r   r/   r   r   r   r   r   r   r   r   r!    s
   r!  c                       sF   e Zd Zg dZeZdef fdd	Zdd Zdd Zd	d
 Z	  Z
S )	Transform)varnamer#  r#   Nc                    s&   t t| | || _|| _|| _d S r^   )r   r-  r/   r.  r#  r#   )r,   r   r   r#  r#   r   r   r   r/     s    zTransform.__init__c                 C   s
   t | jfS r^   )r-  r.  r}   r   r   r   r     s    zTransform.diff_infoc                 C   s|   t | j td t| dd }|d u r,tj}tjjj	| j
|d}tjj| j| j| jf tj| j ttj| j| d S )N	transformr#   )r#   )r   rA   r   r   r-  default_parametersr   r   r'  r(  r#  r   Z
transformsr(   r.  rv   rw   r   purer  r   )r,   r#   r   r   r   r   r     s    
zTransform.executec                 C   s*   t | dd }|d u rtj}| j| d S )Nr#   )r   r-  r0  r#  r   )r,   r#   r   r   r   r     s    zTransform.analyze)rO   rP   rQ   r   r,  r0  r/   r   r   r   r   r   r   r   r   r-    s   r-  c              	   C   sB  t | dkr | \}}}}}}}	n0t | dkr>| \}}}}}}n| \}}}d}d}|rztj|}
tj|
}
W q ty   Y dS 0 nd}
g }|D ].}z|tj| W q ty   Y q0 q|durz|tjj	
| W n ty   Y n0 tj||p|t|}|r*tj j| tjj|||
|d dS )zW
    Call this to use the given callback to predict the image named
    in imspec.
          N)r   tag)r?   r   r8   rD   easyr   rS   r(   r   r'  r(  r   default_layerrX   r   r   imagesZpredict_sceneZpredict_show)imspecscener#  r   ro   r4  Zat_expr_listlayer_zorder_behindr)  at_listr   r   r   r   predict_imspec  s:    

r>  c           	   
   C   s   t | dkr | \}}}}}}}n<t | dkrB| \}}}}}}g }n| \}}}d }d }d }g }|d urrtj|}nd }|d urtj|}tj|}dd |D }tj||p|t|o|d u }tj	j
||||||||d d S )Nr2  r3  c                 S   s   g | ]}t j|qS r   r   r8   rD   r2   r   r   r   r7   W  r5   zshow_imspec.<locals>.<listcomp>)r=  r:  r   zorderr4  behindr#  )r?   r   r8   rD   r5  r   r   r6  rX   r   show)	r8  r#  r   ro   r4  r=  r:  r@  rA  r   r   r   show_imspec>  s6    
 rC  c                       sJ   e Zd ZddgZdZd fdd	Zdd Zd	d
 Zdd Zdd Z	  Z
S )Showr8  r#  TNc                    s    t t| | || _|| _dS )z
        @param imspec: A triple consisting of an image name (itself a
        tuple of strings), a list of at expressions, and a layer.
        N)r   rD  r/   r8  r#  )r,   r   r8  r#  r   r   r   r/   n  s    zShow.__init__c                 C   s   t t| jd fS r"   )rD  r>   r8  r}   r   r   r   r   y  s    zShow.diff_infoc                 C   s,   t | j td t| jt| dd d d S )NrB  r#  r#  )r   rA   r   rC  r8  r   r}   r   r   r   r   |  s    
zShow.executec                 C   s   t | jt| dd d | jgS )Nr#  rE  )r>  r8  r   rA   r}   r   r   r   r     s    zShow.predictc                 C   s    t | dd d ur| jt d S r*  r+  r}   r   r   r   r     s    zShow.analyze)NrO   rP   rQ   r   r   r/   r   r   r   r   r   r   r   r   r   rD  e  s   rD  c                       sH   e Zd ZdZg dZ fddZdd Zdd Zd	d
 Zdd Z	  Z
S )	ShowLayerTr:  r=  r#  c                    s&   t t| | || _|| _|| _d S r^   )r   rG  r/   r:  r=  r#  r,   r   r:  r=  r#  r   r   r   r/     s    zShowLayer.__init__c                 C   s
   t | jfS r^   rG  r:  r}   r   r   r   r     s    zShowLayer.diff_infoc                 C   s\   t | j td dd | jD }| jd urFtjj| j}|	| tj
j|| jd d S )N
show layerc                 S   s   g | ]}t j|qS r   r?  r2   r   r   r   r7     r5   z%ShowLayer.execute.<locals>.<listcomp>)r:  r   rA   r   r=  r#  r   r   r'  r(  r(   r   Zlayer_at_listr:  r,   r=  r#  r   r   r   r     s    


zShowLayer.executec                 C   s   | j gS r^   r   r}   r   r   r   r     s    zShowLayer.predictc                 C   s   | j d ur| j t d S r^   r#  r   r,  r}   r   r   r   r     s    
zShowLayer.analyzerO   rP   rQ   r   r   r/   r   r   r   r   r   r   r   r   r   rG    s   rG  c                       sH   e Zd ZdZg dZ fddZdd Zdd Zd	d
 Zdd Z	  Z
S )CameraTrH  c                    s&   t t| | || _|| _|| _d S r^   )r   rP  r/   r:  r=  r#  rI  r   r   r   r/     s    zCamera.__init__c                 C   s
   t | jfS r^   rJ  r}   r   r   r   r     s    zCamera.diff_infoc                 C   s^   t | j td dd | jD }| jd urFtjj| j}|	| tj
j|| jdd d S )NrK  c                 S   s   g | ]}t j|qS r   r?  r2   r   r   r   r7     r5   z"Camera.execute.<locals>.<listcomp>T)r:  ZcamerarL  rM  r   r   r   r     s    


zCamera.executec                 C   s   | j gS r^   r   r}   r   r   r   r     s    zCamera.predictc                 C   s   | j d ur| j t d S r^   rN  r}   r   r   r   r     s    
zCamera.analyzerO  r   r   r   r   rP    s   rP  c                       sJ   e Zd Zg dZdZd fdd	Zdd Zdd	 Zd
d Zdd Z	  Z
S )Scene)r8  r:  r#  TNc                    s&   t t| | || _|| _|| _dS )z
        @param imspec: A triple consisting of an image name (itself a
        tuple of strings), a list of at expressions, and a layer, or
        None to not have this scene statement also display an image.
        N)r   rQ  r/   r8  r:  r#  )r,   r   imgspecr:  r#  r   r   r   r/     s    zScene.__init__c                 C   s"   | j rt| j d }nd }t|fS r"   )r8  r>   rQ  )r,   datar   r   r   r     s    zScene.diff_infoc                 C   s@   t | j td tj| j | jr<t| jt	| dd d d S )Nr9  r#  rE  )
r   rA   r   r   r   r9  r:  r8  rC  r   r}   r   r   r   r     s
    
zScene.executec                 C   s&   | j rt| j t| dd dd | jgS )Nr#  T)r#  r9  )r8  r>  r   rA   r}   r   r   r   r     s    zScene.predictc                 C   s    t | dd d ur| jt d S r*  r+  r}   r   r   r   r     s    zScene.analyze)NrF  r   r   r   r   rQ    s   	
rQ  c                       s>   e Zd ZdgZdZ fddZdd Zdd Zd	d
 Z  Z	S )Hider8  Tc                    s   t t| | || _dS )z
        @param imspec: A triple consisting of an image name (itself a
        tuple of strings), a list of at expressions, and a list of
        with expressions.
        N)r   rT  r/   r8  )r,   r   rR  r   r   r   r/     s    zHide.__init__c                 C   s   t t| jd fS r"   )rT  r>   r8  r}   r   r   r   r   '  s    zHide.diff_infoc                 C   s   t | jdkr$| j\}}}}}}}nBt | jdkrJ| j\}}}}}}d }n| j\}}}d }d }d }d }|d u rv|d }tj||}tj j||f | j	gS )Nr2  r3  r   )
r?   r8  r   r   r6  r   r   r7  Zpredict_hiderA   r,   r   Z_expressionr4  Z_at_listr:  r;  r<  r   r   r   r   *  s    zHide.predictc                 C   s   t | j td t| jdkr6| j\}}}}}}}n:t| jdkrX| j\}}}}}}n| j\}}}d }d }d}tj||p~|}tj	|p|| d S )Nr	  r2  r3  r   )
r   rA   r   r?   r8  r   r   r6  r   r	  rU  r   r   r   r   B  s    
zHide.execute)
rO   rP   rQ   r   r   r/   r   r   r   r   r   r   r   r   rT    s   rT  c                       sF   e Zd ZddgZdd Zd fdd	Zdd	 Zd
d Zdd Z  Z	S )Withr   pairedc                 O   s   t | }d |_|S r^   )r   rr   rW  r   r   r   r   rr   ]  s    
zWith.__new__Nc                    s    t t| | || _|| _dS )zI
        @param expr: An expression giving a transition or None.
        N)r   rV  r/   r   rW  )r,   r   r   rW  r   r   r   r/   b  s    zWith.__init__c                 C   s
   t | jfS r^   )rV  r   r}   r   r   r   r   k  s    zWith.diff_infoc                 C   sR   t | j td tj| j}| jd ur:tj| j}nd }tjj	||d d S )Nr   )rW  )
r   rA   r   r   r8   rD   r   rW  r   r   )r,   r   rW  r   r   r   r   n  s    

zWith.executec                 C   sH   z,t j| j}|r*t jj|d d d W n ty>   Y n0 | jgS r   )	r   r8   rD   r   r   r   r   rS   rA   )r,   r   r   r   r   r   |  s    zWith.predict)N)
rO   rP   rQ   r   rr   r/   r   r   r   r   r   r   r   r   rV  V  s   	rV  c                       sL   e Zd Zg dZdd Z fddZdd Zdd	 Zd
d Zdd Z	  Z
S )Call)r
  rW   ro   c                 O   s   t | }d |_|S r^   )r   rr   rW   r   r   r   r   rr     s    
zCall.__new__c                    s&   t t| | || _|| _|| _d S r^   )r   rX  r/   r
  ro   rW   )r,   r   r
  ro   rW   r   r   r   r/     s    zCall.__init__c                 C   s   t | j| jfS r^   )rX  r
  ro   r}   r   r   r   r     s    zCall.diff_infoc                 C   s   t d | j}| jr tj|}tj j|| j	j
d}t| dtj _| jrr| j \}}|tj_|tj_nd tj_d tj_d S )Ncall)Zreturn_siteT)r   r
  ro   r   r8   rD   r   r   rY  rA   r   r   abnormalrW   rh   r   r  r  )r,   r
  r-   rE   rF   r   r   r   r     s    
zCall.executec                 C   sj   | j }| jrRt|sg S ztj|}W n ty>   g  Y S 0 tjj	|sRg S tj
 || jjgS r^   )r
  ro   r   r   r8   rD   rS   r   rz   	has_labelr   Zpredict_callrA   r   r,   r
  r   r   r   r     s    
zCall.predictc                 C   s   t | }d |_|S r^   r   r   r   r   r   r   r   r     s    
z	Call.scry)rO   rP   rQ   r   rr   r/   r   r   r   r   r   r   r   r   r   rX    s   rX  c                       sR   e Zd ZdgZdd Z fddZdd Zdd	 Zd
d Zdd Z	dd Z
  ZS )Returnro   c                 O   s   t | }d |_|S r^   )r   rr   ro   r   r   r   r   rr     s    
zReturn.__new__c                    s   t t| | || _d S r^   )r   r^  r/   ro   )r,   r   ro   r   r   r   r/     s    zReturn.__init__c                 C   s   t fS r^   )r^  r}   r   r   r   r     s    zReturn.diff_infoc                 C   s
   d | _ d S r^   r   r   r   r   r   r     s    zReturn.chainc                 C   s   t d | jr"tj| jtj_nd tj_tj }tj j	rbt
|jdkrbtjjr^tdd S ttj jdd tj   d S )Nreturnr   z(Unexpected return during the init phase.T)r;   )r   ro   r   r8   rD   r   Z_returnr   r   r  r?   Zreturn_stackr   	developerrS   r   Zlookup_returnZpop_dynamic)r,   ctxr   r   r   r     s    
zReturn.executec                 C   s   t j  gS r^   )r   r   r   Zpredict_returnr}   r   r   r   r     s    zReturn.predictc                 C   s   t | }d |_|S r^   r]  r   r   r   r   r     s    
zReturn.scry)rO   rP   rQ   r   rr   r/   r   r   r   r   r   r   r   r   r   r   r^    s   r^  c                       sp   e Zd ZdZg dZdd Z f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  ZS )MenuT)r  r_   r   has_captionrW   item_argumentsr   c                 O   s&   t | }d|_d |_d |_d|_|S )NFr  )r   rr   rc  rW   rd  r   r   r   r   r   rr     s    
zMenu.__new__c                    s8   t t| | || _|| _|| _|| _|| _|| _d S r^   )	r   rb  r/   r  r_   r   rc  rW   rd  )r,   r   r  r_   r   rc  rW   rd  r   r   r   r/     s    zMenu.__init__c                 C   s   t fS r^   )rb  r}   r   r   r   r   #  s    zMenu.diff_infoc                 C   s6   ||  | j D ]"\}}}|r|D ]}|| q qd S r^   )r  r   )r,   r   _label
_conditionr   r   r   r   r   r   &  s
    zMenu.get_childrenc                 C   s*   || _ | jD ]\}}}|rt|| qd S r^   )rA   r  r   )r,   rA   re  rf  r   r   r   r   r   /  s    z
Menu.chainc                 C   s@   t | || | jD ]&\}}}|r|d |u r|d| qd S r"   )r   r   r  insert)r,   r   r   re  rf  r   r   r   r   r   7  s    zMenu.replace_nextc                 C   s  t | j | jstjjr"td ntd | jd urD| j \}}nd  }}g }g }g }t	| j
D ]\}\}}}	tjjrtj|}d}
|	d u rtjjr|r|| q|||d f d}
n ||||f d}
t |	d  |
rb| jr| j| d ur|| j|   qb|di f qb|r>tjjd d|dd t| jtjjj tj|| j|||}|d urt | j
| d	 d  n
t | j d S )
Nzmenu-with-captionmenuFTr   r   
)r   rV   )r   rA   rc  r   r   choice_empty_windowr   rW   rh   rb   r  r   narrator_menur(   rd  r   r   r=   r   r   r   r   r   rh  r_   )r,   rE   rF   choicesZ	narrationrd  r   r
  	conditionr   Zhas_itemchoicer   r   r   r   >  sB    



zMenu.executec                 C   sJ   g }dd }t | j| tj  | jD ]\}}}|r(||d  q(|S )Nc                 S   s   t jj| d d d d S r   r   r   r   r   r   r   y  s    z"Menu.predict.<locals>.predict_withr   )r   r   r   r   Zpredict_menur  r(   )r,   r-   r   re  rf  r   r   r   r   r   v  s    
zMenu.predictc                 C   s&   t | }d |_d|_| jr"d|_|S r  )r   r   r   r   rc  r   r   r   r   r   r     s    
z	Menu.scryc                 C   s&   | j D ]\}}}|d ur|| qd S r^   )r  )r,   r   re  rf  r   r   r   r   r     s    zMenu.restructure)rO   rP   rQ   r   r   rr   r/   r   r   r   r   r   r   r   r   r   r   r   r   r   rb    s   

	8rb  c                       sL   e Zd ZddgZ fddZdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )Jumptargetro   c                    s    t t| | || _|| _d S r^   )r   ro  r/   rp  ro   )r,   r   rp  ro   r   r   r   r/     s    zJump.__init__c                 C   s   t | j| jfS r^   )ro  rp  ro   r}   r   r   r   r     s    zJump.diff_infoc                 C   s
   d | _ d S r^   r   r   r   r   r   r     s    z
Jump.chainc                 C   sF   t d | j}| jr tj|}tjj|}dtj	 _
t| d S )NZjumpT)r   rp  ro   r   r8   rD   r   rz   lookupr   rZ  r   )r,   rp  r-   r   r   r   r     s    zJump.executec                 C   sb   | j }| jrRt|sg S ztj|}W n ty>   g  Y S 0 tjj	|sRg S tjj
|gS r^   )rp  ro   r   r   r8   rD   rS   r   rz   r[  rq  r\  r   r   r   r     s    
zJump.predictc                 C   s.   t | }| jrd |_ntjj| j|_|S r^   )	r   r   ro   r   r   r   rz   rq  rp  r   r   r   r   r     s
    
z	Jump.scry)rO   rP   rQ   r   r/   r   r   r   r   r   r   r   r   r   r   ro    s   ro  c                   @   s    e Zd Zg Zdd Zdd ZdS )Passc                 C   s   t fS r^   )rr  r}   r   r   r   r     s    zPass.diff_infoc                 C   s   t | j td d S )Npassr   rA   r   r}   r   r   r   r     s    
zPass.executeN)rO   rP   rQ   r   r   r   r   r   r   r   rr    s   rr  c                       sd   e Zd ZddgZ f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  ZS )Whilerm  r   c                    s    t t| | || _|| _d S r^   )r   ru  r/   rm  r   )r,   r   rm  r   r   r   r   r/     s    zWhile.__init__c                 C   s
   t | jfS r^   )ru  rm  r}   r   r   r   r     s    zWhile.diff_infoc                 C   s"   ||  | j D ]}|| qd S r^   r   r   r   r   r   r     s    
zWhile.get_childrenc                 C   s   || _ t| j|  d S r^   r  r   r   r   r   r     s    zWhile.chainc                 C   s4   t | || | jr0| jd |u r0| jd| d S r"   )r   r   r   rg  r   r   r   r   r     s    zWhile.replace_nextc                 C   s2   t | j td tj| jr.t | jd  d S )Nwhiler   )r   rA   r   r   r8   rD   rm  r   r}   r   r   r   r     s    
zWhile.executec                 C   s   | j d | jgS r"   )r   rA   r}   r   r   r   r     s    zWhile.predictc                 C   s   t | }d |_|S r^   r]  r   r   r   r   r     s    
z
While.scryc                 C   s   || j  d S r^   r  r   r   r   r   r     s    zWhile.restructurerO   rP   rQ   r   r/   r   r   r   r   r   r   r   r   r   r   r   r   r   ru    s   ru  c                       sb   e Zd ZdgZ f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  ZS )Ifentriesc                    s   t t| | || _dS )zF
        @param entries: A list of (condition, block) tuples.
        N)r   rx  r/   ry  )r,   r   ry  r   r   r   r/     s    zIf.__init__c                 C   s   t fS r^   )rx  r}   r   r   r   r   &  s    zIf.diff_infoc                 C   s0   ||  | j D ]\}}|D ]}|| qqd S r^   )ry  r   )r,   r   rf  r   r   r   r   r   r   )  s    zIf.get_childrenc                 C   s$   || _ | jD ]\}}t|| qd S r^   )rA   ry  r   )r,   rA   rf  r   r   r   r   r   0  s    zIf.chainc                 C   s>   t | || | jD ]$\}}|r|d |u r|d| qd S r"   )r   r   ry  rg  )r,   r   r   rf  r   r   r   r   r   6  s    zIf.replace_nextc                 C   sD   t | j td | jD ]&\}}tj|rt |d   d S qd S )Nifr   )r   rA   r   ry  r   r8   rD   )r,   rm  r   r   r   r   r   =  s    
z
If.executec                 C   s   dd | j D | jg S )Nc                 S   s   g | ]\}}|d  qS r   r   )r3   rf  r   r   r   r   r7   I  r5   zIf.predict.<locals>.<listcomp>)ry  rA   r}   r   r   r   r   G  s    z
If.predictc                 C   s   t | }d |_|S r^   r]  r   r   r   r   r   L  s    
zIf.scryc                 C   s   | j D ]\}}|| qd S r^   )ry  )r,   r   rf  r   r   r   r   r   Q  s    zIf.restructurerw  r   r   r   r   rx    s   	
rx  c                       s   e Zd Zg dZdd Z f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d Zdd Zd d! Zd'd#d$Zd%d& Z  ZS )(UserStatement)lineparsedr   r   
code_blockr   r   	subparsesc                 O   s2   t | }g |_d |_d|_d|_d|_g |_|S )NFr   )r   rr   r   r  r   r   r   r  r   r   r   r   rr   c  s    
zUserStatement.__new__c                    sT   t t| | d | _|| _|| _|| _g | _| d| _	t
jd| jpLd| _d S )Nr
  r   r   )r   r|  r/   r  r~  r}  r   r  rY  r   r   
statementsr   r   )r,   r   r}  r   r~  r   r   r   r/   m  s    zUserStatement.__init__c                 C   s   d | jS )Nz<UserStatement {!r}>)rl   r}  r}   r   r   r   __repr__y  s    zUserStatement.__repr__c                 C   sN   ||  | j d ur(| j D ]}|| q| jD ]}|jD ]}|| q8q.d S r^   )r  r   r  r   )r,   r   r   jr   r   r   r   |  s    



zUserStatement.get_childrenc                 C   s8   || _ | jd urt| j| | jD ]}t|j| q"d S r^   )rA   r  r   r  r   )r,   rA   r   r   r   r   r     s
    

zUserStatement.chainc                 C   s\   t | || | jr0| jd |u r0| jd| | jD ] }|jd |u r6| jd| q6d S r"   )r   r   r  rg  r  r   )r,   r   r   r   r   r   r   r     s    
zUserStatement.replace_nextc                 C   s*   | j r|| j  | jD ]}||j qd S r^   )r  r  r   )r,   r   r   r   r   r   r     s    

zUserStatement.restructurec                 C   s
   t | jfS r^   )r|  r}  r}   r   r   r   r     s    zUserStatement.diff_infoc                 O   sD   | j }|d u r(tj| | j| j}|| _ tjj||g|R i |S r^   )r~  r   r  parser}  r   rY  )r,   methodrE   rF   r~  r   r   r   rY    s
    zUserStatement.callc                 C   s   |  d d S )Nexecute_initrY  r}   r   r   r   r    s    zUserStatement.execute_initc                 C   s
   d| j fS r"   )r  r}   r   r   r   r     s    zUserStatement.get_initc                 C   s&   t |   t|   | d d S )Nr   )r   get_nextr   get_namerY  r}   r   r   r   r     s    zUserStatement.executec                 C   s   |  d}|d ur(|D ]}tj| q| jrVtjd| jrVdd | jD | jg S | jrf| jj	}nd }|  d|}|d urdd |D }dd |D S | jgS )Nr   Zpredict_allc                 S   s   g | ]}|j d  qS r{  r  r2   r   r   r   r7     r5   z)UserStatement.predict.<locals>.<listcomp>Zpredict_nextc                 S   s"   g | ]}|d urt jj|qS r^   )r   r   rz   Zlookup_or_noner2   r   r   r   r7     r5   c                 S   s   g | ]}|d ur|qS r^   r   r2   r   r   r   r7     r5   )
rY  r   r5  r   r~  r  r   r  rA   r   )r,   Zpredictionsr   Z
next_labelZ	next_listZnextsr   r   r   r     s    

zUserStatement.predictc                 C   s4   | j }|d u r(tj| | j| j}|| _ tj|S r^   )r~  r   r  r  r}  r   r  )r,   r~  r   r   r   r    s
    zUserStatement.get_namec                 C   sP   | j r&t| j r&| d| j d j}n
| d}|d urFtjj|S | jS d S )NrA   r   )	r  r?   rY  r   r   r   rz   rq  rA   r   r   r   r   r    s    
zUserStatement.get_nextc                 C   s$   t | }|  |_| d| |S )Nr   )r   r   r  r   rY  r   r   r   r   r     s    

zUserStatement.scryNc                 C   s   | j S r^   )r}  r   r   r   r   rp     s    zUserStatement.get_codec                 C   s   |  drdS dS )Nr   TFr  r}   r   r   r   r     s    
zUserStatement.can_warp)N)rO   rP   rQ   r   rr   r/   r  r   r   r   r   r   rY  r  r   r   r   r  r  r   rp   r   r   r   r   r   r   r|  V  s&   
	

	
r|  c                       s:   e Zd ZdgZ fddZdd Zdd Zdd	 Z  ZS )
PostUserStatementparentc                    s(   t t| | || _| jd| _d S )NZ
post_label)r   r  r/   r  rY  r   )r,   r   r  r   r   r   r/     s    zPostUserStatement.__init__c                 C   s   d | jjS )Nz<PostUserStatement {!r}>)rl   r  r}  r}   r   r   r   r  	  s    zPostUserStatement.__repr__c                 C   s   t | jjfS r^   )r  r  r}  r}   r   r   r   r   	  s    zPostUserStatement.diff_infoc                 C   s,   t | j td| j   | jd d S )Nzpost Zpost_execute)r   rA   r   r  r  rY  r}   r   r   r   r   
	  s    
zPostUserStatement.execute)	rO   rP   rQ   r   r/   r  r   r   r   r   r   r   r   r    s   r  c                 C   sh   | t jjv rd S d| dd d }|t jjv rXt jj| jsXtd|dd  t j	|  d S )N.rV   z9Creating stores within the {} namespace is not supported.r3  )
r   r   special_namespacesr=   splitZallow_child_namespacesrS   rl   r8   r  )r   Zmaybe_specialr   r   r   r  	  s    r  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )StoreNamespaceTc                 C   s
   || _ d S r^   r  )r,   r   r   r   r   r/   !	  s    zStoreNamespace.__init__c                 C   s   |t jj| j |< d S r^   r   r8   r   r   r,   r   rI   r   r   r   r_   $	  s    zStoreNamespace.setc                 C   s   |t jj| j |< d S r^   r  r  r   r   r   set_default'	  s    zStoreNamespace.set_defaultc                 C   s   t jj| j | S r^   r  r   r   r   r   r   *	  s    zStoreNamespace.getN)rO   rP   rQ   r1  r/   r_   r  r   r   r   r   r   r  	  s
   r  c                 C   s(   | t jjv rt jj|  dfS t| dfS )z
    Returns the namespace object for `store`, and a flag that is true if the
    namespace is special, and false if it is a normal store.
    TF)r   r   r  r  r  r   r   r   get_namespace.	  s    r  >   keyword_after_pythonsteam_appidr[   save_directoryr   allow_duplicate_labelsc                       sT   e Zd Zg dZdd Z fddZdd Zdd	 Zd
d Zdd Z	dd Z
  ZS )Define)r.  r   r   operatorindexc                 O   s    t | }d|_d|_d |_|S )Nr   =)r   rr   r   r  r  r   r   r   r   rr   R	  s
    
zDefine.__new__c                    sV   t t| | || _|| _|d ur6t||dd| _nd | _|| _t||dd| _d S Nr$  r  )	r   r  r/   r   r.  r   r  r  r   )r,   r   r   r   r  r  r   r   r   r   r/   Y	  s    zDefine.__init__c                 C   s   t | j| jfS r^   )r  r   r.  r}   r   r   r   r   g	  s    zDefine.diff_infoc                 C   s^   t | j | jdkrd S | jd ur&d S | jdkrZ| jtv rZtj| j	j
}ttj| j| d S )Nr  zstore.config)r  r   r  r  r.  EARLY_CONFIGr   r8   r&  r   r   r  r   )r,   rI   r   r   r   r   j	  s    


zDefine.early_executec                 C   s   t | j td t|  | jdkrBtjj| j	| j
| jf n,tjj| jdd  d | j	 | j
| jf | jdkr| jd u rt| j\}}t|ddrtj| jd | j	  |   d S )Ndefiner   r3  r  r  r1  T)r   rA   r   define_statementsr(   r   r   r   definitionsr.  rv   rw   r  r  r  r   r   r1  r_   )r,   ns_specialr   r   r   r   x	  s    


,zDefine.executec                 C   s   | j |vrd S |   d S r^   )r   r_   )r,   storesr   r   r   redefine	  s    
zDefine.redefinec                 C   s   d }d }t j| jj}t| j\}}| jd u rL| jdkrL|	| j
| d S || j
}|}| jrt j| jj}| jdkr|| }| jdkr|}n&| jdkr|| }n| jdkr||B }| jr|||< n|	| j
| d S )Nr  z+=z|=)r   r8   r&  r   r   r  r   r  r  r_   r.  r   )r,   keyr   rI   r  r  baser   r   r   r   r_   	  s,    





z
Define.set)rO   rP   rQ   r   rr   r/   r   r   r   r  r_   r   r   r   r   r   r  H	  s   r  c                 C   s   t D ]}||  qdS )z.
    Re-runs the given define statements.
    N)r  r  )r  r   r   r   r   r  	  s    r  c                       sT   e Zd Zg dZdd Z fddZdd Zdd	 Zd
d Zdd Z	dd Z
  ZS )Default)r.  r   r   c                 O   s   t | }d|_|S r  r  r   r   r   r   rr   	  s    
zDefault.__new__c                    s0   t t| | || _|| _t||dd| _d S r  )r   r  r/   r   r.  r   r   )r,   r   r   r   r   r   r   r   r/   	  s    zDefault.__init__c                 C   s   t | j| jfS r^   )r  r   r.  r}   r   r   r   r   	  s    zDefault.diff_infoc                 C   s   t | j d S r^   )r  r   r}   r   r   r   r   	  s    zDefault.early_executec                 C   s   t | j td t| j\}}|rFtj| jj	}|
| j| d S t|  | jdkrvtjj| j| j| jf n,tjj| jdd  d | j | j| jf d S )NrK   r   r3  r  )r   rA   r   r  r   r   r8   r&  r   r   r  r.  default_statementsr(   r   r  rv   rw   )r,   r  specialrI   r   r   r   r   	  s    


zDefault.executec                 C   s   t jj| j }|dd }|d u r@t j  |d< }|jd | j	|v rn|rjt j
jrjtd| j| j	d S |rt j
jdu rd| j| j	f}|t jjv rtd||s| j	|jvrt j| jj|| j	< |j| j	 || j	 d S )NZ_defaults_setz-{}.{} is being given a default a second time.Tr  zG{} is being given a default, but a store with that name already exists.)r   r8   r   r   r   ra   RevertableSetever_been_changedaddr.  r   r`  rS   rl   r=   r&  r   r   )r,   startdZdefaults_setfullnamer   r   r   r  	  s"    
zDefault.set_defaultc                 C   s   | j | j|d fgS r^   )rv   rw   )r,   r   lastr   r   r   report_traceback
  s    zDefault.report_traceback)rO   rP   rQ   r   rr   r/   r   r   r   r  r  r   r   r   r   r   r  	  s   r  c                       s2   e Zd ZdgZ fddZdd Zdd Z  ZS )Screenscreenc                    s   t t| | || _dS )z
        @param screen: The screen object being defined.
        In SL1, an instance of screenlang.ScreenLangScreen.
        In SL2, an instance of sl2.slast.SLScreen.
        N)r   r  r/   r  )r,   r   r  r   r   r   r/   
  s    zScreen.__init__c                 C   s   t | jjfS r^   )r  r  r   r}   r   r   r   r    
  s    zScreen.diff_infoc                 C   sF   t | j td | j| j| jf tjj	
| jj| j| jf d S )Nr  )r   rA   r   r  r  rv   rw   r   r   screensr(   r   r}   r   r   r   r   #
  s    
zScreen.executerO   rP   rQ   r   r/   r   r   r   r   r   r   r   r  
  s
   r  c                       sz   e Zd ZdZdZdZg dZd f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  ZS )	Translatea  
    A translation block, produced either by explicit translation statements
    or implicit translation blocks.

    If language is None, when executed this transfers control to the translate
    statement in the current language, if any, and otherwise runs the block.
    If language is not None, causes an error to occur if control reaches this
    statement.

    When control normally leaves a translate statement, in any language, it
    goes to the end of the translate statement in the None language.
    neverT)r   	alternatelanguager   afterNc                    s,   t t| | || _|| _|| _|| _d S r^   )r   r  r/   r   r  r  r   )r,   r   r   r  r   r  r   r   r   r/   I
  s
    zTranslate.__init__c                 C   s   t | j| jfS r^   )r  r   r  r}   r   r   r   r   Q
  s    zTranslate.diff_infoc                 C   s0   | j r | j d | _t| j | n|| _|| _d S r"   )r   rA   r   r  r   r   r   r   r   T
  s
    zTranslate.chainc                 C   sD   t | || | jr0| jd |u r0| jd| | j|u r@|| _d S r"   )r   r   r   rg  r  r   r   r   r   r   ]
  s
    
zTranslate.replace_nextc                 C   s   t jjj| jt| dd S )Nr  )r   r   rz   
translatorZlookup_translater   r   r}   r   r   r   rq  f
  s    zTranslate.lookupc                 C   s   t d | jd ur$t| j td| jtjjj	vrftjjj	
| j tj jd7  _tj jd7  _t|   | jtj _t| dd tj _d S )N	translatez)Translation nodes cannot be run directly.r6   r  )r   r  r   rA   rS   r   r   r   
persistentZ_seen_translatesr  seen_translates_countnew_translates_countrq  r   translate_identifierr   alternate_translate_identifierr}   r   r   r   r   i
  s    

zTranslate.executec                 C   s   |   }|gS r^   )rq  )r,   noder   r   r   r   {
  s    zTranslate.predictc                 C   s   t  }|  |_|S r^   )r   rq  r   r   r   r   r   r   
  s    
zTranslate.scryc                 C   s"   ||  | j D ]}|| qd S r^   r   r   r   r   r   r   
  s    
zTranslate.get_childrenc                 C   s
   || j S r^   r  r   r   r   r   r   
  s    zTranslate.restructure)N)rO   rP   rQ   rR   r   r   r   r/   r   r   r   rq  r   r   r   r   r   r   r   r   r   r   r  /
  s   		r  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )EndTranslatez|
    A node added implicitly after each translate block. It's responsible for
    resetting the translation identifier.
    r  c                 C   s   t fS r^   )r  r}   r   r   r   r   
  s    zEndTranslate.diff_infoc                 C   s.   t | j td d tj _d tj _d S )Nzend translate)r   rA   r   r   r   r   r  r  r}   r   r   r   r   
  s    
zEndTranslate.executeN)rO   rP   rQ   rR   r   r   r   r   r   r   r   r  
  s   r  c                       s<   e Zd ZdZdZg dZ fddZdd Zdd	 Z  Z	S )
TranslateStringz-
    A node used for translated strings.
    T)r  r   r   newlocc                    s,   t t| | || _|| _|| _|| _d S r^   )r   r  r/   r  r   r   r  )r,   r   r  r   r   r  r   r   r   r/   
  s
    zTranslateString.__init__c                 C   s   t fS r^   )r  r}   r   r   r   r   
  s    zTranslateString.diff_infoc                 C   sF   t | j td t| d| j| jd f}tj| j	| j
| j| d S )Nztranslate stringr  r6   )r   rA   r   r   rv   rw   r   r   Zadd_string_translationr  r   r   )r,   r  r   r   r   r   
  s    
zTranslateString.execute
rO   rP   rQ   rR   r   r   r/   r   r   r   r   r   r   r   r  
  s   r  c                       s<   e Zd ZdZdZddgZ fddZdd Zd	d
 Z  Z	S )TranslatePythonz{
    Runs python code when changing the language.

    This is no longer generated, but is still run when encountered.
    Tr  r   c                    s*   t t| | || _t||dd| _dS )r  r   r  N)r   r  r/   r  r   r   )r,   r   r  r  r   r   r   r/   
  s    zTranslatePython.__init__c                 C   s   t | jjfS r^   )r  r   r   r}   r   r   r   r   
  s    zTranslatePython.diff_infoc                 C   s   t | j td d S )NZtranslate_pythonrt  r}   r   r   r   r   
  s    
zTranslatePython.executer  r   r   r   r   r  
  s   r  c                       sL   e Zd ZdZdZddgZ fddZdd Zd	d
 Zdd Z	dd Z
  ZS )TranslateBlockz:
    Runs a block of code when changing the language.
    Tr   r  c                    s    t t| | || _|| _d S r^   )r   r  r/   r  r   )r,   r   r  r   r   r   r   r/   
  s    zTranslateBlock.__init__c                 C   s"   ||  | j D ]}|| qd S r^   r   r   r   r   r   r   
  s    
zTranslateBlock.get_childrenc                 C   s   || _ t| jd  d S r^   r  r   r   r   r   r     s    zTranslateBlock.chainc                 C   s   t | j td d S )NZtranslate_blockrt  r}   r   r   r   r     s    
zTranslateBlock.executec                 C   s   || j  d S r^   r  r   r   r   r   r     s    zTranslateBlock.restructure)rO   rP   rQ   rR   r   r   r/   r   r   r   r   r   r   r   r   r   r  
  s   	r  c                   @   s   e Zd ZdZdS )TranslateEarlyBlockz^
    This is similar to the TranslateBlock, except it runs before deferred
    styles do.
    N)rO   rP   rQ   rR   r   r   r   r   r    s   r  c                       s<   e Zd Zg dZ fddZdd Zdd Zdd	 Z  ZS )
Style)
style_namer  
propertiescleartakedelattrvariantc                    s>   t t| | || _d| _i | _d| _d| _g | _d| _	dS )zE
        `name`
            The name of the style to define.
        NF)
r   r  r/   r  r  r  r  r  r  r  )r,   r   r   r   r   r   r/   #  s    zStyle.__init__c                 C   s
   t | jfS r^   )r  r  r}   r   r   r   r   ?  s    zStyle.diff_infoc                 C   s   | j d ur(tj| j }tj |s(d S tj| j}| jrD|  | j	d urZ|
| j	 | jd urp|| j | jD ]}|| qv| jri }| j D ]0\}}tj|}|dkr|| q|||< q|| d S )Nr  )r  r   r8   rD   r   styleZget_or_create_styler  r  r  Z
set_parentr  r  r  r  rd   Zadd_properties)r,   r  r|   r   r  r   r   rI   r   r   r   rN   B  s*    




zStyle.applyc                 C   sD   t | j td tjjr8tj jr8tj	j
|  d S |   d S )Nr  )r   rA   r   r   r   defer_stylesr   r   r  r   Zdeferred_stylesr(   rN   r}   r   r   r   r   d  s    
zStyle.execute)	rO   rP   rQ   r   r/   r   rN   r   r   r   r   r   r   r    s
   
"r  c                       s4   e Zd ZddgZ fddZdd Zdd Z  ZS )	Testcaser
  testc                    s    t t| | || _|| _d S r^   )r   r  r/   r
  r  )r,   r   r
  r  r   r   r   r/   v  s    zTestcase.__init__c                 C   s
   t | jfS r^   )r  r
  r}   r   r   r   r   |  s    zTestcase.diff_infoc                 C   s(   t | j td | jtjjj| j< d S )NZtestcase)r   rA   r   r  r   ZtestexecutionZ	testcasesr
  r}   r   r   r   r     s    
zTestcase.executer  r   r   r   r   r  o  s   r  c                       s:   e Zd ZdgZ fddZdd Zdd Zdd	 Z  ZS )
RPYrestc                    s   t t| | || _d S r^   )r   r  r/   r  )r,   r   r  r   r   r   r/     s    zRPY.__init__c                 C   s
   t | jfS r^   )r  r  r}   r   r   r   r     s    zRPY.diff_infoc                 C   s   t | j td d S )NZrpyrt  r}   r   r   r   r     s    
zRPY.executec                 C   s   dd | j S )Nzrpy r   )r=   r  r}   r   r   r   rp     s    zRPY.get_code)	rO   rP   rQ   r   r/   r   r   rp   r   r   r   r   r   r    s   r  )F)N)FN)N)Y
__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   r   r   objectr!   rT   ObjectrU   r,  ZEMPTY_ARGUMENTSrt   ru   r   r   r   r   r   r   r   r   r  r   r   r  r  r   r!  r-  r>  rC  rD  rG  rP  rQ  rT  rV  rX  r^  rb  ro  rr  ru  rx  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   <module>   s   8	
 c
P2
C 2
 E'I8/44
/
')((6B4D5 @4= "	l
N _!''X