§
    ù²Åjì=  ã                   ó–  — d dl mZ d dlmZmZmZm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mZ dd
lmZ ddlmZmZ g d¢Zde
dede
fd„Z G d„ de	j        ¦  «        Z G d„ de	j        ¦  «        Zdee         dedededef
d„ZdeddœZ  G d„ de¦  «        Z! G d„ d e¦  «        Z" G d!„ d"e¦  «        Z# G d#„ d$e¦  «        Z$ e¦   «          ed%e!j%        f¬&¦  «        dd'd(œdee!         dededefd)„¦   «         ¦   «         Z& e¦   «          ed%e"j%        f¬&¦  «        dd'd(œdee"         dededefd*„¦   «         ¦   «         Z' e¦   «          ed%e#j%        f¬&¦  «        dd'd(œdee#         dededefd+„¦   «         ¦   «         Z( e¦   «          ed%e$j%        f¬&¦  «        dd'd(œdee$         dededefd,„¦   «         ¦   «         Z)dS )-é    )Úpartial)ÚAnyÚCallableÚListÚOptionalN)ÚTensoré   )ÚImageClassification)Ú_log_api_usage_onceé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_IMAGENET_CATEGORIES)Ú_ovewrite_named_paramÚhandle_legacy_interface)	ÚShuffleNetV2ÚShuffleNet_V2_X0_5_WeightsÚShuffleNet_V2_X1_0_WeightsÚShuffleNet_V2_X1_5_WeightsÚShuffleNet_V2_X2_0_WeightsÚshufflenet_v2_x0_5Úshufflenet_v2_x1_0Úshufflenet_v2_x1_5Úshufflenet_v2_x2_0ÚxÚgroupsÚreturnc                 óô   — |                       ¦   «         \  }}}}||z  }|                      |||||¦  «        } t          j        | dd¦  «                             ¦   «         } |                      ||||¦  «        } | S )Nr   r	   )ÚsizeÚviewÚtorchÚ	transposeÚ
contiguous)r   r   Ú	batchsizeÚnum_channelsÚheightÚwidthÚchannels_per_groups          úPC:\Projects\Historical\venv\Lib\site-packages\torchvision/models/shufflenetv2.pyÚchannel_shuffler+      s|   € Ø-.¯VªV©X¬XÑ*€Iˆ|˜V UØ%¨Ñ/Ðð 	
�Šˆy˜&Ð"4°f¸eÑDÔD€AåŒ˜˜1˜aÑ Ô ×+Ò+Ñ-Ô-€Að 	
�Šˆy˜,¨°Ñ6Ô6€Aà€Hó    c                   ó‚   ‡ — e Zd Zdedededdfˆ fd„Ze	 dd
ededededededej        fd„¦   «         Z	de
de
fd„Zˆ xZS )ÚInvertedResidualÚinpÚoupÚstrider   Nc                 óü  •— t          ¦   «                              ¦   «          d|cxk    rdk    sn t          d¦  «        ‚|| _        |dz  }| j        dk    r"||dz  k    rt          d|› d|› d|› d�¦  «        ‚| j        dk    rŠt	          j        |                      ||d| j        d¬	¦  «        t	          j        |¦  «        t	          j        ||ddd
d¬¦  «        t	          j        |¦  «        t	          j	        d¬¦  «        ¦  «        | _
        nt	          j        ¦   «         | _
        t	          j        t	          j        | j        dk    r|n||ddd
d¬¦  «        t	          j        |¦  «        t	          j	        d¬¦  «        |                      ||d| j        d¬	¦  «        t	          j        |¦  «        t	          j        ||ddd
d¬¦  «        t	          j        |¦  «        t	          j	        d¬¦  «        ¦  «        | _        d S )Nr   é   zillegal stride valuer	   zInvalid combination of stride z, inp z	 and oup zB values. If stride == 1 then inp should be equal to oup // 2 << 1.©Úkernel_sizer1   Úpaddingr   F)r5   r1   r6   ÚbiasT©Úinplace)ÚsuperÚ__init__Ú
ValueErrorr1   ÚnnÚ
SequentialÚdepthwise_convÚBatchNorm2dÚConv2dÚReLUÚbranch1Úbranch2)Úselfr/   r0   r1   Úbranch_featuresÚ	__class__s        €r*   r;   zInvertedResidual.__init__,   s"  ø€ Ý‰Œ×ÒÑÔÐà�VÐ Ð Ò Ð ˜qÒ Ð Ð Ð ÝÐ3Ñ4Ô4Ð4ØˆŒà ™(ˆØŒK˜1ÒÐ 3¨/¸QÑ*>Ò#>Ð#>Ýð U°ð  Uð  U¸sð  Uð  UÈSð  Uð  Uð  Uñô ð ð Œ;˜Š?ˆ?Ýœ=Ø×#Ò# C¨¸!ÀDÄKÐYZÐ#Ñ[Ô[Ý”˜sÑ#Ô#Ý”	˜#˜¸AÀaÐQRÐY^Ð_Ñ_Ô_Ý”˜Ñ/Ô/Ý” Ð%Ñ%Ô%ñô ˆDŒLˆLõ œ=™?œ?ˆDŒLå”}ÝŒIØœ aš˜��¨oØØØØØðñ ô õ ŒN˜?Ñ+Ô+ÝŒG˜DÐ!Ñ!Ô!Ø×Ò °ÈaÐX\ÔXcÐmnÐÑoÔoÝŒN˜?Ñ+Ô+ÝŒI�o ÀAÈaÐYZÐafÐgÑgÔgÝŒN˜?Ñ+Ô+ÝŒG˜DÐ!Ñ!Ô!ñ
ô 
ˆŒˆˆr,   r   r   FÚiÚor5   r6   r7   c           	      ó8   — t          j        | |||||| ¬¦  «        S )N)r7   r   )r=   rA   )rH   rI   r5   r1   r6   r7   s         r*   r?   zInvertedResidual.depthwise_convV   s#   € õ Œy˜˜A˜{¨F°GÀ$ÈqÐQÑQÔQÐQr,   r   c                 óD  — | j         dk    rF|                     dd¬¦  «        \  }}t          j        ||                      |¦  «        fd¬¦  «        }n>t          j        |                      |¦  «        |                      |¦  «        fd¬¦  «        }t          |d¦  «        }|S )Nr   r	   )Údim)r1   Úchunkr"   ÚcatrD   rC   r+   )rE   r   Úx1Úx2Úouts        r*   ÚforwardzInvertedResidual.forward\   s�   € ØŒ;˜!ÒÐØ—W’W˜Q A�WÑ&Ô&‰FˆB�Ý”)˜R §¢¨bÑ!1Ô!1Ð2¸Ð:Ñ:Ô:ˆCˆCå”)˜TŸ\š\¨!™_œ_¨d¯lªl¸1©o¬oÐ>ÀAÐFÑFÔFˆCå˜c 1Ñ%Ô%ˆàˆ
r,   )r   r   F)Ú__name__Ú
__module__Ú__qualname__Úintr;   ÚstaticmethodÚboolr=   rA   r?   r   rR   Ú__classcell__©rG   s   @r*   r.   r.   +   sê   ø€ € € € € ð(
˜Cð (
 cð (
°3ð (
¸4ð (
ð (
ð (
ð (
ð (
ð (
ðT àZ_ðRð RØðRØðRØ%(ðRØ25ðRØDGðRØSWðRà	ŒðRð Rð Rñ „\ðRð
	˜ð 	 Fð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r,   r.   c                   óŒ   ‡ — e Zd Zdefdee         dee         dededej        f         ddf
ˆ fd	„Z	d
e
de
fd„Zd
e
de
fd„Zˆ xZS )r   iè  Ústages_repeatsÚstages_out_channelsÚnum_classesÚinverted_residual.r   Nc           
      ó6  •— t          ¦   «                              ¦   «          t          | ¦  «         t          |¦  «        dk    rt	          d¦  «        ‚t          |¦  «        dk    rt	          d¦  «        ‚|| _        d}| j        d         }t          j        t          j        ||dddd¬	¦  «        t          j	        |¦  «        t          j
        d
¬¦  «        ¦  «        | _        |}t          j        ddd¬¦  «        | _        |  |  |  d„ dD ¦   «         }t          ||| j        dd …         ¦  «        D ]h\  }}	} |||d¦  «        g}
t          |	dz
  ¦  «        D ]"}|
                      |||d¦  «        ¦  «         Œ#t#          | |t          j        |
Ž ¦  «         |}Œi| j        d         }t          j        t          j        ||dddd¬	¦  «        t          j	        |¦  «        t          j
        d
¬¦  «        ¦  «        | _        t          j        ||¦  «        | _        d S )Nr3   z2expected stages_repeats as list of 3 positive intsé   z7expected stages_out_channels as list of 5 positive intsr   r	   r   F)r7   Tr8   r4   c                 ó   — g | ]}d |› �‘ŒS )Ústage© )Ú.0rH   s     r*   ú
<listcomp>z)ShuffleNetV2.__init__.<locals>.<listcomp>ˆ   s   € Ð6Ð6Ð6 q�{˜q�{�{Ð6Ð6Ð6r,   )r	   r3   é   éÿÿÿÿ)r:   r;   r   Úlenr<   Ú_stage_out_channelsr=   r>   rA   r@   rB   Úconv1Ú	MaxPool2dÚmaxpoolÚzipÚrangeÚappendÚsetattrÚconv5ÚLinearÚfc)rE   r\   r]   r^   r_   Úinput_channelsÚoutput_channelsÚstage_namesÚnameÚrepeatsÚseqrH   rG   s               €r*   r;   zShuffleNetV2.__init__i   s2  ø€ õ 	‰Œ×ÒÑÔÐÝ˜DÑ!Ô!Ð!åˆ~ÑÔ !Ò#Ð#ÝÐQÑRÔRÐRÝÐ"Ñ#Ô# qÒ(Ð(ÝÐVÑWÔWÐWØ#6ˆÔ àˆØÔ2°1Ô5ˆÝ”]ÝŒI�n o°q¸!¸QÀUÐKÑKÔKÝŒN˜?Ñ+Ô+ÝŒG˜DÐ!Ñ!Ô!ñ
ô 
ˆŒ
ð
 )ˆå”|°¸!ÀQÐGÑGÔGˆŒð 	Ð"ØÐ"ØÐ"Ø6Ð6¨IÐ6Ñ6Ô6ˆÝ.1°+¸~ÈtÔOgÐhiÐhjÐhjÔOkÑ.lÔ.lð 	-ð 	-Ñ*ˆD�'˜?Ø$Ð$ ^°_ÀaÑHÔHÐIˆCÝ˜7 Q™;Ñ'Ô'ð Sð S�Ø—
’
Ð,Ð,¨_¸oÈqÑQÔQÑRÔRÐRÐRÝ�D˜$¥¤¨sÐ 3Ñ4Ô4Ð4Ø,ˆNˆNàÔ2°2Ô6ˆÝ”]ÝŒI�n o°q¸!¸QÀUÐKÑKÔKÝŒN˜?Ñ+Ô+ÝŒG˜DÐ!Ñ!Ô!ñ
ô 
ˆŒ
õ ”)˜O¨[Ñ9Ô9ˆŒˆˆr,   r   c                 óZ  — |                       |¦  «        }|                      |¦  «        }|                      |¦  «        }|                      |¦  «        }|                      |¦  «        }|                      |¦  «        }|                     ddg¦  «        }|                      |¦  «        }|S )Nr	   r3   )rk   rm   Ústage2Ústage3Ústage4rr   Úmeanrt   ©rE   r   s     r*   Ú_forward_implzShuffleNetV2._forward_impl™   sƒ   € à�JŠJ�q‰MŒMˆØ�LŠL˜‰OŒOˆØ�KŠK˜‰NŒNˆØ�KŠK˜‰NŒNˆØ�KŠK˜‰NŒNˆØ�JŠJ�q‰MŒMˆØ�FŠF�A�q�6‰NŒNˆØ�GŠG�A‰JŒJˆØˆr,   c                 ó,   — |                       |¦  «        S )N)r�   r€   s     r*   rR   zShuffleNetV2.forward¥   s   € Ø×!Ò! !Ñ$Ô$Ð$r,   )rS   rT   rU   r.   r   rV   r   r=   ÚModuler;   r   r�   rR   rY   rZ   s   @r*   r   r   h   sÒ   ø€ € € € € ð
  Ø6Fð.:ð .:à˜Sœ	ð.:ð " #œYð.:ð ð	.:ð
 $ C¨¬ NÔ3ð.:ð 
ð.:ð .:ð .:ð .:ð .:ð .:ð`
˜vð 
¨&ð 
ð 
ð 
ð 
ð%˜ð % Fð %ð %ð %ð %ð %ð %ð %ð %r,   r   ÚweightsÚprogressÚargsÚkwargsc                 óÌ   — | �)t          |dt          | j        d         ¦  «        ¦  «         t          |i |¤Ž}| �*|                     |                      |d¬¦  «        ¦  «         |S )Nr^   Ú
categoriesT)r…   Ú
check_hash)r   ri   Úmetar   Úload_state_dictÚget_state_dict)r„   r…   r†   r‡   Úmodels        r*   Ú_shufflenetv2r�   ©   sp   € ð ÐÝ˜f mµS¸¼ÀlÔ9SÑ5TÔ5TÑUÔUÐUå˜$Ð) &Ð)Ð)€EàÐØ×Ò˜g×4Ò4¸hÐSWÐ4ÑXÔXÑYÔYÐYà€Lr,   )r   r   z2https://github.com/ericsun99/Shufflenet-v2-Pytorch)Úmin_sizer‰   Úrecipec                   ób   — e Zd Z ed eed¬¦  «        i e¥dddddœid	d
ddœ¥¬¦  «        ZeZdS )r   zDhttps://download.pytorch.org/models/shufflenetv2_x0.5-f707e7126e.pthéà   ©Ú	crop_sizeiÛ úImageNet-1Kg-²�ï§FN@g9´Èv¾oT@©zacc@1zacc@5g{®Gáz¤?gTã¥›Ä @úVThese weights were trained from scratch to reproduce closely the results of the paper.©Ú
num_paramsÚ_metricsÚ_opsÚ
_file_sizeÚ_docs©ÚurlÚ
transformsr‹   N©	rS   rT   rU   r   r   r
   Ú_COMMON_METAÚIMAGENET1K_V1ÚDEFAULTrd   r,   r*   r   r   Á   sƒ   € € € € € Ø�GàRØ�7Ð.¸#Ð>Ñ>Ô>ð
Øð
à!àØ#Ø#ð ð  ðð ØØqð
ð 
ð 
ð	ñ ô €Mð$ €G€G€Gr,   r   c                   ób   — e Zd Z ed eed¬¦  «        i e¥dddddœid	d
ddœ¥¬¦  «        ZeZdS )r   zBhttps://download.pytorch.org/models/shufflenetv2_x1-5666bf0f80.pthr“   r”   iÌÄ" r–   gºI+WQ@gNbX9V@r—   g�Âõ(\�Â?g¢E¶óý”!@r˜   r™   rŸ   Nr¢   rd   r,   r*   r   r   ×   sƒ   € € € € € Ø�GàPØ�7Ð.¸#Ð>Ñ>Ô>ð
Øð
à!àØ#Ø#ð ð  ðð ØØqð
ð 
ð 
ð	ñ ô €Mð$ €G€G€Gr,   r   c                   óf   — e Zd Z ed eedd¬¦  «        i e¥ddddd	d
œiddddœ¥¬¦  «        ZeZdS )r   zBhttps://download.pytorch.org/models/shufflenetv2_x1_5-3c479a10.pthr“   éè   ©r•   Úresize_sizeú+https://github.com/pytorch/vision/pull/5906iv5 r–   g9´Èv¾?R@g/Ý$�ÅV@r—   g‹lçû©ñÒ?gw¾Ÿ/+@úé
                These weights were trained from scratch by using TorchVision's `new training recipe
                <https://pytorch.org/blog/how-to-train-state-of-the-art-models-using-torchvision-latest-primitives/>`_.
            ©r‘   rš   r›   rœ   r�   rž   rŸ   Nr¢   rd   r,   r*   r   r   í   óŠ   € € € € € Ø�GØPØ�7Ð.¸#È3ÐOÑOÔOð
Øð
àCØ!àØ#Ø#ð ð  ðð Ø ðð
ð 
ð 
ðñ ô €Mð* €G€G€Gr,   r   c                   óf   — e Zd Z ed eedd¬¦  «        i e¥ddddd	d
œiddddœ¥¬¦  «        ZeZdS )r   zBhttps://download.pytorch.org/models/shufflenetv2_x2_0-8be3c8ee.pthr“   r¨   r©   r«   iÌÒp r–   g…ëQ¸S@gªñÒMb@W@r—   g-²�ï§â?g+‡Ùn<@r¬   r­   rŸ   Nr¢   rd   r,   r*   r   r     r®   r,   r   Ú
pretrained)r„   T)r„   r…   c                 ó^   — t                                | ¦  «        } t          | |g d¢g d¢fi |¤ŽS )a  
    Constructs a ShuffleNetV2 architecture with 0.5x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    Args:
        weights (:class:`~torchvision.models.ShuffleNet_V2_X0_5_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.ShuffleNet_V2_X0_5_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.shufflenetv2.ShuffleNetV2``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ShuffleNet_V2_X0_5_Weights
        :members:
    ©rg   é   rg   )é   é0   é`   éÀ   é   )r   Úverifyr�   ©r„   r…   r‡   s      r*   r   r     s?   € õ4 )×/Ò/°Ñ8Ô8€Gå˜ (¨I¨I¨IÐ7NÐ7NÐ7NÐYÐYÐRXÐYÐYÐYr,   c                 ó^   — t                                | ¦  «        } t          | |g d¢g d¢fi |¤ŽS )a  
    Constructs a ShuffleNetV2 architecture with 1.0x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    Args:
        weights (:class:`~torchvision.models.ShuffleNet_V2_X1_0_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.ShuffleNet_V2_X1_0_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.shufflenetv2.ShuffleNetV2``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ShuffleNet_V2_X1_0_Weights
        :members:
    r²   )r´   ét   r¨   iÐ  r¸   )r   r¹   r�   rº   s      r*   r   r   >  ó?   € õ4 )×/Ò/°Ñ8Ô8€Gå˜ (¨I¨I¨IÐ7PÐ7PÐ7PÐ[Ð[ÐTZÐ[Ð[Ð[r,   c                 ó^   — t                                | ¦  «        } t          | |g d¢g d¢fi |¤ŽS )a  
    Constructs a ShuffleNetV2 architecture with 1.5x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    Args:
        weights (:class:`~torchvision.models.ShuffleNet_V2_X1_5_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.ShuffleNet_V2_X1_5_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.shufflenetv2.ShuffleNetV2``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ShuffleNet_V2_X1_5_Weights
        :members:
    r²   )r´   é°   i`  iÀ  r¸   )r   r¹   r�   rº   s      r*   r   r   ]  r½   r,   c                 ó^   — t                                | ¦  «        } t          | |g d¢g d¢fi |¤ŽS )a  
    Constructs a ShuffleNetV2 architecture with 2.0x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    Args:
        weights (:class:`~torchvision.models.ShuffleNet_V2_X2_0_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.ShuffleNet_V2_X2_0_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.shufflenetv2.ShuffleNetV2``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ShuffleNet_V2_X2_0_Weights
        :members:
    r²   )r´   éô   iè  iÐ  i   )r   r¹   r�   rº   s      r*   r   r   |  r½   r,   )*Ú	functoolsr   Útypingr   r   r   r   r"   Útorch.nnr=   r   Útransforms._presetsr
   Úutilsr   Ú_apir   r   r   Ú_metar   Ú_utilsr   r   Ú__all__rV   r+   rƒ   r.   r   rX   r�   r£   r   r   r   r   r¤   r   r   r   r   rd   r,   r*   ú<module>rË      s¦  ðØ Ð Ð Ð Ð Ð Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bð
ð 
ð 
€ð�vð  sð ¨vð ð ð ð ð:ð :ð :ð :ð :�r”yñ :ô :ð :ðz>%ð >%ð >%ð >%ð >%�2”9ñ >%ô >%ð >%ðBØ�kÔ"ðàðð ðð ð	ð
 ðð ð ð ð$ Ø&ØBðð €ðð ð ð ð  ñ ô ð ð,ð ð ð ð  ñ ô ð ð,ð ð ð ð  ñ ô ð ð2ð ð ð ð  ñ ô ð ð2 €ÑÔØÐ ,Ð0JÔ0XÐ!YÐZÑZÔZà7;ÈdðZð Zð ZØÐ3Ô4ðZØGKðZØ^aðZàðZð Zð Zñ [ÔZñ ÔðZð: €ÑÔØÐ ,Ð0JÔ0XÐ!YÐZÑZÔZà7;Èdð\ð \ð \ØÐ3Ô4ð\ØGKð\Ø^að\àð\ð \ð \ñ [ÔZñ Ôð\ð: €ÑÔØÐ ,Ð0JÔ0XÐ!YÐZÑZÔZà7;Èdð\ð \ð \ØÐ3Ô4ð\ØGKð\Ø^að\àð\ð \ð \ñ [ÔZñ Ôð\ð: €ÑÔØÐ ,Ð0JÔ0XÐ!YÐZÑZÔZà7;Èdð\ð \ð \ØÐ3Ô4ð\ØGKð\Ø^að\àð\ð \ð \ñ [ÔZñ Ôð\ð \ð \r,   