^cddlZddlZddlZddlZddlmZddlmZmZddl m Z ddl m Z m Z mZmZm Z mZmZmZmZmZmZmZmZddlmZmZdZd Zd ZiZiZej Z!e!j"Z"e!j#Z#e!j$Z$ed Z%ed Z&Gd dZ'dZ(dZ)dZ*dZ+dZ,dZ-e!de"dZ.e!de"dZ/e!de"dZ0e!de"dZ1dZ2dZ3dZ4d Z5d!Z6e!d"e$ed#e5$d%Z7e!d&e$ed#e5$d'Z8e!d(e$ed#e5$d)Z9e!d*e$d+e5$d,Z:e!d-e$ed#e5$d.Z;e!d/e#e5$d0Z<e!d1e#e5$d2Z=e!d3e#ed4d5Z>e!d6e$d7d78d9Z?e!d:e#d7d78d;Z@d<ZAd=ZBd>ZCd?ZDdLd@ZEdAZFdBZGejHdCZIdLdDZJdEZKdFZLdGZMdHZNdIZOdJZPdKZQeQdde!eRZSdS)MN)_)hexshort)getattr) encodingerror formattermatchpycompat registrarscmutil simplemergetagmerge templatekw templater templateutilutil)procutil stringutilc,|jd|dz|zg|RSN merge-tools.)configuitoolpartargss 5/usr/lib/python3/dist-packages/mercurial/filemerge.py_toolstrr"-s' 29^TD[4%7 ?$ ? ? ??c,|jd|dz|zg|RSr) configboolrs r! _toolboolr&1s' 2=t); Cd C C CCr#c:|d|dz|zSr) configlist)rrrs r! _toollistr)5s ==t); < <|jjSr-)r.reponullidr5s r!filenodezabsentfilectx.filenodensy~~&&r#Tc|oS||ko)||k S)zVcompare with other file context returns True if different from fctx. isabsent changectxr8)r0fctxs r!cmpzabsentfilectx.cmpssW MMOO +  DNN$4$44 + tyy{{*  r#cdS)Nr#r:r5s r!flagszabsentfilectx.flags~ssr#c|jSr-)r.r5s r!rFzabsentfilectx.changectxs yr#cdSNFr:r5s r!isbinaryzabsentfilectx.isbinarysur#cdS)NTr:r5s r!rEzabsentfilectx.isabsentr<r#N)__name__ __module__ __qualname____doc__r3r6r8r;r>rB _customcmprHrJrFrNrEr:r#r!r+r+WsII ;;;'''J    r#r+c|tvr|St||d|}|dr|St||S)N executablepython:) internalsr" startswithfindexternaltool)rrcmds r! _findtoolr\sN y 2t]D 1 1C ~~j!! B % %%r#cX|dr|Stj|S)NrW)rYr shellquote)r[s r!_quotetoolpathr_s, ~~j!!  s # ##r#c JdD]i}t|||}|stj|t||d}|r-tj|t||ddz}|r|cSjt||d|}tjtj|S)N)sregkeys regkeyaltsregnames regappendr#rV)r"r lookupregrfindexe expandpath)rrknkpexes r!rZrZs' Rr " "   N1hr4<< = =   Xb$ c%J%J!JKKA  2t]D 1 1C  DOC00 1 11r#cXdddfd dfd}dd}|r6t|}|r |sd S|r|t|fS||fStjd } | r|r | sd S| | fS|o} d D]\} } tj|j d | g} | |r|| | || |r~|rY| d dsK tdtj | tj |fzt| }| t|fcSi}tdD]k\}}|dd}||vr!t!t#|d||<t%|dr|l|}t+fd|D}dd}|r1||||||r"||vr|s||fS|dd|f|d|D]7\}}||d|||r#t|}|t|fcS8|s|s|r8|s4t3|r% td|zd SdS)Nmergesstrict-capability-checkFc|tvr'|o$t|j|St||Sr-)rX capabilitiesgetr&)r capabilitystrictrs r! hascapabilityz _picktool..hascapabilitys@ 9  Jio:>>zJJ JT:...r#cJ|tvot|jtkSr-)rX mergetypenomergers r! supportscdz_picktool..supportscdsy IYt_%>'%IIr#c||}|rtd||fz}t |sN|r& td|zn td|zn|r3|ds& td|zn|r3|ds& td|znZ|r |snLt js7t |dr& td|znd Sd S) Ns%s (for pattern %s)scouldn't find merge tool %s ssymlinkstool %s can't handle symlinks binarystool %s can't handle binary guistool %s requires a GUI TF)rr\warnnoterguir&) rpatsymlinkbinary changedeletetmsgro strictcheckrtrs r!checkz_picktool..checkst  ;+,,c{:DT""  D:;;dBCCCC:;;dBCCCC  ]]4[II  GGA899D@ A A A A  MM$ ;GG  GGA677$> ? ? ? ?  **T"2"2   Ib$$?$?  GGA122T9 : : : :4ur#uis forcemerge)s:promptNsHGMERGEsmerge-patternsr#rvT)rnswarning: check merge-patterns configurations, if %r for binary file %r is unintentional (see 'hg help merge-tools' for binary files capability) rrrsprioritysdisabledc(g|]\}}|v | |fSr:r:).0rrfdisableds r! z_picktool..s-IIIaD4H4H1"d4H4H4Hr#)Nshgmergesno tool found to merge %s )s:mergeN)F)r%rr\r_renvironrl configitemsr rootrxrr bytestrsetsplitintr"r&addkeyssorteditemsinsertappendlen)r@rr8r}r|r~rforcetoolpathhgmerge binarycapr{rmftoolsrevtnamesuimergerfrrorrts ` @@@@r! _picktoolrs---*DEEK////// JJJ2 IIe] + +E &R''  & 8 4 4 &## &~h7788u~%"":..G&  & 7 3 3 &##W% % &;I^^$56644 T [C# / / 2d88 4dC)\JJ 4 mmD)DIII ;  '--x/?/E/EF G!T**H.223 3 3 3 EuuH~..1 GGDMM!  E>>8B;7788E!H RK ( (  LLOOO JJLLE IIII5;;==III  Eiix((G- 5$ > > -e##L#)) LLT7O , , , LL#$$$111 5D'6< 8 8 1 Q''H~h//0 0 0 0 1  & L  >E  > GGA455< = = = ?r#c6d|vrdSd|vrdSd|vrdSd|vrdSdS)zGuess the EOL type of a fileNs   r:r>s r!_eoltypers? }}t$w }}u }}u 4r#ct|}|rXtj|}t|}|r5|||}||krtj||dSdSdSdS)z/Convert EOL markers in a file to match origfileN)rr>rreadfilereplace writefile)filebackuptostyler>stylenewdatas r! _matcheolr&sv{{}}%%G.}T""  .ll5'22G$tW----- .. . .r#promptc |j}|j}tj|}|jrtjdt|j |j g} ||| d< |j r)| t| zd} gd| } nr|j r)| t| zd} gd| } n0| td| zd} gd| } | dkrt!||||||S| dkrt#||||||S| d krt%||||||Sd S#tj$r,|d t%||||||cYSwxYw) zfAsks the user which of the local `p1()` or the other `p2()` version to keep as the merged version.s/in-memory merge does not support file conflictssfd)localother unresolved)rrrsfile '%(fd)s' needs to be resolved. You can keep (l)ocal%(l)s, take (o)ther%(o)s, or leave (u)nresolved. What do you want to do?$$ &Local $$ &Other $$ &UnresolvedrrrrN)rrGr8r getuipathfnrF isinmemoryr InMemoryMergeConflictsError partextraslabelrE promptchoice_localchangedotherdeletedmsg_otherchangedlocaldeletedmsgr_iother_ilocal_ifailResponseExpectedwrite) r@mynodelocalotherbasetoolconfrfduipathfnpromptsindexchoices r!_ipromptr2s# B   B"4((H z((** / >   %+u{344GXb\\GEN B :    @OO$@7$JANNE888?FF Z " " @OO$@7$JANNE888?FF OO:  E988?F X  4tXFF F x  4tXFF F } $ $$udHEE E% $  !BBB dFE5$AAAAABsC F",F"F""8GGrc8d|jfS)z=Uses the local `p1()` version of files as the merged version.r)rGrEr@rrrrrs r!rrfs ej!!## ##r#rc>|jr)t|jd}nXt|j|j|jd}d|fS)z=Uses the other `p2()` version of files as the merged version.TFr)rGrE_underlyingfctxifabsentremoverr>rJ)r@rrrrrdeleteds r!rrls z ++22444 ++11 JOO  uz//11    g:r#sfailc|jrVt|j|j|jdS)z Rather than attempting to merge files that were modified on both branches, it marks them as unresolved. The resolve command must be used to resolve these conflicts.rF)rGrErrr>rJrs r!rr{sb z  ++11 JOO  uz//11    8r#c|r,||S|S)zSometimes when resolving, our fcd is actually an absentfilectx, but we want to write to it (to do the resolve). This helper returns the underyling workingfilectx in that case. rD)filectxs r!rrs<   ""7<<>>22r#ctj|rbtd|jz}|td|ztj|dS)z verifies that text is non-binarys%s looks like a binary file.s warning: %s N) rr}textrrGr8rxr Abort)inputrmsgs r! _verifytextrsv&&/005:??3D3DD "##c)***k#r#c|\}}}}} |s2|js|jrdS|j} gd} t| |d| } n#tj$rqt | |dd} | | vrFdd| D} t jtd|| | fzYnwxYw| rd}| d krd }n| d krd }td |||fDrdStj ||||\}}|r| | vr2|j ||j |s| ddSdS)Nr)skeep keep-merge3keep-mergediffspremerger#, cg|] }d|zdz S)'r:)rrs r!rz_premerge..s D D DQD D D Dr#s6%s.premerge not valid ('%s' is neither boolean nor %s)rir mergediffrmerge3c3bK|]*}tj|V+dSr-)rr}r)rrs r! z_premerge..sF  05J ejjll + +      r#modes premerge successful r)rGrErr&r ConfigErrorr"lowerjoinranyrrrJdebug)r@rrrrrrr}r|scriptfnr validkeeppremerge_validr merged_text conflictss r! _premergers 08-D(FGX%*%%''5:+>+>+@+@q B<<H 11 J  [%**:*:*<*< = = =  HH. / / /1 1s AA=CCc|\}}}} } tj|} | rI|jt d|| |fzdS|s|rI|jt d|| |fzdSdS)Ns2warning: internal %s cannot merge symlinks for %s Fs@warning: internal %s cannot merge change/delete conflict for %s T)rrrrxrr8rE) r@rfcdfcofcarrrr}r|rrs r! _mergecheckrs08-D(FGX"4((H  D E EXXchhjj))* +   u ||~~  %  XXchhjj))*  +   u 4r#cB|j} t||t||t||tj||||\}}|j||jd|dfS#t j$rYdSwxYw)a) Uses the internal non-interactive simple merge algorithm for merging files. It will fail if there are any conflicts and leave markers in the partially merged file. Markers will have two sections, one for each side of merge, unless mode equals 'union' which suppresses the markers.rTF)TTF)rrrrGrrJr r)r@rrrrrrrs r!_mergers B &E2D"E2"-!8 4T" " "  Y  ej&6&6&8&8999Y%% ;!!!   !s0B BBunionsJwarning: conflicts while merging %s! (edit, then use 'hg resolve --mark') )precheckc(t||||dS)z Uses the internal non-interactive simple merge algorithm for merging files. It will use both left and right sides for conflict regions. No markers are inserted.rrr@rrrrrrs r!_iunionrs $udH 5 55r#ric(t||||dS)z Uses the internal non-interactive simple merge algorithm for merging files. It will fail if there are any conflicts and leave markers in the partially merged file. Markers will have two sections, one for each side of merge.rirrs r!_imergers $udH 5 55r#rc(t||||dS)a Uses the internal non-interactive simple merge algorithm for merging files. It will fail if there are any conflicts and leave markers in the partially merged file. Marker will have three sections, one from each side of the merge and one for the base content.rrrs r!_imerge3rs $udI 6 66r#smerge3-lie-about-conflictsr#c,t|i|\}}}|d|fSrM)r)r kwargsb1junkb2s r!_imerge3alwaysgoodr *s*T,V,,LBb ub=r#rc(t||||dS)ag Uses the internal non-interactive simple merge algorithm for merging files. It will fail if there are any conflicts and leave markers in the partially merged file. The marker will have two sections, one with the content from one side of the merge, and one with a diff from the base content to the content on the other side. (experimental)rrrs r! _imerge_diffr=s $udL 9 99r#s merge-localc(t||||dS)zg Like :merge, but resolve all conflicts non-interactively in favor of the local `p1()` changes.rrrs r! _imergelocalrP $udH 5 55r#s merge-otherc(t||||dS)zg Like :merge, but resolve all conflicts non-interactively in favor of the other `p2()` changes.rrrs r! _imergeotherrXrr#stagmergesjautomatic tag merging of %s failed! (use 'hg resolve --tool :merge' or another merge tool of your choice) c^tj||j|j|j\}}||dfS)z? Uses the internal tag merge algorithm (experimental). F)rmergerG) r@rrrrrrsuccessstatuss r! _itagmerger`s0nT5:uz49MMOGV FE !!r#sdumpT)r}r|cHt||j}|j}ddlm} t |j| jrtjdtj |dz|j | |dz|j |j| |dz|j |jdS)a Creates three versions of the files to merge, containing the contents of local, other and base. These files can then be used to perform a merge manually. If the file to be merged is named ``a.txt``, these files will accordingly be named ``a.txt.local``, ``a.txt.other`` and ``a.txt.base`` and they will be placed in the same directory as ``a.txt``. This implies premerge. Therefore, files aren't dumped, if premerge runs successfully. Use :forcedump to forcibly write files out. rcontexts0in-memory merge does not support the :dump tool.s.locals.others.base)FrF) _workingpathrGr8r isinstanceoverlayworkingfilectxr rrr decodeddatawwriter>rJ) r@rrrrrrarrs r!_idumpr#qs T5:&&A   B%*g;<< / ?    N1y=%*"8"8":":;;;KKY  1 15:3C3C3E3EFFFKKX ty~~//1B1BCCC ?r#s forcedumpc ,t|||||||S)zS Creates three versions of the files as same as :dump, but omits premerge. )r#rs r! _forcedumpr%s $udHf E EEr#c*tjd)Ns5in-memory merge does not support external merge tools)r rrs r! _xmergeimmr's  +@  r#c ||dd} | sdStj} |t ||| ||t |t dd|v|dd| ||t dd|v|dd | ||t d d|v|d d ||d } tj | } tj ||} tj || tj| } || | dS)Ncommand-templatesspre-merge-tool-outputrl HG_MY_LABEL)ctxfctxnodenameislinklabelbase HG_BASE_LABEL)r,r-r/r0r1rHG_OTHER_LABEL)r,r.spathrr2rstoolpathstoolargsdefaults resources)rr mappingdictrFrr8rrJr unquotestringr templateresources maketemplaterrkeywordsr renderdefault)rr@rfclfcbrenvrr tmplr8propstresrs r!_describemergerDs 99)+C D DD *K V+ V8399;;.n-       7399;;../     + 8399;;./0     C" " EJ  "4 ( (D  &r4 0 0D D:.$   AIIaooe$$%%%%%r#c  |j}|j}|j} |\} } } } }tj|}|s|rI|jt d| ||fzdSt||}t|j| d}d| | fd|| fg}d}d|vrw|}|}| dr"tj |\}}|d ||ft!|5}|dd \}}t#|d kr|d }d }|t%|t%|t%| d |vd |vd | v||||||d }|j}||||||||||d}t-jd||d}t1|| drG|jt d| ||fz|[| dz|z}|jd|zt7||||| ||| | |||j|d}n|jd| |fzd} ddlm}| | d| z} n2#tB$r%tEj#t d| zwxYwtI| |d}!|!&tEj#t d| |fztKj&|}"ddlm'}#|#(||d | |!d|"id!\}$}%|%rd}|jd"|zd!|d#fcdddS#1swxYwYdS)$Ns7warning: %s cannot merge change/delete conflict for %s )FrNsargsr2rr#s$outputs.origrrc@|jrd|j|jfzS|jS)Ns%s: %s) label_detailr)rs r! format_labelz_xmerge..format_labels*! # EK1C#DDD{"r#r*) sHG_FILEs HG_MY_NODEs HG_OTHER_NODEs HG_BASE_NODEs HG_MY_ISLINKsHG_OTHER_ISLINKsHG_BASE_ISLINKr+r4r3)rr2rsoutputs labellocals labelothers labelbase\$cNtjtj|Sr-rr^r localpathss r!z_xmerge..sh)$.*;*;<<r#rws"running merge tool %s for file %s  slaunching merge tool: %s s mergetool)cwdr blockedtags%launching python merge script: %s:%s rr) extensionss hgmerge.%ss&loading python merge script failed: %ss%s does not have function: %s)hookriTsmerge tool returned: %d F))rGrrrErrxrr8rr"r endswithossplitextrr>_maketempfilesrrrFnoderJr interpolater&rrrDsystemrrrTloadpath Exceptionr rrr shellsplitrU pythonhook)&r@rrrrrrrrrrrr}r|rrrMr filesoutpathlocaloutputpathext temppathsbasepath otherpathrIr@rrr[rrTmodmergefnargslistrUretraiseds& r!_xmergerns *C *C )C08-D(FGX"4((H ||~~  I J JXXchhjj))* +   ~T3''I DGT7 + +D #((**coo//0 388::s001 EGT ++--  # #H - - E#%7#3#3O#D#D OS h?@@@   Q)'m) y>>Q  !! I # # #  ==#CMMOO$8$8$:$:;;"3==??#7#7#9#9::!SYY[[0 $ 3#syy{{2(L//+|E22*l400   W '<..'<..&,t,,      < <    Rv & &  GNN899#((**--./     T/D(C GMM7#= > > > 2tVS#sC4 P P P CLAA GMM9Xx>H B&|dddSd|dzd|dzdS)zReturn a dictionary of extra labels for use in prompts to the user Intended use is in strings of the form "(l)ocal%(l)s". Nr#)r*os [%s]rrr:)labelss r!rrfsG ~   ""  r#c|rdSddlm}t||jrlt jd\}}tj|d5}| | dddn #1swxYwYnMtj ||| }t||}tj|||||S)aMakes and returns a filectx-like object for ``fcd``'s backup file. In addition to preserving the user's pre-existing modifications to `fcd` (if any), the backup is used to undo certain premerges, confirm whether a merge changed anything, and determine what line endings the new file should have. Backups only need to be written once since their content doesn't change afterwards. Nrrshg-merge-backupwb)r@)rErrrrr mkstemprWfdopenrr>r backuppathr8rrcopyfilearbitraryfilectx)r@rrrrrr2r"s r! _makebackuprws. ||~~t#w455!%&899 F Yr4  A GGCHHJJ                  #Bchhjj99 s # # a    # #F # 6 66s(BBBc#Ktjdfd}g}|D]&\}}}|||||' |VtjdS#tjwxYw)zyCreates a temporary file for each (prefix, path, data) tuple in `files`, so an external merge tool may use them. shgmerge-)prefixc tj|\}}dtj||fz}tj|}|r||z }t j|||S)Ns%s~%s)rWr8rXbasenamerrr)rr8r>fullbaserdprenametmproots r!maketempfrompathz(_maketempfiles..maketempfrompathsx((.. #"'**844f==w||GS))   CKD tT""" r#N)r mkdtemprshutilrmtree)rar temp_filesrr8r>rs @r!rYrYs k222GJ#@@d**64>>???? g gs A$$A:c H |j}|} tj|} | | } |p'|p|} d||zv} |p|}t||| | | |\}}d}|tvr,| dr|tdd}|r| drud}| ddkr0|d d dd \}}|sd }d |vsd |vrd }nd }|r$tjtd|z|}|d|| t#j| t#j| t#j|fz|tvr%t|}|j}|j}|j}d}n=|rt.}nt0}t2}td}d}d }||| | |f}|sddg}t|dkr|dt7j||d}t7j||d }t7j||d}|t:kr|||||||S||krM|td| || || fzn%|td| z|d|||fz|rT|||||||sD|r@|rtjd| || zdStC|||}d } |"dd}|rtG||d} n|} |t2krtI||||d}!| dkr|}!|dks| dkrtK||||g|!tM|||||}|s|df|s||'SSSd|_(d|_(d|_(| dkrtK||||g|||||||||\}"}}#|"rtS||||||}|rQ|r@|rtjd| || ztU|||#f|s||'SSS#|s||'wwwxYw)aperform a 3-way merge in the working directory mynode = parent node before merge orig = original local filename before merge fco = other file context fca = ancestor file context fcd = local file context for current/destination file Returns whether the merge is complete, the return value of the merge, and a boolean indicating whether the file was deleted from disk.r*N internal:sinternalrWF:rrT\/sinvalid 'python:' syntax: %ss?picked tool '%s' for %s (binary %s symlink %s changedelete %s) smerging %s failed! rrrFr2rsmerging %s and %s to %s s merging %s smy %s other %s ancestor %s s0in-memory merge does not support merge conflictsrrs mergemarkerssbasicrs)+rr8rrrNrJrErrXrYrcountrsplitr rrrr rrq onfailurerrr'rn fullmergerr MergeInputrrrrrxrrr"_run_partial_resolution_toolsrwrrrH_check_onfilemergefailure)$r@wctxrorigrrrrzrrrfduipathr}r|r~rrr invalidsyntaxscriptfuncrqrr isexternalrrrrrrhinternalmarkerstyle markerstyle labeltool needcheckrs$ r! filemergers B B"4((Hx||H \\^^ ?s||~~ ?FciikkCIIKK//G<<>>3S\\^^LtRVWlKKND(H yT__\::C $$&&' H'' 33  >>$  1 $ $'|224;; FH % $   DH$4$4 $  M  M+a ?@@8KLL LHHK    V $ $  W % %  \ * *       yN N = ??   DDD -..  Xvw8H &H% 6{{Q g  "3q 2 2E  "3q 2 2E  !#vay 1 1DGt           sxxzz * + +x~~xx 33X> ?    !O$$x/000HH ,S# >???vsChGG  *   7G GGI( ) ) )x r3 ' 'F AF ii??  ."2t_==KK-K  ! ! )$ud C C C Ih&&! "h..+2I2I'5%.Y A %xH V' MMOOOO 'C"&E !%E  $D  ( " " #D5%*>T J J J J $       ! !  1g  7tQD#v66A $ .??$$;+  H,---  # # #'z V' MMOOOO 'q V' MMOOOO 'sB V9B1VV!cd|j}|ddrdSg}t}d}||D]\}} |dd} | |vr&||d| zg} d} | rVt j|jd | |j } | |j } | r||d | zr| |d | zd}| |d | z| }| |d| z}| || ||f|sdS|d|j |fd|j |fd|j |fg}t!|5}|\}}}|D]\}} }}t#j|}|||d}t'jd||d}d||fz}|||jd}|rt-jd| |fzt'j|}t'j|}||krn|||t'j|||ddddS#1swxYwYdS)zCRuns partial-resolution tools on the three inputs and updates them.risdisable-partial-toolsNspartial-merge-toolsrrs %s.patternsTr#)r1s %s.disables%s.orders %s.executables%s.argsrr2r)rr2rrJcNtjtj|Sr-rLrNs r!rPz/_run_partial_resolution_tools..s(-dnQ.?.?@@r#s%s %sspartial-mergetool)rRrSs)partial merge tool %s exited with code %d)rr%rrrr(r rrGrFr8 configintrrsortrrYrr^rr[r\r StateErrorrset_text)r@rrrrrseensectionrerrpatternsis_matchmorder executabler rarerMrfrgr[rrh local_text other_texts r!rr_s B }}X788 E 55D$Gw''::1wwt}}Q 4<< ==.4*?DD  ,  3ej.B.B.D.DAq**++H  :}}Wmd&:;; LL+*=+|-])\1{6}( .*)$)boolresearch MULTILINErs r!hasconflictmarkersrs0  &  L    r#c|}tj|}|sGt||dsdt ||dvr#t |rd}d}dt ||dvr3d}|td||zdrd}|sn|slt||d sd t ||dvrH|F| |s1|td ||zdrd}|/t||d rtt||||S) Nscheckconflictss conflictsscheckrFrTs0was merge of '%s' successful (yn)?$$ &Yes $$ &Nos checkchangedschangedsJ output file %s appears unchanged was merge successful (yn)?$$ &Yes $$ &Nosfixeol) r8rrr&r)rr>rrrHrr) r@rhrrrrrrcheckeds r!rrs B"4((H "d-.. 9Rx88 8 8 chhjj ) ) AGIb$1111 ?? A B Bhrll      A  b$ 0 0  Yr4::::  cggfoo & (2,,    iD)<<,tS))6222 Hr#cP||Sr-)wjoinr8)r@r1s r!rrs ::chhjj ! !!r#c|jD]\}}d|z}|t|<|td|z<|t|<t d|jD}|r.s!LLLTQ!LqLLLr#s (actual capabilities: %s)rs %ss* (actual capabilities: binary, symlink)s! (actual capabilities: binary)s" (actual capabilities: symlink)N) _tablerrX internalsdocrrkrrSr sysstrr)rextname registrarobjrrfullnamerkcapdescs r!loadinternalmergers")//11 O O d$;" ()- ,%&!% XLLT->-D-D-F-FLLLMM  O6::G <(/)g:M*N*NNDL 3444*++++,,,,,r#r-)T contextlibrWrri18nrrZrrr rrrr r r r rrrrrrrutilsrrr"r&r)rXr internalmerge internaltoolrr mergeonlyrrrr+r\r_rZrrrrrrrrrrrrrrrr rrrrr#r%r'rDrnrtrwrrcontextmanagerrYrrrrrrrrvalues i18nfunctionsr:r#r!rs   @@@DDD===   &y&((     "  " !q-   !q.  11111111h&&&$$$ 2 2 2nnnb    . . .i!!0B0B"!0Bfh  $$! $ h    !  gw    ) ) ) X*&&&0  A 2666  A 2666  A 2777!        A 2:::ni+>>>66?>6ni+>>>66?>6 A """"gyt<<<=<8lIdDAAAFFBAF   3&3&3&lnnnb>>> , , , , "777< 0nnnnbF#F#F#R***    , , , ^"""---:$l+++  "" r#