From 35fe51f72245ac873c189db9ea2999686888734e Mon Sep 17 00:00:00 2001 From: esoe Date: Fri, 11 Nov 2022 17:23:24 +0300 Subject: [PATCH] qq --- options-home.json | 5 +- options-office.json | 3 +- out/repos | 1 + .../molokoin/molokoin-client/css/style.css | 45 ------------ out/unzip/molokoin/molokoin-client/index.html | 23 ------ out/unzip/molokoin/molokoin-client/js/main.js | 1 - out/zip/molokoin-client-master.zip | Bin 2209 -> 0 bytes .../sourceListener/ListRemoteRepository.java | 66 ------------------ .../ru/molokoin/sourceListener/Options.java | 28 ++++++-- .../molokoin/sourceListener/RepoCrafter.java | 57 +++++++++++++++ .../sourceListener/ListRemoteRepository.class | Bin 3007 -> 0 bytes .../ru/molokoin/sourceListener/Options.class | Bin 1686 -> 2216 bytes .../molokoin/sourceListener/RepoCrafter.class | Bin 0 -> 2742 bytes .../sourceListener/SourceListener.class | Bin 6661 -> 6860 bytes 14 files changed, 85 insertions(+), 144 deletions(-) create mode 160000 out/repos delete mode 100644 out/unzip/molokoin/molokoin-client/css/style.css delete mode 100644 out/unzip/molokoin/molokoin-client/index.html delete mode 100644 out/unzip/molokoin/molokoin-client/js/main.js delete mode 100644 out/zip/molokoin-client-master.zip delete mode 100644 src/main/java/ru/molokoin/sourceListener/ListRemoteRepository.java create mode 100644 src/main/java/ru/molokoin/sourceListener/RepoCrafter.java delete mode 100644 target/classes/ru/molokoin/sourceListener/ListRemoteRepository.class create mode 100644 target/classes/ru/molokoin/sourceListener/RepoCrafter.class diff --git a/options-home.json b/options-home.json index 290cefa..d9c0b23 100644 --- a/options-home.json +++ b/options-home.json @@ -1,7 +1,8 @@ { - "linkVC" : "http://molokoin.ru:3000/esoe/molokoin-client/archive/master.zip", + "zipLink" : "http://molokoin.ru:3000/esoe/molokoin-client/archive/master.zip", + "gitLink" : "http://molokoin.ru:3000/esoe/molokoin-client.git", + "gitLocalPath" : "C:\\Users\\Strannik\\Documents\\esoe\\code\\sourceListener\\out\\repos", "downloadPath" : "C:\\Users\\Strannik\\Documents\\esoe\\code\\sourceListener\\out\\zip", "zipPath" : "C:\\Users\\Strannik\\Documents\\esoe\\code\\sourceListener\\out\\zip\\molokoin-client-master.zip", "unzipPath" : "C:\\Users\\Strannik\\Documents\\esoe\\code\\sourceListener\\out\\unzip\\molokoin" - } \ No newline at end of file diff --git a/options-office.json b/options-office.json index bfbdb12..53a6605 100644 --- a/options-office.json +++ b/options-office.json @@ -1,5 +1,6 @@ { - "linkVC" : "http://molokoin.ru:3000/esoe/molokoin-client/archive/master.zip", + "zipLink" : "http://molokoin.ru:3000/esoe/molokoin-client/archive/master.zip", + "gitLink" : "http://molokoin.ru:3000/esoe/molokoin-client.git", "downloadPath" : "C:\\Users\\devuser\\Documents\\code\\sourceListener\\out\\zip", "zipPath" : "C:\\Users\\devuser\\Documents\\code\\sourceListener\\out\\zip\\molokoin-client-master.zip", "unzipPath" : "C:\\Users\\devuser\\Documents\\code\\sourceListener\\out\\unzip\\molokoin" diff --git a/out/repos b/out/repos new file mode 160000 index 0000000..60eda03 --- /dev/null +++ b/out/repos @@ -0,0 +1 @@ +Subproject commit 60eda0382753a60b183fec48f7372c956c7895ff diff --git a/out/unzip/molokoin/molokoin-client/css/style.css b/out/unzip/molokoin/molokoin-client/css/style.css deleted file mode 100644 index 50893ee..0000000 --- a/out/unzip/molokoin/molokoin-client/css/style.css +++ /dev/null @@ -1,45 +0,0 @@ -body { - font-family: Arial; - padding: 20px; - background: #f1f1f1; -} -div { - background-color: rgb(181, 122, 236); - padding: 5px; - margin: 5px; -} -.header{ - display: block; - padding: 30px; - font-size: 40px; - text-align: center; - background: rgb(181, 122, 236); - /*position: relative; top: 20px;*/ -} -.controls{ - /*position: relative; left: 20px;*/ - list-style: none; /* Отключение отображения маркеров. */ - width: 25%; /* Ширина меню. */ - float: left; - /*padding-left: 20px;*/ -} -.controls li { - margin: 5px; /* Отступ между блоками по высоте, необходимый для того чтобы пункты меню не сливались */ - font-family: Verdana, Arial, Helvetica, sans-serif; /* Тип шрифта пунктов меню */ - font-size: 14px; /* Размер текста меню */ -} -.controls li a{ - display: block; /* Изменение отображения на блочное для того, чтобы иметь возможность задать внутренние отступы. */ - padding: 4px 15px; /* Отступы внутри блоков. */ - background: #0db5b5; /* Цвет блоков меню. */ - color: #3f3f3f; /* Цвет текста в блоках меню. */ - text-decoration: none; /* Устранение подчёркивания ссылок. */ - position: relative; /* Это необходимо при использовании Internet Explorer 6 для того, чтобы ссылка по всей своей площади была «кликабельной». */ -} -.controls li a:hover { - background: #92d3d3; /* Цвет фона при наведении курсора мыши */ - color: #6b6b6b; /* Цвет текста при наведении курсора мыши */ -} -.mainframe{ - background-color: aliceblue; -} \ No newline at end of file diff --git a/out/unzip/molokoin/molokoin-client/index.html b/out/unzip/molokoin/molokoin-client/index.html deleted file mode 100644 index 744949d..0000000 --- a/out/unzip/molokoin/molokoin-client/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - molokoin.ru - - - -
- molokoin.ru/ добавить картинку и кнопку авторизации -
-
-
  • gitea
  • -
  • apache
  • -
  • moodle
  • -
  • adminvps
  • - -
    - - - \ No newline at end of file diff --git a/out/unzip/molokoin/molokoin-client/js/main.js b/out/unzip/molokoin/molokoin-client/js/main.js deleted file mode 100644 index 1a90dbd..0000000 --- a/out/unzip/molokoin/molokoin-client/js/main.js +++ /dev/null @@ -1 +0,0 @@ -console.log("qu") \ No newline at end of file diff --git a/out/zip/molokoin-client-master.zip b/out/zip/molokoin-client-master.zip deleted file mode 100644 index 61ce159969f3da12e8d70a73511affff95a8325f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2209 zcmWIWW@h1H00HlyDIs76ln`LxWXR3W$r#2BR z+LDWlF|~4lZG4l?KP!%zf#D201A{CMt;HpkIjMR;L*UlW4Gqk`6(CZl|HVE=qj~L$ zwNa`G^r;l(t!+8> zXM&EeQ))VRXTnczq21Hp-O4)4{pP~A2XBqr+sfwVPQ0-CsA*K}Ym^)UX3;QP;w7UIio9y#B8Ecj4a!u^kvNkw~n=H?$B zKXl(8xbj@E&VA2pWzH|sw|TY;uKSYFt#M_3K?Xzi3F}L|9FJ^l^DO09txp=BjSaW7 zcCWEYOqsAEVOPJW)S}M(?*7sP+I5;yE%6^1SA3gzT=%`8-81DwyBF!s(mJl;>|hwQ zbKZmRLR0cxXWtjN!#82ms>AXYotJm0RH3{xn~Rob~yO z!k)B!p0Tqo3QttjpBbFKF!z8^fcXiwGuw6N-Y|dA+gYK1TC>k_k+G{onc`9dVXtoE z{S!rAXj{adUc5+gbJv4=S28ZY`}}lSH@mZ9-L;BU4g9a&Ryve2DM>$aF^Ru_#;38m z>$%{n_MpCy8G;`ktgPbsY|0el)cbMf!i+|U{o|zWX_GD_^GgcMN zB{TMhxERlx9~t&KZE1++%UypOjBlLZp)1i;QN30~xAN?+b7m{7Rg()hF?hX|oh&)e z|ErwG@!z|>yuKx`@=ew(75OuHR@&O|yIOPdoc?P?bnVYL=<(tHrc`b<52@q3N+g&> z^Ayfq*b*qj)gO2A?~6?n_S{&%Q0R>MZ2nbAPHWe@Iq(+=FU)^(!*lM5XqyQ}zZZN_ zj9wmN_2k|3J4GBi;Rjj!yqto%%*&haB)y!zeXmu--_Q3P&(9M*vnX=T>zjrb+Nx|q zU+tLQe?Yk_*v&h7(ZVu+XJ0w7i`6%tt8R>(7_M{X=&T>>C5(>7X6>HlUw(7%``|qX zc)|+5&8Tty#|q2bkR1B2SFC&kBLjmmFqcYU$)TBfDXA5D86~+n@a#D?_-x)41A%?Y zANh`@3oS2*4E^Y}LZnkzCW^B!&nV}P)wa&%oYkwlj&!zba&(3+ofckjufx-FmXmzvuTywr-8ItDC|-aGQX@N)e3_{crI=6^%$Wz9e8-TO8_@(#~NYpvf~zpk8i>HA;N zsehI{(oZoDPIjF8oyRa{U7^~U;|umq-#P1>REU*GlG&|?pLI^Nu(&T;W72f0HR@TD zL;dm>yY%K>*4f1Bxp0q`)(?KJ2-g0V=PGlw&+d0B{lI=cDD>K`ZFW6B=5B6JJb%&Y zVn)A?N$Zp6j#s+2SuEfEG-ii{YZ`0U|OO-SOycwAo7;slfklINAT1nxlpl}-l zs-h6am;;&U#-LSLFr%xlyvEsadkQg{5g)8USnfRj2>} diff --git a/src/main/java/ru/molokoin/sourceListener/ListRemoteRepository.java b/src/main/java/ru/molokoin/sourceListener/ListRemoteRepository.java deleted file mode 100644 index 4a0b24c..0000000 --- a/src/main/java/ru/molokoin/sourceListener/ListRemoteRepository.java +++ /dev/null @@ -1,66 +0,0 @@ -package ru.molokoin.sourceListener; -/* - Copyright 2013, 2014 Dominik Stadler - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.errors.GitAPIException; -import org.eclipse.jgit.lib.Ref; - -import java.util.Collection; -import java.util.Map; - - -/** - * Simple snippet which shows how to list heads/tags of remote repositories without - * a local repository - * - * @author dominik.stadler at gmx.at - */ -public class ListRemoteRepository { - - private static final String REMOTE_URL = "http://molokoin.ru:3000/esoe/sourceListener.git"; - - public static void main(String[] args) throws GitAPIException { - // then clone - System.out.println("Listing remote repository: " + REMOTE_URL); - Collection refs = Git.lsRemoteRepository() - .setHeads(true) - .setTags(true) - .setRemote(REMOTE_URL) - .call(); - - for (Ref ref : refs) { - System.out.println("Ref>>>>>>>>: " + ref); - } - - final Map map = Git.lsRemoteRepository() - .setHeads(true) - .setTags(true) - .setRemote(REMOTE_URL) - .callAsMap(); - - System.out.println("As map"); - for (Map.Entry entry : map.entrySet()) { - System.out.println("Key: " + entry.getKey() + ", Ref: " + entry.getValue()); - } - - refs = Git.lsRemoteRepository() - .setRemote(REMOTE_URL) - .call(); - - System.out.println("All refs"); - for (Ref ref : refs) { - System.out.println(">>>>>Ref: " + ref.getStorage().name() + ">>>>>" + ref.getName()); - } - } -} \ No newline at end of file diff --git a/src/main/java/ru/molokoin/sourceListener/Options.java b/src/main/java/ru/molokoin/sourceListener/Options.java index 08b5b1c..f34a266 100644 --- a/src/main/java/ru/molokoin/sourceListener/Options.java +++ b/src/main/java/ru/molokoin/sourceListener/Options.java @@ -1,17 +1,31 @@ package ru.molokoin.sourceListener; public class Options { - private String linkVC; + private String zipLink; + private String gitLink; + private String gitLocalPath; private String downloadPath; private String zipPath; private String unzipPath; public Options(){} - public void setLinkVC(String linkVC) { - this.linkVC = linkVC; + public void setZipLink(String zipLink) { + this.zipLink = zipLink; } - public String getLinkVC() { - return linkVC; + public String getZipLink() { + return zipLink; + } + public void setGitLink(String gitLink) { + this.gitLink = gitLink; + } + public String getGitLink() { + return gitLink; + } + public void setGitLocalPath(String gitLocalPath) { + this.gitLocalPath = gitLocalPath; + } + public String getGitLocalPath() { + return gitLocalPath; } public void setDownloadPath(String downloadPath) { this.downloadPath = downloadPath; @@ -33,7 +47,9 @@ public class Options { } @Override public String toString() { - String s = "linkVC : " + getLinkVC() + "\n"; + String s = "zipLink : " + getZipLink() + "\n"; + s = s + "gitLink : " + getGitLink() + "\n"; + s = s + "gitLocalPath : " + getGitLocalPath() + "\n"; s = s + "downloadPath : " + getDownloadPath() + "\n"; s = s + "zipPath : " + getZipPath() + "\n"; s = s + "unzipPath : " + getUnzipPath() + "\n"; diff --git a/src/main/java/ru/molokoin/sourceListener/RepoCrafter.java b/src/main/java/ru/molokoin/sourceListener/RepoCrafter.java new file mode 100644 index 0000000..fc17eb4 --- /dev/null +++ b/src/main/java/ru/molokoin/sourceListener/RepoCrafter.java @@ -0,0 +1,57 @@ +package ru.molokoin.sourceListener; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; + +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.api.errors.InvalidRemoteException; +import org.eclipse.jgit.api.errors.TransportException; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.storage.file.FileRepositoryBuilder; +import org.eclipse.jgit.util.FileUtils; + + +public class RepoCrafter { + + public static Repository open() throws IOException { + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + return builder + .readEnvironment() // scan environment GIT_* variables + .findGitDir() // scan up the file system tree + .build(); + } + + public static Repository create() throws IOException { + // prepare a new folder + File localPath = File.createTempFile("TestGitRepository", ""); + if(!localPath.delete()) { + throw new IOException("Could not delete temporary file " + localPath); + } + + // create the directory + Repository repository = FileRepositoryBuilder.create(new File(localPath, ".git")); + repository.create(); + + return repository; + } + public static Repository copy(String gitLink, File localPath) throws IOException, InvalidRemoteException, TransportException, GitAPIException{ + // prepare a new folder for the cloned repository + //File localPath = new File(locationPath); + if(!localPath.delete()) { + throw new IOException("Could not delete temporary file " + localPath); + } + + // then clone + System.out.println("Cloning from " + gitLink + " to " + localPath); + Git result = Git.cloneRepository() + .setURI(gitLink) + .setDirectory(localPath) + //.setProgressMonitor(new SimpleProgressMonitor()) + .call(); + // Note: the call() returns an opened repository already which needs to be closed to avoid file handle leaks! + System.out.println("Having repository: " + result.getRepository().getDirectory()); + return result.getRepository(); + } +} \ No newline at end of file diff --git a/target/classes/ru/molokoin/sourceListener/ListRemoteRepository.class b/target/classes/ru/molokoin/sourceListener/ListRemoteRepository.class deleted file mode 100644 index db80c91456d4178f1801e8b7fd921277c697b0d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3007 zcmb7GTXz#x6#h<|cG7ez5UzzHQ3|BAbP7n-v{Xth5Sq5wmMTTXX*#6SPBL+3g4FvJ z?}~TD`(-Vj<)K(~Da++rx_t84AHdHLzmrKXX@kp_e3>azKGX{*T?V6tLOeqKmtenu#=$fTx zQdADnh6hSdlO@Mqe&H zYB)pssAb5r*h$?Q)*Vy67lZ+C+;jzYCzcsK!w95xGb6ArdU9!y@<^fXvq>ZCnG9CJ zdVxmUNohvXGPACsO)v;e&zhRyIJVS3bojzU}F)&gHxm)k^mJPgTLg|u(g=9O$rHz6mbqADnP`V_8@4LAU0`*d&SG~e>ak5g z$;uO0L}YEW6d)n&K!bv)z=o1Q5CIiC(MX~!cX6@_M57Ifl6r~4<}N#()-z*mA?$*t zpjn{)X7;OS!ES+|Yj{TteT=!#5FJ^DtGz1jkOmYQ7}8U&bluz5@VwRi{$@9Z1PT>*qEJ^8fd-bfq zs#!Gh%uvMJILfnjx{`Ozn6p0XyQQ5VY=Md%V=5M@hJ{B}IFh!?l;KgRfL<2VZ$DxQ&KZgCV~b!d0CHnk zgP0;lO%W33`+GvglhR+1{tA`;X})z@7HiRIH;89hBl8p&RN{DE#S3_mVyX->J@pik zswbjLZgL@!>I=I_>N&ik;AMfx|Ls-rs-!-U(bH@`uM?vDA*vC_n=0OtYYP4Mahbbx zC&ikuxA1-?D;FsQ_%oN=1bTR zzI7UrAFw?zjVAv0goD%AH;ua!jWgIU(037Acg>(n;40$1-2WqbPK0|eqrYhy_f6wC zwYh#m;KKF4mzsGFgl6BnofiJm2bsz&m)CM7EI1_wYWc zP2vhZz=xcjLlZv2$IPT_oXOR4d_t`VM_=;-HU0gc&h7tmuz-Ru6uMQ| rTd?Iik6qzQ6gG#vur=CB$9Zt`_Io`04DGd`Kvz(vZbS=lOB+w|(wr*@0`I2F;f=+_Gh_O_IE3 zxk{Eib5@PgBg1_yAdAjhyW|)}wPZJH)>O53=kY1aw%lofhV0;?K;sRkXr|DBHVKLS z0wi|IZ}kRK;|cYme&4?tRtZViN=o zN$f+M%+~_u?b*S-_R8gq3IrcLB9W*a^|$FQbS*DxA!5Vh5=k~}r8|O}vc4IJAX}f5 zXsTHUH3~NQUZ{nYO$Q~K*;JC_U19g>oCvl$Es?5mQbbgKlCGn&o4^@?u5iw;SFKXf zEGIEe?kJI*{LH0H3Zpp3S?f%Z;|Ymw^zhzAiA$iM$BoTR(=O7Tx`6MAsej945|;%; zialMC$g|IDxRJp1e`;0nO5DUPs>m&)R5fQ`2@C|UQuREkNna8(oMn|h?Ld0?Pl?90rR-RI7cKg8BmL!JIL(ipBPR)5u zdfVcfmwt4{lx8umHgBY2@4^a0q%jCplm;Xd2IILJ*xp34ugznLFiXY9To{{T<)5k z9gHre$G+k0&^FF*<3f6hKHHcsu#o$Xt0bjw(;n$}qV#)8FGT4NmHsG7f1>pHD1A}s y&w_fc{^X6VEH#50u47o+3j(rgzq3qR ztG?9S9RcNoQS+Y?4eR7NwrE&}yCl$+&6NeBD|S^^(S@@TDtZKZONOPtXzW*X=ap75 zbw119(#*2v82lbAM%^8wE-+d8|7D0QQP*9n>!A;1PqXLB2?z{IbR$OD+s*7$Hg`Im zD5>CT%WZl4c?pHL_tN&(7zsn!um4KGsTU;@oGK~xBp{$t-Wy*u&blNK=PZ@7f@OiY zYx{yLm=+jnZ^LrKFsr%~M~?2{cPlfWQ89%A3!GA^?p28)q&?^?Z>A2?%z~0}X_WL71oj=BzPhMItjWKUAfj)YceggWD zq&Im*0AY<7ggO%fGSUu`3I!Pr2N`Pz86uE$2M}%!gHW?WK*riZMnXZx z!$Bt6K}HE=tOE$Ug+a)XAs`d&Aem4Q`m}=0KgpKtk;Ctp+DvATkHg%pu|(pjnDo7#BCXh diff --git a/target/classes/ru/molokoin/sourceListener/RepoCrafter.class b/target/classes/ru/molokoin/sourceListener/RepoCrafter.class new file mode 100644 index 0000000000000000000000000000000000000000..0f805e202800a4a86f0c28c761ea471ad466e814 GIT binary patch literal 2742 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
  • jN3j`KaGBi5WZt}&mwh3V1d>3=9s(&8GARMF0HH~Mu!KNunIx0&!em~UOn^Y! zDN8A#rG;LXN-Zu}QxTQTNg$=fjVjh!t5_Aa?pEqnty-!!o;#DY)%uUW-^{)D-Fuer zob%oD-gEQrpQ~Mc>*6y2=F^I!+Qrx;vo~OvzP?hkv(sol^TLakB0{x}8q^Zf&0ddh z#WEvMW13sr_}}d5HT#T!=^r4>C@2)G>^W8iOU0@9j7%&iSgNWt)M14V6@?la(4?S| zkR?{zvx;@B#0)}AmnTr);qe8GPQ&Au;;VHuV-3OX?qz=+gi^62Hc3!IMmnFa)3ILa zIRfUIfZyVCu9ArWjuj2!ONaThid;`|gO$j>rRr51QOP9*Ou-NftrKmqmY6O})d559s(HJ`|zK zDz~3&AS*|RFDPtycfg!_FFvf}7#1^odbV~L{yq(Z_=t`tzl2Jk5zLwHJzsdbJMI4RFRBVx3v?I-YA9iPMJ2{y?L zre8r}y|i&g$61`?>hACx0fuKQs4rZv;RL>*BP8WjE{@@Kw|P0x6ByBP0UC?9d(A%H zIgSwxPvaQ{m&9Q$&3YMQ;wh~(Yd^lEG(c=AU5c8?AP&Q1wRsx=+mq}!OP;bK7Y1}pXvCyOuNcyZ!mmY*VkzH zC4Q~oSCb6#c>-nYn(KA^2Cs;;nA!Fl_??1RMN>?k_4oLL*b!3|eFJ}zbbgI6RgCGG zm7IMOf6?)}G#$sLYt0=#uj%fPG*a+4u2;BNUbnBSEOK?D@dn;ha8qQ(rrPii{8LoK z)>`nE2*yrTK^BFGkS$({&5qK^N;Yvdc6J8Hu9HGG&Rk1#{n|Q>REk!JGnp?|$0Uo( z33gEy7iZNeMl6Xl9oHyMr+7*bBXK=y5~V1V%&lxvG*72gSsSe{;12Zn)tDVzikXzA zqX6fkDT&f`%Aic)i!b79Fq5Y70cA1w3nJ7DN3*i6n^{#^xLzvc=rkP%x%_Qr$AE)! zncgx3*$cC|xltZBH_8{U#+Ta*k)u%2xdjQ+DWyWkcfd>}s?@PFvRWuMB^Fo}S|s)* zR@s&j@+LuxmlJDA6}d?V=48Q!Y0!{^L`+92W*{56$j3~^pNDc@Rq)D%Le!!N%TXe( zCk3cntV*61#35F;aP!X}!IFlvNE=06YvQtD)E9?vdkCvSSQ|p_5F8D>G1qnq#KKeA zLpiLN$Lmx?@mRrTT)cl9qo`ufi*YOOX0r^N#(XT`*#;+Cuz@Y)@VbI!DTsx9punoD%Py(onDjbUR5?(o=gnhz~uFzK-Kx&{t5 zqw<>~4oi`OWk};^2}ox{4kVxpTlk5vA(@XO{v3=o3$rGCdKjU^o;3=CeQs?m8HKmC z=seo-k(innYX+wx{s!lD0 zQz4v|^Z6&nUz78&Q@w%;ry9b=A`hMVzCKDo&aM;3NDlZX>Gk=7(UkFVkim&A$lcotvdgcjg& zd>vOg^$T$T-@tQBmAg z$+3i$RP`o9C)r7OWD-#eXGY%8!z1`^!w7yD;nGh>@QVxhtp&jg_#>gQxFoXwXX_>W zbp(Hpx`cnVTF+v9O{?uJMXebjM~GsZxIvU&phQB5rbO0Gxt_|K*^-NIxNH+WB#CBl z6LH!?G;^|rMASo6zzyXLqszp-*b}5e&aiAGReW24etz1{kar-J??wi%GqH=?+ioo4 zxdwOhC*wWX#HyVL@^~Ni@<+)-Obkhbs_^|k{C2|`q+%)wyV^#jG>h|DgGwr+*-VX2 zq|qD-mb1gXoUIDFg*PXQ9}%0&JF@txu#B@8YdGuI6kO+&6MxOBG>>kL72Qq0fH&$XfhR^NP5(b+j!SbLG6N0(Got0Y*RkMnPYN(dy bbar|J*Qw5~#?w-MVJ)|-{0dE?dZ_;ff{>^|