From b94e602d9340739d5ee4c21c383b56e0b1d094a4 Mon Sep 17 00:00:00 2001 From: jboner Date: Mon, 17 Aug 2009 11:47:50 +0200 Subject: [PATCH 01/35] updated cassandra conf to 0.4 format --- config/storage-conf.xml | 303 ++++++++++++++++++++++++++++++++++------ 1 file changed, 258 insertions(+), 45 deletions(-) diff --git a/config/storage-conf.xml b/config/storage-conf.xml index f3f07d1133..41395c4666 100644 --- a/config/storage-conf.xml +++ b/config/storage-conf.xml @@ -1,56 +1,269 @@ + - akka - - org.apache.cassandra.dht.RandomPartitioner + + + - 1 + + akka - - - 127.0.0.1 - + + There is an implicit keyspace named 'system' for Cassandra internals. - 7000 - 7001 - 9160 - 7002 + The default ColumnSort is Time for standard column families. + For super column families, specifying ColumnSort is not supported; + the supercolumns themselves are always name-sorted and their subcolumns + are always time-sorted. + --> + + + + 0.01 + - - - - - + if FlushPeriodInMinutes is configured and positive, it will be + flushed to disk with that period whether it is dirty or not. + This is intended for lightly-used columnfamilies so that they + do not prevent commitlog segments from being purged. + + --> + + + + + + + + + + + org.apache.cassandra.dht.RandomPartitioner + + + + + + + org.apache.cassandra.locator.EndPointSnitch + + + org.apache.cassandra.locator.RackUnawareStrategy + + + 1 + + + cassandra/commitlog + + cassandra/data + + cassandra/callouts + cassandra/bootstrap + cassandra/staging + + + + + 127.0.0.1 + + + + + + + 5000 + + 128 + + + + + + localhost + + 7000 + + 7001 + + + localhost + + 9160 + + + + + + + + 32 + 8 + + + 64 + + + 64 + + 0.1 + + + 8 + 32 + + + false + + 1000 + + + + 864000 From fc3943580c1bdd86e9fda64550d271c8d98ea0fe Mon Sep 17 00:00:00 2001 From: jboner Date: Mon, 17 Aug 2009 15:49:54 +0200 Subject: [PATCH 02/35] bumped up the version number of samples to 0.6 --- samples-java/pom.xml | 6 +++--- samples-lift/pom.xml | 6 +++--- samples-scala/pom.xml | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/samples-java/pom.xml b/samples-java/pom.xml index fc6c4840f9..ec1c023ae9 100644 --- a/samples-java/pom.xml +++ b/samples-java/pom.xml @@ -10,7 +10,7 @@ akka se.scalablesolutions.akka - 0.5 + 0.6 ../pom.xml @@ -18,12 +18,12 @@ akka-kernel se.scalablesolutions.akka - 0.5 + 0.6 akka-util-java se.scalablesolutions.akka - 0.5 + 0.6 javax.ws.rs diff --git a/samples-lift/pom.xml b/samples-lift/pom.xml index a26ade154e..ab7b8f7554 100644 --- a/samples-lift/pom.xml +++ b/samples-lift/pom.xml @@ -10,7 +10,7 @@ akka se.scalablesolutions.akka - 0.5 + 0.6 ../pom.xml @@ -22,12 +22,12 @@ se.scalablesolutions.akka akka-kernel - 0.5 + 0.6 se.scalablesolutions.akka akka-util-java - 0.5 + 0.6 javax.ws.rs diff --git a/samples-scala/pom.xml b/samples-scala/pom.xml index e14760003d..6c2968f970 100644 --- a/samples-scala/pom.xml +++ b/samples-scala/pom.xml @@ -10,7 +10,7 @@ akka se.scalablesolutions.akka - 0.5 + 0.6 ../pom.xml @@ -18,12 +18,12 @@ akka-kernel se.scalablesolutions.akka - 0.5 + 0.6 akka-util-java se.scalablesolutions.akka - 0.5 + 0.6 javax.ws.rs From 69aeb2ad356b34375474a3dba37e0c8b2f5c8aff Mon Sep 17 00:00:00 2001 From: jboner Date: Mon, 17 Aug 2009 18:42:41 +0200 Subject: [PATCH 03/35] added generic actor scheduler --- akka.iml | 3 +- akka.ipr | 3759 +++++++++--------- akka.iws | 4082 +++++++++++--------- fun-test-java/akka-fun-test-java.iml | 28 +- kernel/src/main/scala/util/Scheduler.scala | 75 + samples-lift/akka-samples-lift.iml | 8 +- 6 files changed, 4307 insertions(+), 3648 deletions(-) create mode 100644 kernel/src/main/scala/util/Scheduler.scala diff --git a/akka.iml b/akka.iml index f9d299bab7..f748697a86 100644 --- a/akka.iml +++ b/akka.iml @@ -5,10 +5,9 @@ - + - diff --git a/akka.ipr b/akka.ipr index 7853bb23b7..226c8db6c4 100644 --- a/akka.ipr +++ b/akka.ipr @@ -1,1827 +1,1932 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - localhost - 5050 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/akka.iws b/akka.iws index 26218471be..9b399760a0 100644 --- a/akka.iws +++ b/akka.iws @@ -1,1798 +1,2284 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Inspections - - - - - AOP - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - localhost - 5050 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Inspections + + + + + AOP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fun-test-java/akka-fun-test-java.iml b/fun-test-java/akka-fun-test-java.iml index d7d5b152a6..1695f3ef71 100644 --- a/fun-test-java/akka-fun-test-java.iml +++ b/fun-test-java/akka-fun-test-java.iml @@ -1,6 +1,6 @@ - + @@ -12,26 +12,27 @@ - - + + - - - - + + + + + @@ -39,13 +40,10 @@ - + + - - - - @@ -62,10 +60,6 @@ - - - - @@ -75,8 +69,8 @@ - + diff --git a/kernel/src/main/scala/util/Scheduler.scala b/kernel/src/main/scala/util/Scheduler.scala new file mode 100644 index 0000000000..b292039446 --- /dev/null +++ b/kernel/src/main/scala/util/Scheduler.scala @@ -0,0 +1,75 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel.util + +import java.util.concurrent._ +import kernel.actor.{OneForOneStrategy, Actor} + +import org.scala_tools.javautils.Imports._ + +case object Schedule +case object UnSchedule +case class SchedulerException(msg: String, e: Throwable) extends RuntimeException(msg, e) + +/** + * Based on David Pollak's ActorPing class in the Lift Project. + * Licensed under Apache 2 License. + */ +class ScheduleActor(val receiver: Actor, val future: ScheduledFuture[AnyRef]) extends Actor with Logging { + receiver ! Schedule + + def receive: PartialFunction[Any, Unit] = { + case UnSchedule => + Scheduler.stopSupervising(this) + future.cancel(true) + stop + } +} + +object Scheduler extends Actor { + private var service = Executors.newSingleThreadScheduledExecutor(SchedulerThreadFactory) + private val schedulers = new ConcurrentHashMap[Actor, Actor] + faultHandler = Some(OneForOneStrategy(5, 5000)) + trapExit = true + + def schedule(receiver: Actor, message: AnyRef, initialDelay: Long, delay: Long, timeUnit: TimeUnit) = { + try { + startLink(new ScheduleActor( + receiver, + service.scheduleAtFixedRate(new java.lang.Runnable { + def run = receiver ! message; + }, initialDelay, delay, timeUnit).asInstanceOf[ScheduledFuture[AnyRef]])) + } catch { + case e => throw SchedulerException(message + " could not be scheduled on " + receiver, e) + } + } + + def restart = service = Executors.newSingleThreadScheduledExecutor(SchedulerThreadFactory) + + def stopSupervising(actor: Actor) = { + unlink(actor) + schedulers.remove(actor) + } + + override def shutdown = { + schedulers.values.asScala.foreach(_ ! UnSchedule) + service.shutdown + } + + def receive: PartialFunction[Any, Unit] = { + case _ => {} // ignore all messages + } +} + +private object SchedulerThreadFactory extends ThreadFactory { + private var count = 0 + val threadFactory = Executors.defaultThreadFactory() + def newThread(r: Runnable): Thread = { + val thread = threadFactory.newThread(r) + thread.setName("Scheduler-" + count) + thread.setDaemon(true) + thread + } +} diff --git a/samples-lift/akka-samples-lift.iml b/samples-lift/akka-samples-lift.iml index 43f984f930..986198706a 100644 --- a/samples-lift/akka-samples-lift.iml +++ b/samples-lift/akka-samples-lift.iml @@ -9,21 +9,21 @@ - + - - - + + + From d138560f37f8573945a9b7fb33420362f827164f Mon Sep 17 00:00:00 2001 From: jboner Date: Mon, 17 Aug 2009 20:39:14 +0200 Subject: [PATCH 04/35] added scheduler test --- akka.ipr | 22 +- akka.iws | 535 +++++++++++---------- kernel/akka-kernel.iml | 29 +- kernel/src/main/scala/Kernel.scala | 184 +++---- kernel/src/main/scala/util/Scheduler.scala | 14 +- kernel/src/test/scala/AllTest.scala | 3 + kernel/src/test/scala/SchedulerSpec.scala | 25 + samples-java/akka-samples-java.iml | 4 +- samples-scala/akka-samples-scala.iml | 4 +- util-java/akka-util-java.iml | 3 +- 10 files changed, 431 insertions(+), 392 deletions(-) mode change 100755 => 100644 kernel/src/main/scala/Kernel.scala create mode 100644 kernel/src/test/scala/SchedulerSpec.scala diff --git a/akka.ipr b/akka.ipr index 226c8db6c4..ab65121d85 100644 --- a/akka.ipr +++ b/akka.ipr @@ -1869,17 +1869,6 @@ - - - - - - - - - - - @@ -1924,6 +1913,17 @@ + + + + + + + + + + + diff --git a/akka.iws b/akka.iws index 9b399760a0..ade494ece3 100644 --- a/akka.iws +++ b/akka.iws @@ -6,12 +6,16 @@ - - - - + + + + + + + + @@ -96,17 +100,113 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + @@ -114,7 +214,7 @@ - + @@ -124,7 +224,18 @@ - + + + + + + + + + + + + @@ -142,11 +253,8 @@ @@ -296,58 +407,6 @@ diff --git a/kernel/src/main/scala/Kernel.scala b/kernel/src/main/scala/Kernel.scala old mode 100755 new mode 100644 index 7ecfd61141..ada31e9f91 --- a/kernel/src/main/scala/Kernel.scala +++ b/kernel/src/main/scala/Kernel.scala @@ -32,7 +32,7 @@ object Kernel extends Logging { } val config = setupConfig - + val CONFIG_VERSION = config.getString("akka.version", "0") if (VERSION != CONFIG_VERSION) throw new IllegalStateException("Akka JAR version [" + VERSION + "] is different than the provided config ('akka.conf') version [" + CONFIG_VERSION + "]") @@ -51,7 +51,7 @@ object Kernel extends Logging { private var jerseySelectorThread: SelectorThread = _ private val startTime = System.currentTimeMillis private var applicationLoader: Option[ClassLoader] = None - + def main(args: Array[String]) = boot def boot = synchronized { @@ -65,13 +65,13 @@ object Kernel extends Logging { if (RUN_MANAGEMENT_SERVICE) startManagementService STORAGE_SYSTEM match { - case "cassandra" => startCassandra - case "terracotta" => throw new UnsupportedOperationException("terracotta storage backend is not yet supported") - case "mongodb" => throw new UnsupportedOperationException("mongodb storage backend is not yet supported") - case "redis" => throw new UnsupportedOperationException("redis storage backend is not yet supported") - case "voldemort" => throw new UnsupportedOperationException("voldemort storage backend is not yet supported") + case "cassandra" => startCassandra + case "terracotta" => throw new UnsupportedOperationException("terracotta storage backend is not yet supported") + case "mongodb" => throw new UnsupportedOperationException("mongodb storage backend is not yet supported") + case "redis" => throw new UnsupportedOperationException("redis storage backend is not yet supported") + case "voldemort" => throw new UnsupportedOperationException("voldemort storage backend is not yet supported") case "tokyo-cabinet" => throw new UnsupportedOperationException("tokyo-cabinet storage backend is not yet supported") - case _ => throw new UnsupportedOperationException("Unknown storage system [" + STORAGE_SYSTEM + "]") + case _ => throw new UnsupportedOperationException("Unknown storage system [" + STORAGE_SYSTEM + "]") } if (RUN_REST_SERVICE) startREST @@ -81,26 +81,26 @@ object Kernel extends Logging { hasBooted = true } } - + def uptime = (System.currentTimeMillis - startTime) / 1000 def setupConfig: Config = { - if (HOME.isDefined) { - try { - val configFile = HOME.get + "/config/akka.conf" - Configgy.configure(configFile) - log.info("AKKA_HOME is defined to [%s], config loaded from [%s].", HOME.get, configFile) - } catch { - case e: ParseException => throw new IllegalStateException("'akka.conf' config file can not be found in [" + HOME + "/config/akka.conf] - aborting. Either add it in the 'config' directory or add it to the classpath.") - } - } else { - try { - Configgy.configureFromResource("akka.conf", getClass.getClassLoader) - log.info("Config loaded from the application classpath.") - } catch { - case e: ParseException => throw new IllegalStateException("'$AKKA_HOME/config/akka.conf' could not be found and no 'akka.conf' can be found on the classpath - aborting. . Either add it in the '$AKKA_HOME/config' directory or add it to the classpath.") - } + if (HOME.isDefined) { + try { + val configFile = HOME.get + "/config/akka.conf" + Configgy.configure(configFile) + log.info("AKKA_HOME is defined to [%s], config loaded from [%s].", HOME.get, configFile) + } catch { + case e: ParseException => throw new IllegalStateException("'akka.conf' config file can not be found in [" + HOME + "/config/akka.conf] - aborting. Either add it in the 'config' directory or add it to the classpath.") } + } else { + try { + Configgy.configureFromResource("akka.conf", getClass.getClassLoader) + log.info("Config loaded from the application classpath.") + } catch { + case e: ParseException => throw new IllegalStateException("'$AKKA_HOME/config/akka.conf' could not be found and no 'akka.conf' can be found on the classpath - aborting. . Either add it in the '$AKKA_HOME/config' directory or add it to the classpath.") + } + } val config = Configgy.config config.registerWithJmx("com.scalablesolutions.akka") // FIXME fix Configgy JMX subscription to allow management @@ -111,29 +111,29 @@ object Kernel extends Logging { private[akka] def runApplicationBootClasses = { new management.RestfulJMXBoot // add the REST/JMX service val loader = - if (HOME.isDefined) { - val CONFIG = HOME.get + "/config" - val DEPLOY = HOME.get + "/deploy" - val DEPLOY_DIR = new File(DEPLOY) - if (!DEPLOY_DIR.exists) { log.error("Could not find a deploy directory at [" + DEPLOY + "]"); System.exit(-1) } - val toDeploy = for (f <- DEPLOY_DIR.listFiles().toArray.toList.asInstanceOf[List[File]]) yield f.toURL - //val toDeploy = DEPLOY_DIR.toURL :: (for (f <- DEPLOY_DIR.listFiles().toArray.toList.asInstanceOf[List[File]]) yield f.toURL) - log.info("Deploying applications from [%s]: [%s]", DEPLOY, toDeploy.toArray.toList) - new URLClassLoader(toDeploy.toArray, getClass.getClassLoader) - } else if (getClass.getClassLoader.getResourceAsStream("akka.conf") != null) { - getClass.getClassLoader - } else throw new IllegalStateException("AKKA_HOME is not defined and no 'akka.conf' can be found on the classpath, aborting") + if (HOME.isDefined) { + val CONFIG = HOME.get + "/config" + val DEPLOY = HOME.get + "/deploy" + val DEPLOY_DIR = new File(DEPLOY) + if (!DEPLOY_DIR.exists) {log.error("Could not find a deploy directory at [" + DEPLOY + "]"); System.exit(-1)} + val toDeploy = for (f <- DEPLOY_DIR.listFiles().toArray.toList.asInstanceOf[List[File]]) yield f.toURL + //val toDeploy = DEPLOY_DIR.toURL :: (for (f <- DEPLOY_DIR.listFiles().toArray.toList.asInstanceOf[List[File]]) yield f.toURL) + log.info("Deploying applications from [%s]: [%s]", DEPLOY, toDeploy.toArray.toList) + new URLClassLoader(toDeploy.toArray, getClass.getClassLoader) + } else if (getClass.getClassLoader.getResourceAsStream("akka.conf") != null) { + getClass.getClassLoader + } else throw new IllegalStateException("AKKA_HOME is not defined and no 'akka.conf' can be found on the classpath, aborting") for (clazz <- BOOT_CLASSES) { log.info("Loading boot class [%s]", clazz) loader.loadClass(clazz).newInstance } applicationLoader = Some(loader) } - + private[akka] def startRemoteService = { // FIXME manage remote serve thread for graceful shutdown val remoteServerThread = new Thread(new Runnable() { - def run = RemoteServer.start(applicationLoader) + def run = RemoteServer.start(applicationLoader) }, "Akka Remote Service") remoteServerThread.start } @@ -178,18 +178,18 @@ object Kernel extends Logging { private def printBanner = { log.info( -"""============================== - __ __ - _____ | | _| | _______ - \__ \ | |/ / |/ /\__ \ - / __ \| <| < / __ \_ - (____ /__|_ \__|_ \(____ / - \/ \/ \/ \/ -""") + """============================== + __ __ + _____ | | _| | _______ + \__ \ | |/ / |/ /\__ \ + / __ \| <| < / __ \_ + (____ /__|_ \__|_ \(____ / + \/ \/ \/ \/ + """) log.info(" Running version " + VERSION) log.info("==============================") } - + private def cassandraBenchmark = { val NR_ENTRIES = 100000 @@ -206,7 +206,7 @@ object Kernel extends Logging { CassandraStorage.insertMapStorageEntriesFor("test", entries.toList) end = System.currentTimeMillis println("Writes per second - batch: " + NR_ENTRIES / ((end - start).toDouble / 1000)) - + println("=================================================") start = System.currentTimeMillis for (i <- 1 to NR_ENTRIES) CassandraStorage.getMapStorageEntryFor("test", i.toString) @@ -219,15 +219,15 @@ object Kernel extends Logging { - -/* - //import voldemort.client.{SocketStoreClientFactory, StoreClient, StoreClientFactory} - //import voldemort.server.{VoldemortConfig, VoldemortServer} - //import voldemort.versioning.Versioned - private[this] var storageFactory: StoreClientFactory = _ - private[this] var storageServer: VoldemortServer = _ - */ +/* +//import voldemort.client.{SocketStoreClientFactory, StoreClient, StoreClientFactory} +//import voldemort.server.{VoldemortConfig, VoldemortServer} +//import voldemort.versioning.Versioned + + private[this] var storageFactory: StoreClientFactory = _ + private[this] var storageServer: VoldemortServer = _ +*/ // private[akka] def startVoldemort = { // val VOLDEMORT_SERVER_URL = "tcp://" + SERVER_URL @@ -263,39 +263,39 @@ object Kernel extends Logging { // private[akka] def getStorageFor(storageName: String): StoreClient[String, String] = // storageFactory.getStoreClient(storageName) - // private[akka] def startZooKeeper = { - //import org.apache.zookeeper.jmx.ManagedUtil - //import org.apache.zookeeper.server.persistence.FileTxnSnapLog - //import org.apache.zookeeper.server.ServerConfig - //import org.apache.zookeeper.server.NIOServerCnxn - // val ZOO_KEEPER_SERVER_URL = SERVER_URL - // val ZOO_KEEPER_SERVER_PORT = 9898 - // try { - // ManagedUtil.registerLog4jMBeans - // ServerConfig.parse(args) - // } catch { - // case e: JMException => log.warning("Unable to register log4j JMX control: s%", e) - // case e => log.fatal("Error in ZooKeeper config: s%", e) - // } - // val factory = new ZooKeeperServer.Factory() { - // override def createConnectionFactory = new NIOServerCnxn.Factory(ServerConfig.getClientPort) - // override def createServer = { - // val server = new ZooKeeperServer - // val txLog = new FileTxnSnapLog( - // new File(ServerConfig.getDataLogDir), - // new File(ServerConfig.getDataDir)) - // server.setTxnLogFactory(txLog) - // server - // } - // } - // try { - // val zooKeeper = factory.createServer - // zooKeeper.startup - // log.info("ZooKeeper started") - // // TODO: handle clean shutdown as below in separate thread - // // val cnxnFactory = serverFactory.createConnectionFactory - // // cnxnFactory.setZooKeeperServer(zooKeeper) - // // cnxnFactory.join - // // if (zooKeeper.isRunning) zooKeeper.shutdown - // } catch { case e => log.fatal("Unexpected exception: s%",e) } - // } +// private[akka] def startZooKeeper = { +//import org.apache.zookeeper.jmx.ManagedUtil +//import org.apache.zookeeper.server.persistence.FileTxnSnapLog +//import org.apache.zookeeper.server.ServerConfig +//import org.apache.zookeeper.server.NIOServerCnxn +// val ZOO_KEEPER_SERVER_URL = SERVER_URL +// val ZOO_KEEPER_SERVER_PORT = 9898 +// try { +// ManagedUtil.registerLog4jMBeans +// ServerConfig.parse(args) +// } catch { +// case e: JMException => log.warning("Unable to register log4j JMX control: s%", e) +// case e => log.fatal("Error in ZooKeeper config: s%", e) +// } +// val factory = new ZooKeeperServer.Factory() { +// override def createConnectionFactory = new NIOServerCnxn.Factory(ServerConfig.getClientPort) +// override def createServer = { +// val server = new ZooKeeperServer +// val txLog = new FileTxnSnapLog( +// new File(ServerConfig.getDataLogDir), +// new File(ServerConfig.getDataDir)) +// server.setTxnLogFactory(txLog) +// server +// } +// } +// try { +// val zooKeeper = factory.createServer +// zooKeeper.startup +// log.info("ZooKeeper started") +// // TODO: handle clean shutdown as below in separate thread +// // val cnxnFactory = serverFactory.createConnectionFactory +// // cnxnFactory.setZooKeeperServer(zooKeeper) +// // cnxnFactory.join +// // if (zooKeeper.isRunning) zooKeeper.shutdown +// } catch { case e => log.fatal("Unexpected exception: s%",e) } +// } diff --git a/kernel/src/main/scala/util/Scheduler.scala b/kernel/src/main/scala/util/Scheduler.scala index b292039446..95e9378de6 100644 --- a/kernel/src/main/scala/util/Scheduler.scala +++ b/kernel/src/main/scala/util/Scheduler.scala @@ -1,7 +1,3 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - package se.scalablesolutions.akka.kernel.util import java.util.concurrent._ @@ -9,17 +5,14 @@ import kernel.actor.{OneForOneStrategy, Actor} import org.scala_tools.javautils.Imports._ -case object Schedule case object UnSchedule case class SchedulerException(msg: String, e: Throwable) extends RuntimeException(msg, e) /** - * Based on David Pollak's ActorPing class in the Lift Project. - * Licensed under Apache 2 License. + * Rework of David Pollak's ActorPing class in the Lift Project + * which is licensed under the Apache 2 License. */ class ScheduleActor(val receiver: Actor, val future: ScheduledFuture[AnyRef]) extends Actor with Logging { - receiver ! Schedule - def receive: PartialFunction[Any, Unit] = { case UnSchedule => Scheduler.stopSupervising(this) @@ -33,6 +26,7 @@ object Scheduler extends Actor { private val schedulers = new ConcurrentHashMap[Actor, Actor] faultHandler = Some(OneForOneStrategy(5, 5000)) trapExit = true + start def schedule(receiver: Actor, message: AnyRef, initialDelay: Long, delay: Long, timeUnit: TimeUnit) = { try { @@ -73,3 +67,5 @@ private object SchedulerThreadFactory extends ThreadFactory { thread } } + + diff --git a/kernel/src/test/scala/AllTest.scala b/kernel/src/test/scala/AllTest.scala index a225bfb080..546f5cc446 100644 --- a/kernel/src/test/scala/AllTest.scala +++ b/kernel/src/test/scala/AllTest.scala @@ -6,6 +6,7 @@ import junit.framework.TestSuite import kernel.actor.{ActorSpec, RemoteActorSpec, PersistentActorSpec, InMemoryActorSpec} import kernel.reactor.{EventBasedSingleThreadDispatcherTest, EventBasedThreadPoolDispatcherTest} +import kernel.util.SchedulerSpec object AllTest extends TestCase { def suite(): Test = { @@ -18,6 +19,8 @@ object AllTest extends TestCase { suite.addTestSuite(classOf[RemoteActorSpec]) //suite.addTestSuite(classOf[PersistentActorSpec]) suite.addTestSuite(classOf[InMemoryActorSpec]) + suite.addTestSuite(classOf[SchedulerSpec]) + //suite.addTestSuite(classOf[TransactionClasherSpec]) suite } diff --git a/kernel/src/test/scala/SchedulerSpec.scala b/kernel/src/test/scala/SchedulerSpec.scala new file mode 100644 index 0000000000..bf763046fc --- /dev/null +++ b/kernel/src/test/scala/SchedulerSpec.scala @@ -0,0 +1,25 @@ +package se.scalablesolutions.akka.kernel.util + +import se.scalablesolutions.akka.kernel.actor.Actor + +import java.util.concurrent.TimeUnit + +import org.junit.Assert._ + +class SchedulerSpec extends junit.framework.TestCase { + + def testScheduler = { + var count = 0 + case object Tick + val actor = new Actor() { + def receive: PartialFunction[Any, Unit] = { + case Tick => count += 1 + }} + actor.start + Thread.sleep(1000) + Scheduler.schedule(actor, Tick, 0L, 1L, TimeUnit.SECONDS) + Thread.sleep(5000) + Scheduler.shutdown + assertTrue(count > 0) + } +} \ No newline at end of file diff --git a/samples-java/akka-samples-java.iml b/samples-java/akka-samples-java.iml index 5871ff71d7..243de784f2 100644 --- a/samples-java/akka-samples-java.iml +++ b/samples-java/akka-samples-java.iml @@ -9,8 +9,8 @@ - - + + diff --git a/samples-scala/akka-samples-scala.iml b/samples-scala/akka-samples-scala.iml index 955c18a9ce..b864b09ba5 100644 --- a/samples-scala/akka-samples-scala.iml +++ b/samples-scala/akka-samples-scala.iml @@ -14,8 +14,8 @@ - - + + diff --git a/util-java/akka-util-java.iml b/util-java/akka-util-java.iml index 1998394879..646310bd42 100644 --- a/util-java/akka-util-java.iml +++ b/util-java/akka-util-java.iml @@ -11,9 +11,8 @@ - - + From 6b20b9c2b9fae76514e1f42af525a40568350bf1 Mon Sep 17 00:00:00 2001 From: jboner Date: Mon, 17 Aug 2009 20:46:05 +0200 Subject: [PATCH 05/35] added lift header --- akka.iws | 20 ++++++++------------ kernel/src/main/scala/util/Scheduler.scala | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/akka.iws b/akka.iws index ade494ece3..d06ec27572 100644 --- a/akka.iws +++ b/akka.iws @@ -6,16 +6,8 @@ - - - - - - - - @@ -100,8 +92,10 @@ - - + + + + @@ -2201,8 +2195,10 @@ - - + + + + diff --git a/kernel/src/main/scala/util/Scheduler.scala b/kernel/src/main/scala/util/Scheduler.scala index 95e9378de6..2d7bfed445 100644 --- a/kernel/src/main/scala/util/Scheduler.scala +++ b/kernel/src/main/scala/util/Scheduler.scala @@ -1,3 +1,16 @@ +/* + * Copyright 2007 WorldWide Conferencing, LLC + * + * 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. + */ + package se.scalablesolutions.akka.kernel.util import java.util.concurrent._ @@ -46,7 +59,7 @@ object Scheduler extends Actor { unlink(actor) schedulers.remove(actor) } - + override def shutdown = { schedulers.values.asScala.foreach(_ ! UnSchedule) service.shutdown @@ -60,6 +73,7 @@ object Scheduler extends Actor { private object SchedulerThreadFactory extends ThreadFactory { private var count = 0 val threadFactory = Executors.defaultThreadFactory() + def newThread(r: Runnable): Thread = { val thread = threadFactory.newThread(r) thread.setName("Scheduler-" + count) From c1fa2e87b83b4642715adced0c67ad37b1a44922 Mon Sep 17 00:00:00 2001 From: Timothy Perrett Date: Tue, 18 Aug 2009 10:23:29 +0100 Subject: [PATCH 06/35] removed redundant test from lift sample --- .../eu/getintheloop/example/AppTest.scala | 75 ------------------- 1 file changed, 75 deletions(-) delete mode 100644 samples-lift/src/test/scala/eu/getintheloop/example/AppTest.scala diff --git a/samples-lift/src/test/scala/eu/getintheloop/example/AppTest.scala b/samples-lift/src/test/scala/eu/getintheloop/example/AppTest.scala deleted file mode 100644 index babdbdd638..0000000000 --- a/samples-lift/src/test/scala/eu/getintheloop/example/AppTest.scala +++ /dev/null @@ -1,75 +0,0 @@ -package eu.getintheloop.example - -import _root_.java.io.File -import _root_.junit.framework._ -import Assert._ -import _root_.scala.xml.XML -import _root_.net.liftweb.util._ - -object AppTest { - def suite: Test = { - val suite = new TestSuite(classOf[AppTest]) - suite - } - - def main(args : Array[String]) { - _root_.junit.textui.TestRunner.run(suite) - } -} - -/** - * Unit test for simple App. - */ -class AppTest extends TestCase("app") { - - /** - * Rigourous Tests :-) - */ - def testOK() = assertTrue(true) - // def testKO() = assertTrue(false); - - /** - * Tests to make sure the project's XML files are well-formed. - * - * Finds every *.html and *.xml file in src/main/webapp (and its - * subdirectories) and tests to make sure they are well-formed. - */ - def testXml() = { - var failed: List[File] = Nil - - def handledXml(file: String) = - file.endsWith(".xml") - - def handledXHtml(file: String) = - file.endsWith(".html") || file.endsWith(".htm") || file.endsWith(".xhtml") - - def wellFormed(file: File) { - if (file.isDirectory) - for (f <- file.listFiles) wellFormed(f) - - if (file.isFile && handledXml(file.getName)) { - try { - XML.loadFile(file) - } catch { - case e: _root_.org.xml.sax.SAXParseException => failed = file :: failed - } - } - if (file.isFile && handledXHtml(file.getName)) { - PCDataXmlParser(new java.io.FileInputStream(file.getAbsolutePath)) match { - case Full(_) => // file is ok - case _ => failed = file :: failed - } - } - } - - wellFormed(new File("src/main/webapp")) - - val numFails = failed.size - if (numFails > 0) { - val fileStr = if (numFails == 1) "file" else "files" - val msg = "Malformed XML in " + numFails + " " + fileStr + ": " + failed.mkString(", ") - println(msg) - fail(msg) - } - } -} From 5d41b79b277011c4c839f2447541ee970c779a2c Mon Sep 17 00:00:00 2001 From: jboner Date: Wed, 19 Aug 2009 12:56:33 +0200 Subject: [PATCH 07/35] removed Cassandra startup procedure --- akka.ipr | 22 +- akka.iws | 596 +++++------------- .../akka/api/PersistenceManager.java | 4 +- kernel/src/main/scala/Kernel.scala | 22 +- .../main/scala/state/CassandraStorage.scala | 105 ++- .../src/test/scala/PersistentActorSpec.scala | 8 - util-java/akka-util-java.iml | 1 - 7 files changed, 202 insertions(+), 556 deletions(-) diff --git a/akka.ipr b/akka.ipr index ab65121d85..226c8db6c4 100644 --- a/akka.ipr +++ b/akka.ipr @@ -1869,6 +1869,17 @@ + + + + + + + + + + + @@ -1913,17 +1924,6 @@ - - - - - - - - - - - diff --git a/akka.iws b/akka.iws index d06ec27572..bdf018e8e4 100644 --- a/akka.iws +++ b/akka.iws @@ -6,7 +6,12 @@ - + + + + + + @@ -89,151 +94,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - @@ -247,22 +116,22 @@ @@ -322,116 +191,6 @@ @@ -1972,16 +1693,16 @@ - + - + + - @@ -1992,7 +1713,7 @@ - + @@ -2035,45 +1756,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2115,27 +1797,6 @@ - - - - - - - - - - - - - - - - - - - - - @@ -2164,41 +1825,74 @@ - - - - - + + + + + + + + - + - + - + + + + + + + + - + + + + + + + + + + + + - + - - - - + + + + + + + + + + + + + + + + diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistenceManager.java b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistenceManager.java index 8e498368d5..b059c81657 100644 --- a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistenceManager.java +++ b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistenceManager.java @@ -4,9 +4,7 @@ public class PersistenceManager { private static volatile boolean isRunning = false; public static void init() { if (!isRunning) { - se.scalablesolutions.akka.kernel.Kernel.config(); - se.scalablesolutions.akka.kernel.Kernel.startCassandra(); - se.scalablesolutions.akka.kernel.Kernel.startRemoteService(); + se.scalablesolutions.akka.kernel.Kernel.startRemoteService(); isRunning = true; } } diff --git a/kernel/src/main/scala/Kernel.scala b/kernel/src/main/scala/Kernel.scala index ada31e9f91..a77daaa63b 100644 --- a/kernel/src/main/scala/Kernel.scala +++ b/kernel/src/main/scala/Kernel.scala @@ -63,17 +63,6 @@ object Kernel extends Logging { if (RUN_REMOTE_SERVICE) startRemoteService if (RUN_MANAGEMENT_SERVICE) startManagementService - - STORAGE_SYSTEM match { - case "cassandra" => startCassandra - case "terracotta" => throw new UnsupportedOperationException("terracotta storage backend is not yet supported") - case "mongodb" => throw new UnsupportedOperationException("mongodb storage backend is not yet supported") - case "redis" => throw new UnsupportedOperationException("redis storage backend is not yet supported") - case "voldemort" => throw new UnsupportedOperationException("voldemort storage backend is not yet supported") - case "tokyo-cabinet" => throw new UnsupportedOperationException("tokyo-cabinet storage backend is not yet supported") - case _ => throw new UnsupportedOperationException("Unknown storage system [" + STORAGE_SYSTEM + "]") - } - if (RUN_REST_SERVICE) startREST Thread.currentThread.setContextClassLoader(getClass.getClassLoader) @@ -84,7 +73,7 @@ object Kernel extends Logging { def uptime = (System.currentTimeMillis - startTime) / 1000 - def setupConfig: Config = { + private def setupConfig: Config = { if (HOME.isDefined) { try { val configFile = HOME.get + "/config/akka.conf" @@ -143,14 +132,7 @@ object Kernel extends Logging { log.info("Management service started successfully.") } - private[akka] def startCassandra = if (config.getBool("akka.storage.cassandra.service", true)) { - System.setProperty("cassandra", "") - if (HOME.isDefined) System.setProperty("storage-config", HOME.get + "/config/") - else if (System.getProperty("storage-config", "NIL") == "NIL") throw new IllegalStateException("AKKA_HOME and -Dstorage-config=... is not set. Can't start up Cassandra. Either set AKKA_HOME or set the -Dstorage-config=... variable to the directory with the Cassandra storage-conf.xml file.") - CassandraStorage.start - } - - private[akka] def startREST = { + def startREST = { val uri = UriBuilder.fromUri(REST_URL).port(REST_PORT).build() val scheme = uri.getScheme diff --git a/kernel/src/main/scala/state/CassandraStorage.scala b/kernel/src/main/scala/state/CassandraStorage.scala index fdc6e607db..10ce3722d7 100644 --- a/kernel/src/main/scala/state/CassandraStorage.scala +++ b/kernel/src/main/scala/state/CassandraStorage.scala @@ -57,47 +57,28 @@ object CassandraStorage extends MapStorage } } - private[this] var sessions: Option[CassandraSessionPool[_]] = None - - def start = synchronized { - if (!isRunning) { - try { - sessions = Some(new CassandraSessionPool( - KEYSPACE, - StackPool(SocketProvider(CASSANDRA_SERVER_HOSTNAME, CASSANDRA_SERVER_PORT)), - protocol, - CONSISTENCY_LEVEL)) - log.info("Cassandra persistent storage has started up successfully"); - } catch { - case e => - log.error("Could not start up Cassandra persistent storage") - throw e - } - isRunning - } - } - - def stop = synchronized { - if (isRunning && sessions.isDefined) sessions.get.close - } - + private[this] var sessions = new CassandraSessionPool( + KEYSPACE, + StackPool(SocketProvider(CASSANDRA_SERVER_HOSTNAME, CASSANDRA_SERVER_PORT)), + protocol, + CONSISTENCY_LEVEL) // =============================================================== // For Ref // =============================================================== - override def insertRefStorageFor(name: String, element: AnyRef) = if (sessions.isDefined) { - sessions.get.withSession { + override def insertRefStorageFor(name: String, element: AnyRef) = { + sessions.withSession { _ ++| (name, new ColumnPath(REF_COLUMN_PARENT.getColumn_family, null, REF_KEY), serializer.out(element), System.currentTimeMillis, CONSISTENCY_LEVEL) } - } else throw new IllegalStateException("CassandraStorage is not started") + } - override def getRefStorageFor(name: String): Option[AnyRef] = if (sessions.isDefined) { + override def getRefStorageFor(name: String): Option[AnyRef] = { try { - val column: Option[Column] = sessions.get.withSession { + val column: Option[Column] = sessions.withSession { _ | (name, new ColumnPath(REF_COLUMN_PARENT.getColumn_family, null, REF_KEY)) } if (column.isDefined) Some(serializer.in(column.get.value, None)) @@ -107,37 +88,37 @@ object CassandraStorage extends MapStorage e.printStackTrace None } - } else throw new IllegalStateException("CassandraStorage is not started") + } // =============================================================== // For Vector // =============================================================== - override def insertVectorStorageEntryFor(name: String, element: AnyRef) = if (sessions.isDefined) { - sessions.get.withSession { + override def insertVectorStorageEntryFor(name: String, element: AnyRef) = { + sessions.withSession { _ ++| (name, new ColumnPath(VECTOR_COLUMN_PARENT.getColumn_family, null, intToBytes(getVectorStorageSizeFor(name))), serializer.out(element), System.currentTimeMillis, CONSISTENCY_LEVEL) } - } else throw new IllegalStateException("CassandraStorage is not started") + } override def insertVectorStorageEntriesFor(name: String, elements: List[AnyRef]) = { } - override def getVectorStorageEntryFor(name: String, index: Int): AnyRef = if (sessions.isDefined) { - val column: Option[Column] = sessions.get.withSession { + override def getVectorStorageEntryFor(name: String, index: Int): AnyRef = { + val column: Option[Column] = sessions.withSession { _ | (name, new ColumnPath(VECTOR_COLUMN_PARENT.getColumn_family, null, intToBytes(index))) } if (column.isDefined) serializer.in(column.get.value, None) else throw new NoSuchElementException("No element for vector [" + name + "] and index [" + index + "]") - } else throw new IllegalStateException("CassandraStorage is not started") + } - override def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[AnyRef] = if (sessions.isDefined) { + override def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[AnyRef] = { val startBytes = if (start.isDefined) intToBytes(start.get) else null val finishBytes = if (finish.isDefined) intToBytes(finish.get) else null - val columns: List[Column] = sessions.get.withSession { + val columns: List[Column] = sessions.withSession { _ / (name, VECTOR_COLUMN_PARENT, startBytes, finishBytes, @@ -146,43 +127,43 @@ object CassandraStorage extends MapStorage CONSISTENCY_LEVEL) } columns.map(column => serializer.in(column.value, None)) - } else throw new IllegalStateException("CassandraStorage is not started") + } - override def getVectorStorageSizeFor(name: String): Int = if (sessions.isDefined) { - sessions.get.withSession { + override def getVectorStorageSizeFor(name: String): Int = { + sessions.withSession { _ |# (name, VECTOR_COLUMN_PARENT) } - } else throw new IllegalStateException("CassandraStorage is not started") + } // =============================================================== // For Map // =============================================================== - override def insertMapStorageEntryFor(name: String, key: AnyRef, element: AnyRef) = if (sessions.isDefined) { - sessions.get.withSession { + override def insertMapStorageEntryFor(name: String, key: AnyRef, element: AnyRef) = { + sessions.withSession { _ ++| (name, new ColumnPath(MAP_COLUMN_PARENT.getColumn_family, null, serializer.out(key)), serializer.out(element), System.currentTimeMillis, CONSISTENCY_LEVEL) } - } else throw new IllegalStateException("CassandraStorage is not started") + } - override def insertMapStorageEntriesFor(name: String, entries: List[Tuple2[AnyRef, AnyRef]]) = if (sessions.isDefined) { + override def insertMapStorageEntriesFor(name: String, entries: List[Tuple2[AnyRef, AnyRef]]) = { val cf2columns: java.util.Map[String, java.util.List[Column]] = new java.util.HashMap for (entry <- entries) { val columns: java.util.List[Column] = new java.util.ArrayList columns.add(new Column(serializer.out(entry._1), serializer.out(entry._2), System.currentTimeMillis)) cf2columns.put(MAP_COLUMN_PARENT.getColumn_family, columns) } - sessions.get.withSession { + sessions.withSession { _ ++| (new BatchMutation(name, cf2columns), CONSISTENCY_LEVEL) } - } else throw new IllegalStateException("CassandraStorage is not started") + } - override def getMapStorageEntryFor(name: String, key: AnyRef): Option[AnyRef] = if (sessions.isDefined) { + override def getMapStorageEntryFor(name: String, key: AnyRef): Option[AnyRef] = { try { - val column: Option[Column] = sessions.get.withSession { + val column: Option[Column] = sessions.withSession { _ | (name, new ColumnPath(MAP_COLUMN_PARENT.getColumn_family, null, serializer.out(key))) } if (column.isDefined) Some(serializer.in(column.get.value, None)) @@ -192,9 +173,9 @@ object CassandraStorage extends MapStorage e.printStackTrace None } - } else throw new IllegalStateException("CassandraStorage is not started") + } - override def getMapStorageFor(name: String): List[Tuple2[AnyRef, AnyRef]] = if (sessions.isDefined) { + override def getMapStorageFor(name: String): List[Tuple2[AnyRef, AnyRef]] = { throw new UnsupportedOperationException /* val columns = server.get_columns_since(name, MAP_COLUMN_FAMILY, -1) @@ -204,35 +185,35 @@ object CassandraStorage extends MapStorage col = (column.columnName, column.value) } yield col */ - } else throw new IllegalStateException("CassandraStorage is not started") + } - override def getMapStorageSizeFor(name: String): Int = if (sessions.isDefined) { - sessions.get.withSession { + override def getMapStorageSizeFor(name: String): Int = { + sessions.withSession { _ |# (name, MAP_COLUMN_PARENT) } - } else throw new IllegalStateException("CassandraStorage is not started") + } override def removeMapStorageFor(name: String): Unit = removeMapStorageFor(name, null) - override def removeMapStorageFor(name: String, key: AnyRef): Unit = if (sessions.isDefined) { + override def removeMapStorageFor(name: String, key: AnyRef): Unit = { val keyBytes = if (key == null) null else serializer.out(key) - sessions.get.withSession { + sessions.withSession { _ -- (name, new ColumnPathOrParent(MAP_COLUMN_PARENT.getColumn_family, null, keyBytes), System.currentTimeMillis, CONSISTENCY_LEVEL) } - } else throw new IllegalStateException("CassandraStorage is not started") + } override def getMapStorageRangeFor(name: String, start: Option[AnyRef], finish: Option[AnyRef], count: Int): - List[Tuple2[AnyRef, AnyRef]] = if (sessions.isDefined) { + List[Tuple2[AnyRef, AnyRef]] = { val startBytes = if (start.isDefined) serializer.out(start.get) else null val finishBytes = if (finish.isDefined) serializer.out(finish.get) else null - val columns: List[Column] = sessions.get.withSession { + val columns: List[Column] = sessions.withSession { _ / (name, MAP_COLUMN_PARENT, startBytes, finishBytes, IS_ASCENDING, count, CONSISTENCY_LEVEL) } columns.map(column => (column.name, serializer.in(column.value, None))) - } else throw new IllegalStateException("CassandraStorage is not started") + } } /** diff --git a/kernel/src/test/scala/PersistentActorSpec.scala b/kernel/src/test/scala/PersistentActorSpec.scala index 0d8b464dd1..07002e27eb 100644 --- a/kernel/src/test/scala/PersistentActorSpec.scala +++ b/kernel/src/test/scala/PersistentActorSpec.scala @@ -56,15 +56,7 @@ class PersistentActor extends Actor { } } -object PersistenceManager { - @volatile var isRunning = false - def init = if (!isRunning) { - Kernel.startCassandra - isRunning = true - } -} class PersistentActorSpec extends TestCase { - PersistenceManager.init @Test def testMapShouldNotRollbackStateForStatefulServerInCaseOfSuccess = { diff --git a/util-java/akka-util-java.iml b/util-java/akka-util-java.iml index 646310bd42..a80717f779 100644 --- a/util-java/akka-util-java.iml +++ b/util-java/akka-util-java.iml @@ -12,7 +12,6 @@ - From 07eecc548a1649f3ccaed772703ca21cd065fc54 Mon Sep 17 00:00:00 2001 From: jboner Date: Thu, 20 Aug 2009 14:05:00 +0200 Subject: [PATCH 08/35] removed monitoring, statistics and management --- akka.ipr | 11 - akka.iws | 569 +++++++++++------- kernel/src/main/scala/Kernel.scala | 15 +- kernel/src/main/scala/actor/Actor.scala | 7 - kernel/src/main/scala/management/JMX.scala | 187 ------ .../main/scala/management/RestfulJMX.scala | 96 --- .../src/main/scala/management/ScalaJMX.scala | 171 ------ kernel/src/main/scala/nio/RemoteClient.scala | 16 - kernel/src/main/scala/nio/RemoteServer.scala | 32 - .../EventBasedSingleThreadDispatcher.scala | 8 +- .../EventBasedThreadPoolDispatcher.scala | 7 - .../scala/reactor/MessageDispatcherBase.scala | 16 - .../scala/reactor/ThreadBasedDispatcher.scala | 12 - samples-java/akka-samples-java.iml | 29 +- samples-scala/akka-samples-scala.iml | 22 +- 15 files changed, 364 insertions(+), 834 deletions(-) delete mode 100755 kernel/src/main/scala/management/JMX.scala delete mode 100755 kernel/src/main/scala/management/RestfulJMX.scala delete mode 100755 kernel/src/main/scala/management/ScalaJMX.scala diff --git a/akka.ipr b/akka.ipr index 226c8db6c4..e9a88e3c2a 100644 --- a/akka.ipr +++ b/akka.ipr @@ -1869,17 +1869,6 @@ - - - - - - - - - - - diff --git a/akka.iws b/akka.iws index bdf018e8e4..1793f4a646 100644 --- a/akka.iws +++ b/akka.iws @@ -6,13 +6,21 @@ - - - - + + + + + + + + + + + + @@ -94,15 +102,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + @@ -116,22 +198,22 @@ @@ -186,6 +268,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -318,7 +456,67 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -384,84 +582,6 @@ - @@ -507,7 +645,7 @@ - + @@ -535,7 +673,7 @@ - + - - - - - - - - + + + + + + + + + + + - - + + + @@ -1584,7 +1733,7 @@ - + @@ -1592,27 +1741,28 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + localhost @@ -1689,20 +1839,19 @@ - + + - - + - + - - + @@ -1713,8 +1862,9 @@ - + + @@ -1756,142 +1906,111 @@ - + - + - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - + - + - + - + - + + + + + + + + + + - + - + - + - + - + - + + + + + + + + + + + + + + + - - - - - - - - - - - - + - + - - - - - - - - + - + diff --git a/kernel/src/main/scala/Kernel.scala b/kernel/src/main/scala/Kernel.scala index a77daaa63b..5c05d16193 100644 --- a/kernel/src/main/scala/Kernel.scala +++ b/kernel/src/main/scala/Kernel.scala @@ -18,7 +18,6 @@ import kernel.rest.AkkaCometServlet import kernel.nio.RemoteServer import kernel.state.CassandraStorage import kernel.util.Logging -import kernel.management.Management /** * @author Jonas Bonér @@ -38,7 +37,6 @@ object Kernel extends Logging { val BOOT_CLASSES = config.getList("akka.boot") val RUN_REMOTE_SERVICE = config.getBool("akka.remote.service", true) - val RUN_MANAGEMENT_SERVICE = config.getBool("akka.management.service", true) val STORAGE_SYSTEM = config.getString("akka.storage.system", "cassandra") val RUN_REST_SERVICE = config.getBool("akka.rest.service", true) val REST_HOSTNAME = kernel.Kernel.config.getString("akka.rest.hostname", "localhost") @@ -62,7 +60,6 @@ object Kernel extends Logging { runApplicationBootClasses if (RUN_REMOTE_SERVICE) startRemoteService - if (RUN_MANAGEMENT_SERVICE) startManagementService if (RUN_REST_SERVICE) startREST Thread.currentThread.setContextClassLoader(getClass.getClassLoader) @@ -90,15 +87,10 @@ object Kernel extends Logging { case e: ParseException => throw new IllegalStateException("'$AKKA_HOME/config/akka.conf' could not be found and no 'akka.conf' can be found on the classpath - aborting. . Either add it in the '$AKKA_HOME/config' directory or add it to the classpath.") } } - val config = Configgy.config - config.registerWithJmx("com.scalablesolutions.akka") - // FIXME fix Configgy JMX subscription to allow management - // config.subscribe { c => configure(c.getOrElse(new Config)) } - config + Configgy.config } private[akka] def runApplicationBootClasses = { - new management.RestfulJMXBoot // add the REST/JMX service val loader = if (HOME.isDefined) { val CONFIG = HOME.get + "/config" @@ -127,11 +119,6 @@ object Kernel extends Logging { remoteServerThread.start } - private[akka] def startManagementService = { - Management("se.scalablesolutions.akka.management") - log.info("Management service started successfully.") - } - def startREST = { val uri = UriBuilder.fromUri(REST_URL).port(REST_PORT).build() diff --git a/kernel/src/main/scala/actor/Actor.scala b/kernel/src/main/scala/actor/Actor.scala index 5e21048fd4..a6dd905da2 100644 --- a/kernel/src/main/scala/actor/Actor.scala +++ b/kernel/src/main/scala/actor/Actor.scala @@ -16,9 +16,6 @@ import nio.protobuf.RemoteProtocol.RemoteRequest import util.Logging import serialization.{Serializer, Serializable, SerializationProtocol} import nio.{RemoteProtocolBuilder, RemoteClient, RemoteServer, RemoteRequestIdFactory} -import management.Management - -import com.twitter.service.Stats sealed abstract class LifecycleMessage case class Init(config: AnyRef) extends LifecycleMessage @@ -53,7 +50,6 @@ object Actor { * @author Jonas Bonér */ trait Actor extends Logging with TransactionManagement { - Stats.getCounter("NrOfActors").incr ActorRegistry.register(this) @volatile private[this] var isRunning: Boolean = false @@ -537,8 +533,6 @@ trait Actor extends Logging with TransactionManagement { } private[this] def handleTrapExit(dead: Actor, reason: Throwable): Unit = { - if (Management.RECORD_STATS) Stats.getCounter("NrOfFailures_" + dead.name).incr - if (trapExit) { if (faultHandler.isDefined) { faultHandler.get match { @@ -556,7 +550,6 @@ trait Actor extends Logging with TransactionManagement { linkedActors.toArray.toList.asInstanceOf[List[Actor]].foreach(_.restart(reason)) private[Actor] def restart(reason: AnyRef) = synchronized { - if (Management.RECORD_STATS) Stats.getCounter("NrOfRestarts_" + name).incr lifeCycleConfig match { case None => throw new IllegalStateException("Server [" + id + "] does not have a life-cycle defined.") diff --git a/kernel/src/main/scala/management/JMX.scala b/kernel/src/main/scala/management/JMX.scala deleted file mode 100755 index bdeea75324..0000000000 --- a/kernel/src/main/scala/management/JMX.scala +++ /dev/null @@ -1,187 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package se.scalablesolutions.akka.kernel.management - -import com.twitter.service.Stats - -import scala.collection.jcl -import scala.collection.mutable.ArrayBuffer - -import java.util.concurrent.ThreadPoolExecutor -import java.lang.management.ManagementFactory -import javax.{management => jmx} -import javax.management.remote.{JMXConnectorServerFactory, JMXServiceURL} - -import kernel.Kernel.config -import kernel.util.Logging - -/** - * @author Jonas Bonér - */ -object Management extends Logging { - val RECORD_STATS = config.getBool("akka.management.record-stats", true) - private var name = "se.scalablesolutions.akka" - private val mbeanServer = ManagementFactory.getPlatformMBeanServer - - def apply() = {} - def apply(packageName: String) = name = packageName - - java.rmi.registry.LocateRegistry.createRegistry(1099) - JMXConnectorServerFactory.newJMXConnectorServer( - new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"), - null, - mbeanServer).start - - registerMBean(new StatisticsMBean, "Stats") - - def registerMBean(mbean: jmx.DynamicMBean, mbeanType: String) = { - val objectName = new jmx.ObjectName(name + ":type=" + mbeanType) - try { mbeanServer.getMBeanInfo(objectName) } catch { - case e: jmx.InstanceNotFoundException => - mbeanServer.registerMBean(mbean, objectName) - } - } - - def getStats(reset: Boolean) = { - var statistics = new ArrayBuffer[Tuple2[String, String]] - statistics += (("current time", (System.currentTimeMillis / 1000).toString)) - statistics += (("akka version", Kernel.VERSION)) - statistics += (("uptime", Kernel.uptime.toString)) - for ((key, value) <- Stats.getJvmStats) statistics += (key, value.toString) - for ((key, value) <- Stats.getCounterStats) statistics += (key, value.toString) - for ((key, value) <- Stats.getTimingStats(reset)) statistics += (key, value.toString) - for ((key, value) <- Stats.getGaugeStats(reset)) statistics += (key, value.toString) - val report = {for ((key, value) <- statistics) yield "STAT %s %s".format(key, value)}.mkString("", "\r\n", "\r\n") - log.info("=========================================\n\t--- Statistics Report ---\n%s=========================================", report) - report - } -} - -/** - * @author Jonas Bonér - */ -class StatisticsMBean extends jmx.DynamicMBean { - def getMBeanInfo = new jmx.MBeanInfo( - "se.scalablesolutions.akka.kernel.management.StatisticsMBean", - "runtime statistics", - getAttributeInfo, - null, null, null, - new jmx.ImmutableDescriptor("immutableInfo=false")) - - def getAttribute(name: String): AnyRef = { - val segments = name.split("_", 2) - segments(0) match { - case "counter" => - Stats.getCounterStats()(segments(1)).asInstanceOf[java.lang.Long] - case "timing" => - val prefix = segments(1).split("_", 2) - val timing = Stats.getTimingStats(false)(prefix(1)) - val x = prefix(0) match { - case "min" => timing.minimum - case "max" => timing.maximum - case "count" => timing.count - case "average" => timing.average - } - x.asInstanceOf[java.lang.Integer] - case "gauge" => - Stats.getGaugeStats(false)(segments(1)).asInstanceOf[java.lang.Double] - } - } - - def getAttributes(names: Array[String]): jmx.AttributeList = { - val rv = new jmx.AttributeList - for (name <- names) rv.add(new jmx.Attribute(name, getAttribute(name))) - rv - } - - def invoke(actionName: String, params: Array[Object], signature: Array[String]): AnyRef = throw new UnsupportedOperationException - def setAttribute(attr: jmx.Attribute): Unit = throw new UnsupportedOperationException - def setAttributes(attrs: jmx.AttributeList): jmx.AttributeList = throw new UnsupportedOperationException - - private def getAttributeInfo: Array[jmx.MBeanAttributeInfo] = { - (Stats.getCounterStats.keys.map { name => - List(new jmx.MBeanAttributeInfo("counter_" + name, "java.lang.Long", "counter", true, false, false)) - } ++ Stats.getTimingStats(false).keys.map { name => - List("min", "max", "average", "count") map { prefix => - new jmx.MBeanAttributeInfo("timing_" + prefix + "_" + name, "java.lang.Integer", "timing", true, false, false) - } - } ++ Stats.getGaugeStats(false).keys.map { name => - List(new jmx.MBeanAttributeInfo("gauge_" + name, "java.lang.Long", "gauge", true, false, false)) - }).toList.flatten[jmx.MBeanAttributeInfo].toArray - } -} - -/** - * @author Jonas Bonér - */ -class ThreadPoolMBean(threadPool: ThreadPoolExecutor) extends jmx.DynamicMBean { - val operations: Array[jmx.MBeanOperationInfo] = Array( - new jmx.MBeanOperationInfo("purge", "", - Array(), "void", jmx.MBeanOperationInfo.ACTION), - new jmx.MBeanOperationInfo("shutdown", "", - Array(), "void", jmx.MBeanOperationInfo.ACTION), - new jmx.MBeanOperationInfo("setCorePoolSize", "", - Array(new jmx.MBeanParameterInfo("corePoolSize", "java.lang.Integer", "")), "void", jmx.MBeanOperationInfo.ACTION), - new jmx.MBeanOperationInfo("setMaximumPoolSize", "", - Array(new jmx.MBeanParameterInfo("maximumPoolSize", "java.lang.Integer", "")), "void", jmx.MBeanOperationInfo.ACTION), - ) - - def getMBeanInfo = new jmx.MBeanInfo( - "se.scalablesolutions.akka.kernel.management.ThreadPoolMBean", - "runtime management", - getAttributeInfo, - null, operations, null, - new jmx.ImmutableDescriptor("immutableInfo=false")) - - def getAttribute(name: String): AnyRef = name match { - case "getActiveCount" => threadPool.getActiveCount.asInstanceOf[AnyRef] - case "getCompletedTaskCount" => threadPool.getCompletedTaskCount.asInstanceOf[AnyRef] - case "getCorePoolSize" => threadPool.getCorePoolSize.asInstanceOf[AnyRef] - case "getLargestPoolSize" => threadPool.getLargestPoolSize.asInstanceOf[AnyRef] - case "getMaximumPoolSize" => threadPool.getMaximumPoolSize.asInstanceOf[AnyRef] - case "getPoolSize" => threadPool.getPoolSize.asInstanceOf[AnyRef] - case "getTaskCount" => threadPool.getTaskCount.asInstanceOf[AnyRef] - } - - private def getAttributeInfo: Array[jmx.MBeanAttributeInfo] = { - Array( - new jmx.MBeanAttributeInfo("getCorePoolSize", "java.lang.Int", "", true, false, false), - new jmx.MBeanAttributeInfo("getMaximumPoolSize", "java.lang.Int", "", true, false, false), - new jmx.MBeanAttributeInfo("getActiveCount", "java.lang.Int", "", true, false, false), - new jmx.MBeanAttributeInfo("getCompletedTaskCount", "java.lang.Long", "", true, false, false), - new jmx.MBeanAttributeInfo("getLargestPoolSize", "java.lang.Int", "", true, false, false), - new jmx.MBeanAttributeInfo("getPoolSize", "java.lang.Int", "", true, false, false), - new jmx.MBeanAttributeInfo("getTaskCount", "java.lang.Long", "", true, false, false)) - } - - def getAttributes(names: Array[String]): jmx.AttributeList = { - val rv = new jmx.AttributeList - for (name <- names) rv.add(new jmx.Attribute(name, getAttribute(name))) - rv - } - - def invoke(actionName: String, params: Array[Object], signature: Array[String]): AnyRef = { - try { - actionName match { - case "purge" => threadPool.purge - case "shutdown" => threadPool.shutdown - case "setCorePoolSize" => - params match { - case Array(corePoolSize: java.lang.Integer) => threadPool.setCorePoolSize(corePoolSize.intValue) - case _ => throw new Exception("Bad signature " + params.toList.toString) - } - case "setMaximumPoolSize" => - params match { - case Array(maximumPoolSize: java.lang.Integer) => threadPool.setMaximumPoolSize(maximumPoolSize.intValue) - case _ => throw new Exception("Bad signature " + params.toList.toString) - } - } - } catch { case e: Exception => throw new jmx.MBeanException(e) } - "Success" - } - - def setAttribute(attr: jmx.Attribute): Unit = throw new UnsupportedOperationException - def setAttributes(attrs: jmx.AttributeList): jmx.AttributeList = throw new UnsupportedOperationException -} diff --git a/kernel/src/main/scala/management/RestfulJMX.scala b/kernel/src/main/scala/management/RestfulJMX.scala deleted file mode 100755 index 05a5aac2a5..0000000000 --- a/kernel/src/main/scala/management/RestfulJMX.scala +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package se.scalablesolutions.akka.kernel.management - -import se.scalablesolutions.akka.kernel.actor.{SupervisorFactory, Actor} -import se.scalablesolutions.akka.kernel.config.ScalaConfig._ -import se.scalablesolutions.akka.kernel.util.Logging - -import javax.ws.rs.core.MultivaluedMap -import javax.ws.rs.{GET, POST, Path, QueryParam, Produces, WebApplicationException, Consumes} -import javax.management._ -import javax.management.remote.{JMXConnector, JMXConnectorFactory, JMXServiceURL} -import javax.servlet.http.{HttpServletRequest, HttpServletResponse} -import java.util.concurrent.ConcurrentHashMap - -/** - * REST interface to Akka's JMX service. - *

- * Here is an example that retreives the current number of Actors. - *

- * http://localhost:9998/jmx
- *   ?service=service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
- *   &component=se.scalablesolutions.akka:type=Stats
- *   &attribute=counter_NrOfActors
- * 
- */ -@Path("/jmx") -class RestfulJMX extends Actor with Logging { - private case class Request(service: String, component: String, attribute: String) - - private val connectors = new ConcurrentHashMap[String, JMXConnector] - - @GET - @Produces(Array("text/plain")) - def queryJMX( - @QueryParam("service") service: String, - @QueryParam("component") component: String, - @QueryParam("attribute") attribute: String): String= - (this !! Request(service, component, attribute)).getOrElse("Error in REST JMX management service") - - override def receive: PartialFunction[Any, Unit] = { - case Request(service, component, attribute) => reply(retrieveAttribute(service, component, attribute)) - } - - private def retrieveAttribute(service: String, component: String, attribute: String): String = { - try { - var connector = connectors.putIfAbsent(service, JMXConnectorFactory.connect(new JMXServiceURL(service))) - connector.getMBeanServerConnection.getAttribute(new ObjectName(component), attribute).toString - } catch { - case e: Exception => - if (connectors.contains(service)) connectors.remove(service) - throw e - } - } -} - -/** - * REST interface to Akka's statistics recorder. - *

- * Here is an example that retreives a statistics report. - *

- * http://localhost:9998/stats?reset=true
- * 
- */ -@Path("/stats") -class StatisticsReporter extends Actor with Logging { - private case class Stats(reset: Boolean) - @GET - @Produces(Array("text/html")) - def stats(@QueryParam("reset") reset: String): scala.xml.Elem = - (this !! Stats(java.lang.Boolean.valueOf(reset).booleanValue)).getOrElse(

Error in REST JMX management service

) - - override def receive: PartialFunction[Any, Unit] = { - case Stats(reset) => reply(
{Management.getStats(reset)}
) - } -} - -class RestfulJMXBoot extends Logging { - log.info("Booting Restful JMX servivce") - object factory extends SupervisorFactory { - override def getSupervisorConfig: SupervisorConfig = { - SupervisorConfig( - RestartStrategy(OneForOne, 3, 100), - Supervise( - new RestfulJMX, - LifeCycle(Permanent, 100)) :: - Supervise( - new StatisticsReporter, - LifeCycle(Permanent, 100)) :: - Nil) - } - } - factory.newSupervisor.startSupervisor -} diff --git a/kernel/src/main/scala/management/ScalaJMX.scala b/kernel/src/main/scala/management/ScalaJMX.scala deleted file mode 100755 index b4a7800f88..0000000000 --- a/kernel/src/main/scala/management/ScalaJMX.scala +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package se.scalablesolutions.akka.kernel.management - -import javax.management._ -import java.lang.management._ - -/* -object ScalaJMX { - - val mbeanServer = ManagementFactory.getPlatformMBeanServer - - def register(t: AnyRef, i: Class, name: ObjectName) = mbeanServer.registerMBean(new StandardMBean(t, i), name) - def registerBean(bean: DynamicMBean, name: ObjectName): ObjectInstance = mbeanServer.registerMBean(bean, name) - def register(t: AnyRef, name: String): ObjectInstance = register(t, beanClass(t), name) - - def info(name: ObjectName): SBean = mbeanServer.getMBeanInfo(name) - def bean(name: ObjectName): SBeanInfo = convBeanInfo(name, mbeanServer.getMBeanInfo(name)) - def invoke(name: ObjectName, operationName: String, params: Array[Object], signature: Array[String]): Object = - mbeanServer.invoke(name, operationName, params, signature) - def call(name: ObjectName, operationName: String): Object = invoke(name, operationName, Array[Object](), Array[String]()) - - def get(name: ObjectName, attribute: String) = mbeanServer.getAttribute(name, attribute) - def set(name: ObjectName, attribute: String, value: Object) = mbeanServer.setAttribute(name, new Attribute(attribute, value)) - - implicit def instanceToName(oi: ObjectInstance) = oi.getObjectName() - implicit def stringToName(name: String) = ObjectName.getInstance(name) - implicit def convBean(bi: MBeanInfo):SBean = SBean(bi.getClassName(), bi.getDescription(), bi.getAttributes(), bi.getNotifications(), bi.getOperations(), bi.getConstructors()) - implicit def seqToArr(seq: Seq[AnyRef]): Array[Object] = seq.toArray - - def convBeanInfo(name: ObjectName, bi: MBeanInfo):SBeanInfo = new SBeanInfo(name, bi.getClassName(), bi.getDescription(), bi.getAttributes(), bi.getNotifications(), bi.getOperations(), bi.getConstructors()) - - implicit def convAttrs(attrs: Array[MBeanAttributeInfo]): Seq[SAttr] = - for (val a <- attrs) yield a - implicit def convParams(params: Array[MBeanParameterInfo]): Seq[SParameter] = - for (val p <- params) yield p - implicit def convNotes(notes: Array[MBeanNotificationInfo]): Seq[SNotification] = - for (val p <- notes) yield p - implicit def convCons(cons: Array[MBeanConstructorInfo]): Seq[SConstructor] = - for (val p <- cons) yield p - implicit def convOps(cons: Array[MBeanOperationInfo]): Seq[SOperation] = - for (val p <- cons) yield p - - implicit def convAttr(attr: MBeanAttributeInfo) = SAttr(attr.getName(), attr.getDescription(), attr.getType(), attr.isIs(), attr.isReadable(), attr.isWritable()) - implicit def convNote(note: MBeanNotificationInfo) = SNotification(note.getName(), note.getDescription(), note.getNotifTypes()) - implicit def convOp(op: MBeanOperationInfo):SOperation = SOperation(op.getName(), op.getDescription(), op.getImpact(), op.getReturnType(), op.getSignature()) - implicit def convCon(con: MBeanConstructorInfo):SConstructor = SConstructor(con getName, con getDescription, con getSignature) - implicit def convParam(p: MBeanParameterInfo) = SParameter(p getName, p getDescription, p getType) - - private def beanClass(t: AnyRef) = Class.forName(t.getClass().getName() + "MBean") -} - -class MBean(mbeanInterface: String) extends StandardMBean(Class.forName(mbeanInterface)) - -abstract class SFeature(val name: String, val description: String) - -case class SBean(className: String, description: String, - attrs: Seq[SAttr], notes: Seq[SNotification], - ops: Seq[SOperation], cons: Seq[SConstructor]) { - def writable = attrs.toList.filter(sa => sa.writable) -} - -class SBeanInfo(name: ObjectName, className: String, description: String, - attrs: Seq[SAttr], notes: Seq[SNotification], - ops: Seq[SOperation], cons: Seq[SConstructor]) -extends SBean(className, description, attrs, notes, ops, cons) { - - def get(attribute: String) = SJMX.get(name, attribute) - def set(attribute: String, value: Object) = SJMX.set(name, attribute, value) - def call(opName: String) = SJMX.call(name, opName) -} - -case class SAttr( - override val name: String, - override val description: String, - jmxType: String, isIs: boolean, readable: boolean, writable: boolean -) extends SFeature(name, description) - -case class SNotification( - override val name: String, - override val description: String, - notifTypes: Array[String]) extends SFeature(name, description) - -case class SOperation( - override val name: String, - override val description: String, - impact: int, - returnType: String, - signature: Seq[SParameter]) extends SFeature(name, description) - -case class SParameter( - override val name: String, - override val description: String, - jmxType: String) extends SFeature(name, description) - -case class SConstructor( - override val name: String, - override val description: String, - signature: Seq[SParameter]) extends SFeature(name, description) - -*/ - -/* -package com.soletta.spipe; - -import javax.management.{StandardMBean,ObjectName,MBeanInfo}; - -class SPipe extends MBean("com.soletta.spipe.SPipeMBean") with SPipeMBean { - - import Console.println; - import SJMX._; - - private var desc: String = "Yipe!"; - - def go = { - val oname: ObjectName = "default:name=SPipe"; - val instance = SJMX.registerBean(this, oname); - - set(oname, "Factor", "Hello!"); - println(get(oname, "Factor")); - - val SBean(n, d, Seq(_, a2, a3, _*), _, ops, _) = info(oname); - println("Bean name is " + n + ", description is " + d); - println("Second attribute is " + a2); - println("Third attribute is " + a3); - println("Writable attributes are " + info(oname).writable); - println("Ops: " + ops); - - val x = - - {ops.toList.map(o => )} - ; - - println(x); - - val inf = bean(oname); - inf.call("start"); - println(inf.get("Factor")); - - } - - def getName = "SPipe!"; - def setDescription(d: String) = desc = d; - override def getDescription() = desc; - def getFactor = desc; - def setFactor(s: String) = desc = s; - def isHappy = true; - - override def getDescription(info: MBeanInfo) = desc; - -} - -object PipeMain { - def main(args: Array[String]): unit = { - (new SPipe) go; - } -} - -trait SPipeMBean { - def getName: String; - def getDescription: String = getName; - def setDescription(d: String): unit; - def getFactor: String; - def setFactor(s: String): unit; - def isHappy: boolean; - - def start() = { Console.println("Starting"); } - def stop() = { } -*/ diff --git a/kernel/src/main/scala/nio/RemoteClient.scala b/kernel/src/main/scala/nio/RemoteClient.scala index e91173c4f7..0ee67950e2 100644 --- a/kernel/src/main/scala/nio/RemoteClient.scala +++ b/kernel/src/main/scala/nio/RemoteClient.scala @@ -12,7 +12,6 @@ import kernel.actor.{Exit, Actor} import kernel.reactor.{DefaultCompletableFutureResult, CompletableFutureResult} import serialization.{Serializer, Serializable, SerializationProtocol} import kernel.util.Logging -import kernel.management.Management import org.jboss.netty.bootstrap.ClientBootstrap import org.jboss.netty.channel._ @@ -22,8 +21,6 @@ import org.jboss.netty.handler.codec.protobuf.{ProtobufDecoder, ProtobufEncoder} import scala.collection.mutable.HashMap -import com.twitter.service.Stats - /** * @author Jonas Bonér */ @@ -48,8 +45,6 @@ object RemoteClient extends Logging { */ class RemoteClient(hostname: String, port: Int) extends Logging { val name = "RemoteClient@" + hostname - val NR_OF_BYTES_SENT = Stats.getCounter("NrOfBytesSent_" + name) - val NR_OF_MESSAGES_SENT = Stats.getCounter("NrOfMessagesSent_" + name) @volatile private var isRunning = false private val futures = new ConcurrentHashMap[Long, CompletableFutureResult] @@ -91,10 +86,6 @@ class RemoteClient(hostname: String, port: Int) extends Logging { } def send(request: RemoteRequest): Option[CompletableFutureResult] = if (isRunning) { - if (Management.RECORD_STATS) { - NR_OF_BYTES_SENT.incr(request.getSerializedSize) - NR_OF_MESSAGES_SENT.incr - } if (request.getIsOneWay) { connection.getChannel.write(request) None @@ -145,9 +136,6 @@ class RemoteClientHandler(val name: String, val supervisors: ConcurrentMap[String, Actor]) extends SimpleChannelUpstreamHandler with Logging { - val NR_OF_BYTES_RECEIVED = Stats.getCounter("NrOfBytesReceived_" + name) - val NR_OF_MESSAGES_RECEIVED = Stats.getCounter("NrOfMessagesReceived_" + name) - override def handleUpstream(ctx: ChannelHandlerContext, event: ChannelEvent) = { if (event.isInstanceOf[ChannelStateEvent] && event.asInstanceOf[ChannelStateEvent].getState != ChannelState.INTEREST_OPS) { log.debug(event.toString) @@ -160,10 +148,6 @@ class RemoteClientHandler(val name: String, val result = event.getMessage if (result.isInstanceOf[RemoteReply]) { val reply = result.asInstanceOf[RemoteReply] - if (Management.RECORD_STATS) { - NR_OF_MESSAGES_RECEIVED.incr - NR_OF_BYTES_RECEIVED.incr(reply.getSerializedSize) - } log.debug("Received RemoteReply[\n%s]", reply.toString) val future = futures.get(reply.getId) if (reply.getIsSuccessful) { diff --git a/kernel/src/main/scala/nio/RemoteServer.scala b/kernel/src/main/scala/nio/RemoteServer.scala index bbc223247e..76a7be6859 100644 --- a/kernel/src/main/scala/nio/RemoteServer.scala +++ b/kernel/src/main/scala/nio/RemoteServer.scala @@ -13,7 +13,6 @@ import kernel.util._ import protobuf.RemoteProtocol import protobuf.RemoteProtocol.{RemoteReply, RemoteRequest} import serialization.{Serializer, Serializable, SerializationProtocol} -import kernel.management.Management import org.jboss.netty.bootstrap.ServerBootstrap import org.jboss.netty.channel._ @@ -21,8 +20,6 @@ import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory import org.jboss.netty.handler.codec.frame.{LengthFieldBasedFrameDecoder, LengthFieldPrepender} import org.jboss.netty.handler.codec.protobuf.{ProtobufDecoder, ProtobufEncoder} -import com.twitter.service.Stats - /** * @author Jonas Bonér */ @@ -86,11 +83,6 @@ class RemoteServerPipelineFactory(name: String, loader: Option[ClassLoader]) ext */ @ChannelPipelineCoverage { val value = "all" } class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassLoader]) extends SimpleChannelUpstreamHandler with Logging { - val NR_OF_BYTES_SENT = Stats.getCounter("NrOfBytesSent_" + name) - val NR_OF_BYTES_RECEIVED = Stats.getCounter("NrOfBytesReceived_" + name) - val NR_OF_MESSAGES_SENT = Stats.getCounter("NrOfMessagesSent_" + name) - val NR_OF_MESSAGES_RECEIVED = Stats.getCounter("NrOfMessagesReceived_" + name) - private val activeObjectFactory = new ActiveObjectFactory private val activeObjects = new ConcurrentHashMap[String, AnyRef] private val actors = new ConcurrentHashMap[String, Actor] @@ -115,10 +107,6 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL } private def handleRemoteRequest(request: RemoteRequest, channel: Channel) = { - if (Management.RECORD_STATS) { - NR_OF_MESSAGES_RECEIVED.incr - NR_OF_BYTES_RECEIVED.incr(request.getSerializedSize) - } log.debug("Received RemoteRequest[\n%s]", request.toString) if (request.getIsActor) dispatchToActor(request, channel) else dispatchToActiveObject(request, channel) @@ -143,10 +131,6 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid) val replyMessage = replyBuilder.build channel.write(replyMessage) - if (Management.RECORD_STATS) { - NR_OF_MESSAGES_SENT.incr - NR_OF_BYTES_SENT.incr(replyMessage.getSerializedSize) - } } catch { case e: Throwable => log.error("Could not invoke remote actor [%s] due to: %s", request.getTarget, e) @@ -159,10 +143,6 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid) val replyMessage = replyBuilder.build channel.write(replyMessage) - if (Management.RECORD_STATS) { - NR_OF_MESSAGES_SENT.incr - NR_OF_BYTES_SENT.incr(replyMessage.getSerializedSize) - } } } } @@ -190,10 +170,6 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid) val replyMessage = replyBuilder.build channel.write(replyMessage) - if (Management.RECORD_STATS) { - NR_OF_MESSAGES_SENT.incr - NR_OF_BYTES_SENT.incr(replyMessage.getSerializedSize) - } } } catch { case e: InvocationTargetException => @@ -207,10 +183,6 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid) val replyMessage = replyBuilder.build channel.write(replyMessage) - if (Management.RECORD_STATS) { - NR_OF_MESSAGES_SENT.incr - NR_OF_BYTES_SENT.incr(replyMessage.getSerializedSize) - } case e: Throwable => log.error("Could not invoke remote active object [%s :: %s] due to: %s", request.getMethod, request.getTarget, e) e.printStackTrace @@ -222,10 +194,6 @@ class RemoteServerHandler(val name: String, val applicationLoader: Option[ClassL if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid) val replyMessage = replyBuilder.build channel.write(replyMessage) - if (Management.RECORD_STATS) { - NR_OF_MESSAGES_SENT.incr - NR_OF_BYTES_SENT.incr(replyMessage.getSerializedSize) - } } } diff --git a/kernel/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala b/kernel/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala index a4c7a0fc80..65c71da8f8 100644 --- a/kernel/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala +++ b/kernel/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala @@ -10,14 +10,9 @@ */ package se.scalablesolutions.akka.kernel.reactor -import kernel.management.Management - -import java.util.{LinkedList, Queue, List} - -import com.twitter.service.Stats +import java.util.{LinkedList, List} class EventBasedSingleThreadDispatcher(name: String) extends MessageDispatcherBase(name) { - val NR_OF_PROCESSED_MESSAGES = Stats.getCounter("NrOfProcessedMessage_" + name) def start = if (!active) { active = true val messageDemultiplexer = new EventBasedSingleThreadDemultiplexer(queue) @@ -28,7 +23,6 @@ class EventBasedSingleThreadDispatcher(name: String) extends MessageDispatcherBa messageDemultiplexer.select } catch { case e: InterruptedException => active = false } val selectedInvocations = messageDemultiplexer.acquireSelectedInvocations - if (Management.RECORD_STATS) NR_OF_PROCESSED_MESSAGES.incr(selectedInvocations.size) val iter = selectedInvocations.iterator while (iter.hasNext) { val invocation = iter.next diff --git a/kernel/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala b/kernel/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala index 1f96769374..101f7cc0dd 100644 --- a/kernel/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala +++ b/kernel/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala @@ -4,16 +4,12 @@ package se.scalablesolutions.akka.kernel.reactor -import kernel.management.{Management, ThreadPoolMBean} - import java.util.concurrent._ import locks.ReentrantLock import atomic.{AtomicLong, AtomicInteger} import ThreadPoolExecutor.CallerRunsPolicy import java.util.{Collection, HashSet, HashMap, LinkedList, List} -import com.twitter.service.Stats - /** * Implements the Reactor pattern as defined in: [http://www.cs.wustl.edu/~schmidt/PDF/reactor-siemens.pdf].
* See also this article: [http://today.java.net/cs/user/print/a/350]. @@ -63,7 +59,6 @@ import com.twitter.service.Stats class EventBasedThreadPoolDispatcher(name: String, private val concurrentMode: Boolean) extends MessageDispatcherBase(name) { def this(name: String) = this(name, false) - val NR_OF_PROCESSED_MESSAGES = Stats.getCounter("NrOfProcessedMessages_" + name) private val NR_START_THREADS = 16 private val NR_MAX_THREADS = 128 private val KEEP_ALIVE_TIME = 60000L // default is one minute @@ -79,7 +74,6 @@ class EventBasedThreadPoolDispatcher(name: String, private val concurrentMode: B def start = if (!active) { active = true - Management.registerMBean(new ThreadPoolMBean(threadPoolBuilder), "ThreadPool_" + name) /** * This dispatcher code is based on code from the actorom actor framework by Sergio Bossa [http://code.google.com/p/actorom/]. @@ -95,7 +89,6 @@ class EventBasedThreadPoolDispatcher(name: String, private val concurrentMode: B } catch { case e: InterruptedException => active = false } val selectedInvocations = messageDemultiplexer.acquireSelectedInvocations val reservedInvocations = reserve(selectedInvocations) - if (Management.RECORD_STATS) NR_OF_PROCESSED_MESSAGES.incr(reservedInvocations.size) val it = reservedInvocations.entrySet.iterator while (it.hasNext) { val entry = it.next diff --git a/kernel/src/main/scala/reactor/MessageDispatcherBase.scala b/kernel/src/main/scala/reactor/MessageDispatcherBase.scala index d47db197a5..27ed887c7a 100644 --- a/kernel/src/main/scala/reactor/MessageDispatcherBase.scala +++ b/kernel/src/main/scala/reactor/MessageDispatcherBase.scala @@ -4,14 +4,10 @@ package se.scalablesolutions.akka.kernel.reactor -import kernel.management.Management - import java.util.{LinkedList, Queue, List} import java.util.concurrent.{TimeUnit, BlockingQueue} import java.util.HashMap -import com.twitter.service.Stats - abstract class MessageDispatcherBase(val name: String) extends MessageDispatcher { //val CONCURRENT_MODE = kernel.Kernel.config.getBool("akka.actor.concurrent-mode", false) @@ -23,12 +19,6 @@ abstract class MessageDispatcherBase(val name: String) extends MessageDispatcher protected var selectorThread: Thread = _ protected val guard = new Object - if (Management.RECORD_STATS) { - Stats.makeGauge("SizeOfBlockingQueue_" + name) { - guard.synchronized { blockingQueue.size.toDouble } - } - } - def messageQueue = queue def registerHandler(key: AnyRef, handler: MessageInvoker) = guard.synchronized { @@ -55,12 +45,6 @@ class ReactiveMessageQueue(name: String) extends MessageQueue { private[kernel] val queue: Queue[MessageInvocation] = new LinkedList[MessageInvocation] @volatile private var interrupted = false - if (Management.RECORD_STATS) { - Stats.makeGauge("SizeOfReactiveQueue_" + name) { - queue.synchronized { queue.size.toDouble } - } - } - def append(handle: MessageInvocation) = queue.synchronized { queue.offer(handle) queue.notifyAll diff --git a/kernel/src/main/scala/reactor/ThreadBasedDispatcher.scala b/kernel/src/main/scala/reactor/ThreadBasedDispatcher.scala index fbae2d8c99..28f9ca2761 100644 --- a/kernel/src/main/scala/reactor/ThreadBasedDispatcher.scala +++ b/kernel/src/main/scala/reactor/ThreadBasedDispatcher.scala @@ -4,13 +4,10 @@ package se.scalablesolutions.akka.kernel.reactor -import com.twitter.service.Stats - import java.util.concurrent.LinkedBlockingQueue import java.util.Queue import kernel.actor.{Actor, ActorMessageInvoker} -import kernel.management.Management /** * Dedicates a unique thread for each actor passed in as reference. Served through its messageQueue. @@ -19,8 +16,6 @@ import kernel.management.Management class ThreadBasedDispatcher private[kernel] (val name: String, val messageHandler: MessageInvoker) extends MessageDispatcher { def this(actor: Actor) = this(actor.getClass.getName, new ActorMessageInvoker(actor)) - val NR_OF_PROCESSED_MESSAGES = Stats.getCounter("NrOfProcessedMessages_" + name) - private val queue = new BlockingMessageQueue(name) private var selectorThread: Thread = _ @volatile private var active: Boolean = false @@ -33,7 +28,6 @@ class ThreadBasedDispatcher private[kernel] (val name: String, val messageHandle override def run = { while (active) { try { - if (Management.RECORD_STATS) NR_OF_PROCESSED_MESSAGES.incr messageHandler.invoke(queue.take) } catch { case e: InterruptedException => active = false } } @@ -52,12 +46,6 @@ class ThreadBasedDispatcher private[kernel] (val name: String, val messageHandle } class BlockingMessageQueue(name: String) extends MessageQueue { - if (Management.RECORD_STATS) { - Stats.makeGauge("SizeOfBlockingQueue_" + name) { - queue.size.toDouble - } - } - // FIXME: configure the LBQ private val queue = new LinkedBlockingQueue[MessageInvocation] def append(handle: MessageInvocation) = queue.put(handle) diff --git a/samples-java/akka-samples-java.iml b/samples-java/akka-samples-java.iml index 243de784f2..f2620f9234 100644 --- a/samples-java/akka-samples-java.iml +++ b/samples-java/akka-samples-java.iml @@ -9,29 +9,30 @@ - - + + - - + + - - - - + + + + + @@ -39,13 +40,10 @@ - + + - - - - @@ -63,10 +61,6 @@ - - - - @@ -76,7 +70,6 @@ -
diff --git a/samples-scala/akka-samples-scala.iml b/samples-scala/akka-samples-scala.iml index b864b09ba5..2dbee0009e 100644 --- a/samples-scala/akka-samples-scala.iml +++ b/samples-scala/akka-samples-scala.iml @@ -5,7 +5,7 @@
- + @@ -14,24 +14,20 @@ - - + + - - + + - - - - @@ -49,13 +45,10 @@ - + + - - - - @@ -82,7 +75,6 @@ - From d48afd0bdb8bb58e2064fbcfcff33fb7911840ce Mon Sep 17 00:00:00 2001 From: jboner Date: Thu, 20 Aug 2009 19:22:13 +0200 Subject: [PATCH 09/35] added enforcer plugin to enforce Java 1.6 --- akka.iws | 104 +----------------- .../se/foldleft/cassidy/0.1/cassidy-0.1.jar | Bin 34784 -> 0 bytes .../se/foldleft/cassidy/0.1/cassidy-0.1.pom | 8 -- pom.xml | 25 +++++ 4 files changed, 28 insertions(+), 109 deletions(-) delete mode 100644 embedded-repo/se/foldleft/cassidy/0.1/cassidy-0.1.jar delete mode 100755 embedded-repo/se/foldleft/cassidy/0.1/cassidy-0.1.pom diff --git a/akka.iws b/akka.iws index 1793f4a646..1c56c36663 100644 --- a/akka.iws +++ b/akka.iws @@ -6,21 +6,7 @@ - - - - - - - - - - - - - - @@ -101,91 +87,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1840,7 +1742,7 @@ - + @@ -1849,7 +1751,7 @@ - + diff --git a/embedded-repo/se/foldleft/cassidy/0.1/cassidy-0.1.jar b/embedded-repo/se/foldleft/cassidy/0.1/cassidy-0.1.jar deleted file mode 100644 index 43fdb1952f0931b0d09088d21e8d0be99af519e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34784 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 diff --git a/embedded-repo/se/foldleft/cassidy/0.1/cassidy-0.1.pom b/embedded-repo/se/foldleft/cassidy/0.1/cassidy-0.1.pom deleted file mode 100755 index 35af36dcb7..0000000000 --- a/embedded-repo/se/foldleft/cassidy/0.1/cassidy-0.1.pom +++ /dev/null @@ -1,8 +0,0 @@ - - - 4.0.0 - org.apache.camel - camel-core - 2.0-SNAPSHOT - jar - \ No newline at end of file diff --git a/pom.xml b/pom.xml index abb46463bc..ab42362923 100644 --- a/pom.xml +++ b/pom.xml @@ -235,9 +235,34 @@ org.apache.maven.plugins maven-antrun-plugin + + org.apache.maven.plugins + maven-enforcer-plugin + 1.0-beta-1 + + + enforce-java + + enforce + + + + + 1.6.0 + + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 1.0-beta-1 + org.apache.felix maven-bundle-plugin From bc7b9ddb854a5d7b088d819add09a5914e217fc0 Mon Sep 17 00:00:00 2001 From: jboner Date: Fri, 21 Aug 2009 14:02:14 +0200 Subject: [PATCH 10/35] parameterized all spawn/start/link methods + enhanced maintanance scripts --- kernel/src/main/scala/actor/Actor.scala | 16 ++++++------- scripts/convert_tabs_to_spaces.sh | 30 +++++++++++++++++-------- scripts/dos_to_unix.sh | 3 +++ 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/kernel/src/main/scala/actor/Actor.scala b/kernel/src/main/scala/actor/Actor.scala index a6dd905da2..cf4dc132ca 100644 --- a/kernel/src/main/scala/actor/Actor.scala +++ b/kernel/src/main/scala/actor/Actor.scala @@ -358,8 +358,8 @@ trait Actor extends Logging with TransactionManagement { *

* To be invoked from within the actor itself. */ - protected[this] def spawn(actorClass: Class[_]): Actor = { - val actor = actorClass.newInstance.asInstanceOf[Actor] + protected[this] def spawn[T <: Actor](actorClass: Class[T]): T = { + val actor = actorClass.newInstance.asInstanceOf[T] actor.dispatcher = dispatcher actor.mailbox = mailbox actor.start @@ -371,8 +371,8 @@ trait Actor extends Logging with TransactionManagement { *

* To be invoked from within the actor itself. */ - protected[this] def spawnRemote(actorClass: Class[_]): Actor = { - val actor = actorClass.newInstance.asInstanceOf[Actor] + protected[this] def spawnRemote[T <: Actor](actorClass: Class[T]): T = { + val actor = actorClass.newInstance.asInstanceOf[T] actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT) actor.dispatcher = dispatcher actor.mailbox = mailbox @@ -385,8 +385,8 @@ trait Actor extends Logging with TransactionManagement { *

* To be invoked from within the actor itself. */ - protected[this] def spawnLink(actorClass: Class[_]): Actor = { - val actor = spawn(actorClass) + protected[this] def spawnLink[T <: Actor](actorClass: Class[T]): T = { + val actor = spawn[T](actorClass) link(actor) actor } @@ -396,8 +396,8 @@ trait Actor extends Logging with TransactionManagement { *

* To be invoked from within the actor itself. */ - protected[this] def spawnLinkRemote(actorClass: Class[_]): Actor = { - val actor = spawn(actorClass) + protected[this] def spawnLinkRemote[T <: Actor](actorClass: Class[T]): T = { + val actor = spawn[T](actorClass) actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT) link(actor) actor diff --git a/scripts/convert_tabs_to_spaces.sh b/scripts/convert_tabs_to_spaces.sh index fe0d21940e..51beee7a20 100755 --- a/scripts/convert_tabs_to_spaces.sh +++ b/scripts/convert_tabs_to_spaces.sh @@ -1,11 +1,23 @@ #!/bin/sh -echo "converting all tabs to 2 spaces" -find . -type f -name '*.html' -exec sed -i 's/[\t]/ /' {} \; - -#find . -name "*.html" |while read line -#do -# expand -i $line > $line.new -# mv -f $line.new $line -#done - +find . -name "*.java" |while read line +do + expand $line > $line.new + mv -f $line.new $line +done +find . -name "*.scala" |while read line +do + expand $line > $line.new + mv -f $line.new $line +done +find . -name "*.html" |while read line +do + expand $line > $line.new + mv -f $line.new $line +done +find . -name "*.xml" |while read line +do + expand $line > $line.new + mv -f $line.new $line +done +echo "converted all tabs to 2 spaces" exit 0 diff --git a/scripts/dos_to_unix.sh b/scripts/dos_to_unix.sh index 456541ed83..0bb84820aa 100755 --- a/scripts/dos_to_unix.sh +++ b/scripts/dos_to_unix.sh @@ -1,2 +1,5 @@ #!/bin/sh find . -name *.scala -exec dos2unix {} \; +find . -name *.java -exec dos2unix {} \; +find . -name *.html -exec dos2unix {} \; +find . -name *.xml -exec dos2unix {} \; From 01258e24ed2d12bcef85084055dc4e5ed08a0781 Mon Sep 17 00:00:00 2001 From: jboner Date: Sun, 23 Aug 2009 17:56:02 +0200 Subject: [PATCH 11/35] removed idea files from git --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 99b643d34d..9ba24d1048 100755 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,7 @@ tm.out _dump WEB-INF .DS_Store +*.iws +*.ipr +*.iml From 3e5132efa41d9422f181b87c218b8546392d6eda Mon Sep 17 00:00:00 2001 From: jboner Date: Thu, 27 Aug 2009 18:26:43 +0200 Subject: [PATCH 12/35] init commit of AMQP module --- akka.ipr | 403 ++-- akka.iws | 1768 +---------------- .../multiverse/0.3/multiverse-0.3.jar | Bin 0 -> 470262 bytes fun-test-java/akka-fun-test-java.iml | 9 +- kernel/akka-kernel.iml | 9 +- pom.xml | 1 + samples-java/akka-samples-java.iml | 9 +- samples-lift/akka-samples-lift.iml | 23 +- samples-scala/akka-samples-scala.iml | 9 +- 9 files changed, 236 insertions(+), 1995 deletions(-) create mode 100644 embedded-repo/org/multiverse/multiverse/0.3/multiverse-0.3.jar diff --git a/akka.ipr b/akka.ipr index e9a88e3c2a..b5b5f4d0bd 100644 --- a/akka.ipr +++ b/akka.ipr @@ -63,45 +63,6 @@ - - - - - - - - - - - - - @@ -411,10 +372,6 @@ - - @@ -543,19 +500,10 @@ - - - - - - - - - - + @@ -564,9 +512,6 @@ - - @@ -584,97 +529,8 @@ - - - - - - - - - - - - - - - - - - localhost - 5050 - - - - -

hV~`1ye#Vd#IX5KI|F(m`KQq1=65ClkF7Nh@?voKH{>tO(q~S5uNqcI? z_oF(A6O-M)NnQN6D(uz5Zwnvov|sgV4QIKkl-wq36T>wleU6xhi*RVa@XpK6>V24 za@r_snfvbeo#K1lZ>1c?m+D^?IvlgnJtwnSaj#GgXWPQIFGp|h*sFO+?fw@Hqe~ny z?{Yr`WbK#sd2J+lAYuQPY1NbEW-mYVIbGDQq%WjOWp$QO@EdOPu$H(T z7ufDi^fP`^cO+Jod4E{en@_gyD(>W4zBemxUER^3*>)(^<5!;Ry5-#JscqtWr{1z* z62AOe+ev)(*IPml*Z$h4ZMAF7374sgoAsjYu1Brq>p0xp0;JYnrx| z%#QsZQDWQS9KOb@){lAD&s|eZ>`U)|ZSwfF)^uT6ldf=IujH9qCk|{f?67S6WVzO3 zt8#nwT-kRzufK*=nmyZi;KQ3N*+tP;9-A2X{7YAsaPx0_{)0tgS#?l~K~xi)UihEq zI#RB+rp9vv-W96aPkM3s(a}AZejc{IdSSAobEDjR#;W!Rv(@~~YefFCC0^Fu=XOo& zr&ZEa?f8SI?oa&XGq3UWmT$p)A7q@j-0I9#><+wDoUUYUV*hD}r^VTo9Tyka##=T7 z{$u*a{8EJP!gjN-ynpBS{aowvQ?xD6+k~rq#k#g_c@NDD`7cLTvX^UGPj?BvtFyNH z$9>zbyXyMBH~Bvp{5-`}*?vvg#_yZDgm=*~!^Vj&^W*wlIP1~IPAYY;d*(ASFl;3& z>6*ZjZnVF!qsYHyy0N=rm&P2~9rpCnw9`zBE;gv}YP#u8@;Lmv#CnVKw%upn=`7ms zC9Hpu{qSb{Qx$2N<-$7rb1k2LskvYN?aa)df1f|sXW*`w)Y#}L{8vLlBWC?N5T+~Hch>MmsC~w*wkdFBnz&dg9B8QeTg>BBe&+hHm{mpvg zUY850FFm&&+7R$UF#1lC$J$@K2Mq$I&a05#`dVql$6ekN7p{6=P~OcR^!sjt*YuMN zY_F$2?@YM*G*Lst=>F_4HyzA4f-t;6=AOV@?&=eG`6Us}g{hkNJZ zCGT}bS6kOizpeLu);G6WcZ)8L8A&JNTb8^Jd$Ma+K~P%7wdj>woed24?ocV&85S9( zxF_;vv5Wh3QK=cJCvr|LJ8n8H@y{bU0q(ts4Q_f|yu9CfV=k1mqvDaRA ze$ufyrgZr7>C%q8!2Zi841UhCBFYTZ)H{Uua}ldJLlL5ZxZ@)`p}}&HLYt*Kb0QQ z@vUXmu62K8TE!n)~-NE{D zjk4)`L{je`{`*7w^Ap(!{tpKC zmV$Hrg&hUzwym{|@;l}2a&-GD)?1&78X6`jaXR|+Ea)^j;<7(yy?12M-t2eZw0^BN z5$vrqsQKnDncmODWEx?2=iQk*HlNR&JM(V+efv7583&WNVl`f+>hy{n@eGs zDLGvB0%23N#8Qj z&3dsPjn;&>#6J^te{sZiwsrKK=~4NT!d8WB1~bmbhW}X2$Is+A?d7>iC(m9CWb-$! z$&lGtB9RlsZhU0k24~k7H;Y>z@@7u0eaChu>{79JYng3gmtwWxq;qRMN=qIER*PGC zZ>?cj=Hai$8LPE^>NL*zakn?SIxiQMn33p_durBc(`ku69!Uj=w4L0X=XFJzFWhDS zqCLB|oYwt2qvSGoZM4ngUH-AVe(aiJVxPV4ZAD{AwzSjRicsc$pEF74S~^#&U3y`5 zvAMGCk>nwVtIXZjy|Q_0UwmCJ<7;z_>F}SYr(CA5K0Gl+;_vw^1D-iP7Yd~%)U1+H zI@p_*<*D3%mbFd#Vny8j8zG0M`>uQ9?v=bz_se}%yP5VWFJ-+i?iPFf_Uc>4jOB5e z+_knRE~vg&eaZT=@Rsq>jkOyd{jf_qn%_~c7A#Y{MeU?uMRQ%$S&wrG49#2O?NfI$ z{>{5{MBrh`gS}x77H(u#>54zF@39vTyGLHnWU=2|k1rd#TY0_GJ^5Z~-W$bDM;9-R z-r;-k_Y05mg6VrqzbCXvWfjW*+wHzhCzJEjzJB(Lh4PciG@csByj7Oyt@)(!AnJ(! zWjVu#{HQJ6KWW=0>||nKC?YFqo57McqHxv;3Rqp?>iUv3!ogv~1r|;fHCCa_iU+w7 zY`b>c%`HpU{fiMf}}w;!Ak@nsvUv;WPqqgfHRh3Z=KEtkC1 zt`;jd+mXMzG@b#Ko(xm8Ag!`-{0imUH! zYtv-DT#>qfyR9+rjKLHA0`^T}Gw!Sm-??+albIzvXC9dz{_=IziiH^oe4p9gEt>x> zcJ}k>i7)I|A1U~}#b@m_!=5ciJ-*-J3v)i6*pXg5d*YJUvse8tYxe#veDO@0{&w^7 zjnmU#Resa?7WYaeb|qW6(?+)|Gv7Q5EoWo?((>}ljg2KyTPLIy{@PvGEY~47OIO)V ze!+9@_=BJB3;dS3xx`cLB-@Hb)0YUIE&cM)taoPdENia#uN@Oap0P`bde=YX`1nVB zgS^L)f|kCi51m!^J6mT2z7YIby{JHGR%7yUwcc5G57#oicU6~rpct91^ef`BSD^fR zTcx|nQK~1Z6!tniw8?A>&RaI)j5y!L%7WCY;~gi(@`e1B?_GA8?7K~j{bagHf1<$o z#UEMQ7VXt3+9CSX?QH*r58|kK!TbsLsVpW2h7DvjRLo&{0oul%-uZai<}Z1drzvx` zD=wYxG*N&nXz2wn)kn34-Vsl3Ox)}C8>MggzH_~^^?uh~F30Ih)vt0n@4TSCZO73GQJ>3M4k!3l zJu1C&N6c|<{%#S;l|T8)w^t}^z0bL&DNjfDb$$bAz1Y?M!LfL*4Kt=#qud%_IhpHcAkI7+oJV}`)}S8?^9x0Ch3j3Tj$=kXad()L z5@)>k4PJD!Xs6Q8(5L20gWvy%z36MtC9_fQt0nJ?XRpI9{Ry!>{?+-Vsaead&*eNf z#KbmaC~{wR;!AA{>JM8nYvI|u*W|W`f2~?&!`;8}$cHaQvWudxJU21&`JWDMWG}B~ z;wi4xG+H7X{-Ggp&4=@uK4M>DWuR9{SQcK!Z?EAsV|*Bz0wesYEV>N}GDY0?g_?6#r?XP!%-Mv7w3CA%`UBHz!+ zGS@kmTZ$U0Wy;UDblUWV^$mLvr;OrW!{59!{bTEl!~QiS*7TTu$_;UMjy5ltJfr>P z);+Dar`U?Q3(wVAd;8yezN7CZO<(k;dWU>{>byPMzB2GX{wt{VXpW~(qRO@9+m*u( zp>4{}_LqM%or!_LhOC0zLN7TdvAB3{NVNYI2a$hi<(W5wQYUto$BL%vJFp5GDsU=J zn4vT4MBDd;Jl>w$?`{ch`o|>v*Kmf0n>-I_%wlFZK?vzCb+x0Z{?5dc|F76Lh~d?>&aF+vi_1LJ0G_!R*5jR&xkmCV(Phh98QV3 zg(saQUAFZw2}U*E;9INqUFlua`y=0McIsKoQx=z8=B-(KTAF8PYQ49?m+LbAdpc*$ zR$B4dce=^-tbJ$i^2%9c&DAK@@?kTWvEJ67<+L8Zv*WClC07;~i~Kkd+4g;H^0X-l zlev7ve;?{osXQN}!JKayX8R!SMDEKU_iA=-JNYfm5eD8+I>#rb3WyeZq4 zEM3i{p4PUrWZ|{`xtuSrs>X`H(*E52B!A7D+l!VS;wtr7diM9*XX`eo9!&Z6^2*ce zbK8!K=1D`ZLt7X16hkH1gYt?*g(pSt`%$I7sWykGX53fy<@=r}p64RGR(+_tMzFydz7kw)D zw86LeM-wG%R{AXu<`G^gv9jS({`F~zE3SNfkmmhL?s;_M=Hp90H_nKkrf0URX5Z@N zUe!ffflJ&q{q@DQMM9!IPF>1>#1;EzQ3z_*EZ_uiC=Yzok^N%8?Q|Iv&HMHz%R$^ zcW!k=wTB;Wp7CA9TQ~7_!G#|ap76*en#_}b?77FhO^EIBofTINrO;O_a<3{f31eem zcr8ry6c=J37?RG{hDV1Bhl~7Eb77v&iC(a1BwBJ%VeB0&}vhTMT>D zgy+m;xV3xRwR_REnY(`p*JQ*W+O+2Cr)yh(&EB^Y?=Q4Z|(hi zzvo!~`TPETJ;RHG!JLL?IxndFn2^-Jg(KF*tx0~R)s=*}Be9%}5^pA^U2fwDcA7Ag zePWuK*z9v%5fcQGE-M}{2s|>W#h{qi+W5Q6o#_`&Hew%J8S3{h%f8mou*&25 zl!jNvGb2MC{;pWII{D_8o-7{?W6fEdy=g*TSzd-F-_EJ8UTb+)L_qqi#K{P&*_*bo zUNyLSV@;CgveXpeuxkNlXDqyDl$_~$UTfuz(63?h8$KM%`2Os=(zj{itLl?>N~Nw@qQOtLoIP z!GRlmUMj0GF+Gk73YQ2ymD93p#{G-FCq<9HzH_CYIYc!y=$gn&Ew?plmr{dY-?ec) zdMCA8CumL7lsrcDQ>)J(nPu!+wbtqSR;l;5V;Xcr7Ujg4v5AZJP6|rhbfrXWb%x>A zy4ct)rPpp9-Tb&WBxqmKL1opemydnPeimUibyNA%-buG+ugMb93^nZ7Jymi$kFS4K z^`V)%yTxO+AK0@{S7Tb){9U{Ci#D$Q6t}`SB(;SB47V(C(?3|~?RlqD z`}4O>hxFAAm!~GLHT7TO!ExDZwxO!2{qiH9cK)2k$60Z~zGl^iHs=4rN^5m9cS%Ys zhBb$&tyPtoZ!!Cwc57|S#i>iIW|yz>d^~f_!~l1bGNWsk4mlq4IF|V3!ouhje3u(eNN3dkaF{5-{~D;jK77M zr1n(D9V_)Y{e!Xd(4x)4&aqxAKCe;t*~O%>d2*G~WWVfbOV9DGU%TOzZQ|AnZ-?^8 z9xg@iJGo04*XElu+Oj@>sAewl?W*WiRnv)EGqTx4y3eiIX;`}PhGP7e8HtSNrgcaC znN_gq#qqUUHv7#hyp?-u=gpAiE4tp~tpAeoe%7KQ`6b?)8k|d#`7V02i`w>IxUI74 zh4=>BT|9}b`!c0g7p>U$P1-kX;q-a8GgxBFR&NyMz0th*i<-5cMcZSOc{dD-g*GVq z6?Q~^`f^bsP2hKU;ASTKX2JQ3ud(a zKz{L&3CdaqvUm6MXtwWS3KiV+M(JAnrwdMcQ5?(_a~H2&Keyz%-{o5hf4?Q3IA(wN zs9Eb*g2b@ZUMIe{K5frn?>6F_E*^&b^s` z^@rp9Pd3!bx@>yMH|fDbn~A;aPPpk6NvFPJ(#sRLdE(&Qt={WS1a9gV7nV#?k}l5p z)MXRC>_i2p((JuT>jf^Zj@FuFmoVqp?L8ZtwK;D4-ko%qZ~dv)m3w7M4mMXDzI@to zd*zK=Rr>K871tM?a5o9Nd}E8_&j@qR`jgtVZ7PhF(*YkhP{IbZCzvY*_g+8uuS$^YlSNxrbRhq=dd>sghQ=>HuIb&K}?Fs}Vu zcQX0PGo!4<%n#HQSx-EYEq`y(bIU?Gy*Kq+Y}M-45B#%SHEjMH^EMwbK6u&0D~#vh z`HHgY%lnky%Y57|^XH50{+$oG-#kB&T^({%x7z0sU$66#gY3`s4;)vJcdp_2ym4y( z+nP58ZRnSVExjaVbBdLLA&!rj(=)+K2@us(NKs;5PJVJC^c=RiVX?)+p%Qi5e%?^K zJ4wJxbg_e@fhTvM%f2Wr(XK9C4b7`ebvcuBcW=1ayIVTz{hm)w{~P`=9M?}<a_{Bi|l4H`c>;LTdaP0iYLmz9)&1d^wI=Jo3hj~wJpYJ*U+3vZedd;u*TcsJw z4)i6q$%RJ@PX((#k~n_(ZN)NKVI{v~g1nxP-DOup*6dm76Zvz~n($QJ`k0xo#05-!N~5l_zKOhd%`o_y>0*uS5M`HQrXc0? zC&fi^lfS;)bGm(55^HJH^qow)($Z-M7(>I~Ix_y9IaMj`IBN^PlpGq&2S zoRR!#$ua}pIAgupTK{i*x4o6TDsdXvj;}M!(1Ae^8I|YzXdG*Ykc!r)wI}cpEiZf zocP&Urdisf(IYT8MQB5JnO@TUGH31H(@|4(gifZ!{$F+N;;Lm6=NjLf%w)yAEyl)L zE8IrCwL`?U`|-6iO0oJ}i?uh)`Bb;gOY3F}Jn5Ph9;c-xI$LDZiOiyt7q;$v80B>+ z?~P!g+o8w{!Q0yo7^V0g4f(QYQ@px;3hSD@GkF^|rsur#Yf)RsW7T$W>RySh#t+KO zx(#+L?rIUYoFStV!ty36vXF81^aXn#*M6E>u`X?8#KponYp0xuE788x{UUn9Y4w~? z<=HMiN6nr~9a&jvZIwDBb*9Wt^UJS325;Z*_s{o)-pyvFs_CgWPKc~DcTVnH_H55{ z=i_d_SmWL8Un~Cdo>yG==w#tJk8jNm+6`u37EE@tGXJ%2`o6e@vbl3k#x_oPy|-l> z>z0oaQ4Sr)KQJBId5_iQUiqs0!dLE^`#KHoHMMNN*jmoAFnC$=C-6 z)1{1fR3A9L`EpD5;)zEdA$m5GgjXEDS9LX%@2K>a&uX0i0v$3=u9j0YlrP#dHFL)4 zU&XfjF6@5MEoZQPqT%|9es23%4SmwMVi&krT)1$&vCS%4>eZKqZ&nGpvg|t^+3nxH zAmm}%O1sEOA*GN0N_;rA&rkXEq-C2netxl|@5d3*k~=9=0=IeX$iJ6=cP?y&Nmm2 zCwk6S{VzhpKUg_`@7cdB>;47Fdg%$O7nQt~6f6{vG5?Y&c#?KRGAr`Kmxax}%fiks z7kbD)aSlh}vI5c7voG#f{_>vlZ#zTPE>_#SJ$erWWxfQc@2#GFCij7~w|`jAU73na zK`fkqJl@nPt(d=ZW;|1y->>5njwtd}x0N+c{&&=}$K7^M;xdQiH&#KyU&7X8n%!96 z7?-5G_sE|~{SOP*Kgo7!dHyRVxl{b2ssH?m(SLSc`>FCb;;^~JW!rke@+(tg{H2)o z2mYBWx5R$MUHg?=_pkVLzvZ`ogKs?d?0s$BBCk5ue~X{5TyaR!{U6#ogLwa!?-`jG z73rHiGG2+m6^D9*@-?uTDG8GJfm+yBnFOUhy=O%vjK8n9q#rcz=jcS}Y` z*Qx^1MwdnR@-O8+I<--`TDEgL(@H@haT^By))}RIzAt!}YB@L zdS&KCoJhKUDA?xmz0Wq^KHX4{&=P8tFKhL$xXiP7p0!8K)7}&j@9#buf~z%Nu2Pw_ zQTpWP8?qe=g8P0)&fA`D+|O}y;s;^R8(DE36ANkuzufVk%Y8F+&X%Y+eSuky2Df%6;XFShGNY>T&kPVR{o0fv4{)Y zDB6*DhyQDn*XbYnhiAGxZhIqDzWf~1`>-cxp2@Gjb&b>E`?Z&zSNB;-vp+q&f8s`| zBkMl2*FMyfYqj|tI^$hwWV2sZ@Am8du7Be*xOKNjCkmB5W%u7++3Q`maw4DEhQ|v1 zTW#VjEE?V(X!2cgKS!S9>VJ*?4^^g?d4kI~oEA4a9&XyaD2}VzbuX8|waY7*o8PkK zZH!OQPney!JM<^ts*vL+LRL*TIA*ZF@XCXmbDB9PFi!S~m~vF@>4uXZFQus2Z*RPE zxvS;v(mQi2*O{z;q*wjDVE+DHZQpY`bGH?Bp1Hm=$B+G_-_kiJ8&+QV7UaS$AeWHd zmA$FqoTb$9^_FdgTP32!-B{NI7dF0$QML{)N{jmBY~%IzG1?*CkDlJtYG7kvcrMJq zpop2o@(W5ba}#qiixW#SQ;YRVDoTzHacv+cB|lq0EjccS|S!znAYJJLRoym)eTBl#es2_s#rx^X3o1{T{DZh~=M{d-qCE z^v;s5mYWu#EBBV1%FsT?H(#aFRVhDY*)^3r1#69-6qNh!oRX?mw(Oio_u5HH%7v4! zt8Bi1CTQBqiluWjmWZ|dJruEhf+?rw*I8aslh1jUUVrX+En?sPwM%2TQ(f~s?o2u{ z!)0--K-jcXLB79iJhvUYQlXi%_M~rmy*ktRCu_^(Q*W{~dW$_)W8dm+_;!2RUe2Dr zqhC{k{>`(xGc&fL%XH_mYsp38C)LFmF0Jo*8Q~t%%Iy3)by)>6o!{{8 z($bY$Pxm|i3%|jgc6)WSZi(`|&C>+8ns{#M`66HV-~3p?|K?-wJhkfU*L<3PY3}dY z?>*kkzEpT5V(T>_A>}fGtcVpSp0d4n^_6UzcUUw;JJKL`vSS z6`1t0LvYbHvn`6Y1{)5|cqB4iq$tZbq&hOc=kviinztJ4nxwk^B+7hz=N_yixMsx_ zU3Ob{YxUFHj+xix_&(mep1uRgZbj}rDytSoe%ZAgNrd*qp z+FGZzwqeT`@h|dUA{wG+AIstB^$tldp1(U`xzhuFI@3vWE@r>ImMrSoIjv`uoZCZz{CI1g++ ze#9PXcr@|>Y4y1w+Z zQb3NVdE6?2Om9B1b2hmG_75!mEy_3ic=xt9z;0XF7PnW{$A3P)TRm^i(Q{8{q?s+? zySQPq`4P>tDc7fLTqkq5&onKf;L=5pw@-Rz7VeWN{32=KWi(sm{Y1N%)Uvq3D|3v? zTKB&QXVT<&bXiCE^3+Q;2^;6i%H9pMoHM6gNNUpdo4j?ox-*t(Hn7A!{c|~uH+BNE zSQMY@1j#astJj>`v^QpoEsf&RNJvYk#Y{`+s4m@R)Z@$kZHJ({17X4c%+7VJEHetF7|sXS9^u39Ob z_&Rd7FLU0-M&|h?^XA*!{OT@Lb>IJA_ve1kWB25L|8K2O>zi90 zvFFJ7jNZ8|lkHbz1+SVK)yDPFVW-8qhDTDYJI)uecEv3DwZz_4({r7>D_g?B1-C`x z8umZ#V|u|Z!Pg*jUG#vjx16fGNQU~gym#HFofev2{P)h`Oz9z2=lJ_#6U9<~#qHB( z-RJ9F>&z(Bk$ytzx<>jmO9z1?7iYHIIu>iYbH)0VlN+v1_6R%v_t>?=x2`TTxwdH5 zqVu(v%T(ho2mZcvj!9AC)|!+L$4{HD@zP&jtGs5{w(rF$*$S2~Gx~nN$}`<{Nq4E( zmNtF=$^$EYU#$KB=>9WPe-gw7cW7c-WJ`%YDb2^3tpq{#KCE{(9q> zvXcE(HUE^Ohqs=ewd?h@ncWelx3(AT`(oa-{E^c|Imi1N*XKW4r{ouXU$rNAyZjo< z_MaBz+KTaws;#?pWA0l`d$F>?b6(l)wp9kTi?^S;DAlT{oGo>q@za7!zF%#kG`=K0 z`t|B=Xw{-jD>?Rt_V=3E(^{stzfA~ze`)H<)eSAn6AODbGb%MsI60MXZfZ2gHXp&y zkz3X8-*feScjxvL-vj@(WEOJvn{dBtEd4L;EG@A2_r-~PAGMz!KF0L%K`=c4Rr04nePFo%Gs>#dceP-SngODH1Gb3N_je2%2o;TR4N8%Xg z+0QNy(|P*7Z#yRQjqPra;8U?fww7PF&y@ds>*v}&ZsV`ULD8*`C!LeL?|<>G#k=Dg z@=Ml~SqqdUA403Xr0sI0%^4XOT$mUb3^A*(;*#8A{luJtj6{7$5b0QwpPQNNpOlrF z3~dhePB`nuY$(#||LVre`B7`%GQUXcdeCrtUDpLyO_7k89o;WWXU+2SnzZu8;+-ED zYcvccV?92W`OGOK6lm0e4H zcSfD9tV*s}x8*_Bfq;0)ozMLC2{^ww^Vy}_z3p;J@VW3!S0eT1T=}`6{`duxB^}Yf zwm+M;FnO+-$(i(U`>lU<->xq_esE#7#^h@gcP^S>-eWm4pz8ACf}oorh3d~zE_*K6 z{^4N1#`e~Q-gE6WH1C|4kT0+LG+tX-+{t&o*Y(LM*^_5)m5{o=%b>|EsB->2gC%lS zd#5B-?N@ksPQ2!<&8?(#fs;&VH}6b=i9%$V^{yUbcyGr?kd z8vM0+8e6K9xksqtLeC+aJqEisZ_JglyZpsTNxSi>KtsZBo#i2u$}+EhwAq@An4Pv5pPMl*lLyIFES)HuAickR;tX=$?Ucl0EYdls!u zN)tTitra>y<3hm6FPo2*i@uz-=9u*gcQeb6>$Q!ZY&|y5+U-lv1;)bLcWQ4vQmFP^ z_%X@zK4JKP-IF z?f4}*_-aKp@5d*PG!InA9MZj%CZH^~a;wLCn{fS2LC+_~ z>RO0iHz+pJIMsMgb6+vj9J-cj{+ zMQ8Mvpa;JnOU6qtul4=UUS9LJe$lZThP%|$>(ll8L_W&ZesX)ETq*h1qagY6a^r(< zJwD5PPy66A*R$CC=f&KGAH{5amEE)#n1?n;tY5TtZ`Y0WDH(@%o2)Wn&OBn+sj~J_ zX}XVst1^n!un`iQ9*;xE(~eHlv0or`wR!u=Q`J(e$LkNZO8vSf*^=+Sh zw;hR7c^DIL@p-@p)32w^d0%cZi1qkoB>CR0(q8fGn=A2$9a!RyCK&%e%XZ*j$A4R^ zb5`fJADPeD(`$4fo9FKbvb$Z3+a>c_}v&r{~h1!nNN2kiP zc1Usa9at!kx7bTD>ACsm`KHGA?dQic6fiTh_sP6aw&>gQ@$VPQZ|^t!7kIp}T>60` z)0d_N&rdr^2hETaRLzd&SG1V_;5f%||1RmY-|L%#o9}BzOX+d5G_SHvbgNBRy2Pm< za4M7MrIk|_dZhbgO0SEY9-88^Bf(5Wt?h%-gp!5X3n#y|FFANAYOnOkpg^-tdQHau zI`=(NJ}G*i%GuqpZ`Nc{#{%8ZXU~=z)TE{-tTWqLcJfxi|L<>{vM-A+IdR8erg4_l zH;W6Kj=wmdxh3)VrFBcMwasOFZ(6bc;9WNPKZ(@^7I*ekqwNwtu75rwkCTC+N{)fS zh^Sx=E=erOEH24Rh6eG}$d~oP*F|lWPhazxX1=lQY8yk`0i_nRfXgOk2?sddB(!hM zmGDlkbhxCkSkU{jD(8i17QUAzndLf9-nPVdwh1>&4m*=dit>``T}ywjuXou0-TC+H z+DjR3QnAO+vETom_RjYC-0H8}8m0g5u3$Z&^~bnDt>?#w00z09ABF7u)Xp3}WTSLu z@u8a78TlN=UNerj{9I;mU+7t3;y&Fo&U9a0!M;~3Gp-q2nIakHW4qGz@Z6nhi2y%nEK?@VQzwW4`ZkkziSaDIsp1vu4eEWiEO+Bw6^EHTzek|7TPG z^`6{PS+aMYPu4QwZ5wpX$OhV7;Ja#Ka(jQnM{PsfsTNtRI(pnUrk*!8opNE(vzDsg z!CqFzYi2X=x;J~n>u52ti;LN<7k^JNb$%PR#pRktNI_s^#{5}bnJaf(h!?m%q2NK8 zFOPO3XLtNoKkv+EZ-umGMVEPfSa&^nRm-l9X+hi5CpWJ$T)?CD!nfmyX6M|lg`MfI zmtL2-W+Ze=d6yu+`ex2x>m^c>rgID@&)hJ{gJ1ihU*hkxD!o}*lEK|+8T)iD1znV# ztQjp5e%7e1~`lgE3`M!Oh=dKvxK$z3SH>}0WA$#l^L_czi|qkIjj8q;+5Ya%3kdq zLd#ii*gs`XTUDrgcgq#gU(!o<-nnyma`m#e3ypF!oEmao{SEmLGG|#uvG+XFg-aei z{1bg^hK*#?Ila#%sqJkc&3_n!&8NCNobdYk<|%&L)wWHJd@3EgdjaPozc&lE8gCV8 zdf^f-@VfP;!Wp;3U9C4&&ZH%7yigZiBstzHok)`^NUM_|4L<4^_6P zP7HYLwdit3`ec>F#}ik~60=Vc*ndF3`Nz})HH_bXe|W7>*L?asAJJ5+=x1iYW{g-hE%9X$8tnDMVNcZxMmo6-dUG+cXSjgm-Ynz|U zm}oC&VtYruPxKahsH$iBVUuTDS>oTl@m#`jJ*MtaM|9TO&tWo*ES5`DHf6mR2%NOT zW99C}Au~(ogz~<03sNl1p6U3_^^SBNd-ab{&CHD%E6&Wh)X9I;>iA_}`{g?v%*w@& zKfhP@KG}@v`VG+v>X+TknSLKAB}6{Z?%C+l{x@hDmR{l^eGE zZdUc$ZTi>s8dds|H~no0>F0XIcz#=-W7b}l^YaWtVj8Z$470kcwfuGQu1%M}THkHB zytZtY4=>N?vq(E|z{hHF+QZc|dV_ax`U^eMOX7H@-7xot>)MvPt*;)KNqPSGv-Y{5 z)X^<>&pmh~uix-6(t(Db@2*?EjuqD!X>)@``;ek|AeihO<7rBfNOV)WvH~1h%c1Xb%da!n@gK$;s&Lr zIUR>ttPgda*r2pZQtl(>zaA0&JR^3~*060?pBrp1 z75VIDct3W_bA^Aak9+RArFW}v&WXz*J(K(Sy1H(8M>wRPJme9*;$pR=Z?)E%>T4Ea zU;C3kYUJI!Di)QrQ)m9=j+g5Lb{^Y!r86!~_~#v$v)i;Elx?+0W??DeS*yAx*X+vs zHofu%J8LiT#wI$ans2$=c|k$(ks7>iSKwsHXv)H{8ly z^S7>ibyq9w_ByHUuao(*d8gk#o|~~&x@tD_+NTS$b28>i@4D7_t?+{XjSE`lTMjpd zJ>`CK)_m$6ljwBe&|RH&nY;JoU4Of6^}(l7N0-NK3ZK+inG(N*_py%HW0}}xam#+6 zth{ww|H3BOqozF%<0X#Qf9x`m7hh_+L*?zU)j@32mnQE}ntL$xC0E>Jy92K;)fb#K zmd&pSd+h74fA7;Uve^)-KwmrK#_2Br0Y;`^vi`lUDCPIQi+_$?XxJ zG}c~P96Ilh=s%vV=}nvw(-v8N@hPv`_x|;}n?L`&z01xp{euF_*US4}yf|Vh8!K_8 zAkN)mU8bxQoAQ_QteJYJ=6EN@OnW`So&xWpEl@-@Ad^Bd0^nZ$38jlPp2;UV*+ zqG+a~Mc}F8w!@OQpMIYDNbCEwHKFZF7kxC-El*EN_pUdW5Xm+x?3H7%)z(S;edyfJ z?s;#!mYViQR|d_on6M>s<=UwRMg7m$Y)T6MyVLjYM=iaZEoTyzXwHk=J})BkcoFwY z$?$^ntEaG@_qRR!anlCxcM@NxIi8=U71!r~dsELn`z{;(k32H&{U(2THnJV8Ia(;@ zy=}=#VS#&ctbK>Mry0K!)pC8;RW+$GPsXr7z}%!-Yz z*H#Is&-8u7mdJL|`%U_VHoHf!)I~i%`KU}dq;T$`QRGS;zvmsB*X3k{&%AST(QFR( z4EM|BOEb}P@X4JS4pNi_U& zJ$LKEJ-u;cG$>h~97Q{aEwteSkwCLW>!gelcK8_iY+5yI{ge`>pc5f`x5aOsfAYd- zL2)Rp;-D0|9UDGPYg3yd-{Gtm^Dl%?)(yWpT%dz z-Ii@~Ytg*G`MUEOHh+I`)IUK!L#eGUYx2V+d$tv(*3yO@GGDL1JfFD4%rbAnBY{t` zuKiBDuhi`h|LBZZTGI5!{7C$Bq2nI^G(`6|NdNfJKf%4}mf!=iJKeb3B?XXpH{t7F`=aQ-9Bqs3j~PPZ%X3EkWLvr#*&@AKSW zcVv3{E`Pk!KG$kq%$BK~O9NAFrgg<`Oy9~i$9nxuU(SBl4WjP9b5ov6M7|e));%G$ zoU`Y8%e_nUo6L+~yCnYzRL*iZX%#hp|F!jkYX4W8O13y&=1aWtpg8d=?{a5_ElY$r zH8Z_UDi~7A))~8o>pcpr;@-=Rn#Y?Byf1?G1RY~xz;=!r()@!HCIUTSeMXo#c~ zn#-pKXM;9W*lxakx6Hfp?V(QsN7-NLDTs>1@7~iiV@A#s=hDf&^V@=^O|tX3t@?3u zy~i|{9=F5k^;15cyC4yebjNI`dip!t@^f?j>i_)tBzr(8j4PnP|2UJ6=wz*TuQiea zTU2>f=T72xIqJ;2m}$D{6jr-S25KKRwiPz|huEZ^cX$vmhU-YTe9ee z;o~FyzVG(le*Uc3-0RMP&SdR}p6cr+W=)@VPx#in!^~|>vcLAtRyn8FoYsDD-t$|W z%~qH1WbC=QN#fc4Z&&Q=PwedzHr5GQwO4cM*@Ekd5;+$>t?t|Z*k%3CK6mX^IXm|r z-w>85^T9c<$|hrWn9xqg-C=JtCnqUy*?IlRMD42O(i)84Whee#ZFx4hoY_1wRU>}W z_tROEubkZH{aH+ByX*x$!O~M5d&$7#h`F2BoVRkxS@^6Do}+YkArSnJ0mmOtt5 zV!e3#K+BH6$!zl)S+4$nm!BY2%51!2Zkv!BPfu5XSfWo$VUGb%%pAvi3k?L?w5}F^ z&V4UqQRXB!?fm>3%Z@+ZQFinB?i*XT?ej3-`HI^fa{A z6cH(44NlnM^+s)B#TUIB>M4E`|9bR1ob^JtSn8_(L8oqPmOAV{=c=S zgaw|R=V0yTC=@$!iNBDty61is=1NaCRmmV#$!q%rPnW$c+BQY+*P5_(-F2&{zE8T4 zwKA3``gnr-{(e_=?FG&^6|84oxux?=<=lU?Q=Q*x$5oZHGcfEEV!(DxC{nWZ$xlzu z%u5d~NJ%V7#mLx8r@by0J}!A|{>GH`Yjo81&5mGUE&eE~I>o8ecZKtTjmozZgk|(N z*DT$-$L-Rt-P+Q(+AaiW_!jeLI$tt*$veO1gk|fJw##$O?*EqmD#Q2Ecz5>c8b2pfw$F18sIM)&>~+*==a%F%FQ%!RJael$tX(pa&yKXaPm{=X*|7-!yK+8xHJ{_bK;rPWHy zUxD7IZ$%w4Jfm~79@RK>j5h(?>Vwpmfa1Q zsmoP&{7&EpGk&AQG@~|UfsEY8JGIL6CSJ&8Q}p}bZI#l%b?;&QyI^T^UH@q{r*-dM zligmflUFi#_pRB!eHHhw{<5^4Sp4PivbQoH_L}_qIqlkvsmeQZ!rq;*)^*?9xnSLe zT@EJ<-DSH!XkNUv&E?qasY14$Tjo!G7-*cX`o+1;=6df@zub0{MURf(So=uwO~^;R zUm<@uc847Ku%+pH$ew5D&eZRXuy zTCTxm7xuCGkKEUwUuT)5`JdaZwLhNAVyc^h-HwYM@^%kO!@ zSz_nWD}3X-hpW#5GyhL7mZYAma;>iQn$Ei1e)fhhJd2|h>i$1ne*Q(K*bL{t&g?T^ zw61g4JScT3BFL&Icx}`FcZ>~A@{wnjDGZ`=E*x4L3h+>}>rvE=}ZIXoY z8l~fV?tiOYn!NB$sLzZrx8#=U=`+Mc#~r?q55(kcIUd7K#uTc3XYxs*B6_nsLSCr_s2yR}BD>+Sh}^*zetw$1+_ zBA=F9)66O`&2-LU-c4IJubp)HAC#cJeHqa_7uU zF`G`^D>vKL-slsrJmT56+@h{M+0)ERdh4F3co+MFCXbwXKI~9EzrNjG z3G$fzJ#ds^XO}`t)AV->MW0CIFEU&2E1$=`oaxH$Z7g{+T(X}RXkJieKPV@3GsNVM z<(w(mrLEV$@lOlr6A69y=bsw$3U}jUJN6sydGyWO($2Zh`ecgu(z4I#8`?Kjdxl&EOdFQjY~WqZP`yZGgVL#qi%u=nGB%~IABw4CEj=&5;X8;n^D{1QC9 z<~%zk$t115p|hR6Y>CQ-XRHZlD-$M$HstECuIVURvZ5$6A(*9X+5w{}Mw~gbHirB7z1Qx_Uv5HDb zx%jkn@8RxuD=n8i`StA4>sse*1EJWf9@D!wG=7bL+-I8ByN&1JYnKYf(j6Wv%{$)< zrRsl9+ux%Zl=oL}(KdW+2dUR~4Z=No;G8TP;Zobi`^`l&m2!*(RS-+eFC z|LAwgq@*7w&!~IO+}(XFYRlQhfBCHTIsPnvvE=2t{D88{dtWczxj}oyr}bUN$79Xa z|DjEWZmU1$!_36MP{)k*_z|SaJSa6WB|k5x5~&_XoO}mf7Hm6vNtsZL)G6I5Opc~I zMWVP>9xxv9zS`BbWU5D~+^;Pg!%t4@HIKT@_>a9a-NA`tVI6~f>x``dO#u_TQqIpY z{uWbH_UG~Q?ZOQF0wIOG+M-hm_c~=4~d~=9fO*KiE`pdc!T-XTfqBa{SGr;;5{+FTd^< z+mOO@&g`${-aV2#d}@FDhYgAGw~tu8ba}*5T-c-{tIilcS&-jv=HdP48QAj8`&w@X z*?6*OhR@!9OJ1hiAoa$N^_zJ9#lOES$+~>bMB}Ggn{}<^iF;!jnOZr{|f>|){Tl68GLnW~Wj1xyweER0M&HG&pXOj#6(ri0|bTUENPjTe8c-*_P{O&Q|li{AE)0>5^Xy<7d3|N#h9qu;t8^x6_R- z*I(g(`^7T-`s-e$nx7kY;{r>;ow{iyO9aA0kpIx%(>XKO{$>%0D zJ#g~rO3N8i>ry663JMRre!=75sRhDiY}`AhH8O`cPd~_~8R%f_{MJ>|VEMx;w%t!^ zoDT=F-JS9Jh}@oa57{NZocJrh?89Q7ZwLJzE^9M4vQXgP*(1OFgRtd)lU8%nKR$<} zrS4t(P|V1Ya$M(hfmi9>Qr>Wd$5p%1cg>4@m{f46EbFM-=65r@+a61~UeDg)x_6(! zdhzzB5#OYq2K?LNuqbG|b~tO5`nnh0RU2Q<{F-!ho0ji!L!I?2s>=?q5oy0_k{E5e zs>G@-ZtlaE%W^q83LBTSTv+l`dF`{WteY*~zL>T;+@@>#RGIT0^9*$_TWcHK-fenh zc57vhn?l^C)ollog_ouJm`NA68LvHmb?0T%#PBb_dfv?_lFd1`w{o(c$n}H9uE%p% z?-Tjhv5zPBVryY%?()LJD@<%3v)=ydRkk>>imAFu;Y#W1usK;#(^!_-2=*Nierv~- zvtCl}?#?R5?O$d&?!0#|`RyWw!*9ftCtc}1t-w+8#Y_4&M_^qH#}5ySw&yx4Z<^ZN zzYt>bDJ1#Lk8j>1%C9a=X7ro_e_j+Yc$wY_oGI)v9b4sOkc<87$pZT zZkc;a_U?Eo$vcxZ-f4~2SJ}odP04yj3F{}foBY*d|M{0A?{->+YDbpS{LQlGGVdxM z{5<(sY2~?P3r=lVviGX0^O8QPZL5OoGEA<`eH@!|LAWh+>SsUG;6*z7d#=S=P0+mU zyF6)*acao!+fP0$c%s<7K0&2hsW08I;h>I}#KjNYI`@vA)R{N&FeeYEOsw+TNl(qh z#X3%`h>J0hiJfO!wKz%VggEd1GmmWlcs-bD)+4z(Nw2%>WvQR}Yv1D>TUozNEqT3S zdhp5Vmy4(0eE016j0HQheGf-Y%BWxa&^+>wShCc;^N*N&IAn4RRe!fc&)K%RtfELv z{?TF`yJPB1)%ybi=iTgJdU4xH?9!)OfyrNY1zvuA*l+F4gyOCUx#P>3mS0<*-1M~M zUqQF=pQGZ<>lN{H?2JTCI6{j>fM=POL^C?`YU;L(%DUF;y*u?US56XbJ1jz zXV?4AU*1?FEtRa_zj5y^zpGnRe(rg7Eake~{Wnvm@ok=XoMmUv<3F?CJmtS*c;uq$ zY@K??-6_YP%1pi+dNyZkR{Vyeb07WC3Ag%gZDAi5(Wdd`zVn(3<@~ZSNA1JC;-Bu2 z=IrzT_@UM#*?!yS{7u~KA7#pm_gU?0yWCJU`B`h#WQL?ucV-@lX}(l=&i2$Cjyz zo|M+Vu-Eg9*SZhlN92-jGnbqzOP#(kH+3rW&xdx~CUfp9{lhJ3dG~nor0IOAFEcY_ z{0nQutTPwS4&%GHpJ}hH)y@d-uQz@)2(d6#JOvGrYNbeHBu_D zyYgS^fBbPEEuu0qghI*Qg`N+9}g>gSS7j{kFhXj&EIPA zBk0KzmlqE#_Py2au9&bkue*8uRtt;6>5JYg3O(|>Z@=;Rv@fe?*V*p8^qv3B&I|gv z|3#~<4JxBF^}Bhu zo#Qya{$}zz@?5uTzN?7qiXVS_Mc;1=ttm}D`qZq;F!Z&dSg8GTp6}dyS~e(utw*i7 zSu19nDl#!J1hX(OXyP5M1+@c_wh>Pa_65!H)e28r;~B;z82FJ{;9?EO>bNyR-ra{D zIV^oJL4-Yj^4Sohl>J#{O;w-SD?cunCijQ&pT_BVo*f~pSk5f0PTPLJ`tJJ8`|JMy z;CvuCPb~1j;+y>vf4O!vWleNi+hQf9W>dEDWzy-^^AF~6Og*WRmhhXWRiRU9<<=LM z{^~maTiUa ztMk>*iw0LNWpLVG4t)06;BE2#wG}c_FU$_tta3Ru^@jJAb#I#_R{eI{c1O6%U40@C zpY?I21>$vE%lKaRb*3{Od6#J?uy)4sNc)`=5-wfSY~awkazuKiN$IZy*{)G_U3Uf zeBK*zdsS&T&&91-Q+6kEs9jbK%)9M=(%?*p@_X}Ay|YeFW@$Y>BR&0)#{7D5=Wxx_ z6Q*7IyFt=V{qlYj$NuAPQP-uER6my`b5$<4`Sv4x@pSEtqMAxac%J|Np>X(w^-eM0 zlk%UY>cmtu$(`j**y8lXlXVG)Z(+O9y}1m3H;Zpb7qWd5)U)dm1Lx5%ubIB>v0cKL zu>UqY%f|BUNG_#FaWSi6L{Yc!I0J|*sweQ~H{`^~#z@&AvXPjc!o{KHT`<)h!!uokrmZ|)VJ ze|FD0{oTEp^Y`zQXV}s1BV=A++-UYi^@Op=+v^4kPAo8TKDA`>j@CrcQftS19gF^+ zk`6s~rNI4gE!*W2Z*Me)#ym+q{MD>C$d#=uv|^t@#Z9v?n|D9%aOGS-$!fFW2hYN- ztZf^gW!43J;?+Ctns?@AT!QtX@BGD&gQsngwVsj2!M`+IQfYIZqrsL`&774%r?~T5 zpR3kpp5G-lef6EqqW^yzs@yaFlCr&G>g-9@v!6|xy*lD(W%LQBW1nN*8#;5ZP0gLW zE{bn!tK!UJ?Rl!tazht?F5P*6`Q!OxZlSi9CKT$t{IzZKPK~BT(H9JsCB__Qk$dsN zVRv8qj4K~Gws@2mb6PD6xgngo%y8wym0BNtj#q|0vP>&Eqh;JK*(UgE?#&l-S5~E8 zt4f!foOvgep?Ti}i$k-g-ucd2YH~GT)13Q4VFwIq+7|J=e0K48UHqC;sjh3Stfs`B zo@X^tO6=~3mUxxi^i!8&)+boUTwB(otBJN1o%0PCf5pVzs^t(xAK(8ZUhadl}LgTk8t4}0T2 z?j0UCJX07GKQ)~HoxpBC>At|NQ2z@4i6=gZyTo11=*igPXu4=4Td(ldtP=UosEJS3 zRh@h5Xs_e6r8Q%VV|3>~%}=6ILQ7r>EqdW3&&I+2@|2|doCOc(D#sj(-lH7jE_k~| z$ohwe#4;U)PJy?n+>(11a2@bowc>-(u9JM%_IB=?zOwptssFXT{-y7^_WsSNUA&OJ z+x_gTK(C;6tJ)q*trK>;5WU-cs)g0FuBDImqa6s`Gf!egE+YfOAtnX}d%X1*X7Yy> zFyQN7Az5MRByVqKLxJP}Z?3D|xs`vb9lxB-m9W^4YNGnAjv7@NqBhHJU&z~icA9V0 z9|=3V&UU4W56nLn9`RhuF32)W^Zb|^p)hdb7I|nr`{EKk$+Tq1N<#co6^xe}B zn_XWdS-5h?^1lIj^@*X9ld{wd-uz`S>QMMn@j=pm;m73oU%y%w#{Y8X-0!uk*fn-# zYwp1bYkvpL>1WdwG_BNDSQ=nnzP{qg?9V=1O0O?hTPpofsh~ZU9E1DRk$W4F5oAt2)l`3v5A`4r)4IeJ}tA_ z)MLjkxrzHp?B!mGn>jx@*Tl>`p!MEQpn6VQTBg1L$2HxY*L<3<<+!gg7cI%JZ4tb7 zpf~-}hL!0;kz2TePbp1Gx%}n)F|G`+`)Dy4Soum#L7IU<%aKqGff19CxZ4}eSrPK| zs@?OnN!By(uyC+&xJW28s!SI6rrPKsbSO<|!iJ9D29lE|p7fbBlVit~*us_3xuHwe zmM*@vs9}Ob;KpsC+2XltV{_I<-OgIQZR>0OMStG!{C@82+>@m_E9yKoId;j1DLJcv>l{>qiedL{|Ymo!D{7z2tQD`2kXu$b!8%sv(S}p8dRDwa$*;Is zCwK64ow`0FW>@IG6RxXWkLWJ?e@*7zG4az+g{JDCU1^-qBR?qy&hu%G*3-+C4Ramw3ZJOloO7Z)Lws(Em{`AA!n)WTV z2alG25`X&AyJ)BPy?bw;RJ+`fy;QV*&4%E4``$cRZ}D@r*8S&;a$}Tyh+gT?hdWI>Aycouzl{IC6nhDExdoZ$a2vqW3Bq=r|F^p_=F8J zPdh8tFHwBa>-INr*_~?>wrk%K?Av;5&%U!hGxsG#yj$ukUZMXftn@h3L9KX;C$IZl z{w$1`YA*JU=f|p7U!sF8uEZUF(sgXlMh6qI4~hF$`abli4oxpN5ZiG=zVp}WMH|m$ zOf|o8_2Jr8le4qeY`*%c|Ds<$k9PTw+cVm3T+8`Z_As?9dx7nf-ct8JKKqVr=l0t& zLGkgaUhyBb8)uo!z3#F{@x>e7Ygdwv-pNpsd+E0BZPw>we~j#2eLc$bFrbiW#thwh zZxw;h+kYkdGL(i|NPNgmwlb~s3e?PUlD_s-RN7_r8>uh84VmpFt&2Cd6{M#tY&#}> zm*+<+HTrAa4CQP`1(A-cMt5VYiuep7%zx_}YDXV`lEJb4=h4$liuK;*&)w=% zdJ`D5O*?;HuT*CInP+B|B+IA}P-*myU4ZXkqvqm}urpWxGMvjgXL)A-)%UOaeuhUr zOO^_qbxLp79>W{cGF?`E_hEheFJkWdL+>1p=vTQtz84xE^)3E)xTDF}J753y{FXd3 zf&F0kZCk#GgU^kW>(;EgpDeg$YVHT8?t1PM8gqlc9$kONZi%iy=fMLPGgiMmJkKOq zT)j-}Sm)8@$y$?=rRtoSS~rcX7QgMhwB?u*qiu2OVbRBV zLAUJl*i@|NOYYuztT~f)>i+Ki9T~=_UYi}AknvV$?T_tBJ8~x7@Lj;twKn1U&jQP~ z!#aWozS&N(T2aJM5^dopGizS-8jYf3!MqW_*Em+qm3sT_=YzimyNyGC@$)=z*6a9r zJvx|i>OsF_547U=mi%3)AynpUv4zu6K3eGG;Z3Pan`gT@Ss3qO747=5q_^qOFS8N` zbIq7j?3RzYYQ5ecD`0uGBKM)yW6kjVmE2p`n!Q+dVE0k!4qbl6;{ESVTCp{lavcBm z`jg0Vwfzgs+di>2s+K>PaJ^IHLT8Q8_MX$y*`KNxZ=9;Q|I~R&77Z)YYUg`pGbR(_Qh4^Dmg2TKV{AZJ8|>{PVZe zevk9nTiU;^`or8?@8O@Z#b2-g!eXue9*^ZOPuAMME;#A!AW`f(X(&g zc7K$&^7x&H6K=mYtFV8TUwr(Rnt(ywNt4$s%^$;8s2A#7p3$PEFZSZgZI)Rx<0fAX zveNy?*7P9u_KM0jm8!(0>t9d)_$^hNC-Tn2j+K+DgB6qn{&_vV{^PpO(N4icnWP04h(0c&~u1j>bC`3 z8?VsHq@~;V+na7*dSqdHcLC#qnr{0GKh`TPQ_n1!wRG8{Zyr~x8#KPmamhUyl5MkN zJ4=#m-h7#rJG>XY+qS{}6<=%eJBRe}3->t>mE3OMSt@q>$=Am6cD3ggz5kENuliHo z`~TqkRe$_@{~!JD*6{Ufv>eZ`+j|f0@~GbKb2r`bm%4{o;OCZO{{`RG#-A|pelTms zro2euJnq|PGLBz)($tuH@c&`?g<4mCXws$=s{eL5U`W%r?}$4!6D z=*#5lT)@R;W7Wqkx4@0fI>hzj6rQ6CHD^Y+oD2#HEzI&VyVU&X(fmv=zD;e58dpq- z;R*c|lG?G1C$ufoYu_G8y?nO}FGiy&MnQUur(Eo;n)SroV6k>|;86Ekh=+-?Oj?|A&@%f}l+aiW~to9}OQ?ssEu*u$T&)FWl?q-`m=FFsW7{<14H z*e~$d%2O4-h1$XaOS4Y7FxF1eh}97em43ANQ1NlAKY7uiQHkO=-}0Wyyku6cAa$KX zaL0ou?9m!Y6~6aB=)I77apip9ouC7}NgrG1CvK_znj+2fk0Ic(lN_^uxK{x8tuy)4 zW@p}An$+-b<>SDaXOaWVyfnlNd*2@ytJ2ys@vmW(iJ{OJE#tKgPc^Ig9r%-XdOYT| znV6aP$)H+ucG*Eobs0+rvEV5|zM7XmAMu>QCpE9(x3HBsf7)TT&GUOc`}jXNWhy)I zgV^VWP5&1ja9A^MgS2nA!~R^x$%{*N=J2ZVzw?=~1dZs5n}CSAJ`L z3}iC7Tb{hpU%Z9q{%4{73m1Df&0DE(_1L#FOUgb^@no=dyt;Zh=jNbD0Fm zb1jikv*$cfSm0DRsqXcxS4(tmce(74c@{mVW=hn|vQz)sSEe?<Wdrw)hakKWevjV55WO7)!d`Xhe z%vyQjQPcS!!6&0$vRk|U;b_VD^X2oLf5+!G&oy|ubLQW0?Z5zDm(ryP2fOzi%(G0C zo!gM>EV0z(Pxv~)mA7W5@t)cBXyegc$Hl&L*Sd$;|1DQfS|fkpnEyoIDd|hokF+R$ z%l*i?)8wni&s_G4?B64Q#Q%M#sv>;z+y6w*4l7kbH%qZk$=CD$+n#sXY-OwVaiX^Q zu|16w>@KurzU4IZHIJ+DP*=L27QCUN;Q6APTiX8B?x?%6GJo2diV63H+3J6+pB0+4 zf6~Hp8Rp_%Rhl}}cX)L6rGd@G z{kaw|Kd0$FyPIRZ@!ABJHGKuQ4$j@oy>WK?eUrwr3qe6I;%<5RotnNlUFnYe0`|i2 zCjql&l)XG3fBd;%RY?6mw%XwR@0T54^S%G^=Js!|&i{VFc}M-h-8!p=Z2o<*&U}9q zwe;Sr>e>68YC98m%EFoo%I$Dkx!?xdmPPPZs@JQ?y<+wQY*J<7XxNFvYJdj zc0otVzc@qa?9%3n=)5!D?JuHTeoa1c{@3J;B`^GyirMDzU!J_oCH(R3FSA0=v1{z! zQ)8d{b;4_gr&Hc5zh!vpRV)`J+n&L(&Fr`4XUn3KYunqpS|oS12sg?Enx+Qvs>C=f z&QKH$)SY@kY1IO&6So(5uawN58DzJ#|M|>}npu4_nEnQdPgqeb&wJQvr|lH`P=@;s zOZd+nSS~Q%ttPB$-tswzO=_I=do7yI-8}Dn?QlrLdu3PYEfsthHCnH|U-Yp(^Gn;G zLvd2YF7;B`HlhpPYr6k3ndxP@LytA=^vWq=7fiC44xJ70*Dj20wO{?xC(1c@OJ7q- z+q$bB&I#PV{i@pb@g}th$kyE%lQ|`?+D==#`OC4*IT5L| zHXGGW-a$ob1sT#dh*6kXo>Dp z1^tL~#oJ%n^m=ZaH7{kg=c5JfnRnX$eBArQPU+s>?oYkZe)ZB4_e2_a%?``W{qRHJ z>@vMs{^EzWFWNF=S8kK(tv#Mg&pdjwM(5zK-_xd;&kEABYn-zDf$>uXUxPo%i=Jvu zelstL(^9BIAh&tK^aFu<%@d|O@6gU|(%r^6&9(1Q&zqbr`#tOpo;*tBh>ZLlFe!## z^<=5F-S=CzcP~31{dHZaW^T=q&GVPtN&bDydFffv-z(lIY8_nrM^Q?BJ>O*Z_1d4b zt244(`9r^6*b+BOFYxh%p91Q}Mj3krAEdf9obPcztHa%WbLHYRPTs>`s~QT05A2W( zES6sMtjucayCb{xgScasPJO4SzvElbFRrS)?&S^B%bKF)*;c<}TrSs=&sC9k<|fy& z-->@dzTbDA_Frz1{AKU7n5O|{g?@2yPb-u+#VwmZV+B`zM{3pNfLa62tG7SgWDGH` z^xwIB`ZE)5A<_1XbxkkkUJv>ylN$C;P-fopkD@{{?HP4!q1IfoR$s0QsR-u2 z@~ZJ{lEt6Q18KG=zT{lUl(twQyGD>TKgab*eB*(=Qi+ASF(1+_9}ehLvD|%?t#xh7Z+~4L{?UZD?7!tP%?T;eFMg}a zK8ib?wfBp5)!8jkyiY~a>zrD({zfgmFSGdL4ms7Q61~R`7y3L5cv(8NE_;u9*vsC_ zAyuE1PhCuYu6z2__gP_f6H=c3p1h`}dqaqnw!MG4gqd90t&MukQDuRVhqiBIz8N@w z%_TX@w5&Dj?<|hqc5u_jM=H|mm-jwt?|oXgF!gcqM9a>&_TKvqz4u#s@3ZaOfBd)o zfn)V9epT$s|9TATkH7eyaR2+kUipN!{Rh127k9sO4!F4g1=}xvnLqU}^sL%e{GKAm zptd{mVs13IQP%c15?gP6j5^&H{l!CAfIp(lCSh~3;Lam`qHS|$`5HeJsdM3R*8G&c z)N|kTLq10SGoRnSvZMLVPj4CjixBVrmg8ba%~UC*Wm6e{$<-EI?Y!fyMCIb;`fBO=X326%S+Re zyc5-IQcZ1^Ui~oF)N@~OPegok>$L@Jk;w-`eJdxViX=!mr`k+gRw#J(Y4D0^$AfKm zXBzr15u4|dU0^T&y-aVZ!Su^!>o%-vHTra6e!%`Nukc%!uIChq$uD*~ZYcH6LeE0U z=jo^Ck4;)OJ?WlTb6IUW~@}weC5hc-9=@o`g2QDu7AA#MM$)l!?Dtd;oZ?CM>{5YT}jarSaF=`tHbhp zPD^F}`P#_(nFyaav#e;I`&66uWuIbJJ(IGUD$X!hD(g|y>b`kg&wnupsuuHK&$eX! zxwhwD7l&}ltlSem%hn{D_$=k`Kdf$C^6giEYY9_xz0A^_3Acj|s094ET(m4{jiTte zD2d;1)HYl`!J=>Ju7A`>j4N@j_Vmv^tN#4?Rdl{3?vs_6-;CLjTbk$0`_#OpFy-01 ztgFAmR&+J@FkjSD)l8oLx}3SI>Vid~?T!tNn|4lY`y?dQsmf_J{nw`&;98q$0Uh! zlPi1NR+e1(sOg*7?i_Q(;g!a0zb8uRdlcV!y!c{xi;R~Lkzhte60`W)vqh| zbz7|apU%g5Vg781>uEYVpKNOF&wds;JAvipjqXVsBf6xO)$`6d2!>yfXK#G*gWJx_ldJ5D^D<5eVb9~(daB4 z<@vAca_!ocn=`DU=J-5Jp0ZqAOnAafJEavfJKc_6D%`zu=N!G;dj3BZxxR%j`>fE~ zC!ss*j*b8KfF1t2wZ`Yl53VQ=X1w40;wER~`{wj|-ieD&1>=Jx!Y^JMkunJRnE_JnHsSDnh5((p}T-ui+Cw)YK>H=cUo^>Xr7?)v`yArEd` z+^%phR@8oGvGnPAqShZ#P=DNGF8yGIdRM54e3t0uS~Kp)?L+zvFUHWaj8LKzun2Bt0%?mVVS@2>9MeP zQm2#G%l@$Oux#y``q3nEro-hao*`?e+*q{E?xl^#Hm@_zl`}N2{!M$J>pdx}Y*L6^ zjhaf1z`D&TyX|^&k3ZtGY($sd+DF?!%p{?lZ^Ve z{rH^tLg)Q8^@TSlv@E+(Q};9R);`9)pAH0>f4S7luAzS}#60rGy*a<$ct5XM%J{(S zQcNmm&%PcpZS57VnTtxjy3aCRQ!lJ*bku3Ru|d-4y92xC!DofRNs-#pN^@0?g&#S6 zODrUH{`6I6iW~AYOHAHc{fmzNnaNRVrFklg<64(P9CLq+xAD}{4gVy=Hiq{37>Y@| zvKJi^*nC5ZZU1xw(cNc_UBfmgTd@A^ky7iQ;=keL!@`auizQCpNV3a(nQ-LVPR||d zJr33K*>$rN{XOv}tfA_*;Lo3m`Sy47n*Z~0|I=U6R&QjMy<`rv?s?_@B0G~i9$UNm zUy0byUAE6yBKj_8 z(@Ul59s0*ae@$9?AvUwFG2l?Z3nvYcMkm8nfx9w0iv&e(G3~$QmaZ}Vg4ISzg*k zRufXx9qoQDbU66$$7+@1_FT1+S1oxLgutT+Buk2c-b*YY%?kcokTiW1~ zc(m{W`=+j@B*Dvz)YP`dcd4}bUryEW{?@oVxaYsuBF4p?_6Ous_Za7LeG(9|e>1l_ z{oEYu?{{|ZudDyhnINalrsnJOu&%VKaQdg_2xBa%A+czK0HSb8h^2t?UXUX9Mb(dY& zR@wBeR=h6~*txL$CU4BnLl-8WUT>@te%SY*K|m>UVD?X5!L=XT+^uhBy(q|^>%Okb zdba1zr^k3|XFsxiXli)aXWg!|hRH^<{?->}hSUNJ$jn<~g%0|J;E^t;Z{p5?R7|bs{Ue0-060 zPgg9PFkSacazo;e4R1^ZPn)Thewrc0^Ve6gKP6S-?A!}$tmTq-8uwk6==T zk)Hxi>28@hkX?;w`9-;~B)>I0x>&?j2qUlWLgz-;GV@yS{zE-H+6}x*0^_Jk<$dN)9L@4>yNO1EXmKC&8y<* z8(LN6H~-(SFW2wCH2!`3{{DY#3EX*X7Za0Mt(+^^s(s%azOD9c@o9(coeX>{mbph( z@$N}JbmXAGvB*q0@6;-GwO4Pek~f}qlJRzW z#9f8EJ#$|O6dmw2Te|c8`%Nd0KkmE#zDn|;VZ_=#WgACPqJp>iOOv{v5ws zFC$iq$W32&E9}D8H&fnzFnJr`ms;`NMk92!-_i{eb~dQjG$pP$QLgq~*dzOr#5CJB z-?jj!{Fd}BXWVrqCfOA3X-?ld+fU?pL$*TpgO)~(r@~K{GB%k-`>DEw zt$i=O;4yFMP0jYxbKGBaE}uT9E4go#@$NfwrVDue=Q*8zVyZ7!yWbnb=eZ9fJ-97- zBrP%@inQ_W$$!W^CoSWrzsS$01OU9Y~sg#Y>>@gJ8CgN z=MSWE-+$cIDqnE*kZFv0LG!~C|Et{%x161P-)@s2zj3qf%)p!}u9t5v6Pfw!)P`3l zlNN{Q?dy>+^MB-XOgh_lxog+*&w)V&F@7qXu9CW8`&U^{l~k;pda(WZ z-)j~NG<>Q!zMo0q8QTu~uL6IMx72qe-nQ|-bY4b5i*rNJ-4(q5M10rv2Bn=}>a|B= z?p^Od=}D7QH>g>uX9Vw>JpJFToog1aTV&*Z{}pt_!`j#CqL@ zR~Z|XD_#61*|=_BedPYDlJreyx4Ap+ytm<2)JLA9OU!QN`J4@Ws;HXsaJ$FVA5l?v z-)_@CxpvV7r-L_zH^oO8BzonVc^J%nH06qXaJz`&ucZaX)u#PVV*i_5_jb%;kG9^u zOWJC7l!Vm0SIw(7l(c`oTJgp!;=76+_p6eI4R7kKnu=8K&Z|_t$0M#jZ+ZR$(SUl@ zgjH$*ySwgfdsTj5#oDCrfuA;)RrEzoo_8Sf*B9INt5-IE%3}#}_CF=E#&u;=Lj9#; z#+&c1+;e`}COGBpfwdk#HBLQlZ0C^aVR?7BLs~GI?f)Z5>3N@AS;z-!S7L+pN&_vmTb~bhaxewkGv1ZaE$>t#4rj z*Hdww%glmOQTM8UUtGb|@8VQ`GnQ+cPrgwfSC+m)Pxp#NT-$}FXH-xBC=|MGdjV^6 z$R583T9q+}`*-w3@93PrqI`B$*A(L|ABCUn}m3Yl%V?69}doYzDm!{kEBf}0NAc`NsG|KQH;*I4JU zQTySWYdMCG7Ke5(?)~@uMVxiq1*gO%Yad56UqGuR!k>Nh^kHFOxXeYpS^{!PG@e=_ ztTRa3U7+^x!l~0rH!#Yd^5i(kbUW&J=Uf&8zDGtbha?g?)C}c3n11eCOs9%q!=ApQ4);+s1Qu@u~9EkAaEK zB3EY|K3otar1l_g$20bI91?3X&kH+lQ9JRd@*4lCZPBGu?ua;Qyb0L3@a)`ER@;|~ zuUhbm%fC>y_WZfGi_?Cn$?INrdY>uHXSikRpIX-38K?3lY<*j>KF3`wa{hFVh~?*2 zJ5)VgxcGprt47yVhgG`OdLKk{y%+ZW)|-Csg4eQo)x#HFoeIB{{Gzky^WqzET}@}5 zuZJ}XnC5RjqVFpHojG!vT)9R-sQ;BKmNPESdp*;_$3aIxac81Iw$s~`*(ECs)xG9D ze8suOK&2~i%bnhH`x;f+&T&i-{9>Z-mDJ0%>`1}NM%%XTsmeWpN9P>VGz__+6e{w0 z>fx>1Lw~ORx2x}+nT>(dGVxDc;_*)^Qu)*T_Goo=eUp=#vHZ@bO>YWAc{A4jIM3~z zUv})4!RICEK2)1qll~q{X~0EZ?y! z>b;q)=(JYTDY|Q%rEVlteEa{6yKQFirvL?6`;#}{HoxKTd7F7$F!kLPAC8k(>tc;! z{7l8>QzaL-L@91itk^Ro!hc= z<)1Tkr(at;s|2RMwBvQl&(weQ$S`gtM}O6qwU7N)Ic_aaEL9Jy^K}h3y~?5D@=3MS ze&d7J-3D)UcT6pm3~;F1uyk|&mJ7!PHJ9dR&;ES%iJ`d6{7dP9;$Py0XS_2siCemS z_eJ9bo{|l+CVzz(*ImrG#N(sb*6uMWG#o7e$`>KF0_8=? zoaTkym#zg#nH^oa^mfYaF8yzwmsVJ}{F?M6Y{Pxc73&wNyl8tAcjUwMFaLd2YPs{LGp{Kr zD819v5O?gaP$e)XiW zQIdHx&&0^vTbnK0jy?Gx<(zTvGAfJIi57% z8C-YT_x4xjNKH=j2aRucKD%s{H8cNX$V5K2`j@$F3oYMY73ImFbkoiZ|=me z74sVGSA;WX?mjwm@qt-~#KT-~9qjuVQ`NX3B!)Y#^Y*(lZdDb^zNRH6%FgFG*GbIM zQMG%l8ha{vo}`tjg04rDU}fNfFQ0hc9(PL0(3a$ir<}~xw z&gPkNW&P|&Pt8u|ML+R*H+_{{d=`V@mK(cXthCY3?mlX~C2*r`UUY9;g>q2H>hdHG z?L}cnKex9REdNt0u)FVCW?4$#hmA+er)jL_sA1+`$-TPl;!{W0Nu6Jx7cV?fUu=@J zI?gr9iC5G4z5lYxn2!NWUtj$(I9<4x@~%UJF|aQfrY2AV|Gh)*NnsuA;xF#$yB_Y>#$_W6YEn;=dEh556zEp zG_F;-vYxSIePQ3cwJN@uk_K*8H{_)3G909BleaKAcRaAVl_|dd(1pglsF!hz+V^R8 zJ>p*LyJgnzj2Qm+iYBr*-79PbZ#t*ky3xLIoBK>^|d4!L1ymek8xzr*=^Vkdfb>(WiN+MU-&u~+p zwGSB8$KHQ+x7_!h zZLyGyWBRO_Z=T+LUVHELyUMS>?oVgXdmP4R|J1PIbmgC(c$=7$%FUi~%WVG4YHz<^ zG2>jKT6<(%TlXaIg#Zt$w_tP z$q#)dv%Xs&>Zx54+&D2bH8nPB=a(~5k()asIZ|iEU1u>d@{?Cn3vxRU-{-_4h9$!gxt zc)7jt%jUH81wJ_9?!)=zdc|%v<>|NdPBXd7ELf9K9)0zy^D6h)gbk-v8xNn2&EuH! zbIRf+Qzh3cuF_B?$>qn;yw88+$}Q{W;h?du~}McIJNG>>GyX zSLYX=+G*1I{=?qlGOp!?Z96JT#h$--eRj3HfzKW}HG`(lB7Tj}UA;J1f6txo(PQVPLqzMU9FXzAFxQR^J-N z9USZ~@^6}ZUeV4jw}8vnrbQiTIJI@#R#5?;ijWKkZzcYfYiG|^joH(GX0N%z+-=5x zCI5Ft0Y#o);GkXC08(H*N9n!k*K0PJZ>19rz|&nFdSA zW&N0@XqHf2W^&@fjCb=AGo-$GH!U22)W{@fEYbM-De zQLs{=;QYkThxzyq8_s4>;S~RSK$NlB@Li=+KylLp|Dw78v%9N=Z)z)Xv`V_=WfU#n zbj0^I_u>Vwxbz=Qd|Ul2h1c|8c*Qaw;ko&-Yv(Uq`s6wbkN@SJsX?Z)@22`Lo%p%3 zvtjp;0j(eeb{4obOK46yLFz-Tb!Wa6#nJ zXX4X2w`+B&@y8l-wcIeWaDC#%zWDB&JJxKnmtu7P80NXwZE#~tZshQs|M1H-h23s- zt9o-L{5vWmYIwNSJmBDj4O8mxght06=Q(W2dV=fMEHTxM9zO$pcS1*-aLyR#-2`t~$3$z{$kH0ZYE{mdqp z+?e>`?kAU7|IQr{uE~GEZnHG!hJ4YsEbAk!Ec31(;1#);e1IvpWKH;I1-#y&FoKYS*phUM z@{?~|s1>=%H}zv!WT;W%+6{&!OEv%Z2QjQ)!td@`lpLl|;WEwoviqjh?*IH=zP380 z^l3|(4BO)FbHP&$k7*BAZFH}v+VdmYheZV!V^i^YnT%cl* ziP5%%3jXOU(tilZFASWO@b=1UmD#T=JCD77o$-q|c;z!+lkZ346wT&$sjmd@}z8h;Iy+DGi=!zZm~6Jy%i{UgmqiuX0Q9`HHQ(s=vM4oBn>@)%W%Le(@fNtuVZE z{X+Xj3%%r+!z^+cGmcE@T5qD^aav7T_p(-+Nyd!cWWM;*_iA{!Kkd|L-`}a+t=c7wRz@Vj`KA5lA;^_B+D=G2W#Axlb2?H^~qabaDUQ!-sJQh znXEj`tn+tolR3Y8k5o?8!!2i<6V53q^s=O$FK;=&K!3-&4~q>QFS}g(tlbv8**QD< zN25X01x}v4aPyssI~`wKmwDJ`v&H6mMAjm)pJx8y848t)LXS)C@{YTF;DgT8yGr71 zXYY0io;^{u$K`PMPQd-S^>ZfO@ ztWMf_CvAt^(-)%KIleoI@XA@Zz2FWkpP{@-(_!nGvll*>OFZ*;>@2zJbTHz$dto@3_?&TgmE)u#7FHrYt7+q&|3;LCPJ!K+!jeXm~Z-_yq= zw>skD#x7IQ*H-fqniJpcUn#xwNV(O%t3K`Ow9+ZgGd8tXjt7 zsTWtsm2gZc4cV~r(4~#7&#iJSv@$NA{r~WYvCh1{o|1_Z(~DY+|#rVHOGnTdHH`6ejey}xbSzV>%6Z&bg;&UwGr;jCVj(8t=Cn7^Xa7d5)n zi0@tfCjHZ0$)hE*hFRS&)MVeeb}9*aEb5u9a_IAoBU~@n_iXj~_$7&rdCE4Y6~9eB zCwJL;&Y$7A>1f6=U!Ek6LdkMv^_#mJL#8~JYBLlv+~9U1ddk8#caLefDpj+ceS2uG zn!eCi&V}!S_H)1C=X!csBd6_rN3!QD+h6s9U-uoU7CiVRv9Y~E{NsMKqq$o>M0@Ts zF)$ovXJBxqwC@I)CtnL2Ly6iJd#%Y;AaIF-f_WtC`#WnmI9aYlv`7d~UMPD@wOVm= za1;N7%|D{+J+2&K|FEzpeVVuGI)|X&$@~94oAdLW#;n1ZY7hK#PD+{lcl9!&5bmD2~1IweK z3$+|G?>$Z2@nT1kZ;|~St|jU!&0C-Rc5*WlG%CqnEG@EA`n_F2j{c7t^))P7_ud

OPwr_^16e!_uSPF&|rPRVxEojqa_l-uWTxWVvkok=wJE$=(m#%+u?9_%%=G&jl(H zQDGT}Kd;)Z`9$h|Nv7)VMVI5AU%L3Gz;K}!-&EV}LMJx84UK*JhD(ymIwUTmxP1Ac z+~fRH*Hj$}kFjjbUoTg!`#E-={^Z8KTQ?>idfa#3z;w$dU$)y%>u&04y!`QWrF~dd z(YH&UPc`S(&B{KwN2lHD@%|Q#WZeS>6?UF%#fj@R%1k(UeT4N{LL)_fNl02HcS&A9 zB)0C+tVT)h%`=i;=xXSRs!j+Nowz#pl4@aEj{3Y*QE1mLp`M=w2&vb1LGdXYE zr}6yHw^wVP_N1-a+*Z8p(e7W1=G;B;U-dwyan`bR3_NSMhFPv?KG^qm-t~RrQ|7GA zaBx{E^Zgv>#6!OWIQ!ZB0#sLiYxXN)`mMTk#UeM+JByEHcSrU;V=;T*}LB7x%Ln+ zv&MmcZzQ|liHQOe+~o5nw2S@dICi4^v9Z*q-uMX;fBT-yt~IG`y~v=Xsq|7gNhs4! zNo*pwyNdIYryW~_c1lc)@~SNnXOjK$#>qPLg1hOBDThoVr)!)n^;)O?spFEPJ=>xx zbAyiAQ~n9;Rp)3wX(zO@Z&KgBj@d87&OQ>FnkrN#5Y;lB)3{}Bi{>Hi7SBU^OX|@M z{-{W-lHg}$V5s3@U7_aqkQ>N_SCgNHb9w+GgS<%WlVu7xx{v)4F=$-U7aKEV4S zQ{T$SruEGe6c!jQSs5vprg!-0Z=<`_Y)f_aeU*R1|79uvGq0ShQD67&zY?`}Ua`YO zaqrdqo6p<*e*5P0o4x1f-v9sSXE=lV#wmy6deRKryd&Qn+@U0FImy#iZ}yH!M?-y{ zdU!?pJXRLIUX*cYMeFOVzc&u?ZoPNrp_tvtgGX|O=ReyZyIr?t+F@A^Zey`iVp?J` z+?&N#i9PeFP*&gyfWamKAM z;ep?GZZqe79+N(Lgxskp*!X|Fe`i*tuR^4OI+^=hkzK%7Oz>KnzYGZf5g z_P@C{#m4ZV^oePEvNTd`)7qZa*Z`$9{?tFmSsi1WGM}~Jc8-3W<;<_$$ z>A}7E3D>!I`dxK?$@;EXB{Sb(a<2Xip5ui}9;MXuE@$=y{(?jEUSE;;x-59&Zmbv_RSgF~C zm`RIj%AKxkk$gTW`Ph^_DO;r6Hb(DsTDxMGzUD{YvP8{Q$5X=}<|W*}fA!IZPunkc zA8^S~K2#_DTg0+qdoEA%kz>{t841r%pH5!1OvZk@;A)Ld-cBp+O@^D3?tU&^`>mft zE%4NPxDV~cd7m+t6y6^_60L#WnFu7UT;riJ=ECRv@G z>vL*)1)1}wEM8!6e$uK-M_A2TUp@P2#oj7A?}~HRtf?7(EKhIvs(jz}>7&!jU;E6@ zPj^{)chmc;LP@hO?%N{u`~R^f(YW0wp3bcNHmz}<>BXo$hpxSI-?l~eYwdQeKceDM zTtD{|u?5|I=`cRswMjNsaK&}!D_MCb#23`Bw!Ebh zm78D{WfUb?*s|MP`cl$wF?A_}?5yX)Kc?O4nlt%~l$JoWx!Xet^`Ik0JKvq$`Ngho z(f6kH0#Y89i~cNmesxNb?{Z$#rB`HvtY7WE=)8`R?`PbXiQkIrr%qy9cYDrqgE_}D zDw?KT{>}1Ie#^&1StH+F^S8{6|HYi~l#$izR=7+d%X_9-!S2OQKleXU2-4bP*v#`^ zn8CZ&e&I(&sa|)#{P_CxU7HIfXSy@bJicMt#M+)a`Wd@Eij?iEl+6F~aeBUDVV%pY z(?(I#H?B3_+*6bOZ2R@HTaN0rtlYUiYTdF`p}!6P1qN1cUG_EAf5FTx?N#lw>Z0V_ z*w^o#eO>3%BKc26$rf#eGRH;k9k#8qIq+L*f~MP>1@9zEC8J~(|6{R?`)}#tz2$F% zg62DwhglcyFtBmXc;xqR%ehj{^a8P73-^0*TjdW_Mv0y@SDd;xCCOvfjt#Dj#jmEu z>3%TZW!d1Vet%ofxBS48PqMQtUp~2i<&2>E{gpGF{pyydeY5zv-Q@DKC*_&P%0BHr zY11-+N|UYDg{l5-im))kXd5(FMX=C;Va-4}Sh*r&@{D?r!u&e(AroebU4k z7#3MDFxZe@_!j4emcTC=SsKk*BXafc|G#PGGtZ_86$vN=D$IGN!qMTu!0E0siA6<_ zWzD8Hev?{L%-`i%Y}ppIHH&}k+AT-7g{{>M3vLy2&gi;v`QCEd+^ySf-_}M>{r~-Y zTAA_gnW_ux&+M_h_xtYi>fawvudn^2sT8&3>d%*aaq5SwBxj}W(COEE!dsX3@buHn z#r@$wGgY_0y7Nrke*5V&%WCeO2|uyH^*Nut?<2pt>(4Asx~Fy6ZSMA;nMT(xh3xZs z{-x6{`^B~pIN_E#bSB?-6>VHd^`+xiluJLMHp7L%BkN@cpnez2+JRc+NbDLj0_)~26Z_oU7qOrA(&(mk9 z@qQ^k&ZM~6cvodYdA`MoCu_4-<{iw`{{sUwrv9FxXYo6#eaF5Hf6tWYMLjaOY|?$S(PhW>g{C}#2kIEC z4t|+Za#{Y3|E&64u^FPm%l57ce6Ft)Zs^N@?2N;qH!nDy3l+ULm8RK9aDUf6z2jBE zndw>P!k^>RY;Uc;U?};F@xuj?*J6$d^*%TB3nqS=tGDL#oC>cackFjvk~bD+-q_Ka z5@n__S1x&0YUj42Z@9l4mKRVw8`v|^VY}q5B?&Xc!c#BLEQ-7R(ful~O7FCgw~clM z3z{uoYcAK$`PMcgE#3Ks&gX4Uw|Wf+jG(->(XWM_in*$bv%&^%%wO?k6!OvHlceCXH4z+ zyy*0>la5lm{#7k|Wca`*H@RS2lg^C7)jYxrrgpo?3eBJSa#NJk9T2pZBdRSf8nCpey6=EdNs8!$H9KLc7k_(7F5D z{)u!-GitwUPkPgHwfp=d=SvqOH<}-l=!naAnW>e1*w9P$X8hNs2J^O7dQEg)!8Xa_ z&9*f*0-nDgt@(BN5Fc-;+uY#Ku~JOeKjpVv-ZH1X!`tnHXmV|lPTO3)I_qDmX=PuX z;;d~P^QI+lvb|*}@Mhz(Iee3RcAvV|x}vv&p}#CU&}f>{oWwK7MNNY?$tAt|Gk=M| zhs|7%nitJl8<%v|MPr9z@P`ATmTsC^$5u|Zxw^f>YeRF8so_oCMPIq17hV$On04vt zvD?g-tX3T7E1a9a6<3)QXVG_M3%~F5ts8GH3{%@~_0ve&x50kp_9}~eI#Zo%-&;s{ zewo2_zvg70u&0!r=X^)kaPC8fe>-2yx-$LE)Eg7KL+|mvv-iH``Six6zn`v1=JLrK zIM1#9dp0rii2Cj)VJc<$(`V`WJQa+*o6*XUaJ@B|>6MhpQ%$SAFK(|ny6nxwfcR&- zT;{#dYVPt%7d(A5H%GJW@3~pi-!EY0TzyF}(o`#aZKtL8C>5qDtWu>iRp0t}-*(M=<*K_pIBV+NOBBRRbf1c-sEc(duucDL z(!BgsKw~4{1v&p!J@`O66h?>~NT9NKd$=d^>0;5*}BGlL4z_^c27 zKiY5fO8!xk->o`2f^c|Xom3|(M<#~|wdBi^$4 z`4{S6q%ONv7-s$ZcjvloRprff9`;U#Qrl;myvVC+KUlxq+3Nq{2lboMKI}h|`S0w1 z!yl>t)>|Cc_TfIib*Jc#aNfG!^AcayxcRuwTxDYNOq|E}vJG4KC!OYb%0KR;Y`-R) zd2s1-7S6M$P5!RgD%l~JG| zX6!umceTKqsh3=w7^ikEd7yc5YmoEoH4_(3&1AiKSa+|tGhfzR_0A&;>uTIvgD-El#g59e3LYNRJmy3XWrahX3jnzrJJ93 zX-k~T$t@5KUmVeL<}UMH?jWz3nFY-HE}av%av!?L+PUvvfW@-xscmN6rcWNO%eZnO zExVX!-;C)CmzF4%UK1$1k-9>mjqOpJ8NX)W?Deq;8KEcIqfG7FIdb?IG(u)}gneWE zHfw6w+Z8-Fw;JXg)84&kqnBpQ)Dr?xy$i2;CCxDsc**JF#FQl~?fEq#?&Ov)_1fGk z&L@{gpzMZ z7X4oP*-hD|YM<0}KWlFWkEMbqAAT`D9?A6Ifir!T^YjWn^<{CZ*Pk?9FU`?md1{XC zMA6vZuL6fk>kqFcbm>}?K@g%5H;&oj^*~e*PFM6MOqf; z2G#1mm7VMRHv4+?qVi?(OnP&FbjDiU$~?5C)JB{AS7S#>{E32q=aY(UShwumVDOjQ z$>gl0Oy2};b)Sg=VuyQwrj#o$>UO#Ei)FckLaNM++v^@bT9WtgDeub3pKd;$Kl|XL z3W==--^4y%G!C}ZFP2#t_dw|qU-@CC3uO;hX-z+@_nmpewpG(Q=j@nQn?Gks!@b(& z+WR(oZ9KC5JfnKqik(;gyhf}_~Cf_|J%^$Cy{=YLLSVzoa#>zEII%D@O z&E5Rw>{5Z1Ql~qWc5FM&^Da~`ue?0cPit;^igips=hPQB#LLvHj4my6{yfEY$-o|O{tWvuQFOEu3M}u<$a;Gggv&K_wHPm5dX?AVpZDr?zL^VIO*1( zQFqkfW8$fm5=WZLX8aMgTzE`5q{IAt;w9}b0m-f9*A>F5Uc8k^pODvY+?a1BdQoPU zSMkSGxqGW#=$(-gOS`%5Q62v}nNLqde=vUVtD1iHfM~*j=HE+Z-AeqlZjG&<<#YbP zcY!sRL{#nHxs*=fKF6B9bnBdVOPyU_y}bKHPT@4`t?x~f+I}bQI`4G;YQ_1Zt2hK+ ztL{@gwY&e5`-%O3S)R@pOL9)xQWFlq`G0%slEQe zA3x3cH0NA%PSR<}vj z-r+m5xr$e&LQ?jFngg{Hwc=SiW$s94w`F=o-wnPOyF4SSdM~@#tZNS=U+I3nX8ToO>b2>Wdw0J& zwWr%E@2k@v`-IY+8tdw2X!R|tNj3Xvz}8S;F6yxBWJ=Rvy^2mxZVeyr41cd{D}TJ_ zun^~zekmAz$nBTLJOQUIQ{6u(h zth|mhD4g3Md;0T+7uy7__|vTRe|>DSckMHavl;7~W7GA%pIZA#9|?z_ zyew1Lwexhbdxo6C^XvQuhIznkey!KKQFwO=ltKMuIuRsZi>J3-X^TO zsknRnvMI0HR@NDaUf%iY_t`$3hrx4%AME#uFKmo|z*HYC^(S1And!gjuU*_V&D?+H zW`3A9?b8eCFTT?M1ZzZj%?_^>-`0Df_4Y&U?t+(FCB*nI3hj)4BDrYk)>7w^kDO80 z?3||OtUs<5)BQTz|H7xI_oP0yANzH&$ILac*814)m0}xrb6woa_fhwb&PI((+oza( z`jY#r@6#W(s%iVUdA63w)$(taJMiy!A)?_~#9G1v!fsLI;MU|;RlbyY1R z;d7?-&MRJdI}e@G%r!08t@~jo-v}!!`;`)&%jyA()uPa z^t0c$qQ1}{FUqXvbY-gqvi5DeeNf0|twT}b!MkOKS|ZyV&o~tD-)YBiY zRG+-OD16>28P#$TI~$*Bqle3_A69mS7BS9m{U`Awa^08ZY0cM-9zNfB__K-hKFyhq z+C`gIZMM>FwlWu=6~A)x9oD(#+Pi*zyb!u$!R5`1b{E)`JYRZY?Z%6uAtIuwN6RNN z$2(f>t7(1zM`YhtvwerU9xZxvucFg9e2KD&PJW5=iJOA!WcU+j&OWkl&5v2fChs`X z>zH50cD?_w!rqP@8wBp(BbWz@*UlElY@7-Mq8Kmu6Ya>t@)hvHgMGY3>Wh zTrM8px@gw7{<5MlwS8=sPogf|e0m^0;d%U)b6!z~H|~Vw-^f|~^?J%-NtPH6gJsOi zZLG6>=n@@*B4pqyX@XlQKI+3oizEOSZ8|h_#7iE-Hgvm>+d>B>zw#?vBp#f98=YjA8?sqTpxNW%j zSVAl1&O_OyG3oi`-np8*A(n}rQB74RvPD0ie#^Fh!xM*-qK8W^#9sNk;VffE^##SO zg}STsHMR5=ZnhXz?YH?Ecunkyf7$L0Sw8uuKG*v%@Cvc6Z%=V9QNGn_E~8k#`_5~B z`GrjvKh^R?EKB|z&+Bvbh2oPq7w(JNYSw36CrtS9^}!dnkk_*XO}8s#ogwufbcEIg6-}(#R8rCZ>1WJK&E*r_ zpC7f-zc?{8^7&Hz;CE7ArdDqFadeN)Rqe=kTLgUnNJlF^_H92|&GUWs`^A#VTXe5_ z?&pj(xpt???-$G6S2xNcPCm%9cx|2VtU95kTJe@*)`RaBJsU5inYL&B6na{INGobZ z_zH%cb6%Uz7UgZp{k-Rwn+e0E?Y662maaXe>-qKVX^%edCkC#sL>HbG>sQ>x6E3}u zFJ^Z4DYnc1mhp)B%IeHAiwM!HKlk>~?72>PHghLkG`d^6rRl!^^iO}cw8<~{`bQx5 zL3^fheao$%g1egJm-@*q$^B#T_QB#l9h(E%FAA->#RL9v>3-$kw9e<`Fa79iw`Dhd zi!fJx%@wmcSJM1Jmgvob*w)pPpDbw6Xvq#Yl$F+5<~aRz@(#J=`X?DDw_P*gC(_d!&vw8a{UE@gnBDsHDUq4-!k=hYEH!@O6 zL+SDUEw_w+@#}ul+IJ=FP}1(Drx>}nr@vYHGy24r`(+ExKD??EmL8|9UHSGu+OqLL zEA#m^A`A@gbr=}DNguy2$w3xn6$JKmpd5eYEJPD zDR5+T4HR${5&3KP*M*h)>zv7!1V%|G9xu>3!-yeD_C*{tnC-q)wy_>Mjj8pEHUHF$hw#{2{!FBSJ@=a@O zoWy=EnW?ls*!IqBwX-FeeN%+fPQ36*e55hc$b0ckxgV+e_Gc%ituy&-Vs)$8)yZyd z*OHm~o4aSaeO{tDaal-4-AmmG%Y2^6D!1!Qx$auzv9G(Y^kPz_y#(%c<9a*QH!O-*A`yvlv-OFxVEEu68qXMe$%dP z%t&grSvCDS+e_1|D=OCW-aJd&`(;+_6{S`4l)KG2`qxU$edM^jL#uUva*7>lOW5cl3^IzPn<1o%yUKna>!Py)C$C`KfxH$@9#TeQx3c zb3&(@FIs&gXyWM#gugS{b%U{rbC{cNphFecSg4`u>{?h4JTayas zJiP+$1#s$aVvFRW9RGCq~` zab85^g5BG-1H_UV7uDLjS;%#?DCrl?CUbv{^D`v zjQd_2!Znxntmba*ZQD1`O!<~j#%nW|^%D~o>^2qPJ-OR;%kkY#Yx;!k73WX==;5z% z;!c_Ct>{IK1#6Ur-Wo1ibo9ps?L@zee{y^#-_I+Np4+%1@tyk&+iP0IOye66{$gds!`WPT$Jr#7j30H_F+)R%#19bj43uFKx}6gmtriSKTaRzI%6J zM5)S|M{9rjEWg&4oOt^2+r*{o43~#(+xV3E;0~RQH-?~__=XH(@RGH0 zbvq8vP+up*VeIqK{lq*Ymc-yNLo=_o2YBs6WBDmRuF>RrrK z&%0cxZC;`oyX^AQFO|LPF1+L}QC;pjcip1ZrMue1Hea>7c7aFJD)#j3%i=GsWOsj< z;1@sX-s>N|ed!-#d-tum{I#UnFaF?SE4gD|=kS&8nz%0brmBd%mas%?ILq$VLtF22 zEbg+{xM`Y4^^#|A7F^W6_T-M?rHE;{o>-s`VRcALa6 zUf+Fe-@?nXUwr58bDe9&Hu1to3%(a$a%UE)^A?EI`W(CbQZH)h<+~;Q9CiAMHDTOH@|oWo(}$EGCgeN$*m7}T-4lS<9hys$S=NZqbWKU za$P^~^f}@0yS}@{I`kE1`LbnmjxbJ|wW-Z{dhV;26YgJGVk#4{((~#>yU?A_wypNd ziZV^~%DVMyUxCe)BqMBTxl88{_||^cxh_2*Kxn9jAheVhx`>fy6Ueh z#Op7(Q;7obmvj6{p3Tl4X;dJT;e_ z>&@pf`jE2evQ$^=5yq5#tK;LcTq@tqxYK>M>F0^QfE~5HF)rD`+b>*sI&*_=^D=vH z-}w*Ia{61(O>{YON^Qy}L%V~wE*a_?Wo^oE&thaww|t; zJF+QPS71nwVb=xf*s&Fl+OH^*O8Sv)^C4^;K6o<$dbRmh(mW zM+;T7BCcP#VN%kYaP-sM>t8C%uil!qsx)-!SzYB1db!g(UzVs&P&$9s;hf0Ze?A6P z5;aBZ)@R<_u&>de)Tj8wM>%EQ9+})ta}28ArjqHJhm#fH}{?>s)7nIXxg zmY$}uBU(CpwSWH28%Jj5G4)^V-!}S2yRqfRja?s(^i*gs7Z0t<`jZsd zTRk<*>BQrGU6U95oS7(O1)#Lj$QW3SlvIFC-Snr zB_nfQqy@I=J-M0c^|3qR7O&a$nw4g^ep$Ic=y2TMeVN>^zIVUpwoLTh(KSK;=AJ!2XVTsoyV*ZW zdHvy(IqM&Ii*wih9Vz_J_!r%nf9WdIlcH$Oxu#ECMSr`SK1<{cd!&+c#A?p5stjl5 z-|5QRlJ{OZpLFejMcjXbY~Px6_eBe4RzNATQ?tDoz z+wR&V3vhbtPX2lJ=w>P3+0!=|Ed8qEP}sco&OZ6NutQB;?Q8EuzDT)v>fHgG`h~`g z$yz4!!>ZKhd@HJ6_&2ShhHw6~1Bd4NNm+d9(m!h`wsA&+_=Q5PW68qp2gQ8Sna`&i zif{6qu5cjlLf_-W4P4tcy@>UC@b%0!Cy^xnZ=0T`ZL)rQc(Im()Z|6xN&AIj(^c(` zeJ=XZ68ed?=lr~mrxi`f2hT0nJrwLytWkQV`L96!^2~}^r3)WQ^4?dhY-s-Q@i+U4 zzYWiyow#lv?71!fgI+$!WJ2b;YtZL`6gym_MzbpB?Y<=hPwW}`tS$gke(&Wc~ zm+szpEBd9aVx!i4+s0SbF6G}3|M|S)0qZMco9CaCKNL3?h1bovI*T#p<@DTZDg}=i z^uG8XxW$t7G+p2C)4I>sJ{mH=NO9Whxn8`gd3)eR>6sT&F3oPK+f=@Hk$$4nX3u=F zs_ydUMdxqyU+WDssPccPF=es;(||k8z5W_@W}ZIp4nE_WeqMFq$rnqkqS-dOmZtG1 zZF}V-bwp);cj}E(A72!!GX61{ul;mAyTpbDxo`V8sxL>*F-m%4Tqx6R$G5SL@1mW_ z!d{#-y9U*+^6?Aa{A+}wyn|ytm-|dB~PqRo3N|R`K{HreXnos%~P??OA6mT zm8(G7_W*4x+5M}fN- z`!Bw&n8Q}kQ1+1XR=fJkOdD7G1DC&W%?sREEbQ!RS*$0x*zoyfODmPKb!j_(%I!OE zcK@8h7nym_FMhTVsz0z;&u`M_8IRo`iuucT8NQqOL20kNk&1E5h3+4Mb!UD_`JaEt zdaqwt+qQH5hdRC^D}?Psm)~{g{-DG>>DZrj0TW*Z3Et=_Y@cC!J%DB3l833h_Ln~t zKT5vWp1&yFRQA!G*C!1Q&-$8w#xajm=vy) z7{9@waRS2)$$uYN9}8PdcHVB?C?|aC)8Bg=BA2-MNiuovUVA6-#fO`bhgI#W7bXX` zUbYvxwf9W=!ow*Sj;|=YrfDs^=I3;a`l63Qz6xpI9$oTYu>R1)&8MdPbNs^pbvu7j zb=9ZL11x#*>G>7Se_w9@^G&VqzTjcYLWk02}Z7;X{_@_1Y^ZGfZ_n#L0 zm)1LQ-*V3XgNlFTuDAYwvg=L!$s*8fkolkV5A zE-I1>*V_O1a&Ar7bS_cr_cl{2cV6`JY28rUvGmO)se8W!b|yXNzrkMgDYd4|Y|qCf#ph-^fWc=bhY-WH*5H|J&T&ZI3W56Lr(64;+02^RPz|GPn&st>Vch{ zbBQecAJ(*(ojS6*(dT6!O( zJl(aQCUZ0ANLLCzdzEJWvp|#it$3yu^M?|)dy+dQ_Z`}7!me-dH=XCe`XIx5OM+7G z>aKYpeN&x9EjH(W6}L;|OV8K)Qd?Jisavt;^`n5A=+GGLouUO>jE}VGdhD4pxrMVc z>G{fnnvM;Jwod0yV!B;vTFYU*aqH`f)#Yt#=5C(c|Fo)oooD24rj6fNVs?m&-;~^E zc1!I+(!1hgIo`(mr~bK=Gk;BZ+nfVNPwynn57FCfxxvm{#Cf%9FqdJYH`|6A&jZX# zRqiG}e|UX~R}cGTtscg@X{i-eA$APUy)}aCPd|U)bf{X>yZolx?ZZ3fxc;tT3g>wc zBe~MQw?@%YXu`y0S58blIZ-%uiKS^#Xweb-hDVGtZ<8z6$pxmw7%w_8!SedArLqsF z&3|kpRKoN8aO;WZe_~yZFX|CX=9Fz0&fvUu(P+zsqMT)-FBUv5w42-EouRvKY3Ytu zsSgZWAI08sGP~vFXEk@(WwTkHxm#MALLAxV`p8~!iY?)q>o|MG?DQ`mGFtQ&NW?nT zmWX~;|IA(OX_OqF+}Qu+U&=1^*kcOn?{@aR<~B~=9?)78B3#qw@Xp;L-coh>&FTG- zFCXupBjYRddN)r`+Pun1>E5jSR+X^KnLc&JAyea7+?Q5&{9n}cMO@A+tDx)A9~leF z<2}ni8+Pg?yq$ZTu{JQs$UMHbjiD^mh$UR}p6AzpS+SjAnwd{8?YY8qgFPhf^iP32 zVc-6zqW_!!KfS5sJ9Ae7^P|Jx1U)C}d3ty8y^i?&`oR4e-@Y%5{ zvbEY=o*5!{-mMF}9#+2F?pE&WyzOtVmHoa^b~|d-rvJt7=ej2_-F*8mW#4bx^PlU_ z{oMEC((ia%KNs$w4gED=7ENb+shaukptt^I^CjPX<*U|LybS&2{_^kS_I*n)*q{Dk zDu35uz4n*3{!=e}BmZoZ`O(LJcE88x*vx(EXTLA4^yd4Ut@&5_?}91+=GJMP?HBpA zae5lp+UYOtmwXqN-|K5X^;x>n_xYRtKQHTQADjzS#SE@%I@|e)DlhcxA9Y2xmvYb+1YY!T&4D#1gGXo9eLDX5_-ueyrQlD zTKB>DrwN+ppL`aX_jIwr`L=yE`wof!$Pf-cebJID{>5Uss*8tBe|(C`e5Pp=zaxH0 z!P@?9+zX}F1@E|bn72sd$zl%kq*n10+tm2u*L+a5yQO&P>IbJ*{jV3^%Ec}DkjiCl zyfR8n(p>3vb@_{lJeON#PlnV7Uy^xyt$OyBl0BM}FMVAWYN$K+otN9!RG)P_HXipd zn3@_Cr8KQ4W22t#I^&<#Wf{A-ESoXyMLt)0klP~p+1ih)+`6+Qb=NE}lN8K}&ivHD zf7Ixhp6%3YvoFo8*yY*H%a`HnrZm@+_vlv_x6=|QTTbpTwqd+bqHiwbmd1K{)~({x z)$e3WXU~|k`a<&-SvRNmQeEF)t;}0%o~EVBm3Jwqt>>+0dfEYx=D+`gCSPNUE>lwcJLdUi|DCW*XU;_>YwN8C*PN(5Hm|pH$Fu`kTh3lc z4m|N{g{Wz4t&vUl{IhS(+J%z!E}NWQ=`5*y?aI81!3VsvW*+LExop{&ilXWFEa&y} zpLw{kaS2aONo4Y}S)DtgqGKYb0%uX=cy4%e8#5Zi_mml*SwRQ})SSQ~zqf1L|@z+|0FsJ*m8?J9UJg3u#U0L0# zr-bd-)Q1aH+gCK!aEdY1?Z20qIw|v~V>Oe)>&r@u7M<6S2oYg0T*G~J)yIXL%r_VV zjO$*1GX8vtOJ@BUQmiPA6QxX49{J%+AwzQ(WH}i zt4bV8zxC*x@qX;HMXG((W#YPy_{z=eduwR{VMM6<-+cF26MW zh2qqAQ|~3e_}F{NTBVr(k~72OPabF1OxDUz_k9{y<@B^eLnw7gm)+Fgl?(@s3VC0j zyH>vB{H@BDR)*hQh4b^Ln$79V7g1iF!%_M^LF}g1`v-Hij$5p|RQzZGi+ZTsli4AD zhTGCBJf6lH-8tKEG45FBY}Z@-AJ}K=S-4LM{3*6C^eO+x+)FhPPy0W(hgNyjm@Az% z+$AeG*PlCk>lcQgW-tHl;O{GItn;1aPURnPO;|2x>dCAiFT6@B`0Wu#S+hsYhPKkT zie5a{s&9IqFsrWW*Uq979j>aL7FpM?uB=h74|=-$NATkfId4Ub%KdxR$9!2`(|=%j zN5!>$hg@!^PSwBhBW|C+#GUn@nEzx>m4DK{L`3nc^E1w%_EY?y>y|yc9I${_%D2jF z(WM8=UCq^w7`dq}b}!!8)}m(Nq!|16e^IehpLMX`>O96(|BUnX%G@lfqtbT$@!z#j z>C3I%hwiS8T^;r~$zZ|Kx7tD9u1#EP_F1j4dg|*lF89vAb(%4=^5VWW>6g5_#Ij|} zH}YSZ7s=AP%{XyhVYjX6o9L*N``h|12fx|0D=GZ%BAW-VPu1C8w*9yAf{od4n~pu>4>8|+%&lhMqNe`~`&<_oyrX5Acm z^!=+Hrw%PCO7xO!R@?AQbd#~D2Hzd7ImYj|b>{Gd%$TFwtMg2E>)XkWfgd%rjZbz? z5Zkya>By#sH)g#uf0(*oRjS+dUF1FOq?W!W^+T0MW3t|vCU)LUyu)xtAbY!C{t4Tt z8BRxc_@CLMRBm(nUiPZImAWVHPnrAb$~On={+sc-(;rvXR-D-q{eGsI^3-Y0kpWx2 z9khO^xS2smQ|#R211ejJ9c(VHtUVN7ldWHoB^dnR%~jcahRXtzZI!If%`K>Y_fqwC zntRZ$X%`POvx)RPo1YlTB7SvihjUlMuADp8-bK+SRo|{`$h@>N=wDQ#-SQbplPl-> zKig}%(3|T;hu96B3{5Gqbf25sEoHu>OuBaE#-@a$HTEc71 z+@F7TOY^Z^=`>O_Gj7&=Zk+H9qrCn{q}b0?2B~_ zi#49f{s_C;FL2#lX6d9~7Xpi}*t?!v{KP6}-tPr#CUfU1ztC6EHx0Cm^b_E_%je+v{`(<+mOT`oa8>=_ z<-}K;CWLJ1UT`>d!!eQnySCyO6f4Y1_rACCXa^S&aW~=_?CrUzslYB#!f~ zJyUg8S@X7I@<-2ms!r|R*tdMg+UJ}F!n?mjIEBkDe(592dpv{fGGkP)--M6b=G>fl zeYZ(T%Q@*~k?bqgTHd`0wEC}cc3YLW%z{q={JW-34fK(-GOe;$e!-_`@m&`8oHnoM z1y1}&?seVcwPX)XewzHHup`1P{IdEBzTnn*Orobwe$<<)S@K*y^Q`9^?TPk!H%_f# zWW6cBW$MY);$_gN;*Rld(wm0m~-QL10Qq4VE~Z2|jTza07~#+9xc zGI?`A#*Alj3yywWC^)OU!Rx8@e}Pz)``vE}-zv_MlUiz39Z}z5^C{P&Z{Hk zO0s4znWy~DG~_+7k!{Nz$JY^L^|t zmxa|@r~D^f-t>5H$^5mSxQcm{O=T8N*k3q9%x0ePoZCw*rZmr*VI&=7w@ZGHaP+1@tK0IR&l;TJNP#V$(O@lr7n+;rO&- z^YM#scq^Faxv$h)!Lo-ty2i0!$DW;A6a%CRnv)O6e&M~`_4e$$+BmzCSEU!E#i|x9 z77!6ryE|3a%Q--Dsdn4Stp^zs*XKwq3$2vTUyzxRugF?8UHLD|goZT5lGzVdYd_e( z`la71wnOI36U+~8u1=VI`-R+@d#v?${p%UEZTYxmTYHbaNNo9BcX`(D2mft7*6}CD zbWL`2_^Obzi}&MK$tspV+mub~#8%6xOmHi>)jx&t^s_hr=e#}5@K>~!Z{-q}qS{8g z{&~!o?z-2v%@f{q^u>9{^Q@e_RU#pGCZtO}vEqoRemCiZkidFcfZ`OX1Q^+?bKF{b_iMfo6Ns8H+o_$k{_%wEqOXK&R?qtP zi|gz%^$CUhm_lUSmQ`}ie8#cqGe@j<{Ly=cyXMVv%&ZeTX4S`2%k-j}&Fz;|?Zkg# zFRB@>_w`-u{$jItit~e#2k%ZFXc1oi=fPHajyt)@7rUQiCtmF3NlOf5Y}3)HI`YKw z_@0F1K-THUH%2ja&Tm`e?=XF>h`Hd4mKJLtmR$;$WqxHpxSXrBVcwkg%IVr)ROT;{ zTpr-HS4<-H6_1SEIn{rmKe!@J1ZSo45wpzvi zDaSp{ui;t0B-XOmt$UfVA*TGT;jM;8D$4G8D&EN=(@r~o58P$;-r{xNXWb7qynn9? zCgfjQ`sFQ?i~gp{>ID}r7bqWgoECHK%!ba76X(Q~-`KvobsEF+yNu`L%h@MvlCpA> zR(!ZHIREKVEpyEpan={rJM#C22241Wc}4F?)m$Ub$=fFFfPRKBjeiu442J)`dBi?^flz{I&Hs=+^RPn%M84vcwBBMgL9R z^WiyjrHg&T&pMB@8b7pO9N#jluIbG;vro6q`=p9FPP-b?n6X2;$n^0Ui7LJmdrpLS z^Xxwwwwfz^bGm?bj#h+Y-}e=63m;$jn6&!Jyc1fHL0t|E#c@_{wg--c{oj_j>)fi8 z7d)50?r^;J#b;&8|4D3RHs0nv7kcL=Z;`Fus`vZ$qa#mOm-i^y{#(KFU*qK+iIQFJ zE6xX*weVcA_hDAl{@kLqdd{bfUDIw{&R4M1;SK$!;M;SNPvGv&M~8lKJF3i;uu2Zr z?EBRDCN=lal@8OV`JdFEyb-Zd{9KfvFhzg;!c$_~k7nzbCkw5Z!m{WZ&A2`@&U9*3`o;R`^m>NR@rU*IFFgHndx`8{IsT6Fg5+P! z-{!RV-)r7~&)v_`bv~n%yz>Y9g9TjHFDlC}o_@2;e1gcn^Kw8rw+HjJFc7dU!3`S+m175qE)wWg#2f_d6BX5p6k9pQUWFR zTKDc>y#LrUu%)Y0!v!`X*;jod4n0aUzk9b~+qQ3i z{~6}?ufJCOi}}~$s;cy|8*3CVMx0ADHm-jEz4rULxz@kW@2~&M`#_|wcLDo$=N-b1 z4BHP^aF-u82~s+tw4MKTz|E3o-_L?oyCoaj)(X6HRd7y!&y`q}ZooXbx9iMH;cthM z_-EV7eA8&%AbZG<43r`&l*7-4jZ5LVf+--Rkko zkh;!ucBjHZMYBy>iWVnhZ(o|VFwLuVO_r{9>0mT|I5BTJG`$b$R;rjDE?X1iXex8`qEB=8gFnKmzVYF@lL}P6RV|E(4%^td z#qhL^D$h~3SDXQ1*RDV3ao=h-MW(X+*rn)G+a_HRRepb~Fz4pYklHZW>K>JroU11_ zSgUS7Jswe{bN0k;Cf8)+G%(ZpH z!)NQ#=KkLMTjPJ+C2`%g3pOVC&UTA?b6}^I*Ynpx*LJLZq1qKXYx;%P%Og!owW?x8 zd5qVeYt=YbCBYxcn|8>gG}Msg_RTEUDE^9e`IrXRYqgd6YRntse!rL|`17OE^eO8; zyJkuJZrvu7sy_2tPP?>eZpZbvQ}b0z_TQ;nA>_hs6`N@NugX!JLx0bbr@TisBeN=> z-{)!8{D~)iOMKk84{vfr)eNzHdAD>>gJTEE6gIrtpDi#v^dQs>9f++`>bZ4 z*Tt`K+LC=?0pX_6i}x(&Ib0&W>+H8>F&U}z4JFw>_O&!#|0*n*|G1%teFpEtV9EIp z6FKIe{=w9rB6GMCZNPqnQ(SjhSO|9@3C)o8ziOxImCZ)+DVoS|H(^Yhlb*u$T~_u609of9rw zr+KmU;XNDoRd?d9=FPq~oqJYZ`Kl{j-KVcwniWmvYVG(lcdK!j=+`&1Q#De>!#o&W zZ!GTA(3=^Sc=JoJ?Alw)R!vx*T>Ldgb$!fD-kGv@zc{5mJNN0Tm@%`^D=$(c=$HMw^#zmewNKUZs;y@lufLR$s*U;G<3Ez>`!(fd;2!sh-o z;fw`>7v$>MH2*O*ZcWdqXnOE|i@uy#Ue zL)~tz505&hJ1k~lpY*s%&PAOw>A>A}n;Fs;D{fjetx4HJOJhJ^Lgc_G?Bn(eg-BlDb!PH3~Zb& zv?H<2d!t$Sp`#ak@=|wfU>8q|Z9S}7=yc$0kW}O?<&Q^R1h>pr3X*)Gaa^ikt<9Q_ z14)Y~f4M0CV8wf`E2o*Zwg$*A{%QFwl+o@XbKb{>XqyLObC&5AHlF85U{>6>uvTAT z{nm07H`SMtQAT-v(fvC)?ZVQEvR|3}owxj~{NtWN@q@{4K1=*AnC8Z~Det)Dp5xlz zYCo0iEbrJov94XR+fR zi8<2VRNwtW@>YN)r|fRe9ZDiSySUu6Mb}(-`Mcvo{!g>I6Tt>5A|+gL+dgXMKlT+Y z|F4%{Yh6E`?=PF|&prAt>iRd`=iW8{m+0PG~Y}@wN zG-*TUxs{IF9ljn;+R>GLb=Jj3^%rYeZZAwL+3#k&XuSa6_8{SPtA*YfH&sV4=Y<}K z{T}sUO2g#J)l2^UX1P1Hqkluc-NaKJo7y!Vv*qvO-4cA}x!P5|-@942H`el?9}ubY zBB6di9|MDnJ_Cb20|P^TQM!IE{N^zI;*#8A{luJtj70rRwEM+C=RP^-r=+4(U27vb zD?+Y{{?m_Cn`z@z<`Kc8ATY@xLgXe7Ph>)ZhXJ>QOW`D&gaRYsG&P;PwLvSdc5Tag zo3?t}tgvX;Zs93P+qRW$58a)AtM>l)TW{z5j=Q(#%pLQY2|xGk{C@WI-v9OAs^5M1 z`QPR*PebaWo4sax9vqr}cSei&r;VcV50{HqR&=&cul%u!JHA+1KEC{+bY9eFU%7ox z4{fjf$H#yF>BH)uKkVWPABX;F*#GZBtNhNuKKb1rh5t;6|KHO-|MUI2iT&}9MCIy^ z#@C-coL_M_|Lzajy7Te>4;+@i`$PEOoOZr@KgG@eb=iOZVE*q{x%j__$DEGoAF+?E zINQtgr@Q>`?biQ0E;jt%#d0S?tHs-=D0%0JMY&4W{!cD=P4w1o?QXY``&3!*IpBfN zENSt_tu}@;(*jQ%7Ln`vasH^yln()?oF)06+JrpmTxsL~c;TdWt?4t~2^q&EEo%_t za7~`La9@OiOc&RgZ>`GJ(uel`{<`mm;@<5C&0 z8pSsM&+B&s)&pqCJ{{G6b z+tA+PS7^eyAJHsnD;l0Mbxv3Q$f6}1F6bifxV23=_P5eQXIbZk5eW|YmUou(OJzOJ zef=)$>$V@WSj{Z6E{c3{UmT=zzwWH}AcrIdkvs z_STR4;vU}?$^Kt|@?_ccj>~iYX%qzdc10WUOqweEH8yFr`R28fk#_mXr!&}c&KxOt z*>sfY?8L&^YK%gsH5q?>&5%Eus5Whis-@az#r^%)B~DKEUTU%8^%rQU5*Emz_!rH2w_#N?&p7NbYZ`68T%EUdVCSlD6)g5V4YffK&n!D-E_Pe() zUOoFw`_Ag)v))LVEWh=3)0GO@aNmWWPtJ+BD)vt1)$MeT^r=}<;TA9YCu~nHVF_lq zU>H5=lv;q{x0q#9pWTd^x2Y;OS9yNgT*LbNq0xVvi)2epL^S6%?p3VM(O7hPiA1<3 zn^gSyHQT1izT`W-u`;t|yWrZ?l|~;X6}d`2_#S!o?rjY#o7mY_w>k~)-`;im@|M!* zXzrugo7dlUUO6xJvFZ7Sy1xcH4|wyoPmW3Pj-K$Og12Q(nDEINQ{1<%naDQr{GF$U z&tm-3!>idjLmp&i<-dM&>+ZF;iv>=<&3O6hU54V~2I+ncp`1O-Pv*LGK?TQw9 zossOPzde_!I9oWmmvkapbRPEW{0lCtKFip_dwzcZFs8%mqnak z@>J3BNX_(!1)WkGCzM~$T6C_#;)&2#sddf)hXq|KIkJ-`M!XT?ofV-p?bB>$9oHMG z(=wAR_X>)4aK|RKs_7-onVKZ}(`@k}AF0l(DW3|tRJ?b$=@#3&CbJnHetmt}_a`gN z_9q`ei8J1nf`}zD{+->&ILkHkFhK)Ur&+!hoKI^Ak zU;E%&5L-&C)~wX&A&;lt6jNY{w%(2T}8h82^Go1b6bKJf+_RCtq$S*7+SNj~U%saMZo?wb?=bPg%@2Zqs zKCwTEDfNUK>$c02)7Bj4i}Bk0;M;*CpDuXC&5o}Yx>;KIM5Q@Ii9b|m$)SjhrVp1> zRpv}6*e&y*X!64}p*uS4J5Cq2w%qR3_TAyTE(yH@SA z-z3}F&ko(%HCbb2deKT+B;#k?ao~S%p9ICS3Wkb zTy$dUr_gzBmHvkF)~t>izB4cF zofTs3vx;f5m*b|1&wR}$F?BCFprpCMgUjda43%dOc33Ratk^c;agA`%oe3w44MJxI zuSl74J}E(J(&3e2-jDyurfl?<)fEegI8*Rn zFedj?&f?lgwey}n%g^^%q^W&=qcrcds{huFQ7>m^7wE1{`!eHH$fcK>7s4;SnIBNV zJ5$TT{ll7+Np-Wna!!azcl$8$%To2$borZ_1$;}NbF4G3+_j=?L#uZW$GX+_t)CyQ z=u0j$3J+LTd`MkYEWA_ngsPgjvBh%_t}hB_+0QAu_boX&Q6&0khMZNqjAc@&XKLRP zmK%wmPEO?f@q{<5Z^_xCBDL$3=e?G#xR>$t5igfqd-C%qJC2{@EveZvvv2Nf^@2Bd zW)!`V@ty2hJZbBmsn51sRlN1>^4WFr%#y_x&m`(KRkmNQX=gq;TlC{}g`GE5ZswF( zPH`(dqdITW=g!=DO|SjD7FXxg_SyE{Yl=>pUp(cCSwXE@p5)_m>M^s#1d4i@e%{qM z`a9=Ds#uZa%nxS5kq`g0KKUc~^3N@kbM*~#EPT%WzrZr5e)8F$$CrN2FBf`nWe1au zlY_cP!}0j#42!q%PGIPS2ucl%30Vu3n*- z7PYRu+~VRfb%*LU1$)me=Y1Ql9lZ0g@a$iknQysM-s$h-E8gE)|8>d!jSSZ>#Y=4O zaNhau$hFHFFILJQT(nt8wf)HI<+7ar#9yBEzOrF|j^=BnqwkKyKKt4rEd1$Z-kxTI zcaD$L%FXY2`oCZFJfT39aL=V?AS-||k$J^gO} z!*{21x&I3}P&@s>zUK_-QzYAV-*36?WcDz0>9M0L8|ReGdgtdYQocNVW!awtY%y7k z(@$M%YLwsb&hK@KT)}4j#_8WgF7j5+WcqeI<>dSu>pT{p-S;4VgYSl~Y7r+jA`H*1 zx>)D;yFSrbd*cPW8GLUQO>eE|d~5Eth5h4%w=z#Xw5)rd+PYp|*8hO%_?2I_Q@`3z z*!eHRTeq4~cG)iV4Bq9}+EcS^-y8^@H|@E8%g69XKckP?^jm!J@jd<7|4>D5#lNYB z=iNU9HoH%mVRKwFP`@T3&!D(>E&rOO{;MAy_R0OSv&pXd$6?L5O-U@`bJs4_tAA=B zRT*d6BWkl=?pV^i>paPJ=d;@lyUXVsJ1R1vSM~Ly2!El9M>h@#tVx`9rNHzh#~<<6 ztq0N`I_*B;++L8}u5rN6P;$4cVwJ1lx2~i&;;9_nMJ`7|?x<57#6{m_to-l;7%n>*9_KAt%{ z<9Q47`Bz(PK6j=we!P-$=JSrX(=C;Ece`!2j-GjY5nr&&-cQqas(&yvcH4aR*ozsu zZr@doW=wu`c)xfao65bse^-uOG~wa*J$pF9H~6%{w98klda7ob@g>Xo&YqNX`L)RG z-jZLACILBmuA3v;dXrSQb%bUJXaBI@c0pI_qVl!G=^q|=ZDg!n)cR=4)JG-4c|x;u zUH{BTy_%d>qqfK>{NL(HVv=8zF7fAjS1((=cK6gZx1W7*zU}$a_TYcsr!f=#R}|_y zZhR3C_N2mU%ke82cU!i_cA8D%dmCsP#lP@v$fCJk?cV}TZ#``(YZZFiS(4Ge`r@CK zYpY$VwPbI(U&*jq_%?8n?c8OIHLt@W?q2^56*8NO%klHB(QVn zEMl>K9FtdcHG*AJkx%pVS!1zlMKi^&EDO@TF^8wXbkk8&vj!RN2Wx~9yp0ZgW%cX?S zQ#r-+H{ZH*`pn_wcQOj+KNY+F@rxy&@0~uQ!uGdcG`BxE{W0_An=F?vHg?MX^Up6k zy>RyxwI$lSc6d*8j{Gqv=4a(D@sIoUXPNyL`d}Y`vf^z?$leVf7#SFhSr`~RN$wka zq1@5tn37mfl3D~kS3LN1p0J^at=}cixy!z=Hf|A!y5&{Npd29-!s)8e#Kaxs>a=D~ z=hPjuKDulZ{=s6$9yZnC5%Uj?BU^=+HnCiEO@C;)Z{PPhuZy9_iVMGK=Ljf0y;o_Q z^OKFiNB%06Nj9Yic~&3VP<`P{iT)|8bfsdkijON_$! zgBR*-HwupXTKYQHS#`;Sr}N8y9^i^iK5xu^#b3;~KPJNXk z9DPOluOslJKYjcR40Z|(3}GZEE8oPt#Prk@x6IU>l%Uky#Dap%yma4G z(Cyc#X)J;}A>``JfB#a_-l^PaQJFA7(T2@a;R)vqHy#C7In!w@DvZ3>woZQ{)OJq! zj8DajZM(ByX5C(UHS21^+KIOwG4Gz@E*Bt}yFF{`UH9F$-(6dG*Zpo;{M)?T(%m7y z<`%#ANlV!D;GNL(JH_W8+du#R?|psD{-5Vo8Z%7u%4Xcxp)dNtV4lViHJiu|=?@`{ z^Nvkq+Gn?Tmj3Ez{oIyiA-ey%8k1XRG(E1HqjAKuM?%8XAgn{E=Xar(t^ew0t6OJu zrC;4<%r;N^NTf~v16KQe%gk!;9+yAWUfuKNxHNSN{rkT?&gc5byk}Wk{fb%p zL(jhUx-9Q|@czU1%OA*p=wJ17W1~6Og|_;jv%*Bzv}V7$j*P__W!Q-*9X7< zziwImGPe44v;Kd0Y|r~=k-+tbk@i(n((+e{?*H;Qyl&6Zgo@h->Lq_{ZTv6h(|f~n z^?9$T*s>b`71zbq+!E;iZtl)@_~ZpS>vu@r-XD9r`^~*254dy-N`WDR;KbzTUFdWs&i<<==i( z^v~UBcks{2u<{qIE1zmRT@3gn<+#G^cvbq#YXM4AdX7$y|MlavMbX8u#&q85mKWmnHoPL)pD8&AMX0Teyi}_rb9dC%JjI;6|c8Q z`)YZ2(Yhs9e=p?AK45xv%@&sLN~=x{PWU-43oReS9nIbRpnd$+!ol`1Qrl>N=F zaZFtL#Z?85-3s;nt~-{$-6Aye(45wJx4yaF7IFR(oyxc4>aM43btj)&zfpx3w4j1M;PB_FRvX4>}TG@iOD`k_O{~dm;(z6_Xyxy)oD*yH~AB<@|)2V4D|a z7njb`y^;0E?M_Npc#WFe0Y1mKPu+x7FDOXo@16QDtt+03#aR8#wn~FpJg#p_e^xoFcYyzkbmBa3FWXr>zVYWVL<-DypuM&LS(+-(ip83KJFS57jzxuEY>b!D?jqc(f8!G1&YQ#E2pef zv*S43DKm4Mxk`dkEiKl8-nk{WRo!Y2lvgFzn*C6-jW=rFwd@`pjo6~k)*45`u>)vH1+6TK+ zJ3Fgan%TAPX7zm^ef{p$y}NeT`WlGwu4>72tzNlRDQAP)#gNGyZpkMfIP^St5pi!z z=IPxx6OuUCeIrjTUim{=jc;YJ`K9KjzGnyTNnAF5%Ca`&f~Q@dSIv9wRWkBCmP)Zf ztlw{+T(;n`^SMS-9p-gA8kn_W)Mo8YuH9%d-*;zFl*rjG$q?z{Kgy;OKA|&;I)2L? zT=xI{Bc}}&MdfpIydON$l`hrtN%=YH@#3bgI}7_4etP7i#1XeDZsG38y?c4ubvpGT zPjKd)n`!V*+%?5aOQ$X5Mf}ftt$8o=-_A|Re?F_!rSISExv{sl#D#sGw)kDt4CRB* z{5t=M+%KIpD`HdHa?$sj%K2}7QJcHuQ})%O`9Zd)cI`C`=h~lfg7?Dd(5(KYKMeMo zJ)bKcGtEU$M=3zd^0+heEJM@C?_md?+o5Fg^f=XTW4r#uLx-T0Zras5yV3*+&xgGPkN{$7`>S9!~!p47Zbqc~5t%QXMd)X95x}Ty4HCgM{ z@>Sxo7Ji4;{$IG}s+Ljxrb%4s&!j~Aj8J!568?^lita#OTuv%!}uC~brucZ7B{TJ0ceVF}5Sb=bXsMkiGsXL@LUu@IfAhW$- z%Q?aJ`v=!HyxX|wVdARgdXtt{ztZ}t5wLYd^~C5M`t#3A+HA{XVU>R6w_w9#lVx8_ zuJj+WnPs;pLVq_~-I_&u@2|GA&0YKA@~mHmqGn|Q1%g}`&&SFAkI>rb{a@2W7u~cxi-{K|dB1=>~tI_^xIxqfx*UkUARZs89^wibwdp6~7WRN?wF zUq`nc9W%p|pFI}5D!kz;OU>hm2d&0c+v;SvKN~j2Nw4L973sjcdgE-5BO6;uCD$Vs#$*(Wp@N=#EYN=x)VBcP}P2`Bw-J?4jl%}X3Ntbn58MHj>nnl*Z5)<{GDk@*Wm9=sU+HppHPHuF<(La9a(fzH*Kjhjpzt55> zH;5@)%(CDA43AgN0r>}fi}tZ`e+*Q5b+pRr0OPlsJJD{-e>wNvb+nURkX=!6@A#GH z3J+ubn(OBnpVCvmTxR+5mTTlMAphsw4*|13A&a|R#W zx$D<5TiWXxpIB0p!}s|7DIYP@41L9^QkyHDJXtHhp|-d2N&A&ArJr87zuXh**H?2Z z_4}MJYoD+9pL3z%N)Mje%74|?kN+M1vv-xP zz>P~2YFmYQ#a}c&zg%wmim8pSFn(VIf4U#H=FU=?>`xaaB%cX2u059c#mf1(p4GQs zTQcfn53KLs`|45hT}$^9A9;4ZtSP&}`{d=$PLFD~vpM${{QuLU^IKE-+4+rp`yJHp zrMUc6-T6gZ?Q8jq%I628gtvFLmwbPi_wlk_tA(~&+@z!$cdw7jLLTVOY`lNMM|0B6 zAjM+U6Z=_>{KY=zue@@SYvuIp)Qu%4rf%|#N?9GFI!$N#-8r78v@8$Y^gk(88F1~C z@+QBwr++^!$(iu@j^R03{nKfcp}U?|7ft>%!?f{J!|s>D<`*}=zs#w3a(>qrJI-CU z&S6Wc`FFkkQ)F}XaP*fIzrXhRe(~AsSLt-B|3>jl*>SU4;)6&G}5ir#^aN(Dd@eo^6Z! zo?hRjC}NuO+}C#@=jXE*!?&)8kUw?gn9t3|otOHvIv02@ddXmDKKI|LAKy3dvDui( zYR!rjHP%{xej`I+o@7~Y{DL~AfQ`}jCw|)4=@7c?%EY@G6D*c_2&o#)@GDW}F_>Te zAlbod?wginUrq+!s5KFt`owShGwY?1`|CJNQ{R71{ZZ3z9(r)zu~OSrMY;8T0e!s5 zRcsH%HPT-^{PDsd&3sy{ebaaT*gXl6R!JNFoaJe{8k*;E>9p78@0$8Cr&Af)vCHuhj$7l@<(kf8>+IlhrBx^_0wY46X6$={gu?dC+xq|z59t>)y=;W zliCe*oGp~t3uEMt?XX$&@DIbnIqvgiuhrZ>&+}`>J6Zq2_{3>#KSFk$vYh%zzgn;U z=5F`T&tieNXxinwK z$S1y*C-|wrveV)L>ix-UYXoIKspdTSEmo-&t8jgxTR4NA+osT6OedE6oi1g4khm;r znKr{z&wQWc;>EL-mv0UWsJwr2V(1C`^SpLyMY}$@^u>QN+s@5x_0{+Lk9@TA;zHA( zO5bB+U`XRf687hW47H-BKgMoXAIVIYmO-13GLin$UnO} z^v>~(@6)fdYi$tW|Mb}T&3}X0?l){sJu{s5Z%3E9)`eG9wkMxy&iiR%ZFBfpq}lnE z6>&$owcRoQ^JtT7Y*M%_W^E@}XrZBRGw#gP3MJn%2E?7UWEXKZkNqD(i(VOsz z=QwWrJ!>mrJuPIJZ82-|Irc9HS8UiEc>L1WjPir&%}te&cLkjf32NTGmA@qOR+^=* z^|ZpCzq?Xj2i`t;D{!KutYF~bEwb4o3Y z&~kYZmT1Wnccv&``dxK&#deWip^v8Xri&~VaC`MI-1FcZ+q~#W6)&F)${Xk{JJGo} zX@5tbrJI^md5O1yj;MZM*I()C%Y_ngx=Rn5?#hjjn-F2O_O?sF3e$7zPq%zubL8ap z+g-B_jK4iPuQF@uSF6+BjRm%!`wZK7ZiPeXXiab($Aas z{Ucl6_m7!bxoaP52KU@jwsb$-{=?y@yOiBAbt%5hKSk!R{1J0l+``Ey`^O~5+Sc`= zTjqFY^Ilh4`A}NsY5{Xu){Vy3rZuON?-%AzI%{ZFS+nfHqT;TFi4A*y7i@0Rl(}Be zRDJ*R4gMYTxDK+`#fL0d=BaySP20^4Wj)I{c|GH7e))f<{K7I7CQ9n^MeOE z1|3tX>Ngxpf4~;|{eDW%&70Di{2ja69w|N#k}*Cz=XJ%r=iH%lybkxxo)TEilJ0U- z?tQ@A_pA4D9xm(XTQyVp$b!H#M|Lqa8=p3vtHfgH**evA%2}Uvv3H(aS13MaZTx6U zc4ATExQg%EJJmmsrS;Z! zrO5#=&DHyhm;w#`d^;3<6n*xeI+Xp3_49?A{zjW;zvP@NLpENv*e32)e_&7aGK2ZM zCr3mF?GD3_hGd!LBZ&8I7laD^nRzO5CN5?m;|eKGUuOm|t2 z2~wJu9y3(#_q<~)JZrame`ofK@U{bs>_2X}vhw)jr1mFl5oa{|7T3ve--$cSa^*r| zOOtz-$EhXHtKz>L-S=V&``73f|Bj^Z6#t{HWaW}OefQC$>K9fhTr6Yq7O}c(z2fqc z2kAO*dCS~xEx%ynw`Vd#V?cW2qHoJ=qWI?jE1lJss-eESvE{DEUq7WJ<3%jVx@&KF zIwWl|Ws_Jqb$TMF?78We&xm^AQov35VMa{O!EsU=jOyt6Crsrj$> z$_LzcZ=W6;x65p|lex<+wZe-c(|Q-LdTTLldQ$dmeeK!ZkvDY?YOvm$rIKHg|KXZc zgOa+5ncVTC!Yh`h9c5XyA~G^-?vnhu#~xYr)+o=6Tkg1Svev8OOPAAkuRgD8{53NE z!t$-=m+U%2gFAXIfAd_i?VQ^CXwILlS@t!*rW?23^1QPAg4_0)TX#(Sv~IrE!Lu%} zbyW_nbzOK(=#!oQ3hxu^&3?1 zDR*RDB;Rp8;JG8bOEdTkD;kWG>J@=*x0e;qtO^c1>_>x$T-*{>v zEjRUJM~|>$$YWzho36=>TV_u`KI7u?n@=~_**rY{{KnhoH=lAlx_n4sopA935K^H}@M!^pCqtK{Q9KYm?jBYq%gPKxvS&8N-({8%P`f6~X?w3pUK`=pOJ zJv+7dM;z7 zN=q`(xYJ{M+6u#~0o7Z-_}Q-7>OJA>6NgpNveOJ!X7An=+?&E{E4PrbO8muD_Q|Uz z`eqAFv$(&`ME-GBk-??xC10N;?9NR&yzOn&m5g{_vt#S8Oy0FI%Bk}8oU=kTvMXmC z+wf({waLCYmoLq}l3OUX@|BnC)gNi5Yd5DGzA$e4($nIlJ5y0ew$OC)ORtrNx@w6< zuOrxa5@Jl&#noA^-MIG|cW1YYTKbOT)j`L0g_ucNXP1Xar!^+^x&M?lJ=ocMaH7G& z>j8_cHTdReOr6=%S(UbSqSuSSu8#p-67w#fnmqZ@#v4m>A9EU9nl9eU zrda-c5|R}jL zL-mKxS&f9BOk z32SbjxamrBmRSU5c=4Kij4gDX+_e9}dai$M`%nL9Z>oP}!}|Zwe$_Qve;3@yJsai! zAe;SVYtMg;3c>%OAB5u4(&8sx2zjHRniy4g>gUZR3)M|tt9Bn+ZNw_C^-Cltd3s&U zss!b8i$5>?%yQ8ux^{EZ_r&>4iZ8lUJX1G?tn;wToYN%hG10@y%zIXiq*0eioKnXG z>ozW)s!pBg@Yg$63O*2d-`g5EbNvG;w^aRg+X79$cH9f^zqd_LCvgOPnpo@{IB^kY=mD!+Qixtw<=C8C=6 z=B?DZ-FW8Pwcv@pQ&O6P)~@7ScHz~B4bztB%?-a~=wTwE`$bx_xTEOGtID`l-yD|s zuS)zTvi#R{&5T0RQ|Fx4%F51DQ`@<#7~ z59`c6ZS$f+K*rjIO`~C*^ZVDn;oD}0n9Yvo_%ip_`6G9=cHFvVc`tguPqk0~w%ZB! z9seAURIRkjI`jA7tjEqCn|2;d+c3fIgEhmHg?(E&?uKsUWh|NUbn#q^sqZr1FUS_} zUE^kXmvP~?~(MIH5_&tn`|llJz?o%!K{_pYX0vGP0VTJE8}9mVd@=XXkGVxhj^-O0 zMmH_BxO*&r=FxmfHkTRGIt@1NuH(6Mi*<_Rk(++W$NzMkRH4`I6r%BJ0-dQkzR{o5Fd)n49>{2U^e=g`1i&1WK z-6pNOTY0=C(nohH~ z8tsgY$deTAzqx+0-)4{P0T$aPP5FAeAX?{+*df#4TS*V4!sLX$oOyP>>_rFf=Go;Z zZurc&ATIdj=$7P|q~>|Kj_1X0u2_6CkkL2YnQ`yzd9`0|ziP-k>v=;)G4aU4<+=0P z^ISQt-L%$4&hp)+^Cs+#VBYpeMSZr-mt>#rQhk`a!)ZfBf57Su%?$yoEtffM6%Evw z>$F?8c%|WIF41i>TGk$E|5&!CdAg^>`zKsilQgHals`PhBx-$qZ?Z~v$eXwrRiC+! zSKN51%&|LnDR;>0hS0UuomrCGtF~^KCA2cTWJzA!zN|gQ+a@b*?p~F+T{pSx?aiFb ze$L4B(>Hc&2CG#}ns@UQ8~eJMhJ3cQ^W6K^9T4gIrz!H^rmVU3ZoG<`0aw={vz8W)OZlm+41c$c2Y0@6-0OMxAF= zsghq5dA;-Qq_Dj$S(5S*$GN^Y{}AXkej)A>|LtkjgRqb}2b{VNWVRp8H{Tm+(sfj* z>RE46XUpG=#j`J~2CZ6pWlc`v-2UzFH~kGbRJt!vN8kDW!tnY0#)_W{Z}C2{EU>+} ztI_P2bmueQEpPApv>%N2IGMjWs><@|^C~TQ`CKFJjCbujt81rK*D5XhS`x8feR|Pj zwHfVk#ZS^67I5r)H9b)Cv6$rV!}^z2R36wjHSJ#7&i^tG4Zd6F?ps&zOX}p$TX~eA$#tf`CDY>x+?zE(A?F3?wq%dyS1*nb?f4~ zHA`)7$(p*`smaW3`7}K+_18{=_s@@KK4M(GYxkXBTQ2Qge9w1RnSWrfm4?YH2FsKv zGne}&mQkfsV;9HF4LXJb@%l2oAk~m z%~@u(wdK~tj&iY{>lWpE=4lA6w_aNjtMSP6tm8fFkhGb$p6Nf9=PX$s`E7Zp!PSVw zPr=)t>}#I=Gs~dRs(HdSyB6a}9~J4hQM>B84$D^YqAuZaZVT3a%E-X*j+ueMkK_To zAlR}U&%C_UBIlgM;$laXa9QbLq?*a$$%(6$CtBGFPyDNNOwrs^VyWjOE#bPTO}}{ld9Pezn^aM} zLG7W%vtvC=CYoLS`JyJ9FHy(yTr6$Ya6ln>I}MJAZCT zV#V_-lWn#Y>1`2QxUrM7a?aTbjj0>0{988NITf<=RCia9FS{4#+g~-N4`-G-PhDi` z{CriV#H`Ou`^3wp`AJM_KKP;Me5FLODX;$;wXgq5ZI+A2-ZeccUivTed!-1c^XAQr zYaKrxS^J_%A1l~y98f!a`~O!N9_#6Q4tH&+e|r6O-v;;jd!6RbFALe?xx!^fo7G(2O?H!F zm+ih;UB!3J`cLDfa`&uDm6uziR0_IJNOPQcrSoEkW1z*AMH3KIi^7%Kxq2+0X5I3qKy#IY#7I3zzLBQ+>9J);EMim>3=d?7~> zTjtY2+ivS;*=vMGd5gX{uD0)*iJ6+4&@BnY+7Bz4dkm)DRo%_}ZT*YgFT3^C)OziH zF#icWX3c!Cf7wcYC!;yl&)-=-zqh;Q|HrS=4emF}Cmh?xEX{9HHA69EmYd{Mld?-U zQa8w-c39=ymb6mLO;$f=UiY*r?OAgDweKTVbo@W1&zT=+WrKx8=918f|Ja3Y-;L$_fQ{}7oTz_BW&$h9PZ6Ak7 zxDiiJ&R*^K)r(gMn;&uu-!oA7*YwX}8RzvO*3X^a zeXY3g@s-vj$L9~`8(sgJwMVncJU-;?1*Uhi1!I+$?B3Q9%`-EijA=&1#|dJ+*+6PK;4czxFJeSf;W?qfFJ{Z^|scwPOZ&34_VnJtj_QNuj_ z&|XLDH`~v|O?H+uwD?*eu=R-X%F1o|w~y_6cj~B!k>0yU^SW76V$USn_1cQF<`~TR zbN{cgNM6*Rx1x{3nP-2A_i(P)F?c)AuYHlT$_wrrQ|D@L@NW^CvFx(pP01w&+|w_7 zTG3^+x$WpRU19difBSdZ39P@S5kBpWw#vQ4jhi;_p1!$AQ&wGn;$P9|^eGpMJe8-b zM*ljKAZV$xutik)ca4k1MBU4OWhY(E=nOctAl1pUIc!7Lj8jK8c|9|Ya-R2Q-Rx_^ zJ0q*wzL{-{SsH)#;gkEyxv_`5>gH5z>OFTW|E;yKd|zT}n`!HjE5f#%QU7LqYg)2p zVN&W{o}`7JB*W_datC?FB-M#TrmOv{=3t%mh>i2!aj`D9n&cy*M>k_H>@Z-$P z{C&pHXB(%#|NrsmbcT6{)|&JkII*BXGS#-Sp~gSGK<<3cqnjr44u6)EiVJwht$8MG z!ofMS_RKi6C#urZS8r8fqR7#}DN`#wd8dl#E#Gj$KqxQb;1iz1M`t}>FYR}nZ|%A- z%$Y0;g(VK<<#QY^YQFH^;u5cGM&&w1rsFGqAKGdge8c+?k8OSSv>nfMu5&$?w9|V# z-RJ%HS+g(k+@I{*yHo2h@A|E2tYV63tGD`I6m8SJQ<`l0MYp`RY^ zn`3s~DV%j_efKioc{RSQF~a+nKC4Z4I(e|*&n^+&^INxTNnffdUwCz^&&~@%Zv%eu z?0L28()t@p94d+V?~JdX+?zacnc?!&1+N;5Cj2;LlIrk0G1Tj@XrEu<7iBn?Eg&q%PWq8f5Fj^gV-2CaJr6tyzj8_+H866Ll zd90Dt`8d#K+M&}j>le&AB-$4qnCvmTIYKk$X~Z$E7H{5 zZv^7E=sNGqKeg?WwE^2LJ-!&3>>UR`vPsG0KTPg$Y>l}w zH@0@Q@6i+bYu8*66Q7oURr>mhqq5RUE0~0i-q^*Xf4TU>+HKPw7i4BEDO`JLlIq*A zC6`+-?cde>aJ$j6o9jyEl)0EWrc~P+x1PVGxcb$^U5DbXz5iA6QvS>?LEdnUt|dji zN}_GD(XAfY2`pYyN;p%tYHLl;P+V;LD~3nCZR*PhXDV9ug|Yr>*%;%um0?rT7wtzD z5^_q}!k#@B>et!SvahKrTQoyMZM)#_5M}=h7JU}I-#NdVZu-F{Y+~(ie5<*=kn4h& zsp#1`hgJMu%Uas>8GB@`b_tvGMsv#V!usVq57me4>#bNP@m^7|eG~s9v%ed6dpvWu zbADCa^KF9PBRQkqT$vTF6a1G|KVbf|*I8nB_eZ%+6VeHi_>6?Ghwb-}VxSpTcK7r3Z$oUT^?;jri{STP`bn$+^e@!idg&7#$=rS<4P+VF-M}ea_YoaN63u8r`$z zT>DBNTgyCUbd;K;<~yq-)9B6(znRP$-6Ah{E;%`EVRRV#iGZnT3rw1qNb30Zne60x zy3CVn<7XqZz&K9(~r6g~PF_*mWabEeXN2Xsyv3pMrb zs6?N>6XCK{Z`P^{E7!1C`EvLNXYA@uJMqg$v1-?x`KAqN-1j%PzAuWLt(-0Q@@#2w z{yeA8cQY2S8bz!KXqE0&Dp%H>G}B9QQ^YLQn_H$#(=2I|&Mv&+8v4gKeb)<}pX^SaNKUu50% z*hzeC>BMCLle_nDnQAZDUAWUA%uV;wmR&1+SNvEKx%@(v_|LmHoZjkj?a){e(EetZ z$HECtiLFX46SYg%T1tG#Uzc-v?`!Q@=0EmSxo*BDc+r_!wSxXEmSwC3EP4hX?nM=D4%*;uowA z?N^`cE zaWB3%VV&!YCoN5f{$*HcFKPd2cP%N_<@37r7p-)reR8haeJ$|l_AJKr`>rhiJ$vS1 zn`K!u78pPJJU#UHAwk22ja!}b&B|mCA33(GbmOgctXr<#m}zpK<&XgTTdiY4%IZg= zi+{yg>I8Prw$AbOd%v~(-N(wA_U;S)TFnYxtp2=}ZHq^G2j|&0%9;B;HVSZdC2MSD zbuDhrQJrbr@^R&fnbJ9?Gw&tK&$<{tPsXKX<>lY{zUwE?WV_#D9K>|LP(k&HP>PfY z&(Ek@#sZS>H%apz>>b-~!1@*H`!lf&OnkT|&Fw7q%e z5uO*)zISIAr5r!Tv!h`4deuu0xPSAouC+KgAw+$-w$s{&zY=O^@4IyUmYAVt^h-y9 zqw@r`*HV;PxDjs^e-#>$-TK6xbf=IeE}`SK^A8|+Fg>|X0D+->wG?ooxe~Y zPq%?Usoo8V8num8xqI`Lr_Vl<(5^n?Mp1U0{(ZB=S65cH{AzkX`ytolhnBg*m&>lR zT02i#slvLFR+k(>WUql=Gt34m!91bdo=gXg`*{%Uehn7YQ>)8t!s+r zNbZ~N6q>a_J7iaoS--z-bdPN7x}cX?zZ$)+8)$EF<@+B{6}|MQpj`MzPP?ZqOD=8Q z;(OHoVX!FwBgLuf7QfYs)tCPEL16!JMbY{R&x|wwX`J2vSm3#Q`Vr1G*JrD~TT#M% zcg3atmuh|`T6cZy17C{mGTqu>n6tWMc0t*0lky9E7w`E^eYZr~GDA*$7uVgTm+qGI zcjdhae;GINMdZ7O%$fHl?fm_s?$C?JF7bR~nq>tiHajof@U3CRTgS3B$(z#VKll(7 za6{p_T#~!}G_|Di3x~gOv~OtYOkDY?=uv{nU*Dy%Nw?i!8XkIbrC`N`ZF-mXb*()T zSk<7sdBqnC+l7}VSGb<}8mxTF|6Tf~fR~z8QA_V`aZkDBz2fhG-g{18C8vJ7XuPsf znEReqX<*3Gyd-7$1?i!$7CslLid!oF!nJSu-n$in%g^7}Ip2Oz=5?jbvb#HW*7SJk zUpy_tw0y-EuDz=+oDcbB`M1gVGUv4~eMQEVOad?Yid=KVxHylQMuxmJWxS!^x%Xpf zV~>*gXI8Dfj`>|L<3nGDf0^c$e|lehFsJa#7ozKT?$ERd-Z1&C=`q2*kxR>8_=@c@ zH7q-Q?ocOB|D(qYnjZt=vga$DpBj=SRQrw3U+{nEFW$YYFI9huURm?w?uBKSet)r^ zYPW#@r>DgAYp2dR9J#(uf8%R`Yll`j%ofY|_WEqHQq1bjfsxm94*RT+zg`jBYf*I4 zkagYrzXl;Mm4D4J`2YK0N$r>a$a%a)Rn=SXczO0JrZvkO&T?`K?mxD}=I7Cy56|)0rp!BOv|4Iwne9@0iwma6;3eeNG>QI6nXEOlgz) z^!4#sNxxTfull9+hb29y*K9_{>H?eoNK<3~GqPHT%DBpY_WXFBT&VW-^-^uItNO35 zJo)h8T;H_`*VbHT4=*wM+3M!z7@9cs3TJ5Op-fM&NwxQ?H|_l+e|56VwB-vMtNbkA zesx@V$ax>%;Wv}HCdqjIa+o6X$YRFTLt9MP4!uzkIp>=+H^s$$>kp*@2`KS_7|aSFPne|=k5jwjp11(sK> zcN}k+I{%5ApMb2A%<^-`kxy*ZtK4p@+&uI`U-0Pa?rHk#?*1N`{Dy^$-f8n~^=;ya=*N-??Ev3afG(EH4PPugA;I4!dXI_PxP2QAY zWT_L$qnUGH<&C~ng_wSxCnxpQ7%n|&7kvCX?DcQ6JLm3O?s?Dm=0TZy|G8&BP5zzJ zedQJvSSWs}`6~kGnJ$-sy8UQ!{An+|ixhHj};3{2gP@yqGht^6!q; zs#Wgdd3kJ|e%Cj}$@VV;Q{K9$z18dT*N9a(e&K5C8@V0QyA2oYidgo|@okeOUBJLi60&lW(2YZB<{-T^VM+pZn+0-v%wNQdJCxFKxIb#p^H8Yr)WODHSPl z)Uz+p+^_HLl#802ivu|qU*ueDcrC;H^qjnm^^DFtbq^?rY)A5h zVCOdW$fOD==za;G2^MNAH$?S)f?hrufk#rEs@|o=#%r^i3^S zBRZwl94cyl{ql^PsPfB1n?vee2AsQhOy}eG{;45noD!9L^2sCP?~ev$j35%-QG`vdMJ%qdhaWJk@y{XOrw6FiO)wc;tjxW)*IppqJxOmT<-oMk_=jT^`;b?o3S$TQUjD5^EU60yGge(=19Ctn=Ab4}kEbVuM)K z+sTP;H9I=`OFcDCtTvfj`=Cze-7%rKbJ4Rt+DtQDChc;5#qIu8pU#MgzdwI`X3@vU zc|M<$CWrAw@7-miUAyd%(G{1#=y#uX@Fna_SnN=x%_5UNJ-vF9ZDhZKcJeZ#keiI# z)elcT>ry6LyZ*}IjhmO5@J-~t@xVcPcT4}*J$>$sJ&qHY9oT2v9$CP-m{l<6Altqa zW#=T}xMNEzxTimqIQ%npg??3A-P z?(n-K)4pF^!YW7NcHf=qiyM-~coPKYB^s}qa`J+ZM&H52eV;|2Rj}Xxrr1oQe>X4%wb)x`D5wd_ob})8Wod8{&4+ZTfDQL zg}G1SM$Kt9f!?%LXVkZey+3|RiY+Jh%!;ov)u*H?v!*@RF-0PJ^{JaRyuD2ASD(&2 zI`53extEU0&N;r7)9wb^Ncv?=P}lA%w&gOH44m`)WWr%7UyinY}RGsD~O6hBAc@S=?E z&n?qtp8j2Re3b^%QBS8CKHu%K^EO?blGE;KyF*+yFy_e;nfYEbpNb#fTvN2G>|FVU zQlGb0RSoIiT?DoKo*#brNJFV_)A63_`iDUuwf(Be(SRp3H?UY=RdPq?{~6Tz-~lefL|w(4@WX=!74t>Jgi3 zELx1;ws?KkVfJ4l_~UuRKclWzXSa$+NejEm{~a{5FJ2`vGk#=2=b`!Y*qrB= zyw}9cV)>=HVXyU64Y!>xmnB+@1AK}%cDxO7{cO2k&q3DG`&OvfZs8pc+iw0nlV-km z=FO)+rkGt$`+mt{_jK9*yE|@H6<8j>pq*8b>Fy~K{^@&M^MMC@des!$ZT37|b#IA` zSjh#e8{OBg?#=xA?ZmC1%gUK~E8k9xDU^HeRPA>ue4&Xe-yGHG&6Xy|et&G%SXVj6 zbWdy-^S>Rv9CyDLPYVoe(iSUVWjd4ah`+mKH;>#q)7^3J?qxMqw_6sQmFIiTh&*uj zws4x)<1NR&CU`HNd!_D#w z?Kv)WW_gs((x)qyihj6sGs68V$0eh(9Wh z>R#{pSmUb8;gjB~OD>mWE#%mGap{xA+8Q3wE1S0kcH}KGc>7@L?hIyI59ybjw_N-$ z9=+l^{le!xzg2h5iF+)Ze@v$0$n}=?zrIxT;{9%; z=f{lL`sp8MSb22!NX*c?m-ss%YTi?4@0Z+vxc^P9eaU!O`tJRQ3j}%XpEvyAofq;U zKd(G5Z(a43`xU0X|E4#ID%?x$pS=B$>$c;u(%*OF*4pTa+w$12>sYUSE>q;`>nO)ML9;UdzoY47ylUKXF^xOCy z4kGUr^~AP6c6;z1b#@;?macx+LSDX=KPp)K-3n#=T`#r? zZ+fbpa!h^t!{CajBg?Zb4RjwFE7`4nR4n+#{X?Z_d`FVzW14|xB3ZC!!v8iKy z$B$JV&y{{evBZae~Oj%|r5zl?T0=6QasH(`BlRYiBMULp#Drnsa`nai0QpDuU zskHQ?CoC^MbJ^2WZE}ZyuIJSPIr~c!*!J3MB(3jxd#u_t=D_Ndq{_0jp2;yqHJQh~ zJ=J`@T0%Z1^V%QuXPrMk^M_^K!iUp;h@M>X(DYB#;rtJ~+U|Fy@1N`t9&a|CYgMvr z-<4^9lh}3_aBFw>h^n_dRBksgZiJy!|@-&dFv0~H~r&0>;DnYNm{XPoM8(i z(%JcM-BL|h_b^^VBOrIa1(%cI$D9XqSH^QiX+OMSJ5`D6%lf>B50iaY>Bw;9{oU_n zmmO79k+P+HN4|KWZu`mo$yL*ecy-D$w@$eoRgu5d=f$}R^`|C(3D_RAbk*)9(dqV| z6*n5Gh;^uZ&a5n(tv%f<^~qD0_(@`do4XPV=U2|Rz1-~{`1;9mp4;)kipaiT;iir{0B3^^rE~+i`E>U4562Qob9{dFfl83Z6b`&iVL8Q})gU=Tx`r zG~I4=b&BOVwQxK4(?-`KSDmeymknd%{<&P5lr_`Gt9tFIX1uw!*L+ru9^tGHKazRF^pXgqJ_ZO!$|G#^;y z?c~~8vQRGjM}2~BQpRyvnappz%AMAX{=&y2YzxHMn%~}kATzVnsqDe}EU~TU7e!gt z%3Z8Y--ajBJ4$zHn09pd`GE4bnL~W48;@K8yj!A-RWU@xNqL) zyaRIoRCmjpA3UUHb7bP<7n;rwTpAp>V|Xe#c&e>6zJ~lXc%b66(8T#G!`b=AO?m#_ zI`}!`_Vs}KH!5V4S6Q})b`^=OZhv%l-{sE@YiAygx^>5Z-L7Q5BmY#s*7MEV);>Jo zl3l^}+GUNnps;oH>c?xZ?pqq1zxUZunQuvP%^l*EEf=>=Gi2v318PelYF&-paJb z?ObBB(5{Bw^obHZ*SEK&724V-{xn&j;G^}>s#{u*t$2ks!{+_FIi3}?PL+(@-+1EF z_IYkyZKrqn?KM4q&v^3=L%BzfW>>VCP5ro<{j}zHf!(z!*XoR3F#LXhSfzQJ`z;KR{fgzLR=0$!%NoH|S!!rrd178k zYKnVmNl9u^aWI4etu-i4%P-1>9qF|<;H=kS2Z4Xve1m&0irqgjyKBdT(2q(lR5fng z`fVb6TlePOO}jfEL{|#g{9v$~vct2M!T;O=^Ut+s$ak zc(Bs4i6{G*n=hAlY@hMPpl3!|QrFy$pW7IApV;+n?>epjXq#LQ>=CIu$;7}=%gVrD zL{e0gR#$}XtnIVEsDI_wPb-6+wu9432zvc0L)|{a2|83W&7Hnl|dH+Dc zG9okX`oXpH${tO8lQZ?1>2AFTCMmiH)j!`_!pbI@Gtp`DkCe_X)dc}JLo+r{T5_pZ z+mih#hd{&a=;Dbp%}%CEE#(b%jc(l{aA@{<{V681B4-pk*~>k@I6GjP(W64+4^Hd! zrsUeV?9~>(^(Bb!ll=4Ew0%m|OJt6UU6;%?pE#@Rhx@wkP48X5*~}@9Nxk{u?9PcY zH>`{Ao;3P>`uEWv&v|= yivYIUtw=Cxy8knt+5QshL*qW1z~lV|QwkuATOtTyAP z^by&DHMwlcw!-$ao7n}7XH7F)wj%XJ_9SHh)vXn9& zxoq$((duIVXXfGr_azCZo~1l5IAQtv!P}BW;fr_w+M@nn$nwh_og4G3se@G&QO0D-ZEwLLG#_ReCdf@tKXUZm_7UdQ?u6}Ht#?2 z;Qx#LQvW6^ea=60Xz|*&e7BF^c&+MJZ~OhivBTZ1)6HhGzj*xZ>vm_Ck6l$8zBq96 zhs!yhQaIhQjO+Z3%K5r}$xmGlJHfPP2Y_`Q~zqd0?@O^A*czNT^*HPuc#geJPEHO_stPBe# ze<|>&muX&jHLyG3{rd8~KRBK5Kj_$TSnKSq4Lf#SW=PUywLgC2aX$Y|IhT30c9owD zZ_iCOJC^;3|6@bss(T8*zU>#ky!_X}#rL;XO}rL2S2pg|KeX#&j+)d-o@8fW5EEix zu)&)#ax*J3^NRJ|5{pY5OY(Cwll_yjQj<%3LBfzO&(ZMc9GP&*f5+zCjePGXbX(dy za=Y&x6LD+la!>uvWNWoPX?2y^+}mbP*ur}3b#nEao8IZ^vdejOw*;J8dPj(nS43r1 z5a-W>p32JwT(nxER`LrdPH=GA^F_3gMTq~zqMGM#wq^^j{}Xg`mgV#L|Noz_|M@RJ z?f&og`gN=i9BY(2stdL;N*CyL9RJwTs4l(W@ntqU;g)#2iyv<)==6BaZE4)7z;f(q znv;|d+scH~SEo$zJv}v9LDEHHrNE^VC$0vw-C@{vy8R}@E#@1U2aG3NzVKp+@MZP$ z%Uga&q@DTHvN|!o=G3f>NtWl!k~&MYCKks|{FF3py5FtNi2b{GI}05%op^2?lGL8@ zEh9r>n|jc+>BX&W-mAY}miFH*yfNk6$2XD>(_D34t8O+tebOgt;}YBK<(oD-YQKJJ zJ4a@&5a;_HBHu%9M@m|oJ&IbnX6lDGC99VA3z}7l7-XK-RQ>a}-{u0>?ukhiKQm;l zUvrkJM|XW&tiRgEO1fKIIk?emO2Lwaxl8Q=_FiG-y`8nH&1O->BO~{a<4X?S&t9Ih z-ru>l`gkVqFNdn01u^2=gCDu*S!&%8%)YX4iKX7(`P*Wm-*G$LoxP>f=X#d68^7Nz zsmmAc)oodP?2psZSv@u@9=_XRu6f6J-P_JLg4u2|B1)whVJb!Q7DT_5`5K$pJ9nA; zv?-Go%YWJseRx*lc`qON?M7PaLfj{vn=KXhRO}3ozBRpN`7=A1aO_v|shNKNa)6Q!5e zb*67Pf526E{^8APW{I2Ie9MouHa=hS?YVExaX#Vr1E1C64v72KaO%&x(REgBU(fVu zyH-A85{`FN_fCJb+URoZk6CTDt7m5m#~(kPl6v$&-_%(hPvx^Z{?)ht{S@`GD|ovR zgUOp%)$_t%=M?hZzWw-W;kObU(TNelFHmo$|VGo%KogtMrYNNiMNlBXzGQD$f;MS=X)~9lOp%W?kp= zu&R@%IGR)T3VpaVRgupk%{W1IccP@unmYP9Ogg1g7~ zUt8Td{&!l}-@kYA*WSoK?C7Z-Bky8ub){B)(H`@F_BkhBGv7H{alPXE+dYhLR~hww zd=-93tfnX2czwg&Kl9jUeGrg4C!O8=$HH8r`kU0NGQ9==a$l%h-EZ}u{eBPMebJV@ zL-pU-dZO>JnZ@s8iho{H_fuISf8oPxrYxV!7UtP5+OORDZ0)AadGSZC|Fq)y%lqPM z^&j1T;T!B8Y5(}-Ui0~q`*R!R72$#NALKI{ycGzJJ6kFo9=Rzwb!sXtb%AR_NZ`GF{Qx6^D5vk!7 zscBuZeuZ0n`l%lrtK2W|u@>cXR&7_jrt|)T02_A(=f#En=Z%aum!E#nv1wuM^!fm? z5C(^Zi&PhduXedDw!!a};qhbH8MjXUn04Q6M|AkiU=3bo!CJ=G>!*FV=pMr0FSuDR z+_J2o?Z%D+g%z_V+8>UKO}VB2fFu6k@()7uj-38u`pehnVf3GsKV_%BJbWfm{P-t> z-K$UMcv+@jS&*4k+M=;yacu7w0c-WieOZ9P0Hj@3GpU^u>aY+1|bS=3RNDGYfUDZ!d`Gem|9e-`*?d`BE>G{cOJ~ro~ZzWJ1Qp=U%Pzm8==> zs}`*{_&k4u&iaX$>%6X2H8Y!@7m9nD5trz7@N|B(G>s?__{YPJWf?9M%$vRG=tb#co()i-zi z-EpL`zeud?@$n_y8Vf&2?KD__oNvmk%Grf;g3j*g^qoED%NpZk1B=~r9xmfI zXlZCvWIk;5U26C0f7O<={!fgO4eHM9f3WdTM(iTt&bbky`LBvY7f)0_9nQ@Yu`Ye} zqPhD8gX+~M{C9l*UuDLBSA+l2Pw%_gN+ui5j_91WO>4rl%#$r~3sgTd*st@fI=cOk zVJg4N;Tr;OD=HsHckJn0aO>sSwOQfI%N{=4eRZ9u-^^uA(W`sRKioSt{rcW1^8)vL zT#4Rx7Tx=4@_a@H1~+B~1}9>g2*Ek|6WkLs9%c$> z^{@WS_MOlE*tO2ZOU#rO3AVjFKWEuQuj+rtS$e;35z1_lXHRF>ZQA$XL-9<#3pNHu zeI1kUPnc*jo2U0@{LEjTAJwOGyYuXP`y;|&O08t)-?RwvlZxxLovLbgKkiV!^zD7Z zITMxIdiS#h&TBVIPrR`0Q51KR`Tj!LQ{Ix9>z6&cHm%cHQs#=kYr;1jo7tx>GET`V zH0C_gw`I56{yDLhPsQ&znlFUC zt@~dlwdKXmdzUO0`g+=`Ri<;&KKabNc)3@uEA^F#(TTu!D8hn$q3j8PYFZt&2M*YjfnI??id;8;f7&248Z`!g++Bh@SHf5!pk7+vxqvDrj zLqD&h;i!Y;Yt0{6+Ho*2ED|KLg@`r!AuYtE;oQZ-&qZys*Ke7mBc0Ri$lIuDcyNJ) zDX(gRa7UrSQPH*=d{<^nTK9D8o(;D|cWX;eGRge>LfJE3bE)%-Vx!z!d~+u;81~+t zkh$F8?HBcn7e3cUc{6brO!`T`R)zghmj=F>xWhJ7vb)h8U9(WcC4lAzPa z{-N|^Nyy>Ng)Sd^EqHpePaHLv=peI9Vor~8zoucb>W?a)!yhHyuuPk_ocmD2;)A{k zmdBDbjukjHPjBc~XcSr|e8F(>!xX0P$!j>5f0)zu{OAL2seLOSy0T7uc!0x)_2k~Z zjFL)x5dseGGcwb8KesSx^`ZI?e6Mr**+RCUP;|35LZ^7_wdFc`*M@YWrl?lv~{irF5oc` zRP;=YE32^!5;6I#SY9(faEeA`j!V9k-Q~;gttM}q%KfcknZx-7{Ms33XCG8N&*fuO zQuCiD+vy;4EcXKmSMNt3dSeb;s5afR#DRNHaMJ81_TBHcI{xTlf44*OQP1tr`d@p^ zE>Dd=_0(tn%OE~)vE0ia&bnHs=Wdy$-mP+a&I-m`@7UL+f3p;J-ulfq#Jic5hVOW1D!D!s3S9BE_lDbq*+!W@cdAokU7pNnI(PI|7|7X2%_H+`G7sF*3ORrsq}qTJcO!LBp^aVqO=d;je!6OY;zO*^7p zF)1)?vPDP{)9QqGb~BB;8;@*$B&q&fj4SK_*QKQquO{c6oGI{e|Ewd~H_U#0|E5H5QZG5q`$cncgo*6k?HwWJB^T9x z^*nstrn}_vl)NW?Q*_QRdHmO6!V&3;$-L3#?#l04q94CJSa{za;YXmMzOuv>!0 zjVYyn9rQ(irrF7yYxAtFnHzs>jej_sh|XFk9pN<(***UV*kAhaSf#FM`=lQ$Pkh*B zWt(-*{dqduUFLbSzu$Po9&>-YM(orJrgQurr5`%>YWMaAg}*&by7SknMYNRPyP>{r zYqS_!@$459KDd6d5p7{wlOU=3y-caKE#%VSW$&U^7&$dXrR7b2zqUNx>U93Kj@R$D zKi}_cYASTw+QR0N`HlV2j{dfRu~Q@!uV4ObWw6!4aPRb{``&+81kb9h&hW667n`&0 zeU!(`LxPHBx>ql*dHuxoPg|_f_s=F*^!B~o?)Uv((3ht^A2f_!R^^C2nJs7I2GV#lxn@d**kqfUBijv9eic+&WnBvZF$|HA%5hr>XCbHpJg5`&h3meiG3RJ zNovdYi#1zq?rwVaW&Nu6;u-4$k8Kj>7vox%<153gdd0ch5*m6ud;;e?${09#?_TG?VGd#E3 zV8XsR zDXASF_zSWffW}x{9MkGk9%(Dh%KqioUYdL z^__^UPIb-Io3qoeXw^qcXnZhbtC=Bc-gecZtF&U8!LgaMWj@b7&amvnyTWr88y+lb z5ElBx_ixv({<3)sM5l`NweiS5Ew1c2pf$4~l6^PF?MLhCY&>_dn7*y~EniKUzGK;@W3!G~Fsei)4x!aAdn6y95na|g0_1D_$qD_|TO6H&O??VObkKFG);Cbwa zjG%qLXoX<*2O;g}smFeCz5W=gRPC#D$LG4QjPB!8S03DoJh*kTtU|%pf?QE??VcT0 zEP9Ge@dxi2JkA%|!0|xov}T#vnfqK5_iw3^+_Qyp)0WTY_cfRA@@@dbd#_bWD=__jUH%~qHkfW~A^UtiW zpQQiI`==ZE*EalrqxQd!@(=2EbC1ve`Q7fHQl;FYAh|?u-VKwJw|r_!u{rhi?4&|p zfw06si!7SFLicnyK3mba&Ael>tnp{QsX-}j_JIOT0Hag-z7v^W4;xQ|uVlXU*c8wZd16yL737NA$6q zfjB&$TXfiTj^JpHrecJ$5agZBZz@|anCL8A+W;?~>{y%!cLIM8A>pocj zS#@?9G02uH$>tqu6K7yL54qh{2m%Q(sp9oECOi?9vy* z7n(1oFX6~6++-|L=;SuzZXHXt$EnRJy(*aplx9ntC-m7&u-03w#>5PrySF592 zh4M0E<`*RE_d69mNxBsOhXJ)oxyw6FXBGnk!zl&^21C3(3P{vp#8+vrCEp zVFn`uLmo2&gDJ5d4K7Jc&Q|fuPl5K9;E7YINm=2YwG@BHu`qtQDFup?W(fGSROD}9 zUVJ#As;Xn&A2t4CN1EjyxJ#~PKe|KahdRSe6@`qVc@WOFrtvGfUl2u4!JOIpJY{{hU|r%CI=N{iRuJvEG#2Pv4VVw&&ie zeD?bG+pou~72TcwZ=WMLSzAW_-<{PzZpV9F*|jh0)TZ2H%j_h}d9FEeMRF^5M0zCH zw3)KmEzxTG@_l0ozooMA|8lLAm+uyp^e8Url{4sJi=0z5$?U{rk;aten)4RC=&QLA z@~J=J=UVobPq+Cw?gwl3@Z97PWVTMRocLDgpq$#uNpH6&cAXG(`MXigh}n6@za}rf zfRBt?o-6jPkv#NuapW1+IyteQEQ!hy$0XeDqeV4~GF#MZCI$v$HU*oRJ4Wt?&!yPltEI25tbAu*U;l^2pi!L7CnD42K^@m)wxkU~GXnne z^Qe5da6s8-*~zLk)6_L>d=tAA_dUtuU@N{@*kYbud|%wIvi4`=o}7tibPt+K9OGWM zJ#(tF^#tofpIe`@r`~^5mf9UXk7JK*cI4Wl4b$&^*FKZkRuY(JWy4|HG;58i{eB~R zTW5undrDFa4hx)43GX~N=h^L$34IYR#v#d~Lyj_XpN zEer3u2+xvyH%BOvEBAM=_FRXG&%0Fv184Gt^?pBbq;$&)uFINFd~JfKrcHTn`AecG z+&wwNPG9KoAywwJKbNjBEQ?c$Fx1%3yTrFjtwiaru=|^!t4H{@J2%Ev-BGjsXZ6d& zCO2?%!j6S+!;YL(%gx;DIj{1T(E~pg%jniS?sunar36_^ujjblyxYa`V6D=6C1aC6(!A~+Yh{)GX_vPgxn&^g zA*WQ@kdoJ%b@aaM0>7^U*I93C3SOz1b1VGtJEijqj%6=qwDoXktQM~g+4kCJ&2FjP z?i=gwav3YDvY#;ZIG8+5e(NKL{;XfdlkNwuzad(bb=Q5C1>gI_KdSm-^)v6dXYo&{ zYYr)VVP9q|Xl;6|M=tUD%!qQ+YgMPtb=*i@d1m9(!yE3o8%X&k_I%5(I#H7QVxP&P zfAXl6!L(g&mkbyg7@V0H7%Yj%IKc&(d3l+6=@^y5+`!#_OpYS9)30kSQc$>fiO+PG zn^WsX!;MN=EHB$rnVhFZ8d-ZEN{^fw@q@8$%ExyOj)^9>?i9yAKQnV?|M~6Z4B;6f z6J4)5pLM=_m~mmj+AW*RTXH_9IGniartGOvK6TpnlQ|l`@jTA&LUso#9BMSsT6_KM zoVhDzTzKb}_U8Pg3#(d9HhxLA?yeO)r+&!%(yXQTXKSyWDrdj+YO=_xgqw;_?oKGU z`N#1=rJYdNx84gIIo5QQsDJgGR`5?k9&Q={zv9J_QhM8}1*QiNk|eN1P7 zr|6%67aRW@%sJH%JMXXB7R83-lppm!5`S(s>d9$cd_1&!qQvLr>lcWd-+L61!jk2) zB6;@aOIe-2t$U7qeHXRht;G!$@jIU;Dw~BJHZ?r^Eubtt?9RV`;;7NE<7$fYeFg>w z8%72OePW`aq$sl>H7GR=QhfFL`+6UC5U9Ppr1RJp=Kqc6s~W;fZdRzK)m-(c@G$K~T29-C)-D?caL?YHA&SZC-fkRXyQlkC)y=bQRRR?%X< zF6YDAzlT~p)3oX`PS3f!`P^EK<&m)&yRV!p`4i6b_m)Y^={05Aq1&#_mfhVJ`uMb4 z=I+?+r#E(+Z~bsC=VxbpKF7&Ld9eqJFRS+aHw%~Eds)+ohjVlNbHQbI=Wf~+weon) z;nw4lY@ZUtRdgGhCK_BVPN?|Eck8r)gO0@4qz2`KUye5J=cjhh( zObiTCEDQ`9IKnC^wIosBDYYaqC^b#R5E4kO!MWMOjskURmc?hkZdrKsb8K?;*2;_X zy6$T=O%rRm(bU#-f7i~u$-2{b7i?eoHC|K0mG$Fhd#^dRm#=75$d{F;&8VC=v;C&L z{r(!}4;t^`uId=dKaZs#;+5pD}UcG`cglu48h-ij1lD{_@fUh#r8O=3aiagS*o)m3M)y6P z1mAXqNY)E&@iAr*xFcSubNQ=B%FHJn@h6_yKl!$2^Mdzo>IaT~UA^qyG57M1v>dBv|J^+8g3hG_Dei8L&JT8F zJeGU!y75!X)cupT$n+^KOck@ad@`W*Zl`~QMQE-TQ+Ak(lZN>jyU^BaN-{Yox3^q< zBs<6N$mtHN`Zmdb;vuUg-`>#r_|UWR{<+OtPwwlqSo=*q;I+h3{x?$#8{cz1ZxDR; zqpbM0BQN)#I2+-eDIXp_G*Xs46Z@}#?Q(X#`%mpP=4<;GB+vQXktU&YzJaoqzg<@uW`g|}tb==8;;FOmM~V_vA;fA?A4^WvO)Z)8~aqqP_kD_8x} zVq#$EBsLWpp{63UozKpE%}VlKd~AD!|Lp0rHV1xicD)ef*duBp@@L1+97r{-C< z_QqYEZJnlVt(@QIdc5iKV40T?k@Nl|XL+sMm%HY7Z6B`WZJQ%?;zs3x4VU;9@3WTq z?d9hp!fhUQ_{LkVqj#UD-0O;+``3jn$Tqbi#@FB8JN$N{f!Sd>)8LHL4mthpv4W)) z*ZpsC+rE4M!6U0)%A};4Ct*W8TVsb=t=#b@B|okGmlw5pFL$)>>ubFHdiJh+BEJtw zYim`MJUdpSa@X%j^Neb*wu5eOZE9yGtymIj6cPPgOYNNk$UdWbs-sSQ!*Bxd#IyW{LtdIS*^y>e(kL%eavNE$?hiyGuymW{8 z4KaC%SucyNcWXK>a9Xe9zg{m`Co7ThmS?K$LRYT~DPk|bbp6qJ+gkNlV9ma=4xhgq zH_wZldL(pHMwQ7|XVTWm#f;t>7wdk8JmLDXA>MT+gK0tkysgW$%n0vur;&kva=`B26cT|={pM0vdWA2f# z0`}9KX3CnA-lJXh_eTBaAx0(!hCE`^n=vH4^#r1~V^(>t`SMvOvo$t=a z-`~ev(Ud28IbuWL!9}ghdfBGw*lgHvCg9?3qg=bR2#F(}4_qe)oUWa?DuZb&%4PHMcrqkZ}U9eTH$UGBk7@f&u7s@kG2|-Noi>UzisY3>oh4^ zr!zZ6;=qGFVO}cPivGclv(gf`JPY<(UnlhC?+=b0H}+@$(JfT?)2Y^;p8o1_@=IRf zbwTg4C09?qmeBvcSpSLEhkJeBTGn$mWVX3YRByg(|KaEjj+Ly_7w%GJKKfNf@OkMs zpC^g)4R$R*yQSlp;&r93ajz^U{WF*zesWKGQ{K_ZN5o%WGC5+Ybz8*o^Gj{}p5T>D zybH@8%W~_o=a$Gs?0B%CtDWbaee{p;remK4bwfU$keK#=Ge_Ia$7TOt%9-xg;BeLy zFqvxk{Z8Z5n9WP~Hs$Kgu->~ovnqPa_N}urB?^N}R&B_ftS_|PZ_~vaZ_lM~_!jO{ ztFn@%J)IX?Tk-A9Z?xm) z%Cr2Ifr_o?#3myXv}DvWgTYqcCjRa|zMo%($&_R`uprBCj* zdqzU5}$HW{0e ziw*A=HE`>lQ+|Jl^{wyI{lzvxOMUBos;AZE^K_@bX-WK5@a(^vhp@kL;)x8$@XY}; zH!Pj}&MEC9lZ~Nm;&1^7q*1xe(-1cc@*$M{FSsT7yc>YLf?LXB^ag*jMMy|Q~ z{Xmv?^^8@u?$5Y)8fjdbx!B=>>>ib~uUun}g-*KOSLwB3{Y$I7fO)L%CTt0bd#fGs zSA3Jo@_i5QJQqIkmSyJ_d26?Aw|ws``rj^dZ^mP@+Q?6L4&GfdvpVH%_V<;U+VTlz zoim*!FE0_*u$sQ$kv?j}^yW-GJ|-pxh5};Kn<-j)i}C4cyfCexJs{|nihweU|5_!- zsa_rnJ#w#n@7=8u{Zpv&dgxE>2|GM&6z2WZII`w-P?g}bgS(9%&onkpPpkj;>znKW z<1bk&5>C2_^6PHNG1-{&aAK=y+p2k9SF28KFzK1xDZZ?6+Ha-6L%~)d_aZXh?Ol}Y zy(e1ry{V+<-SmjE?z^|Gd7gf)2sen4JmrzI>|un8vK`+EBm16Oxi=qNq-@Qn`5N*h z6vVkt^ti^nZi<5UYJ=$4tW&RBaQ><*V~LTuZ~SqZg+SdZ%?Cec{`=umwYbH->vz<# zi&@n>j(^`N{vqShUfK7Y@xlz3dCo5KV5=^8&^|%pK z)$+SrIMNxfJ5}nJ%6QdJd7b^_p1J4t$0i?-wwbh8xaZDR%dl%c!JnkM_@wm0F&EP>)2k`9KGXy$*bVS zno0Z$1)YBClXGK^h3+j#MXP9wlwcQMftrxn})sE@(EJ#|| zHOuwcuFmIb$0T{SYA^nza=1X5BihgU+mt)vi7InEwkj{z6e*wPu}Ad%^Apu^zk+lP zdcro{T^-Hy^J#*+fr!*4@$ACgnumPveK}!tfg|Q!?#F;v#aU-wr$`(~*#E6oP_Npi zizV{Z%$%o@Uh7NbzHBJwnImhz@Ud^9!kvh~17}))Rk&NtR{XB~PD}Df@zrB;_n-G2 z|2u872+O<&c8Uf^4W@{mN?0qiW6@&%iJhEnFSReOHUHkSnnSJJq51Xg3A*!FTP)ck zzAJG`M!C&8mnS-_7UU|2Lm!HkCZ_7QSqjW{|zO#d=HAP3JU;-{-j`+5Ek2GR=L} zyIZ!!xMgpAZuli+)$PtDzH;Yp{3t%WXvJ)CDWBh4&+m;`Bka0zQ|(Qr#Ey4q`gh~P zbY88Sbj>;6K4+Kkbk zPFy6nETwnKnH5+26H1C@<~=m6ma~|HOPNs zk-+S`LZ0Pz0LRMR)5JF`c%RE^RrFoHFw^UvukFAwHpreo{bM4NeB6Wi z#YT0D6dJ^}Hi+t<`mwS}A@0%qVw=B{dgf~e+zdNvxy|zYW&P6?u8z9xRiTcu)>m%! z$3H&4{&a=&L8EU`X~!#rkDV7?^JM1Ko}bg2LVvK@|4ikW{b5@ZcZK`0^&)GIezy6$ z>@d%?f#O(LYktZ@e~)eqXC~cZHmkkA=i+4qB%7@F{!mW#b73%aty#oRK=`+Sw&?o>7-i zo@mL-oM`t;asIm|vBlk)rQe0tO6{^SwUNH=YkvCkfAcaQ-IcDo%7WrgoZbm}WN0fI za!Pk?e6K}#oyPY3GCgZGC5|t|MQxRteE+>GcMX`u!sfn|H&76&djam zlYFY|A}h-#w96|-@Su@E?@Ot-n~Ibzr*s`Xa?CO+DR=WDJs*T@ThIZ0tNv+I(e`~D}TJZ~j0FX57&W!QUpR;rCV7kirT;Y*UMSQOUn zGmZLkb4ubXnUeCFqW-*zE7~n1>Xqtj(p)lcW~*(o;nYvuzL2Zm`tD4tm(xn#HQ8RA zak;$j>zlhXcbDwl8GQ52%Is{<(>|_0BfQ))?A4W1ijt5?WjpZ_tQ+sVZtM};Sl{06yWWJny*m&2Y2Y+?`31vRN| zcj3#I+gw-fl3eve+b($G0Zz$G(c&GtkNNuNuYTcb-d)yZYG!$`QgnIZiXYOu&m?&q zyMOZww}cV!wzjz+VgpS(&3{Ird_#sg>yF>U*^Us=h(MxpKSfrG3~b8hrNAQmR(*IKjp;2 zqh+49v!$LLJ9ISFJmma2&Hh=tjuqu)p7Y$i!T#ySy&EoPC>hGkE;&)Pp}MQ-%zNJx zuRqIN{3*V(OT>Cb_T+VOv-it>+vj}HxuV+f&`;aW9M#-cl4q~Hd?5Mod$+9X#PgH+ z=5FQMTeRcqgb!>&Z}&h4xx-&~U#!i6l$udv-J4vBtrxp}RM{i+?$w&j77IoES6`YoXH*r#f0Ue#2;Do3Fn@2j)p zmNIACzb?L9J?l;X&X;c&PV{7Z9$1~i_po)%6*ildti?gx&z899Yxq4$pQE&Dj{97V z1;0$DrD%VjvOI53W^ejc-=(|5{^$go+Y3yX#r#vWmr-iAjA^@-$JuY%99!a_&t#J? z`!)Ty=cA=(4(nH#aP%*pa_aIH)BeENzQ>APr}voMz8Dkdn`dgu*=F}Cs*zJ@Ur$ZS zMwYsRyQaF`F23+lMqD)Q_V=CNYE#5ToxHvaOf!7>WU26}k2R({da?^DrL;Fqz2d#* z;Nv{rxTODZ%EcbReptbU%j zq<7Wm;5oe)ZrekoTdcan)=XaQm+L00_fT_A!K}v<7W-AmX-Cd&znrnBJ2Z36zG+J@ zM)tcsl<7T`r#`3Y;So7ilXd&G+-I9yd(!!P(ekd+?(?V!KMtSQ8?Yva7f z<`=KbI;LDMDDmnCo9O2V@82IUvRRm1o&V|Szt=e>(z@L5K7GBki1B$~WB7|#p*lyixA3eF?%e0ter)!OL(w<7wtN05 zKk+Yi(I2^!1rujoQx*E>Tt4%6#>AvW4?6eE{$jCgrO6BC$u&l&bC%n`TXNnzs{d1U zgqQcKD|ek`dtdE8dF}Xpj=nGLbI*ko3$LB?==y}e@(1I~&YnFY_J31)V0Mw%)?>|* z4ePVSYv%-?wR$Cd(`ceYsrFUx+XC{Yvc(za-yM(_z831wzOL-^+Oki&?k6%?W-beT zn{fO5FPE8i+?N~W1b;Fq#vR&bVwIQDSm#vwf93K`PI?(9D)mn;ku1{IetGR(>ZzWS zWksLgF5%MJJ#D4fy(h14y;D$nc!)h<=7F}`H+DQYf8w@>EY}WCojk$C=U=Q%=j(5H z#aVvAZ+?1rk&fW*`t1*HyexX-qP6;$wXL^clmE_k(>+UT|LlAoVE15-B-i?#E^~Hm z+J0-goTG@i&q>DM7{|1`+gBK>SFyV1PuBSLFz4)l&&Sv0I=I9aDX}j)^foH}PWeGu zr@{vht#Vd5EA07cw(XA7&geK{cNlcOi=)~yQL7^7V6q8y@LT@@1BRk}H`%sk}Xo{z_}^XGiL z_VJYDn<>{WO71N=Cja!uoV#bA6|1DEsi)uXe_ng;w_W<@^ZWPz=S&cacbn*-`Gxn+ zd4@+bgir5@5Igco;ndSak@=5|H%9k7_^gqn!JEK&Iw?}{bQVj$QiYDe#cu366sxn-@UjrwwXL?!8?%>bCB8Y*GPAe!Wn|jdaNk^i zW06>=heww11{;3Kio7_pV)geIRcno(W-VQGb2iWQRc$Pp6W92bhMR^i_PN&Vtv`i% z=?d**afPM7Tcftk6iL|B@}Va!gPasyJ4^R&uD}6rXW1_20srbD<4sYp;}?Dp{erE@bVi zRY@GBYj1n~T%DSFe|F>wpLWj@?*;cylx0?KuiCV5UrcsJ(7IRFzWskAFIKe&G_84V zdU@Fao$jr^Ve?|A8X}3V3)0wUJIvvc8M=M4@(tEwG|I-=0F3Xg3v3F%b^WK(q zy{OunHtj0=tQSWDerKq=wDo95O#Y~+cS_<&rR4O2NH?MPCr&IDIJm2aw?^@CZH>ah z8)aIl@!G56r(dm|y=LvBS*zZJ@cu1WnAepMd`#G8>PFRR=@nj{UvzBCmi_hdOTW?V za{R^5MK%FnX6^DSRNH)hSGV%**C8ur#|Cem_xarXv`GtPXYtuyl&t7q|DEMOOVb;j zYVK9D{c9y2O_%*PKlo1(!?}5HzrQ{FCwhX#e3S3tnJX0z$WA!1zjey~hJDE_pIeh# z>XsTd@LYEkV_w*-Bd%O9=YaASmAfu6i}}x;Q#HBu$ouC$#ra1{+Yj;fA1YrXEMWOo zHQx2KCu05N`Gj2NH;`Z>CKelm1!QOEvoA;8r{0GtH{+E4(1s?z>RE zYlMaVUdJtS|AYva>|nOK<2Y}<2LE^WAdy#|lWQg@{rJaz`LBca0#YuIc54*+tG#hcc9a{$>%;U`7HO? zx}>gUciisys<|g7#I?MwYc+OH^4`?+!T(Uvw-=)4wifFN*7xmsUU^YG;(225Wg}VN z(hD#%Z%WhtExySs)iphHZmnV8{&cT)Ql)3i0h9GfkFU)wjp?89 zLn3gE>D?_e?!TPzIc&)Ge7lrw zy+qLMX~`#L+bXtROZ9lOtM=f8+~__F3I6IsuRqN5omq3+bm!ft^OpWQoZ>Vu!p?c+ z+bZT{i)~9w^=#rL_R0Km^Y_Txv+$t@U*_UB4kuzm%Bb#FpC+d2BzSxcJ5Z-y@&Cd``?v?<%}Z@(|5mrnn-?3Q9sWIBApW~Y zd7R$jq^-*3Z)PT)54!t0vDi0tTi@yv#vx(GaqeQ4vc4jcv!>57H+FryDPa1o6A2ly zr-IUUq`0-Xx4CJo^1ATaq-!?0~T-Qas^*f)ca_3;MmJ6 zl2Y37C!)m9zdV-T@Q|yv@~QCNE|sHC^n0(r$Y(F?YKW<23Y)J~X5;urS}0ya{BWt% z)n-Psi4L6R8kf>5L<%OS?K0D7i;8Xu$)5QuTxFl~&&+ibxjs#0txG$%zt>vve`-Xx zo$ITJOrHt=WG-gtWV|Tu-F@1`XyLJ_ki}a=9?QLJm%823w_0lXg%f>W;|2e9H^g() z{Jh@YB{#vlWcx>h1JnO8p;oCI9W3VlW?*3OVq##>BQ*E{s!xj(lR<|eK+@mbNoT#7 z4Mkf0Z{6DXb$wIz^|#9yr~AEhTA?7qy=}+--a;Qwb=Ap|2i=P=vVT~3#9GU!WMNNt z%kP6b+lwFU+q*xHG3J5Ep~9BQ9JY;otq!kVhS_uT{0@FDyz^YHLF>1f(;_3%i&iq9 z)c*JG%i}}AS#y=7`QKGm=1rR7^ls~cvl&H}v4M`4f@Yn#S+q2?mNH9(fip{^2AW|0>m7ysce^|4)?(9ph z9ibuX6jDylIVto=Z9;*? zpSYsz*u4PxR=)&)o%7pE>?M9y-RJW8yYwyVw(Ot#1ZOzDFkkty!%3cly)Sha&n36= z?Vro;C#={T-J))4IQPOQ$!%LsIrToe_v1v;iBgR}Rx)38-}l}u*HCipX+O@ByS6yX z&*!e;-GzB9^WO5!p6Z$=V*R-BWr^?kXIBjOznG=m{rum1Udunvaonx9x63GQ#g6XkjVBe?FFN2WSlRYw&$|~^$MnJ%hNhKSy_p}?+%Ux~ zEk5(SVeS6PtMaqcbKhNgS+cq0`y;=Z+6)}rhGLe_!hbgHVamL7fJ-88(ssWS_NiRo zI6J*LqjLf}pGMX@S-AC+=xEAuUwQyZz*<{iipySqIL$*QT?4 zMR2QwMrd}nxX0YT%VQ7Ku9M|oG^_MPg@ooallPgz|K8TM-q7|s#QLOoiL$$(vbwNk zmQm5Pp!+9;mzAX17IyVq^!D4BGN*a&-^hrCihml-JYAIJb~U;S+Wlii&Ats>_gL7N z7#KR385k_^Wnb9MC!obJNZA;+C}t{jdU^JeGNBl$Q@T@_98GtMtXTNy6T_p%Ra3Pl zg(-zrzPNlWPBmI4e`_534|$b&jGT%szZh#olCC*%I)!LWvMoM$qd3jR`rpUTw+$Og zSwdqD2C=5btQCmb_GMQ0>uGm3EPME98TWj}55M!5aJt*pJ<+!Pay&BUiOY+SAAdZ4 zRnJn_FnB+xKLYo{ zBiSz9Ow(!cTyiT_>b}QF{Bxh59X8eKrq7{>rACt9S|nGVII1h|%dfk|Hl*;FGy7_} zyvKZpFP-eI*pVF{eOT+T6|cq&UJZ}47QAdBwiXLT|JyN3?0KsqSf%_dQ!ArkYvk6u z2N!bi9^U&uH0{HGuZ5Sn{uM@@YdJo1?XApmzFo^tF1%ymZnHyP|ctubBV%+VKJ(oZLC$hso6a7#x^!@*zpZW~n9_KOnE6E=hHW03fC^C!feV%yy;en~^ zTUqoTO_~!MR-oG0a%cWAZqB?4!^Y_!L|OHZf4It$Rbbk-Uh_v46aNWczI}>Q_X!JPQJ>HXPU`$Bu&Kj!XyZf#f-e(-xzg>s|pj#UqSbDDU4lz-69RX63p;}hBy z#*MZoyiM)<9;zGu2|0LPBqsbrG3$PThK5_&vv%E`ds)W4oJGsnQrlSd!j*Ez-7A)I zubb$du45d$A@^>{RI+qJ&Z zF9oBGWpy7*O|yLScCpLWwb?f}-#O&USQxY*?N-s9Jni}BcLdMQT(s$yK!e@kLQOGw zGc})88%i^?e?I5?Z@YY^@XLiwnOVt}d-nz}dTroy_^n7r>~`<7>8y+HhD}S$`o$Cc zUjNDQl4_S#A}ii+Hi~+;CQbU&-W?L9>byz!;=LLkKb!ky#=ESSid8u?cWS%;6k626 zuvlomgX?6I-JLS2%lxu0yB;k(`}9!C{yNVEYcor~2ECnNr)TSQG=|8>)T8B1^s8)W;V6h>sU(C4XqoJe|IQ;PQIa zr}#ci>B_UT?pZGSC+O(<0-uBHL;tX`hsqpqWPQKlhwiym7A^jqOHMzyrl0;LbLCCW zRo>?xP3kKDIIrt|qT9jWT5TVz8=b#jFYK{$Dqs%n`I2|`&SSMyAJyZz+VihWs*~AK zW%g39)8l#G29xzS^3?V+$LxzvI4(4I@6I`P3!kPec&VuVPvNFTdot7Rnx*^hhMKJU z!60umA*80oe$|f7Xr1fY{XR$6r2O-@(3tS)YSpPF*EZF0+H4j3%X9tltcl6lTp!DJ zbsHE5sjbnS`O&BErKkR>$-c|hrO#cGeR8SmdL3())H@qwx6gdO;mK*^Wx+G%ef!4e zb6SLJ{*0#ETF(mH6Mj!}saKqCoh+#)tjAL5y`y_pa8=m1Akoi1X88TSv*tvLN^Qj4 zRkh!zYe{odo8L04wAEO<+~@u8X(v-J{Wi}s*y_Ka@@{H{;hSkwEyR{Q4HtXAX=(PK z2~qw(Q@?&~?v&iNubZd)Z;Q_2msdWh9zN^yDN0dy=`@|C8JeNTf}YgquU?ay&Kq2H zc;3P9Pon;v);@Kz_v>x;!=|M-w)Q^ysx9X--Qf&}L{0*${$-nv(xBpBUr+zDeI;{y z!pprmk$2?t_G~&WF2UkuD0VtLe82Vv4X<;NQ#YNC@?5jMzGBJh{kz*4_gDFA>gzIQ z+|23x>{@X4`G(2U|EpIT=R1ph-4yyk-QDFIOMZ&=2RAdmcb1RN-rniI;YZ!9^M32T z6zd);EIw`H;{94iX->$UPv7d=&R1oz)qA*X%R4tW z_2Qxfn}5_O=rAQdP3!#7x#`g2#;323O4x)Rdi+pGZuZaX$9B{N9D8abWwYSk;pBpB z&gOrG`RP-d4o-ZuaqFah6H6+{uw@3w4Uc^jgUwpzgVs>|b&$1xMMu3Lmv2T z{1*IFv2owE-4ziRdfEKs1b=AD+5SBen!Qj&*N3O)eO1}N zJmaIyb>$VwLiX+YRUNmSI#vn(G=C*h^D_QSiQ`4rhEa$g&dp-H{jhzbJv5^)16HFF3R804{+Px-E|KjWE zobR(Z!qQJ}Jhob8)kcP^|B~)(4l=oPU|s8^7qzNOw8dQV)9!w{e(F>@^UrIGzCQ}< zd?2mpD9G_Dn|ohmSV2wh!Plv*>J_i{B}5yZUcA|3s@l)niZ?S9vJIkYZq|!*r|x_5 z!QGoLUhXnOx9a)dg_m|#J1)Da{-*Z(hW7WqJTW^D`DFJ!xGDMOL(&e_6^qwC)Y>4T zo$I6UK=#^!5?etRL)Y<{ksd)|Tj=NwzO zWYuf4qmQ}FeJf+0Z0JvJlD?Glb4Bl8e$*DQ-u(CZQ<)eTBv}cxQbG$-5=&BXwSPmh z{e=SsY`3q^eXS%K-?2hNdkcq7Qv+91(}V@NKLd_PJURUK-Bi7t@{@OSuf{(~H&kqq zsB5r4WwG7q^&xEN&#gcE7a8^yJ=# z=!K7~mriKk+Mu{;;~|4WD_xG&je%l{=5ba=B{qUA>Q|nud1^IJ_?)53=AET&Hx}h{ zx1FpADn7oQXaOfLI)AJ3|cj!-=O;^!-)6o1t}42+)$Y@z1A~uS-)PK`rRuY%cAGnI_&eVv^uDw z_n7PFYL;JuOF34^HOSWb*E^^9+g_|alC(Nrp!#kDXVXWqD;#Q49~e%uX>VOV?~9$@ zoDCeWSRU)%aQtBYT3g6tV$17}#nOKz6zo0fwI)A#{*jCIlk1+t)t_dsNNBGSx$coB zCAg`*guktm_tp!RP=>wcC-}@3uS^TcahrYiM6R3dmv4^ss~@Uy`ELGazU1ECtSLKM zZ$C-i;as+6VcW$SoT-!0SE_&KUFKNK$G}jk$iQHNuQ`r2p~D*E+!Z3%OaHy!mlp5j zq0m^t6_K!X>J|n24XpuMEj_KO3LK|drM54=>nOGPR%luJ#KK!`Dt@nS_&(ZJmb82Q zjm$+RYqJY_Q+$%mFWq-0|TzYnLESfhL zec7_-Pa((o2Qdu44F#V}^5i|w7TEbwVcNqzHQ(p7aew+3$vdBWk(*Y$r{^`?nseLj>!g_vxoGS2- zOTYaC*T1N^e{P5Gw_WJjKl#3i}sekRR3CW&nWn# zi`v{1>6_hdb-fNtJK}T1`s!Nq$#SUQH}BB6 zkk7YNbAsuUbH?%8Z=ct+wH2|S;=las!6_RzH#;4?xTZ2_`>HRk&5J&&!|?{xa*F7S2ArT5w9mzP~t6o@uh!pqDwZ=KJj32d`7 zlk4kJE}W2?rpFob{nT3aFKaaCb5EAbzM+zK``Na)-!3l6le~0D=||=~_bBxTeO^l$ z?{4~XArC@Z9uxX3eaJ9lB1eGiT{miLIE+d1U29O@n8S z3rntlJA7BmLsTW{5zFKC+b(=iUdGxu@7ud=N>Q>Bdro^qSX+xR_Uzr?bZz0n1C815 zH*8J}yuh+1GiF;{aM7vPXZ~N`-xS?_{O06SFM57YQao%GGRMTjepxTW^55Jum8Irx z{Ts9M@brL6X9sJ`t@EdyDd9`oG)LGy^w@9te_U&P(ssQ!6RJFI5iu*zB`l$Gr;O4A zBjt0}r4`jW%BO>8-(C6eIMctBWvde!>UFZC-1Z+#yu8tsb;F@=2N_c)&#OqkcSdUN zN|DSurRy{O%6O$ag}0|{ikG<^~q>0-eQJ?Ow(i7u%xP3+ znEISg6}%x9duH2jmHpbA-A-L7?mNiz(KT1;`-fL$XZA!Ys~fH{@@iJypcJL&p_Lrf zvqWgyrsW+gZuRVt-8A3y+LAS;4T;~RUM|@azS27U%W3nwE9WE{2j9BCeEC;JWovc* z)QM+~c88tvx;+16y6`dGWj;=;PpRDz%dD0tZ<@JjT}ObY7}I5|($({%(}X5*|1jC2IYp$#q$3ohQf?)m6*gp8uEOv9C$a5ji5W4=FW0+;Br@n}wOy>1QgcUiq>Nsi-TB`qnIsNA2CJG1Yd$eZt< z!S^k1Zrh)4C3^N&tFFmNOg)v&Fn3Nd_q+OgJ3(rW8* z<-f_xrcRg{6D2Tnn}QR!QmRgY>||5R$-c8PZywwz{it|?m&|kJ&8Gu)9;@;$DYL(B zP~D~F_W8?$Wk#pPcR2cP%-BEGl>5G}?#0^foY=X-2VYr#p54bg_2rQ*X14;?u`1^s zw)*_%?l<={fo%3`<)*oxww`zP^uG&dO8a}Fa=5k5mMCTS7+lC<`F3hURnaQX?{lvN zSKj1VJ7?hz?ZZxnUq5cybI0cMxjQTq0$fx?CfcT5d$c`P&)l_1>sa+MmEMe5`fpUN z-^_X6bMDf%g%=V|iM7ppZ>SSh-=4#={Fis*v+Np9k$O+BC%2!S-)?kO>g3^>%+1sC zmW57_n6kKrr}@*)#Wlyb9_W2ip5*s$wu0$Z!>UEA9KWv83;(;_$#m7;SNCPQize>Q zX!Y??dU-PCq~Q!JefN#B+ZT#6)qYqM^{s#*W>aKvd0D}$bNhO;`&N7m{I~I8@x1$u zqB8e8=Rf}{Zc(gmGlwu1=P2*B2duo-91L3H z&ig8`omV2{{S`eA1dz97JFw~R+35jm(~_QVywhua?BW%f z-zwYU9C%%`^y3b6DPPrA4@~b5ySeyk&Gu)Dz8qfsXNREZ9m?K|jl&#P2<`KD z!8J{A-su&*EL<<{oV~t$*@c7BtR-iJO4z(E+&sJg9_ymu{Kp#)9!yS-w2=}FX*YFp zUNq;X+j^@PKl9|)*?w8vKW9g?;PuWUCVYnM?3WK7oYUHDDbDv#(&A2Yx#+pVImSU3 zv|}qSS+2G-ovCj%JMMYTKc%{pf?|Ce{`+)(uuW~Puk_lSu{in`(+|zhj{^OzFJE8g zS8jdTx8>!sy7u(1i+xNd->~89-LAWJp8D+?)#6gSMf<0|aDQ82a;Brb+cJZ_YDX=< zfSlyKl7M^b2U<0$`k}DxwBi3Ki+pLRgd?*>H?{I z`s%FvVD`-yd`~x#Xw$%UAC$^jsuP^FIh*vA(PHk=@enSzR$42TNH)rQYrDxf=7W z!FkQ^oonw{q=h%_Fgdc`Ey{f*8TH5zO1xMvR}AWeZ|l3 z5mt65cluwPS7`F!a$oJ%HPQRK_yeC>sXgV_-mr4h3A?bBT7I8yZ*tfz&b6ib)V9}E zjpq|1*H=&9eR$pu#|JifDT^Pi{4DZ8dYUrpgH2}dFW(4sKb=48z}c>KyS-oRaywQk zbNlI{RmV8D*s{Hie6vR)I{NwB{nvGmN%Eyj%u;&%<7&Ij?xfs#ru~8{oNjZU`^?V& zbyEFh)Jguw$3^w#2b4>%W=vwRasIEq<5A?J(s@U!`f3lQ-;}gDpHeh&%O4xekwm+ba-eZb%puK7x}+|)+p#KYf>+8N1FMWJlX(-+20 zlUen^`($BxV(dd1maCQl!mX1JnDRef%sOrELQcDTv+tT$W!Y?eKL5b8h~DK}&qhDr z%X0pvRsLU=TcH|HQm^loGpzfXefiFP4*T`%gHDIvWUZa+QP(`@ms;}=UAbG~kx%xo zE!Z*dp8iv5X?Al z2LHv*%Vo8zxkJ~KrM*9y^wC&H?6U5PQ>9J4`w9{}3l_UobX~b(75ZwU>+k)Zzv>z1 zy00qtU*v7|PC9+_%Dm#A=f!lDntVSnhdOG|P1 zwj)$@(`L~%ZowNfbX{)NGum!RxbJ%Ag@uc^U`n0(wEepie!f0+s=nsnC-bROLDcS3 zr|dT-{Jfj`)c)YFod!Smrap;Xv**(<&98F>p6vdcGi}3_|G}uEHEC5|mQxuS7_^xg z7~C;Cu_dXw1v!Z&sm1z`qf0}ed=<~UvdrSlq?}aejMU`p)D+i>?*y5z(etd{0;#z-RCXiC=X#H6KVr=stCth`ZBre|BY zE=447ot&Y_-4`wfU#_QUe7pQ0;z()To8XicVwHF7A8ou+C#SP&nU93p_e0ZsR9f#W z`*7~aNp|(-z2a?3WwrBEn!N5tiI~q(_&PPG(?YOM=-|%tQ$6Oa>SB6%wYdIe_&MLU zNyjg@{ObR=qIuyRfm6BDd)BY{7j$LjO7q7roK`RDDV12dQN3*GHH$lz*LStuFfdF{ z=1`vUzcF@so9`LpkpH^V6JKpU>?oxr*`a^3Z~GsSh4+ho_V3;3vHwUzTx^2MTAyvR z_vDIXFuSF`6?-$wk2NA?t72;nmWUh&2mHsQ)-N?uz#D4kugyP&3yMT3f7JX<~ zx0>HfxqE+_PucEeXH5dGn$LMWS0;YdodrK+|9oMMIdxnk!DMsti_>n);+r$SEcz{r z8uP`TFE3WHGcZI6Ffiy6AM?<0i}1g}GEZgy>wMqzFhU`Yhi##mOOjrB+hwU>W);zi zE^k^h6bxO~M)pn3*>QX6?rN4>TdwVk%@w-v8CB*}OlpINfZzU0rw zxn-ZqORW4}Jg>~N{q{iMmgKvicI)Rq|6F^weSh5l56KMi2WK1hJc!^~Yv5XJ({@&Z z*VfeDKK^W?pQ|04=;EY=&SPR{XLRKsTaXwcQy8*C%SNwMb6?dZ%G=^tySvhcw+qj>sG?R@?oy>1pAj>E$ox zr9U}tQ?GR^GiurP+0#|G$ps0#+t$v@`c?9>(J!u_iiagHc!oO09Fo5z8{G5vSLlk7AItL4B>*59|uo06!J{J-qo?9Va+LX$85_SoeDJTsF2!1j{m1PclfJ&F$XfqMBzRiq z-%7vz2kd9HTnw0&K3mA!C_yt}?(P>?)@uKrU^w-~o6PvE7k5P$FTJm45t-btc_}lt z^3s;hzgo*o_H;})SyI@aQP%a0k9T|W?51cjh2LB|?>KMEtZWN5TG+<2Ez3h`=|bN( z_qS}=Z$91F?Muvba;*}M`hwShRa9KNH-o`7b@0#Ep_$EfVa=3 z`kJ!lU;4m3C+y>X^69DC(JUsxs`4Se{47 znslZ1Rh6^8-qYT&PBrYz)kl6x+t#JYb1#zUb}=KX^k25)21mS%*pb^Uo` zb7IobAnh;frY>E5T54M1c9Wd0G;Re}IhLA&j-st+xEEfG&C|Ve$oyQ|zSW01y3eHR z>rI-!$?FQY=IteG8kJ6Q+_tu?YWU3cbk-ABjm;~p&ewIUH&!?%nxK9^;q8uY+qFCR zZx@Y6L|PljZOEj+s5yKf8Q&Q_~>yF6VYXONrHnW?OLcYm0m-Y$u}lBosXy(Ac?FAqD!`f=Iy7DiL44P|;a zUApyd==pJq+~^a|Y|4Lovf=Y1)#{^#^2$0d_Ea43Qq+iw5d1p(c$JF9{DK?G&c*tU zyHgFgg3kYZczMbk$GatJU(?svHk+>0j<7D5H0N2CCOCickHl9Y?>FZp$XCpJs~Po} z^-5CL_x&MBQb()4JaVjDm)V&+i^<0{LRl26DO>8p5 zy3MuTDRZTQbsCa%|mhyustL1a+@q33}epr{1#U}l$VoBh^ zhZol6zJ2)2Sm;q&Shsh^qs2WtD}s|NqH=x-ai7u4yCHw4fbaXa!gY&l-jx|{Us{vr zT%BTAm7Jny>EZNnaY|Xv6ipyhFdA7&l***?;O|FB4v~3y-zHyQY?9-%on7wop&ujmcOC!v`&cQP;`RAI%vb$m&ecy}H9h5$ z-M=4QpDzF25U=}6vU;O&z|`W7xFgG6PEzkGeSF#B?uz(H(q9?RX|2k7r)+ue(DNDf z-4hP6%-Zo(bj8Z<9iEhx!YdTAl6PuQLiZGBnOoGvcD!xKJv z=1i0qX?4pyn!Dm3+A#piJ>?%vnHd?l#k78Q0Y zRA6hD`1IpJQ@%2ZW{GZGz}Y_W7|VX$)TY&^^NiGoS(c{bF&i^ML&%7%Y zt>CoD`n~o0uX~Q4`SauJPwfWp9kU-6SvK$8G3lUPPo%_oh1QLJUhC2dd9U~89V(bC z#?^MuVA7)2*-865}{Ci_PCr^Ic#iG4Z6;apj zxQ23NZMt(qSpT}z^VF~TYcAep)12Zx+0{*|sBG0akuBw()l-*$jx%lRoNatGDb!YE z$EMNZO1ieZobO=COJU8EQb`fs`zB1?wd}iN zdNhM$Xx;7|pIlwTe6P&5o81ucH+UvRSJc;{ZXVyV_&-y3e? zyKYuV8^73CC{$~9PRc%gd+Mzjrt_L#2wUtvy;$kO-ko-7zy3FFd{S@s^te{lygBD5 z`sS6sW#5|Se#g>jY!1OJ}z}7V|UMX0W_1?Qh7o#D?DopVYa|Be&YtWuG#bZK1-rl_O8rd zqjx&1{YId3I;YtY^BWf;?{sHg>McCSHN!z&Ewi$DQ)XCA`!&~P)xzlo+d))uo!rRFz_410fk7NgBN}>5+S;i1`FG5O z{_d-1wHKK#@;v7q-wVd+`mL{*>{zh#SjXKj#^F+LFKKsLO}f?l_xk;6XRp;;CvR(4 zbC8NwYCrt*@+p^7j?|KDu1iymjWQ z)~wz1K*jLmS9Z^b|I!L-`Ipx5>YeOeQoiBf*8JGg^Q!&#w|$N_{-(Eb#fet?8`lo` zea#gxoI5?GYQO10^%>1#H*%Id-zA^xvwdGQ`^{Z5R95i4|B=i;yZhea@7E9JHy^2Z zn_MzG?4FNVM8}S!7dJSie~|e6VJMZ{VZ!Z!07h+zl0&{lw_!xzP9KJ#E|nUVUkD_I<*(YihSvKaM}L zOo5~A0pE>N_sjQPYk8KuY^~FoTYKELr7Ao$;;qWN_b^|%BHURc=>-4Oi zZf<@(f8D*feTNgpkMXvD`ttZT|MvY4US2fv%-(+V_tk@krEDf$x4Z7O(d;ij@J-vgRd&LqH2$}t_a=PixGh(6W7^%d@3((Uee1r5sl>r7&w5u5 zdp2V~vrvs0>zbt}9p4|Fb389mqUs-$n&P%?t2g;QnR#e=sDH&*789q|4IZ@2>ALzebyK1}qOy@Iw*O!ycx~CiMy!FQY#>V&^C(ETAzMSM_ zeWa4A?f%|$PsgDj>8q9`&VI;|S&x)4 z`yE|1iQL=6J7mbAL*~Lo>nU2PuHOUjOiCpD% z?B(@5hT<1bWs3s4pM*_ped+12GSxV5=6au#;h)c0S8vFk^7CyJ|Bs2GW_vjgwud|9 z+Me5zkdm4H@8{j}`v2m}k7aW|2#TIlvd;S{Z+Euwj=&K{9{t@LefbRKpFU;!5N~&_ zD6A!7$9GwgrTQ=Qw@&q18nCr)C1;lgf8V*&9GZJ?3&qPV-O092VE*rkTGJM--VtYZ zS?Z%)tNo9Awgx-ec%p6wOK#9xwqVxZeT?qeY2TH%U9E1uwtDTB$8vUeFGVl^ZF7nD z_KRt!`28fhypMJ~($U&9(eTPEr&l5U3-qQ|&6nt1u;TcNicS%19tJO z?RdJjvneId^k3|kT(Ntn9HaEuj~vSUzDtI60_VKfbCiBbR32zP#E{oI;nLluPrKZ> zH7o4Dbgr4JA#rOst{`p=*`J|N-+l2T1g;kBs zs|_bCyI0?uQMmO+c)YTg&Tik{+N(2{o;u9GV1~v#xx4<$&Cb_l1aJiGV0^QHnbX#5 z>feApOXnpsEchXHUuVWA-&b{>>v~_G`KU0df%V z#%{EA%U&Iet{B@}96e`WZ4L|mo5*7!{;8Ikd(n(lPhX!2W`DX&Qsc3LsB>F*yWfEq z23h*~Grs;^9Xd0$<=CNL4RsgB~o;_!N{L1D_fft(3^Ze?3AQ<&bptzp>`@+6o$@^{UqPE7_S}x@1pXWHCPsi!} zvAUb-cBc)qe*fC@_sQj;)&!kJ0eUn~cwqMHUFWQ(o#5NB(`t-8T%|E#xOA znXlkax~Q<`z}BGZ|F*Lx^DY#LgK{lcZJC51fc7PurM!lIzo=wEBEKdD+rS zP0^d4NjIJD+SD&rF8^_zYm1EK(Mt#K`R$GjvPe*4=bgz{$o_iL>p&}x4Xb9$s~BJ6 zE^g;)E85wfSmd`z`Jte`XzSK_HevZ6e_b`&YRooeW8|Y7JCfOssm?VqfvO+gg+rSh>w* z*OpP7*!g=O+l3Ho$7JKZbB?j@{N{Q0^u#|lyB{%0SZW$%^|=Wrz~q-N{16vA9$N*U3&7dOJD!bIa(JI z<#Iv(rkQM5`^Oa5$BmaHO>Y_958W@~w|z+^cinfp$1#n8KN4O(Gklfs`@x#ZvzwN0 zHodJLX3(~D+IkC_a9m!@4>=%P2AW@7_x{ zul?qW)&1npxvlI~4*SLBN~>OOTyRIrd~sLd=8F;8r@z!nO}ZF;;g59Qu6Z5_bKPT> zG9PJMlAivh|Ai07%jIp3?G`(^r`T<;d{|=jIy_TwY7-Cp+=@3x_(}vXtxMtTPyXIs zHf!!Ywz!!Gbn*f&rG7hAb@bo-OwHVXXAVq0J!SnPj%!bEosg`3CfzVE|5M4CC!Sp1 zsb5+%m&fFCC(r3znDpth!i!d|wfa9bQxxY0C||PmKDlmla~*@z9j;8LqVk;Wj~SZT zrX?lG9QWR{QMk9w_Idn{mAMtWQ_P|^pMLYpCrD?nUM{oNF+R7Cp3nKdoJ);=Z9b*v zLZXXIZa}U7y~{sNEVcGsw0K{9fF4WSd-XrAwv4%cGnYMn+B%IX@nF5DYq|I^3fe0zSC^^v*$kr(pcRlfC*UU<;=($4ewc@g%K z&;K3l)V&pHbi-!T+4~u%w`IB|-Vtk5o4NOu>NySbJ21Pg{5X`|z*5 zeER>LwZES&H;OIG%-j5Rx8Jjf<(YqjuDi`X(wp+FW9}`@gs*QiC+2eR3z{(RVN&MD z>%U&dpS3A;u)eOn$zJa5%k6uQ9W%-O*);9BY2LL0wKs=Xt}!gLTfFPk|4G06L(`vL zpJmQ(zkHMW-%TN&iA_&9I^P|3UCznsexgk1Mf=(|)-ZhpttJ z*T<{q=ZDG7{jbmZ<;mN~Q$8C`i1F^6BfVg{y6E!TPiAsfPuFKCm?u%dvC6RCjQQ%p zH#gZge*MpYI#sfGvgKM076yjrd<+bVSbBLyiFw7Ko5mAMGE$8rrX56yi2Gx*yX^z?BgaeuU#K1nQw_~ zYH6;y;#pMvuX%4E*Ucl94>_+}o|sy|cem;5*8M7iPSYzUhJq~ z{%WD-ovR~uK{9%QpZMWDtdnh%-kn_T#^03m%w18(B8=Ree~SpW^uVXVvA|pZxFK`Etzv zWbmX6LFT44(ygXh?;kVKa&MvNIsFvu^Ls z*?VfV_J~)0o&B48_ts;4VT|R*Y~_WF>u2|0Ox(KE{`-b!(|i4IR=m}InPhF`dAMh@ zL!L$VoO7o{_`V(a$Yk%6asKJ6mNQp99(W%5VL1D_o_VS6-s6k@uj$cC?7w!==6p(M z-u21JUn~t`BQG-=|KVSIJ>%=s@BfQ(EI!OwpdP~aeBR}-mz^CiJT8|!NIiD))rrIV z<4kz7ZpCi@uw5vr(p~nueI{egrcF~!j=3i)@xOEt5t4jvd~4NIy*V0>TrP6*T;_|I z<$pthY36?8UY>i&k1p7z|1-!E`R(#jZtt-Ne9HvpU2Q1HT&$@u-*1Bqi^ngi#$&~o zwG=cQUq`-gNKxPHacOboM^VqC4>-0uhVk3I->WlGsZHTV?J46YqR*_aDO7ORPvVw& z&X!#Er|Qb|_~soww+pUHmmGqDGN_PXJ{+#&keOpx$;-&U99evJteAOr3 z1?dgXjn8z=FpCk%u3Bd-q%5$DHtPwq!rjaNLOH_J*(9t|*G6zw=f+|LQ*b zTYK)SkE|E3jC#G%;_HmZ3h)1aFz`sfoaXf`eP8yqM9I@HU)0OD6mN+?J^l3M7gqX8 zPXw;tnlEe9{@6G1o6k=}7cW?cBMj^^h{ENw>2OWZ`c}yI+hb~rHI4-yI@4h+vXiaF&`Zux9gxOky zbAC8@^Zq?^=YdnUak01M70p8#bDf!sjh+VSe{K#Eov_aDGV4XjZLgcA*zYc$+{$Jj z!}mhQYnSK^#(!KtckxI#R5$)Dd+@Y-Qub!TBr+ zPbKap-pZ*HtR{)c30kfEaY^!*5%bav>jei3CeME0y#MM&)AcMb>mC-$J*%Fh?!9a7 zTbmX!z9V6hmsMoHH$JYoU$XRrJ!&!YtAMQ(bmYV_W(Ecw%wndrBr~U2-#sTkDKRIw zB-b;qxFj(zITbpVI~jZ&b=&{5KObB$n=naE_oZ$xmnLr&IWEK3vw}oJSLv4>+iZOQ&%D_Gzy7|pZfM^z-IZ_qr5$sf zd8W#ITCt>1y6!{;Y%N?JY6K zxorF`PCYp_*W+|f+p^bIkC*ct{kOpK#TWLuVgGA)U$42ByFVe}y#$x8dCMxr?aYGe znF%LOtPphG`MN5(Sm=h=JMQ!1YV*A|uU9+LGg+zaY1Z36Q(R8}b(pYoU5ShSjGh+r z2gkmAeq?=? zlha$T`13D)#BB}l-`RFoaQn*J@p7E!aw5xGPJF$4VDl00l?S{3tLDGDDXsCy=x|g8 zpIP~_H2n>4Wy7t!D&C%-Hbd*B72CSR-i1XQFB>H+IIyA4ZS#7yeJ9_()H9!5rK;Jo z=SKU*w?CJEIGf=g!NvQ+n*GSeCDN0&w|LK3e0jdQeH-hZOY-h@Op!5;on>M#bEmGU z6N*2$uVwpFt+gu+b~(;WeI%3qPQcY&{FVL0`HJ7ZaeS2j>b#+O!&*IUA(6jXDAZx~Xo<|oIlz%C2veJyScY35SWliU=d?q>Jk0&*QgsvAh=dhXk zGxQn=Yn+{+lDX1(N&1Ni(|c7m1s@Q)Y2L zx}wtD)Vz{J&|;5(qWq+s)Lh^Eyv&mPB9-vOBG4TqAsI!fi7AkDxpeYfKVe6aDU^N5 zL*w+?D_OTQlH8(aow}G-#<0`t>C6yA1Fxvuy${)KICj1gJj|7R=|o3w^!U*KRN95g#6c6N{+OZl%9{7QGN2GdYHP9ey=`q*R=-=Vo%NEo#)Y}%xgAx4$qRn_)@Pff zrTlg4tUVH-T-@{Ud+k+=+T#X3_odtdmj7T=oAW88U+7edq}Kk(u0=9?|1i!B`X-?q z{J}2q%Zn$~uU|Zo?krN7>o9KtUtD8#KV#+ellz^FeVf*OnH<6qqEsyz{_Ewb^q1>` zzGvj!K5S}q{rA*+2Sje#aB|N$tWso;cE`x7OP5Z|GchpCz<#^}q=>|uNFm8`YLIXK zWe0&;Y3q%XElidMM0wpZ@pSeS6l;|hWm1};q{^rn7`QX{Qs}Ou8!z6{tZ(7o-@rY+ zqu(opsq@|sPnm{~W=j+lm&n;{HvawW?4FNxzdyb-Ztz``KH->`l%|O8nzV!jRWnuY zr#z}(eUBcJa(<^7zV8eBU0c;3dd-(V)GmA_$L}m?bfdRydG-F-`V$4aC08_B%T!LZ z5zrEOr!gt+h1nm2pv4P6D9fEZP`{{Yo_gEb1JeT+yfa8iy)lt_e)T+ss&74tTUB3v z(reyWmpl958ur~yiOV!=FUs*&JC#}n8qCROt9_SStopcOlF4FQ$yY&1r&?!KUYh*K z@5t}-(SKUmCPz%lSm!3OKf|1@1}Xc z&+Pqt>yoA=etu)aC-X$&(?^eW$Nx6|-mzW(m*C+$nO(D3^!>k0;Za_vbZ3eD+-2$$ z4c>$<@9Gb`qg)UzGiF8_%#wpS=*Nq#Qy%w5I2@BV?jT$%X) zMrvD{nYuy(T_UTU%cI*|zj57U$~k2nu~be~M=*d_KipX}O4 zWlRhVTUi(wRB)AyKAFWOsd=eI&=X{OgKql?2a3d2SIxY{r@JlaBU=Y+_2h+d^HkiL zPMz-Hmk_F)y-hu}V1}Y`@FV#j{C^tOFH#B=u2uP%Ut|8rZaJ$@^P$t0)$easzukIm zj{N@pHOvL<-!FMAHfa%AR(fWM;A_?GPXf;^Xj;`5B~^OonxVJHPCp4wf0mX>PuXRQ zH@|i}w~fOou}t|mukZD~sMks+x|Q|{M{GY@Df!I1m;3dh(>t9hZwy2npZtjXaf9>i zGVNO|QOYXMWzToY2~9ioJhJNAs#98*qrTj3ny^{MU#HxBwo-+nxX`C*_cz@QwJu1x zr+;j5sk#c!dY7`-SB$D*xl%y-1&2PH*RlhxSZeJoQ2> zbqNa0hYuKRT66kT-+7DCC|y`w+Wo=whf(eAmTocc*OUFd4R$DYRy!QGQrRru<@YE=8x z-Ld+*zoZ`@pZ|O-o4(F}1?~C0?=P+jeSCNRLSYM!sIAS1=QoR8*;zV`bym(Xnd{PA zdu}klXwE)0N9VBDL(L2N89@bIyp~Z_@fQ=LxjbqQUEurjBl<|P{DQZ97tBSxm~MSg z)-3X>-S-pi45Z|>f991lGBCVhV!(DG6Qr;V$xq2gTfEsi@ige(PuKjqgIo0t`-_Cxl`|?=?0?#Iq!oO#;w(-rr#XIkq2>3jLg)VcQB%!c z(3C4|xn}c~h*vt&Y-YSUoKMb8S-z;avE=ar?Fl%;5jJm6=iPZcR%PcGPAByiDnyEi>~$JgJyQ+xElJwp}gZ3VV^d-%53D7%z4DJI>t+Ai@-|NN#MFEZac zAAi8^`%64O$#!tMTW^%L@9JX5^b;&na;&V7`TTe_X{_mqVWm)5C*;kPhZanPM>}1aI zl8|4&A#B-oiM2BieJPW0Qa#CA-M;K}fUN(N{a0jt_ul$c;k%tpW@+m0zPvqVsjl6V zjjuiN51e?^SG50QOXAD-rK@fn3Kp#tk?8twmZTNrv3iEy!3wUQ@(32RaGL ztsoS!&*95k%cSKU{9BK(idyoZB~b0a8%~JR7dTs%6wxH*vP=Z zz{AMEV2i6#Of1RI%}mZu%1TWx$;nU7hAkua2aEXRCuc*_YH$BWu0sYQuJ143%G$l- z2dmyLiGsp{qCzbT4Zb|XmPxbBCM{vDKYNh>!{Q^`^5)i@Zauw|{oe1-HH;C;od%r( z!bZc{xT}|}PX379IQi+)$A`3o^QMbCB`uwH=j49#bf+4VsiH;e zx2T*cyC>o$vu>xzzO8GD;))L~Q(v{`Qr|~DGubuLH#Yv8W01@0^VukQzm{a)g`{@1(*SpEv!6|i-B z@mAIFk;@I&&W)OVwna#-J(61UL{;6Ve$V4vCy6U&KA&w; z-zUy?;0Or6pki`?Wz{{W-AY$?XZM{GMolTF+(Y)TfewUVVPJ3~KXgJ%GIOAftEH3g zgKi8wzJId3ZSl@+8?&-+ZBbi0wPLC58vaFp8I`!4d|IzHb@0zFUU@s_-J!cnf3g3V z{^L>cye_V z=4Oz+Fl(V(L6W4$#1n2$whJFR{j1weRaJd%O^}KgNMf{7xCmGxeSeWz8N>}oIN7#XBoPLT; zv4YyR_Qp|Xu1!qz+F@-X+IZ`at=f}j$KLO4`V#{#Xh-KeNeZue9_k};*RS<{ozkvl zO5C4YCYFk>Dw#ZC?QCJscyZDFXmp=kC_1}eG*(5Fc{e|tRywt5bYkFep zD_<&alH7CpLi_ytzhx%1p1ovRG-E3gdck@c)f}{;b+3&a?TYg5XFZb*y;GM_Bz;Ke4fx(;jROXhLnd6pNTmsqN z;twyEQ1W6hxF-F#>~2~0H9!tG9mT{k#Up=)bDssV8)$3x<-bpx@#8@1fpTZ&T zy_)A%&+ijSFCql`Lf7W6jl9PdzghE=Z{(f0r}HL!R#@?~-?i8A``*~dDGwb#=6B9j zF)1^en9rSj^s!&>?0p4uH(s(mv|04j+G&mwkBU-1b|zQy?6glb+M@gW&YeAnw=*Bz z=%BT-E@IFB_@hQar=CeFl`-dUDYcNj-tlWkCVTqah_cu7GS6~qYX1LiZM5ZJc?DN) zM*55C`x1-O@2IZozf20mME z^tr{hO%(gQGIja7pD&q@l>RDzyddrJ^odF@`mdi@?lW7GJp^upc?qeqQk6w?mU}etO6q zqm|z7zO|=JCAnF0?I$V0DE{}h+?%K0x6Ag;JIu9z`i`#?%Nrw7IR7i{wG=7fROMOF zW0Q9&r)80_hSopx4!1@t#mMXrF3o(ke3|B#V7B16;9&kQAw9K>i`RR*zmqtb ztR<$rK|X!b^0l87TLXhu?03qEFWpyZl$*kSCG+Wiv;~Qrt_GhEFflMhu`w_N5T6ae z*9ODx5XPGqLO^*z!uImpGH*@sY}W-G9oyq3h}HyMX%X=C(h~6U*kh}6dI?`n`RunM z5BYy6UzvZPyR*ebsN(Vw`K5K6qrI91I4@4$SyQ~P_}uriDRqDTR52uQeHVV=a?Zi7 zk)ue~W5I&9LgsSej+K);SsrDX@!l~uIC&v{J!iR_SKQi@zm&dv&)aMG+BD|mfi51- z`QG)rB|B_|)=lu2_>!}6Ms#AwxvK0r3zw_J*xg^TuBiTIRH?=!C8^Vq8*3JRJDU)) zPqefx=;UYZw5<<4HlF-zWiB0LQF?h&T6sr> z-KOsT^m5wS>{Eq8u`m1ByXOB95ozH^D zE~uBhQ~s31e=E^$b9Y8vhWM}ari>jvj}>Z-6c%Y*Tv_cAT+(nXF=nBl1n+CGr zs^^=g8VMW>jry+esr!;C^WUCxJWMO40#=f;Xz0*8GId38Jw3O2Pjsh#Co@_fI-F6VBK1p?en*O{NCaAX)6 zcg>r&X1>q9(yUJsc_x#$_uaZ5m-SHkQEM~*g~itOA$Q$P9QszB6V7eaIKFaOr*TyM zWS*9_`|qxbYoFGmeY%`!{muKRO_SutY>{ea1_mp3k}3_NGD>J{{_PNnI=`gj>t=7% zi#@*U-Qu2F72lQ9jiPRqNH2Y*5Hvm1OC+--UJ-2Sc5C1(o zp5Od?guiOrWEa`{y=HQic|tDl9?!e`;#cB}_P41|cdoa|{<6ls@x9$zt~qZFlPo>= z_?f?4TfMPloy%VXK>^doJCo#poy=ui8=<{*#~PQ}^A4Oewg2+!@3}T{^SQkZ)0l+k zE_ixmpACOc)TayYIp<`k^!@%Z?{a8bk+8+}Zk}3BD=W?(Kg$0< zyvTCq>)fJQlUDj~-Klyzc;ofLKVPzz92UROEOPnLM@7jUu2tT720P4TRP%eUcKq7- z`tH}KODq1qfB)o+^7GEg$2HPe^iJ=UwMe|Zji#|wt(s9TA_;8_*I3TP4XL>L}st{v)=j9@>p=YpyayrW!n_h z_8s`ZXT-m4;@#P^eu&*FuG(aw{PzrVTx;8AgUDhQ;WPIB-CtI6eK}!Qq;AdW=D6s_ za?9iga~=d5y#2Fa>)Fs-UsmQX$Ss^4IJf9jg=grw<&4dznwa-lcsU>lke1Y&ipjPZ1;-(*ZNC-Gc|9DKELVr<6mFOB~B&inNRzj^Z$AJtRGqb z)sGrn{S@1}%tO~Z#p39_)J1a@&1O%Nt_drcTyIhQM>k2%JK}(BNZ{jje)+=hHOk%# z=k~seIcmCT+syj8Z%RJRO8v_8IzFka(|V=TYll{`>SorN3rhc zipI>p;$?;(*(NTX6(3q^aalHk-_2~h;UCja=dUL4waP!e9CmoeN3>C}jprJ8dsrA4 z$~mxZk%0`PbYPln7^k986o*Cv{8zIoxBe?|O%2J^TRD_S$%XHK;K-xGe%Ld)*`?6d4w zR>r;gU3so}-sd@+ckloA_fRcUPVcT#!>>oMgStewo6Q7m>jWmfh9$cC0;Cwx;#b zy=70=&X{dE&m`^6nwinYw$X2zov+^C$~{L&`jB~!ooR0T!KbPB&(xXbKU*p)eBr}{ zlI8PL*Y3&R&1XAn$;(yA*884Ty2^R)v3fnTsp47Z&iqNcHczgK*tdO~*1Izc4sPb! z_d0TFwwFh4ipRML`tyxzj=rkRUL`OWV+>Fq03tFnYN=3dgXnsk=c>-Fipi>ITEw|VT`7d5Ny zVcG)8>qjpnE#Q1FF~haHX?Ff}m&0=!d7km=aO`(|cqz6tvXtv+&AqQL4jrmqRSeZK#bBCd5|x$3dz=`*i5 z-!?CH%`S{~G?uph+;;SXrP9+~?%QJX&#U}Ncy#tx{k)wko_*L~!ujsgQ!|IK70#;# zdgXgPFS5-^wn+~!sF}XIdP{(X`=o`+8tpNh{0`4~qFOVr9-A7t$!YfyA&%?JEs{}O z(YBQ>yHbAlbA$%2Q#i7bS?f_xwYQS#^fk;X8-@1#*!Fn*v@uY1DJvA3aW zM$Gv?O4sfiobg`4p1%M4JUIoc`_;F~i#(E>ORQ2>_*u56{Fr@#h2!{l0ayODlXz}< zOTB;0_bXfIHP?$fPl`n!zL?LE`C^C7QpJDlH}5~%=ylj&{<%$MUi{4N6~^Idl2V@Q z&a>M{GtJ|Eb>iU7{MwY&{3~mhuYKkDn|q7A@+YBNj8g4~?i};Fea)blGq@)#O?X*F z`32t}c}DN1Ieqn3{XJZsmBEw3iA3f~Qju{^=P?exAIU4X#O&PhvG{1{O^YcyRU6moPKuS@xixmhYnkIb#c@ln z3a$Rup(Ag6{^_h;$Fg7D>IwMbvq$KO%fEo8M_O;X?k)J}V!V3J;`M^j_Dyv`nNK^8 z{9d$3G*?Sk##P?hYvSs7EyK}$X8&G>+-n#3!tZU~trK>#(x-{h zw|DxL`3Y;82OW6(aura65E>-}YB%x9YE!HIW;X*YNti z<80-99QxDY#MjN+CI-arlZbP~x_j5`o?#*wVdBrE9|KHa~w+n4{$esNX zwA$=e)XZZuuT_@?-o0hnZ8&fFj#tYv_dZ6kH*lbeukL$alc#rq*e=N@8#Q*Zi%$!ahfir<65nj649J33Y zt*-Vb2}l2z+6g9Hk_%dFz!Y=v$yFfcr1WMI&Q_KqNpfo+NIgcrOn69sQfDs0*z zbyO~af9tIq3LBHeMZ`ZZxwt3)-jCP6KXE4Xnlmdl>bv_7|c%Bce7DJo~YFS>Cr4PF+rAb3;S zpNfR?Q>UD!_HkaEy57|Ozx)=R6=l{H-Ya-=KV_^m+UuE?G+&^qUMG2X=LLO7^%A-N z777A3H=c)g_pV@S{lzh-ZH47p<)T{$q76MW#I8EOMyf190c5l{p-7L5fq_L7k*aV7 zP1v8+8%%!h zxzW!YCv&9KY~A#KY|`dc4@S%iW)R4V)+^?9}gVtg%bo#VYHur?kJOMC@#ZUo4hMxfzqRhteE;bB+}|S4d_R7D*4!DOeSh(%!mxS+ zu`U%2m-6?0?HUmiFEEyQFZ)pxtRm#gBK$BT%$WZ7KJTb{6wdwJT+}f zrAfdouj!>1^Ujs01zQN+vb%6yvg<8J*|(s{*G1lPecQ&CoLE^tH7v>B;@pWh+{X{k zxwdK2vb_gu53ahGuw?lvOF?e;sw}k(y{q%GkMus;5;CJO=e|y_%a*;7v#c_iE}3{; zR`A_>=#J(JcAgS}yU_w14%cRw;KER){+< zdw487F!A*k2XEtNPOBSUrF>fUA$jA2gDZdfiEG@RYaV=4$J19~28Y%S+l4Nh&y}r8 z!D8xx7o7c<<7+ zm#hq~F8euO>fOShT~m94Js-R|W;yrMv{jaOT-M~qUE*~SS}6B0&SI~x=Bb&5>}zIQ#-5p8$oqP^x!z{!@Qv%vJ-D_meQH(HcMJk$7eUoV(L&_v9xP83$}~=N?MyB4^!)uSQ)l(ty4I(A+}5-l zYCZAHw=K0N3cJz;FaE9Cet*Gn#oKP*#b4XC+vjO6x*AwD!y@vH_>cQd zpQiU7`XJtW=u3Fdp-;cp1XlcEofnw0cb)CE&2!mjzm1F7F)d=Rg?Q}=cNRMrL;1fq z7TIR`nCzG*o^j60`_Q!ulRlVkRq4^y%IjfUJw$-yd zQ}}c<@{eSyXNvm7%VGcI_B3mVl;*{-ox0x|-aq%USit|%vFIne$$9C+Yl;m&PdYI_;|ou3TEC>} zZnw>oHD+X#*!Di-Nt$Q&s;KvwO5r_;`eb$8XM9Pe2Efo29vPGyMQ0u(IL2(yNzl9>7Pqtio zu_#2w&MU4^>U7V2C%Ips*w z-`abVx&(E6A2o4Z*V(%%6y*+=KQMWBB)(9*{Kwr>$859I-i5YWteN)6Zfj$$?7Q&W9~!a_Hfwb# zzlyS1!nfJJsr_o8&7!ssE2>2MR|;3e)E@e`y~3%sZSkvOo0a<>-CvgfVN0RhJfp6U zJsWw>ONCaPTXAs0M%MGv;hWzd;&zj7>t)=Nai=T!SfY%1+YR}{-p6KF+_dNn@9F=r z>LX{Iv0eIq{ym8`z2?5Hg2ilZXFpFcS$$*uvD?qA<`|eil-)dayQpT`{6!7LdJYXs zPlkNnAksTU=Uky^Y4pn1Zmp}c6E(RPbnY_0ROWmuPrCHK-)p<;yWSe~-ZGSZuCmK} zrS+6+ycu^>uhh=DHuuV|(}}ZoCR?3zE(s6V-svNKQK$84j>xeS(uZ7Dn| zy6%YIcY%tYqv5CCAKN@FVs4J2`Qjx8FZUF)A3xt=8MLud@$;kFWtZ4}miAYu{fTM6 zJilnFowQkB;NmUalNK%w^HSUTcE>4I%Ojip{ko^UoVcfg$uoG1`o^5)FLbWQ{C5j@ z^s3ZKq|G0zxtFHXtb*26+NBydm`W}KF!TFxS`GqUBV|ue=4t<}z!Dm@vRm*MP zn|;YTXJ2mkBOCc|p3Z-VY4t9a`EzIYJv_npH?8!-`4^Lx^g{Ye4;Pwqau zf5rc*LyJUq*73Z08h2#3#Ir@St!Aci><->{mFE@f`tx@lto#}tz3SHE&2}y~6`e(Y z>r8iBd){l&o%Ej-pI3f}Omd35Dt3O4(Y*gtb5mV6<=FXeRh8G*E8hQQcCvtH$kxsn zMftgM{ISX_oo5<|l+XEeAT093rlfNrdv2_h5z*EcTUi{iN+x8&o2amvyjtR=Sz>yL zt$9H|UxaMFxcZsTj*PEMoA0#C#V!3IKWqACTb|~FFWX8TeDtp8$qIBwUUq%!rk8By zy!krsS;oE;;m13kew?rM=HBJNXpQ!s`R!-+B-J-={iJ;3nZX_4LjUZktR{JCo+T(!8#x{y_bLqJz9zR=I^o5|2si z?FqX0@sj<+A8UW?$uHX$@ypTZrtSOR^FGgcZu$Jpv)T3g_pmMyf2wiIP@=JGu~naI zrTNiEPdVZa28bLlbUI!jlK4>gm}g;SsKuNvrT)u@>Rsmab)BBEW6!eW7{?29_h)El z$Xn&dZn`A8I?C&L?D81hubLdOo3wc4*wolwL~PaH&1Kb=<);~|J!gCOyE(BQ(O++V zNt`a&+LmqX_F6yu^gBh?jZgkgh+TZ-TAuw_-vYXT7mH{G%wA;pfVi!JF)NyX`kW)9=Zdt&O|PR=6&Bq2ZA;p}8sR@?|cO$zeyun7Dg0 z1Ha5++UwDK_))~_ic8zpYM)7}GRr%s**$5`mSqPFA3pfv%QIuy&RIQ;mDlB-?t11S zTm1UPhXphCXjn_n+p70Gc6CLg?n2GoUiVI^vRa#;5=rAP-s*OBYHpgV)6r*M&mH&u zQF~}D?<1VtTq?OBE=SBcU-Jl`%vWV!A&zRhwXpAH|Z7ck-}pK zoGT&@ek*Nr`H^cZa5zj>n2qho-!+ZJ6?2XE$cZ!OC#-JtERn2W>3@}Qim8ij-Z5jg zWe!g=3pEqn9B+SWw$S;QQmVNu`R>I(@djCr?z!*jypz6e zQ|hVbb*GAS4Ud;?eR6Ki+}$_%%JyWP@0}xOv*Fn6mcP84H~ySC%h_`GWNH76Zsoye zCOJCKkrDF}dE?u4EnlGTZcXF1&#r5dx-+zowC7GPH*2`g(X?oG!ttF_E)DStvvx76 zUftVqAU%e4L-X~pMGSwx*q>P8{Nh1Y_GM{n)oB}C#Lh_z-FTY#?SyGy)Abr1-*+-o zCEPw=Ih+vsu0JH)ZC;G3QHO0sPU@1PTGuBtLzTZjD%AhP<@9GdqgB3>tiP^80rSB% za@Vc*ap@~v*~^gY9ux22@%9JPow&Aqb)FAmW)E|x{g8FqryV>u>(EctS4V{ZXkPMK zeicbpDzqDk3XKq!OhSm9>2P#_bt2dpiex!EjvAMv>tis+s z&fOhmz0utno!Q!*bqD0?Jbo*`i=F7wZ<<)Mi1W?i&66^i&R5R$`{5#d!(Urt?Q_+O z9JPE3&WmzSEIPk9{88+W<5&J&`8e-(My-Efl~{tz{;KcO-=5CBd(7a0RJgqG7vXDf zg10=dI{vcQGcR2Dh_d*DI{V3=em+U)p2afbi$eRRnP0NK1Vhg+*)(fce1G=#i??O3 z-#Dw9Bh_8Fc=vK;v7Xjx7j`vFGs`Uss+brSw!7-PpHIBnw&1X*(aZk#iR@QjX}#nl z^XxCm+8-|4>Yn>C^)xc7m>RrO*(Kx8yTjafE^9t_mHGDM&zZj*@6)_|9_2oH^vmdf z&Wx-h9$dNJH)QyOFACi{_Gp&D;#J!>rutY&M*e+uH~KXHS2@qW;Xyxouf13K&HntI zf7mB|nS=Lby6Tr4*}Q3Q=Dyd)Mu)x}owYCGvUv8dB;WWoFFQrU{Q5diUH2`X_jA6! zr0h?A)Y4L5*;dXLHU@^>JPZs#4ZG(L-Yl2FGN zvtrWerWif$;=o?1omZYM;`?ePRiYzQki((s%(U(6SEh3r7T0FJ5fbRVqtkIj>0}mT z^~)<;r(}2Jb8tT~bx(RYHQIc8tFZ3EZ5sY<=ErY4U);LT#pT^uXZKComvjx*ShN@6JB`x_Z*Xt#^(KhfdMXopP+*BYa{&NoflE)UUeHlY_h#wDjkv zI&I<1xWd84dThGcy{LoN#HO6qVHCd_R(@32GwP+;+7CBQW+(f|x$zjB{TQ*F<#I{3 zLEyhxJZnvLy`OQN(aOCiaZ60Azb$F*)76tZJ=Sb~buG<|>&do{ODyM3DElX+a`V5D z+sSY10+e(!)A?BMsI``Mx~ygm-B@f(&~OWxC&AUx^JmgCze%ylU1 z;&~j}+bpv&B=At!sl>@Qe_Jzgert=>bEtu2doL95g%y8R!)d$vm)ekzJ7Vyl8 znY}QPm3OVm8S8)^YeUY}Q$8mhUh}kui)(5z?_<$$v()4@oR1Zjn#QGjOI)qfWp*}B zJX0=W^=EGx=g}P>1t;&fU-t0~cY(R?UFX$nk6dx%e>K0o~wA$EGJ*sG|`OiyAbo-CSr z^pi^WQ=#ss!fK~|*-lrn?YC=qdQt4Ood2_LX?NIP@K>}+%v-wtxx~rOPd>0ds+c%& zk4p;sg#)`{+MFXTGd3;CO#0R%qqD8Z;PRQq11v_1k_23@OrCow{mFsHUhETvKkQhe zBU0H_{%++Jo_l*|bsfJ|vB`Yh8sB*Di~j?qW?ZRq{ie;>6}HEb*`Cj+o^W%<6TOSCuAZF4dUy49F{_R}2NGf)-#fMA>9>=0 zdF+jyD_-tBW^v|tD%Z~PicfMkrt(?K@2+@u=iy4pie-F38ou-A8b9e`n;IPG8r%~s zyfQnTP3+X^8K=I=s=c)N{gi3>v)ym5eV=iF|EJ%74(@`9cRv{3=a~OMucphdrpRQ$g^G9W!Wt=)66BkOP3zm=qK}p1%M8&rk7&)jy2d zne5IVaEpz&{?XlIvX@{Pk`p>%ljkZMT`fP2H*?rmD+nTq%tJm4fMHg0?NS#f;c4F06-R;#p=TiF&>sd*|&Ti9ObYTtME--iR=qJ`!Z z#|Zsi?8?FQ)Ut-F((+hx{)=*rhh9%r4n?L~UC>;)?ylUo6$hBMn5#IgoO0-_aO2r_ z|H}4tZ!fRhU3Ot+!}}fU#G@8od3H_agSvL{Ei>O)eF1F`m)w8VdB}-HPRL{Sli=^q zdBgrxn}mw#ik_2~wzzn=;O-8M&n5FymLFUb*?(I4tJ!OVRqr-mcw<$zfAxppr=rh4 zo;WvePDXK@ZEI@OsVgU5@yE~bo@*<)&b{o%73IX{a8a}Oi_Qd!ee_xS^v!eG-woFO zrS_^p?{+Rxj(iyPY|+g7r4>A0?)u+D(~JWTZR=F>n_VH@t)}G2HJDN_t>)@1P}9N`B{_mWtQ%N?oPM(O$nFkrk6^y3G2WShCdX&%q?YFLC|fRG*k|*utL>?V*|mg6wTHqU)jGsA z)x27A?BBE>k&cRo;^dW6&otOCxw5PweDMQ`Jq@C~aTAhNkE}k$D0;qYS>=cM$~wIh z{T@x9p{mOfzt^SCblQHu|66tDAM<~Ft@QclCTlk}L*=^p^X|)JR@=3md#qfele;|d zT7y|>(S4Zk7{jde^lJ#iZ4C?CQVrU z%m00U>MjSz-i-~7jg1YpwVwRE-*%5Y!=@K|^>(z!JZh5KbglD(Rp8zbhv}J5iVF8T ziG+7O(z;l-Rb$=76I=BzoU96rQ8&2G{en&Wj$@w41z)D^jt!p+9kz4aS?kwg z)|s?GEY1&e%4gyQSje=lJQfI#yruZ#fvK9w(L__Any8c5_1{XnbV7k zF8IbNp6`C-8o1|GL%M9i5y!aV3C?_X1{1Z587$|eRsY#;eEU6VxHa&ziZiBtfMr2FJ|zI|7reqB||GpqZsORV6J)Qr6-H_ENVJAdBbe0vaEY97vtv| zZe5UZCWNJ+;@}!XmN~7px|*cs45Nzgm2}XI9xN1=opFjzoyCbSa-UO!qlC z+r*0N<$;UEoEL5`=FkxR`n3C%3+v0w(yv=ZLqBhvWl(+S(4?cPf3>_6c@BBpXa4gLIDd_e~HDeqIKvIQl=0z(7mce7kh>wjfDm*M<+J?-O)!dk0NshjG| zijIp8G1@L<_>c4IQq`%Ky|c7k?z(;Y#VUGY+v}EBw|@Rz^;}O!f35xcn!Np!cDerj zr0xCc)iN(Lji$CI+*~TnySh>>CWQzjT>bnkF)}i)wRDffDa~bJp<#XH&;NY-wdc~M zPgW@hF8z97Q+mW>(_}9(#ZHH)`4O8%_i{;RoyuMtR~VtYVwL{-x#3M)I3zM_le9X| z=FU+6GPD16u;A7Efl;xWOT0=;RU4;l5k6b&rn}DlZGfSDka~$|w`1+enmPL-ESTmd z1!x@*d-HsS)6VW`*A~2472;}k%RN(j`s5Y2#h8}|MryioOCP-W?2T~o>nUj`qXO@) zU$AP~Lb;>5`jIN>PDd|E8O{!LPo6eq+Vv~p5B3RI{r%kXG%Eb0YQdu!Mw$wzikRvS zt?<<3iVf0wA@risDb;`diq$LDuang}>#5)CB>3W6c=LsQ&qAkl>@|9&FL@*=I?mQF zKhL>#=h1mOMi~Ut1f}RaPiIkM(`()2Uxo z5AlX9Fb;U7D}LGXnpTVE=i*b-ABkK&>eS1TvDB1x+V=qMRp(a=ow+dAW3IO7w0j&y zN+(>`ZmC_ET^M`x&#Fnk+M*IyIhowvX}RRKj^@#$MM@ff8g@ct_H4^JeokfKTPn~jE8NIzl{rv3k@IKwR z$jL!BYHiofxF~vPYE zzlvWg7Cdm()IKdfbuqiX_KNxH*A~2+(tXlLo5pl;G8&!kkb#qrwE+`51YOyQy-}+8^iqe#@59#uj z*7euovjVFg30>*kCSiD~ET+_Z^(*ly*TbhMJ#2U&xz+XU+zB(o1ZMx5U%r`RZPyKz zjGdf@D+DF+O5raBfuov8hPZ*L6hB+Pv~>`UFlq~S8(D} zlPl+ED-=1fAM4!k``DDQM{DjlrrbCDvGv!6Lo0mWbbHxuc1f4zJK!C0!OrSUyL)Mo z-pXqa4J%}RZ=3GjuKvJNc3xAO>^!lfftzB~PoF4al1)+%Y%190XPmLj@6|*Dr---S zn^~^-yI$x`k@6xnsR@x$79&&h3<XM#7gYmm6t0^=D2Z}Sk0T~rtnckZRO$q53~K$ zFLX-0;aasSXS>dviRC^w{G;~y%5+B6?zR+l4n4Z))5~e~*^kX)7oX0~I(_l>^wW-s z``h!@Z@3!V9~l(iC#I)1Ipea{il{&8Syszpr#d}8Zer!ReDX_?x%2#%zuGcE>}846 z+;x*PQ+D~KUobAQntblkN!KNT%QwH2>7BRo^5zWrJAP}wxJ^H=ow>qgvrndWea`>; zoA)Mc-1YKHPE^msPfvEv^7DS6J@;Izc&QPW-L*_jDbB!$g>$EIPS$Eq>pge*Wz8-J z_4EldrPf|JDN?k{PrOUB#HR7^#gj}y3ojQRVOy!H;jJ3G?ep6fBbdxgHM?DY}} zznooCr5n5c^6M90t@bvWWqom*d(Xw(rO)EpI9Smu&rN zH}jVz#&;K8zWqYX)~a&R(JK*yeq3}H`uE-_h0k9 zm6vxP+4BAv)9yD8+1awXeH%Wz@(CTy$Vn~jOu4eYx8qPHcg}yaDEZjC3e$K#GM85I z?`7uKQMcW4+WC8lHpheBlMBR+yMJ0sI38*~{wh%PYpLtipn~o%5rxv(hEn=@`@BT% zze?-O+1ewv{o|bL*>ltCmvT%mtYLld0w*SbcyN9l(#Rg zeAuD&s&eaARqvyWp>~&kXfHbVi*@VMQtnmSr&A)2bcUEKlEF8@<$H zR>A){Q-9VM?pm{cn?c6;Kr{6#1`BUR`3KubL`JnMW@qi3`uy3|$m97;wSH&b`n&&c zk;s^%uB5H?_PCQ$hP&J^kuAKNgP1PHuL!h>QJgSOOnH6x)K{Hf!%v^joxpCWd~Ai? z=A>Qc|CsS}iacz(n5UMQ_i6vk;vRJmCzI_eIj(9^U2FUt6Gm|)c8h8s$MWP4(YrmLvWZx*n4 zUjNn6aLv>8^S2!_SoT8hQHQ=l<(uu(?B_hv`4#`PCpD)2@djV-^TMucEw;C9w*IZ@ zP?Nbjp5NZD<5=tbw35HvdM~!$x*4Xz`D*UB^0zCG-+$5e&e3So-I|MMG?O`gsIFR3 zmRaXn`?4u;>eWY$u7x_uTlfP0J3F8G+mbGLCgfsUWvZ)aSMf7Wd6`@NyZ_tsmpz+5 zTmAI%+(#!rZSiEC%+MoR7-8cD3y+EfaV-K`kk|havT?>u-s9M#LC*}wS|mh}j-B|SJ2vHWext5ruXn=vLI%L<)pqFr{x^UIGm zS5vWjtHeV>rbc~jNKI1e5}g;`7?!rMy~CkUX`}z93nwma2nmR-^>g-(o}{i;VRU<@ z+&pQ$k}o0ZQ*H)#NQy3Rzq{j0Y?yoglRO-VXAY1fSQ%GZjM{r|iPvEJ`!<0K;S=C*lQ zkw|v0OZ~^$T~CA`H@GKc=uG|hHsFuAr0bQe&n7>!-R5eMz=j`kNi)CxC zZ;(DJ{B_aF%f~uCwu;UC6Lz$BWmZIrZO$eWQEO-0g<*cbt6yHYAJY0%<4uT7*tRd_ zoEsON3@%tSd71AF1>o?;z zd)@b*7S9-LnxAftIL)jVSILlG#di8e|Ce{upUgXaNmbgcf!XZPXO7YhR)@GhEc#m1 zmg1qZbGlB^lQNa(N47P;JnL}TxQx-;-~W?kS2^?j=eJnBemO6A!~dzI*`Dc@-i3$& z&rdtMnzi_|+R{F(EtvVDX~C&(^>m3>2X?Eh=lbYv9cL9c`Ry-`-%`o(qHjNZDq@lK zo$#)hO}1AmvnelY*Mgo$BJ8qlhXb}b&w0q9<-1^2M*uJTDWxj8_5S8lVjmoMxBI}& zRa18E$YZ!&Fza^VqH+iKj3&Jg{4aRRoviM#{(YFoaga~sMO;L;c8%n^S5tRXU4Qf{ zwtsb*@VYByA$RVs*u`GpTDI`kx5T%cAs;udxG_C&s?*Kl3BOVe7+#;As61eL2LjfnQQ`;hK+*w4A?_tcpC1xOSTriVy zMWuRHntRHoRXG*zTuY+o<~(D$*R(yC$$8@3jPB_yQ<8LKe^0sl;MUE)3+aI^kCa>P zbqdT%zMbTs$TVq&T9{UL#3MI>?&qHVJeSM1U)px&i^h)!`vcQ%U0(LSx#3E)!R7ix zyUmvWUBN5*erHpszpmW0c^y4%>I(z?yl$~%ip>^q|7^~eY6wkH(IT?L2X6MQ&YZi1d9F`3*Gg$GKwRYJ;6X%!{i5W$+1#Pot@6EZs`lFTn zdh3r>Hx7B$d@it)jh6e!`kbrovOF=2?7vc5HT#PQ%>?nN4$--H6zIaJO`g z?*`MD+sq$#AH2_UeM?`t_bMiZq9;ka^AF{5bfh+XGDzZ=*uAj%$lSh18Eunfi)OA% zS1_&m)GdSJhJKHN#;+|cXb?9QtaC8GPAFJ!Q_+Qud{4ie3Cc(o1VeZyCojM z7TY`v9z^cZS&?GHGIwcT>*``DubX)ub0#K!ik&b;u;IxQ?{hng#7oY4++)2PHTP7Q zhx1aYj3=@ReI+iRU$S@}X$iR``D?O^gx91*)|Y(KCyMNt{G~~D3BSqYl8PB$TGKtn z_BgN|P){+a@oPKqU4{Lhx6=n0z7iwd}^b zCH9ic^F6+sh*;KlN#AWe_d5HBOrc*;+w8yGEio4wr`%T4f7J8#n7}WgeNLM%pNK7z z4tTOj)}7mYnuFOv^AGwDQg~Cm)R&*A_^kVF(;;!*_VudM`QY!*{cXktaO9_

xwoNm0KFIM5xs;9j1@zRs)>y18e=7#+F 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%0A< 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

v_!aEndc3lP(shi3Uyo@@mc7H7}m7aynJaReGSn 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%0DV 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�MIpFw;iY%d@x5 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 hKN@n_+` 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 z W3-uPmhxnvyr3-2L>{ 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 z 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 - - - - - @@ -60,6 +55,10 @@ + + + + diff --git a/kernel/akka-kernel.iml b/kernel/akka-kernel.iml index fb2fcb4f5b..0202664266 100644 --- a/kernel/akka-kernel.iml +++ b/kernel/akka-kernel.iml @@ -44,11 +44,6 @@ - - - - - @@ -77,6 +72,10 @@ + + + + diff --git a/pom.xml b/pom.xml index ab42362923..5027ea5923 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ util-java kernel + akka-amqp fun-test-java samples-scala samples-lift diff --git a/samples-java/akka-samples-java.iml b/samples-java/akka-samples-java.iml index f2620f9234..f9e50d1342 100644 --- a/samples-java/akka-samples-java.iml +++ b/samples-java/akka-samples-java.iml @@ -28,11 +28,6 @@ - - - - - @@ -61,6 +56,10 @@ + + + + diff --git a/samples-lift/akka-samples-lift.iml b/samples-lift/akka-samples-lift.iml index 986198706a..bcdecef91a 100644 --- a/samples-lift/akka-samples-lift.iml +++ b/samples-lift/akka-samples-lift.iml @@ -5,7 +5,7 @@ - + @@ -16,24 +16,20 @@ - - + + - - + + - - - - @@ -46,13 +42,10 @@ - + + - - - - @@ -83,12 +76,12 @@ - + diff --git a/samples-scala/akka-samples-scala.iml b/samples-scala/akka-samples-scala.iml index 2dbee0009e..cea303267e 100644 --- a/samples-scala/akka-samples-scala.iml +++ b/samples-scala/akka-samples-scala.iml @@ -33,11 +33,6 @@ - - - - - @@ -66,6 +61,10 @@ + + + + From 981166cb2c41a0a262081a07a7694278e7641b89 Mon Sep 17 00:00:00 2001 From: jboner Date: Thu, 27 Aug 2009 18:27:21 +0200 Subject: [PATCH 13/35] added RabbitMQ 0.9.1 to embedded repo --- .../0.9.1/rabbitmq-client-0.9.1.jar | Bin 0 -> 226304 bytes .../0.9.1/rabbitmq-client-0.9.1.pom | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 embedded-repo/com/rabbitmq/rabbitmq-client/0.9.1/rabbitmq-client-0.9.1.jar create mode 100644 embedded-repo/com/rabbitmq/rabbitmq-client/0.9.1/rabbitmq-client-0.9.1.pom diff --git a/embedded-repo/com/rabbitmq/rabbitmq-client/0.9.1/rabbitmq-client-0.9.1.jar b/embedded-repo/com/rabbitmq/rabbitmq-client/0.9.1/rabbitmq-client-0.9.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..776a3945a14db8d058cfc3d1cf79a155e768013a GIT binary patch literal 226304 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 z zS)Ye}1=kYK`zv-G{;{Jr!dRAAsTgxIFzgXxV9>zc2+JzY&(rq`_V)`yx^HN0cxFN9RoVY@ zbM!0k=(IFAI4J0(DKoA-A#^cE;e&?)=aCH>=KAI*y$@A?-1}Q#Nm$gytn9Uq!lrq} z80aq8BoWkedEwkwJ$=SkC9SsBW!RT3`+MQ3_w<>w{{4G?_xCiF4EryKE#KGwyZ!V1 z^L_pMYu-O+2unKB9s1&X!hvp+FV7!HTPQ>qNI6M}yl~WCCGbs1>WjjoR`G2Y7ByLF z+;-k1JL&C)5B55@1ug4>7r3YV4&#$M8hCS`?yY^wSB|$7oM}G3S3`_>-i)^Qk39M3 zeM(~dwftfAk9{+~Z29odVO#o>AI|*qz9vcL@X!1FV260>hSnc@a`Zb+iQ86q>QzR5 z`RlPjSgGPtbFkc;un%U}b2HcES1;JO(sAL1>*;bPtJ%*a_?H%^&wsl8y7rSR+qPUO zJ0fB9dUowu-(Tgow?(n`i+-Hl9Oj~EuO_vXnfdDNGmaCpdB3puT1#ycxwbqgd(yj= z?@bRcyT9$w>*X$a3zltZSZiSKwr#C*S<{}Gr?)sK8fn^x+xl*H{u>scxYzjBS_5m( z%+<1dEY+_T-Mu@FBjqYf6Js^ArT6JF&6F$cyL3J(3v8LSh}~*!!R(us37!E?b;SwO zCHYR=bWFRkm$7Q^k>~ufEBI#5oy++9K=aiy4HJQt@48!>u0}`Ao*kvL**ku!;F7Dq zl%!^ezvSoH_MI(fb?JpK-Rlf~icFj8x2d%DW(eoWu8gFtT{4WVi!N!lUOFtMdxGnw zasS_IiLH?<*U8G2+}-{7+0P=qSvBn`T9^_ukjv|OxGp={VbO&79!XPU@)rn7OKx51eagXB ziYMp5UAaFu8u)MX+-Z(tUjKkc)*~d}CnJcr`4+yIcuDnWSr1> zU(Jel&Ecx+lddEx2rB(m(v#ew^CtX5Ue~&`<-5H1?b8G@Z@n|+T(Tj* zTW4&r)lOfvT_-*_N&Uu{-k5scp_{&u#FWtNpQX@;&9^ z)SDq%%WHi8@O)i&L*;}KJNsG%>#Z{m?!7tZn37%6>K|s$6V_d^S-A5O*RS&4&%49^ zS1m1C5a4XVTVA+P-1LmumHnl&^nInK?yr23>Rf#P$Yr)A!c1JJ+!vlYKH-{S*B8N* zm`g(6v;Jn@5m#!CG7~mR`g5ac?W}g$_b+y}t1lFtHhq8hnd}om5{>N}o*!b#&7SDJ zTKE>%<6E;HO*8!zo?+~A@ce{Yrpp=0e!oBbxG!|<>BXADL*CQ5U*r&Jw% z=V@G_H2v1Pnvfald?HhLUP?UQQhfS5?`l!0-Rhjt4sT+5@0z##IX&ZD_s`WvrkjG4 zxn))Ut(xdQ=}G#JwvVmH>=s3K$6Vt#DVpncu4JOP=_NU*oeErsoFkSrz7R;uK5*&J z=9qtrXYH@%SZ#8(gq1z!pvS5Qy6YaO=}O2PG7A4+6TaaD>zp%-ET+A_sh*gz@~QI) zwamWtdy-g+wS{I@vUTswf0(JgDWc)0&K#w*1i9k9QzSLh{qoZ7t}X7Jx^Z&kO;;~# z|L=+V@?zavFSOfod@gC>KfZX!eEBZ^2a#`%bI&=x{9@qR{zSxoQQ}nzu?v%1ZwVjoeVJ~!f6*r?v8Adv|G1wuu=&@n(wyJg{@XC_qlNk* z;T^4>5e@2@AA}4IYpKsGqnTRUWAB)?88x2L zztrIu7G>`>_te_tmV;KOj}_18dpzT0)$C^Rz^3UhE}UL-NBGPEPrl2+XAWgPdnCH+ zx7OA@e!BSy4e~a55o|Nw|Bl>hG;xt%gO%maZ`Q(@?lv6rEhoQs@DlJkx4@OTx;;Q# zTDd5x`P)1Rd&R|neiVLBem8oex((bweGY~_rs5$*NJty zFNzH}jy_;%RXfiwJ|S`6QJei|7wkEFCT>yZ^vpk^R@R4vq?aDNzad~SK9sF8+QC`kG)g5 zm4B39<(a>yI^REH|MK$il5}(6(JubOe2YhB(t`~UggDS5kkX0KU4>8HKkpXybi zZ!A>~-ihC^Xmy%|_apbss}Jm+KjVaZ@1`_4L2V-s|4Lped?!lQ%_UfZ`Tt0V=7->N4$M-;PWRz{X;_gn7l1H^ByVn!6LT`F5|eULA%kJoU-Pfqv9Yl^v-y>=m6fsaxv||_^XSi>2UixIIWp(Wst`A} zQr`Jb{>1!UbY#hrGn4K({hjpZ&zz*%2}-r=6YBSWSafF66{YO625xNY9{jnq=t;=- zGcpUz0w<`PnQ>&voRGb1j%;#qW8%BEazS!g$#FS7hld;H22q1TwF=U@baZQ>p~Ry? z7an0QHP+Wtn1Wp;E_0=Y>7bNaAhrr}*>p+6U|eHME1_}dP}h5PQGk!b#T zbIL=W*P7k4djFP1Z9n(APjlY%DVwZQpQ*fg<9~Z|p}YT5pYk%jcel1p?e>5E#^+DS zr!NmIuWza9m}{WxeW)?x|CTz}{^+VSqdF_o+$DGCEmHH3sc|^}ZOb~B3x46{YP{hR zL7ArM&*yGQudtlna;)g^`ZRgz`UNsoJ6gsyRV_Nrz2 zrInb!pHQ%7RknYn+fjy+Q2sj^M|+E|ZQLw0t2kr*}GXIsy%B4>(w4_Q--c@>K=9%+SlI50?P34D7))aD1@mv%sH zjoy6YX?&)bsm(=PpZvqs=p$*mJly&UTra;O-EM|d%ry}6q7a$WHGH}5X1n!XG*KJ4KA zO78mvzQ$`CL~onCacXbl$zhG;EiMpwVzT3e_KrmlWzS^q=qeZ8v;1Lg&4LHcyw?k2 z5B*Z-5BV^$t^Z?ZoAi&6gXvOs$Hlq!UHKroF8fCm&;19{ZR>uqiiB&rpSNU73n;4_UXSlvW&`n>#H`Fd)|m@i@tbs z+nQ}^j>@9HJ5L@{dh@(`itL7!Om&=xb!O~ba$08DP0hufVcX{J+7zVN`F+*x*o7;! z_RIL*>yoUhUU8^z<8qai^-2qc%r11rDd)cIGkmvo{~YnG+hlEX6WIShSRo)UIq3zj%>3uUbAlG} z9I0z8=@*utWyxlnDs$U1%auX1Ea+OttJeFsZ5&=M4oS-Wq*POG`E`1Z{fpdu9j6aW zW!2BMZ!~LMkDk7=Rqa@$^m9d{mY>hHoA%B#e0#4^_9*jG`_8os|NXlby+cI%zZkK>pxrWd$X5EPaj0;__+;LM8>N>gK zaqoltZVmo`*Up<5a-X<4ME!Wa@PXcfybJeL+n<&>-jtj6y_{XCk?C3~>*0g0SMEEl zp71(9xqX6Ms=_rj1!o2Oyua#X8fBfX1_*L)MPka@(>>JD8@0I1R z%f0MVi`V1|@+x!RFxs%a;TY>0@uJgAPEKZbKRY<)@m3cxbGG(;h~_C`&$9FjHg~_m zv-&_%#j}n%N8R>GOI!9Ia1-8SbK@h^4bS#atBOhMesxTe>|;syoijJd=}2#0T-n~r zqrG`?MVntl*rzk!%lUwIXV%upD|6)e85rv12oEQqtgnx#t_i+g`~ROxEbM z5}yrPZfrXEAVGbGJCm8pvSR{13)!5MPG5IZ@OGQT*)nab?9Iio+t>MS-gS4{l(N!W zso6qO(&n0#If~gYZmrGSy)Ao}TJ9{9+NF1I>BdHVv;7_ye|lR(-M990d!Ns_|MTy@ z{m*~K+J3)%elGils7;Pv9wjlT?OV}Sf9=Ckg_>`trZ>y{bM^fny0_MKukHGWs~uZD zm~Q=4%KKmJ2v3dkVe@8=$I*^1AKzQ;TWc17;lo^kQy=7|_N{)VpH<=cw%*@&-};BC zy!ID9bj{kk%HfYeN70^T%j_?Gcq}mOk$TprVADT7yz8@nR0>?(A#q6m!+fiM-n##c zI^rMhH~r(!k^kVj;~)KdS3b^G(E1qdTGpxEw4kG+>5=GsHPx&~&jT--T+|F^a^zg~ zR^eVqzG5s-te10yhOtQZ{FanuEmsY^r*}lD9nFb-_994Z%Fdv5ZI!!RN@uS3Yz=z) zQ^6|5(L*bBq4V@voxtcmt@A`{PbIc}Zi%!XMjduR+<-@ym*OiYC zUM~<&Y1PwS*?%Q_lh@>{SJY;{Graus?M%5~h2JcS)eG<1q%GTVN$o=!|2M8@Tjl%Y zyRR>Q^m5;?b2Vl&-`%#kaXUNh`osqlDq|kpysz|Oz5lYwKYL?Vue+)IVQWN9`Zo2; zX~z@lx6iyQ``)im_0l}gBf-^=ZZ4T+-M#P6!W6#^YiuXJTz~%9?%k7r{#*R@r;pmy z)%J5vFL}Ma^xcaavwffGuH5&k*30FjluOLoTh!xr#61}wgG=gHMc$seyM%#XUY z$JjODiqXld)}qM=KfPjdEiaKb6aHChdbwnIP5rT3A-jC66*N}g3;Qx<$wWoKioLs6bhO9aNnOv2UN4is zZy!7Dkp}bRtL2G59^HInbnuPR^BpsdF5mg0vbNDIJ}X$WV&|`IC3dq<@&;rXO}BqD**PC&>ps z6FW2O8Kc^>23?iRNefDnE@eIob&6zX`+PFQR@_6*V|JRq_p<%=es4~e|)JhPvA7)ny?!E^rldO}iZ-@@Si~lzOl@qor(HQ*3O@-Bc5v61Cr#KK@CV zX0~(Tum7t4nc;_YI)nFrN?N4LWgom$zux1i-f4yBmfgy{hhHhL*mC~q*~dSBO>_R3 zV{`B@>#`3UyC!s-&G1uubL;x#H^Iv;Usn(ETgq3K#n=c%dM$;-F}l5=Xl*)y6F0Zw1u8&ex9bx z{@P}n)ux$GX5V~t!dHvL2bwaoS+49mrlwnJWv4k;gq_W<+nx8Of;8{Wz(T9_PtMF- zka==RP}x-DCu%pBaLhCKu-ruEAJ2RF_LPbDgwD$*?aSOWGivoGeRbYFvdpu#NNsZ6 z#x*TwYg1OyX2tCuv(;|%RCa&z@jPVIu*JJu@%GgViqKdzS^p3&90T+RgYKBv0S%A^zF8@%a88iT43kPC%Na6G!&hrt}Z6+gO8Cp!O9UE9`kOV;E9zfgPl+PockzR8!rny
    fUrI5(@w#<<^6p)}OIOZ2-_w3+&Z|Y+clXD(?mBVP zX2q6mQZr>k(%(JFJJ9){R7-_3)rQ+=wZ?zGvs07uN^bjnyK#2XxofMA?pvGYf5@yZ zKJ(-qwcWE`dLEbL3itge6+1!eT5H&r)Wr8;aVBd-Ukfny#%HZzx;%TvtkW^|o4a*{ zHE;UvzqT?rwDj!N_y1053tg~yaxc+Tr0(+zh31)IUMZJ;Rv69QeEV8#+MeU@f>^lK zBrBr$jo%klmq=M|-0ZRGXuyq||2Ngok8ioRF!0=|(r1rXnssNskNjyF!{sJz zuD=c_o!xl**g2&MVUxeAW`B!_bv+mK+RNAdXX>^UZu7Y&t~PzPF2}x_O?yR}ZpK@G1$s{2WX<^W&W{5PGne_ku3LUy=DYCvMK_*z?3O;2 zE+Tha%FH|HN+hX^&&36vTK+8rI#tmc;f-;Hk~=(8JG~Y}kH=2=!SC z{n9vi`1zvKULBzYg-&N`eps%XrIcnWw&Gibd9YOi!L5Xqc7Jb5f7pk)PrW~>3 zKHsdDy?^VCh=v_UTx+IxS17NX+OhIL)3sMo^D^}q9+fx#xY?$uAa_;UVo#M!+-Z>s zic*R)GOf>I;}7oq&XacRP`9PMu2Id)bm2)#A#yhudLz6Fm8T_5)-F_g_CWT_8mIkd zT+g$epIEV4d1H^zpL>EYHr@(kxst+iusuf5_=VVlsfim~m9~j#ggnyLFy+p{j)-EcF4`@Bu z#Pz^`jzdCx-sVX~?N@K!N>4nZwAtM-U4s9LUF#;rmhAaUb{{ji-kf;n@YYX?EmLkk z<9(dxx7c}xsIqSf%V+mM!yZOGy@HGrYUeVa9+?vLIKLjlTWw3wEB5; za(W38MUriIGE(jHjlZNx#+1^rRsD+34&J*gHTl!i2$!1{*N&Fx?sUGoHttLNq)yuCPT=DiCt9c*qJR#{4Xwe2o2k%+WyYE%61W!{SS zOld(W1w7X)4O(=&ihPSTq;@rIy?B8`>ioi&$`O*hS5HpfQO9C#BAu%0-1ELb_H`T6 z<7}-?*XF=vk?i)sOF46{asIwrI<5V>Xp?0GLt1TcfUQ};q-KRD3K<&QQA)`d87gyh z^z=+z@BH0XTP5@Rh?4oGH2%xqtY<35?opa|;Bga1+Vok~XeMSu8(5ALn#eI9o_{xR0P?t*RFcJA?-`&{O=*W$sf;ax*yNcS-z$^ z;>T6s<3QZ}RT=@dFLY(~Y~h11)1#xU<{!`71c&<{i8L!DWKg-IPMk zhrYMYJUbL4ab99y?Ic$BHRe;T~fDS?GLit=J%vT zyVuCgRK95S{9C{0?EWrsU2eP2ugZVtf>*t5-92abaz(M7tq$3;Q^k&E>7HG=baTl| z(dg3;z3+Fr-jbQiwR@9(K~10T3D>fe_>}x_s^3!M^;R6?)qBOpy*k3;*y-OB9?x=P zKW>?G`@!9aoez4Nf-3p)6(^ly-8awpOLJ&}Uv*?m+$^r8Uaf}voHWi~z7U_f{fnvE z?dySOzfb+acJ0CJb)Mcc`?Nkx^^}e+=sg!IsC0JnozQ2Mr{4b0D?B6G7s}(sy>8U>&Oz-CU_J_5-Ui&h7ZDx6D#P(&?YckVQZ){jry*4vD)gr_9 zewwee_Ti=1ww#`&x1NW6%}cxND8JwD!+9N_YVfU?J>S3gK%Vl3hu*bjFF3h#QrnpB zFXfM0@;5$7_@C{qf4|?%h;y^9J22@x*V|uO(x2ovdF(&->ASMnHu=pD{!BUgL^bX8 zdC7JA3;v3vGKTz}e%)(Mp|#yPm%zHN4FYqM4^^yrWF+S|Th^X6wAedZ?vC|U=lv;~ ze?uGFoAjP9I2`%0dYQ!jF2Or?z4xV`e1CoV!{*)Y{lDT*Kl~n;wRqL7u81dmw{|!k z-BrfcE$;GY`JrR6zWZ({ztH=73b##6(l?7WTwInZ=D-n zStIgPvQDk~Oq#?x-bNNL&ILPe`bKm(C@zdRC*;$VCMdP>K}xxYn3?hEH#tme!){-? zELI(%{biX}mMv3K)3OHJD_vpPZ`ZE1UAt{-dG`OT-!;awQzyqV{kWa-Y1YNsz3B2Ff3qD)?_{drKb4ic?$sb#oB)79{2tAfAqOrrY;e6Nc zT*eoSG8_*Q7_3uj{Ej^r4S5h&__JxkS69jSNgq>LFMkka4Yg2tyqYVGqfc^2Y{8v{ z5By}rR__)$bMUUwyTA{occc&0a=kmw%=N2q$(-qnAAL$-IG$p&L_x=e_k=`9K)*Ai z4F7|N404wQqGCi-A<#U2^|2i8mn zCo|5O_HoLBJ4%l;CGSuD*wd2Ww!La{VQufc&ghd{=9=(wUYxe$rtsD+=guv;yV*Kx zcAA#(-I<2G+Oqw}y39;GKj`~Qc~-Z!m@b@H{dnb)yc-v<-kp{BV&$@FbEDRa`DVI> zo1{g1E?#|P_N}u*dsd%q(MwG7zI5UCCfm8YwtBwy`RKdhXixUav$Lj(oZmS;ZnyQ! zi2`!m-`MWmzWnhjpPbUP$9gK9#>ZWB6c@Y~+!NdPO=*je$muh;V&c}le|q?qZQ_9?whi6~Ex+)XZEq-QeY~)P+fs z(cM42yEHC;_gJAXxjUl#n%|7tHfFo2{T(MR%iVovCLFWG)cbW}kCxYq0ob)vD&4PxTtSZ~B*BGyrJFC~TWqG)F=eYw?6AC;tURP>;IC^%? z!42ML7Y8ZFzq1RQ?mNBW<@p^gt;wdcRr>4HBW#s-ryjm$Xx@3|O72~$ou1bom4$g< z+&MLNSL~fuPSud=gT2+emR>g48?LW)r z5S)8$b+qL5X|12dy=ItLJrQ~~$F;D;IVbtH*s&<}ck++bwd%U&_a3t>JDkX6`D;?z zmda$tU*aDYIsE!utdW0xYfHdC?mbJAjJKWmv9v3`bFY+D=pU*550^-UrW@6*epFsD zlP!2z&;8XEtmjWwgdUau;4WH!C|m1a&vh5g)atg{7jN>-a`t+s3(qd?dnNVom}%Oz znFjNEUewE-6$;;6ygWj>x^jJ;VSs`BUF9m6@U6;dO8?I1#>qS=dRNrMnOcOVG zd0*)W%3Bi%T2XoQ{)a^^w@N*=ldq@9Jd@H@-?&Wu^z^w^y|-Uy^Mpy{B?&_KD_Nz05SNexs-iw6y%tX($zkR@~*3D>um0D)>TaZm>sz+?wrX!;i&vau^(IyIi5fKVcJ86RdbfE=jlIm z--uTCDJ=(}R-&&mVt#7s!_l3VI@^SVVzYsF>1ZyGmz_spwd(EXR5@Z4mrYS=;3nSrz3 z+BRCs&hyZzktuf9-g7q4;%e$S?KwW>Unbe<)Cg|wa&M0b>sTbXbfbNR;L-RRhG31# zdyG@$kE*smwC@V2-*9cIkF3)UWt$F<`qu)lj%L->8@#$y^YGsTrj0forye+!FJzOB zd2}QuYJ*DpH+KEAZzud}->@Q?quVn|sOB`ov`HIE7*4ZYtmv|MZnXaOk7C`JLlc;{ z3;&j#(P!5Jy_ct z7bv7HRcq|uG3$fQMD3?p_fI;{2z|SLit^M=-*2^L#V@^6z%yO;`0b?MDK9_#kK?-D zc}Vlb?4LQT2a-d6Tc|zq40&Mk`JJZJZP_=sU zs(r&BkA23w-u_D6^;p!bC!G7!E-m$Pna>Xw`{m2LYkoI7cW1^t&6~4jrpW)cM{VtK zIv%;(!^FVwf(6SN+=y9pq}HBmMRIBZXge)rLVa#69dz{3Ugl->XSw+u!-^{i7q_(9!wuBzygok7u?tEtOiFYgC-~dG7l; zw$E>Wf2_}t_Q9Yr&PRHNr$SR^>7Afyk-~pvcl25^m*1LrWRI1Y506xY&w)d+!p^6* zq$EY$wPZfc7ACRFS#ZamJ?c#tzV2QAlbt80dtve2?@lLecOE}&D(L?AxI~iNdXBay z-|Xs7zcu>qRp!XHE<8$U{^R{h@~4d@Ldh-Up20U~-{q-2d(%Fo z-e^WP-`TBZOSirdWy;atq1t~s%0Ytr<$tEYCBm%x#VnF8hsFdw_nsTHUZ*EvO5z)S z-A&uMc3Yok3hz2_$o5Y7!_{opbk;PhE&OdG%KcYjgF(k>9^3SDd(>S$9di;cADX}= zc}%qJjeU(|+dbn0@oPSocgY>D*tL~cc>nA}A-k@w+I98jl{BfHlP1)++scMs&eds_ zyJq8-*X{z&40>k@}#rzn=`9*fjg<_6YY`X1oCeAx?$W&611CNDXA>8yy~GmbZl z%i@;?=b9PxONbTrs;ri4c`b20KzWCwAlCzlK-u3$pCu5f^TknxtcS?N&-$hTqO)(bL7hJQphw)!nT;XcEK2f6N*@f2BN#Q5l zlAZs@u6e|I&E)z%tNCo$=r z?Z^bD7L}zILDO~k&uE!)$^U0I85}lJG}yVo^YONoqSIo-l2#=O2REus6A|OeytHLw zX<1o=XL`Ds@#ZBF=c977vu4L_>%4VZS?;Pz)Vd4DRv2E*;*b7&@&BRtKSz&$|2;P` zavCqAyjJ0rUTk1oeGl2h%@%jjF0?wv`k6c$Q<;M~>Sy-GVjI zhZb*@IFj7+p-}LCr^7MMZxv2Q%2jPno|`|ZAn4HL(unSKrHo^nh2~9O;B}&-BCbj8 zQFZB!9&wjF8V^MtTj)Og-SdfEsP4o!eb*00ae^OLwOpUUXy5hV_>azx`ED1wgoVy| z{E!s>U(6ZCvj2d->J!yH=OXG=AKD4-?@M6coXvi&%R>Fp9)_b==N39&&c7Uc*6`E3 z#Av2TwX^1WTV<&wSL{soJipD?yz;2s?zW{?RI_~9qO;A#nD_3dNw&$W zQeQq>r)o8gE8A8>;ZAb8=ha(whc8`jjd3gITOm1Fd%NjXn-x}Ux7phh^Uo--C!J2* zF#n!&Wv}Bx>y!;Eeu{DKsEcf7b@^tu;-!pf_>p`M>CYht&gyD^dAd$i+31aBo9V8g zo~(Y+FHQ5pic<|amvCe#@J0rI|8Bb~v#X-n;B8o}vvkRuJ?|>o{C1q&o6>PObmQ9u zZ`R3Ll^3qoKY!qxdZ}z{*rp}tE}o3I{(9SH;grV3&(C%SaVKd{_pd81ix2U=mex1b zRrx~n#VK07Pd{8M>ZuO7u6=Cg36`!8Z95Bi!DGv})C&!1=ZrEa`)_q3X~LLR^NyE(5i zlS}T)OI!$LoX@pviqo?f%4%~}YX#Q`)a3u^;eIX~Eqq~P%-O&jCbrQ9r>xFP-7U;X z_bC4y5~T8~Z`#tfFYAt6?qcN2-c!o4S7iR2ce`F`yj5AZ>9pihmIbPePmUKH?3gRs z6S2_kq^8%+{d=ZdtqjUtC3$VZs^g)X4=AKpRb1OyskDei_UhiHd*?P?y0q(6p@8Hz z?!IO3jVq?dUeUchGuJ5Z=#rklJDiW{y_xngGGM#^8ZX|-hN_E&HMh-L#<%p@=Vc35 zzM1s-KXCUPgiV)*Ss;VxKB+e=O0O-}dQ40GsZM*Tyrt zynpO%&^`TC^p)_tme((Le$!!BU3|LWpp<8U&SU-`iyM|D?(6;a^_iP{j(T#+W~-St zU50|wQ~z*=ub3I~!heeB-kh}PRgzy1i{Cw66o2gYkIfzXPgJniFFm*~;qTj3*2e_7 zqxWoj%Fx~LHoqeLNVUCF?Y{CA=&WyU+vS*mKh0bEJd!`z) z?|IwYH?kUwv>z=l@;%KX#CY-Pb0g`Eucx1@DBDxJRd}x9)l9RaM?XcBFAvFiINy?Q z>Bp_@;e~!7fd{8g49`&DmQS7Xca`V5ycI_Z`Jc{BFSqQoI;at)?YE4h_N(Q*>JuN1 zojP*nwrA3;b!H|fSPn~Vmse=F)}B$&%NSzfq_(|#v&(^fTxnnQZhu^7)G=vw%EDtA zEL%(MXPUf!JZ)O)@wCu=5B}PJUizZ$@gYg=w}D{{O7l6HmA|~ba4GtfXuyV#g>$Ap z*m`-XMgFXHVb(hu>-yg;i4PAIi1@y2>VY-@B?%{gpwB+^wTERd?FCKA#QSZ3pR#sA`8&#t4Fk9@Z&v}+c$X-}?T7NM_YOmrrr3o%)Y$;tobv z^twOf$m-n3_x(X!*SX3=e>nCrOw5?Av8wt-&jh_=FNy>fZ=G@E?+>N^cZZiu7d^yq z)ZBS{;;rm2)0h6aRJriX<^B(AmiD(PWIyBH+_>cKm*F$kqK&{IMy0&pz;MoBz1C{brf$@w91QVh*sKNtCWVxK()F+%JOL1LE(> z$bOj0I{Wsm-kN~;yCTbN?_BeUpCv{vJ2 z)_Sz^(DVwmvx^_z@BQHSL13TEj|of6CkLGUv|OgEzHsX%e*qOAj`)Y?*9Tet3{Dc* zzjR+bdRt!V+M6}y%nS_I*%%m185kIn^Ky!7gwtCF}!QIj>ee$HX1;)P`i{}@g-+R9Dou&He`SpLlu{TI(NK}Y+v)wz+ zF6G5m6meyv%4=Q2(@AzRM|JFsGQwEaW@)^RxLgo@d{>*b)w`?}89SCgPG*+gu|7HY z@U#Q$R(2OZtn6FW)-ENd`Gk4-ODz$zZ*%2kZkIRN?w)llZbNvIj%|m8bmS){{n)S* zk<+v9=(g{^BYXb?Q~BnrYj%HhUj8m!Ch_pcY`-_1_wSxre!r^oP;al>jV;N`d z_PtE1tuE=kdZK_k@9#$8V3$|Nvhyx=?A7>ssNp4dn0tu!*P7q^gr}3dITrDDjpxhf~W zweL;1{x{Gu^vCr83)_OO((i{q><(K}a8c@s#maa$)10Hc<##8y&$nK=>iW}Zo!k|% z&S#ILSF9=cW^p;|^yl)sGnAAU8f@&9HJm^D2UGm43f||wd%9VLi!Ih0T-zPby*IYc z^TE%W!2If|cgyBB2$t>F58@0e_YZp7B=+0tV)vTXwQK5yk6-m~YLiNGMroZyXH~9xFzsyzq-y!M#>bzV#uccB^ zQt})0T|QrXux5_Ib7en~os6q1&r0QdP58ds_OZa3sHyebuQPw_=?lKr8EjIQb4}x( zci5vFmM8WxSnDwURhf97J$j2=yYE9OnTxXLZtCn$J0LK{hj-$nnGa{FKN7jL&+)zN zx~|s+A2qM6zu8(D)x4VJbHo8xrOm}0(?6uSl`@L?a~w=wS9DFF>Cx153885*$Bd4N z?(m%E+Vg3*me1w6mt)l&rw6J$p1N3PQ}NUnQOllHO*{MU6z>U*IiDl9-Jf{7uB#^T zhk&wi`vty*_6IXQzA~2Z{}A-vlvRttYm4`cgStk#=~2(DV%(#ieH8o8zk+A)+3Wm) zruDgZ@7SjwW!cs}*`WTQ$HS1>89oVabA(Wgi97>y&2Y`9IQ`JN>Ao z`}3*K&z0;pxNIj>)7jZ5IxR^wSYvZ@w$6{-uBhk2?-n%eUUBhT)aJRI)2{8AzVXf< zY1Cf%PVTZRimVI_dEA6^a#4PAYD#HQDrQa&iw50}b+BYdisA(!+V#~o4H9xhmH+#3*FIr#waVdYP?#fH+HvPJ`_1CR`ZU1_1)%rR4 zc)VzBw|sua^8WVyf8TzdYyA0ky!|?6i?;R3H`-SVE-?^2^w90aj%A6v1Q}zl7by4a z-JuzuCS}+iy{R((@LLX(Gbgw5D;XH*yT23=OUXa=tS?9G>8(j7Tc2b^_PsmR+S9g% zE&4#dbY$>?(wv(+@>Pu5_RjFAT$ifP$CdHZ$t-(^_Le9kW6Q>ltqEzxed)L6HOvs? zc*b-6#52}k>BlemnLU*H{CV2+z0*I)s89CSc`keV>{8*$mri~0`95c+|L(AJn`LJI z5WN0{Yn|=ZNy^O%ywm2eHtrP-iTUhz%%{3@Nz`KRf)kr`^JlaqyKZhuPZjc1Hosx) zJ4^W-)55Zz$ZeK!C(g}&H^p#%;7iL)W#il((`xj6*+eQElW#AO3)@#5sjPlD)L1ZM z!!DLvTFcxy6Ds;no9^G9^7Oy%iq}idwl-ylvFDzcxHjR)T+s{3VfP+KDZCZAvaW}# zBqZIt(pz%=nl!7B-7iIrg+HI3QdcnJfw=im>04rbE?mpkxZZxSZt~feH?}1_adS_O z7VnG^7nAS0I_LHcyOm6-`E%D6$efh;Y2*1b>5}@MjH>WZ$D;R1wqN;NEdF0wVjGsN zn8@_K*T-?%oK)jAxhc;&X6s!2_D}21tXJzk&D4=yE4*>uTbXqX+wVsQp6nHye4C+X z$(*LyX8IAERIFZKy%l&e@OZYw#Ro4=Je_!KBTKIw`C+>0Y3R$H+9FdHuZzgNcx~sZnmYoG z@2rm5ZVldJ`steUyRZ{lu_`uCq?c~_*_63PoAI7Vf!~vi6$XhHp1A&aM$zxU%L+*Zqdr&=Rvf&63A=MnBkEt`gQA zRLxP?aesU5pAA_8o8l~lHpPY1FSxQf>xTIWr;ys|v+^e#J!a>_eNFCub;g>*?m7>` z{z$s)`EDsy6!FQz79i&o<)BhZq`ls=IpiH*lS_pwh)f}lbd^tqeC)8&wjiozad%F z`te%b)fu60*X_s`&7G6KJngk~mFw?o`;W${wuz|U5`SCY)+f?h`R9>;=ceD5-_|Vp z+{vZQYSpT?Z81+pCsV8&_puGLg|wLcwEWE14|!J_(}HOC2-_@K@W?CXTTENi;n?WP)V@UB%nlgAXs zd5b>(HgX8?y|?OhP2(i-x$GIb%&bedh zySRcS%cLpn?F62a2}Z)|!dLFSIePE?_V#_h9%aX#cG8U9mLI$N|HACA)33ZUHdbk5 z+4Vs2`L5@;@BjN|_x#EF`ubY71?=_}8`*{9d>+kecpYb97}$Te;%c|_4$TMC#F^qg zU+TKjaCSzPgV0L06EmLqMme-eYcQql$#^uMYsXplNdBT4_ou?W=9T~c%HDgy#3d&o zC$cx=@S29*Oz#X$=Jxj=&5M=lzvDG$r$~R_QHdJy^d*s+bEaM?vB-PTHOubY2F*n) zS)GG=Tc+rqlDm^$urkOmtw2MQEivpGch|B@D+10uRhj!f{YlQegR`%1T{1`ORZ-)@ zi-+{2yv%I0o^tN6Tel?i;IIT#_btzT~wm zkM;WXnNy~Q8YKnB<(d@Se|AS=Tgb)K0yc|O|0pvHRij&i9AO+n7dOe=PAX5Fy0(#b z>dfT}@RN&Rlfkt@UZ&<7XFWpOU`bRTU%`_@nW5T&)d% z(Q&0+hB^;Q1@j;HYVF!&^L&X@n~IR2i^qXzrF+MicS&D6+4Fe6a+1vYjtX&QrhCF4 z?c}(AI2>vJ;c?{nj~2ZLsgV!w%cz{vZncaJ*`ygMez9?{lHJktkl;kY@DG;rYZV`P z*Qh?qu2FszU32_{lca(d>x5~WoU3-tm>l}}%-$tA@qxOk*Xlxz|6Gm=^!@sK<%8XS zmi5)0dsf}{uJmr_mv3vvPWT$j7jJ(0zAIDKy3%DH+DGl4mK>OV*GhEx{qVhBjcH4q zeD(r|@c(LdW37@|mLHUQ zU!+`^kvRYE`|ZD(%j6BJ+3hczyf!%=+j8W`#Kna(!qirj2fXJ!+uUkZ-}spG?3{|u zTW7B@t3NoT@TzdqzqgFHb+Tm+B_5FZI_rgdhE7oaS{dD+)i=MC^+dgUYwjenLf&Mr z?jcJ{{_E!p%Fiv#+w%J6g3l{fAHDjIkI3?E47>q`)*_Nw{+pPU6ohtOEw-q z|GzRxskm*o?-s?R3aQ?X2~3BNeB!C>6?nf{?QwC+N$$rOXl9A$iP5&tjdNa=HdfqV; zQO;7{_F=DCgZUSccdQkXby^Fr%(PAxni} zwI{N=a}{NZU34+beObeGUuN5{St}Q2WzIaj%`#`XLAga?>C%7ZE5781P08NiqL~r& z{8YTtowDy8P7gWzLw7}g+IqTZOG6m@N%bSU{vT;{-Qs(zY~Nh5`D^#ZrarFR^8a4! zxn<{F<}Z6ZOD#^4>(926x+#^qh20ZBRG-Z`?(r}9ODX%!f_;8bzB4Mq(N{?w1Iq@!AXqKrJk(zg?^`6wbwdUqaOOAa!+9zv&?}FeLS@~ZL#$s2_ z-6*eb{eM6`zDD4>e-_maT*gMmlz&8^)_qDi_7czH*XU>R-pf?uW4Pzf5#*i^>@#{ z-tIdXC2HdOd#T*R7grh+<|pgC4C}nO$HgPV{iKPH`}Vg&%@b~_PCUKze&~X0t{x$Z zziM>npP6i7(0_QABR#ax^nz7BREN;GuOE}-v*Y!aQoGbW_J6klRJ5_{7+x8L0 zzPma;H}v@uygbnHcih(>V$)2Wb>=L~VOH21RPsgjqSx6ir_Mf)e!TiikZ^J$Yi-Tn z_MfXCGKN zO|RXn^5#4!*A9OW`s|fE!}^D;RSS)z^p#F+-Jhs_Y^#69xoV|vrSm#ApS$5-u-5pf z*d1x>`iq})-gy=^Zqd6Wx7z#CPJPdG)sv@#82;6TcG+oOKBk>npDKjl30A+fM||GqZR5e8$YlU+SiuvVX#? znd<}ot-j;^SZ7m3^HIM9w@v*M1UHA@;C?N7v*E7QvRAJ@2;Dt3|6h^n@`#g}TrVa~ zJtL@_#JVEpbXrmJ^Zd%Yhnb?KpPVjEpSMsfi)GKI;&c_e4gMz_S`VzNS$^~WrkedH zBpKQ2-J->BO?SIG@AoZBf1O8xUv*1z_$sU4d3%=sTceQI<7Tt^{@Xu+Q+>+ZdNQY` zY+v&DK)=xUu!^Go#lH<#|8)_vJ3J+6%K1w|Cl1akYrgVM=JC(Y+PPX>YuR?()^6Vv zb?(8uohw#Z9y#>GM?0&|%go6)v}A{sz}zAQHo1esp9_9ymRx_wtnv9@Pm#?5#hP=o z_B{yxJ?ZBDRj;>1C9f{xtJ0c#&$j#OxxQ=jUUJNgeQ;#@%&9xLN_L!CbMmi&*#=jC zgHJYVE_OQnasOcYvgR;foww$-A1c>guV~2*IrJM$@`kwm4BvLlK<~Qwf3)+q*>2Xz zZee0zxQy)%SM&le40Q9Oe-YYJfvF+){VxZI{Cg*%UE*3|;UGA5ewp)%hOSMPu11_E zl{$5*CofrjcE^RS5m8gz|0~xrK5qVa)BaRNUi9;Vx#v{hT7I8Xy#M{5SNs0|_#}G3 z$SmbV#H5K$YFnzEqNf>lh;pueR1hyC=TV`N*sB=&#O%8lPi@w^V-xO_+?&C3STt|8 z{@=8_C9A9MDtRw^B(W>>a;)CDiH0xVeokgvn`Gg8_Uh}>cc%BV_8r%KH#h6N?s1DJ zWs8?Z@7wu!+I{I~6OYU8K44HK`1Z>S@kh7*JBqH}>a;aRL-5IgjW1dA+SWu_UhpqD zd+BZ4wqSb$-t`Jy$?A*x_{6XJ8Spgk-jn!x-g_YzFV)FA77OHb_a*L;-L>nz)q9tF zin|i}zH&7cDKhA?FHGKdHuro_UvS6kVZ)7azXyq{UcrHyXpicfQK2_-0iH+nX#7)jX10nSWPQ+Oztsfy#$lAG~9) z?M}bp^E~bH@|zvsq=Ua)S9bpM>)??UFKk_w^G@=K`20L!zQ@bMs#VLG9`m%lT-(C9 zqeolCSX@V0<>hThu}+3}rYBiW9{h7CUFF=x@6thhGUWygrVX;Z%*qi9dy{$&7>U;? z>)yBcxo+aT1ErVL3Y7bdB%OCUOexdaCb;# zHXrQRp{uNuQ(m}R^ryVtuY2i2fnOYj472_OJ~HPP>^ai0`=q7i_u_q)#`o)MesC<1 zKCF77z_80Grc0@9o6?H)NhK~XziQmNxUlCVhn06=U(2Nu*9)?a{w&j3yPn_OGuLQy zkb@6L%U)IE>$g-d7|tx*#ChFgxv&0jn~C3jPJg*3?0GqEOG?qnk7~ZrQtP@(*d@(V zZY?v{xgcuo_rT?Lk3+_p$b_FrBL0wiMo;_HIV%lcGt-{w068P^BTrzVd^HRptA6nUQIJX)H}F9VW}7L~|CT7Tv5! zRM9yc=hJh0Udi1*tJKBw_MJHqdcGt_jq}#IS+A~~Sj%xm?$i8px3@_(+g)5Tx!m~E zw3TgHHk-EkiLO}4byX_sg2+Kp-n}m_2Q;4ISeNzUxG67l!nS4mzb|>nGs}eM;Vy^! z{}Yu1Dgz$ZRYj)R%)2mu@!x0DW6oC^oz~sVd;8{XBc_wKm;dkObV^MzGCIEX&7-6~ zx$J|t`q=EZq|L~&7x^syL7~3?z?qGol;?2HX7t!tGjhv`ImG{{9ZTnoj07GXdhzT@@jMN{F2nnY59RN z_cax)1iIdvv~1(veSaC(?)l&ME`JmsAXMM4(LYscm6yC&fN8)N?<|d5_Y%$)zj)HU zG;VF&eDlIa_M5gJ7>bt^&-niHUddq=&KasM{Vyz!zfga%z}@~*Pt~bZzsGDUd5`!==7fj3GIOa0*{ht2$Tl+&9*4piDaQmdO*JR&R zUXDL3sQD%0!0WhZW(J04HY}Gkz$y)_`2~_kriQ-F6LuG|eS9M>{c+8er?WfqGHzM$ z9Z?g|kYL*A+!Z|8qx6;5pUz{m1NUs0$GdxThn>UyMf{9G%}d=5><@e8toZKDtRpUN zO4Dqayj zVAa1V`yaSYKYjPn`h`>WJnb@S-nh1^aOXZ=Lowa{wfgJxO}1sfzTKbwwW_yqtzl1? zt)zxt=;YlCJskfZ)8?1BR4)5+g=*WvKRJ^XBfplh9Im)KG0FDLmX5{eRs~m@mCwFY z{-rqIXyq-wk9&i*@AbR*eC@QwR_D7H7R9*#4a~79x-QzgZMlim_r;Ss6Vx``PEx%rX1a!bz9Rrf(~d^vS!e#IekKsgSd3y^zx8=BvJY zbiN+eGcfUIvF7;Ny>eaPsy6Xo+agN0$ceKhoqPR4$M3O^*z^ywho36%nDx3V_MP7E z-HGlVUq39>{Wj&X=b@;NPkJ`lb>)Wn%`0V=WrMuqm z%lO9sb;GQqk#kNzO1C++Xj!XfjqRiK9DYK*!k~M2XazTx`x_4n=VOl(FT&KEMWSGaDI?a;O zVH7V^+QjMM^yA7^X^l0nb+(_Vn;5TZc*f(AyZw*FJv{<}3%=IgE%#zw*J`oARH);&EuA?Nab zpV+{OS2uPo=jmK6Q?lmaOrENB$+2Rd+b+hdeScZez}fcj^|}K~nM{}QIJ-ID@c!l9 zIw@DpbNeQ{>CbGXOm6YHJC$&*U&zjT+T-n0kIH0yalZq4RmWu>e^FIYsOOp?GWnXy zTc1rmIqti-%G~q?zg(8$o~y}oVbyh}0^#i^jv00=tol^$a*|&sPGM8Dt4Td$YWb$F zzV9zr79Y`D@Xl}E;>}$@*xs5}z5m6P>na&^t}ywR^g5+b9E<{H`;WcNU(gP<9yY(D(^Ah#YJ`oJ%XF&POX+@iDF3e^u(y{knwuX573nz-$#;3pN7W1lH zp}@suBrA8=*{q>7kxQD%FhMxdV_7Lvb8W)RMSn!<8odoCPRLkPT|ebxjq%$HhjdnT zcHet{&-(kk;&*fNf4%;`U7kT~gN!?iv0+JK*euJ;9*$>^ZN!x#L^|GH_g}Loa#b`_ zlE1>9`d6$k&nkbuV&awd^uP^0nMl|4saLJPIUX%}Wh$nzyE5(3?`y{wmA<)gwd+8F z_xX2;YkwWonX)D{a@Jzr^*2RtpXBn%-oBC9`nypj<5$jZ;#X95N5#l0IpXm&i`uYtUY~2qS4G^cx&9=A_lEnj$BbvT{yFvb-yN?9ZkvOg z+i&PznjDn-uF5e|SK#me&U1g8U%Y61YGP)yAhl^-@tu6@&V){V*V7yR_EtyF|3CGR z!iJ$SwKXPxh6I<}i~f&aUcLYQ)pNhy(W?BOz%mvAcrYmIc+Q0bqR=q3Q zE&4Sp6Te?H4);5xUF>>5bnnAR6c z?h~r?`_CBQ&B!Fe%*6l#-r1toAR2}_8Cal90fx7ZAf~Tth@-BjpPT-_Qw$6UtsD$q z*`n4LPp@Qq#=yW($H>4S0#XgdOBz9$1+LZC(a+P(H8@1i*9~C;1K0$p1~3J)nt=gi zxicdJcuf*M9lT(DAOfT#6{-WiiV2@qgmXb!C!lLh2JceU$7g~h$X+l8nQ#b)37NSC zIe3i`1{(n)K*sz;HwH47h|e7oAiZD=GC+$75^V55fEWNi+z_8B(qI!n1jv*G+@^pw zci=Nf6l4Y%gA4){p2^57%V6zzgb|RWr1;4E$|D8_25&~lX#ihB>lR42t zW16CO#9amk1|LSq9tW7=OB#Q%6KgUqS6`ZMdRUy1fnf_Hx~r8r37YManv+=u+e?A& z>Vs#jOMf#kFqC7Yj213}CcCGWV2?moxdWU}85kIXFe30MH!-HV<`%#jx9ARD_?ahO zhLM3`J0k;w7A%axY2zyoF-GGG;>m1&p0bP#3|ldRIFgT`xdEj~Ihn;7*aKsh-)!|a z3=9mQ5>x}l#RvEanjDy4jNQ~N#V3|-VPIeo!3c*>0>qe#D;zHNit1iuU|=xD2#0rq z1kDXfP0q)e)YeN~e|(*Rfx(s$vcC-$6iXU8g^4xUvA8lX8GC@Ne6ZSl7Xt$WC~<(! z*+m$yFG8&GxB|uGX7v8Y3=9kb7$u#lC=q67r6%LZDDM7`8dw<_82T{`P81`;;F8j! zJnW$n`s~0A6($CT3RVUN6uGU%D^*;K%{qLJfq}sYBl4ouh%nnNC%+tfQ13bvas2`V1A`ex@mZ)&q`|n{toz72 z4|_`P(ICQT|AJH;3GSD?wE(EKnvUV-9hyWMjLXfg?~XnKwK486L5`P(CFdoLFSQ68 zjXj7%`t95p7#SF5GBPme!wdxHk6s;oX6EPRL2j_cm*|$9cq0KSiqtVmx?8#=7>+AE zyyvg@!2)$VYDxE4k2vFTN8`_>FLa+XFfhb1LWYT9L9?XM*noJmak+fQx6OZ^FfcHr zVVIs_NSx`xsmY~9IP&`G;9Ytk(=!r;J2gm6wBT`Jq<@&`}J|}uGGBB7hp{JR1 z#zdN5l30YJCP-QIH3d{NYBHhMj>)DZ7>>*B@BRH3ff^w>80Fx5GvbU7Db2$X?rQ>% zW`g)a0B*Tq*H>oP@+41_lOIi~@k$mIT9b1<4ZK{c1dn3=9h}B2&zc zIOB6tOK?PHc8y&6J_ZH`WsJzovnSqcTrNN2^1I5Dk%6I_39?oT7N1KRs~m_h9eY&j z3-ay;Rh2gx(GBHr!eeMakbj83v%e2^Lmzl-z5sHmA`^PDYj(zCXkck-X{w4-W*&5E z8NK_W@ZBhND+2?A7)F~x*p(<_afPhc?Ppfej0_Ax7#&+dH-ZM^P0S1}r^3E7FfcS? zq_%DD#F~uD)ov*#DnuC>7*=8g$4?I;%*LIJ@3A~;y2`-7V1>~f3HKt>U|ep#pLnGH z4+8^34Mxwa+?$}$0i{LhIC5S>uHC#V3=9kw7(K7uKE#=e%f<4`XJmrv7H%f=fts7X z1WgXjOTw9&KgwF%0ky8BFhV)rpGbpoxj8Ox!Rl3v3=HR((K|570fdako}(ET{!-h_ zz`($ZG1TE7gvZ2?3Ki%4+}unY_4X0_y)xSv7#IXGQiDe@F{a}3f6GPIW>7(aX|7uc zeshEJb8?araShrXsM8Y%MHwj9p?0;LLy0pNmy0#?0!21q4PUn~{3Zvd=HToh%jzg> z#U2iJ;l!AV%e7M&qU4eo85mA8F)%2?sv&S=(K-UJx!4nzBx91~3nm5zMm7cpITYjW zMB+9MyIG=sli$m;FfcT5pgWBr7Kd3WDMhKpI6Bwedv2*}Gcqu+F`+l<;}UTgmjhZG zRSE7^r=YDIM6b|{=Jgl*u`n=v7D9LI^(5@3LwoJm{k|wIW8!WG1_l8}bmLOeaTu4M zo12KMx?MV{MFce5dy)yg6p72gWgM)Bhuwkq=c%8tW@BKO%7da{qFZ8eNq$i! zc7snG2s(FlE8HZ_EgX)g%1;CO#v){E@@mEO9!NKfq8rM)b+OJiCI*HcHuM&kZaH>C zT~gB$OLIz`A;a=G+#0$)sP+RR1H%DkbiZp=VK>$_uPikuzW_%yy>ZE`E(InAhM6o3 z45~1XgA0zR8tmq|r?>H_^0G28sPm$apI9{DGQJ?FAQ`l`4%fWF{yiCv)0r3;maw8{gU(hQW~LSw zC#I(o8VYpTH2wM-1_p))3=9kkD8ZZAfy>~MjC>r;ZCMR=S5rm?hWi*p0>Pa)Ov@}T zPEGMhO)M%&N=+;w5VYEj5lZtJ85lyC(PtxWbYVB&uQVqoq^PvG#5XZ7F&$U%uJ|{< zhL4GXVG0Xm2P7;YmNf3~!EP?N;|6s@=PM0oq=J2Ai9Cymf|!JUl!x^ z+7tt7Pkm-UkD_U7u^SkiQCgCcU!I3QF#Rr^_XbVQ6=AekC#=J7u3vshW?Ck$NYYDb z2;IuWz|hZ%K7zG(J$`e8Gt=`Da|mQLXPuoZE0`G=RVaP$p?Ht$qmJMKWIlIQ1@WagD7mSpDRm_3+q;KdQp z>_IIf1A`^hDiF1#vHT!$))8gRG?w%KHi4SLEDQ|pAoHPkN#mA7#90#z@@6VYesjCj z^K3B}0|T=Zdcr+@geXg~mp2kQTFwV{vh6Zc+}e{A~LC zZ7@GK1H%gmba!99N|XiI-L2_dw)Z?}qMaE%!)ZSxWGt*{j;m15banjnl7)exmkV-O z3p9EemNdFOCfaP@#LPUO{QLs!&VSCIRr8IBfkBH6vhM_8MbitStq9If&Q2`>_pibe zag8iI5En~z5@%qTXO6z;L2hBZMrj_ zwMXB4A8@m=Ffiz2B%#BCBwB!L=t0ez?Y$X014Doi1A_?z0xW5i5hLCTNT&yT1W!>_ zHvP!Vz+lS7z+i^3fMH4F5?NAhz~u|)>3zpfu`)2E@uBv!Fm4U$xBMO)-h&CVZ+9lInubG%w85pcEqJYPaXd7^@VTyhA>6HsJ149r8 zdicaRlVUoq@Y&ct>El;s1_p61^d$PhjcD`nu4!tkIw{J+!oXn0h2Cy4_a@Z_JZqa2 zJw*-&Ff%Y@aiHhtN&ci-gDbG^$?@ue%I#>3lGQAj1UqoAbGl7)L|7OY95DQFw2%ZVa4&$#-C6fsg@u9PGKL?t%1E>TmmeHs zS6!OO$iNVR(E?srMZ6W*)6reGZFxeh3=I6d3=HP590nfNsH-8yY@*gT-DT^}b7p2> zXyZUH^`178VF|8q+HmNB|9ch&hFLu5rCxn2Y1ZJ5?zg;0oCH`H7}B{I7%Wi2>rfZz zcHr{KC2wH^P^vwJVT(pTX|~{7|1@tp`xlTcSGX7$tWf+iX)-ys;PQ>$k1bmT*%%la z1<=#jzv(2}gL^%c{M7?nPOvgCEaOK{V=42;h`0q>GxqzmxiT{_ zG+~rrYY&lO39dNN?dF~v2Rb~K7rg}YJVu%|xL3NI+`WiyaJ}niV_>jSMsHq)UnIhCA`;bK<5wT2urV;)6+q7% z7B`5n0X(^aXI0nNnQqU0nHd-&IM7>G()UR+9#`;d^-tYx$j-oEfiYyT^AXV&;9cc) z?2N&zQ!ES&E*J%&%_~xEz~u{05u>&PtPBi7eCWXx^_~PfaOZ^=bA6tIYCs)~##{DR z5-q^xhjaUTIe)V-Fx2y)_gOFfB-#o*tHACAv}pZfW?)dm=(EcHC(V3ZK8QXnf8sYQ z1H);4^jOGcX2LuA2Ogk<?uW@2#U`XLWABEk?NumX~{Lnai+Z@nrc@_(L zSI>`^SSzrXMP~i$EkQMdJqP-rQwBc~CKFgKb~dR&)Rvin!3Sf+RH zb~9(3s}~YrV_=xVi@wSBxG5epp<@|%S1)V}u=sh6nSr5?6Mg1L$%e4eez<0LdcOaD z|DKtFVLFDf_721tYlJ-@iobj7H^?zC%#TH1K3?iVgt6ESHU8Yr4qCd|hq0K~DjA=l z;GOYdsYS&&r%L+_R4%))Ffi=mMDOKIO~Gd}^2`l%5l&?gp5<6#fA@VaWno}=h0&Wd z%p}#G@S@BTT+@sMnVdJe8bM3gzhdn6 zGAhDj2XTh8o$h$Do0ow>Pa1uVVOcRA!@(=JuqU2ZstpmK6`PzG>$Qs;37LpD9HKZS zl9?DG=K!GYrFq_j$6%lQy!2r3VhZf;6+ZAMsDPP);Sn1HgEIpHENL`oA<9^f)SQCU zA{D2~l2pf{qQpu<7Di6sc9R1w+yzb4A?#yV(#Y6Bf`!<9lfClf+AE+%6&&b`jdHs1 z7!K)$U^g=7u6afzGXujicJwA!b00w?9gEUSb5rw5@MTt)>C^k$SQr>oFb3~+ClPG{ zzFfMFCHeSmW(J01piT%%h_g(`V*zYM5^Uv=bAE0?ejfaadh{ir?%UVd%wlC=c+8F7 zO*5U1&ld1>Iygh&P5!5a%P!V3GcY7U4^D;oV@adjLOjNY6qV*BCzhn9c;*$9mIRj+ zr6%TLkLSmo-}YbNU|?7vjJ{;+%@RBofX_I>7rn+3al6lOGBCWvFqdT=A#?G?>b^?1 z*<#EL3~p@b?Fxw<_{_yuKTZ2te&P~40|U1pdIP#>H=3D{(^Eo<5|dMlR9rHPAUkXE zM&ZSuv78>93=DsS7#QSX@dqB?o^%+G>DZ%-Wr>xFF((7V9wGE&QN+(;H4J>vi&wC} zAHK+1J4H8QIs*g4X$JHKE)%ZdH#Io5C^Io9vnnwu2gl;$vo2h(*RwJ(oaI4}u;T0Z z%?6zqhdmUwMqZgC&(FY6Cx;#iX?O9Pi7#m}^KTAX#L2)ADvBNor{CZ-6?FWKS8;wG zXfYSKC4}9@oQ|kBCBxFelE$6ih%p;puVXhJ{kB?!@l$>hV?4e^o#+?CAFPXT`>_I>14`JRaWgO<=3UF37kmj2V QHyPr585nxhm>C!t0C{}xx&QzG literal 0 HcmV?d00001 diff --git a/embedded-repo/com/rabbitmq/rabbitmq-client/0.9.1/rabbitmq-client-0.9.1.pom b/embedded-repo/com/rabbitmq/rabbitmq-client/0.9.1/rabbitmq-client-0.9.1.pom new file mode 100644 index 0000000000..905b5e83dc --- /dev/null +++ b/embedded-repo/com/rabbitmq/rabbitmq-client/0.9.1/rabbitmq-client-0.9.1.pom @@ -0,0 +1,8 @@ + + + 4.0.0 + com.rabbitmg + rabbitmg-client + 0.9.1 + jar + \ No newline at end of file From a9ad5b8bddb5f32bce6be0e916d320db781a985b Mon Sep 17 00:00:00 2001 From: jboner Date: Thu, 27 Aug 2009 18:27:49 +0200 Subject: [PATCH 14/35] init commit of AMQP module --- akka-amqp/pom.xml | 30 +++++++ akka-amqp/src/main/scala/AMQP.scala | 121 ++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 akka-amqp/pom.xml create mode 100644 akka-amqp/src/main/scala/AMQP.scala diff --git a/akka-amqp/pom.xml b/akka-amqp/pom.xml new file mode 100644 index 0000000000..62792c17e9 --- /dev/null +++ b/akka-amqp/pom.xml @@ -0,0 +1,30 @@ + + 4.0.0 + + akka-amqp + Akka AMQP Module + + jar + + + akka + se.scalablesolutions.akka + 0.6 + ../pom.xml + + + + + akka-kernel + se.scalablesolutions.akka + 0.5 + + + com.rabbitmq + rabbitmq-client + 0.9.1 + + + + diff --git a/akka-amqp/src/main/scala/AMQP.scala b/akka-amqp/src/main/scala/AMQP.scala new file mode 100644 index 0000000000..74d0350a17 --- /dev/null +++ b/akka-amqp/src/main/scala/AMQP.scala @@ -0,0 +1,121 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package com.scalablesolutions.akka.amqp + +import rabbitmq.client.{AMQP => RabbitMQ, _} +import rabbitmq.client.ConnectionFactory + +import se.scalablesolutions.akka.kernel.Kernel +import se.scalablesolutions.akka.kernel.actor.Actor +import se.scalablesolutions.akka.serialization.Serializer + +import java.util.{Timer, TimerTask} + +object AMQP { + case class Message(val payload: AnyRef) + case class AddListener(val listener: Actor) + case class Reconnect(val delay: Long) + + /** + * AMQP client actor. + * Usage: + *
    +   * val params = new ConnectionParameters
    +   * params.setUsername("bob")
    +   * params.setPassword("wilber")
    +   * params.setVirtualHost("/")
    +   * params.setRequestedHeartbeat(0)
    +   * val client = new AMQP.Client(new ConnectionFactory(params), "localhost", 9889, "exchangeKey", "routingKey", Serializer.Java)
    +   * client.start
    +   * client ! Message("hi")
    +   * 
    + * + * @author
    Jonas Bonér + */ + class Client( + connectionFactory: ConnectionFactory, + hostname: String, + port: Int, + exchangeKey: String, + routingKey: String, + serializer: Serializer) extends Actor { + + private val connection = connectionFactory.newConnection(hostname, port) + private val channel = connection.createChannel + + def receive: PartialFunction[Any, Unit] = { + case Message(msg: AnyRef) => send(msg) + } + + protected def send(message: AnyRef) = channel.basicPublish(exchangeKey, routingKey, null, serializer.out(message)) + } + + /** + * @author Jonas Bonér + */ + abstract class Endpoint(connectionFactory: ConnectionFactory, hostname: String, port: Int) extends Actor { + private var connection = connectionFactory.newConnection(hostname, port) + private var channel = connection.createChannel + private val reconnectionTimer = new Timer + private var listeners: List[Actor] = Nil + private val endpoint = this + + def init(channel: Channel) + + def receive: PartialFunction[Any, Unit] = { + case message: Message => listeners.foreach(_ ! message) + case AddListener(listener) => listeners ::= listener + case Reconnect(delay) => reconnect(delay) + case unknown => throw new IllegalArgumentException("Unknown message to AMQP dispatcher [" + unknown + "]") + } + + private def reconnect(delay: Long) = { + try { + connection = connectionFactory.newConnection(hostname, port) + channel = connection.createChannel + log.debug("Successfully reconnected to AMQP Server") + } catch { + case e: Exception => + val waitInMillis = delay * 2 + log.debug("Trying to reconnect to AMQP server in %n milliseconds" + waitInMillis) + reconnectionTimer.schedule(new TimerTask() {override def run = endpoint ! Reconnect(waitInMillis)}, delay) + } + } + } +} + +class ExampleAMQPEnpointRunner { + val params = new ConnectionParameters + params.setUsername("guest") + params.setPassword("guest") + params.setVirtualHost("/") + params.setRequestedHeartbeat(0) + class ExampleConsumer(channel: Channel, listener: Actor) + val endpoint = new AMQP.Endpoint(new ConnectionFactory(params), "localhost", 5672) { + override def init(channel: Channel) = { + channel.exchangeDeclare("mult", "direct") + channel.queueDeclare("mult_queue") + channel.queueBind("mult_queue", "mult", "routeroute") + channel.basicConsume("mult_queue", false, new DefaultConsumer(channel) { + private val serializer = Serializer.Java + override def handleDelivery(tag: String, env: Envelope, props: RabbitMQ.BasicProperties, payload: Array[Byte]) { + val routingKey = env.getRoutingKey + val contentType = props.contentType + val deliveryTag = env.getDeliveryTag + listener ! AMQP.Message(serializer.in(payload, None)) + channel.basicAck(deliveryTag, false) + } + }) + } + } + val listener = new Actor() { + def receive: PartialFunction[Any, Unit] = { + case AMQP.Message(payload) => println("Received message: " + payload) + } + } + endpoint.start + listener.start + endpoint ! AMQP.AddListener(listener) +} From 4513b1be345fdbc7ac3516aa60bcddd71228a6bb Mon Sep 17 00:00:00 2001 From: jboner Date: Thu, 27 Aug 2009 18:42:39 +0200 Subject: [PATCH 15/35] cleaned up example session --- akka-amqp/src/main/scala/AMQP.scala | 70 +++++++++++++++++------------ akka.iws | 13 ++---- 2 files changed, 44 insertions(+), 39 deletions(-) diff --git a/akka-amqp/src/main/scala/AMQP.scala b/akka-amqp/src/main/scala/AMQP.scala index 74d0350a17..7e46ca1b9f 100644 --- a/akka-amqp/src/main/scala/AMQP.scala +++ b/akka-amqp/src/main/scala/AMQP.scala @@ -4,6 +4,7 @@ package com.scalablesolutions.akka.amqp +import java.lang.String import rabbitmq.client.{AMQP => RabbitMQ, _} import rabbitmq.client.ConnectionFactory @@ -15,7 +16,7 @@ import java.util.{Timer, TimerTask} object AMQP { case class Message(val payload: AnyRef) - case class AddListener(val listener: Actor) + case class MessageConsumer(val listener: Actor) case class Reconnect(val delay: Long) /** @@ -23,8 +24,8 @@ object AMQP { * Usage: *
        * val params = new ConnectionParameters
    -   * params.setUsername("bob")
    -   * params.setPassword("wilber")
    +   * params.setUsername("barack")
    +   * params.setPassword("obama")
        * params.setVirtualHost("/")
        * params.setRequestedHeartbeat(0)
        * val client = new AMQP.Client(new ConnectionFactory(params), "localhost", 9889, "exchangeKey", "routingKey", Serializer.Java)
    @@ -62,11 +63,11 @@ object AMQP {
         private var listeners: List[Actor] = Nil
         private val endpoint = this
     
    -    def init(channel: Channel)
    +    def  init(channel: Channel)
     
         def receive: PartialFunction[Any, Unit] = {
           case message: Message => listeners.foreach(_ ! message)
    -      case AddListener(listener) => listeners ::= listener
    +      case MessageConsumer(listener) => listeners ::= listener
           case Reconnect(delay) => reconnect(delay)
           case unknown => throw new IllegalArgumentException("Unknown message to AMQP dispatcher [" + unknown + "]")
         }
    @@ -86,36 +87,47 @@ object AMQP {
       }
     }
     
    -class ExampleAMQPEnpointRunner {
    -  val params = new ConnectionParameters
    -  params.setUsername("guest")
    -  params.setPassword("guest")
    -  params.setVirtualHost("/")
    -  params.setRequestedHeartbeat(0)
    -  class ExampleConsumer(channel: Channel, listener: Actor)
    -  val endpoint = new AMQP.Endpoint(new ConnectionFactory(params), "localhost", 5672) {
    +class ExampleAMQPSession {
    +  import AMQP._
    +  
    +  val CONFIG = new ConnectionParameters
    +  CONFIG.setUsername("barack")
    +  CONFIG.setPassword("obama")
    +  CONFIG.setVirtualHost("/")
    +  CONFIG.setRequestedHeartbeat(0)
    +
    +  val EXCHANGE = "whitehouse.gov"
    +  val QUEUE = "marketing"
    +  val ROUTING_KEY = "newsletter"
    +  val HOSTNAME = "localhost"
    +  val PORT = 8787
    +  val SERIALIZER = Serializer.Java
    +
    +  val endpoint = new Endpoint(new ConnectionFactory(CONFIG), HOSTNAME, PORT) {
         override def init(channel: Channel) = {
    -      channel.exchangeDeclare("mult", "direct")
    -      channel.queueDeclare("mult_queue")
    -      channel.queueBind("mult_queue", "mult", "routeroute")
    -      channel.basicConsume("mult_queue", false, new DefaultConsumer(channel) {
    -        private val serializer = Serializer.Java
    -        override def handleDelivery(tag: String, env: Envelope, props: RabbitMQ.BasicProperties, payload: Array[Byte]) {
    -          val routingKey = env.getRoutingKey
    -          val contentType = props.contentType
    -          val deliveryTag = env.getDeliveryTag
    -          listener ! AMQP.Message(serializer.in(payload, None))
    -          channel.basicAck(deliveryTag, false)
    +      channel.exchangeDeclare(EXCHANGE, "direct")
    +      channel.queueDeclare(QUEUE)
    +      channel.queueBind(QUEUE, EXCHANGE, ROUTING_KEY)
    +      channel.basicConsume(QUEUE, false, new DefaultConsumer(channel) {
    +        override def handleDelivery(tag: String, envelope: Envelope, properties: RabbitMQ.BasicProperties, payload: Array[Byte]) {
    +          messageConsumer ! Message(SERIALIZER.in(payload, None))
    +          channel.basicAck(envelope.getDeliveryTag, false)
             }
           })
         }
       }
    -  val listener = new Actor() {
    +  endpoint.start
    +
    +  val messageConsumer = new Actor() {
         def receive: PartialFunction[Any, Unit] = {
    -      case AMQP.Message(payload) => println("Received message: " + payload)
    +      case Message(payload) => println("Received message: " + payload)
         }
       }
    -  endpoint.start
    -  listener.start
    -  endpoint ! AMQP.AddListener(listener)
    +  messageConsumer.start
    +
    +  endpoint ! MessageConsumer(messageConsumer)
    +
    +  val client = new Client(new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, ROUTING_KEY, SERIALIZER)
    +  client.start
    +  client ! Message("The President: I'm going surfing")
     }
    diff --git a/akka.iws b/akka.iws
    index d1208ab19f..0292fc4550 100644
    --- a/akka.iws
    +++ b/akka.iws
    @@ -2,15 +2,8 @@
     
       
         
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
           
    +      
         
         
         
    @@ -68,7 +61,7 @@
           
             
               
    -            
    +            
                   
                 
               
    @@ -392,7 +385,7 @@
         
         
           
    -        
    +        
               
             
           
    
    From 050083a39614f7fec6c9b853828935768bae690b Mon Sep 17 00:00:00 2001
    From: debasishg 
    Date: Fri, 28 Aug 2009 17:00:39 +0530
    Subject: [PATCH 16/35] new scala json serialization library and integration
     with MongoStorage
    
    ---
     .../0.5.2/dispatch-http-0.5.2.jar             | Bin 0 -> 73237 bytes
     .../0.5.2/dispatch-json-0.5.2.jar             | Bin 0 -> 88708 bytes
     .../sjson/json/sjson/0.1/sjson-0.1.jar        | Bin 0 -> 35120 bytes
     kernel/pom.xml                                | 564 +++++++--------
     .../src/main/scala/state/MongoStorage.scala   | 581 ++++++++--------
     .../test/scala/MongoPersistentActorSpec.scala |  56 +-
     kernel/src/test/scala/MongoStorageSpec.scala  | 643 +++++++++---------
     7 files changed, 949 insertions(+), 895 deletions(-)
     create mode 100644 embedded-repo/dispatch/http/dispatch-http/0.5.2/dispatch-http-0.5.2.jar
     create mode 100644 embedded-repo/dispatch/json/dispatch-json/0.5.2/dispatch-json-0.5.2.jar
     create mode 100644 embedded-repo/sjson/json/sjson/0.1/sjson-0.1.jar
    
    diff --git a/embedded-repo/dispatch/http/dispatch-http/0.5.2/dispatch-http-0.5.2.jar b/embedded-repo/dispatch/http/dispatch-http/0.5.2/dispatch-http-0.5.2.jar
    new file mode 100644
    index 0000000000000000000000000000000000000000..c313e7cb8a2293b0a7f794c120b20bd4c8e08400
    GIT binary patch
    literal 73237
    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

    Khx%vrA&)4~?6WhH_nxM8ng2a{teB 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 Y!OO}9QWwAwz>q1$z`*Lj$iTn=0P6bbtN;K2 literal 0 HcmV?d00001 diff --git a/embedded-repo/sjson/json/sjson/0.1/sjson-0.1.jar b/embedded-repo/sjson/json/sjson/0.1/sjson-0.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..9d3e3733d5821957d457ad3d178569d0f8c558b4 GIT binary patch literal 35120 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 S!d7QcXZXU+z@SzOG7SLxXGP`! literal 0 HcmV?d00001 diff --git a/kernel/pom.xml b/kernel/pom.xml index 41c3fc05f3..4af5fc8d66 100644 --- a/kernel/pom.xml +++ b/kernel/pom.xml @@ -1,274 +1,290 @@ - - 4.0.0 - - akka-kernel - Akka Kernel Module - - jar - - - akka - se.scalablesolutions.akka - 0.6 - ../pom.xml - - - - - - akka-util-java - se.scalablesolutions.akka - 0.6 - - - org.scala-lang - scala-library - 2.7.5 - - - org.codehaus.aspectwerkz - aspectwerkz-nodeps-jdk5 - 2.1 - - - org.codehaus.aspectwerkz - aspectwerkz-jdk5 - 2.1 - - - com.twitter - scala-stats - 1.0 - - - net.lag - configgy - 1.3 - - - org.guiceyfruit - guice-core - 2.0-beta-4 - - - org.apache.camel - camel-core - 2.0-SNAPSHOT - - - org.jboss.netty - netty - 3.1.0.GA - - - org.apache - zookeeper - 3.1.0 - - - org.scala-tools - javautils - 2.7.4-0.1 - - - - - org.codehaus.jackson - jackson-core-asl - 1.1.0 - - - org.codehaus.jackson - jackson-mapper-asl - 1.1.0 - - - com.google.protobuf - protobuf-java - 2.1.0 - - - sbinary - sbinary - 0.3 - - - com.twitter - scala-json - 1.0 - - - - - com.mongodb - mongo - 0.6 - - - - - org.apache.cassandra - cassandra - 0.4.0-trunk - - - com.facebook - thrift - 1.0 - - - com.facebook - fb303 - 1.0 - - - commons-pool - commons-pool - 1.5.1 - - - - - com.sun.grizzly - grizzly-comet-webserver - 1.8.6.3 - - - com.sun.jersey - jersey-server - 1.1.1-ea - - - com.sun.jersey - jersey-json - 1.1.1-ea - - - javax.ws.rs - jsr311-api - 1.0 - - - com.sun.jersey.contribs - jersey-scala - 1.1.2-ea-SNAPSHOT - - - org.atmosphere - atmosphere-core - 0.3 - - - org.atmosphere - atmosphere-portable-runtime - 0.3 - - - org.atmosphere - atmosphere-compat - 0.3 - - - - - org.slf4j - slf4j-log4j12 - 1.4.3 - - - org.slf4j - slf4j-api - 1.4.3 - - - log4j - log4j - 1.2.13 - - - commons-logging - commons-logging - 1.0.4 - - - - - org.scala-tools.testing - scalatest - 0.9.5 - test - - - junit - junit - 4.5 - test - - - - - - - maven-assembly-plugin - 2.2-beta-2 - - - create-executable-jar - install - - single - - - - - jar-with-dependencies - - - - - se.scalablesolutions.akka.kernel.Kernel - - - - - - - - maven-antrun-plugin - - - install - - - - - - - run - - - - - - - - false - ../config - - akka.conf - akka-reference.conf - - - - false - src/main/resources - - META-INF/* - - - - - + + 4.0.0 + + akka-kernel + Akka Kernel Module + + jar + + + akka + se.scalablesolutions.akka + 0.6 + ../pom.xml + + + + + + akka-util-java + se.scalablesolutions.akka + 0.6 + + + org.scala-lang + scala-library + 2.7.5 + + + org.codehaus.aspectwerkz + aspectwerkz-nodeps-jdk5 + 2.1 + + + org.codehaus.aspectwerkz + aspectwerkz-jdk5 + 2.1 + + + com.twitter + scala-stats + 1.0 + + + net.lag + configgy + 1.3 + + + org.guiceyfruit + guice-core + 2.0-beta-4 + + + org.apache.camel + camel-core + 2.0-SNAPSHOT + + + org.jboss.netty + netty + 3.1.0.GA + + + org.apache + zookeeper + 3.1.0 + + + org.scala-tools + javautils + 2.7.4-0.1 + + + + + org.codehaus.jackson + jackson-core-asl + 1.1.0 + + + org.codehaus.jackson + jackson-mapper-asl + 1.1.0 + + + com.google.protobuf + protobuf-java + 2.1.0 + + + sbinary + sbinary + 0.3 + + + com.twitter + scala-json + 1.0 + + + dispatch.json + dispatch-json + 0.5.2 + + + dispatch.http + dispatch-http + 0.5.2 + + + sjson.json + sjson + 0.1 + + + + + + com.mongodb + mongo + 0.6 + + + + + org.apache.cassandra + cassandra + 0.4.0-trunk + + + com.facebook + thrift + 1.0 + + + com.facebook + fb303 + 1.0 + + + commons-pool + commons-pool + 1.5.1 + + + + + com.sun.grizzly + grizzly-comet-webserver + 1.8.6.3 + + + com.sun.jersey + jersey-server + 1.1.1-ea + + + com.sun.jersey + jersey-json + 1.1.1-ea + + + javax.ws.rs + jsr311-api + 1.0 + + + com.sun.jersey.contribs + jersey-scala + 1.1.2-ea-SNAPSHOT + + + org.atmosphere + atmosphere-core + 0.3 + + + org.atmosphere + atmosphere-portable-runtime + 0.3 + + + org.atmosphere + atmosphere-compat + 0.3 + + + + + org.slf4j + slf4j-log4j12 + 1.4.3 + + + org.slf4j + slf4j-api + 1.4.3 + + + log4j + log4j + 1.2.13 + + + commons-logging + commons-logging + 1.0.4 + + + + + org.scala-tools.testing + scalatest + 0.9.5 + test + + + junit + junit + 4.5 + test + + + + + + + maven-assembly-plugin + 2.2-beta-2 + + + create-executable-jar + install + + single + + + + + jar-with-dependencies + + + + + se.scalablesolutions.akka.kernel.Kernel + + + + + + + + maven-antrun-plugin + + + install + + + + + + + run + + + + + + + + false + ../config + + akka.conf + akka-reference.conf + + + + false + src/main/resources + + META-INF/* + + + + + diff --git a/kernel/src/main/scala/state/MongoStorage.scala b/kernel/src/main/scala/state/MongoStorage.scala index f72e1c7771..bfb2e1dd49 100644 --- a/kernel/src/main/scala/state/MongoStorage.scala +++ b/kernel/src/main/scala/state/MongoStorage.scala @@ -1,291 +1,290 @@ -package se.scalablesolutions.akka.kernel.state - -import com.mongodb._ -import se.scalablesolutions.akka.kernel.util.Logging -import serialization.{Serializer} -import kernel.Kernel.config - -import java.util.{Map=>JMap, List=>JList, ArrayList=>JArrayList} - -/** - * A module for supporting MongoDB based persistence. - *

    - * The module offers functionality for: - *

  1. Persistent Maps
  2. - *
  3. Persistent Vectors
  4. - *
  5. Persistent Refs
  6. - *

    - * @author Debasish Ghosh - */ -object MongoStorage extends MapStorage - with VectorStorage with RefStorage with Logging { - - // enrich with null safe findOne - class RichDBCollection(value: DBCollection) { - def findOneNS(o: DBObject): Option[DBObject] = { - value.findOne(o) match { - case null => None - case x => Some(x) - } - } - } - - implicit def enrichDBCollection(c: DBCollection) = new RichDBCollection(c) - - val KEY = "key" - val VALUE = "value" - val COLLECTION = "akka_coll" - val MONGODB_SERVER_HOSTNAME = - config.getString("akka.storage.mongodb.hostname", "127.0.0.1") - val MONGODB_SERVER_DBNAME = - config.getString("akka.storage.mongodb.dbname", "testdb") - val MONGODB_SERVER_PORT = - config.getInt("akka.storage.mongodb.port", 27017) - - val db = new Mongo(MONGODB_SERVER_HOSTNAME, - MONGODB_SERVER_PORT, MONGODB_SERVER_DBNAME) - val coll = db.getCollection(COLLECTION) - - // @fixme: make this pluggable - private[this] val serializer: Serializer = Serializer.ScalaJSON - - override def insertMapStorageEntryFor(name: String, - key: AnyRef, value: AnyRef) { - insertMapStorageEntriesFor(name, List((key, value))) - } - - override def insertMapStorageEntriesFor(name: String, - entries: List[Tuple2[AnyRef, AnyRef]]) { - import java.util.{Map, HashMap} - - val m: Map[AnyRef, AnyRef] = new HashMap - for ((k, v) <- entries) { - m.put(k, serializer.out(v)) - } - - nullSafeFindOne(name) match { - case None => - coll.insert(new BasicDBObject().append(KEY, name).append(VALUE, m)) - case Some(dbo) => { - // collate the maps - val o = dbo.get(VALUE).asInstanceOf[Map[AnyRef, AnyRef]] - o.putAll(m) - - // remove existing reference - removeMapStorageFor(name) - // and insert - coll.insert(new BasicDBObject().append(KEY, name).append(VALUE, o)) - } - } - } - - override def removeMapStorageFor(name: String) = { - val q = new BasicDBObject - q.put(KEY, name) - coll.remove(q) - } - - override def removeMapStorageFor(name: String, key: AnyRef) = { - nullSafeFindOne(name) match { - case None => - case Some(dbo) => { - val orig = dbo.get(VALUE).asInstanceOf[DBObject].toMap - orig.remove(key.asInstanceOf[String]) - - // remove existing reference - removeMapStorageFor(name) - // and insert - coll.insert(new BasicDBObject().append(KEY, name).append(VALUE, orig)) - } - } - } - - override def getMapStorageEntryFor(name: String, - key: AnyRef): Option[AnyRef] = { - getValueForKey(name, key.asInstanceOf[String]) - } - - override def getMapStorageSizeFor(name: String): Int = { - nullSafeFindOne(name) match { - case None => 0 - case Some(dbo) => - dbo.get(VALUE).asInstanceOf[JMap[String, AnyRef]].keySet.size - } - } - - override def getMapStorageFor(name: String): List[Tuple2[AnyRef, AnyRef]] = { - val m = - nullSafeFindOne(name) match { - case None => - throw new Predef.NoSuchElementException(name + " not present") - case Some(dbo) => - dbo.get(VALUE).asInstanceOf[JMap[String, AnyRef]] - } - val n = - List(m.keySet.toArray: _*).asInstanceOf[List[String]] - val vals = - for(s <- n) - yield (s, serializer.in(m.get(s).asInstanceOf[Array[Byte]], None)) - vals.asInstanceOf[List[Tuple2[String, AnyRef]]] - } - - override def getMapStorageRangeFor(name: String, start: Option[AnyRef], - finish: Option[AnyRef], - count: Int): List[Tuple2[AnyRef, AnyRef]] = { - val m = - nullSafeFindOne(name) match { - case None => - throw new Predef.NoSuchElementException(name + " not present") - case Some(dbo) => - dbo.get(VALUE).asInstanceOf[JMap[String, AnyRef]] - } - - /** - * count is the max number of results to return. Start with - * start or 0 (if start is not defined) and go until - * you hit finish or count. - */ - val s = if (start.isDefined) start.get.asInstanceOf[Int] else 0 - val cnt = - if (finish.isDefined) { - val f = finish.get.asInstanceOf[Int] - if (f >= s) Math.min(count, (f - s)) else count - } - else count - - val n = - List(m.keySet.toArray: _*).asInstanceOf[List[String]].sort((e1, e2) => (e1 compareTo e2) < 0).slice(s, s + cnt) - val vals = - for(s <- n) - yield (s, serializer.in(m.get(s).asInstanceOf[Array[Byte]], None)) - vals.asInstanceOf[List[Tuple2[String, AnyRef]]] - } - - private def getValueForKey(name: String, key: String): Option[AnyRef] = { - try { - nullSafeFindOne(name) match { - case None => None - case Some(dbo) => - Some(serializer.in( - dbo.get(VALUE) - .asInstanceOf[JMap[String, AnyRef]] - .get(key).asInstanceOf[Array[Byte]], None)) - } - } catch { - case e => - throw new Predef.NoSuchElementException(e.getMessage) - } - } - - override def insertVectorStorageEntriesFor(name: String, elements: List[AnyRef]) = { - val q = new BasicDBObject - q.put(KEY, name) - - val currentList = - coll.findOneNS(q) match { - case None => - new JArrayList[AnyRef] - case Some(dbo) => - dbo.get(VALUE).asInstanceOf[JArrayList[AnyRef]] - } - if (!currentList.isEmpty) { - // record exists - // remove before adding - coll.remove(q) - } - - // add to the current list - elements.map(serializer.out(_)).foreach(currentList.add(_)) - - coll.insert( - new BasicDBObject() - .append(KEY, name) - .append(VALUE, currentList) - ) - } - - override def insertVectorStorageEntryFor(name: String, element: AnyRef) = { - insertVectorStorageEntriesFor(name, List(element)) - } - - override def getVectorStorageEntryFor(name: String, index: Int): AnyRef = { - try { - val o = - nullSafeFindOne(name) match { - case None => - throw new Predef.NoSuchElementException(name + " not present") - - case Some(dbo) => - dbo.get(VALUE).asInstanceOf[JList[AnyRef]] - } - serializer.in( - o.get(index).asInstanceOf[Array[Byte]], - None - ) - } catch { - case e => - throw new Predef.NoSuchElementException(e.getMessage) - } - } - - override def getVectorStorageRangeFor(name: String, - start: Option[Int], finish: Option[Int], count: Int): List[AnyRef] = { - try { - val o = - nullSafeFindOne(name) match { - case None => - throw new Predef.NoSuchElementException(name + " not present") - - case Some(dbo) => - dbo.get(VALUE).asInstanceOf[JList[AnyRef]] - } - - // pick the subrange and make a Scala list - val l = - List(o.subList(start.get, start.get + count).toArray: _*) - - for(e <- l) - yield serializer.in(e.asInstanceOf[Array[Byte]], None) - } catch { - case e => - throw new Predef.NoSuchElementException(e.getMessage) - } - } - - override def getVectorStorageSizeFor(name: String): Int = { - nullSafeFindOne(name) match { - case None => 0 - case Some(dbo) => - dbo.get(VALUE).asInstanceOf[JList[AnyRef]].size - } - } - - private def nullSafeFindOne(name: String): Option[DBObject] = { - val o = new BasicDBObject - o.put(KEY, name) - coll.findOneNS(o) - } - - override def insertRefStorageFor(name: String, element: AnyRef) = { - nullSafeFindOne(name) match { - case None => - case Some(dbo) => { - val q = new BasicDBObject - q.put(KEY, name) - coll.remove(q) - } - } - coll.insert( - new BasicDBObject() - .append(KEY, name) - .append(VALUE, serializer.out(element))) - } - - override def getRefStorageFor(name: String): Option[AnyRef] = { - nullSafeFindOne(name) match { - case None => None - case Some(dbo) => - Some(serializer.in(dbo.get(VALUE).asInstanceOf[Array[Byte]], None)) - } - } -} +package se.scalablesolutions.akka.kernel.state + +import com.mongodb._ +import se.scalablesolutions.akka.kernel.util.Logging +import serialization.{Serializer} +import kernel.Kernel.config +import sjson.json.Serializer._ + +import java.util.{Map=>JMap, List=>JList, ArrayList=>JArrayList} + +/** + * A module for supporting MongoDB based persistence. + *

    + * The module offers functionality for: + *

  7. Persistent Maps
  8. + *
  9. Persistent Vectors
  10. + *
  11. Persistent Refs
  12. + *

    + * @author Debasish Ghosh + */ +object MongoStorage extends MapStorage + with VectorStorage with RefStorage with Logging { + + // enrich with null safe findOne + class RichDBCollection(value: DBCollection) { + def findOneNS(o: DBObject): Option[DBObject] = { + value.findOne(o) match { + case null => None + case x => Some(x) + } + } + } + + implicit def enrichDBCollection(c: DBCollection) = new RichDBCollection(c) + + val KEY = "key" + val VALUE = "value" + val COLLECTION = "akka_coll" + val MONGODB_SERVER_HOSTNAME = + config.getString("akka.storage.mongodb.hostname", "127.0.0.1") + val MONGODB_SERVER_DBNAME = + config.getString("akka.storage.mongodb.dbname", "testdb") + val MONGODB_SERVER_PORT = + config.getInt("akka.storage.mongodb.port", 27017) + + val db = new Mongo(MONGODB_SERVER_HOSTNAME, + MONGODB_SERVER_PORT, MONGODB_SERVER_DBNAME) + val coll = db.getCollection(COLLECTION) + + // @fixme: make this pluggable + private[this] val serializer = SJSON + + override def insertMapStorageEntryFor(name: String, + key: AnyRef, value: AnyRef) { + insertMapStorageEntriesFor(name, List((key, value))) + } + + override def insertMapStorageEntriesFor(name: String, + entries: List[Tuple2[AnyRef, AnyRef]]) { + import java.util.{Map, HashMap} + + val m: Map[AnyRef, AnyRef] = new HashMap + for ((k, v) <- entries) { + m.put(k, serializer.out(v)) + } + + nullSafeFindOne(name) match { + case None => + coll.insert(new BasicDBObject().append(KEY, name).append(VALUE, m)) + case Some(dbo) => { + // collate the maps + val o = dbo.get(VALUE).asInstanceOf[Map[AnyRef, AnyRef]] + o.putAll(m) + + // remove existing reference + removeMapStorageFor(name) + // and insert + coll.insert(new BasicDBObject().append(KEY, name).append(VALUE, o)) + } + } + } + + override def removeMapStorageFor(name: String) = { + val q = new BasicDBObject + q.put(KEY, name) + coll.remove(q) + } + + override def removeMapStorageFor(name: String, key: AnyRef) = { + nullSafeFindOne(name) match { + case None => + case Some(dbo) => { + val orig = dbo.get(VALUE).asInstanceOf[DBObject].toMap + orig.remove(key.asInstanceOf[String]) + + // remove existing reference + removeMapStorageFor(name) + // and insert + coll.insert(new BasicDBObject().append(KEY, name).append(VALUE, orig)) + } + } + } + + override def getMapStorageEntryFor(name: String, + key: AnyRef): Option[AnyRef] = { + getValueForKey(name, key.asInstanceOf[String]) + } + + override def getMapStorageSizeFor(name: String): Int = { + nullSafeFindOne(name) match { + case None => 0 + case Some(dbo) => + dbo.get(VALUE).asInstanceOf[JMap[String, AnyRef]].keySet.size + } + } + + override def getMapStorageFor(name: String): List[Tuple2[AnyRef, AnyRef]] = { + val m = + nullSafeFindOne(name) match { + case None => + throw new Predef.NoSuchElementException(name + " not present") + case Some(dbo) => + dbo.get(VALUE).asInstanceOf[JMap[String, AnyRef]] + } + val n = + List(m.keySet.toArray: _*).asInstanceOf[List[String]] + val vals = + for(s <- n) + yield (s, serializer.in[AnyRef](m.get(s).asInstanceOf[Array[Byte]])) + vals.asInstanceOf[List[Tuple2[String, AnyRef]]] + } + + override def getMapStorageRangeFor(name: String, start: Option[AnyRef], + finish: Option[AnyRef], + count: Int): List[Tuple2[AnyRef, AnyRef]] = { + val m = + nullSafeFindOne(name) match { + case None => + throw new Predef.NoSuchElementException(name + " not present") + case Some(dbo) => + dbo.get(VALUE).asInstanceOf[JMap[String, AnyRef]] + } + + /** + * count is the max number of results to return. Start with + * start or 0 (if start is not defined) and go until + * you hit finish or count. + */ + val s = if (start.isDefined) start.get.asInstanceOf[Int] else 0 + val cnt = + if (finish.isDefined) { + val f = finish.get.asInstanceOf[Int] + if (f >= s) Math.min(count, (f - s)) else count + } + else count + + val n = + List(m.keySet.toArray: _*).asInstanceOf[List[String]].sort((e1, e2) => (e1 compareTo e2) < 0).slice(s, s + cnt) + val vals = + for(s <- n) + yield (s, serializer.in[AnyRef](m.get(s).asInstanceOf[Array[Byte]])) + vals.asInstanceOf[List[Tuple2[String, AnyRef]]] + } + + private def getValueForKey(name: String, key: String): Option[AnyRef] = { + try { + nullSafeFindOne(name) match { + case None => None + case Some(dbo) => + Some(serializer.in[AnyRef]( + dbo.get(VALUE) + .asInstanceOf[JMap[String, AnyRef]] + .get(key).asInstanceOf[Array[Byte]])) + } + } catch { + case e => + throw new Predef.NoSuchElementException(e.getMessage) + } + } + + override def insertVectorStorageEntriesFor(name: String, elements: List[AnyRef]) = { + val q = new BasicDBObject + q.put(KEY, name) + + val currentList = + coll.findOneNS(q) match { + case None => + new JArrayList[AnyRef] + case Some(dbo) => + dbo.get(VALUE).asInstanceOf[JArrayList[AnyRef]] + } + if (!currentList.isEmpty) { + // record exists + // remove before adding + coll.remove(q) + } + + // add to the current list + elements.map(serializer.out(_)).foreach(currentList.add(_)) + + coll.insert( + new BasicDBObject() + .append(KEY, name) + .append(VALUE, currentList) + ) + } + + override def insertVectorStorageEntryFor(name: String, element: AnyRef) = { + insertVectorStorageEntriesFor(name, List(element)) + } + + override def getVectorStorageEntryFor(name: String, index: Int): AnyRef = { + try { + val o = + nullSafeFindOne(name) match { + case None => + throw new Predef.NoSuchElementException(name + " not present") + + case Some(dbo) => + dbo.get(VALUE).asInstanceOf[JList[AnyRef]] + } + serializer.in[AnyRef]( + o.get(index).asInstanceOf[Array[Byte]]) + } catch { + case e => + throw new Predef.NoSuchElementException(e.getMessage) + } + } + + override def getVectorStorageRangeFor(name: String, + start: Option[Int], finish: Option[Int], count: Int): List[AnyRef] = { + try { + val o = + nullSafeFindOne(name) match { + case None => + throw new Predef.NoSuchElementException(name + " not present") + + case Some(dbo) => + dbo.get(VALUE).asInstanceOf[JList[AnyRef]] + } + + // pick the subrange and make a Scala list + val l = + List(o.subList(start.get, start.get + count).toArray: _*) + + for(e <- l) + yield serializer.in[AnyRef](e.asInstanceOf[Array[Byte]]) + } catch { + case e => + throw new Predef.NoSuchElementException(e.getMessage) + } + } + + override def getVectorStorageSizeFor(name: String): Int = { + nullSafeFindOne(name) match { + case None => 0 + case Some(dbo) => + dbo.get(VALUE).asInstanceOf[JList[AnyRef]].size + } + } + + private def nullSafeFindOne(name: String): Option[DBObject] = { + val o = new BasicDBObject + o.put(KEY, name) + coll.findOneNS(o) + } + + override def insertRefStorageFor(name: String, element: AnyRef) = { + nullSafeFindOne(name) match { + case None => + case Some(dbo) => { + val q = new BasicDBObject + q.put(KEY, name) + coll.remove(q) + } + } + coll.insert( + new BasicDBObject() + .append(KEY, name) + .append(VALUE, serializer.out(element))) + } + + override def getRefStorageFor(name: String): Option[AnyRef] = { + nullSafeFindOne(name) match { + case None => None + case Some(dbo) => + Some(serializer.in[AnyRef](dbo.get(VALUE).asInstanceOf[Array[Byte]])) + } + } +} diff --git a/kernel/src/test/scala/MongoPersistentActorSpec.scala b/kernel/src/test/scala/MongoPersistentActorSpec.scala index eb5e04c85e..be0b1c320c 100644 --- a/kernel/src/test/scala/MongoPersistentActorSpec.scala +++ b/kernel/src/test/scala/MongoPersistentActorSpec.scala @@ -4,6 +4,8 @@ package se.scalablesolutions.akka.kernel.actor import junit.framework.TestCase import org.junit.{Test, Before} import org.junit.Assert._ +import dispatch.json._ +import dispatch.json.Js._ import kernel.state.{MongoStorageConfig, TransactionalState} @@ -45,7 +47,10 @@ class BankAccountActor extends Actor { val m: BigInt = accountState.get(accountNo) match { case None => 0 - case Some(v) => BigInt(v.asInstanceOf[String]) + case Some(v) => { + val JsNumber(n) = v.asInstanceOf[JsValue] + BigInt(n.toString) + } } accountState.put(accountNo, (m - amount)) if (amount > m) @@ -75,7 +80,10 @@ class BankAccountActor extends Actor { val m: BigInt = accountState.get(accountNo) match { case None => 0 - case Some(v) => BigInt(v.asInstanceOf[String]) + case Some(v) => { + val JsNumber(n) = v.asInstanceOf[JsValue] + BigInt(n.toString) + } } accountState.put(accountNo, (m + amount)) reply(m + amount) @@ -84,14 +92,6 @@ class BankAccountActor extends Actor { reply(txnLog.length.asInstanceOf[AnyRef]) } } -/* -@serializable class PersistentFailerActor extends Actor { - makeTransactionRequired - def receive: PartialFunction[Any, Unit] = { - case "Failure" => - throw new RuntimeException("expected") - } -}*/ class MongoPersistentActorSpec extends TestCase { @Test @@ -102,16 +102,19 @@ class MongoPersistentActorSpec extends TestCase { failer.start bactor !! Credit("a-123", 5000) bactor !! Debit("a-123", 3000, failer) - assertEquals(BigInt(2000), - BigInt((bactor !! Balance("a-123")).get.asInstanceOf[String])) + val b = (bactor !! Balance("a-123")).get.asInstanceOf[JsValue] + val JsNumber(n) = b + assertEquals(BigInt(2000), BigInt(n.toString)) bactor !! Credit("a-123", 7000) - assertEquals(BigInt(9000), - BigInt((bactor !! Balance("a-123")).get.asInstanceOf[String])) + val b1 = (bactor !! Balance("a-123")).get.asInstanceOf[JsValue] + val JsNumber(n1) = b1 + assertEquals(BigInt(9000), BigInt(n1.toString)) bactor !! Debit("a-123", 8000, failer) - assertEquals(BigInt(1000), - BigInt((bactor !! Balance("a-123")).get.asInstanceOf[String])) + val b2 = (bactor !! Balance("a-123")).get.asInstanceOf[JsValue] + val JsNumber(n2) = b2 + assertEquals(BigInt(1000), BigInt(n2.toString)) assertEquals(7, (bactor !! LogSize).get) } @@ -120,8 +123,10 @@ class MongoPersistentActorSpec extends TestCase { val bactor = new BankAccountActor bactor.start bactor !! Credit("a-123", 5000) - assertEquals(BigInt(5000), - BigInt((bactor !! Balance("a-123")).get.asInstanceOf[String])) + + val b = (bactor !! Balance("a-123")).get.asInstanceOf[JsValue] + val JsNumber(n) = b + assertEquals(BigInt(5000), BigInt(n.toString)) val failer = new PersistentFailerActor failer.start @@ -130,8 +135,9 @@ class MongoPersistentActorSpec extends TestCase { fail("should throw exception") } catch { case e: RuntimeException => {}} - assertEquals(BigInt(5000), - BigInt((bactor !! Balance("a-123")).get.asInstanceOf[String])) + val b1 = (bactor !! Balance("a-123")).get.asInstanceOf[JsValue] + val JsNumber(n1) = b1 + assertEquals(BigInt(5000), BigInt(n1.toString)) // should not count the failed one assertEquals(3, (bactor !! LogSize).get) @@ -142,8 +148,9 @@ class MongoPersistentActorSpec extends TestCase { val bactor = new BankAccountActor bactor.start bactor !! Credit("a-123", 5000) - assertEquals(BigInt(5000), - BigInt((bactor !! Balance("a-123")).get.asInstanceOf[String])) + val b = (bactor !! Balance("a-123")).get.asInstanceOf[JsValue] + val JsNumber(n) = b + assertEquals(BigInt(5000), BigInt(n.toString)) val failer = new PersistentFailerActor failer.start @@ -152,8 +159,9 @@ class MongoPersistentActorSpec extends TestCase { fail("should throw exception") } catch { case e: RuntimeException => {}} - assertEquals(BigInt(5000), - BigInt((bactor !! Balance("a-123")).get.asInstanceOf[String])) + val b1 = (bactor !! Balance("a-123")).get.asInstanceOf[JsValue] + val JsNumber(n1) = b1 + assertEquals(BigInt(5000), BigInt(n1.toString)) // should not count the failed one assertEquals(3, (bactor !! LogSize).get) diff --git a/kernel/src/test/scala/MongoStorageSpec.scala b/kernel/src/test/scala/MongoStorageSpec.scala index c80afb00a7..07f7a21bf0 100644 --- a/kernel/src/test/scala/MongoStorageSpec.scala +++ b/kernel/src/test/scala/MongoStorageSpec.scala @@ -1,306 +1,337 @@ -package se.scalablesolutions.akka.kernel.state - -import junit.framework.TestCase - -import org.junit.{Test, Before} -import org.junit.Assert._ - -class MongoStorageSpec extends TestCase { - - val changeSetV = new scala.collection.mutable.ArrayBuffer[AnyRef] - val changeSetM = new scala.collection.mutable.HashMap[AnyRef, AnyRef] - - override def setUp = { - MongoStorage.coll.drop - } - - @Test - def testVectorInsertForTransactionId = { - changeSetV += "debasish" // string - changeSetV += List(1, 2, 3) // Scala List - changeSetV += List(100, 200) - MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) - assertEquals( - 3, - MongoStorage.getVectorStorageSizeFor("U-A1")) - changeSetV.clear - - // changeSetV should be reinitialized - changeSetV += List(12, 23, 45) - changeSetV += "maulindu" - MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) - assertEquals( - 5, - MongoStorage.getVectorStorageSizeFor("U-A1")) - - // add more to the same changeSetV - changeSetV += "ramanendu" - changeSetV += Map(1 -> "dg", 2 -> "mc") - - // add for a diff transaction - MongoStorage.insertVectorStorageEntriesFor("U-A2", changeSetV.toList) - assertEquals( - 4, - MongoStorage.getVectorStorageSizeFor("U-A2")) - - // previous transaction change set should remain same - assertEquals( - 5, - MongoStorage.getVectorStorageSizeFor("U-A1")) - - // test single element entry - MongoStorage.insertVectorStorageEntryFor("U-A1", Map(1->1, 2->4, 3->9)) - assertEquals( - 6, - MongoStorage.getVectorStorageSizeFor("U-A1")) - } - - @Test - def testVectorFetchForKeys = { - - // initially everything 0 - assertEquals( - 0, - MongoStorage.getVectorStorageSizeFor("U-A2")) - - assertEquals( - 0, - MongoStorage.getVectorStorageSizeFor("U-A1")) - - // get some stuff - changeSetV += "debasish" - changeSetV += List(12, 13, 14) - MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) - - assertEquals( - 2, - MongoStorage.getVectorStorageSizeFor("U-A1")) - - assertEquals( - "debasish", - MongoStorage.getVectorStorageEntryFor("U-A1", 0).asInstanceOf[String]) - - assertEquals( - List(12, 13, 14), - MongoStorage.getVectorStorageEntryFor("U-A1", 1).asInstanceOf[List[Int]]) - - changeSetV.clear - changeSetV += Map(1->1, 2->4, 3->9) - changeSetV += BigInt(2310) - changeSetV += List(100, 200, 300) - MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) - - assertEquals( - 5, - MongoStorage.getVectorStorageSizeFor("U-A1")) - - val r = - MongoStorage.getVectorStorageRangeFor("U-A1", Some(1), None, 3) - - assertEquals(3, r.size) - assertEquals(List(12, 13, 14), r(0).asInstanceOf[List[Int]]) - } - - @Test - def testVectorFetchForNonExistentKeys = { - try { - MongoStorage.getVectorStorageEntryFor("U-A1", 1) - fail("should throw an exception") - } catch {case e: Predef.NoSuchElementException => {}} - - try { - MongoStorage.getVectorStorageRangeFor("U-A1", Some(2), None, 12) - fail("should throw an exception") - } catch {case e: Predef.NoSuchElementException => {}} - } - - @Test - def testMapInsertForTransactionId = { - case class Foo(no: Int, name: String) - fillMap - - // add some more to changeSet - changeSetM += "5" -> Foo(12, "dg") - changeSetM += "6" -> java.util.Calendar.getInstance.getTime - - // insert all into Mongo - MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) - assertEquals( - 6, - MongoStorage.getMapStorageSizeFor("U-M1")) - - // individual insert api - MongoStorage.insertMapStorageEntryFor("U-M1", "7", "akka") - MongoStorage.insertMapStorageEntryFor("U-M1", "8", List(23, 25)) - assertEquals( - 8, - MongoStorage.getMapStorageSizeFor("U-M1")) - - // add the same changeSet for another transaction - MongoStorage.insertMapStorageEntriesFor("U-M2", changeSetM.toList) - assertEquals( - 6, - MongoStorage.getMapStorageSizeFor("U-M2")) - - // the first transaction should remain the same - assertEquals( - 8, - MongoStorage.getMapStorageSizeFor("U-M1")) - changeSetM.clear - } - - @Test - def testMapContents = { - fillMap - MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) - MongoStorage.getMapStorageEntryFor("U-M1", "2") match { - case Some(x) => assertEquals("peter", x.asInstanceOf[String]) - case None => fail("should fetch peter") - } - MongoStorage.getMapStorageEntryFor("U-M1", "4") match { - case Some(x) => assertEquals(3, x.asInstanceOf[List[Int]].size) - case None => fail("should fetch list") - } - MongoStorage.getMapStorageEntryFor("U-M1", "3") match { - case Some(x) => assertEquals(2, x.asInstanceOf[List[Int]].size) - case None => fail("should fetch list") - } - - // get the entire map - val l: List[Tuple2[AnyRef, AnyRef]] = - MongoStorage.getMapStorageFor("U-M1") - - assertEquals(4, l.size) - assertTrue(l.map(_._1).contains("1")) - assertTrue(l.map(_._1).contains("2")) - assertTrue(l.map(_._1).contains("3")) - assertTrue(l.map(_._1).contains("4")) - - assertTrue(l.map(_._2).contains("john")) - - // trying to fetch for a non-existent transaction will throw - try { - MongoStorage.getMapStorageFor("U-M2") - fail("should throw an exception") - } catch {case e: Predef.NoSuchElementException => {}} - - changeSetM.clear - } - - @Test - def testMapContentsByRange = { - fillMap - changeSetM += "5" -> Map(1 -> "dg", 2 -> "mc") - MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) - - // specify start and count - val l: List[Tuple2[AnyRef, AnyRef]] = - MongoStorage.getMapStorageRangeFor( - "U-M1", Some(Integer.valueOf(2)), None, 3) - - assertEquals(3, l.size) - assertEquals("3", l(0)._1.asInstanceOf[String]) - assertEquals(List(100, 200), l(0)._2.asInstanceOf[List[Int]]) - assertEquals("4", l(1)._1.asInstanceOf[String]) - assertEquals(List(10, 20, 30), l(1)._2.asInstanceOf[List[Int]]) - - // specify start, finish and count where finish - start == count - assertEquals(3, - MongoStorage.getMapStorageRangeFor( - "U-M1", Some(Integer.valueOf(2)), Some(Integer.valueOf(5)), 3).size) - - // specify start, finish and count where finish - start > count - assertEquals(3, - MongoStorage.getMapStorageRangeFor( - "U-M1", Some(Integer.valueOf(2)), Some(Integer.valueOf(9)), 3).size) - - // do not specify start or finish - assertEquals(3, - MongoStorage.getMapStorageRangeFor( - "U-M1", None, None, 3).size) - - // specify finish and count - assertEquals(3, - MongoStorage.getMapStorageRangeFor( - "U-M1", None, Some(Integer.valueOf(3)), 3).size) - - // specify start, finish and count where finish < start - assertEquals(3, - MongoStorage.getMapStorageRangeFor( - "U-M1", Some(Integer.valueOf(2)), Some(Integer.valueOf(1)), 3).size) - - changeSetM.clear - } - - @Test - def testMapStorageRemove = { - fillMap - changeSetM += "5" -> Map(1 -> "dg", 2 -> "mc") - - MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) - assertEquals(5, - MongoStorage.getMapStorageSizeFor("U-M1")) - - // remove key "3" - MongoStorage.removeMapStorageFor("U-M1", "3") - assertEquals(4, - MongoStorage.getMapStorageSizeFor("U-M1")) - - try { - MongoStorage.getMapStorageEntryFor("U-M1", "3") - fail("should throw exception") - } catch { case e => {}} - - // remove the whole stuff - MongoStorage.removeMapStorageFor("U-M1") - - try { - MongoStorage.getMapStorageFor("U-M1") - fail("should throw exception") - } catch { case e: NoSuchElementException => {}} - - changeSetM.clear - } - - private def fillMap = { - changeSetM += "1" -> "john" - changeSetM += "2" -> "peter" - changeSetM += "3" -> List(100, 200) - changeSetM += "4" -> List(10, 20, 30) - changeSetM - } - - @Test - def testRefStorage = { - MongoStorage.getRefStorageFor("U-R1") match { - case None => - case Some(o) => fail("should be None") - } - - val m = Map("1"->1, "2"->4, "3"->9) - MongoStorage.insertRefStorageFor("U-R1", m) - MongoStorage.getRefStorageFor("U-R1") match { - case None => fail("should not be empty") - case Some(r) => { - val a = r.asInstanceOf[Map[String, Int]] - assertEquals(a.size, 3) - assertEquals(a.get("1").get, 1) - assertEquals(a.get("2").get, 4) - assertEquals(a.get("3").get, 9) - } - } - - // insert another one - // the previous one should be replaced - val b = List("100", "jonas") - MongoStorage.insertRefStorageFor("U-R1", b) - MongoStorage.getRefStorageFor("U-R1") match { - case None => fail("should not be empty") - case Some(r) => { - val a = r.asInstanceOf[List[String]] - assertEquals("100", a(0)) - assertEquals("jonas", a(1)) - } - } - } -} +package se.scalablesolutions.akka.kernel.state + +import junit.framework.TestCase + +import org.junit.{Test, Before} +import org.junit.Assert._ +import dispatch.json._ +import dispatch.json.Js._ + +class MongoStorageSpec extends TestCase { + + val changeSetV = new scala.collection.mutable.ArrayBuffer[AnyRef] + val changeSetM = new scala.collection.mutable.HashMap[AnyRef, AnyRef] + + override def setUp = { + MongoStorage.coll.drop + } + + @Test + def testVectorInsertForTransactionId = { + changeSetV += "debasish" // string + changeSetV += List(1, 2, 3) // Scala List + changeSetV += List(100, 200) + MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) + assertEquals( + 3, + MongoStorage.getVectorStorageSizeFor("U-A1")) + changeSetV.clear + + // changeSetV should be reinitialized + changeSetV += List(12, 23, 45) + changeSetV += "maulindu" + MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) + assertEquals( + 5, + MongoStorage.getVectorStorageSizeFor("U-A1")) + + // add more to the same changeSetV + changeSetV += "ramanendu" + changeSetV += Map(1 -> "dg", 2 -> "mc") + + // add for a diff transaction + MongoStorage.insertVectorStorageEntriesFor("U-A2", changeSetV.toList) + assertEquals( + 4, + MongoStorage.getVectorStorageSizeFor("U-A2")) + + // previous transaction change set should remain same + assertEquals( + 5, + MongoStorage.getVectorStorageSizeFor("U-A1")) + + // test single element entry + MongoStorage.insertVectorStorageEntryFor("U-A1", Map(1->1, 2->4, 3->9)) + assertEquals( + 6, + MongoStorage.getVectorStorageSizeFor("U-A1")) + } + + @Test + def testVectorFetchForKeys = { + + // initially everything 0 + assertEquals( + 0, + MongoStorage.getVectorStorageSizeFor("U-A2")) + + assertEquals( + 0, + MongoStorage.getVectorStorageSizeFor("U-A1")) + + // get some stuff + changeSetV += "debasish" + changeSetV += List(BigDecimal(12), BigDecimal(13), BigDecimal(14)) + MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) + + assertEquals( + 2, + MongoStorage.getVectorStorageSizeFor("U-A1")) + + val JsString(str) = MongoStorage.getVectorStorageEntryFor("U-A1", 0).asInstanceOf[JsString] + assertEquals("debasish", str) + + import dispatch.json.Js._ + + val l = MongoStorage.getVectorStorageEntryFor("U-A1", 1).asInstanceOf[JsValue] + val num_list = list ! num + val num_list(l0) = l + assertEquals(List(12, 13, 14), l0) + + changeSetV.clear + changeSetV += Map(1->1, 2->4, 3->9) + changeSetV += BigInt(2310) + changeSetV += List(100, 200, 300) + MongoStorage.insertVectorStorageEntriesFor("U-A1", changeSetV.toList) + + assertEquals( + 5, + MongoStorage.getVectorStorageSizeFor("U-A1")) + + val r = + MongoStorage.getVectorStorageRangeFor("U-A1", Some(1), None, 3) + + assertEquals(3, r.size) + val lr = r(0).asInstanceOf[JsValue] + val num_list(l1) = lr + assertEquals(List(12, 13, 14), l1) + } + + @Test + def testVectorFetchForNonExistentKeys = { + try { + MongoStorage.getVectorStorageEntryFor("U-A1", 1) + fail("should throw an exception") + } catch {case e: Predef.NoSuchElementException => {}} + + try { + MongoStorage.getVectorStorageRangeFor("U-A1", Some(2), None, 12) + fail("should throw an exception") + } catch {case e: Predef.NoSuchElementException => {}} + } + + @Test + def testMapInsertForTransactionId = { + case class Foo(no: Int, name: String) + fillMap + + // add some more to changeSet + changeSetM += "5" -> Foo(12, "dg") + changeSetM += "6" -> java.util.Calendar.getInstance.getTime + + // insert all into Mongo + MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) + assertEquals( + 6, + MongoStorage.getMapStorageSizeFor("U-M1")) + + // individual insert api + MongoStorage.insertMapStorageEntryFor("U-M1", "7", "akka") + MongoStorage.insertMapStorageEntryFor("U-M1", "8", List(23, 25)) + assertEquals( + 8, + MongoStorage.getMapStorageSizeFor("U-M1")) + + // add the same changeSet for another transaction + MongoStorage.insertMapStorageEntriesFor("U-M2", changeSetM.toList) + assertEquals( + 6, + MongoStorage.getMapStorageSizeFor("U-M2")) + + // the first transaction should remain the same + assertEquals( + 8, + MongoStorage.getMapStorageSizeFor("U-M1")) + changeSetM.clear + } + + @Test + def testMapContents = { + fillMap + MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) + MongoStorage.getMapStorageEntryFor("U-M1", "2") match { + case Some(x) => { + val JsString(str) = x.asInstanceOf[JsValue] + assertEquals("peter", str) + } + case None => fail("should fetch peter") + } + MongoStorage.getMapStorageEntryFor("U-M1", "4") match { + case Some(x) => { + val num_list = list ! num + val num_list(l0) = x.asInstanceOf[JsValue] + assertEquals(3, l0.size) + } + case None => fail("should fetch list") + } + MongoStorage.getMapStorageEntryFor("U-M1", "3") match { + case Some(x) => { + val num_list = list ! num + val num_list(l0) = x.asInstanceOf[JsValue] + assertEquals(2, l0.size) + } + case None => fail("should fetch list") + } + + // get the entire map + val l: List[Tuple2[AnyRef, AnyRef]] = + MongoStorage.getMapStorageFor("U-M1") + + assertEquals(4, l.size) + assertTrue(l.map(_._1).contains("1")) + assertTrue(l.map(_._1).contains("2")) + assertTrue(l.map(_._1).contains("3")) + assertTrue(l.map(_._1).contains("4")) + + val JsString(str) = l.filter(_._1 == "2").first._2 + assertEquals(str, "peter") + + // trying to fetch for a non-existent transaction will throw + try { + MongoStorage.getMapStorageFor("U-M2") + fail("should throw an exception") + } catch {case e: Predef.NoSuchElementException => {}} + + changeSetM.clear + } + + @Test + def testMapContentsByRange = { + fillMap + changeSetM += "5" -> Map(1 -> "dg", 2 -> "mc") + MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) + + // specify start and count + val l: List[Tuple2[AnyRef, AnyRef]] = + MongoStorage.getMapStorageRangeFor( + "U-M1", Some(Integer.valueOf(2)), None, 3) + + assertEquals(3, l.size) + assertEquals("3", l(0)._1.asInstanceOf[String]) + val lst = l(0)._2.asInstanceOf[JsValue] + val num_list = list ! num + val num_list(l0) = lst + assertEquals(List(100, 200), l0) + assertEquals("4", l(1)._1.asInstanceOf[String]) + val ls = l(1)._2.asInstanceOf[JsValue] + val num_list(l1) = ls + assertEquals(List(10, 20, 30), l1) + + // specify start, finish and count where finish - start == count + assertEquals(3, + MongoStorage.getMapStorageRangeFor( + "U-M1", Some(Integer.valueOf(2)), Some(Integer.valueOf(5)), 3).size) + + // specify start, finish and count where finish - start > count + assertEquals(3, + MongoStorage.getMapStorageRangeFor( + "U-M1", Some(Integer.valueOf(2)), Some(Integer.valueOf(9)), 3).size) + + // do not specify start or finish + assertEquals(3, + MongoStorage.getMapStorageRangeFor( + "U-M1", None, None, 3).size) + + // specify finish and count + assertEquals(3, + MongoStorage.getMapStorageRangeFor( + "U-M1", None, Some(Integer.valueOf(3)), 3).size) + + // specify start, finish and count where finish < start + assertEquals(3, + MongoStorage.getMapStorageRangeFor( + "U-M1", Some(Integer.valueOf(2)), Some(Integer.valueOf(1)), 3).size) + + changeSetM.clear + } + + @Test + def testMapStorageRemove = { + fillMap + changeSetM += "5" -> Map(1 -> "dg", 2 -> "mc") + + MongoStorage.insertMapStorageEntriesFor("U-M1", changeSetM.toList) + assertEquals(5, + MongoStorage.getMapStorageSizeFor("U-M1")) + + // remove key "3" + MongoStorage.removeMapStorageFor("U-M1", "3") + assertEquals(4, + MongoStorage.getMapStorageSizeFor("U-M1")) + + try { + MongoStorage.getMapStorageEntryFor("U-M1", "3") + fail("should throw exception") + } catch { case e => {}} + + // remove the whole stuff + MongoStorage.removeMapStorageFor("U-M1") + + try { + MongoStorage.getMapStorageFor("U-M1") + fail("should throw exception") + } catch { case e: NoSuchElementException => {}} + + changeSetM.clear + } + + private def fillMap = { + changeSetM += "1" -> "john" + changeSetM += "2" -> "peter" + changeSetM += "3" -> List(100, 200) + changeSetM += "4" -> List(10, 20, 30) + changeSetM + } + + @Test + def testRefStorage = { + MongoStorage.getRefStorageFor("U-R1") match { + case None => + case Some(o) => fail("should be None") + } + + val m = Map("1"->1, "2"->4, "3"->9) + MongoStorage.insertRefStorageFor("U-R1", m) + MongoStorage.getRefStorageFor("U-R1") match { + case None => fail("should not be empty") + case Some(r) => { + val a = r.asInstanceOf[JsValue] + val m1 = Symbol("1") ? num + val m2 = Symbol("2") ? num + val m3 = Symbol("3") ? num + + val m1(n1) = a + val m2(n2) = a + val m3(n3) = a + + assertEquals(n1, 1) + assertEquals(n2, 4) + assertEquals(n3, 9) + } + } + + // insert another one + // the previous one should be replaced + val b = List("100", "jonas") + MongoStorage.insertRefStorageFor("U-R1", b) + MongoStorage.getRefStorageFor("U-R1") match { + case None => fail("should not be empty") + case Some(r) => { + val a = r.asInstanceOf[JsValue] + val str_lst = list ! str + val str_lst(l) = a + assertEquals(b, l) + } + } + } +} From 834d4439e59e661c837b9861276042e1a2c047b0 Mon Sep 17 00:00:00 2001 From: jboner Date: Fri, 28 Aug 2009 16:26:29 +0200 Subject: [PATCH 17/35] wrong version in pom --- akka-amqp/pom.xml | 2 +- akka-amqp/src/main/scala/AMQP.scala | 92 ++++++++++++++--------------- akka.iws | 85 ++++++++++++++++++++++---- 3 files changed, 119 insertions(+), 60 deletions(-) diff --git a/akka-amqp/pom.xml b/akka-amqp/pom.xml index 62792c17e9..5e67d7a046 100644 --- a/akka-amqp/pom.xml +++ b/akka-amqp/pom.xml @@ -18,7 +18,7 @@ akka-kernel se.scalablesolutions.akka - 0.5 + 0.6 com.rabbitmq diff --git a/akka-amqp/src/main/scala/AMQP.scala b/akka-amqp/src/main/scala/AMQP.scala index 7e46ca1b9f..a45472ea12 100644 --- a/akka-amqp/src/main/scala/AMQP.scala +++ b/akka-amqp/src/main/scala/AMQP.scala @@ -36,13 +36,12 @@ object AMQP { * @author Jonas Bonér */ class Client( - connectionFactory: ConnectionFactory, - hostname: String, - port: Int, - exchangeKey: String, - routingKey: String, - serializer: Serializer) extends Actor { - + connectionFactory: ConnectionFactory, + hostname: String, + port: Int, + exchangeKey: String, + routingKey: String, + serializer: Serializer) extends Actor { private val connection = connectionFactory.newConnection(hostname, port) private val channel = connection.createChannel @@ -63,7 +62,7 @@ object AMQP { private var listeners: List[Actor] = Nil private val endpoint = this - def init(channel: Channel) + def init(channel: Channel) def receive: PartialFunction[Any, Unit] = { case message: Message => listeners.foreach(_ ! message) @@ -87,47 +86,48 @@ object AMQP { } } -class ExampleAMQPSession { - import AMQP._ - - val CONFIG = new ConnectionParameters - CONFIG.setUsername("barack") - CONFIG.setPassword("obama") - CONFIG.setVirtualHost("/") - CONFIG.setRequestedHeartbeat(0) +object ExampleAMQPSession { + def main(args: Array[String]) = { + import AMQP._ + val CONFIG = new ConnectionParameters + CONFIG.setUsername("barack") + CONFIG.setPassword("obama") + CONFIG.setVirtualHost("/") + CONFIG.setRequestedHeartbeat(0) - val EXCHANGE = "whitehouse.gov" - val QUEUE = "marketing" - val ROUTING_KEY = "newsletter" - val HOSTNAME = "localhost" - val PORT = 8787 - val SERIALIZER = Serializer.Java + val EXCHANGE = "whitehouse.gov" + val QUEUE = "marketing" + val ROUTING_KEY = "newsletter" + val HOSTNAME = "localhost" + val PORT = 8787 + val SERIALIZER = Serializer.Java - val endpoint = new Endpoint(new ConnectionFactory(CONFIG), HOSTNAME, PORT) { - override def init(channel: Channel) = { - channel.exchangeDeclare(EXCHANGE, "direct") - channel.queueDeclare(QUEUE) - channel.queueBind(QUEUE, EXCHANGE, ROUTING_KEY) - channel.basicConsume(QUEUE, false, new DefaultConsumer(channel) { - override def handleDelivery(tag: String, envelope: Envelope, properties: RabbitMQ.BasicProperties, payload: Array[Byte]) { - messageConsumer ! Message(SERIALIZER.in(payload, None)) - channel.basicAck(envelope.getDeliveryTag, false) - } - }) + val endpoint = new Endpoint(new ConnectionFactory(CONFIG), HOSTNAME, PORT) { + override def init(channel: Channel) = { + channel.exchangeDeclare(EXCHANGE, "direct") + channel.queueDeclare(QUEUE) + channel.queueBind(QUEUE, EXCHANGE, ROUTING_KEY) + channel.basicConsume(QUEUE, false, new DefaultConsumer(channel) { + override def handleDelivery(tag: String, envelope: Envelope, properties: RabbitMQ.BasicProperties, payload: Array[Byte]) { + messageConsumer ! Message(SERIALIZER.in(payload, None)) + channel.basicAck(envelope.getDeliveryTag, false) + } + }) + } } - } - endpoint.start + endpoint.start - val messageConsumer = new Actor() { - def receive: PartialFunction[Any, Unit] = { - case Message(payload) => println("Received message: " + payload) + val messageConsumer = new Actor() { + def receive: PartialFunction[Any, Unit] = { + case Message(payload) => println("Received message: " + payload) + } } + messageConsumer.start + + endpoint ! MessageConsumer(messageConsumer) + + val client = new Client(new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, ROUTING_KEY, SERIALIZER) + client.start + client ! Message("The President: I'm going surfing") } - messageConsumer.start - - endpoint ! MessageConsumer(messageConsumer) - - val client = new Client(new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, ROUTING_KEY, SERIALIZER) - client.start - client ! Message("The President: I'm going surfing") -} +} \ No newline at end of file diff --git a/akka.iws b/akka.iws index 0292fc4550..40e04b3073 100644 --- a/akka.iws +++ b/akka.iws @@ -2,11 +2,12 @@ + - + @@ -58,10 +59,28 @@ - + - + + + + + + + + + + + + + + + + + + + @@ -85,6 +104,7 @@ @@ -187,11 +207,14 @@ + + + - + - + + + + + localhost 5050 @@ -309,23 +354,23 @@ 125 - + - - - - - - + + + + + + @@ -383,9 +428,23 @@ + + + + + + + - + + + + + + + + From deeaa923d15d67ff60d535a5c8b68c94a5d51ee7 Mon Sep 17 00:00:00 2001 From: jboner Date: Fri, 28 Aug 2009 17:40:06 +0200 Subject: [PATCH 18/35] created persistent and in-memory versions of all samples --- akka-amqp/src/main/scala/AMQP.scala | 14 +- akka.ipr | 140 ++---- akka.iws | 412 ++++++++++++++++-- fun-test-java/akka-fun-test-java.iml | 12 +- kernel/akka-kernel.iml | 12 +- samples-java/akka-samples-java.iml | 12 +- .../src/main/java/sample/java/Boot.java | 4 + .../sample/java/PersistentSimpleService.java | 57 +++ .../main/java/sample/java/SimpleService.java | 2 +- samples-lift/akka-samples-lift.iml | 12 +- .../src/main/scala/akka/SimpleService.scala | 33 ++ .../main/scala/bootstrap/liftweb/Boot.scala | 12 +- samples-scala/akka-samples-scala.iml | 12 +- .../src/main/scala/SimpleService.scala | 44 +- 14 files changed, 593 insertions(+), 185 deletions(-) create mode 100644 samples-java/src/main/java/sample/java/PersistentSimpleService.java diff --git a/akka-amqp/src/main/scala/AMQP.scala b/akka-amqp/src/main/scala/AMQP.scala index a45472ea12..faf271059c 100644 --- a/akka-amqp/src/main/scala/AMQP.scala +++ b/akka-amqp/src/main/scala/AMQP.scala @@ -102,6 +102,13 @@ object ExampleAMQPSession { val PORT = 8787 val SERIALIZER = Serializer.Java + val messageConsumer = new Actor() { + def receive: PartialFunction[Any, Unit] = { + case Message(payload) => println("Received message: " + payload) + } + } + messageConsumer.start + val endpoint = new Endpoint(new ConnectionFactory(CONFIG), HOSTNAME, PORT) { override def init(channel: Channel) = { channel.exchangeDeclare(EXCHANGE, "direct") @@ -117,13 +124,6 @@ object ExampleAMQPSession { } endpoint.start - val messageConsumer = new Actor() { - def receive: PartialFunction[Any, Unit] = { - case Message(payload) => println("Received message: " + payload) - } - } - messageConsumer.start - endpoint ! MessageConsumer(messageConsumer) val client = new Client(new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, ROUTING_KEY, SERIALIZER) diff --git a/akka.ipr b/akka.ipr index b5b5f4d0bd..175d776ea3 100644 --- a/akka.ipr +++ b/akka.ipr @@ -1648,116 +1648,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1769,15 +1659,37 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/akka.iws b/akka.iws index 40e04b3073..9fc47e8b25 100644 --- a/akka.iws +++ b/akka.iws @@ -2,8 +2,19 @@ - + + + + + + + + + + + + @@ -59,24 +70,6 @@ - - - - - - - - - - - - - - - - - - @@ -86,6 +79,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -103,8 +168,14 @@ @@ -135,6 +206,230 @@ diff --git a/fun-test-java/akka-fun-test-java.iml b/fun-test-java/akka-fun-test-java.iml index 2a4b679a7a..e09beb736b 100644 --- a/fun-test-java/akka-fun-test-java.iml +++ b/fun-test-java/akka-fun-test-java.iml @@ -28,6 +28,11 @@ + + + + + @@ -35,6 +40,9 @@ + + + @@ -55,10 +63,6 @@ - - - - diff --git a/kernel/akka-kernel.iml b/kernel/akka-kernel.iml index 0202664266..807760933a 100644 --- a/kernel/akka-kernel.iml +++ b/kernel/akka-kernel.iml @@ -44,6 +44,11 @@ + + + + + @@ -51,6 +56,9 @@ + + + @@ -72,10 +80,6 @@ - - - - diff --git a/samples-java/akka-samples-java.iml b/samples-java/akka-samples-java.iml index f9e50d1342..97ec95ec37 100644 --- a/samples-java/akka-samples-java.iml +++ b/samples-java/akka-samples-java.iml @@ -28,6 +28,11 @@ + + + + + @@ -35,6 +40,9 @@ + + + @@ -56,10 +64,6 @@ - - - - diff --git a/samples-java/src/main/java/sample/java/Boot.java b/samples-java/src/main/java/sample/java/Boot.java index 9c21f31faf..c4e25e381f 100644 --- a/samples-java/src/main/java/sample/java/Boot.java +++ b/samples-java/src/main/java/sample/java/Boot.java @@ -13,6 +13,10 @@ public class Boot { new Component( sample.java.SimpleService.class, new LifeCycle(new Permanent(), 1000), + 1000), + new Component( + sample.java.PersistentSimpleService.class, + new LifeCycle(new Permanent(), 1000), 1000) }).supervise(); } diff --git a/samples-java/src/main/java/sample/java/PersistentSimpleService.java b/samples-java/src/main/java/sample/java/PersistentSimpleService.java new file mode 100644 index 0000000000..a00b1ab60a --- /dev/null +++ b/samples-java/src/main/java/sample/java/PersistentSimpleService.java @@ -0,0 +1,57 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package sample.java; + +import javax.ws.rs.Path; +import javax.ws.rs.GET; +import javax.ws.rs.Produces; + +import se.scalablesolutions.akka.annotation.transactionrequired; +import se.scalablesolutions.akka.annotation.prerestart; +import se.scalablesolutions.akka.annotation.postrestart; +import se.scalablesolutions.akka.kernel.state.TransactionalState; +import se.scalablesolutions.akka.kernel.state.TransactionalMap; +import se.scalablesolutions.akka.kernel.state.CassandraStorageConfig; + +/** + * Try service out by invoking (multiple times): + *

    + * curl http://localhost:9998/persistentjavacount
    + * 
    + * Or browse to the URL from a web browser. + */ +@Path("/persistentjavacount") +@transactionrequired +public class PersistentSimpleService { + private String KEY = "COUNTER"; + + private boolean hasStartedTicking = false; + private TransactionalState factory = new TransactionalState(); + private TransactionalMap storage = factory.newPersistentMap(new CassandraStorageConfig()); + + @GET + @Produces({"application/html"}) + public String count() { + if (!hasStartedTicking) { + storage.put(KEY, 0); + hasStartedTicking = true; + return "Tick: 0\n"; + } else { + int counter = (Integer)storage.get(KEY).get() + 1; + storage.put(KEY, counter); + return "Tick: " + counter + "\n"; + } + } + + @prerestart + public void preRestart() { + System.out.println("Prepare for restart by supervisor"); + } + + @postrestart + public void postRestart() { + System.out.println("Reinitialize after restart by supervisor"); + } +} \ No newline at end of file diff --git a/samples-java/src/main/java/sample/java/SimpleService.java b/samples-java/src/main/java/sample/java/SimpleService.java index 212ca61027..604d3d301d 100644 --- a/samples-java/src/main/java/sample/java/SimpleService.java +++ b/samples-java/src/main/java/sample/java/SimpleService.java @@ -29,7 +29,7 @@ public class SimpleService { private boolean hasStartedTicking = false; private TransactionalState factory = new TransactionalState(); - private TransactionalMap storage = factory.newPersistentMap(new CassandraStorageConfig()); + private TransactionalMap storage = factory.newInMemoryMap(); @GET @Produces({"application/json"}) diff --git a/samples-lift/akka-samples-lift.iml b/samples-lift/akka-samples-lift.iml index bcdecef91a..5b3e6a796f 100644 --- a/samples-lift/akka-samples-lift.iml +++ b/samples-lift/akka-samples-lift.iml @@ -35,6 +35,11 @@ + + + + + @@ -42,6 +47,9 @@ + + + @@ -63,10 +71,6 @@ - - - - diff --git a/samples-lift/src/main/scala/akka/SimpleService.scala b/samples-lift/src/main/scala/akka/SimpleService.scala index f7af8a6ef7..1e951d5c2f 100644 --- a/samples-lift/src/main/scala/akka/SimpleService.scala +++ b/samples-lift/src/main/scala/akka/SimpleService.scala @@ -19,6 +19,39 @@ import javax.ws.rs.{GET, POST, Path, Produces, WebApplicationException, Consumes class SimpleService extends Actor { makeTransactionRequired + case object Tick + private val KEY = "COUNTER"; + private var hasStartedTicking = false; + private val storage = TransactionalState.newInMemoryMap[String, Integer] + + @GET + @Produces(Array("text/html")) + def count = (this !! Tick).getOrElse(

    Error in counter

    ) + + override def receive: PartialFunction[Any, Unit] = { + case Tick => if (hasStartedTicking) { + val counter = storage.get(KEY).get.asInstanceOf[Integer].intValue + storage.put(KEY, new Integer(counter + 1)) + reply(

    Tick: {counter + 1}

    ) + } else { + storage.put(KEY, new Integer(0)) + hasStartedTicking = true + reply(

    Tick: 0

    ) + } + } +} + +/** + * Try service out by invoking (multiple times): + *
    + * curl http://localhost:9998/persistentliftcount
    + * 
    + * Or browse to the URL from a web browser. + */ +@Path("/persistentliftcount") +class PersistentSimpleService extends Actor { + makeTransactionRequired + case object Tick private val KEY = "COUNTER"; private var hasStartedTicking = false; diff --git a/samples-lift/src/main/scala/bootstrap/liftweb/Boot.scala b/samples-lift/src/main/scala/bootstrap/liftweb/Boot.scala index 0cf98c8af4..1df1143d38 100644 --- a/samples-lift/src/main/scala/bootstrap/liftweb/Boot.scala +++ b/samples-lift/src/main/scala/bootstrap/liftweb/Boot.scala @@ -40,11 +40,13 @@ class Boot { override def getSupervisorConfig: SupervisorConfig = { SupervisorConfig( RestartStrategy(OneForOne, 3, 100), - Supervise( - new SimpleService, - LifeCycle(Permanent, 100) - ) - :: Nil) + Supervise( + new SimpleService, + LifeCycle(Permanent, 100)) :: + Supervise( + new SimpleService, + LifeCycle(Permanent, 100)) :: + Nil) } } val supervisor = factory.newSupervisor diff --git a/samples-scala/akka-samples-scala.iml b/samples-scala/akka-samples-scala.iml index cea303267e..f88fe93371 100644 --- a/samples-scala/akka-samples-scala.iml +++ b/samples-scala/akka-samples-scala.iml @@ -33,6 +33,11 @@ + + + + + @@ -40,6 +45,9 @@ + + + @@ -61,10 +69,6 @@ - - - - diff --git a/samples-scala/src/main/scala/SimpleService.scala b/samples-scala/src/main/scala/SimpleService.scala index 59d28e52e6..d95bfd7bb7 100644 --- a/samples-scala/src/main/scala/SimpleService.scala +++ b/samples-scala/src/main/scala/SimpleService.scala @@ -24,10 +24,13 @@ class Boot { Supervise( new SimpleService, LifeCycle(Permanent, 100)) :: - Supervise( - new Chat, - LifeCycle(Permanent, 100)) - :: Nil) + Supervise( + new Chat, + LifeCycle(Permanent, 100)) :: + Supervise( + new PersistentSimpleService, + LifeCycle(Permanent, 100)) + :: Nil) } } val supervisor = factory.newSupervisor @@ -45,6 +48,39 @@ class Boot { class SimpleService extends Actor { makeTransactionRequired + case object Tick + private val KEY = "COUNTER"; + private var hasStartedTicking = false; + private val storage = TransactionalState.newInMemoryMap[String, Integer] + + @GET + @Produces(Array("text/html")) + def count = (this !! Tick).getOrElse(Error in counter) + + override def receive: PartialFunction[Any, Unit] = { + case Tick => if (hasStartedTicking) { + val counter = storage.get(KEY).get.asInstanceOf[Integer].intValue + storage.put(KEY, new Integer(counter + 1)) + reply(Tick:{counter + 1}) + } else { + storage.put(KEY, new Integer(0)) + hasStartedTicking = true + reply(Tick: 0) + } + } +} + +/** + * Try service out by invoking (multiple times): + *
    + * curl http://localhost:9998/persistentscalacount
    + * 
    + * Or browse to the URL from a web browser. + */ +@Path("/persistentscalacount") +class PersistentSimpleService extends Actor { + makeTransactionRequired + case object Tick private val KEY = "COUNTER"; private var hasStartedTicking = false; From a12968194664b4a56669f4448387e3c172ac25d5 Mon Sep 17 00:00:00 2001 From: Jonas Boner Date: Mon, 31 Aug 2009 14:29:14 +0200 Subject: [PATCH 19/35] fixed guiceyfruit pom problem --- kernel/pom.xml | 4 ++-- util-java/pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kernel/pom.xml b/kernel/pom.xml index 4af5fc8d66..7a5078f59c 100644 --- a/kernel/pom.xml +++ b/kernel/pom.xml @@ -49,8 +49,8 @@ org.guiceyfruit - guice-core - 2.0-beta-4 + guiceyfruit-core + 2.0 org.apache.camel diff --git a/util-java/pom.xml b/util-java/pom.xml index fdcbbb5113..65ecadb058 100644 --- a/util-java/pom.xml +++ b/util-java/pom.xml @@ -18,7 +18,7 @@ org.guiceyfruit guice-core - 2.0-SNAPSHOT + 2.0-beta-4 com.google.protobuf From ab6637044f858cc1f13b9b766bce1bb01747ca77 Mon Sep 17 00:00:00 2001 From: jboner Date: Tue, 1 Sep 2009 08:56:44 +0200 Subject: [PATCH 20/35] splitted kernel up in core + many sub modules --- {kernel => akka-actors}/pom.xml | 449 +++---- .../src/main/resources/META-INF/aop.xml | 0 .../src/main/scala/actor/ActiveObject.scala | 0 .../src/main/scala/actor/Actor.scala | 0 .../src/main/scala/actor/ActorRegistry.scala | 0 .../src/main/scala/actor/Supervisor.scala | 0 .../ActiveObjectGuiceConfigurator.scala | 0 .../scala/config/ActiveObjectManager.scala | 0 .../main/scala/config/CamelConfigurator.scala | 0 .../src/main/scala/config/Config.scala | 0 .../src/main/scala/config/Configuration.scala | 0 .../src/main/scala/config/Configurator.scala | 0 .../scala/config/ConfiguratorRepository.scala | 0 .../src/main/scala/nio/RemoteClient.scala | 0 .../scala/nio/RemoteProtocolBuilder.scala | 0 .../src/main/scala/nio/RemoteServer.scala | 0 .../src/main/scala/nio/RequestReply.scala | 0 .../src/main/scala/reactor/Dispatchers.scala | 0 .../EventBasedSingleThreadDispatcher.scala | 0 .../EventBasedThreadPoolDispatcher.scala | 0 .../src/main/scala/reactor/Future.scala | 0 .../scala/reactor/ManagedActorScheduler.scala | 0 .../scala/reactor/MessageDispatcherBase.scala | 0 .../src/main/scala/reactor/Reactor.scala | 0 .../scala/reactor/ThreadBasedDispatcher.scala | 0 .../src/main/scala/serialization/Binary.scala | 0 .../scala/serialization/Serializable.scala | 0 .../main/scala/serialization/Serializer.scala | 0 .../src/main/scala/util/HashCode.scala | 0 .../src/main/scala/util/Helpers.scala | 0 .../src/main/scala/util/Logging.scala | 0 .../src/main/scala/util/ResultOrFailure.scala | 0 .../src/main/scala/util/Scheduler.scala | 0 .../src/test/scala/ActorSpec.scala | 0 .../src/test/scala/AllSuite.scala | 0 .../src/test/scala/AllTest.scala | 0 .../src/test/scala/CamelSpec.scala | 0 ...EventBasedSingleThreadDispatcherTest.scala | 0 .../EventBasedThreadPoolDispatcherTest.scala | 0 .../src/test/scala/InMemoryActorSpec.scala | 0 .../src/test/scala/Messages.scala | 0 .../src/test/scala/RemoteActorSpec.scala | 0 .../src/test/scala/RemoteSupervisorSpec.scala | 0 .../src/test/scala/SchedulerSpec.scala | 0 .../src/test/scala/SupervisorSpec.scala | 0 .../scala/ThreadBasedDispatcherTest.scala | 0 .../test/scala/TransactionClasherSpec.scala | 0 akka-camel/pom.xml | 43 + .../services/org/apache/camel/component/akka | 0 .../main/scala}/ActiveObjectComponent.scala | 0 .../main/scala}/ActiveObjectConsumer.scala | 0 .../main/scala}/ActiveObjectEndpoint.scala | 0 .../main/scala}/ActiveObjectProducer.scala | 0 .../src/main/scala}/MessageDriven.scala | 0 .../scala}/SupervisorAwareCamelContext.scala | 0 {fun-test-java => akka-fun-test-java}/pom.xml | 0 .../ActiveObjectGuiceConfiguratorTest.java | 0 .../scalablesolutions/akka/api/AllTest.java | 0 .../se/scalablesolutions/akka/api/Bar.java | 0 .../scalablesolutions/akka/api/BarImpl.java | 0 .../se/scalablesolutions/akka/api/Ext.java | 0 .../scalablesolutions/akka/api/ExtImpl.java | 0 .../se/scalablesolutions/akka/api/Foo.java | 0 .../akka/api/InMemFailer.java | 0 .../akka/api/InMemNestedStateTest.java | 0 .../akka/api/InMemStateful.java | 0 .../akka/api/InMemStatefulNested.java | 0 .../akka/api/InMemoryStateTest.java | 0 .../scalablesolutions/akka/api/JerseyFoo.java | 0 .../akka/api/PersistenceManager.java | 0 .../akka/api/PersistentClasher.java | 0 .../akka/api/PersistentFailer.java | 0 .../akka/api/PersistentNestedStateTest.java | 0 .../akka/api/PersistentStateTest.java | 0 .../akka/api/PersistentStateful.java | 0 .../akka/api/PersistentStatefulNested.java | 0 .../akka/api/ProtobufProtocol.java | 0 .../akka/api/ProtobufProtocol.proto | 0 .../akka/api/ProtobufSerializationTest.java | 0 .../akka/api/RemoteInMemoryStateTest.java | 0 .../akka/api/RemotePersistentStateTest.java | 0 .../scalablesolutions/akka/api/RestTest.java | 0 .../testng.xml | 0 akka-kernel/pom.xml | 90 ++ .../src/main/scala/Boot.scala | 0 .../src/main/scala/Kernel.scala | 0 akka-persistence/pom.xml | 54 + .../src/main/scala}/CassandraSession.scala | 0 .../src/main/scala}/CassandraStorage.scala | 0 .../src/main/scala}/DataFlowVariable.scala | 0 .../src/main/scala}/MongoStorage.scala | 0 .../src/main/scala/PersistentState.scala | 236 +--- .../src/main/scala}/Pool.scala | 0 .../src/main/scala}/Storage.scala | 0 .../test/scala/MongoPersistentActorSpec.scala | 0 .../src/test/scala/MongoStorageSpec.scala | 0 .../src/test/scala/PersistentActorSpec.scala | 0 akka-rest/pom.xml | 68 ++ .../main/scala}/ActorComponentProvider.scala | 0 .../ActorComponentProviderFactory.scala | 0 .../src/main/scala}/AkkaServlet.scala | 0 .../src/main/scala}/NodeWriter.scala | 0 {samples-java => akka-samples-java}/pom.xml | 0 .../src/main/java/sample/java/Boot.java | 0 .../sample/java/PersistentSimpleService.java | 0 .../main/java/sample/java/SimpleService.java | 0 .../config/akka.conf | 0 {samples-lift => akka-samples-lift}/pom.xml | 0 .../src/main/scala/akka/SimpleService.scala | 0 .../main/scala/bootstrap/liftweb/Boot.scala | 0 .../src/main/scala/comet/.keep | 0 .../src/main/scala/model/.keep | 0 .../src/main/scala/snippet/.keep | 0 .../src/main/scala/snippet/HelloWorld.scala | 0 .../src/main/scala/view/.keep | 0 .../src/main/webapp/index.html | 0 .../main/webapp/templates-hidden/default.html | 0 .../src/test/scala/LiftConsole.scala | 0 .../src/test/scala/RunWebApp.scala | 0 {samples-scala => akka-samples-scala}/pom.xml | 0 .../src/main/scala/SimpleService.scala | 0 akka-stm/pom.xml | 95 ++ .../src/main/scala}/ChangeSet.scala | 0 .../src/main/scala}/HashTrie.scala | 0 .../src/main/scala}/Transaction.scala | 0 .../main/scala}/TransactionManagement.scala | 0 .../src/main/scala}/TransactionWatcher.scala | 0 .../src/main/scala/TransactionalState.scala | 245 ++++ .../src/main/scala}/Vector.scala | 0 {util-java => akka-util-java}/pom.xml | 0 .../akka/annotation/configuration.java | 0 .../akka/annotation/immutable.java | 0 .../akka/annotation/oneway.java | 0 .../akka/annotation/postrestart.java | 0 .../akka/annotation/prerestart.java | 0 .../akka/annotation/state.java | 0 .../akka/annotation/transactionrequired.java | 0 .../config/ActiveObjectGuiceModule.java | 0 .../akka/kernel/config/DependencyBinding.java | 0 .../kernel/nio/protobuf/RemoteProtocol.java | 0 .../kernel/nio/protobuf/RemoteProtocol.proto | 0 akka.ipr | 1037 +++++++++-------- akka.iws | 557 +++------ changes.xml | 96 +- fun-test-java/akka-fun-test-java.iml | 85 -- kernel/akka-kernel.iml | 95 -- kernel/kernel.iml | 667 ----------- pom.xml | 16 +- samples-java/akka-samples-java.iml | 78 -- samples-lift/akka-samples-lift.iml | 96 -- samples-lift/src/main/webapp/WEB-INF/web.xml | 22 - samples-scala/akka-samples-scala.iml | 83 -- util-java/akka-util-java.iml | 17 - util-java/util-java.iml | 32 - 154 files changed, 1510 insertions(+), 2651 deletions(-) rename {kernel => akka-actors}/pom.xml (51%) rename {kernel => akka-actors}/src/main/resources/META-INF/aop.xml (100%) rename {kernel => akka-actors}/src/main/scala/actor/ActiveObject.scala (100%) rename {kernel => akka-actors}/src/main/scala/actor/Actor.scala (100%) rename {kernel => akka-actors}/src/main/scala/actor/ActorRegistry.scala (100%) rename {kernel => akka-actors}/src/main/scala/actor/Supervisor.scala (100%) rename {kernel => akka-actors}/src/main/scala/config/ActiveObjectGuiceConfigurator.scala (100%) rename {kernel => akka-actors}/src/main/scala/config/ActiveObjectManager.scala (100%) rename {kernel => akka-actors}/src/main/scala/config/CamelConfigurator.scala (100%) rename {kernel => akka-actors}/src/main/scala/config/Config.scala (100%) rename {kernel => akka-actors}/src/main/scala/config/Configuration.scala (100%) rename {kernel => akka-actors}/src/main/scala/config/Configurator.scala (100%) rename {kernel => akka-actors}/src/main/scala/config/ConfiguratorRepository.scala (100%) rename {kernel => akka-actors}/src/main/scala/nio/RemoteClient.scala (100%) rename {kernel => akka-actors}/src/main/scala/nio/RemoteProtocolBuilder.scala (100%) rename {kernel => akka-actors}/src/main/scala/nio/RemoteServer.scala (100%) rename {kernel => akka-actors}/src/main/scala/nio/RequestReply.scala (100%) rename {kernel => akka-actors}/src/main/scala/reactor/Dispatchers.scala (100%) rename {kernel => akka-actors}/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala (100%) rename {kernel => akka-actors}/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala (100%) rename {kernel => akka-actors}/src/main/scala/reactor/Future.scala (100%) rename {kernel => akka-actors}/src/main/scala/reactor/ManagedActorScheduler.scala (100%) rename {kernel => akka-actors}/src/main/scala/reactor/MessageDispatcherBase.scala (100%) rename {kernel => akka-actors}/src/main/scala/reactor/Reactor.scala (100%) rename {kernel => akka-actors}/src/main/scala/reactor/ThreadBasedDispatcher.scala (100%) rename {kernel => akka-actors}/src/main/scala/serialization/Binary.scala (100%) rename {kernel => akka-actors}/src/main/scala/serialization/Serializable.scala (100%) rename {kernel => akka-actors}/src/main/scala/serialization/Serializer.scala (100%) rename {kernel => akka-actors}/src/main/scala/util/HashCode.scala (100%) rename {kernel => akka-actors}/src/main/scala/util/Helpers.scala (100%) rename {kernel => akka-actors}/src/main/scala/util/Logging.scala (100%) rename {kernel => akka-actors}/src/main/scala/util/ResultOrFailure.scala (100%) rename {kernel => akka-actors}/src/main/scala/util/Scheduler.scala (100%) rename {kernel => akka-actors}/src/test/scala/ActorSpec.scala (100%) rename {kernel => akka-actors}/src/test/scala/AllSuite.scala (100%) rename {kernel => akka-actors}/src/test/scala/AllTest.scala (100%) rename {kernel => akka-actors}/src/test/scala/CamelSpec.scala (100%) rename {kernel => akka-actors}/src/test/scala/EventBasedSingleThreadDispatcherTest.scala (100%) rename {kernel => akka-actors}/src/test/scala/EventBasedThreadPoolDispatcherTest.scala (100%) rename {kernel => akka-actors}/src/test/scala/InMemoryActorSpec.scala (100%) rename {kernel => akka-actors}/src/test/scala/Messages.scala (100%) rename {kernel => akka-actors}/src/test/scala/RemoteActorSpec.scala (100%) rename {kernel => akka-actors}/src/test/scala/RemoteSupervisorSpec.scala (100%) rename {kernel => akka-actors}/src/test/scala/SchedulerSpec.scala (100%) rename {kernel => akka-actors}/src/test/scala/SupervisorSpec.scala (100%) rename {kernel => akka-actors}/src/test/scala/ThreadBasedDispatcherTest.scala (100%) rename {kernel => akka-actors}/src/test/scala/TransactionClasherSpec.scala (100%) create mode 100644 akka-camel/pom.xml rename {kernel => akka-camel}/src/main/resources/META-INF/services/org/apache/camel/component/akka (100%) rename {kernel/src/main/scala/camel => akka-camel/src/main/scala}/ActiveObjectComponent.scala (100%) rename {kernel/src/main/scala/camel => akka-camel/src/main/scala}/ActiveObjectConsumer.scala (100%) rename {kernel/src/main/scala/camel => akka-camel/src/main/scala}/ActiveObjectEndpoint.scala (100%) rename {kernel/src/main/scala/camel => akka-camel/src/main/scala}/ActiveObjectProducer.scala (100%) rename {kernel/src/main/scala/camel => akka-camel/src/main/scala}/MessageDriven.scala (100%) rename {kernel/src/main/scala/camel => akka-camel/src/main/scala}/SupervisorAwareCamelContext.scala (100%) rename {fun-test-java => akka-fun-test-java}/pom.xml (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/AllTest.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/Bar.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/BarImpl.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/Ext.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/ExtImpl.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/Foo.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/InMemFailer.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/JerseyFoo.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/PersistenceManager.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/PersistentFailer.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/PersistentNestedStateTest.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/PersistentStateTest.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/ProtobufProtocol.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/ProtobufProtocol.proto (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/ProtobufSerializationTest.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/RemoteInMemoryStateTest.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/RemotePersistentStateTest.java (100%) rename {fun-test-java => akka-fun-test-java}/src/test/java/se/scalablesolutions/akka/api/RestTest.java (100%) rename {fun-test-java => akka-fun-test-java}/testng.xml (100%) create mode 100644 akka-kernel/pom.xml rename {kernel => akka-kernel}/src/main/scala/Boot.scala (100%) rename {kernel => akka-kernel}/src/main/scala/Kernel.scala (100%) create mode 100644 akka-persistence/pom.xml rename {kernel/src/main/scala/state => akka-persistence/src/main/scala}/CassandraSession.scala (100%) rename {kernel/src/main/scala/state => akka-persistence/src/main/scala}/CassandraStorage.scala (100%) rename {kernel/src/main/scala/state => akka-persistence/src/main/scala}/DataFlowVariable.scala (100%) rename {kernel/src/main/scala/state => akka-persistence/src/main/scala}/MongoStorage.scala (100%) rename kernel/src/main/scala/state/State.scala => akka-persistence/src/main/scala/PersistentState.scala (61%) rename {kernel/src/main/scala/state => akka-persistence/src/main/scala}/Pool.scala (100%) rename {kernel/src/main/scala/state => akka-persistence/src/main/scala}/Storage.scala (100%) rename {kernel => akka-persistence}/src/test/scala/MongoPersistentActorSpec.scala (100%) rename {kernel => akka-persistence}/src/test/scala/MongoStorageSpec.scala (100%) rename {kernel => akka-persistence}/src/test/scala/PersistentActorSpec.scala (100%) create mode 100644 akka-rest/pom.xml rename {kernel/src/main/scala/rest => akka-rest/src/main/scala}/ActorComponentProvider.scala (100%) rename {kernel/src/main/scala/rest => akka-rest/src/main/scala}/ActorComponentProviderFactory.scala (100%) rename {kernel/src/main/scala/rest => akka-rest/src/main/scala}/AkkaServlet.scala (100%) rename {kernel/src/main/scala/rest => akka-rest/src/main/scala}/NodeWriter.scala (100%) rename {samples-java => akka-samples-java}/pom.xml (100%) rename {samples-java => akka-samples-java}/src/main/java/sample/java/Boot.java (100%) rename {samples-java => akka-samples-java}/src/main/java/sample/java/PersistentSimpleService.java (100%) rename {samples-java => akka-samples-java}/src/main/java/sample/java/SimpleService.java (100%) rename {samples-lift => akka-samples-lift}/config/akka.conf (100%) rename {samples-lift => akka-samples-lift}/pom.xml (100%) rename {samples-lift => akka-samples-lift}/src/main/scala/akka/SimpleService.scala (100%) rename {samples-lift => akka-samples-lift}/src/main/scala/bootstrap/liftweb/Boot.scala (100%) rename {samples-lift => akka-samples-lift}/src/main/scala/comet/.keep (100%) rename {samples-lift => akka-samples-lift}/src/main/scala/model/.keep (100%) rename {samples-lift => akka-samples-lift}/src/main/scala/snippet/.keep (100%) rename {samples-lift => akka-samples-lift}/src/main/scala/snippet/HelloWorld.scala (100%) rename {samples-lift => akka-samples-lift}/src/main/scala/view/.keep (100%) rename {samples-lift => akka-samples-lift}/src/main/webapp/index.html (100%) rename {samples-lift => akka-samples-lift}/src/main/webapp/templates-hidden/default.html (100%) rename {samples-lift => akka-samples-lift}/src/test/scala/LiftConsole.scala (100%) rename {samples-lift => akka-samples-lift}/src/test/scala/RunWebApp.scala (100%) rename {samples-scala => akka-samples-scala}/pom.xml (100%) rename {samples-scala => akka-samples-scala}/src/main/scala/SimpleService.scala (100%) create mode 100644 akka-stm/pom.xml rename {kernel/src/main/scala/stm => akka-stm/src/main/scala}/ChangeSet.scala (100%) rename {kernel/src/main/scala/collection => akka-stm/src/main/scala}/HashTrie.scala (100%) rename {kernel/src/main/scala/stm => akka-stm/src/main/scala}/Transaction.scala (100%) rename {kernel/src/main/scala/stm => akka-stm/src/main/scala}/TransactionManagement.scala (100%) rename {kernel/src/main/scala/stm => akka-stm/src/main/scala}/TransactionWatcher.scala (100%) create mode 100644 akka-stm/src/main/scala/TransactionalState.scala rename {kernel/src/main/scala/collection => akka-stm/src/main/scala}/Vector.scala (100%) rename {util-java => akka-util-java}/pom.xml (100%) rename {util-java => akka-util-java}/src/main/java/se/scalablesolutions/akka/annotation/configuration.java (100%) rename {util-java => akka-util-java}/src/main/java/se/scalablesolutions/akka/annotation/immutable.java (100%) rename {util-java => akka-util-java}/src/main/java/se/scalablesolutions/akka/annotation/oneway.java (100%) rename {util-java => akka-util-java}/src/main/java/se/scalablesolutions/akka/annotation/postrestart.java (100%) rename {util-java => akka-util-java}/src/main/java/se/scalablesolutions/akka/annotation/prerestart.java (100%) rename {util-java => akka-util-java}/src/main/java/se/scalablesolutions/akka/annotation/state.java (100%) rename {util-java => akka-util-java}/src/main/java/se/scalablesolutions/akka/annotation/transactionrequired.java (100%) rename {util-java => akka-util-java}/src/main/java/se/scalablesolutions/akka/kernel/config/ActiveObjectGuiceModule.java (100%) rename {util-java => akka-util-java}/src/main/java/se/scalablesolutions/akka/kernel/config/DependencyBinding.java (100%) rename {util-java => akka-util-java}/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java (100%) rename {util-java => akka-util-java}/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto (100%) delete mode 100644 fun-test-java/akka-fun-test-java.iml delete mode 100644 kernel/akka-kernel.iml delete mode 100755 kernel/kernel.iml delete mode 100644 samples-java/akka-samples-java.iml delete mode 100644 samples-lift/akka-samples-lift.iml delete mode 100755 samples-lift/src/main/webapp/WEB-INF/web.xml delete mode 100644 samples-scala/akka-samples-scala.iml delete mode 100644 util-java/akka-util-java.iml delete mode 100755 util-java/util-java.iml diff --git a/kernel/pom.xml b/akka-actors/pom.xml similarity index 51% rename from kernel/pom.xml rename to akka-actors/pom.xml index 4af5fc8d66..91ab205c95 100644 --- a/kernel/pom.xml +++ b/akka-actors/pom.xml @@ -1,290 +1,159 @@ - - 4.0.0 - - akka-kernel - Akka Kernel Module - - jar - - - akka - se.scalablesolutions.akka - 0.6 - ../pom.xml - - - - - - akka-util-java - se.scalablesolutions.akka - 0.6 - - - org.scala-lang - scala-library - 2.7.5 - - - org.codehaus.aspectwerkz - aspectwerkz-nodeps-jdk5 - 2.1 - - - org.codehaus.aspectwerkz - aspectwerkz-jdk5 - 2.1 - - - com.twitter - scala-stats - 1.0 - - - net.lag - configgy - 1.3 - - - org.guiceyfruit - guice-core - 2.0-beta-4 - - - org.apache.camel - camel-core - 2.0-SNAPSHOT - - - org.jboss.netty - netty - 3.1.0.GA - - - org.apache - zookeeper - 3.1.0 - - - org.scala-tools - javautils - 2.7.4-0.1 - - - - - org.codehaus.jackson - jackson-core-asl - 1.1.0 - - - org.codehaus.jackson - jackson-mapper-asl - 1.1.0 - - - com.google.protobuf - protobuf-java - 2.1.0 - - - sbinary - sbinary - 0.3 - - - com.twitter - scala-json - 1.0 - - - dispatch.json - dispatch-json - 0.5.2 - - - dispatch.http - dispatch-http - 0.5.2 - - - sjson.json - sjson - 0.1 - - - - - - com.mongodb - mongo - 0.6 - - - - - org.apache.cassandra - cassandra - 0.4.0-trunk - - - com.facebook - thrift - 1.0 - - - com.facebook - fb303 - 1.0 - - - commons-pool - commons-pool - 1.5.1 - - - - - com.sun.grizzly - grizzly-comet-webserver - 1.8.6.3 - - - com.sun.jersey - jersey-server - 1.1.1-ea - - - com.sun.jersey - jersey-json - 1.1.1-ea - - - javax.ws.rs - jsr311-api - 1.0 - - - com.sun.jersey.contribs - jersey-scala - 1.1.2-ea-SNAPSHOT - - - org.atmosphere - atmosphere-core - 0.3 - - - org.atmosphere - atmosphere-portable-runtime - 0.3 - - - org.atmosphere - atmosphere-compat - 0.3 - - - - - org.slf4j - slf4j-log4j12 - 1.4.3 - - - org.slf4j - slf4j-api - 1.4.3 - - - log4j - log4j - 1.2.13 - - - commons-logging - commons-logging - 1.0.4 - - - - - org.scala-tools.testing - scalatest - 0.9.5 - test - - - junit - junit - 4.5 - test - - - - - - - maven-assembly-plugin - 2.2-beta-2 - - - create-executable-jar - install - - single - - - - - jar-with-dependencies - - - - - se.scalablesolutions.akka.kernel.Kernel - - - - - - - - maven-antrun-plugin - - - install - - - - - - - run - - - - - - - - false - ../config - - akka.conf - akka-reference.conf - - - - false - src/main/resources - - META-INF/* - - - - - + + 4.0.0 + + akka-actors + Akka Actors Module + + jar + + + akka + se.scalablesolutions.akka + 0.6 + ../pom.xml + + + + + + akka-util-java + se.scalablesolutions.akka + 0.6 + + + org.scala-lang + scala-library + 2.7.5 + + + org.codehaus.aspectwerkz + aspectwerkz-nodeps-jdk5 + 2.1 + + + org.codehaus.aspectwerkz + aspectwerkz-jdk5 + 2.1 + + + net.lag + configgy + 1.3 + + + org.guiceyfruit + guice-core + 2.0-beta-4 + + + org.jboss.netty + netty + 3.1.0.GA + + + org.scala-tools + javautils + 2.7.4-0.1 + + + + + org.codehaus.jackson + jackson-core-asl + 1.1.0 + + + org.codehaus.jackson + jackson-mapper-asl + 1.1.0 + + + com.google.protobuf + protobuf-java + 2.1.0 + + + sbinary + sbinary + 0.3 + + + com.twitter + scala-json + 1.0 + + + dispatch.json + dispatch-json + 0.5.2 + + + dispatch.http + dispatch-http + 0.5.2 + + + sjson.json + sjson + 0.1 + + + + + org.slf4j + slf4j-log4j12 + 1.4.3 + + + org.slf4j + slf4j-api + 1.4.3 + + + log4j + log4j + 1.2.13 + + + commons-logging + commons-logging + 1.0.4 + + + + + org.scala-tools.testing + scalatest + 0.9.5 + test + + + junit + junit + 4.5 + test + + + + + + + false + ../config + + akka.conf + akka-reference.conf + + + + false + src/main/resources + + META-INF/* + + + + + diff --git a/kernel/src/main/resources/META-INF/aop.xml b/akka-actors/src/main/resources/META-INF/aop.xml similarity index 100% rename from kernel/src/main/resources/META-INF/aop.xml rename to akka-actors/src/main/resources/META-INF/aop.xml diff --git a/kernel/src/main/scala/actor/ActiveObject.scala b/akka-actors/src/main/scala/actor/ActiveObject.scala similarity index 100% rename from kernel/src/main/scala/actor/ActiveObject.scala rename to akka-actors/src/main/scala/actor/ActiveObject.scala diff --git a/kernel/src/main/scala/actor/Actor.scala b/akka-actors/src/main/scala/actor/Actor.scala similarity index 100% rename from kernel/src/main/scala/actor/Actor.scala rename to akka-actors/src/main/scala/actor/Actor.scala diff --git a/kernel/src/main/scala/actor/ActorRegistry.scala b/akka-actors/src/main/scala/actor/ActorRegistry.scala similarity index 100% rename from kernel/src/main/scala/actor/ActorRegistry.scala rename to akka-actors/src/main/scala/actor/ActorRegistry.scala diff --git a/kernel/src/main/scala/actor/Supervisor.scala b/akka-actors/src/main/scala/actor/Supervisor.scala similarity index 100% rename from kernel/src/main/scala/actor/Supervisor.scala rename to akka-actors/src/main/scala/actor/Supervisor.scala diff --git a/kernel/src/main/scala/config/ActiveObjectGuiceConfigurator.scala b/akka-actors/src/main/scala/config/ActiveObjectGuiceConfigurator.scala similarity index 100% rename from kernel/src/main/scala/config/ActiveObjectGuiceConfigurator.scala rename to akka-actors/src/main/scala/config/ActiveObjectGuiceConfigurator.scala diff --git a/kernel/src/main/scala/config/ActiveObjectManager.scala b/akka-actors/src/main/scala/config/ActiveObjectManager.scala similarity index 100% rename from kernel/src/main/scala/config/ActiveObjectManager.scala rename to akka-actors/src/main/scala/config/ActiveObjectManager.scala diff --git a/kernel/src/main/scala/config/CamelConfigurator.scala b/akka-actors/src/main/scala/config/CamelConfigurator.scala similarity index 100% rename from kernel/src/main/scala/config/CamelConfigurator.scala rename to akka-actors/src/main/scala/config/CamelConfigurator.scala diff --git a/kernel/src/main/scala/config/Config.scala b/akka-actors/src/main/scala/config/Config.scala similarity index 100% rename from kernel/src/main/scala/config/Config.scala rename to akka-actors/src/main/scala/config/Config.scala diff --git a/kernel/src/main/scala/config/Configuration.scala b/akka-actors/src/main/scala/config/Configuration.scala similarity index 100% rename from kernel/src/main/scala/config/Configuration.scala rename to akka-actors/src/main/scala/config/Configuration.scala diff --git a/kernel/src/main/scala/config/Configurator.scala b/akka-actors/src/main/scala/config/Configurator.scala similarity index 100% rename from kernel/src/main/scala/config/Configurator.scala rename to akka-actors/src/main/scala/config/Configurator.scala diff --git a/kernel/src/main/scala/config/ConfiguratorRepository.scala b/akka-actors/src/main/scala/config/ConfiguratorRepository.scala similarity index 100% rename from kernel/src/main/scala/config/ConfiguratorRepository.scala rename to akka-actors/src/main/scala/config/ConfiguratorRepository.scala diff --git a/kernel/src/main/scala/nio/RemoteClient.scala b/akka-actors/src/main/scala/nio/RemoteClient.scala similarity index 100% rename from kernel/src/main/scala/nio/RemoteClient.scala rename to akka-actors/src/main/scala/nio/RemoteClient.scala diff --git a/kernel/src/main/scala/nio/RemoteProtocolBuilder.scala b/akka-actors/src/main/scala/nio/RemoteProtocolBuilder.scala similarity index 100% rename from kernel/src/main/scala/nio/RemoteProtocolBuilder.scala rename to akka-actors/src/main/scala/nio/RemoteProtocolBuilder.scala diff --git a/kernel/src/main/scala/nio/RemoteServer.scala b/akka-actors/src/main/scala/nio/RemoteServer.scala similarity index 100% rename from kernel/src/main/scala/nio/RemoteServer.scala rename to akka-actors/src/main/scala/nio/RemoteServer.scala diff --git a/kernel/src/main/scala/nio/RequestReply.scala b/akka-actors/src/main/scala/nio/RequestReply.scala similarity index 100% rename from kernel/src/main/scala/nio/RequestReply.scala rename to akka-actors/src/main/scala/nio/RequestReply.scala diff --git a/kernel/src/main/scala/reactor/Dispatchers.scala b/akka-actors/src/main/scala/reactor/Dispatchers.scala similarity index 100% rename from kernel/src/main/scala/reactor/Dispatchers.scala rename to akka-actors/src/main/scala/reactor/Dispatchers.scala diff --git a/kernel/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala b/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala similarity index 100% rename from kernel/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala rename to akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala diff --git a/kernel/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala b/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala similarity index 100% rename from kernel/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala rename to akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala diff --git a/kernel/src/main/scala/reactor/Future.scala b/akka-actors/src/main/scala/reactor/Future.scala similarity index 100% rename from kernel/src/main/scala/reactor/Future.scala rename to akka-actors/src/main/scala/reactor/Future.scala diff --git a/kernel/src/main/scala/reactor/ManagedActorScheduler.scala b/akka-actors/src/main/scala/reactor/ManagedActorScheduler.scala similarity index 100% rename from kernel/src/main/scala/reactor/ManagedActorScheduler.scala rename to akka-actors/src/main/scala/reactor/ManagedActorScheduler.scala diff --git a/kernel/src/main/scala/reactor/MessageDispatcherBase.scala b/akka-actors/src/main/scala/reactor/MessageDispatcherBase.scala similarity index 100% rename from kernel/src/main/scala/reactor/MessageDispatcherBase.scala rename to akka-actors/src/main/scala/reactor/MessageDispatcherBase.scala diff --git a/kernel/src/main/scala/reactor/Reactor.scala b/akka-actors/src/main/scala/reactor/Reactor.scala similarity index 100% rename from kernel/src/main/scala/reactor/Reactor.scala rename to akka-actors/src/main/scala/reactor/Reactor.scala diff --git a/kernel/src/main/scala/reactor/ThreadBasedDispatcher.scala b/akka-actors/src/main/scala/reactor/ThreadBasedDispatcher.scala similarity index 100% rename from kernel/src/main/scala/reactor/ThreadBasedDispatcher.scala rename to akka-actors/src/main/scala/reactor/ThreadBasedDispatcher.scala diff --git a/kernel/src/main/scala/serialization/Binary.scala b/akka-actors/src/main/scala/serialization/Binary.scala similarity index 100% rename from kernel/src/main/scala/serialization/Binary.scala rename to akka-actors/src/main/scala/serialization/Binary.scala diff --git a/kernel/src/main/scala/serialization/Serializable.scala b/akka-actors/src/main/scala/serialization/Serializable.scala similarity index 100% rename from kernel/src/main/scala/serialization/Serializable.scala rename to akka-actors/src/main/scala/serialization/Serializable.scala diff --git a/kernel/src/main/scala/serialization/Serializer.scala b/akka-actors/src/main/scala/serialization/Serializer.scala similarity index 100% rename from kernel/src/main/scala/serialization/Serializer.scala rename to akka-actors/src/main/scala/serialization/Serializer.scala diff --git a/kernel/src/main/scala/util/HashCode.scala b/akka-actors/src/main/scala/util/HashCode.scala similarity index 100% rename from kernel/src/main/scala/util/HashCode.scala rename to akka-actors/src/main/scala/util/HashCode.scala diff --git a/kernel/src/main/scala/util/Helpers.scala b/akka-actors/src/main/scala/util/Helpers.scala similarity index 100% rename from kernel/src/main/scala/util/Helpers.scala rename to akka-actors/src/main/scala/util/Helpers.scala diff --git a/kernel/src/main/scala/util/Logging.scala b/akka-actors/src/main/scala/util/Logging.scala similarity index 100% rename from kernel/src/main/scala/util/Logging.scala rename to akka-actors/src/main/scala/util/Logging.scala diff --git a/kernel/src/main/scala/util/ResultOrFailure.scala b/akka-actors/src/main/scala/util/ResultOrFailure.scala similarity index 100% rename from kernel/src/main/scala/util/ResultOrFailure.scala rename to akka-actors/src/main/scala/util/ResultOrFailure.scala diff --git a/kernel/src/main/scala/util/Scheduler.scala b/akka-actors/src/main/scala/util/Scheduler.scala similarity index 100% rename from kernel/src/main/scala/util/Scheduler.scala rename to akka-actors/src/main/scala/util/Scheduler.scala diff --git a/kernel/src/test/scala/ActorSpec.scala b/akka-actors/src/test/scala/ActorSpec.scala similarity index 100% rename from kernel/src/test/scala/ActorSpec.scala rename to akka-actors/src/test/scala/ActorSpec.scala diff --git a/kernel/src/test/scala/AllSuite.scala b/akka-actors/src/test/scala/AllSuite.scala similarity index 100% rename from kernel/src/test/scala/AllSuite.scala rename to akka-actors/src/test/scala/AllSuite.scala diff --git a/kernel/src/test/scala/AllTest.scala b/akka-actors/src/test/scala/AllTest.scala similarity index 100% rename from kernel/src/test/scala/AllTest.scala rename to akka-actors/src/test/scala/AllTest.scala diff --git a/kernel/src/test/scala/CamelSpec.scala b/akka-actors/src/test/scala/CamelSpec.scala similarity index 100% rename from kernel/src/test/scala/CamelSpec.scala rename to akka-actors/src/test/scala/CamelSpec.scala diff --git a/kernel/src/test/scala/EventBasedSingleThreadDispatcherTest.scala b/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala similarity index 100% rename from kernel/src/test/scala/EventBasedSingleThreadDispatcherTest.scala rename to akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala diff --git a/kernel/src/test/scala/EventBasedThreadPoolDispatcherTest.scala b/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala similarity index 100% rename from kernel/src/test/scala/EventBasedThreadPoolDispatcherTest.scala rename to akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala diff --git a/kernel/src/test/scala/InMemoryActorSpec.scala b/akka-actors/src/test/scala/InMemoryActorSpec.scala similarity index 100% rename from kernel/src/test/scala/InMemoryActorSpec.scala rename to akka-actors/src/test/scala/InMemoryActorSpec.scala diff --git a/kernel/src/test/scala/Messages.scala b/akka-actors/src/test/scala/Messages.scala similarity index 100% rename from kernel/src/test/scala/Messages.scala rename to akka-actors/src/test/scala/Messages.scala diff --git a/kernel/src/test/scala/RemoteActorSpec.scala b/akka-actors/src/test/scala/RemoteActorSpec.scala similarity index 100% rename from kernel/src/test/scala/RemoteActorSpec.scala rename to akka-actors/src/test/scala/RemoteActorSpec.scala diff --git a/kernel/src/test/scala/RemoteSupervisorSpec.scala b/akka-actors/src/test/scala/RemoteSupervisorSpec.scala similarity index 100% rename from kernel/src/test/scala/RemoteSupervisorSpec.scala rename to akka-actors/src/test/scala/RemoteSupervisorSpec.scala diff --git a/kernel/src/test/scala/SchedulerSpec.scala b/akka-actors/src/test/scala/SchedulerSpec.scala similarity index 100% rename from kernel/src/test/scala/SchedulerSpec.scala rename to akka-actors/src/test/scala/SchedulerSpec.scala diff --git a/kernel/src/test/scala/SupervisorSpec.scala b/akka-actors/src/test/scala/SupervisorSpec.scala similarity index 100% rename from kernel/src/test/scala/SupervisorSpec.scala rename to akka-actors/src/test/scala/SupervisorSpec.scala diff --git a/kernel/src/test/scala/ThreadBasedDispatcherTest.scala b/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala similarity index 100% rename from kernel/src/test/scala/ThreadBasedDispatcherTest.scala rename to akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala diff --git a/kernel/src/test/scala/TransactionClasherSpec.scala b/akka-actors/src/test/scala/TransactionClasherSpec.scala similarity index 100% rename from kernel/src/test/scala/TransactionClasherSpec.scala rename to akka-actors/src/test/scala/TransactionClasherSpec.scala diff --git a/akka-camel/pom.xml b/akka-camel/pom.xml new file mode 100644 index 0000000000..61529e85af --- /dev/null +++ b/akka-camel/pom.xml @@ -0,0 +1,43 @@ + + 4.0.0 + + akka-camel + Akka Camel Module + + jar + + + akka + se.scalablesolutions.akka + 0.6 + ../pom.xml + + + + + + akka-actors + se.scalablesolutions.akka + 0.6 + + + org.apache.camel + camel-core + 2.0-SNAPSHOT + + + + + + + false + src/main/resources + + META-INF/* + + + + + diff --git a/kernel/src/main/resources/META-INF/services/org/apache/camel/component/akka b/akka-camel/src/main/resources/META-INF/services/org/apache/camel/component/akka similarity index 100% rename from kernel/src/main/resources/META-INF/services/org/apache/camel/component/akka rename to akka-camel/src/main/resources/META-INF/services/org/apache/camel/component/akka diff --git a/kernel/src/main/scala/camel/ActiveObjectComponent.scala b/akka-camel/src/main/scala/ActiveObjectComponent.scala similarity index 100% rename from kernel/src/main/scala/camel/ActiveObjectComponent.scala rename to akka-camel/src/main/scala/ActiveObjectComponent.scala diff --git a/kernel/src/main/scala/camel/ActiveObjectConsumer.scala b/akka-camel/src/main/scala/ActiveObjectConsumer.scala similarity index 100% rename from kernel/src/main/scala/camel/ActiveObjectConsumer.scala rename to akka-camel/src/main/scala/ActiveObjectConsumer.scala diff --git a/kernel/src/main/scala/camel/ActiveObjectEndpoint.scala b/akka-camel/src/main/scala/ActiveObjectEndpoint.scala similarity index 100% rename from kernel/src/main/scala/camel/ActiveObjectEndpoint.scala rename to akka-camel/src/main/scala/ActiveObjectEndpoint.scala diff --git a/kernel/src/main/scala/camel/ActiveObjectProducer.scala b/akka-camel/src/main/scala/ActiveObjectProducer.scala similarity index 100% rename from kernel/src/main/scala/camel/ActiveObjectProducer.scala rename to akka-camel/src/main/scala/ActiveObjectProducer.scala diff --git a/kernel/src/main/scala/camel/MessageDriven.scala b/akka-camel/src/main/scala/MessageDriven.scala similarity index 100% rename from kernel/src/main/scala/camel/MessageDriven.scala rename to akka-camel/src/main/scala/MessageDriven.scala diff --git a/kernel/src/main/scala/camel/SupervisorAwareCamelContext.scala b/akka-camel/src/main/scala/SupervisorAwareCamelContext.scala similarity index 100% rename from kernel/src/main/scala/camel/SupervisorAwareCamelContext.scala rename to akka-camel/src/main/scala/SupervisorAwareCamelContext.scala diff --git a/fun-test-java/pom.xml b/akka-fun-test-java/pom.xml similarity index 100% rename from fun-test-java/pom.xml rename to akka-fun-test-java/pom.xml diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/AllTest.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/AllTest.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/AllTest.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/AllTest.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/Bar.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/Bar.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/Bar.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/Bar.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/BarImpl.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/BarImpl.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/BarImpl.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/BarImpl.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/Ext.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/Ext.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/Ext.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/Ext.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/ExtImpl.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ExtImpl.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/ExtImpl.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ExtImpl.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/Foo.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/Foo.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/Foo.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/Foo.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemFailer.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemFailer.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemFailer.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemFailer.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/JerseyFoo.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/JerseyFoo.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/JerseyFoo.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/JerseyFoo.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistenceManager.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistenceManager.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistenceManager.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistenceManager.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentFailer.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentFailer.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentFailer.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentFailer.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentNestedStateTest.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentNestedStateTest.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentNestedStateTest.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentNestedStateTest.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateTest.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateTest.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateTest.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateTest.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufProtocol.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufProtocol.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufProtocol.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufProtocol.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufProtocol.proto b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufProtocol.proto similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufProtocol.proto rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufProtocol.proto diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufSerializationTest.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufSerializationTest.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufSerializationTest.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ProtobufSerializationTest.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/RemoteInMemoryStateTest.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/RemoteInMemoryStateTest.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/RemoteInMemoryStateTest.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/RemoteInMemoryStateTest.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/RemotePersistentStateTest.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/RemotePersistentStateTest.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/RemotePersistentStateTest.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/RemotePersistentStateTest.java diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/RestTest.java b/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/RestTest.java similarity index 100% rename from fun-test-java/src/test/java/se/scalablesolutions/akka/api/RestTest.java rename to akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/RestTest.java diff --git a/fun-test-java/testng.xml b/akka-fun-test-java/testng.xml similarity index 100% rename from fun-test-java/testng.xml rename to akka-fun-test-java/testng.xml diff --git a/akka-kernel/pom.xml b/akka-kernel/pom.xml new file mode 100644 index 0000000000..4508ab68b6 --- /dev/null +++ b/akka-kernel/pom.xml @@ -0,0 +1,90 @@ + + 4.0.0 + + akka-kernel + Akka Kernel Module + + jar + + + akka + se.scalablesolutions.akka + 0.6 + ../pom.xml + + + + + + akka-actors + se.scalablesolutions.akka + 0.6 + + + + + + + maven-assembly-plugin + 2.2-beta-2 + + + create-executable-jar + install + + single + + + + + jar-with-dependencies + + + + + se.scalablesolutions.akka.kernel.Kernel + + + + + + + + maven-antrun-plugin + + + install + + + + + + + run + + + + + + + + false + ../config + + akka.conf + akka-reference.conf + + + + false + src/main/resources + + META-INF/* + + + + + diff --git a/kernel/src/main/scala/Boot.scala b/akka-kernel/src/main/scala/Boot.scala similarity index 100% rename from kernel/src/main/scala/Boot.scala rename to akka-kernel/src/main/scala/Boot.scala diff --git a/kernel/src/main/scala/Kernel.scala b/akka-kernel/src/main/scala/Kernel.scala similarity index 100% rename from kernel/src/main/scala/Kernel.scala rename to akka-kernel/src/main/scala/Kernel.scala diff --git a/akka-persistence/pom.xml b/akka-persistence/pom.xml new file mode 100644 index 0000000000..ab2c31f66b --- /dev/null +++ b/akka-persistence/pom.xml @@ -0,0 +1,54 @@ + + 4.0.0 + + akka-persistence + Akka Persistence Module + + jar + + + akka + se.scalablesolutions.akka + 0.6 + ../pom.xml + + + + + akka-kernel + se.scalablesolutions.akka + 0.6 + + + + + com.mongodb + mongo + 0.6 + + + + + org.apache.cassandra + cassandra + 0.4.0-trunk + + + com.facebook + thrift + 1.0 + + + com.facebook + fb303 + 1.0 + + + commons-pool + commons-pool + 1.5.1 + + + + diff --git a/kernel/src/main/scala/state/CassandraSession.scala b/akka-persistence/src/main/scala/CassandraSession.scala similarity index 100% rename from kernel/src/main/scala/state/CassandraSession.scala rename to akka-persistence/src/main/scala/CassandraSession.scala diff --git a/kernel/src/main/scala/state/CassandraStorage.scala b/akka-persistence/src/main/scala/CassandraStorage.scala similarity index 100% rename from kernel/src/main/scala/state/CassandraStorage.scala rename to akka-persistence/src/main/scala/CassandraStorage.scala diff --git a/kernel/src/main/scala/state/DataFlowVariable.scala b/akka-persistence/src/main/scala/DataFlowVariable.scala similarity index 100% rename from kernel/src/main/scala/state/DataFlowVariable.scala rename to akka-persistence/src/main/scala/DataFlowVariable.scala diff --git a/kernel/src/main/scala/state/MongoStorage.scala b/akka-persistence/src/main/scala/MongoStorage.scala similarity index 100% rename from kernel/src/main/scala/state/MongoStorage.scala rename to akka-persistence/src/main/scala/MongoStorage.scala diff --git a/kernel/src/main/scala/state/State.scala b/akka-persistence/src/main/scala/PersistentState.scala similarity index 61% rename from kernel/src/main/scala/state/State.scala rename to akka-persistence/src/main/scala/PersistentState.scala index 6e012837d7..b5746ebb12 100644 --- a/kernel/src/main/scala/state/State.scala +++ b/akka-persistence/src/main/scala/PersistentState.scala @@ -11,8 +11,8 @@ import org.codehaus.aspectwerkz.proxy.Uuid import scala.collection.mutable.{ArrayBuffer, HashMap} -sealed abstract class TransactionalStateConfig -abstract class PersistentStorageConfig extends TransactionalStateConfig +sealed abstract class PersistentStateConfig +abstract class PersistentStorageConfig extends PersistentStateConfig case class CassandraStorageConfig extends PersistentStorageConfig case class TerracottaStorageConfig extends PersistentStorageConfig case class TokyoCabinetStorageConfig extends PersistentStorageConfig @@ -23,146 +23,41 @@ case class MongoStorageConfig extends PersistentStorageConfig *

    * Example Scala usage: *

    - * val myMap = TransactionalState.newPersistentMap(CassandraStorageConfig)
    + * val myMap = PersistentState.newMap(CassandraStorageConfig)
      * 
    */ -object TransactionalState extends TransactionalState +object PersistentState extends PersistentState /** * Java API. *

    * Example Java usage: *

    - * TransactionalState state = new TransactionalState();
    - * TransactionalMap myMap = state.newPersistentMap(new CassandraStorageConfig());
    + * PersistentState state = new PersistentState();
    + * TransactionalMap myMap = state.newMap(new CassandraStorageConfig());
      * 
    */ -class TransactionalState { - def newPersistentMap(config: PersistentStorageConfig): TransactionalMap[AnyRef, AnyRef] = config match { +class PersistentState { + def newMap(config: PersistentStorageConfig): TransactionalMap[AnyRef, AnyRef] = config match { case CassandraStorageConfig() => new CassandraPersistentTransactionalMap case MongoStorageConfig() => new MongoPersistentTransactionalMap case TerracottaStorageConfig() => throw new UnsupportedOperationException case TokyoCabinetStorageConfig() => throw new UnsupportedOperationException } - def newPersistentVector(config: PersistentStorageConfig): TransactionalVector[AnyRef] = config match { + def newVector(config: PersistentStorageConfig): TransactionalVector[AnyRef] = config match { case CassandraStorageConfig() => new CassandraPersistentTransactionalVector case MongoStorageConfig() => new MongoPersistentTransactionalVector case TerracottaStorageConfig() => throw new UnsupportedOperationException case TokyoCabinetStorageConfig() => throw new UnsupportedOperationException } - def newPersistentRef(config: PersistentStorageConfig): TransactionalRef[AnyRef] = config match { + def newRef(config: PersistentStorageConfig): TransactionalRef[AnyRef] = config match { case CassandraStorageConfig() => new CassandraPersistentTransactionalRef case MongoStorageConfig() => new MongoPersistentTransactionalRef case TerracottaStorageConfig() => throw new UnsupportedOperationException case TokyoCabinetStorageConfig() => throw new UnsupportedOperationException } - - def newInMemoryMap[K, V]: TransactionalMap[K, V] = new InMemoryTransactionalMap[K, V] - - def newInMemoryVector[T]: TransactionalVector[T] = new InMemoryTransactionalVector[T] - - def newInMemoryRef[T]: TransactionalRef[T] = new TransactionalRef[T] -} - -/** - * @author Jonas Bonér - */ -@serializable -trait Transactional { - // FIXME: won't work across the cluster - val uuid = Uuid.newUuid.toString - - private[kernel] def begin - private[kernel] def commit - private[kernel] def rollback - - protected def verifyTransaction = { - val cflowTx = TransactionManagement.threadBoundTx.get - if (!cflowTx.isDefined) { - throw new IllegalStateException("Can't access transactional reference outside the scope of a transaction [" + this + "]") - } else { - cflowTx.get.register(this) - } - } -} - -/** - * Base trait for all state implementations (persistent or in-memory). - * - * FIXME: Create Java versions using pcollections - * - * @author Jonas Bonér - */ -trait TransactionalMap[K, V] extends Transactional with scala.collection.mutable.Map[K, V] { - override def hashCode: Int = System.identityHashCode(this); - override def equals(other: Any): Boolean = false - def remove(key: K) -} - -/** - * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. - * - * @author Jonas Bonér - */ -class InMemoryTransactionalMap[K, V] extends TransactionalMap[K, V] { - protected[kernel] var state = new HashTrie[K, V] - protected[kernel] var snapshot = state - - // ---- For Transactional ---- - override def begin = snapshot = state - override def commit = snapshot = state - override def rollback = state = snapshot - - // ---- Overriding scala.collection.mutable.Map behavior ---- - override def contains(key: K): Boolean = { - verifyTransaction - state.contains(key) - } - - override def clear = { - verifyTransaction - state = new HashTrie[K, V] - } - - override def size: Int = { - verifyTransaction - state.size - } - - // ---- For scala.collection.mutable.Map ---- - override def remove(key: K) = { - verifyTransaction - state = state - key - } - - override def elements: Iterator[(K, V)] = { -// verifyTransaction - state.elements - } - - override def get(key: K): Option[V] = { - verifyTransaction - state.get(key) - } - - override def put(key: K, value: V): Option[V] = { - verifyTransaction - val oldValue = state.get(key) - state = state.update(key, value) - oldValue - } - - override def -=(key: K) = { - verifyTransaction - remove(key) - } - - override def update(key: K, value: V) = { - verifyTransaction - put(key, value) - } } /** @@ -315,77 +210,6 @@ class MongoPersistentTransactionalMap extends TemplatePersistentTransactionalMap val storage = MongoStorage } -/** - * Base for all transactional vector implementations. - * - * @author Jonas Bonér - */ -abstract class TransactionalVector[T] extends Transactional with RandomAccessSeq[T] { - override def hashCode: Int = System.identityHashCode(this); - override def equals(other: Any): Boolean = false - - def add(elem: T) - - def get(index: Int): T - - def getRange(start: Int, count: Int): List[T] -} - -/** - * Implements an in-memory transactional vector. - * - * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. - * - * @author Jonas Bonér - */ -class InMemoryTransactionalVector[T] extends TransactionalVector[T] { - private[kernel] var state: Vector[T] = EmptyVector - private[kernel] var snapshot = state - - def add(elem: T) = { - verifyTransaction - state = state + elem - } - - def get(index: Int): T = { - verifyTransaction - state(index) - } - - def getRange(start: Int, count: Int): List[T] = { - verifyTransaction - state.slice(start, count).toList.asInstanceOf[List[T]] - } - - // ---- For Transactional ---- - override def begin = snapshot = state - - override def commit = snapshot = state - - override def rollback = state = snapshot - - // ---- For Seq ---- - def length: Int = { - verifyTransaction - state.length - } - - def apply(index: Int): T = { - verifyTransaction - state(index) - } - - override def elements: Iterator[T] = { - //verifyTransaction - state.elements - } - - override def toList: List[T] = { - verifyTransaction - state.toList - } -} - /** * Base class for all persistent transactional vector implementations should extend. * Implements a Unit of Work, records changes into a change set. @@ -475,45 +299,7 @@ class CassandraPersistentTransactionalVector extends TemplatePersistentTransacti */ class MongoPersistentTransactionalVector extends TemplatePersistentTransactionalVector { val storage = MongoStorage -} - -/** - * Implements a transactional reference. - * - * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. - * - * @author Jonas Bonér - */ -class TransactionalRef[T] extends Transactional { - private[kernel] var ref: Option[T] = None - private[kernel] var snapshot: Option[T] = None - - override def begin = if (ref.isDefined) snapshot = Some(ref.get) - - override def commit = if (ref.isDefined) snapshot = Some(ref.get) - - override def rollback = if (snapshot.isDefined) ref = Some(snapshot.get) - - def swap(elem: T) = { - verifyTransaction - ref = Some(elem) - } - - def get: Option[T] = { - verifyTransaction - ref - } - - def getOrElse(default: => T): T = { - verifyTransaction - ref.getOrElse(default) - } - - def isDefined: Boolean = { - verifyTransaction - ref.isDefined - } -} +} abstract class TemplatePersistentTransactionalRef extends TransactionalRef[AnyRef] { val storage: RefStorage diff --git a/kernel/src/main/scala/state/Pool.scala b/akka-persistence/src/main/scala/Pool.scala similarity index 100% rename from kernel/src/main/scala/state/Pool.scala rename to akka-persistence/src/main/scala/Pool.scala diff --git a/kernel/src/main/scala/state/Storage.scala b/akka-persistence/src/main/scala/Storage.scala similarity index 100% rename from kernel/src/main/scala/state/Storage.scala rename to akka-persistence/src/main/scala/Storage.scala diff --git a/kernel/src/test/scala/MongoPersistentActorSpec.scala b/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala similarity index 100% rename from kernel/src/test/scala/MongoPersistentActorSpec.scala rename to akka-persistence/src/test/scala/MongoPersistentActorSpec.scala diff --git a/kernel/src/test/scala/MongoStorageSpec.scala b/akka-persistence/src/test/scala/MongoStorageSpec.scala similarity index 100% rename from kernel/src/test/scala/MongoStorageSpec.scala rename to akka-persistence/src/test/scala/MongoStorageSpec.scala diff --git a/kernel/src/test/scala/PersistentActorSpec.scala b/akka-persistence/src/test/scala/PersistentActorSpec.scala similarity index 100% rename from kernel/src/test/scala/PersistentActorSpec.scala rename to akka-persistence/src/test/scala/PersistentActorSpec.scala diff --git a/akka-rest/pom.xml b/akka-rest/pom.xml new file mode 100644 index 0000000000..b79694aaeb --- /dev/null +++ b/akka-rest/pom.xml @@ -0,0 +1,68 @@ + + 4.0.0 + + akka-rest + Akka REST Module + + jar + + + akka + se.scalablesolutions.akka + 0.6 + ../pom.xml + + + + + + akka-actors + se.scalablesolutions.akka + 0.6 + + + + + com.sun.grizzly + grizzly-comet-webserver + 1.8.6.3 + + + com.sun.jersey + jersey-server + 1.1.1-ea + + + com.sun.jersey + jersey-json + 1.1.1-ea + + + javax.ws.rs + jsr311-api + 1.0 + + + com.sun.jersey.contribs + jersey-scala + 1.1.2-ea-SNAPSHOT + + + org.atmosphere + atmosphere-core + 0.3 + + + org.atmosphere + atmosphere-portable-runtime + 0.3 + + + org.atmosphere + atmosphere-compat + 0.3 + + + diff --git a/kernel/src/main/scala/rest/ActorComponentProvider.scala b/akka-rest/src/main/scala/ActorComponentProvider.scala similarity index 100% rename from kernel/src/main/scala/rest/ActorComponentProvider.scala rename to akka-rest/src/main/scala/ActorComponentProvider.scala diff --git a/kernel/src/main/scala/rest/ActorComponentProviderFactory.scala b/akka-rest/src/main/scala/ActorComponentProviderFactory.scala similarity index 100% rename from kernel/src/main/scala/rest/ActorComponentProviderFactory.scala rename to akka-rest/src/main/scala/ActorComponentProviderFactory.scala diff --git a/kernel/src/main/scala/rest/AkkaServlet.scala b/akka-rest/src/main/scala/AkkaServlet.scala similarity index 100% rename from kernel/src/main/scala/rest/AkkaServlet.scala rename to akka-rest/src/main/scala/AkkaServlet.scala diff --git a/kernel/src/main/scala/rest/NodeWriter.scala b/akka-rest/src/main/scala/NodeWriter.scala similarity index 100% rename from kernel/src/main/scala/rest/NodeWriter.scala rename to akka-rest/src/main/scala/NodeWriter.scala diff --git a/samples-java/pom.xml b/akka-samples-java/pom.xml similarity index 100% rename from samples-java/pom.xml rename to akka-samples-java/pom.xml diff --git a/samples-java/src/main/java/sample/java/Boot.java b/akka-samples-java/src/main/java/sample/java/Boot.java similarity index 100% rename from samples-java/src/main/java/sample/java/Boot.java rename to akka-samples-java/src/main/java/sample/java/Boot.java diff --git a/samples-java/src/main/java/sample/java/PersistentSimpleService.java b/akka-samples-java/src/main/java/sample/java/PersistentSimpleService.java similarity index 100% rename from samples-java/src/main/java/sample/java/PersistentSimpleService.java rename to akka-samples-java/src/main/java/sample/java/PersistentSimpleService.java diff --git a/samples-java/src/main/java/sample/java/SimpleService.java b/akka-samples-java/src/main/java/sample/java/SimpleService.java similarity index 100% rename from samples-java/src/main/java/sample/java/SimpleService.java rename to akka-samples-java/src/main/java/sample/java/SimpleService.java diff --git a/samples-lift/config/akka.conf b/akka-samples-lift/config/akka.conf similarity index 100% rename from samples-lift/config/akka.conf rename to akka-samples-lift/config/akka.conf diff --git a/samples-lift/pom.xml b/akka-samples-lift/pom.xml similarity index 100% rename from samples-lift/pom.xml rename to akka-samples-lift/pom.xml diff --git a/samples-lift/src/main/scala/akka/SimpleService.scala b/akka-samples-lift/src/main/scala/akka/SimpleService.scala similarity index 100% rename from samples-lift/src/main/scala/akka/SimpleService.scala rename to akka-samples-lift/src/main/scala/akka/SimpleService.scala diff --git a/samples-lift/src/main/scala/bootstrap/liftweb/Boot.scala b/akka-samples-lift/src/main/scala/bootstrap/liftweb/Boot.scala similarity index 100% rename from samples-lift/src/main/scala/bootstrap/liftweb/Boot.scala rename to akka-samples-lift/src/main/scala/bootstrap/liftweb/Boot.scala diff --git a/samples-lift/src/main/scala/comet/.keep b/akka-samples-lift/src/main/scala/comet/.keep similarity index 100% rename from samples-lift/src/main/scala/comet/.keep rename to akka-samples-lift/src/main/scala/comet/.keep diff --git a/samples-lift/src/main/scala/model/.keep b/akka-samples-lift/src/main/scala/model/.keep similarity index 100% rename from samples-lift/src/main/scala/model/.keep rename to akka-samples-lift/src/main/scala/model/.keep diff --git a/samples-lift/src/main/scala/snippet/.keep b/akka-samples-lift/src/main/scala/snippet/.keep similarity index 100% rename from samples-lift/src/main/scala/snippet/.keep rename to akka-samples-lift/src/main/scala/snippet/.keep diff --git a/samples-lift/src/main/scala/snippet/HelloWorld.scala b/akka-samples-lift/src/main/scala/snippet/HelloWorld.scala similarity index 100% rename from samples-lift/src/main/scala/snippet/HelloWorld.scala rename to akka-samples-lift/src/main/scala/snippet/HelloWorld.scala diff --git a/samples-lift/src/main/scala/view/.keep b/akka-samples-lift/src/main/scala/view/.keep similarity index 100% rename from samples-lift/src/main/scala/view/.keep rename to akka-samples-lift/src/main/scala/view/.keep diff --git a/samples-lift/src/main/webapp/index.html b/akka-samples-lift/src/main/webapp/index.html similarity index 100% rename from samples-lift/src/main/webapp/index.html rename to akka-samples-lift/src/main/webapp/index.html diff --git a/samples-lift/src/main/webapp/templates-hidden/default.html b/akka-samples-lift/src/main/webapp/templates-hidden/default.html similarity index 100% rename from samples-lift/src/main/webapp/templates-hidden/default.html rename to akka-samples-lift/src/main/webapp/templates-hidden/default.html diff --git a/samples-lift/src/test/scala/LiftConsole.scala b/akka-samples-lift/src/test/scala/LiftConsole.scala similarity index 100% rename from samples-lift/src/test/scala/LiftConsole.scala rename to akka-samples-lift/src/test/scala/LiftConsole.scala diff --git a/samples-lift/src/test/scala/RunWebApp.scala b/akka-samples-lift/src/test/scala/RunWebApp.scala similarity index 100% rename from samples-lift/src/test/scala/RunWebApp.scala rename to akka-samples-lift/src/test/scala/RunWebApp.scala diff --git a/samples-scala/pom.xml b/akka-samples-scala/pom.xml similarity index 100% rename from samples-scala/pom.xml rename to akka-samples-scala/pom.xml diff --git a/samples-scala/src/main/scala/SimpleService.scala b/akka-samples-scala/src/main/scala/SimpleService.scala similarity index 100% rename from samples-scala/src/main/scala/SimpleService.scala rename to akka-samples-scala/src/main/scala/SimpleService.scala diff --git a/akka-stm/pom.xml b/akka-stm/pom.xml new file mode 100644 index 0000000000..12da6ab9d0 --- /dev/null +++ b/akka-stm/pom.xml @@ -0,0 +1,95 @@ + + 4.0.0 + + akka-kernel + Akka Kernel Module + + jar + + + akka + se.scalablesolutions.akka + 0.6 + ../pom.xml + + + + + + akka-actors + se.scalablesolutions.akka + 0.6 + + + org.apache + zookeeper + 3.1.0 + + + + + + + maven-assembly-plugin + 2.2-beta-2 + + + create-executable-jar + install + + single + + + + + jar-with-dependencies + + + + + se.scalablesolutions.akka.kernel.Kernel + + + + + + + + maven-antrun-plugin + + + install + + + + + + + run + + + + + + + + false + ../config + + akka.conf + akka-reference.conf + + + + false + src/main/resources + + META-INF/* + + + + + diff --git a/kernel/src/main/scala/stm/ChangeSet.scala b/akka-stm/src/main/scala/ChangeSet.scala similarity index 100% rename from kernel/src/main/scala/stm/ChangeSet.scala rename to akka-stm/src/main/scala/ChangeSet.scala diff --git a/kernel/src/main/scala/collection/HashTrie.scala b/akka-stm/src/main/scala/HashTrie.scala similarity index 100% rename from kernel/src/main/scala/collection/HashTrie.scala rename to akka-stm/src/main/scala/HashTrie.scala diff --git a/kernel/src/main/scala/stm/Transaction.scala b/akka-stm/src/main/scala/Transaction.scala similarity index 100% rename from kernel/src/main/scala/stm/Transaction.scala rename to akka-stm/src/main/scala/Transaction.scala diff --git a/kernel/src/main/scala/stm/TransactionManagement.scala b/akka-stm/src/main/scala/TransactionManagement.scala similarity index 100% rename from kernel/src/main/scala/stm/TransactionManagement.scala rename to akka-stm/src/main/scala/TransactionManagement.scala diff --git a/kernel/src/main/scala/stm/TransactionWatcher.scala b/akka-stm/src/main/scala/TransactionWatcher.scala similarity index 100% rename from kernel/src/main/scala/stm/TransactionWatcher.scala rename to akka-stm/src/main/scala/TransactionWatcher.scala diff --git a/akka-stm/src/main/scala/TransactionalState.scala b/akka-stm/src/main/scala/TransactionalState.scala new file mode 100644 index 0000000000..266070f15b --- /dev/null +++ b/akka-stm/src/main/scala/TransactionalState.scala @@ -0,0 +1,245 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel.state + +import kernel.stm.TransactionManagement +import akka.collection._ + +import org.codehaus.aspectwerkz.proxy.Uuid + +import scala.collection.mutable.{ArrayBuffer, HashMap} + +/** + * Scala API. + *

    + * Example Scala usage: + *

    + * val myMap = TransactionalState.newMap
    + * 
    + */ +object TransactionalState extends TransactionalState + +/** + * Java API. + *

    + * Example Java usage: + *

    + * TransactionalState state = new TransactionalState();
    + * TransactionalMap myMap = state.newMap();
    + * 
    + */ +class TransactionalState { + def newMap[K, V]: TransactionalMap[K, V] = new InMemoryTransactionalMap[K, V] + def newVector[T]: TransactionalVector[T] = new InMemoryTransactionalVector[T] + def newRef[T]: TransactionalRef[T] = new TransactionalRef[T] +} + +/** + * @author Jonas Bonér + */ +@serializable +trait Transactional { + // FIXME: won't work across the cluster + val uuid = Uuid.newUuid.toString + + private[kernel] def begin + private[kernel] def commit + private[kernel] def rollback + + protected def verifyTransaction = { + val cflowTx = TransactionManagement.threadBoundTx.get + if (!cflowTx.isDefined) { + throw new IllegalStateException("Can't access transactional reference outside the scope of a transaction [" + this + "]") + } else { + cflowTx.get.register(this) + } + } +} + +/** + * Base trait for all state implementations (persistent or in-memory). + * + * FIXME: Create Java versions using pcollections + * + * @author Jonas Bonér + */ +trait TransactionalMap[K, V] extends Transactional with scala.collection.mutable.Map[K, V] { + override def hashCode: Int = System.identityHashCode(this); + override def equals(other: Any): Boolean = false + def remove(key: K) +} + +/** + * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. + * + * @author Jonas Bonér + */ +class InMemoryTransactionalMap[K, V] extends TransactionalMap[K, V] { + protected[kernel] var state = new HashTrie[K, V] + protected[kernel] var snapshot = state + + // ---- For Transactional ---- + override def begin = snapshot = state + override def commit = snapshot = state + override def rollback = state = snapshot + + // ---- Overriding scala.collection.mutable.Map behavior ---- + override def contains(key: K): Boolean = { + verifyTransaction + state.contains(key) + } + + override def clear = { + verifyTransaction + state = new HashTrie[K, V] + } + + override def size: Int = { + verifyTransaction + state.size + } + + // ---- For scala.collection.mutable.Map ---- + override def remove(key: K) = { + verifyTransaction + state = state - key + } + + override def elements: Iterator[(K, V)] = { +// verifyTransaction + state.elements + } + + override def get(key: K): Option[V] = { + verifyTransaction + state.get(key) + } + + override def put(key: K, value: V): Option[V] = { + verifyTransaction + val oldValue = state.get(key) + state = state.update(key, value) + oldValue + } + + override def -=(key: K) = { + verifyTransaction + remove(key) + } + + override def update(key: K, value: V) = { + verifyTransaction + put(key, value) + } +} + +/** + * Base for all transactional vector implementations. + * + * @author Jonas Bonér + */ +abstract class TransactionalVector[T] extends Transactional with RandomAccessSeq[T] { + override def hashCode: Int = System.identityHashCode(this); + override def equals(other: Any): Boolean = false + + def add(elem: T) + + def get(index: Int): T + + def getRange(start: Int, count: Int): List[T] +} + +/** + * Implements an in-memory transactional vector. + * + * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. + * + * @author Jonas Bonér + */ +class InMemoryTransactionalVector[T] extends TransactionalVector[T] { + private[kernel] var state: Vector[T] = EmptyVector + private[kernel] var snapshot = state + + def add(elem: T) = { + verifyTransaction + state = state + elem + } + + def get(index: Int): T = { + verifyTransaction + state(index) + } + + def getRange(start: Int, count: Int): List[T] = { + verifyTransaction + state.slice(start, count).toList.asInstanceOf[List[T]] + } + + // ---- For Transactional ---- + override def begin = snapshot = state + + override def commit = snapshot = state + + override def rollback = state = snapshot + + // ---- For Seq ---- + def length: Int = { + verifyTransaction + state.length + } + + def apply(index: Int): T = { + verifyTransaction + state(index) + } + + override def elements: Iterator[T] = { + //verifyTransaction + state.elements + } + + override def toList: List[T] = { + verifyTransaction + state.toList + } +} + +/** + * Implements a transactional reference. + * + * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. + * + * @author Jonas Bonér + */ +class TransactionalRef[T] extends Transactional { + private[kernel] var ref: Option[T] = None + private[kernel] var snapshot: Option[T] = None + + override def begin = if (ref.isDefined) snapshot = Some(ref.get) + + override def commit = if (ref.isDefined) snapshot = Some(ref.get) + + override def rollback = if (snapshot.isDefined) ref = Some(snapshot.get) + + def swap(elem: T) = { + verifyTransaction + ref = Some(elem) + } + + def get: Option[T] = { + verifyTransaction + ref + } + + def getOrElse(default: => T): T = { + verifyTransaction + ref.getOrElse(default) + } + + def isDefined: Boolean = { + verifyTransaction + ref.isDefined + } +} diff --git a/kernel/src/main/scala/collection/Vector.scala b/akka-stm/src/main/scala/Vector.scala similarity index 100% rename from kernel/src/main/scala/collection/Vector.scala rename to akka-stm/src/main/scala/Vector.scala diff --git a/util-java/pom.xml b/akka-util-java/pom.xml similarity index 100% rename from util-java/pom.xml rename to akka-util-java/pom.xml diff --git a/util-java/src/main/java/se/scalablesolutions/akka/annotation/configuration.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/configuration.java similarity index 100% rename from util-java/src/main/java/se/scalablesolutions/akka/annotation/configuration.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/configuration.java diff --git a/util-java/src/main/java/se/scalablesolutions/akka/annotation/immutable.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/immutable.java similarity index 100% rename from util-java/src/main/java/se/scalablesolutions/akka/annotation/immutable.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/immutable.java diff --git a/util-java/src/main/java/se/scalablesolutions/akka/annotation/oneway.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/oneway.java similarity index 100% rename from util-java/src/main/java/se/scalablesolutions/akka/annotation/oneway.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/oneway.java diff --git a/util-java/src/main/java/se/scalablesolutions/akka/annotation/postrestart.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/postrestart.java similarity index 100% rename from util-java/src/main/java/se/scalablesolutions/akka/annotation/postrestart.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/postrestart.java diff --git a/util-java/src/main/java/se/scalablesolutions/akka/annotation/prerestart.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/prerestart.java similarity index 100% rename from util-java/src/main/java/se/scalablesolutions/akka/annotation/prerestart.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/prerestart.java diff --git a/util-java/src/main/java/se/scalablesolutions/akka/annotation/state.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/state.java similarity index 100% rename from util-java/src/main/java/se/scalablesolutions/akka/annotation/state.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/state.java diff --git a/util-java/src/main/java/se/scalablesolutions/akka/annotation/transactionrequired.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/transactionrequired.java similarity index 100% rename from util-java/src/main/java/se/scalablesolutions/akka/annotation/transactionrequired.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/transactionrequired.java diff --git a/util-java/src/main/java/se/scalablesolutions/akka/kernel/config/ActiveObjectGuiceModule.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/config/ActiveObjectGuiceModule.java similarity index 100% rename from util-java/src/main/java/se/scalablesolutions/akka/kernel/config/ActiveObjectGuiceModule.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/config/ActiveObjectGuiceModule.java diff --git a/util-java/src/main/java/se/scalablesolutions/akka/kernel/config/DependencyBinding.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/config/DependencyBinding.java similarity index 100% rename from util-java/src/main/java/se/scalablesolutions/akka/kernel/config/DependencyBinding.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/config/DependencyBinding.java diff --git a/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java similarity index 100% rename from util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java diff --git a/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto b/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto similarity index 100% rename from util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto rename to akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto diff --git a/akka.ipr b/akka.ipr index 175d776ea3..068b33fd4c 100644 --- a/akka.ipr +++ b/akka.ipr @@ -503,13 +503,17 @@ + - - - - - - + + + + + + + + + @@ -542,17 +546,6 @@ - - - - - - - - - - - @@ -597,17 +590,6 @@ - - - - - - - - - - - @@ -663,6 +645,386 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -696,15 +1058,15 @@ - + - + - + - + @@ -795,6 +1157,17 @@ + + + + + + + + + + + @@ -817,17 +1190,6 @@ - - - - - - - - - - - @@ -861,6 +1223,17 @@ + + + + + + + + + + + @@ -905,39 +1278,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -971,37 +1311,26 @@ - + - + - + - + - + - + - + - - - - - - - - - - - - + @@ -1026,137 +1355,92 @@ - + - + - + - + - + - - + - - + - - + - + - + - + - + - + - + - + - + - + - - - - + - - - - + - - - - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1170,15 +1454,59 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1280,28 +1608,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -1346,6 +1652,28 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -1379,319 +1707,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/akka.iws b/akka.iws index 9fc47e8b25..1d9fcc5852 100644 --- a/akka.iws +++ b/akka.iws @@ -2,23 +2,155 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -69,89 +201,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -212,7 +262,7 @@
    - - - - - - - @@ -730,34 +547,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -765,34 +554,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    diff --git a/changes.xml b/changes.xml index 80382698a0..5b13aabcba 100644 --- a/changes.xml +++ b/changes.xml @@ -1,47 +1,51 @@ - - - - Akka Release Notes - - - - - MongoDB as Akka storage backend - Support for using the Lift Web framework with Actors - Support for using Scala XML tags in RESTful Actors (scala-jersey) - Support for Comet Actors using Atmosphere - Statistics recorder with JMX and REST APIs - Management service with JMX and REST APIs - JSON serialization for Java objects (using Jackson) - JSON serialization for Scala objects (using scala-json) - Protobuf serialization for Java and Scala objects - SBinary serialization for Scala objects - Protobuf as remote protocol - Added CassandraSession API (with socket pooling) wrapping Cassandra's Thrift API in Scala and Java APIs - CassandraStorage is now works with external Cassandra cluster - Removed embedded Cassandra mode - Removed startup scripts and lib dir - ActorRegistry for retrieving Actor instances - Now start up kernel with 'java -jar dist/akka-0.6.jar' - Concurrent mode is now per actor basis - Made Akka Web App aware, does not require AKKA_HOME when using it as a library - Fixed dispatcher bug - Cleaned up Maven scripts and distribution in general - Added mailing list: akka-user@googlegroups.com - Improved and restructured documentation - New URL: http://akkasource.org - - - + + + + Akka Release Notes + + + + + MongoDB as Akka storage backend + New transparent JSON serialization of Scala objects based on sjson + MongoDB backed actor example + Support for using the Lift Web framework with Actors + Security module for authentication and authorization + Support for using Scala XML tags in RESTful Actors (scala-jersey) + Support for Comet Actors using Atmosphere + AMQP module; abstracted as an Actor + Modularization of distribution into core and submodules + JSON serialization for Java objects (using Jackson) + JSON serialization for Scala objects (using scala-json) + Protobuf serialization for Java and Scala objects + SBinary serialization for Scala objects + Protobuf as remote protocol + Added CassandraSession API (with socket pooling) wrapping Cassandra's Thrift API in Scala and Java APIs + CassandraStorage is now works with external Cassandra cluster + Removed embedded Cassandra mode + Removed startup scripts and lib dir + ActorRegistry for retrieving Actor instances + SchedulerActor for scheduling periodic tasks + Now start up kernel with 'java -jar dist/akka-0.6.jar' + Concurrent mode is now per actor basis + Made Akka Web App aware, does not require AKKA_HOME when using it as a library + Fixed dispatcher bug + Cleaned up Maven scripts and distribution in general + Added mailing list: akka-user@googlegroups.com + Improved and restructured documentation + New URL: http://akkasource.org + + + \ No newline at end of file diff --git a/fun-test-java/akka-fun-test-java.iml b/fun-test-java/akka-fun-test-java.iml deleted file mode 100644 index e09beb736b..0000000000 --- a/fun-test-java/akka-fun-test-java.iml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/kernel/akka-kernel.iml b/kernel/akka-kernel.iml deleted file mode 100644 index 807760933a..0000000000 --- a/kernel/akka-kernel.iml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/kernel/kernel.iml b/kernel/kernel.iml deleted file mode 100755 index 49b183109e..0000000000 --- a/kernel/kernel.iml +++ /dev/null @@ -1,667 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pom.xml b/pom.xml index 5027ea5923..c6f237274d 100644 --- a/pom.xml +++ b/pom.xml @@ -18,13 +18,17 @@ - util-java - kernel + akka-util-java + akka-actors + akka-stm + akka-persistence + akka-rest + akka-camel akka-amqp - fun-test-java - samples-scala - samples-lift - samples-java + akka-fun-test-java + akka-samples-scala + akka-samples-lift + akka-samples-java diff --git a/samples-java/akka-samples-java.iml b/samples-java/akka-samples-java.iml deleted file mode 100644 index 97ec95ec37..0000000000 --- a/samples-java/akka-samples-java.iml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples-lift/akka-samples-lift.iml b/samples-lift/akka-samples-lift.iml deleted file mode 100644 index 5b3e6a796f..0000000000 --- a/samples-lift/akka-samples-lift.iml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples-lift/src/main/webapp/WEB-INF/web.xml b/samples-lift/src/main/webapp/WEB-INF/web.xml deleted file mode 100755 index d474da1ca1..0000000000 --- a/samples-lift/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - LiftFilter - Lift Filter - The Filter that intercepts lift calls - net.liftweb.http.LiftFilter - - - LiftFilter - /* - - - AkkaServlet - se.scalablesolutions.akka.kernel.rest.AkkaServlet - - - AkkaServlet - /* - - diff --git a/samples-scala/akka-samples-scala.iml b/samples-scala/akka-samples-scala.iml deleted file mode 100644 index f88fe93371..0000000000 --- a/samples-scala/akka-samples-scala.iml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/util-java/akka-util-java.iml b/util-java/akka-util-java.iml deleted file mode 100644 index a80717f779..0000000000 --- a/util-java/akka-util-java.iml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/util-java/util-java.iml b/util-java/util-java.iml deleted file mode 100755 index 52ffb49a05..0000000000 --- a/util-java/util-java.iml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From d3374f435ed41dda16eeabf14df6282ee98ccccf Mon Sep 17 00:00:00 2001 From: jboner Date: Tue, 1 Sep 2009 13:19:54 +0200 Subject: [PATCH 21/35] enhanced AMQP impl with error handling and more... --- akka-amqp/pom.xml | 7 +- akka-amqp/src/main/scala/AMQP.scala | 131 ++- akka.ipr | 1170 +++++++++++++------------- akka.iws | 746 ++++++++-------- fun-test-java/akka-fun-test-java.iml | 85 -- kernel/akka-kernel.iml | 95 --- samples-java/akka-samples-java.iml | 78 -- samples-lift/akka-samples-lift.iml | 96 --- samples-scala/akka-samples-scala.iml | 83 -- util-java/akka-util-java.iml | 17 - 10 files changed, 1096 insertions(+), 1412 deletions(-) delete mode 100644 fun-test-java/akka-fun-test-java.iml delete mode 100644 kernel/akka-kernel.iml delete mode 100644 samples-java/akka-samples-java.iml delete mode 100644 samples-lift/akka-samples-lift.iml delete mode 100644 samples-scala/akka-samples-scala.iml delete mode 100644 util-java/akka-util-java.iml diff --git a/akka-amqp/pom.xml b/akka-amqp/pom.xml index 5e67d7a046..06a15a41a1 100644 --- a/akka-amqp/pom.xml +++ b/akka-amqp/pom.xml @@ -20,11 +20,16 @@ se.scalablesolutions.akka 0.6 - + com.rabbitmq rabbitmq-client 0.9.1 + + commons-io + commons-io + 1.4 + diff --git a/akka-amqp/src/main/scala/AMQP.scala b/akka-amqp/src/main/scala/AMQP.scala index faf271059c..43bcf82959 100644 --- a/akka-amqp/src/main/scala/AMQP.scala +++ b/akka-amqp/src/main/scala/AMQP.scala @@ -8,17 +8,60 @@ import java.lang.String import rabbitmq.client.{AMQP => RabbitMQ, _} import rabbitmq.client.ConnectionFactory -import se.scalablesolutions.akka.kernel.Kernel import se.scalablesolutions.akka.kernel.actor.Actor +import se.scalablesolutions.akka.kernel.util.Logging import se.scalablesolutions.akka.serialization.Serializer import java.util.{Timer, TimerTask} +/** + * AMQP Actor API. Implements Client and Endpoint materialized as Actors. + * + *
    + *   val messageConsumer = new Actor() {
    + *     def receive: PartialFunction[Any, Unit] = {
    + *       case Message(payload) => log.debug("Received message: %s", payload)
    + *     }
    + *   }
    + *   messageConsumer.start
    + *
    + *   val endpoint = new Endpoint(
    + *     new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, QUEUE, ROUTING_KEY, ExchangeType.Direct, Serializer.Java)
    + *   endpoint.start
    + *
    + *   // register message consumer
    + *   endpoint ! MessageConsumer(messageConsumer)
    + *
    + *   val client = new Client(new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, ROUTING_KEY, Serializer.Java, None)
    + *   client.start
    + *   client ! Message("Hi")
    + * 
    + * + * @author Jonas Bonér + */ object AMQP { case class Message(val payload: AnyRef) case class MessageConsumer(val listener: Actor) case class Reconnect(val delay: Long) + class MessageNotDeliveredException(message: String) extends RuntimeException(message) + + sealed trait ExchangeType + object ExchangeType { + case object Direct extends ExchangeType { + override def toString = "direct" + } + case object Topic extends ExchangeType { + override def toString = "topic" + } + case object Fanout extends ExchangeType { + override def toString = "fanout" + } + case object Match extends ExchangeType { + override def toString = "match" + } + } + /** * AMQP client actor. * Usage: @@ -28,7 +71,7 @@ object AMQP { * params.setPassword("obama") * params.setVirtualHost("/") * params.setRequestedHeartbeat(0) - * val client = new AMQP.Client(new ConnectionFactory(params), "localhost", 9889, "exchangeKey", "routingKey", Serializer.Java) + * val client = new AMQP.Client(new ConnectionFactory(params), "localhost", 5672, "exchangeName", "routingKey", Serializer.Java, None) * client.start * client ! Message("hi") *
    @@ -41,9 +84,28 @@ object AMQP { port: Int, exchangeKey: String, routingKey: String, - serializer: Serializer) extends Actor { + serializer: Serializer, + returnListener: Option[ReturnListener]) extends Actor { private val connection = connectionFactory.newConnection(hostname, port) private val channel = connection.createChannel + returnListener match { + case Some(listener) => channel.setReturnListener(listener) + case None => channel.setReturnListener(new ReturnListener() { + def handleBasicReturn( + replyCode: Int, + replyText: String, + exchange: String, + routingKey: String, + properties: RabbitMQ.BasicProperties, + body: Array[Byte]) = { + throw new MessageNotDeliveredException( + "Could not deliver message [" + replyText + + "] with reply code [" + replyCode + + "] and routing key [" + routingKey + + "] to exchange [" + exchange + "]") + } + }) + } def receive: PartialFunction[Any, Unit] = { case Message(msg: AnyRef) => send(msg) @@ -55,26 +117,50 @@ object AMQP { /** * @author Jonas Bonér */ - abstract class Endpoint(connectionFactory: ConnectionFactory, hostname: String, port: Int) extends Actor { + class Endpoint( + connectionFactory: ConnectionFactory, + hostname: String, + port: Int, + exchangeName: String, + queueName: String, + routingKey: String, + exchangeType: ExchangeType, + serializer: Serializer) extends Actor { private var connection = connectionFactory.newConnection(hostname, port) private var channel = connection.createChannel private val reconnectionTimer = new Timer private var listeners: List[Actor] = Nil private val endpoint = this + setupChannel - def init(channel: Channel) + private def setupChannel = { + channel.exchangeDeclare(exchangeName, exchangeType.toString) + channel.queueDeclare(queueName) + channel.queueBind(queueName, exchangeName, routingKey) + channel.basicConsume(queueName, false, new DefaultConsumer(channel) with Logging { + override def handleDelivery( + tag: String, + envelope: Envelope, + properties: RabbitMQ.BasicProperties, + payload: Array[Byte]) { + endpoint ! Message(serializer.in(payload, None)) + channel.basicAck(envelope.getDeliveryTag, false) + } + }) + } def receive: PartialFunction[Any, Unit] = { case message: Message => listeners.foreach(_ ! message) case MessageConsumer(listener) => listeners ::= listener case Reconnect(delay) => reconnect(delay) - case unknown => throw new IllegalArgumentException("Unknown message to AMQP dispatcher [" + unknown + "]") + case unknown => throw new IllegalArgumentException("Unknown message to AMQP Endpoint [" + unknown + "]") } private def reconnect(delay: Long) = { try { connection = connectionFactory.newConnection(hostname, port) channel = connection.createChannel + setupChannel log.debug("Successfully reconnected to AMQP Server") } catch { case e: Exception => @@ -90,44 +176,29 @@ object ExampleAMQPSession { def main(args: Array[String]) = { import AMQP._ val CONFIG = new ConnectionParameters - CONFIG.setUsername("barack") - CONFIG.setPassword("obama") - CONFIG.setVirtualHost("/") - CONFIG.setRequestedHeartbeat(0) - val EXCHANGE = "whitehouse.gov" - val QUEUE = "marketing" - val ROUTING_KEY = "newsletter" + val QUEUE = "twitter" + val ROUTING_KEY = "@barack_obama" val HOSTNAME = "localhost" - val PORT = 8787 + val PORT = 5672 val SERIALIZER = Serializer.Java val messageConsumer = new Actor() { def receive: PartialFunction[Any, Unit] = { - case Message(payload) => println("Received message: " + payload) + case Message(payload) => log.debug("Received message: %s", payload) } } messageConsumer.start - val endpoint = new Endpoint(new ConnectionFactory(CONFIG), HOSTNAME, PORT) { - override def init(channel: Channel) = { - channel.exchangeDeclare(EXCHANGE, "direct") - channel.queueDeclare(QUEUE) - channel.queueBind(QUEUE, EXCHANGE, ROUTING_KEY) - channel.basicConsume(QUEUE, false, new DefaultConsumer(channel) { - override def handleDelivery(tag: String, envelope: Envelope, properties: RabbitMQ.BasicProperties, payload: Array[Byte]) { - messageConsumer ! Message(SERIALIZER.in(payload, None)) - channel.basicAck(envelope.getDeliveryTag, false) - } - }) - } - } + val endpoint = new Endpoint( + new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, QUEUE, ROUTING_KEY, ExchangeType.Direct, SERIALIZER) endpoint.start + // register message consumer endpoint ! MessageConsumer(messageConsumer) - val client = new Client(new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, ROUTING_KEY, SERIALIZER) + val client = new Client(new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, ROUTING_KEY, SERIALIZER, None) client.start - client ! Message("The President: I'm going surfing") + client ! Message(ROUTING_KEY + " I'm going surfing") } } \ No newline at end of file diff --git a/akka.ipr b/akka.ipr index 175d776ea3..3e6d55e9a9 100644 --- a/akka.ipr +++ b/akka.ipr @@ -542,17 +542,6 @@ - - - - - - - - - - - @@ -597,17 +586,6 @@ - - - - - - - - - - - @@ -663,248 +641,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -938,50 +674,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1004,28 +696,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -1062,17 +732,6 @@ - - - - - - - - - - - @@ -1104,17 +763,6 @@ - - - - - - - - - - - @@ -1159,17 +807,6 @@ - - - - - - - - - - - @@ -1181,6 +818,319 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1269,6 +1219,17 @@ + + + + + + + + + + + @@ -1280,28 +1241,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -1324,6 +1263,17 @@ + + + + + + + + + + + @@ -1346,6 +1296,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1379,6 +1362,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1445,6 +1648,17 @@ + + + + + + + + + + + @@ -1500,196 +1714,26 @@ - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/akka.iws b/akka.iws index 9fc47e8b25..84dc45b7bb 100644 --- a/akka.iws +++ b/akka.iws @@ -2,23 +2,19 @@ - - - - + + + + + + + - - - - - - - - + @@ -70,82 +66,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - + - - + + - + - - + + - + @@ -168,14 +275,15 @@ @@ -206,230 +314,6 @@ @@ -499,15 +357,19 @@ + + + + + + - - + - - + @@ -616,7 +478,13 @@ - + - + - + - - + + + - @@ -716,83 +584,233 @@ - + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + diff --git a/fun-test-java/akka-fun-test-java.iml b/fun-test-java/akka-fun-test-java.iml deleted file mode 100644 index e09beb736b..0000000000 --- a/fun-test-java/akka-fun-test-java.iml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/kernel/akka-kernel.iml b/kernel/akka-kernel.iml deleted file mode 100644 index 807760933a..0000000000 --- a/kernel/akka-kernel.iml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples-java/akka-samples-java.iml b/samples-java/akka-samples-java.iml deleted file mode 100644 index 97ec95ec37..0000000000 --- a/samples-java/akka-samples-java.iml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples-lift/akka-samples-lift.iml b/samples-lift/akka-samples-lift.iml deleted file mode 100644 index 5b3e6a796f..0000000000 --- a/samples-lift/akka-samples-lift.iml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples-scala/akka-samples-scala.iml b/samples-scala/akka-samples-scala.iml deleted file mode 100644 index f88fe93371..0000000000 --- a/samples-scala/akka-samples-scala.iml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/util-java/akka-util-java.iml b/util-java/akka-util-java.iml deleted file mode 100644 index a80717f779..0000000000 --- a/util-java/akka-util-java.iml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - From 61e5f427672f8d4494d12a58c57aed439ed874b0 Mon Sep 17 00:00:00 2001 From: jboner Date: Tue, 1 Sep 2009 14:07:53 +0200 Subject: [PATCH 22/35] added optional ShutdownListener to AMQP client and endpoint --- akka-amqp/src/main/scala/AMQP.scala | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/akka-amqp/src/main/scala/AMQP.scala b/akka-amqp/src/main/scala/AMQP.scala index 43bcf82959..ddb7e678a5 100644 --- a/akka-amqp/src/main/scala/AMQP.scala +++ b/akka-amqp/src/main/scala/AMQP.scala @@ -2,11 +2,11 @@ * Copyright (C) 2009 Scalable Solutions. */ -package com.scalablesolutions.akka.amqp +package se.scalablesolutions.akka.amqp import java.lang.String -import rabbitmq.client.{AMQP => RabbitMQ, _} -import rabbitmq.client.ConnectionFactory +import com.rabbitmq.client.{AMQP => RabbitMQ, _} +import com.rabbitmq.client.ConnectionFactory import se.scalablesolutions.akka.kernel.actor.Actor import se.scalablesolutions.akka.kernel.util.Logging @@ -71,7 +71,7 @@ object AMQP { * params.setPassword("obama") * params.setVirtualHost("/") * params.setRequestedHeartbeat(0) - * val client = new AMQP.Client(new ConnectionFactory(params), "localhost", 5672, "exchangeName", "routingKey", Serializer.Java, None) + * val client = new AMQP.Client(new ConnectionFactory(params), "localhost", 5672, "exchangeName", "routingKey", Serializer.Java, None, None) * client.start * client ! Message("hi") * @@ -85,7 +85,8 @@ object AMQP { exchangeKey: String, routingKey: String, serializer: Serializer, - returnListener: Option[ReturnListener]) extends Actor { + returnListener: Option[ReturnListener], + shutdownListener: Option[ShutdownListener]) extends Actor { private val connection = connectionFactory.newConnection(hostname, port) private val channel = connection.createChannel returnListener match { @@ -106,6 +107,7 @@ object AMQP { } }) } + if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get) def receive: PartialFunction[Any, Unit] = { case Message(msg: AnyRef) => send(msg) @@ -125,12 +127,14 @@ object AMQP { queueName: String, routingKey: String, exchangeType: ExchangeType, - serializer: Serializer) extends Actor { + serializer: Serializer, + shutdownListener: Option[ShutdownListener]) extends Actor { private var connection = connectionFactory.newConnection(hostname, port) private var channel = connection.createChannel private val reconnectionTimer = new Timer private var listeners: List[Actor] = Nil private val endpoint = this + if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get) setupChannel private def setupChannel = { @@ -191,13 +195,13 @@ object ExampleAMQPSession { messageConsumer.start val endpoint = new Endpoint( - new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, QUEUE, ROUTING_KEY, ExchangeType.Direct, SERIALIZER) + new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, QUEUE, ROUTING_KEY, ExchangeType.Direct, SERIALIZER, None) endpoint.start // register message consumer endpoint ! MessageConsumer(messageConsumer) - val client = new Client(new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, ROUTING_KEY, SERIALIZER, None) + val client = new Client(new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, ROUTING_KEY, SERIALIZER, None, None) client.start client ! Message(ROUTING_KEY + " I'm going surfing") } From 91ad702e5228d272602da8bde8e53c9aa5a58aba Mon Sep 17 00:00:00 2001 From: jboner Date: Wed, 2 Sep 2009 09:10:21 +0200 Subject: [PATCH 23/35] 2:nd iteration of modularization --- akka-actors/pom.xml | 5 + .../src/main/scala/actor/ActiveObject.scala | 28 +- akka-actors/src/main/scala/actor/Actor.scala | 17 +- .../src/main/scala/actor/ActorRegistry.scala | 66 +- .../scala/{util => actor}/Scheduler.scala | 4 +- .../src/main/scala/actor/Supervisor.scala | 10 +- .../ActiveObjectGuiceConfigurator.scala | 40 +- .../scala/config/ActiveObjectManager.scala | 22 +- .../src/main/scala/config/Config.scala | 32 +- .../src/main/scala/config/Configuration.scala | 2 +- .../src/main/scala/config/Configurator.scala | 2 +- .../scala/config/ConfiguratorRepository.scala | 18 +- .../src/main/scala/nio/RemoteClient.scala | 8 +- .../scala/nio/RemoteProtocolBuilder.scala | 2 +- .../src/main/scala/nio/RemoteServer.scala | 8 +- .../src/main/scala/nio/RequestReply.scala | 6 +- .../src/main/scala/reactor/Dispatchers.scala | 4 +- .../EventBasedSingleThreadDispatcher.scala | 2 +- .../EventBasedThreadPoolDispatcher.scala | 2 +- .../src/main/scala/reactor/Future.scala | 2 +- .../scala/reactor/ManagedActorScheduler.scala | 68 - .../scala/reactor/MessageDispatcherBase.scala | 6 +- .../src/main/scala/reactor/Reactor.scala | 6 +- .../scala/reactor/ThreadBasedDispatcher.scala | 6 +- .../src/main/scala/stm}/ChangeSet.scala | 12 +- .../src/main/scala/stm}/HashTrie.scala | 0 .../scala/{util => stm}/ResultOrFailure.scala | 120 +- .../src/main/scala/stm}/Transaction.scala | 8 +- .../scala/stm}/TransactionManagement.scala | 19 +- .../main/scala/stm}/TransactionWatcher.scala | 2 +- .../main/scala/stm}/TransactionalState.scala | 22 +- .../src/main/scala/stm}/Vector.scala | 0 akka-actors/src/test/scala/ActorSpec.scala | 2 +- akka-actors/src/test/scala/AllSuite.scala | 2 +- akka-actors/src/test/scala/AllTest.scala | 8 +- akka-actors/src/test/scala/CamelSpec.scala | 6 +- ...EventBasedSingleThreadDispatcherTest.scala | 2 +- .../EventBasedThreadPoolDispatcherTest.scala | 2 +- .../src/test/scala/InMemoryActorSpec.scala | 4 +- akka-actors/src/test/scala/Messages.scala | 2 +- .../src/test/scala/RemoteActorSpec.scala | 4 +- .../src/test/scala/RemoteSupervisorSpec.scala | 8 +- .../src/test/scala/SchedulerSpec.scala | 2 +- .../src/test/scala/SupervisorSpec.scala | 6 +- .../scala/ThreadBasedDispatcherTest.scala | 2 +- .../test/scala/TransactionClasherSpec.scala | 6 +- akka-amqp/pom.xml | 7 +- akka-camel/pom.xml | 5 + .../main/scala/ActiveObjectComponent.scala | 2 +- .../src/main/scala/ActiveObjectConsumer.scala | 4 +- .../src/main/scala/ActiveObjectEndpoint.scala | 6 +- .../src/main/scala/ActiveObjectProducer.scala | 4 +- .../src/main/scala}/CamelConfigurator.scala | 2 +- akka-camel/src/main/scala/MessageDriven.scala | 2 +- .../scala/SupervisorAwareCamelContext.scala | 6 +- akka-kernel/pom.xml | 2 +- akka-kernel/src/main/scala/Boot.scala | 59 - akka-kernel/src/main/scala/Kernel.scala | 47 +- akka-persistence/pom.xml | 7 +- akka-rest/pom.xml | 10 + .../main/scala/ActorComponentProvider.scala | 6 +- .../scala/ActorComponentProviderFactory.scala | 6 +- akka-rest/src/main/scala/AkkaServlet.scala | 5 +- akka-rest/src/main/scala/NodeWriter.scala | 2 +- akka-samples-java/pom.xml | 24 +- akka-samples-lift/pom.xml | 26 +- akka-samples-scala/pom.xml | 26 +- akka-stm/pom.xml | 95 - .../config/ActiveObjectGuiceModule.java | 2 +- .../config/DependencyBinding.java | 2 +- .../nio/protobuf/RemoteProtocol.java | 180 +- .../nio/protobuf/RemoteProtocol.proto | 6 +- akka-util/pom.xml | 30 + akka-util/src/main/scala/Config.scala | 47 + .../src/main/scala}/HashCode.scala | 2 +- .../src/main/scala}/Helpers.scala | 2 +- .../src/main/scala}/Logging.scala | 2 +- akka.iml | 18 - akka.ipr | 1715 ----------------- akka.iws | 559 ------ pom.xml | 5 +- 81 files changed, 571 insertions(+), 2957 deletions(-) rename akka-actors/src/main/scala/{util => actor}/Scheduler.scala (96%) delete mode 100644 akka-actors/src/main/scala/reactor/ManagedActorScheduler.scala rename {akka-stm/src/main/scala => akka-actors/src/main/scala/stm}/ChangeSet.scala (56%) rename {akka-stm/src/main/scala => akka-actors/src/main/scala/stm}/HashTrie.scala (100%) rename akka-actors/src/main/scala/{util => stm}/ResultOrFailure.scala (91%) rename {akka-stm/src/main/scala => akka-actors/src/main/scala/stm}/Transaction.scala (97%) rename {akka-stm/src/main/scala => akka-actors/src/main/scala/stm}/TransactionManagement.scala (84%) rename {akka-stm/src/main/scala => akka-actors/src/main/scala/stm}/TransactionWatcher.scala (98%) rename {akka-stm/src/main/scala => akka-actors/src/main/scala/stm}/TransactionalState.scala (92%) rename {akka-stm/src/main/scala => akka-actors/src/main/scala/stm}/Vector.scala (100%) rename {akka-actors/src/main/scala/config => akka-camel/src/main/scala}/CamelConfigurator.scala (94%) delete mode 100644 akka-kernel/src/main/scala/Boot.scala delete mode 100644 akka-stm/pom.xml rename akka-util-java/src/main/java/se/scalablesolutions/akka/{kernel => }/config/ActiveObjectGuiceModule.java (94%) rename akka-util-java/src/main/java/se/scalablesolutions/akka/{kernel => }/config/DependencyBinding.java (90%) rename akka-util-java/src/main/java/se/scalablesolutions/akka/{kernel => }/nio/protobuf/RemoteProtocol.java (79%) rename akka-util-java/src/main/java/se/scalablesolutions/akka/{kernel => }/nio/protobuf/RemoteProtocol.proto (81%) create mode 100644 akka-util/pom.xml create mode 100644 akka-util/src/main/scala/Config.scala rename {akka-actors/src/main/scala/util => akka-util/src/main/scala}/HashCode.scala (97%) rename {akka-actors/src/main/scala/util => akka-util/src/main/scala}/Helpers.scala (97%) rename {akka-actors/src/main/scala/util => akka-util/src/main/scala}/Logging.scala (97%) delete mode 100644 akka.iml delete mode 100644 akka.ipr delete mode 100644 akka.iws diff --git a/akka-actors/pom.xml b/akka-actors/pom.xml index 91ab205c95..cb76e1fbb5 100644 --- a/akka-actors/pom.xml +++ b/akka-actors/pom.xml @@ -22,6 +22,11 @@ se.scalablesolutions.akka 0.6 + + akka-util + se.scalablesolutions.akka + 0.6 + org.scala-lang scala-library diff --git a/akka-actors/src/main/scala/actor/ActiveObject.scala b/akka-actors/src/main/scala/actor/ActiveObject.scala index cb22fecbc1..7f2d2f8fa3 100644 --- a/akka-actors/src/main/scala/actor/ActiveObject.scala +++ b/akka-actors/src/main/scala/actor/ActiveObject.scala @@ -2,16 +2,16 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.actor +package se.scalablesolutions.akka.actor import java.lang.reflect.{InvocationTargetException, Method} import java.net.InetSocketAddress -import kernel.reactor.{MessageDispatcher, FutureResult} -import kernel.nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply} -import kernel.nio.{RemoteProtocolBuilder, RemoteClient, RemoteServer, RemoteRequestIdFactory} -import kernel.config.ScalaConfig._ -import kernel.util._ +import reactor.{MessageDispatcher, FutureResult} +import nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply} +import nio.{RemoteProtocolBuilder, RemoteClient, RemoteServer, RemoteRequestIdFactory} +import config.ScalaConfig._ +import util._ import serialization.Serializer import org.codehaus.aspectwerkz.intercept.{Advisable, AroundAdvice, Advice} @@ -113,15 +113,15 @@ class ActiveObjectFactory { ActiveObject.newInstance(intf, target, actor, Some(new InetSocketAddress(hostname, port)), timeout) } - private[kernel] def newInstance[T](target: Class[T], actor: Dispatcher, remoteAddress: Option[InetSocketAddress], timeout: Long): T = { + private[akka] def newInstance[T](target: Class[T], actor: Dispatcher, remoteAddress: Option[InetSocketAddress], timeout: Long): T = { ActiveObject.newInstance(target, actor, remoteAddress, timeout) } - private[kernel] def newInstance[T](intf: Class[T], target: AnyRef, actor: Dispatcher, remoteAddress: Option[InetSocketAddress], timeout: Long): T = { + private[akka] def newInstance[T](intf: Class[T], target: AnyRef, actor: Dispatcher, remoteAddress: Option[InetSocketAddress], timeout: Long): T = { ActiveObject.newInstance(intf, target, actor, remoteAddress, timeout) } - private[kernel] def supervise(restartStrategy: RestartStrategy, components: List[Supervise]): Supervisor = + private[akka] def supervise(restartStrategy: RestartStrategy, components: List[Supervise]): Supervisor = ActiveObject.supervise(restartStrategy, components) /* @@ -219,7 +219,7 @@ object ActiveObject { newInstance(intf, target, actor, Some(new InetSocketAddress(hostname, port)), timeout) } - private[kernel] def newInstance[T](target: Class[T], actor: Dispatcher, remoteAddress: Option[InetSocketAddress], timeout: Long): T = { + private[akka] def newInstance[T](target: Class[T], actor: Dispatcher, remoteAddress: Option[InetSocketAddress], timeout: Long): T = { //if (getClass.getClassLoader.getResourceAsStream("META-INF/aop.xml") != null) println("000000000000000000000 FOUND AOP") if (remoteAddress.isDefined) actor.makeRemote(remoteAddress.get) val proxy = Proxy.newInstance(target, false, true) @@ -230,7 +230,7 @@ object ActiveObject { proxy.asInstanceOf[T] } - private[kernel] def newInstance[T](intf: Class[T], target: AnyRef, actor: Dispatcher, remoteAddress: Option[InetSocketAddress], timeout: Long): T = { + private[akka] def newInstance[T](intf: Class[T], target: AnyRef, actor: Dispatcher, remoteAddress: Option[InetSocketAddress], timeout: Long): T = { //if (getClass.getClassLoader.getResourceAsStream("META-INF/aop.xml") != null) println("000000000000000000000 FOUND AOP") if (remoteAddress.isDefined) actor.makeRemote(remoteAddress.get) val proxy = Proxy.newInstance(Array(intf), Array(target), false, true) @@ -242,7 +242,7 @@ object ActiveObject { } - private[kernel] def supervise(restartStrategy: RestartStrategy, components: List[Supervise]): Supervisor = { + private[akka] def supervise(restartStrategy: RestartStrategy, components: List[Supervise]): Supervisor = { object factory extends SupervisorFactory { override def getSupervisorConfig = SupervisorConfig(restartStrategy, components) } @@ -364,7 +364,7 @@ sealed class ActiveObjectAspect { * * @author Jonas Bonér */ -@serializable private[kernel] case class Invocation(val joinpoint: JoinPoint, val isOneWay: Boolean) { +@serializable private[akka] case class Invocation(val joinpoint: JoinPoint, val isOneWay: Boolean) { override def toString: String = synchronized { "Invocation [joinpoint: " + joinpoint.toString + ", isOneWay: " + isOneWay + "]" @@ -390,7 +390,7 @@ sealed class ActiveObjectAspect { * * @author Jonas Bonér */ -private[kernel] class Dispatcher(val callbacks: Option[RestartCallbacks]) extends Actor { +private[akka] class Dispatcher(val callbacks: Option[RestartCallbacks]) extends Actor { private val ZERO_ITEM_CLASS_ARRAY = Array[Class[_]]() private val ZERO_ITEM_OBJECT_ARRAY = Array[Object[_]]() diff --git a/akka-actors/src/main/scala/actor/Actor.scala b/akka-actors/src/main/scala/actor/Actor.scala index cf4dc132ca..5e0191483a 100644 --- a/akka-actors/src/main/scala/actor/Actor.scala +++ b/akka-actors/src/main/scala/actor/Actor.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.actor +package se.scalablesolutions.akka.actor import com.google.protobuf.ByteString import java.net.InetSocketAddress @@ -42,8 +42,9 @@ class ActorMessageInvoker(val actor: Actor) extends MessageInvoker { * @author Jonas Bonér */ object Actor { - val TIMEOUT = Kernel.config.getInt("akka.actor.timeout", 5000) - val SERIALIZE_MESSAGES = Kernel.config.getBool("akka.actor.serialize-messages", false) + import Config._ + val TIMEOUT = config.getInt("akka.actor.timeout", 5000) + val SERIALIZE_MESSAGES = config.getBool("akka.actor.serialize-messages", false) } /** @@ -60,7 +61,7 @@ trait Actor extends Logging with TransactionManagement { private var config: Option[AnyRef] = None @volatile protected[this] var isTransactional = false @volatile protected[this] var remoteAddress: Option[InetSocketAddress] = None - @volatile protected[kernel] var supervisor: Option[Actor] = None + @volatile protected[akka] var supervisor: Option[Actor] = None protected[Actor] var mailbox: MessageQueue = _ protected[this] var senderFuture: Option[CompletableFutureResult] = None protected[this] val linkedActors = new CopyOnWriteArraySet[Actor] @@ -99,7 +100,7 @@ trait Actor extends Logging with TransactionManagement { * .buildThreadPool * */ - protected[kernel] var dispatcher: MessageDispatcher = { + protected[akka] var dispatcher: MessageDispatcher = { val dispatcher = Dispatchers.newEventBasedThreadPoolDispatcher(getClass.getName) mailbox = dispatcher.messageQueue dispatcher.registerHandler(this, new ActorMessageInvoker(this)) @@ -454,7 +455,7 @@ trait Actor extends Logging with TransactionManagement { /** * Callback for the dispatcher. E.g. single entry point to the user code and all protected[this] methods */ - private[kernel] def invoke(messageHandle: MessageInvocation) = synchronized { + private[akka] def invoke(messageHandle: MessageInvocation) = synchronized { if (TransactionManagement.isTransactionalityEnabled) transactionalDispatch(messageHandle) else dispatch(messageHandle) } @@ -577,7 +578,7 @@ trait Actor extends Logging with TransactionManagement { } } - private[kernel] def registerSupervisorAsRemoteActor: Option[String] = synchronized { + private[akka] def registerSupervisorAsRemoteActor: Option[String] = synchronized { if (supervisor.isDefined) { RemoteClient.clientFor(remoteAddress.get).registerSupervisorForActor(this) Some(supervisor.get.uuid) @@ -585,7 +586,7 @@ trait Actor extends Logging with TransactionManagement { } - private[kernel] def swapDispatcher(disp: MessageDispatcher) = synchronized { + private[akka] def swapDispatcher(disp: MessageDispatcher) = synchronized { dispatcher = disp mailbox = dispatcher.messageQueue dispatcher.registerHandler(this, new ActorMessageInvoker(this)) diff --git a/akka-actors/src/main/scala/actor/ActorRegistry.scala b/akka-actors/src/main/scala/actor/ActorRegistry.scala index 3f4275cf9e..2a534918d1 100755 --- a/akka-actors/src/main/scala/actor/ActorRegistry.scala +++ b/akka-actors/src/main/scala/actor/ActorRegistry.scala @@ -1,33 +1,33 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package se.scalablesolutions.akka.kernel.actor - -import kernel.util.Logging - -import scala.collection.jcl.HashMap - -/** - * Registry holding all actor instances, mapped by class.. - * - * @author Jonas Bonér - */ -object ActorRegistry extends Logging { - private val actors = new HashMap[String, List[Actor]] - - def actorsFor(clazz: Class[_]): List[Actor] = synchronized { - actors.get(clazz.getName) match { - case None => Nil - case Some(instances) => instances - } - } - - def register(actor: Actor) = synchronized { - val name = actor.getClass.getName - actors.get(name) match { - case Some(instances) => actors + (name -> (actor :: instances)) - case None => actors + (name -> (actor :: Nil)) - } - } -} +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.actor + +import util.Logging + +import scala.collection.jcl.HashMap + +/** + * Registry holding all actor instances, mapped by class.. + * + * @author Jonas Bonér + */ +object ActorRegistry extends Logging { + private val actors = new HashMap[String, List[Actor]] + + def actorsFor(clazz: Class[_]): List[Actor] = synchronized { + actors.get(clazz.getName) match { + case None => Nil + case Some(instances) => instances + } + } + + def register(actor: Actor) = synchronized { + val name = actor.getClass.getName + actors.get(name) match { + case Some(instances) => actors + (name -> (actor :: instances)) + case None => actors + (name -> (actor :: Nil)) + } + } +} diff --git a/akka-actors/src/main/scala/util/Scheduler.scala b/akka-actors/src/main/scala/actor/Scheduler.scala similarity index 96% rename from akka-actors/src/main/scala/util/Scheduler.scala rename to akka-actors/src/main/scala/actor/Scheduler.scala index 2d7bfed445..d9f4ae0c48 100644 --- a/akka-actors/src/main/scala/util/Scheduler.scala +++ b/akka-actors/src/main/scala/actor/Scheduler.scala @@ -11,10 +11,10 @@ * limitations under the License. */ -package se.scalablesolutions.akka.kernel.util +package se.scalablesolutions.akka.util import java.util.concurrent._ -import kernel.actor.{OneForOneStrategy, Actor} +import actor.{OneForOneStrategy, Actor} import org.scala_tools.javautils.Imports._ diff --git a/akka-actors/src/main/scala/actor/Supervisor.scala b/akka-actors/src/main/scala/actor/Supervisor.scala index 0b9f1dfc4c..e183cfcc96 100644 --- a/akka-actors/src/main/scala/actor/Supervisor.scala +++ b/akka-actors/src/main/scala/actor/Supervisor.scala @@ -2,12 +2,12 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.actor +package se.scalablesolutions.akka.actor -import kernel.util.Logging -import kernel.config.ScalaConfig._ -import kernel.config.{ConfiguratorRepository, Configurator} -import kernel.util.Helpers._ +import util.Logging +import config.ScalaConfig._ +import config.{ConfiguratorRepository, Configurator} +import util.Helpers._ import java.util.concurrent.ConcurrentHashMap diff --git a/akka-actors/src/main/scala/config/ActiveObjectGuiceConfigurator.scala b/akka-actors/src/main/scala/config/ActiveObjectGuiceConfigurator.scala index d1b17782a8..9c8e57578d 100644 --- a/akka-actors/src/main/scala/config/ActiveObjectGuiceConfigurator.scala +++ b/akka-actors/src/main/scala/config/ActiveObjectGuiceConfigurator.scala @@ -2,16 +2,16 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.config +package se.scalablesolutions.akka.config import com.google.inject._ import ScalaConfig._ -import kernel.actor.{Supervisor, ActiveObjectFactory, Dispatcher} -import kernel.util.Logging +import akka.actor.{Supervisor, ActiveObjectFactory, Dispatcher} +import akka.util.Logging -import org.apache.camel.impl.{DefaultCamelContext} -import org.apache.camel.{CamelContext, Endpoint, Routes} +//import org.apache.camel.impl.{DefaultCamelContext} +//import org.apache.camel.{CamelContext, Endpoint, Routes} import scala.collection.mutable.HashMap @@ -21,8 +21,8 @@ import java.lang.reflect.Method /** * @author Jonas Bonér */ -class ActiveObjectGuiceConfigurator extends ActiveObjectConfigurator with CamelConfigurator with Logging { - val AKKA_CAMEL_ROUTING_SCHEME = "akka" +class ActiveObjectGuiceConfigurator extends ActiveObjectConfigurator with Logging { // with CamelConfigurator { + //val AKKA_CAMEL_ROUTING_SCHEME = "akka" private var injector: Injector = _ private var supervisor: Option[Supervisor] = None @@ -33,7 +33,7 @@ class ActiveObjectGuiceConfigurator extends ActiveObjectConfigurator with CamelC private var configRegistry = new HashMap[Class[_], Component] // TODO is configRegistry needed? private var activeObjectRegistry = new HashMap[Class[_], Tuple3[AnyRef, AnyRef, Component]] private var activeObjectFactory = new ActiveObjectFactory - private var camelContext = new DefaultCamelContext + //private var camelContext = new DefaultCamelContext private var modules = new java.util.ArrayList[Module] private var methodToUriRegistry = new HashMap[Method, String] @@ -65,7 +65,7 @@ class ActiveObjectGuiceConfigurator extends ActiveObjectConfigurator with CamelC if (c.intf.isDefined) c.intf.get else c.target } - + /* override def getRoutingEndpoint(uri: String): Endpoint = synchronized { camelContext.getEndpoint(uri) } @@ -77,7 +77,7 @@ class ActiveObjectGuiceConfigurator extends ActiveObjectConfigurator with CamelC override def getRoutingEndpoints(uri: String): java.util.Collection[Endpoint] = synchronized { camelContext.getEndpoints(uri) } - + */ override def configure(restartStrategy: RestartStrategy, components: List[Component]): ActiveObjectConfigurator = synchronized { this.restartStrategy = restartStrategy @@ -155,14 +155,14 @@ class ActiveObjectGuiceConfigurator extends ActiveObjectConfigurator with CamelC modules.add(module) this } - + /* override def addRoutes(routes: Routes): ActiveObjectConfigurator = synchronized { camelContext.addRoutes(routes) this } override def getCamelContext: CamelContext = camelContext - + */ def getGuiceModules: java.util.List[Module] = modules def reset = synchronized { @@ -172,21 +172,21 @@ class ActiveObjectGuiceConfigurator extends ActiveObjectConfigurator with CamelC methodToUriRegistry = new HashMap[Method, String] injector = null restartStrategy = null - camelContext = new DefaultCamelContext + //camelContext = new DefaultCamelContext } def stop = synchronized { - camelContext.stop + //camelContext.stop if (supervisor.isDefined) supervisor.get.stop } - def registerMethodForUri(method: Method, componentName: String) = - methodToUriRegistry += method -> buildUri(method, componentName) +// def registerMethodForUri(method: Method, componentName: String) = +// methodToUriRegistry += method -> buildUri(method, componentName) - def lookupUriFor(method: Method): String = - methodToUriRegistry.getOrElse(method, throw new IllegalStateException("Could not find URI for method [" + method.getName + "]")) +// def lookupUriFor(method: Method): String = +// methodToUriRegistry.getOrElse(method, throw new IllegalStateException("Could not find URI for method [" + method.getName + "]")) - def buildUri(method: Method, componentName: String): String = - AKKA_CAMEL_ROUTING_SCHEME + ":" + componentName + "." + method.getName +// def buildUri(method: Method, componentName: String): String = +// AKKA_CAMEL_ROUTING_SCHEME + ":" + componentName + "." + method.getName } \ No newline at end of file diff --git a/akka-actors/src/main/scala/config/ActiveObjectManager.scala b/akka-actors/src/main/scala/config/ActiveObjectManager.scala index 2545d44b29..f5d49d426a 100644 --- a/akka-actors/src/main/scala/config/ActiveObjectManager.scala +++ b/akka-actors/src/main/scala/config/ActiveObjectManager.scala @@ -2,15 +2,15 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.config +package se.scalablesolutions.akka.config -import akka.kernel.config.JavaConfig._ +import JavaConfig._ import com.google.inject._ import java.util._ -import org.apache.camel.impl.{JndiRegistry, DefaultCamelContext} -import org.apache.camel.{Endpoint, Routes} +//import org.apache.camel.impl.{JndiRegistry, DefaultCamelContext} +//import org.apache.camel.{Endpoint, Routes} /** * @@ -49,10 +49,10 @@ class ActiveObjectManager { this } - def addRoutes(routes: Routes): ActiveObjectManager = { - INSTANCE.addRoutes(routes) - this - } + //def addRoutes(routes: Routes): ActiveObjectManager = { + // INSTANCE.addRoutes(routes) + // this + // } def getComponentInterfaces: List[Class[_]] = { @@ -63,11 +63,11 @@ class ActiveObjectManager { def getExternalDependency[T](clazz: Class[T]): T = INSTANCE.getExternalDependency(clazz) - def getRoutingEndpoint(uri: String): Endpoint = INSTANCE.getRoutingEndpoint(uri) + //def getRoutingEndpoint(uri: String): Endpoint = INSTANCE.getRoutingEndpoint(uri) - def getRoutingEndpoints: java.util.Collection[Endpoint] = INSTANCE.getRoutingEndpoints + //def getRoutingEndpoints: java.util.Collection[Endpoint] = INSTANCE.getRoutingEndpoints - def getRoutingEndpoints(uri: String): java.util.Collection[Endpoint] = INSTANCE.getRoutingEndpoints(uri) + //def getRoutingEndpoints(uri: String): java.util.Collection[Endpoint] = INSTANCE.getRoutingEndpoints(uri) def getGuiceModules: List[Module] = INSTANCE.getGuiceModules diff --git a/akka-actors/src/main/scala/config/Config.scala b/akka-actors/src/main/scala/config/Config.scala index 0df243a338..f9a6f25d1f 100644 --- a/akka-actors/src/main/scala/config/Config.scala +++ b/akka-actors/src/main/scala/config/Config.scala @@ -2,12 +2,12 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.config +package se.scalablesolutions.akka.config import reflect.BeanProperty -import kernel.actor.Actor -import kernel.reactor.MessageDispatcher +import actor.Actor +import reactor.MessageDispatcher /** * Configuration classes - not to be used as messages. @@ -95,7 +95,7 @@ object JavaConfig { @BeanProperty val scheme: FailOverScheme, @BeanProperty val maxNrOfRetries: Int, @BeanProperty val withinTimeRange: Int) extends ConfigElement { - def transform = se.scalablesolutions.akka.kernel.config.ScalaConfig.RestartStrategy( + def transform = se.scalablesolutions.akka.config.ScalaConfig.RestartStrategy( scheme.transform, maxNrOfRetries, withinTimeRange) } @@ -103,35 +103,35 @@ object JavaConfig { def this(scope: Scope, shutdownTime: Int) = this(scope, shutdownTime, null) def transform = { val callbackOption = if (callbacks == null) None else Some(callbacks.transform) - se.scalablesolutions.akka.kernel.config.ScalaConfig.LifeCycle(scope.transform, shutdownTime, callbackOption) + se.scalablesolutions.akka.config.ScalaConfig.LifeCycle(scope.transform, shutdownTime, callbackOption) } } class RestartCallbacks(@BeanProperty val preRestart: String, @BeanProperty val postRestart: String) { - def transform = se.scalablesolutions.akka.kernel.config.ScalaConfig.RestartCallbacks(preRestart, postRestart) + def transform = se.scalablesolutions.akka.config.ScalaConfig.RestartCallbacks(preRestart, postRestart) } abstract class Scope extends ConfigElement { - def transform: se.scalablesolutions.akka.kernel.config.ScalaConfig.Scope + def transform: se.scalablesolutions.akka.config.ScalaConfig.Scope } class Permanent extends Scope { - override def transform = se.scalablesolutions.akka.kernel.config.ScalaConfig.Permanent + override def transform = se.scalablesolutions.akka.config.ScalaConfig.Permanent } class Transient extends Scope { - override def transform = se.scalablesolutions.akka.kernel.config.ScalaConfig.Transient + override def transform = se.scalablesolutions.akka.config.ScalaConfig.Transient } class Temporary extends Scope { - override def transform = se.scalablesolutions.akka.kernel.config.ScalaConfig.Temporary + override def transform = se.scalablesolutions.akka.config.ScalaConfig.Temporary } abstract class FailOverScheme extends ConfigElement { - def transform: se.scalablesolutions.akka.kernel.config.ScalaConfig.FailOverScheme + def transform: se.scalablesolutions.akka.config.ScalaConfig.FailOverScheme } class AllForOne extends FailOverScheme { - override def transform = se.scalablesolutions.akka.kernel.config.ScalaConfig.AllForOne + override def transform = se.scalablesolutions.akka.config.ScalaConfig.AllForOne } class OneForOne extends FailOverScheme { - override def transform = se.scalablesolutions.akka.kernel.config.ScalaConfig.OneForOne + override def transform = se.scalablesolutions.akka.config.ScalaConfig.OneForOne } class RemoteAddress(@BeanProperty val hostname: String, @BeanProperty val port: Int) @@ -167,11 +167,11 @@ object JavaConfig { this(null, target, lifeCycle, timeout, dispatcher, remoteAddress) def transform = - se.scalablesolutions.akka.kernel.config.ScalaConfig.Component(intf, target, lifeCycle.transform, timeout, dispatcher, - if (remoteAddress != null) se.scalablesolutions.akka.kernel.config.ScalaConfig.RemoteAddress(remoteAddress.hostname, remoteAddress.port) else null) + se.scalablesolutions.akka.config.ScalaConfig.Component(intf, target, lifeCycle.transform, timeout, dispatcher, + if (remoteAddress != null) se.scalablesolutions.akka.config.ScalaConfig.RemoteAddress(remoteAddress.hostname, remoteAddress.port) else null) def newSupervised(actor: Actor) = - se.scalablesolutions.akka.kernel.config.ScalaConfig.Supervise(actor, lifeCycle.transform) + se.scalablesolutions.akka.config.ScalaConfig.Supervise(actor, lifeCycle.transform) } } \ No newline at end of file diff --git a/akka-actors/src/main/scala/config/Configuration.scala b/akka-actors/src/main/scala/config/Configuration.scala index d4e63123dc..5813cd37bf 100644 --- a/akka-actors/src/main/scala/config/Configuration.scala +++ b/akka-actors/src/main/scala/config/Configuration.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.config +package se.scalablesolutions.akka.config /* import se.scalablesolutions.akka.kernel.{ActiveObject, ActiveObjectProxy} diff --git a/akka-actors/src/main/scala/config/Configurator.scala b/akka-actors/src/main/scala/config/Configurator.scala index bae832f459..c4a57e91a4 100644 --- a/akka-actors/src/main/scala/config/Configurator.scala +++ b/akka-actors/src/main/scala/config/Configurator.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.config +package se.scalablesolutions.akka.config import ScalaConfig.{RestartStrategy, Component} diff --git a/akka-actors/src/main/scala/config/ConfiguratorRepository.scala b/akka-actors/src/main/scala/config/ConfiguratorRepository.scala index 249746914e..049bf0ed4f 100644 --- a/akka-actors/src/main/scala/config/ConfiguratorRepository.scala +++ b/akka-actors/src/main/scala/config/ConfiguratorRepository.scala @@ -2,36 +2,28 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.config - -import javax.servlet.ServletContext +package se.scalablesolutions.akka.config import scala.collection.mutable.HashSet -import kernel.util.Logging +import util.Logging object ConfiguratorRepository extends Logging { private val configuration = new HashSet[Configurator] - // FIXME: cheating with only having one single, scope per ServletContext def registerConfigurator(conf: Configurator) = synchronized { configuration + conf } - def getConfiguratorsFor(ctx: ServletContext): List[Configurator] = synchronized { + def getConfigurators: List[Configurator] = synchronized { configuration.toList //configurations.getOrElse(ctx, throw new IllegalArgumentException("No configuration for servlet context [" + ctx + "]")) } } class ConfiguratorRepository extends Logging { - def registerConfigurator(conf: Configurator) = { - ConfiguratorRepository.registerConfigurator(conf) - } - - def getConfiguratorsFor(ctx: ServletContext): List[Configurator] = { - ConfiguratorRepository.getConfiguratorsFor(ctx) - } + def registerConfigurator(conf: Configurator) = ConfiguratorRepository.registerConfigurator(conf) + def getConfigurators: List[Configurator] = ConfiguratorRepository.getConfigurators } diff --git a/akka-actors/src/main/scala/nio/RemoteClient.scala b/akka-actors/src/main/scala/nio/RemoteClient.scala index 0ee67950e2..74e99b9fe8 100644 --- a/akka-actors/src/main/scala/nio/RemoteClient.scala +++ b/akka-actors/src/main/scala/nio/RemoteClient.scala @@ -2,16 +2,16 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.nio +package se.scalablesolutions.akka.nio import java.net.InetSocketAddress import java.util.concurrent.{Executors, ConcurrentMap, ConcurrentHashMap} import protobuf.RemoteProtocol.{RemoteRequest, RemoteReply} -import kernel.actor.{Exit, Actor} -import kernel.reactor.{DefaultCompletableFutureResult, CompletableFutureResult} +import actor.{Exit, Actor} +import reactor.{DefaultCompletableFutureResult, CompletableFutureResult} import serialization.{Serializer, Serializable, SerializationProtocol} -import kernel.util.Logging +import util.Logging import org.jboss.netty.bootstrap.ClientBootstrap import org.jboss.netty.channel._ diff --git a/akka-actors/src/main/scala/nio/RemoteProtocolBuilder.scala b/akka-actors/src/main/scala/nio/RemoteProtocolBuilder.scala index b492a2fe0c..1c846a42cd 100644 --- a/akka-actors/src/main/scala/nio/RemoteProtocolBuilder.scala +++ b/akka-actors/src/main/scala/nio/RemoteProtocolBuilder.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.nio +package se.scalablesolutions.akka.nio import akka.serialization.Serializable.SBinary import com.google.protobuf.{Message, ByteString} diff --git a/akka-actors/src/main/scala/nio/RemoteServer.scala b/akka-actors/src/main/scala/nio/RemoteServer.scala index 76a7be6859..ccb7661674 100644 --- a/akka-actors/src/main/scala/nio/RemoteServer.scala +++ b/akka-actors/src/main/scala/nio/RemoteServer.scala @@ -2,14 +2,14 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.nio +package se.scalablesolutions.akka.nio import java.lang.reflect.InvocationTargetException import java.net.InetSocketAddress import java.util.concurrent.{ConcurrentHashMap, Executors} -import kernel.actor._ -import kernel.util._ +import actor._ +import util._ import protobuf.RemoteProtocol import protobuf.RemoteProtocol.{RemoteReply, RemoteRequest} import serialization.{Serializer, Serializable, SerializationProtocol} @@ -31,7 +31,7 @@ class RemoteServer extends Logging { * @author Jonas Bonér */ object RemoteServer extends Logging { - import kernel.Kernel.config + import Config.config val HOSTNAME = config.getString("akka.remote.hostname", "localhost") val PORT = config.getInt("akka.remote.port", 9999) val CONNECTION_TIMEOUT_MILLIS = config.getInt("akka.remote.connection-timeout", 1000) diff --git a/akka-actors/src/main/scala/nio/RequestReply.scala b/akka-actors/src/main/scala/nio/RequestReply.scala index b48732cf94..ce79653f06 100644 --- a/akka-actors/src/main/scala/nio/RequestReply.scala +++ b/akka-actors/src/main/scala/nio/RequestReply.scala @@ -2,11 +2,11 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.nio +package se.scalablesolutions.akka.nio import java.util.concurrent.atomic.AtomicLong -import kernel.stm.Transaction -import kernel.util.HashCode +import stm.Transaction +import util.HashCode // FIXME: will not work - can clash with other host's requests - need te prepend with hostname object RemoteRequestIdFactory { diff --git a/akka-actors/src/main/scala/reactor/Dispatchers.scala b/akka-actors/src/main/scala/reactor/Dispatchers.scala index 5c4935bbd5..30846752b6 100644 --- a/akka-actors/src/main/scala/reactor/Dispatchers.scala +++ b/akka-actors/src/main/scala/reactor/Dispatchers.scala @@ -2,9 +2,9 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.reactor +package se.scalablesolutions.akka.reactor -import kernel.actor.Actor +import actor.Actor /** * Scala API. Dispatcher factory. diff --git a/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala b/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala index 65c71da8f8..90518dbd73 100644 --- a/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala +++ b/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala @@ -8,7 +8,7 @@ * * Based on code from the actorom actor framework by Sergio Bossa [http://code.google.com/p/actorom/]. */ -package se.scalablesolutions.akka.kernel.reactor +package se.scalablesolutions.akka.reactor import java.util.{LinkedList, List} diff --git a/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala b/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala index 101f7cc0dd..c63237f12c 100644 --- a/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala +++ b/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.reactor +package se.scalablesolutions.akka.reactor import java.util.concurrent._ import locks.ReentrantLock diff --git a/akka-actors/src/main/scala/reactor/Future.scala b/akka-actors/src/main/scala/reactor/Future.scala index c81a88b264..c43b212932 100644 --- a/akka-actors/src/main/scala/reactor/Future.scala +++ b/akka-actors/src/main/scala/reactor/Future.scala @@ -5,7 +5,7 @@ /** * Based on code from the actorom actor framework by Sergio Bossa [http://code.google.com/p/actorom/]. */ -package se.scalablesolutions.akka.kernel.reactor +package se.scalablesolutions.akka.reactor import java.util.concurrent.locks.{Lock, Condition, ReentrantLock} import java.util.concurrent.TimeUnit diff --git a/akka-actors/src/main/scala/reactor/ManagedActorScheduler.scala b/akka-actors/src/main/scala/reactor/ManagedActorScheduler.scala deleted file mode 100644 index a251557fc5..0000000000 --- a/akka-actors/src/main/scala/reactor/ManagedActorScheduler.scala +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package se.scalablesolutions.akka.kernel - -import kernel.util.Logging -import net.lag.logging.Logger - -import java.util.concurrent.Executors - -import scala.actors.{FJTaskScheduler2, Scheduler, IScheduler, Actor} - -// FIXME: add managing interface to this class using JMX -// FIXME: configure one instance per GenericServer - -class ManagedActorScheduler extends IScheduler with Logging { - protected var threadPoolSize = 10 - protected val threadPool = Executors.newFixedThreadPool(threadPoolSize) - - def execute(fun: => Unit): Unit = threadPool.execute(new Runnable { - def run = { - try { - fun - } catch { - case e => log.error("Actor scheduler", e) - } - } - }) - - def execute(task: Runnable) = threadPool.execute(new Runnable { - def run = { - try { - task.run - } catch { - case e => log.error("Actor scheduler", e) - } - } - }) - - def tick(a: Actor): Unit = {} - - def shutdown: Unit = threadPool.shutdown - - def onLockup(handler: () => Unit): Unit = {} - - def onLockup(millis: Int)(handler: () => Unit): Unit = {} - - def printActorDump: Unit = {} -} - -object GlobalManagedActorScheduler extends Logging { - @volatile private var isRegistered = false - private var threadPoolSize = 10 - - def register = synchronized { - if (!isRegistered) { - Scheduler.impl match { - case fj: FJTaskScheduler2 => - fj.snapshot - fj.shutdown - case _ => - } - Scheduler.impl = new ManagedActorScheduler - isRegistered = true - } - } -} \ No newline at end of file diff --git a/akka-actors/src/main/scala/reactor/MessageDispatcherBase.scala b/akka-actors/src/main/scala/reactor/MessageDispatcherBase.scala index 27ed887c7a..8a6670bdc4 100644 --- a/akka-actors/src/main/scala/reactor/MessageDispatcherBase.scala +++ b/akka-actors/src/main/scala/reactor/MessageDispatcherBase.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.reactor +package se.scalablesolutions.akka.reactor import java.util.{LinkedList, Queue, List} import java.util.concurrent.{TimeUnit, BlockingQueue} @@ -10,7 +10,7 @@ import java.util.HashMap abstract class MessageDispatcherBase(val name: String) extends MessageDispatcher { - //val CONCURRENT_MODE = kernel.Kernel.config.getBool("akka.actor.concurrent-mode", false) + //val CONCURRENT_MODE = Config.config.getBool("akka.actor.concurrent-mode", false) val MILLISECONDS = TimeUnit.MILLISECONDS val queue = new ReactiveMessageQueue(name) var blockingQueue: BlockingQueue[Runnable] = _ @@ -42,7 +42,7 @@ abstract class MessageDispatcherBase(val name: String) extends MessageDispatcher } class ReactiveMessageQueue(name: String) extends MessageQueue { - private[kernel] val queue: Queue[MessageInvocation] = new LinkedList[MessageInvocation] + private[akka] val queue: Queue[MessageInvocation] = new LinkedList[MessageInvocation] @volatile private var interrupted = false def append(handle: MessageInvocation) = queue.synchronized { diff --git a/akka-actors/src/main/scala/reactor/Reactor.scala b/akka-actors/src/main/scala/reactor/Reactor.scala index 9e4983a6f8..a4bb3e3784 100644 --- a/akka-actors/src/main/scala/reactor/Reactor.scala +++ b/akka-actors/src/main/scala/reactor/Reactor.scala @@ -2,11 +2,11 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.reactor +package se.scalablesolutions.akka.reactor import java.util.List -import kernel.stm.Transaction -import kernel.util.HashCode +import stm.Transaction +import util.HashCode trait MessageQueue { def append(handle: MessageInvocation) diff --git a/akka-actors/src/main/scala/reactor/ThreadBasedDispatcher.scala b/akka-actors/src/main/scala/reactor/ThreadBasedDispatcher.scala index 28f9ca2761..aa04414169 100644 --- a/akka-actors/src/main/scala/reactor/ThreadBasedDispatcher.scala +++ b/akka-actors/src/main/scala/reactor/ThreadBasedDispatcher.scala @@ -2,18 +2,18 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.reactor +package se.scalablesolutions.akka.reactor import java.util.concurrent.LinkedBlockingQueue import java.util.Queue -import kernel.actor.{Actor, ActorMessageInvoker} +import actor.{Actor, ActorMessageInvoker} /** * Dedicates a unique thread for each actor passed in as reference. Served through its messageQueue. * @author Jonas Bonér */ -class ThreadBasedDispatcher private[kernel] (val name: String, val messageHandler: MessageInvoker) extends MessageDispatcher { +class ThreadBasedDispatcher private[akka] (val name: String, val messageHandler: MessageInvoker) extends MessageDispatcher { def this(actor: Actor) = this(actor.getClass.getName, new ActorMessageInvoker(actor)) private val queue = new BlockingMessageQueue(name) diff --git a/akka-stm/src/main/scala/ChangeSet.scala b/akka-actors/src/main/scala/stm/ChangeSet.scala similarity index 56% rename from akka-stm/src/main/scala/ChangeSet.scala rename to akka-actors/src/main/scala/stm/ChangeSet.scala index 5910714da8..440df8c18d 100644 --- a/akka-stm/src/main/scala/ChangeSet.scala +++ b/akka-actors/src/main/scala/stm/ChangeSet.scala @@ -2,10 +2,10 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.stm +package se.scalablesolutions.akka.stm -import kernel.state.{Transactional, TransactionalMap} -import kernel.util.Helpers.ReadWriteLock +import state.{Transactional, TransactionalMap} +import util.Helpers.ReadWriteLock import scala.collection.immutable.HashSet @serializable @@ -13,14 +13,14 @@ class ChangeSet { private val lock = new ReadWriteLock private var transactionalItems: Set[Transactional] = new HashSet - private[kernel] def +(item: Transactional) = lock.withWriteLock { + private[akka] def +(item: Transactional) = lock.withWriteLock { transactionalItems += item } - private[kernel] def items: List[Transactional] = lock.withReadLock { + private[akka] def items: List[Transactional] = lock.withReadLock { transactionalItems.toList.asInstanceOf[List[Transactional]] } - private[kernel] def clear = lock.withWriteLock { + private[akka] def clear = lock.withWriteLock { transactionalItems = new HashSet } diff --git a/akka-stm/src/main/scala/HashTrie.scala b/akka-actors/src/main/scala/stm/HashTrie.scala similarity index 100% rename from akka-stm/src/main/scala/HashTrie.scala rename to akka-actors/src/main/scala/stm/HashTrie.scala diff --git a/akka-actors/src/main/scala/util/ResultOrFailure.scala b/akka-actors/src/main/scala/stm/ResultOrFailure.scala similarity index 91% rename from akka-actors/src/main/scala/util/ResultOrFailure.scala rename to akka-actors/src/main/scala/stm/ResultOrFailure.scala index 69d3f90b38..f768add9c0 100644 --- a/akka-actors/src/main/scala/util/ResultOrFailure.scala +++ b/akka-actors/src/main/scala/stm/ResultOrFailure.scala @@ -1,60 +1,60 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package se.scalablesolutions.akka.kernel.util - -import kernel.stm.Transaction - -/** - * Reference that can hold either a typed value or an exception. - * - * Usage: - *
    - * scala> ResultOrFailure(1)
    - * res0: ResultOrFailure[Int] = ResultOrFailure@a96606
    - *  
    - * scala> res0()
    - * res1: Int = 1
    - *
    - * scala> res0() = 3
    - *
    - * scala> res0()
    - * res3: Int = 3
    - * 
    - * scala> res0() = { println("Hello world"); 3}
    - * Hello world
    - *
    - * scala> res0()
    - * res5: Int = 3
    - *  
    - * scala> res0() = error("Lets see what happens here...")
    - *
    - * scala> res0()
    - * java.lang.RuntimeException: Lets see what happens here...
    - * 	at ResultOrFailure.apply(RefExcept.scala:11)
    - * 	at .(:6)
    - * 	at .()
    - * 	at Re...
    - * 
    - * - * @author Jonas Bonér - */ -class ResultOrFailure[Payload](payload: Payload, val tx: Option[Transaction]) { - private[this] var contents: Either[Throwable, Payload] = Right(payload) - - def update(value: => Payload) = { - contents = try { Right(value) } catch { case (e : Throwable) => Left(e) } - } - - def apply() = contents match { - case Right(payload) => payload - case Left(e) => throw e - } - - override def toString(): String = "ResultOrFailure[" + contents + "]" -} -object ResultOrFailure { - def apply[Payload](payload: Payload, tx: Option[Transaction]) = new ResultOrFailure(payload, tx) - def apply[AnyRef](tx: Option[Transaction]) = new ResultOrFailure(new Object, tx) -} +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.util + +import stm.Transaction + +/** + * Reference that can hold either a typed value or an exception. + * + * Usage: + *
    + * scala> ResultOrFailure(1)
    + * res0: ResultOrFailure[Int] = ResultOrFailure@a96606
    + *  
    + * scala> res0()
    + * res1: Int = 1
    + *
    + * scala> res0() = 3
    + *
    + * scala> res0()
    + * res3: Int = 3
    + * 
    + * scala> res0() = { println("Hello world"); 3}
    + * Hello world
    + *
    + * scala> res0()
    + * res5: Int = 3
    + *  
    + * scala> res0() = error("Lets see what happens here...")
    + *
    + * scala> res0()
    + * java.lang.RuntimeException: Lets see what happens here...
    + * 	at ResultOrFailure.apply(RefExcept.scala:11)
    + * 	at .(:6)
    + * 	at .()
    + * 	at Re...
    + * 
    + * + * @author Jonas Bonér + */ +class ResultOrFailure[Payload](payload: Payload, val tx: Option[Transaction]) { + private[this] var contents: Either[Throwable, Payload] = Right(payload) + + def update(value: => Payload) = { + contents = try { Right(value) } catch { case (e : Throwable) => Left(e) } + } + + def apply() = contents match { + case Right(payload) => payload + case Left(e) => throw e + } + + override def toString(): String = "ResultOrFailure[" + contents + "]" +} +object ResultOrFailure { + def apply[Payload](payload: Payload, tx: Option[Transaction]) = new ResultOrFailure(payload, tx) + def apply[AnyRef](tx: Option[Transaction]) = new ResultOrFailure(new Object, tx) +} diff --git a/akka-stm/src/main/scala/Transaction.scala b/akka-actors/src/main/scala/stm/Transaction.scala similarity index 97% rename from akka-stm/src/main/scala/Transaction.scala rename to akka-actors/src/main/scala/stm/Transaction.scala index b72eb7c2b2..bcd944de23 100644 --- a/akka-stm/src/main/scala/Transaction.scala +++ b/akka-actors/src/main/scala/stm/Transaction.scala @@ -2,11 +2,11 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.stm +package se.scalablesolutions.akka.stm import java.util.concurrent.atomic.{AtomicInteger, AtomicLong} -import kernel.state.Transactional -import kernel.util.Logging +import state.Transactional +import util.Logging @serializable sealed abstract class TransactionStatus object TransactionStatus { @@ -134,7 +134,7 @@ object TransactionIdFactory { throw new IllegalStateException("Expected ACTIVE or NEW transaction - current status [" + status + "]: " + toString) // For reinitialize transaction after sending it over the wire - private[kernel] def reinit = synchronized { + private[akka] def reinit = synchronized { import net.lag.logging.{Logger, Level} if (log == null) { log = Logger.get(this.getClass.getName) diff --git a/akka-stm/src/main/scala/TransactionManagement.scala b/akka-actors/src/main/scala/stm/TransactionManagement.scala similarity index 84% rename from akka-stm/src/main/scala/TransactionManagement.scala rename to akka-actors/src/main/scala/stm/TransactionManagement.scala index e67f4ce861..9782b352cf 100644 --- a/akka-stm/src/main/scala/TransactionManagement.scala +++ b/akka-actors/src/main/scala/stm/TransactionManagement.scala @@ -2,12 +2,12 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.stm +package se.scalablesolutions.akka.stm import java.util.concurrent.atomic.AtomicBoolean -import kernel.reactor.MessageInvocation -import kernel.util.Logging +import reactor.MessageInvocation +import util.Logging import org.codehaus.aspectwerkz.proxy.Uuid // FIXME is java.util.UUID better? class TransactionRollbackException(msg: String) extends RuntimeException(msg) @@ -17,16 +17,17 @@ class TransactionAwareWrapperException(val cause: Throwable, val tx: Option[Tran } object TransactionManagement { - val TIME_WAITING_FOR_COMPLETION = kernel.Kernel.config.getInt("akka.stm.wait-for-completion", 100) - val NR_OF_TIMES_WAITING_FOR_COMPLETION = kernel.Kernel.config.getInt("akka.stm.wait-nr-of-times", 3) - val TRANSACTION_ENABLED = new AtomicBoolean(kernel.Kernel.config.getBool("akka.stm.service", true)) + import Config._ + val TIME_WAITING_FOR_COMPLETION = config.getInt("akka.stm.wait-for-completion", 100) + val NR_OF_TIMES_WAITING_FOR_COMPLETION = config.getInt("akka.stm.wait-nr-of-times", 3) + val TRANSACTION_ENABLED = new AtomicBoolean(config.getBool("akka.stm.service", true)) // FIXME reenable 'akka.stm.restart-on-collision' when new STM is in place - val RESTART_TRANSACTION_ON_COLLISION = false //kernel.Kernel.config.getBool("akka.stm.restart-on-collision", true) + val RESTART_TRANSACTION_ON_COLLISION = false //akka.Kernel.config.getBool("akka.stm.restart-on-collision", true) def isTransactionalityEnabled = TRANSACTION_ENABLED.get def disableTransactions = TRANSACTION_ENABLED.set(false) - private[kernel] val threadBoundTx: ThreadLocal[Option[Transaction]] = new ThreadLocal[Option[Transaction]]() { + private[akka] val threadBoundTx: ThreadLocal[Option[Transaction]] = new ThreadLocal[Option[Transaction]]() { override protected def initialValue: Option[Transaction] = None } } @@ -38,7 +39,7 @@ trait TransactionManagement extends Logging { protected[this] var messageToReschedule: Option[MessageInvocation] = None import TransactionManagement.threadBoundTx - private[kernel] var activeTx: Option[Transaction] = None + private[akka] var activeTx: Option[Transaction] = None protected def startNewTransaction: Option[Transaction] = { val newTx = new Transaction diff --git a/akka-stm/src/main/scala/TransactionWatcher.scala b/akka-actors/src/main/scala/stm/TransactionWatcher.scala similarity index 98% rename from akka-stm/src/main/scala/TransactionWatcher.scala rename to akka-actors/src/main/scala/stm/TransactionWatcher.scala index 755a75f54d..2dd966c7ba 100644 --- a/akka-stm/src/main/scala/TransactionWatcher.scala +++ b/akka-actors/src/main/scala/stm/TransactionWatcher.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.stm +package se.scalablesolutions.akka.stm /* import kernel.util.Logging diff --git a/akka-stm/src/main/scala/TransactionalState.scala b/akka-actors/src/main/scala/stm/TransactionalState.scala similarity index 92% rename from akka-stm/src/main/scala/TransactionalState.scala rename to akka-actors/src/main/scala/stm/TransactionalState.scala index 266070f15b..c671a72ea5 100644 --- a/akka-stm/src/main/scala/TransactionalState.scala +++ b/akka-actors/src/main/scala/stm/TransactionalState.scala @@ -2,9 +2,9 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.state +package se.scalablesolutions.akka.state -import kernel.stm.TransactionManagement +import stm.TransactionManagement import akka.collection._ import org.codehaus.aspectwerkz.proxy.Uuid @@ -44,9 +44,9 @@ trait Transactional { // FIXME: won't work across the cluster val uuid = Uuid.newUuid.toString - private[kernel] def begin - private[kernel] def commit - private[kernel] def rollback + private[akka] def begin + private[akka] def commit + private[akka] def rollback protected def verifyTransaction = { val cflowTx = TransactionManagement.threadBoundTx.get @@ -77,8 +77,8 @@ trait TransactionalMap[K, V] extends Transactional with scala.collection.mutable * @author Jonas Bonér */ class InMemoryTransactionalMap[K, V] extends TransactionalMap[K, V] { - protected[kernel] var state = new HashTrie[K, V] - protected[kernel] var snapshot = state + protected[akka] var state = new HashTrie[K, V] + protected[akka] var snapshot = state // ---- For Transactional ---- override def begin = snapshot = state @@ -159,8 +159,8 @@ abstract class TransactionalVector[T] extends Transactional with RandomAccessSeq * @author Jonas Bonér */ class InMemoryTransactionalVector[T] extends TransactionalVector[T] { - private[kernel] var state: Vector[T] = EmptyVector - private[kernel] var snapshot = state + private[akka] var state: Vector[T] = EmptyVector + private[akka] var snapshot = state def add(elem: T) = { verifyTransaction @@ -214,8 +214,8 @@ class InMemoryTransactionalVector[T] extends TransactionalVector[T] { * @author Jonas Bonér */ class TransactionalRef[T] extends Transactional { - private[kernel] var ref: Option[T] = None - private[kernel] var snapshot: Option[T] = None + private[akka] var ref: Option[T] = None + private[akka] var snapshot: Option[T] = None override def begin = if (ref.isDefined) snapshot = Some(ref.get) diff --git a/akka-stm/src/main/scala/Vector.scala b/akka-actors/src/main/scala/stm/Vector.scala similarity index 100% rename from akka-stm/src/main/scala/Vector.scala rename to akka-actors/src/main/scala/stm/Vector.scala diff --git a/akka-actors/src/test/scala/ActorSpec.scala b/akka-actors/src/test/scala/ActorSpec.scala index 5977301e7a..74ebd13f25 100644 --- a/akka-actors/src/test/scala/ActorSpec.scala +++ b/akka-actors/src/test/scala/ActorSpec.scala @@ -1,4 +1,4 @@ -package se.scalablesolutions.akka.kernel.actor +package se.scalablesolutions.akka.actor import java.util.concurrent.TimeUnit diff --git a/akka-actors/src/test/scala/AllSuite.scala b/akka-actors/src/test/scala/AllSuite.scala index 9609ec8b06..f9bb7c0d1d 100755 --- a/akka-actors/src/test/scala/AllSuite.scala +++ b/akka-actors/src/test/scala/AllSuite.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel +package se.scalablesolutions.akka import org.scalatest._ diff --git a/akka-actors/src/test/scala/AllTest.scala b/akka-actors/src/test/scala/AllTest.scala index 546f5cc446..991b360639 100644 --- a/akka-actors/src/test/scala/AllTest.scala +++ b/akka-actors/src/test/scala/AllTest.scala @@ -1,12 +1,12 @@ -package se.scalablesolutions.akka.kernel +package se.scalablesolutions.akka import junit.framework.Test import junit.framework.TestCase import junit.framework.TestSuite -import kernel.actor.{ActorSpec, RemoteActorSpec, PersistentActorSpec, InMemoryActorSpec} -import kernel.reactor.{EventBasedSingleThreadDispatcherTest, EventBasedThreadPoolDispatcherTest} -import kernel.util.SchedulerSpec +import actor.{ActorSpec, RemoteActorSpec, PersistentActorSpec, InMemoryActorSpec} +import reactor.{EventBasedSingleThreadDispatcherTest, EventBasedThreadPoolDispatcherTest} +import util.SchedulerSpec object AllTest extends TestCase { def suite(): Test = { diff --git a/akka-actors/src/test/scala/CamelSpec.scala b/akka-actors/src/test/scala/CamelSpec.scala index f988d9daa5..aa64a48cdb 100644 --- a/akka-actors/src/test/scala/CamelSpec.scala +++ b/akka-actors/src/test/scala/CamelSpec.scala @@ -2,11 +2,11 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel +package se.scalablesolutions.akka -import akka.kernel.config.ActiveObjectGuiceConfigurator +import config.ActiveObjectGuiceConfigurator import annotation.oneway -import kernel.config.ScalaConfig._ +import config.ScalaConfig._ import com.google.inject.{AbstractModule, Scopes} //import com.jteigen.scalatest.JUnit4Runner diff --git a/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala b/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala index 3ac4eee51a..758f9d6cd0 100644 --- a/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala +++ b/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala @@ -1,4 +1,4 @@ -package se.scalablesolutions.akka.kernel.reactor +package se.scalablesolutions.akka.reactor import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit diff --git a/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala b/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala index c0b205d6f6..a57ad0b825 100644 --- a/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala +++ b/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala @@ -1,4 +1,4 @@ -package se.scalablesolutions.akka.kernel.reactor +package se.scalablesolutions.akka.reactor import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy import java.util.concurrent.atomic.AtomicBoolean diff --git a/akka-actors/src/test/scala/InMemoryActorSpec.scala b/akka-actors/src/test/scala/InMemoryActorSpec.scala index 5ce06a10b3..eb9b0d4a90 100644 --- a/akka-actors/src/test/scala/InMemoryActorSpec.scala +++ b/akka-actors/src/test/scala/InMemoryActorSpec.scala @@ -1,7 +1,7 @@ -package se.scalablesolutions.akka.kernel.actor +package se.scalablesolutions.akka.actor import junit.framework.TestCase -import kernel.state.TransactionalState +import state.TransactionalState import org.junit.{Test, Before} import org.junit.Assert._ diff --git a/akka-actors/src/test/scala/Messages.scala b/akka-actors/src/test/scala/Messages.scala index 51e735db8c..7e4d5ca66f 100644 --- a/akka-actors/src/test/scala/Messages.scala +++ b/akka-actors/src/test/scala/Messages.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel +package se.scalablesolutions.akka import akka.serialization.Serializable diff --git a/akka-actors/src/test/scala/RemoteActorSpec.scala b/akka-actors/src/test/scala/RemoteActorSpec.scala index 3387aa8eb0..6e60ebffce 100644 --- a/akka-actors/src/test/scala/RemoteActorSpec.scala +++ b/akka-actors/src/test/scala/RemoteActorSpec.scala @@ -1,8 +1,8 @@ -package se.scalablesolutions.akka.kernel.actor +package se.scalablesolutions.akka.actor import java.util.concurrent.TimeUnit import junit.framework.TestCase -import kernel.nio.{RemoteServer, RemoteClient} +import nio.{RemoteServer, RemoteClient} import org.junit.{Test, Before} import org.junit.Assert._ diff --git a/akka-actors/src/test/scala/RemoteSupervisorSpec.scala b/akka-actors/src/test/scala/RemoteSupervisorSpec.scala index c8e3770cec..2ce554b115 100644 --- a/akka-actors/src/test/scala/RemoteSupervisorSpec.scala +++ b/akka-actors/src/test/scala/RemoteSupervisorSpec.scala @@ -2,12 +2,12 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel +package se.scalablesolutions.akka import akka.serialization.BinaryString -import kernel.nio.{RemoteClient, RemoteServer} -import kernel.actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor} -import kernel.config.ScalaConfig._ +import nio.{RemoteClient, RemoteServer} +import actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor} +import config.ScalaConfig._ //import com.jteigen.scalatest.JUnit4Runner import org.junit.runner.RunWith diff --git a/akka-actors/src/test/scala/SchedulerSpec.scala b/akka-actors/src/test/scala/SchedulerSpec.scala index bf763046fc..be1e8880b1 100644 --- a/akka-actors/src/test/scala/SchedulerSpec.scala +++ b/akka-actors/src/test/scala/SchedulerSpec.scala @@ -1,4 +1,4 @@ -package se.scalablesolutions.akka.kernel.util +package se.scalablesolutions.akka.util import se.scalablesolutions.akka.kernel.actor.Actor diff --git a/akka-actors/src/test/scala/SupervisorSpec.scala b/akka-actors/src/test/scala/SupervisorSpec.scala index d10b987522..2d3ee77ce7 100644 --- a/akka-actors/src/test/scala/SupervisorSpec.scala +++ b/akka-actors/src/test/scala/SupervisorSpec.scala @@ -2,10 +2,10 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel +package se.scalablesolutions.akka.actor -import kernel.actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor} -import kernel.config.ScalaConfig._ +import actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor} +import config.ScalaConfig._ //import com.jteigen.scalatest.JUnit4Runner import org.junit.runner.RunWith diff --git a/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala b/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala index 1ad5c0b733..a76d02815d 100644 --- a/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala +++ b/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala @@ -1,4 +1,4 @@ -package se.scalablesolutions.akka.kernel.reactor +package se.scalablesolutions.akka.reactor import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit diff --git a/akka-actors/src/test/scala/TransactionClasherSpec.scala b/akka-actors/src/test/scala/TransactionClasherSpec.scala index b04f14d120..e9bf2b11a0 100644 --- a/akka-actors/src/test/scala/TransactionClasherSpec.scala +++ b/akka-actors/src/test/scala/TransactionClasherSpec.scala @@ -1,12 +1,12 @@ -package se.scalablesolutions.akka.kernel.actor +package se.scalablesolutions.akka.actor import junit.framework.TestCase -import kernel.stm.TransactionRollbackException +import stm.TransactionRollbackException import org.junit.{Test, Before} import org.junit.Assert._ -import kernel.state.TransactionalState +import state.TransactionalState object Log { var log = "" diff --git a/akka-amqp/pom.xml b/akka-amqp/pom.xml index 5e67d7a046..ef45bc8c2f 100644 --- a/akka-amqp/pom.xml +++ b/akka-amqp/pom.xml @@ -16,7 +16,12 @@ - akka-kernel + akka-util + se.scalablesolutions.akka + 0.6 + + + akka-actors se.scalablesolutions.akka 0.6 diff --git a/akka-camel/pom.xml b/akka-camel/pom.xml index 61529e85af..797b8fef53 100644 --- a/akka-camel/pom.xml +++ b/akka-camel/pom.xml @@ -17,6 +17,11 @@ + + akka-util + se.scalablesolutions.akka + 0.6 + akka-actors se.scalablesolutions.akka diff --git a/akka-camel/src/main/scala/ActiveObjectComponent.scala b/akka-camel/src/main/scala/ActiveObjectComponent.scala index 39489156f9..f95fd3c2ed 100644 --- a/akka-camel/src/main/scala/ActiveObjectComponent.scala +++ b/akka-camel/src/main/scala/ActiveObjectComponent.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.camel +package se.scalablesolutions.akka.camel import config.ActiveObjectConfigurator diff --git a/akka-camel/src/main/scala/ActiveObjectConsumer.scala b/akka-camel/src/main/scala/ActiveObjectConsumer.scala index e7be8b0dd9..f9f187de45 100644 --- a/akka-camel/src/main/scala/ActiveObjectConsumer.scala +++ b/akka-camel/src/main/scala/ActiveObjectConsumer.scala @@ -2,11 +2,11 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.camel +package se.scalablesolutions.akka.camel import java.util.concurrent.{BlockingQueue, ExecutorService, Executors, ThreadFactory, TimeUnit} -import kernel.util.Logging +import util.Logging import org.apache.camel.{AsyncCallback, AsyncProcessor, Consumer, Exchange, Processor} import org.apache.camel.impl.ServiceSupport diff --git a/akka-camel/src/main/scala/ActiveObjectEndpoint.scala b/akka-camel/src/main/scala/ActiveObjectEndpoint.scala index 4f9792a2d0..3999c0b897 100644 --- a/akka-camel/src/main/scala/ActiveObjectEndpoint.scala +++ b/akka-camel/src/main/scala/ActiveObjectEndpoint.scala @@ -2,10 +2,10 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.camel +package se.scalablesolutions.akka.camel -import kernel.config.ActiveObjectConfigurator -import kernel.util.Logging +import config.ActiveObjectConfigurator +import util.Logging import java.util.{ArrayList, HashSet, List, Set} import java.util.concurrent.{BlockingQueue, CopyOnWriteArraySet, LinkedBlockingQueue} diff --git a/akka-camel/src/main/scala/ActiveObjectProducer.scala b/akka-camel/src/main/scala/ActiveObjectProducer.scala index f2af00517c..9494510097 100644 --- a/akka-camel/src/main/scala/ActiveObjectProducer.scala +++ b/akka-camel/src/main/scala/ActiveObjectProducer.scala @@ -2,10 +2,10 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.camel +package se.scalablesolutions.akka.camel import java.util.Collection -import kernel.util.Logging; +import util.Logging; import java.util.concurrent.BlockingQueue; import org.apache.camel.{Exchange, AsyncProcessor, AsyncCallback} diff --git a/akka-actors/src/main/scala/config/CamelConfigurator.scala b/akka-camel/src/main/scala/CamelConfigurator.scala similarity index 94% rename from akka-actors/src/main/scala/config/CamelConfigurator.scala rename to akka-camel/src/main/scala/CamelConfigurator.scala index 9cebafed9b..680680f188 100644 --- a/akka-actors/src/main/scala/config/CamelConfigurator.scala +++ b/akka-camel/src/main/scala/CamelConfigurator.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.config +package se.scalablesolutions.akka.config import org.apache.camel.{Routes, CamelContext, Endpoint} diff --git a/akka-camel/src/main/scala/MessageDriven.scala b/akka-camel/src/main/scala/MessageDriven.scala index 889ddafeff..3e73a4101b 100644 --- a/akka-camel/src/main/scala/MessageDriven.scala +++ b/akka-camel/src/main/scala/MessageDriven.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.camel +package se.scalablesolutions.akka.camel import org.apache.camel.Exchange diff --git a/akka-camel/src/main/scala/SupervisorAwareCamelContext.scala b/akka-camel/src/main/scala/SupervisorAwareCamelContext.scala index b56d3f8d82..4b9ee8b41d 100644 --- a/akka-camel/src/main/scala/SupervisorAwareCamelContext.scala +++ b/akka-camel/src/main/scala/SupervisorAwareCamelContext.scala @@ -2,10 +2,10 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.camel +package se.scalablesolutions.akka.camel -import kernel.actor.Supervisor -import kernel.util.Logging +import actor.Supervisor +import util.Logging import org.apache.camel.impl.{DefaultCamelContext, DefaultEndpoint, DefaultComponent} /** diff --git a/akka-kernel/pom.xml b/akka-kernel/pom.xml index 4508ab68b6..12929b4a02 100644 --- a/akka-kernel/pom.xml +++ b/akka-kernel/pom.xml @@ -44,7 +44,7 @@ - se.scalablesolutions.akka.kernel.Kernel + se.scalablesolutions.akka.Kernel diff --git a/akka-kernel/src/main/scala/Boot.scala b/akka-kernel/src/main/scala/Boot.scala deleted file mode 100644 index ded1c1c732..0000000000 --- a/akka-kernel/src/main/scala/Boot.scala +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package se.scalablesolutions.akka - -import java.io.File -import java.net.URLClassLoader -import kernel.util.Logging - -/** - * Bootstraps the Akka server by isolating the server classes and all its dependency JARs into its own classloader. - * - * @author Jonas Bonér - */ -object Boot extends Logging { - - val HOME = { - val home = System.getenv("AKKA_HOME") - if (home == null) throw new IllegalStateException("No 'AKKA_HOME' environment variable set. You have to set 'AKKA_HOME' to the root of the Akka distribution.") - else home - } - val CLASSES = HOME + "/kernel/target/classes" // FIXME remove for dist - val LIB = HOME + "/lib" - val CONFIG = HOME + "/config" - val DEPLOY = HOME + "/deploy" - - /** - * Assumes that the AKKA_HOME directory is set with /bin, /config, /deploy and /lib beneath it holding config files and jars. - * Thus: - * $AKKA_HOME/bin - * $AKKA_HOME/config - * $AKKA_HOME/lib - * $AKKA_HOME/deploy - */ - def main(args: Array[String]): Unit = { - log.info("Bootstrapping Akka server from [AKKA_HOME=%s]", HOME) - - val LIB_DIR = new File(LIB) - val DEPLOY_DIR = new File(DEPLOY) - if (!LIB_DIR.exists) { log.error("Could not find a lib directory with all the akka dependencies at [" + DEPLOY + "]"); System.exit(-1) } - if (!DEPLOY_DIR.exists) { log.error("Could not find a deploy directory at [" + DEPLOY + "]"); System.exit(-1) } - - val toDeploy = for (f <- DEPLOY_DIR.listFiles().toArray.toList.asInstanceOf[List[File]]) yield f.toURL - if (toDeploy.isEmpty) log.warning("No jars could be found in the [" + DEPLOY + "] directory, nothing to deploy") - val libs = for (f <- LIB_DIR.listFiles().toArray.toList.asInstanceOf[List[File]]) yield f.toURL - val urls = new File(CLASSES).toURL :: (libs ::: toDeploy) - - val loader = new URLClassLoader(urls.toArray, ClassLoader.getSystemClassLoader.getParent) - val mainClass = loader.loadClass(args(0)) - val mainMethod = mainClass.getMethod("main", Array(args.getClass): _*) - Thread.currentThread.setContextClassLoader(loader) - - val serverArgs = new Array[String](args.length - 1) - System.arraycopy(args, 1, serverArgs, 0, serverArgs.length) - mainMethod.invoke(null, Array[Object](serverArgs): _*) - } -} - diff --git a/akka-kernel/src/main/scala/Kernel.scala b/akka-kernel/src/main/scala/Kernel.scala index 5c05d16193..43a01b1a7e 100644 --- a/akka-kernel/src/main/scala/Kernel.scala +++ b/akka-kernel/src/main/scala/Kernel.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel +package se.scalablesolutions.akka import com.sun.grizzly.http.SelectorThread import com.sun.grizzly.http.servlet.ServletAdapter @@ -14,34 +14,24 @@ import java.net.URLClassLoader import net.lag.configgy.{Config, Configgy, RuntimeEnvironment, ParseException} -import kernel.rest.AkkaCometServlet -import kernel.nio.RemoteServer -import kernel.state.CassandraStorage -import kernel.util.Logging +import rest.AkkaCometServlet +import nio.RemoteServer +import state.CassandraStorage +import util.Logging /** * @author Jonas Bonér */ object Kernel extends Logging { - val VERSION = "0.6" - val HOME = { - val home = System.getenv("AKKA_HOME") - if (home == null) None - else Some(home) - } - - val config = setupConfig - - val CONFIG_VERSION = config.getString("akka.version", "0") - if (VERSION != CONFIG_VERSION) throw new IllegalStateException("Akka JAR version [" + VERSION + "] is different than the provided config ('akka.conf') version [" + CONFIG_VERSION + "]") + import Config._ val BOOT_CLASSES = config.getList("akka.boot") val RUN_REMOTE_SERVICE = config.getBool("akka.remote.service", true) val STORAGE_SYSTEM = config.getString("akka.storage.system", "cassandra") val RUN_REST_SERVICE = config.getBool("akka.rest.service", true) - val REST_HOSTNAME = kernel.Kernel.config.getString("akka.rest.hostname", "localhost") + val REST_HOSTNAME = config.getString("akka.rest.hostname", "localhost") val REST_URL = "http://" + REST_HOSTNAME - val REST_PORT = kernel.Kernel.config.getInt("akka.rest.port", 9998) + val REST_PORT = config.getInt("akka.rest.port", 9998) // FIXME add API to shut server down gracefully @volatile private var hasBooted = false @@ -68,27 +58,6 @@ object Kernel extends Logging { } } - def uptime = (System.currentTimeMillis - startTime) / 1000 - - private def setupConfig: Config = { - if (HOME.isDefined) { - try { - val configFile = HOME.get + "/config/akka.conf" - Configgy.configure(configFile) - log.info("AKKA_HOME is defined to [%s], config loaded from [%s].", HOME.get, configFile) - } catch { - case e: ParseException => throw new IllegalStateException("'akka.conf' config file can not be found in [" + HOME + "/config/akka.conf] - aborting. Either add it in the 'config' directory or add it to the classpath.") - } - } else { - try { - Configgy.configureFromResource("akka.conf", getClass.getClassLoader) - log.info("Config loaded from the application classpath.") - } catch { - case e: ParseException => throw new IllegalStateException("'$AKKA_HOME/config/akka.conf' could not be found and no 'akka.conf' can be found on the classpath - aborting. . Either add it in the '$AKKA_HOME/config' directory or add it to the classpath.") - } - } - Configgy.config - } private[akka] def runApplicationBootClasses = { val loader = diff --git a/akka-persistence/pom.xml b/akka-persistence/pom.xml index ab2c31f66b..a0563f1cb0 100644 --- a/akka-persistence/pom.xml +++ b/akka-persistence/pom.xml @@ -16,7 +16,12 @@ - akka-kernel + akka-util + se.scalablesolutions.akka + 0.6 + + + akka-actors se.scalablesolutions.akka 0.6 diff --git a/akka-rest/pom.xml b/akka-rest/pom.xml index b79694aaeb..de7e29e5c8 100644 --- a/akka-rest/pom.xml +++ b/akka-rest/pom.xml @@ -17,6 +17,16 @@ + + akka-util + se.scalablesolutions.akka + 0.6 + + + akka-kernel + se.scalablesolutions.akka + 0.6 + akka-actors se.scalablesolutions.akka diff --git a/akka-rest/src/main/scala/ActorComponentProvider.scala b/akka-rest/src/main/scala/ActorComponentProvider.scala index f7a577f61f..4985bc48de 100755 --- a/akka-rest/src/main/scala/ActorComponentProvider.scala +++ b/akka-rest/src/main/scala/ActorComponentProvider.scala @@ -2,12 +2,12 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.rest +package se.scalablesolutions.akka.rest import com.sun.jersey.core.spi.component.ioc.IoCFullyManagedComponentProvider -import kernel.config.Configurator -import kernel.util.Logging +import config.Configurator +import util.Logging class ActorComponentProvider(val clazz: Class[_], val configurators: List[Configurator]) extends IoCFullyManagedComponentProvider with Logging { diff --git a/akka-rest/src/main/scala/ActorComponentProviderFactory.scala b/akka-rest/src/main/scala/ActorComponentProviderFactory.scala index 1a46e44ff8..5917ea2ea8 100755 --- a/akka-rest/src/main/scala/ActorComponentProviderFactory.scala +++ b/akka-rest/src/main/scala/ActorComponentProviderFactory.scala @@ -2,17 +2,15 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.rest +package se.scalablesolutions.akka.rest -import kernel.Kernel -import util.Logging import javax.ws.rs.core.Context import com.sun.jersey.core.spi.component.ioc.{IoCComponentProvider,IoCComponentProviderFactory} import com.sun.jersey.core.spi.component.{ComponentContext} import config.Configurator - +import util.Logging class ActorComponentProviderFactory(val configurators: List[Configurator]) extends IoCComponentProviderFactory with Logging { diff --git a/akka-rest/src/main/scala/AkkaServlet.scala b/akka-rest/src/main/scala/AkkaServlet.scala index 885d3e6321..baff100abc 100755 --- a/akka-rest/src/main/scala/AkkaServlet.scala +++ b/akka-rest/src/main/scala/AkkaServlet.scala @@ -2,9 +2,8 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.rest +package se.scalablesolutions.akka.rest -import kernel.Kernel import config.ConfiguratorRepository import util.Logging @@ -32,7 +31,7 @@ import scala.collection.jcl.Conversions._ class AkkaServlet extends ServletContainer with AtmosphereServletProcessor with Logging { override def initiate(rc: ResourceConfig, wa: WebApplication) = { - Kernel.boot // will boot if not already booted by 'main' + akka.Kernel.boot // will boot if not already booted by 'main' val configurators = ConfiguratorRepository.getConfiguratorsFor(getServletContext) rc.getClasses.addAll(configurators.flatMap(_.getComponentInterfaces)) diff --git a/akka-rest/src/main/scala/NodeWriter.scala b/akka-rest/src/main/scala/NodeWriter.scala index c301d9c2b5..58c127b411 100755 --- a/akka-rest/src/main/scala/NodeWriter.scala +++ b/akka-rest/src/main/scala/NodeWriter.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.rest +package se.scalablesolutions.akka.rest import java.io.OutputStream import java.lang.annotation.Annotation diff --git a/akka-samples-java/pom.xml b/akka-samples-java/pom.xml index ec1c023ae9..2a7cf2adff 100644 --- a/akka-samples-java/pom.xml +++ b/akka-samples-java/pom.xml @@ -16,12 +16,32 @@ - akka-kernel + akka-util-java se.scalablesolutions.akka 0.6 - akka-util-java + akka-util + se.scalablesolutions.akka + 0.6 + + + akka-actors + se.scalablesolutions.akka + 0.6 + + + akka-persistence + se.scalablesolutions.akka + 0.6 + + + akka-rest + se.scalablesolutions.akka + 0.6 + + + akka-kernel se.scalablesolutions.akka 0.6 diff --git a/akka-samples-lift/pom.xml b/akka-samples-lift/pom.xml index ab7b8f7554..c48bed46e0 100644 --- a/akka-samples-lift/pom.xml +++ b/akka-samples-lift/pom.xml @@ -19,14 +19,34 @@ - + + akka-util-java se.scalablesolutions.akka - akka-kernel 0.6 + akka-util + se.scalablesolutions.akka + 0.6 + + + akka-actors + se.scalablesolutions.akka + 0.6 + + + akka-persistence + se.scalablesolutions.akka + 0.6 + + + akka-rest + se.scalablesolutions.akka + 0.6 + + + akka-kernel se.scalablesolutions.akka - akka-util-java 0.6 diff --git a/akka-samples-scala/pom.xml b/akka-samples-scala/pom.xml index 6c2968f970..59e9948e3d 100644 --- a/akka-samples-scala/pom.xml +++ b/akka-samples-scala/pom.xml @@ -15,13 +15,33 @@ - - akka-kernel + + akka-util-java se.scalablesolutions.akka 0.6 - akka-util-java + akka-util + se.scalablesolutions.akka + 0.6 + + + akka-actors + se.scalablesolutions.akka + 0.6 + + + akka-persistence + se.scalablesolutions.akka + 0.6 + + + akka-rest + se.scalablesolutions.akka + 0.6 + + + akka-kernel se.scalablesolutions.akka 0.6 diff --git a/akka-stm/pom.xml b/akka-stm/pom.xml deleted file mode 100644 index 12da6ab9d0..0000000000 --- a/akka-stm/pom.xml +++ /dev/null @@ -1,95 +0,0 @@ - - 4.0.0 - - akka-kernel - Akka Kernel Module - - jar - - - akka - se.scalablesolutions.akka - 0.6 - ../pom.xml - - - - - - akka-actors - se.scalablesolutions.akka - 0.6 - - - org.apache - zookeeper - 3.1.0 - - - - - - - maven-assembly-plugin - 2.2-beta-2 - - - create-executable-jar - install - - single - - - - - jar-with-dependencies - - - - - se.scalablesolutions.akka.kernel.Kernel - - - - - - - - maven-antrun-plugin - - - install - - - - - - - run - - - - - - - - false - ../config - - akka.conf - akka-reference.conf - - - - false - src/main/resources - - META-INF/* - - - - - diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/config/ActiveObjectGuiceModule.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/config/ActiveObjectGuiceModule.java similarity index 94% rename from akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/config/ActiveObjectGuiceModule.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/config/ActiveObjectGuiceModule.java index 052409d5fd..6ec4dae990 100644 --- a/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/config/ActiveObjectGuiceModule.java +++ b/akka-util-java/src/main/java/se/scalablesolutions/akka/config/ActiveObjectGuiceModule.java @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.config; +package se.scalablesolutions.akka.config; import java.util.List; diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/config/DependencyBinding.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/config/DependencyBinding.java similarity index 90% rename from akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/config/DependencyBinding.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/config/DependencyBinding.java index 40d45869a8..feda1c8486 100644 --- a/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/config/DependencyBinding.java +++ b/akka-util-java/src/main/java/se/scalablesolutions/akka/config/DependencyBinding.java @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.config; +package se.scalablesolutions.akka.config; /** * @author Jonas Bonér diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java b/akka-util-java/src/main/java/se/scalablesolutions/akka/nio/protobuf/RemoteProtocol.java similarity index 79% rename from akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java rename to akka-util-java/src/main/java/se/scalablesolutions/akka/nio/protobuf/RemoteProtocol.java index c36d54c2c7..38022db312 100644 --- a/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java +++ b/akka-util-java/src/main/java/se/scalablesolutions/akka/nio/protobuf/RemoteProtocol.java @@ -1,6 +1,6 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! -package se.scalablesolutions.akka.kernel.nio.protobuf; +package se.scalablesolutions.akka.nio.protobuf; public final class RemoteProtocol { private RemoteProtocol() {} @@ -23,13 +23,13 @@ public final class RemoteProtocol { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteRequest_descriptor; + return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_descriptor; } @Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteRequest_fieldAccessorTable; + return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_fieldAccessorTable; } // required uint64 id = 1; @@ -217,57 +217,57 @@ public final class RemoteProtocol { return size; } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return newBuilder().mergeFrom(data).buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistry extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return newBuilder().mergeFrom(data, extensionRegistry) .buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(byte[] data) + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return newBuilder().mergeFrom(data).buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( byte[] data, com.google.protobuf.ExtensionRegistry extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return newBuilder().mergeFrom(data, extensionRegistry) .buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(java.io.InputStream input) + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom(java.io.InputStream input) throws java.io.IOException { return newBuilder().mergeFrom(input).buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistry extensionRegistry) throws java.io.IOException { return newBuilder().mergeFrom(input, extensionRegistry) .buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest parseDelimitedFrom(java.io.InputStream input) + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return newBuilder().mergeDelimitedFrom(input).buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest parseDelimitedFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistry extensionRegistry) throws java.io.IOException { return newBuilder().mergeDelimitedFrom(input, extensionRegistry) .buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return newBuilder().mergeFrom(input).buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistry extensionRegistry) throws java.io.IOException { @@ -277,26 +277,26 @@ public final class RemoteProtocol { public static Builder newBuilder() { return new Builder(); } public Builder newBuilderForType() { return new Builder(); } - public static Builder newBuilder(se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest prototype) { + public static Builder newBuilder(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest prototype) { return new Builder().mergeFrom(prototype); } public Builder toBuilder() { return newBuilder(this); } public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder { - // Construct using se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest.newBuilder() + // Construct using se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.newBuilder() private Builder() {} - se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest result = new se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest(); + se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest result = new se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest(); @Override - protected se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest internalGetResult() { + protected se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest internalGetResult() { return result; } @Override public Builder clear() { - result = new se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest(); + result = new se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest(); return this; } @@ -308,14 +308,14 @@ public final class RemoteProtocol { @Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest.getDescriptor(); + return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.getDescriptor(); } - public se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest getDefaultInstanceForType() { - return se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance(); + public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest getDefaultInstanceForType() { + return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance(); } - public se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest build() { + public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest build() { if (result != null && !isInitialized()) { throw new com.google.protobuf.UninitializedMessageException( result); @@ -323,7 +323,7 @@ public final class RemoteProtocol { return buildPartial(); } - private se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest buildParsed() + private se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest buildParsed() throws com.google.protobuf.InvalidProtocolBufferException { if (!isInitialized()) { throw new com.google.protobuf.UninitializedMessageException( @@ -332,27 +332,27 @@ public final class RemoteProtocol { return buildPartial(); } - public se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest buildPartial() { + public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest buildPartial() { if (result == null) { throw new IllegalStateException( "build() has already been called on this Builder."); } - se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest returnMe = result; + se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest returnMe = result; result = null; return returnMe; } @Override public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest) { - return mergeFrom((se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest)other); + if (other instanceof se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest) { + return mergeFrom((se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest other) { - if (other == se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance()) return this; + public Builder mergeFrom(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest other) { + if (other == se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.getDefaultInstance()) return this; if (other.hasId()) { setId(other.getId()); } @@ -684,7 +684,7 @@ public final class RemoteProtocol { } static { - se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.getDescriptor(); + se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.getDescriptor(); } } @@ -704,13 +704,13 @@ public final class RemoteProtocol { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_descriptor; + return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_descriptor; } @Override protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_fieldAccessorTable; + return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_fieldAccessorTable; } // required uint64 id = 1; @@ -851,57 +851,57 @@ public final class RemoteProtocol { return size; } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return newBuilder().mergeFrom(data).buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistry extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return newBuilder().mergeFrom(data, extensionRegistry) .buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(byte[] data) + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return newBuilder().mergeFrom(data).buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( byte[] data, com.google.protobuf.ExtensionRegistry extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return newBuilder().mergeFrom(data, extensionRegistry) .buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(java.io.InputStream input) + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom(java.io.InputStream input) throws java.io.IOException { return newBuilder().mergeFrom(input).buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistry extensionRegistry) throws java.io.IOException { return newBuilder().mergeFrom(input, extensionRegistry) .buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply parseDelimitedFrom(java.io.InputStream input) + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return newBuilder().mergeDelimitedFrom(input).buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply parseDelimitedFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistry extensionRegistry) throws java.io.IOException { return newBuilder().mergeDelimitedFrom(input, extensionRegistry) .buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return newBuilder().mergeFrom(input).buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( + public static se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistry extensionRegistry) throws java.io.IOException { @@ -909,28 +909,28 @@ public final class RemoteProtocol { .buildParsed(); } - public static se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.Builder newBuilder() { return new se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.Builder(); } - public se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.Builder newBuilderForType() { return new se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.Builder(); } - public static Builder newBuilder(se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply prototype) { - return new se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.Builder().mergeFrom(prototype); + public static Builder newBuilder() { return new Builder(); } + public Builder newBuilderForType() { return new Builder(); } + public static Builder newBuilder(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply prototype) { + return new Builder().mergeFrom(prototype); } - public se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.Builder toBuilder() { return newBuilder(this); } + public Builder toBuilder() { return newBuilder(this); } public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder { - // Construct using se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.newBuilder() + // Construct using se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.newBuilder() private Builder() {} - se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply result = new se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply(); + se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply result = new se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply(); @Override - protected se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply internalGetResult() { + protected se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply internalGetResult() { return result; } @Override public Builder clear() { - result = new se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply(); + result = new se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply(); return this; } @@ -942,14 +942,14 @@ public final class RemoteProtocol { @Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.getDescriptor(); + return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.getDescriptor(); } - public se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply getDefaultInstanceForType() { - return se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance(); + public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply getDefaultInstanceForType() { + return se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance(); } - public se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply build() { + public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply build() { if (result != null && !isInitialized()) { throw new com.google.protobuf.UninitializedMessageException( result); @@ -957,7 +957,7 @@ public final class RemoteProtocol { return buildPartial(); } - private se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply buildParsed() + private se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply buildParsed() throws com.google.protobuf.InvalidProtocolBufferException { if (!isInitialized()) { throw new com.google.protobuf.UninitializedMessageException( @@ -966,27 +966,27 @@ public final class RemoteProtocol { return buildPartial(); } - public se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply buildPartial() { + public se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply buildPartial() { if (result == null) { throw new IllegalStateException( "build() has already been called on this Builder."); } - se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply returnMe = result; + se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply returnMe = result; result = null; return returnMe; } @Override public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply) { - return mergeFrom((se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply)other); + if (other instanceof se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply) { + return mergeFrom((se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply other) { - if (other == se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance()) return this; + public Builder mergeFrom(se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply other) { + if (other == se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.getDefaultInstance()) return this; if (other.hasId()) { setId(other.getId()); } @@ -1240,20 +1240,20 @@ public final class RemoteProtocol { } static { - se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.getDescriptor(); + se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.getDescriptor(); } } private static com.google.protobuf.Descriptors.Descriptor - internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteRequest_descriptor; + internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_descriptor; private static com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteRequest_fieldAccessorTable; + internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_fieldAccessorTable; private static com.google.protobuf.Descriptors.Descriptor - internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_descriptor; + internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_descriptor; private static com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_fieldAccessorTable; + internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_fieldAccessorTable; public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { @@ -1263,40 +1263,40 @@ public final class RemoteProtocol { descriptor; static { java.lang.String descriptorData = - "\nBse/scalablesolutions/akka/kernel/nio/p" + - "rotobuf/RemoteProtocol.proto\022-se.scalabl" + - "esolutions.akka.kernel.nio.protobuf\"\326\001\n\r" + - "RemoteRequest\022\n\n\002id\030\001 \002(\004\022\020\n\010protocol\030\002 " + - "\002(\r\022\017\n\007message\030\003 \002(\014\022\027\n\017messageManifest\030" + - "\004 \001(\014\022\016\n\006method\030\005 \001(\t\022\016\n\006target\030\006 \002(\t\022\017\n" + - "\007timeout\030\007 \002(\004\022\026\n\016supervisorUuid\030\010 \001(\t\022\017" + - "\n\007isActor\030\t \002(\010\022\020\n\010isOneWay\030\n \002(\010\022\021\n\tisE" + - "scaped\030\013 \002(\010\"\247\001\n\013RemoteReply\022\n\n\002id\030\001 \002(\004" + - "\022\020\n\010protocol\030\002 \001(\r\022\017\n\007message\030\003 \001(\014\022\027\n\017m" + - "essageManifest\030\004 \001(\014\022\021\n\texception\030\005 \001(\t\022" + - "\026\n\016supervisorUuid\030\006 \001(\t\022\017\n\007isActor\030\007 \002(\010" + - "\022\024\n\014isSuccessful\030\010 \002(\010B\002H\001"; + "\n;se/scalablesolutions/akka/nio/protobuf" + + "/RemoteProtocol.proto\022&se.scalablesoluti" + + "ons.akka.nio.protobuf\"\326\001\n\rRemoteRequest\022" + + "\n\n\002id\030\001 \002(\004\022\020\n\010protocol\030\002 \002(\r\022\017\n\007message" + + "\030\003 \002(\014\022\027\n\017messageManifest\030\004 \001(\014\022\016\n\006metho" + + "d\030\005 \001(\t\022\016\n\006target\030\006 \002(\t\022\017\n\007timeout\030\007 \002(\004" + + "\022\026\n\016supervisorUuid\030\010 \001(\t\022\017\n\007isActor\030\t \002(" + + "\010\022\020\n\010isOneWay\030\n \002(\010\022\021\n\tisEscaped\030\013 \002(\010\"\247" + + "\001\n\013RemoteReply\022\n\n\002id\030\001 \002(\004\022\020\n\010protocol\030\002" + + " \001(\r\022\017\n\007message\030\003 \001(\014\022\027\n\017messageManifest" + + "\030\004 \001(\014\022\021\n\texception\030\005 \001(\t\022\026\n\016supervisorU" + + "uid\030\006 \001(\t\022\017\n\007isActor\030\007 \002(\010\022\024\n\014isSuccessf" + + "ul\030\010 \002(\010B\002H\001"; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { public com.google.protobuf.ExtensionRegistry assignDescriptors( com.google.protobuf.Descriptors.FileDescriptor root) { descriptor = root; - internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteRequest_descriptor = + internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_descriptor = getDescriptor().getMessageTypes().get(0); - internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteRequest_fieldAccessorTable = new + internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteRequest_descriptor, + internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteRequest_descriptor, new java.lang.String[] { "Id", "Protocol", "Message", "MessageManifest", "Method", "Target", "Timeout", "SupervisorUuid", "IsActor", "IsOneWay", "IsEscaped", }, - se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest.class, - se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteRequest.Builder.class); - internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_descriptor = + se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.class, + se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest.Builder.class); + internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_descriptor = getDescriptor().getMessageTypes().get(1); - internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_fieldAccessorTable = new + internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_descriptor, + internal_static_se_scalablesolutions_akka_nio_protobuf_RemoteReply_descriptor, new java.lang.String[] { "Id", "Protocol", "Message", "MessageManifest", "Exception", "SupervisorUuid", "IsActor", "IsSuccessful", }, - se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.class, - se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.Builder.class); + se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.class, + se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteReply.Builder.class); return null; } }; diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto b/akka-util-java/src/main/java/se/scalablesolutions/akka/nio/protobuf/RemoteProtocol.proto similarity index 81% rename from akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto rename to akka-util-java/src/main/java/se/scalablesolutions/akka/nio/protobuf/RemoteProtocol.proto index b58fb392b3..148b3960ae 100644 --- a/akka-util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto +++ b/akka-util-java/src/main/java/se/scalablesolutions/akka/nio/protobuf/RemoteProtocol.proto @@ -2,12 +2,12 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.nio.protobuf; +package se.scalablesolutions.akka.nio.protobuf; /* Compile with: - cd ./util-java/src/main/java - protoc se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto --java_out . + cd ./akka-util-java/src/main/java + protoc se/scalablesolutions/akka/nio/protobuf/RemoteProtocol.proto --java_out . */ option optimize_for = SPEED; diff --git a/akka-util/pom.xml b/akka-util/pom.xml new file mode 100644 index 0000000000..b8645bd74d --- /dev/null +++ b/akka-util/pom.xml @@ -0,0 +1,30 @@ + + 4.0.0 + + akka-util + Akka Util Module + + jar + + + akka + se.scalablesolutions.akka + 0.6 + ../pom.xml + + + + + org.scala-lang + scala-library + 2.7.5 + + + net.lag + configgy + 1.3 + + + + diff --git a/akka-util/src/main/scala/Config.scala b/akka-util/src/main/scala/Config.scala new file mode 100644 index 0000000000..4894a8de8e --- /dev/null +++ b/akka-util/src/main/scala/Config.scala @@ -0,0 +1,47 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka + +import util.Logging + +import net.lag.configgy.{Config => ConfiggyConfig, Configgy, RuntimeEnvironment, ParseException} + +/** + * @author Jonas Bonér + */ +object Config extends Logging { + val VERSION = "0.6" + val HOME = { + val home = System.getenv("AKKA_HOME") + if (home == null) None + else Some(home) + } + + val config = { + if (HOME.isDefined) { + try { + val configFile = HOME.get + "/config/akka.conf" + Configgy.configure(configFile) + log.info("AKKA_HOME is defined to [%s], config loaded from [%s].", HOME.get, configFile) + } catch { + case e: ParseException => throw new IllegalStateException("'akka.conf' config file can not be found in [" + HOME + "/config/akka.conf] - aborting. Either add it in the 'config' directory or add it to the classpath.") + } + } else { + try { + Configgy.configureFromResource("akka.conf", getClass.getClassLoader) + log.info("Config loaded from the application classpath.") + } catch { + case e: ParseException => throw new IllegalStateException("'$AKKA_HOME/config/akka.conf' could not be found and no 'akka.conf' can be found on the classpath - aborting. . Either add it in the '$AKKA_HOME/config' directory or add it to the classpath.") + } + } + Configgy.config + } + + val CONFIG_VERSION = config.getString("akka.version", "0") + if (VERSION != CONFIG_VERSION) throw new IllegalStateException("Akka JAR version [" + VERSION + "] is different than the provided config ('akka.conf') version [" + CONFIG_VERSION + "]") + val startTime = System.currentTimeMillis + + def uptime = (System.currentTimeMillis - startTime) / 1000 +} diff --git a/akka-actors/src/main/scala/util/HashCode.scala b/akka-util/src/main/scala/HashCode.scala similarity index 97% rename from akka-actors/src/main/scala/util/HashCode.scala rename to akka-util/src/main/scala/HashCode.scala index 7d71376172..0ce21f6a92 100755 --- a/akka-actors/src/main/scala/util/HashCode.scala +++ b/akka-util/src/main/scala/HashCode.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.util +package se.scalablesolutions.akka.util import java.lang.reflect.{Array => JArray} import java.lang.{Float => JFloat, Double => JDouble} diff --git a/akka-actors/src/main/scala/util/Helpers.scala b/akka-util/src/main/scala/Helpers.scala similarity index 97% rename from akka-actors/src/main/scala/util/Helpers.scala rename to akka-util/src/main/scala/Helpers.scala index 6d43f06030..e0840c6b62 100644 --- a/akka-actors/src/main/scala/util/Helpers.scala +++ b/akka-util/src/main/scala/Helpers.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.util +package se.scalablesolutions.akka.util import java.security.MessageDigest import java.util.concurrent.locks.ReentrantReadWriteLock diff --git a/akka-actors/src/main/scala/util/Logging.scala b/akka-util/src/main/scala/Logging.scala similarity index 97% rename from akka-actors/src/main/scala/util/Logging.scala rename to akka-util/src/main/scala/Logging.scala index 655dfce5db..39f2afee21 100644 --- a/akka-actors/src/main/scala/util/Logging.scala +++ b/akka-util/src/main/scala/Logging.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009 Scalable Solutions. */ -package se.scalablesolutions.akka.kernel.util +package se.scalablesolutions.akka.util import java.util.logging.Level import net.lag.configgy.Config diff --git a/akka.iml b/akka.iml deleted file mode 100644 index f748697a86..0000000000 --- a/akka.iml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/akka.ipr b/akka.ipr deleted file mode 100644 index 068b33fd4c..0000000000 --- a/akka.ipr +++ /dev/null @@ -1,1715 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/akka.iws b/akka.iws deleted file mode 100644 index 1d9fcc5852..0000000000 --- a/akka.iws +++ /dev/null @@ -1,559 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - localhost - 5050 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pom.xml b/pom.xml index c6f237274d..0fa7b50324 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 - Akka Actor Kernel + Akka Transactors akka se.scalablesolutions.akka 0.6 @@ -19,12 +19,13 @@ akka-util-java + akka-util akka-actors - akka-stm akka-persistence akka-rest akka-camel akka-amqp + akka-kernel akka-fun-test-java akka-samples-scala akka-samples-lift From 71283aff11afaabf631a6baefff82cae250a4bbe Mon Sep 17 00:00:00 2001 From: jboner Date: Wed, 2 Sep 2009 12:26:27 +0200 Subject: [PATCH 24/35] made messages routing-aware + added supervision of Client and Endpoint instances + added pre/post restart hooks that does disconnect/reconnect --- akka-amqp/src/main/scala/AMQP.scala | 235 ++++++++++--- akka.ipr | 44 +-- akka.iws | 381 ++++----------------- kernel/src/main/scala/util/Scheduler.scala | 3 + 4 files changed, 275 insertions(+), 388 deletions(-) diff --git a/akka-amqp/src/main/scala/AMQP.scala b/akka-amqp/src/main/scala/AMQP.scala index ddb7e678a5..5b497bd1d4 100644 --- a/akka-amqp/src/main/scala/AMQP.scala +++ b/akka-amqp/src/main/scala/AMQP.scala @@ -4,15 +4,19 @@ package se.scalablesolutions.akka.amqp -import java.lang.String import com.rabbitmq.client.{AMQP => RabbitMQ, _} import com.rabbitmq.client.ConnectionFactory -import se.scalablesolutions.akka.kernel.actor.Actor -import se.scalablesolutions.akka.kernel.util.Logging -import se.scalablesolutions.akka.serialization.Serializer +import kernel.actor.{OneForOneStrategy, Actor} +import kernel.config.ScalaConfig._ +import kernel.util.Logging +import serialization.Serializer +import org.scala_tools.javautils.Imports._ + +import java.util.concurrent.ConcurrentHashMap import java.util.{Timer, TimerTask} +import java.io.IOException /** * AMQP Actor API. Implements Client and Endpoint materialized as Actors. @@ -25,34 +29,46 @@ import java.util.{Timer, TimerTask} * } * messageConsumer.start * - * val endpoint = new Endpoint( - * new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, QUEUE, ROUTING_KEY, ExchangeType.Direct, Serializer.Java) - * endpoint.start + * val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, EXCHANGE, QUEUE, ROUTING_KEY, ExchangeType.Direct, Serializer.Java, None, 100) * * // register message consumer * endpoint ! MessageConsumer(messageConsumer) * - * val client = new Client(new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, ROUTING_KEY, Serializer.Java, None) - * client.start - * client ! Message("Hi") + * val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, EXCHANGE, Serializer.Java, None, None, 100) + * client ! Message("Hi", ROUTING_KEY) * * * @author Jonas Bonér */ -object AMQP { - case class Message(val payload: AnyRef) - case class MessageConsumer(val listener: Actor) - case class Reconnect(val delay: Long) +object AMQP extends Actor { + private val connections = new ConcurrentHashMap[FaultTolerantConnectionActor, FaultTolerantConnectionActor] + faultHandler = Some(OneForOneStrategy(5, 5000)) + trapExit = true + start + + class Message(val payload: AnyRef, val routingKey: String, val mandatory: Boolean, val immediate: Boolean) + object Message { + def unapply(message: Message): Option[Tuple4[AnyRef, String, Boolean, Boolean]] = + Some((message.payload, message.routingKey, message.mandatory, message.immediate)) + def apply(payload: AnyRef, routingKey: String, mandatory: Boolean, immediate: Boolean): Message = + new Message(payload, routingKey, mandatory, immediate) + def apply(payload: AnyRef, routingKey: String): Message = + new Message(payload, routingKey, false, false) + } + case class MessageConsumer(listener: Actor) + case class Reconnect(delay: Long) + case class Failure(cause: Throwable) + case object Stop class MessageNotDeliveredException(message: String) extends RuntimeException(message) - sealed trait ExchangeType + sealed trait ExchangeType object ExchangeType { case object Direct extends ExchangeType { override def toString = "direct" } case object Topic extends ExchangeType { - override def toString = "topic" + override def toString = "topic" } case object Fanout extends ExchangeType { override def toString = "fanout" @@ -62,6 +78,61 @@ object AMQP { } } + def newClient( + config: ConnectionParameters, + hostname: String, + port: Int, + exchangeName: String, + serializer: Serializer, + returnListener: Option[ReturnListener], + shutdownListener: Option[ShutdownListener], + initReconnectDelay: Long): Client = { + val client = new Client( + new ConnectionFactory(config), + hostname, port, + exchangeName, + serializer, + returnListener, + shutdownListener, + initReconnectDelay) + startLink(client) + client + } + + def newEndpoint( + config: ConnectionParameters, + hostname: String, + port: Int, + exchangeName: String, + queueName: String, + routingKey: String, + exchangeType: ExchangeType, + serializer: Serializer, + shutdownListener: Option[ShutdownListener], + initReconnectDelay: Long): Endpoint = { + val endpoint = new Endpoint( + new ConnectionFactory(config), + hostname, port, + exchangeName, queueName, routingKey, + exchangeType, + serializer, + shutdownListener, + initReconnectDelay) + startLink(endpoint) + endpoint + } + + def stopConnection(connection: FaultTolerantConnectionActor) = { + connection ! Stop + unlink(connection) + connections.remove(connection) + } + + override def shutdown = { + connections.values.asScala.foreach(_ ! Stop) + stop + } + /** * AMQP client actor. * Usage: @@ -71,24 +142,24 @@ object AMQP { * params.setPassword("obama") * params.setVirtualHost("/") * params.setRequestedHeartbeat(0) - * val client = new AMQP.Client(new ConnectionFactory(params), "localhost", 5672, "exchangeName", "routingKey", Serializer.Java, None, None) - * client.start + * val client = AMQP.newClient(params, "localhost", 5672, "exchangeName", Serializer.Java, None, None, 100) * client ! Message("hi") * * * @author Jonas Bonér */ - class Client( - connectionFactory: ConnectionFactory, - hostname: String, - port: Int, + class Client private[amqp] ( + val connectionFactory: ConnectionFactory, + val hostname: String, + val port: Int, exchangeKey: String, - routingKey: String, serializer: Serializer, returnListener: Option[ReturnListener], - shutdownListener: Option[ShutdownListener]) extends Actor { - private val connection = connectionFactory.newConnection(hostname, port) - private val channel = connection.createChannel + shutdownListener: Option[ShutdownListener], + val initReconnectDelay: Long) + extends FaultTolerantConnectionActor { + var connection = connectionFactory.newConnection(hostname, port) + var channel = connection.createChannel returnListener match { case Some(listener) => channel.setReturnListener(listener) case None => channel.setReturnListener(new ReturnListener() { @@ -110,34 +181,38 @@ object AMQP { if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get) def receive: PartialFunction[Any, Unit] = { - case Message(msg: AnyRef) => send(msg) + case Message(payload, routingKey, mandatory, immediate) => + channel.basicPublish(exchangeKey, routingKey, mandatory, immediate, null, serializer.out(payload)) + case Stop => + disconnect; stop } - protected def send(message: AnyRef) = channel.basicPublish(exchangeKey, routingKey, null, serializer.out(message)) + def setupChannel = {} } /** * @author Jonas Bonér */ - class Endpoint( - connectionFactory: ConnectionFactory, - hostname: String, - port: Int, + class Endpoint private[amqp] ( + val connectionFactory: ConnectionFactory, + val hostname: String, + val port: Int, exchangeName: String, queueName: String, routingKey: String, exchangeType: ExchangeType, serializer: Serializer, - shutdownListener: Option[ShutdownListener]) extends Actor { - private var connection = connectionFactory.newConnection(hostname, port) - private var channel = connection.createChannel - private val reconnectionTimer = new Timer - private var listeners: List[Actor] = Nil - private val endpoint = this + shutdownListener: Option[ShutdownListener], + val initReconnectDelay: Long) + extends FaultTolerantConnectionActor { + var connection = connectionFactory.newConnection(hostname, port) + var channel = connection.createChannel + var listeners: List[Actor] = Nil + val endpoint = this if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get) setupChannel - private def setupChannel = { + def setupChannel = { channel.exchangeDeclare(exchangeName, exchangeType.toString) channel.queueDeclare(queueName) channel.queueBind(queueName, exchangeName, routingKey) @@ -147,33 +222,80 @@ object AMQP { envelope: Envelope, properties: RabbitMQ.BasicProperties, payload: Array[Byte]) { - endpoint ! Message(serializer.in(payload, None)) - channel.basicAck(envelope.getDeliveryTag, false) + try { + endpoint ! Message(serializer.in(payload, None), envelope.getRoutingKey) + channel.basicAck(envelope.getDeliveryTag, false) + } catch { + case cause => endpoint ! Failure(cause) // pass on and rethrow exception in endpoint actor to trigger restart and reconnect + } } }) } def receive: PartialFunction[Any, Unit] = { - case message: Message => listeners.foreach(_ ! message) case MessageConsumer(listener) => listeners ::= listener - case Reconnect(delay) => reconnect(delay) - case unknown => throw new IllegalArgumentException("Unknown message to AMQP Endpoint [" + unknown + "]") + case message: Message => listeners.foreach(_ ! message) + case Reconnect(delay) => reconnect(delay) + case Failure(cause) => throw cause + case Stop => disconnect; stop + case unknown => throw new IllegalArgumentException("Unknown message to AMQP Endpoint [" + unknown + "]") + } + } + + trait FaultTolerantConnectionActor extends Actor { + lifeCycleConfig = Some(LifeCycle(Permanent, 100)) + + val reconnectionTimer = new Timer + + var connection: Connection + var channel: Channel + + val connectionFactory: ConnectionFactory + val hostname: String + val port: Int + val initReconnectDelay: Long + + def setupChannel + + protected def disconnect = { + try { + channel.close + } catch { + case e: IOException => log.error("Could not close AMQP channel %s:%s", hostname, port) + case _ => () + } + try { + connection.close + log.debug("Disconnected AMQP connection at %s:%s", hostname, port) + } catch { + case e: IOException => log.error("Could not close AMQP connection %s:%s", hostname, port) + case _ => () + } } - private def reconnect(delay: Long) = { + protected def reconnect(delay: Long) = { + disconnect try { connection = connectionFactory.newConnection(hostname, port) channel = connection.createChannel setupChannel - log.debug("Successfully reconnected to AMQP Server") + log.debug("Successfully reconnected to AMQP Server %s:%s", hostname, port) } catch { case e: Exception => val waitInMillis = delay * 2 - log.debug("Trying to reconnect to AMQP server in %n milliseconds" + waitInMillis) - reconnectionTimer.schedule(new TimerTask() {override def run = endpoint ! Reconnect(waitInMillis)}, delay) + val self = this + log.debug("Trying to reconnect to AMQP server in %n milliseconds", waitInMillis) + reconnectionTimer.schedule(new TimerTask() { override def run = self ! Reconnect(waitInMillis) }, delay) } } + + override def preRestart(reason: AnyRef, config: Option[AnyRef]) = disconnect + override def postRestart(reason: AnyRef, config: Option[AnyRef]) = reconnect(initReconnectDelay) } + + def receive: PartialFunction[Any, Unit] = { + case _ => {} // ignore all messages + } } object ExampleAMQPSession { @@ -189,20 +311,23 @@ object ExampleAMQPSession { val messageConsumer = new Actor() { def receive: PartialFunction[Any, Unit] = { - case Message(payload) => log.debug("Received message: %s", payload) + case Message(payload, _, _, _) => log.debug("Received message: %s", payload) } } messageConsumer.start - val endpoint = new Endpoint( - new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, QUEUE, ROUTING_KEY, ExchangeType.Direct, SERIALIZER, None) - endpoint.start + val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, EXCHANGE, QUEUE, ROUTING_KEY, ExchangeType.Direct, SERIALIZER, None, 100) // register message consumer endpoint ! MessageConsumer(messageConsumer) - val client = new Client(new ConnectionFactory(CONFIG), HOSTNAME, PORT, EXCHANGE, ROUTING_KEY, SERIALIZER, None, None) - client.start - client ! Message(ROUTING_KEY + " I'm going surfing") + val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, EXCHANGE, SERIALIZER, None, None, 100) + client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY) + Thread.sleep(1000) + client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY) + Thread.sleep(1000) + client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY) + Thread.sleep(1000) + client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY) } } \ No newline at end of file diff --git a/akka.ipr b/akka.ipr index 3e6d55e9a9..569452eef7 100644 --- a/akka.ipr +++ b/akka.ipr @@ -1362,6 +1362,17 @@ + + + + + + + + + + + @@ -1582,6 +1593,17 @@ + + + + + + + + + + + @@ -1714,28 +1736,6 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/akka.iws b/akka.iws index 84dc45b7bb..772e484768 100644 --- a/akka.iws +++ b/akka.iws @@ -2,13 +2,7 @@ - - - - - - - + @@ -69,59 +63,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -130,20 +73,7 @@ - - - - - - - - - - - - - - + @@ -152,72 +82,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -225,7 +90,25 @@ - + + + + + + + + + + + + + + + + + + + @@ -240,15 +123,6 @@ - - - - - - - - - @@ -268,7 +142,6 @@ @@ -319,24 +193,10 @@ @@ -467,7 +327,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -762,9 +486,30 @@ + + + + + + + + + + + + + + + + + + + + + - + @@ -776,9 +521,23 @@ + + + + + + + + + + + + + + - + diff --git a/kernel/src/main/scala/util/Scheduler.scala b/kernel/src/main/scala/util/Scheduler.scala index 2d7bfed445..f8e77fe797 100644 --- a/kernel/src/main/scala/util/Scheduler.scala +++ b/kernel/src/main/scala/util/Scheduler.scala @@ -15,6 +15,7 @@ package se.scalablesolutions.akka.kernel.util import java.util.concurrent._ import kernel.actor.{OneForOneStrategy, Actor} +import kernel.config.ScalaConfig._ import org.scala_tools.javautils.Imports._ @@ -26,6 +27,8 @@ case class SchedulerException(msg: String, e: Throwable) extends RuntimeExceptio * which is licensed under the Apache 2 License. */ class ScheduleActor(val receiver: Actor, val future: ScheduledFuture[AnyRef]) extends Actor with Logging { + lifeCycleConfig = Some(LifeCycle(Permanent, 100)) + def receive: PartialFunction[Any, Unit] = { case UnSchedule => Scheduler.stopSupervising(this) From b8d794e7c81e72fd514a1306983c3fd637d1a2c9 Mon Sep 17 00:00:00 2001 From: jboner Date: Wed, 2 Sep 2009 14:32:46 +0200 Subject: [PATCH 25/35] added supervision for message consumers + added clean cancellation and shutdown of message consumers --- akka-amqp/src/main/scala/AMQP.scala | 212 ++++++++++++++++++---------- akka.iws | 100 +++++++------ 2 files changed, 196 insertions(+), 116 deletions(-) diff --git a/akka-amqp/src/main/scala/AMQP.scala b/akka-amqp/src/main/scala/AMQP.scala index 5b497bd1d4..371833f4f9 100644 --- a/akka-amqp/src/main/scala/AMQP.scala +++ b/akka-amqp/src/main/scala/AMQP.scala @@ -9,9 +9,11 @@ import com.rabbitmq.client.ConnectionFactory import kernel.actor.{OneForOneStrategy, Actor} import kernel.config.ScalaConfig._ -import kernel.util.Logging +import kernel.util.{HashCode, Logging} import serialization.Serializer +import scala.collection.mutable.HashMap + import org.scala_tools.javautils.Imports._ import java.util.concurrent.ConcurrentHashMap @@ -20,7 +22,7 @@ import java.io.IOException /** * AMQP Actor API. Implements Client and Endpoint materialized as Actors. - * + * *
      *   val messageConsumer = new Actor() {
      *     def receive: PartialFunction[Any, Unit] = {
    @@ -46,7 +48,10 @@ object AMQP extends Actor {
       trapExit = true
       start
     
    -  class Message(val payload: AnyRef, val routingKey: String, val mandatory: Boolean, val immediate: Boolean)
    +  // ====== MESSAGES =====
    +  class Message(val payload: AnyRef, val routingKey: String, val mandatory: Boolean, val immediate: Boolean) {
    +    override def toString(): String = "Message[payload=" + payload + ", routingKey=" + routingKey + "]"     
    +  }
       object Message {
         def unapply(message: Message): Option[Tuple4[AnyRef, String, Boolean, Boolean]] =
           Some((message.payload, message.routingKey, message.mandatory, message.immediate))
    @@ -55,12 +60,41 @@ object AMQP extends Actor {
         def apply(payload: AnyRef, routingKey: String): Message =
           new Message(payload, routingKey, false, false)
       }
    -  case class MessageConsumer(listener: Actor)
    +
    +  case class MessageConsumer(actor: Actor, queueName: String, routingKey: String) {
    +    var tag: Option[String] = None
    +
    +    override def toString(): String = "MessageConsumer[actor=" + actor + ", queue=" + queueName + ", routingKey=" + routingKey  + "]" 
    +
    +    override def hashCode(): Int = synchronized {
    +      var result = HashCode.SEED
    +      result = HashCode.hash(result, queueName)
    +      result = HashCode.hash(result, routingKey)
    +      result
    +    }
    +
    +    override def equals(that: Any): Boolean = synchronized {
    +      that != null &&
    +      that.isInstanceOf[MessageConsumer] &&
    +      that.asInstanceOf[MessageConsumer].queueName== queueName &&
    +      that.asInstanceOf[MessageConsumer].routingKey == routingKey
    +    }
    +  }
    +
    +  case class CancelMessageConsumer(consumer: MessageConsumer)
       case class Reconnect(delay: Long)
       case class Failure(cause: Throwable)
       case object Stop
    +  // ===================
     
    -  class MessageNotDeliveredException(message: String) extends RuntimeException(message)
    +  class MessageNotDeliveredException(
    +          val message: String,
    +          val replyCode: Int,
    +          val replyText: String,
    +          val exchange: String,
    +          val routingKey: String,
    +          val properties: RabbitMQ.BasicProperties,
    +          val body: Array[Byte]) extends RuntimeException(message)
     
       sealed trait ExchangeType
       object ExchangeType {
    @@ -98,14 +132,12 @@ object AMQP extends Actor {
         startLink(client)
         client
       }
    -  
    +
       def newEndpoint(
               config: ConnectionParameters,
               hostname: String,
               port: Int,
               exchangeName: String,
    -          queueName: String,
    -          routingKey: String,
               exchangeType: ExchangeType,
               serializer: Serializer,
               shutdownListener: Option[ShutdownListener],
    @@ -113,7 +145,7 @@ object AMQP extends Actor {
         val endpoint = new Endpoint(
           new ConnectionFactory(config),
           hostname, port,
    -      exchangeName, queueName, routingKey,
    +      exchangeName,
           exchangeType,
           serializer,
           shutdownListener,
    @@ -121,7 +153,7 @@ object AMQP extends Actor {
         startLink(endpoint)
         endpoint
       }
    -  
    +
       def stopConnection(connection: FaultTolerantConnectionActor) = {
         connection ! Stop
         unlink(connection)
    @@ -152,33 +184,16 @@ object AMQP extends Actor {
               val connectionFactory: ConnectionFactory,
               val hostname: String,
               val port: Int,
    -          exchangeKey: String,
    -          serializer: Serializer,
    -          returnListener: Option[ReturnListener],
    -          shutdownListener: Option[ShutdownListener],
    -          val initReconnectDelay: Long) 
    +          val exchangeKey: String,
    +          val serializer: Serializer,
    +          val returnListener: Option[ReturnListener],
    +          val shutdownListener: Option[ShutdownListener],
    +          val initReconnectDelay: Long)
         extends FaultTolerantConnectionActor {
    -    var connection = connectionFactory.newConnection(hostname, port)
    -    var channel = connection.createChannel
    -    returnListener match {
    -      case Some(listener) => channel.setReturnListener(listener)
    -      case None => channel.setReturnListener(new ReturnListener() {
    -        def handleBasicReturn(
    -                replyCode: Int,
    -                replyText: String,
    -                exchange: String,
    -                routingKey: String,
    -                properties: RabbitMQ.BasicProperties,
    -                body: Array[Byte]) = {
    -          throw new MessageNotDeliveredException(
    -            "Could not deliver message [" + replyText +
    -                    "] with reply code [" + replyCode +
    -                    "] and routing key [" + routingKey +
    -                    "] to exchange [" + exchange + "]")
    -        }
    -      })
    -    }
    -    if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get)
    +
    +    setupChannel
    +    
    +    log.info("AMQP.Client [%s] is started", this)
     
         def receive: PartialFunction[Any, Unit] = {
           case Message(payload, routingKey, mandatory, immediate) =>
    @@ -187,7 +202,31 @@ object AMQP extends Actor {
             disconnect; stop
         }
     
    -    def setupChannel = {}
    +    def setupChannel = {
    +      connection = connectionFactory.newConnection(hostname, port)
    +      channel = connection.createChannel
    +      returnListener match {
    +        case Some(listener) => channel.setReturnListener(listener)
    +        case None => channel.setReturnListener(new ReturnListener() {
    +          def handleBasicReturn(
    +                  replyCode: Int,
    +                  replyText: String,
    +                  exchange: String,
    +                  routingKey: String,
    +                  properties: RabbitMQ.BasicProperties,
    +                  body: Array[Byte]) = {
    +            throw new MessageNotDeliveredException(
    +              "Could not deliver message [" + body +
    +                      "] with reply code [" + replyCode +
    +                      "] with reply text [" + replyText +
    +                      "] and routing key [" + routingKey +
    +                      "] to exchange [" + exchange + "]",
    +              replyCode, replyText, exchange, routingKey, properties, body)
    +          }
    +        })
    +      }
    +      if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get)      
    +    }
       }
     
       /**
    @@ -198,58 +237,83 @@ object AMQP extends Actor {
               val hostname: String,
               val port: Int,
               exchangeName: String,
    -          queueName: String,
    -          routingKey: String,
               exchangeType: ExchangeType,
               serializer: Serializer,
               shutdownListener: Option[ShutdownListener],
    -          val initReconnectDelay: Long) 
    +          val initReconnectDelay: Long)
         extends FaultTolerantConnectionActor {
    -    var connection = connectionFactory.newConnection(hostname, port)
    -    var channel = connection.createChannel
    -    var listeners: List[Actor] = Nil
    +
    +    faultHandler = Some(OneForOneStrategy(5, 5000))
    +    trapExit = true
    +
    +    val consumers = new HashMap[MessageConsumer, MessageConsumer]  
         val endpoint = this
    -    if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get)
    +
         setupChannel
     
    +    log.info("AMQP.Endpoint [%s] is started", this)
    +
         def setupChannel = {
    +      connection = connectionFactory.newConnection(hostname, port)
    +      channel = connection.createChannel
           channel.exchangeDeclare(exchangeName, exchangeType.toString)
    -      channel.queueDeclare(queueName)
    -      channel.queueBind(queueName, exchangeName, routingKey)
    -      channel.basicConsume(queueName, false, new DefaultConsumer(channel) with Logging {
    -        override def handleDelivery(
    -                tag: String,
    -                envelope: Envelope,
    -                properties: RabbitMQ.BasicProperties,
    -                payload: Array[Byte]) {
    +      consumers.elements.toList.map(_._2).foreach(setupConsumer) 
    +      if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get)
    +    }
    +
    +    def setupConsumer(consumer: MessageConsumer) = {
    +      channel.queueDeclare(consumer.queueName)
    +      channel.queueBind(consumer.queueName, exchangeName, consumer.routingKey)
    +      val consumerTag = channel.basicConsume(consumer.queueName, false, new DefaultConsumer(channel) with Logging {
    +        override def handleDelivery(tag: String, envelope: Envelope, properties: RabbitMQ.BasicProperties, payload: Array[Byte]) {
               try {
    -            endpoint ! Message(serializer.in(payload, None), envelope.getRoutingKey)
    +            consumer.actor ! Message(serializer.in(payload, None), envelope.getRoutingKey)
                 channel.basicAck(envelope.getDeliveryTag, false)
               } catch {
                 case cause => endpoint ! Failure(cause) // pass on and rethrow exception in endpoint actor to trigger restart and reconnect
               }
             }
           })
    +      consumer.tag = Some(consumerTag)
         }
    -
    +    
         def receive: PartialFunction[Any, Unit] = {
    -      case MessageConsumer(listener) => listeners ::= listener
    -      case message: Message =>          listeners.foreach(_ ! message)
    -      case Reconnect(delay) =>          reconnect(delay)
    -      case Failure(cause) =>            throw cause
    -      case Stop =>                      disconnect; stop
    -      case unknown =>                   throw new IllegalArgumentException("Unknown message to AMQP Endpoint [" + unknown + "]")
    +      case consumer: MessageConsumer =>
    +        link(consumer.actor)
    +        consumers.put(consumer, consumer)
    +        setupConsumer(consumer)
    +        log.info("Message consumer is registered [%s]", consumer)
    +
    +      case CancelMessageConsumer(hash) =>
    +        consumers.get(hash) match {
    +          case None => log.warning("Can't unregister message consumer [%s]; no such consumer", hash)
    +          case Some(consumer) =>
    +            consumers - consumer
    +            consumer.tag match {
    +              case None => log.warning("Can't unregister message consumer [%s]; no consumer tag", consumer)
    +              case Some(tag) =>
    +                channel.basicCancel(tag)
    +                unlink(consumer.actor)
    +                consumer.actor.stop
    +                log.info("Message consumer is cancelled and shut down [%s]", consumer)
    +            }
    +        }
    +
    +      case Reconnect(delay) => reconnect(delay)
    +      case Failure(cause) => log.error(cause, ""); throw cause
    +      case Stop => disconnect; stop
    +      case unknown => throw new IllegalArgumentException("Unknown message to AMQP Endpoint [" + unknown + "]")
         }
       }
     
    -  trait FaultTolerantConnectionActor extends Actor { 
    +  trait FaultTolerantConnectionActor extends Actor {
         lifeCycleConfig = Some(LifeCycle(Permanent, 100))
    -    
    +
         val reconnectionTimer = new Timer
    -   
    -    var connection: Connection
    -    var channel: Channel
    -   
    +
    +    var connection: Connection = _
    +    var channel: Channel = _
    +
         val connectionFactory: ConnectionFactory
         val hostname: String
         val port: Int
    @@ -260,14 +324,14 @@ object AMQP extends Actor {
         protected def disconnect = {
           try {
             channel.close
    -      } catch { 
    +      } catch {
             case e: IOException => log.error("Could not close AMQP channel %s:%s", hostname, port)
             case _ => ()
           }
           try {
             connection.close
             log.debug("Disconnected AMQP connection at %s:%s", hostname, port)
    -      } catch { 
    +      } catch {
             case e: IOException => log.error("Could not close AMQP connection %s:%s", hostname, port)
             case _ => ()
           }
    @@ -276,8 +340,6 @@ object AMQP extends Actor {
         protected def reconnect(delay: Long) = {
           disconnect
           try {
    -        connection = connectionFactory.newConnection(hostname, port)
    -        channel = connection.createChannel
             setupChannel
             log.debug("Successfully reconnected to AMQP Server %s:%s", hostname, port)
           } catch {
    @@ -285,7 +347,9 @@ object AMQP extends Actor {
               val waitInMillis = delay * 2
               val self = this
               log.debug("Trying to reconnect to AMQP server in %n milliseconds", waitInMillis)
    -          reconnectionTimer.schedule(new TimerTask() { override def run = self ! Reconnect(waitInMillis) }, delay)
    +          reconnectionTimer.schedule(new TimerTask() {
    +            override def run = self ! Reconnect(waitInMillis)
    +          }, delay)
           }
         }
     
    @@ -295,7 +359,7 @@ object AMQP extends Actor {
     
       def receive: PartialFunction[Any, Unit] = {
         case _ => {} // ignore all messages
    -  }  
    +  }
     }
     
     object ExampleAMQPSession {
    @@ -316,10 +380,10 @@ object ExampleAMQPSession {
         }
         messageConsumer.start
     
    -    val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, EXCHANGE, QUEUE, ROUTING_KEY, ExchangeType.Direct, SERIALIZER, None, 100)
    +    val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, EXCHANGE, ExchangeType.Direct, SERIALIZER, None, 100)
     
         // register message consumer
    -    endpoint ! MessageConsumer(messageConsumer)
    +    endpoint ! MessageConsumer(messageConsumer, QUEUE, ROUTING_KEY)
     
         val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, EXCHANGE, SERIALIZER, None, None, 100)
         client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY)
    diff --git a/akka.iws b/akka.iws
    index 772e484768..60cdd088ff 100644
    --- a/akka.iws
    +++ b/akka.iws
    @@ -2,8 +2,6 @@
     
       
         
    -      
    -      
           
           
         
    @@ -69,15 +67,6 @@
               
             
           
    -      
    -        
    -          
    -            
    -              
    -            
    -          
    -        
    -      
           
             
               
    @@ -90,7 +79,34 @@
           
             
               
    -            
    +            
    +              
    +            
    +          
    +        
    +      
    +      
    +        
    +          
    +            
    +              
    +            
    +          
    +        
    +      
    +      
    +        
    +          
    +            
    +              
    +            
    +          
    +        
    +      
    +      
    +        
    +          
    +            
                   
                 
               
    @@ -389,7 +405,7 @@
           
           
           
    -      
    +      
           
           
           
    @@ -430,34 +446,6 @@
         
       
    -    
    -      
    -        
    -          
    -        
    -      
    -    
    -    
    -      
    -        
    -          
    -        
    -      
    -    
    -    
    -      
    -        
    -          
    -        
    -      
    -    
    -    
    -      
    -        
    -          
    -        
    -      
    -    
         
           
             
    @@ -535,9 +523,37 @@
             
           
         
    +    
    +      
    +        
    +          
    +        
    +      
    +    
    +    
    +      
    +        
    +          
    +        
    +      
    +    
    +    
    +      
    +        
    +          
    +        
    +      
    +    
    +    
    +      
    +        
    +          
    +        
    +      
    +    
         
           
    -        
    +        
               
             
           
    
    From b9941f563a9470dfb413cc33af13b55a2d67beb9 Mon Sep 17 00:00:00 2001
    From: jboner 
    Date: Wed, 2 Sep 2009 14:37:57 +0200
    Subject: [PATCH 26/35] added sample session
    
    ---
     akka-amqp/src/main/scala/AMQP.scala           | 36 +--------
     akka-amqp/src/main/scala/ExampleSession.scala | 35 ++++++++
     akka.iws                                      | 81 +++++++++++++++----
     3 files changed, 102 insertions(+), 50 deletions(-)
     create mode 100644 akka-amqp/src/main/scala/ExampleSession.scala
    
    diff --git a/akka-amqp/src/main/scala/AMQP.scala b/akka-amqp/src/main/scala/AMQP.scala
    index 371833f4f9..41089544dd 100644
    --- a/akka-amqp/src/main/scala/AMQP.scala
    +++ b/akka-amqp/src/main/scala/AMQP.scala
    @@ -279,7 +279,7 @@ object AMQP extends Actor {
         
         def receive: PartialFunction[Any, Unit] = {
           case consumer: MessageConsumer =>
    -        link(consumer.actor)
    +        startLink(consumer.actor)
             consumers.put(consumer, consumer)
             setupConsumer(consumer)
             log.info("Message consumer is registered [%s]", consumer)
    @@ -361,37 +361,3 @@ object AMQP extends Actor {
         case _ => {} // ignore all messages
       }
     }
    -
    -object ExampleAMQPSession {
    -  def main(args: Array[String]) = {
    -    import AMQP._
    -    val CONFIG = new ConnectionParameters
    -    val EXCHANGE = "whitehouse.gov"
    -    val QUEUE = "twitter"
    -    val ROUTING_KEY = "@barack_obama"
    -    val HOSTNAME = "localhost"
    -    val PORT = 5672
    -    val SERIALIZER = Serializer.Java
    -
    -    val messageConsumer = new Actor() {
    -      def receive: PartialFunction[Any, Unit] = {
    -        case Message(payload, _, _, _) => log.debug("Received message: %s", payload)
    -      }
    -    }
    -    messageConsumer.start
    -
    -    val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, EXCHANGE, ExchangeType.Direct, SERIALIZER, None, 100)
    -
    -    // register message consumer
    -    endpoint ! MessageConsumer(messageConsumer, QUEUE, ROUTING_KEY)
    -
    -    val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, EXCHANGE, SERIALIZER, None, None, 100)
    -    client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY)
    -    Thread.sleep(1000)
    -    client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY)
    -    Thread.sleep(1000)
    -    client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY)
    -    Thread.sleep(1000)
    -    client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY)
    -  }
    -}
    \ No newline at end of file
    diff --git a/akka-amqp/src/main/scala/ExampleSession.scala b/akka-amqp/src/main/scala/ExampleSession.scala
    new file mode 100644
    index 0000000000..96e1aeeebb
    --- /dev/null
    +++ b/akka-amqp/src/main/scala/ExampleSession.scala
    @@ -0,0 +1,35 @@
    +/**
    + * Copyright (C) 2009 Scalable Solutions.
    + */
    +
    +package se.scalablesolutions.akka.amqp
    +
    +import akka.serialization.Serializer
    +import com.rabbitmq.client.ConnectionParameters
    +import kernel.actor.Actor
    +
    +object ExampleSession {
    +  def main(args: Array[String]) = {
    +    import AMQP._
    +    val CONFIG = new ConnectionParameters
    +    val EXCHANGE = "whitehouse.gov"
    +    val QUEUE = "twitter"
    +    val ROUTING_KEY = "@barack_obama"
    +    val HOSTNAME = "localhost"
    +    val PORT = 5672
    +    val SERIALIZER = Serializer.Java
    +
    +    val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, EXCHANGE, ExchangeType.Direct, SERIALIZER, None, 100)
    +
    +    // register message consumer
    +    endpoint ! MessageConsumer(new Actor() {
    +      def receive: PartialFunction[Any, Unit] = {
    +        case Message(payload, _, _, _) => log.debug("Received message: %s", payload)
    +      }
    +    }, QUEUE, ROUTING_KEY)
    +
    +    val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, EXCHANGE, SERIALIZER, None, None, 100)
    +    client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY)
    +    client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY)
    +  }
    +}
    \ No newline at end of file
    diff --git a/akka.iws b/akka.iws
    index 60cdd088ff..ef8b5fc009 100644
    --- a/akka.iws
    +++ b/akka.iws
    @@ -2,6 +2,7 @@
     
       
         
    +      
           
           
         
    @@ -67,19 +68,19 @@
               
             
           
    -      
    -        
    +      
    +        
               
    -            
    +            
                   
                 
               
             
           
    -      
    -        
    +      
    +        
               
    -            
    +            
                   
                 
               
    @@ -158,7 +159,6 @@
       
         
       
    @@ -204,6 +205,56 @@
               
       
    -    
    -      
    -        
    -          
    -        
    -      
    -    
         
           
             
    @@ -553,7 +597,14 @@
         
         
           
    -        
    +        
    +          
    +        
    +      
    +    
    +    
    +      
    +        
               
             
           
    
    From 6a5fbc49628ca7f56cffd3721b4fe36f27911e45 Mon Sep 17 00:00:00 2001
    From: jboner 
    Date: Wed, 2 Sep 2009 16:52:40 +0200
    Subject: [PATCH 27/35] added more sophisticated error handling to AMQP module
     + better examples
    
    ---
     akka-amqp/src/main/scala/AMQP.scala           |  67 +++++-----
     akka-amqp/src/main/scala/ExampleSession.scala |  54 +++++---
     akka.iws                                      | 117 ++++--------------
     3 files changed, 104 insertions(+), 134 deletions(-)
    
    diff --git a/akka-amqp/src/main/scala/AMQP.scala b/akka-amqp/src/main/scala/AMQP.scala
    index 41089544dd..bf5f34224f 100644
    --- a/akka-amqp/src/main/scala/AMQP.scala
    +++ b/akka-amqp/src/main/scala/AMQP.scala
    @@ -24,17 +24,13 @@ import java.io.IOException
      * AMQP Actor API. Implements Client and Endpoint materialized as Actors.
      *
      * 
    - *   val messageConsumer = new Actor() {
    + *   val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, EXCHANGE, ExchangeType.Direct, Serializer.Java, None, 100)
    + *
    + *   endpoint ! MessageConsumer(QUEUE, ROUTING_KEY, new Actor() {
      *     def receive: PartialFunction[Any, Unit] = {
    - *       case Message(payload) => log.debug("Received message: %s", payload)
    + *       case Message(payload, _, _, _, _) => log.debug("Received message: %s", payload)
      *     }
    - *   }
    - *   messageConsumer.start
    - *
    - *   val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, EXCHANGE, QUEUE, ROUTING_KEY, ExchangeType.Direct, Serializer.Java, None, 100)
    - *
    - *   // register message consumer
    - *   endpoint ! MessageConsumer(messageConsumer)
    + *   })
      *
      *   val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, EXCHANGE, Serializer.Java, None, None, 100)
      *   client ! Message("Hi", ROUTING_KEY)
    @@ -49,19 +45,19 @@ object AMQP extends Actor {
       start
     
       // ====== MESSAGES =====
    -  class Message(val payload: AnyRef, val routingKey: String, val mandatory: Boolean, val immediate: Boolean) {
    -    override def toString(): String = "Message[payload=" + payload + ", routingKey=" + routingKey + "]"     
    +  class Message(val payload: AnyRef, val routingKey: String, val mandatory: Boolean, val immediate: Boolean, val properties: RabbitMQ.BasicProperties) {
    +    override def toString(): String = "Message[payload=" + payload + ", routingKey=" + routingKey + ", properties=" + properties + "]"     
       }
       object Message {
    -    def unapply(message: Message): Option[Tuple4[AnyRef, String, Boolean, Boolean]] =
    -      Some((message.payload, message.routingKey, message.mandatory, message.immediate))
    -    def apply(payload: AnyRef, routingKey: String, mandatory: Boolean, immediate: Boolean): Message =
    -      new Message(payload, routingKey, mandatory, immediate)
    +    def unapply(message: Message): Option[Tuple5[AnyRef, String, Boolean, Boolean, RabbitMQ.BasicProperties]] =
    +      Some((message.payload, message.routingKey, message.mandatory, message.immediate, message.properties))
    +    def apply(payload: AnyRef, routingKey: String, mandatory: Boolean, immediate: Boolean, properties: RabbitMQ.BasicProperties): Message =
    +      new Message(payload, routingKey, mandatory, immediate, properties)
         def apply(payload: AnyRef, routingKey: String): Message =
    -      new Message(payload, routingKey, false, false)
    +      new Message(payload, routingKey, false, false, null)
       }
     
    -  case class MessageConsumer(actor: Actor, queueName: String, routingKey: String) {
    +  case class MessageConsumer(queueName: String, routingKey: String, actor: Actor) {
         var tag: Option[String] = None
     
         override def toString(): String = "MessageConsumer[actor=" + actor + ", queue=" + queueName + ", routingKey=" + routingKey  + "]" 
    @@ -184,7 +180,7 @@ object AMQP extends Actor {
               val connectionFactory: ConnectionFactory,
               val hostname: String,
               val port: Int,
    -          val exchangeKey: String,
    +          val exchangeName: String,
               val serializer: Serializer,
               val returnListener: Option[ReturnListener],
               val shutdownListener: Option[ShutdownListener],
    @@ -193,11 +189,12 @@ object AMQP extends Actor {
     
         setupChannel
         
    -    log.info("AMQP.Client [%s] is started", this)
    +    log.info("AMQP.Client [%s] is started", toString)
     
         def receive: PartialFunction[Any, Unit] = {
    -      case Message(payload, routingKey, mandatory, immediate) =>
    -        channel.basicPublish(exchangeKey, routingKey, mandatory, immediate, null, serializer.out(payload))
    +      case message @ Message(payload, routingKey, mandatory, immediate, properties) =>
    +        log.debug("Sending message [%s]", message)
    +        channel.basicPublish(exchangeName, routingKey, mandatory, immediate, properties, serializer.out(payload))
           case Stop =>
             disconnect; stop
         }
    @@ -227,6 +224,8 @@ object AMQP extends Actor {
           }
           if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get)      
         }
    +
    +    override def toString(): String = "AMQP.Client[hostname=" + hostname + ", port=" + port + ", exchange=" + exchangeName + "]" 
       }
     
       /**
    @@ -251,7 +250,7 @@ object AMQP extends Actor {
     
         setupChannel
     
    -    log.info("AMQP.Endpoint [%s] is started", this)
    +    log.info("AMQP.Endpoint [%s] is started", toString)
     
         def setupChannel = {
           connection = connectionFactory.newConnection(hostname, port)
    @@ -264,6 +263,7 @@ object AMQP extends Actor {
         def setupConsumer(consumer: MessageConsumer) = {
           channel.queueDeclare(consumer.queueName)
           channel.queueBind(consumer.queueName, exchangeName, consumer.routingKey)
    +
           val consumerTag = channel.basicConsume(consumer.queueName, false, new DefaultConsumer(channel) with Logging {
             override def handleDelivery(tag: String, envelope: Envelope, properties: RabbitMQ.BasicProperties, payload: Array[Byte]) {
               try {
    @@ -272,6 +272,15 @@ object AMQP extends Actor {
               } catch {
                 case cause => endpoint ! Failure(cause) // pass on and rethrow exception in endpoint actor to trigger restart and reconnect
               }
    +        }        
    +
    +        override def handleShutdownSignal(consumerTag: String, signal: ShutdownSignalException) = {
    +          consumers.elements.toList.map(_._2).find(_.tag == consumerTag) match {
    +            case None => log.warning("Could not find message consumer for tag [%s]; can't shut consumer down", consumerTag)
    +            case Some(consumer) =>
    +              log.warning("Message consumer [%s] is being shutdown by [%s] due to [%s]", consumer, signal.getReference, signal.getReason)
    +              endpoint ! CancelMessageConsumer(consumer)
    +          }
             }
           })
           consumer.tag = Some(consumerTag)
    @@ -302,8 +311,10 @@ object AMQP extends Actor {
           case Reconnect(delay) => reconnect(delay)
           case Failure(cause) => log.error(cause, ""); throw cause
           case Stop => disconnect; stop
    -      case unknown => throw new IllegalArgumentException("Unknown message to AMQP Endpoint [" + unknown + "]")
    +      case unknown => throw new IllegalArgumentException("Unknown message [" + unknown + "] to AMQP Endpoint [" + this + "]")
         }
    +
    +    override def toString(): String = "AMQP.Endpoint[hostname=" + hostname + ", port=" + port + ", exchange=" + exchangeName + ", type=" + exchangeType + "]"
       }
     
       trait FaultTolerantConnectionActor extends Actor {
    @@ -325,14 +336,14 @@ object AMQP extends Actor {
           try {
             channel.close
           } catch {
    -        case e: IOException => log.error("Could not close AMQP channel %s:%s", hostname, port)
    +        case e: IOException => log.error("Could not close AMQP channel %s:%s [%s]", hostname, port, this)
             case _ => ()
           }
           try {
             connection.close
    -        log.debug("Disconnected AMQP connection at %s:%s", hostname, port)
    +        log.debug("Disconnected AMQP connection at %s:%s [%s]", hostname, port, this)
           } catch {
    -        case e: IOException => log.error("Could not close AMQP connection %s:%s", hostname, port)
    +        case e: IOException => log.error("Could not close AMQP connection %s:%s [%s]", hostname, port, this)
             case _ => ()
           }
         }
    @@ -341,12 +352,12 @@ object AMQP extends Actor {
           disconnect
           try {
             setupChannel
    -        log.debug("Successfully reconnected to AMQP Server %s:%s", hostname, port)
    +        log.debug("Successfully reconnected to AMQP Server %s:%s [%s]", hostname, port, this)
           } catch {
             case e: Exception =>
               val waitInMillis = delay * 2
               val self = this
    -          log.debug("Trying to reconnect to AMQP server in %n milliseconds", waitInMillis)
    +          log.debug("Trying to reconnect to AMQP server in %n milliseconds [%s]", waitInMillis, this)
               reconnectionTimer.schedule(new TimerTask() {
                 override def run = self ! Reconnect(waitInMillis)
               }, delay)
    diff --git a/akka-amqp/src/main/scala/ExampleSession.scala b/akka-amqp/src/main/scala/ExampleSession.scala
    index 96e1aeeebb..52ea00e671 100644
    --- a/akka-amqp/src/main/scala/ExampleSession.scala
    +++ b/akka-amqp/src/main/scala/ExampleSession.scala
    @@ -9,27 +9,49 @@ import com.rabbitmq.client.ConnectionParameters
     import kernel.actor.Actor
     
     object ExampleSession {
    +  import AMQP._
    +  val SERIALIZER = Serializer.Java
    +  val CONFIG = new ConnectionParameters
    +  val HOSTNAME = "localhost"
    +  val PORT = 5672
    +
    +  val IM = "im.whitehouse.gov"
    +  val CHAT = "chat.whitehouse.gov"
    +
       def main(args: Array[String]) = {
    -    import AMQP._
    -    val CONFIG = new ConnectionParameters
    -    val EXCHANGE = "whitehouse.gov"
    -    val QUEUE = "twitter"
    -    val ROUTING_KEY = "@barack_obama"
    -    val HOSTNAME = "localhost"
    -    val PORT = 5672
    -    val SERIALIZER = Serializer.Java
    +    println("==== DIRECT ===")
    +    direct
     
    -    val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, EXCHANGE, ExchangeType.Direct, SERIALIZER, None, 100)
    +    Thread.sleep(1000)
    +    
    +    println("==== FANOUT ===")
    +    fanout
    +  }
     
    -    // register message consumer
    -    endpoint ! MessageConsumer(new Actor() {
    +  def direct = {
    +    val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, IM, ExchangeType.Direct, SERIALIZER, None, 100)
    +    endpoint ! MessageConsumer("@george_bush", "direct", new Actor() {
           def receive: PartialFunction[Any, Unit] = {
    -        case Message(payload, _, _, _) => log.debug("Received message: %s", payload)
    +        case Message(payload, _, _, _, _) => log.info("@george_bush received message from: %s", payload)
           }
    -    }, QUEUE, ROUTING_KEY)
    +    })
    +    val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, IM, SERIALIZER, None, None, 100)
    +    client ! Message("@jonas_boner: You sucked!!", "direct")
    +  }
     
    -    val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, EXCHANGE, SERIALIZER, None, None, 100)
    -    client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY)
    -    client ! Message(ROUTING_KEY + " I'm going surfing", ROUTING_KEY)
    +  def fanout = {
    +    val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, CHAT, ExchangeType.Fanout, SERIALIZER, None, 100)
    +    endpoint ! MessageConsumer("@george_bush", "", new Actor() {
    +      def receive: PartialFunction[Any, Unit] = {
    +        case Message(payload, _, _, _, _) => log.info("@george_bush received message from: %s", payload)
    +      }
    +    })
    +    endpoint ! MessageConsumer("@barack_obama", "", new Actor() {
    +      def receive: PartialFunction[Any, Unit] = {
    +        case Message(payload, _, _, _, _) => log.info("@barack_obama received message from: %s", payload)
    +      }
    +    })
    +    val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, CHAT, SERIALIZER, None, None, 100)
    +    client ! Message("@jonas_boner: I'm going surfing", "")
       }
     }
    \ No newline at end of file
    diff --git a/akka.iws b/akka.iws
    index ef8b5fc009..64ef932ef5 100644
    --- a/akka.iws
    +++ b/akka.iws
    @@ -2,7 +2,7 @@
     
       
         
    -      
    +      
           
           
         
    @@ -59,91 +59,28 @@
       
       
         
    -      
    -        
    -          
    -            
    -              
    -            
    -          
    -        
    -      
    -      
    +      
             
               
    -            
    +            
                   
                 
               
             
           
    -      
    +      
    +        
    +          
    +            
    +              
    +            
    +          
    +        
    +      
    +      
             
               
    -            
    -              
    -            
    -          
    -        
    -      
    -      
    -        
    -          
    -            
    -              
    -            
    -          
    -        
    -      
    -      
    -        
    -          
    -            
    -              
    -            
    -          
    -        
    -      
    -      
    -        
    -          
    -            
    -              
    -            
    -          
    -        
    -      
    -      
    -        
    -          
    -            
    -              
    -            
    -          
    -        
    -      
    -      
    -        
    -          
    -            
    -              
    -            
    -          
    -        
    -      
    -      
    -        
    -          
    -            
    -              
    -            
    -          
    -        
    -      
    -      
    -        
    -          
    -            
    +            
                   
                 
               
    @@ -173,8 +110,8 @@
             
       
    @@ -394,7 +331,7 @@
           
         
         
    -