Ë
    $Æ%h-.  ã                   óV  — d Z ddlZddl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 eeeef\  ZZZZej.                  Z ed„ d	D «       «      Z ed
„ dD «       «      Z ej8                  d«      Z	 erddlZne‚	 	  ej@                  d¬«       d(d„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)d„ Z*d„ Z+d„ Z,d„ Z-d „ Z.d!„ Z/d"„ Z0d#„ Z1d$„ Z2d%„ Z3d&„ Z4d'„ Z5y# e!$ r  ej@                  «        Y Œƒw xY w# e$ r dZY Œ�w xY w))z*
General helpers required for `tqdm.std`.
é    N)ÚpartialÚpartialmethodÚwraps)Ú	signature©Úeast_asian_width)Úwarn©Úproxyc              #   óF   K  — | ]  }t         j                  |«      –— Œ y ­w©N©ÚCUR_OSÚ
startswith©Ú.0Úis     úH/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/tqdm/utils.pyú	<genexpr>r      s   è ø€ Ò? aŒV×Ñ˜q×!Ñ?ùó   ‚!)Úwin32Úcygwinc              #   óF   K  — | ]  }t         j                  |«      –— Œ y ­wr   r   r   s     r   r   r      s   è ø€ ÒQ aŒV×Ñ˜q×!ÑQùr   )ÚaixÚlinuxÚdarwinÚfreebsdz\x1b\[[;\d]*[A-Za-z]F)Ústripc                 ó
  ‡‡‡— ‰€i Št        | «      }t        j                  j                  «       D ��ci c]+  \  }}|j	                  | «      sŒ||d j                  «       |“Œ- c}}Š|rt        nt        Šˆˆˆfd„}|S c c}}w )a  
    Override parameter defaults via `os.environ[prefix + param_name]`.
    Maps UPPER_CASE env vars map to lower_case param names.
    camelCase isn't supported (because Windows ignores case).

    Precedence (highest first):

    - call (`foo(a=3)`)
    - environ (`FOO_A=2`)
    - signature (`def foo(a=1)`)

    Parameters
    ----------
    prefix  : str
        Env var prefix, e.g. "FOO_"
    types  : dict, optional
        Fallback mappings `{'param_name': type, ...}` if types cannot be
        inferred from function signature.
        Consider using `types=collections.defaultdict(lambda: ast.literal_eval)`.
    is_method  : bool, optional
        Whether to use `functools.partialmethod`. If (default: False) use `functools.partial`.

    Examples
    --------
    ```
    $ cat foo.py
    from tqdm.utils import envwrap
    @envwrap("FOO_")
    def test(a=1, b=2, c=3):
        print(f"received: a={a}, b={b}, c={c}")

    $ FOO_A=42 FOO_C=1337 python -c 'import foo; foo.test(c=99)'
    received: a=42, b=2, c=99
    ```
    Nc                 ó  •— t        | «      j                  }‰j                  «       D ��ci c]  \  }}||v sŒ||“Œ }}}|D ]—  }||   }|j                  |j                  ur8t        |j                  d|j                  f«      D ]  }	  |||   «      ||<    ŒV ŒX|j                  �" t        |j                  «      ||   «      ||<   Œ†	  ‰	|   ||   «      ||<   Œ™  ‰| fi |¤ŽS c c}}w # t        $ r Y Œrw xY w# t        $ r Y ŒÃw xY w)NÚ__args__)
r   Ú
parametersÚitemsÚ
annotationÚemptyÚgetattrÚ	ExceptionÚdefaultÚtypeÚKeyError)
ÚfuncÚparamsÚkÚvÚ	overridesÚparamÚtypÚenv_overridesÚpartÚtypess
          €€€r   Úwrapzenvwrap.<locals>.wrapL   s.  ø€ Ü˜4“×+Ñ+ˆà&3×&9Ñ&9Ó&;×K™d˜a ¸qÀFº{�Q˜‘TÐKˆ	ÑKàò 	ˆAØ˜1‘IˆEØ×Ñ u§{¡{Ñ2Ü" 5×#3Ñ#3°ZÀ%×BRÑBRÐATÓUò �CðÙ'*¨9°Q©<Ó'8˜	 !™ñ ñð —‘Ð*Ø2œt E§M¡MÓ2°9¸Q±<Ó@�	˜!’ðØ#+ 5¨¡8¨I°a©LÓ#9�I˜a’Lð	ñ" �DÑ&˜IÑ&Ð&ùó' Løô %ò Ùðûô  ò Ùðús.   ªC$·C$ÂC*ÃC9Ã*	C6Ã5C6Ã9	DÄD)ÚlenÚosÚenvironr#   r   Úlowerr   r   )	Úprefixr4   Ú	is_methodr   r-   r.   r5   r2   r3   s	    `     @@r   Úenvwrapr<   "   sr   ú€ ðH €}ØˆÜˆF‹€AÜ24·*±*×2BÑ2BÓ2D×]©$¨!¨QÈÏÉÐU[ÕH\�Q�q�r�U—[‘[“] AÑ%Ó]€MÙ%�=¬7€Dö'ð. €Kùó5 ^s   ´A?ÁA?c                   ó   — e Zd ZdZdd„Zd„ Zy)ÚFormatReplacezN
    >>> a = FormatReplace('something')
    >>> f"{a:5d}"
    'something'
    c                 ó    — || _         d| _        y ©Nr   )ÚreplaceÚformat_called)ÚselfrA   s     r   Ú__init__zFormatReplace.__init__l   s   € ØˆŒØˆÕó    c                 óD   — | xj                   dz  c_         | j                  S )Né   )rB   rA   )rC   Ú_s     r   Ú
__format__zFormatReplace.__format__p   s   € Ø×Ò˜aÑÕØ�|‰|ÐrE   N)Ú )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rD   rI   © rE   r   r>   r>   f   s   „ ñó
órE   r>   c                   ó4   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	Ú
Comparablez1Assumes child has self._comparable attr/@propertyc                 ó4   — | j                   |j                   k  S r   ©Ú_comparable©rC   Úothers     r   Ú__lt__zComparable.__lt__w   s   € Ø×Ñ %×"3Ñ"3Ñ3Ð3rE   c                 ó   — | |k  xs | |k(  S r   rO   rU   s     r   Ú__le__zComparable.__le__z   s   € Ø�u‘Ò0 $¨%¡-Ð0rE   c                 ó4   — | j                   |j                   k(  S r   rS   rU   s     r   Ú__eq__zComparable.__eq__}   s   € Ø×Ñ 5×#4Ñ#4Ñ4Ð4rE   c                 ó   — | |k(   S r   rO   rU   s     r   Ú__ne__zComparable.__ne__€   ó   € Ø˜5‘=Ð Ð rE   c                 ó   — | |k   S r   rO   rU   s     r   Ú__gt__zComparable.__gt__ƒ   r^   rE   c                 ó   — | |k   S r   rO   rU   s     r   Ú__ge__zComparable.__ge__†   s   € Ø˜%‘<ÐÐrE   N)
rK   rL   rM   rN   rW   rY   r[   r]   r`   rb   rO   rE   r   rQ   rQ   u   s#   „ Ù;ò4ò1ò5ò!ò!ó rE   rQ   c                   ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚObjectWrapperc                 ó.   — t        | j                  |«      S r   )r&   Ú_wrapped©rC   Únames     r   Ú__getattr__zObjectWrapper.__getattr__‹   s   € Ü�t—}‘} dÓ+Ð+rE   c                 ó0   — t        | j                  ||«      S r   )Úsetattrrf   ©rC   rh   Úvalues      r   Ú__setattr__zObjectWrapper.__setattr__Ž   s   € Ü�t—}‘} d¨EÓ2Ð2rE   c                 óf   — 	 t         j                  | |«      S # t        $ r t        | |«      cY S w xY w)z7Actual `self.getattr` rather than self._wrapped.getattr)Úobjectri   ÚAttributeErrorr&   rg   s     r   Úwrapper_getattrzObjectWrapper.wrapper_getattr‘   s6   € ð	'Ü×%Ñ% d¨DÓ1Ð1øÜò 	'Ü˜4 Ó&Ò&ð	'ús   ‚ ˜0¯0c                 ó0   — t         j                  | ||«      S )z7Actual `self.setattr` rather than self._wrapped.setattr)rp   rn   rl   s      r   Úwrapper_setattrzObjectWrapper.wrapper_setattr˜   s   € ä×!Ñ! $¨¨eÓ4Ð4rE   c                 ó(   — | j                  d|«       y)z4
        Thin wrapper around a given object
        rf   N)rt   )rC   Úwrappeds     r   rD   zObjectWrapper.__init__œ   s   € ð 	×Ñ˜Z¨Õ1rE   N)rK   rL   rM   ri   rn   rr   rt   rD   rO   rE   r   rd   rd   Š   s   „ ò,ò3ò'ò5ó2rE   rd   c                   ó.   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zˆ xZS )ÚSimpleTextIOWrapperz™
    Change only `.write()` of the wrapped object by encoding the passed
    value and passing the result to the wrapped object's `.write()` method.
    c                 óH   •— t         ‰| �  |«       | j                  d|«       y )NÚencoding)ÚsuperrD   rt   )rC   rv   rz   Ú	__class__s      €r   rD   zSimpleTextIOWrapper.__init__©   s    ø€ Ü‰Ñ˜Ô!Ø×Ñ˜Z¨Õ2rE   c                 ót   — | j                   j                  |j                  | j                  d«      «      «      S )zP
        Encode `s` and pass to the wrapped object's `.write()` method.
        rz   )rf   ÚwriteÚencoderr   )rC   Úss     r   r~   zSimpleTextIOWrapper.write­   s-   € ð �}‰}×"Ñ" 1§8¡8¨D×,@Ñ,@ÀÓ,LÓ#MÓNÐNrE   c                 ó6   — | j                   t        |d|«      k(  S ©Nrf   ©rf   r&   rU   s     r   r[   zSimpleTextIOWrapper.__eq__³   ó   € Ø�}‰}¤¨¨z¸5Ó AÑAÐArE   )rK   rL   rM   rN   rD   r~   r[   Ú__classcell__©r|   s   @r   rx   rx   £   s   ø„ ñô
3òOöBrE   rx   c                   ó8   ‡ — e Zd ZdZed„ «       Zˆ fd„Zd„ Zˆ xZS )ÚDisableOnWriteErrorzO
    Disable the given `tqdm_instance` upon `write()` or `flush()` errors.
    c                 ó,   ‡ ‡— t        ‰ «      Š ˆˆ fd„}|S )zV
        Quietly set `tqdm_instance.miniters=inf` if `func` raises `errno=5`.
        c                  ó8  •— 	  ‰| i |¤ŽS # t         $ r@}|j                  dk7  r‚ 	 t        d«      ‰_        n# t        $ r Y nw xY wY d }~y Y d }~y d }~wt
        $ r>}dt        |«      vr‚ 	 t        d«      ‰_        n# t        $ r Y nw xY wY d }~y Y d }~y d }~ww xY w)Né   ÚinfÚclosed)ÚOSErrorÚerrnoÚfloatÚminitersÚReferenceErrorÚ
ValueErrorÚstr)ÚargsÚkwargsÚer+   Útqdm_instances      €€r   Úinnerz7DisableOnWriteError.disable_on_exception.<locals>.innerÂ   s¦   ø€ ðÙ˜TÐ, VÑ,Ð,øÜò Ø—7‘7˜a’<ØðÜ-2°5«\�MÕ*øÜ%ò ÙðúÜô +ûô ò Ø¤3 q£6Ñ)ØðÜ-2°5«\�MÕ*øÜ%ò ÙðúÜô +ûð	úsc   ƒ ‹	B”A¥6µA¶	A¿AÁAÁAÁBÁBÁ*A;Á:BÁ;	BÂBÂBÂBÂBr
   )r˜   r+   r™   s   `` r   Údisable_on_exceptionz(DisableOnWriteError.disable_on_exception»   s   ù€ ô
 ˜mÓ,ˆõ	ð" ˆrE   c                 ó  •— t         ‰| �  |«       t        |d«      r,| j                  d| j	                  ||j
                  «      «       t        |d«      r-| j                  d| j	                  ||j                  «      «       y y )Nr~   Úflush)r{   rD   Úhasattrrt   rš   r~   rœ   )rC   rv   r˜   r|   s      €r   rD   zDisableOnWriteError.__init__Õ   ss   ø€ Ü‰Ñ˜Ô!Ü�7˜GÔ$Ø× Ñ Ø˜×2Ñ2°=À'Ç-Á-ÓPôRä�7˜GÔ$Ø× Ñ Ø˜×2Ñ2°=À'Ç-Á-ÓPõRð %rE   c                 ó6   — | j                   t        |d|«      k(  S r‚   rƒ   rU   s     r   r[   zDisableOnWriteError.__eq__Þ   r„   rE   )	rK   rL   rM   rN   Ústaticmethodrš   rD   r[   r…   r†   s   @r   rˆ   rˆ   ·   s(   ø„ ñð ñó ðô2RöBrE   rˆ   c                   ó    ‡ — e Zd Zdˆ fd„	Zˆ xZS )ÚCallbackIOWrapperc                 ó  •‡‡— t         ‰| �  |«       t        ||«      Š|dk(  r't        ‰«      ˆˆfd„«       }| j	                  d|«       y|dk(  r't        ‰«      ˆˆfd„«       }| j	                  d|«       yt        d«      ‚)z{
        Wrap a given `file`-like object's `read()` or `write()` to report
        lengths to the given `callback`
        r~   c                 óB   •—  ‰| g|¢­i |¤Ž} ‰t        | «      «       |S r   ©r6   )Údatar•   r–   ÚresÚcallbackr+   s       €€r   r~   z)CallbackIOWrapper.__init__.<locals>.writeë   s(   ø€ á˜4Ð1 $Ò1¨&Ñ1�Ùœ˜T›Ô#Ø�
rE   Úreadc                  ó:   •—  ‰| i |¤Ž} ‰t        |«      «       |S r   r¤   )r•   r–   r¥   r§   r+   s      €€r   r¨   z(CallbackIOWrapper.__init__.<locals>.readò   s#   ø€ á˜TÐ, VÑ,�Ùœ˜T›Ô#Ø�rE   z Can only wrap read/write methodsN)r{   rD   r&   r   rt   r*   )rC   r§   ÚstreamÚmethodr~   r¨   r+   r|   s    `    @€r   rD   zCallbackIOWrapper.__init__ã   sŠ   ú€ ô
 	‰Ñ˜Ô Ü�v˜vÓ&ˆØ�WÒÜ�4‹[ôó ðð × Ñ  ¨%Õ0Ø�vÒÜ�4‹[ôó ðð × Ñ  ¨Õ.äÐ=Ó>Ð>rE   )r¨   )rK   rL   rM   rD   r…   r†   s   @r   r¡   r¡   â   s   ø„ ÷?ñ ?rE   r¡   c                 óÈ   — 	 dj                  | «       y# t        $ r Y yt        $ r: 	 | j                  «       j	                  d«      xs d| k(  cY S # t        $ r Y Y yw xY ww xY w)Nu   â–ˆâ–‰TFzutf-ÚU8)r   ÚUnicodeEncodeErrorr'   r9   r   )rz   s    r   Ú_is_utfr¯   ü   so   € ð
Ø×Ñ˜xÔ(ð øô ò ÙÜò ð	Ø—>‘>Ó#×.Ñ.¨vÓ6ÒL¸4À8Ñ;KÒLøÜò 	Úð	úðús1   ‚ ”	A!ŸA!¨%AÁA!Á	AÁA!ÁAÁA!c                 óL   — 	 t        | j                  «      S # t        $ r Y yw xY w©NF)r¯   rz   rq   )Úfps    r   Ú_supports_unicoder³   
  s(   € ðÜ�r—{‘{Ó#Ð#øÜò Ùðús   ‚ —	#¢#c                 óh   — t        | t        «      r| D ]  }t        |«      dkD  sŒ y yt        | «      S )Néÿ   FT)Ú
isinstancer”   Úordr³   )r€   Úcs     r   Ú	_is_asciir¹     s9   € Ü�!”SÔØò 	ˆAÜ�1‹v˜‹|Ùð	ð Ü˜QÓÐrE   c                  óJ   — d} t         rt        } | €t        } t        rt        } | S )zy
    Return a function which returns console dimensions (width, height).
    Supported: linux, osx, windows, cygwin.
    N)ÚIS_WINÚ_screen_shape_windowsÚ_screen_shape_tputÚIS_NIXÚ_screen_shape_linux)Ú_screen_shapes    r   Ú_screen_shape_wrapperrÁ     s*   € ð
 €MÝÜ-ˆØÐ Ü.ˆMÝÜ+ˆØÐrE   c                 óV  — 	 dd l }ddlm}m} ddlm}m} d}| |k(  rd}n| |k(  rd}|j                  j                  |«      } |d«      }|j                  j                  ||«      }	|	r2|j                  d|j                  «      \  }
}}}}}}}}}}||z
  ||z
  fS 	 y	# t        $ r Y y	w xY w)
Nr   )Úcreate_string_bufferÚwindll)ÚstdinÚstdoutiôÿÿÿiöÿÿÿiõÿÿÿé   ÚhhhhHhhhhhh©NN)ÚstructÚctypesrÃ   rÄ   ÚsysrÅ   rÆ   Úkernel32ÚGetStdHandleÚGetConsoleScreenBufferInfoÚunpackÚrawr'   )r²   rÊ   rÃ   rÄ   rÅ   rÆ   Ú	io_handleÚhÚcsbir¦   Ú_bufxÚ_bufyÚ_curxÚ_curyÚ_wattrÚleftÚtopÚrightÚbottomÚ_maxxÚ_maxys                        r   r¼   r¼   )  sÆ   € ðÛß7ß%àˆ	Ø�Š;Ø‰IØ�6Š\ØˆIà�O‰O×(Ñ(¨Ó3ˆÙ# BÓ'ˆØ�o‰o×8Ñ8¸¸DÓAˆÙà#Ÿ]™]¨=¸$¿(¹(ÓCñˆU�E˜5 %¨°°s¸EÀ6Ø�EØ˜4‘< ¨#¡Ð-Ð-ð ð øô ò ØØðús   ‚BB Â	B(Â'B(c                  ó¨   — 	 ddl }ddlm} dD �cg c](  }t         ||j	                  d|z   «      «      «      dz
  ‘Œ* c}S c c}w # t
        $ r Y yw xY w)zcygwin xterm (windows)r   N)Ú
check_call)ÚcolsÚlinesztput rG   rÉ   )ÚshlexÚ
subprocessrá   ÚintÚsplitr'   )rH   rä   rá   r   s       r   r½   r½   A  s^   € ðÛÝ)à*ö,Øô ‘J˜uŸ{™{¨7°Q©;Ó7Ó8Ó9¸AÓ=ò ,ð 	,ùò ,øäò ØØðús!   ‚A �-A ½A Á A Á	AÁAc                 ó0  — 	 ddl m } ddlm} ddlm} 	  |d || |d«      «      d d \  }}||fS # t
        $ rM 	 dD �cg c]!  }t        t        j                  |   «      d	z
  ‘Œ# nc c}w c}cY S # t        t        f$ r Y Y y
w xY ww xY w# t        $ r Y y
w xY w)Nr   )Úarray)Úioctl)Ú
TIOCGWINSZrÓ   z        é   )ÚCOLUMNSÚLINESrG   rÉ   )ré   Úfcntlrê   Útermiosrë   r'   ræ   r7   r8   r*   r“   ÚImportError)r²   ré   rê   rë   Úrowsrâ   r   s          r   r¿   r¿   M  s£   € ð"ÝÝÝ&ð	"Ù˜s¡E¨"¨j¸(Ó$CÓDÀRÀaÐH‰JˆD�$Ø˜�:ÐøÜò 	"ð"Ø8LÖM°1œœBŸJ™J q™MÓ*¨QÓ.ÑMùÔMÒMøÜœjÐ)ò "Ú!ð"úð	"ûô ò ÙðúsH   ‚B	 •0 °	BºA/¾&A%Á$A/Á,BÁ/BÁ>BÂBÂBÂ		BÂBc                  ól   ‡— t        dt        d¬«       t        «       Š‰syt        ‰«      ˆfd„«       } | S )zd
    Return a function which returns console width.
    Supported: linux, osx, windows, cygwin.
    zQUse `_screen_shape_wrapper()(file)[0]` instead of `_environ_cols_wrapper()(file)`rì   )Ú
stacklevelNc                 ó   •—  ‰| «      d   S r@   rO   )r²   Úshapes    €r   r™   z$_environ_cols_wrapper.<locals>.innerk  s   ø€ á�R‹y˜‰|ÐrE   )r	   ÚDeprecationWarningrÁ   r   )r™   rö   s    @r   Ú_environ_cols_wrapperrø   `  sC   ø€ ô
 	ð 
,Ü-?ÈAõOä!Ó#€EÙØä
ˆ5ƒ\óó ðð €LrE   c                  ó<   — t         j                  dk(  rt        €dS dS )NÚntrJ   z[A)r7   rh   ÚcoloramarO   rE   r   Ú_term_move_uprü   r  s   € Ü—'‘'˜T’/¬Ð(8ˆ2ÐG¸xÐGrE   c                 ó8   — t        d„ t        | «      D «       «      S )Nc              3   ó>   K  — | ]  }t        |«      d v rdnd–— Œ y­w)ÚFWrì   rG   Nr   )r   Úchs     r   r   z_text_width.<locals>.<genexpr>w  s"   è ø€ ÒI¸BÔ$ RÓ(¨DÑ0‰q°aÓ7ÑIùs   ‚)Úsumr”   )r€   s    r   Ú_text_widthr  v  s   € ÜÑIÄ#ÀaÃ&ÔIÓIÐIrE   c                 ó@   — t        t        j                  d| «      «      S )zp
    Returns the real on-screen length of a string which may contain
    ANSI control codes and wide chars.
    rJ   )r  ÚRE_ANSIÚsub)r¥   s    r   Údisp_lenr  z  s   € ô
 ”w—{‘{ 2 tÓ,Ó-Ð-rE   c                 ó.  — t        | «      t        | «      k(  r| d| S t        t        j	                  | «      «      }t        | «      |kD  r| dd } t        | «      |kD  rŒ|r6t        t        j	                  | «      «      r| j                  d«      r| S | dz   S | S )zB
    Trim a string which may contain ANSI control characters.
    Néÿÿÿÿz[0m)r6   r  Úboolr  ÚsearchÚendswith)r¥   ÚlengthÚansi_presents      r   Ú	disp_trimr  ‚  s‹   € ô ˆ4ƒy”H˜T“NÒ"Ø�G�Vˆ}ÐäœŸ™ tÓ,Ó-€LÜ
�4‹.˜6Ò
!Ø�C�Rˆyˆô �4‹.˜6Ó
!áœœWŸ^™^¨DÓ1Ô2à—}‘} YÔ/ˆtÐE°T¸IÑ5EÐEØ€KrE   r±   )6rN   r7   ÚrerÌ   Ú	functoolsr   r   r   Úinspectr   Úunicodedatar   Úwarningsr	   Úweakrefr   ÚrangeÚchrr”   Ú_rangeÚ_unichÚ_unicodeÚ_basestringÚplatformr   Úanyr»   r¾   Úcompiler  rû   rñ   ÚinitÚ	TypeErrorr<   rp   r>   rQ   rd   rx   rˆ   r¡   r¯   r³   r¹   rÁ   r¼   r½   r¿   rø   rü   r  r  r  rO   rE   r   ú<module>r      sg  ðñó 
Û 	Û 
ß 3Ñ 3Ý å (Ý Ý à(-¨s°C¸Ð(<Ñ %€ˆ�˜+Ø	�‰€Ù	Ñ?Ð+>Ô?Ó	?€Ù	ÑQÐ+PÔQÓ	Q€Ø
ˆ"�*‰*Ð,Ó
-€ðÙÜàÐð 	ðØˆ�‰˜EÕ"ó
AôH�Fô ô �ô  ô*2�Fô 2ô2B˜-ô Bô((B˜-ô (BôV?˜ô ?ò4òò òòò0	ò"ò&ò$HòJò.óøðI ò Øˆ�‰Žðûð ò Ø‚Hðús$   Á9	D ÂD ÄDÄDÄD(Ä'D(