From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1079DC433F5 for ; Mon, 10 Jan 2022 18:57:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242730AbiAJS47 (ORCPT ); Mon, 10 Jan 2022 13:56:59 -0500 Received: from dfw.source.kernel.org ([139.178.84.217]:54406 "EHLO dfw.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242641AbiAJS47 (ORCPT ); Mon, 10 Jan 2022 13:56:59 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id BDD6D6137D; Mon, 10 Jan 2022 18:56:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CE547C36AE3; Mon, 10 Jan 2022 18:56:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1641841018; bh=sfAjJa7SO1QyY5lOIBROmF2VH8FL34dnowd5hzvMVbc=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Kvbm4fuVGqE2UYCu52QLiXMA9a8FZIZeYAyyE+rNuv5XJEQiSenRz5QRBbUEq6iER t3eYixAlw04XI9tzuPW4YPEWF8W+Ojt02XXVoodEOZAQcef4GpypY+1hDJMPx+BalJ NB9Kd2Ues56kA3HZxYOr/fm2e9Hx8hO8eZWdmie/N1+/2/gVj4yOetINsqRR04U4X4 mhbkbByfpqTdv0gBbjKztg9z4ZIn2QmSDOCFVQLuNzOLe1yOTuTt87niGJRTE4+Jgx xnA03dLQUbjVt4FQM1w4miFb5ajOJht+s2jg6gBWHtE2tRE1nko2HyyrfGw/oU2Mou pwjnn+QK5chLg== Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id AD56E40B92; Mon, 10 Jan 2022 15:56:55 -0300 (-03) Date: Mon, 10 Jan 2022 15:56:55 -0300 From: Arnaldo Carvalho de Melo To: Ian Rogers Cc: John Garry , Andi Kleen , Jiri Olsa , Namhyung Kim , Kajol Jain , "Paul A . Clarke" , Riccardo Mancini , Kan Liang , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Vineet Singh , James Clark , Mathieu Poirier , Suzuki K Poulose , Mike Leach , Leo Yan , coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, zhengjun.xing@intel.com, eranian@google.com Subject: Re: [PATCH v4 02/48] perf stat: Add aggr creators that are passed a cpu. Message-ID: References: <20220105061351.120843-1-irogers@google.com> <20220105061351.120843-3-irogers@google.com> <57ab982e-ecc1-3f49-c580-0a251e29698b@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-Url: http://acmel.wordpress.com Precedence: bulk List-ID: X-Mailing-List: linux-perf-users@vger.kernel.org Em Mon, Jan 10, 2022 at 03:53:45PM -0300, Arnaldo Carvalho de Melo escreveu: > Em Mon, Jan 10, 2022 at 03:52:11PM -0300, Arnaldo Carvalho de Melo escreveu: > > Em Mon, Jan 10, 2022 at 09:36:49AM -0800, Ian Rogers escreveu: > > > On Mon, Jan 10, 2022 at 9:10 AM John Garry wrote: > > > > > > > > On 05/01/2022 06:13, Ian Rogers wrote: > > > > > > > > > > +struct aggr_cpu_id cpu_map__get_socket(struct perf_cpu_map *map, int idx, > > > > > + void *data) > > > > > +{ > > > > > + if (idx < 0 || idx > map->nr) > > > > > + return cpu_map__empty_aggr_cpu_id(); > > > > > + > > > > > + return cpu_map__get_socket_aggr_by_cpu(map->map[idx], data); > > > > > +} > > > > > + > > > > > > > > > > > > This is later deleted in the series. Can the series be reworked so that > > > > we don't add stuff and then later delete it? One reason for that > > > > approach is that we don't spend time reviewing something which will be > > > > deleted, especially in such a big series... > > > > > > Hi John, > > > > > > I think you are asking to squash: > > > https://lore.kernel.org/lkml/20220105061351.120843-8-irogers@google.com/ > > > into this change. There are other similar related changes that may > > > also be squashed. The changes are trying to introduce a new API and > > > then add changes to switch over to using it. This is with a view to > > > making bisection easier, have each change only do 1 thing and so on. I > > > believe the format of the patches is house style, but it is fine to > > > squash changes together too. Having sent patches to Arnaldo and having > > > had them split I'm reluctant to do a v5 with them squashed without him > > > expressing a preference. > > > > Right, sometimes this is needed, I'm getting the patchkit now to test > > build it in my containers and will go patch by patch reviewing. > > Good start: > > ⬢[acme@toolbox perf]$ b4 am -ctsl --cc-trailers CAP-5=fWT_19OfZTTjvLUcChV4nDwqc5Zq4VE93Gak6OO4NORsA@mail.gmail.com > Looking up https://lore.kernel.org/r/CAP-5%3DfWT_19OfZTTjvLUcChV4nDwqc5Zq4VE93Gak6OO4NORsA%40mail.gmail.com > Grabbing thread from lore.kernel.org/all/CAP-5%3DfWT_19OfZTTjvLUcChV4nDwqc5Zq4VE93Gak6OO4NORsA%40mail.gmail.com/t.mbox.gz > Checking for newer revisions on https://lore.kernel.org/all/ > Analyzing 58 messages in the thread > Checking attestation on all messages, may take a moment... > --- > ✓ [PATCH v4 1/48] libperf: Add comments to perf_cpu_map. > + Reviewed-by: John Garry > + Signed-off-by: Arnaldo Carvalho de Melo > + Link: https://lore.kernel.org/r/20220105061351.120843-2-irogers@google.com > > Cover: ./v4_20220104_irogers_refactor_perf_cpumap.cover > Link: https://lore.kernel.org/r/20220105061351.120843-1-irogers@google.com > Base: applies clean to current tree > git checkout -b v4_20220104_irogers_google_com HEAD > git am ./v4_20220104_irogers_refactor_perf_cpumap.mbx > oops: CC /tmp/build/perf/util/unwind-libunwind-local.o util/bpf_counter_cgroup.c: In function ‘bperf_load_program’: util/bpf_counter_cgroup.c:51:26: error: incompatible types when initializing type ‘int’ using type ‘struct perf_cpu’ 51 | int total_cpus = cpu__max_cpu(); | ^~~~~~~~~~~~ util/bpf_counter_cgroup.c:127:74: error: invalid operands to binary + (have ‘int’ and ‘struct perf_cpu’) 127 | __u32 idx = evsel->core.idx * total_cpus + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ | | | int 128 | evlist->core.all_cpus->map[cpu]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | struct perf_cpu util/bpf_counter_cgroup.c: In function ‘bperf_cgrp__sync_counters’: util/bpf_counter_cgroup.c:215:23: error: incompatible types when assigning to type ‘int’ from type ‘struct perf_cpu’ 215 | cpu = evlist->core.all_cpus->map[i]; | ^~~~~~ util/bpf_counter_cgroup.c: In function ‘bperf_cgrp__read’: util/bpf_counter_cgroup.c:248:26: error: incompatible types when initializing type ‘int’ using type ‘struct perf_cpu’ 248 | int total_cpus = cpu__max_cpu(); | ^~~~~~~~~~~~ util/bpf_counter_cgroup.c:275:31: error: incompatible types when assigning to type ‘int’ from type ‘struct perf_cpu’ 275 | cpu = evlist->core.all_cpus->map[i]; | ^~~~~~ make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:97: /tmp/build/perf/util/bpf_counter_cgroup.o] Error 1 make[4]: *** Waiting for unfinished jobs.... util/bpf_counter.c: In function ‘bperf__load’: util/bpf_counter.c:543:31: error: incompatible types when assigning to type ‘__u32’ {aka ‘unsigned int’} from type ‘struct perf_cpu’ 543 | key = evsel->core.cpus->map[i]; | ^~~~~ util/bpf_counter.c: In function ‘bperf_sync_counters’: util/bpf_counter.c:587:23: error: incompatible types when assigning to type ‘int’ from type ‘struct perf_cpu’ 587 | cpu = all_cpu_map->map[i]; | ^~~~~~~~~~~ util/bpf_counter.c: In function ‘bperf__read’: util/bpf_counter.c:608:29: error: incompatible types when initializing type ‘__u32’ {aka ‘unsigned int’} using type ‘struct perf_cpu’ 608 | __u32 num_cpu_bpf = cpu__max_cpu(); | ^~~~~~~~~~~~ In file included from /var/home/acme/git/perf/tools/perf/util/cpumap.h:8, from /var/home/acme/git/perf/tools/perf/util/env.h:7, from util/cgroup.h:8, from util/bpf_counter.c:22: /var/home/acme/git/perf/tools/lib/perf/include/perf/cpumap.h:25:33: error: incompatible types when assigning to type ‘__u32’ {aka ‘unsigned int’} from type ‘struct perf_cpu’ 25 | for ((idx) = 0, (cpu) = perf_cpu_map__cpu(cpus, idx); \ | ^~~~~~~~~~~~~~~~~ util/bpf_counter.c:626:25: note: in expansion of macro ‘perf_cpu_map__for_each_cpu’ 626 | perf_cpu_map__for_each_cpu(cpu, j, all_cpu_map) { | ^~~~~~~~~~~~~~~~~~~~~~~~~~ /var/home/acme/git/perf/tools/lib/perf/include/perf/cpumap.h:26:20: error: comparison of integer expressions of different signedness: ‘__u32’ {aka ‘unsigned int’} and ‘int’ [-Werror=sign-compare] 26 | (idx) < perf_cpu_map__nr(cpus); \ | ^ util/bpf_counter.c:626:25: note: in expansion of macro ‘perf_cpu_map__for_each_cpu’ 626 | perf_cpu_map__for_each_cpu(cpu, j, all_cpu_map) { | ^~~~~~~~~~~~~~~~~~~~~~~~~~ /var/home/acme/git/perf/tools/lib/perf/include/perf/cpumap.h:27:31: error: incompatible types when assigning to type ‘__u32’ {aka ‘unsigned int’} from type ‘struct perf_cpu’ 27 | (idx)++, (cpu) = perf_cpu_map__cpu(cpus, idx)) | ^~~~~~~~~~~~~~~~~ util/bpf_counter.c:626:25: note: in expansion of macro ‘perf_cpu_map__for_each_cpu’ 626 | perf_cpu_map__for_each_cpu(cpu, j, all_cpu_map) { | ^~~~~~~~~~~~~~~~~~~~~~~~~~ util/bpf_counter.c:633:31: error: incompatible types when assigning to type ‘__u32’ {aka ‘unsigned int’} from type ‘struct perf_cpu’ 633 | cpu = evsel->core.cpus->map[i]; | ^~~~~ util/bpf_counter.c:611:21: error: unused variable ‘num_cpu’ [-Werror=unused-variable] 611 | __u32 i, j, num_cpu; | ^~~~~~~ cc1: all warnings being treated as errors make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/util/bpf_counter.o] Error 1 util/bpf_ftrace.c: In function ‘perf_ftrace__latency_prepare_bpf’: util/bpf_ftrace.c:66:31: error: implicit declaration of function ‘cpu_map__cpu’; did you mean ‘cpu__max_cpu’? [-Werror=implicit-function-declaration] 66 | cpu = cpu_map__cpu(ftrace->evlist->core.cpus, i); | ^~~~~~~~~~~~ | cpu__max_cpu util/bpf_ftrace.c: In function ‘perf_ftrace__latency_read_bpf’: util/bpf_ftrace.c:125:21: error: incompatible types when initializing type ‘int’ using type ‘struct perf_cpu’ 125 | int ncpus = cpu__max_cpu(); | ^~~~~~~~~~~~ cc1: all warnings being treated as errors make[4]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:96: /tmp/build/perf/util/bpf_ftrace.o] Error 1 LD /tmp/build/perf/util/intel-pt-decoder/perf-in.o LD /tmp/build/perf/util/scripting-engines/perf-in.o make[3]: *** [/var/home/acme/git/perf/tools/build/Makefile.build:139: util] Error 2 make[2]: *** [Makefile.perf:665: /tmp/build/perf/perf-in.o] Error 2 make[2]: *** Waiting for unfinished jobs.... make[1]: *** [Makefile.perf:240: sub-make] Error 2 make: *** [Makefile:113: install-bin] Error 2 make: Leaving directory '/var/home/acme/git/perf/tools/perf' Performance counter stats for 'make -k BUILD_BPF_SKEL=1 CORESIGHT=1 PYTHON=python3 O=/tmp/build/perf -C tools/perf install-bin': 279,675,447,200 cycles:u 348,898,435,627 instructions:u # 1.25 insn per cycle 4.978587957 seconds time elapsed 68.698979000 seconds user 12.541229000 seconds sys ⬢[acme@toolbox perf]$ This is building with: $ make BUILD_BPF_SKEL=1 CORESIGHT=1 PYTHON=python3 O=/tmp/build/perf -C tools/perf install-bin In general for such refactorings its important to run: make -C tools/perf build-test But there is no entry there with BUILD_BPF_SKEL=1, will fix that now and try to fix this in the patchkit as well. - Arnaldo From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 84280C433F5 for ; Mon, 10 Jan 2022 18:58:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=1pD80R+/a9DT1X28Adla7oNB0yLiuDlZwqPMt6LOqTU=; b=MICKbK+YnzN+P6 lSC9tNjkt4v9W9O0optjiwFTI6fH9vsl3N5iXC5qWp3dYUpuIqc7mZC1PfjYw2/gZ4CgqtgaJf9O9 7gsLyeAMOpP7+EveAsXiNe1RrGKVt2TFa98tQQ+WJAGuf1jpRagNCDHOK/qAiuG2lM5Dh+76Q8kt2 9Ya1SF5zfYcA7Js5KnTZkSii+QpJvMlhpLQ+iI0CAYebq3NjPzAG3KeMbcTsNO57zAgoMxAVwjrOJ /OsRrv17rggAoq89OwB4sK15yiD2m5Pa5m6xDLl/61MxmL/D6LVa3srMrDhJWLpBEw5tswNVtZEh4 tqISulHsS6S1BNE5KzKA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1n6zqq-00CtHZ-1s; Mon, 10 Jan 2022 18:57:04 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1n6zql-00CtFu-QC for linux-arm-kernel@bombadil.infradead.org; Mon, 10 Jan 2022 18:56:59 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=In-Reply-To:Content-Transfer-Encoding: Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date: Sender:Reply-To:Content-ID:Content-Description; bh=ZlqtMcSYHnqdq7SOIdsdIhJV99Cq5Lr83vaOzeIa+4M=; b=SRnWh2wo+kLoD3gBx+LcwJLy+Q z4zVeJFft4yJcSjQQhVL+P6XOCNoi39Qxmko2BW/3CFOK1K/Bp8vUphND/uwGkYFmMOOhdy4BRBoI 1TT81X85pjXJNAwQbaX/2bZtijUU14pkHziLAHK0PvMeEEXB2xW7dsWv93vf5/GpIeCL0G/wB5Q1I KpEu4xznBhNXVHqscajGD5qj3xzdxvRt0UDpGabYUfa0mnvzbWQ4mMV2ZymD4nlQbxGXjQUbdv6H3 zdsTBlYfsWSsDKQHeSPsEo7idrEuGOGcoQUf/7aNTbIZzQfAhdtHB83aNx/dPw/vjtFCJ5QFsj+1s WQm4lk+A==; Received: from [179.97.37.151] (helo=quaco.ghostprotocols.net) by casper.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1n6zqj-002ei9-NE; Mon, 10 Jan 2022 18:56:58 +0000 Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id AD56E40B92; Mon, 10 Jan 2022 15:56:55 -0300 (-03) Date: Mon, 10 Jan 2022 15:56:55 -0300 From: Arnaldo Carvalho de Melo To: Ian Rogers Cc: John Garry , Andi Kleen , Jiri Olsa , Namhyung Kim , Kajol Jain , "Paul A . Clarke" , Riccardo Mancini , Kan Liang , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Vineet Singh , James Clark , Mathieu Poirier , Suzuki K Poulose , Mike Leach , Leo Yan , coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, zhengjun.xing@intel.com, eranian@google.com Subject: Re: [PATCH v4 02/48] perf stat: Add aggr creators that are passed a cpu. Message-ID: References: <20220105061351.120843-1-irogers@google.com> <20220105061351.120843-3-irogers@google.com> <57ab982e-ecc1-3f49-c580-0a251e29698b@huawei.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-Url: http://acmel.wordpress.com X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org RW0gTW9uLCBKYW4gMTAsIDIwMjIgYXQgMDM6NTM6NDVQTSAtMDMwMCwgQXJuYWxkbyBDYXJ2YWxo byBkZSBNZWxvIGVzY3JldmV1Ogo+IEVtIE1vbiwgSmFuIDEwLCAyMDIyIGF0IDAzOjUyOjExUE0g LTAzMDAsIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyBlc2NyZXZldToKPiA+IEVtIE1vbiwgSmFu IDEwLCAyMDIyIGF0IDA5OjM2OjQ5QU0gLTA4MDAsIElhbiBSb2dlcnMgZXNjcmV2ZXU6Cj4gPiA+ IE9uIE1vbiwgSmFuIDEwLCAyMDIyIGF0IDk6MTAgQU0gSm9obiBHYXJyeSA8am9obi5nYXJyeUBo dWF3ZWkuY29tPiB3cm90ZToKPiA+ID4gPgo+ID4gPiA+IE9uIDA1LzAxLzIwMjIgMDY6MTMsIElh biBSb2dlcnMgd3JvdGU6Cj4gPiA+ID4gPgo+ID4gPiA+ID4gK3N0cnVjdCBhZ2dyX2NwdV9pZCBj cHVfbWFwX19nZXRfc29ja2V0KHN0cnVjdCBwZXJmX2NwdV9tYXAgKm1hcCwgaW50IGlkeCwKPiA+ ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQo+ ID4gPiA+ID4gK3sKPiA+ID4gPiA+ICsgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+IG1hcC0+bnIp Cj4gPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiBjcHVfbWFwX19lbXB0eV9hZ2dyX2NwdV9p ZCgpOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAgcmV0dXJuIGNwdV9tYXBfX2dldF9zb2Nr ZXRfYWdncl9ieV9jcHUobWFwLT5tYXBbaWR4XSwgZGF0YSk7Cj4gPiA+ID4gPiArfQo+ID4gPiA+ ID4gKwo+ID4gPiA+Cj4gPiA+ID4KPiA+ID4gPiBUaGlzIGlzIGxhdGVyIGRlbGV0ZWQgaW4gdGhl IHNlcmllcy4gQ2FuIHRoZSBzZXJpZXMgYmUgcmV3b3JrZWQgc28gdGhhdAo+ID4gPiA+IHdlIGRv bid0IGFkZCBzdHVmZiBhbmQgdGhlbiBsYXRlciBkZWxldGUgaXQ/IE9uZSByZWFzb24gZm9yIHRo YXQKPiA+ID4gPiBhcHByb2FjaCBpcyB0aGF0IHdlIGRvbid0IHNwZW5kIHRpbWUgcmV2aWV3aW5n IHNvbWV0aGluZyB3aGljaCB3aWxsIGJlCj4gPiA+ID4gZGVsZXRlZCwgZXNwZWNpYWxseSBpbiBz dWNoIGEgYmlnIHNlcmllcy4uLgo+ID4gPiAKPiA+ID4gSGkgSm9obiwKPiA+ID4gCj4gPiA+IEkg dGhpbmsgeW91IGFyZSBhc2tpbmcgdG8gc3F1YXNoOgo+ID4gPiBodHRwczovL2xvcmUua2VybmVs Lm9yZy9sa21sLzIwMjIwMTA1MDYxMzUxLjEyMDg0My04LWlyb2dlcnNAZ29vZ2xlLmNvbS8KPiA+ ID4gaW50byB0aGlzIGNoYW5nZS4gVGhlcmUgYXJlIG90aGVyICBzaW1pbGFyIHJlbGF0ZWQgY2hh bmdlcyB0aGF0IG1heQo+ID4gPiBhbHNvIGJlIHNxdWFzaGVkLiBUaGUgY2hhbmdlcyBhcmUgdHJ5 aW5nIHRvIGludHJvZHVjZSBhIG5ldyBBUEkgYW5kCj4gPiA+IHRoZW4gYWRkIGNoYW5nZXMgdG8g c3dpdGNoIG92ZXIgdG8gdXNpbmcgaXQuIFRoaXMgaXMgd2l0aCBhIHZpZXcgdG8KPiA+ID4gbWFr aW5nIGJpc2VjdGlvbiBlYXNpZXIsIGhhdmUgZWFjaCBjaGFuZ2Ugb25seSBkbyAxIHRoaW5nIGFu ZCBzbyBvbi4gSQo+ID4gPiBiZWxpZXZlIHRoZSBmb3JtYXQgb2YgdGhlIHBhdGNoZXMgaXMgaG91 c2Ugc3R5bGUsIGJ1dCBpdCBpcyBmaW5lIHRvCj4gPiA+IHNxdWFzaCBjaGFuZ2VzIHRvZ2V0aGVy IHRvby4gSGF2aW5nIHNlbnQgcGF0Y2hlcyB0byBBcm5hbGRvIGFuZCBoYXZpbmcKPiA+ID4gaGFk IHRoZW0gc3BsaXQgSSdtIHJlbHVjdGFudCB0byBkbyBhIHY1IHdpdGggdGhlbSBzcXVhc2hlZCB3 aXRob3V0IGhpbQo+ID4gPiBleHByZXNzaW5nIGEgcHJlZmVyZW5jZS4KPiA+IAo+ID4gUmlnaHQs IHNvbWV0aW1lcyB0aGlzIGlzIG5lZWRlZCwgSSdtIGdldHRpbmcgdGhlIHBhdGNoa2l0IG5vdyB0 byB0ZXN0Cj4gPiBidWlsZCBpdCBpbiBteSBjb250YWluZXJzIGFuZCB3aWxsIGdvIHBhdGNoIGJ5 IHBhdGNoIHJldmlld2luZy4KPiAKPiBHb29kIHN0YXJ0Ogo+IAo+IOKsolthY21lQHRvb2xib3gg cGVyZl0kIGI0IGFtIC1jdHNsIC0tY2MtdHJhaWxlcnMgQ0FQLTU9ZldUXzE5T2ZaVFRqdkxVY0No VjRuRHdxYzVacTRWRTkzR2FrNk9PNE5PUnNBQG1haWwuZ21haWwuY29tCj4gTG9va2luZyB1cCBo dHRwczovL2xvcmUua2VybmVsLm9yZy9yL0NBUC01JTNEZldUXzE5T2ZaVFRqdkxVY0NoVjRuRHdx YzVacTRWRTkzR2FrNk9PNE5PUnNBJTQwbWFpbC5nbWFpbC5jb20KPiBHcmFiYmluZyB0aHJlYWQg ZnJvbSBsb3JlLmtlcm5lbC5vcmcvYWxsL0NBUC01JTNEZldUXzE5T2ZaVFRqdkxVY0NoVjRuRHdx YzVacTRWRTkzR2FrNk9PNE5PUnNBJTQwbWFpbC5nbWFpbC5jb20vdC5tYm94Lmd6Cj4gQ2hlY2tp bmcgZm9yIG5ld2VyIHJldmlzaW9ucyBvbiBodHRwczovL2xvcmUua2VybmVsLm9yZy9hbGwvCj4g QW5hbHl6aW5nIDU4IG1lc3NhZ2VzIGluIHRoZSB0aHJlYWQKPiBDaGVja2luZyBhdHRlc3RhdGlv biBvbiBhbGwgbWVzc2FnZXMsIG1heSB0YWtlIGEgbW9tZW50Li4uCj4gLS0tCj4gICDinJMgW1BB VENIIHY0IDEvNDhdIGxpYnBlcmY6IEFkZCBjb21tZW50cyB0byBwZXJmX2NwdV9tYXAuCj4gICAg ICsgUmV2aWV3ZWQtYnk6IEpvaG4gR2FycnkgPGpvaG4uZ2FycnlAaHVhd2VpLmNvbT4KPiAgICAg KyBTaWduZWQtb2ZmLWJ5OiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAcmVkaGF0LmNv bT4KPiAgICAgKyBMaW5rOiBodHRwczovL2xvcmUua2VybmVsLm9yZy9yLzIwMjIwMTA1MDYxMzUx LjEyMDg0My0yLWlyb2dlcnNAZ29vZ2xlLmNvbQo+IDxCSUcgU05JUD4KPiBDb3ZlcjogLi92NF8y MDIyMDEwNF9pcm9nZXJzX3JlZmFjdG9yX3BlcmZfY3B1bWFwLmNvdmVyCj4gIExpbms6IGh0dHBz Oi8vbG9yZS5rZXJuZWwub3JnL3IvMjAyMjAxMDUwNjEzNTEuMTIwODQzLTEtaXJvZ2Vyc0Bnb29n bGUuY29tCj4gIEJhc2U6IGFwcGxpZXMgY2xlYW4gdG8gY3VycmVudCB0cmVlCj4gICAgICAgIGdp dCBjaGVja291dCAtYiB2NF8yMDIyMDEwNF9pcm9nZXJzX2dvb2dsZV9jb20gSEVBRAo+ICAgICAg ICBnaXQgYW0gLi92NF8yMDIyMDEwNF9pcm9nZXJzX3JlZmFjdG9yX3BlcmZfY3B1bWFwLm1ieAo+ IAoKb29wczoKCiAgQ0MgICAgICAvdG1wL2J1aWxkL3BlcmYvdXRpbC91bndpbmQtbGlidW53aW5k LWxvY2FsLm8KdXRpbC9icGZfY291bnRlcl9jZ3JvdXAuYzogSW4gZnVuY3Rpb24g4oCYYnBlcmZf bG9hZF9wcm9ncmFt4oCZOgp1dGlsL2JwZl9jb3VudGVyX2Nncm91cC5jOjUxOjI2OiBlcnJvcjog aW5jb21wYXRpYmxlIHR5cGVzIHdoZW4gaW5pdGlhbGl6aW5nIHR5cGUg4oCYaW504oCZIHVzaW5n IHR5cGUg4oCYc3RydWN0IHBlcmZfY3B14oCZCiAgIDUxIHwgICAgICAgICBpbnQgdG90YWxfY3B1 cyA9IGNwdV9fbWF4X2NwdSgpOwogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICBefn5+ fn5+fn5+fn4KdXRpbC9icGZfY291bnRlcl9jZ3JvdXAuYzoxMjc6NzQ6IGVycm9yOiBpbnZhbGlk IG9wZXJhbmRzIHRvIGJpbmFyeSArIChoYXZlIOKAmGludOKAmSBhbmQg4oCYc3RydWN0IHBlcmZf Y3B14oCZKQogIDEyNyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191MzIgaWR4 ID0gZXZzZWwtPmNvcmUuaWR4ICogdG90YWxfY3B1cyArCiAgICAgIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ IF4KICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50CiAgMTI4IHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGV2bGlzdC0+Y29yZS5hbGxfY3B1cy0+bWFwW2NwdV07CiAg ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn4KICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RydWN0IHBlcmZfY3B1CnV0aWwvYnBmX2NvdW50ZXJfY2dyb3VwLmM6IEluIGZ1bmN0aW9uIOKA mGJwZXJmX2NncnBfX3N5bmNfY291bnRlcnPigJk6CnV0aWwvYnBmX2NvdW50ZXJfY2dyb3VwLmM6 MjE1OjIzOiBlcnJvcjogaW5jb21wYXRpYmxlIHR5cGVzIHdoZW4gYXNzaWduaW5nIHRvIHR5cGUg 4oCYaW504oCZIGZyb20gdHlwZSDigJhzdHJ1Y3QgcGVyZl9jcHXigJkKICAyMTUgfCAgICAgICAg ICAgICAgICAgY3B1ID0gZXZsaXN0LT5jb3JlLmFsbF9jcHVzLT5tYXBbaV07CiAgICAgIHwgICAg ICAgICAgICAgICAgICAgICAgIF5+fn5+fgp1dGlsL2JwZl9jb3VudGVyX2Nncm91cC5jOiBJbiBm dW5jdGlvbiDigJhicGVyZl9jZ3JwX19yZWFk4oCZOgp1dGlsL2JwZl9jb3VudGVyX2Nncm91cC5j OjI0ODoyNjogZXJyb3I6IGluY29tcGF0aWJsZSB0eXBlcyB3aGVuIGluaXRpYWxpemluZyB0eXBl IOKAmGludOKAmSB1c2luZyB0eXBlIOKAmHN0cnVjdCBwZXJmX2NwdeKAmQogIDI0OCB8ICAgICAg ICAgaW50IHRvdGFsX2NwdXMgPSBjcHVfX21heF9jcHUoKTsKICAgICAgfCAgICAgICAgICAgICAg ICAgICAgICAgICAgXn5+fn5+fn5+fn5+CnV0aWwvYnBmX2NvdW50ZXJfY2dyb3VwLmM6Mjc1OjMx OiBlcnJvcjogaW5jb21wYXRpYmxlIHR5cGVzIHdoZW4gYXNzaWduaW5nIHRvIHR5cGUg4oCYaW50 4oCZIGZyb20gdHlwZSDigJhzdHJ1Y3QgcGVyZl9jcHXigJkKICAyNzUgfCAgICAgICAgICAgICAg ICAgICAgICAgICBjcHUgPSBldmxpc3QtPmNvcmUuYWxsX2NwdXMtPm1hcFtpXTsKICAgICAgfCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBefn5+fn4KbWFrZVs0XTogKioqIFsvdmFyL2hv bWUvYWNtZS9naXQvcGVyZi90b29scy9idWlsZC9NYWtlZmlsZS5idWlsZDo5NzogL3RtcC9idWls ZC9wZXJmL3V0aWwvYnBmX2NvdW50ZXJfY2dyb3VwLm9dIEVycm9yIDEKbWFrZVs0XTogKioqIFdh aXRpbmcgZm9yIHVuZmluaXNoZWQgam9icy4uLi4KdXRpbC9icGZfY291bnRlci5jOiBJbiBmdW5j dGlvbiDigJhicGVyZl9fbG9hZOKAmToKdXRpbC9icGZfY291bnRlci5jOjU0MzozMTogZXJyb3I6 IGluY29tcGF0aWJsZSB0eXBlcyB3aGVuIGFzc2lnbmluZyB0byB0eXBlIOKAmF9fdTMy4oCZIHth a2Eg4oCYdW5zaWduZWQgaW504oCZfSBmcm9tIHR5cGUg4oCYc3RydWN0IHBlcmZfY3B14oCZCiAg NTQzIHwgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gZXZzZWwtPmNvcmUuY3B1cy0+bWFw W2ldOwogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5+fn5+CnV0aWwvYnBm X2NvdW50ZXIuYzogSW4gZnVuY3Rpb24g4oCYYnBlcmZfc3luY19jb3VudGVyc+KAmToKdXRpbC9i cGZfY291bnRlci5jOjU4NzoyMzogZXJyb3I6IGluY29tcGF0aWJsZSB0eXBlcyB3aGVuIGFzc2ln bmluZyB0byB0eXBlIOKAmGludOKAmSBmcm9tIHR5cGUg4oCYc3RydWN0IHBlcmZfY3B14oCZCiAg NTg3IHwgICAgICAgICAgICAgICAgIGNwdSA9IGFsbF9jcHVfbWFwLT5tYXBbaV07CiAgICAgIHwg ICAgICAgICAgICAgICAgICAgICAgIF5+fn5+fn5+fn5+CnV0aWwvYnBmX2NvdW50ZXIuYzogSW4g ZnVuY3Rpb24g4oCYYnBlcmZfX3JlYWTigJk6CnV0aWwvYnBmX2NvdW50ZXIuYzo2MDg6Mjk6IGVy cm9yOiBpbmNvbXBhdGlibGUgdHlwZXMgd2hlbiBpbml0aWFsaXppbmcgdHlwZSDigJhfX3UzMuKA mSB7YWthIOKAmHVuc2lnbmVkIGludOKAmX0gdXNpbmcgdHlwZSDigJhzdHJ1Y3QgcGVyZl9jcHXi gJkKICA2MDggfCAgICAgICAgIF9fdTMyIG51bV9jcHVfYnBmID0gY3B1X19tYXhfY3B1KCk7CiAg ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5+fn5+fn5+fn5+fgpJbiBmaWxlIGlu Y2x1ZGVkIGZyb20gL3Zhci9ob21lL2FjbWUvZ2l0L3BlcmYvdG9vbHMvcGVyZi91dGlsL2NwdW1h cC5oOjgsCiAgICAgICAgICAgICAgICAgZnJvbSAvdmFyL2hvbWUvYWNtZS9naXQvcGVyZi90b29s cy9wZXJmL3V0aWwvZW52Lmg6NywKICAgICAgICAgICAgICAgICBmcm9tIHV0aWwvY2dyb3VwLmg6 OCwKICAgICAgICAgICAgICAgICBmcm9tIHV0aWwvYnBmX2NvdW50ZXIuYzoyMjoKL3Zhci9ob21l L2FjbWUvZ2l0L3BlcmYvdG9vbHMvbGliL3BlcmYvaW5jbHVkZS9wZXJmL2NwdW1hcC5oOjI1OjMz OiBlcnJvcjogaW5jb21wYXRpYmxlIHR5cGVzIHdoZW4gYXNzaWduaW5nIHRvIHR5cGUg4oCYX191 MzLigJkge2FrYSDigJh1bnNpZ25lZCBpbnTigJl9IGZyb20gdHlwZSDigJhzdHJ1Y3QgcGVyZl9j cHXigJkKICAgMjUgfCAgICAgICAgIGZvciAoKGlkeCkgPSAwLCAoY3B1KSA9IHBlcmZfY3B1X21h cF9fY3B1KGNwdXMsIGlkeCk7ICAgXAogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXn5+fn5+fn5+fn5+fn5+fn4KdXRpbC9icGZfY291bnRlci5jOjYyNjoyNTogbm90ZTog aW4gZXhwYW5zaW9uIG9mIG1hY3JvIOKAmHBlcmZfY3B1X21hcF9fZm9yX2VhY2hfY3B14oCZCiAg NjI2IHwgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZl9jcHVfbWFwX19mb3JfZWFjaF9jcHUo Y3B1LCBqLCBhbGxfY3B1X21hcCkgewogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIF5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci92YXIvaG9tZS9hY21lL2dpdC9wZXJmL3Rvb2xzL2xp Yi9wZXJmL2luY2x1ZGUvcGVyZi9jcHVtYXAuaDoyNjoyMDogZXJyb3I6IGNvbXBhcmlzb24gb2Yg aW50ZWdlciBleHByZXNzaW9ucyBvZiBkaWZmZXJlbnQgc2lnbmVkbmVzczog4oCYX191MzLigJkg e2FrYSDigJh1bnNpZ25lZCBpbnTigJl9IGFuZCDigJhpbnTigJkgWy1XZXJyb3I9c2lnbi1jb21w YXJlXQogICAyNiB8ICAgICAgICAgICAgICAoaWR4KSA8IHBlcmZfY3B1X21hcF9fbnIoY3B1cyk7 ICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHwgICAgICAgICAgICAgICAgICAgIF4KdXRpbC9i cGZfY291bnRlci5jOjYyNjoyNTogbm90ZTogaW4gZXhwYW5zaW9uIG9mIG1hY3JvIOKAmHBlcmZf Y3B1X21hcF9fZm9yX2VhY2hfY3B14oCZCiAgNjI2IHwgICAgICAgICAgICAgICAgICAgICAgICAg cGVyZl9jcHVfbWFwX19mb3JfZWFjaF9jcHUoY3B1LCBqLCBhbGxfY3B1X21hcCkgewogICAgICB8 ICAgICAgICAgICAgICAgICAgICAgICAgIF5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci92YXIv aG9tZS9hY21lL2dpdC9wZXJmL3Rvb2xzL2xpYi9wZXJmL2luY2x1ZGUvcGVyZi9jcHVtYXAuaDoy NzozMTogZXJyb3I6IGluY29tcGF0aWJsZSB0eXBlcyB3aGVuIGFzc2lnbmluZyB0byB0eXBlIOKA mF9fdTMy4oCZIHtha2Eg4oCYdW5zaWduZWQgaW504oCZfSBmcm9tIHR5cGUg4oCYc3RydWN0IHBl cmZfY3B14oCZCiAgIDI3IHwgICAgICAgICAgICAgIChpZHgpKyssIChjcHUpID0gcGVyZl9jcHVf bWFwX19jcHUoY3B1cywgaWR4KSkKICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBefn5+fn5+fn5+fn5+fn5+fgp1dGlsL2JwZl9jb3VudGVyLmM6NjI2OjI1OiBub3RlOiBpbiBl eHBhbnNpb24gb2YgbWFjcm8g4oCYcGVyZl9jcHVfbWFwX19mb3JfZWFjaF9jcHXigJkKICA2MjYg fCAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmX2NwdV9tYXBfX2Zvcl9lYWNoX2NwdShjcHUs IGosIGFsbF9jcHVfbWFwKSB7CiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgXn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn4KdXRpbC9icGZfY291bnRlci5jOjYzMzozMTogZXJyb3I6IGlu Y29tcGF0aWJsZSB0eXBlcyB3aGVuIGFzc2lnbmluZyB0byB0eXBlIOKAmF9fdTMy4oCZIHtha2Eg 4oCYdW5zaWduZWQgaW504oCZfSBmcm9tIHR5cGUg4oCYc3RydWN0IHBlcmZfY3B14oCZCiAgNjMz IHwgICAgICAgICAgICAgICAgICAgICAgICAgY3B1ID0gZXZzZWwtPmNvcmUuY3B1cy0+bWFwW2ld OwogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5+fn5+CnV0aWwvYnBmX2Nv dW50ZXIuYzo2MTE6MjE6IGVycm9yOiB1bnVzZWQgdmFyaWFibGUg4oCYbnVtX2NwdeKAmSBbLVdl cnJvcj11bnVzZWQtdmFyaWFibGVdCiAgNjExIHwgICAgICAgICBfX3UzMiBpLCBqLCBudW1fY3B1 OwogICAgICB8ICAgICAgICAgICAgICAgICAgICAgXn5+fn5+fgpjYzE6IGFsbCB3YXJuaW5ncyBi ZWluZyB0cmVhdGVkIGFzIGVycm9ycwptYWtlWzRdOiAqKiogWy92YXIvaG9tZS9hY21lL2dpdC9w ZXJmL3Rvb2xzL2J1aWxkL01ha2VmaWxlLmJ1aWxkOjk2OiAvdG1wL2J1aWxkL3BlcmYvdXRpbC9i cGZfY291bnRlci5vXSBFcnJvciAxCnV0aWwvYnBmX2Z0cmFjZS5jOiBJbiBmdW5jdGlvbiDigJhw ZXJmX2Z0cmFjZV9fbGF0ZW5jeV9wcmVwYXJlX2JwZuKAmToKdXRpbC9icGZfZnRyYWNlLmM6NjY6 MzE6IGVycm9yOiBpbXBsaWNpdCBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbiDigJhjcHVfbWFwX19j cHXigJk7IGRpZCB5b3UgbWVhbiDigJhjcHVfX21heF9jcHXigJk/IFstV2Vycm9yPWltcGxpY2l0 LWZ1bmN0aW9uLWRlY2xhcmF0aW9uXQogICA2NiB8ICAgICAgICAgICAgICAgICAgICAgICAgIGNw dSA9IGNwdV9tYXBfX2NwdShmdHJhY2UtPmV2bGlzdC0+Y29yZS5jcHVzLCBpKTsKICAgICAgfCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBefn5+fn5+fn5+fn4KICAgICAgfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjcHVfX21heF9jcHUKdXRpbC9icGZfZnRyYWNlLmM6IElu IGZ1bmN0aW9uIOKAmHBlcmZfZnRyYWNlX19sYXRlbmN5X3JlYWRfYnBm4oCZOgp1dGlsL2JwZl9m dHJhY2UuYzoxMjU6MjE6IGVycm9yOiBpbmNvbXBhdGlibGUgdHlwZXMgd2hlbiBpbml0aWFsaXpp bmcgdHlwZSDigJhpbnTigJkgdXNpbmcgdHlwZSDigJhzdHJ1Y3QgcGVyZl9jcHXigJkKICAxMjUg fCAgICAgICAgIGludCBuY3B1cyA9IGNwdV9fbWF4X2NwdSgpOwogICAgICB8ICAgICAgICAgICAg ICAgICAgICAgXn5+fn5+fn5+fn5+CmNjMTogYWxsIHdhcm5pbmdzIGJlaW5nIHRyZWF0ZWQgYXMg ZXJyb3JzCm1ha2VbNF06ICoqKiBbL3Zhci9ob21lL2FjbWUvZ2l0L3BlcmYvdG9vbHMvYnVpbGQv TWFrZWZpbGUuYnVpbGQ6OTY6IC90bXAvYnVpbGQvcGVyZi91dGlsL2JwZl9mdHJhY2Uub10gRXJy b3IgMQogIExEICAgICAgL3RtcC9idWlsZC9wZXJmL3V0aWwvaW50ZWwtcHQtZGVjb2Rlci9wZXJm LWluLm8KICBMRCAgICAgIC90bXAvYnVpbGQvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3Bl cmYtaW4ubwptYWtlWzNdOiAqKiogWy92YXIvaG9tZS9hY21lL2dpdC9wZXJmL3Rvb2xzL2J1aWxk L01ha2VmaWxlLmJ1aWxkOjEzOTogdXRpbF0gRXJyb3IgMgptYWtlWzJdOiAqKiogW01ha2VmaWxl LnBlcmY6NjY1OiAvdG1wL2J1aWxkL3BlcmYvcGVyZi1pbi5vXSBFcnJvciAyCm1ha2VbMl06ICoq KiBXYWl0aW5nIGZvciB1bmZpbmlzaGVkIGpvYnMuLi4uCm1ha2VbMV06ICoqKiBbTWFrZWZpbGUu cGVyZjoyNDA6IHN1Yi1tYWtlXSBFcnJvciAyCm1ha2U6ICoqKiBbTWFrZWZpbGU6MTEzOiBpbnN0 YWxsLWJpbl0gRXJyb3IgMgptYWtlOiBMZWF2aW5nIGRpcmVjdG9yeSAnL3Zhci9ob21lL2FjbWUv Z2l0L3BlcmYvdG9vbHMvcGVyZicKCiBQZXJmb3JtYW5jZSBjb3VudGVyIHN0YXRzIGZvciAnbWFr ZSAtayBCVUlMRF9CUEZfU0tFTD0xIENPUkVTSUdIVD0xIFBZVEhPTj1weXRob24zIE89L3RtcC9i dWlsZC9wZXJmIC1DIHRvb2xzL3BlcmYgaW5zdGFsbC1iaW4nOgoKICAgMjc5LDY3NSw0NDcsMjAw ICAgICAgY3ljbGVzOnUKICAgMzQ4LDg5OCw0MzUsNjI3ICAgICAgaW5zdHJ1Y3Rpb25zOnUgICAg ICAgICAgICAjICAgIDEuMjUgIGluc24gcGVyIGN5Y2xlCgogICAgICAgNC45Nzg1ODc5NTcgc2Vj b25kcyB0aW1lIGVsYXBzZWQKCiAgICAgIDY4LjY5ODk3OTAwMCBzZWNvbmRzIHVzZXIKICAgICAg MTIuNTQxMjI5MDAwIHNlY29uZHMgc3lzCgoK4qyiW2FjbWVAdG9vbGJveCBwZXJmXSQKClRoaXMg aXMgYnVpbGRpbmcgd2l0aDoKCiQgbWFrZSBCVUlMRF9CUEZfU0tFTD0xIENPUkVTSUdIVD0xIFBZ VEhPTj1weXRob24zIE89L3RtcC9idWlsZC9wZXJmIC1DIHRvb2xzL3BlcmYgaW5zdGFsbC1iaW4K CgpJbiBnZW5lcmFsIGZvciBzdWNoIHJlZmFjdG9yaW5ncyBpdHMgaW1wb3J0YW50IHRvIHJ1bjoK Cm1ha2UgLUMgdG9vbHMvcGVyZiBidWlsZC10ZXN0CgoKQnV0IHRoZXJlIGlzIG5vIGVudHJ5IHRo ZXJlIHdpdGggQlVJTERfQlBGX1NLRUw9MSwgd2lsbCBmaXggdGhhdCBub3cgYW5kCnRyeSB0byBm aXggdGhpcyBpbiB0aGUgcGF0Y2hraXQgYXMgd2VsbC4KCi0gQXJuYWxkbwoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWls aW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=