
    $HJjB                     8   U d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ ddlmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZmZmZmZmZ ddlmZ erddl m!Z! ddl"m#Z# ddl$m%Z%  e       r
d dl&Z&d dl'm(Z(  ejR                  e*      Z+de de de dZ, e       rd dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl-m7Z8 d dl-m9Z: d dl-m;Z< d dl-m=Z> ej~                  j                  dd      j                         ZBeBev ZCdeDfdZ;deDfd Z=daEeFdz  eGd!<   d"eFfd#ZHd"eFfd$ZIdSd%ZJn/d&ZCd' Z;d( Z= G d) d*      Z1 G d+ d,      Z2 G d- d.      Z0d/ Z5d0 Z4d1 ZJd2dd3d4dd3d4dd3d5d6d3d7dd3d8d9d:d;ZKeFeDeFeDeDf   f   eGd<<   i ZLeFeDedz  f   eGd=<   d>eDdz  d"eMfd?ZN	 dTd>eDd@edz  dAeMd"edz  fdBZOeLfdCeDdDeFeDedz  f   fdEZPdSdUdFZ9	 	 	 dVdCeDdGeDdz  dHeQeDz  dz  dAeMd"ef
dIZ7dJeRe   ez  fdKZSd&aTedL        ZUdMeVdNeReD   dOeVd"eVfdPZW	 	 	 	 	 	 	 	 dWdQZXg dRZYy)X    N)Callable)contextmanager)Path)
ModuleType)TYPE_CHECKING   )!get_checkpoint_conversion_mapping&register_checkpoint_conversion_mapping)register_patch_mapping)ENV_VARS_TRUE_VALUESlogging)is_flash_attention_requested)KERNELS_MAX_VERSIONKERNELS_MIN_VERSIONis_kernels_availableis_rocm_platformis_torch_available   )flash_attention_forward)PretrainedConfig)PreTrainedModel)KernelConfigzh`kernels` is either not installed or uses an incompatible version. Please install a compatible version (z <= version < z), e.g. `pip install kernels==`)	CUDAPropertiesDeviceFuncRepositoryLayerRepositoryLocalLayerRepositoryModeregister_kernel_mappingreplace_kernel_forward_from_hubuse_kernel_mapping)
get_kernel)	kernelize)use_kernel_forward_from_hub)use_kernel_func_from_hubUSE_HUB_KERNELSYES
layer_namec                 b    t         rt        |       S t        j                  dt                d S )NFkernels hub usage is disabled through the environment USE_HUB_KERNELS=c                     | S N clss    o/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/transformers/integrations/hub_kernels.py<lambda>z-use_kernel_forward_from_hub.<locals>.<lambda>Z   s    s    )_kernels_enabled$_kernels_use_kernel_forward_from_hubloggerwarning_once_TRANSFORMERS_USE_HUB_KERNELS)r)   s    r1   r%   r%   S   s2    7
CCXYvXwx #"r3   	func_namec                 b    t         rt        |       S t        j                  dt                d S )Nr+   c                     | S r-   r.   funcs    r1   r2   z*use_kernel_func_from_hub.<locals>.<lambda>c   s    r3   )r4   !_kernels_use_kernel_func_from_hubr6   r7   r8   )r9   s    r1   r&   r&   \   s2    4Y??XYvXwx %$r3   _KERNEL_MAPPING_CACHEreturnc                     dt        ddd      it        dt        dd            t        d	d
dd      idt        j                  t        j
                  z  t        ddd      t        j                  t        j
                  z  t        ddd      iidt        j                  t        j
                  z  t        ddd      t        j                  t        j
                  z  t        ddd      iidt        j                  t        j
                  z  t        ddd      iit        j                  t        ddd      t        j                  t        ddd      it        j                  t        ddd      t        j                  t        ddd      it        j                  t        ddd      it        j                  t        ddd      it        j                  t        ddd      t        j                  t        ddd      idt        j                  t        ddd      t        j                  t        ddd      it        j                  t        ddd      t        j                  t        ddd      it        j                  t        ddd      it        j                  t        ddd      iddt        j                  t        j
                  z  t        ddd      iidt        j                  t        j
                  z  t        dd d      iidt        j                  t        j
                  z  t        dd!d      iidt        j                  t        j
                  z  t        dd"d      iidt        j                  t        j
                  z  t        dd#d      iidt        j                  t        j
                  z  t        dd$d      iid%} t        j                  t        d&d'd(      it        d&d'd(      t        j                  t        d)d'd(      id*dt        j                  t        j
                  z  t        dd+d(      iid,}| |z  } | S )-Ncudaz!kernels-community/deformable-detrMultiScaleDeformableAttentionr   )repo_idr)   versiony   )min_capabilitymax_capability)type
propertieszAtlas-Inference/gdnQwen3_5GatedDeltaNet(ef12347fc77d6ddf1cb72c0bd0af1c7d6cc69172T)rD   r)   revisiontrust_remote_codezkernels-community/liger-kernelsLigerSwiGLUMLPr   LigerTiledSwiGLUMLPLigerGEGLUMLPLigerTiledGEGLUMLPLigerLinearLigerRMSNormzkernels-community/rmsnormRMSNormzkernels-community/mlx_rmsnorm)rB   rocmxpumpsnpuzkernels-community/megablocksMegaBlocksMoeMLPCPUMegaBlocksMoeMLP)rB   rV   rW   cpuzkernels-community/activationFastGELU	QuickGELUNewGELUSiluGeluGeluTanh)rC   rK   	SwiGLUMLPGeGLUMLPLinearrU   rZ   r]   r^   r_   SiLUGeLUrb   zkernels-community/rotaryapply_rotary_transformers)rD   r9   rE   zkernels-community/aiter-rope)rW   rB   rV   LigerForCausalLMLoss)rotary_pos_embForCausalLMLoss)r   r   r   r   	INFERENCETORCH_COMPILETRAININGr   )_KERNEL_MAPPING_FUNCTION_KERNEL_MAPPINGs     r1   _build_kernel_mappingrq   k   s    ?>." -SQTU #15G&*	% NNT%7%77 A#3 !:
 MMD$6$66 A#8 !9 NNT%7%77 A#2 !:
 MMD$6$66 A#7 !9 MMD$6$66 A#0 !9 MM? A#1 !$
 NNO A#1 !% MM? A#1 !$
 NNO A#1 !% NNO ;#, !% NNO ?#, !% MM? A#1 !$
 NNO A#1 !%Q4n MM? >#5 !$
 NNO >#5 !% MM? >#5 !$
 NNO >#5 !% NNO >#5 !% NNO >#8 !%A'!R NNT%7%77 >#- !: NNT%7%77 >#. !: NNT%7%77 >#, !: NNT%7%77 >6[\: NNT%7%77 >6[\: NNT%7%77 >:_`:QOi
j NNN :Fakl%
 '6B]gh NNN >Jeop%  MMD$6$66 AMcmn9 !$
 0 *,DDr3   c                  .    t         
t               a t         S )zPReturn the default transformers kernel mapping, building it lazily on first use.)r?   rq   r.   r3   r1   get_kernel_mapping_transformersrs   Z  s     !($9$;!$$r3   c                 2    | 
t               } t        |        y r-   )rs   r    )mappings    r1   $register_kernel_mapping_transformersrv   a  s    ?57G(r3   Fc                      d }|S )Nc                     | S r-   r.   r/   s    r1   	decoratorz.use_kernel_forward_from_hub.<locals>.decoratorl  s    Jr3   r.   argskwargsry   s      r1   r%   r%   k  s    	 r3   c                      d }|S )Nc                     | S r-   r.   r<   s    r1   ry   z+use_kernel_func_from_hub.<locals>.decoratorr  s    Kr3   r.   rz   s      r1   r&   r&   q  s    	 r3   c                       e Zd Zd Zy)r   c                     t        d      )NzNLayerRepository requires `kernels` to be installed. Run `pip install kernels`.RuntimeErrorselfr{   r|   s      r1   __init__zLayerRepository.__init__x  s    oppr3   N__name__
__module____qualname__r   r.   r3   r1   r   r   w  s    	qr3   r   c                       e Zd Zd Zy)r   c                     t        d      )NzSLocalLayerRepository requires `kernels` to be installed. Run `pip install kernels`.r   r   s      r1   r   zLocalLayerRepository.__init__|  s    tuur3   Nr   r.   r3   r1   r   r   {  s    	vr3   r   c                       e Zd Zd Zy)r   c                     t        d      )NzMFuncRepository requires `kernels` to be installed. Run `pip install kernels`.r   r   s      r1   r   zFuncRepository.__init__  s    noor3   Nr   r.   r3   r1   r   r     s    	pr3   r   c                      t        d      )Nz^replace_kernel_forward_from_hub requires `kernels` to be installed. Run `pip install kernels`.r   r{   r|   s     r1   r!   r!     s    l
 	
r3   c                      t        d      )NzVregister_kernel_mapping requires `kernels` to be installed. Run `pip install kernels`.r   r   s     r1   r    r      s    sttr3   c                      t        d      )Nzcregister_kernel_mapping_transformers requires `kernels` to be installed. Run `pip install kernels`.r   r   s     r1   rv   rv     s    q
 	
r3   zkernels-community/causal-conv1d)rD   rE   zkernels-community/mamba-ssmz!kernels-community/finegrained-fp8   zkernels-community/deep-gemmzkernels-community/sonic-moez
ep-support)rD   rM   )zcausal-conv1dz	mamba-ssmzfalcon_mamba-ssmzfinegrained-fp8z	deep-gemmz	sonic-moe_HUB_KERNEL_MAPPING_KERNEL_MODULE_MAPPINGattn_implementationc                 >    | duxr t        j                  d|       duS )zJCheck whether `attn_implementation` matches a kernel pattern from the hub.Nz'^[^/:]+/[^/:]+(?:@[^/:]+)?(?::[^/:]+)?$)research)r   s    r1   	is_kernelr     s-     	4' 	cII@BUV^bbr3   attention_wrapperallow_all_kernelsc                     ddl m} ddlm} d| v r| j	                  d      d   n| }t        |      syt               st        t              d|v r%|j	                  d      \  }}|j                         }n|}d}|j                         }|j                  d      \  }}}	|j                         }|	r|	j                         nd}	d}
|	t        |d	
      }|rdnd}
	 t        ||	|
|      }d}t        |d      r|t         }|}n)t        |d      rddlm} ||n|}d}n|t'        ||      }|j)                  |        |j)                  | ||          |S # t        $ r  t        $ r}t        d| d| d      d}~ww xY w)a  
    Load and register the kernel associated to `attn_implementation`.

    Args:
        attn_implementation: A string, usually a kernel repo like "kernels-community/flash-mla".
        attn_wrapper: a callable for the wrapper around the attention implementation. In `transformers` we
            have a wrapper around the `flash_attn_var_len` call, and the same goes for `sdpa` and `eager`.
            They just prepare the arguments properly. This is mostly used for continuous batching, where we
            want the `paged` wrapper, which calls the paged cache.
        allow_all_kernels (`bool`, optional):
            Whether to load kernels from unverified hub repos, if it is a custom kernel outside of the `kernels-community`
            hub repository.
    r   )ALL_MASK_ATTENTION_FUNCTIONS)ALL_ATTENTION_FUNCTIONS|r   N:@   )"requested_attention_implementationrE   r   rM   rE   r   z-An error occurred while trying to load from 'z': .flash_attention_2flash_attn_varlen_funcsparse_atten_func)msa_attention_forwardsdpa)masking_utilsr   modeling_utilsr   splitr   r   ImportError_MISSING_KERNELS_MESSAGEstrip	partitionr   r#   
ValueError	Exceptionhasattrr   msa_attentionr   getattrregister)r   r   r   r   r   actual_attn_namerD   kernel_name_revrE   is_fa4kernelemask_implementationkernel_functionr   s                    r1   load_and_register_attn_kernelr     s     =8<?CV<V*005a8\o%&!233 /55c:!'')"mmoG'',OGQmmoG #))+$CG
{-QXbcd!1[Gc7Vgh .v/0$ 7+	,	-
 	9/@/L+Rg$		 !&+6 $$%8/J ))*=?[\o?pqM7   [H	QTUVTWWXYZZ[s   E E=&E88E=r   ru   c                 8   | |v rt        ||    t              r||    S | t        vrt        j	                  d|  d       d || <   y t               rb	 t        |    d   }t        |    j                  dd       }t        |    j                  dd       }||d}t        |||t              }||| <   ||    S d
d l}| j                  dd      }d| d}		 |j                  dt              }
t        |
|	d       }t#        |      r! |       r	 |j                  |       }||| <   |S d || <   ||    S # t        $ r.}d || <   t        j	                  d|  d	|        Y d }~||    S d }~wt        $ r d || <   Y ||    S w xY w# t         $ r d }Y w xY w# t         $ r d || <   Y ||    S w xY w)NzKernel z! not found in _HUB_KERNEL_MAPPINGrD   rM   rE   r   r   zFailed to load kernel z: r   -r   is_
_availablez..utils.import_utils)
isinstancer   r   r6   r7   r   getr#   ALLOW_ALL_KERNELSFileNotFoundErrorAssertionError	importlibreplaceimport_module__package__r   r   callable)r   ru   rD   rM   rE   r   r   r   new_kernel_namer9   	utils_modis_kernel_availablemodules                r1   lazy_load_kernelr     s   g*W[-A:"N{##--gk]2STU#	()+6yAG*;7;;JMH)+6::9dKG8#3(G_pqF#)GK @ ;- 	%--c37/**5		'!//0FTI"))Y"E '(-@-B,"00O3DF'-$ $(GK ;? ! 	M#'GK "8Rs KLL: ;9  	(#'GK 4 ;9	(  	'"&	'  ,'+$ ;,sC   AD& #E3 F &	E0/ EE0/E03F FFFc                 t   t               st        t              d }d }	 | j                  |       | j                  st
        j                  n|t
        j                  n|}| j                  j                  }|dk(  rt               rd}t        |      }| j                  P| j                  j                   }t        | j                  j                  |      5  t!        | ||       ddd       nt!        | ||       d	| _        | j                  |       y# 1 sw Y   "xY w# | j                  |       w xY w)
zYTemporarily register hidden kernel wrappers so `kernelize` can discover and replace them.c                     t        | di       j                         D ]\  \  }}|t        | j                               vs"t	        |t
        j                        st        d| d      | j                  ||       ^ y )N_hidden_kernelsz#Attempted to register a kernel for z, but it was not a `torch.nn.Module`. This means the underlying function needs to be decorated with `@use_kernel_func_from_hub`. Please submit and issue to the transformers repo: `https://github.com/huggingface/transformers/issues`.)	r   itemsdictnamed_childrenr   nnModuler   register_module)r   namefns      r1   attach_hidden_kernelsz(kernelize.<locals>.attach_hidden_kernels,  s{    (92>DDFHD"4 5 5 788!"bii0$=dV DB B 
 &&tR0 Gr3   c                 Z    t        | di       D ]  }t        | |      st        | |        y )Nr   )r   r   delattr)r   r   s     r1   detach_hidden_kernelsz(kernelize.<locals>.detach_hidden_kernels7  s,    F$5r:D vt$%	 ;r3   NrB   rV   )rI   )inherit_mapping)devicemodeT)r   r   r   applytrainingr   rl   rn   r   rI   r   r   kernel_configuse_local_kernelr"   kernel_mapping_kernels_kernelize_use_kernels)modelr   r   r   device_typer   r   s          r1   r$   r$   '  s   !233	1&+)*%*^^t~~$,\`ll''& %5%7 K[)*"'"5"5"F"FFO#E$7$7$F$FXgh"5dC ih uV$?!)* ih 	)*s$   B8D$ D(D$ D!D$ $D7rM   rE   c                 l    ddl m} t               st        t              d|| d}t        | ||||      S )Nr   )__version__transformers)	frameworkrE   rD   )rM   rE   
user_agentrN   ) r   r   r   r   get_kernel_hub)r   rM   rE   r   r   r   s         r1   r#   r#   R  s?     !233-+R]^JhJbs r3   module_namesc                 8     t         t              r g  fd}|S )aO  
    This decorator attaches the target function within the module as a plain attribute (not as a submodule).
    Keep in mind that this registration is only meant for `kernelize` to recognize its target modules (i.e.
    function exchanged for a weightless `nn.Module` with the same forward) to then exchange to the kernel
    variation (in-place) if the conditions are met.

    We cache each of these function-based registrations: After proper registration and exchange it is removed
    from the module's `_modules` dict as it does not really act as `nn.Module` but a base function.
    c                 <    | j                   fd}|| _         | S )Nc                      | g|i | | j                   j                  di       }D ]B  }t        |dd       xs t        |dd       xs t        |dd       }|t        d|      |||<   D y )Nr   r   kernel_layer_namer9   z)Could not infer kernel function name for )__dict__
setdefaultr   r   )r   r{   r|   hidden_kernelsr   r   r   	orig_inits         r1   new_initz8use_kernelized_func.<locals>.decorator.<locals>.new_inits  s    d,T,V, "]]556GLN"B
D1 6r#6=6r;5 
 <$'PQSPV%WXX (*t$ #r3   )r   )r0   r   r   r   s     @r1   ry   z&use_kernelized_func.<locals>.decoratorp  s    LL		*"  
r3   )r   r   )r   ry   s   ` r1   use_kernelized_funcr  c  s#     ,)$~. r3   c               #   ,   K   	 da d da y# da w xY ww)z
    Context manager used to adjust the value of the global `ALLOW_HUB_KERNELS`. This is needed, as this argument
    cannot be forwarded directly to the `__init__` of the models, where we set the attention implementation.
    TNF)r   r.   r3   r1   allow_all_hub_kernelsr    s"     "  "Es    
parent_clschild_names
kernel_clsc                     | j                   fd}t        d| j                   | fd|i      }d| j                   |_        |S )a6  
    Create a new class that inherits from `parent_cls` and fuses the child modules specified in `child_names
    with the provided `kernel_cls`.
    The first child in `child_names` will be replaced with the `kernel_cls`, and the rest will be replaced with
    `nn.Identity()` to keep the same interface.
    c                      | g|i | D cg c]  }t        | |       }} | }t        | d   |       dd  D ]!  }t        | |t        j                                # y c c}w )Nr   r   )r   setattrr   Identity)	r   r{   r|   r   childrenkernel_instancer  r  original_inits	         r1   patched_initz9make_parent_class_for_kernel_fusion.<locals>.patched_init  sr    d,T,V,4?@KDGD$'K@$h/k!no6ODD$. $ As   A&Fusedr   )r   rI   r   r   )r  r  r  r  patched_clsr  s    ``  @r1   #make_parent_class_for_kernel_fusionr    sW     ''M/ z2234zmjR^E_`K!&z'>'>&?@Kr3   c           
      
  # t        | d      rt        | j                  d      st        d| j                   d      | j                  j                  }i }i }d }|j
                  j                         D ]n  \  }}t        |t        t        f      rd |i}t        |t              r*t        |j                               dk7  rt        d|       t        d|d|      t        t        |j                                     }t        |t              rY|\  }	}
|
j                  d	d       }|
j                  d
d       }|
j                  dd      xs t         }|d
|ind	|i}
|
d|iz  }
|	|
f}n|}	dt         d}
|	|
f}|	j#                  d      \  }}}|r|st        d|	d|      |j$                  r;|j'                  d      j)                  d      d   }t+        t-        |      ||      }nt/        d+||d|
}|j1                         }|t        d|      t2        j4                  j                  |j6                        }|rt9        ||j                   dd       nd }|:d|j:                  vr,t=        j>                  |j@                        d        }||_         t        |t              r0||||<   A|j                  |_!        |||<   |||j                  <   nt        |t              r|&t        d|j                  d|j                   d      |j                  |_!        |D cg c]  }|d   	 }}|D cg c]  }|jE                  dd      d    }}t        tG        |            dk7  rt        d|       |d   jI                  dd      }|D cg c]  }|jE                  dd      d    }}|&tK        jL                  d       5   | |      }d d d        d}|jO                         D ]u  \  }#tQ        jR                  ||      stU        #fd!|D              st        d"|d#| d$|j                        d%}tW        #      } tY        | ||      || j                  <   w |st        d&|d'|j                  d(      t[        |d%)       t        |d*      r5t]        |      }!t_        |j`                        }"|!|!|"z   }"tc        ||"d%)       |||j                  <   q ||_        y c c}w c c}w c c}w # 1 sw Y   )xY w),Nconfig_class
model_typezModel z# has no config_class or model_type.r   zLExpected exactly one kernel repo regardless of device/mode specificity, got zInvalid hub repo z for layer rM   rE   rN   F)rE   rN   r   zInvalid kernel repo string /)	repo_pathpackage_namer)   )rD   r)   z*Could not load kernel class from hub_repo=Layoutforwardc                      y r-   r.   r   s      r1   _noop_forwardz?register_kernel_replacements_and_fusions.<locals>._noop_forward  s    r3   zFused kernel z* requires a companion layout class named 'zLayout' in the same module.r   r   zGAll patterns for a fused kernel must share the same parent module, got *z\w+metac              3   6   K   | ]  }t        |        y wr-   )r   ).0childr   s     r1   	<genexpr>z;register_kernel_replacements_and_fusions.<locals>.<genexpr>4  s     K{e7651{s   zModule z* does not have the expected child modules z required for the fused kernel TzNo module matched pattern z for fused kernel z3. Provide the full dotted path from the model root.)	overwriteconversion_mappingr.   )2r   r  r   r   r  r   r   r   strtupler   lenvaluesnextiterr   r   r   r   rstripr   r   r   r   loadsysmodulesr   r   r   	functoolswrapsr  r   rsplitsetr   torchr   named_modulesr   	fullmatchallrI   r  r   r	   listr$  r
   )$r0   configr   r  patch_mappingnew_mapping
meta_modelr)   hub_reporepo_strmetadatarM   rE   rN   
final_reporD   r   layer_name_in_repor  repor  
kernel_mod
layout_clsr  itemglob_patternspparent_patternsparent_patternr  matched_anyr   
module_clsexisting
transformsr   s$                                      @r1   (register_kernel_replacements_and_fusionsrM    s   
 3'ws7G7G/V6#,,/RSTT!!,,J%'MK J - < < B B D
Hhe-h'Hh%8??$%* bckblm  0K
~VWWX__./0 h&!)Hh||J5Hll9d3G (-@% H ]L]/6/B	7+U]H^H,.?@@H"H-JH#$;LMH"H-J)1););C)@&&0:8,kR\Q_`aa))">>#.44S9"=L'w-)-D # - D YY[
I(VWW[[__Z%:%:;
R\WZJ,?,?+@)GNbf
!iz7J7J&J__Z//0 1 "/J j#&!*4J' ,6+>+>J((2M*% 0:K
++, 
E*! #J$7$7#: ;(1122MO 
 ,6+>+>J(1;<T!WM<<IJMqqxxQ/2MOJ3'(A- ]^k]lm  -Q/77VDN8EF1188C+A.KF!\\&)!$VJ *  K * 8 8 :f||ND9K{KK$!$)ST_S` a,,6,?,?+BD  #!&\
5XZ6j112 !;  00BBTU_UhUhTk lH I 
 	}=:348DHj;;<J#%
2
2:zUYZ+5J''(K !EN $/M _ =J G *)s   )S-;S2S7	S<<T	)r   r#   r$   r   r    rv   rM  r!   r%   r&   r  r-   )NF)r   r   r   zMode | None)NNF)r0   ztype[PreTrainedModel]r8  r   r   r   r@   N)Zr/  osr   r-  collections.abcr   
contextlibr   pathlibr   typesr   typingr   r$  r	   r
   monkey_patchingr   utilsr   r   utils.genericr   utils.import_utilsr   r   r   r   r   flash_attentionr   configuration_utilsr   r   r   utils.kernel_configr   r3  torch.nnr   
get_loggerr   r6   r   kernelsr   r   r   r   r   r   r    r!   r"   r#   r   r$   r   r%   r5   r&   r>   environr   upperr8   r4   r%  r?   r   __annotations__rq   rs   rv   r   r   boolr   r   r   intr7  r  r   r  rI   r  rM  __all__r.   r3   r1   <module>rd     sN    	 	 
 $ %     j 4 1 8  5 602 
		H	%N+>*??]^q]rrsu  
 
 
 V$&JJNN3De$L$R$R$T!48LL# #%C % *.4$;-m4 m^%T %) q qv vp p

u
 "CqQ:qI$AaP#FSTU:qI:U2 T#tCH~-.  8: S*t"334 93: $  diKK19DK\`K$K\ Pf 1 # 1 S*t:K5K0L 1 h(+Z   $#	Dj 3Y 	
 "$d8nx&? $P   " " c  
	4W/	 W/W/ "W/ 
	W/tr3   