
     ihB                        d Z ddlZddlZddlZddlmZ ddlZddlmZmZ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 ddlmZ ddlmZ  G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d e          Z G d! d"e          Z G d# d$e          Z G d% d&e          Z G d' d(e          Z G d) d*e          Z G d+ d,e          Z  G d- d.e          Z! G d/ d0e          Z" G d1 d2e          Z# G d3 d4e          Z$ G d5 d6e          Z% G d7 d8e          Z& G d9 d:e          Z' G d; d<e          Z( G d= d>e          Z) G d? d@e          Z* G dA dBe(          Z+ G dC dDe          Z, G dE dFe          Z- G dG dHe          Z. G dI dJe          Z/ G dK dLe          Z0 G dM dNe          Z1 G dO dPej2        e          Z2 G dQ dRej3                  Z3 G dS dTej4                  Z4dXdVZ5dW Z6dS )Yz'General String Encoding Rules (GSER).

    N)copy   )BaseTypeformat_bytesErrorWithLocation)EncodeErrorDecodeError)compiler)	format_or)utc_time_from_datetime)generalized_time_from_datetime)enum_values_as_dictc                       e Zd Zd Zd ZdS )Typec                      t          d          )Nz To be implemented by subclasses.NotImplementedErrorselfdata
_separator_indents       e/home/jenkins/workspace/simtester-sanitize/venv/lib/python3.11/site-packages/asn1tools/codecs/gser.pyencodezType.encode   s    !"DEEE    c                     d S N )r   minimummaximumhas_extension_markers       r   set_size_rangezType.set_size_range   s    r   N)__name__
__module____qualname__r   r#   r   r   r   r   r      s5        F F F    r   r   c                   *     e Zd Z fdZd Zd Z xZS )MembersTypec                 h    t          t          |                               ||           || _        d S r   )superr(   __init__members)r   namer,   	type_name	__class__s       r   r+   zMembersType.__init__    s.    k4  ))$	:::r   c                 &   g }|d|z  z   }| j         D ]}|j        }||v rz	 |                    ||         ||          }n)# t          $ r}	|	                    |           |	d }	~	ww xY wd                    ||j        |          }|                    |           |j        r|                                s.t          d                    | j
        j        ||                    d                    |          }|                    d|z   dg          S )N z{}{} {}z{} member '{}' not found in {}.,{})r,   r-   r   r   add_locationformatappendoptionalhas_defaultr   r/   r$   join)
r   r   	separatorindentencoded_membersmember_separatormemberr-   encoded_memberes
             r   r   zMembersType.encode$   sZ   $sV|3l 	 	F;Dt||%+]]4:3C39&; &;NN )   NN6***G
 ",!2!23C39;3A"C "C  &&~6666 '')) !5<</    ((?33~~s_4c:;;;s   >
A$AA$c                     d                     | j        j        | j        d                    d | j        D                                 S )Nz{}({}, [{}]), c                 ,    g | ]}t          |          S r   repr.0r?   s     r   
<listcomp>z(MembersType.__repr__.<locals>.<listcomp>J       ???tF||???r   )r6   r/   r$   r-   r:   r,   r   s    r   __repr__zMembersType.__repr__F   sJ    $$N#III??$,???@@B B 	Br   r$   r%   r&   r+   r   rL   __classcell__r/   s   @r   r(   r(      s^             <  <  <DB B B B B B Br   r(   c                   *     e Zd Z fdZd Zd Z xZS )	ArrayTypec                 h    t          t          |                               ||           || _        d S r   )r*   rQ   r+   element_type)r   r-   r.   rS   r/   s       r   r+   zArrayType.__init__O   s1    i''i888(r   c                    g }|d|z  z   }|D ]I}| j                             |||          }d                    ||          }|                    |           Jd                    |          }|                    d|z   dg          S )Nr1   z{}{}r2   r3   r4   )rS   r   r6   r7   r:   )r   r   r;   r<   encoded_elementselement_separatorentryencoded_elements           r   r   zArrayType.encodeS   s    %f4 	5 	5E"/66u7H7=? ?O &nn->-<> >O##O444488$455~~s%55s;<<<r   c                 X    d                     | j        j        | j        | j                  S )Nz
{}({}, {}))r6   r/   r$   r-   rS   rK   s    r   rL   zArrayType.__repr__c   s,    ""4>#:#'9#'#46 6 	6r   rM   rO   s   @r   rQ   rQ   M   sV        ) ) ) ) )= = = 6 6 6 6 6 6 6r   rQ   c                   $     e Zd Z fdZd Z xZS )Booleanc                 Z    t          t          |                               |d           d S )NBOOLEAN)r*   r[   r+   r   r-   r/   s     r   r+   zBoolean.__init__k   )    gt%%dI66666r   c                     |rdndS )NTRUEFALSEr   r   s       r   r   zBoolean.encoden   s    *vv7*r   r$   r%   r&   r+   r   rN   rO   s   @r   r[   r[   i   sG        7 7 7 7 7+ + + + + + +r   r[   c                   $     e Zd Z fdZd Z xZS )Integerc                 Z    t          t          |                               |d           d S )NINTEGER)r*   re   r+   r^   s     r   r+   zInteger.__init__t   r_   r   c                      t          |          S r   )strr   s       r   r   zInteger.encodew   s    4yyr   rc   rO   s   @r   re   re   r   sG        7 7 7 7 7      r   re   c                   $     e Zd Z fdZd Z xZS )Realc                 Z    t          t          |                               |d           d S )NREAL)r*   rk   r+   r^   s     r   r+   zReal.__init__}   )    dD""400000r   c                     |t          d          k    rd}nW|t          d          k    rd}nAt          j        |          rt          d          |dk    rd}nd                    |          }|S )	NinfzPLUS-INFINITYz-infzMINUS-INFINITYz(Cannot encode floating point number NaN.g        0z{}E0)floatmathisnanr   r6   r   s       r   r   zReal.encode   sy    5<<"DDU6]]""#DDZ 	'HIIIS[[DD==&&Dr   rc   rO   s   @r   rk   rk   {   sG        1 1 1 1 1      r   rk   c                   $     e Zd Z fdZd Z xZS )Nullc                 Z    t          t          |                               |d           d S NNULL)r*   rv   r+   r^   s     r   r+   zNull.__init__   rn   r   c                     dS rx   r   )r   _datar   r   s       r   r   zNull.encode   s    vr   rc   rO   s   @r   rv   rv      sG        1 1 1 1 1      r   rv   c                   $     e Zd Z fdZd Z xZS )	BitStringc                 Z    t          t          |                               |d           d S )N
BIT STRING)r*   r}   r+   r^   s     r   r+   zBitString.__init__   s)    i''l;;;;;r   c                    t          t          j        |d                   d          }|ddt          |d                   z  z  z  }d                    t          |          dd|d         z                                                      S )Nr            z'{}'B
   r   )intbinasciihexlifylenr6   binupper)r   r   r   r   encodeds        r   r   zBitString.encode   ss    h&tAw//44DQT!W-./~~c'll2b47l?;<<BBDDDr   rc   rO   s   @r   r}   r}      sN        < < < < <E E E E E E Er   r}   c                   $     e Zd Z fdZd Z xZS )OctetStringc                 Z    t          t          |                               |d           d S )NOCTET STRING)r*   r   r+   r^   s     r   r+   zOctetString.__init__   s)    k4  ))$?????r   c                 j    d                     t          |                                                    S Nz'{}'H)r6   r   r   r   s       r   r   zOctetString.encode   s(    ~~l4001177999r   rc   rO   s   @r   r   r      sL        @ @ @ @ @: : : : : : :r   r   c                   $     e Zd Z fdZd Z xZS )ObjectIdentifierc                 Z    t          t          |                               |d           d S )NOBJECT IDENTIFIER)r*   r   r+   r^   s     r   r+   zObjectIdentifier.__init__   s+    %%..t5HIIIIIr   c                     |S r   r   r   s       r   r   zObjectIdentifier.encode   s    r   rc   rO   s   @r   r   r      sL        J J J J J      r   r   c                   $     e Zd Z fdZd Z xZS )
Enumeratedc                     t          t          |                               |d           |rt          |          | _        d S d t          |                                          D             | _        d S )N
ENUMERATEDc                     i | ]}||S r   r   )rH   vs     r   
<dictcomp>z'Enumerated.__init__.<locals>.<dictcomp>   s'     " " "1" " "r   )r*   r   r+   r   data_to_valuevalues)r   r-   r   numericr/   s       r   r+   zEnumerated.__init__   s|    j$((|<<< 	!4V!<!<D" "1&99@@BB" " "Dr   c                     | j         |         S r   )r   r   s       r   r   zEnumerated.encode   s    !$''r   rc   rO   s   @r   r   r      sG            ( ( ( ( ( ( (r   r   c                        e Zd Z fdZ xZS )Sequencec                 \    t          t          |                               ||d           d S )NSEQUENCE)r*   r   r+   r   r-   r,   r/   s      r   r+   zSequence.__init__   s+    h&&tWjAAAAAr   r$   r%   r&   r+   rN   rO   s   @r   r   r      sA        B B B B B B B B Br   r   c                        e Zd Z fdZ xZS )
SequenceOfc                 \    t          t          |                               |d|           d S )NSEQUENCE OF)r*   r   r+   r   r-   rS   r/   s      r   r+   zSequenceOf.__init__   s7    j$(()6)5	7 	7 	7 	7 	7r   r   rO   s   @r   r   r      s8        7 7 7 7 7 7 7 7 7r   r   c                        e Zd Z fdZ xZS )Setc                 \    t          t          |                               ||d           d S )NSET)r*   r   r+   r   s      r   r+   zSet.__init__   s+    c4!!$77777r   r   rO   s   @r   r   r      s8        8 8 8 8 8 8 8 8 8r   r   c                        e Zd Z fdZ xZS )SetOfc                 \    t          t          |                               |d|           d S )NSET OF)r*   r   r+   r   s      r   r+   zSetOf.__init__   s7    eT##D$,$0	2 	2 	2 	2 	2r   r   rO   s   @r   r   r      s8        2 2 2 2 2 2 2 2 2r   r   c                   0     e Zd Z fdZd Zd Zd Z xZS )Choicec                     t          t          |                               |d           || _        d | j        D             | _        d S )NCHOICEc                     i | ]
}|j         |S r   r-   rG   s     r   r   z#Choice.__init__.<locals>.<dictcomp>   s    NNNvv{FNNNr   )r*   r   r+   r,   name_to_memberr   s      r   r+   zChoice.__init__   sH    fd$$T8444NNNNNr   c                 X    t          t          d | j        D                                 S )Nc                     g | ]	}|j         
S r   r   rG   s     r   rI   z'Choice.format_names.<locals>.<listcomp>   s     H H H H H Hr   )r   sortedr,   rK   s    r   format_nameszChoice.format_names   s)     H H4< H H HIIJJJr   c                    	 | j         |d                  }nI# t          $ r< t          d                    |                                 |d                             w xY w	 |                    |d         ||          }n)# t          $ r}|                    |           |d }~ww xY wd                    |d         |          S )Nr   z!Expected choice {}, but got '{}'.r   z{} : {})r   KeyErrorr   r6   r   r   r   r5   )r   r   r;   r<   r?   r   rA   s          r   r   zChoice.encode   s    	(a1FF 	 	 	3::%%''G   	
	mmDGY??GG  	 	 	NN6"""G	
   a'222s"    AA A> >
B$BB$c                 |    d                     | j        d                    d | j        D                                 S )NzChoice({}, [{}])rC   c                 ,    g | ]}t          |          S r   rE   rG   s     r   rI   z#Choice.__repr__.<locals>.<listcomp>   rJ   r   )r6   r-   r:   r,   rK   s    r   rL   zChoice.__repr__   sB    !((III??$,???@@B B 	Br   )r$   r%   r&   r+   r   r   rL   rN   rO   s   @r   r   r      st        O O O O O
K K K3 3 3"B B B B B B Br   r   c                   $     e Zd Z fdZd Z xZS )
UTF8Stringc                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zUTF8String.__init__  s)    j$((|<<<<<r   c                 ,    d                     |          S N"{}"r6   r   s       r   r   zUTF8String.encode      ~~d###r   rc   rO   s   @r   r   r     sG        = = = = =$ $ $ $ $ $ $r   r   c                   $     e Zd Z fdZd Z xZS )NumericStringc                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zNumericString.__init__  )    mT""++D/BBBBBr   c                 ,    d                     |          S r   r   r   s       r   r   zNumericString.encode  r   r   rc   rO   s   @r   r   r     L        C C C C C$ $ $ $ $ $ $r   r   c                   $     e Zd Z fdZd Z xZS )PrintableStringc                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zPrintableString.__init__  *    ot$$--d4EFFFFFr   c                 ,    d                     |          S r   r   r   s       r   r   zPrintableString.encode  r   r   rc   rO   s   @r   r   r     L        G G G G G$ $ $ $ $ $ $r   r   c                   $     e Zd Z fdZd Z xZS )	IA5Stringc                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zIA5String.__init__   )    i''k:::::r   c                 ,    d                     |          S r   r   r   s       r   r   zIA5String.encode#  r   r   rc   rO   s   @r   r   r     G        ; ; ; ; ;$ $ $ $ $ $ $r   r   c                   $     e Zd Z fdZd Z xZS )VisibleStringc                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zVisibleString.__init__)  r   r   c                 ,    d                     |          S r   r   r   s       r   r   zVisibleString.encode,  r   r   rc   rO   s   @r   r   r   '  r   r   r   c                   $     e Zd Z fdZd Z xZS )GeneralStringc                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zGeneralString.__init__2  r   r   c                 ,    d                     |          S r   r   r   s       r   r   zGeneralString.encode5  r   r   rc   rO   s   @r   r   r   0  r   r   r   c                   $     e Zd Z fdZd Z xZS )	BMPStringc                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zBMPString.__init__;  r   r   c                 ,    d                     |          S r   r   r   s       r   r   zBMPString.encode>  r   r   rc   rO   s   @r   r   r   9  r   r   r   c                   $     e Zd Z fdZd Z xZS )GraphicStringc                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zGraphicString.__init__D  r   r   c                 ,    d                     |          S r   r   r   s       r   r   zGraphicString.encodeG  r   r   rc   rO   s   @r   r   r   B  r   r   r   c                   $     e Zd Z fdZd Z xZS )UniversalStringc                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zUniversalString.__init__M  r   r   c                 ,    d                     |          S r   r   r   s       r   r   zUniversalString.encodeP  r   r   rc   rO   s   @r   r   r   K  r   r   r   c                   $     e Zd Z fdZd Z xZS )TeletexStringc                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zTeletexString.__init__V  r   r   c                 ,    d                     |          S r   r   r   s       r   r   zTeletexString.encodeY  r   r   rc   rO   s   @r   r   r   T  r   r   r   c                       e Zd ZdS )ObjectDescriptorN)r$   r%   r&   r   r   r   r   r   ]  s        Dr   r   c                   $     e Zd Z fdZd Z xZS )UTCTimec                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zUTCTime.__init__c  r_   r   c                 F    d                     t          |                    S r   )r6   r   r   s       r   r   zUTCTime.encodef  s    ~~4T::;;;r   rc   rO   s   @r   r   r   a  sG        7 7 7 7 7< < < < < < <r   r   c                   $     e Zd Z fdZd Z xZS )GeneralizedTimec                 Z    t          t          |                               |d           d S )Nr   )r*   r   r+   r^   s     r   r+   zGeneralizedTime.__init__l  r   r   c                 F    d                     t          |                    S r   )r6   r   r   s       r   r   zGeneralizedTime.encodeo  s    ~~<TBBCCCr   rc   rO   s   @r   r   r   j  sS        G G G G GD D D D D D Dr   r   c                   $     e Zd Z fdZd Z xZS )Datec                 Z    t          t          |                               |d           d S )NDATE)r*   r  r+   r^   s     r   r+   zDate.__init__u  rn   r   c                 F    d                     t          |                    S r   r6   ri   r   s       r   r   zDate.encodex      ~~c$ii(((r   rc   rO   s   @r   r  r  s  sG        1 1 1 1 1) ) ) ) ) ) )r   r  c                   $     e Zd Z fdZd Z xZS )	TimeOfDayc                 Z    t          t          |                               |d           d S )NTIME-OF-DAY)r*   r  r+   r^   s     r   r+   zTimeOfDay.__init__~  s)    i''m<<<<<r   c                 F    d                     t          |                    S r   r  r   s       r   r   zTimeOfDay.encode  r  r   rc   rO   s   @r   r  r  |  sG        = = = = =) ) ) ) ) ) )r   r  c                   $     e Zd Z fdZd Z xZS )DateTimec                 Z    t          t          |                               |d           d S )N	DATE-TIME)r*   r  r+   r^   s     r   r+   zDateTime.__init__  s)    h&&t[99999r   c                 n    d                     t          |                              dd                    S )Nr   r1   T)r6   ri   replacer   s       r   r   zDateTime.encode  s*    ~~c$ii//S99:::r   rc   rO   s   @r   r  r    sG        : : : : :; ; ; ; ; ; ;r   r  c                   $     e Zd Z fdZd Z xZS )Anyc                 Z    t          t          |                               |d           d S )NANY)r*   r  r+   r^   s     r   r+   zAny.__init__  s)    c4!!$.....r   c                 n    t          |                                          }d                    |          S r   )r   r   r6   r   s       r   r   z
Any.encode  s-    D!!''))~~d###r   rc   rO   s   @r   r  r    sG        / / / / /$ $ $ $ $ $ $r   r  c                   *     e Zd Z fdZd Zd Z xZS )	Recursivec                     t          t          |                               |d           || _        || _        d | _        d S )N	RECURSIVE)r*   r  r+   r.   module_nameinner)r   r-   r.   r  r/   s       r   r+   zRecursive.__init__  s=    i''k:::"&


r   c                 .    t          |          | _        d S r   )r   r  )r   r  s     r   set_inner_typezRecursive.set_inner_type  s    %[[


r   c                 :    | j                             |||          S r   )r  r   )r   r   r;   r<   s       r   r   zRecursive.encode  s    z  y&999r   )r$   r%   r&   r+   r  r   rN   rO   s   @r   r  r    sV            ! ! !: : : : : : :r   r  c                   ,     e Zd Z fdZddZd Z xZS )CompiledTypec                     t          t          |                               |           |                                | _        || _        d S r   )r*   r"  r+   lower_value_name_value_type)r   r.   compiled_typer/   s      r   r+   zCompiledType.__init__  sA    lD!!**=999$??,,$r   Nc                 j   	 || j                             |dd          }n| j                             |d|          }n.# t          $ r!}|                    | j                    |d }~ww xY wd                    | j        | j        |                    d                    }|                    d          S )Nr1   r   
z{} {} ::= {}zutf-8)_typer   r   r5   r6   r%  r&  lstrip)r   r   r<   r   rA   s        r   r   zCompiledType.encode  s    	~*++D#q99*++D$??  	 	 	NN4:&&&G	
 "(()9)-)9)0)<)<> > ~~g&&&s   ;> 
A)A$$A)c                      t          d          )Nz!GSER decoding is not implemented.r   )r   r   s     r   decodezCompiledType.decode  s    !"EFFFr   r   )r$   r%   r&   r+   r   r-  rN   rO   s   @r   r"  r"    sb        % % % % %
' ' ' '"G G G G G G Gr   r"  c                       e Zd Zd Zd ZdS )Compilerc                 P    |                      |||          }t          ||          S r   )compile_typer"  )r   r.   type_descriptorr  r'  s        r   process_typezCompiler.process_type  s1    )))*9*57 7 I}555r   c                 X   |                      ||          }|d         }|dk    r1|                     |d         |          \  }}t          ||          }n|dk    r-t          ||                     d|d         |                    }n|dk    r1|                     |d         |          \  }}t          ||          }nj|dk    r-t          ||                     d|d         |                    }n7|d	k    r1|                     |d         |          \  }}t          ||          }n |d
k    rt          |          }n|dk    rt          |          }n|dk    r,t          ||                     ||          | j                  }n|dk    rt          |          }n|dk    rt          |          }nr|dk    rt          |          }n[|dk    rt!          |          }nD|dk    rt#          |          }n-|dk    rt%          |          }n|dk    rt'          |          }n|dk    rt)          |          }n|dk    rt+          |          }n|dk    rt-          |          }n|dk    rt/          |          }n|dk    rt1          |          }n|dk    rt3          |          }nu|dk    rt5          |          }n^|dk    rt7          |          }nG|dk    rt9          |          }n0|dk    rt;          |          }n|dk    rt=          |          }n|dk    rt?          |          }n|d k    rtA          |          }n|d!k    rtA          |          }n|d"k    rtC          |          }n|d#k    rB|                     | "                                d         |          \  }}t          ||          }nb|d$k    rtG          |          }nL|| j$        v r,tK          |||          }| j&        '                    |           n| (                    |||          }|S )%Ntyper   r,   r    elementr   r   r   rg   rm   r   r]   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r   r  zANY DEFINED BYry   EXTERNALr   ))get_module_namecompile_membersr   r   r1  r   r   r   re   rk   r   get_enum_values_numeric_enumsr[   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r}   r  rv   external_type_descriptorr   types_backtracer  recursive_typesr7   compile_user_type)r   r-   r2  r  r.   r,   _compileds           r   r1  zCompiler.compile_type  s   **?KHH#F+	
""--	* JGQ  g..HH-''!$"&"3"3B4CI4N4?#A #AB BHH %--	* JGQ 4))HH(""T!..r/>y/I/:< <= =HH (""--	* JGQ dG,,HH)##t}}HH&  DzzHH,&&!$"&"6"67B#D #D"&"57 7HH )##t}}HH---'--HH.(("4((HH/))$T**HH/))$T**HH+++&t,,HH+%% HH/))$T**HH/))$T**HH,&&!$''HH+%% HH/))$T**HH)##t}}HH+++&t,,HH+++&t,,HH&  DzzHH-'' HH+%%~~HH,&& HH%4yyHH***4yyHH&  DzzHH*$$----//	: JGQ  g..HH,,,'--HHD000$T%.%02 2 $++H555511$2;2=? ? r   N)r$   r%   r&   r3  r1  r   r   r   r/  r/    s7        6 6 6d d d d dr   r/  Fc                 F    t          | |                                          S r   )r/  process)specificationnumeric_enumss     r   compile_dictrG  4  s    M=1199;;;r   c                      t          d          )Nz.Decode length is not supported for this codec.r	   )r{   s    r   decode_full_lengthrI  8  s    
F
G
GGr   )F)7__doc__timer   rs   r   datetimer6  r   r   r   r   r
   r   r   r   r   r   r   r(   rQ   r[   re   rk   rv   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  r  r  r"  r/  rG  rI  r   r   r   <module>rM     sC              7 7 7 7 7 7 7 7 7 7                         $ $ $ $ $ $ , , , , , , ) ) ) ) ) )    8   ,B ,B ,B ,B ,B$ ,B ,B ,B^6 6 6 6 6 6 6 68+ + + + +d + + +    d       4   (    4   	E 	E 	E 	E 	E 	E 	E 	E: : : : :$ : : :    t   ( ( ( ( ( ( ( ( B B B B B{ B B B7 7 7 7 7 7 7 78 8 8 8 8+ 8 8 82 2 2 2 2I 2 2 2B B B B BT B B BB$ $ $ $ $ $ $ $$ $ $ $ $D $ $ $$ $ $ $ $d $ $ $$ $ $ $ $ $ $ $$ $ $ $ $D $ $ $$ $ $ $ $D $ $ $$ $ $ $ $ $ $ $$ $ $ $ $D $ $ $$ $ $ $ $d $ $ $$ $ $ $ $D $ $ $	 	 	 	 	} 	 	 	< < < < <d < < <D D D D Dd D D D) ) ) ) )4 ) ) )) ) ) ) ) ) ) ); ; ; ; ;t ; ; ;$ $ $ $ $$ $ $ $: : : : :"D : : :G G G G G8( G G G8m m m m mx  m m m`< < < <H H H H Hr   