From ac6be61379b9ea2d833e686f123f0c62f96327e0 Mon Sep 17 00:00:00 2001 From: Bane Stojkovic Date: Sun, 9 Feb 2025 15:47:55 +0100 Subject: [PATCH] Feature/paralel serial (#871) * Parallel/serial * chore: fix parallel * chore: tree * graph improvements * fix html render * treble bleed detection --- .../src/org/diylc/netlist/Tree.java | 24 ++ .../src/org/diylc/netlist/TreeAsciiUtil.java | 209 ++++++++++++++++++ .../src/org/diylc/netlist/TreeLeaf.java | 2 +- .../src/org/diylc/presenter/update.xml | 20 ++ .../org/diylc/netlist/TreeAsciiUtilTest.java | 57 +++++ diylc/diylc-library/lib/diylc-core.jar | Bin 396308 -> 399624 bytes .../diylc/netlist/GuitarDiagramAnalyzer.java | 66 +++++- diylc/diylc-swing/lib/diylc-core.jar | Bin 396308 -> 399624 bytes diylc/diylc-swing/library/main.jar | Bin 943907 -> 944883 bytes 9 files changed, 366 insertions(+), 12 deletions(-) create mode 100644 diylc/diylc-core/src/org/diylc/netlist/TreeAsciiUtil.java create mode 100644 diylc/diylc-core/test/org/diylc/netlist/TreeAsciiUtilTest.java diff --git a/diylc/diylc-core/src/org/diylc/netlist/Tree.java b/diylc/diylc-core/src/org/diylc/netlist/Tree.java index 42520387..f9ee373a 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/Tree.java +++ b/diylc/diylc-core/src/org/diylc/netlist/Tree.java @@ -22,11 +22,14 @@ package org.diylc.netlist; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; + import org.diylc.core.IDIYComponent; public class Tree { @@ -157,6 +160,27 @@ public class Tree { return sb.toString(); } + public String toAsciiString() { + return String.join("
", toAscii()); + } + + private List toAscii() { + if (leaf != null) { + return Arrays.asList(TreeAsciiUtil.generateString(TreeAsciiUtil.BOXH, 1) + " " + leaf.toHTML() + " " + TreeAsciiUtil.generateString(TreeAsciiUtil.BOXH, 1)); + } + + List children = getOrderedChildren(); + + List> childrenAscii = + children.stream().map(c -> c.toAscii()).collect(Collectors.toList()); + + if (TreeConnectionType.Series.equals(connectionType)) { + return TreeAsciiUtil.concatenateMultiLineSerial(TreeAsciiUtil.generateString(TreeAsciiUtil.BOXH, 1), childrenAscii); + } else { + return TreeAsciiUtil.concatenateMultiLineParallel(childrenAscii); + } + } + @Override protected Object clone() throws CloneNotSupportedException { if (leaf != null) diff --git a/diylc/diylc-core/src/org/diylc/netlist/TreeAsciiUtil.java b/diylc/diylc-core/src/org/diylc/netlist/TreeAsciiUtil.java new file mode 100644 index 00000000..878a3b1a --- /dev/null +++ b/diylc/diylc-core/src/org/diylc/netlist/TreeAsciiUtil.java @@ -0,0 +1,209 @@ +package org.diylc.netlist; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class TreeAsciiUtil { + + public static final String BOXVR = "├"; + public static final String BOXUL = "┘"; + public static final String BOXDL = "┐"; + public static final String BOXH = "─"; + public static final String NBSP = " "; + public static final String BOXDR = "┌"; + public static final String BOXUR = "└"; + public static final String BOXVH = "┼"; + public static final String BOXVL = "┤"; + public static final String BOXV = "│"; + + public static List concatenateMultiLineParallel(List> elementLines) { + + List lineCounts = elementLines.stream() + .map(lines -> lines.size()) + .collect(Collectors.toList()); + List lineLengths = elementLines.stream() + .map(element -> element.stream() + .map(TreeAsciiUtil::htmlLength) + .max(Integer::compare) + .orElse(0)) + .collect(Collectors.toList()); + int maxLineLength = Collections.max(lineLengths); + int targetLineCount = lineCounts.stream() + .mapToInt(Integer::intValue) + .sum() + elementLines.size() - 1; + int centerLine = targetLineCount / 2; + + List results = new ArrayList(); + int overallLineCount = 0; + for (int i = 0; i < elementLines.size(); i++) { + List lines = elementLines.get(i); + + int lineLength = lineLengths.get(i); + + String leftBuffer = ""; + String rightBuffer = ""; + if (lineLength < maxLineLength) { + leftBuffer = generateString(" ", (maxLineLength - lineLength) / 2); + rightBuffer = generateString(" ", (maxLineLength - lineLength) - (maxLineLength - lineLength) / 2); + } + + String leftBufferCentral = ""; + String rightBufferCentral = ""; + if (lineLength < maxLineLength) { + leftBufferCentral = generateString(BOXH, (maxLineLength - lineLength) / 2); + rightBufferCentral = generateString(BOXH, (maxLineLength - lineLength) - (maxLineLength - lineLength) / 2); + } + + int elementCenterLine = lines.size() / 2; + + for (int j = 0; j < lines.size(); j++) { + String line = lines.get(j); + + StringBuilder sb = new StringBuilder(); + + if (overallLineCount == centerLine) { + sb.append(BOXH); + } else { + sb.append(NBSP); + } + + if ((j < elementCenterLine && i == 0) || (j > elementCenterLine && i == elementLines.size() - 1)) { + sb.append(NBSP); + } else if (j == elementCenterLine && i == 0) { + sb.append(BOXDR); + } else if (i == elementLines.size() - 1 && j == elementCenterLine) { + sb.append(BOXUR); + } else if (overallLineCount == centerLine) { + if (j == elementCenterLine && i > 0 && i < elementLines.size() - 1) { + sb.append(BOXVH); + } else { + sb.append(BOXVL); + } + } else { + if (j == elementCenterLine && i > 0 && i < elementLines.size() - 1) { + sb.append(BOXVR); + } else { + sb.append(BOXV); + } + } + + if (j == elementCenterLine) { + sb.append(leftBufferCentral); + } else { + sb.append(leftBuffer); + } + sb.append(line); + if (j == elementCenterLine) { + sb.append(rightBufferCentral); + } else { + sb.append(rightBuffer); + } + + if ((j < elementCenterLine && i == 0) || (j > elementCenterLine && i == elementLines.size() - 1)) { + sb.append(NBSP); + } else if (j == elementCenterLine && i == 0) { + sb.append(BOXDL); + } else if (i == elementLines.size() - 1 && j == elementCenterLine) { + sb.append(BOXUL); + } else if (overallLineCount == centerLine) { + if (j == elementCenterLine && i > 0 && i < elementLines.size() - 1) { + sb.append(BOXVH); + } else { + sb.append(BOXVR); + } + } else { + if (j == elementCenterLine && i > 0 && i < elementLines.size() - 1) { + sb.append(BOXVL); + } else { + sb.append(BOXV); + } + } + + if (overallLineCount == centerLine) { + sb.append(BOXH); + } else { + sb.append(NBSP); + } + + results.add(sb.toString()); + overallLineCount++; + } + + + if (i < elementLines.size() - 1) { + String leftEnding; + String rightEnding; + if (overallLineCount == centerLine) { + leftEnding = BOXH + BOXVL; + rightEnding = BOXVR + BOXH; + } else { + leftEnding = NBSP + BOXV; + rightEnding = BOXV + NBSP; + } + String emptyLine = leftEnding + generateString(NBSP, maxLineLength) + rightEnding; + results.add(emptyLine); + overallLineCount++; + } + } + + return results; + } + + public static List concatenateMultiLineSerial(String separator, List> elementLines) { + List lineCounts = elementLines.stream() + .map(lines -> lines.size()) + .collect(Collectors.toList()); + String blankSeparator = generateString(NBSP, htmlLength(separator)); + int maxLineCount = lineCounts.stream().mapToInt(Integer::intValue).max().orElse(0); + int centerLine = maxLineCount / 2; + List lineLengths = elementLines.stream() + .map(element -> element.stream() + .map(TreeAsciiUtil::htmlLength) + .max(Integer::compare) + .orElse(0)) + .collect(Collectors.toList()); + List results = new ArrayList<>(); + for (int line = 0; line < maxLineCount; line++) { + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < elementLines.size(); i++) { + int elementLineCount = lineCounts.get(i); + int elementCenterLine = elementLineCount / 2; + int elementLineLength = lineLengths.get(i); + if (line < centerLine - elementCenterLine + || line > centerLine - elementCenterLine + elementLineCount) { + sb.append(generateString(NBSP, elementLineLength)); + } else { + int lineIndex = line + elementCenterLine - centerLine; + List element = elementLines.get(i); + String elementLine; + if (lineIndex < element.size()) { + elementLine = element.get(lineIndex); + } else { + elementLine = generateString(NBSP, elementLineLength); + } + sb.append(elementLine); + } + if (i < elementLines.size() - 1) { + if (line == centerLine) { + sb.append(separator); + } else { + sb.append(blankSeparator); + } + } + } + results.add(sb.toString()); + } + return results; + } + + public static String generateString(String seed, int n) { + return String.join("", Collections.nCopies(n, seed)); + } + + public static int htmlLength(String s) { + return s.replaceAll("\\&.*?\\;", "x").length(); + } +} diff --git a/diylc/diylc-core/src/org/diylc/netlist/TreeLeaf.java b/diylc/diylc-core/src/org/diylc/netlist/TreeLeaf.java index 737fcff7..11cfcd37 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/TreeLeaf.java +++ b/diylc/diylc-core/src/org/diylc/netlist/TreeLeaf.java @@ -107,6 +107,6 @@ public class TreeLeaf implements ITree { } public String toHTML() { - return toString().replace("<", "<").replace(">", ">"); + return toString().replace("<", "<").replace(">", ">"); } } diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index d97f2743..0510c9d5 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -4425,5 +4425,25 @@ https://github.com/bancika/diy-layout-creator/releases + + + 4 + 40 + 0 + + 2025-01-25 00:00:00.000 CET + + + + NEW_FEATURE + Guitar wiring analyzer can now detect treble bleed circuit on volume controls + + + IMPROVEMENT + Better rendering of the effective circuit graph in the guitar wiring analyzer, showing series and parallel connections in a more intuitive way + + + https://github.com/bancika/diy-layout-creator/releases + diff --git a/diylc/diylc-core/test/org/diylc/netlist/TreeAsciiUtilTest.java b/diylc/diylc-core/test/org/diylc/netlist/TreeAsciiUtilTest.java new file mode 100644 index 00000000..ee1df9e1 --- /dev/null +++ b/diylc/diylc-core/test/org/diylc/netlist/TreeAsciiUtilTest.java @@ -0,0 +1,57 @@ +package org.diylc.netlist; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +public class TreeAsciiUtilTest { + + @Test + public void testConcatenateMultiLineSerial() { + List result = TreeAsciiUtil.concatenateMultiLineSerial("-", + Arrays.asList(Arrays.asList("xx", "yy"), Arrays.asList("xxx", "yyy", "aaa"))); + assertNotNull(result); + assertEquals(3, result.size()); + assertEquals("xx xxx", result.get(0)); + assertEquals("yy-yyy", result.get(1)); + assertEquals("   aaa", result.get(2)); + } + + @Test + public void testConcatenateMultiLineSerial_singleInput() { + List> elementList = Arrays.asList(Arrays.asList("xx", "yy")); + List result = TreeAsciiUtil.concatenateMultiLineSerial("-", elementList); + assertNotNull(result); + assertEquals(Arrays.asList("xx", "yy"), result); + } + + @Test + public void testConcatenateMultiLineParallel() { + List result = TreeAsciiUtil.concatenateMultiLineParallel( + Arrays.asList(Arrays.asList("xx", "yy"), Arrays.asList("xxx", "yyy", "aaa"))); + + System.out.println("" + String.join("
", result) +"
"); + assertNotNull(result); +// assertEquals(3, result.size()); +// assertEquals("xx xxx", result.get(0)); +// assertEquals("yy-yyy", result.get(1)); +// assertEquals("   aaa", result.get(2)); + } + + @Test + public void testConcatenateMultiLineParallel_4_lines() { + List result = TreeAsciiUtil.concatenateMultiLineParallel( + Arrays.asList(Arrays.asList("xx"), Arrays.asList("xx"), Arrays.asList("xx"), Arrays.asList("xx"))); + + System.out.println("" + String.join("
", result) +"
"); + assertNotNull(result); +// assertEquals(3, result.size()); +// assertEquals("xx xxx", result.get(0)); +// assertEquals("yy-yyy", result.get(1)); +// assertEquals("   aaa", result.get(2)); + } +} diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index e2d1f91c669b347d80e68d0e9e9cc7b469cfcd27..ed04129ecf4735eff95620f4af2178ccab59fce5 100644 GIT binary patch delta 15718 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 YV?#|wL1%<9!rXKtA@M1PCYj{_0mfxewg3PC delta 12500 zcmZX42{={X_x`=--g7BahRm6VOob*SAwx1Il2numsWj7os8oiGIT}zAQcA=vNdsj{ zg(hV#nutg$(SM)4w?1G0U(eHXUu(TJ)7rI9YJ@~1|n)Q#qdF@u8|Bs%;(t%nk@F%TBh%E_2G}(sm zb0d2J{LEq_MSw%unUF&K|2xP;K~fX4=960VXQ3Y%M?mn0$AtsIGC?CI1aU&{EC_l; z-jXy(tdSgnhAOFQL`jml%oGHkl>!O9nMc?RMn8XIzqaCgR9R6|)`j)0k}??39<$YL-^o3#uTR2oZk6ZDUrcoJO=;O6ZQ1P5_`-hQ|Y%z{zOf)R4Ap!ECB_1E|NlE zzlA&ksg_mC?bDI}}?xmBM0(7M!E6a$#Oa|j(;uIsvLa}8^NSdLm zI8w4`VVY|XP_Y_ttY{_F={uw_HSZ3ol6YzP4>;nQy9U%K@E>L;ezTIK&fFoz3*Wl& zpiEuvQ3&i@bqWC?&mz>3%5}X+CwKirWC`_6LL71bE(FH5NTOMl+NFRv#(~Lb%H}O! z(cnuk7?0?(5|rG1Qle0B?+yZvixTl08V0&|CiX9tEWEgXDynqnz+VLJhWtSV%EFX| zU`yV|@gvJ%!d6sieX_j>blu2lLs7}O>WFjiN;>M#yZDrpzd%GU$zUu@WF|@`9wa7H zHV;XK!h)-lP@b~ucpXX?$)Y@l#Zqk8y7ljh%hrO{aahz+8)7PT?GY(i7*pbpXd|~Z zQMu`5ShnW9$Q~hNCB>zIWq}y?^up2d%2hiHac3jpDl9<@)kQV8xV?eW?n;R!Ez8QNM|>gZdK+E zmZl3qopUB+so2*fFPF8F>4Va2S;e$q3DCp^%7g4XfOwN~vLU9?JYjB+C$kdqiq|nS z5n8>0>BNB&^8J}HsGMm4vlSu5olG!7TA=D4rXxaudzrUUjoByl_k9O7`Y7R4<}~iA zU?vZuY&^(3h|s4)%u`6Yjcl6PJJ6F>7S*vB%$qt-HlxZ-~(b5Wvyw7HyodWx&C7P0O5{xM>v3{K>_uNe;7o}Qx zoB0(X+p_Tm<9VNHj?`0W9+{Rvy(zWrAW$FN4rZmX0(1pIIgebFErYzU4 ziYbE@)uz`>>q)Tgm#%Fej)Dx~lxZx;u(g8}QH1!j+9HF;8ObL`f z_u=xd(jay!+;C*6Yn@=Sb^4hqi0CrNbVKOs4`vt&*`3ihpbSFfSk(0cV2^SV1^pg- zM{>BHznSw9J9QL1WWWI=xb0Z_6>K0M*>C_wJp>0nj&O&V#4JSCA_;zkjChGXs4Lo~ z>N;Yeh!7RF7p#vre1tm6SH`^&yB9dJNVpcbT0%r53ce{qyhg!QcJnW_fQfhw7cjR( zocKw=P6Z1+Q?>=cR@6NQ(5cpLax%ADif}~xe894^7 z9a6pt9EB9qk(kEKRUzt7?7r#5LWD}S2o*Hj?{tVlG}coy39v(gg;=al1R>h~IYb2$ ziZb47skjT|3_uIu>nE@Pw$CF%P(^{~Px^v@cPFe!8GR=CxGM93P`IuynGmNCZ++g7 z?ozrrF@$P8i7~j%av!fFS`hEbdLkd$Jbj1`WLxA%JVG}9&BOzEBjnZx z5WUEDe+LnacxJnZQH=HwC5Sh+m$-;{SqF$_J4U6lPN%Ui(S;Qse?aLwDkk_V&h(z9( z#l%5W!o8HRN9fXh;yv_IaplB&SS+xD7(~UkR1?<(piTZ2f$m}4n%Be}0zTM{dcPR# z69?O%0fV7N=?xL$RQfR3@n^jy{))q>IRiuhDxEz@>_tdbP#AgZ zZGsqhl_&<{WU1>4EGg>i2+0XO>9+TPn2%J5+Wh&2O?Cw~iwRq$Dbk8fEs~dxyjhjZ zN!qeg!E9aUQne;U?ah0*w`ESOyj&dg;_{H%o5;z>c|M!lHi+d75qU#7FZQ{3_!qT~ zd4`xCXbaf*bp5NU*aL&p`o5KZ818-NCcjtg-tM1V(FF!soh=SY?JG2DzRAgjw$_%9 z)bximmzVPd{X8cs-`P=a{JmXS^J`b{NYK%U9S3eC@tQmeH@Vs=>Tu# ztDRxLl=||{Lc9G73r(CNo_4T>(gWN14*al`b1>Q#dAIV^_R~IzjgO< zxm(ar&052{!fSd%uTp<<5;hndDl8oiRY*5+iP&OLS+3nzcPZ%g@j8P?F5x@Vd}4J+ z_O1y@JR0z=e|lkhSI67Z1JOQh9Zi9*2OJ*`t0w<mOAzEHrKQI+59-2AeDPneQ{+ zTA^z2=m*cDuoU5Br>6a;3p2U)YT@ULTfL0y70>U|HIRELny9xZT)ppR;XDzU06unX zXvCv853H0dJhoiP$v7ja^++jmqqcDL;XwHqk>Lp9`2xdT6&gqRgVPU35Z~|YTH>x!j6Yt<&-#Z(rb3${G8vee-37BGfN(JH&T>i5ie)UZ0* z)5K17=34Lby8>!H^C?y5Mk^mrF|i6uJC?A!gS|JXW!=47{!E1BT**jZmg?D^P zeRo^8yu;_Q)vR6@ z@FGS z8`0JwC2*H#H`^~YVqv?xTv~=}R0K=gscDK_jPBWv%L(!FtAJq@~H`4J2C+nM~E zg5*M-zlBFE^gdf-TE6}cUz zs5DPPb@qnL;cZ91#Hw)AGwK&>uVptZh}pNpK{d*uZrI;AXufN%bh_-Ei!Wx6jM_H4 z*w@~gqjF`&s=lPM1B&02LnC&~%I1l(-zs~^O1o;NY~Y@ULl)+W%Z`2wveZv^@TWSX z3RB<5maf@aCQ=}!cA=!dKqGhWcI)@S*1FT8O3seVpQ>DD{K={(`=xfX9d$-loX;}W zDrTFh`4{H`i7oDy_3_r}C9|WRz5UMctFPd@_xZ_znK#6G+bTZP@J;TT5nB7KJbv3Y zJE5U3qGz@5|NL>>w{!aHOGm@Moy*sn@>+WG)Je_9ZYD>zax5-XL?5qG46%yd8QHzM zJGsR-liDFPT9aQtli1`F*PiVg=+#W47)pJ$o0+c8Sv|~e7z-mLE*E~?}3pLt(8u#K5x$b`nZ#+bv#_nWUZa$q%5|O zlFwNl=zw&m;z?bYAJ>vghwhp>Wjs#weN8y>t%yWCyu z%M}|AElX10ne%lhtuk_LO~L7-OTXA>b-huzRiJ-thFk6X{hz8FJUhDhrq5ci%39w| z(CymkL$}?&Ds8{~Vd>2CcX!JPh@9{iwO^wacA$R7JiGHxJnn21_pi&z6CG6apkC=T zZt~sOF)1`)w{k$d=qn$E7iN1_TjoWMCPcPx2&#HdIay`z(m3-mvuOSGB{zh+&)rt5 zKK5I(Q}*=lFY=}_jw;s=h&*}u+4YKTtI`O&d(Z8+ThF(a&*Cd~)^a?5spxl?U$cy_ zTJoZyW!f7v^4CQ*e_sCC{@Z?=GR>z>O^+{}a`X|;8a&Aty2xWE|Fp33-DHfW`T8$Y z4eWP*+P$FU;L4ouCm+u;X|K>ef6L&ZbN1Xpmwl5i&Ur7lkGta2_LSxN!NVy}cBEPx zW*^Z%nwAW$yQ1+SymWT|Cgxr`jxc`f<6fpMGJ#tZjcmV0XLi#;%+#52w0J za=CANlOy~l>67k~(C?uZ1?_f?Y36OW?F?k@Z0uirbZ(T}S?`e*5A;eWtcCKlWUNp)|y?NWN)|G$EK^i%<|dg^EVdz_2^Jeoi}oo9K^mS73Ov> zf3wzY>zwOulY0hl7PDvhdi0b>Y?goW&Q;Y{_3*1YZR1e2yp@OYy7fbs9I2J|i%mP4 zoRRgh_Jq+cxii(jb%L{;pC$-i{^ovr@Mc@b0MKjAcTzj&oNg%nlAXVA(k@!^W z85s=&C%VpNSeW&>)fx(Kl8O$@K3*8Pury3SW zRHIkH>9BdXrEX45j8_}o`cS<)*TatjsW$JfZOrinW<`5g{g?dlrbpQmqCYSm?&$tY1AG``v8uLPsx&J-uIz7W*t(|FueWb| zYm6D%D7d6>_sWF$`;Rm}F@+j^=CaQ@;(L*B&V z1CoonPj0>S<%zk_;?A)775k*RtM*9ygo_=LR1-Jq4|eoD{@#6W$a>ADDHlzSDlIT~ zS@o8;t>?|fme4Z?cADJk`e115GxgFaJ zDe`iS*V#={FK6G4<1deB!XUee#&STEjS$%R6JpYjt{ z%S!I==`8RTN-vxgZPsdpe$HgE;K?s{Y!1sC+14AfOyD~Yb99qN7<_+H}N9+n^#!{YF8<94u~qNCt#k-CjFfR;6p#yz!*^%jW; z+`~erqgpT*6K7=KN##tD~(u20_4~JO7P}k=qmMwA`q_A>Px~@|!aLPcd zwmZvenheqOY*qu(KYE#!1COt{Ic2N{_@xOq_!DaxifH`8GL?W4;w*L_%EwExLs2gy zrP$W!9NoxlUQ;p{)M6@5ldZ~S$+EK%Id2+!7CL2hZQU1a0Zv~E*;KqHTZJp4z;;DN zHYu@>5|e{4jNd5CYv7>?WpnDqXaVEL`5sK zK`E&9_YC$`Plzs`V2h#I8P2{pJyj6AxhgOi)9Klfpq`yz3v!3z*m;8R(Bxt|JAg-s zKIvS?`)jM6H-k~N3Y=x7v!%Gk+3bdOq0Gw5j}`Bei)_Xc6V!qvoX?l-Jv!5HDY@Cb z>R0OXyazv2z29l2>|8Wf95wrsXQa!O0}JxAT;qC>MSEKRD`8Koo`z8o}M z;r^2oH}}Mg!{0f7cwA@J?3lCE@MWU;HH*JDl{>D<2Zpd5OIC{;HHDn~uw(6Cz0A99 zW+G>ar+@$ccTLa-m=b*C0Gc0uWl|QcS1k?l6Ka)&4*3~%gsn@8q6v}KBjwQf#QeFW z2jZPFBnuJG(U?TvVQ}?K$Q7cnhtW$(Ddf#rHXgxoBUMqp87szX$as)7$o6p+X~PS@ zC)mr75Uc}Jq{yM}`IF$VK$OGB_1-|fLJ1f6lDm zi+hqV4%)a_&%B%D7RbrIN%}w_e2ZKP!G>F;GXy2Ka2~M|Tzz8+=9H9Rj?is#8H&1% z^<2M=JH;#|ouJF56c@cxN?Jq9k5Y0w1e@;Q@OyV~36U~93a>JpC%+84h`ZS0d>30X z@8SV|yNiWc-opvc+{4wsj$175V+(bkgqs)j>ppI#`vW}E!UxzjwVd>Y3J;cJPJ21I z23pK2$aN58jRU@iTo-P>u{&q>TvH2pOC9y!jvbt*5EjBcuKlM zSME6AJj0fC&&c)ARsD?ghhSbk7$ChXMAd`YrNQfZAe9En4WtVM`^G_i0}w{LG#bI! zX%Nx~21tXdMzA7jAod*01r0Vn$9b-ggFnx437Z!fB)vIuzqNcVF$KEb>I?jI7V!ys@407UB|wH%rvLv zE545B_TfuBx({Eq-F=w6pdSp5CZ8AwZT&cW_BVX>M}NcNo!@Y{@c`bIq6a|x>G1Y( zi|!!Sb7&BkcryqlgyyJz$6(ucd=squjz=+l2;U8(hj8_dAxzf(flD0xfi1N^!0gcp zC5JJ2%P>}0K8$zi=|6GQfuGpb@Dtb4`Gxnwz+ZSbYW#&qs`VSp1)X{CZ(QQhZ`>b= z5ior@%43Y=hZ@$)tbNuCYPy3r zkGT^x%+LXJ6^iFC9)spzkRxCQH2VL=k3liC(R?N}J{f0zqm8Q;0i!xq<;aqx{s$3YH0Aa?m4KJZ(H@ zL)Ei6;?#&MOGw+vmPv@Q=%4Aq!;zI1UP9|E!3;eBKR45zkh|Owg~_dA$x?+odssZw5;oTD&IT^_7UW7}woUY}Qe?pT z)R~aGGJvL{=T{*T#QN``4eHdq8>9#v!V{g8-afD-tU%|~C&UKtrm51@l*25N$|N~x zecqw7To3%`5~ET}@e0%5{p2n`cu|+;Fc>NmQr$R4^Cc-e4sNF(2V^0lk<~MWB|_zM z@DT6Pu4^&K#ebT`NBtdl3Gx7!cpU8#r_6XbN^k^YfAozbfck1a219Q`*@4rDYM;%T zMjgA4Wp+DTpYjo5Fr2l(_r(+VmFfTZ{M3vqEDkl97ps!u1*LZsAb(vMON{awcLmTc z>lWm?z{`X{M@MhEy-dSWwD+Yt5V7uFQY?;%#zlgnF~3FhGtn8%4Lxcvv> z>yT_Q%8|w9h07Qg>5A%-oh!y*?9yg1W=t4L!_R*~($u|4coa`30jVwmR0khe+xb## zQR*`I{Uc2E?@$6vpz4HFX+kt#;lEYy`FqpuK_K<~|Dgs7BWlrPyp(GvgMxXY$jZxy zt#W+8I$IoBJ;truX=|AzvVs#0QF(grwbK^ye*}6m7p(1xx~wU)$s9$B$&assXJ3XR z9s^n7|3{XS97^f}sPGEg#1Be&Dj;k2xb+Tgtx%$^^3*SWydMY(0PF5>+A2<;f{6du z{t3q<6M7bX_#a;oZ7uX8R4JV*AQ8Fx1UTXf!1})jC=9s?SvpQ5DmYP@JYmbD!i$& zey)G$@fYCorGIoiaSd-)LHvbN@RhE1I{pLwgQjU_JNu{xyVt zvWWE{DSKa15iVEA{rhVq?J$_I`C#fNE;Jrb$d#g6{Yeg$JA#$UWwh_j0xDI(^vF+0 zUb&vSD~2`oi2+TyJ{12{&TP1q7^YO569OTAJm4po6T*}>Q(jX!dXRNiY2R-RklYY3 zr6;gAwLr8&DM{P~&&gRPb{>aSpl_b{6b>UIr-gfIjh7SRF`H(J7Xc1W@!i2$gY=;K;&> z*+N^t?4zv`)ZL??i~sI7F1LEF<%5*;@BJpG4Tz=rqSV5(;FRHy1YT}@k|5Rk_ POT_TYPES = new HashSet(); private static Set PICKUP_TYPES = new HashSet(); private static Set CAP_TYPES = new HashSet(); + private static Set RESISTOR_TYPES = new HashSet(); + private static Set RC_TYPES = new HashSet(); + static { JACK_TYPES.add(OpenJack1_4.class.getCanonicalName()); JACK_TYPES.add(ClosedJack1_4.class.getCanonicalName()); @@ -68,6 +73,11 @@ public class GuitarDiagramAnalyzer extends NetlistAnalyzer implements INetlistAn CAP_TYPES.add(RadialMicaCapacitor.class.getCanonicalName()); CAP_TYPES.add(RadialFilmCapacitor.class.getCanonicalName()); CAP_TYPES.add(AxialFilmCapacitor.class.getCanonicalName()); + + RESISTOR_TYPES.add(Resistor.class.getCanonicalName()); + + RC_TYPES.addAll(CAP_TYPES); + RC_TYPES.addAll(RESISTOR_TYPES); } @Override @@ -203,6 +213,8 @@ public class GuitarDiagramAnalyzer extends NetlistAnalyzer implements INetlistAn // locate volume and tone pots Map, List>> volPotPickupMap = new HashMap, List>>(); + Map, Set>> volPotTrebleBleedMap = + new HashMap, Set>>(); Map, List>> tonePotPickupMap = new HashMap, List>>(); Map, List>> tonePotPickupReverseMap = @@ -253,20 +265,22 @@ public class GuitarDiagramAnalyzer extends NetlistAnalyzer implements INetlistAn if (tree1 == null || tree2 == null) continue; for (Map.Entry, Tree> r : pickupRoots.entrySet()) { - Tree parent1 = tree.findCommonParent(tree1, r.getValue()); - Tree parent2 = tree.findCommonParent(tree2, r.getValue()); - if (parent1 != null && parent2 != null - && parent1.getConnectionType() == TreeConnectionType.Series - && parent2.getConnectionType() == TreeConnectionType.Parallel) { + Tree commonParent1 = tree.findCommonParent(tree1, r.getValue()); + Tree commonParent2 = tree.findCommonParent(tree2, r.getValue()); + locateTrebleBleed(tree, volPotTrebleBleedMap, pot, tree1); + + if (commonParent1 != null && commonParent2 != null + && commonParent1.getConnectionType() == TreeConnectionType.Series + && commonParent2.getConnectionType() == TreeConnectionType.Parallel) { List> pickupList = volPotPickupMap.get(pot); if (pickupList == null) { pickupList = new ArrayList>(); volPotPickupMap.put(pot, pickupList); } pickupList.add(r.getKey()); - } else if (parent1 != null && parent2 != null - && parent1.getConnectionType() == TreeConnectionType.Parallel - && parent2.getConnectionType() == TreeConnectionType.Series) { + } else if (commonParent1 != null && commonParent2 != null + && commonParent1.getConnectionType() == TreeConnectionType.Parallel + && commonParent2.getConnectionType() == TreeConnectionType.Series) { List> pickupList = volPotPickupReverseMap.get(pot); if (pickupList == null) { pickupList = new ArrayList>(); @@ -290,6 +304,16 @@ public class GuitarDiagramAnalyzer extends NetlistAnalyzer implements INetlistAn sb.append("'").append(pickupName).append("'"); } notes.add(sb.toString()); + + Set> trebleBleedComponents = volPotTrebleBleedMap.get(e.getKey()); + if (trebleBleedComponents != null && trebleBleedComponents.size() > 0) { + + String trebleBleadNote = trebleBleedComponents.stream() + .sorted(Comparator.comparing(c -> c.getName())) + .map(c -> "'" + c.getName() + "'") + .collect(Collectors.joining(", ")) + " form a treble bleed network on the '" + e.getKey().getName() + "' volume control"; + notes.add(trebleBleadNote); + } } for (Map.Entry, List>> e : volPotPickupReverseMap @@ -343,19 +367,39 @@ public class GuitarDiagramAnalyzer extends NetlistAnalyzer implements INetlistAn } StringBuilder sb = new StringBuilder(); + + String asciiTree = tree.toAsciiString(); - sb.append("Parallel/Series connectivity tree:

").append(tree.toHTML(0)); + sb.append("

") + .append("") + .append(asciiTree) + .append(""); if (!notes.isEmpty()) { Collections.sort(notes); - sb.append("

Notes:
"); + sb.append("

"); for (String v : notes) { - sb.append("  ").append(v).append("
"); + sb.append(v).append("
"); } } return new Summary(netlist, sb.toString()); } + private void locateTrebleBleed(Tree tree, + Map, Set>> volPotTrebleBleedMap, IDIYComponent pot, + Tree tree1) { + Tree parent1 = tree1; + do { + parent1 = tree.findParent(parent1); + } while (parent1 != null && parent1.getChildren().size() <= 1); + if (parent1 != null) { + Set> trebleBleedComponents = parent1.extractComponents(RC_TYPES); + if (trebleBleedComponents.stream().anyMatch(c -> CAP_TYPES.contains(c.getClass().getCanonicalName()))) { + volPotTrebleBleedMap.computeIfAbsent(pot, k -> new HashSet>()).addAll(trebleBleedComponents); + } + } + } + public Tree constructTree(Netlist netlist) throws TreeException { List jackTipNodes = find(JACK_TYPES, "Tip", netlist); List jackSleeveNodes = find(JACK_TYPES, "Sleeve", netlist); diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index e2d1f91c669b347d80e68d0e9e9cc7b469cfcd27..ed04129ecf4735eff95620f4af2178ccab59fce5 100644 GIT binary patch delta 15718 zcmZX52Rv2b|G#^$V{h4eW=jd#WhYq`DKnC+WQ#76BxUBVNJz$M^g5{d>Lc>%M(H@6UKX&*wbnx%WIbDTO`iDLbu+A&!)agoJ{GMEJRWJgpc` z=(+wAC29=uJy93K2ftszh~OY~q8yGZ(Swd|zfocbMi$m?Vx-{rgV;mxyA@U$ey0Pt zm@aueyLUBnd5z ztg{PH0@e^mmzV^&RRu7D$yI=GV#&E*@L;=MD1p0>K7urHRhJ#yt^!!AM=i(^Pt)h` zA;9}$Dgx+jpCQF~?XZaCNpO6HNbpyZ5Du&BGy?v*vm+DA;lqz`RQ;2Y*-|`bId}z2 zLefDD%Lazj0BqHCf!DF{xIiYCpTD8Jy%SeV*{cg~upp6|g8w1l#mzrRfaWkEdblLt z;%E@bdV&WM$uZf830Bn zV$EpU5-+J>NupwFDLl@TB%h-^;Bg*r!qQKlwxIa1zjV9mA4{ zeVqamGG9}|Ared8BoGCO>YeXkgZU#}*?Evb8%bh+A4{TqR|Cvn?YfF&V$O^7aQUv>9+#nq-V69>)>cDDlz z)#v}bry(vu1UX7fDGo*xG#FL{{ieq#Am|V?MjSyGSuwN-a^t`-A}Ev_!$S(&KH|q% zU}3Z^h-qYiQT-822Ewyc#KaGG=0U2p2;z z4aAKhL0HBZ(wqcs)-gPwbu5M) zZ0-Xn2_yF~(Dg-(t`NId6zW7w1tM!q#%v*Ds7uA1LS*Ebm~)8CE*m3_OlDjjMt~G9 zo}Fq8a{>bi$$bV;GX!d#l>vYh)Eoo=!nYz!1_N9-N#>M0vQ6Bbs=8|8iFQxEfgBU*gI%e-nBy&gX4A`rkcS)asSeT$77+P zpL&DgLYnI8M~ogN9Cv>D+V?wmIYpGxIwyMXtJeOFv1A&%sR#bK^4C+VTg%u-tw9dWWtLBp9Dk8Q`In( zvDG$46Cq~qLfZ;B_XLaUrc2PW@q-l3{n-MR4Bmhceqyjk5V9nIr9qG~1=bHKh*aZ2 z=>w2|dN3>yYK;+U>_Nm|GodCn5K;2D#8p0_AKH+od+9^I4HB8x*P%V@bGjH=J>J6h+?hs zmQWp}s0J~{SRO*DFt!J=4HCm@AgECiD~wF^S7~fDGS*aCtRpO|J&X-NXg7{x+c9ub zs)0HJK9EmOWbTc|p-OrwVs9c5X@`2310bz85|Kj%i(X_U>ey6-;`sRIAybHQ3dz>( z1ojf5cqYVPa1>G;LTtBmu;?10Yk=lMcx;H(LlXLZ8k>%whh|u`ZN$%ERp51$;B0|C z2`}b^nhV$i2HryNe<}Yy-mk8;C7Hc!j~(F+_X&CRPyMa1lyxW0B1g!72(%4{zcKZuha< zum$K6hs`724G8q{SXv}yzK7Tf#9cp#4S{b{1e1L13Yuskwgk~G7h^3Dt-&*FG@>1@ z#fBmw&NpI>5LD8F{RV5nxHjxJIGBGsb{z@k-ifWGg=Ksnu*jW@(De~}6boblyjQC>OdWf0KZkYgl&Bi4xZe=k%%2 z;b19rZ?xedA>js13!w|!hzduA&$OTnHvh@I#sMx z>f*#|KdBI4WHYLn)-F7K&13!JES)cJwVQG+<#^bICM&9U_0)>r>BeX1ihApJuKgCk zHGE!f0`uyJA7{_t|1Qn{yJ4KAvdSLH;_#SSjs4uUHvm_pp-CkD`U)fO5?=h($+7M> zy+Eaf*4F`>O7v=*5#c+Vn-tmoCXsm}q=#A~)JrDKW!}ClvfiY5Aop^YN`1cl`^A*o zrja3`rhHPbv;tD@=w+~feeT8kKt--)eK#f`+@kGthU3z~j7`-`8eMIdWCB(IAXaiS zm)Z7u%RSlWD=fhe4YEr`e`ZPGUn#Civo+seUYT)@qpNJ>^Ra<4? zCT*TZUz=y(j*880mIdBqB|2P#D#_2|{_M7&bd5zUWpU=0D&Bbtm(@C6HvF}1^6(tZ zQ}onlwtrpOsj1D;J~T8#-NC$w6;W&XTb0ZnJ&Ro`pMTb@U;aXxL6v=taQmlr)Ps=} z)19CbQor@0?rSi{L=bpmn0`%R`+3YKDa@&6t+F+>FadnyOi7Ij>~x~T)HU+PvDdm4 z1jiXE zg9P;^+2g-lmK<%)rYc&H?U4T{joxyuuSsP;{jP*6XNTrRuXL1S;PA0WugFj7eM-Ne z40HuCrQtn6*74GxkvaXFSW3P~LYq zm$GBb@w{fzW3ncRH4nqCWYwCpn64bm&5ClH7@58_ml@cSC6L1uPwRz0lp3ancp|0;RFL<4}I#~Xs=Fd?_GG)A!PQ?u8CAQukld6)TR;U!y zSt-~(bCfjsKvzm(%%DTN%fp*^e#Uoy4oKcI9hAx7KiJd95-?}eVoO?UY&;~DQe*j7 z|CHx^W4^au^iQkbL2dol#il+mInGkw6aCvO=vTZz9f{KpIK(uOYkJ63_u{!I%baqV z%g+9%Tg0)!o&QYiqvO1uoHlSzW*aJ`01mQjMX=H&#?DiJHCH|tS<^BRI*fM|F?eUD z^);NP`c#es+h2)8LLrR;tncX7GNTs*nxe~A$yhww)6e{&HD$rS);OchaCXHQ_-D2% zahm$=+rHB}+}f9APe}ajarFBV^Kt?Er8#D~PeQ54AtB3bq3vea`A=aDUQs9Mib}7D z1_+#?$uVY8urJ!qr7}=DBk+~10iRt-rK1!mmScS{+BNl2qtX~x?Dg%(i}xRYZ&NG_ zkW9RG*X-$K1&yG=wQg6-9f_yxTUS?GaorX&)*}^EXOqNpFS4-Ynz5YCO%wBo(Pr{G zId%oiVvi!7VtJZkDt`4!>ErhC(iHK_;tsVEbM4$ZLuI+gGm4_?9eC9?%rgt{(ObEu zEY$5MYR^%}9 z{HOu*=Tntfr^e{tlb6p1M1b4}t95D6rZsRyIJqBJ5^c2HmZa>Y>NFPGe(Qr7 zkJ*$~lbck`4LY8lp>%Hqg%r57K^rcGx~1=`1G$=p*5l6oU;XMI_1HY(zT zD1BZQTc>No*RE^hNKs?C0eHI z;5?C5^ftQC5403b_RcmR(;sFGxr>jYF8(B78$ow{In$udQ_L;m)M&wQuG)Dc@2v!H z@@K^_=Vo$Ask)7^F5Yr)8bijpgXHUZa{45i zT*Z2 z|45 z&jC)gGgh7Q-`aHE4c^wkhA6jvUdU*3JVRa#yYC1v9=|owhM=bG80_X?8;TaaqQPLod0r zLml|St{yJ3@%CTqu%D<4I7VhMcky&~H~x~?cvHofl$L2u&JV}4ggJ`S??2&pVCwzW zA==J5(yjAL-mKgGZcw_&)uF{>RCj#du9I^Ay0j!$%)8C=<^FfCB;Qo!Vw<$n_N>SI zTV2J>J=z3tcMd#ae$D7Als>s8K9qK&GRNRHMylXpNvOG3v9pO5_FM@Ii*Ub*gxK%} z{Dg)7pyXWHMM)<(zaM+MW`kcXI-|I~VHx&mg@)=L2%gL`VzWFxbHWQiq*!;jarSq%v z@_3252R>@lV2OuHiOO9oF?s6s2eL|s+-np(;+Ka#CZa7&&9t~D60VD|3HEAP{A7A+ z-0fA@<5;u$A&uq4onxCW%@guJf@Vzv{60z>o+F%m?WLaHvL-sJTyJEZ;Gy<<;PU3n z@2Mmq>e(+3oAjLbX!E*wD2zqn@M@P#w8^`t__9b-kK7xvUt3K%&lNp3ryG6oWL4@M zmz9k(FgyBYb>qopgQjdhrk>GLC6cFeV{kUSuXXayh5Sl=6~R3*{cKF_L;8jv;g0Il zNLJ=6MFcy?HJ!pq``L~se)2*)3rBi$yW+l0x=6L(_YoVIHrmKrK4F-V=Og+qI8VHn zDb@vF>U&10qv|HM@(JT_@e|ScDc0h0=JhqgLg1WmSNy$Wj>e`IpC zG5Mi_cK&w5Wlqu2440>;yB$+I;(P5LhX2kwUf{&jt+Xsev3-RQ!<;i_7f49Cetokm zD^l*FZlr%~+En>l7Uz~TUKC%hoAcK9$|)b-%Fs77BP$s`kULuwUqLVd6jEauy(@eb zSIfTg;C~MO;5cf_xz>2#<1M1~gdp8IR|Rkrs}Ke`m>A1^rM zQ`d8SGvvU9i#8s=q9}c;Exs3?n{I4qUFnf5?@2br$C@hAI=wCMNqMxu9KgdCcX+ggYYscNB5Ct8UMKwCD_uNFE%gB(*X#M3C;8_spVnnN=aH$J z70ag=CbHAG)(7ib47@~CvO{Fz`)nCfS$a*)JVf>LW;ay4z*h>61z)Gny|(vKybyiB ze?3^@_c0su`W>38_)c&!wI`xnNxGMIL5dCU_07k910C zP|TLd*XLg(>jMm_Yi@T$kyPF_>=tJhoxVf}|t{B&3k3rA*DtnO|iG|Ht-B%)W zxM(Cf-FG4%=MRjezqPV9dPnK#kzMeL-u?aH?nr2k`NTrX5z?K6TloP>T3m~n6)v|F zmmak1Zfk^S7|TVzvbni2o0_j{<0IdDQJ((ATS?iSf6Aun#pywjs#PvDWvWt9NAZCV zV|-q69uD&L?pJ>KC`igRT5gDAq+jzyS+?4_pFA{@&fS5ht>4yc99MgHRMvf7f0Wy7 zOS#PRx8M64p95VksuDMAK$p+-DVpT;ZLhS#*vKaq z9j{lsFxhc((MPZyjxk@$W4t$o3p}pA!C!e*L^>w>^_^0m$+0$C4*JOx?AawNLI*mW zor3AI!BrsG^d;!18by7$Ifk0%tj@Fa!yJoZAEdtu1m6w|61pIBiQdD}GP#SURy0BH zen45t1v1KKznpzS%oVauE#n@tkWZ^8S+eHZ!4!($=Sggee zv=XJ#eYX^Dwf?)tP8i&9=TQ7|IqS|c#b!m!@|PX$-LM$GDZRrtW3mrX+~BJ4X!etJ zvDb6_b3h|;)%zlU$x-`1;f1!5tCAeClOOOGyFDHMu)bhkxlu8<&@fO+YJz-s#U*r9=EJ|jveXR~qx{#9`h62z;0 z@8Nu=nU%e5=l*J0rP+sk&7itWNN-GQnL9mT8hxSURB{HvtWlREIp~;eoUq!7Fd>3=wX8u7btI>8QlTPZ{_0*weSXxglA9HE&%wwa)Ld#oOwRiC zV{Tnc_j4vxj_-<3H9QqIlesP*Ij_om*f&g1^RBi2+o@0W-_H7_=-Mg-s`z`E5bEy9 z^;wd>VIDtqsJ#A!Vb-8Toys|h&nB$$K@(>90xLl|LpRSEgWV&1e_I(+nO-cqEHz(_ zQ?WLGy5tb|spKuKZgS&#yscctkIFNSm;EI&hpPXayVnymGzK;=+ex^vuE!@XsXubs z-WZMaJyPLczwSBUZe+|GTf8E9EU$=Gy2A5t%v4zVR&t6;gDPL7_v6a7sC0{mYeh4k z+3{(OCw-IW3fh#ChBsB*2a@{zzrRTfak#+Qbj+rHiu}(Z4U^H|>srj~&0P;usewP% z9U9jRB0D_CLV^QWJsx^d-^uE{qqic~bn4!A!pxT;fu?7Q{^Rd@9xr|f`2I+jgHyr* z``7Tvf>8k-tvN2~lBn9V23qO#>G!K~D(4=k<9BHL^HM3b`i4iT)vhayw*Jj?*TlrDxWxNB%9WpUtoT5_r9Dm4l83m-q$TV_rbgSi-fWX*N-Fj@xp2V*X&O(X?qdv z*hytJ8{cPHinzDGQr|sE?nF^+?qYt3NlZ8ZMBHI9rI%L zN-$p8RANiz?q&QsN7cK@f8jq~onsQI^`sB^cotJol>XYZ^;)v}uODZ>OSZ88`AU&A zsTwh%YMjwII&wI2GEhH{!u{f6ROiL=@`%Xm4UrwDEmeKskBt)b7Xz~zcUFv?O*m+i z{HO{tb0tQYgbKb~KFfV4!JLb>_5ef0b91xOT)e<`XXzQ0aF(uctFtFJ@5>cy_X;Qo zw1^+3OdhBlW2}&&0zX9=)~PbR<o8%YyzUo$NlDu~K)sJ!xrZsEaf{vS0#ko|a z|CG9fqRrHzMQ)rH)V8A~e_v%Khh3XJea3r}H2K@^y2yga(O(JAkL@Uxo>{Hnt{)cV z^S)PxucdL8efFuL$@h7WWkvMwIz{%*yE4@}d89Igmf`yLN{NOl!Q~SkefsCam?^#D zX1Yq4rgbQ{?$+BX5_W#ZcJG$WeEGXJyVRF9s?VPr<1nqnd9vzz%F740KXu-{GrsN6 z>)>=&zFb~c(&fpZww-s5pP>C<{?L%wIAa|3!4iCo#6^G8CvQ&MG_zAG6}kL;tHs75 z6lOkYt2uh55$Btz6#gi5@fY7EDMf7J54}$`%6y~?k2LJC(h5pphdV_3Sa1=a@y+#T%M{r!}iSoJ#Pr8U0IsbK$LTp88dV-H%R+TpiC1MS5^srw676Op?-O z@b0du1I87F2ZzM0)*lO37WN2fhXrRpNspQ1YI*gCk}lcrWNFQa`b@whorhzO zMe`%|>$xdUiGcA;FC-2w>3j?u>ThN)jwXG``Rr}4*n2~Ix#^Hnje+yc4UaUV&J|C` zQ#rQ*jIC55BEd{g^8`*d9kdXsXw`#i87<)wLx!ue0-Bw{ z2ci@E#*>VM- zId+(un`5A&GQ7R{;N=KE5h4BA7vA*bk@&%ZO*ZR~l&$`QzNO}Fzb-M5bBir%wkgFp ztJDyt-03!cg^#IF_fy{4;ca9)_>X*VUk1P%GeW=t+;`;r@$g%E4AjsA@EYiaY|+5^ zWq_HG!iHl(zQ#WMCeU#bdc5(K9F*OKzQ$Hxfu4DNVaIJ?@Uj$5GB%EmRo-1eFYj%H zJ-2=*(?3@-mFebvEArT|BH3qs`OdcCm~gR)YpP4ih1O3qR4jU)Yx~O^-D|=Z(onUi z#6^9&>QyAF;Hq&A?{Ws)6q<#zdC1-i=^Kr5Cv9KhgMa{pssdt@6 zv`mXu{1}d&3HkKQf$?J~d7cm7i&YxXp$77f!CD%5KHcgdF+=ABZ6MqM%} z&1f7_KK^+5TP;T0X`4HGgTmCyT`0KP74-95!}n}`OV0i-l_?%!WA-p1 z+&lbElXiYtL<)c5XC2L7-kN?wW&a*jH5O>-S&nqoG7ik{q?>HK$SLyPL2nw|^zs}c@Bj3&>-}t=6MIlA09Ix*f z5H3I|VjmbThBFfWMcumn%lwLKte4}50bNzOQ{JyROG3LCqK>_L486v9DHJg@Ln8u z36ZHtSO zPh1Y74Y-b@M^cXV#mT|4qGo>_BOIb73TKEY>0@xENP3O;anK`2Vgf>OxKC6t`j>_q zL{b^b#udXSSP1y1xIy^H6yeM`&K$8Q{fyIOgDn<+;g%79pEq%Mq%8Kdq%_Z!$nGlWNOVzikzw;xbc%ZAld;z(h6JnLDT~Q zf>|GQ;opERZwb)L495mGN08DHo`sX54;51*NGIvwXZyj4q@LvP(TOZ=DxLOABqUCD zI1*miiol#sI_QAUnQ@}qlKyCLJv-@0OL`pT&mNWFS9c}sUZ3b%PV!*!ljY#F&B@@J zBUn2c{M$~f(>M~D(H{EoG}+D2C!EDa91_=$vsSkxl|RYqYkAYE7+UUCE-I`zsZktc znp}3b>q*AOV}{*3&g+5B5#6ya^J9Q8|bEQ zCrG&sN-hMNXVU3?wVLzZ;23F~afuvBt`pGFS=813w{tdO?V+cu(Q>1e6pv0F$wODY z(XirB;hea;GYU0Yj&Du|GN@DI2cEedIkn1u`g^Pj)8B2c?}`-OgzgguM=RGZ$}DI^ zZv0l!7o6Ps$7f+M-ModiS>fA0Fa}2gv}rz z4C(pcSYQn?@QMdGk*E)n0VyPtrc^)>E+jaW4JZ+t66ARVXu!bs5g-eL_(#A|VsMbL z0N?_@Jp#nw|LAidB2jFb1E|6vE(g$r!MhybBn`)#`bk76S;HZ!H08FIFM~O%B0Rz|`pAQ(ppf4ZI10rg{5-2Jcc)bANga1n^090Tw zSOA=bfkYu-4TI=CFjojz!4kb9z#ax=MZh^2kQM{RFgRC?N-Fmxm=e^FeF>V>;}YN$ zO#V{>7{cIWDPRGE{8F?gt9wAb49zFG3~+}zWaWS}46c;}rZ8wP2h3o=@fh{v{TR*X z)nk;yQGs$iDgblDsshc2p%N{UT_s=wtEwx}pwv}>9xORq1$e=rvkEomdxD1WdV-GP z#S_#I{ZmwB{}h!x*^}U^(E*xNqlx8LqYk&L(db4ss3fljmHes!Y~kpZ&(LDlJwr#z zREw&7YJn>-=W{K}(I5aeu;dW|aDV|&hk~nhz*P#UEv@cqHM{^l>i|}8tqx6EyB^If zr5@0M%_i&7+8u2GPQ#MOJ@BCc9pS;}Xcc_-K-+Uv#oUNGbZ$h))6j@EI<5)zY}tes zI=2Z8I@bhP!m)IkQB`a+pbtw%no*A63$#)JFHq0jFVOxIeu++D@JqBDV=vK4skflD zOKAZv!VZ78ps~zaQSi7GI1j5R+fd-N2U^+yM_47+4!FV~xg8oHaaovahh~=u6kkE9 z5<&PY;0z2t?SVrbP+~+?R0lM6A{g(021o=4Uqc;91m3Tqxgdg9uTeh?Z%}aI4H}|& z5Bz)sO$w2$+liVdbfV<(Js{Qv%?^>{*M*W_ccFd`bVJibR5^B|`PAW7bVa3qJ9+n_UhAzmTtHY9kN(InqlA` z=;}uk;~PLdyA41q2r<_40n{`3AgVeui25lUggSx9`8Np7DG^w`Lpeq7P^K`H}WeAnb4WS{9y+>6s?@{wl@6mi@hSB81htYBM52KSS_5m%+%@3%<{ymB4N7Ver zN7TIUBkGy^6IvGMPiThKpHMQz2pZzt2ujWyK{?AKXsYU?D7Zh0&gu9lT1=TSlpM4N zI>yk%*vCa>iF^a76Or z9#H>=nkRlkum1UOsQK|})I5C}U6$sjq4E>WHD*vr>Y7b=9f1ec-z;PC(bxKBdDzt6Z=80HFqr&a*?)E;k&wvki!mw)H(~ZJD1B+v@0SDN> z2GE1-Yv{09;-9yKLc}=eb#$LWit_(82wnp?;qs+ImN-|H|LWk6ci=8jeA^fmPwL=k z!E7xYJNS1Q9Xpq&B*Qx>z%KMs-WRCYV#ouuugdc(ruXi zS4Rcj*g&_EnUD_Kc^35g1??*OiA3V8FA=2+7Z54_CvX6~@&|x--{7gAkP2_}AC)LS zu^su2$Kek_zsU)Oe&8guFW+0PL@FD2-xfy)UZ5sJdSZ*{Wy6!G5(DWSapa)EGk^wm zr7;kn@(P-eY-lE>_qo!!PUIsy-^yQ*gR?$}gKJkH2Rpyeexv#gsjm7VD&yY(Gwhb@ zNJ>}$)b2)5N9}hj9f(j%Au2rjmqZ6EHxMbXiAuRPA!*W0qVynWy9qGCZhNIu7MG!H zb)mr@+?Q=(7#P2ae$413+K${J3i!YUe;hr?@B|(1Vc*^tG|*5vp{5ny=U_aE7>gaW z+yXe^Si_6EQqE8;9cUP0`>2vB2(@$z;Dv|Ky#)pQm_kwAHZ%*>P~G;khWQYO2mYdMBk>msV=ahCud$Mn zgC2j;yh4bo@4|?xVb7qSD7|(Nk<$J{^Xi}f9r+f@EByb<|TpJ|H^fM3(aQvU1Zi;0ApjVA4cdl( zq98*$!dG5PBLd1T2YT%;T+CGpCI^N1&@i6FTFwe?0=SV5;bU_XSs}p>hi5!D41Gotg}}oi!50rqIufdQt&s YV?#|wL1%<9!rXKtA@M1PCYj{_0mfxewg3PC delta 12500 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 delta 16129 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 z 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