From a0cef20f211356a2515b4b713f3b95ba56e64d4f Mon Sep 17 00:00:00 2001 From: karthik Date: Sat, 7 Oct 2023 14:01:18 +0200 Subject: [PATCH] Use gradle version catalogs --- .gitea/workflows/workflow.yaml | 72 +++++ .gitignore | 2 +- README.md | 17 +- build.gradle | 46 --- build.gradle.kts | 55 ++++ gradle.properties | 19 +- gradle/libs.versions.toml | 14 + gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 294 +++++++++++------- gradlew.bat | 34 +- settings.gradle | 1 - settings.gradle.kts | 14 + .../barrelsofdata/sparkexamples/Driver.scala | 2 +- .../sparkexamples/StateOperations.scala | 2 +- 15 files changed, 365 insertions(+), 211 deletions(-) create mode 100644 .gitea/workflows/workflow.yaml delete mode 100644 build.gradle create mode 100644 build.gradle.kts create mode 100644 gradle/libs.versions.toml delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/.gitea/workflows/workflow.yaml b/.gitea/workflows/workflow.yaml new file mode 100644 index 0000000..2c3330e --- /dev/null +++ b/.gitea/workflows/workflow.yaml @@ -0,0 +1,72 @@ +name: Tests +on: [push] +jobs: + reset-status: + runs-on: ubuntu-latest + steps: + - name: Reset test status + run: | + curl -v -X POST https://barrelsofdata.com/api/v1/git/action/status/publish \ + -H 'X-API-KEY: ${{ secrets.STATUS_PUBLISH_API_KEY }}' \ + -H 'Content-Type: application/json' \ + -d '{"action":"${{ gitea.repository }}/action/tests","status":"starting"}' + - name: Reset build status + run: | + curl -v -X POST https://barrelsofdata.com/api/v1/git/action/status/publish \ + -H 'X-API-KEY: ${{ secrets.STATUS_PUBLISH_API_KEY }}' \ + -H 'Content-Type: application/json' \ + -d '{"action":"${{ gitea.repository }}/action/build","status":"waiting for test"}' + tests: + needs: reset-status + runs-on: ubuntu-latest + steps: + - name: Set test running + run: | + curl -v -X POST https://barrelsofdata.com/api/v1/git/action/status/publish \ + -H 'X-API-KEY: ${{ secrets.STATUS_PUBLISH_API_KEY }}' \ + -H 'Content-Type: application/json' \ + -d '{"action":"${{ gitea.repository }}/action/tests","status":"running"}' + - name: Checkout + uses: actions/checkout@v4 + - name: Set up java + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + - name: Run tests + id: tests + run: ./gradlew test + - name: Publish test status + if: always() + run: | + curl -v -X POST https://barrelsofdata.com/api/v1/git/action/status/publish \ + -H 'X-API-KEY: ${{ secrets.STATUS_PUBLISH_API_KEY }}' \ + -H 'Content-Type: application/json' \ + -d '{"action":"${{ gitea.repository }}/action/tests","status":"${{ steps.tests.conclusion }}"}' + build: + needs: tests + runs-on: ubuntu-latest + steps: + - name: Set build running + run: | + curl -v -X POST https://barrelsofdata.com/api/v1/git/action/status/publish \ + -H 'X-API-KEY: ${{ secrets.STATUS_PUBLISH_API_KEY }}' \ + -H 'Content-Type: application/json' \ + -d '{"action":"${{ gitea.repository }}/action/build","status":"running"}' + - name: Checkout + uses: actions/checkout@v4 + - name: Set up java + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + - name: Build + id: build + run: ./gradlew build -x test + - name: Publish build status + if: always() + run: | + curl -v -X POST https://barrelsofdata.com/api/v1/git/action/status/publish \ + -H 'X-API-KEY: ${{ secrets.STATUS_PUBLISH_API_KEY }}' \ + -H 'Content-Type: application/json' \ + -d '{"action":"${{ gitea.repository }}/action/build","status":"${{ steps.build.conclusion }}"}' \ No newline at end of file diff --git a/.gitignore b/.gitignore index 625dd55..43a3558 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ # Compiled classes *.class # Gradle files -.gralde +.gradle # IntelliJ IDEA files .idea # Build files diff --git a/README.md b/README.md index 7d6f8c6..e901b90 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ +[![Tests](https://barrelsofdata.com/api/v1/git/action/status/fetch/barrelsofdata/spark-state-store-data-deduplication/tests)](https://git.barrelsofdata.com/barrelsofdata/spark-state-store-data-deduplication/actions?workflow=workflow.yaml) +[![Build](https://barrelsofdata.com/api/v1/git/action/status/fetch/barrelsofdata/spark-state-store-data-deduplication/build)](https://git.barrelsofdata.com/barrelsofdata/spark-state-store-data-deduplication/actions?workflow=workflow.yaml) + # Spark Structured Streaming Data Deduplication using State Store -This is a project showing how the spark in-built HDFS backed state store can be used to deduplicate data in a stream. The related blog post can be found at [https://www.barrelsofdata.com/data-deduplication-spark-state-store](https://www.barrelsofdata.com/data-deduplication-spark-state-store) +This is a project showing how the spark in-built HDFS backed state store can be used to deduplicate data in a stream. The related blog post can be found at [https://barrelsofdata.com/data-deduplication-spark-state-store](https://barrelsofdata.com/data-deduplication-spark-state-store) ## Build instructions From the root of the project execute the below commands @@ -13,23 +16,19 @@ From the root of the project execute the below commands ``` - To build jar ```shell script -./gradlew shadowJar -``` -- All combined -```shell script -./gradlew clean test shadowJar +./gradlew build ``` ## Run -Ensure your local hadoop cluster is running ([hadoop cluster tutorial](https://www.barrelsofdata.com/apache-hadoop-pseudo-distributed-mode)) and start two kafka brokers ([kafka tutorial](https://www.barrelsofdata.com/apache-kafka-setup)). +Ensure your local hadoop cluster is running ([hadoop cluster tutorial](https://barrelsofdata.com/apache-hadoop-pseudo-distributed-mode)) and start two kafka brokers ([kafka tutorial](https://barrelsofdata.com/apache-kafka-setup)). - Create kafka topic ```shell script kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 2 --partitions 2 --topic streaming-data ``` - Start streaming job ```shell script -spark-submit --master yarn --deploy-mode cluster build/libs/spark-state-store-data-deduplication-1.0.jar -Example: spark-submit --master yarn --deploy-mode client build/libs/spark-state-store-data-deduplication-1.0.jar localhost:9092 streaming-data fullOutput deduplicatedOutput 5 +spark-submit --master yarn --deploy-mode cluster build/libs/spark-state-store-data-deduplication-1.0.0.jar +Example: spark-submit --master yarn --deploy-mode client build/libs/spark-state-store-data-deduplication-1.0.0.jar localhost:9092 streaming-data fullOutput deduplicatedOutput 5 ``` - You can feed simulated data to the kafka topic - Open new terminal and run the shell script located at src/test/resources/dataProducer.sh diff --git a/build.gradle b/build.gradle deleted file mode 100644 index bcbadff..0000000 --- a/build.gradle +++ /dev/null @@ -1,46 +0,0 @@ -plugins { - id "scala" - id "com.github.johnrengelman.shadow" version "${shadowJarPluginVersion}" -} - -group "${projectGroup}" -version "${projectVersion}" - -repositories { - mavenCentral() -} - -dependencies { - compileOnly group: "org.scala-lang", name:"scala-library", version: "${scalaMajorVersion}.${scalaMinorVersion}" - - compileOnly group: "org.apache.spark", name: "spark-core_${scalaMajorVersion}", version: "${apacheSparkVersion}" - compileOnly group: "org.apache.spark", name: "spark-sql_${scalaMajorVersion}", version: "${apacheSparkVersion}" - implementation group: "org.apache.spark", name: "spark-sql-kafka-0-10_${scalaMajorVersion}", version: "${apacheSparkVersion}" - - testImplementation group: "org.scalatest", name: "scalatest_${scalaMajorVersion}", version: "${scalaTestVersion}" -} - -configurations { - testImplementation.extendsFrom compileOnly -} - -task scalaTest(dependsOn: ['testClasses'], type: JavaExec) { - main = 'org.scalatest.tools.Runner' - args = ['-R', 'build/classes/scala/test', '-o'] - classpath = sourceSets.test.runtimeClasspath -} - -test.dependsOn scalaTest - -shadowJar { - mergeServiceFiles() - zip64 true - manifest { - attributes "Main-Class": "${mainClass}" - } - archiveFileName.set("${getArchiveBaseName().get()}-${projectVersion}.${getArchiveExtension().get()}") -} - -clean.doFirst { - delete "logs/" -} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..3581d4d --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,55 @@ +plugins { + scala +} + +project.group = "com.barrelsofdata" +project.version = "1.0.0" + +dependencies { + compileOnly(libs.scala.library) + compileOnly(libs.bundles.spark) + + implementation(libs.spark.sql.kafka) + + testImplementation(libs.scala.test) +} + +tasks.withType().configureEach { + maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1) +} + +configurations { + implementation { + resolutionStrategy.failOnVersionConflict() + } + testImplementation { + extendsFrom(configurations.compileOnly.get()) + } +} + +tasks.register("scalaTest") { + dependsOn("testClasses") + mainClass = "org.scalatest.tools.Runner" + args = listOf("-R", "build/classes/scala/test", "-o") + jvmArgs = listOf("-Xms128m", "-Xmx512m", "-XX:MetaspaceSize=300m", "-ea", "--add-exports=java.base/sun.nio.ch=ALL-UNNAMED") // https://lists.apache.org/thread/p1yrwo126vjx5tht82cktgjbmm2xtpw9 + classpath = sourceSets.test.get().runtimeClasspath +} + +tasks.withType { + dependsOn(":scalaTest") +} + +tasks.withType { + manifest { + attributes["Main-Class"] = "com.barrelsofdata.sparkexamples.Driver" + } + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from (configurations.runtimeClasspath.get().map { if (it.isDirectory()) it else zipTree(it) }) + archiveFileName.set("${archiveBaseName.get()}-${project.version}.${archiveExtension.get()}") +} + +tasks.clean { + doFirst { + delete("logs/") + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 12adfdf..6ca7031 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,14 +1,7 @@ -scalaMajorVersion=2.12 -scalaMinorVersion=10 - -apacheSparkVersion=3.0.0 - -scalaTestVersion=3.1.2 - -shadowJarPluginVersion=6.0.0 - -mainClass=com.barrelsofdata.sparkexamples.Driver -projectGroup=com.barrelsofdata.sparkexamples -projectVersion=1.0 - +org.gradle.caching=true +org.gradle.configureondemand=true org.gradle.daemon=false +org.gradle.jvmargs=-Xms256m -Xmx2048m -XX:MaxMetaspaceSize=512m -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.parallel=true +org.gradle.warning.mode=all +org.gradle.welcome=never \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..53d7632 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,14 @@ +[versions] +apache-spark = "3.5.0" +scala = "2.13.8" +scala-test = "3.2.17" + +[libraries] +scala-library = { module = "org.scala-lang:scala-library", version.ref = "scala" } +scala-test = { module = "org.scalatest:scalatest_2.13", version.ref = "scala-test" } +spark-core = { module = "org.apache.spark:spark-core_2.13", version.ref = "apache-spark" } +spark-sql = { module = "org.apache.spark:spark-sql_2.13", version.ref = "apache-spark" } +spark-sql-kafka = { module = "org.apache.spark:spark-sql-kafka-0-10_2.13", version.ref = "apache-spark" } + +[bundles] +spark = ["spark-core", "spark-sql"] \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 62d4c053550b91381bbd28b1afc82d634bf73a8a..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 44733 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

Ca%uA05UTpm-fb`()QYj+OI z3P=Cz$3wzP{iK;C!SDITgeR7zMCo3A;J|@+Q9#1CRNqi||4j%jBmz~Zho@Yaa5Sf} zY+T9u`v519{G-7Az{}zeM(Qq8?wBXpj^Y6zr$HSnOI@H9KjB!KsVU3amMRONtKzeP zJVh|jK}^HmMrrGzqM<)0OiXXR!O!FF;mN7*ZHW=AvH3PBc}B&&z9rNP=!w7@bAw}) zm@Yeg^j7mC%k&RMTnI2Qh5rf-$Nvs$*L$`3)hKSmX|X=JS{_cqXo!|fZ?z{6iNV}p6iA+ z?)T4Pk>3_F-r+{R_^d){)q2;VLG*iJs3|oV#pa8^D(PfW!e7h z6@9ALcn&roA&-!3Q281cb`eI~AV#9w?3ioZi)ZN3<1*9-`cX!7!UrMDmS0uo=pZZH zW~XW_yvdM<$}V>FqYqiAUurd3{tej0nj8(~h`BpQ`$whJfxt4662HQs_?k@nur`Vw zaq!QOO8jPdEqi!+yd1ZgmGww5AXuz8y;LJRx6=#AU|@VCU|^*GKl}ih%j~k%>3XBD z33{M0Rk7k{Aah;e?xR{(pJDLMZR`nu@jGPr_q;sOUvkzr^MPl>^zUJLpd7G#{u3GkPG!Qc4qv(4svRG$Cb3G*+1c;H^y$kVHlp2WYsvdnYhktbxyM`gON zmQ15kpz4|N$m6cW<885zBFDe|vdl9N<}V=iSEkK(H-zs$>9T*%i-~7ra9gIOXO6G;_}aLsV~p4RNXx@K(UdW`sT*K}_!cv()kKZEv0 zBzOfjSTR<~HdwLcN*wYSM%9hR$CgGH2YB{jnKk~onF;rB=}y`{Ws~5dy^uu5nnpmp zqZPV_`^7)rb(5DEM$9tLbWSRrqDAs>+`gUBxtflsYih9@PHOK=>D)CvlE-y} zqYh#pp6OndTjj3Zll+=}`p1TJza<%Zr1!VsyjTDO5`&F=hrV={rCC}xtWwYJTRZ0Y zvcrmk8&28g8Od@UV`?C9DJo(a>p9@H(&nMmV1lIkCRCGE<*SL)?*0z?kRfD|i81q9 zm-0o$^J+&vjveB<76a?*ti}p}N)43X82RkIq0*UJ)ogBayHg*GUbL6YM1|B9brD_F z1uS&h715?~FLo2Q=$05ZF|;;za?(B};rNAv@Z$cAh?su{>*)m}ZkV->J_tN`Zd3RU zuHW{PV`K3-I9bbD8+&kE!m}f6d9vBE5i~!aC^c>KoRZb4Hrc9C#!)bOia?~tWJgzM zo8bMnVWK?Mx(T(Io7Ew+x;49~EEo&v+{u++XPG{_;V5BgF6Yl+@m)eEkKn9K97fy+ zvKNmVm$D>+yIV%Vew@0@AbKTk!)WQAypIOfRit?UmqJJ)(>v^J65ftVbhKf(tGwk|B0v z0^^QQRpF_m6h-!;^4UO+H*yjdjCD24$t7j;wVu(|E0zwd?>~^xd{A z1gUs2Bbb21qRTc{#6!N0CZFEOW=6iejJ-xGitlJ^BffDmk1moz?1jAC9o$A^a#T!7 z2^+sNnCHN>M*az_x-LyUi+cF*wicA+A!0Uw-Ym)tTH+|FQgVFZ3__4Lr-H*bY^Q#~ zrFFjdA()vgvr$9f73{YZ^G2#6$6YvEwKAGm zTiSjCNqXt*ed#Z{8m%}2@u}WO7X%o39-_{A4LMF*=!wFeP6q^n#^aJ9c_0fLOU4FXX2mey`9GYG%?OFfbpGXrhoKD0nQ& z_*x>${p+;kA&@*Qp($drH)(JtswM>rks=ttaFY?K#gGchd1CIM0yAB@AKE__eZq^d zG)h&h^_pM^`(G^L=g;sA|GYs6m){?LGI{IRcR`aKG7_RCa0Z6##t;7j*Cj}3xl=fN zy-QUZ#I83?HCD}oUKeG@ca&BpU8eI_J*;>GygAu8J3V^F7wlWdzPZX{XY?DF2NmW6 z9eDXsop7Tmiy8gg_1ott5ebCuY6S+cDM2l15APvVc+ur}?AIwc?7uDtPrL!l+;EAj8u z@{+^2+cghGor>kWA~CZGwu5T-#0WaH#7OqgpgZ;J1b6ZB8AuPEJJCdf0+_x^1X z>KPcqwcHb&HP)krgBvll%}u2G8F9t_h>*|DwWhO2C*}SlSY&p}r z8mj*h2ea6*J;!4k5WQ)5?v(tDAUozH%q0dc#2LEPpSlw}nTF z)zs$p8u$jAY1K}-i#B z!N4FI5eTcLqj`ZB*USBl&>?gi7V;g)ZfWiJ1?F5)5$mtAz@Nr7%t~7A-%ysQIR4@Oph$UZAb0l;1{a=FD_+LU?9I7&*9l8APv}rj&#Xm9oyjGQRYb_gtw)&%WDi5Q=8>u z_ZXM68s<3HTs?f^l)ZKB4pUdi!b({g@|i}4|HXltz5vjZvOcp9^hY{`fgg1md2@h1 zjARMyu(?8KHa`0p{>bzfx)8XB3$MWL!9HVcO*H3_I6fL}DK1I|=H^gGH^{Kwro>s= z=*yPzpTj=kHOD>yu(OUBPNvHdCi{mc~#MV$O+#zajP1o2E?S;Webx6ur}R z;(y-MXzZ{^<~y4&QP673LW_^YeQ(O57W5ZAGmUR6th9z>EokvL;n$U2FP6{fPWa@m z9y{n!x9d~+ot7yAi>YhfLSwLH$GU_7j0mwnz4m{B1+kp96m>0n_M@*W6;B>-O<$iAlDoQBb@TW z0Sm?-#l;k(-_+vrn_GzSfv*(r`wx~5F}v6LH`;9Oxx2k40S*z4UitK2Hwe%hli15k z*ehI`aW`uhb!%F>O?8vTH`?s2bUkgwSLPN5B`dgkkED8^yn2`VnMKd)8pJOSS)~#9 z9_g|4OlO-wy36XLmg;(2R8A!gfq$rrEXTcfpOku3fKgC&1as2HPd&q958D@&7Gn>_ z`f-&h_@z11$z!{j`MmFk+|s{O?5$1jRL`8&HcRlWzZFs8Ds0@mQ$TMZE1TT4Q_o$b zC${AiZK|p-DSbr%X$;CiL#GRLena`~yxlmDz&bKe`1k14F?%iyaoMxY>%gI?#SXZ$ z2f4CeQey9Nn8Aj`*LaF})DakADawW@#$T3g3j5Ebu!$T`DP`k)K;>(h?# zljt4+=U|elbI;JdH!2HR+ykPRNQYA9zfDCXp`Y@~3&iK(<7xl?^wf;*q^NzP(KKb= zEiR}q7K!LpsyRP=iY-R!WXw!F<9&}Z;v$~%=70J^>okGnx0~{T|6=O}W7c#-4@eOT zzrx^r*wo-fwA6&FQ?aQKE6_S)hwH7Jmxt>G*3Pp+8<}w@S>;@u9-B?HbvfdV(o?<% z`7EuOFHrER*UlTNh70k>L)0^l?0p79&v0=0&=W$hRK_$&A=L{&3Bx}D@{9BKBM`P{ zY&`d0u|97GoVWuCQGW)l~L~m5GKi6;pV9z3}6Oo8ZQ%p zOQ#e-cC}Mpm=J;Cu8U$%UiK zSxpt>i*oQ&Q72F!7$Un#7W4`H{4>th2M>c!NCt@@M9^n9cpZD>NWDPR^QBq}5l@;giyNxr<&+9gIrUa0;)g%!pG+GT zaq(WoK2uhqt5Ke-hi!a_rkU;OEM)658U4=PYvwTvo-5lY!kPI16P^c5K2KbF<*4*m z?1rcAP7JSH{RnyNvuN*h(z7p`w?mreNYs+UghaeOT(Qn7nuao(8Z3-INNJ-$(yIV4 zO3s83A1F#UB1y7O4`P8v41xwQ2!lN%MPrFM#7VWkXaTsW1d)j?t&cpuj`P~{_+V@P zn1adV*pGdEG+!|_$YxLUPc@CI-W|!45l4+~07L$AKqc$-}iZ4AOb-HMvg5u(idDbV@9h=>$SCIt83F|Hm z!_`Z?tle06TOZB_SNm=JX{@~=#Lf7t>gL?3(KAI5-Cr!<{IkFV(~aJlC+gpw zu_%@g5bl4wN~so4n5i0BtN%@Xe?Q^2NMv9C`0q&ajN2k#SPk)iw70X(xwtD}!N3r) zz`*GKX9BDQjtBI{7{mOA$!o1xAuB?^wh=NHp;ir}{Sj+L3M=bOA_76?9CX|&1LM_h z=9HMiBdA0rqql{(#zBPdhxU)jy5(S++DGh4t+lLTGW}x?ewjE+KWr% z^SMtCrWFkhmtSPYo?j(4(sFcX&%0H($4f^?(Frl9c?T4Lo_jrn4(w4uo2~IiHM$y; z|Mad3@zYqA8`U#Nie*;6ckK}ypx2yspJ-6Kx80&Qy-gjmJG#@ud_DAlGrAqa|MV__ z3+ATvZixx^j*Wr#t_f+c(qRC<8H0o)dOEzO8}yEh@j5VkxZHO2P9)g59Fr7gs;V6R zIQsme69NVySC5hiPNPN3jg(gldAkK^}P`Q`& zuZAlawZ;%2;}xbSmHj3VVvc04d?V{CJ(zln32CTaOK5xxoE1>aWx6;Uj}NiXE#5W_8KQvAO@>UyntSIGU{dg z^pPr)j8sOrI~t4k9!b z<1X&Mx-e5885XRON7W$Y$;vtBIZV#KTuRR4%8(IpwbUco1@~q>FPbRgA1L4GS=jw6 zmw^`2U5$Q+|sj#oJl2b6iN7xj*8Krh&NdNmb zeClL1SaT5B*>a-83a&H9Z(rY`RI=GpDWl6c>ge|rof=GXp>?|zKY;0tfl$R+Bd>4{ zPe~V(mkQbwua?v#8{L!bj5iWSa!1b>m4MiG#Oc=@=&dbejz|bHmZ!dwqz4SH#)=t> zfvZvF4ym89J#WYuuCndz1@UQQDg?6| zwPNpV<>B&cpDtEq%Z!<*vO|s=?d`F4A+9IbD1Nh)4qx`OL=RyPXbzd{cz@KZxPXUm zT`4ZrDDOwO&Rd|lT*Ety~i zNaQH4M+G*=i!Z#FV(B6D$vVEGfKl2h5Vnf{bjDLT>sjx*-x!vKyH7mKTXH>v; z_$TQW?r**&gxuP`5%nqOt3w=DECN}FuynqF1pJ7?{m7i3KZUjK&=C_4DyEC?#h0rp ze&9+V3J=X;eu@n--_s+q3P=v2C;@naE9l0I}FH(+qh)(xCv1e6|(-(_= z(?9Lu{BztUvX?E3gK8N~@&BDUL=1HynAP5_Rc5bL`a8?HUKBW70M+^_Pz;p4nZ-Oj zRvP@)9Wdtj!~`zgdEssW_i`eD2Y6FMdDHNA$s(Eq8NmHr*IjeC?~;9&PwgTS(qRnA zG{7MBB&KQ+tmIp^GB=Ot)3UeHl_K@E&fqvBnz4qhSi0U@g1V2Q2CSlqTTQ+~j%Vd= zVKQt43r6~>W7IbsA$Oh1Dv+9V^?lxDN+GP+UUuv$4Yk_%SGBQfQsnlS5{{}qy1HZ= zhIUC5Ag2-&Tyhy;#2|B0l=G-RIsJK<2KZ97_}ROg{svA{LO0lbvVJ?{gpmGr+zD@Mc5FJ*;)%!VbTDN_S%PWScwQb;d7=u=lS zKF5B^Ya%+TV%=_9h!rxup7p4rOg%h`4T-TX*fPRyO9=U+JZhle3AVMm%7~BGj=`b7*G^BwqoB_t;O;S(8|abHTgq{-eb?UOf}_sF%kaUY z#WRfZ;QG0j{Ri0Cyerx zZY*VKtXo)JF^4_x%a)ZR`pnZQl~N)55UjfFYF*eVpu_aK3LOxStKd|RGZ1G*S(&8A z8k2324NM=nLI@G9p9Z|Zd`(HSXe*s?YBS*vd|GiN@B#KN{xg#LADX(#V*$~QtxI-`fv zfoR=Cq%6*UGb;7VI*!Q%zP@n9WjpDTh+r^J33w&-F2JYYr9~D>{+S~Nn;GSfW103y z;!Z&Rhlm1IQrIvs&EQ7@JHd}Up&(J3G!K}Dgh<@6$K?YkCA4dZ=UDOqX9_}I2&&)j zFXK|Ya<#OJY<#X5`+cJ#Lo9gGjcG#DDH$ipql9XTBS8+8;xHNW{(xl#Y&fj+phu5o zR-jxub6;(L+j?uY*=I)QKPD{7KM6fY)vliqVr#rn84SA&()$P*k4}<>w2f?``jJi5 zIQ9Io$>w^=Uu?B{n`ZnxdVc>+fq&Idy2pr^XkqT z(xCWYUCj3_~2>;(01&(;}P%qc%gc=UpZ6357tPtx8j)?-2zN?!I*1_hN4Q-E1HDa34x9ahF>Oh^7R$} zkpD;irTRVNrXrWj{~scc*B;|Q>p#a|1R59^+5d>V#uu1WgqNSdJRKi@3@^-o-_2tT zso;w$V%RphdiHM2`*dMLVq&ZgXe6XzP^EcSNV%jf?3Y&z!M-XEb<(|;>AnRzl4Wc5 zVhf`mB6ht_3tDy3f|tZE>XHFYR^02`4798TbKkRGUppUtuOEuDU#CTp;I)IoC#H}L zjwxF`N%*&>(-S0I*d7Hb zZll?myhmqjqk)oc%O11_vlQ(qZ^Rqe{WgWaT_{F#%{wHA@!seSJ)H!v2aF1DTKRo- z1gbr~1gt%wxeF*ahsR!%-q<^g=1FxjdxBd%+Jhfr-oT$g;-CAWr2aBe=t9%@#HIjh z3V)4JzAfe@SYfLDLo_A1w=j_r)D<059n}?_`Bd)n2&%@y!$x0;_%p4rQ+(*jY^w5# zUtHT*I%&D-FbCl&i_suv3#V@McE`1kagXNU7i*oK|kWsT-%zpBT``V7k1s|8Sw&v1G zb0U;)mgaV~Nbc3=tp9}1Q?bq9zoaC#EnjK#gZ`}3itFiX6z6WMcQ;dMd94g3h@3=1 znlf5h^~pDUdZdL;^IW31kI0b&aP-<{q}JM$i+{)h(Il&i%RxLHF*nI=NPq=X*aCM; z*&W5fiPxT^x5X$W* zk#sx|$*Wp6Q*y9^;#bNYm@dDiuiPLYc*M22$9SQ4`?)Cviud%rH3r&QY4`cz z`eJWkp>k5HuW8)P&N zc~?irEtK>C=FzzR^p+5*y}$Ab3kJaXma^DMPg6dXg=`}mFAh3`jJ(GbJJtNm3?l>D zA}(9I>cf-z{)m)xkVX72)dGJ`1B%lzPV3CcikAnGVxP>M`Ir{xzg#BkRO!j1IcSz% zqiR?u!#J)CPO^I&Ick=_I|4H=t3U+v25wc3(9dbsr((@+mnM^JiwPikj|kv6t1U-$ z*;%okthT2AthUNN>xoKsi*2s1!;rl#JnuUP?~dlQK3_(ePpo-%ivK zH*{01(#iZg2WPVNv+Zh+&uk7nX;Wnwl9*bG^^biY7ur&lpiovO8jNX6%4OwUZM0p@ zUXW6|i{d_H5$Me!jej-A+5>2Fj^m|s-vPf0;cU&EwcbzISIH6+W;#-#s6SQikkbvg z=8d%Pk;%*T)S=U~EQ$4Xe zhbd8<9I>pC>6vDmyX)Tl3!J+VJl>7fq|p7HNt3YGH{~DEq~GF9*dL%T$nuqPEhX_y zp4NvK8eeB%^xp^Wbxbj&M+yU{60DYxVd=?*WFL7CeT6*!KBdM|rV{+P5EMP#8!eQ| zZ_3T3(DCbY#iN%e23J2{?gj4R#6bQ#{{zR01+YmHRiL5a7mkGC5YFTU-q>CZ{Kwc{ z13b(qN+mqZ7)mXE2b;y+g?a zBiF~hxA4@ml2WI%G$Ji5)LmgNr?%MH8KNzK`kOyHonX9>Db#mWT6n{L+%e6^7GHS} zlp&IQ_A~m4!2-CSPTyO_%2R=p5 z80;>2*u!DiEkEowHSBH$>~LsPz z(X>Q*D^c)(z;}dvje54kSRfeu9^)kzco5VPq;IG|9HQ_y)0F!KB}7?G={dzyc%pvH z2oG9zG4Ltb0bI%h>x1*aW#pO!sPNsThs9Uo^#)2(kVM3;>By z{QBZZt_-YfT|{_?c#-`ndlvWu{$y9ilUHnT51JtZB^|}@M_nW(#}_=zcl=LPQF1O} zSU!!W^hKtdGD0#(ybxEO(B}#{tA+zq3uP9{hz-(AqcPKV;)wklN|WMLsq|J5_>M7m z-HXUK@&C4^{%7f64IzcX|39-6?hh~sFvkCtBL*+%!1T2Lu{=fW0@@9`w#66&Ns9gD z_38BCa!^KaWaFqLnOPL?9Cad^8^6XKYre^yI_4#c7l!4TKUGKBTjcfS5IGd*rq}ac zd2iRVw}pYgPY9Jka!8jWOC2Q@n(;f4a(ccPR|C!@5!o@kP}S$RK6)cA+Yr-M|KVM? zDF9H1nLt~h93E!NWix*bt8cERl?=Vs*{9d`x>caUs7%whBWA!~^HqP#qa7(cpmwqA z4rFliF=)LuZKQEJiP&HZO;w9bjzk;P$*n+qLlovvbXbRc>M zv)U|=Nw4^R<-|Cy@%HC9%HsatwXy&0mzSnQExNa#(aAoD8u>hx^?lgNf=A$64$Hgp>sdit5R4t90j+t}R!8-amkivLdg zvL`5fe!hLYg@5dHzizqBJqVxX`<+Jq>%7H5W!(P_17JRtS0|YP;w~yAmpc>WR4rmm zoVJpryUHA%6CD%?;FOZgB{gL)PQyLe3#sQgC!OAHkr3{+lxA1BxFnU|`4<@%y2u8} zhq_~D0t|>s&kayZyF1l@7?3(knZT> zYb?Dzl6I!-N*{j#!5Y#}J4FLw{y=qTNnJ?%^$^n`E+sP}-g`Xi6g`X}sXL0tDf5N^A_D)l04mL`u&b@ z)2%F%%n6X4$;P++CwM?Sv~=s>N)wN2sFl)(J0u>_n%x~v0==_-Wj+m~xA1Clxurh8 zQ36E{r#SiqWHRQB28q*PiP0>D2}-$#5e*l62DEKHQR5pd7V!^cH>0F3yQV>c7wnFD z9;)Qo9H|PxB9G@wI}o>Hx3i)6Bd89sZL^)z-m%MBeg=f70R5jYI}=Y+m3&8c#a=(z z`_#4^)&q7QyWIXV<*Rd6YlLRhuHFzWciur2eD984YHF-uSLlR(rVV#C6{pmJl{($3t==XA zLJSO=gOq!uspJv=_IX=3+1-}HpL9ZF@xLaymUy5}rj*uftxnsgb%!Z-F@2iGMl7hZSmq zAyRbFUS1cqyTKNH9@eHl);&iSzej)&B6RSo8u9)nEk0d=oN8fp1LhVVG{Av$MF^W! z9-myTB}%!~`3;AFQVG9t616y`(r`nNE)k<~5V$=o`ky?kL#PC7 z4|0;t8Vu|1$0Ao0A{)@?X=e?M*tD8b=@Q0Q%@UUOph{+xa8;qxT_z+ZZP_(N;<){~ zXSg=)waJ4kLuD)RJjc}QFN8$lWvGGIM6%Tj>q24iqRbw7Jl zDTMFN9VN-;SWmF%NdcW)n9+Q{8lx9+&0#Hu2~d%8TU5LGE`gjSqzROD8r;CRe0jD3 za5Y0REcSyaVL}O5dO{C8WB6356n=6Sd-M4fb+s;dTgnv02rwsuZd^{vZ9S$J@S+Tb zs%vPq1N!+@Xb%STej)RA{ro$y8@w+(CZ&;Aslxm0dY6n#@B-ZSy1rWUv|!dYINe$! zDT=xQ$aMnJffUnb-U?&3l15<6&*m7{td%i!R`%QtK{*DeZrYDn5O*qF>}dUsNQ!XL zJvI0WNW#llsoYFY=OAZb%hIjzM~e?emVhd&>AXsLUc1c#S-H}mI;IxpZy;4o&yM6G zLx$BvBgT{j+$$nCdH5yWIv?$jO(%<<+uu0X%Swa>OzKmQMf=qKHZ`EPWA~a_(Vl6;L$e|si9d;OE+LcW*o8N9-tMAod@d5BDB}S-HDD?fbLTnclV7W`g88} z9Ip=vzCde*F17y8IbD}t1wEi(l>6+H zcBkR7;$13Un4B2Ky$=}ewEEuS&u%;3F7jb!`of#%w69+zRv!`ddVCRg4@vbPTL7^@f5J*z!uS6^8R3J_ z_mM0f8rNeTcsH<(ewAJ7N70$vf&fOubm{ z>c_LN&&9cA+7Il!c8fV2xyK6HOsBGX3h$1SpK-1Mj1GZNFEhwUw$Pipv9QKg&iiA+ zubGCV%pG-8nK&mNWf#(}pY%-yjOr5vxw)k1E1fuRtXfj~{yN+pPF_K< zeFC!Hvkt2AwlOVXw5w_4ft6k{0c?^gatF2?B~>82a$aPvsWa0O`mnOOVrWi_P3595 zSH#{dJgvL#-0OpPR`cWrXqr}hXli!upyg5A*DurQcRY)@7HunPfB8Y5b1zc2;{9pK z7=-rJ4nl?D?yg1}gzb}1moMn$spe_&bUXs*Pfiw(rMNWT=2EKrMrtFkOkKjU>K@Zu)BLob=>zK6 zzPK5T@I61~apSJTU;6G%uwqU9U1z+qLx;sDHF0+mBVDz}&tN3VqBu4xNscL@Y2?B? z%f1ezXD6W44ag{+ODh>yHpKqz1ABow;X=s-N{dA}{T`f9;;fsH;IPa^yDcd{8jW4Q zwD@#!1+?vS#!SLMja8z`)=w>i8i5rHND_G-4}Rhdthj^Axc3qSZGh!uE8FO)@aUL` zQXReF8IR?=>!ek43HxQjH3SX&6N`u9Ur?M6SROea$6>WzqjxHQGvs|C(c0oK=pDkF&VFt$(v`o0SLkv%seF@G5hsAzoUQ}aHxCV5BO{VIPk;|KblQJV|M*ddG&aC&#>%?cFsGv>CyG6Rcg1BfjcF4F zB*7icg5N^Bf*0j$FA6>P#MF;IBFr0!6H9)u`Wqr483~-GBhGg;i^730;^r!(f5-@n zp-)aGCTVH8gne43OWPcnwhfLgC{YV<{I?rfPV0_kktN+yh2!*it_O@u;}tkZf08A8 zrebUIMX!2T&K*A%z4dSx^p(gd!Jt5#Ydikp0HEhgC|bVGOY|IR`-$%a(pA1p9LCuS z|D_K54CN>*V>m*7r<bk>@h?96a1 zR2C&8t}Fg}0yx7ivH`nLU!F}IaRVY8Bdpj9Pp!}03UlPy&#`*m&$Xss%uXD#LJvDi zkay$zz@%QV75L?f6hk?B%lw0^IDE9cAE}qxAy)dtoc=Ga-myKisN2?!ZQHh;if!Ar zjVHG4RBW?iqhdR$*tSphTKii2yz9ff=J)|)j^0O`cWZsShOLR^;Jhr8wkvd7C+tfb z`OXWb;GjBKq_^^-Yz|0PwAXn=Wzu0jCXsY7LOZ^1^`$>G=uwkY23qG_f z^s9uBOWLKXC1F{?!pouPmU!nt?32yGVvJI6n78iczQ2Id^v|n@@R*b zw2Fys0EXY7sE&56u2{qs($v22{si~m-td{tX|^ln3$$i>A_rKjf9#XBYVn*N&ejyp zmdFFelz!b@VjqBta0e&!m1}CH{7Np1X(08JEg|d($@2{$`o-coyQ1pFNN>m^r~)J1 z^{iqQT~_!?m5N_-$IGl7IO#$gMk9gfbyX7T1r`C56|cPXEYxg?mIz1JqcTp^lcBIb z>ksB_03G{G{I3=QsjgrNiyskV3(iM31gS&)w2EwUy;`I{Wobicl>5h#LY|#yOYqwxKrwYTiz%(PEJ7n-mn|l+zW_@%lwr%4NYQ6?UyXO89Hcl z@wyH*amNFNHe55qhE~0<3QQVjo9A3Z;h$lRwM~%4sDY&(A?-DkJNVf(M7-&}nK>_k zw9dp4(v#A@S>g_<0(0s-3sBaUzOfb>)6W-#`L+T;KH?(nDX(YpgGzdf2tI$Ya&ebb z`%y*Pb!Gjp>LjXfSU4B<4+8!iH{ZOd-Pqt}7$psQE2~Ff?cmWY3d`v zo(-!wussw?s2OfSZ!yWv^yQ;OR9{B*8277{{%<5We@L`X2szLIOwfTUB5nF@PM{F% zV}??IFFFJcRr=iXDKZt%cw>~kEH7U`=H5|PwM%Z^`y44uda?zSlY}p#O&oCL+K^nZ>c(Dg{+Tu( z`1!xbAnzBvT7w-v!DDVOU(h=)XT?EaZ2?IDt`5ZM2ga*C-fub3Mb+4@9_-d_5Zt%- z(_H$c!0-yHVsu+KV{$ahtFoiqv3TP>J2^OgS+h!fJk~_pSKcdn_sfFtA>L z+){uRygr{&CP6psWnF2VQ!7QEhV9n}l{ai(7kJD3g8U)}0ls%Q{;Iw& zMGR2Hih6M&Sh!E&z;2{+ZwA;WZx}E@SiL>bzRAaum1@=8J&xUCg5n9+lz2W+f3}S1 z&u2}>OBvGt1n$kOC+fN@V{Gjm=#-*;UD)bx?Lf!K^j<-F9er?5aEJGI#61w@89U<3 zCF6$${Ny%^sXz#C#^I4GPFJ0b8Uq&g&Z9s%7{8`HRf``$O1f50t76iLkT?cV%&cpn zuOb|$Pz$P0YJ-R(BxtlQXOA6oyM{s%zo1B_!$-4e3_r`%e@tk;pbsrq-3&7(ngc>> zuF$oG0b}BZ%;oyS8JHl`DjO+~E=R$4E7F0fS_0L@J5&M@AgE*a4q4@M4qnUIhDnsY zm?bhHW%cc%^N+!c?FCExHu%CfGDas*=TiO&yQeRUb&P-s zy_D~YMXVqHCwupT9wIi_!^-YN0W1m8H$p|%Uvvno@6vIc?l>-9c{QBjumtrMyqpQB z4tDQgMLImMqdgoON2m0#y<$&>}!nX>m>0v0oj)7pht zPdy@9g;;9SHr6v9)^vzOI-=iYXSIVgBX@B!cCIr{GzUfnl#qabHTzZt=gcy6HL0m4 z4v26X%l<7xaOA?P#DT&1$ZT&4>)1GW^kx$77P)waK?}J+wIu4Qzs6^-s@=l-jAF;V zE}Swi1X{-R1t&6fbLBPt)h7SUxT7QqRHg3B!T5gMbi)!}7c3m0{&TWobqI7LqlYjw z&oSW(*W>0cs}xj9Qvu4!X`}$+Tc%%vh@&Ba)NlVvJ z#wO#9D*$dWu06mBtPVPEGl|((0 zlbM;UF6PgdpNHszz!O@{x_>DK9sl$@coFUY6AUvh)1Z+W zPS{ROlzqZVbNQ6}wEWEJrygPNXHrf}^^aT(tr6iJpFkLl10(Qh1TE(Le&wJ3slL~&*dgH!VTSucBohgY!?2%ClX z*CR7fIm(&ae0$buT9l~!jU2epUQ<~J`_V(LlXXlSEQSc`$X~qMp=nI@VL$-QOe0LN z6b#sx7Ewio;4L$7I;^wOEK!i1o6){$fr#>@kLZFIe`_>_gw|6Gm-8q4hD+Ny>HF*8 zZYY3LX<><=CDkg_Yy(F+gk+}P!8TwL5c%L~PSQPFxH{_TASbB5qWns!iI_jQKv6L% zShq2YJH~WNyY?mD^BrnyG`~t6leALClR-$Tm-*jN$NxBen~z;RIe(%k5)puaDE>>5 zCYZng0C1Pk`AuYSy!iABSD`uF6>|hlrCPIquId$)O6(`<<`Uw%Jd`E*=wx}&jT`!}-rY$IRV zLxMfk2Pki(p!1DGmH046%E%G9Z*B@B7$aVcu?&(N(F_pw zX{$ff2!2Q*1B+8!5`CEcY&w717>Dp%eCVCw=Zv8mrXIo(#Fra-WJXvnCX<6yW$h+_ zt;z&Dck*ZV!-4cr9%fP_v!{o#I-QL5%`tYBNhxNUAVe_Y;fU!xn!;T~x zYH#KiNg(gr>VR5mkv3bgHjR{|BAAmrgA5;6Z|e&G%1%p~(4-FAiX*Y2NgRS0^J0QI zX&Rvr3O2o_8EDJ+*jgwkS!{6S^UOJbtJ^a5v8s#Ic&cja%z*})%6>~PcKr&wF+Yn* z#&C)SjoY9q2Zt&vd)?~!@pu)BRhH?AplzL1>#~aKW%sRSbjyJEX7>07t@a!<`Z7Q7 zTdjJ0FX=zLrVo2GV0t5M95ke9>NK7zN1{RSpvNKk1*S3h1)azb$Qs|%q*h{pA;Z)3 zMK_{=j;X%uC1Um=)mK59SLvtkAQ+kBv$c!(FZtHSujKx1l z!}LJux6byY@%)@L_)^NP%JM6=zr2vt_zQR)#f=Phukoo`7s zY?XjPAaFZj@e?6hYm zE3W$xx0iNYtm&PVN0PrWevNQEPgjMHQVEGwi|RHpBHliC;lWIxoBWDf_vQc4mvyY$~`O6 zEvz#DNIr~}@|{uuNlPKeYR_wPGCr`r6OBuam_uF*zhl;P-jTElIH#%jw*%ba{snWv z0}~di;qEnm-PF1z`7g3cAuJHIDB{e_o%v^hX9eHlgskW;#m`dB!NHLRka}j2t*H!n z$<9v#sr>3AEgtVc0Ubhh_+1k?FV`GERe&c3DXv>AlGhp!7(!VvMzNB8&u~a4Pdv)L z6-B>f2Wz}Fh3{W`(JTy`&FteCQv0IS6&d9yUc%wABG;HhKP@#P5)?t_XMf0pzB(aT zEy7(ZI+q?FDVXIzs6_yS6lQ-=JKKgM5jBDPP`oMtA`}lQOce*OrC(?}V-quvdLS%<0)v(qfs-PhFTTzogpF1Q&QchPG<>&v z&~Pdb8*G9%;CnM6_>@+GQAnCoVd!p$R4MZqC?RP_K{fOCFj_8I88M*A@2hf+Q;3te z>WB@b!^X>zOKRzCV{XPFQXXW-JLT6O=1;xgh^rL`h*N2dUbT-&P@gId*o0j3#U`JS zwfRu*lBV35nC8Cn3lc-k-G3Kp620f56^hZ#t(lN9nhZahcTM}_#dlr^h&w|G%aifi zeL&o38I&aJ`uaseDRn*<6r>}|s-j$qsBLOEUBkLWwde7RM`jb#YPlxvAa;_U=hf(( z50b9{vLtcRZ^5+gF25l49{BblBOIQ+c*Zk=(aKQQ$jXkkT?S40w4@Lq^J+-{76 zAiS{21k8Rq&!1>GXHuPDH;7=(!39&&2!ASj=5g2V44KY}63_tvGIF8`&%^5NX_qJy zUb`y^N*#$4?C#6CWfd8Tl*iIU8!3xB?moLjF-;DCZ#4_q*054hxL7FnS3x`5OgcV z-C`IR5@<;^S#%L_l$`|noI}Y!Nu5;`{xouA6g@YfF9k8I9g=eKXI_IN2UK5?LF+{G&AUB zl?#eoA=OzdBX2EgHPZ=Wst4APelucyUM+X+XRXU-eK%s)9L%%*_5Cu!GoE&|DIJ%q zFT|nthK;sdJYlo#dGx4)yzR_->_>F#`#8YLoll-FBHMnw|E(n1LfY*0!pguNhe7X( zcsYlShDZC$cJt8Y?`!3e@Tqm3wX3VfT?`d3$)mg8OTSZlm>;wHQT1DoU(C$$?o#i%wqBjubL;t1P4`N+LlpqR z)G(tzL%3u24cMUtt9Y8_A@vo))Mzz;FB2q_SQ0m(h+5_QRgGwLnADad?&1@O;-)TX z;9CRl&5}giF9hSQ`i6V=egIQAA4L3Ef;Xs2Z<6(ab1J`Y()OErXwvort(i$a#Ocn5 zicm}^1i0BN!l-yZ0nR*{DNI1{w<7>aHyrl_TfA+E0>ir!K0`q8+x-_E0~qFBpv$ct z7UmxM#Z{5L%NyDQEE@l${O==qt^zE#NNBXV?%5I4RVQ>ZieOn9p{oIYbV*qV>Y|Yg zU|~cNTm>2-Hf&RIXlDcX!f_&(@`?wbahL>Z^0D7=EOlVi6+#eZ31W+Mk3b6J&RI8bKM>2_bNeQCTenL|(uwHDFSIiPXr)K-ndgA=U(^vI&U5fmu+k&A}#?>*uo)?1SHtPfkDw0uV(Bm zi?rBA5Z7?aSiB1^QBrp*MIl`A55~EWdCEjx_^eC%?SFJ@#R%_b|O4$@TrX zL+a|^W>^PdSxUY9^L{QqW9{XJygh#p>Zm36QG)f=nS!;zHEte}^iyW*dwIFJX1AEx zR=0LIS=eS-ldw({T;bsmWT2k$R^+WOvFUlY^P1^Nd3$sQKIB=m+ghsqBqz{Zp<~T} z@ZXd42tu5Vjd%VDAv$?sGkZDijHTIaNF<4Lqom=V%EypFzC(5ZXps3+V7SOFGP$=J z;rSVjDvG@OIan?u_qZ#1e-F9!jU{}+;>i!%9`idb7EfMeFf$m5#9PI-#p`JE6t(3y zHsfvC2wY6&29+6FwHle9DsN?2CFbmV|J`=bWXoDk38|TLzS$sl&s|ml?+`Z(lxLO8 zqQ78n^foYZR&9d-v?wjJZ<>@gPZCeDcwQ4UZq@4EQJ?ODP|(2T<~O%2M(WcaZ&$6E zn8N$ig*>8bzjfLV5<{ctRXvl5t(>Ohx$q;^Q^Gm>PUL2`vss*SPt8B$dP!H$fds>8 zg@uUC!N&zu+qWUYySfP8nfFVl3ab@TiGkm-9F2*}tjvP|=J6U?T!~GrPeUl_g~iiQ zv{oph-4o`v)^z*b<2)u_!eY`*yJW8jSM2J%i*a*P!1aas-o8yEt6>oneh^U!2L=X# zVta;G*^%^Rqb!covO{n7R+%Q-Efgmh%VjPtonzAA6ec`LXt_32Dx>jo#4q~40~+Ws z34`vlIb_*@N=_hxrr5Sw z2=yD@4GxdahQ%vYxV>z$^}3GCCwhV~RbSklf)PDHqu1|*mRPB7O=}cwy<8IVn=veE zRIOf)-d{-^R@v;A5&l_~7Nn_i&{cpG-qfh;Js-MD9QJ(PY6A4S!E-gdJ{vVW(KeV^ zH~yd^n%ez$GO|nRB?S7qsuy5=rNmJwbOBQ-Gd$?2JjGkmqZek>^X{R85OGGOMy85A zN`w)B6}o^K$0IRmdNI{WTu46iG`XyEQVP`K_aHQ zj+)asILRnfqu@Ywd0F1)L-}|idBT^A%P6xf=ecTV<61~lRjV3h`K8CfY%9py+%07k zC$ZV9p`@d>;Mi5U>C-2)t&=D6a>xDblLvoXJEP9m5JO_Zfa|ET$}^1XzC5a^r|=AL z=RcW>lvBic&r>!*>lxi5So}dR1+&Fte1PX9z1`_Vh0reJ#L=+PwqslzifIi^k(o97 z3Z5}@4duscYF7q|A%HEtx+1@2q4^I*{8oL z(YZ2P3zKcxJJVz!{*Ex?4}QtZ|E|`&bG^p7&@<6w5Y5zPqaFUoBs$ZZYwBLg9nm|o zDc(J|ya0Wc3DU|FL2aZ8gIpDl(&PX>LEVj}G+5u^{1&ay*5+{Pu zyu1o0JY)QdXB|E${f~SSw>FNvPB3@)ql%7BouNp3OjD2*i8O{QYxXE{=`1S|txFkI z?!k~pxa9p*I6%JCq)Ah-4;I>U&WtXuMPHl?qc^65%gTj7VMM3SQ0f9j$y`YwxWpJ+ ze`EnJZKlu&B6fNW=D1oar^Xd9t` zH7YM_j7czT-_e_n^z@JKY8V#nJH*i_;7P^_Dm+xC>~w^QNc}=ms+tQRQW+wXUU((| zrYzT=tVF)htDaTl`nQfR_NOIcs%HcA&CgD6ogHb8Sp?wt%=?xK)-M zBw@)7X(#-Eo|C;pjT0SleuUX$;0xeP(yx|-ny<1<8^7Y5V-PGO9rCL#9|zroBLUmJ zDaE$!K_JK2W{ai|KXwE>*K6A64!8cDJR?VcQWpBA)S&t&|M}a zan(6B=c?mkifINblJpW$ogv6V$cxPOQM!H;zX+z-r6+ePOL_OOlY!79-a}tPGNLh(TAQHNvFt#0!Ozd zGD_)bg$(qy3|(0yU{5Bb+p-qGiKZ}>24b2cnTGUEx%A#5tU^|kZCRqEot!5ejk`cA zU$L$FyXm9+1okv%^9N@nyYxZdyWb%H2{td9MZ*&QAkO$d4=GUcza#SGDOgnG0~(qs z+VM%bmP3&LNo1G&zj5paaM(Yq-^bWZNpMaeKg;i*B|c(07%)sz3u-Fx&r1f~;OCW0 zaEhJGsfU=1zzv&ha0=ISh5_+^Ed955X9)jKxg|q4_enm*R|4?Y(<>?>T}Pl7&^Lo4 z*9QovMx((9N!{$U>YWR(k#C6kg69ut^oa&b8-JADX2v*8+Xou!v|^!r=S)oIIP`Gy zvikUcechq=5vh~0khfOPL+ejF~>pT?W1&Mq!8^AkCMhw zL&U#I(}NYlZ2_dV#>AY%a;9h#W%Xmp9%|^dCMeY8w9;aOjEBa(b(d6Kl8jnc);=6y zWpd~nqMvJ++flvMjVzIaN^)zOjro!nypo#9A7gS1lHt`ZqJ`UjPdGZAl~iD{Rw^-R zc+87QLhN*vQj3!?V#2^^#d0~rsSXryb!VDPz-XutKm$aQYiqI^jY?bP)K<7q;A)=M z-NmGn>-8TfI1g5w$rx?^j8$5dYcuFGoVu9nhsoicnUYd6)WXI0+Dh zY_}op+@}^vUsz&_;YRVQwX^;a_lOC3sw#Zjqilj!Nyrdl1H&pspo1yBZ#_HQ@l-KO7#(f%j&59b#Cy_Ooy zmBBKujI#=f?k>%BMQfOFej&72FxN#_{Fi!`Wer*KZdsy@)-MM@rli^)Api6GF2NQp zN{%HK0{r)-|J#SY+nK((oamPZSRk!qKorS{=nXL$x?F;|r%_|G1$XyV=4HVP@&`jt zf++di5aPdZmTCPN=lLX1ldOyB$>}e1a}WFX`;|6AAakdUfH);ks~ERrw%Q^~qDU!F zm3mj%^9-Xg)h_ScXzOugjzPuoWcDfwuO&cBP1L!j!XMk!r4qk<@UTUE39c`_u*3$> z=UWyL=kY2OzA`x4jYm11U;Eh%TJkAfFdh@SJkp4^4j3apm+e4om>D z_Uej*bqs88K4hVj46_rPzfc`iiuNHg_dyxW5reA*z8&vFW zZwnJ$bxkyX4d9QOSOoo=buV2K)Z_F`p@$o(Y@?@r5|MZu7R;VWsbq?VYqW096XS%# z=fpZPIknkqx!I0H(BSl3O^RYJ+cyVbv@y*vc~wK0W^hffu}%{7vY*_?3aEw6wc_$$ z^uRdz!x8eZzX2>WED67CI_#WI?+=&Gg7FRRSUlP;Mf3w$U>1Rv3)^k#q3 z;!DDtC5o-sEM!|Dr|A5JjMG)&yV;&dgn09dqH6{XamNzvexJti$%6zI*T(?-%Vr6M zk1f^pwf9V-Q%P`FqoG7>nAsY05U_%|Fj)u|5TfEXJ;+v~k1WVk!}RhIfM|j1XI<@p zU5FK>j-}=$dje#Ly_u`m6c_h2iYNUl3)ELJ<|iYIt((WhlXEme4G_GZ$0ddpGKcx= zw?MIL#aLupxTxX4M@x%ou@JaeaG>4wOR_;^J1BEUe%FC$$@0j0Ot)=q_4P|gZ9RGo>D1XqJI!&QofNcHrcCIGD-T8xR{#| zInK%GOXUqEadZnkAn|=VDcBikEVEz1yZD}HSWlAn#w+p%Ou4%=e=gRV-Y?7et3L1Z z4g5iw!oykQO>V*9Wmv-M#}bo?jkLru(g)jvs_+P-reH=Z6+0 z^ZFdJgMS7bUFHow-QYF4whGg;*G&_atL<`kQ;=-gtj)H1%F?RHB9G|hYV0dpiJ#;O z$o{dw)tn*H>+~9}0^G`0sW|OesM_RI+Eyy9yK9rz3mL~eHAK*?GR4`=d%JZxc-Dtj3NMT*tsR^~4M4TD0$e2gF8p=lNCu~I$7#Qj z%(pgS`Erp5tFex-_PRGs5~9@ym#Hj7g%LbXWMQw+bA}^=jB<9{M-zTwlbF(I&K{MFf)!uH zYp=ieOO7$tVNropaCRV-*63SCTstre6Db-VI%1GefHbh6TYV&3C#3vc4)@;kk-xZ9 z{59a68uFxdqy^6M69PN?lgyqJoRgOkHxFI?agl)nrKm#0iq6?#Lg3PrzLw`%+FLM{}bXNamO~4C7&^ zF%QhrfY#mG^0cIwUC!0Xx@nj=({Nw;>h-6S|27t$VgJPTVM0gZQgqo!gh9`4r zNV%MB)?$2d$a4Yy*+2L6N&85^@ONJ{W5$c2?-L>R?f&!?M6j66p2+d^CinBEkGzEd z;QI!-kAefXUWwXpl8$?meS#lXhN9cH$lPRjgoe1c#24KTm1SZ{Pq-D?mE5SX#P`*A zb|=|e0&wA#L){h>cjF$aew0JeG)Ie$a)e8gA}5gIUrypiwvnjrUx)mF7>c3v8(Mzh zxy0U+1dbe&&kDTb_^J8Cd;Ze%ubHjEi{8Rx$!x)5DsqZj&{m`Z-^jf4xgZ|&3abB% zT*Bk-Pv9_nzfmy=VDJPRBuCGov9Wf2hZ5;W+uuk$>GG#QP?5iIlaPutiOezxCJMpI@+g)Pzpx)+aFU{8MmA+rsAg{;<; zJr1i=8B6Wm^d2^z?x5RIrW^&&;oiK-l@WmS@;l&~1uwcKRbi~=?i%cMzc+%4;!@fW z@<=%;9Is{(xMMXi6U>pr2H~e5KV#Dky=-X4?BnZ39=EMt(RgGI%Yib+euDjH7v+1Q zJUt8XLoXmF?+Q^Sx1ZwyrZi7IP=DrWbaPA)nL#v zz>Oy$6tlXS&j;aNbw)%G>>t;5W zBnN!lKehpB--gC`Z;}@Qd&sm)h*NW54#f zUQ(hA>p>{!#Bq|8qJ3T$(*FG|A8`aDWiei*F~Pms&we-CjDf_u?S~>T9(#h>3<~%1 z5*;Y={lqd5&<~`n*BeNdeM<@XAstA6Yl_qwWp>xvWk^BKAe&x-LHW67mD+n0vyIN- z2c|Jh$hVT&(I?IWboQu=N(OQ87AHm1jm|i&T8lQKDd!ESk)Ft*=y>2O6hv0hZ}IAZ zA}L9j0}~|w;%T_JLC>JJ)Cn_!f@MXY^8n|o;V&y&wKg`|G;vh76zh>L&6{yCY^6Tq zNU69ia4_rh9eS61=gv=>${2d!HtASpgl$kb{`L>kr@g8G?8Rkf-opEV6d=$FE$0qX z@t^j`cKB7bGK(ctGSJqRys>Tky9UB?hJngF&MppBYbEv!`4L z?l^_f)yco!4$BPVC^UOjJ8VMD5R15_-&$8R+_H@eHSgqqQ%_e#*3=d-$!tpQ@CiOT zprfvFXdh$+#8HJS^Y~Ou%5eYHoxq>HY!RxU64B>k&G$M@#=In=CF>$G3J<{q_kaIB z)^)lt)7MY4)%!caqOa|xH9Y}SJ80!d6#lGj#anCO;AmKN@0i7nkER=$+I4}JkzIA= zzOmfu6nVcS1H&+E22*IMJ{wd5lUAVC@2p$+PrMo#5Rt2$D~nRSjgVq(tjVR2|rq( zdv_lSkVVk$?+S8U_9Aq;Y?u~R0)M|P4QWH`iuFM2ir#`j_{R@^?LxNRu|U1@8)u@? zeGz$Uxoql#=$GORvCcR0ue<}dUR^Zb0fcX~e5n^*L3(vQ7=+#Wz7mU7RB-Jwt*PXQ zBeVeasd9QKw&~(haO<*_%5wPQ%IbwByQvmi0M5%WtoCnvoSLa?yhTSVc$I2M_Osq} z%nY*g&Qc6C_;e6ZWBr1k|6wW}nXZt0TDgn&l)Z3J)#NBD<*de*7^-s-mI@`+i5Drq z6KSxgX=-;CN>d%m`rfRbUslaWXH;aUb8>;MR`J1Qzv1PMH`qWK>HBkUZ3@t;}?An&lbL*|L ze4PbL_j2K!jLKqHdJfH1M3v>VE&RTB2V}Wz%ex?{D!4NAqeCr7?ot)R_F@E zX+Xq`_|zoX9$E@%8aR%zaiss3tEsY^tGR-5J+z+YO}We|`i$SsFndLxG@!{p2Vfra zY50dl^H!BI%bBrcfb)s6yIsfhPBs0;z!CO$@-gSbh9`Y^L`f~kZOHP9cu(_8OG#uq zz!NixOE9Z9UfT)DZcoHDDxMFv((hCY*1H~NCE32}6i;{@9QM=~ln2y~({mkEMlz2r ztVx17pFBRxY|JU)XDS+I(>2=RVHCjY*7&Fgs*a8ho|8f^5HQ>P&y0~S2 zS~5{^opNn81Y17HIfew7v>y>XU*Gaz1F2uW-a$f%Q%G$m@fgFEEE*PYs3op!)8X3) z{*Z?==(TMmaw0eaeryrcSnsGfGJbwyk4M=lb-~A@OLfDK@i>$<;yBk20DRxA(Gis8 z{N2sX?ytHu3WaL9`qvAXZ{Ry#RBy!F<2s6RKtkP7Q3dqz?@7c&g%>%LfrOt6^x`}}n8`JaK z(zF^jN_^x}f9|G&&?6xRrTY10JCb4s-e~CG@5C#OS%0U9?@Gs6`JL{`9+sadbRzgK z&Y}J$;#YzHtbSxeJ%uGd?bgFj1?2nD3IETa#^g^Ho*zwNK@n~A+XHuN86BG@B3@Q> z4YUzHk+>XsIvk5K%aEyG19N#Y>k7kxx9~RB;bGxL7$tNF(;rA6<#w}m5?BUeBIzn; z!^Qu&;WEFs*B>-vI4KUynI~zCQi_JkOZ|6dsBaZUfJ6d>wa51T|9$A7&o~690nqlVAo6@?-=O^lS z9pqO<<#d+811DXq2emSC&Z*I~^`tpc4%SL+h##gneFMTZhlMGg85Erkt35&n;>wUO z4j>lx`jr-8^hWk+mcj1@icR6&7Ho8eH3*H9Tfg}UKL2UuuvQAA@;A>@$F&!|rj(j5 zOqS8Y^yD(N_!);^${L5vDxw^EZk)+VK{9$4Kr{1%G>+*{(jj6UGAVSVbhkMG>%+5<3Sy+DE85|X37s8Asyu}41Vs4R+_QBcwr=&$t>eKTJM|yWriJ8Kpyjjl z8Gb<)c4AS**fR}LOHon_-H4>Oocxy~%f3WOfA-M{3;)N)%g>w?tXj@0O4=mkXJVl)o8qsfLG^njsmE|jr~Stc5f6;CB{YYI`+w+xq29dKaNxDXM~d| zB8xs&fBs|=oFM4F|4ukDn`rIgg+sjWzcGBhg%L4bs!(c_I$gD7uPXH%se-?QOTi1~ zq|w!!e*)wpXEKPqjkj8GKmA3(?9pD^Cm3#V+u#_s4(_a#Y7gzBbLq}J(NmH8YPC)x z@A88iRP1?(>OBgDXgd#Wq@?TYVf)Gq>Shy&Q zZFtOZct=;Bke9(a$|8?-T{*R?C?}3g30ufmm<7bE;Mf~$_IHKpXe!p18$nONxddib zciqS~m_x77wpIFP7}cliRBoAP@DLpPcb5lhmr-+DJ{>8ns)UULDr$l{;Y|8n^0Mt_ zoF<(SJ940Le9v&|mI%6T!Rl_rCq5=j)jBFV7Atl)nPgX{rlw};3HV34Q&2k}4X&=8 zYyeH$CGO6(woD931v4e$g!4!chrXZ{DLI~ZA;<;9I6#BgjnW}d3t97&?)|P$=)``` zn7ayJTC-YFO?0XpL1Ys~5x!PYbJ*H5pqIIeP{_yNaPO1RrZTFk`7c3Z;UYa$!~J*o zd~+gsR1AA4!`KX@`}Y^W>tbon@{uVje*v`DI7N4eyCKa~v{{5RN4H7;guj$JR1$7D z(6XzI_mv`R@^T;I?3bSp<=ypcv-pwE9fLhT_fGnu=|tHjn{f0wIk4z@(A8P2VHs2C>Jj z@bVng40Ri5RLn_ENB+J;|9I}9o2TtrHaI<(JDqcv4!J0}dT;7_ap530gXZkxh_1q5o%hTHN z%Q5PgYuR|>PM?G9I6e0)iH@rGxCtT++YQHwv@0(N;yj^*N!&$5$Z$qU*jZhn?0ZDp-0@a8G=m(TRRo^~x-$cOlI-A#`;iIC!vYJdA zuJx3MTxUV34cIv5I)=wHVr)m9n|DeS6g|-Ba&hr(9@#b{lk5)I)T|CGZtK;LgRAm; zU2cMt{!yWXa}TybYEgO0>W|xg$vCgTdZK@x%EXwl;0Q!s(7&8b;gd>|OvwN$tQL~KWaNRw-p`Jd?_oys zhe!d)o5bUu(S`pIMbk+Bu=qqBaEG*Az*Q)m{0V4Rxp1t3J(hIo^stxZ3UzhPtRa*l z`HCZc0`+=g9qYhjk?#h-MKa2M<~SGq%yH)W9}x$UUlJ6?53fm^-xK)% zXYVK+c^0cm-u)#A_?G{H7r&mo5C8sHq`*X#kfWO=CX|NqiEwOWW1uLgAii~K)15uL zZLScC;`dNr7|B2)DSic97ymdukZhBMlc%pHr+x3ICa*r5D|sh zh^@Y|slxNl+n-(9vsJgHtZAW0E3{;UrRnZxVOG|28shL$dK@7eIMwY&&>`%Az2rF& zixs1mSr0982D{@i5H(sfR-j_T4P~QFf1ozgU^~-7Bh)?pSt)s&6`qKCBtN18e42$S z;8GMeDo_Ww;W_-1!RSiU44^-H3fJf&KDBJ0Nr(zQY6ydbW1La-@bEWV!#!N6MlvHl z!g98VG&$LCy%bfdx#E5iHEd#uNa@ z%$N#CXP9Vo0N54h-6s}U!pptur?4iKwyl+A)T#gE%z*|hDz;}jhfts)k}vHu$up@)zxX{y{FTEStidTK9mLTZkR zqAjHV7exHf7wu=lt8S1yYk>j9Bj$f@c?%(@#+2kuA!)$O|Cy5bW$wNaY6gp5K%*^K zJ*#X=O%#%XB#D|tp(blB`M{APr={yYewFr8*EgP>uHPkC7&%u3NM`O?tEIxIxt;YA zILdzRd3H1J_4WBi?juomeJ~LZXTXH_`q{s#ljDbpVP1damKW=P7Yrrnw(0Ty&|!C> zdJrvpmjE3&5%!Iiywx_#_c#M<=sooNToqxE?tKYs+z56vHQ_y%9JJeW z4L4#ZuW;f^ZuGr-5k&P+ZR+L`VOB+A^}Kvp8k?tPj?c6YpVQcu^I|PPJEZC zBfLK0>ZEiY7BFh?(a7z`^(BodIlcOZW1p~D1-0pM(+b=L=j_ z={g_!UL(5==Vn=rPA{*qfWVYMaylE&$@;Zq6EQILC3rf{dXe{`vmRtrex%0z;y@)+ zEWmv4y}9P+46JL3rUYGB;`yR+#@VOBEV&b18#aOHOql(;X&tNPZ;!HIqX7L17>3Xi z%LI~SI@0WnZXkdJ!YERWROSK9`~faLkiB6DUGm*fxPV9jU%eV%cwtXqX-{aS?c^s; zP5GM2NzoZLN>?s_@)b3T^*iVy<^@P337{a^j;2sFcJ#CfIIoXLfn6$gRxl(BM8=n&`C-rmt8*zu!U z^dJ{c5(j4CpO<=$*SSP+9SzMiR_Jh7%6&;mZhNW2l;(|vU5E_kjTHn!>JQ< zN8}n!Qm!R{2M^>VJv-t{seeZ_T>s~GHI(yLOP&-J1nfA>E24eLQ=`GU1Z*sFqa$-- z;VyM!$55ci$&Q%^tqpE7%+@m;E^oSve^VOx&J96+1ASBN|Dn&`A`;4KK9=ac&%Mss z`1-oP#|!{%wlh^~N)(}wALTgnG&UL)4o>jdm16Xk8e_{E1#7~M(H*d!Nxs^BHT_qK zX#CHm6fh4PHXwlUcj1=JO1w;8lBx@n##K!K1(`DXy4Y211=Hx{Zo-{W(Zr&9Xv`zG z;F^2OkOkSfn3v4$QPnG4F)M-*G@TS3-!G<15M>#+oAp+Tt0%#vjF4I(j&}-GcpH|H z2)kfJ`w%X!9%T$IJCvdz=S9Ocf6|Jj>~hb^9MG;MLYxpD*oE}&z0D_cO`SkJhRfYp zFSBYzcjUD^Ct>I7FJ1nPm}U4J?85H4UQDAG7 zU*9%q%eUTpi3dNuX(Y;}>3!JTZK*;}h!e_3Qm7(r%;+J$*Ca3pLn&?_1zoG3e z=y@7*YyF|hFCc6gjByob7h)m>GF5&h85|H{+% z!1oV}HN!sNxA(bcPOQa_A;1q?(~eFzGJJp0V~!lLoi%3u?{$ zV@G6?DG~Y^-(ZFVl=;wfGpS=!Qs*d0bJ%#6a+i~5YqDt=i-~je97!{Rv^3T}A6k5u zC6^@)D=BL!r63_#Rw;Bl+EauFn4HUH0h~u=N?CH&;yBd!;`4j>Xup`&Md%1Bs0_Z# z`lIX7GYMJe(YzQcw)a_jT@Em`P5e?U-ZM$|G1(Zy{4s90x?>%8`4T>VLSavmXTd9~ z=A^tHJ^rMes)GGK&)0_tNHgcdW(vzPEonG*A2AI|X3Y(&x4;Zq+@spespi5pQL3(y zJFM+3sO!E$qrYbQntP>}y_rv$BqfM%txRY92qjWkqXDq^s?Z0=m72~QiP&~xFKW2L z?hnhTF_MQ=@PuxC#_RM8wvY#${d)TR?90W71(SmYJP9lIQrN~$DoeK0+SNT@turCS+4c%ol0tCPXyY=a9o8|vh@ zBoC`J8^r5a2+rQJ8MTtWH6n`%mawzv?@yR`Y|@MAEbPwgM2J2foSRYC#_xab|f711Wzx#U z7mj8A%9_ghsbv*bXd%A>A#AA{|0GM0`_c11Ib15^dfrVj#_7J4QXl%F8bb6`xJ`9( zr@-hSQc97U6tNP$0B0%;v!Rn0^}mr2#)nd-*oQH{v(9+mL+yMpNWhM3GAnOP>SW5X z?Z9Yzd5t_1a8`ei7;8CM)9>?nRrYdVVwe7XJ!~`%p4HSKX^9qpt#Zke$&EIl_MS^@ z_n+HASPdwkGI5qLf2`WTVq09DffFlgTm1T9=8w}WFOMi?6}<_?w7GeGzV*4;y_HFeg0V1|V`qwb zuX9KLopqd-aBR!oLcETcrrPNNx{P*Mi=BYLenQkA^4|@N4<+Lx1qTu|^oF+rLL@Z_ z;_Vu4xM(5nCbKOREPK^&tzszrS}i{B zimpz-o9Bn5csTZZIi!@Ys==^ey&0k1pn8%yevqTGb`&YEQZSn5Mxs~Zy29|5)>SK} z!0yG%f99(?;Ln8U;?MX{6U-DyeQMeKBiEN}5VupfCY*%}SrKA6=TW1iEJC_L__C#f zH%kHWq1N9i7g?=05IGTU<(yL^%s*u-qvb+L9F@zU@4$N<_6?06jN5iAr)(rL!09S` z&d6D!mQCagdo^^I7RLT<=5j|FLv^34wpQ)itdMYu z+k?*f{e134e(!^{$q7VmMq6zw4p5W zpa{kGAiWJ|W)C4~@JHNwT&>6B!{D)G@Sut3(83|rR{(VdIg{Fv0?QMdI{&cqaboU3>M;wB&O|vvztGJ9+4MKEaf0Y*k4%g!eaRW4#_UOnS&2?CRRi^qNCGzI#D1%8b?C>Q+Fw#?Oh+4Hh*kGhB*!9r0 z%4mE7k&J&OKnX3C3K!v|-Fr-LD`qY}gH2|*;(nW^WXN+bHZ|@eY#;B6Ps_6mtraoG zOvT5%8ybLFr1mv|+vRp(=m3TVuOq^%rKa(YXr`=vNYO}3N5v3(W{+Tc*4`h^T60+H zY5D72_2P-OWnPq~z3+(1)9Dj)bnD3o$NfwdSy5l?q06wL`=YTzemhc*nytr0EzkN$ zO1;Cl*qk|ZuDW1(ROQ9maYlJYlf~3T`%{m3oGxq`-A$2<6u~7PC31LYXxoJ7oUVTT zAlbyA!9#Z@cr4@Pvk79C0K64Gk~?*A=vWb5{bs8$r#otjRZUO(X*z|4)=B)pLoK0x z)c?Z+U~SBPygo5och2N>x>4Tru;*;!m*i)G}lEkURZX^R$5hOEM-SR1Y4JPT}AkY1yrt)r8Ng?$qV;8NpxHAFQ&&$B|H;Fcr-Br`9_Bsk&DS)_&RI_VuiJ>V!?#uU6L`1Q#5pFx`5O=WWC=KEb=)TNfJq3kT`q zE)gv+C`RBX(z(vt9%$~=dJ(Zj7X)sQ*%)Ylm9S_;Z!6*MXv=eOA}|-N8Kr%wHaqEx zKJ}FbeLwu#B_KkU`EEwQ;*nT~+i}#y3{hk4hUL;8gP|QpCuW$%=dSMMGCV;am2i|7 z>)h2=67-&Ng;8}wkyM~xb8DQ=Q`5K8p{4bxQlILQT#7}P%ryGNM6&gOPA>=goJ);& zEd>-AP2b8b03N)h;|L1${sJkno}%BMCo6*~D5rqqB5Y3bFQ>n@!4w@acjWXEyiCqN4I9qW3`~ za@SYKqXw*JT&>Mac@&E$pGrOt$+@Z0av&maL@X~!vQ|RKVJ|klkMrnK)gojs4XXKw z>Aew&i4B~tlN=!uesyPJGQ@C^u|cl)u!JBr6T54eoyn-zt)hp`BKDD!44V*2-a3{g zz?8&A=4Qr7Aa^Z96sY6UUQMo4iUD>(j6l}ul{YQkz zlga^|eaBBC<_|+O*;W}GJU^q4EvIrO`vmFNmb5n(yWfd@s!=%TlI@h~%cri)a$IpayA~I+G3Bk7)MiEHfj&k!baX;dSh>Vm%q`q|S zura4lzr_iHIA@s#`J%0Yv)XqJHzKuNjgV$wKI}eTVgDC=hrR>z^mm01PpkMyM`+*y z97T+eBcBViE+|r5*W|sEQY!g8w#q7Lx&Xb5Va6XVph1_vvo!7&+8~*7CB9ekqjqIe z$YaHnD1Wj3!4{-dW7xM(>U+i!X{95V8N!O4ZskfbAk-vz24`GP{L6f`Qd-p@-{)^G zD=g#cXy%-A}# zuF2+Vy&^43y03AKm`_*M;Koo?nL#*>^#s}RLl3&Q(LSFDl8)`j12@~2d{G%KeO-r_ zPXf*9+XZI=*+)4_d6+)EY`mf~FRSPVamQ>VT0tzcAIFE`IJXt3-r?BvWT)cXWXX%l zOx9RZf2-kjjey^vGw6{eP5(&DBkjV5cR~E*^_5?H$O2c~Q@TDZ>s7vEwpi;BqT(xN zv>f`%_xia-ZIhk9O|*c2!_=Zo1@y(I{<{rx!4L5bdb?FWM|Zj5-g++wg_W1kTg9bH zESm=)Rx1IhgMj0bcjqia=hRcE;a_1ZXv~zZt|Y;JBSBus56VPQnaw0tIVeC|*!-Pj++7iJ4?#^AOyG_1bqyKOY&oeZ^I^K6Q~I>?6@F z0v-qc7aqxev7B}MSyO#9XnXp$`!eD6de37K!Tt$&p0E_}aKA#;Dm?$Jea^ay*Akz(0Ou6Z#p4ocICJ;$y~T75NIZll+#wP)}k99*yY$ z!UV<%cMS;aTGIETbR_+-wnkE>mg3dLpYs(j)FM28b-LiTkB7VQ+#s`*mcS4mpKiMSgj;C)|^P zNNwCb!g7mvRDm=TgbX-9lB*8n){H;h{!7;LQz*g_E!tkLmU8#uM`e2p72EKfZb$Gg zTWyu4c=h$ld$a4&O1|FKHrx%}e~LbRFM&m5L>+n?n}@4se|%&ArZM}|%KZ$l7Z2Ve zq7)npgIqhpzvo(NjO}6uP_c7P$~6nIsAu16H(5pH$vhhJ(BO}@a&JaTilP}h7nnY> z(3dO!B`SJ|Yn7%nj1*sRDAErX=j{_Sk3dK)eSPWfan~8oWY~C?-JmF zmtjStHpV<}m&-lKqHC_2JAx_K%tuiS5te88)`L`1gAdM}Lw>ZgeMGckR%BL8s91aV zaJZnlC8Qwb&Fv zyQ)FLX0U_${&!qTIh{T}4wy#Punk@kYl?RX%r{fAc>g2c%o`0Y7kN^P$^7p>p}tRw zXOMvoRTA*`N1of6Q`MBq#M%--FOz|}Zn)P`|0matj1YDaEU`k3dkIX1!-SAt!UHhz z$pAGJ114S+Hx!6Kv4XaLi26}9KR=zKn0|f|Smroal_LiBKD!oldO<;_7Z2dR%nS_f zlJYV0a+_EiJ39VU|4*E=B_`(^dTb1gAI}3`=kU)f%a`dAU^GGol5c=!ws)Bz;W%f4 z7tgM7{;uUl4sVVy7%4poRsxauM+XK*maiS|PZBQR;Q{*(aXsc67Zh|#%Y$UT3q(A^ ze~4FnDE~u@X4>u_Cc?lFx`BbgaDnK2?I#h3;KCyVMte+Ubva#f>sv^P%F)EBhr4r1kuzu>+tCT@i|}U z-=*&856K{xw9lI9`Un86L%MUOE>v8*U}{bU61NS4HRSsO;&0u{J;a{Bx-?Mxn$TRr0wHxQMU(fRM#Ma0m*}*?sv4Lg=0nX=`MV_^>lzAv5)VhV(*S#0A^ikpRQG;<;}A8_|w|A$kFt2At`yS!X;4|2+io z7bDBJFX0SM1*ZnYHZGr|{0Otk2X~KlFr?+8h2CTUbBhfCHfYYle~*Cq*TPWR8T@pE z{2cs3^uRAH_@3qaDf0|YE_xkE+dAK&vls%fLsj683co;^c@0u{fT2zNa~95=wIJLL zgkS9cWG)DoJO};ZD8mAwHQ+{h`-0{!FlYgsA}_Wm&cT1UPG&*46}TabUw~5=ox!)a zn9srg^`n3Z2p8b$r68OU(A~xdXCx)d4cknRhCWch2jY}0pa2gV z4>C6h2&3=WURl0V b7hw`Bw4~VJY{0;{1OBXmt|7YjKmPh31Up)j diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bb8b2fc..3fa8f86 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index fbd7c51..1aa94a4 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,99 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +119,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,88 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 5093609..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,21 +65,6 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line @@ -86,17 +72,19 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index d875e2d..0000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'spark-state-store-data-deduplication' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..6920256 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,14 @@ +pluginManagement { + repositories { + mavenCentral() + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositories { + mavenCentral() + } +} + +rootProject.name = "spark-state-store-data-deduplication" diff --git a/src/main/scala/com/barrelsofdata/sparkexamples/Driver.scala b/src/main/scala/com/barrelsofdata/sparkexamples/Driver.scala index 603cb43..d8bdb4c 100644 --- a/src/main/scala/com/barrelsofdata/sparkexamples/Driver.scala +++ b/src/main/scala/com/barrelsofdata/sparkexamples/Driver.scala @@ -58,7 +58,7 @@ object Driver { def main(args: Array[String]): Unit = { if(args.length != 5) { println("Invalid usage") - println("Usage: spark-submit --master spark-structured-streaming-deduplication-1.0.jar ") + println("Usage: spark-submit --master spark-structured-streaming-deduplication-1.0.0.jar ") LOG.error(s"Invalid number of arguments, arguments given: [${args.mkString(",")}]") System.exit(1) } diff --git a/src/main/scala/com/barrelsofdata/sparkexamples/StateOperations.scala b/src/main/scala/com/barrelsofdata/sparkexamples/StateOperations.scala index 88dbfa8..0072336 100644 --- a/src/main/scala/com/barrelsofdata/sparkexamples/StateOperations.scala +++ b/src/main/scala/com/barrelsofdata/sparkexamples/StateOperations.scala @@ -26,7 +26,7 @@ object StateOperations { userData } state.update(currentState.get) - results.toIterator + results.iterator } }