Ë
    ÑÕ¯iQ7  ã                   ó´  — d Z dZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZ 	 ddlZ	 ddlZ	 ddlmZ 	 dd	lmZ dZg d¢Zg d¢Zg d¢Zg d¢Zed„ dœej@                  d„ dœgZ!ejD                  re!jG                  e$d„ dœ«       ne!jG                  e%d„ dœ«       e&d„ dœZ' G d„ de(«      Z) G d„ de&«      Z*d„ Z+d„ Z,d„ Z-d„ Z.d„ Z/d&d„Z0d „ Z1d'd!„Z2d"„ Z3d#„ Z4d(d$„Z5d)d%„Z6y# e$ r dZY ŒÀw xY w# e$ r 	 ddlZn# e$ r dZY nw xY wY ŒÙw xY w# e$ r 	 ddlmZ d„ Zn# e$ r dZY nw xY wY Œõw xY w# e$ r 	 ddlZn# e$ r	 dd
lmZ Y nw xY wY �Œw xY w)*zUtilities for pyActiveResource.zMark Roach (mrroach@google.com)é    N)Úurllib)Úelement_containers)Úparse)Úiso8601c                 óf   — t         j                   j                  t        j                  | «      «      S )zÊReturn a datetime object for the given ISO8601 string.

            Args:
                time_string: An ISO8601 timestamp.
            Returns:
                A datetime.datetime object.
            )ÚdatetimeÚutcfromtimestampr   r   )Útime_strings    úH/var/www/html/venv/lib/python3.12/site-packages/pyactiveresource/util.pyÚ
date_parser   "   s)   € ô ×$Ñ$×5Ñ5Ü—M‘M +Ó.ó0ð 0ó    )ÚcElementTree)ÚElementTrees'   <?xml version="1.0" encoding="UTF-8"?>
))z(quiz)$z\1zes)z^(ox)$z\1en)z([m|l])ouse$z\1ice)z(matr|vert|ind)(?:ix|ex)$z\1ices)z(x|ch|ss|sh)$ú\1es)z([^aeiouy]|qu)y$z\1ies)z(hive)$Ú1s)z(?:([^f])fe|([lr])f)$z\1\2ves)zsis$Úses)z	([ti])um$z\1a)z(buffal|tomat)o$z\1oes)z(bu)s$z\1ses)z(alias|status)$r   )z(octop|vir)us$z\1i)z(ax|test)is$r   )ús$Ús)Ú$r   ))z
(quiz)zes$ú\1)z(matr)ices$z\1ix)z(vert|ind)ices$z\1ex)z^(ox)enr   )z(alias|status)es$r   )z(octop|vir)i$z\1us)z(cris|ax|test)es$z\1is)z(shoe)s$r   )z(o)es$r   )z(bus)es$r   )z([m|l])ice$z\1ouse)z(x|ch|ss|sh)es$r   )z	(m)ovies$z\1ovie)z	(s)eries$z\1eries)z([^aeiouy]|qu)ies$z\1y)z
([lr])ves$z\1f)z(tive)s$r   )z(hive)s$r   )z
([^f])ves$z\1fe)z(^analy)ses$z\1sis)z=((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$z\1\2sis)z([ti])a$z\1um)z(n)ews$z\1ews)r   Ú ))ÚpersonÚpeople)ÚmanÚmen)ÚchildÚchildren)ÚsexÚsexes)ÚmoveÚmoves)Ú	equipmentÚinformationÚriceÚmoneyÚspeciesÚseriesÚfishÚsheepc                 óL   — dt        j                  | «      j                  «       fS )NÚboolean)ÚsixÚ	text_typeÚlower©Úvalues    r   Ú<lambda>r1   z   s   € ˜i¬¯©°uÓ)=×)CÑ)CÓ)EÑFr   )ÚtypeÚmethodc                 ó0   — dt        j                  | «      fS )NÚinteger©r,   r-   r/   s    r   r1   r1   |   s   € ˜i¬¯©°uÓ)=Ñ>r   c                 ó   — d t        | d«      fS )Núutf-8)Úunicoder/   s    r   r1   r1   €   s   €  ¤w¨u°gÓ'>Ñ ?r   c                 óN   — dt        j                  | «      j                  d«      fS )NÚbase64BinaryÚascii)Úbase64Ú	b64encodeÚdecoder/   s    r   r1   r1   „   s    €  ´×1AÑ1AÀ%Ó1H×1OÑ1OÐPWÓ1XÑ Yr   c                 ó0   — d t        j                  | «      fS ©Nr6   r/   s    r   r1   r1   ˆ   s   € ˜T¤3§=¡=°Ó#7Ñ8r   c                   ó   — e Zd ZdZy)ÚErrorz%Base exception class for this module.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   rC   rC   ‹   s   „ Ú/r   rC   c                   ó   — e Zd ZdZ	 	 dd„Zy)Ú
FileObjectzRepresent a 'file' xml entity.c                 ó.   — || _         || _        || _        y rA   )ÚdataÚnameÚcontent_type)ÚselfrL   rM   rN   s       r   Ú__init__zFileObject.__init__’   s   € àˆŒ	ØˆŒ	Ø(ˆÕr   N)Úuntitledúapplication/octet-stream)rD   rE   rF   rG   rP   rH   r   r   rJ   rJ   �   s   „ Ù(à",Ø8ô)r   rJ   c                 óÒ   — | t         v r| S t        D ]  }|d   | k(  sŒ|d   c S  t        D ]:  }t        j                  |d   | «      sŒt        j
                  |d   |d   | «      c S  y)z›Convert singular word to its plural form.

    Args:
        singular: A word in its singular form.

    Returns:
        The word in its plural form.
    r   é   N)ÚUNCOUNTABLESÚ	IRREGULARÚPLURALIZE_PATTERNSÚreÚsearchÚsub)ÚsingularÚis     r   Ú	pluralizer]   ™   si   € ð ”<ÑØˆßˆØˆQ‰4�8ÓØ�Q‘4ŠKð ÷  ˆÜ�9‰9�Q�q‘T˜8Õ$Ü—6‘6˜!˜A™$  !¡ hÓ/Ò/ñ  r   c                 óÔ   — | t         v r| S t        D ]  }|d   | k(  sŒ|d   c S  t        D ]:  }t        j                  |d   | «      sŒt        j
                  |d   |d   | «      c S  | S )z˜Convert plural word to its singular form.

    Args:
        plural: A word in its plural form.
    Returns:
        The word in its singular form.
    rT   r   )rU   rV   ÚSINGULARIZE_PATTERNSrX   rY   rZ   )Úpluralr\   s     r   Úsingularizera   «   so   € ð ”ÑØˆßˆØˆQ‰4�6‹>Ø�Q‘4ŠKð ÷ "ˆÜ�9‰9�Q�q‘T˜6Õ"Ü—6‘6˜!˜A™$  !¡ fÓ-Ò-ð "ð €Mr   c                 ó–   — dj                  d„ t        j                  dd| «      j                  «       j	                  d«      D «       «      S )z—Convert a word from lower_with_underscores to CamelCase.

    Args:
        word: The string to convert.
    Returns:
        The modified string.
    r   c              3   óN   K  — | ]  }|d    j                  «       |dd z   –— Œ y­w)r   rT   N)Úupper)Ú.0Úws     r   Ú	<genexpr>zcamelize.<locals>.<genexpr>Æ   s.   è ø€ ð WÙU�qð �Q‘4—:‘:“< ! A B %Õ'ÙUùs   ‚#%z[^A-Z^a-z^0-9^:]+Ú )ÚjoinrX   rZ   ÚstripÚsplit©Úwords    r   Úcamelizern   ¾   sI   € ð �7‰7ñ WÜŸF™FÐ#6¸¸TÓB×HÑHÓJ×PÑPÐQTÔUóWó Wð Wr   c                 óL   — t        j                  dd| «      j                  «       S )z—Convert a word from CamelCase to lower_with_underscores.

    Args:
        word: The string to convert.
    Returns:
        The modified string.
    z"\B((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))z_\1)rX   rZ   r.   rl   s    r   Ú
underscorerp   Ê   s$   € ô �6‰6Ð7Ø˜$ó ß %¡£ð(r   c                 ó^   ‡— ˆfd„Š ‰| «      }t         j                  j                  |d«      S )z¡Convert a dictionary to url query parameters.

    Args:
        query_params: A dictionary of arguments.
    Returns:
        A string of query parameters.
    c                 óv  •— i }t        j                  | «      D ]�  \  }}t        |t        «      rd|z  }n}t        |t        «      rBi }t        j                  |«      D ]  \  }}|||›d|›d�<   Œ |j                   ‰|«      «       Œnt        |t         j                  «      r|j                  d«      }|||<   ŒŸ |S )Nz%s[]Ú[Ú]r8   )r,   Ú	iteritemsÚ
isinstanceÚlistÚdictÚupdater-   Úencode)ÚparamsÚ	annotatedÚkeyr0   Údict_optionsÚdkÚdvÚannotate_paramss          €r   r�   z!to_query.<locals>.annotate_paramsÞ   sª   ø€ Øˆ	ÜŸ-™-¨Ö/‰JˆC�Ü˜%¤Ô&Ø˜s‘l‘Ü˜E¤4Ô(Ø!�Ü!Ÿm™m¨EÖ2‘F�B˜Ø9;�LªS²"Ð!5Ò6ð 3à× Ñ ¡°Ó!>Ô?ØÜ˜E¤3§=¡=Ô1ØŸ™ WÓ-�Ø"ˆI�cŠNð 0ð Ðr   T)r   r   Ú	urlencode)Úquery_paramsr|   r�   s     @r   Úto_queryr„   Ö   s+   ø€ ôñ   Ó-€IÜ�<‰<×!Ñ! )¨TÓ2Ð2r   c                 óÆ  — dd|z  z  }t        | «      r�| j                  r| j                  j                  «       s
|dz   | _        t        | «      D ]^  \  }}t	        ||dz   «       |j
                  r|j
                  j                  «       rŒ<|dz   t        | «      k  r|dz   |_        ŒX||_        Œ` y|r/| j
                  r| j
                  j                  «       s|| _        yyy)z£Add PrettyPrint formatting to an ElementTree element.

    Args:
        element: An ElementTree element which is modified in-place.
    Returns:
        None
    z
%sz  rT   N)ÚlenÚtextrj   Ú	enumerateÚxml_pretty_formatÚtail)ÚelementÚlevelÚindentr\   r   s        r   r‰   r‰   ñ   s¼   € ð �t˜e‘|Ñ$€FÜ
ˆ7„|Ø�|Š| 7§<¡<×#5Ñ#5Ô#7Ø! D™=ˆGŒLÜ! 'Ö*‰HˆAˆuÜ˜e U¨Q¡YÔ/Ø—:’: U§Z¡Z×%5Ñ%5Õ%7Ø�q‘5œ3˜w›<Ò'Ø!'¨$¡�E•Jà!'�E•Jñ +ñ ˜'Ÿ,š,¨g¯l©l×.@Ñ.@Ô.BØ!ˆG�Lð /Cˆ5r   c                 óÄ   — | €|j                  dd«       yt        t        gz   D ]:  }t        | |d   «      sŒ |d   | «      \  }|_        |r|j                  d|«        y y)z©Write a serialized value to an xml element.

    Args:
        value: The value to serialize.
        element: An xml element to write to.
    Returns:
        None
    NÚnilÚtruer2   r3   )ÚsetÚSERIALIZERSÚDEFAULT_SERIALIZERrv   r‡   )r0   r‹   Ú
serializerÚelement_types       r   Ú	serializer–   	  sh   € ð €}Ø‡k�k�%˜Ô Øä!Ô%7Ð$8Ô8ˆ
Ü�e˜Z¨Ñ/Õ0Ø)=¨°HÑ)=¸eÓ)DÑ&ˆL˜'œ,ÙØ—‘˜F LÔ1Ùñ 9r   c                 ó8   — |r|| i} t        j                  | «      S )z–Convert a dictionary, list or Collection to an JSON string.

    Args:
        obj: The object to serialize.

    Returns:
        A json string.
    )ÚjsonÚdumps)ÚobjÚroots     r   Úto_jsonrœ     s   € ñ Ø�cˆmˆÜ�:‰:�c‹?Ðr   c                 ó,   — t        j                  | «      S )z—Parse the json into a dictionary of attributes.

    Args:
        jsonstr: A JSON formatted string.
    Returns:
        The deserialized object.
    )r˜   Úloads)Újsonstrs    r   Újson_to_dictr    ,  s   € ô �:‰:�gÓÐr   c           	      ó²  — |xr |j                  dd«      xs |}t        j                  |«      }t        | t        «      r@|j                  dd«       | D ]'  }|j                  t        |t        |«      |«      «       Œ) |S t        | t        «      r;t        j                  | «      D ]!  \  }}|j                  t        |||«      «       Œ# |S t        | |«       |S )NÚ_Ú-r2   Úarray)ÚreplaceÚETÚElementrv   rw   r‘   ÚappendÚ_to_xml_elementra   rx   r,   ru   r–   )rš   r›   Ú	dasherizeÚroot_elementr0   r}   s         r   r©   r©   7  sÆ   € ØÒ/˜Ÿ™ c¨3Ó/Ò7°4€DÜ—:‘:˜dÓ#€LÜ�#”tÔØ×Ñ˜ Ô)ÛˆEØ×Ñ¤°´{À4Ó7HÈ)Ó TÕUð ð Ðô 
�CœÔ	ÜŸ-™-¨Ö,‰JˆC�Ø×Ñ¤°°s¸IÓ FÕGð -ð
 Ðô 	�#�|Ô$àÐr   c                 óz   — t        | ||«      }|rt        |«       t        j                  |«      }|r	t        |z   S |S )a»  Convert a dictionary or list to an XML string.

    Args:
        obj: The dictionary/list object to convert.
        root: The name of the root xml element.
        pretty: Whether to pretty-format the xml (default False).
        header: Whether to include an xml header (default True).
        dasherize: Whether to convert underscores to dashes in
                   attribute names (default True).
    Returns:
        An xml string.
    )r©   r‰   r¦   ÚtostringÚ
XML_HEADER)rš   r›   ÚprettyÚheaderrª   r«   Úxml_datas          r   Úto_xmlr²   G  s>   € ô # 3¨¨iÓ8€LÙÜ˜,Ô'Ü�{‰{˜<Ó(€HÙÜ˜HÑ$Ð$Ø€Or   c                 ó 	  — t        | t        j                  t        j                  f«      r)| j	                  «       ri S 	 t        j                  | «      }n| }|j                  dd«      j                  «       }|dk(  ry|j                  j                  dd«      }t        j                  |«      }t        |«      D ]  }|j!                  t#        |d¬	«      «       Œ  |rt        j$                  |||i«      S |S |j                  d
«      dk(  ry|dv r|j&                  sy|dk(  rt)        |j&                  «      S |dk(  rnt*        rt+        |j&                  «      S 	 t-        j.                  t1        j2                  |j&                  d«      «      }t4        j4                  j7                  |«      S |dk(  r5t1        j2                  |j&                  d«      }	t5        j:                  |	dd Ž S |dk(  rt=        j>                  |j&                  «      S |dv rtA        |j&                  «      S |dk(  r)|j&                  sy|j&                  jC                  «       dv S |dk(  r0tD        stG        d«      ‚tE        jH                  |j&                  «      S |dk(  r.tK        jL                  |j&                  jO                  d«      «      S |dk(  r;|j                  dd«      }
|j                  dd «      }tQ        |j&                  ||
«      S |d!v r|j&                  sy|j&                  S t        |«      �r|r>t        j$                  tS        |j                  dd«      «      |jU                  «       «      }nGt        j$                  tW        |j                  j                  dd«      «      |jU                  «       «      }t        |«      D ]g  }t#        |d¬	«      }|j                  j                  dd«      }||v r3t        ||   t        «      r||   j!                  |«       ŒX||   |g||<   Œc|||<   Œi |r|j                  j                  dd«      |iS |S |jU                  «       r>t        j$                  |j                  j                  dd«      |jU                  «       «      S |j&                  S # t        $ r}t        d|z  «      ‚d}~ww xY w# t8        $ r}t        d«      ‚d}~ww xY w)"a  Parse the xml into a dictionary of attributes.

    Args:
        xmlobj: An ElementTree element or an xml string.
        saveroot: Keep the xml element names (ugly format)
    Returns:
        An ElementDict object or ElementList for multiple objects
    zUnable to parse xml data: %sNr2   r   r¤   r£   r¢   F)Úsaverootr�   r�   )r5   r   ÚdateÚdecimalÚdoubleÚfloatr5   r   z%Y-%m-%dT%H:%M:%S+0000zŠUnable to parse timestamp. Install dateutil (http://labix.org/python-dateutil) or pyxml (http://pyxml.sf.net/topics/) for ISO8601 support.rµ   z%Y-%m-%dé   r¶   )r¸   r·   r+   )r�   Ú1Úyamlz+PyYaml is not installed: http://pyyaml.org/Úbase64binaryr<   ÚfilerN   rR   rM   rQ   )ÚsymbolÚstring),rv   r,   r-   Úbinary_typeÚisspacer¦   Ú
fromstringÚ	ExceptionrC   Úgetr.   Útagr¥   r   ÚElementListrw   r¨   Úxml_to_dictÚElementDictr‡   Úintr   ÚcalendarÚtimegmÚtimeÚstrptimer   r	   Ú
ValueErrorrµ   r¶   ÚDecimalr¸   rj   r»   ÚImportErrorÚ	safe_loadr=   Ú	b64decoderz   rJ   rp   Úitemsra   )Úxmlobjr´   r‹   Úerrr•   Úelement_list_typeÚreturn_listr   Ú	timestampÚ
time_tuplerN   ÚfilenameÚ
attributesÚ	attributeÚ	child_tags                  r   rÇ   rÇ   ]  sW  € ô �&œ3Ÿ=™=¬#¯/©/Ð:Ô;à�>‰>ÔØˆIð	>Ü—m‘m FÓ+‰Gð ˆà—;‘;˜v rÓ*×0Ñ0Ó2€LØ�wÒØ#ŸK™K×/Ñ/°°SÓ9ÐÜ(×4Ñ4Ð5FÓGˆÜ˜'–]ˆEØ×Ñœ{¨5¸5ÔAÕBð #áÜ%×1Ñ1Ð2CØ3DØ3>ð3@óAð Að ÐØ	�‰�UÓ	˜vÒ	%ØØ	ð 8ñ 
8Ø@GÇÂØØ	˜Ò	"Ü�7—<‘<Ó Ð Ø	˜Ò	#ÝÜ˜gŸl™lÓ+Ð+ð	5Ü$ŸO™OÜŸ™ g§l¡lÐ4LÓMóO�	ô  ×(Ñ(×9Ñ9¸)ÓDÐDð 
˜Ò	Ü—]‘] 7§<¡<°Ó<ˆ
Ü�}‰}˜j¨¨!˜nÐ-Ð-Ø	˜Ò	"Ü�‰˜wŸ|™|Ó,Ð,Ø	Ð,Ñ	,Ü�W—\‘\Ó"Ð"Ø	˜Ò	"Ø�|Š|ØØ�|‰|×!Ñ!Ó# }Ð4Ð4Ø	˜Ò	ÝÜÐKÓLÐLÜ�~‰~˜gŸl™lÓ+Ð+Ø	˜Ò	'Ü×Ñ §¡× 3Ñ 3°GÓ <Ó=Ð=Ø	˜Ò	Ø—{‘{ >Ø#=ó?ˆà—;‘;˜v zÓ2ˆÜ˜'Ÿ,™,¨°,Ó?Ð?Ø	Ð-Ñ	-Ø�|Š|ØØ�|‰|ÐÜ	ˆg�ñ Ü+×7Ñ7Ü˜7Ÿ;™; v¨rÓ2Ó3°W·]±]³_óF‰Jô ,×7Ñ7¼Ø—‘×#Ñ# C¨Ó-ó9/Ø07·±³óAˆJä˜'–]ˆEÜ# E°EÔ:ˆIØŸ	™	×)Ñ)¨#¨sÓ3ˆIà˜JÑ&Ü˜j¨Ñ3´TÔ:Ø˜yÑ)×0Ñ0°Õ;à-7¸	Ñ-BØ-6ð-8�J˜yÒ)ð )2�
˜9Ò%ð #ñ Ø—K‘K×'Ñ'¨¨SÓ1°:Ð>Ð>àÐØ	�‰ŒÜ!×-Ñ-¨g¯k©k×.AÑ.AÀ#ÀsÓ.KØ.5¯m©m«oó?ð 	?ð �|‰|Ðøô{ ò 	>ÜÐ6¸Ñ<Ó=Ð=ûð	>ûôB ò 5Üð 4ó 5ð 5ûð5ús0   ¾R ÅAR4 Ò	R1ÒR,Ò,R1Ò4	SÒ=SÓS)r   )Úobject)rÞ   FTT)T)7rG   Ú
__author__r=   rÊ   r¶   rX   rÌ   r   r,   Ú	six.movesr   Úpyactiveresourcer   r»   rÐ   Ú
simplejsonr˜   Údateutil.parserr   r   Ú	xml.utilsr   Ú	xml.etreer   r¦   r   r®   rW   r_   rV   rU   ÚboolÚinteger_typesr’   ÚPY2r¨   ÚstrÚbytesrÞ   r“   rÃ   rC   rJ   r]   ra   rn   rp   r„   r‰   r–   rœ   r    r©   r²   rÇ   rH   r   r   Ú<module>rë      sÞ  ðñ &à.€
ã Û Û Û 	Û Û Û 
Ý Ý /ðÛðÛðÝ3ð"0Ý,ð 9€
òÐ ò(Ð ò8€	ò+€ð ÙFñHà×ÑÙ>ñ@ðA€ð
 ‡7‚7Ø×ÑØÙ?ñAõ Bð ×ÑØÙYñ[ô \ð
 Ù8ñ:Ð ô
0ˆIô 0ô)�ô )ò0ò$ò&	Wò	(ò3ó6"ò0ó*òòó ô,løðW
 ò Ø‚Dðûð
 ò ðÜøØò ØŠðüðûð ò ðÝ%ó		0øð ò ØŠ
ðüðûð$ ò 0ð0Ü!øØò 0ß/ð0ýð0ús°   ®C) ³C6 ¸D ¿D7 Ã)C3Ã2C3Ã6DÃ<DÄ DÄDÄDÄ
DÄDÄDÄD4Ä	D$Ä#D4Ä$D.Ä+D4Ä-D.Ä.D4Ä3D4Ä7EÄ=EÅEÅEÅEÅEÅEÅE