����JFIFXX�����    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222����"��4�� ���,�PG"Z_�4�˷����kjز�Z�,F+��_z�,�© �����zh6�٨�ic�fu���#ډb���_�N�?��wQ���5-�~�I���8����TK<5o�Iv-�����k�_U_�����~b�M��d����Ӝ�U�Hh��?]��E�w��Q���k�{��_}qFW7HTՑ��Y��F�?_�'ϔ��_�Ջt��=||I ��6�έ"�����D���/[�k�9���Y�8ds|\���Ҿp6�Ҵ���]��.����6�z<�v��@]�i%��$j��~�g��J>��no����pM[me�i$[����s�o�ᘨ�˸ nɜG-�ĨU�ycP�3.DB�li�;��hj���x7Z^�N�h������N3u{�:j�x�힞��#M&��jL P@_���� P��&��o8������9�����@Sz6�t7#O�ߋ �s}Yf�T���lmr����Z)'N��k�۞p����w\�Tȯ?�8`�O��i{wﭹW�[�r�� ��Q4F�׊���3m&L�=��h3����z~��#�\�l :�F,j@�� ʱ�wQT����8�"kJO���6�֚l����}���R�>ډK���]��y����&����p�}b��;N�1�m�r$�|��7�>e�@B�TM*-iH��g�D�)� E�m�|�ؘbҗ�a��Ҿ����t4���o���G��*oCN�rP���Q��@z,|?W[0�����:�n,jWiE��W��$~/�hp\��?��{(�0���+�Y8rΟ�+����>S-S����VN;�}�s?.����� w�9��˟<���Mq4�Wv'��{)0�1mB��V����W[�����8�/<� �%���wT^�5���b��)iM� pg�N�&ݝ��VO~�q���u���9� ����!��J27����$O-���! �:�%H��� ـ����y�ΠM=t{!S�� oK8������t<����è:a������[�����ա�H���~��w��Qz`�po�^ ����Q��n� �,uu�C�$ ^���,������8�#��:�6��e�|~���!�3�3.�\0��q��o�4`.|� ����y�Q�`~;�d�ׯ,��O�Zw�������`73�v�܋�<���Ȏ�� ـ4k��5�K�a�u�=9Yd��$>x�A�&�� j0� ���vF��� Y�|�y��� ~�6�@c��1vOp�Ig����4��l�OD���L����� R���c���j�_�uX6��3?nk��Wy�f;^*B� ��@�~a�`��Eu������+���6�L��.ü>��}y���}_�O�6�͐�:�YrG�X��kG�����l^w���~㒶sy��Iu�!� W ��X��N�7BV��O��!X�2����wvG�R�f�T#�����t�/?���%8�^�W�aT��G�cL�M���I��(J����1~�8�?aT ���]����AS�E��(��*E}� 2��#I/�׍qz��^t�̔���b�Yz4x���t�){ OH��+(E��A&�N�������XT��o��"�XC��'���)}�J�z�p� ��~5�}�^����+�6����w��c��Q�|Lp�d�H��}�(�.|����k��c4^�"�����Z?ȕ ��a<�L�!039C� �Eu�C�F�Ew�ç ;�n?�*o���B�8�bʝ���'#Rqf���M}7����]����s2tcS{�\icTx;�\��7K���P���ʇ Z O-��~��c>"��?�������P��E��O�8��@�8��G��Q�g�a�Վ���󁶠�䧘��_%#r�>�1�z�a��eb��qcPѵ��n���#L��� =��׀t� L�7�`��V���A{�C:�g���e@�w1 Xp3�c3�ġ����p��M"'-�@n4���fG��B3�DJ�8[Jo�ߐ���gK)ƛ��$���� ���8�3�����+���� �����6�ʻ���� ���S�kI�*KZlT _`���?��K����QK�d����B`�s}�>���`��*�>��,*@J�d�oF*����弝��O}�k��s��]��y�ߘ��c1G�V���<=�7��7����6�q�PT��tXԀ�!9*4�4Tހ3XΛex�46���Y��D ����� �BdemDa����\�_l,��G�/���֌7���Y�](�xTt^%�GE�����4�}bT���ڹ�����;Y)���B�Q��u��>J/J �⮶.�XԄ��j�ݳ�+E��d ��r�5�_D�1 ��o�� �B�x�΢�#���<��W�����8���R6�@g�M�.��� dr�D��>(otU��@x=��~v���2� ӣ�d�oBd��3�eO�6�㣷�����ݜ6��6Y��Qz`��S��{���\P�~z m5{J/L��1������<�e�ͅPu�b�]�ϔ���'������f�b� Zpw��c`"��i���BD@:)ִ�:�]��hv�E�w���T�l��P���"Ju�}��وV J��G6��. J/�Qgl߭�e�����@�z�Zev2u�)]կ�����7x���s�M�-<ɯ�c��r�v�����@��$�ޮ}lk���a���'����>x��O\�ZFu>�����ck#��&:��`�$�ai�>2Δ����l���oF[h��lE�ܺ�Πk:)���`�� $[6�����9�����kOw�\|���8}������ބ:��񶐕��I�A1/�=�2[�,�!��.}gN#�u����b��� ~��݊��}34q����d�E��Lc��$��"�[q�U�硬g^��%B �z���r�pJ�ru%v\h1Y�ne`ǥ:g���pQM~�^�Xi� ��`S�:V29.�P���V�?B�k�� AEvw%�_�9C�Q����wKekPؠ�\�;Io d�{ ߞo�c1eP����\� `����E=���@K<�Y���eڼ�J���w����{av�F�'�M�@/J��+9p���|]�����Iw &`��8���&M�hg��[�{��Xj��%��Ӓ�$��(����ʹN���<>�I���RY���K2�NPlL�ɀ)��&e����B+ь����( � �JTx���_?EZ� }@ 6�U���뙢ط�z��dWI�n` D����噥�[��uV��"�G&Ú����2g�}&m��?ċ�"����Om#��������� ��{�ON��"S�X��Ne��ysQ���@Fn��Vg���dX�~nj�]J�<�K]:��FW��b�������62�=��5f����JKw��bf�X�55��~J �%^����:�-�QIE��P��v�nZum� z � ~ə ���� ���ة����;�f��\v���g�8�1��f24;�V���ǔ�)����9���1\��c��v�/'Ƞ�w�������$�4�R-��t���� e�6�/�ġ �̕Ecy�J���u�B���<�W�ַ~�w[B1L۲�-JS΂�{���΃������A��20�c#��@ 0!1@AP"#2Q`$3V�%45a6�FRUq��� ����^7ׅ,$n�������+��F�`��2X'��0vM��p�L=������5��8������u�p~���.�`r�����\���O��,ư�0oS ��_�M�����l���4�kv\JSd���x���SW�<��Ae�IX����������$I���w�:S���y���›R��9�Q[���,�5�;�@]�%���u�@ *ro�lbI �� ��+���%m:�͇ZV�����u�̉����θau<�fc�.����{�4Ա� �Q����*�Sm��8\ujqs]{kN���)qO�y�_*dJ�b�7���yQqI&9�ԌK!�M}�R�;������S�T���1���i[U�ɵz�]��U)V�S6���3$K{�ߊ<�(� E]Զ[ǼENg�����'�\?#)Dkf��J���o��v���'�%ƞ�&K�u�!��b�35LX�Ϸ��63$K�a�;�9>,R��W��3�3� d�JeTYE.Mϧ��-�o�j3+y��y^�c�������VO�9NV\nd�1 ��!͕_)a�v;����թ�M�lWR1��)El��P;��yوÏ�u 3�k�5Pr6<�⒲l�!˞*��u־�n�!�l:����UNW ��%��Chx8vL'��X�@��*��)���̮��ˍ��� ���D-M�+J�U�kvK����+�x8��cY������?�Ԡ��~3mo��|�u@[XeY�C�\Kp�x8�oC�C�&����N�~3-H���� ��MX�s�u<`���~"WL��$8ξ��3���a�)|:@�m�\���^�`�@ҷ)�5p+��6���p�%i)P M���ngc�����#0Aruz���RL+xSS?���ʮ}()#�t��mˇ!��0}}y����<�e� �-ή�Ԩ��X������ MF���ԙ~l L.3���}�V뽺�v�����멬��Nl�)�2����^�Iq��a��M��qG��T�����c3#������3U�Ǎ���}��לS�|qa��ڃ�+���-��2�f����/��bz��ڐ�� �ݼ[2�ç����k�X�2�* �Z�d���J�G����M*9W���s{��w���T��x��y,�in�O�v��]���n����P�$�JB@=4�OTI�n��e�22a\����q�d���%�$��(���:���: /*�K[PR�fr\nڙdN���F�n�$�4�[�� U�zƶ����� �mʋ���,�ao�u 3�z� �x��Kn����\[��VFmbE;�_U��&V�Gg�]L�۪&#n%�$ɯ�dG���D�TI=�%+AB�Ru#��b4�1�»x�cs�YzڙJG��f��Il��d�eF'T� iA��T���uC�$����Y��H?����[!G`}���ͪ� �纤Hv\������j�Ex�K���!���OiƸ�Yj�+u-<���'q����uN�*�r\��+�]���<�wOZ.fp�ێ��,-*)V?j-kÊ#�`�r��dV����(�ݽBk�����G�ƛk�QmUڗe��Z���f}|����8�8��a���i��3'J�����~G_�^���d�8w������ R�`(�~�.��u���l�s+g�bv���W���lGc}��u���afE~1�Ue������Z�0�8�=e�� f@/�jqEKQQ�J��oN��J���W5~M>$6�Lt�;$ʳ{���^��6�{����v6���ķܰg�V�cnn �~z�x�«�,2�u�?cE+Ș�H؎�%�Za�)���X>uW�Tz�Nyo����s���FQƤ��$��*�&�LLXL)�1�" L��eO��ɟ�9=���:t��Z���c��Ž���Y?�ӭV�wv�~,Y��r�ۗ�|�y��GaF�����C�����.�+� ���v1���fήJ�����]�S��T��B��n5sW}y�$��~z�'�c ��8 ��� ,! �p��VN�S��N�N�q��y8z˱�A��4��*��'������2n<�s���^ǧ˭P�Jޮɏ�U�G�L�J�*#��<�V��t7�8����TĜ>��i}K%,���)[��z�21z ?�N�i�n1?T�I�R#��m-�����������������1����lA�`��fT5+��ܐ�c�q՝��ʐ��,���3�f2U�եmab��#ŠdQ�y>\��)�SLY����w#��.���ʑ�f��� ,"+�w�~�N�'�c�O�3F�������N<���)j��&��,-� �љ���֊�_�zS���TǦ����w�>��?�������n��U仆�V���e�����0���$�C�d���rP �m�׈e�Xm�Vu� �L��.�bֹ��� �[Դaզ���*��\y�8�Է:�Ez\�0�Kq�C b��̘��cө���Q��=0Y��s�N��S.���3.���O�o:���#���v7�[#߫ ��5�܎�L���Er4���9n��COWlG�^��0k�%<���ZB���aB_���������'=��{i�v�l�$�uC���mƎҝ{�c㱼�y]���W�i ��ߧc��m�H� m�"�"�����;Y�ߝ�Z�Ǔ�����:S#��|}�y�,/k�Ld� TA�(�AI$+I3��;Y*���Z��}|��ӧO��d�v��..#:n��f>�>���ȶI�TX��� 8��y����"d�R�|�)0���=���n4��6ⲑ�+��r<�O�܂~zh�z����7ܓ�HH�Ga롏���nCo�>������a ���~]���R���̲c?�6(�q�;5%� |�uj�~z8R=X��I�V=�|{v�Gj\gc��q����z�؋%M�ߍ����1y��#��@f^���^�>N�����#x#۹��6�Y~�?�dfPO��{��P�4��V��u1E1J �*|���%���JN��`eWu�zk M6���q t[�� ��g�G���v��WIG��u_ft����5�j�"�Y�:T��ɐ���*�;� e5���4����q$C��2d�}���� _S�L#m�Yp��O�.�C�;��c����Hi#֩%+) �Ӎ��ƲV���SYź��g |���tj��3�8���r|���V��1#;.SQ�A[���S������#���`n�+���$��$I �P\[�@�s��(�ED�z���P��])8�G#��0B��[ى��X�II�q<��9�~[Z멜�Z�⊔IWU&A>�P~�#��dp<�?����7���c��'~���5 ��+$���lx@�M�dm��n<=e�dyX��?{�|Aef ,|n3�<~z�ƃ�uۧ�����P��Y,�ӥQ�*g�#먙R�\���;T��i,��[9Qi歉����c>]9�� ��"�c��P�� �Md?٥��If�ت�u��k��/����F��9�c*9��Ǎ:�ØF���z�n*�@|I�ށ9����N3{'��[�'ͬ�Ҳ4��#}��!�V� Fu��,�,mTIk���v C�7v���B�6k�T9��1�*l� '~��ƞF��lU��'�M ����][ΩũJ_�{�i�I�n��$���L�� j��O�dx�����kza۪��#�E��Cl����x˘�o�����V���ɞ�ljr��)�/,�߬h�L��#��^��L�ф�,íMƁe�̩�NB�L�����iL����q�}��(��q��6IçJ$�W�E$��:������=#����(�K�B����zђ <��K(�N�۫K�w��^O{!����)�H���>x�������lx�?>Պ�+�>�W���,Ly!_�D���Ō�l���Q�!�[ �S����J��1��Ɛ�Y}��b,+�Lo�x�ɓ)����=�y�oh�@�꥟/��I��ѭ=��P�y9��� �ۍYӘ�e+�p�Jnϱ?V\SO%�(�t� ���=?MR�[Ș�����d�/ ��n�l��B�7j� ��!�;ӥ�/�[-���A�>�dN�sLj ��,ɪv��=1c�.SQ�O3�U���ƀ�ܽ�E����������̻��9G�ϷD�7(�}��Ävӌ\�y�_0[w ���<΍>����a_��[0+�L��F.�޺��f�>oN�T����q;���y\��bՃ��y�jH�<|q-eɏ�_?_9+P���Hp$�����[ux�K w�Mw��N�ی'$Y2�=��q���KB��P��~������Yul:�[<����F1�2�O���5=d����]Y�sw:���Ϯ���E��j,_Q��X��z`H1,#II ��d�wr��P˂@�ZJV����y$�\y�{}��^~���[:N����ߌ�U�������O��d�����ؾe��${p>G��3c���Ė�lʌ�� ת��[��`ϱ�-W����dg�I��ig2��� ��}s ��ؤ(%#sS@���~���3�X�nRG�~\jc3�v��ӍL��M[JB�T��s3}��j�Nʖ��W����;7��ç?=X�F=-�=����q�ߚ���#���='�c��7���ڑW�I(O+=:uxq�������������e2�zi+�kuG�R��������0�&e�n���iT^J����~\jy���p'dtG��s����O��3����9* �b#Ɋ�� p������[Bws�T�>d4�ۧs���nv�n���U���_�~,�v����ƜJ1��s�� �QIz��)�(lv8M���U=�;����56��G���s#�K���MP�=��LvyGd��}�VwWBF�'�à �?MH�U�g2�� ����!�p�7Q��j��ڴ����=��j�u��� Jn�A s���uM������e��Ɔ�Ҕ�!)'��8Ϣ�ٔ��ޝ(��Vp���צ֖d=�IC�J�Ǡ{q������kԭ�߸���i��@K����u�|�p=..�*+����x�����z[Aqġ#s2a�Ɗ���RR�)*HRsi�~�a &f��M��P����-K�L@��Z��Xy�'x�{}��Zm+���:�)�) IJ�-i�u���� ���ܒH��'�L(7�y�GӜq���� j��� 6ߌg1�g�o���,kر���tY�?W,���p���e���f�OQS��!K�۟cҒA�|ս�j�>��=⬒��˧L[�� �߿2JaB~R��u�:��Q�] �0H~���]�7��Ƽ�I���(}��cq '�ήET���q�?f�ab���ӥvr� �)o��-Q��_'����ᴎo��K������;��V���o��%���~OK ����*��b�f:���-ťIR��`B�5!RB@���ï�� �u �̯e\�_U�_������� g�ES��3�������QT��a����x����U<~�c?�*�#]�MW,[8O�a�x��]�1bC|踤�P��lw5V%�)�{t�<��d��5���0i�XSU��m:��Z�┵�i�"��1�^B�-��P�hJ��&)O��*�D��c�W��vM��)����}���P��ܗ-q����\mmζZ-l@�}��a��E�6��F�@��&Sg@���ݚ�M����� ȹ 4����#p�\H����dYDo�H���"��\��..R�B�H�z_�/5˘����6��KhJR��P�mƶi�m���3�,#c�co��q�a)*Pt����R�m�k�7x�D�E�\Y�閣_X�<���~�)���c[[�BP����6�Yq���S��0����%_����;��Àv�~�| VS؇ ��'O0��F0��\���U�-�d@�����7�SJ*z��3n��y��P����O���������m�~�P�3|Y��ʉr#�C�<�G~�.,! ���bqx���h~0=��!ǫ�jy����l�O,�[B��~��|9��ٱ����Xly�#�i�B��g%�S��������tˋ���e���ې��\[d�t)��.+u�|1 ������#�~Oj����hS�%��i.�~X���I�H�m��0n���c�1uE�q��cF�RF�o���7� �O�ꮧ� ���ۛ{��ʛi5�rw?׌#Qn�TW��~?y$��m\�\o����%W� ?=>S�N@�� �Ʈ���R����N�)�r"C�:��:����� �����#��qb��Y�. �6[��2K����2u�Ǧ�HYR��Q�MV��� �G�$��Q+.>�����nNH��q�^��� ����q��mM��V��D�+�-�#*�U�̒ ���p욳��u:�������IB���m���PV@O���r[b= �� ��1U�E��_Nm�yKbN�O���U�}�the�`�|6֮P>�\2�P�V���I�D�i�P�O;�9�r�mAHG�W�S]��J*�_�G��+kP�2����Ka�Z���H�'K�x�W�MZ%�O�YD�Rc+o��?�q��Ghm��d�S�oh�\�D�|:W������UA�Qc yT�q������~^�H��/��#p�CZ���T�I�1�ӏT����4��"�ČZ�����}��`w�#�*,ʹ�� ��0�i��課�Om�*�da��^gJ݅{���l�e9uF#T�ֲ��̲�ٞC"�q���ߍ ոޑ�o#�XZTp����@ o�8��(jd��xw�]�,f���`~�|,s��^����f�1���t��|��m�򸄭/ctr��5s��7�9Q�4�H1꠲BB@l9@���C�����+�wp�xu�£Yc�9��?`@#�o�mH�s2��)�=��2�.�l����jg�9$�Y�S�%*L������R�Y������7Z���,*=�䷘$�������arm�o�ϰ���UW.|�r�uf����IGw�t����Zwo��~5 ��YյhO+=8fF�)�W�7�L9lM�̘·Y���֘YLf�큹�pRF���99.A �"wz��=E\Z���'a� 2��Ǚ�#;�'}�G���*��l��^"q��+2FQ� hj��kŦ��${���ޮ-�T�٭cf�|�3#~�RJ����t��$b�(R��(����r���dx� >U b�&9,>���%E\� Ά�e�$��'�q't��*�א���ެ�b��-|d���SB�O�O��$�R+�H�)�܎�K��1m`;�J�2�Y~9��O�g8=vqD`K[�F)k�[���1m޼c��n���]s�k�z$@��)!I �x՝"v��9=�ZA=`Ɠi �:�E��)`7��vI��}d�YI�_ �o�:ob���o ���3Q��&D&�2=�� �Ά��;>�h����y.*ⅥS������Ӭ�+q&����j|UƧ����}���J0��WW< ۋS�)jQR�j���Ư��rN)�Gű�4Ѷ(�S)Ǣ�8��i��W52���No˓� ۍ%�5brOn�L�;�n��\G����=�^U�dI���8$�&���h��'���+�(������cȁ߫k�l��S^���cƗjԌE�ꭔ��gF���Ȓ��@���}O���*;e�v�WV���YJ\�]X'5��ղ�k�F��b 6R�o՜m��i N�i����>J����?��lPm�U��}>_Z&�KK��q�r��I�D�Չ~�q�3fL�:S�e>���E���-G���{L�6p�e,8��������QI��h��a�Xa��U�A'���ʂ���s�+טIjP�-��y�8ۈZ?J$��W�P� ��R�s�]��|�l(�ԓ��sƊi��o(��S0��Y� 8�T97.�����WiL��c�~�dxc�E|�2!�X�K�Ƙਫ਼�$((�6�~|d9u+�qd�^3�89��Y�6L�.I�����?���iI�q���9�)O/뚅����O���X��X�V��ZF[�یgQ�L��K1���RҖr@v�#��X�l��F���Нy�S�8�7�kF!A��sM���^rkp�jP�DyS$N���q��nxҍ!U�f�!eh�i�2�m���`�Y�I�9r�6� �TF���C}/�y�^���Η���5d�'��9A-��J��>{�_l+�`��A���[�'��յ�ϛ#w:݅�%��X�}�&�PSt�Q�"�-��\縵�/����$Ɨh�Xb�*�y��BS����;W�ջ_mc�����vt?2}1�;qS�d�d~u:2k5�2�R�~�z+|HE!)�Ǟl��7`��0�<�,�2*���Hl-��x�^����'_TV�gZA�'j� ^�2Ϊ��N7t�����?w�� �x1��f��Iz�C-Ȗ��K�^q�;���-W�DvT�7��8�Z�������� hK�(P:��Q- �8�n�Z���܃e貾�<�1�YT<�,�����"�6{/ �?�͟��|1�:�#g��W�>$����d��J��d�B��=��jf[��%rE^��il:��B���x���Sּ�1հ��,�=��*�7 fcG��#q� �eh?��2�7�����,�!7x��6�n�LC�4x��},Geǝ�tC.��vS �F�43��zz\��;QYC,6����~;RYS/6���|2���5���v��T��i����������mlv��������&� �nRh^ejR�LG�f���? �ۉҬܦƩ��|��Ȱ����>3����!v��i�ʯ�>�v��オ�X3e���_1z�Kȗ\<������!�8���V��]��?b�k41�Re��T�q��mz��TiOʦ�Z��Xq���L������q"+���2ۨ��8}�&N7XU7Ap�d�X��~�׿��&4e�o�F��� �H����O���č�c�� 懴�6���͉��+)��v;j��ݷ�� �UV�� i��� j���Y9GdÒJ1��詞�����V?h��l����l�cGs�ځ�������y�Ac�����\V3�? �� ܙg�>qH�S,�E�W�[�㺨�uch�⍸�O�}���a��>�q�6�n6����N6�q������N ! 1AQaq�0@����"2BRb�#Pr���3C`��Scst���$4D���%Td�� ?���N����a��3��m���C���w��������xA�m�q�m���m������$����4n淿t'��C"w��zU=D�\R+w�p+Y�T�&�պ@��ƃ��3ޯ?�Aﶂ��aŘ���@-�����Q�=���9D��ռ�ѻ@��M�V��P��܅�G5�f�Y<�u=,EC)�<�Fy'�"�&�չ�X~f��l�KԆV��?�� �W�N����=(� �;���{�r����ٌ�Y���h{�١������jW����P���Tc�����X�K�r��}���w�R��%��?���E��m�� �Y�q|����\lEE4���r���}�lsI�Y������f�$�=�d�yO����p�����yBj8jU�o�/�S��?�U��*������ˍ�0������u�q�m [�?f����a�� )Q�>����6#������� ?����0UQ����,IX���(6ڵ[�DI�MNލ�c&���υ�j\��X�R|,4��� j������T�hA�e��^���d���b<����n�� �즇�=!���3�^�`j�h�ȓr��jẕ�c�,ٞX����-����a�ﶔ���#�$��]w�O��Ӫ�1y%��L�Y<�wg#�ǝ�̗`�x�xa�t�w��»1���o7o5��>�m뭛C���Uƃߜ}�C���y1Xνm�F8�jI���]����H���ۺиE@I�i;r�8ӭ����V�F�Շ| ��&?�3|x�B�MuS�Ge�=Ӕ�#BE5G�����Y!z��_e��q�р/W>|-�Ci߇�t�1ޯќd�R3�u��g�=0 5��[?�#͏��q�cf���H��{ ?u�=?�?ǯ���}Z��z���hmΔ�BFTW�����<�q�(v� ��!��z���iW]*�J�V�z��gX֧A�q�&��/w���u�gYӘa���; �i=����g:��?2�dž6�ى�k�4�>�Pxs����}������G�9��3 ���)gG�R<>r h�$��'nc�h�P��Bj��J�ҧH� -��N1���N��?��~��}-q!=��_2hc�M��l�vY%UE�@|�v����M2�.Y[|y�"Eï��K�ZF,�ɯ?,q�?v�M 80jx�"�;�9vk�����+ ֧�� �ȺU��?�%�vcV��mA�6��Qg^M����A}�3�nl� QRN�l8�kkn�'�����(��M�7m9و�q���%ޟ���*h$Zk"��$�9��: �?U8�Sl��,,|ɒ��xH(ѷ����Gn�/Q�4�P��G�%��Ա8�N��!� �&�7�;���eKM7�4��9R/%����l�c>�x;������>��C�:�����t��h?aKX�bhe�ᜋ^�$�Iհ �hr7%F$�E��Fd���t��5���+�(M6�t����Ü�UU|zW�=a�Ts�Tg������dqP�Q����b'�m���1{|Y����X�N��b �P~��F^F:����k6�"�j!�� �I�r�`��1&�-$�Bevk:y���#yw��I0��x��=D�4��tU���P�ZH��ڠ底taP��6����b>�xa����Q�#� WeF��ŮNj�p�J* mQ�N����*I�-*�ȩ�F�g�3 �5��V�ʊ�ɮ�a��5F���O@{���NX��?����H�]3��1�Ri_u��������ѕ�� ����0��� F��~��:60�p�͈�S��qX#a�5>���`�o&+�<2�D����: �������ڝ�$�nP���*)�N�|y�Ej�F�5ټ�e���ihy�Z �>���k�bH�a�v��h�-#���!�Po=@k̆IEN��@��}Ll?j�O������߭�ʞ���Q|A07x���wt!xf���I2?Z��<ץ�T���cU�j��]��陎Ltl �}5�ϓ��$�,��O�mˊ�;�@O��jE��j(�ا,��LX���LO���Ц�90�O �.����a��nA���7������j4 ��W��_ٓ���zW�jcB������y՗+EM�)d���N�g6�y1_x��p�$Lv:��9�"z��p���ʙ$��^��JԼ*�ϭ����o���=x�Lj�6�J��u82�A�H�3$�ٕ@�=Vv�]�'�qEz�;I˼��)��=��ɯ���x �/�W(V���p�����$ �m�������u�����񶤑Oqˎ�T����r��㠚x�sr�GC��byp�G��1ߠ�w e�8�$⿄����/�M{*}��W�]˷.�CK\�ުx���/$�WPw���r� |i���&�}�{�X� �>��$-��l���?-z���g����lΆ���(F���h�vS*���b���߲ڡn,|)mrH[���a�3�ר�[1��3o_�U�3�TC�$��(�=�)0�kgP���� ��u�^=��4 �WYCҸ:��vQ�ר�X�à��tk�m,�t*��^�,�}D*� �"(�I��9R����>`�`��[~Q]�#af��i6l��8���6�:,s�s�N6�j"�A4���IuQ��6E,�GnH��zS�HO�uk�5$�I�4��ؤ�Q9�@��C����wp�BGv[]�u�Ov���0I4���\��y�����Q�Ѹ��~>Z��8�T��a��q�ޣ;z��a���/��S��I:�ܫ_�|������>=Z����8:�S��U�I�J��"IY���8%b8���H��:�QO�6�;7�I�S��J��ҌAά3��>c���E+&jf$eC+�z�;��V����� �r���ʺ������my�e���aQ�f&��6�ND��.:��NT�vm�<- u���ǝ\MvZY�N�NT��-A�>jr!S��n�O 1�3�Ns�%�3D@���`������ܟ 1�^c<���� �a�ɽ�̲�Xë#�w�|y�cW�=�9I*H8�p�^(4���՗�k��arOcW�tO�\�ƍR��8����'�K���I�Q�����?5�>[�}��yU�ײ -h��=��% q�ThG�2�)���"ו3]�!kB��*p�FDl�A���,�eEi�H�f�Ps�����5�H:�Փ~�H�0Dت�D�I����h�F3�������c��2���E��9�H��5�zԑ�ʚ�i�X�=:m�xg�hd(�v����׊�9iS��O��d@0ڽ���:�p�5�h-��t�&���X�q�ӕ,��ie�|���7A�2���O%P��E��htj��Y1��w�Ѓ!����  ���� ࢽ��My�7�\�a�@�ţ�J �4�Ȼ�F�@o�̒?4�wx��)��]�P��~�����u�����5�����7X ��9��^ܩ�U;Iꭆ 5 �������eK2�7(�{|��Y׎ �V��\"���Z�1� Z�����}��(�Ǝ"�1S���_�vE30>���p;� ΝD��%x�W�?W?v����o�^V�i�d��r[��/&>�~`�9Wh��y�;���R��� ;;ɮT��?����r$�g1�K����A��C��c��K��l:�'��3 c�ﳯ*"t8�~l��)���m��+U,z��`(�>yJ�?����h>��]��v��ЍG*�{`��;y]��I�T� ;c��NU�fo¾h���/$���|NS���1�S�"�H��V���T���4��uhǜ�]�v;���5�͠x��'C\�SBpl���h}�N����� A�Bx���%��ޭ�l��/����T��w�ʽ]D�=����K���ž�r㻠l4�S�O?=�k �M:� ��c�C�a�#ha���)�ѐxc�s���gP�iG��{+���x���Q���I= �� z��ԫ+ �8"�k�ñ�j=|����c ��y��CF��/��*9ж�h{ �?4�o� ��k�m�Q�N�x��;�Y��4膚�a�w?�6�>e]�����Q�r�:����g�,i"�����ԩA�*M�<�G��b�if��l^M��5� �Ҩ�{����6J��ZJ�����P�*�����Y���ݛu�_4�9�I8�7���������,^ToR���m4�H��?�N�S�ѕw��/S��甍�@�9H�S�T��t�ƻ���ʒU��*{Xs�@����f�����֒Li�K{H�w^���������Ϥm�tq���s� ���ք��f:��o~s��g�r��ט� �S�ѱC�e]�x���a��) ���(b-$(�j>�7q�B?ӕ�F��hV25r[7 Y� }L�R��}����*sg+��x�r�2�U=�*'WS��ZDW]�WǞ�<��叓���{�$�9Ou4��y�90-�1�'*D`�c�^o?(�9��u���ݐ��'PI&� f�Jݮ�������:wS����jfP1F:X �H�9dԯ���˝[�_54 �}*;@�ܨ�� ð�yn�T���?�ןd�#���4rG�ͨ��H�1�|-#���Mr�S3��G�3�����)�.᧏3v�z֑��r����$G"�`j �1t��x0<Ɔ�Wh6�y�6��,œ�Ga��gA����y��b��)��h�D��ß�_�m��ü �gG;��e�v��ݝ�nQ� ��C����-�*��o���y�a��M��I�>�<���]obD��"�:���G�A��-\%LT�8���c�)��+y76���o�Q�#*{�(F�⽕�y����=���rW�\p���۩�c���A���^e6��K������ʐ�cVf5$�'->���ՉN"���F�"�UQ@�f��Gb~��#�&�M=��8�ט�JNu9��D��[̤�s�o�~������ G��9T�tW^g5y$b��Y'��س�Ǵ�=��U-2 #�MC�t(�i� �lj�@Q 5�̣i�*�O����s�x�K�f��}\��M{E�V�{�υ��Ƈ�����);�H����I��fe�Lȣr�2��>��W�I�Ȃ6������i��k�� �5�YOxȺ����>��Y�f5'��|��H+��98pj�n�.O�y�������jY��~��i�w'������l�;�s�2��Y��:'lg�ꥴ)o#'Sa�a�K��Z� �m��}�`169�n���"���x��I ��*+� }F<��cГ���F�P�������ֹ*�PqX�x۩��,� ��N�� �4<-����%����:��7����W���u�`����� $�?�I��&����o��o��`v�>��P��"��l���4��5'�Z�gE���8���?��[�X�7(��.Q�-��*���ތL@̲����v��.5���[��=�t\+�CNܛ��,g�SQnH����}*F�G16���&:�t��4ُ"A��̣��$�b �|����#rs��a�����T�� ]�<�j��BS�('$�ɻ� �wP;�/�n��?�ݜ��x�F��yUn�~mL*-�������Xf�wd^�a�}��f�,=t�׵i�.2/wpN�Ep8�OР���•��R�FJ� 55TZ��T �ɭ�<��]��/�0�r�@�f��V��V����Nz�G��^���7hZi����k��3�,kN�e|�vg�1{9]_i��X5y7� 8e]�U����'�-2,���e"����]ot�I��Y_��n�(JҼ��1�O ]bXc���Nu�No��pS���Q_���_�?i�~�x h5d'�(qw52] ��'ޤ�q��o1�R!���`ywy�A4u���h<קy���\[~�4�\ X�Wt/� 6�����n�F�a8��f���z �3$�t(���q��q�x��^�XWeN'p<-v�!�{�(>ӽDP7��ո0�y)�e$ٕv�Ih'Q�EA�m*�H��RI��=:��� ���4牢) �%_iN�ݧ�l]� �Nt���G��H�L��� ɱ�g<���1V�,�J~�ٹ�"K��Q�� 9�HS�9�?@��k����r�;we݁�]I�!{ �@�G�[�"��`���J:�n]�{�cA�E����V��ʆ���#��U9�6����j�#Y�m\��q�e4h�B�7��C�������d<�?J����1g:ٳ���=Y���D�p�ц� ׈ǔ��1�]26؜oS�'��9�V�FVu�P�h�9�xc�oq�X��p�o�5��Ա5$�9W�V(�[Ak�aY錎qf;�'�[�|���b�6�Ck��)��#a#a˙��8���=äh�4��2��C��4tm^ �n'c���]GQ$[Wҿ��i���vN�{Fu ��1�gx��1┷���N�m��{j-,��x�� Ūm�ЧS�[�s���Gna���䑴�� x�p 8<������97�Q���ϴ�v�aϚG��Rt�Һ׈�f^\r��WH�JU�7Z���y)�vg=����n��4�_)y��D'y�6�]�c�5̪�\� �PF�k����&�c;��cq�$~T�7j ���nç]�<�g ":�to�t}�159�<�/�8������m�b�K#g'I'.W�����6��I/��>v��\�MN��g���m�A�yQL�4u�Lj�j9��#44�t��l^�}L����n��R��!��t��±]��r��h6ٍ>�yҏ�N��fU�� ���� Fm@�8}�/u��jb9������he:A�y�ծw��GpΧh�5����l}�3p468��)U��d��c����;Us/�֔�YX�1�O2��uq�s��`hwg�r~�{ R��mhN��؎*q 42�*th��>�#���E����#��Hv�O����q�}�����6�e��\�,Wk�#���X��b>��p}�դ��3���T5��†��6��[��@�P�y*n��|'f�֧>�lư΂�̺����SU�'*�q�p�_S�����M�� '��c�6�����m�� ySʨ;M��r���Ƌ�m�Kxo,���Gm�P��A�G�:��i��w�9�}M(�^�V��$ǒ�ѽ�9���|���� �a����J�SQ�a���r�B;����}���ٻ֢�2�%U���c�#�g���N�a�ݕ�'�v�[�OY'��3L�3�;,p�]@�S��{ls��X�'���c�jw�k'a�.��}�}&�� �dP�*�bK=ɍ!����;3n�gΊU�ߴmt�'*{,=SzfD� A��ko~�G�aoq�_mi}#�m�������P�Xhύ����mxǍ�΂���巿zf��Q���c���|kc�����?���W��Y�$���_Lv����l߶��c���`?����l�j�ݲˏ!V��6����U�Ђ(A���4y)H���p�Z_�x��>���e��R��$�/�`^'3qˏ�-&Q�=?��CFVR �D�fV�9��{�8g�������n�h�(P"��6�[�D���< E�����~0<@�`�G�6����Hг�cc�� �c�K.5��D��d�B���`?�XQ��2��ٿyqo&+�1^� DW�0�ꊩ���G�#��Q�nL3��c���������/��x ��1�1[y�x�პCW��C�c�UĨ80�m�e�4.{�m��u���I=��f�����0QRls9���f���������9���~f�����Ǩ��a�"@�8���ȁ�Q����#c�ic������G��$���G���r/$W�(��W���V�"��m�7�[m�A�m����bo��D� j����۳� l���^�k�h׽����� ��#� iXn�v��eT�k�a�^Y�4�BN��ĕ��0 !01@Q"2AaPq3BR������?���@4�Q�����T3,���㺠�W�[=JK�Ϟ���2�r^7��vc�:�9 �E�ߴ�w�S#d���Ix��u��:��Hp��9E!�� V 2;73|F��9Y���*ʬ�F��D����u&���y؟��^EA��A��(ɩ���^��GV:ݜDy�`��Jr29ܾ�㝉��[���E;Fzx��YG��U�e�Y�C���� ����v-tx����I�sם�Ę�q��Eb�+P\ :>�i�C'�;�����k|z�رn�y]�#ǿb��Q��������w�����(�r|ӹs��[�D��2v-%��@;�8<a���[\o[ϧw��I!��*0�krs)�[�J9^��ʜ��p1)� "��/_>��o��<1����A�E�y^�C��`�x1'ܣn�p��s`l���fQ��):�l����b>�Me�jH^?�kl3(�z:���1ŠK&?Q�~�{�ٺ�h�y���/�[��V�|6��}�KbX����mn[-��7�5q�94�������dm���c^���h� X��5��<�eޘ>G���-�}�دB�ޟ� ��|�rt�M��V+�]�c?�-#ڛ��^ǂ}���Lkr���O��u�>�-D�ry� D?:ޞ�U��ǜ�7�V��?瓮�"�#���r��չģVR;�n���/_� ؉v�ݶe5d�b9��/O��009�G���5n�W����JpA�*�r9�>�1��.[t���s�F���nQ� V 77R�]�ɫ8����_0<՜�IF�u(v��4��F�k�3��E)��N:��yڮe��P�`�1}�$WS��J�SQ�N�j�ٺ��޵�#l���ј(�5=��5�lǏmoW�v-�1����v,W�mn��߀$x�<����v�j(����c]��@#��1������Ǔ���o'��u+����;G�#�޸��v-lη��/(`i⣍Pm^���ԯ̾9Z��F��������n��1��� ��]�[��)�'������:�֪�W��FC����� �B9،!?���]��V��A�Վ�M��b�w��G F>_DȬ0¤�#�QR�[V��kz���m�w�"��9ZG�7'[��=�Q����j8R?�zf�\a�=��O�U����*oB�A�|G���2�54 �p��.w7� �� ��&������ξxGHp� B%��$g�����t�Џ򤵍z���HN�u�Я�-�'4��0��;_��3 !01"@AQa2Pq#3BR������?��ʩca��en��^��8���<�u#��m*08r��y�N"�<�Ѳ0��@\�p��� �����Kv�D��J8�Fҽ� �f�Y��-m�ybX�NP����}�!*8t(�OqѢ��Q�wW�K��ZD��Δ^e��!� ��B�K��p~�����e*l}z#9ң�k���q#�Ft�o��S�R����-�w�!�S���Ӥß|M�l޶V��!eˈ�8Y���c�ЮM2��tk���� ������J�fS����Ö*i/2�����n]�k�\���|4yX�8��U�P.���Ы[���l��@"�t�<������5�lF���vU�����W��W��;�b�cД^6[#7@vU�xgZv��F�6��Q,K�v��� �+Ъ��n��Ǣ��Ft���8��0��c�@�!�Zq s�v�t�;#](B��-�nῃ~���3g������5�J�%���O������n�kB�ĺ�.r��+���#�N$?�q�/�s�6��p��a����a��J/��M�8��6�ܰ"�*������ɗud"\w���aT(����[��F��U՛����RT�b���n�*��6���O��SJ�.�ij<�v�MT��R\c��5l�sZB>F��<7�;EA��{��E���Ö��1U/�#��d1�a�n.1ě����0�ʾR�h��|�R��Ao�3�m3 ��%�� ���28Q� ��y��φ���H�To�7�lW>����#i`�q���c����a��� �m,B�-j����݋�'mR1Ήt�>��V��p���s�0IbI�C.���1R�ea�����]H�6����������4B>��o��](��$B���m�����a�!=��?�B� K�Ǿ+�Ծ"�n���K��*��+��[T#�{E�J�S����Q�����s�5�:�U�\wĐ�f�3����܆&�)����I���Ԇw��E T�lrTf6Q|R�h:��[K�� �z��c֧�G�C��%\��_�a�84��HcO�bi��ؖV��7H �)*ģK~Xhչ0��4?�0��� �E<���}3���#���u�?�� ��|g�S�6ꊤ�|�I#Hڛ� �ա��w�X��9��7���Ŀ%�SL��y6č��|�F�a 8���b��$�sק�h���b9RAu7�˨p�Č�_\*w��묦��F ����4D~�f����|(�"m���NK��i�S�>�$d7SlA��/�²����SL��|6N�}���S�˯���g��]6��; �#�.��<���q'Q�1|KQ$�����񛩶"�$r�b:���N8�w@��8$�� �AjfG|~�9F ���Y��ʺ��Bwؒ������M:I岎�G��`s�YV5����6��A �b:�W���G�q%l�����F��H���7�������Fsv7��k�� 403WebShell
403Webshell
Server IP : 213.165.242.4  /  Your IP : 216.73.216.50
Web Server : Apache
System : Linux amsngx344.inmotionhosting.com 4.18.0-553.40.1.lve.el8.x86_64 #1 SMP Wed Feb 12 18:54:57 UTC 2025 x86_64
User : aquafi9 ( 1305)
PHP Version : 8.1.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /opt/support/venv/lib64/python3.13/site-packages/psutil/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /opt/support/venv/lib64/python3.13/site-packages/psutil/__pycache__/_pslinux.cpython-313.pyc
�

�̀i1Q�
�0	�SrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSK
r
SSKJr SSKJr SSKJr SSKJr SSKJr SS	KJr SS
KJr SSKJr SSKJr SS
KJr SSKJr SSKJr SSKJr SSKJr SSKJr SSKJr SSKJ r  SSKJ!r! SSKJ"r" SSKJ#r# SSKJ$r$ SSKJ%r% SSKJ&r& SSKJ'r' SSKJ(r( SSKJ)r) /SQr*Sr+\RXR[S \R\"5S!35r/\RXR[S \R\"5S"35r0\1"\S#5r2\1"\S$5r3\Rh"S%5r5\Rl"5r7\RpS&:Hr9\:"5r;S'r<\Rz"S(S)\>"\
R~505r@\@R�rA"S*S+\Rz5rB\C"5R�\BR�5 \R�\R�\R�\R�\R�\R�\R�\R�\R�\R�\R�\R�S,.rQ\R�\R�\R�\R�\R�\R�\R�\R�\R�\R�\R�S-.r]\"S./S/Q5r^\"S0/S1Q5r_\"S2/S3Q5r`\"S4S55ra\"S6\aR�S7-5rc\"S8/S9Q5rd\"S:S;S<R�\dR�5-5rf\"S=/S>Q5rg\"S?/S@Q5rhSAriSBrjSCrk\"SD5rl\l"SE5 SJrpSKrqSLrrSMrsSNrtSOruSPrvSQrwSRrx\RXR[SS5(d \RXR[ST5(aSUryOSVry\R�rz"SWSX\m5r{"SYSZ5r|\|"5r}SmS[jr~S\rS]r�\GRr�SnS^jr�"S_S`5r�SnSajr�Sbr�Scr�Sdr�Ser�Sfr�Sgr�Shr�Sir�Sjr�"SkSl5r�g!\ma(rn\"SF\n<35 \"SGSH5"SISISI5qoSrnCnGNSrnCnff=f)ozLinux platform implementation.�N)�defaultdict)�
namedtuple�)�_common)�_psposix)�
_psutil_linux)�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_CLOSINGz/sys/class/power_supply�/proc/�/smaps�
/smaps_rollup�proc_ioprio_get�proc_cpu_affinity_get�
SC_CLK_TCK�littlei�
AddressFamily�AF_LINKc�$�\rSrSrSrSrSrSrSrg)�
IOPriority�drr���N)	�__name__�
__module__�__qualname__�__firstlineno__rr r!r"�__static_attributes__r<��A/opt/support/venv/lib/python3.13/site-packages/psutil/_pslinux.pyr8r8ds�����O��O��rBr8)�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)rr�rss�sizerz�shared_clean�shared_dirty�
private_clean�
private_dirty�
referenced�	anonymousr{�	pmmap_extzaddr perms � �pio)rhrirjrk�
read_chars�write_chars�	pcputimes)�user�system�
children_user�children_system�iowaitc���[U[5(dU5e[R"U5nUR	S5SnURS5(a[
U5(dUSSnU$)zWrapper around os.readlink().�r�
 (deleted)N���)�
isinstance�str�os�readlink�split�endswithr)rrs rCr�r��si���d�C� � �&�$�&� �
�;�;�t��D��:�:�f��a� �D��}�}�\�"�"�+=�d�+C�+C��D�S�z���KrBc�R�[RS[RS[RS0nX[R[R-[R--nU[R-(aURSSS5nURSS5nU$)zRConvert file's open() flags into a readable string.
Used by Process.open_files().
�r�wzw+�arzr+)r��O_RDONLY�O_WRONLY�O_RDWR�O_APPEND�replace)rv�	modes_maprus   rC�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��KrBc��URSS5nSnU(aSU3nOSUS3n[R"U[R5$)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_virtualrrs   rC�is_storage_devicer��sL���<�<��S�!�D�����T�F�#���T�F�'�*��
�9�9�T�2�7�7�#�#rBc�V�[US35nUR5R5SSnSSS5 /SQn[W5nUS:�aUR	S5 US:�aUR	S5 US	:�aUR	S
5 [SU5qg!,(df   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.
�/statrN)r��nicer��idler��irq�softirq��steal�	�guest�
�
guest_nice�	scputimes)r�readliner��len�appendrr�)�procfs_path�f�values�fields�vlens     rC�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(�/proczignoring exception on import: r�zuser system idle�c�v�USnXRSS5-nUSnUSnUSn[	[5S	35nSnU UHJn	U	R5n	U	RS
5(dM+U[U	R5S5-
nML SSS5 U[-nX-
n
X4-nU[US-U5-nX�-
n
X�[US
-U5-
-
n
[U
5$![a'n[URSS35 UsSnA$SnAff=f![a Us$f=f!,(df   N�=f)a9Fallback 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:rs
Active(file):sInactive(file):�
SReclaimable:zW is missing from /proc/meminfo; using an approximation for calculating available memoryNz	/zoneinfoslowrr:g@)
�get�KeyErrorr�argsrr�OSError�strip�
startswith�intr��PAGESIZE�min)�memsr`�fallback�lru_active_file�lru_inactive_file�slab_reclaimable�errr��
watermark_low�line�avail�	pagecaches            rC�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'�*
D8c
���/n0n[[5S35nUH)nUR5n[US5S-XS'M+ SSS5 USnUSnUSnUS
nX�R
SS5-
nUS
n	USn
USnUSnUSn
U
S:Xa[U5n
U
S:aSn
URS5 OX�:�aUn
X]-
n[X]-
USS9nU(aLSRSRU5[U5S:XaSOS5n[R"U[SS 9 [UU
UUUU
UUUU	U5$!,(df   GN=f![a SnURS	5 GNf=f![a SnURS5 GNf=f![a/ USn	GN0![a Sn	URS5 GNQf=ff=f![a Sn
URS5 GNsf=f![a; USUS-US-nGN�![a SnURS5 GN�f=ff=f![a SnGN�f=f![a [U5n
GN�f=f)!aReport 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�rNs	MemTotal:r�sBuffers:rcr�r�rdsShmem:s
MemShared:resActive:ras	Inactive:sInact_dirty:sInact_clean:sInact_laundry:rbsSlab:s
MemAvailable:r]��round_z6{} memory stats couldn't be determined and {} set to 0z, �was�werer:��
stacklevel)rrr�r�r�r�r�r�r�format�joinr��warnings�warn�RuntimeWarningr[)�missing_fieldsr�r�r�r�r\r`rcrdrerarbrfr�r_r^�msgs                 rC�virtual_memoryr�Ys����N�
�D�	��)�*�(�3�	4���D��Z�Z�\�F�!�&��)�n�t�3�D���O��
5�
���E����D�)��{�#��
0��j�!��	�(�(�+�Q�/�/��,��i���(��j�!��
.���%����H�~��
/��%�&���A�:�
)��.�E��q�y������k�*�	�����=�D��U�]�U�1�=�G��F�M�M��I�I�n�%���(�A�-�E�6�
��	�
�
�c�>�a�8��
�
������������Q
5�	4���)������i�(�)���(������h�'�(���,�	,��-�(�F���	,��F��!�!�(�+�+�	,��,���(������h�'�(���	.�	.��_�%���'�(��(�)�*�
��
�	.��H��!�!�*�-�-�	.��	.���������+�$�T�*��+�s��0E�E�$E<�>F �G�
H�I�I�
E�E9�8E9�<F�F� 
G�+F3�3G�G�G�G�G=�<G=�
I�H�I�<I�I�I�I�I�I4�3I4c���0n[[5S35nUH)nUR5n[US5S-XS'M+ SSS5 USnUSnXE-
n[X�SS9n	[[5S	35nU S=p�UH�nURS
5(a$[URS5S5S-S-n
O9URS
5(a#[URS5S5S-S-nU
cM{UcM� O& SnUS-
n[R"U[SS9 S=p�SSS5 [R"XHXYW
W5$!,(df   GN=f![a' [
R"5u   pdpWXG-nXW-nGN8f=f!,(df   Nm=f![a-n
SU
S3n[R"U[SS9 S=p�Sn
A
N�Sn
A
ff=f)zReturn swap memory metrics.r�rr�rNs
SwapTotal:s	SwapFree:r�z/vmstatspswpin� �spswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0r:r�zM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (�))rrr�r�r��cext�
linux_sysinforr�r�r�r�r�r�sswap)r�r�r�r�r\r`�_�unit_multiplierr_r^�sin�soutr�r�s              rC�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�[5n[U5 [US35nUR5R	5nSSS5 WS[[R5S-nUVs/sHn[U5[-PM nn[
U6$!,(df   NW=fs snf)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)
rr�rr�r�r�r��_fields�float�CLOCK_TICKS)r�r�r�r�rKs     rC�	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���[5n[U5 /n[US35nUR5 UH�nUR	S5(dMUR5nUS[
[R5S-nUVs/sHn[U5[-PM nn[U6nURU5 M� UsSSS5 $s snf!,(df   g=f)z^Return a list of namedtuple representing the CPU times
for every CPU available on the system.
r�scpurN)rr�rr�r�r�r�r�r�r�r�r�)r��cpusr�r�r�r�rK�entrys        rC�
per_cpu_timesr&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"S5$![a� Sn[[	5S35nUH.nUR5R
S5(dM)US-
nM0 SSS5 O!,(df   O=fUS:Xa�[R"S5n[[	5S35nUH4nURS	5SnURU5(dM/US-
nM6 SSS5 O!,(df   O=fUS:XagUs$f=f)
z0Return the number of logical CPUs in the system.�SC_NPROCESSORS_ONLNr�/cpuinfos	processorrNzcpu\dr�r�)r��sysconf�
ValueErrorrr�lowerr��re�compilerr��match)�numr�r��searchs    rC�cpu_count_logicalr: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�Dc��[5nSnSn[R"U5=(d [R"U5HDn[U5nURUR	5R55 SSS5 MF [
U5nUS:waU$0n0n[[5S35nUHpnUR5R5nU(dUSXgS'0nM7URS5(dMOURS	S
5up�[U
5Xy'Mr SSS5 [UR55nU=(d S$!,(df   GM(=f![a N�f=f!,(df   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_listNrr�	cpu cores�physical id)rrs	:r)�set�globr�add�readr�r�rrr�r�r�r��sumr�)�ls�p1�p2rrr��result�mapping�current_infor��key�values           rC�cpu_count_coresrWsT��

��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:�7E=�9E:�:E=�=
Fc��[[5S35nSnSnSnUH�nURS5(a[UR	5S5nOeURS5(a[UR	5S5nO2URS5(a[UR	5S5nUcM�UcM�UcM� O SSS5 Sn[
R"WWWU5$!,(df   N)=f)z*Return various CPU stats as a named tuple.r�Nsctxtrsintrssoftirqr)rrr�r�r�r�	scpustats)r��ctx_switches�
interrupts�soft_interruptsr��syscallss      rC�	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
��[[5S35nUVs/sHGnUR5RS5(dM)[	URSS5S5PMI snsSSS5 $s snf!,(df   g=f)z7Return current CPU frequency from cpuinfo if available.rscpu mhz�:rN)rrrr�r�r�)r�r�s  rC�_cpu_get_cpuinfo_freqr)�su��	��)�*�(�3�	4���
����z�z�|�&�&�z�2�
*�E�$�*�*�T�1�%�a�(�)��
�
5�	4��
�
5�	4�s"�A;�(A6�"A6�*A;�6A;�;
B	z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc	��[5n[R"S5=(d [R"S5nURSS9 /n[RR
n[
U5GHupE[U5[U5:XaXS-nO[U"US5SS9nUc^[U"US	5SS9nUcJS
US3n[USS9S:Xa)UR[R"S
S
S
55 M�Sn[U5e[U5S-n[[U"US555S-n	[[U"US555S-n
UR[R"XjU	55 GM 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"SU5R55$)Nz[0-9]+)r�r	r
�group�rKs rC�<lambda>�cpu_freq.<locals>.<lambda>�s���R�Y�Y�y�!�%<�%B�%B�%D�!ErB)ri��scaling_cur_freqN�r��cpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0
r�z!can't find current frequency file�scaling_max_freq�scaling_min_freq)r)r�sortr�rrr��	enumerater�rrr�r�scpufreq�NotImplementedErrorr�)�
cpuinfo_freqs�paths�ret�pjoin�irr�curr�online_pathr��max_�min_s           rC�cpu_freqrB�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�:�-(�.�
rBc�n�[5Vs/sHn[R"USS5PM sn$s snf)zmAlternate implementation using /proc/cpuinfo.
min and max frequencies are not available and are set to None.
r�)r)rr7r-s rCrBrB�s1��8M�7N�O�7N�!�� � ��C��-�7N�O�O��Os�"2c��\rSrSrSrg)�_Ipv6UnsupportedErrori�r<N)r=r>r?r@rAr<rBrCrErE�s��rBrEc�l�\rSrSrSrSrSrSr\S5r	\SSj5r
\SS	j5rSS
jrSr
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[R4nS[R[R4nS[R[R4nS[R[R4nS[R
S4nXX4U4X4U4U4X44U4U4U4XX44X4X$4S.UlSUlg)N�tcp�tcp6�udp�udp6�unix)�allrI�tcp4rJrK�udp4rLrM�inet�inet4�inet6)�socket�AF_INET�SOCK_STREAM�AF_INET6�
SOCK_DGRAM�AF_UNIX�tmap�_procfs_path)�selfrOrJrPrLrMs      rC�__init__�NetConnections.__init__�s����v�~�~�v�'9�'9�:�������);�);�<���v�~�~�v�'8�'8�9�������):�):�;�������-����D�1��<��G��G��<��G��G��G���,��\��\�
��	�!��rBc�&�[[5n[R"URSUS35H_n[URSUSU35nUR
S5(a(USSSSnX$RU[U545 M_Ma U$![[4a Mx[aYnUR[R:XaSnAM�UR[R:Xa[U5 SnAM�eSnAff=f)Nr��/fd�/fd/zsocket:[r����)r�listr��listdirr[r�r�r�r��FileNotFoundError�ProcessLookupErrorr��errno�EINVAL�ENAMETOOLONGr)r\�pid�inodesrs�inoder�s      rC�get_proc_inodes�NetConnections.get_proc_inodess����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�7D�)D�
D�Dc��0n[5H$nURURU55 M& U$![[[
4a MBf=f�N)�pids�updatermrerf�PermissionError)r\rkrjs   rC�get_all_inodes�NetConnections.get_all_inodessT�����6�C�

��
�
�d�2�2�3�7�8���
��&�'9�?�K�
��
�s� 7�A�Ac
�f�URS5up#[US5nU(dgURS5nU[R:Xai[
(a2[R"U[R"U5SSS25nO�[R"U[R"U55nO�[R"U5n[
(aP[R"[R[R"S/[R"SU5Q765nOP[R"[R[R"S/[R"SU5Q765n[ R""X#5$![a [5(d[Seef=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<�asciiNrbz>4Iz<4I)r�r��encoderTrU�
LITTLE_ENDIAN�	inet_ntop�base64�	b16decoderW�struct�pack�unpackrrrEr�addr)r��family�ip�ports    rC�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�
AF�(AF�"F0Nc#�# �URS5(a%[RRU5(dg[	U5nUR5 [
US5H�upgUR5SSu
p�p�    p�X�;a
X<Sup�OS	up�UbXN:waM>U[R:Xa
[UnO[Rn[R!X�5n	[R!X�5n
X�X)X�U4v� M� SSS5 g![a SUSUSU<3n
[U
5Sef=f!["a M�f=f!,(df   g=f7f)
z.Parse /proc/net/tcp* and /proc/net/udp* files.�6Nrr��error while parsing �; malformed line r�r�Nrb)r�r�rr�existsrr�r6r�r�RuntimeErrorrTrV�TCP_STATUSESr�	CONN_NONErGr�rE)�filer��type_rk�
filter_pidr��linenor�r��laddr�raddr�statusrlr�rjrss                rC�process_inet�NetConnections.process_inetbsc����=�=����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��41�!� �!��C�_�s[�AE�	"E	�,D�AE	�*D8�=E	�		E�#D5�5E	�8
E�E	�E�E	�	
E�Ec
#�# �[U5nUR5 UH�nUR5nUSSu   pxpyX�;aX)nOS/nUH_up�UbX<:waM[U5S:XaUS	OS
n[R"[U55nS
n[RnX�X�UUU4v� Ma M� SSS5 g![a SU;aM�SUSU<3n
[	U
5ef=f!,(df   g=f7f)zParse /proc/net/unix files.r�r�r�r�r�Nr�rb�)
rr�r�rr�r�r�socktype_to_enumr�r�)r�r�rkr�r�r��tokensr�r�rlr��pairsrjrsrrr�r�s                 rC�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�4C;c�6�[5UlUbURU5nU(d/$OUR5n[	5nUR
UH�upVnURSU3nU[R[R1;aURX�XsUS9n	OURX�X2S9n	U	HRup�p{p�nU(a[R"X�X{X�5nO[R"X�X{X�U5nURU5 MT M� [U5$)Nz/net/)r�)rr[rmrtrrZrTrUrWr�r�r�pconn�sconnrrc)r\�kindrjrkr;�
proto_namer�r�rrrrsr�r�r��	bound_pid�conns                rC�retrieve�NetConnections.retrieve�s��+�-����?��)�)�#�.�F���	���(�(�*�F��e��)-���4��%�J���'�'�(��j�\�:�D��&�.�.�&�/�/�:�:��&�&��%�C�'����&�&�t�V�&�L��FH�B��E�%���"�=�=��E�%��D�#�=�=��E�%���D�����
�GI�*9�$�C�y�rB)r[rZrp)r=r>r?r@�__doc__r]rmrt�staticmethodr�r�r�r�rAr<rBrCrGrG�s^��	�!�.�4� �0&��0&�d�(I��(I�T�!L��!L�FrBrGc�,�[RU5$)z$Return system-wide open connections.)�_net_connectionsr�)r�s rC�net_connectionsr��s���$�$�T�*�*rBc��[[5S35nUR5nSSS5 0nWSSH�nURS5nUS:�d[	U55eUSUR5nX4S-SR5R
5n[[U5unnn	n
nnn
nnnnnnnnnUUUUU	UU
U4X%'M� U$!,(df   N�=f)zkReturn network I/O statistics for every network interface
installed on the system as a dict of raw tuples.
z/net/devNr:rwrr)	rr�	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                       rC�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
�

Cc�<�[R[[R[[R
[0n[5R5n0nUH{n[R"U5n[R"U5n[R"U5upgSRU5nSU;n	[R"X�UXtU5X#'M} U$![a5n
U
R [ R":wae[%U
5 Sn
A
M�Sn
A
ff=f)z)Get NIC stats (isup, duplex, speed, mtu).�,�runningN)r��DUPLEX_FULLr
�DUPLEX_HALFr�DUPLEX_UNKNOWNrr��keys�
net_if_mtu�net_if_flags�net_if_duplex_speedr�r�	snicstatsr�rg�ENODEVr)�
duplex_map�namesr;r��mturv�duplex�speed�output_flags�isupr�s           rC�net_if_statsr�s���	
���/����/����/��J�

��"�"�$�E�
�C���	��/�/�$�'�C��%�%�d�+�E� �4�4�T�:�M�F��8�8�E�?�L���%�D��)�)���(�%�l��C�I�� �J���	��y�y�E�L�L�(���#�J�J��		�s�AC�
D�&*D�Dc��SnSn[RR[5S35(aU"5nOD[RRS5(aU"5nO[5S3n[	U5e0nUH@nUu
pxp�p�p�nnU(d[U5(dM%U
[-n
U[-nX�X�X�X�U4	XW'MB U$)z[Return disk I/O statistics for every disk installed on the
system as a dict of raw tuples.
c3� # �[[5S35nUR5nSSS5 WH�nUR5n[	U5nUS:Xa.USn[US5n[
[
USS5u
pxp�np�p�nOhUS:XdUS:�a USn[
[
USS5upgp�p�p�p�nO<US:Xa%USn[
[
USS5uphp�S	=n	=n
=n=p�OS
U<3n[U5eXVX�X�U
X{U4
v� M� g!,(df   N�=f7f)N�
/diskstats�r;r:r���r�rznot sure how to interpret line )rrr�r�r�r�r�r)r�r�r�r��flenr��reads�reads_merged�rbytes�rtime�writes�
writes_merged�wbytes�wtimer�rpr�s                 rC�read_procfs�%disk_io_counters.<locals>.read_procfs0s7���"�/�+�,�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=�CD�=
D�Dc3�2# �[R"S5H�n[R"[RR	SU55H�upnSU;aM[[RR	US55nUR
5R5R5nSSS5 [RRU5n[[WSS5u
pxp�p�p�p/XgX�X�X�X�4
v� M� M� g!,(df   NX=f7f)N�
/sys/block�statr�)r�rd�walkrrr�rrr�r��basenamer�r�)�block�rootr��filesr�r�r�r�r�r�r�r�r�r�r�rps                rC�
read_sysfs�$disk_io_counters.<locals>.read_sysfs^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�BD�-D�4AD�
D�Dr�r�z6/diskstats nor /sys/block are available on this system)r�rrr�rr8r��DISK_SECTOR_SIZE)�perdiskr�r��genr�r�rr�r�r�r�r�r�r�r�r�rps                 rC�disk_io_countersr�+s���
+;�\F�
�w�w�~�~��*�+�:�6�7�7��m��	������	%�	%��l��� �!�"�
�	�"�#�&�&��G���).�	&��f�f�U��9��0��6�6�
��"�"���"�"�����%�i�A��
�)�0�NrBc�>�\rSrSrSrSS/rSrSrSrSr	S	r
S
rg)�RootFsDeviceFinderi�a2disk_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"S5Rn[R"U5Ul[R"U5Ulg�Nr�)r�r��st_devr�r�)r\�devs  rCr]�RootFsDeviceFinder.__init__�s3���g�g�c�l�!�!���X�X�c�]��
��X�X�c�]��
rBc��[[5S35nUR5SSH�nUR5n[	U5S:aM$USR5(a[
US5OSnUSR5(a[
US5OSnUSnX@R:XdM�XPR:XdM�U(dM�SU3s sSSS5 $ SSS5 g!,(df   g=f)Nz/partitionsr:r�rrr;�/dev/)	rrr�r�r��isdigitr�r�r�)r\r�r�r�r�r�r�s       rC�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$�BC*�5
C*�C*�C*�C*�*
C8c�<�SURSURS3n[U5nUHTnURS5(dMUR	5RS5SnU(dMFSU3s sSSS5 $ SSS5 g!,(df   g=f)Nz/sys/dev/block/rwz/ueventzDEVNAME=r:r)r�r�rr�r��
rpartition)r\rrr�r�r�s     rC�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
�2B
�B
�
Bc���URSUR3n[R"S5nUH�n[	U5nU UR5R
5nXQ:XaL[RR[RRU55nSU3sSSS5 s $SSS5 M� g!,(df   M�=f![a M�f=f)Nrwz/sys/class/block/*/devr)r�r�r�iglobrrr�r�rrr��dirnamere)r\�needler�r�r��datar�s       rC�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��SnUcUR5nUcUR5nUcUR	5nUb'[
RRU5(aU$gg![an[U5 SnANmSnAff=f![an[U5 SnAN{SnAff=f![an[U5 SnAN�SnAff=frp)rr�rrrr�rrr�)r\rrr�s   rC�find�RootFsDeviceFinder.find�s������<�
��/�/�1���<�
��-�-�/���<�
��/�/�1��
�������t� 4� 4��K�!5����
��c�
�
��
��
�
��c�
�
��
��
�
��c�
�
��
�sE�A*�B�B.�*
B	�4B�B	�
B+�B&�&B+�.
C
�8C�C
)r�r�N)r=r>r?r@r��	__slots__r]rrrrrAr<rBrCr�r��s,����'�"�I�#�
.�.�
.�rBr�c��[5n[5nU(d�[US35nUHwnUR5nUR	S5(d!URUR55 MJUR
S5SnUS:XdMfURS5 My SSS5 US:XaD[RRS5(a [RRS5nO"[RRUS	35n/n[R"U5nUHtn	U	up�p\U
S
:XaSn
U
S;a![5R5=(d U
n
U(dU
(aXQ;aML[R "X�X\5n
UR#U
5 Mv U$!,(df   GN=f)
z8Return mounted disk partitions as a list of namedtuples.z/filesystems�nodev�	r�zfsNr�z	/etc/mtabz/self/mounts�noner�>�rootfs�	/dev/root)rrrr�r�rr�r�rr�isfile�realpathr��disk_partitionsr�rr�	sdiskpartr�)rN�fstypesr�r�r��fstype�mounts_path�retlist�
partitions�	partition�device�
mountpoint�opts�ntuples              rCr"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"[5n[R"S5nUR	[R"S55 [UVs1sHo"R
S5SiM sn5n[R"S5n[R"S5nUH-nURSU5nXa;dMURU5 M/ UH�nUS-n[[U55S	-n	[RR[RR!U5S
5n[#U5R%5n
[US-SS
9n[US-SS
9n[#US-SS
9R%5n
Ub[U5S	-nUb[U5S	-nX
RX�X�45 M� U(Gd�[R"S5n[[+U55nUGH�n[RRUS5n[[U55S	-n	[RRUS5n[#U5R%5n
[R"US-5nUVs1sHCnSR[RR/U5R
S5SS5iME nnSnSnUH�n[RRUUS-5n[#USS
9R%5nUS:Xa,[[RRUUS-5SS
9nO1US:Xa+[[RRUUS-5SS
9nUb[U5S	-nUcM�[U5S	-nM� X
RSX�U45 GM� [1U5$s snf![&[(4a GM
f=f![(a SnGN`f=f![(a SnGNaf=f![&[(4an[-U5 SnAGM:SnAff=fs snf![(a SnN�f=f![(a SnGM�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�rz5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/�_inputg@�@r��_maxNr1�_crit�_labelr�z /sys/class/thermal/thermal_zone*�temp�typez/trip_point*r;�_type�critical�_temp�high)�collectionsrrcr�extend�sortedr�r	r
�subr�r�rr�rrr�rrr�r�rrrr��dict)r;�	basenamesrK�
basenames2�replr��altname�baserr�current�	unit_namer8r6�labelr��
trip_paths�p�trip_points�
trip_point�	trip_types                    rC�sensors_temperaturesrKs	���
!�
!�$�
'�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"[5n[R"S5nU(d[R"S5n[	UVs1sHo"RS5SiM sn5nUH�n[
[US-55n[[RR[RRU5S55R5n[US-S	S
9R5nXR!["R$"Xt55 M� ['U5$s snf![an[U5 SnAM�SnAff=f)akReturn 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�rr/Nr�r2r�r1)r9rrcrr;r�r�rr�rrr�rrr�rr�r�r�sfanr=)r;r>rKrBrCr�rDrEs        rC�sensors_fansrN�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�^
�[5m
U
4Sjn[R"[5Vs/sH1nUR	S5(dSUR5;dM/UPM3 nnU(dg[RR[[U55nU"US-US-5nU"US-US-5nU"US	-US
-5nU"US-5nUb
Ub
SU-U-nO[[US-SS95nUS:XagSn	U"[RR[S5[RR[S55n
U
bU
S:Hn	O:[US-SS9R5R5nUS:XaSn	OUS;aSn	U	(a[RnOZUbUb[U[U5-S-5nO8Ub%[US-5nUS:a[R nO[R n[R""X�U	5$s snf![a S
nGN/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�>�UH!n[UTS9nUT:wdM[U5s $ g![a UR5ss $f=f)zfAttempt to read the content of multiple files which may
not exist. If none of them exist return None.
r1N)rr�rr�)r:rrr;�nulls   �rC�
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_nowgY@r�z	/capacityrbr1z
AC0/onlinez	AC/onliner�/statusr��dischargingF>�full�chargingTi�<r)�objectr�rd�POWER_SUPPLY_PATHr�rrrr�r��ZeroDivisionErrorr�rr�r�POWER_TIME_UNLIMITED�abs�POWER_TIME_UNKNOWN�sbattery)rRrK�batsr��
energy_now�	power_now�energy_full�
time_to_emptyr^�
power_plugged�onliner��secsleftrQs             @rC�sensors_batteryrj�sQ����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��:��I��6��=�>�H�
�	"��}�r�)�*���a�<��1�1�H���-�-�����G�}�=�=��C��.!�	��G�	��B!�	2��1�1�H�	2�s/�.H� H�H"�3H5�"H2�1H2�5I�Ic��/n[R"5nUH;nUup4pVn[R"X4=(d SXVU5nUR	U5 M= U$)z:Return currently connected users as a list of namedtuples.N)r��usersr�suserr�)	r'�rawlist�itemr��tty�hostname�tstamprj�nts	         rCrlrl�sQ���G��j�j�l�G���+/�(��8�S�
�]�]�4���h��
D�����r����NrBc��[5S3n[U5nUHNnURS5(dM[UR	5R5S5s sSSS5 $ SU3n[
U5e!,(df   g=f)zAReturn the system boot time expressed in seconds since the epoch.r�sbtimerNzline 'btime' not found in )rrr�r�r�r�r�)rrr�r�r�s    rC�	boot_timeru
s|����
 ��&�D�	�T�	�a��D����x�(�(��T�Z�Z�\�/�/�1�!�4�5�5�
�	��+�4�&�1���3���
�	�s�A>�+A>�,A>�>
Bc���[5R[5n[R"U5Vs/sH$oR5(dM[
U5PM& sn$s snf)z7Returns a list of PIDs currently running on the system.)rrzr	r�rdrr�)rrrKs  rCrqrqsD����#�#�H�-�D��J�J�t�,�<�,�q�	�	��F�C��F�,�<�<��<s�A$�A$c��[R"U5(dg[5SUS3n[U5nUHDnUR	S5(dM[UR
5S5nX@:Hs sSSS5 $ SU3n[U5e!,(df   g=f![[4a U[5;s$f=f)z[Check for the existence of a unix PID. Linux TIDs are not
supported (always return False).
Fr�rVsTgid:rNz'Tgid' line not found in )
r�
pid_existsrrr�r�r�rr�rq)rjrrr�r��tgidr�s      rCrxrx 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�Cc��0n[5n[5Hfn[USUS35nUR5nSSS5 WR	S5nXES-SR5n[
US5nXpU'Mh U$!,(df   NL=f![[4a M�[an[U5UeSnAff=f)zkObtain a {pid: ppid, ...} dict for all running processes in
one shot. Used to speed up Process.children().
r�r�N�)r:r)rrqrrr�r�r�rerfrsr
)	r;r�rjr�r�rpar�dset�ppidr�s	         rC�ppid_maprAs���
�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�#��,��	-�s3�B�B�B�
B	�
B�C�'	C�0B<�<Cc�F^�[R"T5U4Sj5nU$)zdDecorator which translates bare OSError and OSError exceptions
into NoSuchProcess and AccessDenied.
c�>�URURpCT"U/UQ70UD6$![an[X45UeSnAf[a!nUR5 [
X45UeSnAf[aVnUR5 [RRURSUS35(d[
X45UeeSnAff=f)Nr�r�)rj�_namersr
rf�_raise_if_zombierrer�rrr�r[)r\r��kwargsrjr�r��funs      �rC�wrapper� wrap_exceptions.<locals>.wrapper\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�2AC�C)�	functools�wraps)r�r�s` rC�wrap_exceptionsr�Ws'���
�_�_�S�����$�NrBc��\rSrSrSr/SQrSrSrSrSr	\
4Sjr\\
S	55r\\
S
55r\\
S55rSrS
r\S5r\S5r\S5r\S5r\S5r\R2R5S\R6"5S35(a\S5r\S5r\S5r\S=Sj5r\S>Sj5r \S5r!\"(d\#(aISr$\\%RL"S5\%RL"S5\%RL"S54S j5r'\S!5r(O\!r(\#(a\S"5r)\S#5r*\\%RL"S$54S%j5r+\\%RL"S&54S'j5r,\S(5r-\S)5r.\S*5r/\0(a&\S+5r1\%RL"S,54S-jr2\S.5r3\4(a\S/5r5\S05r6\7"\8S15(a
\S=S2j5r9\S35r:\S45r;\S?S5j5r<\S65r=\S75r>\\%RL"S854S9j5r?\\%RL"S:54S;j5r@S<rAg)@�ProcessirzLinux process implementation.)�_cache�_ctimer��_ppidr[rjc�X�XlSUlSUlSUl[	5Ulgrp)rjr�r�r�rr[)r\rjs  rCr]�Process.__init__~s'������
���
����+�-��rBc��[URSURS35nURS5nXS-US-nUS:H$![a gf=f)Nr�r�r{r:r;�ZF)rr[rjr�r�)r\rr|r�s    rC�
_is_zombie�Process._is_zombie�si��	"��4�,�,�-�Q�t�x�x�j��>�?�D��:�:�d�#�D���(�T�A�X�.�F��T�>�!���	��	�s�%A�
A�Ac��UR5(a+[URURUR5egrp)r�rrjr�r��r\s rCr��Process._raise_if_zombie�s/���?�?�������$�*�*�d�j�j�A�A�rBc�b�[R"URSUR35 g)z+Raise NSP if the process disappeared on us.r�N)r�r�r[rjr�s rC�_raise_if_not_alive�Process._raise_if_not_alive�s&��	���4�$�$�%�Q�t�x�x�j�1�2rBc��[U5$![[4a\ [RRURSUR35(aUR5 U[LaUs$ef=fr)
r�rerfr�rr�lexistsr[rjr��UNSET)r\rrr�s   rC�	_readlink�Process._readlink�sk��	��D�>�!��!�#5�6�	��w�w���$�"3�"3�!4�A�d�h�h�Z�@�A�A��%�%�'��5�(�#�O��	�s�

�A(A9�7A9c��[URSURS35nURS5nXR	S5S-UnXS-SR5n0nX5S'US	US
'USUS'USUS
'USUS'USUS'USUS'USUS'USUS'USUS'USUS'U$![a [S5 S	US'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{�(rr:Nr�rr�r~r��ttynr��utime��stime�
�children_utimer��children_stime��create_time�$�cpu_num�'�blkio_ticksz&can't get blkio_ticks, set iowait to 0)rr[rjr�rr��
IndexErrorr)r\rr|r�r�r;s      rC�_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�1B;�;C�Cc��[URSURS35nUR5sSSS5 $!,(df   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�rVN)rr[rjr�r\r�s  rC�_read_status_file�Process._read_status_file�s<���D�-�-�.�a����z��A�
B�a��6�6�8�C�
B�
B�s�A�
Ac��[URSURS35nUR5R	5sSSS5 $!,(df   g=f)Nr�r/)rr[rjrr�r�s  rC�_read_smaps_file�Process._read_smaps_file�sC���D�-�-�.�a����z��@�
A�Q��6�6�8�>�>�#�B�
A�
A�s�A�
Ac��URRU5 URRU5 URRU5 grp)r��cache_activater�r�r�s rC�
oneshot_enter�Process.oneshot_enter�s>�����,�,�T�2����-�-�d�3����,�,�T�2rBc��URRU5 URRU5 URRU5 grp)r��cache_deactivater�r�r�s rC�oneshot_exit�Process.oneshot_exit�s>�����.�.�t�4����/�/��5����.�.�t�4rBc�:�[UR5S5$)Nr�)rr�r�s rCr��Process.name�s���d�+�+�-�f�5�6�6rBc�V�URURSURS3SS9$)Nr�z/exer�r1�r�r[rjr�s rC�exe�Process.exe��5���~�~�� � �!��4�8�8�*�D�1�B��
�	
rBc��[URSURS35nUR5nSSS5 W(dUR	5 /$URS5(aSOSnURU5(aUSSnUR
U5nUS:Xa&[U5S:XaSU;aUR
S5nU$!,(df   N�=f)Nr�z/cmdliner�r�rbr)rr[rjrr�r�r�r�)r\r�r�sep�cmdlines     rCr��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�
Cc��[URSURS35nUR5nSSS5 [	W5$!,(df   N=f)Nr�z/environ)rr[rjrr)r\r�rs   rC�environ�Process.environsJ��
�$�+�+�,�A�d�h�h�Z�x�@�
A�Q��6�6�8�D�B�"�4�(�(�B�
A�s�A
�

Ac��[UR5S5n[R"5nX!$![a gf=f)Nr�)r�r�r�get_terminal_mapr�)r\�tty_nrrZs   rC�terminal�Process.terminalsG���T�*�*�,�W�5�6���(�(�*��	��<����	��	�s�7�
A�Ar.�/ioc	��URSURS3n0n[U5nUH=nUR5nU(dMUR	S5upV[U5X%'M? SSS5 U(dUS3n[U5e[USUSUSUSUS	US
5$![a M�f=f!,(df   NY=f![a*nURS<SUS
U<3n[
U5SeSnAff=f)Nr�r�s: z file was emptyssyscrssyscws
read_bytesswrite_bytessrcharswcharrz field was not found in z; found fields are )r[rjrr�r�r�rr�r�r�r�)	r\�fnamer�r�r�r�rr�r�s	         rC�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�Dc��UR5n[US5[-n[US5[-n[US5[-n[US5[-n[US5[-n[X#XEU5$)Nr�r�r�r�r�)r�r�r�r�)r\r�r�r�r�r�r�s       rCr��Process.cpu_timesJs����&�&�(���f�W�o�&��4���f�W�o�&��4���v�&6�7�8�;�F���v�&6�7�8�;�F���v�m�,�-��;����~�v�N�NrBc�:�[UR5S5$)zWhat CPU the process is on.r��r�r�r�s rCr��Process.cpu_numTs���4�(�(�*�9�5�6�6rBNc�X�[R"URXR5$rp)r�wait_pidrjr�)r\�timeouts  rC�wait�Process.waitYs��� � ����7�J�J�?�?rBc��URc([UR5S5[-UlU(aUR$UR[	5-$)Nr�)r�r�r�r�ru)r\�	monotonics  rCr��Process.create_time]sR���;�;���d�+�+�-�m�<�=��K�
�K���;�;���{�{�Y�[�(�(rBc	��[URSURS35nSUR5R	5SS5up#pEpgnSSS5 [WWWWWWW5$!,(df   N=f)Nr�z/statmc3�F# �UHn[U5[-v� M g7frp)r�r�)�.0rKs  rC�	<genexpr>�&Process.memory_info.<locals>.<genexpr>|s���8�+C�a��A���!�+C�s�!r�)rr[rjr�r�rw)	r\r��vmsr}re�text�libr�dirtys	         rC�memory_info�Process.memory_infons}���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#[URSURS35nUH�nURS5(a$U[	UR5S5S--
nM=URS5(a![	UR5S5S-nMtURS5(dM�[	UR5S5S-nM� SSS5 XU4$!,(df   N=f)	Nrr�r0sPrivate_rr��Pss:�Swap:)rr[rjr�r�r�)r\ryrzr{r�r�s      rC�_parse_smaps_rollup�Process._parse_smaps_rollup�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�BC)�:#C)�)
C7s\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)c�,�UR5n[[[UR	U555S-n[[[UR	U555S-n[[[UR	U555S-nXVU4$)Nr�)r�rr�r��findall)r\�_private_re�_pss_re�_swap_re�
smaps_dataryrzr{s        rC�_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�#�#rBc���[(aUR5upnOUR	5upnUR5n[
XAX#4-6$![[4a UR	5upnNAf=frp)�HAS_PROC_SMAPS_ROLLUPr�rfrer�r�rx)r\ryrzr{�	basic_mems     rC�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�5A6c�~�SnUR5nU(dUR5 /$URS5n/nURS5nU/nU"X65GHAuprURSS5nUup�p�p�U(dSnOF[U5nUR
5nURS5(a[U5(dUSS	n[U	5[U
5UURS
S5URSS5URSS5URS
S5URSS5URSS5URSS5URSS5URSS5URSS54
nURU5 GMD U$![a US/-up�p�p�GN@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.
c3�# �0nUHlnURSS5nUSRS5(d'UR5U4v� URU5 MU[	US5S-X$S'Mn UR5U4v� g![
[4a/ USRS5(aM�SU<3n[U5Sef=f7f)N�rr(rr�sVmFlags:z!don't know how to interpret line )r�r��popr�r�rr�r�)r��
current_blockrr�r�r�s      rC�
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��
!+�J�7�<�%�a�y�3�3�K�@�@� (�$E�d�X�"N�C�",�S�/�t�;�<�s*�AC�B�3C�)C�5C�8C�C�
rNrr�z[anon]r�r�sRss:sSize:r�s
Shared_Clean:s
Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:sReferenced:s
Anonymous:r�)r�r�r�rrrr�r�rr�r�)r\r
rr�r�
first_liner	�header�hfieldsr��perms�_offset�_dev�_inoderrros                rC�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�5F$�$F<�;F<c�V�URURSURS3SS9$)Nr�z/cwdr�r1r�r�s rC�cwd�Process.cwdr�rBsctxt_switches:\t(\d+)c��UR5nURU5nU(d(SURSURS3n[	U5e[
R"[US5[US55$)NzR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in r�z1/status; the kernel is probably older than 2.6.23rr)r�r�r[rjr8r�pctxswr�)r\�	_ctxsw_rer�ctxswr�s     rC�num_ctx_switches�Process.num_ctx_switchess}���%�%�'���!�!�$�'�����%�%�&�a����z�2.�.�
�&�c�*�*��~�~�c�%��(�m�S��q��]�;�;rBsThreads:\t(\d+)c�\�UR5n[URU5S5$�Nr)r�r�r�)r\�_num_threads_rers   rC�num_threads�Process.num_threads&s-���%�%�'���?�*�*�4�0��3�4�4rBc���[R"URSURS35nUR	5 /nSnUH�nURSURSUS3n[U5nUR
5R5nSSS5 WURS5S-SnURS	5n[US
5[-n	[US5[-n
[R"[!U5X�5nUR#U5 M� U(aUR%5 U$!,(df   N�=f![[4a SnGMf=f)Nr�z/taskFz/task/r�Tr{r:r�r�r�)r�rdr[rjr5rrr�rerfrr�r�r�r�pthreadr�r�r�)r\�
thread_idsr'�
hit_enoent�	thread_idr�r��str�r�r�r-s            rC�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
�5D<�E
�<
E
	�E
�
E
�
E$�#E$c�B�[R"UR5$rp)r��proc_priority_getrjr�s rC�nice_get�Process.nice_getGs���%�%�d�h�h�/�/rBc�D�[R"URU5$rp)r��proc_priority_setrj)r\rs  rC�nice_set�Process.nice_setPs���%�%�d�h�h��6�6rBc�B�[R"UR5$rp)r�r2rjr�s rC�cpu_affinity_get�Process.cpu_affinity_getWs���-�-�d�h�h�7�7rBsCpus_allowed_list:\t(\d+)-(\d+)c	��UR5nURU5nU(a6[[[	USS5[	USS5S-55$[[[[
5555$)Nrr)r�r�rc�ranger�r�r)r\�_rerrs    rC�_get_eligible_cpus�Process._get_eligible_cpus[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�8rBc	���[R"URU5 g![[4a�n[U[5(dUR[R:XarUR5n[[[[5555nUH7nXT;aSU<SU<3n[	U5SeXS;dM%SUSU3n[	U5Ue eSnAff=f)Nzinvalid CPU z; choose between zCPU number z! is not eligible; choose between )
r��proc_cpu_affinity_setrjr�rr�rgrhr:�tupler8r�r)r\rr��
eligible_cpus�all_cpus�cpur�s       rC�cpu_affinity_set�Process.cpu_affinity_setfs���
��*�*�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�BC�C�Cc��[R"UR5up[U5n[R
"X5$rp)r�r1rjr8r�pionice)r\�ioclassrs   rC�
ionice_get�Process.ionice_get�s1��!�1�1�$�(�(�;�N�G� ��)�G��?�?�7�2�2rBc��UcSnU(a5U[R[R1;aU<S3n[U5eUS:dUS:�a
Sn[U5e[R
"URX5$)Nrz ioclass accepts no valuer�zvalue not in 0-7 range)r8r"rrr��proc_ioprio_setrj)r\rFrr�s    rC�
ionice_set�Process.ionice_set�sy���}������,�,��,�,�%��!��#<�=�� ��o�%��q�y�E�A�I�.�� ��o�%��'�'����'�A�ArB�prlimitc��URS:Xa
Sn[U5eUc![R"URU5$[	U5S:waSU<3n[U5e[R"URX5 g![
a4nUR[R:XaUR5 eSnAff=f)Nrz)can't use prlimit() against PID 0 processr:z2second argument must be a (soft, hard) tuple, got )	rjr�resourcerMr�r�rg�ENOSYSr�)r\�	resource_�limitsr�r�s     rC�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�AB�
C�/B>�>Cc�t�UR5SnUR5n[RUS5$)Nr��?)r�r�
PROC_STATUSESr�)r\�letters  rCr��Process.status�s3���&�&�(��2�������� � ���-�-rBc�6�/n[R"URSURS35nSnUGHnURSURSU3n[	U5nURS5(a�[
U5(a�URSURSU3n[U5n[UR5R5S5n[UR5R5SS5n	SSS5 [W	5n
[U[U5[W5X�5nURU5 GMGMGM! U(aUR+5 U$!,(df   Nn=f![[4a SnGMcf=f![[4a SnGM}[ a[nUR"["R$:XaSnAGM�UR"["R&:Xa[)U5 SnAGM�eSnAff=f)	Nr�r`Fraz/fdinfo/rr�T)r�rdr[rjr�r�rrr�r�r�r�rqr�rerfr�rgrhrirr�)
r\r'r�r'rsr�rrr��posrvrur-r�s
             rC�
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�5AE3�F�3
F	�=F�F�F�H�4	H�=H�")H�H�Hc�d�[RXR5nUR5 U$rp)r�r�rjr�)r\r�r;s   rCr��Process.net_connections�s'���'�'��h�h�7��� � �"��
rBc�t�[[R"URSURS355$)Nr�r`)r�r�rdr[rjr�s rC�num_fds�Process.num_fds�s.���2�:�:��!2�!2� 3�1�T�X�X�J�c�B�C�D�DrBc�:�[UR5S5$)Nr~r�r�s rCr~�Process.ppid�s���4�(�(�*�6�2�3�3rBsUid:\t(\d+)\t(\d+)\t(\d+)c��UR5nURU5Sup4n[R"[	U5[	U5[	U55$r )r�r�r�puidsr�)r\�_uids_rer�real�	effective�saveds      rC�uids�Process.uids��I���%�%�'��!)�!1�!1�$�!7��!:�����}�}�S��Y��I���E�
�C�CrBsGid:\t(\d+)\t(\d+)\t(\d+)c��UR5nURU5Sup4n[R"[	U5[	U5[	U55$r )r�r�r�pgidsr�)r\�_gids_rerrhrirjs      rC�gids�Process.gids�rmrB)r�r�r�r[rjrp�F�rQ)Br=r>r?r@r�rr]r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�rrr��getpidr�r�r�r�r�r�r�HAS_PROC_SMAPSr�r	r
r�rrrrr"r*r.r2�HAS_CPU_AFFINITYr5r:rB�HAS_PROC_IO_PRIORITYrGrK�hasattrrOrSr�r\r�rar~rkrqrAr<rBrCr�r�rs���'��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��DrBr�rtrs)�r�r}r9�enumrgr�rr�r	rOrTr�sysr�rrr�rrrr�r	r
rrr
rrrrrrrrrrrrrrrr�__extra__all__r\rrr�rurvrryrxrwrr��getpagesizer��	byteorderr{r[r�r��IntEnumr��	AF_PACKETr5r6r8�globalsrr�__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_PARKEDrWr#r$r%r&r'r(r)r*r+r,r-r�r[rgrqrwr�rxr|r�r�r�r�r�r�r�r��	Exceptionr�r�r�r�r�r�rrrr&r)rB�net_if_addrsrErGr�r�r�r��
disk_usager�r�r"rKrNrjrlrurqrxrr�r�r<rBrC�<module>r�s���
%�������	�	��
�
�
��#�"���#��$�$�'�!�"�"�����$�"��+� ��(�'�"�"�	��$.�������&�����
�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�0K���!�<�~~�B4@�x
� �(�:'�T�2
��7�7�>�>�;�<�<������*�A�A�#�NP�� � ��	�I�	�k�k�\"�#��+�
,�^�B�
 �
 �
�f�RH�H�V$�Xs�l�>W>�~� � =�!�B�,�6P
D�P
D��G+�K�	�*�3�'�
2�3��;�(:�;�C��c�J�I��K�s�Q'�'R�-R�R

Youez - 2016 - github.com/yon3zu
LinuXploit