Files
ezra-environment/tools/__pycache__/health_check.cpython-312.pyc

109 lines
15 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<00>5<EFBFBD>i<EFBFBD>%<00><00><><00>dZddlZddlZddlZddlZddlZddlmZddlmZGd<05>d<06>Z e
dk(r/e <09>Z e j<00>Z ee je <0A><00>yy)z<>
Ezra self-check / health monitoring script.
Checks all wizard infrastructure and reports status.
Epic: EZRA-SELF-001 / Phase 4 - Self-Monitoring
Author: Ezra (self-improvement)
<EFBFBD>N)<01>datetime)<01>Pathc<00><><00>eZdZdZd<02>Zddededefd<06>Ze de
eeffd<07><04>Z e de
eeffd<08><04>Z e de
eeffd <09><04>Z e de
eeffd
<EFBFBD><04>Ze dd ede
eeffd <0C><05>Ze de
eeffd <0A><04>Ze de
eeffd<0E><04>Ze de
eeffd<0F><04>Ze de
eeffd<10><04>Ze de
eeffd<11><04>Zdefd<12>Zddedefd<15>Zy)<19> HealthCheckz+Run health checks on Ezra's infrastructure.c<00>D<00>g|_tj<00>|_y<00>N)<03>results<74>time<6D>
start_time)<01>selfs <20>1/root/wizards/ezra/tests/../tools/health_check.py<70>__init__zHealthCheck.__init__s<00><00><19><04> <0C><1E>)<29>)<29>+<2B><04><0F><00>name<6D>critical<61>returnc<00><><00> |<02>\}}||rdnd||d<03>}|jj|<06>|S#t$r}|dt|<07>|d<03>}Yd}~<07>;d}~wwxYw)zRun a single health check.<2E>PASS<53>FAIL)r<00>status<75>detailr<00>ERRORN)<04> Exception<6F>strr <00>append)r r<00>fnr<00>okr<00>result<6C>es r <00>checkzHealthCheck.checksk<00><00> <0E><1B><14>J<EFBFBD>B<EFBFBD><06><1C>$&<26>&<26>F<EFBFBD> <20>$<24> <0E>F<EFBFBD> <0A> <0C> <0C><1B><1B>F<EFBFBD>#<23><15> <0A><><19> <0E><1C>!<21><1D>a<EFBFBD>&<26>$<24> <0E>F<EFBFBD><46> <0E>s<00>4<00> A<03>A<03>Ac<00><><00>tjd<01>}|j|jzdz }|j|jzdz }||z
|z dz}|dkD}||d<05>d|d<05>d|d<08>d <09>fS)
z&Check disk space (fail if < 2GB free).<2E>/i@<40>dg@<40>.1fz
GB free / z
GB total (<28>.0fz% used))<05>os<6F>statvfs<66>f_bavail<69>f_frsize<7A>f_blocks)<05>st<73>free_gb<67>total_gb<67>pct_usedrs r <00>check_disk_spacezHealthCheck.check_disk_space0s<><00><00><10>Z<EFBFBD>Z<EFBFBD><03>_<EFBFBD><02><15>;<3B>;<3B><12><1B><1B>,<2C><19>;<3B><07><16>K<EFBFBD>K<EFBFBD>"<22>+<2B>+<2B>-<2D>)<29><<3C><08><1D><07>'<27>8<EFBFBD>3<>s<EFBFBD>:<3A><08> <14>s<EFBFBD>]<5D><02><11>g<EFBFBD>c<EFBFBD>]<5D>*<2A>X<EFBFBD>c<EFBFBD>N<EFBFBD>*<2A>X<EFBFBD>c<EFBFBD>N<EFBFBD>RY<52>Z<>Z<>Zrc<00><><00>td<01>}|j<00>sy t|j<00>j <00><00>}t j |d<03>dd|<01>d<06>fS#ttf$rdcYSwxYw)z,Check if Hermes gateway is running for Ezra.z#/root/wizards/ezra/home/gateway.pid)FzNo gateway.pid foundrTzGateway running (PID <20>))Fz/Gateway PID file exists but process not running) r<00>exists<74>int<6E> read_text<78>stripr&<00>kill<6C>ProcessLookupError<6F>
ValueError)<02>pid_file<6C>pids r <00>check_hermes_gatewayz HealthCheck.check_hermes_gateway:s|<00><00><18>=<3D>><3E><08><17><EFBFBD><EFBFBD> <20>0<> M<01><15>h<EFBFBD>(<28>(<28>*<2A>0<>0<>2<>3<>C<EFBFBD> <0E>G<EFBFBD>G<EFBFBD>C<EFBFBD><11>O<EFBFBD><17>0<><13><05>Q<EFBFBD>7<>7<> 7<><37>"<22>J<EFBFBD>/<2F> M<01>L<> L<> M<01>s<00>AA#<00>#A7<03>6A7c<00>2<00>ddl} |jjdddi<01><06>}|jj|d<07><08>}t j
|j <00><00>}d d
|jd d <0C><00><00>fS#t$r}d d|<04><00>fcYd}~Sd}~wwxYw)zCheck Gitea API is reachable.rNz)http://143.198.27.163:3000/api/v1/version<6F>Accept<70>application/json<6F><01>headers<72><00><01>timeoutTzGitea <20>version<6F>unknownFzGitea unreachable: ) <09>urllib.request<73>request<73>Request<73>urlopen<65>json<6F>loads<64>read<61>getr)<05>urllib<69>req<65>resp<73>datars r <00>check_gitea_apizHealthCheck.check_gitea_apiGs<><00><00> <1E> 4<><18>.<2E>.<2E>(<28>(<28>;<3B>!<21>#5<>6<>)<29><0E>C<EFBFBD><1A>><3E>><3E>)<29>)<29>#<23>q<EFBFBD>)<29>9<>D<EFBFBD><17>:<3A>:<3A>d<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>*<2A>D<EFBFBD><17>6<EFBFBD>$<24>(<28>(<28>9<EFBFBD>i<EFBFBD>"@<40>!A<>B<>B<> B<><42><18> 4<><18>/<2F><01>s<EFBFBD>3<>3<> 3<><33> 4<>s<00>A5A<<00>< B<03>B<03> B<03>Bc<00><><00>tjdd<02>}|s<>td<03>}|j<00>rw|j <00>j <00>D]V}|j d<04>s<01>|jdd<06>dj<00>jd<07>jd<08>}n|sy d
d l }|jjd d |<00><00>dd<0F><02><10>}|jj|d<11><12>}tj|j<00><00>}dd|j!dd<16><00><00>fS#t"$r}dd|<07><00>fcYd }~Sd }~wwxYw)zCheck Gitea token validity.<2E> GITEA_TOKEN<45>z/root/wizards/ezra/home/.envz GITEA_TOKEN=<3D>=<3D><00>"<22>')FzNo GITEA_TOKEN foundrNz&http://143.198.27.163:3000/api/v1/userztoken r>)<02> Authorizationr=r?rArBTzAuthenticated as <20>loginrEFzToken invalid: )r&<00>getenvrr2r4<00>
splitlines<EFBFBD>
startswith<EFBFBD>splitr5rFrGrHrIrJrKrLrMr)<08>token<65>env_file<6C>linerNrOrPrQrs r <00>check_gitea_tokenzHealthCheck.check_gitea_tokenVs<<00><00><13> <09> <09>-<2D><12>,<2C><05><14><1B>:<3A>;<3B>H<EFBFBD><17><EFBFBD><EFBFBD> <20>$<24>.<2E>.<2E>0<>;<3B>;<3B>=<3D><1E>D<EFBFBD><1B><EFBFBD><EFBFBD>~<7E>6<> $<24>
<EFBFBD>
<EFBFBD>3<EFBFBD><01> 2<>1<EFBFBD> 5<> ;<3B> ;<3B> =<3D> C<> C<>C<EFBFBD> H<> N<> N<>s<EFBFBD> S<><05><1D><1E><15>0<>
0<> !<21><18>.<2E>.<2E>(<28>(<28>8<>,2<>5<EFBFBD>'<27>*:<3A>FX<46>Y<>)<29><0E>C<EFBFBD><1A>><3E>><3E>)<29>)<29>#<23>q<EFBFBD>)<29>9<>D<EFBFBD><17>:<3A>:<3A>d<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>*<2A>D<EFBFBD><17>,<2C>T<EFBFBD>X<EFBFBD>X<EFBFBD>g<EFBFBD>y<EFBFBD>-I<>,J<>K<>K<> K<><4B><18> 0<><18>O<EFBFBD>A<EFBFBD>3<EFBFBD>/<2F>/<2F> /<2F><> 0<>s<00>/A=D-<00>- E<03>6E<03><E<03>E<03>portc<00>
<00> tjtjtj<00>}|jd<01>|j d|f<02>|j <00>dd|<00><00>fS#t $r
dd|<00><00>fcYSwxYw)z!Check if llama-server is running.<2E>z 127.0.0.1Tzllama-server listening on :Fz llama-server not responding on :)<07>socket<65>AF_INET<45> SOCK_STREAM<41>
settimeout<EFBFBD>connect<63>closer)rd<00>ss r <00>check_llama_serverzHealthCheck.check_llama_serverps~<00><00> D<01><16> <0A> <0A>f<EFBFBD>n<EFBFBD>n<EFBFBD>f<EFBFBD>.@<40>.@<40>A<>A<EFBFBD> <0A>L<EFBFBD>L<EFBFBD><11>O<EFBFBD> <0A>I<EFBFBD>I<EFBFBD>{<7B>D<EFBFBD>)<29> *<2A> <0A>G<EFBFBD>G<EFBFBD>I<EFBFBD><17>6<>t<EFBFBD>f<EFBFBD>=<3D>=<3D> =<3D><><18> D<01><18><<3C>T<EFBFBD>F<EFBFBD>C<>C<> C<> D<01>s<00>A,A/<00>/B<03>Bc<00><><00>td<01>}|j<00>sy|j<00>j}t |j <00>j <00><00>}dd|<02>d|<01>d<06>fS)z0Check Ezra's memory file exists and has content.z*/root/wizards/ezra/home/memories/MEMORY.md)FzMEMORY.md not foundTz MEMORY.md: z lines, z bytes)rr2<00>stat<61>st_size<7A>lenr4r])<03>mem<65>size<7A>liness r <00>check_memory_filezHealthCheck.check_memory_file|s_<00><00><13>?<3F>@<40><03><12>z<EFBFBD>z<EFBFBD>|<7C>/<2F><12>x<EFBFBD>x<EFBFBD>z<EFBFBD>!<21>!<21><04><13>C<EFBFBD>M<EFBFBD>M<EFBFBD>O<EFBFBD>.<2E>.<2E>0<>1<><05><13>{<7B>5<EFBFBD>'<27><18>$<24><16>v<EFBFBD>><3E>><3E>>rc<00><><00>td<01>}|j<00>syg}|jd<03>D]'}|j|jj
<00><00>)t |<01>}|dkD}||<03>d<05>fS)zCount installed skills.z/root/wizards/ezra/home/skills)FzSkills directory not foundzSKILL.mdrz skills installed)rr2<00>rglobr<00>parentrrr)<05>
skills_dir<EFBFBD>skills<6C>p<>countrs r <00>check_skills_countzHealthCheck.check_skills_count<6E>sv<00><00><1A>:<3A>;<3B>
<EFBFBD><19> <20> <20>"<22>6<><13><06><1B>!<21>!<21>*<2A>-<2D> )<29>A<EFBFBD> <12>M<EFBFBD>M<EFBFBD>!<21>(<28>(<28>-<2D>-<2D> (<28> )<29><13>F<EFBFBD> <0B><05> <12>Q<EFBFBD>Y<EFBFBD><02><11>e<EFBFBD>W<EFBFBD>-<2D>.<2E>.<2E>.rc<00>
<00>td<01>}|j<00>sy tj|j <00><00>}t d<03>|D<00><00>}t |<01>}d|<02>d|<03>d<06>fS#t$r}dd|<04><00>fcYd }~Sd }~wwxYw)
zCheck cron jobs status.z&/root/wizards/ezra/home/cron/jobs.json)FzNo cron jobs.json foundc3<00>JK<00>|]}|jd<00>dk(s<01>d<02><01><00>y<03>w)r<00>activerWN)rM)<02>.0<EFBFBD>js r <00> <genexpr>z.HealthCheck.check_cron_jobs.<locals>.<genexpr><3E>s<00><00><><00>H<>q<EFBFBD>A<EFBFBD>E<EFBFBD>E<EFBFBD>(<28>O<EFBFBD>x<EFBFBD>,G<><11>H<>s<00>#<01>#Tz
active / z total cron jobsFzError reading jobs.json: N)rr2rJrKr4<00>sumrrr)<05> cron_file<6C>jobsr<73><00>totalrs r <00>check_cron_jobszHealthCheck.check_cron_jobs<62>s<><00><00><19>A<>B<> <09><18><1F><1F>!<21>3<> :<3A><17>:<3A>:<3A>i<EFBFBD>1<>1<>3<>4<>D<EFBFBD><18>H<>D<EFBFBD>H<>H<>F<EFBFBD><17><04>I<EFBFBD>E<EFBFBD><17>F<EFBFBD>8<EFBFBD>:<3A>e<EFBFBD>W<EFBFBD>4D<34>E<>E<> E<><45><18> :<3A><18>5<>a<EFBFBD>S<EFBFBD>9<>9<> 9<><39> :<3A>s<00>A A(<00>( B<03>1A=<03>7B<03>=Bc<00><><00>td<01>}|j<00>sy|j<00>jdz }dd|d<06>d<07>fS)zCheck sessions database.z /root/wizards/ezra/home/state.db)Fzstate.db not foundiTz
state.db: r$<00>MB)rr2rprq)<02>db_path<74>size_mbs r <00>check_sessions_dbzHealthCheck.check_sessions_db<64>sH<00><00><17>9<>:<3A><07><16>~<7E>~<7E><1F>.<2E><19>,<2C>,<2C>.<2E>(<28>(<28>K<EFBFBD>8<><07><13>z<EFBFBD>'<27>#<23><1D>b<EFBFBD>1<>1<>1rc<00>\<00>td<01>}|j<00>syt|jd<03>d<04>d<05><06>}|st|jd<07>d<08>d<05><06>}|sy |d
}t j<00>|j <00>j z
d z }|d kd |j<00>d|d<0F>d<10>fS)zCheck backup freshness.z/root/wizards/ezra/backups)FzNo backups directoryz*.tar.gzc<00>6<00>|j<00>jSr<00>rp<00>st_mtime<6D>r|s r <00><lambda>z+HealthCheck.check_backups.<locals>.<lambda><3E>s<00><00>A<EFBFBD>F<EFBFBD>F<EFBFBD>H<EFBFBD>DU<44>DU<44>rT)<02>key<65>reverse<73>*c<00>6<00>|j<00>jSrr<>r<>s r r<>z+HealthCheck.check_backups.<locals>.<lambda><3E>s<00><00><11><16><16><18>AR<41>AR<41>r)FzNo backups foundri<00>0zLatest: z (r%zh ago))rr2<00>sorted<65>globr
rpr<>r)<04>
backup_dir<EFBFBD>backups<70>latest<73> age_hourss r <00> check_backupszHealthCheck.check_backups<70>s<><00><00><1A>6<>7<>
<EFBFBD><19> <20> <20>"<22>0<><18><1A><1F><1F><1A>4<>:U<>_c<5F>d<><07><16><1C>Z<EFBFBD>_<EFBFBD>_<EFBFBD>S<EFBFBD>1<>7R<37>\`<60>a<>G<EFBFBD><16>,<2C><18><11><1A><06><19>Y<EFBFBD>Y<EFBFBD>[<5B>6<EFBFBD>;<3B>;<3B>=<3D>#9<>#9<>9<>T<EFBFBD>A<> <09><18>2<EFBFBD>~<7E><18>&<26>+<2B>+<2B><1D>b<EFBFBD><19>3<EFBFBD><0F>v<EFBFBD>N<>N<>Nrc <00><><00>|jd|jd<02><03>|jd|jd<02><03>|jd|jd<02><03>|jd|jd<02><03>|jd|j
d<08><03>|jd |j d<08><03>|jd
|jd<08><03>|jd |jd<08><03>|jd |jd<08><03>|jd |jd<08><03>tj<00>|jz
}td<0E>|jD<00><00>}td<0F>|jD<00><00>}td<10>|jD<00><00>}tj <00>j#<00>t%|d<11>t'|j<00>||||dk(|jd<13>S)zRun all health checks.z
Disk SpaceT)rzHermes Gatewayz Gitea APIz Gitea Tokenz llama-serverFz Memory File<6C>Skillsz Cron Jobsz Sessions DB<44>Backupsc3<00>2K<00>|]}|ddk(s<01> d<02><01><00>y<03>w)rrrWN<><00>r<><00>rs r r<>z&HealthCheck.run_all.<locals>.<genexpr><3E>s<00><00><><00>F<>1<EFBFBD><01>(<28> <0B>v<EFBFBD>0E<30>Q<EFBFBD>F<>s<00> <01>c3<00>0K<00>|]}|ddvs<01> d<02><01><00>y<03>w)r<00>rrrWNr<4E>r<>s r r<>z&HealthCheck.run_all.<locals>.<genexpr><3E>s<00><00><><00>Q<>1<EFBFBD><01>(<28> <0B>?P<>0P<30>Q<EFBFBD>Q<>s<00> <01>c3<00><K<00>|]}|ddvs<01> |ds<01>d<03><01><00>y<04>w)rr<>rrWNr<4E>r<>s r r<>z&HealthCheck.run_all.<locals>.<genexpr><3E>s%<00><00><><00>f<>a<EFBFBD>1<EFBFBD>X<EFBFBD>;<3B>BS<42>3S<33>XY<58>Zd<5A>Xe<58><01>f<>s <00> <01><01><01>r)<08> timestamp<6D>elapsed_secondsr<73><00>passed<65>failed<65>critical_failures<65>healthy<68>checks)r r/r;rRrcrnrvr~r<>r<>r<>r
r r<>r r<00>now<6F> isoformat<61>roundrr)r <00>elapsedr<64>r<><00> crit_fails r <00>run_allzHealthCheck.run_all<6C>s<><00><00> <0C>
<EFBFBD>
<EFBFBD><<3C><14>!6<>!6<><14>
<EFBFBD>F<> <0C>
<EFBFBD>
<EFBFBD>#<23>T<EFBFBD>%><3E>%><3E><14>
<EFBFBD>N<> <0C>
<EFBFBD>
<EFBFBD>;<3B><04> 4<> 4<>t<EFBFBD>
<EFBFBD>D<> <0C>
<EFBFBD>
<EFBFBD>=<3D>$<24>"8<>"8<>4<EFBFBD>
<EFBFBD>H<> <0C>
<EFBFBD>
<EFBFBD>><3E>4<EFBFBD>#:<3A>#:<3A>U<EFBFBD>
<EFBFBD>K<> <0C>
<EFBFBD>
<EFBFBD>=<3D>$<24>"8<>"8<>5<EFBFBD>
<EFBFBD>I<> <0C>
<EFBFBD>
<EFBFBD>8<EFBFBD>T<EFBFBD>4<>4<>u<EFBFBD>
<EFBFBD>E<> <0C>
<EFBFBD>
<EFBFBD>;<3B><04> 4<> 4<>u<EFBFBD>
<EFBFBD>E<> <0C>
<EFBFBD>
<EFBFBD>=<3D>$<24>"8<>"8<>5<EFBFBD>
<EFBFBD>I<> <0C>
<EFBFBD>
<EFBFBD>9<EFBFBD>d<EFBFBD>0<>0<>5<EFBFBD>
<EFBFBD>A<><16>)<29>)<29>+<2B><04><0F><0F>/<2F><07><14>F<><04> <0C> <0C>F<>F<><06><14>Q<><04> <0C> <0C>Q<>Q<><06><17>f<>4<EFBFBD><<3C><<3C>f<>f<> <09>"<22><1C><1C><1E>1<>1<>3<>$<24>W<EFBFBD>a<EFBFBD>0<><18><14><1C><1C>&<26><1C><1C>!*<2A> <20>A<EFBFBD>~<7E><1A>l<EFBFBD>l<EFBFBD> 
<EFBFBD>
rNrc <00><00>|<01>|j<00>}d|ddd<00><00>dd|drdnd <09>d
|d <00>d |d <00>d|d<00>d<10> dddg}|dD]U}dddd<17>j|dd<19>}|dr
|ddk7rdnd}|jd|d<00>d|<04>d |d<00>|<05>d|d!<00>d"<22>
<EFBFBD><00>W|d#d$kDrI|jdd%g<02>|dD].}|ds<01> |ddk7s<01>|jd&|d<00>d'|d!<00><00><04><00>0d(j |<02>S))z(Format health check results as markdown.Nz# Ezra Health Check - r<><00>rUz
**Status: r<><00>HEALTHY<48> UNHEALTHYz** | r<>r"r<>z
passed | r<>rmz| Check | Status | Detail |z|-------|--------|--------|r<>u✅u❌u⚠️)rrrr<00>?rru 🔴z| rz | <20> rz |r<>rz## Critical Failuresz- **z**: <20>
)r<>rMr<00>extend<6E>join)r rru<00>c<>icon<6F>crits r <00> format_reportzHealthCheck.format_report<72>s<><00><00> <11>><3E><19>\<5C>\<5C>^<5E>F<EFBFBD>%<25>V<EFBFBD>K<EFBFBD>%8<><13>"<22>%=<3D>$><3E> ?<3F> <0E><18>f<EFBFBD>Y<EFBFBD>&7<><19>[<5B>I<><15><15>h<EFBFBD><1F> <20><01>&<26><17>/<2F>!2<>*<2A><15>'<27>(<28>)<29><11> ,<2C> <0F> )<29> )<29> 
<EFBFBD><05><18><08>!<21> Z<01>A<EFBFBD>!<21>5<EFBFBD>8<EFBFBD>D<>H<>H<><11>8<EFBFBD><1B>VY<56>Z<>D<EFBFBD><1F>
<EFBFBD>m<EFBFBD><01>(<28> <0B>v<EFBFBD>0E<30>7<EFBFBD>2<EFBFBD>D<EFBFBD> <11>L<EFBFBD>L<EFBFBD>2<EFBFBD>a<EFBFBD><06>i<EFBFBD>[<5B><03>D<EFBFBD>6<EFBFBD><11>1<EFBFBD>X<EFBFBD>;<3B>-<2D><04>v<EFBFBD>S<EFBFBD><11>8<EFBFBD><1B> <0A>UW<55>X<> Y<> Z<01>
<12>%<25> &<26><11> *<2A> <11>L<EFBFBD>L<EFBFBD>"<22>4<>5<> 6<><1B>H<EFBFBD>%<25> F<01><01><14>Z<EFBFBD>=<3D>Q<EFBFBD>x<EFBFBD>[<5B>F<EFBFBD>%:<3A><19>L<EFBFBD>L<EFBFBD>4<EFBFBD><01>&<26> <09>{<7B>$<24>q<EFBFBD><18>{<7B>m<EFBFBD>!D<>E<> F<01><14>y<EFBFBD>y<EFBFBD><15><1F>r)F)i<>,r)<18>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__rr<00>bool<6F>dictr <00> staticmethod<6F>tupler/r;rRrcr3rnrvr~r<>r<>r<>r<>r<>r<>rr rrs<><00><00>5<>&<26><16>#<23><16>T<EFBFBD><16>d<EFBFBD><16>,<12>[<01>e<EFBFBD>D<EFBFBD>#<23>I<EFBFBD>.<2E>[<01><12>[<01><12>
M<01>%<25><04>c<EFBFBD> <09>"2<>
M<01><12>
M<01><12> 4<>U<EFBFBD>4<EFBFBD><13>9<EFBFBD>-<2D> 4<><12> 4<><12>0<>u<EFBFBD>T<EFBFBD>3<EFBFBD>Y<EFBFBD>/<2F>0<><12>0<>2<12> D<01><13> D<01><15>t<EFBFBD>S<EFBFBD>y<EFBFBD>1A<31> D<01><12> D<01><12>?<3F>u<EFBFBD>T<EFBFBD>3<EFBFBD>Y<EFBFBD>/<2F>?<3F><12>?<3F><12>
/<2F><05>d<EFBFBD>C<EFBFBD>i<EFBFBD> 0<>
/<2F><12>
/<2F><12> :<3A>U<EFBFBD>4<EFBFBD><13>9<EFBFBD>-<2D> :<3A><12> :<3A><12>2<>u<EFBFBD>T<EFBFBD>3<EFBFBD>Y<EFBFBD>/<2F>2<><12>2<><12> O<01>5<EFBFBD><14>s<EFBFBD><19>+<2B> O<01><12> O<01> 
<EFBFBD><14>
<EFBFBD>: <20>D<EFBFBD> <20>C<EFBFBD> rr<00>__main__)r<>rJr&<00>
subprocessrgr
r<00>pathlibrrr<><00>hcr<63><00>report<72>printr<74>r<>rr <00><module>r<>sb<00><01><04> <0C> <09><11> <0A> <0B><1D><18>_ <20>_ <20>D <0C>z<EFBFBD><19> <14><1D>B<EFBFBD> <0F>Z<EFBFBD>Z<EFBFBD>\<5C>F<EFBFBD> <09>"<22>
<1A>
<1A>6<EFBFBD>
"<22>#<23>r