§
    ±ÛgP ã                   óÂ  — 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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m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 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 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" 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' ddlm(Z( ddlm)Z) ddlm*Z* ddlm+Z+ g d¢Z, e-e	d ¦  «        r(e, .                    d!„  e/e¦  «        D ¦   «         ¦  «         d"Z0ej1         2                    d# ej3        ¦   «         › d$�¦  «        Z4ej1         2                    d# ej3        ¦   «         › d%�¦  «        Z5 e-ed&¦  «        Z6 e-ed'¦  «        Z7 ej8        d(¦  «        Z9 ej:        ¦   «         Z;da<ej=        d)k    Z>d*Z? ej@        d+d, eAe
jB        ¦  «        i¦  «        ZCeCjD        ZD G d-„ d.ej@        ¦  «        ZE eF¦   «          G                    eEjH        ¦  «         ejI        ejJ        ejK        ejL        ejM        ejN        ejO        ejO        ejP        ejQ        ejR        ejS        d/œZTejU        ejV        ejW        ejX        ejY        ejZ        ej[        ej\        ej]        ej^        ej_        d0œZ` ed1g d2¢¦  «        Za ed3g d4¢¦  «        Zb ed5g d6¢¦  «        Zc ed7d8¦  «        Zd ed9edje        d:z   ¦  «        Zf ed;g d<¢¦  «        Zg ed=d>d? h                    egje        ¦  «        z   ¦  «        Zi ed@g dA¢¦  «        Zj edBg dC¢¦  «        ZkdD„ ZldE„ ZmdF„ Zne$dG„ ¦   «         Zo	  eodH¦  «         n7# ep$ r/Zq e dIeq›�¦  «           edJdK¦  «        dLdLdL¦  «        arY dZq[qndZq[qww xY wdM„ ZsdN„ ZtdO„ ZudP„ ZvdQ„ ZwdR„ ZxdS„ ZydT„ ZzdU„ Z{ej1         2                    dV¦  «        sej1         2                    dW¦  «        rdX„ Z|ndY„ Z|ej}        Z} G dZ„ d[ep¦  «        Z~ G d\„ d]¦  «        Z e¦   «         Z€drd_„Z�d`„ Z‚da„ Zƒej„        Z„dsdc„Z… G dd„ de¦  «        Z†dsdf„Z‡dg„ Zˆdh„ Z‰di„ ZŠdj„ Z‹dk„ ZŒdl„ Z�dm„ ZŽdn„ Z�do„ Z� G dp„ dq¦  «        Z‘dS )tzLinux platform implementation.é    N)Údefaultdict)Ú
namedtupleé   )Ú_common)Ú_psposix)Ú_psutil_linux)Ú_psutil_posix)ÚENCODING)ÚNIC_DUPLEX_FULL)ÚNIC_DUPLEX_HALF)ÚNIC_DUPLEX_UNKNOWN)ÚAccessDenied)ÚNoSuchProcess)ÚZombieProcess)Úbcat)Úcat)Údebug)Údecode)Úget_procfs_path)Úisfile_strict)Úmemoize)Úmemoize_when_activated)Úopen_binary)Ú	open_text)Úparse_environ_block)Úpath_exists_strict)Úsupports_ipv6)Úusage_percent)ÚPROCFS_PATHÚIOPRIO_CLASS_NONEÚIOPRIO_CLASS_RTÚIOPRIO_CLASS_BEÚIOPRIO_CLASS_IDLEÚCONN_ESTABLISHEDÚCONN_SYN_SENTÚCONN_SYN_RECVÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_TIME_WAITÚ
CONN_CLOSEÚCONN_CLOSE_WAITÚCONN_LAST_ACKÚCONN_LISTENÚCONN_CLOSINGÚprlimitc                 ód   — g | ]-}|                      d ¦  «        ¯|                     ¦   «         ¯+|‘Œ.S )ÚRLIM)Ú
startswithÚisupper©Ú.0Úxs     úE/granary/edev/quantum/lib/python3.11/site-packages/psutil/_pslinux.pyú
<listcomp>r8   A   s6   € ÐFÐFÐFˆq §¢¨fÑ!5Ô!5ÐF¸!¿)º)¹+¼+ÐFˆÐFÐFÐFó    z/sys/class/power_supplyú/proc/ú/smapsú/smaps_rollupÚproc_ioprio_getÚproc_cpu_affinity_getÚ
SC_CLK_TCKÚlittlei   ÚAddressFamilyÚAF_LINKc                   ó   — e Zd ZdZdZdZdZdS )Ú
IOPriorityr   r   é   é   N)Ú__name__Ú
__module__Ú__qualname__r    r!   r"   r#   © r9   r7   rD   rD   k   s&   € € € € € ØÐØ€OØ€OØÐÐÐr9   rD   )ÚRÚSÚDÚTÚtÚZÚXr6   ÚKÚWÚIÚP)Ú01Ú02Ú03Ú04Ú05Ú06Ú07Ú08Ú09Ú0AÚ0BÚsvmem)ÚtotalÚ	availableÚpercentÚusedÚfreeÚactiveÚinactiveÚbuffersÚcachedÚsharedÚslabÚsdiskio)	Ú
read_countÚwrite_countÚ
read_bytesÚwrite_bytesÚ	read_timeÚ
write_timeÚread_merged_countÚwrite_merged_countÚ	busy_timeÚ	popenfile)ÚpathÚfdÚpositionÚmodeÚflagsÚpmemz"rss vms shared text lib data dirtyÚpfullmem)ÚussÚpssÚswapÚpmmap_grouped)rx   ÚrssÚsizer€   Úshared_cleanÚshared_dirtyÚprivate_cleanÚprivate_dirtyÚ
referencedÚ	anonymousr�   Ú	pmmap_extzaddr perms ú Úpio)rn   ro   rp   rq   Ú
read_charsÚwrite_charsÚ	pcputimes)ÚuserÚsystemÚchildren_userÚchildren_systemÚiowaitc                 óþ   — t          | t          ¦  «        s
J | ¦   «         ‚t          j        | ¦  «        } |                      d¦  «        d         } |                      d¦  «        rt          | ¦  «        s
| dd…         } | S )zWrapper around os.readlink().ú r   ú
 (deleted)Néöÿÿÿ)Ú
isinstanceÚstrÚosÚreadlinkÚsplitÚendswithr   ©rx   s    r7   r�   r�   Ç   s   € å�d�CÑ Ô Ð&Ð& $Ñ&Ô&Ð&ÝŒ;�tÑÔ€Dð �:Š:�fÑÔ˜aÔ €Dð ‡}‚}�\Ñ"Ô"ð Õ+=¸dÑ+CÔ+Cð Ø�D�S�DŒzˆØ€Kr9   c                 ó(  — t           j        dt           j        dt           j        di}|| t           j        t           j        z  t           j        z  z           }| t           j        z  r|                     ddd¦  «        }|                     dd¦  «        }|S )zZConvert file's open() flags into a readable string.
    Used by Process.open_files().
    ÚrÚwzw+Úar   zr+)rœ   ÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)r|   Ú	modes_mapr{   s      r7   Úfile_flags_to_moder«   Û   sw   € õ ”˜c¥2¤;°µR´YÀÐE€IØ�U�bœk­B¬KÑ7½"¼)ÑCÑDÔE€DØ�rŒ{Ñð )Ø�|Š|˜C  aÑ(Ô(ˆØ�<Š<˜˜dÑ#Ô#€Dà€Kr9   c                 óŒ   — |                       dd¦  «        } d}|rd| › �}nd| › d�}t          j        |t          j        ¦  «        S )zÜReturn True if the given name refers to a root device (e.g.
    "sda", "nvme0n1") as opposed to a logical partition (e.g.  "sda1",
    "nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram")
    return True.
    ú/ú!Tz/sys/block/z/device)r©   rœ   ÚaccessÚF_OK)ÚnameÚincluding_virtualrx   s      r7   Úis_storage_devicer³   è   sX   € ð �<Š<˜˜SÑ!Ô!€DØÐØð +Ø#˜TÐ#Ð#ˆˆà*˜TÐ*Ð*Ð*ˆÝŒ9�T�2œ7Ñ#Ô#Ð#r9   c                 óž  — t          | › d�¦  «        5 }|                     ¦   «                              ¦   «         dd…         }ddd¦  «         n# 1 swxY w Y   g d¢}t          |¦  «        }|dk    r|                     d¦  «         |dk    r|                     d¦  «         |d	k    r|                     d
¦  «         t          d|¦  «        adS )zøSet a namedtuple of variable fields depending on the CPU times
    available on this Linux kernel version which may be:
    (user, nice, system, idle, iowait, irq, softirq, [steal, [guest,
     [guest_nice]]])
    Used by cpu_times() function.
    ú/statr   N)r‘   Únicer’   Úidler•   ÚirqÚsoftirqé   Ústealé	   Úguesté
   Ú
guest_niceÚ	scputimes)r   Úreadlinerž   ÚlenÚappendr   rÀ   )Úprocfs_pathÚfÚvaluesÚfieldsÚvlens        r7   Úset_scputimes_ntuplerÉ   û   s	  € õ 
˜Ð*Ð*Ð*Ñ	+Ô	+ð *¨qØ—’‘”×#Ò#Ñ%Ô% a b bÔ)ˆð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *àKÐKÐK€FÝˆv‰;Œ;€DØˆq‚y€yà�Š�gÑÔÐØˆq‚y€yà�Š�gÑÔÐØˆr‚z€zà�Š�lÑ#Ô#Ð#Ý˜;¨Ñ/Ô/€I€I€Is   “/AÁAÁAú/proczignoring exception on import: rÀ   zuser system idleç        c                 óà  — | d         }||                       dd¦  «        z   }	 | d         }| d         }| d         }n6# t          $ r)}t          |j        d         › d�¦  «         |cY d}~S d}~ww xY w	 t	          t          ¦   «         › d	�¦  «        }n# t          $ r |cY S w xY wd}|5  |D ]U}	|	                     ¦   «         }	|	                     d
¦  «        r*|t          |	 
                    ¦   «         d         ¦  «        z  }ŒV	 ddd¦  «         n# 1 swxY w Y   |t          z  }||z
  }
||z   }|t          |dz  |¦  «        z  }|
|z  }
|
|t          |dz  |¦  «        z
  z  }
t          |
¦  «        S )ay  Fallback for kernels < 3.14 where /proc/meminfo does not provide
    "MemAvailable", see:
    https://blog.famzah.net/2014/09/24/.

    This code reimplements the algorithm outlined here:
    https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
        commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

    We use this function also when "MemAvailable" returns 0 (possibly a
    kernel bug, see: https://github.com/giampaolo/psutil/issues/1915).
    In that case this routine matches "free" CLI tool result ("available"
    column).

    XXX: on recent kernels this calculation may differ by ~1.5% compared
    to "MemAvailable:", as it's calculated slightly differently.
    It is still way more realistic than doing (free + cached) though.
    See:
    * https://gitlab.com/procps-ng/procps/issues/42
    * https://github.com/famzah/linux-memavailable-procfs/issues/2
    ó   MemFree:ó   Cached:r   s   Active(file):s   Inactive(file):ó   SReclaimable:zW is missing from /proc/meminfo; using an approximation for calculating available memoryNz	/zoneinfos   lowr   rE   g       @)ÚgetÚKeyErrorr   Úargsr   r   ÚOSErrorÚstripr2   Úintrž   ÚPAGESIZEÚmin)Úmemsrf   ÚfallbackÚlru_active_fileÚlru_inactive_fileÚslab_reclaimableÚerrrÅ   Úwatermark_lowÚlineÚavailÚ	pagecaches               r7   Úcalculate_avail_vmemrâ   !  s  € ð< �Ô€DØ�d—h’h˜z¨1Ñ-Ô-Ñ-€Hð	ØÐ/Ô0ˆØ Ð!3Ô4ÐØÐ 0Ô1ÐÐøÝð ð ð ÝØŒx˜Œ{ð >ð >ð >ñ	
ô 	
ð 	
ð ˆˆˆˆˆˆøøøøðøøøðÝ�?Ñ,Ô,Ð7Ð7Ð7Ñ8Ô8ˆˆøÝð ð ð Øˆˆˆðøøøð €MØ	
ð 6ð 6Øð 	6ð 	6ˆDØ—:’:‘<”<ˆDØ�Š˜vÑ&Ô&ð 6Ø¥ T§Z¢Z¡\¤\°!¤_Ñ!5Ô!5Ñ5�øð	6ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ð
 •XÑ€Mà�=Ñ €EØÐ"3Ñ3€IØ•�Y ‘] MÑ2Ô2Ñ2€IØ	ˆYÑ€EØ	Ð¥Ð$4°sÑ$:¸MÑ JÔ JÑJÑJ€EÝˆu‰:Œ:Ðs@   £< ¼
A/ÁA*Á$A/Á*A/Á3B ÂB!Â B!Â(ADÄDÄDc                  óô  — g } i }t          t          ¦   «         › d�¦  «        5 }|D ]7}|                     ¦   «         }t          |d         ¦  «        dz  ||d         <   Œ8	 ddd¦  «         n# 1 swxY w Y   |d         }|d         }	 |d         }n'# t          $ r d}|                      d	¦  «         Y nw xY w	 |d
         }||                     dd¦  «        z  }n'# t          $ r d}|                      d¦  «         Y nw xY w	 |d         }	nA# t          $ r4 	 |d         }	n'# t          $ r d}	|                      d¦  «         Y nw xY wY nw xY w	 |d         }
n'# t          $ r d}
|                      d¦  «         Y nw xY w	 |d         }nS# t          $ rF 	 |d         |d         z   |d         z   }n'# t          $ r d}|                      d¦  «         Y nw xY wY nw xY w	 |d         }n# t          $ r d}Y nw xY w||z
  |z
  |z
  }|dk     r||z
  }	 |d         }|dk    rt          |¦  «        }n# t          $ r t          |¦  «        }Y nw xY w|dk     rd}|                      d¦  «         n||k    r|}t          ||z
  |d¬¦  «        }| rZd 	                    d 
                    | ¦  «        t          | ¦  «        dk    rdnd¦  «        }t          j        |t          d¬ ¦  «         t          ||||||
||||	|¦  «        S )!a7  Report virtual memory stats.
    This implementation mimics procps-ng-3.3.12, aka "free" CLI tool:
    https://gitlab.com/procps-ng/procps/blob/
        24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791
    The returned values are supposed to match both "free" and "vmstat -s"
    CLI tools.
    ú/meminfor   é   r   Ns	   MemTotal:rÍ   s   Buffers:ri   rÎ   rÏ   rj   s   Shmem:s
   MemShared:rk   s   Active:rg   s	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:rh   s   Slab:s   MemAvailable:rc   ©Úround_z6{} memory stats couldn't be determined and {} set to 0z, ÚwasÚwererE   ©Ú
stacklevel)r   r   rž   rÕ   rÑ   rÃ   rÐ   râ   r   ÚformatÚjoinrÂ   ÚwarningsÚwarnÚRuntimeWarningra   )Úmissing_fieldsrØ   rÅ   rß   rÇ   rb   rf   ri   rj   rk   rg   rh   rl   re   rà   rd   Úmsgs                    r7   Úvirtual_memoryró   `  sy  € ð €NØ€DÝ	�Ñ)Ô)Ð3Ð3Ð3Ñ	4Ô	4ð 4¸Øð 	4ð 	4ˆDØ—Z’Z‘\”\ˆFÝ! &¨¤)™nœn¨tÑ3ˆD�˜”‰OˆOð	4ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð �Ô€EØ�Ô€Dð)Ø�{Ô#ˆˆøÝð )ð )ð )àˆØ×Ò˜iÑ(Ô(Ð(Ð(Ð(ð)øøøð0Ø�jÔ!ˆð 	�$—(’(Ð+¨QÑ/Ô/Ñ/ˆˆøõ ð (ð (ð (ØˆØ×Ò˜hÑ'Ô'Ð'Ð'Ð'ð(øøøð,Ø�i”ˆˆøÝð ,ð ,ð ,ð	,Ø˜-Ô(ˆFˆFøÝð 	,ð 	,ð 	,ØˆFØ×!Ò! (Ñ+Ô+Ð+Ð+Ð+ð	,øøøøøð,øøøð(Ø�jÔ!ˆˆøÝð (ð (ð (ØˆØ×Ò˜hÑ'Ô'Ð'Ð'Ð'ð(øøøð.Ø˜Ô%ˆˆøÝð 	.ð 	.ð 	.ð	.à�_Ô%Ø�Ô'ñ(àÐ(Ô)ñ*ð ˆHøõ
 ð 	.ð 	.ð 	.ØˆHØ×!Ò! *Ñ-Ô-Ð-Ð-Ð-ð	.øøøøøð	.øøøðØ�HŒ~ˆˆøÝð ð ð Øˆˆˆðøøøð �4‰<˜&Ñ  7Ñ*€DØˆa‚x€xð �t‰|ˆð
/ØÐ%Ô&ˆð �AŠ:ˆ:õ
 )¨Ñ.Ô.ˆEøøõ ð +ð +ð +Ý$ TÑ*Ô*ˆˆˆð+øøøð ˆq‚y€yØˆØ×Ò˜kÑ*Ô*Ð*Ð*Ø	�Šˆð ˆå˜U U™]¨U¸1Ð=Ñ=Ô=€Gð ð 9ØF×MÒMØ�IŠI�nÑ%Ô%Ý˜Ñ(Ô(¨AÒ-Ð-ˆEˆE°6ñ
ô 
ˆõ 	Œ�c�>°aÐ8Ñ8Ô8Ð8åØØØØØØØØØØØñô ð s×   £;A+Á+A/Á2A/ÂB Â!B4Â3B4Â8C Ã!C>Ã=C>ÄD Ä
E	ÄDÄE	Ä!EÅ E	ÅEÅE	ÅE	ÅE Å!E:Å9E:Å>F Æ
GÆF-Æ,GÆ-!GÇGÇGÇGÇGÇG$ Ç$G3Ç2G3ÈH+ È+IÉIc                  ó>  — i } t          t          ¦   «         › d�¦  «        5 }|D ]7}|                     ¦   «         }t          |d         ¦  «        dz  | |d         <   Œ8	 ddd¦  «         n# 1 swxY w Y   	 | d         }| d         }n5# t          $ r( t          j        ¦   «         \  }}}}}}}||z  }||z  }Y nw xY w||z
  }t          ||d¬¦  «        }		 t          t          ¦   «         › d	�¦  «        }|5  dx}
}|D ]�}|                     d
¦  «        r/t          |                     d¦  «        d         ¦  «        dz  dz  }
nC|                     d¦  «        r.t          |                     d¦  «        d         ¦  «        dz  dz  }|
�|� n(Œ�d}|dz  }t          j
        |t          d¬¦  «         dx}
}ddd¦  «         n# 1 swxY w Y   n=# t          $ r0}d|› d�}t          j
        |t          d¬¦  «         dx}
}Y d}~nd}~ww xY wt          j        ||||	|
|¦  «        S )zReturn swap memory metrics.rä   r   rå   r   Ns
   SwapTotal:s	   SwapFree:ræ   z/vmstats   pswpinó    é   s   pswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0rE   rê   zM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (ú))r   r   rž   rÕ   rÑ   ÚcextÚlinux_sysinfor   r2   rî   rï   rð   rÓ   r   Ússwap)rØ   rÅ   rß   rÇ   rb   rf   Ú_Úunit_multiplierre   rd   ÚsinÚsoutrò   rÝ   s                 r7   Úswap_memoryrÿ   å  s  € à€DÝ	�Ñ)Ô)Ð3Ð3Ð3Ñ	4Ô	4ð 4¸Øð 	4ð 	4ˆDØ—Z’Z‘\”\ˆFÝ! &¨¤)™nœn¨tÑ3ˆD�˜”‰OˆOð	4ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð Ø�]Ô#ˆØ�LÔ!ˆˆøÝð  ð  ð  Ý37Ô3EÑ3GÔ3GÑ0ˆˆ1ˆa��E˜4 Ø�Ñ ˆØ�Ñˆˆˆð øøøð
 �4‰<€DÝ˜D %°Ð2Ñ2Ô2€GðÝ�?Ñ,Ô,Ð5Ð5Ð5Ñ6Ô6ˆð ð 	ð 	ØÐˆC�$Øð ð �ð —?’? 9Ñ-Ô-ð ?Ý˜dŸjšj¨Ñ.Ô.¨qÔ1Ñ2Ô2°QÑ6¸Ñ=�C�CØ—_’_ ZÑ0Ô0ð ?Ý˜tŸzšz¨$Ñ/Ô/°Ô2Ñ3Ô3°aÑ7¸$Ñ>�DØ�? tÐ'7Ø�Eøð
 E�ØÐ8Ñ8�Ý”˜c¥>¸aÐ@Ñ@Ô@Ð@Ø���dð%	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	øøõ ð ð ð ð7Ø03ð7ð 7ð 7ð 	õ 	Œ�c�>°aÐ8Ñ8Ô8Ð8Øˆˆˆdˆdˆdˆdˆdˆdøøøøðøøøõ8 Œ=˜  d¨G°S¸$Ñ?Ô?Ð?sN   ¡;A)Á)A-Á0A-Á5B Â/B8Â7B8ÃG	 Ã3B>F=Æ=GÇGÇ	
HÇ&G>Ç>Hc                  óN  — t          ¦   «         } t          | ¦  «         t          | › d�¦  «        5 }|                     ¦   «                              ¦   «         }ddd¦  «         n# 1 swxY w Y   |dt          t          j        ¦  «        dz   …         }d„ |D ¦   «         }t          |Ž S )zíReturn a named tuple representing the following system-wide
    CPU times:
    (user, nice, system, idle, iowait, irq, softirq [steal, [guest,
     [guest_nice]]])
    Last 3 fields may not be available on all Linux kernel versions.
    rµ   Nr   c                 ó<   — g | ]}t          |¦  «        t          z  ‘ŒS rJ   ©ÚfloatÚCLOCK_TICKSr4   s     r7   r8   zcpu_times.<locals>.<listcomp>-  s#   € Ð5Ð5Ð5¨�e�A‰hŒh�Ñ$Ð5Ð5Ð5r9   )r   rÉ   r   rÁ   rž   rÂ   rÀ   Ú_fields)rÄ   rÅ   rÆ   rÇ   s       r7   Ú	cpu_timesr  !  sÜ   € õ "Ñ#Ô#€KÝ˜Ñ%Ô%Ð%Ý	˜Ð*Ð*Ð*Ñ	+Ô	+ð &¨qØ—’‘”×#Ò#Ñ%Ô%ˆð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &à�A��IÔ-Ñ.Ô.°Ñ2Ð2Ô3€FØ5Ð5¨fÐ5Ñ5Ô5€FÝ�fÐÐs   °'A#Á#A'Á*A'c                  ó¼  — t          ¦   «         } t          | ¦  «         g }t          | › d�¦  «        5 }|                     ¦   «          |D ]y}|                     d¦  «        rb|                     ¦   «         }|dt          t          j        ¦  «        dz   …         }d„ |D ¦   «         }t          |Ž }| 	                    |¦  «         Œz|cddd¦  «         S # 1 swxY w Y   dS )zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    rµ   s   cpur   c                 ó<   — g | ]}t          |¦  «        t          z  ‘ŒS rJ   r  r4   s     r7   r8   z!per_cpu_times.<locals>.<listcomp>?  s#   € ÐAÐAÐA°Q�% ™(œ(¥[Ñ0ÐAÐAÐAr9   N)
r   rÉ   r   rÁ   r2   rž   rÂ   rÀ   r  rÃ   )rÄ   ÚcpusrÅ   rß   rÆ   rÇ   Úentrys          r7   Úper_cpu_timesr  1  s)  € õ "Ñ#Ô#€KÝ˜Ñ%Ô%Ð%Ø€DÝ	˜Ð*Ð*Ð*Ñ	+Ô	+ð 
¨qà	�
Š
‰ŒˆØð 	#ð 	#ˆDØ�Š˜vÑ&Ô&ð #ØŸš™œ�Ø ¥C­	Ô(9Ñ$:Ô$:¸QÑ$>Ð >Ô?�ØAÐA¸&ÐAÑAÔA�Ý! 6Ð*�Ø—’˜EÑ"Ô"Ð"øØð
ð 
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
s   ²BCÃCÃCc                  óN  — 	 t          j        d¦  «        S # t          $ �r d} t          t	          ¦   «         › d�¦  «        5 }|D ].}|                     ¦   «                              d¦  «        r| dz  } Œ/	 ddd¦  «         n# 1 swxY w Y   | dk    r…t          j        d¦  «        }t          t	          ¦   «         › d�¦  «        5 }|D ]7}| 
                    d	¦  «        d         }|                     |¦  «        r| dz  } Œ8	 ddd¦  «         n# 1 swxY w Y   | dk    rY dS | cY S w xY w)
z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNr   ú/cpuinfos	   processorr   Nzcpu\drµ   rŒ   )rœ   ÚsysconfÚ
ValueErrorr   r   Úlowerr2   ÚreÚcompiler   rž   Úmatch)ÚnumrÅ   rß   Úsearchs       r7   Úcpu_count_logicalr  E  sÍ  € ðÝŒzÐ/Ñ0Ô0Ð0øÝð ñ ð àˆÝ�OÑ-Ô-Ð7Ð7Ð7Ñ8Ô8ð 	¸AØð ð �Ø—:’:‘<”<×*Ò*¨<Ñ8Ô8ð Ø˜1‘H�Cøðð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð �!Š8ˆ8Ý”Z Ñ)Ô)ˆFÝ�oÑ/Ô/Ð6Ð6Ð6Ñ7Ô7ð !¸1Øð !ð !�DØŸ:š: c™?œ?¨1Ô-�DØ—|’| DÑ)Ô)ð !Ø˜q™˜øð!ð!ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !ð �!Š8ˆ8à�4�4Øˆ
ˆ
ˆ
ð-øøøs]   ‚ –+D$Á2B Á4D$Â B	ÂD$ÂB	Â;D$Ã;DÃ?D$ÄD	ÄD$ÄD	Ä	D$ÄD$Ä#D$c                  óP  — t          ¦   «         } d}d}t          j        |¦  «        pt          j        |¦  «        D ]b}t          |¦  «        5 }|                      |                     ¦   «                              ¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y   Œct          | ¦  «        }|dk    r|S i }i }t          t          ¦   «         › d�¦  «        5 }|D ]�}|                     ¦   «                              ¦   «         }|s&	 |d         ||d         <   n# t          $ r Y nw xY wi }ŒP| 
                    d¦  «        r+|                     d	d
¦  «        \  }	}
t          |
¦  «        ||	<   Œ‘	 ddd¦  «         n# 1 swxY w Y   t          |                     ¦   «         ¦  «        }|pdS )z-Return the number of CPU cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listNr   r  ó	   cpu coresó   physical id)r  r  s   	:r   )ÚsetÚglobr   ÚaddÚreadrÔ   rÂ   r   r  rÑ   r2   rž   rÕ   ÚsumrÆ   )ÚlsÚp1Úp2rx   rÅ   ÚresultÚmappingÚcurrent_inforß   ÚkeyÚvalues              r7   Úcpu_count_coresr(  b  s4  € õ 
‰Œ€Bð 
E€BØ	J€BÝ”	˜"‘”Ð.¥¤¨2¡¤ð %ð %ˆÝ˜ÑÔð 	% !Ø�FŠF�1—6’6‘8”8—>’>Ñ#Ô#Ñ$Ô$Ð$ð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%øå�‰WŒW€FØ�‚{€{Øˆð €GØ€LÝ	�Ñ)Ô)Ð3Ð3Ð3Ñ	4Ô	4ð /¸Øð 	/ð 	/ˆDØ—:’:‘<”<×%Ò%Ñ'Ô'ˆDØð /ðØ<HØ$ô=�G˜L¨Ô8Ñ9Ð9øõ  ð ð ð Ø�Dðøøøà!��Ø—’Ð!?Ñ@Ô@ð /à!ŸZšZ¨°Ñ2Ô2‘
��UÝ$'¨¡J¤J�˜SÑ!øð	/ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /õ" �—’Ñ!Ô!Ñ"Ô"€FØˆ>�TÐsI   Á:BÂB	ÂB	Ã-E8ÄDÄE8Ä
D$Ä!E8Ä#D$Ä$AE8Å8E<Å?E<c                  ó2  — t          t          ¦   «         › d�¦  «        5 } d}d}d}| D ]À}|                     d¦  «        r(t          |                     ¦   «         d         ¦  «        }ny|                     d¦  «        r(t          |                     ¦   «         d         ¦  «        }n<|                     d¦  «        r't          |                     ¦   «         d         ¦  «        }|�|�|� nŒÁddd¦  «         n# 1 swxY w Y   d}t          j        ||||¦  «        S )z*Return various CPU stats as a named tuple.rµ   Ns   ctxtr   s   intrs   softirqr   )r   r   r2   rÕ   rž   r   Ú	scpustats)rÅ   Úctx_switchesÚ
interruptsÚsoft_interruptsrß   Úsyscallss         r7   Ú	cpu_statsr/  Œ  sW  € å	�Ñ)Ô)Ð0Ð0Ð0Ñ	1Ô	1ð °QØˆØˆ
ØˆØð 	ð 	ˆDØ�Š˜wÑ'Ô'ð 7Ý" 4§:¢:¡<¤<°¤?Ñ3Ô3��Ø—’ Ñ)Ô)ð 7Ý  §¢¡¤¨a¤Ñ1Ô1�
�
Ø—’ Ñ,Ô,ð 7Ý"% d§j¢j¡l¤l°1¤oÑ"6Ô"6�àÐ(Ø#Ð/ØÐ*à�øð!ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð" €HÝÔØ�j /°8ñô ð s   ŸC
C5Ã5C9Ã<C9c                  óŠ   — t          t          ¦   «         › d�¦  «        5 } d„ | D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )z7Return current CPU frequency from cpuinfo if available.r  c                 ó®   — g | ]R}|                      ¦   «                              d ¦  «        ¯)t          |                     dd¦  «        d         ¦  «        ‘ŒSS )s   cpu mhzó   :r   )r  r2   r  rž   )r5   rß   s     r7   r8   z)_cpu_get_cpuinfo_freq.<locals>.<listcomp>¨  s_   € ð 
ð 
ð 
àØ�zŠz‰|Œ|×&Ò& zÑ2Ô2ð
Ý�$—*’*˜T 1Ñ%Ô% aÔ(Ñ)Ô)ð
ð 
ð 
r9   N)r   r   )rÅ   s    r7   Ú_cpu_get_cpuinfo_freqr3  ¥  sœ   € å	�Ñ)Ô)Ð3Ð3Ð3Ñ	4Ô	4ð 
¸ð
ð 
àð
ñ 
ô 
ð
ð 
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
s   Ÿ8¸<¿<z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc            	      ó†  — t          ¦   «         } t          j        d¦  «        pt          j        d¦  «        }|                     d„ ¬¦  «         g }t          j        j        }t          |¦  «        D �]O\  }}t          |¦  «        t          | ¦  «        k    r| |         dz  }nt           ||d¦  «        d¬¦  «        }|€st           ||d	¦  «        d¬¦  «        }|€Vd
|› d�}t          |d¬¦  «        dk    r*| 
                    t          j        ddd¦  «        ¦  «         Œ±d}t          |¦  «        ‚t          |¦  «        dz  }t          t           ||d¦  «        ¦  «        ¦  «        dz  }	t          t           ||d¦  «        ¦  «        ¦  «        dz  }
| 
                    t          j        ||
|	¦  «        ¦  «         �ŒQ|S )z‚Return frequency metrics for all CPUs.
        Contrarily to other OSes, Linux updates these values in
        real-time.
        z,/sys/devices/system/cpu/cpufreq/policy[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqc                 ój   — t          t          j        d| ¦  «                             ¦   «         ¦  «        S )Nz[0-9]+)rÕ   r  r  Úgroup)r6   s    r7   ú<lambda>zcpu_freq.<locals>.<lambda>¼  s&   € ¥¥R¤Y¨y¸!Ñ%<Ô%<×%BÒ%BÑ%DÔ%DÑ!EÔ!E€ r9   )r&  iè  Úscaling_cur_freqN©rÙ   Úcpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0
rË   z!can't find current frequency fileÚscaling_max_freqÚscaling_min_freq)r3  r  Úsortrœ   rx   rí   Ú	enumeraterÂ   r   r   rÃ   r   ÚscpufreqÚNotImplementedErrorrÕ   )Úcpuinfo_freqsÚpathsÚretÚpjoinÚirx   ÚcurrÚonline_pathrò   Úmax_Úmin_s              r7   Úcpu_freqrJ  ³  sÙ  € õ
 .Ñ/Ô/ˆÝ”	Ø:ñ
ô 
ð DåŒYÐBÑCÔCð 	ð 	�
Š
ÐEÐEˆ
ÑFÔFÐFØˆÝ””ˆÝ  Ñ'Ô'ð 	;ñ 	;‰GˆAˆtÝ�5‰zŒz�S Ñ/Ô/Ò/Ð/ð % QÔ'¨$Ñ.��å˜E˜E $Ð(:Ñ;Ô;ÀdÐKÑKÔK�Øˆ|õ ˜E˜E $Ð(:Ñ;Ô;ÀdÐKÑKÔK�Ø�<Ø"JÀÐ"JÐ"JÐ"J�Kå˜;°Ð6Ñ6Ô6¸%Ò?Ð?ØŸ
š
¥7Ô#3°C¸¸cÑ#BÔ#BÑCÔCÐCØ Ø=�CÝ-¨cÑ2Ô2Ð2Ý�t‘9”9˜tÑ#ˆDÝ•t˜E˜E $Ð(:Ñ;Ô;Ñ<Ô<Ñ=Ô=ÀÑDˆDÝ•t˜E˜E $Ð(:Ñ;Ô;Ñ<Ô<Ñ=Ô=ÀÑDˆDØ�JŠJ•wÔ'¨¨d°DÑ9Ô9Ñ:Ô:Ð:Ñ:Øˆ
r9   c                  ó2   — d„ t          ¦   «         D ¦   «         S )z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        c                 ó:   — g | ]}t          j        |d d ¦  «        ‘ŒS )rË   )r   r?  r4   s     r7   r8   zcpu_freq.<locals>.<listcomp>Þ  s'   € ÐOÐOÐO°!•Ô   C¨Ñ-Ô-ÐOÐOÐOr9   )r3  rJ   r9   r7   rJ  rJ  Ú  s    € ð PÐOÕ7LÑ7NÔ7NÐOÑOÔOÐOr9   c                   ó   — e Zd ZdS )Ú_Ipv6UnsupportedErrorN)rG   rH   rI   rJ   r9   r7   rN  rN  é  s   € € € € € Ø€Dr9   rN  c                   ór   — e Zd ZdZd„ Zd„ Zd„ Zed„ ¦   «         Zed
d„¦   «         Z	ed
d„¦   «         Z
d
d	„ZdS )ÚNetConnectionsaw  A wrapper on top of /proc/net/* files, retrieving per-process
    and system-wide open connections (TCP, UDP, UNIX) similarly to
    "netstat -an".

    Note: in case of UNIX sockets we're only able to determine the
    local endpoint/path, not the one it's connected to.
    According to [1] it would be possible but not easily.

    [1] http://serverfault.com/a/417946
    c                 óL  — dt           j        t           j        f}dt           j        t           j        f}dt           j        t           j        f}dt           j        t           j        f}dt           j        d f}|||||f||f|f|f||f|f|f|f||||f||f||fdœ| _        d | _        d S )NÚtcpÚtcp6ÚudpÚudp6Úunix)ÚallrR  Útcp4rS  rT  Úudp4rU  rV  ÚinetÚinet4Úinet6)ÚsocketÚAF_INETÚSOCK_STREAMÚAF_INET6Ú
SOCK_DGRAMÚAF_UNIXÚtmapÚ_procfs_path)ÚselfrX  rS  rY  rU  rV  s         r7   Ú__init__zNetConnections.__init__ù  sÃ   € ð •v”~¥vÔ'9Ð:ˆØ�œ­Ô);Ð<ˆØ•v”~¥vÔ'8Ð9ˆØ�œ­Ô):Ð;ˆØ�œ¨Ð-ˆà˜$  d¨DÐ1Ø˜$�<Ø�GØ�GØ˜$�<Ø�GØ�GØ�GØ˜4  tÐ,Ø˜D�\Ø˜D�\ð
ð 
ˆŒ	ð !ˆÔÐÐr9   c                 ó  — t          t          ¦  «        }t          j        | j        › d|› d�¦  «        D ]Ø}	 t          | j        › d|› d|› �¦  «        }|                     d¦  «        r<|dd …         d d…         }||                              |t          |¦  «        f¦  «         Œq# t          t          f$ r Y Œ„t          $ rI}|j        t          j        k    rY d }~Œ§|j        t          j        k    rt          |¦  «         Y d }~ŒÐ‚ d }~ww xY w|S )Nr­   ú/fdú/fd/zsocket:[rº   éÿÿÿÿ)r   Úlistrœ   Úlistdirrd  r�   r2   rÃ   rÕ   ÚFileNotFoundErrorÚProcessLookupErrorrÓ   ÚerrnoÚEINVALÚENAMETOOLONGr   )re  ÚpidÚinodesry   ÚinoderÝ   s         r7   Úget_proc_inodeszNetConnections.get_proc_inodes  sA  € Ý�TÑ"Ô"ˆÝ”* Ô 1Ð<Ð<°CÐ<Ð<Ð<Ñ=Ô=ð 	9ð 	9ˆBð9Ý  DÔ$5Ð!EÐ!E¸Ð!EÐ!EÀÐ!EÐ!EÑFÔF�ð  ×#Ò# JÑ/Ô/ð 9à! ! " "œI c r cœN�EØ˜5”M×(Ò(¨#­s°2©w¬w¨Ñ8Ô8Ð8øøõ% &Õ'9Ð:ð ð ð ð �Ýð ð ð Ø”9¥¤Ò,Ð,à�H�H�H�HØ”9¥Ô 2Ò2Ð2å˜#‘J”J�JØ�H�H�H�HØøøøøðøøøð ˆs)   ·B%Â%D
Â8	D
ÃDÃ$DÄDÄD
c                 ó¸   — i }t          ¦   «         D ]H}	 |                     |                      |¦  «        ¦  «         Œ,# t          t          t
          f$ r Y ŒEw xY w|S ©N)ÚpidsÚupdateru  rm  rn  ÚPermissionError)re  rs  rr  s      r7   Úget_all_inodeszNetConnections.get_all_inodes*  ss   € ØˆÝ‘6”6ð 	ð 	ˆCð
Ø—’˜d×2Ò2°3Ñ7Ô7Ñ8Ô8Ð8Ð8øÝ%Õ'9½?ÐKð ð ð ð �ðøøøð ˆs   ”(=½AÁAc           
      ó  — |                       d¦  «        \  }}t          |d¦  «        }|sdS |                     d¦  «        }|t          j        k    r`t
          r1t          j        |t          j        |¦  «        ddd…         ¦  «        }nït          j        |t          j        |¦  «        ¦  «        }nÇt          j        |¦  «        }	 t
          rCt          j        t          j	        t          j        dgt          j        d|¦  «        ¢R Ž ¦  «        }nBt          j        t          j	        t          j        dgt          j        d|¦  «        ¢R Ž ¦  «        }n%# t          $ r t          ¦   «         st          d‚‚ w xY wt!          j        ||¦  «        S )	a†  Accept an "ip:port" address as displayed in /proc/net/*
        and convert it into a human readable form, like:

        "0500000A:0016" -> ("10.0.0.5", 22)
        "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521)

        The IP address portion is a little or big endian four-byte
        hexadecimal number; that is, the least significant byte is listed
        first, so we need to reverse the order of the bytes to convert it
        to an IP address.
        The port is represented as a two-byte hexadecimal number.

        Reference:
        http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html
        ú:é   rJ   ÚasciiNrj  z>4Iz<4I)rž   rÕ   Úencoder]  r^  ÚLITTLE_ENDIANÚ	inet_ntopÚbase64Ú	b16decoder`  ÚstructÚpackÚunpackr  r   rN  r   Úaddr)rˆ  ÚfamilyÚipÚports       r7   Údecode_addresszNetConnections.decode_address:  s}  € ð" —:’:˜c‘?”?‰ˆˆDÝ�4˜‰}Œ}ˆð ð 	Ø�2Ø�YŠY�wÑÔˆØ•V”^Ò#Ð#åð DÝÔ% f­fÔ.>¸rÑ.BÔ.BÀ4À4ÀRÀ4Ô.HÑIÔI��åÔ% f­fÔ.>¸rÑ.BÔ.BÑCÔC��åÔ! "Ñ%Ô%ˆBðå ð 	ÝÔ)ÝœÝœ EÐE­F¬M¸%ÀÑ,DÔ,DÐEÐEÐEñô �B�Bõ
  Ô)ÝœÝœ EÐE­F¬M¸%ÀÑ,DÔ,DÐEÐEÐEñô �Bøøõ ð ð ð å$‘”ð :Ý/°TÐ9Øð	øøøõ
 Œ|˜B Ñ%Ô%Ð%s   ÃBE Å"E6Nc              #   ó  K  — |                       d¦  «        r!t          j                             | ¦  «        sdS t	          | ¦  «        5 }|                     ¦   «          t          |d¦  «        D ]ø\  }}	 |                     ¦   «         dd…         \
  }}	}
}}}}}}}n)# t          $ r d| › d|› d|›�}t          |¦  «        d‚w xY w||v r||         d         \  }}nd	\  }}|�||k    rŒ{|t          j        k    rt          |         }nt          j        }	 t                               |	|¦  «        }	t                               |
|¦  «        }
n# t"          $ r Y Œéw xY w||||	|
||fV — Œù	 ddd¦  «         dS # 1 swxY w Y   dS )
z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6Nr   r¾   úerror while parsing ú; malformed line rŒ   r   ©Nrj  )rŸ   rœ   rx   Úexistsr   rÁ   r>  rž   r  ÚRuntimeErrorr]  r_  ÚTCP_STATUSESr   Ú	CONN_NONErP  rŒ  rN  )Úfiler‰  Útype_rs  Ú
filter_pidrÅ   Úlinenorß   rû   ÚladdrÚraddrÚstatusrt  rò   rr  ry   s                   r7   Úprocess_inetzNetConnections.process_inetm  sI  è è € ð �=Š=˜ÑÔð 	¥b¤g§n¢n°TÑ&:Ô&:ð 	àˆFÝ�t‰_Œ_ð #	I Ø�JŠJ‰LŒLˆLÝ )¨!¨Q¡¤ð !Ið !I‘�˜ð	6àŸ
š
™œ S b SÔ)ñ B�A�u˜e V¨Q°°1°a¸¸E¸Eøõ "ð 6ð 6ð 6ð.¨tð .ð .Ø"ð.ð .Ø%)ð.ð .ð õ ' sÑ+Ô+°Ð5ð6øøøð ˜F�?�?ð % Uœm¨AÔ.‘G�C˜˜à&‘G�C˜ØÐ)¨j¸CÒ.?Ð.?Øà¥Ô 2Ò2Ð2Ý!-¨fÔ!5˜˜å!(Ô!2˜ð!Ý .× =Ò =¸eÀVÑ LÔ L˜Ý .× =Ò =¸eÀVÑ LÔ L˜˜øÝ0ð !ð !ð !Ø ˜ð!øøøà˜v u¨e°U¸FÀCÐHÐHÐHÐHÐHðC!Ið#	Ið #	Ið #	Iñ #	Iô #	Ið #	Ið #	Ið #	Ið #	Ið #	Ið #	Ið #	Iøøøð #	Ið #	Ið #	Ið #	Ið #	Ið #	IsO   Á*E4Á3'BÂE4Â&CÃAE4Ä6E
Å	E4Å

EÅE4ÅEÅE4Å4E8Å;E8c           
   #   ó$  K  — t          | ¦  «        5 }|                     ¦   «          |D ]Í}|                     ¦   «         }	 |dd…         \  }}}}}}}	n+# t          $ r d|vrY Œ:d| › d|›�}
t	          |
¦  «        ‚w xY w|	|v r	||	         }ndg}|D ]e\  }}|�||k    rŒt          |¦  «        dk    r|d	         nd
}t          j        t          |¦  «        ¦  «        }d
}t          j	        }|||||||fV — ŒfŒÎ	 ddd¦  «         dS # 1 swxY w Y   dS )zParse /proc/net/unix files.r   é   rŒ   r�  r�  r‘  Nrº   rj  Ú )
r   rÁ   rž   r  r“  rÂ   r   Úsocktype_to_enumrÕ   r•  )r–  r‰  rs  r˜  rÅ   rß   Útokensrû   r—  rt  rò   Úpairsrr  ry   rx   r›  rœ  s                    r7   Úprocess_unixzNetConnections.process_unix˜  sÚ  è è € õ �t‰_Œ_ð 	L Ø�JŠJ‰LŒLˆLØð Lð L�ØŸš™œ�ð	,Ø28¸¸1¸´+Ñ/�A�q˜!˜Q  q¨%¨%øÝ!ð ,ð ,ð ,Ø $��à ˜àN¨tÐNÐNÀdÐNÐNð õ ' sÑ+Ô+Ð+ð,øøøð ˜F�?�?ð # 5œM�E�Eà'˜L�EØ$ð Lð L‘G�C˜Ø!Ð-°*ÀÒ2CÐ2CØ å-0°©[¬[¸AÒ-=Ð-=˜v bœz˜zÀ2˜Ý 'Ô 8½¸U¹¼Ñ DÔ D˜ð !#˜Ý!(Ô!2˜Ø! 6¨5°$¸¸vÀsÐKÐKÐKÐKÐKðLð%Lð	Lð 	Lð 	Lñ 	Lô 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Løøøð 	Lð 	Lð 	Lð 	Lð 	Lð 	Ls6   ’-DÁ AÁDÁA;Á!DÁ#A;Á;A<DÄD	ÄD	c                 óN  — t          ¦   «         | _        |�|                      |¦  «        }|sg S n|                      ¦   «         }t	          ¦   «         }| j        |         D ]¸\  }}}| j        › d|› �}|t          j        t          j        hv r|  	                    |||||¬¦  «        }	n|  
                    ||||¬¦  «        }	|	D ]U\  }
}}}}}}|rt          j        |
|||||¦  «        }nt          j        |
||||||¦  «        }|                     |¦  «         ŒVŒ¹t          |¦  «        S )Nz/net/)r˜  )r   rd  ru  r{  r  rc  r]  r^  r`  r�  r¤  r   ÚpconnÚsconnr  rk  )re  Úkindrr  rs  rC  Ú
proto_namer‰  r—  rx   r   ry   rš  r›  rœ  Ú	bound_pidÚconns                   r7   ÚretrievezNetConnections.retrieve¼  so  € Ý+Ñ-Ô-ˆÔØˆ?Ø×)Ò)¨#Ñ.Ô.ˆFØð à�	ðð ×(Ò(Ñ*Ô*ˆFÝ‰eŒeˆØ)-¬°4¬ð 	ð 	Ñ%ˆJ˜ ØÔ'Ð:Ð:¨jÐ:Ð:ˆDØ�&œ.­&¬/Ð:Ð:Ð:Ø×&Ò&Ø˜& %¨¸Cð 'ñ ô ��ð ×&Ò& t¨V°VÈÐ&ÑLÔL�ØFHð 	ð 	ÑB��F˜E 5¨%°¸Øð Ý"œ=Ø˜F E¨5°%¸ñô �D�Dõ #œ=Ø˜F E¨5°%¸Àñô �Dð —’˜‘”��ð	õ �C‰yŒyÐr9   rw  )rG   rH   rI   Ú__doc__rf  ru  r{  ÚstaticmethodrŒ  r�  r¤  r¬  rJ   r9   r7   rP  rP  í  sÅ   € € € € € ð	ð 	ð!ð !ð !ð.ð ð ð4ð ð ð  ð0&ð 0&ñ „\ð0&ðd ð(Ið (Ið (Iñ „\ð(IðT ð!Lð !Lð !Lñ „\ð!LðFð ð ð ð ð r9   rP  rZ  c                 ó6   — t                                | ¦  «        S )z$Return system-wide open connections.)Ú_net_connectionsr¬  )r¨  s    r7   Únet_connectionsr±  Þ  s   € å×$Ò$ TÑ*Ô*Ð*r9   c                  ó  — t          t          ¦   «         › d�¦  «        5 } |                      ¦   «         }ddd¦  «         n# 1 swxY w Y   i }|dd…         D ]´}|                     d¦  «        }|dk    sJ t	          |¦  «        ¦   «         ‚|d|…                              ¦   «         }||dz   d…                              ¦   «                              ¦   «         }t          t          |¦  «        \  }}}	}
}}}}}}}}}}}}|||||	||
|f||<   Œµ|S )zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z/net/devNrE   r}  r   r   )	r   r   Ú	readlinesÚrfindÚreprrÔ   rž   ÚmaprÕ   )rÅ   ÚlinesÚretdictrß   Úcolonr±   rÇ   Ú
bytes_recvÚpackets_recvÚerrinÚdropinÚ_fifoinÚ_frameinÚ_compressedinÚ_multicastinÚ
bytes_sentÚpackets_sentÚerroutÚdropoutÚ_fifooutÚ_collisionsoutÚ_carrieroutÚ_compressedouts                          r7   Únet_io_countersrÊ  ã  sy  € õ 
•oÑ'Ô'Ð1Ð1Ð1Ñ	2Ô	2ð °aØ—’‘”ˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à€GØ�a�b�b”	ð $
ð $
ˆØ—
’
˜3‘”ˆØ�qŠyˆyˆy�$˜t™*œ*‰yŒyˆyØ�F�U�FŒ|×!Ò!Ñ#Ô#ˆØ�e˜a‘i�k�kÔ"×(Ò(Ñ*Ô*×0Ò0Ñ2Ô2ˆõ* •�VÑÔñ'	
àØØØØØØØàØØØØØØØð ØØØØØØØð	
ˆ�‰ˆð €Ns   ŸA Á AÁAc                  ó*  — t           j        t          t           j        t          t           j        t          i} t          ¦   «                              ¦   «         }i }|D ]¸}	 t          j
        |¦  «        }t          j        |¦  «        }t          j        |¦  «        \  }}d                     |¦  «        }d|v }	t          j        |	| |         |||¦  «        ||<   Œ}# t           $ r/}
|
j        t"          j        k    r‚ t'          |
¦  «         Y d}
~
Œ±d}
~
ww xY w|S )z)Get NIC stats (isup, duplex, speed, mtu).ú,ÚrunningN)rø   ÚDUPLEX_FULLr   ÚDUPLEX_HALFr   ÚDUPLEX_UNKNOWNr   rÊ  ÚkeysÚ
cext_posixÚ
net_if_mtuÚnet_if_flagsÚnet_if_duplex_speedrí   r   Ú	snicstatsrÓ   ro  ÚENODEVr   )Ú
duplex_mapÚnamesrC  r±   Úmtur|   ÚduplexÚspeedÚoutput_flagsÚisuprÝ   s              r7   Únet_if_statsrß    s  € õ 	Ô�/ÝÔ�/ÝÔÕ/ð€Jõ
 ÑÔ×"Ò"Ñ$Ô$€EØ
€CØð ð ˆð	ÝÔ'¨Ñ-Ô-ˆCÝÔ+¨DÑ1Ô1ˆEÝ Ô4°TÑ:Ô:‰MˆF�Eð Ÿ8š8 E™?œ?ˆLØ Ð%ˆDÝÔ)Ø�j Ô(¨%°°lñô ˆC�‰IˆIøõ ð 	ð 	ð 	àŒy�EœLÒ(Ð(ØÝ�#‰JŒJˆJˆJˆJˆJˆJˆJøøøøð		øøøð €Js   Á?CÃ
DÃ!%DÄDFc                 ó¨  — d„ }d„ }t           j                             t          ¦   «         › d�¦  «        r |¦   «         }nJt           j                             d¦  «        r |¦   «         }n t          ¦   «         › d�}t	          |¦  «        ‚i }|D ]C}|\
  }}}	}
}}}}}}| st          |¦  «        sŒ!|
t          z  }
|t          z  }||	|
||||||f	||<   ŒD|S )zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    c               3   óÀ  K  — t          t          ¦   «         › d�¦  «        5 } |                      ¦   «         }d d d ¦  «         n# 1 swxY w Y   |D �]}|                     ¦   «         }t	          |¦  «        }|dk    rF|d         }t          |d         ¦  «        }t          t
          |dd…         ¦  «        \
  }}}	}
}}}}}}n�|dk    s|dk    r2|d         }t          t
          |dd…         ¦  «        \  }}}}	}
}}}}}}nO|dk    r5|d         }t          t
          |dd …         ¦  «        \  }}}
}d	x}	x}x}x}}nd
|›�}t          |¦  «        ‚|||
|||	||||f
V — �Œd S )Nú
/diskstatsé   rF   rE   rö   é   é   rŸ  r   znot sure how to interpret line )r   r   r³  rž   rÂ   rÕ   r¶  r  )rÅ   r·  rß   rÇ   Úflenr±   ÚreadsÚreads_mergedÚrbytesÚrtimeÚwritesÚwrites_mergedÚwbytesÚwtimerû   rv   rò   s                    r7   Úread_procfsz%disk_io_counters.<locals>.read_procfs;  sé  è è € õ" �/Ñ+Ô+Ð7Ð7Ð7Ñ8Ô8ð 	"¸AØ—K’K‘M”MˆEð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"àð 	;ñ 	;ˆDØ—Z’Z‘\”\ˆFÝ�v‘;”;ˆDà�rŠzˆzà˜a”y�Ý˜F 1œI™œ�å69½#¸vÀaÈÀd¼|Ñ6LÔ6Lñ4�˜v u¨f°mØ˜E 1 i°°Ø˜’�˜t ršz˜zà˜a”y�å69½#¸vÀaÈÀd¼|Ñ6LÔ6Lñ4�˜ f¨e°V¸]Ø˜E 1 i°°Ø˜’�à˜a”y�Ý03µC¸ÀÀÀ¼Ñ0DÔ0DÑ-��v˜v vØKLÐL�ÐL˜ÐL ÐL¨}¸y¸yà@¸Ð@Ð@�Ý  ‘o”oÐ%Ø˜ ¨°¸¸uØ °	ð;ð ;ð ;ð ;ñ ;ð/	;ð 	;s   ¡AÁAÁ	Ac               3   ó\  K  — t          j        d¦  «        D �]} t          j        t           j                             d| ¦  «        ¦  «        D ]Ý\  }}}d|vrŒt          t           j                             |d¦  «        ¦  «        5 }|                     ¦   «                              ¦   «                              ¦   «         }d d d ¦  «         n# 1 swxY w Y   t           j         	                    |¦  «        }t          t          |d d…         ¦  «        \
  }}}	}
}}}}}}||||	||
||||f
V — ŒÞ�Œd S )Nú
/sys/blockÚstatr¾   )rœ   rl  Úwalkrx   rí   r   r  rÔ   rž   Úbasenamer¶  rÕ   )ÚblockÚrootrû   ÚfilesrÅ   rÇ   r±   rç  rè  ré  rê  rë  rì  rí  rî  rv   s                   r7   Ú
read_sysfsz$disk_io_counters.<locals>.read_sysfsi  s  è è € Ý”Z Ñ-Ô-ð 	Fñ 	FˆEÝ"$¤'­"¬'¯,ª,°|ÀUÑ*KÔ*KÑ"LÔ"Lð 
Fð 
F‘��a˜Ø Ð&Ð&ØÝ�rœwŸ|š|¨D°&Ñ9Ô9Ñ:Ô:ð 6¸aØŸVšV™XœXŸ^š^Ñ-Ô-×3Ò3Ñ5Ô5�Fð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6å”w×'Ò'¨Ñ-Ô-�õ 47µs¸FÀ3ÀBÀ3¼KÑ3HÔ3Hñ1�˜ f¨e°V¸]Ø˜E 1 iØ˜U F¨F°F¸EØ˜l¨M¸9ðFð Fð Fð Fð Fñ
Fð	Fð 	Fs   Â9C	Ã	CÃCrâ  rñ  z6/diskstats nor /sys/block are available on this system)rœ   rx   r’  r   r@  r³   ÚDISK_SECTOR_SIZE)Úperdiskrï  rø  Úgenrò   r¸  r
  r±   rç  rë  ré  rí  rê  rî  rè  rì  rv   s                    r7   Údisk_io_countersrü  6  s;  € ð
+;ð +;ð +;ð\Fð Fð Fõ 
„w‡~‚~�Ñ*Ô*Ð6Ð6Ð6Ñ7Ô7ð 	'Øˆk‰mŒmˆˆÝ	Œ�Š˜Ñ	%Ô	%ð 'Øˆj‰lŒlˆˆõ Ñ Ô ð ð ð ð 	õ " #Ñ&Ô&Ð&à€GØð Að Aˆð ).ñ	&ˆˆu�f˜f f¨e°U¸LØ˜9Øð 	Õ0°Ñ6Ô6ð 	ð àÕ"Ñ"ˆØÕ"Ñ"ˆØ ¨°¸¸uØ% }°iðAˆ�‰ˆð €Nr9   c                   ó8   — e Zd ZdZddgZd„ Zd„ Zd„ Zd„ Zd„ Z	d	S )
ÚRootFsDeviceFinderaF  disk_partitions() may return partitions with device == "/dev/root"
    or "rootfs". This container class uses different strategies to try to
    obtain the real device path. Resources:
    https://bootlin.com/blog/find-root-device/
    https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/.
    ÚmajorÚminorc                 óœ   — t          j        d¦  «        j        }t          j        |¦  «        | _        t          j        |¦  «        | _        d S )Nr­   )rœ   rò  Úst_devrÿ  r   )re  Údevs     r7   rf  zRootFsDeviceFinder.__init__©  s4   € ÝŒg�c‰lŒlÔ!ˆÝ”X˜c‘]”]ˆŒ
Ý”X˜c‘]”]ˆŒ
ˆ
ˆ
r9   c                 ó.  — t          t          ¦   «         › d�¦  «        5 }|                     ¦   «         dd …         D ]¿}|                     ¦   «         }t	          |¦  «        dk     rŒ*|d                              ¦   «         rt          |d         ¦  «        nd }|d                              ¦   «         rt          |d         ¦  «        nd }|d         }|| j        k    r || j        k    r|rd|› �c cd d d ¦  «         S ŒÀ	 d d d ¦  «         d S # 1 swxY w Y   d S )Nz/partitionsrE   rö   r   r   rF   ú/dev/)	r   r   r³  rž   rÂ   ÚisdigitrÕ   rÿ  r   )re  rÅ   rß   rÇ   rÿ  r   r±   s          r7   Úask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions®  sv  € Ý�/Ñ+Ô+Ð8Ð8Ð8Ñ9Ô9ð 
	.¸QØŸš™œ a b bÔ)ð 	.ð 	.�ØŸš™œ�Ý�v‘;”; ’?�?ØØ*0°¬)×*;Ò*;Ñ*=Ô*=ÐG�˜F 1œI™œ˜À4�Ø*0°¬)×*;Ò*;Ñ*=Ô*=ÐG�˜F 1œI™œ˜À4�Ø˜a”y�Ø˜DœJÒ&Ð&¨5°D´JÒ+>Ð+>Øð .Ø- t˜~˜~Ð-Ð-ð
	.ð 
	.ð 
	.ð 
	.ñ 
	.ô 
	.ð 
	.ð 
	.øð	.ð
	.ð 
	.ð 
	.ñ 
	.ô 
	.ð 
	.ð 
	.ð 
	.ð 
	.ð 
	.ð 
	.ð 
	.øøøð 
	.ð 
	.ð 
	.ð 
	.ð 
	.ð 
	.s   ŸCD
Ã;D
Ä
DÄDc                 ó6  — d| j         › d| j        › d�}t          |¦  «        5 }|D ]Y}|                     d¦  «        rB|                     ¦   «                              d¦  «        d         }|rd|› �c cd d d ¦  «         S ŒZ	 d d d ¦  «         d S # 1 swxY w Y   d S )Nz/sys/dev/block/r}  z/ueventzDEVNAME=rE   r  )rÿ  r   r   r2   rÔ   Ú
rpartition)re  rx   rÅ   rß   r±   s        r7   Úask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block»  s  € ØA ¤ÐAÐA¨d¬jÐAÐAÐAˆÝ�t‰_Œ_ð 	. Øð .ð .�Ø—?’? :Ñ.Ô.ð .ØŸ:š:™<œ<×2Ò2°:Ñ>Ô>¸qÔA�DØð .Ø- t˜~˜~Ð-Ð-ð	.ð 	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.øð.ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   £ABÁ?BÂBÂBc                 óÆ  — | j         › d| j        › �}t          j        d¦  «        }|D ]¸}	 t	          |¦  «        }|5  |                     ¦   «                              ¦   «         }||k    rOt          j         	                    t          j         
                    |¦  «        ¦  «        }d|› �cd d d ¦  «         c S 	 d d d ¦  «         n# 1 swxY w Y   Œ©# t          $ r Y Œµw xY wd S )Nr}  z/sys/class/block/*/devr  )rÿ  r   r  Úiglobr   r  rÔ   rœ   rx   rô  Údirnamerm  )re  Úneedler÷  r–  rÅ   Údatar±   s          r7   Úask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_blockÄ  sS  € Ø”JÐ-Ð- ¤Ð-Ð-ˆÝ”
Ð3Ñ4Ô4ˆØð 
	.ð 
	.ˆDð	.Ý˜d‘O”O�ð ð .ð .ØŸ6š6™8œ8Ÿ>š>Ñ+Ô+�DØ˜v’~�~Ý!œw×/Ò/µ´·²ÀÑ0EÔ0EÑFÔF˜Ø- t˜~˜~ð	.ð .ð .ð .ñ .ô .ð .ð .ð .ð .à%ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .øøõ %ð ð ð Ø�ðøøøð
	.ð 
	.s#   «C¼A-CÃC		ÃC		Ã
CÃCc                 óÈ  — d }|€<	 |                       ¦   «         }n&# t          $ r}t          |¦  «         Y d }~nd }~ww xY w|€<	 |                      ¦   «         }n&# t          $ r}t          |¦  «         Y d }~nd }~ww xY w|€<	 |                      ¦   «         }n&# t          $ r}t          |¦  «         Y d }~nd }~ww xY w|�!t
          j                             |¦  «        r|S d S d S rw  )r  rÓ   r   r
  r  rœ   rx   r’  )re  rx   rÝ   s      r7   ÚfindzRootFsDeviceFinder.findÓ  s(  € ØˆØˆ<ðØ×/Ò/Ñ1Ô1��øÝð ð ð Ý�c‘
”
�
�
�
�
�
�
øøøøðøøøàˆ<ðØ×-Ò-Ñ/Ô/��øÝð ð ð Ý�c‘
”
�
�
�
�
�
�
øøøøðøøøàˆ<ðØ×/Ò/Ñ1Ô1��øÝð ð ð Ý�c‘
”
�
�
�
�
�
�
øøøøðøøøð Ð¥¤§¢¨tÑ 4Ô 4ÐØˆKð ÐÐÐs@   † ›
>¥9¹>ÁA Á
A<Á#A7Á7A<ÂB Â
B:Â!B5Â5B:N)
rG   rH   rI   r­  Ú	__slots__rf  r  r
  r  r  rJ   r9   r7   rþ  rþ  Ÿ  su   € € € € € ðð ð ˜'Ð"€Ið#ð #ð #ð
.ð .ð .ð.ð .ð .ð.ð .ð .ðð ð ð ð r9   rþ  c                 óˆ  — t          ¦   «         }t          ¦   «         }| s·t          |› d�¦  «        5 }|D ]‰}|                     ¦   «         }|                     d¦  «        s(|                     |                     ¦   «         ¦  «         ŒS|                     d¦  «        d         }|dk    r|                     d¦  «         ŒŠ	 ddd¦  «         n# 1 swxY w Y   |dk    r?t          j         	                    d¦  «        r t          j         
                    d¦  «        }n"t          j         
                    |› d	�¦  «        }g }t          j        |¦  «        }|D ]l}	|	\  }
}}}|
d
k    rd}
|
dv r"t          ¦   «                              ¦   «         p|
}
| s|
r||vrŒ@t          j        |
|||¦  «        }|                     |¦  «         Œm|S )z8Return mounted disk partitions as a list of namedtuples.z/filesystemsÚnodevú	r   ÚzfsNrÊ   z	/etc/mtabz/self/mountsÚnoner   >   ú	/dev/rootÚrootfs)r  r   r   rÔ   r2   r  rž   rœ   rx   ÚisfileÚrealpathrø   Údisk_partitionsrþ  r  r   Ú	sdiskpartrÃ   )rW  ÚfstypesrÄ   rÅ   rß   ÚfstypeÚmounts_pathÚretlistÚ
partitionsÚ	partitionÚdeviceÚ
mountpointÚoptsÚntuples                 r7   r  r  ê  s  € å‰eŒe€GÝ!Ñ#Ô#€KØð 
+Ý˜+Ð3Ð3Ð3Ñ4Ô4ð 		+¸Øð +ð +�Ø—z’z‘|”|�Ø—’ wÑ/Ô/ð +Ø—K’K §
¢
¡¤Ñ-Ô-Ð-Ð-ð "ŸZšZ¨Ñ-Ô-¨aÔ0�FØ ’�ØŸš EÑ*Ô*Ð*øð+ð		+ð 		+ð 		+ñ 		+ô 		+ð 		+ð 		+ð 		+ð 		+ð 		+ð 		+øøøð 		+ð 		+ð 		+ð 		+ð �gÒÐ¥"¤'§.¢.°Ñ"=Ô"=ÐÝ”g×&Ò& {Ñ3Ô3ˆˆå”g×&Ò&¨+Ð'CÐ'CÐ'CÑDÔDˆà€GÝÔ% kÑ2Ô2€JØð 
ð 
ˆ	Ø+4Ñ(ˆ�
˜F DØ�VÒÐØˆFØÐ,Ð,Ð,Ý'Ñ)Ô)×.Ò.Ñ0Ô0Ð:°FˆFØð 	Øð ˜V¨7Ð2Ð2ØÝÔ" 6¨:°v¸tÑDÔDˆØ�Š�vÑÔÐÐà€Ns   ±BCÃCÃCc            	      óì  — t          j        t          ¦  «        } t          j        d¦  «        }|                     t          j        d¦  «        ¦  «         t          d„ |D ¦   «         ¦  «        }t          j        d¦  «        }t          j        d¦  «        }|D ]1}|                     d|¦  «        }||vr| 	                    |¦  «         Œ2|D �][}	 |dz   }t          t          |¦  «        ¦  «        dz  }t          j                             t          j                             |¦  «        d	¦  «        }t!          |¦  «                             ¦   «         }	n# t$          t&          f$ r Y Œšw xY wt          |d
z   d¬¦  «        }
t          |dz   d¬¦  «        }t!          |dz   d¬¦  «                             ¦   «         }|
�&	 t          |
¦  «        dz  }
n# t&          $ r d}
Y nw xY w|�&	 t          |¦  «        dz  }n# t&          $ r d}Y nw xY w| |	          	                    |||
|f¦  «         �Œ]|�s;t          j        d¦  «        }t          t)          |¦  «        ¦  «        }|D �]}	 t          j                             |d¦  «        }t          t          |¦  «        ¦  «        dz  }t          j                             |d¦  «        }t!          |¦  «                             ¦   «         }	n-# t$          t&          f$ r}t+          |¦  «         Y d}~Œªd}~ww xY wt          j        |dz   ¦  «        }d„ |D ¦   «         }d}d}
|D �]}t          j                             ||dz   ¦  «        }t!          |d¬¦  «                             ¦   «         }|dk    r3t          t          j                             ||dz   ¦  «        d¬¦  «        }n8|dk    r2t          t          j                             ||dz   ¦  «        d¬¦  «        }
|
�&	 t          |
¦  «        dz  }
n# t&          $ r d}
Y nw xY w|�'	 t          |¦  «        dz  }Œø# t&          $ r d}Y �Œw xY w�Œ| |	          	                    d||
|f¦  «         �Œ	t-          | ¦  «        S )aø  Return hardware (CPU and others) temperatures as a dict
    including hardware name, label, current, max and critical
    temperatures.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    - /sys/class/thermal/thermal_zone* is another one but it's more
      difficult to parse
    z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*c                 óD   — h | ]}|                      d ¦  «        d         ’ŒS ©rû   r   ©rž   r4   s     r7   ú	<setcomp>z'sensors_temperatures.<locals>.<setcomp>)  ó&   € Ð;Ð;Ð;¨A˜Ÿš ™œ QœÐ;Ð;Ð;r9   z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg     @�@r±   Ú_maxNr9  Ú_critÚ_labelr   z /sys/class/thermal/thermal_zone*ÚtempÚtypez/trip_point*c                 ó¨   — h | ]O}d                       t          j                             |¦  «                             d ¦  «        dd…         ¦  «        ’ŒPS )rû   r   rF   )rí   rœ   rx   rô  rž   )r5   Úps     r7   r-  z'sensors_temperatures.<locals>.<setcomp>j  s[   € ð ð ð àð —’�œ×)Ò)¨!Ñ,Ô,×2Ò2°3Ñ7Ô7¸¸!¸Ô<Ñ=Ô=ðð ð r9   Ú_typeÚcriticalÚ_tempÚhigh)Úcollectionsr   rk  r  ÚextendÚsortedr  r  ÚsubrÃ   r  r   rœ   rx   rí   r  r   rÔ   rÓ   r  r  r   Údict)rC  Ú	basenamesÚ
basenames2Úreplr±   ÚaltnameÚbaserx   ÚcurrentÚ	unit_namer:  r8  ÚlabelrÝ   Ú
trip_pathsÚtrip_pointsÚ
trip_pointÚ	trip_types                     r7   Úsensors_temperaturesrL    së  € õ Ô
!¥$Ñ
'Ô
'€CÝ”	Ð;Ñ<Ô<€Ið ×Ò•T”YÐGÑHÔHÑIÔIÐIÝÐ;Ð;°Ð;Ñ;Ô;Ñ<Ô<€Iõ ”Ø?ñô €Jõ Œ:Ð@ÑAÔA€DØð #ð #ˆØ—(’(Ð.°Ñ5Ô5ˆØ˜)Ð#Ð#Ø×Ò˜TÑ"Ô"Ð"øàð  @ñ  @ˆð	Ø˜(‘?ˆDÝ�D ™JœJÑ'Ô'¨&Ñ0ˆGÝ”7—<’<¥¤§¢°Ñ 5Ô 5°vÑ>Ô>ˆDÝ˜D™	œ	ŸšÑ)Ô)ˆIˆIøÝ�Ð$ð 		ð 		ð 		ð ˆHð		øøøõ �D˜6‘M¨DÐ1Ñ1Ô1ˆÝ˜˜w™°Ð6Ñ6Ô6ˆÝ�D˜8‘O¨bÐ1Ñ1Ô1×7Ò7Ñ9Ô9ˆàÐðÝ˜T‘{”{ VÑ+��øÝð ð ð Ø���ðøøøàÐð Ý  ™?œ?¨VÑ3��øÝð  ð  ð  Ø���ð øøøð 	ˆIŒ×Ò˜u g¨t°XÐ>Ñ?Ô?Ð?Ñ?ð ñ ,AÝ”IÐ@ÑAÔAˆ	Ý�3˜y™>œ>Ñ*Ô*ˆ	àð (	Añ (	AˆDðÝ”w—|’| D¨&Ñ1Ô1�Ý¥ T¡
¤
Ñ+Ô+¨fÑ4�Ý”w—|’| D¨&Ñ1Ô1�Ý ™IœIŸOšOÑ-Ô-�	�	øÝ�ZÐ(ð ð ð Ý�c‘
”
�
Ø����øøøøðøøøõ œ 4¨.Ñ#8Ñ9Ô9ˆJðð à#ðñ ô ˆKð ˆHØˆDØ)ð (ñ (�
Ý”w—|’| D¨*°wÑ*>Ñ?Ô?�Ý ¨rÐ2Ñ2Ô2×8Ò8Ñ:Ô:�	Ø 
Ò*Ð*Ý#ÝœŸš T¨:¸Ñ+?Ñ@Ô@È4ð ñ  ô  �H�Hð  &Ò(Ð(ÝÝœŸš T¨:¸Ñ+?Ñ@Ô@È4ðñ ô �Dð Ð#ð$Ý$ T™{œ{¨VÑ3˜˜øÝ%ð $ð $ð $Ø#˜˜˜ð$øøøàÐ'ð(Ý#(¨¡?¤?°VÑ#;˜˜øÝ%ð (ð (ð (Ø#'˜˜™ð(øøøñ (ð �	ŒN×!Ò! 2 w°°hÐ"?Ñ@Ô@Ð@Ñ@å�‰9Œ9Ðst   ÃBEÅE'Å&E'Æ;GÇGÇGÇ#G6Ç6HÈHÉ"B K#Ë#LË4LÌLÏ6P	Ð	PÐPÐP1Ð1QÑ Qc                  óÐ  — t          j        t          ¦  «        } t          j        d¦  «        }|st          j        d¦  «        }t	          d„ |D ¦   «         ¦  «        }|D ]ù}	 t          t          |dz   ¦  «        ¦  «        }n&# t          $ r}t          |¦  «         Y d}~ŒAd}~ww xY wt          t          j                             t          j                             |¦  «        d¦  «        ¦  «                             ¦   «         }t          |dz   d¬	¦  «                             ¦   «         }| |                              t!          j        ||¦  «        ¦  «         Œút%          | ¦  «        S )
a‡  Return hardware fans info (for CPU and other peripherals) as a
    dict including hardware label and current speed.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*c                 óD   — h | ]}|                      d ¦  «        d         ’ŒS r+  r,  r4   s     r7   r-  zsensors_fans.<locals>.<setcomp>�  r.  r9   r/  Nr±   r2  r   r9  )r;  r   rk  r  r=  rÕ   r   rÓ   r   r   rœ   rx   rí   r  rÔ   rÃ   r   Úsfanr?  )rC  r@  rD  rE  rÝ   rF  rG  s          r7   Úsensors_fansrP  Œ  sM  € õ Ô
!¥$Ñ
'Ô
'€CÝ”	Ð:Ñ;Ô;€IØð Gõ ”IÐEÑFÔFˆ	åÐ;Ð;°Ð;Ñ;Ô;Ñ<Ô<€IØð <ð <ˆð	Ý�$˜t h™Ñ/Ô/Ñ0Ô0ˆGˆGøÝð 	ð 	ð 	Ý�#‰JŒJˆJØˆHˆHˆHˆHøøøøð	øøøõ �œŸš¥R¤W§_¢_°TÑ%:Ô%:¸FÑCÔCÑDÔD×JÒJÑLÔLˆ	Ý�D˜8‘O¨bÐ1Ñ1Ô1×7Ò7Ñ9Ô9ˆØˆIŒ×Ò�gœl¨5°'Ñ:Ô:Ñ;Ô;Ð;Ð;å�‰9Œ9Ðs   Á"BÂ
B%ÂB Â B%c                  ó\  ‡— t          ¦   «         Šˆfd„} d„ t          j        t          ¦  «        D ¦   «         }|sdS t          j                             t          t          |¦  «        ¦  «        } | |dz   |dz   ¦  «        } | |dz   |dz   ¦  «        } | |dz   |d	z   ¦  «        } | |d
z   ¦  «        }|�|�	 d|z  |z  }n;# t          $ r d}Y n-w xY wt          t          |dz   d¬¦  «        ¦  «        }|dk    rdS d} | t          j                             t          d¦  «        t          j                             t          d¦  «        ¦  «        }	|	�|	dk    }nGt          |dz   d¬¦  «         
                    ¦   «                              ¦   «         }
|
dk    rd}n|
dv rd}|rt          j        }nj|�5|�3	 t          ||z  dz  ¦  «        }nO# t          $ r t          j        }Y n7w xY w|�%t          |dz  ¦  «        }|dk     rt          j        }nt          j        }t          j        |||¦  «        S )a  Return battery information.
    Implementation note: it appears /sys/class/power_supply/BAT0/
    directory structure may vary and provide files with the same
    meaning but under different names, see:
    https://github.com/giampaolo/psutil/issues/966.
    c                  ó°   •— | D ]Q}t          |‰¬¦  «        }|‰k    r8	 t          |¦  «        c S # t          $ r |                     ¦   «         cY c S w xY wŒRdS )zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        r9  N)r   rÕ   r  rÔ   )rB  rx   rC  Únulls      €r7   Ú
multi_bcatz#sensors_battery.<locals>.multi_bcat´  s„   ø€ ð ð 	'ð 	'ˆDÝ�t dÐ+Ñ+Ô+ˆCØ�dŠ{ˆ{ð'Ý˜s™8œ8�O�O�OøÝ!ð 'ð 'ð 'ØŸ9š9™;œ;Ð&Ð&Ð&Ð&Ð&ð'øøøð ð
 ˆts   ž/¯AÁAc                 óh   — g | ]/}|                      d ¦  «        sd|                     ¦   «         v ¯-|‘Œ0S )ÚBATÚbattery)r2   r  r4   s     r7   r8   z#sensors_battery.<locals>.<listcomp>Á  sK   € ð ð ð àØ�<Š<˜ÑÔðð #,¨q¯wªw©y¬yÐ"8Ð"8ð 	
à"8Ð"8Ð"8r9   Nz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@rË   z	/capacityrj  r9  z
AC0/onlinez	AC/onliner   ú/statusr   ÚdischargingF>   ÚfullÚchargingTi  é<   r   )Úobjectrœ   rl  ÚPOWER_SUPPLY_PATHrx   rí   r×   ÚZeroDivisionErrorrÕ   r   rÔ   r  r   ÚPOWER_TIME_UNLIMITEDÚPOWER_TIME_UNKNOWNÚsbattery)rT  Úbatsrö  Ú
energy_nowÚ	power_nowÚenergy_fullÚtime_to_emptyrd   Úpower_pluggedÚonlinerœ  ÚsecsleftrS  s               @r7   Úsensors_batteryrk  «  s«  ø€ õ ‰8Œ8€Dðð ð ð ð ðð å”Õ-Ñ.Ô.ðñ ô €Dð
 ð Øˆtõ Œ7�<Š<Õ)­3¨t©9¬9Ñ5Ô5€Dð �˜D =Ñ0°$¸Ñ2FÑGÔG€JØ�
˜4 ,Ñ.°°~Ñ0EÑFÔF€IØ�*˜T NÑ2°D¸>Ñ4IÑJÔJ€KØ�J˜tÐ&:Ñ:Ñ;Ô;€Mð Ð :Ð#9ð	Ø˜jÑ(¨;Ñ6ˆGˆGøÝ ð 	ð 	ð 	ØˆGˆGˆGð	øøøõ •c˜$ Ñ,°rÐ:Ñ:Ô:Ñ;Ô;ˆØ�bŠ=ˆ=Ø�4ð
 €MØˆZÝ
Œ�ŠÕ&¨Ñ5Ô5Ý
Œ�ŠÕ&¨Ñ4Ô4ñô €Fð ÐØ !šˆˆå�T˜IÑ%°Ð3Ñ3Ô3×9Ò9Ñ;Ô;×AÒAÑCÔCˆØ�]Ò"Ð"Ø!ˆMˆMØÐ+Ð+Ð+Ø ˆMð ð .ÝÔ/ˆˆØ	Ð	 IÐ$9ð	2Ý˜:¨	Ñ1°DÑ8Ñ9Ô9ˆHˆHøÝ ð 	2ð 	2ð 	2ÝÔ1ˆHˆHˆHð	2øøøà	Ð	"Ý�} rÑ)Ñ*Ô*ˆØ�aŠ<ˆ<ÝÔ1ˆHøåÔ-ˆåÔ˜G X¨}Ñ=Ô=Ð=s$   Â7C  Ã CÃCÆ3G	 Ç	G"Ç!G"c                  ó¨   — g } t          j        ¦   «         }|D ]9}|\  }}}}}t          j        ||pd|||¦  «        }|                      |¦  «         Œ:| S )z:Return currently connected users as a list of namedtuples.N)rø   Úusersr   ÚsuserrÃ   )	r"  ÚrawlistÚitemr‘   ÚttyÚhostnameÚtstamprr  Únts	            r7   rm  rm  
  sf   € à€GÝŒj‰lŒl€GØð ð ˆØ+/Ñ(ˆˆc�8˜V SÝŒ]˜4  ¨¨h¸ÀÑDÔDˆØ�Š�rÑÔÐÐØ€Nr9   c                  óP  — t          ¦   «         › d�} t          | ¦  «        5 }|D ]b}|                     d¦  «        rKt          |                     ¦   «                              ¦   «         d         ¦  «        }|a|c cddd¦  «         S Œcd| › �}t          |¦  «        ‚# 1 swxY w Y   dS )zAReturn the system boot time expressed in seconds since the epoch.rµ   s   btimer   Nzline 'btime' not found in )r   r   r2   r  rÔ   rž   Ú	BOOT_TIMEr“  )rx   rÅ   rß   rC  rò   s        r7   Ú	boot_timerw    sþ   € õ ÑÔÐ&Ð&Ð&€DÝ	�TÑ	Ô	ð  ˜aØð 	ð 	ˆDØ�Š˜xÑ(Ô(ð Ý˜DŸJšJ™LœL×.Ò.Ñ0Ô0°Ô3Ñ4Ô4�Ø�	Ø�
�
ð ð  ð  ð  ñ  ô  ð  ð  ðð 2¨4Ð1Ð1ˆÝ˜3ÑÔÐð ð  ð  ð  øøøð  ð  ð  ð  ð  ð  s   ¡ABÂBÂBÂ"Bc                  óŠ   — t          ¦   «                              t          ¦  «        } d„ t          j        | ¦  «        D ¦   «         S )z7Returns a list of PIDs currently running on the system.c                 óT   — g | ]%}|                      ¦   «         ¯t          |¦  «        ‘Œ&S rJ   )r  rÕ   r4   s     r7   r8   zpids.<locals>.<listcomp>+  s+   € Ð<Ð<Ð<�q°·	²	±´Ð<�C�‰FŒFÐ<Ð<Ð<r9   )r   r€  r
   rœ   rl  r    s    r7   rx  rx  (  s9   € åÑÔ×#Ò#¥HÑ-Ô-€DØ<Ð<�BœJ tÑ,Ô,Ð<Ñ<Ô<Ð<r9   c                 ó²  — t          j        | ¦  «        sdS 	 t          ¦   «         › d| › d�}t          |¦  «        5 }|D ]R}|                     d¦  «        r;t          |                     ¦   «         d         ¦  «        }|| k    c cddd¦  «         S ŒSd|› �}t          |¦  «        ‚# 1 swxY w Y   dS # t          t          f$ r | t          ¦   «         v cY S w xY w)zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    Fr­   rX  s   Tgid:r   Nz'Tgid' line not found in )
r   Ú
pid_existsr   r   r2   rÕ   rž   r  rÓ   rx  )rr  rx   rÅ   rß   Útgidrò   s         r7   r{  r{  .  sO  € õ Ô˜sÑ#Ô#ð !Øˆuð	!õ &Ñ'Ô'Ð6Ð6¨#Ð6Ð6Ð6ˆDÝ˜TÑ"Ô"ð & aØð +ð +�DØ—’ xÑ0Ô0ð +Ý" 4§:¢:¡<¤<°¤?Ñ3Ô3˜ð  $ sš{Ð*Ð*ð&ð &ð &ð &ñ &ô &ð &ð &ð+ð
 9°$Ð8Ð8�Ý  ‘o”oÐ%ð&ð &ð &ð &øøøð &ð &ð &ð &ð &ð &øõ �Ð$ð 	!ð 	!ð 	!Ø�$™&œ&�=Ð Ð Ð ð	!øøøs;   ˜#B2 »AB%ÂB2 ÂB%Â%B)Â)B2 Â,B)Â-B2 Â2!CÃCc                  ó–  — i } t          ¦   «         }t          ¦   «         D ]©}	 t          |› d|› d�¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   |                     d¦  «        }||dz   d…                              ¦   «         }t          |d         ¦  «        }|| |<   Œ“# t          t          f$ r Y Œ¦w xY w| S )zsObtain a {pid: ppid, ...} dict for all running processes in
    one shot. Used to speed up Process.children().
    r­   rµ   Nó   )rE   r   )	r   rx  r   r  r´  rž   rÕ   rm  rn  )rC  rÄ   rr  rÅ   r  ÚrparÚdsetÚppids           r7   Úppid_mapr‚  O  s&  € ð €CÝ!Ñ#Ô#€KÝ‰vŒvð ð ˆð	Ý Ð8Ð8¨cÐ8Ð8Ð8Ñ9Ô9ð  ¸QØ—v’v‘x”x�ð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  ð —:’:˜dÑ#Ô#ˆDØ˜˜q™˜
˜
Ô#×)Ò)Ñ+Ô+ˆDÝ�t˜A”w‘<”<ˆDØˆC�‰HˆHøõ "Õ#5Ð6ð 	ð 	ð 	ð ˆDð	øøøð €Js4   ¢B2·AÁB2ÁA	ÁB2ÁA	Á B2Â2CÃCc                 óF   ‡ — t          j        ‰ ¦  «        ˆ fd„¦   «         }|S )zlDecorator which translates bare OSError and OSError exceptions
    into NoSuchProcess and AccessDenied.
    c                 óž  •— | j         | j        }}	  ‰| g|¢R i |¤ŽS # t          $ r}t          ||¦  «        |‚d }~wt          $ r*}|                      ¦   «          t          ||¦  «        |‚d }~wt          $ rU}|                      ¦   «          t          j	         
                    | j        › d|› d�¦  «        st          ||¦  «        |‚‚ d }~ww xY w)Nr­   rµ   )rr  Ú_namerz  r   rn  Ú_raise_if_zombier   rm  rœ   rx   r’  rd  )re  rÒ   Úkwargsrr  r±   rÝ   Úfuns         €r7   Úwrapperz wrap_exceptions.<locals>.wrapperj  s	  ø€ à”H˜dœjˆTˆð	Ø�3�tÐ-˜dÐ-Ð-Ð- fÐ-Ð-Ð-øÝð 	3ð 	3ð 	3Ý˜s DÑ)Ô)¨sÐ2øøøøÝ!ð 	4ð 	4ð 	4Ø×!Ò!Ñ#Ô#Ð#Ý  TÑ*Ô*°Ð3øøøøÝ ð 	ð 	ð 	Ø×!Ò!Ñ#Ô#Ð#õ ”7—>’> TÔ%6Ð"CÐ"C¸Ð"CÐ"CÐ"CÑDÔDð 8Ý# C¨Ñ.Ô.°CÐ7Øøøøøð	øøøs+   ‘ �
C§8¸CÁ%A*Á*CÁ7ACÃC)Ú	functoolsÚwraps)rˆ  r‰  s   ` r7   Úwrap_exceptionsrŒ  e  s:   ø€ õ
 „_�SÑÔðð ð ð ñ Ôðð$ €Nr9   c                   ó  — e Zd ZdZg d¢Zd„ Zd„ Zd„ Zd„ Ze	e
d„ ¦   «         ¦   «         Ze	e
d„ ¦   «         ¦   «         Ze	e
d	„ ¦   «         ¦   «         Zd
„ Zd„ Ze	d„ ¦   «         Ze	d„ ¦   «         Ze	d„ ¦   «         Ze	d„ ¦   «         Ze	d„ ¦   «         Zej                             d ej        ¦   «         › d�¦  «        re	d„ ¦   «         Ze	d„ ¦   «         Ze	d„ ¦   «         Ze	d;d„¦   «         Ze	d„ ¦   «         Ze	d„ ¦   «         Zese rHd„ Z!e	 e"j#        d¦  «         e"j#        d¦  «         e"j#        d¦  «        fd„¦   «         Z$e	d„ ¦   «         Z%neZ%e re	d „ ¦   «         Z&e	d!„ ¦   «         Z'e	 e"j#        d"¦  «        fd#„¦   «         Z(e	 e"j#        d$¦  «        fd%„¦   «         Z)e	d&„ ¦   «         Z*e	d'„ ¦   «         Z+e	d(„ ¦   «         Z,e-r)e	d)„ ¦   «         Z. e"j#        d*¦  «        fd+„Z/e	d,„ ¦   «         Z0e1re	d-„ ¦   «         Z2e	d.„ ¦   «         Z3 e4e5d/¦  «        re	d;d0„¦   «         Z6e	d1„ ¦   «         Z7e	d2„ ¦   «         Z8e	d<d4„¦   «         Z9e	d5„ ¦   «         Z:e	d6„ ¦   «         Z;e	 e"j#        d7¦  «        fd8„¦   «         Z<e	 e"j#        d9¦  «        fd:„¦   «         Z=dS )=ÚProcesszLinux process implementation.)Ú_cacher…  Ú_ppidrd  rr  c                 óV   — || _         d | _        d | _        t          ¦   «         | _        d S rw  )rr  r…  r�  r   rd  )re  rr  s     r7   rf  zProcess.__init__…  s+   € ØˆŒØˆŒ
ØˆŒ
Ý+Ñ-Ô-ˆÔÐÐr9   c                 óº   — 	 t          | j        › d| j        › d�¦  «        }|                     d¦  «        }||dz   |dz   …         }|dk    S # t          $ r Y dS w xY w)Nr­   rµ   r~  rE   rF   ó   ZF)r   rd  rr  r´  rÓ   )re  r  r  rœ  s       r7   Ú
_is_zombiezProcess._is_zombie‹  s‚   € ð	"Ý˜4Ô,Ð>Ð>¨t¬xÐ>Ð>Ð>Ñ?Ô?ˆDð —:’:˜dÑ#Ô#ˆDØ˜$ ™( T¨A¡XÐ-Ô.ˆFØ˜T’>Ð!øõ ð 	ð 	ð 	Ø�5�5ð	øøøs   ‚A Á
AÁAc                 ón   — |                       ¦   «         r t          | j        | j        | j        ¦  «        ‚d S rw  )r”  r   rr  r…  r�  ©re  s    r7   r†  zProcess._raise_if_zombie›  s9   € Ø�?Š?ÑÔð 	BÝ ¤¨$¬*°d´jÑAÔAÐAð	Bð 	Br9   c                 óL   — t          j        | j        › d| j        › �¦  «         dS )z+Raise NSP if the process disappeared on us.r­   N)rœ   rò  rd  rr  r–  s    r7   Ú_raise_if_not_alivezProcess._raise_if_not_aliveŸ  s-   € õ 	Œ�4Ô$Ð1Ð1 t¤xÐ1Ð1Ñ2Ô2Ð2Ð2Ð2r9   c                 ó"  — t          | j        › d| j        › d�¦  «        }|                     d¦  «        }||                     d¦  «        dz   |…         }||dz   d…                              ¦   «         }i }||d<   |d	         |d
<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   	 |d         |d<   n$# t          $ r t          d¦  «         d	|d<   Y nw xY w|S )aY  Parse /proc/{pid}/stat file and return a dict with various
        process info.
        Using "man proc" as a reference: where "man proc" refers to
        position N always subtract 3 (e.g ppid position 4 in
        'man proc' == position 1 in here).
        The return value is cached in case oneshot() ctx manager is
        in use.
        r­   rµ   r~  ó   (r   rE   Nr±   r   rœ  r�  rö   Úttynré   Úutimeé   Ústimeé   Úchildren_utimerä  Úchildren_stimeé   Úcreate_timeé$   Úcpu_numé'   Úblkio_ticksz&can't get blkio_ticks, set iowait to 0)r   rd  rr  r´  r  rž   Ú
IndexErrorr   )re  r  r  r±   rÇ   rC  s         r7   Ú_parse_stat_filezProcess._parse_stat_file¥  sU  € õ �tÔ(Ð:Ð:¨4¬8Ð:Ð:Ð:Ñ;Ô;ˆð �zŠz˜$ÑÔˆØ�D—I’I˜d‘O”O aÑ'¨$Ð.Ô/ˆØ�d˜Q‘h�j�jÔ!×'Ò'Ñ)Ô)ˆàˆØˆˆF‰Ø˜qœ	ˆˆH‰Ø˜Q”iˆˆF‰Ø˜a”yˆˆG‰Ø˜b”zˆˆG‰Ø˜b”zˆˆG‰Ø & r¤
ˆÐÑØ & r¤
ˆÐÑØ# BœZˆˆMÑØ œˆˆI‰ð	#Ø!'¨¤ˆC�ÑÐøÝð 	#ð 	#ð 	#åÐ:Ñ;Ô;Ð;Ø!"ˆC�ÑÐÐð	#øøøð
 ˆ
s   ÃC+ Ã+DÄDc                 óœ   — t          | j        › d| j        › d�¦  «        5 }|                     ¦   «         cddd¦  «         S # 1 swxY w Y   dS )z�Read /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        r­   rX  N)r   rd  rr  r  ©re  rÅ   s     r7   Ú_read_status_filezProcess._read_status_fileÌ  s”   € õ ˜DÔ-ÐAÐA°´ÐAÐAÐAÑBÔBð 	ÀaØ—6’6‘8”8ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s    AÁAÁAc                 óÀ   — t          | j        › d| j        › d�¦  «        5 }|                     ¦   «                              ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S )Nr­   r;   )r   rd  rr  r  rÔ   r¬  s     r7   Ú_read_smaps_filezProcess._read_smaps_fileÖ  sž   € õ ˜DÔ-Ð@Ð@°´Ð@Ð@Ð@ÑAÔAð 	$ÀQØ—6’6‘8”8—>’>Ñ#Ô#ð	$ð 	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð 	$ð 	$s    &AÁAÁAc                 ó¢   — | j                              | ¦  «         | j                             | ¦  «         | j                             | ¦  «         d S rw  )rª  Úcache_activater­  r¯  r–  s    r7   Úoneshot_enterzProcess.oneshot_enterÜ  sM   € ØÔ×,Ò,¨TÑ2Ô2Ð2ØÔ×-Ò-¨dÑ3Ô3Ð3ØÔ×,Ò,¨TÑ2Ô2Ð2Ð2Ð2r9   c                 ó¢   — | j                              | ¦  «         | j                             | ¦  «         | j                             | ¦  «         d S rw  )rª  Úcache_deactivater­  r¯  r–  s    r7   Úoneshot_exitzProcess.oneshot_exitá  sM   € ØÔ×.Ò.¨tÑ4Ô4Ð4ØÔ×/Ò/°Ñ5Ô5Ð5ØÔ×.Ò.¨tÑ4Ô4Ð4Ð4Ð4r9   c                 óP   — t          |                      ¦   «         d         ¦  «        S )Nr±   )r   rª  r–  s    r7   r±   zProcess.nameæ  s#   € õ �d×+Ò+Ñ-Ô-¨fÔ5Ñ6Ô6Ð6r9   c                 óø   — 	 t          | j        › d| j        › d�¦  «        S # t          t          f$ rG |                      ¦   «          t          j                             | j        › d| j        › �¦  «        rY dS ‚ w xY w)Nr­   z/exer   )	r�   rd  rr  rm  rn  r†  rœ   rx   Úlexistsr–  s    r7   ÚexezProcess.exeë  s“   € ð		Ý˜tÔ0ÐAÐA°4´8ÐAÐAÐAÑBÔBÐBøÝ!Õ#5Ð6ð 	ð 	ð 	Ø×!Ò!Ñ#Ô#Ð#õ Œw�Š $Ô"3Ð@Ð@°d´hÐ@Ð@ÑAÔAð Ø�r�rØð	øøøs   ‚! ¡AA9Á7A9c                 óÊ  — t          | j        › d| j        › d�¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   |s|                      ¦   «          g S |                     d¦  «        rdnd}|                     |¦  «        r
|d d…         }|                     |¦  «        }|dk    r,t          |¦  «        dk    rd|v r|                     d¦  «        }|S )Nr­   z/cmdliner—   rŒ   rj  r   )r   rd  rr  r  r†  rŸ   rž   rÂ   )re  rÅ   r  ÚsepÚcmdlines        r7   r¼  zProcess.cmdlineø  s'  € å˜$Ô+Ð@Ð@¨d¬hÐ@Ð@Ð@ÑAÔAð 	ÀQØ—6’6‘8”8ˆDð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	àð 	à×!Ò!Ñ#Ô#Ð#ØˆIð Ÿš fÑ-Ô-Ð6ˆfˆf°3ˆØ�=Š=˜ÑÔð 	Ø˜˜˜”9ˆDØ—*’*˜S‘/”/ˆð �&Š=ˆ=�S ™\œ\¨QÒ.Ð.°3¸$°;°;Ø—j’j ‘o”oˆGØˆó    AÁAÁAc                 ó¶   — t          | j        › d| j        › d�¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   t	          |¦  «        S )Nr­   z/environ)r   rd  rr  r  r   )re  rÅ   r  s      r7   ÚenvironzProcess.environ  s“   € å˜$Ô+Ð@Ð@¨d¬hÐ@Ð@Ð@ÑAÔAð 	ÀQØ—6’6‘8”8ˆDð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	å" 4Ñ(Ô(Ð(r½  c                 óª   — t          |                      ¦   «         d         ¦  «        }t          j        ¦   «         }	 ||         S # t          $ r Y d S w xY w)Nr›  )rÕ   rª  r   Úget_terminal_maprÑ   )re  Útty_nrrc  s      r7   ÚterminalzProcess.terminal  s_   € å�T×*Ò*Ñ,Ô,¨WÔ5Ñ6Ô6ˆÝÔ(Ñ*Ô*ˆð	Ø˜”<ÐøÝð 	ð 	ð 	Ø�4�4ð	øøøs   ¼A Á
AÁAr:   ú/ioc           	      ó4  — | j         › d| j        › d�}i }t          |¦  «        5 }|D ]T}|                     ¦   «         }|r<	 |                     d¦  «        \  }}t          |¦  «        ||<   ŒD# t          $ r Y ŒPw xY wŒU	 d d d ¦  «         n# 1 swxY w Y   |s|› d�}t          |¦  «        ‚	 t          |d         |d         |d         |d         |d	         |d
         ¦  «        S # t          $ r*}|j
        d         ›d|› d|›�}t          |¦  «        d ‚d }~ww xY w)Nr­   rÄ  s   : z file was emptys   syscrs   syscws
   read_bytess   write_bytess   rchars   wcharr   z field was not found in z; found fields are )rd  rr  r   rÔ   rž   rÕ   r  r“  r�   rÑ   rÒ   )	re  ÚfnamerÇ   rÅ   rß   r±   r'  rò   rÝ   s	            r7   Úio_counterszProcess.io_counters$  sÎ  € àÔ(Ð8Ð8¨4¬8Ð8Ð8Ð8ˆEØˆFÝ˜UÑ#Ô#ð 6 qØð 
6ð 
6�DàŸ:š:™<œ<�DØð 6ð6Ø*.¯*ª*°UÑ*;Ô*;™K˜D %õ
 ,/¨u©:¬:˜F 4™L˜Løõ	  *ð %ð %ð %à$˜Hð%øøøð6ð
6ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ð ð (ØÐ/Ð/Ð/�Ý" 3Ñ'Ô'Ð'ð0ÝØ˜8Ô$Ø˜8Ô$Ø˜=Ô)Ø˜>Ô*Ø˜8Ô$Ø˜8Ô$ñô ð øõ ð 0ð 0ð 0à”x ”{ð .ð .¸eð .ð .Ø#)ð.ð .ð õ ! ‘o”o¨4Ð/øøøøð0øøøsM   ¤B	Á A+ÁB	Á+
A8Á5B	Á7A8Á8B	Â	BÂBÂ+7C# Ã#
DÃ-%DÄDc                 ór  — |                       ¦   «         }t          |d         ¦  «        t          z  }t          |d         ¦  «        t          z  }t          |d         ¦  «        t          z  }t          |d         ¦  «        t          z  }t          |d         ¦  «        t          z  }t          |||||¦  «        S )Nr�  rŸ  r¡  r¢  r¨  )rª  r  r  r�   )re  rÆ   r�  rŸ  r¡  r¢  r•   s          r7   r  zProcess.cpu_timesG  sœ   € à×&Ò&Ñ(Ô(ˆÝ�f˜W”oÑ&Ô&­Ñ4ˆÝ�f˜W”oÑ&Ô&­Ñ4ˆÝ˜vÐ&6Ô7Ñ8Ô8½;ÑFˆÝ˜vÐ&6Ô7Ñ8Ô8½;ÑFˆÝ�v˜mÔ,Ñ-Ô-µÑ;ˆÝ˜  ~°~ÀvÑNÔNÐNr9   c                 óP   — t          |                      ¦   «         d         ¦  «        S )zWhat CPU the process is on.r¦  ©rÕ   rª  r–  s    r7   r¦  zProcess.cpu_numQ  s#   € õ �4×(Ò(Ñ*Ô*¨9Ô5Ñ6Ô6Ð6r9   Nc                 óB   — t          j        | j        || j        ¦  «        S rw  )r   Úwait_pidrr  r…  )re  Útimeouts     r7   ÚwaitzProcess.waitV  s   € åÔ  ¤¨7°D´JÑ?Ô?Ð?r9   c                 ó”   — t          |                      ¦   «         d         ¦  «        }t          pt          ¦   «         }|t          z  |z   S )Nr¤  )r  rª  rv  rw  r  )re  ÚctimeÚbts      r7   r¤  zProcess.create_timeZ  s@   € å�d×+Ò+Ñ-Ô-¨mÔ<Ñ=Ô=ˆõ Ð%�)™+œ+ˆØ�Ñ# rÑ)Ð)r9   c           	      ó  — t          | j        › d| j        › d�¦  «        5 }d„ |                     ¦   «                              ¦   «         d d…         D ¦   «         \  }}}}}}}d d d ¦  «         n# 1 swxY w Y   t          |||||||¦  «        S )Nr­   z/statmc              3   óD   K  — | ]}t          |¦  «        t          z  V — Œd S rw  )rÕ   rÖ   r4   s     r7   ú	<genexpr>z&Process.memory_info.<locals>.<genexpr>s  s>   è è € ð 8ð 8Ø&'•�A‘”�Ñ!ð8ð 8ð 8ð 8ð 8ð 8r9   rŸ  )r   rd  rr  rÁ   rž   r}   )	re  rÅ   Úvmsrƒ   rk   ÚtextÚlibr  Údirtys	            r7   Úmemory_infozProcess.memory_infoe  sà   € õ ˜DÔ-Ð@Ð@°´Ð@Ð@Ð@ÑAÔAð 	ÀQð8ð 8Ø+,¯:ª:©<¬<×+=Ò+=Ñ+?Ô+?ÀÀÀÔ+Cð8ñ 8ô 8Ñ4ˆC��f˜d C¨¨uð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ �C˜˜f d¨C°°uÑ=Ô=Ð=s    AA-Á-A1Á4A1c                 ó  — dx}x}}t          | j        › d| j        › d�¦  «        5 }|D ]Ä}|                     d¦  «        r.|t	          |                     ¦   «         d         ¦  «        dz  z  }ŒE|                     d¦  «        r+t	          |                     ¦   «         d         ¦  «        dz  }Œ…|                     d¦  «        r*t	          |                     ¦   «         d         ¦  «        dz  }ŒÅ	 d d d ¦  «         n# 1 swxY w Y   |||fS )	Nr   r­   r<   s   Private_r   rå   ó   Pss:ó   Swap:)r   rd  rr  r2   rÕ   rž   )re  r   r€   r�   rÅ   rß   s         r7   Ú_parse_smaps_rollupzProcess._parse_smaps_rollupz  sR  € ð  !Ð ˆCÐ �#˜ÝØÔ$Ð>Ð> t¤xÐ>Ð>Ð>ñô ð 
;àØð ;ð ;�DØ—’ {Ñ3Ô3ð ;à�s 4§:¢:¡<¤<°¤?Ñ3Ô3°dÑ:Ñ:˜˜ØŸš¨Ñ1Ô1ð ;Ý! $§*¢*¡,¤,¨q¤/Ñ2Ô2°TÑ9˜˜ØŸš¨Ñ2Ô2ð ;Ý" 4§:¢:¡<¤<°¤?Ñ3Ô3°dÑ:˜øð;ð
;ð 
;ð 
;ñ 
;ô 
;ð 
;ð 
;ð 
;ð 
;ð 
;ð 
;øøøð 
;ð 
;ð 
;ð 
;ð ˜˜dÐ#Ð#s   ¦CC;Ã;C?ÄC?s   \nPrivate.*:\s+(\d+)s   \nPss\:\s+(\d+)s   \nSwap\:\s+(\d+)c                 ó„  — |                       ¦   «         }t          t          t          |                     |¦  «        ¦  «        ¦  «        dz  }t          t          t          |                     |¦  «        ¦  «        ¦  «        dz  }t          t          t          |                     |¦  «        ¦  «        ¦  «        dz  }|||fS )Nrå   )r¯  r  r¶  rÕ   Úfindall)re  Ú_private_reÚ_pss_reÚ_swap_reÚ
smaps_datar   r€   r�   s           r7   Ú_parse_smapszProcess._parse_smaps‘  s    € ð* ×.Ò.Ñ0Ô0ˆJõ •c�#˜{×2Ò2°:Ñ>Ô>Ñ?Ô?Ñ@Ô@À4ÑGˆCÝ•c�#˜wŸš¨zÑ:Ô:Ñ;Ô;Ñ<Ô<¸tÑCˆCÝ•s�3 × 0Ò 0°Ñ <Ô <Ñ=Ô=Ñ>Ô>ÀÑEˆDØ˜˜dÐ#Ð#r9   c                 ó  — t           rI	 |                      ¦   «         \  }}}nG# t          t          f$ r |                      ¦   «         \  }}}Y nw xY w|                      ¦   «         \  }}}|                      ¦   «         }t          ||||fz   Ž S rw  )ÚHAS_PROC_SMAPS_ROLLUPrÝ  rn  rm  rä  rÙ  r~   )re  r   r€   r�   Ú	basic_mems        r7   Úmemory_full_infozProcess.memory_full_info®  s¥   € å$ð 5ð9Ø%)×%=Ò%=Ñ%?Ô%?‘N�C˜˜d˜døÝ*Õ,=Ð>ð 9ð 9ð 9Ø%)×%6Ò%6Ñ%8Ô%8‘N�C˜˜d˜d˜dð9øøøð "&×!2Ò!2Ñ!4Ô!4‘��S˜$Ø×(Ò(Ñ*Ô*ˆIÝ˜Y¨#¨s°DÐ)9Ñ9Ð:Ð:s   ‰" ¢)AÁAc                 ó  — d„ }|                       ¦   «         }|s|                      ¦   «          g S |                     d¦  «        }g }|                     d¦  «        }|g} |||¦  «        D �] \  }}|                     dd¦  «        }	 |\  }	}
}}}}n# t          $ r |dgz   \  }	}
}}}}Y nw xY w|sd}nQt          |¦  «        }|                     ¦   «         }|                     d¦  «        rt          |¦  «        s
|dd	…         }t          |	¦  «        t          |
¦  «        || 	                    d
d¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        f}| 
                    |¦  «         �Œ¢|S )aÔ  Return process's mapped memory regions as a list of named
            tuples. Fields are explained in 'man proc'; here is an updated
            (Apr 2012) version: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=b76437579d1344b612cf1851ae610c636cec7db0.

            /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if
            CONFIG_MMU kernel configuration option is not enabled.
            c              3   óÊ  K  — i }| D ]Ã}|                      d d¦  «        }|d                              d¦  «        s.|                     ¦   «         |fV — |                     |¦  «         Œa	 t	          |d         ¦  «        dz  ||d         <   Œ„# t
          $ r3 |d                              d¦  «        rY Œ«d|›�}t          |¦  «        d ‚w xY w|                     ¦   «         |fV — d S )Né   r   r2  r   rå   s   VmFlags:z!don't know how to interpret line )rž   rŸ   ÚpoprÃ   rÕ   r  r2   )r·  Úcurrent_blockr  rß   rÇ   rò   s         r7   Ú
get_blocksz'Process.memory_maps.<locals>.get_blocksÉ  s  è è € Ø�Ø!ð <ð <�DØ!ŸZšZ¨¨aÑ0Ô0�FØ! !œ9×-Ò-¨dÑ3Ô3ð <à,×0Ò0Ñ2Ô2°DÐ9Ð9Ð9Ð9Ø%×,Ò,¨TÑ2Ô2Ð2Ð2ð<Ý.1°&¸´)©n¬n¸tÑ.C˜D ¨¤™O˜OøÝ)ð <ð <ð <Ø% aœy×3Ò3°KÑ@Ô@ð )à ( Ø"NÀdÐ"NÐ"N˜CÝ",¨S¡/¤/°tÐ;ð<øøøð %×(Ò(Ñ*Ô*¨DÐ1Ð1Ð1Ð1Ð1Ð1s   Á)!BÂ%CÂ2Có   
r   Nrë  r   z[anon]r˜   r™   s   Rss:s   Size:rÛ  s   Shared_Clean:s   Shared_Dirty:s   Private_Clean:s   Private_Dirty:s   Referenced:s
   Anonymous:rÜ  )r¯  r†  rž   rì  r  r   rÔ   rŸ   r   rÐ   rÃ   )re  rî  r  r·  r   Ú
first_linerí  ÚheaderÚhfieldsrˆ  ÚpermsÚ_offsetÚ_devÚ_inoderx   rp  s                   r7   Úmemory_mapszProcess.memory_maps¿  s9  € ð2ð 2ð 2ð& ×(Ò(Ñ*Ô*ˆDð ð Ø×%Ò%Ñ'Ô'Ð'Ø�	Ø—J’J˜uÑ%Ô%ˆEØˆBØŸš 1™œˆJØ'˜LˆMØ * 
¨5°-Ñ @Ô @ð  ñ  ‘�˜Ø Ÿ,š, t¨QÑ/Ô/�ðNØ?FÑ<�D˜% ¨$°¸¸øÝ!ð Nð Nð NØ?FÈ"È¹~Ñ<�D˜% ¨$°¸¸¸ðNøøøàð *Ø#�D�Då! $™<œ<�DØŸ:š:™<œ<�DØ—}’} \Ñ2Ô2ð *Õ;MØñ<ô <ð *ð  $ D S Dœz˜å˜4‘L”LÝ˜5‘M”MØØ—H’H˜W aÑ(Ô(Ø—H’H˜X qÑ)Ô)Ø—H’H˜W aÑ(Ô(Ø—H’HÐ-¨qÑ1Ô1Ø—H’HÐ-¨qÑ1Ô1Ø—H’HÐ.°Ñ2Ô2Ø—H’HÐ.°Ñ2Ô2Ø—H’H˜^¨QÑ/Ô/Ø—H’H˜]¨AÑ.Ô.Ø—H’H˜X qÑ)Ô)ð�ð —	’	˜$‘”�‘ØˆIs   Â	BÂB,Â+B,c                 ó@   — t          | j        › d| j        › d�¦  «        S )Nr­   z/cwd)r�   rd  rr  r–  s    r7   ÚcwdzProcess.cwd  s&   € å˜4Ô,Ð=Ð=¨t¬xÐ=Ð=Ð=Ñ>Ô>Ð>r9   s   ctxt_switches:\t(\d+)c                 ó  — |                       ¦   «         }|                     |¦  «        }|s"d| j        › d| j        › d�}t	          |¦  «        ‚t          j        t          |d         ¦  «        t          |d         ¦  «        ¦  «        S )NzR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in r­   z1/status; the kernel is probably older than 2.6.23r   r   )r­  rß  rd  rr  r@  r   ÚpctxswrÕ   )re  Ú	_ctxsw_rer  Úctxswrò   s        r7   Únum_ctx_switcheszProcess.num_ctx_switches  s”   € ð ×%Ò%Ñ'Ô'ˆØ×!Ò! $Ñ'Ô'ˆØð 	+ð.àÔ%ð.ð .à(,¬ð.ð .ð .ð õ & cÑ*Ô*Ð*ÝŒ~�c %¨¤(™mœm­S°°q´©]¬]Ñ;Ô;Ð;r9   s   Threads:\t(\d+)c                 óz   — |                       ¦   «         }t          |                     |¦  «        d         ¦  «        S ©Nr   )r­  rÕ   rß  )re  Ú_num_threads_rer  s      r7   Únum_threadszProcess.num_threads  s6   € ð ×%Ò%Ñ'Ô'ˆÝ�?×*Ò*¨4Ñ0Ô0°Ô3Ñ4Ô4Ð4r9   c                 ó   — t          j        | j        › d| j        › d�¦  «        }|                     ¦   «          g }d}|D �]'}| j        › d| j        › d|› d�}	 t          |¦  «        5 }|                     ¦   «                              ¦   «         }d d d ¦  «         n# 1 swxY w Y   n# t          t          f$ r d}Y Œ|w xY w|| 
                    d¦  «        dz   d …         }|                     d	¦  «        }t          |d
         ¦  «        t          z  }	t          |d         ¦  «        t          z  }
t          j        t!          |¦  «        |	|
¦  «        }|                     |¦  «         �Œ)|r|                      ¦   «          |S )Nr­   z/taskFz/task/rµ   Tr~  rE   rõ   rœ  rž  )rœ   rl  rd  rr  r=  r   r  rÔ   rm  rn  r  rž   r  r  r   ÚpthreadrÕ   rÃ   r˜  )re  Ú
thread_idsr"  Ú
hit_enoentÚ	thread_idrÆ  rÅ   ÚstrÆ   r�  rŸ  r(  s               r7   ÚthreadszProcess.threads!  sÆ  € å”Z 4Ô#4Ð FÐ F°t´xÐ FÐ FÐ FÑGÔGˆ
Ø�ŠÑÔÐØˆØˆ
Ø#ð 	#ñ 	#ˆIØÔ(ÐKÐK¨4¬8ÐKÐK¸9ÐKÐKÐKˆEðÝ  Ñ'Ô'ð *¨1ØŸš™œŸšÑ)Ô)�Bð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *øøå%Õ'9Ð:ð ð ð ð "�
Ø�ð	øøøð �B—G’G˜D‘M”M AÑ%Ð'Ð'Ô(ˆBØ—X’X˜d‘^”^ˆFÝ˜& œ*Ñ%Ô%­Ñ3ˆEÝ˜& œ*Ñ%Ô%­Ñ3ˆEÝ”_¥S¨¡^¤^°U¸EÑBÔBˆFØ�NŠN˜6Ñ"Ô"Ð"Ñ"Øð 	'Ø×$Ò$Ñ&Ô&Ð&Øˆs6   ÁB&Á''BÂB&ÂB	ÂB&Â!B	Â"B&Â&B<Â;B<c                 ó4   — t          j        | j        ¦  «        S rw  )rÒ  Úgetpriorityrr  r–  s    r7   Únice_getzProcess.nice_get<  s   € õ Ô% d¤hÑ/Ô/Ð/r9   c                 ó6   — t          j        | j        |¦  «        S rw  )rÒ  Úsetpriorityrr  )re  r'  s     r7   Únice_setzProcess.nice_setE  s   € åÔ% d¤h°Ñ6Ô6Ð6r9   c                 ó4   — t          j        | j        ¦  «        S rw  )rø   r>   rr  r–  s    r7   Úcpu_affinity_getzProcess.cpu_affinity_getL  s   € åÔ-¨d¬hÑ7Ô7Ð7r9   s   Cpus_allowed_list:\t(\d+)-(\d+)c           	      óf  — |                       ¦   «         }|                     |¦  «        }|rRt          t          t	          |d         d         ¦  «        t	          |d         d         ¦  «        dz   ¦  «        ¦  «        S t          t          t          t          ¦   «         ¦  «        ¦  «        ¦  «        S )Nr   r   )r­  rß  rk  ÚrangerÕ   rÂ   r  )re  Ú_rer  r  s       r7   Ú_get_eligible_cpuszProcess._get_eligible_cpusP  s�   € ð ×)Ò)Ñ+Ô+ˆDØ—K’K Ñ%Ô%ˆEØð 9Ý�E¥# e¨A¤h¨q¤kÑ"2Ô"2µC¸¸a¼À¼Ñ4DÔ4DÀqÑ4HÑIÔIÑJÔJÐJå�E¥#¥m¡o¤oÑ"6Ô"6Ñ7Ô7Ñ8Ô8Ð8r9   c           	      óÐ  — 	 t          j        | j        |¦  «         d S # t          t          f$ r¶}t          |t          ¦  «        s|j        t          j        k    r†|                      ¦   «         }t          t          t          t          ¦   «         ¦  «        ¦  «        ¦  «        }|D ]:}||vrd|›d|›�}t	          |¦  «        d ‚||vrd|› d|› �}t	          |¦  «        |‚Œ;‚ d }~ww xY w)Nzinvalid CPU z; choose between zCPU number z! is not eligible; choose between )rø   Úproc_cpu_affinity_setrr  rÓ   r  rš   ro  rp  r  Útupler  rÂ   r  )re  r	  rÝ   Úeligible_cpusÚall_cpusÚcpurò   s          r7   Úcpu_affinity_setzProcess.cpu_affinity_set[  s-  € ðÝÔ*¨4¬8°TÑ:Ô:Ð:Ð:Ð:øÝ�ZÐ(ð ð ð Ý˜c¥:Ñ.Ô.ð ;°#´)½u¼|Ò2KÐ2KØ$(×$;Ò$;Ñ$=Ô$=�MÝ$¥U­3­}©¬Ñ+?Ô+?Ñ%@Ô%@ÑAÔA�HØ#ð ;ð ;˜Ø hÐ.Ð.ð!6¨sð !6ð !6Ø$1ð!6ð !6ð  õ #-¨S¡/¤/°tÐ;Ø mÐ3Ð3ð!<¨cð !<ð !<Ø,9ð!<ð !<ð  õ #-¨S¡/¤/°sÐ:ð 4ð øøøøð#øøøs   ‚ žC%¯B1C Ã C%c                 ó‚   — t          j        | j        ¦  «        \  }}t          |¦  «        }t	          j        ||¦  «        S rw  )rø   r=   rr  rD   r   Úpionice)re  Úioclassr'  s      r7   Ú
ionice_getzProcess.ionice_getu  s7   € å!Ô1°$´(Ñ;Ô;‰NˆG�UÝ  Ñ)Ô)ˆGÝ”? 7¨EÑ2Ô2Ð2r9   c                 óÚ   — |€d}|r.|t           j        t           j        hv r|›d�}t          |¦  «        ‚|dk     s|dk    rd}t          |¦  «        ‚t	          j        | j        ||¦  «        S )Nr   z ioclass accepts no valuerŸ  zvalue not in 0-7 range)rD   r#   r    r  rø   Úproc_ioprio_setrr  )re  r  r'  rò   s       r7   Ú
ionice_setzProcess.ionice_set{  s†   € àˆ}Ø�Øð &˜ÝÔ,ÝÔ,ð%ð ð ð !Ð=Ð=Ð=�Ý  ‘o”oÐ%Ø�qŠyˆy˜E AšI˜IØ.�Ý  ‘o”oÐ%ÝÔ'¨¬°'¸5ÑAÔAÐAr9   r/   c                 ót  — | j         dk    rd}t          |¦  «        ‚	 |€t          j        | j         |¦  «        S t	          |¦  «        dk    rd|›�}t          |¦  «        ‚t          j        | j         ||¦  «         d S # t
          $ r/}|j        t          j        k    r|                      ¦   «          ‚ d }~ww xY w)Nr   z)can't use prlimit() against PID 0 processrE   z2second argument must be a (soft, hard) tuple, got )	rr  r  Úresourcer/   rÂ   rÓ   ro  ÚENOSYSr†  )re  Ú	resource_Úlimitsrò   rÝ   s        r7   ÚrlimitzProcess.rlimitŒ  sÙ   € ð
 Œx˜1Š}ˆ}ØA�Ý  ‘o”oÐ%ðØ�>å#Ô+¨D¬H°iÑ@Ô@Ð@õ ˜6‘{”{ aÒ'Ð'ð5Ø*0ð5ð 5ð õ )¨™oœoÐ-ÝÔ$ T¤X¨y¸&ÑAÔAÐAÐAÐAøÝð ð ð Ø”9¥¤Ò,Ð,ð ×)Ò)Ñ+Ô+Ð+Øøøøøðøøøs   žA> ºAA> Á>
B7Â*B2Â2B7c                 ó”   — |                       ¦   «         d         }|                     ¦   «         }t                               |d¦  «        S )Nrœ  ú?)rª  r   ÚPROC_STATUSESrÐ   )re  Úletters     r7   rœ  zProcess.status¨  s;   € à×&Ò&Ñ(Ô(¨Ô2ˆØ—’‘”ˆå× Ò  ¨Ñ-Ô-Ð-r9   c                 ó6  — g }t          j        | j        › d| j        › d�¦  «        }d}|D �]Ö}| j        › d| j        › d|› �}	 t	          |¦  «        }|                     d¦  «        �r,t          |¦  «        �r| j        › d| j        › d|› �}	 t          |¦  «        5 }t          | 	                    ¦   «          
                    ¦   «         d         ¦  «        }t          | 	                    ¦   «          
                    ¦   «         d         d¦  «        }	d d d ¦  «         n# 1 swxY w Y   t          |	¦  «        }
t          |t          |¦  «        t          |¦  «        |
|	¦  «        }|                     |¦  «         �ŒO# t          t          f$ r d}Y �Œew xY w�Œk# t          t          f$ r d}Y �Œ�t           $ rK}|j        t"          j        k    rY d }~�Œ¥|j        t"          j        k    rt)          |¦  «         Y d }~�ŒÏ‚ d }~ww xY w|r|                      ¦   «          |S )	Nr­   rh  Fri  z/fdinfo/r   rº   T)rœ   rl  rd  rr  r�   r2   r   r   rÕ   rÁ   rž   r«   rw   rÃ   rm  rn  rÓ   ro  rp  rq  r   r˜  )re  r"  r÷  r  ry   r–  rx   rÅ   Úposr|   r{   r(  rÝ   s                r7   Ú
open_fileszProcess.open_files¯  sš  € àˆÝ”
˜dÔ/Ð?Ð?°$´(Ð?Ð?Ð?Ñ@Ô@ˆØˆ
Øð &	/ñ &	/ˆBØÔ'Ð<Ð<¨$¬(Ð<Ð<¸Ð<Ð<ˆDð$/Ý ‘~”~�ð& —?’? 3Ñ'Ô'ñ /­M¸$Ñ,?Ô,?ñ /à"Ô/ÐHÐH°$´(ÐHÐHÀBÐHÐH�Dð/Ý(¨Ñ.Ô.ð D°!Ý"% a§j¢j¡l¤l×&8Ò&8Ñ&:Ô&:¸1Ô&=Ñ">Ô">˜CÝ$'¨¯
ª
©¬×(:Ò(:Ñ(<Ô(<¸QÔ(?ÀÑ$CÔ$C˜EðDð Dð Dñ Dô Dð Dð Dð Dð Dð Dð Døøøð Dð Dð Dð Dõ  2°%Ñ8Ô8˜Ý!*Ø ¥# b¡'¤'­3¨s©8¬8°T¸5ñ"ô "˜ð  Ÿš vÑ.Ô.Ð.Ñ.øõ .Õ/AÐBð *ð *ð *ð &*˜
˜
™
ð*øøøùøõ3 &Õ'9Ð:ð ð ð à!�
Ø‘Ýð ð ð Ø”9¥¤Ò,Ð,à�H�H�H‘HØ”9¥Ô 2Ò2Ð2å˜#‘J”J�JØ�H�H�H‘HØøøøøðøøøð> ð 	'Ø×$Ò$Ñ&Ô&Ð&Øˆsa   ÁFÂE:ÂA4DÄE:ÄD 	Ä E:Ä#D 	Ä$E:Å:FÆFÆH Æ,	H Æ5G;Ç$G;Ç:G;Ç;H rZ  c                 ón   — t                                || j        ¦  «        }|                      ¦   «          |S rw  )r°  r¬  rr  r˜  )re  r¨  rC  s      r7   r±  zProcess.net_connectionsß  s0   € å×'Ò'¨¨d¬hÑ7Ô7ˆØ× Ò Ñ"Ô"Ð"Øˆ
r9   c                 ód   — t          t          j        | j        › d| j        › d�¦  «        ¦  «        S )Nr­   rh  )rÂ   rœ   rl  rd  rr  r–  s    r7   Únum_fdszProcess.num_fdså  s0   € å•2”: Ô!2ÐBÐB°T´XÐBÐBÐBÑCÔCÑDÔDÐDr9   c                 óP   — t          |                      ¦   «         d         ¦  «        S )Nr�  rÊ  r–  s    r7   r�  zProcess.ppidé  s!   € å�4×(Ò(Ñ*Ô*¨6Ô2Ñ3Ô3Ð3r9   s   Uid:\t(\d+)\t(\d+)\t(\d+)c                 óâ   — |                       ¦   «         }|                     |¦  «        d         \  }}}t          j        t	          |¦  «        t	          |¦  «        t	          |¦  «        ¦  «        S r   )r­  rß  r   ÚpuidsrÕ   )re  Ú_uids_rer  ÚrealÚ	effectiveÚsaveds         r7   ÚuidszProcess.uidsí  óX   € à×%Ò%Ñ'Ô'ˆØ!)×!1Ò!1°$Ñ!7Ô!7¸Ô!:Ñˆˆi˜ÝŒ}�S ™YœY­¨I©¬½¸E¹
¼
ÑCÔCÐCr9   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                 óâ   — |                       ¦   «         }|                     |¦  «        d         \  }}}t          j        t	          |¦  «        t	          |¦  «        t	          |¦  «        ¦  «        S r   )r­  rß  r   ÚpgidsrÕ   )re  Ú_gids_rer  r8  r9  r:  s         r7   ÚgidszProcess.gidsó  r<  r9   rw  ©rZ  )>rG   rH   rI   r­  r  rf  r”  r†  r˜  rŒ  r   rª  r­  r¯  r²  rµ  r±   r¹  r¼  r¿  rÃ  rœ   rx   r’  ÚgetpidrÇ  r  r¦  rÎ  r¤  rÙ  ræ  ÚHAS_PROC_SMAPSrÝ  r  r  rä  rè  r÷  rù  rþ  r  r	  r  r  ÚHAS_CPU_AFFINITYr  r  r  ÚHAS_PROC_IO_PRIORITYr   r#  Úhasattrr%  r)  rœ  r0  r±  r3  r�  r;  r@  rJ   r9   r7   rŽ  rŽ  €  s·  € € € € € Ø'Ð'àCÐCÐC€Ið.ð .ð .ð"ð "ð "ð Bð Bð Bð3ð 3ð 3ð Øð#ð #ñ Ôñ „_ð#ðJ Øðð ñ Ôñ „_ðð Øð$ð $ñ Ôñ „_ð$ð3ð 3ð 3ð
5ð 5ð 5ð
 ð7ð 7ñ „_ð7ð ð
ð 
ñ „_ð
ð ðð ñ „_ðð2 ð)ð )ñ „_ð)ð
 ðð ñ „_ðð 
„w‡~‚~Ð/˜y˜rœy™{œ{Ð/Ð/Ð/Ñ0Ô0ð #0à	ð 	0ð  	0ñ 
Œð 	0ðD ðOð Oñ „_ðOð ð7ð 7ñ „_ð7ð ð@ð @ð @ñ „_ð@ð ð*ð *ñ „_ð*ð ð>ð >ñ „_ð>ð$ ð C' ð C'ð	$ð 	$ð 	$ð. 
ð #˜œ
Ð#;Ñ<Ô<Ø�B”JÐ2Ñ3Ô3Ø�R”ZÐ 4Ñ5Ô5ð	$ð 	$ð 	$ñ 
Œð	$ð8 
ð		;ð 		;ñ 
Œð		;ð 		;ð 'Ðàð Hà	ðE	ð E	ñ 
ŒðE	ðN ð?ð ?ñ „_ð?ð à"˜œ
Ð#<Ñ=Ô=ð<ð <ð <ñ „_ð<ð Ø*4¨"¬*Ð5HÑ*IÔ*Ið 5ð 5ð 5ñ „_ð5ð
 ðð ñ „_ðð4 ð0ð 0ñ „_ð0ð ð7ð 7ñ „_ð7ð ð &à	ð	8ð 	8ñ 
Œð	8ð !�b”jÐ!DÑEÔEð		9ð 		9ð 		9ð 		9ð 
ð	ð 	ñ 
Œð	ð. ð Bà	ð	3ð 	3ñ 
Œð	3ð
 
ð	Bð 	Bñ 
Œð	Bð €wˆx˜Ñ#Ô#ð à	ð	ð 	ð 	ñ 
Œð	ð6 ð.ð .ñ „_ð.ð ð-ð -ñ „_ð-ð^ ðð ð ñ „_ðð
 ðEð Eñ „_ðEð ð4ð 4ñ „_ð4ð Ø&˜BœJÐ'DÑEÔEð Dð Dð Dñ „_ðDð
 Ø&˜BœJÐ'DÑEÔEð Dð Dð Dñ „_ðDð Dð Dr9   rŽ  rA  )F)’r­  rƒ  r;  Úenumro  rŠ  r  rœ   r  r%  r]  r…  Úsysrî   r   r   r   r   r   r   rø   r	   rÒ  r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú__extra__all__rF  r<  Údirr^  rx   r’  rB  rC  ræ  rE  rD  r  r  ÚgetpagesizerÖ   rv  Ú	byteorderr�  rù  ÚIntEnumrÕ   Ú	AF_PACKETrA   rB   rD   Úglobalsry  Ú__members__ÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_DISK_SLEEPÚSTATUS_STOPPEDÚSTATUS_TRACING_STOPÚSTATUS_ZOMBIEÚSTATUS_DEADÚSTATUS_WAKE_KILLÚSTATUS_WAKINGÚSTATUS_IDLEÚSTATUS_PARKEDr,  r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r”  ra   rm   rw   r}   r  r~   r‚   rí   r‹   r�   r�   r�   r«   r³   rÉ   Ú	ExceptionrÝ   rÀ   râ   ró   rÿ   r  r  r  r(  r/  r3  rJ  Únet_if_addrsrN  rP  r°  r±  rÊ  rß  Ú
disk_usagerü  rþ  r  rL  rP  rk  rm  rw  rx  r{  r‚  rŒ  rŽ  rJ   r9   r7   ú<module>r_     s~	  ðð
 %Ð $ð €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø 
€
€
€
Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø $Ð $Ð $Ð $Ð $Ð $Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø !Ð !Ð !Ð !Ð !Ð !Ø "Ð "Ð "Ð "Ð "Ð "Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø "Ð "Ð "Ð "Ð "Ð "Ø "Ð "Ð "Ð "Ð "Ð "ð	ð 	ð 	€ð €7ˆ8�YÑÔð Ø×ÒØFÐF�C�C˜‘I”IÐFÑFÔFñô ð ð .Ð Ø”—’Ð <¨¨¬©¬Ð <Ð <Ð <Ñ=Ô=€ØœŸšÐ'J°	°´	±´Ð'JÐ'JÐ'JÑKÔKÐ Ø�w˜tÐ%6Ñ7Ô7Ð Ø�7˜4Ð!8Ñ9Ô9Ð ð ˆbŒj˜Ñ&Ô&€Ø!ˆ:Ô!Ñ#Ô#€Ø€	Ø” Ò)€ð Ð à�”Ø�i   VÔ%5Ñ!6Ô!6Ð7ñô €ð Ô
€ðð ð ð ð �”ñ ô ð ð €�	„	× Ò �Ô'Ñ (Ô (Ð (ð 
Ô	Ø	Ô	 Ø	Ô	"Ø	Ô	Ø	Ô	$Ø	Ô	Ø	Ô	Ø	Ô	Ø	Ô	!Ø	Ô	Ø	Ô	Ø	Ô	ðð €ð" Ô
"Ø
Ô
Ø
Ô
Ø
Ô
 Ø
Ô
 Ø
Ô
 Ø
Ô
Ø
Ô
!Ø
Ô
Ø
Ô
Ø
Ô
ðð €ð, 	ˆ
Øð Kð Kð Kñ	Lô 	L€ð ˆ*Øð ð ð ñô €ð ˆJØÐ<Ð<Ð<ñ>ô >€	ð €z�&Ð>Ñ?Ô?€àˆ:�j $¤,Ð1GÑ"GÑHÔH€à�
ØðJð Jð JñKô K€ð
 ˆJØ� §¢¨-Ô*?Ñ!@Ô!@Ñ@ñBô B€	ð €j�ð 6ð 6ð 6ñ 7ô 7€ð ˆJ�{ð"ð "ð "ñ#ô #€	ðð ð ð(
ð 
ð 
ð$ð $ð $ð& 	ð0ð 0ñ 	„ð0ð0KØÐ˜Ñ!Ô!Ð!Ð!øØð Kð Kð Kà	€EÐ
2¨3Ð
2Ð
2Ñ3Ô3Ð3Ø;�
�
˜;Ð(:Ñ;Ô;¸CÀÀcÑJÔJ€I€I€I€I€I€IøøøøðKøøøð<ð <ð <ð~Bð Bð BðJ4@ð 4@ð 4@ðxð ð ð ð ð ð(ð ð ð:'ð 'ð 'ðTð ð ð2
ð 
ð 
ð „7‡>‚>Ð;Ñ<Ô<ð /PÀÄÇÂØ*ñAô Að /Pð#ð #ð #ð #ðNPð Pð Pð Ô&€ð	ð 	ð 	ð 	ð 	˜Iñ 	ô 	ð 	ðkð kð kð kð kñ kô kð kð\ "�>Ñ#Ô#Ð ð+ð +ð +ð +ð
,ð ,ð ,ð^ð ð ðB Ô €
ðfð fð fð fðRHð Hð Hð Hð Hñ Hô Hð HðV$ð $ð $ð $ðXsð sð sðlð ð ð>W>ð W>ð W>ð~ð ð ð ð  ð  ð&=ð =ð =ð!ð !ð !ðBð ð ð,ð ð ð6w	Dð w	Dð w	Dð w	Dð w	Dñ w	Dô w	Dð w	Dð w	Dð w	Ds   ÍM ÍNÍ%NÎN