
     hJ                        d 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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j                  Z G d dej                  Z G d dej                   Z! G d dej"                  Z# G d dej$                  Z% G d dej&                  Z'd Z( G d dej)                  Z* G d de*          Z+ G d  d!ej,                  Z- G d" d#ej.                  Z/ G d$ d%ej)                  Z0 G d& d'ej1                  Z2 G d( d)ej3                  Z4 G d* d+ej5                  Z6 G d, d-e6          Z7 G d. d/ej)                  Z8d0 d1D             Z9e9:                    d2d3d4           d5 Z; G d6 d7          Z< G d8 d9e<ej=                  Z> G d: d;e<ej                  Z?dS )<z8
Form Widget classes specific to the Django admin site.
    N)forms)settings)ValidationError)URLValidator)CASCADE	UUIDField)reverse)NoReverseMatch)smart_urlquote)	urlencode)	Truncator)get_language)gettextc                   H     e Zd ZdZ G d d          Zd fd	Z fdZ xZS )	FilteredSelectMultiplez
    A SelectMultiple with a JavaScript filter interface.

    Note that the resulting JavaScript assumes that the jsi18n
    catalog has been loaded in the page
    c                       e Zd Zg dZdS )FilteredSelectMultiple.Media)zadmin/js/core.jszadmin/js/SelectBox.jszadmin/js/SelectFilter2.jsN__name__
__module____qualname__js     X/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/django/contrib/admin/widgets.pyMediar      s        
 
 
r   r   Nr   c                 h    || _         || _        t                                          ||           d S N)verbose_name
is_stackedsuper__init__)selfr   r    attrschoices	__class__s        r   r"   zFilteredSelectMultiple.__init__$   s2    ($(((((r   c                 (   t                                          |||          }d|d         d         d<   | j        r|d         d         dxx         dz  cc<   | j        |d         d         d<   t	          | j                  |d         d         d<   |S )Nselectfilterwidgetr$   classstackeddata-field-namezdata-is-stacked)r!   get_contextr    r   intr#   namevaluer$   contextr&   s        r   r-   z"FilteredSelectMultiple.get_context)   s    ''%%dE599.<'"7+? 	=Hg&w///9<///8<8I'"#458;DO8L8L'"#45r   )Nr   )r   r   r   __doc__r   r"   r-   __classcell__r&   s   @r   r   r      s         
 
 
 
 
 
 
 
) ) ) ) ) )
        r   r   c                   :     e Zd Z G d d          Zd fd	Z xZS )AdminDateWidgetc                       e Zd ZddgZdS )AdminDateWidget.Mediaadmin/js/calendar.js#admin/js/admin/DateTimeShortcuts.jsNr   r   r   r   r   r9   4           "1
r   r   Nc                 `    ddd|pi }t                                          ||           d S )N
vDateField10r*   sizer$   formatr!   r"   r#   r$   rC   r&   s      r   r"   zAdminDateWidget.__init__:   s<    &FF"FuV44444r   NNr   r   r   r   r"   r4   r5   s   @r   r7   r7   3   e        
 
 
 
 
 
 
 
5 5 5 5 5 5 5 5 5 5r   r7   c                   :     e Zd Z G d d          Zd fd	Z xZS )AdminTimeWidgetc                       e Zd ZddgZdS )AdminTimeWidget.Mediar:   r;   Nr   r   r   r   r   rL   @   r<   r   r   Nc                 `    ddd|pi }t                                          ||           d S )N
vTimeField8r@   rB   rD   rE   s      r   r"   zAdminTimeWidget.__init__F   s<    &EEEuV44444r   rF   rG   r5   s   @r   rJ   rJ   ?   rH   r   rJ   c                   .     e Zd ZdZdZddZ fdZ xZS )AdminSplitDateTimezF
    A SplitDateTime Widget that has some admin-specific styling.
    z!admin/widgets/split_datetime.htmlNc                 d    t           t          g}t          j                            | ||           d S r   )r7   rJ   r   MultiWidgetr"   )r#   r$   widgetss      r   r"   zAdminSplitDateTime.__init__R   s/    "O4 	""4%88888r   c                     t                                          |||          }t          d          |d<   t          d          |d<   |S )NzDate:
date_labelzTime:
time_label)r!   r-   _r/   s        r   r-   zAdminSplitDateTime.get_contextX   sC    ''%%dE599 !'

 !'

r   r   )r   r   r   r3   template_namer"   r-   r4   r5   s   @r   rQ   rQ   K   s]          8M9 9 9 9        r   rQ   c                       e Zd ZdZdS )AdminRadioSelectzadmin/widgets/radio.htmlNr   r   r   rY   r   r   r   r[   r[   _   s        .MMMr   r[   c                       e Zd ZdZdS )AdminFileWidgetz'admin/widgets/clearable_file_input.htmlNr\   r   r   r   r^   r^   c   s        =MMMr   r^   c                 p   i }| rt          | d          r|                                 D ]\  }}t          |          r
 |            }t          |t          t
          f          r d                    d |D                       }n-t          |t                    r	d|         }nt          |          }|||<   |S )z
    Convert the type of lookups specified in a ForeignKey limit_choices_to
    attribute to a dictionary of query parameters
    items,c              3   4   K   | ]}t          |          V  d S r   str.0xs     r   	<genexpr>z.url_params_from_lookup_dict.<locals>.<genexpr>r   s(      //SVV//////r   )01)	hasattrr`   callable
isinstancetuplelistjoinboolrd   )lookupsparamskvs       r   url_params_from_lookup_dictrv   g   s    
 F 
77G,, 
MMOO 		 		DAq{{ ACC!eT]++ HH//Q/////At$$ qMFFF1IIMr   c                   D     e Zd ZdZdZd	 fd	Z fdZd Zd Zd Z	 xZ
S )
ForeignKeyRawIdWidgetzj
    A Widget for displaying ForeignKeys in the "raw_id" interface rather than
    in a <select> box.
    z%admin/widgets/foreign_key_raw_id.htmlNc                 t    || _         || _        || _        t                                          |           d S r   )rel
admin_sitedbr!   r"   )r#   rz   r{   r$   usingr&   s        r   r"   zForeignKeyRawIdWidget.__init__   s6    $r   c                    t                                          |||          }| j        j        }|| j        j        v rt          d|j        j        d|j        j	        d| j        j
                  }|                                 }|r|dt          |          z   z  }||d<   t          d          |d<   d	}t          | j                                        t                     r|d
z  }|d         d                             d|           nd |d<   |d         d         r|                     |          \  |d<   |d<   nd |d<   |S )Nzadmin:rX   _changelist)current_app?related_urlLookup
link_titlevForeignKeyRawIdAdminFieldz vUUIDFieldr)   r$   r*   r1   
link_labellink_url)r!   r-   rz   modelr{   	_registryr	   _meta	app_label
model_namer0   url_parametersr   rX   rm   get_related_fieldr   
setdefaultlabel_and_url_for_value)
r#   r0   r1   r$   r2   rel_tor   rs   	css_classr&   s
            r   r-   z!ForeignKeyRawIdWidget.get_context   so   ''%%dE599T_...!' L***L+++
 !O0  K ((**F 7sYv%6%666%0GM"$%hKKGL!4I$(4466	BB +]*	Hg&11'9EEEE%)GM"8W% 	)9=9U9U: :6GL!7:#6#6 %)GL!r   c                 j    | j         j        }t          |          r
 |            }t          |          S r   )rz   limit_choices_torl   rv   )r#   r   s     r   base_url_parametersz)ForeignKeyRawIdWidget.base_url_parameters   s<    84$%% 	2//11*+;<<<r   c                     ddl m} |                                 }|                    || j                                        j        i           |S )Nr   )TO_FIELD_VAR)django.contrib.admin.views.mainr   r   updaterz   r   r0   )r#   r   rs   s      r   r   z$ForeignKeyRawIdWidget.url_parameters   sR    @@@@@@))++|TX%?%?%A%A%FGHHHr   c                    | j                                         j        }	  | j         j        j                            | j                  j        di ||i}n(# t          | j         j        j	        t          f$ r Y dS w xY w	 t          | j        j        d|j        j        d|j        j                                        d|j        f          }n# t$          $ r d}Y nw xY wt'          |                              d          |fS )	N r   :rX   _change)argsr      r   )rz   r   r0   r   _default_managerr}   r|   get
ValueErrorDoesNotExistr   r	   r{   r   r   object_namelowerpkr
   r   words)r#   r1   keyobjurls        r   r   z-ForeignKeyRawIdWidget.label_and_url_for_value   s*   h((**/	D$(.177@@DTTU|TTCCDHN7I 	 	 	66		 O(((I'''I)//1111	 fY  CC  	 	 	CCC	 ~~##B'',,s$   6A !A<;A< AC C C rF   )r   r   r   r3   rY   r"   r-   r   r   r   r4   r5   s   @r   rx   rx   {   s         
 <M                    D= = =  - - - - - - -r   rx   c                   >     e Zd ZdZdZ fdZd Zd Zd Zd Z	 xZ
S )ManyToManyRawIdWidgetzv
    A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
    in a <select multiple> box.
    z&admin/widgets/many_to_many_raw_id.htmlc                     t                                          |||          }| j        j        | j        j        v rd|d         d         d<   |S )NvManyToManyRawIdAdminFieldr)   r$   r*   )r!   r-   rz   r   r{   r   r/   s        r   r-   z!ManyToManyRawIdWidget.get_context   sK    ''%%dE5998>T_6662NGHg&w/r   c                 *    |                                  S r   )r   r#   s    r   r   z$ManyToManyRawIdWidget.url_parameters   s    '')))r   c                     dS )Nr   r   r#   r1   s     r   r   z-ManyToManyRawIdWidget.label_and_url_for_value   s    vr   c                 ^    |                     |          }|r|                    d          S d S )Nra   )r   split)r#   datafilesr0   r1   s        r   value_from_datadictz)ManyToManyRawIdWidget.value_from_datadict   s5     	$;;s###	$ 	$r   c                 H    |rd                     d |D                       ndS )Nra   c              3   4   K   | ]}t          |          V  d S r   rc   )rf   ru   s     r   rh   z5ManyToManyRawIdWidget.format_value.<locals>.<genexpr>   s(      ..1A......r   r   )rp   r   s     r   format_valuez"ManyToManyRawIdWidget.format_value   s-    27?sxx........R?r   )r   r   r   r3   rY   r-   r   r   r   r   r4   r5   s   @r   r   r      s         
 =M    * * *  $ $ $
@ @ @ @ @ @ @r   r   c                   v    e Zd ZdZdZ	 	 	 	 ddZd Zed             Zed             Z	d	 Z
d
 Zd Zd Zd ZdS )RelatedFieldWidgetWrapperzd
    This class is a wrapper to a given widget to add the add icon for the
    admin interface.
    z)admin/widgets/related_widget_wrapper.htmlNFc                 :   |j         | _         |j        | _        |j        | _        || _        || _        ||j        |j        v }|| _        t          |dd          }| o|| _	        t          |dd           t          u }	| o|	 o|| _        | o|| _        || _        d S )Nallow_multiple_selectedF	on_delete)needs_multipart_formr$   r%   r)   rz   r   r   can_add_relatedgetattrcan_change_relatedr   can_delete_relatedcan_view_relatedr{   )
r#   r)   rz   r{   r   r   r   r   multiplecascades
             r   r"   z"RelatedFieldWidgetWrapper.__init__   s     %+$?!\
~ "!i:+??O.6#<eDD&.,"E3E#{D11W<&.,"Uw;"UCU$, A1A$r   c                     t          j         |           }t          j        | j        |          |_        | j        j        |_        ||t	          |           <   |S r   )copydeepcopyr)   r$   id)r#   memor   s      r   __deepcopy__z&RelatedFieldWidgetWrapper.__deepcopy__  sD    ioo]4;55
K%	RXX
r   c                     | j         j        S r   )r)   	is_hiddenr   s    r   r   z#RelatedFieldWidgetWrapper.is_hidden  s    {$$r   c                     | j         j        S r   )r)   mediar   s    r   r   zRelatedFieldWidgetWrapper.media  s    {  r   c                 H    t          d||fz   z  | j        j        |          S )Nzadmin:%s_%s_%s)r   r   )r	   r{   r0   )r#   infoactionr   s       r   get_related_urlz)RelatedFieldWidgetWrapper.get_related_url"  s3    y 01,
 
 
 	
r   c                    ddl m}m} | j        j        j        }|j        |j        f}| j        | j	        _        | j        
                                j        }d                    d ||f|dffD                       }	| j	                            |||          | j        ||	|j        | j        | j        | j        | j        | j        j        d
}
| j        r|                     |d          |
d<   | j        r|                     |d	d
          |
d<   | j        s| j        r$| d| |
d<   |                     |dd
          |
d<   |
S )Nr   )IS_POPUP_VARr   &c              3       K   | ]	}d |z  V  
dS )z%s=%sNr   )rf   params     r   rh   z8RelatedFieldWidgetWrapper.get_context.<locals>.<genexpr>0  s:       
 
 eO
 
 
 
 
 
r      )
rendered_widgetr   r0   
url_paramsr   r   r   r   r   model_has_limit_choices_toaddadd_related_urldelete__fk__delete_related_template_url=view_related_url_paramschangechange_related_template_url)r   r   r   rz   r   r   r   r   r%   r)   r   r0   rp   renderr   r   r   r   r   r   r   r   )r#   r0   r1   r$   r   r   rel_optsr   related_field_namer   r2   s              r   r-   z%RelatedFieldWidgetWrapper.get_context)  s   NNNNNNNN8>'"H$78"l!X7799>XX 
 
 12q!
 
 
 
 

  ${11$uEE$*#3"&"9"&"9 $ 5*.(*C
 
  	K)-)=)=dE)J)JG%&" 	595I5Ih6 6G12   	D$; 	4@1W1WCU1W1WG-.595I5Ih6 6G12 r   c                 :    | j                             |||          S r   )r)   r   r#   r   r   r0   s       r   r   z-RelatedFieldWidgetWrapper.value_from_datadictP  s    {..tUDAAAr   c                 :    | j                             |||          S r   )r)   value_omitted_from_datar   s       r   r   z1RelatedFieldWidgetWrapper.value_omitted_from_dataS  s    {224EEEr   c                 6    | j                             |          S r   )r)   id_for_label)r#   id_s     r   r   z&RelatedFieldWidgetWrapper.id_for_labelV  s    {'',,,r   )NFFF)r   r   r   r3   rY   r"   r   propertyr   r   r   r-   r   r   r   r   r   r   r   r      s         
 @M   % % % %<   % % X% ! ! X!
 
 
% % %NB B BF F F- - - - -r   r   c                         e Zd Zd fd	Z xZS )AdminTextareaWidgetNc                 X    t                                          ddi|pi            d S )Nr*   vLargeTextFieldr$   rD   r#   r$   r&   s     r   r"   zAdminTextareaWidget.__init__[  s3    ):Lu{LMMMMMr   r   r   r   r   r"   r4   r5   s   @r   r   r   Z  sG        N N N N N N N N N Nr   r   c                         e Zd Zd fd	Z xZS )AdminTextInputWidgetNc                 X    t                                          ddi|pi            d S Nr*   
vTextFieldr   rD   r   s     r   r"   zAdminTextInputWidget.__init__`  2    G%+2GHHHHHr   r   r   r5   s   @r   r   r   _  G        I I I I I I I I I Ir   r   c                         e Zd Zd fd	Z xZS )AdminEmailInputWidgetNc                 X    t                                          ddi|pi            d S r   rD   r   s     r   r"   zAdminEmailInputWidget.__init__e  r   r   r   r   r5   s   @r   r  r  d  r  r   r  c                   2     e Zd ZdZdef fd	Z fdZ xZS )AdminURLFieldWidgetzadmin/widgets/url.htmlNc                 v    t                                          ddi|pi             |            | _        d S )Nr*   	vURLFieldr   )r!   r"   	validator)r#   r$   validator_classr&   s      r   r"   zAdminURLFieldWidget.__init__l  s?    F"FGGG(**r   c                 N   	 |                      |r|nd           d}n# t          $ r d}Y nw xY wt                                          |||          }t	          d          |d<   t	          d          |d<   |rt          |d         d	                   nd|d         d
<   ||d<   |S )Nr   TFz
Currently:current_labelzChange:change_labelr)   r1   href	url_valid)r	  r   r!   r-   rX   r   )r#   r0   r1   r$   r  r2   r&   s         r   r-   zAdminURLFieldWidget.get_contextp  s    	NNE155r222II 	 	 	III	''%%dE599#$\?? "#I,,:?GN78,W5666R 	&!  )s    ..)r   r   r   rY   r   r"   r-   r4   r5   s   @r   r  r  i  s`        ,M!< + + + + + +        r   r  c                   $     e Zd ZdZd fd	Z xZS )AdminIntegerFieldWidgetvIntegerFieldNc                 b    t                                          d| j        i|pi            d S )Nr*   r   )r!   r"   
class_namer   s     r   r"   z AdminIntegerFieldWidget.__init__  s4    JU[bJKKKKKr   r   )r   r   r   r  r"   r4   r5   s   @r   r  r    sL         JL L L L L L L L L Lr   r  c                       e Zd ZdZdS )AdminBigIntegerFieldWidgetvBigIntegerFieldN)r   r   r   r  r   r   r   r  r    s        #JJJr   r  c                         e Zd Zd fd	Z xZS )AdminUUIDInputWidgetNc                 X    t                                          ddi|pi            d S )Nr*   
vUUIDFieldr   rD   r   s     r   r"   zAdminUUIDInputWidget.__init__  r   r   r   r   r5   s   @r   r  r    r  r   r  c                 8    i | ]}|                                 |S r   )r   re   s     r   
<dictcomp>r    s2     1 1 1	 GGIIq1 1 1r   )-arazbgcacsdadeeleneseteufafifrglhehihrhur   isitjakmkoltlvmkmsnbnlplzpt-BRptroruskzsr-Cyrlsrsvthtrukvizzh-CNzzh-TW)zzh-hanszzh-hantc                  "   t                      } t                              |           }|d| bd }|                     dd|          x}dk    rCt                              | d |                   x}r|S |                     dd|          x}dk    C|S )N-r   )r   SELECT2_TRANSLATIONSr   rfind)	lang_codesupported_codeis      r   get_select2_languagerP    s    I)--i88N)"7 OOCA...q"44!5!9!9)BQB-!H!HH~ &%% OOCA...q"44 r   c                   T     e Zd ZdZdZd
dZd Zd fd	ZddZe	d	             Z
 xZS )AutocompleteMixinz
    Select widget mixin that loads options from AutocompleteJsonView via AJAX.

    Renders the necessary data attributes for select2 and adds the static form
    media.
    z%s:autocompleteNr   c                     || _         || _        || _        || _        |i n|                                | _        t                      | _        d S r   )fieldr{   r|   r%   r   r$   rP  	i18n_name)r#   rT  r{   r$   r%   r}   s         r   r"   zAutocompleteMixin.__init__  sF    
$ =RRejjll
-//r   c                 D    t          | j        | j        j        z            S r   )r	   url_namer{   r0   r   s    r   get_urlzAutocompleteMixin.get_url  s    t}t';;<<<r   c                    t                                          ||          }|                    dd           |                    ddd|                                 | j        j        j        j        | j        j        j        j	        | j        j
        dt          j        | j                   d| j        |d         |d         rdndz   dz   d	           |S )
z
        Set select2's AJAX attributes.

        Attributes can be set using the html5 data attribute.
        Nested attributes require a double dash as per
        https://select2.org/configuration/data-attributes#nested-subkey-options
        )extra_attrsr*   r   true   GETzadmin-autocomplete )zdata-ajax--cachezdata-ajax--delayzdata-ajax--typezdata-ajax--urlzdata-app-labelzdata-model-namer,   z
data-themezdata-allow-clearzdata-placeholderlangr*   )r!   build_attrsr   r   rX  rT  r   r   r   r   r0   jsondumpsis_requiredrU  )r#   
base_attrsrZ  r$   r&   s       r   r`  zAutocompleteMixin.build_attrs  s     ##JK#HH"%%%$*$'#("&,,.."&*"2"8"B#':#3#9#D#':?2$(J43C/C$D$D$&w.033b2&' 	
 	
 	
$ r   c           
          dg df}|g}d} fd|D             } j         s9 j        s2|d                                                  |dddd                      j        j        j        j        }t           j        j        d|j	        j
                  |                              j
         fd  j        j                             j                  j        d
i d	z  |iD             }	|	D ]o\  }
}t#          |
          |v o
|du p j        }||z  }t%          |d                   }|d         }|                                         ||
|||                     p|S )z9Return selected options based on the ModelChoiceIterator.Nr   Fc                 n    h | ]1}t          |          j        j        j        v"t          |          2S r   )rd   r%   rT  empty_values)rf   ru   r#   s     r   	<setcomp>z.AutocompleteMixin.optgroups.<locals>.<setcomp>  s>     
 
 
SVV4<3E3R%R%RCFF%R%R%Rr   r   r   
field_namec              3   v   K   | ]3}t          |          j        j                            |          fV  4d S r   )r   r%   rT  label_from_instance)rf   r   r#   to_field_names     r   rh   z.AutocompleteMixin.optgroups.<locals>.<genexpr>  sZ       
 
 S-(($,*<*P*PQT*U*UV
 
 
 
 
 
r   z%s__inr   )rc  r   appendcreate_optionrT  remote_fieldr   r   r   r   attname	get_fieldr%   querysetr}   r|   filterrd   len)r#   r0   r1   attrdefaultgroupshas_selectedselected_choicesremote_model_optsr%   option_valueoption_labelselectedindexsubgrouprl  s   `              @r   	optgroupszAutocompleteMixin.optgroups  s   Q-
 
 
 
!
 
 
  	J(D 	JAJd00r2uaHHIII J39?J#\3D3G3O
 
 *33MBBJ
 
 
 
 
Bt|,2247;;B  m+-=> 
 
 
 +2 	 	&L,<((E1 %E)E  H$L
OOEqzHOO"",6F    
 r   c                     t           j        rdnd}| j        rd| j        z  fnd}t          j        d|z  d|z  f|z   dz   dd	|z  d
fi          S )Nr   z.minz"admin/js/vendor/select2/i18n/%s.jsr   z"admin/js/vendor/jquery/jquery%s.jsz)admin/js/vendor/select2/select2.full%s.js)zadmin/js/jquery.init.jszadmin/js/autocomplete.jsscreenz&admin/css/vendor/select2/select2%s.csszadmin/css/autocomplete.css)r   css)r   DEBUGrU  r   r   )r#   extra	i18n_files      r   r   zAutocompleteMixin.media+  s    n0& ~1DNBDD 	
 {4u<;eC 	
 <uD0
 
 
 	
r   )Nr   Nr   )r   r   r   r3   rW  r"   rX  r`  r  r   r   r4   r5   s   @r   rR  rR    s          !H0 0 0 0= = =     <! ! ! !F 
 
 X
 
 
 
 
r   rR  c                       e Zd ZdS )AutocompleteSelectNr   r   r   r   r   r   r  r  F          Dr   r  c                       e Zd ZdS )AutocompleteSelectMultipleNr  r   r   r   r  r  J  r  r   r  )@r3   r   ra  djangor   django.confr   django.core.exceptionsr   django.core.validatorsr   django.db.modelsr   r   django.urlsr	   django.urls.exceptionsr
   django.utils.htmlr   django.utils.httpr   django.utils.textr   django.utils.translationr   r   rX   SelectMultipler   	DateInputr7   	TimeInputrJ   SplitDateTimeWidgetrQ   RadioSelectr[   ClearableFileInputr^   rv   	TextInputrx   r   Widgetr   Textarear   r   
EmailInputr  URLInputr  NumberInputr  r  r  rK  r   rP  rR  Selectr  r  r   r   r   <module>r     s                        2 2 2 2 2 2 / / / / / / / / / / / / / /       1 1 1 1 1 1 , , , , , , ' ' ' ' ' ' ' ' ' ' ' ' 1 1 1 1 1 1 1 1 1 1 1 1    U1   <	5 	5 	5 	5 	5eo 	5 	5 	5	5 	5 	5 	5 	5eo 	5 	5 	5    2   (/ / / / /u( / / /> > > > >e. > > >  (Q- Q- Q- Q- Q-EO Q- Q- Q-h@ @ @ @ @1 @ @ @<j- j- j- j- j- j- j- j-ZN N N N N%. N N N
I I I I I5? I I I
I I I I IE, I I I
    %.   .L L L L Le/ L L L$ $ $ $ $!8 $ $ $I I I I I5? I I I1 1.1 1 1 d   GDD E E E
 
 
n
 n
 n
 n
 n
 n
 n
 n
b	 	 	 	 	*EL 	 	 		 	 	 	 	!2E4H 	 	 	 	 	r   