From a645ba09d693495c50ab0ee0d1fc2734407b73a4 Mon Sep 17 00:00:00 2001 From: James Moger Date: Thu, 21 Apr 2011 20:50:59 -0400 Subject: [PATCH] Added merge icon. Added commit legend with counts. Improved header. --- .../gitblit/utils/GitBlitDiffFormatter.java | 6 +- src/com/gitblit/utils/JGitUtils.java | 12 ++++ .../gitblit/wicket/GitBlitWebApp.properties | 8 ++- .../gitblit/wicket/pages/CommitDiffPage.html | 9 ++- .../gitblit/wicket/pages/CommitDiffPage.java | 2 + src/com/gitblit/wicket/pages/CommitPage.html | 12 +++- src/com/gitblit/wicket/pages/CommitPage.java | 8 ++- src/com/gitblit/wicket/pages/TicketPage.html | 2 +- src/com/gitblit/wicket/pages/TicketsPage.html | 2 +- .../gitblit/wicket/panels/BranchesPanel.html | 2 +- .../wicket/panels/CommitLegendPanel.html | 13 ++++ .../wicket/panels/CommitLegendPanel.java | 61 ++++++++++++++++++ .../gitblit/wicket/panels/HistoryPanel.html | 6 +- .../gitblit/wicket/panels/HistoryPanel.java | 8 +++ src/com/gitblit/wicket/panels/LogPanel.html | 6 +- src/com/gitblit/wicket/panels/LogPanel.java | 9 +++ .../gitblit/wicket/panels/SearchPanel.html | 6 +- .../gitblit/wicket/panels/SearchPanel.java | 8 +++ src/com/gitblit/wicket/panels/TagsPanel.html | 2 +- .../gitblit/wicket/resources/background.png | Bin 0 -> 561 bytes .../wicket/resources/commit_branch_16x16.png | Bin 0 -> 655 bytes .../wicket/resources/commit_divide_16x16.png | Bin 0 -> 651 bytes .../wicket/resources/commit_join_16x16.png | Bin 0 -> 556 bytes .../wicket/resources/commit_merge_16x16.png | Bin 0 -> 508 bytes .../wicket/resources/commit_up_16x16.png | Bin 0 -> 391 bytes src/com/gitblit/wicket/resources/gitblit.css | 39 ++++++++--- 26 files changed, 187 insertions(+), 34 deletions(-) create mode 100644 src/com/gitblit/wicket/panels/CommitLegendPanel.html create mode 100644 src/com/gitblit/wicket/panels/CommitLegendPanel.java create mode 100644 src/com/gitblit/wicket/resources/background.png create mode 100644 src/com/gitblit/wicket/resources/commit_branch_16x16.png create mode 100644 src/com/gitblit/wicket/resources/commit_divide_16x16.png create mode 100644 src/com/gitblit/wicket/resources/commit_join_16x16.png create mode 100644 src/com/gitblit/wicket/resources/commit_merge_16x16.png create mode 100644 src/com/gitblit/wicket/resources/commit_up_16x16.png diff --git a/src/com/gitblit/utils/GitBlitDiffFormatter.java b/src/com/gitblit/utils/GitBlitDiffFormatter.java index 54cb6c29..b8dceb47 100644 --- a/src/com/gitblit/utils/GitBlitDiffFormatter.java +++ b/src/com/gitblit/utils/GitBlitDiffFormatter.java @@ -97,6 +97,10 @@ public class GitBlitDiffFormatter extends GitWebDiffFormatter { // skip index lines } else if (line.startsWith("new file")) { // skip new file lines + } else if (line.startsWith("\\ No newline")) { + // skip no new line + } else if (line.startsWith("---") || line.startsWith("+++")) { + // skip --- +++ lines } else if (line.startsWith("diff")) { if (line.indexOf(oldnull) > -1) { // a is null, use b @@ -115,8 +119,6 @@ public class GitBlitDiffFormatter extends GitWebDiffFormatter { sb.append("
"); sb.append(""); inFile = true; - } else if (line.startsWith("---") || line.startsWith("+++")) { - // skip --- +++ lines } else { sb.append(line).append('\n'); } diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java index 5118425e..cd3e6efe 100644 --- a/src/com/gitblit/utils/JGitUtils.java +++ b/src/com/gitblit/utils/JGitUtils.java @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.diff.DiffFormatter; @@ -326,6 +327,17 @@ public class JGitUtils { return list; } + public static Map getChangedPathsStats(List paths) { + Map stats = new HashMap(); + for (PathChangeModel path : paths) { + if (!stats.containsKey(path.changeType)) { + stats.put(path.changeType, new AtomicInteger(0)); + } + stats.get(path.changeType).incrementAndGet(); + } + return stats; + } + public static enum DiffOutputType { PLAIN, GITWEB, GITBLIT; diff --git a/src/com/gitblit/wicket/GitBlitWebApp.properties b/src/com/gitblit/wicket/GitBlitWebApp.properties index a2e51d11..cb8953ae 100644 --- a/src/com/gitblit/wicket/GitBlitWebApp.properties +++ b/src/com/gitblit/wicket/GitBlitWebApp.properties @@ -56,4 +56,10 @@ gb.modification = modification gb.deletion = deletion gb.rename = rename gb.stats = stats -gb.markdown = markdown \ No newline at end of file +gb.markdown = markdown +gb.changedFiles = changed files +gb.filesAdded = {0} files added +gb.filesModified = {0} files modified +gb.filesDeleted = {0} files deleted +gb.filesCopied = {0} files copied +gb.filesRenamed = {0} files renamed \ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/CommitDiffPage.html b/src/com/gitblit/wicket/pages/CommitDiffPage.html index a3a480b5..cc7404ad 100644 --- a/src/com/gitblit/wicket/pages/CommitDiffPage.html +++ b/src/com/gitblit/wicket/pages/CommitDiffPage.html @@ -14,16 +14,19 @@ + + +
[shortlog header]
-
+
- + -
[change type][change type] [commit path] + | | | diff --git a/src/com/gitblit/wicket/pages/CommitDiffPage.java b/src/com/gitblit/wicket/pages/CommitDiffPage.java index c6f1f7d3..0d4867ab 100644 --- a/src/com/gitblit/wicket/pages/CommitDiffPage.java +++ b/src/com/gitblit/wicket/pages/CommitDiffPage.java @@ -20,6 +20,7 @@ import com.gitblit.wicket.LinkPanel; import com.gitblit.wicket.RepositoryPage; import com.gitblit.wicket.WicketUtils; import com.gitblit.wicket.models.PathModel.PathChangeModel; +import com.gitblit.wicket.panels.CommitLegendPanel; public class CommitDiffPage extends RepositoryPage { @@ -51,6 +52,7 @@ public class CommitDiffPage extends RepositoryPage { // changed paths list List paths = JGitUtils.getFilesInCommit(r, commit); + add(new CommitLegendPanel("commitLegend", paths)); ListDataProvider pathsDp = new ListDataProvider(paths); DataView pathsView = new DataView("changedPath", pathsDp) { private static final long serialVersionUID = 1L; diff --git a/src/com/gitblit/wicket/pages/CommitPage.html b/src/com/gitblit/wicket/pages/CommitPage.html index 87547fca..2e1f47c4 100644 --- a/src/com/gitblit/wicket/pages/CommitPage.html +++ b/src/com/gitblit/wicket/pages/CommitPage.html @@ -41,13 +41,19 @@
[commit message]
+ + +
+ + +
[changed files]
- +
- + -
[change type][change type] [commit path] + | | | diff --git a/src/com/gitblit/wicket/pages/CommitPage.java b/src/com/gitblit/wicket/pages/CommitPage.java index 04065233..cae500f6 100644 --- a/src/com/gitblit/wicket/pages/CommitPage.java +++ b/src/com/gitblit/wicket/pages/CommitPage.java @@ -19,6 +19,7 @@ import com.gitblit.wicket.LinkPanel; import com.gitblit.wicket.RepositoryPage; import com.gitblit.wicket.WicketUtils; import com.gitblit.wicket.models.PathModel.PathChangeModel; +import com.gitblit.wicket.panels.CommitLegendPanel; public class CommitPage extends RepositoryPage { @@ -54,7 +55,7 @@ public class CommitPage extends RepositoryPage { add(WicketUtils.createTimestampLabel("commitAuthorDate", c.getAuthorIdent().getWhen(), getTimeZone())); // committer - add(createPersonPanel("commitCommitter", c.getCommitterIdent(), SearchType.COMMITTER)); + add(createPersonPanel("commitCommitter", c.getCommitterIdent(), SearchType.COMMITTER)); add(WicketUtils.createTimestampLabel("commitCommitterDate", c.getCommitterIdent().getWhen(), getTimeZone())); add(new Label("commitId", c.getName())); @@ -78,7 +79,8 @@ public class CommitPage extends RepositoryPage { addFullText("fullMessage", c.getFullMessage(), true); // changed paths list - List paths = JGitUtils.getFilesInCommit(r, c); + List paths = JGitUtils.getFilesInCommit(r, c); + add(new CommitLegendPanel("commitLegend", paths)); ListDataProvider pathsDp = new ListDataProvider(paths); DataView pathsView = new DataView("changedPath", pathsDp) { private static final long serialVersionUID = 1L; @@ -107,7 +109,7 @@ public class CommitPage extends RepositoryPage { }; add(pathsView); } - + @Override protected String getPageName() { return getString("gb.commit"); diff --git a/src/com/gitblit/wicket/pages/TicketPage.html b/src/com/gitblit/wicket/pages/TicketPage.html index 56e29804..b61f7f95 100644 --- a/src/com/gitblit/wicket/pages/TicketPage.html +++ b/src/com/gitblit/wicket/pages/TicketPage.html @@ -26,7 +26,7 @@
comments
- +
[comment author]
diff --git a/src/com/gitblit/wicket/pages/TicketsPage.html b/src/com/gitblit/wicket/pages/TicketsPage.html index eb74b125..0c865f33 100644 --- a/src/com/gitblit/wicket/pages/TicketsPage.html +++ b/src/com/gitblit/wicket/pages/TicketsPage.html @@ -14,7 +14,7 @@
[header]
- +
diff --git a/src/com/gitblit/wicket/panels/BranchesPanel.html b/src/com/gitblit/wicket/panels/BranchesPanel.html index 76c3e09f..497003a5 100644 --- a/src/com/gitblit/wicket/panels/BranchesPanel.html +++ b/src/com/gitblit/wicket/panels/BranchesPanel.html @@ -10,7 +10,7 @@
[branches header]
-
[ticket state]
+
diff --git a/src/com/gitblit/wicket/panels/CommitLegendPanel.html b/src/com/gitblit/wicket/panels/CommitLegendPanel.html new file mode 100644 index 00000000..71063626 --- /dev/null +++ b/src/com/gitblit/wicket/panels/CommitLegendPanel.html @@ -0,0 +1,13 @@ + + + + +
+ [change type] + [description] +
+
+ \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/CommitLegendPanel.java b/src/com/gitblit/wicket/panels/CommitLegendPanel.java new file mode 100644 index 00000000..9833d643 --- /dev/null +++ b/src/com/gitblit/wicket/panels/CommitLegendPanel.java @@ -0,0 +1,61 @@ +package com.gitblit.wicket.panels; + +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.ListDataProvider; +import org.eclipse.jgit.diff.DiffEntry.ChangeType; + +import com.gitblit.utils.JGitUtils; +import com.gitblit.wicket.WicketUtils; +import com.gitblit.wicket.models.PathModel.PathChangeModel; + +public class CommitLegendPanel extends Panel { + + private static final long serialVersionUID = 1L; + + public CommitLegendPanel(String id, List paths) { + super(id); + final Map stats = JGitUtils.getChangedPathsStats(paths); + ListDataProvider legendDp = new ListDataProvider(new ArrayList(stats.keySet())); + DataView legendsView = new DataView("legend", legendDp) { + private static final long serialVersionUID = 1L; + + public void populateItem(final Item item) { + ChangeType entry = item.getModelObject(); + + Label changeType = new Label("changeType", ""); + WicketUtils.setChangeTypeCssClass(changeType, entry); + item.add(changeType); + int count = stats.get(entry).intValue(); + String description = ""; + switch(entry) { + case ADD: + description = MessageFormat.format(getString("gb.filesAdded"), count); + break; + case MODIFY: + description = MessageFormat.format(getString("gb.filesModified"), count); + break; + case DELETE: + description = MessageFormat.format(getString("gb.filesDeleted"), count); + break; + case COPY: + description = MessageFormat.format(getString("gb.filesCopied"), count); + break; + case RENAME: + description = MessageFormat.format(getString("gb.filesRenamed"), count); + break; + } + item.add(new Label("description", description)); + } + }; + add(legendsView); + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/HistoryPanel.html b/src/com/gitblit/wicket/panels/HistoryPanel.html index ad0ff2f8..1ed1b583 100644 --- a/src/com/gitblit/wicket/panels/HistoryPanel.html +++ b/src/com/gitblit/wicket/panels/HistoryPanel.html @@ -13,13 +13,13 @@
[breadcrumbs]
-
[branch date]
+
+ - - + diff --git a/src/com/gitblit/wicket/panels/HistoryPanel.java b/src/com/gitblit/wicket/panels/HistoryPanel.java index e68fc1ab..da269989 100644 --- a/src/com/gitblit/wicket/panels/HistoryPanel.java +++ b/src/com/gitblit/wicket/panels/HistoryPanel.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.image.ContextImage; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.markup.repeater.Item; @@ -104,6 +105,13 @@ public class HistoryPanel extends BasePanel { setPersonSearchTooltip(authorLink, author, SearchType.AUTHOR); item.add(authorLink); + // merge icon + if (entry.getParentCount() > 1) { + item.add(new ContextImage("commitIcon", "/com/gitblit/wicket/resources/commit_merge_16x16.png")); + } else { + item.add(new ContextImage("commitIcon", "/com/gitblit/wicket/resources/blank.png")); + } + String shortMessage = entry.getShortMessage(); String trimmedMessage = StringUtils.trimShortLog(shortMessage); LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject", trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())); diff --git a/src/com/gitblit/wicket/panels/LogPanel.html b/src/com/gitblit/wicket/panels/LogPanel.html index 838b28c4..1a6f6f43 100644 --- a/src/com/gitblit/wicket/panels/LogPanel.html +++ b/src/com/gitblit/wicket/panels/LogPanel.html @@ -10,13 +10,13 @@
[log header]
-
[commit date] [commit author][commit short message][commit refs]
[commit refs]
[commit short message]
[history links]
+
- - + +
[commit date] [commit author][commit short message][commit refs]
[commit refs]
[commit short message]
| | diff --git a/src/com/gitblit/wicket/panels/LogPanel.java b/src/com/gitblit/wicket/panels/LogPanel.java index 04575115..8895dbcb 100644 --- a/src/com/gitblit/wicket/panels/LogPanel.java +++ b/src/com/gitblit/wicket/panels/LogPanel.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.image.ContextImage; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; @@ -84,6 +85,14 @@ public class LogPanel extends BasePanel { setPersonSearchTooltip(authorLink, author, SearchType.AUTHOR); item.add(authorLink); + // merge icon + if (entry.getParentCount() > 1) { + item.add(new ContextImage("commitIcon", "/com/gitblit/wicket/resources/commit_merge_16x16.png")); + } else { + item.add(new ContextImage("commitIcon", "/com/gitblit/wicket/resources/blank.png")); + } + + // short message String shortMessage = entry.getShortMessage(); String trimmedMessage = StringUtils.trimShortLog(shortMessage); LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject", trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())); diff --git a/src/com/gitblit/wicket/panels/SearchPanel.html b/src/com/gitblit/wicket/panels/SearchPanel.html index a99fd7e4..f8994b9d 100644 --- a/src/com/gitblit/wicket/panels/SearchPanel.html +++ b/src/com/gitblit/wicket/panels/SearchPanel.html @@ -10,13 +10,13 @@
[search header]
- +
- - + +
[commit date] [commit author][commit short message][commit refs]
[commit refs]
[commit short message]
| | diff --git a/src/com/gitblit/wicket/panels/SearchPanel.java b/src/com/gitblit/wicket/panels/SearchPanel.java index 6f4858be..315d4760 100644 --- a/src/com/gitblit/wicket/panels/SearchPanel.java +++ b/src/com/gitblit/wicket/panels/SearchPanel.java @@ -4,6 +4,7 @@ import java.util.Date; import java.util.List; import java.util.Map; +import org.apache.wicket.markup.html.image.ContextImage; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; @@ -74,6 +75,13 @@ public class SearchPanel extends BasePanel { setPersonSearchTooltip(authorLink, author, SearchType.AUTHOR); item.add(authorLink); + // merge icon + if (entry.getParentCount() > 1) { + item.add(new ContextImage("commitIcon", "/com/gitblit/wicket/resources/commit_merge_16x16.png")); + } else { + item.add(new ContextImage("commitIcon", "/com/gitblit/wicket/resources/blank.png")); + } + String shortMessage = entry.getShortMessage(); String trimmedMessage = StringUtils.trimShortLog(shortMessage); // TODO highlight matches diff --git a/src/com/gitblit/wicket/panels/TagsPanel.html b/src/com/gitblit/wicket/panels/TagsPanel.html index 278b7e9b..09019cf8 100644 --- a/src/com/gitblit/wicket/panels/TagsPanel.html +++ b/src/com/gitblit/wicket/panels/TagsPanel.html @@ -9,7 +9,7 @@
[tags header]
- +
diff --git a/src/com/gitblit/wicket/resources/background.png b/src/com/gitblit/wicket/resources/background.png new file mode 100644 index 0000000000000000000000000000000000000000..6f75e43dfe83d5516b6137c086bb68f36e409459 GIT binary patch literal 561 zcmV-10?z%3P)t*v0005NNkl4~|Nqv$^W*PqtIo2Z%mt!v zza~I{pd=u9-}f_o<~|+#BsAAK(T9)F_FMMhRj2AvNrS5emRCWc0apcqwd;}-$P^40 zq>4ce#DfeTvRP?hxlSxSalz;*6Q1V5RI+9>P0)iji&b(?UBEMt?wWwqu{9*~!R{n@ z;FV-ptYwi9SyvkzDvN%EC8v`7pcbFHudoDsJNzKO8d@Q8ax5>vR;B}k)sG{z-2KOu zBTz>XDddo4RghCxlaJ_P=i3Q~bW1HIg)O3~Lh#u{o@#T5Tb0<6oVmuOk-JadBLJ}8 zjjVTGe3@`h2CWyHoxP@HbasuG&DI*OE(ic`WnX60g*|T+wWz}Ib!lK?bRF{yWeh<_NT45=bDimtDVtV zc)8qGhTZekzI1&gEc2`J|M&OLFJGeg^~)~bj8M<12Kn}(00000NkvXXu0mjf$YuXf literal 0 HcmV?d00001 diff --git a/src/com/gitblit/wicket/resources/commit_branch_16x16.png b/src/com/gitblit/wicket/resources/commit_branch_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..d1fe71753d9ee95a71fda3a22c80b2e689e54acc GIT binary patch literal 655 zcmV;A0&x9_P)b~3AjO`9_7DU?D54;WAF)Mi5e2~<6?$n8N>wb{L;V72sy!%F z1Gb7445)0d*VV7M*w;V`{3r|5pZ1fB5|krsF% zzK-c!7$`#DcSUF|c%7LgQ+Ov-DV9Y{^$SDPH|2;!V`L4ner>0=qD$YcqxVSN9Z;<` zk+| zfkZ6kH1fIpES}i;Z-ZPulIHy68D)hTlo1AEdv~szq=#J&8bWP?i(j-)xrAbnl_PEn0_XN93BbyxJ>DDy?|pgmw7PR zJ5vK2;TAMaqs2k40a1zmSmAaUtiLDcI3{L;#Ip_N`ZemW;$h49+G@q@>0vfYZmro{ p2;a(tZnNg=X)XT8Yv!*20|51~?XpgJ{&4^R002ovPDHLkV1nPpGCcqQ literal 0 HcmV?d00001 diff --git a/src/com/gitblit/wicket/resources/commit_divide_16x16.png b/src/com/gitblit/wicket/resources/commit_divide_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e611bd57455911959e21fc4c174b879d12a891fe GIT binary patch literal 651 zcmV;60(AX}P)Ap>Bp&!eO zgVbU_k?uhh_dj0i8s9K(=2v0jlgtO%LXIgwfzUU^^z-Pk&>GWSpt zF>}05XCbjX%z?&VT<*9O5|N~W@&k>(NiIj3%euK075!MJt2jEqdk%Blx0j|3Z<64? z7J~lPhPGhHe{g@n`0(vH3sM}5GxlbXD^mA;Q$U#tyt+wTR_2J5>QWT+S;I7DjkQ9G z`6VfS$5`wRS7mSM$_SeRWsx;UBtT1pk0ZW4GNUXqvk2qkjK+qz_II)KTeHnn!plCw zMm=-EW;Zr5C9e+=-dP2t$oJKICIFV z@0{_Jr*WO1FLV!b26d0q(2`SFCBSQS{lO*^N76rW!`=_H4%*_mBpP7NZ4`TCp zNQ})wf;s2R3{<0Y=>SAeMK=yES|KcuV9q(#jP(%)pRZWznCXP;4$z`>Fy|a=_;oL# zNF(IfY2V{(I_&xkast|qJ_{n_L@%I+_FXJr+a|SUK=9IIMHvgvq7u4J9lG1IlIDVYQ{R`e0%sEGzgK8$jdxA44c4Dfb zu*G3Ze8=w1FwU=N7^lgxat4|kLLEm|N+X&}+N!PEpq0{Vaf9&tQDM4;SN|onXlmX97CPVvOn!T@3+1bufLFPM@!Wz2 z8nJiHgXlQGsvqBeSlywO7X4xIAc{7nDkd`^gXjK{Z|9d}5FEOxFG0(2Z2W ue&_7a)q#(&WAMlz#0U5T^~nqOCBOg?%iH-hmFx2W0000KLvvT literal 0 HcmV?d00001 diff --git a/src/com/gitblit/wicket/resources/commit_merge_16x16.png b/src/com/gitblit/wicket/resources/commit_merge_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..5a066e591092018ae73e91f3b9fba5cb84fee5c6 GIT binary patch literal 508 zcmV$TNFAse0ew=gf_s(}X5JI3fX0{;+_(vFTYXv5^AkxqK28eeh;EO<9XLrP590rI} zu9E;GG8=^m2R3n^Uxlv00P%1jWYpS;D5NqMRSIPtcJDAS*k=}UZ@^_1&=`uRYv}D{ zVMM}1zHf3X;^+#(XU@Q5)mmCmEq+TMrT}H}4nfAu##5aJ$?E(_l=K2Bl1zCWSlk;B zT?tT>QH0I`XMYby-MpiS+RyJSi#70$>Txz5yWmHi|M+-$(sI&^9BJbDB2e^%cqRYSqRJWbTpaY2R8l)aJhA{ y80=MUrJpRcUS&n8Ix@D7Tf9^@RCwBA{Qv(y12SM_WQ4QbyBNTd zJIfg0g6QhO0>~H!oZ1=wUw$wPj6rOi>aiK%(!ucm^zFX?b9XX;F^CNk!)5>r0~+w^ zVffz=(8O@{X%WLeR*2ZuXGIKcAK zMkXMe2`qjVi&_RI1{?t7(Vzc6G5lvi^E9yrfWV*spBWgK8SnzUF8IapiGdMhz<+XF z0MzuG5$FOIid;Z}7eFTbV){hT1vsTa(a6a9gMk&wCfR_$-x>BUUd-SOW8-uvp6sjy l#DY-vdmz4tEjt4Q7yvrXvHb(I`EvjO002ovPDHLkV1jrmr
[tag date]