Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Executor/AkkaExecutor.scala
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Executor/AkkaExecutor.scala	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Executor/AkkaExecutor.scala	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,173 @@
+import akka.actor.typed.scaladsl.Behaviors
+import akka.actor.typed.scaladsl.LoggerOps
+import akka.actor.typed.{ ActorRef, ActorSystem, Behavior }
+import java.util.concurrent.atomic.AtomicInteger
+import akka.event.Logging
+import akka.actor.typed.DispatcherSelector
+import java.util.concurrent.Semaphore
+
+object ExecutorActor {
+	sealed trait MessageTypes
+	final case class Dummy( id: Int ) extends MessageTypes
+	final case class StartMsg( id: Int ) extends MessageTypes
+
+	val rounds = ExecutorMain.Set * ExecutorMain.Rounds
+
+	def apply(): Behavior[MessageTypes] = Behaviors.receive { (context, message) =>
+		message match {
+			case StartMsg( id ) =>
+				ExecutorMain.groups(id) = id / ExecutorMain.Set * ExecutorMain.Set
+				if (id == ExecutorMain.Actors - 1) {
+					ExecutorMain.system ! ExecutorMain.Continue()
+				} // if
+			case Dummy( id ) =>
+				if ( ExecutorMain.recs(id) >= rounds ) {
+					if ( ExecutorMain.actorCnt.incrementAndGet() == ExecutorMain.Actors ) {
+						if ( ExecutorMain.trials.get() > 0 ) { // ignore trial 1
+							println( s"${ExecutorMain.Processors}" + "\t" + f"${(System.nanoTime() - ExecutorMain.startTime) * ExecutorMain.Factor / 1_000_000_000.0}%1.2f" )
+						} // if
+						if ( ExecutorMain.trials.incrementAndGet() == ExecutorMain.Numtimes + 1 ) {
+							ExecutorMain.system ! ExecutorMain.Stop()
+						} else {
+							ExecutorMain.actorCnt.set( 0 )
+							ExecutorMain.startTime = System.nanoTime()
+							for ( r <- 0 until ExecutorMain.Actors ) { // start actors again
+								ExecutorMain.actors(r) ! Dummy( r )
+							} // for
+						} // if
+					} // if
+					ExecutorMain.recs(id) = 0
+					ExecutorMain.sends(id) = 0			// reset for next trial
+				} else {
+					if ( ExecutorMain.recs(id) % ExecutorMain.Batch == 0 ) {
+						for ( r <- 0 until ExecutorMain.Batch ) {  // start actors again
+							val sendId = ExecutorMain.groups(id) + ExecutorMain.sends(id) % ExecutorMain.Set
+							ExecutorMain.actors( sendId ) ! Dummy( sendId ) // cycle through group
+							ExecutorMain.sends(id) += 1
+						} // for
+					} // if
+					ExecutorMain.recs(id) += 1
+				} // if
+		} // message
+		Behaviors.same
+	}
+}
+
+object ExecutorMain {
+	sealed trait MainMessages
+	final case class Start() extends MainMessages
+	final case class Stop() extends MainMessages
+	final case class Continue() extends MainMessages
+
+	var Actors = 40_000; var Set = 100; var Rounds = 400; var Processors = 1; var Batch = 1; var Numtimes = 1; var Factor = 2 // default values
+
+	val actors = new Array[ActorRef[ExecutorActor.MessageTypes]](Actors)
+	val recs = new Array[Int](Actors)
+	val sends = new Array[Int](Actors)
+	val groups = new Array[Int](Actors)
+
+	val actorCnt = new AtomicInteger(0)
+	val trials = new AtomicInteger(0)
+    val sem = new Semaphore(0)
+
+	var system : ActorSystem[ExecutorMain.MainMessages] = null
+	var startTime = System.nanoTime()
+
+	def apply(): Behavior[MainMessages] = Behaviors.setup { context =>
+		for ( id <- 0 until Actors ) {						// create actors
+			recs(id) = 0
+			sends(id) = 0
+			actors(id) = context.spawn(ExecutorActor(), "actor_" + id, DispatcherSelector.fromConfig("akka.dispatcher"))
+		} // for
+
+      	Behaviors.receiveMessage { message =>
+			message match {
+				case Start() =>
+					for ( id <- 0 until Actors ) {						// start actors
+						actors(id) ! ExecutorActor.StartMsg( id )
+					} // for
+					Behaviors.same
+				case Continue() =>
+					for ( id <- 0 until Actors ) {						// start actors
+						actors(id) ! ExecutorActor.Dummy( id )
+					} // for
+					Behaviors.same
+				case Stop() =>
+                    sem.release()
+					Behaviors.stopped
+			} // match
+      	}
+    }
+
+	def usage() = {
+		println( "Usage: " +
+			s"[ actors (> 0 && > set && actors % set == 0 ) | 'd' (default ${Actors}) ] " +
+			s"[ set (> 0) | 'd' (default ${Set}) ] " +
+			s"[ rounds (> 0) | 'd' (default ${Rounds}) ] " +
+			s"[ processors (> 0) | 'd' (default ${Processors}) ] " +
+            s"[ batch (> 0) | 'd' (default ${Batch}) ] " +
+			s"[ num times (> 0) | 'd' (default ${Numtimes}) ]"
+		)
+		System.exit( 1 )
+	}
+
+	def main(args: Array[String]): Unit = {
+		if ( args.length > 7 ) usage()						// process command-line arguments
+        if ( args.length == 7 ) {
+			if ( args(6) != "d" ) {							// default ?
+				Factor = args(6).toInt
+				if ( Factor < 1 ) usage()
+			} // if
+		} // if
+        if ( args.length >= 6 ) {
+			if ( args(5) != "d" ) {							// default ?
+				Numtimes = args(5).toInt
+				if ( Numtimes < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 5 ) {
+			if ( args(4) != "d" ) {							// default ?
+				Batch = args(4).toInt
+				if ( Batch < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 4 ) {
+			if ( args(3) != "d" ) {							// default ?
+				Processors = args(3).toInt
+				if ( Processors < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 3 ) {							// fall through
+			if ( args(2) != "d" ) {							// default ?
+				Rounds = args(2).toInt
+				if ( Rounds < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 2 ) {							// fall through
+			if ( args(1) != "d" ) {							// default ?
+				Set = args(1).toInt
+				if ( Set < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 1 ) {							// fall through
+			if ( args(0) != "d" ) {							// default ?
+				Actors = args(0).toInt
+				if ( Actors < 1 || Actors <= Set || Actors % Set != 0 ) usage()
+			} // if
+		} // if
+
+        Rounds = Rounds / Factor;
+
+		//println( "Actors " + Actors + " Set " + Set + " Rounds " + Rounds + " Processors " + Processors + " Batch " + Batch )
+
+		system = ActorSystem( ExecutorMain(), "Executor" )
+		system ! Start()
+        sem.acquire()
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: java //
+// compile-command: "sbt --warn -J-Xmx32g \"run\"" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Executor/application.conf
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Executor/application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Executor/application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,12 @@
+akka {
+   dispatcher {
+        type = Dispatcher
+        executor = "fork-join-executor"
+        fork-join-executor {
+            parallelism-factor = 2.0
+            parallelism-min = 1
+            parallelism-max = 1
+        }
+        throughput = 20
+   }
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Executor/build.sbt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Executor/build.sbt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Executor/build.sbt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,11 @@
+name := "dummy"
+version := "0.0"
+scalaVersion := "2.13.1"
+scalacOptions += "-deprecation"
+lazy val akkaVersion = "2.6.14"
+
+libraryDependencies ++= Seq(
+	"com.typesafe.akka" %% "akka-actor-typed" % akkaVersion
+)
+libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.3" % Runtime
+Compile / unmanagedResourceDirectories += baseDirectory.value
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Matrix/AkkaMatrix.scala
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Matrix/AkkaMatrix.scala	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Matrix/AkkaMatrix.scala	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,144 @@
+import akka.actor.typed.scaladsl.Behaviors
+import akka.actor.typed.scaladsl.LoggerOps
+import akka.actor.typed.{ ActorRef, ActorSystem, Behavior }
+import java.util.concurrent.atomic.AtomicInteger
+import akka.event.Logging
+import akka.actor.typed.DispatcherSelector
+import java.util.concurrent.Semaphore
+
+object MatrixMult {
+	final case class WorkMsg( var Z: Array[Int], val X: Array[Int], val Y: Array[Array[Int]] )
+
+	def apply(): Behavior[WorkMsg] = Behaviors.receive { (context, message) =>
+		// message match {
+		// 	case WorkMsg( Z, X, Y )  =>
+		for ( i <- 0 until MatrixMain.yc ) {
+			message.Z(i) = 0
+			for ( j <- 0 until MatrixMain.xc ) {
+				message.Z(i) = message.Z(i) + message.X(j) * message.Y(j)(i)
+			}
+		}
+		if ( MatrixMain.actorCnt.incrementAndGet() == MatrixMain.xr ) {
+			MatrixMain.system ! MatrixMain.Stop()
+		}
+		// } // message
+		Behaviors.same
+	}
+}
+
+object MatrixMain {
+	sealed trait MainMessages
+	final case class Start() extends MainMessages
+	final case class Stop() extends MainMessages
+
+	var xr = 3_072; var xc = 3_072; var yc = 3_072; var Processors = 1; var MaxProcs = 48; // default values
+
+	val actors = new Array[ActorRef[MatrixMult.WorkMsg]](xr)
+	val messages = new Array[MatrixMult.WorkMsg](xr);
+
+	val actorCnt = new AtomicInteger(0)
+	val sem = new Semaphore(0)
+
+	var system : ActorSystem[MatrixMain.MainMessages] = null
+	var startTime = System.nanoTime()
+
+	var X = Array.ofDim[Int](0, 0)						// set type, set size below
+	var Y = Array.ofDim[Int](0, 0)
+	var Z = Array.ofDim[Int](0, 0)
+
+	def apply(): Behavior[MainMessages] = Behaviors.setup { context =>
+		for ( id <- 0 until xr ) {						// create actors
+			actors(id) = context.spawn(MatrixMult(), "actor_" + id, DispatcherSelector.fromConfig("akka.dispatcher"))
+			messages(id) = new MatrixMult.WorkMsg(Z(id), X(id), Y)
+		} // for
+
+	  	Behaviors.receiveMessage { message =>
+			message match {
+				case Start() =>
+					for ( id <- 0 until xr ) {			// start actors
+						actors(id) ! messages(id)
+					} // for
+					Behaviors.same
+				case Stop() =>
+					sem.release()
+					Behaviors.stopped
+			} // match
+	  	}
+	}
+
+	def usage() = {
+		println( "Usage: " +
+			s"[ yc (> 0) | 'd' (default ${xr}) ] " +
+			s"[ xc (> 0) | 'd' (default ${xc}) ] " +
+			s"[ xr (> 0) | 'd' (default ${yc}) ] " +
+			s"[ processors (> 0) | 'd' (default ${Processors}) ]"
+		)
+		System.exit( 1 )
+	}
+
+	def main(args: Array[String]): Unit = {
+		if ( args.length > 4 ) usage()					// process command-line arguments
+        if ( args.length == 5 ) {
+			if ( args(4) != "d" ) {						// default ?
+				MaxProcs = args(4).toInt
+				if ( MaxProcs < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 4 ) {
+			if ( args(3) != "d" ) {						// default ?
+				Processors = args(3).toInt
+				if ( Processors < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 3 ) {						// fall through
+			if ( args(2) != "d" ) {						// default ?
+				xr = args(2).toInt
+				if ( xr < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 2 ) {						// fall through
+			if ( args(1) != "d" ) {						// default ?
+				xc = args(1).toInt
+				if ( xc < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 1 ) {						// fall through
+			if ( args(0) != "d" ) {						// default ?
+				yc = args(0).toInt
+				if ( yc < 1 ) usage()
+			} // if
+		} // if
+
+        xr = xr / (MaxProcs / Processors)
+
+		X = Array.ofDim[Int](xr, xc)
+		Y = Array.ofDim[Int](xc, yc)
+		Z = Array.ofDim[Int](xr, yc)
+
+		for ( r <- 0 until xr ) {
+			for ( c <- 0 until xc ) {
+				X(r)(c) = r * c % 37
+			}
+		}
+
+		for ( r <- 0 until xc ) {
+			for ( c <- 0 until yc ) {
+				Y(r)(c) = r * c % 37
+			}
+		}
+
+		startTime = System.nanoTime()
+		system = ActorSystem( MatrixMain(), "Matrix" )
+		system ! Start()
+
+		sem.acquire()
+
+		println( s"${Processors}\t" + f"${(System.nanoTime() - startTime) * (MaxProcs / Processors) / 1_000_000_000.0}%1.2f" )
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: java //
+// compile-command: "sbt --warn -J-Xmx32g \"run\"" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Matrix/application.conf
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Matrix/application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Matrix/application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,12 @@
+akka {
+   dispatcher {
+        type = Dispatcher
+        executor = "fork-join-executor"
+        fork-join-executor {
+            parallelism-factor = 2.0
+            parallelism-min = 1
+            parallelism-max = 1
+        }
+        throughput = 20
+   }
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Matrix/build.sbt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Matrix/build.sbt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Matrix/build.sbt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,11 @@
+name := "dummy"
+version := "0.0"
+scalaVersion := "2.13.1"
+scalacOptions += "-deprecation"
+lazy val akkaVersion = "2.6.14"
+
+libraryDependencies ++= Seq(
+	"com.typesafe.akka" %% "akka-actor-typed" % akkaVersion
+)
+libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.3" % Runtime
+Compile / unmanagedResourceDirectories += baseDirectory.value
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Repeat/AkkaRepeat.scala
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Repeat/AkkaRepeat.scala	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Repeat/AkkaRepeat.scala	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,139 @@
+import akka.actor.typed.scaladsl.Behaviors
+import akka.actor.typed.scaladsl.LoggerOps
+import akka.actor.typed.{ ActorRef, ActorSystem, Behavior }
+import java.util.concurrent.atomic.AtomicInteger
+import akka.event.Logging
+import akka.actor.typed.DispatcherSelector
+import java.util.concurrent.Semaphore
+
+object Server {    
+	def apply(): Behavior[Client.MainMessages] = Behaviors.receive { (context, message) =>
+		message match {
+			case Client.CharMsg( value ) =>
+				Client.system ! Client.CharMsg( 'X' )
+			case Client.IntMsg( value ) =>
+                Client.system ! Client.IntMsg( 7 )
+            case Client.State() =>
+		} // message
+		Behaviors.same
+	}
+}
+
+object Client {
+	sealed trait MainMessages
+	final case class State() extends MainMessages
+	final case class IntMsg( val value: Int ) extends MainMessages
+	final case class CharMsg( val value: Char ) extends MainMessages
+
+	var Messages = 100_000; var Times = 100; var Processors = 4; var Factor = 1 // default values
+    var times = 0
+    var results = 0
+
+	val servers = new Array[ActorRef[MainMessages]](Messages)
+
+	val actorCnt = new AtomicInteger(0)
+    val sem = new Semaphore(0)
+
+	var system : ActorSystem[MainMessages] = null
+	var startTime = System.nanoTime()
+
+    def process() = {
+        
+    }
+
+	def apply(): Behavior[MainMessages] = Behaviors.setup { context =>
+		for ( id <- 0 until Messages ) {						// create actors
+			servers(id) = context.spawn(Server(), "actor_" + id, DispatcherSelector.fromConfig("akka.dispatcher"))
+		} // for
+
+      	Behaviors.receiveMessage { message =>
+			message match {
+				case State() =>
+					for ( id <- 0 until Messages ) {						// start actors
+						servers(id) ! IntMsg( 0 )
+                        servers(id) ! CharMsg( 0 )
+					} // for
+					Behaviors.same
+				case IntMsg( value ) =>
+					results += 1
+                    if ( results == 2 * Messages ) {
+                        times += 1
+                        if ( times == Times ) {
+                            sem.release()
+                            Behaviors.stopped
+                        } else {
+                            results = 0
+                            system ! State()
+                            Behaviors.same
+                        }
+                    } else
+                        Behaviors.same
+				case CharMsg( value ) =>
+                    results += 1
+                    if ( results == 2 * Messages ) {
+                        times += 1
+                        if ( times == Times ) {
+                            sem.release()
+                            Behaviors.stopped
+                        } else {
+                            results = 0
+                            system ! State()
+                            Behaviors.same
+                        }
+                    } else
+                        Behaviors.same
+			} // match
+      	}
+    }
+
+	def usage() = {
+		println( "Usage: " +
+			s"[ messages (> 0) | 'd' (default ${Messages}) ] " +
+			s"[ processors (> 0) | 'd' (default ${Processors}) ] " +
+			s"[ num times (> 0) | 'd' (default ${Times}) ]"
+		)
+		System.exit( 1 )
+	}
+
+	def main(args: Array[String]): Unit = {
+		if ( args.length > 5 ) usage()						// process command-line arguments
+        if ( args.length == 4 ) {							// fall through
+			if ( args(3) != "d" ) {							// default ?
+				Factor = args(3).toInt
+				if ( Factor < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 3 ) {							// fall through
+			if ( args(2) != "d" ) {							// default ?
+				Times = args(2).toInt
+				if ( Times < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 2 ) {							// fall through
+			if ( args(1) != "d" ) {							// default ?
+				Processors = args(1).toInt
+				if ( Processors < 1 ) usage()
+			} // if
+		} // if
+		if ( args.length >= 1 ) {							// fall through
+			if ( args(0) != "d" ) {							// default ?
+				Messages = args(0).toInt
+				if ( Messages < 1 ) usage()
+			} // if
+		} // if
+
+        Times = Times / Factor
+
+		system = ActorSystem( Client(), "Executor" )
+		system ! State()
+        sem.acquire()
+
+        println( s"${Processors}\t" + f"${(System.nanoTime() - startTime) * Factor / 1_000_000_000.0}%1.2f" )
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: java //
+// compile-command: "sbt --warn -J-Xmx32g \"run\"" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Repeat/application.conf
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Repeat/application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Repeat/application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,12 @@
+akka {
+   dispatcher {
+        type = Dispatcher
+        executor = "fork-join-executor"
+        fork-join-executor {
+            parallelism-factor = 2.0
+            parallelism-min = 1
+            parallelism-max = 1
+        }
+        throughput = 20
+   }
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Repeat/build.sbt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Repeat/build.sbt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/Repeat/build.sbt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,11 @@
+name := "dummy"
+version := "0.0"
+scalaVersion := "2.13.1"
+scalacOptions += "-deprecation"
+lazy val akkaVersion = "2.6.14"
+
+libraryDependencies ++= Seq(
+	"com.typesafe.akka" %% "akka-actor-typed" % akkaVersion
+)
+libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.3" % Runtime
+Compile / unmanagedResourceDirectories += baseDirectory.value
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendDynamic/AkkaSendDynamic.scala
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendDynamic/AkkaSendDynamic.scala	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendDynamic/AkkaSendDynamic.scala	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,89 @@
+import akka.actor.typed.scaladsl.Behaviors
+import akka.actor.typed.scaladsl.LoggerOps
+import akka.actor.typed.{ ActorRef, ActorSystem, Behavior }
+import java.util.concurrent.atomic.AtomicInteger
+import akka.event.Logging
+import akka.actor.typed.DispatcherSelector
+import java.util.concurrent.Semaphore
+
+object DynamicActor {
+	final case class Dummy( cnt: Int )
+
+	def apply(): Behavior[Dummy] = Behaviors.receive { (context, message) =>
+		if ( message.cnt >= DynamicMain.times ) {
+			if ( DynamicMain.trials.get() > 0 ) {		// ignore trial 1
+				println( s"${(System.nanoTime() - DynamicMain.startTime) / DynamicMain.times}" )
+                // println( s"${DynamicMain.times} ${(System.nanoTime() - DynamicMain.startTime) * 1E-9}s" )
+			} // if
+			if ( DynamicMain.trials.incrementAndGet() == DynamicMain.NumTrials + 1 ) {
+				DynamicMain.system ! DynamicMain.Stop()
+			} else {
+				DynamicMain.startTime = System.nanoTime() // reset for next trial
+				context.self ! Dummy( 0 )
+			} // if
+			Behaviors.same
+		} else {
+			DynamicMain.system ! DynamicMain.Start( message.cnt + 1 )
+			Behaviors.stopped
+		}
+	}
+}
+
+object DynamicMain {
+	sealed trait MainMessages
+	final case class Start( cnt: Int ) extends MainMessages
+	final case class Stop() extends MainMessages
+
+	val trials = new AtomicInteger(0)
+    val sem = new Semaphore(0)
+
+	var actor_cnt = 0;
+	var system : ActorSystem[MainMessages] = null
+	var startTime = System.nanoTime()
+	var times = 2_000_000; var NumTrials = 5
+
+	def apply(): Behavior[MainMessages] = Behaviors.setup { context =>
+      	Behaviors.receiveMessage { message =>
+			message match {
+				case Start( cnt: Int ) =>
+					val actor = context.spawn(DynamicActor(), "actor_" + actor_cnt , DispatcherSelector.fromConfig("akka.dispatcher"))
+					actor_cnt += 1
+					actor ! DynamicActor.Dummy( cnt )					
+					Behaviors.same
+				case Stop() =>
+                    sem.release()
+					Behaviors.stopped
+			}
+      	}
+    }
+
+	def main( args: Array[String] ): Unit = {
+		def usage() = {
+			println( "Usage: [ times (> 0) ]" );
+			System.exit( 0 );
+		}
+
+		args.length match {
+          case 2 =>
+            if ( args(1) != "d" ) { NumTrials = args(1).toInt }
+			if ( args(0) != "d" ) { times = args(0).toInt }
+			if ( times < 1 ) usage()
+		  case 1 =>
+			if ( args(0) != "d" ) { times = args(0).toInt }
+			if ( times < 1 ) usage()
+		  case 0 =>
+		  case _ =>
+			usage()
+		} // match
+
+		system = ActorSystem( DynamicMain(), "Dynamic" )
+		system ! Start( 0 )
+        sem.acquire()
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: java //
+// compile-command: "sbt --warn -J-Xmx32g \"run\"" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendDynamic/application.conf
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendDynamic/application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendDynamic/application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,12 @@
+akka {
+   dispatcher {
+        type = Dispatcher
+        executor = "fork-join-executor"
+        fork-join-executor {
+            parallelism-factor = 2.0
+            parallelism-min = 1
+            parallelism-max = 1
+        }
+        throughput = 20
+   }
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendDynamic/build.sbt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendDynamic/build.sbt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendDynamic/build.sbt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,11 @@
+name := "dummy"
+version := "0.0"
+scalaVersion := "2.13.1"
+scalacOptions += "-deprecation"
+lazy val akkaVersion = "2.6.14"
+
+libraryDependencies ++= Seq(
+	"com.typesafe.akka" %% "akka-actor-typed" % akkaVersion
+)
+libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.3" % Runtime
+Compile / unmanagedResourceDirectories += baseDirectory.value
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendStatic/AkkaSendStatic.scala
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendStatic/AkkaSendStatic.scala	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendStatic/AkkaSendStatic.scala	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,87 @@
+import akka.actor.typed.scaladsl.Behaviors
+import akka.actor.typed.scaladsl.LoggerOps
+import akka.actor.typed.{ ActorRef, ActorSystem, Behavior }
+import java.util.concurrent.atomic.AtomicInteger
+import akka.event.Logging
+import akka.actor.typed.DispatcherSelector
+import java.util.concurrent.Semaphore
+
+object StaticActor {
+	final case class Dummy( cnt: Int )
+
+	def apply(): Behavior[Dummy] = Behaviors.receive { (context, message) =>
+		if ( message.cnt >= StaticMain.times ) {
+			if ( StaticMain.trials.get() > 0 ) {		// ignore trial 1
+				println( s"${(System.nanoTime() - StaticMain.startTime) / StaticMain.times}" )
+                // println( s"${StaticMain.times} ${(System.nanoTime() - StaticMain.startTime) * 1E-9}s" )
+			} // if
+			if ( StaticMain.trials.incrementAndGet() == StaticMain.NumTrials + 1 ) {
+				StaticMain.system ! StaticMain.Stop()
+			} else {
+				StaticMain.startTime = System.nanoTime() // reset for next trial
+				context.self ! Dummy( 0 )
+			} // if
+		} else {
+			context.self ! Dummy( message.cnt + 1 )		// send to self
+		} // if
+		Behaviors.same
+	}
+}
+
+object StaticMain {
+	sealed trait MainMessages
+	final case class Start() extends MainMessages
+	final case class Stop() extends MainMessages
+
+	val trials = new AtomicInteger(0)
+    val sem = new Semaphore(0)
+
+	var system : ActorSystem[MainMessages] = null
+	var startTime = System.nanoTime()
+	var times = 100_000_000; var NumTrials = 5
+
+	def apply(): Behavior[MainMessages] = Behaviors.setup { context =>
+		val actor = context.spawn(StaticActor(), "actor", DispatcherSelector.fromConfig("akka.dispatcher"))
+
+      	Behaviors.receiveMessage { message =>
+			message match {
+				case Start() =>
+					actor ! StaticActor.Dummy( 0 )					
+					Behaviors.same
+				case Stop() =>
+                    sem.release()
+					Behaviors.stopped
+			}
+      	}
+	}
+
+	def main(args: Array[String]): Unit = {
+		def usage() = {
+			println( "Usage: [ times (> 0) ]" );
+			System.exit( 0 );
+		}
+
+		args.length match {
+          case 2 =>
+            if ( args(1) != "d" ) { NumTrials = args(1).toInt }
+			if ( args(0) != "d" ) { times = args(0).toInt }
+			if ( times < 1 ) usage()
+		  case 1 =>
+			if ( args(0) != "d" ) { times = args(0).toInt }
+			if ( times < 1 ) usage()
+		  case 0 =>
+		  case _ =>
+			usage()
+		} // match
+
+		system = ActorSystem( StaticMain(), "Static" )
+		system ! Start()
+        sem.acquire()
+	}
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: java //
+// compile-command: "sbt --warn -J-Xmx32g \"run\"" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendStatic/application.conf
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendStatic/application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendStatic/application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,12 @@
+akka {
+   dispatcher {
+        type = Dispatcher
+        executor = "fork-join-executor"
+        fork-join-executor {
+            parallelism-factor = 2.0
+            parallelism-min = 1
+            parallelism-max = 1
+        }
+        throughput = 20
+   }
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendStatic/build.sbt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendStatic/build.sbt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/akka/SendStatic/build.sbt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,11 @@
+name := "dummy"
+version := "0.0"
+scalaVersion := "2.13.1"
+scalacOptions += "-deprecation"
+lazy val akkaVersion = "2.6.14"
+
+libraryDependencies ++= Seq(
+	"com.typesafe.akka" %% "akka-actor-typed" % akkaVersion
+)
+libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.3" % Runtime
+Compile / unmanagedResourceDirectories += baseDirectory.value
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFExecutor.cpp
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFExecutor.cpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFExecutor.cpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,128 @@
+#include <iostream>
+using namespace std;
+#include <chrono>
+using namespace chrono;
+
+#include "caf/actor_ostream.hpp"
+#include "caf/caf_main.hpp"
+#include "caf/event_based_actor.hpp"
+using namespace caf;
+
+int Actors = 40'000, Set = 100, Rounds = 400, Processors = 1, Batch = 1, Factor = 40; // ' default values
+time_point<steady_clock> starttime;
+actor * actors;
+int actorCnt = 0;
+
+class Executor : public event_based_actor {
+	static int ids;										// unique actor id generator
+	actor * gstart;
+	int id, rounds, group, recs = 0, sends = 0;
+
+	behavior make_behavior() override {
+		return {
+			[=]( int & ) -> void {
+				if ( recs == rounds ) {
+					if ( __atomic_add_fetch( &actorCnt, 1, __ATOMIC_SEQ_CST ) == Actors ) {
+						aout(this) << (steady_clock::now() - starttime).count() * Factor / 1'000'000'000.0 << endl;
+					} // if
+					this->quit();
+					return;
+				} // if
+				if ( recs % Batch == 0 ) {
+					for ( int i = 0; i < Batch; i += 1 ) {
+						this->send( gstart[sends % Set], 0 ); // cycle through group
+						sends += 1;
+					}
+				}
+				//aout(this) << id << " " << cnt << endl;
+				recs += 1;
+			}
+		};
+	}
+  public:
+	Executor( caf::actor_config & cfg ) : event_based_actor( cfg ) {
+		id = ids++;										// unique actor id, and start point for cycle
+		gstart = &actors[id / Set * Set];				// remember group-start array-element
+		rounds = Set * Rounds;							// send at least one message to each group member
+		// aout(this) << "id " << id << " rounds " << rounds << " group " << group << endl;
+	}
+}; // Executor
+int Executor::ids = 0;
+
+void caf_main( actor_system & sys ) {
+	for ( int i = 0; i < Actors; i += 1 ) {				// create actors
+		actors[i] = sys.spawn<Executor>();
+	} // for
+	starttime = steady_clock::now();
+	for ( int i = 0; i < Actors; i += 1 ) {				// start actors
+		caf::anon_send( actors[i], 0 );
+	} // for
+} // caf_main
+
+int main( int argc, char * argv[] ) {
+	switch ( argc ) {
+      case 7:
+		if ( strcmp( argv[6], "d" ) != 0 ) {			// default ?
+			Factor = stoi( argv[6] );
+			if ( Factor < 1 ) goto Usage;
+		} // if
+	  case 6:
+		if ( strcmp( argv[5], "d" ) != 0 ) {			// default ?
+			Batch = stoi( argv[5] );
+			if ( Batch < 1 ) goto Usage;
+		} // if
+	  case 5:
+		if ( strcmp( argv[4], "d" ) != 0 ) {			// default ?
+			Processors = stoi( argv[4] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 4:
+		if ( strcmp( argv[3], "d" ) != 0 ) {			// default ?
+			Rounds = stoi( argv[3] );
+			if ( Rounds < 1 ) goto Usage;
+		} // if
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Set = stoi( argv[2] );
+			if ( Set < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Actors = stoi( argv[1] );
+			if ( Actors < 1 || Actors <= Set || Actors % Set != 0 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0]
+			 << " [ actors (> 0 && > set && actors % set == 0 ) | 'd' (default " << Actors
+			 << ") ] [ set (> 0) | 'd' (default " << Set
+			 << ") ] [ rounds (> 0) | 'd' (default " << Rounds
+			 << ") ] [ processors (> 0) | 'd' (default " << Processors
+			 << ") ] [ batch (> 0) | 'd' (default " << Batch
+			 << ") ]" << endl;
+		exit( EXIT_FAILURE );
+	} // switch
+
+    Rounds = Rounds / Factor;
+
+	//cout << Actors << " " << Set << " " << Rounds << " " << Processors << endl;
+	actors = new actor[Actors];
+
+	caf::core::init_global_meta_objects();
+	caf::exec_main_init_meta_objects<>();
+
+	caf::actor_system_config cfg;
+	cfg.set( "caf.scheduler.max-threads", Processors );
+	caf::actor_system system { cfg };
+
+	return caf::exec_main<>(caf_main, argc, argv);
+} // main
+//CAF_MAIN()
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" a.out
+
+// Local Variables: //
+// compile-command: "g++-10 -Wall -O3 -std=c++17 -ICAF/actor-framework/libcaf_core -ICAF/actor-framework/libcaf_core/caf -ICAF/actor-framework/build/libcaf_core -LCAF/actor-framework/build/libcaf_core -LCAF/actor-framework/build/libcaf_io CAFExecutor.cpp -lcaf_io -lcaf_core -Wl,-rpath=CAF/actor-framework/build/libcaf_core" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFMatrix.cpp
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFMatrix.cpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFMatrix.cpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,167 @@
+#include <iostream>
+using namespace std;
+#include <chrono>
+using namespace chrono;
+
+#include "caf/actor_ostream.hpp"
+#include "caf/caf_main.hpp"
+#include "caf/event_based_actor.hpp"
+#include "caf/all.hpp"
+using namespace caf;
+
+struct WorkMsg;
+
+CAF_BEGIN_TYPE_ID_BLOCK(custom_types_1, first_custom_type_id)
+CAF_ADD_TYPE_ID(custom_types_1, (WorkMsg))
+CAF_END_TYPE_ID_BLOCK(custom_types_1)
+
+// --(rst-foo-begin)--
+struct WorkMsg {
+	unsigned int b;
+};
+
+template <class Inspector>
+bool inspect(Inspector& f, WorkMsg& x) {
+	return f.object(x).fields(f.field("b", x.b));
+}
+
+unsigned int xr = 3'072, xc = 3'072, yc = 3'072, Processors = 1, MaxProcs = 48; // default values
+
+time_point<steady_clock> starttime;
+actor * actors;
+WorkMsg ** work_msgs;
+unsigned int actorCnt = 0;
+
+int wCount = 0;
+
+int ** w_Z, ** w_X, ** w_Y;
+
+class MatrixMult : public event_based_actor {
+	behavior make_behavior() override {
+		return {
+			[=]( const WorkMsg & val ) -> void {
+				unsigned int w = val.b;
+				for ( unsigned int i = 0; i < yc; i += 1 ) { // multiply X_row by Y_col and sum products
+					w_Z[w][i] = 0;
+					for ( unsigned int j = 0; j < xc; j += 1 ) {
+						w_Z[w][i] += w_X[w][j] * w_Y[j][i];
+					} // for
+				} // for
+				
+				if ( __atomic_add_fetch( &actorCnt, 1, __ATOMIC_SEQ_CST ) == xr ) {
+					aout(this) << (steady_clock::now() - starttime).count() * ( MaxProcs / Processors ) / 1'000'000'000.0 << endl;
+				} // if
+				this->quit();
+				return;
+			}
+		};
+	}
+  public:
+	MatrixMult( caf::actor_config & cfg ) : event_based_actor( cfg ) {}
+}; // MatrixMult
+
+void caf_main( actor_system & sys ) {
+	starttime = steady_clock::now();
+
+	for ( unsigned int i = 0; i < xr; i += 1 ) {		// create actors
+		actors[i] = sys.spawn<MatrixMult>();
+	} // for
+
+	caf::scoped_actor self{sys};
+	for ( unsigned int i = 0; i < xr; i += 1 ) {		// start actors
+		self->send( actors[i], WorkMsg{i} );
+	} // for
+} // caf_main
+
+int main( int argc, char * argv[] ) {
+	switch ( argc ) {
+      case 6:
+		if ( strcmp( argv[5], "d" ) != 0 ) {			// default ?
+			MaxProcs = stoi( argv[5] );
+			if ( MaxProcs < 1 ) goto Usage;
+		} // if
+	  case 5:
+		if ( strcmp( argv[4], "d" ) != 0 ) {			// default ?
+			Processors = stoi( argv[4] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 4:
+		if ( strcmp( argv[3], "d" ) != 0 ) {			// default ?
+			xr = stoi( argv[3] );
+			if ( xr < 1 ) goto Usage;
+		} // if
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			xc = stoi( argv[2] );
+			if ( xc < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			yc = stoi( argv[1] );
+			if ( yc < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0]
+			 << " [ yc (> 0) | 'd' (default " << yc
+			 << ") ] [ xc (> 0) | 'd' (default " << xc
+			 << ") ] [ xr (> 0) | 'd' (default " << xr
+			 << ") ] [ processors (> 0) | 'd' (default " << Processors
+			 << ") ]" << endl;
+		exit( EXIT_FAILURE );
+	} // switch
+
+    xr = xr / ( MaxProcs / Processors );
+
+	//cout << Actors << " " << Set << " " << Rounds << " " << Processors << endl;
+	actors = new actor[xr];
+
+	caf::core::init_global_meta_objects();
+	caf::exec_main_init_meta_objects<id_block::custom_types_1>();
+
+	caf::actor_system_config cfg;
+	cfg.set( "caf.scheduler.max-threads", Processors );
+	caf::actor_system system { cfg };
+
+	unsigned int r, c;
+	int * Z[xr], * X[xr], * Y[xc];
+
+	w_Z = Z;
+	w_Y = Y;
+	w_X = X;
+
+	for ( r = 0; r < xr; r += 1 ) {						// create/initialize X matrix
+		X[r] = new int[xc];
+		for ( c = 0; c < xc; c += 1 ) {
+			X[r][c] = r * c % 37;						// for timing
+		} // for
+	} // for
+	for ( r = 0; r < xc; r += 1 ) {						// create/initialize Y matrix
+		Y[r] = new int[yc];
+		for ( c = 0; c < yc; c += 1 ) {
+			Y[r][c] = r * c % 37;						// for timing
+		} // for
+	} // for
+	for ( r = 0; r < xr; r += 1 ) {						// create Z matrix
+		Z[r] = new int[yc];
+	} // for
+
+	caf::exec_main<>(caf_main, argc, argv);
+	
+	for ( r = 0; r < xr; r += 1 ) {						// deallocate X and Z matrices
+		delete [] X[r];
+		delete [] Z[r];
+	} // for
+	for ( r = 0; r < xc; r += 1 ) {						// deallocate Y matrix
+		delete [] Y[r];
+	} // for
+} // main
+//CAF_MAIN()
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" a.out
+
+// Local Variables: //
+// compile-command: "g++-10 -Wall -O3 -std=c++17 -ICAF/actor-framework/libcaf_core -ICAF/actor-framework/libcaf_core/caf -ICAF/actor-framework/build/libcaf_core -LCAF/actor-framework/build/libcaf_core -LCAF/actor-framework/build/libcaf_io CAFMatrix.cpp -lcaf_io -lcaf_core -Wl,-rpath=CAF/actor-framework/build/libcaf_core" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFRepeat.cpp
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFRepeat.cpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFRepeat.cpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,188 @@
+#include <iostream>
+using namespace std;
+#include <chrono>
+using namespace chrono;
+
+#include "caf/actor_ostream.hpp"
+#include "caf/caf_main.hpp"
+#include "caf/event_based_actor.hpp"
+#include "caf/all.hpp"
+using namespace caf;
+
+struct IntMsg;
+struct CharMsg;
+
+CAF_BEGIN_TYPE_ID_BLOCK(custom_types_1, first_custom_type_id)
+CAF_ADD_TYPE_ID(custom_types_1, (IntMsg))
+CAF_ADD_TYPE_ID(custom_types_1, (CharMsg))
+CAF_END_TYPE_ID_BLOCK(custom_types_1)
+
+// --(rst-foo-begin)--
+struct IntMsg {
+	int val;
+};
+struct CharMsg {
+	char val;
+};
+
+template <class Inspector>
+bool inspect(Inspector& f, IntMsg& x) {
+	return f.object(x).fields(f.field("val", x.val));
+}
+
+template <class Inspector>
+bool inspect(Inspector& f, CharMsg& x) {
+	return f.object(x).fields(f.field("val", x.val));
+}
+
+size_t Messages = 100000, Processors = 4, Times = 100, Factor = 20;
+
+time_point<steady_clock> starttime;
+actor * client;
+actor * servers;
+unsigned int actorCnt = 0;
+
+class Client : public event_based_actor {
+    IntMsg * intmsg;
+	CharMsg * charmsg;
+	size_t results = 0, times = 0;
+
+    void reset() {
+		times += 1;
+		if ( times == Times ) {
+			for ( unsigned int i = 0; i < Messages; i += 1 ) {
+                this->send( servers[i], 0 );
+			} // for
+			if ( __atomic_add_fetch( &actorCnt, 1, __ATOMIC_SEQ_CST ) == Messages + 1 ) {
+                aout(this) << (steady_clock::now() - starttime).count() * Factor / 1'000'000'000.0 << endl;
+            } // if
+            this->quit();
+            return;
+		}
+		results = 0;
+		this->send( this, 0 );
+	}
+    
+	behavior make_behavior() override {
+		return {
+			[=]( IntMsg & msg ) -> void {
+				results++;
+                if ( results == 2 * Messages ) reset();
+			},
+            [=]( CharMsg & msg ) -> void {
+                results++;
+                if ( results == 2 * Messages ) reset();
+            },
+            [=]( int & ) -> void {
+                for ( size_t i = 0; i < Messages; i += 1 ) { // send out work
+                    this->send( servers[i], intmsg[i] );
+                    this->send( servers[i], charmsg[i] );
+                }
+            }
+		};
+	}
+  public:
+	Client( caf::actor_config & cfg ) : event_based_actor( cfg ) {
+        intmsg = new IntMsg[Messages];
+		charmsg = new CharMsg[Messages];
+    }
+    ~Client() {
+		delete [] charmsg;
+		delete [] intmsg;
+	}
+}; // Client
+
+class Server : public event_based_actor {
+	behavior make_behavior() override {
+		return {
+			[=]( IntMsg & msg ) -> void {
+				msg.val = 7;
+                send( *client, msg );
+			},
+            [=]( CharMsg & msg ) -> void {
+                msg.val = 'x';
+                this->send( *client, msg );
+            },
+            [=]( int & ) -> void {
+                if ( __atomic_add_fetch( &actorCnt, 1, __ATOMIC_SEQ_CST ) == Messages + 1 ) {
+					aout(this) << (steady_clock::now() - starttime).count() / 1'000'000'000.0 << endl;
+				} // if
+                this->quit();
+				return;
+            }
+		};
+	}
+  public:
+	Server( caf::actor_config & cfg ) : event_based_actor( cfg ) {}
+}; // Server
+
+void caf_main( actor_system & sys ) {
+	starttime = steady_clock::now();
+
+    *client = sys.spawn<Client>();
+
+	for ( unsigned int i = 0; i < Messages; i += 1 ) {		// create actors
+		servers[i] = sys.spawn<Server>();
+	} // for
+
+	caf::scoped_actor self{sys};
+    self->send( *client, 0 );
+} // caf_main
+
+int main( int argc, char * argv[] ) {
+	switch ( argc ) {
+      case 5:
+		if ( strcmp( argv[4], "d" ) != 0 ) {			// default ?
+			Factor = stoi( argv[4] );
+			if ( Factor < 1 ) goto Usage;
+		} // if
+      case 4:
+		if ( strcmp( argv[3], "d" ) != 0 ) {			// default ?
+			Times = stoi( argv[3] );
+			if ( Times < 1 ) goto Usage;
+		} // if
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Processors = stoi( argv[2] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Messages = stoi( argv[1] );
+			if ( Messages < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0]
+			 << ") ] [ messages (> 0) | 'd' (default " << Messages
+			 << ") ] [ processors (> 0) | 'd' (default " << Processors
+             << ") ] [ Times (> 0) | 'd' (default " << Times
+			 << ") ]" << endl;
+		exit( EXIT_FAILURE );
+	} // switch
+
+    Times = Times / Factor;
+
+	//cout << Actors << " " << Set << " " << Rounds << " " << Processors << endl;
+	servers = new actor[Messages];
+    client = new actor();
+
+	caf::core::init_global_meta_objects();
+	caf::exec_main_init_meta_objects<id_block::custom_types_1>();
+    // caf::exec_main_init_meta_objects<>();
+
+	caf::actor_system_config cfg;
+	cfg.set( "caf.scheduler.max-threads", Processors );
+	caf::actor_system system { cfg };
+
+	caf::exec_main<>(caf_main, argc, argv);
+} // main
+
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" a.out
+
+// Local Variables: //
+// compile-command: "g++-10 -Wall -O3 -std=c++17 -ICAF/actor-framework/libcaf_core -ICAF/actor-framework/libcaf_core/caf -ICAF/actor-framework/build/libcaf_core -LCAF/actor-framework/build/libcaf_core -LCAF/actor-framework/build/libcaf_io CAFMatrix.cpp -lcaf_io -lcaf_core -Wl,-rpath=CAF/actor-framework/build/libcaf_core" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFSendDynamic.cpp
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFSendDynamic.cpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFSendDynamic.cpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,62 @@
+#include <iostream>
+using namespace std;
+#include <chrono>
+using namespace chrono;
+
+#include "caf/actor_ostream.hpp"
+#include "caf/caf_main.hpp"
+#include "caf/event_based_actor.hpp"
+using namespace caf;
+
+int Times = 2'000'000;									// default values
+time_point<steady_clock> starttime;
+
+class Send : public event_based_actor {
+  public:
+	Send( caf::actor_config & cfg ) : event_based_actor( cfg ) {}
+
+	behavior make_behavior() override {
+		return {
+			[=]( int & cnt ) -> void {
+				if ( cnt >= Times ) {
+					aout(this) << (steady_clock::now() - starttime).count() / Times << endl;
+					this->quit();
+					return;
+				} // if
+				//aout(this) << cnt << endl;
+				this->send( spawn<Send>(), cnt + 1 );
+			}
+		};
+	}
+}; // Send
+
+void caf_main( actor_system & sys ) {
+	auto starter = sys.spawn<Send>();
+	starttime = steady_clock::now();
+	caf::anon_send( starter, 0 );
+} // caf_main
+
+int main( int argc, char * argv[] ) {
+	switch ( argc ) {
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) { Times = stoi( argv[1] ); }
+		if ( Times < 1 ) goto Usage;
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0] << " [ times (> 0) ]" << endl;
+		exit( EXIT_FAILURE );
+	} // switch
+
+	caf::exec_main_init_meta_objects<>();
+	caf::core::init_global_meta_objects();
+	return caf::exec_main<>(caf_main, argc, argv);
+} // main
+//CAF_MAIN()
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" a.out
+
+// Local Variables: //
+// compile-command: "g++-10 -O3 -Wall -std=c++17 -ICAF/actor-framework/libcaf_core -ICAF/actor-framework/libcaf_core/caf -ICAF/actor-framework/build/libcaf_core -LCAF/actor-framework/build/libcaf_core -LCAF/actor-framework/build/libcaf_io CAFSendDynamic.cpp -lcaf_io -lcaf_core -Wl,-rpath=CAF/actor-framework/build/libcaf_core" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFSendStatic.cpp
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFSendStatic.cpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/caf/CAFSendStatic.cpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,62 @@
+#include <iostream>
+using namespace std;
+#include <chrono>
+using namespace chrono;
+
+#include "caf/actor_ostream.hpp"
+#include "caf/caf_main.hpp"
+#include "caf/event_based_actor.hpp"
+using namespace caf;
+
+int Times = 10'000'000;									// default values
+time_point<steady_clock> starttime;
+
+class Send : public event_based_actor {
+  public:
+	Send( caf::actor_config & cfg ) : event_based_actor( cfg ) {}
+
+	behavior make_behavior() override {
+		return {
+			[=]( int & cnt ) -> void {
+				if ( cnt >= Times ) {
+					aout(this) << (steady_clock::now() - starttime).count() / Times << endl;
+					this->quit();
+					return;
+				} // if
+				//aout(this) << cnt << endl;
+				this->send( this, cnt + 1 );
+			}
+		};
+	}
+}; // Send
+
+void caf_main( actor_system & sys ) {
+	auto starter = sys.spawn<Send>();
+	starttime = steady_clock::now();
+	caf::anon_send( starter, 0 );
+} // caf_main
+
+int main( int argc, char * argv[] ) {
+	switch ( argc ) {
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) { Times = stoi( argv[1] ); }
+		if ( Times < 1 ) goto Usage;
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0] << " [ times (> 0) ]" << endl;
+		exit( EXIT_FAILURE );
+	} // switch
+
+	caf::exec_main_init_meta_objects<>();
+	caf::core::init_global_meta_objects();
+	return caf::exec_main<>(caf_main, argc, argv);
+} // main
+//CAF_MAIN()
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" a.out
+
+// Local Variables: //
+// compile-command: "g++-10 -O3 -Wall -std=c++17 -ICAF/actor-framework/libcaf_core -ICAF/actor-framework/libcaf_core/caf -ICAF/actor-framework/build/libcaf_core -LCAF/actor-framework/build/libcaf_core -LCAF/actor-framework/build/libcaf_io CAFSendStatic.cpp -lcaf_io -lcaf_core -Wl,-rpath=CAF/actor-framework/build/libcaf_core" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/caf/caf-application.conf
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/caf/caf-application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/caf/caf-application.conf	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,5 @@
+caf {
+    scheduler {
+        max-threads = 1
+    }
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/balance.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/balance.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/balance.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,184 @@
+#include <actor.hfa>
+#include <fstream.hfa>
+#include <stdlib.hfa>
+#include <string.h>
+#include <stdio.h>
+#include "bench.hfa"
+
+// int Actors = 40000, Set = 100, Rounds = 100, Processors = 1, Batch = 1, BufSize = 10; // default values
+int ActorsPerQueue = 32, Set = 32, Rounds = 100, Processors = 1, Batch = 100, BufSize = 10; // other defaults for test to run in reasonable time
+
+struct filler { 
+    inline actor;
+};
+void ?{}( filler & this ) with(this) { ((actor &)this){}; }
+
+static int ids = 0;
+struct d_actor { 
+    inline actor;
+    int gstart, id, rounds, recs, sends;
+};
+void ?{}( d_actor & this, int idx ) with(this) {
+    ((actor &)this){};
+    id = idx;
+    gstart = id / Set * Set; // remember group-start index
+    rounds = Set * Rounds;	// send at least one message to each group member
+    recs = 0;
+    sends = 0;
+}
+struct d_msg { inline message; } shared_msg;
+struct start_msg { inline message; } start_send;
+
+d_actor ** actor_arr;
+allocation receive( d_actor & this, start_msg & msg ) with( this ) {
+    for ( i; Set ) {
+        *actor_arr[i + gstart] | shared_msg;
+    }
+    return Nodelete;
+}
+
+allocation receive( d_actor & this, d_msg & msg ) with( this ) {
+    if ( recs == rounds ) return Delete;
+    if ( recs % Batch == 0 ) {
+        for ( i; Batch ) {
+            *actor_arr[gstart + sends % Set] | shared_msg;
+            sends += 1;
+        }
+    }
+    recs += 1;
+    return Nodelete;
+}
+
+allocation receive( filler & this, d_msg & msg ) { return Delete; }
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 7:
+		if ( strcmp( argv[6], "d" ) != 0 ) {			// default ?
+			BufSize = atoi( argv[6] );
+			if ( BufSize < 0 ) goto Usage;
+		} // if
+	  case 6:
+		if ( strcmp( argv[5], "d" ) != 0 ) {			// default ?
+			Batch = atoi( argv[5] );
+			if ( Batch < 1 ) goto Usage;
+		} // if
+	  case 5:
+		if ( strcmp( argv[4], "d" ) != 0 ) {			// default ?
+			Processors = atoi( argv[4] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 4:
+		if ( strcmp( argv[3], "d" ) != 0 ) {			// default ?
+			Rounds = atoi( argv[3] );
+			if ( Rounds < 1 ) goto Usage;
+		} // if
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Set = atoi( argv[2] );
+			if ( Set < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			ActorsPerQueue = atoi( argv[1] );
+			if ( ActorsPerQueue < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ ActorsPerQueue (> 0) | 'd' (default " | ActorsPerQueue
+			 | ") ] [ set (> 0) | 'd' (default " | Set
+			 | ") ] [ rounds (> 0) | 'd' (default " | Rounds
+			 | ") ] [ processors (> 0) | 'd' (default " | Processors
+			 | ") ] [ batch (> 0) | 'd' (default " | Batch
+			 | ") ] [ buffer size (>= 0) | 'd' (default " | BufSize
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+
+    unsigned int qpw = 512; // queues per worker
+
+    executor e{ Processors, Processors, Processors == 1 ? 1 : Processors * qpw, true };
+
+    // printf("starting\n");
+
+    start_actor_system( e );
+
+    // printf("started\n");
+
+    #ifndef MULTI
+    int Actors = ActorsPerQueue * qpw;
+    int FillActors = ActorsPerQueue * qpw * (Processors - 1);
+    #else
+    int extra = Processors % 2;
+    int ActorProcs = (Processors / 2 + extra);
+    int Actors = ActorsPerQueue * qpw * ActorProcs;
+    int FillActors = ActorsPerQueue * qpw * (Processors/2);
+    #endif
+    int fill_offset = (Processors - 1) * qpw;
+
+    int AllocFill = FillActors;
+    if ( FillActors == 0 ) AllocFill = 1;
+
+    d_actor ** actors; // array needs to be on the heap since it can be very large
+    actors = aalloc( Actors );
+
+    actor_arr = actors;
+
+    filler ** filler_actors; // array needs to be on the heap since it can be very large
+    filler_actors = aalloc( AllocFill );
+
+    int actor_count = 0;
+    int fill_count = 0;
+
+    int idx;
+    for ( i; ActorsPerQueue ) {
+        for ( j; Processors ) {
+            for ( k; qpw ) {
+                #ifndef MULTI
+                if ( j == 0 )
+                #else
+                if ( j % 2 == 0 )
+                #endif
+                {
+                    #ifndef MULTI
+                    idx = k * ActorsPerQueue + i;
+                    #else
+                    idx = (j / 2) * qpw * ActorsPerQueue + k * ActorsPerQueue + i; // set all on one queue
+                    #endif
+                    (*(actors[ idx ] = alloc())){ idx };
+                } else {
+                    (*(filler_actors[ fill_count ] = alloc())){};
+                    fill_count++;
+                }
+            }
+        }
+    }
+
+    uint64_t start_time = bench_time();
+
+    #ifndef MULTI
+	for ( i; qpw )
+		*actors[i * ActorsPerQueue] | start_send;
+    #else
+    for ( i; qpw * ActorProcs ) {
+		*actors[i * ActorsPerQueue] | start_send;
+    }
+    #endif
+    
+    for ( i; FillActors ) 
+        *filler_actors[i] | shared_msg;
+
+    stop_actor_system();
+    
+    uint64_t end_time = bench_time();
+
+    printf("%.2f\n", ((double)(end_time - start_time))*((double)1e-9) );
+
+    adelete( filler_actors );
+    adelete( actors );
+
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/bench.hfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/bench.hfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/bench.hfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,7 @@
+#include <time.hfa>
+
+static inline uint64_t bench_time() {
+	struct timespec ts;
+	clock_gettime( CLOCK_REALTIME, &ts );
+	return 1000000000LL * ts.tv_sec + ts.tv_nsec;
+} // bench_time
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/dynamic.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/dynamic.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/dynamic.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,76 @@
+#include <actor.hfa>
+#include <fstream.hfa>
+#include <stdlib.hfa>
+#include <string.h>
+#include <stdio.h>
+#include "bench.hfa"
+
+int Times = 1000000;								// default values
+
+struct derived_actor {
+    inline actor;
+};
+
+struct derived_msg {
+    inline message;
+    int cnt;
+};
+
+static inline void ?{}( derived_msg & this, int cnt ) {
+    ((message &) this){ Delete };
+    this.cnt = cnt;
+}
+static inline void ?{}( derived_msg & this ) { this{ 0 }; }
+
+uint64_t start_time;
+allocation receive( derived_actor & receiver, derived_msg & msg ) {
+    if ( msg.cnt >= Times ) {
+        printf("%.2f\n", ((double)(bench_time() - start_time)) / ((double)Times) ); // ns
+        return Delete;
+    }
+    derived_msg * d_msg = malloc();
+    (*d_msg){ msg.cnt + 1 };
+    derived_actor * d_actor = malloc();
+    (*d_actor){};
+    *d_actor | *d_msg;
+    return Delete;
+}
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Times = atoi( argv[1] );
+			if ( Times < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0] | " [ times (> 0) ]";
+		exit( EXIT_FAILURE );
+	} // switch
+
+    executor e{ 0, 1, 1, false, 1 };
+
+    start_actor_system( e );
+
+    start_time = bench_time();
+
+    derived_msg * d_msg = malloc();
+    (*d_msg){};
+    derived_actor * d_actor = malloc();
+    (*d_actor){};
+    *d_actor | *d_msg;
+
+
+    stop_actor_system();
+    
+    // uint64_t end_time = bench_time();
+
+    // printf("%.2f\n", ((double)(end_time - start_time))*((double)1e-9) ); // s
+
+    // printf("%.2f\n", ((double)(end_time - start_time)) / ((double)Times) ); // ns
+
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/executor.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/executor.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/executor.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,106 @@
+#include <actor.hfa>
+#include <fstream.hfa>
+#include <stdlib.hfa>
+#include <string.h>
+#include <stdio.h>
+#include "bench.hfa"
+
+// int Actors = 40000, Set = 100, Rounds = 100, Processors = 1, Batch = 1, BufSize = 10; // default values
+int Actors = 1000, Set = 20, Rounds = 10, Processors = 1, Batch = 1, BufSize = 10; // other defaults for test to run in reasonable time
+
+static int ids = 0;
+struct d_actor { 
+    inline actor;
+    d_actor * gstart;
+    int id, rounds, recs, sends;
+};
+void ?{}( d_actor & this ) with(this) {
+    ((actor &)this){};
+    id = ids++;
+    gstart = (&this + (id / Set * Set - id)); // remember group-start array-element
+    rounds = Set * Rounds;	// send at least one message to each group member
+    recs = 0;
+    sends = 0;
+}
+struct d_msg { inline message; } shared_msg;
+
+allocation receive( d_actor & this, d_msg & msg ) with( this ) {
+    if ( recs == rounds ) return Finished;
+    if ( recs % Batch == 0 ) {
+        for ( i; Batch ) {
+            gstart[sends % Set] | shared_msg;
+            sends += 1;
+        }
+    }
+    recs += 1;
+    return Nodelete;
+}
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 7:
+		if ( strcmp( argv[6], "d" ) != 0 ) {			// default ?
+			BufSize = atoi( argv[6] );
+			if ( BufSize < 0 ) goto Usage;
+		} // if
+	  case 6:
+		if ( strcmp( argv[5], "d" ) != 0 ) {			// default ?
+			Batch = atoi( argv[5] );
+			if ( Batch < 1 ) goto Usage;
+		} // if
+	  case 5:
+		if ( strcmp( argv[4], "d" ) != 0 ) {			// default ?
+			Processors = atoi( argv[4] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 4:
+		if ( strcmp( argv[3], "d" ) != 0 ) {			// default ?
+			Rounds = atoi( argv[3] );
+			if ( Rounds < 1 ) goto Usage;
+		} // if
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Set = atoi( argv[2] );
+			if ( Set < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Actors = atoi( argv[1] );
+			if ( Actors < 1 || Actors <= Set || Actors % Set != 0 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ actors (> 0 && > set && actors % set == 0 ) | 'd' (default " | Actors
+			 | ") ] [ set (> 0) | 'd' (default " | Set
+			 | ") ] [ rounds (> 0) | 'd' (default " | Rounds
+			 | ") ] [ processors (> 0) | 'd' (default " | Processors
+			 | ") ] [ batch (> 0) | 'd' (default " | Batch
+			 | ") ] [ buffer size (>= 0) | 'd' (default " | BufSize
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+
+    
+    executor e{ Processors, Processors, Processors == 1 ? 1 : Processors * 512, true, BufSize };
+
+    uint64_t start_time = bench_time();
+
+    start_actor_system( e );
+
+    d_actor actors[ Actors ];
+
+	for ( i; Actors ) {
+		actors[i] | shared_msg;
+	} // for
+
+    stop_actor_system();
+    
+    uint64_t end_time = bench_time();
+
+    printf("%.2f\n", ((double)(end_time - start_time))*((double)1e-9) );
+
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/matrix.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/matrix.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/matrix.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,123 @@
+#include <actor.hfa>
+#include <fstream.hfa>
+#include <stdlib.hfa>
+#include <string.h>
+#include <stdio.h>
+#include "bench.hfa"
+
+unsigned int xr = 500, xc = 500, yc = 500, Processors = 1; // default values
+
+struct derived_actor { inline actor; };
+struct derived_msg {
+    inline message;
+    int * Z;
+	int * X;
+    int ** Y;
+};
+
+void ?{}( derived_msg & this ) {}
+void ?{}( derived_msg & this, int * Z, int * X, int ** Y ) {
+    ((message &) this){ Nodelete };
+    this.Z = Z;
+    this.X = X;
+    this.Y = Y;
+}
+
+allocation receive( derived_actor & receiver, derived_msg & msg ) {
+    for ( unsigned int i = 0; i < yc; i += 1 ) { // multiply X_row by Y_col and sum products
+        msg.Z[i] = 0;
+        for ( unsigned int j = 0; j < xc; j += 1 ) {
+            msg.Z[i] += msg.X[j] * msg.Y[j][i];
+        } // for
+    } // for
+    return Finished;
+}
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 5:
+		if ( strcmp( argv[4], "d" ) != 0 ) {			// default ?
+			Processors = atoi( argv[4] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 4:
+		if ( strcmp( argv[3], "d" ) != 0 ) {			// default ?
+			xr = atoi( argv[3] );
+			if ( xr < 1 ) goto Usage;
+		} // if
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			xc = atoi( argv[2] );
+			if ( xc < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			yc = atoi( argv[1] );
+			if ( yc < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+			 | " [ yc (> 0) | 'd' (default " | yc
+			 | ") ] [ xc (> 0) | 'd' (default " | xc
+			 | ") ] [ xr (> 0) | 'd' (default " | xr
+			 | ") ] [ processors (> 0) | 'd' (default " | Processors
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+
+    unsigned int r, c;
+	int * Z[xr], * X[xr], * Y[xc];
+
+	for ( r = 0; r < xr; r += 1 ) {						// create/initialize X matrix
+		X[r] = aalloc( xc );
+		for ( c = 0; c < xc; c += 1 ) {
+			X[r][c] = r * c % 37;						// for timing
+		} // for
+	} // for
+	for ( r = 0; r < xc; r += 1 ) {						// create/initialize Y matrix
+		Y[r] = aalloc( yc );
+		for ( c = 0; c < yc; c += 1 ) {
+			Y[r][c] = r * c % 37;						// for timing
+		} // for
+	} // for
+	for ( r = 0; r < xr; r += 1 ) {						// create Z matrix
+		Z[r] = aalloc( yc );
+	} // for
+
+    executor e{ Processors, Processors, Processors == 1 ? 1 : Processors * 32, true };
+
+    uint64_t start_time = bench_time();
+
+    start_actor_system( e );
+
+    derived_msg messages[xr];
+
+    derived_actor actors[xr];
+
+	for ( unsigned int r = 0; r < xr; r += 1 ) {
+		messages[r]{ Z[r], X[r], Y };
+	} // for
+
+	for ( unsigned int r = 0; r < xr; r += 1 ) {
+		actors[r] | messages[r];
+	} // for
+
+    stop_actor_system();
+    
+    uint64_t end_time = bench_time();
+
+    printf("%.2f\n", ((double)(end_time - start_time))*((double)1e-9) );
+
+    for ( r = 0; r < xr; r += 1 ) {						// deallocate X and Z matrices
+		free( X[r] );
+        free( Z[r] );
+	} // for
+	for ( r = 0; r < xc; r += 1 ) {						// deallocate Y matrix
+        free( Y[r] );
+	} // for
+
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/repeat.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/repeat.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/repeat.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,135 @@
+#include <actor.hfa>
+#include <fstream.hfa>
+#include <stdlib.hfa>
+#include <string.h>
+#include <stdio.h>
+#include "bench.hfa"
+
+size_t Messages = 100000, Processors = 4, QScale = 256, Times = 100;
+
+struct Server { inline actor; };
+struct IntMsg {
+    inline message;
+    int val;
+};
+struct CharMsg {
+    inline message;
+    char val;
+};
+struct StateMsg { inline message; } stateMsg;
+
+struct Client {
+    inline actor;
+    Server * servers;
+	IntMsg * intmsg;
+	CharMsg * charmsg;
+	size_t results, times;
+};
+void ?{}( Client & this ) with(this) {
+    ((actor &)this){};
+    results = 0;
+    times = 0;
+    servers = aalloc( Messages );
+    intmsg = aalloc( Messages );
+    charmsg = aalloc( Messages );
+    for ( i; Messages ) {
+        servers[i]{};
+        intmsg[i]{};
+        charmsg[i]{};
+    }
+}
+void ^?{}( Client & this ) with(this) {
+    adelete( servers );
+    adelete( intmsg );
+    adelete( charmsg );
+}
+
+Client * cl;
+allocation receive( Server & this, IntMsg & msg ) { msg.val = 7; *cl | msg; return Nodelete; }
+allocation receive( Server & this, CharMsg & msg ) { msg.val = 'x'; *cl | msg; return Nodelete; }
+allocation receive( Server & this, StateMsg & msg ) { return Finished; }
+
+void terminateServers( Client & this ) with(this) {
+    for ( i; Messages ) {
+        servers[i] | stateMsg;
+    } // for
+}
+
+allocation reset( Client & this ) with(this) {
+    times += 1;
+    if ( times == Times ) { terminateServers( this ); return Finished; }
+    results = 0;
+    this | stateMsg;
+    return Nodelete;
+}
+
+allocation process( Client & this ) with(this) {
+    this.results++;
+    if ( results == 2 * Messages ) { return reset( this ); }
+    return Nodelete;
+}
+
+allocation receive( Client & this, IntMsg & msg ) { return process( this ); }
+allocation receive( Client & this, CharMsg & msg ) { return process( this ); }
+allocation receive( Client & this, StateMsg & msg ) with(this) {
+    for ( i; Messages ) {
+        servers[i] | intmsg[i];
+        servers[i] | charmsg[i];
+    }
+    return Nodelete;
+}
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+      case 5:
+		if ( strcmp( argv[4], "d" ) != 0 ) {			// default ?
+			QScale = atoi( argv[4] );
+			if ( QScale < 1 ) goto Usage;
+		} // if
+	  case 4:
+		if ( strcmp( argv[3], "d" ) != 0 ) {			// default ?
+			Times = atoi( argv[3] );
+			if ( Times < 1 ) goto Usage;
+		} // if
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Processors = atoi( argv[2] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Messages = atoi( argv[1] );
+			if ( Messages < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | ") ] [ messages (> 0) | 'd' (default " | Messages
+			 | ") ] [ processors (> 0) | 'd' (default " | Processors
+             | ") ] [ Times (> 0) | 'd' (default " | Times
+			 | ") ] [ qscale (> 0) | 'd' (default " | QScale
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+
+    
+    executor e{ Processors, Processors, Processors == 1 ? 1 : Processors * QScale, true, 1 };
+
+    uint64_t start_time = bench_time();
+
+    start_actor_system( e );
+
+    Client client;
+    cl = &client;
+    client | stateMsg;
+
+    stop_actor_system();
+
+    uint64_t end_time = bench_time();
+
+    printf("%.2f\n", ((double)(end_time - start_time))*((double)1e-9) );
+
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/static.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/static.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/cfa/static.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,69 @@
+#include <actor.hfa>
+#include <fstream.hfa>
+#include <stdlib.hfa>
+#include <string.h>
+#include <stdio.h>
+#include "bench.hfa"
+
+int Times = 1000000;								// default values
+
+struct derived_actor {
+    inline actor;
+};
+
+struct derived_msg {
+    inline message;
+    int cnt;
+};
+
+static inline void ?{}( derived_msg & this, int cnt ) {
+    this.cnt = cnt;
+}
+static inline void ?{}( derived_msg & this ) { this{ 0 }; }
+
+uint64_t start_time;
+allocation receive( derived_actor & receiver, derived_msg & msg ) {
+    if ( msg.cnt >= Times ) {
+        printf("%.2f\n", ((double)(bench_time() - start_time)) / ((double)Times) ); // ns
+        return Finished;
+    }
+    msg.cnt++;
+    receiver | msg;
+    return Nodelete;
+}
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Times = atoi( argv[1] );
+			if ( Times < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0] | " [ times (> 0) ]";
+		exit( EXIT_FAILURE );
+	} // switch
+
+    executor e{ 0, 1, 1, false, 1 };
+    
+    start_actor_system( e );
+
+    start_time = bench_time();
+
+    derived_msg msg;
+
+    derived_actor actor;
+
+    actor | msg;
+
+    stop_actor_system();
+    
+    // uint64_t end_time = bench_time();
+
+    // printf("%.2f\n", ((double)(end_time - start_time))*((double)1e-9) ); // s
+
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasusExecutorMem
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasusExecutorMem	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasusExecutorMem	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,1 @@
+331MB & 139MB & 7714MB & 116MB & 549MB
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasusSendDynamic
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasusSendDynamic	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasusSendDynamic	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,1 @@
+46ns & 9501ns & 7483ns & 72ns & 5547ns
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasusSendStatic
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasusSendStatic	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasusSendStatic	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,1 @@
+23ns & 2779ns & 59ns & 40ns & 68ns
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_ALL.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_ALL.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_ALL.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,639 @@
+5
+1 2 4 8 16 24 32 48
+CFA CAF Akka uC++ ProtoActor 
+executor
+CFA:
+proc	time (s)
+1	27.89
+1	27.88
+1	27.88
+1	27.86
+1	27.88
+2	17.43
+2	16.47
+2	16.40
+2	16.59
+2	17.43
+4	8.14
+4	8.14
+4	8.14
+4	8.15
+4	8.10
+8	4.26
+8	4.27
+8	4.47
+8	4.54
+8	4.55
+16	2.34
+16	2.38
+16	2.32
+16	2.40
+16	2.44
+24	1.85
+24	1.83
+24	1.84
+24	1.84
+24	1.85
+32	1.49
+32	1.50
+32	1.49
+32	1.48
+32	1.47
+48	1.13
+48	1.14
+48	1.14
+48	1.20
+48	1.15
+CAF:
+proc	time (s)
+1	4900.878733
+1	4918.476761
+1	4936.951566
+1	4959.593741
+1	4969.566294
+2	2500.376166
+2	2513.861808
+2	2515.255803
+2	2516.835639
+2	2509.751704
+4	1242.141326
+4	1226.724338
+4	1224.971363
+4	1234.547069
+4	1235.981565
+8	640.216571
+8	639.03181
+8	626.0021
+8	640.074168
+8	635.070736
+16	325.366198
+16	321.032636
+16	325.103255
+16	325.716595
+16	323.916352
+24	220.383166
+24	220.784641
+24	218.07366
+24	219.908456
+24	220.128367
+32	170.395832
+32	172.53818
+32	169.047318
+32	170.795543
+32	170.172169
+48	128.193221
+48	127.856505
+48	128.048616
+48	128.505148
+48	128.219437
+Akka:
+proc	time (s)
+1	222.58
+1	221.77
+1	223.16
+1	220.20
+1	221.08
+2	165.17
+2	168.31
+2	158.73
+2	159.12
+2	159.47
+4	69.72
+4	68.85
+4	68.44
+4	68.77
+4	68.87
+8	43.49
+8	43.03
+8	42.88
+8	43.55
+8	43.30
+16	21.83
+16	21.06
+16	20.36
+16	20.27
+16	20.30
+24	12.73
+24	12.85
+24	12.53
+24	12.79
+24	13.12
+32	10.44
+32	10.47
+32	10.39
+32	10.39
+32	10.24
+48	8.32
+48	8.37
+48	7.83
+48	7.79
+48	7.96
+uC++:
+proc	time (s)
+1	97.0158
+1	96.3935
+1	96.5074
+1	96.4021
+1	95.9483
+2	122.782
+2	122.963
+2	123.845
+2	123.715
+2	123.853
+4	64.0537
+4	64.59
+4	60.1213
+4	64.9243
+4	63.3038
+8	28.9171
+8	30.5089
+8	30.749
+8	32.6108
+8	30.3437
+16	11.016
+16	10.9295
+16	10.8278
+16	11.3025
+16	10.667
+24	7.03097
+24	7.77078
+24	7.68058
+24	8.0596
+24	7.79656
+32	5.36096
+32	5.36095
+32	5.54695
+32	5.31935
+32	5.44476
+48	3.91133
+48	3.48119
+48	3.66357
+48	3.83579
+48	3.68556
+ProtoActor:
+proc	time (s)
+1	181.17
+1	180.71
+1	181.60
+1	181.19
+1	181.12
+2	91.92
+2	91.65
+2	91.55
+2	92.41
+2	91.99
+4	45.48
+4	45.27
+4	45.45
+4	45.22
+4	45.12
+8	24.80
+8	24.65
+8	24.73
+8	24.60
+8	24.89
+16	12.99
+16	13.03
+16	12.92
+16	13.05
+16	13.13
+24	9.08
+24	9.07
+24	9.19
+24	9.26
+24	9.24
+32	7.19
+32	7.24
+32	7.22
+32	7.23
+32	7.26
+48	5.59
+48	5.70
+48	5.57
+48	5.82
+48	5.56
+
+matrix
+CFA:
+proc	time (s)
+1	105.38
+1	105.55
+1	105.56
+1	105.39
+1	105.43
+2	52.48
+2	52.55
+2	52.42
+2	52.67
+2	52.61
+4	32.07
+4	31.75
+4	31.09
+4	32.10
+4	29.20
+8	16.65
+8	16.03
+8	15.40
+8	16.67
+8	16.63
+16	7.95
+16	7.90
+16	7.93
+16	7.59
+16	8.01
+24	5.25
+24	5.01
+24	5.26
+24	5.26
+24	5.35
+32	3.99
+32	3.89
+32	3.96
+32	4.05
+32	3.94
+48	2.81
+48	2.78
+48	2.84
+48	2.78
+48	2.79
+CAF:
+proc	time (s)
+1	113.24565
+1	112.252672
+1	112.15444
+1	111.821224
+1	112.059774
+2	52.893447
+2	52.760261
+2	52.721939
+2	52.706697
+2	52.965923
+4	24.909105
+4	24.975313
+4	24.726185
+4	24.848346
+4	25.372345
+8	13.01225
+8	12.821945
+8	13.037734
+8	12.78275
+8	12.970687
+16	6.294912
+16	6.360767
+16	6.185545
+16	6.148743
+16	6.174624
+24	4.136817
+24	4.156146
+24	4.20957
+24	4.133063
+24	4.110193
+32	3.105526
+32	3.121979
+32	3.059528
+32	3.091578
+32	3.08302
+48	2.186365
+48	2.238905
+48	2.211279
+48	2.165282
+48	2.191107
+Akka:
+proc	time (s)
+1	240.93
+1	232.89
+1	244.96
+1	237.24
+1	246.71
+2	102.20
+2	100.12
+2	104.57
+2	108.95
+2	99.27
+4	50.93
+4	52.17
+4	52.82
+4	50.38
+4	49.91
+8	24.40
+8	24.36
+8	23.88
+8	25.96
+8	25.51
+16	11.81
+16	11.98
+16	10.87
+16	13.00
+16	15.49
+24	8.25
+24	8.05
+24	7.85
+24	11.08
+24	10.02
+32	5.85
+32	5.78
+32	5.72
+32	6.00
+32	8.82
+48	4.62
+48	4.51
+48	4.65
+48	6.75
+48	6.63
+uC++:
+proc	time (s)
+1	105.429
+1	105.532
+1	105.439
+1	105.385
+1	105.182
+2	52.3729
+2	52.5111
+2	52.4837
+2	52.365
+2	52.2454
+4	32.2482
+4	30.5788
+4	30.2594
+4	31.1519
+4	31.9686
+8	16.8246
+8	16.3382
+8	14.8115
+8	16.0715
+8	16.5177
+16	7.76914
+16	7.99934
+16	8.04327
+16	7.73579
+16	7.91202
+24	5.34197
+24	5.24674
+24	5.29154
+24	5.29343
+24	5.19958
+32	3.90208
+32	3.96971
+32	4.07073
+32	4.03149
+32	3.94643
+48	2.79621
+48	2.78777
+48	2.76681
+48	2.76275
+48	2.79163
+ProtoActor:
+proc	time (s)
+1	296.11
+1	325.06
+1	314.30
+1	309.08
+1	324.49
+2	155.04
+2	162.74
+2	152.08
+2	143.98
+2	153.34
+4	81.13
+4	84.72
+4	81.88
+4	80.70
+4	79.91
+8	42.33
+8	45.30
+8	46.54
+8	42.60
+8	41.88
+16	23.02
+16	21.47
+16	21.58
+16	22.76
+16	22.15
+24	14.54
+24	15.49
+24	15.59
+24	14.25
+24	15.20
+32	10.64
+32	11.63
+32	11.22
+32	11.37
+32	11.14
+48	7.95
+48	7.58
+48	8.09
+48	7.50
+48	8.17
+
+repeat
+CFA:
+proc	time (s)
+1	1.21
+1	1.20
+1	1.19
+1	1.18
+1	1.19
+2	2.64
+2	2.64
+2	2.59
+2	2.57
+2	2.54
+4	4.31
+4	4.29
+4	4.33
+4	4.32
+4	4.23
+8	8.89
+8	9.38
+8	9.58
+8	9.13
+8	9.55
+16	12.10
+16	10.87
+16	12.06
+16	11.15
+16	11.03
+24	12.24
+24	12.35
+24	12.12
+24	11.29
+24	12.20
+32	12.85
+32	12.88
+32	11.67
+32	11.72
+32	12.86
+48	13.91
+48	14.56
+48	13.60
+48	14.54
+48	14.36
+CAF:
+proc	time (s)
+1	14.628787
+1	14.539908
+1	14.446031
+1	14.816183
+1	14.704888
+2	372.995836
+2	370.052554
+2	358.297448
+2	367.870134
+2	361.203061
+4	71.639218
+4	50.36729
+4	96.7592
+4	48.992481
+4	65.302661
+8	290.932933
+8	288.777295
+8	288.490537
+8	289.275663
+8	293.133891
+16	424.615697
+16	429.027012
+16	429.480927
+16	429.663817
+16	423.407657
+24	500.792465
+24	513.916035
+24	513.767923
+24	511.405797
+24	517.728684
+32	571.369441
+32	579.834615
+32	594.699179
+32	578.098629
+32	577.389526
+48	155.814207
+48	218.491525
+48	195.125633
+48	178.549176
+48	207.357198
+Akka:
+proc	time (s)
+1	49.24
+1	106.39
+1	48.18
+1	52.28
+1	46.05
+2	31.49
+2	31.40
+2	32.83
+2	30.14
+2	31.45
+4	22.76
+4	22.28
+4	22.18
+4	23.17
+4	22.73
+8	52.22
+8	43.58
+8	37.10
+8	39.93
+8	35.76
+16	45.97
+16	49.48
+16	45.04
+16	45.56
+16	48.70
+24	48.13
+24	47.15
+24	51.13
+24	50.63
+24	47.28
+32	46.19
+32	46.30
+32	48.80
+32	42.65
+32	49.05
+48	53.23
+48	54.51
+48	56.91
+48	52.19
+48	56.87
+uC++:
+proc	time (s)
+1	4.9825
+1	4.97732
+1	4.97899
+1	4.97845
+1	4.97239
+2	6.20535
+2	6.14484
+2	6.11694
+2	6.14838
+2	6.1275
+4	5.81568
+4	5.90346
+4	5.85525
+4	5.88343
+4	5.85941
+8	13.7552
+8	16.5563
+8	12.2319
+8	17.7957
+8	16.7033
+16	28.1251
+16	28.6592
+16	29.1602
+16	26.7029
+16	29.9697
+24	32.4334
+24	29.845
+24	32.6734
+24	28.6088
+24	31.5063
+32	28.7593
+32	30.228
+32	33.9546
+32	32.3648
+32	27.8869
+48	34.3155
+48	31.1077
+48	34.595
+48	31.9912
+48	33.1009
+ProtoActor:
+proc	time (s)
+1	81.26
+1	81.26
+1	81.05
+1	81.02
+1	80.91
+2	41.22
+2	41.12
+2	41.17
+2	41.32
+2	41.18
+4	21.93
+4	21.92
+4	22.01
+4	21.96
+4	21.95
+8	28.36
+8	29.15
+8	27.08
+8	26.97
+8	26.88
+16	41.36
+16	40.07
+16	42.07
+16	40.77
+16	40.36
+24	42.25
+24	46.75
+24	43.30
+24	45.12
+24	43.88
+32	45.60
+32	46.41
+32	46.50
+32	46.06
+32	46.03
+48	53.14
+48	54.46
+48	54.07
+48	53.65
+48	53.52
+
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_CFA.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_CFA.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_CFA.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,642 @@
+5
+1 2 4 8 16 24 32 48
+Longest-Victim No-Stealing Random 
+executor
+Longest-Victim:
+proc	time (s)
+1	27.89
+1	27.89
+1	27.87
+1	27.85
+1	27.89
+2	17.40
+2	17.24
+2	16.73
+2	16.55
+2	16.37
+4	8.11
+4	8.12
+4	8.10
+4	8.10
+4	8.10
+8	4.26
+8	4.39
+8	4.19
+8	4.21
+8	4.39
+16	2.22
+16	2.42
+16	2.34
+16	2.32
+16	2.33
+24	1.78
+24	1.78
+24	1.85
+24	1.82
+24	1.80
+32	1.50
+32	1.46
+32	1.51
+32	1.50
+32	1.49
+48	1.11
+48	1.21
+48	1.16
+48	1.14
+48	1.18
+No-Stealing:
+proc	time (s)
+1	27.82
+1	27.78
+1	27.77
+1	27.76
+1	27.76
+2	17.78
+2	17.76
+2	17.81
+2	17.77
+2	17.90
+4	8.23
+4	8.14
+4	8.18
+4	8.26
+4	8.21
+8	4.37
+8	4.10
+8	4.32
+8	4.21
+8	4.25
+16	2.27
+16	2.31
+16	2.35
+16	2.31
+16	2.55
+24	1.89
+24	1.94
+24	1.74
+24	1.95
+24	1.86
+32	1.56
+32	1.53
+32	1.57
+32	1.58
+32	1.52
+48	1.16
+48	1.20
+48	1.23
+48	1.21
+48	1.28
+Random:
+proc	time (s)
+1	28.02
+1	27.99
+1	27.99
+1	27.93
+1	27.98
+2	16.55
+2	16.41
+2	16.36
+2	16.57
+2	16.47
+4	8.23
+4	8.27
+4	8.19
+4	8.28
+4	8.28
+8	4.52
+8	4.36
+8	4.66
+8	4.13
+8	4.16
+16	2.42
+16	2.69
+16	2.48
+16	2.52
+16	2.52
+24	2.15
+24	2.27
+24	2.31
+24	2.18
+24	2.31
+32	1.89
+32	1.84
+32	1.91
+32	1.90
+32	1.89
+48	1.36
+48	1.41
+48	1.43
+48	1.44
+48	1.38
+
+matrix
+Longest-Victim:
+proc	time (s)
+1	105.38
+1	105.51
+1	105.50
+1	105.13
+1	105.58
+2	52.44
+2	52.49
+2	52.63
+2	52.59
+2	52.41
+4	31.96
+4	31.91
+4	31.16
+4	30.98
+4	30.43
+8	16.37
+8	15.48
+8	15.99
+8	16.57
+8	16.79
+16	7.92
+16	7.30
+16	7.98
+16	7.61
+16	7.82
+24	5.22
+24	5.24
+24	5.30
+24	5.33
+24	5.15
+32	4.00
+32	3.95
+32	3.96
+32	4.04
+32	4.03
+48	2.81
+48	2.79
+48	2.82
+48	2.85
+48	2.89
+No-Stealing:
+proc	time (s)
+1	106.21
+1	105.99
+1	105.84
+1	105.25
+1	105.51
+2	52.44
+2	52.50
+2	52.34
+2	52.51
+2	52.55
+4	31.94
+4	32.05
+4	31.99
+4	31.84
+4	31.88
+8	16.77
+8	16.72
+8	16.40
+8	16.55
+8	16.69
+16	7.98
+16	8.02
+16	7.94
+16	7.96
+16	7.99
+24	5.31
+24	5.48
+24	5.43
+24	5.48
+24	5.30
+32	4.23
+32	4.06
+32	4.04
+32	3.99
+32	3.98
+48	2.72
+48	2.82
+48	2.80
+48	2.80
+48	2.76
+Random:
+proc	time (s)
+1	106.47
+1	105.47
+1	105.65
+1	105.82
+1	105.78
+2	52.63
+2	52.41
+2	52.69
+2	52.52
+2	52.38
+4	32.23
+4	32.14
+4	31.07
+4	32.10
+4	31.09
+8	15.81
+8	16.34
+8	16.80
+8	15.92
+8	16.35
+16	8.00
+16	7.31
+16	7.44
+16	7.88
+16	8.01
+24	4.85
+24	5.10
+24	5.09
+24	5.26
+24	5.14
+32	3.75
+32	3.90
+32	3.75
+32	3.64
+32	3.73
+48	2.59
+48	2.68
+48	2.62
+48	2.69
+48	2.70
+
+repeat
+Longest-Victim:
+proc	time (s)
+1	1.19
+1	1.19
+1	1.21
+1	1.21
+1	1.19
+2	2.60
+2	2.62
+2	2.54
+2	2.54
+2	2.62
+4	4.33
+4	4.18
+4	4.31
+4	4.32
+4	4.35
+8	9.52
+8	8.99
+8	9.41
+8	9.50
+8	9.00
+16	10.90
+16	10.82
+16	11.02
+16	12.10
+16	12.05
+24	11.25
+24	12.12
+24	11.23
+24	11.27
+24	12.41
+32	11.54
+32	12.92
+32	12.89
+32	12.97
+32	11.66
+48	13.57
+48	14.45
+48	14.64
+48	13.50
+48	13.50
+No-Stealing:
+proc	time (s)
+1	1.25
+1	1.25
+1	1.23
+1	1.29
+1	1.25
+2	1.94
+2	1.91
+2	1.90
+2	1.90
+2	2.01
+4	4.05
+4	4.05
+4	4.03
+4	4.22
+4	4.19
+8	9.46
+8	9.08
+8	9.35
+8	8.62
+8	9.67
+16	10.85
+16	11.75
+16	10.52
+16	11.38
+16	11.01
+24	11.31
+24	10.49
+24	12.43
+24	12.35
+24	10.45
+32	10.89
+32	12.62
+32	11.07
+32	12.23
+32	10.99
+48	12.72
+48	13.03
+48	13.61
+48	13.08
+48	13.77
+Random:
+proc	time (s)
+1	1.20
+1	1.20
+1	1.20
+1	1.20
+1	1.23
+2	2.63
+2	2.62
+2	2.61
+2	2.64
+2	2.60
+4	4.34
+4	4.37
+4	4.35
+4	4.34
+4	4.34
+8	9.74
+8	9.84
+8	9.57
+8	10.03
+8	9.33
+16	12.33
+16	11.23
+16	11.72
+16	11.35
+16	11.22
+24	11.78
+24	12.66
+24	12.60
+24	12.85
+24	12.93
+32	12.32
+32	13.74
+32	13.45
+32	13.69
+32	13.50
+48	15.23
+48	14.81
+48	14.82
+48	15.56
+48	15.24
+
+balance_one
+Longest-Victim:
+proc	time (s)
+1	19.78
+1	19.81
+1	19.78
+1	19.82
+1	19.82
+2	10.17
+2	10.33
+2	10.66
+2	10.62
+2	10.35
+4	5.22
+4	5.27
+4	5.29
+4	5.27
+4	5.27
+8	2.91
+8	2.91
+8	2.93
+8	2.92
+8	2.90
+16	1.71
+16	1.80
+16	1.77
+16	1.81
+16	1.78
+24	1.34
+24	1.35
+24	1.33
+24	1.34
+24	1.36
+32	1.18
+32	1.12
+32	1.06
+32	1.11
+32	1.19
+48	1.02
+48	1.01
+48	1.04
+48	1.03
+48	1.00
+No-Stealing:
+proc	time (s)
+1	19.73
+1	19.72
+1	19.78
+1	19.72
+1	19.72
+2	19.85
+2	19.70
+2	19.70
+2	19.68
+2	19.69
+4	20.24
+4	19.83
+4	19.82
+4	19.90
+4	19.83
+8	19.79
+8	19.78
+8	19.73
+8	19.67
+8	19.65
+16	19.63
+16	19.72
+16	19.65
+16	19.65
+16	19.59
+24	18.57
+24	18.56
+24	18.63
+24	18.62
+24	18.61
+32	19.61
+32	19.60
+32	19.61
+32	19.57
+32	19.61
+48	19.73
+48	19.86
+48	19.74
+48	19.70
+48	19.70
+Random:
+proc	time (s)
+1	19.79
+1	19.77
+1	19.75
+1	19.73
+1	19.76
+2	10.66
+2	10.14
+2	10.42
+2	10.30
+2	10.23
+4	5.27
+4	5.25
+4	5.28
+4	5.27
+4	5.26
+8	2.94
+8	2.93
+8	2.79
+8	2.92
+8	2.86
+16	1.76
+16	1.70
+16	1.81
+16	1.77
+16	1.73
+24	1.34
+24	1.28
+24	1.31
+24	1.28
+24	1.30
+32	1.15
+32	1.16
+32	1.07
+32	1.13
+32	1.12
+48	0.96
+48	0.98
+48	1.01
+48	0.99
+48	0.98
+
+balance_multi
+Longest-Victim:
+proc	time (s)
+1	7.99
+1	8.02
+1	7.99
+1	7.99
+1	7.99
+2	4.19
+2	4.21
+2	4.13
+2	4.15
+2	4.21
+4	4.11
+4	4.10
+4	4.08
+4	4.11
+4	4.09
+8	4.40
+8	4.42
+8	4.41
+8	4.42
+8	4.35
+16	4.64
+16	4.69
+16	4.72
+16	4.68
+16	4.62
+24	4.91
+24	4.94
+24	4.96
+24	4.92
+24	4.90
+32	5.21
+32	5.25
+32	5.26
+32	5.22
+32	5.23
+48	6.14
+48	6.14
+48	6.18
+48	6.16
+48	6.16
+No-Stealing:
+proc	time (s)
+1	7.93
+1	7.95
+1	7.94
+1	7.95
+1	7.96
+2	8.58
+2	7.88
+2	8.01
+2	7.87
+2	8.20
+4	7.84
+4	7.87
+4	7.81
+4	7.81
+4	7.87
+8	7.99
+8	7.98
+8	7.98
+8	7.99
+8	7.99
+16	7.97
+16	8.55
+16	7.92
+16	7.95
+16	7.98
+24	7.99
+24	8.07
+24	7.96
+24	8.74
+24	7.97
+32	8.06
+32	8.08
+32	8.11
+32	8.24
+32	8.29
+48	9.31
+48	9.27
+48	9.89
+48	9.20
+48	9.30
+Random:
+proc	time (s)
+1	7.97
+1	7.97
+1	7.96
+1	7.98
+1	7.95
+2	4.22
+2	4.05
+2	4.08
+2	4.29
+2	4.08
+4	4.04
+4	4.06
+4	4.05
+4	4.06
+4	4.05
+8	4.19
+8	4.16
+8	4.15
+8	4.14
+8	4.14
+16	4.18
+16	4.16
+16	4.20
+16	4.17
+16	4.18
+24	4.19
+24	4.18
+24	4.19
+24	4.18
+24	4.19
+32	4.43
+32	4.44
+32	4.40
+32	4.42
+32	4.40
+48	5.02
+48	5.05
+48	5.04
+48	5.04
+48	5.02
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_MEM.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_MEM.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_MEM.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,34 @@
+5
+48
+CFA CAF Akka uC++ ProtoActor 
+mem
+CFA:
+331200
+341856
+295160
+333928
+296056
+CAF:
+131952
+153228
+153912
+139912
+128816
+Akka:
+7714548
+7624968
+7528056
+7782020
+7985336
+uC++:
+114176
+115388
+117988
+119540
+116476
+ProtoActor:
+551872
+556100
+543556
+549812
+535472
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_SEND.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_SEND.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/nasus_SEND.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,67 @@
+5
+48
+CFA CAF Akka uC++ ProtoActor 
+static
+CFA
+23.22
+23.57
+23.55
+23.55
+23.49
+CAF:
+2779
+2774
+2788
+2788
+2775
+Akka:
+60
+59
+59
+59
+59
+uC++:
+40
+40
+42
+41
+40
+ProtoActor:
+68
+68
+68
+68
+68
+
+dynamic
+CFA
+46.42
+46.56
+46.38
+46.29
+46.28
+CAF:
+9649
+9501
+9477
+9409
+9844
+Akka:
+7511
+7515
+7436
+7483
+7432
+uC++:
+76
+71
+70
+76
+72
+ProtoActor:
+5883
+5557
+5547
+5547
+5518
+
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/pykeExecutorMem
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/pykeExecutorMem	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/pykeExecutorMem	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,1 @@
+298MB & 165MB & 8046MB & 185MB & 563MB
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/pykeSendDynamic
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/pykeSendDynamic	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/pykeSendDynamic	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,1 @@
+58ns & 8476ns & 5972ns & 81ns & 4179ns
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/pykeSendStatic
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/pykeSendStatic	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/pykeSendStatic	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,1 @@
+24ns & 1712ns & 74ns & 40ns & 90ns
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_ALL.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_ALL.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_ALL.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,638 @@
+5
+1 2 4 8 16 24 32 48
+CFA CAF Akka uC++ ProtoActor 
+executor
+CFA:
+proc	time (s)
+1	26.87
+1	26.97
+1	26.78
+1	26.70
+1	26.72
+2	27.32
+2	27.14
+2	27.16
+2	26.88
+2	27.06
+4	13.66
+4	13.48
+4	13.51
+4	13.60
+4	13.51
+8	6.81
+8	6.85
+8	6.74
+8	6.86
+8	6.87
+16	3.61
+16	3.58
+16	3.59
+16	3.60
+16	3.62
+24	2.87
+24	2.87
+24	2.88
+24	2.87
+24	2.88
+32	2.63
+32	3.01
+32	2.83
+32	2.98
+32	2.94
+48	2.37
+48	2.32
+48	2.34
+48	2.33
+48	2.35
+CAF:
+proc	time (s)
+1	3142.777739
+1	3170.651526
+1	3142.842332
+1	3144.531515
+1	3143.780607
+2	1714.812396
+2	1698.269868
+2	1695.410159
+2	1695.350579
+2	1692.105148
+4	888.347073
+4	880.257981
+4	881.693959
+4	879.501872
+4	882.36628
+8	450.493522
+8	449.352973
+8	448.763307
+8	448.729069
+8	448.904439
+16	257.115998
+16	257.766394
+16	256.849871
+16	257.714816
+16	256.407588
+24	189.029899
+24	188.842908
+24	189.201372
+24	188.734656
+24	189.957795
+32	184.086494
+32	183.555341
+32	184.589453
+32	183.665874
+32	183.541911
+48	169.582954
+48	170.551345
+48	170.85177
+48	169.815792
+48	169.302957
+Akka:
+proc	time (s)
+1	248.22
+1	246.31
+1	249.08
+1	249.24
+1	249.99
+2	259.55
+2	257.10
+2	256.00
+2	256.61
+2	255.45
+4	107.27
+4	110.90
+4	110.28
+4	109.47
+4	108.89
+8	49.27
+8	49.55
+8	49.22
+8	49.23
+8	49.09
+16	23.16
+16	23.30
+16	22.65
+16	22.74
+16	22.81
+24	15.75
+24	16.25
+24	15.79
+24	15.54
+24	15.87
+32	13.65
+32	13.60
+32	13.56
+32	13.51
+32	13.46
+48	11.03
+48	10.99
+48	10.84
+48	10.98
+48	11.22
+uC++:
+proc	time (s)
+1	96.366
+1	96.3779
+1	96.7611
+1	96.5155
+1	96.4676
+2	106.787
+2	107.509
+2	106.56
+2	107.264
+2	109.018
+4	56.4425
+4	53.5585
+4	59.4769
+4	51.2997
+4	55.2256
+8	26.0308
+8	26.3397
+8	25.7546
+8	25.8074
+8	25.8557
+16	12.5237
+16	12.5649
+16	12.4416
+16	12.3124
+16	12.3228
+24	9.30443
+24	9.30799
+24	9.30348
+24	9.37427
+24	9.38581
+32	6.76494
+32	6.71276
+32	7.31967
+32	6.85826
+32	7.03324
+48	4.77467
+48	4.8178
+48	4.98902
+48	4.80645
+48	4.88054
+ProtoActor:
+proc	time (s)
+1	216.96
+1	216.48
+1	216.64
+1	216.42
+1	216.53
+2	113.45
+2	113.39
+2	113.48
+2	113.54
+2	113.40
+4	59.02
+4	58.95
+4	58.85
+4	58.76
+4	58.85
+8	30.01
+8	29.71
+8	29.73
+8	30.04
+8	30.08
+16	17.17
+16	17.06
+16	17.10
+16	17.16
+16	17.11
+24	12.75
+24	12.66
+24	12.83
+24	12.75
+24	12.82
+32	12.18
+32	12.13
+32	12.11
+32	12.10
+32	12.29
+48	11.46
+48	11.45
+48	11.56
+48	11.59
+48	11.49
+
+matrix
+CFA:
+proc	time (s)
+1	126.89
+1	126.77
+1	126.86
+1	126.97
+1	126.96
+2	63.51
+2	63.35
+2	62.57
+2	63.07
+2	62.66
+4	32.16
+4	32.17
+4	32.10
+4	32.12
+4	32.18
+8	16.41
+8	16.35
+8	16.34
+8	16.35
+8	16.35
+16	9.45
+16	9.41
+16	9.40
+16	9.40
+16	9.39
+24	6.90
+24	6.93
+24	6.92
+24	6.94
+24	7.05
+32	7.65
+32	8.27
+32	7.78
+32	7.67
+32	7.81
+48	6.86
+48	6.96
+48	7.00
+48	6.96
+48	6.96
+CAF:
+proc	time (s)
+1	114.704474
+1	114.670153
+1	114.647433
+1	114.586326
+1	114.332563
+2	61.393862
+2	61.203013
+2	60.19285
+2	60.566939
+2	60.488951
+4	32.244165
+4	31.755164
+4	32.088159
+4	31.701132
+4	31.787321
+8	16.324219
+8	16.224406
+8	16.189296
+8	16.194191
+8	16.156967
+16	9.181944
+16	9.045059
+16	9.190167
+16	9.102487
+16	9.201636
+24	6.690779
+24	6.672903
+24	6.687423
+24	6.589259
+24	6.651444
+32	6.372545
+32	6.362398
+32	6.373146
+32	6.41904
+32	6.39801
+48	6.239714
+48	6.242576
+48	6.241463
+48	6.237801
+48	6.26433
+Akka:
+proc	time (s)
+1	237.30
+1	235.89
+1	219.45
+1	232.24
+1	237.11
+2	104.74
+2	107.10
+2	105.32
+2	105.45
+2	108.71
+4	54.35
+4	55.43
+4	55.11
+4	56.35
+4	56.44
+8	28.15
+8	29.23
+8	28.34
+8	28.62
+8	28.48
+16	15.69
+16	15.57
+16	15.67
+16	15.50
+16	15.63
+24	11.44
+24	11.45
+24	11.50
+24	12.13
+24	12.01
+32	12.18
+32	10.88
+32	10.82
+32	10.84
+32	10.90
+48	11.05
+48	11.20
+48	12.57
+48	10.95
+48	12.10
+uC++:
+proc	time (s)
+1	126.766
+1	126.821
+1	126.726
+1	126.635
+1	126.621
+2	62.7671
+2	63.7279
+2	62.6295
+2	63.7054
+2	62.7102
+4	32.1382
+4	32.0787
+4	32.0604
+4	32.082
+4	32.0876
+8	16.3709
+8	16.2892
+8	16.2753
+8	16.2843
+8	16.2778
+16	9.41087
+16	9.33781
+16	9.33882
+16	9.34435
+16	9.34378
+24	6.89047
+24	6.91773
+24	6.91107
+24	6.90262
+24	6.90607
+32	5.16071
+32	5.21467
+32	5.26
+32	5.21204
+32	5.20969
+48	3.75524
+48	3.73155
+48	3.70701
+48	3.72743
+48	3.6449
+ProtoActor:
+proc	time (s)
+1	182.58
+1	182.63
+1	182.32
+1	183.26
+1	183.81
+2	93.35
+2	97.07
+2	97.18
+2	96.13
+2	98.11
+4	47.82
+4	45.02
+4	48.26
+4	46.14
+4	48.03
+8	24.89
+8	22.98
+8	22.75
+8	22.83
+8	22.77
+16	13.10
+16	14.02
+16	13.15
+16	13.10
+16	13.11
+24	10.05
+24	9.31
+24	9.47
+24	9.83
+24	9.92
+32	9.78
+32	9.33
+32	9.48
+32	10.00
+32	9.67
+48	8.55
+48	8.49
+48	8.59
+48	8.50
+48	8.86
+
+repeat
+CFA:
+proc	time (s)
+1	1.24
+1	1.13
+1	1.13
+1	1.14
+1	1.15
+2	3.14
+2	3.11
+2	3.03
+2	3.03
+2	3.09
+4	6.93
+4	7.06
+4	7.14
+4	6.56
+4	7.18
+8	10.23
+8	10.33
+8	10.38
+8	10.47
+8	10.19
+16	16.60
+16	16.31
+16	16.48
+16	16.92
+16	16.42
+24	22.62
+24	22.98
+24	23.07
+24	22.80
+24	22.32
+32	22.72
+32	22.12
+32	22.79
+32	22.11
+32	22.28
+48	22.17
+48	22.43
+48	22.98
+48	21.94
+48	22.15
+CAF:
+proc	time (s)
+1	9.364139
+1	9.273709
+1	9.22431
+1	9.24584
+1	9.328128
+2	569.956907
+2	569.451729
+2	570.513944
+2	577.755055
+2	577.682629
+4	98.134481
+4	47.377657
+4	56.948782
+4	58.938465
+4	46.216939
+8	292.643328
+8	302.345288
+8	299.245564
+8	301.314574
+8	296.974018
+16	467.056597
+16	462.72845
+16	459.142255
+16	462.567562
+16	462.337563
+24	590.114006
+24	589.39621
+24	595.802691
+24	594.206848
+24	594.328815
+32	812.134916
+32	801.457284
+32	807.588629
+32	810.89753
+32	814.070956
+48	994.116368
+48	975.825412
+48	1027.500399
+48	1004.919919
+48	964.979626
+Akka:
+proc	time (s)
+1	38.57
+1	37.38
+1	34.39
+1	39.44
+1	36.97
+2	37.79
+2	37.83
+2	36.56
+2	36.08
+2	37.96
+4	31.61
+4	33.00
+4	31.43
+4	35.17
+4	32.51
+8	78.26
+8	77.66
+8	78.59
+8	86.86
+8	78.79
+16	102.70
+16	102.89
+16	103.85
+16	101.55
+16	102.63
+24	95.61
+24	96.47
+24	96.89
+24	95.50
+24	95.08
+32	92.37
+32	91.74
+32	92.61
+32	89.65
+32	92.15
+48	81.96
+48	80.83
+48	80.21
+48	81.53
+48	80.88
+uC++:
+proc	time (s)
+1	4.50639
+1	4.43017
+1	4.42969
+1	4.42516
+1	4.42604
+2	8.54471
+2	9.62032
+2	8.59705
+2	9.38587
+2	9.02661
+4	10.193
+4	10.0379
+4	9.9771
+4	9.9791
+4	9.78882
+8	10.6699
+8	10.873
+8	10.6176
+8	10.7994
+8	10.5826
+16	13.5015
+16	13.6181
+16	12.9551
+16	12.9734
+16	13.6288
+24	19.7768
+24	18.8735
+24	19.5691
+24	19.2636
+24	19.091
+32	13.4407
+32	14.0405
+32	14.5069
+32	13.8531
+32	16.64
+48	14.6955
+48	15.623
+48	15.1187
+48	16.5377
+48	15.116
+ProtoActor:
+proc	time (s)
+1	65.28
+1	65.38
+1	65.21
+1	65.40
+1	65.00
+2	37.79
+2	37.81
+2	37.67
+2	37.36
+2	37.73
+4	23.11
+4	22.91
+4	22.97
+4	23.18
+4	22.84
+8	23.92
+8	22.16
+8	22.58
+8	23.46
+8	24.82
+16	32.65
+16	35.20
+16	33.30
+16	31.05
+16	32.61
+24	37.06
+24	37.44
+24	35.40
+24	34.92
+24	35.25
+32	35.62
+32	37.55
+32	37.18
+32	37.89
+32	36.58
+48	34.82
+48	37.20
+48	35.95
+48	39.85
+48	38.41
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_CFA.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_CFA.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_CFA.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,642 @@
+5
+1 2 4 8 16 24 32 48
+Longest-Victim No-Stealing Random 
+executor
+Longest-Victim:
+proc	time (s)
+1	26.88
+1	26.80
+1	26.84
+1	26.76
+1	26.83
+2	27.25
+2	27.01
+2	27.18
+2	27.37
+2	27.14
+4	13.55
+4	13.51
+4	13.65
+4	13.48
+4	13.45
+8	6.79
+8	6.78
+8	6.84
+8	6.81
+8	6.82
+16	3.60
+16	3.59
+16	3.64
+16	3.61
+16	3.61
+24	2.87
+24	2.85
+24	2.84
+24	2.86
+24	2.86
+32	2.91
+32	2.87
+32	2.70
+32	2.91
+32	2.85
+48	2.33
+48	2.33
+48	2.34
+48	2.35
+48	2.34
+No-Stealing:
+proc	time (s)
+1	27.40
+1	27.40
+1	27.38
+1	27.36
+1	27.34
+2	27.28
+2	26.99
+2	26.91
+2	27.05
+2	27.12
+4	13.61
+4	13.52
+4	13.56
+4	13.62
+4	13.90
+8	6.87
+8	6.83
+8	6.81
+8	6.83
+8	6.86
+16	3.60
+16	3.56
+16	3.60
+16	3.61
+16	3.60
+24	2.93
+24	2.90
+24	2.92
+24	2.93
+24	2.93
+32	3.27
+32	3.27
+32	3.20
+32	3.38
+32	3.25
+48	2.44
+48	2.45
+48	2.44
+48	2.44
+48	2.46
+Random:
+proc	time (s)
+1	27.57
+1	27.35
+1	27.42
+1	27.41
+1	27.41
+2	26.77
+2	27.17
+2	26.91
+2	27.24
+2	27.09
+4	13.60
+4	13.77
+4	13.68
+4	13.62
+4	13.77
+8	7.03
+8	6.87
+8	6.82
+8	6.89
+8	6.93
+16	3.62
+16	3.70
+16	3.68
+16	3.62
+16	3.73
+24	3.10
+24	3.14
+24	3.06
+24	3.08
+24	3.13
+32	3.38
+32	3.39
+32	3.40
+32	3.42
+32	3.44
+48	2.46
+48	2.48
+48	2.47
+48	2.46
+48	2.42
+
+matrix
+Longest-Victim:
+proc	time (s)
+1	127.72
+1	127.32
+1	127.49
+1	127.50
+1	127.40
+2	65.79
+2	63.67
+2	65.36
+2	65.40
+2	63.65
+4	32.23
+4	32.21
+4	32.18
+4	32.20
+4	32.15
+8	16.45
+8	16.33
+8	16.33
+8	16.37
+8	16.34
+16	9.42
+16	9.42
+16	9.40
+16	9.43
+16	9.42
+24	7.00
+24	6.92
+24	6.93
+24	6.92
+24	7.01
+32	7.71
+32	7.68
+32	7.91
+32	7.78
+32	8.06
+48	6.98
+48	6.98
+48	7.00
+48	6.90
+48	7.00
+No-Stealing:
+proc	time (s)
+1	127.12
+1	127.15
+1	127.45
+1	127.27
+1	127.20
+2	63.86
+2	64.12
+2	63.86
+2	63.52
+2	63.86
+4	32.22
+4	32.18
+4	32.17
+4	32.18
+4	32.20
+8	16.38
+8	16.32
+8	16.33
+8	16.33
+8	16.34
+16	9.42
+16	9.38
+16	9.38
+16	9.42
+16	9.40
+24	6.96
+24	7.07
+24	7.04
+24	6.94
+24	7.07
+32	9.67
+32	9.53
+32	9.68
+32	8.87
+32	9.83
+48	6.85
+48	6.91
+48	6.96
+48	6.99
+48	6.92
+Random:
+proc	time (s)
+1	127.24
+1	127.15
+1	127.20
+1	127.34
+1	127.16
+2	63.74
+2	63.40
+2	63.42
+2	63.56
+2	63.41
+4	32.22
+4	32.15
+4	32.17
+4	32.15
+4	32.24
+8	16.41
+8	16.35
+8	16.37
+8	16.35
+8	16.34
+16	9.40
+16	9.41
+16	9.37
+16	9.39
+16	9.40
+24	6.94
+24	6.96
+24	6.94
+24	6.95
+24	7.03
+32	7.04
+32	7.09
+32	7.04
+32	6.93
+32	6.99
+48	6.93
+48	6.84
+48	6.90
+48	6.90
+48	6.88
+
+repeat
+Longest-Victim:
+proc	time (s)
+1	1.13
+1	1.14
+1	1.13
+1	1.15
+1	1.14
+2	3.15
+2	3.01
+2	3.20
+2	3.05
+2	3.20
+4	7.17
+4	6.93
+4	7.17
+4	6.90
+4	7.06
+8	10.13
+8	10.16
+8	10.43
+8	10.23
+8	10.28
+16	16.55
+16	17.05
+16	16.70
+16	16.44
+16	16.73
+24	22.90
+24	22.41
+24	22.57
+24	22.35
+24	22.56
+32	22.09
+32	23.00
+32	22.63
+32	22.98
+32	22.79
+48	22.38
+48	22.67
+48	22.67
+48	21.24
+48	21.30
+No-Stealing:
+proc	time (s)
+1	1.11
+1	1.10
+1	1.10
+1	1.08
+1	1.10
+2	2.22
+2	2.14
+2	2.85
+2	2.10
+2	3.22
+4	7.65
+4	6.87
+4	10.85
+4	7.54
+4	10.51
+8	15.62
+8	14.13
+8	8.44
+8	8.53
+8	13.37
+16	23.37
+16	24.04
+16	23.96
+16	12.30
+16	22.93
+24	29.81
+24	29.83
+24	30.09
+24	14.62
+24	29.05
+32	23.53
+32	27.43
+32	28.25
+32	25.34
+32	28.45
+48	15.54
+48	30.73
+48	30.20
+48	30.75
+48	30.34
+Random:
+proc	time (s)
+1	1.09
+1	1.09
+1	1.11
+1	1.10
+1	1.09
+2	3.10
+2	3.13
+2	3.13
+2	3.15
+2	3.21
+4	6.72
+4	6.66
+4	6.88
+4	6.75
+4	6.60
+8	10.42
+8	10.41
+8	10.23
+8	10.26
+8	10.32
+16	17.10
+16	16.88
+16	17.19
+16	17.07
+16	16.83
+24	24.22
+24	23.14
+24	23.81
+24	23.58
+24	23.33
+32	23.88
+32	23.60
+32	23.88
+32	23.41
+32	22.89
+48	22.90
+48	23.94
+48	22.71
+48	24.10
+48	23.63
+
+balance_one
+Longest-Victim:
+proc	time (s)
+1	19.12
+1	19.18
+1	19.14
+1	19.14
+1	19.17
+2	10.24
+2	10.18
+2	10.17
+2	10.19
+2	10.25
+4	5.81
+4	5.62
+4	5.63
+4	5.59
+4	5.63
+8	3.08
+8	3.20
+8	3.38
+8	3.23
+8	3.05
+16	2.05
+16	2.19
+16	2.05
+16	2.06
+16	2.22
+24	2.05
+24	1.71
+24	1.78
+24	1.85
+24	1.70
+32	2.15
+32	2.12
+32	2.06
+32	1.93
+32	2.07
+48	1.93
+48	2.04
+48	1.96
+48	2.08
+48	2.02
+No-Stealing:
+proc	time (s)
+1	19.02
+1	19.02
+1	18.99
+1	19.01
+1	19.03
+2	19.43
+2	19.34
+2	19.40
+2	19.44
+2	19.32
+4	19.92
+4	19.97
+4	19.99
+4	19.91
+4	19.92
+8	19.99
+8	19.95
+8	20.05
+8	20.01
+8	20.00
+16	22.71
+16	22.76
+16	22.75
+16	22.75
+16	22.76
+24	25.09
+24	25.05
+24	25.06
+24	25.06
+24	25.08
+32	40.82
+32	33.41
+32	27.51
+32	25.31
+32	36.45
+48	47.10
+48	47.16
+48	47.10
+48	47.14
+48	47.15
+Random:
+proc	time (s)
+1	19.35
+1	19.33
+1	19.35
+1	19.33
+1	19.34
+2	10.31
+2	10.29
+2	10.27
+2	10.25
+2	10.27
+4	5.82
+4	5.74
+4	5.78
+4	5.68
+4	5.64
+8	3.37
+8	3.22
+8	3.18
+8	3.29
+8	3.06
+16	2.09
+16	2.30
+16	2.05
+16	2.16
+16	1.98
+24	1.68
+24	1.65
+24	1.70
+24	1.63
+24	1.81
+32	1.95
+32	1.99
+32	2.08
+32	2.14
+32	1.97
+48	2.13
+48	2.02
+48	1.95
+48	1.83
+48	1.84
+
+balance_multi
+Longest-Victim:
+proc	time (s)
+1	7.80
+1	7.70
+1	7.72
+1	7.71
+1	7.72
+2	4.16
+2	4.10
+2	4.10
+2	4.10
+2	4.11
+4	4.47
+4	4.39
+4	4.44
+4	4.42
+4	4.43
+8	4.68
+8	4.71
+8	4.70
+8	4.67
+8	4.73
+16	5.82
+16	5.79
+16	5.80
+16	5.81
+16	5.68
+24	6.67
+24	6.62
+24	6.67
+24	6.72
+24	6.83
+32	9.48
+32	9.46
+32	9.57
+32	9.69
+32	9.56
+48	13.89
+48	13.70
+48	13.55
+48	13.76
+48	13.75
+No-Stealing:
+proc	time (s)
+1	7.75
+1	7.70
+1	7.69
+1	7.68
+1	7.67
+2	7.77
+2	7.77
+2	7.77
+2	7.75
+2	7.80
+4	8.24
+4	8.24
+4	8.24
+4	8.21
+4	8.22
+8	8.40
+8	8.36
+8	8.37
+8	8.37
+8	8.35
+16	9.72
+16	9.63
+16	9.64
+16	9.62
+16	9.64
+24	10.70
+24	10.70
+24	10.72
+24	10.69
+24	10.76
+32	19.39
+32	19.45
+32	19.13
+32	19.16
+32	19.03
+48	20.51
+48	20.74
+48	20.75
+48	20.73
+48	20.94
+Random:
+proc	time (s)
+1	7.79
+1	7.80
+1	7.80
+1	7.80
+1	7.80
+2	4.15
+2	4.12
+2	4.12
+2	4.13
+2	4.12
+4	4.36
+4	4.34
+4	4.35
+4	4.35
+4	4.35
+8	4.44
+8	4.48
+8	4.44
+8	4.47
+8	4.44
+16	5.13
+16	5.13
+16	5.14
+16	5.13
+16	5.13
+24	5.71
+24	5.72
+24	5.72
+24	5.98
+24	6.02
+32	7.87
+32	7.88
+32	7.89
+32	7.89
+32	7.85
+48	11.00
+48	11.01
+48	11.04
+48	10.99
+48	10.99
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_MEM.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_MEM.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_MEM.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,35 @@
+5
+48
+CFA CAF Akka uC++ ProtoActor 
+mem
+CFA:
+302612
+292592
+302660
+296916
+298092
+CAF:
+165552
+179132
+165024
+159172
+152472
+Akka:
+8732320
+6941472
+7780188
+8046684
+9721544
+uC++:
+183752
+175000
+190836
+185552
+187620
+ProtoActor:
+562852
+568544
+559540
+563512
+584304
+
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_SEND.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_SEND.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/data/pyke_SEND.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,67 @@
+5
+48
+CFA CAF Akka uC++ ProtoActor 
+static
+CFA
+25.56
+24.91
+24.96
+24.90
+24.91
+CAF:
+1712
+1734
+1757
+1698
+1694
+Akka:
+77
+74
+73
+73
+74
+uC++:
+40
+40
+40
+40
+40
+ProtoActor:
+91
+90
+91
+90
+90
+
+dynamic
+CFA
+63.14
+58.90
+58.87
+58.80
+58.82
+CAF:
+8450
+8476
+8617
+8488
+8421
+Akka:
+5972
+6001
+5991
+5970
+5933
+uC++:
+84
+81
+81
+81
+81
+ProtoActor:
+4200
+4168
+4207
+4162
+4179
+
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/genPlots
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/genPlots	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/genPlots	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,9 @@
+#!/bin/bash -
+python3 plotData.py data/nasus_ALL.txt nasus
+python3 plotData.py data/pyke_ALL.txt pyke
+python3 plotData.py data/nasus_CFA.txt nasusCFA
+python3 plotData.py data/pyke_CFA.txt pykeCFA
+python3 plotData.py data/nasus_SEND.txt nasus
+python3 plotData.py data/pyke_SEND.txt pyke
+python3 plotData.py data/nasus_MEM.txt nasus
+python3 plotData.py data/pyke_MEM.txt pyke
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/plotData.py
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/plotData.py	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/plotData.py	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,185 @@
+import os
+import sys
+import time
+import itertools
+import matplotlib.pyplot as plt
+import matplotlib.ticker as ticks
+import math
+from scipy import stats as st
+import numpy as np
+from enum import Enum
+from statistics import median
+
+import matplotlib
+matplotlib.use("pgf")
+matplotlib.rcParams.update({
+    "pgf.texsystem": "pdflatex",
+    'font.family': 'serif',
+    'text.usetex': True,
+    'pgf.rcfonts': False,
+    'font.size': 16
+})
+marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' )) 
+
+readfile = open(sys.argv[1], "r")
+
+machineName = ""
+
+if len(sys.argv) > 2:
+    machineName = sys.argv[2]
+
+# first line has num times per experiment
+line = readfile.readline()
+numTimes = int(line)
+
+# second line has processor args
+line = readfile.readline()
+procs = []
+for val in line.split():
+    procs.append(int(val))
+
+# 3rd line has number of variants
+line = readfile.readline()
+names = line.split()
+numVariants = len(names)
+
+lines = (line.rstrip() for line in readfile) # All lines including the blank ones
+lines = (line for line in lines if line) # Non-blank lines
+
+class Bench(Enum):
+    Unset = 0
+    Executor = 1
+    Matrix = 2
+    Repeat = 3
+    Balance_One = 4
+    Balance_Multi = 5
+    Static = 7
+    Dynamic = 8
+    Mem = 9
+
+nameSet = False
+currBench = Bench.Unset # default val
+count = 0
+procCount = 0
+currVariant = 0
+name = ""
+var_name = ""
+sendData = [0.0 for j in range(numVariants)]
+data = [[0.0 for i in range(len(procs))] for j in range(numVariants)]
+bars = [[[0.0 for i in range(len(procs))],[0.0 for k in range(len(procs))]] for j in range(numVariants)]
+tempData = [0.0 for i in range(numTimes)]
+for idx, line in enumerate(lines):
+    # print(line)
+    
+    if currBench == Bench.Unset:
+        if line == "executor":
+            name = "Executor"
+            currBench = Bench.Executor
+        elif line == "matrix":
+            name = "Matrix"
+            currBench = Bench.Matrix
+        elif line == "repeat":
+            name = "Repeat"
+            currBench = Bench.Repeat
+        elif line == "balance_one":
+            name = "Balance-One"
+            currBench = Bench.Balance_One
+        elif line == "balance_multi":
+            name = "Balance-Multi"
+            currBench = Bench.Balance_Multi
+        elif line == "static":
+            name = "Static"
+            currBench = Bench.Static
+        elif line == "dynamic":
+            name = "Dynamic"
+            currBench = Bench.Dynamic
+        elif line == "mem":
+            name = "ExecutorMemory"
+            currBench = Bench.Mem
+        else:
+            print("Expected benchmark name")
+            sys.exit()
+        continue
+
+    if line[0:4] == "proc":
+        continue
+
+    if currBench == Bench.Static or currBench == Bench.Dynamic or currBench == Bench.Mem:
+        if not nameSet:
+            nameSet = True
+            continue
+        lineArr = line.split()
+        tempData[count] = float(lineArr[-1])
+        count += 1
+        if count == numTimes:
+            currMedian = median( tempData )
+            sendData[currVariant] = currMedian
+            count = 0
+            nameSet = False
+            currVariant += 1
+
+            if currVariant == numVariants:
+                fileName = "data/" + machineName
+                if currBench == Bench.Static:
+                    fileName += "SendStatic"
+                elif currBench == Bench.Dynamic:
+                    fileName += "SendDynamic"
+                else:
+                    fileName += "ExecutorMem"
+                f = open(fileName, 'w')
+                if currBench == Bench.Mem:
+                    f.write(" & ".join(map(lambda a: str(int(a/1000)) + 'MB', sendData)))
+                else:
+                    f.write(" & ".join(map(lambda a: str(int(a)) + 'ns', sendData)))
+
+                # reset
+                currBench = Bench.Unset
+                currVariant = 0
+                
+    else:
+        if not nameSet:
+            nameSet = True
+            continue
+        
+        lineArr = line.split()
+        tempData[count] = float(lineArr[-1])
+        count += 1
+        if count == numTimes:
+            currMedian = median( tempData )
+            data[currVariant][procCount] = currMedian
+            lower, upper = st.t.interval(0.95, numTimes - 1, loc=np.mean(tempData), scale=st.sem(tempData))
+            bars[currVariant][0][procCount] = currMedian - lower
+            bars[currVariant][1][procCount] = upper - currMedian
+            count = 0
+            procCount += 1
+
+            if procCount == len(procs):
+                procCount = 0
+                nameSet = False
+                currVariant += 1
+
+                if currVariant == numVariants:
+                    fig, ax = plt.subplots(layout='constrained')
+                    plt.title(name + " Benchmark")
+                    plt.ylabel("Runtime (seconds)")
+                    plt.xlabel("Cores")
+                    for idx, arr in enumerate(data):
+                        plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker=next(marker) )
+                    marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' )) 
+                    if currBench == Bench.Executor or currBench == Bench.Matrix or currBench == Bench.Balance_One:
+                        plt.yscale("log")
+                        plt.ylim(1, None)
+                        ax.get_yaxis().set_major_formatter(ticks.ScalarFormatter())
+                    elif currBench == Bench.Repeat:
+                        plt.ylim(1, 100)
+                    else:
+                        plt.ylim(0, None)
+                    plt.xticks(procs)
+                    ax.legend(names)
+                    # fig.savefig("plots/" + machineName + name + ".png")
+                    plt.savefig("plots/" + machineName + name + ".pgf")
+                    fig.clf()
+
+                    # reset
+                    currBench = Bench.Unset
+                    currVariant = 0
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Executor/GoExecutor.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Executor/GoExecutor.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Executor/GoExecutor.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,116 @@
+// https://github.com/asynkron/protoactor-go
+// https://pkg.go.dev/github.com/asynkron/protoactor-go/actor
+package main
+
+import (
+	"os"; "strconv"; "fmt"; "time"; "runtime"; "sync/atomic"
+	"github.com/asynkron/protoactor-go/actor"
+)
+
+var Actors, Set, Rounds, Processors int = 40_000, 100, 100, 1 // default values
+var Batch int = 1
+var starttime time.Time;
+var shake = make( chan string )
+var actorCnt int64 = 0
+
+type Msg struct {}
+var msg Msg
+type Executor struct {
+	actors [] * actor.PID;
+	id, rounds, group, recs, sends int;
+}
+var system * actor.ActorSystem
+
+func ( state * Executor ) Receive( context actor.Context ) {
+	switch context.Message().(type) {
+	  case * Msg:
+		if state.recs == state.rounds {
+			if ( atomic.AddInt64( &actorCnt, 1 ) == int64(Actors) ) {
+				fmt.Printf( "%.2f\n", time.Since( starttime ).Seconds() );
+				shake <- "hand"
+			} // if
+			return;
+		} // if
+		if state.recs % Batch == 0 {
+			for i := 0; i < Batch; i += 1 {
+				system.Root.Send( state.actors[state.group + state.sends % Set], &msg ); // cycle through group
+				state.sends += 1;
+			}
+		}
+	  	state.recs += 1;
+		//fmt.Printf( "%v %v %v %v %v\n", state.id, state.group, state.recs, state.sends, state.group + state.sends % Set );
+	  default:
+		// ignore actor.Started message
+	}
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ actors (> 0 && > set && actors % set == 0 ) | 'd' (default %v ) ] " +
+		"[ set (> 0) | 'd' (default %v) ] " +
+		"[ rounds (> 0) | 'd' (default %v) ] " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ batch (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Actors, Set, Rounds, Processors );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+	  case 6:
+		if os.Args[5] != "d" {							// default ?
+			Batch, _ = strconv.Atoi( os.Args[5] )
+			if Batch < 1 { usage(); }
+		} // if
+		fallthrough
+	  case 5:
+		if os.Args[4] != "d" {							// default ?
+			Processors, _ = strconv.Atoi( os.Args[4] )
+			if Processors < 1 { usage(); }
+		} // if
+		fallthrough
+	  case 4:
+		if os.Args[3] != "d" {							// default ?
+			Rounds, _ = strconv.Atoi( os.Args[3] )
+			if Rounds < 1 { usage(); }
+		} // if
+		fallthrough
+	  case 3:
+		if os.Args[2] != "d" {							// default ?
+			Set, _ = strconv.Atoi( os.Args[2] )
+			if Set < 1 { usage(); }
+		} // if
+		fallthrough
+	  case 2:
+		if os.Args[1] != "d" {							// default ?
+			Actors, _ = strconv.Atoi( os.Args[1] )
+			if Actors < 1 || Actors <= Set || Actors % Set != 0 { usage(); }
+		} // if
+	  case 1:											// use defaults
+	  default:
+		usage();
+	} // switch
+
+	runtime.GOMAXPROCS( Processors );
+	system = actor.NewActorSystem();
+
+	actors := make( [] *actor.PID, Actors, Actors );	// create actors
+	for id := 0; id < Actors; id += 1 {
+		props := actor.PropsFromProducer( func() actor.Actor {
+			return &Executor{ actors, id, Set * Rounds, id / Set * Set, 0, 0 }
+		} );
+		actors[id] = system.Root.Spawn( props );
+	} // for
+	starttime = time.Now();
+	for id := 0; id < Actors; id += 1 {					// start actors
+		system.Root.Send( actors[id], &msg );
+	} // for
+	<- shake
+} // main
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" GoExecutor
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "go build" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Executor/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Executor/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Executor/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,32 @@
+module GoExecutor
+
+go 1.18
+
+require (
+	github.com/Workiva/go-datastructures v1.0.53 // indirect
+	github.com/asynkron/protoactor-go v0.0.0-20220528090104-f567b547ea07 // indirect
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/cespare/xxhash/v2 v2.1.2 // indirect
+	github.com/emirpasic/gods v1.18.1 // indirect
+	github.com/go-logr/logr v1.2.3 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/google/uuid v1.3.0 // indirect
+	github.com/lithammer/shortuuid/v4 v4.0.0 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+	github.com/orcaman/concurrent-map v1.0.0 // indirect
+	github.com/prometheus/client_golang v1.12.2 // indirect
+	github.com/prometheus/client_model v0.2.0 // indirect
+	github.com/prometheus/common v0.34.0 // indirect
+	github.com/prometheus/procfs v0.7.3 // indirect
+	github.com/spaolacci/murmur3 v1.1.0 // indirect
+	go.opentelemetry.io/otel v1.7.0 // indirect
+	go.opentelemetry.io/otel/exporters/prometheus v0.30.0 // indirect
+	go.opentelemetry.io/otel/metric v0.30.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.7.0 // indirect
+	go.opentelemetry.io/otel/sdk/export/metric v0.28.0 // indirect
+	go.opentelemetry.io/otel/sdk/metric v0.30.0 // indirect
+	go.opentelemetry.io/otel/trace v1.7.0 // indirect
+	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
+	google.golang.org/protobuf v1.28.0 // indirect
+)
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Executor/go.sum
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Executor/go.sum	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Executor/go.sum	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,527 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig=
+github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/asynkron/protoactor-go v0.0.0-20220528090104-f567b547ea07 h1:ahDmMVSgTM8gSxmp0P5SCwESFgGNxB2sr3u6Y7j6ecM=
+github.com/asynkron/protoactor-go v0.0.0-20220528090104-f567b547ea07/go.mod h1:OnIxGbrnX2NFZaOolL4Z3mlSC3ERyqWnz9mepxvdCj0=
+github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
+github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
+github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lithammer/shortuuid/v4 v4.0.0 h1:QRbbVkfgNippHOS8PXDkti4NaWeyYfcBTHtw7k08o4c=
+github.com/lithammer/shortuuid/v4 v4.0.0/go.mod h1:Zs8puNcrvf2rV9rTH51ZLLcj7ZXqQI3lv67aw4KiB1Y=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY=
+github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI=
+github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
+github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
+github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE=
+github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
+github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
+github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg=
+github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ=
+go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
+go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
+go.opentelemetry.io/otel/exporters/prometheus v0.30.0 h1:YXo5ZY5nofaEYMCMTTMaRH2cLDZB8+0UGuk5RwMfIo0=
+go.opentelemetry.io/otel/exporters/prometheus v0.30.0/go.mod h1:qN5feW+0/d661KDtJuATEmHtw5bKBK7NSvNEP927zSs=
+go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw=
+go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c=
+go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU=
+go.opentelemetry.io/otel/sdk v1.6.0/go.mod h1:PjLRUfDsoPy0zl7yrDGSUqjj43tL7rEtFdCEiGlxXRM=
+go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0=
+go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
+go.opentelemetry.io/otel/sdk/export/metric v0.28.0 h1:Ob5e5X1BsFPs8kfEuonHjGUu0Gt8rO/rH4KqyvIS2ns=
+go.opentelemetry.io/otel/sdk/export/metric v0.28.0/go.mod h1:2HTuv+l3ia7NquArnWavCoKhXi9yBJPpKqMHr1trKa0=
+go.opentelemetry.io/otel/sdk/metric v0.28.0/go.mod h1:DqJmT0ovBgoW6TJ8CAQyTnwxZPIp3KWtCiDDZ1uHAzU=
+go.opentelemetry.io/otel/sdk/metric v0.30.0 h1:XTqQ4y3erR2Oj8xSAOL5ovO5011ch2ELg51z4fVkpME=
+go.opentelemetry.io/otel/sdk/metric v0.30.0/go.mod h1:8AKFRi5HyvTR0RRty3paN1aMC9HMT+NzcEhw/BLkLX8=
+go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE=
+go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o=
+go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/INSTALL
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/INSTALL	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/INSTALL	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,10 @@
+$ go get github.com/AsynkronIT/goconsole
+go: downloading github.com/AsynkronIT/goconsole v0.0.0-20160504192649-bfa12eebf716
+$ go get github.com/AsynkronIT/protoactor-go/mailbox
+go: downloading github.com/AsynkronIT/protoactor-go v0.0.0-20210520041424-43065ace108f
+go: downloading github.com/Workiva/go-datastructures v1.0.53
+$ go get github.com/AsynkronIT/protoactor-go/actor
+go: downloading github.com/orcaman/concurrent-map v0.0.0-20190107190726-7ed82d9cb717
+go: downloading github.com/gogo/protobuf v1.3.2
+go: downloading github.com/emirpasic/gods v1.12.0
+$ go build
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Matrix/GoMatrix.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Matrix/GoMatrix.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Matrix/GoMatrix.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,144 @@
+// https://github.com/AsynkronIT/protoactor-go
+// https://pkg.go.dev/github.com/AsynkronIT/protoactor-go/actor
+package main
+
+import (
+	"os"; "strconv"; "fmt"; "time"; "runtime"; "sync/atomic"
+	"github.com/asynkron/protoactor-go/actor"
+)
+
+var xr, xc, yc uint64 = 3_072, 3_072, 3_072 // default values
+
+var Processors int = 1
+
+var starttime time.Time;
+var shake = make( chan string )
+var actorCnt uint64 = 0
+
+type Msg struct {
+	Z []int
+	X []int
+	Y [][]int
+}
+
+func NewMsg( Z_ []int, X_ []int, Y_ [][]int ) *Msg {
+	return &Msg{ Z: Z_, X: X_, Y: Y_ }
+}
+
+var msg Msg
+type MatrixMult struct {
+	actors [] * actor.PID;
+	id, rounds, group, recs, sends int;
+}
+var system * actor.ActorSystem
+
+func ( state * MatrixMult ) Receive( context actor.Context ) {
+	switch msg := context.Message().(type) {
+	  case * Msg:
+		for i := uint64(0); i < yc; i += 1 {
+			msg.Z[i] = 0
+			for j := uint64(0); j < xc; j += 1 {
+				msg.Z[i] = msg.X[j] * msg.Y[j][i]
+			}
+		}
+
+		if ( atomic.AddUint64( &actorCnt, 1 ) == xr ) {
+			shake <- "hand"
+		} // if
+	  default:
+		// ignore actor.Started message
+	}
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ yc (> 0) | 'd' (default %v) ] " +
+		"[ xc (> 0) | 'd' (default %v) ] " +
+		"[ xr (> 0) | 'd' (default %v) ]\n",
+		"[ processors (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], yc, xc, xr, Processors );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+	  case 5:
+		if os.Args[4] != "d" {							// default ?
+			Processors, _ = strconv.Atoi( os.Args[4] )
+			if Processors < 1 { usage(); }
+		} // if
+		fallthrough
+	  case 4:
+		if os.Args[3] != "d" {							// default ?
+			xr, _ = strconv.ParseUint( os.Args[3], 10, 64 )
+			if xr < 1 { usage(); }
+		} // if
+		fallthrough
+	  case 3:
+		if os.Args[2] != "d" {							// default ?
+			xc, _ = strconv.ParseUint( os.Args[2], 10, 64 )
+			if xc < 1 { usage(); }
+		} // if
+		fallthrough
+	  case 2:
+		if os.Args[1] != "d" {							// default ?
+			yc, _ = strconv.ParseUint( os.Args[1], 10, 64 )
+			if yc < 1 { usage(); }
+		} // if
+	  case 1:											// use defaults
+	  default:
+		usage();
+	} // switch
+
+	runtime.GOMAXPROCS( Processors );
+	system = actor.NewActorSystem();
+	
+
+	// set up matrices
+	X := make( [][]int, xr )
+	Y := make( [][]int, xc )
+	Z := make( [][]int, xr )
+	
+	for r := uint64(0); r < xr; r += 1 { // set up X subarrays
+		X[r] = make( []int, xc )
+		for c := uint64(0); c < xc; c += 1 { // set up X values
+			X[r][c] = int(r * c % 37)
+		}
+	}
+
+	for r := uint64(0); r < xc; r += 1 { // set up Y subarrays
+		Y[r] = make( []int, yc )
+		for c := uint64(0); c < yc; c += 1 { // set up Y values
+			Y[r][c] = int(r * c % 37)
+		}
+	}
+
+	for r := uint64(0); r < xr; r += 1 { // set up Z subarrays
+		Z[r] = make( []int, yc )
+	}
+
+	system = actor.NewActorSystem();
+
+	starttime = time.Now();
+	actors := make( [] * actor.PID, xr );
+	messages := make( []*Msg, xr );
+	for r := uint64(0); r < xr; r += 1 { // create messages and actors
+		messages[r] = NewMsg(Z[r], X[r], Y);
+		props := actor.PropsFromProducer( func() actor.Actor { return &MatrixMult{} })
+		actors[r] = system.Root.Spawn(props)
+	} // for
+	for r := uint64(0); r < xr; r += 1 { // send messages to actors
+		system.Root.Send( actors[r], messages[r] );
+	} // for
+
+	<- shake // wait for actors to finish
+
+	fmt.Printf( "%.2f\n", time.Since( starttime ).Seconds() );
+} // main
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" GoMatrix
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "go build" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Matrix/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Matrix/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Matrix/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,33 @@
+module GoMatrix
+
+go 1.18
+
+require github.com/asynkron/protoactor-go v0.0.0-20221002142108-880b460fcd1f
+
+require (
+	github.com/Workiva/go-datastructures v1.0.53 // indirect
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/cespare/xxhash/v2 v2.1.2 // indirect
+	github.com/emirpasic/gods v1.18.1 // indirect
+	github.com/go-logr/logr v1.2.3 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/google/uuid v1.3.0 // indirect
+	github.com/lithammer/shortuuid/v4 v4.0.0 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+	github.com/orcaman/concurrent-map v1.0.0 // indirect
+	github.com/prometheus/client_golang v1.12.2 // indirect
+	github.com/prometheus/client_model v0.2.0 // indirect
+	github.com/prometheus/common v0.34.0 // indirect
+	github.com/prometheus/procfs v0.7.3 // indirect
+	github.com/spaolacci/murmur3 v1.1.0 // indirect
+	go.opentelemetry.io/otel v1.7.0 // indirect
+	go.opentelemetry.io/otel/exporters/prometheus v0.30.0 // indirect
+	go.opentelemetry.io/otel/metric v0.30.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.7.0 // indirect
+	go.opentelemetry.io/otel/sdk/export/metric v0.28.0 // indirect
+	go.opentelemetry.io/otel/sdk/metric v0.30.0 // indirect
+	go.opentelemetry.io/otel/trace v1.7.0 // indirect
+	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
+	google.golang.org/protobuf v1.28.0 // indirect
+)
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Matrix/go.sum
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Matrix/go.sum	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Matrix/go.sum	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,535 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig=
+github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/asynkron/protoactor-go v0.0.0-20221002142108-880b460fcd1f h1:bNOhK/cTyV/nfkPYuiG6o48n8R6mTkHFp3FwBcuCjJ0=
+github.com/asynkron/protoactor-go v0.0.0-20221002142108-880b460fcd1f/go.mod h1:OnIxGbrnX2NFZaOolL4Z3mlSC3ERyqWnz9mepxvdCj0=
+github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
+github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
+github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
+github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lithammer/shortuuid/v4 v4.0.0 h1:QRbbVkfgNippHOS8PXDkti4NaWeyYfcBTHtw7k08o4c=
+github.com/lithammer/shortuuid/v4 v4.0.0/go.mod h1:Zs8puNcrvf2rV9rTH51ZLLcj7ZXqQI3lv67aw4KiB1Y=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY=
+github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI=
+github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
+github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
+github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE=
+github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
+github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
+github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg=
+github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ=
+go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
+go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
+go.opentelemetry.io/otel/exporters/prometheus v0.30.0 h1:YXo5ZY5nofaEYMCMTTMaRH2cLDZB8+0UGuk5RwMfIo0=
+go.opentelemetry.io/otel/exporters/prometheus v0.30.0/go.mod h1:qN5feW+0/d661KDtJuATEmHtw5bKBK7NSvNEP927zSs=
+go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw=
+go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c=
+go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU=
+go.opentelemetry.io/otel/sdk v1.6.0/go.mod h1:PjLRUfDsoPy0zl7yrDGSUqjj43tL7rEtFdCEiGlxXRM=
+go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0=
+go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
+go.opentelemetry.io/otel/sdk/export/metric v0.28.0 h1:Ob5e5X1BsFPs8kfEuonHjGUu0Gt8rO/rH4KqyvIS2ns=
+go.opentelemetry.io/otel/sdk/export/metric v0.28.0/go.mod h1:2HTuv+l3ia7NquArnWavCoKhXi9yBJPpKqMHr1trKa0=
+go.opentelemetry.io/otel/sdk/metric v0.28.0/go.mod h1:DqJmT0ovBgoW6TJ8CAQyTnwxZPIp3KWtCiDDZ1uHAzU=
+go.opentelemetry.io/otel/sdk/metric v0.30.0 h1:XTqQ4y3erR2Oj8xSAOL5ovO5011ch2ELg51z4fVkpME=
+go.opentelemetry.io/otel/sdk/metric v0.30.0/go.mod h1:8AKFRi5HyvTR0RRty3paN1aMC9HMT+NzcEhw/BLkLX8=
+go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE=
+go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o=
+go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Repeat/GoRepeat.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Repeat/GoRepeat.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Repeat/GoRepeat.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,148 @@
+// https://github.com/AsynkronIT/protoactor-go
+// https://pkg.go.dev/github.com/AsynkronIT/protoactor-go/actor
+package main
+
+import (
+	"os"; "strconv"; "fmt"; "time"; "runtime"; "sync/atomic"
+	"github.com/asynkron/protoactor-go/actor"
+)
+
+var Messages, Times uint64 = 100_000, 10
+var Processors int = 4
+
+var starttime time.Time;
+var shake = make( chan string )
+var actorCnt uint64 = 0
+
+type IntMsg struct { val int }
+type CharMsg struct { val rune }
+type StateMsg struct {}
+
+var statemsg StateMsg
+
+type Client struct {
+	servers [] * actor.PID;
+	intmsg [] IntMsg;
+	charmsg [] CharMsg;
+	results, times uint64;
+}
+type Server struct {}
+
+var system * actor.ActorSystem
+var client * actor.PID
+
+func ( state * Server ) Receive( context actor.Context ) {
+	switch msg := context.Message().(type) {
+	  case * IntMsg:
+		msg.val = 7
+		system.Root.Send( client, msg )
+	  case * CharMsg:
+		msg.val = 'x'
+		system.Root.Send( client, msg )
+	  case * StateMsg:
+		if ( atomic.AddUint64( &actorCnt, 1 ) == Messages + 1 ) {
+			shake <- "hand"
+		} // if
+	  default:
+		// ignore actor.Started message
+	}
+}
+
+func process( state * Client, context * actor.Context  ) {
+	state.results++
+	if ( state.results == 2 * Messages ) {
+		state.times += 1
+		if ( state.times == Times ) {
+			for i := uint64(0); i < Messages; i += 1 {
+				system.Root.Send( state.servers[i], &statemsg )
+			}
+			if ( atomic.AddUint64( &actorCnt, 1 ) == Messages + 1 ) {
+				shake <- "hand"
+			} // if
+			return
+		}
+		state.results = 0
+		system.Root.Send( (*context).Self(), &statemsg )
+	}
+}
+
+
+func ( state * Client ) Receive( context actor.Context ) {
+	switch context.Message().(type) {
+	  case * IntMsg:
+		process( state, &context )
+	  case * CharMsg:
+		process( state, &context )
+	  case * StateMsg:
+		for i := uint64(0); i < Messages; i += 1 {
+			system.Root.Send( state.servers[i], &state.intmsg[i] )
+			system.Root.Send( state.servers[i], &state.charmsg[i] )
+		}
+	  default:
+		// ignore actor.Started message
+	}
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ messages (> 0) | 'd' (default %v) ] " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ Times (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Messages, Processors, Times );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+	  case 4:
+		if os.Args[3] != "d" {							// default ?
+			Times, _ = strconv.ParseUint( os.Args[3], 10, 64 )
+			if Times < 1 { usage(); }
+		} // if
+		fallthrough
+	  case 3:
+		if os.Args[2] != "d" {							// default ?
+			Processors, _ = strconv.Atoi( os.Args[2] )
+			if Processors < 1 { usage(); }
+		} // if
+		fallthrough
+	  case 2:
+		if os.Args[1] != "d" {							// default ?
+			Messages, _ = strconv.ParseUint( os.Args[1], 10, 64 )
+			if Messages < 1 { usage(); }
+		} // if
+	  case 1:											// use defaults
+	  default:
+		usage();
+	} // switch
+
+	runtime.GOMAXPROCS( Processors );
+	
+	starttime = time.Now();
+
+	system = actor.NewActorSystem();
+	servers := make( [] * actor.PID, Messages );
+	intmsg := make( []IntMsg, Messages );
+	charmsg := make( []CharMsg, Messages );
+
+	props := actor.PropsFromProducer( func() actor.Actor { return &Client{ servers, intmsg, charmsg, 0, 0 } })
+	client = system.Root.Spawn(props)
+
+	for r := uint64(0); r < Messages; r += 1 { // create messages and actors
+		props := actor.PropsFromProducer( func() actor.Actor { return &Server{} })
+		servers[r] = system.Root.Spawn(props)
+	} // for
+
+	system.Root.Send( client, &statemsg );
+
+	<- shake // wait for actors to finish
+
+	fmt.Printf( "%.2f\n", time.Since( starttime ).Seconds() );
+} // main
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" GoMatrix
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "go build" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Repeat/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Repeat/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Repeat/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,33 @@
+module GoRepeat
+
+go 1.18
+
+require github.com/asynkron/protoactor-go v0.0.0-20221002142108-880b460fcd1f
+
+require (
+	github.com/Workiva/go-datastructures v1.0.53 // indirect
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/cespare/xxhash/v2 v2.1.2 // indirect
+	github.com/emirpasic/gods v1.18.1 // indirect
+	github.com/go-logr/logr v1.2.3 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/google/uuid v1.3.0 // indirect
+	github.com/lithammer/shortuuid/v4 v4.0.0 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+	github.com/orcaman/concurrent-map v1.0.0 // indirect
+	github.com/prometheus/client_golang v1.12.2 // indirect
+	github.com/prometheus/client_model v0.2.0 // indirect
+	github.com/prometheus/common v0.34.0 // indirect
+	github.com/prometheus/procfs v0.7.3 // indirect
+	github.com/spaolacci/murmur3 v1.1.0 // indirect
+	go.opentelemetry.io/otel v1.7.0 // indirect
+	go.opentelemetry.io/otel/exporters/prometheus v0.30.0 // indirect
+	go.opentelemetry.io/otel/metric v0.30.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.7.0 // indirect
+	go.opentelemetry.io/otel/sdk/export/metric v0.28.0 // indirect
+	go.opentelemetry.io/otel/sdk/metric v0.30.0 // indirect
+	go.opentelemetry.io/otel/trace v1.7.0 // indirect
+	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
+	google.golang.org/protobuf v1.28.0 // indirect
+)
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Repeat/go.sum
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Repeat/go.sum	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/Repeat/go.sum	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,535 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig=
+github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/asynkron/protoactor-go v0.0.0-20221002142108-880b460fcd1f h1:bNOhK/cTyV/nfkPYuiG6o48n8R6mTkHFp3FwBcuCjJ0=
+github.com/asynkron/protoactor-go v0.0.0-20221002142108-880b460fcd1f/go.mod h1:OnIxGbrnX2NFZaOolL4Z3mlSC3ERyqWnz9mepxvdCj0=
+github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
+github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
+github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
+github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lithammer/shortuuid/v4 v4.0.0 h1:QRbbVkfgNippHOS8PXDkti4NaWeyYfcBTHtw7k08o4c=
+github.com/lithammer/shortuuid/v4 v4.0.0/go.mod h1:Zs8puNcrvf2rV9rTH51ZLLcj7ZXqQI3lv67aw4KiB1Y=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY=
+github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI=
+github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
+github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
+github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE=
+github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
+github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
+github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg=
+github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ=
+go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
+go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
+go.opentelemetry.io/otel/exporters/prometheus v0.30.0 h1:YXo5ZY5nofaEYMCMTTMaRH2cLDZB8+0UGuk5RwMfIo0=
+go.opentelemetry.io/otel/exporters/prometheus v0.30.0/go.mod h1:qN5feW+0/d661KDtJuATEmHtw5bKBK7NSvNEP927zSs=
+go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw=
+go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c=
+go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU=
+go.opentelemetry.io/otel/sdk v1.6.0/go.mod h1:PjLRUfDsoPy0zl7yrDGSUqjj43tL7rEtFdCEiGlxXRM=
+go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0=
+go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
+go.opentelemetry.io/otel/sdk/export/metric v0.28.0 h1:Ob5e5X1BsFPs8kfEuonHjGUu0Gt8rO/rH4KqyvIS2ns=
+go.opentelemetry.io/otel/sdk/export/metric v0.28.0/go.mod h1:2HTuv+l3ia7NquArnWavCoKhXi9yBJPpKqMHr1trKa0=
+go.opentelemetry.io/otel/sdk/metric v0.28.0/go.mod h1:DqJmT0ovBgoW6TJ8CAQyTnwxZPIp3KWtCiDDZ1uHAzU=
+go.opentelemetry.io/otel/sdk/metric v0.30.0 h1:XTqQ4y3erR2Oj8xSAOL5ovO5011ch2ELg51z4fVkpME=
+go.opentelemetry.io/otel/sdk/metric v0.30.0/go.mod h1:8AKFRi5HyvTR0RRty3paN1aMC9HMT+NzcEhw/BLkLX8=
+go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE=
+go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o=
+go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendDynamic/GoSendDynamic.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendDynamic/GoSendDynamic.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendDynamic/GoSendDynamic.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,65 @@
+// https://github.com/asynkron/protoactor-go
+// https://pkg.go.dev/github.com/asynkron/protoactor-go/actor
+package main
+
+import (
+	"os"; "strconv"; "fmt"; "time"; "runtime"
+	"github.com/asynkron/protoactor-go/actor"
+)
+
+var Times int = 2_000_000;
+var start time.Time;
+var shake = make( chan string )
+var system * actor.ActorSystem
+
+type Msg struct { cnt int }
+type Send struct{}
+
+func ( state * Send ) Receive( context actor.Context ) {
+	switch msg := context.Message().(type) {
+	  case * Msg:
+		if msg.cnt >= Times  {
+			fmt.Printf( "%v\n", int64(time.Since(start) / time.Duration(Times) / time.Nanosecond) );
+			shake <- "hand"
+			return;
+		} // if
+		//fmt.Printf( "Send %v\n", msg.cnt );
+		props := actor.PropsFromProducer( func() actor.Actor { return &Send{} } )
+		pid := system.Root.Spawn( props )
+		system.Root.Send( pid, &Msg{ msg.cnt + 1 } );
+		system.Root.Stop( context.Self() );
+	  default:
+		// ignore actor.Started message
+	}
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v [ times (> 0) ]\n", os.Args[0] );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+	  case 2:
+		if os.Args[1] != "d" { Times, _ = strconv.Atoi( os.Args[1] ) }
+		if Times < 1 { usage(); }
+	  case 1:											// use defaults
+	  default:
+		usage();
+	} // switch
+
+	runtime.GOMAXPROCS(1);
+	system = actor.NewActorSystem();
+	props := actor.PropsFromProducer( func() actor.Actor { return &Send{} } );
+	pid := system.Root.Spawn(props);
+	start = time.Now();
+	system.Root.Send( pid, &Msg{ 0 } );
+	<- shake
+}
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" GoSendDynamic
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "go build" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendDynamic/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendDynamic/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendDynamic/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,32 @@
+module GoSendDynamic
+
+go 1.18
+
+require (
+	github.com/Workiva/go-datastructures v1.0.53 // indirect
+	github.com/asynkron/protoactor-go v0.0.0-20220528090104-f567b547ea07 // indirect
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/cespare/xxhash/v2 v2.1.2 // indirect
+	github.com/emirpasic/gods v1.18.1 // indirect
+	github.com/go-logr/logr v1.2.3 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/google/uuid v1.3.0 // indirect
+	github.com/lithammer/shortuuid/v4 v4.0.0 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+	github.com/orcaman/concurrent-map v1.0.0 // indirect
+	github.com/prometheus/client_golang v1.12.2 // indirect
+	github.com/prometheus/client_model v0.2.0 // indirect
+	github.com/prometheus/common v0.34.0 // indirect
+	github.com/prometheus/procfs v0.7.3 // indirect
+	github.com/spaolacci/murmur3 v1.1.0 // indirect
+	go.opentelemetry.io/otel v1.7.0 // indirect
+	go.opentelemetry.io/otel/exporters/prometheus v0.30.0 // indirect
+	go.opentelemetry.io/otel/metric v0.30.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.7.0 // indirect
+	go.opentelemetry.io/otel/sdk/export/metric v0.28.0 // indirect
+	go.opentelemetry.io/otel/sdk/metric v0.30.0 // indirect
+	go.opentelemetry.io/otel/trace v1.7.0 // indirect
+	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
+	google.golang.org/protobuf v1.28.0 // indirect
+)
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendDynamic/go.sum
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendDynamic/go.sum	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendDynamic/go.sum	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,527 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig=
+github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/asynkron/protoactor-go v0.0.0-20220528090104-f567b547ea07 h1:ahDmMVSgTM8gSxmp0P5SCwESFgGNxB2sr3u6Y7j6ecM=
+github.com/asynkron/protoactor-go v0.0.0-20220528090104-f567b547ea07/go.mod h1:OnIxGbrnX2NFZaOolL4Z3mlSC3ERyqWnz9mepxvdCj0=
+github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
+github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
+github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lithammer/shortuuid/v4 v4.0.0 h1:QRbbVkfgNippHOS8PXDkti4NaWeyYfcBTHtw7k08o4c=
+github.com/lithammer/shortuuid/v4 v4.0.0/go.mod h1:Zs8puNcrvf2rV9rTH51ZLLcj7ZXqQI3lv67aw4KiB1Y=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY=
+github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI=
+github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
+github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
+github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE=
+github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
+github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
+github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg=
+github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ=
+go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
+go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
+go.opentelemetry.io/otel/exporters/prometheus v0.30.0 h1:YXo5ZY5nofaEYMCMTTMaRH2cLDZB8+0UGuk5RwMfIo0=
+go.opentelemetry.io/otel/exporters/prometheus v0.30.0/go.mod h1:qN5feW+0/d661KDtJuATEmHtw5bKBK7NSvNEP927zSs=
+go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw=
+go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c=
+go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU=
+go.opentelemetry.io/otel/sdk v1.6.0/go.mod h1:PjLRUfDsoPy0zl7yrDGSUqjj43tL7rEtFdCEiGlxXRM=
+go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0=
+go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
+go.opentelemetry.io/otel/sdk/export/metric v0.28.0 h1:Ob5e5X1BsFPs8kfEuonHjGUu0Gt8rO/rH4KqyvIS2ns=
+go.opentelemetry.io/otel/sdk/export/metric v0.28.0/go.mod h1:2HTuv+l3ia7NquArnWavCoKhXi9yBJPpKqMHr1trKa0=
+go.opentelemetry.io/otel/sdk/metric v0.28.0/go.mod h1:DqJmT0ovBgoW6TJ8CAQyTnwxZPIp3KWtCiDDZ1uHAzU=
+go.opentelemetry.io/otel/sdk/metric v0.30.0 h1:XTqQ4y3erR2Oj8xSAOL5ovO5011ch2ELg51z4fVkpME=
+go.opentelemetry.io/otel/sdk/metric v0.30.0/go.mod h1:8AKFRi5HyvTR0RRty3paN1aMC9HMT+NzcEhw/BLkLX8=
+go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE=
+go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o=
+go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendStatic/GoSendStatic.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendStatic/GoSendStatic.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendStatic/GoSendStatic.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,64 @@
+// https://github.com/asynkron/protoactor-go
+// https://pkg.go.dev/github.com/asynkron/protoactor-go/actor
+package main
+
+import (
+	"os"; "strconv"; "fmt"; "time"; "runtime"
+	"github.com/asynkron/protoactor-go/actor"
+)
+
+var Times int = 100_000_000;
+var start time.Time;
+var shake = make( chan string )
+var system * actor.ActorSystem
+
+type Msg struct { cnt int }
+var msg Msg
+type Send struct{}
+
+func ( state * Send ) Receive( context actor.Context ) {
+	switch context.Message().(type) {
+	  case * Msg:
+		if msg.cnt >= Times  {
+			fmt.Printf( "%v\n", int64(time.Since(start) / time.Duration(Times) / time.Nanosecond) );
+			shake <- "hand"
+			return;
+		} // if
+		//fmt.Printf( "Send %v\n", msg.cnt );
+		msg.cnt += 1;
+		system.Root.Send( context.Self(), &msg );
+	  default:
+		// ignore actor.Started message
+	}
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v [ times (> 0) ]\n", os.Args[0] );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+	  case 2:
+		if os.Args[1] != "d" { Times, _ = strconv.Atoi( os.Args[1] ) }
+		if Times < 1 { usage(); }
+	  case 1:											// use defaults
+	  default:
+		usage();
+	} // switch
+
+	runtime.GOMAXPROCS(1);
+	system = actor.NewActorSystem();
+	props := actor.PropsFromProducer( func() actor.Actor { return &Send{} } );
+	pid := system.Root.Spawn(props);
+	start = time.Now();
+	system.Root.Send( pid, &msg );
+	<- shake
+}
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" GoSendStatic
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "go build" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendStatic/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendStatic/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendStatic/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,33 @@
+module GoSendStatic
+
+go 1.18
+
+require github.com/asynkron/protoactor-go v0.0.0-20220528090104-f567b547ea07
+
+require (
+	github.com/Workiva/go-datastructures v1.0.53 // indirect
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/cespare/xxhash/v2 v2.1.2 // indirect
+	github.com/emirpasic/gods v1.18.1 // indirect
+	github.com/go-logr/logr v1.2.3 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/google/uuid v1.3.0 // indirect
+	github.com/lithammer/shortuuid/v4 v4.0.0 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+	github.com/orcaman/concurrent-map v1.0.0 // indirect
+	github.com/prometheus/client_golang v1.12.2 // indirect
+	github.com/prometheus/client_model v0.2.0 // indirect
+	github.com/prometheus/common v0.34.0 // indirect
+	github.com/prometheus/procfs v0.7.3 // indirect
+	github.com/spaolacci/murmur3 v1.1.0 // indirect
+	go.opentelemetry.io/otel v1.7.0 // indirect
+	go.opentelemetry.io/otel/exporters/prometheus v0.30.0 // indirect
+	go.opentelemetry.io/otel/metric v0.30.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.7.0 // indirect
+	go.opentelemetry.io/otel/sdk/export/metric v0.28.0 // indirect
+	go.opentelemetry.io/otel/sdk/metric v0.30.0 // indirect
+	go.opentelemetry.io/otel/trace v1.7.0 // indirect
+	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
+	google.golang.org/protobuf v1.28.0 // indirect
+)
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendStatic/go.sum
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendStatic/go.sum	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/proto/SendStatic/go.sum	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,527 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig=
+github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/asynkron/protoactor-go v0.0.0-20220528090104-f567b547ea07 h1:ahDmMVSgTM8gSxmp0P5SCwESFgGNxB2sr3u6Y7j6ecM=
+github.com/asynkron/protoactor-go v0.0.0-20220528090104-f567b547ea07/go.mod h1:OnIxGbrnX2NFZaOolL4Z3mlSC3ERyqWnz9mepxvdCj0=
+github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
+github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
+github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
+github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lithammer/shortuuid/v4 v4.0.0 h1:QRbbVkfgNippHOS8PXDkti4NaWeyYfcBTHtw7k08o4c=
+github.com/lithammer/shortuuid/v4 v4.0.0/go.mod h1:Zs8puNcrvf2rV9rTH51ZLLcj7ZXqQI3lv67aw4KiB1Y=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY=
+github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI=
+github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
+github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
+github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE=
+github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
+github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
+github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg=
+github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ=
+go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
+go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
+go.opentelemetry.io/otel/exporters/prometheus v0.30.0 h1:YXo5ZY5nofaEYMCMTTMaRH2cLDZB8+0UGuk5RwMfIo0=
+go.opentelemetry.io/otel/exporters/prometheus v0.30.0/go.mod h1:qN5feW+0/d661KDtJuATEmHtw5bKBK7NSvNEP927zSs=
+go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw=
+go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c=
+go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU=
+go.opentelemetry.io/otel/sdk v1.6.0/go.mod h1:PjLRUfDsoPy0zl7yrDGSUqjj43tL7rEtFdCEiGlxXRM=
+go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0=
+go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
+go.opentelemetry.io/otel/sdk/export/metric v0.28.0 h1:Ob5e5X1BsFPs8kfEuonHjGUu0Gt8rO/rH4KqyvIS2ns=
+go.opentelemetry.io/otel/sdk/export/metric v0.28.0/go.mod h1:2HTuv+l3ia7NquArnWavCoKhXi9yBJPpKqMHr1trKa0=
+go.opentelemetry.io/otel/sdk/metric v0.28.0/go.mod h1:DqJmT0ovBgoW6TJ8CAQyTnwxZPIp3KWtCiDDZ1uHAzU=
+go.opentelemetry.io/otel/sdk/metric v0.30.0 h1:XTqQ4y3erR2Oj8xSAOL5ovO5011ch2ELg51z4fVkpME=
+go.opentelemetry.io/otel/sdk/metric v0.30.0/go.mod h1:8AKFRi5HyvTR0RRty3paN1aMC9HMT+NzcEhw/BLkLX8=
+go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE=
+go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o=
+go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/run
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/run	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/run	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,607 @@
+#!/bin/bash -
+
+false=0; true=1
+
+# Usage: arch [ hostname ] returns hostname, cores, startcore
+#
+#   Define machine architecture based on starting socket, CPUs (cores) per socket, number of
+#   sockets, has hyperthreading.
+
+start=0
+
+arch() {
+	hostname=${1:-`hostname`}			# return value
+	hashyper=${true}					# assume machine has hyperthreads
+	if [ "${hostname}" = "plg2" ] ; then
+		startsocket=${start}
+		cps=16							# coresPerSocket
+		sockets=2
+		hashyper=${false}				# has no hyperthreads
+	elif [ "${hostname}" = "nasus" ] ; then
+		startsocket=${start}
+		cps=64							# coresPerSocket
+		sockets=2
+	elif [ "${hostname}" = "pyke" ] ; then
+		startsocket=${start}
+		cps=24							# coresPerSocket
+		sockets=2
+	elif [ "${hostname}" = "jax" ] ; then
+		startsocket=${start}
+		cps=24							# coresPerSocket
+		sockets=4
+	else
+		echo "unsupported host" ${hostname}
+		exit 1
+	fi
+	cores=$(( ${cps} * ${sockets} ))
+	startcore=$(( ${startsocket} * ${cps} ))
+}
+
+# Usage: affinity (global cps, sockets, startsocket, hashyper, cores, startcore, wrap)
+#   returns taskset argument
+#
+#   This routine assumes hyperthreading has only 2 hyperthreads per core.
+#
+#   If hyperthread scanning is used: processor units are assigned across the low-number hyperthreads
+#   of the socket's cores. When the low-number hyperthreads are filled, the high-number hyperhtreads
+#   are assigned across the socket's cores. Then the next socket is assigned.
+#
+#   If hyperthread wrapping is used: processor units are assigned in low/high-number pairs of
+#   hyperthreads across the socket's cores. Then the next socket is assigned.
+
+wrap=${false}							# set to control hyperthread assignment across socket cores
+
+affinity() {
+	if [ ${wrap} -eq ${true} -a ${hashyper} -eq ${false} ] ; then
+		echo "architecture does not support hyperthreading for wrapping"
+		exit 1
+	fi
+	taskset=""							# return value
+	set -- $(( ${1} - 1 ))				# decrement $1
+	if [ ${1} -eq 0 ] ; then taskset="${startcore}-${startcore}"; return; fi
+	if [ ${1} -ge $(( ${cps} * ( ${sockets} - ${startsocket} ) * ( ${hashyper} + 1 ) )) ] ; then # error
+		echo "not enough cores $(( ${cores} * ${sockets} )) for $(( ${1} + 1 )) starting at ${startcore}"
+		exit 1
+	fi
+	if [ ${hashyper} -eq ${false} ] ; then taskset="${startcore}-$(( ${1} + ${startcore} ))"; return; fi # no hyperthreads
+	start2=$(( ${startcore} + ${cores} ))
+	if [ ${wrap} -eq ${true} ] ; then 	# hyperthread wrapping
+		end1=$(( ${1} / 2 + ${startcore} ))
+		end2=$(( ${end1} + ${cores} ))
+		if [ $(( ${1} % 2 )) -eq 0 ] ; then
+			end2=$(( ${end2} - 1 ))
+		fi
+		taskset="${startcore}-${end1},${start2}-${end2}"
+	else								# hyperthread scanning
+		if [ ${1} -lt ${cps} ] ; then taskset="${startcore}-$(( ${1} + ${startcore} ))"; return; fi
+		filled=$(( ${1} / ( ${cps} * 2 ) * ${cps} ))
+		modulus=$(( ${1} % ( ${cps} * 2 ) ))	# leftover cores added to saturated sockets
+		if [ ${modulus} -gt ${cps} ] ; then
+			taskset="${startcore}-$(( ${startcore} + ${filled} + ${cps} - 1 )),${start2}-$(( ${start2} + ${filled} + ${modulus} % ${cps} ))"
+		else
+			taskset="${startcore}-$(( ${startcore} + ${filled} + ${modulus} )),${start2}-$(( ${start2} + ${filled} - 1 ))"
+		fi
+	fi
+}
+
+#used for output formatting
+column_headers="proc\ttime (s)"
+
+# executor config
+batch='100'
+nRounds='400' #500
+
+# matrix config
+size='3072'
+
+# repeat config
+messages='100000'
+n_repeats='200' #200
+
+# balance config
+nOneRounds='2000'
+nMultiRounds='800'
+
+# static config
+n_static_sends='100000000'
+n_static_sends_slow='10000000'
+
+# dynamic config
+n_dynamic_sends='20000000'
+n_dynamic_sends_slow='2000000'
+
+numtimes=5
+
+# bench_cores='1 2 4 8 16 24 32'
+bench_cores='1 2 4 8 16 24 32 48'
+# bench_cores='48'
+
+# toggle missed gulp tracking config (overrides specified config)
+missed_gulps=${true}
+# missed_gulps=${false}
+
+# toggle mem collection config (overrides specified config)
+# outputs mem instead of time
+mem=${true}
+mem=${false}
+
+# toggle benchmarks
+executor=${true}
+matrix=${true}
+repeat=${true}
+balance=${true}
+static=${true}
+dynamic=${true}
+# executor=${false}
+# matrix=${false}
+# repeat=${false}
+# balance=${false}
+# static=${false}
+# dynamic=${false}
+
+# names=('Longest-Victim' 'No-Stealing' 'Random')
+# var_flags=('-D__STEAL=1 -DSEARCH=1' '' '-D__STEAL=1 -DRAND=1')
+
+# names=('CFA' 'CFA-EMPTY')
+# var_flags=('' '-DEMPTY')
+
+# names=('CFA')
+# var_flags=('-D__STEAL=1 -DSEARCH=1')
+
+# names=('CFA' 'CFA-STAT')
+# var_flags=('-D__STEAL=1 -DSEARCH=1' '-D__STEAL=1 -DSTATS')
+
+# names=()
+# var_flags=()
+
+names=('CFA')
+var_flags=('')
+
+runCAF=${true}
+runUCPP=${true}
+runPROTO=${true}
+runAKKA=${true}
+runCAF=${false}
+runUCPP=${false}
+runPROTO=${false}
+runAKKA=${false}
+
+if [ ${missed_gulps} -eq ${true} ] ; then
+    bench_cores='2 4 8 16 24 32 48'
+    column_headers="proc\tmissed\ttime (s)"
+    names=('CFA')
+    var_flags=('-D__STEAL=1 -DSEARCH=1 -DACTOR_STATS_QUEUE_MISSED')
+    runCAF=${false}
+    runUCPP=${false}
+    runPROTO=${false}
+    runAKKA=${false}
+    executor=${true}
+    matrix=${true}
+    repeat=${true}
+fi
+
+if [ ${mem} -eq ${true} ] ; then
+    bench_cores='48'
+    column_headers="proc\tmem (kB)"
+    names=('CFA')
+    var_flags=('-D__STEAL=1 -DSEARCH=1')
+    runCAF=${true}
+    runUCPP=${true}
+    runPROTO=${true}
+    runAKKA=${true}
+    executor=${true}
+    matrix=${false}
+    repeat=${false}
+    balance=${false}
+    static=${false}
+    dynamic=${false}
+fi
+
+cfa=~/cfa-cc/driver/cfa
+
+# Helpers to minimize code duplication
+
+# repeats a command ${numtimes}
+preprint=''
+repeat_command() {
+    t=1
+    while [ ${t} -le ${numtimes} ] ; do
+        echo -n -e ${preprint}
+        "${@}"
+        t=`expr ${t} + 1`
+    done
+}
+
+# prints the leading info for a given run of a variant
+print_header() {
+    echo ${1}':'
+    if [ ${mem} -eq ${false} ] ; then
+        echo -e $column_headers
+    fi
+}
+
+# runs the current benchmark with provided args
+# only works for standard-run benchmarks (not Akka)
+# must split into pre and post args to be able to supply val of p
+pre_args=''
+post_args=''
+single_run() {
+    affinity ${1}
+    preprint="${1}\t"
+    if [ ${mem} -eq ${true} ] ; then
+        repeat_command /usr/bin/time -f "%M" taskset -c ${taskset} ./a.${hostname} ${pre_args} ${1} ${post_args} > /dev/null
+    else
+        repeat_command taskset -c ${taskset} ./a.${hostname} ${pre_args} ${1} ${post_args}
+    fi
+}
+
+# runs the current bench for all processor vals
+# works for standard benchs that dont need to set a config file (not Akka or CAF)
+run_bench() {
+    for p in ${bench_cores} ; do
+        single_run ${p}
+    done
+}
+
+set_akka_parallelism() {
+    sed -i "s/parallelism-min = .*/parallelism-min = ${1}/g" application.conf
+    sed -i "s/parallelism-max = .*/parallelism-max = ${1}/g" application.conf
+}
+
+arch # get hostname
+
+# set up leading info for python script
+echo $numtimes
+echo $bench_cores
+
+for i in ${!names[@]}; do
+    echo -n ${names[$i]}" "
+done
+if [ ${runCAF} -eq ${true} ] ; then
+    echo -n 'CAF '
+fi # done CAF
+if [ ${runAKKA} -eq ${true} ] ; then
+    echo -n 'Akka '
+fi # done AKKA
+if [ ${runUCPP} -eq ${true} ] ; then
+    echo -n 'uC++ '
+fi # done UCPP
+if [ ${runPROTO} -eq ${true} ] ; then
+    echo -n 'ProtoActor '
+fi
+echo ""
+
+# done printing header info for output
+
+# cfa flags
+cfa_flags='-quiet -O3 -nodebug -DNDEBUG'
+
+# CAF flags
+prefixCAF='-O3 -Wall -std=c++17 -I/home/pabuhr/software/nasus/Actors/experiments/CAF/actor-framework/libcaf_core -I/home/pabuhr/software/nasus/Actors/experiments/CAF/actor-framework/libcaf_core/caf -I/home/pabuhr/software/nasus/Actors/experiments/CAF/actor-framework/build/libcaf_core -L/home/pabuhr/software/nasus/Actors/experiments/CAF/actor-framework/build/libcaf_core -L/home/pabuhr/software/nasus/Actors/experiments/CAF/actor-framework/build/libcaf_io'
+suffixCAF='-lcaf_io -lcaf_core -Wl,-rpath=CAF/actor-framework/build/libcaf_core'
+
+# AKKA flags
+sbtflags="--warn -J-Xmx32g"
+
+# UCPP flags
+UCPPflags="-quiet -g -Wall -Wextra -O3 -nodebug -DNDEBUG -multi"
+UCPP=~/ucpp/u++-7.0.0/bin/u++
+
+# run the benchmarks
+
+# /usr/bin/time -f "%Uu %Ss %Er %Mkb"
+if [ ${executor} -eq ${true} ] ; then
+    if [ ${mem} -eq ${false} ] ; then
+        echo "executor"
+    else
+        echo "mem"
+    fi
+    pre_args="40000 100 ${nRounds}"
+    post_args="${batch}"
+    cd cfa # CFA RUN
+    for i in ${!names[@]}; do
+        print_header ${names[$i]}
+        ${cfa} ${cfa_flags} ${var_flags[$i]} executor.cfa -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+    done
+    cd - > /dev/null # done CFA
+    if [ ${runCAF} -eq ${true} ] ; then # CAF RUN
+        cd caf
+        print_header 'CAF'
+        g++ ${prefixCAF} CAFExecutor.cpp ${suffixCAF} -o a.${hostname} > /dev/null 2>&1
+        for p in ${bench_cores} ; do
+            sed -i "s/max-threads = .*/max-threads = ${p}/g" caf-application.conf # set CAF parallelism
+            single_run ${p}
+        done
+        rm a.${hostname}
+        # set back parallelism
+        sed -i "s/max-threads = .*/max-threads = 1/g" caf-application.conf 
+        cd - > /dev/null
+    fi # done CAF
+    if [ ${runAKKA} -eq ${true} ] ; then # AKKA RUN
+        cd akka/Executor
+        rm -rf project target				# random out of memory errors without this
+        print_header 'Akka'
+        for p in ${bench_cores} ; do
+            set_akka_parallelism ${p}
+            affinity ${p}
+            if [ ${mem} -eq ${true} ] ; then
+                t=1
+                while [ ${t} -le ${numtimes} ] ; do
+                    /usr/bin/time -f "%M" taskset -c ${taskset} sbt ${sbtflags} "run ${pre_args} ${p} ${post_args} 1" 2>&1 | grep -v "SLF4J:" | grep -v "Slf4jLogger started" | sed -e "s/\x1b\[0J//" | grep -v "\."
+                    t=`expr ${t} + 1`
+                done
+            else
+                taskset -c ${taskset} sbt ${sbtflags} "run ${pre_args} ${p} ${post_args} ${numtimes}" 2>&1 | grep -v "SLF4J:" | grep -v "Slf4jLogger started" | sed -e "s/\x1b\[0J//"
+            fi
+            
+            sbt clean > /dev/null
+        done
+        # set back parallelism
+        set_akka_parallelism 1
+        cd - > /dev/null
+    fi # done AKKA
+    if [ ${runUCPP} -eq ${true} ] ; then # UCPP RUN
+        cd ucpp
+        print_header 'uC++'
+        ${UCPP} ${UCPPflags} uC++Executor.cc -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done UCPP
+    if [ ${runPROTO} -eq ${true} ] ; then # PROTO RUN
+        print_header 'ProtoActor'
+        cd proto/Executor
+        go build -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done PROTO
+    echo ""
+fi
+
+if [ ${matrix} -eq ${true} ] ; then
+    echo "matrix"
+    pre_args="${size} ${size} ${size}"
+    post_args=""
+    cd cfa
+    for i in ${!names[@]}; do
+        print_header ${names[$i]}
+        ${cfa} ${cfa_flags} ${var_flags[$i]} matrix.cfa -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+    done
+    cd - > /dev/null
+    if [ ${runCAF} -eq ${true} ] ; then # CAF RUN
+        cd caf
+        print_header 'CAF'
+        g++ ${prefixCAF} CAFMatrix.cpp ${suffixCAF} -o a.${hostname} > /dev/null 2>&1
+        for p in ${bench_cores} ; do
+            sed -i "s/max-threads = .*/max-threads = ${p}/g" caf-application.conf # set CAF parallelism
+            single_run ${p}
+        done
+        rm a.${hostname}
+
+        # set back parallelism
+        sed -i "s/max-threads = .*/max-threads = 1/g" caf-application.conf 
+        cd - > /dev/null
+    fi # done CAF
+    if [ ${runAKKA} -eq ${true} ] ; then # AKKA RUN
+        cd akka/Matrix
+        rm -rf project target				# random out of memory errors without this
+        print_header 'Akka'
+        for p in ${bench_cores} ; do
+            set_akka_parallelism ${p}
+            affinity ${p}
+            repeat_command taskset -c ${taskset} sbt ${sbtflags} "run ${pre_args} ${p}" 2>&1 | grep -v "SLF4J:" | grep -v "Slf4jLogger started" | sed -e "s/\x1b\[0J//"
+            sbt clean > /dev/null
+        done
+        # set back parallelism
+        set_akka_parallelism 1
+        cd - > /dev/null
+    fi # done AKKA
+    if [ ${runUCPP} -eq ${true} ] ; then # UCPP RUN
+        cd ucpp
+        print_header 'uC++'
+        ${UCPP} ${UCPPflags} uC++Matrix.cc -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done UCPP
+    if [ ${runPROTO} -eq ${true} ] ; then # PROTO RUN
+        cd proto/Matrix
+        print_header 'ProtoActor'
+        go build -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done PROTO
+    echo ""
+fi
+
+if [ ${repeat} -eq ${true} ] ; then
+    echo "repeat"
+    pre_args="${messages}"
+    post_args="${n_repeats}"
+    cd cfa
+    for i in ${!names[@]}; do
+        print_header ${names[$i]}
+        ${cfa} ${cfa_flags} ${var_flags[$i]} repeat.cfa -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+    done
+    cd - > /dev/null
+    if [ ${runCAF} -eq ${true} ] ; then # CAF RUN
+        cd caf
+        print_header 'CAF'
+        g++ ${prefixCAF} CAFRepeat.cpp ${suffixCAF} -o a.${hostname} > /dev/null 2>&1
+        for p in ${bench_cores} ; do
+            sed -i "s/max-threads = .*/max-threads = ${p}/g" caf-application.conf # set CAF parallelism
+            single_run ${p}
+        done
+        rm a.${hostname}
+
+        # set back parallelism
+        sed -i "s/max-threads = .*/max-threads = 1/g" caf-application.conf 
+        cd - > /dev/null
+    fi # done CAF
+    if [ ${runAKKA} -eq ${true} ] ; then # AKKA RUN
+        cd akka/Repeat
+        rm -rf project target				# random out of memory errors without this
+        print_header 'Akka'
+        for p in ${bench_cores} ; do
+            set_akka_parallelism ${p}
+            affinity ${p}
+            repeat_command taskset -c ${taskset} sbt ${sbtflags} "run ${pre_args} ${p} ${post_args}" 2>&1 | grep -v "SLF4J:" | grep -v "Slf4jLogger started" | sed -e "s/\x1b\[0J//"
+            sbt clean > /dev/null
+        done
+        # set back parallelism
+        set_akka_parallelism 1
+        cd - > /dev/null
+    fi # done AKKA
+    if [ ${runUCPP} -eq ${true} ] ; then # UCPP RUN
+        cd ucpp
+        print_header 'uC++'
+        ${UCPP} ${UCPPflags} uC++Repeat.cc -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done UCPP
+    if [ ${runPROTO} -eq ${true} ] ; then # PROTO RUN
+        print_header 'ProtoActor'
+        cd proto/Repeat
+        go build -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done PROTO
+    echo ""
+fi
+
+
+if [ ${static} -eq ${true} ] ; then
+    echo "static"
+    preprint=''
+    cd cfa
+    for i in ${!names[@]}; do
+        echo ${names[$i]}
+        ${cfa} ${cfa_flags} ${var_flags[$i]} static.cfa -o a.${hostname} > /dev/null 2>&1
+        repeat_command taskset -c ${startcore} ./a.${hostname} ${n_static_sends}
+        rm a.${hostname}
+    done
+    cd - > /dev/null
+    if [ ${runCAF} -eq ${true} ] ; then # CAF RUN
+        cd caf
+        echo 'CAF:'
+        g++ ${prefixCAF} CAFSendStatic.cpp ${suffixCAF} -o a.${hostname} > /dev/null 2>&1
+        sed -i "s/max-threads = .*/max-threads = 1/g" caf-application.conf # set CAF parallelism
+        repeat_command taskset -c ${startcore} ./a.${hostname} ${n_static_sends_slow}
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done CAF
+    if [ ${runAKKA} -eq ${true} ] ; then # AKKA RUN
+        cd akka/SendStatic
+        rm -rf project target				# random out of memory errors without this
+        echo 'Akka:'
+        set_akka_parallelism 1
+        taskset -c ${startcore} sbt ${sbtflags} "run ${n_static_sends} ${numtimes}" 2>&1 | grep -v "SLF4J:" | grep -v "Slf4jLogger started" | sed -e "s/\x1b\[0J//"
+        cd - > /dev/null
+    fi # done AKKA
+    if [ ${runUCPP} -eq ${true} ] ; then # UCPP RUN
+        cd ucpp
+        echo 'uC++:'
+        ${UCPP} ${UCPPflags} uC++SendStatic.cc -o a.${hostname} > /dev/null 2>&1
+        repeat_command taskset -c ${startcore} ./a.${hostname} ${n_static_sends}
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done UCPP
+    if [ ${runPROTO} -eq ${true} ] ; then # PROTO RUN
+        cd proto/SendStatic
+        echo 'ProtoActor:'
+        go build -o a.${hostname} > /dev/null 2>&1
+        repeat_command taskset -c ${startcore} ./a.${hostname} ${n_static_sends}
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done PROTO
+    echo ""
+fi
+
+if [ ${dynamic} -eq ${true} ] ; then
+    echo "dynamic"
+    cd cfa
+    for i in ${!names[@]}; do
+        echo ${names[$i]}
+        ${cfa} ${cfa_flags} ${var_flags[$i]} dynamic.cfa -o a.${hostname} > /dev/null 2>&1
+        repeat_command taskset -c ${startcore} ./a.${hostname} ${n_dynamic_sends}
+        rm a.${hostname}
+    done
+    cd - > /dev/null
+    if [ ${runCAF} -eq ${true} ] ; then # CAF RUN
+        cd caf
+        echo 'CAF:'
+        g++ ${prefixCAF} CAFSendDynamic.cpp ${suffixCAF} -o a.${hostname} > /dev/null 2>&1
+        sed -i "s/max-threads = .*/max-threads = 1/g" caf-application.conf # set CAF parallelism
+        repeat_command taskset -c ${startcore} ./a.${hostname} ${n_dynamic_sends_slow}
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done CAF
+    if [ ${runAKKA} -eq ${true} ] ; then # AKKA RUN
+        cd akka/SendDynamic
+        rm -rf project target				# random out of memory errors without this
+        echo 'Akka:'
+        set_akka_parallelism 1
+        taskset -c ${startcore} sbt ${sbtflags} "run ${n_dynamic_sends_slow} ${numtimes}" 2>&1 | grep -v "SLF4J:" | grep -v "Slf4jLogger started" | sed -e "s/\x1b\[0J//"
+        cd - > /dev/null
+    fi # done AKKA
+    if [ ${runUCPP} -eq ${true} ] ; then # UCPP RUN
+        cd ucpp
+        echo 'uC++:'
+        ${UCPP} ${UCPPflags} uC++SendDynamic.cc -o a.${hostname} > /dev/null 2>&1
+        repeat_command taskset -c ${startcore} ./a.${hostname} ${n_dynamic_sends}
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done UCPP
+    if [ ${runPROTO} -eq ${true} ] ; then # PROTO RUN
+        cd proto/SendDynamic
+        echo 'ProtoActor:'
+        go build -o a.${hostname} > /dev/null 2>&1
+        repeat_command taskset -c ${startcore} ./a.${hostname} ${n_dynamic_sends_slow}
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done PROTO
+    echo ""
+fi
+
+
+if [ ${balance} -eq ${true} ] ; then
+    cd cfa
+    echo "balance_one"
+    for i in ${!names[@]}; do
+        echo ${names[$i]}':'
+        echo -e $column_headers
+        ${cfa} ${cfa_flags} ${var_flags[$i]} balance.cfa -o a.${hostname} > /dev/null 2>&1
+        for p in ${bench_cores} ; do 
+            affinity ${p}
+            preprint="${p}\t"
+            repeat_command taskset -c ${taskset} ./a.${hostname} 32 32 ${nOneRounds} ${p}
+        done
+        rm a.${hostname}
+    done
+    echo ""
+    echo "balance_multi"
+    for i in ${!names[@]}; do
+        echo ${names[$i]}':'
+        echo -e $column_headers
+        ${cfa} ${cfa_flags} ${var_flags[$i]} -DMULTI balance.cfa -o a.${hostname} > /dev/null 2>&1
+        for p in ${bench_cores} ; do 
+            affinity ${p}
+            preprint="${p}\t"
+            repeat_command taskset -c ${taskset} ./a.${hostname} 32 32 ${nMultiRounds} ${p}
+        done
+        rm a.${hostname}
+    done
+    echo ""
+    cd - > /dev/null
+fi
+
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++Executor.cc
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++Executor.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++Executor.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,108 @@
+#include <iostream>
+using namespace std;
+#include <chrono>
+using namespace chrono;
+#include <uActor.h>
+
+int Actors = 40'000, Set = 100, Rounds = 100, Processors = 1, Batch = 1, Qscale = 512; // default values '
+struct Msg : public uActor::Message {} msg;
+time_point<steady_clock> starttime;
+
+_Actor Executor {
+	static int ids;										// unique actor id generator
+	Executor * gstart;
+	int id, rounds, recs = 0, sends = 0;
+
+	Allocation receive( Message & msg ) {
+		Case ( Msg, msg ) {
+			if ( recs == rounds ) return Finished;
+		  	if ( recs % Batch == 0 ) {
+				for ( int i = 0; i < Batch; i += 1 ) {
+					gstart[sends % Set] | msg;			// cycle through set
+					sends += 1;
+				} // for
+			} // if
+			recs += 1;
+		} // Case
+		return Nodelete;
+	} // Executor::receive
+  public:
+	Executor() {
+		id = ids++;										// unique actor id, and start point for cycle
+		gstart = &this[id / Set * Set - id];			// remember group-start array-element
+		rounds = Set * Rounds;							// send at least one message to each group member
+	} // Executor::Executor
+}; // Executor
+int Executor::ids = 0;
+
+size_t malloc_unfreed() { return 16621; }				// unfreed storage from locale
+//size_t malloc_expansion() { return 2 * 1024 * 1024; }
+
+int main( int argc, char * argv[] ) {
+	locale loc( getenv("LANG") );
+	cout.imbue( loc );
+
+	switch ( argc ) {
+	  case 7:
+		if ( strcmp( argv[6], "d" ) != 0 ) {			// default ?
+			Qscale = stoi( argv[6] );
+			if ( Qscale < 1 ) goto Usage;
+		} // if
+	  case 6:
+		if ( strcmp( argv[5], "d" ) != 0 ) {			// default ?
+			Batch = stoi( argv[5] );
+			if ( Batch < 1 ) goto Usage;
+		} // if
+	  case 5:
+		if ( strcmp( argv[4], "d" ) != 0 ) {			// default ?
+			Processors = stoi( argv[4] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 4:
+		if ( strcmp( argv[3], "d" ) != 0 ) {			// default ?
+			Rounds = stoi( argv[3] );
+			if ( Rounds < 1 ) goto Usage;
+		} // if
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Set = stoi( argv[2] );
+			if ( Set < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Actors = stoi( argv[1] );
+			if ( Actors < 1 || Actors <= Set || Actors % Set != 0 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0]
+			 << " [ actors (> 0 && > set && actors % set == 0 ) | 'd' (default " << Actors
+			 << ") ] [ set (> 0) | 'd' (default " << Set
+			 << ") ] [ rounds (> 0) | 'd' (default " << Rounds
+			 << ") ] [ processors (> 0) | 'd' (default " << Processors
+			 << ") ] [ batch (> 0) | 'd' (default " << Batch
+			 << ") ] [ queue scale (> 0) | 'd' (default " << Qscale
+			 << ") ]" << endl;
+		exit( EXIT_FAILURE );
+	} // switch
+
+	uExecutor * executor = new uExecutor( Processors, Processors, // too large for task stack
+										  Processors == 1 ? 1 : Processors * Qscale, true, 0 );
+	uActor::start( executor );							// start actor system
+	Executor * actors = new Executor[Actors];			// too many actors for task stack
+	starttime = steady_clock::now();
+	for ( int i = 0; i < Actors; i += 1 ) actors[i] | msg; // start actors
+	uActor::stop();										// wait for all actors to terminate
+	cout << (steady_clock::now() - starttime).count() / 1'000'000'000.0 << endl; // '
+	delete [] actors;
+	delete executor;
+	// malloc_stats();
+} // main
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" a.out
+
+// Local Variables: //
+// compile-command: "u++-work -g -Wall -Wextra -O3 -nodebug -DNDEBUG -multi uC++Executor.cc" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++Matrix.cc
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++Matrix.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++Matrix.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,127 @@
+#include <iostream>
+#include <algorithm>
+using namespace std;
+#include <chrono>
+using namespace chrono;
+#include <uActor.h>
+
+unsigned int xr = 3'072, xc = 3'072, yc = 3'072, Processors = 1; // default values
+
+struct WorkMsg : public uActor::Message {				// derived message
+	int * Z;
+	const int * const X, * const * Y;
+	WorkMsg( int Z[], const int X[], const int * const Y[] ) :
+		Message( uActor::Finished ), Z( Z ), X( X ), Y( Y ) {} // one-shot
+}; // WorkMsg
+
+time_point<steady_clock> starttime;
+
+_Actor MatrixMult {
+	Allocation receive( Message & msg ) {
+		Case ( WorkMsg, msg ) {
+			int * z = msg_d->Z;							// optimizations
+			const int * const x = msg_d->X, * const * y = msg_d->Y;
+			for ( unsigned int i = 0; i < yc; i += 1 ) { // multiply X_row by Y_col and sum products
+				z[i] = 0;
+				for ( unsigned int j = 0; j < xc; j += 1 ) {
+					z[i] += x[j] * y[j][i];
+				} // for
+			} // for
+		} // Case
+
+		return Finished;
+	} // MatrixMult:::receive
+}; // MatrixMult
+
+int main( int argc, char * argv[] ) {
+	locale loc( getenv("LANG") );
+	cout.imbue( loc );
+
+	switch ( argc ) {
+	  case 5:
+		if ( strcmp( argv[4], "d" ) != 0 ) {			// default ?
+			Processors = stoi( argv[4] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 4:
+		if ( strcmp( argv[3], "d" ) != 0 ) {			// default ?
+			xr = stoi( argv[3] );
+			if ( xr < 1 ) goto Usage;
+		} // if
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			xc = stoi( argv[2] );
+			if ( xc < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			yc = stoi( argv[1] );
+			if ( yc < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0]
+			 << " [ yc (> 0) | 'd' (default " << yc
+			 << ") ] [ xc (> 0) | 'd' (default " << xc
+			 << ") ] [ xr (> 0) | 'd' (default " << xr
+			 << ") ] [ processors (> 0) | 'd' (default " << Processors
+			 << ") ]" << endl;
+		exit( EXIT_FAILURE );
+	} // switch
+
+	unsigned int r, c;
+	int * Z[xr], * X[xr], * Y[xc];
+
+	for ( r = 0; r < xr; r += 1 ) {						// create/initialize X matrix
+		X[r] = new int[xc];
+		for ( c = 0; c < xc; c += 1 ) {
+			X[r][c] = r * c % 37;						// for timing
+		} // for
+	} // for
+	for ( r = 0; r < xc; r += 1 ) {						// create/initialize Y matrix
+		Y[r] = new int[yc];
+		for ( c = 0; c < yc; c += 1 ) {
+			Y[r][c] = r * c % 37;						// for timing
+		} // for
+	} // for
+	for ( r = 0; r < xr; r += 1 ) {						// create Z matrix
+		Z[r] = new int[yc];
+	} // for
+
+	uExecutor * executor = new uExecutor( Processors, Processors, Processors == 1 ? 1 : Processors * 32, true, 0 );
+	uActor::start( executor );							// start actor system
+	uNoCtor<MatrixMult> * multiply = new uNoCtor<MatrixMult>[xr];
+	uNoCtor<WorkMsg> * workMsg = new uNoCtor<WorkMsg>[xr];	
+
+	for ( unsigned int r = 0; r < xr; r += 1 ) {
+		multiply[r].ctor();
+		workMsg[r].ctor( Z[r], X[r], (const int * const *)Y );
+	} // for
+
+	starttime = steady_clock::now();
+	for ( unsigned int r = 0; r < xr; r += 1 ) {
+		*multiply[r] | *workMsg[r];
+	} // for
+
+	uActor::stop();										// wait for all actors to terminate
+
+	cout << (steady_clock::now() - starttime).count() / 1'000'000'000.0 << endl;
+	
+	for ( r = 0; r < xr; r += 1 ) {						// deallocate X and Z matrices
+		delete [] X[r];
+		delete [] Z[r];
+	} // for
+	for ( r = 0; r < xc; r += 1 ) {						// deallocate Y matrix
+		delete [] Y[r];
+	} // for
+
+	// malloc_stats();
+} // main
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" a.out
+
+// Local Variables: //
+// compile-command: "u++-work -g -Wall -Wextra -O3 -nodebug -DNDEBUG -multi uC++Matrix.cc" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++Repeat.cc
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++Repeat.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++Repeat.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,110 @@
+#include <string>
+using namespace std;
+#include <uActor.h>
+#include <chrono>
+using namespace chrono;
+#include <iostream>
+
+struct IntMsg : public uActor::SenderMsg { int val; };
+struct CharMsg : public uActor::SenderMsg { char val; };
+
+size_t Messages = 100'000, Processors = 4, QScale = 256, Times = 10;
+time_point<steady_clock> starttime;
+
+_Actor Server {
+	Allocation receive( uActor::Message & msg ) {
+		Case( IntMsg, msg ) { msg_d->val = 7; *msg_d->sender() | msg; }
+		else Case( CharMsg, msg ) { msg_d->val = 'x'; *msg_d->sender() | msg; }
+		else Case( StopMsg, msg ) { return Finished; }
+		return Nodelete;								// reuse actor
+	}
+};
+
+Server * servers;
+
+_Actor Client {
+	IntMsg * intmsg;
+	CharMsg * charmsg;
+	size_t results = 0, times = 0;
+
+	Allocation reset() {
+		times += 1;
+		if ( times == Times ) {
+			for ( unsigned int i = 0; i < Messages; i += 1 ) {
+				servers[i] | uActor::stopMsg;
+			} // for
+			return Finished;
+		}
+		results = 0;
+		*this | uActor::startMsg;						// restart experiment
+		return Nodelete;
+	}
+
+	Allocation receive( uActor::Message & msg ) {		// receive callback messages
+		Case( IntMsg, msg ) results += 1;
+		else Case( CharMsg, msg ) results += 1;
+		else Case( StartMsg, msg ) {
+			for ( size_t i = 0; i < Messages; i += 1 ) { // send out work
+				servers[i] | intmsg[i];					// tell send
+				servers[i] | charmsg[i];
+			}
+		}
+		if ( results == 2 * Messages ) return reset();	// all messages handled ?
+		return Nodelete;								// reuse actor
+	}
+  public:
+	Client() {
+		intmsg = new IntMsg[Messages];
+		charmsg = new CharMsg[Messages];
+	}
+	~Client() {
+		delete [] charmsg;
+		delete [] intmsg;
+	}
+};
+
+int main( int argc, char * argv[] ) {
+	switch ( argc ) {
+	  case 5:
+		if ( strcmp( argv[4], "d" ) != 0 ) {			// default ?
+			QScale = stoi( argv[4] );
+			if ( QScale < 1 ) goto Usage;
+		} // if
+      case 4:
+		if ( strcmp( argv[3], "d" ) != 0 ) {			// default ?
+			Times = stoi( argv[3] );
+			if ( Times < 1 ) goto Usage;
+		} // if
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Processors = stoi( argv[2] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Messages = stoi( argv[1] );
+			if ( Messages < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0]
+			 << ") ] [ messages (> 0) | 'd' (default " << Messages
+			 << ") ] [ processors (> 0) | 'd' (default " << Processors
+             << ") ] [ Times (> 0) | 'd' (default " << Times
+			 << ") ] [ qscale (> 0) | 'd' (default " << QScale
+			 << ") ]" << endl;
+		exit( EXIT_FAILURE );
+	} // switch
+
+	uExecutor executor( Processors, Processors, Processors == 1 ? 1 : Processors * QScale, true, -1 );
+	time_point<steady_clock> starttime = steady_clock::now();
+    uActor::start( &executor );							// start actor system
+	servers = new Server[Messages];
+	Client client;
+	client | uActor::startMsg;							// start actors
+	uActor::stop();										// wait for all actors to terminate
+	cout << (steady_clock::now() - starttime).count() / 1'000'000'000.0 << endl;
+	delete [] servers;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++SendDynamic.cc
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++SendDynamic.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++SendDynamic.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,49 @@
+#include <iostream>
+using namespace std;
+#include <chrono>
+using namespace chrono;
+#include <uActor.h>
+
+int Times = 100'000'000;								// default values
+time_point<steady_clock> starttime;
+
+struct Msg : public uActor::Message { int cnt; Msg( int cnt ) : Message( uActor::Delete ), cnt( cnt ) {} };
+
+_Actor Send {
+	Allocation receive( Message & msg ) {
+		Case ( Msg, msg ) {
+			if ( msg_d->cnt >= Times ) {
+				cout << (steady_clock::now() - starttime).count() / Times << endl;
+				return Delete;
+			} // if
+			//cout << msg_d->cnt << endl;
+			*(new Send) | *new Msg{ msg_d->cnt + 1 };	// dynamic actor / message send self
+		} // Case
+		return Delete;
+	} // Send:::receive
+}; // Send
+
+int main( int argc, char * argv[] ) {
+	switch ( argc ) {
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) { Times = stoi( argv[1] ); }
+		if ( Times < 1 ) goto Usage;
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0] << " [ times (> 0) ]" << endl;
+		exit( EXIT_FAILURE );
+	} // switch
+
+	uActor::start();									// start actor system
+	starttime = steady_clock::now();
+	*(new Send) | *new Msg{ 0 };
+	uActor::stop();										// wait for all actors to terminate
+} // main
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" a.out
+
+// Local Variables: //
+// compile-command: "u++-work -g -Wall -Wextra -O3 -nodebug -DNDEBUG -multi uC++SendDynamic.cc" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++SendStatic.cc
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++SendStatic.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/actors/ucpp/uC++SendStatic.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,51 @@
+#include <iostream>
+using namespace std;
+#include <chrono>
+using namespace chrono;
+#include <uActor.h>
+
+int Times = 100'000'000;								// default values
+time_point<steady_clock> starttime;
+
+struct Msg : public uActor::Message { int cnt; Msg( int cnt ) : cnt( cnt ) {} } msg{ 0 }; // default Nodelete
+
+_Actor Send {
+	Allocation receive( Message & msg ) {
+		Case ( Msg, msg ) {
+			if ( msg_d->cnt >= Times ) {
+				cout << (steady_clock::now() - starttime).count() / Times << endl;
+				return Finished;
+			} // if
+			//cout << msg_d->cnt << endl;
+			msg_d->cnt += 1;
+			*this | *msg_d;								// static actor / message send self
+		} // Case
+		return Nodelete;
+	} // Send:::receive
+}; // Send
+
+int main( int argc, char * argv[] ) {
+	switch ( argc ) {
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) { Times = stoi( argv[1] ); }
+		if ( Times < 1 ) goto Usage;
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0] << " [ times (> 0) ]" << endl;
+		exit( EXIT_FAILURE );
+	} // switch
+
+	uActor::start();									// start actor system
+	starttime = steady_clock::now();
+	Send send;
+	send | msg;
+	uActor::stop();										// wait for all actors to terminate
+} // main
+
+// /usr/bin/time -f "%Uu %Ss %Er %Mkb" a.out
+
+// Local Variables: //
+// compile-command: "u++-work -g -Wall -Wextra -O3 -nodebug -DNDEBUG -multi uC++SendStatic.cc" //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/barrier.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/barrier.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/barrier.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,144 @@
+#include <locks.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <channel.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+#include <string.h>
+
+size_t total_operations = 0;
+int Processors = 1, Tasks = 1, BarrierSize = 2;
+
+typedef channel( int ) Channel;
+
+Channel * barWait;
+Channel * entryWait;
+owner_lock o;
+
+bool done = false;
+size_t tasks_done = 0;
+
+static inline void flushBarrier() {
+    for ( j; BarrierSize ) {
+        insert( *entryWait, -1 );
+        insert( *barWait, -1 );
+    }
+}
+
+static inline void initBarrier() {
+    for ( j; BarrierSize )
+        insert( *entryWait, j );
+}
+
+static inline void barrier() {
+    int ticket = remove( *entryWait );
+    if ( ticket == -1 ) {
+		insert( *entryWait, -1 );
+		return;
+	}
+    if ( ticket == BarrierSize - 1 ) {
+		for ( j; BarrierSize - 1 )
+            insert( *barWait, j );
+        return;
+	}
+    ticket = remove( *barWait );
+    if ( ticket == -1 ) {
+		insert( *barWait, -1 );
+		return;
+	}
+
+	// last one out
+	if ( BarrierSize == 1 || ticket == BarrierSize - 2 ) {
+		for ( j; BarrierSize )
+            insert( *entryWait, j );
+	}
+}
+
+thread Task {};
+static inline void ?{}( Task & p, cluster & clu ) {
+    ((thread &)p){ clu };
+}
+void main(Task & this) {
+    size_t runs = 0;
+    for ( ;; ) {
+        if ( done ) break;
+        barrier();
+        runs++;
+    }
+    lock(o);
+    total_operations += runs;
+    // sout | "P: " | runs;
+    unlock(o);
+}
+
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			BarrierSize = atoi( argv[2] );
+            if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Processors = atoi( argv[1] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ processors (> 0) | 'd' (default " | Processors
+			 | ") ] [ BarrierSize (> 0) | 'd' (default " | BarrierSize
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+    Tasks = Processors;
+    if ( Tasks < BarrierSize )
+        Tasks = BarrierSize;
+
+    size_t Clusters = 1;
+    // create a cluster
+    cluster clus[Clusters];
+    processor * proc[Processors];
+    for ( i; Processors ) {
+        (*(proc[i] = malloc())){clus[i % Clusters]};
+    }
+
+    Channel entry{ 2 * BarrierSize };
+    Channel wait{ 2 * BarrierSize };
+
+    entryWait = &entry;
+    barWait = &wait;
+
+    initBarrier();
+    // sout | "Processors: " | Processors | " ProdsPerChan: " | Producers | " ConsPerChan: " | Consumers | "Channels: " | Channels | " Channel Size: " | ChannelSize;
+
+    // sout | "start";
+    Task * t[Tasks];
+
+    for ( i; Tasks ) {
+        (*(t[i] = malloc())){ clus[i % Clusters] };
+    }
+
+    sleep(10`s);
+    done = true;
+
+    // sout | "sleep";
+
+    flushBarrier();
+
+    for ( i; Tasks ) {
+        delete(t[i]);
+    }
+    
+    sout | total_operations;
+    // print_stats_now( *active_cluster(), CFA_STATS_READY_Q);
+
+    for ( i; Processors ) {
+        delete(proc[i]);
+    }
+    // sout | "done";
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/churn.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/churn.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/churn.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,164 @@
+#include <locks.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <string.h>
+#include "channel.hfa"
+#include <thread.hfa>
+#include <time.hfa>
+#include <stats.hfa>
+size_t Processors = 1, Channels = 4, Producers = 1, Consumers = 1, ChannelSize = 128;
+
+owner_lock o;
+
+size_t total_operations = 0;
+size_t cons_check = 0, prod_check = 0;
+
+channel( size_t ) * channels;
+thread Consumer {};
+bool cons_done = false, prod_done = false;
+volatile int cons_done_count = 0;
+
+void getRandArray( int * chanIndices ) {
+    for ( int i = 0; i < Channels; i++ ) {
+        chanIndices[i] = i;
+    }
+    for ( int i = 0; i < Channels; i++ ) {
+        int loc_1 = prng() % Channels;
+        int loc_2 = prng() % Channels;
+        int temp = chanIndices[ loc_1 ];
+        chanIndices[ loc_1 ] = chanIndices[ loc_2 ];
+        chanIndices[ loc_2 ] = temp;
+    }
+}
+
+void main(Consumer & this) {
+    size_t i = 0;
+    size_t runs = 0;
+    size_t my_check = 0;
+    int chanIndices[Channels];
+    getRandArray( chanIndices );
+    
+    for ( ;;i++ ) {
+        if ( cons_done ) break;
+        size_t j = remove( channels[ chanIndices[ i % Channels ] ] );
+        my_check = my_check ^ j;
+        if ( !prod_done ) runs++;
+    }
+    lock(o);
+    total_operations += runs;
+    cons_done_count++;
+    cons_check = cons_check ^ my_check;
+    // sout | "Cons: " | runs;
+    unlock(o);
+}
+
+thread Producer {};
+
+void main(Producer & this) {
+    size_t i = 0;
+    size_t runs = 0;
+    size_t my_check = 0;
+    int chanIndices[Channels];
+    getRandArray( chanIndices );
+    for ( ;;i++ ) {
+        if ( prod_done ) break;
+        insert( channels[ chanIndices[ i % Channels ] ], i );
+        my_check = my_check ^ i;
+        runs++;
+    }
+    lock(o);
+    total_operations += runs;
+    prod_check = prod_check ^ my_check;
+    // sout | "Prods: " | runs;
+    unlock(o);
+}
+
+
+int main( int argc, char *argv[] ) {
+    switch( argc ) {
+      case 4:
+		if ( strcmp( argv[3], "d" ) != 0 ) {			// default ?
+			if ( atoi( argv[3] ) < 1 ) goto Usage;
+			ChannelSize = atoi( argv[3] );
+		} // if
+      case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			if ( atoi( argv[2] ) < 1 ) goto Usage;
+			Channels = atoi( argv[2] );
+		} // if
+      case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			if ( atoi( argv[1] ) < 1 ) goto Usage;
+			Processors = atoi( argv[1] );
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ processors > 0 | d ]"
+             | " [ producers > 0 | d ]"
+             | " [ consumers > 0 | d ]"
+             | " [ channels > 0 | d ]";
+		exit( EXIT_FAILURE );
+    }
+    processor p[Processors - 1];
+    channels = anew( Channels );
+    Producers = Processors / 2;
+    Consumers = Processors / 2;
+
+    // sout | "Processors: " | Processors | " Producers: " | Producers | " Consumers: " | Consumers | "Channels: " | Channels | " Channel Size: " | ChannelSize;
+
+    for ( i; Channels ) {
+        channels[i]{ ChannelSize };
+    }
+
+    // sout | "start";
+    {   
+        Consumer c[Consumers];
+        {
+            Producer p[Producers];
+            sleep(10`s);
+            prod_done = true;
+            // sout | "sleep";
+        }
+        // sout | "prods";
+        cons_done = true;
+        // for ( i; Channels ) {
+        //     if ( get_count( channels[i] ) < Consumers ){
+        //         for ( j; Consumers ) insert( channels[i], 0 );
+        //     }
+        // }
+        while( cons_done_count != Consumers ) {
+            for ( i; Channels ) {
+                if ( has_waiters( channels[i] ) ){
+                    insert( channels[i], 0 );
+                }
+            }
+        }
+    }
+    // sout | "cons";
+
+    for ( i; Channels ) {
+        for ( ;; ) {
+            if ( get_count( channels[i] ) > 0 ) {
+                size_t j = remove( channels[ i ] );
+                cons_check = cons_check ^ j;
+            } else break;
+        }
+    }
+
+    adelete( channels );
+
+    if ( cons_check != prod_check )
+        sout | "CHECKSUM MISMATCH !!!";
+    // print_stats_now( *active_cluster(), CFA_STATS_READY_Q);
+
+    // for ( i; Processors ) {
+    //     delete(proc[i]);
+    // }
+
+    sout | total_operations;
+    // print_stats_now( *active_cluster(), CFA_STATS_READY_Q );
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/contend.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/contend.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/contend.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,213 @@
+#include <locks.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <channel.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+#include <string.h>
+
+// user defines this
+// #define BIG 1
+
+owner_lock o;
+
+size_t total_operations = 0;
+
+struct bigObject {
+    size_t a;
+    size_t b;
+    size_t c;
+    size_t d;
+    size_t e;
+    size_t f;
+    size_t g;
+    size_t h;
+};
+
+void ?{}( bigObject & this, size_t i ) with(this) { a = i; b = i; c = i; d = i; e = i; f = i; g = i; h = i; }
+void ?{}( bigObject & this ) { this{0}; }
+
+#ifdef BIG
+typedef channel( bigObject ) Channel;
+#else
+typedef channel( size_t ) Channel;
+#endif
+
+Channel * channels;
+
+bool cons_done = false, prod_done = false;
+volatile int cons_done_count = 0;
+size_t cons_check = 0, prod_check = 0;
+
+thread Consumer {
+    size_t i;
+};
+static inline void ?{}( Consumer & c, size_t i, cluster & clu ) {
+    ((thread &)c){ clu };
+    c.i = i; 
+}
+void main(Consumer & this) {
+    size_t runs = 0;
+    size_t my_check = 0;
+    for ( ;; ) {
+        if ( cons_done ) break;
+        #ifdef BIG
+        bigObject j = remove( channels[ this.i ] );
+        my_check = my_check ^ (j.a + j.b + j.c + j.d + j.d + j.e + j.f + j.g + j.h);
+        #else
+        size_t j = remove( channels[ this.i ] );
+        my_check = my_check ^ j;
+        #endif
+        
+        if ( !prod_done ) runs++;
+    }
+    lock(o);
+    total_operations += runs;
+    cons_done_count++;
+    cons_check = cons_check ^ my_check;
+    // sout | "C: " | runs;
+    unlock(o);
+}
+
+thread Producer {
+    size_t i;
+};
+static inline void ?{}( Producer & p, size_t i, cluster & clu ) {
+    ((thread &)p){ clu };
+    p.i = i;
+}
+void main(Producer & this) {
+    size_t runs = 0;
+    size_t my_check = 0;
+    size_t my_id = this.i;
+    for ( ;; ) {
+        if ( prod_done ) break;
+        #ifdef BIG
+        bigObject j{(size_t)runs};
+        insert( channels[ my_id ], j );
+        my_check = my_check ^ (j.a + j.b + j.c + j.d + j.d + j.e + j.f + j.g + j.h);
+        #else
+        insert( channels[ my_id ], (size_t)runs );
+        my_check = my_check ^ ((size_t)runs);
+        #endif
+        runs++;
+    }
+    lock(o);
+    total_operations += runs;
+    prod_check = prod_check ^ my_check;
+    // sout | "P: " | runs;
+    unlock(o);
+}
+
+static inline int test( size_t Processors, size_t Channels, size_t Producers, size_t Consumers, size_t ChannelSize ) {
+    size_t Clusters = 1;
+    // create a cluster
+    cluster clus[Clusters];
+    processor * proc[Processors];
+    for ( i; Processors ) {
+        (*(proc[i] = malloc())){clus[i % Clusters]};
+    }
+
+    channels = aalloc( Channels );
+
+    // sout | "Processors: " | Processors | " ProdsPerChan: " | Producers | " ConsPerChan: " | Consumers | "Channels: " | Channels | " Channel Size: " | ChannelSize;
+    
+    for ( i; Channels ) {
+        channels[i]{ ChannelSize };
+    }
+
+    // sout | "start";
+    Consumer * c[Consumers * Channels];
+    Producer * p[Producers * Channels];
+
+    for ( j; Channels ) {
+        for ( i; Producers ) {
+            (*(p[i] = malloc())){ j, clus[j % Clusters] };
+        }
+
+        for ( i; Consumers ) {
+            (*(c[i] = malloc())){ j, clus[j % Clusters] };
+        }
+    }
+
+    sleep(10`s);
+    prod_done = true;
+
+    for ( i; Producers * Channels ) {
+        delete(p[i]);
+    }
+
+    // sout | "prods";
+    cons_done = true;
+    while( cons_done_count != Consumers * Channels ) {
+        for ( i; Channels ) {
+            if ( has_waiters( channels[i] ) ){
+                #ifdef BIG
+                bigObject b{0};
+                insert( channels[i], b );
+                #else
+                insert( channels[i], 0 );
+                #endif
+            }
+        }
+    }
+
+    // sout | "cons";
+    for ( i; Consumers * Channels ) {
+        delete(c[i]);
+    }
+
+    // sout | "flush";
+    for ( i; Channels ) {
+        for ( ;; ) {
+            if ( get_count( channels[i] ) > 0 ) {
+                #ifdef BIG
+                bigObject j = remove( channels[ i ] );
+                cons_check = cons_check ^ (j.a + j.b + j.c + j.d + j.d + j.e + j.f + j.g + j.h);
+                #else
+                size_t j = remove( channels[ i ] );
+                cons_check = cons_check ^ j;
+                #endif
+            } else break;
+        }
+    }
+
+    adelete( channels );
+    sout | total_operations;
+    if ( cons_check != prod_check )
+        sout | "CHECKSUM MISMATCH !!!";
+    // print_stats_now( *active_cluster(), CFA_STATS_READY_Q);
+
+    for ( i; Processors ) {
+        delete(proc[i]);
+    }
+    // sout | "done";
+    return 0;
+}
+
+int main( int argc, char * argv[] ) {
+    size_t Processors = 1, Channels = 1, Producers = 1, Consumers = 1, ChannelSize = 128;
+    switch ( argc ) {
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			ChannelSize = atoi( argv[2] );
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Processors = atoi( argv[1] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ processors (> 0) | 'd' (default " | Processors
+			 | ") ] [ channel size (>= 0) | 'd' (default " | ChannelSize
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+    Producers = Processors / 2;
+    Consumers = Processors / 2;
+    test(Processors, Channels, Producers, Consumers, ChannelSize);
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/daisy_chain.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/daisy_chain.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/daisy_chain.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,77 @@
+#include <locks.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <channel.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+#include <string.h>
+
+size_t total_operations = 0;
+size_t Processors = 1, Tasks = 1;
+
+owner_lock o;
+
+// typedef channel_base( int, exp_backoff_then_block_lock ) Channel;
+typedef channel( int ) Channel;
+
+Channel * chain;
+
+bool done = false;
+
+thread Task {};
+void main(Task & this) {
+    size_t runs = 0;
+    for ( ;; ) {
+        if ( done ) break;
+        remove( *chain );
+        insert( *chain, 0 );
+        runs++;
+    }
+    lock( o );
+    total_operations += runs;
+    unlock( o );
+}
+
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Tasks = atoi( argv[2] );
+            if ( Tasks < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Processors = atoi( argv[1] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ processors (> 0) | 'd' (default " | Processors
+			 | ") ] [ channel size (>= 0) | 'd' (default " | Tasks
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+    Tasks = Processors;
+    processor proc[Processors - 1];
+
+    Channel chainChan{ 2 * Tasks };
+
+    insert( chainChan, 0 );
+
+    chain = &chainChan;    
+    {
+        Task t[Tasks];
+        sleep(10`s);
+        done = true;
+        for ( j; Tasks )
+            insert( chainChan, 0 );
+    }
+    
+    sout | total_operations;
+
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/hot_potato.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/hot_potato.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/hot_potato.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,86 @@
+#include <locks.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <channel.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+#include <string.h>
+
+size_t total_operations = 0;
+size_t Processors = 1, Tasks = 1;
+
+owner_lock o;
+
+// typedef channel_base( int, exp_backoff_then_block_lock ) Channel;
+typedef channel( int ) Channel;
+
+Channel * chain;
+
+bool done = false;
+int id_counter = 0;
+thread Task { int id; int right; };
+static inline void ?{}( Task & this ) with(this) {
+    id = __atomic_fetch_add( &id_counter, 1, __ATOMIC_SEQ_CST );
+    right = (id + 1) % Tasks;
+}
+void main(Task & this) with(this) {
+    size_t runs = 0;
+    int my_id = id;
+    int my_right = right;
+    for ( ;; ) {
+        if ( done ) break;
+        remove( chain[my_id] );
+        insert( chain[my_right], 0 );
+        runs++;
+    }
+    lock( o );
+    total_operations += runs;
+    unlock( o );
+}
+
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Tasks = atoi( argv[2] );
+            if ( Tasks < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Processors = atoi( argv[1] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ processors (> 0) | 'd' (default " | Processors
+			 | ") ] [ channel size (>= 0) | 'd' (default " | Tasks
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+    Tasks = Processors;
+    processor proc[Processors - 1];
+
+    chain = aalloc( Tasks );
+    for ( i; Tasks ) {
+        chain[i]{ 3 };
+    }
+
+    insert( chain[0], 0 );
+    {
+        Task t[Tasks];
+        sleep(10`s);
+        done = true;
+        for ( j; Tasks )
+            insert( chain[j], 0 );
+    }
+    
+    sout | total_operations;
+
+    adelete(chain);
+
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/ping_pong.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/ping_pong.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/ping_pong.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,62 @@
+#include <locks.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <channel.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+#include <string.h>
+
+size_t total_operations = 0;
+
+// typedef channel_base( int, exp_backoff_then_block_lock ) Channel;
+typedef channel( int ) Channel;
+
+Channel * ping;
+Channel * pong;
+
+bool done = false;
+
+thread Pong {};
+void main(Pong & this) {
+    for ( ;; ) {
+        if ( done ) break;
+        insert( *ping, 0 );
+        remove( *pong );
+    }
+}
+
+thread Ping {};
+void main(Ping & this) {
+    size_t runs = 0;
+    for ( ;; ) {
+        if ( done ) break;
+        remove( *ping );
+        insert( *pong, 1 );
+        total_operations++;
+    }
+}
+
+
+int main( int argc, char * argv[] ) {
+    processor proc[1];
+
+    Channel pingChan{ 2 };
+    Channel pongChan{ 2 };
+
+    ping = &pingChan;
+    pong = &pongChan;
+    
+    {
+        Ping pi;
+        Pong po;
+        sleep(10`s);
+        done = true;
+        insert( *pong, 2 );
+        insert( *ping, 2 );
+    }
+    
+    sout | total_operations;
+
+    // sout | "done";
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/pub_sub.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/pub_sub.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/cfa/pub_sub.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,168 @@
+#include <locks.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <channel.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+#include <string.h>
+#include <mutex_stmt.hfa>
+
+size_t total_operations = 0;
+size_t Processors = 1, Tasks = 1;
+
+typedef channel( size_t ) Channel;
+
+channel( int ) * barWait;
+channel( int ) * entryWait;
+int BarrierSize = 1;
+static inline void flushBarrier() {
+    for ( j; BarrierSize ) {
+        insert( *entryWait, -1 );
+        insert( *barWait, -1 );
+    }
+}
+
+static inline void initBarrier() {
+    for ( j; BarrierSize )
+        insert( *entryWait, j );
+}
+
+static inline void barrier() {
+    int ticket = remove( *entryWait );
+    if ( ticket == -1 ) {
+		insert( *entryWait, -1 );
+		return;
+	}
+    if ( ticket == BarrierSize - 1 ) {
+		for ( j; BarrierSize - 1 )
+            insert( *barWait, j );
+        return;
+	}
+    ticket = remove( *barWait );
+    if ( ticket == -1 ) {
+		insert( *barWait, -1 );
+		return;
+	}
+
+	// last one out
+	if ( BarrierSize == 1 || ticket == BarrierSize - 2 ) {
+		for ( j; BarrierSize )
+            insert( *entryWait, j );
+	}
+}
+
+Channel ** chans;
+owner_lock o;
+
+bool done = false;
+size_t tasks_done = 0;
+
+thread Task { size_t id; };
+static inline void ?{}( Task & p, size_t i, cluster & clu ) {
+    ((thread &)p){ clu };
+    p.id = i;
+}
+void main(Task & this) with(this) {
+    size_t runs = 0;
+    size_t my_id = id;
+    for ( ;; ) {
+        if ( done ) break;
+
+        // publish
+        for ( i; Tasks ) {
+            insert(*chans[my_id], i);
+        }
+
+        // subscribe
+        for ( i; Tasks ) {
+            remove( *chans[i] );
+        }
+        barrier();
+        runs++;
+    }
+    lock(o);
+    total_operations += runs;
+    // sout | "P: " | runs;
+    unlock(o);
+}
+
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			Tasks = atoi( argv[2] );
+            if ( Tasks < 1 ) goto Usage;
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Processors = atoi( argv[1] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ processors (> 0) | 'd' (default " | Processors
+			 | ") ] [ Tasks (> 0) | 'd' (default " | Tasks
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+    Tasks = Processors;
+    BarrierSize = Tasks;
+
+    size_t Clusters = 1;
+    // create a cluster
+    cluster clus[Clusters];
+    processor * proc[Processors];
+    for ( i; Processors ) {
+        (*(proc[i] = malloc())){clus[i % Clusters]};
+    }
+
+    chans = aalloc( Tasks );
+    for ( i; Tasks ) {
+        chans[i] = malloc();
+        (*chans[i]){ 2 * Tasks };
+    }
+        
+
+    // setup barrier
+    channel(int) entry{ 2 * BarrierSize };
+    channel(int) wait{ 2 * BarrierSize };
+    entryWait = &entry;
+    barWait = &wait;
+    initBarrier();
+
+    // sout | "Processors: " | Processors | " ProdsPerChan: " | Producers | " ConsPerChan: " | Consumers | "Channels: " | Channels | " Channel Size: " | ChannelSize;
+
+    // sout | "start";
+    Task * t[Tasks];
+
+    for ( i; Tasks ) {
+        (*(t[i] = malloc())){ i, clus[i % Clusters] };
+    }
+
+    sleep(10`s);
+    done = true;
+
+    for ( i; Tasks )
+        for ( j; Tasks )
+            insert(*chans[i], j);
+
+    flushBarrier();
+
+    for ( i; Tasks ) {
+        delete(t[i]);
+    }
+    
+    sout | total_operations;
+    // print_stats_now( *active_cluster(), CFA_STATS_READY_Q);
+
+    for ( i; Processors ) {
+        delete(proc[i]);
+    }
+    adelete( chans );
+    // sout | "done";
+    return 0;
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/data/nasus.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/data/nasus.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/data/nasus.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,68 @@
+5
+2 4 8 16 24 32
+CFA Go 
+contend: 
+CFA:
+cores	throughput (entries)
+2	551286815
+2	551571851
+2	552609970
+2	550645159
+2	551408217
+4	401548741
+4	399726800
+4	400805457
+4	400374246
+4	400036245
+8	83833131
+8	85215809
+8	78675522
+8	77117062
+8	78952724
+16	45757611
+16	43434187
+16	43167191
+16	38760778
+16	38089187
+24	49974858
+24	43920833
+24	34870886
+24	38659096
+24	50407137
+32	45780022
+32	35247189
+32	33644070
+32	45037228
+32	41352523
+Go:
+cores	throughput (entries)
+2	311586714
+2	317443340
+2	306943968
+2	313532129
+2	319176028
+4	239546403
+4	237102189
+4	236127253
+4	238228033
+4	238143975
+8	106047415
+8	115591180
+8	109898737
+8	120893507
+8	114025063
+16	40950543
+16	38709696
+16	48643203
+16	48749849
+16	36154667
+24	41250340
+24	32248479
+24	34967215
+24	30199179
+24	42352113
+32	37012621
+32	42679904
+32	36861891
+32	42289651
+32	42185180
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/data/pyke.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/data/pyke.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/data/pyke.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,68 @@
+5
+2 4 8 16 24 32
+CFA Go 
+contend: 
+CFA:
+cores	throughput (entries)
+2	329449063
+2	337588767
+2	361434457
+2	358608413
+2	347994204
+4	149531302
+4	144861313
+4	155833698
+4	148693619
+4	147357220
+8	56837894
+8	55492836
+8	58486345
+8	61065249
+8	57501460
+16	40610682
+16	41502618
+16	40547457
+16	42161859
+16	41104030
+24	38892695
+24	37659117
+24	38517375
+24	39237104
+24	38905810
+32	34053774
+32	33262537
+32	34182192
+32	35591452
+32	33701109
+Go:
+cores	throughput (entries)
+2	262695836
+2	259522629
+2	264620424
+2	263513756
+2	261709432
+4	195640947
+4	198914691
+4	198331166
+4	199846909
+4	194256135
+8	84136662
+8	83617598
+8	82212468
+8	81249230
+8	83531222
+16	37690664
+16	32904283
+16	37513686
+16	36389425
+16	36887196
+24	31560865
+24	30341279
+24	31687458
+24	30711777
+24	30421494
+32	29845150
+32	30053899
+32	29871808
+32	29625722
+32	30007528
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/genPlots
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/genPlots	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/genPlots	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+#!/bin/bash -
+python3 plotData.py data/nasus.txt nasus_
+python3 plotData.py data/pyke.txt pyke_
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/barrier/barrier.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/barrier/barrier.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/barrier/barrier.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,125 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Tasks, BarrierSize int = 1, 1, 2
+var done bool = false;
+var total_operations uint64 = 0
+var m sync.Mutex
+
+var taskJoin chan int = make(chan int, Tasks + 1)
+
+var barWait chan int = make(chan int, 2 * BarrierSize)
+var entryWait chan int = make(chan int, 2 * BarrierSize)
+
+func initBarrier() {
+	for j := 0; j < BarrierSize; j++ {
+		entryWait <- j
+	}
+}
+
+func barrier() {
+	ticket := <-entryWait
+	if ( ticket == -1 ) {
+		entryWait <- -1
+		return
+	}
+	if ( ticket == BarrierSize - 1 ) {
+		for j := 0; j < BarrierSize - 1; j++ {
+			barWait <- j
+		}
+	} else {
+		ticket = <- barWait
+		if ( ticket == -1 ) {
+			barWait <- -1
+			return
+		}
+	}
+
+	// last one out
+	if ( BarrierSize == 1 || ticket == BarrierSize - 2 ) {
+		for j := 0; j < BarrierSize; j++ {
+			entryWait <- j
+		}
+	}
+}
+
+func task() {
+	var count uint64 = 0
+	for {
+		if done { break }
+		barrier()
+		count++
+	}
+	m.Lock()
+	total_operations += count
+	// fmt.Print("C: ",count)
+	m.Unlock()
+	taskJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ BarrierSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, BarrierSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				BarrierSize, _ = strconv.Atoi( os.Args[2] )
+				if BarrierSize < 1 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	Tasks = Processors
+
+	if ( Tasks < BarrierSize ) {
+        Tasks = BarrierSize
+	}
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	taskJoin = make(chan int, Tasks + 1)
+	barWait = make(chan int, 2 * BarrierSize)
+	entryWait = make(chan int, 2 * BarrierSize)
+	initBarrier()
+
+	for j := 0; j < Tasks; j++ {
+		go task()
+	}
+		
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	done = true
+
+	for j := 0; j < BarrierSize; j++ {
+		barWait <- -1
+		entryWait <- -1
+	}
+
+	for j := 0; j < Tasks; j++ {
+		<-taskJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/barrier/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/barrier/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/barrier/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module barrier
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/churn/churn.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/churn/churn.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/churn/churn.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,156 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"math/rand"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Channels, Producers, Consumers, ChannelSize int = 1, 4, 1, 1, 128
+var cons_done, prod_done bool = false, false;
+var total_operations, cons_check, prod_check uint64 = 0, 0, 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int, Producers + 1)
+var consJoin chan int = make(chan int, Consumers + 1)
+
+func getRandArray() []int {
+	chanIndices := make( [] int, Channels )
+	for i := 0; i < Channels; i += 1 {
+		chanIndices[i] = i
+	}
+	for i := 0; i < Channels; i += 1 {
+		var loc_1 int  = rand.Intn(Channels) % Channels
+        var loc_2 int  = rand.Intn(Channels) % Channels;
+        var temp int = chanIndices[loc_1]
+        chanIndices[loc_1] = chanIndices[loc_2]
+        chanIndices[loc_2] = temp
+	}
+	return chanIndices
+}
+
+func consumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	var checksum uint64 = 0
+	var i int = 0
+	chanIndices := getRandArray()
+	for {
+		if cons_done { break }
+		j := <- chans[ chanIndices[ i ] ]
+		i = (i + 1) % Channels
+		checksum = checksum ^ j
+		if ! prod_done { count++ }
+	}
+	m.Lock()
+	total_operations += count
+	cons_check = cons_check ^ checksum
+	m.Unlock()
+	consJoin <- 0
+}
+
+func producer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	var i int = 0
+	var checksum uint64 = 0
+	chanIndices := getRandArray()
+	for {
+		if prod_done { break }
+		chans[ chanIndices[ i ] ] <- count
+		i = (i + 1) % Channels
+		checksum = checksum ^ count
+		count++
+	}
+	m.Lock()
+	total_operations += count
+	prod_check = prod_check ^ checksum
+	m.Unlock()
+	prodJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ ChannelSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, ChannelSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				Channels, _ = strconv.Atoi( os.Args[2] )
+					if Channels < 0 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	Producers = Processors /2
+	Consumers = Processors /2
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," Prods: ",Producers," Cons: ",Consumers," Channel Size: ",ChannelSize)
+
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+
+	for j := 0; j < Consumers; j++ {
+		go consumer( chans )
+	}
+
+	for j := 0; j < Producers; j++ {
+		go producer( chans )
+	}
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	prod_done = true
+
+	for j := 0; j < Producers; j++ {
+		<-prodJoin
+	}
+
+	cons_done = true
+
+	for i := range chans {
+		for j := 0; j < Consumers; j++ {
+			select {
+				case chans[i] <- 0:
+					
+				default:
+					break
+			}
+		}
+	}
+	for j := 0; j < Consumers; j++{
+		<-consJoin
+	}
+	for i := range chans {
+		L: for {
+			select {
+				case k := <-chans[i]:
+					cons_check = cons_check ^ k
+				default:
+					break L
+			}
+		}
+	}
+	if cons_check != prod_check {
+		fmt.Println("\nChecksum mismatch: Cons: %d, Prods: %d", cons_check, prod_check)
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/churn/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/churn/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/churn/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module churn
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/contend/contend.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/contend/contend.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/contend/contend.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,132 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Channels, ProdsPerChan, ConsPerChan, ChannelSize int = 1, 1, 1, 1, 128
+var cons_done, prod_done bool = false, false;
+var total_operations, cons_check, prod_check uint64 = 0, 0, 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int, ProdsPerChan * Channels + 1)
+var consJoin chan int = make(chan int, ConsPerChan * Channels + 1)
+
+func consumer( channel chan uint64 ) {
+	var count uint64 = 0
+	var checksum uint64 = 0
+	for {
+		if cons_done { break }
+		j := <- channel
+		checksum = checksum ^ j
+		if ! prod_done { count++ }
+	}
+	m.Lock()
+	total_operations += count
+	cons_check = cons_check ^ checksum
+	// fmt.Print("C: ",count)
+	m.Unlock()
+	consJoin <- 0
+}
+
+func producer( channel chan uint64 ) {
+	var count uint64 = 0
+	var checksum uint64 = 0
+	for {
+		if prod_done { break }
+		checksum = checksum ^ count
+		channel <- count
+		count++
+	}
+	m.Lock()
+	total_operations += count
+	prod_check = prod_check ^ checksum
+	// fmt.Print("P: ",count, " ")
+	m.Unlock()
+	prodJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ ChannelSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, ChannelSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				ChannelSize, _ = strconv.Atoi( os.Args[2] )
+					if ChannelSize < 0 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	ProdsPerChan = Processors /2
+	ConsPerChan = Processors / 2
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+	for i := range chans {
+		for j := 0; j < ProdsPerChan; j++ {
+			go producer( chans[i] )
+		}
+
+		for j := 0; j < ConsPerChan; j++ {
+			go consumer( chans[i] )
+		}
+	}
+		
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	prod_done = true
+	for j := 0; j < ProdsPerChan * Channels ; j++ {
+		<-prodJoin
+	}
+	// fmt.Println("cons done\n")
+	cons_done = true
+	for i := range chans {
+		L: for {
+			select {
+				case k := <-chans[i]:
+					cons_check = cons_check ^ k
+				default:
+					break L
+			}
+		}
+	}
+	for i := range chans {
+		close(chans[i])
+	}
+
+	for j := 0; j < ConsPerChan * Channels; j++{
+		<-consJoin
+	}
+	
+	
+	if cons_check != prod_check {
+		fmt.Println("\nChecksum mismatch: Cons: %d, Prods: %d", cons_check, prod_check)
+	}
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/contend/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/contend/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/contend/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module contend
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/daisy_chain/daisy_chain.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/daisy_chain/daisy_chain.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/daisy_chain/daisy_chain.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,70 @@
+package main
+
+import (
+	"fmt"
+	"time"
+	"runtime"
+	"sync"
+	"os"
+	"strconv"
+)
+
+var done bool = false;
+var total_operations uint64 = 0
+var Processors int = 1
+var m sync.Mutex
+
+var taskJoin chan int = make(chan int, 2)
+var chain chan int = make(chan int, 2 )
+
+func Task() {
+	var count uint64 = 0 
+	for {
+		if done { break }
+		<-chain
+		chain<-0
+		count++;
+	}
+	
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	taskJoin <- 0
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+			} // if
+		case 1:											// use defaults
+		default:
+			fmt.Printf( "Invalid args" );
+			os.Exit( 1 );
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+
+	taskJoin= make(chan int, Processors)
+	chain= make(chan int, 2 * Processors )
+	
+	chain <- 0
+
+	for i := 0; i < Processors; i++ {
+		go Task()
+	}
+		
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	done = true
+
+	for i := 0; i < Processors; i++ {
+		chain <- 0
+	}
+	for i := 0; i < Processors; i++ {
+		<-taskJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/daisy_chain/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/daisy_chain/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/daisy_chain/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module daisy_chain
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/hot_potato/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/hot_potato/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/hot_potato/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module hot_potato
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/hot_potato/hot_potato.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/hot_potato/hot_potato.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/hot_potato/hot_potato.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,72 @@
+package main
+
+import (
+	"fmt"
+	"time"
+	"runtime"
+	"sync"
+	"os"
+	"strconv"
+)
+
+var done bool = false;
+var total_operations uint64 = 0
+var Processors int = 1
+var m sync.Mutex
+
+var taskJoin chan int = make(chan int, 2)
+
+func Task( chans [] chan uint64, id int ) {
+	var count uint64 = 0
+	right := (id + 1) % Processors
+	for {
+		if done { break }
+		<-chans[id]
+		chans[right]<-0
+		count++;
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	taskJoin <- 0
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+			} // if
+		case 1:											// use defaults
+		default:
+			fmt.Printf( "Invalid args" );
+			os.Exit( 1 );
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+
+	taskJoin = make(chan int, Processors)
+	chans := make( [] chan uint64, Processors )
+	for i := range chans {
+		chans[i] = make(chan uint64, 3)
+	}
+
+	chans[0] <- 0
+
+	for i := 0; i < Processors; i++ {
+		go Task( chans, i )
+	}
+		
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	done = true
+
+	for i := 0; i < Processors; i++ {
+		chans[i] <- 0
+	}
+	for i := 0; i < Processors; i++ {
+		<-taskJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/ping_pong/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/ping_pong/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/ping_pong/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module ping_pong
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/ping_pong/ping_pong.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/ping_pong/ping_pong.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/ping_pong/ping_pong.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,54 @@
+package main
+
+import (
+	"fmt"
+	"time"
+	"runtime"
+)
+
+var done bool = false;
+var total_operations uint64 = 0
+
+var taskJoin chan int = make(chan int, 2)
+
+var ping chan int = make(chan int, 2 )
+var pong chan int = make(chan int, 2 )
+
+func Ping() {
+	for {
+		if done { break }
+		pong <- 1
+		<-ping
+	}
+	taskJoin <- 0
+}
+
+func Pong() {
+	for {
+		if done { break }
+		<-pong
+		ping <- 0
+		total_operations++
+	}
+	taskJoin <- 0
+}
+
+func main() {
+	runtime.GOMAXPROCS( 2 );
+
+	go Ping()
+	go Pong()
+		
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	done = true
+
+	ping <- 2
+	pong <- 2
+
+	<-taskJoin
+	<-taskJoin
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/pub_sub/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/pub_sub/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/pub_sub/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module pub_sub
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/go/pub_sub/pub_sub.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/go/pub_sub/pub_sub.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/go/pub_sub/pub_sub.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,145 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Tasks int = 1, 1
+var BarrierSize int = 2
+var done bool = false;
+var total_operations uint64 = 0
+var m sync.Mutex
+
+var taskJoin chan int = make(chan int, Tasks + 1)
+
+var barWait chan int = make(chan int, 2 * BarrierSize)
+var entryWait chan int = make(chan int, 2 * BarrierSize)
+
+func flushBarrier() {
+	for j := 0; j < BarrierSize; j++ {
+		barWait <- -1
+		entryWait <- -1
+	}
+}
+
+func initBarrier() {
+	for j := 0; j < BarrierSize; j++ {
+		entryWait <- j
+	}
+}
+
+func barrier() {
+	ticket := <-entryWait
+	if ( ticket == -1 ) {
+		entryWait <- -1
+		return
+	}
+	if ( ticket == BarrierSize - 1 ) {
+		for j := 0; j < BarrierSize - 1; j++ {
+			barWait <- j
+		}
+	} else {
+		ticket = <- barWait
+		if ( ticket == -1 ) {
+			barWait <- -1
+			return
+		}
+	}
+
+	// last one out
+	if ( BarrierSize == 1 || ticket == BarrierSize - 2 ) {
+		for j := 0; j < BarrierSize; j++ {
+			entryWait <- j
+		}
+	}
+}
+
+func task( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if done { break }
+		for j := 0; j < Tasks; j++ {
+			chans[j] <- 0
+		}
+
+		for j := 0; j < Tasks; j++ {
+			<- chans[j]
+		}
+		barrier()
+		count++
+	}
+	m.Lock()
+	total_operations += count
+	// fmt.Print("C: ",count)
+	m.Unlock()
+	taskJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ BarrierSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, BarrierSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				Tasks, _ = strconv.Atoi( os.Args[2] )
+				if Tasks < 1 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	Tasks = Processors
+	BarrierSize = Tasks
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	taskJoin = make(chan int, Tasks + 1)
+	barWait = make(chan int, 2 * BarrierSize)
+	entryWait = make(chan int, 2 * BarrierSize)
+	initBarrier()
+
+	chans := make( [] chan uint64, Tasks )
+	for i := range chans {
+		chans[i] = make(chan uint64, 2 * Tasks)
+	}
+
+	for j := 0; j < Tasks; j++ {
+		go task( chans )
+	}
+		
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	done = true
+
+	for i := 0; i < Tasks; i++ {
+		for j := 0; j < Tasks; j++ {
+			chans[i] <- 0
+		}
+	}
+
+	flushBarrier()
+	
+	for j := 0; j < Tasks; j++ {
+		<-taskJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/plotData.py
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/plotData.py	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/plotData.py	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,157 @@
+import os
+import sys
+import time
+import itertools
+import matplotlib.pyplot as plt
+import matplotlib.ticker as ticks
+import math
+from scipy import stats as st
+import numpy as np
+from enum import Enum
+from statistics import median
+
+import matplotlib
+matplotlib.use("pgf")
+matplotlib.rcParams.update({
+    "pgf.texsystem": "pdflatex",
+    'font.family': 'serif',
+    'text.usetex': True,
+    'pgf.rcfonts': False,
+    'font.size': 16
+})
+marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' ))
+
+def sci_format(x, pos):
+    return '{:.1e}'.format(x).replace('+0', '')
+
+readfile = open(sys.argv[1], "r")
+
+machineName = ""
+
+if len(sys.argv) > 2:
+    machineName = sys.argv[2]
+
+# first line has num times per experiment
+line = readfile.readline()
+numTimes = int(line)
+
+# second line has processor args
+line = readfile.readline()
+procs = []
+for val in line.split():
+    procs.append(int(val))
+
+# 3rd line has number of variants
+line = readfile.readline()
+names = line.split()
+numVariants = len(names)
+
+lines = (line.rstrip() for line in readfile) # All lines including the blank ones
+lines = (line for line in lines if line) # Non-blank lines
+
+class Bench(Enum):
+    Unset = 0
+    Contend = 1
+    Zero = 2
+    Barrier = 3
+    Churn = 4
+    Daisy_Chain = 5
+    Hot_Potato = 6
+    Pub_Sub = 7
+
+nameSet = False
+currBench = Bench.Unset # default val
+count = 0
+procCount = 0
+currVariant = 0
+experiment_duration = 10.0
+name = ""
+title = ""
+var_name = ""
+sendData = [0.0 for j in range(numVariants)]
+data = [[0.0 for i in range(len(procs))] for j in range(numVariants)]
+bars = [[[0.0 for i in range(len(procs))],[0.0 for k in range(len(procs))]] for j in range(numVariants)]
+tempData = [0.0 for i in range(numTimes)]
+for idx, line in enumerate(lines):
+    # print(line)
+    
+    if currBench == Bench.Unset:
+        if line == "contend:":
+            name = "Channel_Contention"
+            title = "Channel Contention"
+            currBench = Bench.Contend
+        elif line == "zero:":
+            name = "Zero"
+            currBench = Bench.Zero
+        elif line == "barrier:":
+            name = "Barrier"
+            currBench = Bench.Barrier
+        elif line == "churn:":
+            name = "Churn"
+            currBench = Bench.Churn
+        elif line == "daisy_chain:":
+            name = "Daisy_Chain"
+            currBench = Bench.Daisy_Chain
+        elif line == "hot_potato:":
+            name = "Hot_Potato"
+            currBench = Bench.Hot_Potato
+        elif line == "pub_sub:":
+            name = "Pub_Sub"
+            currBench = Bench.Pub_Sub
+        else:
+            print("Expected benchmark name")
+            print("Line: " + line)
+            sys.exit()
+        continue
+
+    if line[0:5] == "cores":
+        continue
+
+    if not nameSet:
+        nameSet = True
+        continue
+    
+    lineArr = line.split()
+    tempData[count] = float(lineArr[-1]) / experiment_duration
+    count += 1
+    if count == numTimes:
+        currMedian = median( tempData )
+        data[currVariant][procCount] = currMedian
+        lower, upper = st.t.interval(0.95, numTimes - 1, loc=np.mean(tempData), scale=st.sem(tempData))
+        bars[currVariant][0][procCount] = currMedian - lower
+        bars[currVariant][1][procCount] = upper - currMedian
+        count = 0
+        procCount += 1
+
+        if procCount == len(procs):
+            procCount = 0
+            nameSet = False
+            currVariant += 1
+
+            if currVariant == numVariants:
+                fig, ax = plt.subplots(layout='constrained')
+                if title != "":
+                    plt.title(title + " Benchmark")
+                    title = ""
+                else:
+                    plt.title(name + " Benchmark")
+                plt.ylabel("Throughput (channel operations per second)")
+                plt.xlabel("Cores")
+                ax.yaxis.set_major_formatter(ticks.FuncFormatter(sci_format))
+                for idx, arr in enumerate(data):
+                    plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker=next(marker) )
+                marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' )) 
+                # plt.yscale("log")
+                # plt.ylim(1, None)
+                # ax.get_yaxis().set_major_formatter(ticks.ScalarFormatter())
+                # else:
+                #     plt.ylim(0, None)
+                plt.xticks(procs)
+                ax.legend(names)
+                # fig.savefig("plots/" + machineName + name + ".png")
+                plt.savefig("plots/" + machineName + name + ".pgf")
+                fig.clf()
+
+                # reset
+                currBench = Bench.Unset
+                currVariant = 0
Index: doc/theses/colby_parsons_MMath/benchmarks/channels/run
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/channels/run	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/channels/run	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,223 @@
+#!/bin/bash -
+
+false=0; true=1
+
+# Usage: arch [ hostname ] returns hostname, cores, startcore
+#
+#   Define machine architecture based on starting socket, CPUs (cores) per socket, number of
+#   sockets, has hyperthreading.
+
+start=0
+
+arch() {
+	hostname=${1:-`hostname`}			# return value
+	hashyper=${true}					# assume machine has hyperthreads
+	if [ "${hostname}" = "plg2" ] ; then
+		startsocket=${start}
+		cps=16							# coresPerSocket
+		sockets=2
+		hashyper=${false}				# has no hyperthreads
+	elif [ "${hostname}" = "nasus" ] ; then
+		startsocket=${start}
+		cps=64							# coresPerSocket
+		sockets=2
+	elif [ "${hostname}" = "pyke" ] ; then
+		startsocket=${start}
+		cps=24							# coresPerSocket
+		sockets=2
+	elif [ "${hostname}" = "jax" ] ; then
+		startsocket=${start}
+		cps=24							# coresPerSocket
+		sockets=4
+	else
+		echo "unsupported host" ${hostname}
+		exit 1
+	fi
+	cores=$(( ${cps} * ${sockets} ))
+	startcore=$(( ${startsocket} * ${cps} ))
+}
+
+# Usage: affinity (global cps, sockets, startsocket, hashyper, cores, startcore, wrap)
+#   returns taskset argument
+#
+#   This routine assumes hyperthreading has only 2 hyperthreads per core.
+#
+#   If hyperthread scanning is used: processor units are assigned across the low-number hyperthreads
+#   of the socket's cores. When the low-number hyperthreads are filled, the high-number hyperhtreads
+#   are assigned across the socket's cores. Then the next socket is assigned.
+#
+#   If hyperthread wrapping is used: processor units are assigned in low/high-number pairs of
+#   hyperthreads across the socket's cores. Then the next socket is assigned.
+
+wrap=${false}							# set to control hyperthread assignment across socket cores
+
+affinity() {
+	if [ ${wrap} -eq ${true} -a ${hashyper} -eq ${false} ] ; then
+		echo "architecture does not support hyperthreading for wrapping"
+		exit 1
+	fi
+	taskset=""							# return value
+	set -- $(( ${1} - 1 ))				# decrement $1
+	if [ ${1} -eq 0 ] ; then taskset="${startcore}-${startcore}"; return; fi
+	if [ ${1} -ge $(( ${cps} * ( ${sockets} - ${startsocket} ) * ( ${hashyper} + 1 ) )) ] ; then # error
+		echo "not enough cores $(( ${cores} * ${sockets} )) for $(( ${1} + 1 )) starting at ${startcore}"
+		exit 1
+	fi
+	if [ ${hashyper} -eq ${false} ] ; then taskset="${startcore}-$(( ${1} + ${startcore} ))"; return; fi # no hyperthreads
+	start2=$(( ${startcore} + ${cores} ))
+	if [ ${wrap} -eq ${true} ] ; then 	# hyperthread wrapping
+		end1=$(( ${1} / 2 + ${startcore} ))
+		end2=$(( ${end1} + ${cores} ))
+		if [ $(( ${1} % 2 )) -eq 0 ] ; then
+			end2=$(( ${end2} - 1 ))
+		fi
+		taskset="${startcore}-${end1},${start2}-${end2}"
+	else								# hyperthread scanning
+		if [ ${1} -lt ${cps} ] ; then taskset="${startcore}-$(( ${1} + ${startcore} ))"; return; fi
+		filled=$(( ${1} / ( ${cps} * 2 ) * ${cps} ))
+		modulus=$(( ${1} % ( ${cps} * 2 ) ))	# leftover cores added to saturated sockets
+		if [ ${modulus} -gt ${cps} ] ; then
+			taskset="${startcore}-$(( ${startcore} + ${filled} + ${cps} - 1 )),${start2}-$(( ${start2} + ${filled} + ${modulus} % ${cps} ))"
+		else
+			taskset="${startcore}-$(( ${startcore} + ${filled} + ${modulus} )),${start2}-$(( ${start2} + ${filled} - 1 ))"
+		fi
+	fi
+}
+
+numtimes=5
+
+num_threads='2 4 8 16 24 32'
+# num_threads='2'
+
+# toggle benchmarks
+zero=${false}
+contend=${true}
+barrier=${false}
+churn=${false}
+daisy_chain=${false}
+hot_potato=${false}
+pub_sub=${false}
+
+runCFA=${true}
+runGO=${true}
+# runCFA=${false}
+# runGO=${false}
+
+cfa=~/cfa-cc/driver/cfa
+
+# Helpers to minimize code duplication
+
+# repeats a command ${numtimes}
+preprint=''
+repeat_command() {
+    t=1
+    while [ ${t} -le ${numtimes} ] ; do
+        echo -n -e ${preprint}
+        "${@}"
+        t=`expr ${t} + 1`
+    done
+}
+
+# prints the leading info for a given run of a variant
+print_header() {
+    echo ${1}':'
+    echo -e "cores\tthroughput (entries)"
+}
+
+# runs the current benchmark with provided args
+# only works for standard-run benchmarks (not Akka)
+# must split into pre and post args to be able to supply val of p
+pre_args=''
+post_args=''
+single_run() {
+    affinity ${1}
+    preprint="${1}\t"
+    repeat_command taskset -c ${taskset} ./a.${hostname} ${pre_args} ${1} ${post_args}
+}
+
+# runs the current bench for all processor vals
+# works for standard benchs that dont need to set a config file (not Akka or CAF)
+run_bench() {
+    for p in ${num_threads} ; do
+        single_run ${p}
+    done
+}
+
+arch # get hostname
+
+# set up leading info for python script
+echo $numtimes
+echo $num_threads
+
+if [ ${runCFA} -eq ${true} ]; then
+    echo -n 'CFA '
+fi
+if [ ${runGO} -eq ${true} ]; then
+    echo -n 'Go '
+fi
+echo ""
+
+# done printing header info for output
+
+# cfa flags
+cfa_flags='-quiet -O3 -nodebug -DNDEBUG'
+
+# run the benchmarks
+
+run_contend() {
+    post_args=${1}
+
+    if [ ${runCFA} -eq ${true} ] ; then
+        cd cfa # CFA RUN
+        print_header 'CFA'
+        ${cfa} ${cfa_flags} ${2}.cfa -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done CFA
+
+    if [ ${runGO} -eq ${true} ] ; then
+        cd go/${2} # Go RUN
+        print_header 'Go'
+        go build -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done Go
+}
+
+# /usr/bin/time -f "%Uu %Ss %Er %Mkb"
+if [ ${contend} -eq ${true} ] ; then
+    echo "contend: "
+    run_contend '128' 'contend'
+fi
+
+if [ ${zero} -eq ${true} ] ; then
+    echo "zero: "
+    run_contend '0' 'contend'
+fi
+
+if [ ${barrier} -eq ${true} ] ; then
+    echo "barrier: "
+    run_contend '' 'barrier'
+fi
+
+if [ ${churn} -eq ${true} ] ; then
+    echo "churn: "
+    run_contend '' 'churn'
+fi
+
+if [ ${daisy_chain} -eq ${true} ] ; then
+    echo "daisy_chain: "
+    run_contend '' 'daisy_chain'
+fi
+
+if [ ${hot_potato} -eq ${true} ] ; then
+    echo "hot_potato: "
+    run_contend '' 'hot_potato'
+fi
+
+if [ ${pub_sub} -eq ${true} ] ; then
+    echo "pub_sub: "
+    run_contend '' 'pub_sub'
+fi
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/bench.h
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/bench.h	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/bench.h	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,94 @@
+#pragma once
+
+#if defined(__cforall)
+extern "C" {
+#endif
+	#include <stdlib.h>
+	#include <stdint.h>				// uint64_t
+	#include <unistd.h>				// sysconf
+#if ! defined(__cforall)
+	#include <time.h>
+	#include <sys/time.h>
+#else
+}
+#include <time.hfa>
+#endif
+
+#define L1 l1
+#define L2 L1, l2
+#define L3 L2, l3
+#define L4 L3, l4
+#define L5 L4, l5
+#define L6 L5, l6
+#define L7 L6, l7
+#define L8 L7, l8
+
+static inline uint64_t bench_time() {
+	struct timespec ts;
+	clock_gettime( CLOCK_THREAD_CPUTIME_ID, &ts );
+	return 1000000000LL * ts.tv_sec + ts.tv_nsec;
+} // bench_time
+
+
+#if defined(__cforall)
+struct test_spinlock {
+	volatile bool lock;
+};
+
+static inline void lock( test_spinlock & this ) {
+	for ( ;; ) {
+		if ( (this.lock == 0) && (__atomic_test_and_set( &this.lock, __ATOMIC_ACQUIRE ) == 0) ) break;
+	}
+}
+
+static inline void unlock( test_spinlock & this ) {
+	__atomic_clear( &this.lock, __ATOMIC_RELEASE );
+}
+#endif
+
+size_t threads = 1, num_locks = -1;
+
+#define BENCH_START()				\
+	if ( argc > 3 ) exit( EXIT_FAILURE );	\
+	if ( argc == 2 ) {			\
+		threads = atoi( argv[1] );	\
+	} else if ( argc == 3 ) {			\
+		threads = atoi( argv[1] );	\
+        num_locks = atoi( argv[2] );	\
+	}
+
+#define BENCH(statement, output, done_flag)		\
+	uint64_t count = 0;		\
+    while (true) {          \
+	statement;				\
+    count++;                \
+    if (done_flag) break; \
+    }                       \
+    __atomic_add_fetch(&output, count, __ATOMIC_SEQ_CST);
+	// EndTime = bench_time();			\
+	// double output = (double)( EndTime - StartTime ) / times;
+
+
+#if defined(__cforall)
+Duration default_preemption() {
+	return 0;
+}
+#endif
+#if defined(__U_CPLUSPLUS__)
+unsigned int uDefaultPreemption() {
+	return 0;
+}
+#endif
+
+// splitmix64 rand num generator
+// https://rosettacode.org/wiki/Pseudo-random_numbers/Splitmix64
+uint64_t state;                                  /* The state can be seeded with any (upto) 64 bit integer value. */
+
+uint64_t next_int() {
+    state += 0x9e3779b97f4a7c15;               /* increment the state variable */
+    uint64_t z = state;                          /* copy the state to a working variable */
+    z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;  /* xor the variable with the variable right bit shifted 30 then multiply by a constant */
+    z = (z ^ (z >> 27)) * 0x94d049bb133111eb;  /* xor the variable with the variable right bit shifted 27 then multiply by a constant */
+    return z ^ (z >> 31);                      /* return the variable xored with itself right bit shifted 31 */
+}
+
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cfa/baseline.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cfa/baseline.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cfa/baseline.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,62 @@
+#include <locks.hfa>
+#include <mutex_stmt.hfa>
+#include <stdio.h>
+
+#include "../bench.h"
+
+test_spinlock LOCKS;
+
+inline void lock( test_spinlock &a, test_spinlock &b ) {
+    lock(a); lock(b);
+}
+inline void lock( test_spinlock &a, test_spinlock &b, test_spinlock &c, test_spinlock &d ) {
+    lock(a); lock(b); lock(c); lock(d);
+}
+inline void lock( test_spinlock &a, test_spinlock &b, test_spinlock &c, test_spinlock &d, test_spinlock &e, test_spinlock &f, test_spinlock &g, test_spinlock &h ) {
+    lock(a); lock(b); lock(c); lock(d); lock(e); lock(f); lock(g); lock(h);
+}
+inline void unlock( test_spinlock &a, test_spinlock &b ) {
+    unlock(a); unlock(b);
+}
+inline void unlock( test_spinlock &a, test_spinlock &b, test_spinlock &c, test_spinlock &d ) {
+    unlock(a); unlock(b); unlock(c); unlock(d);
+}
+inline void unlock( test_spinlock &a, test_spinlock &b, test_spinlock &c, test_spinlock &d, test_spinlock &e, test_spinlock &f, test_spinlock &g, test_spinlock &h ) {
+    unlock(a); unlock(b); unlock(c); unlock(d); unlock(e); unlock(f); unlock(g); unlock(h);
+}
+
+bool done = false;
+uint64_t total = 0;
+thread worker {};
+static inline void ?{}( worker & this, cluster & clu ) {
+    ((thread &)this){ clu };
+}
+void main( worker & w ) {
+    BENCH( lock( LOCKS ); unlock( LOCKS );, total, done )
+}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+    cluster clus;
+    processor * proc[threads];
+    for ( i; threads ) // create procs
+        (*(proc[i] = alloc())){clus};
+
+    worker * w[threads];
+    for ( i; threads ) // create threads
+        (*(w[i] = alloc())){ clus };
+    
+    sleep( 10`s );
+    done = true;
+
+    for ( i; threads ) // delete threads
+        delete(w[i]);
+
+    for ( i; threads ) // delete procs
+        delete(proc[i]);
+	printf( "%lu\n", total );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cfa/order.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cfa/order.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cfa/order.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,43 @@
+#include <locks.hfa>
+#include <mutex_stmt.hfa>
+#include <stdio.h>
+
+#include "../bench.h"
+
+test_spinlock LOCKS;
+
+bool done = false;
+uint64_t total = 0;
+thread worker {};
+static inline void ?{}( worker & this, cluster & clu ) {
+    ((thread &)this){ clu };
+}
+void main( worker & w ) {
+    BENCH( mutex ( LOCKS ) { }, total, done )
+}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+    cluster clus;
+    processor * proc[threads];
+    for ( i; threads ) // create procs
+        (*(proc[i] = alloc())){clus};
+
+    worker * w[threads];
+    for ( i; threads ) // create threads
+        (*(w[i] = alloc())){ clus };
+    
+    sleep( 10`s );
+    done = true;
+
+    for ( i; threads ) // delete threads
+        delete(w[i]);
+
+    for ( i; threads ) // delete procs
+        delete(proc[i]);
+	printf( "%lu\n", total );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cfa/rand.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cfa/rand.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cfa/rand.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,120 @@
+#include <locks.hfa>
+#include <mutex_stmt.hfa>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "../bench.h"
+
+test_spinlock LOCKS;
+
+test_spinlock ** lock_arr;
+
+inline void locks( size_t * arr ) {
+    if (num_locks == 2) {
+        mutex( *lock_arr[arr[0]], *lock_arr[arr[1]] ) {}
+    } else if (num_locks == 4) {
+        mutex( *lock_arr[arr[0]], *lock_arr[arr[1]], *lock_arr[arr[2]], *lock_arr[arr[3]] ) {}
+    } else if (num_locks == 8) {
+        mutex( *lock_arr[arr[0]], *lock_arr[arr[1]], *lock_arr[arr[2]], *lock_arr[arr[3]], *lock_arr[arr[4]], *lock_arr[arr[5]], *lock_arr[arr[6]], *lock_arr[arr[7]] ) {}
+    }
+}
+
+bool done = false;
+uint64_t total = 0;
+size_t num_gen = 100; // number of rand orderings per thd
+size_t ** rand_arrs;
+
+// generate repeatable orderings for each experiment
+void gen_orders() {
+    rand_arrs = aalloc( threads );
+    for ( i; threads )
+        rand_arrs[i] = aalloc( num_locks * num_gen );
+
+    size_t work_arr[num_locks];
+
+    for ( i; num_locks )
+        work_arr[i] = i;
+
+    size_t curr_idx;
+    for ( i; threads ) {
+        state = i;
+        curr_idx = 0;
+        for ( j; num_gen ) {
+            for ( size_t k = num_locks; k > 0; k-- ) {
+                size_t rand_idx = next_int() % k; // choose one of remaining elems in work_arr
+                rand_arrs[i][curr_idx] = work_arr[rand_idx];
+                curr_idx++;
+
+                // swap chosen elem to end so it isn't picked again
+                size_t temp = work_arr[rand_idx];
+                work_arr[rand_idx] = work_arr[k - 1];
+                work_arr[k - 1] = temp;
+            }
+        }
+        
+    }
+}
+
+thread worker { size_t * my_arr; };
+static inline void ?{}( worker & this, cluster & clu, size_t id ) {
+    ((thread &)this){ clu };
+    this.my_arr = rand_arrs[id];
+}
+
+void main( worker & w ) with(w) {
+    uint64_t count = 0;
+    while (true) {
+        locks( my_arr + (count % num_gen) * num_locks ); // go to start of next sequence of locks
+        count++;
+        if (done) break;
+    }
+    __atomic_add_fetch(&total, count, __ATOMIC_SEQ_CST);
+}
+    
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+    if ( num_locks == -1 ) { printf("must pass # of locks to program!\n"); exit( EXIT_FAILURE ); }
+    cluster clus;
+    processor * proc[threads];
+    for ( i; threads ) // create procs
+        (*(proc[i] = alloc())){clus};
+
+    lock_arr = aalloc( num_locks );
+
+    if (num_locks >= 2) {
+        lock_arr[0] = &l1; lock_arr[1] = &l2;
+    }
+    if (num_locks >= 4) {
+        lock_arr[2] = &l3; lock_arr[3] = &l4;
+    }
+    if (num_locks == 8) {
+        lock_arr[4] = &l5; lock_arr[5] = &l6; lock_arr[6] = &l7; lock_arr[7] = &l8;
+    }
+
+    gen_orders();
+
+    worker * w[threads];
+    for ( i; threads ) // create threads
+        (*(w[i] = alloc())){ clus, i };
+    
+    sleep( 10`s );
+    done = true;
+
+    for ( i; threads ) // delete threads
+        delete(w[i]);
+
+    for ( i; threads ) // delete procs
+        delete(proc[i]);
+
+    for ( i; threads )
+        adelete(rand_arrs[i]);
+    adelete(rand_arrs);
+
+    adelete(lock_arr);
+    
+	printf( "%lu\n", total );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/baseline.cc
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/baseline.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/baseline.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,36 @@
+#include <cstdio>
+#include <mutex>
+#include <thread>
+#include <chrono>
+#include "../bench.h"
+#include "cppLock.hpp"
+
+cpp_test_spinlock LOCKS;
+
+bool done = false;
+uint64_t total = 0;
+void thread_main() {
+    BENCH( lock( LOCKS ); unlock( LOCKS );, total, done )
+}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+    std::thread myThreads[threads];
+
+    for (int i = 0; i < threads; i++) {
+        myThreads[i] = std::thread(thread_main); // move constructed
+    }
+
+    std::this_thread::sleep_for (std::chrono::seconds(10));
+    done = true;
+    
+    for (int i = 0; i < threads; i++) {
+        myThreads[i].join();
+    }
+
+	printf( "%lu\n", total );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/cppLock.hpp
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/cppLock.hpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/cppLock.hpp	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,37 @@
+class cpp_test_spinlock {
+	volatile bool lockBool = 0;
+
+  public:
+	inline void lock() {
+		for ( ;; ) {
+			if ( (this->lockBool == 0) && (__atomic_test_and_set( &this->lockBool, __ATOMIC_ACQUIRE ) == 0) ) break;
+		}
+	}
+
+	inline bool try_lock() {
+		return (this->lockBool == 0) && (__atomic_test_and_set( &this->lockBool, __ATOMIC_ACQUIRE ) == 0);
+	}
+
+	inline void unlock() {
+		__atomic_clear( &this->lockBool, __ATOMIC_RELEASE );
+	}
+};
+
+inline void lock( cpp_test_spinlock &a, cpp_test_spinlock &b ) {
+    a.lock(); b.lock();
+}
+inline void lock( cpp_test_spinlock &a, cpp_test_spinlock &b, cpp_test_spinlock &c, cpp_test_spinlock &d ) {
+    a.lock(); b.lock(); c.lock(); d.lock();
+}
+inline void lock( cpp_test_spinlock &a, cpp_test_spinlock &b, cpp_test_spinlock &c, cpp_test_spinlock &d, cpp_test_spinlock &e, cpp_test_spinlock &f, cpp_test_spinlock &g, cpp_test_spinlock &h ) {
+    a.lock(); b.lock(); c.lock(); d.lock(); e.lock(); f.lock(); g.lock(); h.lock();
+}
+inline void unlock( cpp_test_spinlock &a, cpp_test_spinlock &b ) {
+    a.unlock(); b.unlock();
+}
+inline void unlock( cpp_test_spinlock &a, cpp_test_spinlock &b, cpp_test_spinlock &c, cpp_test_spinlock &d ) {
+    a.unlock(); b.unlock(); c.unlock(); d.unlock();
+}
+inline void unlock( cpp_test_spinlock &a, cpp_test_spinlock &b, cpp_test_spinlock &c, cpp_test_spinlock &d, cpp_test_spinlock &e, cpp_test_spinlock &f, cpp_test_spinlock &g, cpp_test_spinlock &h ) {
+    a.unlock(); b.unlock(); c.unlock(); d.unlock(); e.unlock(); f.unlock(); g.unlock(); h.unlock();
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/order.cc
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/order.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/order.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,36 @@
+#include <cstdio>
+#include <mutex>
+#include <thread>
+#include <chrono>
+#include "../bench.h"
+#include "cppLock.hpp"
+
+cpp_test_spinlock LOCKS;
+
+bool done = false;
+uint64_t total = 0;
+void thread_main() {
+    BENCH( std::scoped_lock lock( LOCKS );, total, done )
+}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+    std::thread myThreads[threads];
+
+    for (int i = 0; i < threads; i++) {
+        myThreads[i] = std::thread(thread_main); // move constructed
+    }
+
+    std::this_thread::sleep_for (std::chrono::seconds(10));
+    done = true;
+    
+    for (int i = 0; i < threads; i++) {
+        myThreads[i].join();
+    }
+
+	printf( "%lu\n", total );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/rand.cc
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/rand.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/cpp/rand.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,110 @@
+#include <cstdio>
+#include <mutex>
+#include <thread>
+#include <chrono>
+#include <stdlib.h>
+#include "cppLock.hpp"
+
+#include "../bench.h"
+
+cpp_test_spinlock LOCKS;
+cpp_test_spinlock  ** lock_arr;
+
+inline void locks( size_t * arr ) {
+    if (num_locks == 2) {
+        std::scoped_lock lock( *lock_arr[arr[0]], *lock_arr[arr[1]] );
+    } else if (num_locks == 4) {
+        std::scoped_lock lock( *lock_arr[arr[0]], *lock_arr[arr[1]], *lock_arr[arr[2]], *lock_arr[arr[3]] );
+    } else if (num_locks == 8) {
+        std::scoped_lock lock( *lock_arr[arr[0]], *lock_arr[arr[1]], *lock_arr[arr[2]], *lock_arr[arr[3]], *lock_arr[arr[4]], *lock_arr[arr[5]], *lock_arr[arr[6]], *lock_arr[arr[7]] );
+    }
+}
+
+bool done = false;
+uint64_t total = 0;
+size_t num_gen = 100; // number of rand orderings per thd
+size_t ** rand_arrs;
+
+// generate repeatable orderings for each experiment
+void gen_orders() {
+    rand_arrs = new size_t *[threads];
+    for ( int i = 0; i < threads; i++ )
+        rand_arrs[i] = new size_t[ num_locks * num_gen ];
+
+    size_t work_arr[num_locks];
+
+    for ( int i = 0; i < num_locks; i++ )
+        work_arr[i] = i;
+
+    size_t curr_idx;
+    for ( int i = 0; i < threads; i++ ) {
+        state = i;
+        curr_idx = 0;
+        for ( int j = 0; j < num_gen; j++ ) {
+            for ( size_t k = num_locks; k > 0; k-- ) {
+                size_t rand_idx = next_int() % k; // choose one of remaining elems in work_arr
+                rand_arrs[i][curr_idx] = work_arr[rand_idx];
+                curr_idx++;
+
+                // swap chosen elem to end so it isn't picked again
+                size_t temp = work_arr[rand_idx];
+                work_arr[rand_idx] = work_arr[k - 1];
+                work_arr[k - 1] = temp;
+            }
+        }
+        
+    }
+}
+
+void thread_main( int id ) {
+    size_t * my_arr = rand_arrs[id];
+    uint64_t count = 0;
+    while (true) {
+        locks( my_arr + (count % num_gen) * num_locks );
+        count++;
+        if (done) break;
+    }
+    __atomic_add_fetch(&total, count, __ATOMIC_SEQ_CST);
+}
+
+int main( int argc, char * argv[] ) {
+	BENCH_START()
+    if ( num_locks == -1 ) { printf("must pass # of locks to program!\n"); exit( EXIT_FAILURE ); }
+    
+    lock_arr = new cpp_test_spinlock *[ num_locks ];
+
+    if (num_locks >= 2) {
+        lock_arr[0] = &l1; lock_arr[1] = &l2;
+    }
+    if (num_locks >= 4) {
+        lock_arr[2] = &l3; lock_arr[3] = &l4;
+    }
+    if (num_locks == 8) {
+        lock_arr[4] = &l5; lock_arr[5] = &l6; lock_arr[6] = &l7; lock_arr[7] = &l8;
+    }
+
+    gen_orders();
+
+    std::thread myThreads[threads];
+    for (int i = 0; i < threads; i++) {
+        myThreads[i] = std::thread(thread_main, i); // move constructed
+    }
+
+    std::this_thread::sleep_for (std::chrono::seconds(10));
+    done = true;
+    
+    for (int i = 0; i < threads; i++) {
+        myThreads[i].join();
+    }
+
+    for ( int i = 0; i < threads; i++ )
+        delete[] rand_arrs[i];
+    delete[] rand_arrs;
+    delete[] lock_arr;
+
+	printf( "%lu\n", total );
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/data/nasus.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/data/nasus.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/data/nasus.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,826 @@
+11
+2 4 8 16 24 32
+2 4 8 
+CFA-baseline CPP-baseline CFA-rand CPP-rand 
+locks: 2
+CFA-baseline:
+cores	throughput (entries)
+2	77079493
+2	77146030
+2	78647422
+2	78351981
+2	78665763
+2	77624285
+2	78744619
+2	77439962
+2	77081095
+2	77554735
+2	78577864
+4	50537314
+4	60737039
+4	50523683
+4	50461536
+4	50426952
+4	50559428
+4	51138857
+4	51205573
+4	50674923
+4	50425730
+4	50465707
+8	24281863
+8	26629412
+8	26662506
+8	24230920
+8	24602094
+8	26688981
+8	26580917
+8	25967548
+8	23680294
+8	24187135
+8	23644833
+16	19158111
+16	20213031
+16	18096541
+16	18064819
+16	19134101
+16	19986908
+16	18058102
+16	19090520
+16	24054563
+16	20314381
+16	19861678
+24	18241849
+24	18288540
+24	19127375
+24	21489265
+24	18154181
+24	19468045
+24	18305226
+24	19701077
+24	19438093
+24	18085407
+24	18194915
+32	17729433
+32	19365158
+32	17672719
+32	17683978
+32	17635729
+32	18715801
+32	17726868
+32	17719413
+32	17787385
+32	17717981
+32	17646357
+CPP-baseline:
+cores	throughput (entries)
+2	82587107
+2	82711263
+2	82623017
+2	82642460
+2	82673739
+2	82598099
+2	82639820
+2	82657708
+2	82528616
+2	82659003
+2	82634209
+4	89336994
+4	89997420
+4	77356141
+4	89491167
+4	89433094
+4	78268165
+4	89054019
+4	77516059
+4	91976879
+4	78873945
+4	89899845
+8	29312436
+8	29345105
+8	29899699
+8	29935004
+8	26572631
+8	29704910
+8	29004298
+8	27729805
+8	29880618
+8	29313571
+8	29319006
+16	24157367
+16	18893499
+16	20009432
+16	23138058
+16	23096888
+16	23127360
+16	18508406
+16	23115140
+16	19582723
+16	19694168
+16	18585765
+24	19025036
+24	18749003
+24	19129834
+24	22778610
+24	22827063
+24	22843323
+24	18591656
+24	22841697
+24	22812195
+24	18949500
+24	19033235
+32	21900566
+32	18058318
+32	18336453
+32	18392635
+32	18197834
+32	18239837
+32	18051066
+32	21905523
+32	21895774
+32	18735399
+32	21892301
+
+CFA-rand:
+cores	throughput (entries)
+2	67139387
+2	66656679
+2	68342611
+2	66788128
+2	67299518
+2	65896926
+2	66471034
+2	68759389
+2	67552322
+2	66248961
+2	67150860
+4	46871177
+4	46624286
+4	46497395
+4	46788288
+4	46681442
+4	46616364
+4	46801563
+4	46850742
+4	46527634
+4	46558708
+4	46357016
+8	22107339
+8	22587414
+8	22115461
+8	22919226
+8	22972821
+8	22103001
+8	23353413
+8	23169571
+8	22979592
+8	23167534
+8	23305547
+16	18234246
+16	18469382
+16	18086195
+16	17988734
+16	17493708
+16	18292656
+16	17642842
+16	18431304
+16	18045331
+16	18262918
+16	18491455
+24	17286996
+24	16944935
+24	16534843
+24	17421477
+24	17148508
+24	17235441
+24	17609202
+24	17171639
+24	16276763
+24	17070252
+24	17186997
+32	16897860
+32	16547348
+32	16398899
+32	16455905
+32	16451258
+32	16258591
+32	15786629
+32	15877174
+32	17024260
+32	17870606
+32	16918078
+CPP-rand:
+cores	throughput (entries)
+2	108425436
+2	106293778
+2	106393027
+2	106317669
+2	107794080
+2	106300083
+2	106466077
+2	108423252
+2	107601674
+2	108457677
+2	106393644
+4	4957214
+4	5044765
+4	5316815
+4	9111156
+4	4823367
+4	7769757
+4	3869847
+4	4574277
+4	4510715
+4	8084596
+4	4381546
+8	575794
+8	1203972
+8	1213130
+8	769499
+8	1090241
+8	906807
+8	920102
+8	888107
+8	1292919
+8	1096541
+8	513445
+16	279465
+16	46820
+16	256772
+16	296206
+16	48272
+16	280982
+16	3668733
+16	51490
+16	38343
+16	46313
+16	51192
+24	29006
+24	34424
+24	30018
+24	309384
+24	30237
+24	347162
+24	300419
+24	223239
+24	304041
+24	28660
+24	26010
+32	265608
+32	28252
+32	170908
+32	164815
+32	28847
+32	166579
+32	27385
+32	36578
+32	155500
+32	25657
+32	164097
+locks: 4
+CFA-baseline:
+cores	throughput (entries)
+2	42763531
+2	42953663
+2	43045349
+2	42907110
+2	43021016
+2	42549260
+2	42987288
+2	43061089
+2	42860049
+2	43096837
+2	42584212
+4	27287823
+4	26175516
+4	26179220
+4	26137863
+4	26451405
+4	27280339
+4	26133597
+4	26697346
+4	26137653
+4	26181121
+4	26122063
+8	12345741
+8	15297441
+8	14153084
+8	13159610
+8	13263952
+8	13330421
+8	14237918
+8	13244888
+8	13189405
+8	13174601
+8	12600224
+16	11894560
+16	11385532
+16	12020652
+16	9813102
+16	9979086
+16	10879622
+16	9860504
+16	11155194
+16	9962784
+16	9841527
+16	11711464
+24	11478107
+24	11417068
+24	11338054
+24	9479472
+24	9339826
+24	9606268
+24	11485165
+24	9717959
+24	9324302
+24	9649451
+24	10619765
+32	9218616
+32	10835069
+32	9417323
+32	9376572
+32	8997220
+32	9272967
+32	9123809
+32	9126840
+32	10469107
+32	11125665
+32	11020739
+CPP-baseline:
+cores	throughput (entries)
+2	51593584
+2	52154199
+2	51552657
+2	51569018
+2	51572845
+2	51604895
+2	51631998
+2	51811325
+2	51774329
+2	51497464
+2	51553663
+4	25376402
+4	25389226
+4	25377526
+4	25378370
+4	25376248
+4	25383173
+4	25402324
+4	25387353
+4	25352354
+4	25376768
+4	25366071
+8	14436849
+8	15375544
+8	12697115
+8	14506260
+8	14482185
+8	12999013
+8	14705680
+8	14601357
+8	13591593
+8	14471215
+8	13328574
+16	8996403
+16	8967821
+16	10565459
+16	10592706
+16	9784821
+16	9123499
+16	11965588
+16	9620717
+16	9855331
+16	9055267
+16	9466203
+24	8942634
+24	9020629
+24	10085121
+24	10043927
+24	10093053
+24	9102109
+24	10104539
+24	8977564
+24	10090371
+24	8987234
+24	10131129
+32	8733031
+32	8807371
+32	8679281
+32	8797127
+32	9841057
+32	9793819
+32	9831018
+32	8755738
+32	8638545
+32	9830079
+32	8692572
+
+CFA-rand:
+cores	throughput (entries)
+2	32126163
+2	32233664
+2	32363690
+2	32317382
+2	32248365
+2	32414979
+2	32749840
+2	32486438
+2	32810777
+2	31766818
+2	32243817
+4	23266695
+4	22512584
+4	23039738
+4	23657257
+4	23094497
+4	23112792
+4	23254176
+4	23286400
+4	23244442
+4	22457828
+4	23345564
+8	10586582
+8	10584917
+8	10644232
+8	10466176
+8	10575050
+8	10642702
+8	11046376
+8	10780824
+8	10778359
+8	10722428
+8	10226265
+16	8586858
+16	8508105
+16	8532439
+16	7470233
+16	7481213
+16	7308526
+16	8539278
+16	7742156
+16	7012706
+16	8513057
+16	9177299
+24	6603939
+24	7006508
+24	8186051
+24	6789561
+24	8110902
+24	6854980
+24	8162017
+24	6958466
+24	6737649
+24	6996253
+24	6730200
+32	8439025
+32	6509502
+32	8014270
+32	6562828
+32	6595786
+32	7962308
+32	7891463
+32	6590890
+32	6639842
+32	8896283
+32	6503589
+CPP-rand:
+cores	throughput (entries)
+2	19493422
+2	19579521
+2	19743496
+2	19741567
+2	20354480
+2	20145079
+2	18961059
+2	17895926
+2	18510876
+2	19375134
+2	19633170
+4	96410
+4	89726
+4	87132
+4	86790
+4	79421
+4	78239
+4	87250
+4	81480
+4	83751
+4	82020
+4	92220
+8	120210
+8	196902
+8	128404
+8	127461
+8	142551
+8	142119
+8	166110
+8	139413
+8	148845
+8	106506
+8	135714
+16	2382
+16	5905
+16	2992
+16	2626
+16	3086
+16	5369
+16	45884
+16	46846
+16	4975
+16	7933
+16	5879
+24	9370
+24	2149
+24	9342
+24	2758
+24	9609
+24	6553
+24	3234
+24	3276
+24	4288
+24	1187
+24	2547
+32	5204
+32	2287
+32	4896
+32	2860
+32	5340
+32	5391
+32	6772
+32	4656
+32	3163
+32	4529
+32	5691
+locks: 8
+CFA-baseline:
+cores	throughput (entries)
+2	44460716
+2	44393108
+2	44156750
+2	44189538
+2	44524595
+2	43979623
+2	44434622
+2	44258555
+2	44459537
+2	44268062
+2	44203298
+4	29635920
+4	29496925
+4	28605121
+4	29062508
+4	29118731
+4	29039079
+4	28576993
+4	29426814
+4	29535861
+4	29257177
+4	29702661
+8	16005789
+8	14303725
+8	15710107
+8	14199556
+8	15325487
+8	14704819
+8	17149301
+8	15774372
+8	13736289
+8	13939914
+8	13776759
+16	9878170
+16	10388006
+16	10772009
+16	9966168
+16	9488732
+16	10083514
+16	12042884
+16	10011675
+16	11470139
+16	10287473
+16	10504158
+24	11710683
+24	10231089
+24	11911501
+24	9925885
+24	10298595
+24	12102893
+24	12697802
+24	10938300
+24	9725875
+24	9607654
+24	10805664
+32	10268709
+32	9335944
+32	9571362
+32	9722845
+32	11718582
+32	10938651
+32	11783060
+32	9623929
+32	11281835
+32	9381442
+32	10587343
+CPP-baseline:
+cores	throughput (entries)
+2	122140484
+2	122022476
+2	122073213
+2	122069297
+2	122033222
+2	122069228
+2	122074505
+2	122106609
+2	122140836
+2	122190624
+2	122121100
+4	86030601
+4	85475167
+4	85974521
+4	85597069
+4	85984154
+4	85935554
+4	86050302
+4	86411721
+4	85220577
+4	85290663
+4	85300473
+8	44462964
+8	44662419
+8	45186644
+8	44711292
+8	36679011
+8	36628941
+8	33289328
+8	35238771
+8	33235005
+8	36692420
+8	35309639
+16	24075586
+16	25383997
+16	24234705
+16	22360365
+16	24107880
+16	33983173
+16	24222747
+16	33932863
+16	33780992
+16	24266493
+16	33569897
+24	27304928
+24	23696946
+24	26286106
+24	23669674
+24	24080013
+24	22276554
+24	23684497
+24	23672623
+24	24396513
+24	21824275
+24	23899391
+32	21942735
+32	21845396
+32	22816220
+32	22932044
+32	22848081
+32	21349450
+32	21716576
+32	22886705
+32	22827018
+32	21798928
+32	22479631
+
+CFA-rand:
+cores	throughput (entries)
+2	90701593
+2	90774413
+2	91006658
+2	90776662
+2	90802363
+2	90762346
+2	90831501
+2	90610185
+2	90836992
+2	90581412
+2	90573679
+4	79836592
+4	79407058
+4	79861701
+4	79174677
+4	79342028
+4	79529590
+4	79559025
+4	79272106
+4	79022372
+4	80165125
+4	79393320
+8	40124043
+8	38645852
+8	36847286
+8	43930913
+8	37154256
+8	38469537
+8	41798561
+8	42647820
+8	38373332
+8	38779609
+8	40260279
+16	28989096
+16	27330135
+16	30495840
+16	27209027
+16	30168499
+16	30611337
+16	26719304
+16	30515194
+16	27237317
+16	30694449
+16	30386777
+24	29053795
+24	25344093
+24	25423850
+24	28713970
+24	29351918
+24	29122414
+24	29235799
+24	29297417
+24	26841037
+24	29241995
+24	29236657
+32	28372188
+32	24980635
+32	28265451
+32	31275045
+32	28376733
+32	24834516
+32	28197942
+32	28135299
+32	24617974
+32	30854056
+32	27029341
+CPP-rand:
+cores	throughput (entries)
+2	1273726
+2	1266301
+2	1273360
+2	1266823
+2	1161903
+2	1228276
+2	1220034
+2	1173954
+2	1149322
+2	1270525
+2	1226638
+4	6177
+4	4949
+4	5026
+4	4985
+4	4612
+4	5054
+4	4685
+4	4469
+4	5143
+4	4476
+4	5057
+8	6030
+8	4532
+8	5141
+8	5220
+8	4645
+8	4020
+8	4762
+8	4817
+8	4784
+8	4713
+8	6519
+16	1103
+16	2093
+16	719
+16	3474
+16	1724
+16	779
+16	848
+16	1100
+16	1264
+16	1013
+16	430
+24	1945
+24	842
+24	1019
+24	1291
+24	706
+24	709
+24	781
+24	968
+24	617
+24	981
+24	912
+32	1287
+32	908
+32	878
+32	936
+32	1148
+32	976
+32	1560
+32	1141
+32	1096
+32	1048
+32  917
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/data/pyke.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/data/pyke.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/data/pyke.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,826 @@
+11
+2 4 8 16 24 32
+2 4 8 
+CFA-baseline CPP-baseline CFA-rand CPP-rand 
+locks: 2
+CFA-baseline:
+cores	throughput (entries)
+2	156366158
+2	148111668
+2	159629122
+2	134037579
+2	148363001
+2	160092915
+2	146218812
+2	146118888
+2	141380117
+2	133185157
+2	153249300
+4	91137162
+4	85307123
+4	90583036
+4	88993345
+4	97152950
+4	88994716
+4	92020657
+4	90893559
+4	94315083
+4	96629020
+4	90650596
+8	60589364
+8	62638563
+8	61452745
+8	60911801
+8	57536571
+8	62330455
+8	61135417
+8	62640850
+8	62035864
+8	60550487
+8	60600112
+16	36064721
+16	38654303
+16	37316087
+16	38437522
+16	32070645
+16	35236779
+16	35942584
+16	36368641
+16	34545365
+16	36951002
+16	38243137
+24	21494423
+24	21100010
+24	20958711
+24	21285651
+24	22389314
+24	21561489
+24	21905807
+24	22592519
+24	21370689
+24	22016897
+24	20887672
+32	19748567
+32	19982770
+32	19646182
+32	19613980
+32	20432581
+32	20977464
+32	18127230
+32	19121974
+32	19136698
+32	19235555
+32	19592493
+CPP-baseline:
+cores	throughput (entries)
+2	151210672
+2	134516398
+2	116676205
+2	151482430
+2	145433033
+2	143905239
+2	129918506
+2	134823272
+2	133313381
+2	162301104
+2	159500652
+4	94898333
+4	92065909
+4	92164482
+4	99042941
+4	88047898
+4	88700692
+4	92610246
+4	92220134
+4	91329571
+4	94267761
+4	97371529
+8	61783411
+8	62487151
+8	62725596
+8	59854754
+8	59710905
+8	62478781
+8	62279537
+8	60085059
+8	60919669
+8	62488709
+8	61418331
+16	35988504
+16	38134118
+16	37430655
+16	35759683
+16	34876487
+16	35348408
+16	31616025
+16	34309336
+16	32909305
+16	38106267
+16	35747966
+24	20171838
+24	21477659
+24	20937327
+24	20087253
+24	20762949
+24	21405455
+24	19924126
+24	20960597
+24	19701885
+24	19923754
+24	20209564
+32	18656038
+32	18879418
+32	19511896
+32	18877539
+32	19309024
+32	16668604
+32	18896579
+32	18443510
+32	19278271
+32	19172682
+32	18650766
+
+CFA-rand:
+cores	throughput (entries)
+2	106079280
+2	109165899
+2	106190013
+2	100326267
+2	110431610
+2	108718402
+2	109506259
+2	109675263
+2	100580426
+2	116689631
+2	106202366
+4	69138814
+4	73462806
+4	71424631
+4	71151913
+4	68105124
+4	72686268
+4	68582485
+4	72329445
+4	72170487
+4	71483148
+4	67140081
+8	50764592
+8	48199516
+8	46106930
+8	48532941
+8	51517921
+8	48191264
+8	49870530
+8	54434678
+8	47067107
+8	47617661
+8	45909903
+16	24992687
+16	24121238
+16	25899927
+16	27442485
+16	26877458
+16	25653984
+16	25812918
+16	24693172
+16	24104591
+16	25468770
+16	26472584
+24	10905658
+24	14298009
+24	10350625
+24	13112774
+24	10772959
+24	10404123
+24	16342552
+24	11210621
+24	11992280
+24	12227502
+24	11815758
+32	12222764
+32	11680368
+32	10371906
+32	9340757
+32	9654677
+32	9705358
+32	11592471
+32	10740592
+32	9789984
+32	11439019
+32	9430501
+CPP-rand:
+cores	throughput (entries)
+2	92838726
+2	76195187
+2	99905117
+2	85732395
+2	93561773
+2	75513848
+2	102682517
+2	100912364
+2	82308583
+2	91049192
+2	92561312
+4	31856100
+4	30499024
+4	30654715
+4	33819774
+4	30735212
+4	31695838
+4	32184832
+4	31466638
+4	34003046
+4	29306871
+4	32000755
+8	12336616
+8	11364691
+8	11732449
+8	12739864
+8	12558313
+8	11754654
+8	11439510
+8	11413638
+8	11606840
+8	11926763
+8	11478250
+16	3384302
+16	3593102
+16	3338151
+16	3220539
+16	3332480
+16	3271850
+16	3378613
+16	3613377
+16	3261974
+16	3164858
+16	3616664
+24	1406599
+24	1513729
+24	1380970
+24	1420562
+24	1556399
+24	1344496
+24	1407984
+24	1565402
+24	1371450
+24	1372076
+24	1314823
+32	582501
+32	631640
+32	617462
+32	704006
+32	558714
+32	636503
+32	597397
+32	690868
+32	645501
+32	554080
+32	674478
+locks: 4
+CFA-baseline:
+cores	throughput (entries)
+2	74572214
+2	73599665
+2	73045722
+2	73752628
+2	72977303
+2	64785522
+2	81273579
+2	78320960
+2	82142093
+2	79633186
+2	86710390
+4	57155036
+4	54788331
+4	54405324
+4	52036712
+4	50336203
+4	56718137
+4	49424302
+4	49997233
+4	55969488
+4	49685248
+4	48225669
+8	34159238
+8	33956350
+8	33732196
+8	36489417
+8	36737175
+8	34373180
+8	34870362
+8	35783027
+8	36534563
+8	34539063
+8	34442974
+16	18937797
+16	18223052
+16	18803849
+16	19239276
+16	20221702
+16	18873636
+16	19272185
+16	19118586
+16	18906145
+16	18223772
+16	19431151
+24	10673517
+24	11506627
+24	11311012
+24	11851819
+24	11514449
+24	10480698
+24	12044293
+24	11137068
+24	11297991
+24	12751258
+24	10437187
+32	10927127
+32	10229682
+32	10469391
+32	11170565
+32	10531838
+32	10205346
+32	10154719
+32	9676394
+32	10375384
+32	11216535
+32	9633823
+CPP-baseline:
+cores	throughput (entries)
+2	71702386
+2	90229423
+2	86558775
+2	93272884
+2	82763619
+2	86225344
+2	73057508
+2	89452129
+2	76509616
+2	81931032
+2	91136729
+4	54019437
+4	55680412
+4	58185510
+4	58754890
+4	59008402
+4	53572862
+4	58912038
+4	50882340
+4	54796163
+4	56311157
+4	51776671
+8	34870909
+8	34208326
+8	33874707
+8	37449725
+8	35864280
+8	37531608
+8	37579471
+8	35967318
+8	37658220
+8	35973782
+8	35765052
+16	18704562
+16	17976805
+16	18185239
+16	18378242
+16	17023046
+16	18278925
+16	19724692
+16	17963925
+16	18201576
+16	19530748
+16	19365283
+24	11686208
+24	11887163
+24	11725871
+24	11967357
+24	11305411
+24	11169012
+24	11610056
+24	10356276
+24	11891141
+24	10288080
+24	10399111
+32	10897538
+32	9185536
+32	10197031
+32	9957906
+32	10552963
+32	10226746
+32	10293025
+32	10070229
+32	10730855
+32	9227790
+32	10596969
+
+CFA-rand:
+cores	throughput (entries)
+2	55529865
+2	53589086
+2	47417988
+2	53681235
+2	54840979
+2	54833260
+2	52167055
+2	55727582
+2	55839212
+2	57968776
+2	54314968
+4	34583895
+4	31096771
+4	34914705
+4	31614947
+4	30183593
+4	31312779
+4	33040695
+4	31871387
+4	30181583
+4	33108489
+4	30181625
+8	20280119
+8	21481414
+8	20247645
+8	20717673
+8	20615346
+8	21125408
+8	20911578
+8	20738211
+8	21137492
+8	20813471
+8	20819543
+16	11043276
+16	10969651
+16	11414321
+16	11126229
+16	11137692
+16	11094415
+16	11434467
+16	11385693
+16	11200892
+16	10752556
+16	11242886
+24	7458082
+24	6189620
+24	6488852
+24	6873022
+24	6480462
+24	6727812
+24	5997943
+24	6511122
+24	6806277
+24	6680014
+24	6974965
+32	6074127
+32	6171854
+32	5865507
+32	5790871
+32	6636287
+32	5928924
+32	6317618
+32	6285653
+32	6478048
+32	6018550
+32	6178487
+CPP-rand:
+cores	throughput (entries)
+2	30003735
+2	29760867
+2	30191524
+2	28370136
+2	30199420
+2	27632223
+2	30116577
+2	33045126
+2	25979933
+2	31535792
+2	30837445
+4	3561868
+4	3591917
+4	3549972
+4	3559668
+4	3577996
+4	3325733
+4	4400495
+4	3613703
+4	3824405
+4	3164609
+4	3546560
+8	544043
+8	568011
+8	478995
+8	520688
+8	532861
+8	539778
+8	524540
+8	546038
+8	618736
+8	493616
+8	604406
+16	45623
+16	39069
+16	42605
+16	46023
+16	43667
+16	41976
+16	44198
+16	42908
+16	44344
+16	45386
+16	46274
+24	6315
+24	7977
+24	6172
+24	6136
+24	7228
+24	7048
+24	6117
+24	9114
+24	6580
+24	7329
+24	7818
+32	1252
+32	964
+32	2284
+32	1245
+32	1300
+32	1241
+32	1430
+32	986
+32	1964
+32	1585
+32	781
+locks: 8
+CFA-baseline:
+cores	throughput (entries)
+2	22433593
+2	26550816
+2	27636603
+2	24387208
+2	35014033
+2	28720762
+2	26354372
+2	20336612
+2	34298294
+2	34549479
+2	26350778
+4	13520454
+4	14311410
+4	15346205
+4	15201666
+4	15530020
+4	15440640
+4	14239420
+4	15819069
+4	15359524
+4	14089239
+4	15525304
+8	9677577
+8	9623556
+8	9441403
+8	9357335
+8	9569391
+8	9714570
+8	9464709
+8	9449374
+8	9568505
+8	9434951
+8	9755125
+16	5565968
+16	5655771
+16	5350111
+16	5556743
+16	5548857
+16	5503230
+16	5584022
+16	5550360
+16	5548839
+16	5518520
+16	5610178
+24	3827271
+24	3919165
+24	3578281
+24	3641686
+24	3699840
+24	3756187
+24	3592296
+24	3915120
+24	3648277
+24	3956082
+24	3777164
+32	3859832
+32	3903090
+32	4122578
+32	3885833
+32	3698076
+32	3827179
+32	4013008
+32	4025455
+32	4077961
+32	3699286
+32	3844692
+CPP-baseline:
+cores	throughput (entries)
+2	36207876
+2	36218947
+2	42357750
+2	37633505
+2	34196379
+2	42352388
+2	32302725
+2	41492575
+2	31100356
+2	37619825
+2	41472442
+4	20968332
+4	21469416
+4	20555170
+4	21156880
+4	19496837
+4	20576520
+4	19493259
+4	19976920
+4	19314278
+4	20939077
+4	19320713
+8	14021166
+8	13745752
+8	13996013
+8	13857263
+8	13904897
+8	13896616
+8	13899683
+8	13288080
+8	13783912
+8	13664592
+8	13789265
+16	8119300
+16	8109975
+16	8187901
+16	8148346
+16	8150290
+16	8189135
+16	8165201
+16	8014526
+16	8325693
+16	8065831
+16	8194973
+24	5830256
+24	5735657
+24	5508715
+24	5745431
+24	5812531
+24	5906039
+24	5806701
+24	5655812
+24	5536875
+24	5776330
+24	5571196
+32	6012983
+32	5701237
+32	5998791
+32	5989481
+32	5935354
+32	5406465
+32	5520759
+32	6042646
+32	5622098
+32	6007002
+32	5800606
+
+CFA-rand:
+cores	throughput (entries)
+2	27630005
+2	26912090
+2	35549306
+2	29342689
+2	30952653
+2	33780282
+2	33404300
+2	28894568
+2	31534156
+2	33685503
+2	29071537
+4	21900036
+4	23157690
+4	21468492
+4	22349192
+4	21550780
+4	22356702
+4	20534751
+4	22764482
+4	21716955
+4	20870144
+4	21771351
+8	14741806
+8	14806424
+8	15016903
+8	15482928
+8	15224076
+8	15380205
+8	15197410
+8	14897598
+8	15497937
+8	14914078
+8	15204993
+16	8894365
+16	8879538
+16	9466888
+16	8879456
+16	9263671
+16	8921486
+16	8862871
+16	9251377
+16	9269423
+16	8759995
+16	9042402
+24	5866504
+24	5924279
+24	5790075
+24	5930767
+24	5908426
+24	5827639
+24	5973014
+24	6387156
+24	5980731
+24	5747428
+24	6231893
+32	5344695
+32	5859757
+32	5290792
+32	5490732
+32	5760855
+32	5640510
+32	5591138
+32	5577256
+32	5568656
+32	5593450
+32	5662584
+CPP-rand:
+cores	throughput (entries)
+2	6952898
+2	5616112
+2	8194137
+2	6807206
+2	7303290
+2	7658001
+2	8180017
+2	7790225
+2	7668761
+2	7293482
+2	7583175
+4	408891
+4	415242
+4	462674
+4	512325
+4	487870
+4	478360
+4	481546
+4	447057
+4	464713
+4	433304
+4	432892
+8	16768
+8	14701
+8	15307
+8	13244
+8	14275
+8	20416
+8	15766
+8	13817
+8	15545
+8	13708
+8	15833
+16	495
+16	635
+16	850
+16	1201
+16	571
+16	1035
+16	443
+16	752
+16	386
+16	1022
+16	318
+24	167
+24	424
+24	1482
+24	260
+24	648
+24	109
+24	527
+24	187
+24	93
+24	228
+24	137
+32	880
+32	75
+32	618
+32	197
+32	469
+32	1072
+32	203
+32	236
+32	145
+32	119
+32	415
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/genPlots
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/genPlots	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/genPlots	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+#!/bin/bash -
+python3 plotData.py data/nasus.txt nasus_
+python3 plotData.py data/pyke.txt pyke_
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/plotData.py
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/plotData.py	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/plotData.py	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,116 @@
+import os
+import sys
+import time
+import itertools
+import matplotlib.pyplot as plt
+import matplotlib.ticker as ticks
+import math
+from scipy import stats as st
+import numpy as np
+from enum import Enum
+from statistics import median
+
+import matplotlib
+matplotlib.use("pgf")
+matplotlib.rcParams.update({
+    "pgf.texsystem": "pdflatex",
+    'font.family': 'serif',
+    'text.usetex': True,
+    'pgf.rcfonts': False,
+    'font.size': 16
+})
+marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' )) 
+
+readfile = open(sys.argv[1], "r")
+
+machineName = ""
+
+if len(sys.argv) > 2:
+    machineName = sys.argv[2]
+
+# first line has num times per experiment
+line = readfile.readline()
+numTimes = int(line)
+
+# second line has processor args
+line = readfile.readline()
+procs = []
+for val in line.split():
+    procs.append(int(val))
+
+# 3rd line has num locks args
+line = readfile.readline()
+locks = []
+for val in line.split():
+    locks.append(int(val))
+
+# 4th line has number of variants
+line = readfile.readline()
+names = line.split()
+numVariants = len(names)
+
+lines = (line.rstrip() for line in readfile) # All lines including the blank ones
+lines = (line for line in lines if line) # Non-blank lines
+
+nameSet = False
+currLocks = -1 # default val
+count = 0
+procCount = 0
+currVariant = 0
+name = "Aggregate Lock"
+var_name = ""
+experiment_duration = 10.0
+sendData = [0.0 for j in range(numVariants)]
+data = [[0.0 for i in range(len(procs))] for j in range(numVariants)]
+bars = [[[0.0 for i in range(len(procs))],[0.0 for k in range(len(procs))]] for j in range(numVariants)]
+tempData = [0.0 for i in range(numTimes)]
+for idx, line in enumerate(lines):
+    # print(line)
+    
+    if currLocks == -1:
+        lineArr = line.split()
+        currLocks = lineArr[-1]
+        continue
+
+    if line[0:5] == "cores":
+        continue
+
+    if not nameSet:
+        nameSet = True
+        continue
+    
+    lineArr = line.split()
+    tempData[count] = float(lineArr[-1]) / experiment_duration
+    count += 1
+    if count == numTimes:
+        currMedian = median( tempData )
+        data[currVariant][procCount] = currMedian
+        lower, upper = st.t.interval(0.95, numTimes - 1, loc=np.mean(tempData), scale=st.sem(tempData))
+        bars[currVariant][0][procCount] = max( 0, currMedian - lower )
+        bars[currVariant][1][procCount] = max( 0, upper - currMedian )
+        count = 0
+        procCount += 1
+
+        if procCount == len(procs):
+            procCount = 0
+            nameSet = False
+            currVariant += 1
+
+            if currVariant == numVariants:
+                fig, ax = plt.subplots(layout='constrained')
+                plt.title(name + " Benchmark: " + str(currLocks) + " Locks")
+                plt.ylabel("Throughput (critical section entries per second)")
+                plt.xlabel("Cores")
+                for idx, arr in enumerate(data):
+                    plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker=next(marker) )
+                marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' )) 
+                plt.yscale("log")
+                plt.xticks(procs)
+                ax.legend(names)
+                # fig.savefig("plots/" + machineName + "Aggregate_Lock_" + str(currLocks) + ".png")
+                plt.savefig("plots/" + machineName + "Aggregate_Lock_" + str(currLocks) + ".pgf")
+                fig.clf()
+
+                # reset
+                currLocks = -1
+                currVariant = 0
Index: doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/run
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/run	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/mutex_stmt/run	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,226 @@
+#!/bin/bash -
+
+false=0; true=1
+
+# Usage: arch [ hostname ] returns hostname, cores, startcore
+#
+#   Define machine architecture based on starting socket, CPUs (cores) per socket, number of
+#   sockets, has hyperthreading.
+
+start=0
+
+arch() {
+	hostname=${1:-`hostname`}			# return value
+	hashyper=${true}					# assume machine has hyperthreads
+	if [ "${hostname}" = "plg2" ] ; then
+		startsocket=${start}
+		cps=16							# coresPerSocket
+		sockets=2
+		hashyper=${false}				# has no hyperthreads
+	elif [ "${hostname}" = "nasus" ] ; then
+		startsocket=${start}
+		cps=64							# coresPerSocket
+		sockets=2
+	elif [ "${hostname}" = "pyke" ] ; then
+		startsocket=${start}
+		cps=24							# coresPerSocket
+		sockets=2
+	elif [ "${hostname}" = "jax" ] ; then
+		startsocket=${start}
+		cps=24							# coresPerSocket
+		sockets=4
+	else
+		echo "unsupported host" ${hostname}
+		exit 1
+	fi
+	cores=$(( ${cps} * ${sockets} ))
+	startcore=$(( ${startsocket} * ${cps} ))
+}
+
+# Usage: affinity (global cps, sockets, startsocket, hashyper, cores, startcore, wrap)
+#   returns taskset argument
+#
+#   This routine assumes hyperthreading has only 2 hyperthreads per core.
+#
+#   If hyperthread scanning is used: processor units are assigned across the low-number hyperthreads
+#   of the socket's cores. When the low-number hyperthreads are filled, the high-number hyperhtreads
+#   are assigned across the socket's cores. Then the next socket is assigned.
+#
+#   If hyperthread wrapping is used: processor units are assigned in low/high-number pairs of
+#   hyperthreads across the socket's cores. Then the next socket is assigned.
+
+wrap=${false}							# set to control hyperthread assignment across socket cores
+
+affinity() {
+	if [ ${wrap} -eq ${true} -a ${hashyper} -eq ${false} ] ; then
+		echo "architecture does not support hyperthreading for wrapping"
+		exit 1
+	fi
+	taskset=""							# return value
+	set -- $(( ${1} - 1 ))				# decrement $1
+	if [ ${1} -eq 0 ] ; then taskset="${startcore}-${startcore}"; return; fi
+	if [ ${1} -ge $(( ${cps} * ( ${sockets} - ${startsocket} ) * ( ${hashyper} + 1 ) )) ] ; then # error
+		echo "not enough cores $(( ${cores} * ${sockets} )) for $(( ${1} + 1 )) starting at ${startcore}"
+		exit 1
+	fi
+	if [ ${hashyper} -eq ${false} ] ; then taskset="${startcore}-$(( ${1} + ${startcore} ))"; return; fi # no hyperthreads
+	start2=$(( ${startcore} + ${cores} ))
+	if [ ${wrap} -eq ${true} ] ; then 	# hyperthread wrapping
+		end1=$(( ${1} / 2 + ${startcore} ))
+		end2=$(( ${end1} + ${cores} ))
+		if [ $(( ${1} % 2 )) -eq 0 ] ; then
+			end2=$(( ${end2} - 1 ))
+		fi
+		taskset="${startcore}-${end1},${start2}-${end2}"
+	else								# hyperthread scanning
+		if [ ${1} -lt ${cps} ] ; then taskset="${startcore}-$(( ${1} + ${startcore} ))"; return; fi
+		filled=$(( ${1} / ( ${cps} * 2 ) * ${cps} ))
+		modulus=$(( ${1} % ( ${cps} * 2 ) ))	# leftover cores added to saturated sockets
+		if [ ${modulus} -gt ${cps} ] ; then
+			taskset="${startcore}-$(( ${startcore} + ${filled} + ${cps} - 1 )),${start2}-$(( ${start2} + ${filled} + ${modulus} % ${cps} ))"
+		else
+			taskset="${startcore}-$(( ${startcore} + ${filled} + ${modulus} )),${start2}-$(( ${start2} + ${filled} - 1 ))"
+		fi
+	fi
+}
+
+numtimes=11
+
+# locks=('-DLOCKS=L1' '-DLOCKS=L2' '-DLOCKS=L3' '-DLOCKS=L4' '-DLOCKS=L5' '-DLOCKS=L6' '-DLOCKS=L7' '-DLOCKS=L8')
+# locks='1 2 3 4 5 6 7 8'
+lock_flags=('-DLOCKS=L2' '-DLOCKS=L4' '-DLOCKS=L8')
+locks=('2' '4' '8')
+
+num_threads='2 4 8 16 24 32'
+# num_threads='2 4 8'
+
+# toggle benchmarks
+order=${false}
+rand=${true}
+baseline=${true}
+
+runCFA=${true}
+runCPP=${true}
+# runCFA=${false}
+# runCPP=${false}
+
+cfa=~/cfa-cc/driver/cfa
+cpp=g++
+
+# Helpers to minimize code duplication
+
+# repeats a command ${numtimes}
+preprint=''
+repeat_command() {
+    t=1
+    while [ ${t} -le ${numtimes} ] ; do
+        echo -n -e ${preprint}
+        "${@}"
+        t=`expr ${t} + 1`
+    done
+}
+
+# prints the leading info for a given run of a variant
+print_header() {
+    echo ${1}':'
+    echo -e "cores\tthroughput (entries)"
+}
+
+# runs the current benchmark with provided args
+# only works for standard-run benchmarks (not Akka)
+# must split into pre and post args to be able to supply val of p
+pre_args=''
+post_args=''
+single_run() {
+    affinity ${1}
+    preprint="${1}\t"
+    repeat_command taskset -c ${taskset} ./a.${hostname} ${pre_args} ${1} ${post_args}
+}
+
+# runs the current bench for all processor vals
+# works for standard benchs that dont need to set a config file (not Akka or CAF)
+run_bench() {
+    for p in ${num_threads} ; do
+        single_run ${p}
+    done
+}
+
+arch # get hostname
+
+# set up leading info for python script
+echo $numtimes
+echo $num_threads
+
+for i in ${!locks[@]}; do
+        echo -n ${locks[$i]}' '
+done
+echo ""
+
+if [ ${runCFA} -eq ${true} ] && [ ${order} -eq ${true} ]; then
+    echo -n 'CFA-order '
+fi
+if [ ${runCPP} -eq ${true} ] && [ ${order} -eq ${true} ]; then
+    echo -n 'CPP-order '
+fi
+if [ ${runCFA} -eq ${true} ] && [ ${baseline} -eq ${true} ]; then
+    echo -n 'CFA-baseline '
+fi
+if [ ${runCPP} -eq ${true} ] && [ ${baseline} -eq ${true} ]; then
+    echo -n 'CPP-baseline '
+fi
+if [ ${runCFA} -eq ${true} ] && [ ${rand} -eq ${true} ]; then
+    echo -n 'CFA-rand '
+fi
+if [ ${runCPP} -eq ${true} ] && [ ${rand} -eq ${true} ]; then
+    echo -n 'CPP-rand '
+fi
+echo ""
+
+# done printing header info for output
+
+# cfa flags
+cfa_flags='-quiet -O3 -nodebug -DNDEBUG'
+
+# cpp flagse
+cpp_flags='-O3 -std=c++17 -lpthread -pthread -DNDEBUG'
+
+# run the benchmarks
+
+run_order() {
+    post_args=${1}
+
+    if [ ${runCFA} -eq ${true} ] ; then
+        cd cfa # CFA RUN
+        print_header 'CFA-'${3}
+        ${cfa} ${cfa_flags} ${2} ${3}.cfa -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done CFA
+
+    if [ ${runCPP} -eq ${true} ] ; then
+        cd cpp # CPP RUN
+        print_header 'CPP-'${3}
+        ${cpp} ${cpp_flags} ${2} ${3}.cc -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done CPP
+}
+
+# /usr/bin/time -f "%Uu %Ss %Er %Mkb"
+
+for i in ${!locks[@]}; do
+    echo "locks: "${locks[$i]}
+    if [ ${order} -eq ${true} ] ; then
+        run_order ${locks[$i]} ${lock_flags[$i]} 'order'
+    fi
+    if [ ${baseline} -eq ${true} ] ; then
+        run_order ${locks[$i]} ${lock_flags[$i]} 'baseline'
+    fi
+    if [ ${rand} -eq ${true} ] ; then
+        run_order ${locks[$i]} '-DLOCKS=L8' 'rand'
+    fi
+done
+
+
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/contend.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/contend.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/contend.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,99 @@
+#include <select.hfa>
+#include <thread.hfa>
+#include <channel.hfa>
+#include <locks.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <time.hfa>
+#include <string.h>
+
+// #define NUM_CHANS 1
+#define GLUE_HELPER(x, y) x##y
+#define FN_GLUE(x, y) GLUE_HELPER(x, y)
+
+size_t Processors = 2, Producers = 1, Consumers = 1, ChannelSize = 10;
+
+channel(size_t) * chans;
+
+static inline void cons_wait_1( size_t & val ) { waituntil( val << chans[0] ) {} }
+static inline void cons_wait_2( size_t & val ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} }
+static inline void cons_wait_3( size_t & val ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} }
+static inline void cons_wait_4( size_t & val ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} or waituntil( val << chans[3] ) {} }
+static inline void cons_wait_5( size_t & val ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} or waituntil( val << chans[3] ) {} or waituntil( val << chans[4] ) {} }
+static inline void cons_wait_6( size_t & val ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} or waituntil( val << chans[3] ) {} or waituntil( val << chans[4] ) {} or waituntil( val << chans[5] ) {} }
+static inline void cons_wait_7( size_t & val ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} or waituntil( val << chans[3] ) {} or waituntil( val << chans[4] ) {} or waituntil( val << chans[5] ) {} or waituntil( val << chans[6] ) {} }
+static inline void cons_wait_8( size_t & val ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} or waituntil( val << chans[3] ) {} or waituntil( val << chans[4] ) {} or waituntil( val << chans[5] ) {} or waituntil( val << chans[6] ) {} or waituntil( val << chans[7] ) {}}
+
+static inline void prods_wait_1( size_t val ) { waituntil( chans[0] << val ) {} }
+static inline void prods_wait_2( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} }
+static inline void prods_wait_3( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} }
+static inline void prods_wait_4( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} or waituntil( chans[3] << val ) {} }
+static inline void prods_wait_5( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} or waituntil( chans[3] << val ) {} or waituntil( chans[4] << val ) {} }
+static inline void prods_wait_6( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} or waituntil( chans[3] << val ) {} or waituntil( chans[4] << val ) {} or waituntil( chans[5] << val ) {} }
+static inline void prods_wait_7( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} or waituntil( chans[3] << val ) {} or waituntil( chans[4] << val ) {} or waituntil( chans[5] << val ) {} or waituntil( chans[6] << val ) {} }
+static inline void prods_wait_8( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} or waituntil( chans[3] << val ) {} or waituntil( chans[4] << val ) {} or waituntil( chans[5] << val ) {} or waituntil( chans[6] << val ) {} or waituntil( chans[7] << val ) {}}
+
+size_t globalTotal = 0;
+
+thread Consumer {};
+void main( Consumer & this ) {
+    size_t val, i = 0;
+    try {
+        for(;; i++ ) {
+            FN_GLUE(cons_wait_, NUM_CHANS)(val);
+        }
+    } catch( channel_closed * e ) {}
+    __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
+}
+
+thread Producer {};
+void main( Producer & this ) {
+    try {
+        for( size_t i = 0;; i++ ) {
+            FN_GLUE(prods_wait_, NUM_CHANS)(i);
+        }
+    } catch( channel_closed * e ) {}
+}
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			ChannelSize = atoi( argv[2] );
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Processors = atoi( argv[1] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ processors (> 0) | 'd' (default " | Processors
+			 | ") ] [ channel size (>= 0) | 'd' (default " | ChannelSize
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+    Producers = Processors / 2;
+    Consumers = Processors / 2;
+
+    processor p[Processors - 1];
+
+    chans = aalloc( NUM_CHANS );
+    for ( i; NUM_CHANS )
+        chans[i]{ ChannelSize };
+
+    {
+        Producer p[Producers];
+        Consumer c[Consumers];
+
+        sleep(10`s);
+
+        for ( i; NUM_CHANS )
+            close( chans[i] );
+    }
+    adelete( chans );
+    printf("%zu\n", globalTotal);
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/future.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/future.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/future.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,182 @@
+#include <select.hfa>
+#include <thread.hfa>
+#include <future.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <time.hfa>
+#include <string.h>
+
+// #define ANDOR
+
+size_t Processors = 2, Time = 10;
+
+size_t globalTotal = 0;
+future(size_t) A, B, C;
+volatile bool done_loop = false;
+volatile bool client_done = false;
+volatile bool server_done = false;
+
+static inline void wait() {
+    #ifdef OR
+    waituntil( A ) { get( A ); }
+    or waituntil( B ) { get( B ); }
+    or waituntil( C ) { get( C ); }
+    #endif
+    #ifdef AND
+    waituntil( A ) { get( A ); }
+    and waituntil( B ) { get( B ); }
+    #endif
+    #ifdef AND3
+    waituntil( A ) { get( A ); }
+    and waituntil( B ) { get( B ); }
+    and waituntil( C ) { get( C ); }
+    #endif
+    #ifdef ANDOR
+    waituntil( A ) { get( A ); }
+    and waituntil( B ) { get( B ); }
+    or waituntil( C ) { get( C ); }
+    #endif
+    #ifdef ORAND
+    (waituntil( A ) { get( A ); }
+    or waituntil( B ) { get( B ); })
+    and waituntil( C ) { get( C ); }
+    #endif
+    #ifdef BASIC
+    get( A );
+    #endif
+}
+
+static inline fulfill( size_t i ) {
+    #ifdef OR
+    if ( i % 3 == 0 ) {
+        fulfil(A, i);
+    } else if ( i % 3 == 1 ) {
+        fulfil(B, i);
+    } else {
+        fulfil(C, i);
+    }
+    #endif
+    #ifdef AND
+    if ( i % 2 == 0 ) {
+        fulfil(A, i);
+        fulfil(B, i);
+    } else {
+        fulfil(B, i);
+        fulfil(A, i);
+    }
+    #endif
+    #ifdef AND3
+    if ( i % 6 == 0 ) {
+        fulfil(A, i);
+        fulfil(B, i);
+        fulfil(C, i);
+    } else if ( i % 6 == 1 ) {
+        fulfil(A, i);
+        fulfil(C, i);
+        fulfil(B, i);
+    } else if ( i % 6 == 2 ) {
+        fulfil(B, i);
+        fulfil(A, i);
+        fulfil(C, i);
+    } else if ( i % 6 == 3 ) {
+        fulfil(B, i);
+        fulfil(C, i);
+        fulfil(A, i);
+    } else if ( i % 6 == 4 ) {
+        fulfil(C, i);
+        fulfil(A, i);
+        fulfil(B, i);
+    } else if ( i % 6 == 5 ) {
+        fulfil(C, i);
+        fulfil(B, i);
+        fulfil(A, i);
+    }
+    #endif
+    #ifdef ANDOR
+    if ( i % 4 == 0 ) {
+        fulfil(A, i);
+        fulfil(B, i);
+    } else if ( i % 4 == 1 ) {
+        fulfil(A, i);
+        fulfil(C, i);
+    } else if ( i % 4 == 2 ) {
+        fulfil(B, i);
+        fulfil(C, i);
+    } else {
+        fulfil(C, i);
+    }
+    #endif
+    #ifdef ORAND
+    if ( i % 4 == 0 ) {
+        fulfil(A, i);
+        fulfil(C, i);
+    } else if ( i % 4 == 1 ) {
+        fulfil(C, i);
+        fulfil(A, i);
+    } else if ( i % 4 == 2 ) {
+        fulfil(B, i);
+        fulfil(C, i);
+    } else {
+        fulfil(C, i);
+        fulfil(B, i);
+    }
+    #endif
+    #ifdef BASIC
+    fulfil(A, i);
+    #endif
+}
+
+thread Client {};
+void main( Client & this ) {
+    size_t i = 0;
+    for(; !client_done; i++ ) {
+        wait();
+        reset( A );
+        reset( B );
+        reset( C );
+        done_loop = true;
+    }
+    __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
+}
+
+thread Server {};
+void main( Server & this ) {
+    for( size_t i = 0; !server_done; i++ ) {
+        fulfill( i );
+        while( !done_loop ) {}
+        done_loop = false;
+    }
+}
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Time = atoi( argv[1] );
+			if ( Time < 0 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | "[ time (>= 0) | 'd' (default " | Time
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+    processor p[Processors - 1];
+
+    {
+        Server s;
+        {
+            Client c;
+
+            sleep(Time`s);
+
+            client_done = true;
+        }
+        server_done = true;
+        done_loop = true;
+    }
+    printf("%zu\n", globalTotal);
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/order.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/order.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/order.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,77 @@
+#include <select.hfa>
+#include <thread.hfa>
+#include <channel.hfa>
+#include <locks.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <time.hfa>
+#include <string.h>
+
+size_t ChannelSize = 100, Channels = 2;
+
+channel(size_t) * chans;
+
+size_t globalTotal = 0;
+int cons_counter = 0, prod_counter = 0;
+
+thread SelectConsumer {};
+void main( SelectConsumer & this ) {
+    size_t val, i = 0;
+    try {
+        for(;; i++ ) {
+            waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {}
+        }
+    } catch( channel_closed * e ) {}
+    __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
+}
+
+thread SelectProducer {};
+void main( SelectProducer & this ) {
+    try {
+        for( size_t i = 0;; i++ ) {
+            waituntil( chans[0] << i ) {} or waituntil( chans[1] << i ) {}
+        }
+    } catch( channel_closed * e ) {}
+}
+
+thread Consumer {};
+void main( Consumer & this ) {
+    size_t val, i = 0;
+    try {
+        for(;; i++ ) {
+            remove( chans[1] );
+        }
+    } catch( channel_closed * e ) {}
+    __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
+}
+
+thread Producer {};
+void main( Producer & this ) {
+    try {
+        for( size_t i = 0;; i++ ) {
+            insert( chans[1], i );
+        }
+    } catch( channel_closed * e ) {}
+}
+
+int main( int argc, char * argv[] ) {
+    processor p[3];
+
+    chans = aalloc( Channels );
+    for ( i; Channels )
+        chans[i]{ ChannelSize };
+
+    {
+        Producer p;
+        SelectProducer sp;
+        Consumer c;
+        SelectConsumer sc;
+
+        sleep(10`s);
+
+        for ( i; Channels )
+            close( chans[i] );
+    }
+    adelete( chans );
+    printf("%zu\n", globalTotal);
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/sidechan.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/sidechan.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/sidechan.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,100 @@
+#include <select.hfa>
+#include <thread.hfa>
+#include <channel.hfa>
+#include <locks.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <time.hfa>
+#include <string.h>
+
+size_t Sets = 1, ChannelSize = 100, Channels = 2;
+
+channel(size_t) * chans;
+
+size_t globalTotal = 0;
+int cons_counter = 0, prod_counter = 0;
+
+thread SelectConsumer {};
+void main( SelectConsumer & this ) {
+    size_t val, i = 0;
+    try {
+        for(;; i++ ) {
+            waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {}
+        }
+    } catch( channel_closed * e ) {}
+    __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
+}
+
+thread SelectProducer {};
+void main( SelectProducer & this ) {
+    try {
+        for( size_t i = 0;; i++ ) {
+            waituntil( chans[0] << i ) {} or waituntil( chans[1] << i ) {}
+        }
+    } catch( channel_closed * e ) {}
+}
+
+thread Consumer {};
+void main( Consumer & this ) {
+    const int idx = __atomic_fetch_add( &cons_counter, 1, __ATOMIC_SEQ_CST ) % Channels;
+    size_t val, i = 0;
+    try {
+        for(;; i++ ) {
+            remove( chans[idx] );
+        }
+    } catch( channel_closed * e ) {}
+    __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
+}
+
+thread Producer {};
+void main( Producer & this ) {
+    const int idx = __atomic_fetch_add( &prod_counter, 1, __ATOMIC_SEQ_CST ) % Channels;
+    try {
+        for( size_t i = 0;; i++ ) {
+            insert( chans[idx], i );
+        }
+    } catch( channel_closed * e ) {}
+}
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			ChannelSize = atoi( argv[2] );
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Sets = atoi( argv[1] );
+			if ( Sets < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ sets (> 0) | 'd' (default " | Sets
+			 | ") ] [ channel size (>= 0) | 'd' (default " | ChannelSize
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+
+    processor p[Sets * 2 + Sets * Channels * 2 - 1];
+
+    chans = aalloc( Channels );
+    for ( i; Channels )
+        chans[i]{ ChannelSize };
+
+    {
+        Producer p[Sets * Channels];
+        SelectProducer sp[Sets];
+        Consumer c[Sets * Channels];
+        SelectConsumer sc[Sets];
+
+        sleep(10`s);
+
+        for ( i; Channels )
+            close( chans[i] );
+    }
+    adelete( chans );
+    printf("%zu\n", globalTotal);
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/spin.cfa
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/spin.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/cfa/spin.cfa	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,99 @@
+#include <select.hfa>
+#include <thread.hfa>
+#include <channel.hfa>
+#include <locks.hfa>
+#include <fstream.hfa>
+#include <stdio.h>
+#include <time.hfa>
+#include <string.h>
+
+// #define NUM_CHANS 1
+#define GLUE_HELPER(x, y) x##y
+#define FN_GLUE(x, y) GLUE_HELPER(x, y)
+
+size_t Processors = 2, Producers = 1, Consumers = 1, ChannelSize = 10;
+
+channel(size_t) * chans;
+
+static inline void cons_wait_1( size_t & val, size_t & i ) { waituntil( val << chans[0] ) {} or else { i--; }  }
+static inline void cons_wait_2( size_t & val, size_t & i ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or else { i--; }  }
+static inline void cons_wait_3( size_t & val, size_t & i ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} or else { i--; }  }
+static inline void cons_wait_4( size_t & val, size_t & i ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} or waituntil( val << chans[3] ) {} or else { i--; }  }
+static inline void cons_wait_5( size_t & val, size_t & i ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} or waituntil( val << chans[3] ) {} or waituntil( val << chans[4] ) {} or else { i--; }  }
+static inline void cons_wait_6( size_t & val, size_t & i ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} or waituntil( val << chans[3] ) {} or waituntil( val << chans[4] ) {} or waituntil( val << chans[5] ) {} or else { i--; }  }
+static inline void cons_wait_7( size_t & val, size_t & i ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} or waituntil( val << chans[3] ) {} or waituntil( val << chans[4] ) {} or waituntil( val << chans[5] ) {} or waituntil( val << chans[6] ) {} or else { i--; }  }
+static inline void cons_wait_8( size_t & val, size_t & i ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} or waituntil( val << chans[2] ) {} or waituntil( val << chans[3] ) {} or waituntil( val << chans[4] ) {} or waituntil( val << chans[5] ) {} or waituntil( val << chans[6] ) {} or waituntil( val << chans[7] ) {} or else { i--; } }
+
+static inline void prods_wait_1( size_t val ) { waituntil( chans[0] << val ) {} or else {} }
+static inline void prods_wait_2( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or else {} }
+static inline void prods_wait_3( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} or else {} }
+static inline void prods_wait_4( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} or waituntil( chans[3] << val ) {} or else {} }
+static inline void prods_wait_5( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} or waituntil( chans[3] << val ) {} or waituntil( chans[4] << val ) {} or else {} }
+static inline void prods_wait_6( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} or waituntil( chans[3] << val ) {} or waituntil( chans[4] << val ) {} or waituntil( chans[5] << val ) {} or else {} }
+static inline void prods_wait_7( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} or waituntil( chans[3] << val ) {} or waituntil( chans[4] << val ) {} or waituntil( chans[5] << val ) {} or waituntil( chans[6] << val ) {} or else {} }
+static inline void prods_wait_8( size_t val ) { waituntil( chans[0] << val ) {} or waituntil( chans[1] << val ) {} or waituntil( chans[2] << val ) {} or waituntil( chans[3] << val ) {} or waituntil( chans[4] << val ) {} or waituntil( chans[5] << val ) {} or waituntil( chans[6] << val ) {} or waituntil( chans[7] << val ) {} or else {} }
+
+size_t globalTotal = 0;
+
+thread Consumer {};
+void main( Consumer & this ) {
+    size_t val, i = 0;
+    try {
+        for(;; i++ ) {
+            FN_GLUE(cons_wait_, NUM_CHANS)(val, i);
+        }
+    } catch( channel_closed * e ) {}
+    __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
+}
+
+thread Producer {};
+void main( Producer & this ) {
+    try {
+        for( size_t i = 0;; i++ ) {
+            FN_GLUE(prods_wait_, NUM_CHANS)(i);
+        }
+    } catch( channel_closed * e ) {}
+}
+
+int main( int argc, char * argv[] ) {
+    switch ( argc ) {
+	  case 3:
+		if ( strcmp( argv[2], "d" ) != 0 ) {			// default ?
+			ChannelSize = atoi( argv[2] );
+		} // if
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Processors = atoi( argv[1] );
+			if ( Processors < 1 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		sout | "Usage: " | argv[0]
+             | " [ processors (> 0) | 'd' (default " | Processors
+			 | ") ] [ channel size (>= 0) | 'd' (default " | ChannelSize
+			 | ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+    Producers = Processors / 2;
+    Consumers = Processors / 2;
+
+    processor p[Processors - 1];
+
+    chans = aalloc( NUM_CHANS );
+    for ( i; NUM_CHANS )
+        chans[i]{ ChannelSize };
+
+    {
+        Producer p[Producers];
+        Consumer c[Consumers];
+
+        sleep(10`s);
+
+        for ( i; NUM_CHANS )
+            close( chans[i] );
+    }
+    adelete( chans );
+    printf("%zu\n", globalTotal);
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/nasus.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/nasus.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/nasus.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,464 @@
+5
+2 4 8 16 24 32
+6 12 18 24 30
+CFA Go 
+contend2: 
+CFA:
+cores	throughput (entries)
+2	19898679
+2	19894150
+2	20137125
+2	19991476
+2	19234635
+4	24597417
+4	23137681
+4	23918947
+4	23122373
+4	24953526
+8	10070010
+8	9620363
+8	9545751
+8	9424066
+8	9460164
+16	6753442
+16	6886566
+16	7291622
+16	6762093
+16	6695073
+24	5786637
+24	6567375
+24	6523225
+24	6611613
+24	6535767
+32	6227126
+32	5669331
+32	5618844
+32	6231765
+32	5572424
+Go:
+cores	throughput (entries)
+2	40037157
+2	38945848
+2	37571150
+2	39936025
+2	37039238
+4	32175550
+4	31962675
+4	32105762
+4	31933749
+4	31992633
+8	15195906
+8	16230217
+8	15627983
+8	15570514
+8	16559040
+16	7221728
+16	6952933
+16	7086069
+16	7031895
+16	7093710
+24	4978681
+24	5140366
+24	5128459
+24	4630814
+24	4676848
+32	4131795
+32	4105783
+32	4481729
+32	4272797
+32	4268574
+contend4: 
+CFA:
+cores	throughput (entries)
+2	16339398
+2	14695219
+2	13848084
+2	16291888
+2	15029757
+4	19966677
+4	20854760
+4	19653169
+4	19833858
+4	21023458
+8	10699611
+8	11219280
+8	10511145
+8	11041690
+8	10967281
+16	7290494
+16	7218116
+16	7842921
+16	7623273
+16	7330702
+24	6109672
+24	6581276
+24	6395101
+24	6472148
+24	6199770
+32	6673246
+32	6836995
+32	6767080
+32	6038521
+32	6864899
+Go:
+cores	throughput (entries)
+2	20077486
+2	20275897
+2	20038097
+2	19919690
+2	20116470
+4	20032686
+4	19957974
+4	20134395
+4	20067732
+4	20055099
+8	11869308
+8	12165199
+8	11236909
+8	12228766
+8	12011988
+16	8018777
+16	8040533
+16	8026976
+16	7952682
+16	7853705
+24	6857428
+24	6334115
+24	6325502
+24	7042792
+24	6902630
+32	4949042
+32	4967659
+32	6227926
+32	6243556
+32	5023701
+contend8: 
+CFA:
+cores	throughput (entries)
+2	3915791
+2	3886691
+2	3959442
+2	4981399
+2	3941817
+4	11127006
+4	11221830
+4	11079265
+4	11151398
+4	11224959
+8	9223444
+8	9024163
+8	9123901
+8	9087014
+8	9453781
+16	7377324
+16	7136077
+16	6563752
+16	7158678
+16	6541387
+24	5955510
+24	5996812
+24	5746359
+24	6361212
+24	5918614
+32	6357515
+32	5691522
+32	6263042
+32	6347267
+32	6368643
+Go:
+cores	throughput (entries)
+2	11062704
+2	11834447
+2	11977981
+2	10213219
+2	11076487
+4	15936414
+4	15949952
+4	15949080
+4	15934646
+4	15939730
+8	8723728
+8	8543977
+8	8526952
+8	9357181
+8	9139019
+16	6443224
+16	6722238
+16	7064065
+16	7531808
+16	7044549
+24	5340807
+24	5546286
+24	6487048
+24	5620639
+24	6466995
+32	4698418
+32	3932033
+32	5878789
+32	4682276
+32	5956515
+spin2: 
+CFA:
+cores	throughput (entries)
+2	17117536
+2	20202783
+2	20556179
+2	20392088
+2	20470298
+4	25887873
+4	25952265
+4	25848766
+4	25837700
+4	25801944
+8	11134838
+8	11555854
+8	11188929
+8	11128470
+8	11699863
+16	8258208
+16	8448259
+16	7713563
+16	7775916
+16	8421946
+24	7250842
+24	7302187
+24	7447901
+24	7262134
+24	6677079
+32	6216074
+32	6948262
+32	6200769
+32	6901374
+32	6114399
+Go:
+cores	throughput (entries)
+2	51893214
+2	51889467
+2	51939463
+2	51801002
+2	51903499
+4	48397770
+4	48273065
+4	48357522
+4	48414843
+4	48354460
+8	17017886
+8	15747240
+8	17507556
+8	16836401
+8	16991476
+16	9864825
+16	9736384
+16	9466884
+16	10636287
+16	11018805
+24	8878797
+24	8309111
+24	8382343
+24	8208643
+24	8267685
+32	7726655
+32	8676947
+32	9565782
+32	7378698
+32	8821379
+spin4: 
+CFA:
+cores	throughput (entries)
+2	10885361
+2	10986228
+2	10922593
+2	10981854
+2	10802839
+4	20170365
+4	20575238
+4	21331044
+4	20673253
+4	18556265
+8	11737217
+8	11748248
+8	11486998
+8	12242609
+8	12343969
+16	7973731
+16	8434888
+16	7739464
+16	8085925
+16	8451073
+24	7494298
+24	7770603
+24	6847549
+24	6848642
+24	6955404
+32	6283388
+32	6267627
+32	6394047
+32	7238228
+32	6447263
+Go:
+cores	throughput (entries)
+2	24474628
+2	24450635
+2	24464130
+2	24388835
+2	24399848
+4	21964092
+4	21927900
+4	21917894
+4	21907439
+4	21919829
+8	9292641
+8	9897648
+8	10087481
+8	9856804
+8	9352230
+16	6875204
+16	7275156
+16	7308155
+16	6185134
+16	7332646
+24	5314855
+24	6130990
+24	6137104
+24	6149285
+24	6138690
+32	5794913
+32	4410110
+32	5699670
+32	5804679
+32	5715486
+spin8: 
+CFA:
+cores	throughput (entries)
+2	7533145
+2	7594283
+2	7638398
+2	7594530
+2	7485690
+4	16766189
+4	18061179
+4	17993902
+4	18011040
+4	16460498
+8	10867024
+8	10843424
+8	11083909
+8	10948061
+8	10822110
+16	7501685
+16	8353481
+16	7320773
+16	7526689
+16	8246035
+24	7236819
+24	6972608
+24	6408133
+24	6354528
+24	6509391
+32	5836946
+32	6608952
+32	6641278
+32	6795005
+32	5860346
+Go:
+cores	throughput (entries)
+2	13790874
+2	14567852
+2	14205324
+2	14504228
+2	14384568
+4	16067014
+4	16066057
+4	16073591
+4	16030101
+4	16061818
+8	9578833
+8	9532381
+8	8701030
+8	9584525
+8	8916123
+16	6552319
+16	6587695
+16	6573825
+16	7169936
+16	7405217
+24	6641876
+24	6621158
+24	5759567
+24	6683788
+24	5741050
+32	4853916
+32	6089821
+32	4777627
+32	4775830
+32	4797652
+sidechan: 
+CFA:
+cores	throughput (entries)
+6	52350358
+6	51089420
+6	51599645
+6	49724864
+6	50690583
+12	22415327
+12	20081063
+12	21935873
+12	21880536
+12	20033232
+18	15456025
+18	15387442
+18	14382883
+18	14035015
+18	15592819
+24	11865714
+24	12301650
+24	12088656
+24	12576841
+24	12162360
+30	13853077
+30	12833176
+30	13571913
+30	12692339
+30	12684621
+Go:
+cores	throughput (entries)
+6	45626050
+6	45619431
+6	44683942
+6	43678277
+6	45086748
+12	35205036
+12	34228171
+12	33791468
+12	35703621
+12	35832911
+18	26240847
+18	25969956
+18	21891404
+18	23696718
+18	24735429
+24	15259398
+24	14293074
+24	15512026
+24	15143365
+24	14071826
+30	11492999
+30	11337248
+30	12332749
+30	12230220
+30	12142768
+order: 
+CFA:
+cores	throughput (entries)
+4	153212169
+4	157994884
+4	158642649
+4	158440202
+4	158443807
+Go:
+cores	throughput (entries)
+4	69227256
+4	68925276
+4	68974826
+4	69283275
+4	69040020
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/nasus_Order
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/nasus_Order	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/nasus_Order	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,1 @@
+15844020 & 6904002
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/nasus_future.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/nasus_future.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/nasus_future.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,64 @@
+5
+2
+6
+CFA 
+future OR:
+CFA:
+cores	throughput (entries)
+2	15566828
+2	15086557
+2	15067263
+2	15120455
+2	15358905
+uC++:
+cores	throughput (entries)
+2	6900123
+2	7041717
+2	6856625
+2	7099780
+2	7001880
+future AND:
+CFA:
+cores	throughput (entries)
+2	12229605
+2	11796118
+2	11763758
+2	11973787
+2	11975449
+uC++:
+cores	throughput (entries)
+2	4431174
+2	4426260
+2	4494870
+2	4481836
+2	4521053
+future ANDOR:
+CFA:
+cores	throughput (entries)
+2	13551357
+2	13524679
+2	13222745
+2	13556235
+2	13315978
+uC++:
+cores	throughput (entries)
+2	10932140
+2	10528383
+2	10136509
+2	8971750
+2	10027387
+future ORAND:
+CFA:
+cores	throughput (entries)
+2	13020750
+2	13202965
+2	13277704
+2	13179737
+2	13017765
+uC++:
+cores	throughput (entries)
+2	5293289
+2	5185935
+2	5188311
+2	5175251
+2	5191507
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/pyke.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/pyke.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/pyke.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,465 @@
+5
+2 4 8 16 24 32
+6 12 18 24 30
+CFA Go 
+contend2: 
+CFA:
+cores	throughput (entries)
+2	9967035
+2	9800656
+2	9930224
+2	9985950
+2	9866750
+4	15365587
+4	15230284
+4	14863936
+4	14792464
+4	14456437
+8	11177325
+8	11399628
+8	11247990
+8	11116979
+8	11180166
+16	8630393
+16	8413553
+16	8586178
+16	8452667
+16	8510492
+24	8172246
+24	8190544
+24	8037263
+24	8029636
+24	8330698
+32	8403854
+32	8472348
+32	8493152
+32	8362818
+32	8390131
+Go:
+cores	throughput (entries)
+2	44914185
+2	45769369
+2	37580742
+2	41070461
+2	39787488
+4	32818773
+4	33049966
+4	33188220
+4	33045833
+4	33316967
+8	15983204
+8	15830646
+8	15569769
+8	15914976
+8	15894024
+16	9079211
+16	8908247
+16	9129370
+16	8989494
+16	9110099
+24	7927422
+24	7855155
+24	7915465
+24	7877308
+24	7971973
+32	7126295
+32	7450573
+32	7349965
+32	7480862
+32	7325246
+contend4: 
+CFA:
+cores	throughput (entries)
+2	7711287
+2	7636048
+2	7879877
+2	7632539
+2	7716597
+4	13538861
+4	13570963
+4	14061876
+4	13745413
+4	13435094
+8	11783506
+8	11835871
+8	11305173
+8	11595505
+8	11776842
+16	9314177
+16	9267802
+16	9198536
+16	9329322
+16	9120626
+24	8519394
+24	8350923
+24	8526669
+24	8506273
+24	8454808
+32	8212978
+32	8161628
+32	8197493
+32	8326109
+32	8335861
+Go:
+cores	throughput (entries)
+2	19305443
+2	18617443
+2	18798213
+2	18900110
+2	18730396
+4	16583610
+4	16976951
+4	16601629
+4	17066647
+4	16921525
+8	10182191
+8	10151597
+8	10274864
+8	10132974
+8	10313177
+16	8112814
+16	8154933
+16	8177719
+16	8144694
+16	8210164
+24	7494676
+24	7424790
+24	7503452
+24	7489997
+24	7457173
+32	7464628
+32	7597947
+32	7465098
+32	7578292
+32	7146705
+contend8: 
+CFA:
+cores	throughput (entries)
+2	4553172
+2	4358948
+2	4633044
+2	4298938
+2	4433528
+4	9268621
+4	9316788
+4	9134321
+4	9317794
+4	9096543
+8	11281989
+8	12106942
+8	12155325
+8	12070751
+8	11840874
+16	10199853
+16	10248616
+16	10268593
+16	10303374
+16	10322409
+24	8729770
+24	8707377
+24	8718720
+24	8638369
+24	8586905
+32	7948616
+32	8162892
+32	7993031
+32	7895951
+32	8222873
+Go:
+cores	throughput (entries)
+2	9455116
+2	9529410
+2	8207766
+2	7795882
+2	7684988
+4	7758234
+4	8248808
+4	8204068
+4	8252258
+4	7820115
+8	7224181
+8	7156840
+8	7248816
+8	7169039
+8	7250521
+16	6412117
+16	6429773
+16	6414842
+16	6474895
+16	6493768
+24	5910867
+24	5943544
+24	5889434
+24	5960548
+24	5854276
+32	5574433
+32	5501965
+32	5660822
+32	5525961
+32	5571871
+spin2: 
+CFA:
+cores	throughput (entries)
+2	11091685
+2	10716028
+2	10263026
+2	11024866
+2	10141356
+4	13458646
+4	12675243
+4	13601822
+4	12493029
+4	13526328
+8	11857151
+8	12449743
+8	12402808
+8	12115910
+8	12328377
+16	9285877
+16	9431990
+16	9498253
+16	9288202
+16	9314209
+24	9134958
+24	9037642
+24	8894318
+24	8878258
+24	8870078
+32	9574533
+32	9558834
+32	8891248
+32	9425577
+32	9575672
+Go:
+cores	throughput (entries)
+2	41407277
+2	41185974
+2	42546942
+2	41599985
+2	41537281
+4	18274724
+4	19403137
+4	19174836
+4	19832568
+4	20434642
+8	12161534
+8	11877215
+8	12092572
+8	11870295
+8	11953849
+16	9400275
+16	9379035
+16	9121639
+16	9313220
+16	9156810
+24	8163137
+24	8212680
+24	7718772
+24	8329378
+24	8242728
+32	8698636
+32	8738083
+32	8712188
+32	8968355
+32	9000456
+spin4: 
+CFA:
+cores	throughput (entries)
+2	8543234
+2	8548877
+2	8428083
+2	8904947
+2	8478075
+4	11365692
+4	12109844
+4	11446726
+4	11515624
+4	11992092
+8	11984771
+8	12153123
+8	11709308
+8	12103916
+8	11953110
+16	9904786
+16	9763922
+16	9743041
+16	9913004
+16	9661295
+24	8960227
+24	8932460
+24	8985062
+24	8957904
+24	9030960
+32	9189691
+32	9389309
+32	9431123
+32	9307976
+32	9216590
+Go:
+cores	throughput (entries)
+2	15669478
+2	15308587
+2	15510092
+2	15437039
+2	15227836
+4	10451307
+4	10417069
+4	9804714
+4	10495039
+4	9877950
+8	7258556
+8	7318110
+8	7471921
+8	7382093
+8	7262086
+16	6219816
+16	6146980
+16	6202815
+16	6120133
+16	6224194
+24	5730137
+24	5586527
+24	5596617
+24	5623077
+24	5682422
+32	5926340
+32	5851871
+32	5871301
+32	5875055
+32	5845408
+spin8: 
+CFA:
+cores	throughput (entries)
+2	5364493
+2	5298352
+2	5343768
+2	5369572
+2	5384383
+4	9898690
+4	9968625
+4	10025418
+4	9986221
+4	10228985
+8	11846407
+8	11885865
+8	11941307
+8	12353081
+8	12148637
+16	10518783
+16	10615015
+16	10459213
+16	10403451
+16	10398262
+24	8988384
+24	8997726
+24	8966938
+24	9034410
+24	9048297
+32	8790460
+32	8967228
+32	8962159
+32	8753670
+32	8859608
+Go:
+cores	throughput (entries)
+2	9066062
+2	9737392
+2	9142101
+2	9187665
+2	9519920
+4	7574448
+4	8050344
+4	7698715
+4	7666895
+4	7638515
+8	7160856
+8	7127596
+8	7059170
+8	7122960
+8	7130382
+16	6412929
+16	6486433
+16	6438736
+16	6485939
+16	6078041
+24	5900909
+24	5962074
+24	5956968
+24	5956481
+24	5970036
+32	5608255
+32	5671451
+32	5571902
+32	5565332
+32	5599883
+sidechan: 
+CFA:
+cores	throughput (entries)
+6	72354348
+6	71860298
+6	72277047
+6	73041939
+6	73059623
+12	25204538
+12	25305309
+12	24503906
+12	25391473
+12	25444230
+18	21692078
+18	22384941
+18	22535288
+18	22239042
+18	22360659
+24	18246388
+24	18267877
+24	17924009
+24	18457526
+24	17959192
+30	22892750
+30	22855602
+30	21234954
+30	22781023
+30	23008437
+Go:
+cores	throughput (entries)
+6	47262886
+6	47522972
+6	47191097
+6	47649131
+6	47126015
+12	37610289
+12	38562781
+12	37069115
+12	37159580
+12	38417947
+18	20760742
+18	20449941
+18	20645451
+18	20441743
+18	20929537
+24	14620575
+24	14475628
+24	14995888
+24	14401480
+24	14549618
+30	12383406
+30	11910359
+30	10780129
+30	12028827
+30	12367389
+order: 
+CFA:
+cores	throughput (entries)
+4	68683961
+4	69299441
+4	62515413
+4	68207586
+4	68368563
+Go:
+cores	throughput (entries)
+4	60368130
+4	60454358
+4	60967535
+4	59271747
+4	61334120
+
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/pyke_Order
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/pyke_Order	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/pyke_Order	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,1 @@
+6836856 & 6045435
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/pyke_future.txt
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/pyke_future.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/data/pyke_future.txt	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,64 @@
+5
+2
+6
+CFA 
+future OR:
+CFA:
+cores	throughput (entries)
+2	7979542
+2	8195420
+2	8339041
+2	7735845
+2	8279155
+uC++:
+cores	throughput (entries)
+2	4648297
+2	4766391
+2	4631747
+2	4600202
+2	4683445
+future AND:
+CFA:
+cores	throughput (entries)
+2	5400791
+2	5792970
+2	6061253
+2	6034621
+2	5792246
+uC++:
+cores	throughput (entries)
+2	4190818
+2	4127246
+2	4026182
+2	4219090
+2	4203589
+future ANDOR:
+CFA:
+cores	throughput (entries)
+2	6889728
+2	6644816
+2	6871689
+2	6713521
+2	6881730
+uC++:
+cores	throughput (entries)
+2	4465233
+2	4371764
+2	4374007
+2	4109526
+2	4262671
+future ORAND:
+CFA:
+cores	throughput (entries)
+2	6393712
+2	6276503
+2	6238200
+2	6444010
+2	6433157
+uC++:
+cores	throughput (entries)
+2	4198438
+2	4312017
+2	3417079
+2	3350573
+2	3331244
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/genPlots
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/genPlots	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/genPlots	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,5 @@
+#!/bin/bash -
+python3 plotData.py data/nasus.txt nasus_
+python3 plotData.py data/pyke.txt pyke_
+python3 plotData.py data/nasus_future.txt nasus_
+python3 plotData.py data/pyke_future.txt pyke_
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend/contend.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend/contend.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend/contend.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,123 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Channels, Prods, Cons, ChannelSize int = 2, 8, 1, 1, 10
+var cons_done, prod_done bool = false, false;
+var total_operations, cons_check, prod_check uint64 = 0, 0, 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int, Prods)
+var consJoin chan int = make(chan int, Cons)
+
+func consumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }
+		
+		select {
+			case <- chans[0]:
+			case <- chans[1]:
+			case <- chans[2]:
+			case <- chans[3]:
+			case <- chans[4]:
+			case <- chans[5]:
+			case <- chans[6]:
+			case <- chans[7]:
+		}
+		if ! prod_done { count++ }
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func producer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if prod_done { break }
+		select {
+			case chans[0] <- count:
+			case chans[1] <- count:
+			case chans[2] <- count:
+			case chans[3] <- count:
+			case chans[4] <- count:
+			case chans[5] <- count:
+			case chans[6] <- count:
+			case chans[7] <- count:
+		}
+		count++
+	}
+	prodJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ ChannelSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, ChannelSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				ChannelSize, _ = strconv.Atoi( os.Args[2] )
+					if ChannelSize < 0 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	Prods = Processors /2
+	Cons = Processors / 2
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+	for j := 0; j < Prods; j++ {
+		go producer( chans )
+	}
+
+	for j := 0; j < Cons; j++ {
+		go consumer( chans )
+	}
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	prod_done = true
+	for j := 0; j < Prods; j++ {
+		<-prodJoin
+	}
+	// fmt.Println("cons done\n")
+	cons_done = true
+	for i := range chans {
+		close(chans[i])
+	}
+	
+	for j := 0; j < Cons; j++{
+		<-consJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module contend
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend2/contend.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend2/contend.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend2/contend.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,111 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Channels, Prods, Cons, ChannelSize int = 2, 2, 1, 1, 10
+var cons_done, prod_done bool = false, false;
+var total_operations, cons_check, prod_check uint64 = 0, 0, 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int, Prods)
+var consJoin chan int = make(chan int, Cons)
+
+func consumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }
+		
+		select {
+			case <- chans[0]:
+			case <- chans[1]:
+		}
+		if ! prod_done { count++ }
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func producer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if prod_done { break }
+		select {
+			case chans[0] <- count:
+			case chans[1] <- count:
+		}
+		count++
+	}
+	prodJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ ChannelSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, ChannelSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				ChannelSize, _ = strconv.Atoi( os.Args[2] )
+					if ChannelSize < 0 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	Prods = Processors /2
+	Cons = Processors / 2
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+	for j := 0; j < Prods; j++ {
+		go producer( chans )
+	}
+
+	for j := 0; j < Cons; j++ {
+		go consumer( chans )
+	}
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	prod_done = true
+	for j := 0; j < Prods; j++ {
+		<-prodJoin
+	}
+	// fmt.Println("cons done\n")
+	cons_done = true
+	for i := range chans {
+		close(chans[i])
+	}
+	
+	for j := 0; j < Cons; j++{
+		<-consJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend2/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend2/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend2/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module contend
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend4/contend.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend4/contend.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend4/contend.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,115 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Channels, Prods, Cons, ChannelSize int = 2, 4, 1, 1, 10
+var cons_done, prod_done bool = false, false;
+var total_operations, cons_check, prod_check uint64 = 0, 0, 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int, Prods)
+var consJoin chan int = make(chan int, Cons)
+
+func consumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }
+		
+		select {
+			case <- chans[0]:
+			case <- chans[1]:
+			case <- chans[2]:
+			case <- chans[3]:
+		}
+		if ! prod_done { count++ }
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func producer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if prod_done { break }
+		select {
+			case chans[0] <- count:
+			case chans[1] <- count:
+			case chans[2] <- count:
+			case chans[3] <- count:
+		}
+		count++
+	}
+	prodJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ ChannelSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, ChannelSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				ChannelSize, _ = strconv.Atoi( os.Args[2] )
+					if ChannelSize < 0 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	Prods = Processors /2
+	Cons = Processors / 2
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+	for j := 0; j < Prods; j++ {
+		go producer( chans )
+	}
+
+	for j := 0; j < Cons; j++ {
+		go consumer( chans )
+	}
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	prod_done = true
+	for j := 0; j < Prods; j++ {
+		<-prodJoin
+	}
+	// fmt.Println("cons done\n")
+	cons_done = true
+	for i := range chans {
+		close(chans[i])
+	}
+	
+	for j := 0; j < Cons; j++{
+		<-consJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend4/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend4/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend4/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module contend
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend8/contend.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend8/contend.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend8/contend.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,123 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Channels, Prods, Cons, ChannelSize int = 2, 8, 1, 1, 10
+var cons_done, prod_done bool = false, false;
+var total_operations, cons_check, prod_check uint64 = 0, 0, 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int, Prods)
+var consJoin chan int = make(chan int, Cons)
+
+func consumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }
+		
+		select {
+			case <- chans[0]:
+			case <- chans[1]:
+			case <- chans[2]:
+			case <- chans[3]:
+			case <- chans[4]:
+			case <- chans[5]:
+			case <- chans[6]:
+			case <- chans[7]:
+		}
+		if ! prod_done { count++ }
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func producer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if prod_done { break }
+		select {
+			case chans[0] <- count:
+			case chans[1] <- count:
+			case chans[2] <- count:
+			case chans[3] <- count:
+			case chans[4] <- count:
+			case chans[5] <- count:
+			case chans[6] <- count:
+			case chans[7] <- count:
+		}
+		count++
+	}
+	prodJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ ChannelSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, ChannelSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				ChannelSize, _ = strconv.Atoi( os.Args[2] )
+					if ChannelSize < 0 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	Prods = Processors /2
+	Cons = Processors / 2
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+	for j := 0; j < Prods; j++ {
+		go producer( chans )
+	}
+
+	for j := 0; j < Cons; j++ {
+		go consumer( chans )
+	}
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	prod_done = true
+	for j := 0; j < Prods; j++ {
+		<-prodJoin
+	}
+	// fmt.Println("cons done\n")
+	cons_done = true
+	for i := range chans {
+		close(chans[i])
+	}
+	
+	for j := 0; j < Cons; j++{
+		<-consJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend8/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend8/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/contend8/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module contend
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/order/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/order/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/order/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module order
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/order/order.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/order/order.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/order/order.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,109 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+)
+
+var Channels, ChannelSize int = 2, 100
+var cons_done, prod_done bool = false, false;
+var total_operations uint64 = 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int)
+var consJoin chan int = make(chan int)
+
+func selectconsumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }		
+		select {
+			case <- chans[0]:
+			case <- chans[1]:
+		}
+		if ! prod_done { count++ }
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func consumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }		
+		<-chans[1]
+		if ! prod_done { count++ }
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func selectproducer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	var checksum uint64 = 0
+	for {
+		if prod_done { break }
+		checksum = checksum ^ count
+		select {
+			case chans[0] <- count:
+			case chans[1] <- count:
+		}
+		count++
+	}
+	prodJoin <- 0
+}
+
+func producer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	var checksum uint64 = 0
+	for {
+		if prod_done { break }
+		checksum = checksum ^ count
+		chans[1] <- count
+		count++
+	}
+	prodJoin <- 0
+}
+
+
+func main() {
+	runtime.GOMAXPROCS( 4 );
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+
+	
+	go selectproducer( chans )
+	go selectconsumer( chans )
+	go producer( chans )
+	go consumer( chans )
+	
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	prod_done = true
+	for j := 0; j < 2; j++ {
+		<-prodJoin
+	}
+	// fmt.Println("cons done\n")
+	cons_done = true
+	for i := range chans {
+		close(chans[i])
+	}
+	
+	for j := 0; j < 2; j++{
+		<-consJoin
+	}
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/sidechan/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/sidechan/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/sidechan/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module sidechan
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/sidechan/sidechan.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/sidechan/sidechan.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/sidechan/sidechan.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,136 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Sets, Channels, ChannelSize int = 1, 2, 100
+var cons_done, prod_done bool = false, false;
+var total_operations uint64 = 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int)
+var consJoin chan int = make(chan int)
+
+func selectconsumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }		
+		select {
+			case <- chans[0]:
+			case <- chans[1]:
+		}
+		if ! prod_done { count++ }
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func consumer( channel chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }
+		<-channel
+		if ! prod_done { count++ }
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func selectproducer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	var checksum uint64 = 0
+	for {
+		if prod_done { break }
+		checksum = checksum ^ count
+		select {
+			case chans[0] <- count:
+			case chans[1] <- count:
+		}
+		count++
+	}
+	prodJoin <- 0
+}
+
+func producer( channel chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if prod_done { break }
+		channel <- count
+		count++
+	}
+	prodJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ sets (> 0) | 'd' (default %v) ] " +
+		"[ ChannelSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Sets, ChannelSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				ChannelSize, _ = strconv.Atoi( os.Args[2] )
+					if ChannelSize < 0 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Sets, _ = strconv.Atoi( os.Args[1] )
+				if Sets < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Sets * 2 + Sets * Channels * 2 );
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+
+	
+	for j := 0; j < Sets; j++ {
+		go selectproducer( chans )
+		go selectconsumer( chans )
+		for i := 0; i < Channels; i++ {
+			go producer( chans[i] )
+			go consumer( chans[i] )
+		}
+	}
+		
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	prod_done = true
+	for j := 0; j < Sets + Sets * Channels; j++ {
+		<-prodJoin
+	}
+	// fmt.Println("cons done\n")
+	cons_done = true
+	for i := range chans {
+		close(chans[i])
+	}
+	
+	for j := 0; j < Sets + Sets * Channels; j++{
+		<-consJoin
+	}
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module spin
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin/spin.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin/spin.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin/spin.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,133 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Channels, Prods, Cons, ChannelSize int = 2, 8, 1, 1, 10
+var cons_done, prod_done bool = false, false;
+var total_operations uint64 = 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int)
+var consJoin chan int = make(chan int)
+
+func consumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }
+		
+		select {
+			case <- chans[0]:
+				if ! prod_done { count++ }
+			case <- chans[1]:
+				if ! prod_done { count++ }
+			case <- chans[2]:
+				if ! prod_done { count++ }
+			case <- chans[3]:
+				if ! prod_done { count++ }
+			case <- chans[4]:
+				if ! prod_done { count++ }
+			case <- chans[5]:
+				if ! prod_done { count++ }
+			case <- chans[6]:
+				if ! prod_done { count++ }
+			case <- chans[7]:
+				if ! prod_done { count++ }
+			default:
+		}
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func producer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if prod_done { break }
+		select {
+			case chans[0] <- count:
+			case chans[1] <- count:
+			case chans[2] <- count:
+			case chans[3] <- count:
+			case chans[4] <- count:
+			case chans[5] <- count:
+			case chans[6] <- count:
+			case chans[7] <- count:
+			default:
+		}
+		count++
+	}
+	prodJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ ChannelSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, ChannelSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				ChannelSize, _ = strconv.Atoi( os.Args[2] )
+					if ChannelSize < 0 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	Prods = Processors /2
+	Cons = Processors / 2
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+	for j := 0; j < Prods; j++ {
+		go producer( chans )
+	}
+
+	for j := 0; j < Cons; j++ {
+		go consumer( chans )
+	}
+		
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	prod_done = true
+	for j := 0; j < Prods; j++ {
+		<-prodJoin
+	}
+	// fmt.Println("cons done\n")
+	cons_done = true
+	for i := range chans {
+		close(chans[i])
+	}
+	
+	for j := 0; j < Cons; j++{
+		<-consJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin2/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin2/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin2/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module spin
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin2/spin.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin2/spin.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin2/spin.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,115 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Channels, Prods, Cons, ChannelSize int = 2, 2, 1, 1, 10
+var cons_done, prod_done bool = false, false;
+var total_operations uint64 = 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int)
+var consJoin chan int = make(chan int)
+
+func consumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }
+		
+		select {
+			case <- chans[0]:
+				if ! prod_done { count++ }
+			case <- chans[1]:
+				if ! prod_done { count++ }
+			default:
+		}
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func producer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if prod_done { break }
+		select {
+			case chans[0] <- count:
+			case chans[1] <- count:
+			default:
+		}
+		count++
+	}
+	prodJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ ChannelSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, ChannelSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				ChannelSize, _ = strconv.Atoi( os.Args[2] )
+					if ChannelSize < 0 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	Prods = Processors /2
+	Cons = Processors / 2
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+	for j := 0; j < Prods; j++ {
+		go producer( chans )
+	}
+
+	for j := 0; j < Cons; j++ {
+		go consumer( chans )
+	}
+		
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	prod_done = true
+	for j := 0; j < Prods; j++ {
+		<-prodJoin
+	}
+	// fmt.Println("cons done\n")
+	cons_done = true
+	for i := range chans {
+		close(chans[i])
+	}
+	
+	for j := 0; j < Cons; j++{
+		<-consJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin4/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin4/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin4/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module spin
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin4/spin.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin4/spin.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin4/spin.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,120 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Channels, Prods, Cons, ChannelSize int = 2, 4, 1, 1, 10
+var cons_done, prod_done bool = false, false;
+var total_operations uint64 = 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int)
+var consJoin chan int = make(chan int)
+
+func consumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }
+		
+		select {
+			case <- chans[0]:
+				if ! prod_done { count++ }
+			case <- chans[1]:
+				if ! prod_done { count++ }
+			case <- chans[2]:
+				if ! prod_done { count++ }
+			case <- chans[3]:
+			default:
+		}
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func producer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if prod_done { break }
+		select {
+			case chans[0] <- count:
+			case chans[1] <- count:
+			case chans[2] <- count:
+			case chans[3] <- count:
+			default:
+		}
+		count++
+	}
+	prodJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ ChannelSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, ChannelSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				ChannelSize, _ = strconv.Atoi( os.Args[2] )
+					if ChannelSize < 0 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	Prods = Processors /2
+	Cons = Processors / 2
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+	for j := 0; j < Prods; j++ {
+		go producer( chans )
+	}
+
+	for j := 0; j < Cons; j++ {
+		go consumer( chans )
+	}
+		
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	prod_done = true
+	for j := 0; j < Prods; j++ {
+		<-prodJoin
+	}
+	// fmt.Println("cons done\n")
+	cons_done = true
+	for i := range chans {
+		close(chans[i])
+	}
+	
+	for j := 0; j < Cons; j++{
+		<-consJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin8/go.mod
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin8/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin8/go.mod	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,3 @@
+module spin
+
+go 1.18
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin8/spin.go
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin8/spin.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/go/spin8/spin.go	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,133 @@
+package main
+
+import (
+	"fmt"
+	"sync"
+	"time"
+	"runtime"
+	"os"
+	"strconv"
+)
+
+var Processors, Channels, Prods, Cons, ChannelSize int = 2, 8, 1, 1, 10
+var cons_done, prod_done bool = false, false;
+var total_operations uint64 = 0
+var m sync.Mutex
+
+var prodJoin chan int = make(chan int)
+var consJoin chan int = make(chan int)
+
+func consumer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if cons_done { break }
+		
+		select {
+			case <- chans[0]:
+				if ! prod_done { count++ }
+			case <- chans[1]:
+				if ! prod_done { count++ }
+			case <- chans[2]:
+				if ! prod_done { count++ }
+			case <- chans[3]:
+				if ! prod_done { count++ }
+			case <- chans[4]:
+				if ! prod_done { count++ }
+			case <- chans[5]:
+				if ! prod_done { count++ }
+			case <- chans[6]:
+				if ! prod_done { count++ }
+			case <- chans[7]:
+				if ! prod_done { count++ }
+			default:
+		}
+	}
+	m.Lock()
+	total_operations += count
+	m.Unlock()
+	consJoin <- 0
+}
+
+func producer( chans [] chan uint64 ) {
+	var count uint64 = 0
+	for {
+		if prod_done { break }
+		select {
+			case chans[0] <- count:
+			case chans[1] <- count:
+			case chans[2] <- count:
+			case chans[3] <- count:
+			case chans[4] <- count:
+			case chans[5] <- count:
+			case chans[6] <- count:
+			case chans[7] <- count:
+			default:
+		}
+		count++
+	}
+	prodJoin <- 0
+}
+
+func usage() {
+	fmt.Printf( "Usage: %v " +
+		"[ processors (> 0) | 'd' (default %v) ] " +
+		"[ ChannelSize (> 0) | 'd' (default %v) ]\n",
+		os.Args[0], Processors, ChannelSize );
+	os.Exit( 1 );
+}
+
+func main() {
+	switch len( os.Args ) {
+		case 3:
+			if os.Args[2] != "d" {							// default ?
+				ChannelSize, _ = strconv.Atoi( os.Args[2] )
+					if ChannelSize < 0 { usage(); }
+			} // if
+		fallthrough
+		case 2:
+			if os.Args[1] != "d" {							// default ?
+				Processors, _ = strconv.Atoi( os.Args[1] )
+				if Processors < 1 { usage(); }
+			} // if
+		case 1:											// use defaults
+		default:
+		usage();
+	} // switch
+	runtime.GOMAXPROCS( Processors );
+	Prods = Processors /2
+	Cons = Processors / 2
+
+	// fmt.Println("Processors: ",Processors," Channels: ",Channels," ProdsPerChan: ",ProdsPerChan," ConsPerChan: ",ConsPerChan," Channel Size: ",ChannelSize)
+	
+	chans := make( [] chan uint64, Channels )
+	for i := range chans {
+		chans[i] = make(chan uint64, ChannelSize)
+	}
+	for j := 0; j < Prods; j++ {
+		go producer( chans )
+	}
+
+	for j := 0; j < Cons; j++ {
+		go consumer( chans )
+	}
+		
+
+	// wait 10 seconds
+	time.Sleep(time.Second * 10)
+	// fmt.Println("prod done\n")
+	prod_done = true
+	for j := 0; j < Prods; j++ {
+		<-prodJoin
+	}
+	// fmt.Println("cons done\n")
+	cons_done = true
+	for i := range chans {
+		close(chans[i])
+	}
+	
+	for j := 0; j < Cons; j++{
+		<-consJoin
+	}
+
+    fmt.Println(total_operations)
+}
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/plotData.py
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/plotData.py	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/plotData.py	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,273 @@
+import os
+import sys
+import time
+import itertools
+import matplotlib.pyplot as plt
+import matplotlib.ticker as ticks
+import math
+from scipy import stats as st
+import numpy as np
+from enum import Enum
+from statistics import median
+
+import matplotlib
+matplotlib.use("pgf")
+matplotlib.rcParams.update({
+    "pgf.texsystem": "pdflatex",
+    'font.family': 'serif',
+    'text.usetex': True,
+    'pgf.rcfonts': False,
+    'font.size': 16
+})
+marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' )) 
+
+readfile = open(sys.argv[1], "r")
+
+machineName = ""
+
+if len(sys.argv) > 2:
+    machineName = sys.argv[2]
+
+# first line has num times per experiment
+line = readfile.readline()
+numTimes = int(line)
+
+# second line has processor args
+line = readfile.readline()
+procs = []
+for val in line.split():
+    procs.append(int(val))
+
+# 3rd line has processor for side_chan bench
+line = readfile.readline()
+sideChanProcs = []
+for val in line.split():
+    sideChanProcs.append(int(val))
+
+# 4th line has number of variants
+line = readfile.readline()
+names = line.split()
+numVariants = len(names)
+
+lines = (line.rstrip() for line in readfile) # All lines including the blank ones
+lines = (line for line in lines if line) # Non-blank lines
+
+def sci_format(x, pos):
+    return '{:.1e}'.format(x).replace('+0', '')
+
+def sci_format_label(x):
+    return '{:.2e}'.format(x).replace('+0', '')
+
+class Bench(Enum):
+    Unset = 0
+    Contend2 = 1
+    Contend4 = 2
+    Contend8 = 3
+    Spin2 = 4
+    Spin4 = 5
+    Spin8 = 6
+    SideChan = 7
+    Future = 8
+    Order = 9
+
+nameSet = False
+currBench = Bench.Unset # default val
+count = 0
+procCount = 0
+currVariant = 0
+name = ""
+title = ""
+experiment_duration = 10.0
+var_name = ""
+future_variants=["CFA", "uC++"]
+future_names=["OR", "AND", "AND-OR", "OR-AND"]
+future_data=[[0.0 for i in range(len(future_names))] for j in range(2)]
+future_bars=[[[0.0 for i in range(len(future_names))],[0.0 for k in range(len(future_names))]] for j in range(2)]
+curr_future=0
+sendData = [0.0 for j in range(numVariants)]
+data = [[0.0 for i in range(len(procs))] for j in range(numVariants)]
+bars = [[[0.0 for i in range(len(procs))],[0.0 for k in range(len(procs))]] for j in range(numVariants)]
+sideData = [[0.0 for i in range(len(sideChanProcs))] for j in range(numVariants)]
+sideBars = [[[0.0 for i in range(len(sideChanProcs))],[0.0 for k in range(len(sideChanProcs))]] for j in range(numVariants)]
+tempData = [0.0 for i in range(numTimes)]
+orderData = [0.0 for i in range(numVariants)]
+for idx, line in enumerate(lines):
+    # print(line)
+    
+    if currBench == Bench.Unset:
+        if line == "contend2:":
+            name = "Contend_2"
+            title = "2 Clause Contend"
+            currBench = Bench.Contend2
+        elif line == "contend4:":
+            name = "Contend_4"
+            title = "4 Clause Contend"
+            currBench = Bench.Contend4
+        elif line == "contend8:":
+            name = "Contend_8"
+            title = "8 Clause Contend"
+            currBench = Bench.Contend8
+        elif line == "spin2:":
+            name = "Spin_2"
+            title = "2 Clause Spin"
+            currBench = Bench.Spin2
+        elif line == "spin4:":
+            name = "Spin_4"
+            title = "4 Clause Spin"
+            currBench = Bench.Spin4
+        elif line == "spin8:":
+            name = "Spin_8"
+            title = "8 Clause Spin"
+            currBench = Bench.Spin8
+        elif line == "sidechan:":
+            name = "Sidechan"
+            currBench = Bench.SideChan
+        elif line[0:6] == "future":
+            name = "Future"
+            title = "Future Synchronization"
+            currBench = Bench.Future
+        elif line == "order:":
+            name = "order"
+            currBench = Bench.Order
+        else:
+            print("Expected benchmark name")
+            print("Line: " + line)
+            sys.exit()
+        continue
+
+    if line[0:5] == "cores":
+        continue
+
+    if not nameSet:
+        nameSet = True
+        continue
+    
+    lineArr = line.split()
+    tempData[count] = float(lineArr[-1]) / experiment_duration
+    count += 1
+
+    if currBench == Bench.Future:
+        if count == numTimes:
+            currMedian = median( tempData )
+            future_data[currVariant][curr_future] = currMedian
+            lower, upper = st.t.interval(0.95, numTimes - 1, loc=np.mean(tempData), scale=st.sem(tempData))
+            future_bars[currVariant][0][curr_future] = currMedian - lower
+            future_bars[currVariant][1][curr_future] = upper - currMedian
+            count = 0
+            nameSet = False
+            currVariant += 1
+            if currVariant == 2:
+                curr_future += 1
+                # reset
+                currBench = Bench.Unset
+                currVariant = 0
+                if curr_future == len(future_names):
+                    x = np.arange(len(future_names))  # the label locations
+                    width = 0.45  # the width of the bars
+                    multiplier = .5
+                    fig, ax = plt.subplots(layout='constrained')
+                    plt.title(title + " Benchmark")
+                    plt.ylabel("Throughput (statement completions per second)")
+                    plt.xlabel("Operation")
+                    ax.yaxis.set_major_formatter(ticks.FuncFormatter(sci_format))
+                    for idx, arr in enumerate(future_data):
+                        offset = width * multiplier
+                        rects = ax.bar(x + offset, arr, width, label=future_variants[idx], yerr=[future_bars[idx][0], future_bars[idx][1]])
+                        # ax.bar_label(rects, padding=3, fmt='%.1e')
+                        ax.bar_label(rects, padding=3, fmt=sci_format_label)
+                        multiplier += 1
+                    plt.xticks(x + width, future_names)
+                    
+                    ax.legend(future_variants, loc='lower right')
+                    # fig.savefig("plots/" + machineName + name + ".png")
+                    plt.savefig("plots/" + machineName + name + ".pgf")
+                    fig.clf()
+
+    elif currBench == Bench.Order:
+        if count == numTimes:
+            currMedian = median( tempData )
+            orderData[currVariant] = currMedian
+            count = 0
+            currVariant += 1
+            procCount = 0
+            nameSet = False
+            if currVariant == numVariants:
+                fileName = "data/" + machineName + "Order"
+                f = open(fileName, 'w')
+                f.write(" & ".join(map(lambda a: str(int(a)), orderData)))
+                
+                # reset
+                currBench = Bench.Unset
+                currVariant = 0
+
+    elif currBench == Bench.SideChan:
+        if count == numTimes:
+            currMedian = median( tempData )
+            sideData[currVariant][procCount] = currMedian
+            lower, upper = st.t.interval(0.95, numTimes - 1, loc=np.mean(tempData), scale=st.sem(tempData))
+            sideBars[currVariant][0][procCount] = currMedian - lower
+            sideBars[currVariant][1][procCount] = upper - currMedian
+            count = 0
+            procCount += 1
+            if procCount == len(sideChanProcs):
+                procCount = 0
+                nameSet = False
+                currVariant += 1
+
+                if currVariant == numVariants:
+                    fig, ax = plt.subplots()
+                    plt.title(name + " Benchmark")
+                    plt.ylabel("Throughput (channel operations per second)")
+                    plt.xlabel("Cores")
+                    ax.yaxis.set_major_formatter(ticks.FuncFormatter(sci_format))
+                    for idx, arr in enumerate(sideData):
+                        plt.errorbar( sideChanProcs, arr, [sideBars[idx][0], sideBars[idx][1]], capsize=2, marker=next(marker) )
+                    plt.xticks(sideChanProcs)
+                    marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' )) 
+                    # plt.yscale("log")
+                    ax.legend(names)
+                    # fig.savefig("plots/" + machineName + name + ".png")
+                    plt.savefig("plots/" + machineName + name + ".pgf")
+                    fig.clf()
+
+                    # reset
+                    currBench = Bench.Unset
+                    currVariant = 0
+    else:
+        if count == numTimes:
+            currMedian = median( tempData )
+            data[currVariant][procCount] = currMedian
+            lower, upper = st.t.interval(0.95, numTimes - 1, loc=np.mean(tempData), scale=st.sem(tempData))
+            bars[currVariant][0][procCount] = currMedian - lower
+            bars[currVariant][1][procCount] = upper - currMedian
+            count = 0
+            procCount += 1
+
+            if procCount == len(procs):
+                procCount = 0
+                nameSet = False
+                currVariant += 1
+
+                if currVariant == numVariants:
+                    fig, ax = plt.subplots(layout='constrained')
+                    plt.title(title + " Benchmark")
+                    plt.ylabel("Throughput (channel operations per second)")
+                    plt.xlabel("Cores")
+                    ax.yaxis.set_major_formatter(ticks.FuncFormatter(sci_format))
+                    for idx, arr in enumerate(data):
+                        plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker=next(marker) )
+                    plt.xticks(procs)
+                    marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' )) 
+                    # plt.yscale("log")
+                    # plt.ylim(1, None)
+                    # ax.get_yaxis().set_major_formatter(ticks.ScalarFormatter())
+                    # else:
+                    #     plt.ylim(0, None)
+                    ax.legend(names)
+                    # fig.savefig("plots/" + machineName + name + ".png")
+                    plt.savefig("plots/" + machineName + name + ".pgf")
+                    fig.clf()
+
+                    # reset
+                    currBench = Bench.Unset
+                    currVariant = 0
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/run
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/run	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/run	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,314 @@
+#!/bin/bash -
+
+false=0; true=1
+
+# Usage: arch [ hostname ] returns hostname, cores, startcore
+#
+#   Define machine architecture based on starting socket, CPUs (cores) per socket, number of
+#   sockets, has hyperthreading.
+
+start=0
+
+arch() {
+	hostname=${1:-`hostname`}			# return value
+	hashyper=${true}					# assume machine has hyperthreads
+	if [ "${hostname}" = "plg2" ] ; then
+		startsocket=${start}
+		cps=16							# coresPerSocket
+		sockets=2
+		hashyper=${false}				# has no hyperthreads
+	elif [ "${hostname}" = "nasus" ] ; then
+		startsocket=${start}
+		cps=64							# coresPerSocket
+		sockets=2
+	elif [ "${hostname}" = "pyke" ] ; then
+		startsocket=${start}
+		cps=24							# coresPerSocket
+		sockets=2
+	elif [ "${hostname}" = "jax" ] ; then
+		startsocket=${start}
+		cps=24							# coresPerSocket
+		sockets=4
+	else
+		echo "unsupported host" ${hostname}
+		exit 1
+	fi
+	cores=$(( ${cps} * ${sockets} ))
+	startcore=$(( ${startsocket} * ${cps} ))
+}
+
+# Usage: affinity (global cps, sockets, startsocket, hashyper, cores, startcore, wrap)
+#   returns taskset argument
+#
+#   This routine assumes hyperthreading has only 2 hyperthreads per core.
+#
+#   If hyperthread scanning is used: processor units are assigned across the low-number hyperthreads
+#   of the socket's cores. When the low-number hyperthreads are filled, the high-number hyperhtreads
+#   are assigned across the socket's cores. Then the next socket is assigned.
+#
+#   If hyperthread wrapping is used: processor units are assigned in low/high-number pairs of
+#   hyperthreads across the socket's cores. Then the next socket is assigned.
+
+wrap=${false}							# set to control hyperthread assignment across socket cores
+
+affinity() {
+	if [ ${wrap} -eq ${true} -a ${hashyper} -eq ${false} ] ; then
+		echo "architecture does not support hyperthreading for wrapping"
+		exit 1
+	fi
+	taskset=""							# return value
+	set -- $(( ${1} - 1 ))				# decrement $1
+	if [ ${1} -eq 0 ] ; then taskset="${startcore}-${startcore}"; return; fi
+	if [ ${1} -ge $(( ${cps} * ( ${sockets} - ${startsocket} ) * ( ${hashyper} + 1 ) )) ] ; then # error
+		echo "not enough cores $(( ${cores} * ${sockets} )) for $(( ${1} + 1 )) starting at ${startcore}"
+		exit 1
+	fi
+	if [ ${hashyper} -eq ${false} ] ; then taskset="${startcore}-$(( ${1} + ${startcore} ))"; return; fi # no hyperthreads
+	start2=$(( ${startcore} + ${cores} ))
+	if [ ${wrap} -eq ${true} ] ; then 	# hyperthread wrapping
+		end1=$(( ${1} / 2 + ${startcore} ))
+		end2=$(( ${end1} + ${cores} ))
+		if [ $(( ${1} % 2 )) -eq 0 ] ; then
+			end2=$(( ${end2} - 1 ))
+		fi
+		taskset="${startcore}-${end1},${start2}-${end2}"
+	else								# hyperthread scanning
+		if [ ${1} -lt ${cps} ] ; then taskset="${startcore}-$(( ${1} + ${startcore} ))"; return; fi
+		filled=$(( ${1} / ( ${cps} * 2 ) * ${cps} ))
+		modulus=$(( ${1} % ( ${cps} * 2 ) ))	# leftover cores added to saturated sockets
+		if [ ${modulus} -gt ${cps} ] ; then
+			taskset="${startcore}-$(( ${startcore} + ${filled} + ${cps} - 1 )),${start2}-$(( ${start2} + ${filled} + ${modulus} % ${cps} ))"
+		else
+			taskset="${startcore}-$(( ${startcore} + ${filled} + ${modulus} )),${start2}-$(( ${start2} + ${filled} - 1 ))"
+		fi
+	fi
+}
+
+numtimes=5
+# numtimes=1
+
+# num_threads='2 4 8 16 24 32'
+side_chan_threads='6 12 18 24 30' # must be mults of 6
+num_threads='2'
+# side_chan_threads='6'
+
+chan_size='10'
+future_time='10'
+future_flags=('-DOR' '-DAND3' '-DANDOR' '-DORAND')
+future_names=('OR' 'AND' 'ANDOR' 'ORAND')
+
+# toggle benchmarks
+spin=${true}
+contend=${true}
+sidechan=${true}
+future=${true}
+order=${true}
+spin=${false}
+contend=${false}
+sidechan=${false}
+future=${false}
+# order=${false}
+
+runCFA=${true}
+runGO=${true}
+# runUCPP=${true}
+# runCFA=${false}
+# runGO=${false}
+runUCPP=${false}
+
+cfa=~/cfa-cc/driver/cfa
+
+# Helpers to minimize code duplication
+
+# repeats a command ${numtimes}
+preprint=''
+repeat_command() {
+    t=1
+    while [ ${t} -le ${numtimes} ] ; do
+        echo -n -e ${preprint}
+        "${@}"
+        t=`expr ${t} + 1`
+    done
+}
+
+# prints the leading info for a given run of a variant
+print_header() {
+    echo ${1}':'
+    echo -e "cores\tthroughput (entries)"
+}
+
+# runs the current benchmark with provided args
+# only works for standard-run benchmarks (not Akka)
+# must split into pre and post args to be able to supply val of p
+pre_args=''
+post_args=''
+single_run() {
+    affinity ${1}
+    preprint="${1}\t"
+    repeat_command taskset -c ${taskset} ./a.${hostname} ${pre_args} ${1} ${post_args}
+}
+
+# runs the current bench for all processor vals
+# works for standard benchs that dont need to set a config file (not Akka or CAF)
+run_bench() {
+    for p in ${num_threads} ; do
+        single_run ${p}
+    done
+}
+
+run_side_chan() {
+    i=1
+    for p in ${side_chan_threads} ; do
+        affinity ${p}
+        preprint="${p}\t"
+        repeat_command taskset -c ${taskset} ./a.${hostname} ${pre_args} ${i} ${post_args}
+        i=`expr ${i} + 1`
+    done
+}
+
+run_order() {
+    affinity 4
+    preprint="4\t"
+    repeat_command taskset -c ${taskset} ./a.${hostname}
+}
+
+run_future() {
+    affinity 2
+    preprint="2\t"
+    repeat_command taskset -c ${taskset} ./a.${hostname} ${post_args}
+}
+
+arch # get hostname
+
+# set up leading info for python script
+echo $numtimes
+echo $num_threads
+echo $side_chan_threads
+
+if [ ${runCFA} -eq ${true} ]; then
+    echo -n 'CFA '
+fi
+if [ ${runGO} -eq ${true} ]; then
+    echo -n 'Go '
+fi
+echo ""
+
+# done printing header info for output
+
+# cfa flags
+cfa_flags='-quiet -O3 -nodebug -DNDEBUG'
+
+# UCPP flags
+UCPPflags="-quiet -g -Wall -Wextra -O3 -nodebug -DNDEBUG -multi"
+UCPP=~/ucpp/u++-7.0.0/bin/u++
+
+# run the benchmarks
+
+run_contend() {
+    post_args=${1}
+
+    if [ ${runCFA} -eq ${true} ] ; then
+        cd cfa # CFA RUN
+        print_header 'CFA'
+        ${cfa} ${cfa_flags} '-DNUM_CHANS='${3} ${2}.cfa -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done CFA
+
+    if [ ${runGO} -eq ${true} ] ; then
+        cd go/${2}${3} # Go RUN
+        print_header 'Go'
+        go build -o a.${hostname} > /dev/null 2>&1
+        run_bench
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done Go
+}
+
+# /usr/bin/time -f "%Uu %Ss %Er %Mkb"
+if [ ${contend} -eq ${true} ] ; then
+    echo "contend2: "
+    run_contend ${chan_size} 'contend' '2'
+    echo "contend4: "
+    run_contend ${chan_size} 'contend' '4'
+    echo "contend8: "
+    run_contend ${chan_size} 'contend' '8'
+fi
+
+if [ ${spin} -eq ${true} ] ; then
+    echo "spin2: "
+    run_contend ${chan_size} 'spin' '2'
+    echo "spin4: "
+    run_contend ${chan_size} 'spin' '4'
+    echo "spin8: "
+    run_contend ${chan_size} 'spin' '8'
+fi
+
+if [ ${sidechan} -eq ${true} ] ; then
+    echo "sidechan: "
+    post_args=${chan_size}
+    if [ ${runCFA} -eq ${true} ] ; then
+        cd cfa # CFA RUN
+        print_header 'CFA'
+        ${cfa} ${cfa_flags} sidechan.cfa -o a.${hostname} > /dev/null 2>&1
+        run_side_chan
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done CFA
+
+    if [ ${runGO} -eq ${true} ] ; then
+        cd go/sidechan
+        print_header 'Go'
+        go build -o a.${hostname} > /dev/null 2>&1
+        run_side_chan
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done Go
+fi
+
+if [ ${future} -eq ${true} ] ; then
+    post_args=${future_time}
+    for i in ${!future_flags[@]}; do
+        echo 'future '${future_names[$i]}':'
+        if [ ${runCFA} -eq ${true} ] ; then
+            cd cfa # CFA RUN
+            print_header 'CFA'
+            ${cfa} ${cfa_flags} ${future_flags[$i]} future.cfa -o a.${hostname} > /dev/null 2>&1
+            run_future
+            rm a.${hostname}
+            cd - > /dev/null
+        fi # done CFA
+
+        if [ ${runUCPP} -eq ${true} ] ; then
+            cd ucpp
+            print_header 'uC++'
+            ${UCPP} ${UCPPflags} ${future_flags[$i]} future.cc -o a.${hostname} > /dev/null 2>&1
+            run_future
+            rm a.${hostname}
+            cd - > /dev/null
+        fi # done Go
+    done
+fi
+
+if [ ${order} -eq ${true} ] ; then
+    echo "order: "
+    post_args=${chan_size}
+    if [ ${runCFA} -eq ${true} ] ; then
+        cd cfa # CFA RUN
+        print_header 'CFA'
+        ${cfa} ${cfa_flags} order.cfa -o a.${hostname} > /dev/null 2>&1
+        run_order
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done CFA
+
+    if [ ${runGO} -eq ${true} ] ; then
+        cd go/order
+        print_header 'Go'
+        go build -o a.${hostname} > /dev/null 2>&1
+        run_order
+        rm a.${hostname}
+        cd - > /dev/null
+    fi # done Go
+fi
Index: doc/theses/colby_parsons_MMath/benchmarks/waituntil/ucpp/future.cc
===================================================================
--- doc/theses/colby_parsons_MMath/benchmarks/waituntil/ucpp/future.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
+++ doc/theses/colby_parsons_MMath/benchmarks/waituntil/ucpp/future.cc	(revision f945fa7ba076d346ab1aa115747f79712d70331d)
@@ -0,0 +1,180 @@
+#include <iostream>
+using namespace std;
+#include <uFuture.h>
+
+// #define ANDOR
+
+size_t Processors = 2, Time = 10;
+size_t globalTotal = 0;
+volatile bool done_loop = false;
+volatile bool client_done = false;
+volatile bool server_done = false;
+
+Future_ISM<size_t> A, B, C;
+
+static inline void wait() {
+    #ifdef OR
+    _Select( A ) { A(); }
+    or _Select( B ) { B(); }
+    or _Select( C ) { C(); }
+    #endif
+    #ifdef AND
+    _Select( A ) { A(); }
+    and _Select( B ) { B(); }
+    #endif
+    #ifdef AND3
+    _Select( A ) { A(); }
+    and _Select( B ) { B(); }
+    and _Select( C ) { C(); }
+    #endif
+    #ifdef ANDOR
+    _Select( A ) { A(); }
+    and _Select( B ) { B(); }
+    or _Select( C ) { C(); }
+    #endif
+    #ifdef ORAND
+    (_Select( A ) { A(); }
+    or _Select( B ) { B(); })
+    and _Select( C ) { C(); }
+    #endif
+    #ifdef BASIC
+    A();
+    #endif
+}
+
+static inline void fulfill( size_t i ) {
+    #ifdef OR
+    if ( i % 3 == 0 ) {
+        A.delivery(i);
+    } else if ( i % 3 == 1 ) {
+        B.delivery(i);
+    } else {
+        C.delivery(i);
+    }
+    #endif
+    #ifdef AND
+    if ( i % 2 == 0 ) {
+        A.delivery(i);
+        B.delivery(i);
+    } else {
+        B.delivery(i);
+        A.delivery(i);
+    }
+    #endif
+    #ifdef AND3
+    if ( i % 6 == 0 ) {
+        A.delivery(i);
+        B.delivery(i);
+        C.delivery(i);
+    } else if ( i % 6 == 1 ) {
+        A.delivery(i);
+        C.delivery(i);
+        B.delivery(i);
+    } else if ( i % 6 == 2 ) {
+        B.delivery(i);
+        A.delivery(i);
+        C.delivery(i);
+    } else if ( i % 6 == 3 ) {
+        B.delivery(i);
+        C.delivery(i);
+        A.delivery(i);
+    } else if ( i % 6 == 4 ) {
+        C.delivery(i);
+        A.delivery(i);
+        B.delivery(i);
+    } else if ( i % 6 == 5 ) {
+        C.delivery(i);
+        B.delivery(i);
+        A.delivery(i);
+    }
+    #endif
+    #ifdef ANDOR
+    if ( i % 4 == 0 ) {
+        A.delivery(i);
+        B.delivery(i);
+    } else if ( i % 4 == 1 ) {
+        A.delivery(i);
+        C.delivery(i);
+    } else if ( i % 4 == 2 ) {
+        B.delivery(i);
+        C.delivery(i);
+    } else {
+        C.delivery(i);
+    }
+    #endif
+    #ifdef ORAND
+    if ( i % 4 == 0 ) {
+        A.delivery(i);
+        C.delivery(i);
+    } else if ( i % 4 == 1 ) {
+        C.delivery(i);
+        A.delivery(i);
+    } else if ( i % 4 == 2 ) {
+        B.delivery(i);
+        C.delivery(i);
+    } else {
+        C.delivery(i);
+        B.delivery(i);
+    }
+    #endif
+    #ifdef BASIC
+    A.delivery(i);
+    #endif
+}
+
+_Task Client {
+	void main() {
+		size_t i = 0;
+        for(; !client_done; i++ ) {
+            wait();
+            A.reset();
+            B.reset();
+            C.reset();
+            done_loop = true;
+        }
+        __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
+	} 
+};
+
+_Task Server {
+	void main() {
+		for( size_t i = 0; !server_done; i++ ) {
+            fulfill( i );
+            while( !done_loop ) {}
+            done_loop = false;
+        }
+	}
+};
+
+int main( int argc, char * argv[] ) {
+	switch ( argc ) {
+	  case 2:
+		if ( strcmp( argv[1], "d" ) != 0 ) {			// default ?
+			Time = atoi( argv[1] );
+			if ( Time < 0 ) goto Usage;
+		} // if
+	  case 1:											// use defaults
+		break;
+	  default:
+	  Usage:
+		cerr << "Usage: " << argv[0]
+             << "[ time (>= 0) | 'd' (default " << Time
+			 << ") ]" ;
+		exit( EXIT_FAILURE );
+	} // switch
+    uProcessor p[Processors - 1];
+
+    {
+        Server s;
+        {
+            Client c;
+
+            uBaseTask::sleep( uDuration( Time ) );
+
+            client_done = true;
+        }
+        server_done = true;
+        done_loop = true;
+    }
+    cout << globalTotal << endl;
+} // main
