HEX
Server: Apache
System: Linux server2.voipitup.com.au 4.18.0-553.104.1.lve.el8.x86_64 #1 SMP Tue Feb 10 20:07:30 UTC 2026 x86_64
User: posscale (1027)
PHP: 8.2.29
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //opt/saltstack/salt/lib/python3.10/site-packages/salt/modules/__pycache__/netbox.cpython-310.pyc
o

�N�g݀�@s�dZddlZddlZddlmZzddlZdZWney#dZYnwe�e	�Z
dZddd	�Zd
d�Z
dd
�ZdVdd�Zdd�Zdd�Zdd�Zdd�ZdWdd�Zdd�Zdd�ZdXdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Z		.	.	.dYd/d0�Zd1d2�Z d3d4�Z!dXd5d6�Z"dXd7d8�Z#dXd9d:�Z$						dZd;d<�Z%d=d>�Z&d?d@�Z'dAdB�Z(dCdD�Z)dXdEdF�Z*d[dGdH�Z+dIdJ�Z,dXdKdL�Z-dXdMdN�Z.dOdP�Z/dXdQdR�Z0	Sd\dTdU�Z1dS)]a�
NetBox
======

Module to query NetBox

:codeauthor: Zach Moody <zmoody@do.co>
:maturity:   new
:depends:    pynetbox

The following config should be in the minion config file. In order to
work with ``secrets`` you should provide a token and path to your
private key file:

.. code-block:: yaml

  netbox:
    url: <NETBOX_URL>
    token: <NETBOX_USERNAME_API_TOKEN (OPTIONAL)>
    keyfile: </PATH/TO/NETBOX/KEY (OPTIONAL)>

.. versionadded:: 2018.3.0
�N)�CommandExecutionErrorTF)Zsecrets�filter�get)�filter_�get_cCstsdSdS)z%
    pynetbox must be installed.
    )FzPThe netbox execution module cannot be loaded: pynetbox library is not installed.T)�HAS_PYNETBOX�rr�G/opt/saltstack/salt/lib/python3.10/site-packages/salt/modules/netbox.py�__virtual__,sr
cCstdd�}|std��|S)Nz
config.getZnetboxz8NetBox execution module configuration could not be found)Z__salt__r)�configrrr	�_config:s�rcCsBi}t��d�|d<|rt��d�|d<tjt��d�fi|��S)N�token�keyfileZprivate_key_file�url)rr�pynetboxZapi)�
auth_requiredZpynb_kwargsrrr	�_nb_objCs
rcCs:d|��vr	|d=|��D]
\}}t|t�rt|�q
|S)Nr)�keys�items�
isinstance�dict�_strip_url_field)Z
input_dict�k�vrrr	rKs
�rcCs|rt|�SiS�N)r)�iterablerrr	�_dictTsrc
Csltdd�}ztt||�|�jdi|��WStjy5}zt�d|jjj	|j
|j�WYd}~dSd}~ww)z
    POST a payload
    T�r�
%s, %s, %sNFr)r�getattr�creater�RequestError�log�error�req�request�headers�request_body)�app�endpoint�payload�nb�errr	�_add[s
��r-cCs$t�dd|�����}t�dd|�S)z�'
    Slugify given value.
    Credit to Djangoproject https://docs.djangoproject.com/en/2.0/_modules/django/utils/text/#slugify
    z[^\w\s-]�z[-\s]+�-)�re�sub�strip�lower)�valuerrr	�slugifygsr5cKsZt|d�}|rtt||�|��|�}|Stddi|��}tt||�|�jdi|��}|S)z�
    Helper function to do a GET request to Netbox.
    Returns the actual pynetbox object, which allows manipulation from other functions.
    r�args.clean_kwargsNr)rrr�	__utils__)r(r)�idr�kwargsr+�itemrrr	�_getps
�r;cCs"|�d�}t|�dkr
|S|dfS)N�.��0)�split�len)�if_nameZ
if_name_splitrrr	�
_if_name_unit~s
rBcKsZg}t|tvr	dndd�}tt||�|�jditddi|����}|r+dd�|D�}|S)	aH
    Get a list of items from NetBox.

    app
        String of netbox app, e.g., ``dcim``, ``circuits``, ``ipam``
    endpoint
        String of app endpoint, e.g., ``sites``, ``regions``, ``devices``
    kwargs
        Optional arguments that can be used to filter.
        All filter keywords are available in Netbox,
        which can be found by surfing to the corresponding API endpoint,
        and clicking Filters. e.g., ``role=router``

    Returns a list of dictionaries

    .. code-block:: bash

        salt myminion netbox.filter dcim devices status=1 role=router
    TFrr6cSsg|]}tt|���qSr)rr)�.0�irrr	�
<listcomp>�szfilter_.<locals>.<listcomp>Nr)r�AUTH_ENDPOINTSrrr7)r(r)r9�retr+Znb_queryrrr	r�s�rcKs(tt||f||tvrdndd�|���S)a
    Get a single item from NetBox.

    app
        String of netbox app, e.g., ``dcim``, ``circuits``, ``ipam``
    endpoint
        String of app endpoint, e.g., ``sites``, ``regions``, ``devices``

    Returns a single dictionary

    To get an item based on ID.

    .. code-block:: bash

        salt myminion netbox.get dcim devices id=123

    Or using named arguments that correspond with accepted filters on
    the NetBox endpoint.

    .. code-block:: bash

        salt myminion netbox.get dcim devices name=my-router
    TF)r8r)rr;rF)r(r)r8r9rrr	r�s����rcCsDtdd|d�}|rdS|t|�d�}tdd|�}|r dd|iiSdS)z�
    .. versionadded:: 2019.2.0

    Create a device manufacturer.

    name
        The name of the manufacturer, e.g., ``Juniper``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_manufacturer Juniper
    �dcim�
manufacturers��nameF�rK�slug�rr5r-)rK�nb_manr*Zmanrrr	�create_manufacturer��rPcCs�tdd|d�}|rdStdd|d�}d}|st|�}||dt|�d	�}tdd|�}dd|ii}|r;|d�|d�|r?|SdS)
am
    .. versionadded:: 2019.2.0

    Create a device type. If the manufacturer doesn't exist, create a new manufacturer.

    model
        String of device model, e.g., ``MX480``
    manufacturer
        String of device manufacturer, e.g., ``Juniper``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_device_type MX480 Juniper
    rH�device-types��modelFrIrJNr8)rT�manufacturerrM)rrPr5r-�update)rTrU�nb_typerOZnew_manr*�typZret_dictrrr	�create_device_type�srYcCsFtdd|d�}|rdS|t|�|d�}tdd|�}|r!dd|iiSdS)z�
    .. versionadded:: 2019.2.0

    Create a device role

    role
        String of device role, e.g., ``router``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_device_role router
    rH�device-rolesrJF)rKrM�colorrN)�roler[�nb_roler*rrr	�create_device_rolesr^cCsHtddt|�d�}|r
dS|t|�d�}tdd|�}|r"dd|iiSdS)z�
    .. versionadded:: 2019.2.0

    Create a new device platform

    platform
        String of device platform, e.g., ``junos``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_platform junos
    rHZ	platforms�rMFrLrN)�platformZnb_platformr*�platrrr	�create_platformsrbcCsDtdd|d�}|rdS|t|�d�}tdd|�}|r dd|iiSdS)z�
    .. versionadded:: 2019.2.0

    Create a new device site

    site
        String of device site, e.g., ``BRU``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_site BRU
    rH�sitesrJFrLrN)�site�nb_siter*rrr	�create_site:rQrfc
Cs�z+tdd|d�}|s
WdStdd|d�}|sWdStdd|d�}|s%WdSdd	d
�}Wn!tjyL}	zt�d|	jjj|	j|	j�WYd}	~	dSd}	~	ww||t	|�|d
|d
|d
d�}
t
dd|
�}|rldd|
iiSdS)aU
    .. versionadded:: 2019.2.0

    Create a new device with a name, role, model, manufacturer and site.
    All these components need to be already in Netbox.

    name
        The name of the device, e.g., ``edge_router``
    role
        String of device role, e.g., ``router``
    model
        String of device model, e.g., ``MX480``
    manufacturer
        String of device manufacturer, e.g., ``Juniper``
    site
        String of device site, e.g., ``BRU``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_device edge_router router MX480 Juniper BRU
    rHrZrJFrRrSrcZActive�)Zlabelr4rNr8)rKZdisplay_namerMZdevice_typeZdevice_rolerd�devices)rrr!r"r#r$r%r&r'r5r-)rKr\rTrUrdr]rWre�statusr,r*Znew_devrrr	�
create_deviceUs6���rjc
Ks�tdd	i|��}tddd|d�}|��D]
\}}t|||�qz|��dd|iiWStjyL}zt�d|j	j
j|j|j�WYd}~dSd}~ww)
ad
    .. versionadded:: 2019.2.0

    Add attributes to an existing device, identified by name.

    name
        The name of the device, e.g., ``edge_router``
    kwargs
       Arguments to change in device, e.g., ``serial=JN2932930``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.update_device edge_router serial=JN2932920
    r6rHrhT)rrKrNFr)
r7r;r�setattr�saverr!r"r#r$r%r&r')rKr9�	nb_devicerrr,rrr	�
update_device�s��rnr.c
Cs�tdd|d�}|sdS|r!tdd|d�}|s!t|�tdd|d�}|d||||dd�}|r4|d|d	<tdd
|�}	|	rBdd
|iiS|	S)a�
    .. versionadded:: 2019.2.0

    Add an inventory item to an existing device.

    device_name
        The name of the device, e.g., ``edge_router``.
    item_name
        String of inventory item name, e.g., ``Transceiver``.

    manufacturer_name
        String of inventory item manufacturer, e.g., ``Fiberstore``.

    serial
        String of inventory item serial, e.g., ``FS1238931``.

    part_id
        String of inventory item part id, e.g., ``740-01234``.

    description
        String of inventory item description, e.g., ``SFP+-10G-LR``.

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_inventory_item edge_router Transceiver part_id=740-01234
    rHrhrJFrIr8N)�devicerK�description�serial�part_id�parentrU�inventory-items)rrPr-)
�device_nameZ	item_nameZmanufacturer_namerqrrrprmrOr*Zdonerrr	�create_inventory_item�s*$�rvcCs(tddd|d�}|��ddd|iiiS)a
    .. versionadded:: 2019.2.0

    Remove an item from a devices inventory. Identified by the netbox id

    item_id
        Integer of item to be deleted

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.delete_inventory_item 1354
    rHrtT�rr8�DELETE�r;�delete)Zitem_idZnb_inventory_itemrrr	�delete_inventory_item�sr{cCs2||d�}tdd|�}|rdd|d|iiiS|S)a,
    .. versionadded:: 2019.2.0

    Create an interface connection between 2 interfaces

    interface_a
        Interface id for Side A
    interface_b
        Interface id for Side B

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_interface_connection 123 456
    )�interface_a�interface_brHzinterface-connectionsr8)r-)r|r}r*rGrrr	�create_interface_connection�s

r~cKs0|std}tdd|d�}tdd|di|��S)	am
    .. versionadded:: 2019.2.0

    Returns interfaces for a specific device using arbitrary netbox filters

    device_name
        The name of the device, e.g., ``edge_router``
    kwargs
        Optional arguments to be used for filtering

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.get_interfaces edge_router name="et-0/0/5"

    r8rHrhrJ�
interfaces�	device_idN)rHr�Z__opts__rr�rur9Z
netbox_devicerrr	�get_interfacessr�c	Cs2i}t|d�}t|d�}|D]�}t|d�\}}||vr'd|idiid�||<|dkrx|d||dd<|drg||dkrLt|d�||dd<nd	d|ddt|d�iiiii}td
|||�||<|drwt|d�||dd<qdt|�|dd�i||d	d|<|dr�t|d�||d	d|dd<q|D]n}|d
�d�\}	}
|dd}t|�\}}d�|d�}|||d	dvr�dt|�dd�i||d	d|<|||d	d|vr�dd
iii||d	d||<d|	t|
�d�i||d	d||dd
|	<q�dd|iiS)a}
    .. versionadded:: 2019.2.0

    Return a dictionary structured as standardised in the
    `openconfig-interfaces <http://ops.openconfig.net/branches/models/master/openconfig-interfaces.html>`_
    YANG model, containing physical and configuration data available in Netbox,
    e.g., IP addresses, MTU, enabled / disabled, etc.

    device_name: ``None``
        The name of the device to query the interface data for. If not provided,
        will use the Minion ID.

    CLI Example:

    .. code-block:: bash

        salt '*' netbox.openconfig_interfaces
        salt '*' netbox.openconfig_interfaces device_name=cr1.thn.lon
    �rurKZsubinterface)r�
subinterfacesr>�enabledrrpr�zdictupdate.updateZmtu)�indexr��address�/�	interfacezipv{}�familyT�	addresses)�ip�
prefix_lengthr)r��get_ipaddressesrB�strr7�intr?�format)ruZoc_ifrZipaddressesr�rA�if_unitZsubif_descr�	ipaddressr�r�Zipvkeyrrr	�openconfig_interfaces,st


����������
��������r�cCs�i}t|d�}|D]0}|dsq	t|d�\}}|dd}||vr/|ddd�diid�||<i||d	d|<q	d
dd|iiiS)
a�
    .. versionadded:: 2019.2.0

    Return a dictionary structured as standardised in the
    `openconfig-lacp <http://ops.openconfig.net/branches/models/master/openconfig-lacp.html>`_
    YANG model, with configuration data for Link Aggregation Control Protocol
    (LACP) for aggregate interfaces.

    .. note::
        The ``interval`` and ``lacp_mode`` keys have the values set as ``SLOW``
        and ``ACTIVE`` respectively, as this data is not currently available
        in Netbox, therefore defaulting to the values defined in the standard.
        See `interval <http://ops.openconfig.net/branches/models/master/docs/openconfig-lacp.html#lacp-interfaces-interface-config-interval>`_
        and `lacp-mode <http://ops.openconfig.net/branches/models/master/docs/openconfig-lacp.html#lacp-interfaces-interface-config-lacp-mode>`_
        for further details.

    device_name: ``None``
        The name of the device to query the LACP information for. If not provided,
        will use the Minion ID.

    CLI Example:

    .. code-block:: bash

        salt '*' netbox.openconfig_lacp
        salt '*' netbox.openconfig_lacp device_name=cr1.thn.lon
    r��lagrKZSLOWZACTIVE)rK�intervalZ	lacp_mode�member)r�membersr�Zlacprr�)r�rB)ruZoc_lacprr�rAr�Z	parent_ifrrr	�openconfig_lacps 
�
�r�cCs�tdd|d�}|sdS|rtdd|d|d�}	|	sdS|sd}|s#d	}|d|||d
d�}
|dur5||
d
<|r;d|
d
<|rC|	d|
d<|rI||
d<tdd|d|d�}|s[tdd|
�}|rgdd|d|
iiiS|S)a�
    .. versionadded:: 2019.2.0

    Attach an interface to a device. If not all arguments are provided,
    they will default to Netbox defaults.

    device_name
        The name of the device, e.g., ``edge_router``
    interface_name
        The name of the interface, e.g., ``TenGigE0/0/0/0``
    mac_address
        String of mac address, e.g., ``50:87:89:73:92:C8``
    description
        String of interface description, e.g., ``NTT``
    enabled
        String of boolean interface status, e.g., ``True``
    lag:
        Boolean of interface lag status, e.g., ``True``
    lag_parent
        String of interface lag parent name, e.g., ``ae13``
    form_factor
        Integer of form factor id, obtained through _choices API endpoint, e.g., ``200``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_interface edge_router ae13 description="Core uplink"
    rHrhrJFrr8�r�rKr.�falsei�)rorKrpr��form_factorNr���r��mac_address�rr-)ru�interface_namer�rpr�r�Z
lag_parentr�rmZ
lag_interfacer*�nb_interfacerrr	�create_interface�sF'���r�c
Ks�tdd|d�}tddd|d|d�}|sdS|sdStd	di|����D]
\}}t|||�q%z|��dd|jt|�iiiWStj	ya}zt
�d
|jj
j|j|j�WYd}~dSd}~ww)
a�
    .. versionadded:: 2019.2.0

    Update an existing interface with new attributes.

    device_name
        The name of the device, e.g., ``edge_router``
    interface_name
        The name of the interface, e.g., ``ae13``
    kwargs
        Arguments to change in interface, e.g., ``mac_address=50:87:69:53:32:D0``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.update_interface edge_router ae13 mac_address=50:87:69:53:32:D0
    rHrhrJrTr8�rr�rKFr6rNr)rr;r7rrkrlr8rrr!r"r#r$r%r&r')rur�r9rmr�rrr,rrr	�update_interface�s,���r�cCsLtdd|d�}tddd|d|d�}|r$|��ddd|j|jiiiiSd	S)
aF
    .. versionadded:: 2019.2.0

    Delete an interface from a device.

    device_name
        The name of the device, e.g., ``edge_router``.

    interface_name
        The name of the interface, e.g., ``ae13``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.delete_interface edge_router ae13
    rHrhrJrTr8r�rxF)rr;rzr8rK)rur�rmr�rrr	�delete_interface)s��r�cCst||dd�S)aG
    .. versionadded:: 2019.2.0

    Update an interface to be a LAG.

    device_name
        The name of the device, e.g., ``edge_router``.

    interface_name
        The name of the interface, e.g., ``ae13``.

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.make_interface_lag edge_router ae13
    r�)r�)r�)rur�rrr	�make_interface_lagKsr�cCs@tdd|d�}tdd|d|d�}|r|rt|||dd�SdS)	a�
    .. versionadded:: 2019.2.0

    Set an interface as part of a LAG.

    device_name
        The name of the device, e.g., ``edge_router``.

    interface_name
        The name of the interface to be attached to LAG, e.g., ``xe-1/0/2``.

    parent_name
        The name of the LAG interface, e.g., ``ae13``.

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.make_interface_child xe-1/0/2 ae13
    rHrhrJrr8r�)r�F)rr�)rur��parent_namermZ	nb_parentrrr	�make_interface_child`s
r�cKs0|std}tdd|d�}td	d|di|��S)
ak
    .. versionadded:: 2019.2.0

    Filters for an IP address using specified filters

    device_name
        The name of the device to check for the IP address
    kwargs
        Optional arguments that can be used to filter, e.g., ``family=4``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.get_ipaddresses device_name family=4
    r8rHrhrJ�ipam�ip-addressesr�N)r�r�r�r�rrr	r�}sr�c	Cs�d}||d�}|r>|r>tdd|d�}|sdStdd|d|d	�}|s$dStd
d||d|d�}|r8t�|�dS|d|d
<td
d|�}|rLd
d|iiS|S)a
    .. versionadded:: 2019.2.0

    Add an IP address, and optionally attach it to an interface.

    ip_address
        The IP address and CIDR, e.g., ``192.168.1.1/24``
    family
        Integer of IP family, e.g., ``4``
    device
        The name of the device to attach IP to, e.g., ``edge_router``
    interface
        The name of the interface to attach IP to, e.g., ``ae13``

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_ipaddress 192.168.1.1/24 4 device=edge_router interface=ae13
    N)r�r�rHrhrJFrr8r�r�r�)�qZinterface_idr�r�)rr"r#r-)	�
ip_addressr�ror�Znb_addrr*rmr�Zipaddrrrr	�create_ipaddress�s4
��
r�cCs0tddd|d�}|r|��ddd|iiiSdS)a.
    .. versionadded:: 2019.2.0

    Delete an IP address. IP addresses in Netbox are a combination of address
    and the interface it is assigned to.

    id
        The Netbox id for the IP address.

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.delete_ipaddress 9002
    r�r�Trwrxz
ip-addressFry)Z	ipaddr_idZ	nb_ipaddrrrr	�delete_ipaddress�s
r�cCs�tdd|d�}i}|r$|d|krdSt�d||�td|�d|����|t|�d	�}|r1||d<tdd|�}|rCdd|d
|iiiS|S)a
    .. versionadded:: 2019.2.0

    Create a new Netbox circuit provider

    name
        The name of the circuit provider
    asn
        The ASN of the circuit provider

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_circuit_provider Telia 1299
    �circuits�	providersrJ�asnFz-Duplicate provider with different ASN: %s: %sz'Duplicate provider with different ASN: z: rLr8)rr"r#rr5r-)rKr��nb_circuit_providerr*Zcircuit_providerrrr	�create_circuit_provider�s �r�cCs(|rtdd|d�}|Stdd|d�}|S)a1
    .. versionadded:: 2019.2.0

    Get a circuit provider with a given name and optional ASN.

    name
        The name of the circuit provider
    asn
        The ASN of the circuit provider

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.get_circuit_provider Telia 1299
    r�r�)r�rJ)r)rKr�r�rrr	�get_circuit_providers
�r�cCsPtddt|�d�}|r
dS|t|�d�}tdd|�}|r&dd|d|iiiS|S)z�
    .. versionadded:: 2019.2.0

    Create a new Netbox circuit type.

    name
        The name of the circuit type

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_circuit_type Transit
    r��
circuit-typesr_FrLr8rN)rK�nb_circuit_typer*�circuit_typerrr	�create_circuit_typesr�c	Cs�tdd|�}tddt|�d�}|rB|rB||d|dd�}|r#||d<tdd|d�}|r.d	Stdd|�}|r@dd|d|iiiS|Sd	S)
a�
    .. versionadded:: 2019.2.0

    Create a new Netbox circuit

    name
        Name of the circuit
    provider_id
        The netbox id of the circuit provider
    circuit_type
        The name of the circuit type
    asn
        The ASN of the circuit provider
    description
        The description of the circuit

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_circuit NEW_CIRCUIT_01 Telia Transit 1299 "New Telia circuit"
    r�r�r�r_r8)�cidZprovider�typerp�r�FrN)	rKZprovider_idr�rpr�r�r*�
nb_circuit�circuitrrr	�create_circuit9s"�r��AcCs�tdd|d�}tdd|d|d�}tdd|d�}|rS|rUtdd	|d
d�}	|	r)dS|d|d|d
d||d�}
|r?||
d<tdd	|
�}|rQdd	|d|
iiiS|SdSdS)a?
    .. versionadded:: 2019.2.0

    Terminate a circuit on an interface

    circuit
        The name of the circuit
    interface
        The name of the interface to terminate on
    device
        The name of the device the interface belongs to
    speed
        The speed of the circuit, in Kbps
    xconnect_id
        The cross-connect identifier
    term_side
        The side of the circuit termination

    CLI Example:

    .. code-block:: bash

        salt myminion netbox.create_circuit_termination NEW_CIRCUIT_01 xe-0/0/1 myminion 10000 xconnect_id=XCON01
    rHrhrJrr8r�r�r�zcircuit-terminationsr�)r�Frd)r�r�rdZ
port_speed�	term_side�xconnect_idNr�)r�r�roZspeedr�r�rmr�r�Znb_terminationr*Zcircuit_terminationrrr	�create_circuit_terminationgs.
����r�)F)NFr)Nr.r.r.)NNNNNN)NN)Nr�)2�__doc__�loggingr0Zsalt.exceptionsrrr�ImportError�	getLogger�__name__r"rFZ__func_alias__r
rrrrr-r5r;rBrrrPrYr^rbrfrjrnrvr{r~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr	�<module>sz�


		
	
##8 
�=


S3
�P*"

3

'
/�