ó
    øùgP ã                   ó
  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r   SSKJ!r!  SSKJ"r"  SSKJ#r#  SSKJ$r$  SSKJ%r%  SSKJ&r&  SSKJ'r'  SSKJ(r(  SSKJ)r)  SSKJ*r*  SSKJ+r+  / SQr,\-" \	S 5      (       aV  \,R]                  \/" \5       V s/ s H3  o Ra                  S!5      (       d  M  U Rc                  5       (       d  M1  U PM5     sn 5        S"r2\Rf                  Ri                  S#\Rj                  " 5        S$35      r6\Rf                  Ri                  S#\Rj                  " 5        S%35      r7\-" \S&5      r8\-" \S'5      r9\Rt                  " S(5      r;\Rx                  " 5       r=Sq>\R~                  S):H  r@S*rA\R„                  " S+S,\C" \
Rˆ                  5      05      rE\ERŒ                  rF " S- S.\R„                  5      rG\H" 5       R“                  \GR”                  5        \R–                  \R˜                  \Rš                  \Rœ                  \Rž                  \R                   \R¢                  \R¢                  \R¤                  \R¦                  \R¨                  \Rª                  S/.rV\R®                  \R°                  \R²                  \R´                  \R¶                  \R¸                  \Rº                  \R¼                  \R¾                  \RÀ                  \RÂ                  S0.rb\" S1/ S2Q5      rc\" S3/ S4Q5      rd\" S5/ S6Q5      re\" S7S85      rf\" S9\fRÎ                  S:-   5      rh\" S;/ S<Q5      ri\" S=S>S?RÕ                  \iRÎ                  5      -   5      rk\" S@/ SAQ5      rl\" SB/ SCQ5      rmSD rnSE roSF rp\$SG 5       rq \q" SH5        SM ruSN rvSO rwSP rxSQ rySR rzSS r{ST r|SU r}\Rf                  Ri                  SV5      (       d   \Rf                  Ri                  SW5      (       a  SX r~OSY r~\Rþ                  r " SZ S[\r5      r€ " S\ S]5      r�\�" 5       r‚SpS^ jrƒS_ r„S` r…\GR                  r†SqSa jr‡ " Sb Sc5      rˆSqSd jr‰Se rŠSf r‹Sg rŒSh r�Si rŽSj r�Sk r�Sl r‘Sm r’ " Sn So5      r“gs  sn f ! \r a(  rs\ " SI\s< 35        \" SJSK5      " SLSLSL5      qt SrsCsGN
SrsCsff = f)rz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ÚprlimitÚRLIMz/sys/class/power_supplyú/proc/ú/smapsú/smaps_rollupÚproc_ioprio_getÚproc_cpu_affinity_getÚ
SC_CLK_TCKÚlittlei   ÚAddressFamilyÚAF_LINKc                   ó$   • \ rS rSrSrSrSrSrSrg)Ú
IOPriorityék   r   r   é   é   © N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r    r!   r"   r#   Ú__static_attributes__r?   ó    Ú1/usr/lib/python3/dist-packages/psutil/_pslinux.pyr;   r;   k   s   † ØÐØ€OØ€OØÓrE   r;   )ÚRÚSÚDÚTÚtÚZÚXÚxÚ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)ru   ÚrssÚsizer}   Úshared_cleanÚshared_dirtyÚprivate_cleanÚprivate_dirtyÚ
referencedÚ	anonymousr~   Ú	pmmap_extzaddr perms Ú Úpio)rk   rl   rm   rn   Ú
read_charsÚwrite_charsÚ	pcputimes)ÚuserÚsystemÚchildren_userÚchildren_systemÚiowaitc                 óè   • [        U [        5      (       d   U 5       e[        R                  " U 5      n U R	                  S5      S   n U R                  S5      (       a  [        U 5      (       d  U SS n U $ )zWrapper around os.readlink().Ú r   ú
 (deleted)Néöÿÿÿ)Ú
isinstanceÚstrÚosÚreadlinkÚsplitÚendswithr   )ru   s    rF   rš   rš   Ç   si   € ä�dœC× Ñ Ð& $Ó&Ð Ü�;Š;�tÓ€Dð �:‰:�fÓ˜aÑ €Dð ‡}�}�\×"Ñ"Ô+=¸d×+CÑ+CØ�D�SˆzˆØ€KrE   c                 óR  • [         R                  S[         R                  S[         R                  S0nX[         R                  [         R                  -  [         R                  -  -     nU [         R                  -  (       a  UR                  SSS5      nUR                  SS5      nU$ )zRConvert 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)ry   Ú	modes_maprx   s      rF   Úfile_flags_to_moder§   Û   sx   € ô —‘˜c¤2§;¡;°´R·Y±YÀÐE€IØœbŸk™k¬B¯K©KÑ7¼"¿)¹)ÑCÑDÑE€DØŒr�{‰{×Ø�|‰|˜C  aÓ(ˆØ�<‰<˜˜dÓ#€Dà€KrE   c                 óš   • U R                  SS5      n SnU(       a  SU  3nOSU  S3n[        R                  " U[        R                  5      $ )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_virtualru   s      rF   Úis_storage_devicer¯   è   sL   € ð �<‰<˜˜SÓ!€DØÐÞØ˜T˜FÐ#‰à˜T˜F 'Ð*ˆÜ�9Š9�Tœ2Ÿ7™7Ó#Ð#rE   c                 óV  • [        U  S35       nUR                  5       R                  5       SS nSSS5        / SQn[        W5      nUS:¼  a  UR	                  S5        US:¼  a  UR	                  S5        US	:¼  a  UR	                  S
5        [        SU5      qg! , (       d  f       No= f)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        rF   Úset_scputimes_ntuplerÅ   û   s‘   € ô 
˜�} EÐ*Ô	+¨qØ—‘“×#Ñ#Ó% a bÐ)ˆ÷ 
,âK€FÜˆv‹;€DØˆqƒyà�‰�gÔØˆqƒyà�‰�gÔØˆrƒzà�‰�lÔ#Ü˜;¨Ó/�I÷ 
,Õ	+ús   �"BÂ
B(ú/proczignoring exception on import: r¼   zuser system idleç        c                 óv  • U S   nXR                  SS5      -   n U S   nU S   nU S   n [	        [        5        S	35      nSnU   U HJ  n	U	R                  5       n	U	R                  S
5      (       d  M+  U[        U	R                  5       S   5      -  nML     SSS5        U[        -  nX-
  n
X4-   nU[        US-  U5      -  nX«-  n
X¥[        US-  U5      -
  -  n
[        U
5      $ ! [         a'  n[        UR                  S    S35        Us SnA$ SnAff = f! [         a    Us $ f = f! , (       d  f       Nš= f)a9  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   r=   g       @)ÚgetÚKeyErrorr   Úargsr   r   ÚOSErrorÚstripÚ
startswithÚintr›   ÚPAGESIZEÚmin)Úmemsrc   ÚfallbackÚlru_active_fileÚlru_inactive_fileÚslab_reclaimableÚerrrÁ   Úwatermark_lowÚlineÚavailÚ	pagecaches               rF   Úcalculate_avail_vmemrß   !  sa  € ð< �Ñ€DØ—h‘h˜z¨1Ó-Ñ-€Hð	ØÐ/Ñ0ˆØ Ð!3Ñ4ÐØÐ 0Ñ1ÐðÜœ?Ó,Ð-¨YÐ7Ó8ˆð €MÚ	
ÛˆDØ—:‘:“<ˆDØ�‰˜v×&Ó&Ø¤ T§Z¡Z£\°!¡_Ó!5Ñ5’ñ ÷ 
ð
 ”XÑ€MàÑ €EØÑ3€IØ”�Y ‘] MÓ2Ñ2€IØ	Ñ€EØ	¤Ð$4°sÑ$:¸MÓ JÑJÑJ€EÜˆu‹:Ðøô1 ó ÜØ�x‰x˜‰{ˆmð >ð >ô	
ð �ûðûô ó ØŠðú÷ 
�ús@   ›C$ «D Á*D*Á3#D*Ã$
DÃ.DÄ
DÄDÄD'Ä&D'Ä*
D8c                  ó  • / n 0 n[        [        5        S35       nU H)  nUR                  5       n[        US   5      S-  XS   '   M+     SSS5        US   nUS   n US   n US
   nX�R                  SS5      -  n US   n	 US   n
 US   n US   nXV-
  U-
  U-
  nUS:  a  XV-
  n US   nUS:X  a  [        U5      nUS:  a  SnU R                  S5        OXå:”  a  Un[        X^-
  USS9nU (       aL  SR                  SR                  U 5      [        U 5      S:X  a  SOS5      n[        R                  " U[        SS 9  [        UUUUUU
UUUU	U5      $ ! , (       d  f       GN= f! [         a    SnU R                  S	5         GN%f = f! [         a    SnU R                  S5         GN/f = f! [         a/     US   n	 GN@! [         a    Sn	U R                  S5          GNaf = ff = f! [         a    Sn
U R                  S5         GNƒf = f! [         a;     US   US   -   US   -   n GN ! [         a    SnU R                  S5          GNÁf = ff = f! [         a    Sn GNÒf = f! [         a    [        U5      n GNÃf = f)!a  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:rf   rÊ   rË   rg   s   Shmem:s
   MemShared:rh   s   Active:rd   s	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:re   s   Slab:s   MemAvailable:r`   ©Úround_z6{} memory stats couldn't be determined and {} set to 0z, ÚwasÚwerer=   ©Ú
stacklevel)r   r   r›   rÒ   rÍ   r¿   rÌ   rß   r   ÚformatÚjoinr¾   ÚwarningsÚwarnÚRuntimeWarningr^   )Úmissing_fieldsrÕ   rÁ   rÜ   rÃ   r_   rc   rf   rg   rh   rd   re   ri   rb   rÝ   ra   Úmsgs                    rF   Úvirtual_memoryrð   `  s  € ð €NØ€DÜ	œÓ)Ð*¨(Ð3Ô	4¸ÛˆDØ—Z‘Z“\ˆFÜ! &¨¡)›n¨tÑ3ˆD˜‘‹Oñ ÷ 
5ð �Ñ€EØ�Ñ€Dð)Ø�{Ñ#ˆð
0Ø�jÑ!ˆð 	—(‘(Ð+¨QÓ/Ñ/ˆð,Ø�i‘ˆð(Ø�jÑ!ˆð
.Ø˜Ñ%ˆðØ�H‰~ˆð ‰<˜&Ñ  7Ñ*€DØˆaƒxð ‰|ˆð
/ØÐ%Ñ&ˆð �A‹:ô
 )¨Ó.ˆEàˆqƒyØˆØ×Ñ˜kÕ*Ø	‹ð ˆä˜U™]¨U¸1Ñ=€Gö ØF×MÑMØ�I‰I�nÓ%Ü˜Ó(¨AÓ-‰E°6ó
ˆô 	�Š�cœ>°aÒ8äØØØØØØØØØØØóð ÷Y 
5Ö	4ûô ó )àˆØ×Ñ˜i×(ð)ûô ó (ØˆØ×Ñ˜h×'ð(ûô ó ,ð	,Ø˜-Ñ(‹FøÜó 	,ØˆFØ×!Ñ! (×+Ð+ð	,úð,ûô ó (ØˆØ×Ñ˜h×'ð(ûô ó 	.ð	.à�_Ñ%Ø�Ñ'ñ(àÐ(Ñ)ñ*ó øô
 ó 	.ØˆHØ×!Ñ! *×-Ð-ð	.úð	.ûô ó Ø‹ðûô$ ó +Ü$ TÓ*‹ð+ús¹   ›0EÁE( Á$F Á>F0 ÂG, Â
H ÂI Â*I+ Å
E%Å(F	ÆF	ÆF-Æ,F-Æ0
G)Æ;GÇG%Ç G)Ç$G%Ç%G)Ç,HÈHÈ
IÈH/È/IÉIÉIÉIÉI(É'I(É+JÊJc                  óÆ  • 0 n [        [        5        S35       nU H)  nUR                  5       n[        US   5      S-  XS   '   M+     SSS5         U S   nU S   nXE-
  n[        X„SS9n	 [        [        5        S	35      nU   S=p«U H€  nUR                  S
5      (       a$  [        UR                  S5      S   5      S-  S-  n
O9UR                  S5      (       a#  [        UR                  S5      S   5      S-  S-  nU
c  M{  Uc  M€    O&   SnUS-  n[        R                  " U[        SS9  S=p«SSS5        [        R                  " XHXYW
W5      $ ! , (       d  f       GN= f! [         a'    [
        R                  " 5       u        pdpWXG-  nXW-  n GN8f = f! , (       d  f       Nm= f! [         a-  nSU S3n[        R                  " U[        SS9  S=p« SnAN¢SnAff = f)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 0r=   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   rÑ   rë   rì   rí   rÏ   r   Ússwap)rÕ   rÁ   rÜ   rÃ   r_   rc   Ú_Úunit_multiplierrb   ra   ÚsinÚsoutrï   rÚ   s                 rF   Úswap_memoryrü   å  sñ  € à€DÜ	œÓ)Ð*¨(Ð3Ô	4¸ÛˆDØ—Z‘Z“\ˆFÜ! &¨¡)›n¨tÑ3ˆD˜‘‹Oñ ÷ 
5ð Ø�]Ñ#ˆØ�LÑ!ˆð ‰<€DÜ˜D°Ñ2€GðÜœ?Ó,Ð-¨WÐ5Ó6ˆò ØÐˆCÛ�ð —?‘? 9×-Ñ-Ü˜dŸj™j¨Ó.¨qÑ1Ó2°QÑ6¸Ñ=‘CØ—_‘_ Z×0Ñ0Ü˜tŸz™z¨$Ó/°Ñ2Ó3°aÑ7¸$Ñ>�DØ“? tÓ'7Ùñ ð E�ØÐ8Ñ8�Ü—’˜c¤>¸aÒ@Ø��÷% ô& �=Š=˜ d°S¸$Ó?Ð?÷c 
5Ö	4ûô ó  Ü37×3EÒ3EÓ3GÑ0ˆˆ1ˆa�˜4ØÑ ˆØÑ‹ð ú÷& �Qûô ó ð0Ø03¨u°Að7ð 	ô 	�Š�cœ>°aÒ8ØˆˆŒdûðúsN   ™0EÁ
E$ Á+F) ÂA=FÄFÄ	(FÅ
E!Å$-FÆFÆ
F&Æ)
G Æ3#GÇG c                  óT  • [        5       n [        U 5        [        U  S35       nUR                  5       R	                  5       nSSS5        WS[        [        R                  5      S-    nU Vs/ s H  n[        U5      [        -  PM     nn[        U6 $ ! , (       d  f       NW= fs  snf )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   )
r   rÅ   r   r½   r›   r¾   r¼   Ú_fieldsÚfloatÚCLOCK_TICKS)rÀ   rÁ   rÂ   rÃ   rN   s        rF   Ú	cpu_timesr  !  s�   € ô "Ó#€KÜ˜Ô%Ü	˜�} EÐ*Ô	+¨qØ—‘“×#Ñ#Ó%ˆ÷ 
,à�AœœI×-Ñ-Ó.°Ñ2Ð3€FÙ.4Ó5ªf¨Œe�A‹hœÔ$©f€FÐ5Ü�fÐÐ÷	 
,Õ	+üò 6s   ¤BÁ.B%Â
B"c                  óÆ  • [        5       n [        U 5        / n[        U  S35       nUR                  5         U H…  nUR	                  S5      (       d  M  UR                  5       nUS[        [        R                  5      S-    nU Vs/ s H  n[        U5      [        -  PM     nn[        U6 nUR                  U5        M‡     UsSSS5        $ s  snf ! , (       d  f       g= f)z^Return a list of namedtuple representing the CPU times
for every CPU available on the system.
r±   s   cpur   N)r   rÅ   r   r½   rÑ   r›   r¾   r¼   rþ   rÿ   r   r¿   )rÀ   ÚcpusrÁ   rÜ   rÂ   rÃ   rN   Úentrys           rF   Úper_cpu_timesr  1  sÂ   € ô "Ó#€KÜ˜Ô%Ø€DÜ	˜�} EÐ*Ô	+¨qà	�
‰
ŒÛˆDØ�‰˜v×&Ó&ØŸ™›�Ø ¤C¬	×(9Ñ(9Ó$:¸QÑ$>Ð?�Ù:@ÓAº&°Qœ% ›(¤[Ô0¹&�ÐAÜ! 6Ð*�Ø—‘˜EÖ"ñ ð ÷ 
,Ñ	+ùò B÷ 
,Õ	+ús#   ¦*CÁ3CÂCÂ# CÃCÃ
C c                  ó@  •  [         R                  " S5      $ ! [         aû    Sn [        [	        5        S35       nU H.  nUR                  5       R                  S5      (       d  M)  U S-  n M0     SSS5        O! , (       d  f       O= fU S:X  a�  [        R                  " S5      n[        [	        5        S35       nU H4  nUR                  S	5      S   nUR                  U5      (       d  M/  U S-  n M6     SSS5        O! , (       d  f       O= fU S:X  a   gU s $ f = f)
z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNr   ú/cpuinfos	   processorr   Nzcpu\dr±   r‰   )r™   ÚsysconfÚ
ValueErrorr   r   ÚlowerrÑ   ÚreÚcompiler   r›   Úmatch)ÚnumrÁ   rÜ   Úsearchs       rF   Úcpu_count_logicalr  E  só   € ðÜ�zŠzÐ/Ó0Ð0øÜó àˆÜœOÓ-Ð.¨hÐ7Ô8¸AÛ�Ø—:‘:“<×*Ñ*¨<×8Ó8Ø˜1‘H’Cñ ÷ 9×8Ö8úð �!‹8Ü—Z’Z Ó)ˆFÜœoÓ/Ð0°Ð6Ô7¸1Û�DØŸ:™: c›?¨1Ñ-�DØ—|‘| D×)Ó)Ø˜q™šñ ÷ 8×7Ö7úð �!‹8áØŠ
ð-úsP   ‚ ˜"Dº(A8Á&	A8Á/	DÁ8
B	Â9DÂ;.C?Ã-	C?Ã6	DÃ?
D	Ä	DÄDÄDc                  ó  • [        5       n SnSn[        R                  " U5      =(       d    [        R                  " U5       HD  n[        U5       nU R                  UR	                  5       R                  5       5        SSS5        MF     [        U 5      nUS:w  a  U$ 0 n0 n[        [        5        S35       nU Hp  nUR                  5       R                  5       nU(       d   US   XgS   '   0 nM7  UR                  S5      (       d  MO  UR                  S	S
5      u  pš[        U
5      Xy'   Mr     SSS5        [        UR                  5       5      nU=(       d    S$ ! , (       d  f       GM(  = f! [         a     NŒf = f! , (       d  f       NU= f)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Í   rÑ   r›   rÒ   ÚsumrÂ   )ÚlsÚp1Úp2ru   rÁ   ÚresultÚmappingÚcurrent_inforÜ   ÚkeyÚvalues              rF   Úcpu_count_coresr"  b  sT  € ô 
‹€Bð 
E€BØ	J€BÜ—	’	˜"“×.¤§¢¨2£Ò.ˆÜ˜Ô !Ø�F‰F�1—6‘6“8—>‘>Ó#Ô$÷ Ññ /ô �‹W€FØ�ƒ{Øˆð €GØ€LÜ	œÓ)Ð*¨(Ð3Ô	4¸ÛˆDØ—:‘:“<×%Ñ%Ó'ˆDÞðØ<HØ$ñ=�G¨Ñ8Ñ9ð
  "’Ø—‘Ð!?×@Ó@à!ŸZ™Z¨°Ó2‘
�Ü$'¨£J�Ó!ñ ÷ 
5ô" �—‘Ó!Ó"€FØ�>�TÐ÷7 ×ûô$  ó Ùðú÷ 
5Õ	4úsB   Á.EÂ7+E=Ã#
E-Ã-E=Ä	%E=Å
E*	Å-
E:Å7E=Å9E:Å:E=Å=
Fc                  ó  • [        [        5        S35       n SnSnSnU  Hª  nUR                  S5      (       a  [        UR	                  5       S   5      nOeUR                  S5      (       a  [        UR	                  5       S   5      nO2UR                  S5      (       a  [        UR	                  5       S   5      nUc  M   Uc  M¥  Uc  Mª    O   SSS5        Sn[
        R                  " WWWU5      $ ! , (       d  f       N)= f)z*Return various CPU stats as a named tuple.r±   Ns   ctxtr   s   intrs   softirqr   )r   r   rÑ   rÒ   r›   r   Ú	scpustats)rÁ   Úctx_switchesÚ
interruptsÚsoft_interruptsrÜ   Úsyscallss         rF   Ú	cpu_statsr)  Œ  sß   € ä	œÓ)Ð*¨%Ð0Ô	1°QØˆØˆ
ØˆÛˆDØ�‰˜w×'Ñ'Ü" 4§:¡:£<°¡?Ó3‘Ø—‘ ×)Ñ)Ü  §¡£¨a¡Ó1‘
Ø—‘ ×,Ñ,Ü"% d§j¡j£l°1¡oÓ"6�àÓ(Ø#Ó/ØÓ*áñ ÷	 
2ð" €HÜ×ÒØ�j /°8óð ÷% 
2Õ	1ús   —B%C1Ã C1ÃC1Ã
C1Ã1
C?c            
      ó  • [        [        5        S35       n U  Vs/ s HG  nUR                  5       R                  S5      (       d  M)  [	        UR                  SS5      S   5      PMI     snsSSS5        $ s  snf ! , (       d  f       g= f)z7Return current CPU frequency from cpuinfo if available.r  s   cpu mhzó   :r   N)r   r   r  rÑ   rÿ   r›   )rÁ   rÜ   s     rF   Ú_cpu_get_cpuinfo_freqr,  ¥  su   € ä	œÓ)Ð*¨(Ð3Ô	4¸ñ ó
â�Ø�z‰z‹|×&Ñ& z×2ó *ŒE�$—*‘*˜T 1Ó% aÑ(Ö)Ùñ
÷ 
5Ñ	4ùò
÷ 
5Õ	4ús"   —A;œ(A6Á"A6Á*A;Á6A;Á;
B	z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc            	      ó  • [        5       n [        R                  " S5      =(       d    [        R                  " S5      nUR                  S S9  / n[        R                  R
                  n[        U5       GH  u  pE[        U5      [        U 5      :X  a  X   S-  nO[        U" US5      SS9nUc^  [        U" US	5      SS9nUcJ  S
U S3n[        USS9S:X  a)  UR                  [        R                  " SSS5      5        M‹  Sn[        U5      e[        U5      S-  n[        [        U" US5      5      5      S-  n	[        [        U" US5      5      5      S-  n
UR                  [        R                  " XjU	5      5        GM     U$ )zjReturn 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                 ó^   • [        [        R                  " SU 5      R                  5       5      $ )Nz[0-9]+)rÒ   r  r  Úgroup©rN   s    rF   Ú<lambda>Úcpu_freq.<locals>.<lambda>¼  s   € ¤¤R§Y¢Y¨y¸!Ó%<×%BÑ%BÓ%DÔ!ErE   )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)r,  r  Úsortr™   ru   rê   Ú	enumerater¾   r   r   r¿   r   ÚscpufreqÚNotImplementedErrorrÒ   )Úcpuinfo_freqsÚpathsÚretÚpjoinÚiru   ÚcurrÚonline_pathrï   Úmax_Úmin_s              rF   Úcpu_freqrE  ³  sl  € ô
 .Ó/ˆÜ—	’	Ø:ó
÷ Dä�YŠYÐBÓCð 	ð 	�
‰
ÑEˆ
ÑFØˆÜ—‘—‘ˆÜ  ×'‰GˆAÜ�5‹zœS Ó/Ó/ð %Ñ'¨$Ñ.‘ä™E $Ð(:Ó;ÀdÑK�Ø‰|ô ™E $Ð(:Ó;ÀdÑK�Ø‘<Ø$?À¸sÀ'Ð"J�Kä˜;°Ñ6¸%Ó?ØŸ
™
¤7×#3Ò#3°C¸¸cÓ#BÔCÙ Ø=�CÜ-¨cÓ2Ð2Ü�t“9˜tÑ#ˆDÜ”t™E $Ð(:Ó;Ó<Ó=ÀÑDˆDÜ”t™E $Ð(:Ó;Ó<Ó=ÀÑDˆDØ�J‰J”w×'Ò'¨°DÓ9×:ñ- (ð. ˆ
rE   c                  ón   • [        5        V s/ s H  n [        R                  " U SS5      PM     sn $ s  sn f )zmAlternate implementation using /proc/cpuinfo.
min and max frequencies are not available and are set to None.
rÇ   )r,  r   r:  r0  s    rF   rE  rE  Ú  s1   € ô 8MÔ7NÓOÒ7N°!”× Ò   C¨Ö-Ñ7NÑOÐOùÒOs   �"2c                   ó   • \ rS rSrSrg)Ú_Ipv6UnsupportedErrorié  r?   N)r@   rA   rB   rC   rD   r?   rE   rF   rH  rH  é  s   † ÚrE   rH  c                   ól   • \ rS rSrSrS rS rS r\S 5       r	\SS j5       r
\SS	 j5       rSS
 jrSrg)ÚNetConnectionsií  a[  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                 ó‚  • S[         R                  [         R                  4nS[         R                  [         R                  4nS[         R                  [         R                  4nS[         R                  [         R                  4nS[         R
                  S 4nXX4U4X4U4U4X44U4U4U4XX44X4X$4S.U l        S U l        g )NÚtcpÚtcp6ÚudpÚudp6Úunix)ÚallrL  Útcp4rM  rN  Úudp4rO  rP  ÚinetÚinet4Úinet6)ÚsocketÚAF_INETÚSOCK_STREAMÚAF_INET6Ú
SOCK_DGRAMÚAF_UNIXÚtmapÚ_procfs_path)ÚselfrR  rM  rS  rO  rP  s         rF   Ú__init__ÚNetConnections.__init__ù  s¾   € ð ”v—~‘~¤v×'9Ñ'9Ð:ˆØœŸ™¬×);Ñ);Ð<ˆØ”v—~‘~¤v×'8Ñ'8Ð9ˆØœŸ™¬×):Ñ):Ð;ˆØœŸ™¨Ð-ˆà ¨DÐ1Ø�<Ø�GØ�GØ�<Ø�GØ�GØ�GØ Ð,Ø�\Ø�\ñ
ˆŒ	ð !ˆÕrE   c                 ó&  • [        [        5      n[        R                  " U R                   SU S35       H_  n [        U R                   SU SU 35      nUR                  S5      (       a(  USS  S S nX$   R                  U[        U5      45        M_  Ma     U$ ! [        [        4 a     Mx  [         aY  nUR                  [        R                  :X  a   S nAM¥  UR                  [        R                  :X  a  [        U5         S nAMÔ  e S nAff = f)Nr©   ú/fdú/fd/zsocket:[r¶   éÿÿÿÿ)r   Úlistr™   Úlistdirr^  rš   rÑ   r¿   rÒ   ÚFileNotFoundErrorÚProcessLookupErrorrÏ   ÚerrnoÚEINVALÚENAMETOOLONGr   )r_  ÚpidÚinodesrv   ÚinoderÚ   s         rF   Úget_proc_inodesÚNetConnections.get_proc_inodes  sù   € ÜœTÓ"ˆÜ—*’* × 1Ñ 1Ð2°!°C°5¸Ð<Ö=ˆBð9Ü  D×$5Ñ$5Ð#6°a¸°u¸DÀÀÐ!EÓF�ð  ×#Ñ# J×/Ñ/à! ! "˜I c r˜N�EØ‘M×(Ñ(¨#¬s°2«w¨Ö8ñ 0ñ% >ð, ˆøô' &Ô'9Ð:ó ò Üó Ø—9‘9¤§¡Ó,åØ—9‘9¤× 2Ñ 2Ó2ä˜#”JÝØûðús)   ºBÂDÂ.	DÂ7DÃ)DÄ
DÄDc                 ó¦   • 0 n[        5        H$  n UR                  U R                  U5      5        M&     U$ ! [        [        [
        4 a     MB  f = f©N)ÚpidsÚupdaterp  rh  ri  ÚPermissionError)r_  rn  rm  s      rF   Úget_all_inodesÚNetConnections.get_all_inodes*  sT   € ØˆÜ–6ˆCð
Ø—‘˜d×2Ñ2°3Ó7Ö8ñ ð ˆøô &Ô'9¼?ÐKó ò ðús   ‘ 7·AÁAc           
      óf  • U R                  S5      u  p#[        US5      nU(       d  gUR                  S5      nU[        R                  :X  ai  [
        (       a2  [        R                  " U[        R                  " U5      SSS2   5      nOî[        R                  " U[        R                  " U5      5      nOÂ[        R                  " U5      n [
        (       aP  [        R                  " [        R                  [        R                  " S/[        R                  " SU5      Q76 5      nOP[        R                  " [        R                  [        R                  " S/[        R                  " SU5      Q76 5      n [         R"                  " X#5      $ ! [         a    [        5       (       d  [        See f = f)	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
Ú:é   r?   ÚasciiNre  z>4Iz<4I)r›   rÒ   ÚencoderW  rX  ÚLITTLE_ENDIANÚ	inet_ntopÚbase64Ú	b16decoderZ  ÚstructÚpackÚunpackr
  r   rH  r   Úaddr)r…  ÚfamilyÚipÚports       rF   Údecode_addressÚNetConnections.decode_address:  s>  € ð" —:‘:˜c“?‰ˆÜ�4˜‹}ˆö ØØ�Y‰Y�wÓˆØ”V—^‘^Ó#çŠ}Ü×%Ò% f¬f×.>Ò.>¸rÓ.BÁ4ÀRÀ4Ñ.HÓI‘ä×%Ò% f¬f×.>Ò.>¸rÓ.BÓC‘ä×!Ò! "Ó%ˆBðç ’=Ü×)Ò)ÜŸ™ÜŸš EÐE¬F¯MªM¸%ÀÓ,DÒEó‘Bô
  ×)Ò)ÜŸ™ÜŸš EÐE¬F¯MªM¸%ÀÓ,DÒEó‘Bô �|Š|˜BÓ%Ð%øô ó ä$—‘Ü/°TÐ9Øð	ús   ÃAF Ä(AF Æ"F0Nc              #   ó¸  #   • U R                  S5      (       a%  [        R                  R                  U 5      (       d  g[	        U 5       nUR                  5         [        US5       HŸ  u  pg UR                  5       SS u
  p‰p«        pŒXÃ;   a
  X<   S   u  pïOS	u  pïUb  XN:w  a  M>  U[        R                  :X  a
  [        U   nO[        R                  n [        R!                  X‘5      n	[        R!                  X¡5      n
XñX)X«U4v •  M¡     SSS5        g! [         a    SU  SU SU< 3n[        U5      Sef = f! ["         a     Mß  f = f! , (       d  f       g= f7f)
z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6Nr   rº   úerror while parsing ú; malformed line r‰   r   ©Nre  )rœ   r™   ru   Úexistsr   r½   r9  r›   r
  ÚRuntimeErrorrW  rY  ÚTCP_STATUSESr   Ú	CONN_NONErJ  r‰  rH  )Úfiler†  Útype_rn  Ú
filter_pidrÁ   ÚlinenorÜ   rø   ÚladdrÚraddrÚstatusro  rï   rm  rv   s                   rF   Úprocess_inetÚNetConnections.process_inetm  sc  é € ð �=‰=˜×Ñ¤b§g¡g§n¡n°T×&:Ñ&:àÜ�tŒ_ Ø�J‰JŒLÜ )¨!¨Q¦‘�ð	6àŸ
™
› S bÐ)ñ B�A˜e¨Q°°1°a¸ð “?ð %™m¨AÑ.‘G�C˜à&‘G�CØÑ)¨jÓ.?Ùà¤× 2Ñ 2Ó2Ü!-¨fÑ!5™ä!(×!2Ñ!2˜ð!Ü .× =Ñ =¸eÓ L˜Ü .× =Ñ =¸eÓ L˜ð  u°UÀCÐHÔHñC !0÷ ˆ_øô "ó 6à.¨t¨fð 5Ø"˜8 1 T¡Hð.ð ô ' sÓ+°Ð5ð6ûô4 1ó !Ú ð!ú÷C �_üs[   ‚AEÁ	"E	Á,DÂAE	Ã*D8Ã=E	Ä		EÄ#D5Ä5E	Ä8
EÅE	ÅEÅE	Å	
EÅEc           
   #   óú  #   • [        U 5       nUR                  5         U H‘  nUR                  5       n USS u        pxpyX’;   a  X)   nOS/nU H_  u  pÍUb  X<:w  a  M  [        U5      S:X  a  US	   OS
n[        R                  " [        U5      5      nS
n[        R                  nXÑXŽUUU4v •  Ma     M“     SSS5        g! [         a    SU;  a   M±  SU  SU< 3n
[	        U
5      ef = f! , (       d  f       g= f7f)zParse /proc/net/unix files.r   é   r‰   r�  rŽ  r�  Nr¶   re  Ú )
r   r½   r›   r
  r‘  r¾   r   Úsocktype_to_enumrÒ   r“  )r”  r†  rn  r–  rÁ   rÜ   Útokensrø   r•  ro  rï   Úpairsrm  rv   ru   r™  rš  s                    rF   Úprocess_unixÚNetConnections.process_unix˜  s  é € ô �tŒ_ Ø�J‰JŒLÛ�ØŸ™›�ð	,Ø28¸¸1°+Ñ/�A�q˜!˜Q qð “?ð #™M‘Eà'˜L�EÛ$‘G�CØ!Ñ-°*Ó2CÙ ä-0°«[¸AÓ-=˜v bšzÀ2˜Ü '× 8Ò 8¼¸U»Ó D˜ð !#˜Ü!(×!2Ñ!2˜Ø!¨5¸¸vÀsÐKÔKó  %ñ% ÷ ˆ_øô "ó ,Ø $“â à.¨t¨fÐ4EÀdÁXÐNð ô ' sÓ+Ð+ð,ú÷ �_üs@   ‚C;Ž&C*µB?Á A6C*Â6	C;Â?C'ÃC*ÃC'Ã'C*Ã*
C8Ã4C;c                 ó6  • [        5       U l        Ub  U R                  U5      nU(       d  / $ OU R                  5       n[	        5       nU R
                  U    Hµ  u  pVnU R                   SU 3nU[        R                  [        R                  1;   a  U R                  X†XsUS9n	OU R                  X†X2S9n	U	 HR  u  p¦p{pÍnU(       a  [        R                  " X¦X{XÍ5      nO[        R                  " X¦X{XÍU5      nUR                  U5        MT     M·     [        U5      $ )Nz/net/)r–  )r   r^  rp  rw  r  r]  rW  rX  rZ  r›  r£  r   ÚpconnÚsconnr  rf  )r_  Úkindrm  rn  r>  Ú
proto_namer†  r•  ru   r  rv   r˜  r™  rš  Ú	bound_pidÚconns                   rF   ÚretrieveÚNetConnections.retrieve¼  s  € Ü+Ó-ˆÔØ‰?Ø×)Ñ)¨#Ó.ˆFÞà�	ð ð ×(Ñ(Ó*ˆFÜ‹eˆØ)-¯©°4¬Ñ%ˆJ Ø×'Ñ'Ð(¨¨j¨\Ð:ˆDØœ&Ÿ.™.¬&¯/©/Ð:Ó:Ø×&Ñ&Ø %¸Cð 'ð ‘ð ×&Ñ& t°VÐ&ÐL�ÛFHÑB�˜E¨%¸ÞÜ"Ÿ=š=Ø E°%ó‘Dô #Ÿ=š=Ø E°%Àó�Dð —‘˜–ó GIñ *9ô$ �C‹yÐrE   )r^  r]  rs  )r@   rA   rB   rC   Ú__doc__r`  rp  rw  Ústaticmethodr‰  r›  r£  r¬  rD   r?   rE   rF   rJ  rJ  í  s^   † ñ	ò!ò.ò4ð  ñ0&ó ð0&ðd ó(Ió ð(IðT ó!Ló ð!L÷FrE   rJ  c                 ó,   • [         R                  U 5      $ )z$Return system-wide open connections.)Ú_net_connectionsr¬  )r¨  s    rF   Únet_connectionsr²  Þ  s   € ä×$Ñ$ TÓ*Ð*rE   c                  ó¶  • [        [        5        S35       n U R                  5       nSSS5        0 nWSS  H�  nUR                  S5      nUS:”  d   [	        U5      5       eUSU R                  5       nX4S-   S R                  5       R                  5       n[        [        U5      u  nnn	n
nnnnnnnnnnnnUUUUU	UU
U4X%'   M�     U$ ! , (       d  f       N¨= f)zkReturn network I/O statistics for every network interface
installed on the system as a dict of raw tuples.
z/net/devNr=   rz  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                          rF   Únet_io_countersrË  ã  s
  € ô 
”oÓ'Ð(¨Ð1Ô	2°aØ—‘“ˆ÷ 
3à€GØ�a�b“	ˆØ—
‘
˜3“ˆØ�q‹yÐ$œ$˜t›*Ó$ˆyØ�F�Uˆ|×!Ñ!Ó#ˆØ˜a‘i�kÐ"×(Ñ(Ó*×0Ñ0Ó2ˆô* ”�VÓñ'	
àØØØØØØØàØØØØØØØð ØØØØØØØð	
ˆ‹ñ7 ðJ €N÷Q 
3Õ	2ús   —C
Ã

Cc                  ó<  • [         R                  [        [         R                  [        [         R
                  [        0n [        5       R                  5       n0 nU H{  n [        R                  " U5      n[        R                  " U5      n[         R                  " U5      u  pgSR                  U5      nSU;   n	[        R                  " X�U   XtU5      X#'   M}     U$ ! [          a5  n
U
R"                  ["        R$                  :w  a  e ['        U
5         Sn
A
M»  Sn
A
ff = f)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Ï   rj  ÚENODEVr   )Ú
duplex_mapÚnamesr>  r­   Úmtury   ÚduplexÚspeedÚoutput_flagsÚisuprÚ   s              rF   Únet_if_statsrà    sò   € ô 	×Ñœ/Ü×Ñœ/Ü×ÑÔ/ð€Jô
 Ó×"Ñ"Ó$€EØ
€CÛˆð	Ü×'Ò'¨Ó-ˆCÜ×+Ò+¨DÓ1ˆEÜ ×4Ò4°TÓ:‰MˆFð Ÿ8™8 E›?ˆLØ Ñ%ˆDÜ×)Ò)Ø Ñ(¨%°lóˆC‹Iñ ð  €Jøô ó 	à�y‰yœEŸL™LÓ(ØÜ�#�JŠJûð		ús   ÁACÃ
DÃ&*DÄDc                 ó˜  • S nS n[         R                  R                  [        5        S35      (       a  U" 5       nOD[         R                  R                  S5      (       a  U" 5       nO[        5        S3n[	        U5      e0 nU H@  nUu
  pxpšp¼pÞnnU (       d  [        U5      (       d  M%  U
[        -  n
U[        -  nX‰X«XÍXïU4	XW'   MB     U$ )z[Return disk I/O statistics for every disk installed on the
system as a dict of raw tuples.
c               3   ó   #   • [        [        5        S35       n U R                  5       nS S S 5        W HÄ  nUR                  5       n[	        U5      nUS:X  a.  US   n[        US   5      n[        [
        USS 5      u
  pxpšnpÍpïnOhUS:X  d  US:¼  a   US   n[        [
        USS 5      u  pgp‰p«pÍpïnO<US:X  a%  US   n[        [
        USS  5      u  php¬S	=n	=n=n=p¿OS
U< 3n[        U5      eXVX¨XÉUX{U4
v •  MÆ     g ! , (       d  f       NÙ= f7f)Nú
/diskstatsé   r>   r=   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ø   rs   rï   s                    rF   Úread_procfsÚ%disk_io_counters.<locals>.read_procfs;  s7  é € ô" œ/Ó+Ð,¨JÐ7Ô8¸AØ—K‘K“MˆE÷ 9ãˆDØ—Z‘Z“\ˆFÜ�v“;ˆDà�r‹zà˜a‘y�Ü˜F 1™I›�ä69¼#¸vÀaÈ¸|Ó6Lñ4� u°mØ 1±Ø˜“˜t r›zà˜a‘y�ä69¼#¸vÀaÈ¸|Ó6Lñ4� f°VØ 1±Ø˜“à˜a‘y�Ü03´C¸ÀÀ¸Ó0DÑ-�˜vØKLÐL�ÐL˜ÐL ÐL¨}¸yà7¸±xÐ@�Ü  “oÐ%Ø °¸uØ°	ð;ô ;ò/ ÷ 9Õ8üs   ‚D™C=ªCDÃ=
DÄDc               3   ó2  #   • [         R                  " S5       Hè  n [         R                  " [         R                  R	                  SU 5      5       H­  u  pnSU;  a  M  [        [         R                  R	                  US5      5       nUR                  5       R                  5       R                  5       nS S S 5        [         R                  R                  U5      n[        [        WS S 5      u
  pxpšp¼pÞp/XgX¹XÚXèXÏ4
v •  M¯     Mê     g ! , (       d  f       NX= f7f)Nú
/sys/blockÚstatrº   )r™   rg  Úwalkru   rê   r   r  rÐ   r›   Úbasenamer·  rÒ   )ÚblockÚrootrø   ÚfilesrÁ   rÃ   r­   rè  ré  rê  rë  rì  rí  rî  rï  rs   s                   rF   Ú
read_sysfsÚ$disk_io_counters.<locals>.read_sysfsi  sÙ   é € Ü—Z’Z Ö-ˆEÜ"$§'¢'¬"¯'©'¯,©,°|ÀUÓ*KÖ"L‘�˜Ø Ó&ÙÜœrŸw™wŸ|™|¨D°&Ó9Ô:¸aØŸV™V›XŸ^™^Ó-×3Ñ3Ó5�F÷ ;ä—w‘w×'Ñ'¨Ó-�ô 47´s¸FÀ3ÀB¸KÓ3Hñ1� f°VØ 1Ø F°FØ¨MðFô Fó #Mò .÷ ;Õ:üs   ‚BDÂ-DÂ4ADÄ
DÄDrã  ró  z6/diskstats nor /sys/block are available on this system)r™   ru   r�  r   r;  r¯   ÚDISK_SECTOR_SIZE)Úperdiskrð  rú  Úgenrï   r¹  r  r­   rè  rì  rê  rî  rë  rï  ré  rí  rs   s                    rF   Údisk_io_countersrÿ  6  sâ   € ò
+;ò\Fô 
‡w�w‡~�~œÓ*Ð+¨:Ð6×7Ñ7Ù‹m‰Ü	�‰�‰˜×	%Ñ	%Ù‹l‰ô Ó Ð!ð "ð ð 	ô " #Ó&Ð&à€GÛˆð ).ñ	&ˆ�f f°UØ˜9ÞÔ0°×6Ñ6ñ àÔ"Ñ"ˆØÔ"Ñ"ˆØ¨¸Ø%°iðAˆ‹ñ) ð0 €NrE   c                   ó>   • \ rS rSrSrSS/rS rS rS rS r	S	 r
S
rg)ÚRootFsDeviceFinderiŸ  a2  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                 ó°   • [         R                  " S5      R                  n[         R                  " U5      U l        [         R                  " U5      U l        g )Nr©   )r™   rô  Úst_devr  r  )r_  Údevs     rF   r`  ÚRootFsDeviceFinder.__init__©  s3   € Ü�gŠg�c‹l×!Ñ!ˆÜ—X’X˜c“]ˆŒ
Ü—X’X˜c“]ˆ�
rE   c                 óö  • [        [        5        S35       nUR                  5       SS   H²  nUR                  5       n[	        U5      S:  a  M$  US   R                  5       (       a  [        US   5      OS nUS   R                  5       (       a  [        US   5      OS nUS   nX@R                  :X  d  MŠ  XPR                  :X  d  M›  U(       d  M¤  SU 3s  sS S S 5        $    S S S 5        g ! , (       d  f       g = f)Nz/partitionsr=   ró   r   r   r>   ú/dev/)	r   r   r´  r›   r¾   ÚisdigitrÒ   r  r  )r_  rÁ   rÜ   rÃ   r  r  r­   s          rF   Úask_proc_partitionsÚ&RootFsDeviceFinder.ask_proc_partitions®  sÈ   € Üœ/Ó+Ð,¨KÐ8Ô9¸QØŸ™› a bÓ)�ØŸ™›�Ü�v“; “?ÙØ*0°©)×*;Ñ*;×*=Ñ*=œ˜F 1™IœÀ4�Ø*0°©)×*;Ñ*;×*=Ñ*=œ˜F 1™IœÀ4�Ø˜a‘y�ØŸJ™JÕ&¨5·J±JÕ+>ß�tØ!& t f˜~Ñ-÷ :Ñ9Ù)÷ :×9Ö9ús$   —BC*Â5C*ÃC*ÃC*ÃC*Ã*
C8c                 ó<  • SU R                    SU R                   S3n[        U5       nU HT  nUR                  S5      (       d  M  UR	                  5       R                  S5      S   nU(       d  MF  SU 3s  sS S S 5        $    S S S 5        g ! , (       d  f       g = f)Nz/sys/dev/block/rz  z/ueventzDEVNAME=r=   r	  )r  r  r   rÑ   rÐ   Ú
rpartition)r_  ru   rÁ   rÜ   r­   s        rF   Úask_sys_dev_blockÚ$RootFsDeviceFinder.ask_sys_dev_block»  s{   € Ø  §¡ ¨A¨d¯j©j¨\¸ÐAˆÜ�tŒ_ Û�Ø—?‘? :×.Ó.ØŸ:™:›<×2Ñ2°:Ó>¸qÑA�Dß�tØ!& t f˜~Ñ-÷ ‰_Ù÷ �_Ž_ús   ©BÁ'BÁ2BÂBÂ
Bc                 óÌ  • U R                    SU R                   3n[        R                  " S5      nU HŠ  n [	        U5      nU   UR                  5       R                  5       nXQ:X  aL  [        R                  R                  [        R                  R                  U5      5      nSU 3sS S S 5        s  $  S S S 5        MŒ     g ! , (       d  f       Mž  = f! [         a     M®  f = f)Nrz  z/sys/class/block/*/devr	  )r  r  r  Úiglobr   r  rÐ   r™   ru   rö  Údirnamerh  )r_  Úneedlerù  r”  rÁ   Údatar­   s          rF   Úask_sys_class_blockÚ&RootFsDeviceFinder.ask_sys_class_blockÄ  s³   € Ø—J‘J�<˜q §¡ Ð-ˆÜ—
’
Ð3Ó4ˆÛˆDð	.Ü˜d“O�ò ØŸ6™6›8Ÿ>™>Ó+�DØ“~Ü!Ÿw™w×/Ñ/´·±·±ÀÓ0EÓF˜Ø!& t f˜~÷	 “Qà%÷ ‘Qò ÷ –Qûô %ó Úðús   ¸CÁA$CÃ
C	Ã
C#Ã"C#c                 ó   • S nUc   U R                  5       nUc   U R                  5       nUc   U R	                  5       nUb'  [
        R                  R                  U5      (       a  U$ g g ! [         a  n[        U5         S nANmS nAff = f! [         a  n[        U5         S nAN{S nAff = f! [         a  n[        U5         S nAN‰S nAff = frs  )r  rÏ   r   r  r  r™   ru   r�  )r_  ru   rÚ   s      rF   ÚfindÚRootFsDeviceFinder.findÓ  sÉ   € ØˆØ‰<ðØ×/Ñ/Ó1�ð ‰<ðØ×-Ñ-Ó/�ð ‰<ðØ×/Ñ/Ó1�ð
 Ñ¤§¡§¡¨t× 4Ñ 4ØˆKð !5Ðøô ó Ü�c—
‘
ûðûô
 ó Ü�c—
‘
ûðûô
 ó Ü�c—
‘
ûðúsE   ‡A* ›B ¯B. Á*
B	Á4BÂB	Â
B+ÂB&Â&B+Â.
CÂ8CÃC)r  r  N)r@   rA   rB   rC   r®  Ú	__slots__r`  r  r  r  r  rD   r?   rE   rF   r  r  Ÿ  s,   † ñð ˜'Ð"€Iò#ò
.ò.ò.õrE   r  c                 ó„  • [        5       n[        5       nU (       d”  [        U S35       nU Hw  nUR                  5       nUR	                  S5      (       d!  UR                  UR                  5       5        MJ  UR                  S5      S   nUS:X  d  Mf  UR                  S5        My     SSS5        US:X  aD  [        R                  R                  S5      (       a   [        R                  R                  S5      nO"[        R                  R                  U S	35      n/ n[        R                  " U5      nU Ht  n	U	u  p«p\U
S
:X  a  Sn
U
S;   a!  [        5       R                  5       =(       d    U
n
U (       d  U
(       a  XQ;  a  ML  [        R                   " X«X\5      nUR#                  U5        Mv     U$ ! , (       d  f       GN= f)z8Return mounted disk partitions as a list of namedtuples.z/filesystemsÚnodevÚ	r   ÚzfsNrÆ   z	/etc/mtabz/self/mountsÚnonerŸ  >   Úrootfsú	/dev/root)r  r   r   rÐ   rÑ   r  r›   r™   ru   ÚisfileÚrealpathrõ   Údisk_partitionsr  r  r   Ú	sdiskpartr¿   )rQ  ÚfstypesrÀ   rÁ   rÜ   ÚfstypeÚmounts_pathÚretlistÚ
partitionsÚ	partitionÚdeviceÚ
mountpointÚoptsÚntuples                 rF   r%  r%  ê  sd  € ä‹e€GÜ!Ó#€KÞÜ˜+˜ lÐ3Ô4¸Û�Ø—z‘z“|�Ø—‘ w×/Ñ/Ø—K‘K §
¡
£Ö-ð "ŸZ™Z¨Ó-¨aÑ0�FØ •ØŸ™ EÖ*ñ ÷ 5ð �gÓ¤"§'¡'§.¡.°×"=Ñ"=Ü—g‘g×&Ñ& {Ó3‰ä—g‘g×&Ñ&¨+¨°lÐ'CÓDˆà€GÜ×%Ò% kÓ2€JÛˆ	Ø+4Ñ(ˆ˜FØ�VÓØˆFØÐ,Ó,Ü'Ó)×.Ñ.Ó0×:°FˆFÞÞ˜VÓ2ÙÜ×"Ò" 6°vÓDˆØ�‰�vÖñ  ð €N÷? 5Ö4ús   ªA%F0ÂF0Æ0
F?c            	      óÚ  • [         R                  " [        5      n [        R                  " S5      nUR	                  [        R                  " S5      5        [        U Vs1 s H  o"R                  S5      S   iM     sn5      n[        R                  " S5      n[        R                  " S5      nU H-  nUR                  SU5      nXa;  d  M  UR                  U5        M/     U Hä  n US-   n[        [        U5      5      S	-  n	[        R                  R                  [        R                  R!                  U5      S
5      n[#        U5      R%                  5       n
[        US-   SS9n[        US-   SS9n[#        US-   SS9R%                  5       nUb   [        U5      S	-  nUb   [        U5      S	-  nX
   R                  XÙX¼45        Mæ     U(       Gdö  [        R                  " S5      n[        [+        U5      5      nU GHÅ  n [        R                  R                  US5      n[        [        U5      5      S	-  n	[        R                  R                  US5      n[#        U5      R%                  5       n
[        R                  " US-   5      nU Vs1 s HC  nSR                  [        R                  R/                  U5      R                  S5      SS 5      iME     nnSnSnU HÇ  n[        R                  R                  UUS-   5      n[#        USS9R%                  5       nUS:X  a,  [        [        R                  R                  UUS-   5      SS9nO1US:X  a+  [        [        R                  R                  UUS-   5      SS9nUb   [        U5      S	-  nUc  M¸   [        U5      S	-  nMÉ     X
   R                  SX›U45        GMÈ     [1        U 5      $ s  snf ! [&        [(        4 a     GM
  f = f! [(         a    Sn GN`f = f! [(         a    Sn GNaf = f! [&        [(        4 a  n[-        U5         SnAGM:  SnAff = fs  snf ! [(         a    Sn N¾f = f! [(         a    Sn GM…  f = f)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*_*rø   r   z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg     @�@r­   Ú_maxNr4  Ú_critÚ_labelrŸ  z /sys/class/thermal/thermal_zone*ÚtempÚtypez/trip_point*r>   Ú_typeÚcriticalÚ_tempÚhigh)Úcollectionsr   rf  r  ÚextendÚsortedr›   r  r  Úsubr¿   rÿ   r   r™   ru   rê   r  r   rÐ   rÏ   r
  r  r   rö  Údict)r>  Ú	basenamesrN   Ú
basenames2Úreplr­   ÚaltnameÚbaseru   ÚcurrentÚ	unit_namer;  r9  ÚlabelrÚ   Ú
trip_pathsÚpÚtrip_pointsÚ
trip_pointÚ	trip_types                       rF   Úsensors_temperaturesrN    s	  € ô ×
!Ò
!¤$Ó
'€CÜ—	’	Ð;Ó<€Ið ×Ñ”T—Y’YÐGÓHÔIÜ±Ó;²¨AŸ™ › Qœ±Ñ;Ó<€Iô —’Ø?ó€Jô �:Š:Ð@ÓA€DÛˆØ—(‘(Ð.°Ó5ˆØÕ#Ø×Ñ˜TÖ"ñ ó
 ˆð	Ø˜(‘?ˆDÜœD ›JÓ'¨&Ñ0ˆGÜ—7‘7—<‘<¤§¡§¡°Ó 5°vÓ>ˆDÜ˜D›	Ÿ™Ó)ˆIô �D˜6‘M¨DÑ1ˆÜ˜˜w™°Ñ6ˆÜ�D˜8‘O¨bÑ1×7Ñ7Ó9ˆàÑðÜ˜T“{ VÑ+�ð Ñð Ü  ›?¨VÑ3�ð 	‰×Ñ˜u¨tÐ>Ö?ñA ÷F Ü—I’IÐ@ÓAˆ	Üœ3˜y›>Ó*ˆ	äˆDðÜ—w‘w—|‘| D¨&Ó1�Ü¤ T£
Ó+¨fÑ4�Ü—w‘w—|‘| D¨&Ó1�Ü ›IŸO™OÓ-�	ô
 Ÿš 4¨.Ñ#8Ó9ˆJñ $óâ#�Að —‘œŸ™×)Ñ)¨!Ó,×2Ñ2°3Ó7¸¸!Ð<Ö=Ù#ð ð ð ˆHØˆDÛ)�
Ü—w‘w—|‘| D¨*°wÑ*>Ó?�Ü ¨rÑ2×8Ñ8Ó:�	Ø 
Ó*Ü#ÜŸ™Ÿ™ T¨:¸Ñ+?Ó@È4ñ ‘Hð  &Ó(ÜÜŸ™Ÿ™ T¨:¸Ñ+?Ó@È4ñ�Dð Ñ#ð$Ü$ T›{¨VÑ3˜ð Ó'ð(Ü#(¨£?°VÑ#;šñ' *ð. ‰N×!Ñ! 2 w°hÐ"?×@ñQ ôT �‹9ÐùòA <øô* œÐ$ó 		ó ð		ûô$ ó Ø“ðûô
 ó  Ø“ð ûô  œZÐ(ó Ü�c”
Þûðüò
øô* &ó $Ø#šð$ûô
 &ó (Ø#'œð(ús�   ÁOÃ(A2OÆO2Æ%PÈA0PÊA
QÎ	QÎQÏO/Ï.O/Ï2PÐPÐPÐPÐP?Ð(P:Ð:P?ÑQÑQÑQ*Ñ)Q*c                  óÊ  • [         R                  " [        5      n [        R                  " S5      nU(       d  [        R                  " S5      n[	        U Vs1 s H  o"R                  S5      S   iM     sn5      nU H±  n [        [        US-   5      5      n[        [        R                  R                  [        R                  R                  U5      S5      5      R                  5       n[        US-   S	S
9R                  5       nX   R!                  ["        R$                  " Xt5      5        M³     ['        U 5      $ s  snf ! [         a  n[        U5         SnAMà  SnAff = f)ak  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*_*rø   r   r2  Nr­   r5  rŸ  r4  )r<  r   rf  r  r>  r›   rÒ   r   rÏ   r   r   r™   ru   rê   r  rÐ   r¿   r   Úsfanr@  )r>  rA  rN   rE  rF  rÚ   rG  rH  s           rF   Úsensors_fansrQ  Œ  s  € ô ×
!Ò
!¤$Ó
'€CÜ—	’	Ð:Ó;€IÞô —I’IÐEÓFˆ	ä±Ó;²¨AŸ™ › Qœ±Ñ;Ó<€IÛˆð	Üœ$˜t h™Ó/Ó0ˆGô œŸ™Ÿ™¤R§W¡W§_¡_°TÓ%:¸FÓCÓD×JÑJÓLˆ	Ü�D˜8‘O¨bÑ1×7Ñ7Ó9ˆØ‰×ÑœgŸlšl¨5Ó:Ö;ñ ô �‹9Ðùò <øô ó 	Ü�#ŒJÝûð	ús   ÁD=ÂEÅ
E"ÅEÅE"c                  ó–  ^• [        5       mU4S jn [        R                  " [        5       Vs/ s H1  nUR	                  S5      (       d  SUR                  5       ;   d  M/  UPM3     nnU(       d  g[        R                  R                  [        [        U5      5      nU " US-   US-   5      nU " US-   US-   5      nU " US	-   US
-   5      nU " US-   5      nUb  Ub
   SU-  U-  nO[        [        US-   SS95      nUS:X  a  gSn	U " [        R                  R                  [        S5      [        R                  R                  [        S5      5      n
U
b  U
S:H  n	O:[        US-   SS9R                  5       R                  5       nUS:X  a  Sn	OUS;   a  Sn	U	(       a  [        R                  nOPUb  Ub   [        XE-  S-  5      nO8Ub%  [        US-  5      nUS:  a  [        R                  nO[        R                  n[        R                   " XŒU	5      $ s  snf ! [         a    Sn GN%f = f! [         a    [        R                  n NKf = f)zï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                  ó˜   >• U  H!  n[        UTS9nUT:w  d  M   [        U5      s  $    g! [         a    UR                  5       s s  $ f = f)zfAttempt to read the content of multiple files which may
not exist. If none of them exist return None.
r4  N)r   rÒ   r
  rÐ   )r=  ru   r>  Únulls      €rF   Ú
multi_bcatÚ#sensors_battery.<locals>.multi_bcat´  sR   ø€ ó ˆDÜ�t dÑ+ˆCØ�d�{ð'Ü˜s›8’Oñ	 ð øô "ó 'ØŸ9™9›;Ô&ð'ús   š
*ªA	ÁA	ÚBATÚbatteryNz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@rÇ   z	/capacityre  r4  z
AC0/onlinez	AC/onliner   ú/statusrŸ  ÚdischargingF>   ÚfullÚchargingTi  é<   r   )Úobjectr™   rg  ÚPOWER_SUPPLY_PATHrÑ   r  ru   rê   rÔ   ÚZeroDivisionErrorrÒ   r   rÐ   r   ÚPOWER_TIME_UNLIMITEDÚPOWER_TIME_UNKNOWNÚsbattery)rU  rN   Úbatsrø  Ú
energy_nowÚ	power_nowÚenergy_fullÚtime_to_emptyra   Úpower_pluggedÚonlinerš  ÚsecsleftrT  s                @rF   Úsensors_batteryrl  «  sK  ø€ ô ‹8€Dõô —’Ô-Ô.óâ.ˆAØ�<‰<˜×Ñ )¨q¯w©w«yÑ"8÷ 	
Ù.ð 	ð ö
 Øô �7‰7�<‰<Ô)¬3¨t«9Ó5€Dñ ˜D =Ñ0°$¸Ñ2FÓG€JÙ˜4 ,Ñ.°°~Ñ0EÓF€IÙ˜T NÑ2°D¸>Ñ4IÓJ€KÙ˜tÐ&:Ñ:Ó;€Mð Ñ :Ñ#9ð	Ø˜jÑ(¨;Ñ6‰Gô ”c˜$ Ñ,°rÑ:Ó;ˆØ�b‹=Øð
 €MÙÜ
�‰�‰Ô&¨Ó5Ü
�‰�‰Ô&¨Ó4ó€Fð ÑØ !™‰ä�T˜IÑ%°Ñ3×9Ñ9Ó;×AÑAÓCˆØ�]Ó"Ø!‰MØÐ+Ó+Ø ˆMö Ü×/Ñ/‰Ø	Ñ	 IÑ$9ð	2Ü˜:Ñ1°DÑ8Ó9‰Hð 
Ñ	"Ü�} rÑ)Ó*ˆØ�a‹<Ü×1Ñ1ˆHøä×-Ñ-ˆä×Ò˜G¨}Ó=Ð=ùòCøô. !ó 	Ø‹Gð	ûôB !ó 	2Ü×1Ñ1ŠHð	2ús/   ®.HÁ HÃH Æ3H+ ÈH(È'H(È+IÉIc                  ó¶   • / n [         R                  " 5       nU H;  nUu  p4pVn[        R                  " X4=(       d    SXVU5      nU R	                  U5        M=     U $ )z:Return currently connected users as a list of namedtuples.N)rõ   Úusersr   Úsuserr¿   )	r*  ÚrawlistÚitemrŽ   ÚttyÚhostnameÚtstamprm  Únts	            rF   rn  rn  
  sQ   € à€GÜ�jŠj‹l€GÛˆØ+/Ñ(ˆ�8 SÜ�]Š]˜4§¨¨hÀÓDˆØ�‰�rÖñ ð €NrE   c                  ó&  • [        5        S3n [        U 5       nU HR  nUR                  S5      (       d  M  [        UR	                  5       R                  5       S   5      nUqUs  sSSS5        $    SU  3n[        U5      e! , (       d  f       g= f)zAReturn the system boot time expressed in seconds since the epoch.r±   s   btimer   Nzline 'btime' not found in )r   r   rÑ   rÿ   rÐ   r›   Ú	BOOT_TIMEr‘  )ru   rÁ   rÜ   r>  rï   s        rF   Ú	boot_timerx    s‡   € ô ÓÐ  Ð&€DÜ	�TÔ	˜aÛˆDØ�‰˜x×(Ó(Ü˜DŸJ™J›L×.Ñ.Ó0°Ñ3Ó4�Ø�	Ø‘
÷ 
Ñ	Ùð
 +¨4¨&Ð1ˆÜ˜3ÓÐ÷ 
Õ	ús   ™B·/BÁ0BÂ
Bc                  óÒ   • [        5       R                  [        5      n [        R                  " U 5       Vs/ s H$  oR                  5       (       d  M  [        U5      PM&     sn$ s  snf )z7Returns a list of PIDs currently running on the system.)r   r}  r
   r™   rg  r
  rÒ   )ru   rN   s     rF   rt  rt  (  sD   € äÓ×#Ñ#¤HÓ-€DÜŸJšJ tÔ,Ó<Ò,�q·	±	·‹FŒC�ŽFÑ,Ñ<Ð<ùÒ<s   ¶A$ÁA$c                 ó�  • [         R                  " U 5      (       d  g [        5        SU  S3n[        U5       nU HD  nUR	                  S5      (       d  M  [        UR                  5       S   5      nX@:H  s  sSSS5        $    SU 3n[        U5      e! , (       d  f       g= f! [        [        4 a    U [        5       ;   s $ f = f)z[Check for the existence of a unix PID. Linux TIDs are not
supported (always return False).
Fr©   rY  s   Tgid:r   Nz'Tgid' line not found in )
r   Ú
pid_existsr   r   rÑ   rÒ   r›   r
  rÏ   rt  )rm  ru   rÁ   rÜ   Útgidrï   s         rF   r{  r{  .  s¾   € ô ×Ò˜s×#Ñ#Øð	!ô &Ó'Ð(¨¨#¨¨gÐ6ˆDÜ˜TÔ" aÛ�DØ—‘ x×0Ó0Ü" 4§:¡:£<°¡?Ó3˜ð  $™{Ñ*÷ #Ñ"Ùð 2°$°Ð8�Ü  “oÐ%÷ #Õ"ûô œÐ$ó 	!Øœ$›&‘=Ò ð	!ús:   žB% ¹BÁ!BÁ8	B% ÂBÂ
B"ÂB% Â"B% Â%CÃCc                  óV  • 0 n [        5       n[        5        Hf  n [        U SU S35       nUR                  5       nSSS5        WR	                  S5      nXES-   S R                  5       n[        US   5      nXpU'   Mh     U $ ! , (       d  f       NL= f! [        [        4 a     M�  f = f)zkObtain a {pid: ppid, ...} dict for all running processes in
one shot. Used to speed up Process.children().
r©   r±   Nó   )r=   r   )	r   rt  r   r  rµ  r›   rÒ   rh  ri  )r>  rÀ   rm  rÁ   r  ÚrparÚdsetÚppids           rF   Úppid_mapr‚  O  s­   € ð €CÜ!Ó#€KÜŽvˆð	Ü ˜}¨A¨c¨U°%Ð8Ô9¸QØ—v‘v“x�÷ :ð —:‘:˜dÓ#ˆDØ˜q™˜
Ð#×)Ñ)Ó+ˆDÜ�t˜A‘w“<ˆDØ�‹Hñ ð €J÷ :Õ9ûä!Ô#5Ð6ó 	ò ð	ús'   ›B¬B½BÂ
B	ÂBÂB(Â'B(c                 óF   ^ • [         R                  " T 5      U 4S j5       nU$ )zdDecorator which translates bare OSError and OSError exceptions
into NoSuchProcess and AccessDenied.
c                 ó–  >• U R                   U R                  pC T" U /UQ70 UD6$ ! [         a  n[        X45      UeS nAf[         a!  nU R                  5         [        X45      UeS nAf[         aV  nU R                  5         [        R                  R                  U R                   SU S35      (       d  [        X45      Uee S nAff = f)Nr©   r±   )rm  Ú_namerv  r   ri  Ú_raise_if_zombier   rh  r™   ru   r�  r^  )r_  rÎ   Úkwargsrm  r­   rÚ   Úfuns         €rF   ÚwrapperÚ wrap_exceptions.<locals>.wrapperj  s¹   ø€ à—H‘H˜dŸj™jˆTð	Ù�tÐ-˜dÒ- fÑ-Ð-øÜó 	3Ü˜sÓ)¨sÐ2ûÜ!ó 	4Ø×!Ñ!Ô#Ü Ó*°Ð3ûÜ ó 	Ø×!Ñ!Ô#ô —7‘7—>‘> T×%6Ñ%6Ð$7°q¸¸¸UÐ"C×DÑDÜ# CÓ.°CÐ7Øûð	ús+   š& ¦
C°<¼CÁ	A%Á%CÁ2ACÃC)Ú	functoolsÚwraps)rˆ  r‰  s   ` rF   Úwrap_exceptionsr�  e  s'   ø€ ô
 ‡_‚_�SÓôó ðð$ €NrE   c                   ó   • \ rS rSrSr/ SQrS rS rS rS r	\
\S 5       5       r\
\S	 5       5       r\
\S
 5       5       rS rS r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\R.                  R1                  S\R2                  " 5        S35      (       a  \
S 5       r\
S 5       r\
S 5       r\
S<S j5       r\
S 5       r\
S 5       r\ (       d  \!(       aI  S r"\
\#RH                  " S5      \#RH                  " S5      \#RH                  " S5      4S j5       r%\
S  5       r&O\r&\!(       a  \
S! 5       r'\
S" 5       r(\
\#RH                  " S#5      4S$ j5       r)\
\#RH                  " S%5      4S& j5       r*\
S' 5       r+\
S( 5       r,\
S) 5       r-\.(       a&  \
S* 5       r/\#RH                  " S+5      4S, jr0\
S- 5       r1\2(       a  \
S. 5       r3\
S/ 5       r4\5" \6S05      (       a
  \
S<S1 j5       r7\
S2 5       r8\
S3 5       r9\
S=S4 j5       r:\
S5 5       r;\
S6 5       r<\
\#RH                  " S75      4S8 j5       r=\
\#RH                  " S95      4S: j5       r>S;r?g)>ÚProcessi€  zLinux process implementation.)Ú_cacher…  Ú_ppidr^  rm  c                 óJ   • Xl         S U l        S U l        [        5       U l        g rs  )rm  r…  r‘  r   r^  )r_  rm  s     rF   r`  ÚProcess.__init__…  s    € ØŒØˆŒ
ØˆŒ
Ü+Ó-ˆÕrE   c                 ó®   •  [        U R                   SU R                   S35      nUR                  S5      nXS-   US-    nUS:H  $ ! [         a     gf = f)Nr©   r±   r~  r=   r>   ó   ZF)r   r^  rm  rµ  rÏ   )r_  r  r  rš  s       rF   Ú
_is_zombieÚProcess._is_zombie‹  si   € ð	"Ü˜4×,Ñ,Ð-¨Q¨t¯x©x¨j¸Ð>Ó?ˆDð —:‘:˜dÓ#ˆDØ ™( T¨A¡XÐ.ˆFØ˜T‘>Ð!øô ó 	Ùð	ús   ‚%A Á
AÁAc                 ó„   • U R                  5       (       a+  [        U R                  U R                  U R                  5      eg rs  )r–  r   rm  r…  r‘  ©r_  s    rF   r†  ÚProcess._raise_if_zombie›  s/   € Ø�?‰?×ÑÜ §¡¨$¯*©*°d·j±jÓAÐAð rE   c                 ób   • [         R                  " U R                   SU R                   35        g)z+Raise NSP if the process disappeared on us.r©   N)r™   rô  r^  rm  r™  s    rF   Ú_raise_if_not_aliveÚProcess._raise_if_not_aliveŸ  s&   € ô 	�Š�4×$Ñ$Ð% Q t§x¡x jÐ1Õ2rE   c                 ó¸  • [        U R                   SU R                   S35      nUR                  S5      nXR	                  S5      S-   U nXS-   S R                  5       n0 nX5S'   US	   US
'   US   US'   US   US'   US   US'   US   US'   US   US'   US   US'   US   US'   US   US'    US   US'   U$ ! [         a    [        S5        S	US'    U$ f = f)a!  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   r=   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   r^  rm  rµ  r  r›   Ú
IndexErrorr   )r_  r  r  r­   rÃ   r>  s         rF   Ú_parse_stat_fileÚProcess._parse_stat_file¥  s-  € ô �t×(Ñ(Ð)¨¨4¯8©8¨*°EÐ:Ó;ˆð �z‰z˜$ÓˆØ—I‘I˜d“O aÑ'¨$Ð/ˆØ˜Q‘h�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   Â1B; Â;CÃCc                 ó¢   • [        U R                   SU R                   S35       nUR                  5       sSSS5        $ ! , (       d  f       g= f)zwRead /proc/{pid}/stat file and return its content.
The return value is cached in case oneshot() ctx manager is
in use.
r©   rY  N)r   r^  rm  r  ©r_  rÁ   s     rF   Ú_read_status_fileÚProcess._read_status_fileÌ  s<   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸ÐAÔBÀaØ—6‘6“8÷ C×B×Bús   ¦A Á 
Ac                 ó¾   • [        U R                   SU R                   S35       nUR                  5       R	                  5       sS S S 5        $ ! , (       d  f       g = f)Nr©   r2   )r   r^  rm  r  rÐ   r²  s     rF   Ú_read_smaps_fileÚProcess._read_smaps_fileÖ  sC   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸Ð@ÔAÀQØ—6‘6“8—>‘>Ó#÷ B×A×Aús   ¦AÁ
Ac                 ó¦   • U R                   R                  U 5        U R                  R                  U 5        U R                  R                  U 5        g rs  )r¯  Úcache_activater³  r¶  r™  s    rF   Úoneshot_enterÚProcess.oneshot_enterÜ  s>   € Ø×Ñ×,Ñ,¨TÔ2Ø×Ñ×-Ñ-¨dÔ3Ø×Ñ×,Ñ,¨TÕ2rE   c                 ó¦   • U R                   R                  U 5        U R                  R                  U 5        U R                  R                  U 5        g rs  )r¯  Úcache_deactivater³  r¶  r™  s    rF   Úoneshot_exitÚProcess.oneshot_exitá  s>   € Ø×Ñ×.Ñ.¨tÔ4Ø×Ñ×/Ñ/°Ô5Ø×Ñ×.Ñ.¨tÕ4rE   c                 ó:   • [        U R                  5       S   5      $ )Nr­   )r   r¯  r™  s    rF   r­   ÚProcess.nameæ  s   € ô �d×+Ñ+Ó-¨fÑ5Ó6Ð6rE   c                 ó  •  [        U R                   SU R                   S35      $ ! [        [        4 aQ    U R                  5         [        R                  R                  U R                   SU R                   35      (       a   ge f = f)Nr©   z/exerŸ  )	rš   r^  rm  rh  ri  r†  r™   ru   Úlexistsr™  s    rF   ÚexeÚProcess.exeë  s|   € ð		Ü˜t×0Ñ0Ð1°°4·8±8°*¸DÐAÓBÐBøÜ!Ô#5Ð6ó 	Ø×!Ñ!Ô#ô �w‰w�‰ $×"3Ñ"3Ð!4°A°d·h±h°ZÐ@×AÑAÙØð	ús   ‚$' §ABÂBc                 óº  • [        U R                   SU R                   S35       nUR                  5       nS S S 5        W(       d  U R	                  5         / $ UR                  S5      (       a  SOSnUR                  U5      (       a  US S nUR                  U5      nUS:X  a&  [        U5      S:X  a  SU;   a  UR                  S5      nU$ ! , (       d  f       N›= f)Nr©   z/cmdliner”   r‰   re  r   )r   r^  rm  r  r†  rœ   r›   r¾   )r_  rÁ   r  ÚsepÚcmdlines        rF   rÈ  ÚProcess.cmdlineø  s½   € ä˜$×+Ñ+Ð,¨A¨d¯h©h¨Z°xÐ@ÔAÀQØ—6‘6“8ˆD÷ Bæà×!Ñ!Ô#ØˆIð Ÿ™ f×-Ñ-‰f°3ˆØ�=‰=˜×ÑØ˜˜�9ˆDØ—*‘*˜S“/ˆð �&‹=œS ›\¨QÓ.°3¸$³;Ø—j‘j “oˆGØˆ÷- BÕAús   ¦CÃ
Cc                 ó¶   • [        U R                   SU R                   S35       nUR                  5       nS S S 5        [	        W5      $ ! , (       d  f       N= f)Nr©   z/environ)r   r^  rm  r  r   )r_  rÁ   r  s      rF   ÚenvironÚProcess.environ  sJ   € ä˜$×+Ñ+Ð,¨A¨d¯h©h¨Z°xÐ@ÔAÀQØ—6‘6“8ˆD÷ Bä" 4Ó(Ð(÷ BÕAús   ¦A
Á

Ac                 óŽ   • [        U R                  5       S   5      n[        R                  " 5       n X!   $ ! [         a     g f = f)Nr   )rÒ   r¯  r   Úget_terminal_maprÍ   )r_  Útty_nrr]  s      rF   ÚterminalÚProcess.terminal  sG   € ä�T×*Ñ*Ó,¨WÑ5Ó6ˆÜ×(Ò(Ó*ˆð	Ø‘<ÐøÜó 	Ùð	ús   ³7 ·
AÁAr1   ú/ioc           	      ó  • U R                    SU R                   S3n0 n[        U5       nU H=  nUR                  5       nU(       d  M   UR	                  S5      u  pV[        U5      X%'   M?     S S S 5        U(       d  U S3n[        U5      e [        US   US   US   US   US	   US
   5      $ ! [         a     M�  f = f! , (       d  f       NY= f! [         a*  nUR                  S   < SU SU< 3n[        U5      S eS nAff = f)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 )r^  rm  r   rÐ   r›   rÒ   r
  r‘  rŠ   rÍ   rÎ   )	r_  ÚfnamerÃ   rÁ   rÜ   r­   r!  rï   rÚ   s	            rF   Úio_countersÚProcess.io_counters$  s2  € à×(Ñ(Ð)¨¨4¯8©8¨*°CÐ8ˆEØˆFÜ˜UÔ# qÛ�DàŸ:™:›<�Dß�tð6Ø*.¯*©*°UÓ*;™K˜Dô
 ,/¨u«:˜F›Lñ ÷ $ö Ø˜˜Ð/�Ü" 3Ó'Ð'ð0ÜØ˜8Ñ$Ø˜8Ñ$Ø˜=Ñ)Ø˜>Ñ*Ø˜8Ñ$Ø˜8Ñ$óð øô  *ó %â$ð%ú÷ $Õ#ûô0 ó 0à—x‘x ‘{‘oÐ%=¸e¸Wð E#Ø#)¡*ð.ð ô ! “o¨4Ð/ûð0úsG   ªCÁ
B0ÁCÂ!C Â0
B>Â:CÂ=B>Â>CÃ
CÃ
DÃ%DÄDc                 ó  • U R                  5       n[        US   5      [        -  n[        US   5      [        -  n[        US   5      [        -  n[        US   5      [        -  n[        US   5      [        -  n[        X#XEU5      $ )Nr¢  r¤  r¦  r§  r­  )r¯  rÿ   r   r�   )r_  rÂ   r¢  r¤  r¦  r§  r’   s          rF   r  ÚProcess.cpu_timesG  sƒ   € à×&Ñ&Ó(ˆÜ�f˜W‘oÓ&¬Ñ4ˆÜ�f˜W‘oÓ&¬Ñ4ˆÜ˜vÐ&6Ñ7Ó8¼;ÑFˆÜ˜vÐ&6Ñ7Ó8¼;ÑFˆÜ�v˜mÑ,Ó-´Ñ;ˆÜ˜ ~ÀvÓNÐNrE   c                 ó:   • [        U R                  5       S   5      $ )zWhat CPU the process is on.r«  ©rÒ   r¯  r™  s    rF   r«  ÚProcess.cpu_numQ  s   € ô �4×(Ñ(Ó*¨9Ñ5Ó6Ð6rE   Nc                 óX   • [         R                  " U R                  XR                  5      $ rs  )r   Úwait_pidrm  r…  )r_  Útimeouts     rF   ÚwaitÚProcess.waitV  s   € ä× Ò  §¡¨7·J±JÓ?Ð?rE   c                 ó€   • [        U R                  5       S   5      n[        =(       d
    [        5       nU[        -  U-   $ )Nr©  )rÿ   r¯  rw  rx  r   )r_  ÚctimeÚbts      rF   r©  ÚProcess.create_timeZ  s8   € ä�d×+Ñ+Ó-¨mÑ<Ó=ˆô ×%œ)›+ˆØœÑ# rÑ)Ð)rE   c           	      óü   • [        U R                   SU R                   S35       nS UR                  5       R	                  5       S S  5       u  p#pEpgnS S S 5        [        WWWWWWW5      $ ! , (       d  f       N= f)Nr©   z/statmc              3   óF   #   • U  H  n[        U5      [        -  v •  M     g 7frs  )rÒ   rÓ   )Ú.0rN   s     rF   Ú	<genexpr>Ú&Process.memory_info.<locals>.<genexpr>s  s   é € ð 8Ú+C a”�A“œÖ!Ò+Cùs   ‚!rž  )r   r^  rm  r½   r›   rz   )	r_  rÁ   Úvmsr€   rh   ÚtextÚlibr  Údirtys	            rF   Úmemory_infoÚProcess.memory_infoe  s}   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸Ð@ÔAÀQñ8Ø+,¯:©:«<×+=Ñ+=Ó+?ÀÀÑ+Có8Ñ4ˆC�f C¨u÷ Bô �C˜˜f d¨C°°uÓ=Ð=÷	 BÕAús   ¦.A-Á-
A;c                 óô  • S=n=p#[        U R                   SU R                   S35       nU H«  nUR                  S5      (       a$  U[	        UR                  5       S   5      S-  -  nM=  UR                  S5      (       a!  [	        UR                  5       S   5      S-  nMt  UR                  S5      (       d  MŒ  [	        UR                  5       S   5      S-  nM­     S S S 5        XU4$ ! , (       d  f       N= f)	Nr   r©   r3   s   Private_r   râ   ó   Pss:ó   Swap:)r   r^  rm  rÑ   rÒ   r›   )r_  r|   r}   r~   rÁ   rÜ   s         rF   Ú_parse_smaps_rollupÚProcess._parse_smaps_rollupz  sÛ   € ð  !Ð ˆCÐ �#ÜØ×$Ñ$Ð% Q t§x¡x j°Ð>ôàÛ�DØ—‘ {×3Ñ3àœs 4§:¡:£<°¡?Ó3°dÑ:Ñ:šØŸ™¨×1Ñ1Ü! $§*¡*£,¨q¡/Ó2°TÑ9šØŸ™¨×2Ó2Ü" 4§:¡:£<°¡?Ó3°dÑ:šñ ÷ð ˜dÐ#Ð#÷õ ús   «BC)Â:#C)Ã)
C7s   \nPrivate.*:\s+(\d+)s   \nPss\:\s+(\d+)s   \nSwap\:\s+(\d+)c                 ó,  • U R                  5       n[        [        [        UR	                  U5      5      5      S-  n[        [        [        UR	                  U5      5      5      S-  n[        [        [        UR	                  U5      5      5      S-  nXVU4$ )Nrâ   )r¶  r  r·  rÒ   Úfindall)r_  Ú_private_reÚ_pss_reÚ_swap_reÚ
smaps_datar|   r}   r~   s           rF   Ú_parse_smapsÚProcess._parse_smaps‘  s€   € ð* ×.Ñ.Ó0ˆJô ”cœ#˜{×2Ñ2°:Ó>Ó?Ó@À4ÑGˆCÜ”cœ#˜wŸ™¨zÓ:Ó;Ó<¸tÑCˆCÜ”sœ3 × 0Ñ 0°Ó <Ó=Ó>ÀÑEˆDØ˜dÐ#Ð#rE   c                 óò   • [         (       a   U R                  5       u  pnOU R	                  5       u  pnU R                  5       n[        XAX#4-   6 $ ! [        [        4 a    U R	                  5       u  pn NAf = frs  )ÚHAS_PROC_SMAPS_ROLLUPró  ri  rh  rû  rî  r{   )r_  r|   r}   r~   Ú	basic_mems        rF   Úmemory_full_infoÚProcess.memory_full_info®  s}   € ç$Ò$ð9Ø%)×%=Ñ%=Ó%?‘N�C™dð "&×!2Ñ!2Ó!4‘�˜$Ø×(Ñ(Ó*ˆIÜ˜Y¨sÐ)9Ñ9Ð:Ð:øô +Ô,=Ð>ó 9Ø%)×%6Ñ%6Ó%8‘N�Cšdð9ús   �A Á#A6Á5A6c                 ó~  • S nU R                  5       nU(       d  U R                  5         / $ UR                  S5      n/ nUR                  S5      nU/nU" X65       GHA  u  prUR                  SS5      n Uu  pšp¼pÞU(       d  SnOF[        U5      nUR                  5       nUR                  S5      (       a  [        U5      (       d  USS	 n[        U	5      [        U
5      UUR                  S
S5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      4nUR                  U5        GMD     U$ ! [         a    US/-   u  pšp¼pÞ GN@f = f)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   ó”  #   • 0 nU  Hl  nUR                  S S5      nUS   R                  S5      (       d'  UR                  5       U4v •  UR                  U5        MU   [	        US   5      S-  X$S   '   Mn     UR                  5       U4v •  g ! [
         a/    US   R                  S5      (       a   M«  SU< 3n[        U5      S ef = f7f)Né   r   r+  r   râ   s   VmFlags:z!don't know how to interpret line )r›   rœ   Úpopr¿   rÒ   r
  rÑ   )r¸  Úcurrent_blockr  rÜ   rÃ   rï   s         rF   Ú
get_blocksÚ'Process.memory_maps.<locals>.get_blocksÉ  sÎ   é € Ø�Û!�DØ!ŸZ™Z¨¨aÓ0�FØ! !™9×-Ñ-¨d×3Ñ3à,×0Ñ0Ó2°DÐ9Ò9Ø%×,Ñ,¨TÖ2ð<Ü.1°&¸±)«n¸tÑ.C˜D¨¡›Oñ "ð %×(Ñ(Ó*¨DÐ1Ó1øô  *ó <Ø% a™y×3Ñ3°K×@Ñ@â (Ø$EÀdÁXÐ"N˜CÜ",¨S£/°tÐ;ð<üs*   ‚ACÁBÁ3CÂ#CÂ/CÂ2CÃ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¿   )r_  r  r  r¸  r  Ú
first_liner  ÚheaderÚhfieldsr…  ÚpermsÚ_offsetÚ_devÚ_inoderu   rq  s                   rF   Úmemory_mapsÚProcess.memory_maps¿  sµ  € ò2ð& ×(Ñ(Ó*ˆDö Ø×%Ñ%Ô'Ø�	Ø—J‘J˜uÓ%ˆEØˆBØŸ™ 1›ˆJØ'˜LˆMÙ *¨5× @‘�Ø Ÿ,™, t¨QÓ/�ðNØ?FÑ<�D °ö Ø#‘Dä! $›<�DØŸ:™:›<�DØ—}‘} \×2Ñ2Ô;MØ÷<ñ <ð  $ D S˜z˜ä˜4“LÜ˜5“MØØ—H‘H˜W aÓ(Ø—H‘H˜X qÓ)Ø—H‘H˜W aÓ(Ø—H‘HÐ-¨qÓ1Ø—H‘HÐ-¨qÓ1Ø—H‘HÐ.°Ó2Ø—H‘HÐ.°Ó2Ø—H‘H˜^¨QÓ/Ø—H‘H˜]¨AÓ.Ø—H‘H˜X qÓ)ð�ð —	‘	˜$—ñ= !Að> ˆIøô7 "ó NØ?FÈ"È¹~Ñ<�D °ºðNús   Á5F$Æ$F<Æ;F<c                 óL   • [        U R                   SU R                   S35      $ )Nr©   z/cwd)rš   r^  rm  r™  s    rF   ÚcwdÚProcess.cwd  s%   € ä˜4×,Ñ,Ð-¨Q¨t¯x©x¨j¸Ð=Ó>Ð>rE   s   ctxt_switches:\t(\d+)c                 ó   • U R                  5       nUR                  U5      nU(       d(  SU R                   SU R                   S3n[	        U5      e[
        R                  " [        US   5      [        US   5      5      $ )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ö  r^  rm  r;  r   ÚpctxswrÒ   )r_  Ú	_ctxsw_rer  Úctxswrï   s        rF   Únum_ctx_switchesÚProcess.num_ctx_switches  s}   € ð ×%Ñ%Ó'ˆØ×!Ñ! $Ó'ˆÞðà×%Ñ%Ð& a¨¯© zð 2.ð.ð ô & cÓ*Ð*Ü�~Š~œc %¨¡(›m¬S°°q±«]Ó;Ð;rE   s   Threads:\t(\d+)c                 ó\   • U R                  5       n[        UR                  U5      S   5      $ ©Nr   )r³  rÒ   rö  )r_  Ú_num_threads_rer  s      rF   Únum_threadsÚProcess.num_threads  s-   € ð ×%Ñ%Ó'ˆÜ�?×*Ñ*¨4Ó0°Ñ3Ó4Ð4rE   c                 óÎ  • [         R                  " U R                   SU R                   S35      nUR	                  5         / nSnU HØ  nU R                   SU R                   SU S3n [        U5       nUR                  5       R                  5       nS S S 5        WUR                  S5      S-   S  nUR                  S	5      n[        US
   5      [        -  n	[        US   5      [        -  n
[        R                  " [!        U5      Xš5      nUR#                  U5        MÚ     U(       a  U R%                  5         U$ ! , (       d  f       N®= f! [        [        4 a    Sn GM  f = f)Nr©   z/taskFz/task/r±   Tr~  r=   rò   r¡  r£  )r™   rg  r^  rm  r8  r   r  rÐ   rh  ri  r  r›   rÿ   r   r   ÚpthreadrÒ   r¿   rœ  )r_  Ú
thread_idsr*  Ú
hit_enoentÚ	thread_idrÔ  rÁ   ÚstrÂ   r¢  r¤  r0  s               rF   ÚthreadsÚProcess.threads!  s;  € ä—Z’Z 4×#4Ñ#4Ð"5°Q°t·x±x°jÀÐ FÓGˆ
Ø�‰ÔØˆØˆ
Û#ˆIØ×(Ñ(Ð)¨¨4¯8©8¨*°F¸9¸+ÀUÐKˆEðÜ  Ô'¨1ØŸ™›Ÿ™Ó)�B÷ (ð �B—G‘G˜D“M AÑ%Ð'Ð(ˆBØ—X‘X˜d“^ˆFÜ˜& ™*Ó%¬Ñ3ˆEÜ˜& ™*Ó%¬Ñ3ˆEÜ—_’_¤S¨£^°UÓBˆFØ�N‰N˜6Ö"ñ! $ö" Ø×$Ñ$Ô&Øˆ÷! (Õ'ûä%Ô'9Ð:ó ð "�
Ûð	ús0   Á*EÁ5D<ÂEÄ<
E
	ÅEÅ
EÅE$Å#E$c                 óB   • [         R                  " U R                  5      $ rs  )rÓ  Úgetpriorityrm  r™  s    rF   Únice_getÚProcess.nice_get<  s   € ô ×%Ò% d§h¡hÓ/Ð/rE   c                 óD   • [         R                  " U R                  U5      $ rs  )rÓ  Úsetpriorityrm  )r_  r!  s     rF   Únice_setÚProcess.nice_setE  s   € ä×%Ò% d§h¡h°Ó6Ð6rE   c                 óB   • [         R                  " U R                  5      $ rs  )rõ   r5   rm  r™  s    rF   Úcpu_affinity_getÚProcess.cpu_affinity_getL  s   € ä×-Ò-¨d¯h©hÓ7Ð7rE   s   Cpus_allowed_list:\t(\d+)-(\d+)c           	      ó  • U R                  5       nUR                  U5      nU(       a6  [        [        [	        US   S   5      [	        US   S   5      S-   5      5      $ [        [        [        [        5       5      5      5      $ )Nr   r   )r³  rö  rf  ÚrangerÒ   r¾   r  )r_  Ú_rer  r  s       rF   Ú_get_eligible_cpusÚProcess._get_eligible_cpusP  sk   € ð ×)Ñ)Ó+ˆDØ—K‘K Ó%ˆEÞÜœE¤# e¨A¡h¨q¡kÓ"2´C¸¸a¹À¹Ó4DÀqÑ4HÓIÓJÐJäœE¤#¤m£oÓ"6Ó7Ó8Ð8rE   c           	      óÄ  •  [         R                  " U R                  U5        g ! [        [        4 a«  n[        U[        5      (       d  UR                  [        R                  :X  ar  U R                  5       n[        [        [        [        5       5      5      5      nU H7  nXT;  a  SU< SU< 3n[	        U5      S eXS;  d  M%  SU SU 3n[	        U5      Ue   e S nAff = f)Nzinvalid CPU z; choose between zCPU number z! is not eligible; choose between )rõ   Úproc_cpu_affinity_setrm  rÏ   r
  r—   rj  rk  r7  Útupler5  r¾   r  )r_  r  rÚ   Úeligible_cpusÚall_cpusÚcpurï   s          rF   Úcpu_affinity_setÚProcess.cpu_affinity_set[  sÞ   € ðÜ×*Ò*¨4¯8©8°TÕ:øÜœZÐ(ó Ü˜c¤:×.Ñ.°#·)±)¼u¿|¹|Ó2KØ$(×$;Ñ$;Ó$=�MÜ$¤U¬3¬}«Ó+?Ó%@ÓA�HÛ#˜ØÓ.à".¨s©gð 6$Ø$1Ñ#4ð!6ð  ô #-¨S£/°tÐ;ØÕ3à"-¨c¨Uð 3,Ø,9¨?ð!<ð  ô #-¨S£/°sÐ:ñ  $ð ûð#ús   ‚!$ ¤C´BCÃCÃCc                 óˆ   • [         R                  " U R                  5      u  p[        U5      n[        R
                  " X5      $ rs  )rõ   r4   rm  r;   r   Úpionice)r_  Úioclassr!  s      rF   Ú
ionice_getÚProcess.ionice_getu  s1   € ä!×1Ò1°$·(±(Ó;‰NˆGÜ  Ó)ˆGÜ—?’? 7Ó2Ð2rE   c                 óø   • Uc  SnU(       a5  U[         R                  [         R                  1;   a  U< S3n[        U5      eUS:  d  US:”  a  Sn[        U5      e[        R
                  " U R                  X5      $ )Nr   z ioclass accepts no valuerž  zvalue not in 0-7 range)r;   r#   r    r
  rõ   Úproc_ioprio_setrm  )r_  rC  r!  rï   s       rF   Ú
ionice_setÚProcess.ionice_set{  sy   € à‰}Ø�Þ˜Ü×,Ñ,Ü×,Ñ,ð%ó ð !™Ð#<Ð=�Ü  “oÐ%Ø�q‹y˜E A›IØ.�Ü  “oÐ%Ü×'Ò'¨¯©°'ÓAÐArE   r/   c                 óŒ  • U R                   S:X  a  Sn[        U5      e Uc!  [        R                  " U R                   U5      $ [	        U5      S:w  a  SU< 3n[        U5      e[        R                  " U R                   X5        g ! [
         a4  nUR                  [        R                  :X  a  U R                  5         e S nAff = f)Nr   z)can't use prlimit() against PID 0 processr=   z2second argument must be a (soft, hard) tuple, got )	rm  r
  Úresourcer/   r¾   rÏ   rj  ÚENOSYSr†  )r_  Ú	resource_Úlimitsrï   rÚ   s        rF   ÚrlimitÚProcess.rlimitŒ  s²   € ð
 �x‰x˜1‹}ØA�Ü  “oÐ%ðØ‘>ä#×+Ò+¨D¯H©H°iÓ@Ð@ô ˜6“{ aÓ'ð*Ø*0©ð5ð ô )¨›oÐ-Ü×$Ò$ T§X¡X¨yÕAøÜó Ø—9‘9¤§¡Ó,ð ×)Ñ)Ô+Øûðús   Ÿ#B ÁAB Â
CÂ/B>Â>Cc                 ót   • U R                  5       S   nUR                  5       n[        R                  US5      $ )Nrš  Ú?)r¯  r   ÚPROC_STATUSESrÌ   )r_  Úletters     rF   rš  ÚProcess.status¨  s3   € à×&Ñ&Ó(¨Ñ2ˆØ—‘“ˆä× Ñ  ¨Ó-Ð-rE   c                 ó6  • / n[         R                  " U R                   SU R                   S35      nSnU GH  nU R                   SU R                   SU 3n [	        U5      nUR                  S5      (       aÚ  [        U5      (       aÇ  U R                   SU R                   SU 3n [        U5       n[        UR                  5       R                  5       S   5      n[        UR                  5       R                  5       S   S5      n	S S S 5        [        W	5      n
[        U[        U5      [        W5      X©5      nUR                  U5        GM  GM  GM!     U(       a  U R+                  5         U$ ! , (       d  f       Nn= f! [        [        4 a    Sn GMc  f = f! [        [        4 a    Sn GM}  [          a[  nUR"                  ["        R$                  :X  a   S nAGM«  UR"                  ["        R&                  :X  a  [)        U5         S nAGMÛ  e S nAff = f)	Nr©   rc  Frd  z/fdinfo/r   r¶   T)r™   rg  r^  rm  rš   rÑ   r   r   rÒ   r½   r›   r§   rt   r¿   rh  ri  rÏ   rj  rk  rl  r   rœ  )r_  r*  rù  r$  rv   r”  ru   rÁ   Úposry   rx   r0  rÚ   s                rF   Ú
open_filesÚProcess.open_files¯  sÍ  € àˆÜ—
’
˜d×/Ñ/Ð0°°$·(±(°¸3Ð?Ó@ˆØˆ
ÜˆBØ×'Ñ'Ð(¨¨$¯(©(¨°4¸°tÐ<ˆDð$/Ü “~�ð& —?‘? 3×'Ñ'¬M¸$×,?Ñ,?à"×/Ñ/Ð0°°$·(±(°¸8ÀBÀ4ÐH�Dð/Ü(¨Ô.°!Ü"% a§j¡j£l×&8Ñ&8Ó&:¸1Ñ&=Ó">˜CÜ$'¨¯
©
«×(:Ñ(:Ó(<¸QÑ(?ÀÓ$C˜E÷ /ô  2°%Ó8˜Ü!*Ø ¤# b£'¬3¨s«8°Tó"˜ð  Ÿ™ v×.ò! -@Ò'ñ- öN Ø×$Ñ$Ô&Øˆ÷ /Õ.ûô .Ô/AÐBó *ð &*œ
ð*ûô3 &Ô'9Ð:ó à!�
ÛÜó Ø—9‘9¤§¡Ó,æØ—9‘9¤× 2Ñ 2Ó2ä˜#”JÞØûðúsU   ÁFÂ*FÂ5AE3ÄFÅ3
F	Å=FÆFÆFÆHÆ4	HÆ=HÇ")HÈHÈHc                 ód   • [         R                  XR                  5      nU R                  5         U$ rs  )r±  r¬  rm  rœ  )r_  r¨  r>  s      rF   r²  ÚProcess.net_connectionsß  s'   € ä×'Ñ'¨¯h©hÓ7ˆØ× Ñ Ô"Øˆ
rE   c                 ót   • [        [        R                  " U R                   SU R                   S35      5      $ )Nr©   rc  )r¾   r™   rg  r^  rm  r™  s    rF   Únum_fdsÚProcess.num_fdså  s.   € ä”2—:’: ×!2Ñ!2Ð 3°1°T·X±X°J¸cÐBÓCÓDÐDrE   c                 ó:   • [        U R                  5       S   5      $ )Nr�  rÚ  r™  s    rF   r�  ÚProcess.ppidé  s   € ä�4×(Ñ(Ó*¨6Ñ2Ó3Ð3rE   s   Uid:\t(\d+)\t(\d+)\t(\d+)c                 ó¶   • U R                  5       nUR                  U5      S   u  p4n[        R                  " [	        U5      [	        U5      [	        U5      5      $ r  )r³  rö  r   ÚpuidsrÒ   )r_  Ú_uids_rer  ÚrealÚ	effectiveÚsaveds         rF   ÚuidsÚProcess.uidsí  óI   € à×%Ñ%Ó'ˆØ!)×!1Ñ!1°$Ó!7¸Ñ!:Ñˆ˜Ü�}Š}œS ›Y¬¨I«¼¸E»
ÓCÐCrE   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                 ó¶   • U R                  5       nUR                  U5      S   u  p4n[        R                  " [	        U5      [	        U5      [	        U5      5      $ r  )r³  rö  r   ÚpgidsrÒ   )r_  Ú_gids_rer  rd  re  rf  s         rF   ÚgidsÚProcess.gidsó  ri  rE   )r…  r‘  r^  rm  rs  ©rT  )@r@   rA   rB   rC   r®  r  r`  r–  r†  rœ  r�  r   r¯  r³  r¶  rº  r¾  r­   rÄ  rÈ  rË  rÐ  r™   ru   r�  ÚgetpidrÕ  r  r«  rß  r©  rî  rþ  ÚHAS_PROC_SMAPSró  r  r  rû  r   r  r  r  r  r'  r+  r/  ÚHAS_CPU_AFFINITYr2  r7  r?  ÚHAS_PROC_IO_PRIORITYrD  rH  ÚhasattrrK  rO  rš  rX  r²  r]  r�  rg  rm  rD   r?   rE   rF   r�  r�  €  sÊ  † Ù'âC€Iò.ò"ò Bò3ð Øñ#ó ó ð#ðJ Øñó ó ðð Øñ$ó ó ð$ò3ò
5ð
 ñ7ó ð7ð ñ
ó ð
ð ñó ðð2 ñ)ó ð)ð
 ñó ðð 
‡w�w‡~�~˜˜rŸyšy›{˜m¨3Ð/×0Ñ0à	ñ 	0ó 
ð 	0ðD ñOó ðOð ñ7ó ð7ð ó@ó ð@ð ñ*ó ð*ð ñ>ó ð>ö$ ¦ò	$ð. 
ð Ÿ
š
Ð#;Ó<Ø—J’JÐ2Ó3Ø—Z’ZÐ 4Ó5ó	$ó 
ð	$ð8 
ñ		;ó 
ñ		;ð 'Ðæà	ñE	ó 
ðE	ðN ñ?ó ð?ð àŸ
š
Ð#<Ó=ó<ó ð<ð Ø*,¯*ª*Ð5HÓ*Ió 5ó ð5ð
 ñó ðð4 ñ0ó ð0ð ñ7ó ð7ö à	ñ	8ó 
ð	8ð —j’jÐ!DÓEô		9ð 
ñ	ó 
ð	ö. à	ñ	3ó 
ð	3ð
 
ñ	Bó 
ð	Bñ ˆx˜×#Ñ#à	ó	ó 
ð	ð6 ñ.ó ð.ð ñ-ó ð-ð^ óó ðð
 ñEó ðEð ñ4ó ð4ð ØŸJšJÐ'DÓEó Dó ðDð
 ØŸJšJÐ'DÓEó Dó óDrE   r�  ro  )F)”r®  r€  r<  Úenumrj  r‹  r  r™   r  rK  rW  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__rt  r=  ÚdirrÑ   Úisupperr_  ru   r�  rp  rq  rþ  rs  rr  r	  r   ÚgetpagesizerÓ   rw  Ú	byteorderr~  rü  ÚIntEnumrÒ   Ú	AF_PACKETr8   r9   r;   Úglobalsru  Ú__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_PARKEDrS  r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r’  r^   rj   rt   rz   rþ   r{   r   rê   rˆ   rŠ   r�   rš   r§   r¯   rÅ   Ú	ExceptionrÚ   r¼   rß   rð   rü   r  r  r  r"  r)  r,  rE  Únet_if_addrsrH  rJ  r±  r²  rË  rà  Ú
disk_usagerÿ  r  r%  rN  rQ  rl  rn  rx  rt  r{  r‚  r�  r�  r0  s   0rF   Ú<module>rŽ     sõ  ðñ
 %ó Û Û Û Û Û Û 	Û 	Û Û Û Û 
Û Ý #Ý "å Ý Ý #Ý )Ý Ý $Ý $Ý 'Ý !Ý "Ý "Ý Ý Ý Ý Ý $Ý "Ý Ý +Ý  Ý Ý (Ý 'Ý "Ý "ò	€ñ ˆ8�Y×ÑØ×ÑÙ˜”IÓF’Iˆq§¡¨f×!5‹¸!¿)¹)¿+�‘IÑFôð .Ð Ø—‘—‘ &¨¯ª«¨°VÐ <Ó=€ØŸ™Ÿ™¨°·	²	³¨}¸MÐ'JÓKÐ Ù˜tÐ%6Ó7Ð Ù˜4Ð!8Ó9Ð ð �jŠj˜Ó&€Ø×!Ò!Ó#€Ø€	Ø—‘ Ñ)€ð Ð à—’Ø�i¡ V×%5Ñ%5Ó!6Ð7ó€ð ×
Ñ
€ô�—‘ô ñ ƒ	× Ñ �×'Ñ'Ô (ð 
×	Ñ	Ø	×	 Ñ	 Ø	×	"Ñ	"Ø	×	Ñ	Ø	×	$Ñ	$Ø	×	Ñ	Ø	×	Ñ	Ø	×	Ñ	Ø	×	!Ñ	!Ø	×	Ñ	Ø	×	Ñ	Ø	×	Ñ	ñ€ð" ×
"Ñ
"Ø
×
Ñ
Ø
×
Ñ
Ø
×
 Ñ
 Ø
×
 Ñ
 Ø
×
 Ñ
 Ø
×
Ñ
Ø
×
!Ñ
!Ø
×
Ñ
Ø
×
Ñ
Ø
×
Ñ
ñ€ñ, 	Øò Kó	L€ñ Øò ó€ñ ØÒ<ó>€	ñ �&Ð>Ó?€á�j $§,¡,Ð1GÑ"GÓH€áØòJóK€ñ
 Ø� §¡¨-×*?Ñ*?Ó!@Ñ@óB€	ñ �ò 6ó 7€ñ �{ò"ó#€	òò(
ò$ð& 	ñ0ó 	ð0ð0KÙ˜Ô!ò<ò~BòJ4@òxò ò(ò:'òTò2
ð ‡7�7‡>�>Ð;×<Ñ<ÀÇÁÇÁØ*÷Añ Aó#òNPð ×&Ñ&€ô	˜Iô 	÷kñ kñ\ "Ó#Ð ô+ò
,ò^ðB × Ò €
ôf÷RHñ HôV$òXsòlò>W>ò~ò ò&=ò!òBò,÷6w	Dò w	Dùò1 	Gøðj ó Ká	Ð*¨3©'Ð
2Ô3Ù˜;Ð(:Ô;¸CÀÀcÓJ†IûðKús*   Ä SÄSÄ4SÏ(S ÓS?ÓS:Ó:S?