Return-Path: X-Original-To: apmail-spark-user-archive@minotaur.apache.org Delivered-To: apmail-spark-user-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id BBFC811616 for ; Fri, 19 Sep 2014 02:02:42 +0000 (UTC) Received: (qmail 38035 invoked by uid 500); 19 Sep 2014 02:02:41 -0000 Delivered-To: apmail-spark-user-archive@spark.apache.org Received: (qmail 37966 invoked by uid 500); 19 Sep 2014 02:02:41 -0000 Mailing-List: contact user-help@spark.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list user@spark.apache.org Received: (qmail 37956 invoked by uid 99); 19 Sep 2014 02:02:41 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 19 Sep 2014 02:02:41 +0000 X-ASF-Spam-Status: No, hits=1.5 required=5.0 tests=HTML_MESSAGE,RCVD_IN_DNSWL_LOW,SPF_PASS,WEIRD_PORT X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of acoronadoiruegas@gmail.com designates 209.85.215.42 as permitted sender) Received: from [209.85.215.42] (HELO mail-la0-f42.google.com) (209.85.215.42) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 19 Sep 2014 02:02:36 +0000 Received: by mail-la0-f42.google.com with SMTP id hz20so2285246lab.1 for ; Thu, 18 Sep 2014 19:02:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=mCWvnv6VnVdNqi+Q5fG9XwzSmkaJymEzcoSlu/RpGBQ=; b=l3hUYIKeQADZ5XO4s+8PToPrDJH47TjqOybRaX+rM0P+HpXS76/4TG+HIOW0Guw/Lf fHN0g1lGfpJjWhT56pdw+yAx8/sGFiL9UkTPSc9AgFMzTA0ecLeoz/YeERcLPHNa6a8H izlSC2h8zFADZWRuR9sG0Sl1lnyvQcWlNzc7563FIAwE8QnmKo2Tp085+G+SqE2175gq hX/mb0VJGRaxjdv92LquVz55IkEFS4hRnIDXmxmKZuPPx9Xn9nl5pNZ0wE1SfSUkwzFb KIIWsBS33cBQHFCleu0130Z9XxkMrPPGTrdx8I7Jl9sQwNuaUa5wkkCZx/Mqj6AfH01C Ummw== MIME-Version: 1.0 X-Received: by 10.152.25.129 with SMTP id c1mr3639478lag.14.1411092134613; Thu, 18 Sep 2014 19:02:14 -0700 (PDT) Received: by 10.25.11.4 with HTTP; Thu, 18 Sep 2014 19:02:14 -0700 (PDT) In-Reply-To: References: Date: Thu, 18 Sep 2014 21:02:14 -0500 Message-ID: Subject: Re: Example of Geoprocessing with Spark From: Abel Coronado Iruegas To: user@spark.apache.org Content-Type: multipart/alternative; boundary=089e0160bcb46dd76a0503617db4 X-Virus-Checked: Checked by ClamAV on apache.org --089e0160bcb46dd76a0503617db4 Content-Type: text/plain; charset=UTF-8 Now i have a better version, but now the problem is that the saveAsTextFile do not finish the Job, in the hdfs repository only exist a partial temporary file, someone can tell me what is wrong: Thanks !! object SimpleApp { def main(args: Array[String]){ val conf = new SparkConf().setAppName("Csv Clipper") val sc = new SparkContext(conf) val csvPath = "hdfs://m01/user/acoronado/mov/movilidad_64mb.csv" val csv = sc.textFile(csvPath) csv.cache() val clipPoints = csv.map({line: String => val Array(usuario, lat, lon, date) = line.split(",").map(_.trim) val punto = Point(lon.toDouble,lat.toDouble) val internal = geoDataExternal.get.find(f => f.geometry intersects punto) val (cve_est, cve_mun) = internal match { case Some(f:org.geoscript.feature.Feature) => { val index = f.getAttribute(1).toString() val existe = geoDataMun.get(index).find(f => f.geometry intersects punto) existe match { case Some(f) => (f.getAttribute(1).toString, f.getAttribute(2).toString) case None => ("0", "0") } } case None => ("0", "0") } val time = try {(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")).parse(date.replaceAll("Z$", "+0000")).getTime().toString()} catch {case e: Exception => "0"} line+","+time+","+cve_est+","+cve_mun }) clipPoints.*saveAsTextFile* ("hdfs://m01/user/acoronado/mov/resultados_movilidad_60.csv") println("Spark Clip Exito!!!") } object geoDataMun { private val shp = Shapefile("/geoData/MunicipiosLatLon.shp") val features = shp.getFeatures.toIterable val result = scala.io.Source.fromFile("/geoData/indice_espacial.csv") .getLines() .toList map { line: String => val campos = line.split(",").map(_.trim) val cve_edo = campos(0) val cve_mun = campos(1) val index = campos(2) scala.collection.immutable.List(index.toInt , (cve_edo,cve_mun)) } val mapaIx = result.groupBy(x=>x(0)).mapValues(cves => cves.map(x => x(1))) def get(index:String) = { features.filter(f => mapaIx(index.toInt).contains((f.getAttribute(1).toString,f.getAttribute(2).toString))) } } object geoDataExternal{ private val shp = Shapefile("/geoData/IndiceRecortado.shp") val features = shp.getFeatures def get: FeatureCollection[org.geoscript.feature.Schema,org.geoscript.feature.Feature] = features } } the log of the driver is: 14/09/18 19:27:55 ERROR EndpointWriter: AssociationError [akka.tcp:// sparkWorker@axaxaxa-cloudera-s05.xxxnetworks.com:44895] -> [akka.tcp:// sparkExecutor@axaxaxa-cloudera-s05.xxxnetworks.com:43942]: Error [Association failed with [akka.tcp:// sparkExecutor@axaxaxa-cloudera-s05.xxxnetworks.com:43942]] [ akka.remote.EndpointAssociationException: Association failed with [akka.tcp://sparkExecutor@axaxaxa-cloudera-s05.xxxnetworks.com:43942] Caused by: akka.remote.transport.netty.NettyTransport$$anonfun$associate$1$$anon$2: Connection refused: axaxaxa-cloudera-s05.xxxnetworks.com/10.5.96.42:43942 ] 14/09/18 19:27:55 ERROR EndpointWriter: AssociationError [akka.tcp:// sparkWorker@axaxaxa-cloudera-s05.xxxnetworks.com:44895] -> [akka.tcp:// sparkExecutor@axaxaxa-cloudera-s05.xxxnetworks.com:43942]: Error [Association failed with [akka.tcp:// sparkExecutor@axaxaxa-cloudera-s05.xxxnetworks.com:43942]] [ akka.remote.EndpointAssociationException: Association failed with [akka.tcp://sparkExecutor@axaxaxa-cloudera-s05.xxxnetworks.com:43942] Caused by: akka.remote.transport.netty.NettyTransport$$anonfun$associate$1$$anon$2: Connection refused: axaxaxa-cloudera-s05.xxxnetworks.com/10.5.96.42:43942 ] 14/09/18 19:27:55 ERROR EndpointWriter: AssociationError [akka.tcp:// sparkWorker@axaxaxa-cloudera-s05.xxxnetworks.com:44895] -> [akka.tcp:// sparkExecutor@axaxaxa-cloudera-s05.xxxnetworks.com:43942]: Error [Association failed with [akka.tcp:// sparkExecutor@axaxaxa-cloudera-s05.xxxnetworks.com:43942]] [ akka.remote.EndpointAssociationException: Association failed with [akka.tcp://sparkExecutor@axaxaxa-cloudera-s05.xxxnetworks.com:43942] Caused by: akka.remote.transport.netty.NettyTransport$$anonfun$associate$1$$anon$2: Connection refused: axaxaxa-cloudera-s05.xxxnetworks.com/10.5.96.42:43942 On Mon, Sep 15, 2014 at 1:30 PM, Abel Coronado Iruegas < acoronadoiruegas@gmail.com> wrote: > Here an example of a working code that takes a csv with lat lon points and > intersects with polygons of municipalities of Mexico, generating a new > version of the file with new attributes. > > Do you think that could be improved? > > Thanks. > > The Code: > > import org.apache.spark.SparkContext > import org.apache.spark.SparkContext._ > import org.apache.spark.SparkConf > import org.geoscript.feature._ > import org.geoscript.geometry._ > import org.geoscript.geometry.builder._ > import com.vividsolutions.jts._ > import org.geoscript.layer.Shapefile > import org.geotools.feature.FeatureCollection > import java.text._ > import java.util._ > > object SimpleApp { > def main(args: Array[String]){ > val conf = new SparkConf().setAppName("Csv Clipper") > val sc = new SparkContext(conf) > val csvPath = > "hdfs://x01/user/acoronado/mov/movilidad.csv" //70 Millions of rows > val csv = sc.textFile(csvPath) > val clipPoints = csv.map({line: String => > val Array(usuario, lat, > lon, date) = line.split(",").map(_.trim) > val punto = > Point(lon.toDouble,lat.toDouble) > val existe = > geoData.get.filter(f => f.geometry intersects punto) // Geospatial operation > var cve_est = "0" > var cve_mun = "0" > var time = "0" > if(!existe.isEmpty){ > val f = existe.take(1) > val ff = f.toList(0) > cve_est = > ff.getAttribute(1).toString //State Code > cve_mun = > ff.getAttribute(2).toString // Municipality Code > time = (new > SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")).parse(date.replaceAll("Z$", > "+0000")).getTime().toString() > } > > line+","+time+","+cve_est+","+cve_mun > }) > > clipPoints.coalesce(1,true).saveAsTextFile("hdfs://m01/user/acoronado/mov/mov_all.csv") > println("Spark Clip Exito!!!") > } > object geoData { > private val estatal = > Shapefile("/geoData/MunicipiosLatLon.shp") //This directory exist in all > the nodes. > private val estatalColl = estatal.getFeatures > def > get:FeatureCollection[org.geoscript.feature.Schema,org.geoscript.feature.Feature] > = estatalColl > } > } > --089e0160bcb46dd76a0503617db4 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+Tm93IGkgaGF2ZSBhIGJldHRlciB2ZXJzaW9uLCBidXQgbm93IHRoZSBw cm9ibGVtIGlzIHRoYXQgdGhlIHNhdmVBc1RleHRGaWxlIGRvIG5vdCBmaW5pc2ggdGhlIEpvYiwg aW4gdGhlIGhkZnMgcmVwb3NpdG9yeSBvbmx5IGV4aXN0IGEgcGFydGlhbCB0ZW1wb3JhcnkgZmls ZSwgc29tZW9uZSBjYW4gdGVsbCBtZSB3aGF0IGlzIHdyb25nOsKgPGRpdj48YnI+PC9kaXY+PGRp dj5UaGFua3MgISE8L2Rpdj48ZGl2Pg0KDQoNCg0KDQoNCg0KDQo8cCBjbGFzcz0iIj5vYmplY3Qg U2ltcGxlQXBwIHs8L3A+DQo8cCBjbGFzcz0iIj7CoCDCoCDCoCDCoCBkZWYgbWFpbihhcmdzOiBB cnJheVtTdHJpbmddKXs8L3A+DQo8cCBjbGFzcz0iIj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB2 YWwgY29uZiA9IG5ldyBTcGFya0NvbmYoKS5zZXRBcHBOYW1lKCZxdW90O0NzdiBDbGlwcGVyJnF1 b3Q7KTwvcD4NCjxwIGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZhbCBzYyA9IG5l dyBTcGFya0NvbnRleHQoY29uZik8L3A+DQo8cCBjbGFzcz0iIj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCB2YWwgY3N2UGF0aCA9ICZxdW90O2hkZnM6Ly9tMDEvdXNlci9hY29yb25hZG8vbW92L21v dmlsaWRhZF82NG1iLmNzdiZxdW90OzwvcD4NCjxwIGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHZhbCBjc3YgPSBzYy50ZXh0RmlsZShjc3ZQYXRoKTwvcD4NCjxwIGNsYXNzPSIiPsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNzdi5jYWNoZSgpPGJyPjwvcD4NCjxwIGNsYXNzPSIiPsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZhbCBjbGlwUG9pbnRzID0gY3N2Lm1hcCh7bGluZTogU3Ry aW5nID0mZ3Q7PC9wPg0KPHAgY2xhc3M9IiI+wqDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB2YWwgQXJyYXkodXN1YXJp bywgbGF0LCBsb24sIGRhdGUpID0gbGluZS5zcGxpdCgmcXVvdDssJnF1b3Q7KS5tYXAoXy50cmlt KTwvcD4NCjxwIGNsYXNzPSIiPsKgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdmFsIHB1bnRvID0gUG9pbnQobG9uLnRv RG91YmxlLGxhdC50b0RvdWJsZSk8L3A+DQo8cCBjbGFzcz0iIj7CoMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZhbCBp bnRlcm5hbCA9IGdlb0RhdGFFeHRlcm5hbC5nZXQuZmluZChmID0mZ3Q7IGYuZ2VvbWV0cnkgaW50 ZXJzZWN0cyBwdW50byk8L3A+DQo8cCBjbGFzcz0iIj7CoMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZhbCAoY3ZlX2Vz dCwgY3ZlX211bikgPSBpbnRlcm5hbCBtYXRjaCB7PC9wPg0KPHAgY2xhc3M9IiI+wqDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjYXNlIFNv bWUoZjpvcmcuZ2Vvc2NyaXB0LmZlYXR1cmUuRmVhdHVyZSkgPSZndDsgezwvcD4NCjxwIGNsYXNz PSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZhbCBpbmRleCA9IGYuZ2V0QXR0 cmlidXRlKDEpLnRvU3RyaW5nKCk8L3A+DQo8cCBjbGFzcz0iIj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCB2YWwgZXhpc3RlID0gZ2VvRGF0YU11bi5nZXQoaW5kZXgpLmZpbmQoZiA9 Jmd0OyBmLmdlb21ldHJ5IGludGVyc2VjdHMgcHVudG8pPC9wPg0KPHAgY2xhc3M9IiI+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXhpc3RlIG1hdGNoIHs8L3A+DQo8cCBjbGFzcz0i Ij7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBjYXNlIFNvbWUoZikgPSZndDsgKGYuZ2V0QXR0cmlidXRlKDEpLnRvU3RyaW5nLCBmLmdldEF0 dHJpYnV0ZSgyKS50b1N0cmluZyk8L3A+DQo8cCBjbGFzcz0iIj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjYXNlIE5vbmUgPSZndDsgKCZx dW90OzAmcXVvdDssICZxdW90OzAmcXVvdDspPC9wPg0KPHAgY2xhc3M9IiI+wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTwvcD4NCjxwIGNsYXNz PSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08L3A+DQo8cCBjbGFzcz0iIj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBjYXNlIE5vbmUgPSZndDsgKCZxdW90OzAmcXVvdDssICZxdW90OzAmcXVvdDspPC9wPg0KPHAg Y2xhc3M9IiI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgfTwvcD4NCjxwIGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZhbCB0aW1lID0gdHJ5IHsobmV3IFNp bXBsZURhdGVGb3JtYXQoJnF1b3Q7eXl5eS1NTS1kZCYjMzk7VCYjMzk7SEg6bW06c3MuU1NTWiZx dW90OykpLnBhcnNlKGRhdGUucmVwbGFjZUFsbCgmcXVvdDtaJCZxdW90OywgJnF1b3Q7KzAwMDAm cXVvdDspKS5nZXRUaW1lKCkudG9TdHJpbmcoKX0gY2F0Y2gge2Nhc2UgZTogRXhjZXB0aW9uID0m Z3Q7ICZxdW90OzAmcXVvdDt9PC9wPg0KPHAgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg bGluZSsmcXVvdDssJnF1b3Q7K3RpbWUrJnF1b3Q7LCZxdW90OytjdmVfZXN0KyZxdW90OywmcXVv dDsrY3ZlX211bjwvcD4NCjxwIGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIH0pPC9wPg0KPHAgY2xhc3M9IiI+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgY2xpcFBvaW50cy48Yj5zYXZlQXNUZXh0RmlsZTwvYj4oJnF1b3Q7aGRmczovL20wMS91 c2VyL2Fjb3JvbmFkby9tb3YvcmVzdWx0YWRvc19tb3ZpbGlkYWRfNjAuY3N2JnF1b3Q7KTwvcD4N CjxwIGNsYXNzPSIiPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByaW50bG4oJnF1b3Q7U3Bhcmsg Q2xpcCBFeGl0byEhISZxdW90Oyk8L3A+DQo8cCBjbGFzcz0iIj7CoCDCoCDCoCDCoCB9PC9wPg0K PHAgY2xhc3M9IiI+wqAgwqAgwqAgwqAgb2JqZWN0IGdlb0RhdGFNdW4gezwvcD4NCjxwIGNsYXNz PSIiPsKgIMKgIMKgIMKgIMKgIHByaXZhdGUgdmFsIHNocCA9IFNoYXBlZmlsZSgmcXVvdDsvZ2Vv RGF0YS9NdW5pY2lwaW9zTGF0TG9uLnNocCZxdW90Oyk8L3A+DQo8cCBjbGFzcz0iIj7CoCDCoCDC oCDCoCDCoCB2YWwgZmVhdHVyZXMgPSBzaHAuZ2V0RmVhdHVyZXMudG9JdGVyYWJsZTwvcD4NCjxw IGNsYXNzPSIiPsKgIMKgIMKgIHZhbCByZXN1bHQgPSBzY2FsYS5pby5Tb3VyY2UuZnJvbUZpbGUo JnF1b3Q7L2dlb0RhdGEvaW5kaWNlX2VzcGFjaWFsLmNzdiZxdW90Oyk8L3A+DQo8cCBjbGFzcz0i Ij7CoCDCoCDCoCDCoCAuZ2V0TGluZXMoKTwvcD4NCjxwIGNsYXNzPSIiPsKgIMKgIMKgIMKgIC50 b0xpc3QgbWFwIHsgbGluZTogU3RyaW5nID0mZ3Q7PC9wPg0KPHAgY2xhc3M9IiI+wqDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB2YWwgY2Ft cG9zID0gbGluZS5zcGxpdCgmcXVvdDssJnF1b3Q7KS5tYXAoXy50cmltKTwvcD4NCjxwIGNsYXNz PSIiPsKgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgdmFsIGN2ZV9lZG8gPSBjYW1wb3MoMCk8L3A+DQo8cCBjbGFzcz0iIj7CoMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZhbCBjdmVf bXVuID0gY2FtcG9zKDEpPC9wPg0KPHAgY2xhc3M9IiI+wqDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB2YWwgaW5kZXggPSBjYW1wb3MoMik8 L3A+DQo8cCBjbGFzcz0iIj7CoMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNjYWxhLmNvbGxlY3Rpb24uaW1tdXRhYmxlLkxpc3Qo aW5kZXgudG9JbnQgLCAoY3ZlX2VkbyxjdmVfbXVuKSk8L3A+DQo8cCBjbGFzcz0iIj7CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PC9wPg0KPHAg Y2xhc3M9IiI+wqAgwqAgwqAgdmFsIG1hcGFJeCA9IHJlc3VsdC5ncm91cEJ5KHg9Jmd0O3goMCkp Lm1hcFZhbHVlcyhjdmVzID0mZ3Q7IGN2ZXMubWFwKHggPSZndDsgeCgxKSkpPC9wPg0KPHAgY2xh c3M9IiI+wqAgwqAgwqAgZGVmIGdldChpbmRleDpTdHJpbmcpID0gezwvcD4NCjxwIGNsYXNzPSIi PsKgIMKgIMKgIMKgIGZlYXR1cmVzLmZpbHRlcihmID0mZ3Q7IG1hcGFJeChpbmRleC50b0ludCku Y29udGFpbnMoKGYuZ2V0QXR0cmlidXRlKDEpLnRvU3RyaW5nLGYuZ2V0QXR0cmlidXRlKDIpLnRv U3RyaW5nKSkpPC9wPg0KPHAgY2xhc3M9IiI+wqAgwqAgwqAgfTwvcD4NCjxwIGNsYXNzPSIiPsKg IMKgIMKgIMKgIH08L3A+DQo8cCBjbGFzcz0iIj7CoCDCoCBvYmplY3QgZ2VvRGF0YUV4dGVybmFs ezwvcD4NCjxwIGNsYXNzPSIiPsKgIMKgIMKgIHByaXZhdGUgdmFsIHNocCA9IFNoYXBlZmlsZSgm cXVvdDsvZ2VvRGF0YS9JbmRpY2VSZWNvcnRhZG8uc2hwJnF1b3Q7KTwvcD4NCjxwIGNsYXNzPSIi PsKgIMKgIMKgIHZhbCBmZWF0dXJlcyA9IHNocC5nZXRGZWF0dXJlczwvcD4NCjxwIGNsYXNzPSIi PsKgIMKgIMKgIGRlZiBnZXQ6IEZlYXR1cmVDb2xsZWN0aW9uW29yZy5nZW9zY3JpcHQuZmVhdHVy ZS5TY2hlbWEsb3JnLmdlb3NjcmlwdC5mZWF0dXJlLkZlYXR1cmVdwqAgPSBmZWF0dXJlczwvcD4N CjxwIGNsYXNzPSIiPsKgIMKgIH08L3A+DQo8cCBjbGFzcz0iIj59PC9wPjxwIGNsYXNzPSIiPjxi cj48L3A+PHAgY2xhc3M9IiI+dGhlIGxvZyBvZiB0aGUgZHJpdmVyIGlzOjwvcD48cCBjbGFzcz0i Ij4xNC8wOS8xOCAxOToyNzo1NSBFUlJPUiBFbmRwb2ludFdyaXRlcjogQXNzb2NpYXRpb25FcnJv ciBbYWtrYS50Y3A6Ly88YSBocmVmPSJodHRwOi8vc3BhcmtXb3JrZXJAYXhheGF4YS1jbG91ZGVy YS1zMDUueHh4bmV0d29ya3MuY29tOjQ0ODk1Ij5zcGFya1dvcmtlckBheGF4YXhhLWNsb3VkZXJh LXMwNS54eHhuZXR3b3Jrcy5jb206NDQ4OTU8L2E+XSAtJmd0OyBbYWtrYS50Y3A6Ly88YSBocmVm PSJodHRwOi8vc3BhcmtFeGVjdXRvckBheGF4YXhhLWNsb3VkZXJhLXMwNS54eHhuZXR3b3Jrcy5j b206NDM5NDIiPnNwYXJrRXhlY3V0b3JAYXhheGF4YS1jbG91ZGVyYS1zMDUueHh4bmV0d29ya3Mu Y29tOjQzOTQyPC9hPl06IEVycm9yIFtBc3NvY2lhdGlvbiBmYWlsZWQgd2l0aCBbYWtrYS50Y3A6 Ly88YSBocmVmPSJodHRwOi8vc3BhcmtFeGVjdXRvckBheGF4YXhhLWNsb3VkZXJhLXMwNS54eHhu ZXR3b3Jrcy5jb206NDM5NDIiPnNwYXJrRXhlY3V0b3JAYXhheGF4YS1jbG91ZGVyYS1zMDUueHh4 bmV0d29ya3MuY29tOjQzOTQyPC9hPl1dIFs8L3A+PHAgY2xhc3M9IiI+YWtrYS5yZW1vdGUuRW5k cG9pbnRBc3NvY2lhdGlvbkV4Y2VwdGlvbjogQXNzb2NpYXRpb24gZmFpbGVkIHdpdGggW2Fra2Eu dGNwOi8vPGEgaHJlZj0iaHR0cDovL3NwYXJrRXhlY3V0b3JAYXhheGF4YS1jbG91ZGVyYS1zMDUu eHh4bmV0d29ya3MuY29tOjQzOTQyIj5zcGFya0V4ZWN1dG9yQGF4YXhheGEtY2xvdWRlcmEtczA1 Lnh4eG5ldHdvcmtzLmNvbTo0Mzk0MjwvYT5dPC9wPjxwIGNsYXNzPSIiPkNhdXNlZCBieTogYWtr YS5yZW1vdGUudHJhbnNwb3J0Lm5ldHR5Lk5ldHR5VHJhbnNwb3J0JCRhbm9uZnVuJGFzc29jaWF0 ZSQxJCRhbm9uJDI6IENvbm5lY3Rpb24gcmVmdXNlZDogPGEgaHJlZj0iaHR0cDovL2F4YXhheGEt Y2xvdWRlcmEtczA1Lnh4eG5ldHdvcmtzLmNvbS8xMC41Ljk2LjQyOjQzOTQyIj5heGF4YXhhLWNs b3VkZXJhLXMwNS54eHhuZXR3b3Jrcy5jb20vMTAuNS45Ni40Mjo0Mzk0MjwvYT48L3A+PHAgY2xh c3M9IiI+XTwvcD48cCBjbGFzcz0iIj4xNC8wOS8xOCAxOToyNzo1NSBFUlJPUiBFbmRwb2ludFdy aXRlcjogQXNzb2NpYXRpb25FcnJvciBbYWtrYS50Y3A6Ly88YSBocmVmPSJodHRwOi8vc3BhcmtX b3JrZXJAYXhheGF4YS1jbG91ZGVyYS1zMDUueHh4bmV0d29ya3MuY29tOjQ0ODk1Ij5zcGFya1dv cmtlckBheGF4YXhhLWNsb3VkZXJhLXMwNS54eHhuZXR3b3Jrcy5jb206NDQ4OTU8L2E+XSAtJmd0 OyBbYWtrYS50Y3A6Ly88YSBocmVmPSJodHRwOi8vc3BhcmtFeGVjdXRvckBheGF4YXhhLWNsb3Vk ZXJhLXMwNS54eHhuZXR3b3Jrcy5jb206NDM5NDIiPnNwYXJrRXhlY3V0b3JAYXhheGF4YS1jbG91 ZGVyYS1zMDUueHh4bmV0d29ya3MuY29tOjQzOTQyPC9hPl06IEVycm9yIFtBc3NvY2lhdGlvbiBm YWlsZWQgd2l0aCBbYWtrYS50Y3A6Ly88YSBocmVmPSJodHRwOi8vc3BhcmtFeGVjdXRvckBheGF4 YXhhLWNsb3VkZXJhLXMwNS54eHhuZXR3b3Jrcy5jb206NDM5NDIiPnNwYXJrRXhlY3V0b3JAYXhh eGF4YS1jbG91ZGVyYS1zMDUueHh4bmV0d29ya3MuY29tOjQzOTQyPC9hPl1dIFs8L3A+PHAgY2xh c3M9IiI+YWtrYS5yZW1vdGUuRW5kcG9pbnRBc3NvY2lhdGlvbkV4Y2VwdGlvbjogQXNzb2NpYXRp b24gZmFpbGVkIHdpdGggW2Fra2EudGNwOi8vPGEgaHJlZj0iaHR0cDovL3NwYXJrRXhlY3V0b3JA YXhheGF4YS1jbG91ZGVyYS1zMDUueHh4bmV0d29ya3MuY29tOjQzOTQyIj5zcGFya0V4ZWN1dG9y QGF4YXhheGEtY2xvdWRlcmEtczA1Lnh4eG5ldHdvcmtzLmNvbTo0Mzk0MjwvYT5dPC9wPjxwIGNs YXNzPSIiPkNhdXNlZCBieTogYWtrYS5yZW1vdGUudHJhbnNwb3J0Lm5ldHR5Lk5ldHR5VHJhbnNw b3J0JCRhbm9uZnVuJGFzc29jaWF0ZSQxJCRhbm9uJDI6IENvbm5lY3Rpb24gcmVmdXNlZDogPGEg aHJlZj0iaHR0cDovL2F4YXhheGEtY2xvdWRlcmEtczA1Lnh4eG5ldHdvcmtzLmNvbS8xMC41Ljk2 LjQyOjQzOTQyIj5heGF4YXhhLWNsb3VkZXJhLXMwNS54eHhuZXR3b3Jrcy5jb20vMTAuNS45Ni40 Mjo0Mzk0MjwvYT48L3A+PHAgY2xhc3M9IiI+XTwvcD48cCBjbGFzcz0iIj4xNC8wOS8xOCAxOToy Nzo1NSBFUlJPUiBFbmRwb2ludFdyaXRlcjogQXNzb2NpYXRpb25FcnJvciBbYWtrYS50Y3A6Ly88 YSBocmVmPSJodHRwOi8vc3BhcmtXb3JrZXJAYXhheGF4YS1jbG91ZGVyYS1zMDUueHh4bmV0d29y a3MuY29tOjQ0ODk1Ij5zcGFya1dvcmtlckBheGF4YXhhLWNsb3VkZXJhLXMwNS54eHhuZXR3b3Jr cy5jb206NDQ4OTU8L2E+XSAtJmd0OyBbYWtrYS50Y3A6Ly88YSBocmVmPSJodHRwOi8vc3BhcmtF eGVjdXRvckBheGF4YXhhLWNsb3VkZXJhLXMwNS54eHhuZXR3b3Jrcy5jb206NDM5NDIiPnNwYXJr RXhlY3V0b3JAYXhheGF4YS1jbG91ZGVyYS1zMDUueHh4bmV0d29ya3MuY29tOjQzOTQyPC9hPl06 IEVycm9yIFtBc3NvY2lhdGlvbiBmYWlsZWQgd2l0aCBbYWtrYS50Y3A6Ly88YSBocmVmPSJodHRw Oi8vc3BhcmtFeGVjdXRvckBheGF4YXhhLWNsb3VkZXJhLXMwNS54eHhuZXR3b3Jrcy5jb206NDM5 NDIiPnNwYXJrRXhlY3V0b3JAYXhheGF4YS1jbG91ZGVyYS1zMDUueHh4bmV0d29ya3MuY29tOjQz OTQyPC9hPl1dIFs8L3A+PHAgY2xhc3M9IiI+YWtrYS5yZW1vdGUuRW5kcG9pbnRBc3NvY2lhdGlv bkV4Y2VwdGlvbjogQXNzb2NpYXRpb24gZmFpbGVkIHdpdGggW2Fra2EudGNwOi8vPGEgaHJlZj0i aHR0cDovL3NwYXJrRXhlY3V0b3JAYXhheGF4YS1jbG91ZGVyYS1zMDUueHh4bmV0d29ya3MuY29t OjQzOTQyIj5zcGFya0V4ZWN1dG9yQGF4YXhheGEtY2xvdWRlcmEtczA1Lnh4eG5ldHdvcmtzLmNv bTo0Mzk0MjwvYT5dPC9wPjxwIGNsYXNzPSIiPkNhdXNlZCBieTogYWtrYS5yZW1vdGUudHJhbnNw b3J0Lm5ldHR5Lk5ldHR5VHJhbnNwb3J0JCRhbm9uZnVuJGFzc29jaWF0ZSQxJCRhbm9uJDI6IENv bm5lY3Rpb24gcmVmdXNlZDogPGEgaHJlZj0iaHR0cDovL2F4YXhheGEtY2xvdWRlcmEtczA1Lnh4 eG5ldHdvcmtzLmNvbS8xMC41Ljk2LjQyOjQzOTQyIj5heGF4YXhhLWNsb3VkZXJhLXMwNS54eHhu ZXR3b3Jrcy5jb20vMTAuNS45Ni40Mjo0Mzk0MjwvYT48L3A+PGRpdj48YnI+PC9kaXY+PHAgY2xh c3M9IiI+PGJyPjwvcD48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjxk aXYgY2xhc3M9ImdtYWlsX3F1b3RlIj5PbiBNb24sIFNlcCAxNSwgMjAxNCBhdCAxOjMwIFBNLCBB YmVsIENvcm9uYWRvIElydWVnYXMgPHNwYW4gZGlyPSJsdHIiPiZsdDs8YSBocmVmPSJtYWlsdG86 YWNvcm9uYWRvaXJ1ZWdhc0BnbWFpbC5jb20iIHRhcmdldD0iX2JsYW5rIj5hY29yb25hZG9pcnVl Z2FzQGdtYWlsLmNvbTwvYT4mZ3Q7PC9zcGFuPiB3cm90ZTo8YnI+PGJsb2NrcXVvdGUgY2xhc3M9 ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNj Y2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+PGRpdiBkaXI9Imx0ciI+SGVyZSBhbiBleGFtcGxl IG9mIGEgd29ya2luZyBjb2RlIHRoYXQgdGFrZXMgYSBjc3Ygd2l0aCBsYXQgbG9uIHBvaW50cyBh bmQgaW50ZXJzZWN0cyB3aXRoIHBvbHlnb25zIG9mIG11bmljaXBhbGl0aWVzIG9mIE1leGljbywg Z2VuZXJhdGluZyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBmaWxlIHdpdGggbmV3IGF0dHJpYnV0ZXMu PGRpdj48YnI+PC9kaXY+PGRpdj5EbyB5b3UgdGhpbmsgdGhhdCBjb3VsZCBiZSBpbXByb3ZlZD88 L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoYW5rcy48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2 PlRoZSBDb2RlOjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+aW1wb3J0IG9yZy5hcGFjaGUuc3Bh cmsuU3BhcmtDb250ZXh0PC9kaXY+PGRpdj5pbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5TcGFya0Nv bnRleHQuXzwvZGl2PjxkaXY+aW1wb3J0IG9yZy5hcGFjaGUuc3BhcmsuU3BhcmtDb25mPC9kaXY+ PGRpdj5pbXBvcnQgb3JnLmdlb3NjcmlwdC5mZWF0dXJlLl88L2Rpdj48ZGl2PmltcG9ydCBvcmcu Z2Vvc2NyaXB0Lmdlb21ldHJ5Ll88L2Rpdj48ZGl2PmltcG9ydCBvcmcuZ2Vvc2NyaXB0Lmdlb21l dHJ5LmJ1aWxkZXIuXzwvZGl2PjxkaXY+aW1wb3J0IGNvbS52aXZpZHNvbHV0aW9ucy5qdHMuXzwv ZGl2PjxkaXY+aW1wb3J0IG9yZy5nZW9zY3JpcHQubGF5ZXIuU2hhcGVmaWxlPC9kaXY+PGRpdj5p bXBvcnQgb3JnLmdlb3Rvb2xzLmZlYXR1cmUuRmVhdHVyZUNvbGxlY3Rpb248L2Rpdj48ZGl2Pmlt cG9ydCBqYXZhLnRleHQuXzwvZGl2PjxkaXY+aW1wb3J0IGphdmEudXRpbC5fPC9kaXY+PGRpdj48 YnI+PC9kaXY+PGRpdj5vYmplY3QgU2ltcGxlQXBwIHs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIGRl ZiBtYWluKGFyZ3M6IEFycmF5W1N0cmluZ10pezwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgdmFsIGNvbmYgPSBuZXcgU3BhcmtDb25mKCkuc2V0QXBwTmFtZSgmcXVvdDtDc3YgQ2xp cHBlciZxdW90Oyk8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZhbCBzYyA9IG5l dyBTcGFya0NvbnRleHQoY29uZik8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZh bCBjc3ZQYXRoID0gJnF1b3Q7aGRmczovL3gwMS91c2VyL2Fjb3JvbmFkby9tb3YvbW92aWxpZGFk LmNzdiZxdW90OyAvLzcwIE1pbGxpb25zIG9mIHJvd3M8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHZhbCBjc3YgPSBzYy50ZXh0RmlsZShjc3ZQYXRoKTwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgdmFsIGNsaXBQb2ludHMgPSBjc3YubWFwKHtsaW5lOiBTdHJpbmcg PSZndDs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdmFsIEFycmF5KHVzdWFyaW8sIGxhdCwgbG9u LCBkYXRlKSA9IGxpbmUuc3BsaXQoJnF1b3Q7LCZxdW90OykubWFwKF8udHJpbSk8L2Rpdj48ZGl2 PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgdmFsIHB1bnRvID0gUG9pbnQobG9uLnRvRG91YmxlLGxhdC50b0RvdWJs ZSk8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdmFsIGV4aXN0ZSA9IGdlb0RhdGEuZ2V0LmZpbHRl cihmID0mZ3Q7IGYuZ2VvbWV0cnkgaW50ZXJzZWN0cyBwdW50bykgLy8gR2Vvc3BhdGlhbCBvcGVy YXRpb248L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdmFyIGN2ZV9lc3QgPSAmcXVvdDswJnF1b3Q7 PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHZhciBjdmVfbXVuID0gJnF1b3Q7MCZxdW90OzwvZGl2 PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqB2YXIgdGltZSA9ICZxdW90OzAmcXVvdDs8L2Rpdj48ZGl2PsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgaWYoIWV4aXN0ZS5pc0VtcHR5KXs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHZhbCBmID0gZXhpc3RlLnRha2UoMSk8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZh bCBmZiA9IGYudG9MaXN0KDApPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjdmVfZXN0ID0g ZmYuZ2V0QXR0cmlidXRlKDEpLnRvU3RyaW5nIC8vU3RhdGUgQ29kZTwvZGl2PjxkaXY+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgY3ZlX211biA9IGZmLmdldEF0dHJpYnV0ZSgyKS50b1N0cmluZyDCoC8vIE11 bmljaXBhbGl0eSBDb2RlPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0aW1lID0gKG5ldyBT aW1wbGVEYXRlRm9ybWF0KCZxdW90O3l5eXktTU0tZGQmIzM5O1QmIzM5O0hIOm1tOnNzLlNTU1om cXVvdDspKS5wYXJzZShkYXRlLnJlcGxhY2VBbGwoJnF1b3Q7WiQmcXVvdDssICZxdW90OyswMDAw JnF1b3Q7KSkuZ2V0VGltZSgpLnRvU3RyaW5nKCk8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTwv ZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBsaW5lKyZxdW90OywmcXVvdDsrdGltZSsmcXVvdDssJnF1 b3Q7K2N2ZV9lc3QrJnF1b3Q7LCZxdW90OytjdmVfbXVuPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0pPC9k aXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjbGlwUG9pbnRzLmNvYWxlc2NlKDEsdHJ1 ZSkuc2F2ZUFzVGV4dEZpbGUoJnF1b3Q7aGRmczovL20wMS91c2VyL2Fjb3JvbmFkby9tb3YvbW92 X2FsbC5jc3YmcXVvdDspPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcmludGxu KCZxdW90O1NwYXJrIENsaXAgRXhpdG8hISEmcXVvdDspPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCB9 PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCBvYmplY3QgZ2VvRGF0YSB7PC9kaXY+PGRpdj7CoCDCoCDC oCDCoCDCoCDCoCBwcml2YXRlIHZhbCBlc3RhdGFsID0gU2hhcGVmaWxlKCZxdW90Oy9nZW9EYXRh L011bmljaXBpb3NMYXRMb24uc2hwJnF1b3Q7KSAvL1RoaXMgZGlyZWN0b3J5IGV4aXN0IGluIGFs bCB0aGUgbm9kZXMuPC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDCoCBwcml2YXRlIHZhbCBlc3Rh dGFsQ29sbCA9IGVzdGF0YWwuZ2V0RmVhdHVyZXM8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIMKgIMKg IGRlZiBnZXQ6RmVhdHVyZUNvbGxlY3Rpb25bb3JnLmdlb3NjcmlwdC5mZWF0dXJlLlNjaGVtYSxv cmcuZ2Vvc2NyaXB0LmZlYXR1cmUuRmVhdHVyZV0gPSBlc3RhdGFsQ29sbDwvZGl2PjxkaXY+wqAg wqAgwqAgwqAgfTwvZGl2PjxkaXY+fcKgPC9kaXY+PC9kaXY+DQo8L2Jsb2NrcXVvdGU+PC9kaXY+ PGJyPjwvZGl2Pg0K --089e0160bcb46dd76a0503617db4--