Ë k.övÅÛ¦Çã óF—dZddlZddlZddlmZddlmZddlmZddl m Z m Z m Z m Z mZmZmZmZddlmZmZiZej,e«Z ddlZej0«5ej2dd ed ¬ «ddlmZej:ddd«d Zd ed«fded«fded«fded«fded«fgZ ejBdejD«Z#dZ$ed«Z%Gd„d«Z&Gd„d«Z'd„Z(d„Z)d „Z*d!„Z+d"„Z,d#„Z-d$„Z.d%„Z/d&„Z0d'„Z1d(„Z2d)„Z3ed*d+d,d-ed.«ed/«fd0d1d2ed3«ed/«fd4d5d2ed6«dfged7«ejh¬8«d>d9„«Z5ed:d;¬<«d>d=„«Z6y#1swYŒþxYw#e$rdZY�Œ wxYw)?a/generate release notes from commit messages (EXPERIMENTAL) It is common to maintain files detailing changes in a project between releases. Maintaining these files can be difficult and time consuming. The :hg:`releasenotes` command provided by this extension makes the process simpler by automating it. éN)Ú_)Úopen)Úhex)ÚcmdutilÚconfigÚerrorÚ logcmdutilÚminirstÚpycompatÚ registrarÚutil)ÚprocutilÚ stringutilÚignorez.*python-Levenshtein.*zfuzzywuzzy.fuzz)ÚactionÚmessageÚcategoryÚmodulesships-with-hg-coresfeatures New FeaturessbcsBackwards Compatibility Changesófixs Bug FixessperfsPerformance Improvementssapis API Changess#^\.\. ([a-zA-Z0-9_]+)::\s*([^$]+)?$s\bissue ?[0-9]{4,6}(?![0-9])\bs Other ChangescóB—eZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z y ) Úparsedreleasenotescó—i|_y©N©Úsections©Úselfs ú6usr/lib/python3.12/site-packages/hgext/releasenotes.pyÚ__init__zparsedreleasenotes.__init__Ps €Øˆ� ócó—||jvSrr©rÚsections rÚ __contains__zparsedreleasenotes.__contains__Ss€Ø˜$Ÿ-™-Ð'Ð'r có>—tt|j««Sr)ÚiterÚsortedrrs rÚ__iter__zparsedreleasenotes.__iter__Vs€Ü”F˜4Ÿ=™=Ó)Ó*Ð*r có†—|jj|ggf«|j|dj||f«y)z Add a titled release note entry.rN©rÚ setdefaultÚappend)rr#ÚtitleÚ paragraphss rÚ addtitleditemz parsedreleasenotes.addtitleditemYs;€à � ‰ × Ñ  ¨2¨r¨(Ô3Ø � ‰ �gјqÑ!×(Ñ(¨%°Ð)<Õ=r có‚—|jj|ggf«|j|dj|«y)z[Adds a non-titled release note entry. Will be rendered as a bullet point. éNr*)rr#r.s rÚaddnontitleditemz#parsedreleasenotes.addnontitleditem^s8€ð � ‰ × Ñ  ¨2¨r¨(Ô3Ø � ‰ �gјqÑ!×(Ñ(¨Õ4r cóD—|jj|ggf«dS)z|Returns titled entries in a section. Returns a list of (title, paragraphs) tuples describing sub-sections. r©rÚgetr"s rÚtitledforsectionz#parsedreleasenotes.titledforsectionfs$€ð �}‰}× Ñ  ¨2¨r¨(Ó3°AÑ6Ð6r cóD—|jj|ggf«dS)z5Returns non-titled, bulleted paragraphs in a section.r1r4r"s rÚnontitledforsectionz&parsedreleasenotes.nontitledforsectionms"€à�}‰}× Ñ  ¨2¨r¨(Ó3°AÑ6Ð6r cóJ‡—tˆfd„|j|«D««S)Nc3ó.•K—|] }|d‰k(–—Œy­w)rN©)Ú.0Útr-s €rÚ z8parsedreleasenotes.hastitledinsection..rsøèø€ÐIÑ*H Q�1�Q‘4˜5•=Ñ*Hùsƒ)Úanyr6)rr#r-s `rÚhastitledinsectionz%parsedreleasenotes.hastitledinsectionqsø€ÜÓI¨$×*?Ñ*?ÀÔ*HÓIÓIÐIr cóì—ts|jtd««|D�]N}t|j |««t |j |««z}|j |«D]‰\}}|j||«r |jtd«||fz«Œ8t||fg«d}|dk(rt|«}|rt|||«rŒit|||«rŒw|j|||«Œ‹|j |«D]e}||j |«vrŒt |g«d}|dk(rt|«}|rt|||«rŒFt|||«rŒT|j||«Œg�ŒQy)z{Merge another instance into this one. This is used to combine multiple sources of release notes together. sKmodule 'fuzzywuzzy' not found, merging of similar releasenotes is disabled s*%s already exists in %s section; ignoring rrN)ÚfuzzÚwarnrÚ converttitledr6Úconvertnontitledr8r@ÚwriteÚ getissuenumÚ findissueÚsimilarr/r2) rÚuiÚotherr#Ú existingnotesr-r.Ú incoming_strÚissues rÚmergezparsedreleasenotes.mergets‘€õ Ø �G‰GÜð2óô ôˆGÜ)Ø×%Ñ% gÓ.óä  ×!9Ñ!9¸'Ó!BÓCñDˆMð&+×%;Ñ%;¸GÖ%DÑ!��zØ×*Ñ*¨7°EÔ:ð—H‘HÜÐHÓIØ  'Ð*ñ+ôðä,¨u°jÐ.AÐ-BÓCÀAÑF� ؘfÒ$Ü'¨ Ó5�EÙÜ$ R¨¸Ô>Ø$ä˜2˜}¨lÔ;Øà×"Ñ" 7¨E°:Õ>ð)&Eð,$×7Ñ7¸Ö@� Ø ×!9Ñ!9¸'Ó!BÑBØä/°° Ó=¸aÑ@� ؘfÒ$Ü'¨ Ó5�EÙÜ$ R¨¸Ô>Ø$ä˜2˜}¨lÔ;Øà×%Ñ% g¨zÕ:òAñ5r N) Ú__name__Ú __module__Ú __qualname__rr$r(r/r2r6r8r@rOr;r rrrOs0„òò(ò+ò>ò 5ò7ò7òJó5;r rcó&—eZdZdd„Zd„Zd„Zd„Zy)ÚreleasenotessectionsNcóÜ—|rVtjt«}t|«}|r|j |«t |j ««|_yt t«|_yr)r ÚsortdictÚDEFAULT_SECTIONSÚgetcustomadmonitionsÚupdateÚlistÚitemsÚ _sections)rrJÚreporÚcustom_sectionss rrzreleasenotessections.__init__­sM€Ù Ü—}‘}Ô%5Ó6ˆHÜ2°4Ó8ˆOÙØ—‘ Ô0Ü! (§.¡.Ó"2Ó3ˆD�Nä!Ô"2Ó3ˆD�Nr có,—t|j«Sr)r&r\rs rr(zreleasenotessections.__iter__·s€Ü�D—N‘NÓ#Ð#r cóF—|jD�cgc]}|d‘Œ c}Scc}w)Nr©r\)rr=s rÚnameszreleasenotessections.namesºs"€Ø"ŸnšnÓ-™n˜��!“˜nÑ-Ð-ùÒ-s� có>—|jD]\}}||k(sŒ |cSyrra)rr-ÚnameÚvalues rÚsectionfromtitlez%releasenotessections.sectionfromtitle½s%€ØŸ>œ>‰KˆD�%ؘ‹~Ø’ ð*ðr r)rPrQrRrr(rbrfr;r rrTrT¬s„ó4ò$ò.ór rTcó’—g}|D]?\}}g}|D]}|j|«Œ|jdj|««ŒA|S)z. Convert titled paragraphs to strings ó ©Úextendr,Újoin)ÚtitledparagraphsÚ string_listr-r.ÚlinesÚparas rrDrDÅsR€ð€KÛ-шˆz؈ۈDØ �L‰L˜Õ ðà×ј4Ÿ9™9 UÓ+Õ,ð .ð Ðr cóŒ—g}|D]<}g}|D]}|j|«Œ|jdj|««Œ>|S)z/ Convert non-titled bullets to strings rhri)Únontitledparagraphsrmr.rnros rrErEÒsM€ð€KÛ)ˆ ؈ۈDØ �L‰L˜Õ ðà×ј4Ÿ9™9 UÓ+Õ,ð *ð Ðr có|—tjt|tj«}|r|j «}|S)zD Returns issue number from the incoming string if it exists )ÚreÚsearchÚRE_ISSUEÚ IGNORECASEÚgroup)rMrNs rrGrGßs-€ô �I‰I”h  ¬b¯m©mÓ <€EÙ Ø— ‘ “ ˆØ €Lr cój‡—tˆfd„|D««r|jtd«‰z«yy)z? Returns true if issue number already exists in notes. c3ó&•K—|]}‰|v–—Œ y­wrr;)r<ÚsrNs €rr>zfindissue..ísøèø€Ð (™x˜!ˆ5�AŒ:™xùsƒs'"%s" already exists in notes; ignoring TF)r?rFr)rJÚexistingrNs `rrHrHés0ø€ô Ó (™xÓ (Ô(Ø �‰”Ð>Ó?À%ÑGÔHØàr có–—t|j««dkDr-t||«}|s|jt d«|z«yyy)z? Returns true if similar note found in existing notes. é s,"%s" already exists in notes file; ignoring TF)ÚlenÚsplitÚsimilaritycheckrFr)rJr{rMrOs rrIrIôsQ€ô ˆ<× Ñ Ó Ó  2Ò%Ü  ¨hÓ7ˆÙØ �H‰HÜÐBÓCØñô ðààr cóf—tsyd}|D]"}tj||«}|dkDsŒd}|S|S)zK Returns false when note fragment can be merged to existing notes. TéKF)rBÚtoken_set_ratio)rMrLrOÚbulletÚscores rr€r€sF€õ Øà €EÛˆÜ×$Ñ$ \°6Ó:ˆØ �2‹:؈EØ Ø €Lð  ð €Lr c󈇇‡‡—‰dŠtj«Šdˆˆˆˆfd„ Šd‰vr‰d«‰jd«S)Nó.c󾕗|‰vr)‰|j«}‰j||||‰«ytjt d«‰j |«z«‚)Ns#.hgreleasenotes file '%s' not found)ÚdataÚparserÚAbortrÚpathto)ÚfrÚremapr‰ÚctxÚpÚreadr]s €€€€rr‘z"getcustomadmonitions..readsTø€Ø �‰8Ø�q‘6—;‘;“=ˆDØ �G‰G�A�t˜X u¨dÕ 3ä—+‘+ÜÐ:Ó;¸d¿k¹kÈ!»nÑLóð r s.hgreleasenotesssections)NN)rr[)r]r�r�r‘s`@@@rrXrXsCû€Ø ˆt‰*€CÜ� ‰ ‹€A÷ðð˜SÑ Ù Ð Ô Ø �7‰7�;Ó Ðr có:‡ —|D�]}||}tjt|j««Š ‰ sŒ4‰ j d«|vrŒH|j t d«‰ j d«|j«ddfz«ˆ fd„}|D�cgc]}||«dkDsŒ|‘Œ}}t|«dk(r!|j t d«|dz«ŒÖ|sŒÙd jt|««} |j t d «| z«�Œycc}w) a` Checks the commit messages for admonitions and their validity. .. abcd:: First paragraph under this admonition For this commit message, using `hg releasenotes -r . --check` returns: Invalid admonition 'abcd' present in changeset 3ea92981e103 As admonition 'abcd' is neither present in default nor custom admonitions r1s0Invalid admonition '%s' present in changeset %s Né cól•—tjd‰jd«|«j«S)Nr1)ÚdifflibÚSequenceMatcherrwÚratio)ÚxÚ admonitions €rÚz"checkadmonitions..As.ø€¤× 7Ñ 7ؘ*×*Ñ*¨1Ó-¨qó!ç‘%“'ð!r g333333ã?s(did you mean %s?) rs, s(did you mean one of %s?) ) rsrtÚ RE_DIRECTIVEÚ descriptionrwrFrrr~rkr') rJr]Ú directivesÚrevsÚrevr�ÚsimrzrIÚssr™s @rÚcheckadmonitionsr¢)sø€ôˆØ�3‰iˆÜ—Y‘Yœ|¨S¯_©_Ó->Ó?ˆ Ú Ø×Ñ Ó" jÑ0Øà—‘ÜÐJÓKØ!×'Ñ'¨Ó*¨C¯G©G«I°c°r¨NÐ;ñ<ôó�ñ'1ÓA¡j ±C¸³F¸S³Lš1 j�ÐAÜ�w“< 1Ò$Ø—H‘HœQÐ6Ó7¸'À!¹*ÑDÕEÚØŸ™¤F¨7£OÓ4�BØ—H‘HœQÐ=Ó>ÀÑCÖDñ)ùòBs ÂDÂ%DcóJ—|D]}|jd|d|dfz«Œ y)Ns%s: %s rr1)rF)rJrr#s rÚ_getadmonitionlistr¤Ms*€ÛˆØ �‰� ¨¡ ¨G°A©JÐ7Ñ7Õ8ñr c óL—t«}|D�]“}||}tj|j«|¬«\}}t |«D�]T\}} | ddk7rŒ| d} | dr| ddj «nd} |dzt |«k(r#tjtd«|| fz«‚g} t|dzt |««D]i} || }|dd k(rŒ|ddk(rnQ|dd k7r)|jjtd «|| fz«|d dkDr| j|d«Œin| s>|jjtd «t|j««z«| r|j!| | | «�ŒC|j#| | «�ŒW�Œ–|S)N)Ú admonitionsótypes admonitionsadmonitiontitleólinesrr1s6changeset %s: release notes directive %s lacks contentómarginó paragraphs=changeset %s: unexpected block in release notes directive %s óindents.error parsing releasenotes for revision: '%s' )rr rŠrœÚ enumerateÚstripr~rr‹rÚrangerJrCr,rÚnoder/r2)r]r�ržÚnotesrŸr�ÚblocksÚprunedÚiÚblockÚ directiver-r.ÚjÚpblocks rÚparsenotesfromrevisionsr¸RsÌ€Ü Ó €EäˆØ�3‰iˆä Ÿ™Ø �O‰OÓ ¨:ô ‰ˆ�ô" &×)‰HˆAˆuØ�W‰~ Ò.ØàÐ0Ñ1ˆIØ27¸²/�E˜(‘O AÑ&×,Ñ,Ô.ÀtˆEà�1‰uœ˜F› Ò#Ü—k‘kÜð)óð˜IÐ&ñ 'óððˆJܘ1˜q™5¤# f£+Ö.�Ø ™�ð˜'‘? iÒ/Øà˜'‘? mÒ3Ùà˜'‘? lÒ2Ø—G‘G—L‘LÜð4óð  Ð*ñ +ôð˜)Ñ$ qÒ(Ø×%Ñ% f¨XÑ&6Õ7áð-/ñ2Ø—‘— ‘ ÜÐHÓIܘ#Ÿ(™(›*“oñ&ôñØ×#Ñ# I¨u°jÖAà×&Ñ& y°*Ö=òi*ððz €Lr cóJ‡ —t«}tj|«dŠ d ˆ fd„ }d}t‰ «D]é\}}|ddk7rŒ|dd}|ddk(r[|j |«}|s!t j td «|z«‚|}||«} | sŒ`| D]} |j|| «ŒŒz|dd k(rH|tk(r"||«} | D]} |j|| «ŒŒ­||d «} |j||| «ŒÊt j td «|z«‚|S)z6Parse text content containing generated release notes.rcó¶•—g}t|dzt‰««D�]/}‰|}|ddk(rŒ|ddk(r|S|ddk(rÇ|ddk7rtjt d««‚|r5|d D�cgc]}|ddj «‘Œ}}|j |«Œ‚|d D�cgc]}|ddj «‘Œc}g}‰|dzdD](}|dd vrn|dd k(sŒ|j |d «Œ*|j |«Œì|dd k7r$tjt d «|dz«‚|s�Œ|j |d «�Œ2|Scc}wcc}w) Nr1r§r©ósectionóbulletr«rs#indented bullet lists not supportedr¨)r¼r»rªs*unexpected block type in release notes: %s)r®r~rr‹rr­r,)Úoffsetr-Ú notefragmentr³r´Úlrnr±s €rÚgatherparagraphsbulletsz6parsereleasenotesfile..gatherparagraphsbullets›s�ø€Øˆ ä�v ‘z¤3 v£;×/ˆAؘ1‘IˆEà�W‰~ Ò*ØØ�w‘ :Ò-Øð4Ðð3�w‘ 9Ò,ؘÑ# qÒ(ÜŸ+™+¤aÐ(NÓ&OÓPÐPÙØ49¸(²OÓD±O¨q˜Q˜q˜r˜UŸ[™[�]°O�EÐDØ ×'Ñ'¨Ô.Øà5:¸8²_ÓE±_°˜a  ˜eŸk™k�m°_ÑEÐF�Eà!'¨¨A©¨£˜Ø  ™>Ð-DÑDÙ!Ø  ™>¨\Ó9Ø!ŸL™L¨¨x©Õ9ð "1ð !×'Ñ'¨Ô.ØØ�w‘ <Ò/Ü—k‘kÜÐCÓDؘG‘nñ%óðóØ×#Ñ# E¨(¡OÖ4ð=0ð@Ðùò+EùòFs Á0EÂ%ENr§r»r¨s underlineó=s!unknown release notes section: %só-Tsunsupported section type for %s)F) rr rŠr¬rfrr‹rr2ÚBULLET_SECTIONr/) rÚtextr°rÀÚcurrentsectionr³r´r-rdÚ bullet_pointsror.r±s @rÚparsereleasenotesfilerÇ•sGø€ä Ó €Eä �]‰]˜4Ó  Ñ #€Fõ#ðJ€NܘfÖ%‰ˆˆ5Ø �‰>˜ZÒ 'Ø à�h‘ Ñ"ˆð �Ñ  $Ò &Ø×,Ñ,¨UÓ3ˆDÙÜ—k‘kÜÐ:Ó;¸eÑCóðð"ˆNÙ3°AÓ6ˆMÚÛ)�DØ×*Ñ*¨>¸4Õ@ñ*ð�<Ñ  DÒ (ØœÒ&Ù 7¸Ó :� Û)�DØ×*Ñ*¨>¸4Õ@ñ*ñ5°Q¸Ó=� Ø×#Ñ# N°E¸:ÕFä—+‘+œaÐ BÓCÀeÑKÓLÐ Lð=&ð@ €Lr c óò—g}|D�]G\}}||vrŒ |j|«|jdt|«z«|jd«|j|«D]¾\}}|j|«|jdt|«z«|jd«t|«D][\}}|r|jd«|j t j dj|«d¬«j««Œ]|jd«ŒÀ|j|«} |j|«rI| rG|jt«|jdtt«z«|jd«| D]»}|j t j dj|d«ddd ¬ «j««|d d D]X}|jd«|j t j dj|«dd d ¬ «j««ŒZ|jd«Œ½�ŒJ|r|d r|jd«dj|«S)zÓSerialize release notes from parsed fragments and notes. This function essentially takes the output of ``parsenotesfromrevisions()`` and ``parserelnotesfile()`` and produces output combining the 2. rÁr rÂrhéN)Úwidthrs* s )rÊÚ initindentÚ hangindentr1Néÿÿÿÿó ) r,r~r6r¬rjrÚwraprkÚ splitlinesr8rÃ) rr°rnÚ sectionnameÚ sectiontitler-r.r³roÚ nontitleds rÚserializenotesrÔäs€ð €Eä%-Ñ!ˆ �\Ø ˜eÑ #Ø à � ‰ �\Ô"Ø � ‰ �TœC  Ó-Ñ-Ô.Ø � ‰ �SÔð"'×!7Ñ!7¸ Ö!DÑ ˆE�:Ø �L‰L˜Ô Ø �L‰L˜¤ E£ Ñ*Ô +Ø �L‰L˜Ô ä$ ZÖ0‘��4ÙØ—L‘L Ô%Ø— ‘ Ü—O‘O D§I¡I¨d£O¸2Ô>×IÑIÓKõð1ð �L‰L˜Õ ð"Eð(×-Ñ-¨kÓ:ˆ Ø × !Ñ ! +Ô .±9à �L‰LœÔ (Ø �L‰L˜¤¤NÓ 3Ñ3Ô 4Ø �L‰L˜Ô ã#ˆJØ �L‰LÜ—‘Ø—I‘I˜j¨™mÓ,ØØ$Ø$ô ÷ ‘*“,ô  ð# 1 2›�Ø— ‘ ˜SÔ!Ø— ‘ Ü—O‘OØŸ ™  $›Ø Ø#(Ø#(ô ÷ !‘j“lõ ð'ð �L‰L˜Õ ò+$ðI&.ñv ��r’Ø � ‰ �SÔà �:‰:�eÓ Ðr ó releasenotesórórevr s&revisions to process for release notessREVócócheckFs+checks for validity of admonitions (if any)ólólists/list the available admonitions with their titles"hg releasenotes [-r REV] [-c] FILE)Ú helpcategoryc ó<—tj|«}t||«}tj|dddg«|j d«r t ||«S|j d«}tj||xsdg«}|j d«rt|||j«|«St||j«|«}|€,|jd«|jt||««S t|d«5}t!||j#««} ddd« j)||«t|d«5}|jt|| ««ddd«y#1swYŒLxYw#t$$r t'«} YŒdwxYw#1swYyxYw) aé parse release notes from commit messages into an output file Given an output file and set of revisions, this command will parse commit messages for release notes then add them to the output file. Release notes are defined in commit messages as ReStructuredText directives. These have the form:: .. directive:: title content Each ``directive`` maps to an output section in a generated release notes file, which itself is ReStructuredText. For example, the ``.. feature::`` directive would map to a ``New Features`` section. Release note directives can be either short-form or long-form. In short- form, ``title`` is omitted and the release note is rendered as a bullet list. In long form, a sub-section with the title ``title`` is added to the section. The ``FILE`` argument controls the output file to write gathered release notes to. The format of the file is:: Section 1 ========= ... Section 2 ========= ... Only sections with defined release notes are emitted. If a section only has short-form notes, it will consist of bullet list:: Section ======= * Release note 1 * Release note 2 If a section has long-form notes, sub-sections will be emitted:: Section ======= Note 1 Title ------------ Description of the first long-form note. Note 2 Title ------------ Description of the second long-form note. If the ``FILE`` argument points to an existing file, that file will be parsed for release notes having the format that would be generated by this command. The notes from the processed commit messages will be *merged* into this parsed set. During release notes merging: * Duplicate items are automatically ignored * Items that are different are automatically ignored if the similarity is greater than a threshold. This means that the release notes file can be updated independently from this command and changes should not be lost when running this command on that file. A particular use case for this is to tweak the wording of a release note after it has been added to the release notes file. The -c/--check option checks the commit message for invalid admonitions. The -l/--list option, presents the user with a list of existing available admonitions along with their title. This also includes the custom admonitions (if any). rÛr×rÙs not public()NrÕórbswb)r Ú byteskwargsrTrÚcheck_incompatible_argumentsr5r¤r Úrevranger¢rbr¸ÚpagerrFrÔrrÇr‘ÚFileNotFoundErrorrrO) rJr]Úfile_ÚoptsrrŸržÚincomingÚfhr°s rÚ releasenotesrè-s`€ô^ × Ñ  Ó %€DÜ# B¨Ó-€Hä ×(Ñ(¨¨w¸ÀÐ8JÔKà ‡x�x�ÔÜ! " hÓ/Ð/à �(‰(�6Ó €CÜ × Ñ ˜t cÒ&<¨_Ð%=Ó >€DØ ‡x�x�ÔÜ  D¨(¯.©.Ó*:¸DÓAÐAä& t¨X¯^©^Ó-=¸tÓD€Hà €}Ø �‰�Ô!Ø�x‰xœ x°Ó:Ó;Ð;ð%Ü �%˜Ô  2Ü)¨(°B·G±G³IÓ>ˆE÷ ð  ‡K�K��HÔä ˆe�UÔ ˜rØ �‰” ¨%Ó0Ô1÷ Ð ÷ Ð ûä ò%Ü"Ó$Šð%ú÷ Ð ús6Ã; E9ÄE-Ä"E9ÅFÅ-E6Å2E9Å9FÆFÆFsdebugparsereleasenotesT)Únorepoc óÀ—|dk(rtjj«}n%t|d«5}|j«}ddd«t ||«}t |«}|D]ë}|j td«|z«|j|«D]U\}} |j td«|z«| D].} |j td«dj| «z«Œ0ŒW|j|«D]O} |j td««| D].} |j td«dj| «z«Œ0ŒQŒíy#1swY�ŒxYw) z6parse release notes and print resulting data structurerÂrÞNs section: %s s subsection: %s s paragraph: %s rhs bullet point: ) rÚstdinr‘rrTrÇrFrr6rkr8) rJÚpathr]rÄrçrr°r#r-r.ros rÚdebugparsereleasenotesrí»s*€ð ˆt‚|Ü�~‰~×"Ñ"Ó$‰ä �$˜Ô  "Ø—7‘7“9ˆD÷ô$ B¨Ó-€Hä ! (¨DÓ 1€EãˆØ �‰”Ð#Ó$ wÑ.Ô/Ø!&×!7Ñ!7¸Ö!@Ñ ˆE�:Ø �H‰H”QÐ,Ó-°Ñ5Ô 6Û"�Ø—‘œÐ1Ó2°T·Y±Y¸t³_ÑDÕEñ#ð"Að  ×3Ñ3°GÖ<ˆJØ �H‰H”QÐ+Ó,Ô -Û"�Ø—‘œÐ1Ó2°T·Y±Y¸t³_ÑDÕEñ#ñ=ñ÷Ñ ús ±EÅEr)7Ú__doc__r•rsÚmercurial.i18nrÚmercurial.pycompatrÚmercurial.noderÚ mercurialrrrr r r r r Úmercurial.utilsrrÚcmdtableÚcommandÚwarningsÚcatch_warningsÚfilterwarningsÚ UserWarningÚfuzzywuzzy.fuzzrBrƒÚ ImportErrorÚ testedwithrWÚcompileÚ MULTILINEr›rurÃrrTrDrErGrHrIr€rXr¢r¤r¸rÇrÔÚCATEGORY_CHANGE_NAVIGATIONrèrír;r rÚrs7ðñ óÛ åÝ#Ý÷ ÷ ó ÷ð €Ø ˆ)× Ñ ˜HÓ %€ðóà ˆ× Ñ Õ "؈×ÑØØ,Ø Ø$õ  õ 'à ×Ò÷ #ð$#€ ð‘�?Ó#Ð$Ø ‰AÐ0Ó 1Ð2Ø ‰Qˆ|‹_ÐØ ‰aÐ+Ó,Ð-Ø ‰Qˆ~Ó Ðð Ððˆr�z‰zÐAÀ2Ç<Á<ÓP€ Ø -€áÐ#Ó$€÷Z;ñZ;÷zñò2 ò òòòò$ò" ò$!EòH9ò @òFLò^FñR Øð Ø Ø Ù Ð7Ó 8Ù ˆf‹Ið  ð Ø Ø Ù Ð<Ó =Ù ˆf‹Ið  ð Ø Ø Ù Ð@Ó AØ ð  ðñ.Ð+Ó,Ø×3Ñ3ô5ò8o2ó9ð8o2ñd Ð "¨4Ô0òFó1ñF÷_ #Ð "ûðòØ ƒDðús*ÁFÁ#)F  FÆ FÆFÆF ÆF