
     `i6{              	       ,   d Z ddlmZ ddlmZ ddlmZmZmZ  e            r
ddl	Z	ddl	m
Z
  e            rddlmZ dd	lmZmZ  e            rdd
lmZ ddZdededdfdZddedededefdZ G d de	j
        j                  Z	 	 	 	 ddZd dZdS )!zZHIGGS through FLUTE (Flexible Lookup Table Engine for LUT-quantized LLMs) integration file    )sqrt)Optional   )is_flute_availableis_hadamard_availableis_torch_availableN)nn)prepare_data_transposed)TuneMetaDataqgemm_v2)hadamard_transformc                    d t          dt          | j                  z            D             }|D ]-}| j        |         }|dz
  |z  dz   |z  }||z
  }||d|z  dz
  <   .t          j                            | |d|          S )Nc                     g | ]}d S r    ).0_s     s/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/transformers/integrations/higgs.py
<listcomp>z pad_to_block.<locals>.<listcomp>(   s    888a888    r      constant)rangelenshaper	   
functionalpad)	tensordimshad_block_sizevaluepad_dimsdimsizenext_multiple_of_1024deltas	            r   pad_to_blockr(   '   s    885S%6%6!677888H ' '|C "&(~!=!A^ S%,!&cA=VXz5AAAr   pnreturnztorch.Tensorc                    | |fdk    rt          j        g ddgddgddgdd	gd
dgddgddgddgddgddgddgddgddgddgddgd d!gd"d#gd$d%gd&d'gd(d)gd*d+gd,d-gd.d/gd0d1gd2d3gd4d5gd6d7gd8d9gd:d;gd<d=gd>d?gd@dAgdBdCgdDdEgdFdGgdHdIgdJdKgdLdMgdNdOgdPdQgdRdSgdTdUgdVdWgdXdYgdZd[gd\d]gd^d_gd`dagdbdcgdddegdfdggdhdigdjdkgdldmgdndogdpdqgdrdsgdtdugdvdwgdxdygdzd{gd|d}gd~dgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgd dgddgddgddgdd	gd
dgddgddgddgddgddgddgddgddgddgddgd d!gd"d#gd$d%gd&d'gd(d)gd*d+gd,d-gd.d/gd0d1gd2d3gd4d5gd6d7gd8d9gd:d;gd<d=gd>d?gd@dAgdBdCgdDdEgdFdGgdHdIgdJdKgdLdMgdNdOgdPdQgdRdSgdTdUgdVdWgdXdYgdZd[gd\d]gd^d_gd`dagdbdcgdddegdfdggdhdigdjdkgdldmgdndogdpdqgdrdsgdtdugdvdwgdxdygdzd{gd|d}gd~dgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgdĐdgdƐdgdȐdgdʐdgd̐dgdΐdgdАdgdҐdgdԐdgd֐dgdؐdgdڐdgdܐdgdސdgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgd dg          S | |fdk    rt          j        g ddgddgddgd	d
gddgddgddgddgddgddgddgddgddgddgdd gd!d"gd#d$gd%d&gd'd(gd)d*gd+d,gd-d.gd/d0gd1d2gd3d4gd5d6gd7d8gd9d:gd;d<gd=d>gd?d@gdAdBgdCdDgdEdFgdGdHgdIdJgdKdLgdMdNgdOdPgdQdRgdSdTgdUdVgdWdXgdYdZgd[d\gd]d^gd_d`gdadbgdcddgdedfgdgdhgdidjgdkdlgdmdngdodpgdqdrgdsdtgdudvgdwdxgdydzgd{d|gd}d~gddgddg          S | |fdk    rdt          j        ddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgg          S | |fdk    rDt          j        dgdgdgdgdgdgdgdgdgdgdgdgdgdgdgdgg          S | |fdk    r,t          j        dgdgdgdgdgdgdgdgg          S | |fdk    r t          j        dgdgdgdgg          S t          d|  d|           (  N)r      g   g    f?g    Bg   ]?g   _g   \?g   9g   @g   ?g   g   @y?g   Ђ
@g   @<?g   4@g   @V
@g   i@g   ?g   [g   U g    v?g   `~?g   ?g   F?g    g   #	@g   ??g    u?g    g   ?g   !	g   v-?g    οg    W?g   Dg   @?g   -?g   `g   `?g   g    Կg   iǿg   5?g   `Xg    #8g    g    Eg   1߿g   `c?g   g   g    g    ??g    *V?g   ?g   @?g    ?g   ^
g   @xg    n|g   @g   `pg    5g   `Ag   ?g   @UVĿg   yg   Sg    d?g    g   g   `KG?g   `?g   ?g   	?g   K@g   @?g   Y?g   sg   `|οg   @?g     o@g    Dg   @?g    2?g   ?g    g   R @g   `(?g    Er?g   @N0g   `'/?g   g   >?g   ?g   `Qcg   2g   :7g   dig    c?g   `ֿg   `ؿg   ?g    +@g   ?g   `(f?g   @8ig   =g   򩣿g   
g   +g   fg    g   Lg   x?g   `*(g    ?g    /տg   @/aſg   Eg   gg    ?g   Gg   {?g   h?g   _a?g   ?g   ?g   3@g   #?g   yg   ѱܿg    
@g   ׿g    d,g   g   &g   ٿg   `{X?g   Yb?g   @"g    يg   3g   T g   @@g   kg   g   `{ڿg    ?g   >g   	?g   g   `5g   ?g    ?g   5?g   ?g   Iؿg    A?g   ?g   ѿg   9?g   @@g   zg    j	g    g   @g   @N?g    }g   ?g    Zg   `@g   cg    ҿg   @=Dg   g    ?g   `g   b@g   {@g    h @g    g   ?g   ]ƿg   K?g   g   w?g   `?g    4?g    b?g    g   `ſg   p?g   @?g   @Q=s?g   @տg   g   @@g   1u?g   ͔ƿg   @?g   䉫?g   `@g   _g    @g    ,?g   `dg   `T?g   L?g   b?g   3?g   ȃg   xg    v?g   `?g   섥g   K3g   /ۿg   `Eg   @#?g   3?g   
g    c?g    1g    ?g   `%?g    %?g   @w@g   I?g   kg    g   @J߿g   ?g    ǿg   Fֿg   9?g   ` g   8?g   `@g    xg   @wg    x?g    g   @ҿg   ͆g    vg    ?g   n@g   `9ǿg   Y?g    g   @?g    [m?g    F?g   @?g   `Ьg   `Gg    c?g   @g   Pug   @?g   g   @Hg    4g   @ g   wg   #?g    d?g   Mg    g    ?g   ?g   @vPg   ſg   r?g   Lg    ?g   @?g    :ڿg    ?g   ?g   `
?g   @_ g   $Rg    Z?g   3g   `g    ?g   @Og   ew@g    Lg   V?g   ߩҿg    V?g   ?g   g   ?g   `;?g    Կg   `@g   -g    ?g   `g   ZY?g    g    	?g    8;?g    ?g   aοg   @Rh?g   `F
?g   A?g   @?g    g   `g    8?g   `>?g   ?g   @pg   i?g    ?g   `пg   @ @g   B?g    bg   @ @g    g   `\g   g   )W?g   `?g   `g   `@g    0$ӿg    >g    i?g   cg   ?g   H?g    T?g    ]g   .ܿg   yؿg   *g   `F?g   @g   `Is?g   _;?g   E?g    g   `<?g   `B?g   @ެ?g   `5g   ׿g   `Sg   +Dg   @4?g    T?g   W@g   ܨݿg   1?g   	g    xg   `?g    ?g   h?g   `g   Կg   g    ȿg   -g   `?g    ֭g   ?g   `?g   ?g   `$Zg   G)?g   ?g    3g   %g   `axg   ?g   @Ŀg    ?g   g   g   ڜ?g   @&C?g   `"?g   @Cg   nͿg   92ֿg   @g   g   `g   g   =?g   `L?g   g    X?g    Sg   @g   `T @g   @?g    ҿg    g   `g    X
ڿg    <?g   `gg   ؿg    yg   z?g   ĝ?g   + ?g   $u?g   mg   Pvg   ?g   lg   	ؿg   ?g   y@g   @xɿg    m?g   (g   1ٿg   @qg    g   ?g   2Ig   t?g     i?g    	g   @g   `s?g   `
@g    M.g    ?g    ?g   `4g   g   @j	g   @Cg   oEg   ?g    3@g   k?g   ?g    ?g   @߿g   ޟ?g   οg   og   7g   +g    ſg   pj?g   g    g   @g   (g    =g   0?g   `>޿g    .g   @\?g   `[?g    #?g    ?g   ?g   g   N?g   jg   =?g   R޿g   耎?g   `g   Lg    @g   =g   @g   @?g   R@g   rg   g   ?g   `v_?g   @T?g   ?g   @?g   8?g    {}g   i?g   Sg   @k?g   s?g    ?g   ?g    _g   @3@g   ?g   @ ?g   `Xrg   [g   g   ?g   `?g   @?g    5g   ?)r   @   g   g   x?g    g   k?g    g   l?g   y?g   6g   ?g   пg   `5?g   k@g   $g    z?g    1J@g   ?g   o?g   .g   hg   ӿg   _?g   ?g   $?g   g   6@g   @T?g   -?g   g    @g   g   ù?g   .?g   ?g   fg   ?g   ,'?g    ?g   ^@g   @Lg    >ۿg   4bg   ?g    Ng   ޿g    ?g   nZg   tg   i~@g    Jf?g   ^Gg   `mg   `6@g   /?g    ?g    Oܿg   ?g   g   gg    ^Dg   Fg   |g   1g   `8g   @*?g   ֿg   <Sg    ^g   @^?g    Wig    ?g    1?g   6?g   @J?g   @(p?g   @??g   Ơ?g    D:?g   g   `uڿg   nͿg    @g    [g    j?g   =?g     ?g    Z¿g   ?g   ?g   G?g   ܿg   `9?g   g   ?g   ?g   :eg    zg   kg    g   m?g    [rٿg   ߿g   ?g    y?g    ?g   ?g   `/g   (&g    C?g   @ݿg   g   `ٿg   @8lg   hg   9?g   ߫g   ?g   z|g    y吿g   `ݨg   @g   ` ?g   g    ;Sg   `?g   "տg   `1?g   "1?g   W?)r      g   
g   @:-g   g    l?g   g   `?g   ;?g   @wg   g   @Lug    C?g   F?g   @?g   @d?g   `F?g    :Ƣ?g   ?g   g   `(g   Eg   g   ¦?g   `?g   Oӿg   @?g   ?g   LSg   &,?g   ?g   Sg   @{Ŀg   ?)r   r/   g   Wg   X g   g   g    'g   +g   ؿg   ?og   ?o?g   ?g   +?g    '?g   ?g   ?g   X @g   W@)r      g   @/7g    g    21g    ?_Ͽg    ?_?g    21?g    ?g   @/7@)r      g   *g    Yܿg    Y?g   *?zUnsupported p=z, n=)torchr   NotImplementedError)r)   r*   s     r   get_higgs_gridr4   2   s   	1v|A#%89A$&89A %&89A $%89	A
 $%89A $%78A $%78A #$78A $%89A %&:;A %&89A $%89A #$67A $%89A $%89A  $%9:!A" $%89#A$ $%78%A& %&67'A( #$78)A* %&89+A, %&9:-A. &'9:/A0 $%781A2 %&9:3A4 %&895A6 $%787A8 $%789A: $%89;A< %&9:=A> %&9:?A@ $%78AAB %&89CAD %&89EAF %&9:GAH $%78IAJ #$67KAL #$67MAN $%78OAP &';<QAR #$78SAT $%67UAV #$78WAX $%78YAZ $%89[A\ $%89]A^ $%89_A` %&89aAb %&9:cAd $%9:eAf %&9:gAh #$67iAj #$78kAl $%:;mAn %&9:oAp %&9:qAr %&89sAt %&89uAv &';<wAx %&89yAz $%78{A| &'9:}A~ &'9:A@ #$56AAB #$78CAD &'89EAF %&9:GAH %&9:IAJ &'9:KAL #$78MAN '(9:OAP %&89QAR %&9:SAT %&89UAV $%67WAX $%89YAZ %&89[A\ $%78]A^ &'89_A` %&:;aAb %&89cAd '(:;eAf %&9:gAh $%78iAj $%89kAl $%89mAn $%89oAp %&78qAr $%67sAt $%67uAv %&78wAx %&78yAz %&89{A| $%78}A~ #$89A@ &'9:AAB $%9:CAD &':;EAF #$67GAH &'9:IAJ %&78KAL %&78MAN #$67OAP $%78QAR $%78SAT &';<UAV $%89WAX &':;YAZ %&9:[A\ %&89]A^ %&9:_A` $%78aAb $%89cAd #$67eAf %&9:gAh %&89iAj %&9:kAl $%89mAn $%67oAp %&9:qAr %&9:sAt %&9:uAv %&89wAx #$89yAz $%89{A| $%89}A~ %&78A@ %&9:AAB $%89CAD %&89EAF %&9:GAH %&9:IAJ %&89KAL %&;<MAN %&89OAP %&78QAR &'9:SAT #$56UAV $%89WAX $%67YAZ &':;[A\ %&89]A^ $%89_A` %&9:aAb $%89cAd $%89eAf %&89gAh %&89iAj $%9:kAl $%9:mAn #$78oAp $%89qAr $%78sAt #$78uAv $%67wAx $%78yAz %&9:{A| $%78}A~ $%78A@ #$67AAB %&89CAD #$:;EAF $%89GAH %&89IAJ $%78KAL %&78MAN &':;OAP $%78QAR $%89SAT %&9:UAV %&:;WAX #$56YAZ #$89[A\ #$78]A^ $%89_A` %&89aAb %&:;cAd %&9:eAf $%89gAh "#78iAj $%9:kAl %&78mAn $%89oAp %&9:qAr %&9:sAt %&89uAv $%78wAx %&9:yAz '(;<{A| $%89}A~ %&78A@ $%9:AAB $%78CAD %&89EAF $%78GAH %&9:IAJ &'9:KAL %&9:MAN %&89OAP #$78QAR $%89SAT $%78UAV %&9:WAX $%89YAZ %&89[A\ %&9:]A^ %&89_A` $%78aAb $%89cAd %&9:eAf %&:;gAh $%78iAj %&78kAl $%9:mAn %&89oAp $%89qAr $%78sAt %&78uAv $%78wAx %&9:yAz $%89{A| %&9:}A~ %&9:A@ $%67AAB #$67CAD %&9:EAF $%9:GAH %&9:IAJ %&9:KAL $%89MAN %&9:OAP %&9:QAR %&:;SAT $%89UAV #$67WAX $%78YAZ %&9:[A\ $%78]A^ %&:;_A` %&9:aAb $%89cAd #$67eAf #$78gAh %&89iAj %&9:kAl $%78mAn $%:;oAp %&78qAr $%78sAt $%89uAv %&78wAx $%89yAz &'9:{A| %&9:}A~ $%67A@ %&89AAC
 C
 C	
H 	
1v|A$&9:A#%78A %&89A #$78	A
 $%89A $%78A &'9:A #$56A $%89A $%9:A %&89A #$78A $%78A $%89A $%78A  #$78!A" $%78#A$ $%78%A& $%67'A( $%89)A* &'9:+A, %&:;-A. &':;/A0 %&671A2 %&893A4 %&785A6 $%787A8 $%789A: %&9:;A< %&89=A> $%89?A@ %&9:AAB %&9:CAD %&89EAF %&89GAH %&89IAJ $%78KAL $%89MAN $%89OAP &';<QAR $%89SAT #$67UAV %&:;WAX $%89YAZ %&:;[A\ &':;]A^ $%89_A` %&9:aAb %&9:cAd $%9:eAf %&89gAh $%78iAj $%89kAl $%78mAn &':;oAp %&9:qAr %&89sAt %&89uAv %&:;wAx %&9:yAz #$67{A| '(<=}A~ %&67A@ $%78AAC
 C
 C	
H Q7		|$&9:#%78#%67$&9:$&89#%78#%78"$89$&9:$&9:$&9:"$78#%78')?@#%78%'9:!
 
 	
( Q7		|$%#$$%$%$%$%%&%&$%$%#$#$#$#$"##$!
 
 	
( Q6		|$%$%$%$%#$#$#$#$	
 
 	
 Q6		|125H4IL^K_btauvwww!"=1"="=!"="=>>>r   r1   r-      bits
group_sizehadamard_sizec                 P   t          | j                  dk    s
J d            t          |d||z  z                                | j                  }t
          j                            |d          dz  }| j        }| j        }|                     dt
          j	                  } t          | dg|          } | j        d         |z  }	|                     d|	|          } t
          j                            | d          }
t          | d          |
d d d d d f         z  } t          | dg|                              | j        d         |	d|          } t          j        | j        d d         |t
          j        	          }t          d| j        d         d
          D ]V}t          j        d| ||d
z            z  |j        z  |z
  d                              t
          j                  |||d
z   <   W~ |                    |j        d         d          }|
t%          |          z  }
t'          |t          j        |
                    |          ||z  d          |                    |          |||||d	  	        \  } }
}}}| |
||                    t
          j                  |dS )Nr   z%Only 2D weights are supported for now)axisT)copydtyper   r   devicer=   r/   )r$   F)num_bitsr7   vector_sizer=   r?   check_correctnessr=   )weightscalestablestables2tune_metadata)r   r   r4   tor?   r2   linalgnormr=   float32r(   reshaper   emptyuint8r   argmaxTr   r
   repeat_interleaveviewfloat16)rD   r6   r)   r7   r8   gridgrid_norm_2r?   r=   multrE   codesirF   rG   rH   s                   r   quantize_with_higgsrZ     s   v|!!!#J!!!!Q1t8_--00??D,##Dr#22a7K]FLEYYDY66F&1#}55F <?m+D^^Bm44F\vB//F**VAAAqqq$J-??F &1#q))11&,q/4QOOF KSbS)&LLLE1fl1or** p p!LVABJ-?)?$&)H;)V\^___bbchcnooa!b&jMM%+a."--Ed=)))F5L		% 0 0-:2MSTUUU
6 
6 
62FFFG] <<em<44&  r   c                   z     e Zd Z	 	 	 	 	 ddedededeej                 d	eej                 d
edef fdZd Z	 xZ
S )HiggsLinearTNr-   r5   in_featuresout_featuresr@   r=   r?   r7   r8   c	                 &   t                                                       || _        || _        || _        || _        || _        ||z  dk    sJ |dv sJ t          j        t          j
        ||z  dz  |ft          j        |          d          | _        t          j        t          j
        |||z  f||          d          | _        t          j        t          j
        d|z  f||          d          | _        t          j        t          j
        d|z  d|z  df||          d          | _        |r1t          j        t          j
        |||          d          | _        n|                     d	d            d | _        d | _        d S )
Nr   )r      r1   r/   )r=   r?   F)requires_gradr   r>   bias)super__init__r]   r^   r@   r7   r8   r	   	Parameterr2   rN   int16rD   rE   rF   rG   rb   register_parameter	workspacerH   )
selfr]   r^   r@   rb   r=   r?   r7   r8   	__class__s
            r   rd   zHiggsLinear.__init__  s    	&( $*Z'1,,,,9$$$$lK0B6DEK`fggg
 
 
 lK{j'@AW]^^^ns
 
 
 l5;8~USY#Z#Z#Zjoppp|KHak15U6RRRbg
 
 
  	2U[fTY%Z%Z%ZjopppDII##FD111+/r   c           
         t          |dg| j                  }| j        t          d          t	          || j        | j        | j        | j        	                    t          j                  | j        | j        | j                  S )Nr:   z,Workspace must be set before calling forwardrC   )r8   )r(   r8   rh   	Exceptionr   rD   rE   rF   rG   rS   r2   rL   rH   )ri   xs     r   forwardzHiggsLinear.forward  s    RD$"455>!JKKKKKKLEM22N,	
 	
 	
 		
r   )TNNr-   r5   )__name__
__module____qualname__intr   r2   r=   r?   rd   rn   __classcell__)rj   s   @r   r\   r\     s         '+)-!'0 '0'0 '0 	'0 $'0 &'0 '0 '0 '0 '0 '0 '0 '0R
 
 
 
 
 
 
r   r\   Fc           
         ddl m} |                                 D ]k\  }}|g }|                    |           t	          |t
          j                  rd                    |          t          fd|D                       s |            5  |j	        }|j
        }	t          ||	|j        du|j        |j        |j                  | j        |<   d}t#          |          | j        |         _        | j        |                             d           ddd           n# 1 swxY w Y   t)          t+          |                                                    dk    rt/          |||||	          \  }
}|                    d
           m| |fS )a~  
    Public method that recursively replaces the Linear layers of the given model with HIGGS quantized layers.
    `accelerate` is needed to use this method. Returns the converted model and a boolean that indicates if the
    conversion has been successful or not.

    Args:
        model (`torch.nn.Module`):
            The model to convert, can be any `torch.nn.Module` instance.
        quantization_config (`HiggsConfig`):
            The quantization config object that contains the quantization parameters.
        current_key_name (`list`, *optional*):
            A list that contains the current key name. This is used for recursion and should not be passed by the user.
        has_been_replaced (`bool`, *optional*):
            A boolean that indicates if the conversion has been successful or not. This is used for recursion and
            should not be passed by the user.
    r   )init_empty_weightsN.c              3   B   K   | ]}                     |          V  d S N)endswith)r   keycurrent_key_name_strs     r   	<genexpr>z,replace_with_higgs_linear.<locals>.<genexpr>K  s2      \\c+44S99\\\\\\r   )rb   r@   r8   r7   TF)quantization_configcurrent_key_namehas_been_replacedmodules_to_not_convertr:   )
accelerateru   named_childrenappend
isinstancer	   Linearjoinanyr]   r^   r\   rb   r6   r8   r7   _modulestype
source_clsrequires_grad_r   listchildrenreplace_with_higgs_linearpop)modelr}   r~   r   r   ru   namemoduler]   r^   r   r{   s              @r   r   r   )  s   0 .-----,,.. $! $!f#!%%%fbi(( 	?#&88,<#=#= \\\\E[\\\\\ ?'')) ? ?"("4K#)#6L+6#$#[4!4!9&9&G#6#A, , ,EN4( )-% 7;6llEN4(3N4(77>>>#? ? ? ? ? ? ? ? ? ? ? ? ? ? ?$ tFOO%%&&''!++#<$7!1"3'=$ $ $ A  	R    ###s   BDD"	%D"	c           	         t          j                    5  |                                 D ]A\  }}|g }|                    |           t	          |t
                    r|j        }|j        }t           j        	                    |||j
        du|j        j        |j        j                  | j        |<    |t          j        ||j        j        |j        j                            j                                        | j        |         j        _        t)          t+          |                                                    dk    rt/          ||          }|                    d           C| cddd           S # 1 swxY w Y   dS )a  
    Dequantizes the HiggsLinear layers in the given model by replacing them with standard torch.nn.Linear layers.
    Args:
        model (torch.nn.Module): The model containing HiggsLinear layers to be dequantized.
        current_key_name (list, optional): A list to keep track of the current module names during recursion. Defaults to None.
    Returns:
        torch.nn.Module: The model with HiggsLinear layers replaced by torch.nn.Linear layers.
    N)rb   r?   r=   r>   r   )r~   r:   )r2   no_gradr   r   r   r\   r]   r^   r	   r   rb   rE   r?   r=   r   eyerQ   
contiguousrD   datar   r   r   dequantize_higgsr   )r   r~   r   r   r]   r^   r   s          r   r   r   k  s    
  !0022 	% 	%LD&'#% ##D)))&+.. !$0%2',x D0!=/ -- (7 ( (t$ 4:6Ik&-2FfmNabbb4 4JJLL t$+0 4))**++a//$%5  
   $$$$;                 s   EE::E>E>r   )r1   r   r-   r5   )NNFNrx   )__doc__mathr   typingr   utilsr   r   r   r2   r	   flute.integrations.higgsr
   
flute.tuner   r   fast_hadamard_transformr   r(   rr   r4   rZ   Moduler\   r   r   r   r   r   <module>r      s   ] \                       LLL  2@@@@@@11111111 ;::::::B B B BE?c E?c E?n E? E? E? E?P0 0c 0# 0s 0ad 0 0 0 0f9
 9
 9
 9
 9
%(/ 9
 9
 9
| ?$ ?$ ?$ ?$D' ' ' ' ' 'r   