
    dQ                        d dl m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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+ d,e      Z G d- d.e      Z  G d/ d0e      Z! G d1 d2e      Z"y)3   )ELFCompressionError)struct_parse
elf_assertparse_cstring_from_stream    )defaultdict   )SH_FLAGS)
iter_notesNc                   d    e Zd ZdZd Zed        Zed        Zed        Zd Z	d Z
d Zd	 Zd
 Zy)Sectiona   Base class for ELF sections. Also used for all sections types that have
        no special functionality.

        Allows dictionary-like access to the section header. For example:
         > sec = Section(...)
         > sec['sh_type']  # section type
    c                    || _         || _        || _        | j                  j                  | _        | j                  j                  | _        |d   t
        j                  z  | _        | j                  rNt        | j                  j                  | j                  | d         }|d   | _        |d   | _        |d   | _        y |d   | _        |d   | _        y )	Nsh_flags	sh_offset
stream_posch_typech_sizech_addralignsh_sizesh_addralign)headernameelffilestreamstructsr
   SHF_COMPRESSED_compressed
compressedr   Elf_Chdr_compression_type_decompressed_size_decompressed_align)selfr   r   r   s       7/usr/lib/python3/dist-packages/elftools/elf/sections.py__init__zSection.__init__   s    	ll))||++!*-0G0GG?? "$,,"7"7"&++-1+->@F &,I%6D"&,Y&7D#'-n'=D$&,Y&7D#'-n'=D$    c                     | j                   S )z% Is this section compressed?
        )r   r$   s    r%   r   zSection.compressed/   s     r'   c                     | j                   S )z Return the logical size for this section's data.

        This can be different from the .sh_size header field when the section
        is compressed.
        )r"   r)   s    r%   	data_sizezSection.data_size5   s     &&&r'   c                     | j                   S )z Return the logical alignment for this section's data.

        This can be different from the .sh_addralign header field when the
        section is compressed.
        )r#   r)   s    r%   data_alignmentzSection.data_alignment>   s     '''r'   c                    | j                   d   dk(  rd| j                  z  S | j                  r
| j                  }|dk(  r| j                  j
                  j                         }| j                  j                  | d   |z          | j                  j                  | d   |z
        }t        j                         }|j                  || j                        }nt        dj                  |            t        |      | j                   k7  r.t        dj                  t        |      | j                               |S | j                  j                  | d          | j                  j                  | j                         }|S )	z The section data from the file.

        Note that data is decompressed if the stored section data is
        compressed.
        sh_type
SHT_NOBITS    ELFCOMPRESS_ZLIBr   r   z Unknown compression type: {:#0x}z;Decompressed data is {} bytes long, should be {} bytes long)r   r+   r   r!   r   r    sizeofr   seekreadzlibdecompressobj
decompressr   formatlenr"   )r$   c_typehdr_sizer   decompresults         r%   datazSection.dataG   sN    ;;y!\1'' ??++F++  <<00779  k!2X!=>![[--d9o.HI
++-**:t~~F)6==fE  6{d555)"F3v;0G0GH   KKT+./[[%%d&=&=>Fr'   c                      y)z! Is this a null section?
        F r)   s    r%   is_nullzSection.is_nullm   s     r'   c                      | j                   |   S )z6 Implement dict-like access to header entries
        r   r$   r   s     r%   __getitem__zSection.__getitem__r        {{4  r'   c                 T    	 | j                   |j                   k(  S # t        $ r Y yw xY w)NF)r   AttributeError)r$   others     r%   __eq__zSection.__eq__w   s,    	;;%,,.. 		s    	''c                 ,    t        | j                        S N)hashr   r)   s    r%   __hash__zSection.__hash__}   s    DKK  r'   N)__name__
__module____qualname____doc__r&   propertyr   r+   r-   r?   rB   rF   rK   rO   rA   r'   r%   r   r      sb    >*    
 ' ' ( ($L
!
!r'   r   c                       e Zd ZdZd Zy)NullSectionz ELF NULL section
    c                      y)NTrA   r)   s    r%   rB   zNullSection.is_null   s    r'   N)rP   rQ   rR   rS   rB   rA   r'   r%   rV   rV      s    r'   rV   c                       e Zd ZdZd Zy)StringTableSectionz ELF string table section.
    c                 l    | d   }t        | j                  ||z         }|r|j                  dd      S dS )zI Get the string stored at the given offset in this string table.
        r   utf-8replace)errors )r   r   decode)r$   offsettable_offsetss       r%   
get_stringzStringTableSection.get_string   s=     K(%dkk<&3HI67qxx	x2?R?r'   N)rP   rQ   rR   rS   rc   rA   r'   r%   rY   rY      s    @r'   rY   c                   (     e Zd ZdZ fdZd Z xZS )SymbolTableIndexSectionas   A section containing the section header table indices corresponding
        to symbols in the linked symbol table. This section has to exist if the
        symbol table contains an entry with a section header index set to
        SHN_XINDEX (0xffff). The format of the section is described at
        https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.sheader.html
    c                 >    t         t        |   |||       || _        y rM   )superre   r&   symboltabler$   r   r   r   rh   	__class__s        r%   r&   z SymbolTableIndexSection.__init__       %t5fdGL&r'   c                     t        | j                  j                  j                  d      | j                  | d   || d   z  z         S )z Get the section header table index for the symbol with index #n.
            The section contains an array of Elf32_word values with one entry
            for every symbol in the associated symbol table.
        r^   r   
sh_entsize)r   r   r   Elf_wordr   )r$   ns     r%   get_section_indexz)SymbolTableIndexSection.get_section_index   sG    
 DLL0099"=t{{ -D4F0FFH 	Hr'   )rP   rQ   rR   rS   r&   rp   __classcell__rj   s   @r%   re   re      s    'Hr'   re   c                   :     e Zd ZdZ fdZd Zd Zd Zd Z xZ	S )SymbolTableSectionzn ELF symbol table section. Has an associated StringTableSection that's
        passed in the constructor.
    c                     t         t        |   |||       || _        t	        | d   dkD  d|z         t	        | d   | d   z  dk(  d|z         d | _        y )Nrm   r   z+Expected entry size of section %r to be > 0r   zBExpected section size to be a multiple of entry size in section %r)rg   rt   r&   stringtabler   _symbol_name_map)r$   r   r   r   rv   rj   s        r%   r&   zSymbolTableSection.__init__   sk     $0wG&4%)=D	F4	?T,%771<TW[[	] $r'   c                     | d   | d   z  S )( Number of symbols in the table
        r   rm   rA   r)   s    r%   num_symbolszSymbolTableSection.num_symbols   s     I$|"444r'   c                     | d   || d   z  z   }t        | j                  j                  | j                  |      }| j                  j                  |d         }t        ||      S )zC Get the symbol at index #n from the table (Symbol object)
        r   rm   r   st_name)r   r   Elf_Symr   rv   rc   Symbolr$   ro   entry_offsetentryr   s        r%   
get_symbolzSymbolTableSection.get_symbol   sh     K(1tL/A+AALL  KK#%
 **5+;<eT""r'   c                 Z   | j                   ]t        t              | _         t        | j	                               D ]-  \  }}| j                   |j
                     j                  |       / | j                   j                  |      }|r|D cg c]  }| j                  |       c}S dS c c}w )za Get a symbol(s) by name. Return None if no symbol by the given name
            exists.
        N)	rw   r   list	enumerateiter_symbolsr   appendgetr   )r$   r   isymsymnumss        r%   get_symbol_by_namez%SymbolTableSection.get_symbol_by_name   s       ($/$5D!#D$5$5$78 :3%%chh/66q9:''++D18?G4q"4ITI4s   B(c              #   n   K   t        | j                               D ]  }| j                  |        yw), Yield all the symbols in the table
        Nrangerz   r   r$   r   s     r%   r   zSymbolTableSection.iter_symbols   s4      t'')* 	%A//!$$	%s   35)
rP   rQ   rR   rS   r&   rz   r   r   r   rq   rr   s   @r%   rt   rt      s"    %5
#J%r'   rt   c                       e Zd ZdZd Zd Zy)r~   z Symbol object - representing a single symbol entry from a symbol table
        section.

        Similarly to Section objects, allows dictionary-like access to the
        symbol entry.
    c                      || _         || _        y rM   )r   r   )r$   r   r   s      r%   r&   zSymbol.__init__   s    
	r'   c                      | j                   |   S )z/ Implement dict-like access to entries
        )r   rE   s     r%   rF   zSymbol.__getitem__   s     zz$r'   N)rP   rQ   rR   rS   r&   rF   rA   r'   r%   r~   r~      s     r'   r~   c                   4     e Zd ZdZ fdZd Zd Zd Z xZS )SUNWSyminfoTableSectionzu ELF .SUNW Syminfo table section.
        Has an associated SymbolTableSection that's passed in the constructor.
    c                 >    t         t        |   |||       || _        y rM   )rg   r   r&   rh   ri   s        r%   r&   z SUNWSyminfoTableSection.__init__   rk   r'   c                     | d   | d   z  dz
  S )ry   r   rm   r	   rA   r)   s    r%   rz   z#SUNWSyminfoTableSection.num_symbols   s     I$|"44q88r'   c                     | d   || d   z  z   }t        | j                  j                  | j                  |      }| j                  j                  |      j                  }t        ||      S )z Get the symbol at index #n from the table (Symbol object).
            It begins at 1 and not 0 since the first entry is used to
            store the current version of the syminfo table.
        r   rm   r   )r   r   Elf_Sunw_Syminfor   rh   r   r   r~   r   s        r%   r   z"SUNWSyminfoTableSection.get_symbol   si     K(1tL/A+AALL))KK#%
 **1-22eT""r'   c              #   v   K   t        d| j                         dz         D ]  }| j                  |        yw)r   r	   Nr   r   s     r%   r   z$SUNWSyminfoTableSection.iter_symbols  s;      q$**,q01 	%A//!$$	%s   79)	rP   rQ   rR   rS   r&   rz   r   r   rq   rr   s   @r%   r   r      s    '9
#%r'   r   c                       e Zd ZdZd Zy)NoteSectionz1 ELF NOTE section. Knows how to parse notes.
    c                 <    t        | j                  | d   | d         S )z Yield all the notes in the section.  Each result is a dictionary-
            like object with "n_name", "n_type", and "n_desc" fields, amongst
            others.
        r   r   )r   r   r)   s    r%   r   zNoteSection.iter_notes  s     
 $,,[(94	?KKr'   N)rP   rQ   rR   rS   r   rA   r'   r%   r   r     s    Lr'   r   c                       e Zd ZdZd Zy)StabSectionz ELF stab section.
    c              #   0  K   | d   }| d   }||z   }||k  r~t        | j                  j                  | j                  |      }||d<   || j                  j                  j	                         z  }| j                  j                  |       | ||k  r}yyw)zG Yield all stab entries.  Result type is ELFStructs.Elf_Stabs.
        r   r   r   n_offsetN)r   r   	Elf_Stabsr   r3   r4   )r$   r`   sizeendstabss        r%   
iter_stabszStabSection.iter_stabs  s      k"Itmsl &&!#E !'E*dll,,3355FKKV$K sls   BBBN)rP   rQ   rR   rS   r   rA   r'   r%   r   r     s    r'   r   c                   ,    e Zd ZdZd Zed        Zd Zy)	AttributezE Attribute object - representing a build attribute of ELF files.
    c                      || _         d | _        y rM   )_tagextra)r$   tags     r%   r&   zAttribute.__init__0  s    	
r'   c                      | j                   d   S )Nr   )r   r)   s    r%   r   zAttribute.tag4  s    yyr'   c                     d| j                   j                  d| j                  d| j                  d}|| j                  d| j                  z  z  }|S dz  }|S )N<z (z): >z %sr^   )rj   rP   r   valuer   r$   rb   s     r%   __repr__zAttribute.__repr__8  sT    ^^$$dhh

<	4::#9UTZZA @BAr'   N)rP   rQ   rR   rS   r&   rT   r   r   rA   r'   r%   r   r   -  s%        r'   r   c                   J    e Zd ZdZd Zd	dZed        Zed        Zd Z	d Z
y)
AttributesSubsubsectionz= Subsubsection of an ELF attribute section's subsection.
    c                     || _         || _        || _        || _        | j                  | j                  | j                         | _        | j                   j                         | _        y rM   )r   r`   r   	attributer   tell
attr_start)r$   r   r   r`   r   s        r%   r&   z AttributesSubsubsection.__init__B  sL    "nnT\\4;;?++**,r'   Nc              #   b   K   | j                         D ]  }||j                  |k(  s|  yw)z= Yield all attributes (limit to |tag| if specified).
        N)_make_attributesr   )r$   r   r   s      r%   iter_attributesz'AttributesSubsubsection.iter_attributesL  s5      ..0 	 I{imms2	 s   %//c                 H    t        d | j                         D              dz   S )z4 Number of attributes in the subsubsection.
        c              3       K   | ]  }d   ywr	   NrA   .0_s     r%   	<genexpr>z9AttributesSubsubsection.num_attributes.<locals>.<genexpr>W  s     515   r	   )sumr   r)   s    r%   num_attributesz&AttributesSubsubsection.num_attributesS  s#     5d2245599r'   c                 P    | j                   gt        | j                               z   S )z6 List of all attributes in the subsubsection.
        )r   r   r   r)   s    r%   
attributesz"AttributesSubsubsection.attributesY  s#     }tD$8$8$:;;;r'   c              #   d  K   | j                   | j                  j                  z   }| j                  j	                  | j
                         | j                  j                         |k7  rG| j                  | j                  | j                         | j                  j                         |k7  rFyyw)zl Create all attributes for this subsubsection except the first one
            which is the header.
        N)	r`   r   r   r   r4   r   r   r   r   )r$   r   s     r%   r   z(AttributesSubsubsection._make_attributes_  s{      kkDKK---)kk C'..t{{;; kk C's   B+B0.B0c                     d}|| j                   j                  | j                  j                  dd  | j                  j                  fz  S )N<%s (%s): %d bytes>   )rj   rP   r   r   r   r   s     r%   r   z AttributesSubsubsection.__repr__j  sC    !DNN++KKOOAB'):):< < 	<r'   rM   )rP   rQ   rR   rS   r&   r   rT   r   r   r   r   rA   r'   r%   r   r   ?  sC    -  : :
 < <
	<<r'   r   c                   P    e Zd ZdZd Zd
dZed        Zed        Zd Z	d Z
d	 Zy)AttributesSubsectionz. Subsection of an ELF attributes section.
    c                     || _         || _        || _        || _        t	        || j                   | j                        | _        | j                   j                         | _        y rM   )r   r`   r   subsubsectionr   r   r   subsubsec_start)r$   r   r   r`   r   r   s         r%   r&   zAttributesSubsection.__init__s  sL    *"64;;D#{{//1r'   Nc              #   v   K   | j                         D ]"  }||j                  j                  |k(  s| $ yw)zC Yield all subsubsections (limit to |scope| if specified).
        N)_make_subsubsectionsr   r   )r$   scope	subsubsecs      r%   iter_subsubsectionsz(AttributesSubsection.iter_subsubsections}  s=      224 	 I}	 0 0 4 4 =	 s   /99c                 B    t        d | j                         D              S )z5 Number of subsubsections in the subsection.
        c              3       K   | ]  }d   ywr   rA   r   s     r%   r   z:AttributesSubsection.num_subsubsections.<locals>.<genexpr>  s     919r   )r   r   r)   s    r%   num_subsubsectionsz'AttributesSubsection.num_subsubsections  s     9d668999r'   c                 4    t        | j                               S )z7 List of all subsubsections in the subsection.
        )r   r   r)   s    r%   subsubsectionsz#AttributesSubsection.subsubsections  s     D,,.//r'   c              #     K   | j                   | d   z   }| j                  j                  | j                         | j                  j	                         |k7  r| j                  | j                  | j                  | j                  j	                               }| j                  j                  | j                  |j                  j                  z          | | j                  j	                         |k7  ryyw)z8 Create all subsubsections for this subsection.
        lengthN)	r`   r   r4   r   r   r   r   r   r   )r$   r   r   s      r%   r   z)AttributesSubsection._make_subsubsections  s      kkDN*--.kk C'**4;;+/<<+/;;+;+;+=?I KKT11I4D4D4J4JJKO kk C's   C1C64C6c                      | j                   |   S )z7 Implement dict-like access to header entries.
        rD   rE   s     r%   rF   z AttributesSubsection.__getitem__  rG   r'   c                 r    d}|| j                   j                  | j                  d   | j                  d   fz  S )Nr   vendor_namer   )rj   rP   r   r   s     r%   r   zAttributesSubsection.__repr__  s?    !T^^,,[[/X1FH H 	Hr'   rM   )rP   rQ   rR   rS   r&   r   rT   r   r   r   rF   r   rA   r'   r%   r   r   p  sI    2  : :
 0 0
!
Hr'   r   c                   P     e Zd ZdZ fdZddZed        Zed        Zd Z	 xZ
S )AttributesSectionz ELF attributes section.
    c                 *   t         t        |   |||       || _        t	        | j
                  j                  d      | j                  | d         }t        t        |      dk(  dt        |      z         | j                  j                         | _        y )Nformat_versionr   Az-Unknown attributes version %s, expecting 'A'.)rg   r   r&   
subsectionr   r   Elf_byter   r   chrr   subsec_start)r$   r   r   r   r   fvrj   s         r%   r&   zAttributesSection.__init__  s    /gF$$,,//0@A++{+- 	3r7c>BSWL	N !KK,,.r'   c              #   T   K   | j                         D ]  }|	|d   |k(  s|  yw)zF Yield all subsections (limit to |vendor_name| if specified).
        Nr   )_make_subsections)r$   r   subsecs      r%   iter_subsectionsz"AttributesSection.iter_subsections  s7      ,,. 	F"f]&;{&J	s   ((c                 B    t        d | j                         D              S )z/ Number of subsections in the section.
        c              3       K   | ]  }d   ywr   rA   r   s     r%   r   z4AttributesSection.num_subsections.<locals>.<genexpr>  s     616r   )r   r   r)   s    r%   num_subsectionsz!AttributesSection.num_subsections  s     6d335666r'   c                 4    t        | j                               S )z1 List of all subsections in the section.
        )r   r   r)   s    r%   subsectionszAttributesSection.subsections  s     D))+,,r'   c              #     K   | d   | j                   z   }| j                  j                  | j                         | j                  j	                         |k7  r| j                  | j                  | j                  | j                  j	                               }| j                  j                  | j                  |d   z          | | j                  j	                         |k7  ryyw)z2 Create all subsections for this section.
        r   r   N)r+   r   r4   r   r   r   r   )r$   r   r   s      r%   r   z#AttributesSection._make_subsections  s      ;$..0**+kk C'__T[[%)\\%)[[%5%5%79F KKT..1AABL kk C's   C C%#C%rM   )rP   rQ   rR   rS   r&   r   rT   r   r   r   rq   rr   s   @r%   r   r     s?    / 7 7
 - -
r'   r   c                   "     e Zd ZdZ fdZ xZS )ARMAttributezM ARM attribute object - representing a build attribute of ARM ELF files.
    c                    t         t        |   t        |j                  |             | j
                  dv rt        |j                  d      |      | _        | j
                  dk7  reg | _        t        |j                  d      |      }|dk7  r=| j                  j                  |       t        |j                  d      |      }|dk7  r<y y y | j
                  dv r#t        |j                  dd      |      | _        y | j
                  d	k(  rCt        |j                  d      |      | _        t        |j                  d
d      |      | _        y | j
                  dk(  ret        ||      | _        t        | j                  j                        t        ur.t        |j                  d      |      }t        |dk(  d|z         y y t        |j                  d      |      | _        y )NTAG_FILETAG_SECTION
TAG_SYMBOLr   r   s_numberr   )TAG_CPU_RAW_NAMETAG_CPU_NAMETAG_CONFORMANCEr[   encodingTAG_COMPATIBILITYr   TAG_ALSO_COMPATIBLE_WITHnulz+Invalid terminating byte %r, expecting NUL.)rg   r   r&   r   Elf_Arm_Attribute_Tagr   rn   r   r   Elf_uleb128r   Elf_ntbstypestrr   r   )r$   r   r   r   r  rj   s        r%   r&   zARMAttribute.__init__  s   lD*66?	A 88@@%g&6&6w&?HDJxx:%
'(;(;J(GP!mJJ%%h/+G,?,?
,K,2 4H !m	 & XXPP%g&6&6w@G '7 'I&,.DJ XX,,%g&9&9'&BFKDJ%g&6&6}@G '7 'I&,.DJ XX33%gv6DJDJJ$$%S0"7#3#3E#:FC3!8H3NP 1 &g&9&9'&BFKDJr'   rP   rQ   rR   rS   r&   rq   rr   s   @r%   r   r     s    $L $Lr'   r   c                   "     e Zd ZdZ fdZ xZS )ARMAttributesSubsubsectionzC Subsubsection of an ELF .ARM.attributes section's subsection.
    c                 :    t         t        |   |||t               y rM   )rg   r  r&   r   r$   r   r   r`   rj   s       r%   r&   z#ARMAttributesSubsubsection.__init__  s    ($8GV\	3r'   r  rr   s   @r%   r  r    s    3 3r'   r  c                   "     e Zd ZdZ fdZ xZS )ARMAttributesSubsectionz3 Subsection of an ELF .ARM.attributes section.
    c                 P    t         t        |   ||||j                  t               y rM   )rg   r  r&   Elf_Attr_Subsection_Headerr  r  s       r%   r&   z ARMAttributesSubsection.__init__  s&    %t5GV..&	(r'   r  rr   s   @r%   r  r    s    ( (r'   r  c                   "     e Zd ZdZ fdZ xZS )ARMAttributesSectionz" ELF .ARM.attributes section.
    c                 :    t         t        |   |||t               y rM   )rg   r  r&   r  r$   r   r   r   rj   s       r%   r&   zARMAttributesSection.__init__  s    "D2D'#:	<r'   r  rr   s   @r%   r  r    s    < <r'   r  c                   "     e Zd ZdZ fdZ xZS )RISCVAttributez4 Attribute of an ELF .riscv.attributes section.
    c                 >   t         t        |   t        |j                  |             | j
                  dv rt        |j                  d      |      | _        | j
                  dk7  reg | _        t        |j                  d      |      }|dk7  r=| j                  j                  |       t        |j                  d      |      }|dk7  r<y y y | j
                  dk(  r#t        |j                  dd      |      | _        y t        |j                  d      |      | _        y )	Nr   r   r   r   r   TAG_ARCHr[   r  )rg   r  r&   r   Elf_RiscV_Attribute_Tagr   rn   r   r   r  r   r  )r$   r   r   r   rj   s       r%   r&   zRISCVAttribute.__init__"  s   nd,88&A	C 88@@%g&6&6w&?HDJxx:%
'(;(;J(GP!mJJ%%h/+G,?,?
,K,2 4H !m	 & XX#%g&6&6w@G '7 'I&,.DJ
 &g&9&9'&BFKDJr'   r  rr   s   @r%   r  r    s    L Lr'   r  c                   "     e Zd ZdZ fdZ xZS )RISCVAttributesSubsubsectionz; Subsubsection of an ELF .riscv.attributes subsection.
    c                 :    t         t        |   |||t               y rM   )rg   r  r&   r  r  s       r%   r&   z%RISCVAttributesSubsubsection.__init__>  s    *D:GV^	5r'   r  rr   s   @r%   r  r  ;  s    5 5r'   r  c                   "     e Zd ZdZ fdZ xZS )RISCVAttributesSubsectionz5 Subsection of an ELF .riscv.attributes section.
    c                 P    t         t        |   ||||j                  t               y rM   )rg   r!  r&   r  r  r  s       r%   r&   z"RISCVAttributesSubsection.__init__F  s&    '7GV..(	*r'   r  rr   s   @r%   r!  r!  C  s    * *r'   r!  c                   "     e Zd ZdZ fdZ xZS )RISCVAttributesSectionz$ ELF .riscv.attributes section.
    c                 :    t         t        |   |||t               y rM   )rg   r$  r&   r!  r  s       r%   r&   zRISCVAttributesSection.__init__P  s    $d4D'#<	>r'   r  rr   s   @r%   r$  r$  M  s    > >r'   r$  )#common.exceptionsr   common.utilsr   r   r   collectionsr   	constantsr
   notesr   r6   objectr   rV   rY   re   rt   r~   r   r   r   r   r   r   r   r   r  r  r  r  r  r!  r$  rA   r'   r%   <module>r,     s3   4 N N #   l!f l!^' @ @Hg H(1% 1%h V  " %g  %FL' L' & $.<g .<b6H7 6Hr/ /d'L9 'LT3!8 3(2 (<, <LY L85#: 5* 4 *>. >r'   