
    6bih                        S r SSKrSSKrSSKrSSKrSSKrSSKJs  J	r
  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJr   " S
 S\5      r\" SS5      \" S/ S9 " S S\5      5       5       r\" SS5      \" S/ S9 " S S\5      5       5       r\" SS5      \" S/ S9 " S S\5      5       5       rS rS rS rS rg)z!Module implementing RNN wrappers.    N)lstm)AbstractRNNCell)serialization_lib)generic_utils)
tf_inspect)	tf_export)
deprecatedc                      ^  \ rS rSrSrU 4S jrS rS rS r\	S 5       r
\	S 5       r\	S	 5       rS
 rU 4S jr\SS j5       rSrU =r$ )_RNNCellWrapper+   zBase class for cells wrappers V2 compatibility.

This class along with `rnn_cell_impl._RNNCellWrapperV1` allows to define
wrappers that are compatible with V1 and V2, and defines helper methods for
this purpose.
c                    > [         TU ]  " U0 UD6  Xl        [        R                  " UR
                  5      nSUR                  ;   =(       d    UR                  S LU R                  l	        g )Ntraining)
super__init__cellr   getfullargspeccallargsvarkw
_call_specexpects_training_arg)selfr   r   kwargscell_call_spec	__class__s        _/home/james-whalen/.local/lib/python3.13/site-packages/tf_keras/src/layers/rnn/cell_wrappers.pyr   _RNNCellWrapper.__init__3   s[    $)&)	#22499=.---00""$. 	,    c                     [         e)a  Calls the wrapped cell and performs the wrapping logic.

This method is called from the wrapper's `call` or `__call__` methods.

Args:
  inputs: A tensor with wrapped cell's input.
  state: A tensor or tuple of tensors with wrapped cell's state.
  cell_call_fn: Wrapped cell's method to use for step computation
    (cell's `__call__` or 'call' method).
  **kwargs: Additional arguments.

Returns:
  A pair containing:
  - Output: A tensor with cell's output.
  - New state: A tensor or tuple of tensors with new wrapped cell's
    state.
)NotImplementedErrorr   inputsstatecell_call_fnr   s        r   _call_wrapped_cell"_RNNCellWrapper._call_wrapped_cell;   s
    $ "!r   c                 T    U R                   " X4SU R                  R                  0UD6$ )a  Runs the RNN cell step computation.

When `call` is being used, we assume that the wrapper object has been
built, and therefore the wrapped cells has been built via its `build`
method and its `call` method can be used directly.

This allows to use the wrapped cell and the non-wrapped cell
equivalently when using `call` and `build`.

Args:
  inputs: A tensor with wrapped cell's input.
  state: A tensor or tuple of tensors with wrapped cell's state.
  **kwargs: Additional arguments passed to the wrapped cell's `call`.

Returns:
  A pair containing:

  - Output: A tensor with cell's output.
  - New state: A tensor or tuple of tensors with new wrapped cell's
    state.
r$   )r%   r   r   )r   r"   r#   r   s       r   r   _RNNCellWrapper.callO   s2    , &&
(,		
:@
 	
r   c                 H    U R                   R                  U5        SU l        g)zBuilds the wrapped cell.TN)r   buildbuilt)r   inputs_shapes     r   r*   _RNNCellWrapper.buildi   s    		%
r   c                     U R                   $ N)r   r   s    r   wrapped_cell_RNNCellWrapper.wrapped_celln   s    yyr   c                 .    U R                   R                  $ r/   )r   
state_sizer0   s    r   r4   _RNNCellWrapper.state_sizer   s    yy###r   c                 .    U R                   R                  $ r/   )r   output_sizer0   s    r   r7   _RNNCellWrapper.output_sizev   s    yy$$$r   c                     [         R                  " [        U 5      R                  S-   5         U R                  R                  X5      sS S S 5        $ ! , (       d  f       g = fN	ZeroState)tf
name_scopetype__name__r   
zero_stater   
batch_sizedtypes      r   r@   _RNNCellWrapper.zero_statez   s;    ]]4:..<=99''
: >==s   A
A c                   > SU R                   R                  R                  U R                   R                  5       S.0n[        TU ]  5       n[        [        UR                  5       5      [        UR                  5       5      -   5      $ )Nr   )
class_nameconfig)r   r   r?   
get_configr   dictlistitemsr   rG   base_configr   s      r   rH   _RNNCellWrapper.get_config~   sm    "ii11::))..0
 g(*D**,-V\\^0DDEEr   c                 l    UR                  5       nSSKJn  U" UR                  S5      US9nU " U40 UD6$ )Nr   )deserializer   custom_objects)copy!tf_keras.src.layers.serializationrP   pop)clsrG   rR   deserialize_layerr   s        r   from_config_RNNCellWrapper.from_config   s>    	
 !JJv~
 4"6""r   )r+   r   r/   )r?   
__module____qualname____firstlineno____doc__r   r%   r   r*   propertyr1   r4   r7   r@   rH   classmethodrX   __static_attributes____classcell__r   s   @r   r   r   +   sw    0"(
4
   $ $ % %;F 	# 	#r   r   z'Please use tf.keras.layers.RNN instead.znn.RNNCellDropoutWrapper)v1c                      ^  \ rS rSrSr        SU 4S jjrS rS r SS jrS r	U 4S jr
\SU 4S	 jj5       rS
rU =r$ )DropoutWrapper   z@Operator adding dropout to inputs and outputs of the given cell.c
           	      (  >^ ^^^ [        U[        R                  5      (       a  [        S5      e[        TT ]  " U4ST0U
D6  U	b  [        U	5      (       d  [        SU	 35      eU	=(       d    [        T l	        [        R                  " S5         S nUS4US4US	44 HZ  u  pU" U5      u  pUb8  US
:  d  US:  a  [        SU SU 35      e[        T SU 3[        U5      5        MJ  [        T SU 3U5        M\     SSS5        UT l        UT l        UT l        ST l        ST l        ST l        U(       a  Tc  [        S5      eS mUU4S jm[        T R(                  [*        R,                  5      (       a  T R(                  S:  a%  Uc  [        S5      e[/        UUU 4S jU5      T l        [/        UR0                  UU 4S jUR0                  5      T l        [/        UR2                  UU 4S jUR2                  5      T l        gg! , (       d  f       GN= f)a  Create a cell with added input, state, and/or output dropout.

If `variational_recurrent` is set to `True` (**NOT** the default
behavior), then the same dropout mask is applied at every step, as
described in: [A Theoretically Grounded Application of Dropout in
Recurrent Neural Networks. Y. Gal, Z.
Ghahramani](https://arxiv.org/abs/1512.05287).

Otherwise a different dropout mask is applied at every time step.

Note, by default (unless a custom `dropout_state_filter` is provided),
the memory state (`c` component of any `LSTMStateTuple`) passing through
a `DropoutWrapper` is never modified.  This behavior is described in the
above article.

Args:
  cell: an RNNCell, a projection to output_size is added to it.
  input_keep_prob: unit Tensor or float between 0 and 1, input keep
    probability; if it is constant and 1, no input dropout will be
    added.
  output_keep_prob: unit Tensor or float between 0 and 1, output keep
    probability; if it is constant and 1, no output dropout will be
    added.
  state_keep_prob: unit Tensor or float between 0 and 1, output keep
    probability; if it is constant and 1, no output dropout will be
    added.  State dropout is performed on the outgoing states of the
    cell. **Note** the state components to which dropout is applied when
    `state_keep_prob` is in `(0, 1)` are also determined by the argument
    `dropout_state_filter_visitor` (e.g. by default dropout is never
    applied to the `c` component of an `LSTMStateTuple`).
  variational_recurrent: Python bool.  If `True`, then the same dropout
    pattern is applied across all time steps per run call. If this
    parameter is set, `input_size` **must** be provided.
  input_size: (optional) (possibly nested tuple of) `TensorShape`
    objects containing the depth(s) of the input tensors expected to be
    passed in to the `DropoutWrapper`.  Required and used **iff**
    `variational_recurrent = True` and `input_keep_prob < 1`.
  dtype: (optional) The `dtype` of the input, state, and output tensors.
    Required and used **iff** `variational_recurrent = True`.
  seed: (optional) integer, the randomness seed.
  dropout_state_filter_visitor: (optional), default: (see below).
    Function that takes any hierarchical level of the state and returns
    a scalar or depth=1 structure of Python booleans describing which
    terms in the state should be dropped out.  In addition, if the
    function returns `True`, dropout is applied across this sublevel.
    If the function returns `False`, dropout is not applied across this
    entire sublevel.  Default behavior: perform dropout on all terms
    except the memory (`c`) state of `LSTMCellState` objects, and don't
    try to apply dropout to
    `TensorArray` objects:
    ```
    def dropout_state_filter_visitor(s):
      # Never perform dropout on the c state.
      if isinstance(s, LSTMCellState):
        return LSTMCellState(c=False, h=True)
      elif isinstance(s, TensorArray):
        return False
      return True
    ```
  **kwargs: dict of keyword arguments for base layer.

Raises:
  TypeError: if `cell` is not an `RNNCell`, or `keep_state_fn` is
    provided but not `callable`.
  ValueError: if any of the keep_probs are not between 0 and 1.
zokeras LSTM cell does not work with DropoutWrapper. Please use LSTMCell(dropout=x, recurrent_dropout=y) instead.rC   Nz9dropout_state_filter_visitor must be callable. Received: DropoutWrapperInitc                 `    [         R                  " U 5      n[         R                  " U5      nX4$ r/   )r<   convert_to_tensorget_static_value)vtensor_valueconst_values      r   tensor_and_const_value7DropoutWrapper.__init__.<locals>.tensor_and_const_value   s+    !33A6 11,?$22r   input_keep_probstate_keep_proboutput_keep_probr      z
Parameter z# must be between 0 and 1. Received _z7When variational_recurrent=True, dtype must be providedc                 z    [         R                  " S/[         R                  " U 5      R                  5       4S5      $ )Nrt   r   )r<   concatTensorShapeas_list)ss    r   convert_to_batch_shape7DropoutWrapper.__init__.<locals>.convert_to_batch_shape"  s.     yy1#r~~a'8'@'@'B!CQGGr   c                 P   > T" U 5      n[         R                  R                  X!TS9$ )N)seedrC   )r<   randomuniform)rz   
inner_seedshaper{   rC   s      r   batch_noise,DropoutWrapper.__init__.<locals>.batch_noise(  s'    .q1yy((u(MMr         ?zdWhen variational_recurrent=True and input_keep_prob < 1.0 or is unknown, input_size must be providedc                 2   > T" UTR                  SU 5      S9$ )Ninputr   	_gen_seedirz   r   r   s     r   <lambda>)DropoutWrapper.__init__.<locals>.<lambda>7  s    dnnWa&@"r   c                 2   > T" UTR                  SU 5      S9$ )Nr#   r   r   r   s     r   r   r   >  s    [$..!"<r   c                 2   > T" UTR                  SU 5      S9$ )Noutputr   r   r   s     r   r   r   E  s    [$..1"=r   )
isinstancer   LSTMCell
ValueErrorr   r   callable	TypeError%_default_dropout_state_filter_visitor_dropout_state_filterr<   r=   setattrfloat_variational_recurrent_input_size_seed_recurrent_input_noise_recurrent_state_noise_recurrent_output_noise_input_keep_probnumbersReal_enumerated_map_structure_up_tor4   r7   )r   r   rq   rs   rr   variational_recurrent
input_sizerC   r~   dropout_state_filter_visitorr   ro   probattrtensor_prob
const_probr   r{   r   s   `      `        @@r   r   DropoutWrapper.__init__   sP   ^ dDMM** 
 	5U5f5'3H(=
 =
 9:< 
 ) 54 	" ]]/03 !"34 "34!#56

 +A*F')!A~a(( /((2|5  DAdV*eJ.?@DAdV*k: 10 '<#%
&*#&*#'+$ } M HN
 t44gllCC((3.%$I  /N /+ +J +D' ,K     ,D(O !A 10s   A-H
Hc                     U R                   c  g SX4-  n[        U R                   5      U-   R                  S5      n[        [        R
                  " U5      R                  5       S S S5      S-  $ )Nz%s_%dzutf-8      i)r   strencodeinthashlibmd5	hexdigest)r   salt_prefixindexsaltstrings        r   r   DropoutWrapper._gen_seedK  sd    ::+--djj/D(0097;;v&0022A6;jHHr   c                     XC-   n[         R                  " U5      n[         R                  " X$5      U-  nUR                  UR	                  5       5        U$ )z7Performs dropout given the pre-calculated noise tensor.)r<   floordivide	set_shape	get_shape)r   unused_indexvaluenoise	keep_probrandom_tensorbinary_tensorrets           r   $_variational_recurrent_dropout_value3DropoutWrapper._variational_recurrent_dropout_valueR  sG    
 ") /ii)M9eoo'(
r   c                    ^ ^^ Uc  UnT R                   (       d  UUU 4S jn[        UU/XQ/Q76 $ UU 4S jn[        UU/XQU/Q76 $ )zADecides whether to perform standard dropout or recurrent dropout.c                    > [        U[        5      (       a  U(       a2  [        R                  R	                  UST-
  TR                  TU 5      S9$ U$ )Nr   )rater~   )r   boolr<   nndropoutr   )r   
do_dropoutrl   r   r   r   s      r   r   (DropoutWrapper._dropout.<locals>.dropoutp  sK    !*d33z55== 9_!^^K; )   Hr   c                 f   > [        U[        5      (       a  U(       a  TR                  XUT5      $ U$ r/   )r   r   r   )r   r   rl   nr   r   s       r   r   r     s3    !*d33zDDa  Hr   )r   r   )r   valuesr   recurrent_noiser   shallow_filtered_substructurer   s   ` ` `  r   _dropoutDropoutWrapper._dropout_  sl     )0 -3)** 3- 08  3- 0I r   c                    S nU" U R                   5      (       a(  U R                  USU R                  U R                   5      nU" X40 UD6u  pgU" U R                  5      (       a]  [        R
                  R                  R                  U R                  U5      nU R                  USU R                  U R                  U5      nU" U R                  5      (       a(  U R                  USU R                  U R                  5      nXg4$ )a  Runs the wrapped cell and applies dropout.

Args:
  inputs: A tensor with wrapped cell's input.
  state: A tensor or tuple of tensors with wrapped cell's state.
  cell_call_fn: Wrapped cell's method to use for step computation
    (cell's `__call__` or 'call' method).
  **kwargs: Additional arguments.

Returns:
  A pair containing:

  - Output: A tensor with cell's output.
  - New state: A tensor or tuple of tensors with new wrapped cell's
    state.
c                 D    [        U [        5      (       + =(       d    U S:  $ )Nrt   )r   r   )ps    r   _should_dropout:DropoutWrapper._call_wrapped_cell.<locals>._should_dropout  s    "1e,,6Q6r   r   r#   r   )r   r   r   _state_keep_probr<   __internal__nestget_traverse_shallow_structurer   r   _output_keep_probr   )	r   r"   r#   r$   r   r   r   	new_stater   s	            r   r%   !DropoutWrapper._call_wrapped_cell  s    $	7 40011]]++%%	F )A&A40011 $$CC..	 *
 ++%%-I 41122]],,&&	F   r   c                   > U R                   U R                  U R                  U R                  U R                  U R
                  S.nU R                  [        :w  a.  [        U R                  5      u  nnnUR                  UUUS.5        [        TU ]-  5       n[        [        UR                  5       5      [        UR                  5       5      -   5      $ )z*Returns the config of the dropout wrapper.)rq   rs   rr   r   r   r~   )
dropout_fndropout_fn_typedropout_fn_module)r   r   r   r   r   r   r   r   _serialize_function_to_configupdater   rH   rI   rJ   rK   )r   rG   functionfunction_typefunction_modulerM   r   s         r   rH   DropoutWrapper.get_config  s      $44 $ 6 6#44%)%@%@**JJ
 %%)NN
 .d.H.HI	MM"*'4)8 g(*D**,-V\\^0DDEEr   c                    > SU;   a4  UR                  5       n[        UUSSS5      nUR                  S5        X1S'   [        [        U ]  XS9$ )Nr   r   r   r   rQ   )rS   _parse_config_to_functionrU   r   re   rX   )rV   rG   rR   dropout_state_filterr   s       r   rX   DropoutWrapper.from_config  sc    6![[]F#<!#$  JJ|$5I12^S5 6 
 	
r   )r   r   r   r   r   r   r   )r   r   r   FNNNNr/   )r?   rZ   r[   r\   r]   r   r   r   r   r%   rH   r_   rX   r`   ra   rb   s   @r   re   re      s`     K
 #%)obI& '+.`3!jF4 
 
r   re   znn.RNNCellResidualWrapperc                   \   ^  \ rS rSrSrSU 4S jjrS rU 4S jr\SU 4S jj5       r	Sr
U =r$ )	ResidualWrapperi  zBRNNCell wrapper that ensures cell inputs are added to the outputs.c                 4   > [         TU ]  " U40 UD6  X l        g)aq  Constructs a `ResidualWrapper` for `cell`.

Args:
  cell: An instance of `RNNCell`.
  residual_fn: (Optional) The function to map raw cell inputs and raw
    cell outputs to the actual cell outputs of the residual network.
    Defaults to calling nest.map_structure on (lambda i, o: i + o),
    inputs and outputs.
  **kwargs: dict of keyword arguments for base layer.
N)r   r   _residual_fn)r   r   residual_fnr   r   s       r   r   ResidualWrapper.__init__  s     	(('r   c                 h   ^	 U" X40 UD6u  pVS m	U	4S jnU R                   =(       d    U" X5      nX4$ )a  Run the cell and apply the residual_fn.

Args:
  inputs: cell inputs.
  state: cell state.
  cell_call_fn: Wrapped cell's method to use for step computation
    (cell's `__call__` or 'call' method).
  **kwargs: Additional arguments passed to the wrapped cell's `call`.

Returns:
  Tuple of cell outputs and new state.

Raises:
  TypeError: If cell inputs and outputs have different structure (type).
  ValueError: If cell inputs and outputs have different structure
    (value).
c                 ^    U R                  5       R                  UR                  5       5        g r/   )r   assert_is_compatible_withinpouts     r   assert_shape_match>ResidualWrapper._call_wrapped_cell.<locals>.assert_shape_match  s    MMO55cmmoFr   c                    > [         R                  R                  X5        [         R                  R                  TX5        [         R                  R                  S X5      $ )Nc                 
    X-   $ r/    r   s     r   r   QResidualWrapper._call_wrapped_cell.<locals>.default_residual_fn.<locals>.<lambda>  s    r   )r<   r   assert_same_structuremap_structure)r"   outputsr   s     r   default_residual_fn?ResidualWrapper._call_wrapped_cell.<locals>.default_residual_fn  sF    GG))&:GG!!"4fF77((*F r   r   )
r   r"   r#   r$   r   r  r   r  res_outputsr   s
            @r   r%   "ResidualWrapper._call_wrapped_cell  sK    $ *&B6B	G	 ((?,??
 ''r   c                    > U R                   b   [        U R                   5      u  nnnUUUS.nO0 n[        TU ]  5       n[	        [        UR                  5       5      [        UR                  5       5      -   5      $ )z+Returns the config of the residual wrapper.)r   residual_fn_typeresidual_fn_module)r   r   r   rH   rI   rJ   rK   )r   r   r   r   rG   rM   r   s         r   rH   ResidualWrapper.get_config'  s|    (
 .d.?.?@	  ($1&5F Fg(*D**,-V\\^0DDEEr   c                 x   > SU;   a#  UR                  5       n[        UUSSS5      nX1S'   [        [        U ]  XS9$ )Nr   r  r  rQ   )rS   r   r   r   rX   )rV   rG   rR   residual_functionr   s       r   rX   ResidualWrapper.from_config9  sV    F"[[]F 9"$! %6=!_c6 7 
 	
r   r	  r/   )r?   rZ   r[   r\   r]   r   r%   rH   r_   rX   r`   ra   rb   s   @r   r   r     s.     M("(HF$ 
 
r   r   znn.RNNCellDeviceWrapperc                   D   ^  \ rS rSrSrU 4S jrS rS rU 4S jrSr	U =r
$ )DeviceWrapperiJ  z=Operator that ensures an RNNCell runs on a particular device.c                 4   > [         TU ]  " U40 UD6  X l        g)a  Construct a `DeviceWrapper` for `cell` with device `device`.

Ensures the wrapped `cell` is called with `tf.device(device)`.

Args:
  cell: An instance of `RNNCell`.
  device: A device string or function, for passing to `tf.device`.
  **kwargs: dict of keyword arguments for base layer.
N)r   r   _device)r   r   devicer   r   s       r   r   DeviceWrapper.__init__O  s     	((r   c                 v   [         R                  " [        U 5      R                  S-   5         [         R                  R
                  R                  U R                  5         U R                  R                  X5      sS S S 5        sS S S 5        $ ! , (       d  f       O= f S S S 5        g ! , (       d  f       g = fr:   )
r<   r=   r>   r?   compatrc   r  r  r   r@   rA   s      r   r@   DeviceWrapper.zero_state\  so    ]]4:..<=$$T\\2yy++J> 32 >=222 >==s#   4B*!B<	B*
B	B**
B8c                     [         R                  R                  R                  U R                  5         U" X40 UD6sSSS5        $ ! , (       d  f       g= f)z!Run the cell on specified device.N)r<   r  rc   r  r  r!   s        r   r%    DeviceWrapper._call_wrapped_cella  s5    YY\\  .88 /..s   	A
Ac                    > SU R                   0n[        TU ]	  5       n[        [	        UR                  5       5      [	        UR                  5       5      -   5      $ )Nr  )r  r   rH   rI   rJ   rK   rL   s      r   rH   DeviceWrapper.get_configf  sG    DLL)g(*D**,-V\\^0DDEEr   )r  )r?   rZ   r[   r\   r]   r   r@   r%   rH   r`   ra   rb   s   @r   r  r  J  s$     H?
9
F Fr   r  c                    [        U [        R                  5      (       a%  [        R                  " U 5      nSnU R
                  nOB[        U 5      (       a  U R                  nSnU R
                  nO[        S[        U 5       35      eXU4$ )z(Serialize the function for get_config().lambdar   z&Unrecognized function type for input: )
r   python_types
LambdaTyper   	func_dumprZ   r   r?   r   r>   )r   r   output_typemodules       r   r   r   l  s    (L3344((2$$	(		"" $$4T(^4DE
 	
 &&r   c                 L   [        5       nU R                  US5      nU[        R                  ;   a-  UR	                  [        R                  U   R
                  5        O,Ub)  [        R                  " SR                  U5      [        SS9  U(       a  UR	                  U5        U R                  U5      nUS:X  a  [        R                  " X   USS9nU$ US:X  a>  [        R                  " 5       (       a  [        S	5      e[        R                  " X   US
9nU$ [!        SU S35      e)z)Reconstruct the function from the config.Nz;{} is not loaded, but a layer uses it. It may cause errors.   )
stacklevelr   zfunction in wrapper)rR   printable_module_namer!  a1  Requested the deserialization of a layer with a Python `lambda` inside it. This carries a potential risk of arbitrary code execution and thus it is disallowed by default. If you trust the source of the saved model, you can pass `safe_mode=False` to the loading function in order to allow `lambda` loading.)globsz Unknown function type received: z+. Expected types are ['function', 'lambda'])globalsrU   sysmodulesr   __dict__warningswarnformatUserWarningr   deserialize_keras_objectin_safe_moder   r   	func_loadr   )	rG   rR   func_attr_namefunc_type_attr_namemodule_attr_namer+  r&  r   r   s	            r   r   r   ~  s    IEZZ($/FS[[(112		##)6&>		
 ^$JJ23M
"$==")"7
. O% 
(	"))++$  !**6+AO O	 .}o >8 8
 	
r   c                 @    [        U [        R                  5      (       + $ r/   )r   r<   TensorArray)substates    r   r   r     s    (BNN333r   c                 v   ^^ S/mUU4S jn[         R                  R                  R                  " X/UQ70 UD6$ )Nr   c                  @   > T" TS   /U Q70 UD6nTS==   S-  ss'   U$ )Nr   rt   r  )
inner_argsinner_kwargsrixmap_fns      r   enumerated_fn6_enumerated_map_structure_up_to.<locals>.enumerated_fn  s-    2a56:66
1
r   )r<   r   r   map_structure_up_to)shallow_structurerC  r   r   rD  rB  s    `   @r   r   r     sA    
B
 ??33+/39 r   ) r]   r   r   r-  typesr"  r0  tensorflow.compat.v2r  v2r<   tf_keras.src.layers.rnnr   )tf_keras.src.layers.rnn.abstract_rnn_cellr   tf_keras.src.savingr   tf_keras.src.utilsr   r    tensorflow.python.util.tf_exportr   "tensorflow.python.util.deprecationr	   r   re   r   r  r   r   r   r   r  r   r   <module>rQ     s   (   
   ! ! ( E 1 , ) 7 9g#o g#T D;<
%"-V
_ V
 . =V
r
 D;<
&2.U
o U
 / =U
p D;<
$,FO F - =F@'$0f4
r   