Changeset

0:2f78b9100113 draft

Init.
author Trần H. Trung <xmpp:trần.h.trung@trung.fun>
date Mon, 10 Jul 2023 23:41:04 +0700
parents
children 1:7dde48d11103
files README.md bookmarks.tmpl branches.tmpl changeset.tmpl diffstat.tmpl error.tmpl fileannotate.tmpl filecomparison.tmpl filediff.tmpl filelog.tmpl filelogentry.tmpl filerevision.tmpl footer.tmpl graph.tmpl graphentry.tmpl header.tmpl help.tmpl helptopics.tmpl index.tmpl manifest.tmpl map notfound.tmpl search.tmpl shortlog.tmpl shortlogentry.tmpl style-hg.css tags.tmpl
diffstat 27 files changed, 2274 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,7 @@
+# Mercurial Template
+
+This template is what Mercurial is using to serve https://soft.trung.fun/code 
+
+It is based on paper. 
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bookmarks.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,60 @@
+{header}
+<title>Bookmarks {repo|escape}</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-bookmarks" title="Atom feed for {repo|escape}: bookmarks" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-bookmarks" title="RSS feed for {repo|escape}: bookmarks" />
+</head>
+<body>
+    <div class="main">
+        <div class="dd-hover menu">
+        <div class="dd-content">
+            <hr />
+            <h6>{repo|escape}</h6>
+            <ul>
+                <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+                <li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+                <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+                <li class="active">Bookmarks</li>
+                <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+            </ul>
+            <hr />
+            <ul>
+                <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+            </ul>
+            <div class="atom-logo">
+                <a href="{url|urlescape}rss-bookmarks" title="subscribe to RSS feed">
+                    RSS: <img class="rss-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="RSS feed" />
+                </a>
+                <a href="{url|urlescape}atom-bookmarks" title="subscribe to Atom feed">
+                    Atom: <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="Atom feed" />
+                </a>
+            </div>
+        </div>
+            {logo}
+        </div>
+        <main>
+            <hr />
+            <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+            {searchform}
+
+            <h2>Bookmarks</h3>
+            <table>
+                <thead>
+                <tr>
+                    <th>bookmark</th>
+                    <th>node</th>
+                </tr>
+                </thead>
+                <tbody class="stripes2">
+                    {entries%bookmarkentry}
+                </tbody>
+            </table>
+        <p></p>
+        <hr />
+        </main>
+    </div>
+    {logo}
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/branches.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,60 @@
+{header}
+<title>Branches {repo|escape}</title>
+    <link rel="alternate" type="application/atom+xml"
+       href="{url|urlescape}atom-branches" title="Atom feed for {repo|escape}: branches" />
+    <link rel="alternate" type="application/rss+xml"
+       href="{url|urlescape}rss-branches" title="RSS feed for {repo|escape}: branches" />
+</head>
+<body>
+    <div class="main">
+        <div class="dd-hover menu">
+        <div class="dd-content">
+            <hr />
+            <h6>{repo|escape}</h6>
+            <ul>
+                <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+                <li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+                <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+                <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+                <li class="active">Branches</li>
+            </ul>
+            <hr />
+            <ul>
+                <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+            </ul>
+            <div class="atom-logo">
+                <a href="{url|urlescape}rss-bookmarks" title="subscribe to RSS feed">
+                    RSS: <img class="rss-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="RSS feed" />
+                </a>
+                <a href="{url|urlescape}atom-branches" title="subscribe to Atom feed">
+                    Atom: <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="Atom feed" />
+                </a>
+            </div>
+            </div>
+            {logo}
+        </div>
+        <main>
+            <hr />
+            <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+            {searchform}
+
+            <h2>Branches</h3>
+            <table>
+                <thead>
+                    <tr>
+                        <th>branch</th>
+                        <th>node</th>
+                    </tr>
+                </thead>
+                <tbody class="stripes2">
+                {entries % branchentry}
+                </tbody>
+            </table>
+            <p></p>
+            <hr />
+        </main>
+    </div>
+    {logo}
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/changeset.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,101 @@
+{header}
+<title>Changeset {repo|escape}: {node|short}</title>
+</head>
+<body>
+    <div class="main">
+        <div class="dd-hover menu">
+        <div class="dd-content">
+            <hr />
+            <h6>{repo|escape}</h6>
+            <ul>
+                <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+                <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+                <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+                <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+                <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+            </ul>
+            <hr />
+            <h6>{symrev}</h6>
+            <ul>
+                <li><a href="{url|urlescape}file/{symrev}{sessionvars%urlparameter}">browse</a></li>
+                <li class="active">Changeset</li>
+                <li><a href="{url|urlescape}raw-rev/{symrev}{sessionvars%urlparameter}">raw</a></li>
+            </ul>
+            <ul>
+                {archives%archiveentry}
+            </ul>
+            <hr />
+            <ul>
+                <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+            </ul>
+            </div>
+            {logo}
+        </div>
+        <main>
+            <hr />
+            <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+            {searchform}
+
+            <h2>Changeset</h2>
+            <h4>{rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+            {alltags}
+            </h4>
+            <div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+            <table id="changesetEntry">
+                <tr>
+                    <th class="author">author</th>
+                    <td class="author">{author|obfuscate}</td>
+                </tr>
+                <tr>
+                    <th class="date">date</th>
+                    <td class="date age">{date|rfc822date}</td>
+                </tr>
+                {if(obsolete, '<tr>
+                    <th>obsolete</th>
+                    <td>{join(succsandmarkers%obsfateentry, '<br>\n')}</td>
+                </tr>')}
+                {if(instabilities, '<tr>
+                    <th>unstable</th>
+                    <td>{join(whyunstable%whyunstableentry, '<br>\n')}</td>
+                </tr>')}
+                <tr>
+                    <th class="author">parents</th>
+                    <td class="author">{ifeq(count(parent), '2', parent%changesetparentdiff, parent%changesetparent)}</td>
+                </tr>
+                <tr>
+                    <th class="author">children</th>
+                    <td class="author">{child%changesetchild}</td>
+                </tr>
+                <tr>
+                    <th class="files">files</th>
+                    <td class="files">{files}</td>
+                </tr>
+                <tr>
+                    <th class="diffstat">diffstat</th>
+                    <td class="diffstat">
+                        {diffsummary}
+                        <a id="diffstatexpand" class="diffstattoggle" href="#">[<tt>+</tt>]</a>
+                        <div id="diffstatdetails" style="display:none;">
+                            <a class="diffstattoggle" href="#">[<tt>-</tt>]</a>
+                            <table class="diffstat-table stripes2">{diffstat}</table>
+                        </div>
+                    </td>
+                </tr>
+            </table>
+
+            <div class="overflow">
+                <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
+                <div class="sourcefirst"> line diff</div>
+                <div class="stripes2 diffblocks">
+                    {diff}
+                </div>
+            </div>
+        <p></p>
+        <hr />
+        </main>
+    </div>
+    {logo}
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/diffstat.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,8 @@
+  <tr>
+    <td class="diffstat-file"><a href="#l{fileno}.1">{file|escape}</a></td>
+    <td class="diffstat-total" align="right">{total}</td>
+    <td class="diffstat-graph">
+      <span class="diffstat-add" style="width:{addpct}%;">&nbsp;</span>
+      <span class="diffstat-remove" style="width:{removepct}%;">&nbsp;</span>
+    </td>
+  </tr>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/error.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,39 @@
+{header}
+<title>{repo|escape}: error</title>
+</head>
+<body>
+
+    <div class="main">
+        <div class="menu">
+            <ul>
+                <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+                <li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+                <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+                <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+                <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+            </ul>
+            <ul>
+                <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+            </ul>
+            {logo}
+        </div>
+
+        <main>
+            <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+            {searchform}
+
+            <h2>error</h3>
+            <div class="description">
+                <p>
+                An error occurred while processing your request:
+                </p>
+                <p>
+                {error|escape}
+                </p>
+            </div>
+        </main>
+    </div>
+    {banner}
+
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fileannotate.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,98 @@
+{header}
+<title>Annotate {repo|escape}: {file|escape}</title>
+</head>
+<body>
+    <div class="main">
+        <div class="dd-hover menu">
+        <div class="dd-content">
+            <hr />
+            <h6>{repo|escape}</h6>
+            <ul>
+                <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+                <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+                <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+                <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+                <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+            </ul>
+            <hr />
+            <h6>{symrev}</h6>
+            <ul>
+                <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+                <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+            </ul>
+            <hr />
+            <h6>{file|escape}</h6>
+            <ul>
+                <li class="active">Annotate</li>
+                <li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+                <li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+            </ul>
+            <ul>
+                <li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+                <li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+                <li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">log</a></li>
+                <li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+            </ul>
+            <hr />
+            <ul>
+                <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+            </ul>
+            </div>
+            {logo}
+        </div>
+
+        <main>
+            <hr />
+            <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+            {searchform}
+
+            <h2>Annotate</h2>
+            <h4>{file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+                {alltags}
+            </h4>
+            <div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+            <table id="changesetEntry">
+            <tr>
+             <th class="author">author</th>
+             <td class="author">{author|obfuscate}</td>
+            </tr>
+            <tr>
+             <th class="date">date</th>
+             <td class="date age">{date|rfc822date}</td>
+            </tr>
+            {parent%fileannotateparent}
+            {child%fileannotatechild}
+            </table>
+
+            {diffoptsform}
+
+            <script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+                renderDiffOptsForm();
+            </script>
+
+            <div class="overflow">
+                <table>
+                <thead>
+                <tr>
+                 <th class="annotate">rev</th>
+                 <th class="line">&nbsp;&nbsp;line source</th>
+                </tr>
+                </thead>
+                <tbody class="stripes2 sourcelines"
+                       data-logurl="{url|urlescape}log/{symrev}/{file|urlescape}"
+                       data-selectabletag="TR"
+                       data-ishead="{ishead}">
+                  {annotate%annotateline}
+                </tbody>
+                </table>
+            </div>
+            <script type="text/javascript" src="{staticurl|urlescape}followlines.js"></script>
+            <p></p>
+            <hr />
+        </main>
+    </div>
+    {logo}
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filecomparison.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,105 @@
+{header}
+<title>Comparison {repo|escape}: {file|escape}</title>
+</head>
+<body>
+<div class="main">
+    <div class="dd-hover menu">
+    <div class="dd-content">
+        <hr />
+        <h6>{repo|escape}</h6>
+        <ul>
+            <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+            <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+            <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+            <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+            <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+        </ul>
+        <hr />
+        <h6>{symrev}</h6>
+        <ul>
+            <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+            <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+        </ul>
+        <hr />
+        <h6>{file|escape}</h6>
+        <ul>
+            <li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+            <li class="active">Comparison</li>
+            <li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+        </ul>
+        <ul>
+            <li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+            <li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+            <li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">log</a></li>
+            <li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+        </ul>
+        <hr />
+        <ul>
+            <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+        </ul>
+        </div>
+        {logo}
+    </div>
+
+<main>
+<hr />
+<h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+{searchform}
+
+<h2>Comparison</h2>
+<h4>{file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+{alltags}
+</h4>
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+<th>author</th>
+<td>{author|obfuscate}</td>
+</tr>
+<tr>
+<th>date</th>
+<td class="date age">{date|rfc822date}</td>
+</tr>
+{parent%filecomparisonparent}
+{child%filecomparisonchild}
+<!--
+<tr>
+<th>parents</th>
+<td>{parent%filerevparent}</td>
+</tr>
+<tr>
+<th>children</th>
+<td>{child%filerevchild}</td>
+</tr>
+-->
+</table>
+
+<div class="overflow">
+<div class="sourcefirst">   comparison</div>
+<div class="legend">
+<span class="legendinfo equal">equal</span>
+<span class="legendinfo delete">deleted</span>
+<span class="legendinfo insert">inserted</span>
+<span class="legendinfo replace">replaced</span>
+</div>
+
+<table>
+<thead class="header">
+<tr>
+<th>{leftrev}:{leftnode|short}</th>
+<th>{rightrev}:{rightnode|short}</th>
+</tr>
+</thead>
+{comparison}
+</table>
+
+</div>
+<p></p>
+<hr />
+</main>
+</div>
+{logo}
+{banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filediff.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,82 @@
+{header}
+<title>Diff {repo|escape}: {file|escape}</title>
+</head>
+<body>
+<div class="main">
+    <div class="dd-hover menu">
+    <div class="dd-content">
+        <hr />
+        <h6>{repo|escape}</h6>
+        <ul>
+            <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+            <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+            <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+            <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+            <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+        </ul>
+        <hr />
+        <h6>{symrev}</h6>
+        <ul>
+            <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+            <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+        </ul>
+        <hr />
+        <h6>{file|escape}</h6>
+        <ul>
+            <li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+            <li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+            <li class="active">Diff</li>
+        </ul>
+        <ul>
+            <li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+            <li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+            <li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">log</a></li>
+            <li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+        </ul>
+        <hr />
+        <ul>
+            <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+        </ul>
+        </div>
+        {logo}
+    </div>
+
+<main>
+<hr />
+<h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+{searchform}
+
+<h2>Diff</h2>
+<h4>{file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+    {alltags}
+</h4>
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th>author</th>
+ <td>{author|obfuscate}</td>
+</tr>
+<tr>
+ <th>date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+{parent%filediffparent}
+{child%filediffchild}
+</table>
+
+        <div class="overflow">
+            <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
+            <div class="sourcefirst"> line diff</div>
+            <div class="stripes2 diffblocks">
+                {diff}
+            </div>
+        </div>
+        <p></p>
+        <hr />
+    </main>
+</div>
+{logo}
+{banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filelog.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,98 @@
+{header}
+<title>File Log {repo|escape}: {file|escape}</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-log/tip/{file|urlescape}" title="Atom feed for {repo|escape}:{file}" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-log/tip/{file|urlescape}" title="RSS feed for {repo|escape}:{file}" />
+</head>
+<body>
+    <div class="main">
+        <div class="dd-hover menu">
+        <div class="dd-content">
+            <hr />
+            <h6>{repo|escape}</h6>
+            <ul>
+                <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+                <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+                <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+                <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+                <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+            </ul>
+            <hr />
+            <h6>{symrev}</h6>
+            <ul>
+                <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+                <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+            </ul>
+            <hr />
+            <h6>{file|escape}</h6>
+            <ul>
+                <li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+                <li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+                <li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+            </ul>
+            <ul>
+                <li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+                <li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+                <li class="active">Log</li>
+                <li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+            </ul>
+            <hr />
+            <ul>
+                <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+            </ul>
+            <div class="atom-logo">
+                <a href="{url|urlescape}rss-bookmarks" title="subscribe to RSS feed">
+                    RSS: <img class="rss-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="RSS feed" />
+                </a>
+                <a href="{url|urlescape}atom-log/tip/{file|urlescape}" title="subscribe to Atom feed">
+                    Atom: <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="Atom feed" />
+                </a>
+            </div>
+            </div>
+            {logo}
+        </div>
+        <main>
+            <hr />
+            <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+            {searchform}
+
+            <h2>Log</h2>
+            <h4>{file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+             {alltags} {if(linerange, ' ({linerange}{if(descend, ', descending')}) 
+            </h4>
+            <h4>
+            <a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">« all revisions for this file »</a>')}
+            </h4>
+            <div class="navigate">
+                <a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
+                <a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
+                | {nav%filenav}
+            </div>
+
+            <table>
+                <thead>
+                    <tr>
+                        <th class="description">description</th>
+                        <th class="author">author</th>
+                        <th class="age">age</th>
+                    </tr>
+                </thead>
+                <tbody class="stripes2">
+                    {entries%filelogentry}
+                </tbody>
+            </table>
+
+            <div class="navigate">
+                <a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
+                <a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
+                | {nav%filenav}
+            </div>
+            <p></p>
+            <hr />
+        </main>
+    </div>
+    {logo}
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filelogentry.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,9 @@
+ <tr>
+  <td class="description">
+   <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>
+   {alltags}{rename%filelogrename}
+  </td>
+  <td class="author">{author|person}</td>
+  <td class="age">{date|rfc822date}</td>
+ </tr>
+ {if(patch, '<tr><td colspan="3">{diff}</td></tr>')}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filerevision.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,94 @@
+{header}
+<title>File {repo|escape}: {node|short} {file|escape}</title>
+<!--
+<link rel="stylesheet" href="/hl/styles/ir-black.min.css">
+<script type="text/javascript" src="/hl/highlight.min.js"></script>
+-->
+</head>
+<body>
+
+<div class="main">
+    <div class="dd-hover menu">
+    <div class="dd-content">
+        <hr />
+        <h6>{repo|escape}</h6>
+        <ul>
+            <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+            <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+            <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+            <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+            <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+        </ul>
+        <hr />
+        <h6>{symrev}</h6>
+        <ul>
+            <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+            <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+        </ul>
+        <hr />
+        <h6>{file|escape}</h6>
+        <ul>
+            <li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+            <li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+            <li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+        </ul>
+        <ul>
+            <li class="active">File</li>
+            <li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+            <li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">log</a></li>
+            <li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+        </ul>
+        <hr />
+        <ul>
+            <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+        </ul>
+        </div>
+        {logo}
+    </div>
+
+<main>
+<hr />
+<h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+{searchform}
+
+<h2>File</h2>
+<h4>{file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h4>
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th class="author">author</th>
+ <td class="author">{author|obfuscate}</td>
+</tr>
+<tr>
+ <th class="date">date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+{parent%filerevparent}
+{child%filerevchild}
+</table>
+
+<div class="overflow">
+<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
+<div class="sourcefirst"> line source</div>
+<pre class="sourcelines stripes4 wrap bottomline"
+     data-logurl="{url|urlescape}log/{symrev}/{file|urlescape}"
+     data-selectabletag="SPAN"
+     data-ishead="{ishead}">
+{text%fileline}
+</pre>
+</div>
+
+<script type="text/javascript" src="{staticurl|urlescape}followlines.js"></script>
+<!--script>hljs.highlightAll();</script-->
+
+<p></p>
+<hr />
+</main>
+</div>
+{logo}
+{banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/footer.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,55 @@
+{motd}
+            <footer>
+                <div style="text-align: center">
+                    <div style="height: 2rem;"></div>
+                    <div>
+                    <a href="{logourl}" title="" target="_blank" rel="noopener">
+                    <img src="{staticurl|urlescape}{logoimg}" title="Mercurial" alt="Mercurial" />
+                    </a>
+                    </div>
+                    <h4><a href="#top" title="top">~*~</a></h4>
+                    → → <a href="https://soft.trung.fun/giay-phep.en.html" target="_blank" rel="noopener">license</a> ← ←
+                    <div style="text-align: center">-------------------------</div>
+                    <a href="https://wikipedia.com" target="_blank" rel="noopener">wikipedia</a> |
+                    <a href="https://debian.org" target="_blank" rel="noopener">debian</a> |
+                    <a href="https://suckless.org" target="_blank" rel="noopener">suckless</a>
+                    <div class="footer-seperator">----------------------------------</div>
+                    <div class="footer-ring" style="max-width: 24rem;"> 
+                        <p></p>
+                        ₿itcoin →<a href="https://blockstream.info/address/bc1qr4km72q5xqftkhzf2jsvp325cuslfkus2enp2c" target="_blank" rel="noopener">
+                            bc1qr4km72q5xqftkhzf2jsvp325cuslfkus2enp2c
+                        </a>← ₿itcoin 
+                        <p></p>
+                    </div>
+                    <div class="footer-seperator">------------------------------------------------</div>
+                    <div class="footer-seperator">--------------------------------------------------</div>
+                    <div class="footer-ring" style="max-width: 32rem;">
+                        <p></p>
+                        Monero » <a href="https://trung.fun/monero.en.html" target="_blank" rel="noopener">
+                            83BoKzUQ3yz41rdbuFQvUm7NyTVjp26dmMeRreTYp6Q4PhebZYY5d998Z9KFniqVaTQb5nBpQke2QW5snaaJr8acFZLK
+                        </a> « Monero 
+                        <p></p>
+                    </div>
+                    <div class="footer-seperator">--------------------------------------------------------</div>
+                    <div class="footer-ring" style="max-width: 48rem;">
+                        <h4>PGP: <a href="https://trung.fun/lien-lac/Tran-H-Trung.asc">
+                                272B C112 E0C1 CA52 2987  8E06 4C2E 262F 6514 7810
+                            </a> :PGP</h4>
+                    </div>
+                    <div class="footer-seperator">------------------------------------------------------------</div>
+                    <a href="https://trung.fun/gioi-thieu/trung.en.html">
+                        <h4> © Trần H. Trung </h4>
+                    </a>
+                    <form method="post" action="https://s.trung.fun/" id="search" >
+                        <!-- search      --> <input type="search" id="query" name="q" size="50" placeholder="SearXNG" results="5" />
+                        <!-- categories  <input type="hidden" name="categories" value="general,social media" />--> 
+                        <!-- language    --> <input type="hidden" name="lang" value="all" />
+                        <!-- locale      --> <input type="hidden" name="locale" value="vi" />
+                        <!-- date filter --> <input type="hidden" name="time_range" value="month" />
+                    </form>
+                    <div style="height: 2rem;"> </div>
+                </div>
+            </footer>
+        <a id="bottom"></a>
+    </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graph.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,100 @@
+{header}
+<title>Graph {repo|escape}: revision</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-log" title="Atom feed for {repo|escape}: log" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-log" title="RSS feed for {repo|escape}: log" />
+</head>
+<body>
+    <div class="main">
+        <div class="dd-hover menu">
+        <div class="dd-content">
+            <hr />
+            <h6>{repo|escape}</h6>
+            <ul>
+                <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+                <li class="active">Graph</li>
+                <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+                <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+                <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+            </ul>
+            <hr />
+            <h6>{symrev}</h6>
+            <ul>
+                <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+                <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+            </ul>
+            <ul>
+                {archives%archiveentry}
+            </ul>
+            <hr />
+            <ul>
+                 <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+            </ul>
+            <div class="atom-logo">
+                <a href="{url|urlescape}rss-bookmarks" title="subscribe to RSS feed">
+                    RSS: <img class="rss-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="RSS feed" />
+                </a>
+                <a href="{url|urlescape}atom-log" title="subscribe to Atom feed">
+                    Atom: <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="Atom feed" />
+                </a>
+            </div>
+        </div>
+            {logo}
+        </div>
+        <main>
+            <hr />
+            <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+            {searchform}
+
+            <h2>Graph</h3>
+            <div class="navigate">
+                <a href="{url|urlescape}graph/{symrev}{lessvars%urlparameter}">less</a>
+                <a href="{url|urlescape}graph/{symrev}{morevars%urlparameter}">more</a>
+                | rev {rev}: {changenav%navgraph}
+            </div>
+
+            <noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
+
+            <div id="wrapper">
+            <canvas id="graph"></canvas>
+            <ul id="graphnodes" class="stripes2">{nodes%graphentry}</ul>
+            </div>
+
+            <script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+            var data = {jsdata|json};
+            var graph = new Graph();
+            graph.scale({bg_height});
+            graph.render(data);
+            </script>
+
+            <div class="navigate">
+                <a href="{url|urlescape}graph/{symrev}{lessvars%urlparameter}">less</a>
+                <a href="{url|urlescape}graph/{symrev}{morevars%urlparameter}">more</a>
+                | rev {rev}: {changenav%navgraph}
+            </div>
+
+            <p>Scroll all the way down to load more.</p>
+
+            <script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+            ajaxScrollInit(
+                    '{url|urlescape}graph/%next%{graphvars%urlparameter}',
+                    '{nextentry%"{node}"}', <!-- NEXTHASH
+                    function (htmlText) \{
+                    var m = htmlText.match(/'(\w+)', <!-- NEXTHASH/);
+                    return m ? m[1] : null;
+                    },
+                    '#wrapper',
+                    '<div class="%class%" style="text-align: center;">%text%</div>',
+                    'graph'
+                    );
+            </script>
+
+        <p></p>
+        <hr />
+        </main>
+    </div>
+{logo}
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphentry.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,9 @@
+<li data-node="{node|short}">
+ <div class="fg">
+  <span class="desc">
+   <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>
+  </span>
+  {alltags}
+  <div class="info"><span class="age">{date|rfc822date}</span>, by {author|person}</div>
+ </div>
+</li>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/header.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,9 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+<head>
+<link rel="icon" href="{staticurl|urlescape}hgicon.png" type="image/png" />
+<meta name="robots" content="index, nofollow" />
+<link rel="stylesheet" href="/style-hg.css" type="text/css" />
+<link rel="stylesheet" href="/style.css" type="text/css" />
+<script type="text/javascript" {if(nonce, ' nonce="{nonce}"')} src="{staticurl|urlescape}mercurial.js"></script>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,38 @@
+{header}
+<title>Help {topic}</title>
+</head>
+<body>
+    <div class="main">
+        <div class="dd-hover menu">
+        <div class="dd-content">
+            <hr />
+            <ul>
+                <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+                <li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+                <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+                <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+                <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+            </ul>
+            <hr />
+            <ul>
+                <li class="active"><a href="{url|urlescape}help{sessionvars%urlparameter}">Help</a></li>
+            </ul>
+            </div>
+            {logo}
+        </div>
+        <main style="max-width: var(--width_max) !important;">
+            <hr />
+            <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+            {searchform}
+
+            <div id="doc">
+            {rstdoc(doc, "html")}
+            </div>
+        <p></p>
+        <hr />
+        </main>
+    </div>
+    {logo}
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/helptopics.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,52 @@
+{header}
+<title>Help: {title}</title>
+</head>
+<body>
+    <div class="main">
+        <div class="dd-hover menu">
+        <div class="dd-content">
+            <hr />
+            <ul>
+                <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+                <li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+                <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+                <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+                <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+            </ul>
+            <hr />
+            <ul>
+            {if(subindex,
+              '<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>',
+              '<li class="active">Help</li>'
+            )}
+            </ul>
+            </div>
+            {logo}
+        </div>
+        <main>
+            <hr />
+            <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+            {searchform}
+
+            <table>
+            <tr><td colspan="2"><h2><a name="topics" href="#topics">Topics</a></h2></td></tr>
+            {topics % helpentry}
+
+            {if(earlycommands, '
+            <tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
+            {earlycommands % helpentry}
+            ')}
+
+            {if(othercommands, '
+            <tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
+            {othercommands % helpentry}
+            ')}
+            </table>
+            <p></p>
+            <hr />
+        </main>
+    </div>
+    {logo}
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/index.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,40 @@
+{header}
+<title>Trung - Code</title>
+</head>
+<body>
+    <div class="main">
+        <div class="dd-hover menu">
+        <div class="dd-content">
+            <hr />
+            <h4> Welcome to my buggy world. </h4>
+            <hr />
+            </div>
+        {logo}
+        </div>
+        <main>
+        <hr />
+        <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+        <p></p>
+        <table>
+            <caption>click header to sort</caption>
+            <thead>
+                <tr>
+                    <th><a href="?sort={sort_name}">Name</a></th>
+                    <th><a href="?sort={sort_description}">Description</a></th>
+                    <th><a href="?sort={sort_contact}">Contact</a></th>
+                    <th><a href="?sort={sort_lastchange}">Last modified</a></th>
+                    <th>Archive</th>
+                    <th>RSS|Atom</th>
+                </tr>
+            </thead>
+            <tbody class="stripes2">
+                {entries%indexentry}
+            </tbody>
+        </table>
+        <p></p>
+        <hr />
+        </main>
+    </div>
+    {logo}
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/manifest.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,64 @@
+{header}
+<title>Browse {repo|escape}: {node|short} {path|escape}</title>
+</head>
+<body>
+<div class="main">
+<div class="dd-hover menu">
+<div class="dd-content">
+    <hr />
+    <h6>{repo|escape}</h6>
+    <ul>
+        <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+        <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+        <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+        <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+        <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+    </ul>
+    <hr />
+    <h6>{symrev}</h6>
+    <ul>
+        <li class="active">Browse</li>
+        <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+    </ul>
+    <ul>
+        {archives%archiveentry}
+    </ul>
+    <hr />
+    <ul>
+        <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+    </ul>
+    </div>
+    {logo}
+</div>
+
+<main>
+<hr />
+<h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+{searchform}
+
+<h2>Browse</h2>
+<h4>{repo|escape}{path|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h4>
+<table>
+<thead>
+<tr>
+  <th class="name">name</th>
+  <th class="size">size</th>
+  <th class="permissions">permissions</th>
+</tr>
+</thead>
+<tbody class="stripes2">
+{ifeq(path, up, '', updirentry)}
+{dentries%direntry}
+{fentries%fileentry}
+</tbody>
+</table>
+<p></p>
+<hr />
+</main>
+</div>
+{logo}
+{banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/map	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,325 @@
+default = 'graph'
+
+mimetype = 'text/html; charset={encoding}'
+header = header.tmpl
+footer = footer.tmpl
+search = search.tmpl
+
+changelog = shortlog.tmpl
+shortlog = shortlog.tmpl
+shortlogentry = shortlogentry.tmpl
+graph = graph.tmpl
+graphentry = graphentry.tmpl
+help = help.tmpl
+helptopics = helptopics.tmpl
+
+helpentry = '
+  <tr><td>
+    <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
+      {if(basename, '{basename|escape}', '{topic|escape}')}
+    </a>
+  </td><td>
+    {summary|escape}
+  </td></tr>'
+
+naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
+filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenodelink = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenolink = '{file|escape} '
+fileellipses = '...'
+diffstatlink = diffstat.tmpl
+diffstatnolink = diffstat.tmpl
+changelogentry = shortlogentry.tmpl
+changeset = changeset.tmpl
+manifest = manifest.tmpl
+
+nav = '{before%naventry} {after%naventry}'
+navshort = '{before%navshortentry}{after%navshortentry}'
+navgraph = '{before%navgraphentry}{after%navgraphentry}'
+filenav = '{before%filenaventry}{after%filenaventry}'
+
+updirentry = '
+  <tr class="fileline">
+    <td class="name">
+      <a href="{url|urlescape}file/{symrev}{up|urlescape}{sessionvars%urlparameter}">[up]</a>
+    </td>
+    <td class="size"></td>
+    <td class="permissions">drwxr-xr-x</td>
+  </tr>'
+
+direntry = '
+  <tr class="fileline">
+    <td class="name">
+      <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">
+        <img src="{staticurl|urlescape}coal-folder.png" alt="dir."/> {basename|escape}/
+      </a>
+      <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
+        {emptydirs|escape}
+      </a>
+    </td>
+    <td class="size"></td>
+    <td class="permissions">drwxr-xr-x</td>
+  </tr>'
+
+fileentry = '
+  <tr class="fileline">
+    <td class="filename">
+      <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">
+        <img src="{staticurl|urlescape}coal-file.png" alt="file"/> {basename|escape}
+      </a>
+    </td>
+    <td class="size">{size}</td>
+    <td class="permissions">{permissions|permissions}</td>
+  </tr>'
+
+filerevision = filerevision.tmpl
+fileannotate = fileannotate.tmpl
+filediff = filediff.tmpl
+filecomparison = filecomparison.tmpl
+filelog = filelog.tmpl
+fileline = '
+  <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+filelogentry = filelogentry.tmpl
+
+annotateline = '
+  <tr id="{lineid}"{ifeq(node, originalnode, ' class="thisrev"')}>
+    <td class="annotate parity{blockparity}">
+      {if(blockhead,
+          '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
+             {rev}
+           </a>')}
+      <div class="annotate-info">
+        <div>
+          <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
+            {node|short}</a>
+          {desc|escape|firstline}
+        </div>
+        <div><em>{author|obfuscate}</em></div>
+        <div>parents: {parents%annotateparent}</div>
+        <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
+        <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
+      </div>
+    </td>
+    <td class="source followlines-btn-parent"><a href="#{lineid}">{linenumber}</a> {line|escape}</td>
+  </tr>'
+annotateparent = '
+  <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
+diffblock = '<div class="bottomline inc-lineno"><pre class="sourcelines wrap">{lines}</pre></div>'
+difflineplus = '
+  <span id="{lineid}" class="plusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+difflineminus = '
+  <span id="{lineid}" class="minusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+difflineat = '
+  <span id="{lineid}" class="atline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+diffline = '
+  <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+
+comparisonblock ='
+  <tbody class="block">
+  {lines}
+  </tbody>'
+comparisonline = '
+  <tr id="{lineid}">
+    <td class="source {type}"><a href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
+    <td class="source {type}"><a href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
+  </tr>'
+
+changesetparent = ' {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
+
+changesetparentdiff = '
+  {changesetparent}
+  {ifeq(node, basenode, '(current diff)', '({difffrom})')}'
+
+difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
+
+filerename = '{file|escape}@'
+filelogrename = '
+  <span class="base">
+    base
+    <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+      {file|escape}@{node|short}
+    </a>
+  </span>'
+tags = tags.tmpl
+tagentry = '
+  <tr class="tagEntry">
+    <td>
+      <a href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}">
+        {tag|escape}
+      </a>
+    </td>
+    <td class="node">
+      <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
+        {node|short}
+      </a>
+    </td>
+  </tr>'
+bookmarks = bookmarks.tmpl
+bookmarkentry = '
+  <tr class="tagEntry">
+    <td>
+      <a href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}">
+        {bookmark|escape}
+      </a>
+    </td>
+    <td class="node">
+      <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
+        {node|short}
+      </a>
+    </td>
+  </tr>'
+branches = branches.tmpl
+branchentry = '
+  <tr class="tagEntry">
+    <td>
+      <a href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}" class="{status}">
+        {branch|escape}
+      </a>
+    </td>
+    <td class="node">
+      <a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
+        {node|short}
+      </a>
+    </td>
+  </tr>'
+phasetag = '{ifeq(phase, 'public', '', '<span class="phase">{phase|escape}</span> ')}'
+obsoletetag = '{if(obsolete, '<span class="obsolete">obsolete</span> ')}'
+instabilitytag = '<span class="instability">{instability|escape}</span> '
+changelogtag = '<span class="tag">{name|escape}</span> '
+changesettag = '<span class="tag">{tag|escape}</span> '
+changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
+changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
+changelogbranchname = '<span class="branchname">{name|escape}</span> '
+alltags = '{phasetag}{obsoletetag}{instabilities%instabilitytag}{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{bookmarks%changelogtag}'
+
+successorlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
+obsfatesuccessors = '{if(successors, ' as ')}{successors%successorlink}'
+obsfateverb = '{obsfateverb(successors, markers)}'
+obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
+obsfateusers = '{if(obsfateusers(markers), ' by {join(obsfateusers(markers)%'{user|obfuscate}', ', ')}')}'
+obsfatedate = '{if(obsfatedate(markers), ' {ifeq(min(obsfatedate(markers)), max(obsfatedate(markers)), '<span class="age">{min(obsfatedate(markers))|rfc822date}</span>', 'between <span class="age">{min(obsfatedate(markers))|rfc822date}</span> and <span class="age">{max(obsfatedate(markers))|rfc822date}</span>')}')}'
+obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}{obsfateusers}{obsfatedate}'
+instabilitychangesetlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
+divergentnode = '{instabilitychangesetlink} ({phase})'
+whyunstableentry = '{instability}: {if(divergentnodes, divergentnodes%divergentnode)} {reason} {instabilitychangesetlink}'
+
+changesetchild = ' {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
+
+filerevparent = '
+    <tr>
+        <th class="author">parent</th>
+        <td>{rev}:<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a>
+    </tr>'
+filerevchild = '
+    <tr>
+        <th class="author">child</th>
+        <td>{rev}:<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
+    </tr>'
+
+fileannotateparent = '
+  <tr>
+    <th class="author">parent</th>
+    <td>{rev}:<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a></td>
+  </tr>'
+fileannotatechild = '
+  <tr>
+    <th class="author">child</th>
+    <td>{rev}:<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+  </tr>'
+
+filecomparisonparent = '
+  <tr>
+    <th class="author">parent</th>
+    <td>{rev}:<a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a></td>
+  </tr>'
+filecomparisonchild = '
+  <tr>
+    <th class="author">child</th>
+    <td>{rev}:<a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
+  </td>
+  </tr>'
+
+filediffparent = '
+  <tr>
+    <th class="author">parent</th>
+    <td>{rev}:<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+  </tr>'
+filediffchild = '
+  <tr>
+    <th class="author">child</th>
+    <td>{rev}:<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
+  </td>
+  </tr>'
+
+indexentry = '
+  <tr>
+    <td><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
+    <td>{description}</td>
+    <td>{contact|obfuscate}</td>
+    <td class="age">{lastchange|rfc822date}</td>
+    <td class="indexlinks">
+        {archives%indexarchiveentry}
+    </td>
+    <td class="indexlinks">
+        {if(isdirectory, '',
+            '<a href="{url|urlescape}rss-log" title="subscribe to repository RSS feed">
+                &nbsp;<img class="rss-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="subscribe to repository RSS feed">
+            </a>
+            <a href="{url|urlescape}atom-log" title="subscribe to repository Atom feed">
+                &nbsp;<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="subscribe to repository Atom feed">
+            </a>'
+            )}
+    </td>
+  </tr>\n'
+indexarchiveentry = '<a href="{url|urlescape}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}&nbsp;</a>'
+index = index.tmpl
+archiveentry = '
+  <li>
+    <a href="{url|urlescape}archive/{symrev}{extension|urlescape}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a>
+  </li>'
+notfound = notfound.tmpl
+error = error.tmpl
+urlparameter = '{separator}{name}={value|urlescape}'
+hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
+breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
+
+searchform = '
+  <form class="search" action="{url|urlescape}log">
+    {sessionvars%hiddenformentry}
+    <p><input name="rev" id="search1" type="text" size="30" value="{query|escape}" /></p>
+    <div id="hint">{searchhint}</div>
+  </form>
+  <p></p>
+  <hr />'
+searchhint = 'Find changesets by keywords (author, files, the commit message), revision
+  number or hash, or <a href="{url|urlescape}help/revsets">revset expression</a>.'
+
+diffoptsform = '
+  <form id="diffopts-form"
+    data-ignorews="{if(get(diffopts, 'ignorews'), '1', '0')}"
+    data-ignorewsamount="{if(get(diffopts, 'ignorewsamount'), '1', '0')}"
+    data-ignorewseol="{if(get(diffopts, 'ignorewseol'), '1', '0')}"
+    data-ignoreblanklines="{if(get(diffopts, 'ignoreblanklines'), '1', '0')}">
+    <span>Ignore whitespace changes - </span>
+    <span>Everywhere:</span>
+    <input id="ignorews-checkbox" type="checkbox" />
+    <span>Within whitespace:</span>
+    <input id="ignorewsamount-checkbox" type="checkbox" />
+    <span>At end of lines:</span>
+    <input id="ignorewseol-checkbox" type="checkbox" />
+  </form>'
+
+logo = '
+    <div class="logo">
+        <a href="/" title="Trung - Software">
+            <img class="logo invert" src="/logo.png" style="width: 100%; max-width: 41em;" />
+        </a>
+    </div>'
+
+banner = '
+    <div class="banner mid invert">
+        <img src="https://trung.fun/banners/mid.svg" />
+    </div>'
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/notfound.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,20 @@
+{header}
+<title>Mercurial repository not found</title>
+</head>
+<body>
+    {logo}
+    <div class="main">
+        <main>
+            <hr />
+            <h1>Mercurial repository not found</h1>
+            <p>
+            The specified repository "{repo|escape}" is unknown, sorry.
+            </p>
+            <p>
+            Please go back to the <a href="{url|urlescape}">main repository list page</a>.
+            </p>
+            <hr />
+        </main>
+    </div>
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/search.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,63 @@
+{header}
+<title>Search {repo|escape}: {query|escape}</title>
+</head>
+<body>
+    <div class="main">
+        <div class="menu">
+            <hr />
+            <h6>{repo|escape}</h6>
+            <ul>
+                <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+                <li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+                <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+                <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+                <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+            </ul>
+            <hr />
+            <ul>
+                <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+            </ul>
+            {logo}
+        </div>
+        <main>
+            <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+            {searchform}
+
+            <h2>Results</h2>
+            <h3>'{query|escape}'</h3>
+
+            <p>
+            Assuming {modedesc}.
+            {if(showforcekw, '<a href="{url|urlescape}log?rev={query|urlescape}&forcekw=1">
+            Use {showforcekw}</a> instead.')}
+            {if(showunforcekw, '<a href="{url|urlescape}log?rev={query|urlescape}">
+            Use {showunforcekw}</a> instead.')}
+            </p>
+
+            <div class="navigate">
+                <a href="{url|urlescape}log{lessvars%urlparameter}">less</a>
+                <a href="{url|urlescape}log{morevars%urlparameter}">more</a>
+            </div>
+
+            <table>
+            <thead>
+             <tr>
+              <th class="description">description</th>
+              <th class="author">author</th>
+              <th class="age">age</th>
+             </tr>
+            </thead>
+            <tbody class="stripes2">
+            {entries%changelogentry}
+            </tbody>
+            </table>
+
+            <div class="navigate">
+            <a href="{url|urlescape}log{lessvars%urlparameter}">less</a>
+            <a href="{url|urlescape}log{morevars%urlparameter}">more</a>
+            </div>
+
+        </main>
+    </div>
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/shortlog.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,98 @@
+{header}
+<title>Log {repo|escape}</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-log" title="Atom feed for {repo|escape}" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-log" title="RSS feed for {repo|escape}" />
+</head>
+<body>
+<div class="main">
+    <div class="dd-hover menu">
+    <div class="dd-content">
+        <hr />
+        <h6>{repo|escape}</h6>
+        <ul>
+        <li class="active">Log</li>
+        <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+        <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+        <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+        <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+        </ul>
+        <hr />
+        <h6>{symrev}</h6>
+        <ul>
+            <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+            <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+        </ul>
+        <ul>
+        {archives%archiveentry}
+        </ul>
+        <hr />
+        <ul>
+            <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+        </ul>
+        <div class="atom-logo">
+                <a href="{url|urlescape}rss-bookmarks" title="subscribe to RSS feed">
+                    RSS: <img class="rss-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="RSS feed" />
+                </a>
+            <a href="{url|urlescape}atom-log" title="subscribe to Atom feed">
+                    Atom: <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="Atom feed" />
+            </a>
+        </div>
+    </div>
+        {logo}
+    </div>
+
+<main>
+<hr />
+<h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+{searchform}
+
+<h2>Log</h2>
+<div class="navigate">
+<a href="{url|urlescape}shortlog/{symrev}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}shortlog/{symrev}{morevars%urlparameter}">more</a>
+| rev {rev}: {changenav%navshort}
+</div>
+
+<table>
+<thead>
+ <tr>
+  <th class="description">description</th>
+  <th class="author">author</th>
+  <th class="age">age</th>
+ </tr>
+</thead>
+<tbody class="stripes2">
+{entries%shortlogentry}
+</tbody>
+</table>
+
+<div class="navigate">
+<a href="{url|urlescape}shortlog/{symrev}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}shortlog/{symrev}{morevars%urlparameter}">more</a>
+| rev {rev}: {changenav%navshort}
+</div>
+
+<script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+    ajaxScrollInit(
+            '{url|urlescape}shortlog/%next%{sessionvars%urlparameter}',
+            '{nextentry%"{node}"}', <!-- NEXTHASH
+            function (htmlText) \{
+                var m = htmlText.match(/'(\w+)', <!-- NEXTHASH/);
+                return m ? m[1] : null;
+            },
+            '.bigtable > tbody',
+            '<tr class="%class%">\\
+            <td colspan="3" style="text-align: center;">%text%</td>\\
+            </tr>'
+    );
+</script>
+<p></p>
+<hr />
+</main>
+</div>
+{logo}
+    {banner}
+{footer}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/shortlogentry.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,8 @@
+ <tr>
+  <td class="description">
+   <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>
+   {alltags}
+  </td>
+  <td class="author">{author|person}</td>
+  <td class="age">{date|rfc822date}</td>
+ </tr>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/style-hg.css	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,572 @@
+body {
+  margin: 0;
+  padding: 0;
+  background: var(--color_background);
+  color: var(--color_foreground);
+  font-family: sans-serif;
+}
+
+.container {
+  padding-left: 115px;
+}
+
+/*
+.main {
+    top: 20rem;
+}
+
+#.main {
+  width: 98%;
+}
+*/
+
+.overflow {
+  width: 100%;
+  overflow: auto;
+}
+
+/*.main>main { margin-left: 5rem !important; }*/
+
+.menu {
+  margin-left: auto;
+  /*margin-right: 5rem;*/
+  margin-bottom: auto;
+  text-align: right;
+  padding: 2rem;
+  background: transparent;
+  transition: background 0.5s ease-in-out;
+  position: sticky;
+  top: 17.4rem;
+  flex-shrink: 12;
+}
+.menu:hover { background: var(--color_background_main); }
+.dd-hover.menu { position: sticky; }
+
+@media (min-width: 960px) { body>.logo { display: none; } }
+@media not (min-width: 960px) {
+    .menu { padding: 0.5rem; }
+    .menu>.logo { display: none; }
+    .menu>.dd-content { display: block !important; width: 0.25rem; }
+    body>.logo { display: block; }
+    main { margin-left: 1rem !important; }
+}
+
+.menu ul {
+  list-style: none;
+  padding: 0;
+  margin: 10px 0 0 0;
+  border-right: 2px solid #999;
+}
+
+.menu li {
+  margin-bottom: 3px;
+  padding: 2px 4px;
+  background: var(--color_background);
+  color: var(--color_foreground);
+  font-weight: normal;
+}
+
+.menu li.active {
+  font-weight: bold;
+}
+
+.menu img {
+  border: 0;
+}
+
+div.atom-logo {
+  margin-top: 10px;
+}
+
+.atom-logo img, .rss-logo img {
+  width: 14px;
+  height: 14px;
+  border: 0;
+}
+img.atom-logo { filter: invert(100%); -webkit-filter: invert(100%); }
+
+.menu a { color: var(--color_foreground); display: block; }
+
+.search { text-align: center; }
+
+form.search div#hint {
+  display: block;
+  position: relative;
+  margin: auto;
+  width: 72%;
+  padding: 1.4rem;
+  background: var(--color_background_border);
+  text-align: center;
+  border: 1px solid var(--color_heading_main);
+  border-radius: 5px;
+  z-index: 15;
+}
+
+a { text-decoration:none; }
+.age { white-space:nowrap; }
+.date { white-space:nowrap; }
+.indexlinks { white-space:nowrap; }
+.parity0,
+.stripes4 > :nth-child(4n+1),
+.stripes2 > :nth-child(2n+1) { background-color: var(--color_odd); }
+.parity1,
+.stripes4 > :nth-child(4n+3),
+.stripes2 > :nth-child(2n+2) { background-color: var(--color_even); }
+.plusline { color: green; }
+.minusline { color: #dc143c; } /* crimson */
+.atline { color: var(--color_heading_sub); }
+
+.diffstat-table {
+  margin-top: 1em;
+}
+.diffstat-file {
+  white-space: nowrap;
+  font-size: 90%;
+}
+.diffstat-total {
+  white-space: nowrap;
+  font-size: 90%;
+}
+.diffstat-graph {
+  width: 100%;
+}
+.diffstat-add {
+  background-color: green;
+  float: left;
+}
+.diffstat-remove {
+  background-color: red;
+  float: left;
+}
+
+.navigate {
+  text-align: right;
+  margin: 1em 0;
+}
+
+.phase {
+  color: #999;
+  font-size: 70%;
+  border-bottom: 1px dotted #999;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+.obsolete {
+  color: #999;
+  font-size: 70%;
+  border-bottom: 1px dashed #999;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+.instability {
+  color: var(--color_foreground);
+  font-size: 70%;
+  border-bottom: 1px solid #000;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+.tag {
+  color: #999;
+  font-size: 70%;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+.branchhead {
+  color: var(--color_foreground);
+  font-size: 80%;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+ul#graphnodes .branchhead {
+  font-size: 75%;
+}
+
+.branchname {
+  color: var(--color_foreground);
+  font-size: 60%;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+/* Common */
+pre { font-family: 'FreeMono'; font-weight: bold; }
+/*
+pre { margin: 0; }
+
+h2 { font-size: 120%; border-bottom: 1px solid #999; }
+h2 a { color: var(--color_foreground); }
+h3 {
+  margin-top: +.7em;
+  font-size: 100%;
+}
+*/
+
+/* log and tags tables */
+.bigtable {
+  border-bottom: 1px solid #999;
+  border-collapse: collapse;
+  font-size: 90%;
+  width: 100%;
+  font-weight: normal;
+  text-align: left;
+}
+
+.bigtable td {
+  padding: 1px 4px;
+  vertical-align: top;
+}
+
+.bigtable th {
+  padding: 1px 4px;
+  border-bottom: 1px solid #999;
+}
+.bigtable tr { border: none; }
+tr { background-color: var(--color_background_border); }
+.bigtable .age { width: 7em; }
+.bigtable .author { width: 15em; }
+.bigtable .description { }
+.bigtable .description .base { font-size: 70%; float: right; line-height: 1.66; }
+.bigtable .node { width: 5em; font-family: monospace;}
+.bigtable .permissions { width: 8em; text-align: left;}
+.bigtable .size { width: 5em; text-align: right; }
+.bigtable .annotate { text-align: right; }
+.bigtable td.annotate { font-size: smaller; }
+.bigtable td.source { font-size: inherit; }
+tr.thisrev a { color:#999999; text-decoration: none; }
+tr.thisrev td.source { color:#009900; }
+td.annotate {
+  white-space: nowrap;
+}
+div.annotate-info {
+  z-index: 5;
+  display: none;
+  position: absolute;
+  background-color: var(--color_background);
+  border: 1px solid #999;
+  text-align: left;
+  color: var(--color_foreground);
+  padding: 5px;
+}
+div.annotate-info a { color: var(--color_heading_main); }
+td.annotate:hover div.annotate-info { display: inline; }
+
+#diffopts-form {
+  font-size: smaller;
+  color: var(--color_foreground);
+  padding-bottom: 10px;
+  display: none;
+}
+
+.source, .sourcefirst {
+  font-family: monospace;
+  white-space: pre;
+  padding: 1px 4px;
+  font-size: 90%;
+}
+.sourcefirst {
+    border-bottom: 1px solid #999;
+    font-weight: bold;
+ }
+.source a { color: #999; font-size: smaller; font-family: monospace;}
+
+.sourcelines {
+  position: relative;
+  counter-reset: lineno;
+}
+
+.wrap > span {
+    white-space: pre-wrap;
+}
+
+.linewraptoggle {
+    float: right;
+}
+
+.diffblocks { 
+    counter-reset: lineno;
+}
+.diffblocks > div {
+    font-family: 'FreeMono' !important;
+    counter-increment: lineno;
+    border: 1px solid #888;
+    border-radius: 0.3125rem;
+    margin-top: 0.5rem;
+}
+
+.sourcelines > span {
+  display: inline-block;
+  box-sizing: border-box;
+  width: 100%;
+  padding: 1px 0px 1px 5em;
+  counter-increment: lineno;
+}
+
+.sourcelines > span:before {
+  -moz-user-select: -moz-none;
+  -khtml-user-select: none;
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  display: inline-block;
+  margin-left: -6em;
+  width: 4em;
+  font-size: smaller;
+  /*color: #999;*/
+  text-align: right;
+  content: counters(lineno, ".");
+  float: left;
+}
+
+.sourcelines > span:after {
+  content: '';
+  display: inline-block;
+}
+
+.sourcelines > span:target, tr:target td {
+  background-color: #bfdfff;
+}
+
+/* Followlines */
+tbody.sourcelines > tr.followlines-selected,
+pre.sourcelines > span.followlines-selected {
+  background-color: #99C7E9;
+}
+
+div#followlines {
+  background-color: var(--color_background);
+  border: 1px solid #999;
+  padding: 5px;
+  position: fixed;
+}
+
+div.followlines-cancel {
+  text-align: right;
+}
+
+div.followlines-cancel > button {
+  line-height: 80%;
+  padding: 0;
+  border: 0;
+  border-radius: 2px;
+  background-color: inherit;
+  font-weight: bold;
+}
+
+div.followlines-cancel > button:hover {
+  color: var(--color_background);
+  background-color: #cc241d;
+}
+
+div.followlines-link {
+  margin: 2px;
+  margin-top: 4px;
+  font-family: sans-serif;
+}
+
+.btn-followlines {
+  position: absolute;
+  display: none;
+  cursor: pointer;
+  box-sizing: content-box;
+  font-size: 12px;
+  width: 13px;
+  height: 13px;
+  border-radius: 3px;
+  margin: 0px;
+  margin-top: -2px;
+  padding: 0px;
+  background-color: #E5FDE5;
+  border: 1px solid #9BC19B;
+  font-family: monospace;
+  text-align: center;
+  line-height: 5px;
+}
+
+span.followlines-select .btn-followlines {
+  margin-left: -1.5em;
+}
+
+.btn-followlines:hover {
+  transform: scale(1.2, 1.2);
+}
+
+.btn-followlines .followlines-plus {
+  color: #98971a;
+}
+
+.btn-followlines .followlines-minus {
+  color: #cc241d;
+}
+
+.btn-followlines-end {
+  background-color: #ffdcdc;
+}
+
+.sourcelines tr:hover .btn-followlines,
+.sourcelines span.followlines-select:hover > .btn-followlines {
+  display: inline;
+}
+
+.btn-followlines-hidden,
+.sourcelines tr:hover .btn-followlines-hidden {
+  display: none;
+}
+
+.sourcelines > a {
+    display: inline-block;
+    position: absolute;
+    left: 0px;
+    width: 4em;
+    height: 1em;
+}
+
+.fileline { font-family: monospace; }
+.fileline img { border: 0; }
+
+.tagEntry .closed { color: var(--color_heading_sub); }
+
+/* Changeset entry */
+#changesetEntry {
+  border-collapse: collapse;
+  width: 100%;
+  margin-bottom: 1em;
+}
+
+#changesetEntry th {
+  padding: 1px 4px;
+  width: 4em;
+  text-align: right;
+  font-weight: normal;
+  vertical-align: top;
+}
+
+div.description {
+  border-left: 2px solid #999;
+  margin: 1em 0 1em 0;
+  padding: .3em;
+  white-space: pre;
+  font-family: monospace;
+}
+
+/* Graph */
+div#wrapper {
+	position: relative;
+	border-top: 1px solid black;
+	border-bottom: 1px solid black;
+	margin: 0;
+	padding: 0;
+}
+
+canvas {
+	position: absolute;
+	z-index: 5;
+	top: -0.7em;
+	margin: 0;
+}
+
+ul#graphnodes {
+	list-style: none inside none;
+	padding: 0;
+	margin: 0;
+}
+
+ul#graphnodes li {
+	height: 39px;
+	overflow: visible;
+}
+
+ul#graphnodes li .fg {
+	position: absolute;
+	z-index: 10;
+}
+
+ul#graphnodes li .info {
+	font-size: 70%;
+}
+
+/* Comparison */
+.legend {
+    padding: 1.5% 0 1.5% 0;
+}
+
+.legendinfo {
+    border: 1px solid #999;
+    font-size: 80%;
+    text-align: center;
+    padding: 0.5%;
+}
+
+.equal { background-color: var(--color_background_main); }
+
+.delete {
+    background-color: var(--color_alert);
+    color: var(--color_background);
+    font-weight: bold;
+}
+
+.insert {
+    background-color: var(--color_links);
+    color: var(--color_background);
+    font-weight: bold;
+}
+
+.replace {
+    background-color: var(--color_heading_main);
+    color: var(--color_background);
+    font-weight: bold;
+}
+
+.header {
+    text-align: center;
+}
+
+.block {
+    border-top: 1px solid #999;
+}
+
+.breadcrumb { color: gray; }
+
+.scroll-loading {
+  -webkit-animation: change_color 1s linear 0s infinite alternate;
+  -moz-animation: change_color 1s linear 0s infinite alternate;
+  -o-animation: change_color 1s linear 0s infinite alternate;
+  animation: change_color 1s linear 0s infinite alternate;
+}
+
+@-webkit-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@-moz-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@-o-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+
+.scroll-loading-error {
+    background-color: #FFCCCC !important;
+}
+
+/* Fix main css */
+img { 
+    filter: none;
+}
+.main>main {
+    width: auto !important;
+    max-width: 100% !important;
+    margin-top: 2rem !important;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tags.tmpl	Mon Jul 10 23:41:04 2023 +0700
@@ -0,0 +1,60 @@
+{header}
+<title>Tags {repo|escape}</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-tags" title="Atom feed for {repo|escape}: tags" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-tags" title="RSS feed for {repo|escape}: tags" />
+</head>
+<body>
+    <div class="main">
+        <div class="dd-hover menu">
+        <div class="dd-content">
+            <hr />
+            <h6>{repo|escape}</h6>
+            <ul>
+                <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+                <li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+                <li class="active">Tags</li>
+                <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+                <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+            </ul>
+            <hr />
+            <ul>
+                <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+            </ul>
+            <div class="atom-logo">
+                <a href="{url|urlescape}rss-bookmarks" title="subscribe to RSS feed">
+                    RSS: <img class="rss-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="RSS feed" />
+                </a>
+                <a href="{url|urlescape}atom-tags" title="subscribe to Atom feed">
+                    Atom: <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="Atom feed" />
+                </a>
+            </div>
+            </div>
+            {logo}
+        </div>
+        <main>
+            <hr />
+            <h1 class="breadcrumb"><a href="/">Software</a> {pathdef%breadcrumb}</h1>
+
+            {searchform}
+
+            <h2>Tags</h2>
+            <table>
+            <thead>
+            <tr>
+             <th>tag</th>
+             <th>node</th>
+            </tr>
+            </thead>
+            <tbody class="stripes2">
+            {entries%tagentry}
+            </tbody>
+            </table>
+            <p></p>
+        <hr />
+        </main>
+    </div>
+    {logo}
+    {banner}
+{footer}