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 CAAB5C433F5 for ; Thu, 7 Apr 2022 10:00:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230376AbiDGKCp (ORCPT ); Thu, 7 Apr 2022 06:02:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46970 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231781AbiDGKC1 (ORCPT ); Thu, 7 Apr 2022 06:02:27 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 17EEB1A949D; Thu, 7 Apr 2022 03:00:22 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 88E0023A; Thu, 7 Apr 2022 03:00:22 -0700 (PDT) Received: from [10.34.129.54] (e126645.nice.arm.com [10.34.129.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B8B863F5A1; Thu, 7 Apr 2022 03:00:18 -0700 (PDT) Message-ID: <9130656b-e485-6391-7fa5-6fb88091e5fc@arm.com> Date: Thu, 7 Apr 2022 12:00:43 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 Subject: Re: [PATCH v2 0/3] Enable EAS for CPPC/ACPI based systems Content-Language: en-US To: Itaru Kitayama Cc: Ard Biesheuvel , Catalin Marinas , Dietmar.Eggemann@arm.com, Fuad Tabba , Ionela.Voinescu@arm.com, Lee Jones , Lukasz.Luba@arm.com, Mark Rutland , Morten.Rasmussen@arm.com, "Rafael J. Wysocki" , Rob Herring , Sudeep Holla , Viresh Kumar , Will Deacon , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, maz@kernel.org References: <20220407081620.1662192-1-pierre.gondois@arm.com> From: Pierre Gondois In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello, The following branch contains all the required patches: https://gitlab.arm.com/linux-arm/linux-pg/-/tree/pg/eas_acpi_v2 Regards, Pierre On 4/7/22 11:36, Itaru Kitayama wrote: > Do you happen to have your own dev git tree that  has this series? > > Itaru. > > On Thu, Apr 7, 2022 at 17:54 Pierre Gondois > wrote: > > From: Pierre Gondois > > > v2: > - Remove inline hint of cppc_cpufreq_search_cpu_data(). [Mark] > - Use EXPORT_SYMBOL_GPL() instead of EXPORT_SYMBOL(). [Mark] > - Use a bitmap to squeeze CPU efficiency class values. [Mark] > > 0. Overview > > The current Energy Model (EM) for CPUs requires knowledge about CPU > performance states and their power consumption. Both of these > information is not available for ACPI based systems. > > In ACPI, describing power efficiency of CPUs can be done through the > following arm specific field: > > ACPI 6.4, s5.2.12.14 "GIC CPU Interface (GICC) Structure", > "Processor Power Efficiency Class field": > Describes the relative power efficiency of the associated pro- > cessor. Lower efficiency class numbers are more efficient than > higher ones (e.g. efficiency class 0 should be treated as more > efficient than efficiency class 1). However, absolute values > of this number have no meaning: 2 isn't necessarily half as > efficient as 1. > > Add an 'efficiency_class' field to describe the relative power > efficiency of CPUs. CPUs relying on this field will have performance > states (power and frequency values) artificially created. Such EM will > be referred to as an artificial EM. > > The artificial EM is used for the CPPC driver. > > 1. Dependencies > > This patch-set has a dependency on: >  - [0/8] Introduce support for artificial Energy Model > https://lkml.org/lkml/2022/3/16/850 > introduces a new callback in the Energy Model (EM) and prevents the > registration of devices using power values from an EM when the EM > is artificial. Not having this patch-set would break builds. >  - This patch-set based on linux-next. > > 2. Testing > > This patch-set has been tested on a Juno-r2 and a Pixel4. Two types > of tests were done: energy testing, and performance testing. > > The energy testing was done with 2 sets of tasks: > - homogeneous tasks (#Tasks at 5% utilization and 16ms period) > - heterogeneous tasks (#Tasks at 5|10|15% utilization and 16ms period). >   If a test has 3 tasks, then there is one with each utilization >   (1 at 5%, 1 at 10%, 1 at 15%). > Tasks spawn on the biggest CPU(s) of the platform. If there are > multiple big CPUs, tasks spawn alternatively on big CPUs. > > 2.1. Juno-r2 testing > > The Juno-r2 has 6 CPUs: > - 4 little [0, 3-5], max_capa=383 > - 2 big [1-2], max_capa=1024 > Base kernel is v5.17-rc5. > > 2.1.1. Energy testing > > The tests were done on: > - a system using a DT and the scmi cpufreq driver. Comparison >   is done between no-EAS and EAS. > - a system using ACPI and the cppc cpufreq driver. Comparison >   is done between CPPC-no-EAS and CPPC-EAS. CPPC-EAS uses >   the artificial EM. > > Energy numbers come from the Juno energy counter, by summing > little and big clusters energy spending. There has been 5 iterations > of each test. Lower energy spending is better. > > 2.1.1.1. Homogeneous tasks > > Energy results (Joules): > +--------+-------------------+-----------------------------+ > |        |            no-EAS |                         EAS | > +--------+---------+---------+-------------------+---------+ > | #Tasks |    Mean | ci(+/-) |              Mean | ci(+/-) | > +--------+---------+---------+-------------------+---------+ > |    10  |   7.89  |    0.26 |     6.99 (-11.36) |    0.49 | > |    20  |  13.42  |    0.32 |    13.42 ( -0.02) |    0.08 | > |    30  |  21.43  |    0.98 |    21.62 ( +0.87) |    0.63 | > |    40  |  30.03  |    0.82 |    30.31 ( +0.94) |    0.37 | > |    50  |  43.19  |    0.56 |    43.50 ( +0.72) |    0.52 | > +--------+---------+---------+-------------------+---------+ > +--------+-------------------+-----------------------------+ > |        |       CPPC-no-EAS |                    CPPC-EAS | > +--------+---------+---------+-------------------+---------+ > | #Tasks |    Mean | ci(+/-) |              Mean | ci(+/-) | > +--------+---------+---------+-------------------+---------+ > |    10  |    7.86 |    0.37 |     5.64 (-28.23) |    0.05 | > |    20  |   13.36 |    0.20 |    10.92 (-18.31) |    0.31 | > |    30  |   19.28 |    0.34 |    18.30 ( -5.07) |    0.64 | > |    40  |   28.33 |    0.59 |    27.13 ( -4.23) |    0.42 | > |    50  |   40.78 |    0.58 |    40.77 ( -0.04) |    0.45 | > +--------+---------+---------+-------------------+---------+ > > Missed activations were measured while comparing CPPC-no-EAS/CPPC-EAS > energy values. They were of 0.00% for all tests and both > configurations. Missed activations start to appear in a significant > number starting from ~70 tasks. > > 2.1.1.2. Heterogeneous tasks > > Energy results (Joules): > +--------+-------------------+-----------------------------+ > |        |            no-EAS |                         EAS | > +--------+---------+---------+-------------------+---------+ > | #Tasks |    Mean | ci(+/-) |              Mean | ci(+/-) | > +--------+---------+---------+-------------------+---------+ > |     3  |    5.25 |    0.50 |    4.58 (-12.82%) |    0.07 | > |     9  |   12.30 |    0.28 |   11.45 ( -6.97%) |    0.34 | > |    15  |   20.06 |    1.32 |   20.60 (  2.66%) |    1.00 | > |    21  |   30.03 |    0.63 |   30.07 (  0.12%) |    0.41 | > +--------+---------+---------+-------------------+---------+ > +--------+-------------------+-----------------------------+ > |        |       CPPC-no-EAS |                    CPPC-EAS | > +--------+---------+---------+-------------------+---------+ > | #Tasks |    Mean | ci(+/-) |              Mean | ci(+/-) | > +--------+---------+---------+-------------------+---------+ > |     3  |    4.58 |    0.31 |    3.65 (-20.31%) |    0.05 | > |     9  |   11.53 |    0.20 |    9.23 (-19.97%) |    0.22 | > |    15  |   19.19 |    0.16 |   18.33 ( -4.49%) |    0.71 | > |    21  |   29.07 |    0.29 |   29.06 ( -0.01%) |    0.08 | > +--------+---------+---------+-------------------+---------+ > > Missed activations were measured while comparing CPPC-no-EAS/CPPC-EAS > energy values. They were of 0.00% for all tests and both > configurations. Missed activations start to appear in a significant > number starting from ~36 tasks. > > 2.1.1.3. Analysis: > > The artificial EM often shows better energy gains than the EM, > especially for small loads. Indeed, the artificial power values > show a huge energy gain by placing tasks on little CPUs. The 6% > margin is always reached, so tasks are easily placed on little > CPUs. The margin is not always reached with real power values, > leading to tasks staying on big CPUs. > > 2.1.2. Performance testing > > 10 iterations of HackBench with the "--pipe --thread" options and > 1000 loops. Compared value is the testing time in seconds. A lower > timing is better. > +----------------+-------------------+---------------------------+ > |                |       CPPC-no-EAS |                  CPPC-EAS | > +--------+-------+---------+---------+-----------------+---------+ > | Groups | Tasks |    Mean | ci(+/-) |           Mean  | ci(+/-) | > +--------+-------+---------+---------+-----------------+---------+ > |      1 |    40 |    2.39 |    0.19 |   2.39 (-0.24%) |    0.07 | > |      2 |    80 |    5.56 |    0.48 |   5.28 (-5.02%) |    0.42 | > |      4 |   160 |   12.15 |    0.84 |  12.06 (-0.80%) |    0.48 | > |      8 |   320 |   23.03 |    0.94 |  23.12 (+0.36%) |    0.70 | > +--------+-------+---------+---------+-----------------+---------+ > > The performance is overall sligthly better, but stays in the margin > or error. > > > 2.2. Pixel4 testing > > Pixel4 has 7 CPUs: > - 4 little [0-3], max_capa=261 > - 3 medium [4-6], max_capa=861 > - 1 big [7], max_capa=1024 > > Base kernel is android-10.0.0_r0.81. The performance states advertised > in the DT were modified with performance states that would be generated > by this patch-set. > The artificial EM was set such as little CPUs > medium CPUs > big CPU, > meaning little CPUs are the most energy efficient. > Comparing the power/capacity ratio, little CPUs' performance states are > all more energy efficient than the medium CPUs' performance states. > This is wrong when comparing medium and big CPUs. > > 2.2.1. Energy testing > > The 2 sets of tests (heterogeneous/homogeneous) were tested while > registering battery voltage and current (power is obtained by > multiplying them). > Voltage is averaged over a rolling period of ~11s and current over a > period of ~6s. Usb-C cable is plugged in but alimentation is cut. > Pixel4 is on airplane mode. The tests lasts 120s, the first 50s and > last 10s are trimmed as the power is slowly raising to reach a > plateau. > Are compared: > - android with EAS (but NO_FIND_BEST_TARGET is set): >   echo ENERGY_AWARE > /sys/kernel/debug/sched_features >   echo NO_FIND_BEST_TARGET > /sys/kernel/debug/sched_features > - android without EAS: >   echo NO_ENERGY_AWARE > /sys/kernel/debug/sched_features > - android with the artificial energy model > Lower energy spending is better. > > 2.2.1.2. Homogeneous tasks > > Energy results (in uW): > +--------+-------------------+-----------------------------+ > |        |       Without EAS |                    With EAS | > +--------+---------+---------+-------------------+---------+ > | #Tasks |    Mean | ci(+/-) |              Mean | ci(+/-) | > +--------+---------+---------+-------------------+---------+ > |    10  | 6.21+05 | 3.12+02 | 5.09+05 (-18.01%) | 2.18+03 | > |    20  | 9.12+05 | 9.71+02 | 7.91+05 (-13.26%) | 9.92+02 | > |    30  | 1.25+06 | 2.02+03 | 1.09+06 (-12.12%) | 2.00+03 | > |    40  | 2.05+06 | 5.15+03 | 1.38+06 (-32.36%) | 1.21+03 | > |    50  | 3.03+06 | 6.94+03 | 1.89+06 (-37.44%) | 3.21+03 | > +--------+---------+---------+-------------------+---------+ > +--------+-------------------+-----------------------------+ > |        |       Without EAS |                  With patch | > +--------+---------+---------+-------------------+---------+ > | #Tasks |    Mean | ci(+/-) |              Mean | ci(+/-) | > +--------+---------+---------+-------------------+---------+ > |    10  | 6.21+05 | 3.12+02 | 4.39+05 (-29.29%) | 5.63+02 | > |    20  | 9.12+05 | 9.71+02 | 7.30+05 (-19.90%) | 1.98+03 | > |    30  | 1.25+06 | 2.02+03 | 1.01+06 (-18.60%) | 1.72+03 | > |    40  | 2.05+06 | 5.15+03 | 1.38+06 (-32.60%) | 3.93+03 | > |    50  | 3.03+06 | 6.94+03 | 2.05+06 (-32.08%) | 1.25+04 | > +--------+---------+---------+-------------------+---------+ > > 2.2.1.2. Heterogeneous tasks > > Energy results (in uW): > +--------+-------------------+-----------------------------+ > |        |       Without EAS |                    With EAS | > +--------+---------+---------+-------------------+---------+ > | #Tasks |    Mean | ci(+/-) |              Mean | ci(+/-) | > +--------+---------+---------+-------------------+---------+ > |     3  | 5.14+05 | 1.06+03 | 3.76+05 (-26.82%) | 4.58+02 | > |     9  | 8.52+05 | 1.18+03 | 7.25+05 (-14.96%) | 1.39+03 | > |    15  | 1.42+06 | 3.14+03 | 1.20+06 (-15.41%) | 1.06+04 | > |    21  | 2.73+06 | 3.49+03 | 1.49+06 (-45.47%) | 3.43+03 | > |    27  | 3.17+06 | 6.92+03 | 2.42+06 (-23.77%) | 8.43+03 | > +--------+---------+---------+-------------------+---------+ > +--------+-------------------+-----------------------------+ > |        |       Without EAS |                  With patch | > +--------+---------+---------+-------------------+---------+ > | #Tasks |    Mean | ci(+/-) |              Mean | ci(+/-) | > +--------+---------+---------+-------------------+---------+ > |     3  | 5.14+05 | 1.06+03 | 3.82+05 (-25.70%) | 7.67+02 | > |     9  | 8.52+05 | 1.18+03 | 7.05+05 (-17.30%) | 9.79+02 | > |    15  | 1.42+06 | 3.14+03 | 1.05+06 (-26.00%) | 1.15+03 | > |    21  | 2.73+06 | 3.49+03 | 1.53+06 (-43.68%) | 2.23+03 | > |    27  | 3.17+06 | 6.92+03 | 2.86+06 ( -9.77%) | 4.26+03 | > +--------+---------+---------+-------------------+---------+ > > 2.2.1.2. Analysis > > Similarly to Juno, the artificial performance states show a huge > gain to place tasks on small CPUs, leading to better energy results. > > 2.2.2. Performance testing > > 10 iterations of PcMark. Compared value is the final score > (PcmaWorkv3Score). A bigger score is better. > +----------------+-------------------------+-------------------------+ > |    Without EAS |                With EAS |              With patch | > +------+---------+---------------+---------+---------------+---------+ > | Mean | ci(+/-) |          Mean | ci(+/-) |          Mean | ci(+/-) | > +------+---------+---------------+---------+---------------+---------+ > | 8026 |      86 |          8003 |      74 | 7840 (-2.00%) |     104 | > +------+---------+---------------+---------+---------------+---------+ > > Performance is lower, but still in the margin of error. > > > 3. Summary > > The artificial performance states show overall better energy results > and a small performance decrease. They lead to a more aggressive task > placement on the most energy efficient CPUs, and this explains the > results. > > Pierre Gondois (3): >   cpufreq: CPPC: Add cppc_cpufreq_search_cpu_data >   cpufreq: CPPC: Add per_cpu efficiency_class >   cpufreq: CPPC: Register EM based on efficiency class information > >  arch/arm64/kernel/smp.c        |   1 + >  drivers/cpufreq/cppc_cpufreq.c | 201 +++++++++++++++++++++++++++++++++ >  2 files changed, 202 insertions(+) > > -- > 2.25.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > 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 D71D6C433EF for ; Thu, 7 Apr 2022 10:03:50 +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-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=2p5bpui/DaiTER6ftVY7qw6e7+3P8KBPRkziaBTUP88=; b=TVFdMMOn65Xafr GgDIJRgaCmTrthcLozfY4VoBQ0xBe0n9rb73KLxYOTV+hLH4Sj/l4Hhtt1Aze6A+OwsyxmzoH89Xv U3z0hvG/YeM2DWxwpQTgFbIBkDhiqMrcm8Rp/KxH7EgB6LBw/gL2TpU2Lb4ZSu8Edyy9s7zG37l53 DNC1NRZ55PHYp/2b9nafi/d+claBQ25crz3cPKrD0HiZHcQ+1KU6r6z6rg5Ruc2Wspw4Jxfrdn2tE +PpjBku4NUnMSGJO0byeFHbKZPa1D8lcr71xrveCRlGRKkwg9TackP9r6bYW3OAHs7ZPp741o1zRP RFKM5P8h4CD/s/eYBjsg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ncOxt-00B5n2-PF; Thu, 07 Apr 2022 10:02:10 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ncOwE-00B4xW-9Y for linux-arm-kernel@lists.infradead.org; Thu, 07 Apr 2022 10:00:29 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 88E0023A; Thu, 7 Apr 2022 03:00:22 -0700 (PDT) Received: from [10.34.129.54] (e126645.nice.arm.com [10.34.129.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B8B863F5A1; Thu, 7 Apr 2022 03:00:18 -0700 (PDT) Message-ID: <9130656b-e485-6391-7fa5-6fb88091e5fc@arm.com> Date: Thu, 7 Apr 2022 12:00:43 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 Subject: Re: [PATCH v2 0/3] Enable EAS for CPPC/ACPI based systems Content-Language: en-US To: Itaru Kitayama Cc: Ard Biesheuvel , Catalin Marinas , Dietmar.Eggemann@arm.com, Fuad Tabba , Ionela.Voinescu@arm.com, Lee Jones , Lukasz.Luba@arm.com, Mark Rutland , Morten.Rasmussen@arm.com, "Rafael J. Wysocki" , Rob Herring , Sudeep Holla , Viresh Kumar , Will Deacon , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, maz@kernel.org References: <20220407081620.1662192-1-pierre.gondois@arm.com> From: Pierre Gondois In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220407_030026_496951_CDEF5004 X-CRM114-Status: GOOD ( 35.70 ) 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGVsbG8sCgpUaGUgZm9sbG93aW5nIGJyYW5jaCBjb250YWlucyBhbGwgdGhlIHJlcXVpcmVkIHBh dGNoZXM6Cmh0dHBzOi8vZ2l0bGFiLmFybS5jb20vbGludXgtYXJtL2xpbnV4LXBnLy0vdHJlZS9w Zy9lYXNfYWNwaV92MgoKUmVnYXJkcywKUGllcnJlCgpPbiA0LzcvMjIgMTE6MzYsIEl0YXJ1IEtp dGF5YW1hIHdyb3RlOgo+IERvIHlvdSBoYXBwZW4gdG8gaGF2ZSB5b3VyIG93biBkZXYgZ2l0IHRy ZWUgdGhhdCDCoGhhcyB0aGlzIHNlcmllcz8KPiAKPiBJdGFydS4KPiAKPiBPbiBUaHUsIEFwciA3 LCAyMDIyIGF0IDE3OjU0IFBpZXJyZSBHb25kb2lzIDxwaWVycmUuZ29uZG9pc0Bhcm0uY29tIDxt YWlsdG86cGllcnJlLmdvbmRvaXNAYXJtLmNvbT4+IHdyb3RlOgo+IAo+ICAgICBGcm9tOiBQaWVy cmUgR29uZG9pcyA8UGllcnJlLkdvbmRvaXNAYXJtLmNvbSA8bWFpbHRvOlBpZXJyZS5Hb25kb2lz QGFybS5jb20+Pgo+IAo+ICAgICB2MjoKPiAgICAgLSBSZW1vdmUgaW5saW5lIGhpbnQgb2YgY3Bw Y19jcHVmcmVxX3NlYXJjaF9jcHVfZGF0YSgpLiBbTWFya10KPiAgICAgLSBVc2UgRVhQT1JUX1NZ TUJPTF9HUEwoKSBpbnN0ZWFkIG9mIEVYUE9SVF9TWU1CT0woKS4gW01hcmtdCj4gICAgIC0gVXNl IGEgYml0bWFwIHRvIHNxdWVlemUgQ1BVIGVmZmljaWVuY3kgY2xhc3MgdmFsdWVzLiBbTWFya10K PiAKPiAgICAgMC4gT3ZlcnZpZXcKPiAKPiAgICAgVGhlIGN1cnJlbnQgRW5lcmd5IE1vZGVsIChF TSkgZm9yIENQVXMgcmVxdWlyZXMga25vd2xlZGdlIGFib3V0IENQVQo+ICAgICBwZXJmb3JtYW5j ZSBzdGF0ZXMgYW5kIHRoZWlyIHBvd2VyIGNvbnN1bXB0aW9uLiBCb3RoIG9mIHRoZXNlCj4gICAg IGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIEFDUEkgYmFzZWQgc3lzdGVtcy4KPiAK PiAgICAgSW4gQUNQSSwgZGVzY3JpYmluZyBwb3dlciBlZmZpY2llbmN5IG9mIENQVXMgY2FuIGJl IGRvbmUgdGhyb3VnaCB0aGUKPiAgICAgZm9sbG93aW5nIGFybSBzcGVjaWZpYyBmaWVsZDoKPiAK PiAgICAgQUNQSSA2LjQsIHM1LjIuMTIuMTQgIkdJQyBDUFUgSW50ZXJmYWNlIChHSUNDKSBTdHJ1 Y3R1cmUiLAo+ICAgICAiUHJvY2Vzc29yIFBvd2VyIEVmZmljaWVuY3kgQ2xhc3MgZmllbGQiOgo+ ICAgICBEZXNjcmliZXMgdGhlIHJlbGF0aXZlIHBvd2VyIGVmZmljaWVuY3kgb2YgdGhlIGFzc29j aWF0ZWQgcHJvLQo+ICAgICBjZXNzb3IuIExvd2VyIGVmZmljaWVuY3kgY2xhc3MgbnVtYmVycyBh cmUgbW9yZSBlZmZpY2llbnQgdGhhbgo+ICAgICBoaWdoZXIgb25lcyAoZS5nLiBlZmZpY2llbmN5 IGNsYXNzIDAgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgbW9yZQo+ICAgICBlZmZpY2llbnQgdGhhbiBl ZmZpY2llbmN5IGNsYXNzIDEpLiBIb3dldmVyLCBhYnNvbHV0ZSB2YWx1ZXMKPiAgICAgb2YgdGhp cyBudW1iZXIgaGF2ZSBubyBtZWFuaW5nOiAyIGlzbid0IG5lY2Vzc2FyaWx5IGhhbGYgYXMKPiAg ICAgZWZmaWNpZW50IGFzIDEuCj4gCj4gICAgIEFkZCBhbiAnZWZmaWNpZW5jeV9jbGFzcycgZmll bGQgdG8gZGVzY3JpYmUgdGhlIHJlbGF0aXZlIHBvd2VyCj4gICAgIGVmZmljaWVuY3kgb2YgQ1BV cy4gQ1BVcyByZWx5aW5nIG9uIHRoaXMgZmllbGQgd2lsbCBoYXZlIHBlcmZvcm1hbmNlCj4gICAg IHN0YXRlcyAocG93ZXIgYW5kIGZyZXF1ZW5jeSB2YWx1ZXMpIGFydGlmaWNpYWxseSBjcmVhdGVk LiBTdWNoIEVNIHdpbGwKPiAgICAgYmUgcmVmZXJyZWQgdG8gYXMgYW4gYXJ0aWZpY2lhbCBFTS4K PiAKPiAgICAgVGhlIGFydGlmaWNpYWwgRU0gaXMgdXNlZCBmb3IgdGhlIENQUEMgZHJpdmVyLgo+ IAo+ICAgICAxLiBEZXBlbmRlbmNpZXMKPiAKPiAgICAgVGhpcyBwYXRjaC1zZXQgaGFzIGEgZGVw ZW5kZW5jeSBvbjoKPiAgICAgIMKgLSBbMC84XSBJbnRyb2R1Y2Ugc3VwcG9ydCBmb3IgYXJ0aWZp Y2lhbCBFbmVyZ3kgTW9kZWwKPiAgICAgaHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMjIvMy8xNi84 NTAgPGh0dHBzOi8vbGttbC5vcmcvbGttbC8yMDIyLzMvMTYvODUwPgo+ICAgICBpbnRyb2R1Y2Vz IGEgbmV3IGNhbGxiYWNrIGluIHRoZSBFbmVyZ3kgTW9kZWwgKEVNKSBhbmQgcHJldmVudHMgdGhl Cj4gICAgIHJlZ2lzdHJhdGlvbiBvZiBkZXZpY2VzIHVzaW5nIHBvd2VyIHZhbHVlcyBmcm9tIGFu IEVNIHdoZW4gdGhlIEVNCj4gICAgIGlzIGFydGlmaWNpYWwuIE5vdCBoYXZpbmcgdGhpcyBwYXRj aC1zZXQgd291bGQgYnJlYWsgYnVpbGRzLgo+ICAgICAgwqAtIFRoaXMgcGF0Y2gtc2V0IGJhc2Vk IG9uIGxpbnV4LW5leHQuCj4gCj4gICAgIDIuIFRlc3RpbmcKPiAKPiAgICAgVGhpcyBwYXRjaC1z ZXQgaGFzIGJlZW4gdGVzdGVkIG9uIGEgSnVuby1yMiBhbmQgYSBQaXhlbDQuIFR3byB0eXBlcwo+ ICAgICBvZiB0ZXN0cyB3ZXJlIGRvbmU6IGVuZXJneSB0ZXN0aW5nLCBhbmQgcGVyZm9ybWFuY2Ug dGVzdGluZy4KPiAKPiAgICAgVGhlIGVuZXJneSB0ZXN0aW5nIHdhcyBkb25lIHdpdGggMiBzZXRz IG9mIHRhc2tzOgo+ICAgICAtIGhvbW9nZW5lb3VzIHRhc2tzICgjVGFza3MgYXQgNSUgdXRpbGl6 YXRpb24gYW5kIDE2bXMgcGVyaW9kKQo+ICAgICAtIGhldGVyb2dlbmVvdXMgdGFza3MgKCNUYXNr cyBhdCA1fDEwfDE1JSB1dGlsaXphdGlvbiBhbmQgMTZtcyBwZXJpb2QpLgo+ICAgICAgwqAgSWYg YSB0ZXN0IGhhcyAzIHRhc2tzLCB0aGVuIHRoZXJlIGlzIG9uZSB3aXRoIGVhY2ggdXRpbGl6YXRp b24KPiAgICAgIMKgICgxIGF0IDUlLCAxIGF0IDEwJSwgMSBhdCAxNSUpLgo+ICAgICBUYXNrcyBz cGF3biBvbiB0aGUgYmlnZ2VzdCBDUFUocykgb2YgdGhlIHBsYXRmb3JtLiBJZiB0aGVyZSBhcmUK PiAgICAgbXVsdGlwbGUgYmlnIENQVXMsIHRhc2tzIHNwYXduIGFsdGVybmF0aXZlbHkgb24gYmln IENQVXMuCj4gCj4gICAgIDIuMS4gSnVuby1yMiB0ZXN0aW5nCj4gCj4gICAgIFRoZSBKdW5vLXIy IGhhcyA2IENQVXM6Cj4gICAgIC0gNCBsaXR0bGUgWzAsIDMtNV0sIG1heF9jYXBhPTM4Mwo+ICAg ICAtIDIgYmlnIFsxLTJdLCBtYXhfY2FwYT0xMDI0Cj4gICAgIEJhc2Uga2VybmVsIGlzIHY1LjE3 LXJjNS4KPiAKPiAgICAgMi4xLjEuIEVuZXJneSB0ZXN0aW5nCj4gCj4gICAgIFRoZSB0ZXN0cyB3 ZXJlIGRvbmUgb246Cj4gICAgIC0gYSBzeXN0ZW0gdXNpbmcgYSBEVCBhbmQgdGhlIHNjbWkgY3B1 ZnJlcSBkcml2ZXIuIENvbXBhcmlzb24KPiAgICAgIMKgIGlzIGRvbmUgYmV0d2VlbiBuby1FQVMg YW5kIEVBUy4KPiAgICAgLSBhIHN5c3RlbSB1c2luZyBBQ1BJIGFuZCB0aGUgY3BwYyBjcHVmcmVx IGRyaXZlci4gQ29tcGFyaXNvbgo+ICAgICAgwqAgaXMgZG9uZSBiZXR3ZWVuIENQUEMtbm8tRUFT IGFuZCBDUFBDLUVBUy4gQ1BQQy1FQVMgdXNlcwo+ICAgICAgwqAgdGhlIGFydGlmaWNpYWwgRU0u Cj4gCj4gICAgIEVuZXJneSBudW1iZXJzIGNvbWUgZnJvbSB0aGUgSnVubyBlbmVyZ3kgY291bnRl ciwgYnkgc3VtbWluZwo+ICAgICBsaXR0bGUgYW5kIGJpZyBjbHVzdGVycyBlbmVyZ3kgc3BlbmRp bmcuIFRoZXJlIGhhcyBiZWVuIDUgaXRlcmF0aW9ucwo+ICAgICBvZiBlYWNoIHRlc3QuIExvd2Vy IGVuZXJneSBzcGVuZGluZyBpcyBiZXR0ZXIuCj4gCj4gICAgIDIuMS4xLjEuIEhvbW9nZW5lb3Vz IHRhc2tzCj4gCj4gICAgIEVuZXJneSByZXN1bHRzIChKb3VsZXMpOgo+ICAgICArLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPiAgICAg fMKgIMKgIMKgIMKgIHzCoCDCoCDCoCDCoCDCoCDCoCBuby1FQVMgfMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgRUFTIHwKPiAgICAgKy0tLS0tLS0tKy0tLS0tLS0tLSstLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCj4gICAgIHwgI1Rhc2tzIHzCoCDC oCBNZWFuIHwgY2koKy8tKSB8wqAgwqAgwqAgwqAgwqAgwqAgwqAgTWVhbiB8IGNpKCsvLSkgfAo+ ICAgICArLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLSsKPiAgICAgfMKgIMKgIDEwwqAgfMKgIMKgNy44OcKgIHzCoCDCoCAwLjI2IHzCoCDC oCDCoDYuOTkgKC0xMS4zNikgfMKgIMKgIDAuNDkgfAo+ICAgICB8wqAgwqAgMjDCoCB8wqAgMTMu NDLCoCB8wqAgwqAgMC4zMiB8wqAgwqAgMTMuNDIgKCAtMC4wMikgfMKgIMKgIDAuMDggfAo+ICAg ICB8wqAgwqAgMzDCoCB8wqAgMjEuNDPCoCB8wqAgwqAgMC45OCB8wqAgwqAgMjEuNjIgKCArMC44 NykgfMKgIMKgIDAuNjMgfAo+ICAgICB8wqAgwqAgNDDCoCB8wqAgMzAuMDPCoCB8wqAgwqAgMC44 MiB8wqAgwqAgMzAuMzEgKCArMC45NCkgfMKgIMKgIDAuMzcgfAo+ICAgICB8wqAgwqAgNTDCoCB8 wqAgNDMuMTnCoCB8wqAgwqAgMC41NiB8wqAgwqAgNDMuNTAgKCArMC43MikgfMKgIMKgIDAuNTIg fAo+ICAgICArLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLSsKPiAgICAgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4gICAgIHzCoCDCoCDCoCDCoCB8wqAgwqAgwqAgwqBDUFBD LW5vLUVBUyB8wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgQ1BQQy1FQVMgfAo+ICAgICAr LS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LSsKPiAgICAgfCAjVGFza3MgfMKgIMKgIE1lYW4gfCBjaSgrLy0pIHzCoCDCoCDCoCDCoCDCoCDC oCDCoCBNZWFuIHwgY2koKy8tKSB8Cj4gICAgICstLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwo+ICAgICB8wqAgwqAgMTDCoCB8wqAgwqAg Ny44NiB8wqAgwqAgMC4zNyB8wqAgwqAgwqA1LjY0ICgtMjguMjMpIHzCoCDCoCAwLjA1IHwKPiAg ICAgfMKgIMKgIDIwwqAgfMKgIMKgMTMuMzYgfMKgIMKgIDAuMjAgfMKgIMKgIDEwLjkyICgtMTgu MzEpIHzCoCDCoCAwLjMxIHwKPiAgICAgfMKgIMKgIDMwwqAgfMKgIMKgMTkuMjggfMKgIMKgIDAu MzQgfMKgIMKgIDE4LjMwICggLTUuMDcpIHzCoCDCoCAwLjY0IHwKPiAgICAgfMKgIMKgIDQwwqAg fMKgIMKgMjguMzMgfMKgIMKgIDAuNTkgfMKgIMKgIDI3LjEzICggLTQuMjMpIHzCoCDCoCAwLjQy IHwKPiAgICAgfMKgIMKgIDUwwqAgfMKgIMKgNDAuNzggfMKgIMKgIDAuNTggfMKgIMKgIDQwLjc3 ICggLTAuMDQpIHzCoCDCoCAwLjQ1IHwKPiAgICAgKy0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCj4gCj4gICAgIE1pc3NlZCBhY3RpdmF0 aW9ucyB3ZXJlIG1lYXN1cmVkIHdoaWxlIGNvbXBhcmluZyBDUFBDLW5vLUVBUy9DUFBDLUVBUwo+ ICAgICBlbmVyZ3kgdmFsdWVzLiBUaGV5IHdlcmUgb2YgMC4wMCUgZm9yIGFsbCB0ZXN0cyBhbmQg Ym90aAo+ICAgICBjb25maWd1cmF0aW9ucy4gTWlzc2VkIGFjdGl2YXRpb25zIHN0YXJ0IHRvIGFw cGVhciBpbiBhIHNpZ25pZmljYW50Cj4gICAgIG51bWJlciBzdGFydGluZyBmcm9tIH43MCB0YXNr cy4KPiAKPiAgICAgMi4xLjEuMi4gSGV0ZXJvZ2VuZW91cyB0YXNrcwo+IAo+ICAgICBFbmVyZ3kg cmVzdWx0cyAoSm91bGVzKToKPiAgICAgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4gICAgIHzCoCDCoCDCoCDCoCB8wqAgwqAgwqAg wqAgwqAgwqAgbm8tRUFTIHzCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoEVB UyB8Cj4gICAgICstLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tKwo+ICAgICB8ICNUYXNrcyB8wqAgwqAgTWVhbiB8IGNpKCsvLSkgfMKgIMKg IMKgIMKgIMKgIMKgIMKgIE1lYW4gfCBjaSgrLy0pIHwKPiAgICAgKy0tLS0tLS0tKy0tLS0tLS0t LSstLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCj4gICAgIHzCoCDCoCDC oDPCoCB8wqAgwqAgNS4yNSB8wqAgwqAgMC41MCB8wqAgwqAgNC41OCAoLTEyLjgyJSkgfMKgIMKg IDAuMDcgfAo+ICAgICB8wqAgwqAgwqA5wqAgfMKgIMKgMTIuMzAgfMKgIMKgIDAuMjggfMKgIMKg MTEuNDUgKCAtNi45NyUpIHzCoCDCoCAwLjM0IHwKPiAgICAgfMKgIMKgIDE1wqAgfMKgIMKgMjAu MDYgfMKgIMKgIDEuMzIgfMKgIMKgMjAuNjAgKMKgIDIuNjYlKSB8wqAgwqAgMS4wMCB8Cj4gICAg IHzCoCDCoCAyMcKgIHzCoCDCoDMwLjAzIHzCoCDCoCAwLjYzIHzCoCDCoDMwLjA3ICjCoCAwLjEy JSkgfMKgIMKgIDAuNDEgfAo+ICAgICArLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKPiAgICAgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4gICAgIHzCoCDCoCDCoCDCoCB8 wqAgwqAgwqAgwqBDUFBDLW5vLUVBUyB8wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgQ1BQ Qy1FQVMgfAo+ICAgICArLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLSsKPiAgICAgfCAjVGFza3MgfMKgIMKgIE1lYW4gfCBjaSgrLy0pIHzC oCDCoCDCoCDCoCDCoCDCoCDCoCBNZWFuIHwgY2koKy8tKSB8Cj4gICAgICstLS0tLS0tLSstLS0t LS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwo+ICAgICB8wqAg wqAgwqAzwqAgfMKgIMKgIDQuNTggfMKgIMKgIDAuMzEgfMKgIMKgIDMuNjUgKC0yMC4zMSUpIHzC oCDCoCAwLjA1IHwKPiAgICAgfMKgIMKgIMKgOcKgIHzCoCDCoDExLjUzIHzCoCDCoCAwLjIwIHzC oCDCoCA5LjIzICgtMTkuOTclKSB8wqAgwqAgMC4yMiB8Cj4gICAgIHzCoCDCoCAxNcKgIHzCoCDC oDE5LjE5IHzCoCDCoCAwLjE2IHzCoCDCoDE4LjMzICggLTQuNDklKSB8wqAgwqAgMC43MSB8Cj4g ICAgIHzCoCDCoCAyMcKgIHzCoCDCoDI5LjA3IHzCoCDCoCAwLjI5IHzCoCDCoDI5LjA2ICggLTAu MDElKSB8wqAgwqAgMC4wOCB8Cj4gICAgICstLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwo+IAo+ICAgICBNaXNzZWQgYWN0aXZhdGlvbnMg d2VyZSBtZWFzdXJlZCB3aGlsZSBjb21wYXJpbmcgQ1BQQy1uby1FQVMvQ1BQQy1FQVMKPiAgICAg ZW5lcmd5IHZhbHVlcy4gVGhleSB3ZXJlIG9mIDAuMDAlIGZvciBhbGwgdGVzdHMgYW5kIGJvdGgK PiAgICAgY29uZmlndXJhdGlvbnMuIE1pc3NlZCBhY3RpdmF0aW9ucyBzdGFydCB0byBhcHBlYXIg aW4gYSBzaWduaWZpY2FudAo+ICAgICBudW1iZXIgc3RhcnRpbmcgZnJvbSB+MzYgdGFza3MuCj4g Cj4gICAgIDIuMS4xLjMuIEFuYWx5c2lzOgo+IAo+ICAgICBUaGUgYXJ0aWZpY2lhbCBFTSBvZnRl biBzaG93cyBiZXR0ZXIgZW5lcmd5IGdhaW5zIHRoYW4gdGhlIEVNLAo+ICAgICBlc3BlY2lhbGx5 IGZvciBzbWFsbCBsb2Fkcy4gSW5kZWVkLCB0aGUgYXJ0aWZpY2lhbCBwb3dlciB2YWx1ZXMKPiAg ICAgc2hvdyBhIGh1Z2UgZW5lcmd5IGdhaW4gYnkgcGxhY2luZyB0YXNrcyBvbiBsaXR0bGUgQ1BV cy4gVGhlIDYlCj4gICAgIG1hcmdpbiBpcyBhbHdheXMgcmVhY2hlZCwgc28gdGFza3MgYXJlIGVh c2lseSBwbGFjZWQgb24gbGl0dGxlCj4gICAgIENQVXMuIFRoZSBtYXJnaW4gaXMgbm90IGFsd2F5 cyByZWFjaGVkIHdpdGggcmVhbCBwb3dlciB2YWx1ZXMsCj4gICAgIGxlYWRpbmcgdG8gdGFza3Mg c3RheWluZyBvbiBiaWcgQ1BVcy4KPiAKPiAgICAgMi4xLjIuIFBlcmZvcm1hbmNlIHRlc3RpbmcK PiAKPiAgICAgMTAgaXRlcmF0aW9ucyBvZiBIYWNrQmVuY2ggd2l0aCB0aGUgIi0tcGlwZSAtLXRo cmVhZCIgb3B0aW9ucyBhbmQKPiAgICAgMTAwMCBsb29wcy4gQ29tcGFyZWQgdmFsdWUgaXMgdGhl IHRlc3RpbmcgdGltZSBpbiBzZWNvbmRzLiBBIGxvd2VyCj4gICAgIHRpbWluZyBpcyBiZXR0ZXIu Cj4gICAgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tKwo+ICAgICB8wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfMKgIMKgIMKg IMKgQ1BQQy1uby1FQVMgfMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIENQUEMtRUFTIHwKPiAg ICAgKy0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0rCj4gICAgIHwgR3JvdXBzIHwgVGFza3MgfMKgIMKgIE1lYW4gfCBjaSgrLy0p IHzCoCDCoCDCoCDCoCDCoCDCoE1lYW7CoCB8IGNpKCsvLSkgfAo+ICAgICArLS0tLS0tLS0rLS0t LS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKPiAg ICAgfMKgIMKgIMKgIDEgfMKgIMKgIDQwIHzCoCDCoCAyLjM5IHzCoCDCoCAwLjE5IHzCoCDCoDIu MzkgKC0wLjI0JSkgfMKgIMKgIDAuMDcgfAo+ICAgICB8wqAgwqAgwqAgMiB8wqAgwqAgODAgfMKg IMKgIDUuNTYgfMKgIMKgIDAuNDggfMKgIMKgNS4yOCAoLTUuMDIlKSB8wqAgwqAgMC40MiB8Cj4g ICAgIHzCoCDCoCDCoCA0IHzCoCDCoDE2MCB8wqAgwqAxMi4xNSB8wqAgwqAgMC44NCB8wqAgMTIu MDYgKC0wLjgwJSkgfMKgIMKgIDAuNDggfAo+ICAgICB8wqAgwqAgwqAgOCB8wqAgwqAzMjAgfMKg IMKgMjMuMDMgfMKgIMKgIDAuOTQgfMKgIDIzLjEyICgrMC4zNiUpIHzCoCDCoCAwLjcwIHwKPiAg ICAgKy0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0rCj4gCj4gICAgIFRoZSBwZXJmb3JtYW5jZSBpcyBvdmVyYWxsIHNsaWd0aGx5 IGJldHRlciwgYnV0IHN0YXlzIGluIHRoZSBtYXJnaW4KPiAgICAgb3IgZXJyb3IuCj4gCj4gCj4g ICAgIDIuMi4gUGl4ZWw0IHRlc3RpbmcKPiAKPiAgICAgUGl4ZWw0IGhhcyA3IENQVXM6Cj4gICAg IC0gNCBsaXR0bGUgWzAtM10sIG1heF9jYXBhPTI2MQo+ICAgICAtIDMgbWVkaXVtIFs0LTZdLCBt YXhfY2FwYT04NjEKPiAgICAgLSAxIGJpZyBbN10sIG1heF9jYXBhPTEwMjQKPiAKPiAgICAgQmFz ZSBrZXJuZWwgaXMgYW5kcm9pZC0xMC4wLjBfcjAuODEuIFRoZSBwZXJmb3JtYW5jZSBzdGF0ZXMg YWR2ZXJ0aXNlZAo+ICAgICBpbiB0aGUgRFQgd2VyZSBtb2RpZmllZCB3aXRoIHBlcmZvcm1hbmNl IHN0YXRlcyB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZAo+ICAgICBieSB0aGlzIHBhdGNoLXNldC4K PiAgICAgVGhlIGFydGlmaWNpYWwgRU0gd2FzIHNldCBzdWNoIGFzIGxpdHRsZSBDUFVzID4gbWVk aXVtIENQVXMgPiBiaWcgQ1BVLAo+ICAgICBtZWFuaW5nIGxpdHRsZSBDUFVzIGFyZSB0aGUgbW9z dCBlbmVyZ3kgZWZmaWNpZW50Lgo+ICAgICBDb21wYXJpbmcgdGhlIHBvd2VyL2NhcGFjaXR5IHJh dGlvLCBsaXR0bGUgQ1BVcycgcGVyZm9ybWFuY2Ugc3RhdGVzIGFyZQo+ICAgICBhbGwgbW9yZSBl bmVyZ3kgZWZmaWNpZW50IHRoYW4gdGhlIG1lZGl1bSBDUFVzJyBwZXJmb3JtYW5jZSBzdGF0ZXMu Cj4gICAgIFRoaXMgaXMgd3Jvbmcgd2hlbiBjb21wYXJpbmcgbWVkaXVtIGFuZCBiaWcgQ1BVcy4K PiAKPiAgICAgMi4yLjEuIEVuZXJneSB0ZXN0aW5nCj4gCj4gICAgIFRoZSAyIHNldHMgb2YgdGVz dHMgKGhldGVyb2dlbmVvdXMvaG9tb2dlbmVvdXMpIHdlcmUgdGVzdGVkIHdoaWxlCj4gICAgIHJl Z2lzdGVyaW5nIGJhdHRlcnkgdm9sdGFnZSBhbmQgY3VycmVudCAocG93ZXIgaXMgb2J0YWluZWQg YnkKPiAgICAgbXVsdGlwbHlpbmcgdGhlbSkuCj4gICAgIFZvbHRhZ2UgaXMgYXZlcmFnZWQgb3Zl ciBhIHJvbGxpbmcgcGVyaW9kIG9mIH4xMXMgYW5kIGN1cnJlbnQgb3ZlciBhCj4gICAgIHBlcmlv ZCBvZiB+NnMuIFVzYi1DIGNhYmxlIGlzIHBsdWdnZWQgaW4gYnV0IGFsaW1lbnRhdGlvbiBpcyBj dXQuCj4gICAgIFBpeGVsNCBpcyBvbiBhaXJwbGFuZSBtb2RlLiBUaGUgdGVzdHMgbGFzdHMgMTIw cywgdGhlIGZpcnN0IDUwcyBhbmQKPiAgICAgbGFzdCAxMHMgYXJlIHRyaW1tZWQgYXMgdGhlIHBv d2VyIGlzIHNsb3dseSByYWlzaW5nIHRvIHJlYWNoIGEKPiAgICAgcGxhdGVhdS4KPiAgICAgQXJl IGNvbXBhcmVkOgo+ICAgICAtIGFuZHJvaWQgd2l0aCBFQVMgKGJ1dCBOT19GSU5EX0JFU1RfVEFS R0VUIGlzIHNldCk6Cj4gICAgICDCoCBlY2hvIEVORVJHWV9BV0FSRSA+IC9zeXMva2VybmVsL2Rl YnVnL3NjaGVkX2ZlYXR1cmVzCj4gICAgICDCoCBlY2hvIE5PX0ZJTkRfQkVTVF9UQVJHRVQgPiAv c3lzL2tlcm5lbC9kZWJ1Zy9zY2hlZF9mZWF0dXJlcwo+ICAgICAtIGFuZHJvaWQgd2l0aG91dCBF QVM6Cj4gICAgICDCoCBlY2hvIE5PX0VORVJHWV9BV0FSRSA+IC9zeXMva2VybmVsL2RlYnVnL3Nj aGVkX2ZlYXR1cmVzCj4gICAgIC0gYW5kcm9pZCB3aXRoIHRoZSBhcnRpZmljaWFsIGVuZXJneSBt b2RlbAo+ICAgICBMb3dlciBlbmVyZ3kgc3BlbmRpbmcgaXMgYmV0dGVyLgo+IAo+ICAgICAyLjIu MS4yLiBIb21vZ2VuZW91cyB0YXNrcwo+IAo+ICAgICBFbmVyZ3kgcmVzdWx0cyAoaW4gdVcpOgo+ ICAgICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSsKPiAgICAgfMKgIMKgIMKgIMKgIHzCoCDCoCDCoCDCoFdpdGhvdXQgRUFTIHzCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBXaXRoIEVBUyB8Cj4gICAgICstLS0tLS0tLSstLS0t LS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwo+ICAgICB8ICNU YXNrcyB8wqAgwqAgTWVhbiB8IGNpKCsvLSkgfMKgIMKgIMKgIMKgIMKgIMKgIMKgIE1lYW4gfCBj aSgrLy0pIHwKPiAgICAgKy0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0rCj4gICAgIHzCoCDCoCAxMMKgIHwgNi4yMSswNSB8IDMuMTIrMDIg fCA1LjA5KzA1ICgtMTguMDElKSB8IDIuMTgrMDMgfAo+ICAgICB8wqAgwqAgMjDCoCB8IDkuMTIr MDUgfCA5LjcxKzAyIHwgNy45MSswNSAoLTEzLjI2JSkgfCA5LjkyKzAyIHwKPiAgICAgfMKgIMKg IDMwwqAgfCAxLjI1KzA2IHwgMi4wMiswMyB8IDEuMDkrMDYgKC0xMi4xMiUpIHwgMi4wMCswMyB8 Cj4gICAgIHzCoCDCoCA0MMKgIHwgMi4wNSswNiB8IDUuMTUrMDMgfCAxLjM4KzA2ICgtMzIuMzYl KSB8IDEuMjErMDMgfAo+ICAgICB8wqAgwqAgNTDCoCB8IDMuMDMrMDYgfCA2Ljk0KzAzIHwgMS44 OSswNiAoLTM3LjQ0JSkgfCAzLjIxKzAzIHwKPiAgICAgKy0tLS0tLS0tKy0tLS0tLS0tLSstLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCj4gICAgICstLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICAgICB8wqAg wqAgwqAgwqAgfMKgIMKgIMKgIMKgV2l0aG91dCBFQVMgfMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIFdpdGggcGF0Y2ggfAo+ICAgICArLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKPiAgICAgfCAjVGFza3MgfMKgIMKgIE1lYW4gfCBj aSgrLy0pIHzCoCDCoCDCoCDCoCDCoCDCoCDCoCBNZWFuIHwgY2koKy8tKSB8Cj4gICAgICstLS0t LS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwo+ ICAgICB8wqAgwqAgMTDCoCB8IDYuMjErMDUgfCAzLjEyKzAyIHwgNC4zOSswNSAoLTI5LjI5JSkg fCA1LjYzKzAyIHwKPiAgICAgfMKgIMKgIDIwwqAgfCA5LjEyKzA1IHwgOS43MSswMiB8IDcuMzAr MDUgKC0xOS45MCUpIHwgMS45OCswMyB8Cj4gICAgIHzCoCDCoCAzMMKgIHwgMS4yNSswNiB8IDIu MDIrMDMgfCAxLjAxKzA2ICgtMTguNjAlKSB8IDEuNzIrMDMgfAo+ICAgICB8wqAgwqAgNDDCoCB8 IDIuMDUrMDYgfCA1LjE1KzAzIHwgMS4zOCswNiAoLTMyLjYwJSkgfCAzLjkzKzAzIHwKPiAgICAg fMKgIMKgIDUwwqAgfCAzLjAzKzA2IHwgNi45NCswMyB8IDIuMDUrMDYgKC0zMi4wOCUpIHwgMS4y NSswNCB8Cj4gICAgICstLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tKwo+IAo+ICAgICAyLjIuMS4yLiBIZXRlcm9nZW5lb3VzIHRhc2tzCj4g Cj4gICAgIEVuZXJneSByZXN1bHRzIChpbiB1Vyk6Cj4gICAgICstLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICAgICB8wqAgwqAgwqAg wqAgfMKgIMKgIMKgIMKgV2l0aG91dCBFQVMgfMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IFdpdGggRUFTIHwKPiAgICAgKy0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0rCj4gICAgIHwgI1Rhc2tzIHzCoCDCoCBNZWFuIHwgY2koKy8t KSB8wqAgwqAgwqAgwqAgwqAgwqAgwqAgTWVhbiB8IGNpKCsvLSkgfAo+ICAgICArLS0tLS0tLS0r LS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKPiAgICAg fMKgIMKgIMKgM8KgIHwgNS4xNCswNSB8IDEuMDYrMDMgfCAzLjc2KzA1ICgtMjYuODIlKSB8IDQu NTgrMDIgfAo+ICAgICB8wqAgwqAgwqA5wqAgfCA4LjUyKzA1IHwgMS4xOCswMyB8IDcuMjUrMDUg KC0xNC45NiUpIHwgMS4zOSswMyB8Cj4gICAgIHzCoCDCoCAxNcKgIHwgMS40MiswNiB8IDMuMTQr MDMgfCAxLjIwKzA2ICgtMTUuNDElKSB8IDEuMDYrMDQgfAo+ICAgICB8wqAgwqAgMjHCoCB8IDIu NzMrMDYgfCAzLjQ5KzAzIHwgMS40OSswNiAoLTQ1LjQ3JSkgfCAzLjQzKzAzIHwKPiAgICAgfMKg IMKgIDI3wqAgfCAzLjE3KzA2IHwgNi45MiswMyB8IDIuNDIrMDYgKC0yMy43NyUpIHwgOC40Mysw MyB8Cj4gICAgICstLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tKwo+ICAgICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPiAgICAgfMKgIMKgIMKgIMKgIHzCoCDCoCDCoCDCoFdp dGhvdXQgRUFTIHzCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBXaXRoIHBhdGNoIHwKPiAgICAg Ky0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0rCj4gICAgIHwgI1Rhc2tzIHzCoCDCoCBNZWFuIHwgY2koKy8tKSB8wqAgwqAgwqAgwqAgwqAg wqAgwqAgTWVhbiB8IGNpKCsvLSkgfAo+ICAgICArLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKPiAgICAgfMKgIMKgIMKgM8KgIHwgNS4x NCswNSB8IDEuMDYrMDMgfCAzLjgyKzA1ICgtMjUuNzAlKSB8IDcuNjcrMDIgfAo+ICAgICB8wqAg wqAgwqA5wqAgfCA4LjUyKzA1IHwgMS4xOCswMyB8IDcuMDUrMDUgKC0xNy4zMCUpIHwgOS43OSsw MiB8Cj4gICAgIHzCoCDCoCAxNcKgIHwgMS40MiswNiB8IDMuMTQrMDMgfCAxLjA1KzA2ICgtMjYu MDAlKSB8IDEuMTUrMDMgfAo+ICAgICB8wqAgwqAgMjHCoCB8IDIuNzMrMDYgfCAzLjQ5KzAzIHwg MS41MyswNiAoLTQzLjY4JSkgfCAyLjIzKzAzIHwKPiAgICAgfMKgIMKgIDI3wqAgfCAzLjE3KzA2 IHwgNi45MiswMyB8IDIuODYrMDYgKCAtOS43NyUpIHwgNC4yNiswMyB8Cj4gICAgICstLS0tLS0t LSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwo+IAo+ ICAgICAyLjIuMS4yLiBBbmFseXNpcwo+IAo+ICAgICBTaW1pbGFybHkgdG8gSnVubywgdGhlIGFy dGlmaWNpYWwgcGVyZm9ybWFuY2Ugc3RhdGVzIHNob3cgYSBodWdlCj4gICAgIGdhaW4gdG8gcGxh Y2UgdGFza3Mgb24gc21hbGwgQ1BVcywgbGVhZGluZyB0byBiZXR0ZXIgZW5lcmd5IHJlc3VsdHMu Cj4gCj4gICAgIDIuMi4yLiBQZXJmb3JtYW5jZSB0ZXN0aW5nCj4gCj4gICAgIDEwIGl0ZXJhdGlv bnMgb2YgUGNNYXJrLiBDb21wYXJlZCB2YWx1ZSBpcyB0aGUgZmluYWwgc2NvcmUKPiAgICAgKFBj bWFXb3JrdjNTY29yZSkuIEEgYmlnZ2VyIHNjb3JlIGlzIGJldHRlci4KPiAgICAgKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tKwo+ICAgICB8wqAgwqAgV2l0aG91dCBFQVMgfMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFdp dGggRUFTIHzCoCDCoCDCoCDCoCDCoCDCoCDCoCBXaXRoIHBhdGNoIHwKPiAgICAgKy0tLS0tLSst LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tKwo+ICAgICB8IE1lYW4gfCBjaSgrLy0pIHzCoCDCoCDCoCDCoCDCoCBNZWFuIHwgY2koKy8t KSB8wqAgwqAgwqAgwqAgwqAgTWVhbiB8IGNpKCsvLSkgfAo+ICAgICArLS0tLS0tKy0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCj4g ICAgIHwgODAyNiB8wqAgwqAgwqAgODYgfMKgIMKgIMKgIMKgIMKgIDgwMDMgfMKgIMKgIMKgIDc0 IHwgNzg0MCAoLTIuMDAlKSB8wqAgwqAgwqAxMDQgfAo+ICAgICArLS0tLS0tKy0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCj4gCj4g ICAgIFBlcmZvcm1hbmNlIGlzIGxvd2VyLCBidXQgc3RpbGwgaW4gdGhlIG1hcmdpbiBvZiBlcnJv ci4KPiAKPiAKPiAgICAgMy4gU3VtbWFyeQo+IAo+ICAgICBUaGUgYXJ0aWZpY2lhbCBwZXJmb3Jt YW5jZSBzdGF0ZXMgc2hvdyBvdmVyYWxsIGJldHRlciBlbmVyZ3kgcmVzdWx0cwo+ICAgICBhbmQg YSBzbWFsbCBwZXJmb3JtYW5jZSBkZWNyZWFzZS4gVGhleSBsZWFkIHRvIGEgbW9yZSBhZ2dyZXNz aXZlIHRhc2sKPiAgICAgcGxhY2VtZW50IG9uIHRoZSBtb3N0IGVuZXJneSBlZmZpY2llbnQgQ1BV cywgYW5kIHRoaXMgZXhwbGFpbnMgdGhlCj4gICAgIHJlc3VsdHMuCj4gCj4gICAgIFBpZXJyZSBH b25kb2lzICgzKToKPiAgICAgIMKgIGNwdWZyZXE6IENQUEM6IEFkZCBjcHBjX2NwdWZyZXFfc2Vh cmNoX2NwdV9kYXRhCj4gICAgICDCoCBjcHVmcmVxOiBDUFBDOiBBZGQgcGVyX2NwdSBlZmZpY2ll bmN5X2NsYXNzCj4gICAgICDCoCBjcHVmcmVxOiBDUFBDOiBSZWdpc3RlciBFTSBiYXNlZCBvbiBl ZmZpY2llbmN5IGNsYXNzIGluZm9ybWF0aW9uCj4gCj4gICAgICDCoGFyY2gvYXJtNjQva2VybmVs L3NtcC5jwqAgwqAgwqAgwqAgfMKgIMKgMSArCj4gICAgICDCoGRyaXZlcnMvY3B1ZnJlcS9jcHBj X2NwdWZyZXEuYyB8IDIwMSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiAgICAg IMKgMiBmaWxlcyBjaGFuZ2VkLCAyMDIgaW5zZXJ0aW9ucygrKQo+IAo+ICAgICAtLSAKPiAgICAg Mi4yNS4xCj4gCj4gCj4gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCj4gICAgIGxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0Cj4gICAgIGxpbnV4 LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZyA8bWFpbHRvOmxpbnV4LWFybS1rZXJuZWxA bGlzdHMuaW5mcmFkZWFkLm9yZz4KPiAgICAgaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsIDxodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWw+Cj4gCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcg bGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==