§ ]<ˆj‰?ã ó —dZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddlmZddlmZddlmZmZmZmZmZmZmZmZmZmZmZddlmZddl m!Z!dd l"m#Z#m$Z$dd l%m&Z&dd l'm(Z(dd l)m*Z*dd l+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2ddl3m4Z4ddl5m6Z6m7Z7m8Z8ej9e:¦«Z;eeGd„de?¦«Z@de!ddfd„ZAGd„de?¦«ZBdezO The main purpose of this module is to expose LinkCollector.collect_sources(). éN)Ú dataclass)Ú HTMLParser)ÚValues) ÚCallableÚDictÚIterableÚListÚMutableMappingÚ NamedTupleÚOptionalÚProtocolÚSequenceÚTupleÚUnion)Úrequests)ÚResponse)Ú RetryErrorÚSSLError)ÚNetworkConnectionError)ÚLink)Ú SearchScope)Ú PipSession)Úraise_for_status)Úis_archive_file©Úredact_auth_from_url)Úvcsé)ÚCandidatesFromPageÚ LinkSourceÚ build_sourceÚurlÚreturncó¨—tjD]D}| ¦« |¦«r|t |¦«dvr|cSŒEdS)zgLook for VCS schemes in the URL. Returns the matched VCS scheme, or None if there's no match. z+:N)rÚschemesÚlowerÚ startswithÚlen)r"Úschemes úo/builddir/build/BUILD/cloudlinux-venv-1.0.12/venv/lib/python3.11/site-packages/pip/_internal/index/collector.pyÚ_match_vcs_schemer+3sW€õ ”+ððˆØ �9Š9‰;Œ;× !Ò ! &Ñ )Ô )ð ¨cµ#°f±+´+Ô.>À$Ð.FÐ.F؈MˆMˆMøØ ˆ4ócó,‡—eZdZdededdfˆfd„ ZˆxZS)Ú_NotAPIContentÚ content_typeÚ request_descr#Ncóh•—t¦« ||¦«||_||_dS©N)ÚsuperÚ__init__r/r0)Úselfr/r0Ú __class__s €r*r4z_NotAPIContent.__init__?s3ø€Ý ‰Œ×Ò˜ |Ñ4Ô4Ð4Ø(ˆÔØ(ˆÔÐÐr,)Ú__name__Ú __module__Ú __qualname__Ústrr4Ú __classcell__©r6s@r*r.r.>sRø€€€€€ð) Sð)¸ð)Àð)ð)ð)ð)ð)ð)ð)ð)ð)ð)r,r.Úresponsecó—|j dd¦«}| ¦«}| d¦«rdSt ||jj¦«‚)z° Check the Content-Type header to ensure the response contains a Simple API Response. Raises `_NotAPIContent` if the content type is not a valid content-type. ú Content-TypeÚUnknown)z text/htmlz#application/vnd.pypi.simple.v1+htmlú#application/vnd.pypi.simple.v1+jsonN)ÚheadersÚgetr&r'r.ÚrequestÚmethod)r=r/Úcontent_type_ls r*Ú_ensure_api_headerrGEsg€ðÔ#×'Ò'¨¸ ÑBÔB€Là!×'Ò'Ñ)Ô)€NØ× Ò ð ñôðð ˆå ˜ xÔ'7Ô'>Ñ ?Ô ?Ð?r,có—eZdZdS)Ú_NotHTTPN)r7r8r9©r,r*rIrI[s€€€€€Ø€Dr,rIÚsessioncóÞ—tj |¦«\}}}}}|dvrt¦«‚| |d¬¦«}t |¦«t |¦«dS)zõ Send a HEAD request to the URL, and ensure the response contains a simple API Response. Raises `_NotHTTP` if the URL is not available for a HEAD request, or `_NotAPIContent` if the content type is not a valid content type. >ÚhttpÚhttpsT)Úallow_redirectsN)ÚurllibÚparseÚurlsplitrIÚheadrrG)r"rKr)ÚnetlocÚpathÚqueryÚfragmentÚresps r*Ú_ensure_api_responserY_sq€õ-3¬L×,AÒ,AÀ#Ñ,FÔ,FÑ)€FˆF�D˜% Ø Ð&Ð&Ð&݉jŒjÐà �<Š<˜¨Tˆ<Ñ 2Ô 2€DÝ�TÑÔÐå�tÑÔÐÐÐr,cóØ—tt|¦«j¦«rt||¬¦«t dt |¦«¦«| |d gd¢¦«ddœ¬¦«}t|¦«t|¦«t dt |¦«|j  d d ¦«¦«|S) aYAccess an Simple API response with GET, and return the response. This consists of three parts: 1. If the URL looks suspiciously like an archive, send a HEAD first to check the Content-Type is HTML or Simple API, to avoid downloading a large file. Raise `_NotHTTP` if the content type cannot be determined, or `_NotAPIContent` if it is not HTML or a Simple API. 2. Actually perform the request. Raise HTTP exceptions on network failures. 3. Check the Content-Type header to make sure we got a Simple API response, and raise `_NotAPIContent` otherwise. ©rKzGetting page %sz, )rAz*application/vnd.pypi.simple.v1+html; q=0.1ztext/html; q=0.01z max-age=0)ÚAcceptz Cache-Control)rBzFetched page %s as %sr?r@) rrÚfilenamerYÚloggerÚdebugrrCÚjoinrrGrB)r"rKrXs r*Ú_get_simple_responseraqsø€õ•t˜C‘y”yÔ)Ñ*Ô*ð3ݘS¨'Ð2Ñ2Ô2Ð2å ‡L‚LÐ"Õ$8¸Ñ$=Ô$=Ñ>Ô>Ð>à �;Š;Ø à—i’iðððñôð()ð+ ð ð ñ ô €Dõ4�TÑÔÐõ�tÑÔÐå ‡L‚LØÝ˜SÑ!Ô!Ø Œ ×Ò˜¨Ñ3Ô3ñôðð €Kr,rBcó°—|rSd|vrOtj ¦«}|d|d<| d¦«}|rt |¦«SdS)z=Determine if we have any encoding information in our headers.r?z content-typeÚcharsetN)ÚemailÚmessageÚMessageÚ get_paramr:)rBÚmrcs r*Ú_get_encoding_from_headersri°s`€àð �> WÐ,Ð,Ý ŒM× !Ò !Ñ #Ô #ˆØ# NÔ3ˆˆ.ÑØ—+’+˜iÑ(Ô(ˆØ ð Ý�w‘<”<Ð Ø ˆ4r,có2—eZdZd d„Zdedefd„Zdefd„ZdS) ÚCacheablePageContentÚpageÚ IndexContentr#Ncó&—|jsJ‚||_dSr2)Úcache_link_parsingrl©r5rls r*r4zCacheablePageContent.__init__¼s€ØÔ&Ð&Ð&Ð&؈Œ ˆ ˆ r,Úothercóp—t|t|¦«¦«o|jj|jjkSr2)Ú isinstanceÚtyperlr")r5rqs r*Ú__eq__zCacheablePageContent.__eq__Às*€Ý˜%¥ d¡¤Ñ,Ô,ÐP°´´À%Ä*Ä.Ò1PÐPr,có4—t|jj¦«Sr2)Úhashrlr"©r5s r*Ú__hash__zCacheablePageContent.__hash__Ãs€Ý�D”I”MÑ"Ô"Ð"r,)rlrmr#N) r7r8r9r4ÚobjectÚboolruÚintryrJr,r*rkrk»sk€€€€€ðððððQ˜FðQ tðQðQðQðQð#˜#ð#ð#ð#ð#ð#ð#r,rkcó*—eZdZdddeefd„ZdS)Ú ParseLinksrlrmr#có—dSr2rJrps r*Ú__call__zParseLinks.__call__Ès€€€r,N)r7r8r9rrr€rJr,r*r~r~Çs*€€€€€ØC˜^ÐC°¸´ÐCÐCÐCÐCÐCÐCr,r~Úfncó臇—tjd¬¦«dtdttfˆfd„ ¦«Štj‰¦«dddttfˆˆfd„ ¦«}|S) zÚ Given a function that parses an Iterable[Link] from an IndexContent, cache the function's result (keyed by CacheablePageContent), unless the IndexContent `page` has `page.cache_link_parsing == False`. N)ÚmaxsizeÚcacheable_pager#có>•—t‰|j¦«¦«Sr2)Úlistrl)r„r�s €r*Úwrapperz*with_cached_index_content..wrapperÒsø€å�B�B�~Ô*Ñ+Ô+Ñ,Ô,Ð,r,rlrmcór•—|jr‰t|¦«¦«St‰|¦«¦«Sr2)rorkr†)rlr�r‡s €€r*Úwrapper_wrapperz2with_cached_index_content..wrapper_wrapperÖs;ø€à Ô "ð 7Ø�7Õ/°Ñ5Ô5Ñ6Ô6Ð 6Ý�B�B�t‘H”H‰~Œ~Ðr,)Ú functoolsÚ lru_cacherkr rÚwraps)r�r‰r‡s` @r*Úwith_cached_index_contentr�Ës¤øø€õÔ Ð&Ñ&Ô&ð-Õ 4ð-½½d¼ð-ð-ð-ð-ð-ñ'Ô&ð-õ„_�RÑÔð˜nðµµd´ððððððñÔðð Ðr,rlrmc#óK—|j ¦«}| d¦«rUtj|j¦«}| dg¦«D]#}tj||j ¦«}|€Œ|V—Œ$dSt|j ¦«}|j pd}|  |j  |¦«¦«|j }|jp|}|jD] } tj| ||¬¦«}|€Œ|V—Œ!dS)z\ Parse a Simple API's Index Content, and yield its anchor elements as Link objects. rAÚfilesNzutf-8)Úpage_urlÚbase_url)r/r&r'ÚjsonÚloadsÚcontentrCrÚ from_jsonr"ÚHTMLLinkParserÚencodingÚfeedÚdecoder‘ÚanchorsÚ from_element) rlrFÚdataÚfileÚlinkÚparserr—r"r‘Úanchors r*Ú parse_linksr¡ßs!èè€ð Ô&×,Ò,Ñ.Ô.€NØ× Ò Ð!FÑGÔGðÝŒz˜$œ,Ñ'Ô'ˆØ—H’H˜W bÑ)Ô)ð ð ˆDÝ”> $¨¬Ñ1Ô1ˆD؈|ØØˆJˆJˆJˆJØˆå ˜DœHÑ %Ô %€FØŒ}Ð' €HØ ‡K‚K�” ×#Ò# HÑ-Ô-Ñ.Ô.Ð.à Œ(€CØŒÐ% #€HØ”.ððˆÝÔ  °#ÀÐIÑIÔIˆØ ˆ<Ø Øˆ ˆ ˆ ˆ ð ðr,T)Úfrozencób—eZdZUdZeed<eed<eeed<eed<dZe ed<defd „Z d S) rmaŒRepresents one response (or page), along with its URL. :param encoding: the encoding to decode the given content. :param url: the URL from which the HTML was downloaded. :param cache_link_parsing: whether links parsed from this page's url should be cached. PyPI index urls should have this set to False, for example. r”r/r—r"Tror#có*—t|j¦«Sr2)rr"rxs r*Ú__str__zIndexContent.__str__ s€Ý# D¤HÑ-Ô-Ð-r,N) r7r8r9Ú__doc__ÚbytesÚ__annotations__r:r ror{r¥rJr,r*rmrmüs|€€€€€€ððð€N€N�NØÐÐÑØ�sŒmÐÐÑØ €H€H�HØ#ИÐ#Ð#Ñ#ð.˜ð.ð.ð.ð.ð.ð.r,c󬇗eZdZdZdeddfˆfd„ Zdedeeeeefddfd„Z deeeeefdeefd „Z ˆxZ S) r–zf HTMLParser that keeps the first base HREF and a list of all anchor elements' attributes. r"r#Ncóv•—t¦« d¬¦«||_d|_g|_dS)NT)Úconvert_charrefs)r3r4r"r‘rš)r5r"r6s €r*r4zHTMLLinkParser.__init__s7ø€Ý ‰Œ×Ò¨$ÐÑ/Ô/Ð/àˆŒØ'+ˆŒ Ø79ˆŒ ˆ ˆ r,ÚtagÚattrscó—|dkr)|j€"| |¦«}|� ||_dSdS|dkr)|j t |¦«¦«dSdS)NÚbaseÚa)r‘Úget_hrefršÚappendÚdict)r5r¬r­Úhrefs r*Úhandle_starttagzHTMLLinkParser.handle_starttagsn€Ø �&Š=ˆ=˜Tœ]Ð2Ø—=’= Ñ'Ô'ˆDØÐØ $�” � � ð Ðà �CŠZˆZØ ŒL× Ò ¥ U¡ ¤ Ñ ,Ô ,Ð ,Ð ,Ð ,ðˆZr,có*—|D]\}}|dkr|cSŒdS)Nr´rJ)r5r­ÚnameÚvalues r*r±zHTMLLinkParser.get_href&s1€Ø ð ð ‰KˆD�%Ø�vŠ~ˆ~Ø� � � ðàˆtr,) r7r8r9r¦r:r4r rr rµr±r;r<s@r*r–r–sËø€€€€€ððð :˜Cð: Dð:ð:ð:ð:ð:ð:ð- 3ð-¨t°E¸#¸xȼ}Ð:LÔ4MÔ/Nð-ÐSWð-ð-ð-ð-ð˜d 5¨¨h°s¬mÐ);Ô#<Ô=ðÀ(È3Ä-ððððððððr,r–ržÚreasonÚmeth).Ncó<—|€ tj}|d||¦«dS)Nz%Could not fetch URL %s: %s - skipping)r^r_)ržr¹rºs r*Ú_handle_get_simple_failr¼-s+€ð  €|ÝŒ|ˆØ€DÐ 0°$¸Ñ?Ô?Ð?Ð?Ð?r,rocó|—t|j¦«}t|j|jd||j|¬¦«S)Nr?)r—r"ro)rirBrmr”r")r=ror—s r*Ú_make_index_contentr¾7sG€õ*¨(Ô*:Ñ;Ô;€HÝ ØÔØÔ˜Ô(ØØ ŒLØ-ð  ñ ô ðr,cóÚ—|j dd¦«d}t|¦«}|rt d||¦«dSt j |¦«\}}}}}}|dkr‘tj   t j   |¦«¦«rU|  d¦«s|dz }t j |d¦«}t d|¦« t!||¬ ¦«}t#||j¬ ¦«S#t&$rt d |¦«Y�n t($r1}t d ||j|j¦«Yd}~nØd}~wt.$r}t1||¦«Yd}~n¶d}~wt2$r}t1||¦«Yd}~n”d}~wt4$r:}d } | t7|¦«z } t1|| tj¬¦«Yd}~nRd}~wt:j$r}t1|d|›�¦«Yd}~n(d}~wt:j$rt1|d¦«YnwxYwdS)Nú#rrzICannot look at %s URL %s because it does not support lookup as web pages.r�ú/z index.htmlz# file: URL is directory, getting %sr[)roz`Skipping page %s because it looks like an archive, and cannot be checked by a HTTP HEAD request.zºSkipping page %s because the %s request got Content-Type: %s. The only supported Content-Types are application/vnd.pypi.simple.v1+json, application/vnd.pypi.simple.v1+html, and text/htmlz4There was a problem confirming the ssl certificate: )rºzconnection error: z timed out) r"Úsplitr+r^ÚwarningrPrQÚurlparseÚosrUÚisdirrDÚ url2pathnameÚendswithÚurljoinr_rar¾rorIr.r0r/rr¼rrr:ÚinforÚConnectionErrorÚTimeout) ržrKr"Ú vcs_schemer)Ú_rUrXÚexcr¹s r*Ú_get_index_contentrÐDs€Ø Œ(�.Š.˜˜aÑ Ô  Ô #€Cõ# 3Ñ'Ô'€JØðÝ�ŠØ WØ Ø ñ ô ð ð ˆtõ &œ|×4Ò4°SÑ9Ô9Ñ€FˆAˆt�Q˜˜1Ø �ÒÐ�BœGŸMšM­&¬.×*EÒ*EÀdÑ*KÔ*KÑLÔLÐð�|Š|˜CÑ Ô ð Ø �3‰JˆCõ Œl×"Ò" 3¨ Ñ5Ô5ˆÝ� Š Ð:¸CÑ@Ô@Ð@ðUÝ# C°Ð9Ñ9Ô9ˆõ:# 4¸DÔ€€€€€€Ø˜ *Ô-Ô.Ð.Ð.Ñ.ؘ *Ô-Ô.Ð.Ð.Ñ.Ð.Ð.r,rÒc óª—eZdZdZdededdfd„Ze ddeded e ddfd „¦«Z e de e fd „¦«Zd edeefd „Zde dedefd„ZdS)Ú LinkCollectorzµ Responsible for collecting Link objects from all configured locations, making network requests as needed. The class's main method is its collect_sources() method. rKÚ search_scoper#Ncó"—||_||_dSr2)r×rK)r5rKr×s r*r4zLinkCollector.__init__Žs€ð )ˆÔ؈Œ ˆ ˆ r,FÚoptionsÚsuppress_no_indexcó—|jg|jz}|jr<|s:t dd d„|D¦«¦«¦«g}|jpg}tj|||j¬¦«}t||¬¦«}|S)zÆ :param session: The Session to use to make requests. :param suppress_no_index: Whether to ignore the --no-index option when constructing the SearchScope object. zIgnoring indexes: %sú,c3ó4K—|]}t|¦«V—ŒdSr2r)Ú.0r"s r*ú z'LinkCollector.create..¦s+èè€ÐIÐI°sÕ-¨cÑ2Ô2ÐIÐIÐIÐIÐIÐIr,)rÓrÔÚno_index)rKr×) Ú index_urlÚextra_index_urlsràr^r_r`rÓrÚcreaterÖ)ÚclsrKrÙrÚrÔrÓr×Úlink_collectors r*rãzLinkCollector.create–s¾€ðÔ'Ð(¨7Ô+CÑCˆ Ø Ô ð Ð$5ð Ý �LŠLØ&Ø—’ÐIÐI¸jÐIÑIÔIÑIÔIñ ô ð ðˆJðÔ'Ð-¨2ˆ å"Ô)Ø!Ø!ØÔ%ð ñ ô ˆ õ 'ØØ%ð ñ ô ˆðÐr,có—|jjSr2)r×rÓrxs r*rÓzLinkCollector.find_links¸s€àÔ Ô+Ð+r,Úlocationcó.—t||j¬¦«S)z> Fetch an HTML page containing package links. r[)rÐrK)r5rçs r*Úfetch_responsezLinkCollector.fetch_response¼s€õ" (°D´LÐAÑAÔAÐAr,Ú project_nameÚcandidates_from_pagecóz‡‡‡—tjˆˆˆfd„‰j ‰¦«D¦«¦« ¦«}tjˆˆˆfd„‰jD¦«¦« ¦«}t  tj ¦«red„tj ||¦«D¦«}t|¦«›d‰›d�g|z}t   d |¦«¦«tt!|¦«t!|¦«¬¦«S)Nc 3óV•K—|]#}t|‰‰jjdd‰¬¦«V—Œ$dS)F©rëÚpage_validatorÚ expand_dirrorêN©r!rKÚis_secure_origin©rÞÚlocrërêr5s €€€r*rßz0LinkCollector.collect_sources..Ès_øèè€ð 4 ð 4 ðõ ØØ%9Ø#œ|Ô<Ø Ø#(Ø)ð  ñ ô ð 4 ð 4 ð 4 ð 4 ð 4 ð 4 r,c 3óV•K—|]#}t|‰‰jjdd‰¬¦«V—Œ$dS)TrîNrñrós €€€r*rßz0LinkCollector.collect_sources..Ós_øèè€ð 5 ð 5 ðõ ØØ%9Ø#œ|Ô<ØØ#'Ø)ð  ñ ô ð 5 ð 5 ð 5 ð 5 ð 5 ð 5 r,có4—g|]}|®|j® d|j›�‘ŒS)Nz* )rž)rÞÚss r*ú z1LinkCollector.collect_sources..às6€ðððàØ�= Q¤VÐ%7ð�Q”V� � à%7Ð%7Ð%7r,z' location(s) to search for versions of ú:ú )rÓrÔ)Ú collectionsÚ OrderedDictr×Úget_index_urls_locationsÚvaluesrÓr^Ú isEnabledForÚloggingÚDEBUGÚ itertoolsÚchainr(r_r`rÒr†)r5rêrëÚindex_url_sourcesÚfind_links_sourcesÚliness``` r*Úcollect_sourceszLinkCollector.collect_sourcesÂs�øøø€õ (Ô3ð 4 ð 4 ð 4 ð 4 ð 4 ð 4 ðÔ(×AÒAÀ,ÑOÔOð 4 ñ 4 ô 4 ñ  ô  ÷ Š&‰(Œ(ð õ)Ô4ð 5 ð 5 ð 5 ð 5 ð 5 ð 5 ð”ð 5 ñ 5 ô 5 ñ  ô  ÷ Š&‰(Œ(ð õ × Ò �wœ}Ñ -Ô -ð +ððå"œÐ);Ð=NÑOÔOðñôˆEõ �u‘:”:ð3ð3Ø#/ð3ð3ð3ððñˆEõ �LŠL˜Ÿš 5Ñ)Ô)Ñ *Ô *Ð *åÝÐ.Ñ/Ô/ÝÐ-Ñ.Ô.ð ñ ô ð r,)F)r7r8r9r¦rrr4Ú classmethodrr{rãÚpropertyr r:rÓrr rmrérrÒrrJr,r*rÖrÖ†s'€€€€€ðððàðð"ðð ð ððððð #(ð ðàðððð ð ð ð ððñ„[ððBð,˜D œIð,ð,ð,ñ„Xð,ðB tðB°¸Ô0FðBðBðBðBð , àð, ð1ð, ð ð , ð, ð, ð, ð, ð, r,rÖr2)T)Rr¦rûÚ email.messagerdrŠrr’rrÅÚ urllib.parserPÚurllib.requestÚ dataclassesrÚ html.parserrÚoptparserÚtypingrrrr r r r r rrrÚ pip._vendorrÚpip._vendor.requestsrÚpip._vendor.requests.exceptionsrrÚpip._internal.exceptionsrÚpip._internal.models.linkrÚ!pip._internal.models.search_scoperÚpip._internal.network.sessionrÚpip._internal.network.utilsrÚpip._internal.utils.filetypesrÚpip._internal.utils.miscrÚpip._internal.vcsrÚsourcesrr r!Ú getLoggerr7r^r:ÚResponseHeadersr+Ú Exceptionr.rGrIrYrarirkr~r�r¡rmr–r¼r{r¾rÐrÒrÖrJr,r*úr s—ððððÐÐÐØÐÐÐØÐÐÐØÐÐÐØ € € € Ø€€€Ø € € € ØÐÐÐØÐÐÐØ!Ð!Ð!Ð!Ð!Ð!Ø"Ð"Ð"Ð"Ð"Ð"ØÐÐÐÐÐð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð!Ð Ð Ð Ð Ð Ø)Ð)Ð)Ð)Ð)Ð)Ø@Ð@Ð@Ð@Ð@Ð@Ð@Ð@à;Ð;Ð;Ð;Ð;Ð;Ø*Ð*Ð*Ð*Ð*Ð*Ø9Ð9Ð9Ð9Ð9Ð9Ø4Ð4Ð4Ð4Ð4Ð4Ø8Ð8Ð8Ð8Ð8Ð8Ø9Ð9Ð9Ð9Ð9Ð9Ø9Ð9Ð9Ð9Ð9Ð9Ø!Ð!Ð!Ð!Ð!Ð!àAÐAÐAÐAÐAÐAÐAÐAÐAÐAà ˆÔ ˜8Ñ $Ô $€à   c Ô*€ð˜3ð 8¨C¤=ððððð)ð)ð)ð)ð)�Yñ)ô)ð)ð@ ð@¨dð@ð@ð@ð@ð, ð ð ð ð ˆyñ ô ð ð˜cð¨Jð¸4ððððð$<˜cð<¨Jð<¸8ð<ð<ð<ð<ð~¨ð¸HÀS¼Mððððð #ð #ð #ð #ð #ñ #ô #ð #ðDðDðDðDðD�ñDôDðDð *ð°ððððð(ð�nð¨°$¬ðððñÔðð8 €�$ÐÑÔð.ð.ð.ð.ð.ñ.ô.ñÔð.ð(ðððð�Zñôðð>+/ð@ð@Ø ð@à �#�y�.Ô !ð@ð �8˜IÔ&Ô 'ð@ð ð @ð@ð@ð@ð48ð ð Øð Ø,0ð àð ð ð ð ð:˜Tð:¨zð:¸hÀ~Ô>Vð:ð:ð:ð:ðz/ð/ð/ð/ð/�zñ/ô/ð/ð h ðh ðh ðh ðh ñh ôh ðh ðh ðh r,