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=-2.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT 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 A8295C46469 for ; Wed, 12 Sep 2018 13:52:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5B0F420854 for ; Wed, 12 Sep 2018 13:52:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5B0F420854 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727764AbeILS4v (ORCPT ); Wed, 12 Sep 2018 14:56:51 -0400 Received: from foss.arm.com ([217.140.101.70]:59938 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726932AbeILS4v (ORCPT ); Wed, 12 Sep 2018 14:56:51 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E144280D; Wed, 12 Sep 2018 06:52:13 -0700 (PDT) Received: from DESKTOP-E1NTVVP.localdomain (desktop-e1ntvvp.cambridge.arm.com [10.1.34.160]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C5C743F703; Wed, 12 Sep 2018 06:52:11 -0700 (PDT) Date: Wed, 12 Sep 2018 14:52:07 +0100 From: Brian Starkey To: dri-devel@lists.freedesktop.org, daniel@fooishbar.org, airlied@linux.ie, gustavo@padovan.org, maarten.lankhorst@linux.intel.com, seanpaul@chromium.org, linux-kernel@vger.kernel.org, alexandru-cosmin.gheorghe@arm.com, liviu.dudau@arm.com, ayan.halder@arm.com, tfiga@chromium.org, hoegsberg@chromium.org Subject: Re: [RFC PATCH v2 1/3] drm/fourcc: Add 'bpp' field for formats with non-integer bytes-per-pixel Message-ID: <20180912135206.GA21008@DESKTOP-E1NTVVP.localdomain> References: <20180823152343.6474-1-brian.starkey@arm.com> <20180823152343.6474-2-brian.starkey@arm.com> <20180831081730.GM21634@phenom.ffwll.local> <20180907124535.GA3461@DESKTOP-E1NTVVP.localdomain> <20180907192626.GA7176@phenom.ffwll.local> <20180910085003.GA36@DESKTOP-E1NTVVP.localdomain> <20180910195325.GC19774@phenom.ffwll.local> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: <20180910195325.GC19774@phenom.ffwll.local> User-Agent: Mutt/1.9.4 (2018-02-28) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Sep 10, 2018 at 09:53:25PM +0200, Daniel Vetter wrote: >On Mon, Sep 10, 2018 at 09:50:03AM +0100, Brian Starkey wrote: >> Hi, >> >> On Fri, Sep 07, 2018 at 09:28:44PM +0200, Daniel Vetter wrote: >> > On Fri, Sep 07, 2018 at 01:45:36PM +0100, Brian Starkey wrote: >> > > Hi Daniel, >> > > >> > > On Fri, Aug 31, 2018 at 10:17:30AM +0200, Daniel Vetter wrote: >> > > > On Thu, Aug 23, 2018 at 04:23:41PM +0100, Brian Starkey wrote: >> > > > > Some formats have a non-integer number of bytes per pixel, which can't >> > > > > be handled with the existing 'cpp' field in drm_format_info. To handle >> > > > > these formats, add a 'bpp' field, which is only used if cpp[0] == 0. >> > > > > >> > > > > This updates all the users of format->cpp in the core DRM code, >> > > > > converting them to use a new function to get the bits-per-pixel for any >> > > > > format. >> > > > > >> > > > > It's assumed that drivers will use the 'bpp' field when they add support >> > > > > for pixel formats with non-integer bytes-per-pixel. >> > > > > >> > > > > Signed-off-by: Brian Starkey >> > > > >> > > > I assume you still require that stuff is eventually aligned to bytes? In >> > > > that case, can we subsume this into the tile work Alex is doing? It's >> > > > essentially just another special case of having storage-size units >> > > > measured in bytes which span more than 1x1 pixel. And I kinda don't want a >> > > > metric pile of special cases here in the format code, because that just >> > > > means every driver handles a different subset, with different bugs. >> > > > -Daniel >> > > >> > > Sorry for the delay, been struggling to free some cycles to think >> > > about this. >> > > >> > > I'm not sure how to pull this in with the tiling stuff. In the AFBC >> > > case then our AFBC superblocks are always nice round numbers (256 >> > > pixels), and so it does end up being a multiple of bytes. >> > > >> > > However, AFBC supports different superblock sizes, so picking just one >> > > doesn't really work out, and putting AFBC in the core format table >> > > which reflects AFBC doesn't seem good. >> > > >> > > We could make something up (e.g. call these formats "tiled" with 2x4 >> > > tiles, which guarantees a multiple of 8), but it would be an >> > > arbitrarily-selected lie, which often seems to spell trouble. If we >> > > did do that, would you re-define cpp as "bytes-per-tile"? Otherwise >> > > we still need to add a new field anyway. >> > > >> > > What's the pile of special cases you're worried about? The helper I've >> > > added here means that drivers which need to care can use one API and >> > > not implement their own bugs. >> > >> > I'm confused ... the new bits-per-pixel stuff you're adding here is for >> > yuv formats, not afbc. I'm just suggesting we have only 1 way of >> > describing such formats that need more descriptive power than cpp, whether >> > they have some kind of pixel-groups or small tiles. >> >> Well, not really. The three formats which have non-integer cpp are: >> DRM_FORMAT_VUY101010, DRM_FORMAT_YUV420_8BIT and >> DRM_FORMAT_YUV420_10BIT. These formats are only valid with non-linear >> modifiers (no linear encoding is defined). Mali only supports them >> with AFBC. >> >> The formats themselves have no notion of tiling or grouping - the >> modifier adds that. I'm not aware of any non-AFBC uses of these >> formats, so I don't want to "make up" a small-tile layout restriction >> for them. > >Ah, I missed that. > >> > For very special stuff like afbc you need to validate in the driver >> > anyway, too complicated. So I have no idea why you bring this up here? >> >> Sure, we can just let drivers provide their own format_info's for >> these, if that's what you prefer. The core format checking code can >> error out if it ever encounters them. > >It's format_info we're talking about. What I mean is that you just set all >these to 0 and let the format_info code ignore it. And then having a >bespoke drm_format_check_afbc helper function or similar, which checks all >the layout restrictions of afbc. > >I still maintain that bpp and tile_size are equavalent, and we really >don't need both. Both are defacto a form of numerator/denumerator. If you >don't like that you have to introduce "fake" tiles for afbc, then we can >rename tile_size to numerator and tile_h/w to denumerator_h/w. Doesn't >change one bit of the math. bpp simply hardcodes a denumerator of 8, and I >don't see why we need that special case. Except if you love to write >redundant self tests for all the math :-) > >So two options that I think are reasonable: >- one common numerator/denumerator. I don't care how you call that > bikeshed. Sorry for being dense, but I'm still struggling to get my head around what you're suggesting. In particular "bpp simply hardcodes a denumerator of 8" didn't make any sense to me. Could you give concrete examples for how you think this would look for e.g. - DRM_FORMAT_VUY101010. 30-bits per pixel, no tiling. - DRM_FORMAT_Y0L2. 16-bits per pixel, 2x2 pixel tiles I think we need two things: - The size, in bits, of a tile - The width and height, in pixels, of a tile (currently implicitly 1x1) Do you disagree? Are you just saying that instead of adding .bpp I should be replacing .cpp with .bpp wholesale? >- don't check afbc using format_info, have your own helper that does that > using custom code. We can do this, no problem. Thanks, -Brian From mboxrd@z Thu Jan 1 00:00:00 1970 From: Brian Starkey Subject: Re: [RFC PATCH v2 1/3] drm/fourcc: Add 'bpp' field for formats with non-integer bytes-per-pixel Date: Wed, 12 Sep 2018 14:52:07 +0100 Message-ID: <20180912135206.GA21008@DESKTOP-E1NTVVP.localdomain> References: <20180823152343.6474-1-brian.starkey@arm.com> <20180823152343.6474-2-brian.starkey@arm.com> <20180831081730.GM21634@phenom.ffwll.local> <20180907124535.GA3461@DESKTOP-E1NTVVP.localdomain> <20180907192626.GA7176@phenom.ffwll.local> <20180910085003.GA36@DESKTOP-E1NTVVP.localdomain> <20180910195325.GC19774@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from foss.arm.com (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by gabe.freedesktop.org (Postfix) with ESMTP id 7398C89690 for ; Wed, 12 Sep 2018 13:52:14 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20180910195325.GC19774@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org, daniel@fooishbar.org, airlied@linux.ie, gustavo@padovan.org, maarten.lankhorst@linux.intel.com, seanpaul@chromium.org, linux-kernel@vger.kernel.org, alexandru-cosmin.gheorghe@arm.com, liviu.dudau@arm.com, ayan.halder@arm.com, tfiga@chromium.org, hoegsberg@chromium.org List-Id: dri-devel@lists.freedesktop.org T24gTW9uLCBTZXAgMTAsIDIwMTggYXQgMDk6NTM6MjVQTSArMDIwMCwgRGFuaWVsIFZldHRlciB3 cm90ZToKPk9uIE1vbiwgU2VwIDEwLCAyMDE4IGF0IDA5OjUwOjAzQU0gKzAxMDAsIEJyaWFuIFN0 YXJrZXkgd3JvdGU6Cj4+IEhpLAo+Pgo+PiBPbiBGcmksIFNlcCAwNywgMjAxOCBhdCAwOToyODo0 NFBNICswMjAwLCBEYW5pZWwgVmV0dGVyIHdyb3RlOgo+PiA+IE9uIEZyaSwgU2VwIDA3LCAyMDE4 IGF0IDAxOjQ1OjM2UE0gKzAxMDAsIEJyaWFuIFN0YXJrZXkgd3JvdGU6Cj4+ID4gPiBIaSBEYW5p ZWwsCj4+ID4gPgo+PiA+ID4gT24gRnJpLCBBdWcgMzEsIDIwMTggYXQgMTA6MTc6MzBBTSArMDIw MCwgRGFuaWVsIFZldHRlciB3cm90ZToKPj4gPiA+ID4gT24gVGh1LCBBdWcgMjMsIDIwMTggYXQg MDQ6MjM6NDFQTSArMDEwMCwgQnJpYW4gU3RhcmtleSB3cm90ZToKPj4gPiA+ID4gPiBTb21lIGZv cm1hdHMgaGF2ZSBhIG5vbi1pbnRlZ2VyIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwsIHdoaWNo IGNhbid0Cj4+ID4gPiA+ID4gYmUgaGFuZGxlZCB3aXRoIHRoZSBleGlzdGluZyAnY3BwJyBmaWVs ZCBpbiBkcm1fZm9ybWF0X2luZm8uIFRvIGhhbmRsZQo+PiA+ID4gPiA+IHRoZXNlIGZvcm1hdHMs IGFkZCBhICdicHAnIGZpZWxkLCB3aGljaCBpcyBvbmx5IHVzZWQgaWYgY3BwWzBdID09IDAuCj4+ ID4gPiA+ID4KPj4gPiA+ID4gPiBUaGlzIHVwZGF0ZXMgYWxsIHRoZSB1c2VycyBvZiBmb3JtYXQt PmNwcCBpbiB0aGUgY29yZSBEUk0gY29kZSwKPj4gPiA+ID4gPiBjb252ZXJ0aW5nIHRoZW0gdG8g dXNlIGEgbmV3IGZ1bmN0aW9uIHRvIGdldCB0aGUgYml0cy1wZXItcGl4ZWwgZm9yIGFueQo+PiA+ ID4gPiA+IGZvcm1hdC4KPj4gPiA+ID4gPgo+PiA+ID4gPiA+IEl0J3MgYXNzdW1lZCB0aGF0IGRy aXZlcnMgd2lsbCB1c2UgdGhlICdicHAnIGZpZWxkIHdoZW4gdGhleSBhZGQgc3VwcG9ydAo+PiA+ ID4gPiA+IGZvciBwaXhlbCBmb3JtYXRzIHdpdGggbm9uLWludGVnZXIgYnl0ZXMtcGVyLXBpeGVs Lgo+PiA+ID4gPiA+Cj4+ID4gPiA+ID4gU2lnbmVkLW9mZi1ieTogQnJpYW4gU3RhcmtleSA8YnJp YW4uc3RhcmtleUBhcm0uY29tPgo+PiA+ID4gPgo+PiA+ID4gPiBJIGFzc3VtZSB5b3Ugc3RpbGwg cmVxdWlyZSB0aGF0IHN0dWZmIGlzIGV2ZW50dWFsbHkgYWxpZ25lZCB0byBieXRlcz8gSW4KPj4g PiA+ID4gdGhhdCBjYXNlLCBjYW4gd2Ugc3Vic3VtZSB0aGlzIGludG8gdGhlIHRpbGUgd29yayBB bGV4IGlzIGRvaW5nPyBJdCdzCj4+ID4gPiA+IGVzc2VudGlhbGx5IGp1c3QgYW5vdGhlciBzcGVj aWFsIGNhc2Ugb2YgaGF2aW5nIHN0b3JhZ2Utc2l6ZSB1bml0cwo+PiA+ID4gPiBtZWFzdXJlZCBp biBieXRlcyB3aGljaCBzcGFuIG1vcmUgdGhhbiAxeDEgcGl4ZWwuIEFuZCBJIGtpbmRhIGRvbid0 IHdhbnQgYQo+PiA+ID4gPiBtZXRyaWMgcGlsZSBvZiBzcGVjaWFsIGNhc2VzIGhlcmUgaW4gdGhl IGZvcm1hdCBjb2RlLCBiZWNhdXNlIHRoYXQganVzdAo+PiA+ID4gPiBtZWFucyBldmVyeSBkcml2 ZXIgaGFuZGxlcyBhIGRpZmZlcmVudCBzdWJzZXQsIHdpdGggZGlmZmVyZW50IGJ1Z3MuCj4+ID4g PiA+IC1EYW5pZWwKPj4gPiA+Cj4+ID4gPiBTb3JyeSBmb3IgdGhlIGRlbGF5LCBiZWVuIHN0cnVn Z2xpbmcgdG8gZnJlZSBzb21lIGN5Y2xlcyB0byB0aGluawo+PiA+ID4gYWJvdXQgdGhpcy4KPj4g PiA+Cj4+ID4gPiBJJ20gbm90IHN1cmUgaG93IHRvIHB1bGwgdGhpcyBpbiB3aXRoIHRoZSB0aWxp bmcgc3R1ZmYuIEluIHRoZSBBRkJDCj4+ID4gPiBjYXNlIHRoZW4gb3VyIEFGQkMgc3VwZXJibG9j a3MgYXJlIGFsd2F5cyBuaWNlIHJvdW5kIG51bWJlcnMgKDI1Ngo+PiA+ID4gcGl4ZWxzKSwgYW5k IHNvIGl0IGRvZXMgZW5kIHVwIGJlaW5nIGEgbXVsdGlwbGUgb2YgYnl0ZXMuCj4+ID4gPgo+PiA+ ID4gSG93ZXZlciwgQUZCQyBzdXBwb3J0cyBkaWZmZXJlbnQgc3VwZXJibG9jayBzaXplcywgc28g cGlja2luZyBqdXN0IG9uZQo+PiA+ID4gZG9lc24ndCByZWFsbHkgd29yayBvdXQsIGFuZCBwdXR0 aW5nIEFGQkMgaW4gdGhlIGNvcmUgZm9ybWF0IHRhYmxlCj4+ID4gPiB3aGljaCByZWZsZWN0cyBB RkJDIGRvZXNuJ3Qgc2VlbSBnb29kLgo+PiA+ID4KPj4gPiA+IFdlIGNvdWxkIG1ha2Ugc29tZXRo aW5nIHVwIChlLmcuIGNhbGwgdGhlc2UgZm9ybWF0cyAidGlsZWQiIHdpdGggMng0Cj4+ID4gPiB0 aWxlcywgd2hpY2ggZ3VhcmFudGVlcyBhIG11bHRpcGxlIG9mIDgpLCBidXQgaXQgd291bGQgYmUg YW4KPj4gPiA+IGFyYml0cmFyaWx5LXNlbGVjdGVkIGxpZSwgd2hpY2ggb2Z0ZW4gc2VlbXMgdG8g c3BlbGwgdHJvdWJsZS4gSWYgd2UKPj4gPiA+IGRpZCBkbyB0aGF0LCB3b3VsZCB5b3UgcmUtZGVm aW5lIGNwcCBhcyAiYnl0ZXMtcGVyLXRpbGUiPyBPdGhlcndpc2UKPj4gPiA+IHdlIHN0aWxsIG5l ZWQgdG8gYWRkIGEgbmV3IGZpZWxkIGFueXdheS4KPj4gPiA+Cj4+ID4gPiBXaGF0J3MgdGhlIHBp bGUgb2Ygc3BlY2lhbCBjYXNlcyB5b3UncmUgd29ycmllZCBhYm91dD8gVGhlIGhlbHBlciBJJ3Zl Cj4+ID4gPiBhZGRlZCBoZXJlIG1lYW5zIHRoYXQgZHJpdmVycyB3aGljaCBuZWVkIHRvIGNhcmUg Y2FuIHVzZSBvbmUgQVBJIGFuZAo+PiA+ID4gbm90IGltcGxlbWVudCB0aGVpciBvd24gYnVncy4K Pj4gPgo+PiA+IEknbSBjb25mdXNlZCAuLi4gdGhlIG5ldyBiaXRzLXBlci1waXhlbCBzdHVmZiB5 b3UncmUgYWRkaW5nIGhlcmUgaXMgZm9yCj4+ID4geXV2IGZvcm1hdHMsIG5vdCBhZmJjLiBJJ20g anVzdCBzdWdnZXN0aW5nIHdlIGhhdmUgb25seSAxIHdheSBvZgo+PiA+IGRlc2NyaWJpbmcgc3Vj aCBmb3JtYXRzIHRoYXQgbmVlZCBtb3JlIGRlc2NyaXB0aXZlIHBvd2VyIHRoYW4gY3BwLCB3aGV0 aGVyCj4+ID4gdGhleSBoYXZlIHNvbWUga2luZCBvZiBwaXhlbC1ncm91cHMgb3Igc21hbGwgdGls ZXMuCj4+Cj4+IFdlbGwsIG5vdCByZWFsbHkuIFRoZSB0aHJlZSBmb3JtYXRzIHdoaWNoIGhhdmUg bm9uLWludGVnZXIgY3BwIGFyZToKPj4gRFJNX0ZPUk1BVF9WVVkxMDEwMTAsIERSTV9GT1JNQVRf WVVWNDIwXzhCSVQgYW5kCj4+IERSTV9GT1JNQVRfWVVWNDIwXzEwQklULiBUaGVzZSBmb3JtYXRz IGFyZSBvbmx5IHZhbGlkIHdpdGggbm9uLWxpbmVhcgo+PiBtb2RpZmllcnMgKG5vIGxpbmVhciBl bmNvZGluZyBpcyBkZWZpbmVkKS4gTWFsaSBvbmx5IHN1cHBvcnRzIHRoZW0KPj4gd2l0aCBBRkJD Lgo+Pgo+PiBUaGUgZm9ybWF0cyB0aGVtc2VsdmVzIGhhdmUgbm8gbm90aW9uIG9mIHRpbGluZyBv ciBncm91cGluZyAtIHRoZQo+PiBtb2RpZmllciBhZGRzIHRoYXQuIEknbSBub3QgYXdhcmUgb2Yg YW55IG5vbi1BRkJDIHVzZXMgb2YgdGhlc2UKPj4gZm9ybWF0cywgc28gSSBkb24ndCB3YW50IHRv ICJtYWtlIHVwIiBhIHNtYWxsLXRpbGUgbGF5b3V0IHJlc3RyaWN0aW9uCj4+IGZvciB0aGVtLgo+ Cj5BaCwgSSBtaXNzZWQgdGhhdC4KPgo+PiA+IEZvciB2ZXJ5IHNwZWNpYWwgc3R1ZmYgbGlrZSBh ZmJjIHlvdSBuZWVkIHRvIHZhbGlkYXRlIGluIHRoZSBkcml2ZXIKPj4gPiBhbnl3YXksIHRvbyBj b21wbGljYXRlZC4gU28gSSBoYXZlIG5vIGlkZWEgd2h5IHlvdSBicmluZyB0aGlzIHVwIGhlcmU/ Cj4+Cj4+IFN1cmUsIHdlIGNhbiBqdXN0IGxldCBkcml2ZXJzIHByb3ZpZGUgdGhlaXIgb3duIGZv cm1hdF9pbmZvJ3MgZm9yCj4+IHRoZXNlLCBpZiB0aGF0J3Mgd2hhdCB5b3UgcHJlZmVyLiBUaGUg Y29yZSBmb3JtYXQgY2hlY2tpbmcgY29kZSBjYW4KPj4gZXJyb3Igb3V0IGlmIGl0IGV2ZXIgZW5j b3VudGVycyB0aGVtLgo+Cj5JdCdzIGZvcm1hdF9pbmZvIHdlJ3JlIHRhbGtpbmcgYWJvdXQuIFdo YXQgSSBtZWFuIGlzIHRoYXQgeW91IGp1c3Qgc2V0IGFsbAo+dGhlc2UgdG8gMCBhbmQgbGV0IHRo ZSBmb3JtYXRfaW5mbyBjb2RlIGlnbm9yZSBpdC4gQW5kIHRoZW4gaGF2aW5nIGEKPmJlc3Bva2Ug ZHJtX2Zvcm1hdF9jaGVja19hZmJjIGhlbHBlciBmdW5jdGlvbiBvciBzaW1pbGFyLCB3aGljaCBj aGVja3MgYWxsCj50aGUgbGF5b3V0IHJlc3RyaWN0aW9ucyBvZiBhZmJjLgo+Cj5JIHN0aWxsIG1h aW50YWluIHRoYXQgYnBwIGFuZCB0aWxlX3NpemUgYXJlIGVxdWF2YWxlbnQsIGFuZCB3ZSByZWFs bHkKPmRvbid0IG5lZWQgYm90aC4gQm90aCBhcmUgZGVmYWN0byBhIGZvcm0gb2YgbnVtZXJhdG9y L2RlbnVtZXJhdG9yLiBJZiB5b3UKPmRvbid0IGxpa2UgdGhhdCB5b3UgaGF2ZSB0byBpbnRyb2R1 Y2UgImZha2UiIHRpbGVzIGZvciBhZmJjLCB0aGVuIHdlIGNhbgo+cmVuYW1lIHRpbGVfc2l6ZSB0 byBudW1lcmF0b3IgYW5kIHRpbGVfaC93IHRvIGRlbnVtZXJhdG9yX2gvdy4gRG9lc24ndAo+Y2hh bmdlIG9uZSBiaXQgb2YgdGhlIG1hdGguIGJwcCBzaW1wbHkgaGFyZGNvZGVzIGEgZGVudW1lcmF0 b3Igb2YgOCwgYW5kIEkKPmRvbid0IHNlZSB3aHkgd2UgbmVlZCB0aGF0IHNwZWNpYWwgY2FzZS4g RXhjZXB0IGlmIHlvdSBsb3ZlIHRvIHdyaXRlCj5yZWR1bmRhbnQgc2VsZiB0ZXN0cyBmb3IgYWxs IHRoZSBtYXRoIDotKQo+Cj5TbyB0d28gb3B0aW9ucyB0aGF0IEkgdGhpbmsgYXJlIHJlYXNvbmFi bGU6Cj4tIG9uZSBjb21tb24gbnVtZXJhdG9yL2RlbnVtZXJhdG9yLiBJIGRvbid0IGNhcmUgaG93 IHlvdSBjYWxsIHRoYXQKPiAgYmlrZXNoZWQuCgpTb3JyeSBmb3IgYmVpbmcgZGVuc2UsIGJ1dCBJ J20gc3RpbGwgc3RydWdnbGluZyB0byBnZXQgbXkgaGVhZCBhcm91bmQKd2hhdCB5b3UncmUgc3Vn Z2VzdGluZy4gSW4gcGFydGljdWxhciAiYnBwIHNpbXBseSBoYXJkY29kZXMgYQpkZW51bWVyYXRv ciBvZiA4IiBkaWRuJ3QgbWFrZSBhbnkgc2Vuc2UgdG8gbWUuIENvdWxkIHlvdSBnaXZlIGNvbmNy ZXRlCmV4YW1wbGVzIGZvciBob3cgeW91IHRoaW5rIHRoaXMgd291bGQgbG9vayBmb3IgZS5nLgoK IC0gRFJNX0ZPUk1BVF9WVVkxMDEwMTAuIDMwLWJpdHMgcGVyIHBpeGVsLCBubyB0aWxpbmcuCiAt IERSTV9GT1JNQVRfWTBMMi4gMTYtYml0cyBwZXIgcGl4ZWwsIDJ4MiBwaXhlbCB0aWxlcwoKSSB0 aGluayB3ZSBuZWVkIHR3byB0aGluZ3M6CiAtIFRoZSBzaXplLCBpbiBiaXRzLCBvZiBhIHRpbGUK IC0gVGhlIHdpZHRoIGFuZCBoZWlnaHQsIGluIHBpeGVscywgb2YgYSB0aWxlIChjdXJyZW50bHkg aW1wbGljaXRseQogICAxeDEpCgpEbyB5b3UgZGlzYWdyZWU/IEFyZSB5b3UganVzdCBzYXlpbmcg dGhhdCBpbnN0ZWFkIG9mIGFkZGluZyAuYnBwIEkKc2hvdWxkIGJlIHJlcGxhY2luZyAuY3BwIHdp dGggLmJwcCB3aG9sZXNhbGU/Cgo+LSBkb24ndCBjaGVjayBhZmJjIHVzaW5nIGZvcm1hdF9pbmZv LCBoYXZlIHlvdXIgb3duIGhlbHBlciB0aGF0IGRvZXMgdGhhdAo+ICB1c2luZyBjdXN0b20gY29k ZS4KCldlIGNhbiBkbyB0aGlzLCBubyBwcm9ibGVtLgoKVGhhbmtzLAotQnJpYW4KCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5n IGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVk ZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=