From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com [209.85.218.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 98DB77F477 for ; Tue, 12 Nov 2024 14:22:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.47 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731421325; cv=none; b=NRek/UsH/5R3mvKmbs8LJDJdxblC5MXt7uxiRo6VqXZWQLgXEcVpq0lNAr5W5oL2Qv6r3Ob5/qaFJYrlrFQ3FzOhDqvZI5gD4VfPYhNalqToax9VoDO6dW8VhoNfeT2lNEAOPUKoQEOznn4PEL2Ib4Uc23ep3yBx0F5p1ckqNv4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731421325; c=relaxed/simple; bh=lDuxJWHUECOGu4iQOy08f4vLoe6c1BG43n3js22eo1U=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=Bl64qJ9FvBrk+oG/TKsbK89dJpJF8d91/P1zCtvgm3dTodRzzGxUlQ/zMfReoZ+cUgf0r3aUSVx9cfzsofattWQr+IPJOBCLKRSfWB32uGxz6AGVfDeeo6aK6HmYGA7zMiwsUZe8kSFwDeVXtLfehxcEfD3j6BbEFbOWCFlSeCA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=uVADMHq0; arc=none smtp.client-ip=209.85.218.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="uVADMHq0" Received: by mail-ej1-f47.google.com with SMTP id a640c23a62f3a-a9a4031f69fso938630766b.0 for ; Tue, 12 Nov 2024 06:22:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1731421322; x=1732026122; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=49JuiSy/r9JLkYwGyXAh5iEnbRjgdRPZ+au2eZbNRrI=; b=uVADMHq0/JMfwYFY2RayQhvHGdseR/rWCSKrfkG/NTmr8NMQkWOI2OTli/gHrqmHOh DeCxm7IxpY2kH2HyV/L5XtjRcZhTFb4NyqigHjJ6eKgmje32AS0fs9ZGSUs/qNS4tXSb 8y3RzEEVoKpNKMOsR73jOW4QRepfS21CqAGmdINFf1/pmUCRx/KCoHOo2/BIDN5Iu212 pu54uWz7jvLDGeDG5K0Soyhh65zgLh/+YKYHU2OIKjMMQCw+p1kbfn21msaFlXqvBf14 CCbIe2tTftWmxiHYIiVJr1uVbphrHy9+yEN0y6Nien4kINiEmpgIsuITMS4H8MLvcOfh OU+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1731421322; x=1732026122; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=49JuiSy/r9JLkYwGyXAh5iEnbRjgdRPZ+au2eZbNRrI=; b=fhxxIhmDa4uh4FuZ9jztE1nLbA0lOCVA2UY0a7E6jU4BSWj1vBimz8fsaD37swuSqL mjrXSZheuvdoRkQjNv0GmLCYhkMnBWsOWH5MdFaVkwki1kBvWkR8WPe9qZfUft8Wp0sk ql7U6HskMQoe4dzoruGPN5JANFrwBEVts7l0BDqqe/NFncL/ko/3ons3h87nM5Bku5FU lGe+4YRSJ6Eea2eYdC8JTD7QaSGOqGgyebfp26WQO6bk4Wpzac1+G2CFGD9FjsuGNAlW o0v3Qz+pPqZbLhhJeUzmHXsj2+Y7cRGsMbqIthriaazLzkeI+a2pNQnQSJY3IMsyDWyT pcrw== X-Gm-Message-State: AOJu0Yz9g1ItivPlbsd+B1Q3Pwyaitjjz1yOSy0XReJPSZCMjAgAUcgz Y7eNlagzFPhe5v07GWdNX66qmfgu4fa7pgJKF2GYWieUlzGo1FtjCjRtp/aVRic= X-Google-Smtp-Source: AGHT+IETG01+m8sMSTYwKq7b6sSqzvzRvRFfCsmVZ8PvUWed37xWW7mS4gNJ68o4jFFPFcrEK3vkmw== X-Received: by 2002:a17:907:7f28:b0:a9a:825:4c39 with SMTP id a640c23a62f3a-a9eeff0daacmr1578407566b.20.1731421321912; Tue, 12 Nov 2024 06:22:01 -0800 (PST) Received: from [192.168.68.163] ([145.224.90.214]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a9ee0a18539sm734101166b.27.2024.11.12.06.22.00 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 12 Nov 2024 06:22:01 -0800 (PST) Message-ID: Date: Tue, 12 Nov 2024 14:21:59 +0000 Precedence: bulk X-Mailing-List: linux-perf-users@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v1 0/4] Prefer sysfs/JSON events also when no PMU is provided To: Ian Rogers , Atish Kumar Patra Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Ben Gainey , Junhao He , linux-riscv@lists.infradead.org, beeman@rivosinc.com, Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Jiri Olsa , Alexander Shishkin , Kan Liang , Ze Gao , Weilin Wang , Dominique Martinet References: <20241026121758.143259-1-irogers@google.com> <78eb729c-7594-460f-9d79-97fb683d8b5e@linaro.org> Content-Language: en-US From: James Clark In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 11/11/2024 5:19 pm, Ian Rogers wrote: > On Mon, Nov 11, 2024 at 2:45 AM James Clark wrote: >> >> >> >> On 08/11/2024 6:37 pm, Atish Kumar Patra wrote: >>> On Fri, Nov 8, 2024 at 4:16 AM James Clark wrote: >>>> >>>> >>>> >>>> On 07/11/2024 18:51, Ian Rogers wrote: >>>>> On Sat, Oct 26, 2024 at 5:18 AM Ian Rogers wrote: >>>>>> >>>>>> At the RISC-V summit the topic of avoiding event data being in the >>>>>> RISC-V PMU kernel driver came up. There is a preference for sysfs/JSON >>>>>> events being the priority when no PMU is provided so that legacy >>>>>> events maybe supported via json. Originally Mark Rutland also >>>>>> expressed at LPC 2023 that doing this would resolve bugs on ARM Apple >>>>>> M? processors, but James Clark more recently tested this and believes >>>>>> the driver issues there may not have existed or have been resolved. In >>>>>> any case, it is inconsistent that with a PMU event names avoid legacy >>>>>> encodings, but when wildcarding PMUs (ie without a PMU with the event >>>>>> name) the legacy encodings have priority. >>>>>> >>>>>> The patch doing this work was reverted in a v6.10 release candidate >>>>>> as, even though the patch was posted for weeks and had been on >>>>>> linux-next for weeks without issue, Linus was in the habit of using >>>>>> explicit legacy events with unsupported precision options on his >>>>>> Neoverse-N1. This machine has SLC PMU events for bus and CPU cycles >>>>>> where ARM decided to call the events bus_cycles and cycles, the latter >>>>>> being also a legacy event name. ARM haven't renamed the cycles event >>>>>> to a more consistent cpu_cycles and avoided the problem. With these >>>>>> changes the problematic event will now be skipped, a large warning >>>>>> produced, and perf record will continue for the other PMU events. This >>>>>> solution was proposed by Arnaldo. >>>>>> >>>>>> Two minor changes have been added to help with the error message and >>>>>> to work around issues occurring with "perf stat metrics (shadow stat) >>>>>> test". >>>>>> >>>>>> The patches have only been tested on my x86 non-hybrid laptop. >>>>> >>>>> Hi Atish and James, >>>>> >>>>> Could I get your tags for this series? >>>>> >>> >>> Hi Ian, >>> Thanks for your patches. It definitely helps to have a clean slate >>> implementation >>> for the perf tool. However, I have some open questions about other use cases >>> that we discussed during the RVI Summit. >>> >>>>> The patches were originally motivated by wanting to make the behavior >>>>> of events parsed like "cycles" match that of "cpu/cycles/", the PMU is >>>>> wildcarded to "cpu" in the first case. This was divergent because of >>>>> ARM we switched from preferring legacy (type = PERF_TYPE_HARDWARE, >>>>> config = PERF_COUNT_HW_CPU_CYCLES) to sysfs/json (type=>>>> type>, config=) when a PMU name was given. This >>>>> aligns with RISC-V wanting to use json encodings to avoid complexity >>>>> in the PMU driver. >>>>> >>>> >>>> I couldn't find the thread, but I remember fairly recently it was >>>> mentioned that RISC-V would be supporting the legacy events after all, >>>> maybe it was a comment from Atish? I'm not sure if that changes the >>>> requirements for this or not? >>>> >>>> I still can't really imagine how tooling would work if every tool has to >>>> maintain the mappings of basic events like instructions and branches. >>>> For example all the perf_event_open tests in ltp use the legacy events. >>>> >>> >>> No it has not changed. While this series helps to avoid clunky vendor >>> specific encodings >>> in the driver for perf tool, I am still unsure how we will manage >>> other applications >>> (directly passing legacy events through perf_event_open or >>> perf_evlist__open) will work. >>> >>> I have only anecdotal data about folks relying perf legacy events >>> directly to profile >>> their application. All of them use mostly cycle/instruction events though. >>> Are there any users who use other legacy events directly without perf tool ? >>> >>> If not, we may have only cycle/instruction mapping in the driver and >>> rely on json for everything else. >>> The other use case is virtualization. I have been playing with these >>> patches to find a clean solution to >>> enable all the use cases. If you have any other ideas, please let me know. >>> >> >> Yeah I would expect it's mostly cycles and instructions. I searched a >> bit for PERF_COUNT_HW_BRANCH_MISSES and only found tool/developer type >> usages, which I suppose we could expect to have to handle the mappings >> like perf. Although it's not the easiest thing to search for and >> obviously that only includes open source. >> >> Usages do exist though, there are people posting on stack overflow using >> it, and other various bug tracker listings. So you would expect those >> same users to have to use raw event codes and some switch statement to >> pick the right one for their hardware, or use Perf. > > I don't have any magic to solve this. My thoughts: > > 1) I thought legacy events were just going to hang around forever, > although the name hinting they'd kind of been deprecated. At LPC '23 > Atish and Mark Rutland originally asked for the sysfs/json to be the > preference. I thought Kan was going to push back given the upheaval, > especially updating every test expectation. It went through but we're > in this weird state where wildcard events are encoded using legacy and > PMU specifying events aren't. What this series hopes to solve. > > 2) I think it is important that perf tool be a reference > implementation where others can look (strace, etc.) to base their > implementation. Moving perf to sysfs/json is 1 step closer to legacy > event deprecation. Please yell if deprecation isn't what is wanted as > personally other than cleanliness I don't mind. If we do decide not to > have sysfs/json be the priority then I think it sensible to revert the > changes making it the priority for events that specify a PMU. I'd like > some level of consistency. Personally this change feels like it's encouraging fragmentation, the cleanest would be if RISC-V supports the legacy events like the other platforms. It's not a huge set of events anyway, and then existing software continues to work in addition to Perf continuing to work. If we're still thinking that RISC-V will support the legacy events anyway in the future, then it weakens the argument to change this and risk any breakages that fall out of it. I'm also not sure whether they really are legacy or just a common base set of events. Since the extended type thing was added even the legacy events support hybrid, so it's not like they expired from lack of features. Even if we claim they're legacy, is that really ever going to make them go away? Although I admit nobody has come out with a definitive use case that doesn't use either the cycles or instructions events, so maybe its all fine. > > 3) I'd like event parsing to be a library that is as easy to link > against as libbpf (i.e. not a viral license). Event parsing is really > just mapping an event name to 1 or more perf_event_attr. The PMU > abstraction is tied into the event parsing, but this has only been > more true recently. The evsel/evlist is tied into event parsing but > that feels separable. As most json isn't distributed under a viral > license this feels achievable, then I suspect most tools can use this > library rather than have to reinvent a wheel. > > Still looking for tags :-) > > Thanks, > Ian 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 65C43D42B85 for ; Tue, 12 Nov 2024 14:22:14 +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=hPtNsdmFSkpsFNtOY8QXZvhtnaW8WGBZMMb/nIDmy/c=; b=w2AeAKAyNnWb73 VAI4Bz/7UY6P0l0T0+ZW9Z9Fp16pRManbZC7JYsZKhb+ORc9AGk8r0Amh9x309OHng5/CGUlBqJac vr+rAEPSACcEGBpplVcqMgwXGcV5JKVUQBZ3y4rqsoZSVxP7n+XZKaqf1U/iHGSe5CYanRa2hxNcl WVwPLOFK9bB3Twlme40JMo7VkkwjKGVfkT/yTYZMer3sZ/6g3DzqpwxdgOILuwSljz4CclMbqB9iG qUVugjjV9LJMf8ptojlBPQuDopZO32XSplJIzEcECI1aibalIscixX/AYOBbi3C/Jz1NotngCo5b0 gVBY2SqqW3SyJs3qfehA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tArmS-00000003jOL-0QV3; Tue, 12 Nov 2024 14:22:08 +0000 Received: from mail-ej1-x62b.google.com ([2a00:1450:4864:20::62b]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tArmO-00000003jMj-1XuR for linux-riscv@lists.infradead.org; Tue, 12 Nov 2024 14:22:06 +0000 Received: by mail-ej1-x62b.google.com with SMTP id a640c23a62f3a-a9ec86a67feso988650766b.1 for ; Tue, 12 Nov 2024 06:22:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1731421322; x=1732026122; darn=lists.infradead.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=49JuiSy/r9JLkYwGyXAh5iEnbRjgdRPZ+au2eZbNRrI=; b=r6fq/oY4f5SiP5xs3Rx7rOxmEtsKhM1575LsJ6Ld8vB/LlWCnwxNNcW96FcdJEKwzz HE4X9hRLEiAUQGzMJCUpIAPtAHOs5qqb6Jql+tDQILWVey01jsigtb53Lo/VVMWWKyeK jIp3TfaCEOYts3DqCSIG/ZST4kh5oEjzhYAQ6MRYfflFCrVHowXwgSQJMgCz/psHAfEP CTxMfxYhPHPlaoagr0f+EqKK/1vt1idmgVHUAMIq5kX9/JMo+Sp1uwTvcuMnU2+U6CKB fkSgzN7IBFx/ewa+q7E7ZafJX9UMbSoKQv+uTUCyZmgfyzjije/sOloHCunIAOJi40Sn RCtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1731421322; x=1732026122; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=49JuiSy/r9JLkYwGyXAh5iEnbRjgdRPZ+au2eZbNRrI=; b=gmA+yIqsYPwmHruDxb3qMnCxmtqRK3++ewF1xWBCmzz4JzouNAJYrxjurBRbTxbaJQ 5YmzGWyBEpKLKLDDm4P8JQ4lXWJkAoFmITfSZV6HrIT3Lo/OB91BHoM4ujJKUhpb1poC MtM9yv05DpQUax+Ov8xlMAgz9wEHHkrz5V8Ysd76DcorKujYw4miGfFLBg8j2lUApZtr /Eroz4C+rIjMbT5L7kYHNyIuGL8byW5O29s4VzYHJQCp+J/dPXnvFGRP+C7Qntv/u0WK +jVR6komq1Qfeurkkkvo0fzDZdDLp5j8Ht/zTbRGAMf4KtY76TdQoy0XPqiz+8l4sqW4 PilA== X-Forwarded-Encrypted: i=1; AJvYcCWPbxdt7XVZ6wcXwxmum8RrqzlWWZa4mkzuI42by2J0EIixqM2rNpqz3eEV/Q9DvQWYuyoG+wIorH2ONA==@lists.infradead.org X-Gm-Message-State: AOJu0YwHrPeVoCmY0WxbZO0cUxmMXyAc534DIJ80kADRGgyOsQSBbP4f QCrx3ejXiLKWT1Cno2NtWPIcp7gsUdJA03GfJ5/9M+b9Gw84psR+LAr+97j6v6I= X-Google-Smtp-Source: AGHT+IETG01+m8sMSTYwKq7b6sSqzvzRvRFfCsmVZ8PvUWed37xWW7mS4gNJ68o4jFFPFcrEK3vkmw== X-Received: by 2002:a17:907:7f28:b0:a9a:825:4c39 with SMTP id a640c23a62f3a-a9eeff0daacmr1578407566b.20.1731421321912; Tue, 12 Nov 2024 06:22:01 -0800 (PST) Received: from [192.168.68.163] ([145.224.90.214]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a9ee0a18539sm734101166b.27.2024.11.12.06.22.00 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 12 Nov 2024 06:22:01 -0800 (PST) Message-ID: Date: Tue, 12 Nov 2024 14:21:59 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v1 0/4] Prefer sysfs/JSON events also when no PMU is provided To: Ian Rogers , Atish Kumar Patra Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Ben Gainey , Junhao He , linux-riscv@lists.infradead.org, beeman@rivosinc.com, Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Jiri Olsa , Alexander Shishkin , Kan Liang , Ze Gao , Weilin Wang , Dominique Martinet References: <20241026121758.143259-1-irogers@google.com> <78eb729c-7594-460f-9d79-97fb683d8b5e@linaro.org> Content-Language: en-US From: James Clark In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20241112_062204_423776_AEC91A72 X-CRM114-Status: GOOD ( 47.92 ) X-BeenThere: linux-riscv@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-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org CgpPbiAxMS8xMS8yMDI0IDU6MTkgcG0sIElhbiBSb2dlcnMgd3JvdGU6Cj4gT24gTW9uLCBOb3Yg MTEsIDIwMjQgYXQgMjo0NeKAr0FNIEphbWVzIENsYXJrIDxqYW1lcy5jbGFya0BsaW5hcm8ub3Jn PiB3cm90ZToKPj4KPj4KPj4KPj4gT24gMDgvMTEvMjAyNCA2OjM3IHBtLCBBdGlzaCBLdW1hciBQ YXRyYSB3cm90ZToKPj4+IE9uIEZyaSwgTm92IDgsIDIwMjQgYXQgNDoxNuKAr0FNIEphbWVzIENs YXJrIDxqYW1lcy5jbGFya0BsaW5hcm8ub3JnPiB3cm90ZToKPj4+Pgo+Pj4+Cj4+Pj4KPj4+PiBP biAwNy8xMS8yMDI0IDE4OjUxLCBJYW4gUm9nZXJzIHdyb3RlOgo+Pj4+PiBPbiBTYXQsIE9jdCAy NiwgMjAyNCBhdCA1OjE44oCvQU0gSWFuIFJvZ2VycyA8aXJvZ2Vyc0Bnb29nbGUuY29tPiB3cm90 ZToKPj4+Pj4+Cj4+Pj4+PiBBdCB0aGUgUklTQy1WIHN1bW1pdCB0aGUgdG9waWMgb2YgYXZvaWRp bmcgZXZlbnQgZGF0YSBiZWluZyBpbiB0aGUKPj4+Pj4+IFJJU0MtViBQTVUga2VybmVsIGRyaXZl ciBjYW1lIHVwLiBUaGVyZSBpcyBhIHByZWZlcmVuY2UgZm9yIHN5c2ZzL0pTT04KPj4+Pj4+IGV2 ZW50cyBiZWluZyB0aGUgcHJpb3JpdHkgd2hlbiBubyBQTVUgaXMgcHJvdmlkZWQgc28gdGhhdCBs ZWdhY3kKPj4+Pj4+IGV2ZW50cyBtYXliZSBzdXBwb3J0ZWQgdmlhIGpzb24uIE9yaWdpbmFsbHkg TWFyayBSdXRsYW5kIGFsc28KPj4+Pj4+IGV4cHJlc3NlZCBhdCBMUEMgMjAyMyB0aGF0IGRvaW5n IHRoaXMgd291bGQgcmVzb2x2ZSBidWdzIG9uIEFSTSBBcHBsZQo+Pj4+Pj4gTT8gcHJvY2Vzc29y cywgYnV0IEphbWVzIENsYXJrIG1vcmUgcmVjZW50bHkgdGVzdGVkIHRoaXMgYW5kIGJlbGlldmVz Cj4+Pj4+PiB0aGUgZHJpdmVyIGlzc3VlcyB0aGVyZSBtYXkgbm90IGhhdmUgZXhpc3RlZCBvciBo YXZlIGJlZW4gcmVzb2x2ZWQuIEluCj4+Pj4+PiBhbnkgY2FzZSwgaXQgaXMgaW5jb25zaXN0ZW50 IHRoYXQgd2l0aCBhIFBNVSBldmVudCBuYW1lcyBhdm9pZCBsZWdhY3kKPj4+Pj4+IGVuY29kaW5n cywgYnV0IHdoZW4gd2lsZGNhcmRpbmcgUE1VcyAoaWUgd2l0aG91dCBhIFBNVSB3aXRoIHRoZSBl dmVudAo+Pj4+Pj4gbmFtZSkgdGhlIGxlZ2FjeSBlbmNvZGluZ3MgaGF2ZSBwcmlvcml0eS4KPj4+ Pj4+Cj4+Pj4+PiBUaGUgcGF0Y2ggZG9pbmcgdGhpcyB3b3JrIHdhcyByZXZlcnRlZCBpbiBhIHY2 LjEwIHJlbGVhc2UgY2FuZGlkYXRlCj4+Pj4+PiBhcywgZXZlbiB0aG91Z2ggdGhlIHBhdGNoIHdh cyBwb3N0ZWQgZm9yIHdlZWtzIGFuZCBoYWQgYmVlbiBvbgo+Pj4+Pj4gbGludXgtbmV4dCBmb3Ig d2Vla3Mgd2l0aG91dCBpc3N1ZSwgTGludXMgd2FzIGluIHRoZSBoYWJpdCBvZiB1c2luZwo+Pj4+ Pj4gZXhwbGljaXQgbGVnYWN5IGV2ZW50cyB3aXRoIHVuc3VwcG9ydGVkIHByZWNpc2lvbiBvcHRp b25zIG9uIGhpcwo+Pj4+Pj4gTmVvdmVyc2UtTjEuIFRoaXMgbWFjaGluZSBoYXMgU0xDIFBNVSBl dmVudHMgZm9yIGJ1cyBhbmQgQ1BVIGN5Y2xlcwo+Pj4+Pj4gd2hlcmUgQVJNIGRlY2lkZWQgdG8g Y2FsbCB0aGUgZXZlbnRzIGJ1c19jeWNsZXMgYW5kIGN5Y2xlcywgdGhlIGxhdHRlcgo+Pj4+Pj4g YmVpbmcgYWxzbyBhIGxlZ2FjeSBldmVudCBuYW1lLiBBUk0gaGF2ZW4ndCByZW5hbWVkIHRoZSBj eWNsZXMgZXZlbnQKPj4+Pj4+IHRvIGEgbW9yZSBjb25zaXN0ZW50IGNwdV9jeWNsZXMgYW5kIGF2 b2lkZWQgdGhlIHByb2JsZW0uIFdpdGggdGhlc2UKPj4+Pj4+IGNoYW5nZXMgdGhlIHByb2JsZW1h dGljIGV2ZW50IHdpbGwgbm93IGJlIHNraXBwZWQsIGEgbGFyZ2Ugd2FybmluZwo+Pj4+Pj4gcHJv ZHVjZWQsIGFuZCBwZXJmIHJlY29yZCB3aWxsIGNvbnRpbnVlIGZvciB0aGUgb3RoZXIgUE1VIGV2 ZW50cy4gVGhpcwo+Pj4+Pj4gc29sdXRpb24gd2FzIHByb3Bvc2VkIGJ5IEFybmFsZG8uCj4+Pj4+ Pgo+Pj4+Pj4gVHdvIG1pbm9yIGNoYW5nZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIGhlbHAgd2l0aCB0 aGUgZXJyb3IgbWVzc2FnZSBhbmQKPj4+Pj4+IHRvIHdvcmsgYXJvdW5kIGlzc3VlcyBvY2N1cnJp bmcgd2l0aCAicGVyZiBzdGF0IG1ldHJpY3MgKHNoYWRvdyBzdGF0KQo+Pj4+Pj4gdGVzdCIuCj4+ Pj4+Pgo+Pj4+Pj4gVGhlIHBhdGNoZXMgaGF2ZSBvbmx5IGJlZW4gdGVzdGVkIG9uIG15IHg4NiBu b24taHlicmlkIGxhcHRvcC4KPj4+Pj4KPj4+Pj4gSGkgQXRpc2ggYW5kIEphbWVzLAo+Pj4+Pgo+ Pj4+PiBDb3VsZCBJIGdldCB5b3VyIHRhZ3MgZm9yIHRoaXMgc2VyaWVzPwo+Pj4+Pgo+Pj4KPj4+ IEhpIElhbiwKPj4+IFRoYW5rcyBmb3IgeW91ciBwYXRjaGVzLiBJdCBkZWZpbml0ZWx5IGhlbHBz IHRvIGhhdmUgYSBjbGVhbiBzbGF0ZQo+Pj4gaW1wbGVtZW50YXRpb24KPj4+IGZvciB0aGUgcGVy ZiB0b29sLiBIb3dldmVyLCBJIGhhdmUgc29tZSBvcGVuIHF1ZXN0aW9ucyBhYm91dCBvdGhlciB1 c2UgY2FzZXMKPj4+IHRoYXQgd2UgZGlzY3Vzc2VkIGR1cmluZyB0aGUgUlZJIFN1bW1pdC4KPj4+ Cj4+Pj4+IFRoZSBwYXRjaGVzIHdlcmUgb3JpZ2luYWxseSBtb3RpdmF0ZWQgYnkgd2FudGluZyB0 byBtYWtlIHRoZSBiZWhhdmlvcgo+Pj4+PiBvZiBldmVudHMgcGFyc2VkIGxpa2UgImN5Y2xlcyIg bWF0Y2ggdGhhdCBvZiAiY3B1L2N5Y2xlcy8iLCB0aGUgUE1VIGlzCj4+Pj4+IHdpbGRjYXJkZWQg dG8gImNwdSIgaW4gdGhlIGZpcnN0IGNhc2UuIFRoaXMgd2FzIGRpdmVyZ2VudCBiZWNhdXNlIG9m Cj4+Pj4+IEFSTSB3ZSBzd2l0Y2hlZCBmcm9tIHByZWZlcnJpbmcgbGVnYWN5ICh0eXBlID0gUEVS Rl9UWVBFX0hBUkRXQVJFLAo+Pj4+PiBjb25maWcgPSBQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVMp IHRvIHN5c2ZzL2pzb24gKHR5cGU9PGNvcmUgUE1VJ3MKPj4+Pj4gdHlwZT4sIGNvbmZpZz08ZW5j b2RpbmcgZnJvbSBldmVudD4pIHdoZW4gYSBQTVUgbmFtZSB3YXMgZ2l2ZW4uIFRoaXMKPj4+Pj4g YWxpZ25zIHdpdGggUklTQy1WIHdhbnRpbmcgdG8gdXNlIGpzb24gZW5jb2RpbmdzIHRvIGF2b2lk IGNvbXBsZXhpdHkKPj4+Pj4gaW4gdGhlIFBNVSBkcml2ZXIuCj4+Pj4+Cj4+Pj4KPj4+PiBJIGNv dWxkbid0IGZpbmQgdGhlIHRocmVhZCwgYnV0IEkgcmVtZW1iZXIgZmFpcmx5IHJlY2VudGx5IGl0 IHdhcwo+Pj4+IG1lbnRpb25lZCB0aGF0IFJJU0MtViB3b3VsZCBiZSBzdXBwb3J0aW5nIHRoZSBs ZWdhY3kgZXZlbnRzIGFmdGVyIGFsbCwKPj4+PiBtYXliZSBpdCB3YXMgYSBjb21tZW50IGZyb20g QXRpc2g/IEknbSBub3Qgc3VyZSBpZiB0aGF0IGNoYW5nZXMgdGhlCj4+Pj4gcmVxdWlyZW1lbnRz IGZvciB0aGlzIG9yIG5vdD8KPj4+Pgo+Pj4+IEkgc3RpbGwgY2FuJ3QgcmVhbGx5IGltYWdpbmUg aG93IHRvb2xpbmcgd291bGQgd29yayBpZiBldmVyeSB0b29sIGhhcyB0bwo+Pj4+IG1haW50YWlu IHRoZSBtYXBwaW5ncyBvZiBiYXNpYyBldmVudHMgbGlrZSBpbnN0cnVjdGlvbnMgYW5kIGJyYW5j aGVzLgo+Pj4+IEZvciBleGFtcGxlIGFsbCB0aGUgcGVyZl9ldmVudF9vcGVuIHRlc3RzIGluIGx0 cCB1c2UgdGhlIGxlZ2FjeSBldmVudHMuCj4+Pj4KPj4+Cj4+PiBObyBpdCBoYXMgbm90IGNoYW5n ZWQuIFdoaWxlIHRoaXMgc2VyaWVzIGhlbHBzIHRvIGF2b2lkIGNsdW5reSB2ZW5kb3IKPj4+IHNw ZWNpZmljIGVuY29kaW5ncwo+Pj4gaW4gdGhlIGRyaXZlciBmb3IgcGVyZiB0b29sLCBJIGFtIHN0 aWxsIHVuc3VyZSBob3cgd2Ugd2lsbCBtYW5hZ2UKPj4+IG90aGVyIGFwcGxpY2F0aW9ucwo+Pj4g KGRpcmVjdGx5IHBhc3NpbmcgbGVnYWN5IGV2ZW50cyB0aHJvdWdoIHBlcmZfZXZlbnRfb3BlbiBv cgo+Pj4gcGVyZl9ldmxpc3RfX29wZW4pIHdpbGwgd29yay4KPj4+Cj4+PiBJIGhhdmUgb25seSBh bmVjZG90YWwgZGF0YSBhYm91dCBmb2xrcyByZWx5aW5nIHBlcmYgbGVnYWN5IGV2ZW50cwo+Pj4g ZGlyZWN0bHkgdG8gcHJvZmlsZQo+Pj4gdGhlaXIgYXBwbGljYXRpb24uIEFsbCBvZiB0aGVtIHVz ZSBtb3N0bHkgY3ljbGUvaW5zdHJ1Y3Rpb24gZXZlbnRzIHRob3VnaC4KPj4+IEFyZSB0aGVyZSBh bnkgdXNlcnMgd2hvIHVzZSBvdGhlciBsZWdhY3kgZXZlbnRzIGRpcmVjdGx5IHdpdGhvdXQgcGVy ZiB0b29sID8KPj4+Cj4+PiBJZiBub3QsIHdlIG1heSBoYXZlIG9ubHkgY3ljbGUvaW5zdHJ1Y3Rp b24gbWFwcGluZyBpbiB0aGUgZHJpdmVyIGFuZAo+Pj4gcmVseSBvbiBqc29uIGZvciBldmVyeXRo aW5nIGVsc2UuCj4+PiBUaGUgb3RoZXIgdXNlIGNhc2UgaXMgdmlydHVhbGl6YXRpb24uIEkgaGF2 ZSBiZWVuIHBsYXlpbmcgd2l0aCB0aGVzZQo+Pj4gcGF0Y2hlcyB0byBmaW5kIGEgY2xlYW4gc29s dXRpb24gdG8KPj4+IGVuYWJsZSBhbGwgdGhlIHVzZSBjYXNlcy4gSWYgeW91IGhhdmUgYW55IG90 aGVyIGlkZWFzLCBwbGVhc2UgbGV0IG1lIGtub3cuCj4+Pgo+Pgo+PiBZZWFoIEkgd291bGQgZXhw ZWN0IGl0J3MgbW9zdGx5IGN5Y2xlcyBhbmQgaW5zdHJ1Y3Rpb25zLiBJIHNlYXJjaGVkIGEKPj4g Yml0IGZvciBQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVMgYW5kIG9ubHkgZm91bmQgdG9vbC9k ZXZlbG9wZXIgdHlwZQo+PiB1c2FnZXMsIHdoaWNoIEkgc3VwcG9zZSB3ZSBjb3VsZCBleHBlY3Qg dG8gaGF2ZSB0byBoYW5kbGUgdGhlIG1hcHBpbmdzCj4+IGxpa2UgcGVyZi4gQWx0aG91Z2ggaXQn cyBub3QgdGhlIGVhc2llc3QgdGhpbmcgdG8gc2VhcmNoIGZvciBhbmQKPj4gb2J2aW91c2x5IHRo YXQgb25seSBpbmNsdWRlcyBvcGVuIHNvdXJjZS4KPj4KPj4gVXNhZ2VzIGRvIGV4aXN0IHRob3Vn aCwgdGhlcmUgYXJlIHBlb3BsZSBwb3N0aW5nIG9uIHN0YWNrIG92ZXJmbG93IHVzaW5nCj4+IGl0 LCBhbmQgb3RoZXIgdmFyaW91cyBidWcgdHJhY2tlciBsaXN0aW5ncy4gU28geW91IHdvdWxkIGV4 cGVjdCB0aG9zZQo+PiBzYW1lIHVzZXJzIHRvIGhhdmUgdG8gdXNlIHJhdyBldmVudCBjb2RlcyBh bmQgc29tZSBzd2l0Y2ggc3RhdGVtZW50IHRvCj4+IHBpY2sgdGhlIHJpZ2h0IG9uZSBmb3IgdGhl aXIgaGFyZHdhcmUsIG9yIHVzZSBQZXJmLgo+IAo+IEkgZG9uJ3QgaGF2ZSBhbnkgbWFnaWMgdG8g c29sdmUgdGhpcy4gTXkgdGhvdWdodHM6Cj4gCj4gMSkgSSB0aG91Z2h0IGxlZ2FjeSBldmVudHMg d2VyZSBqdXN0IGdvaW5nIHRvIGhhbmcgYXJvdW5kIGZvcmV2ZXIsCj4gYWx0aG91Z2ggdGhlIG5h bWUgaGludGluZyB0aGV5J2Qga2luZCBvZiBiZWVuIGRlcHJlY2F0ZWQuIEF0IExQQyAnMjMKPiBB dGlzaCBhbmQgTWFyayBSdXRsYW5kIG9yaWdpbmFsbHkgYXNrZWQgZm9yIHRoZSBzeXNmcy9qc29u IHRvIGJlIHRoZQo+IHByZWZlcmVuY2UuIEkgdGhvdWdodCBLYW4gd2FzIGdvaW5nIHRvIHB1c2gg YmFjayBnaXZlbiB0aGUgdXBoZWF2YWwsCj4gZXNwZWNpYWxseSB1cGRhdGluZyBldmVyeSB0ZXN0 IGV4cGVjdGF0aW9uLiBJdCB3ZW50IHRocm91Z2ggYnV0IHdlJ3JlCj4gaW4gdGhpcyB3ZWlyZCBz dGF0ZSB3aGVyZSB3aWxkY2FyZCBldmVudHMgYXJlIGVuY29kZWQgdXNpbmcgbGVnYWN5IGFuZAo+ IFBNVSBzcGVjaWZ5aW5nIGV2ZW50cyBhcmVuJ3QuIFdoYXQgdGhpcyBzZXJpZXMgaG9wZXMgdG8g c29sdmUuCj4gCj4gMikgSSB0aGluayBpdCBpcyBpbXBvcnRhbnQgdGhhdCBwZXJmIHRvb2wgYmUg YSByZWZlcmVuY2UKPiBpbXBsZW1lbnRhdGlvbiB3aGVyZSBvdGhlcnMgY2FuIGxvb2sgKHN0cmFj ZSwgZXRjLikgdG8gYmFzZSB0aGVpcgo+IGltcGxlbWVudGF0aW9uLiBNb3ZpbmcgcGVyZiB0byBz eXNmcy9qc29uIGlzIDEgc3RlcCBjbG9zZXIgdG8gbGVnYWN5Cj4gZXZlbnQgZGVwcmVjYXRpb24u IFBsZWFzZSB5ZWxsIGlmIGRlcHJlY2F0aW9uIGlzbid0IHdoYXQgaXMgd2FudGVkIGFzCj4gcGVy c29uYWxseSBvdGhlciB0aGFuIGNsZWFubGluZXNzIEkgZG9uJ3QgbWluZC4gSWYgd2UgZG8gZGVj aWRlIG5vdCB0bwo+IGhhdmUgc3lzZnMvanNvbiBiZSB0aGUgcHJpb3JpdHkgdGhlbiBJIHRoaW5r IGl0IHNlbnNpYmxlIHRvIHJldmVydCB0aGUKPiBjaGFuZ2VzIG1ha2luZyBpdCB0aGUgcHJpb3Jp dHkgZm9yIGV2ZW50cyB0aGF0IHNwZWNpZnkgYSBQTVUuIEknZCBsaWtlCj4gc29tZSBsZXZlbCBv ZiBjb25zaXN0ZW5jeS4KClBlcnNvbmFsbHkgdGhpcyBjaGFuZ2UgZmVlbHMgbGlrZSBpdCdzIGVu Y291cmFnaW5nIGZyYWdtZW50YXRpb24sIHRoZSAKY2xlYW5lc3Qgd291bGQgYmUgaWYgUklTQy1W IHN1cHBvcnRzIHRoZSBsZWdhY3kgZXZlbnRzIGxpa2UgdGhlIG90aGVyIApwbGF0Zm9ybXMuIEl0 J3Mgbm90IGEgaHVnZSBzZXQgb2YgZXZlbnRzIGFueXdheSwgYW5kIHRoZW4gZXhpc3RpbmcgCnNv ZnR3YXJlIGNvbnRpbnVlcyB0byB3b3JrIGluIGFkZGl0aW9uIHRvIFBlcmYgY29udGludWluZyB0 byB3b3JrLgoKSWYgd2UncmUgc3RpbGwgdGhpbmtpbmcgdGhhdCBSSVNDLVYgd2lsbCBzdXBwb3J0 IHRoZSBsZWdhY3kgZXZlbnRzIAphbnl3YXkgaW4gdGhlIGZ1dHVyZSwgdGhlbiBpdCB3ZWFrZW5z IHRoZSBhcmd1bWVudCB0byBjaGFuZ2UgdGhpcyBhbmQgCnJpc2sgYW55IGJyZWFrYWdlcyB0aGF0 IGZhbGwgb3V0IG9mIGl0LgoKSSdtIGFsc28gbm90IHN1cmUgd2hldGhlciB0aGV5IHJlYWxseSBh cmUgbGVnYWN5IG9yIGp1c3QgYSBjb21tb24gYmFzZSAKc2V0IG9mIGV2ZW50cy4gU2luY2UgdGhl IGV4dGVuZGVkIHR5cGUgdGhpbmcgd2FzIGFkZGVkIGV2ZW4gdGhlIGxlZ2FjeSAKZXZlbnRzIHN1 cHBvcnQgaHlicmlkLCBzbyBpdCdzIG5vdCBsaWtlIHRoZXkgZXhwaXJlZCBmcm9tIGxhY2sgb2Yg CmZlYXR1cmVzLiBFdmVuIGlmIHdlIGNsYWltIHRoZXkncmUgbGVnYWN5LCBpcyB0aGF0IHJlYWxs eSBldmVyIGdvaW5nIHRvIAptYWtlIHRoZW0gZ28gYXdheT8KCkFsdGhvdWdoIEkgYWRtaXQgbm9i b2R5IGhhcyBjb21lIG91dCB3aXRoIGEgZGVmaW5pdGl2ZSB1c2UgY2FzZSB0aGF0IApkb2Vzbid0 IHVzZSBlaXRoZXIgdGhlIGN5Y2xlcyBvciBpbnN0cnVjdGlvbnMgZXZlbnRzLCBzbyBtYXliZSBp dHMgYWxsIGZpbmUuCgo+IAo+IDMpIEknZCBsaWtlIGV2ZW50IHBhcnNpbmcgdG8gYmUgYSBsaWJy YXJ5IHRoYXQgaXMgYXMgZWFzeSB0byBsaW5rCj4gYWdhaW5zdCBhcyBsaWJicGYgKGkuZS4gbm90 IGEgdmlyYWwgbGljZW5zZSkuIEV2ZW50IHBhcnNpbmcgaXMgcmVhbGx5Cj4ganVzdCBtYXBwaW5n IGFuIGV2ZW50IG5hbWUgdG8gMSBvciBtb3JlIHBlcmZfZXZlbnRfYXR0ci4gVGhlIFBNVQo+IGFi c3RyYWN0aW9uIGlzIHRpZWQgaW50byB0aGUgZXZlbnQgcGFyc2luZywgYnV0IHRoaXMgaGFzIG9u bHkgYmVlbgo+IG1vcmUgdHJ1ZSByZWNlbnRseS4gVGhlIGV2c2VsL2V2bGlzdCBpcyB0aWVkIGlu dG8gZXZlbnQgcGFyc2luZyBidXQKPiB0aGF0IGZlZWxzIHNlcGFyYWJsZS4gQXMgbW9zdCBqc29u IGlzbid0IGRpc3RyaWJ1dGVkIHVuZGVyIGEgdmlyYWwKPiBsaWNlbnNlIHRoaXMgZmVlbHMgYWNo aWV2YWJsZSwgdGhlbiBJIHN1c3BlY3QgbW9zdCB0b29scyBjYW4gdXNlIHRoaXMKPiBsaWJyYXJ5 IHJhdGhlciB0aGFuIGhhdmUgdG8gcmVpbnZlbnQgYSB3aGVlbC4KPiAKPiBTdGlsbCBsb29raW5n IGZvciB0YWdzIDotKQo+IAo+IFRoYW5rcywKPiBJYW4KCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgt cmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWls bWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==