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 X-Spam-Level: X-Spam-Status: No, score=-10.6 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 67484C433B4 for ; Fri, 14 May 2021 05:58:49 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 24BAB61447 for ; Fri, 14 May 2021 05:58:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 24BAB61447 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 4B9886EE08; Fri, 14 May 2021 05:58:47 +0000 (UTC) Received: from mail-ot1-x334.google.com (mail-ot1-x334.google.com [IPv6:2607:f8b0:4864:20::334]) by gabe.freedesktop.org (Postfix) with ESMTPS id 73D3D6E196; Fri, 14 May 2021 05:58:45 +0000 (UTC) Received: by mail-ot1-x334.google.com with SMTP id r26-20020a056830121ab02902a5ff1c9b81so25630577otp.11; Thu, 13 May 2021 22:58:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=pVWajPyYcbpa8eIUWcNxrzfnoigWxSBYwCymPLbMoAs=; b=FhSuE2SoTRYpYljyoCyELWj1LGJ/lIYGAEIMjauVmA3XgThiacWIQu35tA+xOxKNeU b23erC1Ds6l9TMiVmIcVe7wkH7h4r6tTBlPawLVfPV9W11156WtH/y3oAqIvaojGZ6Sx h1hEgiY4hkYO6KQ6kURP1XZj1F7q5eHd/A1a82+q80wuWtzqtGJGfgN7CiKb/F0+J3Nt oATLIa4ACKxMeXdYhSS2DvaAj46M/zu1iWle9i3WPyHeYtsHFfVW6lZDBXjK+cq89Moz SS270yoEuWWUMhABsZ7MwVFf0bsZaVeY8RcXgMhofMUZifHI+x6h729hcXwgcF42qGM/ ghCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=pVWajPyYcbpa8eIUWcNxrzfnoigWxSBYwCymPLbMoAs=; b=YqTygkU+oMbLuxfZ2Rr3YPO/DhlsJQCQPAahsWh28N9V+J9dpNyi+ieJlXc+5W6Xxz wJbr5XVeOl8Zp0KtF6uAerz5kb0rDerKFNDaGMarUeJrqfiJ3xsPNvaCoNFGCoEQYSHh 8YrusjCkeysiBt3lqASA6AFFQ7bZ+EgYHOEKi1t1dvTugZkexkd7ysPveQ6xvRrIjMUD nvl4ZZaSYb3CBvZLe68pMUaYk+4+h19KYrp/bmh2bGnNSSmJOPPs1yGe8pjjicXQWk0p YIZoFyn/yNE45iLCvziKo8ZyBg36S18wstLnGX6McuxQka8KFU6kqPQVl4KbcHEni8UG Lgkw== X-Gm-Message-State: AOAM530BL1q09WmeB9pLckzcWB+q+7OwFIcYJ2+1/x6MOGpfFARFsTOG 7s9jh28vnjdjAXqJ/b4ZAPlo6qFppO9ZFae9J3P54Hfu X-Google-Smtp-Source: ABdhPJw7PZlK88Qbqb0j2aqMwMDSDFgCJ0XlC/mMq4awIMG6dA/HYGufJM53L8A/sP8WNI93oikQcK32tnOtufMBA+o= X-Received: by 2002:a9d:57cd:: with SMTP id q13mr36095677oti.23.1620971924684; Thu, 13 May 2021 22:58:44 -0700 (PDT) MIME-Version: 1.0 References: <20210513110002.3641705-1-tvrtko.ursulin@linux.intel.com> In-Reply-To: From: Alex Deucher Date: Fri, 14 May 2021 01:58:33 -0400 Message-ID: Subject: Re: [PATCH 0/7] Per client engine busyness To: Tvrtko Ursulin , "Nieto, David M" , Christian Koenig Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Intel Graphics Development , Maling list - DRI developers Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" + David, Christian On Thu, May 13, 2021 at 12:41 PM Tvrtko Ursulin wrote: > > > Hi, > > On 13/05/2021 16:48, Alex Deucher wrote: > > On Thu, May 13, 2021 at 7:00 AM Tvrtko Ursulin > > wrote: > >> > >> From: Tvrtko Ursulin > >> > >> Resurrect of the previosuly merged per client engine busyness patches.= In a > >> nutshell it enables intel_gpu_top to be more top(1) like useful and sh= ow not > >> only physical GPU engine usage but per process view as well. > >> > >> Example screen capture: > >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~ > >> intel-gpu-top - 906/ 955 MHz; 0% RC6; 5.30 Watts; 933 irqs/s > >> > >> IMC reads: 4414 MiB/s > >> IMC writes: 3805 MiB/s > >> > >> ENGINE BUSY MI_SE= MA MI_WAIT > >> Render/3D/0 93.46% |=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96= =88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88= =E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2= =96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96= =88=E2=96=88=E2=96=88=E2=96=8B | 0% 0% > >> Blitter/0 0.00% | | = 0% 0% > >> Video/0 0.00% | | = 0% 0% > >> VideoEnhance/0 0.00% | | = 0% 0% > >> > >> PID NAME Render/3D Blitter Video Video= Enhance > >> 2733 neverball |=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88= =E2=96=88=E2=96=8C || || || | > >> 2047 Xorg |=E2=96=88=E2=96=88=E2=96=88=E2=96=8A ||= || || | > >> 2737 glxgears |=E2=96=88=E2=96=8D || || = || | > >> 2128 xfwm4 | || || || = | > >> 2047 Xorg | || || || = | > >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~= ~~~~~~~~~~ > >> > >> Internally we track time spent on engines for each struct intel_contex= t, both > >> for current and past contexts belonging to each open DRM file. > >> > >> This can serve as a building block for several features from the wante= d list: > >> smarter scheduler decisions, getrusage(2)-like per-GEM-context functio= nality > >> wanted by some customers, setrlimit(2) like controls, cgroups controll= er, > >> dynamic SSEU tuning, ... > >> > >> To enable userspace access to the tracked data, we expose time spent o= n GPU per > >> client and per engine class in sysfs with a hierarchy like the below: > >> > >> # cd /sys/class/drm/card0/clients/ > >> # tree > >> . > >> =E2=94=9C=E2=94=80=E2=94=80 7 > >> =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 busy > >> =E2=94=82 =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 0 > >> =E2=94=82 =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 1 > >> =E2=94=82 =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 2 > >> =E2=94=82 =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 3 > >> =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 name > >> =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 pid > >> =E2=94=9C=E2=94=80=E2=94=80 8 > >> =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 busy > >> =E2=94=82 =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 0 > >> =E2=94=82 =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 1 > >> =E2=94=82 =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 2 > >> =E2=94=82 =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 3 > >> =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 name > >> =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 pid > >> =E2=94=94=E2=94=80=E2=94=80 9 > >> =E2=94=9C=E2=94=80=E2=94=80 busy > >> =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 0 > >> =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 1 > >> =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 2 > >> =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 3 > >> =E2=94=9C=E2=94=80=E2=94=80 name > >> =E2=94=94=E2=94=80=E2=94=80 pid > >> > >> Files in 'busy' directories are numbered using the engine class ABI va= lues and > >> they contain accumulated nanoseconds each client spent on engines of a > >> respective class. > > > > We did something similar in amdgpu using the gpu scheduler. We then > > expose the data via fdinfo. See > > https://cgit.freedesktop.org/drm/drm-misc/commit/?id=3D1774baa64f9395fa= 884ea9ed494bcb043f3b83f5 > > https://cgit.freedesktop.org/drm/drm-misc/commit/?id=3D874442541133f78c= 78b6880b8cc495bab5c61704 > > Interesting! > > Is yours wall time or actual GPU time taking preemption and such into > account? Do you have some userspace tools parsing this data and how to > do you client discovery? Presumably there has to be a better way that > going through all open file descriptors? Wall time. It uses the fences in the scheduler to calculate engine time. We have some python scripts to make it look pretty, but mainly just reading the files directly. If you know the process, you can look it up in procfs. > > Our implementation was merged in January but Daniel took it out recently > because he wanted to have discussion about a common vendor framework for > this whole story on dri-devel. I think. +Daniel to comment. > > I couldn't find the patch you pasted on the mailing list to see if there > was any such discussion around your version. It was on the amd-gfx mailing list. Alex > > Regards, > > Tvrtko > > > > > Alex > > > > > >> > >> Tvrtko Ursulin (7): > >> drm/i915: Expose list of clients in sysfs > >> drm/i915: Update client name on context create > >> drm/i915: Make GEM contexts track DRM clients > >> drm/i915: Track runtime spent in closed and unreachable GEM context= s > >> drm/i915: Track all user contexts per client > >> drm/i915: Track context current active time > >> drm/i915: Expose per-engine client busyness > >> > >> drivers/gpu/drm/i915/Makefile | 5 +- > >> drivers/gpu/drm/i915/gem/i915_gem_context.c | 61 ++- > >> .../gpu/drm/i915/gem/i915_gem_context_types.h | 16 +- > >> drivers/gpu/drm/i915/gt/intel_context.c | 27 +- > >> drivers/gpu/drm/i915/gt/intel_context.h | 15 +- > >> drivers/gpu/drm/i915/gt/intel_context_types.h | 24 +- > >> .../drm/i915/gt/intel_execlists_submission.c | 23 +- > >> .../gpu/drm/i915/gt/intel_gt_clock_utils.c | 4 + > >> drivers/gpu/drm/i915/gt/intel_lrc.c | 27 +- > >> drivers/gpu/drm/i915/gt/intel_lrc.h | 24 ++ > >> drivers/gpu/drm/i915/gt/selftest_lrc.c | 10 +- > >> drivers/gpu/drm/i915/i915_drm_client.c | 365 ++++++++++++++++= ++ > >> drivers/gpu/drm/i915/i915_drm_client.h | 123 ++++++ > >> drivers/gpu/drm/i915/i915_drv.c | 6 + > >> drivers/gpu/drm/i915/i915_drv.h | 5 + > >> drivers/gpu/drm/i915/i915_gem.c | 21 +- > >> drivers/gpu/drm/i915/i915_gpu_error.c | 31 +- > >> drivers/gpu/drm/i915/i915_gpu_error.h | 2 +- > >> drivers/gpu/drm/i915/i915_sysfs.c | 8 + > >> 19 files changed, 716 insertions(+), 81 deletions(-) > >> create mode 100644 drivers/gpu/drm/i915/i915_drm_client.c > >> create mode 100644 drivers/gpu/drm/i915/i915_drm_client.h > >> > >> -- > >> 2.30.2 > >> 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 X-Spam-Level: X-Spam-Status: No, score=-10.6 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DE11DC433ED for ; Fri, 14 May 2021 05:58:47 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8FC0961447 for ; Fri, 14 May 2021 05:58:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8FC0961447 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C81A56E196; Fri, 14 May 2021 05:58:46 +0000 (UTC) Received: from mail-ot1-x334.google.com (mail-ot1-x334.google.com [IPv6:2607:f8b0:4864:20::334]) by gabe.freedesktop.org (Postfix) with ESMTPS id 73D3D6E196; Fri, 14 May 2021 05:58:45 +0000 (UTC) Received: by mail-ot1-x334.google.com with SMTP id r26-20020a056830121ab02902a5ff1c9b81so25630577otp.11; Thu, 13 May 2021 22:58:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=pVWajPyYcbpa8eIUWcNxrzfnoigWxSBYwCymPLbMoAs=; b=FhSuE2SoTRYpYljyoCyELWj1LGJ/lIYGAEIMjauVmA3XgThiacWIQu35tA+xOxKNeU b23erC1Ds6l9TMiVmIcVe7wkH7h4r6tTBlPawLVfPV9W11156WtH/y3oAqIvaojGZ6Sx h1hEgiY4hkYO6KQ6kURP1XZj1F7q5eHd/A1a82+q80wuWtzqtGJGfgN7CiKb/F0+J3Nt oATLIa4ACKxMeXdYhSS2DvaAj46M/zu1iWle9i3WPyHeYtsHFfVW6lZDBXjK+cq89Moz SS270yoEuWWUMhABsZ7MwVFf0bsZaVeY8RcXgMhofMUZifHI+x6h729hcXwgcF42qGM/ ghCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=pVWajPyYcbpa8eIUWcNxrzfnoigWxSBYwCymPLbMoAs=; b=YqTygkU+oMbLuxfZ2Rr3YPO/DhlsJQCQPAahsWh28N9V+J9dpNyi+ieJlXc+5W6Xxz wJbr5XVeOl8Zp0KtF6uAerz5kb0rDerKFNDaGMarUeJrqfiJ3xsPNvaCoNFGCoEQYSHh 8YrusjCkeysiBt3lqASA6AFFQ7bZ+EgYHOEKi1t1dvTugZkexkd7ysPveQ6xvRrIjMUD nvl4ZZaSYb3CBvZLe68pMUaYk+4+h19KYrp/bmh2bGnNSSmJOPPs1yGe8pjjicXQWk0p YIZoFyn/yNE45iLCvziKo8ZyBg36S18wstLnGX6McuxQka8KFU6kqPQVl4KbcHEni8UG Lgkw== X-Gm-Message-State: AOAM530BL1q09WmeB9pLckzcWB+q+7OwFIcYJ2+1/x6MOGpfFARFsTOG 7s9jh28vnjdjAXqJ/b4ZAPlo6qFppO9ZFae9J3P54Hfu X-Google-Smtp-Source: ABdhPJw7PZlK88Qbqb0j2aqMwMDSDFgCJ0XlC/mMq4awIMG6dA/HYGufJM53L8A/sP8WNI93oikQcK32tnOtufMBA+o= X-Received: by 2002:a9d:57cd:: with SMTP id q13mr36095677oti.23.1620971924684; Thu, 13 May 2021 22:58:44 -0700 (PDT) MIME-Version: 1.0 References: <20210513110002.3641705-1-tvrtko.ursulin@linux.intel.com> In-Reply-To: From: Alex Deucher Date: Fri, 14 May 2021 01:58:33 -0400 Message-ID: To: Tvrtko Ursulin , "Nieto, David M" , Christian Koenig Subject: Re: [Intel-gfx] [PATCH 0/7] Per client engine busyness X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Intel Graphics Development , Maling list - DRI developers Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" KyBEYXZpZCwgQ2hyaXN0aWFuCgpPbiBUaHUsIE1heSAxMywgMjAyMSBhdCAxMjo0MSBQTSBUdnJ0 a28gVXJzdWxpbgo8dHZydGtvLnVyc3VsaW5AbGludXguaW50ZWwuY29tPiB3cm90ZToKPgo+Cj4g SGksCj4KPiBPbiAxMy8wNS8yMDIxIDE2OjQ4LCBBbGV4IERldWNoZXIgd3JvdGU6Cj4gPiBPbiBU aHUsIE1heSAxMywgMjAyMSBhdCA3OjAwIEFNIFR2cnRrbyBVcnN1bGluCj4gPiA8dHZydGtvLnVy c3VsaW5AbGludXguaW50ZWwuY29tPiB3cm90ZToKPiA+Pgo+ID4+IEZyb206IFR2cnRrbyBVcnN1 bGluIDx0dnJ0a28udXJzdWxpbkBpbnRlbC5jb20+Cj4gPj4KPiA+PiBSZXN1cnJlY3Qgb2YgdGhl IHByZXZpb3N1bHkgbWVyZ2VkIHBlciBjbGllbnQgZW5naW5lIGJ1c3luZXNzIHBhdGNoZXMuIElu IGEKPiA+PiBudXRzaGVsbCBpdCBlbmFibGVzIGludGVsX2dwdV90b3AgdG8gYmUgbW9yZSB0b3Ao MSkgbGlrZSB1c2VmdWwgYW5kIHNob3cgbm90Cj4gPj4gb25seSBwaHlzaWNhbCBHUFUgZW5naW5l IHVzYWdlIGJ1dCBwZXIgcHJvY2VzcyB2aWV3IGFzIHdlbGwuCj4gPj4KPiA+PiBFeGFtcGxlIHNj cmVlbiBjYXB0dXJlOgo+ID4+IH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cj4gPj4gaW50ZWwtZ3B1 LXRvcCAtICA5MDYvIDk1NSBNSHo7ICAgIDAlIFJDNjsgIDUuMzAgV2F0dHM7ICAgICAgOTMzIGly cXMvcwo+ID4+Cj4gPj4gICAgICAgIElNQyByZWFkczogICAgIDQ0MTQgTWlCL3MKPiA+PiAgICAg ICBJTUMgd3JpdGVzOiAgICAgMzgwNSBNaUIvcwo+ID4+Cj4gPj4gICAgICAgICAgICBFTkdJTkUg ICAgICBCVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSV9TRU1BIE1J X1dBSVQKPiA+PiAgICAgICBSZW5kZXIvM0QvMCAgIDkzLjQ2JSB84paI4paI4paI4paI4paI4paI 4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI 4paI4paI4paI4paI4paI4paI4paI4paLICB8ICAgICAgMCUgICAgICAwJQo+ID4+ICAgICAgICAg QmxpdHRlci8wICAgIDAuMDAlIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAgICAwJSAgICAgIDAlCj4gPj4gICAgICAgICAgIFZpZGVvLzAgICAgMC4wMCUgfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIDAlICAgICAgMCUKPiA+PiAgICBWaWRl b0VuaGFuY2UvMCAgICAwLjAwJSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgICAgMCUgICAgICAwJQo+ID4+Cj4gPj4gICAgUElEICAgICAgICAgICAgTkFNRSAgUmVuZGVy LzNEICAgICAgQmxpdHRlciAgICAgICAgVmlkZW8gICAgICBWaWRlb0VuaGFuY2UKPiA+PiAgIDI3 MzMgICAgICAgbmV2ZXJiYWxsIHzilojilojilojilojilojilojilowgICAgIHx8ICAgICAgICAg ICAgfHwgICAgICAgICAgICB8fCAgICAgICAgICAgIHwKPiA+PiAgIDIwNDcgICAgICAgICAgICBY b3JnIHzilojilojilojiloogICAgICAgIHx8ICAgICAgICAgICAgfHwgICAgICAgICAgICB8fCAg ICAgICAgICAgIHwKPiA+PiAgIDI3MzcgICAgICAgIGdseGdlYXJzIHzilojilo0gICAgICAgICAg fHwgICAgICAgICAgICB8fCAgICAgICAgICAgIHx8ICAgICAgICAgICAgfAo+ID4+ICAgMjEyOCAg ICAgICAgICAgeGZ3bTQgfCAgICAgICAgICAgIHx8ICAgICAgICAgICAgfHwgICAgICAgICAgICB8 fCAgICAgICAgICAgIHwKPiA+PiAgIDIwNDcgICAgICAgICAgICBYb3JnIHwgICAgICAgICAgICB8 fCAgICAgICAgICAgIHx8ICAgICAgICAgICAgfHwgICAgICAgICAgICB8Cj4gPj4gfn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn4KPiA+Pgo+ID4+IEludGVybmFsbHkgd2UgdHJhY2sgdGltZSBzcGVudCBv biBlbmdpbmVzIGZvciBlYWNoIHN0cnVjdCBpbnRlbF9jb250ZXh0LCBib3RoCj4gPj4gZm9yIGN1 cnJlbnQgYW5kIHBhc3QgY29udGV4dHMgYmVsb25naW5nIHRvIGVhY2ggb3BlbiBEUk0gZmlsZS4K PiA+Pgo+ID4+IFRoaXMgY2FuIHNlcnZlIGFzIGEgYnVpbGRpbmcgYmxvY2sgZm9yIHNldmVyYWwg ZmVhdHVyZXMgZnJvbSB0aGUgd2FudGVkIGxpc3Q6Cj4gPj4gc21hcnRlciBzY2hlZHVsZXIgZGVj aXNpb25zLCBnZXRydXNhZ2UoMiktbGlrZSBwZXItR0VNLWNvbnRleHQgZnVuY3Rpb25hbGl0eQo+ ID4+IHdhbnRlZCBieSBzb21lIGN1c3RvbWVycywgc2V0cmxpbWl0KDIpIGxpa2UgY29udHJvbHMs IGNncm91cHMgY29udHJvbGxlciwKPiA+PiBkeW5hbWljIFNTRVUgdHVuaW5nLCAuLi4KPiA+Pgo+ ID4+IFRvIGVuYWJsZSB1c2Vyc3BhY2UgYWNjZXNzIHRvIHRoZSB0cmFja2VkIGRhdGEsIHdlIGV4 cG9zZSB0aW1lIHNwZW50IG9uIEdQVSBwZXIKPiA+PiBjbGllbnQgYW5kIHBlciBlbmdpbmUgY2xh c3MgaW4gc3lzZnMgd2l0aCBhIGhpZXJhcmNoeSBsaWtlIHRoZSBiZWxvdzoKPiA+Pgo+ID4+ICAg ICAgICAgICMgY2QgL3N5cy9jbGFzcy9kcm0vY2FyZDAvY2xpZW50cy8KPiA+PiAgICAgICAgICAj IHRyZWUKPiA+PiAgICAgICAgICAuCj4gPj4gICAgICAgICAg4pSc4pSA4pSAIDcKPiA+PiAgICAg ICAgICDilIIgICDilJzilIDilIAgYnVzeQo+ID4+ICAgICAgICAgIOKUgiAgIOKUgiAgIOKUnOKU gOKUgCAwCj4gPj4gICAgICAgICAg4pSCICAg4pSCICAg4pSc4pSA4pSAIDEKPiA+PiAgICAgICAg ICDilIIgICDilIIgICDilJzilIDilIAgMgo+ID4+ICAgICAgICAgIOKUgiAgIOKUgiAgIOKUlOKU gOKUgCAzCj4gPj4gICAgICAgICAg4pSCICAg4pSc4pSA4pSAIG5hbWUKPiA+PiAgICAgICAgICDi lIIgICDilJTilIDilIAgcGlkCj4gPj4gICAgICAgICAg4pSc4pSA4pSAIDgKPiA+PiAgICAgICAg ICDilIIgICDilJzilIDilIAgYnVzeQo+ID4+ICAgICAgICAgIOKUgiAgIOKUgiAgIOKUnOKUgOKU gCAwCj4gPj4gICAgICAgICAg4pSCICAg4pSCICAg4pSc4pSA4pSAIDEKPiA+PiAgICAgICAgICDi lIIgICDilIIgICDilJzilIDilIAgMgo+ID4+ICAgICAgICAgIOKUgiAgIOKUgiAgIOKUlOKUgOKU gCAzCj4gPj4gICAgICAgICAg4pSCICAg4pSc4pSA4pSAIG5hbWUKPiA+PiAgICAgICAgICDilIIg ICDilJTilIDilIAgcGlkCj4gPj4gICAgICAgICAg4pSU4pSA4pSAIDkKPiA+PiAgICAgICAgICAg ICAg4pSc4pSA4pSAIGJ1c3kKPiA+PiAgICAgICAgICAgICAg4pSCICAg4pSc4pSA4pSAIDAKPiA+ PiAgICAgICAgICAgICAg4pSCICAg4pSc4pSA4pSAIDEKPiA+PiAgICAgICAgICAgICAg4pSCICAg 4pSc4pSA4pSAIDIKPiA+PiAgICAgICAgICAgICAg4pSCICAg4pSU4pSA4pSAIDMKPiA+PiAgICAg ICAgICAgICAg4pSc4pSA4pSAIG5hbWUKPiA+PiAgICAgICAgICAgICAg4pSU4pSA4pSAIHBpZAo+ ID4+Cj4gPj4gRmlsZXMgaW4gJ2J1c3knIGRpcmVjdG9yaWVzIGFyZSBudW1iZXJlZCB1c2luZyB0 aGUgZW5naW5lIGNsYXNzIEFCSSB2YWx1ZXMgYW5kCj4gPj4gdGhleSBjb250YWluIGFjY3VtdWxh dGVkIG5hbm9zZWNvbmRzIGVhY2ggY2xpZW50IHNwZW50IG9uIGVuZ2luZXMgb2YgYQo+ID4+IHJl c3BlY3RpdmUgY2xhc3MuCj4gPgo+ID4gV2UgZGlkIHNvbWV0aGluZyBzaW1pbGFyIGluIGFtZGdw dSB1c2luZyB0aGUgZ3B1IHNjaGVkdWxlci4gIFdlIHRoZW4KPiA+IGV4cG9zZSB0aGUgZGF0YSB2 aWEgZmRpbmZvLiAgU2VlCj4gPiBodHRwczovL2NnaXQuZnJlZWRlc2t0b3Aub3JnL2RybS9kcm0t bWlzYy9jb21taXQvP2lkPTE3NzRiYWE2NGY5Mzk1ZmE4ODRlYTllZDQ5NGJjYjA0M2YzYjgzZjUK PiA+IGh0dHBzOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvZHJtL2RybS1taXNjL2NvbW1pdC8/aWQ9 ODc0NDQyNTQxMTMzZjc4Yzc4YjY4ODBiOGNjNDk1YmFiNWM2MTcwNAo+Cj4gSW50ZXJlc3Rpbmch Cj4KPiBJcyB5b3VycyB3YWxsIHRpbWUgb3IgYWN0dWFsIEdQVSB0aW1lIHRha2luZyBwcmVlbXB0 aW9uIGFuZCBzdWNoIGludG8KPiBhY2NvdW50PyBEbyB5b3UgaGF2ZSBzb21lIHVzZXJzcGFjZSB0 b29scyBwYXJzaW5nIHRoaXMgZGF0YSBhbmQgaG93IHRvCj4gZG8geW91IGNsaWVudCBkaXNjb3Zl cnk/IFByZXN1bWFibHkgdGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSB0aGF0Cj4gZ29pbmcg dGhyb3VnaCBhbGwgb3BlbiBmaWxlIGRlc2NyaXB0b3JzPwoKV2FsbCB0aW1lLiAgSXQgdXNlcyB0 aGUgZmVuY2VzIGluIHRoZSBzY2hlZHVsZXIgdG8gY2FsY3VsYXRlIGVuZ2luZQp0aW1lLiAgV2Ug aGF2ZSBzb21lIHB5dGhvbiBzY3JpcHRzIHRvIG1ha2UgaXQgbG9vayBwcmV0dHksIGJ1dCBtYWlu bHkKanVzdCByZWFkaW5nIHRoZSBmaWxlcyBkaXJlY3RseS4gIElmIHlvdSBrbm93IHRoZSBwcm9j ZXNzLCB5b3UgY2FuCmxvb2sgaXQgdXAgaW4gcHJvY2ZzLgoKPgo+IE91ciBpbXBsZW1lbnRhdGlv biB3YXMgbWVyZ2VkIGluIEphbnVhcnkgYnV0IERhbmllbCB0b29rIGl0IG91dCByZWNlbnRseQo+ IGJlY2F1c2UgaGUgd2FudGVkIHRvIGhhdmUgZGlzY3Vzc2lvbiBhYm91dCBhIGNvbW1vbiB2ZW5k b3IgZnJhbWV3b3JrIGZvcgo+IHRoaXMgd2hvbGUgc3Rvcnkgb24gZHJpLWRldmVsLiBJIHRoaW5r LiArRGFuaWVsIHRvIGNvbW1lbnQuCj4KPiBJIGNvdWxkbid0IGZpbmQgdGhlIHBhdGNoIHlvdSBw YXN0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCB0byBzZWUgaWYgdGhlcmUKPiB3YXMgYW55IHN1Y2gg ZGlzY3Vzc2lvbiBhcm91bmQgeW91ciB2ZXJzaW9uLgoKSXQgd2FzIG9uIHRoZSBhbWQtZ2Z4IG1h aWxpbmcgbGlzdC4KCkFsZXgKCj4KPiBSZWdhcmRzLAo+Cj4gVHZydGtvCj4KPiA+Cj4gPiBBbGV4 Cj4gPgo+ID4KPiA+Pgo+ID4+IFR2cnRrbyBVcnN1bGluICg3KToKPiA+PiAgICBkcm0vaTkxNTog RXhwb3NlIGxpc3Qgb2YgY2xpZW50cyBpbiBzeXNmcwo+ID4+ICAgIGRybS9pOTE1OiBVcGRhdGUg Y2xpZW50IG5hbWUgb24gY29udGV4dCBjcmVhdGUKPiA+PiAgICBkcm0vaTkxNTogTWFrZSBHRU0g Y29udGV4dHMgdHJhY2sgRFJNIGNsaWVudHMKPiA+PiAgICBkcm0vaTkxNTogVHJhY2sgcnVudGlt ZSBzcGVudCBpbiBjbG9zZWQgYW5kIHVucmVhY2hhYmxlIEdFTSBjb250ZXh0cwo+ID4+ICAgIGRy bS9pOTE1OiBUcmFjayBhbGwgdXNlciBjb250ZXh0cyBwZXIgY2xpZW50Cj4gPj4gICAgZHJtL2k5 MTU6IFRyYWNrIGNvbnRleHQgY3VycmVudCBhY3RpdmUgdGltZQo+ID4+ICAgIGRybS9pOTE1OiBF eHBvc2UgcGVyLWVuZ2luZSBjbGllbnQgYnVzeW5lc3MKPiA+Pgo+ID4+ICAgZHJpdmVycy9ncHUv ZHJtL2k5MTUvTWFrZWZpbGUgICAgICAgICAgICAgICAgIHwgICA1ICstCj4gPj4gICBkcml2ZXJz L2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fY29udGV4dC5jICAgfCAgNjEgKystCj4gPj4gICAu Li4vZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9jb250ZXh0X3R5cGVzLmggfCAgMTYgKy0KPiA+ PiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2NvbnRleHQuYyAgICAgICB8ICAyNyAr LQo+ID4+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfY29udGV4dC5oICAgICAgIHwg IDE1ICstCj4gPj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9jb250ZXh0X3R5cGVz LmggfCAgMjQgKy0KPiA+PiAgIC4uLi9kcm0vaTkxNS9ndC9pbnRlbF9leGVjbGlzdHNfc3VibWlz c2lvbi5jICB8ICAyMyArLQo+ID4+ICAgLi4uL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9ndF9jbG9j a191dGlscy5jICAgIHwgICA0ICsKPiA+PiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVs X2xyYy5jICAgICAgICAgICB8ICAyNyArLQo+ID4+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv aW50ZWxfbHJjLmggICAgICAgICAgIHwgIDI0ICsrCj4gPj4gICBkcml2ZXJzL2dwdS9kcm0vaTkx NS9ndC9zZWxmdGVzdF9scmMuYyAgICAgICAgfCAgMTAgKy0KPiA+PiAgIGRyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZHJtX2NsaWVudC5jICAgICAgICB8IDM2NSArKysrKysrKysrKysrKysrKysK PiA+PiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJtX2NsaWVudC5oICAgICAgICB8IDEy MyArKysrKysKPiA+PiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMgICAgICAgICAg ICAgICB8ICAgNiArCj4gPj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oICAgICAg ICAgICAgICAgfCAgIDUgKwo+ID4+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyAg ICAgICAgICAgICAgIHwgIDIxICstCj4gPj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dw dV9lcnJvci5jICAgICAgICAgfCAgMzEgKy0KPiA+PiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ3B1X2Vycm9yLmggICAgICAgICB8ICAgMiArLQo+ID4+ICAgZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9zeXNmcy5jICAgICAgICAgICAgIHwgICA4ICsKPiA+PiAgIDE5IGZpbGVzIGNoYW5n ZWQsIDcxNiBpbnNlcnRpb25zKCspLCA4MSBkZWxldGlvbnMoLSkKPiA+PiAgIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RybV9jbGllbnQuYwo+ID4+ICAgY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJtX2NsaWVudC5oCj4g Pj4KPiA+PiAtLQo+ID4+IDIuMzAuMgo+ID4+Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2ludGVsLWdmeAo=