ML i UdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z m Z ddlmZddlmZddlmZmZmZddlmZdd lmZdd lmZdd lmZdd lm Z m!Z!m"Z"dd l#m$Z$ddl%m&Z&ddl'm(Z(m)Z)ddl*m+Z+ ddl,m-Z-dZ.ej`e)jbdfe)jddfe)jfdfe)jhdfe)jjdfe)jldfe)jndfgZ8de9d<e:e;ede9d <iZ?d!e9d"<Gd#dZ@Gd$de %ZA dS dTd&ZBdUd'ZCdVd(ZDdWd)ZEGd*d+e&ZFGd,d-eAZGeBd.eGGd/d0eAZHeBd1eHGd2d3e&ZIGd4d5eAZJeBd6eJGd7d8ZKGd9d:eAZLeBd;eLd<dXd=ZMGd>d?ZNGd@dAeAZOeBdBeOd<GdCdDeAZPGdEdFePZQeBdGeQd<GdHdIePZReBdJeRd<GdKdLePZSeBdMeSd<eCdJdNeCdMdOGdPdQeAZTeBdReTeUe?eUek(sJy#e/$rdZ.YwxYw)Yz5Classes for producing HTML reports about imprecision.) annotationsN)ABCMetaabstractmethod)Iterator) attrgetter)AnyCallableFinal) TypeAlias) pathname2url)stats)REPORTER_NAMES) ExpressionFuncDefMypyFile)Options)TraverserVisitor)Type TypeOfAny) __version__)etreeTF UnannotatedExplicit UnimportedzOmitted GenericsErrorz Special FormzImplementation Artifactz(Final[collections.OrderedDict[int, str]]type_of_any_name_mapReportsAbstractReporter _TypeAliasReporterClasseszFinal[ReporterClasses]reporter_classesc@eZdZddZddZ ddZd dZy) rc||_g|_i|_t|j D]\}}|j ||yN)data_dir reportersnamed_reporterssorteditems add_report)selfr% report_dirs report_type report_dirs Q/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/mypy/report.py__init__zReports.__init__7sH  13<>'-k.?.?.A'B 5 #K OOK 4 5c2 |j|S#t$rYnwxYwt|\}}|r6ts0t dj |t jt|||}|jj|||j|<|S)NzYou must install the lxml package before you can run mypy with `--{}-report`. You can do this with `python3 -m pip install lxml`.)file) r'KeyErrorr!LXML_INSTALLEDprintformatsysstderr ImportErrorr&append)r+r-r. reporter_cls needs_lxmlreporters r/r*zReports.add_report?s '' 4 4   #3K#@ j n J&%ZZ   j1 h',4[)s  cN|jD]}|j||||yr$)r&on_file)r+treemodulestype_mapoptionsr>s r/r3z Reports.fileTs+ ?H   T7Hg > ?r1cF|jD]}|jyr$)r& on_finish)r+r>s r/finishzReports.finish^s! !H     !r1N)r%strr,dict[str, str]returnNone)r-rHr.rHrJr rArrBzdict[str, MypyFile]rCzdict[Expression, Type]rDrrJrKrJrK)__name__ __module__ __qualname__r0r*r3rGr1r/rr6sF5*??%?) ?  ?  ?!r1cLeZdZddZe ddZeddZy)rcL||_|dk7rtj|dyy)NTexist_ok) output_dirosmakedirs)r+reportsrWs r/r0zAbstractReporter.__init__ds$$  # KK T 2 $r1cyr$rQr+rArBrCrDs r/r@zAbstractReporter.on_fileis r1cyr$rQr+s r/rFzAbstractReporter.on_finishss r1NrZrrWrHrJrKrLrM)rNrOrPr0rr@rFrQr1r/rrcs_3   % )         r1) metaclassc||ft|<yr$r!) report_namer>r=s r/register_reporterrdxs &.z$:[!r1c$t|t|<yr$rb)source_reportertarget_reporters r/alias_reporterrhs(8(I_%r1ctj|ry|jdryd|jdvs!d|jtj vryy)NT..stubs/F)r is_special_module startswithsplitrXsep)paths r/should_skip_pathrrsL t$ t$**S/!W 2660B%B r1c#K tj|5}t|dEd{dddy7 #1swYyxYw#t$rYywxYww)zDReturn an iterator over (line number, line text) from a Python file.N)tokenizeopen enumerateIsADirectoryError)rq input_files r/iterate_python_linesrzsW ]]4  0J Q/ / / 0 0 / 0 0    sRAA979AA9AAAA AAAAc(eZdZdfd ZddZxZS)FuncCounterVisitorc4t|ddg|_yNrsuperr0counts)r+ __class__s r/r0zFuncCounterVisitor.__init__s !f r1cJ|j|jduxxdz cc<yNrt)rtype)r+defns r/visit_func_defz!FuncCounterVisitor.visit_func_defs DIIT)*a/*r1rMrrrJrK)rNrOrPr0r __classcell__rs@r/r|r|s 0r1r|cDeZdZdfd Z ddZddZxZS)LineCountReporterc4t|||i|_yr$rr+rZrWrs r/r0zLineCountReporter.__init__s *-<> r1c| t|jd5}t|j}dddt }|j ||j\}} | |z} |jrd} | r| z| zn} | || | f|j|j<y#1swYpxYw#t$rd}YwxYw)Nrbr) rvrqlen readlinesrxr|acceptr ignore_errors _fullname) r+rArBrCrDfphysical_lines func_counterunannotated_funcsannotated_funcs total_funcsimputed_annotated_liness r/r@zLineCountReporter.on_files dii& 4!!$Q[[]!3 4 *+  L!-9-@-@*?%(99   O@KN_ , ;P^ $    '  DNN#' 4 4  N s'B-B!B-!B*&B-- B;:B;ctd|jjDdtfdt dD}t t jj|jdd5}|jdj|D]5\}}|j|d d d |d d d |d dd |ddd |d 7 dddy#1swYyxYw)Nc3*K|] \}}||f ywr$rQ).0pcs r/ z.LineCountReporter.on_finish..s 41aV 4sT)reversec3HK|]tfdDyw)c3.K|] \}}|ywr$rQ)rrris r/rz8LineCountReporter.on_finish...s 9$!Q1 9sN)sum)rrrs @r/rz.LineCountReporter.on_finish..sLaS 9& 99Ls"z linecount.txtwz{:7} {:7} {:6} {:6} total r7 rt6 ) r(rr)tuplerangervrXrqjoinrWwriter7)r+ total_countsrrrrs @r/rFzLineCountReporter.on_finishs>D 4 1 1 3 4d? L58LL "'',,t@# F F! GG8188,G H F11Q4(!AaD81QqT!HAad1XQqcDE F F F Fs ?AC""C+r_rLrM)rNrOrPr0r@rFrrs@r/rrsD?" " %" ) "  "  " HFr1r linecountcteZdZdZdfd Z d dZd dZ d dZd dZd dZ xZ S) AnyExpressionsReporterz3Report frequencies of different kinds of Any types.cBt|||i|_i|_yr$)rr0rany_types_counterrs r/r0zAnyExpressionsReporter.__init__s! *-24 FHr1ctjd|j||dd}|j||j|j |j<t |jjjtj}|j|z}|j|jz|z}|dkDr||f|j|j<yy)NTF)inferredfilenamerBtypemap all_nodesvisit_untyped_defsr)r StatisticsVisitorfullnamertype_of_any_counterrlistline_mapvaluescountTYPE_UNANALYZED num_any_exprsnum_imprecise_exprsnum_precise_exprsr) r+rArBrCrDvisitornum_unanalyzed_linesnum_any num_totals r/r@zAnyExpressionsReporter.on_files))]]$   G070K0Kt}}-#G$4$4$;$;$=>DDUEZEZ[''*>>//'2K2KKgU q=*19)=DKK & r1cD|j|jyr$)_report_any_exprs_report_types_of_anysr^s r/rFz AnyExpressionsReporter.on_finishs   ""$r1c t|tfd|||gzDsJd}dgz}|||gzD]0}t|D] \}} t||t| ||<"2t|D]\}} |dkDs | |z||<t t j j|j|d5} dt|zjtjt||} dt| z} | j| dz| j| dz|D]K}dt|zjtjt||}| j|dzM| j| dzdt|zjtjt||}| j|dzdddy#1swYyxYw) Nc3:K|]}t|k(ywr$r)rrowrow_lens r/rz;AnyExpressionsReporter._write_out_report..sJ33s8w&Jsrrrz{:>{}}-r)rallrwmaxrvrXrqrrWr7 itertoolschainzipr)r+rheaderrowsfootermin_column_distancewidthsrrvaluerr header_str separator row_valuesr footer_strrs @r/_write_out_reportz(AnyExpressionsReporter._write_out_reportsf+J$&&9I2IJJJJ66** 7C%cN 75q 3u:6q  7 7f% 4DAq1u 33q  4"'',,t93 ? '18(S[088)//3vW]K^:_`Jc*o-I GGJ% & GGI$ %" " 3XF +33Y__c*V\F]5^_D! " GGI$ %8(S[088)//3vW]K^:_`J GGJ% & ' ' 's ?DG!!G*crtd|jjD}td|jjD}d}|dkDrt||z t|z dz}gd}g}t |jD]^}|j|\}}t||z t|z dz} | dd} |j |t |t || g`|jd d t |t ||ddg} |jd ||| y) Nc3&K|] \}}| ywr$rQ)rr_s r/rz;AnyExpressionsReporter._report_any_exprs..sGJGQGc3&K|] \}}| ywr$rQ)rrtotals r/rz;AnyExpressionsReporter._report_any_exprs..sD81eDrgY@rd)NameAnysExprsCoveragez.2f%c |dSr~rQxs r/z:AnyExpressionsReporter._report_any_exprs..$ !r1keyTotalz any-exprs.txt) rrrfloatr(r;rHsortr) r+ total_any total_exprtotal_coverage column_namesrrrrcoverage coverage_str total_rows r/rz(AnyExpressionsReporter._report_any_exprss-G$++2D2D2FGG Dt{{/A/A/CDD  >#J$:;eJ>OOSVVN< "t{{+ PH#';;x#8 Wii'12U95EELH&s^1-L KK3w<YN O  P n %c)nc*o.QTAUUV?WX   dINr1c Vtj}|jjD]'}|j D]\}}||xx|z cc<)d}d}|gt t jz}g}|jj D]8\} }|j| gt D cgc]} t|| c} z:|jd|gt D cgc]} t|| c} z} |jd||| ycc} wcc} w)Nrrc |dSr~rQrs r/rz>AnyExpressionsReporter._report_types_of_anys..3rr1rztypes-of-anys.txt) collectionsCounterrrr)rrr;rHrr) r+ total_countercounterany_typerfile_column_nametotal_row_namerrrtyprs r/rz,AnyExpressionsReporter._report_types_of_anys(s!2=2E2E2G --446 1G#*==? 1%h'50' 1 1" ()D1E1L1L1N,OO "!%!7!7!=!=!? Z Hg KK CW%XCc'#,&7%XX Y Z n %#$K_'`CM#,>(?'``  2L$ R&Y'`s 5D! 2D&r_rLrM) rrHr list[str]rzlist[list[str]]rrrJrK) rNrOrP__doc__r0r@rFrrrrrs@r/rrs=I >>%>) >  >  >0%''%.'6E'OX' '4O$ Sr1rz any-exprsc0eZdZddZddZdfd ZxZS)LineCoverageVisitorcF||_|Dcgc]}dc}|_ycc}w)N)rT)source lines_covered)r+rls r/r0zLineCoverageVisitor.__init__<s! 399Qj99s c|j|}d}t|D]/}|dk(r|dz }|dk(r d|dzdzz}|dk(ry|dk(ry|cSy) zReturn the indentation of a line of the source (specified by zero-indexed line number). Returns None for blank lines or comments.rrrt #Nr)rr)r+ line_numberlineindentchars r/indentation_levelz%LineCoverageVisitor.indentation_levelPst{{;'J Ds{! vza/0  "r1c.|jdz }d}|t|jkr2|j|}|n|dz }|t|jkr2|y|dz}|}|t|jkr@|j|}||dz }n||kDr|dz }|}nn|t|jkr@|jdu}t ||D]+}|j |\} } | |ks||f|j |<-t |!|yr) rrrr!rrrrr) r+r start_line start_indentcur_lineend_line cur_indentis_typedr old_indentrrs r/rz"LineCoverageVisitor.visit_func_defhs>YY]  3t{{++11*=L' !OJ 3t{{++   >T[[))//9J!A l*A #T[[))99D(*h/ DD ..t4MJ \),8(+C""4( D t$r1)rrrJrK)rintrJz int | Noner)rNrOrPr0r!rrrs@r/rr;s:(0+%+%r1rcHeZdZdZdfd Z ddZddZxZS)LineCoverageReportera[Exact line coverage reporter. This reporter writes a JSON dictionary with one field 'lines' to the file 'coverage.json' in the specified report directory. The value of that field is a dictionary which associates to each source file's absolute pathname the list of line numbers that belong to typed functions in that file. c4t|||i|_yr$)rr0rrs r/r0zLineCoverageReporter.__init__s *-35r1ct|j5}|j}dddt}|j |g}t |j D]\} \} } | s |j| dz!||j tjj|j<y#1swYxYwr) rvrqrrrrwrr;rXabspath) r+rArBrCrDr tree_sourcecoverage_visitor covered_linesrrtypeds r/r@zLineCoverageReporter.on_files$))_ (++-K (/{; $% '01A1O1O'P 6 #K!U$$[1_5 6:G277??49956 ( (s B;;Ccttjj|jdd5}t j d|ji|dddy#1swYyxYw)Nz coverage.jsonrlines)rvrXrqrrWjsondumpr)r+rs r/rFzLineCoverageReporter.on_finishsO "'',,t@# F 8! IIw 2 23Q 7 8 8 8s #A!!A*r_rLrMrNrOrPrr0r@rFrrs@r/r,r,sM6GG%G) G  G  G(8r1r, linecoveragec$eZdZddZddZddZy)FileInfocd||_||_dgttjz|_yr~)namemodulerr precision_namesr)r+r=r>s r/r0zFileInfo.__init__s)  cC 5 566 r1c,t|jSr$)rrr^s r/rzFileInfo.totals4;;r1ctttj|jDcic]\}}|t |c}}Scc}}wr$)r(rr r?rrH)r+r=vals r/attribzFileInfo.attribs;06s5;P;PRVR]R]7^0_`94c#h```sA N)r=rHr>rHrJrK)rJr*)rJrI)rNrOrPr0rrCrQr1r/r;r;s7  ar1r;ceZdZUdZd fd Zej djdedDdZ de d< d d Z e dd Z dd ZxZS)MemoryXmlReporterz}Internal reporter that generates XML in memory. This is used by all other XML-based reporters to avoid duplication. ct|||tjj |j dd|_tjj |j dd|_tjj |j dd|_tjj |j dd}tjtj||_ d|_ g|_y)Nxmlmypy-html.xsltz mypy-txt.xslt mypy-html.csszmypy.xsd)rr0rXrqrr%xslt_html_path xslt_txt_path css_html_pathr XMLSchemaparseschemalast_xmlfiles)r+rZrWxsd_pathrs r/r0zMemoryXmlReporter.__init__s *- ggll7+;+;UDTUWW\\'*:*:E?SWW\\'*:*:E?S77<< 0 0%Dooekk(&;< $( %' r1c#>K|]}|dk7s t|yw) N)chr)rrs r/rzMemoryXmlReporter.s0UAaSTfQ0Us  z???????????????????????????????r control_fixerc d|_ tjj|j}t |stjj |rytjd|j||d}|j|tjd||j}tj|}t||j} t!|D]\} } |j"j%| tj&} | j(| xxdz cc<tj*|d|j-|| | j/dj1|j2t5| tj6| tjjd |} tj8d d t;| d }|j=||j>jA|||_|jBjE| y#t$rYywxYw) NTrrrBrrzmypy-report-file)r=r>rtrr)any_infocontentnumber precisionrHxml-stylesheettype="text/xsl" href="")#rPrXrqrelpath ValueErrorrrisdirr rrrrElementr ElementTreer;rzrget TYPE_EMPTYr SubElement_get_any_info_for_linerstrip translaterXrHr?ProcessingInstructionr addpreviousrO assertValidrQr;)r+rArBrCrDrqrrootdoc file_infolineno line_textstatus xslt_path transform_pis r/r@zMemoryXmlReporter.on_files  77??499-D D !RWW]]4%8 ))]]   G}}/d4>>R%T4>>2 !5d!;  FI%%))&%2B2BCF   V $ ) $   44WfE!((.889K9KL6{//7   GGOO$4d; 22  6|I7N6OqQ  & $  )$O   s)H22 H>=H>c||jvrnd}tj}|j|D]}||jxxdz cc<|j D]\}}|dt |d|dz }|Sy)NzAny Types on this line: rtrz (x)zNo Anys on this line!) any_line_mapr r  type_of_anyr)r)rrsresultr rr  occurrencess r/rjz(MemoryXmlReporter._get_any_info_for_lines W)) )/F0;0C0C0EG++F3 .(A-( .)0 Q%+B3H=>c+aPP QM*r1c Nd|_t|jd}tjdd}tj |}|D]_}tj |d|j|jt|jt|jatjjdd }tj d d t|d }|j#||j$j'|||_y) Nc|jSr$r>rs r/rz-MemoryXmlReporter.on_finish..' r1rzmypy-report-indexindex)r=r3)r>r=rrH.r_r`ra)rPr(rQrrerfrirCr>r r=rHrrXrqrbrmrnrOro)r+ output_filesrprqrrrvrws r/rFzMemoryXmlReporter.on_finish$s djj.@A }}0w?%% I     " ''!)..1)//+,   GGOO$4c: 22  6|I7N6OqQ  & $ r1r_rL)rzstats.StatisticsVisitorrsr*rJrHrM)rNrOrPrr0rH maketransrrrX__annotations__r@ staticmethodrjrFrrs@r/rErEs (==0Ur0U)UW_`M5`2%2%%2%) 2%  2%  2%h + +r1rE memory-xml)r=c0|dk(r tdS||z dS)Nrg?z.4f)rH)r2 total_liness r/ get_line_raterBs#a3x+-c23r1c(eZdZdZddZddZddZy) CoberturaPackagezMContainer for XML and statistics mapping python modules to Cobertura package.cJ||_i|_i|_d|_d|_yr~)r=classespackagesrr2)r+r=s r/r0zCoberturaPackage.__init__Ls' ') 57 r1ctjdd|j}d|jd<t |j |j |jd<tj|d}t|jD] }|j|j|"|j||S)Npackage1.0) complexityr=0 branch-rate line-rater) rrer=rCrr2rrir(rr; add_packages)r+package_elementclasses_element class_names r/as_xmlzCoberturaPackage.as_xmlSs-- e$))T03}-.;DPQ : ''(89 : r1N)r=rHrJrK)rJr)rrrJrK)rNrOrPrr0rrrQr1r/rrIsW:r1rcHeZdZdZdfd Z ddZddZxZS)CoberturaXmlReporterz0Reporter for generating Cobertura compliant XML.c t|||tjdt t t j t|_tj|j|_ td|_ y)Nr) timestampversionr) rr0rrerHr*timerrprfrqr root_packagers r/r0zCoberturaXmlReporter.__init__gsZ *-MM*C rsplitr=endswithrrrrr2r)r+rArBrCrDrqrrrr class_element lines_elementclass_lines_coveredclass_total_linesrsrrurr line_element parent_modulecurrent_packagepackages_to_updaters r/r@zCoberturaXmlReporter.on_filenswwtyy)))]]   GWW%%d+ T4>>2  g%$U_`   2((@ -d3 HIFA%%))&%2B2BCFDF)))  " '#q(#---   V $ ) $ ++6{((*Y6{//7 L> " "= 1%,,M  1 1 : : :8H8WD   & &} 5++44]C"//A) 9G   #4 4   ! !%8 8 ! 9/< +r1cnt|jj|jj|jj d<d|jj d<t |jj|jj d<t |jj|jj d<tj|jd}tj|d}tj|_ |jj|jtjj|jd}|j j#|d d t%d tjj'|y) Nrrrz lines-coveredz lines-validsourcesrz cobertura.xmlutf-8T)encoding pretty_printzGenerated Cobertura report:)rrr2rrprCrHrrirXgetcwdtextrrqrrWrqrr6r/)r+rsource_elementout_paths r/rFzCoberturaXmlReporter.on_finishs,(5    + +T->->-J-J)  %+. ',/0A0A0O0O,P )*-d.?.?.K.K*L '""499i8))'8< iik &&tyy177<<A x'E +RWW__X-FGr1r_rLrMr8rs@r/rrdsM:2@<@<%@<) @<  @<  @'',,t@ doo!NO (D ! -X NN+ , -55w? 1277??83LM - -s !DDr_rLrMr8rs@r/rrsH 6 --%-) -  -  -& Nr1rz xslt-htmlcHeZdZdZdfd Z ddZddZxZS)XsltTxtReporterzvPublic reporter that exports TXT via XSLT. Currently this only does the summary, not the individual reports. ct|||tjtj|j j |_yr$)rr0rrrNrrKxslt_txtrs r/r0zXsltTxtReporter.__init__.s5 *- 5;;t/L/L#MN r1cyr$rQr\s r/r@zXsltTxtReporter.on_file3s r1cv|jj}|Jtjj |j d}t |j|}t|d5}|j|dddtdtjj|y#1swY3xYw)Nz index.txtrz Generated TXT report (via XSLT):) rrPrXrqrrWrrrvrr6r/)r+rPrtransformed_txtrs r/rFzXsltTxtReporter.on_finish<s??++###77<<= h 78 (D ! ,X NN? + , 0"''//(2KL , ,s +B//B8r_rLrMr8rs@r/rr(sI O   % )      Mr1rzxslt-txtrtxtcHeZdZdZdfd Z ddZddZxZS)LinePrecisionReporteraReport per-module line counts for typing precision. Each line is classified into one of these categories: * precise (fully type checked) * imprecise (Any types in a type component, such as List[Any]) * any (something with an Any type, implicit or explicit) * empty (empty line, comment or docstring) * unanalyzed (mypy considers line unreachable) The meaning of these categories varies slightly depending on context. c4t|||g|_yr$)rr0rQrs r/r0zLinePrecisionReporter.__init__[s *-%' r1c tjj|j}t |ryt j d|j||d}|j|t||j}t|D]F\}} |jj|t j} |j| xxdz cc<H|j j#|y#t$rYywxYw)NTrZrt)rXrqrbrcrrr rrrr;rrzrrgrhrrQr;) r+rArBrCrDrqrrrrsrrus r/r@zLinePrecisionReporter.on_file_s 77??499-D D ! ))]]   GT4>>2 -d3 *IFA%%))&%2B2BCF   V $ ) $ * )$)   s)C22 C>=C>c:|jsyt|jd}tjj |j d}t dt d|D}d}|ftd|Dz}d|z}t|d 5}|j|jd g||jd |d zzd z|D]}|j} |j|j|jj||j| tj | tj"| tj$| tj&| tj( dddy#1swYyxYw)Nc|jSr$rrs r/rz1LinePrecisionReporter.on_finish..rr1rzlineprecision.txtrc3FK|]}t|jywr$)rr>)rinfos r/rz2LinePrecisionReporter.on_finish..sE3t{{+Es!)LinesPrecise ImpreciserEmpty Unanalyzedc32K|]}t|ywr$r)rts r/rz2LinePrecisionReporter.on_finish..s!9Q#a&!9sz0{:%d} {:%d} {:%d} {:%d} {:%d} {:%d} {:%d} rrr3r)rQr(rXrqrrWrrrvrr7rr>ljustrr TYPE_PRECISErrrhr) r+r report_filewidthtitlesrfmtrrrrs r/rFzLinePrecisionReporter.on_finish~s^zz djj.@A ggll4??4GH AsE EEFPE!9&!999AFJ +s # q GGJCJJv// 0 GGC52:&- .)  "))JJ!((..u5!)u112u334u~~.u//0u445     s C2FFr_rLrMr8rs@r/rrLsG (%%%%) %  %  %>r1r lineprecision)F)rcrHr>z*Callable[[Reports, str], AbstractReporter]r=boolrJrK)rfrHrgrHrJrK)rqrHrJr)rqrHrJzIterator[tuple[int, str]])r2r*rr*rJrH)Vr __future__rr rr6rXrr8rruabcrrcollections.abcroperatorrtypingrr r typing_extensionsr rurllib.requestr mypyr mypy.defaultsr mypy.nodesrrr mypy.optionsrmypy.traverserr mypy.typesrr mypy.versionrlxmlrr5r: OrderedDict unannotatedexplicitfrom_unimported_typefrom_omitted_generics from_error special_formimplementation_artifactrrdictrHrrr r!rrrdrhrrrzr|rrrr,r;rErrrrrrrrsetrQr1r/rs;" '$''5'(44 +&$NBYAXAX    .   Z(  ' '6  ( (*<=   w'   0  * *,EF B> #xC(*<<=tC DD,.(-*!*!Z  0;;8;; ;J 0)01F(1Fh+01]S-]S@+56X%*X%v$8+$8N."67 a ao(od, 1dC4::6YH+YHx/#7DI ** *$B%$BN%6)N*)NX+/DAM)M<*o$?{F#z5!K,K\/#89  N 3333NsI**I54I5