Python中的跨平台进程和系统监控库。
项目描述
快速链接
摘要
psutil (进程和系统实用工具) 是一个跨平台库,用于在 Python 中检索有关 正在运行的进程 和 系统利用率(CPU、内存、磁盘、网络、传感器)的信息。它主要用于 系统监控、性能分析和限制进程资源以及 正在运行的进程管理。它实现了许多经典 UNIX 命令行工具提供的功能,例如 ps、top、iotop、lsof、netstat、ifconfig、free 等。psutil 目前支持以下平台
Linux
Windows
macOS
FreeBSD、OpenBSD、NetBSD
Sun Solaris
AIX
支持的 Python 版本是 2.7、3.6+ 和 PyPy。
资助
虽然 psutil 是免费软件并且将始终如此,但该项目将从一些资助中受益匪浅。仅就我个人而言,跟上错误报告和维护已经变得几乎难以持续。如果您是使用 psutil 的公司,您可以考虑通过 GitHub Sponsors、Open Collective 或 PayPal 成为一个赞助商,并在其中展示您的标志,并在 psutil 文档 中展示。
赞助商
示例用法
这几乎代表了整个 psutil API。
CPU
>>> import psutil
>>>
>>> psutil.cpu_times()
scputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540, iowait=629.59, irq=0.0, softirq=19.42, steal=0.0, guest=0, guest_nice=0.0)
>>>
>>> for x in range(3):
... psutil.cpu_percent(interval=1)
...
4.0
5.9
3.8
>>>
>>> for x in range(3):
... psutil.cpu_percent(interval=1, percpu=True)
...
[4.0, 6.9, 3.7, 9.2]
[7.0, 8.5, 2.4, 2.1]
[1.2, 9.0, 9.9, 7.2]
>>>
>>> for x in range(3):
... psutil.cpu_times_percent(interval=1, percpu=False)
...
scputimes(user=1.5, nice=0.0, system=0.5, idle=96.5, iowait=1.5, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
scputimes(user=1.0, nice=0.0, system=0.0, idle=99.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
scputimes(user=2.0, nice=0.0, system=0.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
>>>
>>> psutil.cpu_count()
4
>>> psutil.cpu_count(logical=False)
2
>>>
>>> psutil.cpu_stats()
scpustats(ctx_switches=20455687, interrupts=6598984, soft_interrupts=2134212, syscalls=0)
>>>
>>> psutil.cpu_freq()
scpufreq(current=931.42925, min=800.0, max=3500.0)
>>>
>>> psutil.getloadavg() # also on Windows (emulated)
(3.14, 3.89, 4.67)
内存
>>> psutil.virtual_memory()
svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304)
>>> psutil.swap_memory()
sswap(total=2097147904, used=296128512, free=1801019392, percent=14.1, sin=304193536, sout=677842944)
>>>
磁盘
>>> psutil.disk_partitions()
[sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid'),
sdiskpart(device='/dev/sda2', mountpoint='/home', fstype='ext', opts='rw')]
>>>
>>> psutil.disk_usage('/')
sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)
>>>
>>> psutil.disk_io_counters(perdisk=False)
sdiskio(read_count=719566, write_count=1082197, read_bytes=18626220032, write_bytes=24081764352, read_time=5023392, write_time=63199568, read_merged_count=619166, write_merged_count=812396, busy_time=4523412)
>>>
网络
>>> psutil.net_io_counters(pernic=True)
{'eth0': netio(bytes_sent=485291293, bytes_recv=6004858642, packets_sent=3251564, packets_recv=4787798, errin=0, errout=0, dropin=0, dropout=0),
'lo': netio(bytes_sent=2838627, bytes_recv=2838627, packets_sent=30567, packets_recv=30567, errin=0, errout=0, dropin=0, dropout=0)}
>>>
>>> psutil.net_connections(kind='tcp')
[sconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254),
sconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987),
...]
>>>
>>> psutil.net_if_addrs()
{'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None),
snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),
snicaddr(family=<AddressFamily.AF_LINK: 17>, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)],
'wlan0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None),
snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None),
snicaddr(family=<AddressFamily.AF_LINK: 17>, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}
>>>
>>> psutil.net_if_stats()
{'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536, flags='up,loopback,running'),
'wlan0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500, flags='up,broadcast,running,multicast')}
>>>
传感器
>>> import psutil
>>> psutil.sensors_temperatures()
{'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)],
'asus': [shwtemp(label='', current=47.0, high=None, critical=None)],
'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0),
shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0)]}
>>>
>>> psutil.sensors_fans()
{'asus': [sfan(label='cpu_fan', current=3200)]}
>>>
>>> psutil.sensors_battery()
sbattery(percent=93, secsleft=16628, power_plugged=False)
>>>
其他系统信息
>>> import psutil
>>> psutil.users()
[suser(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0, pid=1352),
suser(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0, pid=1788)]
>>>
>>> psutil.boot_time()
1365519115.0
>>>
进程管理
>>> import psutil
>>> psutil.pids()
[1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224, 268, 1215,
1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355, 2637, 2774, 3932,
4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 4263, 4282, 4306, 4311,
4312, 4313, 4314, 4337, 4339, 4357, 4358, 4363, 4383, 4395, 4408, 4433,
4443, 4445, 4446, 5167, 5234, 5235, 5252, 5318, 5424, 5644, 6987, 7054,
7055, 7071]
>>>
>>> p = psutil.Process(7055)
>>> p
psutil.Process(pid=7055, name='python3', status='running', started='09:04:44')
>>> p.pid
7055
>>> p.name()
'python3'
>>> p.exe()
'/usr/bin/python3'
>>> p.cwd()
'/home/giampaolo'
>>> p.cmdline()
['/usr/bin/python3', 'main.py']
>>>
>>> p.ppid()
7054
>>> p.parent()
psutil.Process(pid=4699, name='bash', status='sleeping', started='09:06:44')
>>> p.parents()
[psutil.Process(pid=4699, name='bash', started='09:06:44'),
psutil.Process(pid=4689, name='gnome-terminal-server', status='sleeping', started='0:06:44'),
psutil.Process(pid=1, name='systemd', status='sleeping', started='05:56:55')]
>>> p.children(recursive=True)
[psutil.Process(pid=29835, name='python3', status='sleeping', started='11:45:38'),
psutil.Process(pid=29836, name='python3', status='waking', started='11:43:39')]
>>>
>>> p.status()
'running'
>>> p.create_time()
1267551141.5019531
>>> p.terminal()
'/dev/pts/0'
>>>
>>> p.username()
'giampaolo'
>>> p.uids()
puids(real=1000, effective=1000, saved=1000)
>>> p.gids()
pgids(real=1000, effective=1000, saved=1000)
>>>
>>> p.cpu_times()
pcputimes(user=1.02, system=0.31, children_user=0.32, children_system=0.1, iowait=0.0)
>>> p.cpu_percent(interval=1.0)
12.1
>>> p.cpu_affinity()
[0, 1, 2, 3]
>>> p.cpu_affinity([0, 1]) # set
>>> p.cpu_num()
1
>>>
>>> p.memory_info()
pmem(rss=10915840, vms=67608576, shared=3313664, text=2310144, lib=0, data=7262208, dirty=0)
>>> p.memory_full_info() # "real" USS memory usage (Linux, macOS, Win only)
pfullmem(rss=10199040, vms=52133888, shared=3887104, text=2867200, lib=0, data=5967872, dirty=0, uss=6545408, pss=6872064, swap=0)
>>> p.memory_percent()
0.7823
>>> p.memory_maps()
[pmmap_grouped(path='/lib/x8664-linux-gnu/libutil-2.15.so', rss=32768, size=2125824, pss=32768, shared_clean=0, shared_dirty=0, private_clean=20480, private_dirty=12288, referenced=32768, anonymous=12288, swap=0),
pmmap_grouped(path='/lib/x8664-linux-gnu/libc-2.15.so', rss=3821568, size=3842048, pss=3821568, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=3821568, referenced=3575808, anonymous=3821568, swap=0),
pmmap_grouped(path='[heap]', rss=32768, size=139264, pss=32768, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=32768, referenced=32768, anonymous=32768, swap=0),
pmmap_grouped(path='[stack]', rss=2465792, size=2494464, pss=2465792, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=2465792, referenced=2277376, anonymous=2465792, swap=0),
...]
>>>
>>> p.io_counters()
pio(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632, read_chars=456232, write_chars=517543)
>>>
>>> p.open_files()
[popenfile(path='/home/giampaolo/monit.py', fd=3, position=0, mode='r', flags=32768),
popenfile(path='/var/log/monit.log', fd=4, position=235542, mode='a', flags=33793)]
>>>
>>> p.net_connections(kind='tcp')
[pconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'),
pconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING')]
>>>
>>> p.threads()
[pthread(id=5234, user_time=22.5, system_time=9.2891),
pthread(id=5237, user_time=0.0707, system_time=1.1)]
>>>
>>> p.num_threads()
4
>>> p.num_fds()
8
>>> p.num_ctx_switches()
pctxsw(voluntary=78, involuntary=19)
>>>
>>> p.nice()
0
>>> p.nice(10) # set
>>>
>>> p.ionice(psutil.IOPRIO_CLASS_IDLE) # IO priority (Win and Linux only)
>>> p.ionice()
pionice(ioclass=<IOPriority.IOPRIO_CLASS_IDLE: 3>, value=0)
>>>
>>> p.rlimit(psutil.RLIMIT_NOFILE, (5, 5)) # set resource limits (Linux only)
>>> p.rlimit(psutil.RLIMIT_NOFILE)
(5, 5)
>>>
>>> p.environ()
{'LC_PAPER': 'it_IT.UTF-8', 'SHELL': '/bin/bash', 'GREP_OPTIONS': '--color=auto',
'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg',
...}
>>>
>>> p.as_dict()
{'status': 'running', 'num_ctx_switches': pctxsw(voluntary=63, involuntary=1), 'pid': 5457, ...}
>>> p.is_running()
True
>>> p.suspend()
>>> p.resume()
>>>
>>> p.terminate()
>>> p.kill()
>>> p.wait(timeout=3)
<Exitcode.EX_OK: 0>
>>>
>>> psutil.test()
USER PID %CPU %MEM VSZ RSS TTY START TIME COMMAND
root 1 0.0 0.0 24584 2240 Jun17 00:00 init
root 2 0.0 0.0 0 0 Jun17 00:00 kthreadd
...
giampaolo 31475 0.0 0.0 20760 3024 /dev/pts/0 Jun19 00:00 python2.4
giampaolo 31721 0.0 2.2 773060 181896 00:04 10:30 chrome
root 31763 0.0 0.0 0 0 00:05 00:00 kworker/0:1
>>>
其他进程 API
>>> import psutil
>>> for proc in psutil.process_iter(['pid', 'name']):
... print(proc.info)
...
{'pid': 1, 'name': 'systemd'}
{'pid': 2, 'name': 'kthreadd'}
{'pid': 3, 'name': 'ksoftirqd/0'}
...
>>>
>>> psutil.pid_exists(3)
True
>>>
>>> def on_terminate(proc):
... print("process {} terminated".format(proc))
...
>>> # waits for multiple processes to terminate
>>> gone, alive = psutil.wait_procs(procs_list, timeout=3, callback=on_terminate)
>>>
Windows 服务
>>> list(psutil.win_service_iter())
[<WindowsService(name='AeLookupSvc', display_name='Application Experience') at 38850096>,
<WindowsService(name='ALG', display_name='Application Layer Gateway Service') at 38850128>,
<WindowsService(name='APNMCP', display_name='Ask Update Service') at 38850160>,
<WindowsService(name='AppIDSvc', display_name='Application Identity') at 38850192>,
...]
>>> s = psutil.win_service_get('alg')
>>> s.as_dict()
{'binpath': 'C:\\Windows\\System32\\alg.exe',
'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing',
'display_name': 'Application Layer Gateway Service',
'name': 'alg',
'pid': None,
'start_type': 'manual',
'status': 'stopped',
'username': 'NT AUTHORITY\\LocalService'}
使用 psutil 的项目
以下是一些我认为特别有趣的
移植
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。
源代码分发
psutil-6.0.0.tar.gz (508.1 kB 查看哈希值)
构建分发
psutil-6.0.0-cp37-abi3-win_amd64.whl (257.4 kB 查看哈希值)
psutil-6.0.0-cp37-abi3-win32.whl (253.6 kB 查看哈希值)
psutil-6.0.0-cp36-cp36m-win_amd64.whl (261.0 kB 查看哈希值)
psutil-6.0.0-cp36-cp36m-win32.whl (255.5 kB 查看哈希值)
psutil-6.0.0-cp27-none-win_amd64.whl (253.0 kB 查看哈希值)
psutil-6.0.0-cp27-none-win32.whl (249.8 kB 查看哈希值)
关闭
psutil-6.0.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2 |
|
MD5 | 5874bd773d2fe7da3c0817424f383033 |
|
BLAKE2b-256 | 18c78c6872f7372eb6a6b2e4708b88419fb46b857f7a2e1892966b851cc79fc9 |
关闭
psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 |
|
MD5 | ea04c5243e35f708c6c45380b241851e |
|
BLAKE2b-256 | 7c0663872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7 |
关闭
psutil-6.0.0-cp37-abi3-win_amd64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 |
|
MD5 | 34189005432c119fde809d99b317c38d |
|
BLAKE2b-256 | 7344561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79 |
关闭
psutil-6.0.0-cp37-abi3-win32.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d |
|
MD5 | 3ccc6dd87c8bea6e5587376e395967b8 |
|
BLAKE2b-256 | 8b202ff69ad9c35c3df1858ac4e094f20bd2374d33c8643cf41da8fd7cdcb78b |
关闭
psutil-6.0.0-cp36-cp36m-win_amd64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c |
|
MD5 | 085d567a054943f08a52917785c79356 |
|
BLAKE2b-256 | 088816dd53af4a84e719e27a5ad7db040231415d8caeb48f019bacafbb4d0002 |
关闭
psutil-6.0.0-cp36-cp36m-win32.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14 |
|
MD5 | 67aee064c6452f35a02d6421fd500615 |
|
BLAKE2b-256 | cdff39c38910cdb8f02fc9965afb520967a1e9307d53d14879dddd0a4f41f6f8 |
关闭
psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132 |
|
MD5 | af1504b1291de825befe4dab508c9287 |
|
BLAKE2b-256 | cd5f60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47 |
关闭
psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd |
|
MD5 | 2a232d2d2f99aa75a2068c6d72129556 |
|
BLAKE2b-256 | 1974f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24 |
关闭
psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0 |
|
MD5 | 9f6b5dfaa34d5ffa33f81227d3afd9be |
|
BLAKE2b-256 | 355672f86175e81c656a01c4401cd3b1c923f891b31fbcebe98985894176d7c9 |
关闭
psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 |
|
MD5 | b20faa47dac5d7798665052cd1718bd5 |
|
BLAKE2b-256 | 0b37f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf |
关闭
psutil-6.0.0-cp27-none-win_amd64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1 |
|
MD5 | c5517d69f2a14d0f679512acd953de65 |
|
BLAKE2b-256 | e13f2403aa9558bea4d3854b0e5e567bc3dd8e9fbc1fc4453c0aa9aafeb75467 |
关闭
哈希值 for psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c |
|
MD5 | c39ecfa852f728ba68d93c7aa97e451b |
|
BLAKE2b-256 | 14c0024ac5369ca160e9ed45ed09247d9d779c460017fbd9aa801fd6eb0f060c |
关闭
哈希值 for psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3 |
|
MD5 | 4c2514ddcda4351e005fb25c1259d150 |
|
BLAKE2b-256 | 81c98cb36769b6636d817be3414ebbb27a9ab3fbe6d13835d00f31e77e1fccce |
关闭
哈希值 for psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c |
|
MD5 | 81855a37f7808cd1af5a678c6338f133 |
|
BLAKE2b-256 | 522f44b7005f306ea8bfd24aa662b5d0ba6ea1daf29dbd0b6c7bbcd3606373ad |
关闭
哈希值 for psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0 |
|
MD5 | 6bdf23a474386e58fa2b4c8929811800 |
|
BLAKE2b-256 | 92a7083388ef0964a6d74df51c677b3d761e0866d823d37e3a8823551c0d375d |
关闭
哈希值 for psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6 |
|
MD5 | 35ce0ce7ea8c42b598b5176c09dae79a |
|
BLAKE2b-256 | 13e535ebd7169008752be5561cafdba3f1634be98193b85fe3d22e883f9fe2e1 |