HEX
Server: Apache
System: Linux server2.voipitup.com.au 4.18.0-553.109.1.lve.el8.x86_64 #1 SMP Thu Mar 5 20:23:46 UTC 2026 x86_64
User: posscale (1027)
PHP: 8.2.30
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //opt/saltstack/salt/lib/python3.10/site-packages/salt/states/__pycache__/mount.cpython-310.pyc
o

�N�gD��@s�dZddlZddlZddlZe�e�Zdd�Z																	dd
d�Z	ddd
�Z
	ddd�Zddd�Zdd�Z
										ddd�Zddd�ZdS)a�
Mounting of filesystems
=======================

Mount any type of mountable filesystem with the mounted function:

.. code-block:: yaml

    /mnt/sdb:
      mount.mounted:
        - device: /dev/sdb1
        - fstype: ext4
        - mkmnt: True
        - opts:
          - defaults

    /srv/bigdata:
      mount.mounted:
        - device: UUID=066e0200-2867-4ebe-b9e6-f30026ca2314
        - fstype: xfs
        - opts: nobootwait,noatime,nodiratime,nobarrier,logbufs=8
        - dump: 0
        - pass_num: 2
        - persist: True
        - mkmnt: True

    /var/lib/bigdata:
      mount.mounted:
        - device: /srv/bigdata
        - fstype: none
        - opts: bind
        - dump: 0
        - pass_num: 0
        - persist: True
        - mkmnt: True
�NcCsJt|�d��}|�d�dkrt|�d}|�d�dkr#t|�dd}|S)NZ
size_valueZ	size_unit�mi�g)�int�group)Z_re_size�converted_size�r�E/opt/saltstack/salt/lib/python3.10/site-packages/salt/states/mount.py�
_size_convert-sr	F�defaults�
/etc/fstabT�autocCs0|iddd�}d}|sd|d<d|d<|S|s!d|d<d|d<|S|s-d|d<d	|d<|S|d
ur3g}tddvr?�d
kr?d�tddvrK�d
krKd�t�t�rU��d��t|t�r_|�d�}|dksh|�d�}g}tddd�}tj�|�}|�	dd�}|�
d�r�d�vr�||vr�|�	dd�}||d�
d�r�	||vr�||d}|r�tt�||d||d���||d�
d�ntj�|�	dd��}q�|}n�||vr�|r�tt�||d||d���||d�
d�||d}ngtj�|�}n`|���
d��r|�d�d�d���}nK|���
d��r]|�d�d}d|��}td |��}|d!d"k�rDd#|�d$�|d<d|d<|S|d%D]} | �d&�d"}!|�
|!��qH|d"}n|}t�d'|�}"|"�r�d(d)�|"����D�}#d*jd�i|#��}$tj�|$��r�|$}t�d+|�}%|%�r�d,|%��v�r�|%�d,�}||v�r	d||v�r�g||d<|	�r	|�
||d�|�
tj�|d"��d-||v�r�||d-nd
}&d.||v�r�||d.nd
}'d/||v�r�||d/nd
}(|&�r�|&|v�r�|�
|&�|'�r	|'|v�r	|�
|'�|(�r|(|v�r|�
|(���r|gd0�})|
�r%|)�|
�|�r2tt|)�t|�B�})gd1�}*|�r>|*�|�d2d3gi}+|�rK|+�|�d4d5d6�},|�rX|,�|�g}-�D]�}.|.|,v�rg|,|.}.|.�d�d"}/|/|*v�ru|/}.t�d7|.�}0|0�r�t|0�}1d8|1�d9�}.|d:v�r�|.�d�d"d;k�r�d<�|.�d�d�}.|.�d�d"|+�|g�v�r�|.�d�d"}.d=d>d?�}2|.�d�d"|2v�rt|.�d��dk�r|.�d�d}3|.�d�d"}4|3}5t�d@|3��s�t|2|4|3�}6|6�r�|4|6v�r�|6|4}5|4dt|5�}.||�dg�}7|7D]&}8t�d7|8�}0|0�r1t|0�}1d8|1�d9�}.|7�|8�d8|1�d9�}8|7�
|8��q|.||dv�rY|.|7v�rY|.|)v�rY|.|+�|g�v�rY|.|*v�rY|-�
|.��q\|-�r�t dA�rud
|d<dB�d�!t|-���|d<|S|dCv�s�|�
dD��r�dEdF�d�!t|-���|dGdH<tdI|�}9|9du�r�tdJ||||�dK�}:|:|d<n7d|d<dL�||9�|d<|SdMdF�d�!t|-���|dGdH<tdN||||�dK�};|;|d<dO�v�r��dO�d}tdP|�}<d|<v�rz�fdQdR�|<dD�}=|=�ryt dA�rd
|d<dS�d�!|=��|d<|S|dCv�s|�
dD��rRdEdT|.�dU�|dGdH<tdI|�}9|9du�rDtdJ||||�dK�}:|:|d<n3d|d<dL�||9�|d<|SdMdT|.�dU�|dGdH<tdN||||�dK�};|;|d<dO�v�rw��dO�d}nd}||v�rd
}>t|�D]}?|D]}t�|?|��r�|}>n�q��q�|>�r�d|d<dV|>|d<n_t dA�r�d
|d<dW||d<nOdX||dGdH<||k�r�|dGdHdY|dZ7<|dGdHd[d\�!|�7<tdI||
d]�}@tddd�}||v�rd^|d<d
|d<|Sd}nd_|d<||v�r�|	�r�t dA�r?d
|d<tj�|��r*|�d`�|d<|S|�r6|�da�|d<|S|�db�|d<|Stj�|��sS|�sSd|d<dc|d<|StdJ||||�|
d]�}@tddd�}d}t|@t��rx|@|d<d|d<|S||v�r�dd|d<d|dGde<nRtj�|��s�t dA�r�d
|d<|�r�|�df�|d<n7dg�|�|d<n/|�r�tdh||
d]�|�di�|d<n|�dj�|d<nt dA�r�|�dk�|d<n|�dl�|d<|�rdm|k�r�tddv�r�dn}n	dotdv�r�dp}t dA�r�tddv�rtdq|||�|ddr�}@n%tddv�r$tds|||�|	|d|dt�}@ntdu|||�|||d|dt�	}@|@dvk�r�d
|d<|@dwk�rP|	�rJdx�|�}An%dy�|�}An|@dzk�re|	�r^d{�|�}And||�d}�}An
d|d<d~�||@�}Ad|v�r�d�|d|A�|d<|S|A|d<|Sn5tddv�r�tdq|||�|�}@n#tddv�r�tds|||�|	||d��}@ntdu|||�||||d��}@|�r�td�||||�d��}B|@dvk�r�|dd�7<|S|@dwk�r�dw|dGd�<|dd�7<|S|@dzk�rd�|dGd�<|dd�7<|S|@d�k�rd|d<|dd�7<|S|S)�a�
    Verify that a device is mounted

    name
        The path to the location where the device is to be mounted

    device
        The device name, typically the device node, such as ``/dev/sdb1``
        or ``UUID=066e0200-2867-4ebe-b9e6-f30026ca2314`` or ``LABEL=DATA``

    fstype
        The filesystem type, this will be ``xfs``, ``ext2/3/4`` in the case of classic
        filesystems, ``fuse`` in the case of fuse mounts, and ``nfs`` in the case of nfs mounts

    mkmnt
        If the mount point is not present then the state will fail, set ``mkmnt: True``
        to create the mount point if it is otherwise not present

    opts
        A list object of options or a comma delimited list

    dump
        The dump value to be passed into the fstab, Default is ``0``

    pass_num
        The pass value to be passed into the fstab, Default is ``0``

    config
        Set an alternative location for the fstab, Default is ``/etc/fstab``

    persist
        Set if the mount should be saved in the fstab, Default is ``True``

    mount
        Set if the mount should be mounted immediately, Default is ``True``

    user
        The account used to execute the mount; this defaults to the user salt is
        running as on the minion

    match_on
        A name or list of fstab properties on which this state should be applied.
        Default is ``auto``, a special value indicating to guess based on fstype.
        In general, ``auto`` matches on name for recognized special devices and
        device otherwise.

    device_name_regex
        A list of device exact names or regular expressions which should
        not force a remount. For example, glusterfs may be mounted with a
        comma-separated list of servers in fstab, but the /proc/self/mountinfo
        will show only the first available server.

        .. code-block:: jinja

            {% set glusterfs_ip_list = ['10.0.0.1', '10.0.0.2', '10.0.0.3'] %}

            mount glusterfs volume:
              mount.mounted:
                - name: /mnt/glusterfs_mount_point
                - device: {{ glusterfs_ip_list|join(',') }}:/volume_name
                - fstype: glusterfs
                - opts: _netdev,rw,defaults,direct-io-mode=disable
                - mkmnt: True
                - persist: True
                - dump: 0
                - pass_num: 0
                - device_name_regex:
                  - ({{ glusterfs_ip_list|join('|') }}):/volume_name

        .. versionadded:: 2016.11.0

    extra_mount_invisible_options
        A list of extra options that are not visible through the
        ``/proc/self/mountinfo`` interface.

        If a option is not visible through this interface it will always remount
        the device. This option extends the builtin ``mount_invisible_options``
        list.

    extra_mount_invisible_keys
        A list of extra key options that are not visible through the
        ``/proc/self/mountinfo`` interface.

        If a key option is not visible through this interface it will always
        remount the device. This option extends the builtin
        ``mount_invisible_keys`` list.

        A good example for a key option is the password option::

            password=badsecret

    extra_mount_ignore_fs_keys
        A dict of filesystem options which should not force a remount. This will update
        the internal dictionary. The dict should look like this::

            {
                'ramfs': ['size']
            }

    extra_mount_translate_options
        A dict of mount options that gets translated when mounted. To prevent a remount
        add additional options to the default dictionary. This will update the internal
        dictionary. The dictionary should look like this::

            {
                'tcp': 'proto=tcp',
                'udp': 'proto=udp'
            }

    hidden_opts
        A list of mount options that will be ignored when considering a remount
        as part of the state application

        .. versionadded:: 2015.8.2

    bind_mount_copy_active_opts
        If set to ``False``, this option disables the default behavior of
        copying the options from the bind mount if it was found to be active.

        .. versionadded:: 3006.0
    T���name�changes�result�commentFrz"Must provide name to mount.mountedrz$Must provide device to mount.mountedz$Must provide fstype to mount.mountedN�os�ZMacOS�Darwinr
�noowners)�AIX�,�/�mount.active��extended� �\040�bind�device�optsZ	superoptszUUID=�=��"zLABEL=zblkid -t LABEL=zcmd.run_all�retcoderz!Unable to find device with label �.�stdout�:z,^/dev/(?P<vg_name>[^/]+)/(?P<lv_name>[^/]+$)cSs i|]\}}|t�dd|��qS)�-z--)�re�sub)�.0�k�vrrr�
<dictcomp>8s�zmounted.<locals>.<dictcomp>z/dev/mapper/{vg_name}-{lv_name}z^\w+\#(?P<device_name>.+)Zdevice_name�
alt_deviceZdevice_uuidZdevice_label)Z_netdev�actimeo�bgrr
Z
delay_connect�direct-io-modeZintrZloopZnointrZ
nobootwaitZnofail�passwordZ	reconnect�retryZsoftrZusersrZnonemptyZtransform_symlinks�portzbackup-volfile-servers)r1rZcredentialsr3r4r6r5Z
secretfileZramfs�sizez	proto=tcpz	proto=udp)ZtcpZudpz/size=(?P<size_value>[0-9]+)(?P<size_unit>k|m|g)zsize=r-)Zcifs�userzusername={}z	user.infoz
group.info)�uid�gidz[0-9]+$�testz4Remount would be forced because options ({}) changed)�nfsZcvfsZfusez!Forced unmount and mount because zoptions ({}) changedr�umount�mount.umount�mount.mount)�mkmnt�fstyper!zUnable to unmount {}: {}.zForced remount because �
mount.remountZremountzmount.read_mount_cachecsg|]}|�vr|�qSrr)r,�opt�r!rr�
<listcomp>szmounted.<locals>.<listcomp>z3Remount would be forced because options ({})changedz	options (z	) changedzGAn umount will not be forced because device matched device_name_regex: zIAn umount would have been forced because devices do not match.  Watched: z4Forced unmount because devices don't match. Wanted: z (�)z, current: z, �r8zUnable to unmountzTarget was already mountedz would be mountedz would be created and mountedz( does not exist and would not be createdzMount directory is not presentzTarget was successfully mounted�mountz" would be created, but not mountedz:{} does not exist and would neither be created nor mountedz
file.mkdirz was created, not mountedz not present and not mountedz would not be mountedz not mountedr�/etc/auto_saltr�/etc/filesystems�mount.set_automaster)r;�mount.set_filesystems)r;�match_on�mount.set_fstab�present�newzS{} is mounted, but needs to be written to the fstab in order to be made persistent.zC{} needs to be written to the fstab in order to be made persistent.�changez3{} is mounted, but its fstab entry must be updated.zThe z fstab entry must be updated.z�Unable to detect fstab status for mount point {} due to unexpected output '{}' from call to mount.set_fstab. This is most likely a bug.z{}. {})rMzmount.write_mount_cache)r@rAZ
mount_optsz$. Entry already exists in the fstab.�persist�. Added new entry to the fstab.�update�!. Updated the entry in the fstab.�
bad config�#. However, the fstab was not found.r)"�
__grains__�
isinstance�str�split�rstrip�__salt__r�path�realpath�replace�
startswith�sorted�set�append�dirname�upper�strip�lowerr*�match�	groupdict�items�format�existsr�extend�listrTr	�get�len�remove�__opts__�join)Crr rAr@r!�dump�pass_num�configrRrHr8rMZdevice_name_regexZextra_mount_invisible_optionsZextra_mount_invisible_keysZextra_mount_ignore_fs_keysZextra_mount_translate_optionsZhidden_optsZbind_mount_copy_active_opts�kwargs�ret�update_mount_cacheZdevice_list�activeZ	real_nameZcomp_real_nameZ_deviceZ_real_deviceZreal_deviceZ_label�cmd�res�lineZdev_with_labelZ	lvs_matchZdouble_dash_escapedZ
mapper_deviceZ
fuse_matchr0Zuuid_deviceZlabel_deviceZmount_invisible_optionsZmount_invisible_keysZmount_ignore_fs_keysZmount_translate_optionsZtrigger_remountrCZ
keyval_optionZ
size_matchrZname_id_optsZ_givenidZ_paramZ_id�_infoZ_active_superoptsZ_active_optZunmount_resultZmount_resultZremount_resultZmount_cacheZ_missingZ_device_mismatch_is_ignoredZregex�outr�cache_resultrrDr�mounted6s�






�
����
�
���

	
�

������



�


�


�
(�

�



�
����
�
�
���
��



�
�
�
�
�
�
��

�
����
���
�



��
�
��


���

��
��
��&
���
�



r�csf|iddd�}td�}td|�r'td|�}|�d�s&dtj�|���}n|}||vr6d	|�d
�|d<n;tdrGd
|d<d	|�d�|d<n*td|�td�}||vred	|�d�|d<|||d<nd	|�d�|d<d|d<|�r1d}dtdvr�d}d|kr�d}td|��ntd|��tdr�|�vr�|�fdd��D�vr�d
|d<||vr�d�|�|d<|Sd �vrˈd ||krˈd d!d"kr�|Sdtdvr�d
}d|d<|dd#7<|Std$d |d"d%gd&d&|�}|d'kr�|S|d(k�r	d(|dd)<|dd*7<|S|d+k�rd,|dd)<|dd-7<|S|d.k�r1d|d<|dd/7<|S|S)0z�
    Activates a swap device

    .. code-block:: yaml

        /root/swapfile:
          mount.swap

    .. note::
        ``swap`` does not currently support LABEL
    Tr
rzmount.swapszfile.is_linkz
file.readlinkrz/dev/zSwap z already activerr;Nrz is set to be activatedzmount.swaponz
 activatedrz failed to activateFr rr�devrrJ�mount.filesystems�mount.fstabcsg|]}�|d�qS)r r)r,�item��
fstab_datarrrEYs�zswap.<locals>.<listcomp>z;Swap {} is set to be added to the fstab and to be activatedZnonerA�swapz.. swap not present in /etc/filesystems on AIX.rNr
rrOrPrRrSrQrTrUrVrW)r]rarr^�basenamersrXrl)rrRrwryZon_Zreal_swap_device�device_key_namer�rr�rr�'s�

�
����


r�cKsr|iddd�}d}|sd|d<d|d<|Stddd	�}|�d
d�}	|	|vr*d|d<|	|vr}td
r@d|d<d|�d�|d<|S|rNtd|||d�}
d}n
td||d�}
d}t|
t�rf|
|d<d|d<n|
durud|d<d|dd<nd|d<d|d<|r�td|�}|�r7d}tddvr�|dkr�d}td|�}
ndtdvr�d}|dkr�d }td!|�}
ntd"|�}
||
vr�|dd#7<|S|r�|
|||kr�|dd$�|�7<|Std
r�d|d<d%�||�|d<|Stddvr�td&|||�}
ndtdv�rtd'|||�}
ntd(|||�}
|
du�r)d|d<|dd)7<|S|dd*7<d+|dd,<|S)-aj
    .. versionadded:: 0.17.0

    Verify that a device is not mounted

    name
        The path to the location where the device is to be unmounted from

    device
        The device to be unmounted.  This is optional because the device could
        be mounted in multiple places.

        .. versionadded:: 2015.5.0

    config
        Set an alternative location for the fstab, Default is ``/etc/fstab``

    persist
        Set if the mount should be purged from the fstab, Default is ``False``

    user
        The user to own the mount; this defaults to the user salt is
        running as on the minion
    Tr
rFrz$Must provide name to mount.unmountedrrrrrzTarget was already unmountedr;NzMount point z is mounted but should not ber>rGz!Target was successfully unmountedrr=z.Execute set to False, Target was not unmountedzmount.delete_mount_cacher rrrrI�mount.automasterrr�rJr�r�z. fstab entry not foundz%. fstab entry for device {} not foundzPMount point {} is unmounted but needs to be purged from {} to be made persistent�mount.rm_automaster�mount.rm_filesystems�mount.rm_fstabz. Failed to persist purgez. Removed target from fstabZpurgedrR)r]r`rsrYrZrXrl)rr rwrRr8rxryrzr{Z	comp_namer�r�r�r�rrr�	unmounted�s�

���
�r�cKs�|iddd�}|ddkr9td||dd|d	|d
|d�}|r*|�d�|d
<|Sd|d<|�d|��|d
<|Sd�|d�|d
<|S)ab
    The mounted watcher, called to invoke the watch command.

    .. note::
        This state exists to support special handling of the ``watch``
        :ref:`requisite <requisites>`. It should not be called directly.

        Parameters for this function should be set by the state being triggered.

    name
        The name of the mount point

    Tr
rZsfunr�rBr FrAr!rGz
 remountedrrz failed to remount: z&Watch not supported in {} at this time)r]rl)rr8rxryr�rrr�	mod_watch�s���r�cCs�|r|dkr|�d�s|�|���d��r|S|�d�r#td|�}ntd|d�}d}t|�dkrQ|dkr>tt|��}|S|��}|�dtt|����|��}|S)z�
    Convert a device name, UUID or LABEL to a device name, UUID or
    LABEL.

    Return the fs_spec required for fstab.

    r rr"z
disk.blkid)�tokenNr#)rarfr]rq�next�iter�values)Zmaybe_deviceZ
convert_toZblkidr�keyrrr�_convert_tos"��
�r�cCsr|digd�}|dkrtddvrd}ntddkrd}|d	kr1tddvr)d
}ntddkr1d}|dks:|�d�}t||�}
|
sPd
}|d�|�||��|Stdr�tddvrhtd||
|||d|
d�}n&tddkr~td||
||||d|	|
d�	}ntd||
|||||d|	|
d�
}d|d<|dkr�d}|d�|�||��|S|dkr�d}|d�|�||��|r�d|�d|��}|d�|�|S|dkr�d }|d�|�||��|Sd|d<d!}|d�|�|||��|Stddv�rtd||
||||
d"�}n%tddk�rtd||
|||||	|
d#�}ntd||
||||||	|
d$�	}d|d<|dk�rAd%}|d�|�||��|S|dk�r�||d&d'<d(}|d�|�||��|�r�td)|�}t|�tk�rzd|d<d*�|j	d+d,d-�d,�}nd.|�d|��}|d�|�|S|dk�r�||d&d'<d/}|d�|�||��|Sd|d<d0}|d�|�|||��|S)1a�Makes sure that a fstab mount point is present.

    name
        The name of block device. Can be any valid fs_spec value.

    fs_file
        Mount point (target) for the filesystem.

    fs_vfstype
        The type of the filesystem (e.g. ext4, xfs, btrfs, ...)

    fs_mntops
        The mount options associated with the filesystem. Default is
        ``defaults``.

    fs_freq
        Field is used by dump to determine which fs need to be
        dumped. Default is ``0``

    fs_passno
        Field is used by fsck to determine the order in which
        filesystem checks are done at boot time. Default is ``0``

    fs_mount
        Field is used only in AIX systems to determine if the
        filesystem will be mounted by ``mount all``

    mount_by
        Select the final value for fs_spec. Can be [``None``,
        ``device``, ``label``, ``uuid``, ``partlabel``,
        ``partuuid``]. If ``None``, the value for fs_spect will be the
        parameter ``name``, in other case will search the correct
        value based on the device name. For example, for ``uuid``, the
        value for fs_spec will be of type 'UUID=xxx' instead of the
        device name set in ``name``.

    config
        Place where the fstab file lives. Default is ``/etc/fstab``

    mount
        Set if the mount should be mounted immediately. Default is
        ``True``

    match_on
        A name or list of fstab properties on which this state should
        be applied.  Default is ``auto``, a special value indicating
        to guess based on fstype.  In general, ``auto`` matches on
        name for recognized special devices and device otherwise.

    not_change
        By default, if the entry is found in the fstab file but is
        different from the expected content (like different options),
        the entry will be replaced with the correct content. If this
        parameter is set to ``True`` and the line is found, the
        original content will be preserved.

    F�rrrrr
rrrrr
rrIrJrz#Device {} cannot be converted to {}rr;rKT)rr rAr!rwr;�
not_changerL)	rr rAr!rHrwr;rMr�rN)
rr rAr!rurvrwr;rMr�NrrOz{} entry is already in {}.rPz{} entry will be written in {}.zWill mount z on rQz{} entry will be updated in {}.z%{} entry cannot be created in {}: {}.)rr rAr!rwr�)rr rAr!rHrwrMr�)	rr rAr!rurvrwrMr�z{} entry was already in {}.rrRz{} entry added in {}.r?zError while mounting {}r(r#)�maxsplitzMounted z{} entry updated in {}.z%{} entry cannot be changed in {}: {}.)
rXr\r�rdrlrsr]�typerZr[)r�fs_fileZ
fs_vfstypeZ	fs_mntopsZfs_freqZ	fs_passno�mount_byrwrHrMr�Zfs_mountry�fs_spec�msgr�rrr�
fstab_present>sH�

�	��������

�

��r�c	Cs�|digd�}|dkrtddvrd}ntddkrd}|d	ks%|�d	�}t||�}tddvr7td
|�}ntddkrDtd|�}ntd|�}td
rtd|d<||vred}|d�|�||��|Sd}|d�|�||��|S||vr�tddvr�td|||d�}ntddkr�td|||d�}n	td|||d�}|dur�d|d<d}|d�|�||��|Sd|d<d|dd<d}|d�|�||��|Sd|d<d}|d�|�||��|S)a�
    Makes sure that a fstab mount point is absent.

    name
        The name of block device. Can be any valid fs_spec value.

    fs_file
        Mount point (target) for the filesystem.

    mount_by
        Select the final value for fs_spec. Can be [``None``,
        ``device``, ``label``, ``uuid``, ``partlabel``,
        ``partuuid``]. If ``None``, the value for fs_spect will be the
        parameter ``name``, in other case will search the correct
        value based on the device name. For example, for ``uuid``, the
        value for fs_spec will be of type 'UUID=xxx' instead of the
        device name set in ``name``.

    config
        Place where the fstab file lives

    Fr�rrrrIrrJrr�r�r�r;Nrz"{} entry is already missing in {}.rz!{} entry will be removed from {}.r�)rr rwr�r�Tz&{} entry failed when removing from {}.ZremovedrrRz{} entry removed from {}.)rXr\r�r]rsrdrl)	rr�r�rwryr�r�r�r�rrr�fstab_absentsj�

������r�)Fr
rrrTTNrNNNNNNT)Tr)NrFN)N)	r
rrNrTrFT)Nr)�__doc__�loggingZos.pathrr*�	getLogger�__name__�logr	r�r�r�r�r�r�r�rrrr�<module>sZ%


�
vb
�
u'
�\