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=-0.6 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no 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 8F175C07E95 for ; Tue, 13 Jul 2021 16:14:08 +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 59C04611AC for ; Tue, 13 Jul 2021 16:14:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 59C04611AC 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 B1D826E0EF; Tue, 13 Jul 2021 16:14:07 +0000 (UTC) Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by gabe.freedesktop.org (Postfix) with ESMTPS id 05F8D6E0EF; Tue, 13 Jul 2021 16:14:06 +0000 (UTC) Received: by mail-qk1-x72c.google.com with SMTP id q190so22167609qkd.2; Tue, 13 Jul 2021 09:14:06 -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=kSdl91nubrCa9A/aIk2XVb73CpGtetW6fW/0nYa9iQo=; b=mhkucmoqWj0OLAmtFx9KmK6YW9jTfR0APIcHtk22naczNAfP3fUm0LkLoY+51DVW3Y KGk2ErHxf+QPP/QqZTbN3ahIpRimzR6PoQl69z9ZWvWUb1qsNDsyIFeREEBYBYS44naL sAXYj1ZbZzVvI3sr+sEUMLvEWkHarBUzB0OaKEUHQXuKjWadBDHR0Z0DikcD4FtuFrYg AlZqZmoPrRmSoZth/S2TS175nFW5A4CaYZ5PVnROKCcgdA8a5DFscr8PTNoHatDw1ZDH NHD10w05TjmNeqxrz6+JiIVcPh3fggHucAAOWrjTgkuFXqv3OPdqrQ7z+ZxE6rftIRAq rzFg== 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=kSdl91nubrCa9A/aIk2XVb73CpGtetW6fW/0nYa9iQo=; b=Arsh5K9f3l6uTHareG43jR7yqj0HFZbfbJ3v/cC9EfH7HIYKh/fayfwaYFTIEUCqRC xDPMCe0nha+nZFuQOKcXaOMu67T05Ropkza3+E5ajuRkerMrdTbN0IjWvSlZVf54CoBg iipyuhu2Z/Q/XNOrMUqbMFm+l9sh0iD/r0TLqs50TVIiJT4odTHvzW3EjS42MnnX5I9r rHqZ03LLnN557EgYJCjQobklTcHIx0b4nx+rpTub/h8zPBaOY6AL+KniX2n9QeAJKPwG demqSsw6bFuAzVZwi4T7L2rqN5slY7XtcgkND/RZnTgAA+ek0uSwwdkqYSIvFlm8HQ7f 8jfQ== X-Gm-Message-State: AOAM530/PeCMfSdG785sNjUxtZ7VNtpMTnsyF4HJUrCPayt9mmGtaCfy I9WzeEi0apadqI+P0TOvZwI5cP0kmo3w5FsStz0= X-Google-Smtp-Source: ABdhPJyIpC+FMhA5wB2KTc5dyUJn7rraGoU3vcanohts4VYBMOKmtOH3bxqkWGzMzYW5G799jofsOIVGSXRURN+VsPQ= X-Received: by 2002:a37:4388:: with SMTP id q130mr4936952qka.460.1626192846084; Tue, 13 Jul 2021 09:14:06 -0700 (PDT) MIME-Version: 1.0 References: <20210713104554.2381406-1-matthew.auld@intel.com> In-Reply-To: From: Matthew Auld Date: Tue, 13 Jul 2021 17:13:37 +0100 Message-ID: Subject: Re: [Intel-gfx] [PATCH 1/5] drm/i915: document caching related bits To: =?UTF-8?B?VmlsbGUgU3lyasOkbMOk?= 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: Daniel Vetter , Intel Graphics Development , Matthew Auld , ML dri-devel Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On Tue, 13 Jul 2021 at 16:55, Ville Syrj=C3=A4l=C3=A4 wrote: > > On Tue, Jul 13, 2021 at 11:45:50AM +0100, Matthew Auld wrote: > > + /** > > + * @cache_coherent: > > + * > > + * Track whether the pages are coherent with the GPU if reading o= r > > + * writing through the CPU cache. > > + * > > + * This largely depends on the @cache_level, for example if the o= bject > > + * is marked as I915_CACHE_LLC, then GPU access is coherent for b= oth > > + * reads and writes through the CPU cache. > > + * > > + * Note that on platforms with shared-LLC support(HAS_LLC) reads = through > > + * the CPU cache are always coherent, regardless of the @cache_le= vel. On > > + * snooping based platforms this is not the case, unless the full > > + * I915_CACHE_LLC or similar setting is used. > > + * > > + * As a result of this we need to track coherency separately for = reads > > + * and writes, in order to avoid superfluous flushing on shared-L= LC > > + * platforms, for reads. > > + * > > + * I915_BO_CACHE_COHERENT_FOR_READ: > > + * > > + * When reading through the CPU cache, the GPU is still coherent.= Note > > + * that no data has actually been modified here, so it might seem > > + * strange that we care about this. > > + * > > + * As an example, if some object is mapped on the CPU with write-= back > > + * caching, and we read some page, then the cache likely now cont= ains > > + * the data from that read. At this point the cache and main memo= ry > > + * match up, so all good. But next the GPU needs to write some da= ta to > > + * that same page. Now if the @cache_level is I915_CACHE_NONE and= the > > + * the platform doesn't have the shared-LLC, then the GPU will > > + * effectively skip invalidating the cache(or however that works > > + * internally) when writing the new value. This is really bad si= nce the > > + * GPU has just written some new data to main memory, but the CPU= cache > > + * is still valid and now contains stale data. As a result the ne= xt time > > + * we do a cached read with the CPU, we are rewarded with stale d= ata. > > + * Likewise if the cache is later flushed, we might be rewarded w= ith > > + * overwriting main memory with stale data. > > + * > > + * I915_BO_CACHE_COHERENT_FOR_WRITE: > > + * > > + * When writing through the CPU cache, the GPU is still coherent.= Note > > + * that this also implies I915_BO_CACHE_COHERENT_FOR_READ. > > + * > > + * This is never set when I915_CACHE_NONE is used for @cache_leve= l, > > + * where instead we have to manually flush the caches after writi= ng > > + * through the CPU cache. For other cache levels this should be s= et and > > + * the object is therefore considered coherent for both reads and= writes > > + * through the CPU cache. > > I don't remember why we have this read vs. write split and this new > documentation doesn't seem to really explain it either. Hmm, I attempted to explain that earlier: * Note that on platforms with shared-LLC support(HAS_LLC) reads through * the CPU cache are always coherent, regardless of the @cache_level. On * snooping based platforms this is not the case, unless the full * I915_CACHE_LLC or similar setting is used. * * As a result of this we need to track coherency separately for reads * and writes, in order to avoid superfluous flushing on shared-LLC * platforms, for reads. So AFAIK it's just because shared-LLC can be coherent for reads, while also not being coherent for writes(CACHE_NONE), so being able to track each separately is kind of needed to avoid unnecessary flushing for the read cases i.e simple boolean for coherent vs non-coherent is not enough. I can try to reword things to make that more clear. > > Is it for optimizing some display related case where we can omit the > invalidates but still have to do the writeback to keep the display > engine happy? > > -- > Ville Syrj=C3=A4l=C3=A4 > Intel 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=-0.6 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no 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 34F02C11F66 for ; Tue, 13 Jul 2021 16:14:12 +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 07963611AC for ; Tue, 13 Jul 2021 16:14:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 07963611AC 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 3E1D26E0F0; Tue, 13 Jul 2021 16:14:08 +0000 (UTC) Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by gabe.freedesktop.org (Postfix) with ESMTPS id 05F8D6E0EF; Tue, 13 Jul 2021 16:14:06 +0000 (UTC) Received: by mail-qk1-x72c.google.com with SMTP id q190so22167609qkd.2; Tue, 13 Jul 2021 09:14:06 -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=kSdl91nubrCa9A/aIk2XVb73CpGtetW6fW/0nYa9iQo=; b=mhkucmoqWj0OLAmtFx9KmK6YW9jTfR0APIcHtk22naczNAfP3fUm0LkLoY+51DVW3Y KGk2ErHxf+QPP/QqZTbN3ahIpRimzR6PoQl69z9ZWvWUb1qsNDsyIFeREEBYBYS44naL sAXYj1ZbZzVvI3sr+sEUMLvEWkHarBUzB0OaKEUHQXuKjWadBDHR0Z0DikcD4FtuFrYg AlZqZmoPrRmSoZth/S2TS175nFW5A4CaYZ5PVnROKCcgdA8a5DFscr8PTNoHatDw1ZDH NHD10w05TjmNeqxrz6+JiIVcPh3fggHucAAOWrjTgkuFXqv3OPdqrQ7z+ZxE6rftIRAq rzFg== 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=kSdl91nubrCa9A/aIk2XVb73CpGtetW6fW/0nYa9iQo=; b=Arsh5K9f3l6uTHareG43jR7yqj0HFZbfbJ3v/cC9EfH7HIYKh/fayfwaYFTIEUCqRC xDPMCe0nha+nZFuQOKcXaOMu67T05Ropkza3+E5ajuRkerMrdTbN0IjWvSlZVf54CoBg iipyuhu2Z/Q/XNOrMUqbMFm+l9sh0iD/r0TLqs50TVIiJT4odTHvzW3EjS42MnnX5I9r rHqZ03LLnN557EgYJCjQobklTcHIx0b4nx+rpTub/h8zPBaOY6AL+KniX2n9QeAJKPwG demqSsw6bFuAzVZwi4T7L2rqN5slY7XtcgkND/RZnTgAA+ek0uSwwdkqYSIvFlm8HQ7f 8jfQ== X-Gm-Message-State: AOAM530/PeCMfSdG785sNjUxtZ7VNtpMTnsyF4HJUrCPayt9mmGtaCfy I9WzeEi0apadqI+P0TOvZwI5cP0kmo3w5FsStz0= X-Google-Smtp-Source: ABdhPJyIpC+FMhA5wB2KTc5dyUJn7rraGoU3vcanohts4VYBMOKmtOH3bxqkWGzMzYW5G799jofsOIVGSXRURN+VsPQ= X-Received: by 2002:a37:4388:: with SMTP id q130mr4936952qka.460.1626192846084; Tue, 13 Jul 2021 09:14:06 -0700 (PDT) MIME-Version: 1.0 References: <20210713104554.2381406-1-matthew.auld@intel.com> In-Reply-To: From: Matthew Auld Date: Tue, 13 Jul 2021 17:13:37 +0100 Message-ID: To: =?UTF-8?B?VmlsbGUgU3lyasOkbMOk?= Subject: Re: [Intel-gfx] [PATCH 1/5] drm/i915: document caching related bits 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: Daniel Vetter , Intel Graphics Development , Matthew Auld , ML dri-devel Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gVHVlLCAxMyBKdWwgMjAyMSBhdCAxNjo1NSwgVmlsbGUgU3lyasOkbMOkCjx2aWxsZS5zeXJq YWxhQGxpbnV4LmludGVsLmNvbT4gd3JvdGU6Cj4KPiBPbiBUdWUsIEp1bCAxMywgMjAyMSBhdCAx MTo0NTo1MEFNICswMTAwLCBNYXR0aGV3IEF1bGQgd3JvdGU6Cj4gPiArICAgICAvKioKPiA+ICsg ICAgICAqIEBjYWNoZV9jb2hlcmVudDoKPiA+ICsgICAgICAqCj4gPiArICAgICAgKiBUcmFjayB3 aGV0aGVyIHRoZSBwYWdlcyBhcmUgY29oZXJlbnQgd2l0aCB0aGUgR1BVIGlmIHJlYWRpbmcgb3IK PiA+ICsgICAgICAqIHdyaXRpbmcgdGhyb3VnaCB0aGUgQ1BVIGNhY2hlLgo+ID4gKyAgICAgICoK PiA+ICsgICAgICAqIFRoaXMgbGFyZ2VseSBkZXBlbmRzIG9uIHRoZSBAY2FjaGVfbGV2ZWwsIGZv ciBleGFtcGxlIGlmIHRoZSBvYmplY3QKPiA+ICsgICAgICAqIGlzIG1hcmtlZCBhcyBJOTE1X0NB Q0hFX0xMQywgdGhlbiBHUFUgYWNjZXNzIGlzIGNvaGVyZW50IGZvciBib3RoCj4gPiArICAgICAg KiByZWFkcyBhbmQgd3JpdGVzIHRocm91Z2ggdGhlIENQVSBjYWNoZS4KPiA+ICsgICAgICAqCj4g PiArICAgICAgKiBOb3RlIHRoYXQgb24gcGxhdGZvcm1zIHdpdGggc2hhcmVkLUxMQyBzdXBwb3J0 KEhBU19MTEMpIHJlYWRzIHRocm91Z2gKPiA+ICsgICAgICAqIHRoZSBDUFUgY2FjaGUgYXJlIGFs d2F5cyBjb2hlcmVudCwgcmVnYXJkbGVzcyBvZiB0aGUgQGNhY2hlX2xldmVsLiBPbgo+ID4gKyAg ICAgICogc25vb3BpbmcgYmFzZWQgcGxhdGZvcm1zIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB1bmxl c3MgdGhlIGZ1bGwKPiA+ICsgICAgICAqIEk5MTVfQ0FDSEVfTExDIG9yIHNpbWlsYXIgc2V0dGlu ZyBpcyB1c2VkLgo+ID4gKyAgICAgICoKPiA+ICsgICAgICAqIEFzIGEgcmVzdWx0IG9mIHRoaXMg d2UgbmVlZCB0byB0cmFjayBjb2hlcmVuY3kgc2VwYXJhdGVseSBmb3IgcmVhZHMKPiA+ICsgICAg ICAqIGFuZCB3cml0ZXMsIGluIG9yZGVyIHRvIGF2b2lkIHN1cGVyZmx1b3VzIGZsdXNoaW5nIG9u IHNoYXJlZC1MTEMKPiA+ICsgICAgICAqIHBsYXRmb3JtcywgZm9yIHJlYWRzLgo+ID4gKyAgICAg ICoKPiA+ICsgICAgICAqIEk5MTVfQk9fQ0FDSEVfQ09IRVJFTlRfRk9SX1JFQUQ6Cj4gPiArICAg ICAgKgo+ID4gKyAgICAgICogV2hlbiByZWFkaW5nIHRocm91Z2ggdGhlIENQVSBjYWNoZSwgdGhl IEdQVSBpcyBzdGlsbCBjb2hlcmVudC4gTm90ZQo+ID4gKyAgICAgICogdGhhdCBubyBkYXRhIGhh cyBhY3R1YWxseSBiZWVuIG1vZGlmaWVkIGhlcmUsIHNvIGl0IG1pZ2h0IHNlZW0KPiA+ICsgICAg ICAqIHN0cmFuZ2UgdGhhdCB3ZSBjYXJlIGFib3V0IHRoaXMuCj4gPiArICAgICAgKgo+ID4gKyAg ICAgICogQXMgYW4gZXhhbXBsZSwgaWYgc29tZSBvYmplY3QgaXMgbWFwcGVkIG9uIHRoZSBDUFUg d2l0aCB3cml0ZS1iYWNrCj4gPiArICAgICAgKiBjYWNoaW5nLCBhbmQgd2UgcmVhZCBzb21lIHBh Z2UsIHRoZW4gdGhlIGNhY2hlIGxpa2VseSBub3cgY29udGFpbnMKPiA+ICsgICAgICAqIHRoZSBk YXRhIGZyb20gdGhhdCByZWFkLiBBdCB0aGlzIHBvaW50IHRoZSBjYWNoZSBhbmQgbWFpbiBtZW1v cnkKPiA+ICsgICAgICAqIG1hdGNoIHVwLCBzbyBhbGwgZ29vZC4gQnV0IG5leHQgdGhlIEdQVSBu ZWVkcyB0byB3cml0ZSBzb21lIGRhdGEgdG8KPiA+ICsgICAgICAqIHRoYXQgc2FtZSBwYWdlLiBO b3cgaWYgdGhlIEBjYWNoZV9sZXZlbCBpcyBJOTE1X0NBQ0hFX05PTkUgYW5kIHRoZQo+ID4gKyAg ICAgICogdGhlIHBsYXRmb3JtIGRvZXNuJ3QgaGF2ZSB0aGUgc2hhcmVkLUxMQywgdGhlbiB0aGUg R1BVIHdpbGwKPiA+ICsgICAgICAqIGVmZmVjdGl2ZWx5IHNraXAgaW52YWxpZGF0aW5nIHRoZSBj YWNoZShvciBob3dldmVyIHRoYXQgd29ya3MKPiA+ICsgICAgICAqIGludGVybmFsbHkpIHdoZW4g d3JpdGluZyB0aGUgbmV3IHZhbHVlLiAgVGhpcyBpcyByZWFsbHkgYmFkIHNpbmNlIHRoZQo+ID4g KyAgICAgICogR1BVIGhhcyBqdXN0IHdyaXR0ZW4gc29tZSBuZXcgZGF0YSB0byBtYWluIG1lbW9y eSwgYnV0IHRoZSBDUFUgY2FjaGUKPiA+ICsgICAgICAqIGlzIHN0aWxsIHZhbGlkIGFuZCBub3cg Y29udGFpbnMgc3RhbGUgZGF0YS4gQXMgYSByZXN1bHQgdGhlIG5leHQgdGltZQo+ID4gKyAgICAg ICogd2UgZG8gYSBjYWNoZWQgcmVhZCB3aXRoIHRoZSBDUFUsIHdlIGFyZSByZXdhcmRlZCB3aXRo IHN0YWxlIGRhdGEuCj4gPiArICAgICAgKiBMaWtld2lzZSBpZiB0aGUgY2FjaGUgaXMgbGF0ZXIg Zmx1c2hlZCwgd2UgbWlnaHQgYmUgcmV3YXJkZWQgd2l0aAo+ID4gKyAgICAgICogb3ZlcndyaXRp bmcgbWFpbiBtZW1vcnkgd2l0aCBzdGFsZSBkYXRhLgo+ID4gKyAgICAgICoKPiA+ICsgICAgICAq IEk5MTVfQk9fQ0FDSEVfQ09IRVJFTlRfRk9SX1dSSVRFOgo+ID4gKyAgICAgICoKPiA+ICsgICAg ICAqIFdoZW4gd3JpdGluZyB0aHJvdWdoIHRoZSBDUFUgY2FjaGUsIHRoZSBHUFUgaXMgc3RpbGwg Y29oZXJlbnQuIE5vdGUKPiA+ICsgICAgICAqIHRoYXQgdGhpcyBhbHNvIGltcGxpZXMgSTkxNV9C T19DQUNIRV9DT0hFUkVOVF9GT1JfUkVBRC4KPiA+ICsgICAgICAqCj4gPiArICAgICAgKiBUaGlz IGlzIG5ldmVyIHNldCB3aGVuIEk5MTVfQ0FDSEVfTk9ORSBpcyB1c2VkIGZvciBAY2FjaGVfbGV2 ZWwsCj4gPiArICAgICAgKiB3aGVyZSBpbnN0ZWFkIHdlIGhhdmUgdG8gbWFudWFsbHkgZmx1c2gg dGhlIGNhY2hlcyBhZnRlciB3cml0aW5nCj4gPiArICAgICAgKiB0aHJvdWdoIHRoZSBDUFUgY2Fj aGUuIEZvciBvdGhlciBjYWNoZSBsZXZlbHMgdGhpcyBzaG91bGQgYmUgc2V0IGFuZAo+ID4gKyAg ICAgICogdGhlIG9iamVjdCBpcyB0aGVyZWZvcmUgY29uc2lkZXJlZCBjb2hlcmVudCBmb3IgYm90 aCByZWFkcyBhbmQgd3JpdGVzCj4gPiArICAgICAgKiB0aHJvdWdoIHRoZSBDUFUgY2FjaGUuCj4K PiBJIGRvbid0IHJlbWVtYmVyIHdoeSB3ZSBoYXZlIHRoaXMgcmVhZCB2cy4gd3JpdGUgc3BsaXQg YW5kIHRoaXMgbmV3Cj4gZG9jdW1lbnRhdGlvbiBkb2Vzbid0IHNlZW0gdG8gcmVhbGx5IGV4cGxh aW4gaXQgZWl0aGVyLgoKSG1tLCBJIGF0dGVtcHRlZCB0byBleHBsYWluIHRoYXQgZWFybGllcjoK CiogTm90ZSB0aGF0IG9uIHBsYXRmb3JtcyB3aXRoIHNoYXJlZC1MTEMgc3VwcG9ydChIQVNfTExD KSByZWFkcyB0aHJvdWdoCiogdGhlIENQVSBjYWNoZSBhcmUgYWx3YXlzIGNvaGVyZW50LCByZWdh cmRsZXNzIG9mIHRoZSBAY2FjaGVfbGV2ZWwuIE9uCiogc25vb3BpbmcgYmFzZWQgcGxhdGZvcm1z IHRoaXMgaXMgbm90IHRoZSBjYXNlLCB1bmxlc3MgdGhlIGZ1bGwKKiBJOTE1X0NBQ0hFX0xMQyBv ciBzaW1pbGFyIHNldHRpbmcgaXMgdXNlZC4KKgoqIEFzIGEgcmVzdWx0IG9mIHRoaXMgd2UgbmVl ZCB0byB0cmFjayBjb2hlcmVuY3kgc2VwYXJhdGVseSBmb3IgcmVhZHMKKiBhbmQgd3JpdGVzLCBp biBvcmRlciB0byBhdm9pZCBzdXBlcmZsdW91cyBmbHVzaGluZyBvbiBzaGFyZWQtTExDCiogcGxh dGZvcm1zLCBmb3IgcmVhZHMuCgpTbyBBRkFJSyBpdCdzIGp1c3QgYmVjYXVzZSBzaGFyZWQtTExD IGNhbiBiZSBjb2hlcmVudCBmb3IgcmVhZHMsIHdoaWxlCmFsc28gbm90IGJlaW5nIGNvaGVyZW50 IGZvciB3cml0ZXMoQ0FDSEVfTk9ORSksIHNvIGJlaW5nIGFibGUgdG8gdHJhY2sKZWFjaCBzZXBh cmF0ZWx5IGlzIGtpbmQgb2YgbmVlZGVkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGZsdXNoaW5nIGZv cgp0aGUgcmVhZCBjYXNlcyBpLmUgc2ltcGxlIGJvb2xlYW4gZm9yIGNvaGVyZW50IHZzIG5vbi1j b2hlcmVudCBpcyBub3QKZW5vdWdoLgoKSSBjYW4gdHJ5IHRvIHJld29yZCB0aGluZ3MgdG8gbWFr ZSB0aGF0IG1vcmUgY2xlYXIuCgo+Cj4gSXMgaXQgZm9yIG9wdGltaXppbmcgc29tZSBkaXNwbGF5 IHJlbGF0ZWQgY2FzZSB3aGVyZSB3ZSBjYW4gb21pdCB0aGUKPiBpbnZhbGlkYXRlcyBidXQgc3Rp bGwgaGF2ZSB0byBkbyB0aGUgd3JpdGViYWNrIHRvIGtlZXAgdGhlIGRpc3BsYXkKPiBlbmdpbmUg aGFwcHk/Cj4KPiAtLQo+IFZpbGxlIFN5cmrDpGzDpAo+IEludGVsCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50 ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=